react-ai-agent 1.5.6
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 +106 -0
- package/dist/index.cjs +1 -0
- package/dist/index.esm.js +1 -0
- package/dist/ui.css +1 -0
- package/index.d.ts +633 -0
- package/package.json +100 -0
package/README.md
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# React Chat Agent
|
|
2
|
+
|
|
3
|
+
Clean, production-ready React chat component. Bring your own API - you control everything.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- ✅ **External Token Management** - You control authentication
|
|
8
|
+
- ✅ **Automatic Token Refresh** - Handles expiry seamlessly
|
|
9
|
+
- ✅ **Dual Mode** - WebSocket or SSE streaming
|
|
10
|
+
- ✅ **Session Management** - Clean session lifecycle
|
|
11
|
+
- ✅ **Type Safety** - Full TypeScript support
|
|
12
|
+
- ✅ **Customizable** - Dark/light themes, custom styling
|
|
13
|
+
- ✅ **Production Ready** - Error handling, retry logic, file uploads
|
|
14
|
+
|
|
15
|
+
## Installation
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install react-chat-agent
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Then import the ui in your app:
|
|
22
|
+
|
|
23
|
+
```javascript
|
|
24
|
+
import 'react-chat-agent/ui.css';
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Quick Start
|
|
28
|
+
|
|
29
|
+
```javascript
|
|
30
|
+
import {
|
|
31
|
+
ChatProvider,
|
|
32
|
+
DefaultPanel,
|
|
33
|
+
tokenManager,
|
|
34
|
+
sessionManager
|
|
35
|
+
} from 'react-chat-agent';
|
|
36
|
+
|
|
37
|
+
function App() {
|
|
38
|
+
// 1. Configure token refresh
|
|
39
|
+
tokenManager.setRefreshCallback(async (refreshToken) => {
|
|
40
|
+
const res = await fetch('/api/token/refresh', {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
body: JSON.stringify({ refreshToken })
|
|
43
|
+
});
|
|
44
|
+
return await res.json(); // { accessToken, refreshToken, expiresIn }
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// 2. Configure session creation
|
|
48
|
+
sessionManager.setCreateSessionCallback(async () => {
|
|
49
|
+
const res = await fetch('/api/session/create', { method: 'POST' });
|
|
50
|
+
return await res.json(); // { sessionId, accessToken, refreshToken, expiresIn }
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// 3. Initialize tokens
|
|
54
|
+
tokenManager.setTokens({
|
|
55
|
+
sessionId: 'your-session-id',
|
|
56
|
+
accessToken: 'your-token',
|
|
57
|
+
refreshToken: 'your-refresh-token',
|
|
58
|
+
expiresIn: 900
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
return (
|
|
62
|
+
<ChatProvider useWebSocket={false}>
|
|
63
|
+
<DefaultPanel
|
|
64
|
+
onCreateSession={async () => await sessionManager.createSession()}
|
|
65
|
+
config={{
|
|
66
|
+
chatUrl: 'https://api.example.com/chat',
|
|
67
|
+
historyUrl: 'https://api.example.com/history'
|
|
68
|
+
}}
|
|
69
|
+
/>
|
|
70
|
+
</ChatProvider>
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Documentation
|
|
76
|
+
|
|
77
|
+
See [INTEGRATION_GUIDE.md](./INTEGRATION_GUIDE.md) for complete documentation including:
|
|
78
|
+
- Architecture overview
|
|
79
|
+
- API reference
|
|
80
|
+
- Backend requirements
|
|
81
|
+
- Message format specifications
|
|
82
|
+
- Complete examples
|
|
83
|
+
|
|
84
|
+
## Package Exports
|
|
85
|
+
|
|
86
|
+
```javascript
|
|
87
|
+
import {
|
|
88
|
+
ChatProvider, // Context provider
|
|
89
|
+
DefaultPanel, // Main chat component
|
|
90
|
+
useChatContext, // Hook to access chat state
|
|
91
|
+
tokenManager, // Token lifecycle management
|
|
92
|
+
sessionManager, // Session lifecycle management
|
|
93
|
+
chatApi, // API client
|
|
94
|
+
streamService, // Stream handler
|
|
95
|
+
webSocketService // WebSocket client
|
|
96
|
+
} from 'react-chat-agent';
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Examples
|
|
100
|
+
|
|
101
|
+
- `examples/App.jsx` - Simple SSE example
|
|
102
|
+
- `examples/App-with-session.jsx` - Complete session management example
|
|
103
|
+
|
|
104
|
+
## License
|
|
105
|
+
|
|
106
|
+
MIT
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("react"),t=require("react-syntax-highlighter"),s=require("react/jsx-runtime"),a=require("@tanstack/react-virtual"),r=require("streamdown"),n=require("react-markdown"),i=require("framer-motion");function o(e){return e&&e.__esModule?e:{default:e}}var c=o(e),l=o(n);class d{constructor(e,t={}){this.tokenManager=e,this.abortController=null,this.config={uploadUrl:"https://api.oblien.com/ai/chat/upload",chatUrl:"https://api.oblien.com/ai/chat/send",historyUrl:"https://api.oblien.com/ai/session/history",prepareSessionUrl:"https://api.oblien.com/ai/session/prepare",...t}}setConfig(e){this.config={...this.config,...e}}async getToken(){return await this.tokenManager.getAccessToken()}getSessionId(){return this.tokenManager.getSessionId()}abort(){this.abortController&&(this.abortController.abort(),this.abortController=null)}async uploadFiles(e,t){if(!e?.length)return[];const s=await this.getToken(),a=new FormData;e.forEach((e,t)=>{a.append("files",e.file,e.name)});const r=await fetch(this.config.uploadUrl,{method:"POST",headers:{Authorization:"Bearer "+s},body:a,signal:t});if(!r.ok)throw Error("File upload failed: "+r.status);return(await r.json()).uploadId}async sendMessage({message:e,context:t,attachedFiles:s,uploadId:a,sessionId:r,allowThinking:n},i=null){this.abort();try{this.abortController=new AbortController;const l=this.abortController.signal,d=await this.getToken();if(!d)throw Error("No access token available");if(!(r=r||this.getSessionId()))throw Error("No session ID available");s?.length>0&&!a&&(a=await this.uploadFiles(s,l));const h=await fetch(this.config.chatUrl,{method:"POST",headers:{"Content-Type":"application/json",Accept:i?"text/event-stream":"application/json",Authorization:"Bearer "+d},body:JSON.stringify({message:e,context:t,uploadId:a,sessionId:r,allowThinking:n}),signal:l});if(!h.ok){let e=null;try{e=await h.json()}catch(o){}const t={status:!1,error:e?.error||"HTTP error! status: "+h.status,message:e?.message||"Server returned "+h.status,limit:e?.limit,...e};return i&&i(JSON.stringify({event:"stream_error",data:{errorType:e?.error||"http_error",error:t.error,message:t.message,limit:t.limit}})),t}if(!i)try{return{status:!0,data:await h.json()}}catch(c){return{status:!1,error:c.message}}if(!h.body)throw Error("ReadableStream not supported");const u=h.body.getReader(),g=new TextDecoder;let m="";for(;;)try{const{value:e,done:t}=await u.read();if(t){i(JSON.stringify({event:"ai_response_end",data:{status:"end"}}));break}m+=g.decode(e,{stream:!0});const s=m.split("\n");m=s.pop()||"";for(const a of s)a.trim()&&i(a)}catch(c){i(JSON.stringify({event:"stream_error",data:{errorType:"stream_error",error:c.message,message:"Error reading stream"}}));break}return{status:!0}}catch(c){const e={status:!1,error:c.message,message:"AbortError"===c.name?"Request aborted":"Failed to send message"};return i&&i(JSON.stringify({event:"stream_error",data:{errorType:"connection_error",error:e.error,message:e.message}})),e}}async getHistory({offset:e=0,limit:t=20,sessionId:s}={}){try{const a=await this.getToken();if(!(s=s||this.getSessionId()))throw Error("No session ID available");const r=await fetch(this.config.historyUrl+`?offset=${e}&limit=${t}&sessionId=${s}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+a}});if(!r.ok){const e=await r.json().catch(()=>({error:"Failed to load history"}));return{error:e.error||"Failed to load history",message:e.message}}return await r.json()}catch(a){return{error:a.message,message:"Failed to load chat history"}}}async prepareSession(e,t){try{const s=await this.getToken();if(!(t=t||this.getSessionId()))throw Error("No session ID available");const a=await fetch(this.config.prepareSessionUrl+"?sessionId="+t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+s},body:JSON.stringify(e)});if(!a.ok){const e=await a.json().catch(()=>({error:"Failed to prepare session"}));return{error:e.error||"Failed to prepare session",message:e.message}}return await a.json()}catch(s){return{error:s.message,message:"Failed to prepare session"}}}}const h=new class{constructor({socketUrl:e}={}){this.socket=null,this.listeners=new Map,this.bufferedEvents=new Map,this.bufferableEventTypes=new Set([]),this.reconnectAttempts=0,this.maxReconnectAttempts=5e3,this.reconnectTimeout=3e3,this.socketUrl=e,this.requireAppRunning=null}setSocketUrl(e){this.socketUrl=e}_processBinaryData(e){this.notifyListeners("binary",{data:e})}async connect(e,t=[]){return this.socket&&this.disconnect(),e||(e=await getToken()),new Promise(async(s,a)=>{try{const a=new URL(this.socketUrl+"?token="+e+"&"+t.join("&"));this.socket=new WebSocket(a),this.socket.onopen=()=>{this.reconnectAttempts=0,this.reconnectTimeout=3e3,this.notifyListeners("connect",{connected:!0}),s(!0)},this.socket.onmessage=async e=>{try{if(e.data instanceof Blob){const t=new FileReader;return t.onload=()=>{this._processBinaryData(t.result)},void t.readAsArrayBuffer(e.data)}if(e.data instanceof ArrayBuffer)return void this._processBinaryData(e.data);if("string"==typeof e.data){const t=JSON.parse(e.data);if(this._checkPendingRequests(t))return;return this.notifyListeners("message",t),this.requireAppRunning?.events.includes(t.type)&&!this.listeners.has(t?.type)&&t?.type&&this.requireAppRunning&&"running"!==this.requireAppRunning?.status&&await this.requireAppRunning.callback(t),void(t.type&&this.notifyListeners(t.type,t))}}catch(t){}},this.socket.onclose=s=>{this.notifyListeners("disconnect",{code:s.code,reason:s.reason}),1e3!==s.code&&this.attemptReconnect(e,t)},this.socket.onerror=e=>{this.notifyListeners("error",e)}}catch(r){}})}disconnect(){this.socket&&(this.notifyListeners("close",{code:1e3,reason:"User disconnected"}),this.socket.close(1e3,"User disconnected"),this.socket=null)}attemptReconnect(e,t){this.maxReconnectAttempts>this.reconnectAttempts&&this.socket?(this.reconnectAttempts++,this.notifyListeners("reconnectAttempt",{attempts:this.reconnectAttempts}),setTimeout(()=>{this.connect(e,t)},this.reconnectTimeout)):this.notifyListeners("reconnectFailed",{attempts:this.reconnectAttempts})}isConnected(){return this.socket&&this.socket.readyState===WebSocket.OPEN}sendAsync(e,t=3e4){return new Promise((s,a)=>{if(!this.isConnected())return a(Error("WebSocket is not connected"));const r=e.requestId||`req_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,n={...e,requestId:r};this.pendingRequests||(this.pendingRequests=new Map),this.pendingRequests.set(r,{resolve:s,reject:a,timeoutId:setTimeout(()=>{this.pendingRequests.has(r)&&(this.pendingRequests.delete(r),a(Error(`Request ${r} timed out after ${t}ms`)))},t)}),this.send(n)})}_checkPendingRequests(e){if(!this.pendingRequests||!e.requestId)return!1;const t=this.pendingRequests.get(e.requestId);return!!t&&(clearTimeout(t.timeoutId),this.pendingRequests.delete(e.requestId),t.resolve(e),!0)}send(e){return!!this.isConnected()&&(this.socket.send(JSON.stringify(e)),!0)}on(e,t){return this.listeners.has(e)||this.listeners.set(e,[]),this.listeners.get(e).push(t),this.bufferedEvents.has(e)&&(this.bufferedEvents.get(e).forEach(e=>{try{t(e)}catch(s){}}),this.bufferedEvents.delete(e)),()=>this.off(e,t)}off(e,t){if(!this.listeners.has(e))return;const s=this.listeners.get(e),a=s.indexOf(t);-1!==a&&s.splice(a,1),0===s.length&&this.listeners.delete(e)}notifyListeners(e,t){const s=this.listeners.has(e);if(!s&&this.bufferableEventTypes.has(e))return this.bufferedEvents.has(e)||this.bufferedEvents.set(e,[]),void this.bufferedEvents.get(e).push(t);s&&this.listeners.get(e).forEach(e=>{try{e(t)}catch(s){}})}setAppServerStatus(e){this.requireAppRunning.status=e}setRequireAppRunning(e,t,s){return this.requireAppRunning={events:e,callback:t,status:s},()=>{this.requireAppRunning=null}}};class u{constructor(){this.buffer=""}feed(e){if(!e)return[];const t=this._tryDirectJson(e);if(t.length)return t;const s=this._tryDirectSSE(e);return s.length?s:(this.buffer+=e,this._fallbackExtract())}_tryDirectJson(e){const t=[];try{const s=JSON.parse(e);return s&&"object"==typeof s&&t.push(s),t}catch{}return e.includes("{")&&e.includes("}")?this._fallbackExtractFromText(e):[]}_tryDirectSSE(e){const t=[];for(let s of e.split("\n")){if(s=s.trim(),!s.startsWith("data:"))continue;const e=s.slice(5).trim();try{const s=JSON.parse(e);s&&"object"==typeof s&&t.push(s)}catch{}}return t}_fallbackExtract(){const e=this._fallbackExtractFromText(this.buffer);for(const t of e){const e=JSON.stringify(t),s=this.buffer.indexOf(e);-1!==s&&(this.buffer=this.buffer.slice(0,s)+this.buffer.slice(s+e.length))}return e}_fallbackExtractFromText(e){const t=[];let s=-1,a=0,r=!1,n=!1;for(let i=0;e.length>i;i++){const o=e[i];if(n)n=!1;else if("\\"===o)n=!0;else if('"'===o)r=!r;else if(!r)if("{"===o)0===a&&(s=i),a++;else if("}"===o&&(a--,0===a&&-1!==s)){const a=e.slice(s,i+1);try{const e=JSON.parse(a);t.push(e)}catch{}s=-1}}return t}}class g{constructor(){this.jsonStreamParser=new u}parseJsonStream(e){return this.jsonStreamParser.feed(e)}processRawChunk(e,t){try{const s=this.parseJsonStream(e);if(!s.length)return;for(const e of s)t(e.error||e.errorType?"stream_error":"end"===e.status||"end"===e.type||"ai_response_end"===e.event?"response_end":"response",e)}catch(s){}}}class m{constructor(e){this.chatApi=e,this.streamProcessor=new g,this.eventHandlers=new Map,this.mode=null}setMode(e="sse",t=null){this.mode=e}on(e,t){return this.eventHandlers.has(e)||this.eventHandlers.set(e,[]),this.eventHandlers.get(e).push(t),()=>{const s=this.eventHandlers.get(e);if(s){const e=s.indexOf(t);e>-1&&s.splice(e,1)}}}off(e,t){const s=this.eventHandlers.get(e);if(s){const e=s.indexOf(t);e>-1&&s.splice(e,1)}}emit(e,t){const s=this.eventHandlers.get(e);s&&s.forEach(e=>{try{e(t)}catch(s){}})}abort(){}send(e){"websocket"===this.mode&&h&&h.send(e)}startStream(e,t,s){return this.chatApi.sendMessage(e,e=>{if(t&&s)try{t(e)}catch(a){}this.streamProcessor.processRawChunk(e,(r,n)=>{if(t&&!s)try{t(e)}catch(a){}this.emit(r,n)})})}clear(){this.eventHandlers.clear()}}class p{constructor(){this.accessToken=null,this.refreshToken=null,this.tokenExpiry=null,this.refreshCallback=null,this.sessionId=null}decodeJWT(e){try{const t=e.split(".")[1].replace(/-/g,"+").replace(/_/g,"/"),s=decodeURIComponent(atob(t).split("").map(e=>"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)).join(""));return JSON.parse(s)}catch(t){return null}}isTokenExpired(e,t=30){if(!e)return!0;const s=this.decodeJWT(e);if(!s||!s.exp)return!0;const a=1e3*s.exp;return Date.now()>=a-1e3*t}setRefreshCallback(e){this.refreshCallback=e}async setAuth({accessToken:e,refreshToken:t,expiresIn:s,sessionId:a}){this.accessToken=e,this.refreshToken=t,this.sessionId=a;const r=this.decodeJWT(e);r&&r.exp?(this.tokenExpiry=1e3*r.exp,this.tokenExpiry<Date.now()+3e4&&await this.refreshTokens()):s&&(this.tokenExpiry=Date.now()+1e3*s)}async getAccessToken(){if(!this.accessToken)throw Error("No access token available. Initialize tokens first.");return this.isTokenExpired(this.accessToken,30)&&await this.refreshTokens(),this.accessToken}getSessionId(){return this.sessionId}async refreshTokens(){if(!this.refreshCallback)throw Error("No refresh callback provided");if(!this.refreshToken)throw Error("No refresh token available");try{const e=await this.refreshCallback(this.refreshToken);if(!e||!e.accessToken)throw Error("Invalid refresh response");return this.setAuth({accessToken:e.accessToken,refreshToken:e.refreshToken||this.refreshToken,expiresIn:e.expiresIn,sessionId:e.sessionId||this.sessionId}),this.accessToken}catch(e){throw this.clear(),e}}hasTokens(){return!!this.accessToken}clear(){this.accessToken=null,this.refreshToken=null,this.tokenExpiry=null,this.sessionId=null}}class f{constructor(){this.messages=[],this.messageIndex=new Map,this.listeners=new Set}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}_notify(){this.listeners.forEach(e=>e([...this.messages]))}_rebuildIndex(){this.messageIndex.clear(),this.messages.forEach((e,t)=>{this.messageIndex.set(e.messageId,t)})}addMessage(e){const t={...e,messageId:e.messageId||this._generateId(),timestamp:e.timestamp||Date.now(),uniqueKey:`msg-${e.messageId}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`};return this.messages.push(t),this.messageIndex.set(t.messageId,this.messages.length-1),this._notify(),t}updateMessage(e,t,s={}){const a=this.messageIndex.get(e);if(void 0===a)return null;const r=this.messages[a],n={};if(Object.entries(t).forEach(([e,t])=>{n[e]="function"==typeof t?t(r[e]):t}),s.silent)return Object.assign(this.messages[a],n),this.messages[a];const i=n.hasOwnProperty("isLive")||n.hasOwnProperty("isFinished")||n.hasOwnProperty("isThinkingFinished")||n.hasOwnProperty("statusType")||n.hasOwnProperty("sender")||n.hasOwnProperty("type")||n.hasOwnProperty("text");return this.messages[a]={...r,...n,...i&&{uniqueKey:`msg-${e}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`}},this._notify(),this.messages[a]}insertMessage(e,t="end"){const s={...e,messageId:e.messageId||this._generateId(),timestamp:e.timestamp||Date.now(),uniqueKey:`msg-${e.messageId}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`};return"start"===t||0===t?this.messages.unshift(s):"end"!==t&&this.messages.length>t?this.messages.splice(t,0,s):this.messages.push(s),this._rebuildIndex(),this._notify(),s}insertMessages(e,t="end"){const s=e.map(e=>({...e,messageId:e.messageId||this._generateId(),timestamp:e.timestamp||Date.now(),uniqueKey:e.uniqueKey||`msg-${e.messageId}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`}));return"start"===t||0===t?this.messages.unshift(...s):"end"!==t&&this.messages.length>t?this.messages.splice(t,0,...s):this.messages.push(...s),this._rebuildIndex(),this._notify(),s}removeMessage(e){const t=this.messageIndex.get(e);return void 0!==t&&(this.messages.splice(t,1),this._rebuildIndex(),this._notify(),!0)}getMessage(e){const t=this.messageIndex.get(e);return void 0!==t?this.messages[t]:null}hasMessage(e){return this.messageIndex.has(e)}getAllMessages(){return[...this.messages]}clear(){this.messages=[],this.messageIndex.clear(),this._notify()}setMessages(e){this.messages=e.map(e=>({...e,uniqueKey:e.uniqueKey||`msg-${e.messageId}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`})),this._rebuildIndex(),this._notify()}_generateId(){return`msg-${Date.now()}-${Math.random().toString(36).substring(2,9)}`}get count(){return this.messages.length}}class x{constructor(e,t){this.messageManager=e,this.statusRegistry=t,this.activeStreamingMessages=new Map}handleUserMessage({messageId:e,text:t,attachedFiles:s=[],...a}){return this.messageManager.addMessage({messageId:e||this.messageManager._generateId("user"),sender:"user",type:"user",text:t,attachedFiles:s,...a})}incrementChunkIndex(e){const t=this._getState(e);return t.chunkIndex+=1,t.chunkIndex}markTypeProcessed(e,t){this._getState(e).lastProcessedType=t}shouldFinishThinking(e){const t=this._getState(e);return t.hasChunk&&t.hasThinking&&!t.thinkingFinished}markThinkingFinished(e){const t=this._getState(e),s=e+"-thinking";t.thinkingFinished=!0,t.hasChunk=!0,t.hasThinking&&this.messageManager.hasMessage(s)&&this.messageManager.updateMessage(s,{isLive:!1,isThinkingFinished:!0})}}class b{constructor(){this.handlers=new Map,this.globalHandlers=[],this.streamForwarders=new Map}register(e,t,s={}){this.handlers.has(e)||this.handlers.set(e,[]);const a={handler:t,filter:s};return this.handlers.get(e).push(a),()=>{const t=this.handlers.get(e);if(t){const e=t.indexOf(a);e>-1&&t.splice(e,1)}}}registerGlobal(e,t={}){const s={handler:e,filter:t};return this.globalHandlers.push(s),()=>{const e=this.globalHandlers.indexOf(s);e>-1&&this.globalHandlers.splice(e,1)}}_matchesFilter(e,t){return!t.instanceId||e.instanceId===t.instanceId}async handle(e){const{status:t,messageId:s}=e,a=t?.type||e.type;await Promise.all(this.globalHandlers.filter(t=>this._matchesFilter(e,t.filter)).map(t=>Promise.resolve(t.handler(e)).catch(e=>{})));const r=this.handlers.get(a)||[];await Promise.all(r.filter(t=>this._matchesFilter(e,t.filter)).map(t=>Promise.resolve(t.handler(e)).catch(e=>{}))),"started"===t?.state||"in_progress"===t?.state?this._startStreamForwarding(s,a,e):"finished"!==t?.state&&"error"!==t?.state||this._stopStreamForwarding(s,a,e)}registerStreamForwarder(e){const t=Math.random().toString(36).substring(2,9);return this.streamForwarders.set(t,{forwarder:e,active:!1,messageId:null}),{id:t,stop:()=>this.streamForwarders.delete(t)}}forwardStream(e,t){this.streamForwarders.forEach(s=>{if(s.active&&s.messageId===e)try{"chunk"===t.type&&s.forwarder({...t,statusType:s.statusType})}catch(a){}})}_startStreamForwarding(e,t,s){this.streamForwarders.forEach(a=>{a.active=!0,a.messageId=e,a.statusType=t,a.forwarder.onStart&&a.forwarder.onStart({...s,statusType:t})})}_stopStreamForwarding(e,t,s){this.streamForwarders.forEach(a=>{a.messageId===e&&(a.active=!1,a.statusType=null,a.forwarder.onEnd&&a.forwarder.onEnd({...s,statusType:t}))})}clear(){this.handlers.clear(),this.globalHandlers=[],this.streamForwarders.clear()}}const y=new b;function w(){return y}const k={current:{}},v=new Map;class j{constructor(e){this.messageId=e,this.fullText="",this.displayIndex=0,this.previousDisplayIndex=0,this.isTyping=!1,this.isComplete=!1,this.isCleanedUp=!1,this.intervalId=null,this.mode=k.current.mode||"char",this.speed=k.current.speed||50,this.batchSize=k.current.batchSize||5,this.listeners=new Set}setFullText(e,t){this.fullText+=e||"",!this.isTyping&&this.fullText.length>0&&this.startTyping(),t||!1!==this.isComplete||(this.isComplete=!0)}waitForAnimation(){return new Promise(e=>{if(this.displayIndex>=this.fullText.length)return void e();const t=setInterval(()=>{this.fullText.length>this.displayIndex||(clearInterval(t),e())},50)})}startTyping(){this.isTyping||(this.isTyping=!0,this.intervalId=setInterval(()=>{if(this.fullText.length>this.displayIndex){const e=this.getNextIncrement();this.previousDisplayIndex=this.displayIndex,this.displayIndex=Math.min(this.displayIndex+e,this.fullText.length),this.notifyListeners()}else this.isComplete&&(this.stopTyping(),this.onComplete&&(this.onComplete(),this.onComplete=null))},1e3/this.speed))}getNextIncrement(){switch(this.mode){case"char":default:return 1;case"word":{let e=this.displayIndex+1;for(;this.fullText.length>e;){const t=this.fullText[e];if(" "===t||"\n"===t||/[.,!?;:]/.test(t))return e-this.displayIndex+1;e++}return this.fullText.length-this.displayIndex}case"batch":return this.batchSize}}stopTyping(){this.isTyping=!1,this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null)}subscribe(e,t={}){const s={callback:e,newOnly:t.newOnly||!1};return this.listeners.add(s),()=>this.listeners.delete(s)}notifyListeners(){const e=this.fullText.slice(this.previousDisplayIndex,this.displayIndex),t=this.fullText.slice(0,this.displayIndex);this.listeners.forEach(s=>{s.callback(s.newOnly?e:t)})}cleanup(){this.isCleanedUp||(this.isCleanedUp=!0,this.stopTyping(),this.listeners.clear(),v.delete(this.messageId))}}function S(e){return v.get(e)}class M{constructor(){}async processChunk(e,t=null,s,a){const r=e.messageId,n=function(e){if(v.has(e))return v.get(e);const t=new j(e);return v.set(e,t),t}(e.messageId);if(n.setFullText(e.text||"",e.isLive),s){const s=e.from&&this.forwardingManager?.handlers[e.from],a=t&&this.forwardingManager?this.forwardingManager.getSession(t):null,n=s&&a&&e.from===a?.action;e.from&&!s&&this.forwardingManager&&(this._warnedActions||(this._warnedActions=new Set),this._warnedActions.has(e.from)||this._warnedActions.add(e.from));const i=s?this.forwardingManager.handlers[e.from]:null,o=e.from&&"replace"===(i?.mode||"replace");if(n){const s=this.forwardingManager.isAnimated(t),a=this.forwardingManager.getSubscriptionMode(t);if(s){const s=S(r);s.hasForwarder||(s.hasForwarder=!0,s.subscribe(s=>{this.forwardingManager.forwardChunk(t,s,e.isLive)},{newOnly:"delta"===a}),s.onComplete=()=>{this.forwardingManager.cleanupSession(t)})}else this.forwardingManager.forwardChunk(t,e.text||"",e.isLive)}if(o)return}this.messageHandlers.messageManager.hasMessage(r)?this.messageHandlers.messageManager.updateMessage(r,{text:t=>t+(e.text||"")},{silent:!0}):this.messageHandlers.messageManager.addMessage({messageId:r,sender:"ai",type:"chunk",text:e.text||"",isLive:!0,tokens:e.tokens}),await n.waitForAnimation()}async processHolding(e){}async processThinking(e){const t=e.messageId+"-thinking";this.messageHandlers.messageManager.hasMessage(t)?this.messageHandlers.messageManager.updateMessage(t,{text:t=>t+(e.text||"")}):this.messageHandlers.messageManager.addMessage({messageId:t,sender:"ai",type:"thinking",text:e.text||"",isLive:!0,timestamp:Date.now()})}async finishThinking(e){const t=e.messageId+"-thinking",s=this.messageHandlers.messageManager.getMessage(t);if(s){const e=Date.now();this.messageHandlers.messageManager.updateMessage(t,{isLive:!1,finalized:!0,duration:parseFloat(((e-(s.timestamp||e))/1e3).toFixed(1)),endTimestamp:e})}}async finishChunk(e){const t=e.messageId,s=this.messageHandlers.messageManager.getMessage(t);s&&this.messageHandlers.messageManager.updateMessage(t,{isLive:!1,finalized:!0,text:s.text||""})}async processStatus(e,t=null){const s=e.taskId||e.messageId;if(!s)return;if(this.messageHandlers.statusRegistry)try{await this.messageHandlers.statusRegistry.handle({...e,messageId:s,instanceId:t,status:{type:e.action||e.type,state:"started"===e.type?"started":"finished"===e.type?"finished":"in_progress",data:e.data}})}catch(r){}const a=this.messageHandlers.messageManager.hasMessage(s);"started"!==e.type&&"status"!==e.type?"finished"!==e.type?a?this.messageHandlers.messageManager.updateMessage(s,{statusType:e.type,data:e.data,isFinished:e.type.includes("end")||"finished"===e.type}):this.messageHandlers.messageManager.addMessage({messageId:s,sender:"ai",type:"status",action:e.action,statusType:e.type,data:e.data,isFinished:e.type.includes("end")||"finished"===e.type}):a&&this.messageHandlers.messageManager.updateMessage(s,{statusType:e.type,isFinished:!0}):a||this.messageHandlers.messageManager.addMessage({messageId:s,sender:"ai",type:"status",action:e.action,statusType:e.type,data:e.data,isFinished:!1})}}class N extends M{constructor(e,t,s,a=null){super(),this.messageHandlers=e,this.forwardingManager=t,this.queue=[],this.queueHistory=[],this.isProcessing=!1,this.lastMessageId=null,this.useForwarding=s,this.currentForwardingSession=null,this.onQueueComplete=null,this.instanceId=a}async process(){this.isProcessing=!0;const e=[...this.queue];this.queueHistory.push(...e),this.queue=[];for(let t=0;e.length>t;t++){const s=e[t],a=this.queueHistory.findIndex(e=>(e.messageId||e.taskId)==(s.messageId||s.taskId)),r=this.queueHistory[a-1];r&&!r.finalized&&(r.finalized=!0,await this.notifyPreviousItem(r)),await this.processItem(s)}this.isProcessing=!1,this.queue.length>0?this.process():(this.finalize(),this.onQueueComplete&&this.onQueueComplete())}filterData(e){return e}async addToQueue(e){const t=this.filterData(e);this.queue.push(t),this.isProcessing||this.process()}async notifyPreviousItem(e){"thinking"===e.type?await this.finishThinking(e):"chunk"===e.type&&await this.finishChunk(e)}async processItem(e){const{type:t}=e;e.messageId&&(this.lastMessageId=e.messageId);const s=e.action||e.data?.action,a=e.taskId||e.messageId;switch(this.forwardingManager&&this.useForwarding&&("started"===t&&s&&this.forwardingManager.startSession(a,s,this.instanceId)&&(this.currentForwardingSession=a),"finished"===t&&this.currentForwardingSession&&(this.forwardingManager.endSession(this.currentForwardingSession),this.currentForwardingSession=null),"end"===t&&this.currentForwardingSession&&(this.forwardingManager.endSession(this.currentForwardingSession),this.currentForwardingSession=null)),t){case"thinking":await this.processThinking(e);break;case"holding":await this.processHolding(e);break;case"chunk":await this.processChunk(e,this.currentForwardingSession,this.useForwarding,this.forwardingManager.newOnly);break;case"started":case"finished":case"status":case"status_start":case"status_end":case"status_error":case"error":case"action":await this.processStatus(e,this.instanceId);break;case"end":await this.finalize(e)}}async clear(){this.queue=[],this.isProcessing=!1,v.forEach(e=>{e.stopTyping(),e.cleanup()}),this.currentForwardingSession&&this.forwardingManager&&(this.forwardingManager.endSession(this.currentForwardingSession),this.currentForwardingSession=null),this.onQueueComplete&&this.onQueueComplete()}async endResponse(){this.queueHistory=[]}async finalize(e){this.lastMessageId&&await this.finishChunk({messageId:this.lastMessageId}),this.isProcessing=!1,this.queue=[]}}let I=null;class C{constructor(e={}){this.initialHandlers={...e},this.dynamicHandlers={},this.handlers={...e},this.activeSessions=new Map}register(e,t,s={}){const a=s.instanceId?`${e}:${s.instanceId}`:e;return this.dynamicHandlers[a]={handler:t,mode:s.mode||"dual",animated:!1!==s.animated,subscriptionMode:s.subscriptionMode||"delta",instanceId:s.instanceId},this._rebuildHandlers(),()=>{delete this.dynamicHandlers[a],this._rebuildHandlers()}}_rebuildHandlers(){this.handlers={...this.initialHandlers},Object.assign(this.handlers,this.dynamicHandlers)}startSession(e,t,s=null){const a=s?`${t}:${s}`:null,r=a&&this.handlers[a]||this.handlers[t];return!(!r||r.instanceId&&r.instanceId!==s||(this.activeSessions.get(e)||this.activeSessions.set(e,{action:t,handler:r.handler,mode:r.mode,animated:r.animated,subscriptionMode:r.subscriptionMode,instanceId:r.instanceId,lastText:"",fullText:"",streamEnded:!1}),0))}endSession(e){const t=this.activeSessions.get(e);t&&(t.streamEnded=!0,t.animated||this.cleanupSession(e))}cleanupSession(e){const t=this.activeSessions.get(e);if(t){if(t.handler&&t.fullText)try{t.handler(null,t.fullText,{action:t.action,event:"end",isLive:!1})}catch(s){}this.activeSessions.delete(e)}}isActive(e){return this.activeSessions.has(e)}getSession(e){return this.activeSessions.get(e)}forwardChunk(e,t,s=!0){const a=this.activeSessions.get(e);if(!a)return!1;const r=t||"";if(0===r.length&&s)return!0;let n,i;"full"===a.subscriptionMode?(i=r,n=r):(a.fullText+=r,n=r,i=a.fullText);try{a.handler(n,i,{action:a.action,isLive:!a.streamEnded&&s,event:"chunk",subscriptionMode:a.subscriptionMode})}catch(o){}return!0}shouldReplace(e){const t=this.activeSessions.get(e);return t&&"replace"===t.mode}isAnimated(e){const t=this.activeSessions.get(e);return t&&t.animated}getSubscriptionMode(e){const t=this.activeSessions.get(e);return t?t.subscriptionMode:"delta"}getActiveSessions(){return Array.from(this.activeSessions.keys())}clearAll(){this.activeSessions.clear()}}function T(e){return I?e&&Object.keys(e).length>0&&(I.initialHandlers={...e},I._rebuildHandlers()):I=new C(e),I}const F={'code[class*="language-"]':{color:"#d7d5d1",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",fontSize:"14px",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"white",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",background:"#1e1e1e",borderRadius:"15px"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#0e0c0a"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#0e0c0a"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#0e0c0a"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#0e0c0a"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#0e0c0a"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#0e0c0a"},'code[class*="language-"]::selection':{textShadow:"none",background:"#0e0c0a"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#0e0c0a"},':not(pre) > code[class*="language-"]':{color:"white",background:"#222222",padding:"0.1em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"#545053"},string:{color:"#838083"},number:{color:"#838083"},builtin:{color:"#838083"},char:{color:"#838083"},constant:{color:"#838083"},variable:{color:"#838083"},"class-name":{color:"#D7D5D1"},function:{color:"#D7D5D1"},tag:{color:"#838083"},"attr-name":{color:"#D7D5D1"},selector:{color:"#838083"},important:{fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}},E=e=>{return e&&(t=c.default.Children.toArray(e).map(e=>"string"==typeof e?e:e?.props?.children?e.props.children+"":"").join(""))&&/[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF]/.test(t)?"rtl":"ltr";var t},R=e.createContext(null),_=e.createContext({});function A(){return e.useContext(_)}const q={send:"/arrow up md-61-1696832363.png",attach:"/attach-1-1662364367.png",public:"/world-229-1658433759.png",arrowDown:"/chevron down-4-1696832126.png",close:"/close remove-802-1662363936.png",add:"/plus 4-12-1662493809.png",logs:"/website terminal-62-1658431404.png",terminal:"/terminal-184-1658431404.png",minimize:"/chevron down-4-1696832126.png",removeBold:"/delete-29-1661490994.png",info:"/info menu-42-1661490994.png",leftSidebar:"/grid interface-166-1658433281.png",file:"/document-180-1658431575.png",folder:"/folder file-32-1661323044.png",tick:"/check circle-3-1660219236.png",square:"/square-38-1666783764.png",search:"/search-123-1658435124.png",check:"/checkmark-7-1660219236.png",lock:"/lock-62-1691989601.png",discord:"/discord-141-1693375491.png",twitter:"/x.com-179-1693375584.png",refresh:"/refresh right-64-1696832204.png",back:"/arrow right md-49-1696832059.png",home:"/home-123-1658433759.png",forward:"/arrow left md-33-1696832059.png",newTab:"/new tab-123-1658433759.png",devTools:"/developer tools-123-1658433759.png",externalLink:"/External_link_HtLszLDBXqHilHK674zh2aKoSL7xUhyboAzP.png",deploy:"/space rocket-88-1687505465.png",projects:"/git fork-163-1658431404.png",settings:"/setting-100-1658432731.png",logout:"/Logout_q9Ri9V6YI29BipbKthCSXYDM0WoxMC05JTYO.png",notfound:"/search not found-92-1666688362.png",chatai:"/chat intelligence-6-1686046192.png",credit:"/bank card-91-1658234909.png",question:"/question mark circle-29-1662452248.png",blank:"/code-15-1658431404.png",react:"/react-native-29-1693375583.png",nextjs:"/next js circle-172-1693375539.png",vue:"/vue-160-1693375217.png",angular:"/angular-62-1693375491.png",node:"/npm-183-1693375539.png",python:"/python-122-1662819152.png",mobile:"/iphone-36-1658434492.png",laravel:"/laravel-108-1693375539.png",php:"/php-7-1693375216.png",url:"/link-68-1692683696.png",grid:"/gallery view-155-1658433281.png",list:"/bulleted list-15-1692683663.png",download:"/Download_61W5ztaZuYZoYEY7utQW7FU1y4lMiUO2rHjg.png",upload:"/upload-123-1658433759.png",starfilled:"/star-31-1660810259.png",edit:"/pen-304-1658238246.png",globe:"/earth-30-1687505545.png",minus:"/minus 4-9-1660810450.png",switch:"/changing-330-1658238246.png",history:"/counter clockwise undo-46-1658435834.png",golang:"/Go_Logo_Blue.svg.png",github:"/github-8-1693375538.png",pull:"/git pull-170-1658431404.png",sync:"/update left-39-1696832255.png",error:"/error triangle-16-1662499385.png",reload:"/flash refresh-94-1658434699.png",filter:"/filter-25-1662364403.png",sets:"/setting-41-1662364403.png",read:"/eye-20-1691989638.png",index:"/database-27-1658237565.png",debug:"/terminal-184-1658431404.png",brain:"/brain-41-1686045820.png",command:"/command-147-1658431404.png",pdf:"/document pdf-66-1662364367.png",websocket:"/power outlet-81-1689918655.png",ai:"/ai chip-118-1686045593.png",dashboard:"/dashboard 6-8-1662364403.png",store:"/store-30-1662820309.png",icons:"/ui8-139-1693375584.png",build:"/tools-58-1662364403.png",linkedin:"/linkedin-113-1693375539.png",support:"/headphone-24-1663753435.png",nofee:"/snow%20bag-318-1672139659.png",anytime:"/circle%20clock-39-1658435834.png",free:"/bird-106-1678249964.png",cloud:"/cloud%20connect-56-1658236831.png",code:"/code-12-1658431404.png",screenshot:"/scan%20image-226-1658434699.png",pagecontent:"/web%20page%20download-36-1658436291.png",improve:"/ai%20neural%20share-142-1686045754.png",roadmap:"/roadmap-159-1681196175.png"},H={figma:"/icons/project/Figma-logo.svg.png",githubraw:"/icons/project/github-mark-white.png"},z=(e,t,a="#000",r={},n=!1)=>n?s.jsx("img",{src:H[e]?.replace(/ /g,"%20"),alt:e,style:{width:t,height:t,objectFit:"contain",...r}}):s.jsx("div",{style:{maskImage:`url('https://cdn.oblien.com/static/png-icons/${q[e]?.replace(/ /g,"%20")||e?.replace(/ /g,"%20")}')`,maskSize:"contain",maskRepeat:"no-repeat",maskPosition:"center",WebkitMaskSize:"contain",WebkitMaskRepeat:"no-repeat",WebkitMaskPosition:"center",width:t,height:t,backgroundColor:a,...r}}),D=({error:e})=>{const{welcome:t}=A(),a=(()=>{if(!e)return null;let t="";return t="string"==typeof e?e:e.message?e.message:e.error?"string"==typeof e.error?e.error:e.error.message||"An error occurred":"An unexpected error occurred",t})();return s.jsx("div",{className:"react-chat-agent-start-chat flex flex-col items-center justify-center h-full",children:"object"!=typeof t||t?.title?s.jsxs("div",{className:"react-chat-agent-start-chat-content text-center mb-8 flex flex-col items-center justify-center gap-2",children:[e&&s.jsx("span",{className:"react-chat-agent-start-chat-error-icon",children:z("error",70,"currentColor",{marginBottom:"10px"})}),s.jsx("h2",{className:"react-chat-agent-start-chat-title text-2xl font-light text-theme-primary mb-4",children:e?"Something went wrong":t?.title}),s.jsx("p",{className:"react-chat-agent-start-chat-description text-theme-muted mb-6 max-w-md text-base leading-relaxed",children:e?a:t?.description}),e&&e.type&&s.jsx("p",{className:"react-chat-agent-start-chat-error-type text-xs text-theme-tertiary mt-2 opacity-50",children:e.type.replace("_"," ")})]}):t})},L=({message:e,allowEdit:t=!0})=>{const a=[];return t&&a.push({icon:"edit",text:"Edit",onClick:()=>{}}),e.snapshot&&a.push({icon:"refresh",text:"Restore checkpoint",onClick:()=>{}}),s.jsxs("div",{className:"react-chat-agent-user-message flex flex-col mb-2",children:[s.jsx("div",{className:"react-chat-agent-user-message-bubble-wrapper flex justify-end mb-2",children:s.jsx("div",{className:"react-chat-agent-user-message-bubble bg-secondary text-theme-primary px-4 py-2 rounded-[20px] max-w-xs md:max-w-md",style:{wordBreak:"break-word"},children:s.jsx("p",{className:"react-chat-agent-user-message-text text-[16px] leading-[22px] tracking-wide",children:e.text})})}),s.jsx("div",{className:"react-chat-agent-user-message-actions flex justify-end gap-4",children:a.map((e,t)=>s.jsxs("button",{className:`react-chat-agent-user-message-action react-chat-agent-user-message-action-${e.icon} flex items-center gap-1 opacity-25`,onClick:e.onClick,children:[s.jsx("span",{className:"react-chat-agent-user-message-action-icon",children:z(e.icon,16,"currentColor")}),s.jsx("span",{className:"react-chat-agent-user-message-action-label text-[12px] font-[300] text-theme-primary",children:e.text})]},t))})]})},O=({message:t})=>{const{markdownComponents:a}=A(),[n,i]=e.useState("");return e.useEffect(()=>{if(t.finalized||!t.isLive)return void i(t.text||"");const e=S(t.messageId);if(e)return e.subscribe(e=>{i(e)});i(t.text||"")},[t.messageId,t.finalized,t.isLive,t.text]),s.jsx("div",{className:"react-chat-agent-ai-response mb-4 mx-auto",children:s.jsx("div",{className:"react-chat-agent-ai-content text-theme-primary prose prose-invert max-w-none",style:{wordBreak:"break-word"},children:s.jsx(r.Streamdown,{components:a,children:n})})})},P=({message:a,removeMessage:r})=>{const n=e.useRef(null),i=e.useRef(null),o=e.useRef(a.finalized),[c,d]=e.useState(!a.finalized),h=a.text||"",u=a.isLive||!a.finalized,g=a.finalized,m=a.duration||0;return e.useEffect(()=>{n.current&&c&&u&&(n.current.scrollTop=n.current.scrollHeight)},[h,c,u]),e.useEffect(()=>{g&&!o.current&&(setTimeout(()=>{d(!1)},800),a.autoCleanup&&setTimeout(()=>{r?.(a.messageId)},1500))},[g,a.autoCleanup,a.messageId,r]),s.jsxs("div",{className:"react-chat-agent-thinking-message mb-4 mx-auto opacity-50",children:[g?s.jsxs("button",{onClick:()=>{d(!c)},className:"react-chat-agent-thinking-toggle react-chat-agent-thinking-toggle-finished text-theme-tertiary text-sm hover:text-theme-secondary transition-colors mb-2 flex items-center gap-2",children:[s.jsx("span",{className:"react-chat-agent-thinking-toggle-icon",children:z(c?"brain-10-1663078315.png":"brain-11-1663755045.png",20,"currentColor")}),s.jsxs("span",{className:"react-chat-agent-thinking-toggle-text",children:["Thought for ",m," second",1!==m?"s":""]})]}):s.jsxs("div",{className:"react-chat-agent-thinking-header text-theme-tertiary text-sm hover:text-theme-secondary transition-colors mb-2 flex items-center gap-2",children:[s.jsx("span",{className:"react-chat-agent-thinking-icon",children:z("brain-11-1663755045.png",20,"currentColor")}),s.jsx("span",{className:"react-chat-agent-thinking-label",children:"Thinking..."})]}),c&&h&&s.jsx("div",{ref:n,className:"react-chat-agent-thinking-content-scroll max-h-[150px] overflow-y-auto scrollbar-thin scrollbar-track-transparent",style:{scrollBehavior:"smooth",WebkitMaskImage:"linear-gradient(to top, transparent 0%, black 60%, transparent 98%)",maskImage:"linear-gradient(to top, transparent 0%, black 60%, transparent 98%)"},children:s.jsx("div",{ref:i,className:"react-chat-agent-thinking-content text-theme-primary prose prose-invert max-w-none whitespace-pre-wrap text-sm pt-10",style:{wordBreak:"break-word",opacity:u?.8:1,transition:"opacity 0.15s ease"},children:s.jsx(l.default,{components:{code({node:e,inline:a,className:r,children:n,...i}){const o=/language-(\w+)/.exec(r||""),c=(n+"").replace(/\n$/,""),l=!a&&c.includes("\n");return a||!l?s.jsx("code",{className:"react-chat-agent-thinking-code-inline px-1 py-0.5 bg-secondary rounded text-xs font-mono whitespace-pre-wrap",...i,children:n}):s.jsx("div",{className:"react-chat-agent-thinking-code-block rounded-[15px] overflow-hidden my-3",children:s.jsx(t.Prism,{language:o?.[1]||"javascript",style:F,children:c})})},p:({children:e})=>s.jsx("p",{className:"react-chat-agent-thinking-paragraph mb-2 leading-5 text-sm",children:e}),ul:({children:e})=>s.jsx("ul",{className:"react-chat-agent-thinking-list react-chat-agent-thinking-list-unordered list-disc pl-5 mb-3 grid text-sm",children:e}),ol:({children:e})=>s.jsx("ol",{className:"react-chat-agent-thinking-list react-chat-agent-thinking-list-ordered list-decimal pl-5 mb-3 grid text-sm",children:e}),li:({children:e})=>s.jsx("li",{className:"react-chat-agent-thinking-list-item mb-1 text-sm",children:e}),h1:({children:e})=>s.jsx("h1",{className:"react-chat-agent-thinking-heading react-chat-agent-thinking-heading-1 text-lg font-semibold mb-2 mt-3",children:e}),h2:({children:e})=>s.jsx("h2",{className:"react-chat-agent-thinking-heading react-chat-agent-thinking-heading-2 text-base font-semibold mb-2 mt-3",children:e}),h3:({children:e})=>s.jsx("h3",{className:"react-chat-agent-thinking-heading react-chat-agent-thinking-heading-3 text-sm font-semibold mb-1 mt-2",children:e}),blockquote:({children:e})=>s.jsx("blockquote",{className:"react-chat-agent-thinking-blockquote border-l-4 border-gray-600 pl-3 italic my-3 text-theme-quaternary text-sm",children:e})},children:h})})})]})},$=({text:e,style:t,fontSize:a="1em",paddingRight:r="140px",backgroundSize:n="125px",isDark:i=!1})=>{let o=1;"string"==typeof a?o=parseFloat(a)||3:"number"==typeof a&&(o=a);let c=n;"125px"===n&&"3em"!==a&&(c=o/3*125+"px");const l={fontSize:a,paddingRight:r,WebkitBackgroundSize:c+" 100%",MozBackgroundSize:c+" 100%",backgroundSize:c+" 100%",...t};return s.jsx("div",{className:"react-chat-agent-shimmer-text shimmer "+(i?"dark":"light"),style:l,children:e})},U=({message:t,title:a,isProcessing:r,isFinished:n,icon:i,iconComponent:o,isFlat:c,onClick:l,isDark:d=!1,unmountOnExit:h,action:u,data:g,className:m,style:p})=>{const f=u||t?.action,x=g||t?.data,b=void 0!==n?n:t?.isFinished,y=void 0!==r?r:!b,w=a||t?.title,k=i||t?.icon,v=o||t?.iconComponent,j=void 0!==c?c:t?.isFlat,S=void 0!==h?h:t?.unmountOnExit,M=l,N=e.useMemo(()=>w||(f?(({data:e,action:t,isFinished:s})=>{if(!t||"string"!=typeof t)return"Processing...";try{const a=t.replace(/([A-Z])/g," $1").replace(/_/g," ").trim().split(/\s+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ");return s?a:`${a}${e?.tool?" "+e?.tool:""}...`}catch(a){return t}})({data:x,action:f,isFinished:b}):"Processing..."),[w,f,b,x]);return s.jsx("div",j?{className:"mb-[-2px] mx-auto "+m,style:{cursor:M?"pointer":"default",...p},onClick:M,children:s.jsxs("div",{className:`flex items-center gap-3 px-0 rounded-[12px] text-${d?"white":"black"} relative overflow-auto`,children:[S?s.jsx("div",{className:`animate-spin h-[16px] w-[16px] mr-[4px] absolute border-[1.5px] border-${d?"white":"black"} rounded-full border-t-transparent opacity-50`}):v?v():z(k||"check circle-3-1660219236.png",20,d?"rgba(255,255,255,0.25)":"rgba(0,0,0,0.25)",{position:"absolute"}),y?s.jsx($,{isDark:d,text:N,style:{fontSize:"14px",marginLeft:"30px"}}):s.jsx("span",{className:`text-[14px] text-${d?"white":"black"}/20 ml-[30px] ${v?"!ml-0":""}`,children:N})]})}:{className:"mb-[10px] mx-auto "+m,style:{cursor:M?"pointer":"default",...p},onClick:M,children:s.jsxs("div",{className:`flex items-center p-3 rounded-[12px] text-${d?"white":"black"} relative overflow-hidden`,style:{backgroundColor:d?"rgba(255,255,255,0.02)":"rgba(0,0,0,0.02)"},children:[y?s.jsx("div",{className:`animate-spin h-[16px] w-[16px] mr-[4px] absolute border-[1.5px] border-${d?"white":"black"} rounded-full border-t-transparent opacity-50`}):v?v():z(k||"check circle-3-1660219236.png",20,d?"rgba(255,255,255,0.8)":"rgba(0,0,0,0.8)",{position:"absolute"}),s.jsx("div",{className:"flex-1",children:y?s.jsx($,{isDark:d,text:N,style:{marginLeft:"28px",marginTop:"-2px",color:d?"rgba(255,255,255,0.2)":"rgba(0,0,0,0.2)"}}):s.jsx("span",{className:`text-[14px] text-${d?"white":"black"}/50 ml-[30px]`,children:N})})]})})};var B=e.memo(({item:e,removeMessage:t,allowEditMessage:a,animationConfig:r})=>{const{statusComponents:n}=A();if("user"===e.sender)return s.jsx("div",{className:"react-chat-agent-message-item react-chat-agent-message-user",children:s.jsx(L,{message:e,allowEdit:a})});if("status"===e.type&&e.action){const t=n?.[e.action];return s.jsx("div",{className:"react-chat-agent-message-item react-chat-agent-message-status",children:s.jsx(t||U,{message:e})})}return s.jsx("div","thinking"===e.type?{className:"react-chat-agent-message-item react-chat-agent-message-thinking",children:s.jsx(P,{message:e,removeMessage:t})}:{className:"react-chat-agent-message-item react-chat-agent-message-ai",children:s.jsx(O,{message:e,animationConfig:r})})},(e,t)=>e.item.uniqueKey===t.item.uniqueKey);const W=({type:e})=>{const t=["w-1.5 h-1.5","w-2.5 h-2.5","w-1.5 h-1.5"],a="text"===e?["L","O","A","D","I","N","G"]:Array.from({length:3}).fill(""),r=.6+.1*(a.length-1);return s.jsx("div",{className:"react-chat-agent-loading-response flex",children:s.jsx("div",{className:"react-chat-agent-loading-content flex justify-center items-center "+("text"===e?"text-7xl font-extrabold font-[Montserrat]":"gap-1.5"),children:a.map((a,n)=>s.jsx(i.motion.span,{className:`react-chat-agent-loading-item react-chat-agent-loading-item-${e} inline-block ${"text"===e?"mx-[-0.05em]":t[n]+" rounded-full bg-inverse"}`,animate:{scale:[.75,1.5,.75],opacity:[.75,1,.75],filter:["blur(4px)","blur(0px)","blur(4px)"]},transition:{repeat:1/0,duration:.6,ease:"easeInOut",repeatDelay:r-.6,delay:.1*n},children:"text"===e?a:""},n))})})},J=()=>s.jsxs("div",{className:"react-chat-agent-loading-mock space-y-8 px-5 pt-20 pb-40 w-full max-w-[800px] mx-auto",children:[s.jsxs("div",{className:"react-chat-agent-loading-mock-welcome flex items-start gap-4 mb-12",children:[s.jsx("div",{className:"react-chat-agent-loading-mock-avatar react-chat-agent-loading-mock-avatar-welcome w-10 h-10 rounded-full shimmer-skeleton"}),s.jsxs("div",{className:"react-chat-agent-loading-mock-content flex-1 space-y-3",children:[s.jsx("div",{className:"react-chat-agent-loading-mock-line react-chat-agent-loading-mock-line-1 h-4 rounded-full shimmer-skeleton w-2/3"}),s.jsx("div",{className:"react-chat-agent-loading-mock-line react-chat-agent-loading-mock-line-2 h-4 rounded-full shimmer-skeleton w-1/2"})]})]}),Array.from({length:2}).map((e,t)=>s.jsxs("div",{className:"react-chat-agent-loading-mock-message-group space-y-6",children:[s.jsxs("div",{className:"react-chat-agent-loading-mock-message react-chat-agent-loading-mock-message-user flex items-start gap-4 justify-end",children:[s.jsx("div",{className:"react-chat-agent-loading-mock-message-content max-w-[70%] space-y-2",children:s.jsx("div",{className:"react-chat-agent-loading-mock-line h-3 rounded-full shimmer-skeleton w-full"})}),s.jsx("div",{className:"react-chat-agent-loading-mock-avatar react-chat-agent-loading-mock-avatar-user w-8 h-8 rounded-full shimmer-skeleton"})]}),s.jsxs("div",{className:"react-chat-agent-loading-mock-message react-chat-agent-loading-mock-message-ai flex items-start gap-4",children:[s.jsx("div",{className:"react-chat-agent-loading-mock-avatar react-chat-agent-loading-mock-avatar-ai w-8 h-8 rounded-full shimmer-skeleton"}),s.jsxs("div",{className:"react-chat-agent-loading-mock-message-content flex-1 space-y-3",children:[s.jsx("div",{className:"react-chat-agent-loading-mock-line react-chat-agent-loading-mock-line-1 h-3 rounded-full shimmer-skeleton w-4/5"}),s.jsx("div",{className:"react-chat-agent-loading-mock-line react-chat-agent-loading-mock-line-2 h-3 rounded-full shimmer-skeleton w-3/4"})]})]})]},t))]}),K=e.forwardRef(({isDark:t=!1,className:r="",allowEditMessage:n=!1,showWelcome:i=!0,showLoadMore:o=!0,showLoadingIndicator:c=!0,welcomeComponent:l,loadingComponent:d,containerStyle:h={},useGradientMask:u=!0,gradientMaskStyle:g="linear-gradient(to bottom, transparent 6.5%, black 18%)"},m)=>{const[p,f]=e.useState(!1),x=e.useRef(!1),{sendMsg:b,messages:y,messageManager:w,isLoading:k,isStreaming:v,isPanelOpen:j,error:S,isInitialLoading:M,isResponseStarted:N,abort:I,loadMoreMessages:C,isLoadingMore:T,hasMoreMessages:F,enableHistory:E,animationConfig:R,loadingComponent:_}=A(),q=d||_,H=e.useRef(null),L=e.useRef(!0),O=a.useVirtualizer({count:y?.length||0,getScrollElement:()=>H.current,estimateSize:()=>150,overscan:10,measureElement:"undefined"!=typeof window&&-1===navigator.userAgent.indexOf("Firefox")?e=>e?.getBoundingClientRect().height:void 0}),P=e.useCallback(()=>{const e=H.current;e&&(e.scrollTop=e.scrollHeight)},[]),$=e.useCallback(()=>{const e=H.current;return!!e&&50>e.scrollHeight-e.scrollTop-e.clientHeight},[]);e.useEffect(()=>{L.current&&y?.length>0&&P()},[y,P]),e.useEffect(()=>{if(!v)return;const e=setInterval(()=>{L.current&&P()},100);return()=>clearInterval(e)},[v,P]);const U=e.useCallback(()=>{const e=H.current;if(!e)return;const t=e.scrollTop>20;t!==x.current&&(x.current=t,f(t)),L.current=$()},[$]),K=e.useCallback((e=>{let t=0;return function(...s){const a=Date.now();100>a-t||(t=a,e(...s))}})(U),[U]);e.useEffect(()=>{const e=H.current;if(e)return e.addEventListener("scroll",K),()=>e.removeEventListener("scroll",K)},[K]);const G=e.useCallback(e=>{w&&w.removeMessage&&w.removeMessage(e)},[w]),Q=e.useCallback(async e=>{L.current=!0,await b(e),setTimeout(P,100)},[b,P]);e.useImperativeHandle(m,()=>({scrollToBottom:P,isAtBottom:$,scrollContainer:H.current,virtualizer:O,sendMessage:Q,abort:I,isStreaming:v,isLoading:k,messages:y,messageManager:w}),[P,$,O,Q,I,v,k,y,w]);const Y=O.getVirtualItems();return s.jsx("div",{ref:H,className:"react-chat-agent react-chat-core overflow-y-auto scrollbar-hide "+r,"data-theme":t?"dark":"light",style:{WebkitMaskImage:u&&p?g:"none",...h},children:M?s.jsx(q||J,{}):y&&0!==y.length?s.jsxs("div",{className:"react-chat-core-messages",children:[o&&E&&F&&y.length>0&&!S&&!M&&s.jsx("div",{className:"react-chat-core-load-more flex justify-center py-4",children:s.jsx("button",{onClick:C,disabled:T,className:"react-chat-core-load-more-button flex items-center gap-2 text-theme-tertiary hover:text-theme-primary transition-colors disabled:opacity-50 disabled:cursor-not-allowed opacity-50",children:s.jsxs(s.Fragment,T?{children:[s.jsx("div",{className:"react-chat-core-load-more-spinner w-4 h-4 border-2 border-theme-primary border-t-theme-tertiary rounded-full animate-spin"}),s.jsx("span",{className:"react-chat-core-load-more-text text-sm",children:"Loading..."})]}:{children:[z("refresh",18,"currentColor"),s.jsx("span",{className:"react-chat-core-load-more-text text-sm",children:"Load more messages"})]})})}),s.jsx("div",{className:"react-chat-core-virtual-container",style:{height:O.getTotalSize()+"px",width:"100%",position:"relative"},children:Y.map(e=>{const t=y[e.index];return t?s.jsx("div",{"data-index":e.index,ref:O.measureElement,style:{position:"absolute",top:0,left:0,width:"100%",transform:`translateY(${e.start}px)`},children:s.jsx(B,{item:t,removeMessage:G,allowEditMessage:n,animationConfig:R})},t.uniqueKey||t.messageId||e.key):null})}),c&&k&&!N&&s.jsx(W,{})]}):i&&(l?s.jsx(l,{error:S}):s.jsx(D,{error:S,miniMode:j}))})});K.displayName="ChatCore";var G=e.memo(K);const Q=({todos:e=[]})=>e&&0!==e?.length?s.jsx("div",{className:"react-chat-agent-queue-manager flex w-[calc(100%-50px)] ml-[5px] items-end gap-2 top-0 z-9 absolute h-0",children:s.jsxs("div",{className:"react-chat-agent-queue-manager-wrapper flex items-center w-full relative bottom-0",children:[s.jsx("div",{className:"react-chat-agent-queue-manager-backdrop backdrop-blur-[20px] w-full h-full z-0 absolute bg-theme-overlay border-b-0 rounded-t-[15px] "}),s.jsx("div",{className:"react-chat-agent-queue-manager-content flex items-center gap-2 w-full p-1 py-[5px] z-99"})]})}):null,Y=({children:e,content:t,visible:a})=>a?s.jsxs("div",{className:"react-chat-agent-tooltip-wrapper relative",children:[e,s.jsxs("div",{className:"react-chat-agent-tooltip absolute bottom-full right-0 mb-2 w-64 p-3 bg-theme-surface rounded-lg shadow-lg z-50 backdrop-blur-sm",children:[s.jsx("div",{className:"react-chat-agent-tooltip-content text-theme-secondary text-sm space-y-2",children:t}),s.jsx("div",{className:"react-chat-agent-tooltip-arrow absolute top-full right-4 w-2 h-2 bg-theme-surface transform rotate-45 translate-y-[-4px]"})]})]}):e,X=()=>{const[t,a]=e.useState(!1),{sessionMetrics:r,usedTokens:n,contextLimit:i}=A(),o=(100*(n/i||0)).toFixed(2),c=e=>e?1e6>e?1e3>e?""+e:(e/1e3).toFixed(1)+"K":(e/1e6).toFixed(1)+"M":"0",l=s.jsxs("div",{className:"space-y-2",children:[s.jsx("div",{className:"font-medium text-theme-primary border-b border-theme-tertiary pb-1",children:"Session Info"}),s.jsxs("div",{className:"space-y-1 text-xs",children:[s.jsxs("div",{className:"flex justify-between",children:[s.jsx("span",{className:"text-theme-quaternary",children:"Context size:"}),s.jsxs("span",{children:[c(r?.contextUsed)," / ",c(r?.contextLimit)]})]}),s.jsxs("div",{className:"flex justify-between",children:[s.jsx("span",{className:"text-theme-quaternary",children:"Session Tokens:"}),s.jsx("span",{children:c(r?.tokensUsed)})]}),s.jsxs("div",{className:"flex justify-between",children:[s.jsx("span",{className:"text-theme-quaternary",children:"All time tokens:"}),s.jsx("span",{children:c(r?.allTimeTokens)})]}),s.jsxs("div",{className:"flex justify-between",children:[s.jsx("span",{className:"text-theme-quaternary",children:"Requests:"}),s.jsx("span",{children:c(r?.requests)})]})]})]});return s.jsx(Y,{content:l,visible:t,children:s.jsxs("div",{className:"react-chat-agent-progress-bar flex items-center gap-2 cursor-pointer",onMouseEnter:()=>a(!0),onMouseLeave:()=>a(!1),children:[s.jsxs("span",{className:"react-chat-agent-progress-percentage text-theme-ghost font-light text-[12px] leading-[18px]",children:[o,"%"]}),s.jsxs("div",{className:"react-chat-agent-progress-circle-wrapper relative w-4 h-4 flex items-center justify-center",children:[s.jsx("div",{className:"react-chat-agent-progress-circle-bg absolute inset-0 rounded-full bg-theme-muted"}),s.jsx("div",{className:"react-chat-agent-progress-circle-fill absolute inset-0 rounded-full",style:{background:`conic-gradient(var(--rca-text-faint) ${o}%, transparent 0)`}}),s.jsx("div",{className:"react-chat-agent-progress-circle-inner absolute inset-0.5 rounded-full bg-secondary"})]})]})})},V=({attachedFiles:e=[],removeFile:t})=>{const{currentSelectedFile:a,setIsHoldEnabled:r,setCurrentSelectedFile:n,manuallyAddedFiles:i=[],setManuallyAddedFiles:o=()=>{}}=A(),c=[...a?[a]:[],...i,...e];return s.jsxs("div",{className:"react-chat-agent-chat-bar flex items-center w-full mb-2 justify-between",children:[s.jsxs("div",{className:"react-chat-agent-chat-bar-left flex items-center",children:[c.length>0&&s.jsx(ee,{files:c,handleRemoveFile:e=>{"object"==typeof e&&e.id?t&&t(e.id):e===a?(n(null),r(!1)):o(t=>t.filter(t=>t!==e))}}),s.jsxs("button",{className:"react-chat-agent-context-button text-theme-primary hover:opacity-100 opacity-25 mr-2 flex items-center gap-1 whitespace-nowrap right-0 z-9 text-[12px] leading-relaxed ",children:[s.jsx("span",{className:"react-chat-agent-context-button-icon",children:z("add",20,"currentColor",{marginLeft:"-5px"})}),0===c.length&&s.jsx("span",{className:"react-chat-agent-context-button-label",children:"Context"})]})]}),s.jsx("div",{className:"react-chat-agent-chat-bar-right",children:s.jsx(X,{})})]})},Z=({file:t,handleRemoveFile:a})=>{const[r,n]=e.useState(!1),i="object"==typeof t&&t.id,o=i?t.name:t.split("/").pop(),c=i?t.id:t;return s.jsxs("div",{className:"react-chat-agent-file-item flex items-center gap-2 px-2 py-[2px] bg-theme-subtle rounded-full cursor-pointer relative border border-theme-subtle",onMouseEnter:()=>n(!0),onMouseLeave:()=>n(!1),children:[r?s.jsx("button",{className:"react-chat-agent-file-item-remove w-[16px] opacity-50 hover:opacity-100 -ml-[2px] -mr-[2px] h-[16px]",onClick:e=>{e.stopPropagation(),a(t)},children:s.jsx("span",{className:"react-chat-agent-file-item-remove-icon",children:z("close",16,"currentColor")})}):s.jsx("div",{className:"react-chat-agent-file-item-icon-wrapper",children:i&&t.preview?s.jsx("img",{src:t.preview,alt:o,className:"react-chat-agent-file-item-preview w-3 h-4 object-cover rounded",style:{marginRight:0,width:"12px",height:"16px"}}):s.jsx(FileIcon,{fileName:o,style:{marginRight:0,width:"12px",height:"16px"}})}),s.jsx("div",{className:"react-chat-agent-file-item-name text-theme-quaternary hover:text-theme-primary text-[12px] leading-relaxed whitespace-nowrap truncate max-w-[100px]",children:o})]},c)},ee=({files:e,handleRemoveFile:t})=>s.jsx("div",{className:"react-chat-agent-file-items flex items-center gap-2 mr-2",children:e.map(e=>s.jsx(Z,{file:e,handleRemoveFile:t},"object"==typeof e&&e.id?e.id:e))}),te=()=>{const[t,a]=e.useState(0),r=e.useRef(),n=e.useRef(0),i=e.useRef(0);return e.useEffect(()=>{i.current=performance.now(),n.current=t;const e=s=>{const o=s-i.current;i.current=s,n.current+=o/1e3*360,360>n.current||(n.current-=360);const c=Math.round(n.current);5>Math.abs(c-t)||a(c),r.current=requestAnimationFrame(e)};return r.current=requestAnimationFrame(e),()=>{r.current&&(cancelAnimationFrame(r.current),r.current=null)}},[]),s.jsx("div",{className:"react-chat-agent-loader-animation w-full h-full z-1 absolute rounded-[15px]",children:s.jsx("div",{className:"glowing pointer-events-none absolute inset-0 rounded-[inherit] opacity-100 transition-opacity safari:!hidden style_glowingEffect__yGXeX",style:{"--blur":"1px","--spread":"30","--active":"1","--start":t,display:"flex"},children:s.jsx("div",{className:"style_glow__i4Qpo"})})})},se=()=>{const{streamError:t,clearStreamError:a,retryLastMessage:r,sendRequestCallback:n,triggerLoadingStates:i}=A(),[o]=e.useState(t?.choices||[{id:"retry",label:"Retry"},{id:"cancel",label:"Cancel"}]);return t?s.jsx("div",{className:"react-chat-agent-stream-error w-full mb-3",children:s.jsxs("div",{className:"react-chat-agent-error-content flex w-full justify-between items-center gap-3 px-3 py-2 bg-theme-faint rounded-lg border-l-2 border-[#ef4444]",children:[s.jsx("div",{className:"react-chat-agent-error-message-wrapper",children:s.jsx("div",{className:"react-chat-agent-error-message text-[12px] text-theme-primary font-medium",children:t.message||"An error occurred during streaming"})}),s.jsx("div",{className:"react-chat-agent-error-actions flex gap-2 items-center",children:o&&o.length>0&&o.map(e=>s.jsx("button",{onClick:()=>(async e=>{"retry"===e?"connection_error"===t.errorType?await r():(i(),n({type:"stream_error",callback:"retry",requestId:t.requestId})):"cancel"===e&&(t.requestId&&n({type:"stream_error",callback:"cancel",requestId:t.requestId}),a())})(e.id),className:`react-chat-agent-error-action react-chat-agent-error-action-${e.id} text-[11px] font-medium px-3 py-1 rounded-md transition-all duration-200\n ${"retry"===e.id?"text-theme-primary hover:text-theme-secondary underline underline-offset-2":"cancel"===e.id?"text-theme-subtle hover:text-theme-tertiary":"text-theme-tertiary hover:text-theme-primary"}\n `,children:e.label},e.id))})]})}):null},ae=({onSendMessage:t,miniMode:a=!1,isStreaming:r,abort:n,todos:i})=>{const[o,c]=e.useState(""),l=e.useRef(null),{attachedFiles:d,fileInputRef:h,onFileSelect:u,onPaste:g,removeFile:m,clearFiles:p}=function(){const[t,s]=e.useState([]),a=e.useRef(null),r=e.useCallback(async e=>{const t=await e.arrayBuffer(),s=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(s)).map(e=>e.toString(16).padStart(2,"0")).join("")},[]),n=e.useCallback(async e=>{const a=[];for(const s of e){if(t.some(e=>e.name===s.name&&e.size===s.size&&e.type===s.type))continue;let e=!1;if(5242880>s.size)try{const n=await r(s);t.some(e=>e.hash===n)||(a.push({file:s,id:Date.now()+Math.random(),name:s.name,size:s.size,type:s.type,hash:n,preview:s.type.startsWith("image/")?URL.createObjectURL(s):null}),e=!0)}catch(n){}e||a.push({file:s,id:Date.now()+Math.random(),name:s.name,size:s.size,type:s.type,preview:s.type.startsWith("image/")?URL.createObjectURL(s):null})}a.length>0&&s(e=>[...e,...a])},[t,r]),i=e.useCallback(e=>{const t=Array.from(e.target.files||[]);t.length>0&&n(t),e.target.value=""},[n]),o=e.useCallback(e=>{const t=Array.from(e.clipboardData?.items||[]).filter(e=>"file"===e.kind).map(e=>e.getAsFile()).filter(Boolean);t.length>0&&(e.preventDefault(),n(t))},[n]),c=e.useCallback(e=>{s(t=>{const s=t.filter(t=>t.id!==e),a=t.find(t=>t.id===e);return a?.preview&&URL.revokeObjectURL(a.preview),s})},[]),l=e.useCallback(()=>{s(e=>(e.forEach(e=>{e.preview&&URL.revokeObjectURL(e.preview)}),[]))},[]);return{attachedFiles:t,fileInputRef:a,onFileSelect:i,onPaste:o,removeFile:c,clearFiles:l}}();e.useEffect(()=>{l.current&&(l.current.style.height="auto",l.current.style.height=Math.min(l.current.scrollHeight,150)+"px")},[o]);const f=e=>{e.preventDefault(),(o.trim()||d.length>0)&&(t({message:o,attachedFiles:d}),c(""),p(),l.current&&(l.current.style.height="auto"))};return s.jsx("div",{className:"react-chat-agent-input absolute mx-auto bottom-0 w-full p-[15px] right-0 left-0 max-w-[600px] z-2",children:s.jsxs("div",{className:"react-chat-agent-input-wrapper mx-auto min-h-[120px] relative",style:a?{minHeight:"110px"}:{},children:[r&&s.jsx(te,{}),s.jsx("div",{className:"react-chat-agent-input-backdrop backdrop-blur-[20px] w-full h-full z-0 absolute bg-theme-overlay rounded-[15px]"}),s.jsxs("div",{className:"react-chat-agent-input-content pt-[15px] px-[20px] mx-auto min-h-[120px] relative z-99",children:[s.jsx(Q,{todos:i}),s.jsx(se,{}),s.jsx(V,{attachedFiles:d,removeFile:m}),s.jsx("div",{className:"react-chat-agent-input-textarea-wrapper relative pb-[50px]",children:s.jsx("textarea",{autoSave:"off",autoFocus:!1,autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:"false","data-form-type":"other",ref:l,value:o,onChange:e=>c(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),f(e))},onPaste:g,placeholder:"Type a message...",className:"react-chat-agent-textarea w-full text-[14px] text-theme-primary pr-12 min-h-[40px] max-h-[150px] resize-none outline-none bg-transparent",rows:1})}),s.jsxs("div",{className:"react-chat-agent-input-actions flex items-center justify-between mt-auto bottom-[15px] absolute w-[calc(100%-40px)]",children:[s.jsxs("div",{className:"react-chat-agent-input-actions-left flex items-center",children:[s.jsx("input",{ref:h,type:"file",multiple:!0,accept:"image/*,video/*,audio/*,.pdf,.doc,.docx,.txt,.md,.json,.js,.ts,.jsx,.tsx,.py,.html,.css,.xml,.csv",onChange:u,className:"react-chat-agent-file-input hidden"}),s.jsxs("button",{type:"button",onClick:()=>h.current?.click(),className:"react-chat-agent-attach-button flex justify-center items-center cursor-pointer text-theme-primary rounded-full transition-colors hover:opacity-80 disabled:opacity-50 disabled:cursor-not-allowed",children:[z("attach",18,"currentColor"),s.jsx("span",{className:"react-chat-agent-attach-label text-[14px] ml-2 font-[300]",children:"Attach"})]})]}),s.jsxs("div",{className:"react-chat-agent-input-actions-right flex items-center",children:[s.jsxs("button",{type:"button",className:"react-chat-agent-agent-button flex justify-center p-1 px-2 mr-2 items-center cursor-pointer text-theme-primary rounded-full transition-colors disabled:opacity-50 disabled:cursor-not-allowed",children:[z("brain",18,"currentColor"),s.jsx("span",{className:"react-chat-agent-agent-label text-[12px] mx-2 text-theme-quaternary font-[300] -mt-[2px]",children:"Agent"}),z("arrowDown",16,"currentColor",{transform:"rotate(180deg)"})]}),s.jsx("button",{type:"button",onClick:e=>{r?n():f(e)},className:"react-chat-agent-send-button w-[30px] h-[30px] flex justify-center items-center cursor-pointer bg-inverse text-inverse rounded-full transition-colors disabled:opacity-50 disabled:cursor-not-allowed",disabled:!o.trim()&&!r,children:z(r?"square":"send",r?15:20,"currentColor")})]})]})]})]})})};var re=e.memo(ae);const ne=({historyOpen:t,setHistoryOpen:a,isDark:r=!1,onCreateSession:n})=>{const[i,o]=e.useState(!1),{headerComponent:c}=A();return s.jsxs("div",{className:"react-chat-agent-header flex justify-between items-center py-2 px-5 absolute top-0 left-0 right-0 z-10",children:[s.jsxs("div",{className:"react-chat-agent-header-left flex items-center gap-4 opacity-50",children:[s.jsx("button",{className:"react-chat-agent-header-new-chat flex items-center cursor-pointer hover:opacity-80",style:{opacity:i?.5:1,cursor:i?"progress":"pointer"},disabled:i,onClick:async({replace:e=!1}={})=>{if(n)try{o(!0),await n({replace:e})}catch(t){}finally{o(!1)}},children:z("add",25,r?"#fff":"#000")}),s.jsx("div",{className:"react-chat-agent-header-history flex items-center cursor-pointer hover:opacity-80",onClick:t?()=>a(!1):()=>a(!0),children:z(t?"close":"history",18,r?"#fff":"#000")})]}),c&&c(),s.jsx("div",{className:"react-chat-agent-header-right w-[80px]"})]})};var ie=e.memo(ne);const oe=({isDark:t=!1,allowEditMessage:a=!1,useWebSocket:r=!1,children:n,onCreateSession:i,className:o="h-full w-full"})=>{const[c,l]=e.useState(!1),d=e.useRef(null),{sendMsg:h,isStreaming:u,abort:g}=A(),m=e.useCallback(async e=>{await h(e),setTimeout(()=>{d.current?.scrollToBottom()},100)},[h]);return s.jsxs("div",{className:"react-chat-agent-panel flex flex-col h-full relative chat-panel "+o,"data-theme":t?"dark":"light",children:[s.jsx(ie,{historyOpen:c,setHistoryOpen:l,useWebSocket:r,isDark:t,onCreateSession:i}),s.jsxs("div",{className:"relative flex-grow w-full max-w-[600px] mx-auto h-full min-w-[300px]",children:[s.jsx(G,{ref:d,isDark:t,allowEditMessage:a,className:"react-chat-agent-chat-container absolute chat-container h-full flex-grow px-5 pt-20 pb-50 mb-[20px] w-full mx-auto"}),s.jsx(re,{onSendMessage:m,isStreaming:u,abort:g})]}),n]})};var ce=e.memo(oe);exports.ChatApi=d,exports.ChatCore=G,exports.ChatHeader=ie,exports.ChatInput=re,exports.ChatInstanceContext=R,exports.ChatLoadingMock=J,exports.ChatPanel=ce,exports.ChatProvider=function({children:a,initialWelcome:r={title:"Welcome to AI Chat Agent",description:"A perfect agent library for your needs, for docs visit oblien.com/docs/chat-agent"},refreshTokenCallback:n,markdownComponents:i,typingAnimation:o={mode:"char",speed:200},statusComponents:l,forwardingHandlers:h={},authConfig:u,enableHistory:g=!0,loadingComponent:b,allowThinking:y=!0,headerComponent:v,config:j,agentId:S,className:M="h-full w-full",onError:I}){const C=e.useRef(S||"chat-"+Math.random().toString(36).substring(2,9)).current,[A,q]=e.useState(!0),[H,z]=e.useState(u?.sessionId),[D,L]=e.useState(!1),[O,P]=e.useState(!1),[$,U]=e.useState(!1),[B,W]=e.useState(null),[J,K]=e.useState(null),[G,Q]=e.useState(!1),[Y,X]=e.useState(!1),[V,Z]=e.useState(null),ee=e.useRef(r).current,[te,se]=e.useState([]),ae=e.useRef(!1),re=e.useRef(!1),ne=e.useRef(new f),ie=e.useRef(null),oe=e.useMemo(()=>w(),[]),ce=e.useRef(new p),le=e.useRef(new d(ce.current,j)),de=e.useRef(new m(le.current)),he=e.useRef(T(h)),ue=e.useRef(new x(ne.current,oe)),ge=e.useRef(new N(ue.current,he.current,Object.keys(h).length>0,C)),me=e.useCallback(()=>{const e=ae.current||re.current;P(e),e||L(!1)},[]);e.useEffect(()=>{ge.current.onQueueComplete=()=>{re.current=!1,me()}},[me]);const pe=e.useRef(i||((e={})=>({code({node:e,inline:a,className:r,children:n,...i}){const o=/language-(\w+)/.exec(r||""),c=(n+"").replace(/\n$/,""),l=!a&&c.includes("\n");return a||!l?s.jsx("code",{className:"inline-code px-1.5 py-0.5 rounded text-sm font-mono whitespace-pre-wrap",...i,children:n}):s.jsx("div",{className:"code-block rounded-lg overflow-hidden my-4",children:s.jsx(t.Prism,{language:o?.[1]||"javascript",style:F,customStyle:{margin:0,borderRadius:0},children:c})})},p:({children:e})=>{const t=E(e);return s.jsx("p",{className:"mb-4 leading-relaxed last:mb-0",dir:t,children:e})},ul:({children:e})=>{const t=E(e);return s.jsx("ul",{className:"my-3 space-y-1 list-disc list-outside "+("rtl"===t?"pr-6":"pl-6"),dir:t,children:e})},ol:({children:e})=>{const t=E(e);return s.jsx("ol",{className:"my-3 space-y-1 list-decimal list-outside "+("rtl"===t?"pr-6":"pl-6"),dir:t,children:e})},li:({children:e})=>{const t=E(e);return s.jsx("li",{className:"leading-relaxed "+("rtl"===t?"pr-1":"pl-1"),dir:t,children:e})},h1:({children:e})=>{const t=E(e);return s.jsx("h1",{className:"markdown-h1 mb-4 mt-6 first:mt-0 leading-[1.25]",dir:t,children:e})},h2:({children:e})=>{const t=E(e);return s.jsx("h2",{className:"markdown-h2 mb-4 mt-6 first:mt-0 leading-[1.3]",dir:t,children:e})},h3:({children:e})=>{const t=E(e);return s.jsx("h3",{className:"markdown-h3 mb-3 mt-5 first:mt-0 leading-[1.4]",dir:t,children:e})},h4:({children:e})=>{const t=E(e);return s.jsx("h4",{className:"markdown-h4 mb-2 mt-4 first:mt-0 leading-[1.4]",dir:t,children:e})},h5:({children:e})=>{const t=E(e);return s.jsx("h5",{className:"markdown-h5 mb-2 mt-4 first:mt-0 leading-[1.5]",dir:t,children:e})},h6:({children:e})=>{const t=E(e);return s.jsx("h6",{className:"markdown-h6 mb-2 mt-4 first:mt-0 leading-[1.5]",dir:t,children:e})},blockquote:({children:e})=>{const t=E(e);return s.jsx("blockquote",{className:"markdown-blockquote py-1 my-4 italic "+("rtl"===t?"pr-4 border-r-4":"pl-4 border-l-4"),dir:t,children:e})},strong:({children:e})=>s.jsx("strong",{className:"markdown-strong font-semibold",children:e}),em:({children:e})=>s.jsx("em",{className:"markdown-em italic",children:e}),a:({children:e,href:t})=>s.jsx("a",{href:t,className:"markdown-link text-blue-400 hover:text-blue-300 underline decoration-blue-400/30 hover:decoration-blue-300/50 transition-colors",target:"_blank",rel:"noopener noreferrer",children:e}),hr:()=>s.jsx("hr",{className:"markdown-hr my-6"}),table:({children:e})=>s.jsx("div",{className:"overflow-x-auto my-4",children:s.jsx("table",{className:"markdown-table min-w-full border-collapse",children:e})}),thead:({children:e})=>s.jsx("thead",{className:"markdown-thead",children:e}),tbody:({children:e})=>s.jsx("tbody",{className:"markdown-tbody",children:e}),tr:({children:e})=>s.jsx("tr",{className:"markdown-tr transition-colors",children:e}),th:({children:e})=>s.jsx("th",{className:"markdown-th px-4 py-2 text-left font-semibold text-sm",children:e}),td:({children:e})=>s.jsx("td",{className:"markdown-td px-4 py-2 text-sm",children:e}),input:({type:e,checked:t,...a})=>s.jsx("input","checkbox"===e?{type:"checkbox",checked:t,disabled:!0,className:"mr-2 align-middle",...a}:{type:e,...a}),del:({children:e})=>s.jsx("del",{className:"markdown-del line-through",children:e}),pre:({children:e})=>s.jsx("pre",{className:"overflow-x-auto",children:e}),...e}))()).current,fe=e.useRef(b),xe=e.useRef(l),be=e.useRef(v);e.useEffect(()=>{b!==fe.current&&(fe.current=b),l!==xe.current&&(xe.current=l),v!==be.current&&(be.current=v),n&&ce.current.setRefreshCallback(n)},[b,l,v,n]);const ye=e.useRef(!1),we=e.useRef(H),ke=e.useRef(null);k.current=o;const ve=e.useRef(new Set);e.useEffect(()=>{const e=ne.current.subscribe(e=>{se(e)});return()=>{e()}},[]),e.useEffect(()=>{we.current=H},[H]);const je=e.useRef(!1);e.useEffect(()=>{(async()=>{if(u&&u.sessionId)try{await ce.current.setAuth(u)}catch(B){let t="Authentication failed. Please refresh the page.";B?.message?.includes("No refresh token")?t="Session expired. Please refresh the page to continue.":B?.message&&(t=B.message),W({type:"auth_error",message:t,error:B}),q(!1)}else q(!1)})()},[!1,u]);const Se=e.useCallback(e=>{W(e.error)},[]),Me=e.useCallback(async()=>{if(g)try{if(ve.current.has(H))return void q(!1);ve.current.add(H),q(!0);const e=await le.current.getHistory();if(e.error)return Se(e),void q(!1);e.history&&e.history.length>0&&ne.current.insertMessages(e.history,"end"),X(!!e.has_more),q(!1)}catch(e){let t="Could not load message history.";e?.message?.includes("No refresh token")?t="Session expired. Please refresh the page to continue.":e?.message?.includes("Network")?t="Network error. Please check your connection.":e?.message&&(t=e.message),W({type:"history_error",message:t,error:e}),q(!1)}else q(!1)},[H,Se,g]);e.useEffect(()=>{(async()=>{H&&!je.current?(je.current=!0,await Me()):H||je.current||(je.current=!0,q(!1))})()},[H,Me]);const Ne=e.useCallback(()=>(ae.current=!1,re.current=!1,P(!1),L(!1),U(!1),ge.current.clear(),ie.current=null,le.current.abort(),de.current.abort()),[]),Ie=e.useCallback(e=>{const t={...e,id:e?.id||Math.random().toString(36).substring(2,9),timestamp:Date.now()};K(t),I&&I(t)},[I]),Ce=e.useCallback(()=>{K(null)},[]),Te=e.useCallback(()=>{ae.current=!1,ie.current&&(ge.current.endResponse(),ie.current=null),me()},[me]),Fe=e.useCallback(()=>{ye.current=!1,ae.current=!1,me()},[me]),Ee=e.useCallback(e=>{const t=e?.data?.messageId||e?.messageId;t&&(ie.current=t),$||U(!0),re.current=!0,ge.current.addToQueue(e),me()},[$,me]);e.useEffect(()=>(de.current.on("stream_error",Ie),de.current.on("response",Ee),de.current.on("response_end",Te),de.current.on("disconnect",Fe),()=>{de.current.off("stream_error",Ie),de.current.off("response",Ee),de.current.off("response_end",Te),de.current.off("disconnect",Fe)}),[Ie,Ee,Te,Fe]);const Re=async({messageId:e=Math.random().toString(36).substring(2,9),message:t="",attachedFiles:s=[],uploadId:a=null}={})=>{if(!t.trim())return;const r="user-"+e;try{ke.current&&ke.current?.messageId===r||ue.current.handleUserMessage({messageId:r,text:t,attachedFiles:s}),ke.current={messageId:r,message:t,attachedFiles:s,uploadId:a},L(!0),U(!1),ae.current=!0,me();const e=he.current.handlers._stream_feedback,n=e?.handler,i="raw"===e?.mode,o=await de.current.startStream({message:t,attachedFiles:s,uploadId:a,sessionId:we.current,context:null,allowThinking:y},n,i);o.status||(ae.current=!1,me(),Ie({errorType:"connection_error",error:o.error||"Error occurred while connecting to server",message:o.message||"Failed to send message"}))}catch(n){ae.current=!1,me(),Ie({errorType:"send_error",error:n.message||"Unknown error",message:"Failed to send message"})}finally{L(!1)}},_e=e.useCallback(async()=>{ke.current&&await Re(ke.current)},[]),Ae=e.useMemo(()=>({addMessage:e=>ne.current.addMessage(e),updateMessage:(e,t)=>ne.current.updateMessage(e,t),removeMessage:e=>ne.current.removeMessage(e),getMessage:e=>ne.current.getMessage(e),clear:()=>ne.current.clear()}),[]),qe=e.useMemo(()=>({register:(e,t)=>oe.register(e,t,{instanceId:C}),registerGlobal:e=>oe.registerGlobal(e,{instanceId:C})}),[C,oe]);return c.default.createElement("div",{className:"react-chat-agent "+M},c.default.createElement(_.Provider,{value:{sendMsg:Re,messages:te,messageManager:Ae,isLoading:D,isStreaming:O,isResponseStarted:$,isInitialLoading:A,isLoadingMore:G,error:B,streamError:J,clearStreamError:Ce,getHistory:Me,loadMoreMessages:async()=>{if(g&&!G&&Y){Q(!0);try{const e=ne.current.count,t=await le.current.getHistory({offset:e,limit:20});if(t.error)return Se(t),void Q(!1);t.history&&t.history.length>0?(ne.current.insertMessages(t.history,"start"),X(t.has_more)):X(!1)}catch(e){W({type:"load_more_error",message:"Failed to load more messages",error:e})}finally{Q(!1)}}},hasMoreMessages:Y,enableHistory:g,retryLastMessage:_e,abort:Ne,sessionId:H,setSessionId:z,instanceId:C,currentSelectedFile:V,setCurrentSelectedFile:Z,welcome:ee,statusRegistry:qe,markdownComponents:pe,statusComponents:xe.current,loadingComponent:fe.current,headerComponent:be.current,typingAnimation:o}},c.default.createElement(R.Provider,{value:C},a)))},exports.ForwardingManager=C,exports.LoadingResponse=W,exports.MessageItem=B,exports.MessageManager=f,exports.ModeToggle=({modes:e=[],activeMode:t,onModeChange:a,isDark:r=!1})=>e&&e.length>1?s.jsx("div",{className:"react-chat-agent-mode-toggle toggle-container flex items-center bg-theme-faint rounded-full !ml-5 flex-shrink-0 h-[35px]",style:{padding:"4px"},children:e.map(e=>s.jsx("button",{onClick:()=>a(e.id),className:`react-chat-agent-mode-button ${t===e.id?"react-chat-agent-mode-button-active":"react-chat-agent-mode-button-inactive"} relative px-3 py-1 text-[12px] font-medium rounded-full transition-all duration-200\n ${t===e.id?"bg-background text-theme-primary":"text-theme-subtle hover:text-theme-tertiary hover:bg-theme-subtle"}\n `,children:s.jsxs("div",{className:"react-chat-agent-mode-button-content flex items-center gap-1.5",children:[s.jsx("span",{className:"react-chat-agent-mode-button-icon",children:e.icon}),s.jsx("span",{className:"react-chat-agent-mode-button-label",children:e.label})]})},e.id))}):null,exports.SessionManager=class{constructor(e){this.tokenManager=e||new p,this.createSessionCallback=null,this.onSessionCreated=null}setCreateSessionCallback(e){this.createSessionCallback=e}setOnSessionCreated(e){this.onSessionCreated=e}async createSession(e={}){if(!this.createSessionCallback)throw Error("No session creation callback provided. Use SessionManager.setCreateSessionCallback()");try{const t=await this.createSessionCallback(e);if(!t||!t.sessionId)throw Error("Invalid session data: missing sessionId");if(!t.accessToken)throw Error("Invalid session data: missing accessToken");return tokenManager.setAuth(t),this.onSessionCreated&&this.onSessionCreated(t),t}catch(t){throw t}}getSessionId(){return tokenManager.getSessionId()}clearSession(){tokenManager.clear()}},exports.ShimmerText=$,exports.StartChat=D,exports.StatusBlock=U,exports.StatusHandlerRegistry=b,exports.StreamService=m,exports.TokenManager=p,exports.WebSocketService=h,exports.getGlobalForwardingManager=T,exports.getGlobalStatusRegistry=w,exports.resetGlobalForwardingManager=function(){I=null},exports.setGlobalForwardingManager=function(e){I=e},exports.useChatContext=A,exports.useForwarding=function(t,s,a={}){const r=T(),n=e.useRef(new Map),i=A(),o=i?.instanceId,c=e.useRef(s),l=e.useRef(a);e.useEffect(()=>{c.current=s,l.current=a}),e.useEffect(()=>{const e=[];if("object"!=typeof t||s){if("string"==typeof t&&s){const s=r.register(t,(...e)=>c.current(...e),{mode:l.current.mode||"dual",animated:!1!==l.current.animated,subscriptionMode:l.current.subscriptionMode||"delta",instanceId:o});e.push(s)}}else Object.entries(t).forEach(([t,s])=>{const a=r.register(t,(...e)=>s.handler(...e),{mode:s.mode||"dual",animated:!1!==s.animated,subscriptionMode:s.subscriptionMode||"delta",instanceId:o});e.push(a)});return()=>{e.forEach(e=>e())}},[t,r]);const d=e.useCallback((e,t,s={})=>{const a=r.register(e,t,s);return n.current.set(e,a),a},[r]),h=e.useCallback(e=>{const t=n.current.get(e);t&&(t(),n.current.delete(e))},[]),u=e.useCallback(()=>r.getActiveSessions(),[r]),g=e.useCallback(e=>r.handlers[e],[r]),m=e.useCallback(()=>Object.entries(r.handlers).map(([e,t])=>({action:e,...t})),[r]);return{register:d,unregister:h,getActiveSessions:u,getHandler:g,getAllHandlers:m}},exports.useStatusSubscription=function(t,s,a={}){const r=e.useContext(R),n=void 0!==a.instanceId?a.instanceId:r,i=n?{instanceId:n}:{},o=w(),c=e.useRef(s);e.useEffect(()=>{c.current=s},[s]),e.useEffect(()=>{const e=[];if("object"==typeof t&&null!==t)Object.entries(t).forEach(([t,s])=>{if("*"===t){const t=o.registerGlobal(s,i);e.push(t)}else{const a=o.register(t,s,i);e.push(a)}});else if("string"==typeof t){const s=e=>c.current?.(e);if("*"===t){const t=o.registerGlobal(s,i);e.push(t)}else{const a=o.register(t,s,i);e.push(a)}}return()=>{e.forEach(e=>e?.())}},[t,n])};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import e,{createContext as t,useContext as s,useRef as a,useEffect as r,useState as n,useMemo as i,useCallback as o,memo as c,forwardRef as l,useImperativeHandle as d}from"react";import{Prism as h}from"react-syntax-highlighter";import{jsx as g,jsxs as m,Fragment as u}from"react/jsx-runtime";import{useVirtualizer as p}from"@tanstack/react-virtual";import{Streamdown as f}from"streamdown";import y from"react-markdown";import{motion as b}from"framer-motion";class x{constructor(e,t={}){this.tokenManager=e,this.abortController=null,this.config={uploadUrl:"https://api.oblien.com/ai/chat/upload",chatUrl:"https://api.oblien.com/ai/chat/send",historyUrl:"https://api.oblien.com/ai/session/history",prepareSessionUrl:"https://api.oblien.com/ai/session/prepare",...t}}setConfig(e){this.config={...this.config,...e}}async getToken(){return await this.tokenManager.getAccessToken()}getSessionId(){return this.tokenManager.getSessionId()}abort(){this.abortController&&(this.abortController.abort(),this.abortController=null)}async uploadFiles(e,t){if(!e?.length)return[];const s=await this.getToken(),a=new FormData;e.forEach((e,t)=>{a.append("files",e.file,e.name)});const r=await fetch(this.config.uploadUrl,{method:"POST",headers:{Authorization:"Bearer "+s},body:a,signal:t});if(!r.ok)throw Error("File upload failed: "+r.status);return(await r.json()).uploadId}async sendMessage({message:e,context:t,attachedFiles:s,uploadId:a,sessionId:r,allowThinking:n},i=null){this.abort();try{this.abortController=new AbortController;const l=this.abortController.signal,d=await this.getToken();if(!d)throw Error("No access token available");if(!(r=r||this.getSessionId()))throw Error("No session ID available");s?.length>0&&!a&&(a=await this.uploadFiles(s,l));const h=await fetch(this.config.chatUrl,{method:"POST",headers:{"Content-Type":"application/json",Accept:i?"text/event-stream":"application/json",Authorization:"Bearer "+d},body:JSON.stringify({message:e,context:t,uploadId:a,sessionId:r,allowThinking:n}),signal:l});if(!h.ok){let e=null;try{e=await h.json()}catch(o){}const t={status:!1,error:e?.error||"HTTP error! status: "+h.status,message:e?.message||"Server returned "+h.status,limit:e?.limit,...e};return i&&i(JSON.stringify({event:"stream_error",data:{errorType:e?.error||"http_error",error:t.error,message:t.message,limit:t.limit}})),t}if(!i)try{return{status:!0,data:await h.json()}}catch(c){return{status:!1,error:c.message}}if(!h.body)throw Error("ReadableStream not supported");const g=h.body.getReader(),m=new TextDecoder;let u="";for(;;)try{const{value:e,done:t}=await g.read();if(t){i(JSON.stringify({event:"ai_response_end",data:{status:"end"}}));break}u+=m.decode(e,{stream:!0});const s=u.split("\n");u=s.pop()||"";for(const a of s)a.trim()&&i(a)}catch(c){i(JSON.stringify({event:"stream_error",data:{errorType:"stream_error",error:c.message,message:"Error reading stream"}}));break}return{status:!0}}catch(c){const e={status:!1,error:c.message,message:"AbortError"===c.name?"Request aborted":"Failed to send message"};return i&&i(JSON.stringify({event:"stream_error",data:{errorType:"connection_error",error:e.error,message:e.message}})),e}}async getHistory({offset:e=0,limit:t=20,sessionId:s}={}){try{const a=await this.getToken();if(!(s=s||this.getSessionId()))throw Error("No session ID available");const r=await fetch(this.config.historyUrl+`?offset=${e}&limit=${t}&sessionId=${s}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:"Bearer "+a}});if(!r.ok){const e=await r.json().catch(()=>({error:"Failed to load history"}));return{error:e.error||"Failed to load history",message:e.message}}return await r.json()}catch(a){return{error:a.message,message:"Failed to load chat history"}}}async prepareSession(e,t){try{const s=await this.getToken();if(!(t=t||this.getSessionId()))throw Error("No session ID available");const a=await fetch(this.config.prepareSessionUrl+"?sessionId="+t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+s},body:JSON.stringify(e)});if(!a.ok){const e=await a.json().catch(()=>({error:"Failed to prepare session"}));return{error:e.error||"Failed to prepare session",message:e.message}}return await a.json()}catch(s){return{error:s.message,message:"Failed to prepare session"}}}}const w=new class{constructor({socketUrl:e}={}){this.socket=null,this.listeners=new Map,this.bufferedEvents=new Map,this.bufferableEventTypes=new Set([]),this.reconnectAttempts=0,this.maxReconnectAttempts=5e3,this.reconnectTimeout=3e3,this.socketUrl=e,this.requireAppRunning=null}setSocketUrl(e){this.socketUrl=e}_processBinaryData(e){this.notifyListeners("binary",{data:e})}async connect(e,t=[]){return this.socket&&this.disconnect(),e||(e=await getToken()),new Promise(async(s,a)=>{try{const a=new URL(this.socketUrl+"?token="+e+"&"+t.join("&"));this.socket=new WebSocket(a),this.socket.onopen=()=>{this.reconnectAttempts=0,this.reconnectTimeout=3e3,this.notifyListeners("connect",{connected:!0}),s(!0)},this.socket.onmessage=async e=>{try{if(e.data instanceof Blob){const t=new FileReader;return t.onload=()=>{this._processBinaryData(t.result)},void t.readAsArrayBuffer(e.data)}if(e.data instanceof ArrayBuffer)return void this._processBinaryData(e.data);if("string"==typeof e.data){const t=JSON.parse(e.data);if(this._checkPendingRequests(t))return;return this.notifyListeners("message",t),this.requireAppRunning?.events.includes(t.type)&&!this.listeners.has(t?.type)&&t?.type&&this.requireAppRunning&&"running"!==this.requireAppRunning?.status&&await this.requireAppRunning.callback(t),void(t.type&&this.notifyListeners(t.type,t))}}catch(t){}},this.socket.onclose=s=>{this.notifyListeners("disconnect",{code:s.code,reason:s.reason}),1e3!==s.code&&this.attemptReconnect(e,t)},this.socket.onerror=e=>{this.notifyListeners("error",e)}}catch(r){}})}disconnect(){this.socket&&(this.notifyListeners("close",{code:1e3,reason:"User disconnected"}),this.socket.close(1e3,"User disconnected"),this.socket=null)}attemptReconnect(e,t){this.maxReconnectAttempts>this.reconnectAttempts&&this.socket?(this.reconnectAttempts++,this.notifyListeners("reconnectAttempt",{attempts:this.reconnectAttempts}),setTimeout(()=>{this.connect(e,t)},this.reconnectTimeout)):this.notifyListeners("reconnectFailed",{attempts:this.reconnectAttempts})}isConnected(){return this.socket&&this.socket.readyState===WebSocket.OPEN}sendAsync(e,t=3e4){return new Promise((s,a)=>{if(!this.isConnected())return a(Error("WebSocket is not connected"));const r=e.requestId||`req_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,n={...e,requestId:r};this.pendingRequests||(this.pendingRequests=new Map),this.pendingRequests.set(r,{resolve:s,reject:a,timeoutId:setTimeout(()=>{this.pendingRequests.has(r)&&(this.pendingRequests.delete(r),a(Error(`Request ${r} timed out after ${t}ms`)))},t)}),this.send(n)})}_checkPendingRequests(e){if(!this.pendingRequests||!e.requestId)return!1;const t=this.pendingRequests.get(e.requestId);return!!t&&(clearTimeout(t.timeoutId),this.pendingRequests.delete(e.requestId),t.resolve(e),!0)}send(e){return!!this.isConnected()&&(this.socket.send(JSON.stringify(e)),!0)}on(e,t){return this.listeners.has(e)||this.listeners.set(e,[]),this.listeners.get(e).push(t),this.bufferedEvents.has(e)&&(this.bufferedEvents.get(e).forEach(e=>{try{t(e)}catch(s){}}),this.bufferedEvents.delete(e)),()=>this.off(e,t)}off(e,t){if(!this.listeners.has(e))return;const s=this.listeners.get(e),a=s.indexOf(t);-1!==a&&s.splice(a,1),0===s.length&&this.listeners.delete(e)}notifyListeners(e,t){const s=this.listeners.has(e);if(!s&&this.bufferableEventTypes.has(e))return this.bufferedEvents.has(e)||this.bufferedEvents.set(e,[]),void this.bufferedEvents.get(e).push(t);s&&this.listeners.get(e).forEach(e=>{try{e(t)}catch(s){}})}setAppServerStatus(e){this.requireAppRunning.status=e}setRequireAppRunning(e,t,s){return this.requireAppRunning={events:e,callback:t,status:s},()=>{this.requireAppRunning=null}}};class k{constructor(){this.buffer=""}feed(e){if(!e)return[];const t=this._tryDirectJson(e);if(t.length)return t;const s=this._tryDirectSSE(e);return s.length?s:(this.buffer+=e,this._fallbackExtract())}_tryDirectJson(e){const t=[];try{const s=JSON.parse(e);return s&&"object"==typeof s&&t.push(s),t}catch{}return e.includes("{")&&e.includes("}")?this._fallbackExtractFromText(e):[]}_tryDirectSSE(e){const t=[];for(let s of e.split("\n")){if(s=s.trim(),!s.startsWith("data:"))continue;const e=s.slice(5).trim();try{const s=JSON.parse(e);s&&"object"==typeof s&&t.push(s)}catch{}}return t}_fallbackExtract(){const e=this._fallbackExtractFromText(this.buffer);for(const t of e){const e=JSON.stringify(t),s=this.buffer.indexOf(e);-1!==s&&(this.buffer=this.buffer.slice(0,s)+this.buffer.slice(s+e.length))}return e}_fallbackExtractFromText(e){const t=[];let s=-1,a=0,r=!1,n=!1;for(let i=0;e.length>i;i++){const o=e[i];if(n)n=!1;else if("\\"===o)n=!0;else if('"'===o)r=!r;else if(!r)if("{"===o)0===a&&(s=i),a++;else if("}"===o&&(a--,0===a&&-1!==s)){const a=e.slice(s,i+1);try{const e=JSON.parse(a);t.push(e)}catch{}s=-1}}return t}}class v{constructor(){this.jsonStreamParser=new k}parseJsonStream(e){return this.jsonStreamParser.feed(e)}processRawChunk(e,t){try{const s=this.parseJsonStream(e);if(!s.length)return;for(const e of s)t(e.error||e.errorType?"stream_error":"end"===e.status||"end"===e.type||"ai_response_end"===e.event?"response_end":"response",e)}catch(s){}}}class N{constructor(e){this.chatApi=e,this.streamProcessor=new v,this.eventHandlers=new Map,this.mode=null}setMode(e="sse",t=null){this.mode=e}on(e,t){return this.eventHandlers.has(e)||this.eventHandlers.set(e,[]),this.eventHandlers.get(e).push(t),()=>{const s=this.eventHandlers.get(e);if(s){const e=s.indexOf(t);e>-1&&s.splice(e,1)}}}off(e,t){const s=this.eventHandlers.get(e);if(s){const e=s.indexOf(t);e>-1&&s.splice(e,1)}}emit(e,t){const s=this.eventHandlers.get(e);s&&s.forEach(e=>{try{e(t)}catch(s){}})}abort(){}send(e){"websocket"===this.mode&&w&&w.send(e)}startStream(e,t,s){return this.chatApi.sendMessage(e,e=>{if(t&&s)try{t(e)}catch(a){}this.streamProcessor.processRawChunk(e,(r,n)=>{if(t&&!s)try{t(e)}catch(a){}this.emit(r,n)})})}clear(){this.eventHandlers.clear()}}class S{constructor(){this.accessToken=null,this.refreshToken=null,this.tokenExpiry=null,this.refreshCallback=null,this.sessionId=null}decodeJWT(e){try{const t=e.split(".")[1].replace(/-/g,"+").replace(/_/g,"/"),s=decodeURIComponent(atob(t).split("").map(e=>"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)).join(""));return JSON.parse(s)}catch(t){return null}}isTokenExpired(e,t=30){if(!e)return!0;const s=this.decodeJWT(e);if(!s||!s.exp)return!0;const a=1e3*s.exp;return Date.now()>=a-1e3*t}setRefreshCallback(e){this.refreshCallback=e}async setAuth({accessToken:e,refreshToken:t,expiresIn:s,sessionId:a}){this.accessToken=e,this.refreshToken=t,this.sessionId=a;const r=this.decodeJWT(e);r&&r.exp?(this.tokenExpiry=1e3*r.exp,this.tokenExpiry<Date.now()+3e4&&await this.refreshTokens()):s&&(this.tokenExpiry=Date.now()+1e3*s)}async getAccessToken(){if(!this.accessToken)throw Error("No access token available. Initialize tokens first.");return this.isTokenExpired(this.accessToken,30)&&await this.refreshTokens(),this.accessToken}getSessionId(){return this.sessionId}async refreshTokens(){if(!this.refreshCallback)throw Error("No refresh callback provided");if(!this.refreshToken)throw Error("No refresh token available");try{const e=await this.refreshCallback(this.refreshToken);if(!e||!e.accessToken)throw Error("Invalid refresh response");return this.setAuth({accessToken:e.accessToken,refreshToken:e.refreshToken||this.refreshToken,expiresIn:e.expiresIn,sessionId:e.sessionId||this.sessionId}),this.accessToken}catch(e){throw this.clear(),e}}hasTokens(){return!!this.accessToken}clear(){this.accessToken=null,this.refreshToken=null,this.tokenExpiry=null,this.sessionId=null}}class I{constructor(){this.messages=[],this.messageIndex=new Map,this.listeners=new Set}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}_notify(){this.listeners.forEach(e=>e([...this.messages]))}_rebuildIndex(){this.messageIndex.clear(),this.messages.forEach((e,t)=>{this.messageIndex.set(e.messageId,t)})}addMessage(e){const t={...e,messageId:e.messageId||this._generateId(),timestamp:e.timestamp||Date.now(),uniqueKey:`msg-${e.messageId}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`};return this.messages.push(t),this.messageIndex.set(t.messageId,this.messages.length-1),this._notify(),t}updateMessage(e,t,s={}){const a=this.messageIndex.get(e);if(void 0===a)return null;const r=this.messages[a],n={};if(Object.entries(t).forEach(([e,t])=>{n[e]="function"==typeof t?t(r[e]):t}),s.silent)return Object.assign(this.messages[a],n),this.messages[a];const i=n.hasOwnProperty("isLive")||n.hasOwnProperty("isFinished")||n.hasOwnProperty("isThinkingFinished")||n.hasOwnProperty("statusType")||n.hasOwnProperty("sender")||n.hasOwnProperty("type")||n.hasOwnProperty("text");return this.messages[a]={...r,...n,...i&&{uniqueKey:`msg-${e}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`}},this._notify(),this.messages[a]}insertMessage(e,t="end"){const s={...e,messageId:e.messageId||this._generateId(),timestamp:e.timestamp||Date.now(),uniqueKey:`msg-${e.messageId}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`};return"start"===t||0===t?this.messages.unshift(s):"end"!==t&&this.messages.length>t?this.messages.splice(t,0,s):this.messages.push(s),this._rebuildIndex(),this._notify(),s}insertMessages(e,t="end"){const s=e.map(e=>({...e,messageId:e.messageId||this._generateId(),timestamp:e.timestamp||Date.now(),uniqueKey:e.uniqueKey||`msg-${e.messageId}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`}));return"start"===t||0===t?this.messages.unshift(...s):"end"!==t&&this.messages.length>t?this.messages.splice(t,0,...s):this.messages.push(...s),this._rebuildIndex(),this._notify(),s}removeMessage(e){const t=this.messageIndex.get(e);return void 0!==t&&(this.messages.splice(t,1),this._rebuildIndex(),this._notify(),!0)}getMessage(e){const t=this.messageIndex.get(e);return void 0!==t?this.messages[t]:null}hasMessage(e){return this.messageIndex.has(e)}getAllMessages(){return[...this.messages]}clear(){this.messages=[],this.messageIndex.clear(),this._notify()}setMessages(e){this.messages=e.map(e=>({...e,uniqueKey:e.uniqueKey||`msg-${e.messageId}-${Date.now()}-${Math.random().toString(36).substring(2,9)}`})),this._rebuildIndex(),this._notify()}_generateId(){return`msg-${Date.now()}-${Math.random().toString(36).substring(2,9)}`}get count(){return this.messages.length}}class M{constructor(e,t){this.messageManager=e,this.statusRegistry=t,this.activeStreamingMessages=new Map}handleUserMessage({messageId:e,text:t,attachedFiles:s=[],...a}){return this.messageManager.addMessage({messageId:e||this.messageManager._generateId("user"),sender:"user",type:"user",text:t,attachedFiles:s,...a})}incrementChunkIndex(e){const t=this._getState(e);return t.chunkIndex+=1,t.chunkIndex}markTypeProcessed(e,t){this._getState(e).lastProcessedType=t}shouldFinishThinking(e){const t=this._getState(e);return t.hasChunk&&t.hasThinking&&!t.thinkingFinished}markThinkingFinished(e){const t=this._getState(e),s=e+"-thinking";t.thinkingFinished=!0,t.hasChunk=!0,t.hasThinking&&this.messageManager.hasMessage(s)&&this.messageManager.updateMessage(s,{isLive:!1,isThinkingFinished:!0})}}class T{constructor(){this.handlers=new Map,this.globalHandlers=[],this.streamForwarders=new Map}register(e,t,s={}){this.handlers.has(e)||this.handlers.set(e,[]);const a={handler:t,filter:s};return this.handlers.get(e).push(a),()=>{const t=this.handlers.get(e);if(t){const e=t.indexOf(a);e>-1&&t.splice(e,1)}}}registerGlobal(e,t={}){const s={handler:e,filter:t};return this.globalHandlers.push(s),()=>{const e=this.globalHandlers.indexOf(s);e>-1&&this.globalHandlers.splice(e,1)}}_matchesFilter(e,t){return!t.instanceId||e.instanceId===t.instanceId}async handle(e){const{status:t,messageId:s}=e,a=t?.type||e.type;await Promise.all(this.globalHandlers.filter(t=>this._matchesFilter(e,t.filter)).map(t=>Promise.resolve(t.handler(e)).catch(e=>{})));const r=this.handlers.get(a)||[];await Promise.all(r.filter(t=>this._matchesFilter(e,t.filter)).map(t=>Promise.resolve(t.handler(e)).catch(e=>{}))),"started"===t?.state||"in_progress"===t?.state?this._startStreamForwarding(s,a,e):"finished"!==t?.state&&"error"!==t?.state||this._stopStreamForwarding(s,a,e)}registerStreamForwarder(e){const t=Math.random().toString(36).substring(2,9);return this.streamForwarders.set(t,{forwarder:e,active:!1,messageId:null}),{id:t,stop:()=>this.streamForwarders.delete(t)}}forwardStream(e,t){this.streamForwarders.forEach(s=>{if(s.active&&s.messageId===e)try{"chunk"===t.type&&s.forwarder({...t,statusType:s.statusType})}catch(a){}})}_startStreamForwarding(e,t,s){this.streamForwarders.forEach(a=>{a.active=!0,a.messageId=e,a.statusType=t,a.forwarder.onStart&&a.forwarder.onStart({...s,statusType:t})})}_stopStreamForwarding(e,t,s){this.streamForwarders.forEach(a=>{a.messageId===e&&(a.active=!1,a.statusType=null,a.forwarder.onEnd&&a.forwarder.onEnd({...s,statusType:t}))})}clear(){this.handlers.clear(),this.globalHandlers=[],this.streamForwarders.clear()}}const C=new T;function F(){return C}const _={current:{}},E=new Map;class A{constructor(e){this.messageId=e,this.fullText="",this.displayIndex=0,this.previousDisplayIndex=0,this.isTyping=!1,this.isComplete=!1,this.isCleanedUp=!1,this.intervalId=null,this.mode=_.current.mode||"char",this.speed=_.current.speed||50,this.batchSize=_.current.batchSize||5,this.listeners=new Set}setFullText(e,t){this.fullText+=e||"",!this.isTyping&&this.fullText.length>0&&this.startTyping(),t||!1!==this.isComplete||(this.isComplete=!0)}waitForAnimation(){return new Promise(e=>{if(this.displayIndex>=this.fullText.length)return void e();const t=setInterval(()=>{this.fullText.length>this.displayIndex||(clearInterval(t),e())},50)})}startTyping(){this.isTyping||(this.isTyping=!0,this.intervalId=setInterval(()=>{if(this.fullText.length>this.displayIndex){const e=this.getNextIncrement();this.previousDisplayIndex=this.displayIndex,this.displayIndex=Math.min(this.displayIndex+e,this.fullText.length),this.notifyListeners()}else this.isComplete&&(this.stopTyping(),this.onComplete&&(this.onComplete(),this.onComplete=null))},1e3/this.speed))}getNextIncrement(){switch(this.mode){case"char":default:return 1;case"word":{let e=this.displayIndex+1;for(;this.fullText.length>e;){const t=this.fullText[e];if(" "===t||"\n"===t||/[.,!?;:]/.test(t))return e-this.displayIndex+1;e++}return this.fullText.length-this.displayIndex}case"batch":return this.batchSize}}stopTyping(){this.isTyping=!1,this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null)}subscribe(e,t={}){const s={callback:e,newOnly:t.newOnly||!1};return this.listeners.add(s),()=>this.listeners.delete(s)}notifyListeners(){const e=this.fullText.slice(this.previousDisplayIndex,this.displayIndex),t=this.fullText.slice(0,this.displayIndex);this.listeners.forEach(s=>{s.callback(s.newOnly?e:t)})}cleanup(){this.isCleanedUp||(this.isCleanedUp=!0,this.stopTyping(),this.listeners.clear(),E.delete(this.messageId))}}function q(e){return E.get(e)}class H{constructor(){}async processChunk(e,t=null,s,a){const r=e.messageId,n=function(e){if(E.has(e))return E.get(e);const t=new A(e);return E.set(e,t),t}(e.messageId);if(n.setFullText(e.text||"",e.isLive),s){const s=e.from&&this.forwardingManager?.handlers[e.from],a=t&&this.forwardingManager?this.forwardingManager.getSession(t):null,n=s&&a&&e.from===a?.action;e.from&&!s&&this.forwardingManager&&(this._warnedActions||(this._warnedActions=new Set),this._warnedActions.has(e.from)||this._warnedActions.add(e.from));const i=s?this.forwardingManager.handlers[e.from]:null,o=e.from&&"replace"===(i?.mode||"replace");if(n){const s=this.forwardingManager.isAnimated(t),a=this.forwardingManager.getSubscriptionMode(t);if(s){const s=q(r);s.hasForwarder||(s.hasForwarder=!0,s.subscribe(s=>{this.forwardingManager.forwardChunk(t,s,e.isLive)},{newOnly:"delta"===a}),s.onComplete=()=>{this.forwardingManager.cleanupSession(t)})}else this.forwardingManager.forwardChunk(t,e.text||"",e.isLive)}if(o)return}this.messageHandlers.messageManager.hasMessage(r)?this.messageHandlers.messageManager.updateMessage(r,{text:t=>t+(e.text||"")},{silent:!0}):this.messageHandlers.messageManager.addMessage({messageId:r,sender:"ai",type:"chunk",text:e.text||"",isLive:!0,tokens:e.tokens}),await n.waitForAnimation()}async processHolding(e){}async processThinking(e){const t=e.messageId+"-thinking";this.messageHandlers.messageManager.hasMessage(t)?this.messageHandlers.messageManager.updateMessage(t,{text:t=>t+(e.text||"")}):this.messageHandlers.messageManager.addMessage({messageId:t,sender:"ai",type:"thinking",text:e.text||"",isLive:!0,timestamp:Date.now()})}async finishThinking(e){const t=e.messageId+"-thinking",s=this.messageHandlers.messageManager.getMessage(t);if(s){const e=Date.now();this.messageHandlers.messageManager.updateMessage(t,{isLive:!1,finalized:!0,duration:parseFloat(((e-(s.timestamp||e))/1e3).toFixed(1)),endTimestamp:e})}}async finishChunk(e){const t=e.messageId,s=this.messageHandlers.messageManager.getMessage(t);s&&this.messageHandlers.messageManager.updateMessage(t,{isLive:!1,finalized:!0,text:s.text||""})}async processStatus(e,t=null){const s=e.taskId||e.messageId;if(!s)return;if(this.messageHandlers.statusRegistry)try{await this.messageHandlers.statusRegistry.handle({...e,messageId:s,instanceId:t,status:{type:e.action||e.type,state:"started"===e.type?"started":"finished"===e.type?"finished":"in_progress",data:e.data}})}catch(r){}const a=this.messageHandlers.messageManager.hasMessage(s);"started"!==e.type&&"status"!==e.type?"finished"!==e.type?a?this.messageHandlers.messageManager.updateMessage(s,{statusType:e.type,data:e.data,isFinished:e.type.includes("end")||"finished"===e.type}):this.messageHandlers.messageManager.addMessage({messageId:s,sender:"ai",type:"status",action:e.action,statusType:e.type,data:e.data,isFinished:e.type.includes("end")||"finished"===e.type}):a&&this.messageHandlers.messageManager.updateMessage(s,{statusType:e.type,isFinished:!0}):a||this.messageHandlers.messageManager.addMessage({messageId:s,sender:"ai",type:"status",action:e.action,statusType:e.type,data:e.data,isFinished:!1})}}class z extends H{constructor(e,t,s,a=null){super(),this.messageHandlers=e,this.forwardingManager=t,this.queue=[],this.queueHistory=[],this.isProcessing=!1,this.lastMessageId=null,this.useForwarding=s,this.currentForwardingSession=null,this.onQueueComplete=null,this.instanceId=a}async process(){this.isProcessing=!0;const e=[...this.queue];this.queueHistory.push(...e),this.queue=[];for(let t=0;e.length>t;t++){const s=e[t],a=this.queueHistory.findIndex(e=>(e.messageId||e.taskId)==(s.messageId||s.taskId)),r=this.queueHistory[a-1];r&&!r.finalized&&(r.finalized=!0,await this.notifyPreviousItem(r)),await this.processItem(s)}this.isProcessing=!1,this.queue.length>0?this.process():(this.finalize(),this.onQueueComplete&&this.onQueueComplete())}filterData(e){return e}async addToQueue(e){const t=this.filterData(e);this.queue.push(t),this.isProcessing||this.process()}async notifyPreviousItem(e){"thinking"===e.type?await this.finishThinking(e):"chunk"===e.type&&await this.finishChunk(e)}async processItem(e){const{type:t}=e;e.messageId&&(this.lastMessageId=e.messageId);const s=e.action||e.data?.action,a=e.taskId||e.messageId;switch(this.forwardingManager&&this.useForwarding&&("started"===t&&s&&this.forwardingManager.startSession(a,s,this.instanceId)&&(this.currentForwardingSession=a),"finished"===t&&this.currentForwardingSession&&(this.forwardingManager.endSession(this.currentForwardingSession),this.currentForwardingSession=null),"end"===t&&this.currentForwardingSession&&(this.forwardingManager.endSession(this.currentForwardingSession),this.currentForwardingSession=null)),t){case"thinking":await this.processThinking(e);break;case"holding":await this.processHolding(e);break;case"chunk":await this.processChunk(e,this.currentForwardingSession,this.useForwarding,this.forwardingManager.newOnly);break;case"started":case"finished":case"status":case"status_start":case"status_end":case"status_error":case"error":case"action":await this.processStatus(e,this.instanceId);break;case"end":await this.finalize(e)}}async clear(){this.queue=[],this.isProcessing=!1,E.forEach(e=>{e.stopTyping(),e.cleanup()}),this.currentForwardingSession&&this.forwardingManager&&(this.forwardingManager.endSession(this.currentForwardingSession),this.currentForwardingSession=null),this.onQueueComplete&&this.onQueueComplete()}async endResponse(){this.queueHistory=[]}async finalize(e){this.lastMessageId&&await this.finishChunk({messageId:this.lastMessageId}),this.isProcessing=!1,this.queue=[]}}let R=null;class j{constructor(e={}){this.initialHandlers={...e},this.dynamicHandlers={},this.handlers={...e},this.activeSessions=new Map}register(e,t,s={}){const a=s.instanceId?`${e}:${s.instanceId}`:e;return this.dynamicHandlers[a]={handler:t,mode:s.mode||"dual",animated:!1!==s.animated,subscriptionMode:s.subscriptionMode||"delta",instanceId:s.instanceId},this._rebuildHandlers(),()=>{delete this.dynamicHandlers[a],this._rebuildHandlers()}}_rebuildHandlers(){this.handlers={...this.initialHandlers},Object.assign(this.handlers,this.dynamicHandlers)}startSession(e,t,s=null){const a=s?`${t}:${s}`:null,r=a&&this.handlers[a]||this.handlers[t];return!(!r||r.instanceId&&r.instanceId!==s||(this.activeSessions.get(e)||this.activeSessions.set(e,{action:t,handler:r.handler,mode:r.mode,animated:r.animated,subscriptionMode:r.subscriptionMode,instanceId:r.instanceId,lastText:"",fullText:"",streamEnded:!1}),0))}endSession(e){const t=this.activeSessions.get(e);t&&(t.streamEnded=!0,t.animated||this.cleanupSession(e))}cleanupSession(e){const t=this.activeSessions.get(e);if(t){if(t.handler&&t.fullText)try{t.handler(null,t.fullText,{action:t.action,event:"end",isLive:!1})}catch(s){}this.activeSessions.delete(e)}}isActive(e){return this.activeSessions.has(e)}getSession(e){return this.activeSessions.get(e)}forwardChunk(e,t,s=!0){const a=this.activeSessions.get(e);if(!a)return!1;const r=t||"";if(0===r.length&&s)return!0;let n,i;"full"===a.subscriptionMode?(i=r,n=r):(a.fullText+=r,n=r,i=a.fullText);try{a.handler(n,i,{action:a.action,isLive:!a.streamEnded&&s,event:"chunk",subscriptionMode:a.subscriptionMode})}catch(o){}return!0}shouldReplace(e){const t=this.activeSessions.get(e);return t&&"replace"===t.mode}isAnimated(e){const t=this.activeSessions.get(e);return t&&t.animated}getSubscriptionMode(e){const t=this.activeSessions.get(e);return t?t.subscriptionMode:"delta"}getActiveSessions(){return Array.from(this.activeSessions.keys())}clearAll(){this.activeSessions.clear()}}function D(e){return R?e&&Object.keys(e).length>0&&(R.initialHandlers={...e},R._rebuildHandlers()):R=new j(e),R}function L(e){R=e}function O(){R=null}const P={'code[class*="language-"]':{color:"#d7d5d1",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",fontSize:"14px",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none"},'pre[class*="language-"]':{color:"white",fontFamily:'Consolas, Monaco, "Andale Mono", "Ubuntu Mono", monospace',textAlign:"left",whiteSpace:"pre",wordSpacing:"normal",wordBreak:"normal",wordWrap:"normal",lineHeight:"1.5",MozTabSize:"4",OTabSize:"4",tabSize:"4",WebkitHyphens:"none",MozHyphens:"none",msHyphens:"none",hyphens:"none",padding:"1em",margin:"0.5em 0",overflow:"auto",background:"#1e1e1e",borderRadius:"15px"},'pre[class*="language-"]::-moz-selection':{textShadow:"none",background:"#0e0c0a"},'pre[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#0e0c0a"},'code[class*="language-"]::-moz-selection':{textShadow:"none",background:"#0e0c0a"},'code[class*="language-"] ::-moz-selection':{textShadow:"none",background:"#0e0c0a"},'pre[class*="language-"]::selection':{textShadow:"none",background:"#0e0c0a"},'pre[class*="language-"] ::selection':{textShadow:"none",background:"#0e0c0a"},'code[class*="language-"]::selection':{textShadow:"none",background:"#0e0c0a"},'code[class*="language-"] ::selection':{textShadow:"none",background:"#0e0c0a"},':not(pre) > code[class*="language-"]':{color:"white",background:"#222222",padding:"0.1em",borderRadius:"0.3em",whiteSpace:"normal"},comment:{color:"#545053"},string:{color:"#838083"},number:{color:"#838083"},builtin:{color:"#838083"},char:{color:"#838083"},constant:{color:"#838083"},variable:{color:"#838083"},"class-name":{color:"#D7D5D1"},function:{color:"#D7D5D1"},tag:{color:"#838083"},"attr-name":{color:"#D7D5D1"},selector:{color:"#838083"},important:{fontWeight:"bold"},bold:{fontWeight:"bold"},italic:{fontStyle:"italic"}},$=t=>{return t&&(s=e.Children.toArray(t).map(e=>"string"==typeof e?e:e?.props?.children?e.props.children+"":"").join(""))&&/[\u0600-\u06FF\u0750-\u077F\u08A0-\u08FF\uFB50-\uFDFF\uFE70-\uFEFF]/.test(s)?"rtl":"ltr";var s},U=t(null);function B(e,t,n={}){const i=s(U),o=void 0!==n.instanceId?n.instanceId:i,c=o?{instanceId:o}:{},l=F(),d=a(t);r(()=>{d.current=t},[t]),r(()=>{const t=[];if("object"==typeof e&&null!==e)Object.entries(e).forEach(([e,s])=>{if("*"===e){const e=l.registerGlobal(s,c);t.push(e)}else{const a=l.register(e,s,c);t.push(a)}});else if("string"==typeof e){const s=e=>d.current?.(e);if("*"===e){const e=l.registerGlobal(s,c);t.push(e)}else{const a=l.register(e,s,c);t.push(a)}}return()=>{t.forEach(e=>e?.())}},[e,o])}const W=t({});function J(){return s(W)}function K({children:t,initialWelcome:s={title:"Welcome to AI Chat Agent",description:"A perfect agent library for your needs, for docs visit oblien.com/docs/chat-agent"},refreshTokenCallback:c,markdownComponents:l,typingAnimation:d={mode:"char",speed:200},statusComponents:m,forwardingHandlers:u={},authConfig:p,enableHistory:f=!0,loadingComponent:y,allowThinking:b=!0,headerComponent:w,config:k,agentId:v,className:T="h-full w-full",onError:C}){const E=a(v||"chat-"+Math.random().toString(36).substring(2,9)).current,[A,q]=n(!0),[H,R]=n(p?.sessionId),[j,L]=n(!1),[O,B]=n(!1),[J,K]=n(!1),[G,Q]=n(null),[Y,X]=n(null),[Z,V]=n(!1),[ee,te]=n(!1),[se,ae]=n(null),re=a(s).current,[ne,ie]=n([]),oe=a(!1),ce=a(!1),le=a(new I),de=a(null),he=i(()=>F(),[]),ge=a(new S),me=a(new x(ge.current,k)),ue=a(new N(me.current)),pe=a(D(u)),fe=a(new M(le.current,he)),ye=a(new z(fe.current,pe.current,Object.keys(u).length>0,E)),be=o(()=>{const e=oe.current||ce.current;B(e),e||L(!1)},[]);r(()=>{ye.current.onQueueComplete=()=>{ce.current=!1,be()}},[be]);const xe=a(l||((e={})=>({code({node:e,inline:t,className:s,children:a,...r}){const n=/language-(\w+)/.exec(s||""),i=(a+"").replace(/\n$/,""),o=!t&&i.includes("\n");return t||!o?g("code",{className:"inline-code px-1.5 py-0.5 rounded text-sm font-mono whitespace-pre-wrap",...r,children:a}):g("div",{className:"code-block rounded-lg overflow-hidden my-4",children:g(h,{language:n?.[1]||"javascript",style:P,customStyle:{margin:0,borderRadius:0},children:i})})},p:({children:e})=>{const t=$(e);return g("p",{className:"mb-4 leading-relaxed last:mb-0",dir:t,children:e})},ul:({children:e})=>{const t=$(e);return g("ul",{className:"my-3 space-y-1 list-disc list-outside "+("rtl"===t?"pr-6":"pl-6"),dir:t,children:e})},ol:({children:e})=>{const t=$(e);return g("ol",{className:"my-3 space-y-1 list-decimal list-outside "+("rtl"===t?"pr-6":"pl-6"),dir:t,children:e})},li:({children:e})=>{const t=$(e);return g("li",{className:"leading-relaxed "+("rtl"===t?"pr-1":"pl-1"),dir:t,children:e})},h1:({children:e})=>{const t=$(e);return g("h1",{className:"markdown-h1 mb-4 mt-6 first:mt-0 leading-[1.25]",dir:t,children:e})},h2:({children:e})=>{const t=$(e);return g("h2",{className:"markdown-h2 mb-4 mt-6 first:mt-0 leading-[1.3]",dir:t,children:e})},h3:({children:e})=>{const t=$(e);return g("h3",{className:"markdown-h3 mb-3 mt-5 first:mt-0 leading-[1.4]",dir:t,children:e})},h4:({children:e})=>{const t=$(e);return g("h4",{className:"markdown-h4 mb-2 mt-4 first:mt-0 leading-[1.4]",dir:t,children:e})},h5:({children:e})=>{const t=$(e);return g("h5",{className:"markdown-h5 mb-2 mt-4 first:mt-0 leading-[1.5]",dir:t,children:e})},h6:({children:e})=>{const t=$(e);return g("h6",{className:"markdown-h6 mb-2 mt-4 first:mt-0 leading-[1.5]",dir:t,children:e})},blockquote:({children:e})=>{const t=$(e);return g("blockquote",{className:"markdown-blockquote py-1 my-4 italic "+("rtl"===t?"pr-4 border-r-4":"pl-4 border-l-4"),dir:t,children:e})},strong:({children:e})=>g("strong",{className:"markdown-strong font-semibold",children:e}),em:({children:e})=>g("em",{className:"markdown-em italic",children:e}),a:({children:e,href:t})=>g("a",{href:t,className:"markdown-link text-blue-400 hover:text-blue-300 underline decoration-blue-400/30 hover:decoration-blue-300/50 transition-colors",target:"_blank",rel:"noopener noreferrer",children:e}),hr:()=>g("hr",{className:"markdown-hr my-6"}),table:({children:e})=>g("div",{className:"overflow-x-auto my-4",children:g("table",{className:"markdown-table min-w-full border-collapse",children:e})}),thead:({children:e})=>g("thead",{className:"markdown-thead",children:e}),tbody:({children:e})=>g("tbody",{className:"markdown-tbody",children:e}),tr:({children:e})=>g("tr",{className:"markdown-tr transition-colors",children:e}),th:({children:e})=>g("th",{className:"markdown-th px-4 py-2 text-left font-semibold text-sm",children:e}),td:({children:e})=>g("td",{className:"markdown-td px-4 py-2 text-sm",children:e}),input:({type:e,checked:t,...s})=>g("input","checkbox"===e?{type:"checkbox",checked:t,disabled:!0,className:"mr-2 align-middle",...s}:{type:e,...s}),del:({children:e})=>g("del",{className:"markdown-del line-through",children:e}),pre:({children:e})=>g("pre",{className:"overflow-x-auto",children:e}),...e}))()).current,we=a(y),ke=a(m),ve=a(w);r(()=>{y!==we.current&&(we.current=y),m!==ke.current&&(ke.current=m),w!==ve.current&&(ve.current=w),c&&ge.current.setRefreshCallback(c)},[y,m,w,c]);const Ne=a(!1),Se=a(H),Ie=a(null);_.current=d;const Me=a(new Set);r(()=>{const e=le.current.subscribe(e=>{ie(e)});return()=>{e()}},[]),r(()=>{Se.current=H},[H]);const Te=a(!1);r(()=>{(async()=>{if(p&&p.sessionId)try{await ge.current.setAuth(p)}catch(G){let t="Authentication failed. Please refresh the page.";G?.message?.includes("No refresh token")?t="Session expired. Please refresh the page to continue.":G?.message&&(t=G.message),Q({type:"auth_error",message:t,error:G}),q(!1)}else q(!1)})()},[!1,p]);const Ce=o(e=>{Q(e.error)},[]),Fe=o(async()=>{if(f)try{if(Me.current.has(H))return void q(!1);Me.current.add(H),q(!0);const e=await me.current.getHistory();if(e.error)return Ce(e),void q(!1);e.history&&e.history.length>0&&le.current.insertMessages(e.history,"end"),te(!!e.has_more),q(!1)}catch(e){let t="Could not load message history.";e?.message?.includes("No refresh token")?t="Session expired. Please refresh the page to continue.":e?.message?.includes("Network")?t="Network error. Please check your connection.":e?.message&&(t=e.message),Q({type:"history_error",message:t,error:e}),q(!1)}else q(!1)},[H,Ce,f]);r(()=>{(async()=>{H&&!Te.current?(Te.current=!0,await Fe()):H||Te.current||(Te.current=!0,q(!1))})()},[H,Fe]);const _e=o(()=>(oe.current=!1,ce.current=!1,B(!1),L(!1),K(!1),ye.current.clear(),de.current=null,me.current.abort(),ue.current.abort()),[]),Ee=o(e=>{const t={...e,id:e?.id||Math.random().toString(36).substring(2,9),timestamp:Date.now()};X(t),C&&C(t)},[C]),Ae=o(()=>{X(null)},[]),qe=o(()=>{oe.current=!1,de.current&&(ye.current.endResponse(),de.current=null),be()},[be]),He=o(()=>{Ne.current=!1,oe.current=!1,be()},[be]),ze=o(e=>{const t=e?.data?.messageId||e?.messageId;t&&(de.current=t),J||K(!0),ce.current=!0,ye.current.addToQueue(e),be()},[J,be]);r(()=>(ue.current.on("stream_error",Ee),ue.current.on("response",ze),ue.current.on("response_end",qe),ue.current.on("disconnect",He),()=>{ue.current.off("stream_error",Ee),ue.current.off("response",ze),ue.current.off("response_end",qe),ue.current.off("disconnect",He)}),[Ee,ze,qe,He]);const Re=async({messageId:e=Math.random().toString(36).substring(2,9),message:t="",attachedFiles:s=[],uploadId:a=null}={})=>{if(!t.trim())return;const r="user-"+e;try{Ie.current&&Ie.current?.messageId===r||fe.current.handleUserMessage({messageId:r,text:t,attachedFiles:s}),Ie.current={messageId:r,message:t,attachedFiles:s,uploadId:a},L(!0),K(!1),oe.current=!0,be();const e=pe.current.handlers._stream_feedback,n=e?.handler,i="raw"===e?.mode,o=await ue.current.startStream({message:t,attachedFiles:s,uploadId:a,sessionId:Se.current,context:null,allowThinking:b},n,i);o.status||(oe.current=!1,be(),Ee({errorType:"connection_error",error:o.error||"Error occurred while connecting to server",message:o.message||"Failed to send message"}))}catch(n){oe.current=!1,be(),Ee({errorType:"send_error",error:n.message||"Unknown error",message:"Failed to send message"})}finally{L(!1)}},je=o(async()=>{Ie.current&&await Re(Ie.current)},[]),De=i(()=>({addMessage:e=>le.current.addMessage(e),updateMessage:(e,t)=>le.current.updateMessage(e,t),removeMessage:e=>le.current.removeMessage(e),getMessage:e=>le.current.getMessage(e),clear:()=>le.current.clear()}),[]),Le=i(()=>({register:(e,t)=>he.register(e,t,{instanceId:E}),registerGlobal:e=>he.registerGlobal(e,{instanceId:E})}),[E,he]);return e.createElement("div",{className:"react-chat-agent "+T},e.createElement(W.Provider,{value:{sendMsg:Re,messages:ne,messageManager:De,isLoading:j,isStreaming:O,isResponseStarted:J,isInitialLoading:A,isLoadingMore:Z,error:G,streamError:Y,clearStreamError:Ae,getHistory:Fe,loadMoreMessages:async()=>{if(f&&!Z&&ee){V(!0);try{const e=le.current.count,t=await me.current.getHistory({offset:e,limit:20});if(t.error)return Ce(t),void V(!1);t.history&&t.history.length>0?(le.current.insertMessages(t.history,"start"),te(t.has_more)):te(!1)}catch(e){Q({type:"load_more_error",message:"Failed to load more messages",error:e})}finally{V(!1)}}},hasMoreMessages:ee,enableHistory:f,retryLastMessage:je,abort:_e,sessionId:H,setSessionId:R,instanceId:E,currentSelectedFile:se,setCurrentSelectedFile:ae,welcome:re,statusRegistry:Le,markdownComponents:xe,statusComponents:ke.current,loadingComponent:we.current,headerComponent:ve.current,typingAnimation:d}},e.createElement(U.Provider,{value:E},t)))}const G={send:"/arrow up md-61-1696832363.png",attach:"/attach-1-1662364367.png",public:"/world-229-1658433759.png",arrowDown:"/chevron down-4-1696832126.png",close:"/close remove-802-1662363936.png",add:"/plus 4-12-1662493809.png",logs:"/website terminal-62-1658431404.png",terminal:"/terminal-184-1658431404.png",minimize:"/chevron down-4-1696832126.png",removeBold:"/delete-29-1661490994.png",info:"/info menu-42-1661490994.png",leftSidebar:"/grid interface-166-1658433281.png",file:"/document-180-1658431575.png",folder:"/folder file-32-1661323044.png",tick:"/check circle-3-1660219236.png",square:"/square-38-1666783764.png",search:"/search-123-1658435124.png",check:"/checkmark-7-1660219236.png",lock:"/lock-62-1691989601.png",discord:"/discord-141-1693375491.png",twitter:"/x.com-179-1693375584.png",refresh:"/refresh right-64-1696832204.png",back:"/arrow right md-49-1696832059.png",home:"/home-123-1658433759.png",forward:"/arrow left md-33-1696832059.png",newTab:"/new tab-123-1658433759.png",devTools:"/developer tools-123-1658433759.png",externalLink:"/External_link_HtLszLDBXqHilHK674zh2aKoSL7xUhyboAzP.png",deploy:"/space rocket-88-1687505465.png",projects:"/git fork-163-1658431404.png",settings:"/setting-100-1658432731.png",logout:"/Logout_q9Ri9V6YI29BipbKthCSXYDM0WoxMC05JTYO.png",notfound:"/search not found-92-1666688362.png",chatai:"/chat intelligence-6-1686046192.png",credit:"/bank card-91-1658234909.png",question:"/question mark circle-29-1662452248.png",blank:"/code-15-1658431404.png",react:"/react-native-29-1693375583.png",nextjs:"/next js circle-172-1693375539.png",vue:"/vue-160-1693375217.png",angular:"/angular-62-1693375491.png",node:"/npm-183-1693375539.png",python:"/python-122-1662819152.png",mobile:"/iphone-36-1658434492.png",laravel:"/laravel-108-1693375539.png",php:"/php-7-1693375216.png",url:"/link-68-1692683696.png",grid:"/gallery view-155-1658433281.png",list:"/bulleted list-15-1692683663.png",download:"/Download_61W5ztaZuYZoYEY7utQW7FU1y4lMiUO2rHjg.png",upload:"/upload-123-1658433759.png",starfilled:"/star-31-1660810259.png",edit:"/pen-304-1658238246.png",globe:"/earth-30-1687505545.png",minus:"/minus 4-9-1660810450.png",switch:"/changing-330-1658238246.png",history:"/counter clockwise undo-46-1658435834.png",golang:"/Go_Logo_Blue.svg.png",github:"/github-8-1693375538.png",pull:"/git pull-170-1658431404.png",sync:"/update left-39-1696832255.png",error:"/error triangle-16-1662499385.png",reload:"/flash refresh-94-1658434699.png",filter:"/filter-25-1662364403.png",sets:"/setting-41-1662364403.png",read:"/eye-20-1691989638.png",index:"/database-27-1658237565.png",debug:"/terminal-184-1658431404.png",brain:"/brain-41-1686045820.png",command:"/command-147-1658431404.png",pdf:"/document pdf-66-1662364367.png",websocket:"/power outlet-81-1689918655.png",ai:"/ai chip-118-1686045593.png",dashboard:"/dashboard 6-8-1662364403.png",store:"/store-30-1662820309.png",icons:"/ui8-139-1693375584.png",build:"/tools-58-1662364403.png",linkedin:"/linkedin-113-1693375539.png",support:"/headphone-24-1663753435.png",nofee:"/snow%20bag-318-1672139659.png",anytime:"/circle%20clock-39-1658435834.png",free:"/bird-106-1678249964.png",cloud:"/cloud%20connect-56-1658236831.png",code:"/code-12-1658431404.png",screenshot:"/scan%20image-226-1658434699.png",pagecontent:"/web%20page%20download-36-1658436291.png",improve:"/ai%20neural%20share-142-1686045754.png",roadmap:"/roadmap-159-1681196175.png"},Q={figma:"/icons/project/Figma-logo.svg.png",githubraw:"/icons/project/github-mark-white.png"},Y=(e,t,s="#000",a={},r=!1)=>r?g("img",{src:Q[e]?.replace(/ /g,"%20"),alt:e,style:{width:t,height:t,objectFit:"contain",...a}}):g("div",{style:{maskImage:`url('https://cdn.oblien.com/static/png-icons/${G[e]?.replace(/ /g,"%20")||e?.replace(/ /g,"%20")}')`,maskSize:"contain",maskRepeat:"no-repeat",maskPosition:"center",WebkitMaskSize:"contain",WebkitMaskRepeat:"no-repeat",WebkitMaskPosition:"center",width:t,height:t,backgroundColor:s,...a}}),X=({error:e})=>{const{welcome:t}=J(),s=(()=>{if(!e)return null;let t="";return t="string"==typeof e?e:e.message?e.message:e.error?"string"==typeof e.error?e.error:e.error.message||"An error occurred":"An unexpected error occurred",t})();return g("div",{className:"react-chat-agent-start-chat flex flex-col items-center justify-center h-full",children:"object"!=typeof t||t?.title?m("div",{className:"react-chat-agent-start-chat-content text-center mb-8 flex flex-col items-center justify-center gap-2",children:[e&&g("span",{className:"react-chat-agent-start-chat-error-icon",children:Y("error",70,"currentColor",{marginBottom:"10px"})}),g("h2",{className:"react-chat-agent-start-chat-title text-2xl font-light text-theme-primary mb-4",children:e?"Something went wrong":t?.title}),g("p",{className:"react-chat-agent-start-chat-description text-theme-muted mb-6 max-w-md text-base leading-relaxed",children:e?s:t?.description}),e&&e.type&&g("p",{className:"react-chat-agent-start-chat-error-type text-xs text-theme-tertiary mt-2 opacity-50",children:e.type.replace("_"," ")})]}):t})},Z=({message:e,allowEdit:t=!0})=>{const s=[];return t&&s.push({icon:"edit",text:"Edit",onClick:()=>{}}),e.snapshot&&s.push({icon:"refresh",text:"Restore checkpoint",onClick:()=>{}}),m("div",{className:"react-chat-agent-user-message flex flex-col mb-2",children:[g("div",{className:"react-chat-agent-user-message-bubble-wrapper flex justify-end mb-2",children:g("div",{className:"react-chat-agent-user-message-bubble bg-secondary text-theme-primary px-4 py-2 rounded-[20px] max-w-xs md:max-w-md",style:{wordBreak:"break-word"},children:g("p",{className:"react-chat-agent-user-message-text text-[16px] leading-[22px] tracking-wide",children:e.text})})}),g("div",{className:"react-chat-agent-user-message-actions flex justify-end gap-4",children:s.map((e,t)=>m("button",{className:`react-chat-agent-user-message-action react-chat-agent-user-message-action-${e.icon} flex items-center gap-1 opacity-25`,onClick:e.onClick,children:[g("span",{className:"react-chat-agent-user-message-action-icon",children:Y(e.icon,16,"currentColor")}),g("span",{className:"react-chat-agent-user-message-action-label text-[12px] font-[300] text-theme-primary",children:e.text})]},t))})]})},V=({message:e})=>{const{markdownComponents:t}=J(),[s,a]=n("");return r(()=>{if(e.finalized||!e.isLive)return void a(e.text||"");const t=q(e.messageId);if(t)return t.subscribe(e=>{a(e)});a(e.text||"")},[e.messageId,e.finalized,e.isLive,e.text]),g("div",{className:"react-chat-agent-ai-response mb-4 mx-auto",children:g("div",{className:"react-chat-agent-ai-content text-theme-primary prose prose-invert max-w-none",style:{wordBreak:"break-word"},children:g(f,{components:t,children:s})})})},ee=({message:e,removeMessage:t})=>{const s=a(null),i=a(null),o=a(e.finalized),[c,l]=n(!e.finalized),d=e.text||"",u=e.isLive||!e.finalized,p=e.finalized,f=e.duration||0;return r(()=>{s.current&&c&&u&&(s.current.scrollTop=s.current.scrollHeight)},[d,c,u]),r(()=>{p&&!o.current&&(setTimeout(()=>{l(!1)},800),e.autoCleanup&&setTimeout(()=>{t?.(e.messageId)},1500))},[p,e.autoCleanup,e.messageId,t]),m("div",{className:"react-chat-agent-thinking-message mb-4 mx-auto opacity-50",children:[p?m("button",{onClick:()=>{l(!c)},className:"react-chat-agent-thinking-toggle react-chat-agent-thinking-toggle-finished text-theme-tertiary text-sm hover:text-theme-secondary transition-colors mb-2 flex items-center gap-2",children:[g("span",{className:"react-chat-agent-thinking-toggle-icon",children:Y(c?"brain-10-1663078315.png":"brain-11-1663755045.png",20,"currentColor")}),m("span",{className:"react-chat-agent-thinking-toggle-text",children:["Thought for ",f," second",1!==f?"s":""]})]}):m("div",{className:"react-chat-agent-thinking-header text-theme-tertiary text-sm hover:text-theme-secondary transition-colors mb-2 flex items-center gap-2",children:[g("span",{className:"react-chat-agent-thinking-icon",children:Y("brain-11-1663755045.png",20,"currentColor")}),g("span",{className:"react-chat-agent-thinking-label",children:"Thinking..."})]}),c&&d&&g("div",{ref:s,className:"react-chat-agent-thinking-content-scroll max-h-[150px] overflow-y-auto scrollbar-thin scrollbar-track-transparent",style:{scrollBehavior:"smooth",WebkitMaskImage:"linear-gradient(to top, transparent 0%, black 60%, transparent 98%)",maskImage:"linear-gradient(to top, transparent 0%, black 60%, transparent 98%)"},children:g("div",{ref:i,className:"react-chat-agent-thinking-content text-theme-primary prose prose-invert max-w-none whitespace-pre-wrap text-sm pt-10",style:{wordBreak:"break-word",opacity:u?.8:1,transition:"opacity 0.15s ease"},children:g(y,{components:{code({node:e,inline:t,className:s,children:a,...r}){const n=/language-(\w+)/.exec(s||""),i=(a+"").replace(/\n$/,""),o=!t&&i.includes("\n");return t||!o?g("code",{className:"react-chat-agent-thinking-code-inline px-1 py-0.5 bg-secondary rounded text-xs font-mono whitespace-pre-wrap",...r,children:a}):g("div",{className:"react-chat-agent-thinking-code-block rounded-[15px] overflow-hidden my-3",children:g(h,{language:n?.[1]||"javascript",style:P,children:i})})},p:({children:e})=>g("p",{className:"react-chat-agent-thinking-paragraph mb-2 leading-5 text-sm",children:e}),ul:({children:e})=>g("ul",{className:"react-chat-agent-thinking-list react-chat-agent-thinking-list-unordered list-disc pl-5 mb-3 grid text-sm",children:e}),ol:({children:e})=>g("ol",{className:"react-chat-agent-thinking-list react-chat-agent-thinking-list-ordered list-decimal pl-5 mb-3 grid text-sm",children:e}),li:({children:e})=>g("li",{className:"react-chat-agent-thinking-list-item mb-1 text-sm",children:e}),h1:({children:e})=>g("h1",{className:"react-chat-agent-thinking-heading react-chat-agent-thinking-heading-1 text-lg font-semibold mb-2 mt-3",children:e}),h2:({children:e})=>g("h2",{className:"react-chat-agent-thinking-heading react-chat-agent-thinking-heading-2 text-base font-semibold mb-2 mt-3",children:e}),h3:({children:e})=>g("h3",{className:"react-chat-agent-thinking-heading react-chat-agent-thinking-heading-3 text-sm font-semibold mb-1 mt-2",children:e}),blockquote:({children:e})=>g("blockquote",{className:"react-chat-agent-thinking-blockquote border-l-4 border-gray-600 pl-3 italic my-3 text-theme-quaternary text-sm",children:e})},children:d})})})]})},te=({text:e,style:t,fontSize:s="1em",paddingRight:a="140px",backgroundSize:r="125px",isDark:n=!1})=>{let i=1;"string"==typeof s?i=parseFloat(s)||3:"number"==typeof s&&(i=s);let o=r;"125px"===r&&"3em"!==s&&(o=i/3*125+"px");const c={fontSize:s,paddingRight:a,WebkitBackgroundSize:o+" 100%",MozBackgroundSize:o+" 100%",backgroundSize:o+" 100%",...t};return g("div",{className:"react-chat-agent-shimmer-text shimmer "+(n?"dark":"light"),style:c,children:e})},se=({message:e,title:t,isProcessing:s,isFinished:a,icon:r,iconComponent:n,isFlat:o,onClick:c,isDark:l=!1,unmountOnExit:d,action:h,data:u,className:p,style:f})=>{const y=h||e?.action,b=u||e?.data,x=void 0!==a?a:e?.isFinished,w=void 0!==s?s:!x,k=t||e?.title,v=r||e?.icon,N=n||e?.iconComponent,S=void 0!==o?o:e?.isFlat,I=void 0!==d?d:e?.unmountOnExit,M=c,T=i(()=>k||(y?(({data:e,action:t,isFinished:s})=>{if(!t||"string"!=typeof t)return"Processing...";try{const a=t.replace(/([A-Z])/g," $1").replace(/_/g," ").trim().split(/\s+/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()).join(" ");return s?a:`${a}${e?.tool?" "+e?.tool:""}...`}catch(a){return t}})({data:b,action:y,isFinished:x}):"Processing..."),[k,y,x,b]);return g("div",S?{className:"mb-[-2px] mx-auto "+p,style:{cursor:M?"pointer":"default",...f},onClick:M,children:m("div",{className:`flex items-center gap-3 px-0 rounded-[12px] text-${l?"white":"black"} relative overflow-auto`,children:[I?g("div",{className:`animate-spin h-[16px] w-[16px] mr-[4px] absolute border-[1.5px] border-${l?"white":"black"} rounded-full border-t-transparent opacity-50`}):N?N():Y(v||"check circle-3-1660219236.png",20,l?"rgba(255,255,255,0.25)":"rgba(0,0,0,0.25)",{position:"absolute"}),w?g(te,{isDark:l,text:T,style:{fontSize:"14px",marginLeft:"30px"}}):g("span",{className:`text-[14px] text-${l?"white":"black"}/20 ml-[30px] ${N?"!ml-0":""}`,children:T})]})}:{className:"mb-[10px] mx-auto "+p,style:{cursor:M?"pointer":"default",...f},onClick:M,children:m("div",{className:`flex items-center p-3 rounded-[12px] text-${l?"white":"black"} relative overflow-hidden`,style:{backgroundColor:l?"rgba(255,255,255,0.02)":"rgba(0,0,0,0.02)"},children:[w?g("div",{className:`animate-spin h-[16px] w-[16px] mr-[4px] absolute border-[1.5px] border-${l?"white":"black"} rounded-full border-t-transparent opacity-50`}):N?N():Y(v||"check circle-3-1660219236.png",20,l?"rgba(255,255,255,0.8)":"rgba(0,0,0,0.8)",{position:"absolute"}),g("div",{className:"flex-1",children:w?g(te,{isDark:l,text:T,style:{marginLeft:"28px",marginTop:"-2px",color:l?"rgba(255,255,255,0.2)":"rgba(0,0,0,0.2)"}}):g("span",{className:`text-[14px] text-${l?"white":"black"}/50 ml-[30px]`,children:T})})]})})};var ae=c(({item:e,removeMessage:t,allowEditMessage:s,animationConfig:a})=>{const{statusComponents:r}=J();if("user"===e.sender)return g("div",{className:"react-chat-agent-message-item react-chat-agent-message-user",children:g(Z,{message:e,allowEdit:s})});if("status"===e.type&&e.action){const t=r?.[e.action];return g("div",{className:"react-chat-agent-message-item react-chat-agent-message-status",children:g(t||se,{message:e})})}return g("div","thinking"===e.type?{className:"react-chat-agent-message-item react-chat-agent-message-thinking",children:g(ee,{message:e,removeMessage:t})}:{className:"react-chat-agent-message-item react-chat-agent-message-ai",children:g(V,{message:e,animationConfig:a})})},(e,t)=>e.item.uniqueKey===t.item.uniqueKey);const re=({type:e})=>{const t=["w-1.5 h-1.5","w-2.5 h-2.5","w-1.5 h-1.5"],s="text"===e?["L","O","A","D","I","N","G"]:Array.from({length:3}).fill(""),a=.6+.1*(s.length-1);return g("div",{className:"react-chat-agent-loading-response flex",children:g("div",{className:"react-chat-agent-loading-content flex justify-center items-center "+("text"===e?"text-7xl font-extrabold font-[Montserrat]":"gap-1.5"),children:s.map((s,r)=>g(b.span,{className:`react-chat-agent-loading-item react-chat-agent-loading-item-${e} inline-block ${"text"===e?"mx-[-0.05em]":t[r]+" rounded-full bg-inverse"}`,animate:{scale:[.75,1.5,.75],opacity:[.75,1,.75],filter:["blur(4px)","blur(0px)","blur(4px)"]},transition:{repeat:1/0,duration:.6,ease:"easeInOut",repeatDelay:a-.6,delay:.1*r},children:"text"===e?s:""},r))})})},ne=()=>m("div",{className:"react-chat-agent-loading-mock space-y-8 px-5 pt-20 pb-40 w-full max-w-[800px] mx-auto",children:[m("div",{className:"react-chat-agent-loading-mock-welcome flex items-start gap-4 mb-12",children:[g("div",{className:"react-chat-agent-loading-mock-avatar react-chat-agent-loading-mock-avatar-welcome w-10 h-10 rounded-full shimmer-skeleton"}),m("div",{className:"react-chat-agent-loading-mock-content flex-1 space-y-3",children:[g("div",{className:"react-chat-agent-loading-mock-line react-chat-agent-loading-mock-line-1 h-4 rounded-full shimmer-skeleton w-2/3"}),g("div",{className:"react-chat-agent-loading-mock-line react-chat-agent-loading-mock-line-2 h-4 rounded-full shimmer-skeleton w-1/2"})]})]}),Array.from({length:2}).map((e,t)=>m("div",{className:"react-chat-agent-loading-mock-message-group space-y-6",children:[m("div",{className:"react-chat-agent-loading-mock-message react-chat-agent-loading-mock-message-user flex items-start gap-4 justify-end",children:[g("div",{className:"react-chat-agent-loading-mock-message-content max-w-[70%] space-y-2",children:g("div",{className:"react-chat-agent-loading-mock-line h-3 rounded-full shimmer-skeleton w-full"})}),g("div",{className:"react-chat-agent-loading-mock-avatar react-chat-agent-loading-mock-avatar-user w-8 h-8 rounded-full shimmer-skeleton"})]}),m("div",{className:"react-chat-agent-loading-mock-message react-chat-agent-loading-mock-message-ai flex items-start gap-4",children:[g("div",{className:"react-chat-agent-loading-mock-avatar react-chat-agent-loading-mock-avatar-ai w-8 h-8 rounded-full shimmer-skeleton"}),m("div",{className:"react-chat-agent-loading-mock-message-content flex-1 space-y-3",children:[g("div",{className:"react-chat-agent-loading-mock-line react-chat-agent-loading-mock-line-1 h-3 rounded-full shimmer-skeleton w-4/5"}),g("div",{className:"react-chat-agent-loading-mock-line react-chat-agent-loading-mock-line-2 h-3 rounded-full shimmer-skeleton w-3/4"})]})]})]},t))]}),ie=l(({isDark:e=!1,className:t="",allowEditMessage:s=!1,showWelcome:i=!0,showLoadMore:c=!0,showLoadingIndicator:l=!0,welcomeComponent:h,loadingComponent:f,containerStyle:y={},useGradientMask:b=!0,gradientMaskStyle:x="linear-gradient(to bottom, transparent 6.5%, black 18%)"},w)=>{const[k,v]=n(!1),N=a(!1),{sendMsg:S,messages:I,messageManager:M,isLoading:T,isStreaming:C,isPanelOpen:F,error:_,isInitialLoading:E,isResponseStarted:A,abort:q,loadMoreMessages:H,isLoadingMore:z,hasMoreMessages:R,enableHistory:j,animationConfig:D,loadingComponent:L}=J(),O=f||L,P=a(null),$=a(!0),U=p({count:I?.length||0,getScrollElement:()=>P.current,estimateSize:()=>150,overscan:10,measureElement:"undefined"!=typeof window&&-1===navigator.userAgent.indexOf("Firefox")?e=>e?.getBoundingClientRect().height:void 0}),B=o(()=>{const e=P.current;e&&(e.scrollTop=e.scrollHeight)},[]),W=o(()=>{const e=P.current;return!!e&&50>e.scrollHeight-e.scrollTop-e.clientHeight},[]);r(()=>{$.current&&I?.length>0&&B()},[I,B]),r(()=>{if(!C)return;const e=setInterval(()=>{$.current&&B()},100);return()=>clearInterval(e)},[C,B]);const K=o(()=>{const e=P.current;if(!e)return;const t=e.scrollTop>20;t!==N.current&&(N.current=t,v(t)),$.current=W()},[W]),G=o((e=>{let t=0;return function(...s){const a=Date.now();100>a-t||(t=a,e(...s))}})(K),[K]);r(()=>{const e=P.current;if(e)return e.addEventListener("scroll",G),()=>e.removeEventListener("scroll",G)},[G]);const Q=o(e=>{M&&M.removeMessage&&M.removeMessage(e)},[M]),Z=o(async e=>{$.current=!0,await S(e),setTimeout(B,100)},[S,B]);d(w,()=>({scrollToBottom:B,isAtBottom:W,scrollContainer:P.current,virtualizer:U,sendMessage:Z,abort:q,isStreaming:C,isLoading:T,messages:I,messageManager:M}),[B,W,U,Z,q,C,T,I,M]);const V=U.getVirtualItems();return g("div",{ref:P,className:"react-chat-agent react-chat-core overflow-y-auto scrollbar-hide "+t,"data-theme":e?"dark":"light",style:{WebkitMaskImage:b&&k?x:"none",...y},children:E?g(O||ne,{}):I&&0!==I.length?m("div",{className:"react-chat-core-messages",children:[c&&j&&R&&I.length>0&&!_&&!E&&g("div",{className:"react-chat-core-load-more flex justify-center py-4",children:g("button",{onClick:H,disabled:z,className:"react-chat-core-load-more-button flex items-center gap-2 text-theme-tertiary hover:text-theme-primary transition-colors disabled:opacity-50 disabled:cursor-not-allowed opacity-50",children:m(u,z?{children:[g("div",{className:"react-chat-core-load-more-spinner w-4 h-4 border-2 border-theme-primary border-t-theme-tertiary rounded-full animate-spin"}),g("span",{className:"react-chat-core-load-more-text text-sm",children:"Loading..."})]}:{children:[Y("refresh",18,"currentColor"),g("span",{className:"react-chat-core-load-more-text text-sm",children:"Load more messages"})]})})}),g("div",{className:"react-chat-core-virtual-container",style:{height:U.getTotalSize()+"px",width:"100%",position:"relative"},children:V.map(e=>{const t=I[e.index];return t?g("div",{"data-index":e.index,ref:U.measureElement,style:{position:"absolute",top:0,left:0,width:"100%",transform:`translateY(${e.start}px)`},children:g(ae,{item:t,removeMessage:Q,allowEditMessage:s,animationConfig:D})},t.uniqueKey||t.messageId||e.key):null})}),l&&T&&!A&&g(re,{})]}):i&&(h?g(h,{error:_}):g(X,{error:_,miniMode:F}))})});ie.displayName="ChatCore";var oe=c(ie);const ce=({todos:e=[]})=>e&&0!==e?.length?g("div",{className:"react-chat-agent-queue-manager flex w-[calc(100%-50px)] ml-[5px] items-end gap-2 top-0 z-9 absolute h-0",children:m("div",{className:"react-chat-agent-queue-manager-wrapper flex items-center w-full relative bottom-0",children:[g("div",{className:"react-chat-agent-queue-manager-backdrop backdrop-blur-[20px] w-full h-full z-0 absolute bg-theme-overlay border-b-0 rounded-t-[15px] "}),g("div",{className:"react-chat-agent-queue-manager-content flex items-center gap-2 w-full p-1 py-[5px] z-99"})]})}):null,le=({children:e,content:t,visible:s})=>s?m("div",{className:"react-chat-agent-tooltip-wrapper relative",children:[e,m("div",{className:"react-chat-agent-tooltip absolute bottom-full right-0 mb-2 w-64 p-3 bg-theme-surface rounded-lg shadow-lg z-50 backdrop-blur-sm",children:[g("div",{className:"react-chat-agent-tooltip-content text-theme-secondary text-sm space-y-2",children:t}),g("div",{className:"react-chat-agent-tooltip-arrow absolute top-full right-4 w-2 h-2 bg-theme-surface transform rotate-45 translate-y-[-4px]"})]})]}):e,de=()=>{const[e,t]=n(!1),{sessionMetrics:s,usedTokens:a,contextLimit:r}=J(),i=(100*(a/r||0)).toFixed(2),o=e=>e?1e6>e?1e3>e?""+e:(e/1e3).toFixed(1)+"K":(e/1e6).toFixed(1)+"M":"0",c=m("div",{className:"space-y-2",children:[g("div",{className:"font-medium text-theme-primary border-b border-theme-tertiary pb-1",children:"Session Info"}),m("div",{className:"space-y-1 text-xs",children:[m("div",{className:"flex justify-between",children:[g("span",{className:"text-theme-quaternary",children:"Context size:"}),m("span",{children:[o(s?.contextUsed)," / ",o(s?.contextLimit)]})]}),m("div",{className:"flex justify-between",children:[g("span",{className:"text-theme-quaternary",children:"Session Tokens:"}),g("span",{children:o(s?.tokensUsed)})]}),m("div",{className:"flex justify-between",children:[g("span",{className:"text-theme-quaternary",children:"All time tokens:"}),g("span",{children:o(s?.allTimeTokens)})]}),m("div",{className:"flex justify-between",children:[g("span",{className:"text-theme-quaternary",children:"Requests:"}),g("span",{children:o(s?.requests)})]})]})]});return g(le,{content:c,visible:e,children:m("div",{className:"react-chat-agent-progress-bar flex items-center gap-2 cursor-pointer",onMouseEnter:()=>t(!0),onMouseLeave:()=>t(!1),children:[m("span",{className:"react-chat-agent-progress-percentage text-theme-ghost font-light text-[12px] leading-[18px]",children:[i,"%"]}),m("div",{className:"react-chat-agent-progress-circle-wrapper relative w-4 h-4 flex items-center justify-center",children:[g("div",{className:"react-chat-agent-progress-circle-bg absolute inset-0 rounded-full bg-theme-muted"}),g("div",{className:"react-chat-agent-progress-circle-fill absolute inset-0 rounded-full",style:{background:`conic-gradient(var(--rca-text-faint) ${i}%, transparent 0)`}}),g("div",{className:"react-chat-agent-progress-circle-inner absolute inset-0.5 rounded-full bg-secondary"})]})]})})},he=({attachedFiles:e=[],removeFile:t})=>{const{currentSelectedFile:s,setIsHoldEnabled:a,setCurrentSelectedFile:r,manuallyAddedFiles:n=[],setManuallyAddedFiles:i=()=>{}}=J(),o=[...s?[s]:[],...n,...e];return m("div",{className:"react-chat-agent-chat-bar flex items-center w-full mb-2 justify-between",children:[m("div",{className:"react-chat-agent-chat-bar-left flex items-center",children:[o.length>0&&g(me,{files:o,handleRemoveFile:e=>{"object"==typeof e&&e.id?t&&t(e.id):e===s?(r(null),a(!1)):i(t=>t.filter(t=>t!==e))}}),m("button",{className:"react-chat-agent-context-button text-theme-primary hover:opacity-100 opacity-25 mr-2 flex items-center gap-1 whitespace-nowrap right-0 z-9 text-[12px] leading-relaxed ",children:[g("span",{className:"react-chat-agent-context-button-icon",children:Y("add",20,"currentColor",{marginLeft:"-5px"})}),0===o.length&&g("span",{className:"react-chat-agent-context-button-label",children:"Context"})]})]}),g("div",{className:"react-chat-agent-chat-bar-right",children:g(de,{})})]})},ge=({file:e,handleRemoveFile:t})=>{const[s,a]=n(!1),r="object"==typeof e&&e.id,i=r?e.name:e.split("/").pop(),o=r?e.id:e;return m("div",{className:"react-chat-agent-file-item flex items-center gap-2 px-2 py-[2px] bg-theme-subtle rounded-full cursor-pointer relative border border-theme-subtle",onMouseEnter:()=>a(!0),onMouseLeave:()=>a(!1),children:[s?g("button",{className:"react-chat-agent-file-item-remove w-[16px] opacity-50 hover:opacity-100 -ml-[2px] -mr-[2px] h-[16px]",onClick:s=>{s.stopPropagation(),t(e)},children:g("span",{className:"react-chat-agent-file-item-remove-icon",children:Y("close",16,"currentColor")})}):g("div",{className:"react-chat-agent-file-item-icon-wrapper",children:r&&e.preview?g("img",{src:e.preview,alt:i,className:"react-chat-agent-file-item-preview w-3 h-4 object-cover rounded",style:{marginRight:0,width:"12px",height:"16px"}}):g(FileIcon,{fileName:i,style:{marginRight:0,width:"12px",height:"16px"}})}),g("div",{className:"react-chat-agent-file-item-name text-theme-quaternary hover:text-theme-primary text-[12px] leading-relaxed whitespace-nowrap truncate max-w-[100px]",children:i})]},o)},me=({files:e,handleRemoveFile:t})=>g("div",{className:"react-chat-agent-file-items flex items-center gap-2 mr-2",children:e.map(e=>g(ge,{file:e,handleRemoveFile:t},"object"==typeof e&&e.id?e.id:e))}),ue=()=>{const[e,t]=n(0),s=a(),i=a(0),o=a(0);return r(()=>{o.current=performance.now(),i.current=e;const a=r=>{const n=r-o.current;o.current=r,i.current+=n/1e3*360,360>i.current||(i.current-=360);const c=Math.round(i.current);5>Math.abs(c-e)||t(c),s.current=requestAnimationFrame(a)};return s.current=requestAnimationFrame(a),()=>{s.current&&(cancelAnimationFrame(s.current),s.current=null)}},[]),g("div",{className:"react-chat-agent-loader-animation w-full h-full z-1 absolute rounded-[15px]",children:g("div",{className:"glowing pointer-events-none absolute inset-0 rounded-[inherit] opacity-100 transition-opacity safari:!hidden style_glowingEffect__yGXeX",style:{"--blur":"1px","--spread":"30","--active":"1","--start":e,display:"flex"},children:g("div",{className:"style_glow__i4Qpo"})})})},pe=()=>{const{streamError:e,clearStreamError:t,retryLastMessage:s,sendRequestCallback:a,triggerLoadingStates:r}=J(),[i]=n(e?.choices||[{id:"retry",label:"Retry"},{id:"cancel",label:"Cancel"}]);return e?g("div",{className:"react-chat-agent-stream-error w-full mb-3",children:m("div",{className:"react-chat-agent-error-content flex w-full justify-between items-center gap-3 px-3 py-2 bg-theme-faint rounded-lg border-l-2 border-[#ef4444]",children:[g("div",{className:"react-chat-agent-error-message-wrapper",children:g("div",{className:"react-chat-agent-error-message text-[12px] text-theme-primary font-medium",children:e.message||"An error occurred during streaming"})}),g("div",{className:"react-chat-agent-error-actions flex gap-2 items-center",children:i&&i.length>0&&i.map(n=>g("button",{onClick:()=>(async n=>{"retry"===n?"connection_error"===e.errorType?await s():(r(),a({type:"stream_error",callback:"retry",requestId:e.requestId})):"cancel"===n&&(e.requestId&&a({type:"stream_error",callback:"cancel",requestId:e.requestId}),t())})(n.id),className:`react-chat-agent-error-action react-chat-agent-error-action-${n.id} text-[11px] font-medium px-3 py-1 rounded-md transition-all duration-200\n ${"retry"===n.id?"text-theme-primary hover:text-theme-secondary underline underline-offset-2":"cancel"===n.id?"text-theme-subtle hover:text-theme-tertiary":"text-theme-tertiary hover:text-theme-primary"}\n `,children:n.label},n.id))})]})}):null};var fe=c(({onSendMessage:e,miniMode:t=!1,isStreaming:s,abort:i,todos:c})=>{const[l,d]=n(""),h=a(null),{attachedFiles:u,fileInputRef:p,onFileSelect:f,onPaste:y,removeFile:b,clearFiles:x}=function(){const[e,t]=n([]),s=a(null),r=o(async e=>{const t=await e.arrayBuffer(),s=await crypto.subtle.digest("SHA-256",t);return Array.from(new Uint8Array(s)).map(e=>e.toString(16).padStart(2,"0")).join("")},[]),i=o(async s=>{const a=[];for(const t of s){if(e.some(e=>e.name===t.name&&e.size===t.size&&e.type===t.type))continue;let s=!1;if(5242880>t.size)try{const n=await r(t);e.some(e=>e.hash===n)||(a.push({file:t,id:Date.now()+Math.random(),name:t.name,size:t.size,type:t.type,hash:n,preview:t.type.startsWith("image/")?URL.createObjectURL(t):null}),s=!0)}catch(n){}s||a.push({file:t,id:Date.now()+Math.random(),name:t.name,size:t.size,type:t.type,preview:t.type.startsWith("image/")?URL.createObjectURL(t):null})}a.length>0&&t(e=>[...e,...a])},[e,r]),c=o(e=>{const t=Array.from(e.target.files||[]);t.length>0&&i(t),e.target.value=""},[i]),l=o(e=>{const t=Array.from(e.clipboardData?.items||[]).filter(e=>"file"===e.kind).map(e=>e.getAsFile()).filter(Boolean);t.length>0&&(e.preventDefault(),i(t))},[i]),d=o(e=>{t(t=>{const s=t.filter(t=>t.id!==e),a=t.find(t=>t.id===e);return a?.preview&&URL.revokeObjectURL(a.preview),s})},[]),h=o(()=>{t(e=>(e.forEach(e=>{e.preview&&URL.revokeObjectURL(e.preview)}),[]))},[]);return{attachedFiles:e,fileInputRef:s,onFileSelect:c,onPaste:l,removeFile:d,clearFiles:h}}();r(()=>{h.current&&(h.current.style.height="auto",h.current.style.height=Math.min(h.current.scrollHeight,150)+"px")},[l]);const w=t=>{t.preventDefault(),(l.trim()||u.length>0)&&(e({message:l,attachedFiles:u}),d(""),x(),h.current&&(h.current.style.height="auto"))};return g("div",{className:"react-chat-agent-input absolute mx-auto bottom-0 w-full p-[15px] right-0 left-0 max-w-[600px] z-2",children:m("div",{className:"react-chat-agent-input-wrapper mx-auto min-h-[120px] relative",style:t?{minHeight:"110px"}:{},children:[s&&g(ue,{}),g("div",{className:"react-chat-agent-input-backdrop backdrop-blur-[20px] w-full h-full z-0 absolute bg-theme-overlay rounded-[15px]"}),m("div",{className:"react-chat-agent-input-content pt-[15px] px-[20px] mx-auto min-h-[120px] relative z-99",children:[g(ce,{todos:c}),g(pe,{}),g(he,{attachedFiles:u,removeFile:b}),g("div",{className:"react-chat-agent-input-textarea-wrapper relative pb-[50px]",children:g("textarea",{autoSave:"off",autoFocus:!1,autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",spellCheck:"false","data-form-type":"other",ref:h,value:l,onChange:e=>d(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),w(e))},onPaste:y,placeholder:"Type a message...",className:"react-chat-agent-textarea w-full text-[14px] text-theme-primary pr-12 min-h-[40px] max-h-[150px] resize-none outline-none bg-transparent",rows:1})}),m("div",{className:"react-chat-agent-input-actions flex items-center justify-between mt-auto bottom-[15px] absolute w-[calc(100%-40px)]",children:[m("div",{className:"react-chat-agent-input-actions-left flex items-center",children:[g("input",{ref:p,type:"file",multiple:!0,accept:"image/*,video/*,audio/*,.pdf,.doc,.docx,.txt,.md,.json,.js,.ts,.jsx,.tsx,.py,.html,.css,.xml,.csv",onChange:f,className:"react-chat-agent-file-input hidden"}),m("button",{type:"button",onClick:()=>p.current?.click(),className:"react-chat-agent-attach-button flex justify-center items-center cursor-pointer text-theme-primary rounded-full transition-colors hover:opacity-80 disabled:opacity-50 disabled:cursor-not-allowed",children:[Y("attach",18,"currentColor"),g("span",{className:"react-chat-agent-attach-label text-[14px] ml-2 font-[300]",children:"Attach"})]})]}),m("div",{className:"react-chat-agent-input-actions-right flex items-center",children:[m("button",{type:"button",className:"react-chat-agent-agent-button flex justify-center p-1 px-2 mr-2 items-center cursor-pointer text-theme-primary rounded-full transition-colors disabled:opacity-50 disabled:cursor-not-allowed",children:[Y("brain",18,"currentColor"),g("span",{className:"react-chat-agent-agent-label text-[12px] mx-2 text-theme-quaternary font-[300] -mt-[2px]",children:"Agent"}),Y("arrowDown",16,"currentColor",{transform:"rotate(180deg)"})]}),g("button",{type:"button",onClick:e=>{s?i():w(e)},className:"react-chat-agent-send-button w-[30px] h-[30px] flex justify-center items-center cursor-pointer bg-inverse text-inverse rounded-full transition-colors disabled:opacity-50 disabled:cursor-not-allowed",disabled:!l.trim()&&!s,children:Y(s?"square":"send",s?15:20,"currentColor")})]})]})]})]})})}),ye=c(({historyOpen:e,setHistoryOpen:t,isDark:s=!1,onCreateSession:a})=>{const[r,i]=n(!1),{headerComponent:o}=J();return m("div",{className:"react-chat-agent-header flex justify-between items-center py-2 px-5 absolute top-0 left-0 right-0 z-10",children:[m("div",{className:"react-chat-agent-header-left flex items-center gap-4 opacity-50",children:[g("button",{className:"react-chat-agent-header-new-chat flex items-center cursor-pointer hover:opacity-80",style:{opacity:r?.5:1,cursor:r?"progress":"pointer"},disabled:r,onClick:async({replace:e=!1}={})=>{if(a)try{i(!0),await a({replace:e})}catch(t){}finally{i(!1)}},children:Y("add",25,s?"#fff":"#000")}),g("div",{className:"react-chat-agent-header-history flex items-center cursor-pointer hover:opacity-80",onClick:e?()=>t(!1):()=>t(!0),children:Y(e?"close":"history",18,s?"#fff":"#000")})]}),o&&o(),g("div",{className:"react-chat-agent-header-right w-[80px]"})]})}),be=c(({isDark:e=!1,allowEditMessage:t=!1,useWebSocket:s=!1,children:r,onCreateSession:i,className:c="h-full w-full"})=>{const[l,d]=n(!1),h=a(null),{sendMsg:u,isStreaming:p,abort:f}=J(),y=o(async e=>{await u(e),setTimeout(()=>{h.current?.scrollToBottom()},100)},[u]);return m("div",{className:"react-chat-agent-panel flex flex-col h-full relative chat-panel "+c,"data-theme":e?"dark":"light",children:[g(ye,{historyOpen:l,setHistoryOpen:d,useWebSocket:s,isDark:e,onCreateSession:i}),m("div",{className:"relative flex-grow w-full max-w-[600px] mx-auto h-full min-w-[300px]",children:[g(oe,{ref:h,isDark:e,allowEditMessage:t,className:"react-chat-agent-chat-container absolute chat-container h-full flex-grow px-5 pt-20 pb-50 mb-[20px] w-full mx-auto"}),g(fe,{onSendMessage:y,isStreaming:p,abort:f})]}),r]})});class xe{constructor(e){this.tokenManager=e||new S,this.createSessionCallback=null,this.onSessionCreated=null}setCreateSessionCallback(e){this.createSessionCallback=e}setOnSessionCreated(e){this.onSessionCreated=e}async createSession(e={}){if(!this.createSessionCallback)throw Error("No session creation callback provided. Use SessionManager.setCreateSessionCallback()");try{const t=await this.createSessionCallback(e);if(!t||!t.sessionId)throw Error("Invalid session data: missing sessionId");if(!t.accessToken)throw Error("Invalid session data: missing accessToken");return tokenManager.setAuth(t),this.onSessionCreated&&this.onSessionCreated(t),t}catch(t){throw t}}getSessionId(){return tokenManager.getSessionId()}clearSession(){tokenManager.clear()}}function we(e,t,s={}){const n=D(),i=a(new Map),c=J(),l=c?.instanceId,d=a(t),h=a(s);r(()=>{d.current=t,h.current=s}),r(()=>{const s=[];if("object"!=typeof e||t){if("string"==typeof e&&t){const t=n.register(e,(...e)=>d.current(...e),{mode:h.current.mode||"dual",animated:!1!==h.current.animated,subscriptionMode:h.current.subscriptionMode||"delta",instanceId:l});s.push(t)}}else Object.entries(e).forEach(([e,t])=>{const a=n.register(e,(...e)=>t.handler(...e),{mode:t.mode||"dual",animated:!1!==t.animated,subscriptionMode:t.subscriptionMode||"delta",instanceId:l});s.push(a)});return()=>{s.forEach(e=>e())}},[e,n]);const g=o((e,t,s={})=>{const a=n.register(e,t,s);return i.current.set(e,a),a},[n]),m=o(e=>{const t=i.current.get(e);t&&(t(),i.current.delete(e))},[]),u=o(()=>n.getActiveSessions(),[n]),p=o(e=>n.handlers[e],[n]),f=o(()=>Object.entries(n.handlers).map(([e,t])=>({action:e,...t})),[n]);return{register:g,unregister:m,getActiveSessions:u,getHandler:p,getAllHandlers:f}}const ke=({modes:e=[],activeMode:t,onModeChange:s,isDark:a=!1})=>e&&e.length>1?g("div",{className:"react-chat-agent-mode-toggle toggle-container flex items-center bg-theme-faint rounded-full !ml-5 flex-shrink-0 h-[35px]",style:{padding:"4px"},children:e.map(e=>g("button",{onClick:()=>s(e.id),className:`react-chat-agent-mode-button ${t===e.id?"react-chat-agent-mode-button-active":"react-chat-agent-mode-button-inactive"} relative px-3 py-1 text-[12px] font-medium rounded-full transition-all duration-200\n ${t===e.id?"bg-background text-theme-primary":"text-theme-subtle hover:text-theme-tertiary hover:bg-theme-subtle"}\n `,children:m("div",{className:"react-chat-agent-mode-button-content flex items-center gap-1.5",children:[g("span",{className:"react-chat-agent-mode-button-icon",children:e.icon}),g("span",{className:"react-chat-agent-mode-button-label",children:e.label})]})},e.id))}):null;export{x as ChatApi,oe as ChatCore,ye as ChatHeader,fe as ChatInput,U as ChatInstanceContext,ne as ChatLoadingMock,be as ChatPanel,K as ChatProvider,j as ForwardingManager,re as LoadingResponse,ae as MessageItem,I as MessageManager,ke as ModeToggle,xe as SessionManager,te as ShimmerText,X as StartChat,se as StatusBlock,T as StatusHandlerRegistry,N as StreamService,S as TokenManager,w as WebSocketService,D as getGlobalForwardingManager,F as getGlobalStatusRegistry,O as resetGlobalForwardingManager,L as setGlobalForwardingManager,J as useChatContext,we as useForwarding,B as useStatusSubscription};
|