@chainlit/react-client
Version:
Websocket client to connect to your chainlit app.
312 lines (296 loc) • 43.6 kB
JavaScript
import { atom, selector, DefaultValue, useRecoilValue, useResetRecoilState, useSetRecoilState, useRecoilState } from 'recoil';
import { isEqual, debounce } from 'lodash';
import { v4 } from 'uuid';
import { createContext, useContext, useMemo, useCallback, useEffect, useRef } from 'react';
import Vt, { SWRConfig } from 'swr';
import Xt from 'socket.io-client';
export { Socket } from 'socket.io-client';
import { toast } from 'sonner';
var Je=o=>{let e={},t=new Date;return t.setHours(0,0,0,0),[...o].sort((s,r)=>new Date(r.createdAt).getTime()-new Date(s.createdAt).getTime()).forEach(s=>{let r=new Date(s.createdAt);r.setHours(0,0,0,0);let n=Math.floor((t.getTime()-r.getTime())/864e5),a=navigator.language,i;n===0?i="Today":n===1?i="Yesterday":n<=7?i="Previous 7 days":n<=30?i="Previous 30 days":i=r.toLocaleString(a,{month:"long",year:"numeric"}),e[i]??(e[i]=[]),e[i].push(s);}),e};var Qe=[4186.01,4434.92,4698.63,4978.03,5274.04,5587.65,5919.91,6271.93,6644.88,7040,7458.62,7902.13],Tt=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"],F=[],pe=[];for(let o=1;o<=8;o++)for(let e=0;e<Qe.length;e++){let t=Qe[e];F.push(t/Math.pow(2,8-o)),pe.push(Tt[e]+o);}var he=[32,2e3],Le=F.filter((o,e)=>F[e]>he[0]&&F[e]<he[1]),Ye=pe.filter((o,e)=>F[e]>he[0]&&F[e]<he[1]);var L=class o{static getFrequencies(e,t,s,r="frequency",n=-100,a=-30){s||(s=new Float32Array(e.frequencyBinCount),e.getFloatFrequencyData(s));let i=t/2,u=1/s.length*i,h,f,d;if(r==="music"||r==="voice"){let k=r==="voice"?Le:F,w=Array(k.length).fill(n);for(let U=0;U<s.length;U++){let N=U*u,j=s[U];for(let T=k.length-1;T>=0;T--)if(N>k[T]){w[T]=Math.max(w[T],j);break}}h=w,f=r==="voice"?Le:F,d=r==="voice"?Ye:pe;}else h=Array.from(s),f=h.map((k,w)=>u*w),d=f.map(k=>`${k.toFixed(2)} Hz`);let y=h.map(k=>Math.max(0,Math.min((k-n)/(a-n),1)));return {values:new Float32Array(y),frequencies:f,labels:d}}constructor(e,t=null){if(this.fftResults=[],t){let{length:s,sampleRate:r}=t,n=new OfflineAudioContext({length:s,sampleRate:r}),a=n.createBufferSource();a.buffer=t;let i=n.createAnalyser();i.fftSize=8192,i.smoothingTimeConstant=.1,a.connect(i);let u=1/60,h=s/r,f=d=>{let y=u*d;y<h&&n.suspend(y).then(()=>{let S=new Float32Array(i.frequencyBinCount);i.getFloatFrequencyData(S),this.fftResults.push(S),f(d+1);}),d===1?n.startRendering():n.resume();};a.start(0),f(1),this.audio=e,this.context=n,this.analyser=i,this.sampleRate=r,this.audioBuffer=t;}else {let s=new AudioContext,r=s.createMediaElementSource(e),n=s.createAnalyser();n.fftSize=8192,n.smoothingTimeConstant=.1,r.connect(n),n.connect(s.destination),this.audio=e,this.context=s,this.analyser=n,this.sampleRate=this.context.sampleRate,this.audioBuffer=null;}}getFrequencies(e="frequency",t=-100,s=-30){let r=null;if(this.audioBuffer&&this.fftResults.length){let n=this.audio.currentTime/this.audio.duration,a=Math.min(n*this.fftResults.length|0,this.fftResults.length-1);r=this.fftResults[a];}return o.getFrequencies(this.analyser,this.sampleRate,r,e,t,s)}async resumeIfSuspended(){return this.context.state==="suspended"&&await this.context.resume(),!0}};globalThis.AudioAnalysis=L;var M=class{static floatTo16BitPCM(e){let t=new ArrayBuffer(e.length*2),s=new DataView(t),r=0;for(let n=0;n<e.length;n++,r+=2){let a=Math.max(-1,Math.min(1,e[n]));s.setInt16(r,a<0?a*32768:a*32767,!0);}return t}static mergeBuffers(e,t){let s=new Uint8Array(e.byteLength+t.byteLength);return s.set(new Uint8Array(e),0),s.set(new Uint8Array(t),e.byteLength),s.buffer}_packData(e,t){return [new Uint8Array([t,t>>8]),new Uint8Array([t,t>>8,t>>16,t>>24])][e]}pack(e,t){if(t?.bitsPerSample)if(t?.channels){if(!t?.data)throw new Error('Missing "data"')}else throw new Error('Missing "channels"');else throw new Error('Missing "bitsPerSample"');let{bitsPerSample:s,channels:r,data:n}=t,a=["RIFF",this._packData(1,4+(8+24)+(8+8)),"WAVE","fmt ",this._packData(1,16),this._packData(0,1),this._packData(0,r.length),this._packData(1,e),this._packData(1,e*r.length*s/8),this._packData(0,r.length*s/8),this._packData(0,s),"data",this._packData(1,r[0].length*r.length*s/8),n],i=new Blob(a,{type:"audio/mpeg"}),u=URL.createObjectURL(i);return {blob:i,url:u,channelCount:r.length,sampleRate:e,duration:n.byteLength/(r.length*e*2)}}};globalThis.WavPacker=M;var Mt=`
class AudioProcessor extends AudioWorkletProcessor {
constructor() {
super();
this.port.onmessage = this.receive.bind(this);
this.initialize();
}
initialize() {
this.foundAudio = false;
this.recording = false;
this.chunks = [];
}
/**
* Concatenates sampled chunks into channels
* Format is chunk[Left[], Right[]]
*/
readChannelData(chunks, channel = -1, maxChannels = 9) {
let channelLimit;
if (channel !== -1) {
if (chunks[0] && chunks[0].length - 1 < channel) {
throw new Error(
\`Channel \${channel} out of range: max \${chunks[0].length}\`
);
}
channelLimit = channel + 1;
} else {
channel = 0;
channelLimit = Math.min(chunks[0] ? chunks[0].length : 1, maxChannels);
}
const channels = [];
for (let n = channel; n < channelLimit; n++) {
const length = chunks.reduce((sum, chunk) => {
return sum + chunk[n].length;
}, 0);
const buffers = chunks.map((chunk) => chunk[n]);
const result = new Float32Array(length);
let offset = 0;
for (let i = 0; i < buffers.length; i++) {
result.set(buffers[i], offset);
offset += buffers[i].length;
}
channels[n] = result;
}
return channels;
}
/**
* Combines parallel audio data into correct format,
* channels[Left[], Right[]] to float32Array[LRLRLRLR...]
*/
formatAudioData(channels) {
if (channels.length === 1) {
// Simple case is only one channel
const float32Array = channels[0].slice();
const meanValues = channels[0].slice();
return { float32Array, meanValues };
} else {
const float32Array = new Float32Array(
channels[0].length * channels.length
);
const meanValues = new Float32Array(channels[0].length);
for (let i = 0; i < channels[0].length; i++) {
const offset = i * channels.length;
let meanValue = 0;
for (let n = 0; n < channels.length; n++) {
float32Array[offset + n] = channels[n][i];
meanValue += channels[n][i];
}
meanValues[i] = meanValue / channels.length;
}
return { float32Array, meanValues };
}
}
/**
* Converts 32-bit float data to 16-bit integers
*/
floatTo16BitPCM(float32Array) {
const buffer = new ArrayBuffer(float32Array.length * 2);
const view = new DataView(buffer);
let offset = 0;
for (let i = 0; i < float32Array.length; i++, offset += 2) {
let s = Math.max(-1, Math.min(1, float32Array[i]));
view.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7fff, true);
}
return buffer;
}
/**
* Retrieves the most recent amplitude values from the audio stream
* @param {number} channel
*/
getValues(channel = -1) {
const channels = this.readChannelData(this.chunks, channel);
const { meanValues } = this.formatAudioData(channels);
return { meanValues, channels };
}
/**
* Exports chunks as an audio/wav file
*/
export() {
const channels = this.readChannelData(this.chunks);
const { float32Array, meanValues } = this.formatAudioData(channels);
const audioData = this.floatTo16BitPCM(float32Array);
return {
meanValues: meanValues,
audio: {
bitsPerSample: 16,
channels: channels,
data: audioData,
},
};
}
receive(e) {
const { event, id } = e.data;
let receiptData = {};
switch (event) {
case 'start':
this.recording = true;
break;
case 'stop':
this.recording = false;
break;
case 'clear':
this.initialize();
break;
case 'export':
receiptData = this.export();
break;
case 'read':
receiptData = this.getValues();
break;
default:
break;
}
// Always send back receipt
this.port.postMessage({ event: 'receipt', id, data: receiptData });
}
sendChunk(chunk) {
const channels = this.readChannelData([chunk]);
const { float32Array, meanValues } = this.formatAudioData(channels);
const rawAudioData = this.floatTo16BitPCM(float32Array);
const monoAudioData = this.floatTo16BitPCM(meanValues);
this.port.postMessage({
event: 'chunk',
data: {
mono: monoAudioData,
raw: rawAudioData,
},
});
}
process(inputList, outputList, parameters) {
// Copy input to output (e.g. speakers)
// Note that this creates choppy sounds with Mac products
const sourceLimit = Math.min(inputList.length, outputList.length);
for (let inputNum = 0; inputNum < sourceLimit; inputNum++) {
const input = inputList[inputNum];
const output = outputList[inputNum];
const channelCount = Math.min(input.length, output.length);
for (let channelNum = 0; channelNum < channelCount; channelNum++) {
input[channelNum].forEach((sample, i) => {
output[channelNum][i] = sample;
});
}
}
const inputs = inputList[0];
// There's latency at the beginning of a stream before recording starts
// Make sure we actually receive audio data before we start storing chunks
let sliceIndex = 0;
if (!this.foundAudio) {
for (const channel of inputs) {
sliceIndex = 0; // reset for each channel
if (this.foundAudio) {
break;
}
if (channel) {
for (const value of channel) {
if (value !== 0) {
// find only one non-zero entry in any channel
this.foundAudio = true;
break;
} else {
sliceIndex++;
}
}
}
}
}
if (inputs && inputs[0] && this.foundAudio && this.recording) {
// We need to copy the TypedArray, because the \`process\`
// internals will reuse the same buffer to hold each input
const chunk = inputs.map((input) => input.slice(sliceIndex));
this.chunks.push(chunk);
this.sendChunk(chunk);
}
return true;
}
}
registerProcessor('audio_processor', AudioProcessor);
`,_t=new Blob([Mt],{type:"application/javascript"}),Pt=URL.createObjectURL(_t),Xe=Pt;var K=class{constructor({sampleRate:e=24e3,outputToSpeakers:t=!1,debug:s=!1}={}){this.scriptSrc=Xe,this.sampleRate=e,this.outputToSpeakers=t,this.debug=!!s,this._deviceChangeCallback=null,this._devices=[],this.stream=null,this.processor=null,this.source=null,this.node=null,this.recording=!1,this._lastEventId=0,this.eventReceipts={},this.eventTimeout=5e3,this._chunkProcessor=()=>{},this._chunkProcessorSize=void 0,this._chunkProcessorBuffer={raw:new ArrayBuffer(0),mono:new ArrayBuffer(0)};}static async decode(e,t=24e3,s=-1){let r=new AudioContext({sampleRate:t}),n,a;if(e instanceof Blob){if(s!==-1)throw new Error('Can not specify "fromSampleRate" when reading from Blob');a=e,n=await a.arrayBuffer();}else if(e instanceof ArrayBuffer){if(s!==-1)throw new Error('Can not specify "fromSampleRate" when reading from ArrayBuffer');n=e,a=new Blob([n],{type:"audio/wav"});}else {let f,d;if(e instanceof Int16Array){d=e,f=new Float32Array(e.length);for(let w=0;w<e.length;w++)f[w]=e[w]/32768;}else if(e instanceof Float32Array)f=e;else if(e instanceof Array)f=new Float32Array(e);else throw new Error('"audioData" must be one of: Blob, Float32Arrray, Int16Array, ArrayBuffer, Array<number>');if(s===-1)throw new Error('Must specify "fromSampleRate" when reading from Float32Array, In16Array or Array');if(s<3e3)throw new Error('Minimum "fromSampleRate" is 3000 (3kHz)');d||(d=M.floatTo16BitPCM(f));let y={bitsPerSample:16,channels:[f],data:d};a=new M().pack(s,y).blob,n=await a.arrayBuffer();}let i=await r.decodeAudioData(n),u=i.getChannelData(0),h=URL.createObjectURL(a);return {blob:a,url:h,values:u,audioBuffer:i}}log(){return this.debug&&this.log(...arguments),!0}getSampleRate(){return this.sampleRate}getStatus(){return this.processor?this.recording?"recording":"paused":"ended"}async _event(e,t={},s=null){if(s=s||this.processor,!s)throw new Error("Can not send events without recording first");let r={event:e,id:this._lastEventId++,data:t};s.port.postMessage(r);let n=new Date().valueOf();for(;!this.eventReceipts[r.id];){if(new Date().valueOf()-n>this.eventTimeout)throw new Error(`Timeout waiting for "${e}" event`);await new Promise(i=>setTimeout(()=>i(!0),1));}let a=this.eventReceipts[r.id];return delete this.eventReceipts[r.id],a}listenForDeviceChange(e){if(e===null&&this._deviceChangeCallback)navigator.mediaDevices.removeEventListener("devicechange",this._deviceChangeCallback),this._deviceChangeCallback=null;else if(e!==null){let t=0,s=[],r=a=>a.map(i=>i.deviceId).sort().join(","),n=async()=>{let a=++t,i=await this.listDevices();a===t&&r(s)!==r(i)&&(s=i,e(i.slice()));};navigator.mediaDevices.addEventListener("devicechange",n),n(),this._deviceChangeCallback=n;}return !0}async requestPermission(){let e=await navigator.permissions.query({name:"microphone"});if(e.state==="denied")window.alert("You must grant microphone access to use this feature.");else if(e.state==="prompt")try{(await navigator.mediaDevices.getUserMedia({audio:!0})).getTracks().forEach(r=>r.stop());}catch{window.alert("You must grant microphone access to use this feature.");}return !0}async listDevices(){if(!navigator.mediaDevices||!("enumerateDevices"in navigator.mediaDevices))throw new Error("Could not request user devices");await this.requestPermission();let t=(await navigator.mediaDevices.enumerateDevices()).filter(n=>n.kind==="audioinput"),s=t.findIndex(n=>n.deviceId==="default"),r=[];if(s!==-1){let n=t.splice(s,1)[0],a=t.findIndex(i=>i.groupId===n.groupId);a!==-1&&(n=t.splice(a,1)[0]),n.default=!0,r.push(n);}return r.concat(t)}async begin(e){if(this.processor)throw new Error("Already connected: please call .end() to start a new session");if(!navigator.mediaDevices||!("getUserMedia"in navigator.mediaDevices))throw new Error("Could not request user media");try{let i={audio:!0};e&&(i.audio={deviceId:{exact:e}}),this.stream=await navigator.mediaDevices.getUserMedia(i);}catch(i){throw new Error("Could not start media stream",{cause:i})}let t=new AudioContext({sampleRate:this.sampleRate}),s=t.createMediaStreamSource(this.stream);try{await t.audioWorklet.addModule(this.scriptSrc);}catch(i){throw console.error(i),new Error(`Could not add audioWorklet module: ${this.scriptSrc}`,{cause:i})}let r=new AudioWorkletNode(t,"audio_processor");r.port.onmessage=i=>{let{event:u,id:h,data:f}=i.data;if(u==="receipt")this.eventReceipts[h]=f;else if(u==="chunk")if(this._chunkProcessorSize){let d=this._chunkProcessorBuffer;this._chunkProcessorBuffer={raw:M.mergeBuffers(d.raw,f.raw),mono:M.mergeBuffers(d.mono,f.mono)},this._chunkProcessorBuffer.mono.byteLength>=this._chunkProcessorSize&&(this._chunkProcessor(this._chunkProcessorBuffer),this._chunkProcessorBuffer={raw:new ArrayBuffer(0),mono:new ArrayBuffer(0)});}else this._chunkProcessor(f);};let n=s.connect(r),a=t.createAnalyser();return a.fftSize=8192,a.smoothingTimeConstant=.1,n.connect(a),this.outputToSpeakers&&(console.warn(`Warning: Output to speakers may affect sound quality,
especially due to system audio feedback preventative measures.
use only for debugging`),a.connect(t.destination)),this.source=s,this.node=n,this.analyser=a,this.processor=r,!0}getFrequencies(e="frequency",t=-100,s=-30){if(!this.processor)throw new Error("Session ended: please call .begin() first");return L.getFrequencies(this.analyser,this.sampleRate,null,e,t,s)}async pause(){if(this.processor){if(!this.recording)throw new Error("Already paused: please call .record() first")}else throw new Error("Session ended: please call .begin() first");return this._chunkProcessorBuffer.raw.byteLength&&this._chunkProcessor(this._chunkProcessorBuffer),this.log("Pausing ..."),await this._event("stop"),this.recording=!1,!0}async record(e=()=>{},t=8192){if(this.processor){if(this.recording)throw new Error("Already recording: please call .pause() first");if(typeof e!="function")throw new Error("chunkProcessor must be a function")}else throw new Error("Session ended: please call .begin() first");return this._chunkProcessor=e,this._chunkProcessorSize=t,this._chunkProcessorBuffer={raw:new ArrayBuffer(0),mono:new ArrayBuffer(0)},this.log("Recording ..."),await this._event("start"),this.recording=!0,!0}async clear(){if(!this.processor)throw new Error("Session ended: please call .begin() first");return await this._event("clear"),!0}async read(){if(!this.processor)throw new Error("Session ended: please call .begin() first");return this.log("Reading ..."),await this._event("read")}async save(e=!1){if(!this.processor)throw new Error("Session ended: please call .begin() first");if(!e&&this.recording)throw new Error("Currently recording: please call .pause() first, or call .save(true) to force");this.log("Exporting ...");let t=await this._event("export");return new M().pack(this.sampleRate,t.audio)}async end(){if(!this.processor)throw new Error("Session ended: please call .begin() first");let e=this.processor;this.log("Stopping ..."),await this._event("stop"),this.recording=!1,this.stream.getTracks().forEach(a=>a.stop()),this.log("Exporting ...");let s=await this._event("export",{},e);return this.processor.disconnect(),this.source.disconnect(),this.node.disconnect(),this.analyser.disconnect(),this.stream=null,this.processor=null,this.source=null,this.node=null,new M().pack(this.sampleRate,s.audio)}async quit(){return this.listenForDeviceChange(null),this.processor&&await this.end(),!0}};globalThis.WavRecorder=K;var Et=`
class StreamProcessor extends AudioWorkletProcessor {
constructor() {
super();
this.hasStarted = false;
this.hasInterrupted = false;
this.outputBuffers = [];
this.bufferLength = 128;
this.write = { buffer: new Float32Array(this.bufferLength), trackId: null };
this.writeOffset = 0;
this.trackSampleOffsets = {};
this.port.onmessage = (event) => {
if (event.data) {
const payload = event.data;
if (payload.event === 'write') {
const int16Array = payload.buffer;
const float32Array = new Float32Array(int16Array.length);
for (let i = 0; i < int16Array.length; i++) {
float32Array[i] = int16Array[i] / 0x8000; // Convert Int16 to Float32
}
this.writeData(float32Array, payload.trackId);
} else if (
payload.event === 'offset' ||
payload.event === 'interrupt'
) {
const requestId = payload.requestId;
const trackId = this.write.trackId;
const offset = this.trackSampleOffsets[trackId] || 0;
this.port.postMessage({
event: 'offset',
requestId,
trackId,
offset,
});
if (payload.event === 'interrupt') {
this.hasInterrupted = true;
}
} else {
throw new Error(\`Unhandled event "\${payload.event}"\`);
}
}
};
}
writeData(float32Array, trackId = null) {
let { buffer } = this.write;
let offset = this.writeOffset;
for (let i = 0; i < float32Array.length; i++) {
buffer[offset++] = float32Array[i];
if (offset >= buffer.length) {
this.outputBuffers.push(this.write);
this.write = { buffer: new Float32Array(this.bufferLength), trackId };
buffer = this.write.buffer;
offset = 0;
}
}
this.writeOffset = offset;
return true;
}
process(inputs, outputs, parameters) {
const output = outputs[0];
const outputChannelData = output[0];
const outputBuffers = this.outputBuffers;
if (this.hasInterrupted) {
this.port.postMessage({ event: 'stop' });
return false;
} else if (outputBuffers.length) {
this.hasStarted = true;
const { buffer, trackId } = outputBuffers.shift();
for (let i = 0; i < outputChannelData.length; i++) {
outputChannelData[i] = buffer[i] || 0;
}
if (trackId) {
this.trackSampleOffsets[trackId] =
this.trackSampleOffsets[trackId] || 0;
this.trackSampleOffsets[trackId] += buffer.length;
}
return true;
} else if (this.hasStarted) {
this.port.postMessage({ event: 'stop' });
return false;
} else {
return true;
}
}
}
registerProcessor('stream_processor', StreamProcessor);
`,Rt=new Blob([Et],{type:"application/javascript"}),Ft=URL.createObjectURL(Rt),Ze=Ft;var G=class{constructor({sampleRate:e=24e3,onStop:t}={}){this.scriptSrc=Ze,this.onStop=t,this.sampleRate=e,this.context=null,this.stream=null,this.analyser=null,this.trackSampleOffsets={},this.interruptedTrackIds={};}async connect(){this.context=new AudioContext({sampleRate:this.sampleRate}),this.context.state==="suspended"&&await this.context.resume();try{await this.context.audioWorklet.addModule(this.scriptSrc);}catch(t){throw console.error(t),new Error(`Could not add audioWorklet module: ${this.scriptSrc}`,{cause:t})}let e=this.context.createAnalyser();return e.fftSize=8192,e.smoothingTimeConstant=.1,this.analyser=e,!0}getFrequencies(e="frequency",t=-100,s=-30){if(!this.analyser)throw new Error("Not connected, please call .connect() first");return L.getFrequencies(this.analyser,this.sampleRate,null,e,t,s)}_start(){let e=new AudioWorkletNode(this.context,"stream_processor");return e.connect(this.context.destination),e.port.onmessage=t=>{let{event:s}=t.data;if(s==="stop")this.onStop?.(),e.disconnect(),this.stream=null;else if(s==="offset"){let{requestId:r,trackId:n,offset:a}=t.data,i=a/this.sampleRate;this.trackSampleOffsets[r]={trackId:n,offset:a,currentTime:i};}},this.analyser.disconnect(),e.connect(this.analyser),this.stream=e,!0}add16BitPCM(e,t="default"){if(typeof t!="string")throw new Error("trackId must be a string");if(this.interruptedTrackIds[t])return;this.stream||this._start();let s;if(e instanceof Int16Array)s=e;else if(e instanceof ArrayBuffer)s=new Int16Array(e);else throw new Error("argument must be Int16Array or ArrayBuffer");return this.stream.port.postMessage({event:"write",buffer:s,trackId:t}),s}async getTrackSampleOffset(e=!1){if(!this.stream)return null;let t=crypto.randomUUID();this.stream.port.postMessage({event:e?"interrupt":"offset",requestId:t});let s;for(;!s;)s=this.trackSampleOffsets[t],await new Promise(n=>setTimeout(()=>n(),1));let{trackId:r}=s;return e&&r&&(this.interruptedTrackIds[r]=!0),s}async interrupt(){return this.getTrackSampleOffset(!0)}};globalThis.WavStreamPlayer=G;var me=atom({key:"ThreadIdToResume",default:void 0}),nt=atom({key:"ResumeThreadErrorState",default:void 0}),ge=atom({key:"ChatProfile",default:void 0}),et=atom({key:"SessionId",default:v4()}),ie=selector({key:"SessionIdSelector",get:({get:o})=>o(et),set:({set:o},e)=>o(et,e instanceof DefaultValue?v4():e)}),J=atom({key:"Session",dangerouslyAllowMutability:!0,default:void 0}),Q=atom({key:"Actions",default:[]}),Y=atom({key:"Messages",dangerouslyAllowMutability:!0,default:[]}),rt=atom({key:"Commands",default:[]}),ot=atom({key:"Modes",default:[]}),ye=atom({key:"TokenCount",default:0}),X=atom({key:"Loading",default:!1}),Z=atom({key:"AskUser",default:void 0}),Se=atom({key:"WavRecorder",dangerouslyAllowMutability:!0,default:new K}),ke=atom({key:"WavStreamPlayer",dangerouslyAllowMutability:!0,default:new G}),we=atom({key:"AudioConnection",default:"off"}),Ie=atom({key:"isAiSpeaking",default:!1}),Ae=atom({key:"CallFn",default:void 0}),O=atom({key:"ChatSettings",default:[]}),qe=selector({key:"ChatSettingsValue/Default",get:({get:o})=>{let e=o(O),t=(s,r)=>(Array.isArray(s)&&s.forEach(n=>{n&&(Array.isArray(n?.inputs)&&n.inputs.length>0?t(n.inputs,r):n?.id!==void 0&&(r[n.id]=n.initial));}),r);return t(e,{})}}),$=atom({key:"ChatSettingsValue",default:qe}),ee=atom({key:"DisplayElements",default:[]}),te=atom({key:"TasklistElements",default:[]}),se=atom({key:"FirstUserInteraction",default:void 0}),at=atom({key:"User",default:void 0}),it=atom({key:"ChainlitConfig",default:void 0}),ct=atom({key:"AuthConfig",default:void 0}),ut=atom({key:"ThreadHistory",default:{threads:void 0,currentThreadId:void 0,timeGroupedThreads:void 0,pageInfo:void 0},effects:[({setSelf:o,onSet:e})=>{e((t,s)=>{let r=t?.timeGroupedThreads;t?.threads&&!isEqual(t.threads,s?.timeGroupedThreads)&&(r=Je(t.threads)),o({...t,timeGroupedThreads:r});});}]}),Ce=atom({key:"SideView",default:void 0}),ne=atom({key:"CurrentThreadId",default:void 0}),Bt=o=>({setSelf:e,onSet:t})=>{let s=localStorage.getItem(o);if(s!=null)try{e(JSON.parse(s));}catch(r){console.error(`Error parsing localStorage value for key "${o}":`,r);}t((r,n,a)=>{a?localStorage.removeItem(o):localStorage.setItem(o,JSON.stringify(r));});},lt=atom({key:"Mcp",default:[],effects:[Bt("mcp_storage_key")]}),ve=atom({key:"favoriteMessagesState",default:[]});var Fs=()=>{let o=useRecoilValue(X),e=useRecoilValue(ee),t=useRecoilValue(te),s=useRecoilValue(Q),r=useRecoilValue(J),n=useRecoilValue(Z),a=useRecoilValue(Ae),i=useRecoilValue(O),u=useRecoilValue($),h=useRecoilValue(qe),f=r?.socket.connected&&!r?.error,d=!f||o||n?.spec.type==="file"||n?.spec.type==="action"||n?.spec.type==="element";return {actions:s,askUser:n,callFn:a,chatSettingsDefaultValue:h,chatSettingsInputs:i,chatSettingsValue:u,connected:f,disabled:d,elements:e,error:r?.error,loading:o,tasklists:t}};var Bs=o=>{let e=[];for(let t of o)e=D(e,t);return e},Ls=(o,e)=>{if(o.length-1===e)return !0;for(let t=e+1;t<o.length;t++)if(!o[t].streaming)return !1;return !0},D=(o,e)=>pt(o,e.id)?xe(o,e.id,e):"parentId"in e&&e.parentId?dt(o,e.parentId,e):"indent"in e&&e.indent&&e.indent>0?ft(o,e.indent,e):[...o,e],ft=(o,e,t,s=0)=>{if(o.length===0)return [t];let r=o.length-1,n=o[r],a=n.steps||[];if(s+1===e){let i={...n,steps:[...a,t]},u=[...o];return u[r]=i,u}else {let i=ft(a,e,t,s+1);if(i===a)return o;let u=[...o];return u[r]={...n,steps:i},u}},dt=(o,e,t)=>{let s=!1,r=o.map(n=>{if(isEqual(n.id,e))return s=!0,{...n,steps:n.steps?[...n.steps,t]:[t]};if(pt(o,e)&&n.steps){let a=dt(n.steps,e,t);if(a!==n.steps)return s=!0,{...n,steps:a}}return n});return s?r:o},ht=(o,e)=>{for(let t of o){if(isEqual(t.id,e))return t;if(t.steps&&t.steps.length>0){let s=ht(t.steps,e);if(s)return s}}},pt=(o,e)=>ht(o,e)!==void 0,xe=(o,e,t)=>{let s=!1,r=o.map(n=>{if(isEqual(n.id,e))return s=!0,{...n,...t};if(n.steps){let a=xe(n.steps,e,t);if(a!==n.steps)return s=!0,{...n,steps:a}}return n});return s?r:o},Ve=(o,e)=>{let t=!1,s=o.reduce((r,n)=>{if(n.id===e)return t=!0,r;if(n.steps){let a=Ve(n.steps,e);if(a!==n.steps)return t=!0,r.push({...n,steps:a}),r}return r.push(n),r},[]);return t?s:o},je=(o,e,t,s,r)=>{let n=!1,a=o.map(i=>{if(isEqual(i.id,e)){n=!0;let u={...i};return "content"in u&&u.content!==void 0?s?u.content=t:u.content+=t:r?"input"in u&&u.input!==void 0&&(s?u.input=t:u.input+=t):"output"in u&&u.output!==void 0&&(s?u.output=t:u.output+=t),u}else if(i.steps){let u=je(i.steps,e,t,s,r);if(u!==i.steps)return n=!0,{...i,steps:u}}return i});return n?a:o};var q=()=>{let[o,e]=useRecoilState(ct),[t,s]=useRecoilState(at),r=useSetRecoilState(ut);return {authConfig:o,setAuthConfig:e,user:t,setUser:s,setThreadHistory:r}};var Ot=async(o,e)=>(await o.get(e))?.json(),$t=o=>{let e=new oe("","webapp");return Object.assign(e,o),e};function re(o,{...e}={}){let t=useContext(V),{setUser:s}=q(),r=useMemo(()=>([a])=>{e.onErrorRetry||(e.onErrorRetry=(...u)=>{let[h]=u;if(h.status===401){s(null);return}return SWRConfig.defaultValue.onErrorRetry(...u)});let i=$t(t);return i.on401=i.onError=void 0,Ot(i,a)},[t]),n=useMemo(()=>o?[o]:null,[o]);return Vt(n,r,e)}var yt=()=>{let{authConfig:o,setAuthConfig:e}=q(),{data:t,isLoading:s}=re(o?null:"/auth/config");return useEffect(()=>{t&&e(t);},[t,e]),{authConfig:o,isLoading:s}};var St=()=>{let o=useContext(V),{setUser:e,setThreadHistory:t}=q();return {logout:async(r=!1)=>{await o.logout(),e(void 0),t(void 0),r&&window.location.reload();}}};var wt=()=>{let{user:o,setUser:e}=q(),{data:t,error:s,mutate:r}=re("/user");return useEffect(()=>{t&&e(t);},[t,e]),useEffect(()=>{s&&e(null);},[s]),{user:o,setUserFromAPI:r}};var It=()=>{let{authConfig:o}=yt(),{logout:e}=St(),{user:t,setUserFromAPI:s}=wt(),r=!!o&&(!o.requireLogin||t!==void 0);return o&&!o.requireLogin?{data:o,user:null,isReady:r,isAuthenticated:!0,logout:()=>Promise.resolve(),setUserFromAPI:()=>Promise.resolve()}:{data:o,user:t,isReady:r,isAuthenticated:!!t,logout:e,setUserFromAPI:s}};var Te=class extends Error{constructor(t,s,r){super(t);this.status=s,this.detail=r;}toString(){return this.detail?`${this.message}: ${this.detail}`:this.message}},Oe=class{constructor(e,t,s,r,n){this.httpEndpoint=e;this.type=t;this.additionalQueryParams=s;this.on401=r;this.onError=n;}buildEndpoint(e){let t=`${this.httpEndpoint}${e}`;this.httpEndpoint.endsWith("/")&&(t=`${this.httpEndpoint.slice(0,-1)}${e}`);let s=new URL(t);if(this.additionalQueryParams){let r=new URLSearchParams(this.additionalQueryParams),n=s.search?"&":"?";s.search=s.search+`${n}${r.toString()}`;}return s.toString()}async getDetailFromErrorResponse(e){try{return (await e.json())?.detail}catch(t){console.error("Unable to parse error response",t);}}handleRequestError(e){e instanceof Te&&(e.status===401&&this.on401&&this.on401(),this.onError&&this.onError(e)),console.error(e);}async fetch(e,t,s,r,n={}){try{let a;s instanceof FormData?a=s:(n["Content-Type"]="application/json",a=s?JSON.stringify(s):null);let i=await fetch(this.buildEndpoint(t),{method:e,credentials:"include",headers:n,signal:r,body:a});if(!i.ok){let u=await this.getDetailFromErrorResponse(i);throw new Te(i.statusText,i.status,u)}return i}catch(a){throw this.handleRequestError(a),a}}async get(e){return await this.fetch("GET",e)}async post(e,t,s){return await this.fetch("POST",e,t,s)}async put(e,t){return await this.fetch("PUT",e,t)}async patch(e,t){return await this.fetch("PATCH",e,t)}async delete(e,t){return await this.fetch("DELETE",e,t)}},oe=class extends Oe{async headerAuth(){return (await this.post("/auth/header",{})).json()}async jwtAuth(e){return (await this.fetch("POST","/auth/jwt",void 0,void 0,{Authorization:`Bearer ${e}`})).json()}async stickyCookie(e){return (await this.fetch("POST","/set-session-cookie",{session_id:e})).json()}async passwordAuth(e){return (await this.post("/login",e)).json()}async getUser(){return (await this.get("/user")).json()}async logout(){return (await this.post("/logout",{})).json()}async setFeedback(e,t){return (await this.put("/feedback",{feedback:e,sessionId:t})).json()}async deleteFeedback(e){return (await this.delete("/feedback",{feedbackId:e})).json()}async listThreads(e,t){return (await this.post("/project/threads",{pagination:e,filter:t})).json()}async renameThread(e,t){return (await this.put("/project/thread",{threadId:e,name:t})).json()}async deleteThread(e){return (await this.delete("/project/thread",{threadId:e})).json()}uploadFile(e,t,s,r){let n=new XMLHttpRequest;n.withCredentials=!0;let a=new Promise((i,u)=>{let h=new FormData;h.append("file",e);let f=r?`&ask_parent_id=${r}`:"";n.open("POST",this.buildEndpoint(`/project/file?session_id=${s}${f}`),!0),n.upload.onprogress=function(d){if(d.lengthComputable){let y=d.loaded/d.total*100;t(y);}},n.onload=function(){if(n.status===200){let y=JSON.parse(n.responseText);i(y);return}let d=n.getResponseHeader("Content-Type");if(d&&d.includes("application/json")){let y=JSON.parse(n.responseText);u(y.detail);}else u("Upload failed");},n.onerror=function(){u("Upload error");},n.send(h);});return {xhr:n,promise:a}}async callAction(e,t){return (await this.post("/project/action",{sessionId:t,action:e})).json()}async updateElement(e,t){return (await this.put("/project/element",{sessionId:t,element:e})).json()}async deleteElement(e,t){return (await this.delete("/project/element",{sessionId:t,element:e})).json()}async connectStdioMCP(e,t,s){return (await this.post("/mcp",{sessionId:e,name:t,fullCommand:s,clientType:"stdio"})).json()}async connectSseMCP(e,t,s,r){return (await this.post("/mcp",{sessionId:e,name:t,url:s,...r?{headers:r}:{},clientType:"sse"})).json()}async connectStreamableHttpMCP(e,t,s,r){return (await this.post("/mcp",{sessionId:e,name:t,url:s,...r?{headers:r}:{},clientType:"streamable-http"})).json()}async disconnectMcp(e,t){return (await this.delete("/mcp",{sessionId:e,name:t})).json()}getElementUrl(e,t){let s=`?session_id=${t}`;return this.buildEndpoint(`/project/file/${e}${s}`)}getLogoEndpoint(e,t){return t||this.buildEndpoint(`/logo?theme=${e}`)}getOAuthEndpoint(e){return this.buildEndpoint(`/auth/oauth/${e}`)}async shareThread(e,t){return (await this.put("/project/thread/share",{threadId:e,isShared:t})).json()}};var yn=void 0,V=createContext(new oe("http://localhost:8000","webapp"));var At=()=>{let o=useContext(V),e=useRecoilValue(J),t=useRecoilValue(Z),s=useRecoilValue(ie),r=useResetRecoilState(O),n=useResetRecoilState(ie),a=useResetRecoilState($),i=useSetRecoilState(se),u=useSetRecoilState(X),h=useSetRecoilState(Y),f=useSetRecoilState(ee),d=useSetRecoilState(te),y=useSetRecoilState(Q),S=useSetRecoilState(ye),k=useSetRecoilState(me),w=useSetRecoilState(Ce),U=useSetRecoilState(ne),N=useSetRecoilState(ve),j=useCallback(()=>{e?.socket.emit("clear_session"),e?.socket.disconnect(),k(void 0),n(),i(void 0),h([]),f([]),d([]),y([]),S(0),r(),a(),w(void 0),U(void 0);},[e]),T=useCallback((g,b=[])=>{g.id||(g.id=v4()),g.createdAt||(g.createdAt=new Date().toISOString()),h(R=>D(R,g)),e?.socket.emit("client_message",{message:g,fileReferences:b});},[e?.socket]),ae=useCallback(g=>{e?.socket.emit("edit_message",{message:g});},[e?.socket]),ue=useCallback(g=>{let b=!(g.metadata?.favorite??!1),R={...g.metadata||{},favorite:b};h(W=>W.map(P=>P.id===g.id?{...P,metadata:{...P.metadata||{},favorite:b}}:P));let H={...g,metadata:R};N(W=>{if(b){let P=W.filter(De=>De.id!==g.id);return [H,...P]}return W.filter(P=>P.id!==g.id)}),e?.socket.emit("message_favorite",{message:H});},[e?.socket,N,h]),_e=useCallback(g=>{e?.socket.emit("window_message",g);},[e?.socket]),Pe=useCallback(()=>{e?.socket.emit("audio_start");},[e?.socket]),z=useCallback((g,b,R,H)=>{e?.socket.emit("audio_chunk",{isStart:g,mimeType:b,elapsedTime:R,data:H});},[e?.socket]),le=useCallback(()=>{e?.socket.emit("audio_end");},[e?.socket]),B=useCallback(g=>{t&&(t.parentId&&(g.parentId=t.parentId),h(b=>D(b,g)),t.callback(g));},[t]),Ee=useCallback(g=>{e?.socket.emit("chat_settings_change",g);},[e?.socket]),Re=useCallback(g=>{e?.socket.emit("chat_settings_edit",g);},[e?.socket]),fe=useCallback(()=>{h(g=>g.map(b=>(b.streaming=!1,b))),u(!1),e?.socket.emit("stop");},[e?.socket]);return {uploadFile:useCallback((g,b,R)=>o.uploadFile(g,b,s,R),[s]),clear:j,replyMessage:B,sendMessage:T,editMessage:ae,windowMessage:_e,startAudioStream:Pe,sendAudioChunk:z,endAudioStream:le,stopTask:fe,setIdToResume:k,updateChatSettings:Ee,editChatSettings:Re,toggleMessageFavorite:ue}};var Mn=()=>{let o=useRecoilValue(Y),e=useRecoilValue(se);return {threadId:useRecoilValue(ne),messages:o,firstInteraction:e}};var qn=()=>{let o=useContext(V),e=useRecoilValue(ie),[t,s]=useRecoilState(J),r=useSetRecoilState(Ie),n=useSetRecoilState(we),a=useResetRecoilState($),i=useSetRecoilState($),u=useSetRecoilState(se),h=useSetRecoilState(X),f=useSetRecoilState(lt),d=useRecoilValue(ke),y=useRecoilValue(Se),S=useSetRecoilState(Y),k=useSetRecoilState(Z),w=useSetRecoilState(Ae),U=useSetRecoilState(rt),N=useSetRecoilState(ot),j=useSetRecoilState(Ce),T=useSetRecoilState(ee),ae=useSetRecoilState(te),ue=useSetRecoilState(Q),_e=useSetRecoilState(O),Pe=useSetRecoilState(ye),[z,le]=useRecoilState(ge),B=useRecoilValue(me),Ee=useSetRecoilState(nt),Re=useSetRecoilState(ve),[fe,Fe]=useRecoilState(ne);useEffect(()=>{t?.socket&&(t.socket.auth.threadId=fe||"");},[fe]);let g=useCallback(async({transports:H,userEnv:W})=>{let{protocol:P,host:De,pathname:Ue}=new URL(o.httpEndpoint),bt=`${P}//${De}`,xt=Ue&&Ue!=="/"?`${Ue}/ws/socket.io`:"/ws/socket.io";try{await o.stickyCookie(e);}catch(c){console.error(`Failed to set sticky session cookie: ${c}`);}let p=Xt(bt,{path:xt,withCredentials:!0,transports:H,auth:{clientType:o.type,sessionId:e,threadId:B||"",userEnv:JSON.stringify(W),chatProfile:z?encodeURIComponent(z):""}});s(c=>(c?.socket?.removeAllListeners(),c?.socket?.close(),{socket:p})),p.on("connect",()=>{p.emit("connection_successful"),s(c=>({...c,error:!1})),p.emit("fetch_favorites"),f(c=>c.map(l=>{let m;return l.clientType==="sse"?m=o.connectSseMCP(e,l.name,l.url):l.clientType==="streamable-http"?m=o.connectStreamableHttpMCP(e,l.name,l.url,l.headers||{}):m=o.connectStdioMCP(e,l.name,l.command),m.then(async({success:C,mcp:v})=>{f(Be=>Be.map(de=>de.name===v.name?{...de,status:C?"connected":"failed",tools:v?v.tools:de.tools}:de));}).catch(()=>{f(C=>C.map(v=>v.name===l.name?{...v,status:"failed"}:v));}),{...l,status:"connecting"}}));}),p.on("connect_error",c=>{s(l=>({...l,error:!0}));}),p.on("task_start",()=>{h(!0);}),p.on("task_end",()=>{h(!1);}),p.on("reload",()=>{p.emit("clear_session"),window.location.reload();}),p.on("audio_connection",async c=>{if(c==="on"){let l=!0,m=Date.now(),C="pcm16";try{await y.begin(),await d.connect(),await y.record(async v=>{let Be=Date.now()-m;p.emit("audio_chunk",{isStart:l,mimeType:C,elapsedTime:Be,data:v.mono}),l=!1;}),d.onStop=()=>r(!1);}catch{try{await y.end();}catch{}await d.interrupt(),p.emit("audio_end"),n("off");return}}else await y.end(),await d.interrupt();n(c);}),p.on("audio_chunk",c=>{d.add16BitPCM(c.data,c.track),r(!0);}),p.on("audio_interrupt",()=>{d.interrupt();}),p.on("resume_thread",c=>{let l=!!c?.metadata?.viewer_read_only;!l&&B&&c.id!==B&&(window.location.href=`/thread/${c.id}`),!l&&B&&Fe(c.id);let m=[];for(let v of c.steps)m=D(m,v);c.metadata?.chat_profile&&le(c.metadata?.chat_profile),c.metadata?.chat_settings&&i(c.metadata?.chat_settings),S(m);let C=c.elements||[];ae(C.filter(v=>v.type==="tasklist")),T(C.filter(v=>["avatar","tasklist"].indexOf(v.type)===-1));}),p.on("resume_thread_error",c=>{Ee(c);}),p.on("new_message",c=>{S(l=>D(l,c));}),p.on("first_interaction",c=>{u(c.interaction),Fe(c.thread_id);}),p.on("update_message",c=>{S(l=>xe(l,c.id,c));}),p.on("delete_message",c=>{S(l=>Ve(l,c.id));}),p.on("stream_start",c=>{S(l=>D(l,c));}),p.on("stream_token",({id:c,token:l,isSequence:m,isInput:C})=>{S(v=>je(v,c,l,m,C));}),p.on("ask",({msg:c,spec:l},m)=>{k({spec:l,callback:m,parentId:c.parentId}),S(C=>D(C,c)),h(!1);}),p.on("ask_timeout",()=>{k(void 0),h(!1);}),p.on("clear_ask",()=>{k(void 0);}),p.on("call_fn",({name:c,args:l},m)=>{w({name:c,args:l,callback:m});}),p.on("clear_call_fn",()=>{w(void 0);}),p.on("call_fn_timeout",()=>{w(void 0);}),p.on("chat_settings",c=>{_e(c),a();}),p.on("set_commands",c=>{U(c);}),p.on("set_modes",c=>{N(c);}),p.on("set_favorites",c=>{Re(c);}),p.on("set_sidebar_title",c=>{j(l=>l?.title===c?l:{title:c,elements:l?.elements||[]});}),p.on("set_sidebar_elements",({elements:c,key:l})=>{c.length?(c.forEach(m=>{!m.url&&m.chainlitKey&&(m.url=o.getElementUrl(m.chainlitKey,e));}),j(m=>m?.key===l?m:{title:m?.title||"",elements:c,key:l})):j(void 0);}),p.on("element",c=>{!c.url&&c.chainlitKey&&(c.url=o.getElementUrl(c.chainlitKey,e)),c.type==="tasklist"?ae(l=>{let m=l.findIndex(C=>C.id===c.id);return m===-1?[...l,c]:[...l.slice(0,m),c,...l.slice(m+1)]}):T(l=>{let m=l.findIndex(C=>C.id===c.id);return m===-1?[...l,c]:[...l.slice(0,m),c,...l.slice(m+1)]});}),p.on("remove_element",c=>{T(l=>l.filter(m=>m.id!==c.id)),ae(l=>l.filter(m=>m.id!==c.id));}),p.on("action",c=>{ue(l=>[...l,c]);}),p.on("remove_action",c=>{ue(l=>{let m=l.findIndex(C=>C.id===c.id);return m===-1?l:[...l.slice(0,m),...l.slice(m+1)]});}),p.on("token_usage",c=>{Pe(l=>l+c);}),p.on("window_message",c=>{window.parent&&window.parent.postMessage(c,"*");}),p.on("toast",c=>{if(!c.message){console.warn("No message received for toast.");return}switch(c.type){case"info":toast.info(c.message);break;case"error":toast.error(c.message);break;case"success":toast.success(c.message);break;case"warning":toast.warning(c.message);break;default:toast(c.message);break}});},[s,e,B,z]),b=useCallback(debounce(g,200),[g]),R=useCallback(()=>{t?.socket&&(t.socket.removeAllListeners(),t.socket.close());},[t]);return {connect:b,disconnect:R,session:t,sessionId:e,chatProfile:z,idToResume:B,setChatProfile:le}};var zn=()=>{let[o,e]=useRecoilState(we),t=useRecoilValue(Se),s=useRecoilValue(ke),r=useRecoilValue(Ie),{startAudioStream:n,endAudioStream:a}=At(),i=useCallback(async()=>{e("connecting"),await n();},[n]),u=useCallback(async()=>{e("off"),await t.end(),await s.interrupt(),await a();},[a,t,s]);return {startConversation:i,endConversation:u,audioConnection:o,isAiSpeaking:r,wavRecorder:t,wavStreamPlayer:s}};var Qn=()=>{let[o,e]=useRecoilState(it),{isAuthenticated:t}=It(),s=useRecoilValue(ge),r=navigator.language||"en-US",n=useRef(s),a=t?`/project/settings?language=${r}${s?`&chat_profile=${encodeURIComponent(s)}`:""}`:null,i=t&&!o,{data:u,error:h,isLoading:f}=re(i?a:null);return useEffect(()=>{u&&e(u);},[u,e]),useEffect(()=>{n.current!==s&&(e(void 0),n.current=s);},[s,e]),{config:o,error:h,isLoading:f,language:r}};var Ge=new WeakMap,ns=(o,e,t=!1,s=!1)=>{let r,n,a;if(s&&(n=e.toString(),a=t.toString(),r=Ge.has(o)?Ge.get(o):{},Ge.set(o,r),r[n]=r[n]||{},r[n][a]))return r[n][a];let i=o.length,u=new Array(e);if(e<=i){u.fill(0);let h=new Array(e).fill(0);for(let f=0;f<i;f++){let d=Math.floor(f*(e/i));t?u[d]=Math.max(u[d],Math.abs(o[f])):u[d]+=Math.abs(o[f]),h[d]++;}if(!t)for(let f=0;f<u.length;f++)u[f]=u[f]/h[f];}else for(let h=0;h<e;h++){let f=h*(i-1)/(e-1),d=Math.floor(f),y=Math.ceil(f),S=f-d;y>=i?u[h]=o[i-1]:u[h]=o[d]*(1-S)+o[y]*S;}return s&&(r[n][a]=u),u},rs={drawBars:(o,e,t,s,r,n=0,a=0,i=0,u=!1)=>{n=Math.floor(Math.min(n,(t-i)/(Math.max(a,1)+i))),n||(n=Math.floor((t-i)/(Math.max(a,1)+i))),a||(a=(t-i)/n-i);let h=ns(e,n,!0);for(let f=0;f<n;f++){let d=Math.abs(h[f]),y=Math.max(1,d*s),S=i+f*(a+i),k=u?(s-y)/2:s-y,w=Math.min(a/2,y/2);o.fillStyle=r,o.beginPath(),o.moveTo(S+w,k),o.lineTo(S+a-w,k),o.arcTo(S+a,k,S+a,k+w,w),o.lineTo(S+a,k+y-w),o.arcTo(S+a,k+y,S+a-w,k+y,w),o.lineTo(S+w,k+y),o.arcTo(S,k+y,S,k+y-w,w),o.lineTo(S,k+w),o.arcTo(S,k,S+w,k,w),o.closePath(),o.fill();}}};
export { Oe as APIBase, oe as ChainlitAPI, V as ChainlitContext, Te as ClientError, rs as WavRenderer, Q as actionState, D as addMessage, dt as addMessageToParent, Z as askUserState, we as audioConnectionState, ct as authState, Ae as callFnState, ge as chatProfileState, qe as chatSettingsDefaultValueSelector, O as chatSettingsInputsState, $ as chatSettingsValueState, rt as commandsState, it as configState, ne as currentThreadIdState, yn as defaultChainlitContext, Ve as deleteMessageById, ee as elementState, ve as favoriteMessagesState, Ot as fetcher, se as firstUserInteraction, pt as hasMessageById, Ie as isAiSpeakingState, Ls as isLastMessage, X as loadingState, lt as mcpState, Y as messagesState, ot as modesState, Bs as nestMessages, nt as resumeThreadErrorState, ie as sessionIdState, J as sessionState, Ce as sideViewState, te as tasklistState, ut as threadHistoryState, me as threadIdToResumeState, ye as tokenCountState, xe as updateMessageById, je as updateMessageContentById, re as useApi, zn as useAudio, It as useAuth, Fs as useChatData, At as useChatInteract, Mn as useChatMessages, qn as useChatSession, Qn as useConfig, at as userState, Se as wavRecorderState, ke as wavStreamPlayerState };
//# sourceMappingURL=out.js.map
//# sourceMappingURL=index.mjs.map