@absolutejs/voice 0.0.22-beta.236 → 0.0.22-beta.238

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/README.md CHANGED
@@ -924,6 +924,26 @@ Use operations records instead of hosted call logs. A proof failure should link
924
924
 
925
925
  Use simulation and contracts before live traffic. The simulation suite, tool contracts, outcome contracts, provider routing contracts, phone-agent smoke contracts, and production-readiness gates turn dashboard-only confidence into code-owned deploy evidence.
926
926
 
927
+ ### Vapi Migration Checklist
928
+
929
+ Use this checklist when a buyer asks whether AbsoluteJS Voice covers the practical Vapi surface area without becoming a hosted platform:
930
+
931
+ | Vapi evaluation question | AbsoluteJS proof to show |
932
+ | --- | --- |
933
+ | Can I make a web voice assistant? | Framework page using `voice(...)`, then `/traces` and `/production-readiness` |
934
+ | Can I make phone calls? | `/phone-agent`, `/api/voice/phone/setup`, carrier matrix, and phone smoke proof |
935
+ | Can I use multiple assistants? | `createVoiceAgentSquad(...)`, `/agent-squad-contract`, current-specialist framework helpers, and handoff traces |
936
+ | Can I call tools/functions? | Tool definitions, `/tool-contracts`, audit events, integration events, and operations records |
937
+ | Can I debug a bad call? | `/voice-operations/:sessionId`, session replay, trace timeline, incident Markdown, delivery attempts, and provider decisions |
938
+ | Can I monitor production health? | `/production-readiness`, `/ops-recovery`, `/api/production-readiness/gate`, provider SLOs, and delivery runtime proof |
939
+ | Can I test before live traffic? | `/voice/simulations`, scenario fixtures, tool contracts, outcome contracts, provider routing contracts, and eval baselines |
940
+ | Can I run outbound campaigns? | `createVoiceCampaignRoutes(...)`, campaign readiness proof, carrier dry-run proof, retry/quiet-hours/rate-limit evidence |
941
+ | Can operators intervene? | Live-ops routes, action-center helpers, pause/resume/takeover runtime controls, and operator action audit history |
942
+ | Can I own compliance evidence? | `/data-control`, redacted audit export, retention dry-run/apply routes, provider-key recommendations, and customer-owned storage |
943
+ | Can I export logs to my infrastructure? | `/voice/observability-export`, delivery receipts, artifact index, replay proof, S3/SQLite/Postgres/file/webhook destinations |
944
+
945
+ The migration path should start by replacing hosted-dashboard concepts with mounted primitives and proof routes. Do not start by copying a hosted dashboard. Start with the voice route, operations record, readiness gate, provider contracts, and customer-owned observability export; then add campaigns, live-ops, or compliance controls only when the app needs those surfaces.
946
+
927
947
  ## Install
928
948
 
929
949
  ```bash
package/dist/index.d.ts CHANGED
@@ -14,6 +14,8 @@ export { buildVoiceDiagnosticsMarkdown, createVoiceDiagnosticsRoutes, resolveVoi
14
14
  export { buildVoiceDemoReadyReport, createVoiceDemoReadyRoutes, renderVoiceDemoReadyHTML } from './demoReadyRoutes';
15
15
  export { buildVoiceDeliverySinkReport, createVoiceDeliverySinkDescriptor, createVoiceDeliverySinkPair, createVoiceDeliverySinkRoutes, createVoiceFileDeliverySink, createVoicePostgresDeliverySink, createVoiceS3DeliverySink, createVoiceSQLiteDeliverySink, createVoiceWebhookDeliverySink, renderVoiceDeliverySinkHTML } from './deliverySinkRoutes';
16
16
  export { buildVoiceOpsActionHistoryReport, createVoiceOpsActionAuditRoutes, recordVoiceOpsActionAudit, renderVoiceOpsActionHistoryHTML } from './opsActionAuditRoutes';
17
+ export { buildVoicePlatformCoverageSummary, createVoicePlatformCoverageRoutes } from './platformCoverage';
18
+ export type { VoicePlatformCoverageEvidence, VoicePlatformCoverageRoutesOptions, VoicePlatformCoverageStatus, VoicePlatformCoverageSummary, VoicePlatformCoverageSummaryInput, VoicePlatformCoverageSurface } from './platformCoverage';
17
19
  export { buildVoiceLiveOpsControlState, createVoiceLiveOpsController, createVoiceLiveOpsRoutes, createVoiceMemoryLiveOpsControlStore, getVoiceLiveOpsControlStatus, VOICE_LIVE_OPS_ACTIONS } from './liveOps';
18
20
  export type { VoiceLiveOpsAction, VoiceLiveOpsActionInput, VoiceLiveOpsActionResult, VoiceLiveOpsControllerOptions, VoiceLiveOpsControlState, VoiceLiveOpsControlStatus, VoiceLiveOpsControlStore, VoiceLiveOpsRoutesOptions } from './liveOps';
19
21
  export { buildVoiceDeliveryRuntimeReport, createVoiceDeliveryRuntime, createVoiceDeliveryRuntimePresetConfig, createVoiceDeliveryRuntimeRoutes, renderVoiceDeliveryRuntimeHTML } from './deliveryRuntime';
package/dist/index.js CHANGED
@@ -12260,8 +12260,39 @@ var renderVoiceOpsActionHistoryHTML = (report) => {
12260
12260
  const rows = report.entries.map((entry) => `<article class="${entry.ok ? "ok" : "fail"}"><span>${escapeHtml15(entry.ok ? "success" : "error")}</span><strong>${escapeHtml15(entry.actionId)}</strong><p>${escapeHtml15(new Date(entry.at).toLocaleString())}${entry.status ? ` \xB7 HTTP ${String(entry.status)}` : ""}</p>${entry.error ? `<p>${escapeHtml15(entry.error)}</p>` : ""}</article>`).join("");
12261
12261
  return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>Voice Ops Action History</title><style>body{background:#11140f;color:#f7f1df;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:980px;padding:32px}.hero,article{background:#181d15;border:1px solid #2c3327;border-radius:24px;padding:20px}.hero{margin-bottom:16px}h1{font-size:clamp(2rem,6vw,4rem);line-height:.95}section{display:grid;gap:12px}article.ok{border-color:rgba(34,197,94,.55)}article.fail{border-color:rgba(239,68,68,.75)}span{color:#facc15;font-weight:900;text-transform:uppercase}p{color:#c8ccb8}</style></head><body><main><section class="hero"><span>Operator proof</span><h1>Voice Ops Action History</h1><p>${String(report.total)} action(s), ${String(report.failed)} failed.</p></section><section>${rows || "<p>No operator actions have been recorded.</p>"}</section></main></body></html>`;
