Merge origin/main into deferred OpenCode restart branch.

Resolve ProvidersPage and lifecycle conflicts with custom providers and
AppImage ARGV0 stripping. Address review follow-ups: OAuth index helper +
tests, single auth-methods load trigger, shared Google env-alias module with
VS Code parity coverage, and deferred restart for custom provider upsert.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>
This commit is contained in:
Cursor Agent
2026-08-03 13:57:05 +00:00
co-authored by Serhii Dziupin
94 changed files with 5949 additions and 372 deletions
@@ -1368,6 +1368,8 @@ export const settingsDict = {
'settings.providers.page.actions.hideAll': 'Ukryj wszystko',
'settings.providers.page.actions.open': 'Otwórz',
'settings.providers.page.actions.reconnect': 'Połącz ponownie',
'settings.providers.page.actions.edit': 'Edytuj',
'settings.providers.page.actions.saveKey': 'Zapisz klucz',
'settings.providers.page.actions.saving': 'Zapisywanie...',
'settings.providers.page.actions.showAll': 'Pokaż wszystko',
@@ -1375,12 +1377,67 @@ export const settingsDict = {
'settings.providers.page.auth.apiKeyPlaceholder': 'sk-...',
'settings.providers.page.auth.apiKeyTooltip': 'Klucze są wysyłane bezpośrednio do OpenCode i nigdy nie są przechowywane przez OpenChamber.',
'settings.providers.page.auth.connected': 'Połączono',
'settings.providers.page.auth.incomplete': 'Brak poświadczeń',
'settings.providers.page.auth.incompleteHint': '· Dodaj klucz API lub {env:VAR} przed użyciem tego dostawcy w czacie',
'settings.providers.page.auth.loadingMethods': 'Ładowanie metod uwierzytelniania...',
'settings.providers.page.auth.oauthMethodFallback': 'Metoda OAuth {index}',
'settings.providers.page.auth.pasteAuthorizationCodePlaceholder': 'Wklej kod autoryzacyjny',
'settings.providers.page.auth.title': 'Uwierzytelnianie',
'settings.providers.page.auth.useReconnectHint': '· Użyj Połącz ponownie, aby zaktualizować dane logowania',
'settings.providers.page.connect.allProvidersConnected': 'Wszyscy dostawcy są połączeni.',
'settings.providers.page.custom.optionLabel': 'Inny / Niestandardowy',
'settings.providers.page.custom.title': 'Niestandardowy dostawca',
'settings.providers.page.custom.editTitle': 'Edytuj niestandardowego dostawcę',
'settings.providers.page.custom.description': 'Dodaj dostawcę zgodnego z OpenAI, podając adres bazowy, poświadczenia i listę modeli. Zapisuje się w konfiguracji OpenCode i działa w czacie jak każdy inny dostawca.',
'settings.providers.page.custom.field.providerID.label': 'ID dostawcy',
'settings.providers.page.custom.field.providerID.placeholder': 'moj-dostawca',
'settings.providers.page.custom.field.providerID.info': 'Małe litery, cyfry, myślniki i podkreślenia. Używane jako ID dostawcy OpenCode.',
'settings.providers.page.custom.field.name.label': 'Nazwa wyświetlana',
'settings.providers.page.custom.field.name.placeholder': 'Mój dostawca',
'settings.providers.page.custom.field.name.info': 'Widoczna w selektorach dostawcy i modelu.',
'settings.providers.page.custom.field.baseURL.label': 'Adres bazowy',
'settings.providers.page.custom.field.baseURL.placeholder': 'https://api.example.com/v1',
'settings.providers.page.custom.field.baseURL.info': 'Bazowy URL API zgodnego z OpenAI. Musi zaczynać się od http:// lub https://.',
'settings.providers.page.custom.field.apiKey.label': 'Klucz API',
'settings.providers.page.custom.field.apiKey.placeholder': 'sk-... lub {env:VAR_NAME}',
'settings.providers.page.custom.field.apiKey.info': 'Przechowywany w auth OpenCode, nie przez OpenChamber. Użyj {env:VAR_NAME}, aby odczytać klucz ze zmiennej środowiskowej.',
'settings.providers.page.custom.field.apiKey.editInfo': 'Pozostaw puste, aby zachować istniejące poświadczenie, albo wpisz nowy klucz / {env:VAR_NAME}.',
'settings.providers.page.custom.field.apiKey.editPlaceholder': 'Pozostaw puste, aby zachować istniejący klucz',
'settings.providers.page.custom.models.title': 'Modele',
'settings.providers.page.custom.models.idLabel': 'ID modelu',
'settings.providers.page.custom.models.idPlaceholder': 'gpt-4o',
'settings.providers.page.custom.models.nameLabel': 'Nazwa modelu',
'settings.providers.page.custom.models.namePlaceholder': 'GPT-4o',
'settings.providers.page.custom.models.add': 'Dodaj model',
'settings.providers.page.custom.models.remove': 'Usuń model',
'settings.providers.page.custom.headers.title': 'Nagłówki',
'settings.providers.page.custom.headers.description': 'Opcjonalne nagłówki żądania wysyłane przy każdym wywołaniu.',
'settings.providers.page.custom.headers.keyLabel': 'Nazwa nagłówka',
'settings.providers.page.custom.headers.keyPlaceholder': 'X-Custom-Header',
'settings.providers.page.custom.headers.valueLabel': 'Wartość nagłówka',
'settings.providers.page.custom.headers.valuePlaceholder': 'wartość',
'settings.providers.page.custom.headers.add': 'Dodaj nagłówek',
'settings.providers.page.custom.headers.remove': 'Usuń nagłówek',
'settings.providers.page.custom.actions.back': 'Wstecz',
'settings.providers.page.custom.actions.save': 'Zapisz dostawcę',
'settings.providers.page.custom.actions.update': 'Zaktualizuj dostawcę',
'settings.providers.page.custom.error.providerID.required': 'ID dostawcy jest wymagane',
'settings.providers.page.custom.error.providerID.format': 'Użyj małych liter, cyfr, myślników lub podkreśleń',
'settings.providers.page.custom.error.providerID.exists': 'Dostawca o tym ID jest już połączony',
'settings.providers.page.custom.error.name.required': 'Nazwa wyświetlana jest wymagana',
'settings.providers.page.custom.error.baseURL.required': 'Adres bazowy jest wymagany',
'settings.providers.page.custom.error.baseURL.format': 'Adres bazowy musi zaczynać się od http:// lub https://',
'settings.providers.page.custom.error.required': 'Wymagane',
'settings.providers.page.custom.error.duplicate': 'Duplikat',
'settings.providers.page.custom.error.apiKey.required': 'Wymagany jest klucz API lub {env:VAR_NAME}',
'settings.providers.page.custom.authFailure.configAfterAuth': 'Poświadczenia zostały zapisane, ale konfiguracja dostawcy nie. Napraw błąd i spróbuj ponownie albo rozłącz, aby usunąć częściowy zapis.',
'settings.providers.page.connect.noProvidersFound': 'Nie znaleziono dostawców',
'settings.providers.page.connect.providerField': 'Dostawca',
'settings.providers.page.connect.searchProvidersPlaceholder': 'Szukaj...',
@@ -1426,6 +1483,8 @@ export const settingsDict = {
'settings.providers.page.toast.oauthLinkCopyFailed': 'Nie udało się skopiować linku OAuth',
'settings.providers.page.toast.oauthStartFailed': 'Nie udało się rozpocząć procesu OAuth',
'settings.providers.page.toast.providerDisconnectFailed': 'Nie udało się odłączyć dostawcy',
'settings.providers.page.toast.customProviderSaved': 'Połączono {provider}',
'settings.providers.page.toast.customProviderSaveFailed': 'Nie udało się zapisać niestandardowego dostawcy',
'settings.providers.page.toast.providerDisconnected': 'Dostawca został odłączony',
'settings.providers.page.toast.providerSourcesLoadFailed': 'Nie udało się załadować źródeł dostawcy',
'settings.providers.sidebar.actions.connectProviderAria': 'Połącz dostawcę',
@@ -1863,10 +1922,9 @@ export const settingsDict = {
'settings.skills.sidebar.title': 'Umiejętności',
'settings.skills.sidebar.toast.deleteSkillFailed': 'Nie udało się usunąć umiejętności',
'settings.skills.sidebar.toast.duplicateLoadFailed': 'Nie udało się załadować szczegółów umiejętności do duplikacji',
'settings.skills.sidebar.toast.removeOldAfterRenameFailed': 'Nie udało się usunąć starej umiejętności po zmianie nazwy',
'settings.skills.sidebar.toast.renameFailed': 'Nie udało się zmienić nazwy umiejętności',
'settings.skills.sidebar.toast.renameLoadFailed': 'Nie udało się załadować szczegółów umiejętności',
'settings.skills.sidebar.toast.skillDeleted': 'Umiejętność „{name}” została usunięta',
'settings.skills.sidebar.toast.skillRenamed': 'Zmieniono nazwę umiejętności na „{name}”',
'settings.skills.sidebar.total': 'Suma: {count}',
'settings.usage.pace.prediction': 'Prognoza: {prediction}',
'settings.usage.pace.predictionLabel': 'Prognoza: ',