{"_id":"@absolutejs/voice-tester","_rev":"8-fa29452d3b580d5301b20645bd77c630","name":"@absolutejs/voice-tester","dist-tags":{"latest":"0.0.4-beta.5"},"versions":{"0.0.1-beta.1":{"name":"@absolutejs/voice-tester","version":"0.0.1-beta.1","keywords":["absolutejs","voice","testing","twilio","deepgram","ai","telephony"],"author":{"name":"Alex Kahn"},"license":"MIT","_id":"@absolutejs/voice-tester@0.0.1-beta.1","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"bin":{"voice-tester":"dist/cli.js"},"dist":{"shasum":"9776e948bb0f541c4cbee791fc80b02ff07ca735","tarball":"https://registry.npmjs.org/@absolutejs/voice-tester/-/voice-tester-0.0.1-beta.1.tgz","fileCount":38,"integrity":"sha512-bTjYsZQOY16p8SDAVa0vhn1DUaP8v7/oUTNgngA/R4p04/V2jCGTiIiPSYo36ixIEWVO8xblYsLjREBMYEr+CQ==","signatures":[{"sig":"MEQCIEpnnl5JXsistPMu6ySWLVaY1jk6byy/xyb5go1By9rEAiBAI9Wpp9rYfeTl1yElKzyUqgf2vOx0tm71gYnOfti93g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":109456},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.1.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./scenarios":{"types":"./dist/scenarios/index.d.ts","import":"./dist/scenarios/index.js"}},"gitHead":"149dbce92f1088495249ff665746be0d3435bc37","scripts":{"build":"rm -rf dist && bun build src/index.ts src/cli.ts src/scenarios/index.ts --outdir dist --target node --format esm --external '@absolutejs/*' && bun x tsc -p tsconfig.json --emitDeclarationOnly --outDir dist","typecheck":"bun x tsc -p tsconfig.json --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"_npmVersion":"10.9.2","description":"AI-driven automated tester for @absolutejs/voice services — simulates a caller end-to-end (Twilio Media Stream protocol or real Twilio outbound), drives the conversation with TTS + STT + LLM. Built for the AbsoluteJS AI Studio.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^5.6.0","@absolutejs/ai":"*"},"peerDependencies":{"@absolutejs/ai":"*"},"_npmOperationalInternal":{"tmp":"tmp/voice-tester_0.0.1-beta.1_1779842862248_0.6405731394965959","host":"s3://npm-registry-packages-npm-production"}},"0.0.2-beta.1":{"name":"@absolutejs/voice-tester","version":"0.0.2-beta.1","keywords":["absolutejs","voice","testing","twilio","deepgram","ai","telephony"],"author":{"name":"Alex Kahn"},"license":"MIT","_id":"@absolutejs/voice-tester@0.0.2-beta.1","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"bin":{"voice-tester":"dist/cli.js"},"dist":{"shasum":"3c0685b634ef4f211bf561d10ac991c7b2be0ea6","tarball":"https://registry.npmjs.org/@absolutejs/voice-tester/-/voice-tester-0.0.2-beta.1.tgz","fileCount":49,"integrity":"sha512-q/PbAsj/6q2JQl5vJ6UY2xv92xXVD2VNGNVbCQqaUax1VozktkR9bfnA5inwf44udNXrVZrzOnMwKps6egWMrw==","signatures":[{"sig":"MEQCIAHGAYcYHnQIGiM03qHWJA2+SgTl4FRAgglFYnnn7bK1AiA8gtQWuxG8pdZnpBYcv+PLZod3M+sF/oONAaSdqWyQ2Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":139361},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.1.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./discord":{"types":"./dist/discord.d.ts","import":"./dist/discord.js"},"./scenarios":{"types":"./dist/scenarios/index.d.ts","import":"./dist/scenarios/index.js"}},"gitHead":"cba29c42ab1b47b77211ed7e115e1e4a10685faa","scripts":{"build":"rm -rf dist && bun build src/index.ts src/cli.ts src/scenarios/index.ts src/discord.ts --outdir dist --target node --format esm --external '@absolutejs/*' --external 'discord.js' --external '@discordjs/*' --external 'prism-media' && bun x tsc -p tsconfig.json --emitDeclarationOnly --outDir dist","typecheck":"bun x tsc -p tsconfig.json --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"_npmVersion":"10.9.2","description":"AI-driven automated tester for @absolutejs/voice services — simulates a caller end-to-end (Twilio Media Stream protocol or real Twilio outbound), drives the conversation with TTS + STT + LLM. Built for the AbsoluteJS AI Studio.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","discord.js":"^14.16.3","typescript":"^5.6.0","prism-media":"^1.3.5","@absolutejs/ai":"*","@discordjs/voice":"^0.19"},"peerDependencies":{"discord.js":">=14.0.0","prism-media":"^1.3.5","@absolutejs/ai":"*","@discordjs/voice":">=0.17.0"},"peerDependenciesMeta":{"discord.js":{"optional":true},"prism-media":{"optional":true},"@discordjs/voice":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/voice-tester_0.0.2-beta.1_1779843945770_0.029790594992199937","host":"s3://npm-registry-packages-npm-production"}},"0.0.3-beta.1":{"name":"@absolutejs/voice-tester","version":"0.0.3-beta.1","keywords":["absolutejs","voice","testing","twilio","deepgram","ai","telephony"],"author":{"name":"Alex Kahn"},"license":"MIT","_id":"@absolutejs/voice-tester@0.0.3-beta.1","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"bin":{"voice-tester":"dist/cli.js"},"dist":{"shasum":"3b0049e666bf5ede34cddb715952c5a6d4779991","tarball":"https://registry.npmjs.org/@absolutejs/voice-tester/-/voice-tester-0.0.3-beta.1.tgz","fileCount":49,"integrity":"sha512-GcvQ/HXy8krtvxLPT6GOeAu14juS7/DJCKjyrJsz3vVafWyVuBUa+XWhSPf715I87NtyMxbvqZhsyLUWR7Carw==","signatures":[{"sig":"MEUCIAVWgLxYPCoFHEfaJsTkVynayg+hbPH9fqkr0L7Yh7LiAiEAvUEFJhidYOZkUwr/z8vMw5wyiejPJp++kl0S5FxPWjI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":140825},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.1.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./discord":{"types":"./dist/discord.d.ts","import":"./dist/discord.js"},"./scenarios":{"types":"./dist/scenarios/index.d.ts","import":"./dist/scenarios/index.js"}},"gitHead":"cc29f04dee2dca40221d76977578be2e8285b732","scripts":{"build":"rm -rf dist && bun build src/index.ts src/cli.ts src/scenarios/index.ts src/discord.ts --outdir dist --target node --format esm --external '@absolutejs/*' --external 'discord.js' --external '@discordjs/*' --external 'prism-media' && bun x tsc -p tsconfig.json --emitDeclarationOnly --outDir dist","typecheck":"bun x tsc -p tsconfig.json --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"_npmVersion":"10.9.2","description":"AI-driven automated tester for @absolutejs/voice services — simulates a caller end-to-end (Twilio Media Stream protocol or real Twilio outbound), drives the conversation with TTS + STT + LLM. Built for the AbsoluteJS AI Studio.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","discord.js":"^14.16.3","opusscript":"^0.1.1","typescript":"^5.6.0","prism-media":"^1.3.5","@absolutejs/ai":"*","@discordjs/voice":"^0.19"},"peerDependencies":{"discord.js":">=14.0.0","prism-media":"^1.3.5","@absolutejs/ai":"*","@discordjs/voice":">=0.17.0"},"peerDependenciesMeta":{"discord.js":{"optional":true},"prism-media":{"optional":true},"@discordjs/voice":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/voice-tester_0.0.3-beta.1_1779867073484_0.3368438457180869","host":"s3://npm-registry-packages-npm-production"}},"0.0.4-beta.1":{"name":"@absolutejs/voice-tester","version":"0.0.4-beta.1","keywords":["absolutejs","voice","testing","twilio","deepgram","ai","telephony"],"author":{"name":"Alex Kahn"},"license":"MIT","_id":"@absolutejs/voice-tester@0.0.4-beta.1","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"bin":{"voice-tester":"dist/cli.js"},"dist":{"shasum":"228d64f2514979f5c553aeee18bd257cad97a762","tarball":"https://registry.npmjs.org/@absolutejs/voice-tester/-/voice-tester-0.0.4-beta.1.tgz","fileCount":52,"integrity":"sha512-qINya6PB/VjX3i3brT0ix8VFD43mlOpIr+hfw4WzubxUUjBEwHzVnTMbpftFZkBsBakQlSjN2sH4A8gOLv2IsQ==","signatures":[{"sig":"MEQCIHMWCTsQI9MuEhUAVwA/wAOmplT9DqSzJ6ZPqMJd2b0xAiACj6qh0KY2fifWhNyMTf6pVPf7lR812udwUg6YzNXrUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":166019},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.1.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./discord":{"types":"./dist/discord.d.ts","import":"./dist/discord.js"},"./scenarios":{"types":"./dist/scenarios/index.d.ts","import":"./dist/scenarios/index.js"}},"gitHead":"04ec62f81cc0e65fe2337d55736ebef3c5a75a81","scripts":{"build":"rm -rf dist && bun build src/index.ts src/cli.ts src/scenarios/index.ts src/discord.ts --outdir dist --target node --format esm --external '@absolutejs/*' --external 'discord.js' --external '@discordjs/*' --external 'prism-media' && bun x tsc -p tsconfig.json --emitDeclarationOnly --outDir dist","typecheck":"bun x tsc -p tsconfig.json --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"_npmVersion":"10.9.2","description":"AI-driven automated tester for @absolutejs/voice services — simulates a caller end-to-end (Twilio Media Stream protocol or real Twilio outbound), drives the conversation with TTS + STT + LLM. Built for the AbsoluteJS AI Studio.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","discord.js":"^14.16.3","opusscript":"^0.1.1","typescript":"^5.6.0","prism-media":"^1.3.5","@absolutejs/ai":"*","@discordjs/voice":"^0.19"},"peerDependencies":{"discord.js":">=14.0.0","prism-media":"^1.3.5","@absolutejs/ai":"*","@discordjs/voice":">=0.17.0"},"peerDependenciesMeta":{"discord.js":{"optional":true},"prism-media":{"optional":true},"@discordjs/voice":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/voice-tester_0.0.4-beta.1_1779883721836_0.7890825965527648","host":"s3://npm-registry-packages-npm-production"}},"0.0.4-beta.2":{"name":"@absolutejs/voice-tester","version":"0.0.4-beta.2","keywords":["absolutejs","voice","testing","twilio","deepgram","ai","telephony"],"author":{"name":"Alex Kahn"},"license":"MIT","_id":"@absolutejs/voice-tester@0.0.4-beta.2","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"bin":{"voice-tester":"dist/cli.js"},"dist":{"shasum":"598418fbad620c341fd9fb4255f93aabe1cd93d9","tarball":"https://registry.npmjs.org/@absolutejs/voice-tester/-/voice-tester-0.0.4-beta.2.tgz","fileCount":52,"integrity":"sha512-U2uOgAg9LBaFKSYxPxsq1ZtkFzQfR3ieRDoX2aytSNiqV7CdJLdK52svI4xjZ/Y/TBEJD7/4EZjqoQvWFyItVw==","signatures":[{"sig":"MEUCIQD7N7OHD/FgZKURPBAClsnEdgMKdEHmNSYwslwtoijtVwIgceFhfR3H0KpCAW25eWLoIsmT/CNIkkMjxdzR83/L7do=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":168310},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"bun":">=1.1.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./discord":{"types":"./dist/discord.d.ts","import":"./dist/discord.js"},"./scenarios":{"types":"./dist/scenarios/index.d.ts","import":"./dist/scenarios/index.js"}},"gitHead":"f1d35187b52d25cd4dbbe0368887e38f0e2357e5","scripts":{"build":"rm -rf dist && bun build src/index.ts src/cli.ts src/scenarios/index.ts src/discord.ts --outdir dist --target node --format esm --external '@absolutejs/*' --external 'discord.js' --external '@discordjs/*' --external 'prism-media' && bun x tsc -p tsconfig.json --emitDeclarationOnly --outDir dist","typecheck":"bun x tsc -p tsconfig.json --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"_npmVersion":"10.9.2","description":"AI-driven automated tester for @absolutejs/voice services — simulates a caller end-to-end (Twilio Media Stream protocol or real Twilio outbound), drives the conversation with TTS + STT + LLM. Built for the AbsoluteJS AI Studio.","directories":{},"_nodeVersion":"22.14.0","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","discord.js":"^14.16.3","opusscript":"^0.1.1","typescript":"^5.6.0","prism-media":"^1.3.5","@absolutejs/ai":"*","@discordjs/voice":"^0.19"},"peerDependencies":{"discord.js":">=14.0.0","prism-media":"^1.3.5","@absolutejs/ai":"*","@discordjs/voice":">=0.17.0"},"peerDependenciesMeta":{"discord.js":{"optional":true},"prism-media":{"optional":true},"@discordjs/voice":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/voice-tester_0.0.4-beta.2_1779887808927_0.15893738160591964","host":"s3://npm-registry-packages-npm-production"}},"0.0.4-beta.3":{"name":"@absolutejs/voice-tester","version":"0.0.4-beta.3","keywords":["absolutejs","voice","testing","twilio","deepgram","ai","telephony"],"author":"Alex Kahn","license":"MIT","_id":"@absolutejs/voice-tester@0.0.4-beta.3","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"bin":{"voice-tester":"dist/cli.js"},"dist":{"shasum":"884093af0f931384527d62eb22983a3a9e50a93a","tarball":"https://registry.npmjs.org/@absolutejs/voice-tester/-/voice-tester-0.0.4-beta.3.tgz","fileCount":57,"integrity":"sha512-XYGpYAv98WkWYcZaLitOhvJlweFLCZT7moCbJ+be3mVo9A21WwHz5ETJVrZVQlprxrQkwZGIz6xFtt0zgk4qPQ==","signatures":[{"sig":"MEUCIBA4WC8ftotUaWso3HRDSSZyv9vXqtTxy0rYJG5DMsO/AiEA9oxfuQ6d7+oqECuEnpNhcRqEheYt3ABzdp5C4uWX85E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":180249},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","shasum":"884093af0f931384527d62eb22983a3a9e50a93a","engines":{"bun":">=1.1.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./discord":{"types":"./dist/discord.d.ts","import":"./dist/discord.js"},"./scenarios":{"types":"./dist/scenarios/index.d.ts","import":"./dist/scenarios/index.js"},"./google-meet":{"types":"./dist/googleMeet.d.ts","import":"./dist/googleMeet.js"}},"scripts":{"build":"rm -rf dist && bun build src/index.ts src/cli.ts src/scenarios/index.ts src/discord.ts src/googleMeet.ts --outdir dist --target node --format esm --external '@absolutejs/*' --external 'discord.js' --external '@discordjs/*' --external 'prism-media' --external 'playwright' && bun x tsc -p tsconfig.json --emitDeclarationOnly --outDir dist","typecheck":"bun x tsc -p tsconfig.json --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"_integrity":"sha512-XYGpYAv98WkWYcZaLitOhvJlweFLCZT7moCbJ+be3mVo9A21WwHz5ETJVrZVQlprxrQkwZGIz6xFtt0zgk4qPQ==","_npmVersion":"10.8.3","description":"AI-driven automated tester for @absolutejs/voice services — simulates a caller end-to-end (Twilio Media Stream protocol or real Twilio outbound), drives the conversation with TTS + STT + LLM. Built for the AbsoluteJS AI Studio.","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","discord.js":"^14.16.3","opusscript":"^0.1.1","typescript":"^5.6.0","prism-media":"^1.3.5","@absolutejs/ai":"*","@discordjs/voice":"^0.19"},"peerDependencies":{"discord.js":">=14.0.0","playwright":">=1.40.0","prism-media":"^1.3.5","@absolutejs/ai":"*","@discordjs/voice":">=0.17.0"},"peerDependenciesMeta":{"discord.js":{"optional":true},"playwright":{"optional":true},"prism-media":{"optional":true},"@discordjs/voice":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/voice-tester_0.0.4-beta.3_1780071437282_0.47343152374892106","host":"s3://npm-registry-packages-npm-production"}},"0.0.4-beta.4":{"name":"@absolutejs/voice-tester","version":"0.0.4-beta.4","keywords":["absolutejs","voice","testing","twilio","deepgram","ai","telephony"],"author":"Alex Kahn","license":"MIT","_id":"@absolutejs/voice-tester@0.0.4-beta.4","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"bin":{"voice-tester":"dist/cli.js"},"dist":{"shasum":"da0016262acb54a1650d4a9188c1574446ea4e42","tarball":"https://registry.npmjs.org/@absolutejs/voice-tester/-/voice-tester-0.0.4-beta.4.tgz","fileCount":57,"integrity":"sha512-OpBT2Y9tSUmlkDRjBC38lmTtQSAIaZtYQ9o3HA4AXlaeNnz2NlgAtbUztK+Km1v4mKf+qAa4WcCDQEAPHGXp4g==","signatures":[{"sig":"MEUCIA3Wcr1KKEq8ZwJBskyIwJXNgvYfpF1F3hX8TfrkXo3lAiEAo6R3De6bhZU/DeaDWwM8Q9mUs+rEznHmuKFjWtCD0Dw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":180249},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","shasum":"da0016262acb54a1650d4a9188c1574446ea4e42","engines":{"bun":">=1.1.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./discord":{"types":"./dist/discord.d.ts","import":"./dist/discord.js"},"./scenarios":{"types":"./dist/scenarios/index.d.ts","import":"./dist/scenarios/index.js"},"./google-meet":{"types":"./dist/googleMeet.d.ts","import":"./dist/googleMeet.js"}},"scripts":{"build":"rm -rf dist && bun build src/index.ts src/cli.ts src/scenarios/index.ts src/discord.ts src/googleMeet.ts --outdir dist --target node --format esm --external '@absolutejs/*' --external 'discord.js' --external '@discordjs/*' --external 'prism-media' --external 'playwright' && bun x tsc -p tsconfig.json --emitDeclarationOnly --outDir dist","typecheck":"bun x tsc -p tsconfig.json --noEmit","prepublishOnly":"bun run build"},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"_integrity":"sha512-OpBT2Y9tSUmlkDRjBC38lmTtQSAIaZtYQ9o3HA4AXlaeNnz2NlgAtbUztK+Km1v4mKf+qAa4WcCDQEAPHGXp4g==","_npmVersion":"10.8.3","description":"AI-driven automated tester for @absolutejs/voice services — simulates a caller end-to-end (Twilio Media Stream protocol or real Twilio outbound), drives the conversation with TTS + STT + LLM. Built for the AbsoluteJS AI Studio.","directories":{},"_nodeVersion":"24.3.0","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","discord.js":"^14.16.3","opusscript":"^0.1.1","typescript":"^5.6.0","prism-media":"^1.3.5","@absolutejs/ai":"*","@discordjs/voice":"^0.19"},"peerDependencies":{"discord.js":">=14.0.0","playwright":">=1.40.0","prism-media":"^1.3.5","@absolutejs/ai":"*","@discordjs/voice":">=0.17.0"},"peerDependenciesMeta":{"discord.js":{"optional":true},"playwright":{"optional":true},"prism-media":{"optional":true},"@discordjs/voice":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/voice-tester_0.0.4-beta.4_1780071567562_0.9859559877131048","host":"s3://npm-registry-packages-npm-production"}},"0.0.4-beta.5":{"name":"@absolutejs/voice-tester","version":"0.0.4-beta.5","homepage":"https://github.com/absolutejs/voice-tester","bugs":{"url":"https://github.com/absolutejs/voice-tester/issues"},"license":"MIT","description":"AI-driven automated tester for @absolutejs/voice services — simulates a caller end-to-end (Twilio Media Stream protocol or real Twilio outbound), drives the conversation with TTS + STT + LLM. Built for the AbsoluteJS AI Studio.","author":{"name":"Alex Kahn"},"type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","bin":{"voice-tester":"dist/cli.js"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./scenarios":{"types":"./dist/scenarios/index.d.ts","import":"./dist/scenarios/index.js"},"./discord":{"types":"./dist/discord.d.ts","import":"./dist/discord.js"},"./google-meet":{"types":"./dist/googleMeet.d.ts","import":"./dist/googleMeet.js"}},"scripts":{"build":"rm -rf dist && bun build src/index.ts src/cli.ts src/scenarios/index.ts src/discord.ts src/googleMeet.ts --outdir dist --target node --format esm --external '@absolutejs/*' --external 'discord.js' --external '@discordjs/*' --external 'prism-media' --external 'playwright' && bun x tsc -p tsconfig.json --emitDeclarationOnly --outDir dist","typecheck":"bun x tsc -p tsconfig.json --noEmit","prepublishOnly":"bun run build"},"keywords":["absolutejs","voice","testing","twilio","deepgram","ai","telephony"],"peerDependencies":{"@absolutejs/ai":"*","@discordjs/voice":">=0.17.0","discord.js":">=14.0.0","playwright":">=1.40.0","prism-media":"^1.3.5"},"peerDependenciesMeta":{"@discordjs/voice":{"optional":true},"discord.js":{"optional":true},"playwright":{"optional":true},"prism-media":{"optional":true}},"devDependencies":{"@absolutejs/ai":"*","@discordjs/voice":"^0.19","@types/bun":"latest","discord.js":"^14.16.3","opusscript":"^0.1.1","prism-media":"^1.3.5","typescript":"^5.6.0"},"engines":{"bun":">=1.1.0"},"_id":"@absolutejs/voice-tester@0.0.4-beta.5","gitHead":"a040826c2d2c9aeafe78cde5658bb9c1cec71345","_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-D95RunH4M+1yTLqS0UFc0arkXGUswgCEJURgrwUaTjFhb3qpIDYU9PjfTCohGHoo+8jOLenwkTQrt9l01RIq0w==","shasum":"753b22393acf376d8c74e408292dffd0e7d2cbae","tarball":"https://registry.npmjs.org/@absolutejs/voice-tester/-/voice-tester-0.0.4-beta.5.tgz","fileCount":57,"unpackedSize":183683,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCfc/iUeWabzeOnY32MnNic5izs3cmKMlCSl3RRtcYmiwIgTVSIL7kc1GC9jMUTVFtGtFTUuhsauQNq8MyRhby4MQk="}]},"_npmUser":{"name":"alexkahndev","email":"alexkahn2019@gmail.com"},"directories":{},"maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/voice-tester_0.0.4-beta.5_1782660198823_0.12193289665447948"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-27T00:47:41.802Z","modified":"2026-06-28T15:23:19.212Z","0.0.1-beta.1":"2026-05-27T00:47:42.385Z","0.0.2-beta.1":"2026-05-27T01:05:45.941Z","0.0.3-beta.1":"2026-05-27T07:31:13.629Z","0.0.4-beta.1":"2026-05-27T12:08:42.046Z","0.0.4-beta.2":"2026-05-27T13:16:49.077Z","0.0.4-beta.3":"2026-05-29T16:17:17.448Z","0.0.4-beta.4":"2026-05-29T16:19:27.701Z","0.0.4-beta.5":"2026-06-28T15:23:18.965Z"},"author":{"name":"Alex Kahn"},"license":"MIT","keywords":["absolutejs","voice","testing","twilio","deepgram","ai","telephony"],"description":"AI-driven automated tester for @absolutejs/voice services — simulates a caller end-to-end (Twilio Media Stream protocol or real Twilio outbound), drives the conversation with TTS + STT + LLM. Built for the AbsoluteJS AI Studio.","maintainers":[{"name":"alexkahndev","email":"alexkahn2019@gmail.com"}],"readme":"# @absolutejs/voice-tester\n\nAI-driven automated tester for voice services that speak the Twilio Media\nStreams protocol. Pairs with [`@absolutejs/voice`](https://npmjs.com/package/@absolutejs/voice) — drives a regression scenario end-to-end against a deployed receptionist without a phone, a real Twilio call, or a human in the loop.\n\nBuilt for the AbsoluteJS AI Studio.\n\n## What it does\n\nOpens a WebSocket directly to your voice service's `/stream` endpoint and acts\nas the caller side of a Twilio Media Stream:\n\n1. Sends a `connected` envelope, then `start` with custom parameters (sessionId, etc.)\n2. Streams 20ms μ-law frames generated from Deepgram Aura TTS\n3. Receives the service's outbound audio frames, decodes μ-law back to PCM\n4. Pipes the inbound PCM into Deepgram STT to transcribe what the bot said\n5. Asks an LLM what to say next given the rolling transcript + scenario rules\n6. Repeats until the scenario completes or the timeout fires\n\nEvery layer is observable: full transcript with caller/service timestamps,\npartial + final STT events, mark/clear events from the bridge.\n\n## Install\n\n```sh\nbun add -d @absolutejs/voice-tester @absolutejs/ai\n```\n\n`@absolutejs/ai` is a peer dependency.\n\nEnvironment:\n\n- `DEEPGRAM_API_KEY` — required for both TTS (Aura) and STT\n- `ANTHROPIC_API_KEY` — picked up by `@absolutejs/ai` when scenarios use the LLM\n\n## Quick start (CLI)\n\n```sh\nbun x @absolutejs/voice-tester \\\n  --target wss://example.com/v1/voice/phone/stream \\\n  --scenario adversarial \\\n  --duration 90 \\\n  --from +15555550100 \\\n  --to +15555550199 \\\n  --session phone:+15555550100:$(date +%s)\n```\n\nExits non-zero if the scenario hit an error. Prints a JSON report:\n\n```json\n{\n  \"scenario\": \"adversarial\",\n  \"callerTurns\": 7,\n  \"serviceTurns\": 7,\n  \"durationMs\": 68073,\n  \"endedReason\": \"scenario_hangup\",\n  \"streamSid\": \"MZ…\",\n  \"transcript\": [ { \"speaker\": \"service\", \"text\": \"…\", \"at\": 9271 }, … ]\n}\n```\n\n## Quick start (API)\n\n```ts\nimport { runScenario } from \"@absolutejs/voice-tester\";\nimport { adversarialScenario } from \"@absolutejs/voice-tester/scenarios\";\n\nconst report = await runScenario({\n  wsUrl: \"wss://example.com/v1/voice/phone/stream\",\n  tts: { apiKey: process.env.DEEPGRAM_API_KEY! },\n  stt: { apiKey: process.env.DEEPGRAM_API_KEY! },\n  scenario: adversarialScenario({ llm: { model: \"claude-haiku-4-5-20251001\" } }),\n  customParameters: { sessionId: `phone:+15555550100:${Date.now()}` },\n  from: \"+15555550100\",\n  to: \"+15555550199\",\n});\n\nif (report.endedReason === \"error\") {\n  throw new Error(report.error?.message ?? \"scenario failed\");\n}\n```\n\n## Built-in scenarios\n\n- **`happyPathScenario`** — plays a realistic new subscriber. Answers the bot's intake questions naturally for ~75s, then hangs up. Baseline: if this one breaks, the bot is broken in a boring way.\n- **`adversarialScenario`** — probes failure modes: long silence after greeting, mumbled answer, mid-sentence interruption, language switch to Spanish, off-topic (\"what's the weather?\"), then LLM-improvised follow-ups. Should fail gracefully — if the bot crashes, hangs, or loops, you'll see it in the transcript.\n\n## Writing your own scenario\n\nA scenario is a `decide` function that receives the rolling context and returns the next caller action:\n\n```ts\nimport type { Scenario } from \"@absolutejs/voice-tester\";\n\nexport const myScenario: Scenario = {\n  id: \"my-scenario\",\n  maxDurationMs: 60_000,\n  idleMs: 1200,\n  decide: async ({ transcript, lastServiceUtterance, callerTurnCount }) => {\n    if (callerTurnCount >= 5) return { type: \"hangup\" };\n    if (lastServiceUtterance?.toLowerCase().includes(\"price\")) {\n      return { type: \"speak\", text: \"Is there a free trial?\" };\n    }\n    return { type: \"speak\", text: \"Tell me more.\" };\n  },\n};\n```\n\nActions are `{ type: \"speak\", text }`, `{ type: \"silence\", ms }`, or `{ type: \"hangup\", reason }`.\n\n## Modes\n\n- **twilio-ws** (default) — speaks Twilio's protocol against any WS endpoint. Free, no carrier audio path. Tests the full app stack: STT → LLM → TTS → scribe → DB. **Shipped.**\n- **discord** — joins a Discord voice channel as a fake tester user, sends Aura TTS as opus, subscribes to other users' audio receivers, decodes opus back to PCM for STT. Use this to regress Deal Referee / any bot living in a voice channel. **Shipped.** Requires a separate tester Discord bot (with `connect`, `speak` permissions on the channel).\n- **twilio-outbound** (planned) — originates a real Twilio outbound call so the test exercises the carrier audio path. Costs Twilio minutes; gated behind a flag.\n\n### Discord mode\n\nFull one-time setup guide (creating the tester bot in the Discord developer portal, inviting it, finding the IDs, common gotchas): see [`docs/discord-setup.md`](./docs/discord-setup.md).\n\n```sh\nDISCORD_TESTER_TOKEN=Bot.your_tester_bot_token bunx @absolutejs/voice-tester \\\n  --mode discord \\\n  --guild   1234567890 \\\n  --channel 9876543210 \\\n  --target-user 1122334455 \\\n  --scenario adversarial \\\n  --duration 90\n```\n\n`--target-user` is optional — if set, the tester only transcribes that user's audio (useful when there are humans in the channel too). Without it, everyone except the tester bot itself is forwarded to STT.\n\n```ts\nimport { runScenario } from \"@absolutejs/voice-tester\";\nimport { adversarialScenario } from \"@absolutejs/voice-tester/scenarios\";\nimport { discordVoiceTransport } from \"@absolutejs/voice-tester/discord\";\n\nconst transport = await discordVoiceTransport({\n  token: process.env.DISCORD_TESTER_TOKEN!,\n  guildId: \"1234567890\",\n  channelId: \"9876543210\",\n  targetUserId: \"1122334455\", // optional: only this user's audio\n});\n\nconst report = await runScenario({\n  transport,\n  scenario: adversarialScenario({ llm: {} }),\n  tts: { apiKey: process.env.DEEPGRAM_API_KEY! },\n  stt: { apiKey: process.env.DEEPGRAM_API_KEY! },\n});\n```\n\nDiscord mode pulls three peer dependencies which are not installed by default — only install them if you actually use Discord mode:\n\n```sh\nbun add -d @discordjs/voice discord.js prism-media\n```\n\n## Architecture\n\n```\n+-----------------------------------+\n|        runScenario()              |\n|  + scenario.decide() -> action    |\n|  + AI caller loop                 |\n+-----------------------------------+\n        |                ^\n        v                |\n  +--------+        +--------+\n  |  Aura  |        |Deepgram|\n  |  TTS   |        |  STT   |\n  +--------+        +--------+\n   PCM 8k             PCM 8k\n   ↓                    ↑\n  +-------------------------------+\n  |     twilioWsCaller.ts         |\n  |  caller-side Twilio protocol  |\n  +-------------------------------+\n        |                ^\n        v                |\n   media (mulaw)    media (mulaw)\n        |                |\n        v                |\n  +-------------------------------+\n  |  YOUR voice service           |\n  |  (@absolutejs/voice bridge)   |\n  +-------------------------------+\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md","homepage":"https://github.com/absolutejs/voice-tester","bugs":{"url":"https://github.com/absolutejs/voice-tester/issues"}}