@absolutejs/voice 0.0.22-beta.130 → 0.0.22-beta.132

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
@@ -2340,6 +2340,8 @@ Default reconnect strategy is `resume-last-turn`.
2340
2340
 
2341
2341
  If an adapter does not emit native end-of-turn events, core falls back to silence detection with a default `700ms` threshold.
2342
2342
 
2343
+ For browser/client proof, use `runVoiceReconnectContract(...)` or mount `createVoiceReconnectContractRoutes(...)` with captured reconnect snapshots. The contract verifies that a reconnect was observed, the stream resumed before exhaustion, and replayed state did not duplicate committed turn IDs.
2344
+
2343
2345
  ## STT Fallback
2344
2346
 
2345
2347
  You can pair a primary vendor with an optional fallback vendor per route when you need extra reliability for accents, edge environments, or short commands.
@@ -1743,6 +1743,17 @@ var formatErrorMessage = (error) => {
1743
1743
  }
1744
1744
  return "Unexpected error";
1745
1745
  };
1746
+ var formatReconnectState = (reconnect) => {
1747
+ const pieces = [reconnect.status];
1748
+ if (reconnect.attempts > 0 || reconnect.maxAttempts > 0) {
1749
+ pieces.push(`${reconnect.attempts}/${reconnect.maxAttempts} attempts`);
1750
+ }
1751
+ if (reconnect.nextAttemptAt) {
1752
+ const waitMs = Math.max(0, reconnect.nextAttemptAt - Date.now());
1753
+ pieces.push(`retry in ${Math.ceil(waitMs / 100) / 10}s`);
1754
+ }
1755
+ return pieces.join(" · ");
1756
+ };
1746
1757
  var createInitialVoiceWaveLevels = (count = VOICE_WAVE_POINTS) => Array.from({ length: count }, () => 0);
1747
1758
  var pushVoiceWaveLevel = (levels, nextLevel, count = VOICE_WAVE_POINTS) => {
1748
1759
  const next = levels.slice(-(count - 1));
@@ -1806,6 +1817,10 @@ var parseOptionalNumber = (value) => {
1806
1817
  const parsed = Number(value);
1807
1818
  return Number.isFinite(parsed) ? parsed : undefined;
1808
1819
  };
1820
+ var resolveElement2 = (root, selector, ctor) => {
1821
+ const value = selector ? document.querySelector(selector) : root.querySelector(selector ?? "");
1822
+ return value instanceof ctor ? value : null;
1823
+ };
1809
1824
  var requireElement = (root, selector, ctor, name) => {
1810
1825
  const value = selector ? document.querySelector(selector) : null;
1811
1826
  if (value instanceof ctor) {
@@ -1868,6 +1883,7 @@ var initVoiceHTMXRoot = (root) => {
1868
1883
  const errorStatus = requireElement(root, root.dataset.voiceError, HTMLElement, "status-error");
1869
1884
  const microphoneStatus = requireElement(root, root.dataset.voiceMicrophone, HTMLElement, "status-mic");
1870
1885
  const promptStatus = requireElement(root, root.dataset.voicePrompt, HTMLElement, "status-prompt");
1886
+ const reconnectStatus = resolveElement2(root, root.dataset.voiceReconnect, HTMLElement);
1871
1887
  const chatList = requireElement(root, root.dataset.voiceChat, HTMLElement, "chat-list");
1872
1888
  const startGuidedButton = requireElement(root, root.dataset.voiceStartGuided, HTMLButtonElement, "start-guided");
1873
1889
  const startGeneralButton = requireElement(root, root.dataset.voiceStartGeneral, HTMLButtonElement, "start-general");
@@ -1948,6 +1964,9 @@ var initVoiceHTMXRoot = (root) => {
1948
1964
  const status = voice.status;
1949
1965
  connectionMetric.textContent = voice.isConnected ? "Connected" : "Waiting";
1950
1966
  errorStatus.textContent = micError || voice.error || "None";
1967
+ if (reconnectStatus) {
1968
+ reconnectStatus.textContent = formatReconnectState(voice.reconnect);
1969
+ }
1951
1970
  microphoneStatus.textContent = isCapturing ? DEFAULT_MIC_LIVE : DEFAULT_MIC_IDLE;
1952
1971
  promptStatus.textContent = resolvePromptMessage({
1953
1972
  guidedPrompts,
package/dist/index.d.ts CHANGED
@@ -9,6 +9,7 @@ export { buildVoiceAuditExport, exportVoiceAuditTrail, redactVoiceAuditEvent, re
9
9
  export { createVoiceAuditHTTPSink, createVoiceAuditSinkDeliveryId, createVoiceAuditSinkDeliveryRecord, createVoiceAuditSinkDeliveryWorker, createVoiceAuditSinkDeliveryWorkerLoop, createVoiceAuditSinkStore, createVoiceMemoryAuditSinkDeliveryStore, deliverVoiceAuditEventsToSinks, summarizeVoiceAuditSinkDeliveries } from './auditSinks';
10
10
  export { buildVoiceAuditDeliveryReport, createVoiceAuditDeliveryHTMLHandler, createVoiceAuditDeliveryJSONHandler, createVoiceAuditDeliveryRoutes, renderVoiceAuditDeliveryHTML, resolveVoiceAuditDeliveryFilter } from './auditDeliveryRoutes';
11
11
  export { createVoiceBargeInRoutes, renderVoiceBargeInHTML, summarizeVoiceBargeIn } from './bargeInRoutes';
12
+ export { createVoiceReconnectContractRoutes, renderVoiceReconnectContractHTML, runVoiceReconnectContract } from './reconnectContract';
12
13
  export { buildVoiceDiagnosticsMarkdown, createVoiceDiagnosticsRoutes, resolveVoiceDiagnosticsTraceFilter } from './diagnosticsRoutes';
13
14
  export { buildVoiceDemoReadyReport, createVoiceDemoReadyRoutes, renderVoiceDemoReadyHTML } from './demoReadyRoutes';
14
15
  export { applyVoiceDataRetentionPolicy, buildVoiceDataRetentionPlan } from './dataControl';