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,16 +1,11 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.monitorCommand = void 0;
7
- const commander_1 = require("commander");
8
- const plazbot_1 = require("plazbot");
9
- const credentials_1 = require("../../utils/credentials");
10
- const logger_1 = require("../../utils/logger");
11
- const chalk_1 = __importDefault(require("chalk"));
12
- const readline_1 = __importDefault(require("readline"));
13
- const signalr_1 = require("@microsoft/signalr");
1
+ import { Command } from 'commander';
2
+ import { Agent } from 'plazbot';
3
+ import { getStoredCredentials } from '../../utils/credentials.js';
4
+ import { logger } from '../../utils/logger.js';
5
+ import { addExamples } from '../../utils/help.js';
6
+ import chalk from 'chalk';
7
+ import readline from 'readline';
8
+ import { HubConnectionBuilder, HttpTransportType, HubConnectionState } from '@microsoft/signalr';
14
9
  // Colores por tipo de evento (mismos del MonitorTab frontend)
15
10
  const EVENT_COLORS = {
16
11
  msg_in: { color: '#22d3ee', label: 'msg_in' },
@@ -36,7 +31,7 @@ function getBaseUrl(zone, dev) {
36
31
  function formatTimestamp(ts) {
37
32
  try {
38
33
  const d = new Date(ts);
39
- return d.toLocaleTimeString('es-ES', { hour: '2-digit', minute: '2-digit', second: '2-digit' });
34
+ return d.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', second: '2-digit' });
40
35
  }
41
36
  catch {
42
37
  return ts.substring(11, 19);
@@ -58,19 +53,19 @@ function renderLogLine(log, opts, lastSessionId) {
58
53
  return JSON.stringify(log);
59
54
  }
60
55
  const config = EVENT_COLORS[log.event_type] || DEFAULT_EVENT_COLOR;
61
- const colorFn = chalk_1.default.hex(config.color);
62
- const grayFn = chalk_1.default.hex('#71717a');
63
- const dimFn = chalk_1.default.hex('#52525b');
56
+ const colorFn = chalk.hex(config.color);
57
+ const grayFn = chalk.hex('#71717a');
58
+ const dimFn = chalk.hex('#52525b');
64
59
  let lines = [];
65
60
  // Separador de sesion
66
61
  if (lastSessionId && log.session_id && log.session_id !== lastSessionId) {
67
- lines.push(dimFn(' ' + '─'.repeat(16) + ' nueva sesion ' + '─'.repeat(16)));
62
+ lines.push(dimFn(' ' + '─'.repeat(16) + ' new session ' + '─'.repeat(16)));
68
63
  }
69
64
  // Linea principal
70
65
  const timestamp = grayFn(formatTimestamp(log.timestamp));
71
66
  const dot = colorFn('●');
72
67
  const eventType = colorFn(config.label.padEnd(14));
73
- const title = chalk_1.default.white(truncate(log.event_title, 80));
68
+ const title = chalk.white(truncate(log.event_title, 80));
74
69
  const duration = log.duration_ms > 0 ? dimFn(` ${log.duration_ms}ms`) : '';
75
70
  const session = opts.showSession && log.session_id
76
71
  ? dimFn(` [${shortSession(log.session_id)}]`)
@@ -78,74 +73,74 @@ function renderLogLine(log, opts, lastSessionId) {
78
73
  lines.push(` ${timestamp} ${dot} ${eventType} ${title}${duration}${session}`);
79
74
  // Linea de contacto para mensajes
80
75
  if (log.contact_name && (log.event_type === 'msg_in' || log.event_type === 'msg_out')) {
81
- lines.push(dimFn(' | contacto: ') + dimFn(log.contact_name));
76
+ lines.push(dimFn(' | contact: ') + dimFn(log.contact_name));
82
77
  }
83
78
  return lines.join('\n');
84
79
  }
85
80
  function printHeader(agentName) {
86
81
  console.log();
87
- console.log(chalk_1.default.hex('#4CAF50')(' ┌' + '─'.repeat(62) + '┐'));
88
- console.log(chalk_1.default.hex('#4CAF50')(' │') +
89
- chalk_1.default.bold(` Monitor`) +
90
- chalk_1.default.hex('#4ade80')(' ● En vivo') +
91
- ' '.repeat(38) +
92
- chalk_1.default.hex('#4CAF50')('│'));
93
- console.log(chalk_1.default.hex('#4CAF50')(' │') +
94
- chalk_1.default.gray(` Agente: ${truncate(agentName, 44)}`) +
95
- ' '.repeat(Math.max(0, 49 - agentName.length)) +
96
- chalk_1.default.hex('#4CAF50')('│'));
97
- console.log(chalk_1.default.hex('#4CAF50')(' │') +
98
- chalk_1.default.gray(' Ctrl+C salir | /filter <tipo> | /clear | /help') +
99
- ' '.repeat(12) +
100
- chalk_1.default.hex('#4CAF50')('│'));
101
- console.log(chalk_1.default.hex('#4CAF50')(' └' + '─'.repeat(62) + '┘'));
82
+ console.log(chalk.hex('#4CAF50')(' ┌' + '─'.repeat(62) + '┐'));
83
+ console.log(chalk.hex('#4CAF50')(' │') +
84
+ chalk.bold(` Monitor`) +
85
+ chalk.hex('#4ade80')(' ● Live') +
86
+ ' '.repeat(42) +
87
+ chalk.hex('#4CAF50')('│'));
88
+ console.log(chalk.hex('#4CAF50')(' │') +
89
+ chalk.gray(` Agent: ${truncate(agentName, 44)}`) +
90
+ ' '.repeat(Math.max(0, 50 - agentName.length)) +
91
+ chalk.hex('#4CAF50')('│'));
92
+ console.log(chalk.hex('#4CAF50')(' │') +
93
+ chalk.gray(' Ctrl+C exit | /filter <type> | /clear | /help') +
94
+ ' '.repeat(13) +
95
+ chalk.hex('#4CAF50')('│'));
96
+ console.log(chalk.hex('#4CAF50')(' └' + '─'.repeat(62) + '┘'));
102
97
  console.log();
103
98
  }
104
99
  const COMMANDS_HELP = `
105
- ${chalk_1.default.bold('Comandos disponibles:')}
106
- ${chalk_1.default.hex('#4CAF50')('/filter <tipo>')} Toggle filtro por tipo (ej: msg_in, error, tool_call)
107
- ${chalk_1.default.hex('#4CAF50')('/filter clear')} Quitar todos los filtros
108
- ${chalk_1.default.hex('#4CAF50')('/filters')} Mostrar filtros activos
109
- ${chalk_1.default.hex('#4CAF50')('/clear')} Limpiar pantalla
110
- ${chalk_1.default.hex('#4CAF50')('/json')} Toggle modo JSON expandido
111
- ${chalk_1.default.hex('#4CAF50')('/help')} Mostrar estos comandos
100
+ ${chalk.bold('Available commands:')}
101
+ ${chalk.hex('#4CAF50')('/filter <type>')} Toggle filter by type (e.g. msg_in, error, tool_call)
102
+ ${chalk.hex('#4CAF50')('/filter clear')} Remove all filters
103
+ ${chalk.hex('#4CAF50')('/filters')} Show active filters
104
+ ${chalk.hex('#4CAF50')('/clear')} Clear screen
105
+ ${chalk.hex('#4CAF50')('/json')} Toggle expanded JSON mode
106
+ ${chalk.hex('#4CAF50')('/help')} Show these commands
112
107
 
113
- ${chalk_1.default.bold('Tipos de evento:')}
114
- ${Object.entries(EVENT_COLORS).map(([key, val]) => ` ${chalk_1.default.hex(val.color)('●')} ${key}`).join('\n')}
108
+ ${chalk.bold('Event types:')}
109
+ ${Object.entries(EVENT_COLORS).map(([key, val]) => ` ${chalk.hex(val.color)('●')} ${key}`).join('\n')}
115
110
  `;
116
- exports.monitorCommand = new commander_1.Command('monitor')
117
- .description('Monitor en tiempo real de un agente (logs via SignalR)')
118
- .requiredOption('-a, --agent-id <id>', 'ID del agente')
119
- .option('-f, --filter <types>', 'Filtrar por tipos separados por coma (ej: msg_in,msg_out)')
120
- .option('--no-session', 'Ocultar session ID')
121
- .option('--json', 'Modo JSON crudo (para piping)', false)
122
- .option('-w, --workspace <id>', 'Workspace ID (sobreescribe config local)')
123
- .option('-z, --zone <zone>', 'Zona LA o EU (sobreescribe config local)')
124
- .option('--dev', 'Usar ambiente de desarrollo', false)
125
- .action(async (options) => {
111
+ export const monitorCommand = new Command('monitor')
112
+ .description('Real-time agent monitor (logs via SignalR)')
113
+ .argument('<agentId>', 'Agent ID')
114
+ .option('-f, --filter <types>', 'Filter by comma-separated types (e.g. msg_in,msg_out)')
115
+ .option('--no-session', 'Hide session ID')
116
+ .option('--json', 'Raw JSON mode (for piping)', false)
117
+ .option('-w, --workspace <id>', 'Workspace ID (overrides local config)')
118
+ .option('-z, --zone <zone>', 'Zone LA or EU (overrides local config)')
119
+ .option('--dev', 'Use development environment', false)
120
+ .action(async (agentId, options) => {
126
121
  try {
127
- const credentials = await (0, credentials_1.getStoredCredentials)();
122
+ const credentials = await getStoredCredentials();
128
123
  const effectiveWorkspace = options.workspace || credentials.workspace;
129
124
  const effectiveZone = (options.zone?.toUpperCase() === 'EU' ? 'EU' : options.zone?.toUpperCase() === 'LA' ? 'LA' : credentials.zone);
130
125
  const baseUrl = getBaseUrl(effectiveZone, options.dev);
131
126
  if (options.workspace || options.zone) {
132
- console.log(chalk_1.default.hex('#FFA726')(`\n Modo soporte: workspace=${effectiveWorkspace} zona=${effectiveZone}`));
127
+ console.log(chalk.hex('#FFA726')(`\n Support mode: workspace=${effectiveWorkspace} zone=${effectiveZone}`));
133
128
  }
134
129
  // Filtros iniciales
135
130
  const activeFilters = new Set(options.filter ? options.filter.split(',').map(f => f.trim()) : []);
136
131
  let jsonMode = options.json;
137
132
  let lastSessionId = '';
138
133
  // Cargar info del agente
139
- let agentName = 'Agente';
134
+ let agentName = 'Agent';
140
135
  try {
141
- process.stdout.write(chalk_1.default.gray(' Conectando con agente...'));
142
- const agent = new plazbot_1.Agent({
136
+ process.stdout.write(chalk.gray(' Connecting to agent...'));
137
+ const agent = new Agent({
143
138
  workspaceId: effectiveWorkspace,
144
139
  apiKey: credentials.apiKey,
145
140
  zone: effectiveZone,
146
141
  ...(options.dev && { customUrl: 'http://localhost:5090' }),
147
142
  });
148
- const _res = await agent.getAgentById({ id: options.agentId });
143
+ const _res = await agent.getAgentById({ id: agentId });
149
144
  const info = _res.agent || _res.data || _res;
150
145
  if (info?.name)
151
146
  agentName = info.name;
@@ -161,10 +156,10 @@ exports.monitorCommand = new commander_1.Command('monitor')
161
156
  }
162
157
  // Conectar a SignalR
163
158
  const hubUrl = `${baseUrl}/agentMonitorHub`;
164
- const connection = new signalr_1.HubConnectionBuilder()
159
+ const connection = new HubConnectionBuilder()
165
160
  .withUrl(hubUrl, {
166
161
  skipNegotiation: true,
167
- transport: signalr_1.HttpTransportType.WebSockets,
162
+ transport: HttpTransportType.WebSockets,
168
163
  })
169
164
  .withAutomaticReconnect([0, 2000, 5000, 10000, 30000])
170
165
  .build();
@@ -183,35 +178,35 @@ exports.monitorCommand = new commander_1.Command('monitor')
183
178
  // Eventos de conexion
184
179
  connection.onreconnecting(() => {
185
180
  if (!jsonMode) {
186
- console.log(chalk_1.default.hex('#FFA726')(' ⟳ Reconectando...'));
181
+ console.log(chalk.hex('#FFA726')(' ⟳ Reconnecting...'));
187
182
  }
188
183
  });
189
184
  connection.onreconnected(() => {
190
185
  if (!jsonMode) {
191
- console.log(chalk_1.default.hex('#4ade80')(' ● Reconectado'));
186
+ console.log(chalk.hex('#4ade80')(' ● Reconnected'));
192
187
  }
193
- connection.invoke('JoinAgentMonitor', options.agentId).catch(() => { });
188
+ connection.invoke('JoinAgentMonitor', agentId).catch(() => { });
194
189
  });
195
190
  connection.onclose(() => {
196
191
  if (!jsonMode) {
197
- console.log(chalk_1.default.hex('#ef4444')(' ● Desconectado'));
192
+ console.log(chalk.hex('#ef4444')(' ● Disconnected'));
198
193
  }
199
194
  });
200
195
  // Iniciar conexion
201
196
  try {
202
197
  await connection.start();
203
- await connection.invoke('JoinAgentMonitor', options.agentId);
198
+ await connection.invoke('JoinAgentMonitor', agentId);
204
199
  if (!jsonMode) {
205
- console.log(chalk_1.default.hex('#4ade80')(' ● Conectado al monitor en tiempo real'));
200
+ console.log(chalk.hex('#4ade80')(' ● Connected to real-time monitor'));
206
201
  console.log();
207
202
  }
208
203
  }
209
204
  catch (err) {
210
- logger_1.logger.error(`No se pudo conectar al monitor: ${err instanceof Error ? err.message : err}`);
205
+ logger.error(`Could not connect to monitor: ${err instanceof Error ? err.message : err}`);
211
206
  process.exit(1);
212
207
  }
213
208
  // readline para comandos interactivos
214
- const rl = readline_1.default.createInterface({
209
+ const rl = readline.createInterface({
215
210
  input: process.stdin,
216
211
  output: process.stdout,
217
212
  prompt: '',
@@ -230,48 +225,48 @@ exports.monitorCommand = new commander_1.Command('monitor')
230
225
  }
231
226
  if (cmd === '/json') {
232
227
  jsonMode = !jsonMode;
233
- console.log(chalk_1.default.gray(` Modo JSON: ${jsonMode ? 'activado' : 'desactivado'}`));
228
+ console.log(chalk.gray(` JSON mode: ${jsonMode ? 'enabled' : 'disabled'}`));
234
229
  return;
235
230
  }
236
231
  if (cmd === '/filters') {
237
232
  if (activeFilters.size === 0) {
238
- console.log(chalk_1.default.gray(' Sin filtros activos (mostrando todos)'));
233
+ console.log(chalk.gray(' No active filters (showing all)'));
239
234
  }
240
235
  else {
241
- console.log(chalk_1.default.gray(' Filtros activos: ') + chalk_1.default.white([...activeFilters].join(', ')));
236
+ console.log(chalk.gray(' Active filters: ') + chalk.white([...activeFilters].join(', ')));
242
237
  }
243
238
  return;
244
239
  }
245
240
  if (cmd.startsWith('/filter ')) {
246
241
  const filterType = cmd.substring(8).trim();
247
242
  if (!filterType) {
248
- console.log(chalk_1.default.gray(' Uso: /filter <tipo> | /filter clear'));
243
+ console.log(chalk.gray(' Usage: /filter <type> | /filter clear'));
249
244
  return;
250
245
  }
251
246
  if (filterType === 'clear') {
252
247
  activeFilters.clear();
253
- console.log(chalk_1.default.gray(' Todos los filtros removidos (mostrando todos)'));
248
+ console.log(chalk.gray(' All filters cleared (showing all)'));
254
249
  return;
255
250
  }
256
251
  if (activeFilters.has(filterType)) {
257
252
  activeFilters.delete(filterType);
258
- console.log(chalk_1.default.gray(` Filtro removido: ${filterType}`));
253
+ console.log(chalk.gray(` Filter removed: ${filterType}`));
259
254
  }
260
255
  else {
261
256
  activeFilters.add(filterType);
262
257
  const config = EVENT_COLORS[filterType];
263
258
  if (config) {
264
- console.log(chalk_1.default.hex(config.color)(` ● Filtro agregado: ${filterType}`));
259
+ console.log(chalk.hex(config.color)(` ● Filter added: ${filterType}`));
265
260
  }
266
261
  else {
267
- console.log(chalk_1.default.gray(` Filtro agregado: ${filterType} (tipo desconocido)`));
262
+ console.log(chalk.gray(` Filter added: ${filterType} (unknown type)`));
268
263
  }
269
264
  }
270
265
  if (activeFilters.size > 0) {
271
- console.log(chalk_1.default.gray(' Activos: ') + chalk_1.default.white([...activeFilters].join(', ')));
266
+ console.log(chalk.gray(' Active: ') + chalk.white([...activeFilters].join(', ')));
272
267
  }
273
268
  else {
274
- console.log(chalk_1.default.gray(' Sin filtros (mostrando todos)'));
269
+ console.log(chalk.gray(' No filters (showing all)'));
275
270
  }
276
271
  return;
277
272
  }
@@ -279,11 +274,11 @@ exports.monitorCommand = new commander_1.Command('monitor')
279
274
  // Cierre limpio
280
275
  const cleanup = async () => {
281
276
  if (!jsonMode) {
282
- console.log(chalk_1.default.gray('\n Cerrando monitor...'));
277
+ console.log(chalk.gray('\n Closing monitor...'));
283
278
  }
284
279
  try {
285
- if (connection.state === signalr_1.HubConnectionState.Connected) {
286
- await connection.invoke('LeaveAgentMonitor', options.agentId);
280
+ if (connection.state === HubConnectionState.Connected) {
281
+ await connection.invoke('LeaveAgentMonitor', agentId);
287
282
  }
288
283
  await connection.stop();
289
284
  }
@@ -292,7 +287,7 @@ exports.monitorCommand = new commander_1.Command('monitor')
292
287
  }
293
288
  rl.close();
294
289
  if (!jsonMode) {
295
- console.log(chalk_1.default.gray(' Monitor cerrado.\n'));
290
+ console.log(chalk.gray(' Monitor closed.\n'));
296
291
  }
297
292
  process.exit(0);
298
293
  };
@@ -300,8 +295,18 @@ exports.monitorCommand = new commander_1.Command('monitor')
300
295
  process.on('SIGTERM', cleanup);
301
296
  }
302
297
  catch (error) {
303
- const message = error instanceof Error ? error.message : 'Error desconocido';
304
- logger_1.logger.error(message);
298
+ const message = error instanceof Error ? error.message : 'Unknown error';
299
+ logger.error(message);
305
300
  process.exit(1);
306
301
  }
307
302
  });
303
+ addExamples(monitorCommand, [
304
+ { description: 'Stream every event of an agent in real time',
305
+ command: 'plazbot agent monitor agt_AbcDef123' },
306
+ { description: 'Only show inbound/outbound messages and errors',
307
+ command: 'plazbot agent monitor agt_AbcDef123 -f msg_in,msg_out,error' },
308
+ { description: 'Emit raw JSON (one event per line) for piping to jq',
309
+ command: 'plazbot agent monitor agt_AbcDef123 --json' },
310
+ { description: 'Tail an agent from a different workspace (support mode)',
311
+ command: 'plazbot agent monitor agt_AbcDef123 -w wok_Other123 -z LA' },
312
+ ]);
@@ -1,65 +1,68 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.messageCommand = void 0;
7
- const commander_1 = require("commander");
8
- const plazbot_1 = require("plazbot");
9
- const credentials_1 = require("../../utils/credentials");
10
- const logger_1 = require("../../utils/logger");
11
- const crypto_1 = __importDefault(require("crypto"));
12
- exports.messageCommand = new commander_1.Command('message')
13
- .description('Envía un mensaje a un agente y obtiene su respuesta')
14
- .requiredOption('-a, --agent-id <id>', 'ID del agente')
15
- .requiredOption('-q, --question <text>', 'Mensaje o pregunta para el agente')
16
- .option('-s, --session-id <id>', 'ID de sesión (opcional)')
17
- .option('-m, --multiple-answers', 'Permitir múltiples respuestas', false)
18
- .option('--dev', 'Usar ambiente de desarrollo', false)
19
- .action(async (options) => {
1
+ import { Command } from 'commander';
2
+ import { Agent } from 'plazbot';
3
+ import { getStoredCredentials } from '../../utils/credentials.js';
4
+ import { logger } from '../../utils/logger.js';
5
+ import { addExamples } from '../../utils/help.js';
6
+ import crypto from 'crypto';
7
+ export const messageCommand = new Command('message')
8
+ .description('Send a message to an agent and get its response')
9
+ .argument('<agentId>', 'Agent ID')
10
+ .requiredOption('-q, --question <text>', 'Message or question for the agent')
11
+ .option('-s, --session-id <id>', 'Session ID (optional)')
12
+ .option('-m, --multiple-answers', 'Allow multiple answers', false)
13
+ .option('--dev', 'Use development environment', false)
14
+ .action(async (agentId, options) => {
20
15
  try {
21
16
  // Obtener credenciales guardadas
22
- const credentials = await (0, credentials_1.getStoredCredentials)();
23
- const agent = new plazbot_1.Agent({
17
+ const credentials = await getStoredCredentials();
18
+ const agent = new Agent({
24
19
  workspaceId: credentials.workspace,
25
20
  apiKey: credentials.apiKey,
26
21
  zone: credentials.zone,
27
22
  ...(options.dev && { customUrl: "http://localhost:5090" })
28
23
  });
29
24
  // Generar un sessionId si no se proporcionó uno
30
- const sessionId = options.sessionId || crypto_1.default.randomUUID();
31
- logger_1.logger.title('Enviando mensaje al agente');
32
- logger_1.logger.label('ID del agente', options.agentId);
33
- logger_1.logger.label('Pregunta', options.question);
34
- logger_1.logger.label('ID de sesion', sessionId);
25
+ const sessionId = options.sessionId || crypto.randomUUID();
26
+ logger.title('Sending message to agent');
27
+ logger.label('Agent ID', agentId);
28
+ logger.label('Question', options.question);
29
+ logger.label('Session ID', sessionId);
35
30
  if (options.multipleAnswers) {
36
- logger_1.logger.info('Modo: Múltiples respuestas');
31
+ logger.info('Mode: Multiple answers');
37
32
  }
38
33
  const response = await agent.onMessage({
39
- agentId: options.agentId,
34
+ agentId: agentId,
40
35
  question: options.question,
41
36
  sessionId,
42
37
  multipleAnswers: options.multipleAnswers
43
38
  });
44
- logger_1.logger.title('Respuesta del Agente');
39
+ logger.title('Agent Response');
45
40
  console.log(response.answer);
46
41
  if (response.sources && response.sources.length > 0) {
47
- logger_1.logger.title('Fuentes');
42
+ logger.title('Sources');
48
43
  response.sources.forEach((source) => {
49
- logger_1.logger.label('Titulo', source.title || 'Sin titulo');
44
+ logger.label('Title', source.title || 'Untitled');
50
45
  if (source.url)
51
- logger_1.logger.label('URL', source.url);
46
+ logger.label('URL', source.url);
52
47
  });
53
48
  }
54
- logger_1.logger.title('Sesion');
55
- logger_1.logger.label('ID', sessionId);
49
+ logger.title('Session');
50
+ logger.label('ID', sessionId);
56
51
  if (options.dev) {
57
- logger_1.logger.warning('\nAmbiente: desarrollo');
52
+ logger.warning('\nEnvironment: development');
58
53
  }
59
54
  }
60
55
  catch (error) {
61
- const message = error instanceof Error ? error.message : 'Error desconocido al enviar el mensaje';
62
- logger_1.logger.error(message);
56
+ const message = error instanceof Error ? error.message : 'Unknown error while sending the message';
57
+ logger.error(message);
63
58
  process.exit(1);
64
59
  }
65
60
  });
61
+ addExamples(messageCommand, [
62
+ { description: 'Send a one-shot question to an agent',
63
+ command: 'plazbot agent message agt_AbcDef123 -q "What plans do you offer?"' },
64
+ { description: 'Continue an existing session',
65
+ command: 'plazbot agent message agt_AbcDef123 -q "And the price?" -s sess_AbcDef123' },
66
+ { description: 'Allow multiple answers per turn',
67
+ command: 'plazbot agent message agt_AbcDef123 -q "Tell me everything" -m' },
68
+ ]);