@absolutejs/voice 0.0.22-beta.90 → 0.0.22-beta.92
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/angular/index.d.ts +1 -0
- package/dist/angular/index.js +144 -20
- package/dist/angular/voice-trace-timeline.service.d.ts +12 -0
- package/dist/appKit.d.ts +3 -1
- package/dist/bargeInRoutes.d.ts +56 -0
- package/dist/client/bargeInMonitor.d.ts +7 -0
- package/dist/client/duplex.d.ts +1 -1
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.js +274 -5
- package/dist/client/traceTimeline.d.ts +19 -0
- package/dist/client/traceTimelineWidget.d.ts +32 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +307 -213
- package/dist/react/VoiceTraceTimeline.d.ts +6 -0
- package/dist/react/index.d.ts +2 -0
- package/dist/react/index.js +316 -50
- package/dist/react/useVoiceTraceTimeline.d.ts +8 -0
- package/dist/svelte/createVoiceTraceTimeline.d.ts +10 -0
- package/dist/svelte/index.d.ts +1 -0
- package/dist/svelte/index.js +194 -16
- package/dist/testing/index.js +30 -5
- package/dist/trace.d.ts +1 -1
- package/dist/types.d.ts +40 -0
- package/dist/vue/index.d.ts +1 -0
- package/dist/vue/index.js +119 -6
- package/dist/vue/useVoiceTraceTimeline.d.ts +9 -0
- package/package.json +1 -1
package/dist/client/index.js
CHANGED
|
@@ -1560,11 +1560,26 @@ var DEFAULT_INTERRUPT_THRESHOLD = 0.08;
|
|
|
1560
1560
|
var shouldInterruptForLevel = (level, options = {}) => (options.enabled ?? true) && level >= (options.interruptThreshold ?? DEFAULT_INTERRUPT_THRESHOLD);
|
|
1561
1561
|
var bindVoiceBargeIn = (controller, player, options = {}) => {
|
|
1562
1562
|
let lastPartial = controller.partial;
|
|
1563
|
-
const interruptIfPlaying = () => {
|
|
1563
|
+
const interruptIfPlaying = (reason) => {
|
|
1564
1564
|
if (!player.isPlaying || options.enabled === false) {
|
|
1565
|
+
options.monitor?.recordSkipped({
|
|
1566
|
+
reason,
|
|
1567
|
+
sessionId: controller.sessionId
|
|
1568
|
+
});
|
|
1565
1569
|
return;
|
|
1566
1570
|
}
|
|
1567
|
-
|
|
1571
|
+
options.monitor?.recordRequested({
|
|
1572
|
+
reason,
|
|
1573
|
+
sessionId: controller.sessionId
|
|
1574
|
+
});
|
|
1575
|
+
player.interrupt().then(() => {
|
|
1576
|
+
options.monitor?.recordStopped({
|
|
1577
|
+
latencyMs: player.lastInterruptLatencyMs,
|
|
1578
|
+
playbackStopLatencyMs: player.lastPlaybackStopLatencyMs,
|
|
1579
|
+
reason,
|
|
1580
|
+
sessionId: controller.sessionId
|
|
1581
|
+
});
|
|
1582
|
+
});
|
|
1568
1583
|
};
|
|
1569
1584
|
const unsubscribe = controller.subscribe(() => {
|
|
1570
1585
|
if (options.interruptOnPartial === false) {
|
|
@@ -1572,7 +1587,7 @@ var bindVoiceBargeIn = (controller, player, options = {}) => {
|
|
|
1572
1587
|
return;
|
|
1573
1588
|
}
|
|
1574
1589
|
if (!lastPartial && controller.partial) {
|
|
1575
|
-
interruptIfPlaying();
|
|
1590
|
+
interruptIfPlaying("partial-transcript");
|
|
1576
1591
|
}
|
|
1577
1592
|
lastPartial = controller.partial;
|
|
1578
1593
|
});
|
|
@@ -1582,11 +1597,11 @@ var bindVoiceBargeIn = (controller, player, options = {}) => {
|
|
|
1582
1597
|
},
|
|
1583
1598
|
handleLevel: (level) => {
|
|
1584
1599
|
if (shouldInterruptForLevel(level, options)) {
|
|
1585
|
-
interruptIfPlaying();
|
|
1600
|
+
interruptIfPlaying("input-level");
|
|
1586
1601
|
}
|
|
1587
1602
|
},
|
|
1588
1603
|
sendAudio: (audio) => {
|
|
1589
|
-
interruptIfPlaying();
|
|
1604
|
+
interruptIfPlaying("manual-audio");
|
|
1590
1605
|
controller.sendAudio(audio);
|
|
1591
1606
|
}
|
|
1592
1607
|
};
|
|
@@ -1616,13 +1631,93 @@ var createVoiceDuplexController = (path, options = {}) => {
|
|
|
1616
1631
|
audioPlayer,
|
|
1617
1632
|
close,
|
|
1618
1633
|
interruptAssistant: async () => {
|
|
1634
|
+
options.bargeIn?.monitor?.recordRequested({
|
|
1635
|
+
reason: "manual-interrupt",
|
|
1636
|
+
sessionId: controller.sessionId
|
|
1637
|
+
});
|
|
1619
1638
|
await audioPlayer.interrupt();
|
|
1639
|
+
options.bargeIn?.monitor?.recordStopped({
|
|
1640
|
+
latencyMs: audioPlayer.lastInterruptLatencyMs,
|
|
1641
|
+
playbackStopLatencyMs: audioPlayer.lastPlaybackStopLatencyMs,
|
|
1642
|
+
reason: "manual-interrupt",
|
|
1643
|
+
sessionId: controller.sessionId
|
|
1644
|
+
});
|
|
1620
1645
|
},
|
|
1621
1646
|
sendAudio: (audio) => {
|
|
1622
1647
|
bargeInBinding?.sendAudio(audio);
|
|
1623
1648
|
}
|
|
1624
1649
|
};
|
|
1625
1650
|
};
|
|
1651
|
+
// src/client/bargeInMonitor.ts
|
|
1652
|
+
var DEFAULT_THRESHOLD_MS = 250;
|
|
1653
|
+
var createEventId = () => `barge-in:${Date.now()}:${crypto.randomUUID?.() ?? Math.random().toString(36).slice(2)}`;
|
|
1654
|
+
var summarize = (events, thresholdMs) => {
|
|
1655
|
+
const stopped = events.filter((event) => event.status === "stopped");
|
|
1656
|
+
const latencies = stopped.map((event) => event.latencyMs).filter((value) => typeof value === "number");
|
|
1657
|
+
const failed = stopped.filter((event) => typeof event.latencyMs === "number" && event.latencyMs > thresholdMs).length;
|
|
1658
|
+
const passed = stopped.length - failed;
|
|
1659
|
+
return {
|
|
1660
|
+
averageLatencyMs: latencies.length > 0 ? Math.round(latencies.reduce((total, value) => total + value, 0) / latencies.length) : undefined,
|
|
1661
|
+
events: [...events],
|
|
1662
|
+
failed,
|
|
1663
|
+
lastEvent: events.at(-1),
|
|
1664
|
+
passed,
|
|
1665
|
+
status: events.length === 0 ? "empty" : failed > 0 ? "fail" : stopped.length === 0 ? "warn" : "pass",
|
|
1666
|
+
thresholdMs,
|
|
1667
|
+
total: stopped.length
|
|
1668
|
+
};
|
|
1669
|
+
};
|
|
1670
|
+
var createVoiceBargeInMonitor = (options = {}) => {
|
|
1671
|
+
const listeners = new Set;
|
|
1672
|
+
const thresholdMs = options.thresholdMs ?? DEFAULT_THRESHOLD_MS;
|
|
1673
|
+
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
1674
|
+
const events = [];
|
|
1675
|
+
const emit = () => {
|
|
1676
|
+
for (const listener of listeners) {
|
|
1677
|
+
listener();
|
|
1678
|
+
}
|
|
1679
|
+
};
|
|
1680
|
+
const postEvent = (event) => {
|
|
1681
|
+
if (!options.path || typeof fetchImpl !== "function") {
|
|
1682
|
+
return;
|
|
1683
|
+
}
|
|
1684
|
+
fetchImpl(options.path, {
|
|
1685
|
+
body: JSON.stringify(event),
|
|
1686
|
+
headers: {
|
|
1687
|
+
"Content-Type": "application/json"
|
|
1688
|
+
},
|
|
1689
|
+
method: "POST"
|
|
1690
|
+
}).catch(() => {});
|
|
1691
|
+
};
|
|
1692
|
+
const record = (status, input) => {
|
|
1693
|
+
const event = {
|
|
1694
|
+
at: Date.now(),
|
|
1695
|
+
id: createEventId(),
|
|
1696
|
+
latencyMs: input.latencyMs,
|
|
1697
|
+
playbackStopLatencyMs: input.playbackStopLatencyMs,
|
|
1698
|
+
reason: input.reason,
|
|
1699
|
+
sessionId: input.sessionId,
|
|
1700
|
+
status,
|
|
1701
|
+
thresholdMs
|
|
1702
|
+
};
|
|
1703
|
+
events.push(event);
|
|
1704
|
+
postEvent(event);
|
|
1705
|
+
emit();
|
|
1706
|
+
return event;
|
|
1707
|
+
};
|
|
1708
|
+
return {
|
|
1709
|
+
getSnapshot: () => summarize(events, thresholdMs),
|
|
1710
|
+
recordRequested: (input) => record("requested", input),
|
|
1711
|
+
recordSkipped: (input) => record("skipped", input),
|
|
1712
|
+
recordStopped: (input) => record("stopped", input),
|
|
1713
|
+
subscribe: (subscriber) => {
|
|
1714
|
+
listeners.add(subscriber);
|
|
1715
|
+
return () => {
|
|
1716
|
+
listeners.delete(subscriber);
|
|
1717
|
+
};
|
|
1718
|
+
}
|
|
1719
|
+
};
|
|
1720
|
+
};
|
|
1626
1721
|
// src/client/appKitStatus.ts
|
|
1627
1722
|
var fetchVoiceAppKitStatus = async (path = "/app-kit/status", options = {}) => {
|
|
1628
1723
|
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
@@ -2229,6 +2324,85 @@ var createVoiceTurnQualityStore = (path = "/api/turn-quality", options = {}) =>
|
|
|
2229
2324
|
}
|
|
2230
2325
|
};
|
|
2231
2326
|
};
|
|
2327
|
+
// src/client/traceTimeline.ts
|
|
2328
|
+
var fetchVoiceTraceTimeline = async (path = "/api/voice-traces", options = {}) => {
|
|
2329
|
+
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
2330
|
+
const response = await fetchImpl(path);
|
|
2331
|
+
if (!response.ok) {
|
|
2332
|
+
throw new Error(`Voice trace timeline failed: HTTP ${response.status}`);
|
|
2333
|
+
}
|
|
2334
|
+
return await response.json();
|
|
2335
|
+
};
|
|
2336
|
+
var createVoiceTraceTimelineStore = (path = "/api/voice-traces", options = {}) => {
|
|
2337
|
+
const listeners = new Set;
|
|
2338
|
+
let closed = false;
|
|
2339
|
+
let timer;
|
|
2340
|
+
let snapshot = {
|
|
2341
|
+
error: null,
|
|
2342
|
+
isLoading: false,
|
|
2343
|
+
report: null
|
|
2344
|
+
};
|
|
2345
|
+
const emit = () => {
|
|
2346
|
+
for (const listener of listeners) {
|
|
2347
|
+
listener();
|
|
2348
|
+
}
|
|
2349
|
+
};
|
|
2350
|
+
const refresh = async () => {
|
|
2351
|
+
if (closed) {
|
|
2352
|
+
return snapshot.report;
|
|
2353
|
+
}
|
|
2354
|
+
snapshot = {
|
|
2355
|
+
...snapshot,
|
|
2356
|
+
error: null,
|
|
2357
|
+
isLoading: true
|
|
2358
|
+
};
|
|
2359
|
+
emit();
|
|
2360
|
+
try {
|
|
2361
|
+
const report = await fetchVoiceTraceTimeline(path, options);
|
|
2362
|
+
snapshot = {
|
|
2363
|
+
error: null,
|
|
2364
|
+
isLoading: false,
|
|
2365
|
+
report,
|
|
2366
|
+
updatedAt: Date.now()
|
|
2367
|
+
};
|
|
2368
|
+
emit();
|
|
2369
|
+
return report;
|
|
2370
|
+
} catch (error) {
|
|
2371
|
+
snapshot = {
|
|
2372
|
+
...snapshot,
|
|
2373
|
+
error: error instanceof Error ? error.message : String(error),
|
|
2374
|
+
isLoading: false
|
|
2375
|
+
};
|
|
2376
|
+
emit();
|
|
2377
|
+
throw error;
|
|
2378
|
+
}
|
|
2379
|
+
};
|
|
2380
|
+
const close = () => {
|
|
2381
|
+
closed = true;
|
|
2382
|
+
if (timer) {
|
|
2383
|
+
clearInterval(timer);
|
|
2384
|
+
timer = undefined;
|
|
2385
|
+
}
|
|
2386
|
+
listeners.clear();
|
|
2387
|
+
};
|
|
2388
|
+
if (options.intervalMs && options.intervalMs > 0) {
|
|
2389
|
+
timer = setInterval(() => {
|
|
2390
|
+
refresh().catch(() => {});
|
|
2391
|
+
}, options.intervalMs);
|
|
2392
|
+
}
|
|
2393
|
+
return {
|
|
2394
|
+
close,
|
|
2395
|
+
getServerSnapshot: () => snapshot,
|
|
2396
|
+
getSnapshot: () => snapshot,
|
|
2397
|
+
refresh,
|
|
2398
|
+
subscribe: (listener) => {
|
|
2399
|
+
listeners.add(listener);
|
|
2400
|
+
return () => {
|
|
2401
|
+
listeners.delete(listener);
|
|
2402
|
+
};
|
|
2403
|
+
}
|
|
2404
|
+
};
|
|
2405
|
+
};
|
|
2232
2406
|
// src/client/providerSimulationControls.ts
|
|
2233
2407
|
var postSimulation = async (pathPrefix, mode, provider, fetchImpl) => {
|
|
2234
2408
|
const response = await fetchImpl(`${pathPrefix}/${mode}?provider=${encodeURIComponent(provider)}`, { method: "POST" });
|
|
@@ -2747,6 +2921,93 @@ var defineVoiceTurnQualityElement = (tagName = "absolute-voice-turn-quality") =>
|
|
|
2747
2921
|
}
|
|
2748
2922
|
});
|
|
2749
2923
|
};
|
|
2924
|
+
// src/client/traceTimelineWidget.ts
|
|
2925
|
+
var DEFAULT_TITLE6 = "Voice Traces";
|
|
2926
|
+
var DEFAULT_DESCRIPTION6 = "Latest call timelines with provider latency, fallbacks, handoffs, and errors from your self-hosted trace store.";
|
|
2927
|
+
var escapeHtml7 = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">").replaceAll('"', """).replaceAll("'", "'");
|
|
2928
|
+
var formatMs = (value) => typeof value === "number" ? `${value}ms` : "n/a";
|
|
2929
|
+
var formatProviders = (session) => session.providers.length ? session.providers.map((provider) => provider.provider).join(", ") : "No providers";
|
|
2930
|
+
var createVoiceTraceTimelineViewModel = (snapshot, options = {}) => {
|
|
2931
|
+
const sessions = (snapshot.report?.sessions ?? []).slice(0, options.limit ?? 3).map((session) => ({
|
|
2932
|
+
...session,
|
|
2933
|
+
detailHref: `${options.detailBasePath ?? "/traces"}/${encodeURIComponent(session.sessionId)}`,
|
|
2934
|
+
durationLabel: formatMs(session.summary.callDurationMs),
|
|
2935
|
+
label: `${session.summary.eventCount} events / ${session.summary.turnCount} turns`,
|
|
2936
|
+
providerLabel: formatProviders(session)
|
|
2937
|
+
}));
|
|
2938
|
+
const failed = sessions.filter((session) => session.status === "failed").length;
|
|
2939
|
+
const warnings = sessions.filter((session) => session.status === "warning").length;
|
|
2940
|
+
return {
|
|
2941
|
+
description: options.description ?? DEFAULT_DESCRIPTION6,
|
|
2942
|
+
error: snapshot.error,
|
|
2943
|
+
isLoading: snapshot.isLoading,
|
|
2944
|
+
label: snapshot.error ? "Unavailable" : failed > 0 ? `${failed} failed` : warnings > 0 ? `${warnings} warning` : sessions.length ? `${sessions.length} recent` : snapshot.isLoading ? "Checking" : "No traces yet",
|
|
2945
|
+
sessions,
|
|
2946
|
+
status: snapshot.error ? "error" : failed > 0 ? "failed" : warnings > 0 ? "warning" : sessions.length ? "ready" : snapshot.isLoading ? "loading" : "empty",
|
|
2947
|
+
title: options.title ?? DEFAULT_TITLE6,
|
|
2948
|
+
updatedAt: snapshot.updatedAt
|
|
2949
|
+
};
|
|
2950
|
+
};
|
|
2951
|
+
var renderVoiceTraceTimelineWidgetHTML = (snapshot, options = {}) => {
|
|
2952
|
+
const model = createVoiceTraceTimelineViewModel(snapshot, options);
|
|
2953
|
+
const sessions = model.sessions.length ? `<div class="absolute-voice-trace-timeline__sessions">${model.sessions.map((session) => `<article class="absolute-voice-trace-timeline__session absolute-voice-trace-timeline__session--${escapeHtml7(session.status)}">
|
|
2954
|
+
<header>
|
|
2955
|
+
<strong>${escapeHtml7(session.sessionId)}</strong>
|
|
2956
|
+
<span>${escapeHtml7(session.status)}</span>
|
|
2957
|
+
</header>
|
|
2958
|
+
<p>${escapeHtml7(session.label)} \xB7 ${escapeHtml7(session.durationLabel)} \xB7 ${escapeHtml7(session.providerLabel)}</p>
|
|
2959
|
+
<a href="${escapeHtml7(session.detailHref)}">Open timeline</a>
|
|
2960
|
+
</article>`).join("")}</div>` : '<p class="absolute-voice-trace-timeline__empty">Run a voice session to see call timelines.</p>';
|
|
2961
|
+
return `<section class="absolute-voice-trace-timeline absolute-voice-trace-timeline--${escapeHtml7(model.status)}">
|
|
2962
|
+
<header class="absolute-voice-trace-timeline__header">
|
|
2963
|
+
<span class="absolute-voice-trace-timeline__eyebrow">${escapeHtml7(model.title)}</span>
|
|
2964
|
+
<strong class="absolute-voice-trace-timeline__label">${escapeHtml7(model.label)}</strong>
|
|
2965
|
+
</header>
|
|
2966
|
+
<p class="absolute-voice-trace-timeline__description">${escapeHtml7(model.description)}</p>
|
|
2967
|
+
${sessions}
|
|
2968
|
+
${model.error ? `<p class="absolute-voice-trace-timeline__error">${escapeHtml7(model.error)}</p>` : ""}
|
|
2969
|
+
</section>`;
|
|
2970
|
+
};
|
|
2971
|
+
var getVoiceTraceTimelineCSS = () => `.absolute-voice-trace-timeline{border:1px solid #bad7d3;border-radius:20px;background:#f3fffb;color:#09201c;padding:18px;box-shadow:0 18px 40px rgba(9,32,28,.12);font-family:inherit}.absolute-voice-trace-timeline--error,.absolute-voice-trace-timeline--failed{border-color:#f2a7a7;background:#fff5f3}.absolute-voice-trace-timeline--warning{border-color:#fbbf24;background:#fffaf0}.absolute-voice-trace-timeline__header,.absolute-voice-trace-timeline__session header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-trace-timeline__eyebrow{color:#17665b;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-trace-timeline__label{font-size:24px;line-height:1}.absolute-voice-trace-timeline__description,.absolute-voice-trace-timeline__session p,.absolute-voice-trace-timeline__empty{color:#35544f}.absolute-voice-trace-timeline__sessions{display:grid;gap:12px;margin-top:14px}.absolute-voice-trace-timeline__session{background:#fff;border:1px solid #cfe7e2;border-radius:16px;padding:14px}.absolute-voice-trace-timeline__session--failed{border-color:#f2a7a7}.absolute-voice-trace-timeline__session--warning{border-color:#fbbf24}.absolute-voice-trace-timeline__session p{margin:10px 0}.absolute-voice-trace-timeline__session a{color:#0f766e;font-weight:800}.absolute-voice-trace-timeline__empty{margin:14px 0 0}.absolute-voice-trace-timeline__error{color:#9f1239;font-weight:700}`;
|
|
2972
|
+
var mountVoiceTraceTimeline = (element, path = "/api/voice-traces", options = {}) => {
|
|
2973
|
+
const store = createVoiceTraceTimelineStore(path, options);
|
|
2974
|
+
const render = () => {
|
|
2975
|
+
element.innerHTML = renderVoiceTraceTimelineWidgetHTML(store.getSnapshot(), options);
|
|
2976
|
+
};
|
|
2977
|
+
const unsubscribe = store.subscribe(render);
|
|
2978
|
+
render();
|
|
2979
|
+
store.refresh().catch(() => {});
|
|
2980
|
+
return {
|
|
2981
|
+
close: () => {
|
|
2982
|
+
unsubscribe();
|
|
2983
|
+
store.close();
|
|
2984
|
+
},
|
|
2985
|
+
refresh: store.refresh
|
|
2986
|
+
};
|
|
2987
|
+
};
|
|
2988
|
+
var defineVoiceTraceTimelineElement = (tagName = "absolute-voice-trace-timeline") => {
|
|
2989
|
+
if (typeof window === "undefined" || typeof customElements === "undefined" || customElements.get(tagName)) {
|
|
2990
|
+
return;
|
|
2991
|
+
}
|
|
2992
|
+
customElements.define(tagName, class AbsoluteVoiceTraceTimelineElement extends HTMLElement {
|
|
2993
|
+
mounted;
|
|
2994
|
+
connectedCallback() {
|
|
2995
|
+
const intervalMs = Number(this.getAttribute("interval-ms") ?? 5000);
|
|
2996
|
+
const limit = Number(this.getAttribute("limit") ?? 3);
|
|
2997
|
+
this.mounted = mountVoiceTraceTimeline(this, this.getAttribute("path") ?? "/api/voice-traces", {
|
|
2998
|
+
description: this.getAttribute("description") ?? undefined,
|
|
2999
|
+
detailBasePath: this.getAttribute("detail-base-path") ?? undefined,
|
|
3000
|
+
intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000,
|
|
3001
|
+
limit: Number.isFinite(limit) ? limit : 3,
|
|
3002
|
+
title: this.getAttribute("title") ?? undefined
|
|
3003
|
+
});
|
|
3004
|
+
}
|
|
3005
|
+
disconnectedCallback() {
|
|
3006
|
+
this.mounted?.close();
|
|
3007
|
+
this.mounted = undefined;
|
|
3008
|
+
}
|
|
3009
|
+
});
|
|
3010
|
+
};
|
|
2750
3011
|
// src/client/workflowStatus.ts
|
|
2751
3012
|
var fetchVoiceWorkflowStatus = async (path = "/evals/scenarios/json", options = {}) => {
|
|
2752
3013
|
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
@@ -2827,18 +3088,21 @@ var createVoiceWorkflowStatusStore = (path = "/evals/scenarios/json", options =
|
|
|
2827
3088
|
};
|
|
2828
3089
|
export {
|
|
2829
3090
|
renderVoiceTurnQualityHTML,
|
|
3091
|
+
renderVoiceTraceTimelineWidgetHTML,
|
|
2830
3092
|
renderVoiceRoutingStatusHTML,
|
|
2831
3093
|
renderVoiceProviderStatusHTML,
|
|
2832
3094
|
renderVoiceProviderSimulationControlsHTML,
|
|
2833
3095
|
renderVoiceProviderCapabilitiesHTML,
|
|
2834
3096
|
renderVoiceOpsStatusHTML,
|
|
2835
3097
|
mountVoiceTurnQuality,
|
|
3098
|
+
mountVoiceTraceTimeline,
|
|
2836
3099
|
mountVoiceRoutingStatus,
|
|
2837
3100
|
mountVoiceProviderStatus,
|
|
2838
3101
|
mountVoiceProviderSimulationControls,
|
|
2839
3102
|
mountVoiceProviderCapabilities,
|
|
2840
3103
|
mountVoiceOpsStatus,
|
|
2841
3104
|
getVoiceTurnQualityCSS,
|
|
3105
|
+
getVoiceTraceTimelineCSS,
|
|
2842
3106
|
getVoiceRoutingStatusCSS,
|
|
2843
3107
|
getVoiceProviderStatusCSS,
|
|
2844
3108
|
getVoiceProviderCapabilitiesCSS,
|
|
@@ -2846,11 +3110,13 @@ export {
|
|
|
2846
3110
|
getVoiceOpsStatusCSS,
|
|
2847
3111
|
fetchVoiceWorkflowStatus,
|
|
2848
3112
|
fetchVoiceTurnQuality,
|
|
3113
|
+
fetchVoiceTraceTimeline,
|
|
2849
3114
|
fetchVoiceRoutingStatus,
|
|
2850
3115
|
fetchVoiceProviderStatus,
|
|
2851
3116
|
fetchVoiceProviderCapabilities,
|
|
2852
3117
|
fetchVoiceAppKitStatus,
|
|
2853
3118
|
defineVoiceTurnQualityElement,
|
|
3119
|
+
defineVoiceTraceTimelineElement,
|
|
2854
3120
|
defineVoiceRoutingStatusElement,
|
|
2855
3121
|
defineVoiceProviderStatusElement,
|
|
2856
3122
|
defineVoiceProviderSimulationControlsElement,
|
|
@@ -2860,6 +3126,8 @@ export {
|
|
|
2860
3126
|
createVoiceWorkflowStatusStore,
|
|
2861
3127
|
createVoiceTurnQualityViewModel,
|
|
2862
3128
|
createVoiceTurnQualityStore,
|
|
3129
|
+
createVoiceTraceTimelineViewModel,
|
|
3130
|
+
createVoiceTraceTimelineStore,
|
|
2863
3131
|
createVoiceStream,
|
|
2864
3132
|
createVoiceRoutingStatusViewModel,
|
|
2865
3133
|
createVoiceRoutingStatusStore,
|
|
@@ -2873,6 +3141,7 @@ export {
|
|
|
2873
3141
|
createVoiceDuplexController,
|
|
2874
3142
|
createVoiceController,
|
|
2875
3143
|
createVoiceConnection,
|
|
3144
|
+
createVoiceBargeInMonitor,
|
|
2876
3145
|
createVoiceAudioPlayer,
|
|
2877
3146
|
createVoiceAppKitStatusStore,
|
|
2878
3147
|
createMicrophoneCapture,
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { VoiceTraceTimelineReport } from '../traceTimeline';
|
|
2
|
+
export type VoiceTraceTimelineClientOptions = {
|
|
3
|
+
fetch?: typeof fetch;
|
|
4
|
+
intervalMs?: number;
|
|
5
|
+
};
|
|
6
|
+
export type VoiceTraceTimelineSnapshot = {
|
|
7
|
+
error: string | null;
|
|
8
|
+
isLoading: boolean;
|
|
9
|
+
report: VoiceTraceTimelineReport | null;
|
|
10
|
+
updatedAt?: number;
|
|
11
|
+
};
|
|
12
|
+
export declare const fetchVoiceTraceTimeline: (path?: string, options?: Pick<VoiceTraceTimelineClientOptions, "fetch">) => Promise<VoiceTraceTimelineReport>;
|
|
13
|
+
export declare const createVoiceTraceTimelineStore: (path?: string, options?: VoiceTraceTimelineClientOptions) => {
|
|
14
|
+
close: () => void;
|
|
15
|
+
getServerSnapshot: () => VoiceTraceTimelineSnapshot;
|
|
16
|
+
getSnapshot: () => VoiceTraceTimelineSnapshot;
|
|
17
|
+
refresh: () => Promise<VoiceTraceTimelineReport | null>;
|
|
18
|
+
subscribe: (listener: () => void) => () => void;
|
|
19
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { VoiceTraceTimelineSession } from '../traceTimeline';
|
|
2
|
+
import { type VoiceTraceTimelineClientOptions, type VoiceTraceTimelineSnapshot } from './traceTimeline';
|
|
3
|
+
export type VoiceTraceTimelineSessionView = VoiceTraceTimelineSession & {
|
|
4
|
+
detailHref: string;
|
|
5
|
+
durationLabel: string;
|
|
6
|
+
label: string;
|
|
7
|
+
providerLabel: string;
|
|
8
|
+
};
|
|
9
|
+
export type VoiceTraceTimelineViewModel = {
|
|
10
|
+
description: string;
|
|
11
|
+
error: string | null;
|
|
12
|
+
isLoading: boolean;
|
|
13
|
+
label: string;
|
|
14
|
+
sessions: VoiceTraceTimelineSessionView[];
|
|
15
|
+
status: 'empty' | 'error' | 'failed' | 'loading' | 'ready' | 'warning';
|
|
16
|
+
title: string;
|
|
17
|
+
updatedAt?: number;
|
|
18
|
+
};
|
|
19
|
+
export type VoiceTraceTimelineWidgetOptions = VoiceTraceTimelineClientOptions & {
|
|
20
|
+
description?: string;
|
|
21
|
+
detailBasePath?: string;
|
|
22
|
+
limit?: number;
|
|
23
|
+
title?: string;
|
|
24
|
+
};
|
|
25
|
+
export declare const createVoiceTraceTimelineViewModel: (snapshot: VoiceTraceTimelineSnapshot, options?: VoiceTraceTimelineWidgetOptions) => VoiceTraceTimelineViewModel;
|
|
26
|
+
export declare const renderVoiceTraceTimelineWidgetHTML: (snapshot: VoiceTraceTimelineSnapshot, options?: VoiceTraceTimelineWidgetOptions) => string;
|
|
27
|
+
export declare const getVoiceTraceTimelineCSS: () => string;
|
|
28
|
+
export declare const mountVoiceTraceTimeline: (element: Element, path?: string, options?: VoiceTraceTimelineWidgetOptions) => {
|
|
29
|
+
close: () => void;
|
|
30
|
+
refresh: () => Promise<import("..").VoiceTraceTimelineReport | null>;
|
|
31
|
+
};
|
|
32
|
+
export declare const defineVoiceTraceTimelineElement: (tagName?: string) => void;
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export { voice } from './plugin';
|
|
|
2
2
|
export { createVoiceAppKit, createVoiceAppKitRoutes, summarizeVoiceAppKitStatus } from './appKit';
|
|
3
3
|
export { createVoiceAssistant, createVoiceExperiment, summarizeVoiceAssistantRuns } from './assistant';
|
|
4
4
|
export { createVoiceAssistantHealthHTMLHandler, createVoiceAssistantHealthJSONHandler, createVoiceAssistantHealthRoutes, renderVoiceAssistantHealthHTML, summarizeVoiceAssistantHealth } from './assistantHealth';
|
|
5
|
+
export { createVoiceBargeInRoutes, renderVoiceBargeInHTML, summarizeVoiceBargeIn } from './bargeInRoutes';
|
|
5
6
|
export { buildVoiceDiagnosticsMarkdown, createVoiceDiagnosticsRoutes, resolveVoiceDiagnosticsTraceFilter } from './diagnosticsRoutes';
|
|
6
7
|
export { compareVoiceEvalBaseline, createVoiceFileEvalBaselineStore, createVoiceFileScenarioFixtureStore, createVoiceEvalRoutes, renderVoiceEvalBaselineHTML, renderVoiceEvalHTML, renderVoiceScenarioEvalHTML, renderVoiceScenarioFixtureEvalHTML, runVoiceScenarioEvals, runVoiceScenarioFixtureEvals, runVoiceSessionEvals } from './evalRoutes';
|
|
7
8
|
export { createVoiceWorkflowContract, createVoiceWorkflowContractHandler, createVoiceWorkflowContractPreset, createVoiceWorkflowScenario, recordVoiceWorkflowContractTrace, validateVoiceWorkflowRouteResult } from './workflowContract';
|
|
@@ -48,6 +49,7 @@ export { resolveVoiceRuntimePreset } from './presets';
|
|
|
48
49
|
export { resolveTurnDetectionConfig, TURN_PROFILE_DEFAULTS } from './turnProfiles';
|
|
49
50
|
export { createVoiceCallReviewFromLiveTelephonyReport, createVoiceCallReviewRecorder, renderVoiceCallReviewHTML, renderVoiceCallReviewMarkdown } from './testing/review';
|
|
50
51
|
export type { VoiceAppKitLink, VoiceAppKitRoutes, VoiceAppKitRoutesOptions, VoiceAppKitStatus, VoiceAppKitStatusOptions, VoiceAppKitStatusReport, VoiceAppKitSurface } from './appKit';
|
|
52
|
+
export type { VoiceBargeInReport, VoiceBargeInRoutesOptions } from './bargeInRoutes';
|
|
51
53
|
export type { VoiceAssistant, VoiceAssistantArtifactPlan, VoiceAssistantExperiment, VoiceAssistantExperimentOptions, VoiceAssistantGuardrailInput, VoiceAssistantGuardrails, VoiceAssistantMemoryLifecycle, VoiceAssistantMemoryLifecycleInput, VoiceAssistantOptions, VoiceAssistantOutputGuardrailInput, VoiceAssistantPreset, VoiceAssistantRunsSummary, VoiceAssistantRunSummary, VoiceAssistantVariant } from './assistant';
|
|
52
54
|
export type { VoiceAssistantHealthFailure, VoiceAssistantHealthHTMLHandlerOptions, VoiceAssistantHealthRoutesOptions, VoiceAssistantHealthSummary, VoiceAssistantHealthSummaryOptions } from './assistantHealth';
|
|
53
55
|
export type { VoiceAssistantMemoryBinding, VoiceAssistantMemoryHandle, VoiceAssistantMemoryOptions, VoiceAssistantMemoryRecord, VoiceAssistantMemoryStore } from './assistantMemory';
|