farion1231/cc-switch · error · Error
Claude Desktop official provider was not created
Error message
Claude Desktop official provider was not created
What it means
Thrown inside useAddProviderMutation's mutationFn when appId is 'claude-desktop' with ensureClaudeDesktopOfficialSeed set: after calling providersApi.ensureClaudeDesktopOfficialProvider(), the expected 'claude-desktop-official' entry is missing from providersApi.getAll('claude-desktop'). It signals that the backend seed routine returned without creating (or exposing) the official provider - an invariant break, not a user-input error.
Source
Thrown at src/lib/query/mutations.ts:52
ensureCodexOfficialSeed?: boolean;
ensureGrokBuildOfficialSeed?: boolean;
},
) => {
const {
providerKey: _providerKey,
addToLive,
ensureClaudeDesktopOfficialSeed,
ensureCodexOfficialSeed,
ensureGrokBuildOfficialSeed,
...rest
} = providerInput;
if (appId === "claude-desktop" && ensureClaudeDesktopOfficialSeed) {
await providersApi.ensureClaudeDesktopOfficialProvider();
const providers = await providersApi.getAll(appId);
const officialProvider = providers["claude-desktop-official"];
if (!officialProvider) {
throw new Error("Claude Desktop official provider was not created");
}
return officialProvider;
}
if (appId === "codex" && ensureCodexOfficialSeed) {
// The fixed seed is the one native "Codex current login" card.
// A managed account gets its own provider row so several accounts can
// coexist without replacing that native-login entry.
const managedAccountId = resolveManagedAccountId(
rest.meta,
"codex_oauth",
)?.trim();
if (!managedAccountId) {
await providersApi.ensureCodexOfficialProvider();
const providers = await providersApi.getAll(appId);
const nativeLoginProvider = providers[CODEX_OFFICIAL_PROVIDER_ID];
if (!nativeLoginProvider) {
throw new Error("Codex current-login provider was not created");View on GitHub (pinned to a2e22f3302)
Solutions
- Check the ensureClaudeDesktopOfficialProvider backend command for a silent early return (missing config file, logged-and-swallowed error)
- Retry the mutation once - transient read-after-write races often clear
- Manually verify getAll('claude-desktop') includes the 'claude-desktop-official' key after a manual ensure call
Example fix
// before
await providersApi.ensureClaudeDesktopOfficialProvider();
const official = (await providersApi.getAll(appId))["claude-desktop-official"];
if (!official) throw new Error("Claude Desktop official provider was not created");
// after
await providersApi.ensureClaudeDesktopOfficialProvider();
let official: Provider | undefined;
for (let i = 0; i < 3 && !official; i++) {
await new Promise((r) => setTimeout(r, 100 * (i + 1)));
official = (await providersApi.getAll(appId))["claude-desktop-official"];
}
if (!official) throw new Error("Claude Desktop official provider was not created"); Defensive patterns
Strategy: retry
Validate before calling
// Skip the ensure path entirely when the provider already exists
const existing = (await providersApi.getAll("claude-desktop"))["claude-desktop-official"];
if (existing) {
return existing; // no ensure call, no race window
} Try / catch
try {
return await addProvider.mutateAsync(input);
} catch (e) {
if (e instanceof Error && e.message === "Claude Desktop official provider was not created") {
await queryClient.invalidateQueries({ queryKey: providersKeys.all });
return await addProvider.mutateAsync(input); // one retry after cache refresh
}
throw e;
} Prevention
- Check whether the official provider already exists before triggering the ensure path
- Log Object.keys(getAll()) output when the invariant fails
- Keep the frontend provider id in sync with the backend seed constant
When it happens
Trigger: mutateAsync({ appId: 'claude-desktop', providerInput: { ensureClaudeDesktopOfficialSeed: true, ... } }) where the ensure command silently no-ops, the getAll read races the write, or the returned map lacks the 'claude-desktop-official' key.
Common situations: First run on a fresh data dir where seeding failed; frontend/backend version mismatch after the provider id changed; read-after-write race right after installation.
Related errors
- Codex current-login provider was not created
- Grok Build official provider was not created
- Provider key is required for ${appId}
- jsonEditor.mustBeObject
AI-assisted analysis of farion1231/cc-switch@a2e22f3302 (2026-08-16).
Data as JSON: /api/errors/74054df4e2ed3a56.
Report an issue: GitHub.