@liforma/client 0.2.1 → 0.4.0

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 (189) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +42 -2
  3. package/dist/byo/audioCapture.d.ts +24 -0
  4. package/dist/byo/audioCapture.d.ts.map +1 -0
  5. package/dist/byo/index.d.ts +8 -0
  6. package/dist/byo/index.d.ts.map +1 -0
  7. package/dist/byo/index.js +307 -0
  8. package/dist/byo/index.js.map +1 -0
  9. package/dist/byo/mic.d.ts +27 -0
  10. package/dist/byo/mic.d.ts.map +1 -0
  11. package/dist/byo/pcm.d.ts +33 -0
  12. package/dist/byo/pcm.d.ts.map +1 -0
  13. package/dist/byo/pcmCarry.d.ts +17 -0
  14. package/dist/byo/pcmCarry.d.ts.map +1 -0
  15. package/dist/byo/resample.d.ts +18 -0
  16. package/dist/byo/resample.d.ts.map +1 -0
  17. package/dist/byo/turn.d.ts +39 -0
  18. package/dist/byo/turn.d.ts.map +1 -0
  19. package/dist/byo/types.d.ts +74 -0
  20. package/dist/byo/types.d.ts.map +1 -0
  21. package/dist/deepgram/connectDeepgramAgent.d.ts +51 -0
  22. package/dist/deepgram/connectDeepgramAgent.d.ts.map +1 -0
  23. package/dist/deepgram/deepgramAgentMessages.d.ts +31 -0
  24. package/dist/deepgram/deepgramAgentMessages.d.ts.map +1 -0
  25. package/dist/deepgram/index.d.ts +4 -0
  26. package/dist/deepgram/index.d.ts.map +1 -0
  27. package/dist/deepgram/index.js +142 -0
  28. package/dist/deepgram/index.js.map +1 -0
  29. package/dist/elevenlabs/connectElevenLabsAgent.d.ts +23 -0
  30. package/dist/elevenlabs/connectElevenLabsAgent.d.ts.map +1 -0
  31. package/dist/elevenlabs/index.d.ts +4 -0
  32. package/dist/elevenlabs/index.d.ts.map +1 -0
  33. package/dist/elevenlabs/index.js +89 -0
  34. package/dist/elevenlabs/index.js.map +1 -0
  35. package/dist/google/connectGeminiLive.d.ts +34 -0
  36. package/dist/google/connectGeminiLive.d.ts.map +1 -0
  37. package/dist/google/index.d.ts +4 -0
  38. package/dist/google/index.d.ts.map +1 -0
  39. package/dist/google/index.js +98 -0
  40. package/dist/google/index.js.map +1 -0
  41. package/dist/livekit/connectLiveKitAgent.d.ts +46 -0
  42. package/dist/livekit/connectLiveKitAgent.d.ts.map +1 -0
  43. package/dist/livekit/index.d.ts +3 -0
  44. package/dist/livekit/index.d.ts.map +1 -0
  45. package/dist/livekit/index.js +113 -0
  46. package/dist/livekit/index.js.map +1 -0
  47. package/dist/next/byo/audioCapture.d.ts +24 -0
  48. package/dist/next/byo/audioCapture.d.ts.map +1 -0
  49. package/dist/next/byo/pcm.d.ts +33 -0
  50. package/dist/next/byo/pcm.d.ts.map +1 -0
  51. package/dist/next/byo/resample.d.ts +18 -0
  52. package/dist/next/byo/resample.d.ts.map +1 -0
  53. package/dist/next/index.js +2298 -1440
  54. package/dist/next/index.js.map +1 -1
  55. package/dist/next/react/ExperienceThumbnail.d.ts.map +1 -1
  56. package/dist/next/thumbnail/index.d.ts +2 -1
  57. package/dist/next/thumbnail/index.d.ts.map +1 -1
  58. package/dist/next/thumbnail/lazyLoad.d.ts +2 -0
  59. package/dist/next/thumbnail/lazyLoad.d.ts.map +1 -1
  60. package/dist/next/thumbnail/lazyLoad.test.d.ts +2 -0
  61. package/dist/next/thumbnail/lazyLoad.test.d.ts.map +1 -0
  62. package/dist/next/thumbnail/scrollParallax.d.ts +6 -1
  63. package/dist/next/thumbnail/scrollParallax.d.ts.map +1 -1
  64. package/dist/next/thumbnail/styles.d.ts.map +1 -1
  65. package/dist/next/thumbnail/thumbLoadScheduler.d.ts +14 -0
  66. package/dist/next/thumbnail/thumbLoadScheduler.d.ts.map +1 -0
  67. package/dist/next/v2/embed/iframeHost.d.ts +49 -3
  68. package/dist/next/v2/embed/iframeHost.d.ts.map +1 -1
  69. package/dist/next/v2/embed/playerReachability.d.ts +1 -1
  70. package/dist/next/v2/embed/playerReachability.d.ts.map +1 -1
  71. package/dist/next/v2/embed/protocol.d.ts +94 -1
  72. package/dist/next/v2/embed/protocol.d.ts.map +1 -1
  73. package/dist/next/v2/experience.d.ts +21 -5
  74. package/dist/next/v2/experience.d.ts.map +1 -1
  75. package/dist/next/v2/speech/captureMediaStreamTrack.d.ts +17 -0
  76. package/dist/next/v2/speech/captureMediaStreamTrack.d.ts.map +1 -0
  77. package/dist/next/v2/speech/index.d.ts +4 -0
  78. package/dist/next/v2/speech/index.d.ts.map +1 -0
  79. package/dist/next/v2/speech/speechController.d.ts +16 -0
  80. package/dist/next/v2/speech/speechController.d.ts.map +1 -0
  81. package/dist/next/v2/speech/types.d.ts +189 -0
  82. package/dist/next/v2/speech/types.d.ts.map +1 -0
  83. package/dist/next/v2/types/sessionInteraction.d.ts +6 -3
  84. package/dist/next/v2/types/sessionInteraction.d.ts.map +1 -1
  85. package/dist/next/widget/mountExperienceWidget.d.ts.map +1 -1
  86. package/dist/next/widget/styles.d.ts +1 -1
  87. package/dist/next/widget/styles.d.ts.map +1 -1
  88. package/dist/npm/byo/audioCapture.d.ts +24 -0
  89. package/dist/npm/byo/audioCapture.d.ts.map +1 -0
  90. package/dist/npm/byo/pcm.d.ts +33 -0
  91. package/dist/npm/byo/pcm.d.ts.map +1 -0
  92. package/dist/npm/byo/resample.d.ts +18 -0
  93. package/dist/npm/byo/resample.d.ts.map +1 -0
  94. package/dist/npm/index.js +2061 -1203
  95. package/dist/npm/index.js.map +1 -1
  96. package/dist/npm/thumbnail/index.d.ts +2 -1
  97. package/dist/npm/thumbnail/index.d.ts.map +1 -1
  98. package/dist/npm/thumbnail/lazyLoad.d.ts +2 -0
  99. package/dist/npm/thumbnail/lazyLoad.d.ts.map +1 -1
  100. package/dist/npm/thumbnail/scrollParallax.d.ts +6 -1
  101. package/dist/npm/thumbnail/scrollParallax.d.ts.map +1 -1
  102. package/dist/npm/thumbnail/styles.d.ts.map +1 -1
  103. package/dist/npm/thumbnail/thumbLoadScheduler.d.ts +14 -0
  104. package/dist/npm/thumbnail/thumbLoadScheduler.d.ts.map +1 -0
  105. package/dist/npm/v2/embed/iframeHost.d.ts +49 -3
  106. package/dist/npm/v2/embed/iframeHost.d.ts.map +1 -1
  107. package/dist/npm/v2/embed/playerReachability.d.ts +1 -1
  108. package/dist/npm/v2/embed/playerReachability.d.ts.map +1 -1
  109. package/dist/npm/v2/embed/protocol.d.ts +94 -1
  110. package/dist/npm/v2/embed/protocol.d.ts.map +1 -1
  111. package/dist/npm/v2/experience.d.ts +21 -5
  112. package/dist/npm/v2/experience.d.ts.map +1 -1
  113. package/dist/npm/v2/index.d.ts +4 -1
  114. package/dist/npm/v2/index.d.ts.map +1 -1
  115. package/dist/npm/v2/liforma-experience-thumbnail.d.ts.map +1 -1
  116. package/dist/npm/v2/npm.d.ts +4 -2
  117. package/dist/npm/v2/npm.d.ts.map +1 -1
  118. package/dist/npm/v2/speech/captureMediaStreamTrack.d.ts +17 -0
  119. package/dist/npm/v2/speech/captureMediaStreamTrack.d.ts.map +1 -0
  120. package/dist/npm/v2/speech/index.d.ts +4 -0
  121. package/dist/npm/v2/speech/index.d.ts.map +1 -0
  122. package/dist/npm/v2/speech/speechController.d.ts +16 -0
  123. package/dist/npm/v2/speech/speechController.d.ts.map +1 -0
  124. package/dist/npm/v2/speech/types.d.ts +189 -0
  125. package/dist/npm/v2/speech/types.d.ts.map +1 -0
  126. package/dist/npm/v2/types/sessionInteraction.d.ts +6 -3
  127. package/dist/npm/v2/types/sessionInteraction.d.ts.map +1 -1
  128. package/dist/npm/widget/mountExperienceWidget.d.ts.map +1 -1
  129. package/dist/npm/widget/styles.d.ts +1 -1
  130. package/dist/npm/widget/styles.d.ts.map +1 -1
  131. package/dist/openai/connectOpenAiRealtime.d.ts +41 -0
  132. package/dist/openai/connectOpenAiRealtime.d.ts.map +1 -0
  133. package/dist/openai/connectOpenAiRealtimeWebRtc.d.ts +37 -0
  134. package/dist/openai/connectOpenAiRealtimeWebRtc.d.ts.map +1 -0
  135. package/dist/openai/index.d.ts +5 -0
  136. package/dist/openai/index.d.ts.map +1 -0
  137. package/dist/openai/index.js +282 -0
  138. package/dist/openai/index.js.map +1 -0
  139. package/dist/react/byo/audioCapture.d.ts +24 -0
  140. package/dist/react/byo/audioCapture.d.ts.map +1 -0
  141. package/dist/react/byo/pcm.d.ts +33 -0
  142. package/dist/react/byo/pcm.d.ts.map +1 -0
  143. package/dist/react/byo/resample.d.ts +18 -0
  144. package/dist/react/byo/resample.d.ts.map +1 -0
  145. package/dist/react/component/experienceComponentTypes.d.ts +2 -2
  146. package/dist/react/component/experienceComponentTypes.d.ts.map +1 -1
  147. package/dist/react/index.js +2357 -1490
  148. package/dist/react/index.js.map +1 -1
  149. package/dist/react/react/Experience.d.ts.map +1 -1
  150. package/dist/react/react/ExperienceThumbnail.d.ts.map +1 -1
  151. package/dist/react/thumbnail/index.d.ts +2 -1
  152. package/dist/react/thumbnail/index.d.ts.map +1 -1
  153. package/dist/react/thumbnail/lazyLoad.d.ts +2 -0
  154. package/dist/react/thumbnail/lazyLoad.d.ts.map +1 -1
  155. package/dist/react/thumbnail/lazyLoad.test.d.ts +2 -0
  156. package/dist/react/thumbnail/lazyLoad.test.d.ts.map +1 -0
  157. package/dist/react/thumbnail/scrollParallax.d.ts +6 -1
  158. package/dist/react/thumbnail/scrollParallax.d.ts.map +1 -1
  159. package/dist/react/thumbnail/styles.d.ts.map +1 -1
  160. package/dist/react/thumbnail/thumbLoadScheduler.d.ts +14 -0
  161. package/dist/react/thumbnail/thumbLoadScheduler.d.ts.map +1 -0
  162. package/dist/react/v2/embed/iframeHost.d.ts +49 -3
  163. package/dist/react/v2/embed/iframeHost.d.ts.map +1 -1
  164. package/dist/react/v2/embed/playerReachability.d.ts +1 -1
  165. package/dist/react/v2/embed/playerReachability.d.ts.map +1 -1
  166. package/dist/react/v2/embed/protocol.d.ts +94 -1
  167. package/dist/react/v2/embed/protocol.d.ts.map +1 -1
  168. package/dist/react/v2/experience.d.ts +21 -5
  169. package/dist/react/v2/experience.d.ts.map +1 -1
  170. package/dist/react/v2/speech/captureMediaStreamTrack.d.ts +17 -0
  171. package/dist/react/v2/speech/captureMediaStreamTrack.d.ts.map +1 -0
  172. package/dist/react/v2/speech/index.d.ts +4 -0
  173. package/dist/react/v2/speech/index.d.ts.map +1 -0
  174. package/dist/react/v2/speech/speechController.d.ts +16 -0
  175. package/dist/react/v2/speech/speechController.d.ts.map +1 -0
  176. package/dist/react/v2/speech/types.d.ts +189 -0
  177. package/dist/react/v2/speech/types.d.ts.map +1 -0
  178. package/dist/react/v2/types/sessionInteraction.d.ts +6 -3
  179. package/dist/react/v2/types/sessionInteraction.d.ts.map +1 -1
  180. package/dist/react/v2/types/sessionManifestSchema.d.ts +1 -1
  181. package/dist/react/widget/mountExperienceWidget.d.ts.map +1 -1
  182. package/dist/react/widget/styles.d.ts +1 -1
  183. package/dist/react/widget/styles.d.ts.map +1 -1
  184. package/dist/sdk/v2/client.js +44 -13
  185. package/dist/sdk/v2/client.js.map +1 -1
  186. package/dist/svelte/Experience.svelte +18 -5
  187. package/dist/svelte/Experience.svelte.d.ts +7 -2
  188. package/dist/svelte/ExperienceThumbnail.svelte +3 -6
  189. package/package.json +57 -7
