@chainlit/react-client 0.0.1 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -4
- package/dist/index.d.mts +141 -132
- package/dist/index.d.ts +141 -132
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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","conversationIdToResumeState","chatProfileState","sessionIdAtom","sessionIdState","get","set","newValue","sessionState","actionState","messagesState","tokenCountState","loadingState","askUserState","chatSettingsInputsState","chatSettingsDefaultValueSelector","form","input","chatSettingsValueState","elementState","avatarState","tasklistState","firstUserMessageState","accessTokenState","roleState","userState","conversationsHistoryState","setSelf","onSet","oldValue","groupedConversations","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","resetChatSettings","resetSessionId","resetChatSettingsValue","setFirstUserMessage","setLoading","setMessages","setElements","setAvatars","setTasklists","setActions","setTokenCount","setIdToResume","clear","sendMessage","files","oldMessages","replyMessage","updateChatSettings","values","stopTask","action","useChatMessages","firstUserMessage","debounce","useRecoilState","io","useChatSession","sessionId","setSession","setAskUser","setChatSettingsInputs","chatProfile","setChatProfile","idToResume","_connect","wsEndpoint","userEnv","accessToken","socket","old","s","_","conversation","e","id","token","spec","callback","inputs","element","update","newElement","remove","a","count","connect","disconnect","tokenKey","getToken","setToken","removeToken","jwt_decode","useEffect","useSWR","fetcher","client","endpoint","useApi","path","options","url","useAuth","apiClient","isLoading","setAccessToken","setConversationsHistory","user","setUser","isReady","logout","saveAndSetToken","exp","AppUser","isAuthenticated","ClientError","detail","APIBase","httpEndpoint","on401","onError","prefix","method","signal","headers","body","res","error","ChainlitAPI","prompt","controller","tokenCb","reader","push","done","value","string","err","feedback","feedbackComment","pagination","filter","conversationId","theme","provider","Socket"],"mappings":"AAAA,OAAS,kBAAAA,MAAsB,SCA/B,OAAOC,OAAa,iBACpB,OAAS,gBAAAC,GAAc,QAAAC,EAAM,YAAAC,OAAgB,SAE7C,OAAS,MAAMC,OAAc,OCDtB,IAAMC,GAAeC,GAA0B,CACpD,IAAMC,EAAkD,CAAC,EAEnDC,EAAQ,IAAI,KACZC,EAAY,IAAI,KACtBA,EAAU,QAAQD,EAAM,QAAQ,EAAI,CAAC,EACrC,IAAME,EAAe,IAAI,KACzBA,EAAa,QAAQF,EAAM,QAAQ,EAAI,CAAC,EACxC,IAAMG,EAAgB,IAAI,KAC1B,OAAAA,EAAc,QAAQH,EAAM,QAAQ,EAAI,EAAE,EAE1CF,EAAK,QAASM,GAAS,CACrB,IAAMC,EAAY,IAAI,KAAKD,EAAK,SAAS,EACnCE,EAAUD,EAAU,aAAa,IAAML,EAAM,aAAa,EAC1DO,EAAcF,EAAU,aAAa,IAAMJ,EAAU,aAAa,EAClEO,EAAcH,GAAaH,EAC3BO,EAAeJ,GAAaF,EAE9BO,EAEAJ,EACFI,EAAW,QACFH,EACTG,EAAW,YACFF,EACTE,EAAW,kBACFD,EACTC,EAAW,mBAOXA,EALkBL,EAAU,eAAe,UAAW,CACpD,MAAO,OACP,KAAM,SACR,CAAC,EAEoB,MAAM,GAAG,EAAE,MAAM,EAAG,CAAC,EAAE,KAAK,GAAG,EAGjDN,EAAYW,CAAQ,IACvBX,EAAYW,CAAQ,EAAI,CAAC,GAG3BX,EAAYW,CAAQ,EAAE,KAAKN,CAAI,CACjC,CAAC,EAEML,CACT,EDxBO,IAAMY,EAA8BjB,EAAyB,CAClE,IAAK,yBACL,QAAS,MACX,CAAC,EAEYkB,GAAmBlB,EAAyB,CACvD,IAAK,cACL,QAAS,MACX,CAAC,EAEKmB,GAAgBnB,EAAa,CACjC,IAAK,YACL,QAASE,GAAO,CAClB,CAAC,EAEYkB,EAAiBnB,GAAS,CACrC,IAAK,oBACL,IAAK,CAAC,CAAE,IAAAoB,CAAI,IAAMA,EAAIF,EAAa,EACnC,IAAK,CAAC,CAAE,IAAAG,CAAI,EAAGC,IACbD,EAAIH,GAAeI,aAAoBxB,GAAeG,GAAO,EAAIqB,CAAQ,CAC7E,CAAC,EAEYC,EAAexB,EAA2B,CACrD,IAAK,UACL,2BAA4B,GAC5B,QAAS,MACX,CAAC,EAEYyB,EAAczB,EAAgB,CACzC,IAAK,UACL,QAAS,CAAC,CACZ,CAAC,EAEY0B,EAAgB1B,EAAiB,CAC5C,IAAK,WACL,2BAA4B,GAC5B,QAAS,CAAC,CACZ,CAAC,EAEY2B,EAAkB3B,EAAa,CAC1C,IAAK,aACL,QAAS,CACX,CAAC,EAEY4B,EAAe5B,EAAc,CACxC,IAAK,UACL,QAAS,EACX,CAAC,EAEY6B,EAAe7B,EAAuB,CACjD,IAAK,UACL,QAAS,MACX,CAAC,EAEY8B,EAA0B9B,EAAU,CAC/C,IAAK,eACL,QAAS,CAAC,CACZ,CAAC,EAEY+B,EAAmC9B,GAAS,CACvD,IAAK,4BACL,IAAK,CAAC,CAAE,IAAAoB,CAAI,IACWA,EAAIS,CAAuB,EAC5B,OAClB,CAACE,EAA8BC,KAC5BD,EAAKC,EAAM,EAAE,EAAIA,EAAM,QAAUD,GAEpC,CAAC,CACH,CAEJ,CAAC,EAEYE,EAAyBlC,EAAK,CACzC,IAAK,oBACL,QAAS+B,CACX,CAAC,EAEYI,EAAenC,EAAwB,CAClD,IAAK,kBACL,QAAS,CAAC,CACZ,CAAC,EAEYoC,EAAcpC,EAAuB,CAChD,IAAK,iBACL,QAAS,CAAC,CACZ,CAAC,EAEYqC,EAAgBrC,EAAyB,CACpD,IAAK,mBACL,QAAS,CAAC,CACZ,CAAC,EAEYsC,EAAwBtC,EAA2B,CAC9D,IAAK,mBACL,QAAS,MACX,CAAC,EAEYuC,EAAmBvC,EAAyB,CACvD,IAAK,cACL,QAAS,MACX,CAAC,EAEYwC,GAAYxC,EAAW,CAClC,IAAK,OACL,QAAS,MACX,CAAC,EAEYyC,GAAYzC,EAAsB,CAC7C,IAAK,OACL,QAAS,IACX,CAAC,EAEY0C,GAA4B1C,EACvC,CACE,IAAK,uBACL,QAAS,CACP,cAAe,OACf,sBAAuB,OACvB,qBAAsB,OACtB,SAAU,MACZ,EACA,QAAS,CACP,CAAC,CAAE,QAAA2C,EAAS,MAAAC,CAAM,IAAoC,CACpDA,EACE,CACErB,EACAsB,IACG,CACH,IAAIC,EAAuBvB,GAAU,qBAGnCA,GAAU,eACV,CAACzB,GAAQyB,EAAS,cAAesB,GAAU,oBAAoB,IAE/DC,EAAuB3C,GAAYoB,EAAS,aAAa,GAG3DoB,EAAQ,CACN,GAAGpB,EACH,qBAAAuB,CACF,CAAC,CACH,CACF,CACF,CACF,CACF,CACF,ED/IA,IAAMC,GAAc,IAAM,CACxB,IAAMC,EAAUnD,EAAe+B,CAAY,EACrCqB,EAAWpD,EAAesC,CAAY,EACtCe,EAAUrD,EAAeuC,CAAW,EACpCe,EAAYtD,EAAewC,CAAa,EACxCe,EAAUvD,EAAe4B,CAAW,EACpC4B,EAAUxD,EAAe2B,CAAY,EACrC8B,EAAUzD,EAAegC,CAAY,EACrC0B,EAAqB1D,EAAeiC,CAAuB,EAC3D0B,EAAoB3D,EAAeqC,CAAsB,EACzDuB,EAA2B5D,EAC/BkC,CACF,EAEM2B,EAAYL,GAAS,OAAO,WAAa,CAACA,GAAS,MACnDM,EACJ,CAACD,GACDV,GACAM,GAAS,KAAK,OAAS,QACvBA,GAAS,KAAK,OAAS,SAEzB,MAAO,CACL,QAAAF,EACA,QAAAE,EACA,QAAAJ,EACA,yBAAAO,EACA,mBAAAF,EACA,kBAAAC,EACA,UAAAE,EACA,SAAAC,EACA,SAAAV,EACA,MAAOI,GAAS,MAChB,QAAAL,EACA,UAAAG,CACF,CACF,EG7DA,OAAS,eAAAS,MAAmB,QAC5B,OAAS,kBAAA/D,GAAgB,uBAAAgE,GAAqB,qBAAAC,MAAyB,SCDvE,OAAOhE,MAAa,iBAGpB,IAAMiE,GAAgBC,GAAqC,CACzD,IAAIC,EAA6B,CAAC,EAElC,QAAWC,KAAWF,EACpBC,EAAiBE,EAAWF,EAAgBC,CAAO,EAGrD,OAAOD,CACT,EAEMG,GAAgB,CAACJ,EAAsBK,IAAkB,CAC7D,GAAIL,EAAS,OAAS,IAAMK,EAC1B,MAAO,GAGT,QAASC,EAAID,EAAQ,EAAGC,EAAIN,EAAS,OAAQM,IAC3C,GAAI,CAAAN,EAASM,CAAC,EAAE,UAGd,MAAO,GAIX,MAAO,EACT,EAIMH,EAAa,CAACH,EAAsBE,IACpCK,EAAeP,EAAUE,EAAQ,EAAE,EAC9BM,EAAkBR,EAAUE,EAAQ,GAAIA,CAAO,EAC7CA,EAAQ,SACVO,GAAmBT,EAAUE,EAAQ,SAAUA,CAAO,EACpDA,EAAQ,QAAUA,EAAQ,OAAS,EACrCQ,GAAiBV,EAAUE,EAAQ,OAAQA,CAAO,EAElD,CAAC,GAAGF,EAAUE,CAAO,EAI1BQ,GAAmB,CACvBV,EACAW,EACAC,EACAC,EAA6B,IACd,CACf,IAAMC,EAAe,CAAC,GAAGd,CAAQ,EAEjC,GAAIc,EAAa,SAAW,EAC1B,MAAO,CAAC,GAAGA,EAAcF,CAAU,EAC9B,CACL,IAAMP,EAAQS,EAAa,OAAS,EAC9BC,EAAMD,EAAaT,CAAK,EAG9B,OAFAU,EAAI,YAAcA,EAAI,aAAe,CAAC,EAElCF,EAAqB,IAAMF,GAC7BI,EAAI,YAAc,CAAC,GAAGA,EAAI,YAAaH,CAAU,EACjDE,EAAaT,CAAK,EAAI,CAAE,GAAGU,CAAI,EAExBD,IAEPC,EAAI,YAAcL,GAChBK,EAAI,YACJJ,EACAC,EACAC,EAAqB,CACvB,EAEAC,EAAaT,CAAK,EAAI,CAAE,GAAGU,CAAI,EACxBD,EAEX,CACF,EAEML,GAAqB,CACzBT,EACAgB,EACAJ,IACe,CACf,IAAME,EAAe,CAAC,GAAGd,CAAQ,EAEjC,QAASK,EAAQ,EAAGA,EAAQS,EAAa,OAAQT,IAAS,CACxD,IAAMU,EAAMD,EAAaT,CAAK,EAE1BvE,EAAQiF,EAAI,GAAIC,CAAQ,GAC1BD,EAAI,YAAcA,EAAI,YAClB,CAAC,GAAGA,EAAI,YAAaH,CAAU,EAC/B,CAACA,CAAU,EACfE,EAAaT,CAAK,EAAI,CAAE,GAAGU,CAAI,GACtBR,EAAeO,EAAcE,CAAQ,GAAKD,EAAI,cACvDA,EAAI,YAAcN,GAChBM,EAAI,YACJC,EACAJ,CACF,EACAE,EAAaT,CAAK,EAAI,CAAE,GAAGU,CAAI,EAEnC,CAEA,OAAOD,CACT,EAEMP,EAAiB,CAACP,EAAsBiB,IAAsB,CAClE,QAAWf,KAAWF,EAAU,CAC9B,GAAIlE,EAAQoE,EAAQ,GAAIe,CAAS,EAC/B,MAAO,GACF,GAAIf,EAAQ,aAAeA,EAAQ,YAAY,OAAS,GACzDK,EAAeL,EAAQ,YAAae,CAAS,EAC/C,MAAO,EAGb,CACA,MAAO,EACT,EAEMT,EAAoB,CACxBR,EACAiB,EACAC,IACe,CACf,IAAMJ,EAAe,CAAC,GAAGd,CAAQ,EAEjC,QAASK,EAAQ,EAAGA,EAAQS,EAAa,OAAQT,IAAS,CACxD,IAAMU,EAAMD,EAAaT,CAAK,EAE1BvE,EAAQiF,EAAI,GAAIE,CAAS,EAC3BH,EAAaT,CAAK,EAAI,CAAE,YAAaU,EAAI,YAAa,GAAGG,CAAe,EAC/DX,EAAeO,EAAcG,CAAS,GAAKF,EAAI,cACxDA,EAAI,YAAcP,EAChBO,EAAI,YACJE,EACAC,CACF,EACAJ,EAAaT,CAAK,EAAI,CAAE,GAAGU,CAAI,EAEnC,CAEA,OAAOD,CACT,EAEMK,GAAoB,CAACnB,EAAsBiB,IAAsB,CACrE,IAAIH,EAAe,CAAC,GAAGd,CAAQ,EAE/B,QAASK,EAAQ,EAAGA,EAAQS,EAAa,OAAQT,IAAS,CACxD,IAAMU,EAAMD,EAAaT,CAAK,EAE1BU,EAAI,KAAOE,EACbH,EAAe,CACb,GAAGA,EAAa,MAAM,EAAGT,CAAK,EAC9B,GAAGS,EAAa,MAAMT,EAAQ,CAAC,CACjC,EACSE,EAAeO,EAAcG,CAAS,GAAKF,EAAI,cACxDA,EAAI,YAAcI,GAAkBJ,EAAI,YAAaE,CAAS,EAC9DH,EAAaT,CAAK,EAAI,CAAE,GAAGU,CAAI,EAEnC,CAEA,OAAOD,CACT,EAEMM,GAA2B,CAC/BpB,EACAiB,EACAI,EACAC,IACe,CACf,IAAMR,EAAe,CAAC,GAAGd,CAAQ,EAEjC,QAASK,EAAQ,EAAGA,EAAQS,EAAa,OAAQT,IAAS,CACxD,IAAMU,EAAMD,EAAaT,CAAK,EAE1BvE,EAAQiF,EAAI,GAAIE,CAAS,GACvBK,EACFP,EAAI,QAAUM,EAEdN,EAAI,SAAWM,EAGjBP,EAAaT,CAAK,EAAI,CAAE,GAAGU,CAAI,GACtBA,EAAI,cACbA,EAAI,YAAcK,GAChBL,EAAI,YACJE,EACAI,EACAC,CACF,EACAR,EAAaT,CAAK,EAAI,CAAE,GAAGU,CAAI,EAEnC,CAEA,OAAOD,CACT,ED7KA,IAAMS,GAAkB,IAAM,CAC5B,IAAMlC,EAAUxD,GAAe2B,CAAY,EACrC8B,EAAUzD,GAAegC,CAAY,EAErC2D,EAAoB3B,GAAoB/B,CAAuB,EAC/D2D,EAAiB5B,GAAoBzC,CAAc,EACnDsE,EAAyB7B,GAAoB3B,CAAsB,EAEnEyD,EAAsB7B,EAAkBxB,CAAqB,EAC7DsD,EAAa9B,EAAkBlC,CAAY,EAC3CiE,EAAc/B,EAAkBpC,CAAa,EAC7CoE,EAAchC,EAAkB3B,CAAY,EAC5C4D,EAAajC,EAAkB1B,CAAW,EAC1C4D,EAAelC,EAAkBzB,CAAa,EAC9C4D,EAAanC,EAAkBrC,CAAW,EAC1CyE,EAAgBpC,EAAkBnC,CAAe,EACjDwE,EAAgBrC,EAAkB7C,CAA2B,EAE7DmF,EAAQxC,EAAY,IAAM,CAC9BP,GAAS,OAAO,KAAK,eAAe,EACpCA,GAAS,OAAO,WAAW,EAC3B8C,EAAc,MAAS,EACvBV,EAAe,EACfE,EAAoB,MAAS,EAC7BE,EAAY,CAAC,CAAC,EACdC,EAAY,CAAC,CAAC,EACdC,EAAW,CAAC,CAAC,EACbC,EAAa,CAAC,CAAC,EACfC,EAAW,CAAC,CAAC,EACbC,EAAc,CAAC,EACfV,EAAkB,EAClBE,EAAuB,CACzB,EAAG,CAACrC,CAAO,CAAC,EAENgD,EAAczC,EAClB,CAACM,EAAmBoC,IAA2B,CAC7CT,EAAaU,GAAgBpC,EAAWoC,EAAarC,CAAO,CAAC,EAE7Db,GAAS,OAAO,KAAK,aAAc,CAAE,QAAAa,EAAS,MAAAoC,CAAM,CAAC,CACvD,EACA,CAACjD,CAAO,CACV,EAEMmD,EAAe5C,EAClBM,GAAsB,CACjBZ,IACFuC,EAAaU,GAAgBpC,EAAWoC,EAAarC,CAAO,CAAC,EAC7DZ,EAAQ,SAASY,CAAO,EAE5B,EACA,CAACZ,EAASD,CAAO,CACnB,EAEMoD,EAAqB7C,EACxB8C,GAAmB,CAClBrD,GAAS,OAAO,KAAK,uBAAwBqD,CAAM,CACrD,EACA,CAACrD,CAAO,CACV,EAEMsD,EAAW/C,EAAY,IAAM,CACjCgC,EAAW,EAAK,EAChBvC,GAAS,OAAO,KAAK,MAAM,CAC7B,EAAG,CAACA,CAAO,CAAC,EASZ,MAAO,CACL,WARiBO,EAChBgD,GAAoB,CACnBvD,GAAS,OAAO,KAAK,cAAeuD,CAAM,CAC5C,EACA,CAACvD,CAAO,CACV,EAIE,MAAA+C,EACA,aAAAI,EACA,YAAAH,EACA,SAAAM,EACA,cAAAR,EACA,mBAAAM,CACF,CACF,EEtGA,OAAS,kBAAA5G,OAAsB,SAI/B,IAAMgH,GAAkB,IAAM,CAC5B,IAAM7C,EAAWnE,GAAe6B,CAAa,EACvCoF,EAAmBjH,GAAeyC,CAAqB,EAE7D,MAAO,CACL,SAAA0B,EACA,iBAAA8C,CACF,CACF,ECZA,OAAOC,OAAc,kBACrB,OAAS,eAAAnD,OAAmB,QAC5B,OACE,kBAAAoD,GACA,kBAAAnH,GACA,uBAAAgE,GACA,qBAAAC,MACK,SACP,OAAOmD,OAAQ,mBAoCf,IAAMC,GAAiB,IAAM,CAC3B,IAAMC,EAAYtH,GAAeuB,CAAc,EAEzC,CAACiC,EAAS+D,CAAU,EAAIJ,GAAexF,CAAY,EAEnDkE,EAAyB7B,GAAoB3B,CAAsB,EACnEyD,EAAsB7B,EAAkBxB,CAAqB,EAC7DsD,EAAa9B,EAAkBlC,CAAY,EAC3CiE,EAAc/B,EAAkBpC,CAAa,EAC7C2F,EAAavD,EAAkBjC,CAAY,EAC3CiE,EAAchC,EAAkB3B,CAAY,EAC5C4D,EAAajC,EAAkB1B,CAAW,EAC1C4D,EAAelC,EAAkBzB,CAAa,EAC9C4D,EAAanC,EAAkBrC,CAAW,EAC1C6F,EAAwBxD,EAAkBhC,CAAuB,EACjEoE,EAAgBpC,EAAkBnC,CAAe,EACjD,CAAC4F,EAAaC,CAAc,EAAIR,GAAe9F,EAAgB,EAC/DuG,EAAa5H,GAAeoB,CAA2B,EAEvDyG,EAAW9D,GACf,CAAC,CACC,WAAA+D,EACA,QAAAC,EACA,YAAAC,CACF,IAIM,CACJ,IAAMC,EAASb,GAAGU,EAAY,CAC5B,KAAM,gBACN,aAAc,CACZ,cAAeE,GAAe,GAC9B,wBAAyBV,EACzB,6BAA8BM,GAAc,GAC5C,WAAY,KAAK,UAAUG,CAAO,EAClC,0BAA2BL,GAAe,EAC5C,CACF,CAAC,EACDH,EAAYW,IACVA,GAAK,QAAQ,mBAAmB,EAChCA,GAAK,QAAQ,MAAM,EACZ,CACL,OAAAD,CACF,EACD,EAEDA,EAAO,GAAG,UAAW,IAAM,CACzBA,EAAO,KAAK,uBAAuB,EACnCV,EAAYY,IAAO,CAAE,GAAGA,EAAI,MAAO,EAAM,EAAE,CAC7C,CAAC,EAEDF,EAAO,GAAG,gBAAkBG,GAAM,CAChCb,EAAYY,IAAO,CAAE,GAAGA,EAAI,MAAO,EAAK,EAAE,CAC5C,CAAC,EAEDF,EAAO,GAAG,aAAc,IAAM,CAC5BlC,EAAW,EAAI,CACjB,CAAC,EAEDkC,EAAO,GAAG,WAAY,IAAM,CAC1BlC,EAAW,EAAK,CAClB,CAAC,EAEDkC,EAAO,GAAG,SAAU,IAAM,CACxBA,EAAO,KAAK,eAAe,EAC3B,OAAO,SAAS,OAAO,CACzB,CAAC,EAEDA,EAAO,GAAG,sBAAwBI,GAAgC,CAChE,IAAIlE,EAAuB,CAAC,EAC5B,QAAWE,KAAWgE,EAAa,SACjClE,EAAWG,EAAWH,EAAUE,CAAO,EAErCgE,EAAa,UAAU,cACzBV,EAAeU,EAAa,UAAU,YAAY,EAEpDrC,EAAY7B,CAAQ,EACpB+B,EACGmC,EAAa,SAA8B,OACzCC,GAAMA,EAAE,OAAS,QACpB,CACF,EACAnC,EACGkC,EAAa,SAAgC,OAC3CC,GAAMA,EAAE,OAAS,UACpB,CACF,EACArC,EACGoC,EAAa,SAA+B,OAC1CC,GAAM,CAAC,SAAU,UAAU,EAAE,QAAQA,EAAE,IAAI,IAAM,EACpD,CACF,CACF,CAAC,EAEDL,EAAO,GAAG,cAAgB5D,GAAsB,CAC9C2B,EAAaU,GAAgBpC,EAAWoC,EAAarC,CAAO,CAAC,CAC/D,CAAC,EAED4D,EAAO,GAAG,oBAAsB5D,GAAsB,CACpDyB,EAAoBzB,CAAO,CAC7B,CAAC,EAED4D,EAAO,GAAG,iBAAmB5D,GAA4B,CACvD2B,EAAaU,GACX/B,EAAkB+B,EAAarC,EAAQ,GAAIA,CAAO,CACpD,CACF,CAAC,EAED4D,EAAO,GAAG,iBAAmB5D,GAAsB,CACjD2B,EAAaU,GACXpB,GAAkBoB,EAAarC,EAAQ,EAAE,CAC3C,CACF,CAAC,EAED4D,EAAO,GAAG,eAAiB5D,GAAsB,CAC/C2B,EAAaU,GAAgBpC,EAAWoC,EAAarC,CAAO,CAAC,CAC/D,CAAC,EAED4D,EAAO,GAAG,eAAgB,CAAC,CAAE,GAAAM,EAAI,MAAAC,EAAO,WAAA/C,CAAW,IAAc,CAC/DO,EAAaU,GACXnB,GAAyBmB,EAAa6B,EAAIC,EAAO/C,CAAU,CAC7D,CACF,CAAC,EAEDwC,EAAO,GAAG,MAAO,CAAC,CAAE,IAAA/C,EAAK,KAAAuD,CAAK,EAAGC,IAAa,CAC5ClB,EAAW,CAAE,KAAAiB,EAAM,SAAAC,CAAS,CAAC,EAC7B1C,EAAaU,GAAgBpC,EAAWoC,EAAaxB,CAAG,CAAC,EAEzDa,EAAW,EAAK,CAClB,CAAC,EAEDkC,EAAO,GAAG,cAAe,IAAM,CAC7BT,EAAW,MAAS,EACpBzB,EAAW,EAAK,CAClB,CAAC,EAEDkC,EAAO,GAAG,YAAa,IAAM,CAC3BT,EAAW,MAAS,CACtB,CAAC,EAEDS,EAAO,GAAG,gBAAkBU,GAAgB,CAC1ClB,EAAsBkB,CAAM,EAC5B9C,EAAuB,CACzB,CAAC,EAEDoC,EAAO,GAAG,UAAYW,GAAsB,CACtCA,EAAQ,OAAS,SACnB1C,EAAYgC,GAAQ,CAAC,GAAGA,EAAKU,CAAO,CAAC,EAC5BA,EAAQ,OAAS,WAC1BzC,EAAc+B,GAAQ,CAAC,GAAGA,EAAKU,CAAO,CAAC,EAEvC3C,EAAaiC,GAAQ,CAAC,GAAGA,EAAKU,CAAO,CAAC,CAE1C,CAAC,EAEDX,EAAO,GACL,iBACCY,GAA6C,CAC5C5C,EAAaiC,GAAQ,CACnB,IAAM1D,EAAQ0D,EAAI,UAAWI,IAAMA,GAAE,KAAOO,EAAO,EAAE,EACrD,GAAIrE,IAAU,GAAI,OAAO0D,EAEzB,IAAMY,GAAa,CAAE,GADLZ,EAAI1D,CAAK,EACQ,OAAQqE,EAAO,MAAO,EACvD,MAAO,CACL,GAAGX,EAAI,MAAM,EAAG1D,CAAK,EACrBsE,GACA,GAAGZ,EAAI,MAAM1D,EAAQ,CAAC,CACxB,CACF,CAAC,CACH,CACF,EAEAyD,EAAO,GAAG,iBAAmBc,GAA2B,CACtD9C,EAAaiC,GACJA,EAAI,OAAQI,GAAMA,EAAE,KAAOS,EAAO,EAAE,CAC5C,EACD5C,EAAc+B,GACLA,EAAI,OAAQI,GAAMA,EAAE,KAAOS,EAAO,EAAE,CAC5C,EACD7C,EAAYgC,GACHA,EAAI,OAAQI,GAAMA,EAAE,KAAOS,EAAO,EAAE,CAC5C,CACH,CAAC,EAEDd,EAAO,GAAG,SAAWlB,GAAoB,CACvCX,EAAY8B,GAAQ,CAAC,GAAGA,EAAKnB,CAAM,CAAC,CACtC,CAAC,EAEDkB,EAAO,GAAG,gBAAkBlB,GAAoB,CAC9CX,EAAY8B,GAAQ,CAClB,IAAM1D,EAAQ0D,EAAI,UAAWc,GAAMA,EAAE,KAAOjC,EAAO,EAAE,EACrD,OAAIvC,IAAU,GAAW0D,EAClB,CAAC,GAAGA,EAAI,MAAM,EAAG1D,CAAK,EAAG,GAAG0D,EAAI,MAAM1D,EAAQ,CAAC,CAAC,CACzD,CAAC,CACH,CAAC,EAEDyD,EAAO,GAAG,cAAgBgB,GAAkB,CAC1C5C,EAAe6B,GAAQA,EAAMe,CAAK,CACpC,CAAC,CACH,EACA,CAAC1B,EAAYD,EAAWI,CAAW,CACrC,EAEMwB,EAAUnF,GAAYmD,GAASW,EAAU,GAAG,EAAG,CAACA,CAAQ,CAAC,EAEzDsB,GAAapF,GAAY,IAAM,CAC/BP,GAAS,SACXA,EAAQ,OAAO,mBAAmB,EAClCA,EAAQ,OAAO,MAAM,EAEzB,EAAG,CAACA,CAAO,CAAC,EAEZ,MAAO,CAAE,QAAA0F,EAAS,WAAAC,GAAY,YAAAzB,EAAa,eAAAC,CAAe,CAC5D,EClQA,IAAMyB,GAAW,QAEV,SAASC,IAAW,CACzB,GAAI,CACF,OAAO,aAAa,QAAQD,EAAQ,CACtC,MAAY,CACV,MACF,CACF,CAEO,SAASE,GAASd,EAAe,CACtC,GAAI,CACF,OAAO,aAAa,QAAQY,GAAUZ,CAAK,CAC7C,MAAY,CACV,MACF,CACF,CAEO,SAASe,GAAc,CAC5B,GAAI,CACF,OAAO,aAAa,WAAWH,EAAQ,CACzC,MAAY,CACV,MACF,CACF,CCxBA,OAAOI,OAAgB,aACvB,OAAS,aAAAC,OAAiB,QAC1B,OAAS,kBAAAtC,GAAgB,qBAAAlD,OAAyB,SCFlD,OAAS,kBAAAjE,OAAsB,SAG/B,OAAO0J,OAAkC,MAEzC,IAAMC,GAAU,MACdC,EACAC,EACArB,KAEY,MAAMoB,EAAO,IAAIC,EAAUrB,CAAK,IAEhC,KAAK,EAGnB,SAASsB,GACPF,EACAG,EACAC,EACA,CACA,IAAMhC,EAAchI,GAAe0C,CAAgB,EAEnD,OAAOgH,GACLK,EAAO,CAACA,EAAM/B,CAAW,EAAI,KAC7B,CAAC,CAACiC,EAAKzB,CAAK,IAAoCmB,GAAQC,EAAQK,EAAKzB,CAAK,EAC1EwB,CACF,CACF,CDbO,IAAME,GAAWC,GAA2B,CACjD,GAAM,CAAE,KAAA5J,EAAM,UAAA6J,CAAU,EAAIN,GAKzBK,EAAW,cAAc,EACtB,CAACnC,EAAaqC,CAAc,EAAIlD,GAAezE,CAAgB,EAC/D4H,EAA0BrG,GAAkBpB,EAAyB,EACrE,CAAC0H,EAAMC,CAAO,EAAIrD,GAAevE,EAAS,EAE1C6H,EAAU,CAAC,EAAE,CAACL,GAAa7J,GAE3BmK,EAAS,IAAM,CACnBF,EAAQ,IAAI,EACZjB,EAAY,EACZc,EAAe,EAAE,EACjBC,EAAwB,MAAS,CACnC,EAEMK,EAAmBnC,GAAqC,CAC5D,GAAI,CAACA,EAAO,CACVkC,EAAO,EACP,MACF,CACA,GAAI,CACF,GAAM,CAAE,IAAAE,EAAK,GAAGC,CAAQ,EAAIrB,GAAWhB,CAAK,EAC5Cc,GAASd,CAAK,EACd6B,EAAe,UAAU7B,CAAK,EAAE,EAChCgC,EAAQK,CAAmB,CAC7B,OAASvC,EAAG,CACV,QAAQ,MACN,mDACA,SACAA,CACF,EACAoC,EAAO,CACT,CACF,EAEAjB,GAAU,IAAM,CACd,GAAI,CAACc,GAAQlB,GAAS,EAAG,CAEvBsB,EAAgBtB,GAAS,CAAC,EAC1B,MACF,CACF,EAAG,CAAC,CAAC,EAEL,IAAMyB,EAAkB,CAAC,CAAC9C,EAE1B,OAAIzH,GAAQ,CAACA,EAAK,aACT,CACL,KAAAA,EACA,KAAM,KACN,KAAM,YACN,QAAAkK,EACA,gBAAiB,GACjB,YAAa,GACb,OAAQ,IAAM,CAAC,EACf,eAAgB,IAAM,CAAC,CACzB,EAGK,CACL,KAAAlK,EACA,KAAMgK,EACN,KAAMA,GAAM,KACZ,gBAAAO,EACA,QAAAL,EACA,YAAazC,EACb,OAAQ0C,EACR,eAAgBC,CAClB,CACF,EEjEO,IAAMI,EAAN,cAA0B,KAAM,CAGrC,YAAY1G,EAAiB2G,EAAiB,CAC5C,MAAM3G,CAAO,EACb,KAAK,OAAS2G,CAChB,CAEA,UAAW,CACT,OAAI,KAAK,OACA,GAAG,KAAK,OAAO,KAAK,KAAK,MAAM,GAE/B,KAAK,OAEhB,CACF,EAIaC,GAAN,KAAc,CACnB,YACSC,EACAC,EACAC,EACP,CAHO,kBAAAF,EACA,WAAAC,EACA,aAAAC,CACN,CAEH,cAAcrB,EAAc,CAC1B,OAAI,KAAK,aAAa,SAAS,GAAG,EAEzB,GAAG,KAAK,aAAa,MAAM,EAAG,EAAE,CAAC,GAAGA,CAAI,GAExC,GAAG,KAAK,YAAY,GAAGA,CAAI,EAEtC,CAEA,WAAWvB,EAAe,CACxB,IAAM6C,EAAS,UACf,OAAI7C,EAAM,WAAW6C,CAAM,EAClB7C,EAEA6C,EAAS7C,CAEpB,CAEA,MAAM,MACJ8C,EACAvB,EACAvB,EACAjI,EACAgL,EACmB,CACnB,GAAI,CACF,IAAMC,EAA+D,CAAC,EAClEhD,IAAOgD,EAAQ,cAAmB,KAAK,WAAWhD,CAAK,GAE3D,IAAIiD,EAEAlL,aAAgB,SAClBkL,EAAOlL,GAEPiL,EAAQ,cAAc,EAAI,mBAC1BC,EAAOlL,EAAO,KAAK,UAAUA,CAAI,EAAI,MAGvC,IAAMmL,EAAM,MAAM,MAAM,KAAK,cAAc3B,CAAI,EAAG,CAChD,OAAAuB,EACA,QAAAE,EACA,OAAAD,EACA,KAAAE,CACF,CAAC,EAED,GAAI,CAACC,EAAI,GAAI,CACX,IAAMD,EAAO,MAAMC,EAAI,KAAK,EAC5B,MAAIA,EAAI,SAAW,KAAO,KAAK,QAC7BnC,EAAY,EACZ,KAAK,MAAM,GAEP,IAAIwB,EAAYW,EAAI,WAAYD,EAAK,MAAM,CACnD,CAEA,OAAOC,CACT,OAASC,EAAY,CACnB,MAAIA,aAAiBZ,GAAe,KAAK,SACvC,KAAK,QAAQY,CAAK,EAEpB,QAAQ,MAAMA,CAAK,EACbA,CACR,CACF,CAEA,MAAM,IAAI9B,EAAkBrB,EAAgB,CAC1C,OAAO,MAAM,KAAK,MAAM,MAAOqB,EAAUrB,CAAK,CAChD,CAEA,MAAM,KACJqB,EACAtJ,EACAiI,EACA+C,EACA,CACA,OAAO,MAAM,KAAK,MAAM,OAAQ1B,EAAUrB,EAAOjI,EAAMgL,CAAM,CAC/D,CAEA,MAAM,IAAI1B,EAAkBtJ,EAAeiI,EAAgB,CACzD,OAAO,MAAM,KAAK,MAAM,MAAOqB,EAAUrB,EAAOjI,CAAI,CACtD,CAEA,MAAM,MAAMsJ,EAAkBtJ,EAAeiI,EAAgB,CAC3D,OAAO,MAAM,KAAK,MAAM,QAASqB,EAAUrB,EAAOjI,CAAI,CACxD,CAEA,MAAM,OAAOsJ,EAAkBtJ,EAAeiI,EAAgB,CAC5D,OAAO,MAAM,KAAK,MAAM,SAAUqB,EAAUrB,EAAOjI,CAAI,CACzD,CACF,EAEaqL,GAAN,cAA0BX,EAAQ,CACvC,MAAM,YAAa,CAEjB,OADY,MAAM,KAAK,KAAK,eAAgB,CAAC,CAAC,GACnC,KAAK,CAClB,CAEA,MAAM,aAAa1K,EAAgB,CAEjC,OADY,MAAM,KAAK,KAAK,SAAUA,CAAI,GAC/B,KAAK,CAClB,CAEA,MAAM,cACJsL,EACA9D,EAAU,CAAC,EACX+D,EACA9D,EACA+D,EACA,CAQA,IAAMC,GAPW,MAAM,KAAK,KAC1B,cACA,CAAE,OAAAH,EAAQ,QAAA9D,CAAQ,EAClBC,EACA8D,EAAW,MACb,IAEyB,MAAM,UAAU,EA4BzC,OA1Be,IAAI,eAAe,CAChC,MAAMA,EAAY,CAChB,SAASG,GAAO,CACdD,EACG,KAAK,EACL,KAAK,CAAC,CAAE,KAAAE,EAAM,MAAAC,CAAM,IAAM,CACzB,GAAID,EAAM,CACRJ,EAAW,MAAM,EACjBC,GAAWA,EAAQG,EAAM,EAAE,EAC3B,MACF,CACA,IAAME,EAAS,IAAI,YAAY,OAAO,EAAE,OAAOD,CAAK,EACpDJ,GAAWA,EAAQG,EAAME,CAAM,EAC/BN,EAAW,QAAQK,CAAK,EACxBF,EAAK,CACP,CAAC,EACA,MAAOI,GAAQ,CACdP,EAAW,MAAM,EACjBC,GAAWA,EAAQ,GAAM,EAAE,EAC3B,QAAQ,MAAMM,CAAG,CACnB,CAAC,CACL,CACAJ,EAAK,CACP,CACF,CAAC,CAGH,CAEA,MAAM,iBACJ7G,EACAkH,EACAC,EACAvE,EACA,CACA,MAAM,KAAK,IACT,oBACA,CAAE,UAAA5C,EAAW,SAAAkH,EAAU,gBAAAC,CAAgB,EACvCvE,CACF,CACF,CAEA,MAAM,iBACJwE,EACAC,EACAzE,EAIC,CAOD,OANY,MAAM,KAAK,KACrB,yBACA,CAAE,WAAAwE,EAAY,OAAAC,CAAO,EACrBzE,CACF,GAEW,KAAK,CAClB,CAEA,MAAM,mBAAmB0E,EAAwB1E,EAAsB,CAOrE,OANY,MAAM,KAAK,OACrB,wBACA,CAAE,eAAA0E,CAAe,EACjB1E,CACF,GAEW,KAAK,CAClB,CAEA,gBAAgB2E,EAAe,CAC7B,OAAO,KAAK,cAAc,eAAeA,CAAK,EAAE,CAClD,CAEA,iBAAiBC,EAAkB,CACjC,OAAO,KAAK,cAAc,eAAeA,CAAQ,EAAE,CACrD,CACF,ECxOA,OAAS,UAAAC,OAAc","sourcesContent":["import { useRecoilValue } from 'recoil';\nimport { IMessage } from 'src/types';\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 IMessageUpdate extends IMessage {\n newId?: string;\n}\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/isEqual';\nimport { DefaultValue, atom, selector } from 'recoil';\nimport { Socket } from 'socket.io-client';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n ConversationsHistory,\n IAction,\n IAppUser,\n IAsk,\n IAvatarElement,\n IMessage,\n IMessageElement,\n ITasklistElement,\n Role\n} from './types';\nimport { groupByDate } from './utils/group';\n\nexport interface ISession {\n socket: Socket;\n error?: boolean;\n}\n\nexport const conversationIdToResumeState = atom<string | undefined>({\n key: 'ConversationIdToResume',\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<IMessage[]>({\n key: 'Messages',\n dangerouslyAllowMutability: true,\n default: []\n});\n\nexport const tokenCountState = atom<number>({\n key: 'TokenCount',\n default: 0\n});\n\nexport const loadingState = atom<boolean>({\n key: 'Loading',\n default: false\n});\n\nexport const askUserState = atom<IAsk | undefined>({\n key: 'AskUser',\n default: undefined\n});\n\nexport const chatSettingsInputsState = atom<any>({\n key: 'ChatSettings',\n default: []\n});\n\nexport const chatSettingsDefaultValueSelector = selector({\n key: 'ChatSettingsValue/Default',\n get: ({ get }) => {\n const chatSettings = get(chatSettingsInputsState);\n return chatSettings.reduce(\n (form: { [key: string]: any }, input: any) => (\n (form[input.id] = input.initial), form\n ),\n {}\n );\n }\n});\n\nexport const chatSettingsValueState = atom({\n key: 'ChatSettingsValue',\n default: chatSettingsDefaultValueSelector\n});\n\nexport const elementState = atom<IMessageElement[]>({\n key: 'DisplayElements',\n default: []\n});\n\nexport const avatarState = atom<IAvatarElement[]>({\n key: 'AvatarElements',\n default: []\n});\n\nexport const tasklistState = atom<ITasklistElement[]>({\n key: 'TasklistElements',\n default: []\n});\n\nexport const firstUserMessageState = atom<IMessage | undefined>({\n key: 'FirstUserMessage',\n default: undefined\n});\n\nexport const accessTokenState = atom<string | undefined>({\n key: 'AccessToken',\n default: undefined\n});\n\nexport const roleState = atom<Role>({\n key: 'Role',\n default: undefined\n});\n\nexport const userState = atom<IAppUser | null>({\n key: 'User',\n default: null\n});\n\nexport const conversationsHistoryState = atom<ConversationsHistory | undefined>(\n {\n key: 'ConversationsHistory',\n default: {\n conversations: undefined,\n currentConversationId: undefined,\n groupedConversations: undefined,\n pageInfo: undefined\n },\n effects: [\n ({ setSelf, onSet }: { setSelf: any; onSet: any }) => {\n onSet(\n (\n newValue: ConversationsHistory | undefined,\n oldValue: ConversationsHistory | undefined\n ) => {\n let groupedConversations = newValue?.groupedConversations;\n\n if (\n newValue?.conversations &&\n !isEqual(newValue.conversations, oldValue?.groupedConversations)\n ) {\n groupedConversations = groupByDate(newValue.conversations);\n }\n\n setSelf({\n ...newValue,\n groupedConversations\n });\n }\n );\n }\n ]\n }\n);\n","import { IConversation } from 'src/types';\n\nexport const groupByDate = (data: IConversation[]) => {\n const groupedData: { [key: string]: IConversation[] } = {};\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 actionState,\n askUserState,\n avatarState,\n chatSettingsInputsState,\n chatSettingsValueState,\n conversationIdToResumeState,\n elementState,\n firstUserMessageState,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\n tasklistState,\n tokenCountState\n} from 'src/state';\nimport { IAction, IFileElement, IMessage } from 'src/types';\nimport { addMessage } from 'src/utils/message';\n\nconst useChatInteract = () => {\n const session = useRecoilValue(sessionState);\n const askUser = useRecoilValue(askUserState);\n\n const resetChatSettings = useResetRecoilState(chatSettingsInputsState);\n const resetSessionId = useResetRecoilState(sessionIdState);\n const resetChatSettingsValue = useResetRecoilState(chatSettingsValueState);\n\n const setFirstUserMessage = useSetRecoilState(firstUserMessageState);\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(conversationIdToResumeState);\n\n const clear = useCallback(() => {\n session?.socket.emit('clear_session');\n session?.socket.disconnect();\n setIdToResume(undefined);\n resetSessionId();\n setFirstUserMessage(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: IMessage, files?: IFileElement[]) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n\n session?.socket.emit('ui_message', { message, files });\n },\n [session]\n );\n\n const replyMessage = useCallback(\n (message: IMessage) => {\n if (askUser) {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n askUser.callback(message);\n }\n },\n [askUser, session]\n );\n\n const updateChatSettings = useCallback(\n (values: object) => {\n session?.socket.emit('chat_settings_change', values);\n },\n [session]\n );\n\n const stopTask = useCallback(() => {\n setLoading(false);\n session?.socket.emit('stop');\n }, [session]);\n\n const callAction = useCallback(\n (action: IAction) => {\n session?.socket.emit('action_call', action);\n },\n [session]\n );\n\n return {\n callAction,\n clear,\n replyMessage,\n sendMessage,\n stopTask,\n setIdToResume,\n updateChatSettings\n };\n};\n\nexport { useChatInteract };\n","import isEqual from 'lodash/isEqual';\nimport { IMessage } from 'src/types';\n\nconst nestMessages = (messages: IMessage[]): IMessage[] => {\n let nestedMessages: IMessage[] = [];\n\n for (const message of messages) {\n nestedMessages = addMessage(nestedMessages, message);\n }\n\n return nestedMessages;\n};\n\nconst isLastMessage = (messages: IMessage[], 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: IMessage[], message: IMessage): IMessage[] => {\n if (hasMessageById(messages, message.id)) {\n return updateMessageById(messages, message.id, message);\n } else if (message.parentId) {\n return addMessageToParent(messages, message.parentId, message);\n } else if (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: IMessage[],\n indent: number,\n newMessage: IMessage,\n currentIndentation: number = 0\n): IMessage[] => {\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.subMessages = msg.subMessages || [];\n\n if (currentIndentation + 1 === indent) {\n msg.subMessages = [...msg.subMessages, newMessage];\n nextMessages[index] = { ...msg };\n\n return nextMessages;\n } else {\n msg.subMessages = addIndentMessage(\n msg.subMessages,\n indent,\n newMessage,\n currentIndentation + 1\n );\n\n nextMessages[index] = { ...msg };\n return nextMessages;\n }\n }\n};\n\nconst addMessageToParent = (\n messages: IMessage[],\n parentId: string,\n newMessage: IMessage\n): IMessage[] => {\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.subMessages = msg.subMessages\n ? [...msg.subMessages, newMessage]\n : [newMessage];\n nextMessages[index] = { ...msg };\n } else if (hasMessageById(nextMessages, parentId) && msg.subMessages) {\n msg.subMessages = addMessageToParent(\n msg.subMessages,\n parentId,\n newMessage\n );\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst hasMessageById = (messages: IMessage[], messageId: string) => {\n for (const message of messages) {\n if (isEqual(message.id, messageId)) {\n return true;\n } else if (message.subMessages && message.subMessages.length > 0) {\n if (hasMessageById(message.subMessages, messageId)) {\n return true;\n }\n }\n }\n return false;\n};\n\nconst updateMessageById = (\n messages: IMessage[],\n messageId: string,\n updatedMessage: IMessage\n): IMessage[] => {\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] = { subMessages: msg.subMessages, ...updatedMessage };\n } else if (hasMessageById(nextMessages, messageId) && msg.subMessages) {\n msg.subMessages = updateMessageById(\n msg.subMessages,\n messageId,\n updatedMessage\n );\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst deleteMessageById = (messages: IMessage[], 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.subMessages) {\n msg.subMessages = deleteMessageById(msg.subMessages, messageId);\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst updateMessageContentById = (\n messages: IMessage[],\n messageId: number | string,\n updatedContent: string,\n isSequence: boolean\n): IMessage[] => {\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 (isSequence) {\n msg.content = updatedContent;\n } else {\n msg.content += updatedContent;\n }\n\n nextMessages[index] = { ...msg };\n } else if (msg.subMessages) {\n msg.subMessages = updateMessageContentById(\n msg.subMessages,\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 { firstUserMessageState, messagesState } from './state';\n\nconst useChatMessages = () => {\n const messages = useRecoilValue(messagesState);\n const firstUserMessage = useRecoilValue(firstUserMessageState);\n\n return {\n messages,\n firstUserMessage\n };\n};\n\nexport { useChatMessages };\n","import debounce from 'lodash/debounce';\nimport { useCallback } from 'react';\nimport {\n useRecoilState,\n useRecoilValue,\n useResetRecoilState,\n useSetRecoilState\n} from 'recoil';\nimport io from 'socket.io-client';\nimport {\n actionState,\n askUserState,\n avatarState,\n chatProfileState,\n chatSettingsInputsState,\n chatSettingsValueState,\n conversationIdToResumeState,\n elementState,\n firstUserMessageState,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\n tasklistState,\n tokenCountState\n} from 'src/state';\nimport {\n IAction,\n IAvatarElement,\n IConversation,\n IElement,\n IMessage,\n IMessageElement,\n ITasklistElement\n} from 'src/types';\nimport {\n addMessage,\n deleteMessageById,\n updateMessageById,\n updateMessageContentById\n} from 'src/utils/message';\n\nimport type { IMessageUpdate, 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 setFirstUserMessage = useSetRecoilState(firstUserMessageState);\n const setLoading = useSetRecoilState(loadingState);\n const setMessages = useSetRecoilState(messagesState);\n const setAskUser = useSetRecoilState(askUserState);\n const setElements = useSetRecoilState(elementState);\n const setAvatars = useSetRecoilState(avatarState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setChatSettingsInputs = useSetRecoilState(chatSettingsInputsState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const [chatProfile, setChatProfile] = useRecoilState(chatProfileState);\n const idToResume = useRecoilValue(conversationIdToResumeState);\n\n const _connect = useCallback(\n ({\n wsEndpoint,\n userEnv,\n accessToken\n }: {\n wsEndpoint: string;\n userEnv: Record<string, string>;\n accessToken?: string;\n }) => {\n const socket = io(wsEndpoint, {\n path: '/ws/socket.io',\n extraHeaders: {\n Authorization: accessToken || '',\n 'X-Chainlit-Session-Id': sessionId,\n 'X-Chainlit-Conversation-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_conversation', (conversation: IConversation) => {\n let messages: IMessage[] = [];\n for (const message of conversation.messages) {\n messages = addMessage(messages, message);\n }\n if (conversation.metadata?.chat_profile) {\n setChatProfile(conversation.metadata?.chat_profile);\n }\n setMessages(messages);\n setAvatars(\n (conversation.elements as IAvatarElement[]).filter(\n (e) => e.type === 'avatar'\n )\n );\n setTasklists(\n (conversation.elements as ITasklistElement[]).filter(\n (e) => e.type === 'tasklist'\n )\n );\n setElements(\n (conversation.elements as IMessageElement[]).filter(\n (e) => ['avatar', 'tasklist'].indexOf(e.type) === -1\n )\n );\n });\n\n socket.on('new_message', (message: IMessage) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n });\n\n socket.on('init_conversation', (message: IMessage) => {\n setFirstUserMessage(message);\n });\n\n socket.on('update_message', (message: IMessageUpdate) => {\n setMessages((oldMessages) =>\n updateMessageById(oldMessages, message.id, message)\n );\n });\n\n socket.on('delete_message', (message: IMessage) => {\n setMessages((oldMessages) =>\n deleteMessageById(oldMessages, message.id)\n );\n });\n\n socket.on('stream_start', (message: IMessage) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n });\n\n socket.on('stream_token', ({ id, token, isSequence }: IToken) => {\n setMessages((oldMessages) =>\n updateMessageContentById(oldMessages, id, token, isSequence)\n );\n });\n\n socket.on('ask', ({ msg, spec }, callback) => {\n setAskUser({ spec, callback });\n setMessages((oldMessages) => addMessage(oldMessages, msg));\n\n setLoading(false);\n });\n\n socket.on('ask_timeout', () => {\n setAskUser(undefined);\n setLoading(false);\n });\n\n socket.on('clear_ask', () => {\n setAskUser(undefined);\n });\n\n socket.on('chat_settings', (inputs: any) => {\n setChatSettingsInputs(inputs);\n resetChatSettingsValue();\n });\n\n socket.on('element', (element: IElement) => {\n if (element.type === 'avatar') {\n setAvatars((old) => [...old, element]);\n } else if (element.type === 'tasklist') {\n setTasklists((old) => [...old, element]);\n } else {\n setElements((old) => [...old, element]);\n }\n });\n\n socket.on(\n 'update_element',\n (update: { id: string; forIds: string[] }) => {\n setElements((old) => {\n const index = old.findIndex((e) => e.id === update.id);\n if (index === -1) return old;\n const element = old[index];\n const newElement = { ...element, forIds: update.forIds };\n return [\n ...old.slice(0, index),\n newElement,\n ...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 { connect, disconnect, chatProfile, setChatProfile };\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 {\n accessTokenState,\n conversationsHistoryState,\n userState\n} from 'src/state';\nimport { IAppUser } 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 setConversationsHistory = useSetRecoilState(conversationsHistoryState);\n const [user, setUser] = useRecoilState(userState);\n\n const isReady = !!(!isLoading && data);\n\n const logout = () => {\n setUser(null);\n removeToken();\n setAccessToken('');\n setConversationsHistory(undefined);\n };\n\n const saveAndSetToken = (token: string | null | undefined) => {\n if (!token) {\n logout();\n return;\n }\n try {\n const { exp, ...AppUser } = jwt_decode(token) as any;\n setToken(token);\n setAccessToken(`Bearer ${token}`);\n setUser(AppUser as IAppUser);\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 role: 'ANONYMOUS',\n isReady,\n isAuthenticated: true,\n accessToken: '',\n logout: () => {},\n setAccessToken: () => {}\n };\n }\n\n return {\n data,\n user: user,\n role: user?.role,\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 { IConversation, IPrompt } from 'src/types';\nimport { removeToken } from 'src/utils/token';\n\nexport * from './hooks/auth';\nexport * from './hooks/api';\n\nexport interface IConversationsFilters {\n authorEmail?: string;\n search?: string;\n feedback?: number;\n}\n\nexport interface IPageInfo {\n hasNextPage: boolean;\n endCursor?: string;\n}\n\nexport interface IPagination {\n first: number;\n cursor?: string | number;\n}\n\nexport class ClientError extends Error {\n detail?: string;\n\n constructor(message: string, detail?: string) {\n super(message);\n this.detail = detail;\n }\n\n toString() {\n if (this.detail) {\n return `${this.message}: ${this.detail}`;\n } else {\n return this.message;\n }\n }\n}\n\ntype Payload = FormData | any;\n\nexport class APIBase {\n constructor(\n public httpEndpoint: string,\n public on401?: () => void,\n public onError?: (error: ClientError) => void\n ) {}\n\n buildEndpoint(path: string) {\n if (this.httpEndpoint.endsWith('/')) {\n // remove trailing slash on httpEndpoint\n return `${this.httpEndpoint.slice(0, -1)}${path}`;\n } else {\n return `${this.httpEndpoint}${path}`;\n }\n }\n\n checkToken(token: string) {\n const prefix = 'Bearer ';\n if (token.startsWith(prefix)) {\n return token;\n } else {\n return prefix + token;\n }\n }\n\n async fetch(\n method: string,\n path: string,\n token?: string,\n data?: Payload,\n signal?: AbortSignal\n ): Promise<Response> {\n try {\n const headers: { Authorization?: string; 'Content-Type'?: string } = {};\n if (token) headers['Authorization'] = this.checkToken(token); // Assuming token is a bearer token\n\n let body;\n\n if (data instanceof FormData) {\n body = data;\n } else {\n headers['Content-Type'] = 'application/json';\n body = data ? JSON.stringify(data) : null;\n }\n\n const res = await fetch(this.buildEndpoint(path), {\n method,\n headers,\n signal,\n body\n });\n\n if (!res.ok) {\n const body = await res.json();\n if (res.status === 401 && this.on401) {\n removeToken();\n this.on401();\n }\n throw new ClientError(res.statusText, body.detail);\n }\n\n return res;\n } catch (error: any) {\n if (error instanceof ClientError && this.onError) {\n this.onError(error);\n }\n console.error(error);\n throw error;\n }\n }\n\n async get(endpoint: string, token?: string) {\n return await this.fetch('GET', endpoint, token);\n }\n\n async post(\n endpoint: string,\n data: Payload,\n token?: string,\n signal?: AbortSignal\n ) {\n return await this.fetch('POST', endpoint, token, data, signal);\n }\n\n async put(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PUT', endpoint, token, data);\n }\n\n async patch(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PATCH', endpoint, token, data);\n }\n\n async delete(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('DELETE', endpoint, token, data);\n }\n}\n\nexport class ChainlitAPI extends APIBase {\n async headerAuth() {\n const res = await this.post(`/auth/header`, {});\n return res.json();\n }\n\n async passwordAuth(data: FormData) {\n const res = await this.post(`/login`, data);\n return res.json();\n }\n\n async getCompletion(\n prompt: IPrompt,\n userEnv = {},\n controller: AbortController,\n accessToken?: string,\n tokenCb?: (done: boolean, token: string) => void\n ) {\n const response = await this.post(\n `/completion`,\n { prompt, userEnv },\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 setHumanFeedback(\n messageId: string,\n feedback: number,\n feedbackComment?: string,\n accessToken?: string\n ) {\n await this.put(\n `/message/feedback`,\n { messageId, feedback, feedbackComment },\n accessToken\n );\n }\n\n async getConversations(\n pagination: IPagination,\n filter: IConversationsFilters,\n accessToken?: string\n ): Promise<{\n pageInfo: IPageInfo;\n data: IConversation[];\n }> {\n const res = await this.post(\n `/project/conversations`,\n { pagination, filter },\n accessToken\n );\n\n return res.json();\n }\n\n async deleteConversation(conversationId: string, accessToken?: string) {\n const res = await this.delete(\n `/project/conversation`,\n { conversationId },\n accessToken\n );\n\n return res.json();\n }\n\n getLogoEndpoint(theme: string) {\n return this.buildEndpoint(`/logo?theme=${theme}`);\n }\n\n getOAuthEndpoint(provider: string) {\n return this.buildEndpoint(`/auth/oauth/${provider}`);\n }\n}\n","export * from './useChatData';\nexport * from './useChatInteract';\nexport * from './useChatMessages';\nexport * from './useChatSession';\nexport * from './api';\nexport * from './types';\nexport * from './state';\nexport * from './utils/message';\n\nexport { Socket } from 'socket.io-client';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/useChatData.ts","../src/state.ts","../src/utils/group.ts","../src/useChatInteract.ts","../src/utils/message.ts","../src/useChatMessages.ts","../src/useChatSession.ts","../src/utils/token.ts","../src/api/hooks/auth.ts","../src/api/hooks/api.ts","../src/api/index.tsx","../src/index.ts"],"names":["useRecoilValue","isEqual","DefaultValue","atom","selector","uuidv4","groupByDate","data","groupedData","today","yesterday","sevenDaysAgo","thirtyDaysAgo","item","createdAt","isToday","isYesterday","isLast7Days","isLast30Days","category","threadIdToResumeState","chatProfileState","sessionIdAtom","sessionIdState","get","set","newValue","sessionState","actionState","messagesState","tokenCountState","loadingState","askUserState","chatSettingsInputsState","chatSettingsDefaultValueSelector","form","input","chatSettingsValueState","elementState","avatarState","tasklistState","firstUserInteraction","accessTokenState","userState","threadHistoryState","setSelf","onSet","oldValue","timeGroupedThreads","useChatData","loading","elements","avatars","tasklists","actions","session","askUser","chatSettingsInputs","chatSettingsValue","chatSettingsDefaultValue","connected","disabled","useCallback","useResetRecoilState","useSetRecoilState","nestMessages","messages","nestedMessages","message","addMessage","isLastMessage","index","i","hasMessageById","updateMessageById","addMessageToParent","addIndentMessage","indent","newMessage","currentIndentation","nextMessages","msg","parentId","messageId","updatedMessage","deleteMessageById","updateMessageContentById","updatedContent","isSequence","useChatInteract","accessToken","sessionId","resetChatSettings","resetSessionId","resetChatSettingsValue","setFirstUserInteraction","setLoading","setMessages","setElements","setAvatars","setTasklists","setActions","setTokenCount","setIdToResume","clear","sendMessage","fileReferences","oldMessages","replyMessage","updateChatSettings","values","stopTask","callAction","action","socket","promise","resolve","reject","response","client","file","onProgress","useChatMessages","firstInteraction","debounce","useRecoilState","io","useChatSession","setSession","setAskUser","setChatSettingsInputs","chatProfile","setChatProfile","idToResume","_connect","userEnv","old","s","_","thread","step","e","interaction","id","token","spec","callback","inputs","element","remove","a","count","connect","disconnect","tokenKey","getToken","setToken","removeToken","jwt_decode","useEffect","useSWR","fetcher","endpoint","useApi","path","options","url","useAuth","apiClient","isLoading","setAccessToken","setThreadHistory","user","setUser","isReady","logout","saveAndSetToken","exp","User","isAuthenticated","ClientError","detail","APIBase","httpEndpoint","on401","onError","prefix","method","signal","headers","body","res","error","ChainlitAPI","generation","controller","tokenCb","payload","reader","push","done","value","string","err","feedback","pagination","filter","threadId","xhr","formData","event","percentage","queryParams","theme","provider","Socket"],"mappings":"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","sourcesContent":["import { useRecoilValue } from 'recoil';\n\nimport {\n actionState,\n askUserState,\n avatarState,\n chatSettingsDefaultValueSelector,\n chatSettingsInputsState,\n chatSettingsValueState,\n elementState,\n loadingState,\n sessionState,\n tasklistState\n} from './state';\n\nexport interface IToken {\n id: number | string;\n token: string;\n isSequence: boolean;\n}\n\nconst useChatData = () => {\n const loading = useRecoilValue(loadingState);\n const elements = useRecoilValue(elementState);\n const avatars = useRecoilValue(avatarState);\n const tasklists = useRecoilValue(tasklistState);\n const actions = useRecoilValue(actionState);\n const session = useRecoilValue(sessionState);\n const askUser = useRecoilValue(askUserState);\n const chatSettingsInputs = useRecoilValue(chatSettingsInputsState);\n const chatSettingsValue = useRecoilValue(chatSettingsValueState);\n const chatSettingsDefaultValue = useRecoilValue(\n chatSettingsDefaultValueSelector\n );\n\n const connected = session?.socket.connected && !session?.error;\n const disabled =\n !connected ||\n loading ||\n askUser?.spec.type === 'file' ||\n askUser?.spec.type === 'action';\n\n return {\n actions,\n askUser,\n avatars,\n chatSettingsDefaultValue,\n chatSettingsInputs,\n chatSettingsValue,\n connected,\n disabled,\n elements,\n error: session?.error,\n loading,\n tasklists\n };\n};\n\nexport { useChatData };\n","import { isEqual } from 'lodash';\nimport { DefaultValue, atom, selector } from 'recoil';\nimport { Socket } from 'socket.io-client';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n IAction,\n IAsk,\n IAvatarElement,\n IMessageElement,\n IStep,\n ITasklistElement,\n IUser,\n ThreadHistory\n} from './types';\nimport { groupByDate } from './utils/group';\n\nexport interface ISession {\n socket: Socket;\n error?: boolean;\n}\n\nexport const threadIdToResumeState = atom<string | undefined>({\n key: 'ThreadIdToResume',\n default: undefined\n});\n\nexport const chatProfileState = atom<string | undefined>({\n key: 'ChatProfile',\n default: undefined\n});\n\nconst sessionIdAtom = atom<string>({\n key: 'SessionId',\n default: uuidv4()\n});\n\nexport const sessionIdState = selector({\n key: 'SessionIdSelector',\n get: ({ get }) => get(sessionIdAtom),\n set: ({ set }, newValue) =>\n set(sessionIdAtom, newValue instanceof DefaultValue ? uuidv4() : newValue)\n});\n\nexport const sessionState = atom<ISession | undefined>({\n key: 'Session',\n dangerouslyAllowMutability: true,\n default: undefined\n});\n\nexport const actionState = atom<IAction[]>({\n key: 'Actions',\n default: []\n});\n\nexport const messagesState = atom<IStep[]>({\n key: 'Messages',\n dangerouslyAllowMutability: true,\n default: []\n});\n\nexport const tokenCountState = atom<number>({\n key: 'TokenCount',\n default: 0\n});\n\nexport const loadingState = atom<boolean>({\n key: 'Loading',\n default: false\n});\n\nexport const askUserState = atom<IAsk | undefined>({\n key: 'AskUser',\n default: undefined\n});\n\nexport const chatSettingsInputsState = atom<any>({\n key: 'ChatSettings',\n default: []\n});\n\nexport const chatSettingsDefaultValueSelector = selector({\n key: 'ChatSettingsValue/Default',\n get: ({ get }) => {\n const chatSettings = get(chatSettingsInputsState);\n return chatSettings.reduce(\n (form: { [key: string]: any }, input: any) => (\n (form[input.id] = input.initial), form\n ),\n {}\n );\n }\n});\n\nexport const chatSettingsValueState = atom({\n key: 'ChatSettingsValue',\n default: chatSettingsDefaultValueSelector\n});\n\nexport const elementState = atom<IMessageElement[]>({\n key: 'DisplayElements',\n default: []\n});\n\nexport const avatarState = atom<IAvatarElement[]>({\n key: 'AvatarElements',\n default: []\n});\n\nexport const tasklistState = atom<ITasklistElement[]>({\n key: 'TasklistElements',\n default: []\n});\n\nexport const firstUserInteraction = atom<string | undefined>({\n key: 'FirstUserInteraction',\n default: undefined\n});\n\nexport const accessTokenState = atom<string | undefined>({\n key: 'AccessToken',\n default: undefined\n});\n\nexport const userState = atom<IUser | null>({\n key: 'User',\n default: null\n});\n\nexport const threadHistoryState = atom<ThreadHistory | undefined>({\n key: 'ThreadHistory',\n default: {\n threads: undefined,\n currentThreadId: undefined,\n timeGroupedThreads: undefined,\n pageInfo: undefined\n },\n effects: [\n ({ setSelf, onSet }: { setSelf: any; onSet: any }) => {\n onSet(\n (\n newValue: ThreadHistory | undefined,\n oldValue: ThreadHistory | undefined\n ) => {\n let timeGroupedThreads = newValue?.timeGroupedThreads;\n if (\n newValue?.threads &&\n !isEqual(newValue.threads, oldValue?.timeGroupedThreads)\n ) {\n timeGroupedThreads = groupByDate(newValue.threads);\n }\n\n setSelf({\n ...newValue,\n timeGroupedThreads\n });\n }\n );\n }\n ]\n});\n","import { IThread } from 'src/types';\n\nexport const groupByDate = (data: IThread[]) => {\n const groupedData: { [key: string]: IThread[] } = {};\n\n const today = new Date();\n const yesterday = new Date();\n yesterday.setDate(today.getDate() - 1);\n const sevenDaysAgo = new Date();\n sevenDaysAgo.setDate(today.getDate() - 7);\n const thirtyDaysAgo = new Date();\n thirtyDaysAgo.setDate(today.getDate() - 30);\n\n data.forEach((item) => {\n const createdAt = new Date(item.createdAt);\n const isToday = createdAt.toDateString() === today.toDateString();\n const isYesterday = createdAt.toDateString() === yesterday.toDateString();\n const isLast7Days = createdAt >= sevenDaysAgo;\n const isLast30Days = createdAt >= thirtyDaysAgo;\n\n let category: string;\n\n if (isToday) {\n category = 'Today';\n } else if (isYesterday) {\n category = 'Yesterday';\n } else if (isLast7Days) {\n category = 'Previous 7 days';\n } else if (isLast30Days) {\n category = 'Previous 30 days';\n } else {\n const monthYear = createdAt.toLocaleString('default', {\n month: 'long',\n year: 'numeric'\n });\n\n category = monthYear.split(' ').slice(0, 1).join(' ');\n }\n\n if (!groupedData[category]) {\n groupedData[category] = [];\n }\n\n groupedData[category].push(item);\n });\n\n return groupedData;\n};\n","import { useCallback } from 'react';\nimport { useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil';\nimport {\n accessTokenState,\n actionState,\n askUserState,\n avatarState,\n chatSettingsInputsState,\n chatSettingsValueState,\n elementState,\n firstUserInteraction,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\n tasklistState,\n threadIdToResumeState,\n tokenCountState\n} from 'src/state';\nimport { IAction, IFileRef, IStep } from 'src/types';\nimport { addMessage } from 'src/utils/message';\n\nimport { ChainlitAPI } from './api';\n\nconst useChatInteract = () => {\n const accessToken = useRecoilValue(accessTokenState);\n const session = useRecoilValue(sessionState);\n const askUser = useRecoilValue(askUserState);\n const sessionId = useRecoilValue(sessionIdState);\n\n const resetChatSettings = useResetRecoilState(chatSettingsInputsState);\n const resetSessionId = useResetRecoilState(sessionIdState);\n const resetChatSettingsValue = useResetRecoilState(chatSettingsValueState);\n\n const setFirstUserInteraction = useSetRecoilState(firstUserInteraction);\n const setLoading = useSetRecoilState(loadingState);\n const setMessages = useSetRecoilState(messagesState);\n const setElements = useSetRecoilState(elementState);\n const setAvatars = useSetRecoilState(avatarState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const setIdToResume = useSetRecoilState(threadIdToResumeState);\n\n const clear = useCallback(() => {\n session?.socket.emit('clear_session');\n session?.socket.disconnect();\n setIdToResume(undefined);\n resetSessionId();\n setFirstUserInteraction(undefined);\n setMessages([]);\n setElements([]);\n setAvatars([]);\n setTasklists([]);\n setActions([]);\n setTokenCount(0);\n resetChatSettings();\n resetChatSettingsValue();\n }, [session]);\n\n const sendMessage = useCallback(\n (message: IStep, fileReferences?: IFileRef[]) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n\n session?.socket.emit('ui_message', { message, fileReferences });\n },\n [session?.socket]\n );\n\n const replyMessage = useCallback(\n (message: IStep) => {\n if (askUser) {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n askUser.callback(message);\n }\n },\n [askUser]\n );\n\n const updateChatSettings = useCallback(\n (values: object) => {\n session?.socket.emit('chat_settings_change', values);\n },\n [session?.socket]\n );\n\n const stopTask = useCallback(() => {\n setLoading(false);\n session?.socket.emit('stop');\n }, [session?.socket]);\n\n const callAction = useCallback(\n (action: IAction) => {\n const socket = session?.socket;\n if (!socket) return;\n\n const promise = new Promise<{\n id: string;\n status: boolean;\n response?: string;\n }>((resolve, reject) => {\n socket.once('action_response', (response) => {\n if (response.status) {\n resolve(response);\n } else {\n reject(response);\n }\n });\n });\n\n socket.emit('action_call', action);\n\n return promise;\n },\n [session?.socket]\n );\n\n const uploadFile = useCallback(\n (\n client: ChainlitAPI,\n file: File,\n onProgress: (progress: number) => void\n ) => {\n return client.uploadFile(file, onProgress, sessionId, accessToken);\n },\n [sessionId, accessToken]\n );\n\n return {\n uploadFile,\n callAction,\n clear,\n replyMessage,\n sendMessage,\n stopTask,\n setIdToResume,\n updateChatSettings\n };\n};\n\nexport { useChatInteract };\n","import { isEqual } from 'lodash';\n\nimport { IStep } from '..';\n\nconst nestMessages = (messages: IStep[]): IStep[] => {\n let nestedMessages: IStep[] = [];\n\n for (const message of messages) {\n nestedMessages = addMessage(nestedMessages, message);\n }\n\n return nestedMessages;\n};\n\nconst isLastMessage = (messages: IStep[], index: number) => {\n if (messages.length - 1 === index) {\n return true;\n }\n\n for (let i = index + 1; i < messages.length; i++) {\n if (messages[i].streaming) {\n continue;\n } else {\n return false;\n }\n }\n\n return true;\n};\n\n// Nested messages utils\n\nconst addMessage = (messages: IStep[], message: IStep): IStep[] => {\n if (hasMessageById(messages, message.id)) {\n return updateMessageById(messages, message.id, message);\n } else if ('parentId' in message && message.parentId) {\n return addMessageToParent(messages, message.parentId, message);\n } else if ('indent' in message && message.indent && message.indent > 0) {\n return addIndentMessage(messages, message.indent, message);\n } else {\n return [...messages, message];\n }\n};\n\nconst addIndentMessage = (\n messages: IStep[],\n indent: number,\n newMessage: IStep,\n currentIndentation: number = 0\n): IStep[] => {\n const nextMessages = [...messages];\n\n if (nextMessages.length === 0) {\n return [...nextMessages, newMessage];\n } else {\n const index = nextMessages.length - 1;\n const msg = nextMessages[index];\n msg.steps = msg.steps || [];\n\n if (currentIndentation + 1 === indent) {\n msg.steps = [...msg.steps, newMessage];\n nextMessages[index] = { ...msg };\n\n return nextMessages;\n } else {\n msg.steps = addIndentMessage(\n msg.steps,\n indent,\n newMessage,\n currentIndentation + 1\n );\n\n nextMessages[index] = { ...msg };\n return nextMessages;\n }\n }\n};\n\nconst addMessageToParent = (\n messages: IStep[],\n parentId: string,\n newMessage: IStep\n): IStep[] => {\n const nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (isEqual(msg.id, parentId)) {\n msg.steps = msg.steps ? [...msg.steps, newMessage] : [newMessage];\n nextMessages[index] = { ...msg };\n } else if (hasMessageById(nextMessages, parentId) && msg.steps) {\n msg.steps = addMessageToParent(msg.steps, parentId, newMessage);\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst hasMessageById = (messages: IStep[], messageId: string) => {\n for (const message of messages) {\n if (isEqual(message.id, messageId)) {\n return true;\n } else if (message.steps && message.steps.length > 0) {\n if (hasMessageById(message.steps, messageId)) {\n return true;\n }\n }\n }\n return false;\n};\n\nconst updateMessageById = (\n messages: IStep[],\n messageId: string,\n updatedMessage: IStep\n): IStep[] => {\n const nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (isEqual(msg.id, messageId)) {\n nextMessages[index] = { steps: msg.steps, ...updatedMessage };\n } else if (hasMessageById(nextMessages, messageId) && msg.steps) {\n msg.steps = updateMessageById(msg.steps, messageId, updatedMessage);\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst deleteMessageById = (messages: IStep[], messageId: string) => {\n let nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (msg.id === messageId) {\n nextMessages = [\n ...nextMessages.slice(0, index),\n ...nextMessages.slice(index + 1)\n ];\n } else if (hasMessageById(nextMessages, messageId) && msg.steps) {\n msg.steps = deleteMessageById(msg.steps, messageId);\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nconst updateMessageContentById = (\n messages: IStep[],\n messageId: number | string,\n updatedContent: string,\n isSequence: boolean\n): IStep[] => {\n const nextMessages = [...messages];\n\n for (let index = 0; index < nextMessages.length; index++) {\n const msg = nextMessages[index];\n\n if (isEqual(msg.id, messageId)) {\n if ('content' in msg && msg.content !== undefined) {\n if (isSequence) {\n msg.content = updatedContent;\n } else {\n msg.content += updatedContent;\n }\n } else {\n if ('output' in msg && msg.output !== undefined) {\n if (isSequence) {\n msg.output = updatedContent;\n } else {\n msg.output += updatedContent;\n }\n }\n }\n\n nextMessages[index] = { ...msg };\n } else if (msg.steps) {\n msg.steps = updateMessageContentById(\n msg.steps,\n messageId,\n updatedContent,\n isSequence\n );\n nextMessages[index] = { ...msg };\n }\n }\n\n return nextMessages;\n};\n\nexport {\n addMessageToParent,\n addMessage,\n deleteMessageById,\n hasMessageById,\n isLastMessage,\n nestMessages,\n updateMessageById,\n updateMessageContentById\n};\n","import { useRecoilValue } from 'recoil';\n\nimport { firstUserInteraction, messagesState } from './state';\n\nconst useChatMessages = () => {\n const messages = useRecoilValue(messagesState);\n const firstInteraction = useRecoilValue(firstUserInteraction);\n\n return {\n messages,\n firstInteraction\n };\n};\n\nexport { useChatMessages };\n","import { debounce } from 'lodash';\nimport { useCallback } from 'react';\nimport {\n useRecoilState,\n useRecoilValue,\n useResetRecoilState,\n useSetRecoilState\n} from 'recoil';\nimport io from 'socket.io-client';\nimport {\n actionState,\n askUserState,\n avatarState,\n chatProfileState,\n chatSettingsInputsState,\n chatSettingsValueState,\n elementState,\n firstUserInteraction,\n loadingState,\n messagesState,\n sessionIdState,\n sessionState,\n tasklistState,\n threadIdToResumeState,\n tokenCountState\n} from 'src/state';\nimport {\n IAction,\n IAvatarElement,\n IElement,\n IMessageElement,\n IStep,\n ITasklistElement,\n IThread\n} from 'src/types';\nimport {\n addMessage,\n deleteMessageById,\n updateMessageById,\n updateMessageContentById\n} from 'src/utils/message';\n\nimport { ChainlitAPI } from './api';\nimport type { IToken } from './useChatData';\n\nconst useChatSession = () => {\n const sessionId = useRecoilValue(sessionIdState);\n\n const [session, setSession] = useRecoilState(sessionState);\n\n const resetChatSettingsValue = useResetRecoilState(chatSettingsValueState);\n const setFirstUserInteraction = useSetRecoilState(firstUserInteraction);\n const setLoading = useSetRecoilState(loadingState);\n const setMessages = useSetRecoilState(messagesState);\n const setAskUser = useSetRecoilState(askUserState);\n const setElements = useSetRecoilState(elementState);\n const setAvatars = useSetRecoilState(avatarState);\n const setTasklists = useSetRecoilState(tasklistState);\n const setActions = useSetRecoilState(actionState);\n const setChatSettingsInputs = useSetRecoilState(chatSettingsInputsState);\n const setTokenCount = useSetRecoilState(tokenCountState);\n const [chatProfile, setChatProfile] = useRecoilState(chatProfileState);\n const idToResume = useRecoilValue(threadIdToResumeState);\n\n const _connect = useCallback(\n ({\n client,\n userEnv,\n accessToken\n }: {\n client: ChainlitAPI;\n userEnv: Record<string, string>;\n accessToken?: string;\n }) => {\n const socket = io(client.httpEndpoint, {\n path: '/ws/socket.io',\n extraHeaders: {\n Authorization: accessToken || '',\n 'X-Chainlit-Session-Id': sessionId,\n 'X-Chainlit-Thread-Id': idToResume || '',\n 'user-env': JSON.stringify(userEnv),\n 'X-Chainlit-Chat-Profile': chatProfile || ''\n }\n });\n setSession((old) => {\n old?.socket?.removeAllListeners();\n old?.socket?.close();\n return {\n socket\n };\n });\n\n socket.on('connect', () => {\n socket.emit('connection_successful');\n setSession((s) => ({ ...s!, error: false }));\n });\n\n socket.on('connect_error', (_) => {\n setSession((s) => ({ ...s!, error: true }));\n });\n\n socket.on('task_start', () => {\n setLoading(true);\n });\n\n socket.on('task_end', () => {\n setLoading(false);\n });\n\n socket.on('reload', () => {\n socket.emit('clear_session');\n window.location.reload();\n });\n\n socket.on('resume_thread', (thread: IThread) => {\n let messages: IStep[] = [];\n for (const step of thread.steps) {\n messages = addMessage(messages, step);\n }\n if (thread.metadata?.chat_profile) {\n setChatProfile(thread.metadata?.chat_profile);\n }\n setMessages(messages);\n const elements = thread.elements || [];\n setAvatars(\n (elements as IAvatarElement[]).filter((e) => e.type === 'avatar')\n );\n setTasklists(\n (elements as ITasklistElement[]).filter((e) => e.type === 'tasklist')\n );\n setElements(\n (elements as IMessageElement[]).filter(\n (e) => ['avatar', 'tasklist'].indexOf(e.type) === -1\n )\n );\n });\n\n socket.on('new_message', (message: IStep) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n });\n\n socket.on('first_interaction', (interaction: string) => {\n setFirstUserInteraction(interaction);\n });\n\n socket.on('update_message', (message: IStep) => {\n setMessages((oldMessages) =>\n updateMessageById(oldMessages, message.id, message)\n );\n });\n\n socket.on('delete_message', (message: IStep) => {\n setMessages((oldMessages) =>\n deleteMessageById(oldMessages, message.id)\n );\n });\n\n socket.on('stream_start', (message: IStep) => {\n setMessages((oldMessages) => addMessage(oldMessages, message));\n });\n\n socket.on('stream_token', ({ id, token, isSequence }: IToken) => {\n setMessages((oldMessages) =>\n updateMessageContentById(oldMessages, id, token, isSequence)\n );\n });\n\n socket.on('ask', ({ msg, spec }, callback) => {\n setAskUser({ spec, callback });\n setMessages((oldMessages) => addMessage(oldMessages, msg));\n\n setLoading(false);\n });\n\n socket.on('ask_timeout', () => {\n setAskUser(undefined);\n setLoading(false);\n });\n\n socket.on('clear_ask', () => {\n setAskUser(undefined);\n });\n\n socket.on('chat_settings', (inputs: any) => {\n setChatSettingsInputs(inputs);\n resetChatSettingsValue();\n });\n\n socket.on('element', (element: IElement) => {\n if (!element.url && element.chainlitKey) {\n element.url = client.getElementUrl(\n element.chainlitKey,\n sessionId,\n accessToken\n );\n }\n\n if (element.type === 'avatar') {\n setAvatars((old) => {\n const index = old.findIndex((e) => e.id === element.id);\n if (index === -1) {\n return [...old, element];\n } else {\n return [...old.slice(0, index), element, ...old.slice(index + 1)];\n }\n });\n } else if (element.type === 'tasklist') {\n setTasklists((old) => {\n const index = old.findIndex((e) => e.id === element.id);\n if (index === -1) {\n return [...old, element];\n } else {\n return [...old.slice(0, index), element, ...old.slice(index + 1)];\n }\n });\n } else {\n setElements((old) => {\n const index = old.findIndex((e) => e.id === element.id);\n if (index === -1) {\n return [...old, element];\n } else {\n return [...old.slice(0, index), element, ...old.slice(index + 1)];\n }\n });\n }\n });\n\n socket.on('remove_element', (remove: { id: string }) => {\n setElements((old) => {\n return old.filter((e) => e.id !== remove.id);\n });\n setTasklists((old) => {\n return old.filter((e) => e.id !== remove.id);\n });\n setAvatars((old) => {\n return old.filter((e) => e.id !== remove.id);\n });\n });\n\n socket.on('action', (action: IAction) => {\n setActions((old) => [...old, action]);\n });\n\n socket.on('remove_action', (action: IAction) => {\n setActions((old) => {\n const index = old.findIndex((a) => a.id === action.id);\n if (index === -1) return old;\n return [...old.slice(0, index), ...old.slice(index + 1)];\n });\n });\n\n socket.on('token_usage', (count: number) => {\n setTokenCount((old) => old + count);\n });\n },\n [setSession, sessionId, chatProfile]\n );\n\n const connect = useCallback(debounce(_connect, 200), [_connect]);\n\n const disconnect = useCallback(() => {\n if (session?.socket) {\n session.socket.removeAllListeners();\n session.socket.close();\n }\n }, [session]);\n\n return {\n connect,\n disconnect,\n session,\n chatProfile,\n idToResume,\n setChatProfile\n };\n};\n\nexport { useChatSession };\n","const tokenKey = 'token';\n\nexport function getToken() {\n try {\n return localStorage.getItem(tokenKey);\n } catch (e) {\n return;\n }\n}\n\nexport function setToken(token: string) {\n try {\n return localStorage.setItem(tokenKey, token);\n } catch (e) {\n return;\n }\n}\n\nexport function removeToken() {\n try {\n return localStorage.removeItem(tokenKey);\n } catch (e) {\n return;\n }\n}\n","import jwt_decode from 'jwt-decode';\nimport { useEffect } from 'react';\nimport { useRecoilState, useSetRecoilState } from 'recoil';\nimport { accessTokenState, threadHistoryState, userState } from 'src/state';\nimport { IUser } from 'src/types';\nimport { getToken, removeToken, setToken } from 'src/utils/token';\n\nimport { ChainlitAPI } from '..';\nimport { useApi } from './api';\n\nexport const useAuth = (apiClient: ChainlitAPI) => {\n const { data, isLoading } = useApi<{\n requireLogin: boolean;\n passwordAuth: boolean;\n headerAuth: boolean;\n oauthProviders: string[];\n }>(apiClient, '/auth/config');\n const [accessToken, setAccessToken] = useRecoilState(accessTokenState);\n const setThreadHistory = useSetRecoilState(threadHistoryState);\n const [user, setUser] = useRecoilState(userState);\n\n const isReady = !!(!isLoading && data);\n\n const logout = () => {\n setUser(null);\n removeToken();\n setAccessToken('');\n setThreadHistory(undefined);\n };\n\n const saveAndSetToken = (token: string | null | undefined) => {\n if (!token) {\n logout();\n return;\n }\n try {\n const { exp, ...User } = jwt_decode(token) as any;\n setToken(token);\n setAccessToken(`Bearer ${token}`);\n setUser(User as IUser);\n } catch (e) {\n console.error(\n 'Invalid token, clearing token from local storage',\n 'error:',\n e\n );\n logout();\n }\n };\n\n useEffect(() => {\n if (!user && getToken()) {\n // Initialize the token from local storage\n saveAndSetToken(getToken());\n return;\n }\n }, []);\n\n const isAuthenticated = !!accessToken;\n\n if (data && !data.requireLogin) {\n return {\n data,\n user: null,\n isReady,\n isAuthenticated: true,\n accessToken: '',\n logout: () => {},\n setAccessToken: () => {}\n };\n }\n\n return {\n data,\n user: user,\n isAuthenticated,\n isReady,\n accessToken: accessToken,\n logout: logout,\n setAccessToken: saveAndSetToken\n };\n};\n","import { useRecoilValue } from 'recoil';\nimport { ChainlitAPI } from 'src/api';\nimport { accessTokenState } from 'src/state';\nimport useSWR, { SWRConfiguration } from 'swr';\n\nconst fetcher = async (\n client: ChainlitAPI,\n endpoint: string,\n token?: string\n) => {\n const res = await client.get(endpoint, token);\n\n return res?.json();\n};\n\nfunction useApi<T>(\n client: ChainlitAPI,\n path: string | null,\n options?: SWRConfiguration\n) {\n const accessToken = useRecoilValue(accessTokenState);\n\n return useSWR<T, Error>(\n path ? [path, accessToken] : null,\n ([url, token]: [url: string, token: string]) => fetcher(client, url, token),\n options\n );\n}\n\nexport { useApi, fetcher };\n","import { IGeneration, IThread } from 'src/types';\nimport { removeToken } from 'src/utils/token';\n\nimport { IFeedback } from 'src/types/feedback';\n\nexport * from './hooks/auth';\nexport * from './hooks/api';\n\nexport interface IThreadFilters {\n search?: string;\n feedback?: number;\n}\n\nexport interface IPageInfo {\n hasNextPage: boolean;\n endCursor?: string;\n}\n\nexport interface IPagination {\n first: number;\n cursor?: string | number;\n}\n\nexport class ClientError extends Error {\n detail?: string;\n\n constructor(message: string, detail?: string) {\n super(message);\n this.detail = detail;\n }\n\n toString() {\n if (this.detail) {\n return `${this.message}: ${this.detail}`;\n } else {\n return this.message;\n }\n }\n}\n\ntype Payload = FormData | any;\n\nexport class APIBase {\n constructor(\n public httpEndpoint: string,\n public on401?: () => void,\n public onError?: (error: ClientError) => void\n ) {}\n\n buildEndpoint(path: string) {\n if (this.httpEndpoint.endsWith('/')) {\n // remove trailing slash on httpEndpoint\n return `${this.httpEndpoint.slice(0, -1)}${path}`;\n } else {\n return `${this.httpEndpoint}${path}`;\n }\n }\n\n checkToken(token: string) {\n const prefix = 'Bearer ';\n if (token.startsWith(prefix)) {\n return token;\n } else {\n return prefix + token;\n }\n }\n\n async fetch(\n method: string,\n path: string,\n token?: string,\n data?: Payload,\n signal?: AbortSignal\n ): Promise<Response> {\n try {\n const headers: { Authorization?: string; 'Content-Type'?: string } = {};\n if (token) headers['Authorization'] = this.checkToken(token); // Assuming token is a bearer token\n\n let body;\n\n if (data instanceof FormData) {\n body = data;\n } else {\n headers['Content-Type'] = 'application/json';\n body = data ? JSON.stringify(data) : null;\n }\n\n const res = await fetch(this.buildEndpoint(path), {\n method,\n headers,\n signal,\n body\n });\n\n if (!res.ok) {\n const body = await res.json();\n if (res.status === 401 && this.on401) {\n removeToken();\n this.on401();\n }\n throw new ClientError(res.statusText, body.detail);\n }\n\n return res;\n } catch (error: any) {\n if (error instanceof ClientError && this.onError) {\n this.onError(error);\n }\n console.error(error);\n throw error;\n }\n }\n\n async get(endpoint: string, token?: string) {\n return await this.fetch('GET', endpoint, token);\n }\n\n async post(\n endpoint: string,\n data: Payload,\n token?: string,\n signal?: AbortSignal\n ) {\n return await this.fetch('POST', endpoint, token, data, signal);\n }\n\n async put(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PUT', endpoint, token, data);\n }\n\n async patch(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('PATCH', endpoint, token, data);\n }\n\n async delete(endpoint: string, data: Payload, token?: string) {\n return await this.fetch('DELETE', endpoint, token, data);\n }\n}\n\nexport class ChainlitAPI extends APIBase {\n async headerAuth() {\n const res = await this.post(`/auth/header`, {});\n return res.json();\n }\n\n async passwordAuth(data: FormData) {\n const res = await this.post(`/login`, data);\n return res.json();\n }\n\n async getGeneration(\n generation: IGeneration,\n userEnv = {},\n controller: AbortController,\n accessToken?: string,\n tokenCb?: (done: boolean, token: string) => void\n ) {\n const payload = { userEnv };\n if (generation.type === 'CHAT') {\n payload['chatGeneration'] = generation;\n } else {\n payload['completionGeneration'] = generation;\n }\n const response = await this.post(\n `/generation`,\n payload,\n accessToken,\n controller.signal\n );\n\n const reader = response?.body?.getReader();\n\n const stream = new ReadableStream({\n start(controller) {\n function push() {\n reader!\n .read()\n .then(({ done, value }) => {\n if (done) {\n controller.close();\n tokenCb && tokenCb(done, '');\n return;\n }\n const string = new TextDecoder('utf-8').decode(value);\n tokenCb && tokenCb(done, string);\n controller.enqueue(value);\n push();\n })\n .catch((err) => {\n controller.close();\n tokenCb && tokenCb(true, '');\n console.error(err);\n });\n }\n push();\n }\n });\n\n return stream;\n }\n\n async setFeedback(\n feedback: IFeedback,\n accessToken?: string\n ): Promise<{ success: boolean; feedbackId: string }> {\n const res = await this.put(`/feedback`, { feedback }, accessToken);\n return res.json();\n }\n\n async listThreads(\n pagination: IPagination,\n filter: IThreadFilters,\n accessToken?: string\n ): Promise<{\n pageInfo: IPageInfo;\n data: IThread[];\n }> {\n const res = await this.post(\n `/project/threads`,\n { pagination, filter },\n accessToken\n );\n\n return res.json();\n }\n\n async deleteThread(threadId: string, accessToken?: string) {\n const res = await this.delete(`/project/thread`, { threadId }, accessToken);\n\n return res.json();\n }\n\n uploadFile(\n file: File,\n onProgress: (progress: number) => void,\n sessionId: string,\n token?: string\n ) {\n const xhr = new XMLHttpRequest();\n\n const promise = new Promise<{ id: string }>((resolve, reject) => {\n const formData = new FormData();\n formData.append('file', file);\n\n xhr.open(\n 'POST',\n this.buildEndpoint(`/project/file?session_id=${sessionId}`),\n true\n );\n\n if (token) {\n xhr.setRequestHeader('Authorization', this.checkToken(token));\n }\n\n // Track the progress of the upload\n xhr.upload.onprogress = function (event) {\n if (event.lengthComputable) {\n const percentage = (event.loaded / event.total) * 100;\n onProgress(percentage);\n }\n };\n\n xhr.onload = function () {\n if (xhr.status === 200) {\n const response = JSON.parse(xhr.responseText);\n resolve(response);\n } else {\n reject('Upload failed');\n }\n };\n\n xhr.onerror = function () {\n reject('Upload error');\n };\n\n xhr.send(formData);\n });\n\n return { xhr, promise };\n }\n\n getElementUrl(id: string, sessionId: string, accessToken?: string) {\n let queryParams = `?session_id=${sessionId}`;\n if (accessToken) {\n if (accessToken.startsWith('Bearer ')) {\n accessToken = accessToken.slice(7);\n }\n queryParams += `&token=${accessToken}`;\n }\n return this.buildEndpoint(`/project/file/${id}${queryParams}`);\n }\n\n getLogoEndpoint(theme: string) {\n return this.buildEndpoint(`/logo?theme=${theme}`);\n }\n\n getOAuthEndpoint(provider: string) {\n return this.buildEndpoint(`/auth/oauth/${provider}`);\n }\n}\n","export * from './useChatData';\nexport * from './useChatInteract';\nexport * from './useChatMessages';\nexport * from './useChatSession';\nexport * from './api';\nexport * from './types';\nexport * from './state';\nexport * from './utils/message';\n\nexport { Socket } from 'socket.io-client';\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { atom, selector, DefaultValue, useRecoilValue, useResetRecoilState, useSetRecoilState, useRecoilState } from 'recoil';
|
|
2
|
-
import
|
|
2
|
+
import { isEqual, debounce } from 'lodash';
|
|
3
3
|
import { v4 } from 'uuid';
|
|
4
4
|
import { useCallback, useEffect } from 'react';
|
|
5
|
-
import
|
|
6
|
-
import Re from 'socket.io-client';
|
|
5
|
+
import Rt from 'socket.io-client';
|
|
7
6
|
export { Socket } from 'socket.io-client';
|
|
8
|
-
import
|
|
9
|
-
import
|
|
7
|
+
import Ut from 'jwt-decode';
|
|
8
|
+
import wt from 'swr';
|
|
10
9
|
|
|
11
|
-
var ce=s=>{let e={},t=new Date,n=new Date;n.setDate(t.getDate()-1);let o=new Date;o.setDate(t.getDate()-7);let r=new Date;return r.setDate(t.getDate()-30),s.forEach(a=>{let g=new Date(a.createdAt),d=g.toDateString()===t.toDateString(),p=g.toDateString()===n.toDateString(),h=g>=o,S=g>=r,f;d?f="Today":p?f="Yesterday":h?f="Previous 7 days":S?f="Previous 30 days":f=g.toLocaleString("default",{month:"long",year:"numeric"}).split(" ").slice(0,1).join(" "),e[f]||(e[f]=[]),e[f].push(a);}),e};var O=atom({key:"ConversationIdToResume",default:void 0}),de=atom({key:"ChatProfile",default:void 0}),ue=atom({key:"SessionId",default:v4()}),q=selector({key:"SessionIdSelector",get:({get:s})=>s(ue),set:({set:s},e)=>s(ue,e instanceof DefaultValue?v4():e)}),T=atom({key:"Session",dangerouslyAllowMutability:!0,default:void 0}),E=atom({key:"Actions",default:[]}),D=atom({key:"Messages",dangerouslyAllowMutability:!0,default:[]}),N=atom({key:"TokenCount",default:0}),P=atom({key:"Loading",default:!1}),R=atom({key:"AskUser",default:void 0}),A=atom({key:"ChatSettings",default:[]}),Z=selector({key:"ChatSettingsValue/Default",get:({get:s})=>s(A).reduce((t,n)=>(t[n.id]=n.initial,t),{})}),_=atom({key:"ChatSettingsValue",default:Z}),U=atom({key:"DisplayElements",default:[]}),w=atom({key:"AvatarElements",default:[]}),L=atom({key:"TasklistElements",default:[]}),V=atom({key:"FirstUserMessage",default:void 0}),W=atom({key:"AccessToken",default:void 0}),qe=atom({key:"Role",default:void 0}),fe=atom({key:"User",default:null}),pe=atom({key:"ConversationsHistory",default:{conversations:void 0,currentConversationId:void 0,groupedConversations:void 0,pageInfo:void 0},effects:[({setSelf:s,onSet:e})=>{e((t,n)=>{let o=t?.groupedConversations;t?.conversations&&!Y(t.conversations,n?.groupedConversations)&&(o=ce(t.conversations)),s({...t,groupedConversations:o});});}]});var ze=()=>{let s=useRecoilValue(P),e=useRecoilValue(U),t=useRecoilValue(w),n=useRecoilValue(L),o=useRecoilValue(E),r=useRecoilValue(T),a=useRecoilValue(R),g=useRecoilValue(A),d=useRecoilValue(_),p=useRecoilValue(Z),h=r?.socket.connected&&!r?.error,S=!h||s||a?.spec.type==="file"||a?.spec.type==="action";return {actions:o,askUser:a,avatars:t,chatSettingsDefaultValue:p,chatSettingsInputs:g,chatSettingsValue:d,connected:h,disabled:S,elements:e,error:r?.error,loading:s,tasklists:n}};var Ge=s=>{let e=[];for(let t of s)e=x(e,t);return e},Ke=(s,e)=>{if(s.length-1===e)return !0;for(let t=e+1;t<s.length;t++)if(!s[t].streaming)return !1;return !0},x=(s,e)=>H(s,e.id)?z(s,e.id,e):e.parentId?he(s,e.parentId,e):e.indent&&e.indent>0?me(s,e.indent,e):[...s,e],me=(s,e,t,n=0)=>{let o=[...s];if(o.length===0)return [...o,t];{let r=o.length-1,a=o[r];return a.subMessages=a.subMessages||[],n+1===e?(a.subMessages=[...a.subMessages,t],o[r]={...a},o):(a.subMessages=me(a.subMessages,e,t,n+1),o[r]={...a},o)}},he=(s,e,t)=>{let n=[...s];for(let o=0;o<n.length;o++){let r=n[o];Y(r.id,e)?(r.subMessages=r.subMessages?[...r.subMessages,t]:[t],n[o]={...r}):H(n,e)&&r.subMessages&&(r.subMessages=he(r.subMessages,e,t),n[o]={...r});}return n},H=(s,e)=>{for(let t of s){if(Y(t.id,e))return !0;if(t.subMessages&&t.subMessages.length>0&&H(t.subMessages,e))return !0}return !1},z=(s,e,t)=>{let n=[...s];for(let o=0;o<n.length;o++){let r=n[o];Y(r.id,e)?n[o]={subMessages:r.subMessages,...t}:H(n,e)&&r.subMessages&&(r.subMessages=z(r.subMessages,e,t),n[o]={...r});}return n},ee=(s,e)=>{let t=[...s];for(let n=0;n<t.length;n++){let o=t[n];o.id===e?t=[...t.slice(0,n),...t.slice(n+1)]:H(t,e)&&o.subMessages&&(o.subMessages=ee(o.subMessages,e),t[n]={...o});}return t},te=(s,e,t,n)=>{let o=[...s];for(let r=0;r<o.length;r++){let a=o[r];Y(a.id,e)?(n?a.content=t:a.content+=t,o[r]={...a}):a.subMessages&&(a.subMessages=te(a.subMessages,e,t,n),o[r]={...a});}return o};var nt=()=>{let s=useRecoilValue(T),e=useRecoilValue(R),t=useResetRecoilState(A),n=useResetRecoilState(q),o=useResetRecoilState(_),r=useSetRecoilState(V),a=useSetRecoilState(P),g=useSetRecoilState(D),d=useSetRecoilState(U),p=useSetRecoilState(w),h=useSetRecoilState(L),S=useSetRecoilState(E),f=useSetRecoilState(N),y=useSetRecoilState(O),v=useCallback(()=>{s?.socket.emit("clear_session"),s?.socket.disconnect(),y(void 0),n(),r(void 0),g([]),d([]),p([]),h([]),S([]),f(0),t(),o();},[s]),B=useCallback((I,F)=>{g(Q=>x(Q,I)),s?.socket.emit("ui_message",{message:I,files:F});},[s]),G=useCallback(I=>{e&&(g(F=>x(F,I)),e.callback(I));},[e,s]),$=useCallback(I=>{s?.socket.emit("chat_settings_change",I);},[s]),K=useCallback(()=>{a(!1),s?.socket.emit("stop");},[s]);return {callAction:useCallback(I=>{s?.socket.emit("action_call",I);},[s]),clear:v,replyMessage:G,sendMessage:B,stopTask:K,setIdToResume:y,updateChatSettings:$}};var it=()=>{let s=useRecoilValue(D),e=useRecoilValue(V);return {messages:s,firstUserMessage:e}};var mt=()=>{let s=useRecoilValue(q),[e,t]=useRecoilState(T),n=useResetRecoilState(_),o=useSetRecoilState(V),r=useSetRecoilState(P),a=useSetRecoilState(D),g=useSetRecoilState(R),d=useSetRecoilState(U),p=useSetRecoilState(w),h=useSetRecoilState(L),S=useSetRecoilState(E),f=useSetRecoilState(A),y=useSetRecoilState(N),[v,B]=useRecoilState(de),G=useRecoilValue(O),$=useCallback(({wsEndpoint:I,userEnv:F,accessToken:Q})=>{let l=Re(I,{path:"/ws/socket.io",extraHeaders:{Authorization:Q||"","X-Chainlit-Session-Id":s,"X-Chainlit-Conversation-Id":G||"","user-env":JSON.stringify(F),"X-Chainlit-Chat-Profile":v||""}});t(i=>(i?.socket?.removeAllListeners(),i?.socket?.close(),{socket:l})),l.on("connect",()=>{l.emit("connection_successful"),t(i=>({...i,error:!1}));}),l.on("connect_error",i=>{t(c=>({...c,error:!0}));}),l.on("task_start",()=>{r(!0);}),l.on("task_end",()=>{r(!1);}),l.on("reload",()=>{l.emit("clear_session"),window.location.reload();}),l.on("resume_conversation",i=>{let c=[];for(let u of i.messages)c=x(c,u);i.metadata?.chat_profile&&B(i.metadata?.chat_profile),a(c),p(i.elements.filter(u=>u.type==="avatar")),h(i.elements.filter(u=>u.type==="tasklist")),d(i.elements.filter(u=>["avatar","tasklist"].indexOf(u.type)===-1));}),l.on("new_message",i=>{a(c=>x(c,i));}),l.on("init_conversation",i=>{o(i);}),l.on("update_message",i=>{a(c=>z(c,i.id,i));}),l.on("delete_message",i=>{a(c=>ee(c,i.id));}),l.on("stream_start",i=>{a(c=>x(c,i));}),l.on("stream_token",({id:i,token:c,isSequence:u})=>{a(C=>te(C,i,c,u));}),l.on("ask",({msg:i,spec:c},u)=>{g({spec:c,callback:u}),a(C=>x(C,i)),r(!1);}),l.on("ask_timeout",()=>{g(void 0),r(!1);}),l.on("clear_ask",()=>{g(void 0);}),l.on("chat_settings",i=>{f(i),n();}),l.on("element",i=>{i.type==="avatar"?p(c=>[...c,i]):i.type==="tasklist"?h(c=>[...c,i]):d(c=>[...c,i]);}),l.on("update_element",i=>{d(c=>{let u=c.findIndex(Ce=>Ce.id===i.id);if(u===-1)return c;let Ae={...c[u],forIds:i.forIds};return [...c.slice(0,u),Ae,...c.slice(u+1)]});}),l.on("remove_element",i=>{d(c=>c.filter(u=>u.id!==i.id)),h(c=>c.filter(u=>u.id!==i.id)),p(c=>c.filter(u=>u.id!==i.id));}),l.on("action",i=>{S(c=>[...c,i]);}),l.on("remove_action",i=>{S(c=>{let u=c.findIndex(C=>C.id===i.id);return u===-1?c:[...c.slice(0,u),...c.slice(u+1)]});}),l.on("token_usage",i=>{y(c=>c+i);});},[t,s,v]),K=useCallback(De($,200),[$]),ie=useCallback(()=>{e?.socket&&(e.socket.removeAllListeners(),e.socket.close());},[e]);return {connect:K,disconnect:ie,chatProfile:v,setChatProfile:B}};var oe="token";function re(){try{return localStorage.getItem(oe)}catch{return}}function Me(s){try{return localStorage.setItem(oe,s)}catch{return}}function X(){try{return localStorage.removeItem(oe)}catch{return}}var we=async(s,e,t)=>(await s.get(e,t))?.json();function xe(s,e,t){let n=useRecoilValue(W);return Ue(e?[e,n]:null,([o,r])=>we(s,o,r),t)}var Dt=s=>{let{data:e,isLoading:t}=xe(s,"/auth/config"),[n,o]=useRecoilState(W),r=useSetRecoilState(pe),[a,g]=useRecoilState(fe),d=!!(!t&&e),p=()=>{g(null),X(),o(""),r(void 0);},h=f=>{if(!f){p();return}try{let{exp:y,...v}=Le(f);Me(f),o(`Bearer ${f}`),g(v);}catch(y){console.error("Invalid token, clearing token from local storage","error:",y),p();}};useEffect(()=>{if(!a&&re()){h(re());return}},[]);let S=!!n;return e&&!e.requireLogin?{data:e,user:null,role:"ANONYMOUS",isReady:d,isAuthenticated:!0,accessToken:"",logout:()=>{},setAccessToken:()=>{}}:{data:e,user:a,role:a?.role,isAuthenticated:S,isReady:d,accessToken:n,logout:p,setAccessToken:h}};var J=class extends Error{constructor(t,n){super(t);this.detail=n;}toString(){return this.detail?`${this.message}: ${this.detail}`:this.message}},ae=class{constructor(e,t,n){this.httpEndpoint=e;this.on401=t;this.onError=n;}buildEndpoint(e){return this.httpEndpoint.endsWith("/")?`${this.httpEndpoint.slice(0,-1)}${e}`:`${this.httpEndpoint}${e}`}checkToken(e){let t="Bearer ";return e.startsWith(t)?e:t+e}async fetch(e,t,n,o,r){try{let a={};n&&(a.Authorization=this.checkToken(n));let g;o instanceof FormData?g=o:(a["Content-Type"]="application/json",g=o?JSON.stringify(o):null);let d=await fetch(this.buildEndpoint(t),{method:e,headers:a,signal:r,body:g});if(!d.ok){let p=await d.json();throw d.status===401&&this.on401&&(X(),this.on401()),new J(d.statusText,p.detail)}return d}catch(a){throw a instanceof J&&this.onError&&this.onError(a),console.error(a),a}}async get(e,t){return await this.fetch("GET",e,t)}async post(e,t,n,o){return await this.fetch("POST",e,n,t,o)}async put(e,t,n){return await this.fetch("PUT",e,n,t)}async patch(e,t,n){return await this.fetch("PATCH",e,n,t)}async delete(e,t,n){return await this.fetch("DELETE",e,n,t)}},ve=class extends ae{async headerAuth(){return (await this.post("/auth/header",{})).json()}async passwordAuth(e){return (await this.post("/login",e)).json()}async getCompletion(e,t={},n,o,r){let g=(await this.post("/completion",{prompt:e,userEnv:t},o,n.signal))?.body?.getReader();return new ReadableStream({start(p){function h(){g.read().then(({done:S,value:f})=>{if(S){p.close(),r&&r(S,"");return}let y=new TextDecoder("utf-8").decode(f);r&&r(S,y),p.enqueue(f),h();}).catch(S=>{p.close(),r&&r(!0,""),console.error(S);});}h();}})}async setHumanFeedback(e,t,n,o){await this.put("/message/feedback",{messageId:e,feedback:t,feedbackComment:n},o);}async getConversations(e,t,n){return (await this.post("/project/conversations",{pagination:e,filter:t},n)).json()}async deleteConversation(e,t){return (await this.delete("/project/conversation",{conversationId:e},t)).json()}getLogoEndpoint(e){return this.buildEndpoint(`/logo?theme=${e}`)}getOAuthEndpoint(e){return this.buildEndpoint(`/auth/oauth/${e}`)}};
|
|
10
|
+
var ut=i=>{let t={},e=new Date,s=new Date;s.setDate(e.getDate()-1);let n=new Date;n.setDate(e.getDate()-7);let o=new Date;return o.setDate(e.getDate()-30),i.forEach(a=>{let d=new Date(a.createdAt),p=d.toDateString()===e.toDateString(),h=d.toDateString()===s.toDateString(),f=d>=n,I=d>=o,g;p?g="Today":h?g="Yesterday":f?g="Previous 7 days":I?g="Previous 30 days":g=d.toLocaleString("default",{month:"long",year:"numeric"}).split(" ").slice(0,1).join(" "),t[g]||(t[g]=[]),t[g].push(a);}),t};var O=atom({key:"ThreadIdToResume",default:void 0}),gt=atom({key:"ChatProfile",default:void 0}),dt=atom({key:"SessionId",default:v4()}),H=selector({key:"SessionIdSelector",get:({get:i})=>i(dt),set:({set:i},t)=>i(dt,t instanceof DefaultValue?v4():t)}),C=atom({key:"Session",dangerouslyAllowMutability:!0,default:void 0}),D=atom({key:"Actions",default:[]}),v=atom({key:"Messages",dangerouslyAllowMutability:!0,default:[]}),W=atom({key:"TokenCount",default:0}),R=atom({key:"Loading",default:!1}),_=atom({key:"AskUser",default:void 0}),E=atom({key:"ChatSettings",default:[]}),st=selector({key:"ChatSettingsValue/Default",get:({get:i})=>i(E).reduce((e,s)=>(e[s.id]=s.initial,e),{})}),w=atom({key:"ChatSettingsValue",default:st}),M=atom({key:"DisplayElements",default:[]}),U=atom({key:"AvatarElements",default:[]}),F=atom({key:"TasklistElements",default:[]}),L=atom({key:"FirstUserInteraction",default:void 0}),j=atom({key:"AccessToken",default:void 0}),ht=atom({key:"User",default:null}),mt=atom({key:"ThreadHistory",default:{threads:void 0,currentThreadId:void 0,timeGroupedThreads:void 0,pageInfo:void 0},effects:[({setSelf:i,onSet:t})=>{t((e,s)=>{let n=e?.timeGroupedThreads;e?.threads&&!isEqual(e.threads,s?.timeGroupedThreads)&&(n=ut(e.threads)),i({...e,timeGroupedThreads:n});});}]});var Wt=()=>{let i=useRecoilValue(R),t=useRecoilValue(M),e=useRecoilValue(U),s=useRecoilValue(F),n=useRecoilValue(D),o=useRecoilValue(C),a=useRecoilValue(_),d=useRecoilValue(E),p=useRecoilValue(w),h=useRecoilValue(st),f=o?.socket.connected&&!o?.error,I=!f||i||a?.spec.type==="file"||a?.spec.type==="action";return {actions:n,askUser:a,avatars:e,chatSettingsDefaultValue:h,chatSettingsInputs:d,chatSettingsValue:p,connected:f,disabled:I,elements:t,error:o?.error,loading:i,tasklists:s}};var Xt=i=>{let t=[];for(let e of i)t=A(t,e);return t},Yt=(i,t)=>{if(i.length-1===t)return !0;for(let e=t+1;e<i.length;e++)if(!i[e].streaming)return !1;return !0},A=(i,t)=>V(i,t.id)?N(i,t.id,t):"parentId"in t&&t.parentId?It(i,t.parentId,t):"indent"in t&&t.indent&&t.indent>0?St(i,t.indent,t):[...i,t],St=(i,t,e,s=0)=>{let n=[...i];if(n.length===0)return [...n,e];{let o=n.length-1,a=n[o];return a.steps=a.steps||[],s+1===t?(a.steps=[...a.steps,e],n[o]={...a},n):(a.steps=St(a.steps,t,e,s+1),n[o]={...a},n)}},It=(i,t,e)=>{let s=[...i];for(let n=0;n<s.length;n++){let o=s[n];isEqual(o.id,t)?(o.steps=o.steps?[...o.steps,e]:[e],s[n]={...o}):V(s,t)&&o.steps&&(o.steps=It(o.steps,t,e),s[n]={...o});}return s},V=(i,t)=>{for(let e of i){if(isEqual(e.id,t))return !0;if(e.steps&&e.steps.length>0&&V(e.steps,t))return !0}return !1},N=(i,t,e)=>{let s=[...i];for(let n=0;n<s.length;n++){let o=s[n];isEqual(o.id,t)?s[n]={steps:o.steps,...e}:V(s,t)&&o.steps&&(o.steps=N(o.steps,t,e),s[n]={...o});}return s},nt=(i,t)=>{let e=[...i];for(let s=0;s<e.length;s++){let n=e[s];n.id===t?e=[...e.slice(0,s),...e.slice(s+1)]:V(e,t)&&n.steps&&(n.steps=nt(n.steps,t),e[s]={...n});}return e},ot=(i,t,e,s)=>{let n=[...i];for(let o=0;o<n.length;o++){let a=n[o];isEqual(a.id,t)?("content"in a&&a.content!==void 0?s?a.content=e:a.content+=e:"output"in a&&a.output!==void 0&&(s?a.output=e:a.output+=e),n[o]={...a}):a.steps&&(a.steps=ot(a.steps,t,e,s),n[o]={...a});}return n};var ee=()=>{let i=useRecoilValue(j),t=useRecoilValue(C),e=useRecoilValue(_),s=useRecoilValue(H),n=useResetRecoilState(E),o=useResetRecoilState(H),a=useResetRecoilState(w),d=useSetRecoilState(L),p=useSetRecoilState(R),h=useSetRecoilState(v),f=useSetRecoilState(M),I=useSetRecoilState(U),g=useSetRecoilState(F),y=useSetRecoilState(D),T=useSetRecoilState(W),$=useSetRecoilState(O),B=useCallback(()=>{t?.socket.emit("clear_session"),t?.socket.disconnect(),$(void 0),o(),d(void 0),h([]),f([]),I([]),g([]),y([]),T(0),n(),a();},[t]),G=useCallback((l,r)=>{h(c=>A(c,l)),t?.socket.emit("ui_message",{message:l,fileReferences:r});},[t?.socket]),K=useCallback(l=>{e&&(h(r=>A(r,l)),e.callback(l));},[e]),Q=useCallback(l=>{t?.socket.emit("chat_settings_change",l);},[t?.socket]),q=useCallback(()=>{p(!1),t?.socket.emit("stop");},[t?.socket]),Z=useCallback(l=>{let r=t?.socket;if(!r)return;let c=new Promise((u,m)=>{r.once("action_response",et=>{et.status?u(et):m(et);});});return r.emit("action_call",l),c},[t?.socket]);return {uploadFile:useCallback((l,r,c)=>l.uploadFile(r,c,s,i),[s,i]),callAction:Z,clear:B,replyMessage:K,sendMessage:G,stopTask:q,setIdToResume:$,updateChatSettings:Q}};var re=()=>{let i=useRecoilValue(v),t=useRecoilValue(L);return {messages:i,firstInteraction:t}};var fe=()=>{let i=useRecoilValue(H),[t,e]=useRecoilState(C),s=useResetRecoilState(w),n=useSetRecoilState(L),o=useSetRecoilState(R),a=useSetRecoilState(v),d=useSetRecoilState(_),p=useSetRecoilState(M),h=useSetRecoilState(U),f=useSetRecoilState(F),I=useSetRecoilState(D),g=useSetRecoilState(E),y=useSetRecoilState(W),[T,$]=useRecoilState(gt),B=useRecoilValue(O),G=useCallback(({client:q,userEnv:Z,accessToken:tt})=>{let l=Rt(q.httpEndpoint,{path:"/ws/socket.io",extraHeaders:{Authorization:tt||"","X-Chainlit-Session-Id":i,"X-Chainlit-Thread-Id":B||"","user-env":JSON.stringify(Z),"X-Chainlit-Chat-Profile":T||""}});e(r=>(r?.socket?.removeAllListeners(),r?.socket?.close(),{socket:l})),l.on("connect",()=>{l.emit("connection_successful"),e(r=>({...r,error:!1}));}),l.on("connect_error",r=>{e(c=>({...c,error:!0}));}),l.on("task_start",()=>{o(!0);}),l.on("task_end",()=>{o(!1);}),l.on("reload",()=>{l.emit("clear_session"),window.location.reload();}),l.on("resume_thread",r=>{let c=[];for(let m of r.steps)c=A(c,m);r.metadata?.chat_profile&&$(r.metadata?.chat_profile),a(c);let u=r.elements||[];h(u.filter(m=>m.type==="avatar")),f(u.filter(m=>m.type==="tasklist")),p(u.filter(m=>["avatar","tasklist"].indexOf(m.type)===-1));}),l.on("new_message",r=>{a(c=>A(c,r));}),l.on("first_interaction",r=>{n(r);}),l.on("update_message",r=>{a(c=>N(c,r.id,r));}),l.on("delete_message",r=>{a(c=>nt(c,r.id));}),l.on("stream_start",r=>{a(c=>A(c,r));}),l.on("stream_token",({id:r,token:c,isSequence:u})=>{a(m=>ot(m,r,c,u));}),l.on("ask",({msg:r,spec:c},u)=>{d({spec:c,callback:u}),a(m=>A(m,r)),o(!1);}),l.on("ask_timeout",()=>{d(void 0),o(!1);}),l.on("clear_ask",()=>{d(void 0);}),l.on("chat_settings",r=>{g(r),s();}),l.on("element",r=>{!r.url&&r.chainlitKey&&(r.url=q.getElementUrl(r.chainlitKey,i,tt)),r.type==="avatar"?h(c=>{let u=c.findIndex(m=>m.id===r.id);return u===-1?[...c,r]:[...c.slice(0,u),r,...c.slice(u+1)]}):r.type==="tasklist"?f(c=>{let u=c.findIndex(m=>m.id===r.id);return u===-1?[...c,r]:[...c.slice(0,u),r,...c.slice(u+1)]}):p(c=>{let u=c.findIndex(m=>m.id===r.id);return u===-1?[...c,r]:[...c.slice(0,u),r,...c.slice(u+1)]});}),l.on("remove_element",r=>{p(c=>c.filter(u=>u.id!==r.id)),f(c=>c.filter(u=>u.id!==r.id)),h(c=>c.filter(u=>u.id!==r.id));}),l.on("action",r=>{I(c=>[...c,r]);}),l.on("remove_action",r=>{I(c=>{let u=c.findIndex(m=>m.id===r.id);return u===-1?c:[...c.slice(0,u),...c.slice(u+1)]});}),l.on("token_usage",r=>{y(c=>c+r);});},[e,i,T]),K=useCallback(debounce(G,200),[G]),Q=useCallback(()=>{t?.socket&&(t.socket.removeAllListeners(),t.socket.close());},[t]);return {connect:K,disconnect:Q,session:t,chatProfile:T,idToResume:B,setChatProfile:$}};var at="token";function ct(){try{return localStorage.getItem(at)}catch{return}}function Tt(i){try{return localStorage.setItem(at,i)}catch{return}}function Y(){try{return localStorage.removeItem(at)}catch{return}}var Mt=async(i,t,e)=>(await i.get(t,e))?.json();function At(i,t,e){let s=useRecoilValue(j);return wt(t?[t,s]:null,([n,o])=>Mt(i,n,o),e)}var Ce=i=>{let{data:t,isLoading:e}=At(i,"/auth/config"),[s,n]=useRecoilState(j),o=useSetRecoilState(mt),[a,d]=useRecoilState(ht),p=!!(!e&&t),h=()=>{d(null),Y(),n(""),o(void 0);},f=g=>{if(!g){h();return}try{let{exp:y,...T}=Ut(g);Tt(g),n(`Bearer ${g}`),d(T);}catch(y){console.error("Invalid token, clearing token from local storage","error:",y),h();}};useEffect(()=>{if(!a&&ct()){f(ct());return}},[]);let I=!!s;return t&&!t.requireLogin?{data:t,user:null,isReady:p,isAuthenticated:!0,accessToken:"",logout:()=>{},setAccessToken:()=>{}}:{data:t,user:a,isAuthenticated:I,isReady:p,accessToken:s,logout:h,setAccessToken:f}};var J=class extends Error{constructor(e,s){super(e);this.detail=s;}toString(){return this.detail?`${this.message}: ${this.detail}`:this.message}},lt=class{constructor(t,e,s){this.httpEndpoint=t;this.on401=e;this.onError=s;}buildEndpoint(t){return this.httpEndpoint.endsWith("/")?`${this.httpEndpoint.slice(0,-1)}${t}`:`${this.httpEndpoint}${t}`}checkToken(t){let e="Bearer ";return t.startsWith(e)?t:e+t}async fetch(t,e,s,n,o){try{let a={};s&&(a.Authorization=this.checkToken(s));let d;n instanceof FormData?d=n:(a["Content-Type"]="application/json",d=n?JSON.stringify(n):null);let p=await fetch(this.buildEndpoint(e),{method:t,headers:a,signal:o,body:d});if(!p.ok){let h=await p.json();throw p.status===401&&this.on401&&(Y(),this.on401()),new J(p.statusText,h.detail)}return p}catch(a){throw a instanceof J&&this.onError&&this.onError(a),console.error(a),a}}async get(t,e){return await this.fetch("GET",t,e)}async post(t,e,s,n){return await this.fetch("POST",t,s,e,n)}async put(t,e,s){return await this.fetch("PUT",t,s,e)}async patch(t,e,s){return await this.fetch("PATCH",t,s,e)}async delete(t,e,s){return await this.fetch("DELETE",t,s,e)}},Et=class extends lt{async headerAuth(){return (await this.post("/auth/header",{})).json()}async passwordAuth(t){return (await this.post("/login",t)).json()}async getGeneration(t,e={},s,n,o){let a={userEnv:e};t.type==="CHAT"?a.chatGeneration=t:a.completionGeneration=t;let p=(await this.post("/generation",a,n,s.signal))?.body?.getReader();return new ReadableStream({start(f){function I(){p.read().then(({done:g,value:y})=>{if(g){f.close(),o&&o(g,"");return}let T=new TextDecoder("utf-8").decode(y);o&&o(g,T),f.enqueue(y),I();}).catch(g=>{f.close(),o&&o(!0,""),console.error(g);});}I();}})}async setFeedback(t,e){return (await this.put("/feedback",{feedback:t},e)).json()}async listThreads(t,e,s){return (await this.post("/project/threads",{pagination:t,filter:e},s)).json()}async deleteThread(t,e){return (await this.delete("/project/thread",{threadId:t},e)).json()}uploadFile(t,e,s,n){let o=new XMLHttpRequest,a=new Promise((d,p)=>{let h=new FormData;h.append("file",t),o.open("POST",this.buildEndpoint(`/project/file?session_id=${s}`),!0),n&&o.setRequestHeader("Authorization",this.checkToken(n)),o.upload.onprogress=function(f){if(f.lengthComputable){let I=f.loaded/f.total*100;e(I);}},o.onload=function(){if(o.status===200){let f=JSON.parse(o.responseText);d(f);}else p("Upload failed");},o.onerror=function(){p("Upload error");},o.send(h);});return {xhr:o,promise:a}}getElementUrl(t,e,s){let n=`?session_id=${e}`;return s&&(s.startsWith("Bearer ")&&(s=s.slice(7)),n+=`&token=${s}`),this.buildEndpoint(`/project/file/${t}${n}`)}getLogoEndpoint(t){return this.buildEndpoint(`/logo?theme=${t}`)}getOAuthEndpoint(t){return this.buildEndpoint(`/auth/oauth/${t}`)}};
|
|
12
11
|
|
|
13
|
-
export {
|
|
12
|
+
export { lt as APIBase, Et as ChainlitAPI, J as ClientError, j as accessTokenState, D as actionState, A as addMessage, It as addMessageToParent, _ as askUserState, U as avatarState, gt as chatProfileState, st as chatSettingsDefaultValueSelector, E as chatSettingsInputsState, w as chatSettingsValueState, nt as deleteMessageById, M as elementState, Mt as fetcher, L as firstUserInteraction, V as hasMessageById, Yt as isLastMessage, R as loadingState, v as messagesState, Xt as nestMessages, H as sessionIdState, C as sessionState, F as tasklistState, mt as threadHistoryState, O as threadIdToResumeState, W as tokenCountState, N as updateMessageById, ot as updateMessageContentById, At as useApi, Ce as useAuth, Wt as useChatData, ee as useChatInteract, re as useChatMessages, fe as useChatSession, ht as userState };
|
|
14
13
|
//# sourceMappingURL=out.js.map
|
|
15
14
|
//# sourceMappingURL=index.mjs.map
|