openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
127 lines (126 loc) • 4.37 kB
JavaScript
import { c as isRecord } from "./utils-CCC-BEJH.js";
import "./string-coerce-runtime-CEGJWkQ_.js";
import fs from "node:fs";
import path from "node:path";
import os from "node:os";
//#region extensions/elevenlabs/config-compat.ts
const ELEVENLABS_API_KEY_ENV = "ELEVENLABS_API_KEY";
const PROFILE_CANDIDATES = [
".profile",
".zprofile",
".zshrc",
".bashrc"
];
const LEGACY_TALK_FIELD_KEYS = [
"voiceId",
"voiceAliases",
"modelId",
"outputFormat",
"apiKey"
];
const ELEVENLABS_TALK_PROVIDER_ID = "elevenlabs";
function getRecord(value) {
return isRecord(value) ? value : null;
}
function ensureRecord(root, key) {
const existing = getRecord(root[key]);
if (existing) return existing;
const next = {};
root[key] = next;
return next;
}
function isBlockedObjectKey(key) {
return key === "__proto__" || key === "prototype" || key === "constructor";
}
function mergeMissing(target, source) {
for (const [key, value] of Object.entries(source)) {
if (value === void 0 || isBlockedObjectKey(key)) continue;
const existing = target[key];
if (existing === void 0) {
target[key] = value;
continue;
}
if (isRecord(existing) && isRecord(value)) mergeMissing(existing, value);
}
}
function hasLegacyTalkFields(value) {
const talk = getRecord(value);
if (!talk) return false;
return LEGACY_TALK_FIELD_KEYS.some((key) => Object.hasOwn(talk, key));
}
function resolveTalkMigrationTargetProviderId(talk) {
const explicitProvider = typeof talk.provider === "string" && talk.provider.trim() ? talk.provider.trim() : null;
const providers = getRecord(talk.providers);
if (explicitProvider) {
if (isBlockedObjectKey(explicitProvider)) return null;
return explicitProvider;
}
if (!providers) return ELEVENLABS_TALK_PROVIDER_ID;
const providerIds = Object.keys(providers).filter((key) => !isBlockedObjectKey(key));
if (providerIds.length === 0) return ELEVENLABS_TALK_PROVIDER_ID;
if (providerIds.length === 1) return providerIds[0] ?? null;
return null;
}
function migrateElevenLabsLegacyTalkConfig(raw) {
if (!isRecord(raw)) return {
config: raw,
changes: []
};
const talk = getRecord(raw.talk);
if (!talk || !hasLegacyTalkFields(talk)) return {
config: raw,
changes: []
};
const providerId = resolveTalkMigrationTargetProviderId(talk);
if (!providerId) return {
config: raw,
changes: ["Skipped talk legacy field migration because talk.providers defines multiple providers and talk.provider is unset; move talk.voiceId/talk.voiceAliases/talk.modelId/talk.outputFormat/talk.apiKey under the intended provider manually."]
};
const nextRoot = structuredClone(raw);
const nextTalk = ensureRecord(nextRoot, "talk");
const providers = ensureRecord(nextTalk, "providers");
const existingProvider = getRecord(providers[providerId]) ?? {};
const migratedProvider = structuredClone(existingProvider);
const legacyFields = {};
const movedKeys = [];
for (const key of LEGACY_TALK_FIELD_KEYS) {
if (!Object.hasOwn(nextTalk, key)) continue;
legacyFields[key] = nextTalk[key];
delete nextTalk[key];
movedKeys.push(key);
}
if (movedKeys.length === 0) return {
config: raw,
changes: []
};
mergeMissing(migratedProvider, legacyFields);
providers[providerId] = migratedProvider;
nextTalk.providers = providers;
nextRoot.talk = nextTalk;
return {
config: nextRoot,
changes: [`Moved talk legacy fields (${movedKeys.join(", ")}) → talk.providers.${providerId} (filled missing provider fields only).`]
};
}
function readApiKeyFromProfile(deps = {}) {
const fsImpl = deps.fs ?? fs;
const osImpl = deps.os ?? os;
const pathImpl = deps.path ?? path;
const home = osImpl.homedir();
for (const candidate of PROFILE_CANDIDATES) {
const fullPath = pathImpl.join(home, candidate);
if (!fsImpl.existsSync(fullPath)) continue;
try {
const value = fsImpl.readFileSync(fullPath, "utf-8").match(/(?:^|\n)\s*(?:export\s+)?ELEVENLABS_API_KEY\s*=\s*["']?([^\n"']+)["']?/)?.[1]?.trim();
if (value) return value;
} catch {}
}
return null;
}
function resolveElevenLabsApiKeyWithProfileFallback(env = process.env, deps = {}) {
const envValue = (env[ELEVENLABS_API_KEY_ENV] ?? "").trim();
if (envValue) return envValue;
return readApiKeyFromProfile(deps);
}
//#endregion
export { migrateElevenLabsLegacyTalkConfig as n, resolveElevenLabsApiKeyWithProfileFallback as r, ELEVENLABS_TALK_PROVIDER_ID as t };