@absolutejs/voice 0.0.22-beta.458 → 0.0.22-beta.459

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.d.ts CHANGED
@@ -93,6 +93,8 @@ export { createVoiceReadinessProfile, recommendVoiceReadinessProfile, } from "./
93
93
  export { assertVoiceProviderContractMatrixEvidence, assertVoiceProviderStackEvidence, buildVoiceProviderContractMatrix, createVoiceProviderContractMatrixHTMLHandler, createVoiceProviderContractMatrixJSONHandler, createVoiceProviderContractMatrixPreset, createVoiceProviderContractMatrixRoutes, evaluateVoiceProviderContractMatrixEvidence, evaluateVoiceProviderStackEvidence, evaluateVoiceProviderStackGaps, renderVoiceProviderContractMatrixHTML, recommendVoiceProviderStack, } from "./providerStackRecommendations";
94
94
  export { buildVoiceOpsConsoleReport, createVoiceOpsConsoleRoutes, renderVoiceOpsConsoleHTML, } from "./opsConsoleRoutes";
95
95
  export { assertVoiceOperationsRecordGuardrails, assertVoiceOperationsRecordProviderRecovery, buildVoiceFailureReplay, buildVoiceOperationsRecord, createVoiceOperationsRecordRoutes, evaluateVoiceOperationsRecordGuardrails, evaluateVoiceOperationsRecordProviderRecovery, renderVoiceFailureReplayMarkdown, renderVoiceOperationsRecordGuardrailMarkdown, renderVoiceOperationsRecordHTML, renderVoiceOperationsRecordIncidentMarkdown, } from "./operationsRecord";
96
+ export { buildVoiceSessionObservabilityReport, createVoiceSessionObservabilityRoutes, renderVoiceSessionObservabilityHTML, renderVoiceSessionObservabilityMarkdown, } from "./sessionObservability";
97
+ export type { VoiceSessionObservabilityLink, VoiceSessionObservabilityReport, VoiceSessionObservabilityReportOptions, VoiceSessionObservabilityRoutesOptions, VoiceSessionObservabilityStage, VoiceSessionObservabilityStatus, VoiceSessionObservabilityTurn, } from "./sessionObservability";
96
98
  export { assertVoiceObservabilityExportDeliveryEvidence, assertVoiceObservabilityExportRecord, assertVoiceObservabilityExportReplayEvidence, buildVoiceObservabilityArtifactIndex, buildVoiceObservabilityExportDeliveryHistory, buildVoiceObservabilityExportReplayReport, buildVoiceObservabilityExport, assertVoiceObservabilityExportSchema, createVoiceObservabilityExportSchema, createVoiceFileObservabilityExportDeliveryReceiptStore, createVoiceMemoryObservabilityExportDeliveryReceiptStore, createVoiceObservabilityExportRoutes, createVoiceObservabilityExportReplayRoutes, deliverVoiceObservabilityExport, evaluateVoiceObservabilityExportDeliveryEvidence, evaluateVoiceObservabilityExportReplayEvidence, loadVoiceObservabilityExportReplaySource, replayVoiceObservabilityExport, renderVoiceObservabilityExportReplayHTML, renderVoiceObservabilityExportMarkdown, validateVoiceObservabilityExportRecord, voiceObservabilityExportSchemaId, voiceObservabilityExportSchemaVersion, } from "./observabilityExport";
97
99
  export { buildVoiceOpsRecoveryReadinessCheck, buildVoiceOpsRecoveryReport, createVoiceOpsRecoveryRoutes, renderVoiceOpsRecoveryHTML, renderVoiceOpsRecoveryMarkdown, } from "./opsRecovery";
98
100
  export { buildVoiceIncidentBundle, createStoredVoiceIncidentBundleArtifact, createVoiceIncidentBundleRoutes, createVoiceMemoryIncidentBundleStore, pruneVoiceIncidentBundleArtifacts, saveVoiceIncidentBundleArtifact, } from "./incidentBundle";
package/dist/index.js CHANGED
@@ -39075,8 +39075,248 @@ var createVoiceOpsConsoleRoutes = (options) => {
39075
39075
  routes.get(`${path}/json`, async () => getReport());
39076
39076
  return routes;
39077
39077
  };
39078
- // src/incidentBundle.ts
39078
+ // src/sessionObservability.ts
39079
39079
  import { Elysia as Elysia62 } from "elysia";
