@chainlit/react-client 0.0.601 → 0.0.602
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 +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -356,6 +356,7 @@ declare const firstUserInteraction: recoil.RecoilState<string | undefined>;
|
|
|
356
356
|
declare const accessTokenState: recoil.RecoilState<string | undefined>;
|
|
357
357
|
declare const userState: recoil.RecoilState<IUser | null>;
|
|
358
358
|
declare const threadHistoryState: recoil.RecoilState<ThreadHistory | undefined>;
|
|
359
|
+
declare const sideViewState: recoil.RecoilState<IMessageElement | undefined>;
|
|
359
360
|
|
|
360
361
|
declare const useChatSession: () => {
|
|
361
362
|
connect: lodash.DebouncedFunc<({ client, userEnv, accessToken }: {
|
|
@@ -365,6 +366,7 @@ declare const useChatSession: () => {
|
|
|
365
366
|
}) => void>;
|
|
366
367
|
disconnect: () => void;
|
|
367
368
|
session: ISession | undefined;
|
|
369
|
+
sessionId: string;
|
|
368
370
|
chatProfile: string | undefined;
|
|
369
371
|
idToResume: string | undefined;
|
|
370
372
|
setChatProfile: recoil.SetterOrUpdater<string | undefined>;
|
|
@@ -379,4 +381,4 @@ declare const updateMessageById: (messages: IStep[], messageId: string, updatedM
|
|
|
379
381
|
declare const deleteMessageById: (messages: IStep[], messageId: string) => IStep[];
|
|
380
382
|
declare const updateMessageContentById: (messages: IStep[], messageId: number | string, updatedContent: string, isSequence: boolean) => IStep[];
|
|
381
383
|
|
|
382
|
-
export { APIBase, ActionSpec, AuthProvider, ChainlitAPI, ClientError, ElementType, FileSpec, GenerationMessageRole, IAction, IAsk, IAudioElement, IAvatarElement, IBaseGeneration, ICallFn, IChatGeneration, ICompletionGeneration, IElement, IElementSize, IFeedback, IFileElement, IFileRef, IFunction, IGeneration, IGenerationMessage, IImageElement, ILLMSettings, IMessageElement, IPageInfo, IPagination, IPdfElement, IPlotlyElement, ISession, IStep, ITasklistElement, ITextElement, IThread, IThreadFilters, IToken, ITool, IUser, IUserMetadata, IVideoElement, ThreadHistory, UserInput, accessTokenState, actionState, addMessage, addMessageToParent, askUserState, avatarState, callFnState, chatProfileState, chatSettingsDefaultValueSelector, chatSettingsInputsState, chatSettingsValueState, deleteMessageById, elementState, fetcher, firstUserInteraction, hasMessageById, isLastMessage, loadingState, messagesState, nestMessages, sessionIdState, sessionState, tasklistState, threadHistoryState, threadIdToResumeState, tokenCountState, updateMessageById, updateMessageContentById, useApi, useAuth, useChatData, useChatInteract, useChatMessages, useChatSession, userState };
|
|
384
|
+
export { APIBase, ActionSpec, AuthProvider, ChainlitAPI, ClientError, ElementType, FileSpec, GenerationMessageRole, IAction, IAsk, IAudioElement, IAvatarElement, IBaseGeneration, ICallFn, IChatGeneration, ICompletionGeneration, IElement, IElementSize, IFeedback, IFileElement, IFileRef, IFunction, IGeneration, IGenerationMessage, IImageElement, ILLMSettings, IMessageElement, IPageInfo, IPagination, IPdfElement, IPlotlyElement, ISession, IStep, ITasklistElement, ITextElement, IThread, IThreadFilters, IToken, ITool, IUser, IUserMetadata, IVideoElement, ThreadHistory, UserInput, accessTokenState, actionState, addMessage, addMessageToParent, askUserState, avatarState, callFnState, chatProfileState, chatSettingsDefaultValueSelector, chatSettingsInputsState, chatSettingsValueState, deleteMessageById, elementState, fetcher, firstUserInteraction, hasMessageById, isLastMessage, loadingState, messagesState, nestMessages, sessionIdState, sessionState, sideViewState, tasklistState, threadHistoryState, threadIdToResumeState, tokenCountState, updateMessageById, updateMessageContentById, useApi, useAuth, useChatData, useChatInteract, useChatMessages, useChatSession, userState };
|
package/dist/index.d.ts
CHANGED
|
@@ -356,6 +356,7 @@ declare const firstUserInteraction: recoil.RecoilState<string | undefined>;
|
|
|
356
356
|
declare const accessTokenState: recoil.RecoilState<string | undefined>;
|
|
357
357
|
declare const userState: recoil.RecoilState<IUser | null>;
|
|
358
358
|
declare const threadHistoryState: recoil.RecoilState<ThreadHistory | undefined>;
|
|
359
|
+
declare const sideViewState: recoil.RecoilState<IMessageElement | undefined>;
|
|
359
360
|
|
|
360
361
|
declare const useChatSession: () => {
|
|
361
362
|
connect: lodash.DebouncedFunc<({ client, userEnv, accessToken }: {
|
|
@@ -365,6 +366,7 @@ declare const useChatSession: () => {
|
|
|
365
366
|
}) => void>;
|
|
366
367
|
disconnect: () => void;
|
|
367
368
|
session: ISession | undefined;
|
|
369
|
+
sessionId: string;
|
|
368
370
|
chatProfile: string | undefined;
|
|
369
371
|
idToResume: string | undefined;
|
|
370
372
|
setChatProfile: recoil.SetterOrUpdater<string | undefined>;
|
|
@@ -379,4 +381,4 @@ declare const updateMessageById: (messages: IStep[], messageId: string, updatedM
|
|
|
379
381
|
declare const deleteMessageById: (messages: IStep[], messageId: string) => IStep[];
|
|
380
382
|
declare const updateMessageContentById: (messages: IStep[], messageId: number | string, updatedContent: string, isSequence: boolean) => IStep[];
|
|
381
383
|
|
|
382
|
-
export { APIBase, ActionSpec, AuthProvider, ChainlitAPI, ClientError, ElementType, FileSpec, GenerationMessageRole, IAction, IAsk, IAudioElement, IAvatarElement, IBaseGeneration, ICallFn, IChatGeneration, ICompletionGeneration, IElement, IElementSize, IFeedback, IFileElement, IFileRef, IFunction, IGeneration, IGenerationMessage, IImageElement, ILLMSettings, IMessageElement, IPageInfo, IPagination, IPdfElement, IPlotlyElement, ISession, IStep, ITasklistElement, ITextElement, IThread, IThreadFilters, IToken, ITool, IUser, IUserMetadata, IVideoElement, ThreadHistory, UserInput, accessTokenState, actionState, addMessage, addMessageToParent, askUserState, avatarState, callFnState, chatProfileState, chatSettingsDefaultValueSelector, chatSettingsInputsState, chatSettingsValueState, deleteMessageById, elementState, fetcher, firstUserInteraction, hasMessageById, isLastMessage, loadingState, messagesState, nestMessages, sessionIdState, sessionState, tasklistState, threadHistoryState, threadIdToResumeState, tokenCountState, updateMessageById, updateMessageContentById, useApi, useAuth, useChatData, useChatInteract, useChatMessages, useChatSession, userState };
|
|
384
|
+
export { APIBase, ActionSpec, AuthProvider, ChainlitAPI, ClientError, ElementType, FileSpec, GenerationMessageRole, IAction, IAsk, IAudioElement, IAvatarElement, IBaseGeneration, ICallFn, IChatGeneration, ICompletionGeneration, IElement, IElementSize, IFeedback, IFileElement, IFileRef, IFunction, IGeneration, IGenerationMessage, IImageElement, ILLMSettings, IMessageElement, IPageInfo, IPagination, IPdfElement, IPlotlyElement, ISession, IStep, ITasklistElement, ITextElement, IThread, IThreadFilters, IToken, ITool, IUser, IUserMetadata, IVideoElement, ThreadHistory, UserInput, accessTokenState, actionState, addMessage, addMessageToParent, askUserState, avatarState, callFnState, chatProfileState, chatSettingsDefaultValueSelector, chatSettingsInputsState, chatSettingsValueState, deleteMessageById, elementState, fetcher, firstUserInteraction, hasMessageById, isLastMessage, loadingState, messagesState, nestMessages, sessionIdState, sessionState, sideViewState, tasklistState, threadHistoryState, threadIdToResumeState, tokenCountState, updateMessageById, updateMessageContentById, useApi, useAuth, useChatData, useChatInteract, useChatMessages, useChatSession, userState };
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";function e(e,t){if(t==null||t>e.length)t=e.length;for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function t(e){if(Array.isArray(e))return e}function n(t){if(Array.isArray(t))return e(t)}function r(e){if(e===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return e}function o(e,t,n,r,o,i,a){try{var u=e[i](a);var s=u.value}catch(e){n(e);return}if(u.done){t(s)}else{Promise.resolve(s).then(r,o)}}function i(e){return function(){var t=this,n=arguments;return new Promise(function(r,i){var a=e.apply(t,n);function u(e){o(a,r,i,u,s,"next",e)}function s(e){o(a,r,i,u,s,"throw",e)}u(undefined)})}}function a(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function u(e,t,n){if(C()){u=Reflect.construct}else{u=function e(e,t,n){var r=[null];r.push.apply(r,t);var o=Function.bind.apply(e,r);var i=new o;if(n)O(i,n.prototype);return i}}return u.apply(null,arguments)}function s(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||false;r.configurable=true;if("value"in r)r.writable=true;Object.defineProperty(e,r.key,r)}}function c(e,t,n){if(t)s(e.prototype,t);if(n)s(e,n);return e}function l(e,t,n){if(t in e){Object.defineProperty(e,t,{value:n,enumerable:true,configurable:true,writable:true})}else{e[t]=n}return e}function f(e){f=Object.setPrototypeOf?Object.getPrototypeOf:function e(e){return e.__proto__||Object.getPrototypeOf(e)};return f(e)}function d(e,t){if(typeof t!=="function"&&t!==null){throw new TypeError("Super expression must either be null or a function")}e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:true,configurable:true}});if(t)O(e,t)}function 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 a,u;try{for(n=n.call(e);!(o=(a=n.next()).done);o=true){r.push(a.value);if(t&&r.length===t)break}}catch(e){i=true;u=e}finally{try{if(!o&&n["return"]!=null)n["return"]()}finally{if(i)throw u}}return r}function 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 m(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 S(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{S(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function w(e,t){if(e==null)return{};var n=R(e,t);var r,o;if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++){r=i[o];if(t.indexOf(r)>=0)continue;if(!Object.prototype.propertyIsEnumerable.call(e,r))continue;n[r]=e[r]}}return n}function R(e,t){if(e==null)return{};var n={};var r=Object.keys(e);var o,i;for(i=0;i<r.length;i++){o=r[i];if(t.indexOf(o)>=0)continue;n[o]=e[o]}return n}function x(e,t){if(t&&(T(t)==="object"||typeof t==="function")){return t}return r(e)}function O(e,t){O=Object.setPrototypeOf||function e(e,t){e.__proto__=t;return e};return O(e,t)}function E(e,n){return t(e)||y(e,n)||I(e,n)||b()}function j(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 _(e){var t=typeof Map==="function"?new Map:undefined;_=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 u(e,arguments,f(this).constructor)}n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:false,writable:true,configurable:true}});return O(n,e)};return _(e)}function C(){if(typeof Reflect==="undefined"||!Reflect.construct)return false;if(Reflect.construct.sham)return false;if(typeof Proxy==="function")return true;try{Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}));return true}catch(e){return false}}function P(e){var t=C();return function n(){var n=f(e),r;if(t){var o=f(this).constructor;r=Reflect.construct(n,arguments,o)}else{r=n.apply(this,arguments)}return x(this,r)}}function A(e,t){var n,r,o,i,a={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]};return(i={next:u(0),"throw":u(1),"return":u(2)},typeof Symbol==="function"&&(i[Symbol.iterator]=function(){return this}),i);function u(e){return function(t){return s([e,t])}}function s(i){if(n)throw new TypeError("Generator is already executing.");while(a)try{if(n=1,r&&(o=i[0]&2?r["return"]:i[0]?r["throw"]||((o=r["return"])&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;if(r=0,o)i=[i[0]&2,o.value];switch(i[0]){case 0:case 1:o=i;break;case 4:a.label++;return{value:i[1],done:false};case 5:a.label++;r=i[1];i=[0];continue;case 7:i=a.ops.pop();a.trys.pop();continue;default:if(!(o=a.trys,o=o.length>0&&o[o.length-1])&&(i[0]===6||i[0]===2)){a=0;continue}if(i[0]===3&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(i[0]===6&&a.label<o[1]){a.label=o[1];o=i;break}if(o&&a.label<o[2]){a.label=o[2];a.ops.push(i);break}if(o[2])a.ops.pop();a.trys.pop();continue}i=t.call(e,a)}catch(e){i=[6,e];r=0}finally{n=o=0}if(i[0]&5)throw i[1];return{value:i[0]?i[1]:void 0,done:true}}}var D=require("recoil");var V=require("lodash");var M=require("uuid");var q=require("react");var U=require("socket.io-client");var F=require("jwt-decode");var L=require("swr");function B(e){return e&&e.__esModule?e:{default:e}}var G=/*#__PURE__*/B(U);var H=/*#__PURE__*/B(F);var X=/*#__PURE__*/B(L);var z=function(e){var t={},n=new Date,r=new Date;r.setDate(n.getDate()-1);var o=new Date;o.setDate(n.getDate()-7);var i=new Date;return i.setDate(n.getDate()-30),e.forEach(function(e){var a=new Date(e.createdAt),u=a.toDateString()===n.toDateString(),s=a.toDateString()===r.toDateString(),c=a>=o,l=a>=i,f;u?f="Today":s?f="Yesterday":c?f="Previous 7 days":l?f="Previous 30 days":f=a.toLocaleString("default",{month:"long",year:"numeric"}).split(" ").slice(0,1).join(" "),t[f]||(t[f]=[]),t[f].push(e)}),t};var J=D.atom({key:"ThreadIdToResume",default:void 0}),N=D.atom({key:"ChatProfile",default:void 0}),W=D.atom({key:"SessionId",default:M.v4()}),K=D.selector({key:"SessionIdSelector",get:function(e){var t=e.get;return t(W)},set:function(e,t){var n=e.set;return n(W,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:"CallFn",default:void 0}),er=D.atom({key:"ChatSettings",default:[]}),eo=D.selector({key:"ChatSettingsValue/Default",get:function(e){var t=e.get;return t(er).reduce(function(e,t){return e[t.id]=t.initial,e},{})}}),ei=D.atom({key:"ChatSettingsValue",default:eo}),ea=D.atom({key:"DisplayElements",default:[]}),eu=D.atom({key:"AvatarElements",default:[]}),es=D.atom({key:"TasklistElements",default:[]}),ec=D.atom({key:"FirstUserInteraction",default:void 0}),el=D.atom({key:"AccessToken",default:void 0}),ef=D.atom({key:"User",default:null}),ed=D.atom({key:"ThreadHistory",default:{threads:void 0,currentThreadId:void 0,timeGroupedThreads:void 0,pageInfo:void 0},effects:[function(e){var t=e.setSelf,n=e.onSet;n(function(e,n){var r=e===null||e===void 0?void 0:e.timeGroupedThreads;(e===null||e===void 0?void 0:e.threads)&&!V.isEqual(e.threads,n===null||n===void 0?void 0:n.timeGroupedThreads)&&(r=z(e.threads)),t(k(m({},e),{timeGroupedThreads:r}))})}]});var ev=function(){var e=D.useRecoilValue(ee),t=D.useRecoilValue(ea),n=D.useRecoilValue(eu),r=D.useRecoilValue(es),o=D.useRecoilValue($),i=D.useRecoilValue(Y),a=D.useRecoilValue(et),u=D.useRecoilValue(er),s=D.useRecoilValue(ei),c=D.useRecoilValue(eo),l=(i===null||i===void 0?void 0:i.socket.connected)&&!(i===null||i===void 0?void 0:i.error),f=!l||e||(a===null||a===void 0?void 0:a.spec.type)==="file"||(a===null||a===void 0?void 0:a.spec.type)==="action";return{actions:o,askUser:a,avatars:n,chatSettingsDefaultValue:c,chatSettingsInputs:u,chatSettingsValue:s,connected:l,disabled:f,elements:t,error:i===null||i===void 0?void 0:i.error,loading:e,tasklists:r}};var ep=function(e){var t=[];var n=true,r=false,o=undefined;try{for(var i=e[Symbol.iterator](),a;!(n=(a=i.next()).done);n=true){var u=a.value;t=ey(t,u)}}catch(e){r=true;o=e}finally{try{if(!n&&i.return!=null){i.return()}}finally{if(r){throw o}}}return t},eh=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},ey=function(e,t){return em(e,t.id)?eS(e,t.id,t):"parentId"in t&&t.parentId?eg(e,t.parentId,t):"indent"in t&&t.indent&&t.indent>0?eb(e,t.indent,t):j(e).concat([t])},eb=function(e,t,n){var r=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;var o=j(e);if(o.length===0)return j(o).concat([n]);{var i=o.length-1,a=o[i];return a.steps=a.steps||[],r+1===t?(a.steps=j(a.steps).concat([n]),o[i]=m({},a),o):(a.steps=eb(a.steps,t,n,r+1),o[i]=m({},a),o)}},eg=function(e,t,n){var r=j(e);for(var o=0;o<r.length;o++){var i=r[o];V.isEqual(i.id,t)?(i.steps=i.steps?j(i.steps).concat([n]):[n],r[o]=m({},i)):em(r,t)&&i.steps&&(i.steps=eg(i.steps,t,n),r[o]=m({},i))}return r},em=function(e,t){var n=true,r=false,o=undefined;try{for(var i=e[Symbol.iterator](),a;!(n=(a=i.next()).done);n=true){var u=a.value;if(V.isEqual(u.id,t))return!0;if(u.steps&&u.steps.length>0&&em(u.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=j(e);for(var o=0;o<r.length;o++){var i=r[o];V.isEqual(i.id,t)?r[o]=m({steps:i.steps},n):em(r,t)&&i.steps&&(i.steps=eS(i.steps,t,n),r[o]=m({},i))}return r},ek=function(e,t){var n=j(e);for(var r=0;r<n.length;r++){var o=n[r];o.id===t?n=j(n.slice(0,r)).concat(j(n.slice(r+1))):em(n,t)&&o.steps&&(o.steps=ek(o.steps,t),n[r]=m({},o))}return n},ew=function(e,t,n,r){var o=j(e);for(var i=0;i<o.length;i++){var a=o[i];V.isEqual(a.id,t)?("content"in a&&a.content!==void 0?r?a.content=n:a.content+=n:"output"in a&&a.output!==void 0&&(r?a.output=n:a.output+=n),o[i]=m({},a)):a.steps&&(a.steps=ew(a.steps,t,n,r),o[i]=m({},a))}return o};var eR=function(){var e=D.useRecoilValue(el),t=D.useRecoilValue(Y),n=D.useRecoilValue(et),r=D.useRecoilValue(K),o=D.useResetRecoilState(er),i=D.useResetRecoilState(K),a=D.useResetRecoilState(ei),u=D.useSetRecoilState(ec),s=D.useSetRecoilState(ee),c=D.useSetRecoilState(Q),l=D.useSetRecoilState(ea),f=D.useSetRecoilState(eu),d=D.useSetRecoilState(es),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(),u(void 0),c([]),l([]),f([]),d([]),v([]),p(0),o(),a()},[t]),b=q.useCallback(function(e,n){c(function(t){return ey(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 ey(t,e)}),n.callback(e))},[n]),m=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]),S=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:S,setIdToResume:h,updateChatSettings:m}};var ex=function(){var e=D.useRecoilValue(Q),t=D.useRecoilValue(ec);return{messages:e,firstInteraction:t}};var eO=function(){var e=D.useRecoilValue(K),t=E(D.useRecoilState(Y),2),n=t[0],r=t[1],o=D.useResetRecoilState(ei),i=D.useSetRecoilState(ec),a=D.useSetRecoilState(ee),u=D.useSetRecoilState(Q),s=D.useSetRecoilState(et),c=D.useSetRecoilState(en),l=D.useSetRecoilState(ea),f=D.useSetRecoilState(eu),d=D.useSetRecoilState(es),v=D.useSetRecoilState($),p=D.useSetRecoilState(er),h=D.useSetRecoilState(Z),y=E(D.useRecoilState(N),2),b=y[0],g=y[1],S=D.useRecoilValue(J),w=q.useCallback(function(t){var n=t.client,y=t.userEnv,w=t.accessToken;var R=new URL(n.httpEndpoint).pathname,x=R.endsWith("/")?"ws/socket.io":"/ws/socket.io",O=G.default(n.httpEndpoint,{path:"".concat(R).concat(x),extraHeaders:{Authorization:w||"","X-Chainlit-Client-Type":n.type,"X-Chainlit-Session-Id":e,"X-Chainlit-Thread-Id":S||"","user-env":JSON.stringify(y),"X-Chainlit-Chat-Profile":b||""}});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:O}}),O.on("connect",function(){O.emit("connection_successful"),r(function(e){return k(m({},e),{error:!1})})}),O.on("connect_error",function(e){r(function(e){return k(m({},e),{error:!0})})}),O.on("task_start",function(){a(!0)}),O.on("task_end",function(){a(!1)}),O.on("reload",function(){O.emit("clear_session"),window.location.reload()}),O.on("resume_thread",function(e){var t,n;var r=[];var o=true,i=false,a=undefined;try{for(var s=e.steps[Symbol.iterator](),c;!(o=(c=s.next()).done);o=true){var v=c.value;r=ey(r,v)}}catch(e){i=true;a=e}finally{try{if(!o&&s.return!=null){s.return()}}finally{if(i){throw a}}}((t=e.metadata)===null||t===void 0?void 0:t.chat_profile)&&g((n=e.metadata)===null||n===void 0?void 0:n.chat_profile),u(r);var p=e.elements||[];f(p.filter(function(e){return e.type==="avatar"})),d(p.filter(function(e){return e.type==="tasklist"})),l(p.filter(function(e){return["avatar","tasklist"].indexOf(e.type)===-1}))}),O.on("new_message",function(e){u(function(t){return ey(t,e)})}),O.on("first_interaction",function(e){i(e)}),O.on("update_message",function(e){u(function(t){return eS(t,e.id,e)})}),O.on("delete_message",function(e){u(function(t){return ek(t,e.id)})}),O.on("stream_start",function(e){u(function(t){return ey(t,e)})}),O.on("stream_token",function(e){var t=e.id,n=e.token,r=e.isSequence;u(function(e){return ew(e,t,n,r)})}),O.on("ask",function(e,t){var n=e.msg,r=e.spec;s({spec:r,callback:t}),u(function(e){return ey(e,n)}),a(!1)}),O.on("ask_timeout",function(){s(void 0),a(!1)}),O.on("clear_ask",function(){s(void 0)}),O.on("call_fn",function(e,t){var n=e.name,r=e.args;var o=new CustomEvent("chainlit-call-fn",{detail:{name:n,args:r,callback:t}});window.dispatchEvent(o),c({name:n,args:r,callback:t})}),O.on("clear_call_fn",function(){c(void 0)}),O.on("call_fn_timeout",function(){c(void 0)}),O.on("chat_settings",function(e){p(e),o()}),O.on("element",function(t){!t.url&&t.chainlitKey&&(t.url=n.getElementUrl(t.chainlitKey,e)),t.type==="avatar"?f(function(e){var n=e.findIndex(function(e){return e.id===t.id});return n===-1?j(e).concat([t]):j(e.slice(0,n)).concat([t],j(e.slice(n+1)))}):t.type==="tasklist"?d(function(e){var n=e.findIndex(function(e){return e.id===t.id});return n===-1?j(e).concat([t]):j(e.slice(0,n)).concat([t],j(e.slice(n+1)))}):l(function(e){var n=e.findIndex(function(e){return e.id===t.id});return n===-1?j(e).concat([t]):j(e.slice(0,n)).concat([t],j(e.slice(n+1)))})}),O.on("remove_element",function(e){l(function(t){return t.filter(function(t){return t.id!==e.id})}),d(function(t){return t.filter(function(t){return t.id!==e.id})}),f(function(t){return t.filter(function(t){return t.id!==e.id})})}),O.on("action",function(e){v(function(t){return j(t).concat([e])})}),O.on("remove_action",function(e){v(function(t){var n=t.findIndex(function(t){return t.id===e.id});return n===-1?t:j(t.slice(0,n)).concat(j(t.slice(n+1)))})}),O.on("token_usage",function(e){h(function(t){return t+e})})},[r,e,b]),R=q.useCallback(V.debounce(w,200),[w]),x=q.useCallback(function(){(n===null||n===void 0?void 0:n.socket)&&(n.socket.removeAllListeners(),n.socket.close())},[n]);return{connect:R,disconnect:x,session:n,chatProfile:b,idToResume:S,setChatProfile:g}};var eE="token";function ej(){try{return localStorage.getItem(eE)}catch(e){return}}function eT(e){try{return localStorage.setItem(eE,e)}catch(e){return}}function eI(){try{return localStorage.removeItem(eE)}catch(e){return}}var e_=function(){var e=i(function(e,t,n){var r;return A(this,function(o){switch(o.label){case 0:return[4,e.get(t,n)];case 1:return[2,(r=o.sent())===null||r===void 0?void 0:r.json()]}})});return function t(t,n,r){return e.apply(this,arguments)}}();function eC(e,t,n){var r=D.useRecoilValue(el);return X.default(t?[t,r]:null,function(t){var n=E(t,2),r=n[0],o=n[1];return e_(e,r,o)},n)}var eP=function(e){var t=eC(e,"/auth/config"),n=t.data,r=t.isLoading,o=E(D.useRecoilState(el),2),a=o[0],u=o[1],s=D.useSetRecoilState(ed),c=E(D.useRecoilState(ef),2),l=c[0],f=c[1],d=!!(!r&&n),v=function(){var t=i(function(){return A(this,function(t){switch(t.label){case 0:return[4,e.logout()];case 1:t.sent(),f(null),eI(),u(""),s(void 0);return[2]}})});return function e(){return t.apply(this,arguments)}}(),p=function(e){if(!e){v();return}try{var t=H.default(e),n=t.exp,r=w(t,["exp"]);eT(e),u("Bearer ".concat(e)),f(r)}catch(e){console.error("Invalid token, clearing token from local storage","error:",e),v()}};q.useEffect(function(){if(!l&&ej()){p(ej());return}},[]);var h=!!a;return n&&!n.requireLogin?{data:n,user:null,isReady:d,isAuthenticated:!0,accessToken:"",logout:function(){},setAccessToken:function(){}}:{data:n,user:l,isAuthenticated:h,isReady:d,accessToken:a,logout:v,setAccessToken:p}};var eA=/*#__PURE__*/function(e){d(n,e);var t=P(n);function n(e,r){a(this,n);var o;o=t.call(this,e);o.detail=r;return o}c(n,[{key:"toString",value:function e(){return this.detail?"".concat(this.message,": ").concat(this.detail):this.message}}]);return n}(_(Error)),eD=/*#__PURE__*/function(){function e(t,n,r,o){a(this,e);this.httpEndpoint=t;this.type=n;this.on401=r;this.onError=o}c(e,[{key:"buildEndpoint",value:function e(e){return this.httpEndpoint.endsWith("/")?"".concat(this.httpEndpoint.slice(0,-1)).concat(e):"".concat(this.httpEndpoint).concat(e)}},{key:"checkToken",value:function e(e){var t="Bearer ";return e.startsWith(t)?e:t+e}},{key:"fetch",value:function e(e,t,n,r,o){var a=this;return i(function(){var i,u,s,c,l;return A(this,function(f){switch(f.label){case 0:f.trys.push([0,4,,5]);i={};n&&(i.Authorization=a.checkToken(n));v(r,FormData)?u=r:(i["Content-Type"]="application/json",u=r?JSON.stringify(r):null);return[4,fetch(a.buildEndpoint(t),{method:e,headers:i,signal:o,body:u})];case 1:s=f.sent();if(!!s.ok)return[3,3];return[4,s.json()];case 2:c=f.sent();throw s.status===401&&a.on401&&(eI(),a.on401()),new eA(s.statusText,c.detail);case 3:return[2,s];case 4:l=f.sent();throw v(l,eA)&&a.onError&&a.onError(l),console.error(l),l;case 5:return[2]}})})()}},{key:"get",value:function e(e,t){var n=this;return i(function(){return A(this,function(r){switch(r.label){case 0:return[4,n.fetch("GET",e,t)];case 1:return[2,r.sent()]}})})()}},{key:"post",value:function e(e,t,n,r){var o=this;return i(function(){return A(this,function(i){switch(i.label){case 0:return[4,o.fetch("POST",e,n,t,r)];case 1:return[2,i.sent()]}})})()}},{key:"put",value:function e(e,t,n){var r=this;return i(function(){return A(this,function(o){switch(o.label){case 0:return[4,r.fetch("PUT",e,n,t)];case 1:return[2,o.sent()]}})})()}},{key:"patch",value:function e(e,t,n){var r=this;return i(function(){return A(this,function(o){switch(o.label){case 0:return[4,r.fetch("PATCH",e,n,t)];case 1:return[2,o.sent()]}})})()}},{key:"delete",value:function e(e,t,n){var r=this;return i(function(){return A(this,function(o){switch(o.label){case 0:return[4,r.fetch("DELETE",e,n,t)];case 1:return[2,o.sent()]}})})()}}]);return e}(),eV=/*#__PURE__*/function(e){d(n,e);var t=P(n);function n(){a(this,n);return t.apply(this,arguments)}c(n,[{key:"headerAuth",value:function e(){var e=this;return i(function(){return A(this,function(t){switch(t.label){case 0:return[4,e.post("/auth/header",{})];case 1:return[2,t.sent().json()]}})})()}},{key:"passwordAuth",value:function e(e){var t=this;return i(function(){return A(this,function(n){switch(n.label){case 0:return[4,t.post("/login",e)];case 1:return[2,n.sent().json()]}})})()}},{key:"logout",value:function e(){var e=this;return i(function(){return A(this,function(t){switch(t.label){case 0:return[4,e.post("/logout",{})];case 1:return[2,t.sent().json()]}})})()}},{key:"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 a=this;return i(function(){var i,u,s,c;return A(this,function(l){switch(l.label){case 0:s={userEnv:t};e.type==="CHAT"?s.chatGeneration=e:s.completionGeneration=e;return[4,a.post("/generation",s,r,n.signal)];case 1:c=(u=l.sent())===null||u===void 0?void 0:(i=u.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 a=new TextDecoder("utf-8").decode(i);o&&o(r,a),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 A(this,function(r){switch(r.label){case 0:return[4,n.put("/feedback",{feedback:e},t)];case 1:return[2,r.sent().json()]}})})()}},{key:"deleteFeedback",value:function e(e,t){var n=this;return i(function(){return A(this,function(r){switch(r.label){case 0:return[4,n.delete("/feedback",{feedbackId:e},t)];case 1:return[2,r.sent().json()]}})})()}},{key:"listThreads",value:function e(e,t,n){var r=this;return i(function(){return A(this,function(o){switch(o.label){case 0:return[4,r.post("/project/threads",{pagination:e,filter:t},n)];case 1:return[2,o.sent().json()]}})})()}},{key:"deleteThread",value:function e(e,t){var n=this;return i(function(){return A(this,function(r){switch(r.label){case 0:return[4,n.delete("/project/thread",{threadId:e},t)];case 1:return[2,r.sent().json()]}})})()}},{key:"uploadFile",value:function e(e,t,n,r){var o=this;var i=new XMLHttpRequest,a=new Promise(function(a,u){var s=new FormData;s.append("file",e),i.open("POST",o.buildEndpoint("/project/file?session_id=".concat(n)),!0),r&&i.setRequestHeader("Authorization",o.checkToken(r)),i.upload.onprogress=function(e){if(e.lengthComputable){var n=e.loaded/e.total*100;t(n)}},i.onload=function(){if(i.status===200){var e=JSON.parse(i.responseText);a(e)}else u("Upload failed")},i.onerror=function(){u("Upload error")},i.send(s)});return{xhr:i,promise:a}}},{key:"getElementUrl",value:function e(e,t){var n="?session_id=".concat(t);return this.buildEndpoint("/project/file/".concat(e).concat(n))}},{key:"getLogoEndpoint",value:function e(e){return this.buildEndpoint("/logo?theme=".concat(e))}},{key:"getOAuthEndpoint",value:function e(e){return this.buildEndpoint("/auth/oauth/".concat(e))}}]);return n}(eD);Object.defineProperty(exports,"Socket",{enumerable:true,get:function e(){return U.Socket}});exports.APIBase=eD;exports.ChainlitAPI=eV;exports.ClientError=eA;exports.accessTokenState=el;exports.actionState=$;exports.addMessage=ey;exports.addMessageToParent=eg;exports.askUserState=et;exports.avatarState=eu;exports.callFnState=en;exports.chatProfileState=N;exports.chatSettingsDefaultValueSelector=eo;exports.chatSettingsInputsState=er;exports.chatSettingsValueState=ei;exports.deleteMessageById=ek;exports.elementState=ea;exports.fetcher=e_;exports.firstUserInteraction=ec;exports.hasMessageById=em;exports.isLastMessage=eh;exports.loadingState=ee;exports.messagesState=Q;exports.nestMessages=ep;exports.sessionIdState=K;exports.sessionState=Y;exports.tasklistState=es;exports.threadHistoryState=ed;exports.threadIdToResumeState=J;exports.tokenCountState=Z;exports.updateMessageById=eS;exports.updateMessageContentById=ew;exports.useApi=eC;exports.useAuth=eP;exports.useChatData=ev;exports.useChatInteract=eR;exports.useChatMessages=ex;exports.useChatSession=eO;exports.userState=ef;//# sourceMappingURL=out.js.map
|
|
1
|
+
"use strict";function e(e,t){if(t==null||t>e.length)t=e.length;for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function t(e){if(Array.isArray(e))return e}function n(t){if(Array.isArray(t))return e(t)}function r(e){if(e===void 0){throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}return e}function o(e,t,n,r,o,i,a){try{var u=e[i](a);var s=u.value}catch(e){n(e);return}if(u.done){t(s)}else{Promise.resolve(s).then(r,o)}}function i(e){return function(){var t=this,n=arguments;return new Promise(function(r,i){var a=e.apply(t,n);function u(e){o(a,r,i,u,s,"next",e)}function s(e){o(a,r,i,u,s,"throw",e)}u(undefined)})}}function a(e,t){if(!(e instanceof t)){throw new TypeError("Cannot call a class as a function")}}function u(e,t,n){if(C()){u=Reflect.construct}else{u=function e(e,t,n){var r=[null];r.push.apply(r,t);var o=Function.bind.apply(e,r);var i=new o;if(n)O(i,n.prototype);return i}}return u.apply(null,arguments)}function s(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||false;r.configurable=true;if("value"in r)r.writable=true;Object.defineProperty(e,r.key,r)}}function c(e,t,n){if(t)s(e.prototype,t);if(n)s(e,n);return e}function l(e,t,n){if(t in e){Object.defineProperty(e,t,{value:n,enumerable:true,configurable:true,writable:true})}else{e[t]=n}return e}function f(e){f=Object.setPrototypeOf?Object.getPrototypeOf:function e(e){return e.__proto__||Object.getPrototypeOf(e)};return f(e)}function d(e,t){if(typeof t!=="function"&&t!==null){throw new TypeError("Super expression must either be null or a function")}e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:true,configurable:true}});if(t)O(e,t)}function 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 a,u;try{for(n=n.call(e);!(o=(a=n.next()).done);o=true){r.push(a.value);if(t&&r.length===t)break}}catch(e){i=true;u=e}finally{try{if(!o&&n["return"]!=null)n["return"]()}finally{if(i)throw u}}return r}function 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 m(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 S(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{S(Object(t)).forEach(function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))})}return e}function w(e,t){if(e==null)return{};var n=R(e,t);var r,o;if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o<i.length;o++){r=i[o];if(t.indexOf(r)>=0)continue;if(!Object.prototype.propertyIsEnumerable.call(e,r))continue;n[r]=e[r]}}return n}function R(e,t){if(e==null)return{};var n={};var r=Object.keys(e);var o,i;for(i=0;i<r.length;i++){o=r[i];if(t.indexOf(o)>=0)continue;n[o]=e[o]}return n}function x(e,t){if(t&&(T(t)==="object"||typeof t==="function")){return t}return r(e)}function O(e,t){O=Object.setPrototypeOf||function e(e,t){e.__proto__=t;return e};return O(e,t)}function E(e,n){return t(e)||y(e,n)||I(e,n)||b()}function j(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 _(e){var t=typeof Map==="function"?new Map:undefined;_=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 u(e,arguments,f(this).constructor)}n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:false,writable:true,configurable:true}});return O(n,e)};return _(e)}function C(){if(typeof Reflect==="undefined"||!Reflect.construct)return false;if(Reflect.construct.sham)return false;if(typeof Proxy==="function")return true;try{Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}));return true}catch(e){return false}}function P(e){var t=C();return function n(){var n=f(e),r;if(t){var o=f(this).constructor;r=Reflect.construct(n,arguments,o)}else{r=n.apply(this,arguments)}return x(this,r)}}function A(e,t){var n,r,o,i,a={label:0,sent:function(){if(o[0]&1)throw o[1];return o[1]},trys:[],ops:[]};return(i={next:u(0),"throw":u(1),"return":u(2)},typeof Symbol==="function"&&(i[Symbol.iterator]=function(){return this}),i);function u(e){return function(t){return s([e,t])}}function s(i){if(n)throw new TypeError("Generator is already executing.");while(a)try{if(n=1,r&&(o=i[0]&2?r["return"]:i[0]?r["throw"]||((o=r["return"])&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;if(r=0,o)i=[i[0]&2,o.value];switch(i[0]){case 0:case 1:o=i;break;case 4:a.label++;return{value:i[1],done:false};case 5:a.label++;r=i[1];i=[0];continue;case 7:i=a.ops.pop();a.trys.pop();continue;default:if(!(o=a.trys,o=o.length>0&&o[o.length-1])&&(i[0]===6||i[0]===2)){a=0;continue}if(i[0]===3&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(i[0]===6&&a.label<o[1]){a.label=o[1];o=i;break}if(o&&a.label<o[2]){a.label=o[2];a.ops.push(i);break}if(o[2])a.ops.pop();a.trys.pop();continue}i=t.call(e,a)}catch(e){i=[6,e];r=0}finally{n=o=0}if(i[0]&5)throw i[1];return{value:i[0]?i[1]:void 0,done:true}}}var D=require("recoil");var V=require("lodash");var M=require("uuid");var q=require("react");var U=require("socket.io-client");var F=require("jwt-decode");var L=require("swr");function B(e){return e&&e.__esModule?e:{default:e}}var G=/*#__PURE__*/B(U);var H=/*#__PURE__*/B(F);var X=/*#__PURE__*/B(L);var z=function(e){var t={},n=new Date,r=new Date;r.setDate(n.getDate()-1);var o=new Date;o.setDate(n.getDate()-7);var i=new Date;return i.setDate(n.getDate()-30),e.forEach(function(e){var a=new Date(e.createdAt),u=a.toDateString()===n.toDateString(),s=a.toDateString()===r.toDateString(),c=a>=o,l=a>=i,f;u?f="Today":s?f="Yesterday":c?f="Previous 7 days":l?f="Previous 30 days":f=a.toLocaleString("default",{month:"long",year:"numeric"}).split(" ").slice(0,1).join(" "),t[f]||(t[f]=[]),t[f].push(e)}),t};var J=D.atom({key:"ThreadIdToResume",default:void 0}),N=D.atom({key:"ChatProfile",default:void 0}),W=D.atom({key:"SessionId",default:M.v4()}),K=D.selector({key:"SessionIdSelector",get:function(e){var t=e.get;return t(W)},set:function(e,t){var n=e.set;return n(W,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:"CallFn",default:void 0}),er=D.atom({key:"ChatSettings",default:[]}),eo=D.selector({key:"ChatSettingsValue/Default",get:function(e){var t=e.get;return t(er).reduce(function(e,t){return e[t.id]=t.initial,e},{})}}),ei=D.atom({key:"ChatSettingsValue",default:eo}),ea=D.atom({key:"DisplayElements",default:[]}),eu=D.atom({key:"AvatarElements",default:[]}),es=D.atom({key:"TasklistElements",default:[]}),ec=D.atom({key:"FirstUserInteraction",default:void 0}),el=D.atom({key:"AccessToken",default:void 0}),ef=D.atom({key:"User",default:null}),ed=D.atom({key:"ThreadHistory",default:{threads:void 0,currentThreadId:void 0,timeGroupedThreads:void 0,pageInfo:void 0},effects:[function(e){var t=e.setSelf,n=e.onSet;n(function(e,n){var r=e===null||e===void 0?void 0:e.timeGroupedThreads;(e===null||e===void 0?void 0:e.threads)&&!V.isEqual(e.threads,n===null||n===void 0?void 0:n.timeGroupedThreads)&&(r=z(e.threads)),t(k(m({},e),{timeGroupedThreads:r}))})}]}),ev=D.atom({key:"SideView",default:void 0});var ep=function(){var e=D.useRecoilValue(ee),t=D.useRecoilValue(ea),n=D.useRecoilValue(eu),r=D.useRecoilValue(es),o=D.useRecoilValue($),i=D.useRecoilValue(Y),a=D.useRecoilValue(et),u=D.useRecoilValue(er),s=D.useRecoilValue(ei),c=D.useRecoilValue(eo),l=(i===null||i===void 0?void 0:i.socket.connected)&&!(i===null||i===void 0?void 0:i.error),f=!l||e||(a===null||a===void 0?void 0:a.spec.type)==="file"||(a===null||a===void 0?void 0:a.spec.type)==="action";return{actions:o,askUser:a,avatars:n,chatSettingsDefaultValue:c,chatSettingsInputs:u,chatSettingsValue:s,connected:l,disabled:f,elements:t,error:i===null||i===void 0?void 0:i.error,loading:e,tasklists:r}};var eh=function(e){var t=[];var n=true,r=false,o=undefined;try{for(var i=e[Symbol.iterator](),a;!(n=(a=i.next()).done);n=true){var u=a.value;t=eb(t,u)}}catch(e){r=true;o=e}finally{try{if(!n&&i.return!=null){i.return()}}finally{if(r){throw o}}}return t},ey=function(e,t){if(e.length-1===t)return!0;for(var n=t+1;n<e.length;n++)if(!e[n].streaming)return!1;return!0},eb=function(e,t){return eS(e,t.id)?ek(e,t.id,t):"parentId"in t&&t.parentId?em(e,t.parentId,t):"indent"in t&&t.indent&&t.indent>0?eg(e,t.indent,t):j(e).concat([t])},eg=function(e,t,n){var r=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0;var o=j(e);if(o.length===0)return j(o).concat([n]);{var i=o.length-1,a=o[i];return a.steps=a.steps||[],r+1===t?(a.steps=j(a.steps).concat([n]),o[i]=m({},a),o):(a.steps=eg(a.steps,t,n,r+1),o[i]=m({},a),o)}},em=function(e,t,n){var r=j(e);for(var o=0;o<r.length;o++){var i=r[o];V.isEqual(i.id,t)?(i.steps=i.steps?j(i.steps).concat([n]):[n],r[o]=m({},i)):eS(r,t)&&i.steps&&(i.steps=em(i.steps,t,n),r[o]=m({},i))}return r},eS=function(e,t){var n=true,r=false,o=undefined;try{for(var i=e[Symbol.iterator](),a;!(n=(a=i.next()).done);n=true){var u=a.value;if(V.isEqual(u.id,t))return!0;if(u.steps&&u.steps.length>0&&eS(u.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},ek=function(e,t,n){var r=j(e);for(var o=0;o<r.length;o++){var i=r[o];V.isEqual(i.id,t)?r[o]=m({steps:i.steps},n):eS(r,t)&&i.steps&&(i.steps=ek(i.steps,t,n),r[o]=m({},i))}return r},ew=function(e,t){var n=j(e);for(var r=0;r<n.length;r++){var o=n[r];o.id===t?n=j(n.slice(0,r)).concat(j(n.slice(r+1))):eS(n,t)&&o.steps&&(o.steps=ew(o.steps,t),n[r]=m({},o))}return n},eR=function(e,t,n,r){var o=j(e);for(var i=0;i<o.length;i++){var a=o[i];V.isEqual(a.id,t)?("content"in a&&a.content!==void 0?r?a.content=n:a.content+=n:"output"in a&&a.output!==void 0&&(r?a.output=n:a.output+=n),o[i]=m({},a)):a.steps&&(a.steps=eR(a.steps,t,n,r),o[i]=m({},a))}return o};var ex=function(){var e=D.useRecoilValue(el),t=D.useRecoilValue(Y),n=D.useRecoilValue(et),r=D.useRecoilValue(K),o=D.useResetRecoilState(er),i=D.useResetRecoilState(K),a=D.useResetRecoilState(ei),u=D.useSetRecoilState(ec),s=D.useSetRecoilState(ee),c=D.useSetRecoilState(Q),l=D.useSetRecoilState(ea),f=D.useSetRecoilState(eu),d=D.useSetRecoilState(es),v=D.useSetRecoilState($),p=D.useSetRecoilState(Z),h=D.useSetRecoilState(J),y=D.useSetRecoilState(ev),b=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(),u(void 0),c([]),l([]),f([]),d([]),v([]),p(0),o(),a(),y(void 0)},[t]),g=q.useCallback(function(e,n){c(function(t){return eb(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]),m=q.useCallback(function(e){n&&(c(function(t){return eb(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]),k=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]),w=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:w,clear:b,replyMessage:m,sendMessage:g,stopTask:k,setIdToResume:h,updateChatSettings:S}};var eO=function(){var e=D.useRecoilValue(Q),t=D.useRecoilValue(ec);return{messages:e,firstInteraction:t}};var eE=function(){var e=D.useRecoilValue(K),t=E(D.useRecoilState(Y),2),n=t[0],r=t[1],o=D.useResetRecoilState(ei),i=D.useSetRecoilState(ec),a=D.useSetRecoilState(ee),u=D.useSetRecoilState(Q),s=D.useSetRecoilState(et),c=D.useSetRecoilState(en),l=D.useSetRecoilState(ea),f=D.useSetRecoilState(eu),d=D.useSetRecoilState(es),v=D.useSetRecoilState($),p=D.useSetRecoilState(er),h=D.useSetRecoilState(Z),y=E(D.useRecoilState(N),2),b=y[0],g=y[1],S=D.useRecoilValue(J),w=q.useCallback(function(t){var n=t.client,y=t.userEnv,w=t.accessToken;var R=new URL(n.httpEndpoint).pathname,x=R.endsWith("/")?"ws/socket.io":"/ws/socket.io",O=G.default(n.httpEndpoint,{path:"".concat(R).concat(x),extraHeaders:{Authorization:w||"","X-Chainlit-Client-Type":n.type,"X-Chainlit-Session-Id":e,"X-Chainlit-Thread-Id":S||"","user-env":JSON.stringify(y),"X-Chainlit-Chat-Profile":b||""}});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:O}}),O.on("connect",function(){O.emit("connection_successful"),r(function(e){return k(m({},e),{error:!1})})}),O.on("connect_error",function(e){r(function(e){return k(m({},e),{error:!0})})}),O.on("task_start",function(){a(!0)}),O.on("task_end",function(){a(!1)}),O.on("reload",function(){O.emit("clear_session"),window.location.reload()}),O.on("resume_thread",function(e){var t,n;var r=[];var o=true,i=false,a=undefined;try{for(var s=e.steps[Symbol.iterator](),c;!(o=(c=s.next()).done);o=true){var v=c.value;r=eb(r,v)}}catch(e){i=true;a=e}finally{try{if(!o&&s.return!=null){s.return()}}finally{if(i){throw a}}}((t=e.metadata)===null||t===void 0?void 0:t.chat_profile)&&g((n=e.metadata)===null||n===void 0?void 0:n.chat_profile),u(r);var p=e.elements||[];f(p.filter(function(e){return e.type==="avatar"})),d(p.filter(function(e){return e.type==="tasklist"})),l(p.filter(function(e){return["avatar","tasklist"].indexOf(e.type)===-1}))}),O.on("new_message",function(e){u(function(t){return eb(t,e)})}),O.on("first_interaction",function(e){i(e)}),O.on("update_message",function(e){u(function(t){return ek(t,e.id,e)})}),O.on("delete_message",function(e){u(function(t){return ew(t,e.id)})}),O.on("stream_start",function(e){u(function(t){return eb(t,e)})}),O.on("stream_token",function(e){var t=e.id,n=e.token,r=e.isSequence;u(function(e){return eR(e,t,n,r)})}),O.on("ask",function(e,t){var n=e.msg,r=e.spec;s({spec:r,callback:t}),u(function(e){return eb(e,n)}),a(!1)}),O.on("ask_timeout",function(){s(void 0),a(!1)}),O.on("clear_ask",function(){s(void 0)}),O.on("call_fn",function(e,t){var n=e.name,r=e.args;var o=new CustomEvent("chainlit-call-fn",{detail:{name:n,args:r,callback:t}});window.dispatchEvent(o),c({name:n,args:r,callback:t})}),O.on("clear_call_fn",function(){c(void 0)}),O.on("call_fn_timeout",function(){c(void 0)}),O.on("chat_settings",function(e){p(e),o()}),O.on("element",function(t){!t.url&&t.chainlitKey&&(t.url=n.getElementUrl(t.chainlitKey,e)),t.type==="avatar"?f(function(e){var n=e.findIndex(function(e){return e.id===t.id});return n===-1?j(e).concat([t]):j(e.slice(0,n)).concat([t],j(e.slice(n+1)))}):t.type==="tasklist"?d(function(e){var n=e.findIndex(function(e){return e.id===t.id});return n===-1?j(e).concat([t]):j(e.slice(0,n)).concat([t],j(e.slice(n+1)))}):l(function(e){var n=e.findIndex(function(e){return e.id===t.id});return n===-1?j(e).concat([t]):j(e.slice(0,n)).concat([t],j(e.slice(n+1)))})}),O.on("remove_element",function(e){l(function(t){return t.filter(function(t){return t.id!==e.id})}),d(function(t){return t.filter(function(t){return t.id!==e.id})}),f(function(t){return t.filter(function(t){return t.id!==e.id})})}),O.on("action",function(e){v(function(t){return j(t).concat([e])})}),O.on("remove_action",function(e){v(function(t){var n=t.findIndex(function(t){return t.id===e.id});return n===-1?t:j(t.slice(0,n)).concat(j(t.slice(n+1)))})}),O.on("token_usage",function(e){h(function(t){return t+e})})},[r,e,b]),R=q.useCallback(V.debounce(w,200),[w]),x=q.useCallback(function(){(n===null||n===void 0?void 0:n.socket)&&(n.socket.removeAllListeners(),n.socket.close())},[n]);return{connect:R,disconnect:x,session:n,sessionId:e,chatProfile:b,idToResume:S,setChatProfile:g}};var ej="token";function eT(){try{return localStorage.getItem(ej)}catch(e){return}}function eI(e){try{return localStorage.setItem(ej,e)}catch(e){return}}function e_(){try{return localStorage.removeItem(ej)}catch(e){return}}var eC=function(){var e=i(function(e,t,n){var r;return A(this,function(o){switch(o.label){case 0:return[4,e.get(t,n)];case 1:return[2,(r=o.sent())===null||r===void 0?void 0:r.json()]}})});return function t(t,n,r){return e.apply(this,arguments)}}();function eP(e,t,n){var r=D.useRecoilValue(el);return X.default(t?[t,r]:null,function(t){var n=E(t,2),r=n[0],o=n[1];return eC(e,r,o)},n)}var eA=function(e){var t=eP(e,"/auth/config"),n=t.data,r=t.isLoading,o=E(D.useRecoilState(el),2),a=o[0],u=o[1],s=D.useSetRecoilState(ed),c=E(D.useRecoilState(ef),2),l=c[0],f=c[1],d=!!(!r&&n),v=function(){var t=i(function(){return A(this,function(t){switch(t.label){case 0:return[4,e.logout()];case 1:t.sent(),f(null),e_(),u(""),s(void 0);return[2]}})});return function e(){return t.apply(this,arguments)}}(),p=function(e){if(!e){v();return}try{var t=H.default(e),n=t.exp,r=w(t,["exp"]);eI(e),u("Bearer ".concat(e)),f(r)}catch(e){console.error("Invalid token, clearing token from local storage","error:",e),v()}};q.useEffect(function(){if(!l&&eT()){p(eT());return}},[]);var h=!!a;return n&&!n.requireLogin?{data:n,user:null,isReady:d,isAuthenticated:!0,accessToken:"",logout:function(){},setAccessToken:function(){}}:{data:n,user:l,isAuthenticated:h,isReady:d,accessToken:a,logout:v,setAccessToken:p}};var eD=/*#__PURE__*/function(e){d(n,e);var t=P(n);function n(e,r){a(this,n);var o;o=t.call(this,e);o.detail=r;return o}c(n,[{key:"toString",value:function e(){return this.detail?"".concat(this.message,": ").concat(this.detail):this.message}}]);return n}(_(Error)),eV=/*#__PURE__*/function(){function e(t,n,r,o){a(this,e);this.httpEndpoint=t;this.type=n;this.on401=r;this.onError=o}c(e,[{key:"buildEndpoint",value:function e(e){return this.httpEndpoint.endsWith("/")?"".concat(this.httpEndpoint.slice(0,-1)).concat(e):"".concat(this.httpEndpoint).concat(e)}},{key:"checkToken",value:function e(e){var t="Bearer ";return e.startsWith(t)?e:t+e}},{key:"fetch",value:function e(e,t,n,r,o){var a=this;return i(function(){var i,u,s,c,l;return A(this,function(f){switch(f.label){case 0:f.trys.push([0,4,,5]);i={};n&&(i.Authorization=a.checkToken(n));v(r,FormData)?u=r:(i["Content-Type"]="application/json",u=r?JSON.stringify(r):null);return[4,fetch(a.buildEndpoint(t),{method:e,headers:i,signal:o,body:u})];case 1:s=f.sent();if(!!s.ok)return[3,3];return[4,s.json()];case 2:c=f.sent();throw s.status===401&&a.on401&&(e_(),a.on401()),new eD(s.statusText,c.detail);case 3:return[2,s];case 4:l=f.sent();throw v(l,eD)&&a.onError&&a.onError(l),console.error(l),l;case 5:return[2]}})})()}},{key:"get",value:function e(e,t){var n=this;return i(function(){return A(this,function(r){switch(r.label){case 0:return[4,n.fetch("GET",e,t)];case 1:return[2,r.sent()]}})})()}},{key:"post",value:function e(e,t,n,r){var o=this;return i(function(){return A(this,function(i){switch(i.label){case 0:return[4,o.fetch("POST",e,n,t,r)];case 1:return[2,i.sent()]}})})()}},{key:"put",value:function e(e,t,n){var r=this;return i(function(){return A(this,function(o){switch(o.label){case 0:return[4,r.fetch("PUT",e,n,t)];case 1:return[2,o.sent()]}})})()}},{key:"patch",value:function e(e,t,n){var r=this;return i(function(){return A(this,function(o){switch(o.label){case 0:return[4,r.fetch("PATCH",e,n,t)];case 1:return[2,o.sent()]}})})()}},{key:"delete",value:function e(e,t,n){var r=this;return i(function(){return A(this,function(o){switch(o.label){case 0:return[4,r.fetch("DELETE",e,n,t)];case 1:return[2,o.sent()]}})})()}}]);return e}(),eM=/*#__PURE__*/function(e){d(n,e);var t=P(n);function n(){a(this,n);return t.apply(this,arguments)}c(n,[{key:"headerAuth",value:function e(){var e=this;return i(function(){return A(this,function(t){switch(t.label){case 0:return[4,e.post("/auth/header",{})];case 1:return[2,t.sent().json()]}})})()}},{key:"passwordAuth",value:function e(e){var t=this;return i(function(){return A(this,function(n){switch(n.label){case 0:return[4,t.post("/login",e)];case 1:return[2,n.sent().json()]}})})()}},{key:"logout",value:function e(){var e=this;return i(function(){return A(this,function(t){switch(t.label){case 0:return[4,e.post("/logout",{})];case 1:return[2,t.sent().json()]}})})()}},{key:"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 a=this;return i(function(){var i,u,s,c;return A(this,function(l){switch(l.label){case 0:s={userEnv:t};e.type==="CHAT"?s.chatGeneration=e:s.completionGeneration=e;return[4,a.post("/generation",s,r,n.signal)];case 1:c=(u=l.sent())===null||u===void 0?void 0:(i=u.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 a=new TextDecoder("utf-8").decode(i);o&&o(r,a),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 A(this,function(r){switch(r.label){case 0:return[4,n.put("/feedback",{feedback:e},t)];case 1:return[2,r.sent().json()]}})})()}},{key:"deleteFeedback",value:function e(e,t){var n=this;return i(function(){return A(this,function(r){switch(r.label){case 0:return[4,n.delete("/feedback",{feedbackId:e},t)];case 1:return[2,r.sent().json()]}})})()}},{key:"listThreads",value:function e(e,t,n){var r=this;return i(function(){return A(this,function(o){switch(o.label){case 0:return[4,r.post("/project/threads",{pagination:e,filter:t},n)];case 1:return[2,o.sent().json()]}})})()}},{key:"deleteThread",value:function e(e,t){var n=this;return i(function(){return A(this,function(r){switch(r.label){case 0:return[4,n.delete("/project/thread",{threadId:e},t)];case 1:return[2,r.sent().json()]}})})()}},{key:"uploadFile",value:function e(e,t,n,r){var o=this;var i=new XMLHttpRequest,a=new Promise(function(a,u){var s=new FormData;s.append("file",e),i.open("POST",o.buildEndpoint("/project/file?session_id=".concat(n)),!0),r&&i.setRequestHeader("Authorization",o.checkToken(r)),i.upload.onprogress=function(e){if(e.lengthComputable){var n=e.loaded/e.total*100;t(n)}},i.onload=function(){if(i.status===200){var e=JSON.parse(i.responseText);a(e)}else u("Upload failed")},i.onerror=function(){u("Upload error")},i.send(s)});return{xhr:i,promise:a}}},{key:"getElementUrl",value:function e(e,t){var n="?session_id=".concat(t);return this.buildEndpoint("/project/file/".concat(e).concat(n))}},{key:"getLogoEndpoint",value:function e(e){return this.buildEndpoint("/logo?theme=".concat(e))}},{key:"getOAuthEndpoint",value:function e(e){return this.buildEndpoint("/auth/oauth/".concat(e))}}]);return n}(eV);Object.defineProperty(exports,"Socket",{enumerable:true,get:function e(){return U.Socket}});exports.APIBase=eV;exports.ChainlitAPI=eM;exports.ClientError=eD;exports.accessTokenState=el;exports.actionState=$;exports.addMessage=eb;exports.addMessageToParent=em;exports.askUserState=et;exports.avatarState=eu;exports.callFnState=en;exports.chatProfileState=N;exports.chatSettingsDefaultValueSelector=eo;exports.chatSettingsInputsState=er;exports.chatSettingsValueState=ei;exports.deleteMessageById=ew;exports.elementState=ea;exports.fetcher=eC;exports.firstUserInteraction=ec;exports.hasMessageById=eS;exports.isLastMessage=ey;exports.loadingState=ee;exports.messagesState=Q;exports.nestMessages=eh;exports.sessionIdState=K;exports.sessionState=Y;exports.sideViewState=ev;exports.tasklistState=es;exports.threadHistoryState=ed;exports.threadIdToResumeState=J;exports.tokenCountState=Z;exports.updateMessageById=ek;exports.updateMessageContentById=eR;exports.useApi=eP;exports.useAuth=eA;exports.useChatData=ep;exports.useChatInteract=ex;exports.useChatMessages=eO;exports.useChatSession=eE;exports.userState=ef;//# sourceMappingURL=out.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/useChatData.ts","../src/state.ts","../src/utils/group.ts","../src/useChatInteract.ts","../src/utils/message.ts","../src/useChatMessages.ts","../src/useChatSession.ts","../src/utils/token.ts","../src/api/hooks/auth.ts","../src/api/hooks/api.ts","../src/api/index.tsx","../src/index.ts"],"names":["useRecoilValue","isEqual","DefaultValue","atom","selector","uuidv4","groupByDate","data","groupedData","today","yesterday","sevenDaysAgo","thirtyDaysAgo","item","createdAt","isToday","isYesterday","isLast7Days","isLast30Days","category","threadIdToResumeState","chatProfileState","sessionIdAtom","sessionIdState","get","set","newValue","sessionState","actionState","messagesState","tokenCountState","loadingState","askUserState","callFnState","chatSettingsInputsState","chatSettingsDefaultValueSelector","form","input","chatSettingsValueState","elementState","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","setCallFn","setChatSettingsInputs","chatProfile","setChatProfile","idToResume","_connect","userEnv","pathname","socketPath","old","s","_","thread","step","e","interaction","id","token","spec","callback","name","args","event","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","type","on401","onError","prefix","method","signal","headers","body","res","error","ChainlitAPI","generation","controller","tokenCb","payload","reader","push","done","value","string","err","feedback","feedbackId","pagination","filter","threadId","xhr","formData","percentage","queryParams","theme","provider","Socket"],"mappings":"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","sourcesContent":["import { useRecoilValue } from 'recoil';\n\nimport {\n actionState,\n askUserState,\n 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 ICallFn,\n IMessageElement,\n IStep,\n ITasklistElement,\n IUser,\n ThreadHistory\n} from './types';\nimport { groupByDate } from './utils/group';\n\nexport interface ISession {\n socket: Socket;\n error?: boolean;\n}\n\nexport const threadIdToResumeState = atom<string | undefined>({\n key: 'ThreadIdToResume',\n default: undefined\n});\n\nexport const chatProfileState = atom<string | undefined>({\n key: 'ChatProfile',\n default: undefined\n});\n\nconst sessionIdAtom = atom<string>({\n key: 'SessionId',\n default: uuidv4()\n});\n\nexport const sessionIdState = selector({\n key: 'SessionIdSelector',\n get: ({ get }) => get(sessionIdAtom),\n set: ({ set }, newValue) =>\n set(sessionIdAtom, newValue instanceof DefaultValue ? uuidv4() : newValue)\n});\n\nexport const sessionState = atom<ISession | undefined>({\n key: 'Session',\n dangerouslyAllowMutability: true,\n default: undefined\n});\n\nexport const actionState = atom<IAction[]>({\n key: 'Actions',\n default: []\n});\n\nexport const messagesState = atom<IStep[]>({\n key: 'Messages',\n dangerouslyAllowMutability: true,\n default: []\n});\n\nexport const tokenCountState = atom<number>({\n key: 'TokenCount',\n default: 0\n});\n\nexport const loadingState = atom<boolean>({\n key: 'Loading',\n default: false\n});\n\nexport const askUserState = atom<IAsk | undefined>({\n key: 'AskUser',\n default: undefined\n});\n\nexport const callFnState = atom<ICallFn | undefined>({\n key: 'CallFn',\n default: undefined\n});\n\nexport const chatSettingsInputsState = atom<any>({\n key: 'ChatSettings',\n default: []\n});\n\nexport const chatSettingsDefaultValueSelector = selector({\n key: 'ChatSettingsValue/Default',\n get: ({ get }) => {\n const chatSettings = get(chatSettingsInputsState);\n return chatSettings.reduce(\n (form: { [key: string]: any }, input: any) => (\n (form[input.id] = input.initial), form\n ),\n {}\n );\n }\n});\n\nexport const chatSettingsValueState = atom({\n key: 'ChatSettingsValue',\n default: chatSettingsDefaultValueSelector\n});\n\nexport const elementState = atom<IMessageElement[]>({\n key: 'DisplayElements',\n default: []\n});\n\nexport const 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 callFnState,\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 setCallFn = useSetRecoilState(callFnState);\n\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 pathname = new URL(client.httpEndpoint).pathname;\n const socketPath = pathname.endsWith('/')\n ? 'ws/socket.io'\n : '/ws/socket.io';\n const socket = io(client.httpEndpoint, {\n path: `${pathname}${socketPath}`,\n extraHeaders: {\n Authorization: accessToken || '',\n 'X-Chainlit-Client-Type': client.type,\n 'X-Chainlit-Session-Id': sessionId,\n 'X-Chainlit-Thread-Id': idToResume || '',\n 'user-env': JSON.stringify(userEnv),\n 'X-Chainlit-Chat-Profile': chatProfile || ''\n }\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('call_fn', ({ name, args }, callback) => {\n const event = new CustomEvent('chainlit-call-fn', {\n detail: {\n name,\n args,\n callback\n }\n });\n window.dispatchEvent(event);\n\n setCallFn({ name, args, callback });\n });\n\n socket.on('clear_call_fn', () => {\n setCallFn(undefined);\n });\n\n socket.on('call_fn_timeout', () => {\n setCallFn(undefined);\n });\n\n socket.on('chat_settings', (inputs: any) => {\n setChatSettingsInputs(inputs);\n resetChatSettingsValue();\n });\n\n socket.on('element', (element: IElement) => {\n if (!element.url && element.chainlitKey) {\n element.url = client.getElementUrl(element.chainlitKey, sessionId);\n }\n\n if (element.type === '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 = async () => {\n await apiClient.logout();\n setUser(null);\n removeToken();\n setAccessToken('');\n setThreadHistory(undefined);\n };\n\n const saveAndSetToken = (token: string | null | undefined) => {\n if (!token) {\n logout();\n return;\n }\n try {\n const { exp, ...User } = jwt_decode(token) as any;\n setToken(token);\n setAccessToken(`Bearer ${token}`);\n setUser(User as IUser);\n } catch (e) {\n console.error(\n 'Invalid token, clearing token from local storage',\n 'error:',\n e\n );\n logout();\n }\n };\n\n useEffect(() => {\n if (!user && getToken()) {\n // Initialize the token from local storage\n saveAndSetToken(getToken());\n return;\n }\n }, []);\n\n const isAuthenticated = !!accessToken;\n\n if (data && !data.requireLogin) {\n return {\n data,\n user: null,\n isReady,\n isAuthenticated: true,\n accessToken: '',\n logout: () => {},\n setAccessToken: () => {}\n };\n }\n\n return {\n data,\n user: user,\n isAuthenticated,\n isReady,\n accessToken: accessToken,\n logout: logout,\n setAccessToken: saveAndSetToken\n };\n};\n","import { useRecoilValue } from 'recoil';\nimport { ChainlitAPI } from 'src/api';\nimport { accessTokenState } from 'src/state';\nimport useSWR, { SWRConfiguration } from 'swr';\n\nconst fetcher = async (\n client: ChainlitAPI,\n endpoint: string,\n token?: string\n) => {\n const res = await client.get(endpoint, token);\n\n return res?.json();\n};\n\nfunction useApi<T>(\n client: ChainlitAPI,\n path?: string | null,\n options?: SWRConfiguration\n) {\n const accessToken = useRecoilValue(accessTokenState);\n\n return useSWR<T, Error>(\n path ? [path, accessToken] : null,\n ([url, token]: [url: string, token: string]) => fetcher(client, url, token),\n options\n );\n}\n\nexport { useApi, fetcher };\n","import { 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 type: 'app' | 'copilot' | 'teams' | 'slack',\n public on401?: () => void,\n public onError?: (error: ClientError) => void\n ) {}\n\n buildEndpoint(path: string) {\n if (this.httpEndpoint.endsWith('/')) {\n // remove trailing slash on httpEndpoint\n return `${this.httpEndpoint.slice(0, -1)}${path}`;\n } else {\n return `${this.httpEndpoint}${path}`;\n }\n }\n\n checkToken(token: string) {\n const prefix = 'Bearer ';\n if (token.startsWith(prefix)) {\n return token;\n } else {\n return prefix + token;\n }\n }\n\n async fetch(\n method: string,\n path: string,\n token?: string,\n data?: Payload,\n signal?: AbortSignal\n ): Promise<Response> {\n try {\n const headers: { Authorization?: string; 'Content-Type'?: string } = {};\n if (token) headers['Authorization'] = this.checkToken(token); // Assuming token is a bearer token\n\n let body;\n\n if (data instanceof FormData) {\n body = data;\n } else {\n headers['Content-Type'] = 'application/json';\n body = data ? JSON.stringify(data) : null;\n }\n\n const res = await fetch(this.buildEndpoint(path), {\n method,\n headers,\n signal,\n body\n });\n\n if (!res.ok) {\n const body = await res.json();\n if (res.status === 401 && this.on401) {\n removeToken();\n this.on401();\n }\n throw new ClientError(res.statusText, body.detail);\n }\n\n return res;\n } catch (error: any) {\n if (error instanceof ClientError && this.onError) {\n this.onError(error);\n }\n console.error(error);\n throw error;\n }\n }\n\n async get(endpoint: string, token?: string) {\n return await this.fetch('GET', endpoint, token);\n }\n\n async post(\n endpoint: string,\n data: Payload,\n token?: string,\n signal?: AbortSignal\n ) {\n return await this.fetch('POST', endpoint, token, data, signal);\n }\n\n async put(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PUT', endpoint, token, data);\n }\n\n async patch(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PATCH', endpoint, token, data);\n }\n\n async delete(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('DELETE', endpoint, token, data);\n }\n}\n\nexport class ChainlitAPI extends APIBase {\n async headerAuth() {\n const res = await this.post(`/auth/header`, {});\n return res.json();\n }\n\n async passwordAuth(data: FormData) {\n const res = await this.post(`/login`, data);\n return res.json();\n }\n\n async logout() {\n const res = await this.post(`/logout`, {});\n return res.json();\n }\n\n async 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 deleteFeedback(\n feedbackId: string,\n accessToken?: string\n ): Promise<{ success: boolean }> {\n const res = await this.delete(`/feedback`, { feedbackId }, accessToken);\n return res.json();\n }\n\n async listThreads(\n pagination: IPagination,\n filter: IThreadFilters,\n accessToken?: string\n ): Promise<{\n pageInfo: IPageInfo;\n data: IThread[];\n }> {\n const res = await this.post(\n `/project/threads`,\n { pagination, filter },\n accessToken\n );\n\n return res.json();\n }\n\n async deleteThread(threadId: string, accessToken?: string) {\n const res = await this.delete(`/project/thread`, { threadId }, accessToken);\n\n return res.json();\n }\n\n uploadFile(\n file: File,\n onProgress: (progress: number) => void,\n sessionId: string,\n token?: string\n ) {\n const xhr = new XMLHttpRequest();\n\n const promise = new Promise<{ id: string }>((resolve, reject) => {\n const formData = new FormData();\n formData.append('file', file);\n\n xhr.open(\n 'POST',\n this.buildEndpoint(`/project/file?session_id=${sessionId}`),\n true\n );\n\n if (token) {\n xhr.setRequestHeader('Authorization', this.checkToken(token));\n }\n\n // Track the progress of the upload\n xhr.upload.onprogress = function (event) {\n if (event.lengthComputable) {\n const percentage = (event.loaded / event.total) * 100;\n onProgress(percentage);\n }\n };\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n const response = JSON.parse(xhr.responseText);\n resolve(response);\n } else {\n reject('Upload failed');\n }\n };\n\n xhr.onerror = function () {\n reject('Upload error');\n };\n\n xhr.send(formData);\n });\n\n return { xhr, promise };\n }\n\n getElementUrl(id: string, sessionId: string) {\n const queryParams = `?session_id=${sessionId}`;\n return this.buildEndpoint(`/project/file/${id}${queryParams}`);\n }\n\n getLogoEndpoint(theme: string) {\n return this.buildEndpoint(`/logo?theme=${theme}`);\n }\n\n getOAuthEndpoint(provider: string) {\n return this.buildEndpoint(`/auth/oauth/${provider}`);\n }\n}\n","export * from './useChatData';\nexport * from './useChatInteract';\nexport * from './useChatMessages';\nexport * from './useChatSession';\nexport * from './api';\nexport * from './types';\nexport * from './state';\nexport * from './utils/message';\n\nexport { Socket } from 'socket.io-client';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/useChatData.ts","../src/state.ts","../src/utils/group.ts","../src/useChatInteract.ts","../src/utils/message.ts","../src/useChatMessages.ts","../src/useChatSession.ts","../src/utils/token.ts","../src/api/hooks/auth.ts","../src/api/hooks/api.ts","../src/api/index.tsx","../src/index.ts"],"names":["useRecoilValue","isEqual","DefaultValue","atom","selector","uuidv4","groupByDate","data","groupedData","today","yesterday","sevenDaysAgo","thirtyDaysAgo","item","createdAt","isToday","isYesterday","isLast7Days","isLast30Days","category","threadIdToResumeState","chatProfileState","sessionIdAtom","sessionIdState","get","set","newValue","sessionState","actionState","messagesState","tokenCountState","loadingState","askUserState","callFnState","chatSettingsInputsState","chatSettingsDefaultValueSelector","form","input","chatSettingsValueState","elementState","avatarState","tasklistState","firstUserInteraction","accessTokenState","userState","threadHistoryState","setSelf","onSet","oldValue","timeGroupedThreads","sideViewState","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","setSideView","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","setCallFn","setChatSettingsInputs","chatProfile","setChatProfile","idToResume","_connect","userEnv","pathname","socketPath","old","s","_","thread","step","e","interaction","id","token","spec","callback","name","args","event","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","type","on401","onError","prefix","method","signal","headers","body","res","error","ChainlitAPI","generation","controller","tokenCb","payload","reader","push","done","value","string","err","feedback","feedbackId","pagination","filter","threadId","xhr","formData","percentage","queryParams","theme","provider","Socket"],"mappings":"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","sourcesContent":["import { useRecoilValue } from 'recoil';\n\nimport {\n actionState,\n askUserState,\n 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 ICallFn,\n IMessageElement,\n IStep,\n ITasklistElement,\n IUser,\n ThreadHistory\n} from './types';\nimport { groupByDate } from './utils/group';\n\nexport interface ISession {\n socket: Socket;\n error?: boolean;\n}\n\nexport const threadIdToResumeState = atom<string | undefined>({\n key: 'ThreadIdToResume',\n default: undefined\n});\n\nexport const chatProfileState = atom<string | undefined>({\n key: 'ChatProfile',\n default: undefined\n});\n\nconst sessionIdAtom = atom<string>({\n key: 'SessionId',\n default: uuidv4()\n});\n\nexport const sessionIdState = selector({\n key: 'SessionIdSelector',\n get: ({ get }) => get(sessionIdAtom),\n set: ({ set }, newValue) =>\n set(sessionIdAtom, newValue instanceof DefaultValue ? uuidv4() : newValue)\n});\n\nexport const sessionState = atom<ISession | undefined>({\n key: 'Session',\n dangerouslyAllowMutability: true,\n default: undefined\n});\n\nexport const actionState = atom<IAction[]>({\n key: 'Actions',\n default: []\n});\n\nexport const messagesState = atom<IStep[]>({\n key: 'Messages',\n dangerouslyAllowMutability: true,\n default: []\n});\n\nexport const tokenCountState = atom<number>({\n key: 'TokenCount',\n default: 0\n});\n\nexport const loadingState = atom<boolean>({\n key: 'Loading',\n default: false\n});\n\nexport const askUserState = atom<IAsk | undefined>({\n key: 'AskUser',\n default: undefined\n});\n\nexport const callFnState = atom<ICallFn | undefined>({\n key: 'CallFn',\n default: undefined\n});\n\nexport const chatSettingsInputsState = atom<any>({\n key: 'ChatSettings',\n default: []\n});\n\nexport const chatSettingsDefaultValueSelector = selector({\n key: 'ChatSettingsValue/Default',\n get: ({ get }) => {\n const chatSettings = get(chatSettingsInputsState);\n return chatSettings.reduce(\n (form: { [key: string]: any }, input: any) => (\n (form[input.id] = input.initial), form\n ),\n {}\n );\n }\n});\n\nexport const chatSettingsValueState = atom({\n key: 'ChatSettingsValue',\n default: chatSettingsDefaultValueSelector\n});\n\nexport const elementState = atom<IMessageElement[]>({\n key: 'DisplayElements',\n default: []\n});\n\nexport const 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\nexport const sideViewState = atom<IMessageElement | undefined>({\n key: 'SideView',\n default: undefined\n});\n","import { IThread } from 'src/types';\n\nexport const groupByDate = (data: IThread[]) => {\n const groupedData: { [key: string]: IThread[] } = {};\n\n const today = new Date();\n const yesterday = new Date();\n yesterday.setDate(today.getDate() - 1);\n const sevenDaysAgo = new Date();\n sevenDaysAgo.setDate(today.getDate() - 7);\n const thirtyDaysAgo = new Date();\n thirtyDaysAgo.setDate(today.getDate() - 30);\n\n data.forEach((item) => {\n const createdAt = new Date(item.createdAt);\n const isToday = createdAt.toDateString() === today.toDateString();\n const isYesterday = createdAt.toDateString() === yesterday.toDateString();\n const isLast7Days = createdAt >= sevenDaysAgo;\n const isLast30Days = createdAt >= thirtyDaysAgo;\n\n let category: string;\n\n if (isToday) {\n category = 'Today';\n } else if (isYesterday) {\n category = 'Yesterday';\n } else if (isLast7Days) {\n category = 'Previous 7 days';\n } else if (isLast30Days) {\n category = 'Previous 30 days';\n } else {\n const monthYear = createdAt.toLocaleString('default', {\n month: 'long',\n year: 'numeric'\n });\n\n category = monthYear.split(' ').slice(0, 1).join(' ');\n }\n\n if (!groupedData[category]) {\n groupedData[category] = [];\n }\n\n groupedData[category].push(item);\n });\n\n return groupedData;\n};\n","import { useCallback } from 'react';\nimport { useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil';\nimport {\n accessTokenState,\n actionState,\n askUserState,\n avatarState,\n chatSettingsInputsState,\n chatSettingsValueState,\n elementState,\n firstUserInteraction,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\n sideViewState,\n tasklistState,\n threadIdToResumeState,\n tokenCountState\n} from 'src/state';\nimport { IAction, IFileRef, IStep } from 'src/types';\nimport { addMessage } from 'src/utils/message';\n\nimport { ChainlitAPI } from './api';\n\nconst useChatInteract = () => {\n const accessToken = useRecoilValue(accessTokenState);\n const session = useRecoilValue(sessionState);\n const askUser = useRecoilValue(askUserState);\n const sessionId = useRecoilValue(sessionIdState);\n\n const resetChatSettings = useResetRecoilState(chatSettingsInputsState);\n const resetSessionId = useResetRecoilState(sessionIdState);\n const resetChatSettingsValue = useResetRecoilState(chatSettingsValueState);\n\n const setFirstUserInteraction = useSetRecoilState(firstUserInteraction);\n const setLoading = useSetRecoilState(loadingState);\n const setMessages = useSetRecoilState(messagesState);\n const setElements = useSetRecoilState(elementState);\n const setAvatars = useSetRecoilState(avatarState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const setIdToResume = useSetRecoilState(threadIdToResumeState);\n const setSideView = useSetRecoilState(sideViewState);\n\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 setSideView(undefined);\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 callFnState,\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 setCallFn = useSetRecoilState(callFnState);\n\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 pathname = new URL(client.httpEndpoint).pathname;\n const socketPath = pathname.endsWith('/')\n ? 'ws/socket.io'\n : '/ws/socket.io';\n const socket = io(client.httpEndpoint, {\n path: `${pathname}${socketPath}`,\n extraHeaders: {\n Authorization: accessToken || '',\n 'X-Chainlit-Client-Type': client.type,\n 'X-Chainlit-Session-Id': sessionId,\n 'X-Chainlit-Thread-Id': idToResume || '',\n 'user-env': JSON.stringify(userEnv),\n 'X-Chainlit-Chat-Profile': chatProfile || ''\n }\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('call_fn', ({ name, args }, callback) => {\n const event = new CustomEvent('chainlit-call-fn', {\n detail: {\n name,\n args,\n callback\n }\n });\n window.dispatchEvent(event);\n\n setCallFn({ name, args, callback });\n });\n\n socket.on('clear_call_fn', () => {\n setCallFn(undefined);\n });\n\n socket.on('call_fn_timeout', () => {\n setCallFn(undefined);\n });\n\n socket.on('chat_settings', (inputs: any) => {\n setChatSettingsInputs(inputs);\n resetChatSettingsValue();\n });\n\n socket.on('element', (element: IElement) => {\n if (!element.url && element.chainlitKey) {\n element.url = client.getElementUrl(element.chainlitKey, sessionId);\n }\n\n if (element.type === '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 sessionId,\n chatProfile,\n idToResume,\n setChatProfile\n };\n};\n\nexport { useChatSession };\n","const tokenKey = 'token';\n\nexport function getToken() {\n try {\n return localStorage.getItem(tokenKey);\n } catch (e) {\n return;\n }\n}\n\nexport function setToken(token: string) {\n try {\n return localStorage.setItem(tokenKey, token);\n } catch (e) {\n return;\n }\n}\n\nexport function removeToken() {\n try {\n return localStorage.removeItem(tokenKey);\n } catch (e) {\n return;\n }\n}\n","import jwt_decode from 'jwt-decode';\nimport { useEffect } from 'react';\nimport { useRecoilState, useSetRecoilState } from 'recoil';\nimport { accessTokenState, threadHistoryState, userState } from 'src/state';\nimport { IUser } from 'src/types';\nimport { getToken, removeToken, setToken } from 'src/utils/token';\n\nimport { ChainlitAPI } from '..';\nimport { useApi } from './api';\n\nexport const useAuth = (apiClient: ChainlitAPI) => {\n const { data, isLoading } = useApi<{\n requireLogin: boolean;\n passwordAuth: boolean;\n headerAuth: boolean;\n oauthProviders: string[];\n }>(apiClient, '/auth/config');\n const [accessToken, setAccessToken] = useRecoilState(accessTokenState);\n const setThreadHistory = useSetRecoilState(threadHistoryState);\n const [user, setUser] = useRecoilState(userState);\n\n const isReady = !!(!isLoading && data);\n\n const logout = async () => {\n await apiClient.logout();\n setUser(null);\n removeToken();\n setAccessToken('');\n setThreadHistory(undefined);\n };\n\n const saveAndSetToken = (token: string | null | undefined) => {\n if (!token) {\n logout();\n return;\n }\n try {\n const { exp, ...User } = jwt_decode(token) as any;\n setToken(token);\n setAccessToken(`Bearer ${token}`);\n setUser(User as IUser);\n } catch (e) {\n console.error(\n 'Invalid token, clearing token from local storage',\n 'error:',\n e\n );\n logout();\n }\n };\n\n useEffect(() => {\n if (!user && getToken()) {\n // Initialize the token from local storage\n saveAndSetToken(getToken());\n return;\n }\n }, []);\n\n const isAuthenticated = !!accessToken;\n\n if (data && !data.requireLogin) {\n return {\n data,\n user: null,\n isReady,\n isAuthenticated: true,\n accessToken: '',\n logout: () => {},\n setAccessToken: () => {}\n };\n }\n\n return {\n data,\n user: user,\n isAuthenticated,\n isReady,\n accessToken: accessToken,\n logout: logout,\n setAccessToken: saveAndSetToken\n };\n};\n","import { useRecoilValue } from 'recoil';\nimport { ChainlitAPI } from 'src/api';\nimport { accessTokenState } from 'src/state';\nimport useSWR, { SWRConfiguration } from 'swr';\n\nconst fetcher = async (\n client: ChainlitAPI,\n endpoint: string,\n token?: string\n) => {\n const res = await client.get(endpoint, token);\n\n return res?.json();\n};\n\nfunction useApi<T>(\n client: ChainlitAPI,\n path?: string | null,\n options?: SWRConfiguration\n) {\n const accessToken = useRecoilValue(accessTokenState);\n\n return useSWR<T, Error>(\n path ? [path, accessToken] : null,\n ([url, token]: [url: string, token: string]) => fetcher(client, url, token),\n options\n );\n}\n\nexport { useApi, fetcher };\n","import { 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 type: 'app' | 'copilot' | 'teams' | 'slack',\n public on401?: () => void,\n public onError?: (error: ClientError) => void\n ) {}\n\n buildEndpoint(path: string) {\n if (this.httpEndpoint.endsWith('/')) {\n // remove trailing slash on httpEndpoint\n return `${this.httpEndpoint.slice(0, -1)}${path}`;\n } else {\n return `${this.httpEndpoint}${path}`;\n }\n }\n\n checkToken(token: string) {\n const prefix = 'Bearer ';\n if (token.startsWith(prefix)) {\n return token;\n } else {\n return prefix + token;\n }\n }\n\n async fetch(\n method: string,\n path: string,\n token?: string,\n data?: Payload,\n signal?: AbortSignal\n ): Promise<Response> {\n try {\n const headers: { Authorization?: string; 'Content-Type'?: string } = {};\n if (token) headers['Authorization'] = this.checkToken(token); // Assuming token is a bearer token\n\n let body;\n\n if (data instanceof FormData) {\n body = data;\n } else {\n headers['Content-Type'] = 'application/json';\n body = data ? JSON.stringify(data) : null;\n }\n\n const res = await fetch(this.buildEndpoint(path), {\n method,\n headers,\n signal,\n body\n });\n\n if (!res.ok) {\n const body = await res.json();\n if (res.status === 401 && this.on401) {\n removeToken();\n this.on401();\n }\n throw new ClientError(res.statusText, body.detail);\n }\n\n return res;\n } catch (error: any) {\n if (error instanceof ClientError && this.onError) {\n this.onError(error);\n }\n console.error(error);\n throw error;\n }\n }\n\n async get(endpoint: string, token?: string) {\n return await this.fetch('GET', endpoint, token);\n }\n\n async post(\n endpoint: string,\n data: Payload,\n token?: string,\n signal?: AbortSignal\n ) {\n return await this.fetch('POST', endpoint, token, data, signal);\n }\n\n async put(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PUT', endpoint, token, data);\n }\n\n async patch(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PATCH', endpoint, token, data);\n }\n\n async delete(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('DELETE', endpoint, token, data);\n }\n}\n\nexport class ChainlitAPI extends APIBase {\n async headerAuth() {\n const res = await this.post(`/auth/header`, {});\n return res.json();\n }\n\n async passwordAuth(data: FormData) {\n const res = await this.post(`/login`, data);\n return res.json();\n }\n\n async logout() {\n const res = await this.post(`/logout`, {});\n return res.json();\n }\n\n async 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 deleteFeedback(\n feedbackId: string,\n accessToken?: string\n ): Promise<{ success: boolean }> {\n const res = await this.delete(`/feedback`, { feedbackId }, accessToken);\n return res.json();\n }\n\n async listThreads(\n pagination: IPagination,\n filter: IThreadFilters,\n accessToken?: string\n ): Promise<{\n pageInfo: IPageInfo;\n data: IThread[];\n }> {\n const res = await this.post(\n `/project/threads`,\n { pagination, filter },\n accessToken\n );\n\n return res.json();\n }\n\n async deleteThread(threadId: string, accessToken?: string) {\n const res = await this.delete(`/project/thread`, { threadId }, accessToken);\n\n return res.json();\n }\n\n uploadFile(\n file: File,\n onProgress: (progress: number) => void,\n sessionId: string,\n token?: string\n ) {\n const xhr = new XMLHttpRequest();\n\n const promise = new Promise<{ id: string }>((resolve, reject) => {\n const formData = new FormData();\n formData.append('file', file);\n\n xhr.open(\n 'POST',\n this.buildEndpoint(`/project/file?session_id=${sessionId}`),\n true\n );\n\n if (token) {\n xhr.setRequestHeader('Authorization', this.checkToken(token));\n }\n\n // Track the progress of the upload\n xhr.upload.onprogress = function (event) {\n if (event.lengthComputable) {\n const percentage = (event.loaded / event.total) * 100;\n onProgress(percentage);\n }\n };\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n const response = JSON.parse(xhr.responseText);\n resolve(response);\n } else {\n reject('Upload failed');\n }\n };\n\n xhr.onerror = function () {\n reject('Upload error');\n };\n\n xhr.send(formData);\n });\n\n return { xhr, promise };\n }\n\n getElementUrl(id: string, sessionId: string) {\n const queryParams = `?session_id=${sessionId}`;\n return this.buildEndpoint(`/project/file/${id}${queryParams}`);\n }\n\n getLogoEndpoint(theme: string) {\n return this.buildEndpoint(`/logo?theme=${theme}`);\n }\n\n getOAuthEndpoint(provider: string) {\n return this.buildEndpoint(`/auth/oauth/${provider}`);\n }\n}\n","export * from './useChatData';\nexport * from './useChatInteract';\nexport * from './useChatMessages';\nexport * from './useChatSession';\nexport * from './api';\nexport * from './types';\nexport * from './state';\nexport * from './utils/message';\n\nexport { Socket } from 'socket.io-client';\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -2,13 +2,13 @@ import { atom, selector, DefaultValue, useRecoilValue, useResetRecoilState, useS
|
|
|
2
2
|
import { isEqual, debounce } from 'lodash';
|
|
3
3
|
import { v4 } from 'uuid';
|
|
4
4
|
import { useCallback, useEffect } from 'react';
|
|
5
|
-
import
|
|
5
|
+
import Ut from 'socket.io-client';
|
|
6
6
|
export { Socket } from 'socket.io-client';
|
|
7
7
|
import Lt from 'jwt-decode';
|
|
8
|
-
import
|
|
8
|
+
import Vt from 'swr';
|
|
9
9
|
|
|
10
|
-
var pt=r=>{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),r.forEach(i=>{let p=new Date(i.createdAt),f=p.toDateString()===e.toDateString(),h=p.toDateString()===s.toDateString(),g=p>=n,I=p>=o,d;f?d="Today":h?d="Yesterday":g?d="Previous 7 days":I?d="Previous 30 days":d=p.toLocaleString("default",{month:"long",year:"numeric"}).split(" ").slice(0,1).join(" "),t[d]||(t[d]=[]),t[d].push(i);}),t};var N=atom({key:"ThreadIdToResume",default:void 0}),mt=atom({key:"ChatProfile",default:void 0}),ft=atom({key:"SessionId",default:v4()}),q=selector({key:"SessionIdSelector",get:({get:r})=>r(ft),set:({set:r},t)=>r(ft,t instanceof DefaultValue?v4():t)}),R=atom({key:"Session",dangerouslyAllowMutability:!0,default:void 0}),M=atom({key:"Actions",default:[]}),U=atom({key:"Messages",dangerouslyAllowMutability:!0,default:[]}),Y=atom({key:"TokenCount",default:0}),F=atom({key:"Loading",default:!1}),j=atom({key:"AskUser",default:void 0}),St=atom({key:"CallFn",default:void 0}),D=atom({key:"ChatSettings",default:[]}),nt=selector({key:"ChatSettingsValue/Default",get:({get:r})=>r(D).reduce((e,s)=>(e[s.id]=s.initial,e),{})}),L=atom({key:"ChatSettingsValue",default:nt}),$=atom({key:"DisplayElements",default:[]}),H=atom({key:"AvatarElements",default:[]}),V=atom({key:"TasklistElements",default:[]}),B=atom({key:"FirstUserInteraction",default:void 0}),G=atom({key:"AccessToken",default:void 0}),It=atom({key:"User",default:null}),kt=atom({key:"ThreadHistory",default:{threads:void 0,currentThreadId:void 0,timeGroupedThreads:void 0,pageInfo:void 0},effects:[({setSelf:r,onSet:t})=>{t((e,s)=>{let n=e?.timeGroupedThreads;e?.threads&&!isEqual(e.threads,s?.timeGroupedThreads)&&(n=pt(e.threads)),r({...e,timeGroupedThreads:n});});}]});var Nt=()=>{let r=useRecoilValue(F),t=useRecoilValue($),e=useRecoilValue(H),s=useRecoilValue(V),n=useRecoilValue(M),o=useRecoilValue(R),i=useRecoilValue(j),p=useRecoilValue(D),f=useRecoilValue(L),h=useRecoilValue(nt),g=o?.socket.connected&&!o?.error,I=!g||r||i?.spec.type==="file"||i?.spec.type==="action";return {actions:n,askUser:i,avatars:e,chatSettingsDefaultValue:h,chatSettingsInputs:p,chatSettingsValue:f,connected:g,disabled:I,elements:t,error:o?.error,loading:r,tasklists:s}};var Kt=r=>{let t=[];for(let e of r)t=b(t,e);return t},Qt=(r,t)=>{if(r.length-1===t)return !0;for(let e=t+1;e<r.length;e++)if(!r[e].streaming)return !1;return !0},b=(r,t)=>O(r,t.id)?K(r,t.id,t):"parentId"in t&&t.parentId?xt(r,t.parentId,t):"indent"in t&&t.indent&&t.indent>0?yt(r,t.indent,t):[...r,t],yt=(r,t,e,s=0)=>{let n=[...r];if(n.length===0)return [...n,e];{let o=n.length-1,i=n[o];return i.steps=i.steps||[],s+1===t?(i.steps=[...i.steps,e],n[o]={...i},n):(i.steps=yt(i.steps,t,e,s+1),n[o]={...i},n)}},xt=(r,t,e)=>{let s=[...r];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}):O(s,t)&&o.steps&&(o.steps=xt(o.steps,t,e),s[n]={...o});}return s},O=(r,t)=>{for(let e of r){if(isEqual(e.id,t))return !0;if(e.steps&&e.steps.length>0&&O(e.steps,t))return !0}return !1},K=(r,t,e)=>{let s=[...r];for(let n=0;n<s.length;n++){let o=s[n];isEqual(o.id,t)?s[n]={steps:o.steps,...e}:O(s,t)&&o.steps&&(o.steps=K(o.steps,t,e),s[n]={...o});}return s},ot=(r,t)=>{let e=[...r];for(let s=0;s<e.length;s++){let n=e[s];n.id===t?e=[...e.slice(0,s),...e.slice(s+1)]:O(e,t)&&n.steps&&(n.steps=ot(n.steps,t),e[s]={...n});}return e},rt=(r,t,e,s)=>{let n=[...r];for(let o=0;o<n.length;o++){let i=n[o];isEqual(i.id,t)?("content"in i&&i.content!==void 0?s?i.content=e:i.content+=e:"output"in i&&i.output!==void 0&&(s?i.output=e:i.output+=e),n[o]={...i}):i.steps&&(i.steps=rt(i.steps,t,e,s),n[o]={...i});}return n};var oe=()=>{let r=useRecoilValue(G),t=useRecoilValue(R),e=useRecoilValue(j),s=useRecoilValue(q),n=useResetRecoilState(D),o=useResetRecoilState(q),i=useResetRecoilState(L),p=useSetRecoilState(B),f=useSetRecoilState(F),h=useSetRecoilState(U),g=useSetRecoilState($),I=useSetRecoilState(H),d=useSetRecoilState(V),T=useSetRecoilState(M),C=useSetRecoilState(Y),w=useSetRecoilState(N),W=useCallback(()=>{t?.socket.emit("clear_session"),t?.socket.disconnect(),w(void 0),o(),p(void 0),h([]),g([]),I([]),d([]),T([]),C(0),n(),i();},[t]),X=useCallback((k,y)=>{h(P=>b(P,k)),t?.socket.emit("ui_message",{message:k,fileReferences:y});},[t?.socket]),z=useCallback(k=>{e&&(h(y=>b(y,k)),e.callback(k));},[e]),et=useCallback(k=>{t?.socket.emit("chat_settings_change",k);},[t?.socket]),st=useCallback(()=>{f(!1),t?.socket.emit("stop");},[t?.socket]),_=useCallback(k=>{let y=t?.socket;if(!y)return;let P=new Promise((u,a)=>{y.once("action_response",c=>{c.status?u(c):a(c);});});return y.emit("action_call",k),P},[t?.socket]);return {uploadFile:useCallback((k,y,P)=>k.uploadFile(y,P,s,r),[s,r]),callAction:_,clear:W,replyMessage:z,sendMessage:X,stopTask:st,setIdToResume:w,updateChatSettings:et}};var ce=()=>{let r=useRecoilValue(U),t=useRecoilValue(B);return {messages:r,firstInteraction:t}};var me=()=>{let r=useRecoilValue(q),[t,e]=useRecoilState(R),s=useResetRecoilState(L),n=useSetRecoilState(B),o=useSetRecoilState(F),i=useSetRecoilState(U),p=useSetRecoilState(j),f=useSetRecoilState(St),h=useSetRecoilState($),g=useSetRecoilState(H),I=useSetRecoilState(V),d=useSetRecoilState(M),T=useSetRecoilState(D),C=useSetRecoilState(Y),[w,W]=useRecoilState(mt),X=useRecoilValue(N),z=useCallback(({client:_,userEnv:dt,accessToken:k})=>{let y=new URL(_.httpEndpoint).pathname,P=y.endsWith("/")?"ws/socket.io":"/ws/socket.io",u=Mt(_.httpEndpoint,{path:`${y}${P}`,extraHeaders:{Authorization:k||"","X-Chainlit-Client-Type":_.type,"X-Chainlit-Session-Id":r,"X-Chainlit-Thread-Id":X||"","user-env":JSON.stringify(dt),"X-Chainlit-Chat-Profile":w||""}});e(a=>(a?.socket?.removeAllListeners(),a?.socket?.close(),{socket:u})),u.on("connect",()=>{u.emit("connection_successful"),e(a=>({...a,error:!1}));}),u.on("connect_error",a=>{e(c=>({...c,error:!0}));}),u.on("task_start",()=>{o(!0);}),u.on("task_end",()=>{o(!1);}),u.on("reload",()=>{u.emit("clear_session"),window.location.reload();}),u.on("resume_thread",a=>{let c=[];for(let m of a.steps)c=b(c,m);a.metadata?.chat_profile&&W(a.metadata?.chat_profile),i(c);let l=a.elements||[];g(l.filter(m=>m.type==="avatar")),I(l.filter(m=>m.type==="tasklist")),h(l.filter(m=>["avatar","tasklist"].indexOf(m.type)===-1));}),u.on("new_message",a=>{i(c=>b(c,a));}),u.on("first_interaction",a=>{n(a);}),u.on("update_message",a=>{i(c=>K(c,a.id,a));}),u.on("delete_message",a=>{i(c=>ot(c,a.id));}),u.on("stream_start",a=>{i(c=>b(c,a));}),u.on("stream_token",({id:a,token:c,isSequence:l})=>{i(m=>rt(m,a,c,l));}),u.on("ask",({msg:a,spec:c},l)=>{p({spec:c,callback:l}),i(m=>b(m,a)),o(!1);}),u.on("ask_timeout",()=>{p(void 0),o(!1);}),u.on("clear_ask",()=>{p(void 0);}),u.on("call_fn",({name:a,args:c},l)=>{let m=new CustomEvent("chainlit-call-fn",{detail:{name:a,args:c,callback:l}});window.dispatchEvent(m),f({name:a,args:c,callback:l});}),u.on("clear_call_fn",()=>{f(void 0);}),u.on("call_fn_timeout",()=>{f(void 0);}),u.on("chat_settings",a=>{T(a),s();}),u.on("element",a=>{!a.url&&a.chainlitKey&&(a.url=_.getElementUrl(a.chainlitKey,r)),a.type==="avatar"?g(c=>{let l=c.findIndex(m=>m.id===a.id);return l===-1?[...c,a]:[...c.slice(0,l),a,...c.slice(l+1)]}):a.type==="tasklist"?I(c=>{let l=c.findIndex(m=>m.id===a.id);return l===-1?[...c,a]:[...c.slice(0,l),a,...c.slice(l+1)]}):h(c=>{let l=c.findIndex(m=>m.id===a.id);return l===-1?[...c,a]:[...c.slice(0,l),a,...c.slice(l+1)]});}),u.on("remove_element",a=>{h(c=>c.filter(l=>l.id!==a.id)),I(c=>c.filter(l=>l.id!==a.id)),g(c=>c.filter(l=>l.id!==a.id));}),u.on("action",a=>{d(c=>[...c,a]);}),u.on("remove_action",a=>{d(c=>{let l=c.findIndex(m=>m.id===a.id);return l===-1?c:[...c.slice(0,l),...c.slice(l+1)]});}),u.on("token_usage",a=>{C(c=>c+a);});},[e,r,w]),et=useCallback(debounce(z,200),[z]),st=useCallback(()=>{t?.socket&&(t.socket.removeAllListeners(),t.socket.close());},[t]);return {connect:et,disconnect:st,session:t,chatProfile:w,idToResume:X,setChatProfile:W}};var ct="token";function lt(){try{return localStorage.getItem(ct)}catch{return}}function Et(r){try{return localStorage.setItem(ct,r)}catch{return}}function Z(){try{return localStorage.removeItem(ct)}catch{return}}var jt=async(r,t,e)=>(await r.get(t,e))?.json();function Ct(r,t,e){let s=useRecoilValue(G);return Ft(t?[t,s]:null,([n,o])=>jt(r,n,o),e)}var we=r=>{let{data:t,isLoading:e}=Ct(r,"/auth/config"),[s,n]=useRecoilState(G),o=useSetRecoilState(kt),[i,p]=useRecoilState(It),f=!!(!e&&t),h=async()=>{await r.logout(),p(null),Z(),n(""),o(void 0);},g=d=>{if(!d){h();return}try{let{exp:T,...C}=Lt(d);Et(d),n(`Bearer ${d}`),p(C);}catch(T){console.error("Invalid token, clearing token from local storage","error:",T),h();}};useEffect(()=>{if(!i&<()){g(lt());return}},[]);let I=!!s;return t&&!t.requireLogin?{data:t,user:null,isReady:f,isAuthenticated:!0,accessToken:"",logout:()=>{},setAccessToken:()=>{}}:{data:t,user:i,isAuthenticated:I,isReady:f,accessToken:s,logout:h,setAccessToken:g}};var tt=class extends Error{constructor(e,s){super(e);this.detail=s;}toString(){return this.detail?`${this.message}: ${this.detail}`:this.message}},ut=class{constructor(t,e,s,n){this.httpEndpoint=t;this.type=e;this.on401=s;this.onError=n;}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 i={};s&&(i.Authorization=this.checkToken(s));let p;n instanceof FormData?p=n:(i["Content-Type"]="application/json",p=n?JSON.stringify(n):null);let f=await fetch(this.buildEndpoint(e),{method:t,headers:i,signal:o,body:p});if(!f.ok){let h=await f.json();throw f.status===401&&this.on401&&(Z(),this.on401()),new tt(f.statusText,h.detail)}return f}catch(i){throw i instanceof tt&&this.onError&&this.onError(i),console.error(i),i}}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)}},Dt=class extends ut{async headerAuth(){return (await this.post("/auth/header",{})).json()}async passwordAuth(t){return (await this.post("/login",t)).json()}async logout(){return (await this.post("/logout",{})).json()}async getGeneration(t,e={},s,n,o){let i={userEnv:e};t.type==="CHAT"?i.chatGeneration=t:i.completionGeneration=t;let f=(await this.post("/generation",i,n,s.signal))?.body?.getReader();return new ReadableStream({start(g){function I(){f.read().then(({done:d,value:T})=>{if(d){g.close(),o&&o(d,"");return}let C=new TextDecoder("utf-8").decode(T);o&&o(d,C),g.enqueue(T),I();}).catch(d=>{g.close(),o&&o(!0,""),console.error(d);});}I();}})}async setFeedback(t,e){return (await this.put("/feedback",{feedback:t},e)).json()}async deleteFeedback(t,e){return (await this.delete("/feedback",{feedbackId:t},e)).json()}async listThreads(t,e,s){return (await this.post("/project/threads",{pagination:t,filter:e},s)).json()}async deleteThread(t,e){return (await this.delete("/project/thread",{threadId:t},e)).json()}uploadFile(t,e,s,n){let o=new XMLHttpRequest,i=new Promise((p,f)=>{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(g){if(g.lengthComputable){let I=g.loaded/g.total*100;e(I);}},o.onload=function(){if(o.status===200){let g=JSON.parse(o.responseText);p(g);}else f("Upload failed");},o.onerror=function(){f("Upload error");},o.send(h);});return {xhr:o,promise:i}}getElementUrl(t,e){let s=`?session_id=${e}`;return this.buildEndpoint(`/project/file/${t}${s}`)}getLogoEndpoint(t){return this.buildEndpoint(`/logo?theme=${t}`)}getOAuthEndpoint(t){return this.buildEndpoint(`/auth/oauth/${t}`)}};
|
|
10
|
+
var pt=r=>{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),r.forEach(i=>{let p=new Date(i.createdAt),f=p.toDateString()===e.toDateString(),h=p.toDateString()===s.toDateString(),g=p>=n,I=p>=o,d;f?d="Today":h?d="Yesterday":g?d="Previous 7 days":I?d="Previous 30 days":d=p.toLocaleString("default",{month:"long",year:"numeric"}).split(" ").slice(0,1).join(" "),t[d]||(t[d]=[]),t[d].push(i);}),t};var z=atom({key:"ThreadIdToResume",default:void 0}),mt=atom({key:"ChatProfile",default:void 0}),ft=atom({key:"SessionId",default:v4()}),G=selector({key:"SessionIdSelector",get:({get:r})=>r(ft),set:({set:r},t)=>r(ft,t instanceof DefaultValue?v4():t)}),_=atom({key:"Session",dangerouslyAllowMutability:!0,default:void 0}),R=atom({key:"Actions",default:[]}),M=atom({key:"Messages",dangerouslyAllowMutability:!0,default:[]}),N=atom({key:"TokenCount",default:0}),U=atom({key:"Loading",default:!1}),F=atom({key:"AskUser",default:void 0}),St=atom({key:"CallFn",default:void 0}),w=atom({key:"ChatSettings",default:[]}),nt=selector({key:"ChatSettingsValue/Default",get:({get:r})=>r(w).reduce((e,s)=>(e[s.id]=s.initial,e),{})}),V=atom({key:"ChatSettingsValue",default:nt}),j=atom({key:"DisplayElements",default:[]}),L=atom({key:"AvatarElements",default:[]}),$=atom({key:"TasklistElements",default:[]}),H=atom({key:"FirstUserInteraction",default:void 0}),B=atom({key:"AccessToken",default:void 0}),It=atom({key:"User",default:null}),kt=atom({key:"ThreadHistory",default:{threads:void 0,currentThreadId:void 0,timeGroupedThreads:void 0,pageInfo:void 0},effects:[({setSelf:r,onSet:t})=>{t((e,s)=>{let n=e?.timeGroupedThreads;e?.threads&&!isEqual(e.threads,s?.timeGroupedThreads)&&(n=pt(e.threads)),r({...e,timeGroupedThreads:n});});}]}),yt=atom({key:"SideView",default:void 0});var Yt=()=>{let r=useRecoilValue(U),t=useRecoilValue(j),e=useRecoilValue(L),s=useRecoilValue($),n=useRecoilValue(R),o=useRecoilValue(_),i=useRecoilValue(F),p=useRecoilValue(w),f=useRecoilValue(V),h=useRecoilValue(nt),g=o?.socket.connected&&!o?.error,I=!g||r||i?.spec.type==="file"||i?.spec.type==="action";return {actions:n,askUser:i,avatars:e,chatSettingsDefaultValue:h,chatSettingsInputs:p,chatSettingsValue:f,connected:g,disabled:I,elements:t,error:o?.error,loading:r,tasklists:s}};var Qt=r=>{let t=[];for(let e of r)t=E(t,e);return t},Zt=(r,t)=>{if(r.length-1===t)return !0;for(let e=t+1;e<r.length;e++)if(!r[e].streaming)return !1;return !0},E=(r,t)=>q(r,t.id)?J(r,t.id,t):"parentId"in t&&t.parentId?Tt(r,t.parentId,t):"indent"in t&&t.indent&&t.indent>0?xt(r,t.indent,t):[...r,t],xt=(r,t,e,s=0)=>{let n=[...r];if(n.length===0)return [...n,e];{let o=n.length-1,i=n[o];return i.steps=i.steps||[],s+1===t?(i.steps=[...i.steps,e],n[o]={...i},n):(i.steps=xt(i.steps,t,e,s+1),n[o]={...i},n)}},Tt=(r,t,e)=>{let s=[...r];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}):q(s,t)&&o.steps&&(o.steps=Tt(o.steps,t,e),s[n]={...o});}return s},q=(r,t)=>{for(let e of r){if(isEqual(e.id,t))return !0;if(e.steps&&e.steps.length>0&&q(e.steps,t))return !0}return !1},J=(r,t,e)=>{let s=[...r];for(let n=0;n<s.length;n++){let o=s[n];isEqual(o.id,t)?s[n]={steps:o.steps,...e}:q(s,t)&&o.steps&&(o.steps=J(o.steps,t,e),s[n]={...o});}return s},ot=(r,t)=>{let e=[...r];for(let s=0;s<e.length;s++){let n=e[s];n.id===t?e=[...e.slice(0,s),...e.slice(s+1)]:q(e,t)&&n.steps&&(n.steps=ot(n.steps,t),e[s]={...n});}return e},rt=(r,t,e,s)=>{let n=[...r];for(let o=0;o<n.length;o++){let i=n[o];isEqual(i.id,t)?("content"in i&&i.content!==void 0?s?i.content=e:i.content+=e:"output"in i&&i.output!==void 0&&(s?i.output=e:i.output+=e),n[o]={...i}):i.steps&&(i.steps=rt(i.steps,t,e,s),n[o]={...i});}return n};var re=()=>{let r=useRecoilValue(B),t=useRecoilValue(_),e=useRecoilValue(F),s=useRecoilValue(G),n=useResetRecoilState(w),o=useResetRecoilState(G),i=useResetRecoilState(V),p=useSetRecoilState(H),f=useSetRecoilState(U),h=useSetRecoilState(M),g=useSetRecoilState(j),I=useSetRecoilState(L),d=useSetRecoilState($),T=useSetRecoilState(R),C=useSetRecoilState(N),D=useSetRecoilState(z),O=useSetRecoilState(yt),W=useCallback(()=>{t?.socket.emit("clear_session"),t?.socket.disconnect(),D(void 0),o(),p(void 0),h([]),g([]),I([]),d([]),T([]),C(0),n(),i(),O(void 0);},[t]),X=useCallback((k,y)=>{h(u=>E(u,k)),t?.socket.emit("ui_message",{message:k,fileReferences:y});},[t?.socket]),tt=useCallback(k=>{e&&(h(y=>E(y,k)),e.callback(k));},[e]),et=useCallback(k=>{t?.socket.emit("chat_settings_change",k);},[t?.socket]),v=useCallback(()=>{f(!1),t?.socket.emit("stop");},[t?.socket]),st=useCallback(k=>{let y=t?.socket;if(!y)return;let u=new Promise((a,c)=>{y.once("action_response",l=>{l.status?a(l):c(l);});});return y.emit("action_call",k),u},[t?.socket]);return {uploadFile:useCallback((k,y,u)=>k.uploadFile(y,u,s,r),[s,r]),callAction:st,clear:W,replyMessage:tt,sendMessage:X,stopTask:v,setIdToResume:D,updateChatSettings:et}};var le=()=>{let r=useRecoilValue(M),t=useRecoilValue(H);return {messages:r,firstInteraction:t}};var Se=()=>{let r=useRecoilValue(G),[t,e]=useRecoilState(_),s=useResetRecoilState(V),n=useSetRecoilState(H),o=useSetRecoilState(U),i=useSetRecoilState(M),p=useSetRecoilState(F),f=useSetRecoilState(St),h=useSetRecoilState(j),g=useSetRecoilState(L),I=useSetRecoilState($),d=useSetRecoilState(R),T=useSetRecoilState(w),C=useSetRecoilState(N),[D,O]=useRecoilState(mt),W=useRecoilValue(z),X=useCallback(({client:v,userEnv:st,accessToken:dt})=>{let k=new URL(v.httpEndpoint).pathname,y=k.endsWith("/")?"ws/socket.io":"/ws/socket.io",u=Ut(v.httpEndpoint,{path:`${k}${y}`,extraHeaders:{Authorization:dt||"","X-Chainlit-Client-Type":v.type,"X-Chainlit-Session-Id":r,"X-Chainlit-Thread-Id":W||"","user-env":JSON.stringify(st),"X-Chainlit-Chat-Profile":D||""}});e(a=>(a?.socket?.removeAllListeners(),a?.socket?.close(),{socket:u})),u.on("connect",()=>{u.emit("connection_successful"),e(a=>({...a,error:!1}));}),u.on("connect_error",a=>{e(c=>({...c,error:!0}));}),u.on("task_start",()=>{o(!0);}),u.on("task_end",()=>{o(!1);}),u.on("reload",()=>{u.emit("clear_session"),window.location.reload();}),u.on("resume_thread",a=>{let c=[];for(let m of a.steps)c=E(c,m);a.metadata?.chat_profile&&O(a.metadata?.chat_profile),i(c);let l=a.elements||[];g(l.filter(m=>m.type==="avatar")),I(l.filter(m=>m.type==="tasklist")),h(l.filter(m=>["avatar","tasklist"].indexOf(m.type)===-1));}),u.on("new_message",a=>{i(c=>E(c,a));}),u.on("first_interaction",a=>{n(a);}),u.on("update_message",a=>{i(c=>J(c,a.id,a));}),u.on("delete_message",a=>{i(c=>ot(c,a.id));}),u.on("stream_start",a=>{i(c=>E(c,a));}),u.on("stream_token",({id:a,token:c,isSequence:l})=>{i(m=>rt(m,a,c,l));}),u.on("ask",({msg:a,spec:c},l)=>{p({spec:c,callback:l}),i(m=>E(m,a)),o(!1);}),u.on("ask_timeout",()=>{p(void 0),o(!1);}),u.on("clear_ask",()=>{p(void 0);}),u.on("call_fn",({name:a,args:c},l)=>{let m=new CustomEvent("chainlit-call-fn",{detail:{name:a,args:c,callback:l}});window.dispatchEvent(m),f({name:a,args:c,callback:l});}),u.on("clear_call_fn",()=>{f(void 0);}),u.on("call_fn_timeout",()=>{f(void 0);}),u.on("chat_settings",a=>{T(a),s();}),u.on("element",a=>{!a.url&&a.chainlitKey&&(a.url=v.getElementUrl(a.chainlitKey,r)),a.type==="avatar"?g(c=>{let l=c.findIndex(m=>m.id===a.id);return l===-1?[...c,a]:[...c.slice(0,l),a,...c.slice(l+1)]}):a.type==="tasklist"?I(c=>{let l=c.findIndex(m=>m.id===a.id);return l===-1?[...c,a]:[...c.slice(0,l),a,...c.slice(l+1)]}):h(c=>{let l=c.findIndex(m=>m.id===a.id);return l===-1?[...c,a]:[...c.slice(0,l),a,...c.slice(l+1)]});}),u.on("remove_element",a=>{h(c=>c.filter(l=>l.id!==a.id)),I(c=>c.filter(l=>l.id!==a.id)),g(c=>c.filter(l=>l.id!==a.id));}),u.on("action",a=>{d(c=>[...c,a]);}),u.on("remove_action",a=>{d(c=>{let l=c.findIndex(m=>m.id===a.id);return l===-1?c:[...c.slice(0,l),...c.slice(l+1)]});}),u.on("token_usage",a=>{C(c=>c+a);});},[e,r,D]),tt=useCallback(debounce(X,200),[X]),et=useCallback(()=>{t?.socket&&(t.socket.removeAllListeners(),t.socket.close());},[t]);return {connect:tt,disconnect:et,session:t,sessionId:r,chatProfile:D,idToResume:W,setChatProfile:O}};var ct="token";function lt(){try{return localStorage.getItem(ct)}catch{return}}function Ct(r){try{return localStorage.setItem(ct,r)}catch{return}}function Q(){try{return localStorage.removeItem(ct)}catch{return}}var jt=async(r,t,e)=>(await r.get(t,e))?.json();function wt(r,t,e){let s=useRecoilValue(B);return Vt(t?[t,s]:null,([n,o])=>jt(r,n,o),e)}var _e=r=>{let{data:t,isLoading:e}=wt(r,"/auth/config"),[s,n]=useRecoilState(B),o=useSetRecoilState(kt),[i,p]=useRecoilState(It),f=!!(!e&&t),h=async()=>{await r.logout(),p(null),Q(),n(""),o(void 0);},g=d=>{if(!d){h();return}try{let{exp:T,...C}=Lt(d);Ct(d),n(`Bearer ${d}`),p(C);}catch(T){console.error("Invalid token, clearing token from local storage","error:",T),h();}};useEffect(()=>{if(!i&<()){g(lt());return}},[]);let I=!!s;return t&&!t.requireLogin?{data:t,user:null,isReady:f,isAuthenticated:!0,accessToken:"",logout:()=>{},setAccessToken:()=>{}}:{data:t,user:i,isAuthenticated:I,isReady:f,accessToken:s,logout:h,setAccessToken:g}};var Z=class extends Error{constructor(e,s){super(e);this.detail=s;}toString(){return this.detail?`${this.message}: ${this.detail}`:this.message}},ut=class{constructor(t,e,s,n){this.httpEndpoint=t;this.type=e;this.on401=s;this.onError=n;}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 i={};s&&(i.Authorization=this.checkToken(s));let p;n instanceof FormData?p=n:(i["Content-Type"]="application/json",p=n?JSON.stringify(n):null);let f=await fetch(this.buildEndpoint(e),{method:t,headers:i,signal:o,body:p});if(!f.ok){let h=await f.json();throw f.status===401&&this.on401&&(Q(),this.on401()),new Z(f.statusText,h.detail)}return f}catch(i){throw i instanceof Z&&this.onError&&this.onError(i),console.error(i),i}}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)}},Dt=class extends ut{async headerAuth(){return (await this.post("/auth/header",{})).json()}async passwordAuth(t){return (await this.post("/login",t)).json()}async logout(){return (await this.post("/logout",{})).json()}async getGeneration(t,e={},s,n,o){let i={userEnv:e};t.type==="CHAT"?i.chatGeneration=t:i.completionGeneration=t;let f=(await this.post("/generation",i,n,s.signal))?.body?.getReader();return new ReadableStream({start(g){function I(){f.read().then(({done:d,value:T})=>{if(d){g.close(),o&&o(d,"");return}let C=new TextDecoder("utf-8").decode(T);o&&o(d,C),g.enqueue(T),I();}).catch(d=>{g.close(),o&&o(!0,""),console.error(d);});}I();}})}async setFeedback(t,e){return (await this.put("/feedback",{feedback:t},e)).json()}async deleteFeedback(t,e){return (await this.delete("/feedback",{feedbackId:t},e)).json()}async listThreads(t,e,s){return (await this.post("/project/threads",{pagination:t,filter:e},s)).json()}async deleteThread(t,e){return (await this.delete("/project/thread",{threadId:t},e)).json()}uploadFile(t,e,s,n){let o=new XMLHttpRequest,i=new Promise((p,f)=>{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(g){if(g.lengthComputable){let I=g.loaded/g.total*100;e(I);}},o.onload=function(){if(o.status===200){let g=JSON.parse(o.responseText);p(g);}else f("Upload failed");},o.onerror=function(){f("Upload error");},o.send(h);});return {xhr:o,promise:i}}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 { ut as APIBase, Dt as ChainlitAPI,
|
|
12
|
+
export { ut as APIBase, Dt as ChainlitAPI, Z as ClientError, B as accessTokenState, R as actionState, E as addMessage, Tt as addMessageToParent, F as askUserState, L as avatarState, St as callFnState, mt as chatProfileState, nt as chatSettingsDefaultValueSelector, w as chatSettingsInputsState, V as chatSettingsValueState, ot as deleteMessageById, j as elementState, jt as fetcher, H as firstUserInteraction, q as hasMessageById, Zt as isLastMessage, U as loadingState, M as messagesState, Qt as nestMessages, G as sessionIdState, _ as sessionState, yt as sideViewState, $ as tasklistState, kt as threadHistoryState, z as threadIdToResumeState, N as tokenCountState, J as updateMessageById, rt as updateMessageContentById, wt as useApi, _e as useAuth, Yt as useChatData, re as useChatInteract, le as useChatMessages, Se as useChatSession, It 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","callFnState","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","setCallFn","setChatSettingsInputs","chatProfile","setChatProfile","idToResume","_connect","userEnv","pathname","socketPath","old","s","_","thread","step","e","interaction","id","token","spec","callback","name","args","event","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","type","on401","onError","prefix","method","signal","headers","body","res","error","ChainlitAPI","generation","controller","tokenCb","payload","reader","push","done","value","string","err","feedback","feedbackId","pagination","filter","threadId","xhr","formData","percentage","queryParams","theme","provider","Socket"],"mappings":"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","sourcesContent":["import { useRecoilValue } from 'recoil';\n\nimport {\n actionState,\n askUserState,\n 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 ICallFn,\n IMessageElement,\n IStep,\n ITasklistElement,\n IUser,\n ThreadHistory\n} from './types';\nimport { groupByDate } from './utils/group';\n\nexport interface ISession {\n socket: Socket;\n error?: boolean;\n}\n\nexport const threadIdToResumeState = atom<string | undefined>({\n key: 'ThreadIdToResume',\n default: undefined\n});\n\nexport const chatProfileState = atom<string | undefined>({\n key: 'ChatProfile',\n default: undefined\n});\n\nconst sessionIdAtom = atom<string>({\n key: 'SessionId',\n default: uuidv4()\n});\n\nexport const sessionIdState = selector({\n key: 'SessionIdSelector',\n get: ({ get }) => get(sessionIdAtom),\n set: ({ set }, newValue) =>\n set(sessionIdAtom, newValue instanceof DefaultValue ? uuidv4() : newValue)\n});\n\nexport const sessionState = atom<ISession | undefined>({\n key: 'Session',\n dangerouslyAllowMutability: true,\n default: undefined\n});\n\nexport const actionState = atom<IAction[]>({\n key: 'Actions',\n default: []\n});\n\nexport const messagesState = atom<IStep[]>({\n key: 'Messages',\n dangerouslyAllowMutability: true,\n default: []\n});\n\nexport const tokenCountState = atom<number>({\n key: 'TokenCount',\n default: 0\n});\n\nexport const loadingState = atom<boolean>({\n key: 'Loading',\n default: false\n});\n\nexport const askUserState = atom<IAsk | undefined>({\n key: 'AskUser',\n default: undefined\n});\n\nexport const callFnState = atom<ICallFn | undefined>({\n key: 'CallFn',\n default: undefined\n});\n\nexport const chatSettingsInputsState = atom<any>({\n key: 'ChatSettings',\n default: []\n});\n\nexport const chatSettingsDefaultValueSelector = selector({\n key: 'ChatSettingsValue/Default',\n get: ({ get }) => {\n const chatSettings = get(chatSettingsInputsState);\n return chatSettings.reduce(\n (form: { [key: string]: any }, input: any) => (\n (form[input.id] = input.initial), form\n ),\n {}\n );\n }\n});\n\nexport const chatSettingsValueState = atom({\n key: 'ChatSettingsValue',\n default: chatSettingsDefaultValueSelector\n});\n\nexport const elementState = atom<IMessageElement[]>({\n key: 'DisplayElements',\n default: []\n});\n\nexport const 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 callFnState,\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 setCallFn = useSetRecoilState(callFnState);\n\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 pathname = new URL(client.httpEndpoint).pathname;\n const socketPath = pathname.endsWith('/')\n ? 'ws/socket.io'\n : '/ws/socket.io';\n const socket = io(client.httpEndpoint, {\n path: `${pathname}${socketPath}`,\n extraHeaders: {\n Authorization: accessToken || '',\n 'X-Chainlit-Client-Type': client.type,\n 'X-Chainlit-Session-Id': sessionId,\n 'X-Chainlit-Thread-Id': idToResume || '',\n 'user-env': JSON.stringify(userEnv),\n 'X-Chainlit-Chat-Profile': chatProfile || ''\n }\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('call_fn', ({ name, args }, callback) => {\n const event = new CustomEvent('chainlit-call-fn', {\n detail: {\n name,\n args,\n callback\n }\n });\n window.dispatchEvent(event);\n\n setCallFn({ name, args, callback });\n });\n\n socket.on('clear_call_fn', () => {\n setCallFn(undefined);\n });\n\n socket.on('call_fn_timeout', () => {\n setCallFn(undefined);\n });\n\n socket.on('chat_settings', (inputs: any) => {\n setChatSettingsInputs(inputs);\n resetChatSettingsValue();\n });\n\n socket.on('element', (element: IElement) => {\n if (!element.url && element.chainlitKey) {\n element.url = client.getElementUrl(element.chainlitKey, sessionId);\n }\n\n if (element.type === '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 = async () => {\n await apiClient.logout();\n setUser(null);\n removeToken();\n setAccessToken('');\n setThreadHistory(undefined);\n };\n\n const saveAndSetToken = (token: string | null | undefined) => {\n if (!token) {\n logout();\n return;\n }\n try {\n const { exp, ...User } = jwt_decode(token) as any;\n setToken(token);\n setAccessToken(`Bearer ${token}`);\n setUser(User as IUser);\n } catch (e) {\n console.error(\n 'Invalid token, clearing token from local storage',\n 'error:',\n e\n );\n logout();\n }\n };\n\n useEffect(() => {\n if (!user && getToken()) {\n // Initialize the token from local storage\n saveAndSetToken(getToken());\n return;\n }\n }, []);\n\n const isAuthenticated = !!accessToken;\n\n if (data && !data.requireLogin) {\n return {\n data,\n user: null,\n isReady,\n isAuthenticated: true,\n accessToken: '',\n logout: () => {},\n setAccessToken: () => {}\n };\n }\n\n return {\n data,\n user: user,\n isAuthenticated,\n isReady,\n accessToken: accessToken,\n logout: logout,\n setAccessToken: saveAndSetToken\n };\n};\n","import { useRecoilValue } from 'recoil';\nimport { ChainlitAPI } from 'src/api';\nimport { accessTokenState } from 'src/state';\nimport useSWR, { SWRConfiguration } from 'swr';\n\nconst fetcher = async (\n client: ChainlitAPI,\n endpoint: string,\n token?: string\n) => {\n const res = await client.get(endpoint, token);\n\n return res?.json();\n};\n\nfunction useApi<T>(\n client: ChainlitAPI,\n path?: string | null,\n options?: SWRConfiguration\n) {\n const accessToken = useRecoilValue(accessTokenState);\n\n return useSWR<T, Error>(\n path ? [path, accessToken] : null,\n ([url, token]: [url: string, token: string]) => fetcher(client, url, token),\n options\n );\n}\n\nexport { useApi, fetcher };\n","import { 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 type: 'app' | 'copilot' | 'teams' | 'slack',\n public on401?: () => void,\n public onError?: (error: ClientError) => void\n ) {}\n\n buildEndpoint(path: string) {\n if (this.httpEndpoint.endsWith('/')) {\n // remove trailing slash on httpEndpoint\n return `${this.httpEndpoint.slice(0, -1)}${path}`;\n } else {\n return `${this.httpEndpoint}${path}`;\n }\n }\n\n checkToken(token: string) {\n const prefix = 'Bearer ';\n if (token.startsWith(prefix)) {\n return token;\n } else {\n return prefix + token;\n }\n }\n\n async fetch(\n method: string,\n path: string,\n token?: string,\n data?: Payload,\n signal?: AbortSignal\n ): Promise<Response> {\n try {\n const headers: { Authorization?: string; 'Content-Type'?: string } = {};\n if (token) headers['Authorization'] = this.checkToken(token); // Assuming token is a bearer token\n\n let body;\n\n if (data instanceof FormData) {\n body = data;\n } else {\n headers['Content-Type'] = 'application/json';\n body = data ? JSON.stringify(data) : null;\n }\n\n const res = await fetch(this.buildEndpoint(path), {\n method,\n headers,\n signal,\n body\n });\n\n if (!res.ok) {\n const body = await res.json();\n if (res.status === 401 && this.on401) {\n removeToken();\n this.on401();\n }\n throw new ClientError(res.statusText, body.detail);\n }\n\n return res;\n } catch (error: any) {\n if (error instanceof ClientError && this.onError) {\n this.onError(error);\n }\n console.error(error);\n throw error;\n }\n }\n\n async get(endpoint: string, token?: string) {\n return await this.fetch('GET', endpoint, token);\n }\n\n async post(\n endpoint: string,\n data: Payload,\n token?: string,\n signal?: AbortSignal\n ) {\n return await this.fetch('POST', endpoint, token, data, signal);\n }\n\n async put(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PUT', endpoint, token, data);\n }\n\n async patch(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PATCH', endpoint, token, data);\n }\n\n async delete(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('DELETE', endpoint, token, data);\n }\n}\n\nexport class ChainlitAPI extends APIBase {\n async headerAuth() {\n const res = await this.post(`/auth/header`, {});\n return res.json();\n }\n\n async passwordAuth(data: FormData) {\n const res = await this.post(`/login`, data);\n return res.json();\n }\n\n async logout() {\n const res = await this.post(`/logout`, {});\n return res.json();\n }\n\n async 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 deleteFeedback(\n feedbackId: string,\n accessToken?: string\n ): Promise<{ success: boolean }> {\n const res = await this.delete(`/feedback`, { feedbackId }, accessToken);\n return res.json();\n }\n\n async listThreads(\n pagination: IPagination,\n filter: IThreadFilters,\n accessToken?: string\n ): Promise<{\n pageInfo: IPageInfo;\n data: IThread[];\n }> {\n const res = await this.post(\n `/project/threads`,\n { pagination, filter },\n accessToken\n );\n\n return res.json();\n }\n\n async deleteThread(threadId: string, accessToken?: string) {\n const res = await this.delete(`/project/thread`, { threadId }, accessToken);\n\n return res.json();\n }\n\n uploadFile(\n file: File,\n onProgress: (progress: number) => void,\n sessionId: string,\n token?: string\n ) {\n const xhr = new XMLHttpRequest();\n\n const promise = new Promise<{ id: string }>((resolve, reject) => {\n const formData = new FormData();\n formData.append('file', file);\n\n xhr.open(\n 'POST',\n this.buildEndpoint(`/project/file?session_id=${sessionId}`),\n true\n );\n\n if (token) {\n xhr.setRequestHeader('Authorization', this.checkToken(token));\n }\n\n // Track the progress of the upload\n xhr.upload.onprogress = function (event) {\n if (event.lengthComputable) {\n const percentage = (event.loaded / event.total) * 100;\n onProgress(percentage);\n }\n };\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n const response = JSON.parse(xhr.responseText);\n resolve(response);\n } else {\n reject('Upload failed');\n }\n };\n\n xhr.onerror = function () {\n reject('Upload error');\n };\n\n xhr.send(formData);\n });\n\n return { xhr, promise };\n }\n\n getElementUrl(id: string, sessionId: string) {\n const queryParams = `?session_id=${sessionId}`;\n return this.buildEndpoint(`/project/file/${id}${queryParams}`);\n }\n\n getLogoEndpoint(theme: string) {\n return this.buildEndpoint(`/logo?theme=${theme}`);\n }\n\n getOAuthEndpoint(provider: string) {\n return this.buildEndpoint(`/auth/oauth/${provider}`);\n }\n}\n","export * from './useChatData';\nexport * from './useChatInteract';\nexport * from './useChatMessages';\nexport * from './useChatSession';\nexport * from './api';\nexport * from './types';\nexport * from './state';\nexport * from './utils/message';\n\nexport { Socket } from 'socket.io-client';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/useChatData.ts","../src/state.ts","../src/utils/group.ts","../src/useChatInteract.ts","../src/utils/message.ts","../src/useChatMessages.ts","../src/useChatSession.ts","../src/utils/token.ts","../src/api/hooks/auth.ts","../src/api/hooks/api.ts","../src/api/index.tsx","../src/index.ts"],"names":["useRecoilValue","isEqual","DefaultValue","atom","selector","uuidv4","groupByDate","data","groupedData","today","yesterday","sevenDaysAgo","thirtyDaysAgo","item","createdAt","isToday","isYesterday","isLast7Days","isLast30Days","category","threadIdToResumeState","chatProfileState","sessionIdAtom","sessionIdState","get","set","newValue","sessionState","actionState","messagesState","tokenCountState","loadingState","askUserState","callFnState","chatSettingsInputsState","chatSettingsDefaultValueSelector","form","input","chatSettingsValueState","elementState","avatarState","tasklistState","firstUserInteraction","accessTokenState","userState","threadHistoryState","setSelf","onSet","oldValue","timeGroupedThreads","sideViewState","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","setSideView","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","setCallFn","setChatSettingsInputs","chatProfile","setChatProfile","idToResume","_connect","userEnv","pathname","socketPath","old","s","_","thread","step","e","interaction","id","token","spec","callback","name","args","event","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","type","on401","onError","prefix","method","signal","headers","body","res","error","ChainlitAPI","generation","controller","tokenCb","payload","reader","push","done","value","string","err","feedback","feedbackId","pagination","filter","threadId","xhr","formData","percentage","queryParams","theme","provider","Socket"],"mappings":"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","sourcesContent":["import { useRecoilValue } from 'recoil';\n\nimport {\n actionState,\n askUserState,\n 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 ICallFn,\n IMessageElement,\n IStep,\n ITasklistElement,\n IUser,\n ThreadHistory\n} from './types';\nimport { groupByDate } from './utils/group';\n\nexport interface ISession {\n socket: Socket;\n error?: boolean;\n}\n\nexport const threadIdToResumeState = atom<string | undefined>({\n key: 'ThreadIdToResume',\n default: undefined\n});\n\nexport const chatProfileState = atom<string | undefined>({\n key: 'ChatProfile',\n default: undefined\n});\n\nconst sessionIdAtom = atom<string>({\n key: 'SessionId',\n default: uuidv4()\n});\n\nexport const sessionIdState = selector({\n key: 'SessionIdSelector',\n get: ({ get }) => get(sessionIdAtom),\n set: ({ set }, newValue) =>\n set(sessionIdAtom, newValue instanceof DefaultValue ? uuidv4() : newValue)\n});\n\nexport const sessionState = atom<ISession | undefined>({\n key: 'Session',\n dangerouslyAllowMutability: true,\n default: undefined\n});\n\nexport const actionState = atom<IAction[]>({\n key: 'Actions',\n default: []\n});\n\nexport const messagesState = atom<IStep[]>({\n key: 'Messages',\n dangerouslyAllowMutability: true,\n default: []\n});\n\nexport const tokenCountState = atom<number>({\n key: 'TokenCount',\n default: 0\n});\n\nexport const loadingState = atom<boolean>({\n key: 'Loading',\n default: false\n});\n\nexport const askUserState = atom<IAsk | undefined>({\n key: 'AskUser',\n default: undefined\n});\n\nexport const callFnState = atom<ICallFn | undefined>({\n key: 'CallFn',\n default: undefined\n});\n\nexport const chatSettingsInputsState = atom<any>({\n key: 'ChatSettings',\n default: []\n});\n\nexport const chatSettingsDefaultValueSelector = selector({\n key: 'ChatSettingsValue/Default',\n get: ({ get }) => {\n const chatSettings = get(chatSettingsInputsState);\n return chatSettings.reduce(\n (form: { [key: string]: any }, input: any) => (\n (form[input.id] = input.initial), form\n ),\n {}\n );\n }\n});\n\nexport const chatSettingsValueState = atom({\n key: 'ChatSettingsValue',\n default: chatSettingsDefaultValueSelector\n});\n\nexport const elementState = atom<IMessageElement[]>({\n key: 'DisplayElements',\n default: []\n});\n\nexport const 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\nexport const sideViewState = atom<IMessageElement | undefined>({\n key: 'SideView',\n default: undefined\n});\n","import { IThread } from 'src/types';\n\nexport const groupByDate = (data: IThread[]) => {\n const groupedData: { [key: string]: IThread[] } = {};\n\n const today = new Date();\n const yesterday = new Date();\n yesterday.setDate(today.getDate() - 1);\n const sevenDaysAgo = new Date();\n sevenDaysAgo.setDate(today.getDate() - 7);\n const thirtyDaysAgo = new Date();\n thirtyDaysAgo.setDate(today.getDate() - 30);\n\n data.forEach((item) => {\n const createdAt = new Date(item.createdAt);\n const isToday = createdAt.toDateString() === today.toDateString();\n const isYesterday = createdAt.toDateString() === yesterday.toDateString();\n const isLast7Days = createdAt >= sevenDaysAgo;\n const isLast30Days = createdAt >= thirtyDaysAgo;\n\n let category: string;\n\n if (isToday) {\n category = 'Today';\n } else if (isYesterday) {\n category = 'Yesterday';\n } else if (isLast7Days) {\n category = 'Previous 7 days';\n } else if (isLast30Days) {\n category = 'Previous 30 days';\n } else {\n const monthYear = createdAt.toLocaleString('default', {\n month: 'long',\n year: 'numeric'\n });\n\n category = monthYear.split(' ').slice(0, 1).join(' ');\n }\n\n if (!groupedData[category]) {\n groupedData[category] = [];\n }\n\n groupedData[category].push(item);\n });\n\n return groupedData;\n};\n","import { useCallback } from 'react';\nimport { useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil';\nimport {\n accessTokenState,\n actionState,\n askUserState,\n avatarState,\n chatSettingsInputsState,\n chatSettingsValueState,\n elementState,\n firstUserInteraction,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\n sideViewState,\n tasklistState,\n threadIdToResumeState,\n tokenCountState\n} from 'src/state';\nimport { IAction, IFileRef, IStep } from 'src/types';\nimport { addMessage } from 'src/utils/message';\n\nimport { ChainlitAPI } from './api';\n\nconst useChatInteract = () => {\n const accessToken = useRecoilValue(accessTokenState);\n const session = useRecoilValue(sessionState);\n const askUser = useRecoilValue(askUserState);\n const sessionId = useRecoilValue(sessionIdState);\n\n const resetChatSettings = useResetRecoilState(chatSettingsInputsState);\n const resetSessionId = useResetRecoilState(sessionIdState);\n const resetChatSettingsValue = useResetRecoilState(chatSettingsValueState);\n\n const setFirstUserInteraction = useSetRecoilState(firstUserInteraction);\n const setLoading = useSetRecoilState(loadingState);\n const setMessages = useSetRecoilState(messagesState);\n const setElements = useSetRecoilState(elementState);\n const setAvatars = useSetRecoilState(avatarState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const setIdToResume = useSetRecoilState(threadIdToResumeState);\n const setSideView = useSetRecoilState(sideViewState);\n\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 setSideView(undefined);\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 callFnState,\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 setCallFn = useSetRecoilState(callFnState);\n\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 pathname = new URL(client.httpEndpoint).pathname;\n const socketPath = pathname.endsWith('/')\n ? 'ws/socket.io'\n : '/ws/socket.io';\n const socket = io(client.httpEndpoint, {\n path: `${pathname}${socketPath}`,\n extraHeaders: {\n Authorization: accessToken || '',\n 'X-Chainlit-Client-Type': client.type,\n 'X-Chainlit-Session-Id': sessionId,\n 'X-Chainlit-Thread-Id': idToResume || '',\n 'user-env': JSON.stringify(userEnv),\n 'X-Chainlit-Chat-Profile': chatProfile || ''\n }\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('call_fn', ({ name, args }, callback) => {\n const event = new CustomEvent('chainlit-call-fn', {\n detail: {\n name,\n args,\n callback\n }\n });\n window.dispatchEvent(event);\n\n setCallFn({ name, args, callback });\n });\n\n socket.on('clear_call_fn', () => {\n setCallFn(undefined);\n });\n\n socket.on('call_fn_timeout', () => {\n setCallFn(undefined);\n });\n\n socket.on('chat_settings', (inputs: any) => {\n setChatSettingsInputs(inputs);\n resetChatSettingsValue();\n });\n\n socket.on('element', (element: IElement) => {\n if (!element.url && element.chainlitKey) {\n element.url = client.getElementUrl(element.chainlitKey, sessionId);\n }\n\n if (element.type === '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 sessionId,\n chatProfile,\n idToResume,\n setChatProfile\n };\n};\n\nexport { useChatSession };\n","const tokenKey = 'token';\n\nexport function getToken() {\n try {\n return localStorage.getItem(tokenKey);\n } catch (e) {\n return;\n }\n}\n\nexport function setToken(token: string) {\n try {\n return localStorage.setItem(tokenKey, token);\n } catch (e) {\n return;\n }\n}\n\nexport function removeToken() {\n try {\n return localStorage.removeItem(tokenKey);\n } catch (e) {\n return;\n }\n}\n","import jwt_decode from 'jwt-decode';\nimport { useEffect } from 'react';\nimport { useRecoilState, useSetRecoilState } from 'recoil';\nimport { accessTokenState, threadHistoryState, userState } from 'src/state';\nimport { IUser } from 'src/types';\nimport { getToken, removeToken, setToken } from 'src/utils/token';\n\nimport { ChainlitAPI } from '..';\nimport { useApi } from './api';\n\nexport const useAuth = (apiClient: ChainlitAPI) => {\n const { data, isLoading } = useApi<{\n requireLogin: boolean;\n passwordAuth: boolean;\n headerAuth: boolean;\n oauthProviders: string[];\n }>(apiClient, '/auth/config');\n const [accessToken, setAccessToken] = useRecoilState(accessTokenState);\n const setThreadHistory = useSetRecoilState(threadHistoryState);\n const [user, setUser] = useRecoilState(userState);\n\n const isReady = !!(!isLoading && data);\n\n const logout = async () => {\n await apiClient.logout();\n setUser(null);\n removeToken();\n setAccessToken('');\n setThreadHistory(undefined);\n };\n\n const saveAndSetToken = (token: string | null | undefined) => {\n if (!token) {\n logout();\n return;\n }\n try {\n const { exp, ...User } = jwt_decode(token) as any;\n setToken(token);\n setAccessToken(`Bearer ${token}`);\n setUser(User as IUser);\n } catch (e) {\n console.error(\n 'Invalid token, clearing token from local storage',\n 'error:',\n e\n );\n logout();\n }\n };\n\n useEffect(() => {\n if (!user && getToken()) {\n // Initialize the token from local storage\n saveAndSetToken(getToken());\n return;\n }\n }, []);\n\n const isAuthenticated = !!accessToken;\n\n if (data && !data.requireLogin) {\n return {\n data,\n user: null,\n isReady,\n isAuthenticated: true,\n accessToken: '',\n logout: () => {},\n setAccessToken: () => {}\n };\n }\n\n return {\n data,\n user: user,\n isAuthenticated,\n isReady,\n accessToken: accessToken,\n logout: logout,\n setAccessToken: saveAndSetToken\n };\n};\n","import { useRecoilValue } from 'recoil';\nimport { ChainlitAPI } from 'src/api';\nimport { accessTokenState } from 'src/state';\nimport useSWR, { SWRConfiguration } from 'swr';\n\nconst fetcher = async (\n client: ChainlitAPI,\n endpoint: string,\n token?: string\n) => {\n const res = await client.get(endpoint, token);\n\n return res?.json();\n};\n\nfunction useApi<T>(\n client: ChainlitAPI,\n path?: string | null,\n options?: SWRConfiguration\n) {\n const accessToken = useRecoilValue(accessTokenState);\n\n return useSWR<T, Error>(\n path ? [path, accessToken] : null,\n ([url, token]: [url: string, token: string]) => fetcher(client, url, token),\n options\n );\n}\n\nexport { useApi, fetcher };\n","import { 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 type: 'app' | 'copilot' | 'teams' | 'slack',\n public on401?: () => void,\n public onError?: (error: ClientError) => void\n ) {}\n\n buildEndpoint(path: string) {\n if (this.httpEndpoint.endsWith('/')) {\n // remove trailing slash on httpEndpoint\n return `${this.httpEndpoint.slice(0, -1)}${path}`;\n } else {\n return `${this.httpEndpoint}${path}`;\n }\n }\n\n checkToken(token: string) {\n const prefix = 'Bearer ';\n if (token.startsWith(prefix)) {\n return token;\n } else {\n return prefix + token;\n }\n }\n\n async fetch(\n method: string,\n path: string,\n token?: string,\n data?: Payload,\n signal?: AbortSignal\n ): Promise<Response> {\n try {\n const headers: { Authorization?: string; 'Content-Type'?: string } = {};\n if (token) headers['Authorization'] = this.checkToken(token); // Assuming token is a bearer token\n\n let body;\n\n if (data instanceof FormData) {\n body = data;\n } else {\n headers['Content-Type'] = 'application/json';\n body = data ? JSON.stringify(data) : null;\n }\n\n const res = await fetch(this.buildEndpoint(path), {\n method,\n headers,\n signal,\n body\n });\n\n if (!res.ok) {\n const body = await res.json();\n if (res.status === 401 && this.on401) {\n removeToken();\n this.on401();\n }\n throw new ClientError(res.statusText, body.detail);\n }\n\n return res;\n } catch (error: any) {\n if (error instanceof ClientError && this.onError) {\n this.onError(error);\n }\n console.error(error);\n throw error;\n }\n }\n\n async get(endpoint: string, token?: string) {\n return await this.fetch('GET', endpoint, token);\n }\n\n async post(\n endpoint: string,\n data: Payload,\n token?: string,\n signal?: AbortSignal\n ) {\n return await this.fetch('POST', endpoint, token, data, signal);\n }\n\n async put(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PUT', endpoint, token, data);\n }\n\n async patch(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PATCH', endpoint, token, data);\n }\n\n async delete(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('DELETE', endpoint, token, data);\n }\n}\n\nexport class ChainlitAPI extends APIBase {\n async headerAuth() {\n const res = await this.post(`/auth/header`, {});\n return res.json();\n }\n\n async passwordAuth(data: FormData) {\n const res = await this.post(`/login`, data);\n return res.json();\n }\n\n async logout() {\n const res = await this.post(`/logout`, {});\n return res.json();\n }\n\n async 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 deleteFeedback(\n feedbackId: string,\n accessToken?: string\n ): Promise<{ success: boolean }> {\n const res = await this.delete(`/feedback`, { feedbackId }, accessToken);\n return res.json();\n }\n\n async listThreads(\n pagination: IPagination,\n filter: IThreadFilters,\n accessToken?: string\n ): Promise<{\n pageInfo: IPageInfo;\n data: IThread[];\n }> {\n const res = await this.post(\n `/project/threads`,\n { pagination, filter },\n accessToken\n );\n\n return res.json();\n }\n\n async deleteThread(threadId: string, accessToken?: string) {\n const res = await this.delete(`/project/thread`, { threadId }, accessToken);\n\n return res.json();\n }\n\n uploadFile(\n file: File,\n onProgress: (progress: number) => void,\n sessionId: string,\n token?: string\n ) {\n const xhr = new XMLHttpRequest();\n\n const promise = new Promise<{ id: string }>((resolve, reject) => {\n const formData = new FormData();\n formData.append('file', file);\n\n xhr.open(\n 'POST',\n this.buildEndpoint(`/project/file?session_id=${sessionId}`),\n true\n );\n\n if (token) {\n xhr.setRequestHeader('Authorization', this.checkToken(token));\n }\n\n // Track the progress of the upload\n xhr.upload.onprogress = function (event) {\n if (event.lengthComputable) {\n const percentage = (event.loaded / event.total) * 100;\n onProgress(percentage);\n }\n };\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n const response = JSON.parse(xhr.responseText);\n resolve(response);\n } else {\n reject('Upload failed');\n }\n };\n\n xhr.onerror = function () {\n reject('Upload error');\n };\n\n xhr.send(formData);\n });\n\n return { xhr, promise };\n }\n\n getElementUrl(id: string, sessionId: string) {\n const queryParams = `?session_id=${sessionId}`;\n return this.buildEndpoint(`/project/file/${id}${queryParams}`);\n }\n\n getLogoEndpoint(theme: string) {\n return this.buildEndpoint(`/logo?theme=${theme}`);\n }\n\n getOAuthEndpoint(provider: string) {\n return this.buildEndpoint(`/auth/oauth/${provider}`);\n }\n}\n","export * from './useChatData';\nexport * from './useChatInteract';\nexport * from './useChatMessages';\nexport * from './useChatSession';\nexport * from './api';\nexport * from './types';\nexport * from './state';\nexport * from './utils/message';\n\nexport { Socket } from 'socket.io-client';\n"]}
|
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.602",
|
|
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",
|