yaml-flow 8.0.5 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- (function(){'use strict';var lt=(function(){let Ye=false;function et(){if(Ye)return;Ye=true;let T=document.createElement("style");T.textContent=`
1
+ (function(){'use strict';var kt=(function(){let Ze=false;function ut(){if(Ze)return;Ze=true;let c=document.createElement("style");c.textContent=`
2
2
  .lc-card { position:relative; }
3
3
  .lc-status-dot { display:inline-block; width:8px; height:8px; border-radius:50%; flex-shrink:0; }
4
4
  .lc-metric-value { font-size:2rem; font-weight:700; line-height:1.2; }
@@ -77,21 +77,23 @@
77
77
  .lc-chat-body { max-height:200px; }
78
78
  .lc-chat-bubble { max-width:95%; }
79
79
  }
80
- `,document.head.appendChild(T);}let tt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function L(T){return T?String(T).replace(/[&<>"']/g,k=>tt[k]):""}function Be(T){return !T||typeof T!="string"?[]:T.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean)}function nt(T,k){if(!k||!T)return;let I=Be(k),Y=T;for(let J=0;J<I.length;J++){if(Y==null)return;Y=Y[I[J]];}return Y}function Xe(T,k,I){let Y=Be(k);if(!Y.length)return;let J=T;for(let R=0;R<Y.length-1;R++)(J[Y[R]]==null||typeof J[Y[R]]!="object")&&(J[Y[R]]={}),J=J[Y[R]];J[Y[Y.length-1]]=I;}function Ke(T){return `<span class="lc-status-dot" style="background:${{fresh:"var(--bs-success)",stale:"var(--bs-warning)",error:"var(--bs-danger)",loading:"var(--bs-info)"}[T]||"var(--bs-secondary)"}" title="${L(T||"unknown")}"></span>`}function Je(T){if(!T)return "";let k=Math.floor((Date.now()-new Date(T).getTime())/1e3);return isNaN(k)||k<0?"":k<60?k+"s ago":k<3600?Math.floor(k/60)+"m ago":k<86400?Math.floor(k/3600)+"h ago":Math.floor(k/86400)+"d ago"}function at(T){let k=String(T).match(/^(<=?|>=?|===?)\s*(.+)$/);return k?{op:k[1],value:parseFloat(k[2])}:null}function Ue(T,k){let I=at(k);if(!I||isNaN(I.value))return false;switch(I.op){case "<":return T<I.value;case "<=":return T<=I.value;case ">":return T>I.value;case ">=":return T>=I.value;case "=":case "==":case "===":return T===I.value}return false}function st(T){if(!T.length)return "bar";let k=T[0];return k.label!==void 0&&k.value!==void 0&&!k.x&&!k.date?"pie":k.x!==void 0||k.date!==void 0?"line":"bar"}let Me=["#0d6efd","#198754","#ffc107","#dc3545","#6f42c1","#0dcaf0","#fd7e14","#20c997","#d63384","#6c757d"];function rt(T){et();let k={resolve:T.resolve,onPatch:T.onPatch||function(){},onPatchState:T.onPatchState||function(){},onRefresh:T.onRefresh||null,onChat:T.onChat||null,markdown:T.markdown||null,sanitize:T.sanitize||null,chartLib:T.chartLib||null,onAction:T.onAction||function(){},getChatMessages:T.getChatMessages||null,fileUrlBase:T.fileUrlBase||"/api/boards/default"},I={},Y={},J={},R={},D={},V={};function ie(e){getComputedStyle(e).position==="static"&&(e.style.position="relative");let t=document.createElement("div");t.className="lc-saving-overlay",t.setAttribute("aria-live","polite"),t.style.cssText=["position:absolute","inset:0","background:rgba(255,255,255,0.78)","display:flex","align-items:center","justify-content:center","gap:0.5rem","z-index:20","border-radius:inherit","pointer-events:all"].join(";"),t.innerHTML='<span class="spinner-border spinner-border-sm text-primary" role="status" aria-hidden="true"></span><span class="text-primary fw-medium small">Saving\u2026</span>',e.appendChild(t);}let P={},F={},c={backdrop:null,title:null,body:null,input:null,fileInput:null,staged:null,sendBtn:null,attachBtn:null,closeBtn:null,currentNodeId:null,stagedFiles:[],loading:false},x={backdrop:null,title:null,body:null,staged:null,fileInput:null,dropzone:null,uploadBtn:null,attachBtn:null,closeBtn:null,currentNodeId:null,stagedFiles:[],pollingTimer:null,loading:false};function Z(e){if(!e)return "";let t=k.markdown?k.markdown(e):L(e);return k.sanitize?k.sanitize(t):t}function X(e){return I[e]||(I[e]={ac:new AbortController,timers:[],charts:[],unsubs:[]}),I[e]}function de(){if(c.backdrop)return;let e=document.createElement("div");e.className="lc-chat-modal-backdrop",e.innerHTML='<div class="modal-dialog modal-lg modal-dialog-centered" role="dialog" aria-modal="true" aria-label="Card chat"> <div class="modal-content bg-white"> <div class="modal-header border-bottom p-3 d-flex align-items-center justify-content-between"> <h5 class="modal-title lc-chat-modal-title">Chat</h5> <button type="button" class="btn btn-sm btn-outline-secondary" data-lc-chat-close aria-label="Close"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></button> </div> <div class="modal-body bg-light" data-lc-chat-body></div> <div class="modal-footer flex-column align-items-stretch border-top p-3 gap-3"> <div data-lc-chat-staged class="small w-100"></div> <input type="file" class="d-none" data-lc-chat-file multiple> <div class="lc-chat-modal-input-row mt-2"> <button type="button" class="btn btn-sm btn-outline-secondary" data-lc-chat-attach title="Attach files" aria-label="Attach files"> <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48"/></svg> </button> <textarea class="form-control" data-lc-chat-input rows="1" placeholder="Type a message..."></textarea> <button type="button" class="btn btn-sm btn-primary" data-lc-chat-send aria-label="Send"> <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="22" y1="2" x2="11" y2="13"/><polygon points="22 2 15 22 11 13 2 9 22 2"/></svg> </button> </div> </div> </div></div>',document.body.appendChild(e),c.backdrop=e,c.title=e.querySelector(".lc-chat-modal-title"),c.body=e.querySelector("[data-lc-chat-body]"),c.input=e.querySelector("[data-lc-chat-input]"),c.fileInput=e.querySelector("[data-lc-chat-file]"),c.staged=e.querySelector("[data-lc-chat-staged]"),c.sendBtn=e.querySelector("[data-lc-chat-send]"),c.attachBtn=e.querySelector("[data-lc-chat-attach]"),c.closeBtn=e.querySelector("[data-lc-chat-close]");function t(){c.input&&(c.input.style.height="auto",c.input.style.height=Math.min(c.input.scrollHeight,120)+"px");}let a=function(){c.currentNodeId=null,c.stagedFiles=[],c.staged.innerHTML="",c.input.value="",t(),c.backdrop.classList.remove("lc-open");};function r(){if(!c.stagedFiles.length){c.staged.innerHTML="";return}c.staged.innerHTML=c.stagedFiles.map(function(n,l){return '<span class="badge text-bg-light border me-1 mb-1">'+L(n.name||"file")+' <button type="button" class="btn btn-sm btn-link text-danger p-0 ms-1" data-lc-rm-file="'+l+'">&times;</button></span>'}).join(""),c.staged.querySelectorAll("[data-lc-rm-file]").forEach(function(n){n.addEventListener("click",function(){let l=parseInt(n.getAttribute("data-lc-rm-file")||"-1",10);l>=0&&c.stagedFiles.splice(l,1),r();});});}async function p(){if(c.loading||!c.currentNodeId)return;let n=c.currentNodeId,l=(c.input.value||"").trim(),s=c.stagedFiles.slice();if(!(!l&&!s.length)){c.loading=true,c.sendBtn.disabled=true,c.attachBtn.disabled=true,B(l),c.input.value="",c.stagedFiles=[],t(),r();try{await Promise.resolve(k.onAction(n,"chat-send",{text:l,files:s}));}catch(d){U(),ae("system","Failed to send message: "+String(d&&d.message||d),[]);}finally{c.loading=false,c.sendBtn.disabled=false,c.attachBtn.disabled=false;}}}c.closeBtn.addEventListener("click",a),e.addEventListener("click",function(n){n.target===e&&a();}),c.attachBtn.addEventListener("click",function(){c.fileInput.click();}),c.fileInput.addEventListener("change",function(n){let l=n.target&&n.target.files?Array.from(n.target.files):[];for(let s of l)c.stagedFiles.find(function(d){return d.name===s.name&&d.size===s.size&&d.lastModified===s.lastModified})||c.stagedFiles.push(s);n.target.value="",r();}),c.sendBtn.addEventListener("click",p),c.input.addEventListener("input",t),c.input.addEventListener("keydown",function(n){n.key==="Enter"&&!n.shiftKey&&(n.preventDefault(),p());}),t(),document.addEventListener("keydown",function(n){n.key==="Escape"&&c.backdrop&&c.backdrop.classList.contains("lc-open")&&a();});}function Te(e){return (Array.isArray(e)?e:[]).map(function(a){if(!a||typeof a!="object")return null;let r=typeof a.role=="string"?a.role:"system",p=typeof a.text=="string"?a.text:typeof a.message=="string"?a.message:"",n=Array.isArray(a.files)?a.files:[];return {role:r.toLowerCase(),text:p,files:n}}).filter(Boolean)}function ae(e,t,a){if(de(),!c.body||!t&&!a)return;let r=e==="user"||e==="assistant"?e:"system",p=r==="user"?"lc-chat-bubble-user":r==="assistant"?"lc-chat-bubble-assistant":"lc-chat-bubble-system",n=document.createElement("div");if(n.className="lc-chat-bubble "+p,r!=="system"){let s='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8" r="4"/><path d="M4 20c0-4 3.6-7 8-7s8 3 8 7"/></svg>',d='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>',u=document.createElement("span");u.className="lc-chat-icon",u.setAttribute("aria-hidden","true"),u.innerHTML=r==="user"?s:d,n.appendChild(u);}let l=document.createElement("div");if(l.className="lc-chat-bubble-content",r==="assistant"?l.innerHTML=Z(t||""):l.textContent=t||"",Array.isArray(a)&&a.length){let s=document.createElement("div");s.className="small mt-1 text-muted",s.textContent="\u{1F4CE} "+a.map(function(d){return d?typeof d=="string"?d:d.name||"file":"file"}).join(", "),l.appendChild(s);}n.appendChild(l),c.body.appendChild(n),c.body.scrollTop=c.body.scrollHeight;}function B(e){if(de(),!c.body)return;let t=document.createElement("div");t.className="lc-chat-bubble lc-chat-bubble-user lc-chat-bubble-pending",t.setAttribute("data-lc-chat-pending","1"),t.textContent=e||"";let a=document.createElement("span");a.className="spinner-border spinner-border-sm",a.setAttribute("role","status"),a.setAttribute("aria-label","Sending"),t.appendChild(a),c.body.appendChild(t),c.body.scrollTop=c.body.scrollHeight;}function U(){c.body&&c.body.querySelectorAll('[data-lc-chat-pending="1"]').forEach(function(e){e&&e.parentNode&&e.parentNode.removeChild(e);});}async function G(e){if(c.currentNodeId!==e)return;let t=k.resolve(e),a=[];if(typeof k.getChatMessages=="function")try{a=await Promise.resolve(k.getChatMessages(e));}catch{a=[];}else t&&t.card_data&&Array.isArray(t.card_data.messages)&&(a=t.card_data.messages);let r=Te(a);if(c.body.innerHTML="",!r.length){c.body.innerHTML='<div class="text-muted small">No messages yet.</div>',le(e);return}r.forEach(function(p){ae(p.role,p.text,p.files);}),le(e);}function le(e){if(!c.body)return;let t=e?k.resolve(e):null,a=!!(t&&t.card_data&&t.card_data.__chat_signal&&t.card_data.__chat_signal.processing),r=c.body.querySelector(".lc-chat-processing");a?(r||(r=document.createElement("div"),r.className="lc-chat-processing",r.innerHTML='<span class="spinner-border spinner-border-sm" role="status" aria-label="AI working"></span><span>\u2728 AI working\u2026</span>',c.body.appendChild(r)),c.body.scrollTop=c.body.scrollHeight):r&&r.remove();}async function pe(e){de();let t=k.resolve(e);if(!t)return;let a=t.card&&t.card.meta&&t.card.meta.title||t.id;c.currentNodeId=e,c.title.textContent="Chat: "+a,c.body.innerHTML='<div class="text-muted small">Loading...</div>',c.backdrop.classList.add("lc-open");let r=!!(t.card_data&&t.card_data.features&&t.card_data.features.chat&&t.card_data.features.chat.disabled);c.input.disabled=r,c.attachBtn.disabled=r,c.sendBtn.disabled=r,c.input.placeholder=r?"Chat is disabled for this card.":"Type a message...",r||c.input.focus(),await G(e);}function Ne(){if(x.backdrop)return;let e=document.createElement("div");e.className="lc-files-modal-backdrop",e.innerHTML='<div class="modal-dialog modal-lg modal-dialog-centered" role="dialog" aria-modal="true" aria-label="Card files"> <div class="modal-content bg-white"> <div class="modal-header border-bottom p-3 d-flex align-items-center justify-content-between"> <h5 class="modal-title lc-files-modal-title">Files</h5> <button type="button" class="btn btn-sm btn-outline-secondary" data-lc-files-close aria-label="Close"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></button> </div> <div class="modal-body bg-light" data-lc-files-body></div> <div class="modal-footer flex-column align-items-stretch border-top p-3 gap-3"> <div class="lc-dropzone border-2 border-dashed p-4 text-center cursor-pointer rounded" data-lc-files-dz> <div class="small text-muted mb-2">Drop files here or click to browse</div> <input type="file" class="d-none" data-lc-files-input multiple> </div> <div data-lc-files-staged class="small w-100 d-flex flex-wrap gap-2"></div> <div class="d-flex justify-content-end gap-2 w-100"> <button type="button" class="btn btn-sm btn-outline-secondary" data-lc-files-attach>Select files</button> <button type="button" class="btn btn-sm btn-primary" data-lc-files-upload>Upload</button> </div> </div> </div></div>',document.body.appendChild(e),x.backdrop=e,x.title=e.querySelector(".lc-files-modal-title"),x.body=e.querySelector("[data-lc-files-body]"),x.staged=e.querySelector("[data-lc-files-staged]"),x.fileInput=e.querySelector("[data-lc-files-input]"),x.dropzone=e.querySelector("[data-lc-files-dz]"),x.uploadBtn=e.querySelector("[data-lc-files-upload]"),x.attachBtn=e.querySelector("[data-lc-files-attach]"),x.closeBtn=e.querySelector("[data-lc-files-close]");let t=function(){x.currentNodeId=null,x.stagedFiles=[],x.staged.innerHTML="",x.backdrop.classList.remove("lc-open"),x.pollingTimer&&(clearInterval(x.pollingTimer),x.pollingTimer=null);};function a(){if(!x.stagedFiles.length){x.staged.innerHTML="";return}x.staged.innerHTML=x.stagedFiles.map(function(n,l){return '<span class="badge text-bg-light border me-1 mb-1">'+L(n.name||"file")+' <button type="button" class="btn btn-sm btn-link text-danger p-0 ms-1" data-lc-files-rm="'+l+'">&times;</button></span>'}).join(""),x.staged.querySelectorAll("[data-lc-files-rm]").forEach(function(n){n.addEventListener("click",function(){let l=parseInt(n.getAttribute("data-lc-files-rm")||"-1",10);l>=0&&x.stagedFiles.splice(l,1),a();});});}function r(n){let l=Array.from(n||[]);for(let s of l)x.stagedFiles.find(function(d){return d.name===s.name&&d.size===s.size&&d.lastModified===s.lastModified})||x.stagedFiles.push(s);a();}async function p(){if(x.loading||!x.currentNodeId||!x.stagedFiles.length)return;let n=x.currentNodeId,l=x.stagedFiles.slice();x.loading=true,x.uploadBtn.disabled=true,x.attachBtn.disabled=true,x.dropzone.classList.add("lc-disabled");try{await Promise.resolve(k.onAction(n,"file-upload",{files:l})),x.stagedFiles=[],a(),oe(n);}catch(s){x.staged.innerHTML='<span class="text-danger">Upload failed: '+L(String(s&&s.message||s))+"</span>";}finally{x.loading=false,x.uploadBtn.disabled=false,x.attachBtn.disabled=false,x.dropzone.classList.remove("lc-disabled");}}x.closeBtn.addEventListener("click",t),e.addEventListener("click",function(n){n.target===e&&t();}),x.attachBtn.addEventListener("click",function(){x.fileInput.click();}),x.fileInput.addEventListener("change",function(n){r(n.target&&n.target.files?n.target.files:[]),n.target.value="";}),x.uploadBtn.addEventListener("click",p),x.dropzone.addEventListener("click",function(){x.loading||x.fileInput.click();}),x.dropzone.addEventListener("dragover",function(n){n.preventDefault(),x.dropzone.classList.add("lc-drag-over");}),x.dropzone.addEventListener("dragleave",function(){x.dropzone.classList.remove("lc-drag-over");}),x.dropzone.addEventListener("drop",function(n){n.preventDefault(),x.dropzone.classList.remove("lc-drag-over"),r(n.dataTransfer&&n.dataTransfer.files?n.dataTransfer.files:[]);}),document.addEventListener("keydown",function(n){n.key==="Escape"&&x.backdrop&&x.backdrop.classList.contains("lc-open")&&t();});}function te(e){let t=k.resolve(e);return (t&&t.card_data&&Array.isArray(t.card_data.files)?t.card_data.files:[]).filter(Boolean)}function oe(e){if(x.currentNodeId!==e)return;let t=te(e);if(!t.length){x.body.innerHTML='<div class="alert alert-light border small mb-0">No files uploaded yet.</div>';return}let a='<div class="list-group list-group-flush">';t.forEach(function(r,p){let n=r&&(r.name||r.stored_name)?r.name||r.stored_name:"file",l=r&&typeof r.size=="number"?"size: "+r.size+" bytes":"",s=r&&r.stored_name?String(r.stored_name):"",d=s?k.fileUrlBase+"/cards/"+encodeURIComponent(e)+"/files/"+p+"?sn="+encodeURIComponent(s):null;a+='<div class="list-group-item d-flex align-items-center justify-content-between gap-2">',a+='<div class="text-truncate"><div class="small fw-medium">'+L(n)+"</div>",a+='<div class="small text-muted">'+L(l)+"</div></div>",d&&(a+='<a class="btn btn-sm btn-outline-secondary flex-shrink-0" href="'+d+'">Download</a>'),a+="</div>";}),a+="</div>",x.body.innerHTML=a;}function xe(e){Ne();let t=k.resolve(e);if(!t)return;let a=t.card&&t.card.meta&&t.card.meta.title||t.id;x.currentNodeId=e,x.title.textContent="Files: "+a,x.backdrop.classList.add("lc-open");let r=!!(t.card_data&&t.card_data.features&&t.card_data.features.files&&t.card_data.features.files.disabled);x.dropzone.classList.toggle("lc-disabled",r),x.attachBtn.disabled=r,x.uploadBtn.disabled=r,x.fileInput.disabled=r,oe(e),x.pollingTimer&&clearInterval(x.pollingTimer),x.pollingTimer=setInterval(function(){oe(e);},1e3);}function ce(e,t){if(!t||typeof t!="string")return;let a=Be(t);if(!a.length)return;let r=a[0],p=a.slice(1).join("."),n={card:e&&e.card?e.card:{},card_data:e&&e.card_data?e.card_data:{},requires:e&&e.requires?e.requires:{},computed_values:e&&e.computed_values?e.computed_values:{},runtime_state:e&&e.runtime_state?e.runtime_state:{}};if(Object.prototype.hasOwnProperty.call(n,r))return p?nt(n[r],p):n[r]}function me(e,t){let a=Y[e];a&&a.forEach(r=>{try{r(e,t);}catch(p){console.error("LiveCard notify error",p);}});}function Ae(e,t){return Y[e]||(Y[e]=new Set),Y[e].add(t),()=>Y[e].delete(t)}function we(e){let t=e&&e.card&&Array.isArray(e.card.requires)?e.card.requires:[];if(!t.length)return;let a=X(e.id),r={};Object.keys(Y).concat(Object.keys(F)).forEach(function(s){let d=k.resolve(s);if(!(!d||!d.card)){var u=Array.isArray(d.card.provides)&&d.card.provides.length?d.card.provides.map(function(v){return typeof v=="string"?v:v.bindTo||v}):[d.id];u.forEach(function(v){r[v]=d.id;});}});let n={},l=[];t.forEach(function(s){var d=r[s]||s;n[d]||(n[d]=true,l.push(d));}),a.unsubs=l.map(s=>Ae(s,()=>{let d=F[e.id];if(!d||!d.resultEl)return;let u=k.resolve(e.id);u&&(Se(u,d.resultEl),me(e.id));}));}function Ee(e,t,a,r){let p=a.data||{};if(!Array.isArray(e)||!e.length){t.innerHTML=`<p class="text-muted small">${L(p.placeholder||"No data")}</p>`;return}let n=Math.min(e.length,p.maxRows||200),l=new Set;for(let w=0;w<Math.min(e.length,n);w++)Object.keys(e[w]).forEach(S=>l.add(S));let s=p.columns&&p.columns.length?p.columns:[...l],d=p.sortable!==false,u=null,v="asc",m=X(r.id);function C(){let w=e.slice(0,n);u!==null&&d&&(w=w.slice().sort((M,$)=>{let j=M[s[u]],_=$[s[u]];return j==null?1:_==null?-1:typeof j=="number"&&typeof _=="number"?v==="asc"?j-_:_-j:v==="asc"?String(j).localeCompare(String(_)):String(_).localeCompare(String(j))}));let S='<div class="table-responsive"><table class="table table-sm table-striped table-hover mb-0"><thead><tr>';s.forEach((M,$)=>{let j=u===$?v==="asc"?" \u2191":" \u2193":"";S+=`<th class="small text-nowrap"${d?' style="cursor:pointer"':""} data-col="${$}">${L(M)}${j}</th>`;}),S+="</tr></thead><tbody>",w.forEach(M=>{S+="<tr>",s.forEach($=>{let j=M[$];S+=`<td class="small">${L(j!=null?String(j):"")}</td>`;}),S+="</tr>";}),S+="</tbody></table></div>",e.length>n&&(S+=`<p class="text-muted small mt-1">Showing ${n} of ${e.length} rows</p>`),t.innerHTML=S,d&&t.querySelectorAll("th[data-col]").forEach(M=>{M.addEventListener("click",()=>{let $=parseInt(M.dataset.col);u===$?v=v==="asc"?"desc":"asc":(u=$,v="asc"),C();},{signal:m.ac.signal});});}C();}function Ce(e,t,a,r){let n=X(r.id).ac.signal,l=a.data||{},s=l.writeTo,d=s?ce(r,s)||{}:{},u=l.fields&&l.fields.properties||{},v=e&&typeof e=="object"&&!Array.isArray(e)?Object.keys(e):[];if(!v.length){t.innerHTML='<p class="text-muted small">No filter options</p>';return}let m='<div class="row g-2">';v.forEach(C=>{let w=Array.isArray(e[C])?e[C]:[],S=u[C]&&u[C].title||C;m+=`<div class="col-12 col-sm-6 col-md-4"><label class="form-label small mb-1">${L(S)}</label>`,m+=`<select class="form-select form-select-sm" data-fk="${L(C)}"><option value="">All</option>`,w.forEach(M=>{let $=String(M)===String(d[C]||"")?" selected":"";m+=`<option value="${L(String(M))}"${$}>${L(String(M))}</option>`;}),m+="</select></div>";}),m+="</div>",t.innerHTML=m,t.querySelectorAll("select[data-fk]").forEach(C=>{C.addEventListener("change",()=>{let w={};t.querySelectorAll("select[data-fk]").forEach(S=>{S.value&&(w[S.dataset.fk]=S.value);}),s&&Xe(r,s,w),k.onPatchState(r.id,{fieldValues:w}),me(r.id,w);},{signal:n});});}function He(e,t,a){let r=a.label||"",p="\u2014",n="";e&&typeof e=="object"&&!Array.isArray(e)?(r=e.title||e.label||e.metric||r,p=e.value!=null?String(e.value):"\u2014",n=e.detail||""):e!=null&&(p=String(e));let l='<div class="text-center py-2">';r&&(l+=`<div class="text-muted small">${L(r)}</div>`),l+=`<div class="lc-metric-value">${L(p)}</div>`,n&&(l+=`<div class="small mt-1">${Z(n)}</div>`),l+="</div>",t.innerHTML=l;}function Le(e,t,a,r){let p=a.data||{};if(e==null){t.innerHTML="";return}if(typeof e=="object"&&!Array.isArray(e)){let n='<dl class="row mb-0">';Object.entries(e).forEach(([l,s])=>{n+=`<dt class="col-sm-5 small text-muted text-truncate">${L(l)}</dt>`,n+=`<dd class="col-sm-7 small mb-1">${L(s!=null?String(s):"\u2014")}</dd>`;}),t.innerHTML=n+"</dl>";return}if(Array.isArray(e)){if(!e.length){t.innerHTML=`<p class="text-muted small">${L(p.placeholder||"Empty")}</p>`;return}if(typeof e[0]=="string"||typeof e[0]=="number"){let n=p.maxRows||e.length,l='<ul class="list-unstyled mb-0">';e.slice(0,n).forEach(s=>{l+=`<li class="small mb-1">\u2022 ${L(String(s))}</li>`;}),t.innerHTML=l+"</ul>";return}Ee(e,t,a,r);return}t.innerHTML=`<div class="small">${Z(String(e))}</div>`;}function _e(e,t,a,r){let p=a.data||{};if(!k.chartLib){Ee(e,t,a,r);return}if(!Array.isArray(e)||!e.length){t.innerHTML='<p class="text-muted small">No chart data</p>';return}let n=X(r.id),l=a.id||"chart-"+Math.random().toString(36).slice(2,8),s=n.charts.findIndex(m=>m.key===l);s>=0&&(n.charts[s].inst.destroy(),n.charts.splice(s,1));let d=p.chartType||st(e);t.innerHTML='<div class="lc-chart-wrap"><canvas></canvas></div>';let u=t.querySelector("canvas").getContext("2d"),v;if(d==="pie"||d==="doughnut")v={type:d,data:{labels:e.map(m=>m.label||m.name||""),datasets:[{data:e.map(m=>m.value||0),backgroundColor:Me.slice(0,e.length)}]}};else if(d==="line")v={type:"line",data:{labels:e.map(m=>m.x||m.date||m.label||""),datasets:[{label:a.label||"Value",data:e.map(m=>m.y||m.value||0),borderColor:Me[0],tension:.3,fill:false}]}};else {let m=Object.keys(e[0]).filter(w=>typeof e[0][w]=="number"),C=Object.keys(e[0]).find(w=>typeof e[0][w]=="string");v={type:"bar",data:{labels:e.map(w=>w.label||w.name||(C?w[C]:"")),datasets:m.map((w,S)=>({label:w,data:e.map(M=>M[w]||0),backgroundColor:Me[S%Me.length]}))}};}v.options=Object.assign({responsive:true,maintainAspectRatio:false,plugins:{legend:{position:e.length>8?"bottom":"right"}}},p.chartOptions||{}),n.charts.push({key:l,inst:new k.chartLib(u,v)});}function ve(e,t,a,r){let n=X(r.id).ac.signal,l=a.data||{},s=l.writeTo,d=l.fields||{},u=d.properties||{},v=d.required||[],m=r.id+":"+(l.bind||s||""),C=e&&typeof e=="object"&&!Array.isArray(e)?Object.assign({},e):{};R[m]?(R[m].baseValues=C,Object.keys(R[m].journal).forEach(b=>{M(R[m].journal[b],C[b])&&delete R[m].journal[b];})):R[m]={baseValues:C,journal:{}};let w=R[m];function S(b,f){return b.type==="boolean"?!!f.checked:b.type==="number"||b.type==="integer"?f.value!==""?parseFloat(f.value):0:f.value}function M(b,f){return JSON.stringify(b)===JSON.stringify(f)}function $(){return Object.assign({},w.baseValues,w.journal)}function j(){return Object.keys(w.journal).length>0}function _(b){b.querySelectorAll("[data-key]").forEach(f=>{let z=f.dataset.key,q=u[z];if(!q)return;let W=S(q,f),O=w.baseValues[z];M(W,O)?delete w.journal[z]:w.journal[z]=W;});}let H=document.createElement("form");H.className="row g-2",H.noValidate=true,Object.keys(u).forEach(b=>{let f=u[b],z=v.indexOf(b)>=0,q=["number","integer","boolean"].includes(f.type)||f.enum||f.format==="date",W=document.createElement("div");W.className=q?"col-12 col-md-6":"col-12";let O;if(f.type==="boolean"){let K=document.createElement("div");K.className="form-check mt-3",O=document.createElement("input"),O.type="checkbox",O.className="form-check-input";let ee=document.createElement("label");ee.className="form-check-label small",ee.textContent=f.title||b,K.appendChild(O),K.appendChild(ee),W.appendChild(K);}else {let K=document.createElement("label");K.className="form-label small mb-1",K.textContent=f.title||b,W.appendChild(K),f.enum?(O=document.createElement("select"),O.className="form-select form-select-sm",f.enum.forEach(ee=>{let re=document.createElement("option");re.value=ee,re.textContent=ee,O.appendChild(re);})):f.type==="number"||f.type==="integer"?(O=document.createElement("input"),O.type="number",O.className="form-control form-control-sm",f.minimum!=null&&(O.min=f.minimum),f.maximum!=null&&(O.max=f.maximum),f.type==="integer"&&(O.step="1")):f.format==="date"?(O=document.createElement("input"),O.type="date",O.className="form-control form-control-sm"):(O=document.createElement("input"),O.type="text",O.className="form-control form-control-sm",f.placeholder&&(O.placeholder=f.placeholder)),W.appendChild(O);}O.dataset.key=b,z&&(O.required=true);let fe=$()[b];fe!=null&&(f.type==="boolean"?O.checked=!!fe:f.format==="date"?O.value=String(fe).slice(0,10):O.value=fe),H.appendChild(W);});let ne=document.createElement("div");ne.className="col-12 mt-1";let Q=document.createElement("button");Q.type="button",Q.className="btn btn-sm btn-outline-secondary me-2"+(j()?"":" d-none"),Q.textContent="Discard";let se=document.createElement("button");se.type="submit",se.className="btn btn-sm btn-primary"+(j()?"":" d-none"),se.textContent="Save",ne.appendChild(Q),ne.appendChild(se),H.appendChild(ne),t.innerHTML="",t.appendChild(H),H.addEventListener("input",()=>{_(H);let b=j();se.classList.toggle("d-none",!b),Q.classList.toggle("d-none",!b);},{signal:n}),H.addEventListener("submit",b=>{if(b.preventDefault(),!H.checkValidity()){H.classList.add("was-validated");return}_(H);let f=$();k.onPatchState(r.id,{fieldValues:f}),se.textContent="Saving...",ie(t);},{signal:n}),Q.addEventListener("click",()=>{w.journal={},H.querySelectorAll("[data-key]").forEach(b=>{let f=b.dataset.key,z=u[f];if(!z)return;let q=w.baseValues[f];z.type==="boolean"?b.checked=!!q:z.format==="date"?b.value=q!=null?String(q).slice(0,10):"":b.value=q??"";}),Q.classList.add("d-none"),se.classList.add("d-none");},{signal:n});}function ue(e,t,a,r){let n=X(r.id).ac.signal,l=a.data||{},s=l.writeTo,d=typeof e=="string"?e:"",u=r.id+":"+(l.bind||s||"");D[u]?(D[u].baseContent=d,D[u].journal===d&&(D[u].journal=null)):D[u]={baseContent:d,journal:null};let v=D[u];function m(){return v.journal!=null}function C(){return v.journal!=null?v.journal:v.baseContent}function w(_){v.journal=_===v.baseContent?null:_;}t.innerHTML=`
81
- <textarea class="form-control form-control-sm lc-notes-textarea" rows="8" placeholder="Write markdown...">${L(C())}</textarea>
80
+ `,document.head.appendChild(c);}let ft={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function S(c){return c?String(c).replace(/[&<>"']/g,p=>ft[p]):""}let be={},et={},tt={};function pt(c,p){if(!c||typeof c!="string")throw new Error("registerCardRenderer: name is required");if(!p||typeof p!="object")throw new Error("registerCardRenderer: renderer must be an object");be[c]=p;}function mt(c,p){if(!c||typeof c!="string")throw new Error("registerBoardTheme: name is required");if(!p||typeof p!="object")throw new Error("registerBoardTheme: theme must be an object");et[c]=p;}function ht(c,p){if(!c||typeof c!="string")throw new Error("registerBoardRenderer: name is required");if(!p||typeof p!="object")throw new Error("registerBoardRenderer: renderer must be an object");tt[c]=p;}function nt(c,p){return c?typeof c=="string"?p[c]||null:typeof c=="object"?c:null:null}function ye(){return Array.prototype.slice.call(arguments).filter(function(c){return typeof c=="string"&&c.trim()}).join(" ").trim()}function je(c,p){return p?c?typeof c=="string"||typeof p=="string"?[c,p].filter(function(L){return typeof L=="string"&&L.trim()}).join("; "):c&&typeof c=="object"&&p&&typeof p=="object"?Object.assign({},c,p):p||c||null:typeof p=="string"?p:p&&typeof p=="object"?Object.assign({},p):null:c||null}function at(){let c={boardClass:"",listClass:"",canvasClass:"",canvasInnerClass:"",styles:"",boardStyle:null,listStyle:null,canvasStyle:null,canvasInnerStyle:null};return Array.prototype.slice.call(arguments).forEach(function(p){!p||typeof p!="object"||(c.boardClass=ye(c.boardClass,p.boardClass,p.rootClass),c.listClass=ye(c.listClass,p.listClass,p.gridClass),c.canvasClass=ye(c.canvasClass,p.canvasClass),c.canvasInnerClass=ye(c.canvasInnerClass,p.canvasInnerClass),typeof p.styles=="string"&&p.styles.trim()&&(c.styles+=(c.styles?`
81
+ `:"")+p.styles),c.boardStyle=je(c.boardStyle,p.boardStyle||p.rootStyle),c.listStyle=je(c.listStyle,p.listStyle||p.gridStyle),c.canvasStyle=je(c.canvasStyle,p.canvasStyle),c.canvasInnerStyle=je(c.canvasInnerStyle,p.canvasInnerStyle));}),c}function we(c,p,L,H,B){c.className=ye(p,L),c.style.cssText=typeof H=="string"?H:"",typeof B=="string"&&B.trim()?(c.style.cssText&&!/;\s*$/.test(c.style.cssText)&&(c.style.cssText+=";"),c.style.cssText+=B):B&&typeof B=="object"&&Object.keys(B).forEach(function($){B[$]!=null&&(c.style[$]=B[$]);});}function Ee(c){return !!(c&&typeof c=="object"&&c.nodeType===1)}function gt(c){return !c||typeof c!="object"?false:!!(c.boardClass||c.listClass||c.canvasClass||c.canvasInnerClass||c.styles||c.boardStyle||c.listStyle||c.canvasStyle||c.canvasInnerStyle)}function bt(c){if(!c||typeof c!="object")return null;let p={boardClass:c.boardClass,listClass:c.listClass,canvasClass:c.canvasClass,canvasInnerClass:c.canvasInnerClass,styles:c.styles,boardStyle:c.boardStyle,listStyle:c.listStyle,canvasStyle:c.canvasStyle,canvasInnerStyle:c.canvasInnerStyle};return gt(p)?p:null}function yt(c){let p=Array.isArray(c)?c:[];for(let L=0;L<p.length;L+=1){let H=Ce(p[L]),B=H?be[H]:null,$=bt(B);if($)return $}return null}function Ce(c){let p=c&&c.card&&c.card.meta;return p&&(p.cardRenderer||p.card_renderer)||null}function ke(c){let p=c&&c.card_chats;return !p||typeof p!="object"?{messages:[],receiving:false,processing:false}:{messages:(Array.isArray(p.messages)?p.messages:Array.isArray(p.items)?p.items:[]).map(function(B){return !B||typeof B!="object"?null:{role:typeof B.role=="string"?B.role.toLowerCase():"system",text:typeof B.text=="string"?B.text:typeof B.message=="string"?B.message:"",files:Array.isArray(B.files)?B.files:[]}}).filter(Boolean),receiving:!!p.receiving,processing:!!p.processing}}function Ie(c){return !c||typeof c!="string"?[]:c.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean)}function vt(c,p){if(!p||!c)return;let L=Ie(p),H=c;for(let B=0;B<L.length;B++){if(H==null)return;H=H[L[B]];}return H}function st(c,p,L){let H=Ie(p);if(!H.length)return;let B=c;for(let $=0;$<H.length-1;$++)(B[H[$]]==null||typeof B[H[$]]!="object")&&(B[H[$]]={}),B=B[H[$]];B[H[H.length-1]]=L;}function rt(c){return `<span class="lc-status-dot" style="background:${{fresh:"var(--bs-success)",stale:"var(--bs-warning)",error:"var(--bs-danger)",loading:"var(--bs-info)"}[c]||"var(--bs-secondary)"}" title="${S(c||"unknown")}"></span>`}function lt(c){if(!c)return "";let p=Math.floor((Date.now()-new Date(c).getTime())/1e3);return isNaN(p)||p<0?"":p<60?p+"s ago":p<3600?Math.floor(p/60)+"m ago":p<86400?Math.floor(p/3600)+"h ago":Math.floor(p/86400)+"d ago"}function xt(c){let p=String(c).match(/^(<=?|>=?|===?)\s*(.+)$/);return p?{op:p[1],value:parseFloat(p[2])}:null}function it(c,p){let L=xt(p);if(!L||isNaN(L.value))return false;switch(L.op){case "<":return c<L.value;case "<=":return c<=L.value;case ">":return c>L.value;case ">=":return c>=L.value;case "=":case "==":case "===":return c===L.value}return false}function wt(c){if(!c.length)return "bar";let p=c[0];return p.label!==void 0&&p.value!==void 0&&!p.x&&!p.date?"pie":p.x!==void 0||p.date!==void 0?"line":"bar"}let Ae=["#0d6efd","#198754","#ffc107","#dc3545","#6f42c1","#0dcaf0","#fd7e14","#20c997","#d63384","#6c757d"];function Et(c){ut();let p={resolve:c.resolve,onPatch:c.onPatch||function(){},onPatchState:c.onPatchState||function(){},onRefresh:c.onRefresh||null,onChat:c.onChat||null,markdown:c.markdown||null,sanitize:c.sanitize||null,chartLib:c.chartLib||null,onAction:c.onAction||function(){},startReceivingChats:c.startReceivingChats||null,stopReceivingChats:c.stopReceivingChats||null,fileUrlBase:c.fileUrlBase||"/api/boards/default"},L={},H={},B={},$={},R={},V={};function ne(t){getComputedStyle(t).position==="static"&&(t.style.position="relative");let a=document.createElement("div");a.className="lc-saving-overlay",a.setAttribute("aria-live","polite"),a.style.cssText=["position:absolute","inset:0","background:rgba(255,255,255,0.78)","display:flex","align-items:center","justify-content:center","gap:0.5rem","z-index:20","border-radius:inherit","pointer-events:all"].join(";"),a.innerHTML='<span class="spinner-border spinner-border-sm text-primary" role="status" aria-hidden="true"></span><span class="text-primary fw-medium small">Saving\u2026</span>',t.appendChild(a);}let P={},Z={},y={backdrop:null,title:null,body:null,input:null,fileInput:null,staged:null,sendBtn:null,attachBtn:null,closeBtn:null,currentNodeId:null,stagedFiles:[],loading:false},k={backdrop:null,title:null,body:null,staged:null,fileInput:null,dropzone:null,uploadBtn:null,attachBtn:null,closeBtn:null,currentNodeId:null,stagedFiles:[],pollingTimer:null,loading:false};function W(t){if(!t)return "";let a=p.markdown?p.markdown(t):S(t);return p.sanitize?p.sanitize(a):a}function M(t){return L[t]||(L[t]={ac:new AbortController,timers:[],charts:[],unsubs:[]}),L[t]}function fe(){if(y.backdrop)return;let t=document.createElement("div");t.className="lc-chat-modal-backdrop",t.innerHTML='<div class="modal-dialog modal-lg modal-dialog-centered" role="dialog" aria-modal="true" aria-label="Card chat"> <div class="modal-content bg-white"> <div class="modal-header border-bottom p-3 d-flex align-items-center justify-content-between"> <h5 class="modal-title lc-chat-modal-title">Chat</h5> <button type="button" class="btn btn-sm btn-outline-secondary" data-lc-chat-close aria-label="Close"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></button> </div> <div class="modal-body bg-light" data-lc-chat-body></div> <div class="modal-footer flex-column align-items-stretch border-top p-3 gap-3"> <div data-lc-chat-staged class="small w-100"></div> <input type="file" class="d-none" data-lc-chat-file multiple> <div class="lc-chat-modal-input-row mt-2"> <button type="button" class="btn btn-sm btn-outline-secondary" data-lc-chat-attach title="Attach files" aria-label="Attach files"> <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48"/></svg> </button> <textarea class="form-control" data-lc-chat-input rows="1" placeholder="Type a message..."></textarea> <button type="button" class="btn btn-sm btn-primary" data-lc-chat-send aria-label="Send"> <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="22" y1="2" x2="11" y2="13"/><polygon points="22 2 15 22 11 13 2 9 22 2"/></svg> </button> </div> </div> </div></div>',document.body.appendChild(t),y.backdrop=t,y.title=t.querySelector(".lc-chat-modal-title"),y.body=t.querySelector("[data-lc-chat-body]"),y.input=t.querySelector("[data-lc-chat-input]"),y.fileInput=t.querySelector("[data-lc-chat-file]"),y.staged=t.querySelector("[data-lc-chat-staged]"),y.sendBtn=t.querySelector("[data-lc-chat-send]"),y.attachBtn=t.querySelector("[data-lc-chat-attach]"),y.closeBtn=t.querySelector("[data-lc-chat-close]");function a(){y.input&&(y.input.style.height="auto",y.input.style.height=Math.min(y.input.scrollHeight,120)+"px");}let u=function(){let i=y.currentNodeId;y.currentNodeId=null,y.stagedFiles=[],y.staged.innerHTML="",y.input.value="",a(),y.backdrop.classList.remove("lc-open"),i&&typeof p.stopReceivingChats=="function"&&p.stopReceivingChats(i);};function h(){if(!y.stagedFiles.length){y.staged.innerHTML="";return}y.staged.innerHTML=y.stagedFiles.map(function(i,e){return '<span class="badge text-bg-light border me-1 mb-1">'+S(i.name||"file")+' <button type="button" class="btn btn-sm btn-link text-danger p-0 ms-1" data-lc-rm-file="'+e+'">&times;</button></span>'}).join(""),y.staged.querySelectorAll("[data-lc-rm-file]").forEach(function(i){i.addEventListener("click",function(){let e=parseInt(i.getAttribute("data-lc-rm-file")||"-1",10);e>=0&&y.stagedFiles.splice(e,1),h();});});}async function v(){if(y.loading||!y.currentNodeId)return;let i=y.currentNodeId,e=(y.input.value||"").trim(),n=y.stagedFiles.slice();if(!(!e&&!n.length)){y.loading=true,y.sendBtn.disabled=true,y.attachBtn.disabled=true,z(e),y.input.value="",y.stagedFiles=[],a(),h();try{await Promise.resolve(p.onAction(i,"chat-send",{text:e,files:n}));}catch(r){se(),ae("system","Failed to send message: "+String(r&&r.message||r),[]);}finally{y.loading=false,y.sendBtn.disabled=false,y.attachBtn.disabled=false;}}}y.closeBtn.addEventListener("click",u),t.addEventListener("click",function(i){i.target===t&&u();}),y.attachBtn.addEventListener("click",function(){y.fileInput.click();}),y.fileInput.addEventListener("change",function(i){let e=i.target&&i.target.files?Array.from(i.target.files):[];for(let n of e)y.stagedFiles.find(function(r){return r.name===n.name&&r.size===n.size&&r.lastModified===n.lastModified})||y.stagedFiles.push(n);i.target.value="",h();}),y.sendBtn.addEventListener("click",v),y.input.addEventListener("input",a),y.input.addEventListener("keydown",function(i){i.key==="Enter"&&!i.shiftKey&&(i.preventDefault(),v());}),a(),document.addEventListener("keydown",function(i){i.key==="Escape"&&y.backdrop&&y.backdrop.classList.contains("lc-open")&&u();});}function ee(t){return (Array.isArray(t)?t:[]).map(function(u){if(!u||typeof u!="object")return null;let h=typeof u.role=="string"?u.role:"system",v=typeof u.text=="string"?u.text:typeof u.message=="string"?u.message:"",i=Array.isArray(u.files)?u.files:[];return {role:h.toLowerCase(),text:v,files:i}}).filter(Boolean)}function ae(t,a,u){if(fe(),!y.body||!a&&!u)return;let h=t==="user"||t==="assistant"?t:"system",v=h==="user"?"lc-chat-bubble-user":h==="assistant"?"lc-chat-bubble-assistant":"lc-chat-bubble-system",i=document.createElement("div");if(i.className="lc-chat-bubble "+v,h!=="system"){let n='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="8" r="4"/><path d="M4 20c0-4 3.6-7 8-7s8 3 8 7"/></svg>',r='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>',s=document.createElement("span");s.className="lc-chat-icon",s.setAttribute("aria-hidden","true"),s.innerHTML=h==="user"?n:r,i.appendChild(s);}let e=document.createElement("div");if(e.className="lc-chat-bubble-content",h==="assistant"?e.innerHTML=W(a||""):e.textContent=a||"",Array.isArray(u)&&u.length){let n=document.createElement("div");n.className="small mt-1 text-muted",n.textContent="\u{1F4CE} "+u.map(function(r){return r?typeof r=="string"?r:r.name||"file":"file"}).join(", "),e.appendChild(n);}i.appendChild(e),y.body.appendChild(i),y.body.scrollTop=y.body.scrollHeight;}function z(t){if(fe(),!y.body)return;let a=document.createElement("div");a.className="lc-chat-bubble lc-chat-bubble-user lc-chat-bubble-pending",a.setAttribute("data-lc-chat-pending","1"),a.textContent=t||"";let u=document.createElement("span");u.className="spinner-border spinner-border-sm",u.setAttribute("role","status"),u.setAttribute("aria-label","Sending"),a.appendChild(u),y.body.appendChild(a),y.body.scrollTop=y.body.scrollHeight;}function se(){y.body&&y.body.querySelectorAll('[data-lc-chat-pending="1"]').forEach(function(t){t&&t.parentNode&&t.parentNode.removeChild(t);});}async function q(t){if(y.currentNodeId!==t)return;let a=p.resolve(t),u=[];a&&a.card_chats?u=ke(a).messages:a&&a.card_data&&Array.isArray(a.card_data.messages)&&(u=a.card_data.messages);let h=ee(u);if(y.body.innerHTML="",!h.length){y.body.innerHTML='<div class="text-muted small">No messages yet.</div>',J(t);return}h.forEach(function(v){ae(v.role,v.text,v.files);}),J(t);}function J(t){if(!y.body)return;let a=t?p.resolve(t):null,u=!!ke(a).processing,h=y.body.querySelector(".lc-chat-processing");u?(h||(h=document.createElement("div"),h.className="lc-chat-processing",h.innerHTML='<span class="spinner-border spinner-border-sm" role="status" aria-label="AI working"></span><span>\u2728 AI working\u2026</span>',y.body.appendChild(h)),y.body.scrollTop=y.body.scrollHeight):h&&h.remove();}async function U(t){fe();let a=p.resolve(t);if(!a)return;let u=a.card&&a.card.meta&&a.card.meta.title||a.id;y.currentNodeId=t,y.title.textContent="Chat: "+u,y.body.innerHTML='<div class="text-muted small">Loading...</div>',y.backdrop.classList.add("lc-open");let h=!!(a.card_data&&a.card_data.features&&a.card_data.features.chat&&a.card_data.features.chat.disabled);y.input.disabled=h,y.attachBtn.disabled=h,y.sendBtn.disabled=h,y.input.placeholder=h?"Chat is disabled for this card.":"Type a message...",h||y.input.focus(),typeof p.startReceivingChats=="function"&&p.startReceivingChats(t),await q(t);}function X(){if(k.backdrop)return;let t=document.createElement("div");t.className="lc-files-modal-backdrop",t.innerHTML='<div class="modal-dialog modal-lg modal-dialog-centered" role="dialog" aria-modal="true" aria-label="Card files"> <div class="modal-content bg-white"> <div class="modal-header border-bottom p-3 d-flex align-items-center justify-content-between"> <h5 class="modal-title lc-files-modal-title">Files</h5> <button type="button" class="btn btn-sm btn-outline-secondary" data-lc-files-close aria-label="Close"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg></button> </div> <div class="modal-body bg-light" data-lc-files-body></div> <div class="modal-footer flex-column align-items-stretch border-top p-3 gap-3"> <div class="lc-dropzone border-2 border-dashed p-4 text-center cursor-pointer rounded" data-lc-files-dz> <div class="small text-muted mb-2">Drop files here or click to browse</div> <input type="file" class="d-none" data-lc-files-input multiple> </div> <div data-lc-files-staged class="small w-100 d-flex flex-wrap gap-2"></div> <div class="d-flex justify-content-end gap-2 w-100"> <button type="button" class="btn btn-sm btn-outline-secondary" data-lc-files-attach>Select files</button> <button type="button" class="btn btn-sm btn-primary" data-lc-files-upload>Upload</button> </div> </div> </div></div>',document.body.appendChild(t),k.backdrop=t,k.title=t.querySelector(".lc-files-modal-title"),k.body=t.querySelector("[data-lc-files-body]"),k.staged=t.querySelector("[data-lc-files-staged]"),k.fileInput=t.querySelector("[data-lc-files-input]"),k.dropzone=t.querySelector("[data-lc-files-dz]"),k.uploadBtn=t.querySelector("[data-lc-files-upload]"),k.attachBtn=t.querySelector("[data-lc-files-attach]"),k.closeBtn=t.querySelector("[data-lc-files-close]");let a=function(){k.currentNodeId=null,k.stagedFiles=[],k.staged.innerHTML="",k.backdrop.classList.remove("lc-open"),k.pollingTimer&&(clearInterval(k.pollingTimer),k.pollingTimer=null);};function u(){if(!k.stagedFiles.length){k.staged.innerHTML="";return}k.staged.innerHTML=k.stagedFiles.map(function(i,e){return '<span class="badge text-bg-light border me-1 mb-1">'+S(i.name||"file")+' <button type="button" class="btn btn-sm btn-link text-danger p-0 ms-1" data-lc-files-rm="'+e+'">&times;</button></span>'}).join(""),k.staged.querySelectorAll("[data-lc-files-rm]").forEach(function(i){i.addEventListener("click",function(){let e=parseInt(i.getAttribute("data-lc-files-rm")||"-1",10);e>=0&&k.stagedFiles.splice(e,1),u();});});}function h(i){let e=Array.from(i||[]);for(let n of e)k.stagedFiles.find(function(r){return r.name===n.name&&r.size===n.size&&r.lastModified===n.lastModified})||k.stagedFiles.push(n);u();}async function v(){if(k.loading||!k.currentNodeId||!k.stagedFiles.length)return;let i=k.currentNodeId,e=k.stagedFiles.slice();k.loading=true,k.uploadBtn.disabled=true,k.attachBtn.disabled=true,k.dropzone.classList.add("lc-disabled");try{await Promise.resolve(p.onAction(i,"file-upload",{files:e})),k.stagedFiles=[],u(),G(i);}catch(n){k.staged.innerHTML='<span class="text-danger">Upload failed: '+S(String(n&&n.message||n))+"</span>";}finally{k.loading=false,k.uploadBtn.disabled=false,k.attachBtn.disabled=false,k.dropzone.classList.remove("lc-disabled");}}k.closeBtn.addEventListener("click",a),t.addEventListener("click",function(i){i.target===t&&a();}),k.attachBtn.addEventListener("click",function(){k.fileInput.click();}),k.fileInput.addEventListener("change",function(i){h(i.target&&i.target.files?i.target.files:[]),i.target.value="";}),k.uploadBtn.addEventListener("click",v),k.dropzone.addEventListener("click",function(){k.loading||k.fileInput.click();}),k.dropzone.addEventListener("dragover",function(i){i.preventDefault(),k.dropzone.classList.add("lc-drag-over");}),k.dropzone.addEventListener("dragleave",function(){k.dropzone.classList.remove("lc-drag-over");}),k.dropzone.addEventListener("drop",function(i){i.preventDefault(),k.dropzone.classList.remove("lc-drag-over"),h(i.dataTransfer&&i.dataTransfer.files?i.dataTransfer.files:[]);}),document.addEventListener("keydown",function(i){i.key==="Escape"&&k.backdrop&&k.backdrop.classList.contains("lc-open")&&a();});}function F(t){let a=p.resolve(t);return (a&&a.card_data&&Array.isArray(a.card_data.files)?a.card_data.files:[]).filter(Boolean)}function G(t){if(k.currentNodeId!==t)return;let a=F(t);if(!a.length){k.body.innerHTML='<div class="alert alert-light border small mb-0">No files uploaded yet.</div>';return}let u='<div class="list-group list-group-flush">';a.forEach(function(h,v){let i=h&&(h.name||h.stored_name)?h.name||h.stored_name:"file",e=h&&typeof h.size=="number"?"size: "+h.size+" bytes":"",n=h&&h.stored_name?String(h.stored_name):"",r=n?p.fileUrlBase+"/cards/"+encodeURIComponent(t)+"/files/"+v+"?sn="+encodeURIComponent(n):null;u+='<div class="list-group-item d-flex align-items-center justify-content-between gap-2">',u+='<div class="text-truncate"><div class="small fw-medium">'+S(i)+"</div>",u+='<div class="small text-muted">'+S(e)+"</div></div>",r&&(u+='<a class="btn btn-sm btn-outline-secondary flex-shrink-0" href="'+r+'">Download</a>'),u+="</div>";}),u+="</div>",k.body.innerHTML=u;}function me(t){X();let a=p.resolve(t);if(!a)return;let u=a.card&&a.card.meta&&a.card.meta.title||a.id;k.currentNodeId=t,k.title.textContent="Files: "+u,k.backdrop.classList.add("lc-open");let h=!!(a.card_data&&a.card_data.features&&a.card_data.features.files&&a.card_data.features.files.disabled);k.dropzone.classList.toggle("lc-disabled",h),k.attachBtn.disabled=h,k.uploadBtn.disabled=h,k.fileInput.disabled=h,G(t),k.pollingTimer&&clearInterval(k.pollingTimer),k.pollingTimer=setInterval(function(){G(t);},1e3);}function le(t,a){if(!a||typeof a!="string")return;let u=Ie(a);if(!u.length)return;let h=u[0],v=u.slice(1).join("."),i={card:t&&t.card?t.card:{},card_data:t&&t.card_data?t.card_data:{},requires:t&&t.requires?t.requires:{},computed_values:t&&t.computed_values?t.computed_values:{},runtime_state:t&&t.runtime_state?t.runtime_state:{}};if(Object.prototype.hasOwnProperty.call(i,h))return v?vt(i[h],v):i[h]}function ce(t,a){let u=H[t];u&&u.forEach(h=>{try{h(t,a);}catch(v){console.error("LiveCard notify error",v);}});}function de(t,a){return H[t]||(H[t]=new Set),H[t].add(a),()=>H[t].delete(a)}function qe(t){let a=t&&t.card&&Array.isArray(t.card.requires)?t.card.requires:[];if(!a.length)return;let u=M(t.id),h={};Object.keys(H).concat(Object.keys(Z)).forEach(function(n){let r=p.resolve(n);if(!(!r||!r.card)){var s=Array.isArray(r.card.provides)&&r.card.provides.length?r.card.provides.map(function(o){return typeof o=="string"?o:o.bindTo||o}):[r.id];s.forEach(function(o){h[o]=r.id;});}});let i={},e=[];a.forEach(function(n){var r=h[n]||n;i[r]||(i[r]=true,e.push(r));}),u.unsubs=e.map(n=>de(n,()=>{let r=Z[t.id];if(!r||!r.resultEl)return;let s=p.resolve(t.id);s&&(ie(s,r.resultEl),ce(t.id));}));}function Se(t,a,u,h){let v=u.data||{};if(!Array.isArray(t)||!t.length){a.innerHTML=`<p class="text-muted small">${S(v.placeholder||"No data")}</p>`;return}let i=Math.min(t.length,v.maxRows||200),e=new Set;for(let m=0;m<Math.min(t.length,i);m++)Object.keys(t[m]).forEach(d=>e.add(d));let n=v.columns&&v.columns.length?v.columns:[...e],r=v.sortable!==false,s=null,o="asc",l=M(h.id);function f(){let m=t.slice(0,i);s!==null&&r&&(m=m.slice().sort((x,E)=>{let w=x[n[s]],C=E[n[s]];return w==null?1:C==null?-1:typeof w=="number"&&typeof C=="number"?o==="asc"?w-C:C-w:o==="asc"?String(w).localeCompare(String(C)):String(C).localeCompare(String(w))}));let d='<div class="table-responsive"><table class="table table-sm table-striped table-hover mb-0"><thead><tr>';n.forEach((x,E)=>{let w=s===E?o==="asc"?" \u2191":" \u2193":"";d+=`<th class="small text-nowrap"${r?' style="cursor:pointer"':""} data-col="${E}">${S(x)}${w}</th>`;}),d+="</tr></thead><tbody>",m.forEach(x=>{d+="<tr>",n.forEach(E=>{let w=x[E];d+=`<td class="small">${S(w!=null?String(w):"")}</td>`;}),d+="</tr>";}),d+="</tbody></table></div>",t.length>i&&(d+=`<p class="text-muted small mt-1">Showing ${i} of ${t.length} rows</p>`),a.innerHTML=d,r&&a.querySelectorAll("th[data-col]").forEach(x=>{x.addEventListener("click",()=>{let E=parseInt(x.dataset.col);s===E?o=o==="asc"?"desc":"asc":(s=E,o="asc"),f();},{signal:l.ac.signal});});}f();}function Re(t,a,u,h){let i=M(h.id).ac.signal,e=u.data||{},n=e.writeTo,r=n?le(h,n)||{}:{},s=e.fields&&e.fields.properties||{},o=t&&typeof t=="object"&&!Array.isArray(t)?Object.keys(t):[];if(!o.length){a.innerHTML='<p class="text-muted small">No filter options</p>';return}let l='<div class="row g-2">';o.forEach(f=>{let m=Array.isArray(t[f])?t[f]:[],d=s[f]&&s[f].title||f;l+=`<div class="col-12 col-sm-6 col-md-4"><label class="form-label small mb-1">${S(d)}</label>`,l+=`<select class="form-select form-select-sm" data-fk="${S(f)}"><option value="">All</option>`,m.forEach(x=>{let E=String(x)===String(r[f]||"")?" selected":"";l+=`<option value="${S(String(x))}"${E}>${S(String(x))}</option>`;}),l+="</select></div>";}),l+="</div>",a.innerHTML=l,a.querySelectorAll("select[data-fk]").forEach(f=>{f.addEventListener("change",()=>{let m={};a.querySelectorAll("select[data-fk]").forEach(d=>{d.value&&(m[d.dataset.fk]=d.value);}),n&&st(h,n,m),p.onPatchState(h.id,{fieldValues:m}),ce(h.id,m);},{signal:i});});}function Fe(t,a,u){let h=u.label||"",v="\u2014",i="";t&&typeof t=="object"&&!Array.isArray(t)?(h=t.title||t.label||t.metric||h,v=t.value!=null?String(t.value):"\u2014",i=t.detail||""):t!=null&&(v=String(t));let e='<div class="text-center py-2">';h&&(e+=`<div class="text-muted small">${S(h)}</div>`),e+=`<div class="lc-metric-value">${S(v)}</div>`,i&&(e+=`<div class="small mt-1">${W(i)}</div>`),e+="</div>",a.innerHTML=e;}function Oe(t,a,u,h){let v=u.data||{};if(t==null){a.innerHTML="";return}if(typeof t=="object"&&!Array.isArray(t)){let i='<dl class="row mb-0">';Object.entries(t).forEach(([e,n])=>{i+=`<dt class="col-sm-5 small text-muted text-truncate">${S(e)}</dt>`,i+=`<dd class="col-sm-7 small mb-1">${S(n!=null?String(n):"\u2014")}</dd>`;}),a.innerHTML=i+"</dl>";return}if(Array.isArray(t)){if(!t.length){a.innerHTML=`<p class="text-muted small">${S(v.placeholder||"Empty")}</p>`;return}if(typeof t[0]=="string"||typeof t[0]=="number"){let i=v.maxRows||t.length,e='<ul class="list-unstyled mb-0">';t.slice(0,i).forEach(n=>{e+=`<li class="small mb-1">\u2022 ${S(String(n))}</li>`;}),a.innerHTML=e+"</ul>";return}Se(t,a,u,h);return}a.innerHTML=`<div class="small">${W(String(t))}</div>`;}function Pe(t,a,u,h){let v=u.data||{};if(!p.chartLib){Se(t,a,u,h);return}if(!Array.isArray(t)||!t.length){a.innerHTML='<p class="text-muted small">No chart data</p>';return}let i=M(h.id),e=u.id||"chart-"+Math.random().toString(36).slice(2,8),n=i.charts.findIndex(l=>l.key===e);n>=0&&(i.charts[n].inst.destroy(),i.charts.splice(n,1));let r=v.chartType||wt(t);a.innerHTML='<div class="lc-chart-wrap"><canvas></canvas></div>';let s=a.querySelector("canvas").getContext("2d"),o;if(r==="pie"||r==="doughnut")o={type:r,data:{labels:t.map(l=>l.label||l.name||""),datasets:[{data:t.map(l=>l.value||0),backgroundColor:Ae.slice(0,t.length)}]}};else if(r==="line")o={type:"line",data:{labels:t.map(l=>l.x||l.date||l.label||""),datasets:[{label:u.label||"Value",data:t.map(l=>l.y||l.value||0),borderColor:Ae[0],tension:.3,fill:false}]}};else {let l=Object.keys(t[0]).filter(m=>typeof t[0][m]=="number"),f=Object.keys(t[0]).find(m=>typeof t[0][m]=="string");o={type:"bar",data:{labels:t.map(m=>m.label||m.name||(f?m[f]:"")),datasets:l.map((m,d)=>({label:m,data:t.map(x=>x[m]||0),backgroundColor:Ae[d%Ae.length]}))}};}o.options=Object.assign({responsive:true,maintainAspectRatio:false,plugins:{legend:{position:t.length>8?"bottom":"right"}}},v.chartOptions||{}),i.charts.push({key:e,inst:new p.chartLib(s,o)});}function De(t,a,u,h){let i=M(h.id).ac.signal,e=u.data||{},n=e.writeTo,r=e.fields||{},s=r.properties||{},o=r.required||[],l=h.id+":"+(e.bind||n||""),f=t&&typeof t=="object"&&!Array.isArray(t)?Object.assign({},t):{};$[l]?($[l].baseValues=f,Object.keys($[l].journal).forEach(b=>{x($[l].journal[b],f[b])&&delete $[l].journal[b];})):$[l]={baseValues:f,journal:{}};let m=$[l];function d(b,g){return b.type==="boolean"?!!g.checked:b.type==="number"||b.type==="integer"?g.value!==""?parseFloat(g.value):0:g.value}function x(b,g){return JSON.stringify(b)===JSON.stringify(g)}function E(){return Object.assign({},m.baseValues,m.journal)}function w(){return Object.keys(m.journal).length>0}function C(b){b.querySelectorAll("[data-key]").forEach(g=>{let T=g.dataset.key,N=s[T];if(!N)return;let D=d(N,g),I=m.baseValues[T];x(D,I)?delete m.journal[T]:m.journal[T]=D;});}let j=document.createElement("form");j.className="row g-2",j.noValidate=true,Object.keys(s).forEach(b=>{let g=s[b],T=o.indexOf(b)>=0,N=["number","integer","boolean"].includes(g.type)||g.enum||g.format==="date",D=document.createElement("div");D.className=N?"col-12 col-md-6":"col-12";let I;if(g.type==="boolean"){let O=document.createElement("div");O.className="form-check mt-3",I=document.createElement("input"),I.type="checkbox",I.className="form-check-input";let K=document.createElement("label");K.className="form-check-label small",K.textContent=g.title||b,O.appendChild(I),O.appendChild(K),D.appendChild(O);}else {let O=document.createElement("label");O.className="form-label small mb-1",O.textContent=g.title||b,D.appendChild(O),g.enum?(I=document.createElement("select"),I.className="form-select form-select-sm",g.enum.forEach(K=>{let Q=document.createElement("option");Q.value=K,Q.textContent=K,I.appendChild(Q);})):g.type==="number"||g.type==="integer"?(I=document.createElement("input"),I.type="number",I.className="form-control form-control-sm",g.minimum!=null&&(I.min=g.minimum),g.maximum!=null&&(I.max=g.maximum),g.type==="integer"&&(I.step="1")):g.format==="date"?(I=document.createElement("input"),I.type="date",I.className="form-control form-control-sm"):(I=document.createElement("input"),I.type="text",I.className="form-control form-control-sm",g.placeholder&&(I.placeholder=g.placeholder)),D.appendChild(I);}I.dataset.key=b,T&&(I.required=true);let re=E()[b];re!=null&&(g.type==="boolean"?I.checked=!!re:g.format==="date"?I.value=String(re).slice(0,10):I.value=re),j.appendChild(D);});let Y=document.createElement("div");Y.className="col-12 mt-1";let _=document.createElement("button");_.type="button",_.className="btn btn-sm btn-outline-secondary me-2"+(w()?"":" d-none"),_.textContent="Discard";let A=document.createElement("button");A.type="submit",A.className="btn btn-sm btn-primary"+(w()?"":" d-none"),A.textContent="Save",Y.appendChild(_),Y.appendChild(A),j.appendChild(Y),a.innerHTML="",a.appendChild(j),j.addEventListener("input",()=>{C(j);let b=w();A.classList.toggle("d-none",!b),_.classList.toggle("d-none",!b);},{signal:i}),j.addEventListener("submit",b=>{if(b.preventDefault(),!j.checkValidity()){j.classList.add("was-validated");return}C(j);let g=E();p.onPatchState(h.id,{fieldValues:g}),A.textContent="Saving...",ne(a);},{signal:i}),_.addEventListener("click",()=>{m.journal={},j.querySelectorAll("[data-key]").forEach(b=>{let g=b.dataset.key,T=s[g];if(!T)return;let N=m.baseValues[g];T.type==="boolean"?b.checked=!!N:T.format==="date"?b.value=N!=null?String(N).slice(0,10):"":b.value=N??"";}),_.classList.add("d-none"),A.classList.add("d-none");},{signal:i});}function _e(t,a,u,h){let i=M(h.id).ac.signal,e=u.data||{},n=e.writeTo,r=typeof t=="string"?t:"",s=h.id+":"+(e.bind||n||"");R[s]?(R[s].baseContent=r,R[s].journal===r&&(R[s].journal=null)):R[s]={baseContent:r,journal:null};let o=R[s];function l(){return o.journal!=null}function f(){return o.journal!=null?o.journal:o.baseContent}function m(C){o.journal=C===o.baseContent?null:C;}a.innerHTML=`
82
+ <textarea class="form-control form-control-sm lc-notes-textarea" rows="8" placeholder="Write markdown...">${S(f())}</textarea>
82
83
  <div class="mt-2">
83
- <button class="btn btn-sm btn-outline-secondary me-2 lc-n-discard${m()?"":" d-none"}" type="button">Discard</button>
84
- <button class="btn btn-sm btn-primary lc-n-save${m()?"":" d-none"}" type="button">Save</button>
85
- </div>`;let S=t.querySelector(".lc-notes-textarea"),M=t.querySelector(".lc-n-discard"),$=t.querySelector(".lc-n-save");function j(){let _=m();$.classList.toggle("d-none",!_),M.classList.toggle("d-none",!_);}S.addEventListener("input",()=>{w(S.value),j();},{signal:n}),$.addEventListener("click",()=>{let _=S.value;k.onPatchState(r.id,{fieldValues:{notes:_}}),$.textContent="Saving...",ie(t);},{signal:n}),M.addEventListener("click",()=>{v.journal=null,S.value=v.baseContent||"",j();},{signal:n});}function ye(e,t,a,r){let n=X(r.id).ac.signal,l=a.data||{},s=l.writeTo||(typeof l.bind=="string"&&l.bind.startsWith("card_data.")?l.bind:void 0),d=l.schema&&l.schema.properties||{},u=l.addRow!==false,v=l.deleteRow!==false;function m(b){if(l.columns&&l.columns.length)return l.columns;let f=new Set;return b.forEach(z=>{z&&typeof z=="object"&&Object.keys(z).forEach(q=>f.add(q));}),[...f]}let C=r.id+":"+(l.bind||s||""),S=(Array.isArray(e)?e:[]).map(b=>Object.assign({},b));J[C]?(J[C].baseRows=S,J[C].journalRows&&JSON.stringify(J[C].journalRows)===JSON.stringify(S)&&(J[C].journalRows=null)):J[C]={baseRows:S,journalRows:null};let M=J[C];function $(){return Array.isArray(M.journalRows)}function j(){return (Array.isArray(M.journalRows)?M.journalRows:M.baseRows).map(f=>Object.assign({},f))}function _(b){JSON.stringify(b)===JSON.stringify(M.baseRows)?M.journalRows=null:M.journalRows=b.map(f=>Object.assign({},f));}function H(){let b=t.querySelector(".lc-et-save"),f=t.querySelector(".lc-et-discard");b&&b.classList.remove("d-none"),f&&f.classList.remove("d-none");}function ne(){let b=j();k.onPatchState(r.id,{fieldValues:b});let f=t.querySelector(".lc-et-save");f&&(f.textContent="Saving..."),ie(t);}function Q(){M.journalRows=null,se();}function se(){let b=j(),f=m(b);if(!f.length&&!u){t.innerHTML=`<p class="text-muted small">${L(l.placeholder||"No data")}</p>`;return}let z='<div class="table-responsive"><table class="table table-sm table-bordered mb-0 lc-editable-table"><thead><tr>';if(f.forEach(K=>{z+=`<th class="small text-nowrap">${L(K)}</th>`;}),v&&(z+='<th style="width:2rem"></th>'),z+="</tr></thead><tbody>",b.forEach((K,ee)=>{z+="<tr>",f.forEach(re=>{let ge=K[re],ke=d[re]||{},be=ke.type==="number"||ke.type==="integer"||ge!=null&&typeof ge=="number",qe=ge!=null?String(ge):"";z+=`<td class="p-0"><input type="${be?"number":"text"}" class="form-control form-control-sm border-0 rounded-0 lc-et-cell" data-row="${ee}" data-col="${L(re)}" value="${L(qe)}"${be?' step="any"':""}></td>`;}),v&&(z+=`<td class="text-center align-middle p-0"><button class="btn btn-sm btn-link text-danger p-0 lc-et-del" data-row="${ee}" title="Remove row">\u2715</button></td>`),z+="</tr>";}),!b.length){let K=f.length+(v?1:0);z+=`<tr><td colspan="${K}" class="text-muted small text-center">${L(l.placeholder||"No rows")}</td></tr>`;}z+="</tbody></table></div>";let q="";u&&(q+='<button class="btn btn-sm btn-outline-secondary mt-1 me-1 lc-et-add">+ Add row</button>'),q+=`<button class="btn btn-sm btn-outline-secondary mt-1 me-1 lc-et-discard${$()?"":" d-none"}">Discard</button>`,q+=`<button class="btn btn-sm btn-primary mt-1 lc-et-save${$()?"":" d-none"}">Save</button>`,t.innerHTML=z+q,t.querySelectorAll(".lc-et-cell").forEach(K=>{K.addEventListener("change",()=>{let ee=parseInt(K.dataset.row),re=K.dataset.col,ge=d[re]||{},ke=ge.type==="number"||ge.type==="integer"||K.type==="number",be=j();if(be[ee])if(be[ee]=Object.assign({},be[ee]),be[ee][re]=ke?K.value!==""?parseFloat(K.value):0:K.value,_(be),$())H();else {let qe=t.querySelector(".lc-et-save"),Qe=t.querySelector(".lc-et-discard");qe&&qe.classList.add("d-none"),Qe&&Qe.classList.add("d-none");}},{signal:n});}),t.querySelectorAll(".lc-et-del").forEach(K=>{K.addEventListener("click",()=>{let ee=parseInt(K.dataset.row),re=j().filter((ge,ke)=>ke!==ee);_(re),se();},{signal:n});});let W=t.querySelector(".lc-et-add");W&&W.addEventListener("click",()=>{let K={},ee=j();m(ee).forEach(re=>{K[re]="";}),ee.push(K),_(ee),se();},{signal:n});let O=t.querySelector(".lc-et-discard");O&&O.addEventListener("click",()=>{Q();},{signal:n});let fe=t.querySelector(".lc-et-save");fe&&fe.addEventListener("click",()=>{ne(),fe.textContent="\u2713 Saved",setTimeout(()=>{fe.textContent="Save";},1500);},{signal:n});}se();}function $e(e,t,a,r){let n=X(r.id).ac.signal,s=(a.data||{}).writeTo,d=r.id+":"+(s||""),u=Array.isArray(e)?e.map(w=>Object.assign({},w)):[];if(!V[d])V[d]={currentState:u,pending:u.map(w=>Object.assign({},w))};else {let w=V[d],S=JSON.stringify(w.currentState)!==JSON.stringify(w.pending);w.currentState=u,S||(w.pending=u.map(M=>Object.assign({},M)));}let v=V[d];function m(){s&&Xe(r,s,v.pending),k.onPatchState(r.id,{fieldValues:v.pending}),me(r.id,v.pending),v.currentState=v.pending.map(w=>Object.assign({},w));}function C(){let w=v.pending,S='<div class="lc-todo-list">';w.forEach((_,H)=>{let ne=_.done?" checked":"",Q=_.done?" text-decoration-line-through text-muted":"";S+='<div class="lc-todo-item">',S+=`<input class="form-check-input flex-shrink-0" type="checkbox"${ne} data-idx="${H}">`,S+=`<span class="small flex-grow-1${Q}">${L(_.text)}</span>`,S+=`<button class="btn btn-sm btn-link text-danger p-0" data-rm="${H}" title="Remove">\xD7</button></div>`;}),S+="</div>",S+='<div class="input-group input-group-sm mt-2"><input type="text" class="form-control" placeholder="Add item...">',S+='<button class="btn btn-outline-secondary lc-todo-add">+</button></div>',t.innerHTML=S,t.querySelectorAll("input[data-idx]").forEach(_=>{_.addEventListener("change",()=>{v.pending[parseInt(_.dataset.idx)].done=_.checked,m(),C();},{signal:n});}),t.querySelectorAll("[data-rm]").forEach(_=>{_.addEventListener("click",()=>{v.pending.splice(parseInt(_.dataset.rm),1),m(),C();},{signal:n});});let M=t.querySelector(".input-group input"),$=t.querySelector(".lc-todo-add"),j=()=>{let _=M.value.trim();_&&(v.pending.push({text:_,done:false}),m(),C());};$.addEventListener("click",j,{signal:n}),M.addEventListener("keydown",_=>{_.key==="Enter"&&(_.preventDefault(),j());},{signal:n});}C();}function Ie(e,t,a){let p=(a.data||{}).thresholds||{},n=typeof e=="number"?e:e&&e.value!=null?e.value:null,l="unknown",s="secondary";n!=null&&(p.green&&Ue(n,p.green)?(l="green",s="success"):p.amber&&Ue(n,p.amber)?(l="amber",s="warning"):(l="red",s="danger")),t.innerHTML=`
84
+ <button class="btn btn-sm btn-outline-secondary me-2 lc-n-discard${l()?"":" d-none"}" type="button">Discard</button>
85
+ <button class="btn btn-sm btn-primary lc-n-save${l()?"":" d-none"}" type="button">Save</button>
86
+ </div>`;let d=a.querySelector(".lc-notes-textarea"),x=a.querySelector(".lc-n-discard"),E=a.querySelector(".lc-n-save");function w(){let C=l();E.classList.toggle("d-none",!C),x.classList.toggle("d-none",!C);}d.addEventListener("input",()=>{m(d.value),w();},{signal:i}),E.addEventListener("click",()=>{let C=d.value;p.onPatchState(h.id,{fieldValues:{notes:C}}),E.textContent="Saving...",ne(a);},{signal:i}),x.addEventListener("click",()=>{o.journal=null,d.value=o.baseContent||"",w();},{signal:i});}function Ve(t,a,u,h){let i=M(h.id).ac.signal,e=u.data||{},n=e.writeTo||(typeof e.bind=="string"&&e.bind.startsWith("card_data.")?e.bind:void 0),r=e.schema&&e.schema.properties||{},s=e.addRow!==false,o=e.deleteRow!==false;function l(b){if(e.columns&&e.columns.length)return e.columns;let g=new Set;return b.forEach(T=>{T&&typeof T=="object"&&Object.keys(T).forEach(N=>g.add(N));}),[...g]}let f=h.id+":"+(e.bind||n||""),d=(Array.isArray(t)?t:[]).map(b=>Object.assign({},b));B[f]?(B[f].baseRows=d,B[f].journalRows&&JSON.stringify(B[f].journalRows)===JSON.stringify(d)&&(B[f].journalRows=null)):B[f]={baseRows:d,journalRows:null};let x=B[f];function E(){return Array.isArray(x.journalRows)}function w(){return (Array.isArray(x.journalRows)?x.journalRows:x.baseRows).map(g=>Object.assign({},g))}function C(b){JSON.stringify(b)===JSON.stringify(x.baseRows)?x.journalRows=null:x.journalRows=b.map(g=>Object.assign({},g));}function j(){let b=a.querySelector(".lc-et-save"),g=a.querySelector(".lc-et-discard");b&&b.classList.remove("d-none"),g&&g.classList.remove("d-none");}function Y(){let b=w();p.onPatchState(h.id,{fieldValues:b});let g=a.querySelector(".lc-et-save");g&&(g.textContent="Saving..."),ne(a);}function _(){x.journalRows=null,A();}function A(){let b=w(),g=l(b);if(!g.length&&!s){a.innerHTML=`<p class="text-muted small">${S(e.placeholder||"No data")}</p>`;return}let T='<div class="table-responsive"><table class="table table-sm table-bordered mb-0 lc-editable-table"><thead><tr>';if(g.forEach(O=>{T+=`<th class="small text-nowrap">${S(O)}</th>`;}),o&&(T+='<th style="width:2rem"></th>'),T+="</tr></thead><tbody>",b.forEach((O,K)=>{T+="<tr>",g.forEach(Q=>{let oe=O[Q],pe=r[Q]||{},te=pe.type==="number"||pe.type==="integer"||oe!=null&&typeof oe=="number",He=oe!=null?String(oe):"";T+=`<td class="p-0"><input type="${te?"number":"text"}" class="form-control form-control-sm border-0 rounded-0 lc-et-cell" data-row="${K}" data-col="${S(Q)}" value="${S(He)}"${te?' step="any"':""}></td>`;}),o&&(T+=`<td class="text-center align-middle p-0"><button class="btn btn-sm btn-link text-danger p-0 lc-et-del" data-row="${K}" title="Remove row">\u2715</button></td>`),T+="</tr>";}),!b.length){let O=g.length+(o?1:0);T+=`<tr><td colspan="${O}" class="text-muted small text-center">${S(e.placeholder||"No rows")}</td></tr>`;}T+="</tbody></table></div>";let N="";s&&(N+='<button class="btn btn-sm btn-outline-secondary mt-1 me-1 lc-et-add">+ Add row</button>'),N+=`<button class="btn btn-sm btn-outline-secondary mt-1 me-1 lc-et-discard${E()?"":" d-none"}">Discard</button>`,N+=`<button class="btn btn-sm btn-primary mt-1 lc-et-save${E()?"":" d-none"}">Save</button>`,a.innerHTML=T+N,a.querySelectorAll(".lc-et-cell").forEach(O=>{O.addEventListener("change",()=>{let K=parseInt(O.dataset.row),Q=O.dataset.col,oe=r[Q]||{},pe=oe.type==="number"||oe.type==="integer"||O.type==="number",te=w();if(te[K])if(te[K]=Object.assign({},te[K]),te[K][Q]=pe?O.value!==""?parseFloat(O.value):0:O.value,C(te),E())j();else {let He=a.querySelector(".lc-et-save"),ct=a.querySelector(".lc-et-discard");He&&He.classList.add("d-none"),ct&&ct.classList.add("d-none");}},{signal:i});}),a.querySelectorAll(".lc-et-del").forEach(O=>{O.addEventListener("click",()=>{let K=parseInt(O.dataset.row),Q=w().filter((oe,pe)=>pe!==K);C(Q),A();},{signal:i});});let D=a.querySelector(".lc-et-add");D&&D.addEventListener("click",()=>{let O={},K=w();l(K).forEach(Q=>{O[Q]="";}),K.push(O),C(K),A();},{signal:i});let I=a.querySelector(".lc-et-discard");I&&I.addEventListener("click",()=>{_();},{signal:i});let re=a.querySelector(".lc-et-save");re&&re.addEventListener("click",()=>{Y(),re.textContent="\u2713 Saved",setTimeout(()=>{re.textContent="Save";},1500);},{signal:i});}A();}function Be(t,a,u,h){let i=M(h.id).ac.signal,n=(u.data||{}).writeTo,r=h.id+":"+(n||""),s=Array.isArray(t)?t.map(m=>Object.assign({},m)):[];if(!V[r])V[r]={currentState:s,pending:s.map(m=>Object.assign({},m))};else {let m=V[r],d=JSON.stringify(m.currentState)!==JSON.stringify(m.pending);m.currentState=s,d||(m.pending=s.map(x=>Object.assign({},x)));}let o=V[r];function l(){n&&st(h,n,o.pending),p.onPatchState(h.id,{fieldValues:o.pending}),ce(h.id,o.pending),o.currentState=o.pending.map(m=>Object.assign({},m));}function f(){let m=o.pending,d='<div class="lc-todo-list">';m.forEach((C,j)=>{let Y=C.done?" checked":"",_=C.done?" text-decoration-line-through text-muted":"";d+='<div class="lc-todo-item">',d+=`<input class="form-check-input flex-shrink-0" type="checkbox"${Y} data-idx="${j}">`,d+=`<span class="small flex-grow-1${_}">${S(C.text)}</span>`,d+=`<button class="btn btn-sm btn-link text-danger p-0" data-rm="${j}" title="Remove">\xD7</button></div>`;}),d+="</div>",d+='<div class="input-group input-group-sm mt-2"><input type="text" class="form-control" placeholder="Add item...">',d+='<button class="btn btn-outline-secondary lc-todo-add">+</button></div>',a.innerHTML=d,a.querySelectorAll("input[data-idx]").forEach(C=>{C.addEventListener("change",()=>{o.pending[parseInt(C.dataset.idx)].done=C.checked,l(),f();},{signal:i});}),a.querySelectorAll("[data-rm]").forEach(C=>{C.addEventListener("click",()=>{o.pending.splice(parseInt(C.dataset.rm),1),l(),f();},{signal:i});});let x=a.querySelector(".input-group input"),E=a.querySelector(".lc-todo-add"),w=()=>{let C=x.value.trim();C&&(o.pending.push({text:C,done:false}),l(),f());};E.addEventListener("click",w,{signal:i}),x.addEventListener("keydown",C=>{C.key==="Enter"&&(C.preventDefault(),w());},{signal:i});}f();}function We(t,a,u){let v=(u.data||{}).thresholds||{},i=typeof t=="number"?t:t&&t.value!=null?t.value:null,e="unknown",n="secondary";i!=null&&(v.green&&it(i,v.green)?(e="green",n="success"):v.amber&&it(i,v.amber)?(e="amber",n="warning"):(e="red",n="danger")),a.innerHTML=`
86
87
  <div class="d-flex align-items-center gap-3 py-2">
87
- <span class="lc-alert-dot lc-alert-${l}"></span>
88
+ <span class="lc-alert-dot lc-alert-${e}"></span>
88
89
  <div class="flex-grow-1">
89
- <div class="fw-bold">${n!=null?L(String(n)):"\u2014"}</div>
90
- ${a.label?`<div class="text-muted small">${L(a.label)}</div>`:""}
90
+ <div class="fw-bold">${i!=null?S(String(i)):"\u2014"}</div>
91
+ ${u.label?`<div class="text-muted small">${S(u.label)}</div>`:""}
91
92
  </div>
92
- <span class="badge bg-${s} fs-6">${L(l)}</span>
93
- </div>`;}function ze(e,t){let a=typeof e=="string"?e:e&&e.text?e.text:"";if(!a){t.innerHTML='<p class="text-muted small fst-italic">No narrative yet. Click refresh to generate.</p>';return}t.innerHTML=`<div class="small">${Z(a)}</div>`;}function he(e,t,a){let p=(a.data||{}).colorMap||{},n=e!=null?String(e):"",s={green:"success",amber:"warning",red:"danger",blue:"primary"}[p[n]]||p[n]||"secondary";t.innerHTML=`<span class="badge bg-${L(s)}">${L(n)}</span>`;}function Re(e,t,a){let r=a.data||{},p=r.format||"default",n=a.style||r.style||"default";if((r.hideIfEmpty||a.hideIfEmpty)&&(e==null||e==="")){t.innerHTML="";return}if(p==="file-links"){if(!Array.isArray(e)||e.length===0){t.innerHTML='<div class="text-muted small">No files uploaded</div>';return}let u=[];e.forEach((m,C)=>{if(!m||!m.stored_name)return;let w=m.name||m.stored_name,S=a.data&&a.data.cardId?a.data.cardId:"unknown",M=`${k.fileUrlBase}/cards/${encodeURIComponent(S)}/files/${C}?sn=${encodeURIComponent(m.stored_name)}`,$=m.size?` (${Math.round(m.size/1024)}KB)`:"";u.push(`<div class="mb-2"><a href="${M}" class="btn btn-sm btn-outline-secondary">${L(w)}${L($)}</a></div>`);});let v=u.join("");t.innerHTML=v;return}let s=n==="heading"?"h4":"div",d=n==="muted"?"text-muted small":n==="muted-italic"?"text-muted small fst-italic":n==="heading"?"fw-bold":"small";t.innerHTML=`<${s} class="${d}">${L(e!=null?String(e):"")}</${s}>`;}function Oe(e,t){let a="";typeof e=="string"?a=e:e&&typeof e=="object"&&e.text?a=e.text:e!=null&&(a=JSON.stringify(e,null,2)),t.innerHTML=a?Z(a):"";}function Fe(e,t){if(e==null){t.innerHTML="";return}t.innerHTML=`<pre class="small mb-0">${L(JSON.stringify(e,null,2))}</pre>`;}function Pe(e,t,a,r){let n=X(r.id).ac.signal,l=a.data||{},s=Array.isArray(e)?e:[],d=l.showUploadedList===true,u=l.upload!==false,v=l.accept||[".txt",".csv",".md",".json",".html",".xml",".pdf",".xlsx",".docx",".pptx",".png",".jpg",".jpeg"],m=new Set(v.map(f=>f.toLowerCase())),C=l.multiple!==false,w=l.placeholder||"Drop files here or click to browse",S="lc-fu-"+(a.id||Math.random().toString(36).slice(2,8)),M=t._stagedFiles||[];t._stagedFiles=M;let $=t._uploadStatus||{};t._uploadStatus=$;function j(f){return `${f.name}::${f.size}::${f.lastModified||0}`}let _="";if(u&&(_+=`<div class="lc-dropzone mb-2" id="${S}-dz">`,_+='<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" class="text-muted mb-1"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>',_+=`<div class="small text-muted">${L(w)}</div>`,_+=`<input type="file" id="${S}-fi" class="d-none"${C?" multiple":""} accept="${v.join(",")}">`,_+="</div>",_+=`<div id="${S}-staged"></div>`),d&&s.length&&(_+='<div class="lc-uploaded-files">',s.forEach(f=>{let z=typeof f=="string"?f:f.name||"",q=typeof f=="string"?null:f.url;_+='<div class="d-flex align-items-center gap-1 small mb-1">',_+='<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>',q?_+=`<a href="${L(q)}" class="text-truncate" target="_blank" download>${L(z)}</a>`:_+=`<span class="text-truncate">${L(z)}</span>`,_+="</div>";}),_+="</div>"),!u&&!s.length&&(_=`<p class="text-muted small">${L(l.placeholder||"No files")}</p>`),t.innerHTML=_,!u){t._fileUpload={getFiles:()=>[],clear:()=>{}};return}let H=t.querySelector("#"+S+"-dz"),ne=t.querySelector("#"+S+"-fi"),Q=t.querySelector("#"+S+"-staged");if(!H)return;function se(f){let z=[];for(let q of f){let W="."+q.name.split(".").pop().toLowerCase();m.has(W)&&(M.find(O=>O.name===q.name)||(M.push(q),z.push(q),$[j(q)]="uploading"));}b(),z.length&&typeof k.onAction=="function"&&Promise.resolve(k.onAction(r.id,"file-upload",{files:z,elemId:a.id})).then(()=>{let q=new Set(z.map(j));M=M.filter(W=>!q.has(j(W))),t._stagedFiles=M,z.forEach(W=>{delete $[j(W)];}),t._uploadStatus=$,b();}).catch(()=>{z.forEach(q=>{$[j(q)]="error";}),t._uploadStatus=$,b();});}function b(){if(!M.length){Q.innerHTML="";return}let f="";M.forEach((z,q)=>{let W=$[j(z)]||"ready";f+='<div class="lc-staged-file">',f+='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>',f+=`<span class="small flex-grow-1 text-truncate">${L(z.name)}</span>`,W==="uploading"?f+='<span class="spinner-border spinner-border-sm text-secondary me-1" role="status" aria-label="Uploading"></span>':W==="error"&&(f+='<span class="badge bg-danger-subtle text-danger border border-danger-subtle me-1">Failed</span>'),f+=`<button class="btn btn-sm btn-link text-danger p-0 lc-rm-staged" data-idx="${q}">&times;</button>`,f+="</div>";}),Q.innerHTML=f,Q.querySelectorAll(".lc-rm-staged").forEach(z=>{z.addEventListener("click",()=>{let q=parseInt(z.dataset.idx),W=M[q];W&&delete $[j(W)],M.splice(q,1),t._stagedFiles=M,t._uploadStatus=$,b();},{signal:n});});}H.addEventListener("click",()=>ne.click(),{signal:n}),H.addEventListener("dragover",f=>{f.preventDefault(),H.classList.add("lc-drag-over");},{signal:n}),H.addEventListener("dragleave",()=>H.classList.remove("lc-drag-over"),{signal:n}),H.addEventListener("drop",f=>{f.preventDefault(),H.classList.remove("lc-drag-over"),se(f.dataTransfer.files);},{signal:n}),ne.addEventListener("change",f=>{se(f.target.files),f.target.value="";},{signal:n}),b(),t._fileUpload={getFiles:()=>M,clear:()=>{M=[],$={},t._stagedFiles=[],t._uploadStatus={},b();},disable:()=>{H.classList.add("lc-disabled"),ne.disabled=true;},enable:()=>{H.classList.remove("lc-disabled"),ne.disabled=false;}};}function De(e,t,a,r){let n=X(r.id).ac.signal,l=a.data||{},s=Array.isArray(e)?e:[],d=l.placeholder||"Type a message...",u=l.fileAttach===true,v=l.fileAccept||[".txt",".csv",".md",".json",".html",".xml",".pdf",".xlsx",".docx",".pptx",".png",".jpg",".jpeg"],m="lc-ch-"+(a.id||Math.random().toString(36).slice(2,8)),C='<div class="lc-chat-el">';C+=`<div class="lc-chat-body" id="${m}-body"></div>`,C+='<div class="lc-chat-input-bar">',u&&(C+=`<input type="file" id="${m}-fi" class="d-none" multiple accept="${v.join(",")}">`,C+=`<button class="btn btn-sm btn-outline-secondary" id="${m}-attach" title="Attach files" type="button">`,C+='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48"/></svg>',C+="</button>"),C+=`<input type="text" class="form-control form-control-sm flex-grow-1" id="${m}-input" placeholder="${L(d)}">`,C+=`<button class="btn btn-sm btn-outline-primary" id="${m}-send" type="button">`,C+='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="22" y1="2" x2="11" y2="13"/><polygon points="22 2 15 22 11 13 2 9 22 2"/></svg>',C+="</button></div>",u&&(C+=`<div id="${m}-staged" class="mt-1"></div>`),C+="</div>",t.innerHTML=C;let w=t.querySelector("#"+m+"-body"),S=t.querySelector("#"+m+"-input"),M=t.querySelector("#"+m+"-send"),$=u?t.querySelector("#"+m+"-attach"):null,j=u?t.querySelector("#"+m+"-fi"):null,_=u?t.querySelector("#"+m+"-staged"):null,H=[];function ne(b){let f=document.createElement("div"),z=b.role==="user"?"lc-chat-bubble-user":b.role==="assistant"?"lc-chat-bubble-assistant":"lc-chat-bubble-system";if(f.className="lc-chat-bubble "+z,b.role==="assistant"?f.innerHTML=Z(b.text||""):f.textContent=b.text||"",b.files&&b.files.length){let q=document.createElement("div");q.className="small mt-1",b.files.forEach(W=>{let O=typeof W=="string"?W:W.name;q.innerHTML+="\u{1F4CE} "+L(O)+"<br>";}),f.appendChild(q);}w.appendChild(f);}s.forEach(ne),w.scrollTop=w.scrollHeight;function Q(){if(_){if(!H.length){_.innerHTML="";return}_.innerHTML=H.map((b,f)=>`<div class="d-flex align-items-center gap-1 small"><span>\u{1F4CE} ${L(b.name)}</span><button class="btn btn-sm btn-link text-danger p-0 lc-rm-cs" data-idx="${f}">&times;</button></div>`).join(""),_.querySelectorAll(".lc-rm-cs").forEach(b=>{b.addEventListener("click",()=>{H.splice(parseInt(b.dataset.idx),1),Q();},{signal:n});});}}if($&&j){let b=new Set(v.map(f=>f.toLowerCase()));$.addEventListener("click",()=>j.click(),{signal:n}),j.addEventListener("change",f=>{for(let z of f.target.files){let q="."+z.name.split(".").pop().toLowerCase();b.has(q)&&!H.find(W=>W.name===z.name)&&H.push(z);}f.target.value="",Q();},{signal:n});}function se(){let b=S.value.trim();if(!b&&!H.length)return;let f={role:"user",text:b||""};H.length&&(f.files=H.map(q=>({name:q.name,size:q.size}))),ne(f),w.scrollTop=w.scrollHeight,S.value="";let z=H.slice();H=[],Q(),k.onAction(r.id,"chat-send",{text:f.text,files:z,elemId:a.id});}M.addEventListener("click",se,{signal:n}),S.addEventListener("keydown",b=>{b.key==="Enter"&&!b.shiftKey&&(b.preventDefault(),se());},{signal:n}),t._chat={appendMessage:(b,f,z)=>{ne({role:b,text:f,files:z}),w.scrollTop=w.scrollHeight;},showProcessing:b=>{let f=w.querySelector(".lc-chat-processing");f||(f=document.createElement("div"),f.className="lc-chat-processing",f.innerHTML='<span class="spinner-border spinner-border-sm"></span><span class="small">Processing...</span>',w.appendChild(f)),b&&(f.querySelector(".small").textContent=b),w.scrollTop=w.scrollHeight;},removeProcessing:()=>{let b=w.querySelector(".lc-chat-processing");b&&b.remove();},disable:()=>{S.disabled=true,M.disabled=true,$&&($.disabled=true);},enable:()=>{S.disabled=false,M.disabled=false,$&&($.disabled=false);}};}function Ve(e,t,a,r){let n=X(r.id).ac.signal,s=(a.data||{}).buttons||(Array.isArray(e)?e:[]);if(!s.length){t.innerHTML="";return}let d='<div class="d-flex gap-2 flex-wrap">';s.forEach(u=>{let v=u.style||"outline-secondary",m=u.size||"sm",C=typeof u.disabled=="string"?ce(r,u.disabled):u.disabled;d+=`<button class="btn btn-${L(v)} btn-${m}" data-action-id="${L(u.id)}"${C?" disabled":""}>`,d+=L(u.label||u.id),d+="</button>";}),d+="</div>",t.innerHTML=d,t.querySelectorAll("[data-action-id]").forEach(u=>{u.addEventListener("click",()=>{k.onAction(r.id,"action",{buttonId:u.dataset.actionId,elemId:a.id});},{signal:n});}),t._actions={setDisabled:(u,v)=>{let m=t.querySelector(`[data-action-id="${u}"]`);m&&(m.disabled=v);},setLabel:(u,v)=>{let m=t.querySelector(`[data-action-id="${u}"]`);m&&(m.textContent=v);}};}let je=new Set(["table","editable-table","chart","metric","list","badge","text","narrative","markdown","form","filter","todo","alert"]);function We(e,t,a,r){let p=a.data||{},n=p.viewBind?ce(r,p.viewBind):void 0,l,s;typeof n=="string"&&n?(l=n,s={}):n&&typeof n=="object"&&!Array.isArray(n)&&(l=typeof n.kind=="string"?n.kind:void 0,s=n.data&&typeof n.data=="object"?n.data:{}),(!l||!je.has(l))&&(l=p.fallbackKind&&je.has(p.fallbackKind)?p.fallbackKind:Array.isArray(e)?"table":typeof e=="string"?"text":"narrative");let d=Object.assign({},s,p);delete d.viewBind,delete d.fallbackKind,!d.bind&&s.bind&&(d.bind=s.bind);let u=Object.assign({},a,{kind:l},{data:d}),v=d.bind?ce(r,d.bind):e;(P[l]||P.table)(v,t,u,r);}P.table=Ee,P["editable-table"]=ye,P.filter=Ce,P.metric=He,P.list=Le,P.chart=_e,P.form=ve,P.notes=ue,P.todo=$e,P.alert=Ie,P.narrative=ze,P.badge=he,P.text=Re,P.markdown=Oe,P.custom=Fe,P["file-upload"]=Pe,P.chat=De,P.actions=Ve,P.ref=We;function Se(e,t){let a=e&&e.card?e.card.view:null;if(!a||!Array.isArray(a.elements)){t.innerHTML="";return}F[e.id]&&(F[e.id].elements={});let r=document.createElement("div");r.className="row g-2";let p=e.runtime_state&&e.runtime_state.task_status;if(p&&p!=="completed"){let l=document.createElement("div");l.className="col-12 d-flex align-items-center gap-2 mb-1";var n;p==="running"?n='<span class="spinner-border spinner-border-sm text-muted" style="width:.75rem;height:.75rem;flex-shrink:0"></span>':p==="failed"?n='<span style="font-size:.75rem;line-height:1;flex-shrink:0;color:#dc3545">&#x26A0;&#xFE0E;</span>':p==="not-started"?n='<span style="font-size:.75rem;line-height:1;flex-shrink:0" class="text-muted">&#x25CB;</span>':p==="inactivated"?n='<span style="font-size:.75rem;line-height:1;flex-shrink:0" class="text-muted">&#x2296;</span>':n='<span style="font-size:.75rem;line-height:1;flex-shrink:0" class="text-muted">&#x2013;</span>',l.innerHTML=n+'<span class="text-muted" style="font-size:.75rem">'+L(p)+"</span>",r.appendChild(l);}a.elements.forEach(l=>{if(l.visible&&!ce(e,l.visible))return;let s=l.data&&l.data.bind?ce(e,l.data.bind):void 0,d=document.createElement("div");if(d.className=l.className||"col-12",l.label&&l.kind!=="metric"&&l.kind!=="alert"){let m=document.createElement("div");m.className="small text-muted fw-medium mb-1",m.textContent=l.label,d.appendChild(m);}let u=document.createElement("div");d.appendChild(u);let v=P[l.kind]||P.custom;try{v(s,u,l,e);}catch(m){console.error("LiveCard render error",e.id,l.kind,m),u.innerHTML=`<div class="text-danger small">Render error: ${L(m.message)}</div>`;}l.id&&F[e.id]&&(F[e.id].elements[l.id]=u),r.appendChild(d);}),t.innerHTML="",t.appendChild(r);}function i(e,t,a){h(e.id);let p=X(e.id).ac.signal,n="lc-"+(e.id||"x"),l=e.card&&e.card.view&&e.card.view.features||{},s=`<div class="lc-card" id="${n}">`,d=l.refresh!==false&&k.onRefresh;s+='<div class="d-flex align-items-center gap-1 mb-2">',s+=Ke(e.card_data&&e.card_data.status),s+=`<span class="text-muted small">${Je(e.card_data&&e.card_data.lastRun)}</span>`,e.card_data&&e.card_data.status==="error"&&e.card_data.error&&(s+=`<span class="badge bg-danger small" title="${L(e.card_data.error)}">Error</span>`),s+='<div class="d-flex align-items-center gap-1 ms-auto">';let u=e&&e.card_data&&Array.isArray(e.card_data.files)?e.card_data.files.length:0;s+=`<button class="btn btn-sm btn-outline-secondary d-inline-flex align-items-center" id="${n}-files-open" title="${u>0?"Files ("+u+")":"Files"}">`,s+='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48"/></svg>',u>0&&(s+=`<span class="ms-1 small" aria-label="${u} files">${u}</span>`),s+="</button>",s+=`<button class="btn btn-sm btn-outline-secondary d-inline-flex align-items-center" id="${n}-chat-open" title="Chat">`,s+='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',s+="</button>",d&&(s+=`<button class="btn btn-sm btn-outline-secondary d-inline-flex align-items-center" id="${n}-refresh" title="Refresh">`,s+='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="23 4 23 10 17 10"/><path d="M20.49 15a9 9 0 11-2.12-9.36L23 10"/></svg>',s+="</button>"),s+="</div>",s+="</div>";let v=e.card_data&&e.card_data.llm_task_completion_inference,m=!!(v&&v.isTaskCompleted),C=e.card&&typeof e.card.when_is_task_completed=="string"&&e.card.when_is_task_completed.trim();(C||m)&&(s+='<div class="d-flex align-items-start gap-2 mb-2 px-1 py-1 rounded lc-inference-bar" style="background:rgba(0,0,0,.03)">',m?s+='<span class="lc-inference-icon" title="Task completed" style="color:#198754;font-size:.75rem;line-height:1.2;flex-shrink:0">&#x25CF;</span>':s+='<span class="lc-inference-icon" style="color:#aaa;font-size:.75rem;line-height:1.4;flex-shrink:0" title="Awaiting inference">&#x25CB;</span>',C&&(s+=`<span class="text-muted" style="font-size:.72rem;line-height:1.4;font-style:italic"><span style="opacity:.55;font-style:normal">done when:</span> ${L(C)}</span>`),s+="</div>"),s+=`<div class="lc-result" id="${n}-result"></div>`,s+="</div>",t.innerHTML=s;let w=document.getElementById(n+"-result");F[e.id]={container:t,resultEl:w,uid:n},e.card_data&&e.card_data.status==="error"&&e.card_data.error?w.innerHTML=`<div class="text-danger small fw-semibold">Refresh failed</div><pre class="text-muted small mt-1" style="white-space:pre-wrap">${L(e.card_data.error)}</pre>`:Se(e,w);let S=document.getElementById(n+"-refresh");S&&k.onRefresh&&S.addEventListener("click",j=>{j.stopPropagation(),S.disabled=true,k.onRefresh(e.id);},{signal:p});let M=document.getElementById(n+"-chat-open");M&&M.addEventListener("click",j=>{j.stopPropagation(),pe(e.id);},{signal:p});let $=document.getElementById(n+"-files-open");$&&$.addEventListener("click",j=>{j.stopPropagation(),xe(e.id);},{signal:p}),we(e);}function o(e,t){let a=F[e];if(!a)return;let r=document.getElementById(a.uid+"-refresh");if(r&&(r.disabled=false),t.status){let u=a.container.querySelector(".lc-status-dot");if(u){let v={fresh:"var(--bs-success)",stale:"var(--bs-warning)",error:"var(--bs-danger)",loading:"var(--bs-info)"};u.style.background=v[t.status]||"var(--bs-secondary)",u.title=t.status;}}if(t.lastRun){let u=a.container.querySelector(".lc-status-dot + .text-muted");u&&(u.textContent=Je(t.lastRun));}let p=k.resolve(e);if(!p)return;p.card_data||(p.card_data={}),t.status&&(p.card_data.status=t.status),t.lastRun&&(p.card_data.lastRun=t.lastRun),t.error!==void 0&&(p.card_data.error=t.error),t.files!==void 0&&(p.card_data.files=Array.isArray(t.files)?t.files:[]);let n=document.getElementById(a.uid+"-files-open"),l=Array.isArray(p.card_data.files)?p.card_data.files.length:0;n&&(n.title=l>0?"Files ("+l+")":"Files",n.innerHTML='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48"/></svg>'+(l>0?'<span class="ms-1 small" aria-label="'+l+' files">'+l+"</span>":""));let s=document.getElementById(a.uid+"-files-count");s&&s.parentNode&&s.parentNode.removeChild(s);let d=a.container.querySelector(".lc-inference-bar");if(d){let u=p.card_data&&p.card_data.llm_task_completion_inference,v=!!(u&&u.isTaskCompleted),m=d.querySelector(".lc-inference-icon");m&&(m.title=v?"Task completed":"Awaiting inference",m.style.color=v?"#198754":"#aaa",m.innerHTML=v?"&#x25CF;":"&#x25CB;");}p.card_data.status==="error"&&p.card_data.error?a.resultEl.innerHTML=`<div class="text-danger small fw-semibold">Refresh failed</div><pre class="text-muted small mt-1" style="white-space:pre-wrap">${L(p.card_data.error)}</pre>`:Se(p,a.resultEl);}function h(e){let t=I[e];t&&(t.ac.abort(),t.timers.forEach(a=>clearTimeout(a)),t.charts.forEach(a=>{try{a.inst.destroy();}catch{}}),t.unsubs&&t.unsubs.forEach(a=>a()),delete I[e]),delete F[e];}function y(){Object.keys(I).forEach(h);}function N(e,t,a){c.currentNodeId===e&&ae(t,a,[]);}function E(){let e=c.currentNodeId;!e||!c.backdrop||!c.backdrop.classList.contains("lc-open")||G(e).catch(function(){});}function g(){let e=c.currentNodeId;!e||!c.backdrop||!c.backdrop.classList.contains("lc-open")||(U(),le(e),G(e).catch(function(){}));}function A(e,t){let a=F[e];return a&&a.elements&&a.elements[t]||null}return {render:i,update:o,destroy:h,destroyAll:y,notify:me,subscribe:Ae,appendChatMessage:N,refreshOpenChatModal:E,onServerSseEvent:g,openChatModal:pe,openFilesModal:xe,getElement:A,registerRenderer(e,t){P[e]=t;},renderers:P}}function Ge(T,k,I){I=I||{};let Y={current:I.mode||"board"},J={current:I.devMode||false},R=[],D={},V={},ie=I.showChat||false,P=I.defaultCol||6,F=I.canvas||{},c={snap:F.snap||20,zoomMin:F.zoom&&F.zoom.min||.25,zoomMax:F.zoom&&F.zoom.max||2,zoom:F.zoom&&F.zoom.initial||1,edges:F.edges!==false,minWidth:F.minWidth||220,maxWidth:F.maxWidth||450,defaultW:F.defaultW||350,gapX:F.gapX||280,gapY:F.gapY||320,padX:F.padX||20,padY:F.padY||20,cardMaxH:F.cardMaxH||300,panX:0,panY:0},x=new AbortController,Z=x.signal,X=[],de=F.edgeStyle||{};({color:de.color||"rgba(108, 117, 125, 0.6)",size:de.size||2,dash:de.dash!==false,animation:de.animation!==false,endPlug:de.endPlug||"arrow1"});let ae=document.createElement("div");ae.className="lc-board",k.appendChild(ae);let B=document.createElement("div");B.className="row g-3 lc-board-grid";let U=document.createElement("div");U.className="lc-canvas",U.style.cssText="position:relative;overflow:auto;width:100%;";let G=document.createElement("div");G.className="lc-canvas-inner",G.style.cssText="position:relative;transform-origin:0 0;min-width:100%;min-height:100%;",U.appendChild(G);let le=document.createElementNS("http://www.w3.org/2000/svg","svg");le.setAttribute("class","lc-canvas-edges"),le.style.cssText="position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden;z-index:0;";let pe=document.createElementNS("http://www.w3.org/2000/svg","defs");if(pe.innerHTML='<marker id="lc-arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 1 L 8 5 L 0 9 z" fill="rgba(108,117,125,0.55)"/></marker>',le.appendChild(pe),G.appendChild(le),!document.getElementById("lc-board-css")){let i=document.createElement("style");i.id="lc-board-css",i.textContent=`
94
- .lc-canvas-card { position:absolute; min-width:${c.minWidth}px; cursor:grab; user-select:none; z-index:1; }
93
+ <span class="badge bg-${n} fs-6">${S(e)}</span>
94
+ </div>`;}function Le(t,a){let u=typeof t=="string"?t:t&&t.text?t.text:"";if(!u){a.innerHTML='<p class="text-muted small fst-italic">No narrative yet. Click refresh to generate.</p>';return}a.innerHTML=`<div class="small">${W(u)}</div>`;}function Ye(t,a,u){let v=(u.data||{}).colorMap||{},i=t!=null?String(t):"",n={green:"success",amber:"warning",red:"danger",blue:"primary"}[v[i]]||v[i]||"secondary";a.innerHTML=`<span class="badge bg-${S(n)}">${S(i)}</span>`;}function Xe(t,a,u){let h=u.data||{},v=h.format||"default",i=u.style||h.style||"default";if((h.hideIfEmpty||u.hideIfEmpty)&&(t==null||t==="")){a.innerHTML="";return}if(v==="file-links"){if(!Array.isArray(t)||t.length===0){a.innerHTML='<div class="text-muted small">No files uploaded</div>';return}let s=[];t.forEach((l,f)=>{if(!l||!l.stored_name)return;let m=l.name||l.stored_name,d=u.data&&u.data.cardId?u.data.cardId:"unknown",x=`${p.fileUrlBase}/cards/${encodeURIComponent(d)}/files/${f}?sn=${encodeURIComponent(l.stored_name)}`,E=l.size?` (${Math.round(l.size/1024)}KB)`:"";s.push(`<div class="mb-2"><a href="${x}" class="btn btn-sm btn-outline-secondary">${S(m)}${S(E)}</a></div>`);});let o=s.join("");a.innerHTML=o;return}let n=i==="heading"?"h4":"div",r=i==="muted"?"text-muted small":i==="muted-italic"?"text-muted small fst-italic":i==="heading"?"fw-bold":"small";a.innerHTML=`<${n} class="${r}">${S(t!=null?String(t):"")}</${n}>`;}function ve(t,a){let u="";typeof t=="string"?u=t:t&&typeof t=="object"&&t.text?u=t.text:t!=null&&(u=JSON.stringify(t,null,2)),a.innerHTML=u?W(u):"";}function Ke(t,a){if(t==null){a.innerHTML="";return}a.innerHTML=`<pre class="small mb-0">${S(JSON.stringify(t,null,2))}</pre>`;}function Me(t,a,u,h){let i=M(h.id).ac.signal,e=u.data||{},n=Array.isArray(t)?t:[],r=e.showUploadedList===true,s=e.upload!==false,o=e.accept||[".txt",".csv",".md",".json",".html",".xml",".pdf",".xlsx",".docx",".pptx",".png",".jpg",".jpeg"],l=new Set(o.map(g=>g.toLowerCase())),f=e.multiple!==false,m=e.placeholder||"Drop files here or click to browse",d="lc-fu-"+(u.id||Math.random().toString(36).slice(2,8)),x=a._stagedFiles||[];a._stagedFiles=x;let E=a._uploadStatus||{};a._uploadStatus=E;function w(g){return `${g.name}::${g.size}::${g.lastModified||0}`}let C="";if(s&&(C+=`<div class="lc-dropzone mb-2" id="${d}-dz">`,C+='<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" class="text-muted mb-1"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="17 8 12 3 7 8"/><line x1="12" y1="3" x2="12" y2="15"/></svg>',C+=`<div class="small text-muted">${S(m)}</div>`,C+=`<input type="file" id="${d}-fi" class="d-none"${f?" multiple":""} accept="${o.join(",")}">`,C+="</div>",C+=`<div id="${d}-staged"></div>`),r&&n.length&&(C+='<div class="lc-uploaded-files">',n.forEach(g=>{let T=typeof g=="string"?g:g.name||"",N=typeof g=="string"?null:g.url;C+='<div class="d-flex align-items-center gap-1 small mb-1">',C+='<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>',N?C+=`<a href="${S(N)}" class="text-truncate" target="_blank" download>${S(T)}</a>`:C+=`<span class="text-truncate">${S(T)}</span>`,C+="</div>";}),C+="</div>"),!s&&!n.length&&(C=`<p class="text-muted small">${S(e.placeholder||"No files")}</p>`),a.innerHTML=C,!s){a._fileUpload={getFiles:()=>[],clear:()=>{}};return}let j=a.querySelector("#"+d+"-dz"),Y=a.querySelector("#"+d+"-fi"),_=a.querySelector("#"+d+"-staged");if(!j)return;function A(g){let T=[];for(let N of g){let D="."+N.name.split(".").pop().toLowerCase();l.has(D)&&(x.find(I=>I.name===N.name)||(x.push(N),T.push(N),E[w(N)]="uploading"));}b(),T.length&&typeof p.onAction=="function"&&Promise.resolve(p.onAction(h.id,"file-upload",{files:T,elemId:u.id})).then(()=>{let N=new Set(T.map(w));x=x.filter(D=>!N.has(w(D))),a._stagedFiles=x,T.forEach(D=>{delete E[w(D)];}),a._uploadStatus=E,b();}).catch(()=>{T.forEach(N=>{E[w(N)]="error";}),a._uploadStatus=E,b();});}function b(){if(!x.length){_.innerHTML="";return}let g="";x.forEach((T,N)=>{let D=E[w(T)]||"ready";g+='<div class="lc-staged-file">',g+='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>',g+=`<span class="small flex-grow-1 text-truncate">${S(T.name)}</span>`,D==="uploading"?g+='<span class="spinner-border spinner-border-sm text-secondary me-1" role="status" aria-label="Uploading"></span>':D==="error"&&(g+='<span class="badge bg-danger-subtle text-danger border border-danger-subtle me-1">Failed</span>'),g+=`<button class="btn btn-sm btn-link text-danger p-0 lc-rm-staged" data-idx="${N}">&times;</button>`,g+="</div>";}),_.innerHTML=g,_.querySelectorAll(".lc-rm-staged").forEach(T=>{T.addEventListener("click",()=>{let N=parseInt(T.dataset.idx),D=x[N];D&&delete E[w(D)],x.splice(N,1),a._stagedFiles=x,a._uploadStatus=E,b();},{signal:i});});}j.addEventListener("click",()=>Y.click(),{signal:i}),j.addEventListener("dragover",g=>{g.preventDefault(),j.classList.add("lc-drag-over");},{signal:i}),j.addEventListener("dragleave",()=>j.classList.remove("lc-drag-over"),{signal:i}),j.addEventListener("drop",g=>{g.preventDefault(),j.classList.remove("lc-drag-over"),A(g.dataTransfer.files);},{signal:i}),Y.addEventListener("change",g=>{A(g.target.files),g.target.value="";},{signal:i}),b(),a._fileUpload={getFiles:()=>x,clear:()=>{x=[],E={},a._stagedFiles=[],a._uploadStatus={},b();},disable:()=>{j.classList.add("lc-disabled"),Y.disabled=true;},enable:()=>{j.classList.remove("lc-disabled"),Y.disabled=false;}};}function Je(t,a,u,h){let i=M(h.id).ac.signal,e=u.data||{},n=Array.isArray(t)?t:[],r=e.placeholder||"Type a message...",s=e.fileAttach===true,o=e.fileAccept||[".txt",".csv",".md",".json",".html",".xml",".pdf",".xlsx",".docx",".pptx",".png",".jpg",".jpeg"],l="lc-ch-"+(u.id||Math.random().toString(36).slice(2,8)),f='<div class="lc-chat-el">';f+=`<div class="lc-chat-body" id="${l}-body"></div>`,f+='<div class="lc-chat-input-bar">',s&&(f+=`<input type="file" id="${l}-fi" class="d-none" multiple accept="${o.join(",")}">`,f+=`<button class="btn btn-sm btn-outline-secondary" id="${l}-attach" title="Attach files" type="button">`,f+='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48"/></svg>',f+="</button>"),f+=`<input type="text" class="form-control form-control-sm flex-grow-1" id="${l}-input" placeholder="${S(r)}">`,f+=`<button class="btn btn-sm btn-outline-primary" id="${l}-send" type="button">`,f+='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="22" y1="2" x2="11" y2="13"/><polygon points="22 2 15 22 11 13 2 9 22 2"/></svg>',f+="</button></div>",s&&(f+=`<div id="${l}-staged" class="mt-1"></div>`),f+="</div>",a.innerHTML=f;let m=a.querySelector("#"+l+"-body"),d=a.querySelector("#"+l+"-input"),x=a.querySelector("#"+l+"-send"),E=s?a.querySelector("#"+l+"-attach"):null,w=s?a.querySelector("#"+l+"-fi"):null,C=s?a.querySelector("#"+l+"-staged"):null,j=[];function Y(b){let g=document.createElement("div"),T=b.role==="user"?"lc-chat-bubble-user":b.role==="assistant"?"lc-chat-bubble-assistant":"lc-chat-bubble-system";if(g.className="lc-chat-bubble "+T,b.role==="assistant"?g.innerHTML=W(b.text||""):g.textContent=b.text||"",b.files&&b.files.length){let N=document.createElement("div");N.className="small mt-1",b.files.forEach(D=>{let I=typeof D=="string"?D:D.name;N.innerHTML+="\u{1F4CE} "+S(I)+"<br>";}),g.appendChild(N);}m.appendChild(g);}n.forEach(Y),m.scrollTop=m.scrollHeight;function _(){if(C){if(!j.length){C.innerHTML="";return}C.innerHTML=j.map((b,g)=>`<div class="d-flex align-items-center gap-1 small"><span>\u{1F4CE} ${S(b.name)}</span><button class="btn btn-sm btn-link text-danger p-0 lc-rm-cs" data-idx="${g}">&times;</button></div>`).join(""),C.querySelectorAll(".lc-rm-cs").forEach(b=>{b.addEventListener("click",()=>{j.splice(parseInt(b.dataset.idx),1),_();},{signal:i});});}}if(E&&w){let b=new Set(o.map(g=>g.toLowerCase()));E.addEventListener("click",()=>w.click(),{signal:i}),w.addEventListener("change",g=>{for(let T of g.target.files){let N="."+T.name.split(".").pop().toLowerCase();b.has(N)&&!j.find(D=>D.name===T.name)&&j.push(T);}g.target.value="",_();},{signal:i});}function A(){let b=d.value.trim();if(!b&&!j.length)return;let g={role:"user",text:b||""};j.length&&(g.files=j.map(N=>({name:N.name,size:N.size}))),Y(g),m.scrollTop=m.scrollHeight,d.value="";let T=j.slice();j=[],_(),p.onAction(h.id,"chat-send",{text:g.text,files:T,elemId:u.id});}x.addEventListener("click",A,{signal:i}),d.addEventListener("keydown",b=>{b.key==="Enter"&&!b.shiftKey&&(b.preventDefault(),A());},{signal:i}),a._chat={appendMessage:(b,g,T)=>{Y({role:b,text:g,files:T}),m.scrollTop=m.scrollHeight;},showProcessing:b=>{let g=m.querySelector(".lc-chat-processing");g||(g=document.createElement("div"),g.className="lc-chat-processing",g.innerHTML='<span class="spinner-border spinner-border-sm"></span><span class="small">Processing...</span>',m.appendChild(g)),b&&(g.querySelector(".small").textContent=b),m.scrollTop=m.scrollHeight;},removeProcessing:()=>{let b=m.querySelector(".lc-chat-processing");b&&b.remove();},disable:()=>{d.disabled=true,x.disabled=true,E&&(E.disabled=true);},enable:()=>{d.disabled=false,x.disabled=false,E&&(E.disabled=false);}};}function Te(t,a,u,h){let i=M(h.id).ac.signal,n=(u.data||{}).buttons||(Array.isArray(t)?t:[]);if(!n.length){a.innerHTML="";return}let r='<div class="d-flex gap-2 flex-wrap">';n.forEach(s=>{let o=s.style||"outline-secondary",l=s.size||"sm",f=typeof s.disabled=="string"?le(h,s.disabled):s.disabled;r+=`<button class="btn btn-${S(o)} btn-${l}" data-action-id="${S(s.id)}"${f?" disabled":""}>`,r+=S(s.label||s.id),r+="</button>";}),r+="</div>",a.innerHTML=r,a.querySelectorAll("[data-action-id]").forEach(s=>{s.addEventListener("click",()=>{p.onAction(h.id,"action",{buttonId:s.dataset.actionId,elemId:u.id});},{signal:i});}),a._actions={setDisabled:(s,o)=>{let l=a.querySelector(`[data-action-id="${s}"]`);l&&(l.disabled=o);},setLabel:(s,o)=>{let l=a.querySelector(`[data-action-id="${s}"]`);l&&(l.textContent=o);}};}let xe=new Set(["table","editable-table","chart","metric","list","badge","text","narrative","markdown","form","filter","todo","alert"]);function he(t,a,u,h){let v=u.data||{},i=v.viewBind?le(h,v.viewBind):void 0,e,n;typeof i=="string"&&i?(e=i,n={}):i&&typeof i=="object"&&!Array.isArray(i)&&(e=typeof i.kind=="string"?i.kind:void 0,n=i.data&&typeof i.data=="object"?i.data:{}),(!e||!xe.has(e))&&(e=v.fallbackKind&&xe.has(v.fallbackKind)?v.fallbackKind:Array.isArray(t)?"table":typeof t=="string"?"text":"narrative");let r=Object.assign({},n,v);delete r.viewBind,delete r.fallbackKind,!r.bind&&n.bind&&(r.bind=n.bind);let s=Object.assign({},u,{kind:e},{data:r}),o=r.bind?le(h,r.bind):t;(P[e]||P.table)(o,a,s,h);}P.table=Se,P["editable-table"]=Ve,P.filter=Re,P.metric=Fe,P.list=Oe,P.chart=Pe,P.form=De,P.notes=_e,P.todo=Be,P.alert=We,P.narrative=Le,P.badge=Ye,P.text=Xe,P.markdown=ve,P.custom=Ke,P["file-upload"]=Me,P.chat=Je,P.actions=Te,P.ref=he;function ie(t,a){let u=t&&t.card?t.card.view:null;if(!u||!Array.isArray(u.elements)){a.innerHTML="";return}Z[t.id]&&(Z[t.id].elements={});let h=document.createElement("div");h.className="row g-2";let v=t.runtime_state&&t.runtime_state.task_status;if(v&&v!=="completed"){let e=document.createElement("div");e.className="col-12 d-flex align-items-center gap-2 mb-1";var i;v==="running"?i='<span class="spinner-border spinner-border-sm text-muted" style="width:.75rem;height:.75rem;flex-shrink:0"></span>':v==="failed"?i='<span style="font-size:.75rem;line-height:1;flex-shrink:0;color:#dc3545">&#x26A0;&#xFE0E;</span>':v==="not-started"?i='<span style="font-size:.75rem;line-height:1;flex-shrink:0" class="text-muted">&#x25CB;</span>':v==="inactivated"?i='<span style="font-size:.75rem;line-height:1;flex-shrink:0" class="text-muted">&#x2296;</span>':i='<span style="font-size:.75rem;line-height:1;flex-shrink:0" class="text-muted">&#x2013;</span>',e.innerHTML=i+'<span class="text-muted" style="font-size:.75rem">'+S(v)+"</span>",h.appendChild(e);}u.elements.forEach(e=>{if(e.visible&&!le(t,e.visible))return;let n=e.data&&e.data.bind?le(t,e.data.bind):void 0,r=document.createElement("div");if(r.className=e.className||"col-12",e.label&&e.kind!=="metric"&&e.kind!=="alert"){let l=document.createElement("div");l.className="small text-muted fw-medium mb-1",l.textContent=e.label,r.appendChild(l);}let s=document.createElement("div");r.appendChild(s);let o=P[e.kind]||P.custom;try{o(n,s,e,t);}catch(l){console.error("LiveCard render error",t.id,e.kind,l),s.innerHTML=`<div class="text-danger small">Render error: ${S(l.message)}</div>`;}e.id&&Z[t.id]&&(Z[t.id].elements[e.id]=s),h.appendChild(r);}),a.innerHTML="",a.appendChild(h);}function ge(t,a,u){Ne(t.id);let v=M(t.id).ac.signal,i="lc-"+(t.id||"x"),e=t.card&&t.card.view&&t.card.view.features||{},n=`<div class="lc-card" id="${i}">`,r=e.refresh!==false&&p.onRefresh;n+='<div class="d-flex align-items-center gap-1 mb-2">',n+=rt(t.card_data&&t.card_data.status),n+=`<span class="text-muted small">${lt(t.card_data&&t.card_data.lastRun)}</span>`,t.card_data&&t.card_data.status==="error"&&t.card_data.error&&(n+=`<span class="badge bg-danger small" title="${S(t.card_data.error)}">Error</span>`),n+='<div class="d-flex align-items-center gap-1 ms-auto">';let s=t&&t.card_data&&Array.isArray(t.card_data.files)?t.card_data.files.length:0;n+=`<button class="btn btn-sm btn-outline-secondary d-inline-flex align-items-center" id="${i}-files-open" title="${s>0?"Files ("+s+")":"Files"}">`,n+='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48"/></svg>',s>0&&(n+=`<span class="ms-1 small" aria-label="${s} files">${s}</span>`),n+="</button>",n+=`<button class="btn btn-sm btn-outline-secondary d-inline-flex align-items-center" id="${i}-chat-open" title="Chat">`,n+='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',n+="</button>",r&&(n+=`<button class="btn btn-sm btn-outline-secondary d-inline-flex align-items-center" id="${i}-refresh" title="Refresh">`,n+='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="23 4 23 10 17 10"/><path d="M20.49 15a9 9 0 11-2.12-9.36L23 10"/></svg>',n+="</button>"),n+="</div>",n+="</div>";let o=t.card_data&&t.card_data.llm_task_completion_inference,l=!!(o&&o.isTaskCompleted),f=t.card&&typeof t.card.when_is_task_completed=="string"&&t.card.when_is_task_completed.trim();(f||l)&&(n+='<div class="d-flex align-items-start gap-2 mb-2 px-1 py-1 rounded lc-inference-bar" style="background:rgba(0,0,0,.03)">',l?n+='<span class="lc-inference-icon" title="Task completed" style="color:#198754;font-size:.75rem;line-height:1.2;flex-shrink:0">&#x25CF;</span>':n+='<span class="lc-inference-icon" style="color:#aaa;font-size:.75rem;line-height:1.4;flex-shrink:0" title="Awaiting inference">&#x25CB;</span>',f&&(n+=`<span class="text-muted" style="font-size:.72rem;line-height:1.4;font-style:italic"><span style="opacity:.55;font-style:normal">done when:</span> ${S(f)}</span>`),n+="</div>"),n+=`<div class="lc-result" id="${i}-result"></div>`,n+="</div>",a.innerHTML=n;let m=document.getElementById(i+"-result");Z[t.id]={container:a,resultEl:m,uid:i},t.card_data&&t.card_data.status==="error"&&t.card_data.error?m.innerHTML=`<div class="text-danger small fw-semibold">Refresh failed</div><pre class="text-muted small mt-1" style="white-space:pre-wrap">${S(t.card_data.error)}</pre>`:ie(t,m);let d=document.getElementById(i+"-refresh");d&&p.onRefresh&&d.addEventListener("click",w=>{w.stopPropagation(),d.disabled=true,p.onRefresh(t.id);},{signal:v});let x=document.getElementById(i+"-chat-open");x&&x.addEventListener("click",w=>{w.stopPropagation(),U(t.id);},{signal:v});let E=document.getElementById(i+"-files-open");E&&E.addEventListener("click",w=>{w.stopPropagation(),me(t.id);},{signal:v}),qe(t);}function $e(t,a){let u=Z[t];if(!u)return;let h=document.getElementById(u.uid+"-refresh");if(h&&(h.disabled=false),a.status){let s=u.container.querySelector(".lc-status-dot");if(s){let o={fresh:"var(--bs-success)",stale:"var(--bs-warning)",error:"var(--bs-danger)",loading:"var(--bs-info)"};s.style.background=o[a.status]||"var(--bs-secondary)",s.title=a.status;}}if(a.lastRun){let s=u.container.querySelector(".lc-status-dot + .text-muted");s&&(s.textContent=lt(a.lastRun));}let v=p.resolve(t);if(!v)return;v.card_data||(v.card_data={}),a.status&&(v.card_data.status=a.status),a.lastRun&&(v.card_data.lastRun=a.lastRun),a.error!==void 0&&(v.card_data.error=a.error),a.files!==void 0&&(v.card_data.files=Array.isArray(a.files)?a.files:[]);let i=document.getElementById(u.uid+"-files-open"),e=Array.isArray(v.card_data.files)?v.card_data.files.length:0;i&&(i.title=e>0?"Files ("+e+")":"Files",i.innerHTML='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48"/></svg>'+(e>0?'<span class="ms-1 small" aria-label="'+e+' files">'+e+"</span>":""));let n=document.getElementById(u.uid+"-files-count");n&&n.parentNode&&n.parentNode.removeChild(n);let r=u.container.querySelector(".lc-inference-bar");if(r){let s=v.card_data&&v.card_data.llm_task_completion_inference,o=!!(s&&s.isTaskCompleted),l=r.querySelector(".lc-inference-icon");l&&(l.title=o?"Task completed":"Awaiting inference",l.style.color=o?"#198754":"#aaa",l.innerHTML=o?"&#x25CF;":"&#x25CB;");}v.card_data.status==="error"&&v.card_data.error?u.resultEl.innerHTML=`<div class="text-danger small fw-semibold">Refresh failed</div><pre class="text-muted small mt-1" style="white-space:pre-wrap">${S(v.card_data.error)}</pre>`:ie(v,u.resultEl);}function Ne(t){let a=L[t];a&&(a.ac.abort(),a.timers.forEach(u=>clearTimeout(u)),a.charts.forEach(u=>{try{u.inst.destroy();}catch{}}),a.unsubs&&a.unsubs.forEach(u=>u()),delete L[t]),delete Z[t];}function ze(){Object.keys(L).forEach(Ne);}function ue(t,a,u){y.currentNodeId===t&&ae(a,u,[]);}function Ue(){let t=y.currentNodeId;!t||!y.backdrop||!y.backdrop.classList.contains("lc-open")||q(t).catch(function(){});}function Ge(){let t=y.currentNodeId;!t||!y.backdrop||!y.backdrop.classList.contains("lc-open")||(se(),J(t),q(t).catch(function(){}));}function Qe(t,a){let u=Z[t];return u&&u.elements&&u.elements[a]||null}return {render:ge,update:$e,destroy:Ne,destroyAll:ze,notify:ce,subscribe:de,appendChatMessage:ue,refreshOpenChatModal:Ue,onServerSseEvent:Ge,openChatModal:U,openFilesModal:me,getElement:Qe,registerRenderer(t,a){P[t]=a;},renderers:P,getChatStateForCard(t){let a=p.resolve(t);return a?ke(a):{messages:[],receiving:false,processing:false}},startReceivingChatsForCard(t){typeof p.startReceivingChats=="function"&&p.startReceivingChats(t);},stopReceivingChatsForCard(t){typeof p.stopReceivingChats=="function"&&p.stopReceivingChats(t);},isReceivingChatsForCard(t){let a=p.resolve(t);return !a||!a.card_chats?false:!!a.card_chats.receiving}}}function ot(c,p,L){L=L||{};let H={current:L.mode||"board"},B={current:L.devMode||false},$=[],R={},V={},ne=L.showChat||false,P=L.defaultCol||6,Z=nt(L.boardTheme,et),y=nt(L.boardRenderer,tt),k=at(L.boardSkin,{boardClass:L.boardClass,listClass:L.listClass,canvasClass:L.canvasClass,canvasInnerClass:L.canvasInnerClass,styles:L.styles,boardStyle:L.boardStyle,listStyle:L.listStyle,canvasStyle:L.canvasStyle,canvasInnerStyle:L.canvasInnerStyle}),W=L.canvas||{},M={snap:W.snap||20,zoomMin:W.zoom&&W.zoom.min||.25,zoomMax:W.zoom&&W.zoom.max||2,zoom:W.zoom&&W.zoom.initial||1,edges:W.edges!==false,minWidth:W.minWidth||220,maxWidth:W.maxWidth||450,defaultW:W.defaultW||350,gapX:W.gapX||280,gapY:W.gapY||320,padX:W.padX||20,padY:W.padY||20,cardMaxH:W.cardMaxH||300,panX:0,panY:0},fe=new AbortController,ee=fe.signal,ae=[],z=W.edgeStyle||{};({color:z.color||"rgba(108, 117, 125, 0.6)",size:z.size||2,dash:z.dash!==false,animation:z.animation!==false,endPlug:z.endPlug||"arrow1"});let q=document.createElement("div");q.className="lc-board",p.appendChild(q);let J=null,U=document.createElement("div");U.className="row g-3 lc-board-grid";let X=document.createElement("div");X.className="lc-canvas",X.style.cssText="position:relative;overflow:auto;width:100%;";let F=document.createElement("div");F.className="lc-canvas-inner",F.style.cssText="position:relative;transform-origin:0 0;min-width:100%;min-height:100%;",X.appendChild(F);let G=document.createElementNS("http://www.w3.org/2000/svg","svg");G.setAttribute("class","lc-canvas-edges"),G.style.cssText="position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden;z-index:0;";let me=document.createElementNS("http://www.w3.org/2000/svg","defs");me.innerHTML='<marker id="lc-arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 1 L 8 5 L 0 9 z" fill="rgba(108,117,125,0.55)"/></marker>',G.appendChild(me),F.appendChild(G);function le(){let e=yt($);return at(e,Z,k)}function ce(e){let n=[e&&e.styles,y&&typeof y.styles=="string"?y.styles:""].filter(function(r){return typeof r=="string"&&r.trim()}).join(`
95
+ `);if(!n){J&&J.parentNode&&J.parentNode.removeChild(J),J=null;return}J||(J=document.createElement("style"),J.setAttribute("data-lc-board-scope","1"),document.head.appendChild(J)),J.textContent=n;}function de(e,n){return Object.assign({root:q,gridEl:U,canvasEl:X,canvasInner:F,appearance:e,mode:H.current,engine:c,nodes:$.slice(),containerEl:p},n||{})}function qe(e){we(q,"lc-board",e.boardClass,"",e.boardStyle),we(U,"row g-3 lc-board-grid",e.listClass,"",e.listStyle);let n=U,r=U;if(y&&typeof y.createBoardHost=="function"){let s=y.createBoardHost(de(e,{defaultMountEl:U,defaultListEl:U}));Ee(s)?(n=s,r=s):s&&typeof s=="object"&&(n=s.mountEl||s.hostEl||s.containerEl||U,r=s.listEl||s.contentEl||s.mountEl||n);}return q.innerHTML="",n!==U&&r===U&&!n.contains(U)&&n.appendChild(U),n!==q?(r!==n&&!Ee(r.parentNode)&&n.appendChild(r),q.appendChild(n)):r!==q&&!q.contains(r)&&q.appendChild(r),{mountEl:n,listEl:r}}function Se(e){we(q,"lc-board",e.boardClass,"",e.boardStyle),we(X,"lc-canvas",e.canvasClass,"position:relative;overflow:auto;width:100%;",e.canvasStyle),we(F,"lc-canvas-inner",e.canvasInnerClass,"position:relative;transform-origin:0 0;min-width:100%;min-height:100%;",e.canvasInnerStyle);let n=X,r=X;if(y&&typeof y.createCanvasHost=="function"){let s=y.createCanvasHost(de(e,{defaultMountEl:X,defaultSurfaceEl:X,defaultCanvasEl:X}));Ee(s)?(n=s,r=s):s&&typeof s=="object"&&(n=s.mountEl||s.hostEl||s.containerEl||X,r=s.surfaceEl||s.canvasEl||s.mountEl||n);}return q.innerHTML="",n!==X&&r===X&&!n.contains(X)&&n.appendChild(X),n!==q?q.appendChild(n):r!==q&&!q.contains(r)&&q.appendChild(r),{mountEl:n,surfaceEl:r}}function Re(e,n,r){let s="col-12 col-md-"+Oe(e),o=document.createElement("div"),l=null;if(o.className=s,o.dataset.nodeId=e.id,y&&typeof y.createBoardItem=="function"){let f=y.createBoardItem(e,de(n,{listEl:r,defaultClassName:s,defaultContainerEl:o}));Ee(f)?o=f:f&&typeof f=="object"&&(o=f.containerEl||f.colEl||f.mountEl||o,l=f.bodyEl||f.contentEl||null);}return o.dataset.nodeId||(o.dataset.nodeId=e.id),o.className||(o.className=s),{containerEl:o,bodyEl:l}}function Fe(e,n,r){let s="lc-canvas-card card shadow-sm",o=document.createElement("div"),l=null;if(o.className=s,o.dataset.nodeId=e.id,o.style.left=r.x+"px",o.style.top=r.y+"px",r.w&&(o.style.width=r.w+"px"),r.h&&(o.style.height=r.h+"px"),y&&typeof y.createCanvasItem=="function"){let f=y.createCanvasItem(e,de(n,{defaultClassName:s,defaultContainerEl:o,position:r}));Ee(f)?o=f:f&&typeof f=="object"&&(o=f.containerEl||f.cardEl||f.mountEl||o,l=f.bodyEl||f.contentEl||null);}return o.dataset.nodeId||(o.dataset.nodeId=e.id),o.className||(o.className=s),o.style.left=r.x+"px",o.style.top=r.y+"px",r.w&&(o.style.width=r.w+"px"),r.h&&(o.style.height=r.h+"px"),{containerEl:o,bodyEl:l}}if(!document.getElementById("lc-board-css")){let e=document.createElement("style");e.id="lc-board-css",e.textContent=`
96
+ .lc-canvas-card { position:absolute; min-width:${M.minWidth}px; cursor:grab; user-select:none; z-index:1; }
95
97
  .lc-canvas-card.lc-dragging { cursor:grabbing; z-index:10; box-shadow:0 8px 24px rgba(0,0,0,0.18)!important; }
96
98
  .lc-canvas-card .card-body { overflow:hidden; }
97
99
  .lc-canvas-card.lc-resizing { cursor:nwse-resize; z-index:10; }
@@ -103,10 +105,10 @@
103
105
  @keyframes lc-edge-flow { to { stroke-dashoffset:-10; } }
104
106
  .lc-source-node { position:absolute; cursor:grab; user-select:none; z-index:1; }
105
107
  .lc-source-node.lc-dragging { cursor:grabbing; z-index:10; }
106
- `,document.head.appendChild(i);}function Ne(i){let o=i&&i.card?i.card.view:null;return o&&o.layout&&o.layout.board&&o.layout.board.col?o.layout.board.col:P}function te(){let i=I.positions||{};R.forEach((o,h)=>{if(!V[o.id])if(i[o.id])V[o.id]=Object.assign({},i[o.id]);else if(o.card&&o.card.view&&o.card.view.layout&&o.card.view.layout.canvas&&o.card.view.layout.canvas.x!=null)V[o.id]=Object.assign({},o.card.view.layout.canvas);else {let y=h%4,N=Math.floor(h/4);V[o.id]={x:y*c.gapX+c.padX,y:N*c.gapY+c.padY,w:c.defaultW};}});}function oe(i){return i&&i.card&&Array.isArray(i.card.requires)?i.card.requires:[]}function xe(i){return !i||!i.card?[i?i.id:""]:Array.isArray(i.card.provides)&&i.card.provides.length>0?i.card.provides.map(function(o){return typeof o=="string"?o:o.bindTo||o}):[i.id]}function ce(){var i={};return R.forEach(function(o){xe(o).forEach(function(h){i[h]=o.id;});}),i}function me(i,o){var h=[],y={};return oe(i).forEach(function(N){var E=o[N];E&&!y[E]&&(y[E]=true,h.push(E));}),h}function Ae(i){let o=document.createElement("div");o.className="modal d-block",o.style.cssText="position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); z-index: 10000; display: flex; align-items: center; justify-content: center;";let h=document.createElement("div");h.className="modal-dialog",h.style.cssText="width: 92%; max-width: 980px; max-height: 88vh; overflow: auto;";let y=document.createElement("div");y.className="modal-content";let N=document.createElement("div");N.className="modal-header",N.innerHTML=`<h5 class="modal-title">Card Inspector: ${L(i.card&&i.card.meta&&i.card.meta.title||i.id)}</h5><button type="button" class="btn-close" aria-label="Close"></button>`;let E=function(){o.remove();};N.querySelector(".btn-close").addEventListener("click",E);let g=document.createElement("div");g.className="modal-body",g.style.cssText="max-height: 64vh; overflow-y: auto;";let A=document.createElement("div");A.className="mb-4",A.innerHTML='<h6 class="fw-semibold mb-2">Card Definition (Read-only)</h6>';let e=i&&i.card?i.card:{};A.innerHTML+=`<pre style="background: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; font-size: 12px; white-space: pre-wrap; word-wrap: break-word;">${L(JSON.stringify(e,null,2))}</pre>`,g.appendChild(A);let t=document.createElement("div");t.className="mb-4",t.innerHTML='<h6 class="fw-semibold mb-2">Computed Values (Read-only)</h6>';let a=i.computed_values||{};t.innerHTML+=`<pre style="background: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; font-size: 12px; white-space: pre-wrap; word-wrap: break-word;">${L(JSON.stringify(a,null,2))}</pre>`,g.appendChild(t);let r=document.createElement("div");r.className="mb-4",r.innerHTML='<h6 class="fw-semibold mb-2">Requires (Read-only)</h6>';let p=i.requires||{};r.innerHTML+=`<pre style="background: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; font-size: 12px; white-space: pre-wrap; word-wrap: break-word;">${L(JSON.stringify(p,null,2))}</pre>`,g.appendChild(r);let n=document.createElement("div");n.className="mb-2",n.innerHTML='<h6 class="fw-semibold mb-2">Runtime Status (Read-only)</h6>';let l={status:i.card_data&&i.card_data.status,lastRun:i.card_data&&i.card_data.lastRun,error:i.card_data&&i.card_data.error};n.innerHTML+=`<pre style="background: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; font-size: 12px; white-space: pre-wrap; word-wrap: break-word;">${L(JSON.stringify(l,null,2))}</pre>`,g.appendChild(n);let s=document.createElement("div");s.className="modal-footer";let d=document.createElement("button");d.type="button",d.className="btn btn-secondary",d.textContent="Close",d.addEventListener("click",E),s.appendChild(d),y.appendChild(N),y.appendChild(g),y.appendChild(s),h.appendChild(y),o.appendChild(h),document.body.appendChild(o);}function we(i){let o=document.createElement("div"),h=i&&i.card?i.card:{},y=h.meta&&h.meta.simulation===true,N=h.meta&&h.meta._gandalfCard===true,E=i&&i.runtime_state&&i.runtime_state.task_status==="running",g=y?" lc-simulation-card":N?" lc-gandalf-card":"";o.className="card shadow-sm h-100"+g+(E?" lc-running":"");let A=document.createElement("div");A.className="card-header d-flex align-items-center gap-2 py-2";let e=h.meta&&h.meta.title||i.id,t=h.meta&&h.meta.tags||[],a="";if(h.source_defs&&h.source_defs.length&&!h.view){var r=h.source_defs[0]||{};a='<span class="badge bg-info text-dark ms-auto">'+L(r.kind||"source")+"</span>";}else t.length&&(a=t.map(s=>'<span class="badge bg-secondary ms-1">'+L(s)+"</span>").join(""));if(A.innerHTML='<strong class="small">'+L(e)+"</strong>"+a,N){let s=document.createElement("span");s.className="lc-gandalf-caret",s.title="Collapse / expand",s.innerHTML='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"/></svg>',A.appendChild(s);let d="lc-gandalf-collapsed:"+(i.id||e);sessionStorage.getItem(d)==="1"&&(o.classList.add("lc-collapsed"),A.dataset.gandalfCollapsed="1"),s.addEventListener("click",function(u){u.stopPropagation();let v=s.closest(".lc-gandalf-card")||o;v.classList.toggle("lc-collapsed"),sessionStorage.setItem(d,v.classList.contains("lc-collapsed")?"1":"0");}),s.addEventListener("pointerdown",u=>u.stopPropagation());}if(y){let s=document.createElement("span");s.className="d-inline-flex align-items-center gap-1 ms-auto";let d=document.createElement("button");d.className="btn btn-sm btn-outline-success lc-sim-pin",d.style.cssText="padding: 2px 6px;",d.innerHTML='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 17v5"/><path d="M9 2h6l-1 7h-4L9 2z"/><path d="M6 17h12l-2-4H8L6 17z"/></svg>',d.title="Pin this simulation card",d.dataset.nodeId=i.id;let u=document.createElement("button");u.className="btn btn-sm btn-outline-danger lc-sim-discard",u.style.cssText="padding: 2px 6px;",u.innerHTML='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',u.title="Discard this simulation card",u.dataset.nodeId=i.id,s.appendChild(d),s.appendChild(u),A.appendChild(s);}if(J.current){let s=document.createElement("button");s.className="btn btn-sm btn-outline-secondary",s.style.cssText="padding: 2px 6px;"+(y?"":" margin-left: auto;"),s.innerHTML="&lt;/&gt;",s.title="Inspect card data",s.addEventListener("click",function(d){d.stopPropagation(),Ae(i);}),A.appendChild(s);}let p=document.createElement("div");p.className="card-body p-2";let n=h.requires&&Array.isArray(h.requires)?h.requires:[],l=Array.isArray(h.provides)&&h.provides.length?h.provides.map(function(s){return typeof s=="string"?s:s.bindTo||s}):[i.id];if(n.length){let s=document.createElement("div");s.className="lc-token-row lc-token-row-requires",n.forEach(function(d){let u=document.createElement("span");u.className="lc-token-gem lc-token-gem-requires",u.dataset.token=d,u.title=d,s.appendChild(u);}),o.appendChild(s);}if(o.appendChild(A),o.appendChild(p),l.length){let s=document.createElement("div");s.className="lc-token-row lc-token-row-provides",l.forEach(function(d){let u=document.createElement("span");u.className="lc-token-gem lc-token-gem-provides",u.dataset.token=d,u.title=d,s.appendChild(u);}),o.appendChild(s);}return {wrap:o,header:A,body:p}}function Ee(i){let o=document.createElement("div");o.className="lc-source-node";let h=i.card_data&&i.card_data.status||"fresh",y=i&&i.card?i.card:{},N=y.meta&&y.meta.title||i.id,E=y.source_defs&&y.source_defs[0]&&y.source_defs[0].kind||"source";return o.innerHTML=`<div class="lc-source-pill shadow-sm">
107
- ${Ke(h)}
108
- <span class="fw-medium">${L(N)}</span>
109
- <span class="badge bg-info text-dark">${L(E)}</span>
110
- </div>`,o}function Ce(){var i=100,o=0,h=0;G.querySelectorAll(".lc-canvas-card,.lc-source-node").forEach(function(y){var N=y.offsetLeft+y.offsetWidth,E=y.offsetTop+y.offsetHeight;N>o&&(o=N),E>h&&(h=E);}),G.style.width=o+i+"px",G.style.height=h+i+"px";}function He(){ve(),document.body.style.overflow="",ae.innerHTML="",ae.appendChild(B),B.innerHTML="";let i=R.filter(o=>o.card&&o.card.view).slice();i.sort((o,h)=>{let y=o.card&&o.card.view&&o.card.view.layout&&o.card.view.layout.board&&o.card.view.layout.board.order||0,N=h.card&&h.card.view&&h.card.view.layout&&h.card.view.layout.board&&h.card.view.layout.board.order||0;return y-N}),i.forEach(o=>{let h=document.createElement("div");h.className="col-12 col-md-"+Ne(o),h.dataset.nodeId=o.id;let{wrap:y,body:N}=we(o);h.appendChild(y),B.appendChild(h),D[o.id]={node:o,colEl:h,bodyEl:N},T.render(o,N,{showChat:ie});}),_e();}function Le(){G.style.transform=`translate(${c.panX}px,${c.panY}px) scale(${c.zoom})`;}function _e(){var i=ce(),o={};R.forEach(function(y){var N=y.card_data||y.card&&y.card.card_data,E=y.computed_values,g=N&&N.status,A=N&&Object.keys(N).length>0||E&&Object.keys(E).length>0;o[y.id]=A||g==="fresh"||g==="completed";});var h=ae.querySelectorAll(".lc-token-gem");h.forEach(function(y){var N=y.dataset.token;if(N){if(y.classList.contains("lc-token-gem-provides")){var E=y.closest("[data-node-id]"),g=E&&E.dataset.nodeId;y.classList.toggle("lc-token-available",!!(g&&o[g]));}else if(y.classList.contains("lc-token-gem-requires")){var A=i[N];y.classList.toggle("lc-token-available",!!(A&&o[A]));}}});}function ve(){X.forEach(function(i){try{i.remove();}catch{}}),X.length=0;}function ue(){X.forEach(function(i){try{i.position();}catch{}});}function ye(){if(ve(),le.querySelectorAll("line,path").forEach(function(o){o.remove();}),!!c.edges){var i=ce();R.forEach(function(o){var h=D[o.id];!h||!h.colEl||oe(o).forEach(function(y){var N=i[y];if(N){var E=D[N];if(!(!E||!E.colEl)){var g=E.colEl.querySelector('.lc-token-gem-provides[data-token="'+y+'"]'),A=h.colEl.querySelector('.lc-token-gem-requires[data-token="'+y+'"]'),e,t,a,r,p=G.getBoundingClientRect();if(g){var n=g.getBoundingClientRect();e=(n.left+n.width/2-p.left)/c.zoom,t=(n.bottom-p.top)/c.zoom;}else {var l=E.colEl;e=l.offsetLeft+l.offsetWidth/2,t=l.offsetTop+l.offsetHeight;}if(A){var s=A.getBoundingClientRect();a=(s.left+s.width/2-p.left)/c.zoom,r=(s.top-p.top)/c.zoom;}else {var d=h.colEl;a=d.offsetLeft+d.offsetWidth/2,r=d.offsetTop;}var u=a-e,v=r-t,m=Math.sqrt(u*u+v*v),C=Math.max(40,Math.min(m*.4,120)),w=Math.abs(u),S=Math.abs(v),M,$,j,_;if(S>w*.4)M=e,$=t+C,j=a,_=r-C;else {var H=u>0?1:-1;M=e+H*C,$=t+C*.5,j=a-H*C,_=r-C*.5;}var ne="M "+e+" "+t+" C "+M+" "+$+", "+j+" "+_+", "+a+" "+r,Q=document.createElementNS("http://www.w3.org/2000/svg","path");Q.setAttribute("d",ne),Q.setAttribute("fill","none"),Q.setAttribute("marker-end","url(#lc-arrow)"),Q.classList.add("lc-edge-path"),le.appendChild(Q);}}});});}}function $e(i,o){let h,y,N,E,g=false;i.addEventListener("pointerdown",A=>{A.button===0&&(A.target.closest("input,textarea,select,button,a,.form-check-input")||(g=true,i.classList.add("lc-dragging"),i.setPointerCapture(A.pointerId),h=A.clientX,y=A.clientY,N=i.offsetLeft,E=i.offsetTop,A.preventDefault()));},{signal:Z}),i.addEventListener("pointermove",A=>{if(!g)return;let e=(A.clientX-h)/c.zoom,t=(A.clientY-y)/c.zoom;i.style.left=N+e+"px",i.style.top=E+t+"px",X.length?ue():ye();},{signal:Z}),i.addEventListener("pointerup",()=>{if(!g)return;g=false,i.classList.remove("lc-dragging");let A=i.offsetLeft,e=i.offsetTop;c.snap>1&&(A=Math.round(A/c.snap)*c.snap,e=Math.round(e/c.snap)*c.snap),i.style.left=A+"px",i.style.top=e+"px",V[o.id]=Object.assign(V[o.id]||{},{x:A,y:e}),o.card&&o.card.view&&(o.card.view.layout||(o.card.view.layout={}),o.card.view.layout.canvas||(o.card.view.layout.canvas={}),o.card.view.layout.canvas.x=A,o.card.view.layout.canvas.y=e),T.notify(o.id),Ce(),X.length?ue():ye();},{signal:Z});}function Ie(i,o){let h=document.createElement("div");h.className="lc-resize-handle",i.appendChild(h),i.style.overflow="visible";let y=false,N,E,g,A;h.addEventListener("pointerdown",function(e){e.button===0&&(e.stopPropagation(),e.preventDefault(),y=true,i.classList.add("lc-resizing"),h.setPointerCapture(e.pointerId),N=e.clientX,E=e.clientY,g=i.offsetWidth,A=i.offsetHeight);},{signal:Z}),h.addEventListener("pointermove",function(e){if(!y)return;let t=(e.clientX-N)/c.zoom,a=(e.clientY-E)/c.zoom,r=Math.max(c.minWidth,g+t),p=Math.max(80,A+a);i.style.width=r+"px",i.style.height=p+"px",X.length?ue():ye();},{signal:Z}),h.addEventListener("pointerup",function(){if(!y)return;y=false,i.classList.remove("lc-resizing");let e=i.offsetWidth,t=i.offsetHeight,a=c.snap>1?Math.round(e/c.snap)*c.snap:e,r=c.snap>1?Math.round(t/c.snap)*c.snap:t;i.style.width=a+"px",i.style.height=r+"px",V[o.id]=Object.assign(V[o.id]||{},{w:a,h:r}),o.card&&o.card.view&&(o.card.view.layout||(o.card.view.layout={}),o.card.view.layout.canvas||(o.card.view.layout.canvas={}),o.card.view.layout.canvas.w=a,o.card.view.layout.canvas.h=r),T.notify(o.id),Ce(),X.length?ue():ye();},{signal:Z});}function ze(){ve(),document.body.style.overflow="hidden",ae.innerHTML="",ae.appendChild(U);var i=U.getBoundingClientRect().top;U.style.height=F.height||"calc(100vh - "+i+"px)",G.querySelectorAll(".lc-canvas-card,.lc-source-node").forEach(g=>g.remove()),le.querySelectorAll("line,path").forEach(function(g){g.remove();}),te(),Le(),R.forEach(g=>{let A=V[g.id]||{x:0,y:0};if((!g.card||!g.card.view)&&g.card&&g.card.source_defs&&g.card.source_defs.length){let e=Ee(g);e.dataset.nodeId=g.id,e.style.left=A.x+"px",e.style.top=A.y+"px",G.appendChild(e),D[g.id]={node:g,colEl:e,bodyEl:null},$e(e,g);}else {let e=document.createElement("div"),t=g.card&&g.card.meta&&g.card.meta.simulation===true,a=g.card&&g.card.meta&&g.card.meta._gandalfCard===true,r=t?" lc-simulation-card":a?" lc-gandalf-card":"";e.className="lc-canvas-card card shadow-sm"+r,e.dataset.nodeId=g.id,e.style.left=A.x+"px",e.style.top=A.y+"px",A.w&&(e.style.width=A.w+"px"),A.h&&(e.style.height=A.h+"px");let{wrap:p,body:n}=we(g);for(;p.firstChild;)e.appendChild(p.firstChild);let l=e.querySelector(".card-header");l&&l.dataset.gandalfCollapsed==="1"&&e.classList.add("lc-collapsed"),G.appendChild(e),D[g.id]={node:g,colEl:e,bodyEl:n},T.render(g,n,{showChat:false}),$e(e,g),Ie(e,g);}}),_e(),requestAnimationFrame(function(){Ce(),ye();}),U.addEventListener("scroll",function(){ue();},{signal:Z,passive:true});let o=false,h,y,N,E;U.addEventListener("pointerdown",g=>{g.target!==U&&g.target!==G||(g.button===1||g.button===0&&g.ctrlKey)&&(o=true,U.setPointerCapture(g.pointerId),h=g.clientX,y=g.clientY,N=c.panX,E=c.panY,g.preventDefault());},{signal:Z}),U.addEventListener("pointermove",g=>{o&&(c.panX=N+(g.clientX-h),c.panY=E+(g.clientY-y),Le(),ue());},{signal:Z}),U.addEventListener("pointerup",()=>{o=false;},{signal:Z}),U.addEventListener("wheel",g=>{if(!g.ctrlKey)return;g.preventDefault();let A=g.deltaY>0?.9:1.1;c.zoom=Math.min(c.zoomMax,Math.max(c.zoomMin,c.zoom*A)),Le(),ue();},{signal:Z,passive:false});}function he(){Y.current==="canvas"?ze():He();}function Re(){let i=ce(),o={},h={};R.forEach(E=>{o[E.id]=[],h[E.id]=0;}),R.forEach(E=>{me(E,i).forEach(g=>{o[E.id]&&o[E.id].push(g);});});let y=true;for(;y;)y=false,R.forEach(E=>{(o[E.id]||[]).forEach(g=>{h[g]!=null&&h[g]+1>h[E.id]&&(h[E.id]=h[g]+1,y=true);});});let N={};R.forEach(E=>{let g=h[E.id]||0;N[g]||(N[g]=0);let A=N[g]++;V[E.id]={x:g*400+40,y:A*300+40,w:V[E.id]&&V[E.id].w||c.defaultW},E.view&&(E.view.layout||(E.view.layout={}),E.view.layout.canvas=Object.assign({},V[E.id]));}),Y.current==="canvas"&&ze();}function Oe(i){D[i.id]||(R.push(i),he());}function Fe(i){T.destroy(i);let o=R.findIndex(h=>h.id===i);o>=0&&R.splice(o,1),delete D[i],delete V[i],he();}function Pe(i){R.length=0,i.forEach(o=>{let h=D[o];h&&R.push(h.node);}),he();}function De(i,o){let h=D[i];if(!h)throw new Error("updateNode: unknown node id "+i);let y=h.node;if(o&&typeof o=="object"&&(o.card!==void 0&&(y.card=o.card),o.card_data!==void 0&&(y.card_data=o.card_data),o.requires!==void 0&&(y.requires=o.requires),o.computed_values!==void 0&&(y.computed_values=o.computed_values),o.runtime_state!==void 0&&(y.runtime_state=o.runtime_state)),T.destroy(i),Y.current==="board"){let N=h.colEl;N.innerHTML="";let E=we(y);N.appendChild(E.wrap),D[i]={node:y,colEl:N,bodyEl:E.body},T.render(y,E.body,{showChat:ie});}else {let N=h.colEl;N.innerHTML="";let E=we(y);for(;E.wrap.firstChild;)N.appendChild(E.wrap.firstChild);D[i]={node:y,colEl:N,bodyEl:E.body},T.render(y,E.body,{showChat:false});}_e();}function Ve(){ve(),T.destroyAll(),R.length=0,Object.keys(D).forEach(i=>delete D[i]),Object.keys(V).forEach(i=>delete V[i]),ae.innerHTML="";}function je(i){i!=="board"&&i!=="canvas"||(Y.current=i,he());}function We(i){J.current=!!i,he();}function Se(){ve(),document.body.style.overflow="",x.abort(),T.destroyAll(),R.length=0,Object.keys(D).forEach(i=>delete D[i]),ae.innerHTML="",ae.parentNode&&ae.parentNode.removeChild(ae);}return I.nodes&&I.nodes.length&&I.nodes.forEach(i=>R.push(i)),he(),{add:Oe,remove:Fe,reorder:Pe,updateNode:De,clear:Ve,setMode:je,setDevMode:We,autoLayout:Re,destroy:Se,get mode(){return Y.current},get devMode(){return J.current},get nodes(){return R.slice()},get engine(){return T}}}function it(T,k,I){I=I||{};let Y=I.initialState,J=I.getNodeIds,R=I.selectNode;if(typeof J!="function"||typeof R!="function")throw new Error("LiveCard.Board requires getNodeIds and selectNode functions");let D=Y,V={},ie={};function P(B){return B==null||typeof B!="object"?JSON.stringify(B):Array.isArray(B)?"["+B.map(P).join(",")+"]":"{"+Object.keys(B).sort().map(G=>JSON.stringify(G)+":"+P(B[G])).join(",")+"}"}function F(B){return !B||typeof B!="object"?"null":P({card:B.card,card_data:B.card_data,requires:B.requires,computed_values:B.computed_values,runtime_state:B.runtime_state})}let x=J(D).map(B=>{let U=R(D,B);return V[B]=U,ie[B]=F(U),U}),Z={};Object.keys(I).forEach(B=>{B==="initialState"||B==="getNodeIds"||B==="selectNode"||B==="nodes"||(Z[B]=I[B]);}),Z.nodes=x;let X=Ge(T,k,Z);function de(B,U){return B!==U}function Te(B){let U=typeof B=="function"?B(D):B;if(U===void 0)return;D=U;let G=J(D),le=new Set(G);Object.keys(V).forEach(te=>{le.has(te)||(X.remove(te),delete V[te],delete ie[te]);}),G.forEach(te=>{let oe=R(D,te),xe=V[te],ce=F(oe),me=ie[te];xe?de(me,ce)&&X.updateNode(te,oe):X.add(oe),V[te]=oe,ie[te]=ce;});let pe=X.nodes.map(te=>te.id);(G.length!==pe.length||G.some((te,oe)=>te!==pe[oe]))&&X.reorder(G);}function ae(){Object.keys(V).forEach(B=>delete V[B]),Object.keys(ie).forEach(B=>delete ie[B]),X.destroy();}return {setState:Te,destroy:ae,core:X,get state(){return D}}}return {init:rt,Board:it,BoardCore:Ge}})(),Ze=lt;typeof globalThis<"u"&&(globalThis.LiveCard=Ze);
108
+ `,document.head.appendChild(e);}function Oe(e){let n=e&&e.card?e.card.view:null;return n&&n.layout&&n.layout.board&&n.layout.board.col?n.layout.board.col:P}function Pe(e,n,r,s,o){let l=c.renderers&&c.renderers[n];if(!l){s.innerHTML='<div class="text-muted small">No builtin renderer for '+S(n)+"</div>";return}try{l(r,s,o||{kind:n},e);}catch(f){s.innerHTML='<div class="text-danger small">Builtin render error: '+S(f&&f.message)+"</div>";}}function De(e){return {chatState:ke(e),get chatMessages(){return ke(cfg.resolve(e.id)||e).messages},get isReceivingChats(){return !!(cfg.resolve(e.id)||e).card_chats&&!!(cfg.resolve(e.id)||e).card_chats.receiving},startReceivingChats:function(){c.startReceivingChatsForCard&&c.startReceivingChatsForCard(e.id);},stopReceivingChats:function(){c.stopReceivingChatsForCard&&c.stopReceivingChatsForCard(e.id);},renderBuiltin:function(n,r,s,o,l){Pe(n||e,r,s,o,l);}}}function _e(e,n,r){let s=Ce(e),o=s?be[s]:null;if(!o||!o.renderBody)return null;let l=De(e),f=null;o.createShell&&(f=o.createShell(e,{container:n,isCanvas:!!r}),f&&n.appendChild(f));let m=f||n;return o.renderBody(e,m,l),m}function Ve(){let e=L.positions||{};$.forEach((n,r)=>{if(!V[n.id])if(e[n.id])V[n.id]=Object.assign({},e[n.id]);else if(n.card&&n.card.view&&n.card.view.layout&&n.card.view.layout.canvas&&n.card.view.layout.canvas.x!=null)V[n.id]=Object.assign({},n.card.view.layout.canvas);else {let s=r%4,o=Math.floor(r/4);V[n.id]={x:s*M.gapX+M.padX,y:o*M.gapY+M.padY,w:M.defaultW};}});}function Be(e){return e&&e.card&&Array.isArray(e.card.requires)?e.card.requires:[]}function We(e){return !e||!e.card?[e?e.id:""]:Array.isArray(e.card.provides)&&e.card.provides.length>0?e.card.provides.map(function(n){return typeof n=="string"?n:n.bindTo||n}):[e.id]}function Le(){var e={};return $.forEach(function(n){We(n).forEach(function(r){e[r]=n.id;});}),e}function Ye(e,n){var r=[],s={};return Be(e).forEach(function(o){var l=n[o];l&&!s[l]&&(s[l]=true,r.push(l));}),r}function Xe(e){let n=document.createElement("div");n.className="modal d-block",n.style.cssText="position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); z-index: 10000; display: flex; align-items: center; justify-content: center;";let r=document.createElement("div");r.className="modal-dialog",r.style.cssText="width: 92%; max-width: 980px; max-height: 88vh; overflow: auto;";let s=document.createElement("div");s.className="modal-content";let o=document.createElement("div");o.className="modal-header",o.innerHTML=`<h5 class="modal-title">Card Inspector: ${S(e.card&&e.card.meta&&e.card.meta.title||e.id)}</h5><button type="button" class="btn-close" aria-label="Close"></button>`;let l=function(){n.remove();};o.querySelector(".btn-close").addEventListener("click",l);let f=document.createElement("div");f.className="modal-body",f.style.cssText="max-height: 64vh; overflow-y: auto;";let m=document.createElement("div");m.className="mb-4",m.innerHTML='<h6 class="fw-semibold mb-2">Card Definition (Read-only)</h6>';let d=e&&e.card?e.card:{};m.innerHTML+=`<pre style="background: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; font-size: 12px; white-space: pre-wrap; word-wrap: break-word;">${S(JSON.stringify(d,null,2))}</pre>`,f.appendChild(m);let x=document.createElement("div");x.className="mb-4",x.innerHTML='<h6 class="fw-semibold mb-2">Computed Values (Read-only)</h6>';let E=e.computed_values||{};x.innerHTML+=`<pre style="background: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; font-size: 12px; white-space: pre-wrap; word-wrap: break-word;">${S(JSON.stringify(E,null,2))}</pre>`,f.appendChild(x);let w=document.createElement("div");w.className="mb-4",w.innerHTML='<h6 class="fw-semibold mb-2">Requires (Read-only)</h6>';let C=e.requires||{};w.innerHTML+=`<pre style="background: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; font-size: 12px; white-space: pre-wrap; word-wrap: break-word;">${S(JSON.stringify(C,null,2))}</pre>`,f.appendChild(w);let j=document.createElement("div");j.className="mb-2",j.innerHTML='<h6 class="fw-semibold mb-2">Runtime Status (Read-only)</h6>';let Y={status:e.card_data&&e.card_data.status,lastRun:e.card_data&&e.card_data.lastRun,error:e.card_data&&e.card_data.error};j.innerHTML+=`<pre style="background: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; font-size: 12px; white-space: pre-wrap; word-wrap: break-word;">${S(JSON.stringify(Y,null,2))}</pre>`,f.appendChild(j);let _=document.createElement("div");_.className="modal-footer";let A=document.createElement("button");A.type="button",A.className="btn btn-secondary",A.textContent="Close",A.addEventListener("click",l),_.appendChild(A),s.appendChild(o),s.appendChild(f),s.appendChild(_),r.appendChild(s),n.appendChild(r),document.body.appendChild(n);}function ve(e){let n=document.createElement("div"),r=e&&e.card?e.card:{},s=r.meta&&r.meta.simulation===true,o=r.meta&&r.meta._gandalfCard===true,l=e&&e.runtime_state&&e.runtime_state.task_status==="running",f=s?" lc-simulation-card":o?" lc-gandalf-card":"";n.className="card shadow-sm h-100"+f+(l?" lc-running":"");let m=document.createElement("div");m.className="card-header d-flex align-items-center gap-2 py-2";let d=r.meta&&r.meta.title||e.id,x=r.meta&&r.meta.tags||[],E="";if(r.source_defs&&r.source_defs.length&&!r.view){var w=r.source_defs[0]||{};E='<span class="badge bg-info text-dark ms-auto">'+S(w.kind||"source")+"</span>";}else x.length&&(E=x.map(_=>'<span class="badge bg-secondary ms-1">'+S(_)+"</span>").join(""));if(m.innerHTML='<strong class="small">'+S(d)+"</strong>"+E,o){let _=document.createElement("span");_.className="lc-gandalf-caret",_.title="Collapse / expand",_.innerHTML='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="6 9 12 15 18 9"/></svg>',m.appendChild(_);let A="lc-gandalf-collapsed:"+(e.id||d);sessionStorage.getItem(A)==="1"&&(n.classList.add("lc-collapsed"),m.dataset.gandalfCollapsed="1"),_.addEventListener("click",function(b){b.stopPropagation();let g=_.closest(".lc-gandalf-card")||n;g.classList.toggle("lc-collapsed"),sessionStorage.setItem(A,g.classList.contains("lc-collapsed")?"1":"0");}),_.addEventListener("pointerdown",b=>b.stopPropagation());}if(s){let _=document.createElement("span");_.className="d-inline-flex align-items-center gap-1 ms-auto";let A=document.createElement("button");A.className="btn btn-sm btn-outline-success lc-sim-pin",A.style.cssText="padding: 2px 6px;",A.innerHTML='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 17v5"/><path d="M9 2h6l-1 7h-4L9 2z"/><path d="M6 17h12l-2-4H8L6 17z"/></svg>',A.title="Pin this simulation card",A.dataset.nodeId=e.id;let b=document.createElement("button");b.className="btn btn-sm btn-outline-danger lc-sim-discard",b.style.cssText="padding: 2px 6px;",b.innerHTML='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',b.title="Discard this simulation card",b.dataset.nodeId=e.id,_.appendChild(A),_.appendChild(b),m.appendChild(_);}if(B.current){let _=document.createElement("button");_.className="btn btn-sm btn-outline-secondary",_.style.cssText="padding: 2px 6px;"+(s?"":" margin-left: auto;"),_.innerHTML="&lt;/&gt;",_.title="Inspect card data",_.addEventListener("click",function(A){A.stopPropagation(),Xe(e);}),m.appendChild(_);}let C=document.createElement("div");C.className="card-body p-2";let j=r.requires&&Array.isArray(r.requires)?r.requires:[],Y=Array.isArray(r.provides)&&r.provides.length?r.provides.map(function(_){return typeof _=="string"?_:_.bindTo||_}):[e.id];if(j.length){let _=document.createElement("div");_.className="lc-token-row lc-token-row-requires",j.forEach(function(A){let b=document.createElement("span");b.className="lc-token-gem lc-token-gem-requires",b.dataset.token=A,b.title=A,_.appendChild(b);}),n.appendChild(_);}if(n.appendChild(m),n.appendChild(C),Y.length){let _=document.createElement("div");_.className="lc-token-row lc-token-row-provides",Y.forEach(function(A){let b=document.createElement("span");b.className="lc-token-gem lc-token-gem-provides",b.dataset.token=A,b.title=A,_.appendChild(b);}),n.appendChild(_);}return {wrap:n,header:m,body:C}}function Ke(e){let n=document.createElement("div");n.className="lc-source-node";let r=e.card_data&&e.card_data.status||"fresh",s=e&&e.card?e.card:{},o=s.meta&&s.meta.title||e.id,l=s.source_defs&&s.source_defs[0]&&s.source_defs[0].kind||"source";return n.innerHTML=`<div class="lc-source-pill shadow-sm">
109
+ ${rt(r)}
110
+ <span class="fw-medium">${S(o)}</span>
111
+ <span class="badge bg-info text-dark">${S(l)}</span>
112
+ </div>`,n}function Me(){var e=100,n=0,r=0;F.querySelectorAll(".lc-canvas-card,.lc-source-node").forEach(function(s){var o=s.offsetLeft+s.offsetWidth,l=s.offsetTop+s.offsetHeight;o>n&&(n=o),l>r&&(r=l);}),F.style.width=n+e+"px",F.style.height=r+e+"px";}function Je(){let e=le();ce(e),he(),document.body.style.overflow="";let n=qe(e);n.listEl.innerHTML="";let r=$.filter(s=>s.card&&s.card.view).slice();r.sort((s,o)=>{let l=s.card&&s.card.view&&s.card.view.layout&&s.card.view.layout.board&&s.card.view.layout.board.order||0,f=o.card&&o.card.view&&o.card.view.layout&&o.card.view.layout.board&&o.card.view.layout.board.order||0;return l-f}),r.forEach(s=>{let o=Re(s,e,n.listEl),l=o.containerEl,f=Ce(s),m=f?be[f]:null;if(m&&m.renderBody){n.listEl.appendChild(l);let d=_e(s,o.bodyEl||l,false);R[s.id]={node:s,colEl:l,bodyEl:d||l,isCustom:true};}else {let{wrap:d,body:x}=ve(s);(o.bodyEl||l).appendChild(d),n.listEl.appendChild(l),R[s.id]={node:s,colEl:l,bodyEl:x},c.render(s,x,{showChat:ne});}}),xe(),y&&typeof y.afterRenderBoard=="function"&&y.afterRenderBoard(de(e,{mountEl:n.mountEl,listEl:n.listEl,cards:r.slice(),nodeMap:R}));}function Te(){F.style.transform=`translate(${M.panX}px,${M.panY}px) scale(${M.zoom})`;}function xe(){var e=Le(),n={};$.forEach(function(s){var o=s.card_data||s.card&&s.card.card_data,l=s.computed_values,f=o&&o.status,m=o&&Object.keys(o).length>0||l&&Object.keys(l).length>0;n[s.id]=m||f==="fresh"||f==="completed";});var r=q.querySelectorAll(".lc-token-gem");r.forEach(function(s){var o=s.dataset.token;if(o){if(s.classList.contains("lc-token-gem-provides")){var l=s.closest("[data-node-id]"),f=l&&l.dataset.nodeId;s.classList.toggle("lc-token-available",!!(f&&n[f]));}else if(s.classList.contains("lc-token-gem-requires")){var m=e[o];s.classList.toggle("lc-token-available",!!(m&&n[m]));}}});}function he(){ae.forEach(function(e){try{e.remove();}catch{}}),ae.length=0;}function ie(){ae.forEach(function(e){try{e.position();}catch{}});}function ge(){if(he(),G.querySelectorAll("line,path").forEach(function(n){n.remove();}),!!M.edges){var e=Le();$.forEach(function(n){var r=R[n.id];!r||!r.colEl||Be(n).forEach(function(s){var o=e[s];if(o){var l=R[o];if(!(!l||!l.colEl)){var f=l.colEl.querySelector('.lc-token-gem-provides[data-token="'+s+'"]'),m=r.colEl.querySelector('.lc-token-gem-requires[data-token="'+s+'"]'),d,x,E,w,C=F.getBoundingClientRect();if(f){var j=f.getBoundingClientRect();d=(j.left+j.width/2-C.left)/M.zoom,x=(j.bottom-C.top)/M.zoom;}else {var Y=l.colEl;d=Y.offsetLeft+Y.offsetWidth/2,x=Y.offsetTop+Y.offsetHeight;}if(m){var _=m.getBoundingClientRect();E=(_.left+_.width/2-C.left)/M.zoom,w=(_.top-C.top)/M.zoom;}else {var A=r.colEl;E=A.offsetLeft+A.offsetWidth/2,w=A.offsetTop;}var b=E-d,g=w-x,T=Math.sqrt(b*b+g*g),N=Math.max(40,Math.min(T*.4,120)),D=Math.abs(b),I=Math.abs(g),re,O,K,Q;if(I>D*.4)re=d,O=x+N,K=E,Q=w-N;else {var oe=b>0?1:-1;re=d+oe*N,O=x+N*.5,K=E-oe*N,Q=w-N*.5;}var pe="M "+d+" "+x+" C "+re+" "+O+", "+K+" "+Q+", "+E+" "+w,te=document.createElementNS("http://www.w3.org/2000/svg","path");te.setAttribute("d",pe),te.setAttribute("fill","none"),te.setAttribute("marker-end","url(#lc-arrow)"),te.classList.add("lc-edge-path"),G.appendChild(te);}}});});}}function $e(e,n){let r,s,o,l,f=false;e.addEventListener("pointerdown",m=>{m.button===0&&(m.target.closest("input,textarea,select,button,a,.form-check-input")||(f=true,e.classList.add("lc-dragging"),e.setPointerCapture(m.pointerId),r=m.clientX,s=m.clientY,o=e.offsetLeft,l=e.offsetTop,m.preventDefault()));},{signal:ee}),e.addEventListener("pointermove",m=>{if(!f)return;let d=(m.clientX-r)/M.zoom,x=(m.clientY-s)/M.zoom;e.style.left=o+d+"px",e.style.top=l+x+"px",ae.length?ie():ge();},{signal:ee}),e.addEventListener("pointerup",()=>{if(!f)return;f=false,e.classList.remove("lc-dragging");let m=e.offsetLeft,d=e.offsetTop;M.snap>1&&(m=Math.round(m/M.snap)*M.snap,d=Math.round(d/M.snap)*M.snap),e.style.left=m+"px",e.style.top=d+"px",V[n.id]=Object.assign(V[n.id]||{},{x:m,y:d}),n.card&&n.card.view&&(n.card.view.layout||(n.card.view.layout={}),n.card.view.layout.canvas||(n.card.view.layout.canvas={}),n.card.view.layout.canvas.x=m,n.card.view.layout.canvas.y=d),c.notify(n.id),Me(),ae.length?ie():ge();},{signal:ee});}function Ne(e,n){let r=document.createElement("div");r.className="lc-resize-handle",e.appendChild(r),e.style.overflow="visible";let s=false,o,l,f,m;r.addEventListener("pointerdown",function(d){d.button===0&&(d.stopPropagation(),d.preventDefault(),s=true,e.classList.add("lc-resizing"),r.setPointerCapture(d.pointerId),o=d.clientX,l=d.clientY,f=e.offsetWidth,m=e.offsetHeight);},{signal:ee}),r.addEventListener("pointermove",function(d){if(!s)return;let x=(d.clientX-o)/M.zoom,E=(d.clientY-l)/M.zoom,w=Math.max(M.minWidth,f+x),C=Math.max(80,m+E);e.style.width=w+"px",e.style.height=C+"px",ae.length?ie():ge();},{signal:ee}),r.addEventListener("pointerup",function(){if(!s)return;s=false,e.classList.remove("lc-resizing");let d=e.offsetWidth,x=e.offsetHeight,E=M.snap>1?Math.round(d/M.snap)*M.snap:d,w=M.snap>1?Math.round(x/M.snap)*M.snap:x;e.style.width=E+"px",e.style.height=w+"px",V[n.id]=Object.assign(V[n.id]||{},{w:E,h:w}),n.card&&n.card.view&&(n.card.view.layout||(n.card.view.layout={}),n.card.view.layout.canvas||(n.card.view.layout.canvas={}),n.card.view.layout.canvas.w=E,n.card.view.layout.canvas.h=w),c.notify(n.id),Me(),ae.length?ie():ge();},{signal:ee});}function ze(){let e=le();ce(e),he(),document.body.style.overflow="hidden";let n=Se(e);var r=X.getBoundingClientRect().top;X.style.height=W.height||"calc(100vh - "+r+"px)",F.querySelectorAll(".lc-canvas-card,.lc-source-node").forEach(d=>d.remove()),G.querySelectorAll("line,path").forEach(function(d){d.remove();}),Ve(),Te(),$.forEach(d=>{let x=V[d.id]||{x:0,y:0};if((!d.card||!d.card.view)&&d.card&&d.card.source_defs&&d.card.source_defs.length){let E=Ke(d);E.dataset.nodeId=d.id,E.style.left=x.x+"px",E.style.top=x.y+"px",F.appendChild(E),R[d.id]={node:d,colEl:E,bodyEl:null},$e(E,d);}else {let E=Fe(d,e,x),w=E.containerEl,C=d.card&&d.card.meta&&d.card.meta.simulation===true,j=d.card&&d.card.meta&&d.card.meta._gandalfCard===true,Y=C?" lc-simulation-card":j?" lc-gandalf-card":"";w.className=ye(w.className||"lc-canvas-card card shadow-sm",Y);let _=Ce(d),A=_?be[_]:null;if(A&&A.renderBody){F.appendChild(w);let b=_e(d,E.bodyEl||w,true);R[d.id]={node:d,colEl:w,bodyEl:b||w,isCustom:true};}else {let{wrap:b,body:g}=ve(d),T=E.bodyEl||w;for(;b.firstChild;)T.appendChild(b.firstChild);let N=w.querySelector(".card-header");N&&N.dataset.gandalfCollapsed==="1"&&w.classList.add("lc-collapsed"),F.appendChild(w),R[d.id]={node:d,colEl:w,bodyEl:g},c.render(d,g,{showChat:false});}$e(w,d),Ne(w,d);}}),xe(),requestAnimationFrame(function(){Me(),ge();}),y&&typeof y.afterRenderCanvas=="function"&&y.afterRenderCanvas(de(e,{mountEl:n.mountEl,surfaceEl:n.surfaceEl,nodeMap:R})),X.addEventListener("scroll",function(){ie();},{signal:ee,passive:true});let s=false,o,l,f,m;X.addEventListener("pointerdown",d=>{d.target!==X&&d.target!==F||(d.button===1||d.button===0&&d.ctrlKey)&&(s=true,X.setPointerCapture(d.pointerId),o=d.clientX,l=d.clientY,f=M.panX,m=M.panY,d.preventDefault());},{signal:ee}),X.addEventListener("pointermove",d=>{s&&(M.panX=f+(d.clientX-o),M.panY=m+(d.clientY-l),Te(),ie());},{signal:ee}),X.addEventListener("pointerup",()=>{s=false;},{signal:ee}),X.addEventListener("wheel",d=>{if(!d.ctrlKey)return;d.preventDefault();let x=d.deltaY>0?.9:1.1;M.zoom=Math.min(M.zoomMax,Math.max(M.zoomMin,M.zoom*x)),Te(),ie();},{signal:ee,passive:false});}function ue(){H.current==="canvas"?ze():Je();}function Ue(){let e=Le(),n={},r={};$.forEach(l=>{n[l.id]=[],r[l.id]=0;}),$.forEach(l=>{Ye(l,e).forEach(f=>{n[l.id]&&n[l.id].push(f);});});let s=true;for(;s;)s=false,$.forEach(l=>{(n[l.id]||[]).forEach(f=>{r[f]!=null&&r[f]+1>r[l.id]&&(r[l.id]=r[f]+1,s=true);});});let o={};$.forEach(l=>{let f=r[l.id]||0;o[f]||(o[f]=0);let m=o[f]++;V[l.id]={x:f*400+40,y:m*300+40,w:V[l.id]&&V[l.id].w||M.defaultW},l.view&&(l.view.layout||(l.view.layout={}),l.view.layout.canvas=Object.assign({},V[l.id]));}),H.current==="canvas"&&ze();}function Ge(e){R[e.id]||($.push(e),ue());}function Qe(e){c.destroy(e);let n=$.findIndex(r=>r.id===e);n>=0&&$.splice(n,1),delete R[e],delete V[e],ue();}function t(e){$.length=0,e.forEach(n=>{let r=R[n];r&&$.push(r.node);}),ue();}function a(e,n){let r=R[e];if(!r)throw new Error("updateNode: unknown node id "+e);let s=r.node;if(n&&typeof n=="object"&&(n.card!==void 0&&(s.card=n.card),n.card_data!==void 0&&(s.card_data=n.card_data),n.requires!==void 0&&(s.requires=n.requires),n.computed_values!==void 0&&(s.computed_values=n.computed_values),n.runtime_state!==void 0&&(s.runtime_state=n.runtime_state),n.card_chats!==void 0&&(s.card_chats=n.card_chats)),y){ue();return}c.destroy(e);let o=Ce(s),l=o?be[o]:null;if(l&&l.renderBody){let f=r.colEl;f.innerHTML="";let m=_e(s,f,H.current==="canvas");R[e]={node:s,colEl:f,bodyEl:m||f,isCustom:true};}else if(H.current==="board"){let f=r.colEl;f.innerHTML="";let m=ve(s);f.appendChild(m.wrap),R[e]={node:s,colEl:f,bodyEl:m.body},c.render(s,m.body,{showChat:ne});}else {let f=r.colEl;f.innerHTML="";let m=ve(s);for(;m.wrap.firstChild;)f.appendChild(m.wrap.firstChild);R[e]={node:s,colEl:f,bodyEl:m.body},c.render(s,m.body,{showChat:false});}xe();}function u(){he(),c.destroyAll(),$.length=0,Object.keys(R).forEach(e=>delete R[e]),Object.keys(V).forEach(e=>delete V[e]),q.innerHTML="";}function h(e){e!=="board"&&e!=="canvas"||(H.current=e,ue());}function v(e){B.current=!!e,ue();}function i(){he(),document.body.style.overflow="",fe.abort(),J&&J.parentNode&&J.parentNode.removeChild(J),J=null,c.destroyAll(),$.length=0,Object.keys(R).forEach(e=>delete R[e]),q.innerHTML="",q.parentNode&&q.parentNode.removeChild(q);}return L.nodes&&L.nodes.length&&L.nodes.forEach(e=>$.push(e)),ue(),{add:Ge,remove:Qe,reorder:t,updateNode:a,clear:u,setMode:h,setDevMode:v,autoLayout:Ue,destroy:i,get mode(){return H.current},get devMode(){return B.current},get nodes(){return $.slice()},get engine(){return c}}}function Ct(c,p,L){L=L||{};let H=L.initialState,B=L.getNodeIds,$=L.selectNode;if(typeof B!="function"||typeof $!="function")throw new Error("LiveCard.Board requires getNodeIds and selectNode functions");let R=H,V={},ne={};function P(z){return z==null||typeof z!="object"?JSON.stringify(z):Array.isArray(z)?"["+z.map(P).join(",")+"]":"{"+Object.keys(z).sort().map(q=>JSON.stringify(q)+":"+P(z[q])).join(",")+"}"}function Z(z){return !z||typeof z!="object"?"null":P({card:z.card,card_data:z.card_data,requires:z.requires,computed_values:z.computed_values,runtime_state:z.runtime_state,card_chats:z.card_chats})}let k=B(R).map(z=>{let se=$(R,z);return V[z]=se,ne[z]=Z(se),se}),W={};Object.keys(L).forEach(z=>{z==="initialState"||z==="getNodeIds"||z==="selectNode"||z==="nodes"||(W[z]=L[z]);}),W.nodes=k;let M=ot(c,p,W);function fe(z,se){return z!==se}function ee(z){let se=typeof z=="function"?z(R):z;if(se===void 0)return;R=se;let q=B(R),J=new Set(q);Object.keys(V).forEach(F=>{J.has(F)||(M.remove(F),delete V[F],delete ne[F]);}),q.forEach(F=>{let G=$(R,F),me=V[F],le=Z(G),ce=ne[F];me?fe(ce,le)&&M.updateNode(F,G):M.add(G),V[F]=G,ne[F]=le;});let U=M.nodes.map(F=>F.id);(q.length!==U.length||q.some((F,G)=>F!==U[G]))&&M.reorder(q);}function ae(){Object.keys(V).forEach(z=>delete V[z]),Object.keys(ne).forEach(z=>delete ne[z]),M.destroy();}return {setState:ee,destroy:ae,core:M,get state(){return R}}}return {init:Et,Board:Ct,BoardCore:ot,registerCardRenderer:pt,registerBoardTheme:mt,registerBoardRenderer:ht}})(),dt=kt;typeof globalThis<"u"&&(globalThis.LiveCard=dt);
111
113
  })();//# sourceMappingURL=live-cards.js.map
112
114
  //# sourceMappingURL=live-cards.js.map
@@ -19,8 +19,8 @@
19
19
  <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
20
20
  <script src="https://cdn.jsdelivr.net/npm/dompurify/dist/purify.min.js"></script>
21
21
  <script src="https://cdn.jsdelivr.net/npm/leader-line/leader-line.min.js"></script>
22
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.0.5/browser/live-cards.js"></script>
23
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.0.5/browser/board-livecards-client.js"></script>
22
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.1.0/browser/live-cards.js"></script>
23
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.1.0/browser/board-livecards-client.js"></script>
24
24
  </head>
25
25
  <body class="bg-light">
26
26
  <div class="container-fluid py-3">
@@ -231,7 +231,7 @@ try {
231
231
 
232
232
  console.log('\n=== Step 2: start SSE worker ===');
233
233
  sseWorker = new Worker(SSE_WORKER_SCRIPT, {
234
- workerData: { sseUrl: `${BASE}/sse` },
234
+ workerData: { sseUrl: `${BASE}/sse?clientId=e2e-demo-sse` },
235
235
  });
236
236
  sseWorker.on('message', (msg) => {
237
237
  if (msg.type === 'frame') applyFrame(msg.payload);