@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
@@ -12,8 +12,6 @@
12
12
  type ExperienceSession,
13
13
  type ListenOnceOptions,
14
14
  type SessionManifest,
15
- type SpeakOptions,
16
- type SpeechResult,
17
15
  type StartSessionOptions,
18
16
  type UtteranceResult
19
17
  } from '@liforma/client';
@@ -408,9 +406,24 @@
408
406
  return requireGeneration().started.promise;
409
407
  }
410
408
 
411
- export function speak(options: SpeakOptions): Promise<SpeechResult> {
412
- return withSession((session) => session.speak(options));
413
- }
409
+ /** Public speech API (`speak` / `play` / `createUtterance` / `interrupt`). */
410
+ export const speech = {
411
+ speak: (options: Parameters<ExperienceSession['speech']['speak']>[0]) =>
412
+ withSession((session) => session.speech.speak(options)),
413
+ play: (options: Parameters<ExperienceSession['speech']['play']>[0]) =>
414
+ withSession((session) => session.speech.play(options)),
415
+ createUtterance: (options: Parameters<ExperienceSession['speech']['createUtterance']>[0]) => {
416
+ const session = activeGeneration?.instance;
417
+ if (!session) {
418
+ throw new Error(
419
+ 'Session has not started. Wait for the player start button and the started event before using speech APIs.'
420
+ );
421
+ }
422
+ return session.speech.createUtterance(options);
423
+ },
424
+ interrupt: (options?: Parameters<ExperienceSession['speech']['interrupt']>[0]) =>
425
+ withSession((session) => session.speech.interrupt(options))
426
+ };
414
427
 
