PageSourceSearch

https://chartinsight.ai/_nuxt/DQxqxpdd.js

js chartinsight.ai collected 2026-10-05 12:27:17 UTC 27,575 bytes, 9 lines download raw bytes

1import{M as De}from"./D2OCE8en.js";import{s as Pe}from"./B8087ysB.js";import{c as ce,p as Be,b as He,r as Fe}from"./CUF3P6tj.js";import{a9 as K,z as L,ae as ye,y as O,E as xe,f as be,aW as Ue,R as qe,i as se,o as b,c as w,B as J,a as k,t as z,b as G,s as Q,F as ee,r as ae,n as F,_ as ze,M as Ae,a0 as V,d as ue,j as Ve,Y as We,ar as Ge,h as Ye,aa as Je,O as Ke,u as Qe,aI as Xe}from"./DeGZr0e7.js";import{u as Ze}from"./CMSWslyK.js";import{s as et}from"./CEtxJzFh.js";import{r as Se}from"./CpSFmMOi.js";import{r as tt}from"./By4Q5-1U.js";import{r as at,a as st}from"./Cn4uUQaJ.js";import{_ as Te}from"./CCWLWY5a.js";import{r as nt}from"./BHHpCDZ-.js";import{u as rt,a as ot}from"./BboHTg9L.js";import"./Du1YEHKW.js";import"./Dih72uJC.js";import"./DRCR7XxA.js";const Re="record_chat:v1",W=O({}),q=O({}),de=O(!1),me=O(!1),H=O(null),ge=u=>{if(!u)return;const n=Date.parse(u);return Number.isFinite(n)?n:void 0},it=u=>{const n=u.content&&typeof u.content=="object"?u.content:null,x=u.speaker==="user"?"user":"agent",I=u.rating??u.user_rating,m=typeof I=="number"&&I!==0?I:null,i={id:String(u.id||""),speaker:x,user_rating:m,created_at:String(u.created_at||""),content:n,thoughts:[],toolCalls:[],citations:[],isStreaming:!1,isLegacy:!1};if(!n)return i;if((typeof n.version=="string"?n.version:null)===Re){if(i.text=typeof n.text=="string"?n.text:"",Array.isArray(n.thoughts)&&(i.thoughts=n.thoughts.map(g=>typeof g=="string"?g:g&&typeof g=="object"&&typeof g.text=="string"?String(g.text):"").filter(g=>g.length>0)),Array.isArray(n.tool_calls)){const g=()=>`tool-${Math.random().toString(36).slice(2,8)}`,l=[];for(const h of n.tool_calls){if(!h||typeof h!="object")continue;const d=h,$=typeof d.phase=="string"?d.phase:null,A=String(d.name||""),E=typeof d.summary=="string"?d.summary:void 0,P=typeof d.error=="string"?d.error:void 0;if($==="result"){const D=[...l].reverse().find(U=>U.name===A&&U.status==="running");D?(D.status=P?"error":"done",E!=null&&(D.summary=E),P!=null&&(D.error=P)):l.push({id:String(d.id||g()),name:A,summary:E,error:P,status:P?"error":"done"});continue}l.push({id:String(d.id||g()),name:A,args:d.args||void 0,summary:E,error:P,status:$==="call"?"running":d.status==="running"||d.status==="error"?d.status:"done"})}for(const h of l)h.status==="running"&&(h.status="done");i.toolCalls=l}Array.isArray(n.citations)&&(i.citations=n.citations.filter(g=>g&&typeof g=="object").map(g=>g)),typeof n.error=="string"&&(i.error=n.error),i.startedAt=ge(typeof n.started_at=="string"?n.started_at:null),i.endedAt=ge(typeof n.completed_at=="string"?n.completed_at:null),i.speaker==="agent"&&n.status==="streaming"&&(i.isStreaming=!0)}else i.isLegacy=i.speaker==="agent",i.text=typeof n.text=="string"?n.text:typeof n.message=="string"?n.message:"";return i.speaker==="agent"&&i.startedAt==null&&(i.startedAt=ge(i.created_at)),i.speaker==="agent"&&i.endedAt==null&&i.startedAt!=null&&!i.isStreaming&&(i.endedAt=i.startedAt),i};function Me(u){const n=()=>ye(u),x=()=>xe().apiBaseURL,I=()=>`${x()}/v1/medical_record/${n()}/chats`,m=()=>`${x()}/v1/chats`,i=L(()=>W.value[n()]||[]),S=L(()=>q.value[n()]||null),g=L(()=>de.value),l=L(()=>me.value),h=L(()=>H.value),d=t=>{const o=n();W.value={...W.value,[o]:t}},$=t=>{const o=n();q.value={...q.value,[o]:t}},A=async()=>{de.value=!0,H.value=null;try{const t=await $fetch(`${I()}?page=1&per_page=100`,{method:"GET",headers:K()});d(Array.isArray(t?.chats)?t.chats:[])}catch(t){H.value=t instanceof Error?t.message:"Failed to load chats"}finally{de.value=!1}},E=async()=>{H.value=null;try{const t=await $fetch(`${I()}/create`,{method:"POST",headers:K()}),o=[...W.value[n()]||[]];return o.unshift(t),d(o),t}catch(t){return H.value=t instanceof Error?t.message:"Failed to create chat",null}},P=()=>{$(null)},D=async t=>{const p=((await $fetch(`${m()}/${t}/messages?page=1&per_page=100`,{method:"GET",headers:K()})).messages||[]).map(it),y=(W.value[n()]||[]).find(T=>T.id===t);return{id:t,title:y?.title||"",created_at:y?.created_at||"",messages:p}};return{chats:i,activeChat:S,isLoadingList:g,isLoadingChat:l,lastError:h,fetchList:A,createChat:E,loadChat:async t=>{me.value=!0,H.value=null;try{$(await D(t))}catch(o){H.value=o instanceof Error?o.message:"Failed to load chat",$(null)}finally{me.value=!1}},refreshActiveChat:async t=>{try{const o=await D(t),p=q.value[n()];(!p||p.id===o.id)&&$(o)}catch{}},clearActiveChat:P,renameChat:async(t,o)=>{H.value=null;try{const p=await $fetch(`${m()}/${t}/update`,{method:"PATCH",headers:K(),body:{title:o}}),y=n(),T=(W.value[y]||[]).map(B=>B.id===t?{...B,title:p.title}:B);d(T);const N=q.value[y];return N&&N.id===t&&$({...N,title:p.title}),!0}catch(p){return H.value=p instanceof Error?p.message:"Failed to rename chat",!1}},deleteChat:async t=>{H.value=null;try{await $fetch(`${m()}/${t}/delete`,{method:"DELETE",headers:K()});const o=n(),p=(W.value[o]||[]).filter(T=>T.id!==t);d(p);const y=q.value[o];return y&&y.id===t&&$(null),!0}catch(o){return H.value=o instanceof Error?o.message:"Failed to delete chat",!1}},rateMessage:async(t,o,p)=>{H.value=null;try{await $fetch(`${m()}/${t}/messages/${o}/rate`,{method:"POST",headers:K(),body:{rating:p}});const y=q.value[n()];if(y&&y.id===t){const T=y.messages.map(N=>N.id===o?{...N,user_rating:p}:N);$({...y,messages:T})}return!0}catch(y){return H.value=y instanceof Error?y.message:"Failed to save rating",!1}},_appendMessage:t=>{const o=q.value[n()];o&&$({...o,messages:[...o.messages,t]})},_replaceMessage:(t,o)=>{const p=q.value[n()];if(!p)return;const y=p.messages.map(T=>T.id===t?o(T):T);$({...p,messages:y})},_bumpListAfterTurn:t=>{const o=W.value[n()]||[],p=o.findIndex(N=>N.id===t);if(p===-1)return;const T=[{...o[p],last_message_at:new Date().toISOString()},...o.slice(0,p),...o.slice(p+1)];d(T)},_updateChatTitle:(t,o)=>{const p=(o||"").trim();if(!p)return;const y=n(),T=(W.value[y]||[]).map(B=>B.id===t?{...B,title:p}:B);d(T);const N=q.value[y];N&&N.id===t&&$({...N,title:p})}}}const lt=["aria-label"],ct={key:0,class:"inline-block max-w-5xl px-4 py-2 rounded-lg shadow bg-gray-150"},ut={class:"whitespace-pre-wrap text-left","data-test":"record-chat-user-text"},dt={class:"flex flex-col gap-3","data-test":"record-chat-assistant"},mt={key:0},gt={key:0,class:"mt-2 space-y-2"},ft={key:0,class:"space-y-1"},ht={key:1,class:"space-y-1"},vt=["data-test"],pt={class:"min-w-0"},yt={class:"text-gray-700 truncate"},xt={key:0,class:"text-red-600 truncate"},bt=["innerHTML"],_t=["innerHTML"],wt={key:3,class:"text-xs text-red-600"},kt={key:4,class:"mt-2"},Ct=["aria-expanded"],$t={key:0,class:"list-decimal list-inside space-y-0.5 marker:text-gray-400 marker:text-xs"},St=["data-test","onClick"],fe=1,he=-1,Tt=be({__name:"MessageBubble",props:{message:{},recordId:{},activeNumber:{}},emits:["citation-click","rate"],setup(u,{emit:n}){const x=u,I=n,m=L(()=>x.message.speaker==="user"),i=L(()=>
1{if(x.message.text)return x.message.text;const e=x.message.content?.text;return typeof e=="string"?e:""}),S=O(!1),g=O(!1),l=O(!0),h=L(()=>{if(x.message.speaker!=="agent")return!1;const e=x.message.content;return!e||e.version===Re?!1:typeof e.text=="string"}),d=L(()=>{if(!h.value)return"";const e=x.message.content?.text||"";if(!e)return"";const{parseMarkdown:a}=Ze();return a(e)}),$=[/^Loaded \d+ tools? for /i,/^reasoning with model /i],A=L(()=>x.message.thoughts.filter(e=>!$.some(a=>a.test(e.trim())))),E=L(()=>x.message.toolCalls),P=L(()=>!h.value&&(A.value.length>0||E.value.length>0||x.message.isStreaming)),D={search_medical_record_pages:{running:"Searching medical record",done:"Searched medical record"},get_medical_record_pages:{running:"Reading medical record pages",done:"Read medical record pages"},list_custom_sections:{running:"Listing custom sections",done:"Listed custom sections"},get_custom_section:{running:"Reading custom section",done:"Read custom section"},get_medical_record_summary:{running:"Reviewing medical record summary",done:"Reviewed medical record summary"},get_medical_record_chronology:{running:"Reading chronology",done:"Read chronology"},get_medical_record_vitals:{running:"Reading vitals",done:"Read vitals"},get_medical_record_medications:{running:"Reading medications",done:"Read medications"},search_reference_document:{running:"Searching reference document",done:"Searched reference document"},get_reference_page:{running:"Reading reference page",done:"Read reference page"},list_reference_documents:{running:"Listing reference documents",done:"Listed reference documents"}},U=e=>e.replace(/_/g," ").replace(/^./,a=>a.toUpperCase()),f=e=>{const a=D[e.name];return a?e.status==="running"?a.running:a.done:U(e.name)},s=O(Date.now());let v=null;const c=()=>{v!=null&&(clearInterval(v),v=null)};Ue(()=>{x.message.isStreaming?(s.value=Date.now(),v==null&&(v=et(()=>{s.value=Date.now()},1e3))):c()}),qe(c);const _=e=>{const a=Math.max(1,Math.round(e/1e3));if(a<60)return`${a} second${a===1?"":"s"}`;const r=Math.floor(a/60),R=a%60;return R===0?`${r} minute${r===1?"":"s"}`:`${r}m ${R}s`},M=L(()=>{const e=x.message.startedAt;if(!e)return x.message.isStreaming?"Thinking…":"Activity";if(x.message.isStreaming)return`Thinking for ${_(s.value-e)}`;const a=x.message.endedAt??s.value;return`Thought for ${_(a-e)}`}),j=L(()=>x.message.text||""),Y=e=>e.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),t=L(()=>He(j.value)),o=L(()=>t.value.footer),p={mr:"Medical Record",ref_doc:"Reference Document"},y=O({}),T=O(new Set),N=e=>{const a=p[e.kind]||e.kind;return e.page!=null?e.to!=null&&e.to!==e.page?`${a}, pages ${e.page}–${e.to}`:`${a}, page ${e.page}`:a},B=e=>`${p[e.kind]||e.kind} (unresolved: ${e.id})`,X=e=>{const a=ce(e),r=y.value[a];return r||(T.value.has(a)?B(e):N(e))},ne=async e=>{const a=x.recordId;if(!a||!e.length)return;const r=e.map(C=>ce(C)).filter(C=>y.value[C]==null&&!T.value.has(C));if(!r.length)return;const R=xe();try{const C=await $fetch(`${R.apiBaseURL}/v1/medical_record/${a}/chats/citations/labels`,{method:"POST",headers:K(),body:{tokens:r}}),Z=C&&C.labels&&typeof C.labels=="object"?C.labels:{};y.value={...y.value,...Z};const re=new Set(T.value);for(const te of r)Z[te]==null&&re.add(te);T.value=re}catch{}};se(o,e=>{e.length&&ne(e)},{immediate:!0});const Le=e=>{const a=o.value[e-1];return a?X(a):`Citation ${e}`},Ie=e=>{const R=`inline-flex items-center justify-center align-baseline mx-0.5 px-1.5 min-w-[1.5rem] h-5 text-[11px] font-semibold rounded-md border transition-colors ${x.activeNumber===e?"bg-judy-orange-600 text-white border-judy-orange-600 hover:bg-judy-orange-700":"bg-judy-orange-100 text-judy-orange-800 border-judy-orange-200 hover:bg-judy-orange-200"}`,C=Y(Le(e));return`<button type="button" class="${R}" title="${C}" data-citation="${e}" data-test="record-chat-citation-chip-${e}">${e}</button>`},_e=new De({breaks:!0,gfm:!0});_e.use({renderer:{link(e){const a=this.parser.parseInline(e.tokens),r=(e.href||"").trim(),R=/^https?:\/\//i.test(r),C=/^mailto:/i.test(r);if(!R&&!C)return`<span>${a}</span>`;const Z=e.title?` title="${Y(e.title)}"`:"";return`<a href="${Y(r)}" target="_blank" rel="noopener noreferrer"${Z}>${a}</a>`}}});const we=L(()=>{const e=j.value;if(!e)return"";const{markdown:a}=Fe(e,t.value.numberFor);let r=_e.parse(a,{async:!1});return r=r.replace(/\u0000CITE\u0000(\d+)\u0000/g,(R,C)=>Ie(Number(C))),Pe(r)}),Ee=e=>{const a=e.target,r=a?.closest("[data-citation]");if(r){const C=Number(r.getAttribute("data-citation"));Number.isFinite(C)&&C>0&&(e.preventDefault(),ke(C));return}const R=a?.closest("a[href]");if(R){const C=R.getAttribute("href")||"";/^https?:\/\//i.test(C)||/^mailto:/i.test(C)||e.preventDefault()}},Ne=e=>{const a=ce(e),r={};e.kind==="mr"?(r.medical_record_id=e.id,e.page!=null&&(r.page=String(e.page)),e.to!=null&&(r.to=String(e.to))):(e.kind==="ref_doc"||e.kind==="doc")&&(r.document_id=e.id,e.page!=null&&(r.page=String(e.page)),e.to!=null&&(r.to=String(e.to)));for(const[R,C]of Object.entries(e.extra))r[R]==null&&(r[R]=C);
1return{raw:a,kind:e.kind,display_label:X(e),target:r}},ke=e=>{const a=o.value[e-1];a&&I("citation-click",{number:e,citation:Ne(a),ref:a})},Oe=async()=>{const e=j.value||"";if(!e)return;const a=t.value,r=a.footer;if(!r.length){try{await navigator.clipboard.writeText(e)}catch{}return}const R=/\(\s*(ref:[^()]+?)\s*\)/g,C=e.replace(R,(te,oe)=>{const je=oe.split(";").map(le=>le.trim()).filter(Boolean),ie=[];for(const le of je){const $e=Be(le);$e&&ie.push(`[${a.numberFor($e)}]`)}return ie.length?ie.join(" "):""}),Z=r.map((te,oe)=>`${oe+1}. ${X(te)}`),re=`${C.trimEnd()}
2
3Citations:
4${Z.join(`
5`)}`;try{await navigator.clipboard.writeText(re)}catch{}},Ce=e=>{I("rate",{messageId:x.message.id,rating:e})};return(e,a)=>(b(),w("div",{class:J(["w-full py-2 px-4",m.value?"text-right":"text-left"]),role:"article","aria-label":`Message from ${m.value?"You":"AI Assistant"}`,"data-test":"record-chat-message","data-private":""},[m.value?(b(),w("div",ct,[a[6]||(a[6]=k("div",{class:"font-semibold text-sm mb-1 text-right",role:"heading","aria-level":"3"}," You ",-1)),k("div",ut,z(i.value),1)])):(b(),w("div",{key:1,class:"inline-block w-full max-w-[95%]",onMouseenter:a[4]||(a[4]=r=>S.value=!0),onMouseleave:a[5]||(a[5]=r=>S.value=!1)},[a[7]||(a[7]=k("div",{class:"font-semibold text-sm mb-1 text-gray-825",role:"heading","aria-level":"3"}," AI Assistant ",-1)),k("div",dt,[P.value?(b(),w("div",mt,[k("button",{type:"button",class:"flex items-center gap-1.5 w-full text-left text-xs text-gray-400 hover:text-gray-600 transition-colors","data-test":"record-chat-activity-toggle",onClick:a[0]||(a[0]=r=>g.value=!g.value)},[G(Q(Se),{class:J(["w-3.5 h-3.5 transition-transform",g.value?"rotate-90":""])},null,8,["class"]),k("span",null,z(M.value),1)]),g.value?(b(),w("div",gt,[A.value.length?(b(),w("div",ft,[(b(!0),w(ee,null,ae(A.value,(r,R)=>(b(),w("div",{key:`thought-${R}`,class:"text-xs text-gray-600 italic"},z(r),1))),128))])):F("",!0),E.value.length?(b(),w("ul",ht,[(b(!0),w(ee,null,ae(E.value,r=>(b(),w("li",{key:r.id,class:"text-xs flex items-start gap-2","data-test":`record-chat-tool-call-${r.name}`},[k("span",{class:J(["inline-flex w-2 h-2 mt-1.5 rounded-full shrink-0",r.status==="running"?"bg-amber-500 animate-pulse":r.status==="error"?"bg-red-500":"bg-emerald-500"])},null,2),k("div",pt,[k("div",yt,z(f(r)),1),r.error?(b(),w("div",xt,z(r.error),1)):F("",!0)])],8,vt))),128))])):F("",!0)])):F("",!0)])):F("",!0),we.value&&!h.value?(b(),w("div",{key:1,class:"text-sm text-gray-825 leading-relaxed",innerHTML:we.value,onClick:Ee},null,8,bt)):d.value?(b(),w("div",{key:2,class:"text-sm text-gray-825 leading-relaxed",innerHTML:d.value},null,8,_t)):F("",!0),u.message.error?(b(),w("div",wt,z(u.message.error),1)):F("",!0),o.value.length?(b(),w("div",kt,[k("button",{type:"button",class:"flex items-center gap-1.5 w-full text-left text-[11px] font-medium text-gray-400 uppercase tracking-wider mb-1.5 hover:text-gray-600 transition-colors","aria-expanded":l.value,"data-test":"record-chat-citations-toggle",onClick:a[1]||(a[1]=r=>l.value=!l.value)},[G(Q(Se),{class:J(["w-3.5 h-3.5 transition-transform",l.value?"rotate-90":""])},null,8,["class"]),k("span",null,"Citations ("+z(o.value.length)+")",1)],8,Ct),l.value?(b(),w("ol",$t,[(b(!0),w(ee,null,ae(o.value,(r,R)=>(b(),w("li",{key:`cit-${R}`,class:"text-xs"},[k("button",{type:"button",class:J(["inline text-left rounded px-1 py-0.5 transition-colors",u.activeNumber===R+1?"bg-judy-orange-100 text-judy-orange-900":"text-gray-500 hover:text-gray-800"]),"data-test":`record-chat-citation-row-${R+1}`,onClick:C=>ke(R+1)},z(X(r)),11,St)]))),128))])):F("",!0)])):F("",!0),u.message.isStreaming?F("",!0):(b(),w("div",{key:5,class:J(["flex justify-start gap-2 mt-1 text-sm transition-opacity duration-200",{"opacity-100":S.value,"opacity-0":!S.value}]),role:"toolbar","aria-label":"Message actions","data-test":"record-chat-actions"},[k("button",{type:"button",class:"hover:text-judy-orange-600","aria-label":"Copy message",onClick:Oe},[G(Q(tt),{class:"w-4 h-4","aria-hidden":"true"})]),u.message.user_rating==null||u.message.user_rating===fe?(b(),w("button",{key:0,t
5ype:"button",class:J(["hover:text-judy-orange-600",{"text-judy-orange-600":u.message.user_rating===fe}]),"aria-label":"Mark as helpful","data-test":"record-chat-thumbs-up",onClick:a[2]||(a[2]=r=>Ce(fe))},[G(Q(at),{class:"w-4 h-4","aria-hidden":"true"})],2)):F("",!0),u.message.user_rating==null||u.message.user_rating===he?(b(),w("button",{key:1,type:"button",class:J(["hover:text-judy-orange-600",{"text-judy-orange-600":u.message.user_rating===he}]),"aria-label":"Mark as not helpful","data-test":"record-chat-thumbs-down",onClick:a[3]||(a[3]=r=>Ce(he))},[G(Q(st),{class:"w-4 h-4","aria-hidden":"true"})],2)):F("",!0)],2))])],32))],10,lt))}}),At=ze(Tt,[["__scopeId","data-v-d5c037fc"]]),Rt={class:"relative flex h-full min-h-0 w-full","data-test":"record-chat-container"},Mt={class:"flex h-full min-h-0 flex-1 flex-col"},Lt={key:0,class:"flex-1 flex items-center justify-center w-full","data-test":"record-chat-loading"},It={key:0,class:"flex-none flex items-center justify-between border-b border-gray-200 bg-white/70 px-4 py-2"},Et={class:"truncate text-sm font-semibold text-gray-800","data-private":""},Nt={class:"max-w-5xl mx-auto px-2 py-6 space-y-4"},Ot={class:"flex-none border-t border-gray-200 bg-white/70 px-4 py-3"},jt={class:"max-w-5xl mx-auto"},Dt={key:2,class:"flex-1 min-h-0 overflow-y-auto flex justify-center w-full px-4 pt-16 pb-16"},Pt={class:"w-full max-w-2xl text-center","data-test":"record-chat-empty-state"},Bt={class:"mt-8 flex flex-col gap-2 text-left"},Ht=["onClick"],Ft=be({__name:"Container",props:{recordId:{},messages:{},isRunning:{type:Boolean},isLoading:{type:Boolean},activeMessageId:{},activeCitationNumber:{},chatTitle:{}},emits:["submit","cancel","citation-click","rate"],setup(u,{expose:n,emit:x}){const I=["What is the patient's treatment?","Give me a list of the patient's medications.","Give me a summary of the patient's medical history."],m=u,i=x,S=O(""),g=O(null),l=O(null),h=L(()=>m.messages.length>0),d=L(()=>!m.isLoading&&!h.value),$=()=>{const f=S.value.trim();!f||m.isRunning||(i("submit",f),S.value="",V(D))},A=f=>{m.isRunning||(i("submit",f),V(D))},E=(f,s)=>{i("citation-click",{message:f,...s})},P=f=>{i("rate",f)},D=()=>{const f=g.value;f&&(f.scrollTop=f.scrollHeight)},U=()=>{V(()=>l.value?.focus())};return se(()=>m.messages.map(f=>(f.text||"").length+f.thoughts.length+f.toolCalls.length).join(","),()=>{m.isRunning&&V(D)}),se(d,(f,s)=>{f&&!s&&U()}),Ae(()=>{d.value?U():V(D)}),n({focusEmptyStateInput:U}),(f,s)=>(b(),w("div",Rt,[k("div",Mt,[u.isLoading?(b(),w("div",Lt,[...s[4]||(s[4]=[k("div",{class:"flex items-center gap-2 text-sm text-gray-500"},[k("div",{class:"animate-spin h-4 w-4 border-2 border-gray-400 border-t-transparent rounded-full"}),ue(" Loading conversation… ")],-1)])])):h.value?(b(),w(ee,{key:1},[u.chatTitle?(b(),w("div",It,[k("h2",Et,z(u.chatTitle),1)])):F("",!0),k("div",{ref_key:"scrollContainer",ref:g,class:"flex-1 min-h-0 overflow-y-auto"},[k("div",Nt,[(b(!0),w(ee,null,ae(u.messages,v=>(b(),Ve(At,{key:v.id,message:v,"record-id":u.recordId,"active-number":u.activeMessageId===v.id?u.activeCitationNumber:null,onCitationClick:c=>E(v,c),onRate:P},null,8,["message","record-id","active-number","onCitationClick"]))),128))])],512),k("div",Ot,[k("div",jt,[G(Te,{prompt:S.value,"onUpdate:prompt":s[0]||(s[0]=v=>S.value=v),"is-running":u.isRunning,onSubmit:$,onCancel:s[1]||(s[1]=v=>f.$emit("cancel"))},null,8,["prompt","is-running"])])])],64)):(b(),w("div",Dt,[k("div",Pt,[G(Q(nt),{class:"w-16 h-16 mb-4 text-judy-orange-400 mx-auto"}),s[5]||(s[5]=k("h3",{class:"text-lg font-medium mb-2 text-gray-900"},[ue(" Chat with Chart"),k("em",null,"Insight"),ue("™ about this medical record ")],-1)),s[6]||(s[6]=k("p",{class:"text-sm text-gray-600 mb-4"}," Ask questions, request summaries, or get plain-language explanations ",-1)),G(Te,{ref_key:"emptyStateInputRef",ref:l,prompt:S.value,"onUpdate:prompt":s[2]||(s[2]=v=>S.value=v),"is-running":u.isRunning,onSubmit:$,onCancel:s[3]||(s[3]=v=>f.$emit("cancel"))},null,8,["prompt","is-running"]),s[7]||(s[7]=k("p",{class:"text-xs text-gray-500 mt-3"}," HIPAA compliant & securely encrypted ",-1)),k("div",Bt,[(b(),w(ee,null,ae(I,v=>k("button",{key:v,type:"button",class:"rounded-lg bg-gray-100 px-3 py-2 text-xs text-gray-600 transition-colors hover:bg-gray-50 hover:text-judy-orange-500","data-test":"record-chat-suggestion",onClick:c=>A(v)},' "'+z(v)+'" ',9,Ht)),64))])])]))])]))}}),ve=[3e3,5e3,5e3,8e3,1e4],Ut=15e3,qt=600*1e3,pe=u=>`${u}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;function zt(u,n){const x=()=>ye(u),I=()=>ye(n),m=Me(u),i=O(!1),S=O(null),g=L(()=>!i.value);let l=null,h=null;const d=()=>{h&&(clearTimeout(h),h=null)},$=()=>{l&&(l.abort(),l=null),d(),i.value=!1},A=async f=>{const s=(f||"").trim();if(!s||i.value)return;S.value=null;const v={id:pe("user"),speaker:"user",user_rating:null,created_at:new Date().toISOString(),content:{version:"record_chat:v1",text:s},text:s,thoughts:[],toolCalls:[],citations:[],isStreaming:!1,isLegacy:!1}
5,c={id:pe("agent"),speaker:"agent",user_rating:null,created_at:new Date().toISOString(),content:null,thoughts:[],toolCalls:[],citations:[],isStreaming:!0,startedAt:Date.now(),isLegacy:!1};m._appendMessage(v),m._appendMessage(c),m._bumpListAfterTurn(I()),await E(c.id,{user_prompt:s})},E=async(f,s)=>{i.value=!0,l=new AbortController;const v=xe();try{const c=await fetch(`${v.apiBaseURL}/v1/medical_record/${x()}/chats/${I()}/run`,{method:"POST",headers:{...K(),Accept:"text/event-stream"},body:JSON.stringify(s),signal:l.signal});if(!c.ok||!c.body){const _=await c.text().catch(()=>"");throw new Error(`Request failed (${c.status}): ${_||c.statusText}`)}await Vt(c.body,(_,M)=>{P(_,M,f)})}catch(c){const _=c instanceof Error?c.message:"Unknown error",M=c instanceof DOMException&&c.name==="AbortError";m._replaceMessage(f,j=>({...j,isStreaming:!1,error:M?"Cancelled.":_,endedAt:j.endedAt??Date.now()})),d(),M||(S.value=_)}finally{l=null,i.value=!1,m._replaceMessage(f,c=>({...c,isStreaming:!1,endedAt:c.endedAt??Date.now()}))}},P=(f,s,v)=>{switch(f){case"start":break;case"message_created":{const c=typeof s.chat_title=="string"?s.chat_title:"";m._updateChatTitle(I(),c);break}case"thought":{const c=typeof s.text=="string"?s.text:"";if(!c)break;m._replaceMessage(v,_=>({..._,thoughts:[..._.thoughts,c]}));break}case"tool_call":{const c={id:pe("tool"),name:String(s.name||"tool"),args:s.args||void 0,status:"running"};m._replaceMessage(v,_=>({..._,toolCalls:[..._.toolCalls,c]}));break}case"tool_result":{const c=String(s.name||"");m._replaceMessage(v,_=>{const M=[..._.toolCalls];for(let j=M.length-1;j>=0;j--)if(M[j].name===c&&M[j].status==="running"){M[j]={...M[j],status:s.error?"error":"done",summary:typeof s.summary=="string"?s.summary:M[j].summary,error:typeof s.error=="string"?s.error:M[j].error};break}return{..._,toolCalls:M}});break}case"token":{const c=typeof s.text=="string"?s.text:"";if(!c)break;m._replaceMessage(v,_=>({..._,text:(_.text||"")+c}));break}case"done":{const c=s.answer,_=typeof s.error=="string"?s.error:void 0;m._replaceMessage(v,M=>({...M,text:c&&typeof c.body_markdown=="string"?c.body_markdown:M.text||"",error:_||M.error,isStreaming:!1,endedAt:Date.now()}));break}}},D=f=>{d();let s=0;const v=Date.now(),c=async()=>{if(h=null,Date.now()-v>qt){i.value=!1;return}await m.refreshActiveChat(I());const _=m.activeChat.value?.messages.find(Y=>Y.id===f);if(!_){i.value=!1;return}if(!_.isStreaming||!!(_.text||"").trim()){i.value=!1;return}const j=s<ve.length?ve[s]:Ut;s+=1,h=setTimeout(c,j)};h=setTimeout(c,ve[0])};return{isRunning:i,canSend:g,lastError:S,ask:A,cancel:$,resumeFromHydratedPending:()=>{if(i.value)return;const f=m.activeChat.value;if(!f)return;const s=f.messages[f.messages.length-1];!s||s.speaker!=="agent"||s.isStreaming&&(i.value=!0,D(s.id))}}}async function Vt(u,n){const x=u.getReader(),I=new TextDecoder("utf-8");let m="";const i=S=>{if(!S.trim())return;let g="message";const l=[];for(const $ of S.split(`
6`)){const A=$.replace(/\r$/,"");!A||A.startsWith(":")||(A.startsWith("event:")?g=A.slice(6).trim():A.startsWith("data:")&&l.push(A.slice(5).trimStart()))}if(!l.length)return;const h=l.join(`
7`);let d={};try{d=JSON.parse(h)}catch{d={raw:h}}n(g,d||{})};for(;;){const{value:S,done:g}=await x.read();if(g)break;m+=I.decode(S,{stream:!0});let l;for(;(l=m.indexOf(`
8
9`))!==-1;){const h=m.slice(0,l);m=m.slice(l+2),i(h)}}m.trim()&&i(m)}const Wt={class:"flex h-full min-h-0 flex-col"},Gt={id:"file-container",class:"flex-1 min-h-0 overflow-hidden w-full overscroll-contain"},ca=be({__name:"chat",setup(u){const n=We(),x=Ge(),I=rt(),m=Ye(),i=Je(),S=Xe("medicalRecordId"),g=L(()=>S.value),l=Me(g),h=O(null),d=zt(g,()=>h.value||""),$=O(null),A=O(null),E=()=>{$.value=null,A.value=null},P=O(null),D=L(()=>l.activeChat.value?.messages||[]),U=L(()=>l.activeChat.value?.title??null),{getFileChats:f}=ot(),s=async()=>{try{const t=await f(g.value);I.chats=t.chats}catch(t){console.error(t)}},v=O(!!n.query.chatId);n.query.chatId||(l.clearActiveChat(),E());const c=async()=>{if(h.value)return h.value;const t=await l.createChat();return t?(h.value=t.id,await l.loadChat(t.id),await s(),await x.replace({path:`/records/${g.value}/chat`,query:{chatId:t.id}}),t.id):null},_=async t=>{await c()&&(await d.ask(t),s())},M=t=>{const{message:o,number:p,citation:y}=t;if(!y)return;const T=y.target||{},N=Number(T.page);if(!Number.isFinite(N)||N<=0)return;const B=T.to!=null?Number(T.to):NaN,X=Number.isFinite(B)&&B>=N?B:void 0;if($.value=o.id,A.value=p,!(typeof window>"u")){if(y.kind==="ref_doc"){const ne=T.document_id;if(!ne)return;I.setContextOpen(!0),V(()=>V(()=>{window.navigateToReferenceDoc?.(ne,N,X)}));return}I.setContextOpen(!0),window.navigateToPage?.(N,X)}},j=async t=>{h.value&&await l.rateMessage(h.value,t.messageId,t.rating)},Y=async()=>{E(),await Promise.allSettled([l.fetchList(),s()]);const t=n.query.chatId||null;if(t){h.value=t,v.value=!0,l.clearActiveChat();try{await l.loadChat(t)}finally{v.value=!1}V(()=>d.resumeFromHydratedPending())}else E(),l.clearActiveChat(),h.value=null};return Ae(async()=>{await m.fetchOrganizations(),Y()}),se(()=>n.query.chatId,async(t,o)=>{if(t===o)return;const p=t||null;if(p){const y=l.activeChat.value?.id!==p;if(y&&(E(),d.cancel()),h.value=p,y){v.value=!0,l.clearActiveChat();try{await l.loadChat(p)}finally{v.value=!1}}V(()=>d.resumeFromHydratedPending())}else E(),l.clearActiveChat(),h.value=null,V(()=>P.value?.focusEmptyStateInput?.())}),se(g,async()=>{E(),d.cancel(),l.clearActiveChat(),h.value=null,await Promise.allSettled([l.fetchList(),s()])}),Ke(()=>{E(),d.cancel()}),Qe({title:`Medical Record - ${i.record?.name??"Chat with ChartInsight™"}`,meta:[{name:"description",content:"Upload, manage, and analyze your medical records with AI-powered insights. Secure storage and instant access to your healthcare documents."},{property:"og:title",content:"Medical Records Management | ChartInsight™"},{property:"og:description",content:"Upload, manage, and analyze your medical records with AI-powered insights. Secure storage and instant access to your healthcare documents."}]}),(t,o)=>(b(),w("div",Wt,[k("div",Gt,[G(Ft,{ref_key:"containerRef",ref:P,"record-id":g.value,messages:D.value,"is-running":Q(d).isRunning.value,"is-loading":v.value,"active-message-id":$.value,"active-citation-number":A.value,"chat-title":U.value,onSubmit:_,onCancel:o[0]||(o[0]=p=>Q(d).cancel()),onCitationClick:M,onRate:j},null,8,["record-id","messages","is-running","is-loading","active-message-id","active-citation-number","chat-title"])])]))}});
9export{ca as default};

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