@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.
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export default function registerDownload(program: Command): void;
@@ -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":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export default function registerSetupKeys(program: Command): void;
@@ -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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"}