openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
217 lines (216 loc) • 8.47 kB
JavaScript
import { l as normalizeStringEntries } from "./string-normalization-WNUDCpXX.js";
import { i as normalizeProviderId, t as findNormalizedProviderKey } from "./provider-id-Dq06Bcx6.js";
import { r as resolveProviderIdForAuth } from "./provider-auth-aliases-BNZrcvHv.js";
import { m as updateAuthProfileStoreWithLock, p as saveAuthProfileStore, r as ensureAuthProfileStoreForLocalUpdate } from "./store-C8spD0DG.js";
import { n as normalizeSecretInput } from "./normalize-secret-input-OwRUfByL.js";
import { n as listProfilesForProvider, t as dedupeProfileIds } from "./profile-list-DI8_o0Rw.js";
//#region src/agents/auth-profiles/profiles.ts
/**
* Auth profile mutation helpers.
* Updates profile order, last-good state, usage stats, and provider profile
* records through locked or immediate store writes.
*/
function findProviderAuthStateKey(entries, providerKey) {
if (!entries) return;
const normalizedProviderKey = resolveProviderIdForAuth(providerKey);
return Object.keys(entries).find((key) => resolveProviderIdForAuth(key) === normalizedProviderKey);
}
function resetSuccessfulUsageStats(existing, lastUsed) {
return {
...existing,
errorCount: 0,
blockedUntil: void 0,
blockedReason: void 0,
blockedSource: void 0,
blockedModel: void 0,
cooldownUntil: void 0,
cooldownReason: void 0,
cooldownModel: void 0,
disabledUntil: void 0,
disabledReason: void 0,
failureCounts: void 0,
lastUsed
};
}
function updateSuccessfulUsageStatsEntry(store, profileId, lastUsed) {
store.usageStats = store.usageStats ?? {};
store.usageStats[profileId] = resetSuccessfulUsageStats(store.usageStats[profileId], lastUsed);
}
/** Sets or clears explicit auth profile order for a provider. */
async function setAuthProfileOrder(params) {
const providerKey = normalizeProviderId(params.provider);
const deduped = dedupeProfileIds(params.order && Array.isArray(params.order) ? normalizeStringEntries(params.order) : []);
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 = void 0;
return true;
}
store.order[providerKey] = deduped;
return true;
}
});
}
/** Promotes one auth profile to the front of a provider order. */
async function promoteAuthProfileInOrder(params) {
const providerKey = resolveProviderIdForAuth(params.provider);
return await updateAuthProfileStoreWithLock({
agentDir: params.agentDir,
...params.createFromOrder ? { saveOptions: { preserveOrderProfileIds: params.createFromOrder } } : {},
updater: (store) => {
const profile = store.profiles[params.profileId];
if (!profile || resolveProviderIdForAuth(profile.provider) !== providerKey) return false;
const orderKey = findProviderAuthStateKey(store.order, providerKey) ?? findNormalizedProviderKey(store.order, providerKey) ?? normalizeProviderId(providerKey);
const existing = store.order?.[orderKey];
if (!existing || existing.length === 0) {
if (!params.createIfMissing) return false;
const providerProfiles = dedupeProfileIds(params.createFromOrder !== void 0 ? params.createFromOrder : listProfilesForProvider(store, providerKey));
const next = dedupeProfileIds([params.profileId, ...providerProfiles.filter((profileId) => profileId !== params.profileId)]);
store.order = {
...store.order,
[orderKey]: next
};
return true;
}
const next = dedupeProfileIds([params.profileId, ...existing.filter((profileId) => profileId !== params.profileId)]);
if (next.length === existing.length && next.every((profileId, idx) => profileId === existing[idx])) return false;
store.order = {
...store.order,
[orderKey]: next
};
return true;
}
});
}
function normalizeAuthProfileCredential(credential) {
if (credential.type === "api_key") {
if (typeof credential.key !== "string") return credential;
const { key: _key, ...rest } = credential;
const key = normalizeSecretInput(credential.key);
return {
...rest,
...key ? { key } : {}
};
}
if (credential.type === "token") {
if (typeof credential.token !== "string") return credential;
const { token: _token, ...rest } = credential;
const token = normalizeSecretInput(credential.token);
return {
...rest,
...token ? { token } : {}
};
}
return credential;
}
/** Upserts an auth profile immediately into the local store. */
function upsertAuthProfile(params) {
const credential = normalizeAuthProfileCredential(params.credential);
const store = ensureAuthProfileStoreForLocalUpdate(params.agentDir);
store.profiles[params.profileId] = credential;
saveAuthProfileStore(store, params.agentDir, {
filterExternalAuthProfiles: false,
syncExternalCli: false
});
}
/** Upserts an auth profile under the auth store lock. */
async function upsertAuthProfileWithLock(params) {
const credential = normalizeAuthProfileCredential(params.credential);
return await updateAuthProfileStoreWithLock({
agentDir: params.agentDir,
saveOptions: {
filterExternalAuthProfiles: false,
syncExternalCli: false
},
updater: (store) => {
store.profiles[params.profileId] = credential;
return true;
}
});
}
/** Removes all auth profiles and related state for a provider. */
async function removeProviderAuthProfilesWithLock(params) {
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 = void 0;
}
if (store.lastGood?.[providerKey]) {
delete store.lastGood[providerKey];
changed = true;
if (Object.keys(store.lastGood).length === 0) store.lastGood = void 0;
}
if (store.usageStats && Object.keys(store.usageStats).length === 0) store.usageStats = void 0;
return changed;
}
});
}
/** Clear the last-good profile pointer for a provider under the store lock. */
async function clearLastGoodProfileWithLock(params) {
const providerKey = resolveProviderIdForAuth(params.provider);
return await updateAuthProfileStoreWithLock({
agentDir: params.agentDir,
updater: (store) => {
const lastGoodKey = findProviderAuthStateKey(store.lastGood, providerKey);
if (!lastGoodKey || store.lastGood?.[lastGoodKey] !== params.profileId) return false;
delete store.lastGood[lastGoodKey];
if (Object.keys(store.lastGood).length === 0) store.lastGood = void 0;
return true;
}
});
}
/** Mark a profile as successfully used and update ordering/usage metadata. */
async function markAuthProfileSuccess(params) {
const { store, provider, profileId, agentDir } = params;
const providerKey = resolveProviderIdForAuth(provider);
const lastUsed = Date.now();
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
};
updateSuccessfulUsageStatsEntry(freshStore, profileId, lastUsed);
return true;
}
});
if (updated) {
store.lastGood = updated.lastGood;
store.usageStats = updated.usageStats;
return;
}
const profile = store.profiles[profileId];
if (!profile || resolveProviderIdForAuth(profile.provider) !== providerKey) return;
store.lastGood = {
...store.lastGood,
[providerKey]: profileId
};
updateSuccessfulUsageStatsEntry(store, profileId, lastUsed);
saveAuthProfileStore(store, agentDir);
}
//#endregion
export { setAuthProfileOrder as a, removeProviderAuthProfilesWithLock as i, markAuthProfileSuccess as n, upsertAuthProfile as o, promoteAuthProfileInOrder as r, upsertAuthProfileWithLock as s, clearLastGoodProfileWithLock as t };