@m6d/cortex-react 1.1.0 → 1.3.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.d.ts +10 -0
- package/dist/index.js +2 -2
- package/dist/styles.css +11 -11
- package/package.json +1 -1
- package/src/chat-session.tsx +21 -24
- package/src/components/MessageToolCallAnimated.tsx +44 -31
package/dist/index.d.ts
CHANGED
|
@@ -50,6 +50,16 @@ export type CortexConfig = {
|
|
|
50
50
|
/** Color scheme; `'system'` follows the OS preference. Defaults to `'light'`. */
|
|
51
51
|
theme?: CortexTheme;
|
|
52
52
|
showDebugButton?: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Render embedded tool pages served from this page's own origin with their
|
|
55
|
+
* full identity — which, same-origin, means no effective sandbox at all: such
|
|
56
|
+
* an embed can reach into the host page. By default they are refused
|
|
57
|
+
* (rendered inert), because embed URLs come from Control Center tool config,
|
|
58
|
+
* and whoever administers that is not necessarily whoever owns this site.
|
|
59
|
+
* Enable only when both are the same party and the embeds are this site's
|
|
60
|
+
* own pages — then a second origin just for embeds is no longer needed.
|
|
61
|
+
*/
|
|
62
|
+
trustSameOriginEmbeds?: boolean;
|
|
53
63
|
hooks?: CortexHooks;
|
|
54
64
|
};
|
|
55
65
|
/** The props a consumer-supplied tool component receives from the widget. */
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useCallback as
|
|
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,"&").replace(/</g,"<").replace(/>/g,">")}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};
|
|
1
|
+
import{useCallback as m,useEffect as b0,useMemo as w1,useRef as k_,useState as H_,useSyncExternalStore as h2}from"react";function U_(_){return Promise.resolve(_.getHeaders())}function R1(_,N){let k=_.baseUrl;return(typeof k==="string"?k:k()).replace(/\/$/,"")+N}function u0(_){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 r_(_){function N(){return U_(_())}function k(Z){return R1(_(),Z)}async function L(Z,J){let X=new Headers(await N());if(new Headers(J?.headers).forEach(function(K,Q){X.set(Q,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"})},initiateToolCall(Z,J){return L(`/chat/${Z}/tools/${J}/initiate`,{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:u0(J.headers.get("Content-Disposition"))??Z}},resolveHeaders:N,resolveUrl:k}}var l0=new Set(["complete","error"]);function G_(_){return l0.has(_)}function v_(_){return(b_(_)?.parts??[]).filter((k)=>k.type==="tool-call"&&!G_(k.state))}function b_(_){for(let N=_.length-1;N>=0;N-=1){let k=_[N];if(k?.role==="assistant")return k}return}var o0={complete:"success",error:"error","approval-requested":"approval","approval-responded":"approval","awaiting-input":"pending","input-streaming":"pending","input-complete":"pending"},j0={"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:o0[N],labelKey:N==="approval-responded"&&k?.approved?"translate_approved":j0[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 c1={code:"javascript",query:"cypher"};function d_(_){let N=_&&typeof _==="object"?_:null,k=N?Object.entries(c1).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(c1,J)));L=Object.keys(Z).length>0?Z:null}return{codeSnippets:k,remainingInput:L,remainingInputText:L?JSON.stringify(L,null,2):""}}var I1=10,h0={"awaiting-input":"starting","input-streaming":"starting","input-complete":"processing","approval-requested":"processing","approval-responded":"processing",complete:"complete",error:"error"};function r0(_){let N=0;for(let k=0;k<_.length;k++)N=N*31+_.charCodeAt(k)|0;return Math.abs(N)%I1}function a_(_){let N=h0[_.state]??"processing",k=_.name==="readAttachment"?"attachment":"tool",L=k==="tool"?`_${r0(_.id)}`:"";return{state:N,active:N==="starting"||N==="processing",titleKey:N==="error"?"translate_tool_error":`translate_${k}_${N==="complete"?"done":"status"}${L}`}}function Z_(_){return Array.from({length:I1},(N,k)=>`translate_${_}_${k}`)}var C1=["queryGraph","executeCode"];function t_(_,N,k){if(_.type==="thinking")return!(k&&N);if(_.type!=="tool-call")return!1;return C1.includes(_.name)&&G_(_.state)}import{EventType as x0}from"@tanstack/ai";import{fetchServerSentEvents as f1}from"@tanstack/ai-client";var s_=["image/png","image/jpeg","image/webp","application/pdf"];var S1=5;function n1(_,N){if(!s_.some((k)=>k===_))return"type";if(N>10485760)return"size";return"ok"}var g1="clientToolAnswers";function e_(_){return{id:_.id,role:_.role,parts:_.parts}}function T1(_){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 i0(_){let[N]=_;if(!N||N.role!=="assistant"||!("parts"in N))return null;if(!N.parts.some((L)=>L.type==="tool-result"))return null;let k=N.parts.flatMap((L)=>L.type==="tool-call"&&G_(L.state)?[{toolCallId:L.id,output:L.output??null,state:L.state==="error"?"error":"complete"}]:[]);return k.length>0?k:null}function R_(_){return new Map(_.flatMap((N)=>N.metadata?[[N.id,N.metadata]]:[]))}function _1(_){let{api:N,thread:k}=_,L=async()=>({headers:await N.resolveHeaders()}),Z=f1(()=>N.resolveUrl("/chat"),L),J=function($,K,Q,O){let q=T1($),y=i0(q);return y?Z.connect([],{...K,[g1]:y},Q,O):Z.connect(q,K,Q,O)},X=f1(()=>N.resolveUrl(`/chat/${k.id}/stream`),L),G=[];return{connect:J,async*joinRun($,K){yield{type:x0.MESSAGES_SNAPSHOT,timestamp:Date.now(),messages:G},yield*X.joinRun($,K)},hydrate:async()=>{let $=await d0(_);return G=$.messages,$}}}async function d0(_){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(e_);return _.onHydrated?.(J,X),{messages:X,activeRun:Z,interrupts:null}}finally{_.setLoadingMessages?.(!1)}}async function N1(_){try{let N=await _.api.listMessages(_.threadId);if(_.isStale?.())return;if(_.absorbMetadata(R_(N)),_.isStreaming())return;_.setMessages(N.map(e_))}catch{}}function k1(_){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 V of k)V()}function K(F,V){$(Z.map((Y)=>Y.localId===F?{...Y,...V}:Y))}function Q(F){if(L.delete(F))return;K(F,{status:"error"})}function O(F){let V=[];for(let Y of F){let I=n1(Y.type,Y.size)!=="ok"||Z.filter((M)=>M.status!=="error").length>=S1,n=crypto.randomUUID();if($([...Z,{localId:n,filename:Y.name,status:I?"error":"uploading"}]),!I)V.push({localId:n,file:Y})}if(!V.length)return;_.ensureThread().then((Y)=>{for(let{localId:I,file:n}of V){if(L.delete(I))continue;K(I,{threadId:Y}),N.uploadAttachment(Y,n).then((M)=>{if(L.delete(I)){N.deleteAttachment(M.id).catch(()=>{});return}K(I,{status:"ready",attachmentId:M.id,summary:M})},()=>Q(I))}},()=>{for(let{localId:Y}of V)Q(Y)})}function q(F){let V=Z.find((Y)=>Y.localId===F);if(!V)return;if(V.status==="uploading"){L.add(F),$(Z.filter((Y)=>Y.localId!==F));return}if(V.attachmentId){K(F,{status:"deleting"}),N.deleteAttachment(V.attachmentId).then(()=>$(Z.filter((Y)=>Y.localId!==F)),()=>K(F,{status:"error"}));return}$(Z.filter((Y)=>Y.localId!==F))}function y(F){let V=[];for(let Y of Z){if(Y.threadId!==void 0&&Y.threadId!==F){V.push(Y);continue}if(Y.status==="uploading")L.add(Y.localId);else if(Y.status==="ready"&&Y.threadId===F&&Y.attachmentId)N.deleteAttachment(Y.attachmentId).catch(()=>{})}$(V)}function U(){let F=Z.flatMap((V)=>V.status==="ready"&&V.summary?[{...V,status:"ready",summary:V.summary}]:[]);return $(Z.filter((V)=>V.status!=="ready")),J=F,F}function H(F){let V=J;if(J=[],V.some((Y)=>Y.threadId!==F))return;$([...V.map((Y)=>({...Y,status:"error"})),...Z])}function S(){J=[]}return{getState:X,subscribe:G,accept:O,remove:q,clear:y,consumeReady:U,restoreConsumed:H,discardConsumed:S}}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 a0=["completed","cancelled","failed"];function p1(_,N,k){if(N!==k)return null;if(typeof _!=="object"||_===null)return null;let L=_;if(L.type!=="cortex:client-tool")return null;let Z=a0.find((X)=>X===L.status);if(!Z)return null;let J=L.reference;return{type:"cortex:client-tool",status:Z,...typeof J==="string"?{reference:J}:{},...L.result!==void 0?{result:L.result}:{}}}function Z1(_,N,k){try{return new URL(_).origin===N&&!k?"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,k){try{return k===!0&&new URL(_).origin===N}catch{return!1}}function $1(_,N){try{return _.contentWindow?.location.origin===N}catch{return!1}}function X1(_){let N=!1,k=!1,L,Z;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 K=_.submit($);if(K instanceof Promise)K.catch(X)}catch{X()}}return{async start(){J({phase:"initiating"});try{let $=await _.initiate();if(!$.embed){J({phase:"unavailable"});return}if(!/^https?:$/.test(new URL($.embedUrl).protocol)){J({phase:"error"});return}L=$.embedOrigin,J({phase:"embedded",embedUrl:$.embedUrl,surface:$.surface,embedOrigin:$.embedOrigin})}catch($){let K=$ instanceof Error?$.message:"";J({phase:/HTTP 404/.test(K)?"unavailable":"error"})}},setSource($){if($!==null&&$!==void 0)Z=$},handleMessage($){if(!L)return;if(Z===void 0||$.source!==Z)return;let K=p1($.data,$.origin,L);if(!K)return;G({status:K.status,reference:K.reference,result:K.result})},cancel(){G({status:"cancelled"})},terminate(){if(N||k)return;L=void 0,Z=void 0,J({phase:"error"})},dispose(){N=!0}}}function t0(_){return Math.min(1000*2**(_-1),30000)}var s0=1e4;function G1(_){let N,k,L=0,Z=!1;function J(){let G=typeof _.wsUrl==="function"?_.wsUrl():_.wsUrl,$=e0(G,_.transport.baseUrl);U_(_.transport).then((K)=>{if(Z)return;N=new WebSocket(Z2($,K)),N.addEventListener("open",()=>{let Q=N;setTimeout(()=>{if(N===Q&&!Z)L=0},s0),_.onOpen?.()}),N.addEventListener("message",(Q)=>{let O=Q.data;if(typeof O!=="string")return;let q;try{q=JSON.parse(O)}catch{return}_.onEvent(q)}),N.addEventListener("close",X)}).catch(X)}function X(){if(Z||k)return;L+=1,k=setTimeout(()=>{k=void 0,J()},t0(L))}return J(),{close(){Z=!0,clearTimeout(k),N?.close()}}}function e0(_,N){let k=_??_2(N);if(!_)return k;let L=N2(N);if(!L)return k;return k2(k,L)}function _2(_){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 N2(_){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 k2(_,N){let k=new URL(_,window.location.origin);if(k.searchParams.has("agentId")||L2(k))return k.toString();return k.searchParams.set("agentId",N),k.toString()}function L2(_){let N=_.pathname.split("/").filter(Boolean),k=N.lastIndexOf("agents");return k!==-1&&Boolean(N[k+1])}function Z2(_,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 c_(_){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 B_(_,N){let k=[..._],L=k.findIndex((Z)=>Z.id===N.id);if(L===-1)k.push(N);else k[L]={...k[L],...N};return c_(k)}function I_(_,N){return _.filter((k)=>k.id!==N)}function V1(_,N){switch(N.type){case"thread:deleted":return I_(_,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 J2}from"marked";import $2 from"dompurify";function K1(_){if(!_)return"";let N=J2.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'),$2.sanitize(N)}import y_ from"highlight.js/lib/core";import X2 from"highlight.js/lib/languages/javascript";import G2 from"highlight.js/lib/languages/json";import V2 from"highlight.js/lib/languages/sql";var m1=!1;function K2(){if(m1)return;m1=!0,y_.registerLanguage("javascript",X2),y_.registerLanguage("json",G2),y_.registerLanguage("cypher",V2)}function W1(_,N){if(!_)return"";return K2(),y_.getLanguage(N)?y_.highlight(_,{language:N}).value:W2(_)}function W2(_){return _.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}var u1={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_client_tool_title:"أكمل هذه الخطوة للمتابعة",translate_client_tool_loading:"جارٍ تجهيز خطوة آمنة...",translate_client_tool_failed:"تعذّر تحميل هذه الخطوة",translate_client_tool_retry:"حاول مرة أخرى",translate_client_tool_cancel:"إلغاء"};var l1={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_client_tool_title:"Complete this step to continue",translate_client_tool_loading:"Preparing a secure step...",translate_client_tool_failed:"This step could not be loaded",translate_client_tool_retry:"Try again",translate_client_tool_cancel:"Cancel"};var C_={en:l1,ar:u1};function Y1(_,N,k){let Z=(C_[_]??C_.en)?.[N]??C_.en?.[N]??N;if(!k)return Z;return Z.replace(/\{\{\s*(\w+)\s*\}\}/g,(J,X)=>(X in k)?String(k[X]):J)}function V_(_){if(typeof _==="string"){let N=_.trim();if(!(N.startsWith("{")&&N.endsWith("}")||N.startsWith("[")&&N.endsWith("]")))return _;try{return V_(JSON.parse(N))}catch{return _}}if(Array.isArray(_))return _.map((N)=>V_(N));if(_!==null&&typeof _==="object"){let N={};for(let[k,L]of Object.entries(_))N[k]=V_(L);return N}return _}function Q1(_,N){if(Array.isArray(_)){let k=_;return{kind:"container",open:"[",close:"]",summary:o1(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:o1(k.length,"property","properties"),entries:k.map(([L,Z])=>({key:L,value:Z,path:`${N}.${L}`}))}}return{kind:"primitive",text:z2(_),className:F2(_)}}function o1(_,N,k){return`${_} ${_===1?N:k}`}function z2(_){if(_===null||_===void 0)return"null";if(typeof _==="string")return JSON.stringify(_);if(typeof _==="number"||typeof _==="boolean")return String(_);return JSON.stringify(_)??"null"}function F2(_){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 S_(_){if(!_)return null;try{return JSON.parse(_)}catch{return _}}function n_(_){if(!_)return"";try{return JSON.stringify(JSON.parse(_),null,2)}catch{return _}}var z1=[["year",31536000000],["month",2592000000],["week",604800000],["day",86400000],["hour",3600000],["minute",60000],["second",1000]];function F1(_,N,k=Date.now()){let L=Date.parse(_);if(Number.isNaN(L))return"";let Z=L-k,[J,X]=z1.find(([,G])=>Math.abs(Z)>=G)??z1[z1.length-1];return new Intl.RelativeTimeFormat(N,{numeric:"auto"}).format(Math.round(Z/X),J)}function q1(_,N){let k=URL.createObjectURL(_),L=document.createElement("a");L.href=k,L.download=N,L.click(),URL.revokeObjectURL(k)}class J_{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?J_.DONE_DRAIN_FRACTION:J_.DRAIN_FRACTION,k=Math.max(J_.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 O_(_){if(_.input.total<=0)return null;return Math.round(_.input.cacheRead/_.input.total*100)}import{useEffect as M_,useLayoutEffect as j1,useMemo as q2,useRef as d}from"react";import{useChat as H2}from"@tanstack/ai-react";function h1(_){let{thread:N,api:k,patchUi:L}=_,Z=d(!0),J=d(!1),X=d(!1),G=d(!1),$=d(!1),K=d(new Set),Q=d(Promise.resolve()),O=q2(()=>_1({api:k,thread:{id:N.id,isRunning:N.isRunning},mode:_.mode,onHydrated:(D)=>{if(!Z.current)return;L({messageMetadata:R_(D)})},setLoadingMessages:(D)=>{if(Z.current)L({isLoadingMessages:D})}}),[]),q=H2({threadId:N.id,persistence:!0,connection:O,onChunk:()=>{if(!Z.current)return;X.current=!0},onError:()=>{if(!Z.current)return;if(X.current)_.onTurnFinished();else _.onSendFailed()}}),y=d(q);y.current=q;let U=d(q.isLoading);U.current=q.isLoading;async function H(D,b){let f=b({toolCallId:D.id,toolName:D.name,input:D.input},{threadId:N.id});if(f===null||f===void 0)return;let u=await Promise.resolve(f);if(u===null||u===void 0)return;if(!Z.current)return;await y.current.addToolResult({toolCallId:D.id,tool:D.name,output:u})}function S(){let D=v_(y.current.messages),b=_.configRef.current.hooks?.onToolCall;if(!b)return D.length>0;for(let f of D){if(f.state!=="input-complete")continue;if(K.current.has(f.id))continue;K.current.add(f.id),H(f,b)}return D.length>0}async function F(D){if(!Z.current||D!==N.id)return;await N1({api:k,threadId:D,isStale:()=>!Z.current,isStreaming:()=>U.current,absorbMetadata:(b)=>L({messageMetadata:b}),setMessages:(b)=>{y.current.setMessages(b)}})}function V(D){return Q.current=Q.current.then(()=>F(D)),Q.current}async function Y(){if(G.current){G.current=!1;return}if(J.current&&S())return;await V(N.id)}async function I(D,b){_.setRunning(N.id,!0),J.current=!0,X.current=!1;let f={id:crypto.randomUUID(),role:"user",parts:[{type:"text",content:D}]};if(b.length)L((u)=>({messageMetadata:new Map(u.messageMetadata).set(f.id,{attachments:b})}));await y.current.append(f)}async function n(){if(!U.current)return;let{aborted:D}=await k.abortStream(N.id).catch(()=>({aborted:!1}));if(!Z.current)return;if(D)G.current=!0,_.setRunning(N.id,!1);y.current.stop()}function M(D,b,f){return y.current.addToolResult({toolCallId:D,tool:b,output:f}).catch((u)=>{throw V(N.id),u})}function j(D){if(U.current)return;if(D.isRunning){_.remount(D);return}V(D.id)}M_(()=>{return Z.current=!0,()=>{Z.current=!1}},[]);let L_=d(void 0);return L_.current={threadId:N.id,send:I,abort:n,addToolResult:M,reattach:j,refreshMessages:(D)=>{V(D)}},j1(()=>{_.sessionRef.current=L_.current}),j1(()=>{return()=>{if(_.sessionRef.current===L_.current)_.sessionRef.current=void 0}},[]),M_(()=>{if(!_.pendingSendRef.current.length)return;let D=setTimeout(()=>{let b=_.pendingSendRef.current;_.pendingSendRef.current=[],(async()=>{for(let{prompt:f,attachments:u}of b)await I(f,u)})()});return()=>clearTimeout(D)},[]),M_(()=>{L({messages:q.messages})},[q.messages]),M_(()=>{L({hasPendingToolCalls:!q.isLoading&&v_(q.messages).length>0})},[q.messages,q.isLoading]),M_(()=>{if(L({isAgentWorking:q.isLoading}),q.isLoading){$.current=!0;return}if(!$.current)return;$.current=!1,_.onTurnFinished(),Y()},[q.isLoading]),null}import{createContext as D2,useContext as B2}from"react";var H1=D2(void 0);function B(){let _=B2(H1);if(!_)throw Error("useCortex must be used inside <CortexChatWidget>");return _}function z(..._){return _.filter(Boolean).join(" ")}import{forwardRef as y2,useEffect as O2,useImperativeHandle as M2,useRef as B1,useState as x1}from"react";import{jsx as t,jsxs as D1}from"react/jsx-runtime";function r1(){let{queue:_,t:N}=B();if(!_.items.length)return null;return t("div",{className:"cortex-attachment-queue",children:_.items.map((k)=>D1("div",{className:z("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"?D1("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"})]}):D1("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 E2=s_.join(","),i1=y2(function(N,k){let{t:L,queue:Z,isAgentWorking:J,send:X,abort:G}=B(),[$,K]=x1(""),[Q,O]=x1(!1),q=B1(null),y=B1(null);M2(k,()=>({focusInput:()=>q.current?.focus()}));let U=B1(J);O2(()=>{if(U.current&&!J)q.current?.focus();U.current=J},[J]);let H=!Z.busy&&(Boolean($.trim())||Z.hasReady);function S(){if(J||!H)return;let M="translate_attachment_caption",j=L(M),L_=j!==M?j:"Please take a look at the attached files.",D=$.trim()||L_,b=Z.consumeReady();K(""),X(D,b.map((f)=>f.summary))}function F(M){if(M.key==="Enter"&&!M.shiftKey)M.preventDefault(),S()}function V(M){M.preventDefault(),O(!0)}function Y(M){if(!M.currentTarget.contains(M.relatedTarget))O(!1)}function I(M){M.preventDefault(),O(!1),Z.accept([...M.dataTransfer.files])}function n(M){let j=M.clipboardData.files;if(!j.length)return;M.preventDefault(),Z.accept([...j])}return g_("div",{className:"cortex-widget__input-area",onDragOver:V,onDragLeave:Y,onDrop:I,children:[r(r1,{}),g_("div",{className:z("cortex-widget__input-box",J&&"cortex-widget__input-box--disabled",!J&&"cortex-widget__input-box--enabled",Q&&"cortex-widget__input-box--dragging"),children:[r("textarea",{ref:q,onKeyDown:F,onPaste:n,value:$,onChange:(M)=>K(M.target.value),placeholder:Q?L("translate_drop_files_here"):J?"":L("translate_type_a_message"),disabled:J,rows:1,className:z("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:()=>y.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:y,type:"file",multiple:!0,accept:E2,onChange:(M)=>{Z.accept([...M.target.files??[]]),M.target.value=""},className:"cortex-widget__file-input"}),r("button",{onClick:S,className:z("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 o2}from"react";import{jsx as f_,jsxs as d1}from"react/jsx-runtime";function a1(){let{t:_}=B();return d1("div",{className:"cortex-aborted-flag",children:[f_("span",{className:"cortex-aborted-flag__line"}),d1("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 K_,jsxs as t1}from"react/jsx-runtime";function s1(_){let{api:N,t:k}=B();async function L(Z){let{blob:J,name:X}=await N.downloadAttachment(Z);q1(J,X)}return K_("div",{className:"cortex-message-attachments",children:_.attachments.map((Z)=>t1("button",{type:"button",onClick:()=>void L(Z.id),className:"cortex-message-attachment","aria-label":`${k("translate_download")}: ${Z.filename}`,children:[t1("svg",{viewBox:"0 0 16 16",className:"cortex-message-attachment__icon",fill:"none",children:[K_("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"}),K_("path",{d:"M9.5 1.5v2a2 2 0 0 0 2 2h2",stroke:"currentColor",strokeWidth:"1.25",strokeLinecap:"round"})]}),K_("span",{className:"cortex-message-attachment__name",children:Z.filename}),K_("svg",{viewBox:"0 0 16 16",className:"cortex-message-attachment__dl-icon",fill:"none",children:K_("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 b2,useState as E_}from"react";import{useRef as A2,useState as w2}from"react";import{jsx as W_,jsxs as P2}from"react/jsx-runtime";function e({value:_,className:N}){let[k,L]=w2(!1),Z=A2(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:z("cortex-copy-btn",N),children:W_("button",{className:z("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"})}):P2("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 U2,useState as v2}from"react";import{jsx as o,jsxs as $_,Fragment as T_}from"react/jsx-runtime";function X_({data:_,expandDepth:N=1,className:k}){let L=U2(()=>V_(_),[_]),[Z,J]=v2({});function X($,K){return Z[$]??K>=N}function G($,K){J((Q)=>({...Q,[$]:!X($,K)}))}return o("div",{className:z("cortex-json-tree",k),children:o(e1,{value:L,path:"$",depth:0,isCollapsed:X,toggle:G})})}function e1({value:_,path:N,depth:k,isCollapsed:L,toggle:Z}){let J=Q1(_,N);if(J.kind==="primitive")return o("span",{className:J.className,children:J.text});if(J.entries.length===0)return $_("span",{className:"jt-bracket",children:[J.open,J.close]});let X=L(N,k);function G($){Z(N,k),$.stopPropagation()}return $_(T_,{children:[$_("span",{className:"jt-toggle",onClick:G,role:"button",children:[o("span",{className:z("jt-arrow",X&&"jt-arrow--collapsed"),children:"▾"}),o("span",{className:"jt-bracket",children:J.open})]}),X?$_(T_,{children:[o("span",{className:"jt-collapsed-hint",onClick:G,role:"button",children:J.summary}),o("span",{className:"jt-bracket",children:J.close})]}):$_(T_,{children:[o("div",{className:"jt-indent",children:J.entries.map(($,K)=>$_("div",{className:"jt-line",children:[$.key!==null&&$_(T_,{children:[o("span",{className:"jt-key",children:`"${$.key}"`}),o("span",{className:"jt-colon",children:": "})]}),o(e1,{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 R(_){return _.toLocaleString("en-US")}import{jsx as Y_,jsxs as Q_}from"react/jsx-runtime";function _0({usage:_}){let{t:N}=B();return Q_("div",{className:"cortex-llm-inspector__usage-rows",children:[Q_("div",{className:"cortex-llm-inspector__usage-row",children:[Y_("span",{className:"cortex-llm-inspector__usage-lbl",children:N("translate_input")}),Y_("span",{className:"cortex-llm-inspector__usage-val",children:R(_.input.total)}),Q_("span",{className:"cortex-llm-inspector__usage-detail",children:[N("translate_fresh")," ",R(_.input.noCache)," · ",N("translate_read")," ",R(_.input.cacheRead)," · ",N("translate_write")," ",R(_.input.cacheWrite)]})]}),Q_("div",{className:"cortex-llm-inspector__usage-row",children:[Y_("span",{className:"cortex-llm-inspector__usage-lbl",children:N("translate_output")}),Y_("span",{className:"cortex-llm-inspector__usage-val",children:R(_.output.total)}),Q_("span",{className:"cortex-llm-inspector__usage-detail",children:[N("translate_text")," ",R(_.output.text)," · ",N("translate_reasoning")," ",R(_.output.reasoning)]})]}),Q_("div",{className:"cortex-llm-inspector__usage-row cortex-llm-inspector__usage-row--total",children:[Y_("span",{className:"cortex-llm-inspector__usage-lbl",children:N("translate_total")}),Y_("span",{className:"cortex-llm-inspector__usage-val",children:R(_.total)})]})]})}import{jsx as y1,jsxs as p_}from"react/jsx-runtime";function N0({usage:_}){let N=O_(_);return y1("span",{children:p_("span",{className:"cortex-llm-inspector__step-metrics",children:[p_("span",{className:"cortex-llm-inspector__metric",children:[y1("span",{className:"cortex-llm-inspector__dot cortex-llm-inspector__dot--input"}),R(_.input.total)]}),p_("span",{className:"cortex-llm-inspector__metric",children:[y1("span",{className:"cortex-llm-inspector__dot cortex-llm-inspector__dot--output"}),R(_.output.total)]}),N!==null?p_("span",{className:"cortex-llm-inspector__cache-pct",children:[N,"%"]}):null]})})}import{jsx as c,jsxs as __}from"react/jsx-runtime";function k0({messageId:_}){let{t:N,api:k}=B(),[L,Z]=E_(!1),[J,X]=E_(!1),[G,$]=E_([]),[K,Q]=E_(null),[O,q]=E_({}),y=b2(!1);async function U(){if(!y.current){X(!0);try{$(await k.listLlmRequests(_))}finally{X(!1),y.current=!0}}Z((V)=>!V)}function H(V){Q((Y)=>Y===V?null:V)}function S(V){return O[V]??"prompt"}function F(V,Y){q((I)=>({...I,[V]:Y}))}return __("div",{className:z("cortex-llm-inspector",L&&"cortex-llm-inspector--open"),children:[__("button",{className:"cortex-llm-inspector__trigger",onClick:()=>void U(),children:[c("svg",{className:"cortex-llm-inspector__icon",width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:c("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"})}),c("span",{children:N("translate_inspect_llm_requests")}),J?c("span",{className:"cortex-llm-inspector__loading",children:N("translate_loading")}):G.length>0?c("span",{className:"cortex-llm-inspector__badge",children:G.length}):null,c("svg",{className:"cortex-llm-inspector__chevron",width:"12",height:"12",viewBox:"0 0 12 12",fill:"none",children:c("path",{d:"M3 4.5L6 7.5L9 4.5",stroke:"currentColor",strokeWidth:"1.25",strokeLinecap:"round",strokeLinejoin:"round"})})]}),c("div",{className:"cortex-llm-inspector__panel-wrapper",children:c("div",{className:"cortex-llm-inspector__panel-inner",children:__("div",{className:"cortex-llm-inspector__panel",children:[G.length===0&&!J?c("div",{className:"cortex-llm-inspector__empty",children:N("translate_no_llm_requests")}):null,G.map((V,Y)=>__("div",{className:z("cortex-llm-inspector__step",K===V.id&&"cortex-llm-inspector__step--expanded"),children:[__("button",{className:"cortex-llm-inspector__step-header",onClick:()=>H(V.id),children:[c("span",{className:"cortex-llm-inspector__step-label",children:N("translate_step_n",{number:Y+1})}),V.tokenUsage?c(N0,{usage:V.tokenUsage}):null,c("svg",{className:"cortex-llm-inspector__step-chevron",width:"10",height:"10",viewBox:"0 0 12 12",fill:"none",children:c("path",{d:"M3 4.5L6 7.5L9 4.5",stroke:"currentColor",strokeWidth:"1.25",strokeLinecap:"round",strokeLinejoin:"round"})})]}),c("div",{className:"cortex-llm-inspector__step-body-wrapper",children:c("div",{className:"cortex-llm-inspector__step-body-inner",children:__("div",{className:"cortex-llm-inspector__step-body",children:[V.tokenUsage?c(_0,{usage:V.tokenUsage}):null,__("div",{className:"cortex-llm-inspector__tabs",children:[c("button",{className:z("cortex-llm-inspector__tab",S(V.id)==="prompt"&&"cortex-llm-inspector__tab--active"),onClick:()=>F(V.id,"prompt"),children:N("translate_request")}),c("button",{className:z("cortex-llm-inspector__tab",S(V.id)==="response"&&"cortex-llm-inspector__tab--active"),onClick:()=>F(V.id,"response"),children:N("translate_response")})]}),__("div",{className:"cortex-llm-inspector__json-pane",children:[c(e,{className:"cortex-llm-inspector__json-copy",value:S(V.id)==="prompt"?n_(V.prompt):n_(V.output)}),S(V.id)==="prompt"?c(X_,{data:S_(V.prompt),expandDepth:2}):c(X_,{data:S_(V.output),expandDepth:2})]})]})})})]},V.id))]})})})]})}import{useEffect as R2,useRef as c2,useState as L0}from"react";import{jsx as A_,jsxs as Z0}from"react/jsx-runtime";function z_({labels:_,className:N}){let{t:k}=B(),[L,Z]=L0(0),[J,X]=L0("idle"),G=c2(_.length);return G.current=_.length,R2(()=>{let $,K;function Q(){$=setTimeout(()=>{X("exiting"),$=setTimeout(()=>{Z((O)=>(O+1)%G.current),X("enter-start"),K=requestAnimationFrame(()=>{X("entering"),$=setTimeout(()=>{X("idle"),Q()},300)})},300)},2000)}return Q(),()=>{if($)clearTimeout($);if(K)cancelAnimationFrame(K)}},[]),Z0("div",{className:z("cortex-subtle-activity",N),children:[Z0("div",{className:"cortex-subtle-activity__dots",children:[A_("span",{className:"cortex-subtle-activity__dot"}),A_("span",{className:"cortex-subtle-activity__dot cortex-subtle-activity__dot--d1"}),A_("span",{className:"cortex-subtle-activity__dot cortex-subtle-activity__dot--d2"})]}),A_("div",{className:"cortex-subtle-activity__label-mask",children:A_("span",{className:z("cortex-subtle-activity__label",`cortex-subtle-activity__label--${J}`),children:k(_[L])})})]})}import{jsx as J0}from"react/jsx-runtime";var I2=Z_("reasoning");function $0(){return J0("div",{className:"cortex-reasoning-animated",children:J0(z_,{labels:I2})})}import{jsx as x,jsxs as w_}from"react/jsx-runtime";function X0(_){let{reasoningPart:N,streaming:k=!1}=_,{t:L}=B();return w_("details",{className:"cortex-reasoning-details",children:[w_("summary",{className:"cortex-reasoning-details__summary",children:[w_("div",{className:"cortex-reasoning-details__header",children:[x("span",{className:"cortex-reasoning-details__icon",children:w_("svg",{width:"14",height:"14",viewBox:"0 0 20 20",fill:"none","aria-hidden":"true",children:[x("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"}),x("path",{d:"M7.5 17.5h5M8.5 8a2 2 0 0 1 2-2",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round",strokeLinejoin:"round"})]})}),x("div",{className:"cortex-reasoning-details__title-group",children:w_("div",{className:"cortex-reasoning-details__title-row",children:[x("div",{className:"cortex-reasoning-details__title",children:L("translate_reasoning")}),x("span",{className:z("cortex-reasoning-details__badge",k?"cortex-reasoning-details__badge--streaming":"cortex-reasoning-details__badge--done"),children:k?"Streaming":"Done"})]})})]}),x("span",{className:"cortex-reasoning-details__chevron","aria-hidden":"true",children:x("svg",{width:"14",height:"14",viewBox:"0 0 20 20",fill:"none",children:x("path",{d:"m5.75 8.25 4.25 4.25 4.25-4.25",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})})]}),x("div",{className:"cortex-reasoning-details__body",children:x("div",{className:"cortex-reasoning-details__content",children:x("pre",{className:"cortex-reasoning-details__pre",children:N.content.trim()?N.content:"No reasoning provided."})})})]})}import{useEffect as G0,useRef as O1,useState as C2}from"react";import{jsx as V0}from"react/jsx-runtime";function K0(_){let{role:N,textPart:k,streaming:L=!1}=_,Z=N==="assistant"&&L?"":k.content,[J,X]=C2(Z),G=O1(Z),$=O1(null),K=O1(!0);return G0(()=>{function Q(O){G.current=O,X(O)}if(N!=="assistant"||!L){$.current?.destroy(),$.current=null,Q(k.content),K.current=!1;return}if(!$.current)$.current=new J_(Q),$.current.seed(G.current);if(K.current){K.current=!1,$.current.seed(k.content);return}$.current.update(k.content,!1)},[N,L,k]),G0(()=>()=>{$.current?.destroy(),$.current=null},[]),V0("div",{className:z("cortex-text-part",N==="assistant"&&"cortex-text-part--assistant",N==="user"&&"cortex-text-part--user"),children:V0("div",{className:z("cortex-text-bubble",N==="assistant"&&"cortex-text-bubble--assistant",N==="user"&&"cortex-text-bubble--user"),dangerouslySetInnerHTML:{__html:K1(J)}})})}import{jsx as p,jsxs as N_}from"react/jsx-runtime";function W0({toolCallPart:_}){let{t:N}=B(),{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:[p("span",{className:"dbg-tool__section-label dbg-tool__section-label--success",children:N("translate_output")}),p("span",{className:"dbg-tool__section-lang",children:"json"}),p(e,{value:J})]}),p("div",{dir:"ltr",className:"dbg-tool__tree",children:p(X_,{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:[p("span",{className:"dbg-tool__section-label dbg-tool__section-label--error",children:N("translate_error")}),p(e,{value:J})]}),p("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:[p("span",{className:"dbg-tool__section-label dbg-tool__section-label--approval",children:N("translate_approval_requested")}),p("span",{className:"dbg-tool__section-lang",children:L?.id})]}),p("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:[p("span",{className:"dbg-tool__section-label dbg-tool__section-label--approval",children:N("translate_approval_response")}),p("span",{className:"dbg-tool__section-lang",children:L?.id})]}),p("div",{className:"dbg-tool__message dbg-tool__message--approval",children:N(L?.approved?"translate_tool_approved":"translate_tool_response_received")})]});return null}return p("div",{children:X()})}import{jsx as Y0,jsxs as S2}from"react/jsx-runtime";function Q0({toolCallPart:_}){let{t:N}=B(),k=x_(_);return Y0("span",{children:S2("span",{className:z("dbg-tool__state",k.modifier&&`dbg-tool__state--${k.modifier}`),children:[k.pulse&&Y0("span",{className:z("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 z0({toolCallPart:_}){let{t:N}=B(),{codeSnippets:k,remainingInput:L,remainingInputText:Z}=d_(_.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(Q0,{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)),!!L&&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:Z})]}),T("div",{dir:"ltr",className:"dbg-tool__tree",children:T(X_,{data:L,expandDepth:2})})]}),T(W0,{toolCallPart:_})]})]})}import{useEffect as q0,useRef as M1,useState as F0}from"react";import{jsx as C,jsxs as P_}from"react/jsx-runtime";function H0({message:_,toolCallPart:N}){let{config:k,addToolResult:L,isAgentWorking:Z}=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 L(N.id,N.name,X)})});if(N.state==="input-complete"&&!Z)return C("div",{className:"cortex-tool-call-animated",children:C(n2,{toolCallPart:N})});return C("div",{className:"cortex-tool-call-animated",children:C(D0,{toolCallPart:N})})}function n2({toolCallPart:_}){let{api:N,t:k,addToolResult:L,selectedThread:Z,config:J}=B(),X=Z?.id,[G,$]=F0({phase:"initiating"}),[K]=F0(J.trustSameOriginEmbeds),Q=M1(void 0),O=M1({api:N,addToolResult:L,toolName:_.name});if(O.current={api:N,addToolResult:L,toolName:_.name},q0(()=>{if(!X)return;let y=X1({initiate:()=>O.current.api.initiateToolCall(X,_.id),onState:$,submit:(H)=>O.current.addToolResult(_.id,O.current.toolName,H)});Q.current=y,y.start();let U=(H)=>y.handleMessage(H);return window.addEventListener("message",U),()=>{if(window.removeEventListener("message",U),y.dispose(),Q.current===y)Q.current=void 0}},[_.id,X]),!X||G.phase==="unavailable"||G.phase==="settling")return C(D0,{toolCallPart:_});let q=P_("div",{className:"cortex-client-tool-embed",children:[P_("div",{className:"cortex-client-tool-embed__bar",children:[C("span",{children:k("translate_client_tool_title")}),C("button",{type:"button",className:"cortex-client-tool-embed__cancel",onClick:()=>Q.current?.cancel(),children:k("translate_client_tool_cancel")})]}),G.phase==="embedded"?C("iframe",{className:"cortex-client-tool-embed__frame",src:G.embedUrl,sandbox:Z1(G.embedUrl,window.location.origin,K),title:k("translate_client_tool_title"),ref:(y)=>Q.current?.setSource(y?.contentWindow),onLoad:(y)=>{if(!J1(G.embedUrl,window.location.origin,K)&&$1(y.currentTarget,window.location.origin))Q.current?.terminate()}}):G.phase==="error"?P_("div",{className:"cortex-client-tool-embed__status",children:[C("span",{children:k("translate_client_tool_failed")}),C("button",{type:"button",className:"cortex-client-tool-embed__retry",onClick:()=>void Q.current?.start(),children:k("translate_client_tool_retry")})]}):C("div",{className:"cortex-client-tool-embed__status",children:k("translate_client_tool_loading")})]});return G.phase==="embedded"&&G.surface==="modal"?C(g2,{label:k("translate_client_tool_title"),onCancel:()=>Q.current?.cancel(),children:q}):q}function g2({label:_,onCancel:N,children:k}){let L=M1(null);return q0(()=>{let Z=L.current;return Z?.showModal(),()=>Z?.close()},[]),C("dialog",{ref:L,className:"cortex-client-tool-embed-dialog","aria-label":_,onCancel:(Z)=>{Z.preventDefault(),N()},children:k})}function D0({toolCallPart:_}){let{t:N}=B(),{state:k,active:L,titleKey:Z}=a_(_);return P_("div",{className:"cortex-tool-pill",children:[P_("span",{className:"cortex-tool-pill__icon",children:[C("span",{className:z("cortex-tool-pill__spinner",L&&"cortex-tool-pill__spinner--visible")}),C("svg",{className:z("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:z("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:z("cortex-tool-pill__title",k==="error"&&"cortex-tool-pill__title--error"),children:N(Z)})]})}import{jsx as T2}from"react/jsx-runtime";var f2=Z_("code");function B0(){return T2(z_,{labels:f2})}import{jsx as m2}from"react/jsx-runtime";var p2=Z_("graph");function y0(){return m2(z_,{labels:p2})}import{jsx as E1}from"react/jsx-runtime";function O0({message:_,toolCallPart:N}){if(N.name==="queryGraph")return E1(y0,{});if(N.name==="executeCode")return E1(B0,{});return E1(H0,{toolCallPart:N,message:_})}import{jsx as F_,jsxs as u2}from"react/jsx-runtime";function M0(_){let{message:N,part:k,debugMode:L=!1,animate:Z=!1,streaming:J=!1}=_,{t:X}=B();function G(){switch(k.type){case"text":return F_(K0,{textPart:k,role:N.role,streaming:J});case"thinking":return L?F_(X0,{reasoningPart:k,streaming:J}):F_($0,{});case"tool-call":return L?F_(z0,{toolCallPart:k}):F_(O0,{toolCallPart:k,message:N});default:return u2("p",{className:"cortex-unhandled-type",children:[X("translate_unhandled_type")," ",k.type]})}}return F_("div",{className:z("cortex-message-part",Z&&"cortex-message-part--animated"),children:G()})}import{useState as l2}from"react";import{jsx as P,jsxs as g}from"react/jsx-runtime";function E0({usage:_,modelId:N}){let{t:k}=B(),[L,Z]=l2(!1),J=O_(_)??0;return g("div",{className:z("cortex-token-usage",L&&"cortex-token-usage--expanded"),children:[g("button",{className:"cortex-token-usage__summary",onClick:()=>Z((X)=>!X),children:[g("span",{className:"cortex-token-usage__total",children:[P("span",{className:"cortex-token-usage__total-number",children:R(_.total)}),P("span",{className:"cortex-token-usage__total-label",children:k("translate_tokens")})]}),N?P("span",{className:"cortex-token-usage__model",children:N}):null,g("span",{className:"cortex-token-usage__pills",children:[g("span",{className:"cortex-token-usage__pill",children:[P("span",{className:"cortex-token-usage__dot cortex-token-usage__dot--input"}),R(_.input.total)]}),g("span",{className:"cortex-token-usage__pill",children:[P("span",{className:"cortex-token-usage__dot cortex-token-usage__dot--output"}),R(_.output.total)]})]}),J>0?g("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:g("div",{className:"cortex-token-usage__columns",children:[g("div",{className:"cortex-token-usage__col",children:[g("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:R(_.input.total)})]}),g("div",{className:"cortex-token-usage__rows",children:[_.input.noCache?g("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:R(_.input.noCache)})]}):null,_.input.cacheRead?g("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:R(_.input.cacheRead)})]}):null,_.input.cacheWrite?g("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:R(_.input.cacheWrite)})]}):null]}),J>0?g("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]}),g("div",{className:"cortex-token-usage__col",children:[g("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:R(_.output.total)})]}),g("div",{className:"cortex-token-usage__rows",children:[_.output.text?g("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:R(_.output.text)})]}):null,_.output.reasoning?g("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:R(_.output.reasoning)})]}):null]})]})]})})})]})}import{jsx as q_,jsxs as A0}from"react/jsx-runtime";function w0(_){let{message:N,debugMode:k=!1,animate:L=!1}=_,{messages:Z,isAgentWorking:J,messageMetadata:X}=B(),G=J&&b_(Z)?.id===N.id,$=N.role==="assistant",K=N.parts,Q=K.filter((F,V)=>{if(F.type==="tool-result")return!1;return k||!t_(F,V===K.length-1,G)}),O=G?Q.length-1:-1,q=X.get(N.id),y=Boolean(q?.isAborted),U=q?.tokenUsage,H=N.role==="user"?q?.attachments??[]:[],S=k&&!G&&(Boolean(U)||$);return q_("div",{className:"cortex-message",children:Q.length>0&&A0("div",{className:"cortex-message-parts",children:[Q.map((F,V)=>q_(M0,{part:F,message:N,debugMode:k,animate:L,streaming:V===O},V)),H.length>0&&q_(s1,{attachments:H}),y&&q_(a1,{}),S&&A0("div",{className:"cortex-message-debug-zone",children:[U&&q_(E0,{usage:U,modelId:q?.modelId}),$&&q_(k0,{messageId:N.id})]})]})})}import{jsx as A1}from"react/jsx-runtime";function P0(_){let{messages:N,selectedThread:k}=B(),L=u_(null),Z=u_(!0),J=u_(!0),X=u_(!1),[G,$]=o2(!1);function K(){let H=L.current;if(H)H.scrollTop=H.scrollHeight}function Q(){if(X.current)return;X.current=!0,queueMicrotask(()=>{X.current=!1,K(),Z.current=!1})}m_(()=>{let H=L.current;if(Q(),$(!0),!H||typeof MutationObserver>"u")return;let S=new MutationObserver(()=>{if(!Z.current&&!J.current)return;Q()});return S.observe(H,{childList:!0,subtree:!0,characterData:!0}),()=>S.disconnect()},[]);let O=k?.id;m_(()=>{$(!1),Z.current=!0,queueMicrotask(()=>$(!0))},[O]);let q=N[N.length-1],y=q?.role==="user"?q.id:void 0;m_(()=>{if(y)Z.current=!0},[y]),m_(()=>{if(!Z.current&&!J.current)return;Q()},[N]);function U(){let H=L.current;if(!H)return;J.current=H.scrollHeight-H.scrollTop-H.clientHeight<100}return A1("div",{className:_.className,children:A1("div",{ref:L,className:"cortex-message-list",onScroll:U,children:N.map((H)=>A1(w0,{message:H,debugMode:_.debugMode,animate:G},H.id))})})}import{jsx as v,jsxs as i,Fragment as j2}from"react/jsx-runtime";var U0="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 v0(_){let{config:N,t:k,threads:L,selectedThread:Z,deleteThread:J}=B(),X=N.locale??"en";return i("div",{className:_.className,children:[i("div",{className:"cortex-widget__threads-header",children:[i("div",{children:[v("h2",{className:"cortex-widget__threads-title",children:k("translate_threads")}),v("p",{className:"cortex-widget__threads-count",children:k(L?.length===1?"translate_one_conversation":"translate_n_conversations",{count:L?.length??0})})]}),i("button",{onClick:()=>_.onNewChatRequested(),className:"cortex-widget__new-chat-btn",children:[v("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",children:v("path",{d:"M8 3v10M3 8h10",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})}),k("translate_new")]})]}),v("div",{className:"cortex-widget__threads-list",children:L===void 0?[1,2,3,4].map((G)=>i("div",{className:"cortex-widget__thread-skeleton",children:[v("div",{className:"cortex-skeleton cortex-widget__thread-skeleton-icon"}),v("div",{className:"cortex-widget__thread-skeleton-lines",children:v("div",{className:"cortex-skeleton cortex-widget__thread-skeleton-line",style:{width:`${40+G*12}%`}})})]},G)):i(j2,{children:[L.map((G)=>{let $=G.id===Z?.id,K=F1(G.updatedAt,X);return i("button",{onClick:()=>_.onThreadSelected(G),className:z("cortex-widget__thread-item",$&&"cortex-widget__thread-item--active"),children:[v("div",{className:z("cortex-widget__thread-icon",$&&"cortex-widget__thread-icon--active"),children:v("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",children:v("path",{d:U0,stroke:"currentColor",strokeWidth:"1.3",strokeLinecap:"round",strokeLinejoin:"round"})})}),i("div",{className:"cortex-widget__thread-info",children:[i("div",{className:"cortex-widget__thread-title-row",children:[v("p",{className:z("cortex-widget__thread-title",$&&"cortex-widget__thread-title--active"),children:G.title??k("translate_untitled")}),G.isRunning&&i("span",{className:z("cortex-widget__thread-running",$&&"cortex-widget__thread-running--active"),children:[v("span",{className:"cortex-widget__thread-running-dot"}),k("translate_running")]})]}),K&&v("p",{className:"cortex-widget__thread-time",children:K})]}),v("span",{role:"button",tabIndex:0,onClick:(Q)=>{Q.stopPropagation(),J(G.id)},onKeyDown:(Q)=>{if(Q.key!=="Enter"&&Q.key!==" ")return;Q.preventDefault(),Q.stopPropagation(),J(G.id)},className:z("cortex-widget__thread-delete",$&&"cortex-widget__thread-delete--active"),children:v("svg",{width:"12",height:"12",viewBox:"0 0 16 16",fill:"none",children:v("path",{d:"M4 4l8 8M12 4l-8 8",stroke:"currentColor",strokeWidth:"1.3",strokeLinecap:"round"})})}),v("svg",{className:z("cortex-widget__thread-arrow",$&&"cortex-widget__thread-arrow--active"),width:"10",height:"10",viewBox:"0 0 16 16",fill:"none",children:v("path",{d:"M6 4l4 4-4 4",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})]},G.id)}),!L.length&&i("div",{className:"cortex-widget__threads-empty",children:[v("div",{className:"cortex-widget__threads-empty-icon",children:v("svg",{width:"18",height:"18",viewBox:"0 0 16 16",fill:"none",className:"cortex-widget__threads-empty-svg",children:v("path",{d:U0,stroke:"currentColor",strokeWidth:"1.3",strokeLinecap:"round",strokeLinejoin:"round"})})}),v("p",{className:"cortex-widget__threads-empty-title",children:k("translate_no_threads_yet")}),v("p",{className:"cortex-widget__threads-empty-subtitle",children:k("translate_start_a_new_conversation")}),v("button",{onClick:()=>_.onNewChatRequested(),className:"cortex-widget__new-chat-btn cortex-widget__new-chat-btn--empty-state",children:k("translate_new_chat")})]})]})})]})}import{jsx as E,jsxs as a}from"react/jsx-runtime";var P1={messages:[],isAgentWorking:!1,isLoadingMessages:!1,hasPendingToolCalls:!1,messageMetadata:new Map};function r2({config:_,className:N}){let k=k_(_);k.current=_;let[L,Z]=H_(),[J,X]=H_(),[G,$]=H_(P1),[K,Q]=H_(!1),[O,q]=H_("threads"),[y,U]=H_(!1),H=k_(void 0),S=k_([]),F=k_(void 0),V=k_(null),Y=w1(()=>r_(()=>k.current.transport),[]),I=w1(()=>{let W=J?.thread;if(!W)return;return L?.find((A)=>A.id===W.id)??W},[L,J]),n=k_(I);n.current=I;let M=k_(G);M.current=G;let j=m((W)=>{$((A)=>({...A,...typeof W==="function"?W(A):W}))},[]),L_=m((W,A)=>{Z((w)=>{let l=w?.find((h_)=>h_.id===W);return l?B_(w??[],{...l,isRunning:A}):w})},[]),D=m((W,A)=>{if(n.current?.id===W.id&&H.current)return;let w=n.current;if(n.current=W,$(P1),X({thread:W,mode:A?.skipLoadingMessages?"skip":"load",epoch:0}),w&&w.id!==W.id)k.current.hooks?.onThreadDeselected?.(w);k.current.hooks?.onThreadSelected?.(W)},[]),b=m(()=>{let W=n.current;if(!W&&!H.current)return;if(n.current=void 0,X(void 0),$(P1),W)k.current.hooks?.onThreadDeselected?.(W)},[]),f=m((W)=>{j({hasPendingToolCalls:!1,messageMetadata:new Map}),X((A)=>({thread:W,mode:"reload",epoch:(A?.epoch??0)+1}))},[j]),u=m((W)=>{let A=n.current;if(A)return Promise.resolve(A.id);return F.current??=Y.createThread(W).then((w)=>{return F.current=void 0,Z((l)=>B_(l??[],w)),D(w,{skipLoadingMessages:!0}),w.id},(w)=>{throw F.current=void 0,w}),F.current},[Y,D]),h=w1(()=>k1({api:Y,ensureThread:()=>u()}),[Y,u]),U1=h2(h.subscribe,h.getState,h.getState),R0=m(async(W,A=[])=>{if(M.current.isAgentWorking||M.current.hasPendingToolCalls)return;let w=H.current;if(w){await w.send(W,A);return}S.current.push({prompt:W,attachments:A});try{await u(W)}catch(l){throw S.current=[],l}},[u]),c0=m(async()=>{await H.current?.abort()},[]),I0=m((W,A,w)=>H.current?.addToolResult(W,A,w)??Promise.resolve(),[]),C0=m(async(W)=>{if(n.current?.id===W)b();await Y.deleteThread(W),Z((A)=>A?I_(A,W):A)},[Y,b]),S0=m(()=>{h.discardConsumed(),setTimeout(()=>V.current?.focusInput())},[h]),n0=m(()=>{h.restoreConsumed(n.current?.id)},[h]),l_=m(async()=>{let W=c_(await Y.listThreads());return Z(W),W},[Y]),v1=m((W)=>{Z((w)=>{let l=V1(w??[],W);return w||l.length?l:w});let A=n.current?.id;switch(W.type){case"thread:deleted":if(A===W.payload.threadId)b();break;case"thread:run-started":if(A===W.payload.thread.id)H.current?.reattach(W.payload.thread);break;case"thread:messages-updated":H.current?.refreshMessages(W.payload.threadId);break}},[b]);b0(()=>{l_();let W=!1,A=G1({wsUrl:()=>k.current.wsUrl,transport:{baseUrl:()=>{let w=k.current.transport.baseUrl;return typeof w==="string"?w:w()},getHeaders:()=>k.current.transport.getHeaders()},onEvent:v1,onOpen:()=>{if(!W){W=!0;return}l_().then((w)=>{let l=n.current;if(!l)return;H.current?.reattach(w.find((h_)=>h_.id===l.id)??l)})}});return()=>{A.close()}},[v1,l_]);let o_=k_(void 0),j_=I?.id;b0(()=>{if(j_===o_.current)return;h.clear(o_.current),o_.current=j_},[j_,h]);let b1=_.locale??"en",D_=m((W,A)=>Y1(b1,W,A),[b1]),g0=_.viewMode??"helper",f0={config:_,t:D_,api:Y,debugMode:K,threads:L,selectedThread:I,deleteThread:C0,...G,send:R0,abort:c0,addToolResult:I0,queue:{items:U1,...L1(U1),accept:h.accept,remove:h.remove,consumeReady:h.consumeReady}};function T0(W){D(W),q("chat"),U(!1)}function p0(){b(),q("chat"),U(!1)}function m0(){b(),q("threads")}return E(H1.Provider,{value:f0,children:a("div",{className:z("cortex-widget",N),"data-cortex-theme":_.theme,children:[a("div",{className:z("cortex-widget__container",g0==="full"&&"cortex-widget__container--full",y&&"cortex-widget__container--sidebar-open"),onDragOver:(W)=>W.preventDefault(),onDrop:(W)=>W.preventDefault(),children:[E(v0,{className:z("cortex-widget__screen",O==="threads"&&"cortex-widget__screen--active",O!=="threads"&&"cortex-widget__screen--left"),onThreadSelected:T0,onNewChatRequested:p0}),a("div",{className:z("cortex-widget__screen",O==="chat"&&"cortex-widget__screen--active",O!=="chat"&&"cortex-widget__screen--right"),children:[a("div",{className:"cortex-widget__chat-header",children:[E("button",{onClick:()=>U((W)=>!W),className:"cortex-widget__sidebar-toggle-btn",children:E("svg",{width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",children:E("path",{d:"M2.5 4h11M2.5 8h11M2.5 12h11",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round"})})}),E("button",{onClick:m0,className:"cortex-widget__back-btn",children:E("svg",{width:"14",height:"14",viewBox:"0 0 16 16",fill:"none",className:"cortex-widget__back-icon",children:E("path",{d:"M10 3L5 8l5 5",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})}),E("div",{className:"cortex-widget__chat-title-wrap",children:E("p",{className:"cortex-widget__chat-title",children:I?.title??D_("translate_new_chat")})}),_.showDebugButton&&E("button",{onClick:()=>Q((W)=>!W),className:z("cortex-widget__debug-btn",K?"cortex-widget__debug-btn--on":"cortex-widget__debug-btn--off"),children:K?D_("translate_debug"):D_("translate_normal")})]}),G.isLoadingMessages&&!G.isAgentWorking?a("div",{className:"cortex-widget__messages-skeleton",children:[E("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:[E("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"13rem"}}),E("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"9rem"}})]})}),E("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:[E("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"16rem"}}),E("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"18rem"}}),E("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"12rem"}})]})}),E("div",{className:"cortex-widget__msg-skel cortex-widget__msg-skel--user",children:E("div",{className:"cortex-widget__msg-skel-bubble cortex-widget__msg-skel-bubble--user",children:E("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"11rem"}})})}),E("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:[E("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"14rem"}}),E("div",{className:"cortex-skeleton cortex-widget__msg-skel-line",style:{width:"15rem"}})]})})]}):E(P0,{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:[E("span",{className:"cortex-working-dot"}),E("span",{className:"cortex-working-dot"}),E("span",{className:"cortex-working-dot"})]}),E("span",{className:"cortex-widget__working-text",children:D_("translate_thinking")})]}),!G.hasPendingToolCalls&&E(i1,{ref:V})]}),E("div",{className:"cortex-widget__sidebar-backdrop",onClick:()=>U(!1)})]}),J&&E(h1,{thread:J.thread,mode:J.mode,api:Y,configRef:k,sessionRef:H,pendingSendRef:S,patchUi:j,setRunning:L_,remount:f,onTurnFinished:S0,onSendFailed:n0},`${J.thread.id}:${J.epoch}`)]})})}export{r2 as CortexChatWidget};
|
package/dist/styles.css
CHANGED
|
@@ -1796,7 +1796,7 @@ details[open] > summary .dbg-tool__chevron {
|
|
|
1796
1796
|
color: var(--cortex-color-danger);
|
|
1797
1797
|
}
|
|
1798
1798
|
|
|
1799
|
-
.cortex-
|
|
1799
|
+
.cortex-client-tool-embed {
|
|
1800
1800
|
border: 1px solid var(--cortex-color-border-strong);
|
|
1801
1801
|
border-radius: 12px;
|
|
1802
1802
|
background: var(--cortex-color-surface);
|
|
@@ -1804,7 +1804,7 @@ details[open] > summary .dbg-tool__chevron {
|
|
|
1804
1804
|
max-inline-size: 480px;
|
|
1805
1805
|
}
|
|
1806
1806
|
|
|
1807
|
-
.cortex-
|
|
1807
|
+
.cortex-client-tool-embed__bar {
|
|
1808
1808
|
display: flex;
|
|
1809
1809
|
align-items: center;
|
|
1810
1810
|
justify-content: space-between;
|
|
@@ -1815,7 +1815,7 @@ details[open] > summary .dbg-tool__chevron {
|
|
|
1815
1815
|
color: var(--cortex-color-text-muted);
|
|
1816
1816
|
}
|
|
1817
1817
|
|
|
1818
|
-
.cortex-
|
|
1818
|
+
.cortex-client-tool-embed__cancel {
|
|
1819
1819
|
border: 0;
|
|
1820
1820
|
background: none;
|
|
1821
1821
|
padding: 2px 4px;
|
|
@@ -1823,11 +1823,11 @@ details[open] > summary .dbg-tool__chevron {
|
|
|
1823
1823
|
color: var(--cortex-color-text-muted);
|
|
1824
1824
|
cursor: pointer;
|
|
1825
1825
|
}
|
|
1826
|
-
.cortex-
|
|
1826
|
+
.cortex-client-tool-embed__cancel:hover {
|
|
1827
1827
|
color: var(--cortex-color-danger);
|
|
1828
1828
|
}
|
|
1829
1829
|
|
|
1830
|
-
.cortex-
|
|
1830
|
+
.cortex-client-tool-embed__frame {
|
|
1831
1831
|
display: block;
|
|
1832
1832
|
inline-size: 100%;
|
|
1833
1833
|
block-size: 420px;
|
|
@@ -1835,7 +1835,7 @@ details[open] > summary .dbg-tool__chevron {
|
|
|
1835
1835
|
background: var(--cortex-color-surface);
|
|
1836
1836
|
}
|
|
1837
1837
|
|
|
1838
|
-
.cortex-
|
|
1838
|
+
.cortex-client-tool-embed__status {
|
|
1839
1839
|
display: flex;
|
|
1840
1840
|
align-items: center;
|
|
1841
1841
|
gap: 8px;
|
|
@@ -1844,7 +1844,7 @@ details[open] > summary .dbg-tool__chevron {
|
|
|
1844
1844
|
color: var(--cortex-color-text-muted);
|
|
1845
1845
|
}
|
|
1846
1846
|
|
|
1847
|
-
.cortex-
|
|
1847
|
+
.cortex-client-tool-embed__retry {
|
|
1848
1848
|
border: 1px solid var(--cortex-color-border-strong);
|
|
1849
1849
|
border-radius: 8px;
|
|
1850
1850
|
background: none;
|
|
@@ -1855,22 +1855,22 @@ details[open] > summary .dbg-tool__chevron {
|
|
|
1855
1855
|
cursor: pointer;
|
|
1856
1856
|
}
|
|
1857
1857
|
|
|
1858
|
-
.cortex-
|
|
1858
|
+
.cortex-client-tool-embed-dialog {
|
|
1859
1859
|
border: 0;
|
|
1860
1860
|
padding: 0;
|
|
1861
1861
|
background: none;
|
|
1862
1862
|
inline-size: min(560px, 100vw - 48px);
|
|
1863
1863
|
max-inline-size: none;
|
|
1864
1864
|
}
|
|
1865
|
-
.cortex-
|
|
1865
|
+
.cortex-client-tool-embed-dialog::backdrop {
|
|
1866
1866
|
background: rgba(0, 0, 0, 0.45);
|
|
1867
1867
|
}
|
|
1868
|
-
.cortex-
|
|
1868
|
+
.cortex-client-tool-embed-dialog .cortex-client-tool-embed {
|
|
1869
1869
|
inline-size: 100%;
|
|
1870
1870
|
max-inline-size: none;
|
|
1871
1871
|
box-shadow: 0 24px 64px rgba(0, 0, 0, 0.3);
|
|
1872
1872
|
}
|
|
1873
|
-
.cortex-
|
|
1873
|
+
.cortex-client-tool-embed-dialog .cortex-client-tool-embed__frame {
|
|
1874
1874
|
block-size: min(70dvh, 560px);
|
|
1875
1875
|
}
|
|
1876
1876
|
|
package/package.json
CHANGED
package/src/chat-session.tsx
CHANGED
|
@@ -96,13 +96,10 @@ export function ChatSession(props: ChatSessionProps) {
|
|
|
96
96
|
api,
|
|
97
97
|
thread: { id: thread.id, isRunning: thread.isRunning },
|
|
98
98
|
mode: props.mode,
|
|
99
|
-
onHydrated: (rows
|
|
99
|
+
onHydrated: (rows) => {
|
|
100
100
|
if (!alive.current) return;
|
|
101
101
|
|
|
102
|
-
patchUi({
|
|
103
|
-
messageMetadata: metadataByMessageId(rows),
|
|
104
|
-
hasPendingToolCalls: unansweredToolCalls(messages).length > 0,
|
|
105
|
-
});
|
|
102
|
+
patchUi({ messageMetadata: metadataByMessageId(rows) });
|
|
106
103
|
},
|
|
107
104
|
setLoadingMessages: (loading) => {
|
|
108
105
|
if (alive.current) patchUi({ isLoadingMessages: loading });
|
|
@@ -124,7 +121,6 @@ export function ChatSession(props: ChatSessionProps) {
|
|
|
124
121
|
},
|
|
125
122
|
onError: () => {
|
|
126
123
|
if (!alive.current) return;
|
|
127
|
-
patchUi({ hasPendingToolCalls: false });
|
|
128
124
|
// A failure only means the message never went while the server has said
|
|
129
125
|
// nothing at all. Once it has answered it holds the message, and the
|
|
130
126
|
// files it claimed are on it — reporting that as a failed send would
|
|
@@ -139,12 +135,6 @@ export function ChatSession(props: ChatSessionProps) {
|
|
|
139
135
|
const isLoadingRef = useRef(chat.isLoading);
|
|
140
136
|
isLoadingRef.current = chat.isLoading;
|
|
141
137
|
|
|
142
|
-
function syncPendingToolCalls() {
|
|
143
|
-
const pending = unansweredToolCalls(chatRef.current.messages);
|
|
144
|
-
patchUi({ hasPendingToolCalls: pending.length > 0 });
|
|
145
|
-
return pending;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
138
|
async function resolveToolCall(
|
|
149
139
|
call: ToolCallPart,
|
|
150
140
|
onToolCall: NonNullable<CortexHooks['onToolCall']>,
|
|
@@ -161,7 +151,6 @@ export function ChatSession(props: ChatSessionProps) {
|
|
|
161
151
|
if (!alive.current) return;
|
|
162
152
|
|
|
163
153
|
await chatRef.current.addToolResult({ toolCallId: call.id, tool: call.name, output });
|
|
164
|
-
syncPendingToolCalls();
|
|
165
154
|
}
|
|
166
155
|
|
|
167
156
|
/**
|
|
@@ -170,7 +159,7 @@ export function ChatSession(props: ChatSessionProps) {
|
|
|
170
159
|
* the client was asked to resolve. Reports whether any are still waiting.
|
|
171
160
|
*/
|
|
172
161
|
function dispatchPendingToolCalls() {
|
|
173
|
-
const pending =
|
|
162
|
+
const pending = unansweredToolCalls(chatRef.current.messages);
|
|
174
163
|
const onToolCall = props.configRef.current.hooks?.onToolCall;
|
|
175
164
|
if (!onToolCall) return pending.length > 0;
|
|
176
165
|
|
|
@@ -199,7 +188,6 @@ export function ChatSession(props: ChatSessionProps) {
|
|
|
199
188
|
absorbMetadata: (metadata) => patchUi({ messageMetadata: metadata }),
|
|
200
189
|
setMessages: (messages) => {
|
|
201
190
|
chatRef.current.setMessages(messages);
|
|
202
|
-
patchUi({ hasPendingToolCalls: unansweredToolCalls(messages).length > 0 });
|
|
203
191
|
},
|
|
204
192
|
});
|
|
205
193
|
}
|
|
@@ -271,25 +259,21 @@ export function ChatSession(props: ChatSessionProps) {
|
|
|
271
259
|
}
|
|
272
260
|
|
|
273
261
|
chatRef.current.stop();
|
|
274
|
-
patchUi({ hasPendingToolCalls: false });
|
|
275
262
|
}
|
|
276
263
|
|
|
277
264
|
/** Answers a tool call on behalf of a consumer-supplied tool component.
|
|
278
|
-
* Returns the delivery promise so callers (the
|
|
265
|
+
* Returns the delivery promise so callers (the client tool embed) can
|
|
279
266
|
* re-arm on a transient failure instead of stranding the pending call. */
|
|
280
267
|
function addToolResult(toolCallId: string, toolName: string, output: unknown) {
|
|
281
|
-
return chatRef.current
|
|
282
|
-
(
|
|
283
|
-
|
|
284
|
-
},
|
|
285
|
-
(error: unknown) => {
|
|
268
|
+
return chatRef.current
|
|
269
|
+
.addToolResult({ toolCallId, tool: toolName, output })
|
|
270
|
+
.catch((error: unknown) => {
|
|
286
271
|
// A failed delivery may have answered the call locally; re-reading
|
|
287
272
|
// the transcript brings the pending call back so the flow can re-arm
|
|
288
273
|
// (a remounted embed re-runs the idempotent initiate and recovers).
|
|
289
274
|
void refreshMessages(thread.id);
|
|
290
275
|
throw error;
|
|
291
|
-
}
|
|
292
|
-
);
|
|
276
|
+
});
|
|
293
277
|
}
|
|
294
278
|
|
|
295
279
|
function reattach(freshThread: ThreadSummary) {
|
|
@@ -367,6 +351,19 @@ export function ChatSession(props: ChatSessionProps) {
|
|
|
367
351
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
368
352
|
}, [chat.messages]);
|
|
369
353
|
|
|
354
|
+
// The one writer of `hasPendingToolCalls` — derived, never hand-synced. A
|
|
355
|
+
// call only counts as owed while the stream is idle: mid-turn an unsettled
|
|
356
|
+
// call is just a server tool executing. Recomputing on every (messages,
|
|
357
|
+
// isLoading) change is what brings the composer back the instant
|
|
358
|
+
// `addToolResult` settles the call part — the SDK's delivery promise only
|
|
359
|
+
// resolves once the continuation turn ends, far too late to gate UI on.
|
|
360
|
+
useEffect(() => {
|
|
361
|
+
patchUi({
|
|
362
|
+
hasPendingToolCalls: !chat.isLoading && unansweredToolCalls(chat.messages).length > 0,
|
|
363
|
+
});
|
|
364
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
365
|
+
}, [chat.messages, chat.isLoading]);
|
|
366
|
+
|
|
370
367
|
// The end of a turn is the client falling idle, not the SDK's onFinish: the
|
|
371
368
|
// agent loop ends a run per iteration, so onFinish fires while the turn is
|
|
372
369
|
// still going. Both the tool hand-off and the refetch wait for the whole
|
|
@@ -2,11 +2,12 @@ import { useEffect, useRef, useState } from 'react';
|
|
|
2
2
|
import type { ReactNode } from 'react';
|
|
3
3
|
import type { ToolCallPart, UIMessage } from '@tanstack/ai';
|
|
4
4
|
import {
|
|
5
|
-
|
|
5
|
+
createClientToolEmbed,
|
|
6
6
|
frameBreachedHostOrigin,
|
|
7
|
-
|
|
7
|
+
embedSandbox,
|
|
8
|
+
embedTrustedOnHostOrigin,
|
|
8
9
|
toolCallAnimation,
|
|
9
|
-
type
|
|
10
|
+
type ClientToolEmbedState,
|
|
10
11
|
} from '@cortex/client';
|
|
11
12
|
import { cx } from '../cx';
|
|
12
13
|
import { useCortex } from '../context';
|
|
@@ -33,12 +34,12 @@ export function MessageToolCallAnimated({ message, toolCallPart }: MessageToolCa
|
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
// A call still unanswered once the stream is idle is one the client owes an
|
|
36
|
-
// answer to — ask the server whether it is
|
|
37
|
+
// answer to — ask the server whether it is a client tool flow. While the
|
|
37
38
|
// agent is working, `input-complete` just means a server tool is executing.
|
|
38
39
|
if (toolCallPart.state === 'input-complete' && !isAgentWorking) {
|
|
39
40
|
return (
|
|
40
41
|
<div className="cortex-tool-call-animated">
|
|
41
|
-
<
|
|
42
|
+
<ToolClientEmbed toolCallPart={toolCallPart} />
|
|
42
43
|
</div>
|
|
43
44
|
);
|
|
44
45
|
}
|
|
@@ -50,12 +51,16 @@ export function MessageToolCallAnimated({ message, toolCallPart }: MessageToolCa
|
|
|
50
51
|
);
|
|
51
52
|
}
|
|
52
53
|
|
|
53
|
-
/** The in-chat surface of
|
|
54
|
-
function
|
|
55
|
-
const { api, t, addToolResult, selectedThread } = useCortex();
|
|
54
|
+
/** The in-chat surface of a client tool call: initiate → iframe → handshake. */
|
|
55
|
+
function ToolClientEmbed({ toolCallPart }: { toolCallPart: ToolCallPart }) {
|
|
56
|
+
const { api, t, addToolResult, selectedThread, config } = useCortex();
|
|
56
57
|
const threadId = selectedThread?.id;
|
|
57
|
-
const [state, setState] = useState<
|
|
58
|
-
|
|
58
|
+
const [state, setState] = useState<ClientToolEmbedState>({ phase: 'initiating' });
|
|
59
|
+
// Snapshotted for the embed's lifetime: mutating a mounted iframe's sandbox
|
|
60
|
+
// attribute does not re-sandbox the document already loaded in it, so a
|
|
61
|
+
// runtime flip of the option must not change what this embed renders with.
|
|
62
|
+
const [trustSameOriginEmbeds] = useState(config.trustSameOriginEmbeds);
|
|
63
|
+
const embedRef = useRef<ReturnType<typeof createClientToolEmbed>>(undefined);
|
|
59
64
|
// Read at call time so the embed's lifetime stays keyed to the call and
|
|
60
65
|
// thread alone while always using the current provider values.
|
|
61
66
|
const latest = useRef({ api, addToolResult, toolName: toolCallPart.name });
|
|
@@ -64,7 +69,7 @@ function ToolInteractiveEmbed({ toolCallPart }: { toolCallPart: ToolCallPart })
|
|
|
64
69
|
useEffect(() => {
|
|
65
70
|
if (!threadId) return;
|
|
66
71
|
|
|
67
|
-
const embed =
|
|
72
|
+
const embed = createClientToolEmbed({
|
|
68
73
|
initiate: () => latest.current.api.initiateToolCall(threadId, toolCallPart.id),
|
|
69
74
|
onState: setState,
|
|
70
75
|
submit: (output) =>
|
|
@@ -82,63 +87,71 @@ function ToolInteractiveEmbed({ toolCallPart }: { toolCallPart: ToolCallPart })
|
|
|
82
87
|
};
|
|
83
88
|
}, [toolCallPart.id, threadId]);
|
|
84
89
|
|
|
85
|
-
// Not
|
|
90
|
+
// Not a client tool (or no thread): the default pill takes over, and a
|
|
86
91
|
// consumer `hooks.onToolCall` may still answer the call.
|
|
87
92
|
if (!threadId || state.phase === 'unavailable' || state.phase === 'settling') {
|
|
88
93
|
return <ToolCallPill toolCallPart={toolCallPart} />;
|
|
89
94
|
}
|
|
90
95
|
|
|
91
96
|
const card = (
|
|
92
|
-
<div className="cortex-
|
|
93
|
-
<div className="cortex-
|
|
94
|
-
<span>{t('
|
|
97
|
+
<div className="cortex-client-tool-embed">
|
|
98
|
+
<div className="cortex-client-tool-embed__bar">
|
|
99
|
+
<span>{t('translate_client_tool_title')}</span>
|
|
95
100
|
<button
|
|
96
101
|
type="button"
|
|
97
|
-
className="cortex-
|
|
102
|
+
className="cortex-client-tool-embed__cancel"
|
|
98
103
|
onClick={() => embedRef.current?.cancel()}
|
|
99
104
|
>
|
|
100
|
-
{t('
|
|
105
|
+
{t('translate_client_tool_cancel')}
|
|
101
106
|
</button>
|
|
102
107
|
</div>
|
|
103
108
|
{state.phase === 'embedded' ? (
|
|
104
109
|
<iframe
|
|
105
|
-
className="cortex-
|
|
110
|
+
className="cortex-client-tool-embed__frame"
|
|
106
111
|
src={state.embedUrl}
|
|
107
|
-
sandbox={
|
|
108
|
-
title={t('
|
|
112
|
+
sandbox={embedSandbox(state.embedUrl, window.location.origin, trustSameOriginEmbeds)}
|
|
113
|
+
title={t('translate_client_tool_title')}
|
|
109
114
|
ref={(frame) => embedRef.current?.setSource(frame?.contentWindow)}
|
|
110
115
|
onLoad={(event) => {
|
|
111
116
|
// A cross-origin embed that navigates into the host origin would
|
|
112
117
|
// carry its grants onto the host's own document — kill the flow.
|
|
113
|
-
|
|
118
|
+
// A trusted same-origin embed lives there by design.
|
|
119
|
+
if (
|
|
120
|
+
!embedTrustedOnHostOrigin(
|
|
121
|
+
state.embedUrl,
|
|
122
|
+
window.location.origin,
|
|
123
|
+
trustSameOriginEmbeds,
|
|
124
|
+
) &&
|
|
125
|
+
frameBreachedHostOrigin(event.currentTarget, window.location.origin)
|
|
126
|
+
) {
|
|
114
127
|
embedRef.current?.terminate();
|
|
115
128
|
}
|
|
116
129
|
}}
|
|
117
130
|
/>
|
|
118
131
|
) : state.phase === 'error' ? (
|
|
119
|
-
<div className="cortex-
|
|
120
|
-
<span>{t('
|
|
132
|
+
<div className="cortex-client-tool-embed__status">
|
|
133
|
+
<span>{t('translate_client_tool_failed')}</span>
|
|
121
134
|
<button
|
|
122
135
|
type="button"
|
|
123
|
-
className="cortex-
|
|
136
|
+
className="cortex-client-tool-embed__retry"
|
|
124
137
|
onClick={() => void embedRef.current?.start()}
|
|
125
138
|
>
|
|
126
|
-
{t('
|
|
139
|
+
{t('translate_client_tool_retry')}
|
|
127
140
|
</button>
|
|
128
141
|
</div>
|
|
129
142
|
) : (
|
|
130
|
-
<div className="cortex-
|
|
143
|
+
<div className="cortex-client-tool-embed__status">{t('translate_client_tool_loading')}</div>
|
|
131
144
|
)}
|
|
132
145
|
</div>
|
|
133
146
|
);
|
|
134
147
|
|
|
135
148
|
return state.phase === 'embedded' && state.surface === 'modal' ? (
|
|
136
|
-
<
|
|
137
|
-
label={t('
|
|
149
|
+
<ClientToolModal
|
|
150
|
+
label={t('translate_client_tool_title')}
|
|
138
151
|
onCancel={() => embedRef.current?.cancel()}
|
|
139
152
|
>
|
|
140
153
|
{card}
|
|
141
|
-
</
|
|
154
|
+
</ClientToolModal>
|
|
142
155
|
) : (
|
|
143
156
|
card
|
|
144
157
|
);
|
|
@@ -149,7 +162,7 @@ function ToolInteractiveEmbed({ toolCallPart }: { toolCallPart: ToolCallPart })
|
|
|
149
162
|
* semantics, initial focus, focus trapping, and focus restoration for free,
|
|
150
163
|
* and the browser's Escape maps to cancelling the flow.
|
|
151
164
|
*/
|
|
152
|
-
function
|
|
165
|
+
function ClientToolModal({
|
|
153
166
|
label,
|
|
154
167
|
onCancel,
|
|
155
168
|
children,
|
|
@@ -169,7 +182,7 @@ function InteractiveModal({
|
|
|
169
182
|
return (
|
|
170
183
|
<dialog
|
|
171
184
|
ref={ref}
|
|
172
|
-
className="cortex-
|
|
185
|
+
className="cortex-client-tool-embed-dialog"
|
|
173
186
|
aria-label={label}
|
|
174
187
|
onCancel={(event) => {
|
|
175
188
|
// The flow decides when the dialog goes away: cancelling submits a
|