@liforma/client 0.4.12 → 0.4.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/dist/next/index.js +394 -369
- package/dist/next/index.js.map +1 -1
- package/dist/next/thumbnail.js +1 -1
- package/dist/next/thumbnail.js.map +1 -1
- package/dist/next/v2/embed/iframeHost.d.ts +4 -8
- package/dist/next/v2/embed/iframeHost.d.ts.map +1 -1
- package/dist/next/v2/embed/protocol.d.ts +29 -2
- package/dist/next/v2/embed/protocol.d.ts.map +1 -1
- package/dist/next/v2/experience.d.ts +11 -0
- package/dist/next/v2/experience.d.ts.map +1 -1
- package/dist/npm/index.js +206 -181
- package/dist/npm/index.js.map +1 -1
- package/dist/npm/thumbnail/index.js +1 -1
- package/dist/npm/thumbnail/index.js.map +1 -1
- package/dist/npm/v2/embed/iframeHost.d.ts +4 -8
- package/dist/npm/v2/embed/iframeHost.d.ts.map +1 -1
- package/dist/npm/v2/embed/protocol.d.ts +29 -2
- package/dist/npm/v2/embed/protocol.d.ts.map +1 -1
- package/dist/npm/v2/experience.d.ts +11 -0
- package/dist/npm/v2/experience.d.ts.map +1 -1
- package/dist/react/component/experienceComponentRuntime.d.ts +3 -0
- package/dist/react/component/experienceComponentRuntime.d.ts.map +1 -1
- package/dist/react/component/experienceComponentTypes.d.ts +9 -0
- package/dist/react/component/experienceComponentTypes.d.ts.map +1 -1
- package/dist/react/index.js +514 -473
- package/dist/react/index.js.map +1 -1
- package/dist/react/react/Experience.d.ts.map +1 -1
- package/dist/react/thumbnail.js +1 -1
- package/dist/react/thumbnail.js.map +1 -1
- package/dist/react/v2/embed/iframeHost.d.ts +4 -8
- package/dist/react/v2/embed/iframeHost.d.ts.map +1 -1
- package/dist/react/v2/embed/protocol.d.ts +29 -2
- package/dist/react/v2/embed/protocol.d.ts.map +1 -1
- package/dist/react/v2/experience.d.ts +11 -0
- package/dist/react/v2/experience.d.ts.map +1 -1
- package/dist/sdk/v2/client.js +2 -2
- package/dist/sdk/v2/client.js.map +1 -1
- package/dist/sdk/v2/thumbnail.js +1 -1
- package/dist/sdk/v2/thumbnail.js.map +1 -1
- package/dist/svelte/Experience.svelte +22 -0
- package/dist/svelte/Experience.svelte.d.ts +1 -0
- package/package.json +1 -1
package/dist/sdk/v2/client.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var Liforma=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});function t(){if(globalThis.__LIFORMA_STACK===`local`)return!0;if(typeof location>`u`)return!1;try{return new URLSearchParams(location.search).get(`stack`)===`local`}catch{return!1}}var n=`https://api.liforma.ai`,r=`http://localhost:3001`;function i(){let e=globalThis.__LIFORMA_API_BASE_URL;if(e?.trim())return e.trim().replace(/\/$/,``);if(typeof document>`u`)return null;let t=(document.querySelector(`script[data-liforma-sdk][src*="client.js"]`)??document.querySelector(`script[src*="/sdk/v2/client.js"]`))?.getAttribute(`data-api-base-url`)?.trim();return t?t.replace(/\/$/,``):null}function a(){return i()||(t()?r:n)}var o=class extends Error{code;requestId;status;details;constructor(e,t){super(e,t?.cause===void 0?void 0:{cause:t.cause}),this.name=`LiformaError`,this.code=t?.code?.trim()||`UNKNOWN`,this.requestId=t?.requestId?.trim()||void 0,this.status=t?.status,this.details=t?.details}};function s(e){if(!(!e||typeof e!=`object`||Array.isArray(e)))return e}function c(e,t,n){let r=n?.get(`Liforma-Request-Id`)?.trim()||void 0,i;try{i=JSON.parse(t)}catch{}let a=i?.error&&typeof i.error==`object`?i.error:void 0,c=a?.code??i?.code,l=a?.message??i?.message,u=a?.requestId??i?.requestId??r,d=typeof c==`string`&&c.trim()?c.trim():`HTTP_ERROR`,f=typeof l==`string`&&l.trim()?l.trim():t.trim().slice(0,500)||`Request failed (${e})`,p=typeof u==`string`&&u.trim()?u.trim():r,{code:m,message:h,requestId:g,..._}=s(a)??s(i)??{};return new o(f,{code:d,requestId:p,status:e,details:Object.keys(_).length>0?_:void 0})}var l=128,u=/[\u0000-\u001f\u007f]/g;function d(e){if(!e)return;let t=e.replace(u,``).trim();if(t)return t.slice(0,l)}function f(e){let t=new URLSearchParams((e??``).startsWith(`?`)?(e??``).slice(1):e??``);return{...d(t.get(`utm_source`))?{utmSource:d(t.get(`utm_source`))}:{},...d(t.get(`utm_medium`))?{utmMedium:d(t.get(`utm_medium`))}:{},...d(t.get(`utm_campaign`))?{utmCampaign:d(t.get(`utm_campaign`))}:{},...d(t.get(`utm_content`))?{utmContent:d(t.get(`utm_content`))}:{},...d(t.get(`utm_term`))?{utmTerm:d(t.get(`utm_term`))}:{}}}function p(e){if(e===!1)return;if(e&&typeof e==`object`){let t={...d(e.utmSource)?{utmSource:d(e.utmSource)}:{},...d(e.utmMedium)?{utmMedium:d(e.utmMedium)}:{},...d(e.utmCampaign)?{utmCampaign:d(e.utmCampaign)}:{},...d(e.utmContent)?{utmContent:d(e.utmContent)}:{},...d(e.utmTerm)?{utmTerm:d(e.utmTerm)}:{},...d(e.referrer)?{referrer:d(e.referrer)}:{}};return Object.keys(t).length?t:void 0}if(typeof window>`u`)return;let t=f(window.location?.search),n=d(document.referrer||void 0),r={...t,...n?{referrer:n}:{}};return Object.keys(r).length?r:void 0}function m(e){let t=e.locale?.trim();if(t)return t;let n=e.language?.trim();if(n)return n;if(typeof navigator<`u`&&navigator.language?.trim())return navigator.language.trim()}function h(e){let t=e.secondaryLocale?.trim(),n=e.learningLocale?.trim();if(t&&n&&t!==n)throw Error(`secondaryLocale and learningLocale disagree; pass only one or make them equal.`);return t||n||void 0}function g(e,t){let n=e.trim();if(!n)throw Error(`sessionEndpoint must not be empty.`);if(typeof location>`u`)throw Error(`sessionEndpoint is only available in a browser.`);let r=new URL(n,location.href);if(r.origin!==location.origin)throw Error(`sessionEndpoint must be same-origin.`);let i=t.experienceId.trim();if(!i)throw Error(`sessionEndpoint requires experienceId.`);let a=m(t),o=h(t),s=t.idempotencyKey?.trim();return{url:r.toString(),init:{method:`POST`,credentials:`same-origin`,headers:{Accept:`application/json`,"Content-Type":`application/json`,...s?{"Idempotency-Key":s}:{}},body:JSON.stringify({experienceId:i,...a?{locale:a}:{},...o?{secondaryLocale:o}:{},...t.mode?{mode:t.mode}:{},...t.speechInputMode?{speechInputMode:t.speechInputMode}:{},...t.speechOnly===void 0?{}:{speechOnly:t.speechOnly},...(()=>{let e=p(t.attribution);return e?{attribution:e}:{}})(),...t.alreadyConverted?.length?{alreadyConverted:[...t.alreadyConverted]}:{}})}}}function _(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function v(e){return typeof e==`boolean`}function y(e){if(!_(e))return null;let t=e.speech,n=e.conversation,r=e.avatar,i=e.tools;return!_(t)||!_(n)||!_(r)||!_(i)||!v(t.input)||!v(t.output)||!v(t.externalAudio)||!v(n.managed)||!v(r.enabled)||!v(i.enabled)?null:{speech:{input:t.input,output:t.output,externalAudio:t.externalAudio},conversation:{managed:n.managed},avatar:{enabled:r.enabled},tools:{enabled:i.enabled}}}function b(e){return!_(e)||!v(e.avatar)||!v(e.speechInput)||!v(e.speechOutput)||!v(e.tools)||!v(e.externalAudio)?null:{speech:{input:e.speechInput,output:e.speechOutput,externalAudio:e.externalAudio},conversation:{managed:!0},avatar:{enabled:e.avatar},tools:{enabled:e.tools}}}function x(e){return y(e)??b(e)}function S(e){if(!_(e))throw Error(`Session Launch response is missing session.`);let t=typeof e.id==`string`?e.id.trim():``,n=typeof e.experienceId==`string`?e.experienceId.trim():``,r=typeof e.experienceRevisionId==`string`?e.experienceRevisionId.trim():``,i=typeof e.expiresAt==`string`?e.expiresAt.trim():``,a=typeof e.locale==`string`?e.locale.trim():``,o=typeof e.secondaryLocale==`string`&&e.secondaryLocale.trim()?e.secondaryLocale.trim():void 0,s=e.mode===`conversation`||e.mode===`presenter`?e.mode:null,c=x(e.capabilities),l=C(e.localeVoiceFallbacks),u=e.status===`active`||e.status===`ended`?e.status:void 0,d=typeof e.createdAt==`string`&&e.createdAt.trim()?e.createdAt.trim():void 0;if(!t||!n||!r||!i||!a||!s||!c)throw Error(`Session Launch response has an invalid session object.`);return{id:t,experienceId:n,experienceRevisionId:r,expiresAt:i,locale:a,...o?{secondaryLocale:o}:{},mode:s,capabilities:c,...l?{localeVoiceFallbacks:l}:{},...u?{status:u}:{},...d?{createdAt:d}:{}}}function C(e){if(!Array.isArray(e)||e.length===0)return;let t=[];for(let n of e){if(!_(n))continue;let e=n.axis===`locale`||n.axis===`secondaryLocale`?n.axis:null,r=typeof n.requested==`string`?n.requested.trim():``,i=typeof n.resolved==`string`?n.resolved.trim():``;!e||!r||!i||n.reason!==`voice_unsupported`||t.push({axis:e,requested:r,resolved:i,reason:`voice_unsupported`})}return t.length>0?t:void 0}function w(e){let t=e.localeVoiceFallbacks;if(t?.length)for(let e of t){let t=e.axis===`secondaryLocale`?`secondaryLocale`:`locale`;console.warn(`[liforma] Session ${t} fell back to ${e.resolved} because the voice does not support ${e.requested}.`)}}function T(e){if(!_(e))throw Error(`Session Launch response must be a JSON object.`);let t=typeof e.launch==`string`?e.launch.trim():``;if(!t)throw Error(`Session Launch response is missing launch.`);let n=S(e.session);return w(n),{session:n,launch:t}}function ee(){try{if(typeof globalThis.location?.origin==`string`&&globalThis.location.origin)return globalThis.location.origin}catch{}}function te(e){return e?e.trim().toUpperCase().replace(/-/g,`_`):``}function E(e,t){let n=ee(),r=te(t.code),i=t.message.trim(),a=t.details??{};if(r===`ORIGIN_NOT_ALLOWED`||/^Origin not allowed/i.test(i)&&n){if(i.includes(e)&&i.includes(`allowed origin`))return t;let r=typeof a.origin==`string`&&a.origin||n||`(unknown origin)`;return new o(`Your origin ${r} is not an allowed origin for experience ${e}. If you own this experience, sign in to the Liforma developer portal (app.liforma.ai), open Workspace → Settings → Origins, add ${r} to the list of allowed origins, and ensure “Allow public client-only embeds” is enabled.`,{code:`ORIGIN_NOT_ALLOWED`,requestId:t.requestId,status:t.status,details:a})}return r===`BROWSER_EMBEDS_DISABLED`||/^Browser embeds are not enabled/i.test(i)?i.includes(`Allow public client-only embeds`)?t:new o(`Browser embeds are not enabled for experience ${e}. If you own this experience, sign in to the Liforma developer portal (app.liforma.ai), open Workspace → Settings → Origins, and enable “Allow public client-only embeds”.`,{code:`BROWSER_EMBEDS_DISABLED`,requestId:t.requestId,status:t.status,details:a}):r===`EXPERIENCE_UNAVAILABLE`||/^Experience is not available\.?$/i.test(i)||/^Unknown experience\.?$/i.test(i)?i.includes(`No playable experience found`)?t:new o(`No playable experience found for “${e}”. Check that the experience id is correct (it should look like exp_…), and that the experience exists and is published in the Liforma developer portal (app.liforma.ai). Deleted, archived, and unpublished experiences cannot be started from a browser embed.`,{code:`EXPERIENCE_UNAVAILABLE`,requestId:t.requestId,status:t.status,details:a}):t}function ne(e){let t=e?.locale?.trim();if(t)return t;let n=e?.language?.trim();if(n)return n;if(typeof navigator<`u`&&navigator.language?.trim())return navigator.language.trim()}function re(e){let t=e?.secondaryLocale?.trim(),n=e?.learningLocale?.trim();if(t&&n&&t!==n)throw new o(`secondaryLocale and learningLocale disagree; pass only one or make them equal.`,{code:`INVALID_BODY`});return t||n||void 0}function ie(e,t){let n={experienceId:e},r=ne(t);r&&(n.locale=r);let i=re(t);i&&(n.secondaryLocale=i),t?.mode&&(n.mode=t.mode),t?.speechInputMode&&(n.speechInputMode=t.speechInputMode),t?.speechOnly!==void 0&&(n.speechOnly=t.speechOnly);let a=p(t?.attribution);return a&&(n.attribution=a),t?.alreadyConverted?.length&&(n.alreadyConverted=[...t.alreadyConverted]),n}async function ae(e,t){let n=a(),r=t?.idempotencyKey?.trim(),i=await fetch(`${n}/v1/browser-sessions`,{method:`POST`,headers:{"Content-Type":`application/json`,...r?{"Idempotency-Key":r}:{}},body:JSON.stringify(ie(e,t))});if(!i.ok){let t=await i.text();throw E(e,c(i.status,t,i.headers))}let s;try{s=await i.json()}catch{throw new o(`Browser session mint returned invalid JSON.`,{code:`INVALID_RESPONSE`,status:i.status,requestId:i.headers.get(`Liforma-Request-Id`)??void 0})}return T(s)}async function oe(e,t){let n=g(e,t),r=new AbortController,i=()=>r.abort(t.signal?.reason);t.signal?.aborted?i():t.signal?.addEventListener(`abort`,i,{once:!0});let a=globalThis.setTimeout(()=>r.abort(new DOMException(`Session endpoint timed out.`,`TimeoutError`)),t.timeoutMs??3e4),s;try{s=await fetch(n.url,{...n.init,signal:r.signal})}finally{globalThis.clearTimeout(a),t.signal?.removeEventListener(`abort`,i)}if(!s.ok){let e=await s.text();throw c(s.status,e,s.headers)}if(!s.headers.get(`content-type`)?.toLowerCase().includes(`application/json`))throw new o(`Session endpoint must return a JSON Session Launch response.`,{code:`INVALID_RESPONSE`,status:s.status,requestId:s.headers.get(`Liforma-Request-Id`)??void 0});let l;try{l=await s.json()}catch{throw new o(`Session endpoint returned invalid JSON.`,{code:`INVALID_RESPONSE`,status:s.status,requestId:s.headers.get(`Liforma-Request-Id`)??void 0})}return T(l)}function se(e){return typeof e!=`object`||!e?!1:typeof e[Symbol.asyncIterator]==`function`}function ce(e){if(typeof e==`string`){let t=e.trim();if(!t)throw Error(`conversationProcessor returned empty text.`);return{text:t}}let t=e.text.trim();if(!t)throw Error(`conversationProcessor returned empty text.`);return{text:t,...e.characterId?{characterId:e.characterId}:{},...e.behavior?{behavior:e.behavior}:{}}}async function le(e,t){let n=await e(t);return se(n)?{kind:`stream`,stream:n}:{kind:`complete`,speech:ce(n)}}var ue=`3002`;function D(e){let t=new URL(e);return t.hostname===`localhost`||t.hostname===`127.0.0.1`?`Cannot connect to the Liforma player at ${e} — nothing is listening on port ${t.port||ue}. Start the player dev server in player.liforma.ai (npm run dev).`:`Cannot connect to the Liforma player at ${e}. The embed did not load; check your network connection and player URL configuration.`}async function de(e,t){try{await fetch(e,{method:`GET`,mode:`no-cors`,signal:AbortSignal.timeout(8e3)})}catch{throw Error(D(t))}}function O(e,t,n,r){try{r&&r.length>0?e.postMessage(t,n,r):e.postMessage(t,n)}catch(e){throw e instanceof DOMException&&e.name===`SecurityError`?Error(D(n),{cause:e}):e}}var fe=new Set([1,2]);function pe(e){return typeof e==`number`&&fe.has(e)}var me=new Set(`close.stateUpdate.commandResult.userTranscript.characterSpeechStarted.characterSpeechEnded.characterFocusChanged.conversationUpdate.listeningState.userSpeechStarted.userSpeechEnded.modeChange.activityChange.feedback.feedbackFailed.message.started.embedReady.widgetReady.widgetExpand.widgetCollapse.widgetAudioSettings.widgetDragStart.widgetDragMove.widgetDragEnd.fullWindow.interactionChange`.split(`.`));function he(e){if(!e||typeof e!=`object`)return null;let t=e;if(!pe(t.schemaVersion)||!t.type||!me.has(t.type))return null;if(t.type===`embedReady`||t.type===`widgetReady`||t.type===`widgetExpand`||t.type===`widgetCollapse`)return t;if(t.type===`fullWindow`){let e=t.payload;return!e||typeof e!=`object`||typeof e.active!=`boolean`?null:t}if(t.type===`widgetAudioSettings`){let e=t.payload;return!e||typeof e!=`object`||typeof e.open!=`boolean`?null:t}if(t.type===`widgetDragStart`||t.type===`widgetDragEnd`){let e=t.payload;return!e||typeof e!=`object`||typeof e.pointerId!=`number`||!Number.isFinite(e.pointerId)?null:t}if(t.type===`widgetDragMove`){let e=t.payload;if(!e||typeof e!=`object`)return null;let{pointerId:n,dx:r,dy:i}=e;return typeof n!=`number`||!Number.isFinite(n)||typeof r!=`number`||!Number.isFinite(r)||typeof i!=`number`||!Number.isFinite(i)?null:t}let n=t.payload;return!n||typeof n!=`object`?null:t}function ge(e,t,n){let r=e.trim();if(!r)throw Error(`createLaunchMessage requires a non-empty launch string.`);let i=n?.startButton,a=n?.theme,o=n?.showFeedback,s=n?.interaction;return{type:`launch`,schemaVersion:2,payload:{launch:r,...t===void 0?{}:{session:t},...i?{startButton:i}:{},...a?{theme:a}:{},...o===void 0?{}:{showFeedback:o},...s?{interaction:s}:{}}}}function _e(){return{type:`parentHello`,schemaVersion:2}}function ve(e){return{type:`widgetSetChrome`,schemaVersion:2,payload:{mode:e}}}function ye(){return{type:`widgetToggleAudioSettings`,schemaVersion:2,payload:{}}}var be=`2147483000`;function xe(e){let{style:t}=e;return{position:t.position,top:t.top,right:t.right,bottom:t.bottom,left:t.left,inset:t.inset,width:t.width,height:t.height,zIndex:t.zIndex,margin:t.margin,borderRadius:t.borderRadius,maxWidth:t.maxWidth,maxHeight:t.maxHeight}}function Se(e){let{style:t}=e;t.position=`fixed`,t.top=`0`,t.right=`0`,t.bottom=`0`,t.left=`0`,t.inset=`0`,t.width=`100vw`,t.width=`100dvw`,t.height=`100vh`,t.height=`100dvh`,t.zIndex=be,t.margin=`0`,t.borderRadius=`0`,t.maxWidth=`none`,t.maxHeight=`none`,e.dataset.liformaFullWindow=`1`}function k(e,t){if(delete e.dataset.liformaFullWindow,!t){e.style.position=``,e.style.top=``,e.style.right=``,e.style.bottom=``,e.style.left=``,e.style.inset=``,e.style.width=``,e.style.height=``,e.style.zIndex=``,e.style.margin=``,e.style.borderRadius=``,e.style.maxWidth=``,e.style.maxHeight=``;return}let{style:n}=e;n.position=t.position,n.top=t.top,n.right=t.right,n.bottom=t.bottom,n.left=t.left,n.inset=t.inset,n.width=t.width,n.height=t.height,n.zIndex=t.zIndex,n.margin=t.margin,n.borderRadius=t.borderRadius,n.maxWidth=t.maxWidth,n.maxHeight=t.maxHeight}function A(e){return e}function j(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?`cmd_${crypto.randomUUID().replace(/-/g,``).slice(0,12)}`:`cmd_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}var Ce=3e4;function we(e){let t=e.container;getComputedStyle(t).position===`static`&&(t.style.position=`relative`);let n=document.createElement(`iframe`);n.src=e.src,n.title=`Liforma experience`,n.setAttribute(`allow`,`microphone; autoplay; clipboard-read; clipboard-write`),n.style.cssText=e.transparent?`display:block;position:absolute;inset:0;width:100%;height:100%;border:0;background:transparent;`:`display:block;position:absolute;inset:0;width:100%;height:100%;border:0;background:#030508;`,e.transparent&&n.setAttribute(`allowtransparency`,`true`);let r=!1,i=!1,a=null,o=t.closest(`.liforma-experience-shell`)instanceof HTMLElement?t.closest(`.liforma-experience-shell`):t,s=t=>{i!==t&&(i=t,t?(a=xe(o),Se(o)):(k(o,a),a=null),e.onFullWindowChange?.(t))},c=new Map,l=null,u=0,d=0,f=[],p=null,m=null,h=new Promise((e,t)=>{p=e,m=t}),g=()=>{for(let e of f)window.clearTimeout(e);f.length=0},_=t=>{if(r)return;let i=Date.now();if(d>0&&i-d<250)return;d=i,g();let a=ge(t.launch,t.session,t.chrome),o=()=>{if(r)return;let t=n.contentWindow;t&&O(t,a,e.playerOrigin)};o();for(let e=1;e<=12;e+=1)f.push(window.setTimeout(o,e*75))},v=()=>{r||!l||_(l)},y=()=>{if(u+=1,u===1){de(e.src,e.playerOrigin).then(()=>p?.(),e=>m?.(e instanceof Error?e:Error(String(e))));return}d=0,v()},b=()=>{u>0||m?.(Error(D(e.playerOrigin)))};n.addEventListener(`load`,y),n.addEventListener(`error`,b);let x=t=>{if(r||t.source!==n.contentWindow||t.origin!==e.playerOrigin)return;let i=he(t.data);if(i)switch(i.type){case`close`:e.onClose?.(i.payload);break;case`stateUpdate`:e.onPlayerStatusChange?.(i.payload.state),e.onStateUpdate?.(i.payload.state);break;case`commandResult`:{let e=c.get(i.payload.correlationId);if(!e)return;c.delete(i.payload.correlationId),i.payload.ok?e.resolve(i.payload.result):e.reject(Error(i.payload.error??`Command failed.`));break}case`userTranscript`:e.onUserTranscript?.(i.payload);break;case`characterSpeechStarted`:e.onCharacterSpeechStarted?.(i.payload);break;case`characterSpeechEnded`:e.onCharacterSpeechEnded?.(i.payload);break;case`characterFocusChanged`:e.onCharacterFocusChanged?.(i.payload);break;case`conversationUpdate`:e.onConversationUpdate?.(i.payload.conversation);break;case`listeningState`:e.onListeningState?.(i.payload.listening);break;case`userSpeechStarted`:e.onUserSpeechStarted?.(i.payload);break;case`userSpeechEnded`:e.onUserSpeechEnded?.(i.payload);break;case`modeChange`:e.onActivityChange?.(A(i.payload.mode));break;case`activityChange`:e.onActivityChange?.(i.payload.activity);break;case`feedback`:e.onFeedback?.(i.payload);break;case`feedbackFailed`:e.onFeedbackFailed?.(i.payload);break;case`message`:e.onMessage?.(i.payload);break;case`started`:e.onStarted?.(i.payload);break;case`embedReady`:v();break;case`widgetReady`:e.onWidgetReady?.();break;case`widgetExpand`:e.onWidgetExpand?.();break;case`widgetCollapse`:e.onWidgetCollapse?.();break;case`widgetAudioSettings`:e.onWidgetAudioSettings?.(i.payload.open);break;case`widgetDragStart`:e.onWidgetDragStart?.(i.payload);break;case`widgetDragMove`:e.onWidgetDragMove?.(i.payload);break;case`widgetDragEnd`:e.onWidgetDragEnd?.(i.payload);break;case`fullWindow`:s(i.payload.active);break;case`interactionChange`:e.onInteractionChange?.(i.payload.interaction);break}};if(window.addEventListener(`message`,x),t.replaceChildren(n),t.clientHeight<2&&!t.style.minHeight){let e=getComputedStyle(t).minHeight;(e===`0px`||e===`auto`)&&(t.style.minHeight=`480px`)}let S=(t,i)=>{if(r)return;let a=n.contentWindow;if(!a)throw Error(D(e.playerOrigin));O(a,t,e.playerOrigin,i)},C=(e,t=12e4,n)=>{let r=e.type!==`parentHello`&&e.payload&&`correlationId`in e.payload?e.payload.correlationId:j();return e.type!==`parentHello`&&e.payload&&`correlationId`in e.payload||e.type!==`parentHello`&&e.payload&&(e.payload.correlationId=r),new Promise((i,a)=>{c.set(r,{resolve:e=>i(e),reject:a}),S(e,n),setTimeout(()=>{c.has(r)&&(c.delete(r),a(Error(`Timed out waiting for player command result.`)))},t)})};return{waitForLoad(){return h},postParentHello(){S(_e())},postLaunch(e,t,n){r||(l={launch:e,session:t,chrome:n},d=0,_(l))},postManifest(e){if(typeof e==`string`){this.postLaunch(e);return}if(e&&typeof e==`object`&&typeof e.launch==`string`){let t=String(e.launch),n=e.session;this.postLaunch(t,n);return}throw Error(`postManifest is deprecated; use postLaunch with an opaque launch string from SessionLaunchResponse.`)},postWidgetSetChrome(e){S(ve(e))},postWidgetToggleAudioSettings(){S(ye())},speak(e){return C({type:`speak`,schemaVersion:2,payload:{correlationId:j(),text:e.text,...e.characterId?{characterId:e.characterId}:{},...e.behavior?{behavior:e.behavior}:{}}})},startListening(){return C({type:`startListening`,schemaVersion:2,payload:{correlationId:j()}})},stopListening(){return C({type:`stopListening`,schemaVersion:2,payload:{correlationId:j()}})},listenOnce(e){return C({type:`listenOnce`,schemaVersion:2,payload:{correlationId:j(),...e?.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}})},async speakProcessorStream(e,t){let n=j(),r=j(),i=(await C({type:`speakStreamStart`,schemaVersion:2,payload:{correlationId:n,...t?.characterId?{characterId:t.characterId}:{},...t?.behavior?{behavior:t.behavior}:{}}})).streamId;try{for await(let n of e){if(t?.signal?.aborted)throw new DOMException(`Processor stream aborted.`,`AbortError`);n&&S({type:`speakStreamChunk`,schemaVersion:2,payload:{streamId:i,text:n}})}if(t?.signal?.aborted)throw new DOMException(`Processor stream aborted.`,`AbortError`);return await C({type:`speakStreamEnd`,schemaVersion:2,payload:{correlationId:r,streamId:i}})}catch(e){try{await C({type:`speakStreamEnd`,schemaVersion:2,payload:{correlationId:r,streamId:i}})}catch{}throw e}},speechPlay(e){let t=j(),n=[];return(e.source.kind===`pcm`||e.source.kind===`encoded`)&&n.push(e.source.data),C({type:`speechPlay`,schemaVersion:2,payload:{correlationId:t,source:e.source,...e.characterId?{characterId:e.characterId}:{},...e.transcript===void 0?{}:{transcript:e.transcript},...e.history?{history:e.history}:{},...e.queue?{queue:e.queue}:{}}},12e4,n)},speechUtteranceBegin(e){return C({type:`speechUtteranceBegin`,schemaVersion:2,payload:{correlationId:j(),utteranceId:e.utteranceId,format:e.format,queue:e.queue,...e.characterId?{characterId:e.characterId}:{},...e.transcript===void 0?{}:{transcript:e.transcript}}})},speechUtteranceWrite(e){return C({type:`speechUtteranceWrite`,schemaVersion:2,payload:{correlationId:j(),utteranceId:e.utteranceId,audio:e.audio,byteLength:e.byteLength}},Ce,[e.audio])},speechUtteranceSetTranscript(e){return C({type:`speechUtteranceSetTranscript`,schemaVersion:2,payload:{correlationId:j(),utteranceId:e.utteranceId,transcript:e.transcript}})},speechUtteranceClose(e){return C({type:`speechUtteranceClose`,schemaVersion:2,payload:{correlationId:j(),utteranceId:e.utteranceId,...e.transcript===void 0?{}:{transcript:e.transcript},...e.history?{history:e.history}:{}}})},speechUtteranceCancel(e){return C({type:`speechUtteranceCancel`,schemaVersion:2,payload:{correlationId:j(),utteranceId:e.utteranceId}})},speechInterrupt(e){return C({type:`speechInterrupt`,schemaVersion:2,payload:{correlationId:j(),...e}})},getConversation(){return C({type:`getConversation`,schemaVersion:2,payload:{correlationId:j()}})},focusCharacter(e){return C({type:`focusCharacter`,schemaVersion:2,payload:{correlationId:j(),characterId:e}})},setFit(e){return C({type:`setFit`,schemaVersion:2,payload:{correlationId:j(),fit:e}})},setStage(e){return C({type:`setStage`,schemaVersion:2,payload:{correlationId:j(),stage:e}})},setPipBackground(e){return C({type:`setPipBackground`,schemaVersion:2,payload:{correlationId:j(),pipBackground:e}})},setPipShadow(e){return C({type:`setPipShadow`,schemaVersion:2,payload:{correlationId:j(),pipShadow:e}})},setInteraction(e){return C({type:`setInteraction`,schemaVersion:2,payload:{correlationId:j(),interaction:e}})},getInteraction(){return C({type:`getInteraction`,schemaVersion:2,payload:{correlationId:j()}})},conversion(e){return C({type:`conversion`,schemaVersion:2,payload:{correlationId:j(),key:e}})},engage(){return C({type:`engage`,schemaVersion:2,payload:{correlationId:j()}})},reportSdkError(e){return C({type:`reportSdkError`,schemaVersion:2,payload:{correlationId:j(),errorCode:e.errorCode,message:e.message,stack:e.stack,severity:e.severity,operation:e.operation,release:e.release}})},destroy(){if(!r){r=!0,i&&s(!1);for(let e of c.values())e.reject(Error(`Iframe host destroyed.`));c.clear(),g(),l=null,n.removeEventListener(`load`,y),n.removeEventListener(`error`,b),window.removeEventListener(`message`,x),n.remove()}}}}function Te(e){let t,n=!1,r=!1,i=()=>{r||!n||t===void 0||(r=!0,e(t))};return{setValue(e){t=e,i()},markReady(){n=!0,i()}}}var M=`sdk@${{name:`@liforma/client`,version:`0.4.11`,type:`module`,description:`Liforma browser SDK — Experience sessions, speech API, and Svelte embed component.`,license:`MIT`,homepage:`https://docs.liforma.ai`,repository:{type:`git`,url:`git+https://github.com/LiformaLtd/cdn.liforma.ai.git`},bugs:{url:`https://github.com/LiformaLtd/cdn.liforma.ai/issues`},publishConfig:{access:`public`},sideEffects:!1,exports:{".":{types:`./dist/npm/v2/npm.d.ts`,import:`./dist/npm/index.js`},"./svelte":{types:`./dist/svelte/index.d.ts`,import:`./dist/svelte/index.js`,svelte:`./dist/svelte/index.js`},"./svelte/thumbnail":{types:`./dist/svelte/thumbnail.d.ts`,import:`./dist/svelte/thumbnail.js`,svelte:`./dist/svelte/thumbnail.js`},"./thumbnail":{types:`./dist/npm/thumbnail/index.d.ts`,import:`./dist/npm/thumbnail/index.js`},"./react":{types:`./dist/react/react/index.d.ts`,import:`./dist/react/index.js`},"./react/thumbnail":{types:`./dist/react/react/thumbnail.d.ts`,import:`./dist/react/thumbnail.js`},"./next":{types:`./dist/next/next/index.d.ts`,import:`./dist/next/index.js`},"./next/thumbnail":{types:`./dist/next/next/thumbnail.d.ts`,import:`./dist/next/thumbnail.js`},"./byo":{types:`./dist/byo/index.d.ts`,import:`./dist/byo/index.js`},"./elevenlabs":{types:`./dist/elevenlabs/index.d.ts`,import:`./dist/elevenlabs/index.js`},"./openai":{types:`./dist/openai/index.d.ts`,import:`./dist/openai/index.js`},"./deepgram":{types:`./dist/deepgram/index.d.ts`,import:`./dist/deepgram/index.js`},"./google":{types:`./dist/google/index.d.ts`,import:`./dist/google/index.js`},"./livekit":{types:`./dist/livekit/index.d.ts`,import:`./dist/livekit/index.js`}},files:[`dist/npm`,`dist/svelte`,`dist/react`,`dist/next`,`dist/byo`,`dist/elevenlabs`,`dist/openai`,`dist/deepgram`,`dist/google`,`dist/livekit`,`dist/sdk`,`README.md`,`CHANGELOG.md`,`LICENSE`],peerDependencies:{"@elevenlabs/client":`>=1.0.0`,"livekit-client":`>=2.0.0`,react:`^18.0.0 || ^19.0.0`,"react-dom":`^18.0.0 || ^19.0.0`,svelte:`^5.0.0`},peerDependenciesMeta:{svelte:{optional:!0},react:{optional:!0},"react-dom":{optional:!0},"@elevenlabs/client":{optional:!0},"livekit-client":{optional:!0}},scripts:{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`,"build:react":`vite build --config vite.config.react.ts && vite build --config vite.config.react-thumbnail.ts && tsc -p tsconfig.react.json`,"build:next":`vite build --config vite.config.next.ts && vite build --config vite.config.next-thumbnail.ts && tsc -p tsconfig.next.json`,"build:byo":`vite build --config vite.config.byo.ts && tsc -p tsconfig.byo.json`,"build:elevenlabs":`vite build --config vite.config.elevenlabs.ts && tsc -p tsconfig.elevenlabs.json`,"build:openai":`vite build --config vite.config.openai.ts && tsc -p tsconfig.openai.json`,"build:deepgram":`vite build --config vite.config.deepgram.ts && tsc -p tsconfig.deepgram.json`,"build:google":`vite build --config vite.config.google.ts && tsc -p tsconfig.google.json`,"build:livekit":`vite build --config vite.config.livekit.ts && tsc -p tsconfig.livekit.json`,"copy:preview":`mkdir -p dist/preview && cp preview/v2-embed-test.html dist/preview/ && cp preview/v2-embed-test-redirect.html dist/preview/`,"build:v2":`vite build --config vite.config.v2.ts && vite build --config vite.config.v2-thumbnail.ts`,"build:npm":`vite build --config vite.config.npm.ts && vite build --config vite.config.thumbnail.ts && tsc -p tsconfig.npm.json`,"build:svelte":`svelte-package -i src/svelte -o dist/svelte && vite build --config vite.config.svelte.ts`,"check:consumer":`svelte-check --workspace test/consumer --tsconfig ./tsconfig.json`,test:`vitest run`,preview:`node scripts/preview-local.mjs`,"dev:sdk":`npm run build:v2 && npm run copy:preview && npm run preview`,dev:`npm run build && npm run preview`,"publish:sdk":`node scripts/publish-sdk.mjs`,"publish:npm":`node scripts/publish-npm.mjs`,"publish:avatar":`node scripts/publish-avatar.mjs`,"publish:avatars-dist":`node scripts/publish-avatars.mjs`,"publish:avatars":`node scripts/republish-avatars.mjs`,"build:avatars":`node scripts/build-avatars.mjs`,"republish:avatars":`node scripts/republish-avatars.mjs`,"catalogue:avatars":`node ../labs.liforma.ai/scripts/generate-avatar-index.mjs`,"verify:avatars-dist":`node scripts/verify-avatars-dist.mjs`,"verify:avatar-pack":`node scripts/verify-avatar-pack.mjs`,"repair:render-plate-metadata":`node scripts/repair-render-plate-metadata.mjs`,"verify:render-plate-crop":`node scripts/verify-render-plate-crop.mjs`,"migrate:avatar-render-prep":`npm run migrate:avatar-render-prep --prefix ../labs.liforma.ai --`,"convert:avatar-teeth":`node scripts/convert-avatar-teeth-webp.mjs`,"warm:avatar-composites":`node scripts/warm-avatar-composites.mjs`,"test:compose-costume":`node scripts/test-compose-costume-layers.mjs`,"test:compose-costume-wasm":`node scripts/test-compose-costume-wasm.mjs`,"test:parse-composite-filename":`node scripts/test-parse-composite-filename.mjs`,"test:avatar-composite-rendered-path":`node scripts/test-avatar-composite-rendered-path.mjs`,"test:avatar-compose-worker-cors":`node scripts/test-avatar-compose-worker-cors.mjs`,"test:experience-thumb-url":`node scripts/test-experience-thumb-url.mjs`,"test:compose-experience-thumb":`node scripts/test-compose-experience-thumb.mjs`,"test:location-depth-paths":`node scripts/test-location-depth-paths.mjs`,"test:location-binary-assets":`node scripts/test-location-binary-assets.mjs`,"test:location-da3-depth":`node scripts/test-location-da3-depth.mjs`,"test:location-interactions":`node scripts/test-location-interactions.mjs`,"test:render-plate-chroma-key":`node scripts/test-render-plate-chroma-key.mjs`,"test:sparse-plate":`node scripts/test-sparse-plate.mjs`,"test:face-meshes-publish-depth":`node scripts/test-face-meshes-publish-depth.mjs`,"test:avatar-avif-sibling":`node scripts/test-avatar-avif-sibling.mjs`,"test:screen-chroma-key":`node scripts/test-screen-chroma-key.mjs`,"pull:sources":`node scripts/sync-authoring-sources.mjs`,"push:sources":`node scripts/sync-authoring-sources.mjs`,"catalogue:locations":`node scripts/catalogue-locations.mjs`,"generate:location-interactions":`node scripts/generate-location-interactions.mjs`,"generate:location-depth":`node scripts/generate-location-depth.mjs`,"generate:location-depth16-da3":`node scripts/generate-location-depth16-da3.mjs`,"generate:location-discontinuities":`node scripts/generate-location-discontinuities.mjs`,"build:locations":`node scripts/build-locations.mjs`,"publish:locations":`node scripts/publish-locations.mjs`,"verify:locations":`node scripts/verify-location-sources.mjs`,"publish:models":`node scripts/publish-models.mjs`,"publish:models:krea-int8":`node scripts/_upload-model-prefix.mjs text-to-image/lf-t2i-turbo-int8`,"publish:models:ltx-int8":`node scripts/_upload-model-prefix.mjs text-to-video/lf-t2v-distill-int8`,"publish:models:video-omni":`node scripts/_upload-model-prefix.mjs text-to-video/lf-video-omni-v1`,"fetch:depth-anything-v2":`node scripts/fetch-depth-anything-v2.mjs`,"fetch:video-depth-anything":`node scripts/fetch-video-depth-anything.mjs`,"fetch:depth-pro":`node scripts/fetch-depth-pro.mjs`,"fetch:face-landmarker":`node scripts/fetch-face-landmarker.mjs`,"fetch:anime-face-detector":`node scripts/fetch-anime-face-detector.mjs`,"fetch:face-parsing":`node scripts/fetch-face-parsing.mjs`,"fetch:vitmatte":`node scripts/fetch-vitmatte.mjs`,"fetch:liveportrait-mlx":`node scripts/fetch-liveportrait-mlx.mjs`,"fetch:wav2vec-phoneme-ctc":`node scripts/fetch-wav2vec-phoneme-ctc.mjs`,"fetch:lf-sta":`node scripts/fetch-wav2vec-phoneme-ctc.mjs`,"fetch:supertonic-3":`node scripts/fetch-supertonic-3.mjs`,"fetch:lf-tts":`node scripts/fetch-supertonic-3.mjs`,"fetch:lf-t2i-turbo":`python3 ../tools/krea-2-salad/scripts/fetch_cdn_snapshot.py`,"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:vitmatte && npm run fetch:lf-sta && npm run fetch:lf-tts`,locations:`npm run catalogue:locations && npm run build:locations`,"configure:cors":`node scripts/configure-r2-cors.mjs`,"verify:cors":`node scripts/verify-cdn-cors.mjs`,"deploy:worker:avatar-compose":`node scripts/deploy-avatar-compose-worker.mjs`,"deploy:worker:experience-thumb":`node scripts/deploy-experience-thumb-worker.mjs`,deploy:`npm run build && npm run publish:sdk`,verify:`npm run build && node scripts/check-sdk-size.mjs && node scripts/verify-thumbnail-light.mjs && node scripts/test-embed-protocol.mjs && node scripts/test-manifest-embed-url.mjs && node scripts/test-player-reachability.mjs && node scripts/test-session-endpoint.mjs && node scripts/verify-package.mjs`,"preview:test":`npm run build && npm run preview`},dependencies:{"@jsquash/webp":`^1.5.0`,zod:`^4.4.3`},devDependencies:{"@aws-sdk/client-s3":`^3.1000.0`,"@aws-sdk/lib-storage":`^3.1110.0`,"@elevenlabs/client":`^1.17.0`,"@sveltejs/package":`^2.5.8`,"@sveltejs/vite-plugin-svelte":`^7.0.0`,"@testing-library/react":`^16.3.0`,"@testing-library/svelte":`^5.4.2`,"@types/node":`^25.9.3`,"@types/react":`^19.1.12`,"@types/react-dom":`^19.1.9`,"@vitejs/plugin-react":`^5.0.2`,"@webgpu/types":`^0.1.70`,dotenv:`^17.2.3`,jsdom:`^30.0.1`,"livekit-client":`^2.21.0`,react:`^19.1.1`,"react-dom":`^19.1.1`,sharp:`^0.34.2`,svelte:`^5.55.2`,"svelte-check":`^4.7.4`,typescript:`^6.0.3`,vite:`^8.0.16`,vitest:`^4.1.10`,wrangler:`^4.101.0`}}.version}`,Ee=`https://player.liforma.ai/embed`,De=`http://localhost:3002/embed`;function Oe(){let e=globalThis.__LIFORMA_PLAYER_EMBED_URL;if(e?.trim())return e.trim().replace(/\/$/,``);if(typeof document>`u`)return null;let t=(document.querySelector(`script[data-liforma-sdk][src*="client.js"]`)??document.querySelector(`script[src*="/sdk/v2/client.js"]`))?.getAttribute(`data-player-embed-url`)?.trim();return t?t.replace(/\/$/,``):null}function N(){let e=Oe();return e?e.endsWith(`/embed`)?e:`${e}/embed`:t()?De:Ee}function ke(e,t){return e?.trim()||t?.trim()||void 0}function Ae(e,t,n,r,i,a,o,s,c,l,u){let d=(e??N()).replace(/\/$/,``),f=d.endsWith(`/embed`)?d:`${d}/embed`,p=new URL(f),m=n?.trim();m&&p.searchParams.set(`backdropId`,m);let h=r?.trim();return h&&p.searchParams.set(`avatarId`,h),(i===`face`||i===`medium`)&&p.searchParams.set(`fit`,i),c===`pip`&&p.searchParams.set(`stage`,`pip`),l===`set`&&p.searchParams.set(`pipBackground`,`set`),u===!1&&p.searchParams.set(`pipShadow`,`0`),a===`widget`&&p.searchParams.set(`ui`,`widget`),o&&p.searchParams.set(`close`,`1`),t&&p.searchParams.set(`debug`,`true`),(s===2||s===3||s===4)&&p.searchParams.set(`cast`,String(s)),je(p.toString())}function je(e){if(typeof location>`u`)return e;let t=new URL(e);return t.searchParams.set(`parentOrigin`,location.origin),t.toString()}function Me(e){return new URL(e).origin}function Ne(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?`evt_${crypto.randomUUID().replace(/-/g,``).slice(0,12)}`:`evt_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}function Pe(e,t,n){return{id:Ne(),type:e,sessionId:t,timestamp:new Date().toISOString(),data:n}}function Fe(){return{ready:new Set,started:new Set,sessionMinted:new Set,userTranscript:new Set,userSpeechStarted:new Set,userSpeechEnded:new Set,characterSpeechStarted:new Set,characterSpeechEnded:new Set,characterFocusChanged:new Set,conversationUpdate:new Set,message:new Set,listeningState:new Set,activityChange:new Set,interactionChange:new Set,feedback:new Set,feedbackFailed:new Set,conversationProcessorError:new Set}}function Ie(e,t,n){return e[t].add(n),()=>e[t].delete(n)}function Le(e,t,n){for(let r of e[t])r(n)}function Re(e){for(let t of Object.keys(e))e[t].clear()}function P(e){return`data`in e&&`format`in e&&e.format!=null&&!(`track`in e)}function F(e){return`url`in e&&typeof e.url==`string`}function I(e){if(!(`track`in e))return!1;let t=e.track;return typeof t!=`object`||!t?!1:typeof MediaStreamTrack<`u`&&t instanceof MediaStreamTrack?!0:`kind`in t&&`readyState`in t}function L(e){return!P(e)&&!F(e)&&!I(e)&&`encoding`in e&&typeof e.encoding==`string`}var ze=[8e3,16e3,22050,24e3,44100,48e3],R={MAX_CHUNK_BYTES:64*1024,RECOMMENDED_CHUNK_MS_MIN:20,RECOMMENDED_CHUNK_MS_MAX:200,MAX_BUFFERED_AUDIO_MS:8e3,PLAYBACK_JITTER_BUFFER_MS:150,PLAYBACK_JITTER_BUFFER_MS_MIN:80,PLAYBACK_JITTER_BUFFER_MS_MAX:250,MAX_UTTERANCE_DURATION_MS:9e4,MAX_PENDING_WRITES:8,DEFAULT_WRITE_TIMEOUT_MS:5e3},z=class extends Error{operation;requiredCapability;name=`UnsupportedSpeechOperationError`;constructor(e,t){super(`Speech operation "${e}" requires capability "${t}".`),this.operation=e,this.requiredCapability=t}},B=class extends Error{name=`SpeechUtteranceClosedError`;constructor(e=`Cannot write to a closed or cancelled speech utterance.`){super(e)}},V=class extends Error{name=`SpeechRuntimeError`;constructor(e,t){super(e,t)}},H=class extends Error{name=`SpeechBufferTimeoutError`;constructor(e=`Timed out waiting for speech buffer capacity.`){super(e)}};function U(e=`none`){return{mode:e,trackedDurationMs:0,fallbackDurationMs:0}}function W(e){return ze.includes(e)}function G(e){if(e.encoding!==`pcm_s16le`)throw new V(`Unsupported audio encoding: ${e.encoding}`);if(e.channels!==1)throw new V(`Unsupported channel count: ${e.channels}`);if(!W(e.sampleRate))throw new V(`Unsupported sample rate: ${e.sampleRate}`)}function Be(e){if(P(e)){G(e.format);return}if(F(e)){if(!e.url.trim())throw new V(`Audio URL must be non-empty.`);if(e.sampleRate!==void 0&&!W(e.sampleRate))throw new V(`Unsupported sample rate: ${e.sampleRate}`);return}if(I(e)){if(e.track.kind!==`audio`)throw new V(`speech.play track must be an audio MediaStreamTrack.`);if(e.sampleRate!==void 0&&!W(e.sampleRate))throw new V(`Unsupported sample rate: ${e.sampleRate}`);return}if(L(e)){let t=e.encoding.trim().toLowerCase();if(!t)throw new V(`Encoded audio MIME type is required.`);if(t===`pcm_s16le`)throw new V(`Use format: { encoding: "pcm_s16le", … } for raw PCM.`);if(e.sampleRate!==void 0&&!W(e.sampleRate))throw new V(`Unsupported sample rate: ${e.sampleRate}`);return}throw new V(`Unsupported speech.play audio shape.`)}function Ve(e){if(e.format)return G(e.format),e.format;if(e.track){let t={encoding:`pcm_s16le`,sampleRate:e.sampleRate??24e3,channels:1};return G(t),t}throw new V(`createUtterance requires format or track.`)}function K(e){return e instanceof Uint8Array?e:new Uint8Array(e)}function He(e){return e===`replace-active`||e===`replace-all`?`interrupt`:`enqueue`}function Ue(e){let t=new Uint8Array(e.length*2),n=new DataView(t.buffer);for(let t=0;t<e.length;t++){let r=Math.max(-1,Math.min(1,e[t]));n.setInt16(t*2,r<0?r*32768:r*32767,!0)}return t}function We(e,t,n,r,i){let a=-.5*e+1.5*t-1.5*n+.5*r,o=e-2.5*t+2*n-.5*r,s=-.5*e+.5*n,c=t;return((a*i+o)*i+s)*i+c}function Ge(e,t){if(!(e>0)||!(t>0))throw Error(`Resampler rates must be positive`);if(e===t)return{fromRate:e,toRate:t,push(e){return e},flush(){return new Float32Array}};let n=e/t,r=new Float32Array,i=0;return{fromRate:e,toRate:t,push(e){if(e.length===0)return new Float32Array;let t=new Float32Array(r.length+e.length);if(t.set(r),t.set(e,r.length),r=t,r.length<4)return new Float32Array;let a=[];for(;i+2<r.length-1;){let e=Math.floor(i),t=i-e,o=Math.max(0,e-1),s=Math.min(r.length-1,e+1),c=Math.min(r.length-1,e+2);a.push(We(r[o],r[e],r[s],r[c],t)),i+=n}let o=Math.max(0,Math.floor(i)-1);return o>0&&(r=r.subarray(o),i-=o),a.length?Float32Array.from(a):new Float32Array},flush(){return r.length===0?new Float32Array:(r=new Float32Array,i=0,new Float32Array)}}}var q=`liforma-pcm-capture`,Ke=`
|
|
1
|
+
var Liforma=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});function t(){if(globalThis.__LIFORMA_STACK===`local`)return!0;if(typeof location>`u`)return!1;try{return new URLSearchParams(location.search).get(`stack`)===`local`}catch{return!1}}var n=`https://api.liforma.ai`,r=`http://localhost:3001`;function i(){let e=globalThis.__LIFORMA_API_BASE_URL;if(e?.trim())return e.trim().replace(/\/$/,``);if(typeof document>`u`)return null;let t=(document.querySelector(`script[data-liforma-sdk][src*="client.js"]`)??document.querySelector(`script[src*="/sdk/v2/client.js"]`))?.getAttribute(`data-api-base-url`)?.trim();return t?t.replace(/\/$/,``):null}function a(){return i()||(t()?r:n)}var o=class extends Error{code;requestId;status;details;constructor(e,t){super(e,t?.cause===void 0?void 0:{cause:t.cause}),this.name=`LiformaError`,this.code=t?.code?.trim()||`UNKNOWN`,this.requestId=t?.requestId?.trim()||void 0,this.status=t?.status,this.details=t?.details}};function s(e){if(!(!e||typeof e!=`object`||Array.isArray(e)))return e}function c(e,t,n){let r=n?.get(`Liforma-Request-Id`)?.trim()||void 0,i;try{i=JSON.parse(t)}catch{}let a=i?.error&&typeof i.error==`object`?i.error:void 0,c=a?.code??i?.code,l=a?.message??i?.message,u=a?.requestId??i?.requestId??r,d=typeof c==`string`&&c.trim()?c.trim():`HTTP_ERROR`,f=typeof l==`string`&&l.trim()?l.trim():t.trim().slice(0,500)||`Request failed (${e})`,p=typeof u==`string`&&u.trim()?u.trim():r,{code:m,message:h,requestId:g,..._}=s(a)??s(i)??{};return new o(f,{code:d,requestId:p,status:e,details:Object.keys(_).length>0?_:void 0})}var l=128,u=/[\u0000-\u001f\u007f]/g;function d(e){if(!e)return;let t=e.replace(u,``).trim();if(t)return t.slice(0,l)}function f(e){let t=new URLSearchParams((e??``).startsWith(`?`)?(e??``).slice(1):e??``);return{...d(t.get(`utm_source`))?{utmSource:d(t.get(`utm_source`))}:{},...d(t.get(`utm_medium`))?{utmMedium:d(t.get(`utm_medium`))}:{},...d(t.get(`utm_campaign`))?{utmCampaign:d(t.get(`utm_campaign`))}:{},...d(t.get(`utm_content`))?{utmContent:d(t.get(`utm_content`))}:{},...d(t.get(`utm_term`))?{utmTerm:d(t.get(`utm_term`))}:{}}}function p(e){if(e===!1)return;if(e&&typeof e==`object`){let t={...d(e.utmSource)?{utmSource:d(e.utmSource)}:{},...d(e.utmMedium)?{utmMedium:d(e.utmMedium)}:{},...d(e.utmCampaign)?{utmCampaign:d(e.utmCampaign)}:{},...d(e.utmContent)?{utmContent:d(e.utmContent)}:{},...d(e.utmTerm)?{utmTerm:d(e.utmTerm)}:{},...d(e.referrer)?{referrer:d(e.referrer)}:{}};return Object.keys(t).length?t:void 0}if(typeof window>`u`)return;let t=f(window.location?.search),n=d(document.referrer||void 0),r={...t,...n?{referrer:n}:{}};return Object.keys(r).length?r:void 0}function m(e){let t=e.locale?.trim();if(t)return t;let n=e.language?.trim();if(n)return n;if(typeof navigator<`u`&&navigator.language?.trim())return navigator.language.trim()}function h(e){let t=e.secondaryLocale?.trim(),n=e.learningLocale?.trim();if(t&&n&&t!==n)throw Error(`secondaryLocale and learningLocale disagree; pass only one or make them equal.`);return t||n||void 0}function g(e,t){let n=e.trim();if(!n)throw Error(`sessionEndpoint must not be empty.`);if(typeof location>`u`)throw Error(`sessionEndpoint is only available in a browser.`);let r=new URL(n,location.href);if(r.origin!==location.origin)throw Error(`sessionEndpoint must be same-origin.`);let i=t.experienceId.trim();if(!i)throw Error(`sessionEndpoint requires experienceId.`);let a=m(t),o=h(t),s=t.idempotencyKey?.trim();return{url:r.toString(),init:{method:`POST`,credentials:`same-origin`,headers:{Accept:`application/json`,"Content-Type":`application/json`,...s?{"Idempotency-Key":s}:{}},body:JSON.stringify({experienceId:i,...a?{locale:a}:{},...o?{secondaryLocale:o}:{},...t.mode?{mode:t.mode}:{},...t.speechInputMode?{speechInputMode:t.speechInputMode}:{},...t.speechOnly===void 0?{}:{speechOnly:t.speechOnly},...(()=>{let e=p(t.attribution);return e?{attribution:e}:{}})(),...t.alreadyConverted?.length?{alreadyConverted:[...t.alreadyConverted]}:{}})}}}function _(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function v(e){return typeof e==`boolean`}function y(e){if(!_(e))return null;let t=e.speech,n=e.conversation,r=e.avatar,i=e.tools;return!_(t)||!_(n)||!_(r)||!_(i)||!v(t.input)||!v(t.output)||!v(t.externalAudio)||!v(n.managed)||!v(r.enabled)||!v(i.enabled)?null:{speech:{input:t.input,output:t.output,externalAudio:t.externalAudio},conversation:{managed:n.managed},avatar:{enabled:r.enabled},tools:{enabled:i.enabled}}}function b(e){return!_(e)||!v(e.avatar)||!v(e.speechInput)||!v(e.speechOutput)||!v(e.tools)||!v(e.externalAudio)?null:{speech:{input:e.speechInput,output:e.speechOutput,externalAudio:e.externalAudio},conversation:{managed:!0},avatar:{enabled:e.avatar},tools:{enabled:e.tools}}}function x(e){return y(e)??b(e)}function S(e){if(!_(e))throw Error(`Session Launch response is missing session.`);let t=typeof e.id==`string`?e.id.trim():``,n=typeof e.experienceId==`string`?e.experienceId.trim():``,r=typeof e.experienceRevisionId==`string`?e.experienceRevisionId.trim():``,i=typeof e.expiresAt==`string`?e.expiresAt.trim():``,a=typeof e.locale==`string`?e.locale.trim():``,o=typeof e.secondaryLocale==`string`&&e.secondaryLocale.trim()?e.secondaryLocale.trim():void 0,s=e.mode===`conversation`||e.mode===`presenter`?e.mode:null,c=x(e.capabilities),l=C(e.localeVoiceFallbacks),u=e.status===`active`||e.status===`ended`?e.status:void 0,d=typeof e.createdAt==`string`&&e.createdAt.trim()?e.createdAt.trim():void 0;if(!t||!n||!r||!i||!a||!s||!c)throw Error(`Session Launch response has an invalid session object.`);return{id:t,experienceId:n,experienceRevisionId:r,expiresAt:i,locale:a,...o?{secondaryLocale:o}:{},mode:s,capabilities:c,...l?{localeVoiceFallbacks:l}:{},...u?{status:u}:{},...d?{createdAt:d}:{}}}function C(e){if(!Array.isArray(e)||e.length===0)return;let t=[];for(let n of e){if(!_(n))continue;let e=n.axis===`locale`||n.axis===`secondaryLocale`?n.axis:null,r=typeof n.requested==`string`?n.requested.trim():``,i=typeof n.resolved==`string`?n.resolved.trim():``;!e||!r||!i||n.reason!==`voice_unsupported`||t.push({axis:e,requested:r,resolved:i,reason:`voice_unsupported`})}return t.length>0?t:void 0}function w(e){let t=e.localeVoiceFallbacks;if(t?.length)for(let e of t){let t=e.axis===`secondaryLocale`?`secondaryLocale`:`locale`;console.warn(`[liforma] Session ${t} fell back to ${e.resolved} because the voice does not support ${e.requested}.`)}}function T(e){if(!_(e))throw Error(`Session Launch response must be a JSON object.`);let t=typeof e.launch==`string`?e.launch.trim():``;if(!t)throw Error(`Session Launch response is missing launch.`);let n=S(e.session);return w(n),{session:n,launch:t}}function ee(){try{if(typeof globalThis.location?.origin==`string`&&globalThis.location.origin)return globalThis.location.origin}catch{}}function te(e){return e?e.trim().toUpperCase().replace(/-/g,`_`):``}function ne(e,t){let n=ee(),r=te(t.code),i=t.message.trim(),a=t.details??{};if(r===`ORIGIN_NOT_ALLOWED`||/^Origin not allowed/i.test(i)&&n){if(i.includes(e)&&i.includes(`allowed origin`))return t;let r=typeof a.origin==`string`&&a.origin||n||`(unknown origin)`;return new o(`Your origin ${r} is not an allowed origin for experience ${e}. If you own this experience, sign in to the Liforma developer portal (app.liforma.ai), open Workspace → Settings → Origins, add ${r} to the list of allowed origins, and ensure “Allow public client-only embeds” is enabled.`,{code:`ORIGIN_NOT_ALLOWED`,requestId:t.requestId,status:t.status,details:a})}return r===`BROWSER_EMBEDS_DISABLED`||/^Browser embeds are not enabled/i.test(i)?i.includes(`Allow public client-only embeds`)?t:new o(`Browser embeds are not enabled for experience ${e}. If you own this experience, sign in to the Liforma developer portal (app.liforma.ai), open Workspace → Settings → Origins, and enable “Allow public client-only embeds”.`,{code:`BROWSER_EMBEDS_DISABLED`,requestId:t.requestId,status:t.status,details:a}):r===`EXPERIENCE_UNAVAILABLE`||/^Experience is not available\.?$/i.test(i)||/^Unknown experience\.?$/i.test(i)?i.includes(`No playable experience found`)?t:new o(`No playable experience found for “${e}”. Check that the experience id is correct (it should look like exp_…), and that the experience exists and is published in the Liforma developer portal (app.liforma.ai). Deleted, archived, and unpublished experiences cannot be started from a browser embed.`,{code:`EXPERIENCE_UNAVAILABLE`,requestId:t.requestId,status:t.status,details:a}):t}function re(e){let t=e?.locale?.trim();if(t)return t;let n=e?.language?.trim();if(n)return n;if(typeof navigator<`u`&&navigator.language?.trim())return navigator.language.trim()}function ie(e){let t=e?.secondaryLocale?.trim(),n=e?.learningLocale?.trim();if(t&&n&&t!==n)throw new o(`secondaryLocale and learningLocale disagree; pass only one or make them equal.`,{code:`INVALID_BODY`});return t||n||void 0}function ae(e,t){let n={experienceId:e},r=re(t);r&&(n.locale=r);let i=ie(t);i&&(n.secondaryLocale=i),t?.mode&&(n.mode=t.mode),t?.speechInputMode&&(n.speechInputMode=t.speechInputMode),t?.speechOnly!==void 0&&(n.speechOnly=t.speechOnly);let a=p(t?.attribution);return a&&(n.attribution=a),t?.alreadyConverted?.length&&(n.alreadyConverted=[...t.alreadyConverted]),n}async function oe(e,t){let n=a(),r=t?.idempotencyKey?.trim(),i=await fetch(`${n}/v1/browser-sessions`,{method:`POST`,headers:{"Content-Type":`application/json`,...r?{"Idempotency-Key":r}:{}},body:JSON.stringify(ae(e,t))});if(!i.ok){let t=await i.text();throw ne(e,c(i.status,t,i.headers))}let s;try{s=await i.json()}catch{throw new o(`Browser session mint returned invalid JSON.`,{code:`INVALID_RESPONSE`,status:i.status,requestId:i.headers.get(`Liforma-Request-Id`)??void 0})}return T(s)}async function se(e,t){let n=g(e,t),r=new AbortController,i=()=>r.abort(t.signal?.reason);t.signal?.aborted?i():t.signal?.addEventListener(`abort`,i,{once:!0});let a=globalThis.setTimeout(()=>r.abort(new DOMException(`Session endpoint timed out.`,`TimeoutError`)),t.timeoutMs??3e4),s;try{s=await fetch(n.url,{...n.init,signal:r.signal})}finally{globalThis.clearTimeout(a),t.signal?.removeEventListener(`abort`,i)}if(!s.ok){let e=await s.text();throw c(s.status,e,s.headers)}if(!s.headers.get(`content-type`)?.toLowerCase().includes(`application/json`))throw new o(`Session endpoint must return a JSON Session Launch response.`,{code:`INVALID_RESPONSE`,status:s.status,requestId:s.headers.get(`Liforma-Request-Id`)??void 0});let l;try{l=await s.json()}catch{throw new o(`Session endpoint returned invalid JSON.`,{code:`INVALID_RESPONSE`,status:s.status,requestId:s.headers.get(`Liforma-Request-Id`)??void 0})}return T(l)}function ce(e){return typeof e!=`object`||!e?!1:typeof e[Symbol.asyncIterator]==`function`}function le(e){if(typeof e==`string`){let t=e.trim();if(!t)throw Error(`conversationProcessor returned empty text.`);return{text:t}}let t=e.text.trim();if(!t)throw Error(`conversationProcessor returned empty text.`);return{text:t,...e.characterId?{characterId:e.characterId}:{},...e.behavior?{behavior:e.behavior}:{}}}async function ue(e,t){let n=await e(t);return ce(n)?{kind:`stream`,stream:n}:{kind:`complete`,speech:le(n)}}var de=`3002`;function E(e){let t=new URL(e);return t.hostname===`localhost`||t.hostname===`127.0.0.1`?`Cannot connect to the Liforma player at ${e} — nothing is listening on port ${t.port||de}. Start the player dev server in player.liforma.ai (npm run dev).`:`Cannot connect to the Liforma player at ${e}. The embed did not load; check your network connection and player URL configuration.`}async function fe(e,t){try{await fetch(e,{method:`GET`,mode:`no-cors`,signal:AbortSignal.timeout(8e3)})}catch{throw Error(E(t))}}function D(e,t,n,r){try{r&&r.length>0?e.postMessage(t,n,r):e.postMessage(t,n)}catch(e){throw e instanceof DOMException&&e.name===`SecurityError`?Error(E(n),{cause:e}):e}}var pe=new Set([1,2]);function me(e){return typeof e==`number`&&pe.has(e)}var he=new Set(`close.stateUpdate.commandResult.userTranscript.characterSpeechStarted.characterSpeechEnded.characterFocusChanged.conversationUpdate.listeningState.userSpeechStarted.userSpeechEnded.modeChange.activityChange.feedback.feedbackFailed.message.started.embedReady.widgetReady.widgetExpand.widgetCollapse.widgetAudioSettings.widgetDragStart.widgetDragMove.widgetDragEnd.fullWindow.theatre.interactionChange`.split(`.`));function ge(e){if(!e||typeof e!=`object`)return null;let t=e;if(!me(t.schemaVersion)||!t.type||!he.has(t.type))return null;if(t.type===`embedReady`||t.type===`widgetReady`||t.type===`widgetExpand`||t.type===`widgetCollapse`)return t;if(t.type===`fullWindow`||t.type===`theatre`){let e=t.payload;return!e||typeof e!=`object`||typeof e.active!=`boolean`?null:t}if(t.type===`widgetAudioSettings`){let e=t.payload;return!e||typeof e!=`object`||typeof e.open!=`boolean`?null:t}if(t.type===`widgetDragStart`||t.type===`widgetDragEnd`){let e=t.payload;return!e||typeof e!=`object`||typeof e.pointerId!=`number`||!Number.isFinite(e.pointerId)?null:t}if(t.type===`widgetDragMove`){let e=t.payload;if(!e||typeof e!=`object`)return null;let{pointerId:n,dx:r,dy:i}=e;return typeof n!=`number`||!Number.isFinite(n)||typeof r!=`number`||!Number.isFinite(r)||typeof i!=`number`||!Number.isFinite(i)?null:t}let n=t.payload;return!n||typeof n!=`object`?null:t}function _e(e,t,n){let r=e.trim();if(!r)throw Error(`createLaunchMessage requires a non-empty launch string.`);let i=n?.startButton,a=n?.theme,o=n?.showFeedback,s=n?.interaction,c=n?.theatreButton,l=n?.theatre;return{type:`launch`,schemaVersion:2,payload:{launch:r,...t===void 0?{}:{session:t},...i?{startButton:i}:{},...a?{theme:a}:{},...o===void 0?{}:{showFeedback:o},...s?{interaction:s}:{},...c?{theatreButton:!0}:{},...l===void 0?{}:{theatre:l}}}}function ve(){return{type:`parentHello`,schemaVersion:2}}function ye(e){return{type:`widgetSetChrome`,schemaVersion:2,payload:{mode:e}}}function be(){return{type:`widgetToggleAudioSettings`,schemaVersion:2,payload:{}}}function xe(e){return{type:`setTheatre`,schemaVersion:2,payload:{active:e}}}var Se=`2147483000`;function Ce(e){let{style:t}=e;return{position:t.position,top:t.top,right:t.right,bottom:t.bottom,left:t.left,inset:t.inset,width:t.width,height:t.height,zIndex:t.zIndex,margin:t.margin,borderRadius:t.borderRadius,maxWidth:t.maxWidth,maxHeight:t.maxHeight}}function O(e){let{style:t}=e;t.position=`fixed`,t.top=`0`,t.right=`0`,t.bottom=`0`,t.left=`0`,t.inset=`0`,t.width=`100vw`,t.width=`100dvw`,t.height=`100vh`,t.height=`100dvh`,t.zIndex=Se,t.margin=`0`,t.borderRadius=`0`,t.maxWidth=`none`,t.maxHeight=`none`,e.dataset.liformaFullWindow=`1`}function k(e,t){if(delete e.dataset.liformaFullWindow,!t){e.style.position=``,e.style.top=``,e.style.right=``,e.style.bottom=``,e.style.left=``,e.style.inset=``,e.style.width=``,e.style.height=``,e.style.zIndex=``,e.style.margin=``,e.style.borderRadius=``,e.style.maxWidth=``,e.style.maxHeight=``;return}let{style:n}=e;n.position=t.position,n.top=t.top,n.right=t.right,n.bottom=t.bottom,n.left=t.left,n.inset=t.inset,n.width=t.width,n.height=t.height,n.zIndex=t.zIndex,n.margin=t.margin,n.borderRadius=t.borderRadius,n.maxWidth=t.maxWidth,n.maxHeight=t.maxHeight}function A(e){return e}function j(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?`cmd_${crypto.randomUUID().replace(/-/g,``).slice(0,12)}`:`cmd_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}var we=3e4;function Te(e){let t=e.container;getComputedStyle(t).position===`static`&&(t.style.position=`relative`);let n=document.createElement(`iframe`);n.src=e.src,n.title=`Liforma experience`,n.setAttribute(`allow`,`microphone; autoplay; clipboard-read; clipboard-write; fullscreen`),n.setAttribute(`allowfullscreen`,``),n.style.cssText=e.transparent?`display:block;position:absolute;inset:0;width:100%;height:100%;border:0;background:transparent;`:`display:block;position:absolute;inset:0;width:100%;height:100%;border:0;background:#030508;`,e.transparent&&n.setAttribute(`allowtransparency`,`true`);let r=!1,i=!1,a=null,o=null,s=r=>{i!==r&&(i=r,r?(a=Ce(n),o=document.body.style.overflow,document.body.append(n),O(n),document.body.style.overflow=`hidden`):(t.append(n),k(n,a),a=null,o!==null&&(document.body.style.overflow=o,o=null)),e.onFullWindowChange?.(r))},c=new Map,l=null,u=0,d=0,f=[],p=null,m=null,h=new Promise((e,t)=>{p=e,m=t}),g=()=>{for(let e of f)window.clearTimeout(e);f.length=0},_=t=>{if(r)return;let i=Date.now();if(d>0&&i-d<250)return;d=i,g();let a=_e(t.launch,t.session,t.chrome),o=()=>{if(r)return;let t=n.contentWindow;t&&D(t,a,e.playerOrigin)};o();for(let e=1;e<=12;e+=1)f.push(window.setTimeout(o,e*75))},v=()=>{r||!l||_(l)},y=()=>{if(u+=1,u===1){fe(e.src,e.playerOrigin).then(()=>p?.(),e=>m?.(e instanceof Error?e:Error(String(e))));return}d=0,v()},b=()=>{u>0||m?.(Error(E(e.playerOrigin)))};n.addEventListener(`load`,y),n.addEventListener(`error`,b);let x=t=>{if(r||t.source!==n.contentWindow||t.origin!==e.playerOrigin)return;let i=ge(t.data);if(i)switch(i.type){case`close`:e.onClose?.(i.payload);break;case`stateUpdate`:e.onPlayerStatusChange?.(i.payload.state),e.onStateUpdate?.(i.payload.state);break;case`commandResult`:{let e=c.get(i.payload.correlationId);if(!e)return;c.delete(i.payload.correlationId),i.payload.ok?e.resolve(i.payload.result):e.reject(Error(i.payload.error??`Command failed.`));break}case`userTranscript`:e.onUserTranscript?.(i.payload);break;case`characterSpeechStarted`:e.onCharacterSpeechStarted?.(i.payload);break;case`characterSpeechEnded`:e.onCharacterSpeechEnded?.(i.payload);break;case`characterFocusChanged`:e.onCharacterFocusChanged?.(i.payload);break;case`conversationUpdate`:e.onConversationUpdate?.(i.payload.conversation);break;case`listeningState`:e.onListeningState?.(i.payload.listening);break;case`userSpeechStarted`:e.onUserSpeechStarted?.(i.payload);break;case`userSpeechEnded`:e.onUserSpeechEnded?.(i.payload);break;case`modeChange`:e.onActivityChange?.(A(i.payload.mode));break;case`activityChange`:e.onActivityChange?.(i.payload.activity);break;case`feedback`:e.onFeedback?.(i.payload);break;case`feedbackFailed`:e.onFeedbackFailed?.(i.payload);break;case`message`:e.onMessage?.(i.payload);break;case`started`:e.onStarted?.(i.payload);break;case`embedReady`:v();break;case`widgetReady`:e.onWidgetReady?.();break;case`widgetExpand`:e.onWidgetExpand?.();break;case`widgetCollapse`:e.onWidgetCollapse?.();break;case`widgetAudioSettings`:e.onWidgetAudioSettings?.(i.payload.open);break;case`widgetDragStart`:e.onWidgetDragStart?.(i.payload);break;case`widgetDragMove`:e.onWidgetDragMove?.(i.payload);break;case`widgetDragEnd`:e.onWidgetDragEnd?.(i.payload);break;case`fullWindow`:s(i.payload.active);break;case`theatre`:e.onTheatreChange?.(i.payload.active);break;case`interactionChange`:e.onInteractionChange?.(i.payload.interaction);break}};if(window.addEventListener(`message`,x),t.replaceChildren(n),t.clientHeight<2&&!t.style.minHeight){let e=getComputedStyle(t).minHeight;(e===`0px`||e===`auto`)&&(t.style.minHeight=`480px`)}let S=(t,i)=>{if(r)return;let a=n.contentWindow;if(!a)throw Error(E(e.playerOrigin));D(a,t,e.playerOrigin,i)},C=(e,t=12e4,n)=>{let r=e.type!==`parentHello`&&e.payload&&`correlationId`in e.payload?e.payload.correlationId:j();return e.type!==`parentHello`&&e.payload&&`correlationId`in e.payload||e.type!==`parentHello`&&e.payload&&(e.payload.correlationId=r),new Promise((i,a)=>{c.set(r,{resolve:e=>i(e),reject:a}),S(e,n),setTimeout(()=>{c.has(r)&&(c.delete(r),a(Error(`Timed out waiting for player command result.`)))},t)})};return{waitForLoad(){return h},postParentHello(){S(ve())},postLaunch(e,t,n){r||(l={launch:e,session:t,chrome:n},d=0,_(l))},postManifest(e){if(typeof e==`string`){this.postLaunch(e);return}if(e&&typeof e==`object`&&typeof e.launch==`string`){let t=String(e.launch),n=e.session;this.postLaunch(t,n);return}throw Error(`postManifest is deprecated; use postLaunch with an opaque launch string from SessionLaunchResponse.`)},postWidgetSetChrome(e){S(ye(e))},postWidgetToggleAudioSettings(){S(be())},postSetTheatre(e){S(xe(e))},speak(e){return C({type:`speak`,schemaVersion:2,payload:{correlationId:j(),text:e.text,...e.characterId?{characterId:e.characterId}:{},...e.behavior?{behavior:e.behavior}:{}}})},startListening(){return C({type:`startListening`,schemaVersion:2,payload:{correlationId:j()}})},stopListening(){return C({type:`stopListening`,schemaVersion:2,payload:{correlationId:j()}})},listenOnce(e){return C({type:`listenOnce`,schemaVersion:2,payload:{correlationId:j(),...e?.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}})},async speakProcessorStream(e,t){let n=j(),r=j(),i=(await C({type:`speakStreamStart`,schemaVersion:2,payload:{correlationId:n,...t?.characterId?{characterId:t.characterId}:{},...t?.behavior?{behavior:t.behavior}:{}}})).streamId;try{for await(let n of e){if(t?.signal?.aborted)throw new DOMException(`Processor stream aborted.`,`AbortError`);n&&S({type:`speakStreamChunk`,schemaVersion:2,payload:{streamId:i,text:n}})}if(t?.signal?.aborted)throw new DOMException(`Processor stream aborted.`,`AbortError`);return await C({type:`speakStreamEnd`,schemaVersion:2,payload:{correlationId:r,streamId:i}})}catch(e){try{await C({type:`speakStreamEnd`,schemaVersion:2,payload:{correlationId:r,streamId:i}})}catch{}throw e}},speechPlay(e){let t=j(),n=[];return(e.source.kind===`pcm`||e.source.kind===`encoded`)&&n.push(e.source.data),C({type:`speechPlay`,schemaVersion:2,payload:{correlationId:t,source:e.source,...e.characterId?{characterId:e.characterId}:{},...e.transcript===void 0?{}:{transcript:e.transcript},...e.history?{history:e.history}:{},...e.queue?{queue:e.queue}:{}}},12e4,n)},speechUtteranceBegin(e){return C({type:`speechUtteranceBegin`,schemaVersion:2,payload:{correlationId:j(),utteranceId:e.utteranceId,format:e.format,queue:e.queue,...e.characterId?{characterId:e.characterId}:{},...e.transcript===void 0?{}:{transcript:e.transcript}}})},speechUtteranceWrite(e){return C({type:`speechUtteranceWrite`,schemaVersion:2,payload:{correlationId:j(),utteranceId:e.utteranceId,audio:e.audio,byteLength:e.byteLength}},we,[e.audio])},speechUtteranceSetTranscript(e){return C({type:`speechUtteranceSetTranscript`,schemaVersion:2,payload:{correlationId:j(),utteranceId:e.utteranceId,transcript:e.transcript}})},speechUtteranceClose(e){return C({type:`speechUtteranceClose`,schemaVersion:2,payload:{correlationId:j(),utteranceId:e.utteranceId,...e.transcript===void 0?{}:{transcript:e.transcript},...e.history?{history:e.history}:{}}})},speechUtteranceCancel(e){return C({type:`speechUtteranceCancel`,schemaVersion:2,payload:{correlationId:j(),utteranceId:e.utteranceId}})},speechInterrupt(e){return C({type:`speechInterrupt`,schemaVersion:2,payload:{correlationId:j(),...e}})},getConversation(){return C({type:`getConversation`,schemaVersion:2,payload:{correlationId:j()}})},focusCharacter(e){return C({type:`focusCharacter`,schemaVersion:2,payload:{correlationId:j(),characterId:e}})},setFit(e){return C({type:`setFit`,schemaVersion:2,payload:{correlationId:j(),fit:e}})},setStage(e){return C({type:`setStage`,schemaVersion:2,payload:{correlationId:j(),stage:e}})},setPipBackground(e){return C({type:`setPipBackground`,schemaVersion:2,payload:{correlationId:j(),pipBackground:e}})},setPipShadow(e){return C({type:`setPipShadow`,schemaVersion:2,payload:{correlationId:j(),pipShadow:e}})},setInteraction(e){return C({type:`setInteraction`,schemaVersion:2,payload:{correlationId:j(),interaction:e}})},getInteraction(){return C({type:`getInteraction`,schemaVersion:2,payload:{correlationId:j()}})},conversion(e){return C({type:`conversion`,schemaVersion:2,payload:{correlationId:j(),key:e}})},engage(){return C({type:`engage`,schemaVersion:2,payload:{correlationId:j()}})},reportSdkError(e){return C({type:`reportSdkError`,schemaVersion:2,payload:{correlationId:j(),errorCode:e.errorCode,message:e.message,stack:e.stack,severity:e.severity,operation:e.operation,release:e.release}})},destroy(){if(!r){r=!0,i&&s(!1);for(let e of c.values())e.reject(Error(`Iframe host destroyed.`));c.clear(),g(),l=null,n.removeEventListener(`load`,y),n.removeEventListener(`error`,b),window.removeEventListener(`message`,x),n.remove()}}}}function Ee(e){let t,n=!1,r=!1,i=()=>{r||!n||t===void 0||(r=!0,e(t))};return{setValue(e){t=e,i()},markReady(){n=!0,i()}}}var M=`sdk@${{name:`@liforma/client`,version:`0.4.13`,type:`module`,description:`Liforma browser SDK — Experience sessions, speech API, and Svelte embed component.`,license:`MIT`,homepage:`https://docs.liforma.ai`,repository:{type:`git`,url:`git+https://github.com/LiformaLtd/cdn.liforma.ai.git`},bugs:{url:`https://github.com/LiformaLtd/cdn.liforma.ai/issues`},publishConfig:{access:`public`},sideEffects:!1,exports:{".":{types:`./dist/npm/v2/npm.d.ts`,import:`./dist/npm/index.js`},"./svelte":{types:`./dist/svelte/index.d.ts`,import:`./dist/svelte/index.js`,svelte:`./dist/svelte/index.js`},"./svelte/thumbnail":{types:`./dist/svelte/thumbnail.d.ts`,import:`./dist/svelte/thumbnail.js`,svelte:`./dist/svelte/thumbnail.js`},"./thumbnail":{types:`./dist/npm/thumbnail/index.d.ts`,import:`./dist/npm/thumbnail/index.js`},"./react":{types:`./dist/react/react/index.d.ts`,import:`./dist/react/index.js`},"./react/thumbnail":{types:`./dist/react/react/thumbnail.d.ts`,import:`./dist/react/thumbnail.js`},"./next":{types:`./dist/next/next/index.d.ts`,import:`./dist/next/index.js`},"./next/thumbnail":{types:`./dist/next/next/thumbnail.d.ts`,import:`./dist/next/thumbnail.js`},"./byo":{types:`./dist/byo/index.d.ts`,import:`./dist/byo/index.js`},"./elevenlabs":{types:`./dist/elevenlabs/index.d.ts`,import:`./dist/elevenlabs/index.js`},"./openai":{types:`./dist/openai/index.d.ts`,import:`./dist/openai/index.js`},"./deepgram":{types:`./dist/deepgram/index.d.ts`,import:`./dist/deepgram/index.js`},"./google":{types:`./dist/google/index.d.ts`,import:`./dist/google/index.js`},"./livekit":{types:`./dist/livekit/index.d.ts`,import:`./dist/livekit/index.js`}},files:[`dist/npm`,`dist/svelte`,`dist/react`,`dist/next`,`dist/byo`,`dist/elevenlabs`,`dist/openai`,`dist/deepgram`,`dist/google`,`dist/livekit`,`dist/sdk`,`README.md`,`CHANGELOG.md`,`LICENSE`],peerDependencies:{"@elevenlabs/client":`>=1.0.0`,"livekit-client":`>=2.0.0`,react:`^18.0.0 || ^19.0.0`,"react-dom":`^18.0.0 || ^19.0.0`,svelte:`^5.0.0`},peerDependenciesMeta:{svelte:{optional:!0},react:{optional:!0},"react-dom":{optional:!0},"@elevenlabs/client":{optional:!0},"livekit-client":{optional:!0}},scripts:{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`,"build:react":`vite build --config vite.config.react.ts && vite build --config vite.config.react-thumbnail.ts && tsc -p tsconfig.react.json`,"build:next":`vite build --config vite.config.next.ts && vite build --config vite.config.next-thumbnail.ts && tsc -p tsconfig.next.json`,"build:byo":`vite build --config vite.config.byo.ts && tsc -p tsconfig.byo.json`,"build:elevenlabs":`vite build --config vite.config.elevenlabs.ts && tsc -p tsconfig.elevenlabs.json`,"build:openai":`vite build --config vite.config.openai.ts && tsc -p tsconfig.openai.json`,"build:deepgram":`vite build --config vite.config.deepgram.ts && tsc -p tsconfig.deepgram.json`,"build:google":`vite build --config vite.config.google.ts && tsc -p tsconfig.google.json`,"build:livekit":`vite build --config vite.config.livekit.ts && tsc -p tsconfig.livekit.json`,"copy:preview":`mkdir -p dist/preview && cp preview/v2-embed-test.html dist/preview/ && cp preview/v2-embed-test-redirect.html dist/preview/`,"build:v2":`vite build --config vite.config.v2.ts && vite build --config vite.config.v2-thumbnail.ts`,"build:npm":`vite build --config vite.config.npm.ts && vite build --config vite.config.thumbnail.ts && tsc -p tsconfig.npm.json`,"build:svelte":`svelte-package -i src/svelte -o dist/svelte && vite build --config vite.config.svelte.ts`,"check:consumer":`svelte-check --workspace test/consumer --tsconfig ./tsconfig.json`,test:`vitest run`,preview:`node scripts/preview-local.mjs`,"dev:sdk":`npm run build:v2 && npm run copy:preview && npm run preview`,dev:`npm run build && npm run preview`,"publish:sdk":`node scripts/publish-sdk.mjs`,"publish:npm":`node scripts/publish-npm.mjs`,"publish:avatar":`node scripts/publish-avatar.mjs`,"publish:avatars-dist":`node scripts/publish-avatars.mjs`,"publish:avatars":`node scripts/republish-avatars.mjs`,"build:avatars":`node scripts/build-avatars.mjs`,"republish:avatars":`node scripts/republish-avatars.mjs`,"catalogue:avatars":`node ../labs.liforma.ai/scripts/generate-avatar-index.mjs`,"verify:avatars-dist":`node scripts/verify-avatars-dist.mjs`,"verify:avatar-pack":`node scripts/verify-avatar-pack.mjs`,"repair:render-plate-metadata":`node scripts/repair-render-plate-metadata.mjs`,"verify:render-plate-crop":`node scripts/verify-render-plate-crop.mjs`,"migrate:avatar-render-prep":`npm run migrate:avatar-render-prep --prefix ../labs.liforma.ai --`,"convert:avatar-teeth":`node scripts/convert-avatar-teeth-webp.mjs`,"warm:avatar-composites":`node scripts/warm-avatar-composites.mjs`,"test:compose-costume":`node scripts/test-compose-costume-layers.mjs`,"test:compose-costume-wasm":`node scripts/test-compose-costume-wasm.mjs`,"test:parse-composite-filename":`node scripts/test-parse-composite-filename.mjs`,"test:avatar-composite-rendered-path":`node scripts/test-avatar-composite-rendered-path.mjs`,"test:avatar-compose-worker-cors":`node scripts/test-avatar-compose-worker-cors.mjs`,"test:experience-thumb-url":`node scripts/test-experience-thumb-url.mjs`,"test:compose-experience-thumb":`node scripts/test-compose-experience-thumb.mjs`,"test:location-depth-paths":`node scripts/test-location-depth-paths.mjs`,"test:location-binary-assets":`node scripts/test-location-binary-assets.mjs`,"test:location-da3-depth":`node scripts/test-location-da3-depth.mjs`,"test:location-interactions":`node scripts/test-location-interactions.mjs`,"test:render-plate-chroma-key":`node scripts/test-render-plate-chroma-key.mjs`,"test:sparse-plate":`node scripts/test-sparse-plate.mjs`,"test:face-meshes-publish-depth":`node scripts/test-face-meshes-publish-depth.mjs`,"test:avatar-avif-sibling":`node scripts/test-avatar-avif-sibling.mjs`,"test:screen-chroma-key":`node scripts/test-screen-chroma-key.mjs`,"pull:sources":`node scripts/sync-authoring-sources.mjs`,"push:sources":`node scripts/sync-authoring-sources.mjs`,"catalogue:locations":`node scripts/catalogue-locations.mjs`,"generate:location-interactions":`node scripts/generate-location-interactions.mjs`,"generate:location-depth":`node scripts/generate-location-depth.mjs`,"generate:location-depth16-da3":`node scripts/generate-location-depth16-da3.mjs`,"generate:location-discontinuities":`node scripts/generate-location-discontinuities.mjs`,"build:locations":`node scripts/build-locations.mjs`,"publish:locations":`node scripts/publish-locations.mjs`,"verify:locations":`node scripts/verify-location-sources.mjs`,"publish:models":`node scripts/publish-models.mjs`,"publish:models:krea-int8":`node scripts/_upload-model-prefix.mjs text-to-image/lf-t2i-turbo-int8`,"publish:models:ltx-int8":`node scripts/_upload-model-prefix.mjs text-to-video/lf-t2v-distill-int8`,"publish:models:video-omni":`node scripts/_upload-model-prefix.mjs text-to-video/lf-video-omni-v1`,"fetch:depth-anything-v2":`node scripts/fetch-depth-anything-v2.mjs`,"fetch:video-depth-anything":`node scripts/fetch-video-depth-anything.mjs`,"fetch:depth-pro":`node scripts/fetch-depth-pro.mjs`,"fetch:face-landmarker":`node scripts/fetch-face-landmarker.mjs`,"fetch:anime-face-detector":`node scripts/fetch-anime-face-detector.mjs`,"fetch:face-parsing":`node scripts/fetch-face-parsing.mjs`,"fetch:vitmatte":`node scripts/fetch-vitmatte.mjs`,"fetch:liveportrait-mlx":`node scripts/fetch-liveportrait-mlx.mjs`,"fetch:wav2vec-phoneme-ctc":`node scripts/fetch-wav2vec-phoneme-ctc.mjs`,"fetch:lf-sta":`node scripts/fetch-wav2vec-phoneme-ctc.mjs`,"fetch:supertonic-3":`node scripts/fetch-supertonic-3.mjs`,"fetch:lf-tts":`node scripts/fetch-supertonic-3.mjs`,"fetch:lf-t2i-turbo":`python3 ../tools/krea-2-salad/scripts/fetch_cdn_snapshot.py`,"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:vitmatte && npm run fetch:lf-sta && npm run fetch:lf-tts`,locations:`npm run catalogue:locations && npm run build:locations`,"configure:cors":`node scripts/configure-r2-cors.mjs`,"verify:cors":`node scripts/verify-cdn-cors.mjs`,"deploy:worker:avatar-compose":`node scripts/deploy-avatar-compose-worker.mjs`,"deploy:worker:experience-thumb":`node scripts/deploy-experience-thumb-worker.mjs`,deploy:`npm run build && npm run publish:sdk`,verify:`npm run build && node scripts/check-sdk-size.mjs && node scripts/verify-thumbnail-light.mjs && node scripts/test-embed-protocol.mjs && node scripts/test-manifest-embed-url.mjs && node scripts/test-player-reachability.mjs && node scripts/test-session-endpoint.mjs && node scripts/verify-package.mjs`,"preview:test":`npm run build && npm run preview`},dependencies:{"@jsquash/webp":`^1.5.0`,zod:`^4.4.3`},devDependencies:{"@aws-sdk/client-s3":`^3.1000.0`,"@aws-sdk/lib-storage":`^3.1110.0`,"@elevenlabs/client":`^1.17.0`,"@sveltejs/package":`^2.5.8`,"@sveltejs/vite-plugin-svelte":`^7.0.0`,"@testing-library/react":`^16.3.0`,"@testing-library/svelte":`^5.4.2`,"@types/node":`^25.9.3`,"@types/react":`^19.1.12`,"@types/react-dom":`^19.1.9`,"@vitejs/plugin-react":`^5.0.2`,"@webgpu/types":`^0.1.70`,dotenv:`^17.2.3`,jsdom:`^30.0.1`,"livekit-client":`^2.21.0`,react:`^19.1.1`,"react-dom":`^19.1.1`,sharp:`^0.34.2`,svelte:`^5.55.2`,"svelte-check":`^4.7.4`,typescript:`^6.0.3`,vite:`^8.0.16`,vitest:`^4.1.10`,wrangler:`^4.101.0`}}.version}`,De=`https://player.liforma.ai/embed`,Oe=`http://localhost:3002/embed`;function ke(){let e=globalThis.__LIFORMA_PLAYER_EMBED_URL;if(e?.trim())return e.trim().replace(/\/$/,``);if(typeof document>`u`)return null;let t=(document.querySelector(`script[data-liforma-sdk][src*="client.js"]`)??document.querySelector(`script[src*="/sdk/v2/client.js"]`))?.getAttribute(`data-player-embed-url`)?.trim();return t?t.replace(/\/$/,``):null}function N(){let e=ke();return e?e.endsWith(`/embed`)?e:`${e}/embed`:t()?Oe:De}function Ae(e,t){return e?.trim()||t?.trim()||void 0}function je(e,t,n,r,i,a,o,s,c,l,u){let d=(e??N()).replace(/\/$/,``),f=d.endsWith(`/embed`)?d:`${d}/embed`,p=new URL(f),m=n?.trim();m&&p.searchParams.set(`backdropId`,m);let h=r?.trim();return h&&p.searchParams.set(`avatarId`,h),(i===`face`||i===`medium`)&&p.searchParams.set(`fit`,i),c===`pip`&&p.searchParams.set(`stage`,`pip`),l===`set`&&p.searchParams.set(`pipBackground`,`set`),u===!1&&p.searchParams.set(`pipShadow`,`0`),a===`widget`&&p.searchParams.set(`ui`,`widget`),o&&p.searchParams.set(`close`,`1`),t&&p.searchParams.set(`debug`,`true`),(s===2||s===3||s===4)&&p.searchParams.set(`cast`,String(s)),Me(p.toString())}function Me(e){if(typeof location>`u`)return e;let t=new URL(e);return t.searchParams.set(`parentOrigin`,location.origin),t.toString()}function Ne(e){return new URL(e).origin}function Pe(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?`evt_${crypto.randomUUID().replace(/-/g,``).slice(0,12)}`:`evt_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}function Fe(e,t,n){return{id:Pe(),type:e,sessionId:t,timestamp:new Date().toISOString(),data:n}}function Ie(){return{ready:new Set,started:new Set,sessionMinted:new Set,userTranscript:new Set,userSpeechStarted:new Set,userSpeechEnded:new Set,characterSpeechStarted:new Set,characterSpeechEnded:new Set,characterFocusChanged:new Set,conversationUpdate:new Set,message:new Set,listeningState:new Set,activityChange:new Set,interactionChange:new Set,feedback:new Set,feedbackFailed:new Set,conversationProcessorError:new Set}}function Le(e,t,n){return e[t].add(n),()=>e[t].delete(n)}function Re(e,t,n){for(let r of e[t])r(n)}function ze(e){for(let t of Object.keys(e))e[t].clear()}function P(e){return`data`in e&&`format`in e&&e.format!=null&&!(`track`in e)}function F(e){return`url`in e&&typeof e.url==`string`}function I(e){if(!(`track`in e))return!1;let t=e.track;return typeof t!=`object`||!t?!1:typeof MediaStreamTrack<`u`&&t instanceof MediaStreamTrack?!0:`kind`in t&&`readyState`in t}function L(e){return!P(e)&&!F(e)&&!I(e)&&`encoding`in e&&typeof e.encoding==`string`}var Be=[8e3,16e3,22050,24e3,44100,48e3],R={MAX_CHUNK_BYTES:64*1024,RECOMMENDED_CHUNK_MS_MIN:20,RECOMMENDED_CHUNK_MS_MAX:200,MAX_BUFFERED_AUDIO_MS:8e3,PLAYBACK_JITTER_BUFFER_MS:150,PLAYBACK_JITTER_BUFFER_MS_MIN:80,PLAYBACK_JITTER_BUFFER_MS_MAX:250,MAX_UTTERANCE_DURATION_MS:9e4,MAX_PENDING_WRITES:8,DEFAULT_WRITE_TIMEOUT_MS:5e3},z=class extends Error{operation;requiredCapability;name=`UnsupportedSpeechOperationError`;constructor(e,t){super(`Speech operation "${e}" requires capability "${t}".`),this.operation=e,this.requiredCapability=t}},B=class extends Error{name=`SpeechUtteranceClosedError`;constructor(e=`Cannot write to a closed or cancelled speech utterance.`){super(e)}},V=class extends Error{name=`SpeechRuntimeError`;constructor(e,t){super(e,t)}},H=class extends Error{name=`SpeechBufferTimeoutError`;constructor(e=`Timed out waiting for speech buffer capacity.`){super(e)}};function U(e=`none`){return{mode:e,trackedDurationMs:0,fallbackDurationMs:0}}function W(e){return Be.includes(e)}function G(e){if(e.encoding!==`pcm_s16le`)throw new V(`Unsupported audio encoding: ${e.encoding}`);if(e.channels!==1)throw new V(`Unsupported channel count: ${e.channels}`);if(!W(e.sampleRate))throw new V(`Unsupported sample rate: ${e.sampleRate}`)}function Ve(e){if(P(e)){G(e.format);return}if(F(e)){if(!e.url.trim())throw new V(`Audio URL must be non-empty.`);if(e.sampleRate!==void 0&&!W(e.sampleRate))throw new V(`Unsupported sample rate: ${e.sampleRate}`);return}if(I(e)){if(e.track.kind!==`audio`)throw new V(`speech.play track must be an audio MediaStreamTrack.`);if(e.sampleRate!==void 0&&!W(e.sampleRate))throw new V(`Unsupported sample rate: ${e.sampleRate}`);return}if(L(e)){let t=e.encoding.trim().toLowerCase();if(!t)throw new V(`Encoded audio MIME type is required.`);if(t===`pcm_s16le`)throw new V(`Use format: { encoding: "pcm_s16le", … } for raw PCM.`);if(e.sampleRate!==void 0&&!W(e.sampleRate))throw new V(`Unsupported sample rate: ${e.sampleRate}`);return}throw new V(`Unsupported speech.play audio shape.`)}function He(e){if(e.format)return G(e.format),e.format;if(e.track){let t={encoding:`pcm_s16le`,sampleRate:e.sampleRate??24e3,channels:1};return G(t),t}throw new V(`createUtterance requires format or track.`)}function K(e){return e instanceof Uint8Array?e:new Uint8Array(e)}function Ue(e){return e===`replace-active`||e===`replace-all`?`interrupt`:`enqueue`}function We(e){let t=new Uint8Array(e.length*2),n=new DataView(t.buffer);for(let t=0;t<e.length;t++){let r=Math.max(-1,Math.min(1,e[t]));n.setInt16(t*2,r<0?r*32768:r*32767,!0)}return t}function Ge(e,t,n,r,i){let a=-.5*e+1.5*t-1.5*n+.5*r,o=e-2.5*t+2*n-.5*r,s=-.5*e+.5*n,c=t;return((a*i+o)*i+s)*i+c}function Ke(e,t){if(!(e>0)||!(t>0))throw Error(`Resampler rates must be positive`);if(e===t)return{fromRate:e,toRate:t,push(e){return e},flush(){return new Float32Array}};let n=e/t,r=new Float32Array,i=0;return{fromRate:e,toRate:t,push(e){if(e.length===0)return new Float32Array;let t=new Float32Array(r.length+e.length);if(t.set(r),t.set(e,r.length),r=t,r.length<4)return new Float32Array;let a=[];for(;i+2<r.length-1;){let e=Math.floor(i),t=i-e,o=Math.max(0,e-1),s=Math.min(r.length-1,e+1),c=Math.min(r.length-1,e+2);a.push(Ge(r[o],r[e],r[s],r[c],t)),i+=n}let o=Math.max(0,Math.floor(i)-1);return o>0&&(r=r.subarray(o),i-=o),a.length?Float32Array.from(a):new Float32Array},flush(){return r.length===0?new Float32Array:(r=new Float32Array,i=0,new Float32Array)}}}var q=`liforma-pcm-capture`,qe=`
|
|
2
2
|
class LiformaPcmCaptureProcessor extends AudioWorkletProcessor {
|
|
3
3
|
process(inputs) {
|
|
4
4
|
const ch = inputs[0] && inputs[0][0];
|
|
@@ -11,5 +11,5 @@ class LiformaPcmCaptureProcessor extends AudioWorkletProcessor {
|
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
registerProcessor('${q}', LiformaPcmCaptureProcessor);
|
|
14
|
-
`,J=null;function qe(){return J||=URL.createObjectURL(new Blob([Ke],{type:`application/javascript`})),J}function Je(){return window.AudioContext||window.webkitAudioContext||null}async function Y(e){let{mediaStream:t,targetSampleRate:n,onPcm:r,shouldSend:i,onLog:a}=e,o=Je();if(!o)throw Error(`Web Audio is required for audio capture`);let s=new o,c=s.createMediaStreamSource(t),l=s.createGain();l.gain.value=0;let u=s.sampleRate,d=Ge(u,n),f=!1,p=!1,m=e=>{if(f||i&&!i())return;let t=d.push(e);t.length!==0&&r(Ue(t))},h=()=>void 0;return await(async()=>{if(typeof s.audioWorklet?.addModule!=`function`)return!1;try{await s.audioWorklet.addModule(qe());let e=new AudioWorkletNode(s,q,{numberOfInputs:1,numberOfOutputs:1,outputChannelCount:[1]});return e.port.onmessage=e=>{e.data instanceof Float32Array&&m(e.data)},c.connect(e),e.connect(l),l.connect(s.destination),h=()=>{e.port.onmessage=null;try{e.disconnect()}catch{}try{c.disconnect()}catch{}try{l.disconnect()}catch{}},p=!0,!0}catch{return!1}})()?a?.(`Mic/track capture via AudioWorklet at ${u} Hz → ${n} Hz`):((()=>{let e=s.createScriptProcessor?.bind(s);if(!e)throw Error(`Neither AudioWorklet nor ScriptProcessor is available`);let t=e(4096,1,1);t.onaudioprocess=e=>{m(e.inputBuffer.getChannelData(0))},c.connect(t),t.connect(l),l.connect(s.destination),h=()=>{t.onaudioprocess=null;try{t.disconnect()}catch{}try{c.disconnect()}catch{}try{l.disconnect()}catch{}},p=!1})(),a?.(`Mic/track capture via ScriptProcessor at ${u} Hz → ${n} Hz`,`warn`)),s.state===`suspended`&&await s.resume().catch(()=>void 0),{fromSampleRate:u,usingWorklet:p,stop(){f||(f=!0,d.flush(),h(),s.close().catch(()=>void 0))}}}async function Ye(e){let{track:t,utterance:n,sampleRate:r,signal:i}=e;if(typeof MediaStreamTrack>`u`||!(t instanceof MediaStreamTrack))throw new V(`MediaStreamTrack is not available in this environment.`);if(t.kind!==`audio`)throw new V(`speech.play track must be an audio MediaStreamTrack.`);if(t.readyState===`ended`||i?.aborted)return;let a=new MediaStream([t]),o=Promise.resolve(),s=!1,c=null,l=()=>{s||(s=!0,c?.stop(),c=null)};try{c=await Y({mediaStream:a,targetSampleRate:r,shouldSend:()=>!s&&!i?.aborted,onPcm:e=>{if(s||i?.aborted)return;let t=K(e);o=o.then(async()=>{if(s||i?.aborted)return;let e=0;for(;e<t.byteLength;){let r=Math.min(e+R.MAX_CHUNK_BYTES,t.byteLength);if((r-e)%2==1&&--r,r<=e)break;let i=t.subarray(e,r);e=r,i.byteLength!==0&&await n.write(i)}}).catch(()=>{l()})}})}catch(e){throw l(),new V(`MediaStreamTrack capture failed: ${e instanceof Error?e.message:String(e)}`)}await new Promise(e=>{let r=()=>{l(),o.finally(e)};t.addEventListener(`ended`,r,{once:!0}),i?.addEventListener(`abort`,()=>{n.cancel().catch(()=>void 0),r()},{once:!0}),(t.readyState===`ended`||i?.aborted)&&r()})}async function Xe(e,t){if(I(e))throw new V(`MediaStreamTrack play is handled on the host before embed.`);if(P(e)){let t=K(e.data);if(t.byteLength&1)throw new V(`PCM byte length must be even.`);return{kind:`pcm`,data:t.slice().buffer,format:e.format}}if(F(e))return{kind:`url`,url:e.url.trim(),...e.sampleRate===void 0?{}:{sampleRate:e.sampleRate}};if(!L(e))throw new V(`Unsupported speech.play audio shape.`);let n;if(typeof Blob<`u`&&e.data instanceof Blob){if(t?.aborted)throw new DOMException(`Play aborted.`,`AbortError`);n=new Uint8Array(await e.data.arrayBuffer())}else n=K(e.data);return{kind:`encoded`,data:n.slice().buffer,encoding:e.encoding.trim(),...e.sampleRate===void 0?{}:{sampleRate:e.sampleRate}}}function Ze(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?`utt_${crypto.randomUUID().replace(/-/g,``).slice(0,12)}`:`utt_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}function X(e,t=`completed`){return{utteranceId:e.speechId,characterId:e.characterId,status:t,durationMs:e.durationMs,transcript:e.text,animation:{mode:`tracked`,trackedDurationMs:e.durationMs,fallbackDurationMs:0}}}function Z(e){return e instanceof Error?e:new V(String(e))}function Q(e){return e instanceof DOMException&&e.name===`AbortError`||e instanceof Error&&e.name===`AbortError`}var Qe=class{id;characterId;result;format;host;signal;settleResolve;settleReject;settled=!1;closed=!1;writeChain=Promise.resolve();pendingWriteCount=0;pendingWriteWaiters=[];bufferedMs=0;sampleRate;beginPromise;constructor(e){this.id=e.id,this.characterId=e.characterId,this.format=e.format,this.host=e.host,this.signal=e.signal,this.sampleRate=e.format.sampleRate,this.result=new Promise((e,t)=>{this.settleResolve=e,this.settleReject=t}),this.result.catch(()=>void 0);let t=this.requireHost();this.beginPromise=t.speechUtteranceBegin({utteranceId:this.id,format:this.format,characterId:this.characterId,queue:e.queue,...e.transcript===void 0?{}:{transcript:e.transcript}}).catch(e=>{throw this.fail(Z(e)),Z(e)}),this.signal?.addEventListener(`abort`,()=>{this.cancel()},{once:!0})}async write(e,t){if(this.closed||this.settled||(await this.beginPromise.catch(()=>void 0),this.closed||this.settled))throw new B;let n=K(e);if(n.byteLength&1)throw new V(`PCM chunk byte length must be even (complete s16 samples).`);if(n.byteLength>R.MAX_CHUNK_BYTES)throw new V(`PCM chunk exceeds MAX_CHUNK_BYTES (${R.MAX_CHUNK_BYTES}).`);if(n.byteLength===0)return;let r=t?.timeoutMs??R.DEFAULT_WRITE_TIMEOUT_MS;await this.acquireWriteSlot(r);let i=n.byteLength/2/this.sampleRate*1e3;if(this.bufferedMs+i>R.MAX_UTTERANCE_DURATION_MS)throw this.releaseWriteSlot(),new V(`Utterance exceeds MAX_UTTERANCE_DURATION_MS.`);let a=async()=>{if(this.closed||this.settled)throw new B;let e=this.requireHost(),t=n.slice(),i=e.speechUtteranceWrite({utteranceId:this.id,audio:t.buffer,byteLength:t.byteLength}),a=await Promise.race([i,new Promise((e,t)=>{setTimeout(()=>t(new H),r)})]);this.bufferedMs=Math.max(0,a.bufferedMs)},o=this.writeChain.then(a,a);this.writeChain=o.then(()=>void 0,()=>void 0);try{await o}finally{this.releaseWriteSlot()}}async setTranscript(e){if(this.closed||this.settled||(await this.beginPromise.catch(()=>void 0),this.closed||this.settled))throw new B;await this.requireHost().speechUtteranceSetTranscript({utteranceId:this.id,transcript:e})}async close(e){if(this.settled)return this.result;this.closed=!0,await this.beginPromise.catch(()=>void 0),await this.writeChain.catch(()=>void 0);try{let t=await this.requireHost().speechUtteranceClose({utteranceId:this.id,transcript:e?.transcript,history:e?.history??`none`});return this.resolve(t),t}catch(e){let t=Z(e);throw this.fail(t),t}}async cancel(){if(this.settled)return this.result;this.closed=!0;try{let e=this.host.getIframeHost();if(e){let t=await e.speechUtteranceCancel({utteranceId:this.id});return this.resolve(t),t}let t={utteranceId:this.id,characterId:this.characterId,status:`cancelled`,durationMs:0,animation:U(`none`)};return this.resolve(t),t}catch(e){let t=Z(e);throw this.fail(t),t}}adoptExternalResult(e){this.resolve(e)}requireHost(){let e=this.host.getIframeHost();if(!e)throw new V(`Speech session is not attached.`);return e}resolve(e){this.settled||(this.settled=!0,this.settleResolve(Object.freeze(e)),this.flushWriteWaiters(new B))}fail(e){this.settled||(this.settled=!0,this.settleReject(e),this.flushWriteWaiters(e))}async acquireWriteSlot(e){if(this.pendingWriteCount<R.MAX_PENDING_WRITES){this.pendingWriteCount+=1;return}await new Promise((t,n)=>{let r=setTimeout(()=>{n(new H)},e);this.pendingWriteWaiters.push({resolve:()=>{clearTimeout(r),this.pendingWriteCount+=1,t()},reject:e=>{clearTimeout(r),n(e)}})})}releaseWriteSlot(){this.pendingWriteCount=Math.max(0,this.pendingWriteCount-1),this.pendingWriteWaiters.shift()?.resolve()}flushWriteWaiters(e){for(;this.pendingWriteWaiters.length>0;)this.pendingWriteWaiters.shift()?.reject(e)}};function $e(e){let t=null,n=(t,n)=>{if(!e.getCapabilities()[n])throw new z(t,n)},r={async speak(r){if(e.assertSessionStarted(),n(`speak`,`textSpeech`),r.signal?.aborted)throw new DOMException(`Speak aborted.`,`AbortError`);let i=He(r.queue??`append`);i===`interrupt`&&(e.onProcessorInterrupt?.(),t&&=(t.cancel(),null));let a=e.getIframeHost();if(!a)throw new V(`Speech session is not attached.`);let o=a.speak({text:r.text,characterId:r.characterId,behavior:i});if(r.signal){let t=r.signal;return await new Promise((n,i)=>{let s=()=>{a.speechInterrupt({scope:`active`}).catch(()=>void 0),i(new DOMException(`Speak aborted.`,`AbortError`))};if(t.aborted){s();return}t.addEventListener(`abort`,s,{once:!0}),o.then(e=>{t.removeEventListener(`abort`,s),n(X(e,`completed`))},a=>{if(t.removeEventListener(`abort`,s),Q(a)){n({utteranceId:`utt_interrupted`,characterId:r.characterId??e.getActiveCharacterId(),status:`interrupted`,durationMs:0,transcript:r.text,animation:U(`none`)});return}i(Z(a))})})}try{return X(await o,`completed`)}catch(t){if(Q(t))return{utteranceId:`utt_interrupted`,characterId:r.characterId??e.getActiveCharacterId(),status:`interrupted`,durationMs:0,transcript:r.text,animation:U(`none`)};throw Z(t)}},async play(i){if(e.assertSessionStarted(),n(`play`,`externalSpeechAudio`),Be(i.audio),i.signal?.aborted)throw new DOMException(`Play aborted.`,`AbortError`);let a=i.queue??`append`;if((a===`replace-active`||a===`replace-all`)&&(e.onProcessorInterrupt?.(),t&&=(t.cancel(),null)),I(i.audio)){let e=i.audio.sampleRate??24e3;return r.createUtterance({format:{encoding:`pcm_s16le`,sampleRate:e,channels:1},track:i.audio.track,characterId:i.characterId,queue:a===`append`?`replace-active`:a,signal:i.signal}).result}let o=e.getIframeHost();if(!o)throw new V(`Speech session is not attached.`);let s=await Xe(i.audio,i.signal);return o.speechPlay({source:s,characterId:i.characterId,transcript:i.transcript,history:i.history??`none`,queue:a,signal:i.signal})},createUtterance(r){e.assertSessionStarted(),n(`createUtterance`,`externalSpeechAudio`);let i=Ve(r);if(r.track&&r.track.kind!==`audio`)throw new V(`createUtterance track must be an audio MediaStreamTrack.`);let a=r.queue??`replace-active`;if(a!==`replace-active`&&a!==`replace-all`)throw new V(`createUtterance queue must be replace-active or replace-all.`);e.onProcessorInterrupt?.(),t&&=(t.cancel(),null);let o=new Qe({id:Ze(),characterId:r.characterId??e.getActiveCharacterId(),format:i,queue:a,host:e,...r.transcript===void 0?{}:{transcript:r.transcript},signal:r.signal});return t=o,o.result.finally(()=>{t===o&&(t=null)}),r.track&&(async()=>{try{if(await Ye({track:r.track,utterance:o,sampleRate:i.sampleRate,signal:r.signal}),r.signal?.aborted)return;await o.close({history:`none`})}catch{await o.cancel().catch(()=>void 0)}})(),o},async interrupt(n){e.assertSessionStarted(),e.onProcessorInterrupt?.();let r=e.getIframeHost();if(!r)return[];let i=await r.speechInterrupt(n??{scope:`active`});if(t){let e=i.find(e=>e.utteranceId===t.id);e&&t.adoptExternalResult(e),t=null}return i}};return r}function et(e){let t=e?.trim();return t===`full`||t===`face`||t===`medium`?t:void 0}function tt(e){return!!(e.showClose===!0||e.returnUrl?.trim()||e.closeButton===!0||e.closeButton&&typeof e.closeButton==`object`&&e.closeButton.visible!==!1)}var $=class e{bootstrap;conversationProcessor;iframeHost=null;attachInFlight=null;endpointAbortController=null;processorAbortController=null;processorChain=Promise.resolve();resolvedSession;launchToken;attachReturnUrl=null;closed=!1;attached=!1;pendingFit=null;pendingStage=null;pendingPipBackground=null;pendingPipShadow=null;lastInteraction=null;closeHandlers=[];eventRegistry=Fe();readyEnvelope=null;startedEnvelope=null;sessionMintedEnvelope=null;conversationCache=[];speech;constructor(e){this.bootstrap=e,this.conversationProcessor=e.conversationProcessor??null,this.resolvedSession=e.kind===`launch`?e.session??null:null,this.launchToken=e.kind===`launch`?e.launch:null,this.speech=$e({getIframeHost:()=>this.iframeHost,assertSessionStarted:()=>this.assertSessionStarted(),getCapabilities:()=>nt(this.resolvedSession),getActiveCharacterId:()=>`character_unknown`,onProcessorInterrupt:()=>{this.processorAbortController?.abort(),this.processorAbortController=null}})}static async startSession(t){if(`launch`in t&&typeof t.launch==`string`){let n=t.launch.trim();if(!n)throw Error(`StartSessionOptions.launch must be a non-empty string.`);return new e({kind:`launch`,launch:n,session:t.session,backdropId:t.backdropId,locationId:t.locationId,avatarId:t.avatarId,embedBaseUrl:t.embedBaseUrl,debug:t.debug,speechOnly:t.speechOnly,ui:t.ui,onStart:t.onStart,onUserTranscript:t.onUserTranscript,conversationProcessor:t.conversationProcessor})}if(`sessionEndpoint`in t)return new e({kind:`sessionEndpoint`,experienceId:t.experienceId,sessionEndpoint:t.sessionEndpoint,locale:t.locale,secondaryLocale:t.secondaryLocale,learningLocale:t.learningLocale,language:t.language,backdropId:t.backdropId,locationId:t.locationId,avatarId:t.avatarId,castSize:t.castSize,embedBaseUrl:t.embedBaseUrl,debug:t.debug,mode:t.mode,speechInputMode:t.speechInputMode,speechOnly:t.speechOnly,attribution:t.attribution,alreadyConverted:t.alreadyConverted,ui:t.ui,onStart:t.onStart,onUserTranscript:t.onUserTranscript,conversationProcessor:t.conversationProcessor});if(`experienceId`in t)return new e({kind:`public`,experienceId:t.experienceId,locale:t.locale,secondaryLocale:t.secondaryLocale,learningLocale:t.learningLocale,language:t.language,backdropId:t.backdropId,locationId:t.locationId,avatarId:t.avatarId,castSize:t.castSize,embedBaseUrl:t.embedBaseUrl,debug:t.debug,mode:t.mode,speechInputMode:t.speechInputMode,speechOnly:t.speechOnly,attribution:t.attribution,alreadyConverted:t.alreadyConverted,ui:t.ui,onStart:t.onStart,onUserTranscript:t.onUserTranscript,conversationProcessor:t.conversationProcessor});throw Error(`Experience.startSession requires experienceId, sessionEndpoint, or launch.`)}getSession(){return this.resolvedSession}getManifest(){return null}on(e,t){let n=Ie(this.eventRegistry,e,t);return e===`ready`&&this.readyEnvelope&&queueMicrotask(()=>t(this.readyEnvelope)),e===`started`&&this.startedEnvelope&&queueMicrotask(()=>t(this.startedEnvelope)),e===`sessionMinted`&&this.sessionMintedEnvelope&&queueMicrotask(()=>t(this.sessionMintedEnvelope)),n}async attach(e){if(this.closed)throw Error(`Session has ended.`);if(!e.container)throw Error(`Experience.attach requires a DOM container element.`);return this.attached&&this.iframeHost?this.createPlayerFacade():(this.attachInFlight||=this.attachInternal(e).finally(()=>{this.attachInFlight=null}),this.attachInFlight)}async attachInternal(e){if(this.closed)throw Error(`Session has ended.`);if(this.attached&&this.iframeHost)return this.createPlayerFacade();this.iframeHost&&=(this.iframeHost.destroy(),null),this.attachReturnUrl=e.returnUrl?.trim()||null;let t=this.bootstrap.embedBaseUrl??N(),n=this.bootstrap.debug===!0,r=this.bootstrap.speechOnly===!0,i=Ae(t,n,r?void 0:ke(this.bootstrap.backdropId,this.bootstrap.locationId),r?void 0:this.bootstrap.avatarId,e.fit,this.bootstrap.ui,tt(e),this.bootstrap.kind===`launch`?void 0:this.bootstrap.castSize,e.stage,e.pipBackground,e.pipShadow),a=Me(i),o=null,s=new Promise(e=>{o=e}),c=null,l=new Promise(e=>{c=e}),u=Te(e=>{this.readyEnvelope||=(this.resolvedSession=e,this.emitWrapped(`ready`,{session:e}))}),d=this.bootstrap.onUserTranscript,f=we({container:e.container,src:i,playerOrigin:a,transparent:this.bootstrap.ui===`widget`,onClose:e=>{let t=e.returnUrl||!this.attachReturnUrl?e:{...e,returnUrl:this.attachReturnUrl};for(let e of this.closeHandlers)e(t)},onPlayerStatusChange:t=>{e.onPlayerStatusChange?.(t),e.onStateUpdate?.(t),t===`loading`&&o&&(o(),o=null),t===`ready`&&c&&(c(),c=null),t===`ready`&&u.markReady()},onUserTranscript:e=>{this.emitWrapped(`userTranscript`,e),d?.(e),this.queueProcessorTurn(e)},onUserSpeechStarted:e=>{this.emitWrapped(`userSpeechStarted`,e)},onUserSpeechEnded:e=>{this.emitWrapped(`userSpeechEnded`,e)},onCharacterSpeechStarted:e=>{this.emitWrapped(`characterSpeechStarted`,e)},onCharacterSpeechEnded:e=>{this.emitWrapped(`characterSpeechEnded`,e)},onCharacterFocusChanged:e=>{this.emitWrapped(`characterFocusChanged`,e)},onListeningState:e=>{this.emitWrapped(`listeningState`,e)},onActivityChange:e=>{this.emitWrapped(`activityChange`,e)},onInteractionChange:e=>{this.lastInteraction=e,this.emitWrapped(`interactionChange`,e)},onFeedback:e=>{this.emitWrapped(`feedback`,e)},onFeedbackFailed:e=>{this.emitWrapped(`feedbackFailed`,e)},onMessage:e=>{this.emitWrapped(`message`,e)},onStarted:e=>{this.startedEnvelope||(this.startedEnvelope=this.emitWrapped(`started`,e),this.bootstrap.onStart?.(e))},onConversationUpdate:e=>{this.conversationCache=e,this.emitWrapped(`conversationUpdate`,e)},onWidgetReady:()=>e.onWidgetReady?.(),onWidgetExpand:()=>e.onWidgetExpand?.(),onWidgetCollapse:()=>e.onWidgetCollapse?.(),onWidgetAudioSettings:t=>e.onWidgetAudioSettings?.(t),onWidgetDragStart:t=>e.onWidgetDragStart?.(t),onWidgetDragMove:t=>e.onWidgetDragMove?.(t),onWidgetDragEnd:t=>e.onWidgetDragEnd?.(t)});this.iframeHost=f;let p=this.resolveMintInteraction(),m=this.bootstrap.kind===`sessionEndpoint`?(this.endpointAbortController=new AbortController,oe(this.bootstrap.sessionEndpoint,{experienceId:this.bootstrap.experienceId,locale:this.bootstrap.locale,secondaryLocale:this.bootstrap.secondaryLocale,learningLocale:this.bootstrap.learningLocale,language:this.bootstrap.language,mode:p.mode,speechInputMode:p.speechInputMode,speechOnly:this.bootstrap.speechOnly,attribution:this.bootstrap.attribution,alreadyConverted:this.bootstrap.alreadyConverted,signal:this.endpointAbortController.signal})):this.bootstrap.kind===`public`?ae(this.bootstrap.experienceId,{locale:this.bootstrap.locale,secondaryLocale:this.bootstrap.secondaryLocale,learningLocale:this.bootstrap.learningLocale,language:this.bootstrap.language,mode:p.mode,speechInputMode:p.speechInputMode,speechOnly:this.bootstrap.speechOnly,attribution:this.bootstrap.attribution,alreadyConverted:this.bootstrap.alreadyConverted}):Promise.resolve(this.bootstrap.session?{session:this.bootstrap.session,launch:this.bootstrap.launch}:null),h;try{[,h]=await Promise.all([f.waitForLoad(),m])}catch(e){try{f.reportSdkError({errorCode:`sdk.session.attach_failed`,severity:`error`,operation:`attach`,message:e instanceof Error?e.message:String(e),stack:e instanceof Error?e.stack:void 0,release:M})}catch{}throw f.destroy(),this.iframeHost===f&&(this.iframeHost=null),e}finally{this.endpointAbortController=null}f.postParentHello();let g=h?.launch??(this.bootstrap.kind===`launch`?this.bootstrap.launch:null),_=h?.session??(this.bootstrap.kind===`launch`?this.bootstrap.session:void 0);if(!g)throw f.destroy(),this.iframeHost===f&&(this.iframeHost=null),Error(`Session Launch response did not include a launch token.`);this.launchToken=g;let v=_??(this.bootstrap.kind===`launch`?this.bootstrap.session:void 0);return v&&!this.sessionMintedEnvelope&&(this.resolvedSession=v,this.sessionMintedEnvelope=this.emitWrapped(`sessionMinted`,{session:v})),_?(this.resolvedSession=_,this.bootstrap.kind===`launch`&&w(_),f.postLaunch(g,_,{startButton:e.startButton,theme:e.theme,showFeedback:e.showFeedback,interaction:e.interaction}),u.setValue(_)):f.postLaunch(g,void 0,{startButton:e.startButton,theme:e.theme,showFeedback:e.showFeedback,interaction:e.interaction}),await Promise.race([s,new Promise((e,t)=>{setTimeout(()=>t(Error(`Timed out waiting for player loading UI.`)),12e4)})]).catch(e=>{try{f.reportSdkError({errorCode:`sdk.session.attach_failed`,severity:`error`,operation:`attach`,message:e instanceof Error?e.message:String(e),stack:e instanceof Error?e.stack:void 0,release:M})}catch{}throw e}),await Promise.race([l,new Promise((e,t)=>{setTimeout(()=>t(Error(`Timed out waiting for player ready state.`)),12e4)})]).catch(e=>{try{f.reportSdkError({errorCode:`sdk.session.attach_failed`,severity:`error`,operation:`attach`,message:e instanceof Error?e.message:String(e),stack:e instanceof Error?e.stack:void 0,release:M})}catch{}throw e}),this.attached=!0,this.pendingFit&&await f.setFit(this.pendingFit),this.pendingStage&&await f.setStage(this.pendingStage),this.pendingPipBackground&&await f.setPipBackground(this.pendingPipBackground),this.pendingPipShadow!==null&&await f.setPipShadow(this.pendingPipShadow),this.createPlayerFacade()}async startListening(){this.assertSessionStarted(),await this.iframeHost.startListening()}async stopListening(){return this.assertSessionStarted(),this.iframeHost.stopListening()}async listenOnce(e){return this.assertSessionStarted(),this.iframeHost.listenOnce({timeoutMs:e?.timeoutMs})}getConversation(){return this.conversationCache}setWidgetChrome(e){this.iframeHost?.postWidgetSetChrome(e)}toggleAudioSettings(){this.iframeHost?.postWidgetToggleAudioSettings()}async focusCharacter(e){this.assertSessionStarted(),await this.iframeHost.focusCharacter(e)}async setFit(e){let t=et(e);if(!t)throw Error(`setFit requires "full", "medium", or "face".`);if(this.closed)throw Error(`Session has ended.`);this.pendingFit=t,!(!this.attached||!this.iframeHost)&&await this.iframeHost.setFit(t)}async setStage(e){if(e!==`fill`&&e!==`pip`)throw Error(`setStage requires "fill" or "pip".`);if(this.closed)throw Error(`Session has ended.`);this.pendingStage=e,!(!this.attached||!this.iframeHost)&&await this.iframeHost.setStage(e)}async setPipBackground(e){if(e!==`none`&&e!==`set`)throw Error(`setPipBackground requires "none" or "set".`);if(this.closed)throw Error(`Session has ended.`);this.pendingPipBackground=e,!(!this.attached||!this.iframeHost)&&await this.iframeHost.setPipBackground(e)}async setPipShadow(e){if(this.closed)throw Error(`Session has ended.`);this.pendingPipShadow=e,!(!this.attached||!this.iframeHost)&&await this.iframeHost.setPipShadow(e)}async setInteraction(e){if(this.closed)throw Error(`Session has ended.`);if(!this.iframeHost)throw Error(`setInteraction() requires attach() first.`);let t=await this.iframeHost.setInteraction(e);return this.lastInteraction=t,t}async getInteraction(){if(this.closed)throw Error(`Session has ended.`);if(!this.iframeHost)throw Error(`getInteraction() requires attach() first.`);let e=await this.iframeHost.getInteraction();return this.lastInteraction=e,e}async conversion(e){if(this.closed)throw Error(`Session has ended.`);if(!this.iframeHost)throw Error(`conversion() requires attach() first.`);await this.iframeHost.conversion(e)}async engage(){if(this.closed)throw Error(`Session has ended.`);if(!this.iframeHost)throw Error(`engage() requires attach() first.`);await this.iframeHost.engage()}getLastTurn(){if(this.conversationCache.length===0)return[];let e=this.conversationCache[this.conversationCache.length-1].turnId;return this.conversationCache.filter(t=>t.turnId===e)}async end(){this.close()}destroy(){this.closed||(this.closed=!0,this.processorAbortController?.abort(),this.processorAbortController=null,this.endpointAbortController?.abort(),this.endpointAbortController=null,this.attachInFlight=null,this.iframeHost?.destroy(),this.iframeHost=null,Re(this.eventRegistry),this.readyEnvelope=null,this.startedEnvelope=null,this.closeHandlers.length=0,this.lastInteraction=null,this.attached=!1)}resolveMintInteraction(){return this.bootstrap.kind===`launch`?{}:{mode:this.bootstrap.mode,speechInputMode:this.bootstrap.speechInputMode}}getSessionId(){return this.resolvedSession?.id??``}emitWrapped(e,t){let n=Pe(e,this.getSessionId(),t);return Le(this.eventRegistry,e,n),n}queueProcessorTurn(e){if(!e.isFinal||!e.text.trim()||!this.conversationProcessor)return;let t=this.conversationProcessor;this.processorAbortController?.abort(),this.processorAbortController=new AbortController;let n=this.processorAbortController.signal;this.processorChain=this.processorChain.then(async()=>{if(!n.aborted)try{let r=await le(t,{utteranceId:e.utteranceId,text:e.text,conversation:this.conversationCache,signal:n});if(n.aborted)return;if(r.kind===`complete`){let e=r.speech;await this.speech.speak({text:e.text,...e.characterId?{characterId:e.characterId}:{},queue:e.behavior===`interrupt`?`replace-active`:`append`});return}await this.iframeHost.speakProcessorStream(r.stream,{signal:n})}catch(t){if(n.aborted)return;let r=t instanceof Error?t.message:String(t);this.emitWrapped(`conversationProcessorError`,{utteranceId:e.utteranceId,message:r})}})}assertAttached(){if(!this.attached||!this.iframeHost)throw Error(`Call Experience.attach() before using speech APIs.`)}assertSessionStarted(){if(this.assertAttached(),!this.startedEnvelope)throw Error(`Session has not started. Wait for the player start button and the started event before using speak() or listening APIs.`)}close(){this.closed||(this.closed=!0,this.endpointAbortController?.abort(),this.endpointAbortController=null,this.attachInFlight=null,this.iframeHost?.destroy(),this.iframeHost=null,this.attached=!1)}createPlayerFacade(){return{close:()=>{this.close()},destroy:()=>{this.destroy()},on:(e,t)=>{e===`close`&&this.closeHandlers.push(t)}}}};function nt(e){return e?{textSpeech:e.capabilities.speech.output,externalSpeechAudio:e.capabilities.speech.externalAudio}:{textSpeech:!0,externalSpeechAudio:!0}}return window.Liforma={Experience:$,sdkVersion:`v2`,features:{speakApi:!0,speechAudioApi:!0}},e.Experience=$,e.LiformaError=o,e.SPEECH_LIMITS=R,e.SpeechBufferTimeoutError=H,e.SpeechRuntimeError=V,e.SpeechUtteranceClosedError=B,e.UnsupportedSpeechOperationError=z,e.liformaErrorFromResponse=c,e.warnLocaleVoiceFallbacks=w,e})({});
|
|
14
|
+
`,J=null;function Je(){return J||=URL.createObjectURL(new Blob([qe],{type:`application/javascript`})),J}function Ye(){return window.AudioContext||window.webkitAudioContext||null}async function Xe(e){let{mediaStream:t,targetSampleRate:n,onPcm:r,shouldSend:i,onLog:a}=e,o=Ye();if(!o)throw Error(`Web Audio is required for audio capture`);let s=new o,c=s.createMediaStreamSource(t),l=s.createGain();l.gain.value=0;let u=s.sampleRate,d=Ke(u,n),f=!1,p=!1,m=e=>{if(f||i&&!i())return;let t=d.push(e);t.length!==0&&r(We(t))},h=()=>void 0;return await(async()=>{if(typeof s.audioWorklet?.addModule!=`function`)return!1;try{await s.audioWorklet.addModule(Je());let e=new AudioWorkletNode(s,q,{numberOfInputs:1,numberOfOutputs:1,outputChannelCount:[1]});return e.port.onmessage=e=>{e.data instanceof Float32Array&&m(e.data)},c.connect(e),e.connect(l),l.connect(s.destination),h=()=>{e.port.onmessage=null;try{e.disconnect()}catch{}try{c.disconnect()}catch{}try{l.disconnect()}catch{}},p=!0,!0}catch{return!1}})()?a?.(`Mic/track capture via AudioWorklet at ${u} Hz → ${n} Hz`):((()=>{let e=s.createScriptProcessor?.bind(s);if(!e)throw Error(`Neither AudioWorklet nor ScriptProcessor is available`);let t=e(4096,1,1);t.onaudioprocess=e=>{m(e.inputBuffer.getChannelData(0))},c.connect(t),t.connect(l),l.connect(s.destination),h=()=>{t.onaudioprocess=null;try{t.disconnect()}catch{}try{c.disconnect()}catch{}try{l.disconnect()}catch{}},p=!1})(),a?.(`Mic/track capture via ScriptProcessor at ${u} Hz → ${n} Hz`,`warn`)),s.state===`suspended`&&await s.resume().catch(()=>void 0),{fromSampleRate:u,usingWorklet:p,stop(){f||(f=!0,d.flush(),h(),s.close().catch(()=>void 0))}}}async function Ze(e){let{track:t,utterance:n,sampleRate:r,signal:i}=e;if(typeof MediaStreamTrack>`u`||!(t instanceof MediaStreamTrack))throw new V(`MediaStreamTrack is not available in this environment.`);if(t.kind!==`audio`)throw new V(`speech.play track must be an audio MediaStreamTrack.`);if(t.readyState===`ended`||i?.aborted)return;let a=new MediaStream([t]),o=Promise.resolve(),s=!1,c=null,l=()=>{s||(s=!0,c?.stop(),c=null)};try{c=await Xe({mediaStream:a,targetSampleRate:r,shouldSend:()=>!s&&!i?.aborted,onPcm:e=>{if(s||i?.aborted)return;let t=K(e);o=o.then(async()=>{if(s||i?.aborted)return;let e=0;for(;e<t.byteLength;){let r=Math.min(e+R.MAX_CHUNK_BYTES,t.byteLength);if((r-e)%2==1&&--r,r<=e)break;let i=t.subarray(e,r);e=r,i.byteLength!==0&&await n.write(i)}}).catch(()=>{l()})}})}catch(e){throw l(),new V(`MediaStreamTrack capture failed: ${e instanceof Error?e.message:String(e)}`)}await new Promise(e=>{let r=()=>{l(),o.finally(e)};t.addEventListener(`ended`,r,{once:!0}),i?.addEventListener(`abort`,()=>{n.cancel().catch(()=>void 0),r()},{once:!0}),(t.readyState===`ended`||i?.aborted)&&r()})}async function Qe(e,t){if(I(e))throw new V(`MediaStreamTrack play is handled on the host before embed.`);if(P(e)){let t=K(e.data);if(t.byteLength&1)throw new V(`PCM byte length must be even.`);return{kind:`pcm`,data:t.slice().buffer,format:e.format}}if(F(e))return{kind:`url`,url:e.url.trim(),...e.sampleRate===void 0?{}:{sampleRate:e.sampleRate}};if(!L(e))throw new V(`Unsupported speech.play audio shape.`);let n;if(typeof Blob<`u`&&e.data instanceof Blob){if(t?.aborted)throw new DOMException(`Play aborted.`,`AbortError`);n=new Uint8Array(await e.data.arrayBuffer())}else n=K(e.data);return{kind:`encoded`,data:n.slice().buffer,encoding:e.encoding.trim(),...e.sampleRate===void 0?{}:{sampleRate:e.sampleRate}}}function Y(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?`utt_${crypto.randomUUID().replace(/-/g,``).slice(0,12)}`:`utt_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}function X(e,t=`completed`){return{utteranceId:e.speechId,characterId:e.characterId,status:t,durationMs:e.durationMs,transcript:e.text,animation:{mode:`tracked`,trackedDurationMs:e.durationMs,fallbackDurationMs:0}}}function Z(e){return e instanceof Error?e:new V(String(e))}function Q(e){return e instanceof DOMException&&e.name===`AbortError`||e instanceof Error&&e.name===`AbortError`}var $e=class{id;characterId;result;format;host;signal;settleResolve;settleReject;settled=!1;closed=!1;writeChain=Promise.resolve();pendingWriteCount=0;pendingWriteWaiters=[];bufferedMs=0;sampleRate;beginPromise;constructor(e){this.id=e.id,this.characterId=e.characterId,this.format=e.format,this.host=e.host,this.signal=e.signal,this.sampleRate=e.format.sampleRate,this.result=new Promise((e,t)=>{this.settleResolve=e,this.settleReject=t}),this.result.catch(()=>void 0);let t=this.requireHost();this.beginPromise=t.speechUtteranceBegin({utteranceId:this.id,format:this.format,characterId:this.characterId,queue:e.queue,...e.transcript===void 0?{}:{transcript:e.transcript}}).catch(e=>{throw this.fail(Z(e)),Z(e)}),this.signal?.addEventListener(`abort`,()=>{this.cancel()},{once:!0})}async write(e,t){if(this.closed||this.settled||(await this.beginPromise.catch(()=>void 0),this.closed||this.settled))throw new B;let n=K(e);if(n.byteLength&1)throw new V(`PCM chunk byte length must be even (complete s16 samples).`);if(n.byteLength>R.MAX_CHUNK_BYTES)throw new V(`PCM chunk exceeds MAX_CHUNK_BYTES (${R.MAX_CHUNK_BYTES}).`);if(n.byteLength===0)return;let r=t?.timeoutMs??R.DEFAULT_WRITE_TIMEOUT_MS;await this.acquireWriteSlot(r);let i=n.byteLength/2/this.sampleRate*1e3;if(this.bufferedMs+i>R.MAX_UTTERANCE_DURATION_MS)throw this.releaseWriteSlot(),new V(`Utterance exceeds MAX_UTTERANCE_DURATION_MS.`);let a=async()=>{if(this.closed||this.settled)throw new B;let e=this.requireHost(),t=n.slice(),i=e.speechUtteranceWrite({utteranceId:this.id,audio:t.buffer,byteLength:t.byteLength}),a=await Promise.race([i,new Promise((e,t)=>{setTimeout(()=>t(new H),r)})]);this.bufferedMs=Math.max(0,a.bufferedMs)},o=this.writeChain.then(a,a);this.writeChain=o.then(()=>void 0,()=>void 0);try{await o}finally{this.releaseWriteSlot()}}async setTranscript(e){if(this.closed||this.settled||(await this.beginPromise.catch(()=>void 0),this.closed||this.settled))throw new B;await this.requireHost().speechUtteranceSetTranscript({utteranceId:this.id,transcript:e})}async close(e){if(this.settled)return this.result;this.closed=!0,await this.beginPromise.catch(()=>void 0),await this.writeChain.catch(()=>void 0);try{let t=await this.requireHost().speechUtteranceClose({utteranceId:this.id,transcript:e?.transcript,history:e?.history??`none`});return this.resolve(t),t}catch(e){let t=Z(e);throw this.fail(t),t}}async cancel(){if(this.settled)return this.result;this.closed=!0;try{let e=this.host.getIframeHost();if(e){let t=await e.speechUtteranceCancel({utteranceId:this.id});return this.resolve(t),t}let t={utteranceId:this.id,characterId:this.characterId,status:`cancelled`,durationMs:0,animation:U(`none`)};return this.resolve(t),t}catch(e){let t=Z(e);throw this.fail(t),t}}adoptExternalResult(e){this.resolve(e)}requireHost(){let e=this.host.getIframeHost();if(!e)throw new V(`Speech session is not attached.`);return e}resolve(e){this.settled||(this.settled=!0,this.settleResolve(Object.freeze(e)),this.flushWriteWaiters(new B))}fail(e){this.settled||(this.settled=!0,this.settleReject(e),this.flushWriteWaiters(e))}async acquireWriteSlot(e){if(this.pendingWriteCount<R.MAX_PENDING_WRITES){this.pendingWriteCount+=1;return}await new Promise((t,n)=>{let r=setTimeout(()=>{n(new H)},e);this.pendingWriteWaiters.push({resolve:()=>{clearTimeout(r),this.pendingWriteCount+=1,t()},reject:e=>{clearTimeout(r),n(e)}})})}releaseWriteSlot(){this.pendingWriteCount=Math.max(0,this.pendingWriteCount-1),this.pendingWriteWaiters.shift()?.resolve()}flushWriteWaiters(e){for(;this.pendingWriteWaiters.length>0;)this.pendingWriteWaiters.shift()?.reject(e)}};function et(e){let t=null,n=(t,n)=>{if(!e.getCapabilities()[n])throw new z(t,n)},r={async speak(r){if(e.assertSessionStarted(),n(`speak`,`textSpeech`),r.signal?.aborted)throw new DOMException(`Speak aborted.`,`AbortError`);let i=Ue(r.queue??`append`);i===`interrupt`&&(e.onProcessorInterrupt?.(),t&&=(t.cancel(),null));let a=e.getIframeHost();if(!a)throw new V(`Speech session is not attached.`);let o=a.speak({text:r.text,characterId:r.characterId,behavior:i});if(r.signal){let t=r.signal;return await new Promise((n,i)=>{let s=()=>{a.speechInterrupt({scope:`active`}).catch(()=>void 0),i(new DOMException(`Speak aborted.`,`AbortError`))};if(t.aborted){s();return}t.addEventListener(`abort`,s,{once:!0}),o.then(e=>{t.removeEventListener(`abort`,s),n(X(e,`completed`))},a=>{if(t.removeEventListener(`abort`,s),Q(a)){n({utteranceId:`utt_interrupted`,characterId:r.characterId??e.getActiveCharacterId(),status:`interrupted`,durationMs:0,transcript:r.text,animation:U(`none`)});return}i(Z(a))})})}try{return X(await o,`completed`)}catch(t){if(Q(t))return{utteranceId:`utt_interrupted`,characterId:r.characterId??e.getActiveCharacterId(),status:`interrupted`,durationMs:0,transcript:r.text,animation:U(`none`)};throw Z(t)}},async play(i){if(e.assertSessionStarted(),n(`play`,`externalSpeechAudio`),Ve(i.audio),i.signal?.aborted)throw new DOMException(`Play aborted.`,`AbortError`);let a=i.queue??`append`;if((a===`replace-active`||a===`replace-all`)&&(e.onProcessorInterrupt?.(),t&&=(t.cancel(),null)),I(i.audio)){let e=i.audio.sampleRate??24e3;return r.createUtterance({format:{encoding:`pcm_s16le`,sampleRate:e,channels:1},track:i.audio.track,characterId:i.characterId,queue:a===`append`?`replace-active`:a,signal:i.signal}).result}let o=e.getIframeHost();if(!o)throw new V(`Speech session is not attached.`);let s=await Qe(i.audio,i.signal);return o.speechPlay({source:s,characterId:i.characterId,transcript:i.transcript,history:i.history??`none`,queue:a,signal:i.signal})},createUtterance(r){e.assertSessionStarted(),n(`createUtterance`,`externalSpeechAudio`);let i=He(r);if(r.track&&r.track.kind!==`audio`)throw new V(`createUtterance track must be an audio MediaStreamTrack.`);let a=r.queue??`replace-active`;if(a!==`replace-active`&&a!==`replace-all`)throw new V(`createUtterance queue must be replace-active or replace-all.`);e.onProcessorInterrupt?.(),t&&=(t.cancel(),null);let o=new $e({id:Y(),characterId:r.characterId??e.getActiveCharacterId(),format:i,queue:a,host:e,...r.transcript===void 0?{}:{transcript:r.transcript},signal:r.signal});return t=o,o.result.finally(()=>{t===o&&(t=null)}),r.track&&(async()=>{try{if(await Ze({track:r.track,utterance:o,sampleRate:i.sampleRate,signal:r.signal}),r.signal?.aborted)return;await o.close({history:`none`})}catch{await o.cancel().catch(()=>void 0)}})(),o},async interrupt(n){e.assertSessionStarted(),e.onProcessorInterrupt?.();let r=e.getIframeHost();if(!r)return[];let i=await r.speechInterrupt(n??{scope:`active`});if(t){let e=i.find(e=>e.utteranceId===t.id);e&&t.adoptExternalResult(e),t=null}return i}};return r}function tt(e){let t=e?.trim();return t===`full`||t===`face`||t===`medium`?t:void 0}function nt(e){return!!(e.showClose===!0||e.returnUrl?.trim()||e.closeButton===!0||e.closeButton&&typeof e.closeButton==`object`&&e.closeButton.visible!==!1)}var $=class e{bootstrap;conversationProcessor;iframeHost=null;attachInFlight=null;endpointAbortController=null;processorAbortController=null;processorChain=Promise.resolve();resolvedSession;launchToken;attachReturnUrl=null;closed=!1;attached=!1;pendingFit=null;pendingStage=null;pendingPipBackground=null;pendingPipShadow=null;pendingTheatre=null;lastInteraction=null;closeHandlers=[];eventRegistry=Ie();readyEnvelope=null;startedEnvelope=null;sessionMintedEnvelope=null;conversationCache=[];speech;constructor(e){this.bootstrap=e,this.conversationProcessor=e.conversationProcessor??null,this.resolvedSession=e.kind===`launch`?e.session??null:null,this.launchToken=e.kind===`launch`?e.launch:null,this.speech=et({getIframeHost:()=>this.iframeHost,assertSessionStarted:()=>this.assertSessionStarted(),getCapabilities:()=>rt(this.resolvedSession),getActiveCharacterId:()=>`character_unknown`,onProcessorInterrupt:()=>{this.processorAbortController?.abort(),this.processorAbortController=null}})}static async startSession(t){if(`launch`in t&&typeof t.launch==`string`){let n=t.launch.trim();if(!n)throw Error(`StartSessionOptions.launch must be a non-empty string.`);return new e({kind:`launch`,launch:n,session:t.session,backdropId:t.backdropId,locationId:t.locationId,avatarId:t.avatarId,embedBaseUrl:t.embedBaseUrl,debug:t.debug,speechOnly:t.speechOnly,ui:t.ui,onStart:t.onStart,onUserTranscript:t.onUserTranscript,conversationProcessor:t.conversationProcessor})}if(`sessionEndpoint`in t)return new e({kind:`sessionEndpoint`,experienceId:t.experienceId,sessionEndpoint:t.sessionEndpoint,locale:t.locale,secondaryLocale:t.secondaryLocale,learningLocale:t.learningLocale,language:t.language,backdropId:t.backdropId,locationId:t.locationId,avatarId:t.avatarId,castSize:t.castSize,embedBaseUrl:t.embedBaseUrl,debug:t.debug,mode:t.mode,speechInputMode:t.speechInputMode,speechOnly:t.speechOnly,attribution:t.attribution,alreadyConverted:t.alreadyConverted,ui:t.ui,onStart:t.onStart,onUserTranscript:t.onUserTranscript,conversationProcessor:t.conversationProcessor});if(`experienceId`in t)return new e({kind:`public`,experienceId:t.experienceId,locale:t.locale,secondaryLocale:t.secondaryLocale,learningLocale:t.learningLocale,language:t.language,backdropId:t.backdropId,locationId:t.locationId,avatarId:t.avatarId,castSize:t.castSize,embedBaseUrl:t.embedBaseUrl,debug:t.debug,mode:t.mode,speechInputMode:t.speechInputMode,speechOnly:t.speechOnly,attribution:t.attribution,alreadyConverted:t.alreadyConverted,ui:t.ui,onStart:t.onStart,onUserTranscript:t.onUserTranscript,conversationProcessor:t.conversationProcessor});throw Error(`Experience.startSession requires experienceId, sessionEndpoint, or launch.`)}getSession(){return this.resolvedSession}getManifest(){return null}on(e,t){let n=Le(this.eventRegistry,e,t);return e===`ready`&&this.readyEnvelope&&queueMicrotask(()=>t(this.readyEnvelope)),e===`started`&&this.startedEnvelope&&queueMicrotask(()=>t(this.startedEnvelope)),e===`sessionMinted`&&this.sessionMintedEnvelope&&queueMicrotask(()=>t(this.sessionMintedEnvelope)),n}async attach(e){if(this.closed)throw Error(`Session has ended.`);if(!e.container)throw Error(`Experience.attach requires a DOM container element.`);return this.attached&&this.iframeHost?this.createPlayerFacade():(this.attachInFlight||=this.attachInternal(e).finally(()=>{this.attachInFlight=null}),this.attachInFlight)}async attachInternal(e){if(this.closed)throw Error(`Session has ended.`);if(this.attached&&this.iframeHost)return this.createPlayerFacade();this.iframeHost&&=(this.iframeHost.destroy(),null),this.attachReturnUrl=e.returnUrl?.trim()||null;let t=this.bootstrap.embedBaseUrl??N(),n=this.bootstrap.debug===!0,r=this.bootstrap.speechOnly===!0,i=je(t,n,r?void 0:Ae(this.bootstrap.backdropId,this.bootstrap.locationId),r?void 0:this.bootstrap.avatarId,e.fit,this.bootstrap.ui,nt(e),this.bootstrap.kind===`launch`?void 0:this.bootstrap.castSize,e.stage,e.pipBackground,e.pipShadow),a=Ne(i),o=null,s=new Promise(e=>{o=e}),c=null,l=new Promise(e=>{c=e}),u=Ee(e=>{this.readyEnvelope||=(this.resolvedSession=e,this.emitWrapped(`ready`,{session:e}))}),d=this.bootstrap.onUserTranscript,f=Te({container:e.container,src:i,playerOrigin:a,transparent:this.bootstrap.ui===`widget`,onClose:e=>{let t=e.returnUrl||!this.attachReturnUrl?e:{...e,returnUrl:this.attachReturnUrl};for(let e of this.closeHandlers)e(t)},onPlayerStatusChange:t=>{e.onPlayerStatusChange?.(t),e.onStateUpdate?.(t),t===`loading`&&o&&(o(),o=null),t===`ready`&&c&&(c(),c=null),t===`ready`&&u.markReady()},onUserTranscript:e=>{this.emitWrapped(`userTranscript`,e),d?.(e),this.queueProcessorTurn(e)},onUserSpeechStarted:e=>{this.emitWrapped(`userSpeechStarted`,e)},onUserSpeechEnded:e=>{this.emitWrapped(`userSpeechEnded`,e)},onCharacterSpeechStarted:e=>{this.emitWrapped(`characterSpeechStarted`,e)},onCharacterSpeechEnded:e=>{this.emitWrapped(`characterSpeechEnded`,e)},onCharacterFocusChanged:e=>{this.emitWrapped(`characterFocusChanged`,e)},onListeningState:e=>{this.emitWrapped(`listeningState`,e)},onActivityChange:e=>{this.emitWrapped(`activityChange`,e)},onInteractionChange:e=>{this.lastInteraction=e,this.emitWrapped(`interactionChange`,e)},onFeedback:e=>{this.emitWrapped(`feedback`,e)},onFeedbackFailed:e=>{this.emitWrapped(`feedbackFailed`,e)},onMessage:e=>{this.emitWrapped(`message`,e)},onStarted:e=>{this.startedEnvelope||(this.startedEnvelope=this.emitWrapped(`started`,e),this.bootstrap.onStart?.(e))},onConversationUpdate:e=>{this.conversationCache=e,this.emitWrapped(`conversationUpdate`,e)},onWidgetReady:()=>e.onWidgetReady?.(),onWidgetExpand:()=>e.onWidgetExpand?.(),onWidgetCollapse:()=>e.onWidgetCollapse?.(),onWidgetAudioSettings:t=>e.onWidgetAudioSettings?.(t),onWidgetDragStart:t=>e.onWidgetDragStart?.(t),onWidgetDragMove:t=>e.onWidgetDragMove?.(t),onWidgetDragEnd:t=>e.onWidgetDragEnd?.(t),onTheatreChange:t=>e.onTheatreChange?.(t)});this.iframeHost=f;let p=this.resolveMintInteraction(),m=this.bootstrap.kind===`sessionEndpoint`?(this.endpointAbortController=new AbortController,se(this.bootstrap.sessionEndpoint,{experienceId:this.bootstrap.experienceId,locale:this.bootstrap.locale,secondaryLocale:this.bootstrap.secondaryLocale,learningLocale:this.bootstrap.learningLocale,language:this.bootstrap.language,mode:p.mode,speechInputMode:p.speechInputMode,speechOnly:this.bootstrap.speechOnly,attribution:this.bootstrap.attribution,alreadyConverted:this.bootstrap.alreadyConverted,signal:this.endpointAbortController.signal})):this.bootstrap.kind===`public`?oe(this.bootstrap.experienceId,{locale:this.bootstrap.locale,secondaryLocale:this.bootstrap.secondaryLocale,learningLocale:this.bootstrap.learningLocale,language:this.bootstrap.language,mode:p.mode,speechInputMode:p.speechInputMode,speechOnly:this.bootstrap.speechOnly,attribution:this.bootstrap.attribution,alreadyConverted:this.bootstrap.alreadyConverted}):Promise.resolve(this.bootstrap.session?{session:this.bootstrap.session,launch:this.bootstrap.launch}:null),h;try{[,h]=await Promise.all([f.waitForLoad(),m])}catch(e){try{f.reportSdkError({errorCode:`sdk.session.attach_failed`,severity:`error`,operation:`attach`,message:e instanceof Error?e.message:String(e),stack:e instanceof Error?e.stack:void 0,release:M})}catch{}throw f.destroy(),this.iframeHost===f&&(this.iframeHost=null),e}finally{this.endpointAbortController=null}f.postParentHello();let g=h?.launch??(this.bootstrap.kind===`launch`?this.bootstrap.launch:null),_=h?.session??(this.bootstrap.kind===`launch`?this.bootstrap.session:void 0);if(!g)throw f.destroy(),this.iframeHost===f&&(this.iframeHost=null),Error(`Session Launch response did not include a launch token.`);this.launchToken=g;let v=_??(this.bootstrap.kind===`launch`?this.bootstrap.session:void 0);return v&&!this.sessionMintedEnvelope&&(this.resolvedSession=v,this.sessionMintedEnvelope=this.emitWrapped(`sessionMinted`,{session:v})),_?(this.resolvedSession=_,this.bootstrap.kind===`launch`&&w(_),f.postLaunch(g,_,{startButton:e.startButton,theme:e.theme,showFeedback:e.showFeedback,interaction:e.interaction,...e.theatreButton?{theatreButton:!0}:{},...e.theatre===void 0?{}:{theatre:e.theatre}}),u.setValue(_)):f.postLaunch(g,void 0,{startButton:e.startButton,theme:e.theme,showFeedback:e.showFeedback,interaction:e.interaction,...e.theatreButton?{theatreButton:!0}:{},...e.theatre===void 0?{}:{theatre:e.theatre}}),await Promise.race([s,new Promise((e,t)=>{setTimeout(()=>t(Error(`Timed out waiting for player loading UI.`)),12e4)})]).catch(e=>{try{f.reportSdkError({errorCode:`sdk.session.attach_failed`,severity:`error`,operation:`attach`,message:e instanceof Error?e.message:String(e),stack:e instanceof Error?e.stack:void 0,release:M})}catch{}throw e}),await Promise.race([l,new Promise((e,t)=>{setTimeout(()=>t(Error(`Timed out waiting for player ready state.`)),12e4)})]).catch(e=>{try{f.reportSdkError({errorCode:`sdk.session.attach_failed`,severity:`error`,operation:`attach`,message:e instanceof Error?e.message:String(e),stack:e instanceof Error?e.stack:void 0,release:M})}catch{}throw e}),this.attached=!0,this.pendingFit&&await f.setFit(this.pendingFit),this.pendingStage&&await f.setStage(this.pendingStage),this.pendingPipBackground&&await f.setPipBackground(this.pendingPipBackground),this.pendingPipShadow!==null&&await f.setPipShadow(this.pendingPipShadow),this.pendingTheatre!==null&&f.postSetTheatre(this.pendingTheatre),this.createPlayerFacade()}async startListening(){this.assertSessionStarted(),await this.iframeHost.startListening()}async stopListening(){return this.assertSessionStarted(),this.iframeHost.stopListening()}async listenOnce(e){return this.assertSessionStarted(),this.iframeHost.listenOnce({timeoutMs:e?.timeoutMs})}getConversation(){return this.conversationCache}setTheatre(e){if(this.closed)throw Error(`Session has ended.`);this.pendingTheatre=e,this.iframeHost?.postSetTheatre(e)}setWidgetChrome(e){this.iframeHost?.postWidgetSetChrome(e)}toggleAudioSettings(){this.iframeHost?.postWidgetToggleAudioSettings()}async focusCharacter(e){this.assertSessionStarted(),await this.iframeHost.focusCharacter(e)}async setFit(e){let t=tt(e);if(!t)throw Error(`setFit requires "full", "medium", or "face".`);if(this.closed)throw Error(`Session has ended.`);this.pendingFit=t,!(!this.attached||!this.iframeHost)&&await this.iframeHost.setFit(t)}async setStage(e){if(e!==`fill`&&e!==`pip`)throw Error(`setStage requires "fill" or "pip".`);if(this.closed)throw Error(`Session has ended.`);this.pendingStage=e,!(!this.attached||!this.iframeHost)&&await this.iframeHost.setStage(e)}async setPipBackground(e){if(e!==`none`&&e!==`set`)throw Error(`setPipBackground requires "none" or "set".`);if(this.closed)throw Error(`Session has ended.`);this.pendingPipBackground=e,!(!this.attached||!this.iframeHost)&&await this.iframeHost.setPipBackground(e)}async setPipShadow(e){if(this.closed)throw Error(`Session has ended.`);this.pendingPipShadow=e,!(!this.attached||!this.iframeHost)&&await this.iframeHost.setPipShadow(e)}async setInteraction(e){if(this.closed)throw Error(`Session has ended.`);if(!this.iframeHost)throw Error(`setInteraction() requires attach() first.`);let t=await this.iframeHost.setInteraction(e);return this.lastInteraction=t,t}async getInteraction(){if(this.closed)throw Error(`Session has ended.`);if(!this.iframeHost)throw Error(`getInteraction() requires attach() first.`);let e=await this.iframeHost.getInteraction();return this.lastInteraction=e,e}async conversion(e){if(this.closed)throw Error(`Session has ended.`);if(!this.iframeHost)throw Error(`conversion() requires attach() first.`);await this.iframeHost.conversion(e)}async engage(){if(this.closed)throw Error(`Session has ended.`);if(!this.iframeHost)throw Error(`engage() requires attach() first.`);await this.iframeHost.engage()}getLastTurn(){if(this.conversationCache.length===0)return[];let e=this.conversationCache[this.conversationCache.length-1].turnId;return this.conversationCache.filter(t=>t.turnId===e)}async end(){this.close()}destroy(){this.closed||(this.closed=!0,this.processorAbortController?.abort(),this.processorAbortController=null,this.endpointAbortController?.abort(),this.endpointAbortController=null,this.attachInFlight=null,this.iframeHost?.destroy(),this.iframeHost=null,ze(this.eventRegistry),this.readyEnvelope=null,this.startedEnvelope=null,this.closeHandlers.length=0,this.lastInteraction=null,this.attached=!1)}resolveMintInteraction(){return this.bootstrap.kind===`launch`?{}:{mode:this.bootstrap.mode,speechInputMode:this.bootstrap.speechInputMode}}getSessionId(){return this.resolvedSession?.id??``}emitWrapped(e,t){let n=Fe(e,this.getSessionId(),t);return Re(this.eventRegistry,e,n),n}queueProcessorTurn(e){if(!e.isFinal||!e.text.trim()||!this.conversationProcessor)return;let t=this.conversationProcessor;this.processorAbortController?.abort(),this.processorAbortController=new AbortController;let n=this.processorAbortController.signal;this.processorChain=this.processorChain.then(async()=>{if(!n.aborted)try{let r=await ue(t,{utteranceId:e.utteranceId,text:e.text,conversation:this.conversationCache,signal:n});if(n.aborted)return;if(r.kind===`complete`){let e=r.speech;await this.speech.speak({text:e.text,...e.characterId?{characterId:e.characterId}:{},queue:e.behavior===`interrupt`?`replace-active`:`append`});return}await this.iframeHost.speakProcessorStream(r.stream,{signal:n})}catch(t){if(n.aborted)return;let r=t instanceof Error?t.message:String(t);this.emitWrapped(`conversationProcessorError`,{utteranceId:e.utteranceId,message:r})}})}assertAttached(){if(!this.attached||!this.iframeHost)throw Error(`Call Experience.attach() before using speech APIs.`)}assertSessionStarted(){if(this.assertAttached(),!this.startedEnvelope)throw Error(`Session has not started. Wait for the player start button and the started event before using speak() or listening APIs.`)}close(){this.closed||(this.closed=!0,this.endpointAbortController?.abort(),this.endpointAbortController=null,this.attachInFlight=null,this.iframeHost?.destroy(),this.iframeHost=null,this.attached=!1)}createPlayerFacade(){return{close:()=>{this.close()},destroy:()=>{this.destroy()},on:(e,t)=>{e===`close`&&this.closeHandlers.push(t)}}}};function rt(e){return e?{textSpeech:e.capabilities.speech.output,externalSpeechAudio:e.capabilities.speech.externalAudio}:{textSpeech:!0,externalSpeechAudio:!0}}return window.Liforma={Experience:$,sdkVersion:`v2`,features:{speakApi:!0,speechAudioApi:!0}},e.Experience=$,e.LiformaError=o,e.SPEECH_LIMITS=R,e.SpeechBufferTimeoutError=H,e.SpeechRuntimeError=V,e.SpeechUtteranceClosedError=B,e.UnsupportedSpeechOperationError=z,e.liformaErrorFromResponse=c,e.warnLocaleVoiceFallbacks=w,e})({});
|
|
15
15
|
//# sourceMappingURL=client.js.map
|