{"record":{"id":"2f85817a3b291077","repo":"jlcodes99/cockpit-tools","slug":"api-key-not-found","errorCode":"API_KEY_NOT_FOUND","errorMessage":"API_KEY_NOT_FOUND","messagePattern":"API_KEY_NOT_FOUND","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/services/codexModelProviderService.ts","lineNumber":797,"sourceCode":"    return { ...provider, apiKeys: provider.apiKeys.map((item) => ({ ...item })) };\n  }\n  provider.apiKeys = nextApiKeys;\n  provider.updatedAt = Date.now();\n  await writeProviders(providers);\n  return { ...provider, apiKeys: provider.apiKeys.map((item) => ({ ...item })) };\n}\n\n/** Explicit rename for an existing provider API key (#1510). Does not rewrite key material. */\nexport async function renameApiKeyOnCodexModelProvider(\n  providerId: string,\n  apiKeyId: string,\n  name: string,\n): Promise<CodexModelProvider> {\n  const providers = await ensureProvidersLoaded();\n  const provider = providers.find((item) => item.id === providerId);\n  if (!provider) throw new Error('PROVIDER_NOT_FOUND');\n  const apiKey = provider.apiKeys.find((item) => item.id === apiKeyId);\n  if (!apiKey) throw new Error('API_KEY_NOT_FOUND');\n\n  const now = Date.now();\n  apiKey.name = sanitizeName(name);\n  apiKey.updatedAt = now;\n  provider.updatedAt = now;\n  await writeProviders(providers);\n  return { ...provider, apiKeys: provider.apiKeys.map((item) => ({ ...item })) };\n}\n\n/** Replace the secret for an existing provider API key without changing its id. */\nexport async function updateApiKeyOnCodexModelProvider(\n  providerId: string,\n  apiKeyId: string,\n  apiKey: string,\n  name?: string,\n): Promise<CodexModelProvider> {\n  const normalizedApiKey = sanitizeApiKey(apiKey);\n  if (!normalizedApiKey) throw new Error(\"API_KEY_REQUIRED\");","sourceCodeStart":779,"sourceCodeEnd":815,"githubUrl":"https://github.com/jlcodes99/cockpit-tools/blob/1ed8b77992d62ca81fabf744deb0839ad361d5bf/src/services/codexModelProviderService.ts#L779-L815","documentation":"renameApiKeyOnCodexModelProvider throws API_KEY_NOT_FOUND when the provider exists but none of its apiKeys has the given apiKeyId. The lookup is a plain find on provider.apiKeys by id; note that removeApiKeyFromCodexModelProvider silently no-ops in the same situation, but rename throws to avoid renaming nothing.","triggerScenarios":"Calling renameApiKeyOnCodexModelProvider(providerId, apiKeyId, name) with an apiKeyId that is not in that provider's apiKeys array — wrong key id, key already removed, or an id belonging to a different provider.","commonSituations":"Renaming a key from a stale list after the key was deleted; mixing up key ids between two providers that both have keys; retrying a rename after a successful first attempt that the UI did not reflect.","solutions":["Fetch the provider and confirm apiKeyId is present in provider.apiKeys before renaming.","If the key was deleted, re-add it with addApiKeyToCodexModelProvider and then rename.","Check you are pairing the apiKeyId with the correct providerId (keys from another provider will never match).","Catch 'API_KEY_NOT_FOUND' and refresh the key list in the UI."],"exampleFix":"// before\nawait renameApiKeyOnCodexModelProvider(providerId, keyId, 'prod-key');\n// after\nconst provider = (await listCodexModelProviders()).find((p) => p.id === providerId);\nif (!provider?.apiKeys.some((k) => k.id === keyId)) throw new Error('Key not found on provider');\nawait renameApiKeyOnCodexModelProvider(providerId, keyId, 'prod-key');","handlingStrategy":"type-guard","validationCode":"const provider = (await listCodexModelProviders()).find((p) => p.id === providerId);\nif (!provider?.apiKeys.some((k) => k.id === apiKeyId)) {\n  throw new Error(`API key ${apiKeyId} not found on provider ${providerId}`);\n}","typeGuard":"function hasApiKey(provider: { apiKeys: { id: string }[] } | undefined, apiKeyId: string): boolean {\n  return !!provider && provider.apiKeys.some((k) => k.id === apiKeyId);\n}","tryCatchPattern":"try {\n  await renameApiKeyOnCodexModelProvider(providerId, apiKeyId, name);\n} catch (e) {\n  if ((e as Error).message === 'API_KEY_NOT_FOUND') {\n    await reloadApiKeys(providerId); // key was removed elsewhere\n  } else throw e;\n}","preventionTips":["Verify the apiKeyId belongs to the SAME provider before renaming.","Refresh key lists after deletions so stale key ids are not used.","Guard against double-submitted renames (idempotency on the client).","Distinguish key ids across providers; never reuse ids from another row."],"tags":["lookup","not-found","api-key"],"backgroundTag":"resource-not-found","analyzedSha":"1ed8b77992d62ca81fabf744deb0839ad361d5bf","analyzedAt":"2026-09-05T09:51:41.178Z","contentChangedAt":"2026-09-05T09:51:41.178Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}