@alexkroman1/aai-ui 5.4.0 → 5.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/context.d.ts +3 -3
- package/dist/context.js +3 -2
- package/dist/default-client/assets/{audio-DXQj0wCf.js → audio-CQHMQr4-.js} +1 -1
- package/dist/default-client/assets/{capture-processor-DZg_Q6hY.js → capture-processor-BRTP9wp5.js} +1 -1
- package/dist/default-client/assets/index-C99SRlSn.js +192 -0
- package/dist/default-client/assets/{playback-processor-DZlwpHHt.js → playback-processor-D2xR7szm.js} +1 -1
- package/dist/default-client/index.html +1 -1
- package/dist/define-client.js +1 -1
- package/dist/index.js +1 -1
- package/dist/{session-core-DX2SIpdQ.js → session-core-KY9B5nqn.js} +13 -0
- package/dist/session-core-types.d.ts +9 -0
- package/dist/session-core.js +1 -1
- package/package.json +2 -2
- package/dist/default-client/assets/index-DyY8OeVc.js +0 -192
package/dist/context.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export declare function SessionProvider({ value, children }: {
|
|
|
17
17
|
* (`state`, `messages`, `toolCalls`, `agentState`, live transcripts, `error`,
|
|
18
18
|
* `apiUrl`, `started`/`running`/`recording`, …) merged with the session's
|
|
19
19
|
* control methods (`start`, `toggle`, `reset`, `resetState`, `disconnect`,
|
|
20
|
-
* `cancel`).
|
|
20
|
+
* `cancel`, `end`).
|
|
21
21
|
*
|
|
22
22
|
* Note there is no text-send method — sessions are voice-only; the only
|
|
23
23
|
* client→server inputs are audio and the control methods above.
|
|
@@ -26,7 +26,7 @@ export declare function SessionProvider({ value, children }: {
|
|
|
26
26
|
*
|
|
27
27
|
* @public
|
|
28
28
|
*/
|
|
29
|
-
export type Session = SessionSnapshot & Pick<SessionCore, "start" | "cancel" | "resetState" | "reset" | "disconnect" | "toggle">;
|
|
29
|
+
export type Session = SessionSnapshot & Pick<SessionCore, "start" | "cancel" | "resetState" | "reset" | "disconnect" | "toggle" | "end">;
|
|
30
30
|
/**
|
|
31
31
|
* Return the raw {@link SessionCore} from context without subscribing to
|
|
32
32
|
* snapshot changes. Useful for accessing stable methods (`start`, `toggle`,
|
|
@@ -40,7 +40,7 @@ export declare function useSessionCore(): SessionCore;
|
|
|
40
40
|
/**
|
|
41
41
|
* Return the live {@link Session}: the current snapshot fields plus the
|
|
42
42
|
* control methods (`start`, `toggle`, `reset`, `resetState`, `disconnect`,
|
|
43
|
-
* `cancel`).
|
|
43
|
+
* `cancel`, `end`).
|
|
44
44
|
*
|
|
45
45
|
* Throws if used outside the provider `client()` installs (the error names
|
|
46
46
|
* `<SessionProvider>` — you only mount that yourself when bypassing
|
package/dist/context.js
CHANGED
|
@@ -36,7 +36,7 @@ function useSessionCore() {
|
|
|
36
36
|
/**
|
|
37
37
|
* Return the live {@link Session}: the current snapshot fields plus the
|
|
38
38
|
* control methods (`start`, `toggle`, `reset`, `resetState`, `disconnect`,
|
|
39
|
-
* `cancel`).
|
|
39
|
+
* `cancel`, `end`).
|
|
40
40
|
*
|
|
41
41
|
* Throws if used outside the provider `client()` installs (the error names
|
|
42
42
|
* `<SessionProvider>` — you only mount that yourself when bypassing
|
|
@@ -67,7 +67,8 @@ function useSession() {
|
|
|
67
67
|
resetState: core.resetState,
|
|
68
68
|
reset: core.reset,
|
|
69
69
|
disconnect: core.disconnect,
|
|
70
|
-
toggle: core.toggle
|
|
70
|
+
toggle: core.toggle,
|
|
71
|
+
end: core.end
|
|
71
72
|
}), [snapshot, core]);
|
|
72
73
|
}
|
|
73
74
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as e,o as t,t as n}from"./index-
|
|
1
|
+
import{a as e,o as t,t as n}from"./index-C99SRlSn.js";function r(e,t,n){if(e!==t)throw Error(`Browser refused the ${n} sample rate: asked for ${t} Hz, got ${e} Hz`)}function i(e){e.then(e=>{for(let t of e.getTracks())t.stop()}).catch(()=>{})}function a(e,t,n){let r=new AudioWorkletNode(e,`capture-processor`,{channelCount:1,channelCountMode:`explicit`}),i=null;return r.port.onmessage=e=>{let r=e.data;r.event===`chunk`&&r.buffer?t(r.buffer):r.event===`silent`?n?.():r.event===`stopped`&&(i?.(),i=null)},{node:r,start(){r.port.postMessage({event:`start`})},stop(){return new Promise(e=>{let t=setTimeout(e,250);i=()=>{clearTimeout(t),e()},r.port.postMessage({event:`stop`})})}}}async function o(o){let{sttSampleRate:s,ttsSampleRate:c,captureWorkletSrc:l,playbackWorkletSrc:u,onMicData:d,onError:f,onPlaybackStats:p,onMicSilent:m}=o,h=new AudioContext({sampleRate:c,latencyHint:`playback`}),g=s===c,_=g?h:new AudioContext({sampleRate:s,latencyHint:`interactive`});async function v(){let e=g?[h]:[h,_];await Promise.all(e.map(e=>e.close().catch(e=>{console.warn(`AudioContext close failed:`,e)})))}let y=navigator.mediaDevices.getUserMedia({audio:{deviceId:{ideal:`default`},...n}}),b;try{[b]=await Promise.all([y,h.resume(),_.resume(),_.audioWorklet.addModule(l),h.audioWorklet.addModule(u)]),r(_.sampleRate,s,`capture`),r(h.sampleRate,c,`playback`)}catch(e){throw i(y),await v(),e}let x=_.createMediaStreamSource(b),S=a(_,d,m);x.connect(S.node),S.node.onprocessorerror=()=>{let e=Error(`Audio capture worklet crashed`);console.error(`[aai-ui]`,e.message),f?.(e)},S.start();let C=null,w=null,T=new AbortController;function E(){if(C)return C;let e=new AudioWorkletNode(h,`playback-processor`);return e.connect(h.destination),e.port.onmessage=e=>{if(e.data.event===`stop`){let t=e.data.stats;if(t&&t.concealedSamples>0&&p?.(t),e.data.reason===`interrupt`)return;w?.(),w=null}},e.onprocessorerror=()=>{let e=Error(`Audio playback worklet crashed`);console.error(`[aai-ui]`,e.message),w?.(),w=null,f?.(e)},C=e,e}let D={enqueue(e){T.signal.aborted||e.byteLength!==0&&E().port.postMessage({event:`write`,buffer:new Uint8Array(e)},[e])},done(){return!C||(C.port.postMessage({event:`done`}),h.state!==`running`)?Promise.resolve():new Promise(n=>{w?.();let r=()=>{clearInterval(i),clearTimeout(a),w===r&&(w=null),n()},i=setInterval(()=>{h.state!==`running`&&r()},t),a=setTimeout(r,e);w=r})},flush(){C&&(w?.(),w=null,C.port.postMessage({event:`interrupt`}))},async close(){if(!T.signal.aborted){T.abort(),await S.stop(),x.disconnect(),S.node.disconnect(),C&&C.disconnect();for(let e of b.getTracks())e.stop();await v()}},async[Symbol.asyncDispose](){await D.close()}};return D}export{o as createVoiceIO};
|
package/dist/default-client/assets/{capture-processor-DZg_Q6hY.js → capture-processor-BRTP9wp5.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e,r as t}from"./index-
|
|
1
|
+
import{n as e,r as t}from"./index-C99SRlSn.js";import{t as n}from"./_module-url-BX0RuRU2.js";var r=n(`
|
|
2
2
|
class CaptureProcessor extends AudioWorkletProcessor {
|
|
3
3
|
constructor(options) {
|
|
4
4
|
super();
|