PageSourceSearch

https://chat-paal-staging.vercel.app/_next/static/chunks/7294-3d8b…?dpl=dpl_Cs1Lc7bHUaioYmQhm4bPFHcx7x6z

js chat-paal-staging.vercel.app collected 2026-10-03 06:25:22 UTC 24,775 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7294],{77294:(e,t,s)=>{s.d(t,{m:()=>n});var i=s(45833),o=s(80794),r=s(47487),a=s(49503);function n(){let{token:e,isAuthenticated:t,isReady:s,userInfo:n}=(0,r.b9)(),{ready:l}=(0,a.X)(),[d,c]=(0,i.useState)([]),[u,v]=(0,i.useState)(null),[g,h]=(0,i.useState)(!0),[m,y]=(0,i.useState)({}),[p,C]=(0,i.useState)(0),[f,w]=(0,i.useState)(null),[S,H]=(0,i.useState)(!1),[U,A]=(0,i.useState)(!1),k=(0,i.useRef)(!1),[E,I]=(0,i.useState)(!1),[T,b]=(0,i.useState)(null),[_,M]=(0,i.useState)(!1),[x,R]=(0,i.useState)(!1),N=(0,i.useRef)(new Set);(0,i.useEffect)(()=>{if(!u)return;let e=d.find(e=>e.id===u.id);if(e&&e!==u){var t,s,i,o,r,a,n,l;let d=(null===(t=e.lastTokenUsed)||void 0===t?void 0:t.address)!==(null===(s=u.lastTokenUsed)||void 0===s?void 0:s.address)||(null===(i=e.lastTokenUsed)||void 0===i?void 0:i.symbol)!==(null===(o=u.lastTokenUsed)||void 0===o?void 0:o.symbol),c=(null===(r=e.lastAgentUsed)||void 0===r?void 0:r.bid)!==(null===(a=u.lastAgentUsed)||void 0===a?void 0:a.bid)||(null===(n=e.lastAgentUsed)||void 0===n?void 0:n.tid)!==(null===(l=u.lastAgentUsed)||void 0===l?void 0:l.tid);(d||c)&&v(e)}},[d,u]);let[D,O]=(0,i.useState)(!1);(0,i.useCallback)(e=>{c(t=>{let s=e(t);try{setTimeout(()=>{window.dispatchEvent(new CustomEvent("chatHistoryUpdatedRemote",{detail:{conversations:s}}))},0)}catch(e){}return s})},[]),(0,i.useEffect)(()=>{if(!s||!l||(O(!1),t))return;let e=setTimeout(()=>O(!0),350);return()=>clearTimeout(e)},[s,l,t]),(0,i.useEffect)(()=>{if(!s||!l)return;let e=()=>{try{window;let e=localStorage.getItem("paal_history_ns")||"",s="";if(t){let e=null==n?void 0:n.uid;if(!e)return;s="auth:".concat(e)}else s="";if(s!==e){console.log("[ChatHistory] Namespace change:",e,"->",s),localStorage.setItem("paal_history_ns",s);try{o.chatHistoryService.setActiveConversation(void 0)}catch(e){}setTimeout(()=>{window.dispatchEvent(new CustomEvent("chatHistoryUpdated"))},50)}}catch(e){console.error("[ChatHistory] Namespace error:",e)}};e();let i=()=>{console.log("[ChatHistory] Auth identifiers ready, updating namespace"),e()};return window.addEventListener("paal:authIdentifiersReady",i),()=>{window.removeEventListener("paal:authIdentifiersReady",i)}},[s,l,t,null==n?void 0:n.uid]);let L=(0,i.useCallback)((e,t)=>{},[]),P=(0,i.useCallback)(()=>{let e=e=>{var t,s;let i=null===(t=e.detail)||void 0===t?void 0:t.conversationId,o=null===(s=e.detail)||void 0===s?void 0:s.message;i&&o&&L(i,o)};return window.addEventListener("paal:persistAssistant",e),()=>window.removeEventListener("paal:persistAssistant",e)},[L]);(0,i.useEffect)(()=>P(),[P]);let F=(0,i.useCallback)(async(e,t)=>{let s=null==n?void 0:n.uid;if(!s)return{items:[],prevCursor:null};try{let i=new URLSearchParams({user_id:s,limit:"200",mode:"latest"});t&&i.set("cursor",t);let o=await fetch("/api/conversations/".concat(e,"/messages?").concat(i.toString()));if(!o.ok)return console.error("[ChatHistory] Messages API fetch failed:",o.status),{items:[],prevCursor:null};let r=await o.json();return{items:r.items.map(e=>{let t=e.content.parts.filter(e=>"text"===e.type).map(e=>e.text).join("");return{id:e.message_id,text:t,isUser:"user"===e.role,timestamp:new Date(e.created_at),isStreaming:!1}}),prevCursor:r.prev_cursor}}catch(e){return console.error("[ChatHistory] Messages API fetch error:",e),{items:[],prevCursor:null}}},[n]),B=(0,i.useCallback)(async e=>{if(!(null==n?void 0:n.uid))return[];let t=[],s=null,i=!0;for(;i;){let{items:o,prevCursor:r}=await F(e,s);t=[...o,...t],s=r,i=!!r}return t},[n,F]),K=(0,i.useCallback)(async e=>{let t=null==n?void 0:n.uid;if(!t)return{items:[],nextCursor:null};try{let s=new URLSearchParams({user_id:t,limit:"20"});e&&s.set("cursor",e);let i=await fetch("/api/conversations?".concat(s.toString()));if(!i.ok)return console.error("[ChatHistory] API fetch failed:",i.status),{items:[],nextCursor:null};let o=await i.json();return{items:o.items.map(e=>({id:e.conversation_id,title:e.title||"Untitled",messages:[],createdAt:new Date(e.created_at),updatedAt:new Date(e.updated_at),preview:e.title||"Untitled"})),nextCursor:o.next_cursor}}catch(e){return console.error("[ChatHistory] API fetch error:",e),{items:[],nextCursor:null}}},[n]),G=(0,i.useCallback)(async()=>
1{if(S&&!U&&f){A(!0);try{let{items:e,nextCursor:t}=await K(f);c(t=>{let s=new Set(t.map(e=>e.id)),i=e.filter(e=>!s.has(e.id));return[...t,...i]}),w(t),H(!!t)}finally{A(!1)}}},[S,U,f,K]);(0,i.useRef)(!1);let J=(0,i.useCallback)(async()=>{console.log("[ChatHistory] refreshConversations: no-op, using localStorage only")},[]);(0,i.useEffect)(()=>{let e=async()=>{h(!0);try{let e=null==n?void 0:n.uid,s=o.chatHistoryService.getAllConversations(),i=new Set,r=s.filter(e=>{let t=e.id||"";return!i.has(t)&&(i.add(t),!0)});if(c(r),t&&e&&0===r.length&&!k.current){console.log("[ChatHistory] First load for logged-in user, fetching from API to populate localStorage");let{items:e,nextCursor:t}=await K();e.forEach(e=>{if(!o.chatHistoryService.getConversation(e.id)){let t=o.chatHistoryService.getUserHistory();t.conversations.unshift({id:e.id,title:e.title,messages:[],createdAt:e.createdAt,updatedAt:e.updatedAt,preview:e.preview}),o.chatHistoryService.saveUserHistory(t)}});let s=new Set,i=e.filter(e=>{let t=e.id||"";return!s.has(t)&&(s.add(t),!0)});c(i),w(t),H(!!t),k.current=!0}else w(null),H(!1),k.current=!1}catch(e){console.error("Error loading conversations:",e)}finally{h(!1)}};if(!s||!l||t&&!(null==n?void 0:n.uid))return;e();let i=t=>{var s;(null===(s=t.key)||void 0===s?void 0:s.includes("paal_chat_history"))&&e()},r=()=>{e()};return window.addEventListener("storage",i),window.addEventListener("chatHistoryUpdated",r),()=>{window.removeEventListener("storage",i),window.removeEventListener("chatHistoryUpdated",r)}},[s,l,t,null==n?void 0:n.uid,K]),(0,i.useEffect)(()=>{let e=()=>{try{let e=o.chatHistoryService.getAllConversations();c(e),v(null);try{o.chatHistoryService.setActiveConversation(void 0)}catch(e){}y({}),C(e=>e+1)}catch(e){}};return window.addEventListener("paal:loggedOut",e),()=>window.removeEventListener("paal:loggedOut",e)},[]);let X=(0,i.useCallback)(async e=>{let t=o.chatHistoryService.createConversation(),s={id:t,title:e||"New Chat",messages:[],createdAt:new Date,updatedAt:new Date,preview:e||"New Chat"};return c(e=>[s,...e]),v(s),y(e=>({...e,[t]:[]})),N.current.add(t),t},[]),j=(0,i.useCallback)(async e=>{let s=null==n?void 0:n.uid,i=o.chatHistoryService.getConversation(e);if(i&&i.messages.length>0){console.log("[ChatHistory] Loading from localStorage:",e,"messages:",i.messages.length),o.chatHistoryService.setActiveConversation(e),v(i);let t=i.messages.map(e=>({id:e.id,text:e.text,isUser:e.isUser,timestamp:e.timestamp,selectedToken:e.selectedToken,resumeResponse:e.resumeResponse,mode:e.mode,reasoningMarkdown:e.reasoningMarkdown,researchMarkdown:e.researchMarkdown,prediction:e.prediction,isStreaming:e.isStreaming}));y(s=>({...s,[e]:t})),C(e=>e+1),N.current.add(e);return}if(t&&s){if(N.current.has(e)){let t=d.find(t=>t.id===e);t&&v(t);return}I(!0);try{console.log("[ChatHistory] Loading from API:",e);let t=await B(e),s=d.find(t=>t.id===e);if(s){let i=t.map(e=>({id:e.id,text:e.text,isUser:e.isUser,timestamp:e.timestamp})),r={...s,messages:i};try{if(o.chatHistoryService.getConversation(e))i.forEach(t=>{o.chatHistoryService.addMessage(e,t)});else{o.chatHistoryService.createConversation();let t=o.chatHistoryService.getUserHistory(),r=t.conversations[0];r&&(r.id=e,r.title=s.title,r.messages=i,r.createdAt=s.createdAt,r.updatedAt=s.updatedAt,o.chatHistoryService.saveUserHistory(t))}console.log("[ChatHistory] Saved to localStorage:",e,"messages:",i.length)}catch(e){console.error("[ChatHistory] Failed to save to localStorage:",e)}c(t=>t.map(t=>t.id===e?r:t)),v(r),o.chatHistoryService.setActiveConversation(e),y(s=>({...s,[e]:t})),C(e=>e+1),N.current.add(e)}}catch(e){console.error("[ChatHistory] Failed to load messages:",e)}finally{I(!1)}}},[t,n,d,B]),V=(0,i.useCallback)(async(e,s)=>{var i;let r=s||(null==u?void 0:u.id);if(console.log("[ChatHistory] addMessageToConversation called:",{messageId:e.id,isUser:e.isUser,targetConversationId:r,activeConversationId:null==u?void 0:u.id,isAuthenticated:t,hasUid:!!(null==n?void 0:n.uid)}),!r){console.error("ERROR: No conversation ID available for adding message!");return}let a={id:e.id,text:e.text,isUser:e.isUser,timestamp:e.timestamp,selectedToken:e.selectedToken,resumeResponse:e.resumeResponse,mode:e.mode,reasoningMarkdown:e.reasoningMarkdown,researchMarkdown:e.researchMarkdown,prediction:e.prediction,isStreaming:e.isStreaming},l=o.chatHistoryService.getConversation(r);(null==l?void 0:null===(i=l.messages)||void 0===i?void 0:i.some(e=>e.id===a.id))||o.chatHistoryService.addMessage(r,a),y(t=>{let s=t[r]||[];return s.some(t=>t.id===e.id)?(console.log("[ChatHistory] Message already exists in messagesById, skipping"),t):(console.log("[ChatHistory] Adding message to messagesById, current count:",s.length),{...t,[r]:[...s,e]})}
1),(null==u?void 0:u.id)===r&&(console.log("[ChatHistory] Updating activeConversation with new message"),v(e=>!e||e.id!==r||e.messages.some(e=>e.id===a.id)?e:{...e,messages:[...e.messages,a]})),C(e=>e+1)},[u,t,n]),z=(0,i.useCallback)((e,t,s)=>{let i=s||(null==u?void 0:u.id);if(!i){console.error("ERROR: No conversation ID available for updating message!");return}let r={text:t.text,isStreaming:t.isStreaming};o.chatHistoryService.updateMessage(i,e,r),y(s=>{let o=s[i]||[];return{...s,[i]:o.map(s=>s.id===e?{...s,...t}:s)}}),(null==u?void 0:u.id)===i&&v(s=>s&&s.id===i?{...s,messages:s.messages.map(s=>s.id===e?{...s,...void 0!==t.text?{text:t.text}:{},...void 0!==t.isStreaming?{isStreaming:t.isStreaming}:{}}:s)}:s),C(e=>e+1)},[u]),W=(0,i.useCallback)((e,t)=>{let s=t||(null==u?void 0:u.id);s&&(c(t=>{let i=t.find(e=>e.id===s);if(!i)return t;let o=i.lastTokenUsed,r=e?{address:e.address,symbol:e.symbol}:void 0;return((null==o?void 0:o.address)!==(null==r?void 0:r.address)||(null==o?void 0:o.symbol)!==(null==r?void 0:r.symbol))&&(o||r)?t.map(e=>e.id===s?{...e,lastTokenUsed:r}:e):t}),o.chatHistoryService.setConversationToken(s,e))},[u]),q=(0,i.useCallback)((e,t)=>{let s=t||(null==u?void 0:u.id);s&&(c(t=>{var i,o,r,a;let n=t.find(e=>e.id===s);if(!n)return t;let l=n.lastAgentUsed,d=e?{bid:null!==(i=e.bid)&&void 0!==i?i:null,tid:null!==(o=e.tid)&&void 0!==o?o:null,handle:null!==(r=e.handle)&&void 0!==r?r:null,image:null!==(a=e.image)&&void 0!==a?a:null}:void 0;return((null==l?void 0:l.bid)!==(null==d?void 0:d.bid)||(null==l?void 0:l.tid)!==(null==d?void 0:d.tid))&&(l||d)?t.map(e=>e.id===s?{...e,lastAgentUsed:d}:e):t}),o.chatHistoryService.setConversationAgent(s,e))},[u]),Y=(0,i.useCallback)((e,t)=>{let s=t||(null==u?void 0:u.id);s&&o.chatHistoryService.setConversationMode(s,e)},[u]),Z=(0,i.useCallback)(async e=>{let s=null==n?void 0:n.uid;if(t&&s&&e.startsWith("conv_"))try{let t=await fetch("/api/conversations/".concat(e,"?user_id=").concat(encodeURIComponent(s)),{method:"DELETE"});t.ok||204===t.status||console.error("[ChatHistory] Failed to delete conversation via API:",t.status)}catch(e){console.error("[ChatHistory] Error deleting conversation via API:",e)}o.chatHistoryService.deleteConversation(e),c(t=>t.filter(t=>t.id!==e)),y(t=>{let s={...t};return delete s[e],s}),N.current.delete(e),(null==u?void 0:u.id)===e&&v(null)},[t,n,u]),$=(0,i.useCallback)(async(e,s)=>{if(console.log("[ChatHistory] renameConversation called:",{conversationId:e,newTitle:s,isAuthenticated:t,hasUid:!!(null==n?void 0:n.uid)}),t&&(null==n?void 0:n.uid)&&e.startsWith("conv_"))try{if(console.log("[ChatHistory] Calling API to rename conversation"),!(await fetch("/api/conversations/".concat(e,"?user_id=").concat(encodeURIComponent(n.uid)),{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({title:s})})).ok)throw Error("Failed to rename conversation");console.log("[ChatHistory] API rename successful")}catch(e){console.error("[ChatHistory] Error renaming conversation via API:",e)}console.log("[ChatHistory] Updating localStorage with new title"),o.chatHistoryService.renameConversation(e,s),console.log("[ChatHistory] Updating conversations state"),c(t=>{console.log("[ChatHistory] Current conversations count:",t.length);let i=t.map(t=>t.id===e?{...t,title:s}:t);return console.log("[ChatHistory] Updated conversations, found match:",i.some(t=>t.id===e&&t.title===s)),i}),(null==u?void 0:u.id)===e&&(console.log("[ChatHistory] Updating active conversation title"),v(e=>e?{...e,title:s}:e)),console.log("[ChatHistory] Dispatching chatHistoryUpdated event");try{window.dispatchEvent(new CustomEvent("chatHistoryUpdated")),console.log("[ChatHistory] Event dispatched successfully")}catch(e){console.error("[ChatHistory] Failed to dispatch chatHistoryUpdated event:",e)}},[t,n,u]),Q=(0,i.useCallback)(()=>{o.chatHistoryService.setActiveConversation(void 0),v(null);try{setTimeout(()=>{window.dispatchEvent(new CustomEvent("chatActiveChangedRemote",{detail:{activeId:null}}))},0)}catch(e){}},[]),ee=(0,i.useCallback)(e=>o.chatHistoryService.searchConversations(e),[]),et=(0,i.useCallback)(()=>o.chatHistoryService.exportConversations(),[]),es=(0,i.useCallback)(e=>o.chatHistoryService.importConversations(e),[]),ei=(0,i.useCallback)(()=>{o.chatHistoryService.clearAllHistory(),c([]),v(null),y({}),C(e=>e+1);try{setTimeout(()=>{window.dispatchEvent(new CustomEvent("chatHistoryUpdatedRemote",{detail:{conversations:[]}})),window.dispatchEvent(new CustomEvent("chatActiveChangedRemote",{detail:{activeId:null}}))},0)}catch(e){}},[]),eo=(0,i.useCallback)(()=>o.chatHistoryService.getStatistics(),[]),er=(0,i.useCallback)(e=>e?e.messages.map(e=>({id:e.id,text:e.text,isUser:e.isUser,timestamp:e.timestamp,selectedToken:e.selectedToken,resumeResponse:e.resumeResponse,mode:e.mode,reasoningMarkdown:e.reasoningMarkdown,researchMarkdown:e.researchMarkdown,prediction:e.prediction,isStreaming:e.isStreaming})):[],[]),ea=(0,i.useCallback)(e=>{let t=e||(null==u?void 0:u.id);if(!t)return[];if(m[t]&&m[t].length>0)return console.log("[ChatHistory] getCurrentMessages: returning from messagesById, count:",m[t].length),m[t];if((null==u?void 0:u.id)===t&&u.messages.length>0)return console.log("[ChatHistory] getCurrentMessages: returning from activeConversation, count:",u.messages.length),er(u);let s=d.find(e=>e.id===t);if(s&&s.messages.length>0)return console.log("[ChatHistory] getCurrentMessages: returning from conversations list, count:",s.messages.length),er(s);let i=o.chatHistoryService.getConversation(t);return i&&i.messages.length>0?(console.log("[ChatHistory] getCurrentMessages: returning from localStorage, count:",i.messages.length),er(i)):(console.log("[ChatHistory] getCurrentMessages: no messages found for",t),[])},[u,er,m,d]),en=(0,i.useCallback)((e,t)=>{console.log("[ChatHistory] Migrating conversation ID:",e,"->",t);let s=d.find(t=>
1t.id===e),i=null==s?void 0:s.lastTokenUsed,r=null==s?void 0:s.lastAgentUsed,a=null==s?void 0:s.mode;if(console.log("[ChatHistory] Old conversation data:",{oldToken:i,oldAgent:r,oldMode:a}),m[e]&&y(s=>{let i={...s};return i[t]=i[e],delete i[e],i}),(null==u?void 0:u.id)===e&&v(e=>e?{...e,id:t}:null),c(s=>s.map(s=>s.id===e?{...s,id:t,lastTokenUsed:i,lastAgentUsed:r,mode:a}:s)),i){console.log("[ChatHistory] Migrating token to localStorage:",i);try{o.chatHistoryService.setConversationToken(t,i)}catch(e){console.error("[ChatHistory] Failed to migrate token:",e)}}if(r){console.log("[ChatHistory] Migrating agent to localStorage:",r);try{o.chatHistoryService.setConversationAgent(t,r)}catch(e){console.error("[ChatHistory] Failed to migrate agent:",e)}}N.current.add(t),N.current.has(e)&&N.current.delete(e)},[u,m,d]);return{conversations:d,activeConversation:u,isLoading:g,messagesVersion:p,hasMore:S,isLoadingMore:U,isLoadingMessages:E,createNewConversation:X,loadConversation:j,addMessageToConversation:V,updateMessageInConversation:z,deleteConversation:Z,renameConversation:$,clearActiveConversation:Q,searchConversations:ee,exportConversations:et,importConversations:es,clearAllHistory:ei,setConversationToken:W,setConversationAgent:q,setConversationMode:Y,persistAssistantMessage:L,loadMoreConversations:G,refreshConversations:J,migrateConversationId:en,getUpstreamConversationId:e=>o.chatHistoryService.getUpstreamConversationId(e),setUpstreamConversationId:(e,t)=>o.chatHistoryService.setUpstreamConversationId(e,t),getStatistics:eo,getMessagesForUI:er,getCurrentMessages:ea,hasActiveConversation:!!u,conversationCount:d.length}}},80794:(e,t,s)=>{s.r(t),s.d(t,{chatHistoryService:()=>o});class i{generateBrowserFingerprint(){let e=document.createElement("canvas"),t=e.getContext("2d");t&&(t.textBaseline="top",t.font="14px Arial",t.fillText("Browser fingerprint",2,2));let s=[navigator.userAgent,navigator.language,screen.width+"x"+screen.height,new Date().getTimezoneOffset(),e.toDataURL(),navigator.hardwareConcurrency||0,navigator.maxTouchPoints||0].join("|"),i=0;for(let e=0;e<s.length;e++)i=(i<<5)-i+s.charCodeAt(e),i&=i;return Math.abs(i).toString(16)}getUserId(){let e=localStorage.getItem("paal_user_id");return e||(e=this.generateBrowserFingerprint(),localStorage.setItem("paal_user_id",e)),e}getNamespace(){try{let e=localStorage.getItem("paal_history_ns");if(e&&""!==e.trim())return e.trim()}catch(e){}return"guest:".concat(this.getUserId())}getStorageKey(){return"".concat(this.BASE_STORAGE_KEY,"__").concat(this.getNamespace())}getUserHistory(){try{let e=localStorage.getItem(this.getStorageKey());if(!e)return{userId:this.getUserId(),conversations:[],activeConversationId:void 0};let t=JSON.parse(e);return t.conversations=t.conversations.map(e=>({...e,createdAt:new Date(e.createdAt),updatedAt:new Date(e.updatedAt),messages:e.messages.map(e=>({...e,timestamp:new Date(e.timestamp)}))})),t}catch(e){return console.error("Error loading chat history:",e),{userId:this.getUserId(),conversations:[],activeConversationId:void 0}}}saveUserHistory(e){try{e.conversations.length>this.MAX_CONVERSATIONS&&(e.conversations=e.conversations.sort((e,t)=>t.updatedAt.getTime()-e.updatedAt.getTime()).slice(0,this.MAX_CONVERSATIONS)),e.conversations.forEach(e=>{e.messages.length>this.MAX_MESSAGES_PER_CONVERSATION&&(e.messages=e.messages.slice(-this.MAX_MESSAGES_PER_CONVERSATION))}),localStorage.setItem(this.getStorageKey(),JSON.stringify(e)),window.dispatchEvent(new CustomEvent("chatHistoryUpdated",{detail:{conversations:e.conversations}}))}catch(e){console.error("Error saving chat history:",e)}}createConversation(){let e=this.getUserHistory(),t="conv_".concat(Date.now(),"_").concat(Math.random().toString(36).substr(2,9)),s={id:t,title:"New Chat",messages:[],createdAt:new Date,updatedAt:new Date,mode:"paallm",preview:"New conversation"};return e.conversations.unshift(s),e.activeConversationId=t,this.saveUserHistory(e),t}setConversationMode(e,t){let s=this.getUserHistory(),i=s.conversations.find(t=>t.id===e);i&&(i.mode=t,this.saveUserHistory(s))}addMessage(e,t){let s=this.getUserHistory(),i=s.conversations.find(t=>
1t.id===e);i||(i={id:e,title:"New Chat",messages:[],createdAt:new Date,updatedAt:new Date,mode:"paallm",preview:"New conversation"},s.conversations.unshift(i),s.activeConversationId=e),i.messages.push(t),i.updatedAt=new Date;let o=i.messages.filter(e=>e.isUser).length;if(t.isUser&&1===o){let e=this.generateConversationTitle(t.text);i.title=e,i.preview=t.text.substring(0,80)+(t.text.length>80?"...":"")}t.selectedToken&&(i.lastTokenUsed=t.selectedToken),this.saveUserHistory(s)}updateMessage(e,t,s){let i=this.getUserHistory(),o=i.conversations.find(t=>t.id===e);o||(o={id:e,title:"New Chat",messages:[],createdAt:new Date,updatedAt:new Date,mode:"paallm",preview:"New conversation"},i.conversations.unshift(o),i.activeConversationId=e);let r=o.messages.findIndex(e=>e.id===t);if(-1===r){var a;let e={id:t,text:s.text||"",isUser:!1,timestamp:new Date,resumeResponse:s.resumeResponse,selectedToken:s.selectedToken,mode:(null==s?void 0:s.mode)||"paallm",reasoningMarkdown:null==s?void 0:s.reasoningMarkdown,researchMarkdown:null==s?void 0:s.researchMarkdown,prediction:null==s?void 0:s.prediction,isStreaming:null===(a=s.isStreaming)||void 0===a||a,isGeneratingFollowups:null==s?void 0:s.isGeneratingFollowups};o.messages.push(e),r=o.messages.length-1}o.messages[r]={...o.messages[r],...s},o.updatedAt=new Date,this.saveUserHistory(i)}setConversationToken(e,t){let s=this.getUserHistory(),i=s.conversations.find(t=>t.id===e);i&&(t?i.lastTokenUsed=t:delete i.lastTokenUsed,this.saveUserHistory(s))}setConversationAgent(e,t){let s=this.getUserHistory(),i=s.conversations.find(t=>t.id===e);if(i){if(t&&(t.bid||t.tid||t.handle)){var o,r,a,n;i.lastAgentUsed={bid:null!==(o=t.bid)&&void 0!==o?o:null,tid:null!==(r=t.tid)&&void 0!==r?r:null,handle:null!==(a=t.handle)&&void 0!==a?a:null,image:null!==(n=t.image)&&void 0!==n?n:null}}else delete i.lastAgentUsed;this.saveUserHistory(s)}}setUpstreamConversationId(e,t){if(!t)return;let s=this.getUserHistory(),i=s.conversations.find(t=>t.id===e);i&&(i.upstreamConversationId=t,this.saveUserHistory(s))}getUpstreamConversationId(e){let t=this.getUserHistory().conversations.find(t=>t.id===e);return(null==t?void 0:t.upstreamConversationId)||null}generateConversationTitle(e){let t=e.toLowerCase(),s=t.match(/\$([a-zA-Z]{2,10})/g);if(s){let e=s[0];return t.includes("price")||t.includes("cost")?"".concat(e," Price Check"):t.includes("analysis")||t.includes("analyze")?"".concat(e," Analysis"):t.includes("buy")||t.includes("sell")?"".concat(e," Trading"):t.includes("future")||t.includes("prediction")?"".concat(e," Forecast"):"".concat(e," Discussion")}if(t.includes("price")||t.includes("cost"))return"Price Inquiry";if(t.includes("trading")||t.includes("buy")||t.includes("sell"))return"Trading Discussion";if(t.includes("defi")||t.includes("yield"))return"DeFi Strategy";if(t.includes("nft"))return"NFT Discussion";if(t.includes("wallet")||t.includes("security"))return"Wallet & Security";let i=e.split(" ").slice(0,4).join(" ");return i.length>30?i.substring(0,30)+"...":i}getConversation(e){return this.getUserHistory().conversations.find(t=>t.id===e)||null}getAllConversations(){let e=this.getUserHistory(),t=new Set;return e.conversations.filter(e=>{let s=e.id||"";return!t.has(s)&&(t.add(s),!0)}).sort((e,t)=>t.updatedAt.getTime()-e.updatedAt.getTime())}deleteConversation(e){let t=this.getUserHistory();t.conversations=t.conversations.filter(t=>t.id!==e),t.activeConversationId===e&&(t.activeConversationId=void 0),this.saveUserHistory(t)}renameConversation(e,t){let s=this.getUserHistory(),i=s.conversations.find(t=>t.id===e);i&&(i.title=t.trim()||"Untitled Chat",i.updatedAt=new Date,this.saveUserHistory(s))}setActiveConversation(e){let t=this.getUserHistory();t.activeConversationId=e;try{localStorage.setItem(this.getStorageKey(),JSON.stringify(t)),window.dispatchEvent(new CustomEvent("chatHistoryUpdated",{detail:{conversations:t.conversations}}))}catch(e){console.error("Error saving chat history:",e)}}getActiveConversation(){let e=this.getUserHistory();return e.activeConversationId?this.getConversation(e.activeConversationId):null}clearAllHistory(){try{localStorage.removeItem(this.getStorageKey())}catch(e){}window.dispatchEvent(new CustomEvent("chatHistoryUpdated",{detail:{conversations:[]}}))}exportConversations(){return JSON.stringify(this.getUserHistory().conversations,null,2)}importConversations(e){try{let t=JSON.parse(e),s=this.getUserHistory();s.conversations=t.map(e=>({...e,createdAt:new Date(e.createdAt),updatedAt:new Date(e.updatedAt),messages:e.messages.map(e=>({...e,timestamp:new Date(e.timestamp)}))}));try{localStorage.setItem(this.getStorageKey(),JSON.stringify(s)),window.dispatchEvent(new CustomEvent("chatHistoryUpdated",{detail:{conversations:s.conversations}}))}catch(e){return console.error("Error saving imported conversations:",e),!1}return!0}catch(e){return console.error("Error importing conversations:",e),!1}}searchConversations(e){let t=this.getUserHistory(),s=e.toLowerCase();return t.conversations.filter(e=>e.title.toLowerCase().includes(s)||e.preview.toLowerCase().includes(s)||e.messages.some(e=>e.text.toLowerCase().includes(s)))}getStatistics(){let e=this.getUserHistory(),t=e.conversations.length;return{totalConversations:t,totalMessages:e.conversations.reduce((e,t)=>
1e+t.messages.length,0),uniqueTokensDiscussed:new Set(e.conversations.flatMap(e=>e.messages).filter(e=>e.selectedToken).map(e=>e.selectedToken.symbol)).size,oldestConversation:e.conversations.length>0?Math.min(...e.conversations.map(e=>e.createdAt.getTime())):null,mostRecentActivity:e.conversations.length>0?Math.max(...e.conversations.map(e=>e.updatedAt.getTime())):null}}constructor(){this.BASE_STORAGE_KEY="paal_chat_history",this.MAX_CONVERSATIONS=50,this.MAX_MESSAGES_PER_CONVERSATION=200}}let o=new i}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.