@m6d/cortex-react 1.0.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{useCallback as T,useEffect as D0,useMemo as D1,useRef as k_,useState as F_,useSyncExternalStore as n2}from"react";function P_(_){return Promise.resolve(_.getHeaders())}function w1(_,N){let k=_.baseUrl;return(typeof k==="string"?k:k()).replace(/\/$/,"")+N}function n0(_){let N=_?.match(/filename\*\s*=\s*[^']*'[^']*'([^;\r\n]+)/i)?.[1]?.trim().replace(/^"|"$/g,"");if(N)try{return decodeURIComponent(N)}catch{}return _?.match(/filename\s*=\s*"?([^";\r\n]+)"?/i)?.[1]}function h_(_){function N(){return P_(_())}function k(Z){return w1(_(),Z)}async function L(Z,J){let X=new Headers(await N());if(new Headers(J?.headers).forEach(function(K,z){X.set(z,K)}),J?.body instanceof FormData)X.delete("Content-Type");else if(!X.has("Content-Type"))X.set("Content-Type","application/json");let G=await fetch(k(Z),{...J,headers:X});if(!G.ok)throw Error(`HTTP ${G.status}: ${G.statusText}`);let $=await G.text();return $?JSON.parse($):void 0}return{listThreads(){return L("/threads")},createThread(Z){return L("/threads",{method:"POST",body:JSON.stringify({prompt:Z})})},deleteThread(Z){return L(`/threads/${Z}`,{method:"DELETE"})},listMessages(Z){return L(`/threads/${Z}/messages`)},listLlmRequests(Z){return L(`/messages/${Z}/llm-requests`)},abortStream(Z){return L(`/chat/${Z}/abort`,{method:"POST"})},async uploadAttachment(Z,J){let X=new FormData;return X.append("file",J),await L(`/threads/${Z}/files`,{method:"POST",body:X})},deleteAttachment(Z){return L(`/files/${Z}`,{method:"DELETE"})},async downloadAttachment(Z){let J=await fetch(k(`/files/${Z}`),{headers:await N()});if(!J.ok)throw Error(`HTTP ${J.status}: ${J.statusText}`);return{blob:await J.blob(),name:n0(J.headers.get("Content-Disposition"))??Z}},resolveHeaders:N,resolveUrl:k}}var c0=new Set(["complete","error"]);function A_(_){return c0.has(_)}function O_(_){return(b_(_)?.parts??[]).filter((k)=>k.type==="tool-call"&&!A_(k.state))}function b_(_){for(let N=_.length-1;N>=0;N-=1){let k=_[N];if(k?.role==="assistant")return k}return}var C0={complete:"success",error:"error","approval-requested":"approval","approval-responded":"approval","awaiting-input":"pending","input-streaming":"pending","input-complete":"pending"},S0={"awaiting-input":"translate_calling","input-streaming":"translate_calling","input-complete":"translate_input_ready","approval-requested":"translate_needs_approval","approval-responded":"translate_responded",complete:"translate_completed",error:"translate_error"};function j_(_){let{state:N,approval:k}=_;return{modifier:C0[N],labelKey:N==="approval-responded"&&k?.approved?"translate_approved":S0[N],pulse:N==="awaiting-input"||N==="input-streaming"?"default":N==="approval-requested"?"violet":void 0}}function i_(_){let N=_.output;if(N===void 0||N===null)return"";if(typeof N==="string")return N;return JSON.stringify(N,null,2)}var P1={code:"javascript",query:"cypher"};function a_(_){let N=_&&typeof _==="object"?_:null,k=N?Object.entries(P1).flatMap(([Z,J])=>{let X=N[Z];return typeof X==="string"?[{key:Z,lang:J,value:X.replace(/\\n/g,`
2
- `)}]:[]}):[],L=_;if(N){let Z=Object.fromEntries(Object.entries(N).filter(([J])=>!Object.hasOwn(P1,J)));L=Object.keys(Z).length>0?Z:null}return{codeSnippets:k,remainingInput:L,remainingInputText:L?JSON.stringify(L,null,2):""}}var A1=10,I0={"awaiting-input":"starting","input-streaming":"starting","input-complete":"processing","approval-requested":"processing","approval-responded":"processing",complete:"complete",error:"error"};function g0(_){let N=0;for(let k=0;k<_.length;k++)N=N*31+_.charCodeAt(k)|0;return Math.abs(N)%A1}function x_(_){let N=I0[_.state]??"processing",k=_.name==="readAttachment"?"attachment":"tool",L=k==="tool"?`_${g0(_.id)}`:"";return{state:N,active:N==="starting"||N==="processing",titleKey:N==="error"?"translate_tool_error":`translate_${k}_${N==="complete"?"done":"status"}${L}`}}function L_(_){return Array.from({length:A1},(N,k)=>`translate_${_}_${k}`)}var b1=["queryGraph","executeCode"];function d_(_,N,k){if(_.type==="thinking")return!(k&&N);if(_.type!=="tool-call")return!1;return b1.includes(_.name)&&A_(_.state)}import{EventType as f0}from"@tanstack/ai";import{fetchServerSentEvents as U1}from"@tanstack/ai-client";function t_(_){return{id:_.id,role:_.role,parts:_.parts}}function v1(_){for(let N=_.length-1;N>=0;N-=1){let k=_[N],L="parts"in k&&k.parts.some((Z)=>Z.type==="tool-result");if(k.role==="user"||L)return _.slice(N,N+1)}return _.slice(-1)}function U_(_){return new Map(_.flatMap((N)=>N.metadata?[[N.id,N.metadata]]:[]))}function s_(_){let{api:N,thread:k}=_,L=async()=>({headers:await N.resolveHeaders()}),Z=U1(()=>N.resolveUrl("/chat"),L),J=function($,K,z,M){return Z.connect(v1($),K,z,M)},X=U1(()=>N.resolveUrl(`/chat/${k.id}/stream`),L),G=[];return{connect:J,async*joinRun($,K){yield{type:f0.MESSAGES_SNAPSHOT,timestamp:Date.now(),messages:G},yield*X.joinRun($,K)},hydrate:async()=>{let $=await p0(_);return G=$.messages,$}}}async function p0(_){let{api:N,thread:k,mode:L}=_,Z=k.isRunning?{runId:k.id}:null;if(L==="skip")return{messages:[],activeRun:Z,interrupts:null};if(L==="load")_.setLoadingMessages?.(!0);try{let J=await N.listMessages(k.id),X=J.map(t_);return _.onHydrated?.(J,X),{messages:X,activeRun:Z,interrupts:null}}finally{_.setLoadingMessages?.(!1)}}async function e_(_){try{let N=await _.api.listMessages(_.threadId);if(_.isStale?.())return;if(_.absorbMetadata(U_(N)),_.isStreaming())return;_.setMessages(N.map(t_))}catch{}}var _1=["image/png","image/jpeg","image/webp","application/pdf"];var R1=5;function n1(_,N){if(!_1.some((k)=>k===_))return"type";if(N>10485760)return"size";return"ok"}function N1(_){let{api:N}=_,k=new Set,L=new Set,Z=[],J=[];function X(){return Z}function G(F){return k.add(F),()=>{k.delete(F)}}function $(F){Z=F;for(let W of k)W()}function K(F,W){$(Z.map((V)=>V.localId===F?{...V,...W}:V))}function z(F){if(L.delete(F))return;K(F,{status:"error"})}function M(F){let W=[];for(let V of F){let S=n1(V.type,V.size)!=="ok"||Z.filter((O)=>O.status!=="error").length>=R1,c=crypto.randomUUID();if($([...Z,{localId:c,filename:V.name,status:S?"error":"uploading"}]),!S)W.push({localId:c,file:V})}if(!W.length)return;_.ensureThread().then((V)=>{for(let{localId:S,file:c}of W){if(L.delete(S))continue;K(S,{threadId:V}),N.uploadAttachment(V,c).then((O)=>{if(L.delete(S)){N.deleteAttachment(O.id).catch(()=>{});return}K(S,{status:"ready",attachmentId:O.id,summary:O})},()=>z(S))}},()=>{for(let{localId:V}of W)z(V)})}function B(F){let W=Z.find((V)=>V.localId===F);if(!W)return;if(W.status==="uploading"){L.add(F),$(Z.filter((V)=>V.localId!==F));return}if(W.attachmentId){K(F,{status:"deleting"}),N.deleteAttachment(W.attachmentId).then(()=>$(Z.filter((V)=>V.localId!==F)),()=>K(F,{status:"error"}));return}$(Z.filter((V)=>V.localId!==F))}function U(F){let W=[];for(let V of Z){if(V.threadId!==void 0&&V.threadId!==F){W.push(V);continue}if(V.status==="uploading")L.add(V.localId);else if(V.status==="ready"&&V.threadId===F&&V.attachmentId)N.deleteAttachment(V.attachmentId).catch(()=>{})}$(W)}function v(){let F=Z.flatMap((W)=>W.status==="ready"&&W.summary?[{...W,status:"ready",summary:W.summary}]:[]);return $(Z.filter((W)=>W.status!=="ready")),J=F,F}function q(F){let W=J;if(J=[],W.some((V)=>V.threadId!==F))return;$([...W.map((V)=>({...V,status:"error"})),...Z])}function C(){J=[]}return{getState:X,subscribe:G,accept:M,remove:B,clear:U,consumeReady:v,restoreConsumed:q,discardConsumed:C}}function k1(_){return{uploading:_.some((N)=>N.status==="uploading"),busy:_.some((N)=>N.status==="uploading"||N.status==="deleting"),hasReady:_.some((N)=>N.status==="ready")}}function m0(_){return Math.min(1000*2**(_-1),30000)}var T0=1e4;function L1(_){let N,k,L=0,Z=!1;function J(){let G=typeof _.wsUrl==="function"?_.wsUrl():_.wsUrl,$=l0(G,_.transport.baseUrl);P_(_.transport).then((K)=>{if(Z)return;N=new WebSocket(j0($,K)),N.addEventListener("open",()=>{let z=N;setTimeout(()=>{if(N===z&&!Z)L=0},T0),_.onOpen?.()}),N.addEventListener("message",(z)=>{let M=z.data;if(typeof M!=="string")return;let B;try{B=JSON.parse(M)}catch{return}_.onEvent(B)}),N.addEventListener("close",X)}).catch(X)}function X(){if(Z||k)return;L+=1,k=setTimeout(()=>{k=void 0,J()},m0(L))}return J(),{close(){Z=!0,clearTimeout(k),N?.close()}}}function l0(_,N){let k=_??o0(N);if(!_)return k;let L=u0(N);if(!L)return k;return r0(k,L)}function o0(_){let N=typeof _==="string"?_:_(),k=new URL(N,window.location.origin);return k.protocol=k.protocol==="https:"?"wss:":"ws:",k.pathname=k.pathname.replace(/\/$/,"")+"/ws",k.toString()}function u0(_){let N=typeof _==="string"?_:_(),L=new URL(N,window.location.origin).pathname.split("/").filter(Boolean),Z=L.lastIndexOf("agents");if(Z===-1)return;return L[Z+1]}function r0(_,N){let k=new URL(_,window.location.origin);if(k.searchParams.has("agentId")||h0(k))return k.toString();return k.searchParams.set("agentId",N),k.toString()}function h0(_){let N=_.pathname.split("/").filter(Boolean),k=N.lastIndexOf("agents");return k!==-1&&Boolean(N[k+1])}function j0(_,N){let k=N.Authorization??N.authorization;if(!k?.startsWith("Bearer "))return _;let L=new URL(_,window.location.origin);if(L.searchParams.has("token"))return L.toString();return L.searchParams.set("token",k.slice(7)),L.toString()}function v_(_){return[..._].sort((N,k)=>{let L=Date.parse(k.updatedAt)-Date.parse(N.updatedAt);if(L!==0)return L;return Date.parse(k.createdAt)-Date.parse(N.createdAt)})}function D_(_,N){let k=[..._],L=k.findIndex((Z)=>Z.id===N.id);if(L===-1)k.push(N);else k[L]={...k[L],...N};return v_(k)}function R_(_,N){return _.filter((k)=>k.id!==N)}function Z1(_,N){switch(N.type){case"thread:deleted":return R_(_,N.payload.threadId);case"thread:created":case"thread:title-updated":case"thread:run-started":case"thread:run-finished":case"thread:messages-updated":return D_(_,N.payload.thread);default:return _}}import{marked as i0}from"marked";import a0 from"dompurify";function J1(_){if(!_)return"";let N=i0.parse(_,{async:!1});return N=N.replace(/<table>/g,'<div style="overflow-x:auto"><table style="width:auto">').replace(/<\/table>/g,"</table></div>").replace(/<(t[hd])([\s>])/g,'<$1 style="padding:0.5rem 1rem"$2'),a0.sanitize(N)}import B_ from"highlight.js/lib/core";import x0 from"highlight.js/lib/languages/javascript";import d0 from"highlight.js/lib/languages/json";import t0 from"highlight.js/lib/languages/sql";var c1=!1;function s0(){if(c1)return;c1=!0,B_.registerLanguage("javascript",x0),B_.registerLanguage("json",d0),B_.registerLanguage("cypher",t0)}function $1(_,N){if(!_)return"";return s0(),B_.getLanguage(N)?B_.highlight(_,{language:N}).value:e0(_)}function e0(_){return _.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var C1={translate_new:"جديد",translate_threads:"المحادثات",translate_n_conversations:"{{count}} محادثات",translate_one_conversation:"محادثة واحدة",translate_no_threads_yet:"لا توجد محادثات بعد",translate_start_a_new_conversation:"ابدأ محادثة جديدة",translate_untitled:"بدون عنوان",translate_new_chat:"محادثة جديدة",translate_normal:"عادي",translate_debug:"تصحيح",translate_type_a_message:"اكتب رسالة...",translate_thinking:"جارٍ معالجة الطلب...",translate_reasoned:"تم الاستنتاج",translate_knowledge_graph_query:"استعلام الرسم البياني المعرفي",translate_javascript_code_execution:"تنفيذ كود جافاسكريبت",translate_completed:"مكتمل",translate_attach_files:"إرفاق ملفات",translate_drop_files_here:"أفلت ملفاتك هنا...",translate_remove_attachment:"إزالة المرفق",translate_attachment_rejected:"لا يمكن إرفاق هذا الملف",translate_attachment_caption:"من فضلك اطّلع على الملفات المرفقة.",translate_download:"تنزيل",translate_tool_status_0:"جارٍ جلب البيانات…",translate_tool_status_1:"جارٍ تحليل المعلومات…",translate_tool_status_2:"جارٍ معالجة الطلب…",translate_tool_status_3:"جارٍ تجميع النتائج…",translate_tool_status_4:"جارٍ تحضير الرد…",translate_tool_status_5:"جارٍ البحث…",translate_tool_status_6:"جارٍ فحص السجلات…",translate_tool_status_7:"جارٍ مراجعة التفاصيل…",translate_tool_status_8:"جارٍ إجراء الحسابات…",translate_tool_status_9:"جارٍ سحب المعلومات…",translate_tool_done_0:"تم جلب البيانات بنجاح",translate_tool_done_1:"تم التحليل بنجاح",translate_tool_done_2:"تمت معالجة الطلب بنجاح",translate_tool_done_3:"تم تجميع النتائج بنجاح",translate_tool_done_4:"تم تحضير الرد بنجاح",translate_tool_done_5:"تم البحث بنجاح",translate_tool_done_6:"تم فحص السجلات بنجاح",translate_tool_done_7:"تمت المراجعة بنجاح",translate_tool_done_8:"تمت الحسابات بنجاح",translate_tool_done_9:"تم استرجاع المعلومات بنجاح",translate_tool_error:"حدث خطأ",translate_attachment_status:"جارٍ قراءة الملف المرفق…",translate_attachment_done:"تمت قراءة الملف المرفق",translate_graph_0:"جارٍ استكشاف الروابط...",translate_graph_1:"جارٍ رسم الخريطة...",translate_graph_2:"جارٍ اكتشاف العلاقات...",translate_graph_3:"جارٍ تتبع الروابط...",translate_graph_4:"جارٍ التنقل في المعرفة...",translate_graph_5:"جارٍ كشف الرؤى...",translate_graph_6:"جارٍ ربط النقاط...",translate_graph_7:"جارٍ تتبع المسار...",translate_graph_8:"جارٍ تجميع الأجزاء...",translate_graph_9:"جارٍ بناء الصورة...",translate_code_0:"جارٍ حساب الأرقام...",translate_code_1:"جارٍ معالجة البيانات...",translate_code_2:"جارٍ تنفيذ طلبك...",translate_code_3:"جارٍ تحليل الأرقام...",translate_code_4:"جارٍ تجميع كل شيء...",translate_code_5:"جارٍ تحليل النتائج...",translate_code_6:"جارٍ العمل خلف الكواليس...",translate_code_7:"جارٍ ترتيب التفاصيل...",translate_code_8:"جارٍ تحضير إجابتك...",translate_code_9:"أوشك على الانتهاء...",translate_reasoning_0:"جارٍ التفكير...",translate_reasoning_1:"جارٍ دراسة الخيارات...",translate_reasoning_2:"جارٍ تقييم الاحتمالات...",translate_reasoning_3:"جارٍ التأمل في هذا...",translate_reasoning_4:"جارٍ إيجاد الحل...",translate_reasoning_5:"جارٍ ترتيب الأفكار...",translate_reasoning_6:"جارٍ التمعن في الأمر...",translate_reasoning_7:"جارٍ إيجاد أفضل طريقة...",translate_reasoning_8:"جارٍ تنظيم أفكاري...",translate_reasoning_9:"أوشك على الانتهاء...",translate_running:"قيد التنفيذ",translate_aborted:"تم الإلغاء",translate_input:"المدخلات",translate_output:"المخرجات",translate_calling:"جارٍ الاستدعاء",translate_input_ready:"المدخلات جاهزة",translate_needs_approval:"بحاجة إلى موافقة",translate_approved:"تمت الموافقة",translate_responded:"تم الرد",translate_error:"خطأ",translate_approval_requested:"طلب موافقة",translate_approval_response:"رد الموافقة",translate_waiting_for_approval:"في انتظار الموافقة لتنفيذ هذه الأداة.",translate_tool_approved:"تمت الموافقة.",translate_tool_response_received:"تم استلام الرد.",translate_tokens:"رمز",translate_fresh:"جديد",translate_cache_read:"قراءة من الذاكرة",translate_cache_write:"كتابة في الذاكرة",translate_n_percent_cached:"{{percent}}٪ مخزّن مؤقتًا",translate_text:"نص",translate_reasoning:"الاستنتاج",translate_read:"قراءة",translate_write:"كتابة",translate_total:"الإجمالي",translate_request:"الطلب",translate_response:"الرد",translate_step_n:"الخطوة {{number}}",translate_inspect_llm_requests:"فحص طلبات النموذج",translate_loading:"جارٍ التحميل…",translate_no_llm_requests:"لا توجد طلبات نموذج مسجّلة لهذه الرسالة.",translate_unhandled_type:"نوع غير مدعوم:"};var S1={translate_new:"New",translate_threads:"Threads",translate_n_conversations:"{{count}} conversations",translate_one_conversation:"1 conversation",translate_no_threads_yet:"No threads yet",translate_start_a_new_conversation:"Start a new conversation",translate_untitled:"Untitled",translate_new_chat:"New Chat",translate_normal:"Normal",translate_debug:"Debug",translate_type_a_message:"Type a message...",translate_thinking:"Thinking things through...",translate_reasoned:"Reasoned",translate_knowledge_graph_query:"Knowledge Graph Query",translate_javascript_code_execution:"JavaScript Code Execution",translate_completed:"Completed",translate_attach_files:"Attach files",translate_drop_files_here:"Drop your files here...",translate_remove_attachment:"Remove attachment",translate_attachment_rejected:"This file cannot be attached",translate_attachment_caption:"Please take a look at the attached files.",translate_download:"Download",translate_tool_status_0:"Fetching data...",translate_tool_status_1:"Analyzing information...",translate_tool_status_2:"Processing request...",translate_tool_status_3:"Gathering results...",translate_tool_status_4:"Preparing response...",translate_tool_status_5:"Looking things up...",translate_tool_status_6:"Checking records...",translate_tool_status_7:"Reviewing details...",translate_tool_status_8:"Running calculations...",translate_tool_status_9:"Pulling information...",translate_tool_done_0:"Data fetched successfully",translate_tool_done_1:"Analysis completed successfully",translate_tool_done_2:"Request processed successfully",translate_tool_done_3:"Results gathered successfully",translate_tool_done_4:"Response prepared successfully",translate_tool_done_5:"Lookup completed successfully",translate_tool_done_6:"Records checked successfully",translate_tool_done_7:"Review completed successfully",translate_tool_done_8:"Calculations completed successfully",translate_tool_done_9:"Information retrieved successfully",translate_tool_error:"Something went wrong",translate_attachment_status:"Reading the attached file...",translate_attachment_done:"Finished reading the file",translate_graph_0:"Exploring connections...",translate_graph_1:"Mapping out the links...",translate_graph_2:"Discovering relationships...",translate_graph_3:"Tracing the connections...",translate_graph_4:"Navigating the knowledge...",translate_graph_5:"Uncovering insights...",translate_graph_6:"Connecting the dots...",translate_graph_7:"Following the trail...",translate_graph_8:"Piecing things together...",translate_graph_9:"Building the picture...",translate_code_0:"Running the numbers...",translate_code_1:"Working through the data...",translate_code_2:"Processing your request...",translate_code_3:"Crunching the figures...",translate_code_4:"Putting it all together...",translate_code_5:"Analyzing the results...",translate_code_6:"Working behind the scenes...",translate_code_7:"Sorting through the details...",translate_code_8:"Preparing your answer...",translate_code_9:"Almost ready...",translate_reasoning_0:"Thinking it through...",translate_reasoning_1:"Considering the options...",translate_reasoning_2:"Weighing the possibilities...",translate_reasoning_3:"Reflecting on this...",translate_reasoning_4:"Working it out...",translate_reasoning_5:"Putting thoughts together...",translate_reasoning_6:"Mulling it over...",translate_reasoning_7:"Finding the best approach...",translate_reasoning_8:"Organizing my thoughts...",translate_reasoning_9:"Almost there...",translate_running:"Running",translate_aborted:"Aborted",translate_input:"Input",translate_output:"Output",translate_calling:"Calling",translate_input_ready:"Input ready",translate_needs_approval:"Needs approval",translate_approved:"Approved",translate_responded:"Responded",translate_error:"Error",translate_approval_requested:"Approval requested",translate_approval_response:"Approval response",translate_waiting_for_approval:"Waiting for approval to execute this tool.",translate_tool_approved:"Approved.",translate_tool_response_received:"Response received.",translate_tokens:"tokens",translate_fresh:"Fresh",translate_cache_read:"Cache read",translate_cache_write:"Cache write",translate_n_percent_cached:"{{percent}}% cached",translate_text:"Text",translate_reasoning:"Reasoning",translate_read:"Read",translate_write:"Write",translate_total:"Total",translate_request:"Request",translate_response:"Response",translate_step_n:"Step {{number}}",translate_inspect_llm_requests:"Inspect LLM requests",translate_loading:"loading…",translate_no_llm_requests:"No LLM requests recorded for this message.",translate_unhandled_type:"Unhandled type:"};var n_={en:S1,ar:C1};function X1(_,N,k){let Z=(n_[_]??n_.en)?.[N]??n_.en?.[N]??N;if(!k)return Z;return Z.replace(/\{\{\s*(\w+)\s*\}\}/g,(J,X)=>(X in k)?String(k[X]):J)}function X_(_){if(typeof _==="string"){let N=_.trim();if(!(N.startsWith("{")&&N.endsWith("}")||N.startsWith("[")&&N.endsWith("]")))return _;try{return X_(JSON.parse(N))}catch{return _}}if(Array.isArray(_))return _.map((N)=>X_(N));if(_!==null&&typeof _==="object"){let N={};for(let[k,L]of Object.entries(_))N[k]=X_(L);return N}return _}function G1(_,N){if(Array.isArray(_)){let k=_;return{kind:"container",open:"[",close:"]",summary:I1(k.length,"item","items"),entries:k.map((L,Z)=>({key:null,value:L,path:`${N}[${Z}]`}))}}if(_!==null&&typeof _==="object"){let k=Object.entries(_);return{kind:"container",open:"{",close:"}",summary:I1(k.length,"property","properties"),entries:k.map(([L,Z])=>({key:L,value:Z,path:`${N}.${L}`}))}}return{kind:"primitive",text:k2(_),className:L2(_)}}function I1(_,N,k){return`${_} ${_===1?N:k}`}function k2(_){if(_===null||_===void 0)return"null";if(typeof _==="string")return JSON.stringify(_);if(typeof _==="number"||typeof _==="boolean")return String(_);return JSON.stringify(_)??"null"}function L2(_){if(_===null||_===void 0)return"jt-null";if(typeof _==="string")return"jt-string";if(typeof _==="number")return"jt-number";if(typeof _==="boolean")return"jt-boolean";return""}function c_(_){if(!_)return null;try{return JSON.parse(_)}catch{return _}}function C_(_){if(!_)return"";try{return JSON.stringify(JSON.parse(_),null,2)}catch{return _}}var W1=[["year",31536000000],["month",2592000000],["week",604800000],["day",86400000],["hour",3600000],["minute",60000],["second",1000]];function V1(_,N,k=Date.now()){let L=Date.parse(_);if(Number.isNaN(L))return"";let Z=L-k,[J,X]=W1.find(([,G])=>Math.abs(Z)>=G)??W1[W1.length-1];return new Intl.RelativeTimeFormat(N,{numeric:"auto"}).format(Math.round(Z/X),J)}function Y1(_,N){let k=URL.createObjectURL(_),L=document.createElement("a");L.href=k,L.download=N,L.click(),URL.revokeObjectURL(k)}class Z_{onUpdate;fullText="";displayedLength=0;animationFrameId=null;isDone=!1;static DRAIN_FRACTION=0.03;static MIN_CHARS_PER_FRAME=1;static DONE_DRAIN_FRACTION=0.1;constructor(_){this.onUpdate=_}seed(_){this.fullText=_,this.displayedLength=_.length,this.onUpdate(_)}update(_,N){if(this.fullText=_,this.isDone=N,this.displayedLength=Math.min(this.displayedLength,this.fullText.length),N&&this.displayedLength>=this.fullText.length){this.onUpdate(this.fullText),this.stopAnimation();return}if(!this.animationFrameId)this.scheduleFrame()}destroy(){this.stopAnimation()}scheduleFrame(){this.animationFrameId=requestAnimationFrame(()=>this.tick())}tick(){let _=this.fullText.length-this.displayedLength;if(_<=0){this.animationFrameId=null;return}let N=this.isDone?Z_.DONE_DRAIN_FRACTION:Z_.DRAIN_FRACTION,k=Math.max(Z_.MIN_CHARS_PER_FRAME,Math.ceil(_*N));if(this.displayedLength=Math.min(this.fullText.length,this.displayedLength+k),this.onUpdate(this.fullText.substring(0,this.displayedLength)),this.displayedLength<this.fullText.length)this.scheduleFrame();else this.animationFrameId=null}stopAnimation(){if(this.animationFrameId)cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null}}function y_(_){if(_.input.total<=0)return null;return Math.round(_.input.cacheRead/_.input.total*100)}import{useEffect as S_,useLayoutEffect as g1,useMemo as Z2,useRef as i}from"react";import{useChat as J2}from"@tanstack/ai-react";function f1(_){let{thread:N,api:k,patchUi:L}=_,Z=i(!0),J=i(!1),X=i(!1),G=i(!1),$=i(!1),K=i(new Set),z=i(Promise.resolve()),M=Z2(()=>s_({api:k,thread:{id:N.id,isRunning:N.isRunning},mode:_.mode,onHydrated:(H,R)=>{if(!Z.current)return;L({messageMetadata:U_(H),hasPendingToolCalls:O_(R).length>0})},setLoadingMessages:(H)=>{if(Z.current)L({isLoadingMessages:H})}}),[]),B=J2({threadId:N.id,persistence:!0,connection:M,onChunk:()=>{if(!Z.current)return;X.current=!0},onError:()=>{if(!Z.current)return;if(L({hasPendingToolCalls:!1}),X.current)_.onTurnFinished();else _.onSendFailed()}}),U=i(B);U.current=B;let v=i(B.isLoading);v.current=B.isLoading;function q(){let H=O_(U.current.messages);return L({hasPendingToolCalls:H.length>0}),H}async function C(H,R){let I=R({toolCallId:H.id,toolName:H.name,input:H.input},{threadId:N.id});if(I===null||I===void 0)return;let g=await Promise.resolve(I);if(g===null||g===void 0)return;if(!Z.current)return;await U.current.addToolResult({toolCallId:H.id,tool:H.name,output:g}),q()}function F(){let H=q(),R=_.configRef.current.hooks?.onToolCall;if(!R)return H.length>0;for(let I of H){if(I.state!=="input-complete")continue;if(K.current.has(I.id))continue;K.current.add(I.id),C(I,R)}return H.length>0}async function W(H){if(!Z.current||H!==N.id)return;await e_({api:k,threadId:H,isStale:()=>!Z.current,isStreaming:()=>v.current,absorbMetadata:(R)=>L({messageMetadata:R}),setMessages:(R)=>{U.current.setMessages(R),L({hasPendingToolCalls:O_(R).length>0})}})}function V(H){return z.current=z.current.then(()=>W(H)),z.current}async function S(){if(G.current){G.current=!1;return}if(J.current&&F())return;await V(N.id)}async function c(H,R){_.setRunning(N.id,!0),J.current=!0,X.current=!1;let I={id:crypto.randomUUID(),role:"user",parts:[{type:"text",content:H}]};if(R.length)L((g)=>({messageMetadata:new Map(g.messageMetadata).set(I.id,{attachments:R})}));await U.current.append(I)}async function O(){if(!v.current)return;let{aborted:H}=await k.abortStream(N.id).catch(()=>({aborted:!1}));if(!Z.current)return;if(H)G.current=!0,_.setRunning(N.id,!1);U.current.stop(),L({hasPendingToolCalls:!1})}function u(H,R,I){U.current.addToolResult({toolCallId:H,tool:R,output:I}).then(()=>q())}function H_(H){if(v.current)return;if(H.isRunning){_.remount(H);return}V(H.id)}S_(()=>{return Z.current=!0,()=>{Z.current=!1}},[]);let x=i(void 0);return x.current={threadId:N.id,send:c,abort:O,addToolResult:u,reattach:H_,refreshMessages:(H)=>{V(H)}},g1(()=>{_.sessionRef.current=x.current}),g1(()=>{return()=>{if(_.sessionRef.current===x.current)_.sessionRef.current=void 0}},[]),S_(()=>{if(!_.pendingSendRef.current.length)return;let H=setTimeout(()=>{let R=_.pendingSendRef.current;_.pendingSendRef.current=[],(async()=>{for(let{prompt:I,attachments:g}of R)await c(I,g)})()});return()=>clearTimeout(H)},[]),S_(()=>{L({messages:B.messages})},[B.messages]),S_(()=>{if(L({isAgentWorking:B.isLoading}),B.isLoading){$.current=!0;return}if(!$.current)return;$.current=!1,_.onTurnFinished(),S()},[B.isLoading]),null}import{createContext as $2,useContext as X2}from"react";var K1=$2(void 0);function D(){let _=X2(K1);if(!_)throw Error("useCortex must be used inside <CortexChatWidget>");return _}function Q(..._){return _.filter(Boolean).join(" ")}import{forwardRef as G2,useEffect as W2,useImperativeHandle as V2,useRef as z1,useState as m1}from"react";import{jsx as d,jsxs as Q1}from"react/jsx-runtime";function p1(){let{queue:_,t:N}=D();if(!_.items.length)return null;return d("div",{className:"cortex-attachment-queue",children:_.items.map((k)=>Q1("div",{className:Q("cortex-attachment-chip",k.status==="error"&&"cortex-attachment-chip--error"),title:k.status==="error"?N("translate_attachment_rejected"):"",children:[k.status==="uploading"||k.status==="deleting"?Q1("svg",{className:"cortex-attachment-chip__spinner",viewBox:"0 0 16 16",fill:"none",children:[d("circle",{cx:"8",cy:"8",r:"6",stroke:"currentColor",strokeWidth:"2",className:"cortex-attachment-chip__spinner-track"}),d("path",{d:"M14 8a6 6 0 0 0-6-6",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})]}):Q1("svg",{viewBox:"0 0 16 16",className:"cortex-attachment-chip__icon",fill:"none",children:[d("path",{d:"M4 1.5h5.172a2 2 0 0 1 1.414.586l2.328 2.328a2 2 0 0 1 .586 1.414V12.5a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-9a2 2 0 0 1 2-2Z",stroke:"currentColor",strokeWidth:"1.25"}),d("path",{d:"M9.5 1.5v2a2 2 0 0 0 2 2h2",stroke:"currentColor",strokeWidth:"1.25",strokeLinecap:"round"})]}),d("span",{className:"cortex-attachment-chip__name",children:k.filename}),d("button",{type:"button",onClick:()=>_.remove(k.localId),className:"cortex-attachment-chip__remove",disabled:k.status==="deleting","aria-label":N("translate_remove_attachment"),children:d("svg",{viewBox:"0 0 16 16",fill:"none",children:d("path",{d:"M4.5 4.5l7 7m0-7l-7 7",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})})]},k.localId))})}import{jsx as r,jsxs as I_}from"react/jsx-runtime";var Y2=_1.join(","),T1=G2(function(N,k){let{t:L,queue:Z,isAgentWorking:J,send:X,abort:G}=D(),[$,K]=m1(""),[z,M]=m1(!1),B=z1(null),U=z1(null);V2(k,()=>({focusInput:()=>B.current?.focus()}));let v=z1(J);W2(()=>{if(v.current&&!J)B.current?.focus();v.current=J},[J]);let q=!Z.busy&&(Boolean($.trim())||Z.hasReady);function C(){if(J||!q)return;let O="translate_attachment_caption",u=L(O),H_=u!==O?u:"Please take a look at the attached files.",x=$.trim()||H_,H=Z.consumeReady();K(""),X(x,H.map((R)=>R.summary))}function F(O){if(O.key==="Enter"&&!O.shiftKey)O.preventDefault(),C()}function W(O){O.preventDefault(),M(!0)}function V(O){if(!O.currentTarget.contains(O.relatedTarget))M(!1)}function S(O){O.preventDefault(),M(!1),Z.accept([...O.dataTransfer.files])}function c(O){let u=O.clipboardData.files;if(!u.length)return;O.preventDefault(),Z.accept([...u])}return I_("div",{className:"cortex-widget__input-area",onDragOver:W,onDragLeave:V,onDrop:S,children:[r(p1,{}),I_("div",{className:Q("cortex-widget__input-box",J&&"cortex-widget__input-box--disabled",!J&&"cortex-widget__input-box--enabled",z&&"cortex-widget__input-box--dragging"),children:[r("textarea",{ref:B,onKeyDown:F,onPaste:c,value:$,onChange:(O)=>K(O.target.value),placeholder:z?L("translate_drop_files_here"):J?"":L("translate_type_a_message"),disabled:J,rows:1,className:Q("cortex-widget__textarea",J&&"cortex-widget__textarea--disabled")}),J?I_("button",{onClick:()=>void G(),className:"cortex-stop-btn",children:[r("span",{className:"cortex-stop-btn__ring"}),r("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",className:"cortex-stop-btn__icon",children:r("rect",{x:"1",y:"1",width:"10",height:"10",rx:"2.5",fill:"currentColor"})})]}):I_("div",{className:"cortex-widget__input-actions",children:[r("button",{type:"button",onClick:()=>U.current?.click(),className:"cortex-widget__attach-btn","aria-label":L("translate_attach_files"),children:r("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:r("path",{d:"M10.5 5.5 6.2 9.8a1.4 1.4 0 0 0 2 2l4.6-4.6a2.8 2.8 0 0 0-4-4L4.2 7.8a4.2 4.2 0 0 0 6 6l4-4",stroke:"currentColor",strokeWidth:"1.3",strokeLinecap:"round",strokeLinejoin:"round"})})}),r("input",{ref:U,type:"file",multiple:!0,accept:Y2,onChange:(O)=>{Z.accept([...O.target.files??[]]),O.target.value=""},className:"cortex-widget__file-input"}),r("button",{onClick:C,className:Q("cortex-widget__send-btn",!q&&"cortex-widget__send-btn--empty",q&&"cortex-widget__send-btn--ready"),disabled:!q,children:r("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",className:"cortex-widget__send-icon",children:r("path",{d:"M3 8h10M9 4l4 4-4 4",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})})]})]})]})});import{useEffect as m_,useRef as T_,useState as v2}from"react";import{jsx as g_,jsxs as l1}from"react/jsx-runtime";function o1(){let{t:_}=D();return l1("div",{className:"cortex-aborted-flag",children:[g_("span",{className:"cortex-aborted-flag__line"}),l1("span",{className:"cortex-aborted-flag__label",children:[g_("svg",{className:"cortex-aborted-flag__icon",width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",children:g_("path",{d:"M6 1.5v5M6 8.75v.5",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round"})}),_("translate_aborted")]}),g_("span",{className:"cortex-aborted-flag__line"})]})}import{jsx as G_,jsxs as u1}from"react/jsx-runtime";function r1(_){let{api:N,t:k}=D();async function L(Z){let{blob:J,name:X}=await N.downloadAttachment(Z);Y1(J,X)}return G_("div",{className:"cortex-message-attachments",children:_.attachments.map((Z)=>u1("button",{type:"button",onClick:()=>void L(Z.id),className:"cortex-message-attachment","aria-label":`${k("translate_download")}: ${Z.filename}`,children:[u1("svg",{viewBox:"0 0 16 16",className:"cortex-message-attachment__icon",fill:"none",children:[G_("path",{d:"M4 1.5h5.172a2 2 0 0 1 1.414.586l2.328 2.328a2 2 0 0 1 .586 1.414V12.5a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-9a2 2 0 0 1 2-2Z",stroke:"currentColor",strokeWidth:"1.25"}),G_("path",{d:"M9.5 1.5v2a2 2 0 0 0 2 2h2",stroke:"currentColor",strokeWidth:"1.25",strokeLinecap:"round"})]}),G_("span",{className:"cortex-message-attachment__name",children:Z.filename}),G_("svg",{viewBox:"0 0 16 16",className:"cortex-message-attachment__dl-icon",fill:"none",children:G_("path",{d:"M8 3v7m0 0L5.5 7.5M8 10l2.5-2.5M3 13h10",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})]},Z.id))})}import{useRef as q2,useState as E_}from"react";import{useRef as K2,useState as Q2}from"react";import{jsx as W_,jsxs as z2}from"react/jsx-runtime";function e({value:_,className:N}){let[k,L]=Q2(!1),Z=K2(null);async function J(X){X.stopPropagation(),X.preventDefault();try{if(await navigator.clipboard.writeText(_),L(!0),Z.current)clearTimeout(Z.current);Z.current=setTimeout(()=>L(!1),1500)}catch{}}return W_("span",{className:Q("cortex-copy-btn",N),children:W_("button",{className:Q("cortex-copy-btn__button",k&&"cortex-copy-btn__button--copied"),onClick:(X)=>void J(X),"aria-label":k?"Copied":"Copy to clipboard",type:"button",children:k?W_("svg",{className:"cortex-copy-btn__icon cortex-copy-btn__icon--check",width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",children:W_("path",{d:"M5 13l4 4L19 7",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})}):z2("svg",{className:"cortex-copy-btn__icon",width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",children:[W_("rect",{x:"9",y:"9",width:"12",height:"12",rx:"2",stroke:"currentColor",strokeWidth:"2"}),W_("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})]})})})}import{useMemo as F2,useState as H2}from"react";import{jsx as o,jsxs as J_,Fragment as f_}from"react/jsx-runtime";function $_({data:_,expandDepth:N=1,className:k}){let L=F2(()=>X_(_),[_]),[Z,J]=H2({});function X($,K){return Z[$]??K>=N}function G($,K){J((z)=>({...z,[$]:!X($,K)}))}return o("div",{className:Q("cortex-json-tree",k),children:o(h1,{value:L,path:"$",depth:0,isCollapsed:X,toggle:G})})}function h1({value:_,path:N,depth:k,isCollapsed:L,toggle:Z}){let J=G1(_,N);if(J.kind==="primitive")return o("span",{className:J.className,children:J.text});if(J.entries.length===0)return J_("span",{className:"jt-bracket",children:[J.open,J.close]});let X=L(N,k);function G($){Z(N,k),$.stopPropagation()}return J_(f_,{children:[J_("span",{className:"jt-toggle",onClick:G,role:"button",children:[o("span",{className:Q("jt-arrow",X&&"jt-arrow--collapsed"),children:"▾"}),o("span",{className:"jt-bracket",children:J.open})]}),X?J_(f_,{children:[o("span",{className:"jt-collapsed-hint",onClick:G,role:"button",children:J.summary}),o("span",{className:"jt-bracket",children:J.close})]}):J_(f_,{children:[o("div",{className:"jt-indent",children:J.entries.map(($,K)=>J_("div",{className:"jt-line",children:[$.key!==null&&J_(f_,{children:[o("span",{className:"jt-key",children:`"${$.key}"`}),o("span",{className:"jt-colon",children:": "})]}),o(h1,{value:$.value,path:$.path,depth:k+1,isCollapsed:L,toggle:Z}),K<J.entries.length-1&&o("span",{className:"jt-comma",children:","})]},$.path))}),o("span",{className:"jt-bracket",children:J.close})]})]})}function b(_){return _.toLocaleString("en-US")}import{jsx as V_,jsxs as Y_}from"react/jsx-runtime";function j1({usage:_}){let{t:N}=D();return Y_("div",{className:"cortex-llm-inspector__usage-rows",children:[Y_("div",{className:"cortex-llm-inspector__usage-row",children:[V_("span",{className:"cortex-llm-inspector__usage-lbl",children:N("translate_input")}),V_("span",{className:"cortex-llm-inspector__usage-val",children:b(_.input.total)}),Y_("span",{className:"cortex-llm-inspector__usage-detail",children:[N("translate_fresh")," ",b(_.input.noCache)," · ",N("translate_read")," ",b(_.input.cacheRead)," · ",N("translate_write")," ",b(_.input.cacheWrite)]})]}),Y_("div",{className:"cortex-llm-inspector__usage-row",children:[V_("span",{className:"cortex-llm-inspector__usage-lbl",children:N("translate_output")}),V_("span",{className:"cortex-llm-inspector__usage-val",children:b(_.output.total)}),Y_("span",{className:"cortex-llm-inspector__usage-detail",children:[N("translate_text")," ",b(_.output.text)," · ",N("translate_reasoning")," ",b(_.output.reasoning)]})]}),Y_("div",{className:"cortex-llm-inspector__usage-row cortex-llm-inspector__usage-row--total",children:[V_("span",{className:"cortex-llm-inspector__usage-lbl",children:N("translate_total")}),V_("span",{className:"cortex-llm-inspector__usage-val",children:b(_.total)})]})]})}import{jsx as F1,jsxs as p_}from"react/jsx-runtime";function i1({usage:_}){let N=y_(_);return F1("span",{children:p_("span",{className:"cortex-llm-inspector__step-metrics",children:[p_("span",{className:"cortex-llm-inspector__metric",children:[F1("span",{className:"cortex-llm-inspector__dot cortex-llm-inspector__dot--input"}),b(_.input.total)]}),p_("span",{className:"cortex-llm-inspector__metric",children:[F1("span",{className:"cortex-llm-inspector__dot cortex-llm-inspector__dot--output"}),b(_.output.total)]}),N!==null?p_("span",{className:"cortex-llm-inspector__cache-pct",children:[N,"%"]}):null]})})}import{jsx as n,jsxs as __}from"react/jsx-runtime";function a1({messageId:_}){let{t:N,api:k}=D(),[L,Z]=E_(!1),[J,X]=E_(!1),[G,$]=E_([]),[K,z]=E_(null),[M,B]=E_({}),U=q2(!1);async function v(){if(!U.current){X(!0);try{$(await k.listLlmRequests(_))}finally{X(!1),U.current=!0}}Z((W)=>!W)}function q(W){z((V)=>V===W?null:W)}function C(W){return M[W]??"prompt"}function F(W,V){B((S)=>({...S,[W]:V}))}return __("div",{className:Q("cortex-llm-inspector",L&&"cortex-llm-inspector--open"),children:[__("button",{className:"cortex-llm-inspector__trigger",onClick:()=>void v(),children:[n("svg",{className:"cortex-llm-inspector__icon",width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:n("path",{d:"M6 2a4 4 0 1 0 0 8 4 4 0 0 0 0-8ZM0 6a6 6 0 1 1 10.89 3.477l4.817 4.816a1 1 0 0 1-1.414 1.414l-4.816-4.816A6 6 0 0 1 0 6Z",fill:"currentColor"})}),n("span",{children:N("translate_inspect_llm_requests")}),J?n("span",{className:"cortex-llm-inspector__loading",children:N("translate_loading")}):G.length>0?n("span",{className:"cortex-llm-inspector__badge",children:G.length}):null,n("svg",{className:"cortex-llm-inspector__chevron",width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",children:n("path",{d:"M3 4.5L6 7.5L9 4.5",stroke:"currentColor",strokeWidth:"1.25",strokeLinecap:"round",strokeLinejoin:"round"})})]}),n("div",{className:"cortex-llm-inspector__panel-wrapper",children:n("div",{className:"cortex-llm-inspector__panel-inner",children:__("div",{className:"cortex-llm-inspector__panel",children:[G.length===0&&!J?n("div",{className:"cortex-llm-inspector__empty",children:N("translate_no_llm_requests")}):null,G.map((W,V)=>__("div",{className:Q("cortex-llm-inspector__step",K===W.id&&"cortex-llm-inspector__step--expanded"),children:[__("button",{className:"cortex-llm-inspector__step-header",onClick:()=>q(W.id),children:[n("span",{className:"cortex-llm-inspector__step-label",children:N("translate_step_n",{number:V+1})}),W.tokenUsage?n(i1,{usage:W.tokenUsage}):null,n("svg",{className:"cortex-llm-inspector__step-chevron",width:"10",height:"10",viewBox:"0 0 12 12",fill:"none",children:n("path",{d:"M3 4.5L6 7.5L9 4.5",stroke:"currentColor",strokeWidth:"1.25",strokeLinecap:"round",strokeLinejoin:"round"})})]}),n("div",{className:"cortex-llm-inspector__step-body-wrapper",children:n("div",{className:"cortex-llm-inspector__step-body-inner",children:__("div",{className:"cortex-llm-inspector__step-body",children:[W.tokenUsage?n(j1,{usage:W.tokenUsage}):null,__("div",{className:"cortex-llm-inspector__tabs",children:[n("button",{className:Q("cortex-llm-inspector__tab",C(W.id)==="prompt"&&"cortex-llm-inspector__tab--active"),onClick:()=>F(W.id,"prompt"),children:N("translate_request")}),n("button",{className:Q("cortex-llm-inspector__tab",C(W.id)==="response"&&"cortex-llm-inspector__tab--active"),onClick:()=>F(W.id,"response"),children:N("translate_response")})]}),__("div",{className:"cortex-llm-inspector__json-pane",children:[n(e,{className:"cortex-llm-inspector__json-copy",value:C(W.id)==="prompt"?C_(W.prompt):C_(W.output)}),C(W.id)==="prompt"?n($_,{data:c_(W.prompt),expandDepth:2}):n($_,{data:c_(W.output),expandDepth:2})]})]})})})]},W.id))]})})})]})}import{useEffect as O2,useRef as D2,useState as x1}from"react";import{jsx as M_,jsxs as d1}from"react/jsx-runtime";function K_({labels:_,className:N}){let{t:k}=D(),[L,Z]=x1(0),[J,X]=x1("idle"),G=D2(_.length);return G.current=_.length,O2(()=>{let $,K;function z(){$=setTimeout(()=>{X("exiting"),$=setTimeout(()=>{Z((M)=>(M+1)%G.current),X("enter-start"),K=requestAnimationFrame(()=>{X("entering"),$=setTimeout(()=>{X("idle"),z()},300)})},300)},2000)}return z(),()=>{if($)clearTimeout($);if(K)cancelAnimationFrame(K)}},[]),d1("div",{className:Q("cortex-subtle-activity",N),children:[d1("div",{className:"cortex-subtle-activity__dots",children:[M_("span",{className:"cortex-subtle-activity__dot"}),M_("span",{className:"cortex-subtle-activity__dot cortex-subtle-activity__dot--d1"}),M_("span",{className:"cortex-subtle-activity__dot cortex-subtle-activity__dot--d2"})]}),M_("div",{className:"cortex-subtle-activity__label-mask",children:M_("span",{className:Q("cortex-subtle-activity__label",`cortex-subtle-activity__label--${J}`),children:k(_[L])})})]})}import{jsx as t1}from"react/jsx-runtime";var B2=L_("reasoning");function s1(){return t1("div",{className:"cortex-reasoning-animated",children:t1(K_,{labels:B2})})}import{jsx as h,jsxs as w_}from"react/jsx-runtime";function e1(_){let{reasoningPart:N,streaming:k=!1}=_,{t:L}=D();return w_("details",{className:"cortex-reasoning-details",children:[w_("summary",{className:"cortex-reasoning-details__summary",children:[w_("div",{className:"cortex-reasoning-details__header",children:[h("span",{className:"cortex-reasoning-details__icon",children:w_("svg",{width:"14",height:"14",viewBox:"0 0 20 20",fill:"none","aria-hidden":"true",children:[h("path",{d:"M10 2C6.686 2 4 4.686 4 8c0 1.655.672 3.154 1.757 4.243.362.363.576.858.576 1.371V14.5a1 1 0 0 0 1 1h5.334a1 1 0 0 0 1-1v-.886c0-.513.214-1.008.576-1.371A5.978 5.978 0 0 0 16 8c0-3.314-2.686-6-6-6Z",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round",strokeLinejoin:"round"}),h("path",{d:"M7.5 17.5h5M8.5 8a2 2 0 0 1 2-2",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round",strokeLinejoin:"round"})]})}),h("div",{className:"cortex-reasoning-details__title-group",children:w_("div",{className:"cortex-reasoning-details__title-row",children:[h("div",{className:"cortex-reasoning-details__title",children:L("translate_reasoning")}),h("span",{className:Q("cortex-reasoning-details__badge",k?"cortex-reasoning-details__badge--streaming":"cortex-reasoning-details__badge--done"),children:k?"Streaming":"Done"})]})})]}),h("span",{className:"cortex-reasoning-details__chevron","aria-hidden":"true",children:h("svg",{width:"14",height:"14",viewBox:"0 0 20 20",fill:"none",children:h("path",{d:"m5.75 8.25 4.25 4.25 4.25-4.25",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})})]}),h("div",{className:"cortex-reasoning-details__body",children:h("div",{className:"cortex-reasoning-details__content",children:h("pre",{className:"cortex-reasoning-details__pre",children:N.content.trim()?N.content:"No reasoning provided."})})})]})}import{useEffect as _0,useRef as H1,useState as y2}from"react";import{jsx as N0}from"react/jsx-runtime";function k0(_){let{role:N,textPart:k,streaming:L=!1}=_,Z=N==="assistant"&&L?"":k.content,[J,X]=y2(Z),G=H1(Z),$=H1(null),K=H1(!0);return _0(()=>{function z(M){G.current=M,X(M)}if(N!=="assistant"||!L){$.current?.destroy(),$.current=null,z(k.content),K.current=!1;return}if(!$.current)$.current=new Z_(z),$.current.seed(G.current);if(K.current){K.current=!1,$.current.seed(k.content);return}$.current.update(k.content,!1)},[N,L,k]),_0(()=>()=>{$.current?.destroy(),$.current=null},[]),N0("div",{className:Q("cortex-text-part",N==="assistant"&&"cortex-text-part--assistant",N==="user"&&"cortex-text-part--user"),children:N0("div",{className:Q("cortex-text-bubble",N==="assistant"&&"cortex-text-bubble--assistant",N==="user"&&"cortex-text-bubble--user"),dangerouslySetInnerHTML:{__html:J1(J)}})})}import{jsx as m,jsxs as N_}from"react/jsx-runtime";function L0({toolCallPart:_}){let{t:N}=D(),{state:k,approval:L}=_,Z=_.output,J=i_(_);function X(){if(k==="complete")return N_("div",{className:"dbg-tool__section dbg-tool__section--success",children:[N_("div",{className:"dbg-tool__section-bar",children:[m("span",{className:"dbg-tool__section-label dbg-tool__section-label--success",children:N("translate_output")}),m("span",{className:"dbg-tool__section-lang",children:"json"}),m(e,{value:J})]}),m("div",{dir:"ltr",className:"dbg-tool__tree",children:m($_,{data:Z,expandDepth:2})})]});if(k==="error")return N_("div",{className:"dbg-tool__section dbg-tool__section--error",children:[N_("div",{className:"dbg-tool__section-bar",children:[m("span",{className:"dbg-tool__section-label dbg-tool__section-label--error",children:N("translate_error")}),m(e,{value:J})]}),m("pre",{dir:"ltr",className:"dbg-tool__error-pre",children:J})]});if(k==="approval-requested")return N_("div",{className:"dbg-tool__section dbg-tool__section--approval",children:[N_("div",{className:"dbg-tool__section-bar",children:[m("span",{className:"dbg-tool__section-label dbg-tool__section-label--approval",children:N("translate_approval_requested")}),m("span",{className:"dbg-tool__section-lang",children:L?.id})]}),m("div",{className:"dbg-tool__message dbg-tool__message--approval",children:N("translate_waiting_for_approval")})]});if(k==="approval-responded")return N_("div",{className:"dbg-tool__section dbg-tool__section--approval",children:[N_("div",{className:"dbg-tool__section-bar",children:[m("span",{className:"dbg-tool__section-label dbg-tool__section-label--approval",children:N("translate_approval_response")}),m("span",{className:"dbg-tool__section-lang",children:L?.id})]}),m("div",{className:"dbg-tool__message dbg-tool__message--approval",children:N(L?.approved?"translate_tool_approved":"translate_tool_response_received")})]});return null}return m("div",{children:X()})}import{jsx as Z0,jsxs as E2}from"react/jsx-runtime";function J0({toolCallPart:_}){let{t:N}=D(),k=j_(_);return Z0("span",{children:E2("span",{className:Q("dbg-tool__state",k.modifier&&`dbg-tool__state--${k.modifier}`),children:[k.pulse&&Z0("span",{className:Q("dbg-tool__pulse",k.pulse==="violet"&&"dbg-tool__pulse--violet")}),N(k.labelKey)]})})}import{jsx as p,jsxs as t}from"react/jsx-runtime";function $0({toolCallPart:_}){let{t:N}=D(),{codeSnippets:k,remainingInput:L,remainingInputText:Z}=a_(_.input);return t("details",{className:"dbg-tool","data-state":_.state,children:[p("summary",{className:"dbg-tool__summary",children:t("div",{className:"dbg-tool__header",children:[t("div",{className:"dbg-tool__meta",children:[p("div",{className:"dbg-tool__title-row",children:p("span",{className:"dbg-tool__name",title:_.name,children:_.name})}),p("div",{className:"dbg-tool__id-row",children:p("span",{className:"dbg-tool__id",children:_.id})})]}),t("div",{className:"dbg-tool__actions",children:[p(J0,{toolCallPart:_}),p("svg",{className:"dbg-tool__chevron",width:"14",height:"14",viewBox:"0 0 20 20",fill:"none",children:p("path",{d:"m5.75 8.25 4.25 4.25 4.25-4.25",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})]})]})}),t("div",{className:"dbg-tool__body",children:[k.map((J)=>t("div",{className:"dbg-tool__section",children:[t("div",{className:"dbg-tool__section-bar",children:[p("span",{className:"dbg-tool__section-label",children:J.key}),p("span",{className:"dbg-tool__section-lang",children:J.lang}),p(e,{value:J.value})]}),p("pre",{dir:"ltr",className:"dbg-tool__pre",children:p("code",{className:"hljs",dangerouslySetInnerHTML:{__html:$1(J.value,J.lang)}})})]},J.key)),!!L&&t("div",{className:"dbg-tool__section",children:[t("div",{className:"dbg-tool__section-bar",children:[p("span",{className:"dbg-tool__section-label",children:N("translate_input")}),p("span",{className:"dbg-tool__section-lang",children:"json"}),p(e,{value:Z})]}),p("div",{dir:"ltr",className:"dbg-tool__tree",children:p($_,{data:L,expandDepth:2})})]}),p(L0,{toolCallPart:_})]})]})}import{jsx as s,jsxs as X0}from"react/jsx-runtime";function G0({message:_,toolCallPart:N}){let{config:k,t:L,addToolResult:Z}=D(),J=k.toolComponents?.[N.name];if(J)return s("div",{className:"cortex-tool-call-animated",children:s(J,{toolCallPart:N,message:_,setOutput:(K)=>Z(N.id,N.name,K)})});let{state:X,active:G,titleKey:$}=x_(N);return s("div",{className:"cortex-tool-call-animated",children:X0("div",{className:"cortex-tool-pill",children:[X0("span",{className:"cortex-tool-pill__icon",children:[s("span",{className:Q("cortex-tool-pill__spinner",G&&"cortex-tool-pill__spinner--visible")}),s("svg",{className:Q("cortex-tool-pill__svg","cortex-tool-pill__svg--check",X==="complete"&&"cortex-tool-pill__svg--visible"),viewBox:"0 0 20 20",fill:"none",children:s("path",{d:"M5.5 10.5 L8.5 13.5 L14.5 7",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})}),s("svg",{className:Q("cortex-tool-pill__svg","cortex-tool-pill__svg--error",X==="error"&&"cortex-tool-pill__svg--visible"),viewBox:"0 0 20 20",fill:"none",children:s("path",{d:"M6.5 6.5 L13.5 13.5 M13.5 6.5 L6.5 13.5",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})})]}),s("span",{className:Q("cortex-tool-pill__title",X==="error"&&"cortex-tool-pill__title--error"),children:L($)})]})})}import{jsx as w2}from"react/jsx-runtime";var M2=L_("code");function W0(){return w2(K_,{labels:M2})}import{jsx as A2}from"react/jsx-runtime";var P2=L_("graph");function V0(){return A2(K_,{labels:P2})}import{jsx as q1}from"react/jsx-runtime";function Y0({message:_,toolCallPart:N}){if(N.name==="queryGraph")return q1(V0,{});if(N.name==="executeCode")return q1(W0,{});return q1(G0,{toolCallPart:N,message:_})}import{jsx as Q_,jsxs as b2}from"react/jsx-runtime";function K0(_){let{message:N,part:k,debugMode:L=!1,animate:Z=!1,streaming:J=!1}=_,{t:X}=D();function G(){switch(k.type){case"text":return Q_(k0,{textPart:k,role:N.role,streaming:J});case"thinking":return L?Q_(e1,{reasoningPart:k,streaming:J}):Q_(s1,{});case"tool-call":return L?Q_($0,{toolCallPart:k}):Q_(Y0,{toolCallPart:k,message:N});default:return b2("p",{className:"cortex-unhandled-type",children:[X("translate_unhandled_type")," ",k.type]})}}return Q_("div",{className:Q("cortex-message-part",Z&&"cortex-message-part--animated"),children:G()})}import{useState as U2}from"react";import{jsx as P,jsxs as f}from"react/jsx-runtime";function Q0({usage:_,modelId:N}){let{t:k}=D(),[L,Z]=U2(!1),J=y_(_)??0;return f("div",{className:Q("cortex-token-usage",L&&"cortex-token-usage--expanded"),children:[f("button",{className:"cortex-token-usage__summary",onClick:()=>Z((X)=>!X),children:[f("span",{className:"cortex-token-usage__total",children:[P("span",{className:"cortex-token-usage__total-number",children:b(_.total)}),P("span",{className:"cortex-token-usage__total-label",children:k("translate_tokens")})]}),N?P("span",{className:"cortex-token-usage__model",children:N}):null,f("span",{className:"cortex-token-usage__pills",children:[f("span",{className:"cortex-token-usage__pill",children:[P("span",{className:"cortex-token-usage__dot cortex-token-usage__dot--input"}),b(_.input.total)]}),f("span",{className:"cortex-token-usage__pill",children:[P("span",{className:"cortex-token-usage__dot cortex-token-usage__dot--output"}),b(_.output.total)]})]}),J>0?f("span",{className:"cortex-token-usage__cache-badge",children:[J,"%"]}):null,P("svg",{className:"cortex-token-usage__chevron",width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",children:P("path",{d:"M3 4.5L6 7.5L9 4.5",stroke:"currentColor",strokeWidth:"1.25",strokeLinecap:"round",strokeLinejoin:"round"})})]}),P("div",{className:"cortex-token-usage__details",children:P("div",{className:"cortex-token-usage__details-inner",children:f("div",{className:"cortex-token-usage__columns",children:[f("div",{className:"cortex-token-usage__col",children:[f("div",{className:"cortex-token-usage__col-header",children:[P("span",{className:"cortex-token-usage__dot cortex-token-usage__dot--input"}),P("span",{className:"cortex-token-usage__col-label",children:k("translate_input")}),P("span",{className:"cortex-token-usage__col-total",children:b(_.input.total)})]}),f("div",{className:"cortex-token-usage__rows",children:[_.input.noCache?f("div",{className:"cortex-token-usage__row",children:[P("span",{className:"cortex-token-usage__row-label",children:k("translate_fresh")}),P("span",{className:"cortex-token-usage__row-value",children:b(_.input.noCache)})]}):null,_.input.cacheRead?f("div",{className:"cortex-token-usage__row",children:[P("span",{className:"cortex-token-usage__row-label",children:k("translate_cache_read")}),P("span",{className:"cortex-token-usage__row-value",children:b(_.input.cacheRead)})]}):null,_.input.cacheWrite?f("div",{className:"cortex-token-usage__row",children:[P("span",{className:"cortex-token-usage__row-label",children:k("translate_cache_write")}),P("span",{className:"cortex-token-usage__row-value",children:b(_.input.cacheWrite)})]}):null]}),J>0?f("div",{className:"cortex-token-usage__cache-bar-row",children:[P("div",{className:"cortex-token-usage__cache-bar",children:P("div",{className:"cortex-token-usage__cache-fill",style:{width:`${J}%`}})}),P("span",{className:"cortex-token-usage__cache-label",children:k("translate_n_percent_cached",{percent:J})})]}):null]}),f("div",{className:"cortex-token-usage__col",children:[f("div",{className:"cortex-token-usage__col-header",children:[P("span",{className:"cortex-token-usage__dot cortex-token-usage__dot--output"}),P("span",{className:"cortex-token-usage__col-label",children:k("translate_output")}),P("span",{className:"cortex-token-usage__col-total",children:b(_.output.total)})]}),f("div",{className:"cortex-token-usage__rows",children:[_.output.text?f("div",{className:"cortex-token-usage__row",children:[P("span",{className:"cortex-token-usage__row-label",children:k("translate_text")}),P("span",{className:"cortex-token-usage__row-value",children:b(_.output.text)})]}):null,_.output.reasoning?f("div",{className:"cortex-token-usage__row",children:[P("span",{className:"cortex-token-usage__row-label",children:k("translate_reasoning")}),P("span",{className:"cortex-token-usage__row-value",children:b(_.output.reasoning)})]}):null]})]})]})})})]})}import{jsx as z_,jsxs as z0}from"react/jsx-runtime";function F0(_){let{message:N,debugMode:k=!1,animate:L=!1}=_,{messages:Z,isAgentWorking:J,messageMetadata:X}=D(),G=J&&b_(Z)?.id===N.id,$=N.role==="assistant",K=N.parts,z=K.filter((F,W)=>{if(F.type==="tool-result")return!1;return k||!d_(F,W===K.length-1,G)}),M=G?z.length-1:-1,B=X.get(N.id),U=Boolean(B?.isAborted),v=B?.tokenUsage,q=N.role==="user"?B?.attachments??[]:[],C=k&&!G&&(Boolean(v)||$);return z_("div",{className:"cortex-message",children:z.length>0&&z0("div",{className:"cortex-message-parts",children:[z.map((F,W)=>z_(K0,{part:F,message:N,debugMode:k,animate:L,streaming:W===M},W)),q.length>0&&z_(r1,{attachments:q}),U&&z_(o1,{}),C&&z0("div",{className:"cortex-message-debug-zone",children:[v&&z_(Q0,{usage:v,modelId:B?.modelId}),$&&z_(a1,{messageId:N.id})]})]})})}import{jsx as O1}from"react/jsx-runtime";function H0(_){let{messages:N,selectedThread:k}=D(),L=T_(null),Z=T_(!0),J=T_(!0),X=T_(!1),[G,$]=v2(!1);function K(){let q=L.current;if(q)q.scrollTop=q.scrollHeight}function z(){if(X.current)return;X.current=!0,queueMicrotask(()=>{X.current=!1,K(),Z.current=!1})}m_(()=>{let q=L.current;if(z(),$(!0),!q||typeof MutationObserver>"u")return;let C=new MutationObserver(()=>{if(!Z.current&&!J.current)return;z()});return C.observe(q,{childList:!0,subtree:!0,characterData:!0}),()=>C.disconnect()},[]);let M=k?.id;m_(()=>{$(!1),Z.current=!0,queueMicrotask(()=>$(!0))},[M]);let B=N[N.length-1],U=B?.role==="user"?B.id:void 0;m_(()=>{if(U)Z.current=!0},[U]),m_(()=>{if(!Z.current&&!J.current)return;z()},[N]);function v(){let q=L.current;if(!q)return;J.current=q.scrollHeight-q.scrollTop-q.clientHeight<100}return O1("div",{className:_.className,children:O1("div",{ref:L,className:"cortex-message-list",onScroll:v,children:N.map((q)=>O1(F0,{message:q,debugMode:_.debugMode,animate:G},q.id))})})}import{jsx as A,jsxs as j,Fragment as R2}from"react/jsx-runtime";var q0="M13.5 7.6c0 2.4-2.5 4.4-5.5 4.4-.6 0-1.2-.08-1.7-.23L3 13l.8-2.3C3 9.8 2.5 8.7 2.5 7.6 2.5 5.2 5 3.2 8 3.2s5.5 2 5.5 4.4Z";function O0(_){let{config:N,t:k,threads:L,selectedThread:Z,deleteThread:J}=D(),X=N.locale??"en";return j("div",{className:_.className,children:[j("div",{className:"cortex-widget__threads-header",children:[j("div",{children:[A("h2",{className:"cortex-widget__threads-title",children:k("translate_threads")}),A("p",{className:"cortex-widget__threads-count",children:k(L?.length===1?"translate_one_conversation":"translate_n_conversations",{count:L?.length??0})})]}),j("button",{onClick:()=>_.onNewChatRequested(),className:"cortex-widget__new-chat-btn",children:[A("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",children:A("path",{d:"M8 3v10M3 8h10",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})}),k("translate_new")]})]}),A("div",{className:"cortex-widget__threads-list",children:L===void 0?[1,2,3,4].map((G)=>j("div",{className:"cortex-widget__thread-skeleton",children:[A("div",{className:"cortex-skeleton cortex-widget__thread-skeleton-icon"}),A("div",{className:"cortex-widget__thread-skeleton-lines",children:A("div",{className:"cortex-skeleton cortex-widget__thread-skeleton-line",style:{width:`${40+G*12}%`}})})]},G)):j(R2,{children:[L.map((G)=>{let $=G.id===Z?.id,K=V1(G.updatedAt,X);return j("button",{onClick:()=>_.onThreadSelected(G),className:Q("cortex-widget__thread-item",$&&"cortex-widget__thread-item--active"),children:[A("div",{className:Q("cortex-widget__thread-icon",$&&"cortex-widget__thread-icon--active"),children:A("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:A("path",{d:q0,stroke:"currentColor",strokeWidth:"1.3",strokeLinecap:"round",strokeLinejoin:"round"})})}),j("div",{className:"cortex-widget__thread-info",children:[j("div",{className:"cortex-widget__thread-title-row",children:[A("p",{className:Q("cortex-widget__thread-title",$&&"cortex-widget__thread-title--active"),children:G.title??k("translate_untitled")}),G.isRunning&&j("span",{className:Q("cortex-widget__thread-running",$&&"cortex-widget__thread-running--active"),children:[A("span",{className:"cortex-widget__thread-running-dot"}),k("translate_running")]})]}),K&&A("p",{className:"cortex-widget__thread-time",children:K})]}),A("span",{role:"button",tabIndex:0,onClick:(z)=>{z.stopPropagation(),J(G.id)},onKeyDown:(z)=>{if(z.key!=="Enter"&&z.key!==" ")return;z.preventDefault(),z.stopPropagation(),J(G.id)},className:Q("cortex-widget__thread-delete",$&&"cortex-widget__thread-delete--active"),children:A("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",children:A("path",{d:"M4 4l8 8M12 4l-8 8",stroke:"currentColor",strokeWidth:"1.3",strokeLinecap:"round"})})}),A("svg",{className:Q("cortex-widget__thread-arrow",$&&"cortex-widget__thread-arrow--active"),width:"10",height:"10",viewBox:"0 0 16 16",fill:"none",children:A("path",{d:"M6 4l4 4-4 4",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})]},G.id)}),!L.length&&j("div",{className:"cortex-widget__threads-empty",children:[A("div",{className:"cortex-widget__threads-empty-icon",children:A("svg",{width:"18",height:"18",viewBox:"0 0 16 16",fill:"none",className:"cortex-widget__threads-empty-svg",children:A("path",{d:q0,stroke:"currentColor",strokeWidth:"1.3",strokeLinecap:"round",strokeLinejoin:"round"})})}),A("p",{className:"cortex-widget__threads-empty-title",children:k("translate_no_threads_yet")}),A("p",{className:"cortex-widget__threads-empty-subtitle",children:k("translate_start_a_new_conversation")}),A("button",{onClick:()=>_.onNewChatRequested(),className:"cortex-widget__new-chat-btn cortex-widget__new-chat-btn--empty-state",children:k("translate_new_chat")})]})]})})]})}import{jsx as y,jsxs as a}from"react/jsx-runtime";var B1={messages:[],isAgentWorking:!1,isLoadingMessages:!1,hasPendingToolCalls:!1,messageMetadata:new Map};function c2({config:_,className:N}){let k=k_(_);k.current=_;let[L,Z]=F_(),[J,X]=F_(),[G,$]=F_(B1),[K,z]=F_(!1),[M,B]=F_("threads"),[U,v]=F_(!1),q=k_(void 0),C=k_([]),F=k_(void 0),W=k_(null),V=D1(()=>h_(()=>k.current.transport),[]),S=D1(()=>{let Y=J?.thread;if(!Y)return;return L?.find((E)=>E.id===Y.id)??Y},[L,J]),c=k_(S);c.current=S;let O=k_(G);O.current=G;let u=T((Y)=>{$((E)=>({...E,...typeof Y==="function"?Y(E):Y}))},[]),H_=T((Y,E)=>{Z((w)=>{let l=w?.find((r_)=>r_.id===Y);return l?D_(w??[],{...l,isRunning:E}):w})},[]),x=T((Y,E)=>{if(c.current?.id===Y.id&&q.current)return;let w=c.current;if(c.current=Y,$(B1),X({thread:Y,mode:E?.skipLoadingMessages?"skip":"load",epoch:0}),w&&w.id!==Y.id)k.current.hooks?.onThreadDeselected?.(w);k.current.hooks?.onThreadSelected?.(Y)},[]),H=T(()=>{let Y=c.current;if(!Y&&!q.current)return;if(c.current=void 0,X(void 0),$(B1),Y)k.current.hooks?.onThreadDeselected?.(Y)},[]),R=T((Y)=>{u({hasPendingToolCalls:!1,messageMetadata:new Map}),X((E)=>({thread:Y,mode:"reload",epoch:(E?.epoch??0)+1}))},[u]),I=T((Y)=>{let E=c.current;if(E)return Promise.resolve(E.id);return F.current??=V.createThread(Y).then((w)=>{return F.current=void 0,Z((l)=>D_(l??[],w)),x(w,{skipLoadingMessages:!0}),w.id},(w)=>{throw F.current=void 0,w}),F.current},[V,x]),g=D1(()=>N1({api:V,ensureThread:()=>I()}),[V,I]),y1=n2(g.subscribe,g.getState,g.getState),B0=T(async(Y,E=[])=>{if(O.current.isAgentWorking||O.current.hasPendingToolCalls)return;let w=q.current;if(w){await w.send(Y,E);return}C.current.push({prompt:Y,attachments:E});try{await I(Y)}catch(l){throw C.current=[],l}},[I]),y0=T(async()=>{await q.current?.abort()},[]),E0=T((Y,E,w)=>{q.current?.addToolResult(Y,E,w)},[]),M0=T(async(Y)=>{if(c.current?.id===Y)H();await V.deleteThread(Y),Z((E)=>E?R_(E,Y):E)},[V,H]),w0=T(()=>{g.discardConsumed(),setTimeout(()=>W.current?.focusInput())},[g]),P0=T(()=>{g.restoreConsumed(c.current?.id)},[g]),l_=T(async()=>{let Y=v_(await V.listThreads());return Z(Y),Y},[V]),E1=T((Y)=>{Z((w)=>{let l=Z1(w??[],Y);return w||l.length?l:w});let E=c.current?.id;switch(Y.type){case"thread:deleted":if(E===Y.payload.threadId)H();break;case"thread:run-started":if(E===Y.payload.thread.id)q.current?.reattach(Y.payload.thread);break;case"thread:messages-updated":q.current?.refreshMessages(Y.payload.threadId);break}},[H]);D0(()=>{l_();let Y=!1,E=L1({wsUrl:()=>k.current.wsUrl,transport:{baseUrl:()=>{let w=k.current.transport.baseUrl;return typeof w==="string"?w:w()},getHeaders:()=>k.current.transport.getHeaders()},onEvent:E1,onOpen:()=>{if(!Y){Y=!0;return}l_().then((w)=>{let l=c.current;if(!l)return;q.current?.reattach(w.find((r_)=>r_.id===l.id)??l)})}});return()=>{E.close()}},[E1,l_]);let o_=k_(void 0),u_=S?.id;D0(()=>{if(u_===o_.current)return;g.clear(o_.current),o_.current=u_},[u_,g]);let M1=_.locale??"en",q_=T((Y,E)=>X1(M1,Y,E),[M1]),A0=_.viewMode??"helper",b0={config:_,t:q_,api:V,debugMode:K,threads:L,selectedThread:S,deleteThread:M0,...G,send:B0,abort:y0,addToolResult:E0,queue:{items:y1,...k1(y1),accept:g.accept,remove:g.remove,consumeReady:g.consumeReady}};function U0(Y){x(Y),B("chat"),v(!1)}function v0(){H(),B("chat"),v(!1)}function R0(){H(),B("threads")}return y(K1.Provider,{value:b0,children:a("div",{className:Q("cortex-widget",N),"data-cortex-theme":_.theme,children:[a("div",{className:Q("cortex-widget__container",A0==="full"&&"cortex-widget__container--full",U&&"cortex-widget__container--sidebar-open"),onDragOver:(Y)=>Y.preventDefault(),onDrop:(Y)=>Y.preventDefault(),children:[y(O0,{className:Q("cortex-widget__screen",M==="threads"&&"cortex-widget__screen--active",M!=="threads"&&"cortex-widget__screen--left"),onThreadSelected:U0,onNewChatRequested:v0}),a("div",{className:Q("cortex-widget__screen",M==="chat"&&"cortex-widget__screen--active",M!=="chat"&&"cortex-widget__screen--right"),children:[a("div",{className:"cortex-widget__chat-header",children:[y("button",{onClick:()=>v((Y)=>!Y),className:"cortex-widget__sidebar-toggle-btn",children:y("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:y("path",{d:"M2.5 4h11M2.5 8h11M2.5 12h11",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round"})})}),y("button",{onClick:R0,className:"cortex-widget__back-btn",children:y("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",className:"cortex-widget__back-icon",children:y("path",{d:"M10 3L5 8l5 5",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})}),y("div",{className:"cortex-widget__chat-title-wrap",children:y("p",{className:"cortex-widget__chat-title",children:S?.title??q_("translate_new_chat")})}),_.showDebugButton&&y("button",{onClick:()=>z((Y)=>!Y),className:Q("cortex-widget__debug-btn",K?"cortex-widget__debug-btn--on":"cortex-widget__debug-btn--off"),children:K?q_("translate_debug"):q_("translate_normal")})]}),G.isLoadingMessages&&!G.isAgentWorking?a("div",{className:"cortex-widget__messages-skeleton",children:[y("div",{className:"cortex-widget__msg-skel cortex-widget__msg-skel--user",children:a("div",{className:"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--user",children:[y("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"13rem"}}),y("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"9rem"}})]})}),y("div",{className:"cortex-widget__msg-skel cortex-widget__msg-skel--assistant",children:a("div",{className:"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--assistant",children:[y("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"16rem"}}),y("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"18rem"}}),y("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"12rem"}})]})}),y("div",{className:"cortex-widget__msg-skel cortex-widget__msg-skel--user",children:y("div",{className:"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--user",children:y("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"11rem"}})})}),y("div",{className:"cortex-widget__msg-skel cortex-widget__msg-skel--assistant",children:a("div",{className:"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--assistant",children:[y("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"14rem"}}),y("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"15rem"}})]})})]}):y(H0,{className:"cortex-widget__messages",debugMode:K}),G.isAgentWorking&&!G.hasPendingToolCalls&&a("div",{className:"cortex-widget__working",children:[a("div",{className:"cortex-widget__working-dots",children:[y("span",{className:"cortex-working-dot"}),y("span",{className:"cortex-working-dot"}),y("span",{className:"cortex-working-dot"})]}),y("span",{className:"cortex-widget__working-text",children:q_("translate_thinking")})]}),!G.hasPendingToolCalls&&y(T1,{ref:W})]}),y("div",{className:"cortex-widget__sidebar-backdrop",onClick:()=>v(!1)})]}),J&&y(f1,{thread:J.thread,mode:J.mode,api:V,configRef:k,sessionRef:q,pendingSendRef:C,patchUi:u,setRunning:H_,remount:R,onTurnFinished:w0,onSendFailed:P0},`${J.thread.id}:${J.epoch}`)]})})}export{c2 as CortexChatWidget};
1
+ import{useCallback as u,useEffect as P0,useMemo as A1,useRef as k_,useState as F_,useSyncExternalStore as l2}from"react";function P_(_){return Promise.resolve(_.getHeaders())}function v1(_,N){let k=_.baseUrl;return(typeof k==="string"?k:k()).replace(/\/$/,"")+N}function p0(_){let N=_?.match(/filename\*\s*=\s*[^']*'[^']*'([^;\r\n]+)/i)?.[1]?.trim().replace(/^"|"$/g,"");if(N)try{return decodeURIComponent(N)}catch{}return _?.match(/filename\s*=\s*"?([^";\r\n]+)"?/i)?.[1]}function h_(_){function N(){return P_(_())}function k(L){return v1(_(),L)}async function Z(L,J){let X=new Headers(await N());if(new Headers(J?.headers).forEach(function(W,z){X.set(z,W)}),J?.body instanceof FormData)X.delete("Content-Type");else if(!X.has("Content-Type"))X.set("Content-Type","application/json");let G=await fetch(k(L),{...J,headers:X});if(!G.ok)throw Error(`HTTP ${G.status}: ${G.statusText}`);let $=await G.text();return $?JSON.parse($):void 0}return{listThreads(){return Z("/threads")},createThread(L){return Z("/threads",{method:"POST",body:JSON.stringify({prompt:L})})},deleteThread(L){return Z(`/threads/${L}`,{method:"DELETE"})},listMessages(L){return Z(`/threads/${L}/messages`)},listLlmRequests(L){return Z(`/messages/${L}/llm-requests`)},abortStream(L){return Z(`/chat/${L}/abort`,{method:"POST"})},initiateToolCall(L,J){return Z(`/chat/${L}/tools/${J}/initiate`,{method:"POST"})},async uploadAttachment(L,J){let X=new FormData;return X.append("file",J),await Z(`/threads/${L}/files`,{method:"POST",body:X})},deleteAttachment(L){return Z(`/files/${L}`,{method:"DELETE"})},async downloadAttachment(L){let J=await fetch(k(`/files/${L}`),{headers:await N()});if(!J.ok)throw Error(`HTTP ${J.status}: ${J.statusText}`);return{blob:await J.blob(),name:p0(J.headers.get("Content-Disposition"))??L}},resolveHeaders:N,resolveUrl:k}}var T0=new Set(["complete","error"]);function U_(_){return T0.has(_)}function D_(_){return(b_(_)?.parts??[]).filter((k)=>k.type==="tool-call"&&!U_(k.state))}function b_(_){for(let N=_.length-1;N>=0;N-=1){let k=_[N];if(k?.role==="assistant")return k}return}var m0={complete:"success",error:"error","approval-requested":"approval","approval-responded":"approval","awaiting-input":"pending","input-streaming":"pending","input-complete":"pending"},u0={"awaiting-input":"translate_calling","input-streaming":"translate_calling","input-complete":"translate_input_ready","approval-requested":"translate_needs_approval","approval-responded":"translate_responded",complete:"translate_completed",error:"translate_error"};function x_(_){let{state:N,approval:k}=_;return{modifier:m0[N],labelKey:N==="approval-responded"&&k?.approved?"translate_approved":u0[N],pulse:N==="awaiting-input"||N==="input-streaming"?"default":N==="approval-requested"?"violet":void 0}}function i_(_){let N=_.output;if(N===void 0||N===null)return"";if(typeof N==="string")return N;return JSON.stringify(N,null,2)}var R1={code:"javascript",query:"cypher"};function a_(_){let N=_&&typeof _==="object"?_:null,k=N?Object.entries(R1).flatMap(([L,J])=>{let X=N[L];return typeof X==="string"?[{key:L,lang:J,value:X.replace(/\\n/g,`
2
+ `)}]:[]}):[],Z=_;if(N){let L=Object.fromEntries(Object.entries(N).filter(([J])=>!Object.hasOwn(R1,J)));Z=Object.keys(L).length>0?L:null}return{codeSnippets:k,remainingInput:Z,remainingInputText:Z?JSON.stringify(Z,null,2):""}}var c1=10,l0={"awaiting-input":"starting","input-streaming":"starting","input-complete":"processing","approval-requested":"processing","approval-responded":"processing",complete:"complete",error:"error"};function o0(_){let N=0;for(let k=0;k<_.length;k++)N=N*31+_.charCodeAt(k)|0;return Math.abs(N)%c1}function d_(_){let N=l0[_.state]??"processing",k=_.name==="readAttachment"?"attachment":"tool",Z=k==="tool"?`_${o0(_.id)}`:"";return{state:N,active:N==="starting"||N==="processing",titleKey:N==="error"?"translate_tool_error":`translate_${k}_${N==="complete"?"done":"status"}${Z}`}}function L_(_){return Array.from({length:c1},(N,k)=>`translate_${_}_${k}`)}var S1=["queryGraph","executeCode"];function t_(_,N,k){if(_.type==="thinking")return!(k&&N);if(_.type!=="tool-call")return!1;return S1.includes(_.name)&&U_(_.state)}import{EventType as j0}from"@tanstack/ai";import{fetchServerSentEvents as n1}from"@tanstack/ai-client";function s_(_){return{id:_.id,role:_.role,parts:_.parts}}function C1(_){for(let N=_.length-1;N>=0;N-=1){let k=_[N],Z="parts"in k&&k.parts.some((L)=>L.type==="tool-result");if(k.role==="user"||Z)return _.slice(N,N+1)}return _.slice(-1)}function v_(_){return new Map(_.flatMap((N)=>N.metadata?[[N.id,N.metadata]]:[]))}function e_(_){let{api:N,thread:k}=_,Z=async()=>({headers:await N.resolveHeaders()}),L=n1(()=>N.resolveUrl("/chat"),Z),J=function($,W,z,D){return L.connect(C1($),W,z,D)},X=n1(()=>N.resolveUrl(`/chat/${k.id}/stream`),Z),G=[];return{connect:J,async*joinRun($,W){yield{type:j0.MESSAGES_SNAPSHOT,timestamp:Date.now(),messages:G},yield*X.joinRun($,W)},hydrate:async()=>{let $=await r0(_);return G=$.messages,$}}}async function r0(_){let{api:N,thread:k,mode:Z}=_,L=k.isRunning?{runId:k.id}:null;if(Z==="skip")return{messages:[],activeRun:L,interrupts:null};if(Z==="load")_.setLoadingMessages?.(!0);try{let J=await N.listMessages(k.id),X=J.map(s_);return _.onHydrated?.(J,X),{messages:X,activeRun:L,interrupts:null}}finally{_.setLoadingMessages?.(!1)}}async function _1(_){try{let N=await _.api.listMessages(_.threadId);if(_.isStale?.())return;if(_.absorbMetadata(v_(N)),_.isStreaming())return;_.setMessages(N.map(s_))}catch{}}var N1=["image/png","image/jpeg","image/webp","application/pdf"];var I1=5;function g1(_,N){if(!N1.some((k)=>k===_))return"type";if(N>10485760)return"size";return"ok"}function k1(_){let{api:N}=_,k=new Set,Z=new Set,L=[],J=[];function X(){return L}function G(F){return k.add(F),()=>{k.delete(F)}}function $(F){L=F;for(let K of k)K()}function W(F,K){$(L.map((Y)=>Y.localId===F?{...Y,...K}:Y))}function z(F){if(Z.delete(F))return;W(F,{status:"error"})}function D(F){let K=[];for(let Y of F){let g=g1(Y.type,Y.size)!=="ok"||L.filter((y)=>y.status!=="error").length>=I1,n=crypto.randomUUID();if($([...L,{localId:n,filename:Y.name,status:g?"error":"uploading"}]),!g)K.push({localId:n,file:Y})}if(!K.length)return;_.ensureThread().then((Y)=>{for(let{localId:g,file:n}of K){if(Z.delete(g))continue;W(g,{threadId:Y}),N.uploadAttachment(Y,n).then((y)=>{if(Z.delete(g)){N.deleteAttachment(y.id).catch(()=>{});return}W(g,{status:"ready",attachmentId:y.id,summary:y})},()=>z(g))}},()=>{for(let{localId:Y}of K)z(Y)})}function O(F){let K=L.find((Y)=>Y.localId===F);if(!K)return;if(K.status==="uploading"){Z.add(F),$(L.filter((Y)=>Y.localId!==F));return}if(K.attachmentId){W(F,{status:"deleting"}),N.deleteAttachment(K.attachmentId).then(()=>$(L.filter((Y)=>Y.localId!==F)),()=>W(F,{status:"error"}));return}$(L.filter((Y)=>Y.localId!==F))}function P(F){let K=[];for(let Y of L){if(Y.threadId!==void 0&&Y.threadId!==F){K.push(Y);continue}if(Y.status==="uploading")Z.add(Y.localId);else if(Y.status==="ready"&&Y.threadId===F&&Y.attachmentId)N.deleteAttachment(Y.attachmentId).catch(()=>{})}$(K)}function v(){let F=L.flatMap((K)=>K.status==="ready"&&K.summary?[{...K,status:"ready",summary:K.summary}]:[]);return $(L.filter((K)=>K.status!=="ready")),J=F,F}function H(F){let K=J;if(J=[],K.some((Y)=>Y.threadId!==F))return;$([...K.map((Y)=>({...Y,status:"error"})),...L])}function I(){J=[]}return{getState:X,subscribe:G,accept:D,remove:O,clear:P,consumeReady:v,restoreConsumed:H,discardConsumed:I}}function L1(_){return{uploading:_.some((N)=>N.status==="uploading"),busy:_.some((N)=>N.status==="uploading"||N.status==="deleting"),hasReady:_.some((N)=>N.status==="ready")}}var h0=["completed","cancelled","failed"];function f1(_,N,k){if(N!==k)return null;if(typeof _!=="object"||_===null)return null;let Z=_;if(Z.type!=="cortex:interactive")return null;let L=h0.find((X)=>X===Z.status);if(!L)return null;let J=Z.reference;return{type:"cortex:interactive",status:L,...typeof J==="string"?{reference:J}:{}}}function Z1(_,N){try{return new URL(_).origin===N?"allow-scripts allow-forms allow-popups":"allow-scripts allow-forms allow-popups allow-same-origin"}catch{return"allow-scripts allow-forms allow-popups"}}function J1(_,N){try{return _.contentWindow?.location.origin===N}catch{return!1}}function $1(_){let N=!1,k=!1,Z,L;function J($){if(!N)_.onState($)}function X(){if(N)return;k=!1,J({phase:"error"})}function G($){if(N||k)return;k=!0,J({phase:"settling"});try{let W=_.submit($);if(W instanceof Promise)W.catch(X)}catch{X()}}return{async start(){J({phase:"initiating"});try{let $=await _.initiate();if(!$.interactive){J({phase:"unavailable"});return}if(!/^https?:$/.test(new URL($.embedUrl).protocol)){J({phase:"error"});return}Z=$.embedOrigin,J({phase:"embedded",embedUrl:$.embedUrl,surface:$.surface,embedOrigin:$.embedOrigin})}catch($){let W=$ instanceof Error?$.message:"";J({phase:/HTTP 404/.test(W)?"unavailable":"error"})}},setSource($){if($!==null&&$!==void 0)L=$},handleMessage($){if(!Z)return;if(L===void 0||$.source!==L)return;let W=f1($.data,$.origin,Z);if(!W)return;G({status:W.status,reference:W.reference})},cancel(){G({status:"cancelled"})},terminate(){if(N||k)return;Z=void 0,L=void 0,J({phase:"error"})},dispose(){N=!0}}}function x0(_){return Math.min(1000*2**(_-1),30000)}var i0=1e4;function X1(_){let N,k,Z=0,L=!1;function J(){let G=typeof _.wsUrl==="function"?_.wsUrl():_.wsUrl,$=a0(G,_.transport.baseUrl);P_(_.transport).then((W)=>{if(L)return;N=new WebSocket(_2($,W)),N.addEventListener("open",()=>{let z=N;setTimeout(()=>{if(N===z&&!L)Z=0},i0),_.onOpen?.()}),N.addEventListener("message",(z)=>{let D=z.data;if(typeof D!=="string")return;let O;try{O=JSON.parse(D)}catch{return}_.onEvent(O)}),N.addEventListener("close",X)}).catch(X)}function X(){if(L||k)return;Z+=1,k=setTimeout(()=>{k=void 0,J()},x0(Z))}return J(),{close(){L=!0,clearTimeout(k),N?.close()}}}function a0(_,N){let k=_??d0(N);if(!_)return k;let Z=t0(N);if(!Z)return k;return s0(k,Z)}function d0(_){let N=typeof _==="string"?_:_(),k=new URL(N,window.location.origin);return k.protocol=k.protocol==="https:"?"wss:":"ws:",k.pathname=k.pathname.replace(/\/$/,"")+"/ws",k.toString()}function t0(_){let N=typeof _==="string"?_:_(),Z=new URL(N,window.location.origin).pathname.split("/").filter(Boolean),L=Z.lastIndexOf("agents");if(L===-1)return;return Z[L+1]}function s0(_,N){let k=new URL(_,window.location.origin);if(k.searchParams.has("agentId")||e0(k))return k.toString();return k.searchParams.set("agentId",N),k.toString()}function e0(_){let N=_.pathname.split("/").filter(Boolean),k=N.lastIndexOf("agents");return k!==-1&&Boolean(N[k+1])}function _2(_,N){let k=N.Authorization??N.authorization;if(!k?.startsWith("Bearer "))return _;let Z=new URL(_,window.location.origin);if(Z.searchParams.has("token"))return Z.toString();return Z.searchParams.set("token",k.slice(7)),Z.toString()}function R_(_){return[..._].sort((N,k)=>{let Z=Date.parse(k.updatedAt)-Date.parse(N.updatedAt);if(Z!==0)return Z;return Date.parse(k.createdAt)-Date.parse(N.createdAt)})}function B_(_,N){let k=[..._],Z=k.findIndex((L)=>L.id===N.id);if(Z===-1)k.push(N);else k[Z]={...k[Z],...N};return R_(k)}function c_(_,N){return _.filter((k)=>k.id!==N)}function G1(_,N){switch(N.type){case"thread:deleted":return c_(_,N.payload.threadId);case"thread:created":case"thread:title-updated":case"thread:run-started":case"thread:run-finished":case"thread:messages-updated":return B_(_,N.payload.thread);default:return _}}import{marked as N2}from"marked";import k2 from"dompurify";function K1(_){if(!_)return"";let N=N2.parse(_,{async:!1});return N=N.replace(/<table>/g,'<div style="overflow-x:auto"><table style="width:auto">').replace(/<\/table>/g,"</table></div>").replace(/<(t[hd])([\s>])/g,'<$1 style="padding:0.5rem 1rem"$2'),k2.sanitize(N)}import O_ from"highlight.js/lib/core";import L2 from"highlight.js/lib/languages/javascript";import Z2 from"highlight.js/lib/languages/json";import J2 from"highlight.js/lib/languages/sql";var p1=!1;function $2(){if(p1)return;p1=!0,O_.registerLanguage("javascript",L2),O_.registerLanguage("json",Z2),O_.registerLanguage("cypher",J2)}function W1(_,N){if(!_)return"";return $2(),O_.getLanguage(N)?O_.highlight(_,{language:N}).value:X2(_)}function X2(_){return _.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var T1={translate_new:"جديد",translate_threads:"المحادثات",translate_n_conversations:"{{count}} محادثات",translate_one_conversation:"محادثة واحدة",translate_no_threads_yet:"لا توجد محادثات بعد",translate_start_a_new_conversation:"ابدأ محادثة جديدة",translate_untitled:"بدون عنوان",translate_new_chat:"محادثة جديدة",translate_normal:"عادي",translate_debug:"تصحيح",translate_type_a_message:"اكتب رسالة...",translate_thinking:"جارٍ معالجة الطلب...",translate_reasoned:"تم الاستنتاج",translate_knowledge_graph_query:"استعلام الرسم البياني المعرفي",translate_javascript_code_execution:"تنفيذ كود جافاسكريبت",translate_completed:"مكتمل",translate_attach_files:"إرفاق ملفات",translate_drop_files_here:"أفلت ملفاتك هنا...",translate_remove_attachment:"إزالة المرفق",translate_attachment_rejected:"لا يمكن إرفاق هذا الملف",translate_attachment_caption:"من فضلك اطّلع على الملفات المرفقة.",translate_download:"تنزيل",translate_tool_status_0:"جارٍ جلب البيانات…",translate_tool_status_1:"جارٍ تحليل المعلومات…",translate_tool_status_2:"جارٍ معالجة الطلب…",translate_tool_status_3:"جارٍ تجميع النتائج…",translate_tool_status_4:"جارٍ تحضير الرد…",translate_tool_status_5:"جارٍ البحث…",translate_tool_status_6:"جارٍ فحص السجلات…",translate_tool_status_7:"جارٍ مراجعة التفاصيل…",translate_tool_status_8:"جارٍ إجراء الحسابات…",translate_tool_status_9:"جارٍ سحب المعلومات…",translate_tool_done_0:"تم جلب البيانات بنجاح",translate_tool_done_1:"تم التحليل بنجاح",translate_tool_done_2:"تمت معالجة الطلب بنجاح",translate_tool_done_3:"تم تجميع النتائج بنجاح",translate_tool_done_4:"تم تحضير الرد بنجاح",translate_tool_done_5:"تم البحث بنجاح",translate_tool_done_6:"تم فحص السجلات بنجاح",translate_tool_done_7:"تمت المراجعة بنجاح",translate_tool_done_8:"تمت الحسابات بنجاح",translate_tool_done_9:"تم استرجاع المعلومات بنجاح",translate_tool_error:"حدث خطأ",translate_attachment_status:"جارٍ قراءة الملف المرفق…",translate_attachment_done:"تمت قراءة الملف المرفق",translate_graph_0:"جارٍ استكشاف الروابط...",translate_graph_1:"جارٍ رسم الخريطة...",translate_graph_2:"جارٍ اكتشاف العلاقات...",translate_graph_3:"جارٍ تتبع الروابط...",translate_graph_4:"جارٍ التنقل في المعرفة...",translate_graph_5:"جارٍ كشف الرؤى...",translate_graph_6:"جارٍ ربط النقاط...",translate_graph_7:"جارٍ تتبع المسار...",translate_graph_8:"جارٍ تجميع الأجزاء...",translate_graph_9:"جارٍ بناء الصورة...",translate_code_0:"جارٍ حساب الأرقام...",translate_code_1:"جارٍ معالجة البيانات...",translate_code_2:"جارٍ تنفيذ طلبك...",translate_code_3:"جارٍ تحليل الأرقام...",translate_code_4:"جارٍ تجميع كل شيء...",translate_code_5:"جارٍ تحليل النتائج...",translate_code_6:"جارٍ العمل خلف الكواليس...",translate_code_7:"جارٍ ترتيب التفاصيل...",translate_code_8:"جارٍ تحضير إجابتك...",translate_code_9:"أوشك على الانتهاء...",translate_reasoning_0:"جارٍ التفكير...",translate_reasoning_1:"جارٍ دراسة الخيارات...",translate_reasoning_2:"جارٍ تقييم الاحتمالات...",translate_reasoning_3:"جارٍ التأمل في هذا...",translate_reasoning_4:"جارٍ إيجاد الحل...",translate_reasoning_5:"جارٍ ترتيب الأفكار...",translate_reasoning_6:"جارٍ التمعن في الأمر...",translate_reasoning_7:"جارٍ إيجاد أفضل طريقة...",translate_reasoning_8:"جارٍ تنظيم أفكاري...",translate_reasoning_9:"أوشك على الانتهاء...",translate_running:"قيد التنفيذ",translate_aborted:"تم الإلغاء",translate_input:"المدخلات",translate_output:"المخرجات",translate_calling:"جارٍ الاستدعاء",translate_input_ready:"المدخلات جاهزة",translate_needs_approval:"بحاجة إلى موافقة",translate_approved:"تمت الموافقة",translate_responded:"تم الرد",translate_error:"خطأ",translate_approval_requested:"طلب موافقة",translate_approval_response:"رد الموافقة",translate_waiting_for_approval:"في انتظار الموافقة لتنفيذ هذه الأداة.",translate_tool_approved:"تمت الموافقة.",translate_tool_response_received:"تم استلام الرد.",translate_tokens:"رمز",translate_fresh:"جديد",translate_cache_read:"قراءة من الذاكرة",translate_cache_write:"كتابة في الذاكرة",translate_n_percent_cached:"{{percent}}٪ مخزّن مؤقتًا",translate_text:"نص",translate_reasoning:"الاستنتاج",translate_read:"قراءة",translate_write:"كتابة",translate_total:"الإجمالي",translate_request:"الطلب",translate_response:"الرد",translate_step_n:"الخطوة {{number}}",translate_inspect_llm_requests:"فحص طلبات النموذج",translate_loading:"جارٍ التحميل…",translate_no_llm_requests:"لا توجد طلبات نموذج مسجّلة لهذه الرسالة.",translate_unhandled_type:"نوع غير مدعوم:",translate_interactive_title:"أكمل هذه الخطوة للمتابعة",translate_interactive_loading:"جارٍ تجهيز خطوة آمنة...",translate_interactive_failed:"تعذّر تحميل هذه الخطوة",translate_interactive_retry:"حاول مرة أخرى",translate_interactive_cancel:"إلغاء"};var m1={translate_new:"New",translate_threads:"Threads",translate_n_conversations:"{{count}} conversations",translate_one_conversation:"1 conversation",translate_no_threads_yet:"No threads yet",translate_start_a_new_conversation:"Start a new conversation",translate_untitled:"Untitled",translate_new_chat:"New Chat",translate_normal:"Normal",translate_debug:"Debug",translate_type_a_message:"Type a message...",translate_thinking:"Thinking things through...",translate_reasoned:"Reasoned",translate_knowledge_graph_query:"Knowledge Graph Query",translate_javascript_code_execution:"JavaScript Code Execution",translate_completed:"Completed",translate_attach_files:"Attach files",translate_drop_files_here:"Drop your files here...",translate_remove_attachment:"Remove attachment",translate_attachment_rejected:"This file cannot be attached",translate_attachment_caption:"Please take a look at the attached files.",translate_download:"Download",translate_tool_status_0:"Fetching data...",translate_tool_status_1:"Analyzing information...",translate_tool_status_2:"Processing request...",translate_tool_status_3:"Gathering results...",translate_tool_status_4:"Preparing response...",translate_tool_status_5:"Looking things up...",translate_tool_status_6:"Checking records...",translate_tool_status_7:"Reviewing details...",translate_tool_status_8:"Running calculations...",translate_tool_status_9:"Pulling information...",translate_tool_done_0:"Data fetched successfully",translate_tool_done_1:"Analysis completed successfully",translate_tool_done_2:"Request processed successfully",translate_tool_done_3:"Results gathered successfully",translate_tool_done_4:"Response prepared successfully",translate_tool_done_5:"Lookup completed successfully",translate_tool_done_6:"Records checked successfully",translate_tool_done_7:"Review completed successfully",translate_tool_done_8:"Calculations completed successfully",translate_tool_done_9:"Information retrieved successfully",translate_tool_error:"Something went wrong",translate_attachment_status:"Reading the attached file...",translate_attachment_done:"Finished reading the file",translate_graph_0:"Exploring connections...",translate_graph_1:"Mapping out the links...",translate_graph_2:"Discovering relationships...",translate_graph_3:"Tracing the connections...",translate_graph_4:"Navigating the knowledge...",translate_graph_5:"Uncovering insights...",translate_graph_6:"Connecting the dots...",translate_graph_7:"Following the trail...",translate_graph_8:"Piecing things together...",translate_graph_9:"Building the picture...",translate_code_0:"Running the numbers...",translate_code_1:"Working through the data...",translate_code_2:"Processing your request...",translate_code_3:"Crunching the figures...",translate_code_4:"Putting it all together...",translate_code_5:"Analyzing the results...",translate_code_6:"Working behind the scenes...",translate_code_7:"Sorting through the details...",translate_code_8:"Preparing your answer...",translate_code_9:"Almost ready...",translate_reasoning_0:"Thinking it through...",translate_reasoning_1:"Considering the options...",translate_reasoning_2:"Weighing the possibilities...",translate_reasoning_3:"Reflecting on this...",translate_reasoning_4:"Working it out...",translate_reasoning_5:"Putting thoughts together...",translate_reasoning_6:"Mulling it over...",translate_reasoning_7:"Finding the best approach...",translate_reasoning_8:"Organizing my thoughts...",translate_reasoning_9:"Almost there...",translate_running:"Running",translate_aborted:"Aborted",translate_input:"Input",translate_output:"Output",translate_calling:"Calling",translate_input_ready:"Input ready",translate_needs_approval:"Needs approval",translate_approved:"Approved",translate_responded:"Responded",translate_error:"Error",translate_approval_requested:"Approval requested",translate_approval_response:"Approval response",translate_waiting_for_approval:"Waiting for approval to execute this tool.",translate_tool_approved:"Approved.",translate_tool_response_received:"Response received.",translate_tokens:"tokens",translate_fresh:"Fresh",translate_cache_read:"Cache read",translate_cache_write:"Cache write",translate_n_percent_cached:"{{percent}}% cached",translate_text:"Text",translate_reasoning:"Reasoning",translate_read:"Read",translate_write:"Write",translate_total:"Total",translate_request:"Request",translate_response:"Response",translate_step_n:"Step {{number}}",translate_inspect_llm_requests:"Inspect LLM requests",translate_loading:"loading…",translate_no_llm_requests:"No LLM requests recorded for this message.",translate_unhandled_type:"Unhandled type:",translate_interactive_title:"Complete this step to continue",translate_interactive_loading:"Preparing a secure step...",translate_interactive_failed:"This step could not be loaded",translate_interactive_retry:"Try again",translate_interactive_cancel:"Cancel"};var S_={en:m1,ar:T1};function Y1(_,N,k){let L=(S_[_]??S_.en)?.[N]??S_.en?.[N]??N;if(!k)return L;return L.replace(/\{\{\s*(\w+)\s*\}\}/g,(J,X)=>(X in k)?String(k[X]):J)}function X_(_){if(typeof _==="string"){let N=_.trim();if(!(N.startsWith("{")&&N.endsWith("}")||N.startsWith("[")&&N.endsWith("]")))return _;try{return X_(JSON.parse(N))}catch{return _}}if(Array.isArray(_))return _.map((N)=>X_(N));if(_!==null&&typeof _==="object"){let N={};for(let[k,Z]of Object.entries(_))N[k]=X_(Z);return N}return _}function V1(_,N){if(Array.isArray(_)){let k=_;return{kind:"container",open:"[",close:"]",summary:u1(k.length,"item","items"),entries:k.map((Z,L)=>({key:null,value:Z,path:`${N}[${L}]`}))}}if(_!==null&&typeof _==="object"){let k=Object.entries(_);return{kind:"container",open:"{",close:"}",summary:u1(k.length,"property","properties"),entries:k.map(([Z,L])=>({key:Z,value:L,path:`${N}.${Z}`}))}}return{kind:"primitive",text:W2(_),className:Y2(_)}}function u1(_,N,k){return`${_} ${_===1?N:k}`}function W2(_){if(_===null||_===void 0)return"null";if(typeof _==="string")return JSON.stringify(_);if(typeof _==="number"||typeof _==="boolean")return String(_);return JSON.stringify(_)??"null"}function Y2(_){if(_===null||_===void 0)return"jt-null";if(typeof _==="string")return"jt-string";if(typeof _==="number")return"jt-number";if(typeof _==="boolean")return"jt-boolean";return""}function n_(_){if(!_)return null;try{return JSON.parse(_)}catch{return _}}function C_(_){if(!_)return"";try{return JSON.stringify(JSON.parse(_),null,2)}catch{return _}}var Q1=[["year",31536000000],["month",2592000000],["week",604800000],["day",86400000],["hour",3600000],["minute",60000],["second",1000]];function z1(_,N,k=Date.now()){let Z=Date.parse(_);if(Number.isNaN(Z))return"";let L=Z-k,[J,X]=Q1.find(([,G])=>Math.abs(L)>=G)??Q1[Q1.length-1];return new Intl.RelativeTimeFormat(N,{numeric:"auto"}).format(Math.round(L/X),J)}function F1(_,N){let k=URL.createObjectURL(_),Z=document.createElement("a");Z.href=k,Z.download=N,Z.click(),URL.revokeObjectURL(k)}class Z_{onUpdate;fullText="";displayedLength=0;animationFrameId=null;isDone=!1;static DRAIN_FRACTION=0.03;static MIN_CHARS_PER_FRAME=1;static DONE_DRAIN_FRACTION=0.1;constructor(_){this.onUpdate=_}seed(_){this.fullText=_,this.displayedLength=_.length,this.onUpdate(_)}update(_,N){if(this.fullText=_,this.isDone=N,this.displayedLength=Math.min(this.displayedLength,this.fullText.length),N&&this.displayedLength>=this.fullText.length){this.onUpdate(this.fullText),this.stopAnimation();return}if(!this.animationFrameId)this.scheduleFrame()}destroy(){this.stopAnimation()}scheduleFrame(){this.animationFrameId=requestAnimationFrame(()=>this.tick())}tick(){let _=this.fullText.length-this.displayedLength;if(_<=0){this.animationFrameId=null;return}let N=this.isDone?Z_.DONE_DRAIN_FRACTION:Z_.DRAIN_FRACTION,k=Math.max(Z_.MIN_CHARS_PER_FRAME,Math.ceil(_*N));if(this.displayedLength=Math.min(this.fullText.length,this.displayedLength+k),this.onUpdate(this.fullText.substring(0,this.displayedLength)),this.displayedLength<this.fullText.length)this.scheduleFrame();else this.animationFrameId=null}stopAnimation(){if(this.animationFrameId)cancelAnimationFrame(this.animationFrameId),this.animationFrameId=null}}function y_(_){if(_.input.total<=0)return null;return Math.round(_.input.cacheRead/_.input.total*100)}import{useEffect as I_,useLayoutEffect as l1,useMemo as V2,useRef as i}from"react";import{useChat as Q2}from"@tanstack/ai-react";function o1(_){let{thread:N,api:k,patchUi:Z}=_,L=i(!0),J=i(!1),X=i(!1),G=i(!1),$=i(!1),W=i(new Set),z=i(Promise.resolve()),D=V2(()=>e_({api:k,thread:{id:N.id,isRunning:N.isRunning},mode:_.mode,onHydrated:(q,R)=>{if(!L.current)return;Z({messageMetadata:v_(q),hasPendingToolCalls:D_(R).length>0})},setLoadingMessages:(q)=>{if(L.current)Z({isLoadingMessages:q})}}),[]),O=Q2({threadId:N.id,persistence:!0,connection:D,onChunk:()=>{if(!L.current)return;X.current=!0},onError:()=>{if(!L.current)return;if(Z({hasPendingToolCalls:!1}),X.current)_.onTurnFinished();else _.onSendFailed()}}),P=i(O);P.current=O;let v=i(O.isLoading);v.current=O.isLoading;function H(){let q=D_(P.current.messages);return Z({hasPendingToolCalls:q.length>0}),q}async function I(q,R){let f=R({toolCallId:q.id,toolName:q.name,input:q.input},{threadId:N.id});if(f===null||f===void 0)return;let c=await Promise.resolve(f);if(c===null||c===void 0)return;if(!L.current)return;await P.current.addToolResult({toolCallId:q.id,tool:q.name,output:c}),H()}function F(){let q=H(),R=_.configRef.current.hooks?.onToolCall;if(!R)return q.length>0;for(let f of q){if(f.state!=="input-complete")continue;if(W.current.has(f.id))continue;W.current.add(f.id),I(f,R)}return q.length>0}async function K(q){if(!L.current||q!==N.id)return;await _1({api:k,threadId:q,isStale:()=>!L.current,isStreaming:()=>v.current,absorbMetadata:(R)=>Z({messageMetadata:R}),setMessages:(R)=>{P.current.setMessages(R),Z({hasPendingToolCalls:D_(R).length>0})}})}function Y(q){return z.current=z.current.then(()=>K(q)),z.current}async function g(){if(G.current){G.current=!1;return}if(J.current&&F())return;await Y(N.id)}async function n(q,R){_.setRunning(N.id,!0),J.current=!0,X.current=!1;let f={id:crypto.randomUUID(),role:"user",parts:[{type:"text",content:q}]};if(R.length)Z((c)=>({messageMetadata:new Map(c.messageMetadata).set(f.id,{attachments:R})}));await P.current.append(f)}async function y(){if(!v.current)return;let{aborted:q}=await k.abortStream(N.id).catch(()=>({aborted:!1}));if(!L.current)return;if(q)G.current=!0,_.setRunning(N.id,!1);P.current.stop(),Z({hasPendingToolCalls:!1})}function j(q,R,f){return P.current.addToolResult({toolCallId:q,tool:R,output:f}).then(()=>{H()},(c)=>{throw Y(N.id),c})}function q_(q){if(v.current)return;if(q.isRunning){_.remount(q);return}Y(q.id)}I_(()=>{return L.current=!0,()=>{L.current=!1}},[]);let d=i(void 0);return d.current={threadId:N.id,send:n,abort:y,addToolResult:j,reattach:q_,refreshMessages:(q)=>{Y(q)}},l1(()=>{_.sessionRef.current=d.current}),l1(()=>{return()=>{if(_.sessionRef.current===d.current)_.sessionRef.current=void 0}},[]),I_(()=>{if(!_.pendingSendRef.current.length)return;let q=setTimeout(()=>{let R=_.pendingSendRef.current;_.pendingSendRef.current=[],(async()=>{for(let{prompt:f,attachments:c}of R)await n(f,c)})()});return()=>clearTimeout(q)},[]),I_(()=>{Z({messages:O.messages})},[O.messages]),I_(()=>{if(Z({isAgentWorking:O.isLoading}),O.isLoading){$.current=!0;return}if(!$.current)return;$.current=!1,_.onTurnFinished(),g()},[O.isLoading]),null}import{createContext as z2,useContext as F2}from"react";var q1=z2(void 0);function B(){let _=F2(q1);if(!_)throw Error("useCortex must be used inside <CortexChatWidget>");return _}function Q(..._){return _.filter(Boolean).join(" ")}import{forwardRef as q2,useEffect as H2,useImperativeHandle as D2,useRef as D1,useState as r1}from"react";import{jsx as t,jsxs as H1}from"react/jsx-runtime";function j1(){let{queue:_,t:N}=B();if(!_.items.length)return null;return t("div",{className:"cortex-attachment-queue",children:_.items.map((k)=>H1("div",{className:Q("cortex-attachment-chip",k.status==="error"&&"cortex-attachment-chip--error"),title:k.status==="error"?N("translate_attachment_rejected"):"",children:[k.status==="uploading"||k.status==="deleting"?H1("svg",{className:"cortex-attachment-chip__spinner",viewBox:"0 0 16 16",fill:"none",children:[t("circle",{cx:"8",cy:"8",r:"6",stroke:"currentColor",strokeWidth:"2",className:"cortex-attachment-chip__spinner-track"}),t("path",{d:"M14 8a6 6 0 0 0-6-6",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})]}):H1("svg",{viewBox:"0 0 16 16",className:"cortex-attachment-chip__icon",fill:"none",children:[t("path",{d:"M4 1.5h5.172a2 2 0 0 1 1.414.586l2.328 2.328a2 2 0 0 1 .586 1.414V12.5a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-9a2 2 0 0 1 2-2Z",stroke:"currentColor",strokeWidth:"1.25"}),t("path",{d:"M9.5 1.5v2a2 2 0 0 0 2 2h2",stroke:"currentColor",strokeWidth:"1.25",strokeLinecap:"round"})]}),t("span",{className:"cortex-attachment-chip__name",children:k.filename}),t("button",{type:"button",onClick:()=>_.remove(k.localId),className:"cortex-attachment-chip__remove",disabled:k.status==="deleting","aria-label":N("translate_remove_attachment"),children:t("svg",{viewBox:"0 0 16 16",fill:"none",children:t("path",{d:"M4.5 4.5l7 7m0-7l-7 7",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})})})]},k.localId))})}import{jsx as r,jsxs as g_}from"react/jsx-runtime";var B2=N1.join(","),h1=q2(function(N,k){let{t:Z,queue:L,isAgentWorking:J,send:X,abort:G}=B(),[$,W]=r1(""),[z,D]=r1(!1),O=D1(null),P=D1(null);D2(k,()=>({focusInput:()=>O.current?.focus()}));let v=D1(J);H2(()=>{if(v.current&&!J)O.current?.focus();v.current=J},[J]);let H=!L.busy&&(Boolean($.trim())||L.hasReady);function I(){if(J||!H)return;let y="translate_attachment_caption",j=Z(y),q_=j!==y?j:"Please take a look at the attached files.",d=$.trim()||q_,q=L.consumeReady();W(""),X(d,q.map((R)=>R.summary))}function F(y){if(y.key==="Enter"&&!y.shiftKey)y.preventDefault(),I()}function K(y){y.preventDefault(),D(!0)}function Y(y){if(!y.currentTarget.contains(y.relatedTarget))D(!1)}function g(y){y.preventDefault(),D(!1),L.accept([...y.dataTransfer.files])}function n(y){let j=y.clipboardData.files;if(!j.length)return;y.preventDefault(),L.accept([...j])}return g_("div",{className:"cortex-widget__input-area",onDragOver:K,onDragLeave:Y,onDrop:g,children:[r(j1,{}),g_("div",{className:Q("cortex-widget__input-box",J&&"cortex-widget__input-box--disabled",!J&&"cortex-widget__input-box--enabled",z&&"cortex-widget__input-box--dragging"),children:[r("textarea",{ref:O,onKeyDown:F,onPaste:n,value:$,onChange:(y)=>W(y.target.value),placeholder:z?Z("translate_drop_files_here"):J?"":Z("translate_type_a_message"),disabled:J,rows:1,className:Q("cortex-widget__textarea",J&&"cortex-widget__textarea--disabled")}),J?g_("button",{onClick:()=>void G(),className:"cortex-stop-btn",children:[r("span",{className:"cortex-stop-btn__ring"}),r("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",className:"cortex-stop-btn__icon",children:r("rect",{x:"1",y:"1",width:"10",height:"10",rx:"2.5",fill:"currentColor"})})]}):g_("div",{className:"cortex-widget__input-actions",children:[r("button",{type:"button",onClick:()=>P.current?.click(),className:"cortex-widget__attach-btn","aria-label":Z("translate_attach_files"),children:r("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:r("path",{d:"M10.5 5.5 6.2 9.8a1.4 1.4 0 0 0 2 2l4.6-4.6a2.8 2.8 0 0 0-4-4L4.2 7.8a4.2 4.2 0 0 0 6 6l4-4",stroke:"currentColor",strokeWidth:"1.3",strokeLinecap:"round",strokeLinejoin:"round"})})}),r("input",{ref:P,type:"file",multiple:!0,accept:B2,onChange:(y)=>{L.accept([...y.target.files??[]]),y.target.value=""},className:"cortex-widget__file-input"}),r("button",{onClick:I,className:Q("cortex-widget__send-btn",!H&&"cortex-widget__send-btn--empty",H&&"cortex-widget__send-btn--ready"),disabled:!H,children:r("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",className:"cortex-widget__send-icon",children:r("path",{d:"M3 8h10M9 4l4 4-4 4",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})})]})]})]})});import{useEffect as m_,useRef as u_,useState as m2}from"react";import{jsx as f_,jsxs as x1}from"react/jsx-runtime";function i1(){let{t:_}=B();return x1("div",{className:"cortex-aborted-flag",children:[f_("span",{className:"cortex-aborted-flag__line"}),x1("span",{className:"cortex-aborted-flag__label",children:[f_("svg",{className:"cortex-aborted-flag__icon",width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",children:f_("path",{d:"M6 1.5v5M6 8.75v.5",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round"})}),_("translate_aborted")]}),f_("span",{className:"cortex-aborted-flag__line"})]})}import{jsx as G_,jsxs as a1}from"react/jsx-runtime";function d1(_){let{api:N,t:k}=B();async function Z(L){let{blob:J,name:X}=await N.downloadAttachment(L);F1(J,X)}return G_("div",{className:"cortex-message-attachments",children:_.attachments.map((L)=>a1("button",{type:"button",onClick:()=>void Z(L.id),className:"cortex-message-attachment","aria-label":`${k("translate_download")}: ${L.filename}`,children:[a1("svg",{viewBox:"0 0 16 16",className:"cortex-message-attachment__icon",fill:"none",children:[G_("path",{d:"M4 1.5h5.172a2 2 0 0 1 1.414.586l2.328 2.328a2 2 0 0 1 .586 1.414V12.5a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2v-9a2 2 0 0 1 2-2Z",stroke:"currentColor",strokeWidth:"1.25"}),G_("path",{d:"M9.5 1.5v2a2 2 0 0 0 2 2h2",stroke:"currentColor",strokeWidth:"1.25",strokeLinecap:"round"})]}),G_("span",{className:"cortex-message-attachment__name",children:L.filename}),G_("svg",{viewBox:"0 0 16 16",className:"cortex-message-attachment__dl-icon",fill:"none",children:G_("path",{d:"M8 3v7m0 0L5.5 7.5M8 10l2.5-2.5M3 13h10",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})]},L.id))})}import{useRef as w2,useState as M_}from"react";import{useRef as O2,useState as y2}from"react";import{jsx as K_,jsxs as M2}from"react/jsx-runtime";function e({value:_,className:N}){let[k,Z]=y2(!1),L=O2(null);async function J(X){X.stopPropagation(),X.preventDefault();try{if(await navigator.clipboard.writeText(_),Z(!0),L.current)clearTimeout(L.current);L.current=setTimeout(()=>Z(!1),1500)}catch{}}return K_("span",{className:Q("cortex-copy-btn",N),children:K_("button",{className:Q("cortex-copy-btn__button",k&&"cortex-copy-btn__button--copied"),onClick:(X)=>void J(X),"aria-label":k?"Copied":"Copy to clipboard",type:"button",children:k?K_("svg",{className:"cortex-copy-btn__icon cortex-copy-btn__icon--check",width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",children:K_("path",{d:"M5 13l4 4L19 7",stroke:"currentColor",strokeWidth:"2.5",strokeLinecap:"round",strokeLinejoin:"round"})}):M2("svg",{className:"cortex-copy-btn__icon",width:"13",height:"13",viewBox:"0 0 24 24",fill:"none",children:[K_("rect",{x:"9",y:"9",width:"12",height:"12",rx:"2",stroke:"currentColor",strokeWidth:"2"}),K_("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})]})})})}import{useMemo as E2,useState as A2}from"react";import{jsx as o,jsxs as J_,Fragment as p_}from"react/jsx-runtime";function $_({data:_,expandDepth:N=1,className:k}){let Z=E2(()=>X_(_),[_]),[L,J]=A2({});function X($,W){return L[$]??W>=N}function G($,W){J((z)=>({...z,[$]:!X($,W)}))}return o("div",{className:Q("cortex-json-tree",k),children:o(t1,{value:Z,path:"$",depth:0,isCollapsed:X,toggle:G})})}function t1({value:_,path:N,depth:k,isCollapsed:Z,toggle:L}){let J=V1(_,N);if(J.kind==="primitive")return o("span",{className:J.className,children:J.text});if(J.entries.length===0)return J_("span",{className:"jt-bracket",children:[J.open,J.close]});let X=Z(N,k);function G($){L(N,k),$.stopPropagation()}return J_(p_,{children:[J_("span",{className:"jt-toggle",onClick:G,role:"button",children:[o("span",{className:Q("jt-arrow",X&&"jt-arrow--collapsed"),children:"▾"}),o("span",{className:"jt-bracket",children:J.open})]}),X?J_(p_,{children:[o("span",{className:"jt-collapsed-hint",onClick:G,role:"button",children:J.summary}),o("span",{className:"jt-bracket",children:J.close})]}):J_(p_,{children:[o("div",{className:"jt-indent",children:J.entries.map(($,W)=>J_("div",{className:"jt-line",children:[$.key!==null&&J_(p_,{children:[o("span",{className:"jt-key",children:`"${$.key}"`}),o("span",{className:"jt-colon",children:": "})]}),o(t1,{value:$.value,path:$.path,depth:k+1,isCollapsed:Z,toggle:L}),W<J.entries.length-1&&o("span",{className:"jt-comma",children:","})]},$.path))}),o("span",{className:"jt-bracket",children:J.close})]})]})}function b(_){return _.toLocaleString("en-US")}import{jsx as W_,jsxs as Y_}from"react/jsx-runtime";function s1({usage:_}){let{t:N}=B();return Y_("div",{className:"cortex-llm-inspector__usage-rows",children:[Y_("div",{className:"cortex-llm-inspector__usage-row",children:[W_("span",{className:"cortex-llm-inspector__usage-lbl",children:N("translate_input")}),W_("span",{className:"cortex-llm-inspector__usage-val",children:b(_.input.total)}),Y_("span",{className:"cortex-llm-inspector__usage-detail",children:[N("translate_fresh")," ",b(_.input.noCache)," · ",N("translate_read")," ",b(_.input.cacheRead)," · ",N("translate_write")," ",b(_.input.cacheWrite)]})]}),Y_("div",{className:"cortex-llm-inspector__usage-row",children:[W_("span",{className:"cortex-llm-inspector__usage-lbl",children:N("translate_output")}),W_("span",{className:"cortex-llm-inspector__usage-val",children:b(_.output.total)}),Y_("span",{className:"cortex-llm-inspector__usage-detail",children:[N("translate_text")," ",b(_.output.text)," · ",N("translate_reasoning")," ",b(_.output.reasoning)]})]}),Y_("div",{className:"cortex-llm-inspector__usage-row cortex-llm-inspector__usage-row--total",children:[W_("span",{className:"cortex-llm-inspector__usage-lbl",children:N("translate_total")}),W_("span",{className:"cortex-llm-inspector__usage-val",children:b(_.total)})]})]})}import{jsx as B1,jsxs as T_}from"react/jsx-runtime";function e1({usage:_}){let N=y_(_);return B1("span",{children:T_("span",{className:"cortex-llm-inspector__step-metrics",children:[T_("span",{className:"cortex-llm-inspector__metric",children:[B1("span",{className:"cortex-llm-inspector__dot cortex-llm-inspector__dot--input"}),b(_.input.total)]}),T_("span",{className:"cortex-llm-inspector__metric",children:[B1("span",{className:"cortex-llm-inspector__dot cortex-llm-inspector__dot--output"}),b(_.output.total)]}),N!==null?T_("span",{className:"cortex-llm-inspector__cache-pct",children:[N,"%"]}):null]})})}import{jsx as S,jsxs as __}from"react/jsx-runtime";function _0({messageId:_}){let{t:N,api:k}=B(),[Z,L]=M_(!1),[J,X]=M_(!1),[G,$]=M_([]),[W,z]=M_(null),[D,O]=M_({}),P=w2(!1);async function v(){if(!P.current){X(!0);try{$(await k.listLlmRequests(_))}finally{X(!1),P.current=!0}}L((K)=>!K)}function H(K){z((Y)=>Y===K?null:K)}function I(K){return D[K]??"prompt"}function F(K,Y){O((g)=>({...g,[K]:Y}))}return __("div",{className:Q("cortex-llm-inspector",Z&&"cortex-llm-inspector--open"),children:[__("button",{className:"cortex-llm-inspector__trigger",onClick:()=>void v(),children:[S("svg",{className:"cortex-llm-inspector__icon",width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:S("path",{d:"M6 2a4 4 0 1 0 0 8 4 4 0 0 0 0-8ZM0 6a6 6 0 1 1 10.89 3.477l4.817 4.816a1 1 0 0 1-1.414 1.414l-4.816-4.816A6 6 0 0 1 0 6Z",fill:"currentColor"})}),S("span",{children:N("translate_inspect_llm_requests")}),J?S("span",{className:"cortex-llm-inspector__loading",children:N("translate_loading")}):G.length>0?S("span",{className:"cortex-llm-inspector__badge",children:G.length}):null,S("svg",{className:"cortex-llm-inspector__chevron",width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",children:S("path",{d:"M3 4.5L6 7.5L9 4.5",stroke:"currentColor",strokeWidth:"1.25",strokeLinecap:"round",strokeLinejoin:"round"})})]}),S("div",{className:"cortex-llm-inspector__panel-wrapper",children:S("div",{className:"cortex-llm-inspector__panel-inner",children:__("div",{className:"cortex-llm-inspector__panel",children:[G.length===0&&!J?S("div",{className:"cortex-llm-inspector__empty",children:N("translate_no_llm_requests")}):null,G.map((K,Y)=>__("div",{className:Q("cortex-llm-inspector__step",W===K.id&&"cortex-llm-inspector__step--expanded"),children:[__("button",{className:"cortex-llm-inspector__step-header",onClick:()=>H(K.id),children:[S("span",{className:"cortex-llm-inspector__step-label",children:N("translate_step_n",{number:Y+1})}),K.tokenUsage?S(e1,{usage:K.tokenUsage}):null,S("svg",{className:"cortex-llm-inspector__step-chevron",width:"10",height:"10",viewBox:"0 0 12 12",fill:"none",children:S("path",{d:"M3 4.5L6 7.5L9 4.5",stroke:"currentColor",strokeWidth:"1.25",strokeLinecap:"round",strokeLinejoin:"round"})})]}),S("div",{className:"cortex-llm-inspector__step-body-wrapper",children:S("div",{className:"cortex-llm-inspector__step-body-inner",children:__("div",{className:"cortex-llm-inspector__step-body",children:[K.tokenUsage?S(s1,{usage:K.tokenUsage}):null,__("div",{className:"cortex-llm-inspector__tabs",children:[S("button",{className:Q("cortex-llm-inspector__tab",I(K.id)==="prompt"&&"cortex-llm-inspector__tab--active"),onClick:()=>F(K.id,"prompt"),children:N("translate_request")}),S("button",{className:Q("cortex-llm-inspector__tab",I(K.id)==="response"&&"cortex-llm-inspector__tab--active"),onClick:()=>F(K.id,"response"),children:N("translate_response")})]}),__("div",{className:"cortex-llm-inspector__json-pane",children:[S(e,{className:"cortex-llm-inspector__json-copy",value:I(K.id)==="prompt"?C_(K.prompt):C_(K.output)}),I(K.id)==="prompt"?S($_,{data:n_(K.prompt),expandDepth:2}):S($_,{data:n_(K.output),expandDepth:2})]})]})})})]},K.id))]})})})]})}import{useEffect as P2,useRef as U2,useState as N0}from"react";import{jsx as E_,jsxs as k0}from"react/jsx-runtime";function V_({labels:_,className:N}){let{t:k}=B(),[Z,L]=N0(0),[J,X]=N0("idle"),G=U2(_.length);return G.current=_.length,P2(()=>{let $,W;function z(){$=setTimeout(()=>{X("exiting"),$=setTimeout(()=>{L((D)=>(D+1)%G.current),X("enter-start"),W=requestAnimationFrame(()=>{X("entering"),$=setTimeout(()=>{X("idle"),z()},300)})},300)},2000)}return z(),()=>{if($)clearTimeout($);if(W)cancelAnimationFrame(W)}},[]),k0("div",{className:Q("cortex-subtle-activity",N),children:[k0("div",{className:"cortex-subtle-activity__dots",children:[E_("span",{className:"cortex-subtle-activity__dot"}),E_("span",{className:"cortex-subtle-activity__dot cortex-subtle-activity__dot--d1"}),E_("span",{className:"cortex-subtle-activity__dot cortex-subtle-activity__dot--d2"})]}),E_("div",{className:"cortex-subtle-activity__label-mask",children:E_("span",{className:Q("cortex-subtle-activity__label",`cortex-subtle-activity__label--${J}`),children:k(_[Z])})})]})}import{jsx as L0}from"react/jsx-runtime";var b2=L_("reasoning");function Z0(){return L0("div",{className:"cortex-reasoning-animated",children:L0(V_,{labels:b2})})}import{jsx as h,jsxs as A_}from"react/jsx-runtime";function J0(_){let{reasoningPart:N,streaming:k=!1}=_,{t:Z}=B();return A_("details",{className:"cortex-reasoning-details",children:[A_("summary",{className:"cortex-reasoning-details__summary",children:[A_("div",{className:"cortex-reasoning-details__header",children:[h("span",{className:"cortex-reasoning-details__icon",children:A_("svg",{width:"14",height:"14",viewBox:"0 0 20 20",fill:"none","aria-hidden":"true",children:[h("path",{d:"M10 2C6.686 2 4 4.686 4 8c0 1.655.672 3.154 1.757 4.243.362.363.576.858.576 1.371V14.5a1 1 0 0 0 1 1h5.334a1 1 0 0 0 1-1v-.886c0-.513.214-1.008.576-1.371A5.978 5.978 0 0 0 16 8c0-3.314-2.686-6-6-6Z",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round",strokeLinejoin:"round"}),h("path",{d:"M7.5 17.5h5M8.5 8a2 2 0 0 1 2-2",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round",strokeLinejoin:"round"})]})}),h("div",{className:"cortex-reasoning-details__title-group",children:A_("div",{className:"cortex-reasoning-details__title-row",children:[h("div",{className:"cortex-reasoning-details__title",children:Z("translate_reasoning")}),h("span",{className:Q("cortex-reasoning-details__badge",k?"cortex-reasoning-details__badge--streaming":"cortex-reasoning-details__badge--done"),children:k?"Streaming":"Done"})]})})]}),h("span",{className:"cortex-reasoning-details__chevron","aria-hidden":"true",children:h("svg",{width:"14",height:"14",viewBox:"0 0 20 20",fill:"none",children:h("path",{d:"m5.75 8.25 4.25 4.25 4.25-4.25",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})})]}),h("div",{className:"cortex-reasoning-details__body",children:h("div",{className:"cortex-reasoning-details__content",children:h("pre",{className:"cortex-reasoning-details__pre",children:N.content.trim()?N.content:"No reasoning provided."})})})]})}import{useEffect as $0,useRef as O1,useState as v2}from"react";import{jsx as X0}from"react/jsx-runtime";function G0(_){let{role:N,textPart:k,streaming:Z=!1}=_,L=N==="assistant"&&Z?"":k.content,[J,X]=v2(L),G=O1(L),$=O1(null),W=O1(!0);return $0(()=>{function z(D){G.current=D,X(D)}if(N!=="assistant"||!Z){$.current?.destroy(),$.current=null,z(k.content),W.current=!1;return}if(!$.current)$.current=new Z_(z),$.current.seed(G.current);if(W.current){W.current=!1,$.current.seed(k.content);return}$.current.update(k.content,!1)},[N,Z,k]),$0(()=>()=>{$.current?.destroy(),$.current=null},[]),X0("div",{className:Q("cortex-text-part",N==="assistant"&&"cortex-text-part--assistant",N==="user"&&"cortex-text-part--user"),children:X0("div",{className:Q("cortex-text-bubble",N==="assistant"&&"cortex-text-bubble--assistant",N==="user"&&"cortex-text-bubble--user"),dangerouslySetInnerHTML:{__html:K1(J)}})})}import{jsx as m,jsxs as N_}from"react/jsx-runtime";function K0({toolCallPart:_}){let{t:N}=B(),{state:k,approval:Z}=_,L=_.output,J=i_(_);function X(){if(k==="complete")return N_("div",{className:"dbg-tool__section dbg-tool__section--success",children:[N_("div",{className:"dbg-tool__section-bar",children:[m("span",{className:"dbg-tool__section-label dbg-tool__section-label--success",children:N("translate_output")}),m("span",{className:"dbg-tool__section-lang",children:"json"}),m(e,{value:J})]}),m("div",{dir:"ltr",className:"dbg-tool__tree",children:m($_,{data:L,expandDepth:2})})]});if(k==="error")return N_("div",{className:"dbg-tool__section dbg-tool__section--error",children:[N_("div",{className:"dbg-tool__section-bar",children:[m("span",{className:"dbg-tool__section-label dbg-tool__section-label--error",children:N("translate_error")}),m(e,{value:J})]}),m("pre",{dir:"ltr",className:"dbg-tool__error-pre",children:J})]});if(k==="approval-requested")return N_("div",{className:"dbg-tool__section dbg-tool__section--approval",children:[N_("div",{className:"dbg-tool__section-bar",children:[m("span",{className:"dbg-tool__section-label dbg-tool__section-label--approval",children:N("translate_approval_requested")}),m("span",{className:"dbg-tool__section-lang",children:Z?.id})]}),m("div",{className:"dbg-tool__message dbg-tool__message--approval",children:N("translate_waiting_for_approval")})]});if(k==="approval-responded")return N_("div",{className:"dbg-tool__section dbg-tool__section--approval",children:[N_("div",{className:"dbg-tool__section-bar",children:[m("span",{className:"dbg-tool__section-label dbg-tool__section-label--approval",children:N("translate_approval_response")}),m("span",{className:"dbg-tool__section-lang",children:Z?.id})]}),m("div",{className:"dbg-tool__message dbg-tool__message--approval",children:N(Z?.approved?"translate_tool_approved":"translate_tool_response_received")})]});return null}return m("div",{children:X()})}import{jsx as W0,jsxs as R2}from"react/jsx-runtime";function Y0({toolCallPart:_}){let{t:N}=B(),k=x_(_);return W0("span",{children:R2("span",{className:Q("dbg-tool__state",k.modifier&&`dbg-tool__state--${k.modifier}`),children:[k.pulse&&W0("span",{className:Q("dbg-tool__pulse",k.pulse==="violet"&&"dbg-tool__pulse--violet")}),N(k.labelKey)]})})}import{jsx as T,jsxs as s}from"react/jsx-runtime";function V0({toolCallPart:_}){let{t:N}=B(),{codeSnippets:k,remainingInput:Z,remainingInputText:L}=a_(_.input);return s("details",{className:"dbg-tool","data-state":_.state,children:[T("summary",{className:"dbg-tool__summary",children:s("div",{className:"dbg-tool__header",children:[s("div",{className:"dbg-tool__meta",children:[T("div",{className:"dbg-tool__title-row",children:T("span",{className:"dbg-tool__name",title:_.name,children:_.name})}),T("div",{className:"dbg-tool__id-row",children:T("span",{className:"dbg-tool__id",children:_.id})})]}),s("div",{className:"dbg-tool__actions",children:[T(Y0,{toolCallPart:_}),T("svg",{className:"dbg-tool__chevron",width:"14",height:"14",viewBox:"0 0 20 20",fill:"none",children:T("path",{d:"m5.75 8.25 4.25 4.25 4.25-4.25",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})]})]})}),s("div",{className:"dbg-tool__body",children:[k.map((J)=>s("div",{className:"dbg-tool__section",children:[s("div",{className:"dbg-tool__section-bar",children:[T("span",{className:"dbg-tool__section-label",children:J.key}),T("span",{className:"dbg-tool__section-lang",children:J.lang}),T(e,{value:J.value})]}),T("pre",{dir:"ltr",className:"dbg-tool__pre",children:T("code",{className:"hljs",dangerouslySetInnerHTML:{__html:W1(J.value,J.lang)}})})]},J.key)),!!Z&&s("div",{className:"dbg-tool__section",children:[s("div",{className:"dbg-tool__section-bar",children:[T("span",{className:"dbg-tool__section-label",children:N("translate_input")}),T("span",{className:"dbg-tool__section-lang",children:"json"}),T(e,{value:L})]}),T("div",{dir:"ltr",className:"dbg-tool__tree",children:T($_,{data:Z,expandDepth:2})})]}),T(K0,{toolCallPart:_})]})]})}import{useEffect as Q0,useRef as y1,useState as c2}from"react";import{jsx as C,jsxs as w_}from"react/jsx-runtime";function z0({message:_,toolCallPart:N}){let{config:k,addToolResult:Z,isAgentWorking:L}=B(),J=k.toolComponents?.[N.name];if(J)return C("div",{className:"cortex-tool-call-animated",children:C(J,{toolCallPart:N,message:_,setOutput:(X)=>void Z(N.id,N.name,X)})});if(N.state==="input-complete"&&!L)return C("div",{className:"cortex-tool-call-animated",children:C(S2,{toolCallPart:N})});return C("div",{className:"cortex-tool-call-animated",children:C(F0,{toolCallPart:N})})}function S2({toolCallPart:_}){let{api:N,t:k,addToolResult:Z,selectedThread:L}=B(),J=L?.id,[X,G]=c2({phase:"initiating"}),$=y1(void 0),W=y1({api:N,addToolResult:Z,toolName:_.name});if(W.current={api:N,addToolResult:Z,toolName:_.name},Q0(()=>{if(!J)return;let D=$1({initiate:()=>W.current.api.initiateToolCall(J,_.id),onState:G,submit:(P)=>W.current.addToolResult(_.id,W.current.toolName,P)});$.current=D,D.start();let O=(P)=>D.handleMessage(P);return window.addEventListener("message",O),()=>{if(window.removeEventListener("message",O),D.dispose(),$.current===D)$.current=void 0}},[_.id,J]),!J||X.phase==="unavailable"||X.phase==="settling")return C(F0,{toolCallPart:_});let z=w_("div",{className:"cortex-interactive-embed",children:[w_("div",{className:"cortex-interactive-embed__bar",children:[C("span",{children:k("translate_interactive_title")}),C("button",{type:"button",className:"cortex-interactive-embed__cancel",onClick:()=>$.current?.cancel(),children:k("translate_interactive_cancel")})]}),X.phase==="embedded"?C("iframe",{className:"cortex-interactive-embed__frame",src:X.embedUrl,sandbox:Z1(X.embedUrl,window.location.origin),title:k("translate_interactive_title"),ref:(D)=>$.current?.setSource(D?.contentWindow),onLoad:(D)=>{if(J1(D.currentTarget,window.location.origin))$.current?.terminate()}}):X.phase==="error"?w_("div",{className:"cortex-interactive-embed__status",children:[C("span",{children:k("translate_interactive_failed")}),C("button",{type:"button",className:"cortex-interactive-embed__retry",onClick:()=>void $.current?.start(),children:k("translate_interactive_retry")})]}):C("div",{className:"cortex-interactive-embed__status",children:k("translate_interactive_loading")})]});return X.phase==="embedded"&&X.surface==="modal"?C(n2,{label:k("translate_interactive_title"),onCancel:()=>$.current?.cancel(),children:z}):z}function n2({label:_,onCancel:N,children:k}){let Z=y1(null);return Q0(()=>{let L=Z.current;return L?.showModal(),()=>L?.close()},[]),C("dialog",{ref:Z,className:"cortex-interactive-embed-dialog","aria-label":_,onCancel:(L)=>{L.preventDefault(),N()},children:k})}function F0({toolCallPart:_}){let{t:N}=B(),{state:k,active:Z,titleKey:L}=d_(_);return w_("div",{className:"cortex-tool-pill",children:[w_("span",{className:"cortex-tool-pill__icon",children:[C("span",{className:Q("cortex-tool-pill__spinner",Z&&"cortex-tool-pill__spinner--visible")}),C("svg",{className:Q("cortex-tool-pill__svg","cortex-tool-pill__svg--check",k==="complete"&&"cortex-tool-pill__svg--visible"),viewBox:"0 0 20 20",fill:"none",children:C("path",{d:"M5.5 10.5 L8.5 13.5 L14.5 7",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})}),C("svg",{className:Q("cortex-tool-pill__svg","cortex-tool-pill__svg--error",k==="error"&&"cortex-tool-pill__svg--visible"),viewBox:"0 0 20 20",fill:"none",children:C("path",{d:"M6.5 6.5 L13.5 13.5 M13.5 6.5 L6.5 13.5",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})})]}),C("span",{className:Q("cortex-tool-pill__title",k==="error"&&"cortex-tool-pill__title--error"),children:N(L)})]})}import{jsx as I2}from"react/jsx-runtime";var C2=L_("code");function q0(){return I2(V_,{labels:C2})}import{jsx as f2}from"react/jsx-runtime";var g2=L_("graph");function H0(){return f2(V_,{labels:g2})}import{jsx as M1}from"react/jsx-runtime";function D0({message:_,toolCallPart:N}){if(N.name==="queryGraph")return M1(H0,{});if(N.name==="executeCode")return M1(q0,{});return M1(z0,{toolCallPart:N,message:_})}import{jsx as Q_,jsxs as p2}from"react/jsx-runtime";function B0(_){let{message:N,part:k,debugMode:Z=!1,animate:L=!1,streaming:J=!1}=_,{t:X}=B();function G(){switch(k.type){case"text":return Q_(G0,{textPart:k,role:N.role,streaming:J});case"thinking":return Z?Q_(J0,{reasoningPart:k,streaming:J}):Q_(Z0,{});case"tool-call":return Z?Q_(V0,{toolCallPart:k}):Q_(D0,{toolCallPart:k,message:N});default:return p2("p",{className:"cortex-unhandled-type",children:[X("translate_unhandled_type")," ",k.type]})}}return Q_("div",{className:Q("cortex-message-part",L&&"cortex-message-part--animated"),children:G()})}import{useState as T2}from"react";import{jsx as w,jsxs as p}from"react/jsx-runtime";function O0({usage:_,modelId:N}){let{t:k}=B(),[Z,L]=T2(!1),J=y_(_)??0;return p("div",{className:Q("cortex-token-usage",Z&&"cortex-token-usage--expanded"),children:[p("button",{className:"cortex-token-usage__summary",onClick:()=>L((X)=>!X),children:[p("span",{className:"cortex-token-usage__total",children:[w("span",{className:"cortex-token-usage__total-number",children:b(_.total)}),w("span",{className:"cortex-token-usage__total-label",children:k("translate_tokens")})]}),N?w("span",{className:"cortex-token-usage__model",children:N}):null,p("span",{className:"cortex-token-usage__pills",children:[p("span",{className:"cortex-token-usage__pill",children:[w("span",{className:"cortex-token-usage__dot cortex-token-usage__dot--input"}),b(_.input.total)]}),p("span",{className:"cortex-token-usage__pill",children:[w("span",{className:"cortex-token-usage__dot cortex-token-usage__dot--output"}),b(_.output.total)]})]}),J>0?p("span",{className:"cortex-token-usage__cache-badge",children:[J,"%"]}):null,w("svg",{className:"cortex-token-usage__chevron",width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",children:w("path",{d:"M3 4.5L6 7.5L9 4.5",stroke:"currentColor",strokeWidth:"1.25",strokeLinecap:"round",strokeLinejoin:"round"})})]}),w("div",{className:"cortex-token-usage__details",children:w("div",{className:"cortex-token-usage__details-inner",children:p("div",{className:"cortex-token-usage__columns",children:[p("div",{className:"cortex-token-usage__col",children:[p("div",{className:"cortex-token-usage__col-header",children:[w("span",{className:"cortex-token-usage__dot cortex-token-usage__dot--input"}),w("span",{className:"cortex-token-usage__col-label",children:k("translate_input")}),w("span",{className:"cortex-token-usage__col-total",children:b(_.input.total)})]}),p("div",{className:"cortex-token-usage__rows",children:[_.input.noCache?p("div",{className:"cortex-token-usage__row",children:[w("span",{className:"cortex-token-usage__row-label",children:k("translate_fresh")}),w("span",{className:"cortex-token-usage__row-value",children:b(_.input.noCache)})]}):null,_.input.cacheRead?p("div",{className:"cortex-token-usage__row",children:[w("span",{className:"cortex-token-usage__row-label",children:k("translate_cache_read")}),w("span",{className:"cortex-token-usage__row-value",children:b(_.input.cacheRead)})]}):null,_.input.cacheWrite?p("div",{className:"cortex-token-usage__row",children:[w("span",{className:"cortex-token-usage__row-label",children:k("translate_cache_write")}),w("span",{className:"cortex-token-usage__row-value",children:b(_.input.cacheWrite)})]}):null]}),J>0?p("div",{className:"cortex-token-usage__cache-bar-row",children:[w("div",{className:"cortex-token-usage__cache-bar",children:w("div",{className:"cortex-token-usage__cache-fill",style:{width:`${J}%`}})}),w("span",{className:"cortex-token-usage__cache-label",children:k("translate_n_percent_cached",{percent:J})})]}):null]}),p("div",{className:"cortex-token-usage__col",children:[p("div",{className:"cortex-token-usage__col-header",children:[w("span",{className:"cortex-token-usage__dot cortex-token-usage__dot--output"}),w("span",{className:"cortex-token-usage__col-label",children:k("translate_output")}),w("span",{className:"cortex-token-usage__col-total",children:b(_.output.total)})]}),p("div",{className:"cortex-token-usage__rows",children:[_.output.text?p("div",{className:"cortex-token-usage__row",children:[w("span",{className:"cortex-token-usage__row-label",children:k("translate_text")}),w("span",{className:"cortex-token-usage__row-value",children:b(_.output.text)})]}):null,_.output.reasoning?p("div",{className:"cortex-token-usage__row",children:[w("span",{className:"cortex-token-usage__row-label",children:k("translate_reasoning")}),w("span",{className:"cortex-token-usage__row-value",children:b(_.output.reasoning)})]}):null]})]})]})})})]})}import{jsx as z_,jsxs as y0}from"react/jsx-runtime";function M0(_){let{message:N,debugMode:k=!1,animate:Z=!1}=_,{messages:L,isAgentWorking:J,messageMetadata:X}=B(),G=J&&b_(L)?.id===N.id,$=N.role==="assistant",W=N.parts,z=W.filter((F,K)=>{if(F.type==="tool-result")return!1;return k||!t_(F,K===W.length-1,G)}),D=G?z.length-1:-1,O=X.get(N.id),P=Boolean(O?.isAborted),v=O?.tokenUsage,H=N.role==="user"?O?.attachments??[]:[],I=k&&!G&&(Boolean(v)||$);return z_("div",{className:"cortex-message",children:z.length>0&&y0("div",{className:"cortex-message-parts",children:[z.map((F,K)=>z_(B0,{part:F,message:N,debugMode:k,animate:Z,streaming:K===D},K)),H.length>0&&z_(d1,{attachments:H}),P&&z_(i1,{}),I&&y0("div",{className:"cortex-message-debug-zone",children:[v&&z_(O0,{usage:v,modelId:O?.modelId}),$&&z_(_0,{messageId:N.id})]})]})})}import{jsx as E1}from"react/jsx-runtime";function E0(_){let{messages:N,selectedThread:k}=B(),Z=u_(null),L=u_(!0),J=u_(!0),X=u_(!1),[G,$]=m2(!1);function W(){let H=Z.current;if(H)H.scrollTop=H.scrollHeight}function z(){if(X.current)return;X.current=!0,queueMicrotask(()=>{X.current=!1,W(),L.current=!1})}m_(()=>{let H=Z.current;if(z(),$(!0),!H||typeof MutationObserver>"u")return;let I=new MutationObserver(()=>{if(!L.current&&!J.current)return;z()});return I.observe(H,{childList:!0,subtree:!0,characterData:!0}),()=>I.disconnect()},[]);let D=k?.id;m_(()=>{$(!1),L.current=!0,queueMicrotask(()=>$(!0))},[D]);let O=N[N.length-1],P=O?.role==="user"?O.id:void 0;m_(()=>{if(P)L.current=!0},[P]),m_(()=>{if(!L.current&&!J.current)return;z()},[N]);function v(){let H=Z.current;if(!H)return;J.current=H.scrollHeight-H.scrollTop-H.clientHeight<100}return E1("div",{className:_.className,children:E1("div",{ref:Z,className:"cortex-message-list",onScroll:v,children:N.map((H)=>E1(M0,{message:H,debugMode:_.debugMode,animate:G},H.id))})})}import{jsx as U,jsxs as x,Fragment as u2}from"react/jsx-runtime";var A0="M13.5 7.6c0 2.4-2.5 4.4-5.5 4.4-.6 0-1.2-.08-1.7-.23L3 13l.8-2.3C3 9.8 2.5 8.7 2.5 7.6 2.5 5.2 5 3.2 8 3.2s5.5 2 5.5 4.4Z";function w0(_){let{config:N,t:k,threads:Z,selectedThread:L,deleteThread:J}=B(),X=N.locale??"en";return x("div",{className:_.className,children:[x("div",{className:"cortex-widget__threads-header",children:[x("div",{children:[U("h2",{className:"cortex-widget__threads-title",children:k("translate_threads")}),U("p",{className:"cortex-widget__threads-count",children:k(Z?.length===1?"translate_one_conversation":"translate_n_conversations",{count:Z?.length??0})})]}),x("button",{onClick:()=>_.onNewChatRequested(),className:"cortex-widget__new-chat-btn",children:[U("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",children:U("path",{d:"M8 3v10M3 8h10",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})}),k("translate_new")]})]}),U("div",{className:"cortex-widget__threads-list",children:Z===void 0?[1,2,3,4].map((G)=>x("div",{className:"cortex-widget__thread-skeleton",children:[U("div",{className:"cortex-skeleton cortex-widget__thread-skeleton-icon"}),U("div",{className:"cortex-widget__thread-skeleton-lines",children:U("div",{className:"cortex-skeleton cortex-widget__thread-skeleton-line",style:{width:`${40+G*12}%`}})})]},G)):x(u2,{children:[Z.map((G)=>{let $=G.id===L?.id,W=z1(G.updatedAt,X);return x("button",{onClick:()=>_.onThreadSelected(G),className:Q("cortex-widget__thread-item",$&&"cortex-widget__thread-item--active"),children:[U("div",{className:Q("cortex-widget__thread-icon",$&&"cortex-widget__thread-icon--active"),children:U("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:U("path",{d:A0,stroke:"currentColor",strokeWidth:"1.3",strokeLinecap:"round",strokeLinejoin:"round"})})}),x("div",{className:"cortex-widget__thread-info",children:[x("div",{className:"cortex-widget__thread-title-row",children:[U("p",{className:Q("cortex-widget__thread-title",$&&"cortex-widget__thread-title--active"),children:G.title??k("translate_untitled")}),G.isRunning&&x("span",{className:Q("cortex-widget__thread-running",$&&"cortex-widget__thread-running--active"),children:[U("span",{className:"cortex-widget__thread-running-dot"}),k("translate_running")]})]}),W&&U("p",{className:"cortex-widget__thread-time",children:W})]}),U("span",{role:"button",tabIndex:0,onClick:(z)=>{z.stopPropagation(),J(G.id)},onKeyDown:(z)=>{if(z.key!=="Enter"&&z.key!==" ")return;z.preventDefault(),z.stopPropagation(),J(G.id)},className:Q("cortex-widget__thread-delete",$&&"cortex-widget__thread-delete--active"),children:U("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",children:U("path",{d:"M4 4l8 8M12 4l-8 8",stroke:"currentColor",strokeWidth:"1.3",strokeLinecap:"round"})})}),U("svg",{className:Q("cortex-widget__thread-arrow",$&&"cortex-widget__thread-arrow--active"),width:"10",height:"10",viewBox:"0 0 16 16",fill:"none",children:U("path",{d:"M6 4l4 4-4 4",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})]},G.id)}),!Z.length&&x("div",{className:"cortex-widget__threads-empty",children:[U("div",{className:"cortex-widget__threads-empty-icon",children:U("svg",{width:"18",height:"18",viewBox:"0 0 16 16",fill:"none",className:"cortex-widget__threads-empty-svg",children:U("path",{d:A0,stroke:"currentColor",strokeWidth:"1.3",strokeLinecap:"round",strokeLinejoin:"round"})})}),U("p",{className:"cortex-widget__threads-empty-title",children:k("translate_no_threads_yet")}),U("p",{className:"cortex-widget__threads-empty-subtitle",children:k("translate_start_a_new_conversation")}),U("button",{onClick:()=>_.onNewChatRequested(),className:"cortex-widget__new-chat-btn cortex-widget__new-chat-btn--empty-state",children:k("translate_new_chat")})]})]})})]})}import{jsx as M,jsxs as a}from"react/jsx-runtime";var w1={messages:[],isAgentWorking:!1,isLoadingMessages:!1,hasPendingToolCalls:!1,messageMetadata:new Map};function o2({config:_,className:N}){let k=k_(_);k.current=_;let[Z,L]=F_(),[J,X]=F_(),[G,$]=F_(w1),[W,z]=F_(!1),[D,O]=F_("threads"),[P,v]=F_(!1),H=k_(void 0),I=k_([]),F=k_(void 0),K=k_(null),Y=A1(()=>h_(()=>k.current.transport),[]),g=A1(()=>{let V=J?.thread;if(!V)return;return Z?.find((E)=>E.id===V.id)??V},[Z,J]),n=k_(g);n.current=g;let y=k_(G);y.current=G;let j=u((V)=>{$((E)=>({...E,...typeof V==="function"?V(E):V}))},[]),q_=u((V,E)=>{L((A)=>{let l=A?.find((r_)=>r_.id===V);return l?B_(A??[],{...l,isRunning:E}):A})},[]),d=u((V,E)=>{if(n.current?.id===V.id&&H.current)return;let A=n.current;if(n.current=V,$(w1),X({thread:V,mode:E?.skipLoadingMessages?"skip":"load",epoch:0}),A&&A.id!==V.id)k.current.hooks?.onThreadDeselected?.(A);k.current.hooks?.onThreadSelected?.(V)},[]),q=u(()=>{let V=n.current;if(!V&&!H.current)return;if(n.current=void 0,X(void 0),$(w1),V)k.current.hooks?.onThreadDeselected?.(V)},[]),R=u((V)=>{j({hasPendingToolCalls:!1,messageMetadata:new Map}),X((E)=>({thread:V,mode:"reload",epoch:(E?.epoch??0)+1}))},[j]),f=u((V)=>{let E=n.current;if(E)return Promise.resolve(E.id);return F.current??=Y.createThread(V).then((A)=>{return F.current=void 0,L((l)=>B_(l??[],A)),d(A,{skipLoadingMessages:!0}),A.id},(A)=>{throw F.current=void 0,A}),F.current},[Y,d]),c=A1(()=>k1({api:Y,ensureThread:()=>f()}),[Y,f]),P1=l2(c.subscribe,c.getState,c.getState),U0=u(async(V,E=[])=>{if(y.current.isAgentWorking||y.current.hasPendingToolCalls)return;let A=H.current;if(A){await A.send(V,E);return}I.current.push({prompt:V,attachments:E});try{await f(V)}catch(l){throw I.current=[],l}},[f]),b0=u(async()=>{await H.current?.abort()},[]),v0=u((V,E,A)=>H.current?.addToolResult(V,E,A)??Promise.resolve(),[]),R0=u(async(V)=>{if(n.current?.id===V)q();await Y.deleteThread(V),L((E)=>E?c_(E,V):E)},[Y,q]),c0=u(()=>{c.discardConsumed(),setTimeout(()=>K.current?.focusInput())},[c]),S0=u(()=>{c.restoreConsumed(n.current?.id)},[c]),l_=u(async()=>{let V=R_(await Y.listThreads());return L(V),V},[Y]),U1=u((V)=>{L((A)=>{let l=G1(A??[],V);return A||l.length?l:A});let E=n.current?.id;switch(V.type){case"thread:deleted":if(E===V.payload.threadId)q();break;case"thread:run-started":if(E===V.payload.thread.id)H.current?.reattach(V.payload.thread);break;case"thread:messages-updated":H.current?.refreshMessages(V.payload.threadId);break}},[q]);P0(()=>{l_();let V=!1,E=X1({wsUrl:()=>k.current.wsUrl,transport:{baseUrl:()=>{let A=k.current.transport.baseUrl;return typeof A==="string"?A:A()},getHeaders:()=>k.current.transport.getHeaders()},onEvent:U1,onOpen:()=>{if(!V){V=!0;return}l_().then((A)=>{let l=n.current;if(!l)return;H.current?.reattach(A.find((r_)=>r_.id===l.id)??l)})}});return()=>{E.close()}},[U1,l_]);let o_=k_(void 0),j_=g?.id;P0(()=>{if(j_===o_.current)return;c.clear(o_.current),o_.current=j_},[j_,c]);let b1=_.locale??"en",H_=u((V,E)=>Y1(b1,V,E),[b1]),n0=_.viewMode??"helper",C0={config:_,t:H_,api:Y,debugMode:W,threads:Z,selectedThread:g,deleteThread:R0,...G,send:U0,abort:b0,addToolResult:v0,queue:{items:P1,...L1(P1),accept:c.accept,remove:c.remove,consumeReady:c.consumeReady}};function I0(V){d(V),O("chat"),v(!1)}function g0(){q(),O("chat"),v(!1)}function f0(){q(),O("threads")}return M(q1.Provider,{value:C0,children:a("div",{className:Q("cortex-widget",N),"data-cortex-theme":_.theme,children:[a("div",{className:Q("cortex-widget__container",n0==="full"&&"cortex-widget__container--full",P&&"cortex-widget__container--sidebar-open"),onDragOver:(V)=>V.preventDefault(),onDrop:(V)=>V.preventDefault(),children:[M(w0,{className:Q("cortex-widget__screen",D==="threads"&&"cortex-widget__screen--active",D!=="threads"&&"cortex-widget__screen--left"),onThreadSelected:I0,onNewChatRequested:g0}),a("div",{className:Q("cortex-widget__screen",D==="chat"&&"cortex-widget__screen--active",D!=="chat"&&"cortex-widget__screen--right"),children:[a("div",{className:"cortex-widget__chat-header",children:[M("button",{onClick:()=>v((V)=>!V),className:"cortex-widget__sidebar-toggle-btn",children:M("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:M("path",{d:"M2.5 4h11M2.5 8h11M2.5 12h11",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round"})})}),M("button",{onClick:f0,className:"cortex-widget__back-btn",children:M("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",className:"cortex-widget__back-icon",children:M("path",{d:"M10 3L5 8l5 5",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})}),M("div",{className:"cortex-widget__chat-title-wrap",children:M("p",{className:"cortex-widget__chat-title",children:g?.title??H_("translate_new_chat")})}),_.showDebugButton&&M("button",{onClick:()=>z((V)=>!V),className:Q("cortex-widget__debug-btn",W?"cortex-widget__debug-btn--on":"cortex-widget__debug-btn--off"),children:W?H_("translate_debug"):H_("translate_normal")})]}),G.isLoadingMessages&&!G.isAgentWorking?a("div",{className:"cortex-widget__messages-skeleton",children:[M("div",{className:"cortex-widget__msg-skel cortex-widget__msg-skel--user",children:a("div",{className:"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--user",children:[M("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"13rem"}}),M("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"9rem"}})]})}),M("div",{className:"cortex-widget__msg-skel cortex-widget__msg-skel--assistant",children:a("div",{className:"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--assistant",children:[M("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"16rem"}}),M("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"18rem"}}),M("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"12rem"}})]})}),M("div",{className:"cortex-widget__msg-skel cortex-widget__msg-skel--user",children:M("div",{className:"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--user",children:M("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"11rem"}})})}),M("div",{className:"cortex-widget__msg-skel cortex-widget__msg-skel--assistant",children:a("div",{className:"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--assistant",children:[M("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"14rem"}}),M("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"15rem"}})]})})]}):M(E0,{className:"cortex-widget__messages",debugMode:W}),G.isAgentWorking&&!G.hasPendingToolCalls&&a("div",{className:"cortex-widget__working",children:[a("div",{className:"cortex-widget__working-dots",children:[M("span",{className:"cortex-working-dot"}),M("span",{className:"cortex-working-dot"}),M("span",{className:"cortex-working-dot"})]}),M("span",{className:"cortex-widget__working-text",children:H_("translate_thinking")})]}),!G.hasPendingToolCalls&&M(h1,{ref:K})]}),M("div",{className:"cortex-widget__sidebar-backdrop",onClick:()=>v(!1)})]}),J&&M(o1,{thread:J.thread,mode:J.mode,api:Y,configRef:k,sessionRef:H,pendingSendRef:I,patchUi:j,setRunning:q_,remount:R,onTurnFinished:c0,onSendFailed:S0},`${J.thread.id}:${J.epoch}`)]})})}export{o2 as CortexChatWidget};
package/dist/styles.css CHANGED
@@ -1796,6 +1796,84 @@ details[open] > summary .dbg-tool__chevron {
1796
1796
  color: var(--cortex-color-danger);
1797
1797
  }
1798
1798
 
1799
+ .cortex-interactive-embed {
1800
+ border: 1px solid var(--cortex-color-border-strong);
1801
+ border-radius: 12px;
1802
+ background: var(--cortex-color-surface);
1803
+ overflow: hidden;
1804
+ max-inline-size: 480px;
1805
+ }
1806
+
1807
+ .cortex-interactive-embed__bar {
1808
+ display: flex;
1809
+ align-items: center;
1810
+ justify-content: space-between;
1811
+ gap: 8px;
1812
+ padding: 8px 12px;
1813
+ border-block-end: 1px solid var(--cortex-color-border-strong);
1814
+ font-size: 12px;
1815
+ color: var(--cortex-color-text-muted);
1816
+ }
1817
+
1818
+ .cortex-interactive-embed__cancel {
1819
+ border: 0;
1820
+ background: none;
1821
+ padding: 2px 4px;
1822
+ font: inherit;
1823
+ color: var(--cortex-color-text-muted);
1824
+ cursor: pointer;
1825
+ }
1826
+ .cortex-interactive-embed__cancel:hover {
1827
+ color: var(--cortex-color-danger);
1828
+ }
1829
+
1830
+ .cortex-interactive-embed__frame {
1831
+ display: block;
1832
+ inline-size: 100%;
1833
+ block-size: 420px;
1834
+ border: 0;
1835
+ background: var(--cortex-color-surface);
1836
+ }
1837
+
1838
+ .cortex-interactive-embed__status {
1839
+ display: flex;
1840
+ align-items: center;
1841
+ gap: 8px;
1842
+ padding: 20px 16px;
1843
+ font-size: 13px;
1844
+ color: var(--cortex-color-text-muted);
1845
+ }
1846
+
1847
+ .cortex-interactive-embed__retry {
1848
+ border: 1px solid var(--cortex-color-border-strong);
1849
+ border-radius: 8px;
1850
+ background: none;
1851
+ padding: 4px 10px;
1852
+ font: inherit;
1853
+ font-size: 12px;
1854
+ color: inherit;
1855
+ cursor: pointer;
1856
+ }
1857
+
1858
+ .cortex-interactive-embed-dialog {
1859
+ border: 0;
1860
+ padding: 0;
1861
+ background: none;
1862
+ inline-size: min(560px, 100vw - 48px);
1863
+ max-inline-size: none;
1864
+ }
1865
+ .cortex-interactive-embed-dialog::backdrop {
1866
+ background: rgba(0, 0, 0, 0.45);
1867
+ }
1868
+ .cortex-interactive-embed-dialog .cortex-interactive-embed {
1869
+ inline-size: 100%;
1870
+ max-inline-size: none;
1871
+ box-shadow: 0 24px 64px rgba(0, 0, 0, 0.3);
1872
+ }
1873
+ .cortex-interactive-embed-dialog .cortex-interactive-embed__frame {
1874
+ block-size: min(70dvh, 560px);
1875
+ }
1876
+
1799
1877
  .cortex-reasoning-animated {
1800
1878
  display: block;
1801
1879
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m6d/cortex-react",
3
- "version": "1.0.3",
3
+ "version": "1.1.0",
4
4
  "description": "React chat widget SDK for cortex servers",
5
5
  "license": "MIT",
6
6
  "sideEffects": [
@@ -36,7 +36,7 @@ export type SessionHandle = {
36
36
  threadId: string;
37
37
  send: (prompt: string, attachments: AttachmentSummary[]) => Promise<void>;
38
38
  abort: () => Promise<void>;
39
- addToolResult: (toolCallId: string, toolName: string, output: unknown) => void;
39
+ addToolResult: (toolCallId: string, toolName: string, output: unknown) => Promise<void>;
40
40
  reattach: (thread: ThreadSummary) => void;
41
41
  refreshMessages: (threadId: string) => void;
42
42
  };
@@ -274,11 +274,22 @@ export function ChatSession(props: ChatSessionProps) {
274
274
  patchUi({ hasPendingToolCalls: false });
275
275
  }
276
276
 
277
- /** Answers a tool call on behalf of a consumer-supplied tool component. */
277
+ /** Answers a tool call on behalf of a consumer-supplied tool component.
278
+ * Returns the delivery promise so callers (the interactive embed) can
279
+ * re-arm on a transient failure instead of stranding the pending call. */
278
280
  function addToolResult(toolCallId: string, toolName: string, output: unknown) {
279
- void chatRef.current
280
- .addToolResult({ toolCallId, tool: toolName, output })
281
- .then(() => syncPendingToolCalls());
281
+ return chatRef.current.addToolResult({ toolCallId, tool: toolName, output }).then(
282
+ () => {
283
+ syncPendingToolCalls();
284
+ },
285
+ (error: unknown) => {
286
+ // A failed delivery may have answered the call locally; re-reading
287
+ // the transcript brings the pending call back so the flow can re-arm
288
+ // (a remounted embed re-runs the idempotent initiate and recovers).
289
+ void refreshMessages(thread.id);
290
+ throw error;
291
+ },
292
+ );
282
293
  }
283
294
 
284
295
  function reattach(freshThread: ThreadSummary) {
@@ -204,9 +204,11 @@ export function CortexChatWidget({
204
204
  await sessionRef.current?.abort();
205
205
  }, []);
206
206
 
207
- const addToolResult = useCallback((toolCallId: string, toolName: string, output: unknown) => {
208
- sessionRef.current?.addToolResult(toolCallId, toolName, output);
209
- }, []);
207
+ const addToolResult = useCallback(
208
+ (toolCallId: string, toolName: string, output: unknown) =>
209
+ sessionRef.current?.addToolResult(toolCallId, toolName, output) ?? Promise.resolve(),
210
+ [],
211
+ );
210
212
 
211
213
  const deleteThread = useCallback(
212
214
  async (threadId: string) => {
@@ -1,5 +1,13 @@
1
+ import { useEffect, useRef, useState } from 'react';
2
+ import type { ReactNode } from 'react';
1
3
  import type { ToolCallPart, UIMessage } from '@tanstack/ai';
2
- import { toolCallAnimation } from '@cortex/client';
4
+ import {
5
+ createInteractiveEmbed,
6
+ frameBreachedHostOrigin,
7
+ interactiveSandbox,
8
+ toolCallAnimation,
9
+ type InteractiveEmbedState,
10
+ } from '@cortex/client';
3
11
  import { cx } from '../cx';
4
12
  import { useCortex } from '../context';
5
13
 
@@ -9,7 +17,7 @@ type MessageToolCallAnimatedProps = {
9
17
  };
10
18
 
11
19
  export function MessageToolCallAnimated({ message, toolCallPart }: MessageToolCallAnimatedProps) {
12
- const { config, t, addToolResult } = useCortex();
20
+ const { config, addToolResult, isAgentWorking } = useCortex();
13
21
 
14
22
  const Custom = config.toolComponents?.[toolCallPart.name];
15
23
  if (Custom) {
@@ -18,69 +26,220 @@ export function MessageToolCallAnimated({ message, toolCallPart }: MessageToolCa
18
26
  <Custom
19
27
  toolCallPart={toolCallPart}
20
28
  message={message}
21
- setOutput={(output) => addToolResult(toolCallPart.id, toolCallPart.name, output)}
29
+ setOutput={(output) => void addToolResult(toolCallPart.id, toolCallPart.name, output)}
22
30
  />
23
31
  </div>
24
32
  );
25
33
  }
26
34
 
27
- const { state, active, titleKey } = toolCallAnimation(toolCallPart);
35
+ // A call still unanswered once the stream is idle is one the client owes an
36
+ // answer to — ask the server whether it is an interactive flow. While the
37
+ // agent is working, `input-complete` just means a server tool is executing.
38
+ if (toolCallPart.state === 'input-complete' && !isAgentWorking) {
39
+ return (
40
+ <div className="cortex-tool-call-animated">
41
+ <ToolInteractiveEmbed toolCallPart={toolCallPart} />
42
+ </div>
43
+ );
44
+ }
28
45
 
29
46
  return (
30
47
  <div className="cortex-tool-call-animated">
31
- <div className="cortex-tool-pill">
32
- {/* Spinner, then whichever glyph the call settled on */}
33
- <span className="cortex-tool-pill__icon">
34
- <span
35
- className={cx(
36
- 'cortex-tool-pill__spinner',
37
- active && 'cortex-tool-pill__spinner--visible',
38
- )}
39
- ></span>
40
- <svg
41
- className={cx(
42
- 'cortex-tool-pill__svg',
43
- 'cortex-tool-pill__svg--check',
44
- state === 'complete' && 'cortex-tool-pill__svg--visible',
45
- )}
46
- viewBox="0 0 20 20"
47
- fill="none"
48
- >
49
- <path
50
- d="M5.5 10.5 L8.5 13.5 L14.5 7"
51
- stroke="currentColor"
52
- strokeWidth="2"
53
- strokeLinecap="round"
54
- strokeLinejoin="round"
55
- />
56
- </svg>
57
- <svg
58
- className={cx(
59
- 'cortex-tool-pill__svg',
60
- 'cortex-tool-pill__svg--error',
61
- state === 'error' && 'cortex-tool-pill__svg--visible',
62
- )}
63
- viewBox="0 0 20 20"
64
- fill="none"
48
+ <ToolCallPill toolCallPart={toolCallPart} />
49
+ </div>
50
+ );
51
+ }
52
+
53
+ /** The in-chat surface of an interactive tool call: initiate → iframe → handshake. */
54
+ function ToolInteractiveEmbed({ toolCallPart }: { toolCallPart: ToolCallPart }) {
55
+ const { api, t, addToolResult, selectedThread } = useCortex();
56
+ const threadId = selectedThread?.id;
57
+ const [state, setState] = useState<InteractiveEmbedState>({ phase: 'initiating' });
58
+ const embedRef = useRef<ReturnType<typeof createInteractiveEmbed>>(undefined);
59
+ // Read at call time so the embed's lifetime stays keyed to the call and
60
+ // thread alone while always using the current provider values.
61
+ const latest = useRef({ api, addToolResult, toolName: toolCallPart.name });
62
+ latest.current = { api, addToolResult, toolName: toolCallPart.name };
63
+
64
+ useEffect(() => {
65
+ if (!threadId) return;
66
+
67
+ const embed = createInteractiveEmbed({
68
+ initiate: () => latest.current.api.initiateToolCall(threadId, toolCallPart.id),
69
+ onState: setState,
70
+ submit: (output) =>
71
+ latest.current.addToolResult(toolCallPart.id, latest.current.toolName, output),
72
+ });
73
+ embedRef.current = embed;
74
+ void embed.start();
75
+
76
+ const onMessage = (event: MessageEvent) => embed.handleMessage(event);
77
+ window.addEventListener('message', onMessage);
78
+ return () => {
79
+ window.removeEventListener('message', onMessage);
80
+ embed.dispose();
81
+ if (embedRef.current === embed) embedRef.current = undefined;
82
+ };
83
+ }, [toolCallPart.id, threadId]);
84
+
85
+ // Not an interactive tool (or no thread): the default pill takes over, and a
86
+ // consumer `hooks.onToolCall` may still answer the call.
87
+ if (!threadId || state.phase === 'unavailable' || state.phase === 'settling') {
88
+ return <ToolCallPill toolCallPart={toolCallPart} />;
89
+ }
90
+
91
+ const card = (
92
+ <div className="cortex-interactive-embed">
93
+ <div className="cortex-interactive-embed__bar">
94
+ <span>{t('translate_interactive_title')}</span>
95
+ <button
96
+ type="button"
97
+ className="cortex-interactive-embed__cancel"
98
+ onClick={() => embedRef.current?.cancel()}
99
+ >
100
+ {t('translate_interactive_cancel')}
101
+ </button>
102
+ </div>
103
+ {state.phase === 'embedded' ? (
104
+ <iframe
105
+ className="cortex-interactive-embed__frame"
106
+ src={state.embedUrl}
107
+ sandbox={interactiveSandbox(state.embedUrl, window.location.origin)}
108
+ title={t('translate_interactive_title')}
109
+ ref={(frame) => embedRef.current?.setSource(frame?.contentWindow)}
110
+ onLoad={(event) => {
111
+ // A cross-origin embed that navigates into the host origin would
112
+ // carry its grants onto the host's own document — kill the flow.
113
+ if (frameBreachedHostOrigin(event.currentTarget, window.location.origin)) {
114
+ embedRef.current?.terminate();
115
+ }
116
+ }}
117
+ />
118
+ ) : state.phase === 'error' ? (
119
+ <div className="cortex-interactive-embed__status">
120
+ <span>{t('translate_interactive_failed')}</span>
121
+ <button
122
+ type="button"
123
+ className="cortex-interactive-embed__retry"
124
+ onClick={() => void embedRef.current?.start()}
65
125
  >
66
- <path
67
- d="M6.5 6.5 L13.5 13.5 M13.5 6.5 L6.5 13.5"
68
- stroke="currentColor"
69
- strokeWidth="2"
70
- strokeLinecap="round"
71
- />
72
- </svg>
73
- </span>
126
+ {t('translate_interactive_retry')}
127
+ </button>
128
+ </div>
129
+ ) : (
130
+ <div className="cortex-interactive-embed__status">{t('translate_interactive_loading')}</div>
131
+ )}
132
+ </div>
133
+ );
134
+
135
+ return state.phase === 'embedded' && state.surface === 'modal' ? (
136
+ <InteractiveModal
137
+ label={t('translate_interactive_title')}
138
+ onCancel={() => embedRef.current?.cancel()}
139
+ >
140
+ {card}
141
+ </InteractiveModal>
142
+ ) : (
143
+ card
144
+ );
145
+ }
146
+
147
+ /**
148
+ * Native `<dialog>` around the modal surface: `showModal()` brings dialog
149
+ * semantics, initial focus, focus trapping, and focus restoration for free,
150
+ * and the browser's Escape maps to cancelling the flow.
151
+ */
152
+ function InteractiveModal({
153
+ label,
154
+ onCancel,
155
+ children,
156
+ }: {
157
+ label: string;
158
+ onCancel: () => void;
159
+ children: ReactNode;
160
+ }) {
161
+ const ref = useRef<HTMLDialogElement>(null);
162
+
163
+ useEffect(() => {
164
+ const dialog = ref.current;
165
+ dialog?.showModal();
166
+ return () => dialog?.close();
167
+ }, []);
168
+
169
+ return (
170
+ <dialog
171
+ ref={ref}
172
+ className="cortex-interactive-embed-dialog"
173
+ aria-label={label}
174
+ onCancel={(event) => {
175
+ // The flow decides when the dialog goes away: cancelling submits a
176
+ // cancellation, settles the call, and unmounts this component.
177
+ event.preventDefault();
178
+ onCancel();
179
+ }}
180
+ >
181
+ {children}
182
+ </dialog>
183
+ );
184
+ }
74
185
 
186
+ function ToolCallPill({ toolCallPart }: { toolCallPart: ToolCallPart }) {
187
+ const { t } = useCortex();
188
+ const { state, active, titleKey } = toolCallAnimation(toolCallPart);
189
+
190
+ return (
191
+ <div className="cortex-tool-pill">
192
+ {/* Spinner, then whichever glyph the call settled on */}
193
+ <span className="cortex-tool-pill__icon">
75
194
  <span
76
195
  className={cx(
77
- 'cortex-tool-pill__title',
78
- state === 'error' && 'cortex-tool-pill__title--error',
196
+ 'cortex-tool-pill__spinner',
197
+ active && 'cortex-tool-pill__spinner--visible',
198
+ )}
199
+ ></span>
200
+ <svg
201
+ className={cx(
202
+ 'cortex-tool-pill__svg',
203
+ 'cortex-tool-pill__svg--check',
204
+ state === 'complete' && 'cortex-tool-pill__svg--visible',
79
205
  )}
206
+ viewBox="0 0 20 20"
207
+ fill="none"
80
208
  >
81
- {t(titleKey)}
82
- </span>
83
- </div>
209
+ <path
210
+ d="M5.5 10.5 L8.5 13.5 L14.5 7"
211
+ stroke="currentColor"
212
+ strokeWidth="2"
213
+ strokeLinecap="round"
214
+ strokeLinejoin="round"
215
+ />
216
+ </svg>
217
+ <svg
218
+ className={cx(
219
+ 'cortex-tool-pill__svg',
220
+ 'cortex-tool-pill__svg--error',
221
+ state === 'error' && 'cortex-tool-pill__svg--visible',
222
+ )}
223
+ viewBox="0 0 20 20"
224
+ fill="none"
225
+ >
226
+ <path
227
+ d="M6.5 6.5 L13.5 13.5 M13.5 6.5 L6.5 13.5"
228
+ stroke="currentColor"
229
+ strokeWidth="2"
230
+ strokeLinecap="round"
231
+ />
232
+ </svg>
233
+ </span>
234
+
235
+ <span
236
+ className={cx(
237
+ 'cortex-tool-pill__title',
238
+ state === 'error' && 'cortex-tool-pill__title--error',
239
+ )}
240
+ >
241
+ {t(titleKey)}
242
+ </span>
84
243
  </div>
85
244
  );
86
245
  }
package/src/context.ts CHANGED
@@ -26,7 +26,7 @@ export type CortexContextValue = {
26
26
  hasPendingToolCalls: boolean;
27
27
  send: (prompt: string, attachments?: AttachmentSummary[]) => Promise<void>;
28
28
  abort: () => Promise<void>;
29
- addToolResult: (toolCallId: string, toolName: string, output: unknown) => void;
29
+ addToolResult: (toolCallId: string, toolName: string, output: unknown) => Promise<void>;
30
30
 
31
31
  queue: {
32
32
  items: QueuedAttachment[];