@absolutejs/voice 0.0.22-beta.11 → 0.0.22-beta.110

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.
Files changed (139) hide show
  1. package/README.md +411 -3
  2. package/dist/agent.d.ts +2 -0
  3. package/dist/angular/index.d.ts +8 -0
  4. package/dist/angular/index.js +1112 -44
  5. package/dist/angular/voice-app-kit-status.service.d.ts +12 -0
  6. package/dist/angular/voice-ops-status.component.d.ts +15 -0
  7. package/dist/angular/voice-provider-capabilities.service.d.ts +12 -0
  8. package/dist/angular/voice-provider-status.service.d.ts +12 -0
  9. package/dist/angular/voice-routing-status.service.d.ts +11 -0
  10. package/dist/angular/voice-stream.service.d.ts +2 -0
  11. package/dist/angular/voice-trace-timeline.service.d.ts +12 -0
  12. package/dist/angular/voice-turn-latency.service.d.ts +13 -0
  13. package/dist/angular/voice-turn-quality.service.d.ts +12 -0
  14. package/dist/angular/voice-workflow-status.service.d.ts +12 -0
  15. package/dist/appKit.d.ts +100 -0
  16. package/dist/assistantHealth.d.ts +81 -0
  17. package/dist/bargeInRoutes.d.ts +56 -0
  18. package/dist/campaign.d.ts +466 -0
  19. package/dist/client/actions.d.ts +22 -0
  20. package/dist/client/appKitStatus.d.ts +19 -0
  21. package/dist/client/bargeInMonitor.d.ts +7 -0
  22. package/dist/client/connection.d.ts +3 -0
  23. package/dist/client/duplex.d.ts +1 -1
  24. package/dist/client/htmxBootstrap.js +587 -13
  25. package/dist/client/index.d.ts +38 -0
  26. package/dist/client/index.js +1908 -8
  27. package/dist/client/liveTurnLatency.d.ts +41 -0
  28. package/dist/client/opsStatusWidget.d.ts +40 -0
  29. package/dist/client/providerCapabilities.d.ts +19 -0
  30. package/dist/client/providerCapabilitiesWidget.d.ts +32 -0
  31. package/dist/client/providerSimulationControls.d.ts +33 -0
  32. package/dist/client/providerSimulationControlsWidget.d.ts +20 -0
  33. package/dist/client/providerStatus.d.ts +19 -0
  34. package/dist/client/providerStatusWidget.d.ts +32 -0
  35. package/dist/client/routingStatus.d.ts +19 -0
  36. package/dist/client/routingStatusWidget.d.ts +28 -0
  37. package/dist/client/traceTimeline.d.ts +19 -0
  38. package/dist/client/traceTimelineWidget.d.ts +32 -0
  39. package/dist/client/turnLatency.d.ts +22 -0
  40. package/dist/client/turnLatencyWidget.d.ts +33 -0
  41. package/dist/client/turnQuality.d.ts +19 -0
  42. package/dist/client/turnQualityWidget.d.ts +32 -0
  43. package/dist/client/workflowStatus.d.ts +19 -0
  44. package/dist/diagnosticsRoutes.d.ts +44 -0
  45. package/dist/evalRoutes.d.ts +213 -0
  46. package/dist/fileStore.d.ts +3 -0
  47. package/dist/handoff.d.ts +54 -0
  48. package/dist/handoffHealth.d.ts +94 -0
  49. package/dist/index.d.ts +75 -8
  50. package/dist/index.js +11856 -3054
  51. package/dist/liveLatency.d.ts +78 -0
  52. package/dist/modelAdapters.d.ts +54 -0
  53. package/dist/openaiTTS.d.ts +18 -0
  54. package/dist/opsConsoleRoutes.d.ts +77 -0
  55. package/dist/opsWebhook.d.ts +126 -0
  56. package/dist/outcomeContract.d.ts +112 -0
  57. package/dist/phoneAgent.d.ts +41 -0
  58. package/dist/postgresStore.d.ts +2 -0
  59. package/dist/productionReadiness.d.ts +121 -0
  60. package/dist/providerAdapters.d.ts +48 -0
  61. package/dist/providerCapabilities.d.ts +92 -0
  62. package/dist/providerHealth.d.ts +79 -0
  63. package/dist/qualityRoutes.d.ts +76 -0
  64. package/dist/queue.d.ts +61 -0
  65. package/dist/react/VoiceOpsStatus.d.ts +6 -0
  66. package/dist/react/VoiceProviderCapabilities.d.ts +6 -0
  67. package/dist/react/VoiceProviderSimulationControls.d.ts +5 -0
  68. package/dist/react/VoiceProviderStatus.d.ts +6 -0
  69. package/dist/react/VoiceRoutingStatus.d.ts +6 -0
  70. package/dist/react/VoiceTraceTimeline.d.ts +6 -0
  71. package/dist/react/VoiceTurnLatency.d.ts +6 -0
  72. package/dist/react/VoiceTurnQuality.d.ts +6 -0
  73. package/dist/react/index.d.ts +17 -0
  74. package/dist/react/index.js +2467 -12
  75. package/dist/react/useVoiceAppKitStatus.d.ts +8 -0
  76. package/dist/react/useVoiceController.d.ts +2 -0
  77. package/dist/react/useVoiceProviderCapabilities.d.ts +8 -0
  78. package/dist/react/useVoiceProviderSimulationControls.d.ts +10 -0
  79. package/dist/react/useVoiceProviderStatus.d.ts +8 -0
  80. package/dist/react/useVoiceRoutingStatus.d.ts +8 -0
  81. package/dist/react/useVoiceStream.d.ts +2 -0
  82. package/dist/react/useVoiceTraceTimeline.d.ts +8 -0
  83. package/dist/react/useVoiceTurnLatency.d.ts +9 -0
  84. package/dist/react/useVoiceTurnQuality.d.ts +8 -0
  85. package/dist/react/useVoiceWorkflowStatus.d.ts +8 -0
  86. package/dist/resilienceRoutes.d.ts +142 -0
  87. package/dist/sessionReplay.d.ts +175 -0
  88. package/dist/simulationSuite.d.ts +120 -0
  89. package/dist/sqliteStore.d.ts +2 -0
  90. package/dist/svelte/createVoiceAppKitStatus.d.ts +8 -0
  91. package/dist/svelte/createVoiceOpsStatus.d.ts +9 -0
  92. package/dist/svelte/createVoiceProviderCapabilities.d.ts +10 -0
  93. package/dist/svelte/createVoiceProviderSimulationControls.d.ts +11 -0
  94. package/dist/svelte/createVoiceProviderStatus.d.ts +10 -0
  95. package/dist/svelte/createVoiceRoutingStatus.d.ts +10 -0
  96. package/dist/svelte/createVoiceTraceTimeline.d.ts +10 -0
  97. package/dist/svelte/createVoiceTurnLatency.d.ts +11 -0
  98. package/dist/svelte/createVoiceTurnQuality.d.ts +10 -0
  99. package/dist/svelte/createVoiceWorkflowStatus.d.ts +8 -0
  100. package/dist/svelte/index.d.ts +10 -0
  101. package/dist/svelte/index.js +1728 -4
  102. package/dist/telephony/contract.d.ts +61 -0
  103. package/dist/telephony/matrix.d.ts +97 -0
  104. package/dist/telephony/plivo.d.ts +254 -0
  105. package/dist/telephony/telnyx.d.ts +247 -0
  106. package/dist/telephony/twilio.d.ts +132 -0
  107. package/dist/telephonyOutcome.d.ts +201 -0
  108. package/dist/testing/index.d.ts +2 -0
  109. package/dist/testing/index.js +2637 -21
  110. package/dist/testing/ioProviderSimulator.d.ts +41 -0
  111. package/dist/testing/providerSimulator.d.ts +44 -0
  112. package/dist/toolContract.d.ts +130 -0
  113. package/dist/toolRuntime.d.ts +50 -0
  114. package/dist/trace.d.ts +1 -1
  115. package/dist/traceTimeline.d.ts +93 -0
  116. package/dist/turnLatency.d.ts +95 -0
  117. package/dist/turnQuality.d.ts +94 -0
  118. package/dist/types.d.ts +125 -2
  119. package/dist/vue/VoiceOpsStatus.d.ts +30 -0
  120. package/dist/vue/VoiceProviderCapabilities.d.ts +51 -0
  121. package/dist/vue/VoiceProviderSimulationControls.d.ts +88 -0
  122. package/dist/vue/VoiceProviderStatus.d.ts +51 -0
  123. package/dist/vue/VoiceRoutingStatus.d.ts +51 -0
  124. package/dist/vue/VoiceTurnLatency.d.ts +69 -0
  125. package/dist/vue/VoiceTurnQuality.d.ts +51 -0
  126. package/dist/vue/index.d.ts +16 -0
  127. package/dist/vue/index.js +2360 -26
  128. package/dist/vue/useVoiceAppKitStatus.d.ts +9 -0
  129. package/dist/vue/useVoiceProviderCapabilities.d.ts +9 -0
  130. package/dist/vue/useVoiceProviderSimulationControls.d.ts +24 -0
  131. package/dist/vue/useVoiceProviderStatus.d.ts +9 -0
  132. package/dist/vue/useVoiceRoutingStatus.d.ts +8 -0
  133. package/dist/vue/useVoiceStream.d.ts +2 -0
  134. package/dist/vue/useVoiceTraceTimeline.d.ts +9 -0
  135. package/dist/vue/useVoiceTurnLatency.d.ts +10 -0
  136. package/dist/vue/useVoiceTurnQuality.d.ts +9 -0
  137. package/dist/vue/useVoiceWorkflowStatus.d.ts +9 -0
  138. package/dist/workflowContract.d.ts +91 -0
  139. package/package.json +1 -1