415
428
  export function startListening(): Promise<void> {
416
429
  return withSession((session) => session.startListening());
@@ -1,9 +1,14 @@
1
- import { type ExperienceEvents, type ExperienceSession, type ListenOnceOptions, type SessionManifest, type SpeakOptions, type SpeechResult, type UtteranceResult } from '@liforma/client';
1
+ import { type ExperienceEvents, type ExperienceSession, type ListenOnceOptions, type SessionManifest, type UtteranceResult } from '@liforma/client';
2
2
  import type { ExperienceProps } from './types';
3
3
  declare const Experience: import("svelte").Component<ExperienceProps, {
4
4
  ready: () => Promise<ExperienceEvents["ready"]>;
5
5
  started: () => Promise<ExperienceEvents["started"]>;
6
- speak: (options: SpeakOptions) => Promise<SpeechResult>;
6
+ /** Public speech API (`speak` / `play` / `createUtterance` / `interrupt`). */ speech: {
7
+ speak: (options: Parameters<ExperienceSession["speech"]["speak"]>[0]) => Promise<import("@liforma/client").SpeechResult>;
8
+ play: (options: Parameters<ExperienceSession["speech"]["play"]>[0]) => Promise<import("@liforma/client").SpeechResult>;
9
+ createUtterance: (options: Parameters<ExperienceSession["speech"]["createUtterance"]>[0]) => import("@liforma/client").SpeechUtterance;
10
+ interrupt: (options?: Parameters<ExperienceSession["speech"]["interrupt"]>[0]) => Promise<readonly import("@liforma/client").SpeechResult[]>;
11
+ };
7
12
  startListening: () => Promise<void>;
8
13
  stopListening: () => Promise<UtteranceResult>;
9
14
  listenOnce: (options?: ListenOnceOptions) => Promise<UtteranceResult>;
@@ -94,13 +94,10 @@
94
94
  : layers.avatarImage
95
95
  : ''
96
96
  );
97
- const sceneLayersReady = $derived(
98
- Boolean(layers) &&
99
- (!layers?.backgroundImage || backgroundReady) &&
100
- avatarReady &&
101
- (!layers?.foregroundImage || foregroundReady)
97
+ /** Fade placeholder as soon as any layer can paint — don't wait for the slowest plate. */
98
+ const revealThumb = $derived(
99
+ shouldLoad && (avatarReady || backgroundReady || foregroundReady)
102
100
  );
103
- const revealThumb = $derived(shouldLoad && sceneLayersReady);
104
101
 
105
102
  $effect(() => {
106
103
  if (lazy === false) shouldLoad = true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liforma/client",
3
- "version": "0.2.1",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "description": "Liforma browser SDK — Experience sessions, speech API, and Svelte embed component.",
6
6
  "license": "MIT",
@@ -32,6 +32,30 @@
32
32
  "./next": {
33
33
  "types": "./dist/next/next/index.d.ts",
34
34
  "import": "./dist/next/index.js"
35
+ },
36
+ "./byo": {
37
+ "types": "./dist/byo/index.d.ts",
38
+ "import": "./dist/byo/index.js"
39
+ },
40
+ "./elevenlabs": {
41
+ "types": "./dist/elevenlabs/index.d.ts",
42
+ "import": "./dist/elevenlabs/index.js"
43
+ },
44
+ "./openai": {
45
+ "types": "./dist/openai/index.d.ts",
46
+ "import": "./dist/openai/index.js"
47
+ },
48
+ "./deepgram": {
49
+ "types": "./dist/deepgram/index.d.ts",
50
+ "import": "./dist/deepgram/index.js"
51
+ },
52
+ "./google": {
53
+ "types": "./dist/google/index.d.ts",
54
+ "import": "./dist/google/index.js"
55
+ },
56
+ "./livekit": {
57
+ "types": "./dist/livekit/index.d.ts",
58
+ "import": "./dist/livekit/index.js"
35
59
  }
36
60
  },
37
61
  "files": [
@@ -39,15 +63,23 @@
39
63
  "dist/svelte",
40
64
  "dist/react",
41
65
  "dist/next",
66
+ "dist/byo",
67
+ "dist/elevenlabs",
68
+ "dist/openai",
69
+ "dist/deepgram",
70
+ "dist/google",
71
+ "dist/livekit",
42
72
  "dist/sdk",
43
73
  "README.md",
44
74
  "CHANGELOG.md",
45
75
  "LICENSE"
46
76
  ],
47
77
  "peerDependencies": {
48
- "svelte": "^5.0.0",
78
+ "@elevenlabs/client": ">=1.0.0",
79
+ "livekit-client": ">=2.0.0",
49
80
  "react": "^18.0.0 || ^19.0.0",
50
- "react-dom": "^18.0.0 || ^19.0.0"
81
+ "react-dom": "^18.0.0 || ^19.0.0",
82
+ "svelte": "^5.0.0"
51
83
  },
52
84
  "peerDependenciesMeta": {
53
85
  "svelte": {
@@ -58,12 +90,24 @@
58
90
  },
59
91
  "react-dom": {
60
92
  "optional": true
93
+ },
94
+ "@elevenlabs/client": {
95
+ "optional": true
96
+ },
97
+ "livekit-client": {
98
+ "optional": true
61
99
  }
62
100
  },
63
101
  "scripts": {
64
- "build": "npm run build:v2 && npm run build:npm && npm run build:svelte && npm run build:react && npm run build:next && npm run copy:preview",
102
+ "build": "npm run build:v2 && npm run build:npm && npm run build:svelte && npm run build:react && npm run build:next && npm run build:byo && npm run build:elevenlabs && npm run build:openai && npm run build:deepgram && npm run build:google && npm run build:livekit && npm run copy:preview",
65
103
  "build:react": "vite build --config vite.config.react.ts && tsc -p tsconfig.react.json",
66
104
  "build:next": "vite build --config vite.config.next.ts && tsc -p tsconfig.next.json",
105
+ "build:byo": "vite build --config vite.config.byo.ts && tsc -p tsconfig.byo.json",
106
+ "build:elevenlabs": "vite build --config vite.config.elevenlabs.ts && tsc -p tsconfig.elevenlabs.json",
107
+ "build:openai": "vite build --config vite.config.openai.ts && tsc -p tsconfig.openai.json",
108
+ "build:deepgram": "vite build --config vite.config.deepgram.ts && tsc -p tsconfig.deepgram.json",
109
+ "build:google": "vite build --config vite.config.google.ts && tsc -p tsconfig.google.json",
110
+ "build:livekit": "vite build --config vite.config.livekit.ts && tsc -p tsconfig.livekit.json",
67
111
  "copy:preview": "mkdir -p dist/preview && cp preview/v2-embed-test.html dist/preview/ && cp preview/v2-embed-test-redirect.html dist/preview/",
68
112
  "build:v2": "vite build --config vite.config.v2.ts",
69
113
  "build:npm": "vite build --config vite.config.npm.ts && tsc -p tsconfig.npm.json",
@@ -115,7 +159,11 @@
115
159
  "fetch:face-landmarker": "node scripts/fetch-face-landmarker.mjs",
116
160
  "fetch:anime-face-detector": "node scripts/fetch-anime-face-detector.mjs",
117
161
  "fetch:face-parsing": "node scripts/fetch-face-parsing.mjs",
118
- "fetch:models": "npm run fetch:depth-anything-v2 && npm run fetch:video-depth-anything && npm run fetch:depth-pro && npm run fetch:face-landmarker && npm run fetch:anime-face-detector && npm run fetch:face-parsing",
162
+ "fetch:wav2vec-phoneme-ctc": "node scripts/fetch-wav2vec-phoneme-ctc.mjs",
163
+ "fetch:lf-sta": "node scripts/fetch-wav2vec-phoneme-ctc.mjs",
164
+ "fetch:supertonic-3": "node scripts/fetch-supertonic-3.mjs",
165
+ "fetch:lf-tts": "node scripts/fetch-supertonic-3.mjs",
166
+ "fetch:models": "npm run fetch:depth-anything-v2 && npm run fetch:video-depth-anything && npm run fetch:depth-pro && npm run fetch:face-landmarker && npm run fetch:anime-face-detector && npm run fetch:face-parsing && npm run fetch:lf-sta && npm run fetch:lf-tts",
119
167
  "locations": "npm run catalogue:locations && npm run build:locations",
120
168
  "configure:cors": "node scripts/configure-r2-cors.mjs",
121
169
  "verify:cors": "node scripts/verify-cdn-cors.mjs",
@@ -130,20 +178,22 @@
130
178
  },
131
179
  "devDependencies": {
132
180
  "@aws-sdk/client-s3": "^3.1000.0",
181
+ "@elevenlabs/client": "^1.17.0",
133
182
  "@sveltejs/package": "^2.5.8",
134
183
  "@sveltejs/vite-plugin-svelte": "^7.0.0",
135
184
  "@testing-library/react": "^16.3.0",
136
185
  "@testing-library/svelte": "^5.4.2",
186
+ "@types/node": "^25.9.3",
137
187
  "@types/react": "^19.1.12",
138
188
  "@types/react-dom": "^19.1.9",
139
189
  "@vitejs/plugin-react": "^5.0.2",
140
- "@types/node": "^25.9.3",
141
190
  "@webgpu/types": "^0.1.70",
142
191
  "dotenv": "^17.2.3",
143
192
  "jsdom": "^30.0.1",
144
- "sharp": "^0.34.2",
193
+ "livekit-client": "^2.21.0",
145
194
  "react": "^19.1.1",
146
195
  "react-dom": "^19.1.1",
196
+ "sharp": "^0.34.2",
147
197
  "svelte": "^5.55.2",
148
198
  "svelte-check": "^4.7.4",
149
199
  "typescript": "^6.0.3",