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

  1. Check the ensureClaudeDesktopOfficialProvider backend command for a silent early return (missing config file, logged-and-swallowed error)
  2. Retry the mutation once - transient read-after-write races often clear
  3. 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

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


AI-assisted analysis of farion1231/cc-switch@a2e22f3302 (2026-08-16). Data as JSON: /api/errors/74054df4e2ed3a56. Report an issue: GitHub.