@absolutejs/voice 0.0.22-beta.179 → 0.0.22-beta.180
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.js +29 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -22936,7 +22936,35 @@ var renderVoiceTraceTimelineSessionHTML = (session, options = {}) => {
|
|
|
22936
22936
|
};
|
|
22937
22937
|
var renderSessionRows = (report) => report.sessions.length === 0 ? '<tr><td colspan="7">No trace events recorded yet.</td></tr>' : report.sessions.map((session) => `<tr class="${escapeHtml40(session.status)}"><td><a href="/traces/${encodeURIComponent(session.sessionId)}">${escapeHtml40(session.sessionId)}</a></td><td>${escapeHtml40(session.status)}</td><td>${String(session.summary.eventCount)}</td><td>${String(session.summary.turnCount)}</td><td>${String(session.summary.errorCount)}</td><td>${formatMs3(session.summary.callDurationMs)}</td><td>${session.providers.map((provider) => escapeHtml40(provider.provider)).join(", ")}</td></tr>`).join("");
|
|
22938
22938
|
var timelineCSS = "body{background:#0f1318;color:#f6f2e8;font-family:ui-sans-serif,system-ui,sans-serif;margin:0}main{margin:auto;max-width:1180px;padding:32px}a{color:#fbbf24}.eyebrow{color:#fbbf24;font-weight:900;letter-spacing:.12em;text-transform:uppercase}h1{font-size:clamp(2.4rem,6vw,4.5rem);line-height:.92;margin:.2rem 0 1rem}.status{border:1px solid #475569;border-radius:999px;display:inline-flex;padding:8px 12px}.healthy{color:#86efac}.warning{color:#fbbf24}.failed,.error{color:#fca5a5}.metrics,.providers{display:grid;gap:14px;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));margin:20px 0}.metrics article,.providers article{background:#181f27;border:1px solid #2b3642;border-radius:20px;padding:16px}.metrics span,dt,.muted{color:#a8b0b8}.metrics strong{display:block;font-size:2rem}dl{display:grid;gap:8px;grid-template-columns:repeat(2,minmax(0,1fr));margin:12px 0 0}dd{font-weight:800;margin:4px 0 0}table{background:#181f27;border-collapse:collapse;border-radius:18px;overflow:hidden;width:100%}td,th{border-bottom:1px solid #2b3642;padding:12px;text-align:left}section{margin-top:28px}@media(max-width:760px){main{padding:20px}table{font-size:.9rem}}";
|
|
22939
|
-
var renderVoiceTraceTimelineHTML = (report, options = {}) =>
|
|
22939
|
+
var renderVoiceTraceTimelineHTML = (report, options = {}) => {
|
|
22940
|
+
const snippet = escapeHtml40(`const traceStore = createVoiceTraceSinkStore({
|
|
22941
|
+
store: runtimeStorage.traces,
|
|
22942
|
+
sinks: [
|
|
22943
|
+
createVoiceTraceHTTPSink({
|
|
22944
|
+
endpoint: process.env.VOICE_TRACE_WEBHOOK_URL
|
|
22945
|
+
})
|
|
22946
|
+
]
|
|
22947
|
+
});
|
|
22948
|
+
|
|
22949
|
+
app.use(
|
|
22950
|
+
createVoiceTraceTimelineRoutes({
|
|
22951
|
+
htmlPath: '/traces',
|
|
22952
|
+
path: '/api/voice-traces',
|
|
22953
|
+
redact: {
|
|
22954
|
+
keys: ['authorization', 'apiKey', 'token']
|
|
22955
|
+
},
|
|
22956
|
+
store: traceStore
|
|
22957
|
+
})
|
|
22958
|
+
);
|
|
22959
|
+
|
|
22960
|
+
app.use(
|
|
22961
|
+
createVoiceProductionReadinessRoutes({
|
|
22962
|
+
store: traceStore,
|
|
22963
|
+
traceDeliveries: runtimeStorage.traceDeliveries
|
|
22964
|
+
})
|
|
22965
|
+
);`);
|
|
22966
|
+
return `<!doctype html><html lang="en"><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><title>${escapeHtml40(options.title ?? "Voice Trace Timelines")}</title><style>${timelineCSS}.primitive{background:#181f27;border:1px solid #334155;border-radius:20px;margin:20px 0;padding:18px}.primitive p{line-height:1.55}.primitive pre{background:#0b1118;border:1px solid #2b3642;border-radius:16px;color:#dbeafe;overflow:auto;padding:14px}.primitive code{color:#bfdbfe}</style></head><body><main><header><p class="eyebrow">Self-hosted voice debugging</p><h1>${escapeHtml40(options.title ?? "Voice Trace Timelines")}</h1><p class="muted">Per-call event timelines with provider latency, fallback, timeout, handoff, and error context.</p></header><section class="metrics"><article><span>Sessions</span><strong>${String(report.total)}</strong></article><article><span>Failed</span><strong>${String(report.failed)}</strong></article><article><span>Warnings</span><strong>${String(report.warnings)}</strong></article></section><section class="primitive"><p class="eyebrow">Copy into your app</p><h2><code>createVoiceTraceTimelineRoutes(...)</code> makes traces the proof backbone</h2><p class="muted">Mount trace timelines from the same trace store used by readiness, simulations, provider recovery, delivery sinks, and phone-agent smoke proof.</p><pre><code>${snippet}</code></pre></section><table><thead><tr><th>Session</th><th>Status</th><th>Events</th><th>Turns</th><th>Errors</th><th>Duration</th><th>Providers</th></tr></thead><tbody>${renderSessionRows(report)}</tbody></table></main></body></html>`;
|
|
22967
|
+
};
|
|
22940
22968
|
var createVoiceTraceTimelineRoutes = (options) => {
|
|
22941
22969
|
const path = options.path ?? "/api/voice-traces";
|
|
22942
22970
|
const htmlPath = options.htmlPath ?? "/traces";
|