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.
Files changed (178) hide show
  1. package/CLAUDE.md +34 -5
  2. package/README.md +21 -0
  3. package/dist/cli.js +32 -20
  4. package/dist/commands/agent/ai-config.js +98 -50
  5. package/dist/commands/agent/chat.js +80 -74
  6. package/dist/commands/agent/copy.js +23 -21
  7. package/dist/commands/agent/create.js +42 -72
  8. package/dist/commands/agent/delete.js +29 -30
  9. package/dist/commands/agent/enable-widget.js +30 -26
  10. package/dist/commands/agent/export.js +90 -77
  11. package/dist/commands/agent/files.js +68 -60
  12. package/dist/commands/agent/get.js +101 -87
  13. package/dist/commands/agent/index.js +53 -39
  14. package/dist/commands/agent/list.js +26 -24
  15. package/dist/commands/agent/monitor.js +91 -86
  16. package/dist/commands/agent/on-message.js +40 -37
  17. package/dist/commands/agent/set.js +62 -59
  18. package/dist/commands/agent/templates.js +109 -108
  19. package/dist/commands/agent/tools.js +64 -65
  20. package/dist/commands/agent/update.js +28 -27
  21. package/dist/commands/agent/validate.js +127 -0
  22. package/dist/commands/agent/wizard.js +152 -159
  23. package/dist/commands/auth/index.js +7 -10
  24. package/dist/commands/auth/login.js +50 -37
  25. package/dist/commands/auth/logout.js +16 -14
  26. package/dist/commands/auth/status.js +19 -16
  27. package/dist/commands/portal/add-agent.js +26 -24
  28. package/dist/commands/portal/add-link.js +21 -17
  29. package/dist/commands/portal/clear-links.js +17 -15
  30. package/dist/commands/portal/create.js +25 -21
  31. package/dist/commands/portal/delete.js +31 -30
  32. package/dist/commands/portal/get.js +33 -31
  33. package/dist/commands/portal/index.js +30 -22
  34. package/dist/commands/portal/list.js +34 -30
  35. package/dist/commands/portal/update.js +41 -33
  36. package/dist/commands/whatsapp/broadcast.js +40 -37
  37. package/dist/commands/whatsapp/channels.js +40 -34
  38. package/dist/commands/whatsapp/chat.js +33 -32
  39. package/dist/commands/whatsapp/connect.js +53 -52
  40. package/dist/commands/whatsapp/delete-webhook.js +19 -17
  41. package/dist/commands/whatsapp/index.js +35 -25
  42. package/dist/commands/whatsapp/register-webhook.js +21 -19
  43. package/dist/commands/whatsapp/send-template.js +39 -31
  44. package/dist/commands/whatsapp/send.js +27 -23
  45. package/dist/commands/whatsapp/widget.js +35 -31
  46. package/dist/commands/workers/deploy.js +49 -44
  47. package/dist/commands/workers/index.js +28 -18
  48. package/dist/commands/workers/list.js +43 -35
  49. package/dist/commands/workers/logs.js +38 -32
  50. package/dist/commands/workers/remove.js +38 -37
  51. package/dist/commands/workers/secret.js +63 -58
  52. package/dist/commands/workers/test.js +44 -36
  53. package/dist/schemas/agent.config.schema.json +569 -0
  54. package/dist/studio/api/sseClient.js +97 -0
  55. package/dist/studio/api/studioApi.js +25 -0
  56. package/dist/studio/api/types.js +16 -0
  57. package/dist/studio/components/AgentPanel.js +35 -0
  58. package/dist/studio/components/App.js +214 -0
  59. package/dist/studio/components/ChatLog.js +59 -0
  60. package/dist/studio/components/Footer.js +11 -0
  61. package/dist/studio/components/Header.js +8 -0
  62. package/dist/studio/components/Input.js +15 -0
  63. package/dist/studio/components/Message.js +56 -0
  64. package/dist/studio/components/Suggestions.js +11 -0
  65. package/dist/studio/components/ToolCall.js +33 -0
  66. package/dist/studio/components/WhatsappConnectCard.js +57 -0
  67. package/dist/studio/index.js +42 -0
  68. package/dist/studio/render/json.js +16 -0
  69. package/dist/studio/render/markdown.js +86 -0
  70. package/dist/studio/render/steps.js +58 -0
  71. package/dist/studio/runOneShot.js +96 -0
  72. package/dist/studio/runRepl.js +52 -0
  73. package/dist/studio/slash/handlers.js +199 -0
  74. package/dist/studio/slash/parser.js +46 -0
  75. package/dist/studio/slash/registry.js +16 -0
  76. package/dist/studio/state/store.js +181 -0
  77. package/dist/studio/whatsapp/api.js +63 -0
  78. package/dist/studio/whatsapp/polling.js +77 -0
  79. package/dist/studio/whatsapp/types.js +31 -0
  80. package/dist/types/agent.js +1 -2
  81. package/dist/types/auth.js +1 -2
  82. package/dist/types/common.js +1 -2
  83. package/dist/types/message.js +1 -2
  84. package/dist/types/portal.js +1 -2
  85. package/dist/types/workers.js +1 -2
  86. package/dist/utils/agent-errors.js +46 -0
  87. package/dist/utils/api.js +8 -9
  88. package/dist/utils/banner.js +33 -34
  89. package/dist/utils/credentials.js +12 -20
  90. package/dist/utils/help.js +44 -0
  91. package/dist/utils/logger.js +13 -19
  92. package/dist/utils/ui.js +35 -49
  93. package/package.json +22 -10
  94. package/src/cli.ts +24 -8
  95. package/src/commands/agent/ai-config.ts +89 -34
  96. package/src/commands/agent/chat.ts +49 -37
  97. package/src/commands/agent/copy.ts +19 -13
  98. package/src/commands/agent/create.ts +32 -22
  99. package/src/commands/agent/delete.ts +24 -18
  100. package/src/commands/agent/enable-widget.ts +31 -23
  101. package/src/commands/agent/export.ts +72 -51
  102. package/src/commands/agent/files.ts +51 -39
  103. package/src/commands/agent/get.ts +86 -66
  104. package/src/commands/agent/index.ts +36 -18
  105. package/src/commands/agent/list.ts +22 -16
  106. package/src/commands/agent/monitor.ts +67 -56
  107. package/src/commands/agent/on-message.ts +36 -27
  108. package/src/commands/agent/set.ts +47 -37
  109. package/src/commands/agent/templates.ts +90 -82
  110. package/src/commands/agent/tools.ts +53 -47
  111. package/src/commands/agent/update.ts +28 -20
  112. package/src/commands/agent/validate.ts +135 -0
  113. package/src/commands/agent/wizard.ts +114 -114
  114. package/src/commands/auth/index.ts +3 -3
  115. package/src/commands/auth/login.ts +44 -29
  116. package/src/commands/auth/logout.ts +16 -10
  117. package/src/commands/auth/status.ts +14 -8
  118. package/src/commands/portal/add-agent.ts +23 -17
  119. package/src/commands/portal/add-link.ts +17 -9
  120. package/src/commands/portal/clear-links.ts +13 -7
  121. package/src/commands/portal/create.ts +20 -12
  122. package/src/commands/portal/delete.ts +28 -20
  123. package/src/commands/portal/get.ts +25 -19
  124. package/src/commands/portal/index.ts +22 -10
  125. package/src/commands/portal/list.ts +27 -19
  126. package/src/commands/portal/update.ts +38 -26
  127. package/src/commands/whatsapp/broadcast.ts +28 -18
  128. package/src/commands/whatsapp/channels.ts +31 -20
  129. package/src/commands/whatsapp/chat.ts +20 -12
  130. package/src/commands/whatsapp/connect.ts +39 -31
  131. package/src/commands/whatsapp/delete-webhook.ts +15 -9
  132. package/src/commands/whatsapp/index.ts +24 -10
  133. package/src/commands/whatsapp/register-webhook.ts +16 -10
  134. package/src/commands/whatsapp/send-template.ts +33 -21
  135. package/src/commands/whatsapp/send.ts +23 -15
  136. package/src/commands/whatsapp/widget.ts +25 -17
  137. package/src/commands/workers/deploy.ts +34 -22
  138. package/src/commands/workers/index.ts +21 -7
  139. package/src/commands/workers/list.ts +31 -19
  140. package/src/commands/workers/logs.ts +30 -20
  141. package/src/commands/workers/remove.ts +30 -22
  142. package/src/commands/workers/secret.ts +46 -34
  143. package/src/commands/workers/test.ts +34 -22
  144. package/src/schemas/agent.config.schema.json +569 -0
  145. package/src/studio/api/sseClient.ts +91 -0
  146. package/src/studio/api/studioApi.ts +27 -0
  147. package/src/studio/api/types.ts +96 -0
  148. package/src/studio/components/App.tsx +266 -0
  149. package/src/studio/components/ChatLog.tsx +95 -0
  150. package/src/studio/components/Footer.tsx +38 -0
  151. package/src/studio/components/Header.tsx +39 -0
  152. package/src/studio/components/Input.tsx +32 -0
  153. package/src/studio/components/Message.tsx +87 -0
  154. package/src/studio/components/Suggestions.tsx +26 -0
  155. package/src/studio/components/ToolCall.tsx +58 -0
  156. package/src/studio/components/WhatsappConnectCard.tsx +139 -0
  157. package/src/studio/index.ts +58 -0
  158. package/src/studio/render/markdown.ts +93 -0
  159. package/src/studio/render/steps.ts +57 -0
  160. package/src/studio/runOneShot.ts +114 -0
  161. package/src/studio/runRepl.tsx +76 -0
  162. package/src/studio/slash/handlers.ts +226 -0
  163. package/src/studio/slash/parser.ts +41 -0
  164. package/src/studio/slash/registry.ts +54 -0
  165. package/src/studio/state/store.ts +273 -0
  166. package/src/studio/whatsapp/api.ts +96 -0
  167. package/src/studio/whatsapp/polling.ts +93 -0
  168. package/src/studio/whatsapp/types.ts +80 -0
  169. package/src/types/agent.ts +1 -1
  170. package/src/types/auth.ts +4 -3
  171. package/src/types/portal.ts +1 -1
  172. package/src/types/workers.ts +1 -1
  173. package/src/utils/agent-errors.ts +67 -0
  174. package/src/utils/api.ts +6 -0
  175. package/src/utils/banner.ts +14 -9
  176. package/src/utils/credentials.ts +6 -5
  177. package/src/utils/help.ts +51 -0
  178. 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 { createSpinner } from '../../utils/ui';
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('Exportar configuracion limpia de un agente (compatible con importacion)')
177
- .argument('<agentId>', 'ID del agente a exportar')
178
- .option('-w, --workspace <id>', 'Workspace ID origen (sobreescribe config local)')
179
- .option('-z, --zone <zone>', 'Zona LA o EU (sobreescribe config local)')
180
- .option('-o, --output <path>', 'Ruta del archivo de salida (.json)')
181
- .option('--no-channels', 'Excluir canales de la exportacion')
182
- .option('--no-ai', 'Excluir configuracion de IA personalizada')
183
- .option('--dev', 'Usar ambiente de desarrollo', false)
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 Modo soporte: workspace=${effectiveWorkspace} zona=${effectiveZone}`));
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('Obteniendo agente...');
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('Agente obtenido');
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 Exportado a: ${outputPath}`));
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(' Este JSON es compatible con:'));
244
- console.log(chalk.gray(' - plazbot agent create <archivo.json>'));
245
- console.log(chalk.gray(' - Importar JSON en la plataforma (AgentTraining)'));
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 : 'Error desconocido';
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('Copiar un agente de un workspace a otro')
257
- .argument('<agentId>', 'ID del agente a copiar')
258
- .requiredOption('--from-workspace <id>', 'Workspace ID de origen')
259
- .requiredOption('--to-workspace <id>', 'Workspace ID de destino')
260
- .option('--from-zone <zone>', 'Zona del workspace origen (LA o EU)', 'LA')
261
- .option('--to-zone <zone>', 'Zona del workspace destino (LA o EU)', 'LA')
262
- .option('--no-channels', 'No copiar canales (recomendado)')
263
- .option('--no-ai', 'No copiar configuracion de IA personalizada')
264
- .option('--dev', 'Usar ambiente de desarrollo', false)
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(' Copiar agente entre workspaces').padEnd(68) + chalk.hex('#4CAF50')('│'));
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(` Origen: ${options.fromWorkspace} (${fromZone})`));
285
- console.log(chalk.gray(` Destino: ${options.toWorkspace} (${toZone})`));
286
- console.log(chalk.gray(` Agente: ${agentId}`));
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('Obteniendo agente del workspace origen...');
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('No se encontro el agente en el workspace origen');
316
+ spinnerGet.fail('Agent not found in source workspace');
305
317
  process.exit(1);
