UNPKG

@chainlit/react-client

Version:

Websocket client to connect to your chainlit app.

312 lines (296 loc) 43.6 kB
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