@absolutejs/voice 0.0.22-beta.357 → 0.0.22-beta.359

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.
@@ -1486,6 +1486,7 @@ var serverMessageToAction = (message) => {
1486
1486
  partial: message.partial,
1487
1487
  scenarioId: message.scenarioId,
1488
1488
  sessionId: message.sessionId,
1489
+ sessionMetadata: message.sessionMetadata,
1489
1490
  status: message.status,
1490
1491
  turns: message.turns,
1491
1492
  type: "replay"
@@ -1493,6 +1494,7 @@ var serverMessageToAction = (message) => {
1493
1494
  case "session":
1494
1495
  return {
1495
1496
  sessionId: message.sessionId,
1497
+ sessionMetadata: message.sessionMetadata,
1496
1498
  scenarioId: message.scenarioId,
1497
1499
  status: message.status,
1498
1500
  type: "session"
@@ -2518,6 +2520,7 @@ var createInitialState = () => ({
2518
2520
  call: null,
2519
2521
  error: null,
2520
2522
  isConnected: false,
2523
+ sessionMetadata: null,
2521
2524
  scenarioId: null,
2522
2525
  partial: "",
2523
2526
  reconnect: createInitialReconnectState(),
@@ -2633,6 +2636,7 @@ var createVoiceStreamStore = () => {
2633
2636
  } : state.reconnect,
2634
2637
  scenarioId: action.scenarioId ?? state.scenarioId,
2635
2638
  sessionId: action.sessionId,
2639
+ sessionMetadata: action.sessionMetadata ?? state.sessionMetadata,
2636
2640
  status: action.status,
2637
2641
  turns: [...action.turns]
2638
2642
  };
@@ -2644,6 +2648,7 @@ var createVoiceStreamStore = () => {
2644
2648
  scenarioId: action.scenarioId ?? state.scenarioId,
2645
2649
  isConnected: action.status === "active",
2646
2650
  sessionId: action.sessionId,
2651
+ sessionMetadata: action.sessionMetadata ?? state.sessionMetadata,
2647
2652
  status: action.status
2648
2653
  };
2649
2654
  break;
@@ -2750,6 +2755,9 @@ var createVoiceStream = (path, options = {}) => {
2750
2755
  get scenarioId() {
2751
2756
  return store.getSnapshot().scenarioId;
2752
2757
  },
2758
+ get sessionMetadata() {
2759
+ return store.getSnapshot().sessionMetadata;
2760
+ },
2753
2761
  start,
2754
2762
  get partial() {
2755
2763
  return store.getSnapshot().partial;
@@ -2804,6 +2812,7 @@ class VoiceStreamService {
2804
2812
  const partialSignal = signal10("");
2805
2813
  const reconnectSignal = signal10(stream.reconnect);
2806
2814
  const sessionIdSignal = signal10(stream.sessionId);
2815
+ const sessionMetadataSignal = signal10(stream.sessionMetadata);
2807
2816
  const statusSignal = signal10(stream.status);
2808
2817
  const turnsSignal = signal10([]);
2809
2818
  const sync = () => {
@@ -2815,6 +2824,7 @@ class VoiceStreamService {
2815
2824
  partialSignal.set(stream.partial);
2816
2825
  reconnectSignal.set(stream.reconnect);
2817
2826
  sessionIdSignal.set(stream.sessionId);
2827
+ sessionMetadataSignal.set(stream.sessionMetadata);
2818
2828
  statusSignal.set(stream.status);
2819
2829
  turnsSignal.set([...stream.turns]);
2820
2830
  };
@@ -2836,6 +2846,7 @@ class VoiceStreamService {
2836
2846
  reconnect: computed10(() => reconnectSignal()),
2837
2847
  sendAudio: (audio) => stream.sendAudio(audio),
2838
2848
  sessionId: computed10(() => sessionIdSignal()),
2849
+ sessionMetadata: computed10(() => sessionMetadataSignal()),
2839
2850
  status: computed10(() => statusSignal()),
2840
2851
  turns: computed10(() => turnsSignal())
2841
2852
  };
@@ -3318,6 +3329,7 @@ var createInitialState2 = (stream) => ({
3318
3329
  reconnect: stream.reconnect,
3319
3330
  recordingError: null,
3320
3331
  sessionId: stream.sessionId,
3332
+ sessionMetadata: stream.sessionMetadata,
3321
3333
  scenarioId: stream.scenarioId,
3322
3334
  status: stream.status,
3323
3335
  turns: [...stream.turns]
@@ -3347,6 +3359,7 @@ var createVoiceController = (path, options = {}) => {
3347
3359
  partial: stream.partial,
3348
3360
  reconnect: stream.reconnect,
3349
3361
  sessionId: stream.sessionId,
3362
+ sessionMetadata: stream.sessionMetadata,
3350
3363
  scenarioId: stream.scenarioId,
3351
3364
  status: stream.status,
3352
3365
  turns: [...stream.turns]
@@ -3453,6 +3466,9 @@ var createVoiceController = (path, options = {}) => {
3453
3466
  get sessionId() {
3454
3467
  return state.sessionId;
3455
3468
  },
3469
+ get sessionMetadata() {
3470
+ return state.sessionMetadata;
3471
+ },
3456
3472
  get scenarioId() {
3457
3473
  return state.scenarioId;
3458
3474
  },
@@ -18,6 +18,7 @@ export declare class VoiceStreamService {
18
18
  reconnect: import("@angular/core").Signal<import("..").VoiceReconnectClientState>;
19
19
  sendAudio: (audio: Uint8Array | ArrayBuffer) => void;
20
20
  sessionId: import("@angular/core").Signal<string | null>;
21
+ sessionMetadata: import("@angular/core").Signal<Record<string, unknown> | null>;
21
22
  status: import("@angular/core").Signal<import("..").VoiceSessionStatus | "idle">;
22
23
  turns: import("@angular/core").Signal<VoiceTurnRecord<TResult>[]>;
23
24
  };
@@ -15,6 +15,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
15
15
  call?: undefined;
16
16
  partial?: undefined;
17
17
  scenarioId?: undefined;
18
+ sessionMetadata?: undefined;
18
19
  status?: undefined;
19
20
  turns?: undefined;
20
21
  turn?: undefined;
@@ -34,6 +35,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
34
35
  call?: undefined;
35
36
  partial?: undefined;
36
37
  scenarioId?: undefined;
38
+ sessionMetadata?: undefined;
37
39
  status?: undefined;
38
40
  turns?: undefined;
39
41
  turn?: undefined;
@@ -53,6 +55,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
53
55
  call?: undefined;
54
56
  partial?: undefined;
55
57
  scenarioId?: undefined;
58
+ sessionMetadata?: undefined;
56
59
  status?: undefined;
57
60
  turns?: undefined;
58
61
  turn?: undefined;
@@ -72,6 +75,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
72
75
  call?: undefined;
73
76
  partial?: undefined;
74
77
  scenarioId?: undefined;
78
+ sessionMetadata?: undefined;
75
79
  status?: undefined;
76
80
  turns?: undefined;
77
81
  turn?: undefined;
@@ -91,6 +95,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
91
95
  call?: undefined;
92
96
  partial?: undefined;
93
97
  scenarioId?: undefined;
98
+ sessionMetadata?: undefined;
94
99
  status?: undefined;
95
100
  turns?: undefined;
96
101
  turn?: undefined;
@@ -110,6 +115,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
110
115
  call?: undefined;
111
116
  partial?: undefined;
112
117
  scenarioId?: undefined;
118
+ sessionMetadata?: undefined;
113
119
  status?: undefined;
114
120
  turns?: undefined;
115
121
  turn?: undefined;
@@ -129,6 +135,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
129
135
  call?: undefined;
130
136
  partial?: undefined;
131
137
  scenarioId?: undefined;
138
+ sessionMetadata?: undefined;
132
139
  status?: undefined;
133
140
  turns?: undefined;
134
141
  turn?: undefined;
@@ -148,6 +155,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
148
155
  call?: undefined;
149
156
  partial?: undefined;
150
157
  scenarioId?: undefined;
158
+ sessionMetadata?: undefined;
151
159
  status?: undefined;
152
160
  turns?: undefined;
153
161
  turn?: undefined;
@@ -157,6 +165,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
157
165
  partial: string;
158
166
  scenarioId: string | undefined;
159
167
  sessionId: string;
168
+ sessionMetadata: Record<string, unknown> | undefined;
160
169
  status: import("..").VoiceSessionStatus;
161
170
  turns: import("..").VoiceTurnRecord<TResult>[];
162
171
  type: "replay";
@@ -172,6 +181,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
172
181
  turn?: undefined;
173
182
  } | {
174
183
  sessionId: string;
184
+ sessionMetadata: Record<string, unknown> | undefined;
175
185
  scenarioId: string | undefined;
176
186
  status: import("..").VoiceSessionStatus;
177
187
  type: "session";
@@ -206,6 +216,7 @@ export declare const serverMessageToAction: <TResult = unknown>(message: VoiceSe
206
216
  call?: undefined;
207
217
  partial?: undefined;
208
218
  scenarioId?: undefined;
219
+ sessionMetadata?: undefined;
209
220
  status?: undefined;
210
221
  turns?: undefined;
211
222
  } | null;
@@ -221,6 +221,7 @@ var serverMessageToAction = (message) => {
221
221
  partial: message.partial,
222
222
  scenarioId: message.scenarioId,
223
223
  sessionId: message.sessionId,
224
+ sessionMetadata: message.sessionMetadata,
224
225
  status: message.status,
225
226
  turns: message.turns,
226
227
  type: "replay"
@@ -228,6 +229,7 @@ var serverMessageToAction = (message) => {
228
229
  case "session":
229
230
  return {
230
231
  sessionId: message.sessionId,
232
+ sessionMetadata: message.sessionMetadata,
231
233
  scenarioId: message.scenarioId,
232
234
  status: message.status,
233
235
  type: "session"
@@ -744,6 +746,7 @@ var createInitialState = () => ({
744
746
  call: null,
745
747
  error: null,
746
748
  isConnected: false,
749
+ sessionMetadata: null,
747
750
  scenarioId: null,
748
751
  partial: "",
749
752
  reconnect: createInitialReconnectState(),
@@ -859,6 +862,7 @@ var createVoiceStreamStore = () => {
859
862
  } : state.reconnect,
860
863
  scenarioId: action.scenarioId ?? state.scenarioId,
861
864
  sessionId: action.sessionId,
865
+ sessionMetadata: action.sessionMetadata ?? state.sessionMetadata,
862
866
  status: action.status,
863
867
  turns: [...action.turns]
864
868
  };
@@ -870,6 +874,7 @@ var createVoiceStreamStore = () => {
870
874
  scenarioId: action.scenarioId ?? state.scenarioId,
871
875
  isConnected: action.status === "active",
872
876
  sessionId: action.sessionId,
877
+ sessionMetadata: action.sessionMetadata ?? state.sessionMetadata,
873
878
  status: action.status
874
879
  };
875
880
  break;
@@ -976,6 +981,9 @@ var createVoiceStream = (path, options = {}) => {
976
981
  get scenarioId() {
977
982
  return store.getSnapshot().scenarioId;
978
983
  },
984
+ get sessionMetadata() {
985
+ return store.getSnapshot().sessionMetadata;
986
+ },
979
987
  start,
980
988
  get partial() {
981
989
  return store.getSnapshot().partial;
@@ -1304,6 +1312,7 @@ var createInitialState2 = (stream) => ({
1304
1312
  reconnect: stream.reconnect,
1305
1313
  recordingError: null,
1306
1314
  sessionId: stream.sessionId,
1315
+ sessionMetadata: stream.sessionMetadata,
1307
1316
  scenarioId: stream.scenarioId,
1308
1317
  status: stream.status,
1309
1318
  turns: [...stream.turns]
@@ -1333,6 +1342,7 @@ var createVoiceController = (path, options = {}) => {
1333
1342
  partial: stream.partial,
1334
1343
  reconnect: stream.reconnect,
1335
1344
  sessionId: stream.sessionId,
1345
+ sessionMetadata: stream.sessionMetadata,
1336
1346
  scenarioId: stream.scenarioId,
1337
1347
  status: stream.status,
1338
1348
  turns: [...stream.turns]
@@ -1439,6 +1449,9 @@ var createVoiceController = (path, options = {}) => {
1439
1449
  get sessionId() {
1440
1450
  return state.sessionId;
1441
1451
  },
1452
+ get sessionMetadata() {
1453
+ return state.sessionMetadata;
1454
+ },
1442
1455
  get scenarioId() {
1443
1456
  return state.scenarioId;
1444
1457
  },
@@ -759,6 +759,7 @@ var serverMessageToAction = (message) => {
759
759
  partial: message.partial,
760
760
  scenarioId: message.scenarioId,
761
761
  sessionId: message.sessionId,
762
+ sessionMetadata: message.sessionMetadata,
762
763
  status: message.status,
763
764
  turns: message.turns,
764
765
  type: "replay"
@@ -766,6 +767,7 @@ var serverMessageToAction = (message) => {
766
767
  case "session":
767
768
  return {
768
769
  sessionId: message.sessionId,
770
+ sessionMetadata: message.sessionMetadata,
769
771
  scenarioId: message.scenarioId,
770
772
  status: message.status,
771
773
  type: "session"
@@ -1527,6 +1529,7 @@ var createInitialState2 = () => ({
1527
1529
  call: null,
1528
1530
  error: null,
1529
1531
  isConnected: false,
1532
+ sessionMetadata: null,
1530
1533
  scenarioId: null,
1531
1534
  partial: "",
1532
1535
  reconnect: createInitialReconnectState(),
@@ -1642,6 +1645,7 @@ var createVoiceStreamStore = () => {
1642
1645
  } : state.reconnect,
1643
1646
  scenarioId: action.scenarioId ?? state.scenarioId,
1644
1647
  sessionId: action.sessionId,
1648
+ sessionMetadata: action.sessionMetadata ?? state.sessionMetadata,
1645
1649
  status: action.status,
1646
1650
  turns: [...action.turns]
1647
1651
  };
@@ -1653,6 +1657,7 @@ var createVoiceStreamStore = () => {
1653
1657
  scenarioId: action.scenarioId ?? state.scenarioId,
1654
1658
  isConnected: action.status === "active",
1655
1659
  sessionId: action.sessionId,
1660
+ sessionMetadata: action.sessionMetadata ?? state.sessionMetadata,
1656
1661
  status: action.status
1657
1662
  };
1658
1663
  break;
@@ -1759,6 +1764,9 @@ var createVoiceStream = (path, options = {}) => {
1759
1764
  get scenarioId() {
1760
1765
  return store.getSnapshot().scenarioId;
1761
1766
  },
1767
+ get sessionMetadata() {
1768
+ return store.getSnapshot().sessionMetadata;
1769
+ },
1762
1770
  start,
1763
1771
  get partial() {
1764
1772
  return store.getSnapshot().partial;
@@ -2265,6 +2273,7 @@ var createInitialState3 = (stream) => ({
2265
2273
  reconnect: stream.reconnect,
2266
2274
  recordingError: null,
2267
2275
  sessionId: stream.sessionId,
2276
+ sessionMetadata: stream.sessionMetadata,
2268
2277
  scenarioId: stream.scenarioId,
2269
2278
  status: stream.status,
2270
2279
  turns: [...stream.turns]
@@ -2294,6 +2303,7 @@ var createVoiceController = (path, options = {}) => {
2294
2303
  partial: stream.partial,
2295
2304
  reconnect: stream.reconnect,
2296
2305
  sessionId: stream.sessionId,
2306
+ sessionMetadata: stream.sessionMetadata,
2297
2307
  scenarioId: stream.scenarioId,
2298
2308
  status: stream.status,
2299
2309
  turns: [...stream.turns]
@@ -2400,6 +2410,9 @@ var createVoiceController = (path, options = {}) => {
2400
2410
  get sessionId() {
2401
2411
  return state.sessionId;
2402
2412
  },
2413
+ get sessionMetadata() {
2414
+ return state.sessionMetadata;
2415
+ },
2403
2416
  get scenarioId() {
2404
2417
  return state.scenarioId;
2405
2418
  },
package/dist/index.js CHANGED
@@ -3703,6 +3703,7 @@ var createVoiceSession = (options) => {
3703
3703
  partial: session.currentTurn.partialText,
3704
3704
  scenarioId: session.scenarioId,
3705
3705
  sessionId: options.id,
3706
+ sessionMetadata: session.metadata && typeof session.metadata === "object" ? session.metadata : undefined,
3706
3707
  status: session.status,
3707
3708
  turns: session.turns,
3708
3709
  type: "replay"
@@ -5048,6 +5049,7 @@ var createVoiceSession = (options) => {
5048
5049
  await send({
5049
5050
  sessionId: options.id,
5050
5051
  status: session.status,
5052
+ sessionMetadata: session.metadata && typeof session.metadata === "object" ? session.metadata : undefined,
5051
5053
  scenarioId: session.scenarioId,
5052
5054
  type: "session"
5053
5055
  });
@@ -5465,18 +5467,26 @@ var recommendVoiceProfileSwitch = (options) => {
5465
5467
  var applyVoiceProfileSwitchGuard = async (options) => {
5466
5468
  const mode = options.mode ?? "recommend";
5467
5469
  const minConfidence = options.minConfidence ?? 0.75;
5470
+ const maxAutoSwitchesPerSession = Math.max(0, Math.floor(options.maxAutoSwitchesPerSession ?? 1));
5471
+ const autoSwitchCount = Math.max(0, Math.floor(options.autoSwitchCount ?? 0));
5468
5472
  const recommendation = recommendVoiceProfileSwitch(options);
5469
5473
  const confidence = estimateSwitchConfidence(recommendation);
5470
5474
  const previousProfileId = recommendation.currentProfile?.profileId;
5471
5475
  const recommendedProfileId = recommendation.recommendedProfile?.profileId;
5472
- const canSwitch = recommendation.status === "switch" && recommendation.ok && Boolean(recommendedProfileId) && confidence >= minConfidence;
5473
- const action = recommendation.status === "stay" ? "stay" : canSwitch ? mode === "auto" ? "switch" : "recommend" : "blocked";
5476
+ const isRecommendedAllowed = !recommendedProfileId || !options.allowedProfileIds || options.allowedProfileIds.length === 0 || options.allowedProfileIds.includes(recommendedProfileId);
5477
+ const isRecommendedBlocked = recommendedProfileId ? Boolean(options.blockedProfileIds?.includes(recommendedProfileId)) : false;
5478
+ const blockedByPolicy = !isRecommendedAllowed ? "allowed-profiles" : isRecommendedBlocked ? "blocked-profiles" : mode === "auto" && autoSwitchCount >= maxAutoSwitchesPerSession ? "max-switches" : undefined;
5479
+ const canSwitch = mode !== "off" && recommendation.status === "switch" && recommendation.ok && Boolean(recommendedProfileId) && confidence >= minConfidence && !blockedByPolicy;
5480
+ const action = mode === "off" ? "disabled" : recommendation.status === "stay" ? "stay" : canSwitch ? mode === "auto" ? "switch" : "recommend" : "blocked";
5474
5481
  const selectedProfileId = action === "switch" ? recommendedProfileId : previousProfileId ?? recommendedProfileId;
5475
- const reason = action === "switch" ? `Auto-switched from ${previousProfileId ?? "unknown"} to ${recommendedProfileId}.` : action === "recommend" ? `Recommended ${recommendedProfileId} but left selection unchanged because mode is recommend.` : action === "blocked" ? `Blocked profile switch because confidence ${confidence} is below ${minConfidence} or evidence is incomplete.` : "Kept current profile because measured evidence does not require a switch.";
5482
+ const reason = action === "disabled" ? "Profile switch guard is disabled by policy." : action === "switch" ? `Auto-switched from ${previousProfileId ?? "unknown"} to ${recommendedProfileId}.` : action === "recommend" ? `Recommended ${recommendedProfileId} but left selection unchanged because mode is recommend.` : action === "blocked" ? blockedByPolicy === "allowed-profiles" ? `Blocked profile switch because ${recommendedProfileId} is not in the allowed profile list.` : blockedByPolicy === "blocked-profiles" ? `Blocked profile switch because ${recommendedProfileId} is in the blocked profile list.` : blockedByPolicy === "max-switches" ? `Blocked profile switch because the session already used ${autoSwitchCount} of ${maxAutoSwitchesPerSession} allowed automatic switch(es).` : `Blocked profile switch because confidence ${confidence} is below ${minConfidence} or evidence is incomplete.` : "Kept current profile because measured evidence does not require a switch.";
5476
5483
  const decision = {
5477
5484
  action,
5478
5485
  autoApplied: action === "switch",
5486
+ autoSwitchCount,
5487
+ blockedByPolicy,
5479
5488
  confidence,
5489
+ maxAutoSwitchesPerSession,
5480
5490
  minConfidence,
5481
5491
  mode,
5482
5492
  previousProfileId,
@@ -5494,10 +5504,13 @@ var applyVoiceProfileSwitchGuard = async (options) => {
5494
5504
  name: "AbsoluteJS Voice Profile Switch Guard"
5495
5505
  },
5496
5506
  metadata: options.metadata,
5497
- outcome: action === "blocked" ? "skipped" : "success",
5507
+ outcome: action === "blocked" || action === "disabled" ? "skipped" : "success",
5498
5508
  payload: {
5499
5509
  autoApplied: decision.autoApplied,
5510
+ autoSwitchCount,
5511
+ blockedByPolicy,
5500
5512
  confidence,
5513
+ maxAutoSwitchesPerSession,
5501
5514
  minConfidence,
5502
5515
  mode,
5503
5516
  previousProfileId,
@@ -5730,12 +5743,19 @@ var resolveProfileSwitchGuard = async (config, runtime, input) => {
5730
5743
  const currentProfileId = await resolveMaybeFunction(guard.currentProfileId, resolverInput);
5731
5744
  const metadata = await resolveMaybeFunction(guard.metadata, resolverInput);
5732
5745
  const minConfidence = await resolveMaybeFunction(guard.minConfidence, resolverInput);
5746
+ const maxAutoSwitchesPerSession = await resolveMaybeFunction(guard.maxAutoSwitchesPerSession, resolverInput);
5747
+ const allowedProfileIds = await resolveMaybeFunction(guard.allowedProfileIds, resolverInput);
5748
+ const blockedProfileIds = await resolveMaybeFunction(guard.blockedProfileIds, resolverInput);
5733
5749
  const mode = await resolveMaybeFunction(guard.mode, resolverInput);
5734
5750
  const decision = await applyVoiceProfileSwitchGuard({
5735
5751
  actor: guard.actor,
5752
+ allowedProfileIds,
5736
5753
  audit: guard.audit,
5754
+ autoSwitchCount: runtime.profileSwitchGuardAutoSwitchCounts.get(input.sessionId) ?? 0,
5755
+ blockedProfileIds,
5737
5756
  defaultProfileId: guard.defaultProfileId,
5738
5757
  defaults,
5758
+ maxAutoSwitchesPerSession,
5739
5759
  metadata,
5740
5760
  minConfidence,
5741
5761
  mode,
@@ -5745,6 +5765,9 @@ var resolveProfileSwitchGuard = async (config, runtime, input) => {
5745
5765
  },
5746
5766
  sessionId: input.sessionId
5747
5767
  });
5768
+ if (decision.autoApplied) {
5769
+ runtime.profileSwitchGuardAutoSwitchCounts.set(input.sessionId, decision.autoSwitchCount + 1);
5770
+ }
5748
5771
  await guard.onDecision?.({
5749
5772
  context: input.context,
5750
5773
  decision,
@@ -5762,7 +5785,10 @@ var resolveProfileSwitchGuard = async (config, runtime, input) => {
5762
5785
  payload: {
5763
5786
  action: decision.action,
5764
5787
  autoApplied: decision.autoApplied,
5788
+ autoSwitchCount: decision.autoSwitchCount,
5789
+ blockedByPolicy: decision.blockedByPolicy,
5765
5790
  confidence: decision.confidence,
5791
+ maxAutoSwitchesPerSession: decision.maxAutoSwitchesPerSession,
5766
5792
  minConfidence: decision.minConfidence,
5767
5793
  mode: decision.mode,
5768
5794
  previousProfileId: decision.previousProfileId,
@@ -5785,6 +5811,7 @@ var voice = (config) => {
5785
5811
  const runtime = {
5786
5812
  activeSessions: new Map,
5787
5813
  logger: resolveLogger(config.logger),
5814
+ profileSwitchGuardAutoSwitchCounts: new Map,
5788
5815
  profileSwitchGuardedSessions: new Set,
5789
5816
  socketSessions: new WeakMap
5790
5817
  };
@@ -36,15 +36,18 @@ export type VoiceProfileSwitchRecommendationOptions = {
36
36
  minImprovementMs?: number;
37
37
  observed?: VoiceProfileSwitchObservedSignals;
38
38
  };
39
- export type VoiceProfileSwitchGuardMode = 'auto' | 'recommend';
40
- export type VoiceProfileSwitchGuardAction = 'blocked' | 'recommend' | 'stay' | 'switch';
39
+ export type VoiceProfileSwitchGuardMode = 'auto' | 'off' | 'recommend';
40
+ export type VoiceProfileSwitchGuardAction = 'blocked' | 'disabled' | 'recommend' | 'stay' | 'switch';
41
41
  export type VoiceProfileSwitchGuardDecision = {
42
42
  action: VoiceProfileSwitchGuardAction;
43
43
  auditEvent?: StoredVoiceAuditEvent;
44
44
  autoApplied: boolean;
45
+ autoSwitchCount: number;
46
+ blockedByPolicy?: 'allowed-profiles' | 'blocked-profiles' | 'max-switches';
45
47
  confidence: number;
46
48
  minConfidence: number;
47
49
  mode: VoiceProfileSwitchGuardMode;
50
+ maxAutoSwitchesPerSession: number;
48
51
  previousProfileId?: string;
49
52
  reason: string;
50
53
  recommendation: VoiceProfileSwitchRecommendation;
@@ -53,7 +56,11 @@ export type VoiceProfileSwitchGuardDecision = {
53
56
  };
54
57
  export type VoiceProfileSwitchGuardOptions = VoiceProfileSwitchRecommendationOptions & {
55
58
  actor?: VoiceAuditActor;
59
+ allowedProfileIds?: string[];
56
60
  audit?: VoiceAuditEventStore;
61
+ autoSwitchCount?: number;
62
+ blockedProfileIds?: string[];
63
+ maxAutoSwitchesPerSession?: number;
57
64
  metadata?: Record<string, unknown>;
58
65
  minConfidence?: number;
59
66
  mode?: VoiceProfileSwitchGuardMode;
@@ -6363,6 +6363,7 @@ var serverMessageToAction = (message) => {
6363
6363
  partial: message.partial,
6364
6364
  scenarioId: message.scenarioId,
6365
6365
  sessionId: message.sessionId,
6366
+ sessionMetadata: message.sessionMetadata,
6366
6367
  status: message.status,
6367
6368
  turns: message.turns,
6368
6369
  type: "replay"
@@ -6370,6 +6371,7 @@ var serverMessageToAction = (message) => {
6370
6371
  case "session":
6371
6372
  return {
6372
6373
  sessionId: message.sessionId,
6374
+ sessionMetadata: message.sessionMetadata,
6373
6375
  scenarioId: message.scenarioId,
6374
6376
  status: message.status,
6375
6377
  type: "session"
@@ -7395,6 +7397,7 @@ var createInitialState = () => ({
7395
7397
  call: null,
7396
7398
  error: null,
7397
7399
  isConnected: false,
7400
+ sessionMetadata: null,
7398
7401
  scenarioId: null,
7399
7402
  partial: "",
7400
7403
  reconnect: createInitialReconnectState(),
@@ -7510,6 +7513,7 @@ var createVoiceStreamStore = () => {
7510
7513
  } : state.reconnect,
7511
7514
  scenarioId: action.scenarioId ?? state.scenarioId,
7512
7515
  sessionId: action.sessionId,
7516
+ sessionMetadata: action.sessionMetadata ?? state.sessionMetadata,
7513
7517
  status: action.status,
7514
7518
  turns: [...action.turns]
7515
7519
  };
@@ -7521,6 +7525,7 @@ var createVoiceStreamStore = () => {
7521
7525
  scenarioId: action.scenarioId ?? state.scenarioId,
7522
7526
  isConnected: action.status === "active",
7523
7527
  sessionId: action.sessionId,
7528
+ sessionMetadata: action.sessionMetadata ?? state.sessionMetadata,
7524
7529
  status: action.status
7525
7530
  };
7526
7531
  break;
@@ -7627,6 +7632,9 @@ var createVoiceStream = (path, options = {}) => {
7627
7632
  get scenarioId() {
7628
7633
  return store.getSnapshot().scenarioId;
7629
7634
  },
7635
+ get sessionMetadata() {
7636
+ return store.getSnapshot().sessionMetadata;
7637
+ },
7630
7638
  start,
7631
7639
  get partial() {
7632
7640
  return store.getSnapshot().partial;
@@ -7678,6 +7686,7 @@ var EMPTY_SNAPSHOT = {
7678
7686
  status: "idle"
7679
7687
  },
7680
7688
  sessionId: "",
7689
+ sessionMetadata: null,
7681
7690
  status: "idle",
7682
7691
  turns: []
7683
7692
  };
@@ -8170,6 +8179,7 @@ var createInitialState2 = (stream) => ({
8170
8179
  reconnect: stream.reconnect,
8171
8180
  recordingError: null,
8172
8181
  sessionId: stream.sessionId,
8182
+ sessionMetadata: stream.sessionMetadata,
8173
8183
  scenarioId: stream.scenarioId,
8174
8184
  status: stream.status,
8175
8185
  turns: [...stream.turns]
@@ -8199,6 +8209,7 @@ var createVoiceController = (path, options = {}) => {
8199
8209
  partial: stream.partial,
8200
8210
  reconnect: stream.reconnect,
8201
8211
  sessionId: stream.sessionId,
8212
+ sessionMetadata: stream.sessionMetadata,
8202
8213
  scenarioId: stream.scenarioId,
8203
8214
  status: stream.status,
8204
8215
  turns: [...stream.turns]
@@ -8305,6 +8316,9 @@ var createVoiceController = (path, options = {}) => {
8305
8316
  get sessionId() {
8306
8317
  return state.sessionId;
8307
8318
  },
8319
+ get sessionMetadata() {
8320
+ return state.sessionMetadata;
8321
+ },
8308
8322
  get scenarioId() {
8309
8323
  return state.scenarioId;
8310
8324
  },
@@ -9,6 +9,7 @@ export declare const useVoiceController: <TResult = unknown>(path: string, optio
9
9
  stopRecording: () => void;
10
10
  toggleRecording: () => Promise<void>;
11
11
  call: import("..").VoiceCallLifecycleState | null;
12
+ sessionMetadata: Record<string, unknown> | null;
12
13
  sessionId: string | null;
13
14
  scenarioId: string | null;
14
15
  status: import("..").VoiceSessionStatus | "idle";
@@ -5,6 +5,7 @@ export declare const useVoiceStream: <TResult = unknown>(path: string, options?:
5
5
  endTurn: () => void;
6
6
  sendAudio: (audio: Uint8Array | ArrayBuffer) => void;
7
7
  call: import("..").VoiceCallLifecycleState | null;
8
+ sessionMetadata: Record<string, unknown> | null;
8
9
  sessionId: string | null;
9
10
  scenarioId: string | null;
10
11
  status: import("..").VoiceSessionStatus | "idle";
@@ -3421,6 +3421,7 @@ var serverMessageToAction = (message) => {
3421
3421
  partial: message.partial,
3422
3422
  scenarioId: message.scenarioId,
3423
3423
  sessionId: message.sessionId,
3424
+ sessionMetadata: message.sessionMetadata,
3424
3425
  status: message.status,
3425
3426
  turns: message.turns,
3426
3427
  type: "replay"
@@ -3428,6 +3429,7 @@ var serverMessageToAction = (message) => {
3428
3429
  case "session":
3429
3430
  return {
3430
3431
  sessionId: message.sessionId,
3432
+ sessionMetadata: message.sessionMetadata,
3431
3433
  scenarioId: message.scenarioId,
3432
3434
  status: message.status,
3433
3435
  type: "session"
@@ -4453,6 +4455,7 @@ var createInitialState = () => ({
4453
4455
  call: null,
4454
4456
  error: null,
4455
4457
  isConnected: false,
4458
+ sessionMetadata: null,
4456
4459
  scenarioId: null,
4457
4460
  partial: "",
4458
4461
  reconnect: createInitialReconnectState(),
@@ -4568,6 +4571,7 @@ var createVoiceStreamStore = () => {
4568
4571
  } : state.reconnect,
4569
4572
  scenarioId: action.scenarioId ?? state.scenarioId,
4570
4573
  sessionId: action.sessionId,
4574
+ sessionMetadata: action.sessionMetadata ?? state.sessionMetadata,
4571
4575
  status: action.status,
4572
4576
  turns: [...action.turns]
4573
4577
  };
@@ -4579,6 +4583,7 @@ var createVoiceStreamStore = () => {
4579
4583
  scenarioId: action.scenarioId ?? state.scenarioId,
4580
4584
  isConnected: action.status === "active",
4581
4585
  sessionId: action.sessionId,
4586
+ sessionMetadata: action.sessionMetadata ?? state.sessionMetadata,
4582
4587
  status: action.status
4583
4588
  };
4584
4589
  break;
@@ -4685,6 +4690,9 @@ var createVoiceStream = (path, options = {}) => {
4685
4690
  get scenarioId() {
4686
4691
  return store.getSnapshot().scenarioId;
4687
4692
  },
4693
+ get sessionMetadata() {
4694
+ return store.getSnapshot().sessionMetadata;
4695
+ },
4688
4696
  start,
4689
4697
  get partial() {
4690
4698
  return store.getSnapshot().partial;
@@ -6489,6 +6497,7 @@ var createInitialState2 = (stream) => ({
6489
6497
  reconnect: stream.reconnect,
6490
6498
  recordingError: null,
6491
6499
  sessionId: stream.sessionId,
6500
+ sessionMetadata: stream.sessionMetadata,
6492
6501
  scenarioId: stream.scenarioId,
6493
6502
  status: stream.status,
6494
6503
  turns: [...stream.turns]
@@ -6518,6 +6527,7 @@ var createVoiceController = (path, options = {}) => {
6518
6527
  partial: stream.partial,
6519
6528
  reconnect: stream.reconnect,
6520
6529
  sessionId: stream.sessionId,
6530
+ sessionMetadata: stream.sessionMetadata,
6521
6531
  scenarioId: stream.scenarioId,
6522
6532
  status: stream.status,
6523
6533
  turns: [...stream.turns]
@@ -6624,6 +6634,9 @@ var createVoiceController = (path, options = {}) => {
6624
6634
  get sessionId() {
6625
6635
  return state.sessionId;
6626
6636
  },
6637
+ get sessionMetadata() {
6638
+ return state.sessionMetadata;
6639
+ },
6627
6640
  get scenarioId() {
6628
6641
  return state.scenarioId;
6629
6642
  },
@@ -2138,6 +2138,7 @@ var serverMessageToAction = (message) => {
2138
2138
  partial: message.partial,
2139
2139
  scenarioId: message.scenarioId,
2140
2140
  sessionId: message.sessionId,
2141
+ sessionMetadata: message.sessionMetadata,
2141
2142
  status: message.status,
2142
2143
  turns: message.turns,
2143
2144
  type: "replay"
@@ -2145,6 +2146,7 @@ var serverMessageToAction = (message) => {
2145
2146
  case "session":
2146
2147
  return {
2147
2148
  sessionId: message.sessionId,
2149
+ sessionMetadata: message.sessionMetadata,
2148
2150
  scenarioId: message.scenarioId,
2149
2151
  status: message.status,
2150
2152
  type: "session"
@@ -3170,6 +3172,7 @@ var createInitialState2 = () => ({
3170
3172
  call: null,
3171
3173
  error: null,
3172
3174
  isConnected: false,
3175
+ sessionMetadata: null,
3173
3176
  scenarioId: null,
3174
3177
  partial: "",
3175
3178
  reconnect: createInitialReconnectState(),
@@ -3285,6 +3288,7 @@ var createVoiceStreamStore = () => {
3285
3288
  } : state.reconnect,
3286
3289
  scenarioId: action.scenarioId ?? state.scenarioId,
3287
3290
  sessionId: action.sessionId,
3291
+ sessionMetadata: action.sessionMetadata ?? state.sessionMetadata,
3288
3292
  status: action.status,
3289
3293
  turns: [...action.turns]
3290
3294
  };
@@ -3296,6 +3300,7 @@ var createVoiceStreamStore = () => {
3296
3300
  scenarioId: action.scenarioId ?? state.scenarioId,
3297
3301
  isConnected: action.status === "active",
3298
3302
  sessionId: action.sessionId,
3303
+ sessionMetadata: action.sessionMetadata ?? state.sessionMetadata,
3299
3304
  status: action.status
3300
3305
  };
3301
3306
  break;
@@ -3402,6 +3407,9 @@ var createVoiceStream = (path, options = {}) => {
3402
3407
  get scenarioId() {
3403
3408
  return store.getSnapshot().scenarioId;
3404
3409
  },
3410
+ get sessionMetadata() {
3411
+ return store.getSnapshot().sessionMetadata;
3412
+ },
3405
3413
  start,
3406
3414
  get partial() {
3407
3415
  return store.getSnapshot().partial;
@@ -3767,6 +3775,7 @@ var createInitialState3 = (stream) => ({
3767
3775
  reconnect: stream.reconnect,
3768
3776
  recordingError: null,
3769
3777
  sessionId: stream.sessionId,
3778
+ sessionMetadata: stream.sessionMetadata,
3770
3779
  scenarioId: stream.scenarioId,
3771
3780
  status: stream.status,
3772
3781
  turns: [...stream.turns]
@@ -3796,6 +3805,7 @@ var createVoiceController = (path, options = {}) => {
3796
3805
  partial: stream.partial,
3797
3806
  reconnect: stream.reconnect,
3798
3807
  sessionId: stream.sessionId,
3808
+ sessionMetadata: stream.sessionMetadata,
3799
3809
  scenarioId: stream.scenarioId,
3800
3810
  status: stream.status,
3801
3811
  turns: [...stream.turns]
@@ -3902,6 +3912,9 @@ var createVoiceController = (path, options = {}) => {
3902
3912
  get sessionId() {
3903
3913
  return state.sessionId;
3904
3914
  },
3915
+ get sessionMetadata() {
3916
+ return state.sessionMetadata;
3917
+ },
3905
3918
  get scenarioId() {
3906
3919
  return state.scenarioId;
3907
3920
  },
@@ -6272,6 +6285,7 @@ var createVoiceSession = (options) => {
6272
6285
  partial: session.currentTurn.partialText,
6273
6286
  scenarioId: session.scenarioId,
6274
6287
  sessionId: options.id,
6288
+ sessionMetadata: session.metadata && typeof session.metadata === "object" ? session.metadata : undefined,
6275
6289
  status: session.status,
6276
6290
  turns: session.turns,
6277
6291
  type: "replay"
@@ -7617,6 +7631,7 @@ var createVoiceSession = (options) => {
7617
7631
  await send({
7618
7632
  sessionId: options.id,
7619
7633
  status: session.status,
7634
+ sessionMetadata: session.metadata && typeof session.metadata === "object" ? session.metadata : undefined,
7620
7635
  scenarioId: session.scenarioId,
7621
7636
  type: "session"
7622
7637
  });
package/dist/types.d.ts CHANGED
@@ -624,12 +624,15 @@ export type VoiceProfileSwitchGuardResolverInput<TContext = unknown> = {
624
624
  };
625
625
  export type VoicePluginProfileSwitchGuardConfig<TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown> = {
626
626
  actor?: VoiceAuditActor;
627
+ allowedProfileIds?: string[] | ((input: VoiceProfileSwitchGuardResolverInput<TContext>) => Promise<string[] | undefined> | string[] | undefined);
627
628
  audit?: VoiceAuditEventStore;
629
+ blockedProfileIds?: string[] | ((input: VoiceProfileSwitchGuardResolverInput<TContext>) => Promise<string[] | undefined> | string[] | undefined);
628
630
  currentProfileId?: string | ((input: VoiceProfileSwitchGuardResolverInput<TContext>) => Promise<string | undefined> | string | undefined);
629
631
  defaultProfileId?: string;
630
632
  defaults: VoiceRealCallProfileDefaultsReport | VoiceRealCallProfileHistoryReport | ((input: VoiceProfileSwitchGuardResolverInput<TContext>) => Promise<VoiceRealCallProfileDefaultsReport | VoiceRealCallProfileHistoryReport> | VoiceRealCallProfileDefaultsReport | VoiceRealCallProfileHistoryReport);
631
633
  metadata?: Record<string, unknown> | ((input: VoiceProfileSwitchGuardResolverInput<TContext>) => Promise<Record<string, unknown> | undefined> | Record<string, unknown> | undefined);
632
634
  minConfidence?: number | ((input: VoiceProfileSwitchGuardResolverInput<TContext>) => Promise<number | undefined> | number | undefined);
635
+ maxAutoSwitchesPerSession?: number | ((input: VoiceProfileSwitchGuardResolverInput<TContext>) => Promise<number | undefined> | number | undefined);
633
636
  mode?: VoiceProfileSwitchGuardMode | ((input: VoiceProfileSwitchGuardResolverInput<TContext>) => Promise<VoiceProfileSwitchGuardMode | undefined> | VoiceProfileSwitchGuardMode | undefined);
634
637
  observed?: VoiceProfileSwitchObservedSignals | ((input: VoiceProfileSwitchGuardResolverInput<TContext>) => Promise<VoiceProfileSwitchObservedSignals | undefined> | VoiceProfileSwitchObservedSignals | undefined);
635
638
  onDecision?: (input: {
@@ -734,6 +737,7 @@ export type VoiceServerSessionMessage = {
734
737
  sessionId: string;
735
738
  status: VoiceSessionStatus;
736
739
  scenarioId?: string;
740
+ sessionMetadata?: Record<string, unknown>;
737
741
  };
738
742
  export type VoiceServerReplayMessage<TResult = unknown> = {
739
743
  type: 'replay';
@@ -742,6 +746,7 @@ export type VoiceServerReplayMessage<TResult = unknown> = {
742
746
  partial: string;
743
747
  scenarioId?: string;
744
748
  sessionId: string;
749
+ sessionMetadata?: Record<string, unknown>;
745
750
  status: VoiceSessionStatus;
746
751
  turns: VoiceTurnRecord<TResult>[];
747
752
  };
@@ -931,6 +936,7 @@ export type VoiceHTMXOptions<TSession extends VoiceSessionRecord = VoiceSessionR
931
936
  export type VoiceHTMXConfig<TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown> = VoiceHTMXRenderer<TSession, TResult> | VoiceHTMXOptions<TSession, TResult>;
932
937
  export type VoiceStreamState<TResult = unknown> = {
933
938
  call: VoiceCallLifecycleState | null;
939
+ sessionMetadata: Record<string, unknown> | null;
934
940
  sessionId: string | null;
935
941
  scenarioId: string | null;
936
942
  status: VoiceSessionStatus | 'idle';
@@ -964,6 +970,7 @@ export type VoiceStream<TResult = unknown> = {
964
970
  reconnect: VoiceReconnectClientState;
965
971
  sendAudio: (audio: Uint8Array | ArrayBuffer) => void;
966
972
  sessionId: string | null;
973
+ sessionMetadata: Record<string, unknown> | null;
967
974
  scenarioId: string | null;
968
975
  status: VoiceSessionStatus | 'idle';
969
976
  subscribe: (subscriber: () => void) => () => void;
@@ -1035,6 +1042,7 @@ export type VoiceController<TResult = unknown> = {
1035
1042
  recordingError: string | null;
1036
1043
  sendAudio: (audio: Uint8Array | ArrayBuffer) => void;
1037
1044
  sessionId: string | null;
1045
+ sessionMetadata: Record<string, unknown> | null;
1038
1046
  scenarioId: string | null;
1039
1047
  startRecording: () => Promise<void>;
1040
1048
  status: VoiceSessionStatus | 'idle';
@@ -1063,6 +1071,7 @@ export type VoiceHTMXBindingOptions = {
1063
1071
  export type VoiceStoreAction<TResult = unknown> = {
1064
1072
  type: 'session';
1065
1073
  sessionId: string;
1074
+ sessionMetadata?: Record<string, unknown>;
1066
1075
  scenarioId?: string;
1067
1076
  status: VoiceSessionStatus;
1068
1077
  } | {
@@ -1072,6 +1081,7 @@ export type VoiceStoreAction<TResult = unknown> = {
1072
1081
  partial: string;
1073
1082
  scenarioId?: string;
1074
1083
  sessionId: string;
1084
+ sessionMetadata?: Record<string, unknown>;
1075
1085
  status: VoiceSessionStatus;
1076
1086
  turns: VoiceTurnRecord<TResult>[];
1077
1087
  } | {
package/dist/vue/index.js CHANGED
@@ -5743,6 +5743,7 @@ var serverMessageToAction = (message) => {
5743
5743
  partial: message.partial,
5744
5744
  scenarioId: message.scenarioId,
5745
5745
  sessionId: message.sessionId,
5746
+ sessionMetadata: message.sessionMetadata,
5746
5747
  status: message.status,
5747
5748
  turns: message.turns,
5748
5749
  type: "replay"
@@ -5750,6 +5751,7 @@ var serverMessageToAction = (message) => {
5750
5751
  case "session":
5751
5752
  return {
5752
5753
  sessionId: message.sessionId,
5754
+ sessionMetadata: message.sessionMetadata,
5753
5755
  scenarioId: message.scenarioId,
5754
5756
  status: message.status,
5755
5757
  type: "session"
@@ -6775,6 +6777,7 @@ var createInitialState = () => ({
6775
6777
  call: null,
6776
6778
  error: null,
6777
6779
  isConnected: false,
6780
+ sessionMetadata: null,
6778
6781
  scenarioId: null,
6779
6782
  partial: "",
6780
6783
  reconnect: createInitialReconnectState(),
@@ -6890,6 +6893,7 @@ var createVoiceStreamStore = () => {
6890
6893
  } : state.reconnect,
6891
6894
  scenarioId: action.scenarioId ?? state.scenarioId,
6892
6895
  sessionId: action.sessionId,
6896
+ sessionMetadata: action.sessionMetadata ?? state.sessionMetadata,
6893
6897
  status: action.status,
6894
6898
  turns: [...action.turns]
6895
6899
  };
@@ -6901,6 +6905,7 @@ var createVoiceStreamStore = () => {
6901
6905
  scenarioId: action.scenarioId ?? state.scenarioId,
6902
6906
  isConnected: action.status === "active",
6903
6907
  sessionId: action.sessionId,
6908
+ sessionMetadata: action.sessionMetadata ?? state.sessionMetadata,
6904
6909
  status: action.status
6905
6910
  };
6906
6911
  break;
@@ -7007,6 +7012,9 @@ var createVoiceStream = (path, options = {}) => {
7007
7012
  get scenarioId() {
7008
7013
  return store.getSnapshot().scenarioId;
7009
7014
  },
7015
+ get sessionMetadata() {
7016
+ return store.getSnapshot().sessionMetadata;
7017
+ },
7010
7018
  start,
7011
7019
  get partial() {
7012
7020
  return store.getSnapshot().partial;
@@ -7055,6 +7063,7 @@ function useVoiceStream(path, options = {}) {
7055
7063
  const partial = ref13("");
7056
7064
  const reconnect = shallowRef16(stream.reconnect);
7057
7065
  const sessionId = ref13(stream.sessionId);
7066
+ const sessionMetadata = shallowRef16(stream.sessionMetadata);
7058
7067
  const status = ref13(stream.status);
7059
7068
  const turns = shallowRef16([]);
7060
7069
  const sync = () => {
@@ -7066,6 +7075,7 @@ function useVoiceStream(path, options = {}) {
7066
7075
  partial.value = stream.partial;
7067
7076
  reconnect.value = stream.reconnect;
7068
7077
  sessionId.value = stream.sessionId;
7078
+ sessionMetadata.value = stream.sessionMetadata;
7069
7079
  status.value = stream.status;
7070
7080
  turns.value = [...stream.turns];
7071
7081
  };
@@ -7089,6 +7099,7 @@ function useVoiceStream(path, options = {}) {
7089
7099
  reconnect,
7090
7100
  sendAudio: (audio) => stream.sendAudio(audio),
7091
7101
  sessionId,
7102
+ sessionMetadata,
7092
7103
  status,
7093
7104
  turns
7094
7105
  };
@@ -7566,6 +7577,7 @@ var createInitialState2 = (stream) => ({
7566
7577
  reconnect: stream.reconnect,
7567
7578
  recordingError: null,
7568
7579
  sessionId: stream.sessionId,
7580
+ sessionMetadata: stream.sessionMetadata,
7569
7581
  scenarioId: stream.scenarioId,
7570
7582
  status: stream.status,
7571
7583
  turns: [...stream.turns]
@@ -7595,6 +7607,7 @@ var createVoiceController = (path, options = {}) => {
7595
7607
  partial: stream.partial,
7596
7608
  reconnect: stream.reconnect,
7597
7609
  sessionId: stream.sessionId,
7610
+ sessionMetadata: stream.sessionMetadata,
7598
7611
  scenarioId: stream.scenarioId,
7599
7612
  status: stream.status,
7600
7613
  turns: [...stream.turns]
@@ -7701,6 +7714,9 @@ var createVoiceController = (path, options = {}) => {
7701
7714
  get sessionId() {
7702
7715
  return state.sessionId;
7703
7716
  },
7717
+ get sessionMetadata() {
7718
+ return state.sessionMetadata;
7719
+ },
7704
7720
  get scenarioId() {
7705
7721
  return state.scenarioId;
7706
7722
  },
@@ -22,6 +22,7 @@ export declare function useVoiceStream<TResult = unknown>(path: string, options?
22
22
  reconnect: import("vue").ShallowRef<import("..").VoiceReconnectClientState, import("..").VoiceReconnectClientState>;
23
23
  sendAudio: (audio: Uint8Array | ArrayBuffer) => void;
24
24
  sessionId: import("vue").Ref<string | null, string | null>;
25
+ sessionMetadata: import("vue").ShallowRef<Record<string, unknown> | null, Record<string, unknown> | null>;
25
26
  status: import("vue").Ref<import("..").VoiceSessionStatus | "idle", import("..").VoiceSessionStatus | "idle">;
26
27
  turns: import("vue").ShallowRef<VoiceTurnRecord<TResult>[], VoiceTurnRecord<TResult>[]>;
27
28
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.357",
3
+ "version": "0.0.22-beta.359",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",