168 lines
5.2 KiB
JavaScript
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 },
|
|
},
|
|
};
|
|
},
|
|
};
|