fix custom provider credentials, edit path, and failure UX

Require an API key or {env:VAR} on client and server, add edit/prefill for
existing custom providers, save auth before config, and surface incomplete
auth plus disconnect after partial failures. Add VS Code parity tests and
drop the unused allProvidersConnected locale key.

Co-authored-by: Serhii Dziupin <makeittech@users.noreply.github.com>
This commit is contained in:
Cursor Agent
2026-08-02 11:40:02 +00:00
co-authored by Serhii Dziupin
parent d84e4e0312
commit d40bb9e5a0
23 changed files with 815 additions and 104 deletions
@@ -1333,9 +1333,9 @@ export const settingsDict = {
'settings.providers.page.connect.selectProviderPlaceholder': 'Select provider',
'settings.providers.page.connect.searchProvidersPlaceholder': 'Search...',
'settings.providers.page.connect.noProvidersFound': 'No providers found',
'settings.providers.page.connect.allProvidersConnected': 'All providers connected.',
'settings.providers.page.custom.optionLabel': 'Other / Custom',
'settings.providers.page.custom.title': 'Custom provider',
'settings.providers.page.custom.editTitle': 'Edit custom provider',
'settings.providers.page.custom.description': 'Add an OpenAI-compatible provider with a base URL, credentials, and model list. Saved to OpenCode config so it works in chat like any other provider.',
'settings.providers.page.custom.field.providerID.label': 'Provider ID',
'settings.providers.page.custom.field.providerID.placeholder': 'my-provider',
@@ -1349,6 +1349,8 @@ export const settingsDict = {
'settings.providers.page.custom.field.apiKey.label': 'API key',
'settings.providers.page.custom.field.apiKey.placeholder': 'sk-... or {env:VAR_NAME}',
'settings.providers.page.custom.field.apiKey.info': 'Stored in OpenCode auth, not by OpenChamber. Use {env:VAR_NAME} to read a key from the environment instead.',
'settings.providers.page.custom.field.apiKey.editInfo': 'Leave blank to keep the existing credential, or enter a new key / {env:VAR_NAME}.',
'settings.providers.page.custom.field.apiKey.editPlaceholder': 'Leave blank to keep existing key',
'settings.providers.page.custom.models.title': 'Models',
'settings.providers.page.custom.models.idLabel': 'Model ID',
'settings.providers.page.custom.models.idPlaceholder': 'gpt-4o',
@@ -1366,6 +1368,7 @@ export const settingsDict = {
'settings.providers.page.custom.headers.remove': 'Remove header',
'settings.providers.page.custom.actions.back': 'Back',
'settings.providers.page.custom.actions.save': 'Save provider',
'settings.providers.page.custom.actions.update': 'Update provider',
'settings.providers.page.custom.error.providerID.required': 'Provider ID is required',
'settings.providers.page.custom.error.providerID.format': 'Use lowercase letters, numbers, hyphens, or underscores',
'settings.providers.page.custom.error.providerID.exists': 'A provider with this ID is already connected',
@@ -1374,6 +1377,8 @@ export const settingsDict = {
'settings.providers.page.custom.error.baseURL.format': 'Base URL must start with http:// or https://',
'settings.providers.page.custom.error.required': 'Required',
'settings.providers.page.custom.error.duplicate': 'Duplicate',
'settings.providers.page.custom.error.apiKey.required': 'API key or {env:VAR_NAME} is required',
'settings.providers.page.custom.authFailure.configAfterAuth': 'Credentials were saved, but the provider config was not. Fix the error and try again, or disconnect to clear the partial save.',
'settings.providers.page.auth.title': 'Authentication',
'settings.providers.page.auth.loadingMethods': 'Loading authentication methods...',
'settings.providers.page.auth.apiKeyLabel': 'API Key',
@@ -1382,6 +1387,8 @@ export const settingsDict = {
'settings.providers.page.auth.oauthMethodFallback': 'OAuth method {index}',
'settings.providers.page.auth.pasteAuthorizationCodePlaceholder': 'Paste authorization code',
'settings.providers.page.auth.connected': 'Connected',
'settings.providers.page.auth.incomplete': 'Credentials missing',
'settings.providers.page.auth.incompleteHint': '· Add an API key or {env:VAR} before using this provider in chat',
'settings.providers.page.auth.useReconnectHint': '· Use Reconnect to update credentials',
'settings.providers.page.connectionDetails.title': 'Connection Details',
'settings.providers.page.connectionDetails.configuredIn': 'Configured in:',
@@ -1411,6 +1418,7 @@ export const settingsDict = {
'settings.providers.page.actions.complete': 'Complete',
'settings.providers.page.actions.hide': 'Hide',
'settings.providers.page.actions.reconnect': 'Reconnect',
'settings.providers.page.actions.edit': 'Edit',
'settings.providers.page.actions.disconnecting': 'Disconnecting...',
'settings.providers.page.actions.disconnect': 'Disconnect',
'settings.providers.page.actions.hideAll': 'Hide all',