@@ -69,9 +69,133 @@ var __decorateElement = (array, flags, name, decorators, target, extra) => {
69
69
  return k || __decoratorMetadata(array, target), desc && __defProp(target, name, desc), p ? k ^ 4 ? extra : desc : target;
70
70
  };
71
71
 
72
- // src/angular/voice-stream.service.ts
72
+ // src/angular/voice-app-kit-status.service.ts
73
73
  import { computed, Injectable, signal } from "@angular/core";
74
74
 
75
+ // src/client/appKitStatus.ts
76
+ var fetchVoiceAppKitStatus = async (path = "/app-kit/status", options = {}) => {
77
+ const fetchImpl = options.fetch ?? globalThis.fetch;
78
+ const response = await fetchImpl(path);
79
+ if (!response.ok) {
80
+ throw new Error(`Voice app kit status failed: HTTP ${response.status}`);
81
+ }
82
+ return await response.json();
83
+ };
84
+ var createVoiceAppKitStatusStore = (path = "/app-kit/status", options = {}) => {
85
+ const listeners = new Set;
86
+ let closed = false;
87
+ let timer;
88
+ let snapshot = {
89
+ error: null,
90
+ isLoading: false
91
+ };
92
+ const emit = () => {
93
+ for (const listener of listeners) {
94
+ listener();
95
+ }
96
+ };
97
+ const refresh = async () => {
98
+ if (closed) {
99
+ return snapshot.report;
100
+ }
101
+ snapshot = {
102
+ ...snapshot,
103
+ error: null,
104
+ isLoading: true
105
+ };
106
+ emit();
107
+ try {
108
+ const report = await fetchVoiceAppKitStatus(path, options);
109
+ snapshot = {
110
+ error: null,
111
+ isLoading: false,
112
+ report,
113
+ updatedAt: Date.now()
114
+ };
115
+ emit();
116
+ return report;
117
+ } catch (error) {
118
+ snapshot = {
119
+ ...snapshot,
120
+ error: error instanceof Error ? error.message : String(error),
121
+ isLoading: false
122
+ };
123
+ emit();
124
+ throw error;
125
+ }
126
+ };
127
+ const close = () => {
128
+ closed = true;
129
+ if (timer) {
130
+ clearInterval(timer);
131
+ timer = undefined;
132
+ }
133
+ listeners.clear();
134
+ };
135
+ if (typeof window !== "undefined" && options.intervalMs && options.intervalMs > 0) {
136
+ timer = setInterval(() => {
137
+ refresh().catch(() => {});
138
+ }, options.intervalMs);
139
+ }
140
+ return {
141
+ close,
142
+ getServerSnapshot: () => snapshot,
143
+ getSnapshot: () => snapshot,
144
+ refresh,
145
+ subscribe: (listener) => {
146
+ listeners.add(listener);
147
+ return () => {
148
+ listeners.delete(listener);
149
+ };
150
+ }
151
+ };
152
+ };
153
+
154
+ // src/angular/voice-app-kit-status.service.ts
155
+ var _dec = [
156
+ Injectable({ providedIn: "root" })
157
+ ];
158
+ var _init = __decoratorStart(undefined);
159
+
160
+ class VoiceAppKitStatusService {
161
+ connect(path = "/app-kit/status", options = {}) {
162
+ const store = createVoiceAppKitStatusStore(path, options);
163
+ const errorSignal = signal(null);
164
+ const isLoadingSignal = signal(false);
165
+ const reportSignal = signal(undefined);
166
+ const updatedAtSignal = signal(undefined);
167
+ const sync = () => {
168
+ const snapshot = store.getSnapshot();
169
+ errorSignal.set(snapshot.error);
170
+ isLoadingSignal.set(snapshot.isLoading);
171
+ reportSignal.set(snapshot.report);
172
+ updatedAtSignal.set(snapshot.updatedAt);
173
+ };
174
+ const unsubscribe = store.subscribe(sync);
175
+ sync();
176
+ if (typeof window !== "undefined") {
177
+ store.refresh().catch(() => {});
178
+ }
179
+ return {
180
+ close: () => {
181
+ unsubscribe();
182
+ store.close();
183
+ },
184
+ error: computed(() => errorSignal()),
185
+ isLoading: computed(() => isLoadingSignal()),
186
+ refresh: store.refresh,
187
+ report: computed(() => reportSignal()),
188
+ updatedAt: computed(() => updatedAtSignal())
189
+ };
190
+ }
191
+ }
192
+ VoiceAppKitStatusService = __decorateElement(_init, 0, "VoiceAppKitStatusService", _dec, VoiceAppKitStatusService);
193
+ __runInitializers(_init, 1, VoiceAppKitStatusService);
194
+ __decoratorMetadata(_init, VoiceAppKitStatusService);
195
+ let _VoiceAppKitStatusService = VoiceAppKitStatusService;
196
+ // src/angular/voice-stream.service.ts
197
+ import { computed as computed2, Injectable as Injectable2, signal as signal2 } from "@angular/core";
198
+
75
199
  // src/client/actions.ts
