wechat-ai 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +64 -3
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -41,6 +41,62 @@ var HELP = `
|
|
|
41
41
|
/model deepseek \u5207\u6362\u5230 DeepSeek
|
|
42
42
|
/help \u663E\u793A\u5E2E\u52A9
|
|
43
43
|
`;
|
|
44
|
+
function printBanner(defaultProvider) {
|
|
45
|
+
const c = {
|
|
46
|
+
reset: "\x1B[0m",
|
|
47
|
+
bold: "\x1B[1m",
|
|
48
|
+
dim: "\x1B[2m",
|
|
49
|
+
green: "\x1B[32m",
|
|
50
|
+
gray: "\x1B[90m",
|
|
51
|
+
white: "\x1B[97m",
|
|
52
|
+
orange: "\x1B[38;5;208m",
|
|
53
|
+
border: "\x1B[38;5;60m"
|
|
54
|
+
// muted blue-gray, similar to Claude Code
|
|
55
|
+
};
|
|
56
|
+
const boxW = 44;
|
|
57
|
+
const inner = boxW - 2;
|
|
58
|
+
const b = c.border;
|
|
59
|
+
const empty = ` ${b}\u2502${c.reset}${" ".repeat(inner)}${b}\u2502${c.reset}`;
|
|
60
|
+
const displayWidth = (s) => {
|
|
61
|
+
const stripped = s.replace(/\x1b\[[0-9;]*m/g, "");
|
|
62
|
+
let w = 0;
|
|
63
|
+
for (const ch of stripped) {
|
|
64
|
+
const code = ch.codePointAt(0);
|
|
65
|
+
w += code >= 11904 && code <= 40959 || code >= 63744 && code <= 64255 || code >= 65072 && code <= 65103 || code >= 65280 && code <= 65376 ? 2 : 1;
|
|
66
|
+
}
|
|
67
|
+
return w;
|
|
68
|
+
};
|
|
69
|
+
const center = (s) => {
|
|
70
|
+
const w = displayWidth(s);
|
|
71
|
+
const left = Math.floor((inner - w) / 2);
|
|
72
|
+
const right = inner - w - left;
|
|
73
|
+
return ` ${b}\u2502${c.reset}${" ".repeat(left)}${s}${" ".repeat(right)}${b}\u2502${c.reset}`;
|
|
74
|
+
};
|
|
75
|
+
const titleText = ` Wechat AI v${VERSION} `;
|
|
76
|
+
const titleLen = titleText.length;
|
|
77
|
+
const sideL = Math.floor((inner - titleLen) / 2);
|
|
78
|
+
const sideR = inner - titleLen - sideL;
|
|
79
|
+
const topBorder = ` ${b}\u256D${"\u2500".repeat(sideL)}${c.reset}${c.bold}${c.white}${titleText}${c.reset}${b}${"\u2500".repeat(sideR)}\u256E${c.reset}`;
|
|
80
|
+
const icons = [
|
|
81
|
+
`${c.green}\u256D\u2500\u2500\u2500\u256E${c.reset} ${c.orange}\u256D\u2500\u2500\u2500\u256E${c.reset}`,
|
|
82
|
+
`${c.green}\u2502\xB0 \xB0\u2502${c.reset} ${c.dim}\u25C4\u2550\u2550\u25BA${c.reset} ${c.orange}\u2502\u25C9 \u25C9\u2502${c.reset}`,
|
|
83
|
+
`${c.green}\u2570\u2500\u222A\u2500\u256F${c.reset} ${c.orange}\u2570\u2500\u256E\u2500\u256F${c.reset}`
|
|
84
|
+
];
|
|
85
|
+
const welcome = `${c.bold}${c.white}Welcome!${c.reset}`;
|
|
86
|
+
const info = `${c.dim}model: ${defaultProvider} \xB7 type /help in chat${c.reset}`;
|
|
87
|
+
console.log();
|
|
88
|
+
console.log(topBorder);
|
|
89
|
+
console.log(empty);
|
|
90
|
+
console.log(center(welcome));
|
|
91
|
+
console.log(empty);
|
|
92
|
+
for (const line of icons) {
|
|
93
|
+
console.log(center(line));
|
|
94
|
+
}
|
|
95
|
+
console.log(empty);
|
|
96
|
+
console.log(center(info));
|
|
97
|
+
console.log(` ${b}\u2570${"\u2500".repeat(inner)}\u256F${c.reset}`);
|
|
98
|
+
console.log();
|
|
99
|
+
}
|
|
44
100
|
async function main() {
|
|
45
101
|
const args = process.argv.slice(2);
|
|
46
102
|
const command = args[0];
|
|
@@ -93,10 +149,15 @@ async function main() {
|
|
|
93
149
|
}
|
|
94
150
|
case "update": {
|
|
95
151
|
const { execSync } = await import("child_process");
|
|
96
|
-
console.log(
|
|
152
|
+
console.log(`\u6B63\u5728\u66F4\u65B0 wechat-ai... (\u5F53\u524D v${VERSION})`);
|
|
97
153
|
try {
|
|
98
154
|
execSync("npm i -g wechat-ai@latest", { stdio: "inherit" });
|
|
99
|
-
|
|
155
|
+
let newVersion = "latest";
|
|
156
|
+
try {
|
|
157
|
+
newVersion = execSync("npm info wechat-ai version", { encoding: "utf-8" }).trim();
|
|
158
|
+
} catch {
|
|
159
|
+
}
|
|
160
|
+
console.log(`\x1B[32m\u2713\x1B[0m \u66F4\u65B0\u5B8C\u6210 v${VERSION} \u2192 v${newVersion}`);
|
|
100
161
|
} catch {
|
|
101
162
|
console.error("\x1B[31m\u2717\x1B[0m \u66F4\u65B0\u5931\u8D25\uFF0C\u8BF7\u624B\u52A8\u6267\u884C: npm i -g wechat-ai@latest");
|
|
102
163
|
process.exit(1);
|
|
@@ -115,6 +176,7 @@ async function main() {
|
|
|
115
176
|
break;
|
|
116
177
|
}
|
|
117
178
|
default: {
|
|
179
|
+
printBanner(config.defaultProvider);
|
|
118
180
|
const gateway = new Gateway(config);
|
|
119
181
|
gateway.init();
|
|
120
182
|
const shutdown = async () => {
|
|
@@ -123,7 +185,6 @@ async function main() {
|
|
|
123
185
|
};
|
|
124
186
|
process.on("SIGINT", shutdown);
|
|
125
187
|
process.on("SIGTERM", shutdown);
|
|
126
|
-
log.info(`wechat-ai v${VERSION}`);
|
|
127
188
|
await gateway.start();
|
|
128
189
|
break;
|
|
129
190
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport { loadConfig, saveConfig } from \"./config.js\";\nimport { Gateway } from \"./gateway.js\";\nimport { setLogLevel, createLogger } from \"./logger.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, \"..\", \"package.json\"), \"utf-8\"));\nconst VERSION = pkg.version as string;\n\nconst log = createLogger(\"cli\");\n\nconst HELP = `\n \\x1b[1mwechat-ai\\x1b[0m — WeChat AI Bot\n\n \\x1b[1m命令:\\x1b[0m\n wechat-ai 启动 (首次自动扫码登录)\n wechat-ai set <provider> <key> 设置模型 API Key\n wechat-ai use <provider> 设置默认模型\n wechat-ai config 查看当前配置\n wechat-ai update 更新到最新版\n wechat-ai help 显示帮助\n\n \\x1b[1m设置 API Key:\\x1b[0m\n wechat-ai set qwen sk-xxx 设置通义千问 Key\n wechat-ai set deepseek sk-xxx 设置 DeepSeek Key\n wechat-ai set claude sk-xxx 设置 Claude Key\n\n \\x1b[1m设置默认模型:\\x1b[0m\n wechat-ai use qwen 默认使用 Qwen\n wechat-ai use deepseek 默认使用 DeepSeek\n\n \\x1b[1m微信指令:\\x1b[0m\n /model 查看当前模型\n /model qwen 切换到 Qwen\n /model deepseek 切换到 DeepSeek\n /help 显示帮助\n`;\n\nasync function main() {\n const args = process.argv.slice(2);\n const command = args[0];\n\n const logLevel = (process.env.WAI_LOG_LEVEL || \"info\") as \"debug\" | \"info\" | \"warn\" | \"error\";\n setLogLevel(logLevel);\n\n if (command === \"--version\" || command === \"-v\") {\n console.log(`wechat-ai v${VERSION}`);\n process.exit(0);\n }\n\n if (command === \"help\" || command === \"--help\" || command === \"-h\") {\n console.log(HELP);\n process.exit(0);\n }\n\n const config = await loadConfig();\n\n switch (command) {\n case \"set\": {\n const provider = args[1];\n const apiKey = args[2];\n\n if (!provider || !apiKey) {\n console.log(\"用法: wechat-ai set <provider> <key>\");\n console.log(\"示例: wechat-ai set qwen sk-xxx\");\n process.exit(1);\n }\n\n if (!config.providers[provider]) {\n console.log(`未知模型: ${provider}`);\n console.log(`可用: ${Object.keys(config.providers).join(\", \")}`);\n process.exit(1);\n }\n\n config.providers[provider]!.apiKey = apiKey;\n await saveConfig(config);\n console.log(`\\x1b[32m✓\\x1b[0m 已保存 ${provider} 的 API Key`);\n break;\n }\n\n case \"use\": {\n const provider = args[1];\n\n if (!provider) {\n console.log(`当前默认模型: ${config.defaultProvider}`);\n console.log(`可用: ${Object.keys(config.providers).join(\", \")}`);\n break;\n }\n\n if (!config.providers[provider]) {\n console.log(`未知模型: ${provider}`);\n console.log(`可用: ${Object.keys(config.providers).join(\", \")}`);\n process.exit(1);\n }\n\n config.defaultProvider = provider;\n await saveConfig(config);\n console.log(`\\x1b[32m✓\\x1b[0m 默认模型已切换到 ${provider}`);\n break;\n }\n\n case \"update\": {\n const { execSync } = await import(\"node:child_process\");\n console.log(\"正在更新 wechat-ai...\");\n try {\n execSync(\"npm i -g wechat-ai@latest\", { stdio: \"inherit\" });\n console.log(\"\\x1b[32m✓\\x1b[0m 更新完成\");\n } catch {\n console.error(\"\\x1b[31m✗\\x1b[0m 更新失败,请手动执行: npm i -g wechat-ai@latest\");\n process.exit(1);\n }\n break;\n }\n\n case \"config\": {\n // Hide API keys in output\n const display = JSON.parse(JSON.stringify(config));\n for (const p of Object.values(display.providers)) {\n const prov = p as Record<string, unknown>;\n if (prov.apiKey && typeof prov.apiKey === \"string\") {\n prov.apiKey = prov.apiKey.slice(0, 6) + \"...\" + prov.apiKey.slice(-4);\n }\n }\n console.log(JSON.stringify(display, null, 2));\n break;\n }\n\n default: {\n const gateway = new Gateway(config);\n gateway.init();\n\n const shutdown = async () => {\n await gateway.stop();\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n log.info(`wechat-ai v${VERSION}`);\n await gateway.start();\n break;\n }\n }\n}\n\nmain().catch((err) => {\n log.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nimport { loadConfig, saveConfig } from \"./config.js\";\nimport { Gateway } from \"./gateway.js\";\nimport { setLogLevel, createLogger } from \"./logger.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst pkg = JSON.parse(readFileSync(join(__dirname, \"..\", \"package.json\"), \"utf-8\"));\nconst VERSION = pkg.version as string;\n\nconst log = createLogger(\"cli\");\n\nconst HELP = `\n \\x1b[1mwechat-ai\\x1b[0m — WeChat AI Bot\n\n \\x1b[1m命令:\\x1b[0m\n wechat-ai 启动 (首次自动扫码登录)\n wechat-ai set <provider> <key> 设置模型 API Key\n wechat-ai use <provider> 设置默认模型\n wechat-ai config 查看当前配置\n wechat-ai update 更新到最新版\n wechat-ai help 显示帮助\n\n \\x1b[1m设置 API Key:\\x1b[0m\n wechat-ai set qwen sk-xxx 设置通义千问 Key\n wechat-ai set deepseek sk-xxx 设置 DeepSeek Key\n wechat-ai set claude sk-xxx 设置 Claude Key\n\n \\x1b[1m设置默认模型:\\x1b[0m\n wechat-ai use qwen 默认使用 Qwen\n wechat-ai use deepseek 默认使用 DeepSeek\n\n \\x1b[1m微信指令:\\x1b[0m\n /model 查看当前模型\n /model qwen 切换到 Qwen\n /model deepseek 切换到 DeepSeek\n /help 显示帮助\n`;\n\nfunction printBanner(defaultProvider: string): void {\n const c = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n green: \"\\x1b[32m\",\n gray: \"\\x1b[90m\",\n white: \"\\x1b[97m\",\n orange: \"\\x1b[38;5;208m\",\n border: \"\\x1b[38;5;60m\", // muted blue-gray, similar to Claude Code\n };\n\n const boxW = 44;\n const inner = boxW - 2;\n const b = c.border;\n const empty = ` ${b}│${c.reset}${\" \".repeat(inner)}${b}│${c.reset}`;\n\n const displayWidth = (s: string) => {\n const stripped = s.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n let w = 0;\n for (const ch of stripped) {\n const code = ch.codePointAt(0)!;\n w += (code >= 0x2e80 && code <= 0x9fff) || (code >= 0xf900 && code <= 0xfaff)\n || (code >= 0xfe30 && code <= 0xfe4f) || (code >= 0xff00 && code <= 0xff60) ? 2 : 1;\n }\n return w;\n };\n const center = (s: string) => {\n const w = displayWidth(s);\n const left = Math.floor((inner - w) / 2);\n const right = inner - w - left;\n return ` ${b}│${c.reset}${\" \".repeat(left)}${s}${\" \".repeat(right)}${b}│${c.reset}`;\n };\n // Title embedded in top border, centered\n const titleText = ` Wechat AI v${VERSION} `;\n const titleLen = titleText.length;\n const sideL = Math.floor((inner - titleLen) / 2);\n const sideR = inner - titleLen - sideL;\n const topBorder = ` ${b}╭${\"─\".repeat(sideL)}${c.reset}${c.bold}${c.white}${titleText}${c.reset}${b}${\"─\".repeat(sideR)}╮${c.reset}`;\n\n // Icons: WeChat (green) ◄──► Claude (orange), centered\n const icons = [\n `${c.green}╭───╮${c.reset} ${c.orange}╭───╮${c.reset}`,\n `${c.green}│° °│${c.reset} ${c.dim}◄══►${c.reset} ${c.orange}│◉ ◉│${c.reset}`,\n `${c.green}╰─∪─╯${c.reset} ${c.orange}╰─╮─╯${c.reset}`,\n ];\n\n const welcome = `${c.bold}${c.white}Welcome!${c.reset}`;\n const info = `${c.dim}model: ${defaultProvider} · type /help in chat${c.reset}`;\n\n console.log();\n console.log(topBorder);\n console.log(empty);\n console.log(center(welcome));\n console.log(empty);\n for (const line of icons) {\n console.log(center(line));\n }\n console.log(empty);\n console.log(center(info));\n console.log(` ${b}╰${\"─\".repeat(inner)}╯${c.reset}`);\n console.log();\n}\n\nasync function main() {\n const args = process.argv.slice(2);\n const command = args[0];\n\n const logLevel = (process.env.WAI_LOG_LEVEL || \"info\") as \"debug\" | \"info\" | \"warn\" | \"error\";\n setLogLevel(logLevel);\n\n if (command === \"--version\" || command === \"-v\") {\n console.log(`wechat-ai v${VERSION}`);\n process.exit(0);\n }\n\n if (command === \"help\" || command === \"--help\" || command === \"-h\") {\n console.log(HELP);\n process.exit(0);\n }\n\n const config = await loadConfig();\n\n switch (command) {\n case \"set\": {\n const provider = args[1];\n const apiKey = args[2];\n\n if (!provider || !apiKey) {\n console.log(\"用法: wechat-ai set <provider> <key>\");\n console.log(\"示例: wechat-ai set qwen sk-xxx\");\n process.exit(1);\n }\n\n if (!config.providers[provider]) {\n console.log(`未知模型: ${provider}`);\n console.log(`可用: ${Object.keys(config.providers).join(\", \")}`);\n process.exit(1);\n }\n\n config.providers[provider]!.apiKey = apiKey;\n await saveConfig(config);\n console.log(`\\x1b[32m✓\\x1b[0m 已保存 ${provider} 的 API Key`);\n break;\n }\n\n case \"use\": {\n const provider = args[1];\n\n if (!provider) {\n console.log(`当前默认模型: ${config.defaultProvider}`);\n console.log(`可用: ${Object.keys(config.providers).join(\", \")}`);\n break;\n }\n\n if (!config.providers[provider]) {\n console.log(`未知模型: ${provider}`);\n console.log(`可用: ${Object.keys(config.providers).join(\", \")}`);\n process.exit(1);\n }\n\n config.defaultProvider = provider;\n await saveConfig(config);\n console.log(`\\x1b[32m✓\\x1b[0m 默认模型已切换到 ${provider}`);\n break;\n }\n\n case \"update\": {\n const { execSync } = await import(\"node:child_process\");\n console.log(`正在更新 wechat-ai... (当前 v${VERSION})`);\n try {\n execSync(\"npm i -g wechat-ai@latest\", { stdio: \"inherit\" });\n // Read the newly installed version\n let newVersion = \"latest\";\n try {\n newVersion = execSync(\"npm info wechat-ai version\", { encoding: \"utf-8\" }).trim();\n } catch { /* ignore */ }\n console.log(`\\x1b[32m✓\\x1b[0m 更新完成 v${VERSION} → v${newVersion}`);\n } catch {\n console.error(\"\\x1b[31m✗\\x1b[0m 更新失败,请手动执行: npm i -g wechat-ai@latest\");\n process.exit(1);\n }\n break;\n }\n\n case \"config\": {\n // Hide API keys in output\n const display = JSON.parse(JSON.stringify(config));\n for (const p of Object.values(display.providers)) {\n const prov = p as Record<string, unknown>;\n if (prov.apiKey && typeof prov.apiKey === \"string\") {\n prov.apiKey = prov.apiKey.slice(0, 6) + \"...\" + prov.apiKey.slice(-4);\n }\n }\n console.log(JSON.stringify(display, null, 2));\n break;\n }\n\n default: {\n printBanner(config.defaultProvider);\n\n const gateway = new Gateway(config);\n gateway.init();\n\n const shutdown = async () => {\n await gateway.stop();\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n await gateway.start();\n break;\n }\n }\n}\n\nmain().catch((err) => {\n log.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n"],"mappings":"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","names":[]}
|