306
318
  }
307
319
 
308
- spinnerGet.succeed(`Agente obtenido: ${agentData.name}`);
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(' Configuracion a copiar:'));
333
- console.log(chalk.gray(` Nombre: ${cleaned.name}`));
334
- console.log(chalk.gray(` Zona destino: ${cleaned.zone}`));
335
- console.log(chalk.gray(` Canales: ${cleaned.channels?.length || 0}`));
336
- console.log(chalk.gray(` Servicios: ${cleaned.services?.length || 0}`));
337
- console.log(chalk.gray(` Acciones: ${cleaned.actions?.length || 0}`));
338
- console.log(chalk.gray(` AI Custom: ${cleaned.customAIConfig ? 'Si' : 'No'}`));
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: 'Crear este agente en el workspace destino?',
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(' Operacion cancelada.'));
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('Creando agente en workspace destino...');
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 || 'No se pudo crear el agente'}`);
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('Agente creado exitosamente');
384
+ spinnerCreate.succeed('Agent created successfully');
373
385
 
374
386
  console.log();
375
387
  if (newId) {
376
- console.log(chalk.hex('#4ade80')(` Nuevo ID: ${newId}`));
388
+ console.log(chalk.hex('#4ade80')(` New ID: ${newId}`));
377
389
  }
378
- console.log(chalk.gray(' Widget deshabilitado por defecto.'));
379
- console.log(chalk.gray(' Canales deben configurarse manualmente en el workspace destino.'));
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 : 'Error desconocido';
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 { createSpinner, createTable, theme, section, statusBadge } from '../../utils/ui';
6
- import { AgentCommandOptions } from '../../types/agent';
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('Gestionar archivos de la base de conocimiento del agente');
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('Listar archivos del agente')
14
- .argument('<agentId>', 'ID del agente')
15
- .option('--dev', 'Usar ambiente de desarrollo', false)
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('Cargando archivos...');
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('Archivos - ' + (agentData.name || agentId)));
45
+ console.log(section('Files - ' + (agentData.name || agentId)));
34
46
 
35
47
  if (files.length === 0) {
36
- console.log(theme.muted('\n No hay archivos en la base de conocimiento'));
37
- console.log(theme.muted(' Usa: plazbot agent files add <agentId> --url <url>\n'));
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 || 'Sin nombre',
55
+ f.name || f.reference || 'Untitled',
44
56
  (f.tags || []).join(', ') || '-',
45
57
  ]);
46
58
 
47
- console.log(createTable(['ID', 'Nombre', 'Tags'], rows));
59
+ console.log(createTable(['ID', 'Name', 'Tags'], rows));
48
60
 
49
61
  } catch (error) {
50
- const message = error instanceof Error ? error.message : 'Error desconocido';
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('Agregar archivo a la base de conocimiento')
59
- .argument('<agentId>', 'ID del agente')
60
- .requiredOption('-u, --url <url>', 'URL del archivo (PDF, DOC, DOCX)')
61
- .option('-r, --reference <name>', 'Nombre de referencia', 'documento')
62
- .option('-t, --tags <tags>', 'Tags separados por coma', '')
63
- .option('--dev', 'Usar ambiente de desarrollo', false)
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('Subiendo archivo...');
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('Archivo agregado');
97
+ spinner.succeed('File added');
86
98
 
87
99
  if (result?.fileId) {
88
100
  logger.label('File ID', result.fileId);
89
- logger.dim('El archivo esta siendo procesado. Verifica con:');
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 : 'Error desconocido';
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('Verificar estado de procesamiento de un archivo')
103
- .argument('<fileId>', 'ID del archivo')
104
- .option('--dev', 'Usar ambiente de desarrollo', false)
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('Verificando...');
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('Estado del archivo');
132
+ logger.title('File status');
121
133
  logger.label('File ID', fileId);
122
- logger.label('Estado', result?.status ? 'Completado' : 'En proceso');
134
+ logger.label('Status', result?.status ? 'Completed' : 'Processing');
123
135
 
124
136
  } catch (error) {
125
- const message = error instanceof Error ? error.message : 'Error desconocido';
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('Eliminar archivo de la base de conocimiento')
134
- .argument('<agentId>', 'ID del agente')
135
- .argument('<fileId>', 'ID del archivo')
136
- .option('--dev', 'Usar ambiente de desarrollo', false)
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('Eliminando archivo...');
159
+ const spinner = createSpinner('Deleting file...');
148
160
  spinner.start();
149
161
  await agent.deleteFile({ fileId, agentId });
150
- spinner.succeed('Archivo eliminado');
162
+ spinner.succeed('File deleted');
151
163
 
152
164
  } catch (error) {
153
- const message = error instanceof Error ? error.message : 'Error desconocido';
165
+ const message = error instanceof Error ? error.message : 'Unknown error';
154
166
  logger.error(message);
155
167
  process.exit(1);
156
168
  }