plazbot-cli 0.2.26 → 0.3.1
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 +32 -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 +21 -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 +32 -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,16 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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('
|
|
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 =
|
|
62
|
-
const grayFn =
|
|
63
|
-
const dimFn =
|
|
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) + '
|
|
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 =
|
|
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(' |
|
|
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(
|
|
88
|
-
console.log(
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
' '.repeat(
|
|
92
|
-
|
|
93
|
-
console.log(
|
|
94
|
-
|
|
95
|
-
' '.repeat(Math.max(0,
|
|
96
|
-
|
|
97
|
-
console.log(
|
|
98
|
-
|
|
99
|
-
' '.repeat(
|
|
100
|
-
|
|
101
|
-
console.log(
|
|
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
|
-
${
|
|
106
|
-
${
|
|
107
|
-
${
|
|
108
|
-
${
|
|
109
|
-
${
|
|
110
|
-
${
|
|
111
|
-
${
|
|
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
|
-
${
|
|
114
|
-
${Object.entries(EVENT_COLORS).map(([key, val]) => ` ${
|
|
108
|
+
${chalk.bold('Event types:')}
|
|
109
|
+
${Object.entries(EVENT_COLORS).map(([key, val]) => ` ${chalk.hex(val.color)('●')} ${key}`).join('\n')}
|
|
115
110
|
`;
|
|
116
|
-
|
|
117
|
-
.description('
|
|
118
|
-
.
|
|
119
|
-
.option('-f, --filter <types>', '
|
|
120
|
-
.option('--no-session', '
|
|
121
|
-
.option('--json', '
|
|
122
|
-
.option('-w, --workspace <id>', 'Workspace ID (
|
|
123
|
-
.option('-z, --zone <zone>', '
|
|
124
|
-
.option('--dev', '
|
|
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
|
|
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(
|
|
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 = '
|
|
134
|
+
let agentName = 'Agent';
|
|
140
135
|
try {
|
|
141
|
-
process.stdout.write(
|
|
142
|
-
const agent = new
|
|
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:
|
|
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
|
|
159
|
+
const connection = new HubConnectionBuilder()
|
|
165
160
|
.withUrl(hubUrl, {
|
|
166
161
|
skipNegotiation: true,
|
|
167
|
-
transport:
|
|
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(
|
|
181
|
+
console.log(chalk.hex('#FFA726')(' ⟳ Reconnecting...'));
|
|
187
182
|
}
|
|
188
183
|
});
|
|
189
184
|
connection.onreconnected(() => {
|
|
190
185
|
if (!jsonMode) {
|
|
191
|
-
console.log(
|
|
186
|
+
console.log(chalk.hex('#4ade80')(' ● Reconnected'));
|
|
192
187
|
}
|
|
193
|
-
connection.invoke('JoinAgentMonitor',
|
|
188
|
+
connection.invoke('JoinAgentMonitor', agentId).catch(() => { });
|
|
194
189
|
});
|
|
195
190
|
connection.onclose(() => {
|
|
196
191
|
if (!jsonMode) {
|
|
197
|
-
console.log(
|
|
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',
|
|
198
|
+
await connection.invoke('JoinAgentMonitor', agentId);
|
|
204
199
|
if (!jsonMode) {
|
|
205
|
-
console.log(
|
|
200
|
+
console.log(chalk.hex('#4ade80')(' ● Connected to real-time monitor'));
|
|
206
201
|
console.log();
|
|
207
202
|
}
|
|
208
203
|
}
|
|
209
204
|
catch (err) {
|
|
210
|
-
|
|
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 =
|
|
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(
|
|
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(
|
|
233
|
+
console.log(chalk.gray(' No active filters (showing all)'));
|
|
239
234
|
}
|
|
240
235
|
else {
|
|
241
|
-
console.log(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
259
|
+
console.log(chalk.hex(config.color)(` ● Filter added: ${filterType}`));
|
|
265
260
|
}
|
|
266
261
|
else {
|
|
267
|
-
console.log(
|
|
262
|
+
console.log(chalk.gray(` Filter added: ${filterType} (unknown type)`));
|
|
268
263
|
}
|
|
269
264
|
}
|
|
270
265
|
if (activeFilters.size > 0) {
|
|
271
|
-
console.log(
|
|
266
|
+
console.log(chalk.gray(' Active: ') + chalk.white([...activeFilters].join(', ')));
|
|
272
267
|
}
|
|
273
268
|
else {
|
|
274
|
-
console.log(
|
|
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(
|
|
277
|
+
console.log(chalk.gray('\n Closing monitor...'));
|
|
283
278
|
}
|
|
284
279
|
try {
|
|
285
|
-
if (connection.state ===
|
|
286
|
-
await connection.invoke('LeaveAgentMonitor',
|
|
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(
|
|
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 : '
|
|
304
|
-
|
|
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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
.
|
|
14
|
-
.
|
|
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
|
|
23
|
-
const agent = new
|
|
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 ||
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
31
|
+
logger.info('Mode: Multiple answers');
|
|
37
32
|
}
|
|
38
33
|
const response = await agent.onMessage({
|
|
39
|
-
agentId:
|
|
34
|
+
agentId: agentId,
|
|
40
35
|
question: options.question,
|
|
41
36
|
sessionId,
|
|
42
37
|
multipleAnswers: options.multipleAnswers
|
|
43
38
|
});
|
|
44
|
-
|
|
39
|
+
logger.title('Agent Response');
|
|
45
40
|
console.log(response.answer);
|
|
46
41
|
if (response.sources && response.sources.length > 0) {
|
|
47
|
-
|
|
42
|
+
logger.title('Sources');
|
|
48
43
|
response.sources.forEach((source) => {
|
|
49
|
-
|
|
44
|
+
logger.label('Title', source.title || 'Untitled');
|
|
50
45
|
if (source.url)
|
|
51
|
-
|
|
46
|
+
logger.label('URL', source.url);
|
|
52
47
|
});
|
|
53
48
|
}
|
|
54
|
-
|
|
55
|
-
|
|
49
|
+
logger.title('Session');
|
|
50
|
+
logger.label('ID', sessionId);
|
|
56
51
|
if (options.dev) {
|
|
57
|
-
|
|
52
|
+
logger.warning('\nEnvironment: development');
|
|
58
53
|
}
|
|
59
54
|
}
|
|
60
55
|
catch (error) {
|
|
61
|
-
const message = error instanceof Error ? error.message : '
|
|
62
|
-
|
|
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
|
+
]);
|