vent-hq 0.4.1 → 0.4.3
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/dist/index.mjs +53 -47
- package/dist/package-3V3224B6.mjs +51 -0
- package/dist/package-LQLI2UW5.mjs +51 -0
- package/dist/package-U367OB7H.mjs +51 -0
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -373,23 +373,23 @@ var bold = (s) => isTTY ? `\x1B[1m${s}\x1B[0m` : s;
|
|
|
373
373
|
var dim = (s) => isTTY ? `\x1B[2m${s}\x1B[0m` : s;
|
|
374
374
|
var green = (s) => isTTY ? `\x1B[32m${s}\x1B[0m` : s;
|
|
375
375
|
var red = (s) => isTTY ? `\x1B[31m${s}\x1B[0m` : s;
|
|
376
|
-
var yellow = (s) => isTTY ? `\x1B[33m${s}\x1B[0m` : s;
|
|
377
376
|
var blue = (s) => isTTY ? `\x1B[34m${s}\x1B[0m` : s;
|
|
378
377
|
function printEvent(event, jsonMode) {
|
|
379
378
|
if (jsonMode) {
|
|
380
379
|
process.stdout.write(JSON.stringify(event) + "\n");
|
|
381
380
|
return;
|
|
382
381
|
}
|
|
382
|
+
const meta = event.metadata_json ?? {};
|
|
383
383
|
switch (event.event_type) {
|
|
384
384
|
case "test_completed":
|
|
385
|
-
printTestResult(
|
|
385
|
+
printTestResult(meta);
|
|
386
386
|
break;
|
|
387
387
|
case "run_complete":
|
|
388
|
-
printRunComplete(
|
|
388
|
+
printRunComplete(meta);
|
|
389
389
|
break;
|
|
390
390
|
case "test_started":
|
|
391
391
|
if (isTTY) {
|
|
392
|
-
const name =
|
|
392
|
+
const name = meta.test_name ?? "test";
|
|
393
393
|
process.stderr.write(dim(` \u25B8 ${name}\u2026`) + "\n");
|
|
394
394
|
}
|
|
395
395
|
break;
|
|
@@ -399,31 +399,28 @@ function printEvent(event, jsonMode) {
|
|
|
399
399
|
}
|
|
400
400
|
}
|
|
401
401
|
}
|
|
402
|
-
function printTestResult(
|
|
403
|
-
const result =
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
const name = result.name ?? "test";
|
|
412
|
-
const duration = result.duration_ms != null ? (result.duration_ms / 1e3).toFixed(1) + "s" : "\u2014";
|
|
413
|
-
const parts = [status, bold(name), dim(duration)];
|
|
414
|
-
if (result.behavior?.intent_accuracy) {
|
|
402
|
+
function printTestResult(meta) {
|
|
403
|
+
const result = meta.result;
|
|
404
|
+
const testName = result?.name ?? meta.test_name ?? "test";
|
|
405
|
+
const testStatus = result?.status ?? meta.status;
|
|
406
|
+
const durationMs = result?.duration_ms ?? meta.duration_ms;
|
|
407
|
+
const statusIcon = testStatus === "completed" || testStatus === "pass" ? green("\u2714") : red("\u2718");
|
|
408
|
+
const duration = durationMs != null ? (durationMs / 1e3).toFixed(1) + "s" : "\u2014";
|
|
409
|
+
const parts = [statusIcon, bold(testName), dim(duration)];
|
|
410
|
+
if (result?.behavior?.intent_accuracy) {
|
|
415
411
|
parts.push(`intent: ${result.behavior.intent_accuracy.score}`);
|
|
416
412
|
}
|
|
417
|
-
if (result
|
|
413
|
+
if (result?.latency?.p50_ttfw_ms != null) {
|
|
418
414
|
parts.push(`p50: ${result.latency.p50_ttfw_ms}ms`);
|
|
419
415
|
}
|
|
420
416
|
process.stdout.write(parts.join(" ") + "\n");
|
|
421
417
|
}
|
|
422
|
-
function printRunComplete(
|
|
423
|
-
const status =
|
|
424
|
-
const
|
|
425
|
-
const
|
|
426
|
-
const
|
|
418
|
+
function printRunComplete(meta) {
|
|
419
|
+
const status = meta.status;
|
|
420
|
+
const agg = meta.aggregate;
|
|
421
|
+
const total = meta.total_tests ?? agg?.conversation_tests?.total;
|
|
422
|
+
const passed = meta.passed_tests ?? agg?.conversation_tests?.passed;
|
|
423
|
+
const failed = meta.failed_tests ?? agg?.conversation_tests?.failed;
|
|
427
424
|
process.stdout.write("\n");
|
|
428
425
|
if (status === "pass") {
|
|
429
426
|
process.stdout.write(green(bold("Run passed")) + "\n");
|
|
@@ -441,27 +438,31 @@ function printRunComplete(data) {
|
|
|
441
438
|
function printSummary(testResults, runComplete, runId, jsonMode) {
|
|
442
439
|
if (jsonMode) {
|
|
443
440
|
const failedTests = testResults.filter((e) => {
|
|
444
|
-
const
|
|
445
|
-
|
|
441
|
+
const meta = e.metadata_json ?? {};
|
|
442
|
+
const r = meta.result;
|
|
443
|
+
const status = r?.status ?? meta.status;
|
|
444
|
+
return status && status !== "completed" && status !== "pass";
|
|
446
445
|
}).map((e) => {
|
|
447
|
-
const
|
|
446
|
+
const meta = e.metadata_json ?? {};
|
|
447
|
+
const r = meta.result;
|
|
448
448
|
return {
|
|
449
|
-
name: r.
|
|
450
|
-
status: r.status,
|
|
451
|
-
duration_ms: r.duration_ms,
|
|
452
|
-
intent_accuracy: r
|
|
453
|
-
p50_ttfw_ms: r
|
|
449
|
+
name: r?.name ?? meta.test_name ?? "test",
|
|
450
|
+
status: r?.status ?? meta.status,
|
|
451
|
+
duration_ms: r?.duration_ms ?? meta.duration_ms,
|
|
452
|
+
intent_accuracy: r?.behavior?.intent_accuracy?.score,
|
|
453
|
+
p50_ttfw_ms: r?.latency?.p50_ttfw_ms
|
|
454
454
|
};
|
|
455
455
|
});
|
|
456
|
+
const agg = runComplete.aggregate;
|
|
456
457
|
process.stdout.write(
|
|
457
458
|
JSON.stringify({
|
|
458
459
|
event_type: "summary",
|
|
459
460
|
data: {
|
|
460
461
|
run_id: runId,
|
|
461
462
|
status: runComplete.status,
|
|
462
|
-
total: runComplete.total_tests,
|
|
463
|
-
passed: runComplete.passed_tests,
|
|
464
|
-
failed: runComplete.failed_tests,
|
|
463
|
+
total: runComplete.total_tests ?? agg?.conversation_tests?.total,
|
|
464
|
+
passed: runComplete.passed_tests ?? agg?.conversation_tests?.passed,
|
|
465
|
+
failed: runComplete.failed_tests ?? agg?.conversation_tests?.failed,
|
|
465
466
|
failed_tests: failedTests,
|
|
466
467
|
check: `npx vent-hq status ${runId} --json`
|
|
467
468
|
}
|
|
@@ -470,17 +471,21 @@ function printSummary(testResults, runComplete, runId, jsonMode) {
|
|
|
470
471
|
return;
|
|
471
472
|
}
|
|
472
473
|
const failures = testResults.filter((e) => {
|
|
473
|
-
const
|
|
474
|
-
|
|
474
|
+
const meta = e.metadata_json ?? {};
|
|
475
|
+
const r = meta.result;
|
|
476
|
+
const status = r?.status ?? meta.status;
|
|
477
|
+
return status && status !== "completed" && status !== "pass";
|
|
475
478
|
});
|
|
476
479
|
if (failures.length > 0) {
|
|
477
480
|
process.stdout.write("\n" + bold("Failed tests:") + "\n");
|
|
478
481
|
for (const event of failures) {
|
|
479
|
-
const
|
|
480
|
-
const
|
|
481
|
-
const
|
|
482
|
+
const meta = event.metadata_json ?? {};
|
|
483
|
+
const r = meta.result;
|
|
484
|
+
const name = r?.name ?? meta.test_name ?? "test";
|
|
485
|
+
const durationMs = r?.duration_ms ?? meta.duration_ms;
|
|
486
|
+
const duration = durationMs != null ? (durationMs / 1e3).toFixed(1) + "s" : "\u2014";
|
|
482
487
|
const parts = [red("\u2718"), bold(name), dim(duration)];
|
|
483
|
-
if (r
|
|
488
|
+
if (r?.behavior?.intent_accuracy) {
|
|
484
489
|
parts.push(`intent: ${r.behavior.intent_accuracy.score}`);
|
|
485
490
|
}
|
|
486
491
|
process.stdout.write(" " + parts.join(" ") + "\n");
|
|
@@ -493,10 +498,8 @@ function printError(message) {
|
|
|
493
498
|
`);
|
|
494
499
|
}
|
|
495
500
|
function printInfo(message) {
|
|
496
|
-
|
|
497
|
-
process.stderr.write(blue("\u25B8") + ` ${message}
|
|
501
|
+
process.stderr.write(blue("\u25B8") + ` ${message}
|
|
498
502
|
`);
|
|
499
|
-
}
|
|
500
503
|
}
|
|
501
504
|
function printSuccess(message) {
|
|
502
505
|
process.stderr.write(green("\u2714") + ` ${message}
|
|
@@ -596,6 +599,7 @@ async function runCommand(args) {
|
|
|
596
599
|
return 2;
|
|
597
600
|
}
|
|
598
601
|
}
|
|
602
|
+
printInfo(`Streaming results for run ${run_id}\u2026`);
|
|
599
603
|
const abortController = new AbortController();
|
|
600
604
|
let exitCode = 0;
|
|
601
605
|
const testResults = [];
|
|
@@ -612,8 +616,9 @@ async function runCommand(args) {
|
|
|
612
616
|
testResults.push(event);
|
|
613
617
|
}
|
|
614
618
|
if (event.event_type === "run_complete") {
|
|
615
|
-
|
|
616
|
-
|
|
619
|
+
const meta = event.metadata_json ?? {};
|
|
620
|
+
runCompleteData = meta;
|
|
621
|
+
const status = meta.status;
|
|
617
622
|
exitCode = status === "pass" ? 0 : 1;
|
|
618
623
|
}
|
|
619
624
|
}
|
|
@@ -5277,7 +5282,8 @@ async function streamStatus(runId, apiKey, json) {
|
|
|
5277
5282
|
for await (const event of streamRunEvents(runId, apiKey)) {
|
|
5278
5283
|
printEvent(event, json);
|
|
5279
5284
|
if (event.event_type === "run_complete") {
|
|
5280
|
-
const
|
|
5285
|
+
const meta = event.metadata_json ?? {};
|
|
5286
|
+
const status = meta.status;
|
|
5281
5287
|
exitCode = status === "pass" ? 0 : 1;
|
|
5282
5288
|
}
|
|
5283
5289
|
}
|
|
@@ -6260,7 +6266,7 @@ async function main() {
|
|
|
6260
6266
|
process.exit(0);
|
|
6261
6267
|
}
|
|
6262
6268
|
if (command === "--version" || command === "-v") {
|
|
6263
|
-
const pkg = await import("./package-
|
|
6269
|
+
const pkg = await import("./package-LQLI2UW5.mjs");
|
|
6264
6270
|
process.stdout.write(`vent-hq ${pkg.default.version}
|
|
6265
6271
|
`);
|
|
6266
6272
|
process.exit(0);
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import "./chunk-U4M3XDTH.mjs";
|
|
3
|
+
|
|
4
|
+
// package.json
|
|
5
|
+
var package_default = {
|
|
6
|
+
name: "vent-hq",
|
|
7
|
+
version: "0.4.2",
|
|
8
|
+
type: "module",
|
|
9
|
+
description: "Vent CLI \u2014 CI/CD for voice AI agents",
|
|
10
|
+
bin: {
|
|
11
|
+
"vent-hq": "dist/index.mjs"
|
|
12
|
+
},
|
|
13
|
+
files: [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
scripts: {
|
|
17
|
+
build: "node scripts/bundle.mjs",
|
|
18
|
+
clean: "rm -rf dist"
|
|
19
|
+
},
|
|
20
|
+
keywords: [
|
|
21
|
+
"vent",
|
|
22
|
+
"cli",
|
|
23
|
+
"voice",
|
|
24
|
+
"agent",
|
|
25
|
+
"testing",
|
|
26
|
+
"ci-cd"
|
|
27
|
+
],
|
|
28
|
+
license: "MIT",
|
|
29
|
+
publishConfig: {
|
|
30
|
+
access: "public"
|
|
31
|
+
},
|
|
32
|
+
repository: {
|
|
33
|
+
type: "git",
|
|
34
|
+
url: "https://github.com/vent-hq/vent",
|
|
35
|
+
directory: "packages/cli"
|
|
36
|
+
},
|
|
37
|
+
homepage: "https://ventmcp.dev",
|
|
38
|
+
dependencies: {
|
|
39
|
+
"@clack/prompts": "^1.1.0",
|
|
40
|
+
ws: "^8.18.0"
|
|
41
|
+
},
|
|
42
|
+
devDependencies: {
|
|
43
|
+
"@types/ws": "^8.5.0",
|
|
44
|
+
"@vent/relay-client": "workspace:*",
|
|
45
|
+
"@vent/shared": "workspace:*",
|
|
46
|
+
esbuild: "^0.24.0"
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
export {
|
|
50
|
+
package_default as default
|
|
51
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import "./chunk-U4M3XDTH.mjs";
|
|
3
|
+
|
|
4
|
+
// package.json
|
|
5
|
+
var package_default = {
|
|
6
|
+
name: "vent-hq",
|
|
7
|
+
version: "0.4.3",
|
|
8
|
+
type: "module",
|
|
9
|
+
description: "Vent CLI \u2014 CI/CD for voice AI agents",
|
|
10
|
+
bin: {
|
|
11
|
+
"vent-hq": "dist/index.mjs"
|
|
12
|
+
},
|
|
13
|
+
files: [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
scripts: {
|
|
17
|
+
build: "node scripts/bundle.mjs",
|
|
18
|
+
clean: "rm -rf dist"
|
|
19
|
+
},
|
|
20
|
+
keywords: [
|
|
21
|
+
"vent",
|
|
22
|
+
"cli",
|
|
23
|
+
"voice",
|
|
24
|
+
"agent",
|
|
25
|
+
"testing",
|
|
26
|
+
"ci-cd"
|
|
27
|
+
],
|
|
28
|
+
license: "MIT",
|
|
29
|
+
publishConfig: {
|
|
30
|
+
access: "public"
|
|
31
|
+
},
|
|
32
|
+
repository: {
|
|
33
|
+
type: "git",
|
|
34
|
+
url: "https://github.com/vent-hq/vent",
|
|
35
|
+
directory: "packages/cli"
|
|
36
|
+
},
|
|
37
|
+
homepage: "https://ventmcp.dev",
|
|
38
|
+
dependencies: {
|
|
39
|
+
"@clack/prompts": "^1.1.0",
|
|
40
|
+
ws: "^8.18.0"
|
|
41
|
+
},
|
|
42
|
+
devDependencies: {
|
|
43
|
+
"@types/ws": "^8.5.0",
|
|
44
|
+
"@vent/relay-client": "workspace:*",
|
|
45
|
+
"@vent/shared": "workspace:*",
|
|
46
|
+
esbuild: "^0.24.0"
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
export {
|
|
50
|
+
package_default as default
|
|
51
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import "./chunk-U4M3XDTH.mjs";
|
|
3
|
+
|
|
4
|
+
// package.json
|
|
5
|
+
var package_default = {
|
|
6
|
+
name: "vent-hq",
|
|
7
|
+
version: "0.4.1",
|
|
8
|
+
type: "module",
|
|
9
|
+
description: "Vent CLI \u2014 CI/CD for voice AI agents",
|
|
10
|
+
bin: {
|
|
11
|
+
"vent-hq": "dist/index.mjs"
|
|
12
|
+
},
|
|
13
|
+
files: [
|
|
14
|
+
"dist"
|
|
15
|
+
],
|
|
16
|
+
scripts: {
|
|
17
|
+
build: "node scripts/bundle.mjs",
|
|
18
|
+
clean: "rm -rf dist"
|
|
19
|
+
},
|
|
20
|
+
keywords: [
|
|
21
|
+
"vent",
|
|
22
|
+
"cli",
|
|
23
|
+
"voice",
|
|
24
|
+
"agent",
|
|
25
|
+
"testing",
|
|
26
|
+
"ci-cd"
|
|
27
|
+
],
|
|
28
|
+
license: "MIT",
|
|
29
|
+
publishConfig: {
|
|
30
|
+
access: "public"
|
|
31
|
+
},
|
|
32
|
+
repository: {
|
|
33
|
+
type: "git",
|
|
34
|
+
url: "https://github.com/vent-hq/vent",
|
|
35
|
+
directory: "packages/cli"
|
|
36
|
+
},
|
|
37
|
+
homepage: "https://ventmcp.dev",
|
|
38
|
+
dependencies: {
|
|
39
|
+
"@clack/prompts": "^1.1.0",
|
|
40
|
+
ws: "^8.18.0"
|
|
41
|
+
},
|
|
42
|
+
devDependencies: {
|
|
43
|
+
"@types/ws": "^8.5.0",
|
|
44
|
+
"@vent/relay-client": "workspace:*",
|
|
45
|
+
"@vent/shared": "workspace:*",
|
|
46
|
+
esbuild: "^0.24.0"
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
export {
|
|
50
|
+
package_default as default
|
|
51
|
+
};
|