@chainlit/react-client 0.1.0 → 0.1.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 +13 -10
- package/dist/index.d.mts +148 -71
- package/dist/index.d.ts +148 -71
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";function e(e,t){if(t==null||t>e.length)t=e.length;for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function t(e){if(Array.isArray(e))return e}function n(t){if(Array.isArray(t))return e(t)}function r(e){if(e===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return e}function o(e,t,n,r,o,i,a){try{var u=e[i](a);var s=u.value}catch(e){n(e);return}if(u.done){t(s)}else{Promise.resolve(s).then(r,o)}}function i(e){return function(){var t=this,n=arguments;return new Promise(function(r,i){var a=e.apply(t,n);function u(e){o(a,r,i,u,s,"next",e)}function s(e){o(a,r,i,u,s,"throw",e)}u(undefined)})}}function a(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function u(e,t,n){if(C()){u=Reflect.construct}else{u=function e(e,t,n){var r=[null];r.push.apply(r,t);var o=Function.bind.apply(e,r);var i=new o;if(n)O(i,n.prototype);return i}}return u.apply(null,arguments)}function s(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||false;r.configurable=true;if("value"in r)r.writable=true;Object.defineProperty(e,r.key,r)}}function c(e,t,n){if(t)s(e.prototype,t);if(n)s(e,n);return e}function l(e,t,n){if(t in e){Object.defineProperty(e,t,{value:n,enumerable:true,configurable:true,writable:true})}else{e[t]=n}return e}function f(e){f=Object.setPrototypeOf?Object.getPrototypeOf:function e(e){return e.__proto__||Object.getPrototypeOf(e)};return f(e)}function d(e,t){if(typeof t!=="function"&&t!==null){throw new TypeError("Super expression must either be null or a function")}e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:true,configurable:true}});if(t)O(e,t)}function p(e,t){if(t!=null&&typeof Symbol!=="undefined"&&t[Symbol.hasInstance]){return!!t[Symbol.hasInstance](e)}else{return e instanceof t}}function v(e){return Function.toString.call(e).indexOf("[native code]")!==-1}function h(e){if(typeof Symbol!=="undefined"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function y(e,t){var n=e==null?null:typeof Symbol!=="undefined"&&e[Symbol.iterator]||e["@@iterator"];if(n==null)return;var r=[];var o=true;var i=false;var a,u;try{for(n=n.call(e);!(o=(a=n.next()).done);o=true){r.push(a.value);if(t&&r.length===t)break}}catch(e){i=true;u=e}finally{try{if(!o&&n["return"]!=null)n["return"]()}finally{if(i)throw u}}return r}function m(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function b(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function g(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};var r=Object.keys(n);if(typeof Object.getOwnPropertySymbols==="function"){r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))}r.forEach(function(t){l(e,t,n[t])})}return e}function k(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);if(t){r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})}n.push.apply(n,r)}return n}function S(e,t){t=t!=null?t:{};if(Object.getOwnPropertyDescriptors){Object.defineProperties(e,Object.getOwnPropertyDescriptors(t))}else{k(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function w(e,t){if(e==null)return{};var n=R(e,t);var r,o;if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++){r=i[o];if(t.indexOf(r)>=0)continue;if(!Object.prototype.propertyIsEnumerable.call(e,r))continue;n[r]=e[r]}}return n}function R(e,t){if(e==null)return{};var n={};var r=Object.keys(e);var o,i;for(i=0;i<r.length;i++){o=r[i];if(t.indexOf(o)>=0)continue;n[o]=e[o]}return n}function x(e,t){if(t&&(T(t)==="object"||typeof t==="function")){return t}return r(e)}function O(e,t){O=Object.setPrototypeOf||function e(e,t){e.__proto__=t;return e};return O(e,t)}function _(e,n){return t(e)||y(e,n)||j(e,n)||m()}function I(e){return n(e)||h(e)||j(e)||b()}function T(e){"@swc/helpers - typeof";return e&&typeof Symbol!=="undefined"&&e.constructor===Symbol?"symbol":typeof e}function j(t,n){if(!t)return;if(typeof t==="string")return e(t,n);var r=Object.prototype.toString.call(t).slice(8,-1);if(r==="Object"&&t.constructor)r=t.constructor.name;if(r==="Map"||r==="Set")return Array.from(r);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return e(t,n)}function E(e){var t=typeof Map==="function"?new Map:undefined;E=function e(e){if(e===null||!v(e))return e;if(typeof e!=="function"){throw new TypeError("Super expression must either be null or a function")}if(typeof t!=="undefined"){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return u(e,arguments,f(this).constructor)}n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:false,writable:true,configurable:true}});return O(n,e)};return E(e)}function C(){if(typeof Reflect==="undefined"||!Reflect.construct)return false;if(Reflect.construct.sham)return false;if(typeof Proxy==="function")return true;try{Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}));return true}catch(e){return false}}function P(e){var t=C();return function n(){var n=f(e),r;if(t){var o=f(this).constructor;r=Reflect.construct(n,arguments,o)}else{r=n.apply(this,arguments)}return x(this,r)}}function A(e,t){var n,r,o,i,a={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]};return(i={next:u(0),"throw":u(1),"return":u(2)},typeof Symbol==="function"&&(i[Symbol.iterator]=function(){return this}),i);function u(e){return function(t){return s([e,t])}}function s(i){if(n)throw new TypeError("Generator is already executing.");while(a)try{if(n=1,r&&(o=i[0]&2?r["return"]:i[0]?r["throw"]||((o=r["return"])&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;if(r=0,o)i=[i[0]&2,o.value];switch(i[0]){case 0:case 1:o=i;break;case 4:a.label++;return{value:i[1],done:false};case 5:a.label++;r=i[1];i=[0];continue;case 7:i=a.ops.pop();a.trys.pop();continue;default:if(!(o=a.trys,o=o.length>0&&o[o.length-1])&&(i[0]===6||i[0]===2)){a=0;continue}if(i[0]===3&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(i[0]===6&&a.label<o[1]){a.label=o[1];o=i;break}if(o&&a.label<o[2]){a.label=o[2];a.ops.push(i);break}if(o[2])a.ops.pop();a.trys.pop();continue}i=t.call(e,a)}catch(e){i=[6,e];r=0}finally{n=o=0}if(i[0]&5)throw i[1];return{value:i[0]?i[1]:void 0,done:true}}}var D=require("recoil");var V=require("lodash");var M=require("uuid");var q=require("react");var U=require("socket.io-client");var F=require("jwt-decode");var L=require("swr");function B(e){return e&&e.__esModule?e:{default:e}}var G=/*#__PURE__*/B(U);var H=/*#__PURE__*/B(F);var X=/*#__PURE__*/B(L);var z=function(e){var t={},n=new Date,r=new Date;r.setDate(n.getDate()-1);var o=new Date;o.setDate(n.getDate()-7);var i=new Date;return i.setDate(n.getDate()-30),e.forEach(function(e){var a=new Date(e.createdAt),u=a.toDateString()===n.toDateString(),s=a.toDateString()===r.toDateString(),c=a>=o,l=a>=i,f;u?f="Today":s?f="Yesterday":c?f="Previous 7 days":l?f="Previous 30 days":f=a.toLocaleString("default",{month:"long",year:"numeric"}).split(" ").slice(0,1).join(" "),t[f]||(t[f]=[]),t[f].push(e)}),t};var J=D.atom({key:"ThreadIdToResume",default:void 0}),N=D.atom({key:"ChatProfile",default:void 0}),W=D.atom({key:"SessionId",default:M.v4()}),K=D.selector({key:"SessionIdSelector",get:function(e){var t=e.get;return t(W)},set:function(e,t){var n=e.set;return n(W,p(t,D.DefaultValue)?M.v4():t)}}),Y=D.atom({key:"Session",dangerouslyAllowMutability:!0,default:void 0}),$=D.atom({key:"Actions",default:[]}),Q=D.atom({key:"Messages",dangerouslyAllowMutability:!0,default:[]}),Z=D.atom({key:"TokenCount",default:0}),ee=D.atom({key:"Loading",default:!1}),et=D.atom({key:"AskUser",default:void 0}),en=D.atom({key:"CallFn",default:void 0}),er=D.atom({key:"ChatSettings",default:[]}),eo=D.selector({key:"ChatSettingsValue/Default",get:function(e){var t=e.get;return t(er).reduce(function(e,t){return e[t.id]=t.initial,e},{})}}),ei=D.atom({key:"ChatSettingsValue",default:eo}),ea=D.atom({key:"DisplayElements",default:[]}),eu=D.atom({key:"TasklistElements",default:[]}),es=D.atom({key:"FirstUserInteraction",default:void 0}),ec=D.atom({key:"AccessToken",default:void 0}),el=D.atom({key:"User",default:null}),ef=D.atom({key:"ThreadHistory",default:{threads:void 0,currentThreadId:void 0,timeGroupedThreads:void 0,pageInfo:void 0},effects:[function(e){var t=e.setSelf,n=e.onSet;n(function(e,n){var r=e===null||e===void 0?void 0:e.timeGroupedThreads;(e===null||e===void 0?void 0:e.threads)&&!V.isEqual(e.threads,n===null||n===void 0?void 0:n.timeGroupedThreads)&&(r=z(e.threads)),t(S(g({},e),{timeGroupedThreads:r}))})}]}),ed=D.atom({key:"SideView",default:void 0}),ep=D.atom({key:"CurrentThreadId",default:void 0});var ev=function(){var e=D.useRecoilValue(ee),t=D.useRecoilValue(ea),n=D.useRecoilValue(eu),r=D.useRecoilValue($),o=D.useRecoilValue(Y),i=D.useRecoilValue(et),a=D.useRecoilValue(er),u=D.useRecoilValue(ei),s=D.useRecoilValue(eo),c=(o===null||o===void 0?void 0:o.socket.connected)&&!(o===null||o===void 0?void 0:o.error),l=!c||e||(i===null||i===void 0?void 0:i.spec.type)==="file"||(i===null||i===void 0?void 0:i.spec.type)==="action";return{actions:r,askUser:i,chatSettingsDefaultValue:s,chatSettingsInputs:a,chatSettingsValue:u,connected:c,disabled:l,elements:t,error:o===null||o===void 0?void 0:o.error,loading:e,tasklists:n}};var eh=function(e){var t=[];var n=true,r=false,o=undefined;try{for(var i=e[Symbol.iterator](),a;!(n=(a=i.next()).done);n=true){var u=a.value;t=em(t,u)}}catch(e){r=true;o=e}finally{try{if(!n&&i.return!=null){i.return()}}finally{if(r){throw o}}}return t},ey=function(e,t){if(e.length-1===t)return!0;for(var n=t+1;n<e.length;n++)if(!e[n].streaming)return!1;return!0},em=function(e,t){var n=["assistant_message","user_message","tool"].includes(t.type),r=!t.parentId;if(r&&!n)return e;var o=r?void 0:ek(e,t.parentId),i=(r||(o===null||o===void 0?void 0:o.type)!=="assistant_message")&&t.type==="tool";if(eS(e,t.id))return ew(e,t.id,t);if(i){var a=e.length>0?e[e.length-1]:void 0,u=(a===null||a===void 0?void 0:a.type)==="assistant_message"&&(a===null||a===void 0?void 0:a.id.startsWith("wrap_"));return a&&u?I(e.slice(0,e.length-1)).concat([S(g({},a),{steps:I(a.steps||[]).concat([t])})]):I(e).concat([S(g({},t),{name:"",input:"",output:"",id:"wrap_"+t.id,type:"assistant_message",steps:[t]})])}else return"parentId"in t&&t.parentId?eg(e,t.parentId,t):"indent"in t&&t.indent&&t.indent>0?eb(e,t.indent,t):I(e).concat([t])},eb=function(e,t,n){var r=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;var o=I(e);if(o.length===0)return I(o).concat([n]);{var i=o.length-1,a=o[i];return a.steps=a.steps||[],r+1===t?(a.steps=I(a.steps).concat([n]),o[i]=g({},a),o):(a.steps=eb(a.steps,t,n,r+1),o[i]=g({},a),o)}},eg=function(e,t,n){var r=I(e);for(var o=0;o<r.length;o++){var i=r[o];V.isEqual(i.id,t)?(i.steps=i.steps?I(i.steps).concat([n]):[n],r[o]=g({},i)):eS(r,t)&&i.steps&&(i.steps=eg(i.steps,t,n),r[o]=g({},i))}return r},ek=function(e,t){var n=true,r=false,o=undefined;try{for(var i=e[Symbol.iterator](),a;!(n=(a=i.next()).done);n=true){var u=a.value;if(V.isEqual(u.id,t))return u;if(u.steps&&u.steps.length>0){var s=ek(u.steps,t);if(s)return s}}}catch(e){r=true;o=e}finally{try{if(!n&&i.return!=null){i.return()}}finally{if(r){throw o}}}},eS=function(e,t){return ek(e,t)!==void 0},ew=function(e,t,n){var r=I(e);for(var o=0;o<r.length;o++){var i=r[o];V.isEqual(i.id,t)?r[o]=g({steps:i.steps},n):eS(r,t)&&i.steps&&(i.steps=ew(i.steps,t,n),r[o]=g({},i))}return r},eR=function(e,t){var n=I(e);for(var r=0;r<n.length;r++){var o=n[r];o.id===t?n=I(n.slice(0,r)).concat(I(n.slice(r+1))):eS(n,t)&&o.steps&&(o.steps=eR(o.steps,t),n[r]=g({},o))}return n},ex=function(e,t,n,r,o){var i=I(e);for(var a=0;a<i.length;a++){var u=i[a];V.isEqual(u.id,t)?("content"in u&&u.content!==void 0?r?u.content=n:u.content+=n:o?"input"in u&&u.input!==void 0&&(r?u.input=n:u.input+=n):"output"in u&&u.output!==void 0&&(r?u.output=n:u.output+=n),i[a]=g({},u)):u.steps&&(u.steps=ex(u.steps,t,n,r,o),i[a]=g({},u))}return i};var eO=function(){var e=D.useRecoilValue(ec),t=D.useRecoilValue(Y),n=D.useRecoilValue(et),r=D.useRecoilValue(K),o=D.useResetRecoilState(er),i=D.useResetRecoilState(K),a=D.useResetRecoilState(ei),u=D.useSetRecoilState(es),s=D.useSetRecoilState(ee),c=D.useSetRecoilState(Q),l=D.useSetRecoilState(ea),f=D.useSetRecoilState(eu),d=D.useSetRecoilState($),p=D.useSetRecoilState(Z),v=D.useSetRecoilState(J),h=D.useSetRecoilState(ed),y=D.useSetRecoilState(ep),m=q.useCallback(function(){t===null||t===void 0?void 0:t.socket.emit("clear_session"),t===null||t===void 0?void 0:t.socket.disconnect(),v(void 0),i(),u(void 0),c([]),l([]),f([]),d([]),p(0),o(),a(),h(void 0),y(void 0)},[t]),b=q.useCallback(function(e){t===null||t===void 0?void 0:t.socket.emit("copilot_event",e)},[t===null||t===void 0?void 0:t.socket]),g=q.useCallback(function(e,n){c(function(t){return em(t,e)}),t===null||t===void 0?void 0:t.socket.emit("ui_message",{message:e,fileReferences:n})},[t===null||t===void 0?void 0:t.socket]),k=q.useCallback(function(e,n,r,o){t===null||t===void 0?void 0:t.socket.emit("audio_chunk",{isStart:e,mimeType:n,elapsedTime:r,data:o})},[t===null||t===void 0?void 0:t.socket]),S=q.useCallback(function(e){t===null||t===void 0?void 0:t.socket.emit("audio_end",{fileReferences:e})},[t===null||t===void 0?void 0:t.socket]),w=q.useCallback(function(e){n&&(c(function(t){return em(t,e)}),n.callback(e))},[n]),R=q.useCallback(function(e){t===null||t===void 0?void 0:t.socket.emit("chat_settings_change",e)},[t===null||t===void 0?void 0:t.socket]),x=q.useCallback(function(){c(function(e){return e.map(function(e){return e.streaming=!1,e})}),s(!1),t===null||t===void 0?void 0:t.socket.emit("stop")},[t===null||t===void 0?void 0:t.socket]),O=q.useCallback(function(e){var n=t===null||t===void 0?void 0:t.socket;if(!n)return;var r=new Promise(function(e,t){n.once("action_response",function(n){n.status?e(n):t(n)})});return n.emit("action_call",e),r},[t===null||t===void 0?void 0:t.socket]);return{uploadFile:q.useCallback(function(t,n,o){return t.uploadFile(n,o,r,e)},[r,e]),callAction:O,clear:m,replyMessage:w,sendMessage:g,sendAudioChunk:k,endAudioStream:S,stopTask:x,setIdToResume:v,updateChatSettings:R,sendCopilotEvent:b}};var e_=function(){var e=D.useRecoilValue(Q),t=D.useRecoilValue(es);return{threadId:D.useRecoilValue(ep),messages:e,firstInteraction:t}};var eI=function(){var e=D.useRecoilValue(K),t=_(D.useRecoilState(Y),2),n=t[0],r=t[1],o=D.useResetRecoilState(ei),i=D.useSetRecoilState(es),a=D.useSetRecoilState(ee),u=D.useSetRecoilState(Q),s=D.useSetRecoilState(et),c=D.useSetRecoilState(en),l=D.useSetRecoilState(ea),f=D.useSetRecoilState(eu),d=D.useSetRecoilState($),p=D.useSetRecoilState(er),v=D.useSetRecoilState(Z),h=_(D.useRecoilState(N),2),y=h[0],m=h[1],b=D.useRecoilValue(J),k=D.useSetRecoilState(ep),w=q.useCallback(function(t){var n=t.client,h=t.userEnv,w=t.accessToken;var R=new URL(n.httpEndpoint),x=R.protocol,O=R.host,_=R.pathname,T="".concat(x,"//").concat(O),j=_&&_!=="/"?"/ws".concat(_,"/socket.io"):"/ws/socket.io",E=G.default(T,{path:j,extraHeaders:{Authorization:w||"","X-Chainlit-Client-Type":n.type,"X-Chainlit-Session-Id":e,"X-Chainlit-Thread-Id":b||"","user-env":JSON.stringify(h),"X-Chainlit-Chat-Profile":y?encodeURIComponent(y):""}});r(function(e){var t,n;return e===null||e===void 0?void 0:(t=e.socket)===null||t===void 0?void 0:t.removeAllListeners(),e===null||e===void 0?void 0:(n=e.socket)===null||n===void 0?void 0:n.close(),{socket:E}}),E.on("connect",function(){E.emit("connection_successful"),r(function(e){return S(g({},e),{error:!1})})}),E.on("connect_error",function(e){r(function(e){return S(g({},e),{error:!0})})}),E.on("task_start",function(){a(!0)}),E.on("task_end",function(){a(!1)}),E.on("reload",function(){E.emit("clear_session"),window.location.reload()}),E.on("resume_thread",function(e){var t,n;var r=[];var o=true,i=false,a=undefined;try{for(var s=e.steps[Symbol.iterator](),c;!(o=(c=s.next()).done);o=true){var d=c.value;r=em(r,d)}}catch(e){i=true;a=e}finally{try{if(!o&&s.return!=null){s.return()}}finally{if(i){throw a}}}((t=e.metadata)===null||t===void 0?void 0:t.chat_profile)&&m((n=e.metadata)===null||n===void 0?void 0:n.chat_profile),u(r);var p=e.elements||[];f(p.filter(function(e){return e.type==="tasklist"})),l(p.filter(function(e){return["avatar","tasklist"].indexOf(e.type)===-1}))}),E.on("new_message",function(e){u(function(t){return em(t,e)})}),E.on("first_interaction",function(e){i(e.interaction),k(e.thread_id)}),E.on("update_message",function(e){u(function(t){return ew(t,e.id,e)})}),E.on("delete_message",function(e){u(function(t){return eR(t,e.id)})}),E.on("stream_start",function(e){u(function(t){return em(t,e)})}),E.on("stream_token",function(e){var t=e.id,n=e.token,r=e.isSequence,o=e.isInput;u(function(e){return ex(e,t,n,r,o)})}),E.on("ask",function(e,t){var n=e.msg,r=e.spec;s({spec:r,callback:t}),u(function(e){return em(e,n)}),a(!1)}),E.on("ask_timeout",function(){s(void 0),a(!1)}),E.on("clear_ask",function(){s(void 0)}),E.on("call_fn",function(e,t){var n=e.name,r=e.args;var o=new CustomEvent("chainlit-call-fn",{detail:{name:n,args:r,callback:t}});window.dispatchEvent(o),c({name:n,args:r,callback:t})}),E.on("clear_call_fn",function(){c(void 0)}),E.on("call_fn_timeout",function(){c(void 0)}),E.on("chat_settings",function(e){p(e),o()}),E.on("element",function(t){!t.url&&t.chainlitKey&&(t.url=n.getElementUrl(t.chainlitKey,e)),t.type==="tasklist"?f(function(e){var n=e.findIndex(function(e){return e.id===t.id});return n===-1?I(e).concat([t]):I(e.slice(0,n)).concat([t],I(e.slice(n+1)))}):l(function(e){var n=e.findIndex(function(e){return e.id===t.id});return n===-1?I(e).concat([t]):I(e.slice(0,n)).concat([t],I(e.slice(n+1)))})}),E.on("remove_element",function(e){l(function(t){return t.filter(function(t){return t.id!==e.id})}),f(function(t){return t.filter(function(t){return t.id!==e.id})})}),E.on("action",function(e){d(function(t){return I(t).concat([e])})}),E.on("remove_action",function(e){d(function(t){var n=t.findIndex(function(t){return t.id===e.id});return n===-1?t:I(t.slice(0,n)).concat(I(t.slice(n+1)))})}),E.on("token_usage",function(e){v(function(t){return t+e})})},[r,e,y]),R=q.useCallback(V.debounce(w,200),[w]),x=q.useCallback(function(){(n===null||n===void 0?void 0:n.socket)&&(n.socket.removeAllListeners(),n.socket.close())},[n]);return{connect:R,disconnect:x,session:n,sessionId:e,chatProfile:y,idToResume:b,setChatProfile:m}};var eT="token";function ej(){try{return localStorage.getItem(eT)}catch(e){return}}function eE(e){try{return localStorage.setItem(eT,e)}catch(e){return}}function eC(){try{return localStorage.removeItem(eT)}catch(e){return}}var eP=function(){var e=i(function(e,t,n){var r;return A(this,function(o){switch(o.label){case 0:return[4,e.get(t,n)];case 1:return[2,(r=o.sent())===null||r===void 0?void 0:r.json()]}})});return function t(t,n,r){return e.apply(this,arguments)}}();function eA(e,t,n){var r=D.useRecoilValue(ec);return X.default(t?[t,r]:null,function(t){var n=_(t,2),r=n[0],o=n[1];return eP(e,r,o)},n)}var eD=function(e){var t=eA(e,"/auth/config"),n=t.data,r=t.isLoading,o=_(D.useRecoilState(ec),2),a=o[0],u=o[1],s=D.useSetRecoilState(ef),c=_(D.useRecoilState(el),2),l=c[0],f=c[1],d=!!(!r&&n),p=function(){var t=i(function(){return A(this,function(t){switch(t.label){case 0:return[4,e.logout()];case 1:t.sent(),f(null),eC(),u(""),s(void 0);return[2]}})});return function e(){return t.apply(this,arguments)}}(),v=function(e){if(!e){p();return}try{var t=H.default(e),n=t.exp,r=w(t,["exp"]);eE(e),u("Bearer ".concat(e)),f(r)}catch(e){console.error("Invalid token, clearing token from local storage","error:",e),p()}};q.useEffect(function(){if(!l&&ej()){v(ej());return}},[]);var h=!!a;return n&&!n.requireLogin?{data:n,user:null,isReady:d,isAuthenticated:!0,accessToken:"",logout:function(){},setAccessToken:function(){}}:{data:n,user:l,isAuthenticated:h,isReady:d,accessToken:a,logout:p,setAccessToken:v}};var eV=/*#__PURE__*/function(e){d(n,e);var t=P(n);function n(e,r){a(this,n);var o;o=t.call(this,e);o.detail=r;return o}c(n,[{key:"toString",value:function e(){return this.detail?"".concat(this.message,": ").concat(this.detail):this.message}}]);return n}(E(Error)),eM=/*#__PURE__*/function(){function e(t,n,r,o){a(this,e);this.httpEndpoint=t;this.type=n;this.on401=r;this.onError=o}c(e,[{key:"buildEndpoint",value:function e(e){return this.httpEndpoint.endsWith("/")?"".concat(this.httpEndpoint.slice(0,-1)).concat(e):"".concat(this.httpEndpoint).concat(e)}},{key:"checkToken",value:function e(e){var t="Bearer ";return e.startsWith(t)?e:t+e}},{key:"fetch",value:function e(e,t,n,r,o){var a=this;return i(function(){var i,u,s,c,l;return A(this,function(f){switch(f.label){case 0:f.trys.push([0,4,,5]);i={};n&&(i.Authorization=a.checkToken(n));p(r,FormData)?u=r:(i["Content-Type"]="application/json",u=r?JSON.stringify(r):null);return[4,fetch(a.buildEndpoint(t),{method:e,headers:i,signal:o,body:u})];case 1:s=f.sent();if(!!s.ok)return[3,3];return[4,s.json()];case 2:c=f.sent();throw s.status===401&&a.on401&&(eC(),a.on401()),new eV(s.statusText,c.detail);case 3:return[2,s];case 4:l=f.sent();throw p(l,eV)&&a.onError&&a.onError(l),console.error(l),l;case 5:return[2]}})})()}},{key:"get",value:function e(e,t){var n=this;return i(function(){return A(this,function(r){switch(r.label){case 0:return[4,n.fetch("GET",e,t)];case 1:return[2,r.sent()]}})})()}},{key:"post",value:function e(e,t,n,r){var o=this;return i(function(){return A(this,function(i){switch(i.label){case 0:return[4,o.fetch("POST",e,n,t,r)];case 1:return[2,i.sent()]}})})()}},{key:"put",value:function e(e,t,n){var r=this;return i(function(){return A(this,function(o){switch(o.label){case 0:return[4,r.fetch("PUT",e,n,t)];case 1:return[2,o.sent()]}})})()}},{key:"patch",value:function e(e,t,n){var r=this;return i(function(){return A(this,function(o){switch(o.label){case 0:return[4,r.fetch("PATCH",e,n,t)];case 1:return[2,o.sent()]}})})()}},{key:"delete",value:function e(e,t,n){var r=this;return i(function(){return A(this,function(o){switch(o.label){case 0:return[4,r.fetch("DELETE",e,n,t)];case 1:return[2,o.sent()]}})})()}}]);return e}(),eq=/*#__PURE__*/function(e){d(n,e);var t=P(n);function n(){a(this,n);return t.apply(this,arguments)}c(n,[{key:"headerAuth",value:function e(){var e=this;return i(function(){return A(this,function(t){switch(t.label){case 0:return[4,e.post("/auth/header",{})];case 1:return[2,t.sent().json()]}})})()}},{key:"passwordAuth",value:function e(e){var t=this;return i(function(){return A(this,function(n){switch(n.label){case 0:return[4,t.post("/login",e)];case 1:return[2,n.sent().json()]}})})()}},{key:"logout",value:function e(){var e=this;return i(function(){return A(this,function(t){switch(t.label){case 0:return[4,e.post("/logout",{})];case 1:return[2,t.sent().json()]}})})()}},{key:"setFeedback",value:function e(e,t){var n=this;return i(function(){return A(this,function(r){switch(r.label){case 0:return[4,n.put("/feedback",{feedback:e},t)];case 1:return[2,r.sent().json()]}})})()}},{key:"deleteFeedback",value:function e(e,t){var n=this;return i(function(){return A(this,function(r){switch(r.label){case 0:return[4,n.delete("/feedback",{feedbackId:e},t)];case 1:return[2,r.sent().json()]}})})()}},{key:"listThreads",value:function e(e,t,n){var r=this;return i(function(){return A(this,function(o){switch(o.label){case 0:return[4,r.post("/project/threads",{pagination:e,filter:t},n)];case 1:return[2,o.sent().json()]}})})()}},{key:"deleteThread",value:function e(e,t){var n=this;return i(function(){return A(this,function(r){switch(r.label){case 0:return[4,n.delete("/project/thread",{threadId:e},t)];case 1:return[2,r.sent().json()]}})})()}},{key:"uploadFile",value:function e(e,t,n,r){var o=this;var i=new XMLHttpRequest,a=new Promise(function(a,u){var s=new FormData;s.append("file",e),i.open("POST",o.buildEndpoint("/project/file?session_id=".concat(n)),!0),r&&i.setRequestHeader("Authorization",o.checkToken(r)),i.upload.onprogress=function(e){if(e.lengthComputable){var n=e.loaded/e.total*100;t(n)}},i.onload=function(){if(i.status===200){var e=JSON.parse(i.responseText);a(e)}else u("Upload failed")},i.onerror=function(){u("Upload error")},i.send(s)});return{xhr:i,promise:a}}},{key:"getElementUrl",value:function e(e,t){var n="?session_id=".concat(t);return this.buildEndpoint("/project/file/".concat(e).concat(n))}},{key:"getLogoEndpoint",value:function e(e){return this.buildEndpoint("/logo?theme=".concat(e))}},{key:"getOAuthEndpoint",value:function e(e){return this.buildEndpoint("/auth/oauth/".concat(e))}}]);return n}(eM);Object.defineProperty(exports,"Socket",{enumerable:true,get:function e(){return U.Socket}});exports.APIBase=eM;exports.ChainlitAPI=eq;exports.ClientError=eV;exports.accessTokenState=ec;exports.actionState=$;exports.addMessage=em;exports.addMessageToParent=eg;exports.askUserState=et;exports.callFnState=en;exports.chatProfileState=N;exports.chatSettingsDefaultValueSelector=eo;exports.chatSettingsInputsState=er;exports.chatSettingsValueState=ei;exports.currentThreadIdState=ep;exports.deleteMessageById=eR;exports.elementState=ea;exports.fetcher=eP;exports.firstUserInteraction=es;exports.hasMessageById=eS;exports.isLastMessage=ey;exports.loadingState=ee;exports.messagesState=Q;exports.nestMessages=eh;exports.sessionIdState=K;exports.sessionState=Y;exports.sideViewState=ed;exports.tasklistState=eu;exports.threadHistoryState=ef;exports.threadIdToResumeState=J;exports.tokenCountState=Z;exports.updateMessageById=ew;exports.updateMessageContentById=ex;exports.useApi=eA;exports.useAuth=eD;exports.useChatData=ev;exports.useChatInteract=eO;exports.useChatMessages=e_;exports.useChatSession=eI;exports.userState=el;//# sourceMappingURL=out.js.map
|
|
1
|
+
"use strict";function e(e,t){if(t==null||t>e.length)t=e.length;for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function t(e){if(Array.isArray(e))return e}function n(t){if(Array.isArray(t))return e(t)}function r(e){if(e===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return e}function o(e,t,n,r,o,i,a){try{var u=e[i](a);var s=u.value}catch(e){n(e);return}if(u.done){t(s)}else{Promise.resolve(s).then(r,o)}}function i(e){return function(){var t=this,n=arguments;return new Promise(function(r,i){var a=e.apply(t,n);function u(e){o(a,r,i,u,s,"next",e)}function s(e){o(a,r,i,u,s,"throw",e)}u(undefined)})}}function a(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function u(e,t,n){if(j()){u=Reflect.construct}else{u=function e(e,t,n){var r=[null];r.push.apply(r,t);var o=Function.bind.apply(e,r);var i=new o;if(n)_(i,n.prototype);return i}}return u.apply(null,arguments)}function s(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||false;r.configurable=true;if("value"in r)r.writable=true;Object.defineProperty(e,r.key,r)}}function c(e,t,n){if(t)s(e.prototype,t);if(n)s(e,n);return e}function l(e,t,n){if(t in e){Object.defineProperty(e,t,{value:n,enumerable:true,configurable:true,writable:true})}else{e[t]=n}return e}function f(e){f=Object.setPrototypeOf?Object.getPrototypeOf:function e(e){return e.__proto__||Object.getPrototypeOf(e)};return f(e)}function d(e,t){if(typeof t!=="function"&&t!==null){throw new TypeError("Super expression must either be null or a function")}e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:true,configurable:true}});if(t)_(e,t)}function p(e,t){if(t!=null&&typeof Symbol!=="undefined"&&t[Symbol.hasInstance]){return!!t[Symbol.hasInstance](e)}else{return e instanceof t}}function v(e){return Function.toString.call(e).indexOf("[native code]")!==-1}function h(e){if(typeof Symbol!=="undefined"&&e[Symbol.iterator]!=null||e["@@iterator"]!=null)return Array.from(e)}function y(e,t){var n=e==null?null:typeof Symbol!=="undefined"&&e[Symbol.iterator]||e["@@iterator"];if(n==null)return;var r=[];var o=true;var i=false;var a,u;try{for(n=n.call(e);!(o=(a=n.next()).done);o=true){r.push(a.value);if(t&&r.length===t)break}}catch(e){i=true;u=e}finally{try{if(!o&&n["return"]!=null)n["return"]()}finally{if(i)throw u}}return r}function g(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function m(){throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function b(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};var r=Object.keys(n);if(typeof Object.getOwnPropertySymbols==="function"){r=r.concat(Object.getOwnPropertySymbols(n).filter(function(e){return Object.getOwnPropertyDescriptor(n,e).enumerable}))}r.forEach(function(t){l(e,t,n[t])})}return e}function k(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);if(t){r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})}n.push.apply(n,r)}return n}function S(e,t){t=t!=null?t:{};if(Object.getOwnPropertyDescriptors){Object.defineProperties(e,Object.getOwnPropertyDescriptors(t))}else{k(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function w(e,t){if(e==null)return{};var n=R(e,t);var r,o;if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++){r=i[o];if(t.indexOf(r)>=0)continue;if(!Object.prototype.propertyIsEnumerable.call(e,r))continue;n[r]=e[r]}}return n}function R(e,t){if(e==null)return{};var n={};var r=Object.keys(e);var o,i;for(i=0;i<r.length;i++){o=r[i];if(t.indexOf(o)>=0)continue;n[o]=e[o]}return n}function x(e,t){if(t&&(T(t)==="object"||typeof t==="function")){return t}return r(e)}function _(e,t){_=Object.setPrototypeOf||function e(e,t){e.__proto__=t;return e};return _(e,t)}function C(e,n){return t(e)||y(e,n)||I(e,n)||g()}function O(e){return n(e)||h(e)||I(e)||m()}function T(e){"@swc/helpers - typeof";return e&&typeof Symbol!=="undefined"&&e.constructor===Symbol?"symbol":typeof e}function I(t,n){if(!t)return;if(typeof t==="string")return e(t,n);var r=Object.prototype.toString.call(t).slice(8,-1);if(r==="Object"&&t.constructor)r=t.constructor.name;if(r==="Map"||r==="Set")return Array.from(r);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return e(t,n)}function E(e){var t=typeof Map==="function"?new Map:undefined;E=function e(e){if(e===null||!v(e))return e;if(typeof e!=="function"){throw new TypeError("Super expression must either be null or a function")}if(typeof t!=="undefined"){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return u(e,arguments,f(this).constructor)}n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:false,writable:true,configurable:true}});return _(n,e)};return E(e)}function j(){if(typeof Reflect==="undefined"||!Reflect.construct)return false;if(Reflect.construct.sham)return false;if(typeof Proxy==="function")return true;try{Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}));return true}catch(e){return false}}function A(e){var t=j();return function n(){var n=f(e),r;if(t){var o=f(this).constructor;r=Reflect.construct(n,arguments,o)}else{r=n.apply(this,arguments)}return x(this,r)}}function P(e,t){var n,r,o,i,a={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]};return(i={next:u(0),"throw":u(1),"return":u(2)},typeof Symbol==="function"&&(i[Symbol.iterator]=function(){return this}),i);function u(e){return function(t){return s([e,t])}}function s(i){if(n)throw new TypeError("Generator is already executing.");while(a)try{if(n=1,r&&(o=i[0]&2?r["return"]:i[0]?r["throw"]||((o=r["return"])&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;if(r=0,o)i=[i[0]&2,o.value];switch(i[0]){case 0:case 1:o=i;break;case 4:a.label++;return{value:i[1],done:false};case 5:a.label++;r=i[1];i=[0];continue;case 7:i=a.ops.pop();a.trys.pop();continue;default:if(!(o=a.trys,o=o.length>0&&o[o.length-1])&&(i[0]===6||i[0]===2)){a=0;continue}if(i[0]===3&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(i[0]===6&&a.label<o[1]){a.label=o[1];o=i;break}if(o&&a.label<o[2]){a.label=o[2];a.ops.push(i);break}if(o[2])a.ops.pop();a.trys.pop();continue}i=t.call(e,a)}catch(e){i=[6,e];r=0}finally{n=o=0}if(i[0]&5)throw i[1];return{value:i[0]?i[1]:void 0,done:true}}}var D=require("recoil");var V=require("lodash");var M=require("uuid");var q=require("react");var U=require("jwt-decode");var F=require("swr");var L=require("socket.io-client");function B(e){return e&&e.__esModule?e:{default:e}}var G=/*#__PURE__*/B(U);var H=/*#__PURE__*/B(F);var X=/*#__PURE__*/B(L);var z=function(e){var t={},n=new Date,r=new Date;r.setDate(n.getDate()-1);var o=new Date;o.setDate(n.getDate()-7);var i=new Date;return i.setDate(n.getDate()-30),e.forEach(function(e){var a=new Date(e.createdAt),u=a.toDateString()===n.toDateString(),s=a.toDateString()===r.toDateString(),c=a>=o,l=a>=i,f;u?f="Today":s?f="Yesterday":c?f="Previous 7 days":l?f="Previous 30 days":f=a.toLocaleString("default",{month:"long",year:"numeric"}).split(" ").slice(0,1).join(" "),t[f]||(t[f]=[]),t[f].push(e)}),t};var J=D.atom({key:"ThreadIdToResume",default:void 0}),N=D.atom({key:"ChatProfile",default:void 0}),W=D.atom({key:"SessionId",default:M.v4()}),K=D.selector({key:"SessionIdSelector",get:function(e){var t=e.get;return t(W)},set:function(e,t){var n=e.set;return n(W,p(t,D.DefaultValue)?M.v4():t)}}),Y=D.atom({key:"Session",dangerouslyAllowMutability:!0,default:void 0}),$=D.atom({key:"Actions",default:[]}),Q=D.atom({key:"Messages",dangerouslyAllowMutability:!0,default:[]}),Z=D.atom({key:"TokenCount",default:0}),ee=D.atom({key:"Loading",default:!1}),et=D.atom({key:"AskUser",default:void 0}),en=D.atom({key:"CallFn",default:void 0}),er=D.atom({key:"ChatSettings",default:[]}),eo=D.selector({key:"ChatSettingsValue/Default",get:function(e){var t=e.get;return t(er).reduce(function(e,t){return e[t.id]=t.initial,e},{})}}),ei=D.atom({key:"ChatSettingsValue",default:eo}),ea=D.atom({key:"DisplayElements",default:[]}),eu=D.atom({key:"TasklistElements",default:[]}),es=D.atom({key:"FirstUserInteraction",default:void 0}),ec=D.atom({key:"AccessToken",default:void 0}),el=D.atom({key:"User",default:null}),ef=D.atom({key:"ChainlitConfig",default:void 0}),ed=D.atom({key:"ThreadHistory",default:{threads:void 0,currentThreadId:void 0,timeGroupedThreads:void 0,pageInfo:void 0},effects:[function(e){var t=e.setSelf,n=e.onSet;n(function(e,n){var r=e===null||e===void 0?void 0:e.timeGroupedThreads;(e===null||e===void 0?void 0:e.threads)&&!V.isEqual(e.threads,n===null||n===void 0?void 0:n.timeGroupedThreads)&&(r=z(e.threads)),t(S(b({},e),{timeGroupedThreads:r}))})}]}),ep=D.atom({key:"SideView",default:void 0}),ev=D.atom({key:"CurrentThreadId",default:void 0});var eh=function(){var e=D.useRecoilValue(ee),t=D.useRecoilValue(ea),n=D.useRecoilValue(eu),r=D.useRecoilValue($),o=D.useRecoilValue(Y),i=D.useRecoilValue(et),a=D.useRecoilValue(en),u=D.useRecoilValue(er),s=D.useRecoilValue(ei),c=D.useRecoilValue(eo),l=(o===null||o===void 0?void 0:o.socket.connected)&&!(o===null||o===void 0?void 0:o.error),f=!l||e||(i===null||i===void 0?void 0:i.spec.type)==="file"||(i===null||i===void 0?void 0:i.spec.type)==="action";return{actions:r,askUser:i,callFn:a,chatSettingsDefaultValue:c,chatSettingsInputs:u,chatSettingsValue:s,connected:l,disabled:f,elements:t,error:o===null||o===void 0?void 0:o.error,loading:e,tasklists:n}};var ey=function(e){var t=[];var n=true,r=false,o=undefined;try{for(var i=e[Symbol.iterator](),a;!(n=(a=i.next()).done);n=true){var u=a.value;t=em(t,u)}}catch(e){r=true;o=e}finally{try{if(!n&&i.return!=null){i.return()}}finally{if(r){throw o}}}return t},eg=function(e,t){if(e.length-1===t)return!0;for(var n=t+1;n<e.length;n++)if(!e[n].streaming)return!1;return!0},em=function(e,t){var n=["assistant_message","user_message"],r=O(n).concat(["tool"]),o=n.includes(t.type),i=r.includes(t.type),a=!t.parentId;if(a&&!i)return e;var u=a?void 0:eS(e,t.parentId),s=(a||(u===null||u===void 0?void 0:u.type)!=="assistant_message")&&t.type==="tool";if(ew(e,t.id))return eR(e,t.id,t);if(s){var c=e.length>0?e[e.length-1]:void 0,l=(c===null||c===void 0?void 0:c.type)==="assistant_message"&&(c===null||c===void 0?void 0:c.id.startsWith("wrap_"));return c&&l?O(e.slice(0,e.length-1)).concat([S(b({},c),{steps:O(c.steps||[]).concat([t])})]):O(e).concat([S(b({},t),{name:"",input:"",output:"",id:"wrap_"+t.id,type:"assistant_message",steps:[t]})])}else return!o&&"parentId"in t&&t.parentId?ek(e,t.parentId,t):"indent"in t&&t.indent&&t.indent>0?eb(e,t.indent,t):O(e).concat([t])},eb=function(e,t,n){var r=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;var o=O(e);if(o.length===0)return O(o).concat([n]);{var i=o.length-1,a=o[i];return a.steps=a.steps||[],r+1===t?(a.steps=O(a.steps).concat([n]),o[i]=b({},a),o):(a.steps=eb(a.steps,t,n,r+1),o[i]=b({},a),o)}},ek=function(e,t,n){var r=O(e);for(var o=0;o<r.length;o++){var i=r[o];V.isEqual(i.id,t)?(i.steps=i.steps?O(i.steps).concat([n]):[n],r[o]=b({},i)):ew(r,t)&&i.steps&&(i.steps=ek(i.steps,t,n),r[o]=b({},i))}return r},eS=function(e,t){var n=true,r=false,o=undefined;try{for(var i=e[Symbol.iterator](),a;!(n=(a=i.next()).done);n=true){var u=a.value;if(V.isEqual(u.id,t))return u;if(u.steps&&u.steps.length>0){var s=eS(u.steps,t);if(s)return s}}}catch(e){r=true;o=e}finally{try{if(!n&&i.return!=null){i.return()}}finally{if(r){throw o}}}},ew=function(e,t){return eS(e,t)!==void 0},eR=function(e,t,n){var r=O(e);for(var o=0;o<r.length;o++){var i=r[o];V.isEqual(i.id,t)?r[o]=b({steps:i.steps},n):ew(r,t)&&i.steps&&(i.steps=eR(i.steps,t,n),r[o]=b({},i))}return r},ex=function(e,t){var n=O(e);for(var r=0;r<n.length;r++){var o=n[r];o.id===t?n=O(n.slice(0,r)).concat(O(n.slice(r+1))):ew(n,t)&&o.steps&&(o.steps=ex(o.steps,t),n[r]=b({},o))}return n},e_=function(e,t,n,r,o){var i=O(e);for(var a=0;a<i.length;a++){var u=i[a];V.isEqual(u.id,t)?("content"in u&&u.content!==void 0?r?u.content=n:u.content+=n:o?"input"in u&&u.input!==void 0&&(r?u.input=n:u.input+=n):"output"in u&&u.output!==void 0&&(r?u.output=n:u.output+=n),i[a]=b({},u)):u.steps&&(u.steps=e_(u.steps,t,n,r,o),i[a]=b({},u))}return i};var eC="token";function eO(){try{return localStorage.getItem(eC)}catch(e){return}}function eT(e){try{return localStorage.setItem(eC,e)}catch(e){return}}function eI(){try{return localStorage.removeItem(eC)}catch(e){return}}var eE=function(){var e=i(function(e,t,n){var r;return P(this,function(o){switch(o.label){case 0:return[4,e.get(t,n)];case 1:return[2,(r=o.sent())===null||r===void 0?void 0:r.json()]}})});return function t(t,n,r){return e.apply(this,arguments)}}();function ej(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};var n=t.token,r=w(t,["token"]);var o=q.useContext(eq),i=D.useRecoilValue(ec);i=n||i;var a=q.useMemo(function(){return function(e){var t=C(e,2),n=t[0],r=t[1];return eE(o,n,r)}},[o]),u=q.useMemo(function(){return e?[e,i]:null},[e,i]);return H.default(u,a,r)}var eA=function(){var e=q.useContext(eq),t=ej("/auth/config"),n=t.data,r=t.isLoading,o=C(D.useRecoilState(ec),2),a=o[0],u=o[1],s=D.useSetRecoilState(ed),c=C(D.useRecoilState(el),2),l=c[0],f=c[1],d=!!(!r&&n),p=function(){var t=i(function(){return P(this,function(t){switch(t.label){case 0:return[4,e.logout()];case 1:t.sent(),f(null),eI(),u(""),s(void 0);return[2]}})});return function e(){return t.apply(this,arguments)}}(),v=function(e){if(!e){p();return}try{var t=G.default(e),n=t.exp,r=w(t,["exp"]);eT(e),u("Bearer ".concat(e)),f(r)}catch(e){console.error("Invalid token, clearing token from local storage","error:",e),p()}};q.useEffect(function(){if(!l&&eO()){v(eO());return}},[]);var h=!!a;return n&&!n.requireLogin?{data:n,user:null,isReady:d,isAuthenticated:!0,accessToken:"",logout:function(){},setAccessToken:function(){}}:{data:n,user:l,isAuthenticated:h,isReady:d,accessToken:a,logout:p,setAccessToken:v}};var eP=/*#__PURE__*/function(e){d(n,e);var t=A(n);function n(e,r){a(this,n);var o;o=t.call(this,e);o.detail=r;return o}c(n,[{key:"toString",value:function e(){return this.detail?"".concat(this.message,": ").concat(this.detail):this.message}}]);return n}(E(Error)),eD=/*#__PURE__*/function(){function e(t,n,r,o){a(this,e);this.httpEndpoint=t;this.type=n;this.on401=r;this.onError=o}c(e,[{key:"buildEndpoint",value:function e(e){return this.httpEndpoint.endsWith("/")?"".concat(this.httpEndpoint.slice(0,-1)).concat(e):"".concat(this.httpEndpoint).concat(e)}},{key:"checkToken",value:function e(e){var t="Bearer ";return e.startsWith(t)?e:t+e}},{key:"fetch",value:function e(e,t,n,r,o){var a=this;return i(function(){var i,u,s,c,l;return P(this,function(f){switch(f.label){case 0:f.trys.push([0,4,,5]);i={};n&&(i.Authorization=a.checkToken(n));p(r,FormData)?u=r:(i["Content-Type"]="application/json",u=r?JSON.stringify(r):null);return[4,fetch(a.buildEndpoint(t),{method:e,headers:i,signal:o,body:u})];case 1:s=f.sent();if(!!s.ok)return[3,3];return[4,s.json()];case 2:c=f.sent();throw s.status===401&&a.on401&&(eI(),a.on401()),new eP(s.statusText,c.detail);case 3:return[2,s];case 4:l=f.sent();throw p(l,eP)&&a.onError&&a.onError(l),console.error(l),l;case 5:return[2]}})})()}},{key:"get",value:function e(e,t){var n=this;return i(function(){return P(this,function(r){switch(r.label){case 0:return[4,n.fetch("GET",e,t)];case 1:return[2,r.sent()]}})})()}},{key:"post",value:function e(e,t,n,r){var o=this;return i(function(){return P(this,function(i){switch(i.label){case 0:return[4,o.fetch("POST",e,n,t,r)];case 1:return[2,i.sent()]}})})()}},{key:"put",value:function e(e,t,n){var r=this;return i(function(){return P(this,function(o){switch(o.label){case 0:return[4,r.fetch("PUT",e,n,t)];case 1:return[2,o.sent()]}})})()}},{key:"patch",value:function e(e,t,n){var r=this;return i(function(){return P(this,function(o){switch(o.label){case 0:return[4,r.fetch("PATCH",e,n,t)];case 1:return[2,o.sent()]}})})()}},{key:"delete",value:function e(e,t,n){var r=this;return i(function(){return P(this,function(o){switch(o.label){case 0:return[4,r.fetch("DELETE",e,n,t)];case 1:return[2,o.sent()]}})})()}}]);return e}(),eV=/*#__PURE__*/function(e){d(n,e);var t=A(n);function n(){a(this,n);return t.apply(this,arguments)}c(n,[{key:"headerAuth",value:function e(){var e=this;return i(function(){return P(this,function(t){switch(t.label){case 0:return[4,e.post("/auth/header",{})];case 1:return[2,t.sent().json()]}})})()}},{key:"passwordAuth",value:function e(e){var t=this;return i(function(){return P(this,function(n){switch(n.label){case 0:return[4,t.post("/login",e)];case 1:return[2,n.sent().json()]}})})()}},{key:"logout",value:function e(){var e=this;return i(function(){return P(this,function(t){switch(t.label){case 0:return[4,e.post("/logout",{})];case 1:return[2,t.sent().json()]}})})()}},{key:"setFeedback",value:function e(e,t){var n=this;return i(function(){return P(this,function(r){switch(r.label){case 0:return[4,n.put("/feedback",{feedback:e},t)];case 1:return[2,r.sent().json()]}})})()}},{key:"deleteFeedback",value:function e(e,t){var n=this;return i(function(){return P(this,function(r){switch(r.label){case 0:return[4,n.delete("/feedback",{feedbackId:e},t)];case 1:return[2,r.sent().json()]}})})()}},{key:"listThreads",value:function e(e,t,n){var r=this;return i(function(){return P(this,function(o){switch(o.label){case 0:return[4,r.post("/project/threads",{pagination:e,filter:t},n)];case 1:return[2,o.sent().json()]}})})()}},{key:"deleteThread",value:function e(e,t){var n=this;return i(function(){return P(this,function(r){switch(r.label){case 0:return[4,n.delete("/project/thread",{threadId:e},t)];case 1:return[2,r.sent().json()]}})})()}},{key:"uploadFile",value:function e(e,t,n,r){var o=this;var i=new XMLHttpRequest,a=new Promise(function(a,u){var s=new FormData;s.append("file",e),i.open("POST",o.buildEndpoint("/project/file?session_id=".concat(n)),!0),r&&i.setRequestHeader("Authorization",o.checkToken(r)),i.upload.onprogress=function(e){if(e.lengthComputable){var n=e.loaded/e.total*100;t(n)}},i.onload=function(){if(i.status===200){var e=JSON.parse(i.responseText);a(e)}else u("Upload failed")},i.onerror=function(){u("Upload error")},i.send(s)});return{xhr:i,promise:a}}},{key:"getElementUrl",value:function e(e,t){var n="?session_id=".concat(t);return this.buildEndpoint("/project/file/".concat(e).concat(n))}},{key:"getLogoEndpoint",value:function e(e){return this.buildEndpoint("/logo?theme=".concat(e))}},{key:"getOAuthEndpoint",value:function e(e){return this.buildEndpoint("/auth/oauth/".concat(e))}}]);return n}(eD);var eM=void 0,eq=q.createContext(new eV("http://localhost:8000","webapp"));var eU=function(){var e=q.useContext(eq),t=D.useRecoilValue(ec),n=D.useRecoilValue(Y),r=D.useRecoilValue(et),o=D.useRecoilValue(K),i=D.useResetRecoilState(er),a=D.useResetRecoilState(K),u=D.useResetRecoilState(ei),s=D.useSetRecoilState(es),c=D.useSetRecoilState(ee),l=D.useSetRecoilState(Q),f=D.useSetRecoilState(ea),d=D.useSetRecoilState(eu),p=D.useSetRecoilState($),v=D.useSetRecoilState(Z),h=D.useSetRecoilState(J),y=D.useSetRecoilState(ep),g=D.useSetRecoilState(ev),m=q.useCallback(function(){n===null||n===void 0?void 0:n.socket.emit("clear_session"),n===null||n===void 0?void 0:n.socket.disconnect(),h(void 0),a(),s(void 0),l([]),f([]),d([]),p([]),v(0),i(),u(),y(void 0),g(void 0)},[n]),b=q.useCallback(function(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[];e.id||(e.id=M.v4()),e.createdAt||(e.createdAt=new Date().toISOString()),l(function(t){return em(t,e)}),n===null||n===void 0?void 0:n.socket.emit("client_message",{message:e,fileReferences:t})},[n===null||n===void 0?void 0:n.socket]),k=q.useCallback(function(e,t,r,o){n===null||n===void 0?void 0:n.socket.emit("audio_chunk",{isStart:e,mimeType:t,elapsedTime:r,data:o})},[n===null||n===void 0?void 0:n.socket]),S=q.useCallback(function(e){n===null||n===void 0?void 0:n.socket.emit("audio_end",{fileReferences:e})},[n===null||n===void 0?void 0:n.socket]),w=q.useCallback(function(e){r&&(l(function(t){return em(t,e)}),r.callback(e))},[r]),R=q.useCallback(function(e){n===null||n===void 0?void 0:n.socket.emit("chat_settings_change",e)},[n===null||n===void 0?void 0:n.socket]),x=q.useCallback(function(){l(function(e){return e.map(function(e){return e.streaming=!1,e})}),c(!1),n===null||n===void 0?void 0:n.socket.emit("stop")},[n===null||n===void 0?void 0:n.socket]),_=q.useCallback(function(e){var t=n===null||n===void 0?void 0:n.socket;if(!t)return;var r=new Promise(function(e,n){t.once("action_response",function(t){t.status?e(t):n(t)})});return t.emit("action_call",e),r},[n===null||n===void 0?void 0:n.socket]);return{uploadFile:q.useCallback(function(n,r){return e.uploadFile(n,r,o,t)},[o,t]),callAction:_,clear:m,replyMessage:w,sendMessage:b,sendAudioChunk:k,endAudioStream:S,stopTask:x,setIdToResume:h,updateChatSettings:R}};var eF=function(){var e=D.useRecoilValue(Q),t=D.useRecoilValue(es);return{threadId:D.useRecoilValue(ev),messages:e,firstInteraction:t}};var eL=function(){var e=q.useContext(eq),t=D.useRecoilValue(K),n=C(D.useRecoilState(Y),2),r=n[0],o=n[1],i=D.useResetRecoilState(ei),a=D.useSetRecoilState(es),u=D.useSetRecoilState(ee),s=D.useSetRecoilState(Q),c=D.useSetRecoilState(et),l=D.useSetRecoilState(en),f=D.useSetRecoilState(ea),d=D.useSetRecoilState(eu),p=D.useSetRecoilState($),v=D.useSetRecoilState(er),h=D.useSetRecoilState(Z),y=C(D.useRecoilState(N),2),g=y[0],m=y[1],k=D.useRecoilValue(J),w=D.useSetRecoilState(ev),R=q.useCallback(function(n){var r=n.userEnv,y=n.accessToken;var R=new URL(e.httpEndpoint),x=R.protocol,_=R.host,C=R.pathname,T="".concat(x,"//").concat(_),I=C&&C!=="/"?"".concat(C,"/ws/socket.io"):"/ws/socket.io",E=X.default(T,{path:I,extraHeaders:{Authorization:y||"","X-Chainlit-Client-Type":e.type,"X-Chainlit-Session-Id":t,"X-Chainlit-Thread-Id":k||"","user-env":JSON.stringify(r),"X-Chainlit-Chat-Profile":g?encodeURIComponent(g):""}});o(function(e){var t,n;return e===null||e===void 0?void 0:(t=e.socket)===null||t===void 0?void 0:t.removeAllListeners(),e===null||e===void 0?void 0:(n=e.socket)===null||n===void 0?void 0:n.close(),{socket:E}}),E.on("connect",function(){E.emit("connection_successful"),o(function(e){return S(b({},e),{error:!1})})}),E.on("connect_error",function(e){o(function(e){return S(b({},e),{error:!0})})}),E.on("task_start",function(){u(!0)}),E.on("task_end",function(){u(!1)}),E.on("reload",function(){E.emit("clear_session"),window.location.reload()}),E.on("resume_thread",function(e){var t,n;var r=[];var o=true,i=false,a=undefined;try{for(var u=e.steps[Symbol.iterator](),c;!(o=(c=u.next()).done);o=true){var l=c.value;r=em(r,l)}}catch(e){i=true;a=e}finally{try{if(!o&&u.return!=null){u.return()}}finally{if(i){throw a}}}((t=e.metadata)===null||t===void 0?void 0:t.chat_profile)&&m((n=e.metadata)===null||n===void 0?void 0:n.chat_profile),s(r);var p=e.elements||[];d(p.filter(function(e){return e.type==="tasklist"})),f(p.filter(function(e){return["avatar","tasklist"].indexOf(e.type)===-1}))}),E.on("new_message",function(e){s(function(t){return em(t,e)})}),E.on("first_interaction",function(e){a(e.interaction),w(e.thread_id)}),E.on("update_message",function(e){s(function(t){return eR(t,e.id,e)})}),E.on("delete_message",function(e){s(function(t){return ex(t,e.id)})}),E.on("stream_start",function(e){s(function(t){return em(t,e)})}),E.on("stream_token",function(e){var t=e.id,n=e.token,r=e.isSequence,o=e.isInput;s(function(e){return e_(e,t,n,r,o)})}),E.on("ask",function(e,t){var n=e.msg,r=e.spec;c({spec:r,callback:t}),s(function(e){return em(e,n)}),u(!1)}),E.on("ask_timeout",function(){c(void 0),u(!1)}),E.on("clear_ask",function(){c(void 0)}),E.on("call_fn",function(e,t){var n=e.name,r=e.args;l({name:n,args:r,callback:t})}),E.on("clear_call_fn",function(){l(void 0)}),E.on("call_fn_timeout",function(){l(void 0)}),E.on("chat_settings",function(e){v(e),i()}),E.on("element",function(n){!n.url&&n.chainlitKey&&(n.url=e.getElementUrl(n.chainlitKey,t)),n.type==="tasklist"?d(function(e){var t=e.findIndex(function(e){return e.id===n.id});return t===-1?O(e).concat([n]):O(e.slice(0,t)).concat([n],O(e.slice(t+1)))}):f(function(e){var t=e.findIndex(function(e){return e.id===n.id});return t===-1?O(e).concat([n]):O(e.slice(0,t)).concat([n],O(e.slice(t+1)))})}),E.on("remove_element",function(e){f(function(t){return t.filter(function(t){return t.id!==e.id})}),d(function(t){return t.filter(function(t){return t.id!==e.id})})}),E.on("action",function(e){p(function(t){return O(t).concat([e])})}),E.on("remove_action",function(e){p(function(t){var n=t.findIndex(function(t){return t.id===e.id});return n===-1?t:O(t.slice(0,n)).concat(O(t.slice(n+1)))})}),E.on("token_usage",function(e){h(function(t){return t+e})})},[o,t,g]),x=q.useCallback(V.debounce(R,200),[R]),_=q.useCallback(function(){(r===null||r===void 0?void 0:r.socket)&&(r.socket.removeAllListeners(),r.socket.close())},[r]);return{connect:x,disconnect:_,session:r,sessionId:t,chatProfile:g,idToResume:k,setChatProfile:m}};var eB={enabled:!0,min_decibels:-45,initial_silence_timeout:3e3,silence_timeout:1500,max_duration:15e3,chunk_duration:1e3},eG=function(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:eB;var t=q.useRef(null),n=q.useRef(!1),r=eU(),o=r.sendAudioChunk,a=r.endAudioStream,u=C(q.useState(!1),2),s=u[0],c=u[1],l=C(q.useState(void 0),2),f=l[0],d=l[1],p=C(q.useState(!1),2),v=p[0],h=p[1],y=C(q.useState(void 0),2),g=y[0],m=y[1],b=C(q.useState(!1),2),k=b[0],S=b[1],w=q.useCallback(function(){!s||!t.current||(n.current=!0,t.current.stop())},[s]),R=q.useCallback(function(){!s||!t.current||t.current.stop()},[s]);return{startRecording:q.useCallback(function(r){if(s||!e)return;S(!1),m(void 0),clearTimeout(f),n.current=!1;var u=e.min_decibels,l=e.silence_timeout,p=e.initial_silence_timeout,v=e.chunk_duration,y=e.max_duration;navigator.mediaDevices.getUserMedia({audio:!0}).then(function(e){var s=!1,f=!1,g=!0,m=null,b=Date.now(),k=new MediaRecorder(e);t.current=k,k.addEventListener("start",function(){c(!0),b=Date.now()}),k.addEventListener("dataavailable",function(){var t=i(function(t){var n,r,i,a,u;return P(this,function(c){switch(c.label){case 0:if(s||(m?m=new Blob([m,t.data],{type:t.data.type}):m=new Blob([t.data],{type:t.data.type})),k.state==="inactive")return[2];n=Date.now()-b;if(n>=y){k.stop(),e.getTracks().forEach(function(e){return e.stop()});return[2]}h(f);r=C(k.mimeType.split(";"),2),i=r[0],a=r[1];if(!m)return[3,2];return[4,o(g,i,n,new Blob([m,t.data]))];case 1:u=(c.sent(),m=null);return[3,4];case 2:return[4,o(g,i,n,t.data)];case 3:u=c.sent();c.label=4;case 4:u,g&&(g=!1);return[2]}})});return function(e){return t.apply(this,arguments)}}()),k.addEventListener("stop",/*#__PURE__*/i(function(){var e;return P(this,function(t){switch(t.label){case 0:c(!1),h(!1);e=s&&!n.current;if(!e)return[3,2];S(!0);return[4,a(r)];case 1:e=t.sent();t.label=2;case 2:e;return[2]}})}));var w=new AudioContext,R=w.createMediaStreamSource(e),x=w.createAnalyser();x.minDecibels=u,R.connect(x);var _=x.frequencyBinCount,O=new Uint8Array(_);k.start(v);var T=function(){if(k.state==="inactive")return;x.getByteFrequencyData(O);var e=O.some(function(e){return e>0});f||(f=e),!s&&e&&(h(f),s=!0),requestAnimationFrame(T)};T(),setTimeout(function(){s?d(setInterval(function(){f?f=!1:(k.stop(),e.getTracks().forEach(function(e){return e.stop()}))},l)):(k.stop(),e.getTracks().forEach(function(e){return e.stop()}))},p)}).catch(function(e){m(e.message)})},[f,s,e,o,a]),stopRecording:R,cancelRecording:w,isRecording:s,isSpeaking:v,isRecordingFinished:k,error:g}};var eH=function(e){var t=C(D.useRecoilState(ef),2),n=t[0],r=t[1],o=eA(),i=o.isAuthenticated,a=navigator.language||"en-US",u=ej(!n&&i?"/project/settings?language=".concat(a):null,{token:e}),s=u.data,c=u.error,l=u.isLoading;return q.useEffect(function(){s&&r(s)},[s,r]),{config:n,error:c,isLoading:l,language:a}};Object.defineProperty(exports,"Socket",{enumerable:true,get:function e(){return L.Socket}});exports.APIBase=eD;exports.ChainlitAPI=eV;exports.ChainlitContext=eq;exports.ClientError=eP;exports.accessTokenState=ec;exports.actionState=$;exports.addMessage=em;exports.addMessageToParent=ek;exports.askUserState=et;exports.callFnState=en;exports.chatProfileState=N;exports.chatSettingsDefaultValueSelector=eo;exports.chatSettingsInputsState=er;exports.chatSettingsValueState=ei;exports.configState=ef;exports.currentThreadIdState=ev;exports.defaultChainlitContext=eM;exports.deleteMessageById=ex;exports.elementState=ea;exports.fetcher=eE;exports.firstUserInteraction=es;exports.hasMessageById=ew;exports.isLastMessage=eg;exports.loadingState=ee;exports.messagesState=Q;exports.nestMessages=ey;exports.sessionIdState=K;exports.sessionState=Y;exports.sideViewState=ep;exports.tasklistState=eu;exports.threadHistoryState=ed;exports.threadIdToResumeState=J;exports.tokenCountState=Z;exports.updateMessageById=eR;exports.updateMessageContentById=e_;exports.useApi=ej;exports.useAudio=eG;exports.useAuth=eA;exports.useChatData=eh;exports.useChatInteract=eU;exports.useChatMessages=eF;exports.useChatSession=eL;exports.useConfig=eH;exports.userState=el;//# sourceMappingURL=out.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/useChatData.ts","../src/state.ts","../src/utils/group.ts","../src/useChatInteract.ts","../src/utils/message.ts","../src/useChatMessages.ts","../src/useChatSession.ts","../src/utils/token.ts","../src/api/hooks/auth.ts","../src/api/hooks/api.ts","../src/api/index.tsx","../src/index.ts"],"names":["useRecoilValue","isEqual","DefaultValue","atom","selector","uuidv4","groupByDate","data","groupedData","today","yesterday","sevenDaysAgo","thirtyDaysAgo","item","createdAt","isToday","isYesterday","isLast7Days","isLast30Days","category","threadIdToResumeState","chatProfileState","sessionIdAtom","sessionIdState","get","set","newValue","sessionState","actionState","messagesState","tokenCountState","loadingState","askUserState","callFnState","chatSettingsInputsState","chatSettingsDefaultValueSelector","form","input","chatSettingsValueState","elementState","tasklistState","firstUserInteraction","accessTokenState","userState","threadHistoryState","setSelf","onSet","oldValue","timeGroupedThreads","sideViewState","currentThreadIdState","useChatData","loading","elements","tasklists","actions","session","askUser","chatSettingsInputs","chatSettingsValue","chatSettingsDefaultValue","connected","disabled","useCallback","useResetRecoilState","useSetRecoilState","nestMessages","messages","nestedMessages","message","addMessage","isLastMessage","index","i","isValidRootType","isRoot","parentMessage","findMessageById","shouldWrap","hasMessageById","updateMessageById","lastMessage","collapseTool","addMessageToParent","addIndentMessage","indent","newMessage","currentIndentation","nextMessages","msg","parentId","messageId","foundMessage","updatedMessage","deleteMessageById","updateMessageContentById","updatedContent","isSequence","isInput","useChatInteract","accessToken","sessionId","resetChatSettings","resetSessionId","resetChatSettingsValue","setFirstUserInteraction","setLoading","setMessages","setElements","setTasklists","setActions","setTokenCount","setIdToResume","setSideView","setCurrentThreadId","clear","sendCopilotEvent","sendMessage","fileReferences","oldMessages","sendAudioChunk","isStart","mimeType","elapsedTime","endAudioStream","replyMessage","updateChatSettings","values","stopTask","m","callAction","action","socket","promise","resolve","reject","response","client","file","onProgress","useChatMessages","firstInteraction","debounce","useRecoilState","io","useChatSession","setSession","setAskUser","setCallFn","setChatSettingsInputs","chatProfile","setChatProfile","idToResume","_connect","userEnv","protocol","host","pathname","uri","path","old","s","_","thread","step","e","event","id","token","spec","callback","name","args","inputs","element","remove","a","count","connect","disconnect","tokenKey","getToken","setToken","removeToken","jwt_decode","useEffect","useSWR","fetcher","endpoint","useApi","options","url","useAuth","apiClient","isLoading","setAccessToken","setThreadHistory","user","setUser","isReady","logout","saveAndSetToken","exp","User","isAuthenticated","ClientError","detail","APIBase","httpEndpoint","type","on401","onError","prefix","method","signal","headers","body","res","error","ChainlitAPI","feedback","feedbackId","pagination","filter","threadId","xhr","formData","percentage","queryParams","theme","provider","Socket"],"mappings":"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","sourcesContent":["import { useRecoilValue } from 'recoil';\n\nimport {\n actionState,\n askUserState,\n chatSettingsDefaultValueSelector,\n chatSettingsInputsState,\n chatSettingsValueState,\n elementState,\n loadingState,\n sessionState,\n tasklistState\n} from './state';\n\nexport interface IToken {\n id: number | string;\n token: string;\n isSequence: boolean;\n isInput: boolean;\n}\n\nconst useChatData = () => {\n const loading = useRecoilValue(loadingState);\n const elements = useRecoilValue(elementState);\n const tasklists = useRecoilValue(tasklistState);\n const actions = useRecoilValue(actionState);\n const session = useRecoilValue(sessionState);\n const askUser = useRecoilValue(askUserState);\n const chatSettingsInputs = useRecoilValue(chatSettingsInputsState);\n const chatSettingsValue = useRecoilValue(chatSettingsValueState);\n const chatSettingsDefaultValue = useRecoilValue(\n chatSettingsDefaultValueSelector\n );\n\n const connected = session?.socket.connected && !session?.error;\n const disabled =\n !connected ||\n loading ||\n askUser?.spec.type === 'file' ||\n askUser?.spec.type === 'action';\n\n return {\n actions,\n askUser,\n chatSettingsDefaultValue,\n chatSettingsInputs,\n chatSettingsValue,\n connected,\n disabled,\n elements,\n error: session?.error,\n loading,\n tasklists\n };\n};\n\nexport { useChatData };\n","import { isEqual } from 'lodash';\nimport { DefaultValue, atom, selector } from 'recoil';\nimport { Socket } from 'socket.io-client';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n IAction,\n IAsk,\n ICallFn,\n IMessageElement,\n IStep,\n ITasklistElement,\n IUser,\n ThreadHistory\n} from './types';\nimport { groupByDate } from './utils/group';\n\nexport interface ISession {\n socket: Socket;\n error?: boolean;\n}\n\nexport const threadIdToResumeState = atom<string | undefined>({\n key: 'ThreadIdToResume',\n default: undefined\n});\n\nexport const chatProfileState = atom<string | undefined>({\n key: 'ChatProfile',\n default: undefined\n});\n\nconst sessionIdAtom = atom<string>({\n key: 'SessionId',\n default: uuidv4()\n});\n\nexport const sessionIdState = selector({\n key: 'SessionIdSelector',\n get: ({ get }) => get(sessionIdAtom),\n set: ({ set }, newValue) =>\n set(sessionIdAtom, newValue instanceof DefaultValue ? uuidv4() : newValue)\n});\n\nexport const sessionState = atom<ISession | undefined>({\n key: 'Session',\n dangerouslyAllowMutability: true,\n default: undefined\n});\n\nexport const actionState = atom<IAction[]>({\n key: 'Actions',\n default: []\n});\n\nexport const messagesState = atom<IStep[]>({\n key: 'Messages',\n dangerouslyAllowMutability: true,\n default: []\n});\n\nexport const tokenCountState = atom<number>({\n key: 'TokenCount',\n default: 0\n});\n\nexport const loadingState = atom<boolean>({\n key: 'Loading',\n default: false\n});\n\nexport const askUserState = atom<IAsk | undefined>({\n key: 'AskUser',\n default: undefined\n});\n\nexport const callFnState = atom<ICallFn | undefined>({\n key: 'CallFn',\n default: undefined\n});\n\nexport const chatSettingsInputsState = atom<any>({\n key: 'ChatSettings',\n default: []\n});\n\nexport const chatSettingsDefaultValueSelector = selector({\n key: 'ChatSettingsValue/Default',\n get: ({ get }) => {\n const chatSettings = get(chatSettingsInputsState);\n return chatSettings.reduce(\n (form: { [key: string]: any }, input: any) => (\n (form[input.id] = input.initial), form\n ),\n {}\n );\n }\n});\n\nexport const chatSettingsValueState = atom({\n key: 'ChatSettingsValue',\n default: chatSettingsDefaultValueSelector\n});\n\nexport const elementState = atom<IMessageElement[]>({\n key: 'DisplayElements',\n default: []\n});\n\nexport const tasklistState = atom<ITasklistElement[]>({\n key: 'TasklistElements',\n default: []\n});\n\nexport const firstUserInteraction = atom<string | undefined>({\n key: 'FirstUserInteraction',\n default: undefined\n});\n\nexport const accessTokenState = atom<string | undefined>({\n key: 'AccessToken',\n default: undefined\n});\n\nexport const userState = atom<IUser | null>({\n key: 'User',\n default: null\n});\n\nexport const threadHistoryState = atom<ThreadHistory | undefined>({\n key: 'ThreadHistory',\n default: {\n threads: undefined,\n currentThreadId: undefined,\n timeGroupedThreads: undefined,\n pageInfo: undefined\n },\n effects: [\n ({ setSelf, onSet }: { setSelf: any; onSet: any }) => {\n onSet(\n (\n newValue: ThreadHistory | undefined,\n oldValue: ThreadHistory | undefined\n ) => {\n let timeGroupedThreads = newValue?.timeGroupedThreads;\n if (\n newValue?.threads &&\n !isEqual(newValue.threads, oldValue?.timeGroupedThreads)\n ) {\n timeGroupedThreads = groupByDate(newValue.threads);\n }\n\n setSelf({\n ...newValue,\n timeGroupedThreads\n });\n }\n );\n }\n ]\n});\n\nexport const sideViewState = atom<IMessageElement | undefined>({\n key: 'SideView',\n default: undefined\n});\n\nexport const currentThreadIdState = atom<string | undefined>({\n key: 'CurrentThreadId',\n default: undefined\n});\n","import { IThread } from 'src/types';\n\nexport const groupByDate = (data: IThread[]) => {\n const groupedData: { [key: string]: IThread[] } = {};\n\n const today = new Date();\n const yesterday = new Date();\n yesterday.setDate(today.getDate() - 1);\n const sevenDaysAgo = new Date();\n sevenDaysAgo.setDate(today.getDate() - 7);\n const thirtyDaysAgo = new Date();\n thirtyDaysAgo.setDate(today.getDate() - 30);\n\n data.forEach((item) => {\n const createdAt = new Date(item.createdAt);\n const isToday = createdAt.toDateString() === today.toDateString();\n const isYesterday = createdAt.toDateString() === yesterday.toDateString();\n const isLast7Days = createdAt >= sevenDaysAgo;\n const isLast30Days = createdAt >= thirtyDaysAgo;\n\n let category: string;\n\n if (isToday) {\n category = 'Today';\n } else if (isYesterday) {\n category = 'Yesterday';\n } else if (isLast7Days) {\n category = 'Previous 7 days';\n } else if (isLast30Days) {\n category = 'Previous 30 days';\n } else {\n const monthYear = createdAt.toLocaleString('default', {\n month: 'long',\n year: 'numeric'\n });\n\n category = monthYear.split(' ').slice(0, 1).join(' ');\n }\n\n if (!groupedData[category]) {\n groupedData[category] = [];\n }\n\n groupedData[category].push(item);\n });\n\n return groupedData;\n};\n","import { useCallback } from 'react';\nimport { useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil';\nimport {\n accessTokenState,\n actionState,\n askUserState,\n chatSettingsInputsState,\n chatSettingsValueState,\n currentThreadIdState,\n elementState,\n firstUserInteraction,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\n sideViewState,\n tasklistState,\n threadIdToResumeState,\n tokenCountState\n} from 'src/state';\nimport { IAction, IFileRef, IStep } from 'src/types';\nimport { addMessage } from 'src/utils/message';\n\nimport { ChainlitAPI } from './api';\n\nconst useChatInteract = () => {\n const accessToken = useRecoilValue(accessTokenState);\n const session = useRecoilValue(sessionState);\n const askUser = useRecoilValue(askUserState);\n const sessionId = useRecoilValue(sessionIdState);\n\n const resetChatSettings = useResetRecoilState(chatSettingsInputsState);\n const resetSessionId = useResetRecoilState(sessionIdState);\n const resetChatSettingsValue = useResetRecoilState(chatSettingsValueState);\n\n const setFirstUserInteraction = useSetRecoilState(firstUserInteraction);\n const setLoading = useSetRecoilState(loadingState);\n const setMessages = useSetRecoilState(messagesState);\n const setElements = useSetRecoilState(elementState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const setIdToResume = useSetRecoilState(threadIdToResumeState);\n const setSideView = useSetRecoilState(sideViewState);\n const setCurrentThreadId = useSetRecoilState(currentThreadIdState);\n\n const clear = useCallback(() => {\n session?.socket.emit('clear_session');\n session?.socket.disconnect();\n setIdToResume(undefined);\n resetSessionId();\n setFirstUserInteraction(undefined);\n setMessages([]);\n setElements([]);\n setTasklists([]);\n setActions([]);\n setTokenCount(0);\n resetChatSettings();\n resetChatSettingsValue();\n setSideView(undefined);\n setCurrentThreadId(undefined);\n }, [session]);\n\n const sendCopilotEvent = useCallback(\n (data: any) => {\n session?.socket.emit('copilot_event', data);\n },\n [session?.socket]\n );\n\n const sendMessage = useCallback(\n (message: IStep, fileReferences?: IFileRef[]) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n\n session?.socket.emit('ui_message', { message, fileReferences });\n },\n [session?.socket]\n );\n\n const sendAudioChunk = useCallback(\n (isStart: boolean, mimeType: string, elapsedTime: number, data: Blob) => {\n session?.socket.emit('audio_chunk', {\n isStart,\n mimeType,\n elapsedTime,\n data\n });\n },\n [session?.socket]\n );\n\n const endAudioStream = useCallback(\n (fileReferences?: IFileRef[]) => {\n session?.socket.emit('audio_end', { fileReferences });\n },\n [session?.socket]\n );\n\n const replyMessage = useCallback(\n (message: IStep) => {\n if (askUser) {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n askUser.callback(message);\n }\n },\n [askUser]\n );\n\n const updateChatSettings = useCallback(\n (values: object) => {\n session?.socket.emit('chat_settings_change', values);\n },\n [session?.socket]\n );\n\n const stopTask = useCallback(() => {\n setMessages((oldMessages) =>\n oldMessages.map((m) => {\n m.streaming = false;\n return m;\n })\n );\n\n setLoading(false);\n\n session?.socket.emit('stop');\n }, [session?.socket]);\n\n const callAction = useCallback(\n (action: IAction) => {\n const socket = session?.socket;\n if (!socket) return;\n\n const promise = new Promise<{\n id: string;\n status: boolean;\n response?: string;\n }>((resolve, reject) => {\n socket.once('action_response', (response) => {\n if (response.status) {\n resolve(response);\n } else {\n reject(response);\n }\n });\n });\n\n socket.emit('action_call', action);\n\n return promise;\n },\n [session?.socket]\n );\n\n const uploadFile = useCallback(\n (\n client: ChainlitAPI,\n file: File,\n onProgress: (progress: number) => void\n ) => {\n return client.uploadFile(file, onProgress, sessionId, accessToken);\n },\n [sessionId, accessToken]\n );\n\n return {\n uploadFile,\n callAction,\n clear,\n replyMessage,\n sendMessage,\n sendAudioChunk,\n endAudioStream,\n stopTask,\n setIdToResume,\n updateChatSettings,\n sendCopilotEvent\n };\n};\n\nexport { useChatInteract };\n","import { isEqual } from 'lodash';\n\nimport { IStep } from '..';\n\nconst nestMessages = (messages: IStep[]): IStep[] => {\n let nestedMessages: IStep[] = [];\n\n for (const message of messages) {\n nestedMessages = addMessage(nestedMessages, message);\n }\n\n return nestedMessages;\n};\n\nconst isLastMessage = (messages: IStep[], index: number) => {\n if (messages.length - 1 === index) {\n return true;\n }\n\n for (let i = index + 1; i < messages.length; i++) {\n if (messages[i].streaming) {\n continue;\n } else {\n return false;\n }\n }\n\n return true;\n};\n\n// Nested messages utils\n\nconst addMessage = (messages: IStep[], message: IStep): IStep[] => {\n const validRootTypes = ['assistant_message', 'user_message', 'tool'];\n const isValidRootType = validRootTypes.includes(message.type);\n const isRoot = !message.parentId;\n\n if (isRoot && !isValidRootType) {\n return messages;\n }\n\n const parentMessage = !isRoot\n ? findMessageById(messages, message.parentId!)\n : undefined;\n\n const shouldWrap =\n (isRoot || parentMessage?.type !== 'assistant_message') &&\n message.type === 'tool';\n\n if (hasMessageById(messages, message.id)) {\n return updateMessageById(messages, message.id, message);\n } else if (shouldWrap) {\n const lastMessage =\n messages.length > 0 ? messages[messages.length - 1] : undefined;\n const collapseTool =\n lastMessage?.type === 'assistant_message' &&\n lastMessage?.id.startsWith('wrap_');\n if (lastMessage && collapseTool) {\n return [\n ...messages.slice(0, messages.length - 1),\n {\n ...lastMessage,\n steps: [...(lastMessage.steps || []), message]\n }\n ];\n }\n return [\n ...messages,\n {\n ...message,\n name: '',\n input: '',\n output: '',\n id: 'wrap_' + message.id,\n type: 'assistant_message',\n steps: [message]\n }\n ];\n } else if ('parentId' in message && message.parentId) {\n return addMessageToParent(messages, message.parentId, message);\n } else if ('indent' in message && message.indent && message.indent > 0) {\n return addIndentMessage(messages, message.indent, message);\n } else {\n return [...messages, message];\n }\n};\n\nconst addIndentMessage = (\n messages: IStep[],\n indent: number,\n newMessage: IStep,\n currentIndentation: number = 0\n): IStep[] => {\n const nextMessages = [...messages];\n\n if (nextMessages.length === 0) {\n return [...nextMessages, newMessage];\n } else {\n const index = nextMessages.length - 1;\n const msg = nextMessages[index];\n msg.steps = msg.steps || [];\n\n if (currentIndentation + 1 === indent) {\n msg.steps = [...msg.steps, newMessage];\n nextMessages[index] = { ...msg };\n\n return nextMessages;\n } else {\n msg.steps = addIndentMessage(\n msg.steps,\n indent,\n newMessage,\n currentIndentation + 1\n );\n\n nextMessages[index] = { ...msg };\n return nextMessages;\n }\n }\n};\n\nconst addMessageToParent = (\n messages: IStep[],\n parentId: string,\n newMessage: IStep\n): IStep[] => {\n const nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (isEqual(msg.id, parentId)) {\n msg.steps = msg.steps ? [...msg.steps, newMessage] : [newMessage];\n nextMessages[index] = { ...msg };\n } else if (hasMessageById(nextMessages, parentId) && msg.steps) {\n msg.steps = addMessageToParent(msg.steps, parentId, newMessage);\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst findMessageById = (\n messages: IStep[],\n messageId: string\n): IStep | undefined => {\n for (const message of messages) {\n if (isEqual(message.id, messageId)) {\n return message;\n } else if (message.steps && message.steps.length > 0) {\n const foundMessage = findMessageById(message.steps, messageId);\n if (foundMessage) {\n return foundMessage;\n }\n }\n }\n return undefined;\n};\n\nconst hasMessageById = (messages: IStep[], messageId: string): boolean => {\n return findMessageById(messages, messageId) !== undefined;\n};\n\nconst updateMessageById = (\n messages: IStep[],\n messageId: string,\n updatedMessage: IStep\n): IStep[] => {\n const nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (isEqual(msg.id, messageId)) {\n nextMessages[index] = { steps: msg.steps, ...updatedMessage };\n } else if (hasMessageById(nextMessages, messageId) && msg.steps) {\n msg.steps = updateMessageById(msg.steps, messageId, updatedMessage);\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst deleteMessageById = (messages: IStep[], messageId: string) => {\n let nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (msg.id === messageId) {\n nextMessages = [\n ...nextMessages.slice(0, index),\n ...nextMessages.slice(index + 1)\n ];\n } else if (hasMessageById(nextMessages, messageId) && msg.steps) {\n msg.steps = deleteMessageById(msg.steps, messageId);\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst updateMessageContentById = (\n messages: IStep[],\n messageId: number | string,\n updatedContent: string,\n isSequence: boolean,\n isInput: boolean\n): IStep[] => {\n const nextMessages = [...messages];\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (isEqual(msg.id, messageId)) {\n if ('content' in msg && msg.content !== undefined) {\n if (isSequence) {\n msg.content = updatedContent;\n } else {\n msg.content += updatedContent;\n }\n } else if (isInput) {\n if ('input' in msg && msg.input !== undefined) {\n if (isSequence) {\n msg.input = updatedContent;\n } else {\n msg.input += updatedContent;\n }\n }\n } else {\n if ('output' in msg && msg.output !== undefined) {\n if (isSequence) {\n msg.output = updatedContent;\n } else {\n msg.output += updatedContent;\n }\n }\n }\n\n nextMessages[index] = { ...msg };\n } else if (msg.steps) {\n msg.steps = updateMessageContentById(\n msg.steps,\n messageId,\n updatedContent,\n isSequence,\n isInput\n );\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nexport {\n addMessageToParent,\n addMessage,\n deleteMessageById,\n hasMessageById,\n isLastMessage,\n nestMessages,\n updateMessageById,\n updateMessageContentById\n};\n","import { useRecoilValue } from 'recoil';\n\nimport {\n currentThreadIdState,\n firstUserInteraction,\n messagesState\n} from './state';\n\nconst useChatMessages = () => {\n const messages = useRecoilValue(messagesState);\n const firstInteraction = useRecoilValue(firstUserInteraction);\n const threadId = useRecoilValue(currentThreadIdState);\n\n return {\n threadId,\n messages,\n firstInteraction\n };\n};\n\nexport { useChatMessages };\n","import { debounce } from 'lodash';\nimport { useCallback } from 'react';\nimport {\n useRecoilState,\n useRecoilValue,\n useResetRecoilState,\n useSetRecoilState\n} from 'recoil';\nimport io from 'socket.io-client';\nimport {\n actionState,\n askUserState,\n callFnState,\n chatProfileState,\n chatSettingsInputsState,\n chatSettingsValueState,\n currentThreadIdState,\n elementState,\n firstUserInteraction,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\n tasklistState,\n threadIdToResumeState,\n tokenCountState\n} from 'src/state';\nimport {\n IAction,\n IElement,\n IMessageElement,\n IStep,\n ITasklistElement,\n IThread\n} from 'src/types';\nimport {\n addMessage,\n deleteMessageById,\n updateMessageById,\n updateMessageContentById\n} from 'src/utils/message';\n\nimport { ChainlitAPI } from './api';\nimport type { IToken } from './useChatData';\n\nconst useChatSession = () => {\n const sessionId = useRecoilValue(sessionIdState);\n\n const [session, setSession] = useRecoilState(sessionState);\n\n const resetChatSettingsValue = useResetRecoilState(chatSettingsValueState);\n const setFirstUserInteraction = useSetRecoilState(firstUserInteraction);\n const setLoading = useSetRecoilState(loadingState);\n const setMessages = useSetRecoilState(messagesState);\n const setAskUser = useSetRecoilState(askUserState);\n const setCallFn = useSetRecoilState(callFnState);\n\n const setElements = useSetRecoilState(elementState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setChatSettingsInputs = useSetRecoilState(chatSettingsInputsState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const [chatProfile, setChatProfile] = useRecoilState(chatProfileState);\n const idToResume = useRecoilValue(threadIdToResumeState);\n const setCurrentThreadId = useSetRecoilState(currentThreadIdState);\n const _connect = useCallback(\n ({\n client,\n userEnv,\n accessToken\n }: {\n client: ChainlitAPI;\n userEnv: Record<string, string>;\n accessToken?: string;\n }) => {\n const { protocol, host, pathname } = new URL(client.httpEndpoint);\n const uri = `${protocol}//${host}`;\n const path =\n pathname && pathname !== '/'\n ? `/ws${pathname}/socket.io`\n : '/ws/socket.io';\n\n const socket = io(uri, {\n path,\n extraHeaders: {\n Authorization: accessToken || '',\n 'X-Chainlit-Client-Type': client.type,\n 'X-Chainlit-Session-Id': sessionId,\n 'X-Chainlit-Thread-Id': idToResume || '',\n 'user-env': JSON.stringify(userEnv),\n 'X-Chainlit-Chat-Profile': chatProfile\n ? encodeURIComponent(chatProfile)\n : ''\n }\n });\n setSession((old) => {\n old?.socket?.removeAllListeners();\n old?.socket?.close();\n return {\n socket\n };\n });\n\n socket.on('connect', () => {\n socket.emit('connection_successful');\n setSession((s) => ({ ...s!, error: false }));\n });\n\n socket.on('connect_error', (_) => {\n setSession((s) => ({ ...s!, error: true }));\n });\n\n socket.on('task_start', () => {\n setLoading(true);\n });\n\n socket.on('task_end', () => {\n setLoading(false);\n });\n\n socket.on('reload', () => {\n socket.emit('clear_session');\n window.location.reload();\n });\n\n socket.on('resume_thread', (thread: IThread) => {\n let messages: IStep[] = [];\n for (const step of thread.steps) {\n messages = addMessage(messages, step);\n }\n if (thread.metadata?.chat_profile) {\n setChatProfile(thread.metadata?.chat_profile);\n }\n setMessages(messages);\n const elements = thread.elements || [];\n setTasklists(\n (elements as ITasklistElement[]).filter((e) => e.type === 'tasklist')\n );\n setElements(\n (elements as IMessageElement[]).filter(\n (e) => ['avatar', 'tasklist'].indexOf(e.type) === -1\n )\n );\n });\n\n socket.on('new_message', (message: IStep) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n });\n\n socket.on(\n 'first_interaction',\n (event: { interaction: string; thread_id: string }) => {\n setFirstUserInteraction(event.interaction);\n setCurrentThreadId(event.thread_id);\n }\n );\n\n socket.on('update_message', (message: IStep) => {\n setMessages((oldMessages) =>\n updateMessageById(oldMessages, message.id, message)\n );\n });\n\n socket.on('delete_message', (message: IStep) => {\n setMessages((oldMessages) =>\n deleteMessageById(oldMessages, message.id)\n );\n });\n\n socket.on('stream_start', (message: IStep) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n });\n\n socket.on(\n 'stream_token',\n ({ id, token, isSequence, isInput }: IToken) => {\n setMessages((oldMessages) =>\n updateMessageContentById(\n oldMessages,\n id,\n token,\n isSequence,\n isInput\n )\n );\n }\n );\n\n socket.on('ask', ({ msg, spec }, callback) => {\n setAskUser({ spec, callback });\n setMessages((oldMessages) => addMessage(oldMessages, msg));\n\n setLoading(false);\n });\n\n socket.on('ask_timeout', () => {\n setAskUser(undefined);\n setLoading(false);\n });\n\n socket.on('clear_ask', () => {\n setAskUser(undefined);\n });\n\n socket.on('call_fn', ({ name, args }, callback) => {\n const event = new CustomEvent('chainlit-call-fn', {\n detail: {\n name,\n args,\n callback\n }\n });\n window.dispatchEvent(event);\n\n setCallFn({ name, args, callback });\n });\n\n socket.on('clear_call_fn', () => {\n setCallFn(undefined);\n });\n\n socket.on('call_fn_timeout', () => {\n setCallFn(undefined);\n });\n\n socket.on('chat_settings', (inputs: any) => {\n setChatSettingsInputs(inputs);\n resetChatSettingsValue();\n });\n\n socket.on('element', (element: IElement) => {\n if (!element.url && element.chainlitKey) {\n element.url = client.getElementUrl(element.chainlitKey, sessionId);\n }\n\n if (element.type === 'tasklist') {\n setTasklists((old) => {\n const index = old.findIndex((e) => e.id === element.id);\n if (index === -1) {\n return [...old, element];\n } else {\n return [...old.slice(0, index), element, ...old.slice(index + 1)];\n }\n });\n } else {\n setElements((old) => {\n const index = old.findIndex((e) => e.id === element.id);\n if (index === -1) {\n return [...old, element];\n } else {\n return [...old.slice(0, index), element, ...old.slice(index + 1)];\n }\n });\n }\n });\n\n socket.on('remove_element', (remove: { id: string }) => {\n setElements((old) => {\n return old.filter((e) => e.id !== remove.id);\n });\n setTasklists((old) => {\n return old.filter((e) => e.id !== remove.id);\n });\n });\n\n socket.on('action', (action: IAction) => {\n setActions((old) => [...old, action]);\n });\n\n socket.on('remove_action', (action: IAction) => {\n setActions((old) => {\n const index = old.findIndex((a) => a.id === action.id);\n if (index === -1) return old;\n return [...old.slice(0, index), ...old.slice(index + 1)];\n });\n });\n\n socket.on('token_usage', (count: number) => {\n setTokenCount((old) => old + count);\n });\n },\n [setSession, sessionId, chatProfile]\n );\n\n const connect = useCallback(debounce(_connect, 200), [_connect]);\n\n const disconnect = useCallback(() => {\n if (session?.socket) {\n session.socket.removeAllListeners();\n session.socket.close();\n }\n }, [session]);\n\n return {\n connect,\n disconnect,\n session,\n sessionId,\n chatProfile,\n idToResume,\n setChatProfile\n };\n};\n\nexport { useChatSession };\n","const tokenKey = 'token';\n\nexport function getToken() {\n try {\n return localStorage.getItem(tokenKey);\n } catch (e) {\n return;\n }\n}\n\nexport function setToken(token: string) {\n try {\n return localStorage.setItem(tokenKey, token);\n } catch (e) {\n return;\n }\n}\n\nexport function removeToken() {\n try {\n return localStorage.removeItem(tokenKey);\n } catch (e) {\n return;\n }\n}\n","import jwt_decode from 'jwt-decode';\nimport { useEffect } from 'react';\nimport { useRecoilState, useSetRecoilState } from 'recoil';\nimport { accessTokenState, threadHistoryState, userState } from 'src/state';\nimport { IUser } from 'src/types';\nimport { getToken, removeToken, setToken } from 'src/utils/token';\n\nimport { ChainlitAPI } from '..';\nimport { useApi } from './api';\n\nexport const useAuth = (apiClient: ChainlitAPI) => {\n const { data, isLoading } = useApi<{\n requireLogin: boolean;\n passwordAuth: boolean;\n headerAuth: boolean;\n oauthProviders: string[];\n }>(apiClient, '/auth/config');\n const [accessToken, setAccessToken] = useRecoilState(accessTokenState);\n const setThreadHistory = useSetRecoilState(threadHistoryState);\n const [user, setUser] = useRecoilState(userState);\n\n const isReady = !!(!isLoading && data);\n\n const logout = async () => {\n await apiClient.logout();\n setUser(null);\n removeToken();\n setAccessToken('');\n setThreadHistory(undefined);\n };\n\n const saveAndSetToken = (token: string | null | undefined) => {\n if (!token) {\n logout();\n return;\n }\n try {\n const { exp, ...User } = jwt_decode(token) as any;\n setToken(token);\n setAccessToken(`Bearer ${token}`);\n setUser(User as IUser);\n } catch (e) {\n console.error(\n 'Invalid token, clearing token from local storage',\n 'error:',\n e\n );\n logout();\n }\n };\n\n useEffect(() => {\n if (!user && getToken()) {\n // Initialize the token from local storage\n saveAndSetToken(getToken());\n return;\n }\n }, []);\n\n const isAuthenticated = !!accessToken;\n\n if (data && !data.requireLogin) {\n return {\n data,\n user: null,\n isReady,\n isAuthenticated: true,\n accessToken: '',\n logout: () => {},\n setAccessToken: () => {}\n };\n }\n\n return {\n data,\n user: user,\n isAuthenticated,\n isReady,\n accessToken: accessToken,\n logout: logout,\n setAccessToken: saveAndSetToken\n };\n};\n","import { useRecoilValue } from 'recoil';\nimport { ChainlitAPI } from 'src/api';\nimport { accessTokenState } from 'src/state';\nimport useSWR, { SWRConfiguration } from 'swr';\n\nconst fetcher = async (\n client: ChainlitAPI,\n endpoint: string,\n token?: string\n) => {\n const res = await client.get(endpoint, token);\n\n return res?.json();\n};\n\nfunction useApi<T>(\n client: ChainlitAPI,\n path?: string | null,\n options?: SWRConfiguration\n) {\n const accessToken = useRecoilValue(accessTokenState);\n\n return useSWR<T, Error>(\n path ? [path, accessToken] : null,\n ([url, token]: [url: string, token: string]) => fetcher(client, url, token),\n options\n );\n}\n\nexport { useApi, fetcher };\n","import { IThread } from 'src/types';\nimport { removeToken } from 'src/utils/token';\n\nimport { IFeedback } from 'src/types/feedback';\n\nexport * from './hooks/auth';\nexport * from './hooks/api';\n\nexport interface IThreadFilters {\n search?: string;\n feedback?: number;\n}\n\nexport interface IPageInfo {\n hasNextPage: boolean;\n endCursor?: string;\n}\n\nexport interface IPagination {\n first: number;\n cursor?: string | number;\n}\n\nexport class ClientError extends Error {\n detail?: string;\n\n constructor(message: string, detail?: string) {\n super(message);\n this.detail = detail;\n }\n\n toString() {\n if (this.detail) {\n return `${this.message}: ${this.detail}`;\n } else {\n return this.message;\n }\n }\n}\n\ntype Payload = FormData | any;\n\nexport class APIBase {\n constructor(\n public httpEndpoint: string,\n public type: 'webapp' | 'copilot' | 'teams' | 'slack' | 'discord',\n public on401?: () => void,\n public onError?: (error: ClientError) => void\n ) {}\n\n buildEndpoint(path: string) {\n if (this.httpEndpoint.endsWith('/')) {\n // remove trailing slash on httpEndpoint\n return `${this.httpEndpoint.slice(0, -1)}${path}`;\n } else {\n return `${this.httpEndpoint}${path}`;\n }\n }\n\n checkToken(token: string) {\n const prefix = 'Bearer ';\n if (token.startsWith(prefix)) {\n return token;\n } else {\n return prefix + token;\n }\n }\n\n async fetch(\n method: string,\n path: string,\n token?: string,\n data?: Payload,\n signal?: AbortSignal\n ): Promise<Response> {\n try {\n const headers: { Authorization?: string; 'Content-Type'?: string } = {};\n if (token) headers['Authorization'] = this.checkToken(token); // Assuming token is a bearer token\n\n let body;\n\n if (data instanceof FormData) {\n body = data;\n } else {\n headers['Content-Type'] = 'application/json';\n body = data ? JSON.stringify(data) : null;\n }\n\n const res = await fetch(this.buildEndpoint(path), {\n method,\n headers,\n signal,\n body\n });\n\n if (!res.ok) {\n const body = await res.json();\n if (res.status === 401 && this.on401) {\n removeToken();\n this.on401();\n }\n throw new ClientError(res.statusText, body.detail);\n }\n\n return res;\n } catch (error: any) {\n if (error instanceof ClientError && this.onError) {\n this.onError(error);\n }\n console.error(error);\n throw error;\n }\n }\n\n async get(endpoint: string, token?: string) {\n return await this.fetch('GET', endpoint, token);\n }\n\n async post(\n endpoint: string,\n data: Payload,\n token?: string,\n signal?: AbortSignal\n ) {\n return await this.fetch('POST', endpoint, token, data, signal);\n }\n\n async put(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PUT', endpoint, token, data);\n }\n\n async patch(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PATCH', endpoint, token, data);\n }\n\n async delete(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('DELETE', endpoint, token, data);\n }\n}\n\nexport class ChainlitAPI extends APIBase {\n async headerAuth() {\n const res = await this.post(`/auth/header`, {});\n return res.json();\n }\n\n async passwordAuth(data: FormData) {\n const res = await this.post(`/login`, data);\n return res.json();\n }\n\n async logout() {\n const res = await this.post(`/logout`, {});\n return res.json();\n }\n\n async setFeedback(\n feedback: IFeedback,\n accessToken?: string\n ): Promise<{ success: boolean; feedbackId: string }> {\n const res = await this.put(`/feedback`, { feedback }, accessToken);\n return res.json();\n }\n\n async deleteFeedback(\n feedbackId: string,\n accessToken?: string\n ): Promise<{ success: boolean }> {\n const res = await this.delete(`/feedback`, { feedbackId }, accessToken);\n return res.json();\n }\n\n async listThreads(\n pagination: IPagination,\n filter: IThreadFilters,\n accessToken?: string\n ): Promise<{\n pageInfo: IPageInfo;\n data: IThread[];\n }> {\n const res = await this.post(\n `/project/threads`,\n { pagination, filter },\n accessToken\n );\n\n return res.json();\n }\n\n async deleteThread(threadId: string, accessToken?: string) {\n const res = await this.delete(`/project/thread`, { threadId }, accessToken);\n\n return res.json();\n }\n\n uploadFile(\n file: File,\n onProgress: (progress: number) => void,\n sessionId: string,\n token?: string\n ) {\n const xhr = new XMLHttpRequest();\n\n const promise = new Promise<{ id: string }>((resolve, reject) => {\n const formData = new FormData();\n formData.append('file', file);\n\n xhr.open(\n 'POST',\n this.buildEndpoint(`/project/file?session_id=${sessionId}`),\n true\n );\n\n if (token) {\n xhr.setRequestHeader('Authorization', this.checkToken(token));\n }\n\n // Track the progress of the upload\n xhr.upload.onprogress = function (event) {\n if (event.lengthComputable) {\n const percentage = (event.loaded / event.total) * 100;\n onProgress(percentage);\n }\n };\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n const response = JSON.parse(xhr.responseText);\n resolve(response);\n } else {\n reject('Upload failed');\n }\n };\n\n xhr.onerror = function () {\n reject('Upload error');\n };\n\n xhr.send(formData);\n });\n\n return { xhr, promise };\n }\n\n getElementUrl(id: string, sessionId: string) {\n const queryParams = `?session_id=${sessionId}`;\n return this.buildEndpoint(`/project/file/${id}${queryParams}`);\n }\n\n getLogoEndpoint(theme: string) {\n return this.buildEndpoint(`/logo?theme=${theme}`);\n }\n\n getOAuthEndpoint(provider: string) {\n return this.buildEndpoint(`/auth/oauth/${provider}`);\n }\n}\n","export * from './useChatData';\nexport * from './useChatInteract';\nexport * from './useChatMessages';\nexport * from './useChatSession';\nexport * from './api';\nexport * from './types';\nexport * from './state';\nexport * from './utils/message';\n\nexport { Socket } from 'socket.io-client';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/useChatData.ts","../src/state.ts","../src/utils/group.ts","../src/useChatInteract.ts","../src/utils/message.ts","../src/context.ts","../src/utils/token.ts","../src/api/hooks/auth.ts","../src/api/hooks/api.ts","../src/api/index.tsx","../src/useChatMessages.ts","../src/useChatSession.ts","../src/useAudio.ts","../src/useConfig.ts","../src/index.ts"],"names":["useRecoilValue","isEqual","DefaultValue","atom","selector","uuidv4","groupByDate","data","groupedData","today","yesterday","sevenDaysAgo","thirtyDaysAgo","item","createdAt","isToday","isYesterday","isLast7Days","isLast30Days","category","threadIdToResumeState","chatProfileState","sessionIdAtom","sessionIdState","get","set","newValue","sessionState","actionState","messagesState","tokenCountState","loadingState","askUserState","callFnState","chatSettingsInputsState","chatSettingsDefaultValueSelector","form","input","chatSettingsValueState","elementState","tasklistState","firstUserInteraction","accessTokenState","userState","configState","threadHistoryState","setSelf","onSet","oldValue","timeGroupedThreads","sideViewState","currentThreadIdState","useChatData","loading","elements","tasklists","actions","session","askUser","callFn","chatSettingsInputs","chatSettingsValue","chatSettingsDefaultValue","connected","disabled","useCallback","useContext","useResetRecoilState","useSetRecoilState","nestMessages","messages","nestedMessages","message","addMessage","isLastMessage","index","i","messageTypes","validRootTypes","isMessageType","isValidRootType","isRoot","parentMessage","findMessageById","shouldWrap","hasMessageById","updateMessageById","lastMessage","collapseTool","addMessageToParent","addIndentMessage","indent","newMessage","currentIndentation","nextMessages","msg","parentId","messageId","foundMessage","updatedMessage","deleteMessageById","updateMessageContentById","updatedContent","isSequence","isInput","createContext","tokenKey","getToken","setToken","token","removeToken","jwt_decode","useEffect","useRecoilState","useMemo","useSWR","fetcher","client","endpoint","useApi","path","swrConfig","ChainlitContext","accessToken","memoizedFetcher","url","swrKey","useAuth","apiClient","isLoading","setAccessToken","setThreadHistory","user","setUser","isReady","logout","saveAndSetToken","exp","User","e","isAuthenticated","ClientError","detail","APIBase","httpEndpoint","type","on401","onError","prefix","method","signal","headers","body","res","error","ChainlitAPI","feedback","feedbackId","pagination","filter","threadId","file","onProgress","sessionId","xhr","promise","resolve","reject","formData","event","percentage","response","id","queryParams","theme","provider","defaultChainlitContext","useChatInteract","resetChatSettings","resetSessionId","resetChatSettingsValue","setFirstUserInteraction","setLoading","setMessages","setElements","setTasklists","setActions","setTokenCount","setIdToResume","setSideView","setCurrentThreadId","clear","sendMessage","fileReferences","oldMessages","sendAudioChunk","isStart","mimeType","elapsedTime","endAudioStream","replyMessage","updateChatSettings","values","stopTask","m","callAction","action","socket","useChatMessages","firstInteraction","debounce","io","useChatSession","setSession","setAskUser","setCallFn","setChatSettingsInputs","chatProfile","setChatProfile","idToResume","_connect","userEnv","protocol","host","pathname","uri","old","s","_","thread","step","spec","callback","name","args","inputs","element","remove","a","count","connect","disconnect","useRef","useState","defaultConfig","useAudio","config","mediaRecorderRef","cancelling","isRecording","setIsRecording","timer","setTimer","isSpeaking","setIsSpeaking","setError","isRecordingFinished","setIsRecordingFinished","cancelRecording","stopRecording","min_decibels","silence_timeout","initial_silence_timeout","chunk_duration","max_duration","stream","spokeAtLeastOnce","isFirstChunk","audioBuffer","startTime","mediaRecorder","track","audioContext","audioStreamSource","analyser","bufferLength","domainData","detectSound","soundDetected","value","err","useConfig","setConfig","language","Socket"],"mappings":"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","sourcesContent":["import { useRecoilValue } from 'recoil';\n\nimport {\n actionState,\n askUserState,\n callFnState,\n chatSettingsDefaultValueSelector,\n chatSettingsInputsState,\n chatSettingsValueState,\n elementState,\n loadingState,\n sessionState,\n tasklistState\n} from './state';\n\nexport interface IToken {\n id: number | string;\n token: string;\n isSequence: boolean;\n isInput: boolean;\n}\n\nconst useChatData = () => {\n const loading = useRecoilValue(loadingState);\n const elements = useRecoilValue(elementState);\n const tasklists = useRecoilValue(tasklistState);\n const actions = useRecoilValue(actionState);\n const session = useRecoilValue(sessionState);\n const askUser = useRecoilValue(askUserState);\n const callFn = useRecoilValue(callFnState);\n const chatSettingsInputs = useRecoilValue(chatSettingsInputsState);\n const chatSettingsValue = useRecoilValue(chatSettingsValueState);\n const chatSettingsDefaultValue = useRecoilValue(\n chatSettingsDefaultValueSelector\n );\n\n const connected = session?.socket.connected && !session?.error;\n const disabled =\n !connected ||\n loading ||\n askUser?.spec.type === 'file' ||\n askUser?.spec.type === 'action';\n\n return {\n actions,\n askUser,\n callFn,\n chatSettingsDefaultValue,\n chatSettingsInputs,\n chatSettingsValue,\n connected,\n disabled,\n elements,\n error: session?.error,\n loading,\n tasklists\n };\n};\n\nexport { useChatData };\n","import { isEqual } from 'lodash';\nimport { DefaultValue, atom, selector } from 'recoil';\nimport { Socket } from 'socket.io-client';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n IAction,\n IAsk,\n ICallFn,\n IChainlitConfig,\n IMessageElement,\n IStep,\n ITasklistElement,\n IUser,\n ThreadHistory\n} from './types';\nimport { groupByDate } from './utils/group';\n\nexport interface ISession {\n socket: Socket;\n error?: boolean;\n}\n\nexport const threadIdToResumeState = atom<string | undefined>({\n key: 'ThreadIdToResume',\n default: undefined\n});\n\nexport const chatProfileState = atom<string | undefined>({\n key: 'ChatProfile',\n default: undefined\n});\n\nconst sessionIdAtom = atom<string>({\n key: 'SessionId',\n default: uuidv4()\n});\n\nexport const sessionIdState = selector({\n key: 'SessionIdSelector',\n get: ({ get }) => get(sessionIdAtom),\n set: ({ set }, newValue) =>\n set(sessionIdAtom, newValue instanceof DefaultValue ? uuidv4() : newValue)\n});\n\nexport const sessionState = atom<ISession | undefined>({\n key: 'Session',\n dangerouslyAllowMutability: true,\n default: undefined\n});\n\nexport const actionState = atom<IAction[]>({\n key: 'Actions',\n default: []\n});\n\nexport const messagesState = atom<IStep[]>({\n key: 'Messages',\n dangerouslyAllowMutability: true,\n default: []\n});\n\nexport const tokenCountState = atom<number>({\n key: 'TokenCount',\n default: 0\n});\n\nexport const loadingState = atom<boolean>({\n key: 'Loading',\n default: false\n});\n\nexport const askUserState = atom<IAsk | undefined>({\n key: 'AskUser',\n default: undefined\n});\n\nexport const callFnState = atom<ICallFn | undefined>({\n key: 'CallFn',\n default: undefined\n});\n\nexport const chatSettingsInputsState = atom<any>({\n key: 'ChatSettings',\n default: []\n});\n\nexport const chatSettingsDefaultValueSelector = selector({\n key: 'ChatSettingsValue/Default',\n get: ({ get }) => {\n const chatSettings = get(chatSettingsInputsState);\n return chatSettings.reduce(\n (form: { [key: string]: any }, input: any) => (\n (form[input.id] = input.initial), form\n ),\n {}\n );\n }\n});\n\nexport const chatSettingsValueState = atom({\n key: 'ChatSettingsValue',\n default: chatSettingsDefaultValueSelector\n});\n\nexport const elementState = atom<IMessageElement[]>({\n key: 'DisplayElements',\n default: []\n});\n\nexport const tasklistState = atom<ITasklistElement[]>({\n key: 'TasklistElements',\n default: []\n});\n\nexport const firstUserInteraction = atom<string | undefined>({\n key: 'FirstUserInteraction',\n default: undefined\n});\n\nexport const accessTokenState = atom<string | undefined>({\n key: 'AccessToken',\n default: undefined\n});\n\nexport const userState = atom<IUser | null>({\n key: 'User',\n default: null\n});\n\nexport const configState = atom<IChainlitConfig | undefined>({\n key: 'ChainlitConfig',\n default: undefined\n});\n\nexport const threadHistoryState = atom<ThreadHistory | undefined>({\n key: 'ThreadHistory',\n default: {\n threads: undefined,\n currentThreadId: undefined,\n timeGroupedThreads: undefined,\n pageInfo: undefined\n },\n effects: [\n ({ setSelf, onSet }: { setSelf: any; onSet: any }) => {\n onSet(\n (\n newValue: ThreadHistory | undefined,\n oldValue: ThreadHistory | undefined\n ) => {\n let timeGroupedThreads = newValue?.timeGroupedThreads;\n if (\n newValue?.threads &&\n !isEqual(newValue.threads, oldValue?.timeGroupedThreads)\n ) {\n timeGroupedThreads = groupByDate(newValue.threads);\n }\n\n setSelf({\n ...newValue,\n timeGroupedThreads\n });\n }\n );\n }\n ]\n});\n\nexport const sideViewState = atom<IMessageElement | undefined>({\n key: 'SideView',\n default: undefined\n});\n\nexport const currentThreadIdState = atom<string | undefined>({\n key: 'CurrentThreadId',\n default: undefined\n});\n","import { IThread } from 'src/types';\n\nexport const groupByDate = (data: IThread[]) => {\n const groupedData: { [key: string]: IThread[] } = {};\n\n const today = new Date();\n const yesterday = new Date();\n yesterday.setDate(today.getDate() - 1);\n const sevenDaysAgo = new Date();\n sevenDaysAgo.setDate(today.getDate() - 7);\n const thirtyDaysAgo = new Date();\n thirtyDaysAgo.setDate(today.getDate() - 30);\n\n data.forEach((item) => {\n const createdAt = new Date(item.createdAt);\n const isToday = createdAt.toDateString() === today.toDateString();\n const isYesterday = createdAt.toDateString() === yesterday.toDateString();\n const isLast7Days = createdAt >= sevenDaysAgo;\n const isLast30Days = createdAt >= thirtyDaysAgo;\n\n let category: string;\n\n if (isToday) {\n category = 'Today';\n } else if (isYesterday) {\n category = 'Yesterday';\n } else if (isLast7Days) {\n category = 'Previous 7 days';\n } else if (isLast30Days) {\n category = 'Previous 30 days';\n } else {\n const monthYear = createdAt.toLocaleString('default', {\n month: 'long',\n year: 'numeric'\n });\n\n category = monthYear.split(' ').slice(0, 1).join(' ');\n }\n\n if (!groupedData[category]) {\n groupedData[category] = [];\n }\n\n groupedData[category].push(item);\n });\n\n return groupedData;\n};\n","import { useCallback, useContext } from 'react';\nimport { useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil';\nimport {\n accessTokenState,\n actionState,\n askUserState,\n chatSettingsInputsState,\n chatSettingsValueState,\n currentThreadIdState,\n elementState,\n firstUserInteraction,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\n sideViewState,\n tasklistState,\n threadIdToResumeState,\n tokenCountState\n} from 'src/state';\nimport { IAction, IFileRef, IStep } from 'src/types';\nimport { addMessage } from 'src/utils/message';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { ChainlitContext } from './context';\n\ntype PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\nconst useChatInteract = () => {\n const client = useContext(ChainlitContext);\n const accessToken = useRecoilValue(accessTokenState);\n const session = useRecoilValue(sessionState);\n const askUser = useRecoilValue(askUserState);\n const sessionId = useRecoilValue(sessionIdState);\n\n const resetChatSettings = useResetRecoilState(chatSettingsInputsState);\n const resetSessionId = useResetRecoilState(sessionIdState);\n const resetChatSettingsValue = useResetRecoilState(chatSettingsValueState);\n\n const setFirstUserInteraction = useSetRecoilState(firstUserInteraction);\n const setLoading = useSetRecoilState(loadingState);\n const setMessages = useSetRecoilState(messagesState);\n const setElements = useSetRecoilState(elementState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const setIdToResume = useSetRecoilState(threadIdToResumeState);\n const setSideView = useSetRecoilState(sideViewState);\n const setCurrentThreadId = useSetRecoilState(currentThreadIdState);\n\n const clear = useCallback(() => {\n session?.socket.emit('clear_session');\n session?.socket.disconnect();\n setIdToResume(undefined);\n resetSessionId();\n setFirstUserInteraction(undefined);\n setMessages([]);\n setElements([]);\n setTasklists([]);\n setActions([]);\n setTokenCount(0);\n resetChatSettings();\n resetChatSettingsValue();\n setSideView(undefined);\n setCurrentThreadId(undefined);\n }, [session]);\n\n const sendMessage = useCallback(\n (\n message: PartialBy<IStep, 'createdAt' | 'id'>,\n fileReferences: IFileRef[] = []\n ) => {\n if (!message.id) {\n message.id = uuidv4();\n }\n if (!message.createdAt) {\n message.createdAt = new Date().toISOString();\n }\n setMessages((oldMessages) => addMessage(oldMessages, message as IStep));\n\n session?.socket.emit('client_message', { message, fileReferences });\n },\n [session?.socket]\n );\n\n const sendAudioChunk = useCallback(\n (isStart: boolean, mimeType: string, elapsedTime: number, data: Blob) => {\n session?.socket.emit('audio_chunk', {\n isStart,\n mimeType,\n elapsedTime,\n data\n });\n },\n [session?.socket]\n );\n\n const endAudioStream = useCallback(\n (fileReferences?: IFileRef[]) => {\n session?.socket.emit('audio_end', { fileReferences });\n },\n [session?.socket]\n );\n\n const replyMessage = useCallback(\n (message: IStep) => {\n if (askUser) {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n askUser.callback(message);\n }\n },\n [askUser]\n );\n\n const updateChatSettings = useCallback(\n (values: object) => {\n session?.socket.emit('chat_settings_change', values);\n },\n [session?.socket]\n );\n\n const stopTask = useCallback(() => {\n setMessages((oldMessages) =>\n oldMessages.map((m) => {\n m.streaming = false;\n return m;\n })\n );\n\n setLoading(false);\n\n session?.socket.emit('stop');\n }, [session?.socket]);\n\n const callAction = useCallback(\n (action: IAction) => {\n const socket = session?.socket;\n if (!socket) return;\n\n const promise = new Promise<{\n id: string;\n status: boolean;\n response?: string;\n }>((resolve, reject) => {\n socket.once('action_response', (response) => {\n if (response.status) {\n resolve(response);\n } else {\n reject(response);\n }\n });\n });\n\n socket.emit('action_call', action);\n\n return promise;\n },\n [session?.socket]\n );\n\n const uploadFile = useCallback(\n (file: File, onProgress: (progress: number) => void) => {\n return client.uploadFile(file, onProgress, sessionId, accessToken);\n },\n [sessionId, accessToken]\n );\n\n return {\n uploadFile,\n callAction,\n clear,\n replyMessage,\n sendMessage,\n sendAudioChunk,\n endAudioStream,\n stopTask,\n setIdToResume,\n updateChatSettings\n };\n};\n\nexport { useChatInteract };\n","import { isEqual } from 'lodash';\n\nimport { IStep } from '..';\n\nconst nestMessages = (messages: IStep[]): IStep[] => {\n let nestedMessages: IStep[] = [];\n\n for (const message of messages) {\n nestedMessages = addMessage(nestedMessages, message);\n }\n\n return nestedMessages;\n};\n\nconst isLastMessage = (messages: IStep[], index: number) => {\n if (messages.length - 1 === index) {\n return true;\n }\n\n for (let i = index + 1; i < messages.length; i++) {\n if (messages[i].streaming) {\n continue;\n } else {\n return false;\n }\n }\n\n return true;\n};\n\n// Nested messages utils\n\nconst addMessage = (messages: IStep[], message: IStep): IStep[] => {\n const messageTypes = ['assistant_message', 'user_message'];\n const validRootTypes = [...messageTypes, 'tool'];\n const isMessageType = messageTypes.includes(message.type);\n const isValidRootType = validRootTypes.includes(message.type);\n const isRoot = !message.parentId;\n\n if (isRoot && !isValidRootType) {\n return messages;\n }\n\n const parentMessage = !isRoot\n ? findMessageById(messages, message.parentId!)\n : undefined;\n\n const shouldWrap =\n (isRoot || parentMessage?.type !== 'assistant_message') &&\n message.type === 'tool';\n\n if (hasMessageById(messages, message.id)) {\n return updateMessageById(messages, message.id, message);\n } else if (shouldWrap) {\n const lastMessage =\n messages.length > 0 ? messages[messages.length - 1] : undefined;\n const collapseTool =\n lastMessage?.type === 'assistant_message' &&\n lastMessage?.id.startsWith('wrap_');\n if (lastMessage && collapseTool) {\n return [\n ...messages.slice(0, messages.length - 1),\n {\n ...lastMessage,\n steps: [...(lastMessage.steps || []), message]\n }\n ];\n }\n return [\n ...messages,\n {\n ...message,\n name: '',\n input: '',\n output: '',\n id: 'wrap_' + message.id,\n type: 'assistant_message',\n steps: [message]\n }\n ];\n } else if (!isMessageType && 'parentId' in message && message.parentId) {\n return addMessageToParent(messages, message.parentId, message);\n } else if ('indent' in message && message.indent && message.indent > 0) {\n return addIndentMessage(messages, message.indent, message);\n } else {\n return [...messages, message];\n }\n};\n\nconst addIndentMessage = (\n messages: IStep[],\n indent: number,\n newMessage: IStep,\n currentIndentation: number = 0\n): IStep[] => {\n const nextMessages = [...messages];\n\n if (nextMessages.length === 0) {\n return [...nextMessages, newMessage];\n } else {\n const index = nextMessages.length - 1;\n const msg = nextMessages[index];\n msg.steps = msg.steps || [];\n\n if (currentIndentation + 1 === indent) {\n msg.steps = [...msg.steps, newMessage];\n nextMessages[index] = { ...msg };\n\n return nextMessages;\n } else {\n msg.steps = addIndentMessage(\n msg.steps,\n indent,\n newMessage,\n currentIndentation + 1\n );\n\n nextMessages[index] = { ...msg };\n return nextMessages;\n }\n }\n};\n\nconst addMessageToParent = (\n messages: IStep[],\n parentId: string,\n newMessage: IStep\n): IStep[] => {\n const nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (isEqual(msg.id, parentId)) {\n msg.steps = msg.steps ? [...msg.steps, newMessage] : [newMessage];\n nextMessages[index] = { ...msg };\n } else if (hasMessageById(nextMessages, parentId) && msg.steps) {\n msg.steps = addMessageToParent(msg.steps, parentId, newMessage);\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst findMessageById = (\n messages: IStep[],\n messageId: string\n): IStep | undefined => {\n for (const message of messages) {\n if (isEqual(message.id, messageId)) {\n return message;\n } else if (message.steps && message.steps.length > 0) {\n const foundMessage = findMessageById(message.steps, messageId);\n if (foundMessage) {\n return foundMessage;\n }\n }\n }\n return undefined;\n};\n\nconst hasMessageById = (messages: IStep[], messageId: string): boolean => {\n return findMessageById(messages, messageId) !== undefined;\n};\n\nconst updateMessageById = (\n messages: IStep[],\n messageId: string,\n updatedMessage: IStep\n): IStep[] => {\n const nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (isEqual(msg.id, messageId)) {\n nextMessages[index] = { steps: msg.steps, ...updatedMessage };\n } else if (hasMessageById(nextMessages, messageId) && msg.steps) {\n msg.steps = updateMessageById(msg.steps, messageId, updatedMessage);\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst deleteMessageById = (messages: IStep[], messageId: string) => {\n let nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (msg.id === messageId) {\n nextMessages = [\n ...nextMessages.slice(0, index),\n ...nextMessages.slice(index + 1)\n ];\n } else if (hasMessageById(nextMessages, messageId) && msg.steps) {\n msg.steps = deleteMessageById(msg.steps, messageId);\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst updateMessageContentById = (\n messages: IStep[],\n messageId: number | string,\n updatedContent: string,\n isSequence: boolean,\n isInput: boolean\n): IStep[] => {\n const nextMessages = [...messages];\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (isEqual(msg.id, messageId)) {\n if ('content' in msg && msg.content !== undefined) {\n if (isSequence) {\n msg.content = updatedContent;\n } else {\n msg.content += updatedContent;\n }\n } else if (isInput) {\n if ('input' in msg && msg.input !== undefined) {\n if (isSequence) {\n msg.input = updatedContent;\n } else {\n msg.input += updatedContent;\n }\n }\n } else {\n if ('output' in msg && msg.output !== undefined) {\n if (isSequence) {\n msg.output = updatedContent;\n } else {\n msg.output += updatedContent;\n }\n }\n }\n\n nextMessages[index] = { ...msg };\n } else if (msg.steps) {\n msg.steps = updateMessageContentById(\n msg.steps,\n messageId,\n updatedContent,\n isSequence,\n isInput\n );\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nexport {\n addMessageToParent,\n addMessage,\n deleteMessageById,\n hasMessageById,\n isLastMessage,\n nestMessages,\n updateMessageById,\n updateMessageContentById\n};\n","import { createContext } from 'react';\n\nimport { ChainlitAPI } from './api';\n\nconst defaultChainlitContext = undefined;\n\nconst ChainlitContext = createContext<ChainlitAPI>(\n new ChainlitAPI('http://localhost:8000', 'webapp')\n);\n\nexport { ChainlitContext, defaultChainlitContext };\n","const tokenKey = 'token';\n\nexport function getToken() {\n try {\n return localStorage.getItem(tokenKey);\n } catch (e) {\n return;\n }\n}\n\nexport function setToken(token: string) {\n try {\n return localStorage.setItem(tokenKey, token);\n } catch (e) {\n return;\n }\n}\n\nexport function removeToken() {\n try {\n return localStorage.removeItem(tokenKey);\n } catch (e) {\n return;\n }\n}\n","import jwt_decode from 'jwt-decode';\nimport { useContext, useEffect } from 'react';\nimport { useRecoilState, useSetRecoilState } from 'recoil';\nimport { ChainlitContext } from 'src/context';\nimport { accessTokenState, threadHistoryState, userState } from 'src/state';\nimport { IUser } from 'src/types';\nimport { getToken, removeToken, setToken } from 'src/utils/token';\n\nimport { useApi } from './api';\n\nexport const useAuth = () => {\n const apiClient = useContext(ChainlitContext);\n const { data, isLoading } = useApi<{\n requireLogin: boolean;\n passwordAuth: boolean;\n headerAuth: boolean;\n oauthProviders: string[];\n }>('/auth/config');\n const [accessToken, setAccessToken] = useRecoilState(accessTokenState);\n const setThreadHistory = useSetRecoilState(threadHistoryState);\n const [user, setUser] = useRecoilState(userState);\n\n const isReady = !!(!isLoading && data);\n\n const logout = async () => {\n await apiClient.logout();\n setUser(null);\n removeToken();\n setAccessToken('');\n setThreadHistory(undefined);\n };\n\n const saveAndSetToken = (token: string | null | undefined) => {\n if (!token) {\n logout();\n return;\n }\n try {\n const { exp, ...User } = jwt_decode(token) as any;\n setToken(token);\n setAccessToken(`Bearer ${token}`);\n setUser(User as IUser);\n } catch (e) {\n console.error(\n 'Invalid token, clearing token from local storage',\n 'error:',\n e\n );\n logout();\n }\n };\n\n useEffect(() => {\n if (!user && getToken()) {\n // Initialize the token from local storage\n saveAndSetToken(getToken());\n return;\n }\n }, []);\n\n const isAuthenticated = !!accessToken;\n\n if (data && !data.requireLogin) {\n return {\n data,\n user: null,\n isReady,\n isAuthenticated: true,\n accessToken: '',\n logout: () => {},\n setAccessToken: () => {}\n };\n }\n\n return {\n data,\n user: user,\n isAuthenticated,\n isReady,\n accessToken: accessToken,\n logout: logout,\n setAccessToken: saveAndSetToken\n };\n};\n","import { useContext, useMemo } from 'react';\nimport { useRecoilValue } from 'recoil';\nimport { ChainlitAPI } from 'src/api';\nimport { ChainlitContext } from 'src/context';\nimport { accessTokenState } from 'src/state';\nimport useSWR, { SWRConfiguration } from 'swr';\n\nconst fetcher = async (\n client: ChainlitAPI,\n endpoint: string,\n token?: string\n) => {\n const res = await client.get(endpoint, token);\n return res?.json();\n};\n\nfunction useApi<T>(\n path?: string | null,\n { token, ...swrConfig }: SWRConfiguration & { token?: string } = {}\n) {\n const client = useContext(ChainlitContext);\n let accessToken = useRecoilValue(accessTokenState);\n accessToken = token || accessToken;\n\n // Memoize the fetcher function to avoid recreating it on every render\n const memoizedFetcher = useMemo(\n () =>\n ([url, token]: [url: string, token: string]) =>\n fetcher(client, url, token),\n [client]\n );\n\n // Use a stable key for useSWR\n const swrKey = useMemo(() => {\n return path ? [path, accessToken] : null;\n }, [path, accessToken]);\n\n return useSWR<T, Error>(swrKey, memoizedFetcher, swrConfig);\n}\n\nexport { useApi, fetcher };\n","import { IThread } from 'src/types';\nimport { removeToken } from 'src/utils/token';\n\nimport { IFeedback } from 'src/types/feedback';\n\nexport * from './hooks/auth';\nexport * from './hooks/api';\n\nexport interface IThreadFilters {\n search?: string;\n feedback?: number;\n}\n\nexport interface IPageInfo {\n hasNextPage: boolean;\n endCursor?: string;\n}\n\nexport interface IPagination {\n first: number;\n cursor?: string | number;\n}\n\nexport class ClientError extends Error {\n detail?: string;\n\n constructor(message: string, detail?: string) {\n super(message);\n this.detail = detail;\n }\n\n toString() {\n if (this.detail) {\n return `${this.message}: ${this.detail}`;\n } else {\n return this.message;\n }\n }\n}\n\ntype Payload = FormData | any;\n\nexport class APIBase {\n constructor(\n public httpEndpoint: string,\n public type: 'webapp' | 'copilot' | 'teams' | 'slack' | 'discord',\n public on401?: () => void,\n public onError?: (error: ClientError) => void\n ) {}\n\n buildEndpoint(path: string) {\n if (this.httpEndpoint.endsWith('/')) {\n // remove trailing slash on httpEndpoint\n return `${this.httpEndpoint.slice(0, -1)}${path}`;\n } else {\n return `${this.httpEndpoint}${path}`;\n }\n }\n\n checkToken(token: string) {\n const prefix = 'Bearer ';\n if (token.startsWith(prefix)) {\n return token;\n } else {\n return prefix + token;\n }\n }\n\n async fetch(\n method: string,\n path: string,\n token?: string,\n data?: Payload,\n signal?: AbortSignal\n ): Promise<Response> {\n try {\n const headers: { Authorization?: string; 'Content-Type'?: string } = {};\n if (token) headers['Authorization'] = this.checkToken(token); // Assuming token is a bearer token\n\n let body;\n\n if (data instanceof FormData) {\n body = data;\n } else {\n headers['Content-Type'] = 'application/json';\n body = data ? JSON.stringify(data) : null;\n }\n\n const res = await fetch(this.buildEndpoint(path), {\n method,\n headers,\n signal,\n body\n });\n\n if (!res.ok) {\n const body = await res.json();\n if (res.status === 401 && this.on401) {\n removeToken();\n this.on401();\n }\n throw new ClientError(res.statusText, body.detail);\n }\n\n return res;\n } catch (error: any) {\n if (error instanceof ClientError && this.onError) {\n this.onError(error);\n }\n console.error(error);\n throw error;\n }\n }\n\n async get(endpoint: string, token?: string) {\n return await this.fetch('GET', endpoint, token);\n }\n\n async post(\n endpoint: string,\n data: Payload,\n token?: string,\n signal?: AbortSignal\n ) {\n return await this.fetch('POST', endpoint, token, data, signal);\n }\n\n async put(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PUT', endpoint, token, data);\n }\n\n async patch(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PATCH', endpoint, token, data);\n }\n\n async delete(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('DELETE', endpoint, token, data);\n }\n}\n\nexport class ChainlitAPI extends APIBase {\n async headerAuth() {\n const res = await this.post(`/auth/header`, {});\n return res.json();\n }\n\n async passwordAuth(data: FormData) {\n const res = await this.post(`/login`, data);\n return res.json();\n }\n\n async logout() {\n const res = await this.post(`/logout`, {});\n return res.json();\n }\n\n async setFeedback(\n feedback: IFeedback,\n accessToken?: string\n ): Promise<{ success: boolean; feedbackId: string }> {\n const res = await this.put(`/feedback`, { feedback }, accessToken);\n return res.json();\n }\n\n async deleteFeedback(\n feedbackId: string,\n accessToken?: string\n ): Promise<{ success: boolean }> {\n const res = await this.delete(`/feedback`, { feedbackId }, accessToken);\n return res.json();\n }\n\n async listThreads(\n pagination: IPagination,\n filter: IThreadFilters,\n accessToken?: string\n ): Promise<{\n pageInfo: IPageInfo;\n data: IThread[];\n }> {\n const res = await this.post(\n `/project/threads`,\n { pagination, filter },\n accessToken\n );\n\n return res.json();\n }\n\n async deleteThread(threadId: string, accessToken?: string) {\n const res = await this.delete(`/project/thread`, { threadId }, accessToken);\n\n return res.json();\n }\n\n uploadFile(\n file: File,\n onProgress: (progress: number) => void,\n sessionId: string,\n token?: string\n ) {\n const xhr = new XMLHttpRequest();\n\n const promise = new Promise<{ id: string }>((resolve, reject) => {\n const formData = new FormData();\n formData.append('file', file);\n\n xhr.open(\n 'POST',\n this.buildEndpoint(`/project/file?session_id=${sessionId}`),\n true\n );\n\n if (token) {\n xhr.setRequestHeader('Authorization', this.checkToken(token));\n }\n\n // Track the progress of the upload\n xhr.upload.onprogress = function (event) {\n if (event.lengthComputable) {\n const percentage = (event.loaded / event.total) * 100;\n onProgress(percentage);\n }\n };\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n const response = JSON.parse(xhr.responseText);\n resolve(response);\n } else {\n reject('Upload failed');\n }\n };\n\n xhr.onerror = function () {\n reject('Upload error');\n };\n\n xhr.send(formData);\n });\n\n return { xhr, promise };\n }\n\n getElementUrl(id: string, sessionId: string) {\n const queryParams = `?session_id=${sessionId}`;\n return this.buildEndpoint(`/project/file/${id}${queryParams}`);\n }\n\n getLogoEndpoint(theme: string) {\n return this.buildEndpoint(`/logo?theme=${theme}`);\n }\n\n getOAuthEndpoint(provider: string) {\n return this.buildEndpoint(`/auth/oauth/${provider}`);\n }\n}\n","import { useRecoilValue } from 'recoil';\n\nimport {\n currentThreadIdState,\n firstUserInteraction,\n messagesState\n} from './state';\n\nconst useChatMessages = () => {\n const messages = useRecoilValue(messagesState);\n const firstInteraction = useRecoilValue(firstUserInteraction);\n const threadId = useRecoilValue(currentThreadIdState);\n\n return {\n threadId,\n messages,\n firstInteraction\n };\n};\n\nexport { useChatMessages };\n","import { debounce } from 'lodash';\nimport { useCallback, useContext } from 'react';\nimport {\n useRecoilState,\n useRecoilValue,\n useResetRecoilState,\n useSetRecoilState\n} from 'recoil';\nimport io from 'socket.io-client';\nimport {\n actionState,\n askUserState,\n callFnState,\n chatProfileState,\n chatSettingsInputsState,\n chatSettingsValueState,\n currentThreadIdState,\n elementState,\n firstUserInteraction,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\n tasklistState,\n threadIdToResumeState,\n tokenCountState\n} from 'src/state';\nimport {\n IAction,\n IElement,\n IMessageElement,\n IStep,\n ITasklistElement,\n IThread\n} from 'src/types';\nimport {\n addMessage,\n deleteMessageById,\n updateMessageById,\n updateMessageContentById\n} from 'src/utils/message';\n\nimport { ChainlitContext } from './context';\nimport type { IToken } from './useChatData';\n\nconst useChatSession = () => {\n const client = useContext(ChainlitContext);\n const sessionId = useRecoilValue(sessionIdState);\n\n const [session, setSession] = useRecoilState(sessionState);\n\n const resetChatSettingsValue = useResetRecoilState(chatSettingsValueState);\n const setFirstUserInteraction = useSetRecoilState(firstUserInteraction);\n const setLoading = useSetRecoilState(loadingState);\n const setMessages = useSetRecoilState(messagesState);\n const setAskUser = useSetRecoilState(askUserState);\n const setCallFn = useSetRecoilState(callFnState);\n\n const setElements = useSetRecoilState(elementState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setChatSettingsInputs = useSetRecoilState(chatSettingsInputsState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const [chatProfile, setChatProfile] = useRecoilState(chatProfileState);\n const idToResume = useRecoilValue(threadIdToResumeState);\n const setCurrentThreadId = useSetRecoilState(currentThreadIdState);\n const _connect = useCallback(\n ({\n userEnv,\n accessToken\n }: {\n userEnv: Record<string, string>;\n accessToken?: string;\n }) => {\n const { protocol, host, pathname } = new URL(client.httpEndpoint);\n const uri = `${protocol}//${host}`;\n const path =\n pathname && pathname !== '/'\n ? `${pathname}/ws/socket.io`\n : '/ws/socket.io';\n\n const socket = io(uri, {\n path,\n extraHeaders: {\n Authorization: accessToken || '',\n 'X-Chainlit-Client-Type': client.type,\n 'X-Chainlit-Session-Id': sessionId,\n 'X-Chainlit-Thread-Id': idToResume || '',\n 'user-env': JSON.stringify(userEnv),\n 'X-Chainlit-Chat-Profile': chatProfile\n ? encodeURIComponent(chatProfile)\n : ''\n }\n });\n setSession((old) => {\n old?.socket?.removeAllListeners();\n old?.socket?.close();\n return {\n socket\n };\n });\n\n socket.on('connect', () => {\n socket.emit('connection_successful');\n setSession((s) => ({ ...s!, error: false }));\n });\n\n socket.on('connect_error', (_) => {\n setSession((s) => ({ ...s!, error: true }));\n });\n\n socket.on('task_start', () => {\n setLoading(true);\n });\n\n socket.on('task_end', () => {\n setLoading(false);\n });\n\n socket.on('reload', () => {\n socket.emit('clear_session');\n window.location.reload();\n });\n\n socket.on('resume_thread', (thread: IThread) => {\n let messages: IStep[] = [];\n for (const step of thread.steps) {\n messages = addMessage(messages, step);\n }\n if (thread.metadata?.chat_profile) {\n setChatProfile(thread.metadata?.chat_profile);\n }\n setMessages(messages);\n const elements = thread.elements || [];\n setTasklists(\n (elements as ITasklistElement[]).filter((e) => e.type === 'tasklist')\n );\n setElements(\n (elements as IMessageElement[]).filter(\n (e) => ['avatar', 'tasklist'].indexOf(e.type) === -1\n )\n );\n });\n\n socket.on('new_message', (message: IStep) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n });\n\n socket.on(\n 'first_interaction',\n (event: { interaction: string; thread_id: string }) => {\n setFirstUserInteraction(event.interaction);\n setCurrentThreadId(event.thread_id);\n }\n );\n\n socket.on('update_message', (message: IStep) => {\n setMessages((oldMessages) =>\n updateMessageById(oldMessages, message.id, message)\n );\n });\n\n socket.on('delete_message', (message: IStep) => {\n setMessages((oldMessages) =>\n deleteMessageById(oldMessages, message.id)\n );\n });\n\n socket.on('stream_start', (message: IStep) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n });\n\n socket.on(\n 'stream_token',\n ({ id, token, isSequence, isInput }: IToken) => {\n setMessages((oldMessages) =>\n updateMessageContentById(\n oldMessages,\n id,\n token,\n isSequence,\n isInput\n )\n );\n }\n );\n\n socket.on('ask', ({ msg, spec }, callback) => {\n setAskUser({ spec, callback });\n setMessages((oldMessages) => addMessage(oldMessages, msg));\n\n setLoading(false);\n });\n\n socket.on('ask_timeout', () => {\n setAskUser(undefined);\n setLoading(false);\n });\n\n socket.on('clear_ask', () => {\n setAskUser(undefined);\n });\n\n socket.on('call_fn', ({ name, args }, callback) => {\n setCallFn({ name, args, callback });\n });\n\n socket.on('clear_call_fn', () => {\n setCallFn(undefined);\n });\n\n socket.on('call_fn_timeout', () => {\n setCallFn(undefined);\n });\n\n socket.on('chat_settings', (inputs: any) => {\n setChatSettingsInputs(inputs);\n resetChatSettingsValue();\n });\n\n socket.on('element', (element: IElement) => {\n if (!element.url && element.chainlitKey) {\n element.url = client.getElementUrl(element.chainlitKey, sessionId);\n }\n\n if (element.type === 'tasklist') {\n setTasklists((old) => {\n const index = old.findIndex((e) => e.id === element.id);\n if (index === -1) {\n return [...old, element];\n } else {\n return [...old.slice(0, index), element, ...old.slice(index + 1)];\n }\n });\n } else {\n setElements((old) => {\n const index = old.findIndex((e) => e.id === element.id);\n if (index === -1) {\n return [...old, element];\n } else {\n return [...old.slice(0, index), element, ...old.slice(index + 1)];\n }\n });\n }\n });\n\n socket.on('remove_element', (remove: { id: string }) => {\n setElements((old) => {\n return old.filter((e) => e.id !== remove.id);\n });\n setTasklists((old) => {\n return old.filter((e) => e.id !== remove.id);\n });\n });\n\n socket.on('action', (action: IAction) => {\n setActions((old) => [...old, action]);\n });\n\n socket.on('remove_action', (action: IAction) => {\n setActions((old) => {\n const index = old.findIndex((a) => a.id === action.id);\n if (index === -1) return old;\n return [...old.slice(0, index), ...old.slice(index + 1)];\n });\n });\n\n socket.on('token_usage', (count: number) => {\n setTokenCount((old) => old + count);\n });\n },\n [setSession, sessionId, chatProfile]\n );\n\n const connect = useCallback(debounce(_connect, 200), [_connect]);\n\n const disconnect = useCallback(() => {\n if (session?.socket) {\n session.socket.removeAllListeners();\n session.socket.close();\n }\n }, [session]);\n\n return {\n connect,\n disconnect,\n session,\n sessionId,\n chatProfile,\n idToResume,\n setChatProfile\n };\n};\n\nexport { useChatSession };\n","import { useCallback, useRef, useState } from 'react';\n\nimport { IAudioConfig, IFileRef } from './types';\nimport { useChatInteract } from './useChatInteract';\n\nconst defaultConfig: IAudioConfig = {\n enabled: true,\n min_decibels: -45,\n initial_silence_timeout: 3000,\n silence_timeout: 1500,\n max_duration: 15000,\n chunk_duration: 1000\n};\n\nconst useAudio = (config = defaultConfig) => {\n const mediaRecorderRef = useRef<MediaRecorder | null>(null);\n const cancelling = useRef(false);\n const { sendAudioChunk, endAudioStream } = useChatInteract();\n const [isRecording, setIsRecording] = useState(false);\n const [timer, setTimer] = useState<NodeJS.Timeout | undefined>(undefined);\n const [isSpeaking, setIsSpeaking] = useState(false);\n const [error, setError] = useState<string | undefined>(undefined);\n const [isRecordingFinished, setIsRecordingFinished] = useState(false);\n\n const cancelRecording = useCallback(() => {\n if (!isRecording || !mediaRecorderRef.current) {\n return;\n }\n cancelling.current = true;\n mediaRecorderRef.current.stop();\n }, [isRecording]);\n\n const stopRecording = useCallback(() => {\n if (!isRecording || !mediaRecorderRef.current) {\n return;\n }\n mediaRecorderRef.current.stop();\n }, [isRecording]);\n\n const startRecording = useCallback(\n (fileReferences?: IFileRef[]) => {\n if (isRecording || !config) {\n return;\n }\n setIsRecordingFinished(false);\n setError(undefined);\n clearTimeout(timer);\n cancelling.current = false;\n\n const {\n min_decibels,\n silence_timeout,\n initial_silence_timeout,\n chunk_duration,\n max_duration\n } = config;\n\n navigator.mediaDevices\n .getUserMedia({ audio: true })\n .then((stream) => {\n let spokeAtLeastOnce = false;\n let isSpeaking = false;\n let isFirstChunk = true;\n let audioBuffer: Blob | null = null;\n let startTime = Date.now();\n\n const mediaRecorder = new MediaRecorder(stream);\n mediaRecorderRef.current = mediaRecorder;\n mediaRecorder.addEventListener('start', () => {\n setIsRecording(true);\n startTime = Date.now();\n });\n\n mediaRecorder.addEventListener('dataavailable', async (event) => {\n if (!spokeAtLeastOnce) {\n if (!audioBuffer) {\n audioBuffer = new Blob([event.data], { type: event.data.type });\n } else {\n audioBuffer = new Blob([audioBuffer, event.data], {\n type: event.data.type\n });\n }\n }\n if (mediaRecorder.state === 'inactive') {\n return;\n }\n const elapsedTime = Date.now() - startTime;\n if (elapsedTime >= max_duration) {\n mediaRecorder.stop();\n stream.getTracks().forEach((track) => track.stop());\n return;\n }\n\n setIsSpeaking(isSpeaking);\n const [mimeType, _] = mediaRecorder.mimeType.split(';');\n\n if (audioBuffer) {\n // If there is buffered data and the user has spoken, send the buffered data first\n await sendAudioChunk(\n isFirstChunk,\n mimeType,\n elapsedTime,\n new Blob([audioBuffer, event.data])\n );\n audioBuffer = null; // Clear the buffer\n } else {\n await sendAudioChunk(\n isFirstChunk,\n mimeType,\n elapsedTime,\n event.data\n );\n }\n\n if (isFirstChunk) {\n isFirstChunk = false;\n }\n });\n\n mediaRecorder.addEventListener('stop', async () => {\n setIsRecording(false);\n setIsSpeaking(false);\n\n if (spokeAtLeastOnce && !cancelling.current) {\n setIsRecordingFinished(true);\n await endAudioStream(fileReferences);\n }\n });\n\n const audioContext = new AudioContext();\n const audioStreamSource =\n audioContext.createMediaStreamSource(stream);\n const analyser = audioContext.createAnalyser();\n analyser.minDecibels = min_decibels;\n audioStreamSource.connect(analyser);\n\n const bufferLength = analyser.frequencyBinCount;\n\n const domainData = new Uint8Array(bufferLength);\n\n mediaRecorder.start(chunk_duration);\n\n const detectSound = () => {\n if (mediaRecorder.state === 'inactive') {\n return;\n }\n analyser.getByteFrequencyData(domainData);\n const soundDetected = domainData.some((value) => value > 0);\n\n if (!isSpeaking) {\n isSpeaking = soundDetected;\n }\n if (!spokeAtLeastOnce && soundDetected) {\n setIsSpeaking(isSpeaking);\n spokeAtLeastOnce = true;\n }\n requestAnimationFrame(detectSound);\n };\n detectSound();\n\n setTimeout(() => {\n if (!spokeAtLeastOnce) {\n mediaRecorder.stop();\n stream.getTracks().forEach((track) => track.stop());\n } else {\n setTimer(\n setInterval(() => {\n if (!isSpeaking) {\n mediaRecorder.stop();\n stream.getTracks().forEach((track) => track.stop());\n } else {\n isSpeaking = false;\n }\n }, silence_timeout)\n );\n }\n }, initial_silence_timeout);\n })\n .catch((err) => {\n setError(err.message);\n });\n },\n [timer, isRecording, config, sendAudioChunk, endAudioStream]\n );\n\n return {\n startRecording,\n stopRecording,\n cancelRecording,\n isRecording,\n isSpeaking,\n isRecordingFinished,\n error\n };\n};\n\nexport { useAudio };\n","import { useEffect } from 'react';\nimport { useRecoilState } from 'recoil';\n\nimport { useApi, useAuth } from './api';\nimport { configState } from './state';\nimport { IChainlitConfig } from './types';\n\nconst useConfig = (accessToken?: string) => {\n const [config, setConfig] = useRecoilState(configState);\n const { isAuthenticated } = useAuth();\n const language = navigator.language || 'en-US';\n\n const { data, error, isLoading } = useApi<IChainlitConfig>(\n !config && isAuthenticated\n ? `/project/settings?language=${language}`\n : null,\n { token: accessToken }\n );\n\n useEffect(() => {\n if (!data) return;\n setConfig(data);\n }, [data, setConfig]);\n\n return { config, error, isLoading, language };\n};\n\nexport { useConfig };\n","export * from './useChatData';\nexport * from './useChatInteract';\nexport * from './useChatMessages';\nexport * from './useChatSession';\nexport * from './useAudio';\nexport * from './useConfig';\nexport * from './api';\nexport * from './types';\nexport * from './context';\nexport * from './state';\nexport * from './utils/message';\n\nexport { Socket } from 'socket.io-client';\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { atom, selector, DefaultValue, useRecoilValue,
|
|
1
|
+
import { atom, selector, DefaultValue, useRecoilValue, useRecoilState, useSetRecoilState, useResetRecoilState } from 'recoil';
|
|
2
2
|
import { isEqual, debounce } from 'lodash';
|
|
3
3
|
import { v4 } from 'uuid';
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
4
|
+
import { createContext, useContext, useMemo, useEffect, useCallback, useRef, useState } from 'react';
|
|
5
|
+
import ee from 'jwt-decode';
|
|
6
|
+
import Zt from 'swr';
|
|
7
|
+
import ue from 'socket.io-client';
|
|
6
8
|
export { Socket } from 'socket.io-client';
|
|
7
|
-
import Wt from 'jwt-decode';
|
|
8
|
-
import Ht from 'swr';
|
|
9
9
|
|
|
10
|
-
var St=n=>{let t={},e=new Date,s=new Date;s.setDate(e.getDate()-1);let o=new Date;o.setDate(e.getDate()-7);let r=new Date;return r.setDate(e.getDate()-30),n.forEach(c=>{let a=new Date(c.createdAt),p=a.toDateString()===e.toDateString(),f=a.toDateString()===s.toDateString(),m=a>=o,T=a>=r,S;p?S="Today":f?S="Yesterday":m?S="Previous 7 days":T?S="Previous 30 days":S=a.toLocaleString("default",{month:"long",year:"numeric"}).split(" ").slice(0,1).join(" "),t[S]||(t[S]=[]),t[S].push(c);}),t};var X=atom({key:"ThreadIdToResume",default:void 0}),Tt=atom({key:"ChatProfile",default:void 0}),It=atom({key:"SessionId",default:v4()}),H=selector({key:"SessionIdSelector",get:({get:n})=>n(It),set:({set:n},t)=>n(It,t instanceof DefaultValue?v4():t)}),P=atom({key:"Session",dangerouslyAllowMutability:!0,default:void 0}),R=atom({key:"Actions",default:[]}),D=atom({key:"Messages",dangerouslyAllowMutability:!0,default:[]}),z=atom({key:"TokenCount",default:0}),M=atom({key:"Loading",default:!1}),U=atom({key:"AskUser",default:void 0}),xt=atom({key:"CallFn",default:void 0}),w=atom({key:"ChatSettings",default:[]}),at=selector({key:"ChatSettingsValue/Default",get:({get:n})=>n(w).reduce((e,s)=>(e[s.id]=s.initial,e),{})}),F=atom({key:"ChatSettingsValue",default:at}),v=atom({key:"DisplayElements",default:[]}),V=atom({key:"TasklistElements",default:[]}),j=atom({key:"FirstUserInteraction",default:void 0}),L=atom({key:"AccessToken",default:void 0}),bt=atom({key:"User",default:null}),At=atom({key:"ThreadHistory",default:{threads:void 0,currentThreadId:void 0,timeGroupedThreads:void 0,pageInfo:void 0},effects:[({setSelf:n,onSet:t})=>{t((e,s)=>{let o=e?.timeGroupedThreads;e?.threads&&!isEqual(e.threads,s?.timeGroupedThreads)&&(o=St(e.threads)),n({...e,timeGroupedThreads:o});});}]}),Ct=atom({key:"SideView",default:void 0}),$=atom({key:"CurrentThreadId",default:void 0});var te=()=>{let n=useRecoilValue(M),t=useRecoilValue(v),e=useRecoilValue(V),s=useRecoilValue(R),o=useRecoilValue(P),r=useRecoilValue(U),c=useRecoilValue(w),a=useRecoilValue(F),p=useRecoilValue(at),f=o?.socket.connected&&!o?.error,m=!f||n||r?.spec.type==="file"||r?.spec.type==="action";return {actions:s,askUser:r,chatSettingsDefaultValue:p,chatSettingsInputs:c,chatSettingsValue:a,connected:f,disabled:m,elements:t,error:o?.error,loading:n,tasklists:e}};var ne=n=>{let t=[];for(let e of n)t=_(t,e);return t},oe=(n,t)=>{if(n.length-1===t)return !0;for(let e=t+1;e<n.length;e++)if(!n[e].streaming)return !1;return !0},_=(n,t)=>{let s=["assistant_message","user_message","tool"].includes(t.type),o=!t.parentId;if(o&&!s)return n;let r=o?void 0:ct(n,t.parentId),c=(o||r?.type!=="assistant_message")&&t.type==="tool";if(Y(n,t.id))return J(n,t.id,t);if(c){let a=n.length>0?n[n.length-1]:void 0,p=a?.type==="assistant_message"&&a?.id.startsWith("wrap_");return a&&p?[...n.slice(0,n.length-1),{...a,steps:[...a.steps||[],t]}]:[...n,{...t,name:"",input:"",output:"",id:"wrap_"+t.id,type:"assistant_message",steps:[t]}]}else return "parentId"in t&&t.parentId?Et(n,t.parentId,t):"indent"in t&&t.indent&&t.indent>0?_t(n,t.indent,t):[...n,t]},_t=(n,t,e,s=0)=>{let o=[...n];if(o.length===0)return [...o,e];{let r=o.length-1,c=o[r];return c.steps=c.steps||[],s+1===t?(c.steps=[...c.steps,e],o[r]={...c},o):(c.steps=_t(c.steps,t,e,s+1),o[r]={...c},o)}},Et=(n,t,e)=>{let s=[...n];for(let o=0;o<s.length;o++){let r=s[o];isEqual(r.id,t)?(r.steps=r.steps?[...r.steps,e]:[e],s[o]={...r}):Y(s,t)&&r.steps&&(r.steps=Et(r.steps,t,e),s[o]={...r});}return s},ct=(n,t)=>{for(let e of n){if(isEqual(e.id,t))return e;if(e.steps&&e.steps.length>0){let s=ct(e.steps,t);if(s)return s}}},Y=(n,t)=>ct(n,t)!==void 0,J=(n,t,e)=>{let s=[...n];for(let o=0;o<s.length;o++){let r=s[o];isEqual(r.id,t)?s[o]={steps:r.steps,...e}:Y(s,t)&&r.steps&&(r.steps=J(r.steps,t,e),s[o]={...r});}return s},lt=(n,t)=>{let e=[...n];for(let s=0;s<e.length;s++){let o=e[s];o.id===t?e=[...e.slice(0,s),...e.slice(s+1)]:Y(e,t)&&o.steps&&(o.steps=lt(o.steps,t),e[s]={...o});}return e},dt=(n,t,e,s,o)=>{let r=[...n];for(let c=0;c<r.length;c++){let a=r[c];isEqual(a.id,t)?("content"in a&&a.content!==void 0?s?a.content=e:a.content+=e:o?"input"in a&&a.input!==void 0&&(s?a.input=e:a.input+=e):"output"in a&&a.output!==void 0&&(s?a.output=e:a.output+=e),r[c]={...a}):a.steps&&(a.steps=dt(a.steps,t,e,s,o),r[c]={...a});}return r};var de=()=>{let n=useRecoilValue(L),t=useRecoilValue(P),e=useRecoilValue(U),s=useRecoilValue(H),o=useResetRecoilState(w),r=useResetRecoilState(H),c=useResetRecoilState(F),a=useSetRecoilState(j),p=useSetRecoilState(M),f=useSetRecoilState(D),m=useSetRecoilState(v),T=useSetRecoilState(V),S=useSetRecoilState(R),E=useSetRecoilState(z),A=useSetRecoilState(X),O=useSetRecoilState(Ct),W=useSetRecoilState($),tt=useCallback(()=>{t?.socket.emit("clear_session"),t?.socket.disconnect(),A(void 0),r(),a(void 0),f([]),m([]),T([]),S([]),E(0),o(),c(),O(void 0),W(void 0);},[t]),q=useCallback(h=>{t?.socket.emit("copilot_event",h);},[t?.socket]),et=useCallback((h,k)=>{f(d=>_(d,h)),t?.socket.emit("ui_message",{message:h,fileReferences:k});},[t?.socket]),st=useCallback((h,k,d,i)=>{t?.socket.emit("audio_chunk",{isStart:h,mimeType:k,elapsedTime:d,data:i});},[t?.socket]),B=useCallback(h=>{t?.socket.emit("audio_end",{fileReferences:h});},[t?.socket]),nt=useCallback(h=>{e&&(f(k=>_(k,h)),e.callback(h));},[e]),ot=useCallback(h=>{t?.socket.emit("chat_settings_change",h);},[t?.socket]),rt=useCallback(()=>{f(h=>h.map(k=>(k.streaming=!1,k))),p(!1),t?.socket.emit("stop");},[t?.socket]),it=useCallback(h=>{let k=t?.socket;if(!k)return;let d=new Promise((i,l)=>{k.once("action_response",u=>{u.status?i(u):l(u);});});return k.emit("action_call",h),d},[t?.socket]);return {uploadFile:useCallback((h,k,d)=>h.uploadFile(k,d,s,n),[s,n]),callAction:it,clear:tt,replyMessage:nt,sendMessage:et,sendAudioChunk:st,endAudioStream:B,stopTask:rt,setIdToResume:A,updateChatSettings:ot,sendCopilotEvent:q}};var he=()=>{let n=useRecoilValue(D),t=useRecoilValue(j);return {threadId:useRecoilValue($),messages:n,firstInteraction:t}};var xe=()=>{let n=useRecoilValue(H),[t,e]=useRecoilState(P),s=useResetRecoilState(F),o=useSetRecoilState(j),r=useSetRecoilState(M),c=useSetRecoilState(D),a=useSetRecoilState(U),p=useSetRecoilState(xt),f=useSetRecoilState(v),m=useSetRecoilState(V),T=useSetRecoilState(R),S=useSetRecoilState(w),E=useSetRecoilState(z),[A,O]=useRecoilState(Tt),W=useRecoilValue(X),tt=useSetRecoilState($),q=useCallback(({client:B,userEnv:nt,accessToken:ot})=>{let{protocol:rt,host:it,pathname:G}=new URL(B.httpEndpoint),h=`${rt}//${it}`,k=G&&G!=="/"?`/ws${G}/socket.io`:"/ws/socket.io",d=$t(h,{path:k,extraHeaders:{Authorization:ot||"","X-Chainlit-Client-Type":B.type,"X-Chainlit-Session-Id":n,"X-Chainlit-Thread-Id":W||"","user-env":JSON.stringify(nt),"X-Chainlit-Chat-Profile":A?encodeURIComponent(A):""}});e(i=>(i?.socket?.removeAllListeners(),i?.socket?.close(),{socket:d})),d.on("connect",()=>{d.emit("connection_successful"),e(i=>({...i,error:!1}));}),d.on("connect_error",i=>{e(l=>({...l,error:!0}));}),d.on("task_start",()=>{r(!0);}),d.on("task_end",()=>{r(!1);}),d.on("reload",()=>{d.emit("clear_session"),window.location.reload();}),d.on("resume_thread",i=>{let l=[];for(let I of i.steps)l=_(l,I);i.metadata?.chat_profile&&O(i.metadata?.chat_profile),c(l);let u=i.elements||[];m(u.filter(I=>I.type==="tasklist")),f(u.filter(I=>["avatar","tasklist"].indexOf(I.type)===-1));}),d.on("new_message",i=>{c(l=>_(l,i));}),d.on("first_interaction",i=>{o(i.interaction),tt(i.thread_id);}),d.on("update_message",i=>{c(l=>J(l,i.id,i));}),d.on("delete_message",i=>{c(l=>lt(l,i.id));}),d.on("stream_start",i=>{c(l=>_(l,i));}),d.on("stream_token",({id:i,token:l,isSequence:u,isInput:I})=>{c(Ft=>dt(Ft,i,l,u,I));}),d.on("ask",({msg:i,spec:l},u)=>{a({spec:l,callback:u}),c(I=>_(I,i)),r(!1);}),d.on("ask_timeout",()=>{a(void 0),r(!1);}),d.on("clear_ask",()=>{a(void 0);}),d.on("call_fn",({name:i,args:l},u)=>{let I=new CustomEvent("chainlit-call-fn",{detail:{name:i,args:l,callback:u}});window.dispatchEvent(I),p({name:i,args:l,callback:u});}),d.on("clear_call_fn",()=>{p(void 0);}),d.on("call_fn_timeout",()=>{p(void 0);}),d.on("chat_settings",i=>{S(i),s();}),d.on("element",i=>{!i.url&&i.chainlitKey&&(i.url=B.getElementUrl(i.chainlitKey,n)),i.type==="tasklist"?m(l=>{let u=l.findIndex(I=>I.id===i.id);return u===-1?[...l,i]:[...l.slice(0,u),i,...l.slice(u+1)]}):f(l=>{let u=l.findIndex(I=>I.id===i.id);return u===-1?[...l,i]:[...l.slice(0,u),i,...l.slice(u+1)]});}),d.on("remove_element",i=>{f(l=>l.filter(u=>u.id!==i.id)),m(l=>l.filter(u=>u.id!==i.id));}),d.on("action",i=>{T(l=>[...l,i]);}),d.on("remove_action",i=>{T(l=>{let u=l.findIndex(I=>I.id===i.id);return u===-1?l:[...l.slice(0,u),...l.slice(u+1)]});}),d.on("token_usage",i=>{E(l=>l+i);});},[e,n,A]),et=useCallback(debounce(q,200),[q]),st=useCallback(()=>{t?.socket&&(t.socket.removeAllListeners(),t.socket.close());},[t]);return {connect:et,disconnect:st,session:t,sessionId:n,chatProfile:A,idToResume:W,setChatProfile:O}};var ht="token";function gt(){try{return localStorage.getItem(ht)}catch{return}}function Rt(n){try{return localStorage.setItem(ht,n)}catch{return}}function Q(){try{return localStorage.removeItem(ht)}catch{return}}var Ot=async(n,t,e)=>(await n.get(t,e))?.json();function Dt(n,t,e){let s=useRecoilValue(L);return Ht(t?[t,s]:null,([o,r])=>Ot(n,o,r),e)}var Ve=n=>{let{data:t,isLoading:e}=Dt(n,"/auth/config"),[s,o]=useRecoilState(L),r=useSetRecoilState(At),[c,a]=useRecoilState(bt),p=!!(!e&&t),f=async()=>{await n.logout(),a(null),Q(),o(""),r(void 0);},m=S=>{if(!S){f();return}try{let{exp:E,...A}=Wt(S);Rt(S),o(`Bearer ${S}`),a(A);}catch(E){console.error("Invalid token, clearing token from local storage","error:",E),f();}};useEffect(()=>{if(!c&>()){m(gt());return}},[]);let T=!!s;return t&&!t.requireLogin?{data:t,user:null,isReady:p,isAuthenticated:!0,accessToken:"",logout:()=>{},setAccessToken:()=>{}}:{data:t,user:c,isAuthenticated:T,isReady:p,accessToken:s,logout:f,setAccessToken:m}};var Z=class extends Error{constructor(e,s){super(e);this.detail=s;}toString(){return this.detail?`${this.message}: ${this.detail}`:this.message}},mt=class{constructor(t,e,s,o){this.httpEndpoint=t;this.type=e;this.on401=s;this.onError=o;}buildEndpoint(t){return this.httpEndpoint.endsWith("/")?`${this.httpEndpoint.slice(0,-1)}${t}`:`${this.httpEndpoint}${t}`}checkToken(t){let e="Bearer ";return t.startsWith(e)?t:e+t}async fetch(t,e,s,o,r){try{let c={};s&&(c.Authorization=this.checkToken(s));let a;o instanceof FormData?a=o:(c["Content-Type"]="application/json",a=o?JSON.stringify(o):null);let p=await fetch(this.buildEndpoint(e),{method:t,headers:c,signal:r,body:a});if(!p.ok){let f=await p.json();throw p.status===401&&this.on401&&(Q(),this.on401()),new Z(p.statusText,f.detail)}return p}catch(c){throw c instanceof Z&&this.onError&&this.onError(c),console.error(c),c}}async get(t,e){return await this.fetch("GET",t,e)}async post(t,e,s,o){return await this.fetch("POST",t,s,e,o)}async put(t,e,s){return await this.fetch("PUT",t,s,e)}async patch(t,e,s){return await this.fetch("PATCH",t,s,e)}async delete(t,e,s){return await this.fetch("DELETE",t,s,e)}},Ut=class extends mt{async headerAuth(){return (await this.post("/auth/header",{})).json()}async passwordAuth(t){return (await this.post("/login",t)).json()}async logout(){return (await this.post("/logout",{})).json()}async setFeedback(t,e){return (await this.put("/feedback",{feedback:t},e)).json()}async deleteFeedback(t,e){return (await this.delete("/feedback",{feedbackId:t},e)).json()}async listThreads(t,e,s){return (await this.post("/project/threads",{pagination:t,filter:e},s)).json()}async deleteThread(t,e){return (await this.delete("/project/thread",{threadId:t},e)).json()}uploadFile(t,e,s,o){let r=new XMLHttpRequest,c=new Promise((a,p)=>{let f=new FormData;f.append("file",t),r.open("POST",this.buildEndpoint(`/project/file?session_id=${s}`),!0),o&&r.setRequestHeader("Authorization",this.checkToken(o)),r.upload.onprogress=function(m){if(m.lengthComputable){let T=m.loaded/m.total*100;e(T);}},r.onload=function(){if(r.status===200){let m=JSON.parse(r.responseText);a(m);}else p("Upload failed");},r.onerror=function(){p("Upload error");},r.send(f);});return {xhr:r,promise:c}}getElementUrl(t,e){let s=`?session_id=${e}`;return this.buildEndpoint(`/project/file/${t}${s}`)}getLogoEndpoint(t){return this.buildEndpoint(`/logo?theme=${t}`)}getOAuthEndpoint(t){return this.buildEndpoint(`/auth/oauth/${t}`)}};
|
|
10
|
+
var Et=s=>{let t={},e=new Date,n=new Date;n.setDate(e.getDate()-1);let o=new Date;o.setDate(e.getDate()-7);let r=new Date;return r.setDate(e.getDate()-30),s.forEach(c=>{let a=new Date(c.createdAt),g=a.toDateString()===e.toDateString(),m=a.toDateString()===n.toDateString(),f=a>=o,y=a>=r,S;g?S="Today":m?S="Yesterday":f?S="Previous 7 days":y?S="Previous 30 days":S=a.toLocaleString("default",{month:"long",year:"numeric"}).split(" ").slice(0,1).join(" "),t[S]||(t[S]=[]),t[S].push(c);}),t};var st=atom({key:"ThreadIdToResume",default:void 0}),Pt=atom({key:"ChatProfile",default:void 0}),Dt=atom({key:"SessionId",default:v4()}),et=selector({key:"SessionIdSelector",get:({get:s})=>s(Dt),set:({set:s},t)=>s(Dt,t instanceof DefaultValue?v4():t)}),B=atom({key:"Session",dangerouslyAllowMutability:!0,default:void 0}),V=atom({key:"Actions",default:[]}),j=atom({key:"Messages",dangerouslyAllowMutability:!0,default:[]}),ot=atom({key:"TokenCount",default:0}),$=atom({key:"Loading",default:!1}),H=atom({key:"AskUser",default:void 0}),rt=atom({key:"CallFn",default:void 0}),U=atom({key:"ChatSettings",default:[]}),mt=selector({key:"ChatSettingsValue/Default",get:({get:s})=>s(U).reduce((e,n)=>(e[n.id]=n.initial,e),{})}),O=atom({key:"ChatSettingsValue",default:mt}),q=atom({key:"DisplayElements",default:[]}),K=atom({key:"TasklistElements",default:[]}),W=atom({key:"FirstUserInteraction",default:void 0}),z=atom({key:"AccessToken",default:void 0}),Ut=atom({key:"User",default:null}),vt=atom({key:"ChainlitConfig",default:void 0}),Lt=atom({key:"ThreadHistory",default:{threads:void 0,currentThreadId:void 0,timeGroupedThreads:void 0,pageInfo:void 0},effects:[({setSelf:s,onSet:t})=>{t((e,n)=>{let o=e?.timeGroupedThreads;e?.threads&&!isEqual(e.threads,n?.timeGroupedThreads)&&(o=Et(e.threads)),s({...e,timeGroupedThreads:o});});}]}),Bt=atom({key:"SideView",default:void 0}),G=atom({key:"CurrentThreadId",default:void 0});var be=()=>{let s=useRecoilValue($),t=useRecoilValue(q),e=useRecoilValue(K),n=useRecoilValue(V),o=useRecoilValue(B),r=useRecoilValue(H),c=useRecoilValue(rt),a=useRecoilValue(U),g=useRecoilValue(O),m=useRecoilValue(mt),f=o?.socket.connected&&!o?.error,y=!f||s||r?.spec.type==="file"||r?.spec.type==="action";return {actions:n,askUser:r,callFn:c,chatSettingsDefaultValue:m,chatSettingsInputs:a,chatSettingsValue:g,connected:f,disabled:y,elements:t,error:o?.error,loading:s,tasklists:e}};var we=s=>{let t=[];for(let e of s)t=D(t,e);return t},Re=(s,t)=>{if(s.length-1===t)return !0;for(let e=t+1;e<s.length;e++)if(!s[e].streaming)return !1;return !0},D=(s,t)=>{let e=["assistant_message","user_message"],n=[...e,"tool"],o=e.includes(t.type),r=n.includes(t.type),c=!t.parentId;if(c&&!r)return s;let a=c?void 0:ht(s,t.parentId),g=(c||a?.type!=="assistant_message")&&t.type==="tool";if(at(s,t.id))return ct(s,t.id,t);if(g){let m=s.length>0?s[s.length-1]:void 0,f=m?.type==="assistant_message"&&m?.id.startsWith("wrap_");return m&&f?[...s.slice(0,s.length-1),{...m,steps:[...m.steps||[],t]}]:[...s,{...t,name:"",input:"",output:"",id:"wrap_"+t.id,type:"assistant_message",steps:[t]}]}else return !o&&"parentId"in t&&t.parentId?jt(s,t.parentId,t):"indent"in t&&t.indent&&t.indent>0?Vt(s,t.indent,t):[...s,t]},Vt=(s,t,e,n=0)=>{let o=[...s];if(o.length===0)return [...o,e];{let r=o.length-1,c=o[r];return c.steps=c.steps||[],n+1===t?(c.steps=[...c.steps,e],o[r]={...c},o):(c.steps=Vt(c.steps,t,e,n+1),o[r]={...c},o)}},jt=(s,t,e)=>{let n=[...s];for(let o=0;o<n.length;o++){let r=n[o];isEqual(r.id,t)?(r.steps=r.steps?[...r.steps,e]:[e],n[o]={...r}):at(n,t)&&r.steps&&(r.steps=jt(r.steps,t,e),n[o]={...r});}return n},ht=(s,t)=>{for(let e of s){if(isEqual(e.id,t))return e;if(e.steps&&e.steps.length>0){let n=ht(e.steps,t);if(n)return n}}},at=(s,t)=>ht(s,t)!==void 0,ct=(s,t,e)=>{let n=[...s];for(let o=0;o<n.length;o++){let r=n[o];isEqual(r.id,t)?n[o]={steps:r.steps,...e}:at(n,t)&&r.steps&&(r.steps=ct(r.steps,t,e),n[o]={...r});}return n},St=(s,t)=>{let e=[...s];for(let n=0;n<e.length;n++){let o=e[n];o.id===t?e=[...e.slice(0,n),...e.slice(n+1)]:at(e,t)&&o.steps&&(o.steps=St(o.steps,t),e[n]={...o});}return e},It=(s,t,e,n,o)=>{let r=[...s];for(let c=0;c<r.length;c++){let a=r[c];isEqual(a.id,t)?("content"in a&&a.content!==void 0?n?a.content=e:a.content+=e:o?"input"in a&&a.input!==void 0&&(n?a.input=e:a.input+=e):"output"in a&&a.output!==void 0&&(n?a.output=e:a.output+=e),r[c]={...a}):a.steps&&(a.steps=It(a.steps,t,e,n,o),r[c]={...a});}return r};var kt="token";function yt(){try{return localStorage.getItem(kt)}catch{return}}function $t(s){try{return localStorage.setItem(kt,s)}catch{return}}function lt(){try{return localStorage.removeItem(kt)}catch{return}}var te=async(s,t,e)=>(await s.get(t,e))?.json();function dt(s,{token:t,...e}={}){let n=useContext(P),o=useRecoilValue(z);o=t||o;let r=useMemo(()=>([a,g])=>te(n,a,g),[n]),c=useMemo(()=>s?[s,o]:null,[s,o]);return Zt(c,r,e)}var qt=()=>{let s=useContext(P),{data:t,isLoading:e}=dt("/auth/config"),[n,o]=useRecoilState(z),r=useSetRecoilState(Lt),[c,a]=useRecoilState(Ut),g=!!(!e&&t),m=async()=>{await s.logout(),a(null),lt(),o(""),r(void 0);},f=S=>{if(!S){m();return}try{let{exp:w,...F}=ee(S);$t(S),o(`Bearer ${S}`),a(F);}catch(w){console.error("Invalid token, clearing token from local storage","error:",w),m();}};useEffect(()=>{if(!c&&yt()){f(yt());return}},[]);let y=!!n;return t&&!t.requireLogin?{data:t,user:null,isReady:g,isAuthenticated:!0,accessToken:"",logout:()=>{},setAccessToken:()=>{}}:{data:t,user:c,isAuthenticated:y,isReady:g,accessToken:n,logout:m,setAccessToken:f}};var ut=class extends Error{constructor(e,n){super(e);this.detail=n;}toString(){return this.detail?`${this.message}: ${this.detail}`:this.message}},Tt=class{constructor(t,e,n,o){this.httpEndpoint=t;this.type=e;this.on401=n;this.onError=o;}buildEndpoint(t){return this.httpEndpoint.endsWith("/")?`${this.httpEndpoint.slice(0,-1)}${t}`:`${this.httpEndpoint}${t}`}checkToken(t){let e="Bearer ";return t.startsWith(e)?t:e+t}async fetch(t,e,n,o,r){try{let c={};n&&(c.Authorization=this.checkToken(n));let a;o instanceof FormData?a=o:(c["Content-Type"]="application/json",a=o?JSON.stringify(o):null);let g=await fetch(this.buildEndpoint(e),{method:t,headers:c,signal:r,body:a});if(!g.ok){let m=await g.json();throw g.status===401&&this.on401&&(lt(),this.on401()),new ut(g.statusText,m.detail)}return g}catch(c){throw c instanceof ut&&this.onError&&this.onError(c),console.error(c),c}}async get(t,e){return await this.fetch("GET",t,e)}async post(t,e,n,o){return await this.fetch("POST",t,n,e,o)}async put(t,e,n){return await this.fetch("PUT",t,n,e)}async patch(t,e,n){return await this.fetch("PATCH",t,n,e)}async delete(t,e,n){return await this.fetch("DELETE",t,n,e)}},ft=class extends Tt{async headerAuth(){return (await this.post("/auth/header",{})).json()}async passwordAuth(t){return (await this.post("/login",t)).json()}async logout(){return (await this.post("/logout",{})).json()}async setFeedback(t,e){return (await this.put("/feedback",{feedback:t},e)).json()}async deleteFeedback(t,e){return (await this.delete("/feedback",{feedbackId:t},e)).json()}async listThreads(t,e,n){return (await this.post("/project/threads",{pagination:t,filter:e},n)).json()}async deleteThread(t,e){return (await this.delete("/project/thread",{threadId:t},e)).json()}uploadFile(t,e,n,o){let r=new XMLHttpRequest,c=new Promise((a,g)=>{let m=new FormData;m.append("file",t),r.open("POST",this.buildEndpoint(`/project/file?session_id=${n}`),!0),o&&r.setRequestHeader("Authorization",this.checkToken(o)),r.upload.onprogress=function(f){if(f.lengthComputable){let y=f.loaded/f.total*100;e(y);}},r.onload=function(){if(r.status===200){let f=JSON.parse(r.responseText);a(f);}else g("Upload failed");},r.onerror=function(){g("Upload error");},r.send(m);});return {xhr:r,promise:c}}getElementUrl(t,e){let n=`?session_id=${e}`;return this.buildEndpoint(`/project/file/${t}${n}`)}getLogoEndpoint(t){return this.buildEndpoint(`/logo?theme=${t}`)}getOAuthEndpoint(t){return this.buildEndpoint(`/auth/oauth/${t}`)}};var Qe=void 0,P=createContext(new ft("http://localhost:8000","webapp"));var Kt=()=>{let s=useContext(P),t=useRecoilValue(z),e=useRecoilValue(B),n=useRecoilValue(H),o=useRecoilValue(et),r=useResetRecoilState(U),c=useResetRecoilState(et),a=useResetRecoilState(O),g=useSetRecoilState(W),m=useSetRecoilState($),f=useSetRecoilState(j),y=useSetRecoilState(q),S=useSetRecoilState(K),w=useSetRecoilState(V),F=useSetRecoilState(ot),R=useSetRecoilState(st),v=useSetRecoilState(Bt),N=useSetRecoilState(G),X=useCallback(()=>{e?.socket.emit("clear_session"),e?.socket.disconnect(),R(void 0),c(),g(void 0),f([]),y([]),S([]),w([]),F(0),r(),a(),v(void 0),N(void 0);},[e]),L=useCallback((p,h=[])=>{p.id||(p.id=v4()),p.createdAt||(p.createdAt=new Date().toISOString()),f(d=>D(d,p)),e?.socket.emit("client_message",{message:p,fileReferences:h});},[e?.socket]),J=useCallback((p,h,d,i)=>{e?.socket.emit("audio_chunk",{isStart:p,mimeType:h,elapsedTime:d,data:i});},[e?.socket]),Y=useCallback(p=>{e?.socket.emit("audio_end",{fileReferences:p});},[e?.socket]),Q=useCallback(p=>{n&&(f(h=>D(h,p)),n.callback(p));},[n]),Z=useCallback(p=>{e?.socket.emit("chat_settings_change",p);},[e?.socket]),x=useCallback(()=>{f(p=>p.map(h=>(h.streaming=!1,h))),m(!1),e?.socket.emit("stop");},[e?.socket]),E=useCallback(p=>{let h=e?.socket;if(!h)return;let d=new Promise((i,l)=>{h.once("action_response",u=>{u.status?i(u):l(u);});});return h.emit("action_call",p),d},[e?.socket]);return {uploadFile:useCallback((p,h)=>s.uploadFile(p,h,o,t),[o,t]),callAction:E,clear:X,replyMessage:Q,sendMessage:L,sendAudioChunk:J,endAudioStream:Y,stopTask:x,setIdToResume:R,updateChatSettings:Z}};var dn=()=>{let s=useRecoilValue(j),t=useRecoilValue(W);return {threadId:useRecoilValue(G),messages:s,firstInteraction:t}};var kn=()=>{let s=useContext(P),t=useRecoilValue(et),[e,n]=useRecoilState(B),o=useResetRecoilState(O),r=useSetRecoilState(W),c=useSetRecoilState($),a=useSetRecoilState(j),g=useSetRecoilState(H),m=useSetRecoilState(rt),f=useSetRecoilState(q),y=useSetRecoilState(K),S=useSetRecoilState(V),w=useSetRecoilState(U),F=useSetRecoilState(ot),[R,v]=useRecoilState(Pt),N=useRecoilValue(st),X=useSetRecoilState(G),L=useCallback(({userEnv:Q,accessToken:Z})=>{let{protocol:x,host:E,pathname:C}=new URL(s.httpEndpoint),p=`${x}//${E}`,h=C&&C!=="/"?`${C}/ws/socket.io`:"/ws/socket.io",d=ue(p,{path:h,extraHeaders:{Authorization:Z||"","X-Chainlit-Client-Type":s.type,"X-Chainlit-Session-Id":t,"X-Chainlit-Thread-Id":N||"","user-env":JSON.stringify(Q),"X-Chainlit-Chat-Profile":R?encodeURIComponent(R):""}});n(i=>(i?.socket?.removeAllListeners(),i?.socket?.close(),{socket:d})),d.on("connect",()=>{d.emit("connection_successful"),n(i=>({...i,error:!1}));}),d.on("connect_error",i=>{n(l=>({...l,error:!0}));}),d.on("task_start",()=>{c(!0);}),d.on("task_end",()=>{c(!1);}),d.on("reload",()=>{d.emit("clear_session"),window.location.reload();}),d.on("resume_thread",i=>{let l=[];for(let k of i.steps)l=D(l,k);i.metadata?.chat_profile&&v(i.metadata?.chat_profile),a(l);let u=i.elements||[];y(u.filter(k=>k.type==="tasklist")),f(u.filter(k=>["avatar","tasklist"].indexOf(k.type)===-1));}),d.on("new_message",i=>{a(l=>D(l,i));}),d.on("first_interaction",i=>{r(i.interaction),X(i.thread_id);}),d.on("update_message",i=>{a(l=>ct(l,i.id,i));}),d.on("delete_message",i=>{a(l=>St(l,i.id));}),d.on("stream_start",i=>{a(l=>D(l,i));}),d.on("stream_token",({id:i,token:l,isSequence:u,isInput:k})=>{a(gt=>It(gt,i,l,u,k));}),d.on("ask",({msg:i,spec:l},u)=>{g({spec:l,callback:u}),a(k=>D(k,i)),c(!1);}),d.on("ask_timeout",()=>{g(void 0),c(!1);}),d.on("clear_ask",()=>{g(void 0);}),d.on("call_fn",({name:i,args:l},u)=>{m({name:i,args:l,callback:u});}),d.on("clear_call_fn",()=>{m(void 0);}),d.on("call_fn_timeout",()=>{m(void 0);}),d.on("chat_settings",i=>{w(i),o();}),d.on("element",i=>{!i.url&&i.chainlitKey&&(i.url=s.getElementUrl(i.chainlitKey,t)),i.type==="tasklist"?y(l=>{let u=l.findIndex(k=>k.id===i.id);return u===-1?[...l,i]:[...l.slice(0,u),i,...l.slice(u+1)]}):f(l=>{let u=l.findIndex(k=>k.id===i.id);return u===-1?[...l,i]:[...l.slice(0,u),i,...l.slice(u+1)]});}),d.on("remove_element",i=>{f(l=>l.filter(u=>u.id!==i.id)),y(l=>l.filter(u=>u.id!==i.id));}),d.on("action",i=>{S(l=>[...l,i]);}),d.on("remove_action",i=>{S(l=>{let u=l.findIndex(k=>k.id===i.id);return u===-1?l:[...l.slice(0,u),...l.slice(u+1)]});}),d.on("token_usage",i=>{F(l=>l+i);});},[n,t,R]),J=useCallback(debounce(L,200),[L]),Y=useCallback(()=>{e?.socket&&(e.socket.removeAllListeners(),e.socket.close());},[e]);return {connect:J,disconnect:Y,session:e,sessionId:t,chatProfile:R,idToResume:N,setChatProfile:v}};var fe={enabled:!0,min_decibels:-45,initial_silence_timeout:3e3,silence_timeout:1500,max_duration:15e3,chunk_duration:1e3},Cn=(s=fe)=>{let t=useRef(null),e=useRef(!1),{sendAudioChunk:n,endAudioStream:o}=Kt(),[r,c]=useState(!1),[a,g]=useState(void 0),[m,f]=useState(!1),[y,S]=useState(void 0),[w,F]=useState(!1),R=useCallback(()=>{!r||!t.current||(e.current=!0,t.current.stop());},[r]),v=useCallback(()=>{!r||!t.current||t.current.stop();},[r]);return {startRecording:useCallback(X=>{if(r||!s)return;F(!1),S(void 0),clearTimeout(a),e.current=!1;let{min_decibels:L,silence_timeout:J,initial_silence_timeout:Y,chunk_duration:Q,max_duration:Z}=s;navigator.mediaDevices.getUserMedia({audio:!0}).then(x=>{let E=!1,C=!1,p=!0,h=null,d=Date.now(),i=new MediaRecorder(x);t.current=i,i.addEventListener("start",()=>{c(!0),d=Date.now();}),i.addEventListener("dataavailable",async T=>{if(E||(h?h=new Blob([h,T.data],{type:T.data.type}):h=new Blob([T.data],{type:T.data.type})),i.state==="inactive")return;let tt=Date.now()-d;if(tt>=Z){i.stop(),x.getTracks().forEach(Nt=>Nt.stop());return}f(C);let[Rt,me]=i.mimeType.split(";");h?(await n(p,Rt,tt,new Blob([h,T.data])),h=null):await n(p,Rt,tt,T.data),p&&(p=!1);}),i.addEventListener("stop",async()=>{c(!1),f(!1),E&&!e.current&&(F(!0),await o(X));});let l=new AudioContext,u=l.createMediaStreamSource(x),k=l.createAnalyser();k.minDecibels=L,u.connect(k);let gt=k.frequencyBinCount,_t=new Uint8Array(gt);i.start(Q);let wt=()=>{if(i.state==="inactive")return;k.getByteFrequencyData(_t);let T=_t.some(tt=>tt>0);C||(C=T),!E&&T&&(f(C),E=!0),requestAnimationFrame(wt);};wt(),setTimeout(()=>{E?g(setInterval(()=>{C?C=!1:(i.stop(),x.getTracks().forEach(T=>T.stop()));},J)):(i.stop(),x.getTracks().forEach(T=>T.stop()));},Y);}).catch(x=>{S(x.message);});},[a,r,s,n,o]),stopRecording:v,cancelRecording:R,isRecording:r,isSpeaking:m,isRecordingFinished:w,error:y}};var En=s=>{let[t,e]=useRecoilState(vt),{isAuthenticated:n}=qt(),o=navigator.language||"en-US",{data:r,error:c,isLoading:a}=dt(!t&&n?`/project/settings?language=${o}`:null,{token:s});return useEffect(()=>{r&&e(r);},[r,e]),{config:t,error:c,isLoading:a,language:o}};
|
|
11
11
|
|
|
12
|
-
export {
|
|
12
|
+
export { Tt as APIBase, ft as ChainlitAPI, P as ChainlitContext, ut as ClientError, z as accessTokenState, V as actionState, D as addMessage, jt as addMessageToParent, H as askUserState, rt as callFnState, Pt as chatProfileState, mt as chatSettingsDefaultValueSelector, U as chatSettingsInputsState, O as chatSettingsValueState, vt as configState, G as currentThreadIdState, Qe as defaultChainlitContext, St as deleteMessageById, q as elementState, te as fetcher, W as firstUserInteraction, at as hasMessageById, Re as isLastMessage, $ as loadingState, j as messagesState, we as nestMessages, et as sessionIdState, B as sessionState, Bt as sideViewState, K as tasklistState, Lt as threadHistoryState, st as threadIdToResumeState, ot as tokenCountState, ct as updateMessageById, It as updateMessageContentById, dt as useApi, Cn as useAudio, qt as useAuth, be as useChatData, Kt as useChatInteract, dn as useChatMessages, kn as useChatSession, En as useConfig, Ut as userState };
|
|
13
13
|
//# sourceMappingURL=out.js.map
|
|
14
14
|
//# sourceMappingURL=index.mjs.map
|