@chainlit/react-client 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -277,7 +277,7 @@ declare class ChainlitAPI extends APIBase {
|
|
|
277
277
|
id: string;
|
|
278
278
|
}>;
|
|
279
279
|
};
|
|
280
|
-
getElementUrl(id: string, sessionId: string
|
|
280
|
+
getElementUrl(id: string, sessionId: string): string;
|
|
281
281
|
getLogoEndpoint(theme: string): string;
|
|
282
282
|
getOAuthEndpoint(provider: string): string;
|
|
283
283
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -277,7 +277,7 @@ declare class ChainlitAPI extends APIBase {
|
|
|
277
277
|
id: string;
|
|
278
278
|
}>;
|
|
279
279
|
};
|
|
280
|
-
getElementUrl(id: string, sessionId: string
|
|
280
|
+
getElementUrl(id: string, sessionId: string): string;
|
|
281
281
|
getLogoEndpoint(theme: string): string;
|
|
282
282
|
getOAuthEndpoint(provider: string): string;
|
|
283
283
|
}
|
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,u){try{var a=e[i](u);var s=a.value}catch(e){n(e);return}if(a.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 u=e.apply(t,n);function a(e){o(u,r,i,a,s,"next",e)}function s(e){o(u,r,i,a,s,"throw",e)}a(undefined)})}}function u(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function a(e,t,n){if(_()){a=Reflect.construct}else{a=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 a.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 v(e,t){if(t!=null&&typeof Symbol!=="undefined"&&t[Symbol.hasInstance]){return!!t[Symbol.hasInstance](e)}else{return e instanceof t}}function p(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 u,a;try{for(n=n.call(e);!(o=(u=n.next()).done);o=true){r.push(u.value);if(t&&r.length===t)break}}catch(e){i=true;a=e}finally{try{if(!o&&n["return"]!=null)n["return"]()}finally{if(i)throw a}}return r}function b(){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 g(){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 S(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 m(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 k(e,t){t=t!=null?t:{};if(Object.getOwnPropertyDescriptors){Object.defineProperties(e,Object.getOwnPropertyDescriptors(t))}else{m(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 j(e,n){return t(e)||y(e,n)||I(e,n)||b()}function E(e){return n(e)||h(e)||I(e)||g()}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 P(e){var t=typeof Map==="function"?new Map:undefined;P=function e(e){if(e===null||!p(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 a(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 P(e)}function _(){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=_();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 C(e,t){var n,r,o,i,u={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]};return(i={next:a(0),"throw":a(1),"return":a(2)},typeof Symbol==="function"&&(i[Symbol.iterator]=function(){return this}),i);function a(e){return function(t){return s([e,t])}}function s(i){if(n)throw new TypeError("Generator is already executing.");while(u)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:u.label++;return{value:i[1],done:false};case 5:u.label++;r=i[1];i=[0];continue;case 7:i=u.ops.pop();u.trys.pop();continue;default:if(!(o=u.trys,o=o.length>0&&o[o.length-1])&&(i[0]===6||i[0]===2)){u=0;continue}if(i[0]===3&&(!o||i[1]>o[0]&&i[1]<o[3])){u.label=i[1];break}if(i[0]===6&&u.label<o[1]){u.label=o[1];o=i;break}if(o&&u.label<o[2]){u.label=o[2];u.ops.push(i);break}if(o[2])u.ops.pop();u.trys.pop();continue}i=t.call(e,u)}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 B=require("jwt-decode");var L=require("swr");function F(e){return e&&e.__esModule?e:{default:e}}var G=/*#__PURE__*/F(U);var H=/*#__PURE__*/F(B);var X=/*#__PURE__*/F(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 u=new Date(e.createdAt),a=u.toDateString()===n.toDateString(),s=u.toDateString()===r.toDateString(),c=u>=o,l=u>=i,f;a?f="Today":s?f="Yesterday":c?f="Previous 7 days":l?f="Previous 30 days":f=u.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,v(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:"ChatSettings",default:[]}),er=D.selector({key:"ChatSettingsValue/Default",get:function(e){var t=e.get;return t(en).reduce(function(e,t){return e[t.id]=t.initial,e},{})}}),eo=D.atom({key:"ChatSettingsValue",default:er}),ei=D.atom({key:"DisplayElements",default:[]}),eu=D.atom({key:"AvatarElements",default:[]}),ea=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(k(S({},e),{timeGroupedThreads:r}))})}]});var ed=function(){var e=D.useRecoilValue(ee),t=D.useRecoilValue(ei),n=D.useRecoilValue(eu),r=D.useRecoilValue(ea),o=D.useRecoilValue($),i=D.useRecoilValue(Y),u=D.useRecoilValue(et),a=D.useRecoilValue(en),s=D.useRecoilValue(eo),c=D.useRecoilValue(er),l=(i===null||i===void 0?void 0:i.socket.connected)&&!(i===null||i===void 0?void 0:i.error),f=!l||e||(u===null||u===void 0?void 0:u.spec.type)==="file"||(u===null||u===void 0?void 0:u.spec.type)==="action";return{actions:o,askUser:u,avatars:n,chatSettingsDefaultValue:c,chatSettingsInputs:a,chatSettingsValue:s,connected:l,disabled:f,elements:t,error:i===null||i===void 0?void 0:i.error,loading:e,tasklists:r}};var ev=function(e){var t=[];var n=true,r=false,o=undefined;try{for(var i=e[Symbol.iterator](),u;!(n=(u=i.next()).done);n=true){var a=u.value;t=eh(t,a)}}catch(e){r=true;o=e}finally{try{if(!n&&i.return!=null){i.return()}}finally{if(r){throw o}}}return t},ep=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},eh=function(e,t){return eg(e,t.id)?eS(e,t.id,t):"parentId"in t&&t.parentId?eb(e,t.parentId,t):"indent"in t&&t.indent&&t.indent>0?ey(e,t.indent,t):E(e).concat([t])},ey=function(e,t,n){var r=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;var o=E(e);if(o.length===0)return E(o).concat([n]);{var i=o.length-1,u=o[i];return u.steps=u.steps||[],r+1===t?(u.steps=E(u.steps).concat([n]),o[i]=S({},u),o):(u.steps=ey(u.steps,t,n,r+1),o[i]=S({},u),o)}},eb=function(e,t,n){var r=E(e);for(var o=0;o<r.length;o++){var i=r[o];V.isEqual(i.id,t)?(i.steps=i.steps?E(i.steps).concat([n]):[n],r[o]=S({},i)):eg(r,t)&&i.steps&&(i.steps=eb(i.steps,t,n),r[o]=S({},i))}return r},eg=function(e,t){var n=true,r=false,o=undefined;try{for(var i=e[Symbol.iterator](),u;!(n=(u=i.next()).done);n=true){var a=u.value;if(V.isEqual(a.id,t))return!0;if(a.steps&&a.steps.length>0&&eg(a.steps,t))return!0}}catch(e){r=true;o=e}finally{try{if(!n&&i.return!=null){i.return()}}finally{if(r){throw o}}}return!1},eS=function(e,t,n){var r=E(e);for(var o=0;o<r.length;o++){var i=r[o];V.isEqual(i.id,t)?r[o]=S({steps:i.steps},n):eg(r,t)&&i.steps&&(i.steps=eS(i.steps,t,n),r[o]=S({},i))}return r},em=function(e,t){var n=E(e);for(var r=0;r<n.length;r++){var o=n[r];o.id===t?n=E(n.slice(0,r)).concat(E(n.slice(r+1))):eg(n,t)&&o.steps&&(o.steps=em(o.steps,t),n[r]=S({},o))}return n},ek=function(e,t,n,r){var o=E(e);for(var i=0;i<o.length;i++){var u=o[i];V.isEqual(u.id,t)?("content"in u&&u.content!==void 0?r?u.content=n:u.content+=n:"output"in u&&u.output!==void 0&&(r?u.output=n:u.output+=n),o[i]=S({},u)):u.steps&&(u.steps=ek(u.steps,t,n,r),o[i]=S({},u))}return o};var ew=function(){var e=D.useRecoilValue(ec),t=D.useRecoilValue(Y),n=D.useRecoilValue(et),r=D.useRecoilValue(K),o=D.useResetRecoilState(en),i=D.useResetRecoilState(K),u=D.useResetRecoilState(eo),a=D.useSetRecoilState(es),s=D.useSetRecoilState(ee),c=D.useSetRecoilState(Q),l=D.useSetRecoilState(ei),f=D.useSetRecoilState(eu),d=D.useSetRecoilState(ea),v=D.useSetRecoilState($),p=D.useSetRecoilState(Z),h=D.useSetRecoilState(J),y=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(),h(void 0),i(),a(void 0),c([]),l([]),f([]),d([]),v([]),p(0),o(),u()},[t]),b=q.useCallback(function(e,n){c(function(t){return eh(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]),g=q.useCallback(function(e){n&&(c(function(t){return eh(t,e)}),n.callback(e))},[n]),S=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]),m=q.useCallback(function(){s(!1),t===null||t===void 0?void 0:t.socket.emit("stop")},[t===null||t===void 0?void 0:t.socket]),k=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:k,clear:y,replyMessage:g,sendMessage:b,stopTask:m,setIdToResume:h,updateChatSettings:S}};var eR=function(){var e=D.useRecoilValue(Q),t=D.useRecoilValue(es);return{messages:e,firstInteraction:t}};var ex=function(){var e=D.useRecoilValue(K),t=j(D.useRecoilState(Y),2),n=t[0],r=t[1],o=D.useResetRecoilState(eo),i=D.useSetRecoilState(es),u=D.useSetRecoilState(ee),a=D.useSetRecoilState(Q),s=D.useSetRecoilState(et),c=D.useSetRecoilState(ei),l=D.useSetRecoilState(eu),f=D.useSetRecoilState(ea),d=D.useSetRecoilState($),v=D.useSetRecoilState(en),p=D.useSetRecoilState(Z),h=j(D.useRecoilState(N),2),y=h[0],b=h[1],g=D.useRecoilValue(J),m=q.useCallback(function(t){var n=t.client,h=t.userEnv,m=t.accessToken;var w=G.default(n.httpEndpoint,{path:"/ws/socket.io",extraHeaders:{Authorization:m||"","X-Chainlit-Session-Id":e,"X-Chainlit-Thread-Id":g||"","user-env":JSON.stringify(h),"X-Chainlit-Chat-Profile":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:w}}),w.on("connect",function(){w.emit("connection_successful"),r(function(e){return k(S({},e),{error:!1})})}),w.on("connect_error",function(e){r(function(e){return k(S({},e),{error:!0})})}),w.on("task_start",function(){u(!0)}),w.on("task_end",function(){u(!1)}),w.on("reload",function(){w.emit("clear_session"),window.location.reload()}),w.on("resume_thread",function(e){var t,n;var r=[];var o=true,i=false,u=undefined;try{for(var s=e.steps[Symbol.iterator](),d;!(o=(d=s.next()).done);o=true){var v=d.value;r=eh(r,v)}}catch(e){i=true;u=e}finally{try{if(!o&&s.return!=null){s.return()}}finally{if(i){throw u}}}((t=e.metadata)===null||t===void 0?void 0:t.chat_profile)&&b((n=e.metadata)===null||n===void 0?void 0:n.chat_profile),a(r);var p=e.elements||[];l(p.filter(function(e){return e.type==="avatar"})),f(p.filter(function(e){return e.type==="tasklist"})),c(p.filter(function(e){return["avatar","tasklist"].indexOf(e.type)===-1}))}),w.on("new_message",function(e){a(function(t){return eh(t,e)})}),w.on("first_interaction",function(e){i(e)}),w.on("update_message",function(e){a(function(t){return eS(t,e.id,e)})}),w.on("delete_message",function(e){a(function(t){return em(t,e.id)})}),w.on("stream_start",function(e){a(function(t){return eh(t,e)})}),w.on("stream_token",function(e){var t=e.id,n=e.token,r=e.isSequence;a(function(e){return ek(e,t,n,r)})}),w.on("ask",function(e,t){var n=e.msg,r=e.spec;s({spec:r,callback:t}),a(function(e){return eh(e,n)}),u(!1)}),w.on("ask_timeout",function(){s(void 0),u(!1)}),w.on("clear_ask",function(){s(void 0)}),w.on("chat_settings",function(e){v(e),o()}),w.on("element",function(t){!t.url&&t.chainlitKey&&(t.url=n.getElementUrl(t.chainlitKey,e,m)),t.type==="avatar"?l(function(e){var n=e.findIndex(function(e){return e.id===t.id});return n===-1?E(e).concat([t]):E(e.slice(0,n)).concat([t],E(e.slice(n+1)))}):t.type==="tasklist"?f(function(e){var n=e.findIndex(function(e){return e.id===t.id});return n===-1?E(e).concat([t]):E(e.slice(0,n)).concat([t],E(e.slice(n+1)))}):c(function(e){var n=e.findIndex(function(e){return e.id===t.id});return n===-1?E(e).concat([t]):E(e.slice(0,n)).concat([t],E(e.slice(n+1)))})}),w.on("remove_element",function(e){c(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})}),l(function(t){return t.filter(function(t){return t.id!==e.id})})}),w.on("action",function(e){d(function(t){return E(t).concat([e])})}),w.on("remove_action",function(e){d(function(t){var n=t.findIndex(function(t){return t.id===e.id});return n===-1?t:E(t.slice(0,n)).concat(E(t.slice(n+1)))})}),w.on("token_usage",function(e){p(function(t){return t+e})})},[r,e,y]),w=q.useCallback(V.debounce(m,200),[m]),R=q.useCallback(function(){(n===null||n===void 0?void 0:n.socket)&&(n.socket.removeAllListeners(),n.socket.close())},[n]);return{connect:w,disconnect:R,session:n,chatProfile:y,idToResume:g,setChatProfile:b}};var eO="token";function ej(){try{return localStorage.getItem(eO)}catch(e){return}}function eE(e){try{return localStorage.setItem(eO,e)}catch(e){return}}function eT(){try{return localStorage.removeItem(eO)}catch(e){return}}var eI=function(){var e=i(function(e,t,n){var r;return C(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 eP(e,t,n){var r=D.useRecoilValue(ec);return X.default(t?[t,r]:null,function(t){var n=j(t,2),r=n[0],o=n[1];return eI(e,r,o)},n)}var e_=function(e){var t=eP(e,"/auth/config"),n=t.data,r=t.isLoading,o=j(D.useRecoilState(ec),2),i=o[0],u=o[1],a=D.useSetRecoilState(ef),s=j(D.useRecoilState(el),2),c=s[0],l=s[1],f=!!(!r&&n),d=function(){l(null),eT(),u(""),a(void 0)},v=function(e){if(!e){d();return}try{var t=H.default(e),n=t.exp,r=w(t,["exp"]);eE(e),u("Bearer ".concat(e)),l(r)}catch(e){console.error("Invalid token, clearing token from local storage","error:",e),d()}};q.useEffect(function(){if(!c&&ej()){v(ej());return}},[]);var p=!!i;return n&&!n.requireLogin?{data:n,user:null,isReady:f,isAuthenticated:!0,accessToken:"",logout:function(){},setAccessToken:function(){}}:{data:n,user:c,isAuthenticated:p,isReady:f,accessToken:i,logout:d,setAccessToken:v}};var eA=/*#__PURE__*/function(e){d(n,e);var t=A(n);function n(e,r){u(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}(P(Error)),eC=/*#__PURE__*/function(){function e(t,n,r){u(this,e);this.httpEndpoint=t;this.on401=n;this.onError=r}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 u=this;return i(function(){var i,a,s,c,l;return C(this,function(f){switch(f.label){case 0:f.trys.push([0,4,,5]);i={};n&&(i.Authorization=u.checkToken(n));v(r,FormData)?a=r:(i["Content-Type"]="application/json",a=r?JSON.stringify(r):null);return[4,fetch(u.buildEndpoint(t),{method:e,headers:i,signal:o,body:a})];case 1:s=f.sent();if(!!s.ok)return[3,3];return[4,s.json()];case 2:c=f.sent();throw s.status===401&&u.on401&&(eT(),u.on401()),new eA(s.statusText,c.detail);case 3:return[2,s];case 4:l=f.sent();throw v(l,eA)&&u.onError&&u.onError(l),console.error(l),l;case 5:return[2]}})})()}},{key:"get",value:function e(e,t){var n=this;return i(function(){return C(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 C(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 C(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 C(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 C(this,function(o){switch(o.label){case 0:return[4,r.fetch("DELETE",e,n,t)];case 1:return[2,o.sent()]}})})()}}]);return e}(),eD=/*#__PURE__*/function(e){d(n,e);var t=A(n);function n(){u(this,n);return t.apply(this,arguments)}c(n,[{key:"headerAuth",value:function e(){var e=this;return i(function(){return C(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 C(this,function(n){switch(n.label){case 0:return[4,t.post("/login",e)];case 1:return[2,n.sent().json()]}})})()}},{key:"getGeneration",value:function e(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,r=arguments.length>3?arguments[3]:void 0,o=arguments.length>4?arguments[4]:void 0;var u=this;return i(function(){var i,a,s,c;return C(this,function(l){switch(l.label){case 0:s={userEnv:t};e.type==="CHAT"?s.chatGeneration=e:s.completionGeneration=e;return[4,u.post("/generation",s,r,n.signal)];case 1:c=(a=l.sent())===null||a===void 0?void 0:(i=a.body)===null||i===void 0?void 0:i.getReader();return[2,new ReadableStream({start:function e(e){function t(){c.read().then(function(n){var r=n.done,i=n.value;if(r){e.close(),o&&o(r,"");return}var u=new TextDecoder("utf-8").decode(i);o&&o(r,u),e.enqueue(i),t()}).catch(function(t){e.close(),o&&o(!0,""),console.error(t)})}t()}})]}})})()}},{key:"setFeedback",value:function e(e,t){var n=this;return i(function(){return C(this,function(r){switch(r.label){case 0:return[4,n.put("/feedback",{feedback:e},t)];case 1:return[2,r.sent().json()]}})})()}},{key:"listThreads",value:function e(e,t,n){var r=this;return i(function(){return C(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 C(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,u=new Promise(function(u,a){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);u(e)}else a("Upload failed")},i.onerror=function(){a("Upload error")},i.send(s)});return{xhr:i,promise:u}}},{key:"getElementUrl",value:function e(e,t,n){var r="?session_id=".concat(t);return n&&(n.startsWith("Bearer ")&&(n=n.slice(7)),r+="&token=".concat(n)),this.buildEndpoint("/project/file/".concat(e).concat(r))}},{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}(eC);Object.defineProperty(exports,"Socket",{enumerable:true,get:function e(){return U.Socket}});exports.APIBase=eC;exports.ChainlitAPI=eD;exports.ClientError=eA;exports.accessTokenState=ec;exports.actionState=$;exports.addMessage=eh;exports.addMessageToParent=eb;exports.askUserState=et;exports.avatarState=eu;exports.chatProfileState=N;exports.chatSettingsDefaultValueSelector=er;exports.chatSettingsInputsState=en;exports.chatSettingsValueState=eo;exports.deleteMessageById=em;exports.elementState=ei;exports.fetcher=eI;exports.firstUserInteraction=es;exports.hasMessageById=eg;exports.isLastMessage=ep;exports.loadingState=ee;exports.messagesState=Q;exports.nestMessages=ev;exports.sessionIdState=K;exports.sessionState=Y;exports.tasklistState=ea;exports.threadHistoryState=ef;exports.threadIdToResumeState=J;exports.tokenCountState=Z;exports.updateMessageById=eS;exports.updateMessageContentById=ek;exports.useApi=eP;exports.useAuth=e_;exports.useChatData=ed;exports.useChatInteract=ew;exports.useChatMessages=eR;exports.useChatSession=ex;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,u){try{var a=e[i](u);var s=a.value}catch(e){n(e);return}if(a.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 u=e.apply(t,n);function a(e){o(u,r,i,a,s,"next",e)}function s(e){o(u,r,i,a,s,"throw",e)}a(undefined)})}}function u(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function a(e,t,n){if(_()){a=Reflect.construct}else{a=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 a.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 v(e,t){if(t!=null&&typeof Symbol!=="undefined"&&t[Symbol.hasInstance]){return!!t[Symbol.hasInstance](e)}else{return e instanceof t}}function p(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 u,a;try{for(n=n.call(e);!(o=(u=n.next()).done);o=true){r.push(u.value);if(t&&r.length===t)break}}catch(e){i=true;a=e}finally{try{if(!o&&n["return"]!=null)n["return"]()}finally{if(i)throw a}}return r}function b(){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 g(){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 S(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 m(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 k(e,t){t=t!=null?t:{};if(Object.getOwnPropertyDescriptors){Object.defineProperties(e,Object.getOwnPropertyDescriptors(t))}else{m(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 j(e,n){return t(e)||y(e,n)||I(e,n)||b()}function E(e){return n(e)||h(e)||I(e)||g()}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 P(e){var t=typeof Map==="function"?new Map:undefined;P=function e(e){if(e===null||!p(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 a(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 P(e)}function _(){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=_();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 C(e,t){var n,r,o,i,u={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]};return(i={next:a(0),"throw":a(1),"return":a(2)},typeof Symbol==="function"&&(i[Symbol.iterator]=function(){return this}),i);function a(e){return function(t){return s([e,t])}}function s(i){if(n)throw new TypeError("Generator is already executing.");while(u)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:u.label++;return{value:i[1],done:false};case 5:u.label++;r=i[1];i=[0];continue;case 7:i=u.ops.pop();u.trys.pop();continue;default:if(!(o=u.trys,o=o.length>0&&o[o.length-1])&&(i[0]===6||i[0]===2)){u=0;continue}if(i[0]===3&&(!o||i[1]>o[0]&&i[1]<o[3])){u.label=i[1];break}if(i[0]===6&&u.label<o[1]){u.label=o[1];o=i;break}if(o&&u.label<o[2]){u.label=o[2];u.ops.push(i);break}if(o[2])u.ops.pop();u.trys.pop();continue}i=t.call(e,u)}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 L=require("jwt-decode");var B=require("swr");function F(e){return e&&e.__esModule?e:{default:e}}var G=/*#__PURE__*/F(U);var H=/*#__PURE__*/F(L);var X=/*#__PURE__*/F(B);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 u=new Date(e.createdAt),a=u.toDateString()===n.toDateString(),s=u.toDateString()===r.toDateString(),c=u>=o,l=u>=i,f;a?f="Today":s?f="Yesterday":c?f="Previous 7 days":l?f="Previous 30 days":f=u.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}),K=D.atom({key:"SessionId",default:M.v4()}),W=D.selector({key:"SessionIdSelector",get:function(e){var t=e.get;return t(K)},set:function(e,t){var n=e.set;return n(K,v(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:"ChatSettings",default:[]}),er=D.selector({key:"ChatSettingsValue/Default",get:function(e){var t=e.get;return t(en).reduce(function(e,t){return e[t.id]=t.initial,e},{})}}),eo=D.atom({key:"ChatSettingsValue",default:er}),ei=D.atom({key:"DisplayElements",default:[]}),eu=D.atom({key:"AvatarElements",default:[]}),ea=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(k(S({},e),{timeGroupedThreads:r}))})}]});var ed=function(){var e=D.useRecoilValue(ee),t=D.useRecoilValue(ei),n=D.useRecoilValue(eu),r=D.useRecoilValue(ea),o=D.useRecoilValue($),i=D.useRecoilValue(Y),u=D.useRecoilValue(et),a=D.useRecoilValue(en),s=D.useRecoilValue(eo),c=D.useRecoilValue(er),l=(i===null||i===void 0?void 0:i.socket.connected)&&!(i===null||i===void 0?void 0:i.error),f=!l||e||(u===null||u===void 0?void 0:u.spec.type)==="file"||(u===null||u===void 0?void 0:u.spec.type)==="action";return{actions:o,askUser:u,avatars:n,chatSettingsDefaultValue:c,chatSettingsInputs:a,chatSettingsValue:s,connected:l,disabled:f,elements:t,error:i===null||i===void 0?void 0:i.error,loading:e,tasklists:r}};var ev=function(e){var t=[];var n=true,r=false,o=undefined;try{for(var i=e[Symbol.iterator](),u;!(n=(u=i.next()).done);n=true){var a=u.value;t=eh(t,a)}}catch(e){r=true;o=e}finally{try{if(!n&&i.return!=null){i.return()}}finally{if(r){throw o}}}return t},ep=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},eh=function(e,t){return eg(e,t.id)?eS(e,t.id,t):"parentId"in t&&t.parentId?eb(e,t.parentId,t):"indent"in t&&t.indent&&t.indent>0?ey(e,t.indent,t):E(e).concat([t])},ey=function(e,t,n){var r=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;var o=E(e);if(o.length===0)return E(o).concat([n]);{var i=o.length-1,u=o[i];return u.steps=u.steps||[],r+1===t?(u.steps=E(u.steps).concat([n]),o[i]=S({},u),o):(u.steps=ey(u.steps,t,n,r+1),o[i]=S({},u),o)}},eb=function(e,t,n){var r=E(e);for(var o=0;o<r.length;o++){var i=r[o];V.isEqual(i.id,t)?(i.steps=i.steps?E(i.steps).concat([n]):[n],r[o]=S({},i)):eg(r,t)&&i.steps&&(i.steps=eb(i.steps,t,n),r[o]=S({},i))}return r},eg=function(e,t){var n=true,r=false,o=undefined;try{for(var i=e[Symbol.iterator](),u;!(n=(u=i.next()).done);n=true){var a=u.value;if(V.isEqual(a.id,t))return!0;if(a.steps&&a.steps.length>0&&eg(a.steps,t))return!0}}catch(e){r=true;o=e}finally{try{if(!n&&i.return!=null){i.return()}}finally{if(r){throw o}}}return!1},eS=function(e,t,n){var r=E(e);for(var o=0;o<r.length;o++){var i=r[o];V.isEqual(i.id,t)?r[o]=S({steps:i.steps},n):eg(r,t)&&i.steps&&(i.steps=eS(i.steps,t,n),r[o]=S({},i))}return r},em=function(e,t){var n=E(e);for(var r=0;r<n.length;r++){var o=n[r];o.id===t?n=E(n.slice(0,r)).concat(E(n.slice(r+1))):eg(n,t)&&o.steps&&(o.steps=em(o.steps,t),n[r]=S({},o))}return n},ek=function(e,t,n,r){var o=E(e);for(var i=0;i<o.length;i++){var u=o[i];V.isEqual(u.id,t)?("content"in u&&u.content!==void 0?r?u.content=n:u.content+=n:"output"in u&&u.output!==void 0&&(r?u.output=n:u.output+=n),o[i]=S({},u)):u.steps&&(u.steps=ek(u.steps,t,n,r),o[i]=S({},u))}return o};var ew=function(){var e=D.useRecoilValue(ec),t=D.useRecoilValue(Y),n=D.useRecoilValue(et),r=D.useRecoilValue(W),o=D.useResetRecoilState(en),i=D.useResetRecoilState(W),u=D.useResetRecoilState(eo),a=D.useSetRecoilState(es),s=D.useSetRecoilState(ee),c=D.useSetRecoilState(Q),l=D.useSetRecoilState(ei),f=D.useSetRecoilState(eu),d=D.useSetRecoilState(ea),v=D.useSetRecoilState($),p=D.useSetRecoilState(Z),h=D.useSetRecoilState(J),y=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(),h(void 0),i(),a(void 0),c([]),l([]),f([]),d([]),v([]),p(0),o(),u()},[t]),b=q.useCallback(function(e,n){c(function(t){return eh(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]),g=q.useCallback(function(e){n&&(c(function(t){return eh(t,e)}),n.callback(e))},[n]),S=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]),m=q.useCallback(function(){s(!1),t===null||t===void 0?void 0:t.socket.emit("stop")},[t===null||t===void 0?void 0:t.socket]),k=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:k,clear:y,replyMessage:g,sendMessage:b,stopTask:m,setIdToResume:h,updateChatSettings:S}};var eR=function(){var e=D.useRecoilValue(Q),t=D.useRecoilValue(es);return{messages:e,firstInteraction:t}};var ex=function(){var e=D.useRecoilValue(W),t=j(D.useRecoilState(Y),2),n=t[0],r=t[1],o=D.useResetRecoilState(eo),i=D.useSetRecoilState(es),u=D.useSetRecoilState(ee),a=D.useSetRecoilState(Q),s=D.useSetRecoilState(et),c=D.useSetRecoilState(ei),l=D.useSetRecoilState(eu),f=D.useSetRecoilState(ea),d=D.useSetRecoilState($),v=D.useSetRecoilState(en),p=D.useSetRecoilState(Z),h=j(D.useRecoilState(N),2),y=h[0],b=h[1],g=D.useRecoilValue(J),m=q.useCallback(function(t){var n=t.client,h=t.userEnv,m=t.accessToken;var w=G.default(n.httpEndpoint,{path:"/ws/socket.io",extraHeaders:{Authorization:m||"","X-Chainlit-Session-Id":e,"X-Chainlit-Thread-Id":g||"","user-env":JSON.stringify(h),"X-Chainlit-Chat-Profile":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:w}}),w.on("connect",function(){w.emit("connection_successful"),r(function(e){return k(S({},e),{error:!1})})}),w.on("connect_error",function(e){r(function(e){return k(S({},e),{error:!0})})}),w.on("task_start",function(){u(!0)}),w.on("task_end",function(){u(!1)}),w.on("reload",function(){w.emit("clear_session"),window.location.reload()}),w.on("resume_thread",function(e){var t,n;var r=[];var o=true,i=false,u=undefined;try{for(var s=e.steps[Symbol.iterator](),d;!(o=(d=s.next()).done);o=true){var v=d.value;r=eh(r,v)}}catch(e){i=true;u=e}finally{try{if(!o&&s.return!=null){s.return()}}finally{if(i){throw u}}}((t=e.metadata)===null||t===void 0?void 0:t.chat_profile)&&b((n=e.metadata)===null||n===void 0?void 0:n.chat_profile),a(r);var p=e.elements||[];l(p.filter(function(e){return e.type==="avatar"})),f(p.filter(function(e){return e.type==="tasklist"})),c(p.filter(function(e){return["avatar","tasklist"].indexOf(e.type)===-1}))}),w.on("new_message",function(e){a(function(t){return eh(t,e)})}),w.on("first_interaction",function(e){i(e)}),w.on("update_message",function(e){a(function(t){return eS(t,e.id,e)})}),w.on("delete_message",function(e){a(function(t){return em(t,e.id)})}),w.on("stream_start",function(e){a(function(t){return eh(t,e)})}),w.on("stream_token",function(e){var t=e.id,n=e.token,r=e.isSequence;a(function(e){return ek(e,t,n,r)})}),w.on("ask",function(e,t){var n=e.msg,r=e.spec;s({spec:r,callback:t}),a(function(e){return eh(e,n)}),u(!1)}),w.on("ask_timeout",function(){s(void 0),u(!1)}),w.on("clear_ask",function(){s(void 0)}),w.on("chat_settings",function(e){v(e),o()}),w.on("element",function(t){!t.url&&t.chainlitKey&&(t.url=n.getElementUrl(t.chainlitKey,e)),t.type==="avatar"?l(function(e){var n=e.findIndex(function(e){return e.id===t.id});return n===-1?E(e).concat([t]):E(e.slice(0,n)).concat([t],E(e.slice(n+1)))}):t.type==="tasklist"?f(function(e){var n=e.findIndex(function(e){return e.id===t.id});return n===-1?E(e).concat([t]):E(e.slice(0,n)).concat([t],E(e.slice(n+1)))}):c(function(e){var n=e.findIndex(function(e){return e.id===t.id});return n===-1?E(e).concat([t]):E(e.slice(0,n)).concat([t],E(e.slice(n+1)))})}),w.on("remove_element",function(e){c(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})}),l(function(t){return t.filter(function(t){return t.id!==e.id})})}),w.on("action",function(e){d(function(t){return E(t).concat([e])})}),w.on("remove_action",function(e){d(function(t){var n=t.findIndex(function(t){return t.id===e.id});return n===-1?t:E(t.slice(0,n)).concat(E(t.slice(n+1)))})}),w.on("token_usage",function(e){p(function(t){return t+e})})},[r,e,y]),w=q.useCallback(V.debounce(m,200),[m]),R=q.useCallback(function(){(n===null||n===void 0?void 0:n.socket)&&(n.socket.removeAllListeners(),n.socket.close())},[n]);return{connect:w,disconnect:R,session:n,chatProfile:y,idToResume:g,setChatProfile:b}};var eO="token";function ej(){try{return localStorage.getItem(eO)}catch(e){return}}function eE(e){try{return localStorage.setItem(eO,e)}catch(e){return}}function eT(){try{return localStorage.removeItem(eO)}catch(e){return}}var eI=function(){var e=i(function(e,t,n){var r;return C(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 eP(e,t,n){var r=D.useRecoilValue(ec);return X.default(t?[t,r]:null,function(t){var n=j(t,2),r=n[0],o=n[1];return eI(e,r,o)},n)}var e_=function(e){var t=eP(e,"/auth/config"),n=t.data,r=t.isLoading,o=j(D.useRecoilState(ec),2),i=o[0],u=o[1],a=D.useSetRecoilState(ef),s=j(D.useRecoilState(el),2),c=s[0],l=s[1],f=!!(!r&&n),d=function(){l(null),eT(),u(""),a(void 0)},v=function(e){if(!e){d();return}try{var t=H.default(e),n=t.exp,r=w(t,["exp"]);eE(e),u("Bearer ".concat(e)),l(r)}catch(e){console.error("Invalid token, clearing token from local storage","error:",e),d()}};q.useEffect(function(){if(!c&&ej()){v(ej());return}},[]);var p=!!i;return n&&!n.requireLogin?{data:n,user:null,isReady:f,isAuthenticated:!0,accessToken:"",logout:function(){},setAccessToken:function(){}}:{data:n,user:c,isAuthenticated:p,isReady:f,accessToken:i,logout:d,setAccessToken:v}};var eA=/*#__PURE__*/function(e){d(n,e);var t=A(n);function n(e,r){u(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}(P(Error)),eC=/*#__PURE__*/function(){function e(t,n,r){u(this,e);this.httpEndpoint=t;this.on401=n;this.onError=r}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 u=this;return i(function(){var i,a,s,c,l;return C(this,function(f){switch(f.label){case 0:f.trys.push([0,4,,5]);i={};n&&(i.Authorization=u.checkToken(n));v(r,FormData)?a=r:(i["Content-Type"]="application/json",a=r?JSON.stringify(r):null);return[4,fetch(u.buildEndpoint(t),{method:e,headers:i,signal:o,body:a})];case 1:s=f.sent();if(!!s.ok)return[3,3];return[4,s.json()];case 2:c=f.sent();throw s.status===401&&u.on401&&(eT(),u.on401()),new eA(s.statusText,c.detail);case 3:return[2,s];case 4:l=f.sent();throw v(l,eA)&&u.onError&&u.onError(l),console.error(l),l;case 5:return[2]}})})()}},{key:"get",value:function e(e,t){var n=this;return i(function(){return C(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 C(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 C(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 C(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 C(this,function(o){switch(o.label){case 0:return[4,r.fetch("DELETE",e,n,t)];case 1:return[2,o.sent()]}})})()}}]);return e}(),eD=/*#__PURE__*/function(e){d(n,e);var t=A(n);function n(){u(this,n);return t.apply(this,arguments)}c(n,[{key:"headerAuth",value:function e(){var e=this;return i(function(){return C(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 C(this,function(n){switch(n.label){case 0:return[4,t.post("/login",e)];case 1:return[2,n.sent().json()]}})})()}},{key:"getGeneration",value:function e(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0,r=arguments.length>3?arguments[3]:void 0,o=arguments.length>4?arguments[4]:void 0;var u=this;return i(function(){var i,a,s,c;return C(this,function(l){switch(l.label){case 0:s={userEnv:t};e.type==="CHAT"?s.chatGeneration=e:s.completionGeneration=e;return[4,u.post("/generation",s,r,n.signal)];case 1:c=(a=l.sent())===null||a===void 0?void 0:(i=a.body)===null||i===void 0?void 0:i.getReader();return[2,new ReadableStream({start:function e(e){function t(){c.read().then(function(n){var r=n.done,i=n.value;if(r){e.close(),o&&o(r,"");return}var u=new TextDecoder("utf-8").decode(i);o&&o(r,u),e.enqueue(i),t()}).catch(function(t){e.close(),o&&o(!0,""),console.error(t)})}t()}})]}})})()}},{key:"setFeedback",value:function e(e,t){var n=this;return i(function(){return C(this,function(r){switch(r.label){case 0:return[4,n.put("/feedback",{feedback:e},t)];case 1:return[2,r.sent().json()]}})})()}},{key:"listThreads",value:function e(e,t,n){var r=this;return i(function(){return C(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 C(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,u=new Promise(function(u,a){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);u(e)}else a("Upload failed")},i.onerror=function(){a("Upload error")},i.send(s)});return{xhr:i,promise:u}}},{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}(eC);Object.defineProperty(exports,"Socket",{enumerable:true,get:function e(){return U.Socket}});exports.APIBase=eC;exports.ChainlitAPI=eD;exports.ClientError=eA;exports.accessTokenState=ec;exports.actionState=$;exports.addMessage=eh;exports.addMessageToParent=eb;exports.askUserState=et;exports.avatarState=eu;exports.chatProfileState=N;exports.chatSettingsDefaultValueSelector=er;exports.chatSettingsInputsState=en;exports.chatSettingsValueState=eo;exports.deleteMessageById=em;exports.elementState=ei;exports.fetcher=eI;exports.firstUserInteraction=es;exports.hasMessageById=eg;exports.isLastMessage=ep;exports.loadingState=ee;exports.messagesState=Q;exports.nestMessages=ev;exports.sessionIdState=W;exports.sessionState=Y;exports.tasklistState=ea;exports.threadHistoryState=ef;exports.threadIdToResumeState=J;exports.tokenCountState=Z;exports.updateMessageById=eS;exports.updateMessageContentById=ek;exports.useApi=eP;exports.useAuth=e_;exports.useChatData=ed;exports.useChatInteract=ew;exports.useChatMessages=eR;exports.useChatSession=ex;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","chatSettingsInputsState","chatSettingsDefaultValueSelector","form","input","chatSettingsValueState","elementState","avatarState","tasklistState","firstUserInteraction","accessTokenState","userState","threadHistoryState","setSelf","onSet","oldValue","timeGroupedThreads","useChatData","loading","elements","avatars","tasklists","actions","session","askUser","chatSettingsInputs","chatSettingsValue","chatSettingsDefaultValue","connected","disabled","useCallback","useResetRecoilState","useSetRecoilState","nestMessages","messages","nestedMessages","message","addMessage","isLastMessage","index","i","hasMessageById","updateMessageById","addMessageToParent","addIndentMessage","indent","newMessage","currentIndentation","nextMessages","msg","parentId","messageId","updatedMessage","deleteMessageById","updateMessageContentById","updatedContent","isSequence","useChatInteract","accessToken","sessionId","resetChatSettings","resetSessionId","resetChatSettingsValue","setFirstUserInteraction","setLoading","setMessages","setElements","setAvatars","setTasklists","setActions","setTokenCount","setIdToResume","clear","sendMessage","fileReferences","oldMessages","replyMessage","updateChatSettings","values","stopTask","callAction","action","socket","promise","resolve","reject","response","client","file","onProgress","useChatMessages","firstInteraction","debounce","useRecoilState","io","useChatSession","setSession","setAskUser","setChatSettingsInputs","chatProfile","setChatProfile","idToResume","_connect","userEnv","old","s","_","thread","step","e","interaction","id","token","spec","callback","inputs","element","remove","a","count","connect","disconnect","tokenKey","getToken","setToken","removeToken","jwt_decode","useEffect","useSWR","fetcher","endpoint","useApi","path","options","url","useAuth","apiClient","isLoading","setAccessToken","setThreadHistory","user","setUser","isReady","logout","saveAndSetToken","exp","User","isAuthenticated","ClientError","detail","APIBase","httpEndpoint","on401","onError","prefix","method","signal","headers","body","res","error","ChainlitAPI","generation","controller","tokenCb","payload","reader","push","done","value","string","err","feedback","pagination","filter","threadId","xhr","formData","event","percentage","queryParams","theme","provider","Socket"],"mappings":"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","sourcesContent":["import { useRecoilValue } from 'recoil';\n\nimport {\n actionState,\n askUserState,\n avatarState,\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}\n\nconst useChatData = () => {\n const loading = useRecoilValue(loadingState);\n const elements = useRecoilValue(elementState);\n const avatars = useRecoilValue(avatarState);\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 avatars,\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 IAvatarElement,\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 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 avatarState = atom<IAvatarElement[]>({\n key: 'AvatarElements',\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","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 avatarState,\n chatSettingsInputsState,\n chatSettingsValueState,\n elementState,\n firstUserInteraction,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\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 setAvatars = useSetRecoilState(avatarState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const setIdToResume = useSetRecoilState(threadIdToResumeState);\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 setAvatars([]);\n setTasklists([]);\n setActions([]);\n setTokenCount(0);\n resetChatSettings();\n resetChatSettingsValue();\n }, [session]);\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 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 setLoading(false);\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 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 if (hasMessageById(messages, message.id)) {\n return updateMessageById(messages, message.id, message);\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 hasMessageById = (messages: IStep[], messageId: string) => {\n for (const message of messages) {\n if (isEqual(message.id, messageId)) {\n return true;\n } else if (message.steps && message.steps.length > 0) {\n if (hasMessageById(message.steps, messageId)) {\n return true;\n }\n }\n }\n return false;\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): 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 if ('content' in msg && msg.content !== undefined) {\n if (isSequence) {\n msg.content = updatedContent;\n } else {\n msg.content += updatedContent;\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 );\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 { firstUserInteraction, messagesState } from './state';\n\nconst useChatMessages = () => {\n const messages = useRecoilValue(messagesState);\n const firstInteraction = useRecoilValue(firstUserInteraction);\n\n return {\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 avatarState,\n chatProfileState,\n chatSettingsInputsState,\n chatSettingsValueState,\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 IAvatarElement,\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 setElements = useSetRecoilState(elementState);\n const setAvatars = useSetRecoilState(avatarState);\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\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 socket = io(client.httpEndpoint, {\n path: '/ws/socket.io',\n extraHeaders: {\n Authorization: accessToken || '',\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 }\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 setAvatars(\n (elements as IAvatarElement[]).filter((e) => e.type === 'avatar')\n );\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('first_interaction', (interaction: string) => {\n setFirstUserInteraction(interaction);\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('stream_token', ({ id, token, isSequence }: IToken) => {\n setMessages((oldMessages) =>\n updateMessageContentById(oldMessages, id, token, isSequence)\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('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(\n element.chainlitKey,\n sessionId,\n accessToken\n );\n }\n\n if (element.type === 'avatar') {\n setAvatars((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 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 setAvatars((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 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 = () => {\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 { IGeneration, 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 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 getGeneration(\n generation: IGeneration,\n userEnv = {},\n controller: AbortController,\n accessToken?: string,\n tokenCb?: (done: boolean, token: string) => void\n ) {\n const payload = { userEnv };\n if (generation.type === 'CHAT') {\n payload['chatGeneration'] = generation;\n } else {\n payload['completionGeneration'] = generation;\n }\n const response = await this.post(\n `/generation`,\n payload,\n accessToken,\n controller.signal\n );\n\n const reader = response?.body?.getReader();\n\n const stream = new ReadableStream({\n start(controller) {\n function push() {\n reader!\n .read()\n .then(({ done, value }) => {\n if (done) {\n controller.close();\n tokenCb && tokenCb(done, '');\n return;\n }\n const string = new TextDecoder('utf-8').decode(value);\n tokenCb && tokenCb(done, string);\n controller.enqueue(value);\n push();\n })\n .catch((err) => {\n controller.close();\n tokenCb && tokenCb(true, '');\n console.error(err);\n });\n }\n push();\n }\n });\n\n return stream;\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 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, accessToken?: string) {\n let queryParams = `?session_id=${sessionId}`;\n if (accessToken) {\n if (accessToken.startsWith('Bearer ')) {\n accessToken = accessToken.slice(7);\n }\n queryParams += `&token=${accessToken}`;\n }\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/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","chatSettingsInputsState","chatSettingsDefaultValueSelector","form","input","chatSettingsValueState","elementState","avatarState","tasklistState","firstUserInteraction","accessTokenState","userState","threadHistoryState","setSelf","onSet","oldValue","timeGroupedThreads","useChatData","loading","elements","avatars","tasklists","actions","session","askUser","chatSettingsInputs","chatSettingsValue","chatSettingsDefaultValue","connected","disabled","useCallback","useResetRecoilState","useSetRecoilState","nestMessages","messages","nestedMessages","message","addMessage","isLastMessage","index","i","hasMessageById","updateMessageById","addMessageToParent","addIndentMessage","indent","newMessage","currentIndentation","nextMessages","msg","parentId","messageId","updatedMessage","deleteMessageById","updateMessageContentById","updatedContent","isSequence","useChatInteract","accessToken","sessionId","resetChatSettings","resetSessionId","resetChatSettingsValue","setFirstUserInteraction","setLoading","setMessages","setElements","setAvatars","setTasklists","setActions","setTokenCount","setIdToResume","clear","sendMessage","fileReferences","oldMessages","replyMessage","updateChatSettings","values","stopTask","callAction","action","socket","promise","resolve","reject","response","client","file","onProgress","useChatMessages","firstInteraction","debounce","useRecoilState","io","useChatSession","setSession","setAskUser","setChatSettingsInputs","chatProfile","setChatProfile","idToResume","_connect","userEnv","old","s","_","thread","step","e","interaction","id","token","spec","callback","inputs","element","remove","a","count","connect","disconnect","tokenKey","getToken","setToken","removeToken","jwt_decode","useEffect","useSWR","fetcher","endpoint","useApi","path","options","url","useAuth","apiClient","isLoading","setAccessToken","setThreadHistory","user","setUser","isReady","logout","saveAndSetToken","exp","User","isAuthenticated","ClientError","detail","APIBase","httpEndpoint","on401","onError","prefix","method","signal","headers","body","res","error","ChainlitAPI","generation","controller","tokenCb","payload","reader","push","done","value","string","err","feedback","pagination","filter","threadId","xhr","formData","event","percentage","queryParams","theme","provider","Socket"],"mappings":"AAAA,OAAS,kBAAAA,MAAsB,SCA/B,OAAS,WAAAC,OAAe,SACxB,OAAS,gBAAAC,GAAc,QAAAC,EAAM,YAAAC,OAAgB,SAE7C,OAAS,MAAMC,OAAc,OCDtB,IAAMC,GAAeC,GAAoB,CAC9C,IAAMC,EAA4C,CAAC,EAE7CC,EAAQ,IAAI,KACZC,EAAY,IAAI,KACtBA,EAAU,QAAQD,EAAM,QAAQ,EAAI,CAAC,EACrC,IAAME,EAAe,IAAI,KACzBA,EAAa,QAAQF,EAAM,QAAQ,EAAI,CAAC,EACxC,IAAMG,EAAgB,IAAI,KAC1B,OAAAA,EAAc,QAAQH,EAAM,QAAQ,EAAI,EAAE,EAE1CF,EAAK,QAASM,GAAS,CACrB,IAAMC,EAAY,IAAI,KAAKD,EAAK,SAAS,EACnCE,EAAUD,EAAU,aAAa,IAAML,EAAM,aAAa,EAC1DO,EAAcF,EAAU,aAAa,IAAMJ,EAAU,aAAa,EAClEO,EAAcH,GAAaH,EAC3BO,EAAeJ,GAAaF,EAE9BO,EAEAJ,EACFI,EAAW,QACFH,EACTG,EAAW,YACFF,EACTE,EAAW,kBACFD,EACTC,EAAW,mBAOXA,EALkBL,EAAU,eAAe,UAAW,CACpD,MAAO,OACP,KAAM,SACR,CAAC,EAEoB,MAAM,GAAG,EAAE,MAAM,EAAG,CAAC,EAAE,KAAK,GAAG,EAGjDN,EAAYW,CAAQ,IACvBX,EAAYW,CAAQ,EAAI,CAAC,GAG3BX,EAAYW,CAAQ,EAAE,KAAKN,CAAI,CACjC,CAAC,EAEML,CACT,EDzBO,IAAMY,EAAwBjB,EAAyB,CAC5D,IAAK,mBACL,QAAS,MACX,CAAC,EAEYkB,GAAmBlB,EAAyB,CACvD,IAAK,cACL,QAAS,MACX,CAAC,EAEKmB,GAAgBnB,EAAa,CACjC,IAAK,YACL,QAASE,GAAO,CAClB,CAAC,EAEYkB,EAAiBnB,GAAS,CACrC,IAAK,oBACL,IAAK,CAAC,CAAE,IAAAoB,CAAI,IAAMA,EAAIF,EAAa,EACnC,IAAK,CAAC,CAAE,IAAAG,CAAI,EAAGC,IACbD,EAAIH,GAAeI,aAAoBxB,GAAeG,GAAO,EAAIqB,CAAQ,CAC7E,CAAC,EAEYC,EAAexB,EAA2B,CACrD,IAAK,UACL,2BAA4B,GAC5B,QAAS,MACX,CAAC,EAEYyB,EAAczB,EAAgB,CACzC,IAAK,UACL,QAAS,CAAC,CACZ,CAAC,EAEY0B,EAAgB1B,EAAc,CACzC,IAAK,WACL,2BAA4B,GAC5B,QAAS,CAAC,CACZ,CAAC,EAEY2B,EAAkB3B,EAAa,CAC1C,IAAK,aACL,QAAS,CACX,CAAC,EAEY4B,EAAe5B,EAAc,CACxC,IAAK,UACL,QAAS,EACX,CAAC,EAEY6B,EAAe7B,EAAuB,CACjD,IAAK,UACL,QAAS,MACX,CAAC,EAEY8B,EAA0B9B,EAAU,CAC/C,IAAK,eACL,QAAS,CAAC,CACZ,CAAC,EAEY+B,GAAmC9B,GAAS,CACvD,IAAK,4BACL,IAAK,CAAC,CAAE,IAAAoB,CAAI,IACWA,EAAIS,CAAuB,EAC5B,OAClB,CAACE,EAA8BC,KAC5BD,EAAKC,EAAM,EAAE,EAAIA,EAAM,QAAUD,GAEpC,CAAC,CACH,CAEJ,CAAC,EAEYE,EAAyBlC,EAAK,CACzC,IAAK,oBACL,QAAS+B,EACX,CAAC,EAEYI,EAAenC,EAAwB,CAClD,IAAK,kBACL,QAAS,CAAC,CACZ,CAAC,EAEYoC,EAAcpC,EAAuB,CAChD,IAAK,iBACL,QAAS,CAAC,CACZ,CAAC,EAEYqC,EAAgBrC,EAAyB,CACpD,IAAK,mBACL,QAAS,CAAC,CACZ,CAAC,EAEYsC,EAAuBtC,EAAyB,CAC3D,IAAK,uBACL,QAAS,MACX,CAAC,EAEYuC,EAAmBvC,EAAyB,CACvD,IAAK,cACL,QAAS,MACX,CAAC,EAEYwC,GAAYxC,EAAmB,CAC1C,IAAK,OACL,QAAS,IACX,CAAC,EAEYyC,GAAqBzC,EAAgC,CAChE,IAAK,gBACL,QAAS,CACP,QAAS,OACT,gBAAiB,OACjB,mBAAoB,OACpB,SAAU,MACZ,EACA,QAAS,CACP,CAAC,CAAE,QAAA0C,EAAS,MAAAC,CAAM,IAAoC,CACpDA,EACE,CACEpB,EACAqB,IACG,CACH,IAAIC,EAAqBtB,GAAU,mBAEjCA,GAAU,SACV,CAACzB,GAAQyB,EAAS,QAASqB,GAAU,kBAAkB,IAEvDC,EAAqB1C,GAAYoB,EAAS,OAAO,GAGnDmB,EAAQ,CACN,GAAGnB,EACH,mBAAAsB,CACF,CAAC,CACH,CACF,CACF,CACF,CACF,CAAC,ED3ID,IAAMC,GAAc,IAAM,CACxB,IAAMC,EAAUlD,EAAe+B,CAAY,EACrCoB,EAAWnD,EAAesC,CAAY,EACtCc,EAAUpD,EAAeuC,CAAW,EACpCc,EAAYrD,EAAewC,CAAa,EACxCc,EAAUtD,EAAe4B,CAAW,EACpC2B,EAAUvD,EAAe2B,CAAY,EACrC6B,EAAUxD,EAAegC,CAAY,EACrCyB,EAAqBzD,EAAeiC,CAAuB,EAC3DyB,EAAoB1D,EAAeqC,CAAsB,EACzDsB,EAA2B3D,EAC/BkC,EACF,EAEM0B,EAAYL,GAAS,OAAO,WAAa,CAACA,GAAS,MACnDM,EACJ,CAACD,GACDV,GACAM,GAAS,KAAK,OAAS,QACvBA,GAAS,KAAK,OAAS,SAEzB,MAAO,CACL,QAAAF,EACA,QAAAE,EACA,QAAAJ,EACA,yBAAAO,EACA,mBAAAF,EACA,kBAAAC,EACA,UAAAE,EACA,SAAAC,EACA,SAAAV,EACA,MAAOI,GAAS,MAChB,QAAAL,EACA,UAAAG,CACF,CACF,EGxDA,OAAS,eAAAS,MAAmB,QAC5B,OAAS,kBAAA9D,EAAgB,uBAAA+D,GAAqB,qBAAAC,MAAyB,SCDvE,OAAS,WAAA/D,MAAe,SAIxB,IAAMgE,GAAgBC,GAA+B,CACnD,IAAIC,EAA0B,CAAC,EAE/B,QAAWC,KAAWF,EACpBC,EAAiBE,EAAWF,EAAgBC,CAAO,EAGrD,OAAOD,CACT,EAEMG,GAAgB,CAACJ,EAAmBK,IAAkB,CAC1D,GAAIL,EAAS,OAAS,IAAMK,EAC1B,MAAO,GAGT,QAASC,EAAID,EAAQ,EAAGC,EAAIN,EAAS,OAAQM,IAC3C,GAAI,CAAAN,EAASM,CAAC,EAAE,UAGd,MAAO,GAIX,MAAO,EACT,EAIMH,EAAa,CAACH,EAAmBE,IACjCK,EAAeP,EAAUE,EAAQ,EAAE,EAC9BM,EAAkBR,EAAUE,EAAQ,GAAIA,CAAO,EAC7C,aAAcA,GAAWA,EAAQ,SACnCO,GAAmBT,EAAUE,EAAQ,SAAUA,CAAO,EACpD,WAAYA,GAAWA,EAAQ,QAAUA,EAAQ,OAAS,EAC5DQ,GAAiBV,EAAUE,EAAQ,OAAQA,CAAO,EAElD,CAAC,GAAGF,EAAUE,CAAO,EAI1BQ,GAAmB,CACvBV,EACAW,EACAC,EACAC,EAA6B,IACjB,CACZ,IAAMC,EAAe,CAAC,GAAGd,CAAQ,EAEjC,GAAIc,EAAa,SAAW,EAC1B,MAAO,CAAC,GAAGA,EAAcF,CAAU,EAC9B,CACL,IAAMP,EAAQS,EAAa,OAAS,EAC9BC,EAAMD,EAAaT,CAAK,EAG9B,OAFAU,EAAI,MAAQA,EAAI,OAAS,CAAC,EAEtBF,EAAqB,IAAMF,GAC7BI,EAAI,MAAQ,CAAC,GAAGA,EAAI,MAAOH,CAAU,EACrCE,EAAaT,CAAK,EAAI,CAAE,GAAGU,CAAI,EAExBD,IAEPC,EAAI,MAAQL,GACVK,EAAI,MACJJ,EACAC,EACAC,EAAqB,CACvB,EAEAC,EAAaT,CAAK,EAAI,CAAE,GAAGU,CAAI,EACxBD,EAEX,CACF,EAEML,GAAqB,CACzBT,EACAgB,EACAJ,IACY,CACZ,IAAME,EAAe,CAAC,GAAGd,CAAQ,EAEjC,QAASK,EAAQ,EAAGA,EAAQS,EAAa,OAAQT,IAAS,CACxD,IAAMU,EAAMD,EAAaT,CAAK,EAE1BtE,EAAQgF,EAAI,GAAIC,CAAQ,GAC1BD,EAAI,MAAQA,EAAI,MAAQ,CAAC,GAAGA,EAAI,MAAOH,CAAU,EAAI,CAACA,CAAU,EAChEE,EAAaT,CAAK,EAAI,CAAE,GAAGU,CAAI,GACtBR,EAAeO,EAAcE,CAAQ,GAAKD,EAAI,QACvDA,EAAI,MAAQN,GAAmBM,EAAI,MAAOC,EAAUJ,CAAU,EAC9DE,EAAaT,CAAK,EAAI,CAAE,GAAGU,CAAI,EAEnC,CAEA,OAAOD,CACT,EAEMP,EAAiB,CAACP,EAAmBiB,IAAsB,CAC/D,QAAWf,KAAWF,EAAU,CAC9B,GAAIjE,EAAQmE,EAAQ,GAAIe,CAAS,EAC/B,MAAO,GACF,GAAIf,EAAQ,OAASA,EAAQ,MAAM,OAAS,GAC7CK,EAAeL,EAAQ,MAAOe,CAAS,EACzC,MAAO,EAGb,CACA,MAAO,EACT,EAEMT,EAAoB,CACxBR,EACAiB,EACAC,IACY,CACZ,IAAMJ,EAAe,CAAC,GAAGd,CAAQ,EAEjC,QAASK,EAAQ,EAAGA,EAAQS,EAAa,OAAQT,IAAS,CACxD,IAAMU,EAAMD,EAAaT,CAAK,EAE1BtE,EAAQgF,EAAI,GAAIE,CAAS,EAC3BH,EAAaT,CAAK,EAAI,CAAE,MAAOU,EAAI,MAAO,GAAGG,CAAe,EACnDX,EAAeO,EAAcG,CAAS,GAAKF,EAAI,QACxDA,EAAI,MAAQP,EAAkBO,EAAI,MAAOE,EAAWC,CAAc,EAClEJ,EAAaT,CAAK,EAAI,CAAE,GAAGU,CAAI,EAEnC,CAEA,OAAOD,CACT,EAEMK,GAAoB,CAACnB,EAAmBiB,IAAsB,CAClE,IAAIH,EAAe,CAAC,GAAGd,CAAQ,EAE/B,QAASK,EAAQ,EAAGA,EAAQS,EAAa,OAAQT,IAAS,CACxD,IAAMU,EAAMD,EAAaT,CAAK,EAE1BU,EAAI,KAAOE,EACbH,EAAe,CACb,GAAGA,EAAa,MAAM,EAAGT,CAAK,EAC9B,GAAGS,EAAa,MAAMT,EAAQ,CAAC,CACjC,EACSE,EAAeO,EAAcG,CAAS,GAAKF,EAAI,QACxDA,EAAI,MAAQI,GAAkBJ,EAAI,MAAOE,CAAS,EAClDH,EAAaT,CAAK,EAAI,CAAE,GAAGU,CAAI,EAEnC,CAEA,OAAOD,CACT,EAEMM,GAA2B,CAC/BpB,EACAiB,EACAI,EACAC,IACY,CACZ,IAAMR,EAAe,CAAC,GAAGd,CAAQ,EAEjC,QAASK,EAAQ,EAAGA,EAAQS,EAAa,OAAQT,IAAS,CACxD,IAAMU,EAAMD,EAAaT,CAAK,EAE1BtE,EAAQgF,EAAI,GAAIE,CAAS,GACvB,YAAaF,GAAOA,EAAI,UAAY,OAClCO,EACFP,EAAI,QAAUM,EAEdN,EAAI,SAAWM,EAGb,WAAYN,GAAOA,EAAI,SAAW,SAChCO,EACFP,EAAI,OAASM,EAEbN,EAAI,QAAUM,GAKpBP,EAAaT,CAAK,EAAI,CAAE,GAAGU,CAAI,GACtBA,EAAI,QACbA,EAAI,MAAQK,GACVL,EAAI,MACJE,EACAI,EACAC,CACF,EACAR,EAAaT,CAAK,EAAI,CAAE,GAAGU,CAAI,EAEnC,CAEA,OAAOD,CACT,ED3KA,IAAMS,GAAkB,IAAM,CAC5B,IAAMC,EAAc1F,EAAe0C,CAAgB,EAC7Ca,EAAUvD,EAAe2B,CAAY,EACrC6B,EAAUxD,EAAegC,CAAY,EACrC2D,EAAY3F,EAAeuB,CAAc,EAEzCqE,EAAoB7B,GAAoB9B,CAAuB,EAC/D4D,EAAiB9B,GAAoBxC,CAAc,EACnDuE,EAAyB/B,GAAoB1B,CAAsB,EAEnE0D,EAA0B/B,EAAkBvB,CAAoB,EAChEuD,EAAahC,EAAkBjC,CAAY,EAC3CkE,EAAcjC,EAAkBnC,CAAa,EAC7CqE,EAAclC,EAAkB1B,CAAY,EAC5C6D,EAAanC,EAAkBzB,CAAW,EAC1C6D,EAAepC,EAAkBxB,CAAa,EAC9C6D,EAAarC,EAAkBpC,CAAW,EAC1C0E,EAAgBtC,EAAkBlC,CAAe,EACjDyE,EAAgBvC,EAAkB5C,CAAqB,EAEvDoF,EAAQ1C,EAAY,IAAM,CAC9BP,GAAS,OAAO,KAAK,eAAe,EACpCA,GAAS,OAAO,WAAW,EAC3BgD,EAAc,MAAS,EACvBV,EAAe,EACfE,EAAwB,MAAS,EACjCE,EAAY,CAAC,CAAC,EACdC,EAAY,CAAC,CAAC,EACdC,EAAW,CAAC,CAAC,EACbC,EAAa,CAAC,CAAC,EACfC,EAAW,CAAC,CAAC,EACbC,EAAc,CAAC,EACfV,EAAkB,EAClBE,EAAuB,CACzB,EAAG,CAACvC,CAAO,CAAC,EAENkD,EAAc3C,EAClB,CAACM,EAAgBsC,IAAgC,CAC/CT,EAAaU,GAAgBtC,EAAWsC,EAAavC,CAAO,CAAC,EAE7Db,GAAS,OAAO,KAAK,aAAc,CAAE,QAAAa,EAAS,eAAAsC,CAAe,CAAC,CAChE,EACA,CAACnD,GAAS,MAAM,CAClB,EAEMqD,EAAe9C,EAClBM,GAAmB,CACdZ,IACFyC,EAAaU,GAAgBtC,EAAWsC,EAAavC,CAAO,CAAC,EAC7DZ,EAAQ,SAASY,CAAO,EAE5B,EACA,CAACZ,CAAO,CACV,EAEMqD,EAAqB/C,EACxBgD,GAAmB,CAClBvD,GAAS,OAAO,KAAK,uBAAwBuD,CAAM,CACrD,EACA,CAACvD,GAAS,MAAM,CAClB,EAEMwD,EAAWjD,EAAY,IAAM,CACjCkC,EAAW,EAAK,EAChBzC,GAAS,OAAO,KAAK,MAAM,CAC7B,EAAG,CAACA,GAAS,MAAM,CAAC,EAEdyD,EAAalD,EAChBmD,GAAoB,CACnB,IAAMC,EAAS3D,GAAS,OACxB,GAAI,CAAC2D,EAAQ,OAEb,IAAMC,EAAU,IAAI,QAIjB,CAACC,EAASC,IAAW,CACtBH,EAAO,KAAK,kBAAoBI,IAAa,CACvCA,GAAS,OACXF,EAAQE,EAAQ,EAEhBD,EAAOC,EAAQ,CAEnB,CAAC,CACH,CAAC,EAED,OAAAJ,EAAO,KAAK,cAAeD,CAAM,EAE1BE,CACT,EACA,CAAC5D,GAAS,MAAM,CAClB,EAaA,MAAO,CACL,WAZiBO,EACjB,CACEyD,EACAC,EACAC,IAEOF,EAAO,WAAWC,EAAMC,EAAY9B,EAAWD,CAAW,EAEnE,CAACC,EAAWD,CAAW,CACzB,EAIE,WAAAsB,EACA,MAAAR,EACA,aAAAI,EACA,YAAAH,EACA,SAAAM,EACA,cAAAR,EACA,mBAAAM,CACF,CACF,EE1IA,OAAS,kBAAA7G,OAAsB,SAI/B,IAAM0H,GAAkB,IAAM,CAC5B,IAAMxD,EAAWlE,GAAe6B,CAAa,EACvC8F,EAAmB3H,GAAeyC,CAAoB,EAE5D,MAAO,CACL,SAAAyB,EACA,iBAAAyD,CACF,CACF,ECZA,OAAS,YAAAC,OAAgB,SACzB,OAAS,eAAA9D,OAAmB,QAC5B,OACE,kBAAA+D,GACA,kBAAA7H,GACA,uBAAA+D,GACA,qBAAAC,MACK,SACP,OAAO8D,OAAQ,mBAqCf,IAAMC,GAAiB,IAAM,CAC3B,IAAMpC,EAAY3F,GAAeuB,CAAc,EAEzC,CAACgC,EAASyE,CAAU,EAAIH,GAAelG,CAAY,EAEnDmE,EAAyB/B,GAAoB1B,CAAsB,EACnE0D,EAA0B/B,EAAkBvB,CAAoB,EAChEuD,EAAahC,EAAkBjC,CAAY,EAC3CkE,EAAcjC,EAAkBnC,CAAa,EAC7CoG,EAAajE,EAAkBhC,CAAY,EAC3CkE,EAAclC,EAAkB1B,CAAY,EAC5C6D,EAAanC,EAAkBzB,CAAW,EAC1C6D,EAAepC,EAAkBxB,CAAa,EAC9C6D,EAAarC,EAAkBpC,CAAW,EAC1CsG,EAAwBlE,EAAkB/B,CAAuB,EACjEqE,EAAgBtC,EAAkBlC,CAAe,EACjD,CAACqG,EAAaC,CAAc,EAAIP,GAAexG,EAAgB,EAC/DgH,EAAarI,GAAeoB,CAAqB,EAEjDkH,EAAWxE,GACf,CAAC,CACC,OAAAyD,EACA,QAAAgB,EACA,YAAA7C,EACF,IAIM,CACJ,IAAMwB,EAASY,GAAGP,EAAO,aAAc,CACrC,KAAM,gBACN,aAAc,CACZ,cAAe7B,IAAe,GAC9B,wBAAyBC,EACzB,uBAAwB0C,GAAc,GACtC,WAAY,KAAK,UAAUE,CAAO,EAClC,0BAA2BJ,GAAe,EAC5C,CACF,CAAC,EACDH,EAAYQ,IACVA,GAAK,QAAQ,mBAAmB,EAChCA,GAAK,QAAQ,MAAM,EACZ,CACL,OAAAtB,CACF,EACD,EAEDA,EAAO,GAAG,UAAW,IAAM,CACzBA,EAAO,KAAK,uBAAuB,EACnCc,EAAYS,IAAO,CAAE,GAAGA,EAAI,MAAO,EAAM,EAAE,CAC7C,CAAC,EAEDvB,EAAO,GAAG,gBAAkBwB,GAAM,CAChCV,EAAYS,IAAO,CAAE,GAAGA,EAAI,MAAO,EAAK,EAAE,CAC5C,CAAC,EAEDvB,EAAO,GAAG,aAAc,IAAM,CAC5BlB,EAAW,EAAI,CACjB,CAAC,EAEDkB,EAAO,GAAG,WAAY,IAAM,CAC1BlB,EAAW,EAAK,CAClB,CAAC,EAEDkB,EAAO,GAAG,SAAU,IAAM,CACxBA,EAAO,KAAK,eAAe,EAC3B,OAAO,SAAS,OAAO,CACzB,CAAC,EAEDA,EAAO,GAAG,gBAAkByB,GAAoB,CAC9C,IAAIzE,EAAoB,CAAC,EACzB,QAAW0E,KAAQD,EAAO,MACxBzE,EAAWG,EAAWH,EAAU0E,CAAI,EAElCD,EAAO,UAAU,cACnBP,EAAeO,EAAO,UAAU,YAAY,EAE9C1C,EAAY/B,CAAQ,EACpB,IAAMf,EAAWwF,EAAO,UAAY,CAAC,EACrCxC,EACGhD,EAA8B,OAAQ0F,GAAMA,EAAE,OAAS,QAAQ,CAClE,EACAzC,EACGjD,EAAgC,OAAQ0F,GAAMA,EAAE,OAAS,UAAU,CACtE,EACA3C,EACG/C,EAA+B,OAC7B0F,GAAM,CAAC,SAAU,UAAU,EAAE,QAAQA,EAAE,IAAI,IAAM,EACpD,CACF,CACF,CAAC,EAED3B,EAAO,GAAG,cAAgB9C,GAAmB,CAC3C6B,EAAaU,GAAgBtC,EAAWsC,EAAavC,CAAO,CAAC,CAC/D,CAAC,EAED8C,EAAO,GAAG,oBAAsB4B,GAAwB,CACtD/C,EAAwB+C,CAAW,CACrC,CAAC,EAED5B,EAAO,GAAG,iBAAmB9C,GAAmB,CAC9C6B,EAAaU,GACXjC,EAAkBiC,EAAavC,EAAQ,GAAIA,CAAO,CACpD,CACF,CAAC,EAED8C,EAAO,GAAG,iBAAmB9C,GAAmB,CAC9C6B,EAAaU,GACXtB,GAAkBsB,EAAavC,EAAQ,EAAE,CAC3C,CACF,CAAC,EAED8C,EAAO,GAAG,eAAiB9C,GAAmB,CAC5C6B,EAAaU,GAAgBtC,EAAWsC,EAAavC,CAAO,CAAC,CAC/D,CAAC,EAED8C,EAAO,GAAG,eAAgB,CAAC,CAAE,GAAA6B,EAAI,MAAAC,EAAO,WAAAxD,CAAW,IAAc,CAC/DS,EAAaU,GACXrB,GAAyBqB,EAAaoC,EAAIC,EAAOxD,CAAU,CAC7D,CACF,CAAC,EAED0B,EAAO,GAAG,MAAO,CAAC,CAAE,IAAAjC,EAAK,KAAAgE,CAAK,EAAGC,IAAa,CAC5CjB,EAAW,CAAE,KAAAgB,EAAM,SAAAC,CAAS,CAAC,EAC7BjD,EAAaU,GAAgBtC,EAAWsC,EAAa1B,CAAG,CAAC,EAEzDe,EAAW,EAAK,CAClB,CAAC,EAEDkB,EAAO,GAAG,cAAe,IAAM,CAC7Be,EAAW,MAAS,EACpBjC,EAAW,EAAK,CAClB,CAAC,EAEDkB,EAAO,GAAG,YAAa,IAAM,CAC3Be,EAAW,MAAS,CACtB,CAAC,EAEDf,EAAO,GAAG,gBAAkBiC,GAAgB,CAC1CjB,EAAsBiB,CAAM,EAC5BrD,EAAuB,CACzB,CAAC,EAEDoB,EAAO,GAAG,UAAYkC,GAAsB,CACtC,CAACA,EAAQ,KAAOA,EAAQ,cAC1BA,EAAQ,IAAM7B,EAAO,cAAc6B,EAAQ,YAAazD,CAAS,GAG/DyD,EAAQ,OAAS,SACnBjD,EAAYqC,GAAQ,CAClB,IAAMjE,EAAQiE,EAAI,UAAWK,GAAMA,EAAE,KAAOO,EAAQ,EAAE,EACtD,OAAI7E,IAAU,GACL,CAAC,GAAGiE,EAAKY,CAAO,EAEhB,CAAC,GAAGZ,EAAI,MAAM,EAAGjE,CAAK,EAAG6E,EAAS,GAAGZ,EAAI,MAAMjE,EAAQ,CAAC,CAAC,CAEpE,CAAC,EACQ6E,EAAQ,OAAS,WAC1BhD,EAAcoC,GAAQ,CACpB,IAAMjE,EAAQiE,EAAI,UAAWK,GAAMA,EAAE,KAAOO,EAAQ,EAAE,EACtD,OAAI7E,IAAU,GACL,CAAC,GAAGiE,EAAKY,CAAO,EAEhB,CAAC,GAAGZ,EAAI,MAAM,EAAGjE,CAAK,EAAG6E,EAAS,GAAGZ,EAAI,MAAMjE,EAAQ,CAAC,CAAC,CAEpE,CAAC,EAED2B,EAAasC,GAAQ,CACnB,IAAMjE,EAAQiE,EAAI,UAAWK,GAAMA,EAAE,KAAOO,EAAQ,EAAE,EACtD,OAAI7E,IAAU,GACL,CAAC,GAAGiE,EAAKY,CAAO,EAEhB,CAAC,GAAGZ,EAAI,MAAM,EAAGjE,CAAK,EAAG6E,EAAS,GAAGZ,EAAI,MAAMjE,EAAQ,CAAC,CAAC,CAEpE,CAAC,CAEL,CAAC,EAED2C,EAAO,GAAG,iBAAmBmC,GAA2B,CACtDnD,EAAasC,GACJA,EAAI,OAAQK,GAAMA,EAAE,KAAOQ,EAAO,EAAE,CAC5C,EACDjD,EAAcoC,GACLA,EAAI,OAAQK,GAAMA,EAAE,KAAOQ,EAAO,EAAE,CAC5C,EACDlD,EAAYqC,GACHA,EAAI,OAAQK,GAAMA,EAAE,KAAOQ,EAAO,EAAE,CAC5C,CACH,CAAC,EAEDnC,EAAO,GAAG,SAAWD,GAAoB,CACvCZ,EAAYmC,GAAQ,CAAC,GAAGA,EAAKvB,CAAM,CAAC,CACtC,CAAC,EAEDC,EAAO,GAAG,gBAAkBD,GAAoB,CAC9CZ,EAAYmC,GAAQ,CAClB,IAAMjE,EAAQiE,EAAI,UAAWc,GAAMA,EAAE,KAAOrC,EAAO,EAAE,EACrD,OAAI1C,IAAU,GAAWiE,EAClB,CAAC,GAAGA,EAAI,MAAM,EAAGjE,CAAK,EAAG,GAAGiE,EAAI,MAAMjE,EAAQ,CAAC,CAAC,CACzD,CAAC,CACH,CAAC,EAED2C,EAAO,GAAG,cAAgBqC,GAAkB,CAC1CjD,EAAekC,GAAQA,EAAMe,CAAK,CACpC,CAAC,CACH,EACA,CAACvB,EAAYrC,EAAWwC,CAAW,CACrC,EAEMqB,EAAU1F,GAAY8D,GAASU,EAAU,GAAG,EAAG,CAACA,CAAQ,CAAC,EAEzDmB,EAAa3F,GAAY,IAAM,CAC/BP,GAAS,SACXA,EAAQ,OAAO,mBAAmB,EAClCA,EAAQ,OAAO,MAAM,EAEzB,EAAG,CAACA,CAAO,CAAC,EAEZ,MAAO,CACL,QAAAiG,EACA,WAAAC,EACA,QAAAlG,EACA,YAAA4E,EACA,WAAAE,EACA,eAAAD,CACF,CACF,EC/QA,IAAMsB,GAAW,QAEV,SAASC,IAAW,CACzB,GAAI,CACF,OAAO,aAAa,QAAQD,EAAQ,CACtC,MAAY,CACV,MACF,CACF,CAEO,SAASE,GAASZ,EAAe,CACtC,GAAI,CACF,OAAO,aAAa,QAAQU,GAAUV,CAAK,CAC7C,MAAY,CACV,MACF,CACF,CAEO,SAASa,GAAc,CAC5B,GAAI,CACF,OAAO,aAAa,WAAWH,EAAQ,CACzC,MAAY,CACV,MACF,CACF,CCxBA,OAAOI,OAAgB,aACvB,OAAS,aAAAC,OAAiB,QAC1B,OAAS,kBAAAlC,GAAgB,qBAAA7D,OAAyB,SCFlD,OAAS,kBAAAhE,OAAsB,SAG/B,OAAOgK,OAAkC,MAEzC,IAAMC,GAAU,MACd1C,EACA2C,EACAlB,KAEY,MAAMzB,EAAO,IAAI2C,EAAUlB,CAAK,IAEhC,KAAK,EAGnB,SAASmB,GACP5C,EACA6C,EACAC,EACA,CACA,IAAM3E,EAAc1F,GAAe0C,CAAgB,EAEnD,OAAOsH,GACLI,EAAO,CAACA,EAAM1E,CAAW,EAAI,KAC7B,CAAC,CAAC4E,EAAKtB,CAAK,IAAoCiB,GAAQ1C,EAAQ+C,EAAKtB,CAAK,EAC1EqB,CACF,CACF,CDjBO,IAAME,GAAWC,GAA2B,CACjD,GAAM,CAAE,KAAAjK,EAAM,UAAAkK,CAAU,EAAIN,GAKzBK,EAAW,cAAc,EACtB,CAAC9E,EAAagF,CAAc,EAAI7C,GAAenF,CAAgB,EAC/DiI,EAAmB3G,GAAkBpB,EAAkB,EACvD,CAACgI,EAAMC,CAAO,EAAIhD,GAAelF,EAAS,EAE1CmI,EAAU,CAAC,EAAE,CAACL,GAAalK,GAE3BwK,EAAS,IAAM,CACnBF,EAAQ,IAAI,EACZhB,EAAY,EACZa,EAAe,EAAE,EACjBC,EAAiB,MAAS,CAC5B,EAEMK,EAAmBhC,GAAqC,CAC5D,GAAI,CAACA,EAAO,CACV+B,EAAO,EACP,MACF,CACA,GAAI,CACF,GAAM,CAAE,IAAAE,EAAK,GAAGC,CAAK,EAAIpB,GAAWd,CAAK,EACzCY,GAASZ,CAAK,EACd0B,EAAe,UAAU1B,CAAK,EAAE,EAChC6B,EAAQK,CAAa,CACvB,OAASrC,EAAG,CACV,QAAQ,MACN,mDACA,SACAA,CACF,EACAkC,EAAO,CACT,CACF,EAEAhB,GAAU,IAAM,CACd,GAAI,CAACa,GAAQjB,GAAS,EAAG,CAEvBqB,EAAgBrB,GAAS,CAAC,EAC1B,MACF,CACF,EAAG,CAAC,CAAC,EAEL,IAAMwB,EAAkB,CAAC,CAACzF,EAE1B,OAAInF,GAAQ,CAACA,EAAK,aACT,CACL,KAAAA,EACA,KAAM,KACN,QAAAuK,EACA,gBAAiB,GACjB,YAAa,GACb,OAAQ,IAAM,CAAC,EACf,eAAgB,IAAM,CAAC,CACzB,EAGK,CACL,KAAAvK,EACA,KAAMqK,EACN,gBAAAO,EACA,QAAAL,EACA,YAAapF,EACb,OAAQqF,EACR,eAAgBC,CAClB,CACF,EE1DO,IAAMI,EAAN,cAA0B,KAAM,CAGrC,YAAYhH,EAAiBiH,EAAiB,CAC5C,MAAMjH,CAAO,EACb,KAAK,OAASiH,CAChB,CAEA,UAAW,CACT,OAAI,KAAK,OACA,GAAG,KAAK,OAAO,KAAK,KAAK,MAAM,GAE/B,KAAK,OAEhB,CACF,EAIaC,GAAN,KAAc,CACnB,YACSC,EACAC,EACAC,EACP,CAHO,kBAAAF,EACA,WAAAC,EACA,aAAAC,CACN,CAEH,cAAcrB,EAAc,CAC1B,OAAI,KAAK,aAAa,SAAS,GAAG,EAEzB,GAAG,KAAK,aAAa,MAAM,EAAG,EAAE,CAAC,GAAGA,CAAI,GAExC,GAAG,KAAK,YAAY,GAAGA,CAAI,EAEtC,CAEA,WAAWpB,EAAe,CACxB,IAAM0C,EAAS,UACf,OAAI1C,EAAM,WAAW0C,CAAM,EAClB1C,EAEA0C,EAAS1C,CAEpB,CAEA,MAAM,MACJ2C,EACAvB,EACApB,EACAzI,EACAqL,EACmB,CACnB,GAAI,CACF,IAAMC,EAA+D,CAAC,EAClE7C,IAAO6C,EAAQ,cAAmB,KAAK,WAAW7C,CAAK,GAE3D,IAAI8C,EAEAvL,aAAgB,SAClBuL,EAAOvL,GAEPsL,EAAQ,cAAc,EAAI,mBAC1BC,EAAOvL,EAAO,KAAK,UAAUA,CAAI,EAAI,MAGvC,IAAMwL,EAAM,MAAM,MAAM,KAAK,cAAc3B,CAAI,EAAG,CAChD,OAAAuB,EACA,QAAAE,EACA,OAAAD,EACA,KAAAE,CACF,CAAC,EAED,GAAI,CAACC,EAAI,GAAI,CACX,IAAMD,EAAO,MAAMC,EAAI,KAAK,EAC5B,MAAIA,EAAI,SAAW,KAAO,KAAK,QAC7BlC,EAAY,EACZ,KAAK,MAAM,GAEP,IAAIuB,EAAYW,EAAI,WAAYD,EAAK,MAAM,CACnD,CAEA,OAAOC,CACT,OAASC,EAAY,CACnB,MAAIA,aAAiBZ,GAAe,KAAK,SACvC,KAAK,QAAQY,CAAK,EAEpB,QAAQ,MAAMA,CAAK,EACbA,CACR,CACF,CAEA,MAAM,IAAI9B,EAAkBlB,EAAgB,CAC1C,OAAO,MAAM,KAAK,MAAM,MAAOkB,EAAUlB,CAAK,CAChD,CAEA,MAAM,KACJkB,EACA3J,EACAyI,EACA4C,EACA,CACA,OAAO,MAAM,KAAK,MAAM,OAAQ1B,EAAUlB,EAAOzI,EAAMqL,CAAM,CAC/D,CAEA,MAAM,IAAI1B,EAAkB3J,EAAeyI,EAAgB,CACzD,OAAO,MAAM,KAAK,MAAM,MAAOkB,EAAUlB,EAAOzI,CAAI,CACtD,CAEA,MAAM,MAAM2J,EAAkB3J,EAAeyI,EAAgB,CAC3D,OAAO,MAAM,KAAK,MAAM,QAASkB,EAAUlB,EAAOzI,CAAI,CACxD,CAEA,MAAM,OAAO2J,EAAkB3J,EAAeyI,EAAgB,CAC5D,OAAO,MAAM,KAAK,MAAM,SAAUkB,EAAUlB,EAAOzI,CAAI,CACzD,CACF,EAEa0L,GAAN,cAA0BX,EAAQ,CACvC,MAAM,YAAa,CAEjB,OADY,MAAM,KAAK,KAAK,eAAgB,CAAC,CAAC,GACnC,KAAK,CAClB,CAEA,MAAM,aAAa/K,EAAgB,CAEjC,OADY,MAAM,KAAK,KAAK,SAAUA,CAAI,GAC/B,KAAK,CAClB,CAEA,MAAM,cACJ2L,EACA3D,EAAU,CAAC,EACX4D,EACAzG,EACA0G,EACA,CACA,IAAMC,EAAU,CAAE,QAAA9D,CAAQ,EACtB2D,EAAW,OAAS,OACtBG,EAAQ,eAAoBH,EAE5BG,EAAQ,qBAA0BH,EASpC,IAAMI,GAPW,MAAM,KAAK,KAC1B,cACAD,EACA3G,EACAyG,EAAW,MACb,IAEyB,MAAM,UAAU,EA4BzC,OA1Be,IAAI,eAAe,CAChC,MAAMA,EAAY,CAChB,SAASI,GAAO,CACdD,EACG,KAAK,EACL,KAAK,CAAC,CAAE,KAAAE,EAAM,MAAAC,CAAM,IAAM,CACzB,GAAID,EAAM,CACRL,EAAW,MAAM,EACjBC,GAAWA,EAAQI,EAAM,EAAE,EAC3B,MACF,CACA,IAAME,EAAS,IAAI,YAAY,OAAO,EAAE,OAAOD,CAAK,EACpDL,GAAWA,EAAQI,EAAME,CAAM,EAC/BP,EAAW,QAAQM,CAAK,EACxBF,EAAK,CACP,CAAC,EACA,MAAOI,GAAQ,CACdR,EAAW,MAAM,EACjBC,GAAWA,EAAQ,GAAM,EAAE,EAC3B,QAAQ,MAAMO,CAAG,CACnB,CAAC,CACL,CACAJ,EAAK,CACP,CACF,CAAC,CAGH,CAEA,MAAM,YACJK,EACAlH,EACmD,CAEnD,OADY,MAAM,KAAK,IAAI,YAAa,CAAE,SAAAkH,CAAS,EAAGlH,CAAW,GACtD,KAAK,CAClB,CAEA,MAAM,YACJmH,EACAC,EACApH,EAIC,CAOD,OANY,MAAM,KAAK,KACrB,mBACA,CAAE,WAAAmH,EAAY,OAAAC,CAAO,EACrBpH,CACF,GAEW,KAAK,CAClB,CAEA,MAAM,aAAaqH,EAAkBrH,EAAsB,CAGzD,OAFY,MAAM,KAAK,OAAO,kBAAmB,CAAE,SAAAqH,CAAS,EAAGrH,CAAW,GAE/D,KAAK,CAClB,CAEA,WACE8B,EACAC,EACA9B,EACAqD,EACA,CACA,IAAMgE,EAAM,IAAI,eAEV7F,EAAU,IAAI,QAAwB,CAACC,EAASC,IAAW,CAC/D,IAAM4F,EAAW,IAAI,SACrBA,EAAS,OAAO,OAAQzF,CAAI,EAE5BwF,EAAI,KACF,OACA,KAAK,cAAc,4BAA4BrH,CAAS,EAAE,EAC1D,EACF,EAEIqD,GACFgE,EAAI,iBAAiB,gBAAiB,KAAK,WAAWhE,CAAK,CAAC,EAI9DgE,EAAI,OAAO,WAAa,SAAUE,EAAO,CACvC,GAAIA,EAAM,iBAAkB,CAC1B,IAAMC,EAAcD,EAAM,OAASA,EAAM,MAAS,IAClDzF,EAAW0F,CAAU,CACvB,CACF,EAEAH,EAAI,OAAS,UAAY,CACvB,GAAIA,EAAI,SAAW,IAAK,CACtB,IAAM1F,EAAW,KAAK,MAAM0F,EAAI,YAAY,EAC5C5F,EAAQE,CAAQ,CAClB,MACED,EAAO,eAAe,CAE1B,EAEA2F,EAAI,QAAU,UAAY,CACxB3F,EAAO,cAAc,CACvB,EAEA2F,EAAI,KAAKC,CAAQ,CACnB,CAAC,EAED,MAAO,CAAE,IAAAD,EAAK,QAAA7F,CAAQ,CACxB,CAEA,cAAc4B,EAAYpD,EAAmB,CAC3C,IAAMyH,EAAc,eAAezH,CAAS,GAC5C,OAAO,KAAK,cAAc,iBAAiBoD,CAAE,GAAGqE,CAAW,EAAE,CAC/D,CAEA,gBAAgBC,EAAe,CAC7B,OAAO,KAAK,cAAc,eAAeA,CAAK,EAAE,CAClD,CAEA,iBAAiBC,EAAkB,CACjC,OAAO,KAAK,cAAc,eAAeA,CAAQ,EAAE,CACrD,CACF,EC5RA,OAAS,UAAAC,OAAc","sourcesContent":["import { useRecoilValue } from 'recoil';\n\nimport {\n actionState,\n askUserState,\n avatarState,\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}\n\nconst useChatData = () => {\n const loading = useRecoilValue(loadingState);\n const elements = useRecoilValue(elementState);\n const avatars = useRecoilValue(avatarState);\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 avatars,\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 IAvatarElement,\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 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 avatarState = atom<IAvatarElement[]>({\n key: 'AvatarElements',\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","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 avatarState,\n chatSettingsInputsState,\n chatSettingsValueState,\n elementState,\n firstUserInteraction,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\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 setAvatars = useSetRecoilState(avatarState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const setIdToResume = useSetRecoilState(threadIdToResumeState);\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 setAvatars([]);\n setTasklists([]);\n setActions([]);\n setTokenCount(0);\n resetChatSettings();\n resetChatSettingsValue();\n }, [session]);\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 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 setLoading(false);\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 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 if (hasMessageById(messages, message.id)) {\n return updateMessageById(messages, message.id, message);\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 hasMessageById = (messages: IStep[], messageId: string) => {\n for (const message of messages) {\n if (isEqual(message.id, messageId)) {\n return true;\n } else if (message.steps && message.steps.length > 0) {\n if (hasMessageById(message.steps, messageId)) {\n return true;\n }\n }\n }\n return false;\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): 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 if ('content' in msg && msg.content !== undefined) {\n if (isSequence) {\n msg.content = updatedContent;\n } else {\n msg.content += updatedContent;\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 );\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 { firstUserInteraction, messagesState } from './state';\n\nconst useChatMessages = () => {\n const messages = useRecoilValue(messagesState);\n const firstInteraction = useRecoilValue(firstUserInteraction);\n\n return {\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 avatarState,\n chatProfileState,\n chatSettingsInputsState,\n chatSettingsValueState,\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 IAvatarElement,\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 setElements = useSetRecoilState(elementState);\n const setAvatars = useSetRecoilState(avatarState);\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\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 socket = io(client.httpEndpoint, {\n path: '/ws/socket.io',\n extraHeaders: {\n Authorization: accessToken || '',\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 }\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 setAvatars(\n (elements as IAvatarElement[]).filter((e) => e.type === 'avatar')\n );\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('first_interaction', (interaction: string) => {\n setFirstUserInteraction(interaction);\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('stream_token', ({ id, token, isSequence }: IToken) => {\n setMessages((oldMessages) =>\n updateMessageContentById(oldMessages, id, token, isSequence)\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('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 === 'avatar') {\n setAvatars((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 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 setAvatars((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 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 = () => {\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 { IGeneration, 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 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 getGeneration(\n generation: IGeneration,\n userEnv = {},\n controller: AbortController,\n accessToken?: string,\n tokenCb?: (done: boolean, token: string) => void\n ) {\n const payload = { userEnv };\n if (generation.type === 'CHAT') {\n payload['chatGeneration'] = generation;\n } else {\n payload['completionGeneration'] = generation;\n }\n const response = await this.post(\n `/generation`,\n payload,\n accessToken,\n controller.signal\n );\n\n const reader = response?.body?.getReader();\n\n const stream = new ReadableStream({\n start(controller) {\n function push() {\n reader!\n .read()\n .then(({ done, value }) => {\n if (done) {\n controller.close();\n tokenCb && tokenCb(done, '');\n return;\n }\n const string = new TextDecoder('utf-8').decode(value);\n tokenCb && tokenCb(done, string);\n controller.enqueue(value);\n push();\n })\n .catch((err) => {\n controller.close();\n tokenCb && tokenCb(true, '');\n console.error(err);\n });\n }\n push();\n }\n });\n\n return stream;\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 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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -7,8 +7,8 @@ export { Socket } from 'socket.io-client';
|
|
|
7
7
|
import Ut from 'jwt-decode';
|
|
8
8
|
import wt from 'swr';
|
|
9
9
|
|
|
10
|
-
var ut=i=>{let t={},e=new Date,s=new Date;s.setDate(e.getDate()-1);let n=new Date;n.setDate(e.getDate()-7);let o=new Date;return o.setDate(e.getDate()-30),i.forEach(a=>{let d=new Date(a.createdAt),p=d.toDateString()===e.toDateString(),h=d.toDateString()===s.toDateString(),f=d>=n,I=d>=o,g;p?g="Today":h?g="Yesterday":f?g="Previous 7 days":I?g="Previous 30 days":g=d.toLocaleString("default",{month:"long",year:"numeric"}).split(" ").slice(0,1).join(" "),t[g]||(t[g]=[]),t[g].push(a);}),t};var O=atom({key:"ThreadIdToResume",default:void 0}),gt=atom({key:"ChatProfile",default:void 0}),dt=atom({key:"SessionId",default:v4()}),H=selector({key:"SessionIdSelector",get:({get:i})=>i(dt),set:({set:i},t)=>i(dt,t instanceof DefaultValue?v4():t)}),C=atom({key:"Session",dangerouslyAllowMutability:!0,default:void 0}),D=atom({key:"Actions",default:[]}),v=atom({key:"Messages",dangerouslyAllowMutability:!0,default:[]}),W=atom({key:"TokenCount",default:0}),R=atom({key:"Loading",default:!1}),_=atom({key:"AskUser",default:void 0}),E=atom({key:"ChatSettings",default:[]}),st=selector({key:"ChatSettingsValue/Default",get:({get:i})=>i(E).reduce((e,s)=>(e[s.id]=s.initial,e),{})}),w=atom({key:"ChatSettingsValue",default:st}),M=atom({key:"DisplayElements",default:[]}),U=atom({key:"AvatarElements",default:[]}),F=atom({key:"TasklistElements",default:[]}),L=atom({key:"FirstUserInteraction",default:void 0}),j=atom({key:"AccessToken",default:void 0}),ht=atom({key:"User",default:null}),mt=atom({key:"ThreadHistory",default:{threads:void 0,currentThreadId:void 0,timeGroupedThreads:void 0,pageInfo:void 0},effects:[({setSelf:i,onSet:t})=>{t((e,s)=>{let n=e?.timeGroupedThreads;e?.threads&&!isEqual(e.threads,s?.timeGroupedThreads)&&(n=ut(e.threads)),i({...e,timeGroupedThreads:n});});}]});var Wt=()=>{let i=useRecoilValue(R),t=useRecoilValue(M),e=useRecoilValue(U),s=useRecoilValue(F),n=useRecoilValue(D),o=useRecoilValue(C),a=useRecoilValue(_),d=useRecoilValue(E),p=useRecoilValue(w),h=useRecoilValue(st),f=o?.socket.connected&&!o?.error,I=!f||i||a?.spec.type==="file"||a?.spec.type==="action";return {actions:n,askUser:a,avatars:e,chatSettingsDefaultValue:h,chatSettingsInputs:d,chatSettingsValue:p,connected:f,disabled:I,elements:t,error:o?.error,loading:i,tasklists:s}};var Xt=i=>{let t=[];for(let e of i)t=A(t,e);return t},Yt=(i,t)=>{if(i.length-1===t)return !0;for(let e=t+1;e<i.length;e++)if(!i[e].streaming)return !1;return !0},A=(i,t)=>V(i,t.id)?N(i,t.id,t):"parentId"in t&&t.parentId?It(i,t.parentId,t):"indent"in t&&t.indent&&t.indent>0?St(i,t.indent,t):[...i,t],St=(i,t,e,s=0)=>{let n=[...i];if(n.length===0)return [...n,e];{let o=n.length-1,a=n[o];return a.steps=a.steps||[],s+1===t?(a.steps=[...a.steps,e],n[o]={...a},n):(a.steps=St(a.steps,t,e,s+1),n[o]={...a},n)}},It=(i,t,e)=>{let s=[...i];for(let n=0;n<s.length;n++){let o=s[n];isEqual(o.id,t)?(o.steps=o.steps?[...o.steps,e]:[e],s[n]={...o}):V(s,t)&&o.steps&&(o.steps=It(o.steps,t,e),s[n]={...o});}return s},V=(i,t)=>{for(let e of i){if(isEqual(e.id,t))return !0;if(e.steps&&e.steps.length>0&&V(e.steps,t))return !0}return !1},N=(i,t,e)=>{let s=[...i];for(let n=0;n<s.length;n++){let o=s[n];isEqual(o.id,t)?s[n]={steps:o.steps,...e}:V(s,t)&&o.steps&&(o.steps=N(o.steps,t,e),s[n]={...o});}return s},nt=(i,t)=>{let e=[...i];for(let s=0;s<e.length;s++){let n=e[s];n.id===t?e=[...e.slice(0,s),...e.slice(s+1)]:V(e,t)&&n.steps&&(n.steps=nt(n.steps,t),e[s]={...n});}return e},ot=(i,t,e,s)=>{let n=[...i];for(let o=0;o<n.length;o++){let a=n[o];isEqual(a.id,t)?("content"in a&&a.content!==void 0?s?a.content=e:a.content+=e:"output"in a&&a.output!==void 0&&(s?a.output=e:a.output+=e),n[o]={...a}):a.steps&&(a.steps=ot(a.steps,t,e,s),n[o]={...a});}return n};var ee=()=>{let i=useRecoilValue(j),t=useRecoilValue(C),e=useRecoilValue(_),s=useRecoilValue(H),n=useResetRecoilState(E),o=useResetRecoilState(H),a=useResetRecoilState(w),d=useSetRecoilState(L),p=useSetRecoilState(R),h=useSetRecoilState(v),f=useSetRecoilState(M),I=useSetRecoilState(U),g=useSetRecoilState(F),y=useSetRecoilState(D),T=useSetRecoilState(W),$=useSetRecoilState(O),B=useCallback(()=>{t?.socket.emit("clear_session"),t?.socket.disconnect(),$(void 0),o(),d(void 0),h([]),f([]),I([]),g([]),y([]),T(0),n(),a();},[t]),G=useCallback((l,r)=>{h(c=>A(c,l)),t?.socket.emit("ui_message",{message:l,fileReferences:r});},[t?.socket]),K=useCallback(l=>{e&&(h(r=>A(r,l)),e.callback(l));},[e]),Q=useCallback(l=>{t?.socket.emit("chat_settings_change",l);},[t?.socket]),q=useCallback(()=>{p(!1),t?.socket.emit("stop");},[t?.socket]),Z=useCallback(l=>{let r=t?.socket;if(!r)return;let c=new Promise((u,m)=>{r.once("action_response",et=>{et.status?u(et):m(et);});});return r.emit("action_call",l),c},[t?.socket]);return {uploadFile:useCallback((l,r,c)=>l.uploadFile(r,c,s,i),[s,i]),callAction:Z,clear:B,replyMessage:K,sendMessage:G,stopTask:q,setIdToResume:$,updateChatSettings:Q}};var re=()=>{let i=useRecoilValue(v),t=useRecoilValue(L);return {messages:i,firstInteraction:t}};var fe=()=>{let i=useRecoilValue(H),[t,e]=useRecoilState(C),s=useResetRecoilState(w),n=useSetRecoilState(L),o=useSetRecoilState(R),a=useSetRecoilState(v),d=useSetRecoilState(_),p=useSetRecoilState(M),h=useSetRecoilState(U),f=useSetRecoilState(F),I=useSetRecoilState(D),g=useSetRecoilState(E),y=useSetRecoilState(W),[T,$]=useRecoilState(gt),B=useRecoilValue(O),G=useCallback(({client:q,userEnv:Z,accessToken:tt})=>{let l=Rt(q.httpEndpoint,{path:"/ws/socket.io",extraHeaders:{Authorization:tt||"","X-Chainlit-Session-Id":i,"X-Chainlit-Thread-Id":B||"","user-env":JSON.stringify(Z),"X-Chainlit-Chat-Profile":T||""}});e(r=>(r?.socket?.removeAllListeners(),r?.socket?.close(),{socket:l})),l.on("connect",()=>{l.emit("connection_successful"),e(r=>({...r,error:!1}));}),l.on("connect_error",r=>{e(c=>({...c,error:!0}));}),l.on("task_start",()=>{o(!0);}),l.on("task_end",()=>{o(!1);}),l.on("reload",()=>{l.emit("clear_session"),window.location.reload();}),l.on("resume_thread",r=>{let c=[];for(let m of r.steps)c=A(c,m);r.metadata?.chat_profile&&$(r.metadata?.chat_profile),a(c);let u=r.elements||[];h(u.filter(m=>m.type==="avatar")),f(u.filter(m=>m.type==="tasklist")),p(u.filter(m=>["avatar","tasklist"].indexOf(m.type)===-1));}),l.on("new_message",r=>{a(c=>A(c,r));}),l.on("first_interaction",r=>{n(r);}),l.on("update_message",r=>{a(c=>N(c,r.id,r));}),l.on("delete_message",r=>{a(c=>nt(c,r.id));}),l.on("stream_start",r=>{a(c=>A(c,r));}),l.on("stream_token",({id:r,token:c,isSequence:u})=>{a(m=>ot(m,r,c,u));}),l.on("ask",({msg:r,spec:c},u)=>{d({spec:c,callback:u}),a(m=>A(m,r)),o(!1);}),l.on("ask_timeout",()=>{d(void 0),o(!1);}),l.on("clear_ask",()=>{d(void 0);}),l.on("chat_settings",r=>{g(r),s();}),l.on("element",r=>{!r.url&&r.chainlitKey&&(r.url=q.getElementUrl(r.chainlitKey,i,tt)),r.type==="avatar"?h(c=>{let u=c.findIndex(m=>m.id===r.id);return u===-1?[...c,r]:[...c.slice(0,u),r,...c.slice(u+1)]}):r.type==="tasklist"?f(c=>{let u=c.findIndex(m=>m.id===r.id);return u===-1?[...c,r]:[...c.slice(0,u),r,...c.slice(u+1)]}):p(c=>{let u=c.findIndex(m=>m.id===r.id);return u===-1?[...c,r]:[...c.slice(0,u),r,...c.slice(u+1)]});}),l.on("remove_element",r=>{p(c=>c.filter(u=>u.id!==r.id)),f(c=>c.filter(u=>u.id!==r.id)),h(c=>c.filter(u=>u.id!==r.id));}),l.on("action",r=>{I(c=>[...c,r]);}),l.on("remove_action",r=>{I(c=>{let u=c.findIndex(m=>m.id===r.id);return u===-1?c:[...c.slice(0,u),...c.slice(u+1)]});}),l.on("token_usage",r=>{y(c=>c+r);});},[e,i,T]),K=useCallback(debounce(G,200),[G]),Q=useCallback(()=>{t?.socket&&(t.socket.removeAllListeners(),t.socket.close());},[t]);return {connect:K,disconnect:Q,session:t,chatProfile:T,idToResume:B,setChatProfile:$}};var at="token";function ct(){try{return localStorage.getItem(at)}catch{return}}function Tt(i){try{return localStorage.setItem(at,i)}catch{return}}function Y(){try{return localStorage.removeItem(at)}catch{return}}var Mt=async(i,t,e)=>(await i.get(t,e))?.json();function At(i,t,e){let s=useRecoilValue(j);return wt(t?[t,s]:null,([n,o])=>Mt(i,n,o),e)}var Ce=i=>{let{data:t,isLoading:e}=At(i,"/auth/config"),[s,n]=useRecoilState(j),o=useSetRecoilState(mt),[a,d]=useRecoilState(ht),p=!!(!e&&t),h=()=>{d(null),Y(),n(""),o(void 0);},f=g=>{if(!g){h();return}try{let{exp:y,...T}=Ut(g);Tt(g),n(`Bearer ${g}`),d(T);}catch(y){console.error("Invalid token, clearing token from local storage","error:",y),h();}};useEffect(()=>{if(!a&&ct()){f(ct());return}},[]);let I=!!s;return t&&!t.requireLogin?{data:t,user:null,isReady:p,isAuthenticated:!0,accessToken:"",logout:()=>{},setAccessToken:()=>{}}:{data:t,user:a,isAuthenticated:I,isReady:p,accessToken:s,logout:h,setAccessToken:f}};var J=class extends Error{constructor(e,s){super(e);this.detail=s;}toString(){return this.detail?`${this.message}: ${this.detail}`:this.message}},lt=class{constructor(t,e,s){this.httpEndpoint=t;this.on401=e;this.onError=s;}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,n,o){try{let a={};s&&(a.Authorization=this.checkToken(s));let d;n instanceof FormData?d=n:(a["Content-Type"]="application/json",d=n?JSON.stringify(n):null);let p=await fetch(this.buildEndpoint(e),{method:t,headers:a,signal:o,body:d});if(!p.ok){let h=await p.json();throw p.status===401&&this.on401&&(Y(),this.on401()),new J(p.statusText,h.detail)}return p}catch(a){throw a instanceof J&&this.onError&&this.onError(a),console.error(a),a}}async get(t,e){return await this.fetch("GET",t,e)}async post(t,e,s,n){return await this.fetch("POST",t,s,e,n)}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)}},Et=class extends lt{async headerAuth(){return (await this.post("/auth/header",{})).json()}async passwordAuth(t){return (await this.post("/login",t)).json()}async getGeneration(t,e={},s,n,o){let a={userEnv:e};t.type==="CHAT"?a.chatGeneration=t:a.completionGeneration=t;let p=(await this.post("/generation",a,n,s.signal))?.body?.getReader();return new ReadableStream({start(f){function I(){p.read().then(({done:g,value:y})=>{if(g){f.close(),o&&o(g,"");return}let T=new TextDecoder("utf-8").decode(y);o&&o(g,T),f.enqueue(y),I();}).catch(g=>{f.close(),o&&o(!0,""),console.error(g);});}I();}})}async setFeedback(t,e){return (await this.put("/feedback",{feedback: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,n){let o=new XMLHttpRequest,a=new Promise((d,p)=>{let h=new FormData;h.append("file",t),o.open("POST",this.buildEndpoint(`/project/file?session_id=${s}`),!0),n&&o.setRequestHeader("Authorization",this.checkToken(n)),o.upload.onprogress=function(f){if(f.lengthComputable){let I=f.loaded/f.total*100;e(I);}},o.onload=function(){if(o.status===200){let f=JSON.parse(o.responseText);d(f);}else p("Upload failed");},o.onerror=function(){p("Upload error");},o.send(h);});return {xhr:o,promise:a}}getElementUrl(t,e,s){let n=`?session_id=${e}`;return s&&(s.startsWith("Bearer ")&&(s=s.slice(7)),n+=`&token=${s}`),this.buildEndpoint(`/project/file/${t}${n}`)}getLogoEndpoint(t){return this.buildEndpoint(`/logo?theme=${t}`)}getOAuthEndpoint(t){return this.buildEndpoint(`/auth/oauth/${t}`)}};
|
|
10
|
+
var ut=i=>{let t={},e=new Date,s=new Date;s.setDate(e.getDate()-1);let r=new Date;r.setDate(e.getDate()-7);let n=new Date;return n.setDate(e.getDate()-30),i.forEach(a=>{let d=new Date(a.createdAt),p=d.toDateString()===e.toDateString(),h=d.toDateString()===s.toDateString(),f=d>=r,I=d>=n,g;p?g="Today":h?g="Yesterday":f?g="Previous 7 days":I?g="Previous 30 days":g=d.toLocaleString("default",{month:"long",year:"numeric"}).split(" ").slice(0,1).join(" "),t[g]||(t[g]=[]),t[g].push(a);}),t};var O=atom({key:"ThreadIdToResume",default:void 0}),gt=atom({key:"ChatProfile",default:void 0}),dt=atom({key:"SessionId",default:v4()}),V=selector({key:"SessionIdSelector",get:({get:i})=>i(dt),set:({set:i},t)=>i(dt,t instanceof DefaultValue?v4():t)}),C=atom({key:"Session",dangerouslyAllowMutability:!0,default:void 0}),D=atom({key:"Actions",default:[]}),v=atom({key:"Messages",dangerouslyAllowMutability:!0,default:[]}),W=atom({key:"TokenCount",default:0}),R=atom({key:"Loading",default:!1}),_=atom({key:"AskUser",default:void 0}),E=atom({key:"ChatSettings",default:[]}),et=selector({key:"ChatSettingsValue/Default",get:({get:i})=>i(E).reduce((e,s)=>(e[s.id]=s.initial,e),{})}),w=atom({key:"ChatSettingsValue",default:et}),M=atom({key:"DisplayElements",default:[]}),U=atom({key:"AvatarElements",default:[]}),F=atom({key:"TasklistElements",default:[]}),L=atom({key:"FirstUserInteraction",default:void 0}),j=atom({key:"AccessToken",default:void 0}),ht=atom({key:"User",default:null}),mt=atom({key:"ThreadHistory",default:{threads:void 0,currentThreadId:void 0,timeGroupedThreads:void 0,pageInfo:void 0},effects:[({setSelf:i,onSet:t})=>{t((e,s)=>{let r=e?.timeGroupedThreads;e?.threads&&!isEqual(e.threads,s?.timeGroupedThreads)&&(r=ut(e.threads)),i({...e,timeGroupedThreads:r});});}]});var Wt=()=>{let i=useRecoilValue(R),t=useRecoilValue(M),e=useRecoilValue(U),s=useRecoilValue(F),r=useRecoilValue(D),n=useRecoilValue(C),a=useRecoilValue(_),d=useRecoilValue(E),p=useRecoilValue(w),h=useRecoilValue(et),f=n?.socket.connected&&!n?.error,I=!f||i||a?.spec.type==="file"||a?.spec.type==="action";return {actions:r,askUser:a,avatars:e,chatSettingsDefaultValue:h,chatSettingsInputs:d,chatSettingsValue:p,connected:f,disabled:I,elements:t,error:n?.error,loading:i,tasklists:s}};var Xt=i=>{let t=[];for(let e of i)t=A(t,e);return t},Yt=(i,t)=>{if(i.length-1===t)return !0;for(let e=t+1;e<i.length;e++)if(!i[e].streaming)return !1;return !0},A=(i,t)=>$(i,t.id)?N(i,t.id,t):"parentId"in t&&t.parentId?It(i,t.parentId,t):"indent"in t&&t.indent&&t.indent>0?St(i,t.indent,t):[...i,t],St=(i,t,e,s=0)=>{let r=[...i];if(r.length===0)return [...r,e];{let n=r.length-1,a=r[n];return a.steps=a.steps||[],s+1===t?(a.steps=[...a.steps,e],r[n]={...a},r):(a.steps=St(a.steps,t,e,s+1),r[n]={...a},r)}},It=(i,t,e)=>{let s=[...i];for(let r=0;r<s.length;r++){let n=s[r];isEqual(n.id,t)?(n.steps=n.steps?[...n.steps,e]:[e],s[r]={...n}):$(s,t)&&n.steps&&(n.steps=It(n.steps,t,e),s[r]={...n});}return s},$=(i,t)=>{for(let e of i){if(isEqual(e.id,t))return !0;if(e.steps&&e.steps.length>0&&$(e.steps,t))return !0}return !1},N=(i,t,e)=>{let s=[...i];for(let r=0;r<s.length;r++){let n=s[r];isEqual(n.id,t)?s[r]={steps:n.steps,...e}:$(s,t)&&n.steps&&(n.steps=N(n.steps,t,e),s[r]={...n});}return s},st=(i,t)=>{let e=[...i];for(let s=0;s<e.length;s++){let r=e[s];r.id===t?e=[...e.slice(0,s),...e.slice(s+1)]:$(e,t)&&r.steps&&(r.steps=st(r.steps,t),e[s]={...r});}return e},nt=(i,t,e,s)=>{let r=[...i];for(let n=0;n<r.length;n++){let a=r[n];isEqual(a.id,t)?("content"in a&&a.content!==void 0?s?a.content=e:a.content+=e:"output"in a&&a.output!==void 0&&(s?a.output=e:a.output+=e),r[n]={...a}):a.steps&&(a.steps=nt(a.steps,t,e,s),r[n]={...a});}return r};var ee=()=>{let i=useRecoilValue(j),t=useRecoilValue(C),e=useRecoilValue(_),s=useRecoilValue(V),r=useResetRecoilState(E),n=useResetRecoilState(V),a=useResetRecoilState(w),d=useSetRecoilState(L),p=useSetRecoilState(R),h=useSetRecoilState(v),f=useSetRecoilState(M),I=useSetRecoilState(U),g=useSetRecoilState(F),k=useSetRecoilState(D),T=useSetRecoilState(W),H=useSetRecoilState(O),B=useCallback(()=>{t?.socket.emit("clear_session"),t?.socket.disconnect(),H(void 0),n(),d(void 0),h([]),f([]),I([]),g([]),k([]),T(0),r(),a();},[t]),G=useCallback((l,o)=>{h(c=>A(c,l)),t?.socket.emit("ui_message",{message:l,fileReferences:o});},[t?.socket]),K=useCallback(l=>{e&&(h(o=>A(o,l)),e.callback(l));},[e]),Q=useCallback(l=>{t?.socket.emit("chat_settings_change",l);},[t?.socket]),q=useCallback(()=>{p(!1),t?.socket.emit("stop");},[t?.socket]),Z=useCallback(l=>{let o=t?.socket;if(!o)return;let c=new Promise((u,m)=>{o.once("action_response",tt=>{tt.status?u(tt):m(tt);});});return o.emit("action_call",l),c},[t?.socket]);return {uploadFile:useCallback((l,o,c)=>l.uploadFile(o,c,s,i),[s,i]),callAction:Z,clear:B,replyMessage:K,sendMessage:G,stopTask:q,setIdToResume:H,updateChatSettings:Q}};var re=()=>{let i=useRecoilValue(v),t=useRecoilValue(L);return {messages:i,firstInteraction:t}};var fe=()=>{let i=useRecoilValue(V),[t,e]=useRecoilState(C),s=useResetRecoilState(w),r=useSetRecoilState(L),n=useSetRecoilState(R),a=useSetRecoilState(v),d=useSetRecoilState(_),p=useSetRecoilState(M),h=useSetRecoilState(U),f=useSetRecoilState(F),I=useSetRecoilState(D),g=useSetRecoilState(E),k=useSetRecoilState(W),[T,H]=useRecoilState(gt),B=useRecoilValue(O),G=useCallback(({client:q,userEnv:Z,accessToken:lt})=>{let l=Rt(q.httpEndpoint,{path:"/ws/socket.io",extraHeaders:{Authorization:lt||"","X-Chainlit-Session-Id":i,"X-Chainlit-Thread-Id":B||"","user-env":JSON.stringify(Z),"X-Chainlit-Chat-Profile":T||""}});e(o=>(o?.socket?.removeAllListeners(),o?.socket?.close(),{socket:l})),l.on("connect",()=>{l.emit("connection_successful"),e(o=>({...o,error:!1}));}),l.on("connect_error",o=>{e(c=>({...c,error:!0}));}),l.on("task_start",()=>{n(!0);}),l.on("task_end",()=>{n(!1);}),l.on("reload",()=>{l.emit("clear_session"),window.location.reload();}),l.on("resume_thread",o=>{let c=[];for(let m of o.steps)c=A(c,m);o.metadata?.chat_profile&&H(o.metadata?.chat_profile),a(c);let u=o.elements||[];h(u.filter(m=>m.type==="avatar")),f(u.filter(m=>m.type==="tasklist")),p(u.filter(m=>["avatar","tasklist"].indexOf(m.type)===-1));}),l.on("new_message",o=>{a(c=>A(c,o));}),l.on("first_interaction",o=>{r(o);}),l.on("update_message",o=>{a(c=>N(c,o.id,o));}),l.on("delete_message",o=>{a(c=>st(c,o.id));}),l.on("stream_start",o=>{a(c=>A(c,o));}),l.on("stream_token",({id:o,token:c,isSequence:u})=>{a(m=>nt(m,o,c,u));}),l.on("ask",({msg:o,spec:c},u)=>{d({spec:c,callback:u}),a(m=>A(m,o)),n(!1);}),l.on("ask_timeout",()=>{d(void 0),n(!1);}),l.on("clear_ask",()=>{d(void 0);}),l.on("chat_settings",o=>{g(o),s();}),l.on("element",o=>{!o.url&&o.chainlitKey&&(o.url=q.getElementUrl(o.chainlitKey,i)),o.type==="avatar"?h(c=>{let u=c.findIndex(m=>m.id===o.id);return u===-1?[...c,o]:[...c.slice(0,u),o,...c.slice(u+1)]}):o.type==="tasklist"?f(c=>{let u=c.findIndex(m=>m.id===o.id);return u===-1?[...c,o]:[...c.slice(0,u),o,...c.slice(u+1)]}):p(c=>{let u=c.findIndex(m=>m.id===o.id);return u===-1?[...c,o]:[...c.slice(0,u),o,...c.slice(u+1)]});}),l.on("remove_element",o=>{p(c=>c.filter(u=>u.id!==o.id)),f(c=>c.filter(u=>u.id!==o.id)),h(c=>c.filter(u=>u.id!==o.id));}),l.on("action",o=>{I(c=>[...c,o]);}),l.on("remove_action",o=>{I(c=>{let u=c.findIndex(m=>m.id===o.id);return u===-1?c:[...c.slice(0,u),...c.slice(u+1)]});}),l.on("token_usage",o=>{k(c=>c+o);});},[e,i,T]),K=useCallback(debounce(G,200),[G]),Q=useCallback(()=>{t?.socket&&(t.socket.removeAllListeners(),t.socket.close());},[t]);return {connect:K,disconnect:Q,session:t,chatProfile:T,idToResume:B,setChatProfile:H}};var it="token";function at(){try{return localStorage.getItem(it)}catch{return}}function Tt(i){try{return localStorage.setItem(it,i)}catch{return}}function Y(){try{return localStorage.removeItem(it)}catch{return}}var Mt=async(i,t,e)=>(await i.get(t,e))?.json();function At(i,t,e){let s=useRecoilValue(j);return wt(t?[t,s]:null,([r,n])=>Mt(i,r,n),e)}var Ce=i=>{let{data:t,isLoading:e}=At(i,"/auth/config"),[s,r]=useRecoilState(j),n=useSetRecoilState(mt),[a,d]=useRecoilState(ht),p=!!(!e&&t),h=()=>{d(null),Y(),r(""),n(void 0);},f=g=>{if(!g){h();return}try{let{exp:k,...T}=Ut(g);Tt(g),r(`Bearer ${g}`),d(T);}catch(k){console.error("Invalid token, clearing token from local storage","error:",k),h();}};useEffect(()=>{if(!a&&at()){f(at());return}},[]);let I=!!s;return t&&!t.requireLogin?{data:t,user:null,isReady:p,isAuthenticated:!0,accessToken:"",logout:()=>{},setAccessToken:()=>{}}:{data:t,user:a,isAuthenticated:I,isReady:p,accessToken:s,logout:h,setAccessToken:f}};var J=class extends Error{constructor(e,s){super(e);this.detail=s;}toString(){return this.detail?`${this.message}: ${this.detail}`:this.message}},ct=class{constructor(t,e,s){this.httpEndpoint=t;this.on401=e;this.onError=s;}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,r,n){try{let a={};s&&(a.Authorization=this.checkToken(s));let d;r instanceof FormData?d=r:(a["Content-Type"]="application/json",d=r?JSON.stringify(r):null);let p=await fetch(this.buildEndpoint(e),{method:t,headers:a,signal:n,body:d});if(!p.ok){let h=await p.json();throw p.status===401&&this.on401&&(Y(),this.on401()),new J(p.statusText,h.detail)}return p}catch(a){throw a instanceof J&&this.onError&&this.onError(a),console.error(a),a}}async get(t,e){return await this.fetch("GET",t,e)}async post(t,e,s,r){return await this.fetch("POST",t,s,e,r)}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)}},Et=class extends ct{async headerAuth(){return (await this.post("/auth/header",{})).json()}async passwordAuth(t){return (await this.post("/login",t)).json()}async getGeneration(t,e={},s,r,n){let a={userEnv:e};t.type==="CHAT"?a.chatGeneration=t:a.completionGeneration=t;let p=(await this.post("/generation",a,r,s.signal))?.body?.getReader();return new ReadableStream({start(f){function I(){p.read().then(({done:g,value:k})=>{if(g){f.close(),n&&n(g,"");return}let T=new TextDecoder("utf-8").decode(k);n&&n(g,T),f.enqueue(k),I();}).catch(g=>{f.close(),n&&n(!0,""),console.error(g);});}I();}})}async setFeedback(t,e){return (await this.put("/feedback",{feedback: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,r){let n=new XMLHttpRequest,a=new Promise((d,p)=>{let h=new FormData;h.append("file",t),n.open("POST",this.buildEndpoint(`/project/file?session_id=${s}`),!0),r&&n.setRequestHeader("Authorization",this.checkToken(r)),n.upload.onprogress=function(f){if(f.lengthComputable){let I=f.loaded/f.total*100;e(I);}},n.onload=function(){if(n.status===200){let f=JSON.parse(n.responseText);d(f);}else p("Upload failed");},n.onerror=function(){p("Upload error");},n.send(h);});return {xhr:n,promise:a}}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}`)}};
|
|
11
11
|
|
|
12
|
-
export {
|
|
12
|
+
export { ct as APIBase, Et as ChainlitAPI, J as ClientError, j as accessTokenState, D as actionState, A as addMessage, It as addMessageToParent, _ as askUserState, U as avatarState, gt as chatProfileState, et as chatSettingsDefaultValueSelector, E as chatSettingsInputsState, w as chatSettingsValueState, st as deleteMessageById, M as elementState, Mt as fetcher, L as firstUserInteraction, $ as hasMessageById, Yt as isLastMessage, R as loadingState, v as messagesState, Xt as nestMessages, V as sessionIdState, C as sessionState, F as tasklistState, mt as threadHistoryState, O as threadIdToResumeState, W as tokenCountState, N as updateMessageById, nt as updateMessageContentById, At as useApi, Ce as useAuth, Wt as useChatData, ee as useChatInteract, re as useChatMessages, fe as useChatSession, ht as userState };
|
|
13
13
|
//# sourceMappingURL=out.js.map
|
|
14
14
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.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","chatSettingsInputsState","chatSettingsDefaultValueSelector","form","input","chatSettingsValueState","elementState","avatarState","tasklistState","firstUserInteraction","accessTokenState","userState","threadHistoryState","setSelf","onSet","oldValue","timeGroupedThreads","useChatData","loading","elements","avatars","tasklists","actions","session","askUser","chatSettingsInputs","chatSettingsValue","chatSettingsDefaultValue","connected","disabled","useCallback","useResetRecoilState","useSetRecoilState","nestMessages","messages","nestedMessages","message","addMessage","isLastMessage","index","i","hasMessageById","updateMessageById","addMessageToParent","addIndentMessage","indent","newMessage","currentIndentation","nextMessages","msg","parentId","messageId","updatedMessage","deleteMessageById","updateMessageContentById","updatedContent","isSequence","useChatInteract","accessToken","sessionId","resetChatSettings","resetSessionId","resetChatSettingsValue","setFirstUserInteraction","setLoading","setMessages","setElements","setAvatars","setTasklists","setActions","setTokenCount","setIdToResume","clear","sendMessage","fileReferences","oldMessages","replyMessage","updateChatSettings","values","stopTask","callAction","action","socket","promise","resolve","reject","response","client","file","onProgress","useChatMessages","firstInteraction","debounce","useRecoilState","io","useChatSession","setSession","setAskUser","setChatSettingsInputs","chatProfile","setChatProfile","idToResume","_connect","userEnv","old","s","_","thread","step","e","interaction","id","token","spec","callback","inputs","element","remove","a","count","connect","disconnect","tokenKey","getToken","setToken","removeToken","jwt_decode","useEffect","useSWR","fetcher","endpoint","useApi","path","options","url","useAuth","apiClient","isLoading","setAccessToken","setThreadHistory","user","setUser","isReady","logout","saveAndSetToken","exp","User","isAuthenticated","ClientError","detail","APIBase","httpEndpoint","on401","onError","prefix","method","signal","headers","body","res","error","ChainlitAPI","generation","controller","tokenCb","payload","reader","push","done","value","string","err","feedback","pagination","filter","threadId","xhr","formData","event","percentage","queryParams","theme","provider","Socket"],"mappings":"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","sourcesContent":["import { useRecoilValue } from 'recoil';\n\nimport {\n actionState,\n askUserState,\n avatarState,\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}\n\nconst useChatData = () => {\n const loading = useRecoilValue(loadingState);\n const elements = useRecoilValue(elementState);\n const avatars = useRecoilValue(avatarState);\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 avatars,\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 IAvatarElement,\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 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 avatarState = atom<IAvatarElement[]>({\n key: 'AvatarElements',\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","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 avatarState,\n chatSettingsInputsState,\n chatSettingsValueState,\n elementState,\n firstUserInteraction,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\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 setAvatars = useSetRecoilState(avatarState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const setIdToResume = useSetRecoilState(threadIdToResumeState);\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 setAvatars([]);\n setTasklists([]);\n setActions([]);\n setTokenCount(0);\n resetChatSettings();\n resetChatSettingsValue();\n }, [session]);\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 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 setLoading(false);\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 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 if (hasMessageById(messages, message.id)) {\n return updateMessageById(messages, message.id, message);\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 hasMessageById = (messages: IStep[], messageId: string) => {\n for (const message of messages) {\n if (isEqual(message.id, messageId)) {\n return true;\n } else if (message.steps && message.steps.length > 0) {\n if (hasMessageById(message.steps, messageId)) {\n return true;\n }\n }\n }\n return false;\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): 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 if ('content' in msg && msg.content !== undefined) {\n if (isSequence) {\n msg.content = updatedContent;\n } else {\n msg.content += updatedContent;\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 );\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 { firstUserInteraction, messagesState } from './state';\n\nconst useChatMessages = () => {\n const messages = useRecoilValue(messagesState);\n const firstInteraction = useRecoilValue(firstUserInteraction);\n\n return {\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 avatarState,\n chatProfileState,\n chatSettingsInputsState,\n chatSettingsValueState,\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 IAvatarElement,\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 setElements = useSetRecoilState(elementState);\n const setAvatars = useSetRecoilState(avatarState);\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\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 socket = io(client.httpEndpoint, {\n path: '/ws/socket.io',\n extraHeaders: {\n Authorization: accessToken || '',\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 }\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 setAvatars(\n (elements as IAvatarElement[]).filter((e) => e.type === 'avatar')\n );\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('first_interaction', (interaction: string) => {\n setFirstUserInteraction(interaction);\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('stream_token', ({ id, token, isSequence }: IToken) => {\n setMessages((oldMessages) =>\n updateMessageContentById(oldMessages, id, token, isSequence)\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('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(\n element.chainlitKey,\n sessionId,\n accessToken\n );\n }\n\n if (element.type === 'avatar') {\n setAvatars((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 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 setAvatars((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 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 = () => {\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 { IGeneration, 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 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 getGeneration(\n generation: IGeneration,\n userEnv = {},\n controller: AbortController,\n accessToken?: string,\n tokenCb?: (done: boolean, token: string) => void\n ) {\n const payload = { userEnv };\n if (generation.type === 'CHAT') {\n payload['chatGeneration'] = generation;\n } else {\n payload['completionGeneration'] = generation;\n }\n const response = await this.post(\n `/generation`,\n payload,\n accessToken,\n controller.signal\n );\n\n const reader = response?.body?.getReader();\n\n const stream = new ReadableStream({\n start(controller) {\n function push() {\n reader!\n .read()\n .then(({ done, value }) => {\n if (done) {\n controller.close();\n tokenCb && tokenCb(done, '');\n return;\n }\n const string = new TextDecoder('utf-8').decode(value);\n tokenCb && tokenCb(done, string);\n controller.enqueue(value);\n push();\n })\n .catch((err) => {\n controller.close();\n tokenCb && tokenCb(true, '');\n console.error(err);\n });\n }\n push();\n }\n });\n\n return stream;\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 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, accessToken?: string) {\n let queryParams = `?session_id=${sessionId}`;\n if (accessToken) {\n if (accessToken.startsWith('Bearer ')) {\n accessToken = accessToken.slice(7);\n }\n queryParams += `&token=${accessToken}`;\n }\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/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","chatSettingsInputsState","chatSettingsDefaultValueSelector","form","input","chatSettingsValueState","elementState","avatarState","tasklistState","firstUserInteraction","accessTokenState","userState","threadHistoryState","setSelf","onSet","oldValue","timeGroupedThreads","useChatData","loading","elements","avatars","tasklists","actions","session","askUser","chatSettingsInputs","chatSettingsValue","chatSettingsDefaultValue","connected","disabled","useCallback","useResetRecoilState","useSetRecoilState","nestMessages","messages","nestedMessages","message","addMessage","isLastMessage","index","i","hasMessageById","updateMessageById","addMessageToParent","addIndentMessage","indent","newMessage","currentIndentation","nextMessages","msg","parentId","messageId","updatedMessage","deleteMessageById","updateMessageContentById","updatedContent","isSequence","useChatInteract","accessToken","sessionId","resetChatSettings","resetSessionId","resetChatSettingsValue","setFirstUserInteraction","setLoading","setMessages","setElements","setAvatars","setTasklists","setActions","setTokenCount","setIdToResume","clear","sendMessage","fileReferences","oldMessages","replyMessage","updateChatSettings","values","stopTask","callAction","action","socket","promise","resolve","reject","response","client","file","onProgress","useChatMessages","firstInteraction","debounce","useRecoilState","io","useChatSession","setSession","setAskUser","setChatSettingsInputs","chatProfile","setChatProfile","idToResume","_connect","userEnv","old","s","_","thread","step","e","interaction","id","token","spec","callback","inputs","element","remove","a","count","connect","disconnect","tokenKey","getToken","setToken","removeToken","jwt_decode","useEffect","useSWR","fetcher","endpoint","useApi","path","options","url","useAuth","apiClient","isLoading","setAccessToken","setThreadHistory","user","setUser","isReady","logout","saveAndSetToken","exp","User","isAuthenticated","ClientError","detail","APIBase","httpEndpoint","on401","onError","prefix","method","signal","headers","body","res","error","ChainlitAPI","generation","controller","tokenCb","payload","reader","push","done","value","string","err","feedback","pagination","filter","threadId","xhr","formData","event","percentage","queryParams","theme","provider","Socket"],"mappings":"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","sourcesContent":["import { useRecoilValue } from 'recoil';\n\nimport {\n actionState,\n askUserState,\n avatarState,\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}\n\nconst useChatData = () => {\n const loading = useRecoilValue(loadingState);\n const elements = useRecoilValue(elementState);\n const avatars = useRecoilValue(avatarState);\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 avatars,\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 IAvatarElement,\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 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 avatarState = atom<IAvatarElement[]>({\n key: 'AvatarElements',\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","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 avatarState,\n chatSettingsInputsState,\n chatSettingsValueState,\n elementState,\n firstUserInteraction,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\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 setAvatars = useSetRecoilState(avatarState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const setIdToResume = useSetRecoilState(threadIdToResumeState);\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 setAvatars([]);\n setTasklists([]);\n setActions([]);\n setTokenCount(0);\n resetChatSettings();\n resetChatSettingsValue();\n }, [session]);\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 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 setLoading(false);\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 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 if (hasMessageById(messages, message.id)) {\n return updateMessageById(messages, message.id, message);\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 hasMessageById = (messages: IStep[], messageId: string) => {\n for (const message of messages) {\n if (isEqual(message.id, messageId)) {\n return true;\n } else if (message.steps && message.steps.length > 0) {\n if (hasMessageById(message.steps, messageId)) {\n return true;\n }\n }\n }\n return false;\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): 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 if ('content' in msg && msg.content !== undefined) {\n if (isSequence) {\n msg.content = updatedContent;\n } else {\n msg.content += updatedContent;\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 );\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 { firstUserInteraction, messagesState } from './state';\n\nconst useChatMessages = () => {\n const messages = useRecoilValue(messagesState);\n const firstInteraction = useRecoilValue(firstUserInteraction);\n\n return {\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 avatarState,\n chatProfileState,\n chatSettingsInputsState,\n chatSettingsValueState,\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 IAvatarElement,\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 setElements = useSetRecoilState(elementState);\n const setAvatars = useSetRecoilState(avatarState);\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\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 socket = io(client.httpEndpoint, {\n path: '/ws/socket.io',\n extraHeaders: {\n Authorization: accessToken || '',\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 }\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 setAvatars(\n (elements as IAvatarElement[]).filter((e) => e.type === 'avatar')\n );\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('first_interaction', (interaction: string) => {\n setFirstUserInteraction(interaction);\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('stream_token', ({ id, token, isSequence }: IToken) => {\n setMessages((oldMessages) =>\n updateMessageContentById(oldMessages, id, token, isSequence)\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('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 === 'avatar') {\n setAvatars((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 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 setAvatars((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 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 = () => {\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 { IGeneration, 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 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 getGeneration(\n generation: IGeneration,\n userEnv = {},\n controller: AbortController,\n accessToken?: string,\n tokenCb?: (done: boolean, token: string) => void\n ) {\n const payload = { userEnv };\n if (generation.type === 'CHAT') {\n payload['chatGeneration'] = generation;\n } else {\n payload['completionGeneration'] = generation;\n }\n const response = await this.post(\n `/generation`,\n payload,\n accessToken,\n controller.signal\n );\n\n const reader = response?.body?.getReader();\n\n const stream = new ReadableStream({\n start(controller) {\n function push() {\n reader!\n .read()\n .then(({ done, value }) => {\n if (done) {\n controller.close();\n tokenCb && tokenCb(done, '');\n return;\n }\n const string = new TextDecoder('utf-8').decode(value);\n tokenCb && tokenCb(done, string);\n controller.enqueue(value);\n push();\n })\n .catch((err) => {\n controller.close();\n tokenCb && tokenCb(true, '');\n console.error(err);\n });\n }\n push();\n }\n });\n\n return stream;\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 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"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chainlit/react-client",
|
|
3
3
|
"description": "Websocket client to connect to your chainlit app.",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.5",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "tsup src/index.ts --clean --format esm,cjs --dts --external react --external recoil --minify --sourcemap --treeshake",
|
|
7
7
|
"dev": "tsup src/index.ts --clean --format esm,cjs --dts --external react --external recoil --minify --sourcemap --treeshake",
|