76
200
  var normalizeErrorMessage = (value) => {
77
201
  if (typeof value === "string" && value.trim()) {
@@ -120,6 +244,12 @@ var serverMessageToAction = (message) => {
120
244
  sessionId: message.sessionId,
121
245
  type: "complete"
122
246
  };
247
+ case "call_lifecycle":
248
+ return {
249
+ event: message.event,
250
+ sessionId: message.sessionId,
251
+ type: "call_lifecycle"
252
+ };
123
253
  case "error":
124
254
  return {
125
255
  message: normalizeErrorMessage(message.message),
@@ -163,7 +293,7 @@ var DEFAULT_SCENARIO_QUERY_PARAM = "scenarioId";
163
293
  var noop = () => {};
164
294
  var noopUnsubscribe = () => noop;
165
295
  var NOOP_CONNECTION = {
166
- start: () => {},
296
+ callControl: noop,
167
297
  close: noop,
168
298
  endTurn: noop,
169
299
  getReadyState: () => WS_CLOSED,
@@ -171,6 +301,7 @@ var NOOP_CONNECTION = {
171
301
  getSessionId: () => "",
172
302
  send: noop,
173
303
  sendAudio: noop,
304
+ start: () => {},
174
305
  subscribe: noopUnsubscribe
175
306
  };
176
307
  var createSessionId = () => crypto.randomUUID();
@@ -192,6 +323,7 @@ var isVoiceServerMessage = (value) => {
192
323
  switch (value.type) {
193
324
  case "audio":
194
325
  case "assistant":
326
+ case "call_lifecycle":
195
327
  case "complete":
196
328
  case "error":
197
329
  case "final":
@@ -332,6 +464,12 @@ var createVoiceConnection = (path, options = {}) => {
332
464
  const endTurn = () => {
333
465
  send({ type: "end_turn" });
334
466
  };
467
+ const callControl = (message) => {
468
+ send({
469
+ ...message,
470
+ type: "call_control"
471
+ });
472
+ };
335
473
  const close = () => {
336
474
  clearTimers();
337
475
  if (state.ws) {
@@ -349,7 +487,7 @@ var createVoiceConnection = (path, options = {}) => {
349
487
  };
350
488
  connect();
351
489
  return {
352
- start,
490
+ callControl,
353
491
  close,
354
492
  endTurn,
355
493
  getReadyState: () => state.ws?.readyState ?? WS_CLOSED,
@@ -357,6 +495,7 @@ var createVoiceConnection = (path, options = {}) => {
357
495
  getSessionId: () => state.sessionId,
358
496
  send,
359
497
  sendAudio,
498
+ start,
360
499
  subscribe
361
500
  };
362
501
  };
@@ -365,6 +504,7 @@ var createVoiceConnection = (path, options = {}) => {
365
504
  var createInitialState = () => ({
366
505
  assistantAudio: [],
367
506
  assistantTexts: [],
507
+ call: null,
368
508
  error: null,
369
509
  isConnected: false,
370
510
  scenarioId: null,
@@ -408,6 +548,20 @@ var createVoiceStreamStore = () => {
408
548
  status: "completed"
409
549
  };
410
550
  break;
551
+ case "call_lifecycle":
552
+ state = {
553
+ ...state,
554
+ call: {
555
+ ...state.call,
556
+ disposition: action.event.type === "end" ? action.event.disposition : state.call?.disposition,
557
+ endedAt: action.event.type === "end" ? action.event.at : state.call?.endedAt,
558
+ events: [...state.call?.events ?? [], action.event],
559
+ lastEventAt: action.event.at,
560
+ startedAt: state.call?.startedAt ?? action.event.at
561
+ },
562
+ sessionId: action.sessionId
563
+ };
564
+ break;
411
565
  case "connected":
412
566
  state = {
413
567
  ...state,
@@ -494,6 +648,9 @@ var createVoiceStream = (path, options = {}) => {
494
648
  }
495
649
  });
496
650
  return {
651
+ callControl(message) {
652
+ connection.callControl(message);
653
+ },
497
654
  close() {
498
655
  unsubscribeConnection();
499
656
  connection.close();
@@ -537,6 +694,9 @@ var createVoiceStream = (path, options = {}) => {
537
694
  get assistantAudio() {
538
695
  return store.getSnapshot().assistantAudio;
539
696
  },
697
+ get call() {
698
+ return store.getSnapshot().call;
699
+ },
540
700
  sendAudio(audio) {
541
701
  connection.sendAudio(audio);
542
702
  },
@@ -551,24 +711,26 @@ var createVoiceStream = (path, options = {}) => {
551
711
 
552
712
  // src/angular/voice-stream.service.ts
553
713
  var _dec = [
554
- Injectable({ providedIn: "root" })
714
+ Injectable2({ providedIn: "root" })
555
715
  ];
556
716
  var _init = __decoratorStart(undefined);
557
717
 
558
718
  class VoiceStreamService {
559
719
  connect(path, options = {}) {
560
720
  const stream = createVoiceStream(path, options);
561
- const assistantAudioSignal = signal([]);
562
- const assistantTextsSignal = signal([]);
563
- const errorSignal = signal(null);
564
- const isConnectedSignal = signal(false);
565
- const partialSignal = signal("");
566
- const sessionIdSignal = signal(stream.sessionId);
567
- const statusSignal = signal(stream.status);
568
- const turnsSignal = signal([]);
721
+ const assistantAudioSignal = signal2([]);
722
+ const assistantTextsSignal = signal2([]);
723
+ const callSignal = signal2(null);
724
+ const errorSignal = signal2(null);
725
+ const isConnectedSignal = signal2(false);
726
+ const partialSignal = signal2("");
727
+ const sessionIdSignal = signal2(stream.sessionId);
728
+ const statusSignal = signal2(stream.status);
729
+ const turnsSignal = signal2([]);
569
730
  const sync = () => {
570
731
  assistantAudioSignal.set([...stream.assistantAudio]);
571
732
  assistantTextsSignal.set([...stream.assistantTexts]);
733
+ callSignal.set(stream.call);
572
734
  errorSignal.set(stream.error);
573
735
  isConnectedSignal.set(stream.isConnected);
574
736
  partialSignal.set(stream.partial);
@@ -579,20 +741,22 @@ class VoiceStreamService {
579
741
  const unsubscribe = stream.subscribe(sync);
580
742
  sync();
581
743
  return {
582
- assistantAudio: computed(() => assistantAudioSignal()),
583
- assistantTexts: computed(() => assistantTextsSignal()),
744
+ assistantAudio: computed2(() => assistantAudioSignal()),
745
+ assistantTexts: computed2(() => assistantTextsSignal()),
746
+ call: computed2(() => callSignal()),
747
+ callControl: (message) => stream.callControl(message),
584
748
  close: () => {
585
749
  unsubscribe();
586
750
  stream.close();
587
751
  },
588
752
  endTurn: () => stream.endTurn(),
589
- error: computed(() => errorSignal()),
590
- isConnected: computed(() => isConnectedSignal()),
591
- partial: computed(() => partialSignal()),
753
+ error: computed2(() => errorSignal()),
754
+ isConnected: computed2(() => isConnectedSignal()),
755
+ partial: computed2(() => partialSignal()),
592
756
  sendAudio: (audio) => stream.sendAudio(audio),
593
- sessionId: computed(() => sessionIdSignal()),
594
- status: computed(() => statusSignal()),
595
- turns: computed(() => turnsSignal())
757
+ sessionId: computed2(() => sessionIdSignal()),
758
+ status: computed2(() => statusSignal()),
759
+ turns: computed2(() => turnsSignal())
596
760
  };
597
761
  }
598
762
  }
@@ -601,7 +765,7 @@ __runInitializers(_init, 1, VoiceStreamService);
601
765
  __decoratorMetadata(_init, VoiceStreamService);
602
766
  let _VoiceStreamService = VoiceStreamService;
603
767
  // src/angular/voice-controller.service.ts
604
- import { computed as computed2, Injectable as Injectable2, signal as signal2 } from "@angular/core";
768
+ import { computed as computed3, Injectable as Injectable3, signal as signal3 } from "@angular/core";
605
769
 
606
770
  // src/client/htmx.ts
607
771
  var DEFAULT_EVENT_NAME = "voice-refresh";
@@ -1065,6 +1229,7 @@ var resolveVoiceRuntimePreset = (name = "default") => {
1065
1229
  var createInitialState2 = (stream) => ({
1066
1230
  assistantAudio: [...stream.assistantAudio],
1067
1231
  assistantTexts: [...stream.assistantTexts],
1232
+ call: stream.call,
1068
1233
  error: stream.error,
1069
1234
  isConnected: stream.isConnected,
1070
1235
  isRecording: false,
@@ -1094,6 +1259,7 @@ var createVoiceController = (path, options = {}) => {
1094
1259
  ...state,
1095
1260
  assistantAudio: [...stream.assistantAudio],
1096
1261
  assistantTexts: [...stream.assistantTexts],
1262
+ call: stream.call,
1097
1263
  error: stream.error,
1098
1264
  isConnected: stream.isConnected,
1099
1265
  partial: stream.partial,
@@ -1121,7 +1287,13 @@ var createVoiceController = (path, options = {}) => {
1121
1287
  capture = createMicrophoneCapture({
1122
1288
  channelCount: options.capture?.channelCount ?? preset.capture.channelCount,
1123
1289
  onLevel: options.capture?.onLevel,
1124
- onAudio: (audio) => stream.sendAudio(audio),
1290
+ onAudio: (audio) => {
1291
+ if (options.capture?.onAudio) {
1292
+ options.capture.onAudio(audio, stream.sendAudio);
1293
+ return;
1294
+ }
1295
+ stream.sendAudio(audio);
1296
+ },
1125
1297
  sampleRateHz: options.capture?.sampleRateHz ?? preset.capture.sampleRateHz
1126
1298
  });
1127
1299
  return capture;
@@ -1171,6 +1343,7 @@ var createVoiceController = (path, options = {}) => {
1171
1343
  bindHTMX(bindingOptions) {
1172
1344
  return bindVoiceHTMX(stream, bindingOptions);
1173
1345
  },
1346
+ callControl: (message) => stream.callControl(message),
1174
1347
  close,
1175
1348
  endTurn: () => stream.endTurn(),
1176
1349
  get error() {
@@ -1223,29 +1396,32 @@ var createVoiceController = (path, options = {}) => {
1223
1396
  },
1224
1397
  get assistantAudio() {
1225
1398
  return state.assistantAudio;
1399
+ },
1400
+ get call() {
1401
+ return state.call;
1226
1402
  }
1227
1403
  };
1228
1404
  };
1229
1405
 
1230
1406
  // src/angular/voice-controller.service.ts
1231
1407
  var _dec = [
1232
- Injectable2({ providedIn: "root" })
1408
+ Injectable3({ providedIn: "root" })
1233
1409
  ];
1234
1410
  var _init = __decoratorStart(undefined);
1235
1411
 
1236
1412
  class VoiceControllerService {
1237
1413
  connect(path, options = {}) {
1238
1414
  const controller = createVoiceController(path, options);
1239
- const assistantAudioSignal = signal2([]);
1240
- const assistantTextsSignal = signal2([]);
1241
- const errorSignal = signal2(null);
1242
- const isConnectedSignal = signal2(false);
1243
- const isRecordingSignal = signal2(false);
1244
- const partialSignal = signal2("");
1245
- const recordingErrorSignal = signal2(null);
1246
- const sessionIdSignal = signal2(controller.sessionId);
1247
- const statusSignal = signal2(controller.status);
1248
- const turnsSignal = signal2([]);
1415
+ const assistantAudioSignal = signal3([]);
1416
+ const assistantTextsSignal = signal3([]);
1417
+ const errorSignal = signal3(null);
1418
+ const isConnectedSignal = signal3(false);
1419
+ const isRecordingSignal = signal3(false);
1420
+ const partialSignal = signal3("");
1421
+ const recordingErrorSignal = signal3(null);
1422
+ const sessionIdSignal = signal3(controller.sessionId);
1423
+ const statusSignal = signal3(controller.status);
1424
+ const turnsSignal = signal3([]);
1249
1425
  const sync = () => {
1250
1426
  assistantAudioSignal.set([...controller.assistantAudio]);
1251
1427
  assistantTextsSignal.set([...controller.assistantTexts]);
@@ -1261,26 +1437,26 @@ class VoiceControllerService {
1261
1437
  const unsubscribe = controller.subscribe(sync);
1262
1438
  sync();
1263
1439
  return {
1264
- assistantAudio: computed2(() => assistantAudioSignal()),
1265
- assistantTexts: computed2(() => assistantTextsSignal()),
1440
+ assistantAudio: computed3(() => assistantAudioSignal()),
1441
+ assistantTexts: computed3(() => assistantTextsSignal()),
1266
1442
  bindHTMX: controller.bindHTMX,
1267
1443
  close: () => {
1268
1444
  unsubscribe();
1269
1445
  controller.close();
1270
1446
  },
1271
1447
  endTurn: () => controller.endTurn(),
1272
- error: computed2(() => errorSignal()),
1273
- isConnected: computed2(() => isConnectedSignal()),
1274
- isRecording: computed2(() => isRecordingSignal()),
1275
- partial: computed2(() => partialSignal()),
1276
- recordingError: computed2(() => recordingErrorSignal()),
1448
+ error: computed3(() => errorSignal()),
1449
+ isConnected: computed3(() => isConnectedSignal()),
1450
+ isRecording: computed3(() => isRecordingSignal()),
1451
+ partial: computed3(() => partialSignal()),
1452
+ recordingError: computed3(() => recordingErrorSignal()),
1277
1453
  sendAudio: (audio) => controller.sendAudio(audio),
1278
- sessionId: computed2(() => sessionIdSignal()),
1454
+ sessionId: computed3(() => sessionIdSignal()),
1279
1455
  startRecording: () => controller.startRecording(),
1280
- status: computed2(() => statusSignal()),
1456
+ status: computed3(() => statusSignal()),
1281
1457
  stopRecording: () => controller.stopRecording(),
1282
1458
  toggleRecording: () => controller.toggleRecording(),
1283
- turns: computed2(() => turnsSignal())
1459
+ turns: computed3(() => turnsSignal())
1284
1460
  };
1285
1461
  }
1286
1462
  }
@@ -1288,7 +1464,899 @@ VoiceControllerService = __decorateElement(_init, 0, "VoiceControllerService", _
1288
1464
  __runInitializers(_init, 1, VoiceControllerService);
1289
1465
  __decoratorMetadata(_init, VoiceControllerService);
1290
1466
  let _VoiceControllerService = VoiceControllerService;
1467
+ // src/angular/voice-provider-capabilities.service.ts
1468
+ import { computed as computed4, Injectable as Injectable4, signal as signal4 } from "@angular/core";
1469
+
1470
+ // src/client/providerCapabilities.ts
1471
+ var fetchVoiceProviderCapabilities = async (path = "/api/provider-capabilities", options = {}) => {
1472
+ const fetchImpl = options.fetch ?? globalThis.fetch;
1473
+ const response = await fetchImpl(path);
1474
+ if (!response.ok) {
1475
+ throw new Error(`Voice provider capabilities failed: HTTP ${response.status}`);
1476
+ }
1477
+ return await response.json();
1478
+ };
1479
+ var createVoiceProviderCapabilitiesStore = (path = "/api/provider-capabilities", options = {}) => {
1480
+ const listeners = new Set;
1481
+ let closed = false;
1482
+ let timer;
1483
+ let snapshot = {
1484
+ error: null,
1485
+ isLoading: false
1486
+ };
1487
+ const emit = () => {
1488
+ for (const listener of listeners) {
1489
+ listener();
1490
+ }
1491
+ };
1492
+ const refresh = async () => {
1493
+ if (closed) {
1494
+ return snapshot.report;
1495
+ }
1496
+ snapshot = {
1497
+ ...snapshot,
1498
+ error: null,
1499
+ isLoading: true
1500
+ };
1501
+ emit();
1502
+ try {
1503
+ const report = await fetchVoiceProviderCapabilities(path, options);
1504
+ snapshot = {
1505
+ error: null,
1506
+ isLoading: false,
1507
+ report,
1508
+ updatedAt: Date.now()
1509
+ };
1510
+ emit();
1511
+ return report;
1512
+ } catch (error) {
1513
+ snapshot = {
1514
+ ...snapshot,
1515
+ error: error instanceof Error ? error.message : String(error),
1516
+ isLoading: false
1517
+ };
1518
+ emit();
1519
+ throw error;
1520
+ }
1521
+ };
1522
+ const close = () => {
1523
+ closed = true;
1524
+ if (timer) {
1525
+ clearInterval(timer);
1526
+ timer = undefined;
1527
+ }
1528
+ listeners.clear();
1529
+ };
1530
+ if (options.intervalMs && options.intervalMs > 0) {
1531
+ timer = setInterval(() => {
1532
+ refresh().catch(() => {});
1533
+ }, options.intervalMs);
1534
+ }
1535
+ return {
1536
+ close,
1537
+ getServerSnapshot: () => snapshot,
1538
+ getSnapshot: () => snapshot,
1539
+ refresh,
1540
+ subscribe: (listener) => {
1541
+ listeners.add(listener);
1542
+ return () => {
1543
+ listeners.delete(listener);
1544
+ };
1545
+ }
1546
+ };
1547
+ };
1548
+
1549
+ // src/angular/voice-provider-capabilities.service.ts
1550
+ var _dec = [
1551
+ Injectable4({ providedIn: "root" })
1552
+ ];
1553
+ var _init = __decoratorStart(undefined);
1554
+
1555
+ class VoiceProviderCapabilitiesService {
1556
+ connect(path = "/api/provider-capabilities", options = {}) {
1557
+ const store = createVoiceProviderCapabilitiesStore(path, options);
1558
+ const errorSignal = signal4(null);
1559
+ const isLoadingSignal = signal4(false);
1560
+ const reportSignal = signal4(undefined);
1561
+ const updatedAtSignal = signal4(undefined);
1562
+ const sync = () => {
1563
+ const snapshot = store.getSnapshot();
1564
+ errorSignal.set(snapshot.error);
1565
+ isLoadingSignal.set(snapshot.isLoading);
1566
+ reportSignal.set(snapshot.report);
1567
+ updatedAtSignal.set(snapshot.updatedAt);
1568
+ };
1569
+ const unsubscribe = store.subscribe(sync);
1570
+ sync();
1571
+ store.refresh().catch(() => {});
1572
+ return {
1573
+ close: () => {
1574
+ unsubscribe();
1575
+ store.close();
1576
+ },
1577
+ error: computed4(() => errorSignal()),
1578
+ isLoading: computed4(() => isLoadingSignal()),
1579
+ refresh: store.refresh,
1580
+ report: computed4(() => reportSignal()),
1581
+ updatedAt: computed4(() => updatedAtSignal())
1582
+ };
1583
+ }
1584
+ }
1585
+ VoiceProviderCapabilitiesService = __decorateElement(_init, 0, "VoiceProviderCapabilitiesService", _dec, VoiceProviderCapabilitiesService);
1586
+ __runInitializers(_init, 1, VoiceProviderCapabilitiesService);
1587
+ __decoratorMetadata(_init, VoiceProviderCapabilitiesService);
1588
+ let _VoiceProviderCapabilitiesService = VoiceProviderCapabilitiesService;
1589
+ // src/angular/voice-provider-status.service.ts
1590
+ import { computed as computed5, Injectable as Injectable5, signal as signal5 } from "@angular/core";
1591
+
1592
+ // src/client/providerStatus.ts
1593
+ var fetchVoiceProviderStatus = async (path = "/api/provider-status", options = {}) => {
1594
+ const fetchImpl = options.fetch ?? globalThis.fetch;
1595
+ const response = await fetchImpl(path);
1596
+ if (!response.ok) {
1597
+ throw new Error(`Voice provider status failed: HTTP ${response.status}`);
1598
+ }
1599
+ return await response.json();
1600
+ };
1601
+ var createVoiceProviderStatusStore = (path = "/api/provider-status", options = {}) => {
1602
+ const listeners = new Set;
1603
+ let closed = false;
1604
+ let timer;
1605
+ let snapshot = {
1606
+ error: null,
1607
+ isLoading: false,
1608
+ providers: []
1609
+ };
1610
+ const emit = () => {
1611
+ for (const listener of listeners) {
1612
+ listener();
1613
+ }
1614
+ };
1615
+ const refresh = async () => {
1616
+ if (closed) {
1617
+ return snapshot.providers;
1618
+ }
1619
+ snapshot = {
1620
+ ...snapshot,
1621
+ error: null,
1622
+ isLoading: true
1623
+ };
1624
+ emit();
1625
+ try {
1626
+ const providers = await fetchVoiceProviderStatus(path, options);
1627
+ snapshot = {
1628
+ error: null,
1629
+ isLoading: false,
1630
+ providers,
1631
+ updatedAt: Date.now()
1632
+ };
1633
+ emit();
1634
+ return providers;
1635
+ } catch (error) {
1636
+ snapshot = {
1637
+ ...snapshot,
1638
+ error: error instanceof Error ? error.message : String(error),
1639
+ isLoading: false
1640
+ };
1641
+ emit();
1642
+ throw error;
1643
+ }
1644
+ };
1645
+ const close = () => {
1646
+ closed = true;
1647
+ if (timer) {
1648
+ clearInterval(timer);
1649
+ timer = undefined;
1650
+ }
1651
+ listeners.clear();
1652
+ };
1653
+ if (options.intervalMs && options.intervalMs > 0) {
1654
+ timer = setInterval(() => {
1655
+ refresh().catch(() => {});
1656
+ }, options.intervalMs);
1657
+ }
1658
+ return {
1659
+ close,
1660
+ getServerSnapshot: () => snapshot,
1661
+ getSnapshot: () => snapshot,
1662
+ refresh,
1663
+ subscribe: (listener) => {
1664
+ listeners.add(listener);
1665
+ return () => {
1666
+ listeners.delete(listener);
1667
+ };
1668
+ }
1669
+ };
1670
+ };
1671
+
1672
+ // src/angular/voice-provider-status.service.ts
1673
+ var _dec = [
1674
+ Injectable5({ providedIn: "root" })
1675
+ ];
1676
+ var _init = __decoratorStart(undefined);
1677
+
1678
+ class VoiceProviderStatusService {
1679
+ connect(path = "/api/provider-status", options = {}) {
1680
+ const store = createVoiceProviderStatusStore(path, options);
1681
+ const errorSignal = signal5(null);
1682
+ const isLoadingSignal = signal5(false);
1683
+ const providersSignal = signal5([]);
1684
+ const updatedAtSignal = signal5(undefined);
1685
+ const sync = () => {
1686
+ const snapshot = store.getSnapshot();
1687
+ errorSignal.set(snapshot.error);
1688
+ isLoadingSignal.set(snapshot.isLoading);
1689
+ providersSignal.set([...snapshot.providers]);
1690
+ updatedAtSignal.set(snapshot.updatedAt);
1691
+ };
1692
+ const unsubscribe = store.subscribe(sync);
1693
+ sync();
1694
+ store.refresh().catch(() => {});
1695
+ return {
1696
+ close: () => {
1697
+ unsubscribe();
1698
+ store.close();
1699
+ },
1700
+ error: computed5(() => errorSignal()),
1701
+ isLoading: computed5(() => isLoadingSignal()),
1702
+ providers: computed5(() => providersSignal()),
1703
+ refresh: store.refresh,
1704
+ updatedAt: computed5(() => updatedAtSignal())
1705
+ };
1706
+ }
1707
+ }
1708
+ VoiceProviderStatusService = __decorateElement(_init, 0, "VoiceProviderStatusService", _dec, VoiceProviderStatusService);
1709
+ __runInitializers(_init, 1, VoiceProviderStatusService);
1710
+ __decoratorMetadata(_init, VoiceProviderStatusService);
1711
+ let _VoiceProviderStatusService = VoiceProviderStatusService;
1712
+ // src/angular/voice-routing-status.service.ts
1713
+ import { Injectable as Injectable6, signal as signal6 } from "@angular/core";
1714
+
1715
+ // src/client/routingStatus.ts
1716
+ var fetchVoiceRoutingStatus = async (path = "/api/routing/latest", options = {}) => {
1717
+ const fetchImpl = options.fetch ?? globalThis.fetch;
1718
+ const response = await fetchImpl(path);
1719
+ if (!response.ok) {
1720
+ throw new Error(`Voice routing status failed: HTTP ${response.status}`);
1721
+ }
1722
+ return await response.json();
1723
+ };
1724
+ var createVoiceRoutingStatusStore = (path = "/api/routing/latest", options = {}) => {
1725
+ const listeners = new Set;
1726
+ let closed = false;
1727
+ let timer;
1728
+ let snapshot = {
1729
+ decision: null,
1730
+ error: null,
1731
+ isLoading: false
1732
+ };
1733
+ const emit = () => {
1734
+ for (const listener of listeners) {
1735
+ listener();
1736
+ }
1737
+ };
1738
+ const refresh = async () => {
1739
+ if (closed) {
1740
+ return snapshot.decision;
1741
+ }
1742
+ snapshot = {
1743
+ ...snapshot,
1744
+ error: null,
1745
+ isLoading: true
1746
+ };
1747
+ emit();
1748
+ try {
1749
+ const decision = await fetchVoiceRoutingStatus(path, options);
1750
+ snapshot = {
1751
+ decision,
1752
+ error: null,
1753
+ isLoading: false,
1754
+ updatedAt: Date.now()
1755
+ };
1756
+ emit();
1757
+ return decision;
1758
+ } catch (error) {
1759
+ snapshot = {
1760
+ ...snapshot,
1761
+ error: error instanceof Error ? error.message : String(error),
1762
+ isLoading: false
1763
+ };
1764
+ emit();
1765
+ throw error;
1766
+ }
1767
+ };
1768
+ const close = () => {
1769
+ closed = true;
1770
+ if (timer) {
1771
+ clearInterval(timer);
1772
+ timer = undefined;
1773
+ }
1774
+ listeners.clear();
1775
+ };
1776
+ if (options.intervalMs && options.intervalMs > 0) {
1777
+ timer = setInterval(() => {
1778
+ refresh().catch(() => {});
1779
+ }, options.intervalMs);
1780
+ }
1781
+ return {
1782
+ close,
1783
+ getServerSnapshot: () => snapshot,
1784
+ getSnapshot: () => snapshot,
1785
+ refresh,
1786
+ subscribe: (listener) => {
1787
+ listeners.add(listener);
1788
+ return () => {
1789
+ listeners.delete(listener);
1790
+ };
1791
+ }
1792
+ };
1793
+ };
1794
+
1795
+ // src/angular/voice-routing-status.service.ts
1796
+ var _dec = [
1797
+ Injectable6({ providedIn: "root" })
1798
+ ];
1799
+ var _init = __decoratorStart(undefined);
1800
+
1801
+ class VoiceRoutingStatusService {
1802
+ connect(path = "/api/routing/latest", options = {}) {
1803
+ const store = createVoiceRoutingStatusStore(path, options);
1804
+ const decisionSignal = signal6(null);
1805
+ const errorSignal = signal6(null);
1806
+ const isLoadingSignal = signal6(false);
1807
+ const updatedAtSignal = signal6(undefined);
1808
+ const sync = () => {
1809
+ const snapshot = store.getSnapshot();
1810
+ decisionSignal.set(snapshot.decision);
1811
+ errorSignal.set(snapshot.error);
1812
+ isLoadingSignal.set(snapshot.isLoading);
1813
+ updatedAtSignal.set(snapshot.updatedAt);
1814
+ };
1815
+ const unsubscribe = store.subscribe(sync);
1816
+ sync();
1817
+ store.refresh().catch(() => {});
1818
+ return {
1819
+ close: () => {
1820
+ unsubscribe();
1821
+ store.close();
1822
+ },
1823
+ decision: decisionSignal.asReadonly(),
1824
+ error: errorSignal.asReadonly(),
1825
+ isLoading: isLoadingSignal.asReadonly(),
1826
+ refresh: store.refresh,
1827
+ updatedAt: updatedAtSignal.asReadonly()
1828
+ };
1829
+ }
1830
+ }
1831
+ VoiceRoutingStatusService = __decorateElement(_init, 0, "VoiceRoutingStatusService", _dec, VoiceRoutingStatusService);
1832
+ __runInitializers(_init, 1, VoiceRoutingStatusService);
1833
+ __decoratorMetadata(_init, VoiceRoutingStatusService);
1834
+ let _VoiceRoutingStatusService = VoiceRoutingStatusService;
1835
+ // src/angular/voice-trace-timeline.service.ts
1836
+ import { computed as computed6, Injectable as Injectable7, signal as signal7 } from "@angular/core";
1837
+
1838
+ // src/client/traceTimeline.ts
1839
+ var fetchVoiceTraceTimeline = async (path = "/api/voice-traces", options = {}) => {
1840
+ const fetchImpl = options.fetch ?? globalThis.fetch;
1841
+ const response = await fetchImpl(path);
1842
+ if (!response.ok) {
1843
+ throw new Error(`Voice trace timeline failed: HTTP ${response.status}`);
1844
+ }
1845
+ return await response.json();
1846
+ };
1847
+ var createVoiceTraceTimelineStore = (path = "/api/voice-traces", options = {}) => {
1848
+ const listeners = new Set;
1849
+ let closed = false;
1850
+ let timer;
1851
+ let snapshot = {
1852
+ error: null,
1853
+ isLoading: false,
1854
+ report: null
1855
+ };
1856
+ const emit = () => {
1857
+ for (const listener of listeners) {
1858
+ listener();
1859
+ }
1860
+ };
1861
+ const refresh = async () => {
1862
+ if (closed) {
1863
+ return snapshot.report;
1864
+ }
1865
+ snapshot = {
1866
+ ...snapshot,
1867
+ error: null,
1868
+ isLoading: true
1869
+ };
1870
+ emit();
1871
+ try {
1872
+ const report = await fetchVoiceTraceTimeline(path, options);
1873
+ snapshot = {
1874
+ error: null,
1875
+ isLoading: false,
1876
+ report,
1877
+ updatedAt: Date.now()
1878
+ };
1879
+ emit();
1880
+ return report;
1881
+ } catch (error) {
1882
+ snapshot = {
1883
+ ...snapshot,
1884
+ error: error instanceof Error ? error.message : String(error),
1885
+ isLoading: false
1886
+ };
1887
+ emit();
1888
+ throw error;
1889
+ }
1890
+ };
1891
+ const close = () => {
1892
+ closed = true;
1893
+ if (timer) {
1894
+ clearInterval(timer);
1895
+ timer = undefined;
1896
+ }
1897
+ listeners.clear();
1898
+ };
1899
+ if (options.intervalMs && options.intervalMs > 0) {
1900
+ timer = setInterval(() => {
1901
+ refresh().catch(() => {});
1902
+ }, options.intervalMs);
1903
+ }
1904
+ return {
1905
+ close,
1906
+ getServerSnapshot: () => snapshot,
1907
+ getSnapshot: () => snapshot,
1908
+ refresh,
1909
+ subscribe: (listener) => {
1910
+ listeners.add(listener);
1911
+ return () => {
1912
+ listeners.delete(listener);
1913
+ };
1914
+ }
1915
+ };
1916
+ };
1917
+
1918
+ // src/angular/voice-trace-timeline.service.ts
1919
+ var _dec = [
1920
+ Injectable7({ providedIn: "root" })
1921
+ ];
1922
+ var _init = __decoratorStart(undefined);
1923
+
1924
+ class VoiceTraceTimelineService {
1925
+ connect(path = "/api/voice-traces", options = {}) {
1926
+ const store = createVoiceTraceTimelineStore(path, options);
1927
+ const errorSignal = signal7(null);
1928
+ const isLoadingSignal = signal7(false);
1929
+ const reportSignal = signal7(null);
1930
+ const updatedAtSignal = signal7(undefined);
1931
+ const sync = () => {
1932
+ const snapshot = store.getSnapshot();
1933
+ errorSignal.set(snapshot.error);
1934
+ isLoadingSignal.set(snapshot.isLoading);
1935
+ reportSignal.set(snapshot.report);
1936
+ updatedAtSignal.set(snapshot.updatedAt);
1937
+ };
1938
+ const unsubscribe = store.subscribe(sync);
1939
+ sync();
1940
+ store.refresh().catch(() => {});
1941
+ return {
1942
+ close: () => {
1943
+ unsubscribe();
1944
+ store.close();
1945
+ },
1946
+ error: computed6(() => errorSignal()),
1947
+ isLoading: computed6(() => isLoadingSignal()),
1948
+ refresh: store.refresh,
1949
+ report: computed6(() => reportSignal()),
1950
+ updatedAt: computed6(() => updatedAtSignal())
1951
+ };
1952
+ }
1953
+ }
1954
+ VoiceTraceTimelineService = __decorateElement(_init, 0, "VoiceTraceTimelineService", _dec, VoiceTraceTimelineService);
1955
+ __runInitializers(_init, 1, VoiceTraceTimelineService);
1956
+ __decoratorMetadata(_init, VoiceTraceTimelineService);
1957
+ let _VoiceTraceTimelineService = VoiceTraceTimelineService;
1958
+ // src/angular/voice-turn-latency.service.ts
1959
+ import { computed as computed7, Injectable as Injectable8, signal as signal8 } from "@angular/core";
1960
+
1961
+ // src/client/turnLatency.ts
1962
+ var fetchVoiceTurnLatency = async (path = "/api/turn-latency", options = {}) => {
1963
+ const fetchImpl = options.fetch ?? globalThis.fetch;
1964
+ const response = await fetchImpl(path);
1965
+ if (!response.ok) {
1966
+ throw new Error(`Voice turn latency failed: HTTP ${response.status}`);
1967
+ }
1968
+ return await response.json();
1969
+ };
1970
+ var runVoiceTurnLatencyProof = async (path, options = {}) => {
1971
+ const fetchImpl = options.fetch ?? globalThis.fetch;
1972
+ const response = await fetchImpl(path, { method: "POST" });
1973
+ if (!response.ok) {
1974
+ throw new Error(`Voice turn latency proof failed: HTTP ${response.status}`);
1975
+ }
1976
+ return response.json();
1977
+ };
1978
+ var createVoiceTurnLatencyStore = (path = "/api/turn-latency", options = {}) => {
1979
+ const listeners = new Set;
1980
+ let closed = false;
1981
+ let timer;
1982
+ let snapshot = {
1983
+ error: null,
1984
+ isLoading: false
1985
+ };
1986
+ const emit = () => {
1987
+ for (const listener of listeners) {
1988
+ listener();
1989
+ }
1990
+ };
1991
+ const refresh = async () => {
1992
+ if (closed) {
1993
+ return snapshot.report;
1994
+ }
1995
+ snapshot = { ...snapshot, error: null, isLoading: true };
1996
+ emit();
1997
+ try {
1998
+ const report = await fetchVoiceTurnLatency(path, options);
1999
+ snapshot = {
2000
+ error: null,
2001
+ isLoading: false,
2002
+ report,
2003
+ updatedAt: Date.now()
2004
+ };
2005
+ emit();
2006
+ return report;
2007
+ } catch (error) {
2008
+ snapshot = {
2009
+ ...snapshot,
2010
+ error: error instanceof Error ? error.message : String(error),
2011
+ isLoading: false
2012
+ };
2013
+ emit();
2014
+ throw error;
2015
+ }
2016
+ };
2017
+ const runProof = async () => {
2018
+ if (!options.proofPath) {
2019
+ throw new Error("Voice turn latency proof path is not configured.");
2020
+ }
2021
+ snapshot = { ...snapshot, error: null, isLoading: true };
2022
+ emit();
2023
+ try {
2024
+ await runVoiceTurnLatencyProof(options.proofPath, options);
2025
+ return await refresh();
2026
+ } catch (error) {
2027
+ snapshot = {
2028
+ ...snapshot,
2029
+ error: error instanceof Error ? error.message : String(error),
2030
+ isLoading: false
2031
+ };
2032
+ emit();
2033
+ throw error;
2034
+ }
2035
+ };
2036
+ const close = () => {
2037
+ closed = true;
2038
+ if (timer) {
2039
+ clearInterval(timer);
2040
+ timer = undefined;
2041
+ }
2042
+ listeners.clear();
2043
+ };
2044
+ if (options.intervalMs && options.intervalMs > 0) {
2045
+ timer = setInterval(() => {
2046
+ refresh().catch(() => {});
2047
+ }, options.intervalMs);
2048
+ }
2049
+ return {
2050
+ close,
2051
+ getServerSnapshot: () => snapshot,
2052
+ getSnapshot: () => snapshot,
2053
+ refresh,
2054
+ runProof,
2055
+ subscribe: (listener) => {
2056
+ listeners.add(listener);
2057
+ return () => {
2058
+ listeners.delete(listener);
2059
+ };
2060
+ }
2061
+ };
2062
+ };
2063
+
2064
+ // src/angular/voice-turn-latency.service.ts
2065
+ var _dec = [
2066
+ Injectable8({ providedIn: "root" })
2067
+ ];
2068
+ var _init = __decoratorStart(undefined);
2069
+
2070
+ class VoiceTurnLatencyService {
2071
+ connect(path = "/api/turn-latency", options = {}) {
2072
+ const store = createVoiceTurnLatencyStore(path, options);
2073
+ const errorSignal = signal8(null);
2074
+ const isLoadingSignal = signal8(false);
2075
+ const reportSignal = signal8(undefined);
2076
+ const updatedAtSignal = signal8(undefined);
2077
+ const sync = () => {
2078
+ const snapshot = store.getSnapshot();
2079
+ errorSignal.set(snapshot.error);
2080
+ isLoadingSignal.set(snapshot.isLoading);
2081
+ reportSignal.set(snapshot.report);
2082
+ updatedAtSignal.set(snapshot.updatedAt);
2083
+ };
2084
+ const unsubscribe = store.subscribe(sync);
2085
+ sync();
2086
+ store.refresh().catch(() => {});
2087
+ return {
2088
+ close: () => {
2089
+ unsubscribe();
2090
+ store.close();
2091
+ },
2092
+ error: computed7(() => errorSignal()),
2093
+ isLoading: computed7(() => isLoadingSignal()),
2094
+ refresh: store.refresh,
2095
+ report: computed7(() => reportSignal()),
2096
+ runProof: store.runProof,
2097
+ updatedAt: computed7(() => updatedAtSignal())
2098
+ };
2099
+ }
2100
+ }
2101
+ VoiceTurnLatencyService = __decorateElement(_init, 0, "VoiceTurnLatencyService", _dec, VoiceTurnLatencyService);
2102
+ __runInitializers(_init, 1, VoiceTurnLatencyService);
2103
+ __decoratorMetadata(_init, VoiceTurnLatencyService);
2104
+ let _VoiceTurnLatencyService = VoiceTurnLatencyService;
2105
+ // src/angular/voice-turn-quality.service.ts
2106
+ import { computed as computed8, Injectable as Injectable9, signal as signal9 } from "@angular/core";
2107
+
2108
+ // src/client/turnQuality.ts
2109
+ var fetchVoiceTurnQuality = async (path = "/api/turn-quality", options = {}) => {
2110
+ const fetchImpl = options.fetch ?? globalThis.fetch;
2111
+ const response = await fetchImpl(path);
2112
+ if (!response.ok) {
2113
+ throw new Error(`Voice turn quality failed: HTTP ${response.status}`);
2114
+ }
2115
+ return await response.json();
2116
+ };
2117
+ var createVoiceTurnQualityStore = (path = "/api/turn-quality", options = {}) => {
2118
+ const listeners = new Set;
2119
+ let closed = false;
2120
+ let timer;
2121
+ let snapshot = {
2122
+ error: null,
2123
+ isLoading: false
2124
+ };
2125
+ const emit = () => {
2126
+ for (const listener of listeners) {
2127
+ listener();
2128
+ }
2129
+ };
2130
+ const refresh = async () => {
2131
+ if (closed) {
2132
+ return snapshot.report;
2133
+ }
2134
+ snapshot = {
2135
+ ...snapshot,
2136
+ error: null,
2137
+ isLoading: true
2138
+ };
2139
+ emit();
2140
+ try {
2141
+ const report = await fetchVoiceTurnQuality(path, options);
2142
+ snapshot = {
2143
+ error: null,
2144
+ isLoading: false,
2145
+ report,
2146
+ updatedAt: Date.now()
2147
+ };
2148
+ emit();
2149
+ return report;
2150
+ } catch (error) {
2151
+ snapshot = {
2152
+ ...snapshot,
2153
+ error: error instanceof Error ? error.message : String(error),
2154
+ isLoading: false
2155
+ };
2156
+ emit();
2157
+ throw error;
2158
+ }
2159
+ };
2160
+ const close = () => {
2161
+ closed = true;
2162
+ if (timer) {
2163
+ clearInterval(timer);
2164
+ timer = undefined;
2165
+ }
2166
+ listeners.clear();
2167
+ };
2168
+ if (options.intervalMs && options.intervalMs > 0) {
2169
+ timer = setInterval(() => {
2170
+ refresh().catch(() => {});
2171
+ }, options.intervalMs);
2172
+ }
2173
+ return {
2174
+ close,
2175
+ getServerSnapshot: () => snapshot,
2176
+ getSnapshot: () => snapshot,
2177
+ refresh,
2178
+ subscribe: (listener) => {
2179
+ listeners.add(listener);
2180
+ return () => {
2181
+ listeners.delete(listener);
2182
+ };
2183
+ }
2184
+ };
2185
+ };
2186
+
2187
+ // src/angular/voice-turn-quality.service.ts
2188
+ var _dec = [
2189
+ Injectable9({ providedIn: "root" })
2190
+ ];
2191
+ var _init = __decoratorStart(undefined);
2192
+
2193
+ class VoiceTurnQualityService {
2194
+ connect(path = "/api/turn-quality", options = {}) {
2195
+ const store = createVoiceTurnQualityStore(path, options);
2196
+ const errorSignal = signal9(null);
2197
+ const isLoadingSignal = signal9(false);
2198
+ const reportSignal = signal9(undefined);
2199
+ const updatedAtSignal = signal9(undefined);
2200
+ const sync = () => {
2201
+ const snapshot = store.getSnapshot();
2202
+ errorSignal.set(snapshot.error);
2203
+ isLoadingSignal.set(snapshot.isLoading);
2204
+ reportSignal.set(snapshot.report);
2205
+ updatedAtSignal.set(snapshot.updatedAt);
2206
+ };
2207
+ const unsubscribe = store.subscribe(sync);
2208
+ sync();
2209
+ store.refresh().catch(() => {});
2210
+ return {
2211
+ close: () => {
2212
+ unsubscribe();
2213
+ store.close();
2214
+ },
2215
+ error: computed8(() => errorSignal()),
2216
+ isLoading: computed8(() => isLoadingSignal()),
2217
+ refresh: store.refresh,
2218
+ report: computed8(() => reportSignal()),
2219
+ updatedAt: computed8(() => updatedAtSignal())
2220
+ };
2221
+ }
2222
+ }
2223
+ VoiceTurnQualityService = __decorateElement(_init, 0, "VoiceTurnQualityService", _dec, VoiceTurnQualityService);
2224
+ __runInitializers(_init, 1, VoiceTurnQualityService);
2225
+ __decoratorMetadata(_init, VoiceTurnQualityService);
2226
+ let _VoiceTurnQualityService = VoiceTurnQualityService;
2227
+ // src/angular/voice-workflow-status.service.ts
2228
+ import { computed as computed9, Injectable as Injectable10, signal as signal10 } from "@angular/core";
2229
+
2230
+ // src/client/workflowStatus.ts
2231
+ var fetchVoiceWorkflowStatus = async (path = "/evals/scenarios/json", options = {}) => {
2232
+ const fetchImpl = options.fetch ?? globalThis.fetch;
2233
+ const response = await fetchImpl(path);
2234
+ if (!response.ok) {
2235
+ throw new Error(`Voice workflow status failed: HTTP ${response.status}`);
2236
+ }
2237
+ return await response.json();
2238
+ };
2239
+ var createVoiceWorkflowStatusStore = (path = "/evals/scenarios/json", options = {}) => {
2240
+ const listeners = new Set;
2241
+ let closed = false;
2242
+ let timer;
2243
+ let snapshot = {
2244
+ error: null,
2245
+ isLoading: false
2246
+ };
2247
+ const emit = () => {
2248
+ for (const listener of listeners) {
2249
+ listener();
2250
+ }
2251
+ };
2252
+ const refresh = async () => {
2253
+ if (closed) {
2254
+ return snapshot.report;
2255
+ }
2256
+ snapshot = {
2257
+ ...snapshot,
2258
+ error: null,
2259
+ isLoading: true
2260
+ };
2261
+ emit();
2262
+ try {
2263
+ const report = await fetchVoiceWorkflowStatus(path, options);
2264
+ snapshot = {
2265
+ error: null,
2266
+ isLoading: false,
2267
+ report,
2268
+ updatedAt: Date.now()
2269
+ };
2270
+ emit();
2271
+ return report;
2272
+ } catch (error) {
2273
+ snapshot = {
2274
+ ...snapshot,
2275
+ error: error instanceof Error ? error.message : String(error),
2276
+ isLoading: false
2277
+ };
2278
+ emit();
2279
+ throw error;
2280
+ }
2281
+ };
2282
+ const close = () => {
2283
+ closed = true;
2284
+ if (timer) {
2285
+ clearInterval(timer);
2286
+ timer = undefined;
2287
+ }
2288
+ listeners.clear();
2289
+ };
2290
+ if (typeof window !== "undefined" && options.intervalMs && options.intervalMs > 0) {
2291
+ timer = setInterval(() => {
2292
+ refresh().catch(() => {});
2293
+ }, options.intervalMs);
2294
+ }
2295
+ return {
2296
+ close,
2297
+ getServerSnapshot: () => snapshot,
2298
+ getSnapshot: () => snapshot,
2299
+ refresh,
2300
+ subscribe: (listener) => {
2301
+ listeners.add(listener);
2302
+ return () => {
2303
+ listeners.delete(listener);
2304
+ };
2305
+ }
2306
+ };
2307
+ };
2308
+
2309
+ // src/angular/voice-workflow-status.service.ts
2310
+ var _dec = [
2311
+ Injectable10({ providedIn: "root" })
2312
+ ];
2313
+ var _init = __decoratorStart(undefined);
2314
+
2315
+ class VoiceWorkflowStatusService {
2316
+ connect(path = "/evals/scenarios/json", options = {}) {
2317
+ const store = createVoiceWorkflowStatusStore(path, options);
2318
+ const errorSignal = signal10(null);
2319
+ const isLoadingSignal = signal10(false);
2320
+ const reportSignal = signal10(undefined);
2321
+ const updatedAtSignal = signal10(undefined);
2322
+ const sync = () => {
2323
+ const snapshot = store.getSnapshot();
2324
+ errorSignal.set(snapshot.error);
2325
+ isLoadingSignal.set(snapshot.isLoading);
2326
+ reportSignal.set(snapshot.report);
2327
+ updatedAtSignal.set(snapshot.updatedAt);
2328
+ };
2329
+ const unsubscribe = store.subscribe(sync);
2330
+ sync();
2331
+ if (typeof window !== "undefined") {
2332
+ store.refresh().catch(() => {});
2333
+ }
2334
+ return {
2335
+ close: () => {
2336
+ unsubscribe();
2337
+ store.close();
2338
+ },
2339
+ error: computed9(() => errorSignal()),
2340
+ isLoading: computed9(() => isLoadingSignal()),
2341
+ refresh: store.refresh,
2342
+ report: computed9(() => reportSignal()),
2343
+ updatedAt: computed9(() => updatedAtSignal())
2344
+ };
2345
+ }
2346
+ }
2347
+ VoiceWorkflowStatusService = __decorateElement(_init, 0, "VoiceWorkflowStatusService", _dec, VoiceWorkflowStatusService);
2348
+ __runInitializers(_init, 1, VoiceWorkflowStatusService);
2349
+ __decoratorMetadata(_init, VoiceWorkflowStatusService);
2350
+ let _VoiceWorkflowStatusService = VoiceWorkflowStatusService;
1291
2351
  export {
2352
+ VoiceWorkflowStatusService,
2353
+ VoiceTurnQualityService,
2354
+ VoiceTurnLatencyService,
2355
+ VoiceTraceTimelineService,
1292
2356
  VoiceStreamService,
1293
- VoiceControllerService
2357
+ VoiceRoutingStatusService,
2358
+ VoiceProviderStatusService,
2359
+ VoiceProviderCapabilitiesService,
2360
+ VoiceControllerService,
2361
+ VoiceAppKitStatusService
1294
2362
  };