@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.
@@ -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
- player.interrupt();
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("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
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';