@clawmarket.cc/marketcc 0.2.2 โ 0.2.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/commands/download.d.ts +2 -0
- package/dist/commands/download.js +191 -0
- package/dist/commands/download.js.map +1 -0
- package/dist/commands/setup-keys.d.ts +2 -0
- package/dist/commands/setup-keys.js +380 -0
- package/dist/commands/setup-keys.js.map +1 -0
- package/dist/commands/upload-bot.js +117 -15
- package/dist/commands/upload-bot.js.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/key-scanner.d.ts +50 -0
- package/dist/lib/key-scanner.js +479 -0
- package/dist/lib/key-scanner.js.map +1 -0
- package/package.json +3 -1
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { mkdir, rm, unlink, copyFile, cp } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { exec } from 'node:child_process';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
6
|
+
import { createRequire } from 'node:module';
|
|
7
|
+
import { pipeline } from 'node:stream/promises';
|
|
8
|
+
import ora from 'ora';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import { createAuthenticatedClient } from '../lib/api.js';
|
|
11
|
+
import { handleApiError } from '../lib/errors.js';
|
|
12
|
+
const require = createRequire(import.meta.url);
|
|
13
|
+
const unzipper = require('unzipper');
|
|
14
|
+
const execAsync = promisify(exec);
|
|
15
|
+
const DEFAULT_DEST_PATH = '/root/.openclaw';
|
|
16
|
+
const SKILLS_DEST_PATH = '/usr/lib/node_modules/openclaw/skills';
|
|
17
|
+
export default function registerDownload(program) {
|
|
18
|
+
program
|
|
19
|
+
.command('download <bot-id> [path]')
|
|
20
|
+
.description('Download and install a bot from the database')
|
|
21
|
+
.action(async (botId, destPath) => {
|
|
22
|
+
const targetPath = destPath || DEFAULT_DEST_PATH;
|
|
23
|
+
let tempZipPath = null;
|
|
24
|
+
let tempExtractPath = null;
|
|
25
|
+
try {
|
|
26
|
+
console.log('');
|
|
27
|
+
console.log(chalk.cyan(`๐ Downloading bot ${botId}...`));
|
|
28
|
+
console.log('');
|
|
29
|
+
// Validate destination path exists
|
|
30
|
+
if (!existsSync(targetPath)) {
|
|
31
|
+
console.error(chalk.red(`โ Error: Destination path "${targetPath}" does not exist`));
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
// Fetch bot metadata first
|
|
35
|
+
const spinnerFetch = ora({
|
|
36
|
+
text: 'Fetching from database...',
|
|
37
|
+
prefixText: chalk.cyan('โ๏ธ '),
|
|
38
|
+
}).start();
|
|
39
|
+
const client = await createAuthenticatedClient();
|
|
40
|
+
// Get bot metadata
|
|
41
|
+
let botMeta;
|
|
42
|
+
try {
|
|
43
|
+
botMeta = await client.request('GET', `/api/bots/${botId}`);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
spinnerFetch.fail(chalk.red('Bot not found'));
|
|
47
|
+
console.error(chalk.red(`\nโ Error: Bot not found with ID "${botId}"`));
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
const sizeMB = (Number(botMeta.size_bytes) / (1024 * 1024)).toFixed(2);
|
|
51
|
+
spinnerFetch.succeed(chalk.green(`Found bot: "${botMeta.filename}" (${sizeMB} MB)`));
|
|
52
|
+
console.log('');
|
|
53
|
+
// Download the zip file
|
|
54
|
+
const spinnerDownload = ora({
|
|
55
|
+
text: 'Downloading...',
|
|
56
|
+
prefixText: chalk.cyan('๐ฅ'),
|
|
57
|
+
}).start();
|
|
58
|
+
const response = await client.requestRaw('GET', `/api/bots/${botId}/download`);
|
|
59
|
+
const zipBuffer = Buffer.from(await response.arrayBuffer());
|
|
60
|
+
// Save to temp location
|
|
61
|
+
tempZipPath = join(targetPath, `.bot-download-${botId}.zip`);
|
|
62
|
+
const { writeFile } = await import('node:fs/promises');
|
|
63
|
+
await writeFile(tempZipPath, zipBuffer);
|
|
64
|
+
spinnerDownload.succeed(chalk.green('Download complete'));
|
|
65
|
+
console.log('');
|
|
66
|
+
// Extract files
|
|
67
|
+
const spinnerExtract = ora({
|
|
68
|
+
text: 'Extracting files...',
|
|
69
|
+
prefixText: chalk.cyan('๐ฆ'),
|
|
70
|
+
}).start();
|
|
71
|
+
tempExtractPath = join(targetPath, `.bot-extract-${botId}`);
|
|
72
|
+
await mkdir(tempExtractPath, { recursive: true });
|
|
73
|
+
// Extract zip to temp directory
|
|
74
|
+
await extractZip(tempZipPath, tempExtractPath);
|
|
75
|
+
spinnerExtract.text = 'Validating zip contents...';
|
|
76
|
+
// Validate required files exist in extracted content
|
|
77
|
+
const requiredItems = ['workspace', 'cron', 'openclaw.json', 'agent', 'skills'];
|
|
78
|
+
const missingItems = [];
|
|
79
|
+
for (const item of requiredItems) {
|
|
80
|
+
if (!existsSync(join(tempExtractPath, item))) {
|
|
81
|
+
missingItems.push(item);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (missingItems.length > 0) {
|
|
85
|
+
spinnerExtract.fail(chalk.red('Invalid zip structure'));
|
|
86
|
+
console.error(chalk.red(`\nโ Error: Zip missing required items: ${missingItems.join(', ')}`));
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
spinnerExtract.succeed(chalk.green('Zip validated'));
|
|
90
|
+
console.log('');
|
|
91
|
+
// Install files to destinations
|
|
92
|
+
console.log(chalk.cyan('๐ฆ Extracting files...'));
|
|
93
|
+
// workspace/ โ {PATH}/workspace
|
|
94
|
+
await installDirectory(join(tempExtractPath, 'workspace'), join(targetPath, 'workspace'), 'workspace');
|
|
95
|
+
// cron/ โ {PATH}/cron
|
|
96
|
+
await installDirectory(join(tempExtractPath, 'cron'), join(targetPath, 'cron'), 'cron');
|
|
97
|
+
// openclaw.json โ {PATH}/openclaw.json
|
|
98
|
+
await installFile(join(tempExtractPath, 'openclaw.json'), join(targetPath, 'openclaw.json'), 'openclaw.json');
|
|
99
|
+
// agent/ โ {PATH}/agents/main/agent
|
|
100
|
+
const agentDestDir = join(targetPath, 'agents', 'main');
|
|
101
|
+
await mkdir(agentDestDir, { recursive: true });
|
|
102
|
+
await installDirectory(join(tempExtractPath, 'agent'), join(agentDestDir, 'agent'), 'agent');
|
|
103
|
+
// skills/ โ /usr/lib/node_modules/openclaw/skills (fixed path)
|
|
104
|
+
const skillsParentDir = '/usr/lib/node_modules/openclaw';
|
|
105
|
+
await mkdir(skillsParentDir, { recursive: true });
|
|
106
|
+
await installDirectory(join(tempExtractPath, 'skills'), SKILLS_DEST_PATH, 'skills');
|
|
107
|
+
console.log('');
|
|
108
|
+
// Restart gateway
|
|
109
|
+
const spinnerRestart = ora({
|
|
110
|
+
text: 'Restarting gateway...',
|
|
111
|
+
prefixText: chalk.cyan('๐'),
|
|
112
|
+
}).start();
|
|
113
|
+
try {
|
|
114
|
+
await execAsync('systemctl restart openclaw-gateway');
|
|
115
|
+
spinnerRestart.succeed(chalk.green('Gateway restarted'));
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Try alternative restart methods
|
|
119
|
+
try {
|
|
120
|
+
await execAsync('pm2 restart openclaw-gateway');
|
|
121
|
+
spinnerRestart.succeed(chalk.green('Gateway restarted'));
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
spinnerRestart.warn(chalk.yellow('Could not restart gateway automatically. Please restart manually.'));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
console.log('');
|
|
128
|
+
// Cleanup
|
|
129
|
+
const spinnerClean = ora({
|
|
130
|
+
text: 'Cleaning up...',
|
|
131
|
+
prefixText: chalk.cyan('๐งน'),
|
|
132
|
+
}).start();
|
|
133
|
+
if (tempZipPath && existsSync(tempZipPath)) {
|
|
134
|
+
await unlink(tempZipPath);
|
|
135
|
+
}
|
|
136
|
+
if (tempExtractPath && existsSync(tempExtractPath)) {
|
|
137
|
+
await rm(tempExtractPath, { recursive: true });
|
|
138
|
+
}
|
|
139
|
+
spinnerClean.succeed(chalk.green('Cleaned up'));
|
|
140
|
+
console.log('');
|
|
141
|
+
console.log(chalk.green('โ
Bot installed successfully!'));
|
|
142
|
+
// Check if KEYS_REQUIRED.json exists and hint about setup-keys
|
|
143
|
+
if (existsSync(join(targetPath, 'KEYS_REQUIRED.json'))) {
|
|
144
|
+
console.log('');
|
|
145
|
+
console.log(chalk.yellow('โ ๏ธ This bot requires API key configuration.'));
|
|
146
|
+
console.log(chalk.dim(" Run 'marketcc setup-keys' to configure API keys."));
|
|
147
|
+
}
|
|
148
|
+
console.log('');
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
// Cleanup on error
|
|
152
|
+
if (tempZipPath && existsSync(tempZipPath)) {
|
|
153
|
+
try {
|
|
154
|
+
await unlink(tempZipPath);
|
|
155
|
+
}
|
|
156
|
+
catch { /* ignore */ }
|
|
157
|
+
}
|
|
158
|
+
if (tempExtractPath && existsSync(tempExtractPath)) {
|
|
159
|
+
try {
|
|
160
|
+
await rm(tempExtractPath, { recursive: true });
|
|
161
|
+
}
|
|
162
|
+
catch { /* ignore */ }
|
|
163
|
+
}
|
|
164
|
+
handleApiError(err);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
async function extractZip(zipPath, destPath) {
|
|
169
|
+
const { createReadStream } = await import('node:fs');
|
|
170
|
+
const readStream = createReadStream(zipPath);
|
|
171
|
+
await pipeline(readStream, unzipper.Extract({ path: destPath }));
|
|
172
|
+
}
|
|
173
|
+
async function installDirectory(src, dest, name) {
|
|
174
|
+
// Remove existing directory if it exists
|
|
175
|
+
if (existsSync(dest)) {
|
|
176
|
+
await rm(dest, { recursive: true });
|
|
177
|
+
}
|
|
178
|
+
// Copy new directory
|
|
179
|
+
await cp(src, dest, { recursive: true });
|
|
180
|
+
console.log(chalk.green(`โ ${name} extracted`));
|
|
181
|
+
}
|
|
182
|
+
async function installFile(src, dest, name) {
|
|
183
|
+
// Remove existing file if it exists
|
|
184
|
+
if (existsSync(dest)) {
|
|
185
|
+
await unlink(dest);
|
|
186
|
+
}
|
|
187
|
+
// Copy new file
|
|
188
|
+
await copyFile(src, dest);
|
|
189
|
+
console.log(chalk.green(`โ ${name} extracted`));
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=download.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/commands/download.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAqB,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAErC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,iBAAiB,GAAG,iBAAiB,CAAC;AAC5C,MAAM,gBAAgB,GAAG,uCAAuC,CAAC;AAQjE,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,OAAgB;IACvD,OAAO;SACJ,OAAO,CAAC,0BAA0B,CAAC;SACnC,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,QAAiB,EAAE,EAAE;QACjD,MAAM,UAAU,GAAG,QAAQ,IAAI,iBAAiB,CAAC;QACjD,IAAI,WAAW,GAAkB,IAAI,CAAC;QACtC,IAAI,eAAe,GAAkB,IAAI,CAAC;QAE1C,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,KAAK,KAAK,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,mCAAmC;YACnC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,UAAU,kBAAkB,CAAC,CAAC,CAAC;gBACrF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,2BAA2B;YAC3B,MAAM,YAAY,GAAG,GAAG,CAAC;gBACvB,IAAI,EAAE,2BAA2B;gBACjC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;aAC9B,CAAC,CAAC,KAAK,EAAE,CAAC;YAEX,MAAM,MAAM,GAAG,MAAM,yBAAyB,EAAE,CAAC;YAEjD,mBAAmB;YACnB,IAAI,OAAoB,CAAC;YACzB,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAc,KAAK,EAAE,aAAa,KAAK,EAAE,CAAC,CAAC;YAC3E,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;gBAC9C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qCAAqC,KAAK,GAAG,CAAC,CAAC,CAAC;gBACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACvE,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,OAAO,CAAC,QAAQ,MAAM,MAAM,MAAM,CAAC,CAAC,CAAC;YAErF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,wBAAwB;YACxB,MAAM,eAAe,GAAG,GAAG,CAAC;gBAC1B,IAAI,EAAE,gBAAgB;gBACtB,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;aAC7B,CAAC,CAAC,KAAK,EAAE,CAAC;YAEX,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,aAAa,KAAK,WAAW,CAAC,CAAC;YAC/E,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;YAE5D,wBAAwB;YACxB,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,iBAAiB,KAAK,MAAM,CAAC,CAAC;YAC7D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACvD,MAAM,SAAS,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAExC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAE1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,gBAAgB;YAChB,MAAM,cAAc,GAAG,GAAG,CAAC;gBACzB,IAAI,EAAE,qBAAqB;gBAC3B,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;aAC7B,CAAC,CAAC,KAAK,EAAE,CAAC;YAEX,eAAe,GAAG,IAAI,CAAC,UAAU,EAAE,gBAAgB,KAAK,EAAE,CAAC,CAAC;YAC5D,MAAM,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAElD,gCAAgC;YAChC,MAAM,UAAU,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;YAE/C,cAAc,CAAC,IAAI,GAAG,4BAA4B,CAAC;YAEnD,qDAAqD;YACrD,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YAChF,MAAM,YAAY,GAAa,EAAE,CAAC;YAElC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;oBAC7C,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC;YAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5B,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;gBACxD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0CAA0C,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;YAErD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,gCAAgC;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAElD,gCAAgC;YAChC,MAAM,gBAAgB,CACpB,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,EAClC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,EAC7B,WAAW,CACZ,CAAC;YAEF,sBAAsB;YACtB,MAAM,gBAAgB,CACpB,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,EAC7B,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,EACxB,MAAM,CACP,CAAC;YAEF,uCAAuC;YACvC,MAAM,WAAW,CACf,IAAI,CAAC,eAAe,EAAE,eAAe,CAAC,EACtC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,EACjC,eAAe,CAChB,CAAC;YAEF,oCAAoC;YACpC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YACxD,MAAM,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,MAAM,gBAAgB,CACpB,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,EAC9B,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,EAC3B,OAAO,CACR,CAAC;YAEF,+DAA+D;YAC/D,MAAM,eAAe,GAAG,gCAAgC,CAAC;YACzD,MAAM,KAAK,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,MAAM,gBAAgB,CACpB,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,EAC/B,gBAAgB,EAChB,QAAQ,CACT,CAAC;YAEF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,kBAAkB;YAClB,MAAM,cAAc,GAAG,GAAG,CAAC;gBACzB,IAAI,EAAE,uBAAuB;gBAC7B,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;aAC7B,CAAC,CAAC,KAAK,EAAE,CAAC;YAEX,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,oCAAoC,CAAC,CAAC;gBACtD,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;YAC3D,CAAC;YAAC,MAAM,CAAC;gBACP,kCAAkC;gBAClC,IAAI,CAAC;oBACH,MAAM,SAAS,CAAC,8BAA8B,CAAC,CAAC;oBAChD,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAC3D,CAAC;gBAAC,MAAM,CAAC;oBACP,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,mEAAmE,CAAC,CAAC,CAAC;gBACzG,CAAC;YACH,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,UAAU;YACV,MAAM,YAAY,GAAG,GAAG,CAAC;gBACvB,IAAI,EAAE,gBAAgB;gBACtB,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;aAC7B,CAAC,CAAC,KAAK,EAAE,CAAC;YAEX,IAAI,WAAW,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC3C,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;YACD,IAAI,eAAe,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACnD,MAAM,EAAE,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,CAAC;YAED,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;YAEhD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;YAE1D,+DAA+D;YAC/D,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC,CAAC;gBAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC,CAAC;YAChF,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAElB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,mBAAmB;YACnB,IAAI,WAAW,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC;oBAAC,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,eAAe,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC;oBAAC,MAAM,EAAE,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAChF,CAAC;YACD,cAAc,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,QAAgB;IACzD,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE7C,MAAM,QAAQ,CACZ,UAAU,EACV,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CACrC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,IAAY,EAAE,IAAY;IACrE,yCAAyC;IACzC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,qBAAqB;IACrB,MAAM,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,IAAY,EAAE,IAAY;IAChE,oCAAoC;IACpC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,gBAAgB;IAChB,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { unlink } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { exec } from 'node:child_process';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
6
|
+
import { randomBytes } from 'node:crypto';
|
|
7
|
+
import prompts from 'prompts';
|
|
8
|
+
import ora from 'ora';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
const execAsync = promisify(exec);
|
|
11
|
+
const DEFAULT_BOT_PATH = '/root/.openclaw';
|
|
12
|
+
const VALIDATORS = {
|
|
13
|
+
'moonshot': (v) => /^sk-[A-Za-z0-9_-]{20,}$/.test(v),
|
|
14
|
+
'openai': (v) => /^sk-[A-Za-z0-9_-]{20,}$/.test(v),
|
|
15
|
+
'anthropic': (v) => /^sk-ant-[A-Za-z0-9_-]{20,}$/.test(v),
|
|
16
|
+
'xai': (v) => /^xai-[A-Za-z0-9_-]{20,}$/.test(v),
|
|
17
|
+
'google': (v) => /^AIza[A-Za-z0-9_-]{35}$/.test(v),
|
|
18
|
+
'brave': (v) => /^BSA[A-Za-z0-9]{20,}$/.test(v),
|
|
19
|
+
'telegram': (v) => /^[0-9]{8,10}:[A-Za-z0-9_-]{35}$/.test(v),
|
|
20
|
+
'stripe': (v) => /^sk_live_[A-Za-z0-9]{24,}$/.test(v),
|
|
21
|
+
};
|
|
22
|
+
function setNestedValue(obj, path, value) {
|
|
23
|
+
const parts = path.split('.');
|
|
24
|
+
let current = obj;
|
|
25
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
26
|
+
const next = current[parts[i]];
|
|
27
|
+
if (typeof next !== 'object' || next === null)
|
|
28
|
+
return;
|
|
29
|
+
current = next;
|
|
30
|
+
}
|
|
31
|
+
current[parts[parts.length - 1]] = value;
|
|
32
|
+
}
|
|
33
|
+
function replaceKeyInFiles(botPath, placeholder, value, locations) {
|
|
34
|
+
let replaced = 0;
|
|
35
|
+
for (const location of locations) {
|
|
36
|
+
const filePath = join(botPath, location.file);
|
|
37
|
+
if (!existsSync(filePath))
|
|
38
|
+
continue;
|
|
39
|
+
if (filePath.endsWith('.json') && location.json_path) {
|
|
40
|
+
try {
|
|
41
|
+
const raw = readFileSync(filePath, 'utf-8');
|
|
42
|
+
const data = JSON.parse(raw);
|
|
43
|
+
setNestedValue(data, location.json_path, value);
|
|
44
|
+
writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n');
|
|
45
|
+
replaced++;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Fallback to string replacement
|
|
49
|
+
let content = readFileSync(filePath, 'utf-8');
|
|
50
|
+
if (content.includes(placeholder)) {
|
|
51
|
+
content = content.replaceAll(placeholder, value);
|
|
52
|
+
writeFileSync(filePath, content);
|
|
53
|
+
replaced++;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
let content = readFileSync(filePath, 'utf-8');
|
|
59
|
+
if (content.includes(placeholder)) {
|
|
60
|
+
content = content.replaceAll(placeholder, value);
|
|
61
|
+
writeFileSync(filePath, content);
|
|
62
|
+
replaced++;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return replaced;
|
|
67
|
+
}
|
|
68
|
+
export default function registerSetupKeys(program) {
|
|
69
|
+
program
|
|
70
|
+
.command('setup-keys [path]')
|
|
71
|
+
.description('Configure API keys for a downloaded bot')
|
|
72
|
+
.action(async (botPath) => {
|
|
73
|
+
const targetPath = botPath || DEFAULT_BOT_PATH;
|
|
74
|
+
try {
|
|
75
|
+
console.log('');
|
|
76
|
+
console.log(chalk.cyan('๐ Setting up API keys...'));
|
|
77
|
+
console.log('');
|
|
78
|
+
const manifestPath = join(targetPath, 'KEYS_REQUIRED.json');
|
|
79
|
+
if (!existsSync(manifestPath)) {
|
|
80
|
+
console.log(chalk.green('โ No keys to configure. Bot is ready!'));
|
|
81
|
+
console.log('');
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
let manifest;
|
|
85
|
+
try {
|
|
86
|
+
manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
console.error(chalk.red('โ Error: Could not parse KEYS_REQUIRED.json'));
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
if (!manifest.keys || manifest.keys.length === 0) {
|
|
93
|
+
console.log(chalk.green('โ No keys to configure. Bot is ready!'));
|
|
94
|
+
await unlink(manifestPath);
|
|
95
|
+
console.log('');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
// Count providers
|
|
99
|
+
const providers = new Set(manifest.keys.map(k => k.provider.name));
|
|
100
|
+
console.log(chalk.dim(`Found ${manifest.keys.length} key${manifest.keys.length === 1 ? '' : 's'} to configure across ${providers.size} provider${providers.size === 1 ? '' : 's'}.`));
|
|
101
|
+
console.log('');
|
|
102
|
+
// Group keys by category
|
|
103
|
+
const llmKeys = manifest.keys.filter(k => k.type === 'API_KEY' || k.type === 'ENV_VAR');
|
|
104
|
+
const oauthKeys = manifest.keys.filter(k => k.type === 'OAUTH_ACCESS_TOKEN' || k.type === 'OAUTH_REFRESH_TOKEN');
|
|
105
|
+
const serviceKeys = manifest.keys.filter(k => k.type === 'BOT_TOKEN' || k.type === 'AUTH_TOKEN');
|
|
106
|
+
let keyIndex = 0;
|
|
107
|
+
const total = manifest.keys.length;
|
|
108
|
+
// Track providers that were re-authenticated via OAuth
|
|
109
|
+
const reauthedProviders = new Set();
|
|
110
|
+
// โโ LLM Provider Keys โโ
|
|
111
|
+
if (llmKeys.length > 0) {
|
|
112
|
+
console.log(chalk.bold('โโโ LLM Provider Keys โโโ'));
|
|
113
|
+
console.log('');
|
|
114
|
+
for (const key of llmKeys) {
|
|
115
|
+
keyIndex++;
|
|
116
|
+
console.log(chalk.bold(`[${keyIndex}/${total}] ${key.provider.name.toUpperCase()} โ ${key.type === 'ENV_VAR' ? 'Environment Variable' : 'API Key'}`));
|
|
117
|
+
if (key.provider.baseUrl) {
|
|
118
|
+
console.log(chalk.dim(` Provider: ${key.provider.name} (${key.provider.baseUrl})`));
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
console.log(chalk.dim(` Provider: ${key.provider.name}`));
|
|
122
|
+
}
|
|
123
|
+
if (key.models.length > 0) {
|
|
124
|
+
console.log(chalk.dim(` Models: ${key.models.map(m => m.id).join(', ')}`));
|
|
125
|
+
}
|
|
126
|
+
const files = key.found_in.map(f => f.file).join(', ');
|
|
127
|
+
console.log(chalk.dim(` Used in: ${files}`));
|
|
128
|
+
if (key.description) {
|
|
129
|
+
const hintMatch = key.description.match(/starts with ([^ )]+)/);
|
|
130
|
+
if (hintMatch) {
|
|
131
|
+
console.log(chalk.dim(` Hint: Starts with ${hintMatch[1]}`));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const response = await prompts({
|
|
135
|
+
type: 'text',
|
|
136
|
+
name: 'value',
|
|
137
|
+
message: 'Enter value',
|
|
138
|
+
});
|
|
139
|
+
if (!response.value) {
|
|
140
|
+
console.log(chalk.yellow(' โ Skipped'));
|
|
141
|
+
console.log('');
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
// Validate format
|
|
145
|
+
const validator = VALIDATORS[key.provider.name];
|
|
146
|
+
if (validator && !validator(response.value)) {
|
|
147
|
+
const confirmResp = await prompts({
|
|
148
|
+
type: 'confirm',
|
|
149
|
+
name: 'useAnyway',
|
|
150
|
+
message: `Value doesn't match expected format for ${key.provider.name}. Use anyway?`,
|
|
151
|
+
initial: true,
|
|
152
|
+
});
|
|
153
|
+
if (!confirmResp.useAnyway) {
|
|
154
|
+
console.log(chalk.yellow(' โ Skipped'));
|
|
155
|
+
console.log('');
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const replaced = replaceKeyInFiles(targetPath, key.placeholder, response.value, key.found_in);
|
|
160
|
+
console.log(chalk.green(` โ Replaced in ${replaced} file${replaced === 1 ? '' : 's'}`));
|
|
161
|
+
console.log('');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// โโ OAuth Tokens โโ
|
|
165
|
+
if (oauthKeys.length > 0) {
|
|
166
|
+
console.log(chalk.bold('โโโ OAuth Tokens โโโ'));
|
|
167
|
+
console.log('');
|
|
168
|
+
// Group by provider
|
|
169
|
+
const byProvider = new Map();
|
|
170
|
+
for (const key of oauthKeys) {
|
|
171
|
+
const existing = byProvider.get(key.provider.name) || [];
|
|
172
|
+
existing.push(key);
|
|
173
|
+
byProvider.set(key.provider.name, existing);
|
|
174
|
+
}
|
|
175
|
+
for (const [provider, providerKeys] of byProvider) {
|
|
176
|
+
const accessKey = providerKeys.find(k => k.type === 'OAUTH_ACCESS_TOKEN');
|
|
177
|
+
const refreshKey = providerKeys.find(k => k.type === 'OAUTH_REFRESH_TOKEN');
|
|
178
|
+
if (accessKey) {
|
|
179
|
+
keyIndex++;
|
|
180
|
+
console.log(chalk.bold(`[${keyIndex}/${total}] ${provider.toUpperCase()} โ OAuth Access Token`));
|
|
181
|
+
console.log(chalk.dim(` Provider: ${provider}`));
|
|
182
|
+
if (accessKey.models.length > 0) {
|
|
183
|
+
console.log(chalk.dim(` Models: ${accessKey.models.map(m => m.id).join(', ')}`));
|
|
184
|
+
}
|
|
185
|
+
console.log(chalk.yellow(` โ OAuth tokens expire. Recommended: run 'openclaw auth login ${provider}' instead.`));
|
|
186
|
+
const authResponse = await prompts({
|
|
187
|
+
type: 'confirm',
|
|
188
|
+
name: 'reauth',
|
|
189
|
+
message: 'Re-authenticate now?',
|
|
190
|
+
initial: true,
|
|
191
|
+
});
|
|
192
|
+
if (authResponse.reauth) {
|
|
193
|
+
const spinnerAuth = ora({
|
|
194
|
+
text: `Running: openclaw auth login ${provider}...`,
|
|
195
|
+
}).start();
|
|
196
|
+
try {
|
|
197
|
+
await execAsync(`openclaw auth login ${provider}`);
|
|
198
|
+
spinnerAuth.succeed(chalk.green('Authenticated successfully'));
|
|
199
|
+
reauthedProviders.add(provider);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
spinnerAuth.fail(chalk.red('Authentication failed'));
|
|
203
|
+
console.log(chalk.dim(' You can try manually later with:'));
|
|
204
|
+
console.log(chalk.dim(` openclaw auth login ${provider}`));
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
// Manual entry
|
|
209
|
+
const response = await prompts({
|
|
210
|
+
type: 'text',
|
|
211
|
+
name: 'value',
|
|
212
|
+
message: 'Enter access token (or leave empty to skip)',
|
|
213
|
+
});
|
|
214
|
+
if (response.value) {
|
|
215
|
+
const replaced = replaceKeyInFiles(targetPath, accessKey.placeholder, response.value, accessKey.found_in);
|
|
216
|
+
console.log(chalk.green(` โ Replaced in ${replaced} file${replaced === 1 ? '' : 's'}`));
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
console.log(chalk.yellow(' โ Skipped'));
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
console.log('');
|
|
223
|
+
}
|
|
224
|
+
if (refreshKey) {
|
|
225
|
+
keyIndex++;
|
|
226
|
+
if (reauthedProviders.has(provider)) {
|
|
227
|
+
console.log(chalk.bold(`[${keyIndex}/${total}] ${provider.toUpperCase()} โ OAuth Refresh Token`));
|
|
228
|
+
console.log(chalk.green(' โ Handled by re-authentication above'));
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
console.log(chalk.bold(`[${keyIndex}/${total}] ${provider.toUpperCase()} โ OAuth Refresh Token`));
|
|
232
|
+
const response = await prompts({
|
|
233
|
+
type: 'text',
|
|
234
|
+
name: 'value',
|
|
235
|
+
message: 'Enter refresh token (or leave empty to skip)',
|
|
236
|
+
});
|
|
237
|
+
if (response.value) {
|
|
238
|
+
const replaced = replaceKeyInFiles(targetPath, refreshKey.placeholder, response.value, refreshKey.found_in);
|
|
239
|
+
console.log(chalk.green(` โ Replaced in ${replaced} file${replaced === 1 ? '' : 's'}`));
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
console.log(chalk.yellow(' โ Skipped'));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
console.log('');
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// โโ Service Keys โโ
|
|
250
|
+
if (serviceKeys.length > 0) {
|
|
251
|
+
console.log(chalk.bold('โโโ Service Keys โโโ'));
|
|
252
|
+
console.log('');
|
|
253
|
+
for (const key of serviceKeys) {
|
|
254
|
+
keyIndex++;
|
|
255
|
+
const typeLabel = key.type === 'BOT_TOKEN' ? 'Bot Token' : 'Auth Token';
|
|
256
|
+
console.log(chalk.bold(`[${keyIndex}/${total}] ${key.provider.name.toUpperCase()} โ ${typeLabel}`));
|
|
257
|
+
if (key.provider.service) {
|
|
258
|
+
console.log(chalk.dim(` Service: ${key.provider.service}`));
|
|
259
|
+
}
|
|
260
|
+
const files = key.found_in.map(f => f.file).join(', ');
|
|
261
|
+
console.log(chalk.dim(` Used in: ${files}`));
|
|
262
|
+
// Gateway token: offer auto-generation
|
|
263
|
+
if (key.type === 'AUTH_TOKEN' && key.provider.name === 'openclaw-gateway') {
|
|
264
|
+
console.log(chalk.yellow(' โ Auto-generated on setup. Generate new token?'));
|
|
265
|
+
const genResponse = await prompts({
|
|
266
|
+
type: 'confirm',
|
|
267
|
+
name: 'generate',
|
|
268
|
+
message: 'Generate new token?',
|
|
269
|
+
initial: true,
|
|
270
|
+
});
|
|
271
|
+
if (genResponse.generate) {
|
|
272
|
+
const newToken = randomBytes(32).toString('hex');
|
|
273
|
+
const replaced = replaceKeyInFiles(targetPath, key.placeholder, newToken, key.found_in);
|
|
274
|
+
console.log(chalk.green(` โ Generated new gateway token (replaced in ${replaced} file${replaced === 1 ? '' : 's'})`));
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
const response = await prompts({
|
|
278
|
+
type: 'text',
|
|
279
|
+
name: 'value',
|
|
280
|
+
message: 'Enter token value',
|
|
281
|
+
});
|
|
282
|
+
if (response.value) {
|
|
283
|
+
const replaced = replaceKeyInFiles(targetPath, key.placeholder, response.value, key.found_in);
|
|
284
|
+
console.log(chalk.green(` โ Replaced in ${replaced} file${replaced === 1 ? '' : 's'}`));
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
console.log(chalk.yellow(' โ Skipped'));
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
// Regular service key
|
|
293
|
+
if (key.description) {
|
|
294
|
+
const hintMatch = key.description.match(/Format: ([^ )]+)/i);
|
|
295
|
+
if (hintMatch) {
|
|
296
|
+
console.log(chalk.dim(` Hint: ${hintMatch[0]}`));
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
const response = await prompts({
|
|
300
|
+
type: 'text',
|
|
301
|
+
name: 'value',
|
|
302
|
+
message: 'Enter value',
|
|
303
|
+
});
|
|
304
|
+
if (!response.value) {
|
|
305
|
+
console.log(chalk.yellow(' โ Skipped'));
|
|
306
|
+
console.log('');
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
// Validate format
|
|
310
|
+
const validator = VALIDATORS[key.provider.name];
|
|
311
|
+
if (validator && !validator(response.value)) {
|
|
312
|
+
const confirmResp = await prompts({
|
|
313
|
+
type: 'confirm',
|
|
314
|
+
name: 'useAnyway',
|
|
315
|
+
message: `Value doesn't match expected format for ${key.provider.name}. Use anyway?`,
|
|
316
|
+
initial: true,
|
|
317
|
+
});
|
|
318
|
+
if (!confirmResp.useAnyway) {
|
|
319
|
+
console.log(chalk.yellow(' โ Skipped'));
|
|
320
|
+
console.log('');
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
const replaced = replaceKeyInFiles(targetPath, key.placeholder, response.value, key.found_in);
|
|
325
|
+
console.log(chalk.green(` โ Replaced in ${replaced} file${replaced === 1 ? '' : 's'}`));
|
|
326
|
+
}
|
|
327
|
+
console.log('');
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
// Remove KEYS_REQUIRED.json
|
|
331
|
+
console.log(chalk.cyan('๐งน Removing KEYS_REQUIRED.json...'));
|
|
332
|
+
await unlink(manifestPath);
|
|
333
|
+
console.log('');
|
|
334
|
+
// Restart gateway
|
|
335
|
+
const spinnerRestart = ora({
|
|
336
|
+
text: 'Restarting gateway...',
|
|
337
|
+
prefixText: chalk.cyan('๐'),
|
|
338
|
+
}).start();
|
|
339
|
+
try {
|
|
340
|
+
await execAsync('systemctl restart openclaw-gateway');
|
|
341
|
+
spinnerRestart.succeed(chalk.green('Gateway restarted'));
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
try {
|
|
345
|
+
await execAsync('pm2 restart openclaw-gateway');
|
|
346
|
+
spinnerRestart.succeed(chalk.green('Gateway restarted'));
|
|
347
|
+
}
|
|
348
|
+
catch {
|
|
349
|
+
spinnerRestart.warn(chalk.yellow('Could not restart gateway automatically. Please restart manually.'));
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
console.log('');
|
|
353
|
+
console.log(chalk.green('โ
All API keys configured!'));
|
|
354
|
+
// Show model context if available
|
|
355
|
+
if (manifest.model_context) {
|
|
356
|
+
const mc = manifest.model_context;
|
|
357
|
+
console.log('');
|
|
358
|
+
if (mc.primary_model) {
|
|
359
|
+
console.log(chalk.dim(` Primary: ${mc.primary_model}`));
|
|
360
|
+
}
|
|
361
|
+
if (mc.fallback_models.length > 0) {
|
|
362
|
+
const shown = mc.fallback_models.slice(0, 3).join(', ');
|
|
363
|
+
const extra = mc.fallback_models.length > 3 ? `, +${mc.fallback_models.length - 3} more` : '';
|
|
364
|
+
console.log(chalk.dim(` Fallbacks: ${shown}${extra}`));
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
console.log('');
|
|
368
|
+
}
|
|
369
|
+
catch (err) {
|
|
370
|
+
if (err instanceof Error) {
|
|
371
|
+
console.error(chalk.red(`\nโ Error: ${err.message}`));
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
console.error(chalk.red('\nโ An unexpected error occurred.'));
|
|
375
|
+
}
|
|
376
|
+
process.exit(1);
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=setup-keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-keys.js","sourceRoot":"","sources":["../../src/commands/setup-keys.ts"],"names":[],"mappings":"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"}
|