@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 +2 -0
- package/dist/index.js +267 -23
- package/dist/sessionObservability.d.ts +104 -0
- package/package.json +1 -1
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/
|
|
39078
|
+
// src/sessionObservability.ts
|
|
39079
39079
|
import { Elysia as Elysia62 } from "elysia";
|
|
39080
|
+
var escapeHtml59 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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
|
|
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
|
|
39498
|
-
var
|
|
39737
|
+
import { Elysia as Elysia64 } from "elysia";
|
|
39738
|
+
var escapeHtml60 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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 ${
|
|
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>${
|
|
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
|
|
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
|
|
39943
|
-
var
|
|
40182
|
+
import { Elysia as Elysia65 } from "elysia";
|
|
40183
|
+
var escapeHtml61 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
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>${
|
|
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>${
|
|
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="${
|
|
40030
|
-
const rows = report.deliveries.map((delivery) => `<article class="delivery ${
|
|
40031
|
-
return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>${
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
+
}>;
|