@1interface/voice-shell 0.7.1 → 0.7.3

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/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),r=require("react-redux"),n=require("@1interface/voice-core"),s=require("@1interface/shared-core");var o="undefined"!=typeof document?document.currentScript:null;const c=({value:t,children:r})=>e.jsx(n.AudioPlatformContext.Provider,{value:t??n.browserAudioPlatform,children:r}),u="ws",i=e=>e===s.VOICE_TRANSPORTS.LEGACY_WS||e===s.VOICE_TRANSPORTS.PIPECAT_WS?u:"webrtc",a=e=>import(e),l=function(e,t,r=a){const n=new Map,s=new Map,o=new Map;return{load:c=>{const u=i(c);let a=n.get(u);if(!a){const c=e[u];if(!c)return Promise.reject(new Error(`No voice-shell engines/<Name>Engine.tsx for the "${u}" engine.`));const i=o.get(u)??0,l=i?function(e,t,r){const n=/import\(\s*["'`]([^"'`]+)["'`]/.exec(String(e))?.[1];if(!n)return null;const s=new URL(n,r);return s.searchParams.set("retry",String(t)),s.href}(c,i,t):null;a=(l?r(l):c()).then(e=>(o.delete(u),s.set(u,e.default),e.default)),a.catch(()=>{n.delete(u),o.set(u,i+1)}),n.set(u,a)}return a},loaded:e=>s.get(i(e))}}(Object.fromEntries(Object.entries(Object.assign({"./engines/WebRtcEngine.tsx":()=>Promise.resolve().then(()=>require("./WebRtcEngine-BKQ3eFVU.cjs")),"./engines/WsEngine.tsx":()=>Promise.resolve().then(()=>require("./WsEngine-ByKZ5xLh.cjs"))})).map(([e,t])=>[e.slice(10,-10).toLowerCase(),t])),"undefined"==typeof document?require("url").pathToFileURL(__filename).href:o&&"SCRIPT"===o.tagName.toUpperCase()&&o.src||new URL("index.js",document.baseURI).href),d=l.load,f=t.createContext(!1),p=({transport:o,children:c,...a})=>{const p=i(o),S=p===u?o:p,[,v]=t.useState(0),g=(e=>l.loaded(e))(o);t.useEffect(()=>{if(g)return;let e=!0;return d(o).then(()=>e&&v(e=>e+1),()=>{}),()=>{e=!1}},[g,o]);const[E,h]=t.useState(null),m=t.useCallback((e,t)=>h(r=>r?.key===e&&r.value===t?r:{key:e,value:t}),[]),x=E?.key===S?E.value:null,P=t.useRef(x),C=t.useRef([]);t.useLayoutEffect(()=>{if(P.current=x,!x)return;const e=C.current;C.current=[],e.forEach(e=>e(x))},[x]),t.useEffect(()=>()=>{const e=C.current;C.current=[],e.forEach(e=>e(null))},[]);const R=t.useCallback(()=>(v(e=>e+1),P.current?Promise.resolve(P.current):new Promise(e=>C.current.push(e))),[]),b=((e,o)=>{const c=r.useDispatch(),a=n.useAudioPlatform(),l=n.useVoiceDisplayState(),f=r.useSelector(e=>e.voice.muted),p=r.useSelector(e=>e.voice.serverMuted),S=r.useSelector(e=>e.voice.pipelineStatus),v=r.useSelector(e=>e.voice.isAgentWorking),g=r.useSelector(e=>e.voice.sessionEndedSignal),E=t.useRef(0);t.useEffect(()=>{E.current++},[e]);const h=t.useCallback(async()=>{i(e)===u&&a.primeGestureAudio?.();const t=++E.current;try{await d(e)}catch{return s.showErrorToast(n.VOICE_CONNECT_ERROR_MESSAGE),!1}const r=await o();return E.current===t&&!!r&&r.enterVoiceMode()},[e,a,o]),m=t.useCallback(()=>{E.current++},[]),x=t.useCallback(()=>c(n.setMuted(!f)),[c,f]),P=t.useCallback(e=>c(n.setSelectedMicId(e)),[c]),C=t.useCallback(e=>c(n.setSelectedSpeakerId(e)),[c]);return t.useMemo(()=>({displayState:l,pipelineStatus:S,isAgentWorking:v,enterVoiceMode:h,exitVoiceMode:m,toggleMute:x,sendText:()=>{},muted:f,serverMuted:p,sessionEndedSignal:g,setInputDevice:P,setOutputDevice:C}),[l,S,v,h,m,x,f,p,g,P,C])})(o,R);return e.jsxs(e.Fragment,{children:[e.jsx(f.Provider,{value:null!==x,children:e.jsx(n.VoiceContext.Provider,{value:x??b,children:c})}),g?e.jsx(g,{engineKey:S,transport:o,onValue:m,...a},S):null]})},S=n.VoiceUIContext.Provider;exports.AudioPlatformProvider=c,exports.VoiceProvider=({audioPlatform:t,transport:r=s.VOICE_TRANSPORTS.PIPECAT_WEBRTC,children:n,...o})=>e.jsx(c,{value:t,children:e.jsx(p,{transport:r,...o,children:n})}),exports.VoiceUIProvider=S,exports.preloadVoiceEngine=function(e){return d(e).catch(()=>{})},exports.useVoiceEngineReady=()=>t.useContext(f);
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),r=require("react-redux"),n=require("@1interface/voice-core"),s=require("@1interface/shared-core"),o=({value:t,children:r})=>e.jsx(n.AudioPlatformContext.Provider,{value:t??n.browserAudioPlatform,children:r}),c="ws",i=e=>e===s.VOICE_TRANSPORTS.LEGACY_WS||e===s.VOICE_TRANSPORTS.PIPECAT_WS?c:"webrtc",u=function(e,t){const r=new Map,n=new Map,s=new Map;return{load:o=>{const c=i(o);let u=r.get(c);if(!u){const o=e[c];if(!o)return Promise.reject(new Error(`No voice-shell engines/<Name>Engine.tsx for the "${c}" engine.`));const i=s.get(c)??0,l=i&&t?function(e,t){const r=/import\(\s*["'`]([^"'`]+)["'`]/.exec(String(e))?.[1];return r?`${r}${r.includes("?")?"&":"?"}retry=${t}`:null}(o,i):null;u=(l?t(l):o()).then(e=>(s.delete(c),n.set(c,e.default),e.default)),u.catch(()=>{r.delete(c),s.set(c,i+1)}),r.set(c,u)}return u},loaded:e=>n.get(i(e))}}(Object.fromEntries(Object.entries(Object.assign({"./engines/WebRtcEngine.tsx":()=>Promise.resolve().then(()=>require("./WebRtcEngine-BKQ3eFVU.cjs")),"./engines/WsEngine.tsx":()=>Promise.resolve().then(()=>require("./WsEngine-ByKZ5xLh.cjs"))})).map(([e,t])=>[e.slice(10,-10).toLowerCase(),t])),e=>import(e)),l=u.load,a=t.createContext(!1),d=({transport:o,children:d,...f})=>{const p=i(o),v=p===c?o:p,[,E]=t.useState(0),S=(e=>u.loaded(e))(o);t.useEffect(()=>{if(S)return;let e=!0;return l(o).then(()=>e&&E(e=>e+1),()=>{}),()=>{e=!1}},[S,o]);const[g,x]=t.useState(null),P=t.useCallback((e,t)=>x(r=>r?.key===e&&r.value===t?r:{key:e,value:t}),[]),h=g?.key===v?g.value:null,C=t.useRef(h),m=t.useRef([]);t.useLayoutEffect(()=>{if(C.current=h,!h)return;const e=m.current;m.current=[],e.forEach(e=>e(h))},[h]),t.useEffect(()=>()=>{const e=m.current;m.current=[],e.forEach(e=>e(null))},[]);const b=t.useCallback(()=>(E(e=>e+1),C.current?Promise.resolve(C.current):new Promise(e=>m.current.push(e))),[]),R=((e,o)=>{const u=r.useDispatch(),a=n.useAudioPlatform(),d=n.useVoiceDisplayState(),f=r.useSelector(e=>e.voice.muted),p=r.useSelector(e=>e.voice.serverMuted),v=r.useSelector(e=>e.voice.pipelineStatus),E=r.useSelector(e=>e.voice.isAgentWorking),S=r.useSelector(e=>e.voice.sessionEndedSignal),g=t.useRef(0);t.useEffect(()=>{g.current++},[e]);const x=t.useCallback(async()=>{i(e)===c&&a.primeGestureAudio?.();const t=++g.current;try{await l(e)}catch{return s.showErrorToast(n.VOICE_CONNECT_ERROR_MESSAGE),!1}const r=await o();return g.current===t&&!!r&&r.enterVoiceMode()},[e,a,o]),P=t.useCallback(()=>{g.current++},[]),h=t.useCallback(()=>u(n.setMuted(!f)),[u,f]),C=t.useCallback(e=>u(n.setSelectedMicId(e)),[u]),m=t.useCallback(e=>u(n.setSelectedSpeakerId(e)),[u]);return t.useMemo(()=>({displayState:d,pipelineStatus:v,isAgentWorking:E,enterVoiceMode:x,exitVoiceMode:P,toggleMute:h,sendText:()=>{},muted:f,serverMuted:p,sessionEndedSignal:S,setInputDevice:C,setOutputDevice:m}),[d,v,E,x,P,h,f,p,S,C,m])})(o,b);return e.jsxs(e.Fragment,{children:[e.jsx(a.Provider,{value:null!==h,children:e.jsx(n.VoiceContext.Provider,{value:h??R,children:d})}),S?e.jsx(S,{engineKey:v,transport:o,onValue:P,...f},v):null]})},f=n.VoiceUIContext.Provider;exports.AudioPlatformProvider=o,exports.VoiceProvider=({audioPlatform:t,transport:r=s.VOICE_TRANSPORTS.PIPECAT_WEBRTC,children:n,...c})=>e.jsx(o,{value:t,children:e.jsx(d,{transport:r,...c,children:n})}),exports.VoiceUIProvider=f,exports.preloadVoiceEngine=function(e){return l(e).catch(()=>{})},exports.useVoiceEngineReady=()=>t.useContext(a);
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{jsx as e,jsxs as r,Fragment as t}from"react/jsx-runtime";import{useContext as n,useState as i,useEffect as o,useCallback as c,useRef as s,useLayoutEffect as u,createContext as a,useMemo as l}from"react";import{useDispatch as d,useSelector as m}from"react-redux";import{AudioPlatformContext as p,browserAudioPlatform as g,VoiceContext as v,useAudioPlatform as f,useVoiceDisplayState as h,VOICE_CONNECT_ERROR_MESSAGE as E,setMuted as P,setSelectedMicId as w,setSelectedSpeakerId as x,VoiceUIContext as M}from"@1interface/voice-core";import{VOICE_TRANSPORTS as S,showErrorToast as W}from"@1interface/shared-core";const y=({value:r,children:t})=>e(p.Provider,{value:r??g,children:t}),j="ws",b=e=>e===S.LEGACY_WS||e===S.PIPECAT_WS?j:"webrtc",A=e=>import(e),k=function(e,r,t=A){const n=new Map,i=new Map,o=new Map;return{load:c=>{const s=b(c);let u=n.get(s);if(!u){const c=e[s];if(!c)return Promise.reject(new Error(`No voice-shell engines/<Name>Engine.tsx for the "${s}" engine.`));const a=o.get(s)??0,l=a?function(e,r,t){const n=/import\(\s*["'`]([^"'`]+)["'`]/.exec(String(e))?.[1];if(!n)return null;const i=new URL(n,t);return i.searchParams.set("retry",String(r)),i.href}(c,a,r):null;u=(l?t(l):c()).then(e=>(o.delete(s),i.set(s,e.default),e.default)),u.catch(()=>{n.delete(s),o.set(s,a+1)}),n.set(s,u)}return u},loaded:e=>i.get(b(e))}}(Object.fromEntries(Object.entries(Object.assign({"./engines/WebRtcEngine.tsx":()=>import("./WebRtcEngine-DCewwH1J.js"),"./engines/WsEngine.tsx":()=>import("./WsEngine-D2V5euGc.js")})).map(([e,r])=>[e.slice(10,-10).toLowerCase(),r])),import.meta.url),C=k.load;function O(e){return C(e).catch(()=>{})}const R=a(!1),T=()=>n(R),V=({transport:n,children:a,...p})=>{const g=b(n),M=g===j?n:g,[,S]=i(0),y=(e=>k.loaded(e))(n);o(()=>{if(y)return;let e=!0;return C(n).then(()=>e&&S(e=>e+1),()=>{}),()=>{e=!1}},[y,n]);const[A,O]=i(null),T=c((e,r)=>O(t=>t?.key===e&&t.value===r?t:{key:e,value:r}),[]),V=A?.key===M?A.value:null,I=s(V),L=s([]);u(()=>{if(I.current=V,!V)return;const e=L.current;L.current=[],e.forEach(e=>e(V))},[V]),o(()=>()=>{const e=L.current;L.current=[],e.forEach(e=>e(null))},[]);const _=c(()=>(S(e=>e+1),I.current?Promise.resolve(I.current):new Promise(e=>L.current.push(e))),[]),D=((e,r)=>{const t=d(),n=f(),i=h(),u=m(e=>e.voice.muted),a=m(e=>e.voice.serverMuted),p=m(e=>e.voice.pipelineStatus),g=m(e=>e.voice.isAgentWorking),v=m(e=>e.voice.sessionEndedSignal),M=s(0);o(()=>{M.current++},[e]);const S=c(async()=>{b(e)===j&&n.primeGestureAudio?.();const t=++M.current;try{await C(e)}catch{return W(E),!1}const i=await r();return M.current===t&&!!i&&i.enterVoiceMode()},[e,n,r]),y=c(()=>{M.current++},[]),A=c(()=>t(P(!u)),[t,u]),k=c(e=>t(w(e)),[t]),O=c(e=>t(x(e)),[t]);return l(()=>({displayState:i,pipelineStatus:p,isAgentWorking:g,enterVoiceMode:S,exitVoiceMode:y,toggleMute:A,sendText:()=>{},muted:u,serverMuted:a,sessionEndedSignal:v,setInputDevice:k,setOutputDevice:O}),[i,p,g,S,y,A,u,a,v,k,O])})(n,_);return r(t,{children:[e(R.Provider,{value:null!==V,children:e(v.Provider,{value:V??D,children:a})}),y?e(y,{engineKey:M,transport:n,onValue:T,...p},M):null]})},I=({audioPlatform:r,transport:t=S.PIPECAT_WEBRTC,children:n,...i})=>e(y,{value:r,children:e(V,{transport:t,...i,children:n})}),L=M.Provider;export{y as AudioPlatformProvider,I as VoiceProvider,L as VoiceUIProvider,O as preloadVoiceEngine,T as useVoiceEngineReady};
1
+ import{jsx as e,jsxs as r,Fragment as t}from"react/jsx-runtime";import{useContext as n,useState as i,useEffect as o,useCallback as c,useRef as s,useLayoutEffect as u,createContext as l,useMemo as a}from"react";import{useDispatch as d,useSelector as p}from"react-redux";import{AudioPlatformContext as m,browserAudioPlatform as v,VoiceContext as g,useAudioPlatform as f,useVoiceDisplayState as h,VOICE_CONNECT_ERROR_MESSAGE as E,setMuted as P,setSelectedMicId as w,setSelectedSpeakerId as x,VoiceUIContext as M}from"@1interface/voice-core";import{VOICE_TRANSPORTS as W,showErrorToast as y}from"@1interface/shared-core";const S=({value:r,children:t})=>e(m.Provider,{value:r??v,children:t}),j="ws",b=e=>e===W.LEGACY_WS||e===W.PIPECAT_WS?j:"webrtc",A=function(e,r){const t=new Map,n=new Map,i=new Map;return{load:o=>{const c=b(o);let s=t.get(c);if(!s){const o=e[c];if(!o)return Promise.reject(new Error(`No voice-shell engines/<Name>Engine.tsx for the "${c}" engine.`));const u=i.get(c)??0,l=u&&r?function(e,r){const t=/import\(\s*["'`]([^"'`]+)["'`]/.exec(String(e))?.[1];return t?`${t}${t.includes("?")?"&":"?"}retry=${r}`:null}(o,u):null;s=(l?r(l):o()).then(e=>(i.delete(c),n.set(c,e.default),e.default)),s.catch(()=>{t.delete(c),i.set(c,u+1)}),t.set(c,s)}return s},loaded:e=>n.get(b(e))}}(Object.fromEntries(Object.entries(Object.assign({"./engines/WebRtcEngine.tsx":()=>import("./WebRtcEngine-DCewwH1J.js"),"./engines/WsEngine.tsx":()=>import("./WsEngine-D2V5euGc.js")})).map(([e,r])=>[e.slice(10,-10).toLowerCase(),r])),e=>import(e)),k=A.load;function C(e){return k(e).catch(()=>{})}const O=l(!1),T=()=>n(O),V=({transport:n,children:l,...m})=>{const v=b(n),M=v===j?n:v,[,W]=i(0),S=(e=>A.loaded(e))(n);o(()=>{if(S)return;let e=!0;return k(n).then(()=>e&&W(e=>e+1),()=>{}),()=>{e=!1}},[S,n]);const[C,T]=i(null),V=c((e,r)=>T(t=>t?.key===e&&t.value===r?t:{key:e,value:r}),[]),$=C?.key===M?C.value:null,I=s($),R=s([]);u(()=>{if(I.current=$,!$)return;const e=R.current;R.current=[],e.forEach(e=>e($))},[$]),o(()=>()=>{const e=R.current;R.current=[],e.forEach(e=>e(null))},[]);const _=c(()=>(W(e=>e+1),I.current?Promise.resolve(I.current):new Promise(e=>R.current.push(e))),[]),D=((e,r)=>{const t=d(),n=f(),i=h(),u=p(e=>e.voice.muted),l=p(e=>e.voice.serverMuted),m=p(e=>e.voice.pipelineStatus),v=p(e=>e.voice.isAgentWorking),g=p(e=>e.voice.sessionEndedSignal),M=s(0);o(()=>{M.current++},[e]);const W=c(async()=>{b(e)===j&&n.primeGestureAudio?.();const t=++M.current;try{await k(e)}catch{return y(E),!1}const i=await r();return M.current===t&&!!i&&i.enterVoiceMode()},[e,n,r]),S=c(()=>{M.current++},[]),A=c(()=>t(P(!u)),[t,u]),C=c(e=>t(w(e)),[t]),O=c(e=>t(x(e)),[t]);return a(()=>({displayState:i,pipelineStatus:m,isAgentWorking:v,enterVoiceMode:W,exitVoiceMode:S,toggleMute:A,sendText:()=>{},muted:u,serverMuted:l,sessionEndedSignal:g,setInputDevice:C,setOutputDevice:O}),[i,m,v,W,S,A,u,l,g,C,O])})(n,_);return r(t,{children:[e(O.Provider,{value:null!==$,children:e(g.Provider,{value:$??D,children:l})}),S?e(S,{engineKey:M,transport:n,onValue:V,...m},M):null]})},$=({audioPlatform:r,transport:t=W.PIPECAT_WEBRTC,children:n,...i})=>e(S,{value:r,children:e(V,{transport:t,...i,children:n})}),I=M.Provider;export{S as AudioPlatformProvider,$ as VoiceProvider,I as VoiceUIProvider,C as preloadVoiceEngine,T as useVoiceEngineReady};
@@ -0,0 +1 @@
1
+ import{VoiceProvider as r,useVoiceEngineReady as i}from"./providers/VoiceProvider";import{preloadVoiceEngine as f}from"./providers/loadVoiceEngine";import{VoiceUIProvider as p}from"./providers/VoiceUIProvider";import{AudioPlatformProvider as c}from"./providers/AudioPlatformProvider";export{c as AudioPlatformProvider,r as VoiceProvider,p as VoiceUIProvider,f as preloadVoiceEngine,i as useVoiceEngineReady};
@@ -0,0 +1 @@
1
+ import{jsx as d}from"react/jsx-runtime";import{AudioPlatformContext as t,browserAudioPlatform as e}from"@1interface/voice-core";const f=({value:o,children:r})=>d(t.Provider,{value:o??e,children:r});export{f as AudioPlatformProvider};
@@ -0,0 +1 @@
1
+ import{Fragment as J,jsx as P,jsxs as Q}from"react/jsx-runtime";import{createContext as I,useCallback as u,useContext as M,useEffect as C,useLayoutEffect as k,useMemo as N,useRef as S,useState as R}from"react";import{useDispatch as O,useSelector as g}from"react-redux";import{VoiceContext as w,VOICE_CONNECT_ERROR_MESSAGE as D,setMuted as _,setSelectedMicId as b,setSelectedSpeakerId as F,useAudioPlatform as W,useVoiceDisplayState as B}from"@1interface/voice-core";import{VOICE_TRANSPORTS as H,showErrorToast as K}from"@1interface/shared-core";import{AudioPlatformProvider as G}from"./AudioPlatformProvider";import{VOICE_ENGINE_KINDS as x,loadVoiceEngine as h,loadedVoiceEngine as L,voiceEngineKindFor as A}from"./loadVoiceEngine";const q=(o,l)=>{const i=O(),c=W(),d=B(),s=g(e=>e.voice.muted),a=g(e=>e.voice.serverMuted),f=g(e=>e.voice.pipelineStatus),v=g(e=>e.voice.isAgentWorking),m=g(e=>e.voice.sessionEndedSignal),n=S(0);C(()=>{n.current++},[o]);const V=u(async()=>{A(o)===x.WS&&c.primeGestureAudio?.();const e=++n.current;try{await h(o)}catch{return K(D),!1}const p=await l();return n.current!==e?!1:p?p.enterVoiceMode():!1},[o,c,l]),r=u(()=>{n.current++},[]),E=u(()=>i(_(!s)),[i,s]),y=u(e=>i(b(e)),[i]),t=u(e=>i(F(e)),[i]);return N(()=>({displayState:d,pipelineStatus:f,isAgentWorking:v,enterVoiceMode:V,exitVoiceMode:r,toggleMute:E,sendText:()=>{},muted:s,serverMuted:a,sessionEndedSignal:m,setInputDevice:y,setOutputDevice:t}),[d,f,v,V,r,E,s,a,m,y,t])},T=I(!1),te=()=>M(T),z=({transport:o,children:l,...i})=>{const c=A(o),d=c===x.WS?o:c,[,s]=R(0),a=L(o);C(()=>{if(a)return;let t=!0;return h(o).then(()=>t&&s(e=>e+1),()=>{}),()=>{t=!1}},[a,o]);const[f,v]=R(null),m=u((t,e)=>v(p=>p?.key===t&&p.value===e?p:{key:t,value:e}),[]),n=f?.key===d?f.value:null,V=S(n),r=S([]);k(()=>{if(V.current=n,!n)return;const t=r.current;r.current=[],t.forEach(e=>e(n))},[n]),C(()=>()=>{const t=r.current;r.current=[],t.forEach(e=>e(null))},[]);const E=u(()=>(s(t=>t+1),V.current?Promise.resolve(V.current):new Promise(t=>r.current.push(t))),[]),y=q(o,E);return Q(J,{children:[P(T.Provider,{value:n!==null,children:P(w.Provider,{value:n??y,children:l})}),a?P(a,{engineKey:d,transport:o,onValue:m,...i},d):null]})},oe=({audioPlatform:o,transport:l=H.PIPECAT_WEBRTC,children:i,...c})=>P(G,{value:o,children:P(z,{transport:l,...c,children:i})});export{oe as VoiceProvider,te as useVoiceEngineReady};
@@ -0,0 +1 @@
1
+ import{VoiceUIContext as o}from"@1interface/voice-core";const e=o.Provider;export{e as VoiceUIProvider};
@@ -0,0 +1 @@
1
+ import{VOICE_TRANSPORTS as V}from"@1interface/shared-core";const l={WEBRTC:"webrtc",WS:"ws"},d=o=>o===V.LEGACY_WS||o===V.PIPECAT_WS?l.WS:l.WEBRTC;function u(o,i){const n=/import\(\s*["'`]([^"'`]+)["'`]/.exec(String(o))?.[1];return n?`${n}${n.includes("?")?"&":"?"}retry=${i}`:null}function C(o,i){const n=new Map,a=new Map,r=new Map;return{load:c=>{const e=d(c);let t=n.get(e);if(!t){const s=o[e];if(!s)return Promise.reject(new Error(`No voice-shell engines/<Name>Engine.tsx for the "${e}" engine.`));const p=r.get(e)??0,g=p&&i?u(s,p):null;t=(g?i(g):s()).then(E=>(r.delete(e),a.set(e,E.default),E.default)),t.catch(()=>{n.delete(e),r.set(e,p+1)}),n.set(e,t)}return t},loaded:c=>a.get(d(c))}}export{l as VOICE_ENGINE_KINDS,C as createVoiceEngineLoader,u as retrySpecifier,d as voiceEngineKindFor};
@@ -0,0 +1 @@
1
+ import{memo as m,useLayoutEffect as p}from"react";import{useVoiceProviderValue as u}from"@1interface/voice-core/webrtc";const a=({engineKey:e,conversationId:t,voiceBridge:i,transportFactory:c,assistantStartsConversation:n,onValue:o})=>{const r=u({conversationId:t,voiceBridge:i,transportFactory:c,assistantStartsConversation:n});return p(()=>o(e,r),[o,e,r]),null};var E=m(a);export{E as default};
@@ -0,0 +1 @@
1
+ import{memo as n,useLayoutEffect as p}from"react";import{useVoiceWsProviderValue as a}from"@1interface/voice-core/ws";const m=({engineKey:o,transport:t,conversationId:i,voiceBridge:s,assistantStartsConversation:c,onValue:e})=>{const r=a({conversationId:i,voiceBridge:s,transport:t,assistantStartsConversation:c});return p(()=>e(o,r),[e,o,r]),null};var l=n(m);export{l as default};
@@ -0,0 +1 @@
1
+ import{createVoiceEngineLoader as i}from"./engineLoader";import{VOICE_ENGINE_KINDS as E,voiceEngineKindFor as a}from"./engineLoader";const t=e=>import(e),n=i(Object.fromEntries(Object.entries(import.meta.glob("./engines/*Engine.tsx")).map(([e,o])=>[e.slice(10,-10).toLowerCase(),o])),t),r=n.load,c=e=>n.loaded(e);function g(e){return r(e).catch(()=>{})}export{E as VOICE_ENGINE_KINDS,r as loadVoiceEngine,c as loadedVoiceEngine,g as preloadVoiceEngine,a as voiceEngineKindFor};
@@ -0,0 +1 @@
1
+ import{createVoiceEngineLoader as n}from"./engineLoader";import{VOICE_ENGINE_KINDS as m,voiceEngineKindFor as d}from"./engineLoader";const o=n({webrtc:()=>import("./engines/WebRtcEngine"),ws:()=>import("./engines/WsEngine")}),i=o.load,t=e=>o.loaded(e);function p(e){return i(e).catch(()=>{})}export{m as VOICE_ENGINE_KINDS,i as loadVoiceEngine,t as loadedVoiceEngine,p as preloadVoiceEngine,d as voiceEngineKindFor};
package/package.json CHANGED
@@ -1,21 +1,24 @@
1
1
  {
2
2
  "name": "@1interface/voice-shell",
3
- "version": "0.7.1",
3
+ "version": "0.7.3",
4
4
  "license": "UNLICENSED",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "main": "./dist/index.js",
8
8
  "module": "./dist/index.mjs",
9
9
  "types": "./dist/index.d.ts",
10
+ "react-native": "./native/index.js",
10
11
  "exports": {
11
12
  ".": {
13
+ "react-native": "./native/index.js",
12
14
  "types": "./dist/index.d.ts",
13
15
  "import": "./dist/index.mjs",
14
16
  "require": "./dist/index.js"
15
17
  }
16
18
  },
17
19
  "files": [
18
- "dist"
20
+ "dist",
21
+ "native"
19
22
  ],
20
23
  "repository": {
21
24
  "type": "git",
@@ -26,8 +29,8 @@
26
29
  "access": "public"
27
30
  },
28
31
  "dependencies": {
29
- "@1interface/shared-core": "^0.18.0",
30
- "@1interface/voice-core": "^0.8.1"
32
+ "@1interface/voice-core": "^0.8.3",
33
+ "@1interface/shared-core": "^0.19.0"
31
34
  },
32
35
  "peerDependencies": {
33
36
  "@reduxjs/toolkit": "^2.0.0",
@@ -44,6 +47,7 @@
44
47
  "@types/react-dom": "^19.2.3",
45
48
  "@vitejs/plugin-react": "5.1.1",
46
49
  "@vitest/ui": "4.1.0",
50
+ "esbuild": "0.27.2",
47
51
  "jsdom": "^27.4.0",
48
52
  "terser": "5.46.1",
49
53
  "typescript": "~5.9.3",
@@ -52,7 +56,7 @@
52
56
  "vitest": "4.1.0"
53
57
  },
54
58
  "scripts": {
55
- "build": "vite build",
59
+ "build": "vite build && node scripts/build-native.mjs",
56
60
  "dev": "vite build --watch",
57
61
  "test": "vitest",
58
62
  "test:ui": "vitest --ui",