import { normalizeStringEntries } from "../../shared/string-normalization.js" ;
import { normalizeSecretInput } from "../../utils/normalize-secret-input.js" ;
import { resolveProviderIdForAuth } from "../provider-auth-aliases.js" ;
import { normalizeProviderId } from "../provider-id.js" ;
import { dedupeProfileIds, listProfilesForProvider } from "./profile-list.js" ;
import {
ensureAuthProfileStoreForLocalUpdate,
saveAuthProfileStore,
updateAuthProfileStoreWithLock,
} from "./store.js" ;
import type { AuthProfileCredential, AuthProfileStore } from "./types.js" ;
export { dedupeProfileIds, listProfilesForProvider } from "./profile-list.js" ;
export async function setAuthProfileOrder(params: {
agentDir?: string;
provider: string;
order?: string[] | null ;
}): Promise<AuthProfileStore | null > {
const providerKey = normalizeProviderId(params.provider);
const sanitized =
params.order && Array.isArray(params.order) ? normalizeStringEntries(params.order) : [];
const deduped = dedupeProfileIds(sanitized);
return await updateAuthProfileStoreWithLock({
agentDir: params.agentDir,
updater: (store) => {
store.order = store.order ?? {};
if (deduped.length === 0 ) {
if (!store.order[providerKey]) {
return false ;
}
delete store.order[providerKey];
if (Object.keys(store.order).length === 0 ) {
store.order = undefined;
}
return true ;
}
store.order[providerKey] = deduped;
return true ;
},
});
}
export function upsertAuthProfile(params: {
profileId: string;
credential: AuthProfileCredential;
agentDir?: string;
}): void {
const credential =
params.credential.type === "api_key"
? {
...params.credential,
...(typeof params.credential.key === "string"
? { key: normalizeSecretInput(params.credential.key) }
: {}),
}
: params.credential.type === "token"
? { ...params.credential, token: normalizeSecretInput(params.credential.token) }
: params.credential;
const store = ensureAuthProfileStoreForLocalUpdate(params.agentDir);
store.profiles[params.profileId] = credential;
saveAuthProfileStore(store, params.agentDir, {
filterExternalAuthProfiles: false ,
syncExternalCli: false ,
});
}
export async function upsertAuthProfileWithLock(params: {
profileId: string;
credential: AuthProfileCredential;
agentDir?: string;
}): Promise<AuthProfileStore | null > {
return await updateAuthProfileStoreWithLock({
agentDir: params.agentDir,
updater: (store) => {
store.profiles[params.profileId] = params.credential;
return true ;
},
});
}
export async function removeProviderAuthProfilesWithLock(params: {
provider: string;
agentDir?: string;
}): Promise<AuthProfileStore | null > {
const providerKey = resolveProviderIdForAuth(params.provider);
const storeOrderKey = normalizeProviderId(params.provider);
return await updateAuthProfileStoreWithLock({
agentDir: params.agentDir,
updater: (store) => {
const profileIds = listProfilesForProvider(store, params.provider);
let changed = false ;
for (const profileId of profileIds) {
if (store.profiles[profileId]) {
delete store.profiles[profileId];
changed = true ;
}
if (store.usageStats?.[profileId]) {
delete store.usageStats[profileId];
changed = true ;
}
}
if (store.order?.[storeOrderKey]) {
delete store.order[storeOrderKey];
changed = true ;
if (Object.keys(store.order).length === 0 ) {
store.order = undefined;
}
}
if (store.lastGood?.[providerKey]) {
delete store.lastGood[providerKey];
changed = true ;
if (Object.keys(store.lastGood).length === 0 ) {
store.lastGood = undefined;
}
}
if (store.usageStats && Object.keys(store.usageStats).length === 0 ) {
store.usageStats = undefined;
}
return changed;
},
});
}
export async function markAuthProfileGood(params: {
store: AuthProfileStore;
provider: string;
profileId: string;
agentDir?: string;
}): Promise<void > {
const { store, provider, profileId, agentDir } = params;
const providerKey = resolveProviderIdForAuth(provider);
const updated = await updateAuthProfileStoreWithLock({
agentDir,
updater: (freshStore) => {
const profile = freshStore.profiles[profileId];
if (!profile || resolveProviderIdForAuth(profile.provider) !== providerKey) {
return false ;
}
freshStore.lastGood = { ...freshStore.lastGood, [providerKey]: profileId };
return true ;
},
});
if (updated) {
store.lastGood = updated.lastGood;
return ;
}
const profile = store.profiles[profileId];
if (!profile || resolveProviderIdForAuth(profile.provider) !== providerKey) {
return ;
}
store.lastGood = { ...store.lastGood, [providerKey]: profileId };
saveAuthProfileStore(store, agentDir);
}
Messung V0.5 in Prozent C=99 H=98 G=98
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland