@absolutejs/voice 0.0.22-beta.53 → 0.0.22-beta.55

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/README.md CHANGED
@@ -73,6 +73,115 @@ const app = new Elysia()
73
73
 
74
74
  `createVoiceMemoryStore()` is dev-only. Real deployments should provide a shared store backed by Redis, Postgres, or equivalent.
75
75
 
76
+ ## App Kit And Status Widgets
77
+
78
+ Use `createVoiceAppKitRoutes(...)` when you want a self-hosted operations surface without hand-wiring every dashboard route. It adds the ops console, quality gates, eval routes, provider health, session replay, handoff health, diagnostics, and `GET /app-kit/status`.
79
+
80
+ ```ts
81
+ import { createVoiceAppKitRoutes, createVoiceFileRuntimeStorage } from '@absolutejs/voice';
82
+
83
+ const runtime = createVoiceFileRuntimeStorage({ directory: '.voice-runtime/support' });
84
+
85
+ app.use(
86
+ createVoiceAppKitRoutes({
87
+ store: runtime.traces,
88
+ llmProviders: ['openai', 'anthropic', 'gemini'],
89
+ sttProviders: ['deepgram', 'assemblyai']
90
+ }).routes
91
+ );
92
+ ```
93
+
94
+ The status endpoint is intentionally small enough for customer-facing demos. It can report fixture-backed workflow readiness while leaving deeper live quality/session failures visible on the ops pages.
95
+
96
+ ```ts
97
+ app.use(
98
+ createVoiceAppKitRoutes({
99
+ appStatus: {
100
+ include: { quality: false, sessions: false },
101
+ preferFixtureWorkflows: true
102
+ },
103
+ evals: { fixtures: certificationFixtures, scenarios: workflowScenarios },
104
+ store: runtime.traces
105
+ }).routes
106
+ );
107
+ ```
108
+
109
+ ### React Status Widget
110
+
111
+ ```tsx
112
+ import { VoiceOpsStatus } from '@absolutejs/voice/react';
113
+
114
+ export function OpsBadge() {
115
+ return <VoiceOpsStatus intervalMs={5000} />;
116
+ }
117
+ ```
118
+
119
+ ### Vue Status Widget
120
+
121
+ ```vue
122
+ <script setup lang="ts">
123
+ import { VoiceOpsStatus } from '@absolutejs/voice/vue';
124
+ </script>
125
+
126
+ <template>
127
+ <VoiceOpsStatus :interval-ms="5000" />
128
+ </template>
129
+ ```
130
+
131
+ ### Svelte Status Widget
132
+
133
+ ```svelte
134
+ <script lang="ts">
135
+ import { onDestroy, onMount } from 'svelte';
136
+ import { createVoiceOpsStatus } from '@absolutejs/voice/svelte';
137
+
138
+ const status = createVoiceOpsStatus('/app-kit/status', { intervalMs: 5000 });
139
+ let html = '';
140
+ onMount(() => status.subscribe(() => (html = status.getHTML())));
141
+ onDestroy(() => status.close());
142
+ </script>
143
+
144
+ {@html html}
145
+ ```
146
+
147
+ ### Angular Status Widget
148
+
149
+ ```ts
150
+ import { VoiceAppKitStatusService } from '@absolutejs/voice/angular';
151
+
152
+ status = inject(VoiceAppKitStatusService).connect('/app-kit/status', {
153
+ intervalMs: 5000
154
+ });
155
+ ```
156
+
157
+ ```html
158
+ <h2>{{ status.report()?.status === 'pass' ? 'Passing' : 'Needs attention' }}</h2>
159
+ <p>{{ status.report()?.passed ?? 0 }} passing checks</p>
160
+ ```
161
+
162
+ ### HTML Or HTMX Status Widget
163
+
164
+ ```html
165
+ <div id="voice-ops-status"></div>
166
+ <script type="module">
167
+ import { mountVoiceOpsStatus } from '@absolutejs/voice/client';
168
+
169
+ mountVoiceOpsStatus(document.querySelector('#voice-ops-status'), '/app-kit/status', {
170
+ intervalMs: 5000
171
+ });
172
+ </script>
173
+ ```
174
+
175
+ For custom elements:
176
+
177
+ ```html
178
+ <absolute-voice-ops-status interval-ms="5000"></absolute-voice-ops-status>
179
+ <script type="module">
180
+ import { defineVoiceOpsStatusElement } from '@absolutejs/voice/client';
181
+ defineVoiceOpsStatusElement();
182
+ </script>
183
+ ```
184
+
76
185
  ## Voice Assistants
77
186
 
78
187
  Use `createVoiceAssistant(...)` when you want one product-level surface for a voice agent instead of wiring tools, guardrails, experiments, traces, and ops recipes separately. It returns a standard `onTurn` handler, plus an `ops` object you can pass to `voice(...)`.
@@ -1,4 +1,3 @@
1
- export { VoiceOpsStatusComponent } from './voice-ops-status.component';
2
1
  export { VoiceAppKitStatusService } from './voice-app-kit-status.service';
3
2
  export { VoiceStreamService } from './voice-stream.service';
4
3
  export { VoiceControllerService } from './voice-controller.service';
@@ -69,8 +69,8 @@ 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-ops-status.component.ts
73
- import { Component, Input, signal } from "@angular/core";
72
+ // src/angular/voice-app-kit-status.service.ts
73
+ import { computed, Injectable, signal } from "@angular/core";
74
74
 
75
75
  // src/client/appKitStatus.ts
76
76
  var fetchVoiceAppKitStatus = async (path = "/app-kit/status", options = {}) => {
@@ -151,269 +151,7 @@ var createVoiceAppKitStatusStore = (path = "/app-kit/status", options = {}) => {
151
151
  };
152
152
  };
153
153
 
154
- // src/client/opsStatusWidget.ts
155
- var DEFAULT_TITLE = "Voice Ops Status";
156
- var DEFAULT_DESCRIPTION = "Certified workflow, provider, and handoff readiness from the AbsoluteJS voice app kit.";
157
- var SURFACE_LABELS = {
158
- handoffs: "Handoffs",
159
- providers: "Providers",
160
- quality: "Quality",
161
- sessions: "Sessions",
162
- workflows: "Workflows"
163
- };
164
- var escapeHtml = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;").replaceAll('"', "&quot;").replaceAll("'", "&#39;");
165
- var readNumber = (value, key) => value && typeof value === "object" && (key in value) ? Number(value[key] ?? 0) : 0;
166
- var surfaceDetail = (surface) => {
167
- const total = readNumber(surface, "total");
168
- const failed = readNumber(surface, "failed");
169
- const degraded = readNumber(surface, "degraded");
170
- const source = surface && typeof surface === "object" && "source" in surface && typeof surface.source === "string" ? ` from ${surface.source}` : "";
171
- if (degraded > 0) {
172
- return `${degraded} degraded of ${total}`;
173
- }
174
- if (failed > 0) {
175
- return `${failed} failing of ${total}${source}`;
176
- }
177
- return total > 0 ? `${total} passing${source}` : `No failures${source}`;
178
- };
179
- var getVoiceOpsStatusLabel = (report, error) => {
180
- if (error) {
181
- return "Unavailable";
182
- }
183
- if (!report) {
184
- return "Checking";
185
- }
186
- return report.status === "pass" ? "Passing" : "Needs attention";
187
- };
188
- var createVoiceOpsStatusViewModel = (snapshot, options = {}) => {
189
- const report = snapshot.report;
190
- const surfaces = Object.entries(report?.surfaces ?? {}).map(([id, surface]) => {
191
- const failed = readNumber(surface, "failed") || readNumber(surface, "degraded");
192
- const total = readNumber(surface, "total");
193
- const status = surface && typeof surface === "object" && "status" in surface ? surface.status ?? "pass" : "pass";
194
- return {
195
- detail: surfaceDetail(surface),
196
- failed,
197
- id,
198
- label: SURFACE_LABELS[id] ?? id,
199
- status,
200
- total
201
- };
202
- });
203
- return {
204
- description: options.description ?? DEFAULT_DESCRIPTION,
205
- error: snapshot.error,
206
- isLoading: snapshot.isLoading,
207
- label: getVoiceOpsStatusLabel(report, snapshot.error),
208
- links: options.includeLinks === false ? [] : report?.links ?? [],
209
- passed: report?.passed ?? 0,
210
- status: snapshot.error ? "error" : report ? report.status : snapshot.isLoading ? "loading" : "loading",
211
- surfaces,
212
- title: options.title ?? DEFAULT_TITLE,
213
- total: report?.total ?? 0,
214
- updatedAt: snapshot.updatedAt
215
- };
216
- };
217
- var renderVoiceOpsStatusHTML = (snapshot, options = {}) => {
218
- const model = createVoiceOpsStatusViewModel(snapshot, options);
219
- const surfaces = model.surfaces.length ? model.surfaces.map((surface) => `<li class="absolute-voice-ops-status__surface absolute-voice-ops-status__surface--${escapeHtml(surface.status)}">
220
- <span>${escapeHtml(surface.label)}</span>
221
- <strong>${escapeHtml(surface.detail)}</strong>
222
- </li>`).join("") : '<li class="absolute-voice-ops-status__surface"><span>Status</span><strong>Waiting for first check</strong></li>';
223
- const links = model.links.length ? `<nav class="absolute-voice-ops-status__links">${model.links.slice(0, 4).map((link) => `<a href="${escapeHtml(link.href)}">${escapeHtml(link.label)}</a>`).join("")}</nav>` : "";
224
- return `<section class="absolute-voice-ops-status absolute-voice-ops-status--${escapeHtml(model.status)}">
225
- <header class="absolute-voice-ops-status__header">
226
- <span class="absolute-voice-ops-status__eyebrow">${escapeHtml(model.title)}</span>
227
- <strong class="absolute-voice-ops-status__label">${escapeHtml(model.label)}</strong>
228
- </header>
229
- <p class="absolute-voice-ops-status__description">${escapeHtml(model.description)}</p>
230
- <div class="absolute-voice-ops-status__summary">
231
- <span>${model.passed} passing</span>
232
- <span>${Math.max(model.total - model.passed, 0)} failing</span>
233
- <span>${model.total} checks</span>
234
- </div>
235
- <ul class="absolute-voice-ops-status__surfaces">${surfaces}</ul>
236
- ${model.error ? `<p class="absolute-voice-ops-status__error">${escapeHtml(model.error)}</p>` : ""}
237
- ${links}
238
- </section>`;
239
- };
240
- var getVoiceOpsStatusCSS = () => `.absolute-voice-ops-status{border:1px solid #d8d2c4;border-radius:20px;background:#fffaf0;color:#16130d;padding:18px;box-shadow:0 18px 40px rgba(47,37,18,.12);font-family:inherit}.absolute-voice-ops-status--fail,.absolute-voice-ops-status--error{border-color:#f2a7a7;background:#fff5f3}.absolute-voice-ops-status__header{align-items:start;display:flex;gap:12px;justify-content:space-between}.absolute-voice-ops-status__eyebrow{color:#73664f;font-size:12px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}.absolute-voice-ops-status__label{font-size:28px;line-height:1}.absolute-voice-ops-status__description{color:#514733;margin:12px 0 0}.absolute-voice-ops-status__summary,.absolute-voice-ops-status__links{display:flex;flex-wrap:wrap;gap:8px;margin-top:14px}.absolute-voice-ops-status__summary span,.absolute-voice-ops-status__links a{border:1px solid #e6ddca;border-radius:999px;color:inherit;padding:6px 10px;text-decoration:none}.absolute-voice-ops-status__surfaces{display:grid;gap:8px;list-style:none;margin:16px 0 0;padding:0}.absolute-voice-ops-status__surface{align-items:center;background:#fff;border:1px solid #eee4d2;border-radius:14px;display:flex;gap:12px;justify-content:space-between;padding:10px 12px}.absolute-voice-ops-status__surface--fail{border-color:#f2a7a7}.absolute-voice-ops-status__surface span{color:#655944}.absolute-voice-ops-status__error{color:#9f1239;font-weight:700}`;
241
- var mountVoiceOpsStatus = (element, path = "/app-kit/status", options = {}) => {
242
- const store = createVoiceAppKitStatusStore(path, options);
243
- const render = () => {
244
- element.innerHTML = renderVoiceOpsStatusHTML(store.getSnapshot(), options);
245
- };
246
- const unsubscribe = store.subscribe(render);
247
- render();
248
- store.refresh().catch(() => {});
249
- return {
250
- close: () => {
251
- unsubscribe();
252
- store.close();
253
- },
254
- refresh: store.refresh
255
- };
256
- };
257
- var defineVoiceOpsStatusElement = (tagName = "absolute-voice-ops-status") => {
258
- if (typeof window === "undefined" || typeof customElements === "undefined" || customElements.get(tagName)) {
259
- return;
260
- }
261
- customElements.define(tagName, class AbsoluteVoiceOpsStatusElement extends HTMLElement {
262
- mounted;
263
- connectedCallback() {
264
- const intervalMs = Number(this.getAttribute("interval-ms") ?? 5000);
265
- this.mounted = mountVoiceOpsStatus(this, this.getAttribute("path") ?? "/app-kit/status", {
266
- description: this.getAttribute("description") ?? undefined,
267
- includeLinks: this.getAttribute("include-links") !== "false",
268
- intervalMs: Number.isFinite(intervalMs) ? intervalMs : 5000,
269
- title: this.getAttribute("title") ?? undefined
270
- });
271
- }
272
- disconnectedCallback() {
273
- this.mounted?.close();
274
- this.mounted = undefined;
275
- }
276
- });
277
- };
278
-
279
- // src/angular/voice-ops-status.component.ts
280
- var _dec = [
281
- Component({
282
- selector: "absolute-voice-ops-status",
283
- standalone: true,
284
- template: `
285
- <section
286
- class="absolute-voice-ops-status"
287
- [class.absolute-voice-ops-status--pass]="model().status === 'pass'"
288
- [class.absolute-voice-ops-status--fail]="model().status === 'fail'"
289
- [class.absolute-voice-ops-status--loading]="model().status === 'loading'"
290
- [class.absolute-voice-ops-status--error]="model().status === 'error'"
291
- >
292
- <header class="absolute-voice-ops-status__header">
293
- <span class="absolute-voice-ops-status__eyebrow">{{
294
- model().title
295
- }}</span>
296
- <strong class="absolute-voice-ops-status__label">{{
297
- model().label
298
- }}</strong>
299
- </header>
300
- <p class="absolute-voice-ops-status__description">
301
- {{ model().description }}
302
- </p>
303
- <div class="absolute-voice-ops-status__summary">
304
- <span>{{ model().passed }} passing</span>
305
- <span>{{ model().total - model().passed }} failing</span>
306
- <span>{{ model().total }} checks</span>
307
- </div>
308
- <ul class="absolute-voice-ops-status__surfaces">
309
- @if (model().surfaces.length > 0) {
310
- @for (surface of model().surfaces; track surface.id) {
311
- <li
312
- class="absolute-voice-ops-status__surface"
313
- [class.absolute-voice-ops-status__surface--pass]="
314
- surface.status === 'pass'
315
- "
316
- [class.absolute-voice-ops-status__surface--fail]="
317
- surface.status === 'fail'
318
- "
319
- >
320
- <span>{{ surface.label }}</span>
321
- <strong>{{ surface.detail }}</strong>
322
- </li>
323
- }
324
- } @else {
325
- <li class="absolute-voice-ops-status__surface">
326
- <span>Status</span>
327
- <strong>Waiting for first check</strong>
328
- </li>
329
- }
330
- </ul>
331
- @if (model().error) {
332
- <p class="absolute-voice-ops-status__error">{{ model().error }}</p>
333
- }
334
- @if (model().links.length > 0) {
335
- <nav class="absolute-voice-ops-status__links">
336
- @for (link of model().links.slice(0, 4); track link.href) {
337
- <a [href]="link.href">{{ link.label }}</a>
338
- }
339
- </nav>
340
- }
341
- </section>
342
- `
343
- })
344
- ];
345
- var _dec2 = [
346
- Input()
347
- ];
348
- var _dec3 = [
349
- Input()
350
- ];
351
- var _dec4 = [
352
- Input()
353
- ];
354
- var _dec5 = [
355
- Input()
356
- ];
357
- var _dec6 = [
358
- Input()
359
- ];
360
- var _init = __decoratorStart(undefined);
361
-
362
- class VoiceOpsStatusComponent {
363
- constructor() {
364
- this.description = __runInitializers(_init, 8, this);
365
- __runInitializers(_init, 11, this);
366
- this.includeLinks = __runInitializers(_init, 12, this, true);
367
- __runInitializers(_init, 15, this);
368
- this.intervalMs = __runInitializers(_init, 16, this);
369
- __runInitializers(_init, 19, this);
370
- this.path = __runInitializers(_init, 20, this, "/app-kit/status");
371
- __runInitializers(_init, 23, this);
372
- this.title = __runInitializers(_init, 24, this);
373
- __runInitializers(_init, 27, this);
374
- }
375
- cleanup = () => {};
376
- store;
377
- model = signal(createVoiceOpsStatusViewModel({
378
- error: null,
379
- isLoading: true
380
- }));
381
- ngOnInit() {
382
- const options = this.options();
383
- this.store = createVoiceAppKitStatusStore(this.path, options);
384
- const sync = () => {
385
- this.model.set(createVoiceOpsStatusViewModel(this.store.getSnapshot(), options));
386
- };
387
- this.cleanup = this.store.subscribe(sync);
388
- sync();
389
- if (typeof window !== "undefined") {
390
- this.store.refresh().catch(() => {});
391
- }
392
- }
393
- ngOnDestroy() {
394
- this.cleanup();
395
- this.store?.close();
396
- }
397
- options() {
398
- return {
399
- description: this.description,
400
- includeLinks: this.includeLinks,
401
- intervalMs: this.intervalMs,
402
- title: this.title
403
- };
404
- }
405
- }
406
- __decorateElement(_init, 5, "description", _dec2, VoiceOpsStatusComponent);
407
- __decorateElement(_init, 5, "includeLinks", _dec3, VoiceOpsStatusComponent);
408
- __decorateElement(_init, 5, "intervalMs", _dec4, VoiceOpsStatusComponent);
409
- __decorateElement(_init, 5, "path", _dec5, VoiceOpsStatusComponent);
410
- __decorateElement(_init, 5, "title", _dec6, VoiceOpsStatusComponent);
411
- VoiceOpsStatusComponent = __decorateElement(_init, 0, "VoiceOpsStatusComponent", _dec, VoiceOpsStatusComponent);
412
- __runInitializers(_init, 1, VoiceOpsStatusComponent);
413
- __decoratorMetadata(_init, VoiceOpsStatusComponent);
414
- let _VoiceOpsStatusComponent = VoiceOpsStatusComponent;
415
154
  // src/angular/voice-app-kit-status.service.ts