@@ -0,0 +1,189 @@
1
+ /**
2
+ * Phase A public speech contract for Experience.speech
3
+ * (docs/plans/2026/08/experience-play-audio-api.plan.md).
4
+ */
5
+ export type SpeechAudioFormat = {
6
+ readonly encoding: 'pcm_s16le';
7
+ readonly sampleRate: number;
8
+ readonly channels: 1;
9
+ };
10
+ /** Complete one-shot ops only (`speak` / `play`). */
11
+ export type CompleteSpeechQueuePolicy = 'append' | 'replace-active' | 'replace-all';
12
+ /** Live streams only — `append` is forbidden. */
13
+ export type StreamingSpeechQueuePolicy = 'replace-active' | 'replace-all';
14
+ export type SpeechTerminalStatus = 'completed' | 'interrupted' | 'cancelled' | 'destroyed';
15
+ export type SpeechAnimationMode = 'tracked' | 'partially-tracked' | 'energy-fallback' | 'none';
16
+ export type SpeechResult = {
17
+ readonly utteranceId: string;
18
+ readonly characterId: string;
19
+ readonly status: SpeechTerminalStatus;
20
+ readonly durationMs: number;
21
+ readonly transcript?: string;
22
+ readonly animation: {
23
+ readonly mode: SpeechAnimationMode;
24
+ readonly trackedDurationMs: number;
25
+ readonly fallbackDurationMs: number;
26
+ readonly warningCodes?: readonly string[];
27
+ };
28
+ };
29
+ export type SpeechInterruptOptions = {
30
+ readonly utteranceId: string;
31
+ } | {
32
+ readonly characterId: string;
33
+ } | {
34
+ readonly scope?: 'active' | 'all';
35
+ };
36
+ export type SpeechSpeakOptions = {
37
+ readonly text: string;
38
+ readonly characterId?: string;
39
+ readonly queue?: CompleteSpeechQueuePolicy;
40
+ readonly signal?: AbortSignal;
41
+ };
42
+ /** Raw PCM one-shot (Phase A). */
43
+ export type SpeechPlayPcmAudio = {
44
+ readonly data: ArrayBuffer | Uint8Array;
45
+ readonly format: SpeechAudioFormat;
46
+ };
47
+ /**
48
+ * Encoded media bytes (wav/mp3/…). Player decodes via Web Audio — not api/models.
49
+ * `encoding` is a MIME type such as `audio/mpeg` or `audio/wav`.
50
+ */
51
+ export type SpeechPlayEncodedAudio = {
52
+ readonly data: ArrayBuffer | Uint8Array | Blob;
53
+ readonly encoding: string;
54
+ /** Preferred pcm sample rate after decode (default 24000 when decoded rate is unsupported). */
55
+ readonly sampleRate?: number;
56
+ };
57
+ /** Fetch + decode in the player (URL must allow CORS from player.liforma.ai). */
58
+ export type SpeechPlayUrlAudio = {
59
+ readonly url: string;
60
+ readonly sampleRate?: number;
61
+ };
62
+ /**
63
+ * Live audio track. Captured to PCM in the **host** SDK (not transferable across the embed).
64
+ * Prefer `createUtterance({ track })` for long streams; `play({ audio: { track } })` runs until
65
+ * the track ends then closes the utterance.
66
+ */
67
+ export type SpeechPlayMediaStreamAudio = {
68
+ readonly track: MediaStreamTrack;
69
+ /** Target pcm sample rate after capture (default 24000). */
70
+ readonly sampleRate?: number;
71
+ };
72
+ export type SpeechPlayAudio = SpeechPlayPcmAudio | SpeechPlayEncodedAudio | SpeechPlayUrlAudio | SpeechPlayMediaStreamAudio;
73
+ export type SpeechPlayOptions = {
74
+ readonly audio: SpeechPlayAudio;
75
+ readonly characterId?: string;
76
+ readonly transcript?: string;
77
+ readonly history?: 'none' | 'commit';
78
+ readonly queue?: CompleteSpeechQueuePolicy;
79
+ readonly signal?: AbortSignal;
80
+ };
81
+ /** Embed / player wire format for {@link SpeechPlayOptions.audio}. */
82
+ export type SpeechPlayEmbedSource = {
83
+ readonly kind: 'pcm';
84
+ readonly data: ArrayBuffer;
85
+ readonly format: SpeechAudioFormat;
86
+ } | {
87
+ readonly kind: 'encoded';
88
+ readonly data: ArrayBuffer;
89
+ readonly encoding: string;
90
+ readonly sampleRate?: number;
91
+ } | {
92
+ readonly kind: 'url';
93
+ readonly url: string;
94
+ readonly sampleRate?: number;
95
+ };
96
+ export declare function isSpeechPlayPcmAudio(audio: SpeechPlayAudio): audio is SpeechPlayPcmAudio;
97
+ export declare function isSpeechPlayUrlAudio(audio: SpeechPlayAudio): audio is SpeechPlayUrlAudio;
98
+ export declare function isSpeechPlayMediaStreamAudio(audio: SpeechPlayAudio): audio is SpeechPlayMediaStreamAudio;
99
+ export declare function isSpeechPlayEncodedAudio(audio: SpeechPlayAudio): audio is SpeechPlayEncodedAudio;
100
+ export type SpeechCreateUtteranceOptions = {
101
+ /**
102
+ * Required unless `track` is set. When `track` is provided without `format`, defaults to
103
+ * pcm_s16le mono at `sampleRate` (or 24000).
104
+ */
105
+ readonly format?: SpeechAudioFormat;
106
+ /** Optional live track — host captures and writes until the track ends. */
107
+ readonly track?: MediaStreamTrack;
108
+ /** Used with `track` when `format` is omitted (default 24000). */
109
+ readonly sampleRate?: number;
110
+ readonly characterId?: string;
111
+ readonly queue?: StreamingSpeechQueuePolicy;
112
+ /**
113
+ * Optional spoken text seed for force-aligned STA (lip sync).
114
+ * Non-empty transcript enables force-align for this utterance; omit / whitespace → free CTC.
115
+ * May be updated mid-turn via {@link SpeechUtterance.setTranscript} or finalized on
116
+ * {@link SpeechUtterance.close} `{ transcript }`.
117
+ */
118
+ readonly transcript?: string;
119
+ readonly signal?: AbortSignal;
120
+ };
121
+ export type SpeechUtteranceCloseOptions = {
122
+ readonly transcript?: string;
123
+ readonly history?: 'none' | 'commit';
124
+ };
125
+ export type SpeechWriteOptions = {
126
+ readonly timeoutMs?: number;
127
+ };
128
+ export type SpeechUtterance = {
129
+ readonly id: string;
130
+ readonly characterId: string;
131
+ readonly result: Promise<SpeechResult>;
132
+ write(audio: ArrayBuffer | Uint8Array, options?: SpeechWriteOptions): Promise<void>;
133
+ /**
134
+ * Replace / set spoken text mid-turn for force-aligned STA.
135
+ * Non-empty text upgrades free decode → force-align (full-utterance on close).
136
+ * Empty / whitespace is a no-op.
137
+ */
138
+ setTranscript(text: string): Promise<void>;
139
+ close(options?: SpeechUtteranceCloseOptions): Promise<SpeechResult>;
140
+ cancel(): Promise<SpeechResult>;
141
+ };
142
+ export type SpeechController = {
143
+ speak(options: SpeechSpeakOptions): Promise<SpeechResult>;
144
+ play(options: SpeechPlayOptions): Promise<SpeechResult>;
145
+ createUtterance(options: SpeechCreateUtteranceOptions): SpeechUtterance;
146
+ interrupt(options?: SpeechInterruptOptions): Promise<readonly SpeechResult[]>;
147
+ };
148
+ /** Accepted PCM sample rates (Phase A). */
149
+ export declare const SPEECH_ACCEPTED_SAMPLE_RATES: readonly [8000, 16000, 22050, 24000, 44100, 48000];
150
+ export declare const SPEECH_LIMITS: {
151
+ readonly MAX_CHUNK_BYTES: number;
152
+ readonly RECOMMENDED_CHUNK_MS_MIN: 20;
153
+ readonly RECOMMENDED_CHUNK_MS_MAX: 200;
154
+ readonly MAX_BUFFERED_AUDIO_MS: 8000;
155
+ readonly PLAYBACK_JITTER_BUFFER_MS: 150;
156
+ readonly PLAYBACK_JITTER_BUFFER_MS_MIN: 80;
157
+ readonly PLAYBACK_JITTER_BUFFER_MS_MAX: 250;
158
+ readonly MAX_UTTERANCE_DURATION_MS: 90000;
159
+ readonly MAX_PENDING_WRITES: 8;
160
+ readonly DEFAULT_WRITE_TIMEOUT_MS: 5000;
161
+ };
162
+ export declare class UnsupportedSpeechOperationError extends Error {
163
+ readonly operation: string;
164
+ readonly requiredCapability: string;
165
+ readonly name = "UnsupportedSpeechOperationError";
166
+ constructor(operation: string, requiredCapability: string);
167
+ }
168
+ export declare class SpeechUtteranceClosedError extends Error {
169
+ readonly name = "SpeechUtteranceClosedError";
170
+ constructor(message?: string);
171
+ }
172
+ export declare class SpeechRuntimeError extends Error {
173
+ readonly name = "SpeechRuntimeError";
174
+ constructor(message: string, options?: {
175
+ cause?: unknown;
176
+ });
177
+ }
178
+ export declare class SpeechBufferTimeoutError extends Error {
179
+ readonly name = "SpeechBufferTimeoutError";
180
+ constructor(message?: string);
181
+ }
182
+ export declare function emptyAnimationResult(mode?: SpeechAnimationMode): SpeechResult['animation'];
183
+ export declare function isAcceptedSampleRate(rate: number): boolean;
184
+ export declare function assertPcmFormat(format: SpeechAudioFormat): void;
185
+ export declare function assertSpeechPlayAudio(audio: SpeechPlayAudio): void;
186
+ export declare function resolveCreateUtteranceFormat(options: SpeechCreateUtteranceOptions): SpeechAudioFormat;
187
+ export declare function toUint8Array(data: ArrayBuffer | Uint8Array): Uint8Array;
188
+ export declare function queuePolicyToEmbedBehavior(queue: CompleteSpeechQueuePolicy | StreamingSpeechQueuePolicy | undefined): 'enqueue' | 'interrupt';
189
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/v2/speech/types.ts"],"names":[],"mappings":"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"}
@@ -41,13 +41,16 @@ export type SpeakOptions = {
41
41
  readonly characterId?: string;
42
42
  readonly behavior?: SpeakBehavior;
43
43
  };