12262
12262
  };
12263
- // src/liveOps.ts
12263
+ // src/platformCoverage.ts
12264
12264
  import { Elysia as Elysia13 } from "elysia";
12265
+ var buildVoicePlatformCoverageSummary = (input) => {
12266
+ const coverage = input.coverage ?? [];
12267
+ const ok = input.ok ?? (coverage.length > 0 && coverage.every((surface) => surface.status === "pass"));
12268
+ const status = coverage.length === 0 ? "missing" : ok ? "pass" : "stale";
12269
+ return {
12270
+ coverage,
12271
+ generatedAt: input.generatedAt,
12272
+ ok,
12273
+ outputDir: input.outputDir,
12274
+ runId: input.runId,
12275
+ source: input.source,
12276
+ status,
12277
+ total: coverage.length
12278
+ };
12279
+ };
12280
+ var normalizeCoverageSummary = (value) => ("status" in value) && ("total" in value) && ("coverage" in value) ? value : buildVoicePlatformCoverageSummary(value);
12281
+ var createVoicePlatformCoverageRoutes = (options) => {
12282
+ const path = options.path ?? "/api/voice/platform-coverage";
12283
+ const routes = new Elysia13({
12284
+ name: options.name ?? "absolutejs-voice-platform-coverage"
12285
+ });
12286
+ routes.get(path, async () => {
12287
+ const value = typeof options.source === "function" ? await options.source() : options.source;
12288
+ return Response.json(normalizeCoverageSummary(value), {
12289
+ headers: options.headers
12290
+ });
12291
+ });
12292
+ return routes;
12293
+ };
12294
+ // src/liveOps.ts
12295
+ import { Elysia as Elysia14 } from "elysia";
12265
12296
  var VOICE_LIVE_OPS_ACTIONS = [
12266
12297
  "assign",
12267
12298
  "create-task",
@@ -12426,7 +12457,7 @@ var createVoiceLiveOpsRoutes = (options = {}) => {
12426
12457
  const controller = createVoiceLiveOpsController(options);
12427
12458
  const path = options.path ?? "/api/voice/live-ops/action";
12428
12459
  const controlPath = options.controlPath ?? "/api/voice/live-ops/control/:sessionId";
12429
- return new Elysia13({
12460
+ return new Elysia14({
12430
12461
  name: options.name ?? "absolutejs-voice-live-ops"
12431
12462
  }).post(path, async ({ request, set }) => {
12432
12463
  try {
@@ -12448,7 +12479,7 @@ var createVoiceLiveOpsRoutes = (options = {}) => {
12448
12479
  });
12449
12480
  };
12450
12481
  // src/deliveryRuntime.ts
12451
- import { Elysia as Elysia14 } from "elysia";
12482
+ import { Elysia as Elysia15 } from "elysia";
12452
12483
  import { mkdir } from "fs/promises";
12453
12484
  import { dirname, join } from "path";
12454
12485
  var escapeHtml16 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
@@ -12702,7 +12733,7 @@ var createVoiceDeliveryRuntimeRoutes = (options) => {
12702
12733
  const htmlPath = options.htmlPath === undefined ? "/delivery-runtime" : options.htmlPath;
12703
12734
  const tickPath = options.tickPath === undefined ? "/api/voice-delivery-runtime/tick" : options.tickPath;
12704
12735
  const requeueDeadLettersPath = options.requeueDeadLettersPath === undefined ? "/api/voice-delivery-runtime/requeue-dead-letters" : options.requeueDeadLettersPath;
12705
- const routes = new Elysia14({
12736
+ const routes = new Elysia15({
12706
12737
  name: options.name ?? "absolutejs-voice-delivery-runtime"
12707
12738
  }).get(path, () => buildVoiceDeliveryRuntimeReport(options.runtime));
12708
12739
  if (tickPath !== false) {
@@ -12738,7 +12769,7 @@ var createVoiceDeliveryRuntimeRoutes = (options) => {
12738
12769
  return routes;
12739
12770
  };
12740
12771
  // src/dataControl.ts
12741
- import { Elysia as Elysia15 } from "elysia";
12772
+ import { Elysia as Elysia16 } from "elysia";
12742
12773
  var voiceComplianceRedactionDefaults = {
12743
12774
  keys: [
12744
12775
  "apiKey",
@@ -13145,7 +13176,7 @@ var parseRetentionPolicyBody = (body, options, dryRun) => {
13145
13176
  var createVoiceDataControlRoutes = (options) => {
13146
13177
  const path = options.path ?? "/data-control";
13147
13178
  const title = options.title ?? "AbsoluteJS Voice Data Control";
13148
- const routes = new Elysia15({
13179
+ const routes = new Elysia16({
13149
13180
  name: options.name ?? "absolutejs-voice-data-control"
13150
13181
  });
13151
13182
  routes.get(path, async ({ query }) => {
@@ -13218,15 +13249,15 @@ var createVoiceDataControlRoutes = (options) => {
13218
13249
  return routes;
13219
13250
  };
13220
13251
  // src/evalRoutes.ts
13221
- import { Elysia as Elysia18 } from "elysia";
13252
+ import { Elysia as Elysia19 } from "elysia";
13222
13253
  import { mkdir as mkdir2 } from "fs/promises";
13223
13254
  import { dirname as dirname2 } from "path";
13224
13255
 
13225
13256
  // src/qualityRoutes.ts
13226
- import { Elysia as Elysia17 } from "elysia";
13257
+ import { Elysia as Elysia18 } from "elysia";
13227
13258
 
13228
13259
  // src/handoffHealth.ts
13229
- import { Elysia as Elysia16 } from "elysia";
13260
+ import { Elysia as Elysia17 } from "elysia";
13230
13261
  var escapeHtml18 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
13231
13262
  var getString7 = (value) => typeof value === "string" && value.length > 0 ? value : undefined;
13232
13263
  var isStatus = (value) => value === "delivered" || value === "failed" || value === "skipped";
@@ -13409,7 +13440,7 @@ var createVoiceHandoffHealthHTMLHandler = (options = {}) => async ({ query }) =>
13409
13440
  var createVoiceHandoffHealthRoutes = (options = {}) => {
13410
13441
  const path = options.path ?? "/api/voice-handoffs";
13411
13442
  const htmlPath = options.htmlPath === undefined ? `${path}/htmx` : options.htmlPath;
13412
- const routes = new Elysia16({
13443
+ const routes = new Elysia17({
13413
13444
  name: options.name ?? "absolutejs-voice-handoff-health"
13414
13445
  }).get(path, createVoiceHandoffHealthJSONHandler(options));
13415
13446
  if (htmlPath) {
@@ -13540,7 +13571,7 @@ var renderVoiceQualityHTML = (report, options = {}) => {
13540
13571
  };
13541
13572
  var createVoiceQualityRoutes = (options) => {
13542
13573
  const path = options.path ?? "/quality";
13543
- const routes = new Elysia17({
13574
+ const routes = new Elysia18({
13544
13575
  name: options.name ?? "absolutejs-voice-quality"
13545
13576
  });
13546
13577
  const getReport = () => evaluateVoiceQuality({
@@ -13953,7 +13984,7 @@ var renderVoiceScenarioFixtureEvalHTML = (report, options = {}) => {
13953
13984
  };
13954
13985
  var createVoiceEvalRoutes = (options) => {
13955
13986
  const path = options.path ?? "/evals";
13956
- const routes = new Elysia18({
13987
+ const routes = new Elysia19({
13957
13988
  name: options.name ?? "absolutejs-voice-evals"
13958
13989
  });
13959
13990
  const getReport = () => runVoiceSessionEvals({
@@ -14090,10 +14121,10 @@ var createVoiceEvalRoutes = (options) => {
14090
14121
  return routes;
14091
14122
  };
14092
14123
  // src/simulationSuite.ts
14093
- import { Elysia as Elysia21 } from "elysia";
14124
+ import { Elysia as Elysia22 } from "elysia";
14094
14125
 
14095
14126
  // src/outcomeContract.ts
14096
- import { Elysia as Elysia19 } from "elysia";
14127
+ import { Elysia as Elysia20 } from "elysia";
14097
14128
  var escapeHtml21 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
14098
14129
  var resolveSessionHref2 = (value, sessionId) => {
14099
14130
  if (value === false) {
@@ -14259,7 +14290,7 @@ var createVoiceOutcomeContractHTMLHandler = (options) => async () => {
14259
14290
  var createVoiceOutcomeContractRoutes = (options) => {
14260
14291
  const path = options.path ?? "/api/outcome-contracts";
14261
14292
  const htmlPath = options.htmlPath === undefined ? `${path}/htmx` : options.htmlPath;
14262
- const routes = new Elysia19({
14293
+ const routes = new Elysia20({
14263
14294
  name: options.name ?? "absolutejs-voice-outcome-contracts"
14264
14295
  }).get(path, createVoiceOutcomeContractJSONHandler(options));
14265
14296
  if (htmlPath) {
@@ -14269,7 +14300,7 @@ var createVoiceOutcomeContractRoutes = (options) => {
14269
14300
  };
14270
14301
 
14271
14302
  // src/toolContract.ts
14272
- import { Elysia as Elysia20 } from "elysia";
14303
+ import { Elysia as Elysia21 } from "elysia";
14273
14304
 
14274
14305
  // src/toolRuntime.ts
14275
14306
  var toErrorMessage4 = (error) => error instanceof Error ? error.message : String(error);
@@ -14721,7 +14752,7 @@ var createVoiceToolContractHTMLHandler = (options) => async () => {
14721
14752
  var createVoiceToolContractRoutes = (options) => {
14722
14753
  const path = options.path ?? "/api/tool-contracts";
14723
14754
  const htmlPath = options.htmlPath === undefined ? `${path}/htmx` : options.htmlPath;
14724
- const routes = new Elysia20({
14755
+ const routes = new Elysia21({
14725
14756
  name: options.name ?? "absolutejs-voice-tool-contracts"
14726
14757
  }).get(path, createVoiceToolContractJSONHandler(options));
14727
14758
  if (htmlPath) {
@@ -14918,7 +14949,7 @@ app.use(
14918
14949
  var createVoiceSimulationSuiteRoutes = (options) => {
14919
14950
  const path = options.path ?? "/api/voice/simulations";
14920
14951
  const htmlPath = options.htmlPath === undefined ? "/voice/simulations" : options.htmlPath;
14921
- const app = new Elysia21({
14952
+ const app = new Elysia22({
14922
14953
  name: options.name ?? "absolutejs-voice-simulation-suite"
14923
14954
  }).get(path, () => runVoiceSimulationSuite(options));
14924
14955
  if (htmlPath) {
@@ -15230,7 +15261,7 @@ var createVoiceWorkflowContractHandler = (input) => {
15230
15261
  };
15231
15262
  };
15232
15263
  // src/sessionReplay.ts
15233
- import { Elysia as Elysia22 } from "elysia";
15264
+ import { Elysia as Elysia23 } from "elysia";
15234
15265
  var getString10 = (value) => typeof value === "string" ? value : undefined;
15235
15266
  var escapeHtml24 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
15236
15267
  var increment4 = (record, key) => {
@@ -15470,7 +15501,7 @@ var createVoiceSessionsHTMLHandler = (options = {}) => async ({ query }) => {
15470
15501
  var createVoiceSessionListRoutes = (options = {}) => {
15471
15502
  const path = options.path ?? "/api/voice-sessions";
15472
15503
  const htmlPath = options.htmlPath === undefined ? `${path}/htmx` : options.htmlPath;
15473
- const routes = new Elysia22({
15504
+ const routes = new Elysia23({
15474
15505
  name: options.name ?? "absolutejs-voice-session-list"
15475
15506
  }).get(path, createVoiceSessionsJSONHandler(options));
15476
15507
  if (htmlPath) {
@@ -15498,7 +15529,7 @@ var createVoiceSessionReplayHTMLHandler = (options) => async ({ params }) => {
15498
15529
  var createVoiceSessionReplayRoutes = (options) => {
15499
15530
  const path = options.path ?? "/api/voice-sessions/:sessionId/replay";
15500
15531
  const htmlPath = options.htmlPath === undefined ? `${path}/htmx` : options.htmlPath;
15501
- const routes = new Elysia22({
15532
+ const routes = new Elysia23({
15502
15533
  name: options.name ?? "absolutejs-voice-session-replay"
15503
15534
  }).get(path, createVoiceSessionReplayJSONHandler(options));
15504
15535
  if (htmlPath) {
@@ -15727,7 +15758,7 @@ var assertVoiceAgentSquadContract = async (options) => {
15727
15758
  return report;
15728
15759
  };
15729
15760
  // src/turnLatency.ts
15730
- import { Elysia as Elysia23 } from "elysia";
15761
+ import { Elysia as Elysia24 } from "elysia";
15731
15762
  var DEFAULT_WARN_AFTER_MS = 1800;
15732
15763
  var DEFAULT_FAIL_AFTER_MS = 3200;
15733
15764
  var escapeHtml25 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
@@ -15883,7 +15914,7 @@ var createVoiceTurnLatencyHTMLHandler = (options) => async () => {
15883
15914
  var createVoiceTurnLatencyRoutes = (options) => {
15884
15915
  const path = options.path ?? "/api/turn-latency";
15885
15916
  const htmlPath = options.htmlPath === undefined ? `${path}/htmx` : options.htmlPath;
15886
- const routes = new Elysia23({
15917
+ const routes = new Elysia24({
15887
15918
  name: options.name ?? "absolutejs-voice-turn-latency"
15888
15919
  }).get(path, createVoiceTurnLatencyJSONHandler(options));
15889
15920
  if (htmlPath) {
@@ -15892,7 +15923,7 @@ var createVoiceTurnLatencyRoutes = (options) => {
15892
15923
  return routes;
15893
15924
  };
15894
15925
  // src/liveLatency.ts
15895
- import { Elysia as Elysia24 } from "elysia";
15926
+ import { Elysia as Elysia25 } from "elysia";
15896
15927
  var escapeHtml26 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
15897
15928
  var percentile = (values, percentileValue) => {
15898
15929
  if (values.length === 0) {
@@ -15966,7 +15997,7 @@ await traceStore.append({
15966
15997
  var createVoiceLiveLatencyRoutes = (options) => {
15967
15998
  const path = options.path ?? "/api/live-latency";
15968
15999
  const htmlPath = options.htmlPath === undefined ? "/live-latency" : options.htmlPath;
15969
- const routes = new Elysia24({
16000
+ const routes = new Elysia25({
15970
16001
  name: options.name ?? "absolutejs-voice-live-latency"
15971
16002
  }).get(path, () => summarizeVoiceLiveLatency(options));
15972
16003
  if (htmlPath) {
@@ -16285,7 +16316,7 @@ None.
16285
16316
  `}`;
16286
16317
  };
16287
16318
  // src/turnQuality.ts
16288
- import { Elysia as Elysia25 } from "elysia";
16319
+ import { Elysia as Elysia26 } from "elysia";
16289
16320
  var DEFAULT_CONFIDENCE_WARN_THRESHOLD = 0.72;
16290
16321
  var escapeHtml27 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
16291
16322
  var getTurnLatencyMs = (turn) => {
@@ -16392,7 +16423,7 @@ var createVoiceTurnQualityHTMLHandler = (options) => async () => {
16392
16423
  var createVoiceTurnQualityRoutes = (options) => {
16393
16424
  const path = options.path ?? "/api/turn-quality";
16394
16425
  const htmlPath = options.htmlPath === undefined ? `${path}/htmx` : options.htmlPath;
16395
- const routes = new Elysia25({
16426
+ const routes = new Elysia26({
16396
16427
  name: options.name ?? "absolutejs-voice-turn-quality"
16397
16428
  }).get(path, createVoiceTurnQualityJSONHandler(options));
16398
16429
  if (htmlPath) {
@@ -16401,7 +16432,7 @@ var createVoiceTurnQualityRoutes = (options) => {
16401
16432
  return routes;
16402
16433
  };
16403
16434
  // src/telephonyOutcome.ts
16404
- import { Elysia as Elysia26 } from "elysia";
16435
+ import { Elysia as Elysia27 } from "elysia";
16405
16436
  var DEFAULT_COMPLETED_STATUSES = [
16406
16437
  "answered",
16407
16438
  "completed",
@@ -17051,7 +17082,7 @@ var createVoiceTelephonyWebhookHandler = (options = {}) => async (input) => {
17051
17082
  var createVoiceTelephonyWebhookRoutes = (options = {}) => {
17052
17083
  const path = options.path ?? "/api/voice/telephony/webhook";
17053
17084
  const handler = createVoiceTelephonyWebhookHandler(options);
17054
- return new Elysia26({
17085
+ return new Elysia27({
17055
17086
  name: options.name ?? "absolutejs-voice-telephony-webhooks"
17056
17087
  }).post(path, async ({ query, request }) => {
17057
17088
  try {
@@ -17072,11 +17103,11 @@ var createVoiceTelephonyWebhookRoutes = (options = {}) => {
17072
17103
  });
17073
17104
  };
17074
17105
  // src/phoneAgent.ts
17075
- import { Elysia as Elysia32 } from "elysia";
17106
+ import { Elysia as Elysia33 } from "elysia";
17076
17107
 
17077
17108
  // src/telephony/plivo.ts
17078
17109
  import { Buffer as Buffer5 } from "buffer";
17079
- import { Elysia as Elysia28 } from "elysia";
17110
+ import { Elysia as Elysia29 } from "elysia";
17080
17111
 
17081
17112
  // src/telephony/contract.ts
17082
17113
  var DEFAULT_REQUIREMENTS = [
@@ -17160,7 +17191,7 @@ var evaluateVoiceTelephonyContract = (input) => {
17160
17191
 
17161
17192
  // src/telephony/twilio.ts
17162
17193
  import { Buffer as Buffer4 } from "buffer";
17163
- import { Elysia as Elysia27 } from "elysia";
17194
+ import { Elysia as Elysia28 } from "elysia";
17164
17195
  var TWILIO_MULAW_SAMPLE_RATE = 8000;
17165
17196
  var VOICE_PCM_SAMPLE_RATE = 16000;
17166
17197
  var escapeXml2 = (value) => value.replaceAll("&", "&amp;").replaceAll('"', "&quot;").replaceAll("'", "&apos;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
@@ -17733,7 +17764,7 @@ var createTwilioVoiceRoutes = (options) => {
17733
17764
  const smokePath = options.smoke?.path === false ? false : options.smoke?.path ?? "/api/voice/twilio/smoke";
17734
17765
  const bridges = new WeakMap;
17735
17766
  const webhookPolicy = options.webhook?.policy ?? options.outcomePolicy ?? createVoiceTelephonyOutcomePolicy();
17736
- const app = new Elysia27({
17767
+ const app = new Elysia28({
17737
17768
  name: options.name ?? "absolutejs-voice-twilio"
17738
17769
  }).get(twimlPath, async ({ query, request }) => {
17739
17770
  const streamUrl = await resolveTwilioStreamUrl(options, {
@@ -18230,7 +18261,7 @@ var createPlivoVoiceRoutes = (options = {}) => {
18230
18261
  request: input.request
18231
18262
  }) : verificationUrl ?? input.request.url
18232
18263
  }) : undefined);
18233
- const app = new Elysia28({
18264
+ const app = new Elysia29({
18234
18265
  name: options.name ?? "absolutejs-voice-plivo"
18235
18266
  }).get(answerPath, async ({ query, request }) => {
18236
18267
  const streamUrl = await resolvePlivoStreamUrl(options, {
@@ -18341,7 +18372,7 @@ var createPlivoVoiceRoutes = (options = {}) => {
18341
18372
 
18342
18373
  // src/telephony/telnyx.ts
18343
18374
  import { Buffer as Buffer6 } from "buffer";
18344
- import { Elysia as Elysia29 } from "elysia";
18375
+ import { Elysia as Elysia30 } from "elysia";
18345
18376
  var escapeXml4 = (value) => value.replaceAll("&", "&amp;").replaceAll('"', "&quot;").replaceAll("'", "&apos;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
18346
18377
  var escapeHtml30 = (value) => value.replaceAll("&", "&amp;").replaceAll('"', "&quot;").replaceAll("'", "&#39;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
18347
18378
  var joinUrlPath4 = (origin, path) => `${origin.replace(/\/$/, "")}${path.startsWith("/") ? path : `/${path}`}`;
@@ -18652,7 +18683,7 @@ var createTelnyxVoiceRoutes = (options = {}) => {
18652
18683
  publicKey: options.webhook?.publicKey,
18653
18684
  toleranceSeconds: options.webhook?.toleranceSeconds
18654
18685
  }) : undefined);
18655
- const app = new Elysia29({
18686
+ const app = new Elysia30({
18656
18687
  name: options.name ?? "absolutejs-voice-telnyx"
18657
18688
  }).get(texmlPath, async ({ query, request }) => {
18658
18689
  const streamUrl = await resolveTelnyxStreamUrl(options, {
@@ -18762,7 +18793,7 @@ var createTelnyxVoiceRoutes = (options = {}) => {
18762
18793
  };
18763
18794
 
18764
18795
  // src/telephony/matrix.ts
18765
- import { Elysia as Elysia30 } from "elysia";
18796
+ import { Elysia as Elysia31 } from "elysia";
18766
18797
  var escapeHtml31 = (value) => value.replaceAll("&", "&amp;").replaceAll('"', "&quot;").replaceAll("'", "&#39;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
18767
18798
  var labelForProvider = (provider) => provider.split("-").map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`).join(" ");
18768
18799
  var resolveEntryStatus = (contract, setup, smoke) => {
@@ -18846,7 +18877,7 @@ ${entry.issues.length ? `<ul style="margin:12px 0 0; padding-left:18px;">${entry
18846
18877
  </main>`;
18847
18878
  var createVoiceTelephonyCarrierMatrixRoutes = (options) => {
18848
18879
  const path = options.path ?? "/api/voice/telephony/carriers";
18849
- return new Elysia30({
18880
+ return new Elysia31({
18850
18881
  name: options.name ?? "absolutejs-voice-telephony-carrier-matrix"
18851
18882
  }).get(path, async ({ query, request }) => {
18852
18883
  const providers = await options.load({ query, request });
@@ -18868,7 +18899,7 @@ var createVoiceTelephonyCarrierMatrixRoutes = (options) => {
18868
18899
  };
18869
18900
 
18870
18901
  // src/phoneAgentProductionSmoke.ts
18871
- import { Elysia as Elysia31 } from "elysia";
18902
+ import { Elysia as Elysia32 } from "elysia";
18872
18903
  var defaultRequirements = [
18873
18904
  "media-started",
18874
18905
  "transcript",
@@ -19011,7 +19042,7 @@ var createVoicePhoneAgentProductionSmokeHTMLHandler = (options) => async ({
19011
19042
  var createVoicePhoneAgentProductionSmokeRoutes = (options) => {
19012
19043
  const path = options.path ?? "/api/voice/phone/smoke-contract";
19013
19044
  const htmlPath = options.htmlPath === undefined ? "/voice/phone/smoke-contract" : options.htmlPath;
19014
- const routes = new Elysia31({
19045
+ const routes = new Elysia32({
19015
19046
  name: options.name ?? "absolutejs-voice-phone-smoke-contract"
19016
19047
  }).get(path, createVoicePhoneAgentProductionSmokeJSONHandler(options));
19017
19048
  if (htmlPath) {
@@ -19199,7 +19230,7 @@ var createVoicePhoneAgent = (options) => {
19199
19230
  setupPath: resolveSetupPath(carrier),
19200
19231
  smokePath: resolveSmokePath(carrier)
19201
19232
  }));
19202
- const app = new Elysia32({
19233
+ const app = new Elysia33({
19203
19234
  name: options.name ?? "absolutejs-voice-phone-agent"
19204
19235
  });
19205
19236
  for (const carrier of options.carriers) {
@@ -21258,7 +21289,7 @@ var createOpenAIVoiceTTS = (options) => {
21258
21289
  };
21259
21290
  };
21260
21291
  // src/providerCapabilities.ts
21261
- import { Elysia as Elysia33 } from "elysia";
21292
+ import { Elysia as Elysia34 } from "elysia";
21262
21293
  var escapeHtml34 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
21263
21294
  var fromProviderList = (kind, providers, options) => (providers ?? []).map((provider) => ({
21264
21295
  configured: true,
@@ -21359,7 +21390,7 @@ var createVoiceProviderCapabilityHTMLHandler = (options) => async () => {
21359
21390
  var createVoiceProviderCapabilityRoutes = (options) => {
21360
21391
  const path = options.path ?? "/api/provider-capabilities";
21361
21392
  const htmlPath = options.htmlPath === undefined ? `${path}/htmx` : options.htmlPath;
21362
- const routes = new Elysia33({
21393
+ const routes = new Elysia34({
21363
21394
  name: options.name ?? "absolutejs-voice-provider-capabilities"
21364
21395
  }).get(path, createVoiceProviderCapabilityJSONHandler(options));
21365
21396
  if (htmlPath) {
@@ -21368,7 +21399,7 @@ var createVoiceProviderCapabilityRoutes = (options) => {
21368
21399
  return routes;
21369
21400
  };
21370
21401
  // src/resilienceRoutes.ts
21371
- import { Elysia as Elysia34 } from "elysia";
21402
+ import { Elysia as Elysia35 } from "elysia";
21372
21403
  var escapeHtml35 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
21373
21404
  var getString13 = (value) => typeof value === "string" ? value : undefined;
21374
21405
  var getNumber7 = (value) => typeof value === "number" && Number.isFinite(value) ? value : undefined;
@@ -21812,7 +21843,7 @@ var registerSimulationRoutes = (routes, simulation, defaultPathPrefix) => {
21812
21843
  };
21813
21844
  var createVoiceResilienceRoutes = (options) => {
21814
21845
  const path = options.path ?? "/resilience";
21815
- const routes = new Elysia34({
21846
+ const routes = new Elysia35({
21816
21847
  name: options.name ?? "absolutejs-voice-resilience"
21817
21848
  }).get(path, async () => {
21818
21849
  const events = await options.store.list();
@@ -21890,7 +21921,7 @@ var assertVoiceProviderRoutingContract = async (options) => {
21890
21921
  return report;
21891
21922
  };
21892
21923
  // src/providerSlo.ts
21893
- import { Elysia as Elysia35 } from "elysia";
21924
+ import { Elysia as Elysia36 } from "elysia";
21894
21925
  var defaultThresholds = {
21895
21926
  llm: {
21896
21927
  maxAverageElapsedMs: 2500,
@@ -22157,7 +22188,7 @@ var createVoiceProviderSloRoutes = (options) => {
22157
22188
  ...options.headers ?? {}
22158
22189
  };
22159
22190
  const buildReport = () => buildVoiceProviderSloReport(options);
22160
- const app = new Elysia35({ name: options.name ?? "absolute-voice-provider-slos" });
22191
+ const app = new Elysia36({ name: options.name ?? "absolute-voice-provider-slos" });
22161
22192
  app.get(path, async () => Response.json(await buildReport(), { headers }));
22162
22193
  if (markdownPath !== false) {
22163
22194
  app.get(markdownPath, async () => {
@@ -22187,10 +22218,10 @@ var createVoiceProviderSloRoutes = (options) => {
22187
22218
  return app;
22188
22219
  };
22189
22220
  // src/productionReadiness.ts
22190
- import { Elysia as Elysia40 } from "elysia";
22221
+ import { Elysia as Elysia41 } from "elysia";
22191
22222
 
22192
22223
  // src/opsRecovery.ts
22193
- import { Elysia as Elysia36 } from "elysia";
22224
+ import { Elysia as Elysia37 } from "elysia";
22194
22225
  var escapeHtml37 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
22195
22226
  var getString14 = (value) => typeof value === "string" && value.trim() ? value.trim() : undefined;
22196
22227
  var hrefForSession = (value, sessionId) => {
@@ -22417,7 +22448,7 @@ var createVoiceOpsRecoveryRoutes = (options = {}) => {
22417
22448
  const path = options.path ?? "/api/voice/ops-recovery";
22418
22449
  const htmlPath = options.htmlPath === undefined ? "/ops-recovery" : options.htmlPath;
22419
22450
  const markdownPath = options.markdownPath === undefined ? `${path}.md` : options.markdownPath;
22420
- const routes = new Elysia36({
22451
+ const routes = new Elysia37({
22421
22452
  name: options.name ?? "absolutejs-voice-ops-recovery"
22422
22453
  }).get(path, async () => buildVoiceOpsRecoveryReport(options));
22423
22454
  if (htmlPath) {
@@ -22447,17 +22478,17 @@ var createVoiceOpsRecoveryRoutes = (options = {}) => {
22447
22478
  };
22448
22479
 
22449
22480
  // src/observabilityExport.ts
22450
- import { Elysia as Elysia39 } from "elysia";
22481
+ import { Elysia as Elysia40 } from "elysia";
22451
22482
  import { Database } from "bun:sqlite";
22452
22483
  import { createHash } from "crypto";
22453
22484
  import { mkdir as mkdir4, readFile as readFile2, stat, unlink } from "fs/promises";
22454
22485
  import { join as join3 } from "path";
22455
22486
 
22456
22487
  // src/operationsRecord.ts
22457
- import { Elysia as Elysia38 } from "elysia";
22488
+ import { Elysia as Elysia39 } from "elysia";
22458
22489
 
22459
22490
  // src/traceTimeline.ts
22460
- import { Elysia as Elysia37 } from "elysia";
22491
+ import { Elysia as Elysia38 } from "elysia";
22461
22492
  var escapeHtml38 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
22462
22493
  var getString15 = (value) => typeof value === "string" && value.trim() ? value : undefined;
22463
22494
  var getNumber8 = (value) => typeof value === "number" && Number.isFinite(value) ? value : undefined;
@@ -22683,7 +22714,7 @@ var createVoiceTraceTimelineRoutes = (options) => {
22683
22714
  const path = options.path ?? "/api/voice-traces";
22684
22715
  const htmlPath = options.htmlPath ?? "/traces";
22685
22716
  const title = options.title ?? "AbsoluteJS Voice Trace Timelines";
22686
- const routes = new Elysia37({
22717
+ const routes = new Elysia38({
22687
22718
  name: options.name ?? "absolutejs-voice-trace-timelines"
22688
22719
  });
22689
22720
  const buildReport = async () => summarizeVoiceTraceTimeline(await options.store.list(), {
@@ -22934,7 +22965,7 @@ var createVoiceOperationsRecordRoutes = (options) => {
22934
22965
  const htmlPath = options.htmlPath === undefined ? "/voice-operations/:sessionId" : options.htmlPath;
22935
22966
  const incidentPath = options.incidentPath === undefined ? `${path}/incident.md` : options.incidentPath;
22936
22967
  const incidentHtmlPath = options.incidentHtmlPath === undefined && htmlPath ? `${htmlPath}/incident.md` : options.incidentHtmlPath;
22937
- const routes = new Elysia38({
22968
+ const routes = new Elysia39({
22938
22969
  name: options.name ?? "absolutejs-voice-operations-record"
22939
22970
  });
22940
22971
  const buildRecord = (sessionId) => buildVoiceOperationsRecord({
@@ -23529,7 +23560,7 @@ var createVoiceObservabilityExportReplayRoutes = (options) => {
23529
23560
  ...options.headers ?? {}
23530
23561
  };
23531
23562
  const buildReport = () => resolveVoiceObservabilityExportReplayReport(options.source);
23532
- const app = new Elysia39({
23563
+ const app = new Elysia40({
23533
23564
  name: options.name ?? "absolute-voice-observability-export-replay"
23534
23565
  });
23535
23566
  app.get(path, async () => Response.json(await buildReport(), { headers }));
@@ -24255,7 +24286,7 @@ var createVoiceObservabilityExportRoutes = (options = {}) => {
24255
24286
  artifactDownload: options.links?.artifactDownload ?? (artifactDownloadPath ? (artifact) => `${artifactDownloadPath}/${encodeURIComponent(artifact.id)}` : undefined)
24256
24287
  }
24257
24288
  });
24258
- const app = new Elysia39({
24289
+ const app = new Elysia40({
24259
24290
  name: options.name ?? "absolute-voice-observability-export"
24260
24291
  });
24261
24292
  app.get(path, async () => Response.json(await buildReport(), { headers }));
@@ -25560,7 +25591,7 @@ var createVoiceProductionReadinessRoutes = (options) => {
25560
25591
  const path = options.path ?? "/api/production-readiness";
25561
25592
  const gatePath = options.gatePath === undefined ? "/api/production-readiness/gate" : options.gatePath;
25562
25593
  const htmlPath = options.htmlPath ?? "/production-readiness";
25563
- const routes = new Elysia40({
25594
+ const routes = new Elysia41({
25564
25595
  name: options.name ?? "absolutejs-voice-production-readiness"
25565
25596
  });
25566
25597
  routes.get(path, async ({ query, request }) => buildVoiceProductionReadinessReport(options, { query, request }));
@@ -25945,7 +25976,7 @@ var recommendVoiceReadinessProfile = (options) => {
25945
25976
  };
25946
25977
  };
25947
25978
  // src/providerStackRecommendations.ts
25948
- import { Elysia as Elysia41 } from "elysia";
25979
+ import { Elysia as Elysia42 } from "elysia";
25949
25980
  var escapeHtml41 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
25950
25981
  var profileProviderPriorities = {
25951
25982
  "meeting-recorder": {
@@ -26235,7 +26266,7 @@ var createVoiceProviderContractMatrixHTMLHandler = (options) => async () => {
26235
26266
  var createVoiceProviderContractMatrixRoutes = (options) => {
26236
26267
  const path = options.path ?? "/api/provider-contracts";
26237
26268
  const htmlPath = options.htmlPath ?? "/provider-contracts";
26238
- const routes = new Elysia41({
26269
+ const routes = new Elysia42({
26239
26270
  name: options.name ?? "absolutejs-voice-provider-contract-matrix"
26240
26271
  });
26241
26272
  const jsonHandler = createVoiceProviderContractMatrixJSONHandler(options.matrix);
@@ -26294,7 +26325,7 @@ var evaluateVoiceProviderStackGaps = (input) => {
26294
26325
  };
26295
26326
  };
26296
26327
  // src/opsConsoleRoutes.ts
26297
- import { Elysia as Elysia42 } from "elysia";
26328
+ import { Elysia as Elysia43 } from "elysia";
26298
26329
  var DEFAULT_LINKS = [
26299
26330
  {
26300
26331
  description: "Quality gates for CI, deploy checks, and production readiness.",
@@ -26411,7 +26442,7 @@ var renderVoiceOpsConsoleHTML = (report, options = {}) => {
26411
26442
  };
26412
26443
  var createVoiceOpsConsoleRoutes = (options) => {
26413
26444
  const path = options.path ?? "/ops-console";
26414
- const routes = new Elysia42({
26445
+ const routes = new Elysia43({
26415
26446
  name: options.name ?? "absolutejs-voice-ops-console"
26416
26447
  });
26417
26448
  const getReport = () => buildVoiceOpsConsoleReport(options);
@@ -26428,7 +26459,7 @@ var createVoiceOpsConsoleRoutes = (options) => {
26428
26459
  return routes;
26429
26460
  };
26430
26461
  // src/incidentBundle.ts
26431
- import { Elysia as Elysia43 } from "elysia";
26462
+ import { Elysia as Elysia44 } from "elysia";
26432
26463
  var filterIncidentBundleArtifacts = (artifacts, filter = {}) => artifacts.filter((artifact) => {
26433
26464
  if (filter.sessionId && artifact.sessionId !== filter.sessionId) {
26434
26465
  return false;
@@ -26627,7 +26658,7 @@ var buildVoiceIncidentBundle = async (options) => {
26627
26658
  var createVoiceIncidentBundleRoutes = (options) => {
26628
26659
  const path = options.path ?? "/api/voice-incidents/:sessionId";
26629
26660
  const markdownPath = options.markdownPath === undefined ? "/voice-incidents/:sessionId/markdown" : options.markdownPath;
26630
- const routes = new Elysia43({
26661
+ const routes = new Elysia44({
26631
26662
  name: options.name ?? "absolutejs-voice-incident-bundle"
26632
26663
  });
26633
26664
  const getSessionId = (params) => params.sessionId ?? "";
@@ -26828,7 +26859,7 @@ var summarizeVoiceOpsStatus = async (options) => {
26828
26859
  };
26829
26860
  };
26830
26861
  // src/opsStatusRoutes.ts
26831
- import { Elysia as Elysia44 } from "elysia";
26862
+ import { Elysia as Elysia45 } from "elysia";
26832
26863
  var escapeHtml43 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
26833
26864
  var renderVoiceOpsStatusHTML = (report, options = {}) => {
26834
26865
  const title = options.title ?? "AbsoluteJS Voice Ops Status";
@@ -26840,7 +26871,7 @@ var renderVoiceOpsStatusHTML = (report, options = {}) => {
26840
26871
  };
26841
26872
  var createVoiceOpsStatusRoutes = (options) => {
26842
26873
  const path = options.path ?? "/api/voice/ops-status";
26843
- const routes = new Elysia44({
26874
+ const routes = new Elysia45({
26844
26875
  name: options.name ?? "absolutejs-voice-ops-status"
26845
26876
  });
26846
26877
  routes.get(path, async () => summarizeVoiceOpsStatus(options));
@@ -27273,7 +27304,7 @@ var createVoiceTTSProviderRouter = (options) => {
27273
27304
  };
27274
27305
  };
27275
27306
  // src/traceDeliveryRoutes.ts
27276
- import { Elysia as Elysia45 } from "elysia";
27307
+ import { Elysia as Elysia46 } from "elysia";
27277
27308
  var escapeHtml44 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
27278
27309
  var getString19 = (value) => typeof value === "string" && value.trim() ? value.trim() : undefined;
27279
27310
  var getNumber11 = (value) => {
@@ -27382,7 +27413,7 @@ var createVoiceTraceDeliveryRoutes = (options) => {
27382
27413
  const path = options.path ?? "/api/voice-trace-deliveries";
27383
27414
  const htmlPath = options.htmlPath === undefined ? "/traces/deliveries" : options.htmlPath;
27384
27415
  const workerPath = options.workerPath === undefined ? `${path}/drain` : options.workerPath;
27385
- const routes = new Elysia45({
27416
+ const routes = new Elysia46({
27386
27417
  name: options.name ?? "absolutejs-voice-trace-deliveries"
27387
27418
  }).get(path, createVoiceTraceDeliveryJSONHandler(options));
27388
27419
  if (htmlPath !== false) {
@@ -28006,7 +28037,7 @@ var createVoiceMemoryStore = () => {
28006
28037
  return { get, getOrCreate, list, remove, set };
28007
28038
  };
28008
28039
  // src/opsWebhook.ts
28009
- import { Elysia as Elysia46 } from "elysia";
28040
+ import { Elysia as Elysia47 } from "elysia";
28010
28041
  var toHex6 = (bytes) => Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
28011
28042
  var signVoiceOpsWebhookBody = async (input) => {
28012
28043
  const encoder = new TextEncoder;
@@ -28136,7 +28167,7 @@ var verifyVoiceOpsWebhookSignature = async (input) => {
28136
28167
  };
28137
28168
  var createVoiceOpsWebhookReceiverRoutes = (options = {}) => {
28138
28169
  const path = options.path ?? "/api/voice-ops/webhook";
28139
- return new Elysia46().post(path, async ({ body, request, set }) => {
28170
+ return new Elysia47().post(path, async ({ body, request, set }) => {
28140
28171
  const bodyText = typeof body === "string" ? body : JSON.stringify(body);
28141
28172
  if (options.signingSecret) {
28142
28173
  const verification = await verifyVoiceOpsWebhookSignature({
@@ -29274,6 +29305,7 @@ export {
29274
29305
  createVoicePostgresAuditSinkDeliveryStore,
29275
29306
  createVoicePostgresAuditEventStore,
29276
29307
  createVoicePlivoCampaignDialer,
29308
+ createVoicePlatformCoverageRoutes,
29277
29309
  createVoicePhoneAgentProductionSmokeRoutes,
29278
29310
  createVoicePhoneAgentProductionSmokeJSONHandler,
29279
29311
  createVoicePhoneAgentProductionSmokeHTMLHandler,
@@ -29427,6 +29459,7 @@ export {
29427
29459
  buildVoiceProviderContractMatrix,
29428
29460
  buildVoiceProductionReadinessReport,
29429
29461
  buildVoiceProductionReadinessGate,
29462
+ buildVoicePlatformCoverageSummary,
29430
29463
  buildVoiceOpsTaskFromSLABreach,
29431
29464
  buildVoiceOpsTaskFromReview,
29432
29465
  buildVoiceOpsRecoveryReport,
@@ -0,0 +1,73 @@
1
+ import { Elysia } from 'elysia';
2
+ export type VoicePlatformCoverageStatus = 'fail' | 'missing' | 'pass' | 'stale';
3
+ export type VoicePlatformCoverageEvidence = {
4
+ method?: string;
5
+ name: string;
6
+ ok?: boolean;
7
+ path?: string;
8
+ status?: number;
9
+ url?: string;
10
+ };
11
+ export type VoicePlatformCoverageSurface = {
12
+ evidence: VoicePlatformCoverageEvidence[];
13
+ failed?: number;
14
+ gap?: string;
15
+ missing?: number;
16
+ missingEvidence?: string[];
17
+ replacement: string;
18
+ status: 'fail' | 'pass' | string;
19
+ surface: string;
20
+ };
21
+ export type VoicePlatformCoverageSummary = {
22
+ generatedAt?: string;
23
+ ok: boolean;
24
+ outputDir?: string;
25
+ runId?: string;
26
+ source?: string;
27
+ status: VoicePlatformCoverageStatus;
28
+ total: number;
29
+ coverage: VoicePlatformCoverageSurface[];
30
+ };
31
+ export type VoicePlatformCoverageSummaryInput = {
32
+ coverage?: VoicePlatformCoverageSurface[];
33
+ generatedAt?: string;
34
+ ok?: boolean;
35
+ outputDir?: string;
36
+ runId?: string;
37
+ source?: string;
38
+ };
39
+ export type VoicePlatformCoverageRoutesOptions = {
40
+ headers?: HeadersInit;
41
+ name?: string;
42
+ path?: string;
43
+ source: (() => Promise<VoicePlatformCoverageSummary | VoicePlatformCoverageSummaryInput> | VoicePlatformCoverageSummary | VoicePlatformCoverageSummaryInput) | VoicePlatformCoverageSummary | VoicePlatformCoverageSummaryInput;
44
+ };
45
+ export declare const buildVoicePlatformCoverageSummary: (input: VoicePlatformCoverageSummaryInput) => VoicePlatformCoverageSummary;
46
+ export declare const createVoicePlatformCoverageRoutes: (options: VoicePlatformCoverageRoutesOptions) => Elysia<"", {
47
+ decorator: {};
48
+ store: {};
49
+ derive: {};
50
+ resolve: {};
51
+ }, {
52
+ typebox: {};
53
+ error: {};
54
+ }, {
55
+ schema: {};
56
+ standaloneSchema: {};
57
+ macro: {};
58
+ macroFn: {};
59
+ parser: {};
60
+ response: {};
61
+ }, {}, {
62
+ derive: {};
63
+ resolve: {};
64
+ schema: {};
65
+ standaloneSchema: {};
66
+ response: {};
67
+ }, {
68
+ derive: {};
69
+ resolve: {};
70
+ schema: {};
71
+ standaloneSchema: {};
72
+ response: {};
73
+ }>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.236",
3
+ "version": "0.0.22-beta.238",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",