416
- import { computed, Injectable, signal as signal2 } from "@angular/core";
417
155
  var _dec = [
418
156
  Injectable({ providedIn: "root" })
419
157
  ];
@@ -422,10 +160,10 @@ var _init = __decoratorStart(undefined);
422
160
  class VoiceAppKitStatusService {
423
161
  connect(path = "/app-kit/status", options = {}) {
424
162
  const store = createVoiceAppKitStatusStore(path, options);
425
- const errorSignal = signal2(null);
426
- const isLoadingSignal = signal2(false);
427
- const reportSignal = signal2(undefined);
428
- const updatedAtSignal = signal2(undefined);
163
+ const errorSignal = signal(null);
164
+ const isLoadingSignal = signal(false);
165
+ const reportSignal = signal(undefined);
166
+ const updatedAtSignal = signal(undefined);
429
167
  const sync = () => {
430
168
  const snapshot = store.getSnapshot();
431
169
  errorSignal.set(snapshot.error);
@@ -456,7 +194,7 @@ __runInitializers(_init, 1, VoiceAppKitStatusService);
456
194
  __decoratorMetadata(_init, VoiceAppKitStatusService);
457
195
  let _VoiceAppKitStatusService = VoiceAppKitStatusService;
458
196
  // src/angular/voice-stream.service.ts
459
- import { computed as computed2, Injectable as Injectable2, signal as signal3 } from "@angular/core";
197
+ import { computed as computed2, Injectable as Injectable2, signal as signal2 } from "@angular/core";
460
198
 
461
199
  // src/client/actions.ts
462
200
  var normalizeErrorMessage = (value) => {
@@ -980,15 +718,15 @@ var _init = __decoratorStart(undefined);
980
718
  class VoiceStreamService {
981
719
  connect(path, options = {}) {
982
720
  const stream = createVoiceStream(path, options);
983
- const assistantAudioSignal = signal3([]);
984
- const assistantTextsSignal = signal3([]);
985
- const callSignal = signal3(null);
986
- const errorSignal = signal3(null);
987
- const isConnectedSignal = signal3(false);
988
- const partialSignal = signal3("");
989
- const sessionIdSignal = signal3(stream.sessionId);
990
- const statusSignal = signal3(stream.status);
991
- const turnsSignal = signal3([]);
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([]);
992
730
  const sync = () => {
993
731
  assistantAudioSignal.set([...stream.assistantAudio]);
994
732
  assistantTextsSignal.set([...stream.assistantTexts]);
@@ -1027,7 +765,7 @@ __runInitializers(_init, 1, VoiceStreamService);
1027
765
  __decoratorMetadata(_init, VoiceStreamService);
1028
766
  let _VoiceStreamService = VoiceStreamService;
1029
767
  // src/angular/voice-controller.service.ts
1030
- import { computed as computed3, Injectable as Injectable3, signal as signal4 } from "@angular/core";
768
+ import { computed as computed3, Injectable as Injectable3, signal as signal3 } from "@angular/core";
1031
769
 
1032
770
  // src/client/htmx.ts
1033
771
  var DEFAULT_EVENT_NAME = "voice-refresh";
@@ -1668,16 +1406,16 @@ var _init = __decoratorStart(undefined);
1668
1406
  class VoiceControllerService {
1669
1407
  connect(path, options = {}) {
1670
1408
  const controller = createVoiceController(path, options);
1671
- const assistantAudioSignal = signal4([]);
1672
- const assistantTextsSignal = signal4([]);
1673
- const errorSignal = signal4(null);
1674
- const isConnectedSignal = signal4(false);
1675
- const isRecordingSignal = signal4(false);
1676
- const partialSignal = signal4("");
1677
- const recordingErrorSignal = signal4(null);
1678
- const sessionIdSignal = signal4(controller.sessionId);
1679
- const statusSignal = signal4(controller.status);
1680
- const turnsSignal = signal4([]);
1409
+ const assistantAudioSignal = signal3([]);
1410
+ const assistantTextsSignal = signal3([]);
1411
+ const errorSignal = signal3(null);
1412
+ const isConnectedSignal = signal3(false);
1413
+ const isRecordingSignal = signal3(false);
1414
+ const partialSignal = signal3("");
1415
+ const recordingErrorSignal = signal3(null);
1416
+ const sessionIdSignal = signal3(controller.sessionId);
1417
+ const statusSignal = signal3(controller.status);
1418
+ const turnsSignal = signal3([]);
1681
1419
  const sync = () => {
1682
1420
  assistantAudioSignal.set([...controller.assistantAudio]);
1683
1421
  assistantTextsSignal.set([...controller.assistantTexts]);
@@ -1721,7 +1459,7 @@ __runInitializers(_init, 1, VoiceControllerService);
1721
1459
  __decoratorMetadata(_init, VoiceControllerService);
1722
1460
  let _VoiceControllerService = VoiceControllerService;
1723
1461
  // src/angular/voice-provider-status.service.ts
1724
- import { computed as computed4, Injectable as Injectable4, signal as signal5 } from "@angular/core";
1462
+ import { computed as computed4, Injectable as Injectable4, signal as signal4 } from "@angular/core";
1725
1463
 
1726
1464
  // src/client/providerStatus.ts
1727
1465
  var fetchVoiceProviderStatus = async (path = "/api/provider-status", options = {}) => {
@@ -1812,10 +1550,10 @@ var _init = __decoratorStart(undefined);
1812
1550
  class VoiceProviderStatusService {
1813
1551
  connect(path = "/api/provider-status", options = {}) {
1814
1552
  const store = createVoiceProviderStatusStore(path, options);
1815
- const errorSignal = signal5(null);
1816
- const isLoadingSignal = signal5(false);
1817
- const providersSignal = signal5([]);
1818
- const updatedAtSignal = signal5(undefined);
1553
+ const errorSignal = signal4(null);
1554
+ const isLoadingSignal = signal4(false);
1555
+ const providersSignal = signal4([]);
1556
+ const updatedAtSignal = signal4(undefined);
1819
1557
  const sync = () => {
1820
1558
  const snapshot = store.getSnapshot();
1821
1559
  errorSignal.set(snapshot.error);
@@ -1844,7 +1582,7 @@ __runInitializers(_init, 1, VoiceProviderStatusService);
1844
1582
  __decoratorMetadata(_init, VoiceProviderStatusService);
1845
1583
  let _VoiceProviderStatusService = VoiceProviderStatusService;
1846
1584
  // src/angular/voice-workflow-status.service.ts
1847
- import { computed as computed5, Injectable as Injectable5, signal as signal6 } from "@angular/core";
1585
+ import { computed as computed5, Injectable as Injectable5, signal as signal5 } from "@angular/core";
1848
1586
 
1849
1587
  // src/client/workflowStatus.ts
1850
1588
  var fetchVoiceWorkflowStatus = async (path = "/evals/scenarios/json", options = {}) => {
@@ -1934,10 +1672,10 @@ var _init = __decoratorStart(undefined);
1934
1672
  class VoiceWorkflowStatusService {
1935
1673
  connect(path = "/evals/scenarios/json", options = {}) {
1936
1674
  const store = createVoiceWorkflowStatusStore(path, options);
1937
- const errorSignal = signal6(null);
1938
- const isLoadingSignal = signal6(false);
1939
- const reportSignal = signal6(undefined);
1940
- const updatedAtSignal = signal6(undefined);
1675
+ const errorSignal = signal5(null);
1676
+ const isLoadingSignal = signal5(false);
1677
+ const reportSignal = signal5(undefined);
1678
+ const updatedAtSignal = signal5(undefined);
1941
1679
  const sync = () => {
1942
1680
  const snapshot = store.getSnapshot();
1943
1681
  errorSignal.set(snapshot.error);
@@ -1971,7 +1709,6 @@ export {
1971
1709
  VoiceWorkflowStatusService,
1972
1710
  VoiceStreamService,
1973
1711
  VoiceProviderStatusService,
1974
- VoiceOpsStatusComponent,
1975
1712
  VoiceControllerService,
1976
1713
  VoiceAppKitStatusService
1977
1714
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.53",
3
+ "version": "0.0.22-beta.55",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",