openclaw-home-pc/openclaw/extensions/xiaoyi/dist/onboarding.js
2026-03-24 04:00:48 +08:00

168 lines
5.2 KiB
JavaScript

"use strict";
/**
* XiaoYi onboarding adapter for CLI setup wizard.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.xiaoyiOnboardingAdapter = void 0;
const channel = "xiaoyi";
/**
* Get XiaoYi channel config from OpenClaw config
*/
function getXiaoYiConfig(cfg) {
return cfg?.channels?.xiaoyi;
}
/**
* Check if XiaoYi is properly configured
*/
function isXiaoYiConfigured(config) {
if (!config) {
return false;
}
// Check required fields: ak, sk, agentId
// wsUrl1/wsUrl2 are optional (defaults will be used if not provided)
const hasAk = typeof config.ak === "string" && config.ak.trim().length > 0;
const hasSk = typeof config.sk === "string" && config.sk.trim().length > 0;
const hasAgentId = typeof config.agentId === "string" && config.agentId.trim().length > 0;
return hasAk && hasSk && hasAgentId;
}
/**
* Set XiaoYi channel configuration
*/
function setXiaoYiConfig(cfg, config) {
const existing = getXiaoYiConfig(cfg);
const merged = {
enabled: config.enabled ?? existing?.enabled ?? true,
wsUrl: config.wsUrl ?? existing?.wsUrl ?? "",
wsUrl1: config.wsUrl1 ?? existing?.wsUrl1 ?? "",
wsUrl2: config.wsUrl2 ?? existing?.wsUrl2 ?? "",
ak: config.ak ?? existing?.ak ?? "",
sk: config.sk ?? existing?.sk ?? "",
agentId: config.agentId ?? existing?.agentId ?? "",
enableStreaming: config.enableStreaming ?? existing?.enableStreaming ?? true,
};
return {
...cfg,
channels: {
...cfg.channels,
xiaoyi: merged,
},
};
}
/**
* Note about XiaoYi setup
*/
async function noteXiaoYiSetupHelp(prompter) {
await prompter.note([
"XiaoYi (小艺) uses A2A protocol via WebSocket connection.",
"",
"Required credentials:",
" - ak: Access Key for authentication",
" - sk: Secret Key for authentication",
" - agentId: Your agent identifier",
"",
"WebSocket URLs will use default values.",
"",
"Docs: https://docs.openclaw.ai/channels/xiaoyi",
].join("\n"), "XiaoYi setup");
}
/**
* Prompt for Access Key
*/
async function promptAk(prompter, config) {
const existing = config?.ak ?? "";
return String(await prompter.text({
message: "XiaoYi Access Key (ak)",
initialValue: existing,
validate: (value) => (value?.trim() ? undefined : "Required"),
})).trim();
}
/**
* Prompt for Secret Key
*/
async function promptSk(prompter, config) {
const existing = config?.sk ?? "";
return String(await prompter.text({
message: "XiaoYi Secret Key (sk)",
initialValue: existing,
validate: (value) => (value?.trim() ? undefined : "Required"),
})).trim();
}
/**
* Prompt for Agent ID
*/
async function promptAgentId(prompter, config) {
const existing = config?.agentId ?? "";
return String(await prompter.text({
message: "XiaoYi Agent ID",
initialValue: existing,
validate: (value) => (value?.trim() ? undefined : "Required"),
})).trim();
}
exports.xiaoyiOnboardingAdapter = {
channel,
getStatus: async ({ cfg }) => {
const config = getXiaoYiConfig(cfg);
const configured = isXiaoYiConfigured(config);
const enabled = config?.enabled !== false;
const statusLines = [];
if (configured) {
statusLines.push(`XiaoYi: ${enabled ? "enabled" : "disabled"}`);
if (config?.wsUrl1 || config?.wsUrl) {
statusLines.push(` WebSocket: ${config.wsUrl1 || config.wsUrl}`);
}
if (config?.wsUrl2) {
statusLines.push(` Secondary: ${config.wsUrl2}`);
}
if (config?.agentId) {
statusLines.push(` Agent ID: ${config.agentId}`);
}
}
else {
statusLines.push("XiaoYi: needs ak, sk, and agentId");
}
return {
channel,
configured,
statusLines,
selectionHint: configured ? "configured" : "needs setup",
quickstartScore: 50,
};
},
configure: async ({ cfg, prompter }) => {
const config = getXiaoYiConfig(cfg);
if (!isXiaoYiConfigured(config)) {
await noteXiaoYiSetupHelp(prompter);
}
else {
const reconfigure = await prompter.confirm({
message: "XiaoYi already configured. Reconfigure?",
initialValue: false,
});
if (!reconfigure) {
return { cfg, accountId: "default" };
}
}
// Prompt for required credentials
const ak = await promptAk(prompter, config);
const sk = await promptSk(prompter, config);
const agentId = await promptAgentId(prompter, config);
const cfgWithConfig = setXiaoYiConfig(cfg, {
ak,
sk,
agentId,
enabled: true,
});
return { cfg: cfgWithConfig, accountId: "default" };
},
disable: (cfg) => {
const xiaoyi = getXiaoYiConfig(cfg);
return {
...cfg,
channels: {
...cfg.channels,
xiaoyi: { ...xiaoyi, enabled: false },
},
};
},
};