@chainlit/react-client 0.2.0 → 0.2.2
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/README.md +1 -2
- package/dist/index.d.mts +55 -49
- package/dist/index.d.ts +55 -49
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +9 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +23 -9
package/dist/index.mjs
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { atom, selector, DefaultValue, useRecoilValue,
|
|
1
|
+
import { atom, selector, DefaultValue, useRecoilValue, useResetRecoilState, useSetRecoilState, useRecoilState } from 'recoil';
|
|
2
2
|
import { isEqual, debounce } from 'lodash';
|
|
3
3
|
import { v4 } from 'uuid';
|
|
4
|
-
import { createContext, useContext, useMemo,
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import Lt from 'socket.io-client';
|
|
4
|
+
import { createContext, useContext, useMemo, useCallback, useEffect } from 'react';
|
|
5
|
+
import xt, { SWRConfig } from 'swr';
|
|
6
|
+
import Ut from 'socket.io-client';
|
|
8
7
|
export { Socket } from 'socket.io-client';
|
|
9
8
|
|
|
10
|
-
var
|
|
9
|
+
var Be=o=>{let e={},t=new Date,s=new Date;s.setDate(t.getDate()-1);let n=new Date;n.setDate(t.getDate()-7);let r=new Date;return r.setDate(t.getDate()-30),o.forEach(i=>{let a=new Date(i.createdAt),l=a.toDateString()===t.toDateString(),h=a.toDateString()===s.toDateString(),u=a>=n,d=a>=r,p;l?p="Today":h?p="Yesterday":u?p="Previous 7 days":d?p="Previous 30 days":p=a.toLocaleString("default",{month:"long",year:"numeric"}).split(" ").slice(0,1).join(" "),e[p]||(e[p]=[]),e[p].push(i);}),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],ht=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"],D=[],ae=[];for(let o=1;o<=8;o++)for(let e=0;e<qe.length;e++){let t=qe[e];D.push(t/Math.pow(2,8-o)),ae.push(ht[e]+o);}var ie=[32,2e3],ve=D.filter((o,e)=>D[e]>ie[0]&&D[e]<ie[1]),Ve=ae.filter((o,e)=>D[e]>ie[0]&&D[e]<ie[1]);var _=class o{static getFrequencies(e,t,s,n="frequency",r=-100,i=-30){s||(s=new Float32Array(e.frequencyBinCount),e.getFloatFrequencyData(s));let a=t/2,l=1/s.length*a,h,u,d;if(n==="music"||n==="voice"){let g=n==="voice"?ve:D,y=Array(g.length).fill(r);for(let M=0;M<s.length;M++){let Q=M*l,X=s[M];for(let x=g.length-1;x>=0;x--)if(Q>g[x]){y[x]=Math.max(y[x],X);break}}h=y,u=n==="voice"?ve:D,d=n==="voice"?Ve:ae;}else h=Array.from(s),u=h.map((g,y)=>l*y),d=u.map(g=>`${g.toFixed(2)} Hz`);let p=h.map(g=>Math.max(0,Math.min((g-r)/(i-r),1)));return {values:new Float32Array(p),frequencies:u,labels:d}}constructor(e,t=null){if(this.fftResults=[],t){let{length:s,sampleRate:n}=t,r=new OfflineAudioContext({length:s,sampleRate:n}),i=r.createBufferSource();i.buffer=t;let a=r.createAnalyser();a.fftSize=8192,a.smoothingTimeConstant=.1,i.connect(a);let l=1/60,h=s/n,u=d=>{let p=l*d;p<h&&r.suspend(p).then(()=>{let S=new Float32Array(a.frequencyBinCount);a.getFloatFrequencyData(S),this.fftResults.push(S),u(d+1);}),d===1?r.startRendering():r.resume();};i.start(0),u(1),this.audio=e,this.context=r,this.analyser=a,this.sampleRate=n,this.audioBuffer=t;}else {let s=new AudioContext,n=s.createMediaElementSource(e),r=s.createAnalyser();r.fftSize=8192,r.smoothingTimeConstant=.1,n.connect(r),r.connect(s.destination),this.audio=e,this.context=s,this.analyser=r,this.sampleRate=this.context.sampleRate,this.audioBuffer=null;}}getFrequencies(e="frequency",t=-100,s=-30){let n=null;if(this.audioBuffer&&this.fftResults.length){let r=this.audio.currentTime/this.audio.duration,i=Math.min(r*this.fftResults.length|0,this.fftResults.length-1);n=this.fftResults[i];}return o.getFrequencies(this.analyser,this.sampleRate,n,e,t,s)}async resumeIfSuspended(){return this.context.state==="suspended"&&await this.context.resume(),!0}};globalThis.AudioAnalysis=_;var C=class{static floatTo16BitPCM(e){let t=new ArrayBuffer(e.length*2),s=new DataView(t),n=0;for(let r=0;r<e.length;r++,n+=2){let i=Math.max(-1,Math.min(1,e[r]));s.setInt16(n,i<0?i*32768:i*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:n,data:r}=t,i=["RIFF",this._packData(1,4+(8+24)+(8+8)),"WAVE","fmt ",this._packData(1,16),this._packData(0,1),this._packData(0,n.length),this._packData(1,e),this._packData(1,e*n.length*s/8),this._packData(0,n.length*s/8),this._packData(0,s),"data",this._packData(1,n[0].length*n.length*s/8),r],a=new Blob(i,{type:"audio/mpeg"}),l=URL.createObjectURL(a);return {blob:a,url:l,channelCount:n.length,sampleRate:e,duration:r.byteLength/(n.length*e*2)}}};globalThis.WavPacker=C;var dt=`
|
|
11
10
|
class AudioProcessor extends AudioWorkletProcessor {
|
|
12
11
|
|
|
13
12
|
constructor() {
|
|
@@ -214,9 +213,9 @@ class AudioProcessor extends AudioWorkletProcessor {
|
|
|
214
213
|
}
|
|
215
214
|
|
|
216
215
|
registerProcessor('audio_processor', AudioProcessor);
|
|
217
|
-
`,
|
|
216
|
+
`,pt=new Blob([dt],{type:"application/javascript"}),mt=URL.createObjectURL(pt),Oe=mt;var B=class{constructor({sampleRate:e=24e3,outputToSpeakers:t=!1,debug:s=!1}={}){this.scriptSrc=Oe,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 n=new AudioContext({sampleRate:t}),r,i;if(e instanceof Blob){if(s!==-1)throw new Error('Can not specify "fromSampleRate" when reading from Blob');i=e,r=await i.arrayBuffer();}else if(e instanceof ArrayBuffer){if(s!==-1)throw new Error('Can not specify "fromSampleRate" when reading from ArrayBuffer');r=e,i=new Blob([r],{type:"audio/wav"});}else {let u,d;if(e instanceof Int16Array){d=e,u=new Float32Array(e.length);for(let y=0;y<e.length;y++)u[y]=e[y]/32768;}else if(e instanceof Float32Array)u=e;else if(e instanceof Array)u=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=C.floatTo16BitPCM(u));let p={bitsPerSample:16,channels:[u],data:d};i=new C().pack(s,p).blob,r=await i.arrayBuffer();}let a=await n.decodeAudioData(r),l=a.getChannelData(0),h=URL.createObjectURL(i);return {blob:i,url:h,values:l,audioBuffer:a}}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 n={event:e,id:this._lastEventId++,data:t};s.port.postMessage(n);let r=new Date().valueOf();for(;!this.eventReceipts[n.id];){if(new Date().valueOf()-r>this.eventTimeout)throw new Error(`Timeout waiting for "${e}" event`);await new Promise(a=>setTimeout(()=>a(!0),1));}let i=this.eventReceipts[n.id];return delete this.eventReceipts[n.id],i}listenForDeviceChange(e){if(e===null&&this._deviceChangeCallback)navigator.mediaDevices.removeEventListener("devicechange",this._deviceChangeCallback),this._deviceChangeCallback=null;else if(e!==null){let t=0,s=[],n=i=>i.map(a=>a.deviceId).sort().join(","),r=async()=>{let i=++t,a=await this.listDevices();i===t&&n(s)!==n(a)&&(s=a,e(a.slice()));};navigator.mediaDevices.addEventListener("devicechange",r),r(),this._deviceChangeCallback=r;}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(n=>n.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(r=>r.kind==="audioinput"),s=t.findIndex(r=>r.deviceId==="default"),n=[];if(s!==-1){let r=t.splice(s,1)[0],i=t.findIndex(a=>a.groupId===r.groupId);i!==-1&&(r=t.splice(i,1)[0]),r.default=!0,n.push(r);}return n.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 a={audio:!0};e&&(a.audio={deviceId:{exact:e}}),this.stream=await navigator.mediaDevices.getUserMedia(a);}catch{throw new Error("Could not start media stream")}let t=new AudioContext({sampleRate:this.sampleRate}),s=t.createMediaStreamSource(this.stream);try{await t.audioWorklet.addModule(this.scriptSrc);}catch(a){throw console.error(a),new Error(`Could not add audioWorklet module: ${this.scriptSrc}`)}let n=new AudioWorkletNode(t,"audio_processor");n.port.onmessage=a=>{let{event:l,id:h,data:u}=a.data;if(l==="receipt")this.eventReceipts[h]=u;else if(l==="chunk")if(this._chunkProcessorSize){let d=this._chunkProcessorBuffer;this._chunkProcessorBuffer={raw:C.mergeBuffers(d.raw,u.raw),mono:C.mergeBuffers(d.mono,u.mono)},this._chunkProcessorBuffer.mono.byteLength>=this._chunkProcessorSize&&(this._chunkProcessor(this._chunkProcessorBuffer),this._chunkProcessorBuffer={raw:new ArrayBuffer(0),mono:new ArrayBuffer(0)});}else this._chunkProcessor(u);};let r=s.connect(n),i=t.createAnalyser();return i.fftSize=8192,i.smoothingTimeConstant=.1,r.connect(i),this.outputToSpeakers&&(console.warn(`Warning: Output to speakers may affect sound quality,
|
|
218
217
|
especially due to system audio feedback preventative measures.
|
|
219
|
-
use only for debugging`),
|
|
218
|
+
use only for debugging`),i.connect(t.destination)),this.source=s,this.node=r,this.analyser=i,this.processor=n,!0}getFrequencies(e="frequency",t=-100,s=-30){if(!this.processor)throw new Error("Session ended: please call .begin() first");return _.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 C().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(i=>i.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 C().pack(this.sampleRate,s.audio)}async quit(){return this.listenForDeviceChange(null),this.processor&&await this.end(),!0}};globalThis.WavRecorder=B;var gt=`
|
|
220
219
|
class StreamProcessor extends AudioWorkletProcessor {
|
|
221
220
|
constructor() {
|
|
222
221
|
super();
|
|
@@ -305,8 +304,8 @@ class StreamProcessor extends AudioWorkletProcessor {
|
|
|
305
304
|
}
|
|
306
305
|
|
|
307
306
|
registerProcessor('stream_processor', StreamProcessor);
|
|
308
|
-
`,kt=new Blob([yt],{type:"application/javascript"}),St=URL.createObjectURL(kt),Ke=St;var U=class{constructor({sampleRate:e=24e3,onStop:t}={}){this.scriptSrc=Ke,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}`)}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 F.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:n,trackId:r,offset:o}=t.data,a=o/this.sampleRate;this.trackSampleOffsets[n]={trackId:r,offset:o,currentTime:a};}},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(r=>setTimeout(()=>r(),1));let{trackId:n}=s;return e&&n&&(this.interruptedTrackIds[n]=!0),s}async interrupt(){return this.getTrackSampleOffset(!0)}};globalThis.WavStreamPlayer=U;var ie=atom({key:"ThreadIdToResume",default:void 0}),Je=atom({key:"ChatProfile",default:void 0}),Ge=atom({key:"SessionId",default:v4()}),Z=selector({key:"SessionIdSelector",get:({get:i})=>i(Ge),set:({set:i},e)=>i(Ge,e instanceof DefaultValue?v4():e)}),V=atom({key:"Session",dangerouslyAllowMutability:!0,default:void 0}),O=atom({key:"Actions",default:[]}),j=atom({key:"Messages",dangerouslyAllowMutability:!0,default:[]}),ae=atom({key:"TokenCount",default:0}),$=atom({key:"Loading",default:!1}),z=atom({key:"AskUser",default:void 0}),ce=atom({key:"WavRecorder",dangerouslyAllowMutability:!0,default:new q}),le=atom({key:"WavStreamPlayer",dangerouslyAllowMutability:!0,default:new U}),ue=atom({key:"AudioConnection",default:"off"}),fe=atom({key:"isAiSpeaking",default:!1}),he=atom({key:"CallFn",default:void 0}),L=atom({key:"ChatSettings",default:[]}),_e=selector({key:"ChatSettingsValue/Default",get:({get:i})=>i(L).reduce((t,s)=>(t[s.id]=s.initial,t),{})}),N=atom({key:"ChatSettingsValue",default:_e}),W=atom({key:"DisplayElements",default:[]}),H=atom({key:"TasklistElements",default:[]}),K=atom({key:"FirstUserInteraction",default:void 0}),G=atom({key:"AccessToken",default:void 0}),Qe=atom({key:"User",default:null}),Ze=atom({key:"ChainlitConfig",default:void 0}),et=atom({key:"AuthConfig",default:void 0}),tt=atom({key:"ThreadHistory",default:{threads:void 0,currentThreadId:void 0,timeGroupedThreads:void 0,pageInfo:void 0},effects:[({setSelf:i,onSet:e})=>{e((t,s)=>{let n=t?.timeGroupedThreads;t?.threads&&!isEqual(t.threads,s?.timeGroupedThreads)&&(n=ze(t.threads)),i({...t,timeGroupedThreads:n});});}]}),st=atom({key:"SideView",default:void 0}),X=atom({key:"CurrentThreadId",default:void 0});var ms=()=>{let i=useRecoilValue($),e=useRecoilValue(W),t=useRecoilValue(H),s=useRecoilValue(O),n=useRecoilValue(V),r=useRecoilValue(z),o=useRecoilValue(he),a=useRecoilValue(L),u=useRecoilValue(N),d=useRecoilValue(_e),c=n?.socket.connected&&!n?.error,f=!c||i||r?.spec.type==="file"||r?.spec.type==="action";return {actions:s,askUser:r,callFn:o,chatSettingsDefaultValue:d,chatSettingsInputs:a,chatSettingsValue:u,connected:c,disabled:f,elements:e,error:n?.error,loading:i,tasklists:t}};var ks=i=>{let e=[];for(let t of i)e=R(e,t);return e},Ss=(i,e)=>{if(i.length-1===e)return !0;for(let t=e+1;t<i.length;t++)if(!i[t].streaming)return !1;return !0},R=(i,e)=>pe(i,e.id)?me(i,e.id,e):"parentId"in e&&e.parentId?rt(i,e.parentId,e):"indent"in e&&e.indent&&e.indent>0?nt(i,e.indent,e):[...i,e],nt=(i,e,t,s=0)=>{let n=[...i];if(n.length===0)return [...n,t];{let r=n.length-1,o=n[r];return o.steps=o.steps||[],s+1===e?(o.steps=[...o.steps,t],n[r]={...o},n):(o.steps=nt(o.steps,e,t,s+1),n[r]={...o},n)}},rt=(i,e,t)=>{let s=[...i];for(let n=0;n<s.length;n++){let r=s[n];isEqual(r.id,e)?(r.steps=r.steps?[...r.steps,t]:[t],s[n]={...r}):pe(s,e)&&r.steps&&(r.steps=rt(r.steps,e,t),s[n]={...r});}return s},ot=(i,e)=>{for(let t of i){if(isEqual(t.id,e))return t;if(t.steps&&t.steps.length>0){let s=ot(t.steps,e);if(s)return s}}},pe=(i,e)=>ot(i,e)!==void 0,me=(i,e,t)=>{let s=[...i];for(let n=0;n<s.length;n++){let r=s[n];isEqual(r.id,e)?s[n]={steps:r.steps,...t}:pe(s,e)&&r.steps&&(r.steps=me(r.steps,e,t),s[n]={...r});}return s},De=(i,e)=>{let t=[...i];for(let s=0;s<t.length;s++){let n=t[s];n.id===e?t=[...t.slice(0,s),...t.slice(s+1)]:pe(t,e)&&n.steps&&(n.steps=De(n.steps,e),t[s]={...n});}return t},Me=(i,e,t,s,n)=>{let r=[...i];for(let o=0;o<r.length;o++){let a=r[o];isEqual(a.id,e)?("content"in a&&a.content!==void 0?s?a.content=t:a.content+=t:n?"input"in a&&a.input!==void 0&&(s?a.input=t:a.input+=t):"output"in a&&a.output!==void 0&&(s?a.output=t:a.output+=t),r[o]={...a}):a.steps&&(a.steps=Me(a.steps,e,t,s,n),r[o]={...a});}return r};var Ee="token";function Re(){try{return localStorage.getItem(Ee)}catch{return}}function it(i){try{return localStorage.setItem(Ee,i)}catch{return}}function ge(){try{return localStorage.removeItem(Ee)}catch{return}}var bt=async(i,e,t)=>(await i.get(e,t))?.json();function ye(i,{token:e,...t}={}){let s=useContext(B),n=useRecoilValue(G);n=e||n;let r=useMemo(()=>([a,u])=>bt(s,a,u),[s]),o=useMemo(()=>i?[i,n]:null,[i,n]);return vt(o,r,t)}var lt=()=>{let i=useContext(B),[e,t]=useRecoilState(et),[s,n]=useRecoilState(Qe),{data:r,isLoading:o}=ye(e?null:"/auth/config"),[a,u]=useRecoilState(G),d=useSetRecoilState(tt);useEffect(()=>{r&&t(r);},[r,t]);let c=!!(!o&&e),f=async(m=!1)=>{await i.logout(),n(null),ge(),u(""),d(void 0),m&&window.location.reload();},p=m=>{if(!m){f();return}try{let{exp:y,...C}=Ct(m);it(m),u(`Bearer ${m}`),n(C);}catch(y){console.error("Invalid token, clearing token from local storage","error:",y),f();}};useEffect(()=>{if(!s&&Re()){p(Re());return}},[]);let k=!!a;return e&&!e.requireLogin?{authConfig:e,user:null,isReady:c,isAuthenticated:!0,accessToken:"",logout:()=>{},setAccessToken:()=>{}}:{data:e,user:s,isAuthenticated:k,isReady:c,accessToken:a,logout:f,setAccessToken:p}};var ke=class extends Error{constructor(t,s){super(t);this.detail=s;}toString(){return this.detail?`${this.message}: ${this.detail}`:this.message}},Be=class{constructor(e,t,s,n){this.httpEndpoint=e;this.type=t;this.on401=s;this.onError=n;}buildEndpoint(e){return this.httpEndpoint.endsWith("/")?`${this.httpEndpoint.slice(0,-1)}${e}`:`${this.httpEndpoint}${e}`}checkToken(e){let t="Bearer ";return e.startsWith(t)?e:t+e}async fetch(e,t,s,n,r){try{let o={};s&&(o.Authorization=this.checkToken(s));let a;n instanceof FormData?a=n:(o["Content-Type"]="application/json",a=n?JSON.stringify(n):null);let u=await fetch(this.buildEndpoint(t),{method:e,headers:o,signal:r,body:a});if(!u.ok){let d=await u.json();throw u.status===401&&this.on401&&(ge(),this.on401()),new ke(u.statusText,d.detail)}return u}catch(o){throw o instanceof ke&&this.onError&&this.onError(o),console.error(o),o}}async get(e,t){return await this.fetch("GET",e,t)}async post(e,t,s,n){return await this.fetch("POST",e,s,t,n)}async put(e,t,s){return await this.fetch("PUT",e,s,t)}async patch(e,t,s){return await this.fetch("PATCH",e,s,t)}async delete(e,t,s){return await this.fetch("DELETE",e,s,t)}},Se=class extends Be{async headerAuth(){return (await this.post("/auth/header",{})).json()}async passwordAuth(e){return (await this.post("/login",e)).json()}async logout(){return (await this.post("/logout",{})).json()}async setFeedback(e,t){return (await this.put("/feedback",{feedback:e},t)).json()}async deleteFeedback(e,t){return (await this.delete("/feedback",{feedbackId:e},t)).json()}async listThreads(e,t,s){return (await this.post("/project/threads",{pagination:e,filter:t},s)).json()}async deleteThread(e,t){return (await this.delete("/project/thread",{threadId:e},t)).json()}uploadFile(e,t,s,n){let r=new XMLHttpRequest,o=new Promise((a,u)=>{let d=new FormData;d.append("file",e),r.open("POST",this.buildEndpoint(`/project/file?session_id=${s}`),!0),n&&r.setRequestHeader("Authorization",this.checkToken(n)),r.upload.onprogress=function(c){if(c.lengthComputable){let f=c.loaded/c.total*100;t(f);}},r.onload=function(){if(r.status===200){let c=JSON.parse(r.responseText);a(c);}else u("Upload failed");},r.onerror=function(){u("Upload error");},r.send(d);});return {xhr:r,promise:o}}getElementUrl(e,t){let s=`?session_id=${t}`;return this.buildEndpoint(`/project/file/${e}${s}`)}getLogoEndpoint(e){return this.buildEndpoint(`/logo?theme=${e}`)}getOAuthEndpoint(e){return this.buildEndpoint(`/auth/oauth/${e}`)}};var zs=void 0,B=createContext(new Se("http://localhost:8000","webapp"));var ut=()=>{let i=useContext(B),e=useRecoilValue(G),t=useRecoilValue(V),s=useRecoilValue(z),n=useRecoilValue(Z),r=useResetRecoilState(L),o=useResetRecoilState(Z),a=useResetRecoilState(N),u=useSetRecoilState(K),d=useSetRecoilState($),c=useSetRecoilState(j),f=useSetRecoilState(W),p=useSetRecoilState(H),k=useSetRecoilState(O),m=useSetRecoilState(ae),y=useSetRecoilState(ie),C=useSetRecoilState(st),Y=useSetRecoilState(X),J=useCallback(()=>{t?.socket.emit("clear_session"),t?.socket.disconnect(),y(void 0),o(),u(void 0),c([]),f([]),p([]),k([]),m(0),r(),a(),C(void 0),Y(void 0);},[t]),v=useCallback((I,x=[])=>{I.id||(I.id=v4()),I.createdAt||(I.createdAt=new Date().toISOString()),c(M=>R(M,I)),t?.socket.emit("client_message",{message:I,fileReferences:x});},[t?.socket]),ee=useCallback(I=>{t?.socket.emit("edit_message",{message:I});},[t?.socket]),te=useCallback(()=>{t?.socket.emit("audio_start");},[t?.socket]),se=useCallback((I,x,M,Q)=>{t?.socket.emit("audio_chunk",{isStart:I,mimeType:x,elapsedTime:M,data:Q});},[t?.socket]),Ae=useCallback(()=>{t?.socket.emit("audio_end");},[t?.socket]),ne=useCallback(I=>{s&&(c(x=>R(x,I)),s.callback(I));},[s]),xe=useCallback(I=>{t?.socket.emit("chat_settings_change",I);},[t?.socket]),ve=useCallback(()=>{c(I=>I.map(x=>(x.streaming=!1,x))),d(!1),t?.socket.emit("stop");},[t?.socket]),be=useCallback(I=>{let x=t?.socket;if(!x)return;let M=new Promise((Q,Ce)=>{x.once("action_response",g=>{g.status?Q(g):Ce(g);});});return x.emit("action_call",I),M},[t?.socket]);return {uploadFile:useCallback((I,x)=>i.uploadFile(I,x,n,e),[n,e]),callAction:be,clear:J,replyMessage:ne,sendMessage:v,editMessage:ee,startAudioStream:te,sendAudioChunk:se,endAudioStream:Ae,stopTask:ve,setIdToResume:y,updateChatSettings:xe}};var en=()=>{let i=useRecoilValue(j),e=useRecoilValue(K);return {threadId:useRecoilValue(X),messages:i,firstInteraction:e}};var un=()=>{let i=useContext(B),e=useRecoilValue(Z),[t,s]=useRecoilState(V),n=useSetRecoilState(fe),r=useSetRecoilState(ue),o=useResetRecoilState(N),a=useSetRecoilState(K),u=useSetRecoilState($),d=useRecoilValue(le),c=useRecoilValue(ce),f=useSetRecoilState(j),p=useSetRecoilState(z),k=useSetRecoilState(he),m=useSetRecoilState(W),y=useSetRecoilState(H),C=useSetRecoilState(O),Y=useSetRecoilState(L),J=useSetRecoilState(ae),[v,ee]=useRecoilState(Je),te=useRecoilValue(ie),[se,Ae]=useRecoilState(X);useEffect(()=>{t?.socket&&(t.socket.io.opts.extraHeaders["X-Chainlit-Thread-Id"]=se||"");},[se]);let ne=useCallback(({userEnv:be,accessToken:$e})=>{let{protocol:I,host:x,pathname:M}=new URL(i.httpEndpoint),Q=`${I}//${x}`,Ce=M&&M!=="/"?`${M}/ws/socket.io`:"/ws/socket.io",g=Lt(Q,{path:Ce,extraHeaders:{Authorization:$e||"","X-Chainlit-Client-Type":i.type,"X-Chainlit-Session-Id":e,"X-Chainlit-Thread-Id":te||"","user-env":JSON.stringify(be),"X-Chainlit-Chat-Profile":v?encodeURIComponent(v):""}});s(l=>(l?.socket?.removeAllListeners(),l?.socket?.close(),{socket:g})),g.on("connect",()=>{g.emit("connection_successful"),s(l=>({...l,error:!1}));}),g.on("connect_error",l=>{s(h=>({...h,error:!0}));}),g.on("task_start",()=>{u(!0);}),g.on("task_end",()=>{u(!1);}),g.on("reload",()=>{g.emit("clear_session"),window.location.reload();}),g.on("audio_connection",async l=>{if(l==="on"){let h=!0,S=Date.now(),A="pcm16";await c.begin(),await d.connect(),await c.record(async Te=>{let ht=Date.now()-S;g.emit("audio_chunk",{isStart:h,mimeType:A,elapsedTime:ht,data:Te.mono}),h=!1;}),d.onStop=()=>n(!1);}else await c.end(),await d.interrupt();r(l);}),g.on("audio_chunk",l=>{d.add16BitPCM(l.data,l.track),n(!0);}),g.on("audio_interrupt",()=>{d.interrupt();}),g.on("resume_thread",l=>{let h=[];for(let A of l.steps)h=R(h,A);l.metadata?.chat_profile&&ee(l.metadata?.chat_profile),f(h);let S=l.elements||[];y(S.filter(A=>A.type==="tasklist")),m(S.filter(A=>["avatar","tasklist"].indexOf(A.type)===-1));}),g.on("new_message",l=>{f(h=>R(h,l));}),g.on("first_interaction",l=>{a(l.interaction),Ae(l.thread_id);}),g.on("update_message",l=>{f(h=>me(h,l.id,l));}),g.on("delete_message",l=>{f(h=>De(h,l.id));}),g.on("stream_start",l=>{f(h=>R(h,l));}),g.on("stream_token",({id:l,token:h,isSequence:S,isInput:A})=>{f(Te=>Me(Te,l,h,S,A));}),g.on("ask",({msg:l,spec:h},S)=>{p({spec:h,callback:S}),f(A=>R(A,l)),u(!1);}),g.on("ask_timeout",()=>{p(void 0),u(!1);}),g.on("clear_ask",()=>{p(void 0);}),g.on("call_fn",({name:l,args:h},S)=>{k({name:l,args:h,callback:S});}),g.on("clear_call_fn",()=>{k(void 0);}),g.on("call_fn_timeout",()=>{k(void 0);}),g.on("chat_settings",l=>{Y(l),o();}),g.on("element",l=>{!l.url&&l.chainlitKey&&(l.url=i.getElementUrl(l.chainlitKey,e)),l.type==="tasklist"?y(h=>{let S=h.findIndex(A=>A.id===l.id);return S===-1?[...h,l]:[...h.slice(0,S),l,...h.slice(S+1)]}):m(h=>{let S=h.findIndex(A=>A.id===l.id);return S===-1?[...h,l]:[...h.slice(0,S),l,...h.slice(S+1)]});}),g.on("remove_element",l=>{m(h=>h.filter(S=>S.id!==l.id)),y(h=>h.filter(S=>S.id!==l.id));}),g.on("action",l=>{C(h=>[...h,l]);}),g.on("remove_action",l=>{C(h=>{let S=h.findIndex(A=>A.id===l.id);return S===-1?h:[...h.slice(0,S),...h.slice(S+1)]});}),g.on("token_usage",l=>{J(h=>h+l);});},[s,e,v]),xe=useCallback(debounce(ne,200),[ne]),ve=useCallback(()=>{t?.socket&&(t.socket.removeAllListeners(),t.socket.close());},[t]);return {connect:xe,disconnect:ve,session:t,sessionId:e,chatProfile:v,idToResume:te,setChatProfile:ee}};var gn=()=>{let[i,e]=useRecoilState(ue),t=useRecoilValue(ce),s=useRecoilValue(le),n=useRecoilValue(fe),{startAudioStream:r,endAudioStream:o}=ut(),a=useCallback(async()=>{e("connecting"),await r();},[r]),u=useCallback(async()=>{e("off"),await t.end(),await s.interrupt(),await o();},[o,t,s]);return {startConversation:a,endConversation:u,audioConnection:i,isAiSpeaking:n,wavRecorder:t,wavStreamPlayer:s}};var An=i=>{let[e,t]=useRecoilState(Ze),{isAuthenticated:s}=lt(),n=navigator.language||"en-US",{data:r,error:o,isLoading:a}=ye(!e&&s?`/project/settings?language=${n}`:null,{token:i});return useEffect(()=>{r&&t(r);},[r,t]),{config:e,error:o,isLoading:a,language:n}};var je=new WeakMap,Ot=(i,e,t=!1,s=!1)=>{let n,r,o;if(s&&(r=e.toString(),o=t.toString(),n=je.has(i)?je.get(i):{},je.set(i,n),n[r]=n[r]||{},n[r][o]))return n[r][o];let a=i.length,u=new Array(e);if(e<=a){u.fill(0);let d=new Array(e).fill(0);for(let c=0;c<a;c++){let f=Math.floor(c*(e/a));t?u[f]=Math.max(u[f],Math.abs(i[c])):u[f]+=Math.abs(i[c]),d[f]++;}if(!t)for(let c=0;c<u.length;c++)u[c]=u[c]/d[c];}else for(let d=0;d<e;d++){let c=d*(a-1)/(e-1),f=Math.floor(c),p=Math.ceil(c),k=c-f;p>=a?u[d]=i[a-1]:u[d]=i[f]*(1-k)+i[p]*k;}return s&&(n[r][o]=u),u},jt={drawBars:(i,e,t,s,n,r=0,o=0,a=0,u=!1)=>{r=Math.floor(Math.min(r,(t-a)/(Math.max(o,1)+a))),r||(r=Math.floor((t-a)/(Math.max(o,1)+a))),o||(o=(t-a)/r-a);let d=Ot(e,r,!0);for(let c=0;c<r;c++){let f=Math.abs(d[c]),p=Math.max(1,f*s),k=a+c*(o+a),m=u?(s-p)/2:s-p,y=Math.min(o/2,p/2);i.fillStyle=n,i.beginPath(),i.moveTo(k+y,m),i.lineTo(k+o-y,m),i.arcTo(k+o,m,k+o,m+y,y),i.lineTo(k+o,m+p-y),i.arcTo(k+o,m+p,k+o-y,m+p,y),i.lineTo(k+y,m+p),i.arcTo(k,m+p,k,m+p-y,y),i.lineTo(k,m+y),i.arcTo(k,m,k+y,m,y),i.closePath(),i.fill();}}};
|
|
307
|
+
`,yt=new Blob([gt],{type:"application/javascript"}),St=URL.createObjectURL(yt),je=St;var q=class{constructor({sampleRate:e=24e3,onStop:t}={}){this.scriptSrc=je,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}`)}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 _.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:n,trackId:r,offset:i}=t.data,a=i/this.sampleRate;this.trackSampleOffsets[n]={trackId:r,offset:i,currentTime:a};}},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(r=>setTimeout(()=>r(),1));let{trackId:n}=s;return e&&n&&(this.interruptedTrackIds[n]=!0),s}async interrupt(){return this.getTrackSampleOffset(!0)}};globalThis.WavStreamPlayer=q;var ce=atom({key:"ThreadIdToResume",default:void 0}),We=atom({key:"ChatProfile",default:void 0}),$e=atom({key:"SessionId",default:v4()}),te=selector({key:"SessionIdSelector",get:({get:o})=>o($e),set:({set:o},e)=>o($e,e instanceof DefaultValue?v4():e)}),V=atom({key:"Session",dangerouslyAllowMutability:!0,default:void 0}),O=atom({key:"Actions",default:[]}),j=atom({key:"Messages",dangerouslyAllowMutability:!0,default:[]}),ue=atom({key:"TokenCount",default:0}),$=atom({key:"Loading",default:!1}),z=atom({key:"AskUser",default:void 0}),le=atom({key:"WavRecorder",dangerouslyAllowMutability:!0,default:new B}),fe=atom({key:"WavStreamPlayer",dangerouslyAllowMutability:!0,default:new q}),he=atom({key:"AudioConnection",default:"off"}),de=atom({key:"isAiSpeaking",default:!1}),pe=atom({key:"CallFn",default:void 0}),U=atom({key:"ChatSettings",default:[]}),be=selector({key:"ChatSettingsValue/Default",get:({get:o})=>o(U).reduce((t,s)=>(t[s.id]=s.initial,t),{})}),N=atom({key:"ChatSettingsValue",default:be}),W=atom({key:"DisplayElements",default:[]}),H=atom({key:"TasklistElements",default:[]}),K=atom({key:"FirstUserInteraction",default:void 0}),He=atom({key:"User",default:void 0}),Ke=atom({key:"ChainlitConfig",default:void 0}),Ge=atom({key:"AuthConfig",default:void 0}),Ye=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 n=t?.timeGroupedThreads;t?.threads&&!isEqual(t.threads,s?.timeGroupedThreads)&&(n=Be(t.threads)),o({...t,timeGroupedThreads:n});});}]}),Je=atom({key:"SideView",default:void 0}),G=atom({key:"CurrentThreadId",default:void 0});var ms=()=>{let o=useRecoilValue($),e=useRecoilValue(W),t=useRecoilValue(H),s=useRecoilValue(O),n=useRecoilValue(V),r=useRecoilValue(z),i=useRecoilValue(pe),a=useRecoilValue(U),l=useRecoilValue(N),h=useRecoilValue(be),u=n?.socket.connected&&!n?.error,d=!u||o||r?.spec.type==="file"||r?.spec.type==="action";return {actions:s,askUser:r,callFn:i,chatSettingsDefaultValue:h,chatSettingsInputs:a,chatSettingsValue:l,connected:u,disabled:d,elements:e,error:n?.error,loading:o,tasklists:t}};var Ss=o=>{let e=[];for(let t of o)e=R(e,t);return e},ws=(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},R=(o,e)=>ge(o,e.id)?ye(o,e.id,e):"parentId"in e&&e.parentId?Xe(o,e.parentId,e):"indent"in e&&e.indent&&e.indent>0?Qe(o,e.indent,e):[...o,e],Qe=(o,e,t,s=0)=>{let n=[...o];if(n.length===0)return [...n,t];{let r=n.length-1,i=n[r];return i.steps=i.steps||[],s+1===e?(i.steps=[...i.steps,t],n[r]={...i},n):(i.steps=Qe(i.steps,e,t,s+1),n[r]={...i},n)}},Xe=(o,e,t)=>{let s=[...o];for(let n=0;n<s.length;n++){let r=s[n];isEqual(r.id,e)?(r.steps=r.steps?[...r.steps,t]:[t],s[n]={...r}):ge(s,e)&&r.steps&&(r.steps=Xe(r.steps,e,t),s[n]={...r});}return s},Ze=(o,e)=>{for(let t of o){if(isEqual(t.id,e))return t;if(t.steps&&t.steps.length>0){let s=Ze(t.steps,e);if(s)return s}}},ge=(o,e)=>Ze(o,e)!==void 0,ye=(o,e,t)=>{let s=[...o];for(let n=0;n<s.length;n++){let r=s[n];isEqual(r.id,e)?s[n]={steps:r.steps,...t}:ge(s,e)&&r.steps&&(r.steps=ye(r.steps,e,t),s[n]={...r});}return s},Ce=(o,e)=>{let t=[...o];for(let s=0;s<t.length;s++){let n=t[s];n.id===e?t=[...t.slice(0,s),...t.slice(s+1)]:ge(t,e)&&n.steps&&(n.steps=Ce(n.steps,e),t[s]={...n});}return t},Te=(o,e,t,s,n)=>{let r=[...o];for(let i=0;i<r.length;i++){let a=r[i];isEqual(a.id,e)?("content"in a&&a.content!==void 0?s?a.content=t:a.content+=t:n?"input"in a&&a.input!==void 0&&(s?a.input=t:a.input+=t):"output"in a&&a.output!==void 0&&(s?a.output=t:a.output+=t),r[i]={...a}):a.steps&&(a.steps=Te(a.steps,e,t,s,n),r[i]={...a});}return r};var F=()=>{let[o,e]=useRecoilState(Ge),[t,s]=useRecoilState(He),n=useSetRecoilState(Ye);return {authConfig:o,setAuthConfig:e,user:t,setUser:s,setThreadHistory:n}};var bt=async(o,e)=>(await o.get(e))?.json(),Ct=o=>{let e=new J("","webapp");return Object.assign(e,o),e};function Y(o,{...e}={}){let t=useContext(L),{setUser:s}=F(),n=useMemo(()=>([i])=>{e.onErrorRetry||(e.onErrorRetry=(...l)=>{let[h]=l;if(h.status===401){s(null);return}return SWRConfig.defaultValue.onErrorRetry(...l)});let a=Ct(t);return a.on401=a.onError=void 0,bt(a,i)},[t]),r=useMemo(()=>o?[o]:null,[o]);return xt(r,n,e)}var st=()=>{let{authConfig:o,setAuthConfig:e}=F(),{data:t,isLoading:s}=Y(o?null:"/auth/config");return useEffect(()=>{t&&e(t);},[t,e]),{authConfig:o,isLoading:s}};var nt=()=>{let o=useContext(L),{setUser:e,setThreadHistory:t}=F();return {logout:async(n=!1)=>{await o.logout(),e(void 0),t(void 0),n&&window.location.reload();}}};var ot=()=>{let{user:o,setUser:e}=F(),{data:t,error:s,isLoading:n,mutate:r}=Y("/user");return useEffect(()=>{t?e(t):n&&e(void 0);},[t,n,e]),useEffect(()=>{s&&e(null);},[s]),{user:o,setUserFromAPI:r}};var it=()=>{let{authConfig:o}=st(),{logout:e}=nt(),{user:t,setUserFromAPI:s}=ot(),n=!!o&&(!o.requireLogin||t!==void 0);return o&&!o.requireLogin?{data:o,user:null,isReady:n,isAuthenticated:!0,logout:()=>Promise.resolve(),setUserFromAPI:()=>Promise.resolve()}:{data:o,user:t,isReady:n,isAuthenticated:!!t,logout:e,setUserFromAPI:s}};var Se=class extends Error{constructor(t,s,n){super(t);this.status=s,this.detail=n;}toString(){return this.detail?`${this.message}: ${this.detail}`:this.message}},Pe=class{constructor(e,t,s,n){this.httpEndpoint=e;this.type=t;this.on401=s;this.onError=n;}buildEndpoint(e){return this.httpEndpoint.endsWith("/")?`${this.httpEndpoint.slice(0,-1)}${e}`:`${this.httpEndpoint}${e}`}async getDetailFromErrorResponse(e){try{return (await e.json())?.detail}catch(t){console.error("Unable to parse error response",t);}}handleRequestError(e){e instanceof Se&&(e.status===401&&this.on401&&this.on401(),this.onError&&this.onError(e)),console.error(e);}async fetch(e,t,s,n,r={}){try{let i;s instanceof FormData?i=s:(r["Content-Type"]="application/json",i=s?JSON.stringify(s):null);let a=await fetch(this.buildEndpoint(t),{method:e,credentials:"include",headers:r,signal:n,body:i});if(!a.ok){let l=await this.getDetailFromErrorResponse(a);throw new Se(a.statusText,a.status,l)}return a}catch(i){throw this.handleRequestError(i),i}}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)}},J=class extends Pe{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 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){return (await this.put("/feedback",{feedback:e})).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){let n=new XMLHttpRequest;n.withCredentials=!0;let r=new Promise((i,a)=>{let l=new FormData;l.append("file",e),n.open("POST",this.buildEndpoint(`/project/file?session_id=${s}`),!0),n.upload.onprogress=function(h){if(h.lengthComputable){let u=h.loaded/h.total*100;t(u);}},n.onload=function(){if(n.status===200){let h=JSON.parse(n.responseText);i(h);}else a("Upload failed");},n.onerror=function(){a("Upload error");},n.send(l);});return {xhr:n,promise:r}}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()}getElementUrl(e,t){let s=`?session_id=${t}`;return this.buildEndpoint(`/project/file/${e}${s}`)}getLogoEndpoint(e){return this.buildEndpoint(`/logo?theme=${e}`)}getOAuthEndpoint(e){return this.buildEndpoint(`/auth/oauth/${e}`)}};var Xs=void 0,L=createContext(new J("http://localhost:8000","webapp"));var at=()=>{let o=useContext(L),e=useRecoilValue(V),t=useRecoilValue(z),s=useRecoilValue(te),n=useResetRecoilState(U),r=useResetRecoilState(te),i=useResetRecoilState(N),a=useSetRecoilState(K),l=useSetRecoilState($),h=useSetRecoilState(j),u=useSetRecoilState(W),d=useSetRecoilState(H),p=useSetRecoilState(O),S=useSetRecoilState(ue),g=useSetRecoilState(ce),y=useSetRecoilState(Je),M=useSetRecoilState(G),Q=useCallback(()=>{e?.socket.emit("clear_session"),e?.socket.disconnect(),g(void 0),r(),a(void 0),h([]),u([]),d([]),p([]),S(0),n(),i(),y(void 0),M(void 0);},[e]),X=useCallback((I,v=[])=>{I.id||(I.id=v4()),I.createdAt||(I.createdAt=new Date().toISOString()),h(Z=>R(Z,I)),e?.socket.emit("client_message",{message:I,fileReferences:v});},[e?.socket]),x=useCallback(I=>{e?.socket.emit("edit_message",{message:I});},[e?.socket]),se=useCallback(I=>{e?.socket.emit("window_message",I);},[e?.socket]),ne=useCallback(()=>{e?.socket.emit("audio_start");},[e?.socket]),re=useCallback((I,v,Z,ee)=>{e?.socket.emit("audio_chunk",{isStart:I,mimeType:v,elapsedTime:Z,data:ee});},[e?.socket]),ke=useCallback(()=>{e?.socket.emit("audio_end");},[e?.socket]),oe=useCallback(I=>{t&&(t.parentId&&(I.parentId=t.parentId),h(v=>R(v,I)),t.callback(I));},[t]),Ie=useCallback(I=>{e?.socket.emit("chat_settings_change",I);},[e?.socket]),Ae=useCallback(()=>{h(I=>I.map(v=>(v.streaming=!1,v))),l(!1),e?.socket.emit("stop");},[e?.socket]);return {uploadFile:useCallback((I,v)=>o.uploadFile(I,v,s),[s]),clear:Q,replyMessage:oe,sendMessage:X,editMessage:x,windowMessage:se,startAudioStream:ne,sendAudioChunk:re,endAudioStream:ke,stopTask:Ae,setIdToResume:g,updateChatSettings:Ie}};var ln=()=>{let o=useRecoilValue(j),e=useRecoilValue(K);return {threadId:useRecoilValue(G),messages:o,firstInteraction:e}};var wn=()=>{let o=useContext(L),e=useRecoilValue(te),[t,s]=useRecoilState(V),n=useSetRecoilState(de),r=useSetRecoilState(he),i=useResetRecoilState(N),a=useSetRecoilState(K),l=useSetRecoilState($),h=useRecoilValue(fe),u=useRecoilValue(le),d=useSetRecoilState(j),p=useSetRecoilState(z),S=useSetRecoilState(pe),g=useSetRecoilState(W),y=useSetRecoilState(H),M=useSetRecoilState(O),Q=useSetRecoilState(U),X=useSetRecoilState(ue),[x,se]=useRecoilState(We),ne=useRecoilValue(ce),[re,ke]=useRecoilState(G);useEffect(()=>{t?.socket&&(t.socket.auth.threadId=re||"");},[re]);let oe=useCallback(({transports:Ue,userEnv:I})=>{let{protocol:v,host:Z,pathname:ee}=new URL(o.httpEndpoint),ut=`${v}//${Z}`,lt=ee&&ee!=="/"?`${ee}/ws/socket.io`:"/ws/socket.io",m=Ut(ut,{path:lt,withCredentials:!0,transports:Ue,auth:{clientType:o.type,sessionId:e,threadId:ne||"",userEnv:JSON.stringify(I),chatProfile:x?encodeURIComponent(x):""}});s(c=>(c?.socket?.removeAllListeners(),c?.socket?.close(),{socket:m})),m.on("connect",()=>{m.emit("connection_successful"),s(c=>({...c,error:!1}));}),m.on("connect_error",c=>{s(f=>({...f,error:!0}));}),m.on("task_start",()=>{l(!0);}),m.on("task_end",()=>{l(!1);}),m.on("reload",()=>{m.emit("clear_session"),window.location.reload();}),m.on("audio_connection",async c=>{if(c==="on"){let f=!0,w=Date.now(),A="pcm16";await u.begin(),await h.connect(),await u.record(async xe=>{let ft=Date.now()-w;m.emit("audio_chunk",{isStart:f,mimeType:A,elapsedTime:ft,data:xe.mono}),f=!1;}),h.onStop=()=>n(!1);}else await u.end(),await h.interrupt();r(c);}),m.on("audio_chunk",c=>{h.add16BitPCM(c.data,c.track),n(!0);}),m.on("audio_interrupt",()=>{h.interrupt();}),m.on("resume_thread",c=>{let f=[];for(let A of c.steps)f=R(f,A);c.metadata?.chat_profile&&se(c.metadata?.chat_profile),d(f);let w=c.elements||[];y(w.filter(A=>A.type==="tasklist")),g(w.filter(A=>["avatar","tasklist"].indexOf(A.type)===-1));}),m.on("new_message",c=>{d(f=>R(f,c));}),m.on("first_interaction",c=>{a(c.interaction),ke(c.thread_id);}),m.on("update_message",c=>{d(f=>ye(f,c.id,c));}),m.on("delete_message",c=>{d(f=>Ce(f,c.id));}),m.on("stream_start",c=>{d(f=>R(f,c));}),m.on("stream_token",({id:c,token:f,isSequence:w,isInput:A})=>{d(xe=>Te(xe,c,f,w,A));}),m.on("ask",({msg:c,spec:f},w)=>{p({spec:f,callback:w,parentId:c.parentId}),d(A=>R(A,c)),l(!1);}),m.on("ask_timeout",()=>{p(void 0),l(!1);}),m.on("clear_ask",()=>{p(void 0);}),m.on("call_fn",({name:c,args:f},w)=>{S({name:c,args:f,callback:w});}),m.on("clear_call_fn",()=>{S(void 0);}),m.on("call_fn_timeout",()=>{S(void 0);}),m.on("chat_settings",c=>{Q(c),i();}),m.on("element",c=>{!c.url&&c.chainlitKey&&(c.url=o.getElementUrl(c.chainlitKey,e)),c.type==="tasklist"?y(f=>{let w=f.findIndex(A=>A.id===c.id);return w===-1?[...f,c]:[...f.slice(0,w),c,...f.slice(w+1)]}):g(f=>{let w=f.findIndex(A=>A.id===c.id);return w===-1?[...f,c]:[...f.slice(0,w),c,...f.slice(w+1)]});}),m.on("remove_element",c=>{g(f=>f.filter(w=>w.id!==c.id)),y(f=>f.filter(w=>w.id!==c.id));}),m.on("action",c=>{M(f=>[...f,c]);}),m.on("remove_action",c=>{M(f=>{let w=f.findIndex(A=>A.id===c.id);return w===-1?f:[...f.slice(0,w),...f.slice(w+1)]});}),m.on("token_usage",c=>{X(f=>f+c);}),m.on("window_message",c=>{window.parent&&window.parent.postMessage(c,"*");});},[s,e,x]),Ie=useCallback(debounce(oe,200),[oe]),Ae=useCallback(()=>{t?.socket&&(t.socket.removeAllListeners(),t.socket.close());},[t]);return {connect:Ie,disconnect:Ae,session:t,sessionId:e,chatProfile:x,idToResume:ne,setChatProfile:se}};var bn=()=>{let[o,e]=useRecoilState(he),t=useRecoilValue(le),s=useRecoilValue(fe),n=useRecoilValue(de),{startAudioStream:r,endAudioStream:i}=at(),a=useCallback(async()=>{e("connecting"),await r();},[r]),l=useCallback(async()=>{e("off"),await t.end(),await s.interrupt(),await i();},[i,t,s]);return {startConversation:a,endConversation:l,audioConnection:o,isAiSpeaking:n,wavRecorder:t,wavStreamPlayer:s}};var Dn=()=>{let[o,e]=useRecoilState(Ke),{isAuthenticated:t}=it(),s=navigator.language||"en-US",{data:n,error:r,isLoading:i}=Y(!o&&t?`/project/settings?language=${s}`:null);return useEffect(()=>{n&&e(n);},[n,e]),{config:o,error:r,isLoading:i,language:s}};var Le=new WeakMap,Ot=(o,e,t=!1,s=!1)=>{let n,r,i;if(s&&(r=e.toString(),i=t.toString(),n=Le.has(o)?Le.get(o):{},Le.set(o,n),n[r]=n[r]||{},n[r][i]))return n[r][i];let a=o.length,l=new Array(e);if(e<=a){l.fill(0);let h=new Array(e).fill(0);for(let u=0;u<a;u++){let d=Math.floor(u*(e/a));t?l[d]=Math.max(l[d],Math.abs(o[u])):l[d]+=Math.abs(o[u]),h[d]++;}if(!t)for(let u=0;u<l.length;u++)l[u]=l[u]/h[u];}else for(let h=0;h<e;h++){let u=h*(a-1)/(e-1),d=Math.floor(u),p=Math.ceil(u),S=u-d;p>=a?l[h]=o[a-1]:l[h]=o[d]*(1-S)+o[p]*S;}return s&&(n[r][i]=l),l},jt={drawBars:(o,e,t,s,n,r=0,i=0,a=0,l=!1)=>{r=Math.floor(Math.min(r,(t-a)/(Math.max(i,1)+a))),r||(r=Math.floor((t-a)/(Math.max(i,1)+a))),i||(i=(t-a)/r-a);let h=Ot(e,r,!0);for(let u=0;u<r;u++){let d=Math.abs(h[u]),p=Math.max(1,d*s),S=a+u*(i+a),g=l?(s-p)/2:s-p,y=Math.min(i/2,p/2);o.fillStyle=n,o.beginPath(),o.moveTo(S+y,g),o.lineTo(S+i-y,g),o.arcTo(S+i,g,S+i,g+y,y),o.lineTo(S+i,g+p-y),o.arcTo(S+i,g+p,S+i-y,g+p,y),o.lineTo(S+y,g+p),o.arcTo(S,g+p,S,g+p-y,y),o.lineTo(S,g+y),o.arcTo(S,g,S+y,g,y),o.closePath(),o.fill();}}};
|
|
309
308
|
|
|
310
|
-
export {
|
|
309
|
+
export { Pe as APIBase, J as ChainlitAPI, L as ChainlitContext, Se as ClientError, jt as WavRenderer, O as actionState, R as addMessage, Xe as addMessageToParent, z as askUserState, he as audioConnectionState, Ge as authState, pe as callFnState, We as chatProfileState, be as chatSettingsDefaultValueSelector, U as chatSettingsInputsState, N as chatSettingsValueState, Ke as configState, G as currentThreadIdState, Xs as defaultChainlitContext, Ce as deleteMessageById, W as elementState, bt as fetcher, K as firstUserInteraction, ge as hasMessageById, de as isAiSpeakingState, ws as isLastMessage, $ as loadingState, j as messagesState, Ss as nestMessages, te as sessionIdState, V as sessionState, Je as sideViewState, H as tasklistState, Ye as threadHistoryState, ce as threadIdToResumeState, ue as tokenCountState, ye as updateMessageById, Te as updateMessageContentById, Y as useApi, bn as useAudio, it as useAuth, ms as useChatData, at as useChatInteract, ln as useChatMessages, wn as useChatSession, Dn as useConfig, He as userState, le as wavRecorderState, fe as wavStreamPlayerState };
|
|
311
310
|
//# sourceMappingURL=out.js.map
|
|
312
311
|
//# sourceMappingURL=index.mjs.map
|