plazbot-cli 0.2.26 → 0.3.2
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/CLAUDE.md +34 -5
- package/README.md +21 -0
- package/dist/cli.js +32 -20
- package/dist/commands/agent/ai-config.js +98 -50
- package/dist/commands/agent/chat.js +80 -74
- package/dist/commands/agent/copy.js +23 -21
- package/dist/commands/agent/create.js +42 -72
- package/dist/commands/agent/delete.js +29 -30
- package/dist/commands/agent/enable-widget.js +30 -26
- package/dist/commands/agent/export.js +90 -77
- package/dist/commands/agent/files.js +68 -60
- package/dist/commands/agent/get.js +101 -87
- package/dist/commands/agent/index.js +53 -39
- package/dist/commands/agent/list.js +26 -24
- package/dist/commands/agent/monitor.js +91 -86
- package/dist/commands/agent/on-message.js +40 -37
- package/dist/commands/agent/set.js +62 -59
- package/dist/commands/agent/templates.js +109 -108
- package/dist/commands/agent/tools.js +64 -65
- package/dist/commands/agent/update.js +28 -27
- package/dist/commands/agent/validate.js +127 -0
- package/dist/commands/agent/wizard.js +152 -159
- package/dist/commands/auth/index.js +7 -10
- package/dist/commands/auth/login.js +50 -37
- package/dist/commands/auth/logout.js +16 -14
- package/dist/commands/auth/status.js +19 -16
- package/dist/commands/portal/add-agent.js +26 -24
- package/dist/commands/portal/add-link.js +21 -17
- package/dist/commands/portal/clear-links.js +17 -15
- package/dist/commands/portal/create.js +25 -21
- package/dist/commands/portal/delete.js +31 -30
- package/dist/commands/portal/get.js +33 -31
- package/dist/commands/portal/index.js +30 -22
- package/dist/commands/portal/list.js +34 -30
- package/dist/commands/portal/update.js +41 -33
- package/dist/commands/whatsapp/broadcast.js +40 -37
- package/dist/commands/whatsapp/channels.js +40 -34
- package/dist/commands/whatsapp/chat.js +33 -32
- package/dist/commands/whatsapp/connect.js +53 -52
- package/dist/commands/whatsapp/delete-webhook.js +19 -17
- package/dist/commands/whatsapp/index.js +35 -25
- package/dist/commands/whatsapp/register-webhook.js +21 -19
- package/dist/commands/whatsapp/send-template.js +39 -31
- package/dist/commands/whatsapp/send.js +27 -23
- package/dist/commands/whatsapp/widget.js +35 -31
- package/dist/commands/workers/deploy.js +49 -44
- package/dist/commands/workers/index.js +28 -18
- package/dist/commands/workers/list.js +43 -35
- package/dist/commands/workers/logs.js +38 -32
- package/dist/commands/workers/remove.js +38 -37
- package/dist/commands/workers/secret.js +63 -58
- package/dist/commands/workers/test.js +44 -36
- package/dist/schemas/agent.config.schema.json +569 -0
- package/dist/studio/api/sseClient.js +97 -0
- package/dist/studio/api/studioApi.js +25 -0
- package/dist/studio/api/types.js +16 -0
- package/dist/studio/components/AgentPanel.js +35 -0
- package/dist/studio/components/App.js +214 -0
- package/dist/studio/components/ChatLog.js +59 -0
- package/dist/studio/components/Footer.js +11 -0
- package/dist/studio/components/Header.js +8 -0
- package/dist/studio/components/Input.js +15 -0
- package/dist/studio/components/Message.js +56 -0
- package/dist/studio/components/Suggestions.js +11 -0
- package/dist/studio/components/ToolCall.js +33 -0
- package/dist/studio/components/WhatsappConnectCard.js +57 -0
- package/dist/studio/index.js +42 -0
- package/dist/studio/render/json.js +16 -0
- package/dist/studio/render/markdown.js +86 -0
- package/dist/studio/render/steps.js +58 -0
- package/dist/studio/runOneShot.js +96 -0
- package/dist/studio/runRepl.js +52 -0
- package/dist/studio/slash/handlers.js +199 -0
- package/dist/studio/slash/parser.js +46 -0
- package/dist/studio/slash/registry.js +16 -0
- package/dist/studio/state/store.js +181 -0
- package/dist/studio/whatsapp/api.js +63 -0
- package/dist/studio/whatsapp/polling.js +77 -0
- package/dist/studio/whatsapp/types.js +31 -0
- package/dist/types/agent.js +1 -2
- package/dist/types/auth.js +1 -2
- package/dist/types/common.js +1 -2
- package/dist/types/message.js +1 -2
- package/dist/types/portal.js +1 -2
- package/dist/types/workers.js +1 -2
- package/dist/utils/agent-errors.js +46 -0
- package/dist/utils/api.js +8 -9
- package/dist/utils/banner.js +33 -34
- package/dist/utils/credentials.js +12 -20
- package/dist/utils/help.js +44 -0
- package/dist/utils/logger.js +13 -19
- package/dist/utils/ui.js +35 -49
- package/package.json +22 -10
- package/src/cli.ts +24 -8
- package/src/commands/agent/ai-config.ts +89 -34
- package/src/commands/agent/chat.ts +49 -37
- package/src/commands/agent/copy.ts +19 -13
- package/src/commands/agent/create.ts +32 -22
- package/src/commands/agent/delete.ts +24 -18
- package/src/commands/agent/enable-widget.ts +31 -23
- package/src/commands/agent/export.ts +72 -51
- package/src/commands/agent/files.ts +51 -39
- package/src/commands/agent/get.ts +86 -66
- package/src/commands/agent/index.ts +36 -18
- package/src/commands/agent/list.ts +22 -16
- package/src/commands/agent/monitor.ts +67 -56
- package/src/commands/agent/on-message.ts +36 -27
- package/src/commands/agent/set.ts +47 -37
- package/src/commands/agent/templates.ts +90 -82
- package/src/commands/agent/tools.ts +53 -47
- package/src/commands/agent/update.ts +28 -20
- package/src/commands/agent/validate.ts +135 -0
- package/src/commands/agent/wizard.ts +114 -114
- package/src/commands/auth/index.ts +3 -3
- package/src/commands/auth/login.ts +44 -29
- package/src/commands/auth/logout.ts +16 -10
- package/src/commands/auth/status.ts +14 -8
- package/src/commands/portal/add-agent.ts +23 -17
- package/src/commands/portal/add-link.ts +17 -9
- package/src/commands/portal/clear-links.ts +13 -7
- package/src/commands/portal/create.ts +20 -12
- package/src/commands/portal/delete.ts +28 -20
- package/src/commands/portal/get.ts +25 -19
- package/src/commands/portal/index.ts +22 -10
- package/src/commands/portal/list.ts +27 -19
- package/src/commands/portal/update.ts +38 -26
- package/src/commands/whatsapp/broadcast.ts +28 -18
- package/src/commands/whatsapp/channels.ts +31 -20
- package/src/commands/whatsapp/chat.ts +20 -12
- package/src/commands/whatsapp/connect.ts +39 -31
- package/src/commands/whatsapp/delete-webhook.ts +15 -9
- package/src/commands/whatsapp/index.ts +24 -10
- package/src/commands/whatsapp/register-webhook.ts +16 -10
- package/src/commands/whatsapp/send-template.ts +33 -21
- package/src/commands/whatsapp/send.ts +23 -15
- package/src/commands/whatsapp/widget.ts +25 -17
- package/src/commands/workers/deploy.ts +34 -22
- package/src/commands/workers/index.ts +21 -7
- package/src/commands/workers/list.ts +31 -19
- package/src/commands/workers/logs.ts +30 -20
- package/src/commands/workers/remove.ts +30 -22
- package/src/commands/workers/secret.ts +46 -34
- package/src/commands/workers/test.ts +34 -22
- package/src/schemas/agent.config.schema.json +569 -0
- package/src/studio/api/sseClient.ts +91 -0
- package/src/studio/api/studioApi.ts +27 -0
- package/src/studio/api/types.ts +96 -0
- package/src/studio/components/App.tsx +266 -0
- package/src/studio/components/ChatLog.tsx +95 -0
- package/src/studio/components/Footer.tsx +38 -0
- package/src/studio/components/Header.tsx +39 -0
- package/src/studio/components/Input.tsx +32 -0
- package/src/studio/components/Message.tsx +87 -0
- package/src/studio/components/Suggestions.tsx +26 -0
- package/src/studio/components/ToolCall.tsx +58 -0
- package/src/studio/components/WhatsappConnectCard.tsx +139 -0
- package/src/studio/index.ts +58 -0
- package/src/studio/render/markdown.ts +93 -0
- package/src/studio/render/steps.ts +57 -0
- package/src/studio/runOneShot.ts +114 -0
- package/src/studio/runRepl.tsx +76 -0
- package/src/studio/slash/handlers.ts +226 -0
- package/src/studio/slash/parser.ts +41 -0
- package/src/studio/slash/registry.ts +54 -0
- package/src/studio/state/store.ts +273 -0
- package/src/studio/whatsapp/api.ts +96 -0
- package/src/studio/whatsapp/polling.ts +93 -0
- package/src/studio/whatsapp/types.ts +80 -0
- package/src/types/agent.ts +1 -1
- package/src/types/auth.ts +4 -3
- package/src/types/portal.ts +1 -1
- package/src/types/workers.ts +1 -1
- package/src/utils/agent-errors.ts +67 -0
- package/src/utils/api.ts +6 -0
- package/src/utils/banner.ts +14 -9
- package/src/utils/credentials.ts +6 -5
- package/src/utils/help.ts +51 -0
- package/tsconfig.json +9 -6
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import { Agent } from 'plazbot';
|
|
3
|
-
import { getStoredCredentials } from '../../utils/credentials';
|
|
4
|
-
import { logger } from '../../utils/logger';
|
|
5
|
-
import {
|
|
3
|
+
import { getStoredCredentials } from '../../utils/credentials.js';
|
|
4
|
+
import { logger } from '../../utils/logger.js';
|
|
5
|
+
import { addExamples } from '../../utils/help.js';
|
|
6
|
+
import { createSpinner } from '../../utils/ui.js';
|
|
6
7
|
import chalk from 'chalk';
|
|
7
8
|
import fs from 'fs';
|
|
8
9
|
import path from 'path';
|
|
@@ -173,14 +174,14 @@ function cleanAgentForExport(agentData: any): any {
|
|
|
173
174
|
}
|
|
174
175
|
|
|
175
176
|
export const exportCommand = new Command('export')
|
|
176
|
-
.description('
|
|
177
|
-
.argument('<agentId>', 'ID
|
|
178
|
-
.option('-w, --workspace <id>', '
|
|
179
|
-
.option('-z, --zone <zone>', '
|
|
180
|
-
.option('-o, --output <path>', '
|
|
181
|
-
.option('--no-channels', '
|
|
182
|
-
.option('--no-ai', '
|
|
183
|
-
.option('--dev', '
|
|
177
|
+
.description('Export a clean agent configuration (compatible with import)')
|
|
178
|
+
.argument('<agentId>', 'Agent ID to export')
|
|
179
|
+
.option('-w, --workspace <id>', 'Source workspace ID (overrides local config)')
|
|
180
|
+
.option('-z, --zone <zone>', 'Zone LA or EU (overrides local config)')
|
|
181
|
+
.option('-o, --output <path>', 'Output file path (.json)')
|
|
182
|
+
.option('--no-channels', 'Exclude channels from export')
|
|
183
|
+
.option('--no-ai', 'Exclude custom AI configuration')
|
|
184
|
+
.option('--dev', 'Use development environment', false)
|
|
184
185
|
.action(async (agentId: string, options: {
|
|
185
186
|
workspace?: string;
|
|
186
187
|
zone?: string;
|
|
@@ -196,7 +197,7 @@ export const exportCommand = new Command('export')
|
|
|
196
197
|
const effectiveZone = (options.zone?.toUpperCase() === 'EU' ? 'EU' : options.zone?.toUpperCase() === 'LA' ? 'LA' : credentials.zone) as 'LA' | 'EU';
|
|
197
198
|
|
|
198
199
|
if (options.workspace || options.zone) {
|
|
199
|
-
console.log(chalk.hex('#FFA726')(`\n
|
|
200
|
+
console.log(chalk.hex('#FFA726')(`\n Support mode: workspace=${effectiveWorkspace} zone=${effectiveZone}`));
|
|
200
201
|
}
|
|
201
202
|
|
|
202
203
|
const agent = new Agent({
|
|
@@ -206,13 +207,13 @@ export const exportCommand = new Command('export')
|
|
|
206
207
|
...(options.dev && { customUrl: 'http://localhost:5090' }),
|
|
207
208
|
});
|
|
208
209
|
|
|
209
|
-
const spinner = createSpinner('
|
|
210
|
+
const spinner = createSpinner('Fetching agent...');
|
|
210
211
|
spinner.start();
|
|
211
212
|
|
|
212
213
|
const response: any = await agent.getAgentById({ id: agentId });
|
|
213
214
|
const agentData = response.agent || response.data || response;
|
|
214
215
|
|
|
215
|
-
spinner.succeed('
|
|
216
|
+
spinner.succeed('Agent fetched');
|
|
216
217
|
|
|
217
218
|
// Limpiar para exportacion
|
|
218
219
|
const cleaned = cleanAgentForExport(agentData);
|
|
@@ -233,35 +234,46 @@ export const exportCommand = new Command('export')
|
|
|
233
234
|
if (options.output) {
|
|
234
235
|
const outputPath = path.resolve(options.output);
|
|
235
236
|
fs.writeFileSync(outputPath, jsonOutput, 'utf-8');
|
|
236
|
-
console.log(chalk.hex('#4ade80')(`\n
|
|
237
|
+
console.log(chalk.hex('#4ade80')(`\n Exported to: ${outputPath}`));
|
|
237
238
|
} else {
|
|
238
239
|
console.log();
|
|
239
240
|
console.log(jsonOutput);
|
|
240
241
|
}
|
|
241
242
|
|
|
242
243
|
console.log();
|
|
243
|
-
console.log(chalk.gray('
|
|
244
|
-
console.log(chalk.gray(' - plazbot agent create <
|
|
245
|
-
console.log(chalk.gray(' -
|
|
244
|
+
console.log(chalk.gray(' This JSON is compatible with:'));
|
|
245
|
+
console.log(chalk.gray(' - plazbot agent create <file.json>'));
|
|
246
|
+
console.log(chalk.gray(' - Importing JSON in the platform (AgentTraining)'));
|
|
246
247
|
console.log();
|
|
247
248
|
|
|
248
249
|
} catch (error) {
|
|
249
|
-
const message = error instanceof Error ? error.message : '
|
|
250
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
250
251
|
logger.error(message);
|
|
251
252
|
process.exit(1);
|
|
252
253
|
}
|
|
253
254
|
});
|
|
254
255
|
|
|
256
|
+
addExamples(exportCommand, [
|
|
257
|
+
{ description: 'Print the cleaned JSON to stdout',
|
|
258
|
+
command: 'plazbot agent export agt_AbcDef123' },
|
|
259
|
+
{ description: 'Write the cleaned JSON to a file',
|
|
260
|
+
command: 'plazbot agent export agt_AbcDef123 -o ./agent.json' },
|
|
261
|
+
{ description: 'Export without channels nor AI credentials (portable JSON)',
|
|
262
|
+
command: 'plazbot agent export agt_AbcDef123 -o ./agent.json --no-channels --no-ai' },
|
|
263
|
+
{ description: 'Export from a different workspace (support mode)',
|
|
264
|
+
command: 'plazbot agent export agt_AbcDef123 -w wok_Other123 -z LA -o ./agent.json' },
|
|
265
|
+
]);
|
|
266
|
+
|
|
255
267
|
export const crossCopyCommand = new Command('cross-copy')
|
|
256
|
-
.description('
|
|
257
|
-
.argument('<agentId>', 'ID
|
|
258
|
-
.requiredOption('--from-workspace <id>', '
|
|
259
|
-
.requiredOption('--to-workspace <id>', '
|
|
260
|
-
.option('--from-zone <zone>', '
|
|
261
|
-
.option('--to-zone <zone>', '
|
|
262
|
-
.option('--no-channels', '
|
|
263
|
-
.option('--no-ai', '
|
|
264
|
-
.option('--dev', '
|
|
268
|
+
.description('Copy an agent from one workspace to another')
|
|
269
|
+
.argument('<agentId>', 'Agent ID to copy')
|
|
270
|
+
.requiredOption('--from-workspace <id>', 'Source workspace ID')
|
|
271
|
+
.requiredOption('--to-workspace <id>', 'Target workspace ID')
|
|
272
|
+
.option('--from-zone <zone>', 'Source workspace zone (LA or EU)', 'LA')
|
|
273
|
+
.option('--to-zone <zone>', 'Target workspace zone (LA or EU)', 'LA')
|
|
274
|
+
.option('--no-channels', 'Do not copy channels (recommended)')
|
|
275
|
+
.option('--no-ai', 'Do not copy custom AI configuration')
|
|
276
|
+
.option('--dev', 'Use development environment', false)
|
|
265
277
|
.action(async (agentId: string, options: {
|
|
266
278
|
fromWorkspace: string;
|
|
267
279
|
toWorkspace: string;
|
|
@@ -278,16 +290,16 @@ export const crossCopyCommand = new Command('cross-copy')
|
|
|
278
290
|
|
|
279
291
|
console.log();
|
|
280
292
|
console.log(chalk.hex('#4CAF50')(' ┌' + '─'.repeat(58) + '┐'));
|
|
281
|
-
console.log(chalk.hex('#4CAF50')(' │') + chalk.bold('
|
|
293
|
+
console.log(chalk.hex('#4CAF50')(' │') + chalk.bold(' Copy agent between workspaces').padEnd(68) + chalk.hex('#4CAF50')('│'));
|
|
282
294
|
console.log(chalk.hex('#4CAF50')(' └' + '─'.repeat(58) + '┘'));
|
|
283
295
|
console.log();
|
|
284
|
-
console.log(chalk.gray(`
|
|
285
|
-
console.log(chalk.gray(`
|
|
286
|
-
console.log(chalk.gray(`
|
|
296
|
+
console.log(chalk.gray(` Source: ${options.fromWorkspace} (${fromZone})`));
|
|
297
|
+
console.log(chalk.gray(` Target: ${options.toWorkspace} (${toZone})`));
|
|
298
|
+
console.log(chalk.gray(` Agent: ${agentId}`));
|
|
287
299
|
console.log();
|
|
288
300
|
|
|
289
301
|
// 1. Obtener agente del workspace origen
|
|
290
|
-
const spinnerGet = createSpinner('
|
|
302
|
+
const spinnerGet = createSpinner('Fetching agent from source workspace...');
|
|
291
303
|
spinnerGet.start();
|
|
292
304
|
|
|
293
305
|
const sourceAgent = new Agent({
|
|
@@ -301,11 +313,11 @@ export const crossCopyCommand = new Command('cross-copy')
|
|
|
301
313
|
const agentData = response.agent || response.data || response;
|
|
302
314
|
|
|
303
315
|
if (!agentData || !agentData.name) {
|
|
304
|
-
spinnerGet.fail('
|
|
316
|
+
spinnerGet.fail('Agent not found in source workspace');
|
|
305
317
|
process.exit(1);
|
|
306
318
|
}
|
|
307
319
|
|
|
308
|
-
spinnerGet.succeed(`
|
|
320
|
+
spinnerGet.succeed(`Agent fetched: ${agentData.name}`);
|
|
309
321
|
|
|
310
322
|
// 2. Limpiar JSON
|
|
311
323
|
const cleaned = cleanAgentForExport(agentData);
|
|
@@ -329,29 +341,29 @@ export const crossCopyCommand = new Command('cross-copy')
|
|
|
329
341
|
|
|
330
342
|
// 3. Mostrar resumen
|
|
331
343
|
console.log();
|
|
332
|
-
console.log(chalk.bold('
|
|
333
|
-
console.log(chalk.gray(`
|
|
334
|
-
console.log(chalk.gray(`
|
|
335
|
-
console.log(chalk.gray(`
|
|
336
|
-
console.log(chalk.gray(`
|
|
337
|
-
console.log(chalk.gray(`
|
|
338
|
-
console.log(chalk.gray(` AI
|
|
344
|
+
console.log(chalk.bold(' Configuration to copy:'));
|
|
345
|
+
console.log(chalk.gray(` Name: ${cleaned.name}`));
|
|
346
|
+
console.log(chalk.gray(` Target zone: ${cleaned.zone}`));
|
|
347
|
+
console.log(chalk.gray(` Channels: ${cleaned.channels?.length || 0}`));
|
|
348
|
+
console.log(chalk.gray(` Services: ${cleaned.services?.length || 0}`));
|
|
349
|
+
console.log(chalk.gray(` Actions: ${cleaned.actions?.length || 0}`));
|
|
350
|
+
console.log(chalk.gray(` Custom AI: ${cleaned.customAIConfig ? 'Yes' : 'No'}`));
|
|
339
351
|
console.log();
|
|
340
352
|
|
|
341
353
|
const { confirm } = await (inquirer as any).prompt([{
|
|
342
354
|
type: 'confirm',
|
|
343
355
|
name: 'confirm',
|
|
344
|
-
message: '
|
|
356
|
+
message: 'Create this agent in the target workspace?',
|
|
345
357
|
default: true,
|
|
346
358
|
}]);
|
|
347
359
|
|
|
348
360
|
if (!confirm) {
|
|
349
|
-
console.log(chalk.gray('
|
|
361
|
+
console.log(chalk.gray(' Operation cancelled.'));
|
|
350
362
|
return;
|
|
351
363
|
}
|
|
352
364
|
|
|
353
365
|
// 4. Crear en workspace destino
|
|
354
|
-
const spinnerCreate = createSpinner('
|
|
366
|
+
const spinnerCreate = createSpinner('Creating agent in target workspace...');
|
|
355
367
|
spinnerCreate.start();
|
|
356
368
|
|
|
357
369
|
const targetAgent = new Agent({
|
|
@@ -364,24 +376,33 @@ export const crossCopyCommand = new Command('cross-copy')
|
|
|
364
376
|
const result: any = await targetAgent.addAgent(cleaned);
|
|
365
377
|
|
|
366
378
|
if (result?.success === false) {
|
|
367
|
-
spinnerCreate.fail(`Error: ${result.message || '
|
|
379
|
+
spinnerCreate.fail(`Error: ${result.message || 'Could not create the agent'}`);
|
|
368
380
|
process.exit(1);
|
|
369
381
|
}
|
|
370
382
|
|
|
371
383
|
const newId = result?.agentId || result?.id || result?.data?.agentId;
|
|
372
|
-
spinnerCreate.succeed('
|
|
384
|
+
spinnerCreate.succeed('Agent created successfully');
|
|
373
385
|
|
|
374
386
|
console.log();
|
|
375
387
|
if (newId) {
|
|
376
|
-
console.log(chalk.hex('#4ade80')(`
|
|
388
|
+
console.log(chalk.hex('#4ade80')(` New ID: ${newId}`));
|
|
377
389
|
}
|
|
378
|
-
console.log(chalk.gray(' Widget
|
|
379
|
-
console.log(chalk.gray('
|
|
390
|
+
console.log(chalk.gray(' Widget disabled by default.'));
|
|
391
|
+
console.log(chalk.gray(' Channels must be configured manually in the target workspace.'));
|
|
380
392
|
console.log();
|
|
381
393
|
|
|
382
394
|
} catch (error) {
|
|
383
|
-
const message = error instanceof Error ? error.message : '
|
|
395
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
384
396
|
logger.error(message);
|
|
385
397
|
process.exit(1);
|
|
386
398
|
}
|
|
387
399
|
});
|
|
400
|
+
|
|
401
|
+
addExamples(crossCopyCommand, [
|
|
402
|
+
{ description: 'Copy an agent between two LA workspaces (skip channels)',
|
|
403
|
+
command: 'plazbot agent cross-copy agt_AbcDef123 --from-workspace wok_Source123 --to-workspace wok_Target456' },
|
|
404
|
+
{ description: 'Copy across zones (LA → EU)',
|
|
405
|
+
command: 'plazbot agent cross-copy agt_AbcDef123 --from-workspace wok_Source123 --from-zone LA --to-workspace wok_Target456 --to-zone EU' },
|
|
406
|
+
{ description: 'Copy preserving channels and AI providers',
|
|
407
|
+
command: 'plazbot agent cross-copy agt_AbcDef123 --from-workspace wok_Source123 --to-workspace wok_Target456 --channels --ai' },
|
|
408
|
+
]);
|
|
@@ -1,18 +1,30 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import { Agent } from 'plazbot';
|
|
3
|
-
import { getStoredCredentials } from '../../utils/credentials';
|
|
4
|
-
import { logger } from '../../utils/logger';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
3
|
+
import { getStoredCredentials } from '../../utils/credentials.js';
|
|
4
|
+
import { logger } from '../../utils/logger.js';
|
|
5
|
+
import { addExamples } from '../../utils/help.js';
|
|
6
|
+
import { createSpinner, createTable, theme, section, statusBadge } from '../../utils/ui.js';
|
|
7
|
+
import { AgentCommandOptions } from '../../types/agent.js';
|
|
7
8
|
|
|
8
9
|
const filesGroup = new Command('files')
|
|
9
|
-
.description('
|
|
10
|
+
.description('Manage files in the agent knowledge base');
|
|
11
|
+
|
|
12
|
+
addExamples(filesGroup, [
|
|
13
|
+
{ description: 'List the knowledge-base files of an agent',
|
|
14
|
+
command: 'plazbot agent files list agt_AbcDef123' },
|
|
15
|
+
{ description: 'Add a remote PDF/DOC to the knowledge base',
|
|
16
|
+
command: 'plazbot agent files add agt_AbcDef123 -u https://files.example.com/manual.pdf -r manual -t docs,onboarding' },
|
|
17
|
+
{ description: 'Check whether a file finished processing',
|
|
18
|
+
command: 'plazbot agent files status file_AbcDef123' },
|
|
19
|
+
{ description: 'Remove a file from the knowledge base',
|
|
20
|
+
command: 'plazbot agent files delete agt_AbcDef123 file_AbcDef123' },
|
|
21
|
+
]);
|
|
10
22
|
|
|
11
23
|
// Listar archivos
|
|
12
24
|
filesGroup.command('list')
|
|
13
|
-
.description('
|
|
14
|
-
.argument('<agentId>', 'ID
|
|
15
|
-
.option('--dev', '
|
|
25
|
+
.description('List agent files')
|
|
26
|
+
.argument('<agentId>', 'Agent ID')
|
|
27
|
+
.option('--dev', 'Use development environment', false)
|
|
16
28
|
.action(async (agentId: string, options: AgentCommandOptions) => {
|
|
17
29
|
try {
|
|
18
30
|
const credentials = await getStoredCredentials();
|
|
@@ -23,31 +35,31 @@ filesGroup.command('list')
|
|
|
23
35
|
...(options.dev && { customUrl: "http://localhost:5090" })
|
|
24
36
|
});
|
|
25
37
|
|
|
26
|
-
const spinner = createSpinner('
|
|
38
|
+
const spinner = createSpinner('Loading files...');
|
|
27
39
|
spinner.start();
|
|
28
40
|
const _res: any = await agent.getAgentById({ id: agentId });
|
|
29
41
|
const agentData = _res.agent || _res.data || _res;
|
|
30
42
|
spinner.stop();
|
|
31
43
|
|
|
32
44
|
const files = (agentData as any).files || [];
|
|
33
|
-
console.log(section('
|
|
45
|
+
console.log(section('Files - ' + (agentData.name || agentId)));
|
|
34
46
|
|
|
35
47
|
if (files.length === 0) {
|
|
36
|
-
console.log(theme.muted('\n No
|
|
37
|
-
console.log(theme.muted('
|
|
48
|
+
console.log(theme.muted('\n No files in the knowledge base'));
|
|
49
|
+
console.log(theme.muted(' Use: plazbot agent files add <agentId> --url <url>\n'));
|
|
38
50
|
return;
|
|
39
51
|
}
|
|
40
52
|
|
|
41
53
|
const rows = files.map((f: any) => [
|
|
42
54
|
f.fileId || f.id || 'N/A',
|
|
43
|
-
f.name || f.reference || '
|
|
55
|
+
f.name || f.reference || 'Untitled',
|
|
44
56
|
(f.tags || []).join(', ') || '-',
|
|
45
57
|
]);
|
|
46
58
|
|
|
47
|
-
console.log(createTable(['ID', '
|
|
59
|
+
console.log(createTable(['ID', 'Name', 'Tags'], rows));
|
|
48
60
|
|
|
49
61
|
} catch (error) {
|
|
50
|
-
const message = error instanceof Error ? error.message : '
|
|
62
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
51
63
|
logger.error(message);
|
|
52
64
|
process.exit(1);
|
|
53
65
|
}
|
|
@@ -55,12 +67,12 @@ filesGroup.command('list')
|
|
|
55
67
|
|
|
56
68
|
// Agregar archivo
|
|
57
69
|
filesGroup.command('add')
|
|
58
|
-
.description('
|
|
59
|
-
.argument('<agentId>', 'ID
|
|
60
|
-
.requiredOption('-u, --url <url>', 'URL
|
|
61
|
-
.option('-r, --reference <name>', '
|
|
62
|
-
.option('-t, --tags <tags>', '
|
|
63
|
-
.option('--dev', '
|
|
70
|
+
.description('Add a file to the knowledge base')
|
|
71
|
+
.argument('<agentId>', 'Agent ID')
|
|
72
|
+
.requiredOption('-u, --url <url>', 'File URL (PDF, DOC, DOCX)')
|
|
73
|
+
.option('-r, --reference <name>', 'Reference name', 'documento')
|
|
74
|
+
.option('-t, --tags <tags>', 'Comma-separated tags', '')
|
|
75
|
+
.option('--dev', 'Use development environment', false)
|
|
64
76
|
.action(async (agentId: string, options: any) => {
|
|
65
77
|
try {
|
|
66
78
|
const credentials = await getStoredCredentials();
|
|
@@ -71,7 +83,7 @@ filesGroup.command('add')
|
|
|
71
83
|
...(options.dev && { customUrl: "http://localhost:5090" })
|
|
72
84
|
});
|
|
73
85
|
|
|
74
|
-
const spinner = createSpinner('
|
|
86
|
+
const spinner = createSpinner('Uploading file...');
|
|
75
87
|
spinner.start();
|
|
76
88
|
|
|
77
89
|
const tags = options.tags ? options.tags.split(',').map((t: string) => t.trim()) : [];
|
|
@@ -82,16 +94,16 @@ filesGroup.command('add')
|
|
|
82
94
|
tags,
|
|
83
95
|
});
|
|
84
96
|
|
|
85
|
-
spinner.succeed('
|
|
97
|
+
spinner.succeed('File added');
|
|
86
98
|
|
|
87
99
|
if (result?.fileId) {
|
|
88
100
|
logger.label('File ID', result.fileId);
|
|
89
|
-
logger.dim('
|
|
101
|
+
logger.dim('The file is being processed. Check status with:');
|
|
90
102
|
logger.dim(`plazbot agent files status ${result.fileId}`);
|
|
91
103
|
}
|
|
92
104
|
|
|
93
105
|
} catch (error) {
|
|
94
|
-
const message = error instanceof Error ? error.message : '
|
|
106
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
95
107
|
logger.error(message);
|
|
96
108
|
process.exit(1);
|
|
97
109
|
}
|
|
@@ -99,9 +111,9 @@ filesGroup.command('add')
|
|
|
99
111
|
|
|
100
112
|
// Verificar estado
|
|
101
113
|
filesGroup.command('status')
|
|
102
|
-
.description('
|
|
103
|
-
.argument('<fileId>', 'ID
|
|
104
|
-
.option('--dev', '
|
|
114
|
+
.description('Check the processing status of a file')
|
|
115
|
+
.argument('<fileId>', 'File ID')
|
|
116
|
+
.option('--dev', 'Use development environment', false)
|
|
105
117
|
.action(async (fileId: string, options: AgentCommandOptions) => {
|
|
106
118
|
try {
|
|
107
119
|
const credentials = await getStoredCredentials();
|
|
@@ -112,17 +124,17 @@ filesGroup.command('status')
|
|
|
112
124
|
...(options.dev && { customUrl: "http://localhost:5090" })
|
|
113
125
|
});
|
|
114
126
|
|
|
115
|
-
const spinner = createSpinner('
|
|
127
|
+
const spinner = createSpinner('Checking...');
|
|
116
128
|
spinner.start();
|
|
117
129
|
const result = await agent.validateFile({ fileId });
|
|
118
130
|
spinner.stop();
|
|
119
131
|
|
|
120
|
-
logger.title('
|
|
132
|
+
logger.title('File status');
|
|
121
133
|
logger.label('File ID', fileId);
|
|
122
|
-
logger.label('
|
|
134
|
+
logger.label('Status', result?.status ? 'Completed' : 'Processing');
|
|
123
135
|
|
|
124
136
|
} catch (error) {
|
|
125
|
-
const message = error instanceof Error ? error.message : '
|
|
137
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
126
138
|
logger.error(message);
|
|
127
139
|
process.exit(1);
|
|
128
140
|
}
|
|
@@ -130,10 +142,10 @@ filesGroup.command('status')
|
|
|
130
142
|
|
|
131
143
|
// Eliminar archivo
|
|
132
144
|
filesGroup.command('delete')
|
|
133
|
-
.description('
|
|
134
|
-
.argument('<agentId>', 'ID
|
|
135
|
-
.argument('<fileId>', 'ID
|
|
136
|
-
.option('--dev', '
|
|
145
|
+
.description('Delete a file from the knowledge base')
|
|
146
|
+
.argument('<agentId>', 'Agent ID')
|
|
147
|
+
.argument('<fileId>', 'File ID')
|
|
148
|
+
.option('--dev', 'Use development environment', false)
|
|
137
149
|
.action(async (agentId: string, fileId: string, options: AgentCommandOptions) => {
|
|
138
150
|
try {
|
|
139
151
|
const credentials = await getStoredCredentials();
|
|
@@ -144,13 +156,13 @@ filesGroup.command('delete')
|
|
|
144
156
|
...(options.dev && { customUrl: "http://localhost:5090" })
|
|
145
157
|
});
|
|
146
158
|
|
|
147
|
-
const spinner = createSpinner('
|
|
159
|
+
const spinner = createSpinner('Deleting file...');
|
|
148
160
|
spinner.start();
|
|
149
161
|
await agent.deleteFile({ fileId, agentId });
|
|
150
|
-
spinner.succeed('
|
|
162
|
+
spinner.succeed('File deleted');
|
|
151
163
|
|
|
152
164
|
} catch (error) {
|
|
153
|
-
const message = error instanceof Error ? error.message : '
|
|
165
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
154
166
|
logger.error(message);
|
|
155
167
|
process.exit(1);
|
|
156
168
|
}
|