39080
+ var escapeHtml59 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
39081
+ var formatMs6 = (value) => value === undefined ? "n/a" : `${String(value)}ms`;
39082
+ var resolveHref = (href, sessionId) => {
39083
+ if (href === false) {
39084
+ return;
39085
+ }
39086
+ if (typeof href === "function") {
39087
+ return href(sessionId);
39088
+ }
39089
+ if (typeof href === "string") {
39090
+ return href.includes(":sessionId") ? href.replaceAll(":sessionId", encodeURIComponent(sessionId)) : `${href.replace(/\/$/, "")}/${encodeURIComponent(sessionId)}`;
39091
+ }
39092
+ return;
39093
+ };
39094
+ var buildLinks = (options) => {
39095
+ const links = [];
39096
+ const add = (rel, label, href) => {
39097
+ if (href) {
39098
+ links.push({ href, label, rel });
39099
+ }
39100
+ };
39101
+ add("operations-record", "Open operations record", resolveHref(options.operationsRecordHref, options.sessionId));
39102
+ add("trace-timeline", "Open trace timeline", resolveHref(options.traceTimelineHref, options.sessionId));
39103
+ add("call-debugger", "Open call debugger", resolveHref(options.callDebuggerHref, options.sessionId));
39104
+ add("incident-markdown", "Download incident Markdown", resolveHref(options.incidentMarkdownHref, options.sessionId));
39105
+ return [...links, ...options.customLinks ?? []];
39106
+ };
39107
+ var buildTurnWaterfalls = (record) => {
39108
+ const byTurn = new Map;
39109
+ const getTurn = (turnId) => {
39110
+ const existing = byTurn.get(turnId);
39111
+ if (existing) {
39112
+ return existing;
39113
+ }
39114
+ const turn = {
39115
+ assistantReplies: 0,
39116
+ errors: 0,
39117
+ providerDecisions: 0,
39118
+ stages: [],
39119
+ toolCalls: 0,
39120
+ transcripts: 0
39121
+ };
39122
+ byTurn.set(turnId, turn);
39123
+ return turn;
39124
+ };
39125
+ for (const event of record.timeline) {
39126
+ if (!event.turnId) {
39127
+ continue;
39128
+ }
39129
+ const turn = getTurn(event.turnId);
39130
+ turn.stages.push({
39131
+ at: event.at,
39132
+ elapsedMs: event.elapsedMs,
39133
+ label: event.label,
39134
+ offsetMs: event.offsetMs,
39135
+ provider: event.provider,
39136
+ status: event.status,
39137
+ type: event.type
39138
+ });
39139
+ if (event.type === "turn.transcript") {
39140
+ turn.transcripts += 1;
39141
+ }
39142
+ if (event.type === "turn.assistant") {
39143
+ turn.assistantReplies += 1;
39144
+ }
39145
+ if (event.type === "agent.tool") {
39146
+ turn.toolCalls += 1;
39147
+ }
39148
+ if (event.type === "provider.decision") {
39149
+ turn.providerDecisions += 1;
39150
+ }
39151
+ if (event.type === "session.error" || event.status === "error") {
39152
+ turn.errors += 1;
39153
+ }
39154
+ }
39155
+ for (const transcript of record.transcript) {
39156
+ const turn = getTurn(transcript.id);
39157
+ turn.assistantReplies = Math.max(turn.assistantReplies, transcript.assistantReplies.length);
39158
+ turn.errors += transcript.errors.length;
39159
+ turn.transcripts = Math.max(turn.transcripts, transcript.transcripts.length);
39160
+ }
39161
+ return [...byTurn.entries()].map(([turnId, turn]) => {
39162
+ const startedAt = turn.stages[0]?.at;
39163
+ const endedAt = turn.stages.at(-1)?.at;
39164
+ return {
39165
+ assistantReplies: turn.assistantReplies,
39166
+ durationMs: startedAt !== undefined && endedAt !== undefined ? Math.max(0, endedAt - startedAt) : undefined,
39167
+ endedAt,
39168
+ errors: turn.errors,
39169
+ providerDecisions: turn.providerDecisions,
39170
+ stages: turn.stages,
39171
+ startedAt,
39172
+ toolCalls: turn.toolCalls,
39173
+ transcripts: turn.transcripts,
39174
+ turnId
39175
+ };
39176
+ }).sort((left, right) => (left.startedAt ?? 0) - (right.startedAt ?? 0));
39177
+ };
39178
+ var buildVoiceSessionObservabilityReport = async (options) => {
39179
+ const record = await buildVoiceOperationsRecord({
39180
+ audit: options.audit,
39181
+ evaluation: options.evaluation,
39182
+ events: options.events,
39183
+ integrationEvents: options.integrationEvents,
39184
+ redact: options.redact,
39185
+ reviews: options.reviews,
39186
+ sessionId: options.sessionId,
39187
+ store: options.store,
39188
+ tasks: options.tasks
39189
+ });
39190
+ const failureReplay = buildVoiceFailureReplay(record, {
39191
+ operationsRecordHref: resolveHref(options.operationsRecordHref, options.sessionId)
39192
+ });
39193
+ const incidentMarkdown = renderVoiceOperationsRecordIncidentMarkdown(record);
39194
+ const statuses = [
39195
+ record.status,
39196
+ failureReplay.status === "failed" ? "failed" : failureReplay.status === "degraded" ? "warning" : "healthy"
39197
+ ];
39198
+ const status = statuses.includes("failed") ? "failed" : statuses.includes("warning") ? "warning" : "healthy";
39199
+ return {
39200
+ checkedAt: Date.now(),
39201
+ failureReplay,
39202
+ incidentMarkdown,
39203
+ links: buildLinks(options),
39204
+ record,
39205
+ sessionId: options.sessionId,
39206
+ status,
39207
+ summary: {
39208
+ durationMs: record.summary.callDurationMs,
39209
+ errors: record.summary.errorCount,
39210
+ events: record.summary.eventCount,
39211
+ fallbacks: record.providerDecisionSummary.fallbacks,
39212
+ guardrailBlocks: record.guardrails.blocked,
39213
+ handoffs: record.handoffs.length,
39214
+ providerRecoveryStatus: record.providerDecisionSummary.recoveryStatus,
39215
+ providers: record.providerDecisionSummary.providers,
39216
+ telephonyMediaEvents: record.telephonyMedia.total,
39217
+ toolCalls: record.tools.length,
39218
+ turns: record.summary.turnCount
39219
+ },
39220
+ turns: buildTurnWaterfalls(record)
39221
+ };
39222
+ };
39223
+ var renderLinks = (links) => links.length === 0 ? "" : `<div class="actions">${links.map((link) => `<a href="${escapeHtml59(link.href)}">${escapeHtml59(link.label)}</a>`).join("")}</div>`;
39224
+ var renderTurns = (turns) => turns.length === 0 ? '<p class="muted">No turn-level events recorded yet.</p>' : turns.map((turn) => `<article class="turn"><header><strong>${escapeHtml59(turn.turnId)}</strong><span>${formatMs6(turn.durationMs)}</span></header><dl><div><dt>Transcripts</dt><dd>${String(turn.transcripts)}</dd></div><div><dt>Assistant</dt><dd>${String(turn.assistantReplies)}</dd></div><div><dt>Tools</dt><dd>${String(turn.toolCalls)}</dd></div><div><dt>Providers</dt><dd>${String(turn.providerDecisions)}</dd></div><div><dt>Errors</dt><dd>${String(turn.errors)}</dd></div></dl><table><thead><tr><th>Offset</th><th>Type</th><th>Stage</th><th>Provider</th><th>Status</th><th>Latency</th></tr></thead><tbody>${turn.stages.map((stage) => `<tr><td>+${String(stage.offsetMs)}ms</td><td>${escapeHtml59(stage.type)}</td><td>${escapeHtml59(stage.label)}</td><td>${escapeHtml59(stage.provider ?? "")}</td><td>${escapeHtml59(stage.status ?? "")}</td><td>${formatMs6(stage.elapsedMs)}</td></tr>`).join("")}</tbody></table></article>`).join("");
39225
+ var renderVoiceSessionObservabilityMarkdown = (report) => `# Voice session observability: ${report.sessionId}
39226
+
39227
+ Status: ${report.status}
39228
+
39229
+ - Events: ${report.summary.events}
39230
+ - Turns: ${report.summary.turns}
39231
+ - Errors: ${report.summary.errors}
39232
+ - Duration: ${formatMs6(report.summary.durationMs)}
39233
+ - Providers: ${report.summary.providers.join(", ") || "none"}
39234
+ - Provider recovery: ${report.summary.providerRecoveryStatus}
39235
+ - Fallbacks: ${report.summary.fallbacks}
39236
+ - Tool calls: ${report.summary.toolCalls}
39237
+ - Handoffs: ${report.summary.handoffs}
39238
+ - Guardrail blocks: ${report.summary.guardrailBlocks}
39239
+ - Telephony media events: ${report.summary.telephonyMediaEvents}
39240
+
39241
+ ## Links
39242
+
39243
+ ${report.links.length ? report.links.map((link) => `- [${link.label}](${link.href})`).join(`
39244
+ `) : "- none"}
39245
+
39246
+ ## Turn Waterfalls
39247
+
39248
+ ${report.turns.length ? report.turns.map((turn) => `### ${turn.turnId}
39249
+
39250
+ - Duration: ${formatMs6(turn.durationMs)}
39251
+ - Transcripts: ${turn.transcripts}
39252
+ - Assistant replies: ${turn.assistantReplies}
39253
+ - Tool calls: ${turn.toolCalls}
39254
+ - Provider decisions: ${turn.providerDecisions}
39255
+ - Errors: ${turn.errors}
39256
+
39257
+ ${turn.stages.map((stage) => `- +${stage.offsetMs}ms ${stage.type}: ${stage.label}${stage.provider ? ` (${stage.provider})` : ""}${stage.status ? ` [${stage.status}]` : ""}`).join(`
39258
+ `)}`).join(`
39259
+
39260
+ `) : "No turn-level events recorded."}
39261
+
39262
+ ## Incident Handoff
39263
+
39264
+ ${report.incidentMarkdown}`;
39265
+ var renderVoiceSessionObservabilityHTML = (report, options = {}) => `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>${escapeHtml59(options.title ?? "Voice Session Observability")}</title><style>body{background:#0d1412;color:#f7f2e8;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:1180px;padding:32px}.eyebrow{color:#fbbf24;font-size:.78rem;font-weight:900;letter-spacing:.14em;text-transform:uppercase}h1{font-size:clamp(2.4rem,6vw,4.8rem);line-height:.9;margin:.2rem 0 1rem}.status{border:1px solid #425046;border-radius:999px;display:inline-flex;padding:8px 12px}.healthy{color:#86efac}.warning{color:#fbbf24}.failed,.error{color:#fca5a5}.actions{display:flex;flex-wrap:wrap;gap:10px;margin:18px 0}.actions a{background:#fbbf24;border-radius:999px;color:#111827;font-weight:900;padding:10px 14px;text-decoration:none}.grid{display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));margin:22px 0}.card,.turn,.incident{background:#17201c;border:1px solid #2e3c35;border-radius:20px;padding:16px}.card span,.muted,dt{color:#a8b4ad}.card strong{display:block;font-size:2rem}section{margin-top:30px}.turn{margin:16px 0}.turn header{align-items:center;display:flex;justify-content:space-between;gap:14px}dl{display:grid;gap:10px;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));margin:14px 0}dd{font-weight:900;margin:3px 0 0}table{border-collapse:collapse;margin-top:14px;width:100%}td,th{border-top:1px solid #2e3c35;padding:10px;text-align:left}pre{background:#08100d;border:1px solid #2e3c35;border-radius:16px;color:#d9f99d;overflow:auto;padding:14px}@media(max-width:760px){main{padding:20px}table{font-size:.9rem}}</style></head><body><main><header><p class="eyebrow">Session observability</p><h1>${escapeHtml59(report.sessionId)}</h1><p class="status ${escapeHtml59(report.status)}">${escapeHtml59(report.status)}</p>${renderLinks(report.links)}<p class="muted">One support/debug report across trace timeline, operations record, provider recovery, turn waterfalls, guardrails, tools, handoffs, failure replay, and incident handoff.</p></header><section class="grid"><article class="card"><span>Events</span><strong>${String(report.summary.events)}</strong></article><article class="card"><span>Turns</span><strong>${String(report.summary.turns)}</strong></article><article class="card"><span>Errors</span><strong>${String(report.summary.errors)}</strong></article><article class="card"><span>Duration</span><strong>${formatMs6(report.summary.durationMs)}</strong></article><article class="card"><span>Fallbacks</span><strong>${String(report.summary.fallbacks)}</strong></article><article class="card"><span>Tools</span><strong>${String(report.summary.toolCalls)}</strong></article><article class="card"><span>Handoffs</span><strong>${String(report.summary.handoffs)}</strong></article><article class="card"><span>Guardrails blocked</span><strong>${String(report.summary.guardrailBlocks)}</strong></article><article class="card"><span>Telephony media</span><strong>${String(report.summary.telephonyMediaEvents)}</strong></article></section><section><h2>Turn Waterfalls</h2>${renderTurns(report.turns)}</section><section class="incident"><h2>Incident Handoff</h2><pre><code>${escapeHtml59(report.incidentMarkdown)}</code></pre></section></main></body></html>`;
39266
+ var routeSessionId = (params) => typeof params.sessionId === "string" ? params.sessionId : "";
39267
+ var createVoiceSessionObservabilityRoutes = (options) => {
39268
+ const path = options.path ?? "/api/voice/session-observability/:sessionId";
39269
+ const htmlPath = options.htmlPath ?? "/voice/session-observability/:sessionId";
39270
+ const incidentPath = options.incidentPath ?? "/api/voice/session-observability/:sessionId/incident.md";
39271
+ const title = options.title ?? "AbsoluteJS Voice Session Observability";
39272
+ const routes = new Elysia62({
39273
+ name: options.name ?? "absolutejs-voice-session-observability"
39274
+ });
39275
+ const build = (sessionId) => buildVoiceSessionObservabilityReport({
39276
+ audit: options.audit,
39277
+ callDebuggerHref: options.callDebuggerHref,
39278
+ customLinks: options.customLinks,
39279
+ evaluation: options.evaluation,
39280
+ events: options.events,
39281
+ incidentMarkdownHref: options.incidentMarkdownHref ?? (incidentPath === false ? false : incidentPath),
39282
+ integrationEvents: options.integrationEvents,
39283
+ operationsRecordHref: options.operationsRecordHref,
39284
+ redact: options.redact,
39285
+ reviews: options.reviews,
39286
+ sessionId,
39287
+ store: options.store,
39288
+ tasks: options.tasks,
39289
+ traceTimelineHref: options.traceTimelineHref
39290
+ });
39291
+ routes.get(path, async ({ params }) => Response.json(await build(routeSessionId(params))));
39292
+ if (htmlPath !== false) {
39293
+ routes.get(htmlPath, async ({ params }) => {
39294
+ const report = await build(routeSessionId(params));
39295
+ const body = await (options.render ?? ((input) => renderVoiceSessionObservabilityHTML(input, { title })))(report);
39296
+ return new Response(body, {
39297
+ headers: {
39298
+ "content-type": "text/html; charset=utf-8",
39299
+ ...options.headers
39300
+ }
39301
+ });
39302
+ });
39303
+ }
39304
+ if (incidentPath !== false) {
39305
+ routes.get(incidentPath, async ({ params }) => {
39306
+ const report = await build(routeSessionId(params));
39307
+ const body = await (options.renderIncidentMarkdown ?? renderVoiceSessionObservabilityMarkdown)(report);
39308
+ return new Response(body, {
39309
+ headers: {
39310
+ "content-type": "text/markdown; charset=utf-8",
39311
+ ...options.headers
39312
+ }
39313
+ });
39314
+ });
39315
+ }
39316
+ return routes;
39317
+ };
39318
+ // src/incidentBundle.ts
39319
+ import { Elysia as Elysia63 } from "elysia";
39080
39320
  var filterIncidentBundleArtifacts = (artifacts, filter = {}) => artifacts.filter((artifact) => {
39081
39321
  if (filter.sessionId && artifact.sessionId !== filter.sessionId) {
39082
39322
  return false;
@@ -39293,7 +39533,7 @@ var buildVoiceIncidentBundle = async (options) => {
39293
39533
  var createVoiceIncidentBundleRoutes = (options) => {
39294
39534
  const path = options.path ?? "/api/voice-incidents/:sessionId";
39295
39535
  const markdownPath = options.markdownPath === undefined ? "/voice-incidents/:sessionId/markdown" : options.markdownPath;
39296
- const routes = new Elysia62({
39536
+ const routes = new Elysia63({
39297
39537
  name: options.name ?? "absolutejs-voice-incident-bundle"
39298
39538
  });
39299
39539
  const getSessionId = (params) => params.sessionId ?? "";
@@ -39494,19 +39734,19 @@ var summarizeVoiceOpsStatus = async (options) => {
39494
39734
  };
39495
39735
  };
39496
39736
  // src/opsStatusRoutes.ts
39497
- import { Elysia as Elysia63 } from "elysia";
39498
- var escapeHtml59 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
39737
+ import { Elysia as Elysia64 } from "elysia";
39738
+ var escapeHtml60 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
39499
39739
  var renderVoiceOpsStatusHTML = (report, options = {}) => {
39500
39740
  const title = options.title ?? "AbsoluteJS Voice Ops Status";
39501
39741
  const surfaces = Object.entries(report.surfaces).map(([key, surface]) => {
39502
39742
  const value = "recovered" in surface ? surface.total === 0 ? "0 events" : `${surface.recovered}/${surface.total}` : ("auditTotal" in surface) ? `${surface.auditTotal + surface.traceTotal} deliveries` : ("total" in surface) ? `${Math.max(surface.total - ("failed" in surface ? surface.failed : ("degraded" in surface) ? surface.degraded : 0), 0)}/${surface.total}` : surface.status;
39503
- return `<article class="surface ${escapeHtml59(surface.status)}"><span>${escapeHtml59(surface.status.toUpperCase())}</span><h2>${escapeHtml59(key)}</h2><strong>${escapeHtml59(value)}</strong></article>`;
39743
+ return `<article class="surface ${escapeHtml60(surface.status)}"><span>${escapeHtml60(surface.status.toUpperCase())}</span><h2>${escapeHtml60(key)}</h2><strong>${escapeHtml60(value)}</strong></article>`;
39504
39744
  }).join("");
39505
- return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>${escapeHtml59(title)}</title><style>body{background:#0d141b;color:#f8f3e7;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:980px;padding:32px}.hero{background:linear-gradient(135deg,rgba(20,184,166,.2),rgba(245,158,11,.12));border:1px solid #283544;border-radius:28px;margin-bottom:18px;padding:28px}.eyebrow{color:#5eead4;font-weight:900;letter-spacing:.12em;text-transform:uppercase}h1{font-size:clamp(2.4rem,6vw,5rem);line-height:.9;margin:.2rem 0 1rem}.status{border:1px solid #3f3f46;border-radius:999px;display:inline-flex;font-weight:900;padding:8px 12px}.surfaces{display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}.surface{background:#151d26;border:1px solid #283544;border-radius:20px;padding:18px}.surface span{color:#aab5c0;font-size:.78rem;font-weight:900;letter-spacing:.08em}.surface strong{font-size:1.5rem}.pass{border-color:rgba(34,197,94,.55)}.fail{border-color:rgba(239,68,68,.75)}a{color:#5eead4}</style></head><body><main><section class="hero"><p class="eyebrow">Ops status</p><h1>${escapeHtml59(title)}</h1><p>Compact pass/fail status for framework widgets, demos, and small customer-facing health badges.</p><p class="status ${escapeHtml59(report.status)}">Overall: ${escapeHtml59(report.status.toUpperCase())}</p><p>${report.passed}/${report.total} checks passing</p></section><section class="surfaces">${surfaces || '<article class="surface pass"><span>PASS</span><h2>No checks configured</h2><strong>0/0</strong></article>'}</section></main></body></html>`;
39745
+ return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>${escapeHtml60(title)}</title><style>body{background:#0d141b;color:#f8f3e7;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:980px;padding:32px}.hero{background:linear-gradient(135deg,rgba(20,184,166,.2),rgba(245,158,11,.12));border:1px solid #283544;border-radius:28px;margin-bottom:18px;padding:28px}.eyebrow{color:#5eead4;font-weight:900;letter-spacing:.12em;text-transform:uppercase}h1{font-size:clamp(2.4rem,6vw,5rem);line-height:.9;margin:.2rem 0 1rem}.status{border:1px solid #3f3f46;border-radius:999px;display:inline-flex;font-weight:900;padding:8px 12px}.surfaces{display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}.surface{background:#151d26;border:1px solid #283544;border-radius:20px;padding:18px}.surface span{color:#aab5c0;font-size:.78rem;font-weight:900;letter-spacing:.08em}.surface strong{font-size:1.5rem}.pass{border-color:rgba(34,197,94,.55)}.fail{border-color:rgba(239,68,68,.75)}a{color:#5eead4}</style></head><body><main><section class="hero"><p class="eyebrow">Ops status</p><h1>${escapeHtml60(title)}</h1><p>Compact pass/fail status for framework widgets, demos, and small customer-facing health badges.</p><p class="status ${escapeHtml60(report.status)}">Overall: ${escapeHtml60(report.status.toUpperCase())}</p><p>${report.passed}/${report.total} checks passing</p></section><section class="surfaces">${surfaces || '<article class="surface pass"><span>PASS</span><h2>No checks configured</h2><strong>0/0</strong></article>'}</section></main></body></html>`;
39506
39746
  };
39507
39747
  var createVoiceOpsStatusRoutes = (options) => {
39508
39748
  const path = options.path ?? "/api/voice/ops-status";
39509
- const routes = new Elysia63({
39749
+ const routes = new Elysia64({
39510
39750
  name: options.name ?? "absolutejs-voice-ops-status"
39511
39751
  });
39512
39752
  routes.get(path, async () => summarizeVoiceOpsStatus(options));
@@ -39939,8 +40179,8 @@ var createVoiceTTSProviderRouter = (options) => {
39939
40179
  };
39940
40180
  };
39941
40181
  // src/traceDeliveryRoutes.ts
39942
- import { Elysia as Elysia64 } from "elysia";
39943
- var escapeHtml60 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
40182
+ import { Elysia as Elysia65 } from "elysia";
40183
+ var escapeHtml61 = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
39944
40184
  var getString20 = (value) => typeof value === "string" && value.trim() ? value.trim() : undefined;
39945
40185
  var getNumber12 = (value) => {
39946
40186
  if (typeof value === "number" && Number.isFinite(value)) {
@@ -40021,14 +40261,14 @@ var renderSinkResults2 = (delivery) => {
40021
40261
  if (entries.length === 0) {
40022
40262
  return "<p>No sink delivery attempts recorded yet.</p>";
40023
40263
  }
40024
- return `<ul>${entries.map(([sinkId, result]) => `<li><strong>${escapeHtml60(sinkId)}</strong>: ${escapeHtml60(result.status)}${result.deliveredTo ? ` to ${escapeHtml60(result.deliveredTo)}` : ""}${result.error ? ` (${escapeHtml60(result.error)})` : ""}</li>`).join("")}</ul>`;
40264
+ return `<ul>${entries.map(([sinkId, result]) => `<li><strong>${escapeHtml61(sinkId)}</strong>: ${escapeHtml61(result.status)}${result.deliveredTo ? ` to ${escapeHtml61(result.deliveredTo)}` : ""}${result.error ? ` (${escapeHtml61(result.error)})` : ""}</li>`).join("")}</ul>`;
40025
40265
  };
40026
- var renderEventList2 = (delivery) => delivery.events.length === 0 ? "<p>No trace events in this delivery.</p>" : `<ul>${delivery.events.map((event) => `<li>${escapeHtml60(event.type)} <small>${escapeHtml60(event.id)}</small>${event.sessionId ? ` session=${escapeHtml60(event.sessionId)}` : ""}</li>`).join("")}</ul>`;
40266
+ var renderEventList2 = (delivery) => delivery.events.length === 0 ? "<p>No trace events in this delivery.</p>" : `<ul>${delivery.events.map((event) => `<li>${escapeHtml61(event.type)} <small>${escapeHtml61(event.id)}</small>${event.sessionId ? ` session=${escapeHtml61(event.sessionId)}` : ""}</li>`).join("")}</ul>`;
40027
40267
  var renderVoiceTraceDeliveryHTML = (report, options = {}) => {
40028
40268
  const title = options.title ?? "AbsoluteJS Voice Trace Deliveries";
40029
- const drainAction = options.workerPath === false ? "" : `<form method="post" action="${escapeHtml60(options.workerPath ?? "/api/voice-trace-deliveries/drain")}"><button type="submit">Drain trace deliveries</button></form>`;
40030
- const rows = report.deliveries.map((delivery) => `<article class="delivery ${escapeHtml60(delivery.deliveryStatus)}"><div class="head"><div><span>${escapeHtml60(delivery.deliveryStatus)}</span><h2>${escapeHtml60(delivery.id)}</h2><p>${escapeHtml60(new Date(delivery.createdAt).toLocaleString())}${delivery.deliveredAt ? ` \xB7 delivered ${escapeHtml60(new Date(delivery.deliveredAt).toLocaleString())}` : ""}</p></div><strong>${String(delivery.deliveryAttempts ?? 0)} attempt(s)</strong></div>${delivery.deliveryError ? `<p class="error">${escapeHtml60(delivery.deliveryError)}</p>` : ""}<h3>Sinks</h3>${renderSinkResults2(delivery)}<h3>Events</h3>${renderEventList2(delivery)}</article>`).join("");
40031
- return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>${escapeHtml60(title)}</title><style>body{background:#0f1318;color:#f4efe1;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:1120px;padding:32px}.hero{background:linear-gradient(135deg,rgba(34,197,94,.16),rgba(14,165,233,.14));border:1px solid #26313d;border-radius:28px;margin-bottom:18px;padding:28px}.eyebrow{color:#86efac;font-weight:900;letter-spacing:.12em;text-transform:uppercase}h1{font-size:clamp(2.2rem,5vw,4.8rem);line-height:.92;margin:.2rem 0 1rem}.grid{display:grid;gap:12px;grid-template-columns:repeat(4,1fr);margin-bottom:16px}.grid article,.delivery{background:#151b22;border:1px solid #26313d;border-radius:22px;padding:18px}.grid span,.delivery span{color:#86efac;font-size:.78rem;font-weight:900;letter-spacing:.08em;text-transform:uppercase}.grid strong{display:block;font-size:2rem}.deliveries{display:grid;gap:14px}.delivery.failed{border-color:rgba(239,68,68,.75)}.delivery.pending{border-color:rgba(245,158,11,.7)}.delivery.delivered{border-color:rgba(34,197,94,.55)}.delivery.skipped{border-color:rgba(148,163,184,.6)}.head{align-items:start;display:flex;gap:14px;justify-content:space-between}.delivery h2{font-size:1.05rem;margin:.3rem 0;overflow-wrap:anywhere}.delivery h3{margin:1rem 0 .3rem}.delivery p,.delivery li{color:#c8d0d8}.error{color:#fecaca!important}button{background:#86efac;border:0;border-radius:999px;color:#07111f;cursor:pointer;font-weight:900;margin-top:12px;padding:10px 14px}@media(max-width:760px){main{padding:20px}.grid{grid-template-columns:1fr 1fr}.head{display:block}}</style></head><body><main><section class="hero"><p class="eyebrow">Trace export health</p><h1>${escapeHtml60(title)}</h1><p>Checked ${escapeHtml60(new Date(report.checkedAt).toLocaleString())}. Showing ${String(report.deliveries.length)} delivery item(s).</p>${drainAction}</section>${renderMetricGrid3(report)}<section class="deliveries">${rows || "<p>No trace deliveries match this filter.</p>"}</section></main></body></html>`;
40269
+ const drainAction = options.workerPath === false ? "" : `<form method="post" action="${escapeHtml61(options.workerPath ?? "/api/voice-trace-deliveries/drain")}"><button type="submit">Drain trace deliveries</button></form>`;
40270
+ const rows = report.deliveries.map((delivery) => `<article class="delivery ${escapeHtml61(delivery.deliveryStatus)}"><div class="head"><div><span>${escapeHtml61(delivery.deliveryStatus)}</span><h2>${escapeHtml61(delivery.id)}</h2><p>${escapeHtml61(new Date(delivery.createdAt).toLocaleString())}${delivery.deliveredAt ? ` \xB7 delivered ${escapeHtml61(new Date(delivery.deliveredAt).toLocaleString())}` : ""}</p></div><strong>${String(delivery.deliveryAttempts ?? 0)} attempt(s)</strong></div>${delivery.deliveryError ? `<p class="error">${escapeHtml61(delivery.deliveryError)}</p>` : ""}<h3>Sinks</h3>${renderSinkResults2(delivery)}<h3>Events</h3>${renderEventList2(delivery)}</article>`).join("");
40271
+ return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>${escapeHtml61(title)}</title><style>body{background:#0f1318;color:#f4efe1;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:1120px;padding:32px}.hero{background:linear-gradient(135deg,rgba(34,197,94,.16),rgba(14,165,233,.14));border:1px solid #26313d;border-radius:28px;margin-bottom:18px;padding:28px}.eyebrow{color:#86efac;font-weight:900;letter-spacing:.12em;text-transform:uppercase}h1{font-size:clamp(2.2rem,5vw,4.8rem);line-height:.92;margin:.2rem 0 1rem}.grid{display:grid;gap:12px;grid-template-columns:repeat(4,1fr);margin-bottom:16px}.grid article,.delivery{background:#151b22;border:1px solid #26313d;border-radius:22px;padding:18px}.grid span,.delivery span{color:#86efac;font-size:.78rem;font-weight:900;letter-spacing:.08em;text-transform:uppercase}.grid strong{display:block;font-size:2rem}.deliveries{display:grid;gap:14px}.delivery.failed{border-color:rgba(239,68,68,.75)}.delivery.pending{border-color:rgba(245,158,11,.7)}.delivery.delivered{border-color:rgba(34,197,94,.55)}.delivery.skipped{border-color:rgba(148,163,184,.6)}.head{align-items:start;display:flex;gap:14px;justify-content:space-between}.delivery h2{font-size:1.05rem;margin:.3rem 0;overflow-wrap:anywhere}.delivery h3{margin:1rem 0 .3rem}.delivery p,.delivery li{color:#c8d0d8}.error{color:#fecaca!important}button{background:#86efac;border:0;border-radius:999px;color:#07111f;cursor:pointer;font-weight:900;margin-top:12px;padding:10px 14px}@media(max-width:760px){main{padding:20px}.grid{grid-template-columns:1fr 1fr}.head{display:block}}</style></head><body><main><section class="hero"><p class="eyebrow">Trace export health</p><h1>${escapeHtml61(title)}</h1><p>Checked ${escapeHtml61(new Date(report.checkedAt).toLocaleString())}. Showing ${String(report.deliveries.length)} delivery item(s).</p>${drainAction}</section>${renderMetricGrid3(report)}<section class="deliveries">${rows || "<p>No trace deliveries match this filter.</p>"}</section></main></body></html>`;
40032
40272
  };
40033
40273
  var createVoiceTraceDeliveryJSONHandler = (options) => async ({ query }) => buildVoiceTraceDeliveryReport(options, resolveVoiceTraceDeliveryFilter(query, options.filter));
40034
40274
  var createVoiceTraceDeliveryHTMLHandler = (options) => async ({ query }) => {
@@ -40048,7 +40288,7 @@ var createVoiceTraceDeliveryRoutes = (options) => {
40048
40288
  const path = options.path ?? "/api/voice-trace-deliveries";
40049
40289
  const htmlPath = options.htmlPath === undefined ? "/traces/deliveries" : options.htmlPath;
40050
40290
  const workerPath = options.workerPath === undefined ? `${path}/drain` : options.workerPath;
40051
- const routes = new Elysia64({
40291
+ const routes = new Elysia65({
40052
40292
  name: options.name ?? "absolutejs-voice-trace-deliveries"
40053
40293
  }).get(path, createVoiceTraceDeliveryJSONHandler(options));
40054
40294
  if (htmlPath !== false) {
@@ -40145,7 +40385,7 @@ var createVoiceMemoryStore = () => {
40145
40385
  return { get, getOrCreate, list, remove, set };
40146
40386
  };
40147
40387
  // src/opsWebhook.ts
40148
- import { Elysia as Elysia65 } from "elysia";
40388
+ import { Elysia as Elysia66 } from "elysia";
40149
40389
  var toHex6 = (bytes) => Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
40150
40390
  var signVoiceOpsWebhookBody = async (input) => {
40151
40391
  const encoder2 = new TextEncoder;
@@ -40275,7 +40515,7 @@ var verifyVoiceOpsWebhookSignature = async (input) => {
40275
40515
  };
40276
40516
  var createVoiceOpsWebhookReceiverRoutes = (options = {}) => {
40277
40517
  const path = options.path ?? "/api/voice-ops/webhook";
40278
- return new Elysia65().post(path, async ({ body, request, set }) => {
40518
+ return new Elysia66().post(path, async ({ body, request, set }) => {
40279
40519
  const bodyText = typeof body === "string" ? body : JSON.stringify(body);
40280
40520
  if (options.signingSecret) {
40281
40521
  const verification = await verifyVoiceOpsWebhookSignature({
@@ -40730,7 +40970,7 @@ var resolveVoiceOpsPreset = (name, overrides = {}) => {
40730
40970
  };
40731
40971
  };
40732
40972
  // src/postCallAnalysis.ts
40733
- import { Elysia as Elysia66 } from "elysia";
40973
+ import { Elysia as Elysia67 } from "elysia";
40734
40974
  var isStore = (value) => Boolean(value) && typeof value === "object" && value !== null && ("list" in value);
40735
40975
  var asArray = async (value) => Array.isArray(value) ? value : isStore(value) ? await value.list() : [];
40736
40976
  var getPathValue3 = (source, path) => {
@@ -40909,7 +41149,7 @@ var resolvePostCallAnalysisReport = async (options, input) => {
40909
41149
  };
40910
41150
  var createVoicePostCallAnalysisRoutes = (options = {}) => {
40911
41151
  const path = options.path ?? "/api/voice/post-call-analysis";
40912
- const routes = new Elysia66({
41152
+ const routes = new Elysia67({
40913
41153
  name: options.name ?? "absolutejs-voice-post-call-analysis"
40914
41154
  });
40915
41155
  routes.get(path, async ({ query }) => {
@@ -40934,7 +41174,7 @@ var createVoicePostCallAnalysisRoutes = (options = {}) => {
40934
41174
  return routes;
40935
41175
  };
40936
41176
  // src/guardrails.ts
40937
- import { Elysia as Elysia67 } from "elysia";
41177
+ import { Elysia as Elysia68 } from "elysia";
40938
41178
  var stringifyContent = (value) => typeof value === "string" ? value : JSON.stringify(value) ?? "";
40939
41179
  var appliesToStage = (rule, stage) => !rule.stages || rule.stages.length === 0 || rule.stages.includes(stage);
40940
41180
  var matchesRule = async (rule, input) => {
@@ -41236,7 +41476,7 @@ var resolveGuardrailReport = async (options, input) => {
41236
41476
  };
41237
41477
  var createVoiceGuardrailRoutes = (options = {}) => {
41238
41478
  const path = options.path ?? "/api/voice/guardrails";
41239
- const routes = new Elysia67({
41479
+ const routes = new Elysia68({
41240
41480
  name: options.name ?? "absolutejs-voice-guardrails"
41241
41481
  });
41242
41482
  routes.all(path, async ({ request }) => {
@@ -42015,7 +42255,7 @@ var shapeTelephonyAssistantText = (text, options = {}) => {
42015
42255
  return ensureTerminalPunctuation(normalizeWhitespace(limitedChars));
42016
42256
  };
42017
42257
  // src/proofPack.ts
42018
- import { Elysia as Elysia68 } from "elysia";
42258
+ import { Elysia as Elysia69 } from "elysia";
42019
42259
  import { mkdir as mkdir5 } from "fs/promises";
42020
42260
  import { dirname as dirname3, join as join4 } from "path";
42021
42261
  var toGeneratedAt = (value) => value === undefined ? new Date().toISOString() : typeof value === "number" ? new Date(value).toISOString() : value;
@@ -42581,7 +42821,7 @@ var createVoiceProofPackArtifacts = (input) => [
42581
42821
  var createVoiceProofPackRoutes = (options) => {
42582
42822
  const jsonPath = options.jsonPath ?? "/api/voice/proof-pack";
42583
42823
  const markdownPath = options.markdownPath ?? "/voice/proof-pack.md";
42584
- const app = new Elysia68({ name: options.name ?? "voice-proof-pack" });
42824
+ const app = new Elysia69({ name: options.name ?? "voice-proof-pack" });
42585
42825
  if (jsonPath !== false) {
42586
42826
  app.get(jsonPath, async () => new Response(JSON.stringify(await resolveProofPack(options.source), null, 2), {
42587
42827
  headers: {
@@ -42716,6 +42956,8 @@ export {
42716
42956
  renderVoiceSloCalibrationMarkdown,
42717
42957
  renderVoiceSimulationSuiteHTML,
42718
42958
  renderVoiceSessionsHTML,
42959
+ renderVoiceSessionObservabilityMarkdown,
42960
+ renderVoiceSessionObservabilityHTML,
42719
42961
  renderVoiceScenarioFixtureEvalHTML,
42720
42962
  renderVoiceScenarioEvalHTML,
42721
42963
  renderVoiceResilienceHTML,
@@ -42956,6 +43198,7 @@ export {
42956
43198
  createVoiceSessionReplayJSONHandler,
42957
43199
  createVoiceSessionReplayHTMLHandler,
42958
43200
  createVoiceSessionRecord,
43201
+ createVoiceSessionObservabilityRoutes,
42959
43202
  createVoiceSessionListRoutes,
42960
43203
  createVoiceSession,
42961
43204
  createVoiceScopedTraceEventStore,
@@ -43232,6 +43475,7 @@ export {
43232
43475
  buildVoiceSloCalibrationReport,
43233
43476
  buildVoiceSessionSnapshotStatus,
43234
43477
  buildVoiceSessionSnapshot,
43478
+ buildVoiceSessionObservabilityReport,
43235
43479
  buildVoiceReconnectProofReport,
43236
43480
  buildVoiceReconnectProfileEvidenceSummary,
43237
43481
  buildVoiceRealtimeProviderContractMatrix,
@@ -0,0 +1,104 @@
1
+ import { Elysia } from "elysia";
2
+ import { type VoiceFailureReplayReport, type VoiceOperationsRecord, type VoiceOperationsRecordOptions } from "./operationsRecord";
3
+ import type { StoredVoiceTraceEvent } from "./trace";
4
+ export type VoiceSessionObservabilityStatus = "failed" | "healthy" | "warning";
5
+ export type VoiceSessionObservabilityLink = {
6
+ href: string;
7
+ label: string;
8
+ rel: "call-debugger" | "incident-markdown" | "operations-record" | "trace-timeline" | "custom";
9
+ };
10
+ export type VoiceSessionObservabilityStage = {
11
+ at: number;
12
+ elapsedMs?: number;
13
+ label: string;
14
+ offsetMs: number;
15
+ provider?: string;
16
+ status?: string;
17
+ type: StoredVoiceTraceEvent["type"];
18
+ };
19
+ export type VoiceSessionObservabilityTurn = {
20
+ assistantReplies: number;
21
+ durationMs?: number;
22
+ endedAt?: number;
23
+ errors: number;
24
+ providerDecisions: number;
25
+ stages: VoiceSessionObservabilityStage[];
26
+ startedAt?: number;
27
+ toolCalls: number;
28
+ transcripts: number;
29
+ turnId: string;
30
+ };
31
+ export type VoiceSessionObservabilityReport = {
32
+ checkedAt: number;
33
+ failureReplay: VoiceFailureReplayReport;
34
+ incidentMarkdown: string;
35
+ links: VoiceSessionObservabilityLink[];
36
+ record: VoiceOperationsRecord;
37
+ sessionId: string;
38
+ status: VoiceSessionObservabilityStatus;
39
+ summary: {
40
+ durationMs?: number;
41
+ errors: number;
42
+ events: number;
43
+ fallbacks: number;
44
+ guardrailBlocks: number;
45
+ handoffs: number;
46
+ providerRecoveryStatus: VoiceOperationsRecord["providerDecisionSummary"]["recoveryStatus"];
47
+ providers: string[];
48
+ telephonyMediaEvents: number;
49
+ toolCalls: number;
50
+ turns: number;
51
+ };
52
+ turns: VoiceSessionObservabilityTurn[];
53
+ };
54
+ export type VoiceSessionObservabilityReportOptions = Omit<VoiceOperationsRecordOptions, "sessionId"> & {
55
+ callDebuggerHref?: false | string | ((sessionId: string) => string);
56
+ customLinks?: readonly VoiceSessionObservabilityLink[];
57
+ incidentMarkdownHref?: false | string | ((sessionId: string) => string);
58
+ operationsRecordHref?: false | string | ((sessionId: string) => string);
59
+ sessionId: string;
60
+ traceTimelineHref?: false | string | ((sessionId: string) => string);
61
+ };
62
+ export type VoiceSessionObservabilityRoutesOptions = Omit<VoiceSessionObservabilityReportOptions, "sessionId"> & {
63
+ headers?: HeadersInit;
64
+ htmlPath?: false | string;
65
+ incidentPath?: false | string;
66
+ name?: string;
67
+ path?: string;
68
+ render?: (report: VoiceSessionObservabilityReport) => Promise<string> | string;
69
+ renderIncidentMarkdown?: (report: VoiceSessionObservabilityReport) => Promise<string> | string;
70
+ title?: string;
71
+ };
72
+ export declare const buildVoiceSessionObservabilityReport: (options: VoiceSessionObservabilityReportOptions) => Promise<VoiceSessionObservabilityReport>;
73
+ export declare const renderVoiceSessionObservabilityMarkdown: (report: VoiceSessionObservabilityReport) => string;
74
+ export declare const renderVoiceSessionObservabilityHTML: (report: VoiceSessionObservabilityReport, options?: {
75
+ title?: string;
76
+ }) => string;
77
+ export declare const createVoiceSessionObservabilityRoutes: (options: VoiceSessionObservabilityRoutesOptions) => Elysia<"", {
78
+ decorator: {};
79
+ store: {};
80
+ derive: {};
81
+ resolve: {};
82
+ }, {
83
+ typebox: {};
84
+ error: {};
85
+ }, {
86
+ schema: {};
87
+ standaloneSchema: {};
88
+ macro: {};
89
+ macroFn: {};
90
+ parser: {};
91
+ response: {};
92
+ }, {}, {
93
+ derive: {};
94
+ resolve: {};
95
+ schema: {};
96
+ standaloneSchema: {};
97
+ response: {};
98
+ }, {
99
+ derive: {};
100
+ resolve: {};
101
+ schema: {};
102
+ standaloneSchema: {};
103
+ response: {};
104
+ }>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.458",
3
+ "version": "0.0.22-beta.459",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",