44
- export type SpeechResult = {
44
+ /** @deprecated Prefer {@link import('../speech').SpeechResult} from Experience.speech. */
45
+ export type TextSpeakResult = {
45
46
  readonly speechId: string;
46
47
  readonly turnId: string;
47
48
  readonly characterId: string;
48
49
  readonly text: string;
49
50
  readonly durationMs: number;
50
51
  };
52
+ /** @deprecated Alias for TextSpeakResult — use Experience.speech SpeechResult for new code. */
53
+ export type SpeechResult = TextSpeakResult;
51
54
  export type UtteranceResult = {
52
55
  readonly utteranceId: string;
53
56
  readonly text: string;
@@ -59,7 +62,7 @@ export type UserTranscriptUpdate = {
59
62
  readonly isFinal: boolean;
60
63
  readonly delta?: string;
61
64
  };
62
- export type ConversationMessageSource = 'user' | 'llm' | 'speak' | 'opening';
65
+ export type ConversationMessageSource = 'user' | 'llm' | 'speak' | 'opening' | 'speechAudio';
63
66
  export type ConversationMessage = {
64
67
  readonly messageId: string;
65
68
  readonly turnId: string;
@@ -70,7 +73,7 @@ export type ConversationMessage = {
70
73
  readonly status: 'final';
71
74
  readonly timestamp: number;
72
75
  };
73
- export type CharacterSpeechSource = 'llm' | 'speak' | 'opening';
76
+ export type CharacterSpeechSource = 'llm' | 'speak' | 'opening' | 'speechAudio';
74
77
  export type CharacterSpeechTerminalReason = 'completed' | 'interrupted' | 'error' | 'destroyed';
75
78
  export type CharacterSpeechEvent = {
76
79
  readonly speechId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"sessionInteraction.d.ts","sourceRoot":"","sources":["../../../../src/v2/types/sessionInteraction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sessionInteraction.d.ts","sourceRoot":"","sources":["../../../../src/v2/types/sessionInteraction.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mountExperienceWidget.d.ts","sourceRoot":"","sources":["../../../src/widget/mountExperienceWidget.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACX,0BAA0B,EAC1B,uBAAuB,EAGvB,MAAM,SAAS,CAAC;AAMjB,uDAAuD;AACvD,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAQvE;AA+JD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACpC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,uBAAuB,GAC9B,0BAA0B,CAq1B5B"}
1
+ {"version":3,"file":"mountExperienceWidget.d.ts","sourceRoot":"","sources":["../../../src/widget/mountExperienceWidget.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACX,0BAA0B,EAC1B,uBAAuB,EAGvB,MAAM,SAAS,CAAC;AAMjB,uDAAuD;AACvD,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAQvE;AA+JD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACpC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,uBAAuB,GAC9B,0BAA0B,CA+6B5B"}
@@ -1,4 +1,4 @@
1
1
  /** Styles for ExperienceWidget (class prefix `liforma-ew`). */
2
- export declare const EXPERIENCE_WIDGET_CSS = "\n.liforma-ew {\n\tbox-sizing: border-box;\n\tposition: relative;\n\tdisplay: block;\n\twidth: 100%;\n\theight: 100%;\n\tmin-height: 0;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n/* Optional self-positioned FAB (position=bottom-right|bottom-left).\n * Cap at 50vmin so small phones don't get an oversized thumb (desktop 224px stays). */\n.liforma-ew[data-position='bottom-right'],\n.liforma-ew[data-position='bottom-left'] {\n\tposition: fixed;\n\twidth: min(var(--liforma-ew-fab-size, 224px), 50vmin);\n\theight: min(var(--liforma-ew-fab-size, 224px), 50vmin);\n\tbottom: var(--liforma-ew-offset, 16px);\n\tz-index: 2147482900;\n}\n\n.liforma-ew[data-position='bottom-right'] {\n\tright: var(--liforma-ew-offset, 16px);\n\tleft: auto;\n}\n\n.liforma-ew[data-position='bottom-left'] {\n\tleft: var(--liforma-ew-offset, 16px);\n\tright: auto;\n}\n\n/* While open, collapse the FAB box so a corner hole / thumb never remains. */\n.liforma-ew[data-position='bottom-right'][data-state='expanded'],\n.liforma-ew[data-position='bottom-right'][data-state='docked'],\n.liforma-ew[data-position='bottom-left'][data-state='expanded'],\n.liforma-ew[data-position='bottom-left'][data-state='docked'] {\n\twidth: 0;\n\theight: 0;\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: visible;\n\tpointer-events: none;\n}\n\n.liforma-ew[data-state='expanded'] .liforma-ew__warm,\n.liforma-ew[data-state='docked'] .liforma-ew__warm,\n.liforma-ew[data-state='expanded'] .liforma-ew__overlay,\n.liforma-ew[data-state='expanded'] .liforma-ew__toolbar,\n.liforma-ew[data-state='docked'] .liforma-ew__toolbar {\n\tpointer-events: auto;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__overlay {\n\tpointer-events: none;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__panel {\n\tpointer-events: auto;\n}\n\n.liforma-ew__hit {\n\tbox-sizing: border-box;\n\tdisplay: block;\n\twidth: 100%;\n\theight: 100%;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: transparent;\n\tcursor: pointer;\n\tfont: inherit;\n\tappearance: none;\n\t-webkit-tap-highlight-color: transparent;\n\ttransform: scale(1);\n\ttransform-origin: center center;\n\ttransition:\n\t\ttransform 180ms ease,\n\t\tfilter 180ms ease;\n\twill-change: transform;\n}\n\n/* Author display must not defeat the HTML hidden attribute. */\n.liforma-ew__hit[hidden] {\n\tdisplay: none !important;\n}\n\n.liforma-ew__hit:focus-visible {\n\toutline: 2px solid #5b8def;\n\toutline-offset: 3px;\n\tborder-radius: 0.75rem;\n}\n\n@media (hover: hover) and (pointer: fine) {\n\t/* Scale the thumb whenever the collapsed FAB is hovered \u2014 including via the warm iframe hit layer. */\n\t.liforma-ew[data-state='collapsed'] .liforma-ew__hit:not(:disabled):hover,\n\t.liforma-ew[data-state='collapsed']:has(.liforma-ew__warm:hover) .liforma-ew__hit {\n\t\ttransform: scale(1.06);\n\t}\n\n\t.liforma-ew[data-state='collapsed'] .liforma-ew__hit:not(:disabled):hover .liforma-et,\n\t.liforma-ew[data-state='collapsed']:has(.liforma-ew__warm:hover) .liforma-et {\n\t\tbox-shadow: 0 12px 36px rgba(0, 0, 0, 0.34);\n\t}\n}\n\n.liforma-ew__face {\n\twidth: 100%;\n\theight: 100%;\n\tmin-height: 0;\n\tposition: relative;\n}\n\n.liforma-ew__face-status {\n\tposition: absolute;\n\tinset: 0;\n\tz-index: 1;\n\tdisplay: grid;\n\tplace-items: center;\n\tpadding: 0.5rem;\n\ttext-align: center;\n\tfont: 600 0.75rem/1.3 system-ui, sans-serif;\n\tcolor: #e8ecf4;\n\tbackground: rgba(10, 12, 18, 0.72);\n\tborder-radius: 0.75rem;\n\tpointer-events: none;\n}\n\n.liforma-ew__face-status[hidden] {\n\tdisplay: none !important;\n}\n\n.liforma-ew__hit:disabled {\n\tcursor: default;\n\topacity: 0.85;\n}\n\n.liforma-ew__face .liforma-et {\n\tborder-radius: 0.75rem;\n\tbox-shadow: 0 8px 28px rgba(0, 0, 0, 0.28);\n\ttransition: box-shadow 180ms ease;\n}\n\n.liforma-ew__warm {\n\tbox-sizing: border-box;\n\tposition: absolute;\n\tinset: 0;\n\tz-index: 2;\n\tborder-radius: 0.75rem;\n\toverflow: hidden;\n\tbackground: transparent;\n\tpointer-events: none;\n\topacity: 1;\n\ttransition: opacity 1000ms ease;\n}\n\n/*\n * Collapsed: keep the warm iframe as an invisible hit target only.\n * Painting it over the thumb causes a \u201Cghost enlarge\u201D (face scales under a static iframe).\n */\n.liforma-ew[data-state='collapsed'] .liforma-ew__warm {\n\topacity: 0;\n\ttransition: none;\n}\n\n.liforma-ew[data-warm='true'] .liforma-ew__warm {\n\tpointer-events: auto;\n}\n\n.liforma-ew[data-warm='true']:not([data-live='true']) .liforma-ew__hit {\n\tpointer-events: none;\n}\n\n.liforma-ew[data-live='true'][data-state='collapsed'] .liforma-ew__hit {\n\tpointer-events: auto;\n}\n\n.liforma-ew[data-live='true'] .liforma-ew__warm,\n.liforma-ew[data-live='true'] .liforma-ew__stage {\n\t/* Hidden under the thumb / until post-resize fade-in (matches cold avatar reveal). */\n\topacity: 0;\n}\n\n.liforma-ew[data-live='true'].liforma-ew--session-revealed[data-state='expanded'] .liforma-ew__warm,\n.liforma-ew[data-live='true'].liforma-ew--session-revealed[data-state='expanded'] .liforma-ew__stage,\n.liforma-ew[data-live='true'].liforma-ew--session-revealed[data-state='docked'] .liforma-ew__warm,\n.liforma-ew[data-live='true'].liforma-ew--session-revealed[data-state='docked'] .liforma-ew__stage {\n\topacity: 1;\n}\n\n.liforma-ew--session-concealing .liforma-ew__warm,\n.liforma-ew--session-concealing .liforma-ew__stage {\n\ttransition-duration: 280ms;\n}\n\n/* Instant hide while dock/maximize geometry settles (player morph resize ~160ms). */\n.liforma-ew--layout-settling .liforma-ew__warm,\n.liforma-ew--layout-settling .liforma-ew__stage {\n\topacity: 0 !important;\n\ttransition: none !important;\n}\n\n.liforma-ew[data-live='true'][data-state='collapsed'] .liforma-ew__warm {\n\t/* Keep the live iframe under the thumb; FAB click resumes the shell. */\n\tpointer-events: none;\n\topacity: 0;\n\t/* Instant hide when collapsed so the FAB never shows a resized live mesh. */\n\ttransition: none;\n}\n\n.liforma-ew[data-state='expanded'] .liforma-ew__warm {\n\tposition: fixed;\n\t/* Match overlay panel inset so the warm iframe fills the conversation shell. */\n\tinset: clamp(12px, 3vw, 28px);\n\tz-index: 2147483001;\n\twidth: auto;\n\theight: auto;\n\tborder-radius: 16px;\n\tpointer-events: auto;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__warm {\n\tposition: fixed;\n\tinset: auto;\n\tz-index: 2147483001;\n\tborder-radius: 16px;\n\tpointer-events: auto;\n\t/* left/top/width/height set inline from dock geometry */\n}\n\n.liforma-ew__toolbar {\n\tdisplay: none;\n\tposition: fixed;\n\tz-index: 2147483002;\n\tpointer-events: auto;\n\tbox-sizing: border-box;\n\talign-items: center;\n\tgap: 0.35rem;\n\tpadding: 0.35rem 0.4rem;\n\tborder-radius: 999px;\n\tbackground: rgba(12, 14, 20, 0.72);\n\tbackdrop-filter: blur(8px);\n\t-webkit-backdrop-filter: blur(8px);\n\tbox-shadow: 0 8px 24px rgba(0, 0, 0, 0.28);\n}\n\n.liforma-ew[data-state='expanded'] .liforma-ew__toolbar {\n\tdisplay: flex;\n\ttop: calc(clamp(12px, 3vw, 28px) + 10px);\n\tright: calc(clamp(12px, 3vw, 28px) + 10px);\n\tleft: auto;\n\tcursor: default;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__toolbar {\n\tdisplay: flex;\n\t/* left/top set inline to track the panel; strip is the drag handle */\n\tcursor: grab;\n\ttouch-action: none;\n\tuser-select: none;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__toolbar.liforma-ew__toolbar--dragging {\n\tcursor: grabbing;\n}\n\n.liforma-ew__toolbar[hidden] {\n\tdisplay: none !important;\n}\n\n.liforma-ew__icon-btn {\n\tappearance: none;\n\tbox-sizing: border-box;\n\tdisplay: inline-grid;\n\tplace-items: center;\n\twidth: 2rem;\n\theight: 2rem;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tborder-radius: 999px;\n\tcolor: #f5f7fb;\n\tbackground: transparent;\n\tcursor: pointer;\n}\n\n.liforma-ew__icon-btn:hover {\n\tbackground: rgba(255, 255, 255, 0.12);\n}\n\n.liforma-ew__icon-btn[aria-pressed='true'] {\n\tbackground: rgba(255, 255, 255, 0.2);\n}\n\n.liforma-ew__icon-btn:focus-visible {\n\toutline: 2px solid #5b8def;\n\toutline-offset: 2px;\n}\n\n.liforma-ew__icon-btn svg {\n\twidth: 1.05rem;\n\theight: 1.05rem;\n\tdisplay: block;\n}\n\n.liforma-ew__drag-grip {\n\tdisplay: none;\n\twidth: 0.85rem;\n\theight: 1.25rem;\n\tmargin: 0 0.15rem 0 0.25rem;\n\tbackground:\n\t\tradial-gradient(circle, currentColor 1.1px, transparent 1.2px) 0 0 / 0.35rem 0.35rem,\n\t\tradial-gradient(circle, currentColor 1.1px, transparent 1.2px) 0.35rem 0 / 0.35rem 0.35rem;\n\tbackground-repeat: repeat-y;\n\topacity: 0.55;\n\tcolor: #f5f7fb;\n\tpointer-events: none;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__drag-grip {\n\tdisplay: block;\n}\n\n.liforma-ew__dock-toggle[hidden] {\n\tdisplay: none !important;\n}\n\n.liforma-ew__overlay {\n\tposition: fixed;\n\tinset: 0;\n\tz-index: 2147483000;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: clamp(12px, 3vw, 28px);\n\tbox-sizing: border-box;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__overlay {\n\tpadding: 0;\n\talign-items: stretch;\n\tjustify-content: stretch;\n\tpointer-events: none;\n\tbackground: transparent;\n}\n\n.liforma-ew__overlay[hidden] {\n\tdisplay: none !important;\n}\n\n.liforma-ew__backdrop {\n\tposition: absolute;\n\tinset: 0;\n\tborder: 0;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: rgba(6, 8, 14, 0.62);\n\tcursor: pointer;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__backdrop {\n\tdisplay: none !important;\n}\n\n.liforma-ew__panel {\n\tposition: relative;\n\tz-index: 1;\n\tdisplay: flex;\n\tflex-direction: column;\n\t/* Fill the overlay so player loading / start UI centers in the visible window. */\n\twidth: var(--liforma-ew-max-w, 100%);\n\theight: var(--liforma-ew-max-h, 100%);\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tborder-radius: 16px;\n\toverflow: hidden;\n\tbackground: #030508;\n\tbox-shadow: 0 24px 80px rgba(0, 0, 0, 0.45);\n\t/* Warm iframe sits above as a sibling; keep panel as chrome shell. */\n\tpointer-events: none;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__panel {\n\tposition: fixed;\n\tinset: auto;\n\tmax-width: none;\n\tmax-height: none;\n\tpointer-events: auto;\n\t/* left/top/width/height set inline from dock geometry */\n}\n\n.liforma-ew:not([data-warm='true']) .liforma-ew__panel {\n\tpointer-events: auto;\n}\n\n.liforma-ew__stage {\n\tposition: relative;\n\tflex: 1;\n\tmin-height: 0;\n\twidth: 100%;\n\theight: 100%;\n\tbackground: #030508;\n\topacity: 1;\n\ttransition: opacity 1000ms ease;\n}\n\n.liforma-ew__status {\n\tposition: absolute;\n\tinset: 0;\n\tz-index: 1;\n\tdisplay: grid;\n\tplace-items: center;\n\tpadding: 1.5rem;\n\ttext-align: center;\n\tcolor: #d7dde8;\n\tfont: 500 0.9375rem/1.45 system-ui, sans-serif;\n\tbackground: rgba(3, 5, 8, 0.92);\n\tpointer-events: none;\n}\n\n.liforma-ew__status[hidden] {\n\tdisplay: none !important;\n}\n\n/* Mobile expanded: ~90% viewport, no reduce control. */\n@media (max-width: 767px) {\n\t.liforma-ew[data-state='expanded'] .liforma-ew__overlay {\n\t\tpadding: 5vh 5vw;\n\t}\n\n\t.liforma-ew[data-state='expanded'] .liforma-ew__panel {\n\t\twidth: 90vw;\n\t\theight: 90vh;\n\t\tmax-width: 90vw;\n\t\tmax-height: 90vh;\n\t}\n\n\t.liforma-ew[data-state='expanded'] .liforma-ew__warm {\n\t\tinset: 5vh 5vw;\n\t}\n\n\t.liforma-ew[data-state='expanded'] .liforma-ew__toolbar {\n\t\ttop: calc(5vh + 10px);\n\t\tright: calc(5vw + 10px);\n\t}\n\n\t.liforma-ew__dock-toggle {\n\t\tdisplay: none !important;\n\t}\n}\n\n@media (prefers-reduced-motion: reduce) {\n\t.liforma-ew__hit {\n\t\ttransition: none;\n\t\twill-change: auto;\n\t}\n\n\t.liforma-ew[data-state='collapsed'] .liforma-ew__hit:not(:disabled):hover,\n\t.liforma-ew[data-state='collapsed']:has(.liforma-ew__warm:hover) .liforma-ew__hit {\n\t\ttransform: none;\n\t}\n\n\t.liforma-ew__face .liforma-et {\n\t\tbox-shadow: none;\n\t\ttransition: none;\n\t}\n\n\t.liforma-ew__warm,\n\t.liforma-ew__stage {\n\t\ttransition: none;\n\t}\n}\n";
2
+ export declare const EXPERIENCE_WIDGET_CSS = "\n.liforma-ew {\n\tbox-sizing: border-box;\n\tposition: relative;\n\tdisplay: block;\n\twidth: 100%;\n\theight: 100%;\n\tmin-height: 0;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n}\n\n/* Optional self-positioned FAB (position=bottom-right|bottom-left).\n * Cap at 50vmin so small phones don't get an oversized thumb (desktop 224px stays). */\n.liforma-ew[data-position='bottom-right'],\n.liforma-ew[data-position='bottom-left'] {\n\tposition: fixed;\n\twidth: min(var(--liforma-ew-fab-size, 224px), 50vmin);\n\theight: min(var(--liforma-ew-fab-size, 224px), 50vmin);\n\tbottom: var(--liforma-ew-offset, 16px);\n\tz-index: 2147482900;\n}\n\n.liforma-ew[data-position='bottom-right'] {\n\tright: var(--liforma-ew-offset, 16px);\n\tleft: auto;\n}\n\n.liforma-ew[data-position='bottom-left'] {\n\tleft: var(--liforma-ew-offset, 16px);\n\tright: auto;\n}\n\n/* While open, collapse the FAB box so a corner hole / thumb never remains. */\n.liforma-ew[data-position='bottom-right'][data-state='expanded'],\n.liforma-ew[data-position='bottom-right'][data-state='docked'],\n.liforma-ew[data-position='bottom-left'][data-state='expanded'],\n.liforma-ew[data-position='bottom-left'][data-state='docked'] {\n\twidth: 0;\n\theight: 0;\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: visible;\n\tpointer-events: none;\n}\n\n.liforma-ew[data-state='expanded'] .liforma-ew__warm,\n.liforma-ew[data-state='docked'] .liforma-ew__warm,\n.liforma-ew[data-state='expanded'] .liforma-ew__overlay,\n.liforma-ew[data-state='expanded'] .liforma-ew__toolbar,\n.liforma-ew[data-state='docked'] .liforma-ew__toolbar {\n\tpointer-events: auto;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__overlay {\n\tpointer-events: none;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__panel {\n\tpointer-events: auto;\n}\n\n.liforma-ew__hit {\n\tbox-sizing: border-box;\n\tdisplay: block;\n\twidth: 100%;\n\theight: 100%;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tbackground: transparent;\n\tcursor: pointer;\n\tfont: inherit;\n\tappearance: none;\n\t-webkit-tap-highlight-color: transparent;\n\ttransform: scale(1);\n\ttransform-origin: center center;\n\ttransition:\n\t\ttransform 180ms ease,\n\t\tfilter 180ms ease;\n\twill-change: transform;\n}\n\n/* Author display must not defeat the HTML hidden attribute. */\n.liforma-ew__hit[hidden] {\n\tdisplay: none !important;\n}\n\n.liforma-ew__hit:focus-visible {\n\toutline: 2px solid #5b8def;\n\toutline-offset: 3px;\n\tborder-radius: 0.75rem;\n}\n\n@media (hover: hover) and (pointer: fine) {\n\t/* Scale the thumb whenever the collapsed FAB is hovered \u2014 including via the warm iframe hit layer. */\n\t.liforma-ew[data-state='collapsed'] .liforma-ew__hit:not(:disabled):hover,\n\t.liforma-ew[data-state='collapsed']:has(.liforma-ew__warm:hover) .liforma-ew__hit {\n\t\ttransform: scale(1.06);\n\t}\n\n\t.liforma-ew[data-state='collapsed'] .liforma-ew__hit:not(:disabled):hover .liforma-et,\n\t.liforma-ew[data-state='collapsed']:has(.liforma-ew__warm:hover) .liforma-et {\n\t\tbox-shadow: 0 12px 36px rgba(0, 0, 0, 0.34);\n\t}\n}\n\n.liforma-ew__face {\n\twidth: 100%;\n\theight: 100%;\n\tmin-height: 0;\n\tposition: relative;\n}\n\n.liforma-ew__face-status {\n\tposition: absolute;\n\tinset: 0;\n\tz-index: 1;\n\tdisplay: grid;\n\tplace-items: center;\n\tpadding: 0.5rem;\n\ttext-align: center;\n\tfont: 600 0.75rem/1.3 system-ui, sans-serif;\n\tcolor: #e8ecf4;\n\tbackground: rgba(10, 12, 18, 0.72);\n\tborder-radius: 0.75rem;\n\tpointer-events: none;\n}\n\n.liforma-ew__face-status[hidden] {\n\tdisplay: none !important;\n}\n\n.liforma-ew__hit:disabled {\n\tcursor: default;\n\topacity: 0.85;\n}\n\n.liforma-ew__face .liforma-et {\n\tborder-radius: 0.75rem;\n\tbox-shadow: 0 8px 28px rgba(0, 0, 0, 0.28);\n\ttransition: box-shadow 180ms ease;\n}\n\n.liforma-ew__warm {\n\tbox-sizing: border-box;\n\tposition: absolute;\n\tinset: 0;\n\tz-index: 2;\n\tborder-radius: 0.75rem;\n\toverflow: hidden;\n\tbackground: transparent;\n\tpointer-events: none;\n\topacity: 1;\n\ttransition: opacity 1000ms ease;\n}\n\n/*\n * Collapsed: keep the warm iframe as an invisible hit target only.\n * Painting it over the thumb causes a \u201Cghost enlarge\u201D (face scales under a static iframe).\n */\n.liforma-ew[data-state='collapsed'] .liforma-ew__warm {\n\topacity: 0;\n\ttransition: none;\n}\n\n.liforma-ew[data-warm='true'] .liforma-ew__warm {\n\tpointer-events: auto;\n}\n\n.liforma-ew[data-warm='true']:not([data-live='true']) .liforma-ew__hit {\n\tpointer-events: none;\n}\n\n.liforma-ew[data-live='true'][data-state='collapsed'] .liforma-ew__hit {\n\tpointer-events: auto;\n}\n\n.liforma-ew[data-live='true'] .liforma-ew__warm,\n.liforma-ew[data-live='true'] .liforma-ew__stage {\n\t/* Hidden under the thumb / until post-resize fade-in (matches cold avatar reveal). */\n\topacity: 0;\n}\n\n.liforma-ew[data-live='true'].liforma-ew--session-revealed[data-state='expanded'] .liforma-ew__warm,\n.liforma-ew[data-live='true'].liforma-ew--session-revealed[data-state='expanded'] .liforma-ew__stage,\n.liforma-ew[data-live='true'].liforma-ew--session-revealed[data-state='docked'] .liforma-ew__warm,\n.liforma-ew[data-live='true'].liforma-ew--session-revealed[data-state='docked'] .liforma-ew__stage {\n\topacity: 1;\n}\n\n.liforma-ew--session-concealing .liforma-ew__warm,\n.liforma-ew--session-concealing .liforma-ew__stage {\n\ttransition-duration: 280ms;\n}\n\n/* Instant hide while dock/maximize geometry settles (player morph resize ~160ms). */\n.liforma-ew--layout-settling .liforma-ew__warm,\n.liforma-ew--layout-settling .liforma-ew__stage {\n\topacity: 0 !important;\n\ttransition: none !important;\n}\n\n.liforma-ew[data-live='true'][data-state='collapsed'] .liforma-ew__warm {\n\t/* Keep the live iframe under the thumb; FAB click resumes the shell. */\n\tpointer-events: none;\n\topacity: 0;\n\t/* Instant hide when collapsed so the FAB never shows a resized live mesh. */\n\ttransition: none;\n}\n\n.liforma-ew[data-state='expanded'] .liforma-ew__warm {\n\tposition: fixed;\n\t/* Match overlay panel inset so the warm iframe fills the conversation shell. */\n\tinset: clamp(12px, 3vw, 28px);\n\tz-index: 2147483001;\n\twidth: auto;\n\theight: auto;\n\tborder-radius: 16px;\n\tpointer-events: auto;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__warm {\n\tposition: fixed;\n\tinset: auto;\n\tz-index: 2147483001;\n\tborder-radius: 16px;\n\tpointer-events: auto;\n\t/* left/top/width/height set inline from dock geometry */\n}\n\n.liforma-ew__toolbar {\n\tdisplay: none;\n\tposition: fixed;\n\tz-index: 2147483002;\n\tpointer-events: auto;\n\tbox-sizing: border-box;\n\talign-items: center;\n\tgap: 0.35rem;\n\tpadding: 0.35rem 0.4rem;\n\tborder-radius: 999px;\n\tbackground: rgba(12, 14, 20, 0.72);\n\tbackdrop-filter: blur(8px);\n\t-webkit-backdrop-filter: blur(8px);\n\tbox-shadow: 0 8px 24px rgba(0, 0, 0, 0.28);\n}\n\n.liforma-ew[data-state='expanded'] .liforma-ew__toolbar {\n\tdisplay: flex;\n\ttop: calc(clamp(12px, 3vw, 28px) + 10px);\n\tright: calc(clamp(12px, 3vw, 28px) + 10px);\n\tleft: auto;\n\tcursor: default;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__toolbar {\n\tdisplay: flex;\n\t/* left/top set inline to track the panel; strip remains a drag handle */\n\tcursor: grab;\n\ttouch-action: none;\n\tuser-select: none;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__panel,\n.liforma-ew[data-state='docked'] .liforma-ew__warm,\n.liforma-ew[data-state='docked'] .liforma-ew__stage {\n\t/* Player also reports surface drags via postMessage when docked. */\n\tcursor: grab;\n\ttouch-action: none;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__toolbar.liforma-ew__toolbar--dragging,\n.liforma-ew--dock-dragging,\n.liforma-ew--dock-dragging .liforma-ew__toolbar,\n.liforma-ew--dock-dragging .liforma-ew__panel,\n.liforma-ew--dock-dragging .liforma-ew__warm,\n.liforma-ew--dock-dragging .liforma-ew__stage {\n\tcursor: grabbing;\n}\n\n\n.liforma-ew__toolbar[hidden] {\n\tdisplay: none !important;\n}\n\n.liforma-ew__icon-btn {\n\tappearance: none;\n\tbox-sizing: border-box;\n\tdisplay: inline-grid;\n\tplace-items: center;\n\twidth: 2rem;\n\theight: 2rem;\n\tmargin: 0;\n\tpadding: 0;\n\tborder: 0;\n\tborder-radius: 999px;\n\tcolor: #f5f7fb;\n\tbackground: transparent;\n\tcursor: pointer;\n}\n\n.liforma-ew__icon-btn:hover {\n\tbackground: rgba(255, 255, 255, 0.12);\n}\n\n.liforma-ew__icon-btn[aria-pressed='true'] {\n\tbackground: rgba(255, 255, 255, 0.2);\n}\n\n.liforma-ew__icon-btn:focus-visible {\n\toutline: 2px solid #5b8def;\n\toutline-offset: 2px;\n}\n\n.liforma-ew__icon-btn svg {\n\twidth: 1.05rem;\n\theight: 1.05rem;\n\tdisplay: block;\n}\n\n.liforma-ew__drag-grip {\n\tdisplay: none;\n\twidth: 0.85rem;\n\theight: 1.25rem;\n\tmargin: 0 0.15rem 0 0.25rem;\n\tbackground:\n\t\tradial-gradient(circle, currentColor 1.1px, transparent 1.2px) 0 0 / 0.35rem 0.35rem,\n\t\tradial-gradient(circle, currentColor 1.1px, transparent 1.2px) 0.35rem 0 / 0.35rem 0.35rem;\n\tbackground-repeat: repeat-y;\n\topacity: 0.55;\n\tcolor: #f5f7fb;\n\tpointer-events: none;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__drag-grip {\n\tdisplay: block;\n}\n\n.liforma-ew__dock-toggle[hidden] {\n\tdisplay: none !important;\n}\n\n.liforma-ew__overlay {\n\tposition: fixed;\n\tinset: 0;\n\tz-index: 2147483000;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tpadding: clamp(12px, 3vw, 28px);\n\tbox-sizing: border-box;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__overlay {\n\tpadding: 0;\n\talign-items: stretch;\n\tjustify-content: stretch;\n\tpointer-events: none;\n\tbackground: transparent;\n}\n\n.liforma-ew__overlay[hidden] {\n\tdisplay: none !important;\n}\n\n.liforma-ew__backdrop {\n\tposition: absolute;\n\tinset: 0;\n\tborder: 0;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: rgba(6, 8, 14, 0.62);\n\tcursor: pointer;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__backdrop {\n\tdisplay: none !important;\n}\n\n.liforma-ew__panel {\n\tposition: relative;\n\tz-index: 1;\n\tdisplay: flex;\n\tflex-direction: column;\n\t/* Fill the overlay so player loading / start UI centers in the visible window. */\n\twidth: var(--liforma-ew-max-w, 100%);\n\theight: var(--liforma-ew-max-h, 100%);\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tborder-radius: 16px;\n\toverflow: hidden;\n\tbackground: #030508;\n\tbox-shadow: 0 24px 80px rgba(0, 0, 0, 0.45);\n\t/* Warm iframe sits above as a sibling; keep panel as chrome shell. */\n\tpointer-events: none;\n}\n\n.liforma-ew[data-state='docked'] .liforma-ew__panel {\n\tposition: fixed;\n\tinset: auto;\n\tmax-width: none;\n\tmax-height: none;\n\tpointer-events: auto;\n\t/* left/top/width/height set inline from dock geometry */\n}\n\n.liforma-ew:not([data-warm='true']) .liforma-ew__panel {\n\tpointer-events: auto;\n}\n\n.liforma-ew__stage {\n\tposition: relative;\n\tflex: 1;\n\tmin-height: 0;\n\twidth: 100%;\n\theight: 100%;\n\tbackground: #030508;\n\topacity: 1;\n\ttransition: opacity 1000ms ease;\n}\n\n.liforma-ew__status {\n\tposition: absolute;\n\tinset: 0;\n\tz-index: 1;\n\tdisplay: grid;\n\tplace-items: center;\n\tpadding: 1.5rem;\n\ttext-align: center;\n\tcolor: #d7dde8;\n\tfont: 500 0.9375rem/1.45 system-ui, sans-serif;\n\tbackground: rgba(3, 5, 8, 0.92);\n\tpointer-events: none;\n}\n\n.liforma-ew__status[hidden] {\n\tdisplay: none !important;\n}\n\n/* Mobile expanded: ~90% viewport, no reduce control. */\n@media (max-width: 767px) {\n\t.liforma-ew[data-state='expanded'] .liforma-ew__overlay {\n\t\tpadding: 5vh 5vw;\n\t}\n\n\t.liforma-ew[data-state='expanded'] .liforma-ew__panel {\n\t\twidth: 90vw;\n\t\theight: 90vh;\n\t\tmax-width: 90vw;\n\t\tmax-height: 90vh;\n\t}\n\n\t.liforma-ew[data-state='expanded'] .liforma-ew__warm {\n\t\tinset: 5vh 5vw;\n\t}\n\n\t.liforma-ew[data-state='expanded'] .liforma-ew__toolbar {\n\t\ttop: calc(5vh + 10px);\n\t\tright: calc(5vw + 10px);\n\t}\n\n\t.liforma-ew__dock-toggle {\n\t\tdisplay: none !important;\n\t}\n}\n\n@media (prefers-reduced-motion: reduce) {\n\t.liforma-ew__hit {\n\t\ttransition: none;\n\t\twill-change: auto;\n\t}\n\n\t.liforma-ew[data-state='collapsed'] .liforma-ew__hit:not(:disabled):hover,\n\t.liforma-ew[data-state='collapsed']:has(.liforma-ew__warm:hover) .liforma-ew__hit {\n\t\ttransform: none;\n\t}\n\n\t.liforma-ew__face .liforma-et {\n\t\tbox-shadow: none;\n\t\ttransition: none;\n\t}\n\n\t.liforma-ew__warm,\n\t.liforma-ew__stage {\n\t\ttransition: none;\n\t}\n}\n";
3
3
  export declare function ensureExperienceWidgetStyles(css?: string): void;
4
4
  //# sourceMappingURL=styles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/widget/styles.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,eAAO,MAAM,qBAAqB,koXA0djC,CAAC;AAIF,wBAAgB,4BAA4B,CAAC,GAAG,GAAE,MAA8B,GAAG,IAAI,CAYtF"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../src/widget/styles.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,eAAO,MAAM,qBAAqB,4nYAwejC,CAAC;AAIF,wBAAgB,4BAA4B,CAAC,GAAG,GAAE,MAA8B,GAAG,IAAI,CAYtF"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Shared Web Audio capture: AudioWorklet when available, ScriptProcessor fallback.
3
+ * Used by BYO mic uplink and MediaStreamTrack → PCM piping.
4
+ */
5
+ export type AudioCaptureSession = {
6
+ stop(): void;
7
+ readonly fromSampleRate: number;
8
+ readonly usingWorklet: boolean;
9
+ };
10
+ export type StartAudioCaptureOptions = {
11
+ readonly mediaStream: MediaStream;
12
+ readonly targetSampleRate: number;
13
+ /** Called with pcm_s16le mono at targetSampleRate. */
14
+ readonly onPcm: (bytes: Uint8Array) => void;
15
+ /** When false, frames are dropped. */
16
+ readonly shouldSend?: () => boolean;
17
+ readonly onLog?: (line: string, kind?: 'info' | 'warn') => void;
18
+ };
19
+ /**
20
+ * Capture a MediaStream as pcm_s16le at targetSampleRate.
21
+ * Prefers AudioWorklet; falls back to ScriptProcessorNode.
22
+ */
23
+ export declare function startAudioCapture(options: StartAudioCaptureOptions): Promise<AudioCaptureSession>;
24
+ //# sourceMappingURL=audioCapture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioCapture.d.ts","sourceRoot":"","sources":["../../../src/byo/audioCapture.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,MAAM,mBAAmB,GAAG;IACjC,IAAI,IAAI,IAAI,CAAC;IACb,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACtC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAC5C,sCAAsC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;CAChE,CAAC;AAsCF;;;GAGG;AACH,wBAAsB,iBAAiB,CACtC,OAAO,EAAE,wBAAwB,GAC/B,OAAO,CAAC,mBAAmB,CAAC,CAoI9B"}
@@ -0,0 +1,33 @@
1
+ /** Liforma `speech.write` rejects chunks larger than 64 KiB. */
2
+ export declare const MAX_PCM_CHUNK_BYTES: number;
3
+ /**
4
+ * Playback / chunk guidance for custom BYO bridges (mirrors speech controller limits).
5
+ * Prefer ~20–200 ms PCM frames; the player starts after an adaptive ~80–250 ms jitter
6
+ * buffer (default 150 ms) based on chunk arrival variance.
7
+ */
8
+ export declare const BYO_PLAYBACK_GUIDANCE: {
9
+ readonly RECOMMENDED_CHUNK_MS_MIN: 20;
10
+ readonly RECOMMENDED_CHUNK_MS_MAX: 200;
11
+ readonly PLAYBACK_JITTER_BUFFER_MS: 150;
12
+ readonly PLAYBACK_JITTER_BUFFER_MS_MIN: 80;
13
+ readonly PLAYBACK_JITTER_BUFFER_MS_MAX: 250;
14
+ };
15
+ export declare function base64ToPcmBytes(b64: string): Uint8Array;
16
+ export declare function pcmBytesToBase64(bytes: Uint8Array): string;
17
+ export declare function floatToPcm16Le(input: Float32Array): Uint8Array;
18
+ /** Naive linear resample Float32 → target rate. */
19
+ export declare function resampleFloat32(input: Float32Array, fromRate: number, toRate: number): Float32Array;
20
+ /**
21
+ * Parse vendor format strings like `pcm_16000` / `pcm_24000`.
22
+ * Returns null when the format is missing or not PCM.
23
+ */
24
+ export declare function parsePcmSampleRate(format: string | null | undefined): number | null;
25
+ /**
26
+ * Write even-length PCM, splitting at MAX_PCM_CHUNK_BYTES on even boundaries.
27
+ * Callers that may receive odd-length frames should run bytes through
28
+ * {@link takeEvenPcmBytes} first so samples are not dropped across chunks.
29
+ */
30
+ export declare function writePcmInChunks(utterance: {
31
+ write: (chunk: ArrayBuffer | ArrayBufferView) => Promise<unknown>;
32
+ }, bytes: Uint8Array): Promise<void>;
33
+ //# sourceMappingURL=pcm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pcm.d.ts","sourceRoot":"","sources":["../../../src/byo/pcm.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,eAAO,MAAM,mBAAmB,QAAY,CAAC;AAE7C;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;;;;;;CAMxB,CAAC;AAEX,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAKxD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAO1D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,UAAU,CAQ9D;AAED,mDAAmD;AACnD,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CAanG;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAKnF;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACrC,SAAS,EAAE;IAAE,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,GAAG,eAAe,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,EAChF,KAAK,EAAE,UAAU,GACf,OAAO,CAAC,IAAI,CAAC,CAmBf"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Stateful cubic (Catmull-Rom) resampler for continuous PCM capture streams.
3
+ * Better than naive linear for uplink mic / track capture.
4
+ */
5
+ export type FloatResampler = {
6
+ /** Push a mono float buffer; returns samples at the target rate (may be empty). */
7
+ push(input: Float32Array): Float32Array;
8
+ /** Flush any remaining fractional sample (usually silence). */
9
+ flush(): Float32Array;
10
+ readonly fromRate: number;
11
+ readonly toRate: number;
12
+ };
13
+ /**
14
+ * Create a continuous resampler. When rates match, push() returns the input as-is
15
+ * (no copy) when possible.
16
+ */
17
+ export declare function createCubicResampler(fromRate: number, toRate: number): FloatResampler;
18
+ //# sourceMappingURL=resample.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resample.d.ts","sourceRoot":"","sources":["../../../src/byo/resample.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,cAAc,GAAG;IAC5B,mFAAmF;IACnF,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CAAC;IACxC,+DAA+D;IAC/D,KAAK,IAAI,YAAY,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB,CAAC;AAUF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAkErF"}