@liforma/client 0.4.14 → 0.4.16
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 +12 -0
- package/dist/next/index.js +625 -602
- package/dist/next/index.js.map +1 -1
- package/dist/next/react/ExperienceThumbnail.d.ts.map +1 -1
- package/dist/next/thumbnail/avatarPlate.d.ts +11 -0
- package/dist/next/thumbnail/avatarPlate.d.ts.map +1 -0
- package/dist/next/thumbnail/avatarPlate.test.d.ts +2 -0
- package/dist/next/thumbnail/avatarPlate.test.d.ts.map +1 -0
- package/dist/next/thumbnail/expandAssetUrl.d.ts +3 -2
- package/dist/next/thumbnail/expandAssetUrl.d.ts.map +1 -1
- package/dist/next/thumbnail/index.d.ts +2 -0
- package/dist/next/thumbnail/index.d.ts.map +1 -1
- package/dist/next/thumbnail/toGalleryThumbUrl.d.ts +7 -3
- package/dist/next/thumbnail/toGalleryThumbUrl.d.ts.map +1 -1
- package/dist/next/thumbnail.js +211 -200
- package/dist/next/thumbnail.js.map +1 -1
- package/dist/next/v2/embed/protocol.d.ts +7 -7
- package/dist/next/v2/embed/protocol.d.ts.map +1 -1
- package/dist/next/v2/experience.d.ts +8 -5
- package/dist/next/v2/experience.d.ts.map +1 -1
- package/dist/next/v2/types/sessionLaunch.d.ts +6 -0
- package/dist/next/v2/types/sessionLaunch.d.ts.map +1 -1
- package/dist/npm/index.js +506 -490
- package/dist/npm/index.js.map +1 -1
- package/dist/npm/thumbnail/avatarPlate.d.ts +11 -0
- package/dist/npm/thumbnail/avatarPlate.d.ts.map +1 -0
- package/dist/npm/thumbnail/expandAssetUrl.d.ts +3 -2
- package/dist/npm/thumbnail/expandAssetUrl.d.ts.map +1 -1
- package/dist/npm/thumbnail/index.d.ts +2 -0
- package/dist/npm/thumbnail/index.d.ts.map +1 -1
- package/dist/npm/thumbnail/index.js +123 -110
- package/dist/npm/thumbnail/index.js.map +1 -1
- package/dist/npm/thumbnail/toGalleryThumbUrl.d.ts +7 -3
- package/dist/npm/thumbnail/toGalleryThumbUrl.d.ts.map +1 -1
- package/dist/npm/v2/embed/protocol.d.ts +7 -7
- package/dist/npm/v2/embed/protocol.d.ts.map +1 -1
- package/dist/npm/v2/experience.d.ts +8 -5
- package/dist/npm/v2/experience.d.ts.map +1 -1
- package/dist/npm/v2/index.d.ts +1 -1
- package/dist/npm/v2/index.d.ts.map +1 -1
- package/dist/npm/v2/liforma-experience-thumbnail.d.ts.map +1 -1
- package/dist/npm/v2/npm.d.ts +1 -1
- package/dist/npm/v2/npm.d.ts.map +1 -1
- package/dist/npm/v2/types/index.d.ts +1 -1
- package/dist/npm/v2/types/index.d.ts.map +1 -1
- package/dist/npm/v2/types/sessionLaunch.d.ts +6 -0
- package/dist/npm/v2/types/sessionLaunch.d.ts.map +1 -1
- package/dist/react/component/experienceComponentRuntime.d.ts +3 -1
- package/dist/react/component/experienceComponentRuntime.d.ts.map +1 -1
- package/dist/react/component/experienceComponentTypes.d.ts +6 -4
- package/dist/react/component/experienceComponentTypes.d.ts.map +1 -1
- package/dist/react/index.js +733 -704
- package/dist/react/index.js.map +1 -1
- package/dist/react/react/Experience.d.ts.map +1 -1
- package/dist/react/react/ExperienceThumbnail.d.ts.map +1 -1
- package/dist/react/thumbnail/avatarPlate.d.ts +11 -0
- package/dist/react/thumbnail/avatarPlate.d.ts.map +1 -0
- package/dist/react/thumbnail/avatarPlate.test.d.ts +2 -0
- package/dist/react/thumbnail/avatarPlate.test.d.ts.map +1 -0
- package/dist/react/thumbnail/expandAssetUrl.d.ts +3 -2
- package/dist/react/thumbnail/expandAssetUrl.d.ts.map +1 -1
- package/dist/react/thumbnail/index.d.ts +2 -0
- package/dist/react/thumbnail/index.d.ts.map +1 -1
- package/dist/react/thumbnail/toGalleryThumbUrl.d.ts +7 -3
- package/dist/react/thumbnail/toGalleryThumbUrl.d.ts.map +1 -1
- package/dist/react/thumbnail.js +211 -200
- package/dist/react/thumbnail.js.map +1 -1
- package/dist/react/v2/embed/protocol.d.ts +7 -7
- package/dist/react/v2/embed/protocol.d.ts.map +1 -1
- package/dist/react/v2/experience.d.ts +8 -5
- package/dist/react/v2/experience.d.ts.map +1 -1
- package/dist/react/v2/types/sessionLaunch.d.ts +6 -0
- package/dist/react/v2/types/sessionLaunch.d.ts.map +1 -1
- package/dist/sdk/v2/client.js +3 -3
- package/dist/sdk/v2/client.js.map +1 -1
- package/dist/sdk/v2/thumbnail.js +2 -2
- package/dist/sdk/v2/thumbnail.js.map +1 -1
- package/dist/svelte/Experience.svelte +4 -0
- package/dist/svelte/ExperienceThumbnail.svelte +3 -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 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`),n.setAttribute(`fetchpriority`,`high`),`fetchPriority`in n&&(n.fetchPriority=`high`);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.14`,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`,"publish:location-400x225":`node scripts/build-location-400x225.mjs`,"test:location-400x225":`node scripts/test-location-400x225.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/avif":`^1.3.0`,"@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,d,f){let p=(e??N()).replace(/\/$/,``),m=p.endsWith(`/embed`)?p:`${p}/embed`,h=new URL(m),g=n?.trim();g&&h.searchParams.set(`backdropId`,g);let _=r?.trim();_&&h.searchParams.set(`avatarId`,_);let v=d?.trim();v&&h.searchParams.set(`previewBg`,v);let y=f?.trim();return y&&h.searchParams.set(`previewFg`,y),(i===`face`||i===`medium`)&&h.searchParams.set(`fit`,i),c===`pip`&&h.searchParams.set(`stage`,`pip`),l===`set`&&h.searchParams.set(`pipBackground`,`set`),u===!1&&h.searchParams.set(`pipShadow`,`0`),a===`widget`&&h.searchParams.set(`ui`,`widget`),o&&h.searchParams.set(`close`,`1`),t&&h.searchParams.set(`debug`,`true`),(s===2||s===3||s===4)&&h.searchParams.set(`cast`,String(s)),Me(h.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=`
|
|
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,t){return t===void 0?{}:{[e]:t}}function v(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function y(e){return typeof e==`boolean`}function b(e){if(!v(e))return null;let t=e.speech,n=e.conversation,r=e.avatar,i=e.tools;return!v(t)||!v(n)||!v(r)||!v(i)||!y(t.input)||!y(t.output)||!y(t.externalAudio)||!y(n.managed)||!y(r.enabled)||!y(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 x(e){return!v(e)||!y(e.avatar)||!y(e.speechInput)||!y(e.speechOutput)||!y(e.tools)||!y(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 S(e){return b(e)??x(e)}function C(e){if(!v(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=S(e.capabilities),l=ee(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 ee(e){if(!Array.isArray(e)||e.length===0)return;let t=[];for(let n of e){if(!v(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(!v(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=C(e.session);return w(n),{session:n,launch:t}}function te(){try{if(typeof globalThis.location?.origin==`string`&&globalThis.location.origin)return globalThis.location.origin}catch{}}function ne(e){return e?e.trim().toUpperCase().replace(/-/g,`_`):``}function re(e,t){let n=te(),r=ne(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 ie(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 ae(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 oe(e,t){let n={experienceId:e},r=ie(t);r&&(n.locale=r);let i=ae(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 se(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(oe(e,t))});if(!i.ok){let t=await i.text();throw re(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 ce(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 E(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 E(n)?{kind:`stream`,stream:n}:{kind:`complete`,speech:le(n)}}var de=`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||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(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 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 k(e,t){return t===void 0?{}:{[e]: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?.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}:{},...k(`settingsButton`,n?.settingsButton),...k(`theatreButton`,n?.theatreButton),...k(`fullscreenButton`,n?.fullscreenButton),...c===void 0?{}:{theatre:c}}}}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 A(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 j(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 Ce(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 we(e){return e}function M(){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 Te=3e4;function Ee(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`),n.setAttribute(`fetchpriority`,`high`),`fetchPriority`in n&&(n.fetchPriority=`high`);let r=!1,i=!1,a=null,o=null,s=r=>{i!==r&&(i=r,r?(a=A(n),o=document.body.style.overflow,document.body.append(n),j(n),document.body.style.overflow=`hidden`):(t.append(n),Ce(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&&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){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(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=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?.(we(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(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:M();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:M(),text:e.text,...e.characterId?{characterId:e.characterId}:{},...e.behavior?{behavior:e.behavior}:{}}})},startListening(){return C({type:`startListening`,schemaVersion:2,payload:{correlationId:M()}})},stopListening(){return C({type:`stopListening`,schemaVersion:2,payload:{correlationId:M()}})},listenOnce(e){return C({type:`listenOnce`,schemaVersion:2,payload:{correlationId:M(),...e?.timeoutMs===void 0?{}:{timeoutMs:e.timeoutMs}}})},async speakProcessorStream(e,t){let n=M(),r=M(),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=M(),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:M(),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:M(),utteranceId:e.utteranceId,audio:e.audio,byteLength:e.byteLength}},Te,[e.audio])},speechUtteranceSetTranscript(e){return C({type:`speechUtteranceSetTranscript`,schemaVersion:2,payload:{correlationId:M(),utteranceId:e.utteranceId,transcript:e.transcript}})},speechUtteranceClose(e){return C({type:`speechUtteranceClose`,schemaVersion:2,payload:{correlationId:M(),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:M(),utteranceId:e.utteranceId}})},speechInterrupt(e){return C({type:`speechInterrupt`,schemaVersion:2,payload:{correlationId:M(),...e}})},getConversation(){return C({type:`getConversation`,schemaVersion:2,payload:{correlationId:M()}})},focusCharacter(e){return C({type:`focusCharacter`,schemaVersion:2,payload:{correlationId:M(),characterId:e}})},setFit(e){return C({type:`setFit`,schemaVersion:2,payload:{correlationId:M(),fit:e}})},setStage(e){return C({type:`setStage`,schemaVersion:2,payload:{correlationId:M(),stage:e}})},setPipBackground(e){return C({type:`setPipBackground`,schemaVersion:2,payload:{correlationId:M(),pipBackground:e}})},setPipShadow(e){return C({type:`setPipShadow`,schemaVersion:2,payload:{correlationId:M(),pipShadow:e}})},setInteraction(e){return C({type:`setInteraction`,schemaVersion:2,payload:{correlationId:M(),interaction:e}})},getInteraction(){return C({type:`getInteraction`,schemaVersion:2,payload:{correlationId:M()}})},conversion(e){return C({type:`conversion`,schemaVersion:2,payload:{correlationId:M(),key:e}})},engage(){return C({type:`engage`,schemaVersion:2,payload:{correlationId:M()}})},reportSdkError(e){return C({type:`reportSdkError`,schemaVersion:2,payload:{correlationId:M(),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 De(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 N=`sdk@${{name:`@liforma/client`,version:`0.4.16`,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`,"publish:location-400x225":`node scripts/build-location-400x225.mjs`,"test:location-400x225":`node scripts/test-location-400x225.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/avif":`^1.3.0`,"@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}`,Oe=`https://player.liforma.ai/embed`,ke=`http://localhost:3002/embed`;function Ae(){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 P(){let e=Ae();return e?e.endsWith(`/embed`)?e:`${e}/embed`:t()?ke:Oe}function je(e,t){return e?.trim()||t?.trim()||void 0}function Me(e,t,n,r,i,a,o,s,c,l,u,d,f){let p=(e??P()).replace(/\/$/,``),m=p.endsWith(`/embed`)?p:`${p}/embed`,h=new URL(m),g=n?.trim();g&&h.searchParams.set(`backdropId`,g);let _=r?.trim();_&&h.searchParams.set(`avatarId`,_);let v=d?.trim();v&&h.searchParams.set(`previewBg`,v);let y=f?.trim();return y&&h.searchParams.set(`previewFg`,y),(i===`face`||i===`medium`)&&h.searchParams.set(`fit`,i),c===`pip`&&h.searchParams.set(`stage`,`pip`),l===`set`&&h.searchParams.set(`pipBackground`,`set`),u===!1&&h.searchParams.set(`pipShadow`,`0`),a===`widget`&&h.searchParams.set(`ui`,`widget`),o&&h.searchParams.set(`close`,`1`),t&&h.searchParams.set(`debug`,`true`),(s===2||s===3||s===4)&&h.searchParams.set(`cast`,String(s)),Ne(h.toString())}function Ne(e){if(typeof location>`u`)return e;let t=new URL(e);return t.searchParams.set(`parentOrigin`,location.origin),t.toString()}function Pe(e){return new URL(e).origin}function Fe(){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 Ie(e,t,n){return{id:Fe(),type:e,sessionId:t,timestamp:new Date().toISOString(),data:n}}function Le(){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 Re(e,t,n){return e[t].add(n),()=>e[t].delete(n)}function ze(e,t,n){for(let r of e[t])r(n)}function Be(e){for(let t of Object.keys(e))e[t].clear()}function F(e){return`data`in e&&`format`in e&&e.format!=null&&!(`track`in e)}function I(e){return`url`in e&&typeof e.url==`string`}function L(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 R(e){return!F(e)&&!I(e)&&!L(e)&&`encoding`in e&&typeof e.encoding==`string`}var Ve=[8e3,16e3,22050,24e3,44100,48e3],z={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},B=class extends Error{operation;requiredCapability;name=`UnsupportedSpeechOperationError`;constructor(e,t){super(`Speech operation "${e}" requires capability "${t}".`),this.operation=e,this.requiredCapability=t}},V=class extends Error{name=`SpeechUtteranceClosedError`;constructor(e=`Cannot write to a closed or cancelled speech utterance.`){super(e)}},H=class extends Error{name=`SpeechRuntimeError`;constructor(e,t){super(e,t)}},U=class extends Error{name=`SpeechBufferTimeoutError`;constructor(e=`Timed out waiting for speech buffer capacity.`){super(e)}};function W(e=`none`){return{mode:e,trackedDurationMs:0,fallbackDurationMs:0}}function G(e){return Ve.includes(e)}function K(e){if(e.encoding!==`pcm_s16le`)throw new H(`Unsupported audio encoding: ${e.encoding}`);if(e.channels!==1)throw new H(`Unsupported channel count: ${e.channels}`);if(!G(e.sampleRate))throw new H(`Unsupported sample rate: ${e.sampleRate}`)}function He(e){if(F(e)){K(e.format);return}if(I(e)){if(!e.url.trim())throw new H(`Audio URL must be non-empty.`);if(e.sampleRate!==void 0&&!G(e.sampleRate))throw new H(`Unsupported sample rate: ${e.sampleRate}`);return}if(L(e)){if(e.track.kind!==`audio`)throw new H(`speech.play track must be an audio MediaStreamTrack.`);if(e.sampleRate!==void 0&&!G(e.sampleRate))throw new H(`Unsupported sample rate: ${e.sampleRate}`);return}if(R(e)){let t=e.encoding.trim().toLowerCase();if(!t)throw new H(`Encoded audio MIME type is required.`);if(t===`pcm_s16le`)throw new H(`Use format: { encoding: "pcm_s16le", … } for raw PCM.`);if(e.sampleRate!==void 0&&!G(e.sampleRate))throw new H(`Unsupported sample rate: ${e.sampleRate}`);return}throw new H(`Unsupported speech.play audio shape.`)}function Ue(e){if(e.format)return K(e.format),e.format;if(e.track){let t={encoding:`pcm_s16le`,sampleRate:e.sampleRate??24e3,channels:1};return K(t),t}throw new H(`createUtterance requires format or track.`)}function q(e){return e instanceof Uint8Array?e:new Uint8Array(e)}function We(e){return e===`replace-active`||e===`replace-all`?`interrupt`:`enqueue`}function Ge(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 Ke(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 qe(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(Ke(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 J=`liforma-pcm-capture`,Je=`
|
|
2
2
|
class LiformaPcmCaptureProcessor extends AudioWorkletProcessor {
|
|
3
3
|
process(inputs) {
|
|
4
4
|
const ch = inputs[0] && inputs[0][0];
|
|
@@ -10,6 +10,6 @@ class LiformaPcmCaptureProcessor extends AudioWorkletProcessor {
|
|
|
10
10
|
return true;
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
-
registerProcessor('${
|
|
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,previewBackground:t.previewBackground,previewForeground:t.previewForeground,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,previewBackground:t.previewBackground,previewForeground:t.previewForeground,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,previewBackground:t.previewBackground,previewForeground:t.previewForeground,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,r?void 0:this.bootstrap.previewBackground,r?void 0:this.bootstrap.previewForeground),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})({});
|
|
13
|
+
registerProcessor('${J}', LiformaPcmCaptureProcessor);
|
|
14
|
+
`,Y=null;function Ye(){return Y||=URL.createObjectURL(new Blob([Je],{type:`application/javascript`})),Y}function Xe(){return window.AudioContext||window.webkitAudioContext||null}async function Ze(e){let{mediaStream:t,targetSampleRate:n,onPcm:r,shouldSend:i,onLog:a}=e,o=Xe();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=qe(u,n),f=!1,p=!1,m=e=>{if(f||i&&!i())return;let t=d.push(e);t.length!==0&&r(Ge(t))},h=()=>void 0;return await(async()=>{if(typeof s.audioWorklet?.addModule!=`function`)return!1;try{await s.audioWorklet.addModule(Ye());let e=new AudioWorkletNode(s,J,{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 Qe(e){let{track:t,utterance:n,sampleRate:r,signal:i}=e;if(typeof MediaStreamTrack>`u`||!(t instanceof MediaStreamTrack))throw new H(`MediaStreamTrack is not available in this environment.`);if(t.kind!==`audio`)throw new H(`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 Ze({mediaStream:a,targetSampleRate:r,shouldSend:()=>!s&&!i?.aborted,onPcm:e=>{if(s||i?.aborted)return;let t=q(e);o=o.then(async()=>{if(s||i?.aborted)return;let e=0;for(;e<t.byteLength;){let r=Math.min(e+z.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 H(`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 $e(e,t){if(L(e))throw new H(`MediaStreamTrack play is handled on the host before embed.`);if(F(e)){let t=q(e.data);if(t.byteLength&1)throw new H(`PCM byte length must be even.`);return{kind:`pcm`,data:t.slice().buffer,format:e.format}}if(I(e))return{kind:`url`,url:e.url.trim(),...e.sampleRate===void 0?{}:{sampleRate:e.sampleRate}};if(!R(e))throw new H(`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=q(e.data);return{kind:`encoded`,data:n.slice().buffer,encoding:e.encoding.trim(),...e.sampleRate===void 0?{}:{sampleRate:e.sampleRate}}}function et(){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 H(String(e))}function Q(e){return e instanceof DOMException&&e.name===`AbortError`||e instanceof Error&&e.name===`AbortError`}var tt=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 V;let n=q(e);if(n.byteLength&1)throw new H(`PCM chunk byte length must be even (complete s16 samples).`);if(n.byteLength>z.MAX_CHUNK_BYTES)throw new H(`PCM chunk exceeds MAX_CHUNK_BYTES (${z.MAX_CHUNK_BYTES}).`);if(n.byteLength===0)return;let r=t?.timeoutMs??z.DEFAULT_WRITE_TIMEOUT_MS;await this.acquireWriteSlot(r);let i=n.byteLength/2/this.sampleRate*1e3;if(this.bufferedMs+i>z.MAX_UTTERANCE_DURATION_MS)throw this.releaseWriteSlot(),new H(`Utterance exceeds MAX_UTTERANCE_DURATION_MS.`);let a=async()=>{if(this.closed||this.settled)throw new V;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 U),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 V;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:W(`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 H(`Speech session is not attached.`);return e}resolve(e){this.settled||(this.settled=!0,this.settleResolve(Object.freeze(e)),this.flushWriteWaiters(new V))}fail(e){this.settled||(this.settled=!0,this.settleReject(e),this.flushWriteWaiters(e))}async acquireWriteSlot(e){if(this.pendingWriteCount<z.MAX_PENDING_WRITES){this.pendingWriteCount+=1;return}await new Promise((t,n)=>{let r=setTimeout(()=>{n(new U)},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 nt(e){let t=null,n=(t,n)=>{if(!e.getCapabilities()[n])throw new B(t,n)},r={async speak(r){if(e.assertSessionStarted(),n(`speak`,`textSpeech`),r.signal?.aborted)throw new DOMException(`Speak aborted.`,`AbortError`);let i=We(r.queue??`append`);i===`interrupt`&&(e.onProcessorInterrupt?.(),t&&=(t.cancel(),null));let a=e.getIframeHost();if(!a)throw new H(`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:W(`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:W(`none`)};throw Z(t)}},async play(i){if(e.assertSessionStarted(),n(`play`,`externalSpeechAudio`),He(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)),L(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 H(`Speech session is not attached.`);let s=await $e(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=Ue(r);if(r.track&&r.track.kind!==`audio`)throw new H(`createUtterance track must be an audio MediaStreamTrack.`);let a=r.queue??`replace-active`;if(a!==`replace-active`&&a!==`replace-all`)throw new H(`createUtterance queue must be replace-active or replace-all.`);e.onProcessorInterrupt?.(),t&&=(t.cancel(),null);let o=new tt({id:et(),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 Qe({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 rt(e){let t=e?.trim();return t===`full`||t===`face`||t===`medium`?t:void 0}function it(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=Le();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=nt({getIframeHost:()=>this.iframeHost,assertSessionStarted:()=>this.assertSessionStarted(),getCapabilities:()=>at(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,previewBackground:t.previewBackground,previewForeground:t.previewForeground,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,previewBackground:t.previewBackground,previewForeground:t.previewForeground,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,previewBackground:t.previewBackground,previewForeground:t.previewForeground,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=Re(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??P(),n=this.bootstrap.debug===!0,r=this.bootstrap.speechOnly===!0,i=Me(t,n,r?void 0:je(this.bootstrap.backdropId,this.bootstrap.locationId),r?void 0:this.bootstrap.avatarId,e.fit,this.bootstrap.ui,it(e),this.bootstrap.kind===`launch`?void 0:this.bootstrap.castSize,e.stage,e.pipBackground,e.pipShadow,r?void 0:this.bootstrap.previewBackground,r?void 0:this.bootstrap.previewForeground),a=Pe(i),o=null,s=new Promise(e=>{o=e}),c=null,l=new Promise(e=>{c=e}),u=De(e=>{this.readyEnvelope||=(this.resolvedSession=e,this.emitWrapped(`ready`,{session:e}))}),d=this.bootstrap.onUserTranscript,f=Ee({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,ce(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`?se(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:N})}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),v=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 y=v??(this.bootstrap.kind===`launch`?this.bootstrap.session:void 0);return y&&!this.sessionMintedEnvelope&&(this.resolvedSession=y,this.sessionMintedEnvelope=this.emitWrapped(`sessionMinted`,{session:y})),v?(this.resolvedSession=v,this.bootstrap.kind===`launch`&&w(v),f.postLaunch(g,v,{startButton:e.startButton,theme:e.theme,showFeedback:e.showFeedback,interaction:e.interaction,..._(`settingsButton`,e.settingsButton),..._(`theatreButton`,e.theatreButton),..._(`fullscreenButton`,e.fullscreenButton),...e.theatre===void 0?{}:{theatre:e.theatre}}),u.setValue(v)):f.postLaunch(g,void 0,{startButton:e.startButton,theme:e.theme,showFeedback:e.showFeedback,interaction:e.interaction,..._(`settingsButton`,e.settingsButton),..._(`theatreButton`,e.theatreButton),..._(`fullscreenButton`,e.fullscreenButton),...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:N})}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:N})}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=rt(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,Be(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=Ie(e,this.getSessionId(),t);return ze(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 at(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=z,e.SpeechBufferTimeoutError=U,e.SpeechRuntimeError=H,e.SpeechUtteranceClosedError=V,e.UnsupportedSpeechOperationError=B,e.liformaErrorFromResponse=c,e.warnLocaleVoiceFallbacks=w,e})({});
|
|
15
15
|
//# sourceMappingURL=client.js.map
|