@runflow-ai/cli 0.2.7 โ†’ 0.2.8

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.
@@ -12,7 +12,7 @@ export declare class TestCommand extends CommandRunner {
12
12
  parsePort(val: string): number;
13
13
  parseHost(val: string): string;
14
14
  parseOpen(): boolean;
15
- parseVerbose(): boolean;
15
+ parseVerbose(val: string): boolean;
16
16
  private loadRunflowConfig;
17
17
  private ensureDependencies;
18
18
  private startTestServer;
@@ -61,45 +61,59 @@ let TestCommand = class TestCommand extends nest_commander_1.CommandRunner {
61
61
  this.frontend = null;
62
62
  }
63
63
  async run(passedParam, options) {
64
- const port = options?.port || 8547;
65
- const host = options?.host || 'localhost';
66
- const shouldOpen = options?.open !== false;
67
- const verbose = options?.verbose || false;
68
- console.log(chalk_1.default.cyan.bold('๐Ÿงช Runflow Test Server'));
69
- console.log(chalk_1.default.gray('Starting local development environment...\n'));
70
- const validation = (0, validator_1.validateForTest)();
71
- if (!validation.isValid) {
72
- console.error(chalk_1.default.red('\nโŒ Project validation failed!'));
73
- validation.errors.forEach(error => {
74
- console.error(chalk_1.default.red(` โ€ข ${error}`));
75
- });
76
- console.error(chalk_1.default.gray('\n๐Ÿ“š Documentation: https://docs.runflow.ai\n'));
77
- process.exit(1);
78
- }
79
- const mainFile = validation.mainFile;
80
- const spinner = (0, ora_1.default)('Initializing...').start();
81
64
  try {
82
- await this.ensureDependencies(spinner);
83
- await this.startTestServer(port, mainFile, verbose, spinner);
84
- await this.startFrontend(port + 1000, port, verbose, spinner);
85
- spinner.succeed('Ready!');
86
- if (!verbose) {
87
- console.clear();
65
+ const port = options?.port || 8547;
66
+ const host = options?.host || 'localhost';
67
+ const shouldOpen = options?.open !== false;
68
+ const verbose = true;
69
+ console.log('๐Ÿ” [DEBUG] Options received:', options);
70
+ console.log('๐Ÿ” [DEBUG] Verbose flag:', verbose);
71
+ console.log(chalk_1.default.cyan.bold('๐Ÿงช Runflow Test Server'));
72
+ console.log(chalk_1.default.gray('Starting local development environment...\n'));
73
+ const validation = (0, validator_1.validateForTest)();
74
+ if (!validation.isValid) {
75
+ console.error(chalk_1.default.red('\nโŒ Project validation failed!'));
76
+ validation.errors.forEach((error) => {
77
+ console.error(chalk_1.default.red(` โ€ข ${error}`));
78
+ });
79
+ console.error(chalk_1.default.gray('\n๐Ÿ“š Documentation: https://docs.runflow.ai\n'));
80
+ process.exit(1);
88
81
  }
89
- console.log(chalk_1.default.green.bold('โœ… Test Interface Running'));
90
- console.log('');
91
- console.log(chalk_1.default.cyan(`๐ŸŒ Open: http://${host}:${port + 1000}`));
92
- console.log(chalk_1.default.gray(`๐Ÿ“„ Testing: ${mainFile}`));
93
- console.log('');
94
- console.log(chalk_1.default.gray('Press Ctrl+C to stop'));
95
- if (shouldOpen) {
96
- this.openBrowser(`http://${host}:${port + 1000}`);
82
+ const mainFile = validation.mainFile;
83
+ const spinner = verbose ? null : (0, ora_1.default)('Initializing...').start();
84
+ try {
85
+ await this.ensureDependencies(spinner);
86
+ await this.startTestServer(port, mainFile, verbose, spinner);
87
+ await this.startFrontend(port + 1000, port, verbose, spinner);
88
+ if (spinner) {
89
+ spinner.succeed('Ready!');
90
+ }
91
+ if (!verbose) {
92
+ console.clear();
93
+ }
94
+ console.log(chalk_1.default.green.bold('โœ… Test Interface Running!'));
95
+ console.log('');
96
+ console.log(chalk_1.default.cyan(`๐ŸŒ Open: http://${host}:${port + 1000}`));
97
+ console.log(chalk_1.default.gray(`๐Ÿ“„ Testing: ${mainFile}`));
98
+ console.log('');
99
+ console.log(chalk_1.default.gray('Press Ctrl+C to stop'));
100
+ if (shouldOpen) {
101
+ this.openBrowser(`http://${host}:${port + 1000}`);
102
+ }
103
+ this.setupCleanupHandlers();
104
+ await this.keepAlive();
105
+ }
106
+ catch (error) {
107
+ if (spinner) {
108
+ spinner.fail('Failed to start test environment');
109
+ }
110
+ console.error(chalk_1.default.red(`โŒ Error: ${error instanceof Error ? error.message : 'Unknown error'}`));
111
+ await this.cleanup();
112
+ process.exit(1);
97
113
  }
98
- this.setupCleanupHandlers();
99
- await this.keepAlive();
100
114
  }
101
115
  catch (error) {
102
- spinner.fail('Failed to start test environment');
116
+ console.log('deu erro aqui');
103
117
  console.error(chalk_1.default.red(`โŒ Error: ${error instanceof Error ? error.message : 'Unknown error'}`));
104
118
  await this.cleanup();
105
119
  process.exit(1);
@@ -118,7 +132,8 @@ let TestCommand = class TestCommand extends nest_commander_1.CommandRunner {
118
132
  parseOpen() {
119
133
  return false;
120
134
  }
121
- parseVerbose() {
135
+ parseVerbose(val) {
136
+ console.log('๐Ÿ” [PARSER] parseVerbose called with:', val);
122
137
  return true;
123
138
  }
124
139
  loadRunflowConfig() {
@@ -134,19 +149,34 @@ let TestCommand = class TestCommand extends nest_commander_1.CommandRunner {
134
149
  return null;
135
150
  }
136
151
  async ensureDependencies(spinner) {
137
- spinner.text = 'Checking dependencies...';
152
+ if (spinner) {
153
+ spinner.text = 'Checking dependencies...';
154
+ }
155
+ else {
156
+ console.log('๐Ÿ” Checking dependencies...');
157
+ }
138
158
  const packageJsonPath = path.join(process.cwd(), 'package.json');
139
159
  if (!fs.existsSync(packageJsonPath)) {
140
- throw new Error('No package.json found. Make sure you\'re in a valid Node.js project.');
160
+ throw new Error("No package.json found. Make sure you're in a valid Node.js project.");
141
161
  }
142
162
  const nodeModulesPath = path.join(process.cwd(), 'node_modules');
143
163
  if (!fs.existsSync(nodeModulesPath)) {
144
- spinner.text = 'Installing dependencies...';
164
+ if (spinner) {
165
+ spinner.text = 'Installing dependencies...';
166
+ }
167
+ else {
168
+ console.log('๐Ÿ“ฆ Installing dependencies...');
169
+ }
145
170
  await this.runCommand('npm', ['install'], { stdio: 'pipe' });
146
171
  }
147
172
  }
148
173
  async startTestServer(port, mainFile, verbose, spinner) {
149
- spinner.text = 'Starting test server...';
174
+ if (spinner) {
175
+ spinner.text = 'Starting test server...';
176
+ }
177
+ else {
178
+ console.log('๐Ÿš€ Starting test server...');
179
+ }
150
180
  const serverCliDir = path.join(__dirname, '..', '..', '..');
151
181
  const serverTemplatePath = path.join(serverCliDir, 'static', 'test-server-template.js');
152
182
  if (!fs.existsSync(serverTemplatePath)) {
@@ -154,29 +184,49 @@ let TestCommand = class TestCommand extends nest_commander_1.CommandRunner {
154
184
  }
155
185
  const scenariosPath = path.join(serverCliDir, 'scenarios');
156
186
  this.server = (0, child_process_1.spawn)('node', [serverTemplatePath], {
157
- stdio: verbose ? 'inherit' : 'pipe',
187
+ stdio: 'pipe',
158
188
  env: {
159
189
  ...process.env,
160
190
  NODE_ENV: 'development',
161
191
  RUNFLOW_PORT: port.toString(),
162
192
  RUNFLOW_MAIN_FILE: mainFile,
163
- RUNFLOW_SCENARIOS_PATH: scenariosPath
193
+ RUNFLOW_SCENARIOS_PATH: scenariosPath,
194
+ RUNFLOW_VERBOSE: verbose ? 'true' : 'false',
195
+ },
196
+ });
197
+ if (verbose) {
198
+ console.log(chalk_1.default.gray('[DEBUG] Verbose mode enabled - attaching log listeners'));
199
+ }
200
+ this.server.stdout?.on('data', (data) => {
201
+ const output = data.toString();
202
+ if (verbose) {
203
+ process.stdout.write(`[SERVER] ${output}`);
164
204
  }
165
205
  });
166
- if (!verbose) {
167
- this.server.stdout?.on('data', (data) => {
168
- });
169
- this.server.stderr?.on('data', (data) => {
170
- const error = data.toString().trim();
171
- if (error.includes('Error:') || error.includes('EADDRINUSE')) {
172
- console.error(chalk_1.default.red(`Server Error: ${error}`));
206
+ this.server.stderr?.on('data', (data) => {
207
+ const error = data.toString();
208
+ if (verbose) {
209
+ process.stderr.write(`[SERVER-ERR] ${error}`);
210
+ }
211
+ else {
212
+ const trimmed = error.trim();
213
+ if (trimmed.includes('Error:') || trimmed.includes('EADDRINUSE')) {
214
+ console.error(chalk_1.default.red(`Server Error: ${trimmed}`));
173
215
  }
174
- });
175
- }
216
+ }
217
+ });
218
+ this.server.on('error', (error) => {
219
+ console.error(chalk_1.default.red(`Failed to start server: ${error.message}`));
220
+ });
176
221
  await this.waitForServer(port, 10000);
177
222
  }
178
223
  async startFrontend(frontendPort, backendPort, verbose, spinner) {
179
- spinner.text = 'Starting frontend...';
224
+ if (spinner) {
225
+ spinner.text = 'Starting frontend...';
226
+ }
227
+ else {
228
+ console.log('๐ŸŽจ Starting frontend...');
229
+ }
180
230
  const cliRootDir = path.join(__dirname, '..', '..', '..');
181
231
  const staticDir = path.join(cliRootDir, 'static');
182
232
  if (!fs.existsSync(staticDir)) {
@@ -200,14 +250,27 @@ let TestCommand = class TestCommand extends nest_commander_1.CommandRunner {
200
250
  throw new Error('Frontend server template not found. Please ensure the CLI is properly installed.');
201
251
  }
202
252
  this.frontend = (0, child_process_1.spawn)('node', [frontendTemplatePath], {
203
- stdio: verbose ? 'inherit' : 'pipe',
253
+ stdio: 'pipe',
204
254
  env: {
205
255
  ...process.env,
206
256
  NODE_ENV: 'development',
207
257
  RUNFLOW_FRONTEND_PORT: frontendPort.toString(),
208
- RUNFLOW_STATIC_DIR: frontendDir
258
+ RUNFLOW_STATIC_DIR: frontendDir,
259
+ },
260
+ });
261
+ this.frontend.stdout?.on('data', (data) => {
262
+ if (verbose) {
263
+ process.stdout.write(data.toString());
264
+ }
265
+ });
266
+ this.frontend.stderr?.on('data', (data) => {
267
+ if (verbose) {
268
+ process.stderr.write(data.toString());
209
269
  }
210
270
  });
271
+ this.frontend.on('error', (error) => {
272
+ console.error(chalk_1.default.red(`Failed to start frontend: ${error.message}`));
273
+ });
211
274
  await this.waitForServer(frontendPort, 5000);
212
275
  }
213
276
  async waitForServer(port, timeout) {
@@ -221,7 +284,7 @@ let TestCommand = class TestCommand extends nest_commander_1.CommandRunner {
221
284
  }
222
285
  catch (error) {
223
286
  }
224
- await new Promise(resolve => setTimeout(resolve, 500));
287
+ await new Promise((resolve) => setTimeout(resolve, 500));
225
288
  }
226
289
  throw new Error(`Server on port ${port} failed to start`);
227
290
  }
@@ -240,9 +303,12 @@ let TestCommand = class TestCommand extends nest_commander_1.CommandRunner {
240
303
  });
241
304
  }
242
305
  openBrowser(url) {
243
- const start = process.platform === 'darwin' ? 'open' :
244
- process.platform === 'win32' ? 'start' : 'xdg-open';
245
- (0, child_process_1.spawn)(start, [url], { detached: true, stdio: 'ignore' });
306
+ const start = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';
307
+ const spawnOptions = { detached: true, stdio: 'ignore' };
308
+ if (process.platform === 'win32') {
309
+ spawnOptions.shell = true;
310
+ }
311
+ (0, child_process_1.spawn)(start, [url], spawnOptions);
246
312
  }
247
313
  setupCleanupHandlers() {
248
314
  const cleanup = async () => {
@@ -301,7 +367,7 @@ __decorate([
301
367
  __decorate([
302
368
  (0, nest_commander_1.Option)({
303
369
  flags: '--no-open',
304
- description: 'Don\'t open browser automatically',
370
+ description: "Don't open browser automatically",
305
371
  }),
306
372
  __metadata("design:type", Function),
307
373
  __metadata("design:paramtypes", []),
@@ -313,14 +379,14 @@ __decorate([
313
379
  description: 'Show detailed logs',
314
380
  }),
315
381
  __metadata("design:type", Function),
316
- __metadata("design:paramtypes", []),
382
+ __metadata("design:paramtypes", [String]),
317
383
  __metadata("design:returntype", Boolean)
318
384
  ], TestCommand.prototype, "parseVerbose", null);
319
385
  exports.TestCommand = TestCommand = __decorate([
320
386
  (0, common_1.Injectable)(),
321
387
  (0, nest_commander_1.Command)({
322
388
  name: 'test',
323
- description: '๐Ÿงช Start local test server for Runflow agents with live reload'
389
+ description: '๐Ÿงช Start local test server for Runflow agents with live reload',
324
390
  })
325
391
  ], TestCommand);
326
392
  //# sourceMappingURL=test.command.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"test.command.js","sourceRoot":"","sources":["../../../src/commands/test/test.command.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test.command.js","sourceRoot":"","sources":["../../../src/commands/test/test.command.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runflow-ai/cli",
3
- "version": "0.2.7",
3
+ "version": "0.2.8",
4
4
  "description": "Official CLI for RunFlow AI platform - manage agents, deploy code, and interact with AI workflows from your terminal",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -11,35 +11,43 @@ app.use(express.json());
11
11
  // Configuraรงรฃo serรก injetada pela CLI
12
12
  const CONFIG = {
13
13
  port: process.env.RUNFLOW_PORT || 8547,
14
- mainFile: process.env.RUNFLOW_MAIN_FILE || 'main.ts'
14
+ mainFile: process.env.RUNFLOW_MAIN_FILE || 'main.ts',
15
+ verbose: process.env.RUNFLOW_VERBOSE === 'true',
15
16
  };
16
17
 
18
+ // Log de inicializaรงรฃo
19
+ console.log('๐Ÿš€ [INIT] Test server starting...');
20
+ console.log('๐Ÿ”ง [CONFIG]', CONFIG);
21
+ if (CONFIG.verbose) {
22
+ console.log('๐Ÿ“ [VERBOSE] Verbose mode is ENABLED');
23
+ }
24
+
17
25
  // ============================================================================
18
26
  // Load rf.json (agent configuration)
19
27
  // ============================================================================
20
28
 
21
29
  function loadRfConfig() {
22
30
  const rfConfigPath = path.join(process.cwd(), '.runflow', 'rf.json');
23
-
31
+
24
32
  if (fs.existsSync(rfConfigPath)) {
25
33
  try {
26
34
  const config = JSON.parse(fs.readFileSync(rfConfigPath, 'utf8'));
27
35
  console.log('โœ… Loaded rf.json:', {
28
36
  agentId: config.agentId,
29
37
  tenantId: config.tenantId,
30
- apiUrl: config.apiUrl
38
+ apiUrl: config.apiUrl,
31
39
  });
32
40
  return config;
33
41
  } catch (error) {
34
42
  console.warn('โš ๏ธ Could not parse rf.json:', error.message);
35
43
  }
36
44
  }
37
-
45
+
38
46
  console.warn('โš ๏ธ No rf.json found - using defaults');
39
47
  return {
40
48
  agentId: 'local-agent',
41
49
  tenantId: 'test-local',
42
- apiUrl: 'http://localhost:3001'
50
+ apiUrl: 'http://localhost:3001',
43
51
  };
44
52
  }
45
53
 
@@ -59,34 +67,34 @@ function generateRandomId() {
59
67
 
60
68
  function generateThreadId(input) {
61
69
  const companyId = input.companyId || 'test';
62
-
70
+
63
71
  // 1. Explicit
64
72
  if (input.entityType && input.entityValue) {
65
73
  const cleanValue = String(input.entityValue).replace(/[^a-zA-Z0-9]/g, '_');
66
74
  return `${input.entityType}_${companyId}_${cleanValue}`;
67
75
  }
68
-
76
+
69
77
  // 2. SessionId
70
78
  if (input.sessionId) {
71
79
  return `session_${companyId}_${input.sessionId}`;
72
80
  }
73
-
81
+
74
82
  // 3. Phone (WhatsApp/Twilio)
75
83
  if (input.metadata?.phone || input.metadata?.From) {
76
84
  const phone = (input.metadata.phone || input.metadata.From).replace(/\D/g, '');
77
85
  return `phone_${companyId}_${phone}`;
78
86
  }
79
-
87
+
80
88
  // 4. Email
81
89
  if (input.metadata?.email) {
82
90
  return `email_${companyId}_${input.metadata.email}`;
83
91
  }
84
-
92
+
85
93
  // 5. ContactId (HubSpot)
86
94
  if (input.metadata?.contactId) {
87
95
  return `hubspot_contact_${companyId}_${input.metadata.contactId}`;
88
96
  }
89
-
97
+
90
98
  // 6. Fallback
91
99
  return `thread_${companyId}_${Date.now()}_${generateRandomId()}`;
92
100
  }
@@ -130,11 +138,11 @@ app.post('/api/chat', async (req, res) => {
130
138
  try {
131
139
  console.log('\n๐Ÿ“ฅ [Test] Received:', req.body.message);
132
140
  console.log('๐Ÿ”„ [Reload] Loading fresh code from', CONFIG.mainFile + '...');
133
-
141
+
134
142
  // ============================================================================
135
143
  // Generate Execution Context (simula Execution Engine)
136
144
  // ============================================================================
137
-
145
+
138
146
  const input = {
139
147
  message: req.body.message,
140
148
  sessionId: req.body.sessionId || `test_session_${Date.now()}`,
@@ -142,15 +150,15 @@ app.post('/api/chat', async (req, res) => {
142
150
  userId: req.body.userId,
143
151
  channel: req.body.channel || 'test',
144
152
  metadata: req.body.metadata || {},
145
- timestamp: new Date().toISOString()
153
+ timestamp: new Date().toISOString(),
146
154
  };
147
-
155
+
148
156
  const executionId = generateExecutionId();
149
157
  const threadId = generateThreadId(input);
150
158
  const entityType = inferEntityType(input);
151
159
  const entityValue = inferEntityValue(input);
152
160
  const userId = inferUserId(input);
153
-
161
+
154
162
  console.log('๐Ÿ” [Context Generated]:', {
155
163
  executionId,
156
164
  threadId,
@@ -158,12 +166,25 @@ app.post('/api/chat', async (req, res) => {
158
166
  entityValue: entityValue || '(none)',
159
167
  userId: userId || '(none)',
160
168
  });
161
-
169
+
162
170
  // Executar TypeScript diretamente com tsx
163
171
  const inputData = JSON.stringify(input);
164
172
 
165
- const tsxProcess = spawn('npx', ['tsx', '--eval', `
166
- import { main } from './${CONFIG.mainFile}';
173
+ if (CONFIG.verbose) {
174
+ console.log('\n๐Ÿ“ [Verbose] Executing:', CONFIG.mainFile);
175
+ console.log('๐Ÿ“ [Verbose] Input:', input);
176
+ console.log('๐Ÿ“ [Verbose] Working Directory:', process.cwd());
177
+ }
178
+
179
+ // Criar arquivo temporรกrio para execuรงรฃo (mais confiรกvel que --eval)
180
+ const tempDir = path.join(process.cwd(), '.runflow');
181
+ if (!fs.existsSync(tempDir)) {
182
+ fs.mkdirSync(tempDir, { recursive: true });
183
+ }
184
+
185
+ const tempFile = path.join(tempDir, `exec_${Date.now()}.ts`);
186
+ const tsxCode = `
187
+ import { main } from '../${CONFIG.mainFile}';
167
188
 
168
189
  const input = ${inputData};
169
190
 
@@ -174,11 +195,20 @@ main(input).then(result => {
174
195
  process.exit(0);
175
196
  }).catch(error => {
176
197
  console.log('๐Ÿ”ด RUNFLOW_ERROR_START');
177
- console.log(JSON.stringify({ error: error.message }));
198
+ console.log(JSON.stringify({ error: error.message, stack: error.stack }));
178
199
  console.log('๐Ÿ”ด RUNFLOW_ERROR_END');
179
200
  process.exit(1);
180
201
  });
181
- `], {
202
+ `;
203
+
204
+ fs.writeFileSync(tempFile, tsxCode);
205
+
206
+ if (CONFIG.verbose) {
207
+ console.log('\n๐Ÿ“œ [TSX Code written to]:', tempFile);
208
+ }
209
+
210
+ const tsxProcess = spawn('npx', ['tsx', tempFile], {
211
+ cwd: process.cwd(), // Executar no diretรณrio do projeto
182
212
  env: {
183
213
  ...process.env,
184
214
  // โœ… Passar context via env (igual Execution Engine)
@@ -191,9 +221,29 @@ main(input).then(result => {
191
221
  RUNFLOW_LOCAL_TRACES: 'true',
192
222
  RUNFLOW_ENV: 'development',
193
223
  },
194
- stdio: ['pipe', 'pipe', 'pipe']
224
+ stdio: ['pipe', 'pipe', 'pipe'], // Sempre pipe para capturar resultado
225
+ // No Windows, npx precisa de shell: true
226
+ shell: process.platform === 'win32',
195
227
  });
196
-
228
+
229
+ if (CONFIG.verbose) {
230
+ console.log('๐Ÿš€ [Process] tsx spawned with PID:', tsxProcess.pid);
231
+ }
232
+
233
+ // Cleanup: remover arquivo temporรกrio apรณs execuรงรฃo
234
+ const cleanupTempFile = () => {
235
+ try {
236
+ if (fs.existsSync(tempFile)) {
237
+ fs.unlinkSync(tempFile);
238
+ if (CONFIG.verbose) {
239
+ console.log('๐Ÿ—‘๏ธ [Cleanup] Temp file removed');
240
+ }
241
+ }
242
+ } catch (e) {
243
+ // Ignorar erros de cleanup
244
+ }
245
+ };
246
+
197
247
  let output = '';
198
248
  let errorOutput = '';
199
249
  let hasResponded = false;
@@ -201,7 +251,7 @@ main(input).then(result => {
201
251
  let isCapturingError = false;
202
252
  let resultLines = [];
203
253
  let errorLines = [];
204
-
254
+
205
255
  // Processar saรญda linha por linha
206
256
  const processLine = (line) => {
207
257
  if (line.includes('๐Ÿ”ต RUNFLOW_RESULT_START')) {
@@ -209,15 +259,15 @@ main(input).then(result => {
209
259
  resultLines = [];
210
260
  return;
211
261
  }
212
-
262
+
213
263
  if (line.includes('๐Ÿ”ต RUNFLOW_RESULT_END')) {
214
264
  isCapturingResult = false;
215
-
265
+
216
266
  if (!hasResponded && resultLines.length > 0) {
217
267
  try {
218
268
  const jsonResult = JSON.parse(resultLines.join('\n'));
219
269
  console.log('โœ… [Result Captured]:', jsonResult);
220
-
270
+
221
271
  res.json({
222
272
  success: true,
223
273
  data: jsonResult,
@@ -229,7 +279,7 @@ main(input).then(result => {
229
279
  entityValue,
230
280
  userId,
231
281
  },
232
- timestamp: new Date().toISOString()
282
+ timestamp: new Date().toISOString(),
233
283
  });
234
284
  hasResponded = true;
235
285
  console.log('โœ… [Response] Sent to frontend successfully');
@@ -239,25 +289,25 @@ main(input).then(result => {
239
289
  }
240
290
  return;
241
291
  }
242
-
292
+
243
293
  if (line.includes('๐Ÿ”ด RUNFLOW_ERROR_START')) {
244
294
  isCapturingError = true;
245
295
  errorLines = [];
246
296
  return;
247
297
  }
248
-
298
+
249
299
  if (line.includes('๐Ÿ”ด RUNFLOW_ERROR_END')) {
250
300
  isCapturingError = false;
251
-
301
+
252
302
  if (!hasResponded && errorLines.length > 0) {
253
303
  try {
254
304
  const errorResult = JSON.parse(errorLines.join('\n'));
255
305
  console.log('โŒ [Error Captured]:', errorResult);
256
-
306
+
257
307
  res.status(500).json({
258
308
  success: false,
259
309
  error: errorResult.error,
260
- timestamp: new Date().toISOString()
310
+ timestamp: new Date().toISOString(),
261
311
  });
262
312
  hasResponded = true;
263
313
  } catch (e) {
@@ -266,7 +316,7 @@ main(input).then(result => {
266
316
  }
267
317
  return;
268
318
  }
269
-
319
+
270
320
  if (isCapturingResult) {
271
321
  resultLines.push(line);
272
322
  } else if (isCapturingError) {
@@ -274,35 +324,58 @@ main(input).then(result => {
274
324
  }
275
325
  };
276
326
 
277
- tsxProcess.stdout.on('data', (data) => {
327
+ // Sempre capturar output, mas sรณ mostrar logs detalhados se verbose
328
+ tsxProcess.stdout?.on('data', (data) => {
278
329
  const chunk = data.toString();
279
- console.log('๐Ÿ“ค [stdout]:', chunk.trim());
330
+ if (CONFIG.verbose) {
331
+ console.log('๐Ÿ“ค [TSX stdout]:', chunk.trim());
332
+ }
280
333
  output += chunk;
281
-
334
+
282
335
  const lines = chunk.split('\n');
283
- lines.forEach(line => {
336
+ lines.forEach((line) => {
284
337
  if (line.trim()) {
285
338
  processLine(line.trim());
286
339
  }
287
340
  });
288
341
  });
289
-
290
- tsxProcess.stderr.on('data', (data) => {
342
+
343
+ tsxProcess.stderr?.on('data', (data) => {
291
344
  const chunk = data.toString();
292
- console.log('๐Ÿ“ค [stderr]:', chunk.trim());
345
+ if (CONFIG.verbose) {
346
+ console.log('๐Ÿ“ค [TSX stderr]:', chunk.trim());
347
+ }
293
348
  errorOutput += chunk;
294
349
  });
295
350
 
351
+ tsxProcess.on('error', (error) => {
352
+ console.error('โŒ [Process Error]:', error.message);
353
+ if (!hasResponded) {
354
+ res.status(500).json({
355
+ success: false,
356
+ error: `Failed to execute: ${error.message}`,
357
+ timestamp: new Date().toISOString(),
358
+ });
359
+ hasResponded = true;
360
+ }
361
+ });
362
+
296
363
  tsxProcess.on('close', (code) => {
297
- console.log('๐Ÿ”š [Process] Closed with code:', code);
298
-
364
+ cleanupTempFile(); // Limpar arquivo temporรกrio
365
+
366
+ if (CONFIG.verbose) {
367
+ console.log('๐Ÿ”š [Process] Closed with code:', code);
368
+ console.log('๐Ÿ“Š [Captured Output]:', output.substring(0, 500)); // Primeiros 500 chars
369
+ console.log('๐Ÿ“Š [Captured Error]:', errorOutput.substring(0, 500));
370
+ }
371
+
299
372
  if (!hasResponded) {
300
373
  console.log('โš ๏ธ [Fallback] No structured response captured');
301
-
374
+
302
375
  if (code === 0) {
303
376
  const lines = output.trim().split('\n');
304
377
  let jsonResult = null;
305
-
378
+
306
379
  for (let i = lines.length - 1; i >= 0; i--) {
307
380
  const line = lines[i].trim();
308
381
  if (line.startsWith('{') && line.endsWith('}')) {
@@ -315,48 +388,47 @@ main(input).then(result => {
315
388
  }
316
389
  }
317
390
  }
318
-
391
+
319
392
  if (jsonResult) {
320
393
  res.json({
321
394
  success: true,
322
395
  data: jsonResult,
323
- timestamp: new Date().toISOString()
396
+ timestamp: new Date().toISOString(),
324
397
  });
325
398
  } else {
326
399
  res.json({
327
400
  success: true,
328
401
  data: { message: 'Process completed but no result captured' },
329
- timestamp: new Date().toISOString()
402
+ timestamp: new Date().toISOString(),
330
403
  });
331
404
  }
332
405
  } else {
333
406
  res.status(500).json({
334
407
  success: false,
335
408
  error: errorOutput || `Process failed with code ${code}`,
336
- timestamp: new Date().toISOString()
409
+ timestamp: new Date().toISOString(),
337
410
  });
338
411
  }
339
412
  }
340
413
  });
341
-
342
414
  } catch (error) {
343
415
  console.error('โŒ [Test] Error:', error.message);
344
-
416
+
345
417
  res.status(500).json({
346
418
  success: false,
347
419
  error: error.message,
348
- timestamp: new Date().toISOString()
420
+ timestamp: new Date().toISOString(),
349
421
  });
350
422
  }
351
423
  });
352
424
 
353
425
  // Health check
354
426
  app.get('/api/health', (req, res) => {
355
- res.json({
356
- status: 'ok',
427
+ res.json({
428
+ status: 'ok',
357
429
  timestamp: new Date().toISOString(),
358
430
  agent: CONFIG.mainFile,
359
- type: 'test-server'
431
+ type: 'test-servers',
360
432
  });
361
433
  });
362
434
 
@@ -364,17 +436,17 @@ app.get('/api/health', (req, res) => {
364
436
  app.get('/api/scenarios', (req, res) => {
365
437
  const fs = require('fs');
366
438
  const path = require('path');
367
-
439
+
368
440
  const scenarios = [];
369
-
441
+
370
442
  // 1. Load CLI default scenarios
371
443
  try {
372
444
  const cliScenariosPath = process.env.RUNFLOW_SCENARIOS_PATH;
373
-
445
+
374
446
  if (cliScenariosPath && fs.existsSync(cliScenariosPath)) {
375
- const files = fs.readdirSync(cliScenariosPath).filter(f => f.endsWith('.json'));
376
-
377
- files.forEach(file => {
447
+ const files = fs.readdirSync(cliScenariosPath).filter((f) => f.endsWith('.json'));
448
+
449
+ files.forEach((file) => {
378
450
  try {
379
451
  const content = JSON.parse(fs.readFileSync(path.join(cliScenariosPath, file), 'utf8'));
380
452
  scenarios.push({ ...content, source: 'cli', id: file.replace('.json', '') });
@@ -386,15 +458,17 @@ app.get('/api/scenarios', (req, res) => {
386
458
  } catch (error) {
387
459
  console.error('Error loading CLI scenarios:', error.message);
388
460
  }
389
-
461
+
390
462
  // 2. Load project custom scenarios
391
463
  try {
392
464
  const projectScenariosPath = path.join(process.cwd(), 'test-scenarios');
393
465
  if (fs.existsSync(projectScenariosPath)) {
394
- const files = fs.readdirSync(projectScenariosPath).filter(f => f.endsWith('.json'));
395
- files.forEach(file => {
466
+ const files = fs.readdirSync(projectScenariosPath).filter((f) => f.endsWith('.json'));
467
+ files.forEach((file) => {
396
468
  try {
397
- const content = JSON.parse(fs.readFileSync(path.join(projectScenariosPath, file), 'utf8'));
469
+ const content = JSON.parse(
470
+ fs.readFileSync(path.join(projectScenariosPath, file), 'utf8'),
471
+ );
398
472
  scenarios.push({ ...content, source: 'project', id: file.replace('.json', '') });
399
473
  } catch (e) {
400
474
  console.error('Error loading project scenario ' + file + ':', e.message);
@@ -404,7 +478,7 @@ app.get('/api/scenarios', (req, res) => {
404
478
  } catch (error) {
405
479
  console.error('Error loading project scenarios:', error.message);
406
480
  }
407
-
481
+
408
482
  res.json({ scenarios });
409
483
  });
410
484
 
@@ -419,22 +493,22 @@ app.get('/api/scenarios', (req, res) => {
419
493
  app.get('/api/traces', (req, res) => {
420
494
  try {
421
495
  const tracesFile = path.join(process.cwd(), '.runflow', 'traces.json');
422
-
496
+
423
497
  if (!fs.existsSync(tracesFile)) {
424
- return res.json({
425
- threads: [],
498
+ return res.json({
499
+ threads: [],
426
500
  total: 0,
427
- message: 'No traces yet. Run your agent to generate traces.'
501
+ message: 'No traces yet. Run your agent to generate traces.',
428
502
  });
429
503
  }
430
-
504
+
431
505
  const data = JSON.parse(fs.readFileSync(tracesFile, 'utf-8'));
432
-
506
+
433
507
  // Group executions by threadId
434
508
  const threadMap = {};
435
- Object.values(data.executions || {}).forEach(execution => {
509
+ Object.values(data.executions || {}).forEach((execution) => {
436
510
  const threadId = execution.threadId || 'unknown';
437
-
511
+
438
512
  if (!threadMap[threadId]) {
439
513
  threadMap[threadId] = {
440
514
  threadId,
@@ -445,23 +519,24 @@ app.get('/api/traces', (req, res) => {
445
519
  lastActivity: execution.startedAt,
446
520
  };
447
521
  }
448
-
522
+
449
523
  threadMap[threadId].executions.push(execution);
450
524
  threadMap[threadId].totalTraces += execution.traces?.length || 0;
451
-
525
+
452
526
  // Update last activity
453
527
  if (execution.startedAt > threadMap[threadId].lastActivity) {
454
528
  threadMap[threadId].lastActivity = execution.startedAt;
455
529
  }
456
530
  });
457
-
458
- const threads = Object.values(threadMap)
459
- .sort((a, b) => new Date(b.lastActivity) - new Date(a.lastActivity));
460
-
461
- res.json({
531
+
532
+ const threads = Object.values(threadMap).sort(
533
+ (a, b) => new Date(b.lastActivity) - new Date(a.lastActivity),
534
+ );
535
+
536
+ res.json({
462
537
  threads,
463
538
  total: threads.length,
464
- totalTraces: data.traces?.length || 0
539
+ totalTraces: data.traces?.length || 0,
465
540
  });
466
541
  } catch (error) {
467
542
  console.error('โŒ Error reading traces:', error);
@@ -476,27 +551,27 @@ app.get('/api/traces', (req, res) => {
476
551
  app.get('/api/traces/executions/:executionId', (req, res) => {
477
552
  try {
478
553
  const tracesFile = path.join(process.cwd(), '.runflow', 'traces.json');
479
-
554
+
480
555
  if (!fs.existsSync(tracesFile)) {
481
556
  return res.status(404).json({ error: 'Execution not found' });
482
557
  }
483
-
558
+
484
559
  const data = JSON.parse(fs.readFileSync(tracesFile, 'utf-8'));
485
560
  const execution = data.executions?.[req.params.executionId];
486
-
561
+
487
562
  if (!execution) {
488
563
  return res.status(404).json({ error: 'Execution not found' });
489
564
  }
490
-
565
+
491
566
  // Build hierarchy of traces
492
567
  const traceMap = new Map();
493
568
  const rootTraces = [];
494
-
495
- execution.traces.forEach(trace => {
569
+
570
+ execution.traces.forEach((trace) => {
496
571
  traceMap.set(trace.traceId, { ...trace, children: [] });
497
572
  });
498
-
499
- execution.traces.forEach(trace => {
573
+
574
+ execution.traces.forEach((trace) => {
500
575
  const node = traceMap.get(trace.traceId);
501
576
  if (trace.parentTraceId) {
502
577
  const parent = traceMap.get(trace.parentTraceId);
@@ -509,7 +584,7 @@ app.get('/api/traces/executions/:executionId', (req, res) => {
509
584
  rootTraces.push(node);
510
585
  }
511
586
  });
512
-
587
+
513
588
  res.json({
514
589
  execution: {
515
590
  executionId: execution.executionId,
@@ -535,15 +610,15 @@ app.get('/api/traces/executions/:executionId', (req, res) => {
535
610
  app.delete('/api/traces', (req, res) => {
536
611
  try {
537
612
  const tracesFile = path.join(process.cwd(), '.runflow', 'traces.json');
538
-
613
+
539
614
  if (fs.existsSync(tracesFile)) {
540
615
  fs.unlinkSync(tracesFile);
541
616
  console.log('๐Ÿ—‘๏ธ Local traces cleared');
542
617
  }
543
-
544
- res.json({
618
+
619
+ res.json({
545
620
  success: true,
546
- message: 'Local traces cleared successfully'
621
+ message: 'Local traces cleared successfully',
547
622
  });
548
623
  } catch (error) {
549
624
  console.error('โŒ Error clearing traces:', error);
@@ -552,7 +627,12 @@ app.delete('/api/traces', (req, res) => {
552
627
  });
553
628
 
554
629
  app.listen(CONFIG.port, () => {
555
- console.log('โœ… Test server ready on port', CONFIG.port);
630
+ console.log('โœ… [READY] Test server ready on port', CONFIG.port);
631
+ console.log('๐Ÿ“‚ [CWD]', process.cwd());
632
+ console.log('๐Ÿ“„ [MAIN]', CONFIG.mainFile);
633
+ if (CONFIG.verbose) {
634
+ console.log('๐Ÿ” [VERBOSE] All logs will be shown');
635
+ }
556
636
  });
557
637
 
558
638
  process.on('SIGINT', () => {