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
+59 -1
View File
@@ -3,7 +3,7 @@ import * as os from 'os';
import * as path from 'path';
import * as vscode from 'vscode';
import { randomUUID } from 'crypto';
import { removeProviderConfig, getProviderSources } from './opencodeConfig';
import { removeProviderConfig, getProviderSources, upsertProviderConfig } from './opencodeConfig';
import { getProviderAuth, removeProviderAuth } from './opencodeAuth';
import { fetchQuotaForProvider, listConfiguredQuotaProviders } from './quotaProviders';
import { fetchOpenCodeGoUsage } from './opencodeGoQuota';
@@ -484,6 +484,64 @@ export async function handleSystemBridgeMessage(
}
}
case 'api:provider:upsert': {
const {
providerID,
providerId: providerIdAlias,
config,
scope,
directory,
} = (payload || {}) as {
providerID?: string;
providerId?: string;
config?: unknown;
scope?: string;
directory?: string;
};
const providerId = (typeof providerID === 'string' && providerID.trim())
|| (typeof providerIdAlias === 'string' && providerIdAlias.trim())
|| '';
if (!providerId) {
return { id, type, success: false, error: 'Provider ID is required' };
}
if (!config || typeof config !== 'object' || Array.isArray(config)) {
return { id, type, success: false, error: 'Provider config is required' };
}
const normalizedScope = typeof scope === 'string' ? scope : 'user';
if (normalizedScope !== 'user' && normalizedScope !== 'project' && normalizedScope !== 'custom') {
return { id, type, success: false, error: 'Invalid scope' };
}
try {
const workingDirectory = typeof directory === 'string' && directory.trim().length > 0
? directory.trim()
: ctx?.manager?.getWorkingDirectory();
const result = upsertProviderConfig(
providerId,
config,
workingDirectory,
normalizedScope,
{ hasStoredAuth: Boolean(getProviderAuth(providerId)) },
);
await ctx?.manager?.restart();
return {
id,
type,
success: true,
data: {
success: true,
providerId: result.providerId,
path: result.path,
config: result.config,
requiresReload: true,
reloadDelayMs: deps.clientReloadDelayMs,
},
};
} catch (error) {
const errorMessage = error instanceof Error ? error.message : String(error);
return { id, type, success: false, error: errorMessage };
}
}
case 'api:quota:providers': {
try {
const providers = listConfiguredQuotaProviders();