yaml-flow 8.4.2 → 8.4.3

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,5 +1,5 @@
1
1
  {
2
- "generatedAt": "2026-05-18T05:02:11.939Z",
2
+ "generatedAt": "2026-05-18T10:33:27.336Z",
3
3
  "algorithm": "sha256",
4
4
  "files": {
5
5
  "browser/board-livecards-localstorage.js": {
@@ -71,22 +71,22 @@
71
71
  .lc-chart-wrap { min-height:150px; }
72
72
  .lc-chat-bubble { max-width:95%; }
73
73
  }
74
- `,document.head.appendChild(c);}let yt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function x(c){return c?String(c).replace(/[&<>"']/g,p=>yt[p]):""}let ye={},it={},ot={};function vt(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");ye[c]=p;}function wt(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");it[c]=p;}function xt(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");ot[c]=p;}function lt(c,p){return c?typeof c=="string"?p[c]||null:typeof c=="object"?c:null:null}function ve(){return Array.prototype.slice.call(arguments).filter(function(c){return typeof c=="string"&&c.trim()}).join(" ").trim()}function Re(c,p){return p?c?typeof c=="string"||typeof p=="string"?[c,p].filter(function(w){return typeof w=="string"&&w.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 ct(){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=ve(c.boardClass,p.boardClass,p.rootClass),c.listClass=ve(c.listClass,p.listClass,p.gridClass),c.canvasClass=ve(c.canvasClass,p.canvasClass),c.canvasInnerClass=ve(c.canvasInnerClass,p.canvasInnerClass),typeof p.styles=="string"&&p.styles.trim()&&(c.styles+=(c.styles?`
75
- `:"")+p.styles),c.boardStyle=Re(c.boardStyle,p.boardStyle||p.rootStyle),c.listStyle=Re(c.listStyle,p.listStyle||p.gridStyle),c.canvasStyle=Re(c.canvasStyle,p.canvasStyle),c.canvasInnerStyle=Re(c.canvasInnerStyle,p.canvasInnerStyle));}),c}function Ce(c,p,w,I,_){c.className=ve(p,w),c.style.cssText=typeof I=="string"?I:"",typeof _=="string"&&_.trim()?(c.style.cssText&&!/;\s*$/.test(c.style.cssText)&&(c.style.cssText+=";"),c.style.cssText+=_):_&&typeof _=="object"&&Object.keys(_).forEach(function(L){_[L]!=null&&(c.style[L]=_[L]);});}function ke(c){return !!(c&&typeof c=="object"&&c.nodeType===1)}function Et(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 Ct(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 Et(p)?p:null}function kt(c){let p=Array.isArray(c)?c:[];for(let w=0;w<p.length;w+=1){let I=Se(p[w]),_=I?ye[I]:null,L=Ct(_);if(L)return L}return null}function Se(c){let p=c&&c.card&&c.card.meta;return p&&(p.cardRenderer||p.card_renderer)||null}function ge(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(_){return !_||typeof _!="object"?null:{role:typeof _.role=="string"?_.role.toLowerCase():"system",text:typeof _.text=="string"?_.text:typeof _.message=="string"?_.message:"",files:Array.isArray(_.files)?_.files:[]}}).filter(Boolean),receiving:!!p.receiving,processing:!!p.processing}}function De(c){return !c||typeof c!="string"?[]:c.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean)}function St(c,p){if(!p||!c)return;let w=De(p),I=c;for(let _=0;_<w.length;_++){if(I==null)return;I=I[w[_]];}return I}function dt(c,p,w){let I=De(p);if(!I.length)return;let _=c;for(let L=0;L<I.length-1;L++)(_[I[L]]==null||typeof _[I[L]]!="object")&&(_[I[L]]={}),_=_[I[L]];_[I[I.length-1]]=w;}function ut(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="${x(c||"unknown")}"></span>`}function ft(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 _t(c){let p=String(c).match(/^(<=?|>=?|===?)\s*(.+)$/);return p?{op:p[1],value:parseFloat(p[2])}:null}function pt(c,p){let w=_t(p);if(!w||isNaN(w.value))return false;switch(w.op){case "<":return c<w.value;case "<=":return c<=w.value;case ">":return c>w.value;case ">=":return c>=w.value;case "=":case "==":case "===":return c===w.value}return false}function Lt(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 He=["#0d6efd","#198754","#ffc107","#dc3545","#6f42c1","#0dcaf0","#fd7e14","#20c997","#d63384","#6c757d"];function Mt(c){bt();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"},w={},I={},_={},L={},A={},q={};function ne(n){getComputedStyle(n).position==="static"&&(n.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>',n.appendChild(t);}let P={},G={},z=new Set,D=null,B={backdrop:null,title:null,closeBtn:null},k=new Set,Q=null,W=null,j={backdrop:null,title:null,closeBtn:null,currentNodeId:null};function S(n){if(!n)return "";let t=p.markdown?p.markdown(n):x(n);return p.sanitize?p.sanitize(t):t}function V(n){return w[n]||(w[n]={ac:new AbortController,timers:[],charts:[],unsubs:[]}),w[n]}function N(n){return (Array.isArray(n)?n:[]).map(function(e){if(!e||typeof e!="object")return null;let i=typeof e.role=="string"?e.role:"system",r=typeof e.text=="string"?e.text:typeof e.message=="string"?e.message:"",s=Array.isArray(e.files)?e.files:[];return {role:i.toLowerCase(),text:r,files:s}}).filter(Boolean)}function U(n){let t=Object.assign({placeholder:"Type a message...",showEmptyState:true,fileAttach:true,fileAccept:null,autoSubscribe:true},n&&n.options||{}),e={body:n.bodyEl,inputRow:n.inputRowEl,input:null,fileInput:null,staged:null,sendBtn:null,attachBtn:null,sendBtnIdleHtml:"",cardId:n.cardId||null,stagedFiles:[],loading:false,awaitingProcessingAck:false,disposed:false,isModal:!!n.isModal,options:t},i=t.fileAttach?'<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>':"";e.inputRow.innerHTML='<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">'+i+'<textarea class="form-control" data-lc-chat-input rows="1" placeholder="'+x(t.placeholder)+'"></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>',e.input=e.inputRow.querySelector("[data-lc-chat-input]"),e.fileInput=e.inputRow.querySelector("[data-lc-chat-file]"),e.staged=e.inputRow.querySelector("[data-lc-chat-staged]"),e.sendBtn=e.inputRow.querySelector("[data-lc-chat-send]"),e.attachBtn=e.inputRow.querySelector("[data-lc-chat-attach]"),e.sendBtnIdleHtml=e.sendBtn?e.sendBtn.innerHTML:"",t.fileAccept&&Array.isArray(t.fileAccept)&&e.fileInput&&e.fileInput.setAttribute("accept",t.fileAccept.join(","));function r(){e.input&&(e.input.style.height="auto",e.input.style.height=Math.min(e.input.scrollHeight,120)+"px");}e.resizeInput=r,e.syncComposerState=function(){let a=e.cardId?p.resolve(e.cardId):null,d=!!(a&&a.card_data&&a.card_data.features&&a.card_data.features.chat&&a.card_data.features.chat.disabled),u=!!ge(a).processing;e.input&&(e.input.disabled=d,e.input.placeholder=d?"Chat is disabled for this card.":t.placeholder),e.attachBtn&&(e.attachBtn.disabled=d||u),e.sendBtn&&(e.sendBtn.disabled=d||u||!!e.loading||!!e.awaitingProcessingAck);},e.setSendButtonPending=function(a){if(e.awaitingProcessingAck=!!a,!e.sendBtn){e.syncComposerState();return}a?(e.sendBtn.setAttribute("aria-label","Waiting for AI response"),e.sendBtn.innerHTML='<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>'):(e.sendBtn.innerHTML=e.sendBtnIdleHtml,e.sendBtn.setAttribute("aria-label","Send")),e.syncComposerState();},e.appendMessage=function(a,d,u){if(!e.body||!d&&!(Array.isArray(u)&&u.length))return;let m=a==="user"||a==="assistant"?a:"system",g=m==="user"?"lc-chat-bubble-user":m==="assistant"?"lc-chat-bubble-assistant":"lc-chat-bubble-system",v=document.createElement("div");if(v.className="lc-chat-bubble "+g,m!=="system"){let h='<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>',y='<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>',b=document.createElement("span");b.className="lc-chat-icon",b.setAttribute("aria-hidden","true"),b.innerHTML=m==="user"?h:y,v.appendChild(b);}let E=document.createElement("div");if(E.className="lc-chat-bubble-content",m==="assistant"?E.innerHTML=S(d||""):E.textContent=d||"",Array.isArray(u)&&u.length){let h=document.createElement("div");h.className="small mt-1 text-muted",h.textContent="\u{1F4CE} "+u.map(function(y){return y?typeof y=="string"?y:y.name||"file":"file"}).join(", "),E.appendChild(h);}v.appendChild(E),e.body.appendChild(v),e.body.scrollTop=e.body.scrollHeight;},e.appendPending=function(a){if(!e.body)return;let d=document.createElement("div");d.className="lc-chat-bubble lc-chat-bubble-user lc-chat-bubble-pending",d.setAttribute("data-lc-chat-pending","1"),d.textContent=a||"";let u=document.createElement("span");u.className="spinner-border spinner-border-sm",u.setAttribute("role","status"),u.setAttribute("aria-label","Sending"),d.appendChild(u),e.body.appendChild(d),e.body.scrollTop=e.body.scrollHeight;},e.clearPending=function(){e.body&&e.body.querySelectorAll('[data-lc-chat-pending="1"]').forEach(function(a){a&&a.parentNode&&a.parentNode.removeChild(a);});},e.syncProcessingBar=function(){if(!e.body)return;let a=e.cardId?p.resolve(e.cardId):null,d=!!ge(a).processing;e.syncComposerState();let u=e.body.querySelector(".lc-chat-processing");if(d){if(!u){let m='<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="12" r="9"/><path d="M12 7v5l3 2"/></svg>';u=document.createElement("div"),u.className="lc-chat-processing",u.innerHTML='<span class="lc-chat-icon" aria-hidden="true">'+m+'</span><span>AI working\u2026</span><span class="spinner-border spinner-border-sm" role="status" aria-label="AI working"></span>',e.body.appendChild(u);}e.body.scrollTop=e.body.scrollHeight;}else u&&u.remove();},e.refresh=function(){if(!e.body)return;if(!e.cardId){e.body.innerHTML="",e.syncComposerState();return}let a=p.resolve(e.cardId),d=[];a&&a.card_chats?d=ge(a).messages:a&&a.card_data&&Array.isArray(a.card_data.messages)&&(d=a.card_data.messages);let u=N(d);if(e.body.innerHTML="",!u.length){t.showEmptyState&&(e.body.innerHTML='<div class="text-muted small">No messages yet.</div>'),e.syncProcessingBar();return}u.forEach(function(m){e.appendMessage(m.role,m.text,m.files);}),e.syncProcessingBar();};function s(){if(e.staged){if(!e.stagedFiles.length){e.staged.innerHTML="";return}e.staged.innerHTML=e.stagedFiles.map(function(a,d){return '<span class="badge text-bg-light border me-1 mb-1">'+x(a.name||"file")+' <button type="button" class="btn btn-sm btn-link text-danger p-0 ms-1" data-lc-rm-file="'+d+'">&times;</button></span>'}).join(""),e.staged.querySelectorAll("[data-lc-rm-file]").forEach(function(a){a.addEventListener("click",function(){let d=parseInt(a.getAttribute("data-lc-rm-file")||"-1",10);d>=0&&e.stagedFiles.splice(d,1),s();});});}}e.renderStagedFiles=s;async function o(){if(e.loading||!e.cardId||e.disposed)return;let a=e.cardId,d=(e.input.value||"").trim(),u=e.stagedFiles.slice();if(!(!d&&!u.length)){e.loading=true,e.syncComposerState(),e.setSendButtonPending(true),e.appendPending(d),e.input.value="",e.stagedFiles=[],r(),s();try{await Promise.resolve(p.onAction(a,"chat-send",{text:d,files:u}));}catch(m){e.setSendButtonPending(false),e.clearPending(),e.appendMessage("system","Failed to send message: "+String(m&&m.message||m),[]);}finally{e.loading=false,e.syncComposerState();}}}e.sendMessage=o;let l=[];function f(a,d,u){a.addEventListener(d,u),l.push({t:a,e:d,h:u});}if(e.attachBtn&&e.fileInput&&(f(e.attachBtn,"click",function(){e.fileInput.click();}),f(e.fileInput,"change",function(a){let d=a.target&&a.target.files?Array.from(a.target.files):[];for(let u of d)e.stagedFiles.find(function(m){return m.name===u.name&&m.size===u.size&&m.lastModified===u.lastModified})||e.stagedFiles.push(u);a.target.value="",s();})),f(e.sendBtn,"click",o),f(e.input,"input",r),f(e.input,"keydown",function(a){if(a.key==="Enter"&&!a.shiftKey){if(e.sendBtn&&e.sendBtn.disabled)return;a.preventDefault(),o();}}),r(),e.dispose=function(){if(!e.disposed){if(e.disposed=true,l.forEach(function(a){try{a.t.removeEventListener(a.e,a.h);}catch{}}),l.length=0,z.delete(e),t.autoSubscribe&&e.cardId&&typeof p.stopReceivingChats=="function")try{p.stopReceivingChats(e.cardId);}catch{}e.stagedFiles=[];}},z.add(e),e.syncComposerState(),e.cardId&&t.autoSubscribe&&typeof p.startReceivingChats=="function")try{p.startReceivingChats(e.cardId);}catch{}return e.cardId&&e.refresh(),e}function le(){if(B.backdrop)return;let n=document.createElement("div");n.className="lc-chat-modal-backdrop",n.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" data-lc-chat-footer></div> </div></div>',document.body.appendChild(n);let t=n.querySelector("[data-lc-chat-body]"),e=n.querySelector("[data-lc-chat-footer]"),i=n.querySelector(".lc-chat-modal-title"),r=n.querySelector("[data-lc-chat-close]");B.backdrop=n,B.title=i,B.closeBtn=r,D=U({bodyEl:t,inputRowEl:e,cardId:null,isModal:true,options:{autoSubscribe:false}});let s=function(){let o=D?D.cardId:null;D&&(D.cardId=null,D.stagedFiles=[],D.staged&&(D.staged.innerHTML=""),D.input&&(D.input.value=""),D.setSendButtonPending(false),D.resizeInput()),n.classList.remove("lc-open"),o&&typeof p.stopReceivingChats=="function"&&p.stopReceivingChats(o);};r.addEventListener("click",s),n.addEventListener("click",function(o){o.target===n&&s();}),document.addEventListener("keydown",function(o){o.key==="Escape"&&n.classList.contains("lc-open")&&s();});}async function K(n){le();let t=p.resolve(n);if(!t)return;let e=t.card&&t.card.meta&&t.card.meta.title||t.id;D.cardId=n,B.title.textContent="Chat: "+e,D.body.innerHTML='<div class="text-muted small">Loading...</div>',B.backdrop.classList.add("lc-open"),D.syncComposerState(),D.input.disabled||D.input.focus(),typeof p.startReceivingChats=="function"&&p.startReceivingChats(n),D.refresh();}function T(n){if(n=n||{},!n.container)throw new Error("mountChatPane: container is required");if(!n.cardId)throw new Error("mountChatPane: cardId is required");let t=n.container;t.innerHTML="";let e=document.createElement("div");e.className="lc-chat-pane-body modal-body bg-light";let i=document.createElement("div");i.className="lc-chat-pane-input modal-footer flex-column align-items-stretch border-top p-3 gap-3",t.appendChild(e),t.appendChild(i);let r=U({bodyEl:e,inputRowEl:i,cardId:n.cardId,isModal:false,options:{placeholder:n.placeholder,showEmptyState:n.showEmptyState!==false,fileAttach:n.fileAttach!==false,fileAccept:n.fileAccept||null,autoSubscribe:n.autoSubscribe!==false}});return {refresh:function(){r.refresh();},dispose:function(){r.dispose();}}}function O(n){let t=p.resolve(n);return (t&&t.card_data&&Array.isArray(t.card_data.files)?t.card_data.files:[]).filter(Boolean)}function ae(n){let t=n?p.resolve(n):null;return !!(t&&t.card_data&&t.card_data.features&&t.card_data.features.files&&t.card_data.features.files.disabled)}function ce(n){let t=Object.assign({emptyText:"No files uploaded yet.",livePoll:true},n&&n.options||{}),e={kind:"files-list",container:n.container,cardId:n.cardId||null,isModal:!!n.isModal,disposed:false,pollingTimer:null,options:t};return e.refresh=function(){if(e.disposed||!e.container)return;if(!e.cardId){e.container.innerHTML="";return}let i=O(e.cardId);if(!i.length){e.container.innerHTML='<div class="alert alert-light border small mb-0">'+x(t.emptyText)+"</div>";return}let r='<div class="list-group list-group-flush">';i.forEach(function(s,o){let l=s&&(s.name||s.stored_name)?s.name||s.stored_name:"file",f=s&&typeof s.size=="number"?"size: "+s.size+" bytes":"",a=s&&s.stored_name?String(s.stored_name):"",d=a?p.fileUrlBase+"/cards/"+encodeURIComponent(e.cardId)+"/files/"+o+"?sn="+encodeURIComponent(a):null;r+='<div class="list-group-item d-flex align-items-center justify-content-between gap-2">',r+='<div class="text-truncate"><div class="small fw-medium">'+x(l)+"</div>",r+='<div class="small text-muted">'+x(f)+"</div></div>",d&&(r+='<a class="btn btn-sm btn-outline-secondary flex-shrink-0" href="'+d+'">Download</a>'),r+="</div>";}),r+="</div>",e.container.innerHTML=r;},e.dispose=function(){e.disposed||(e.disposed=true,e.pollingTimer&&(clearInterval(e.pollingTimer),e.pollingTimer=null),k.delete(e));},k.add(e),e.refresh(),t.livePoll&&(e.pollingTimer=setInterval(function(){e.refresh();},1e3)),e}function de(n){let t=Object.assign({placeholder:"Drop files here or click to browse",accept:null,showUploadedList:true,livePoll:true},n&&n.options||{}),e={kind:"files-upload",container:n.container,cardId:n.cardId||null,isModal:!!n.isModal,disposed:false,loading:false,stagedFiles:[],options:t,listPane:null};e.container.innerHTML="";let i=t.accept&&Array.isArray(t.accept)&&t.accept.length?' accept="'+x(t.accept.join(","))+'"':"";if(e.container.innerHTML='<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">'+x(t.placeholder)+'</div><input type="file" class="d-none" data-lc-files-input multiple'+i+'></div><div data-lc-files-staged class="small w-100 d-flex flex-wrap gap-2 mt-2"></div><div class="d-flex justify-content-end gap-2 w-100 mt-2"><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>',e.dropzone=e.container.querySelector("[data-lc-files-dz]"),e.fileInput=e.container.querySelector("[data-lc-files-input]"),e.staged=e.container.querySelector("[data-lc-files-staged]"),e.attachBtn=e.container.querySelector("[data-lc-files-attach]"),e.uploadBtn=e.container.querySelector("[data-lc-files-upload]"),t.showUploadedList||n.listPaneEl){let a;n.listPaneEl?a=n.listPaneEl:(a=document.createElement("div"),a.className="lc-files-uploaded-list mb-2",e.container.insertBefore(a,e.dropzone)),e.listPane=ce({container:a,cardId:e.cardId,isModal:e.isModal,options:{livePoll:t.livePoll}});}function r(){if(!e.stagedFiles.length){e.staged.innerHTML="";return}e.staged.innerHTML=e.stagedFiles.map(function(a,d){return '<span class="badge text-bg-light border me-1 mb-1">'+x(a.name||"file")+' <button type="button" class="btn btn-sm btn-link text-danger p-0 ms-1" data-lc-files-rm="'+d+'">&times;</button></span>'}).join(""),e.staged.querySelectorAll("[data-lc-files-rm]").forEach(function(a){a.addEventListener("click",function(){let d=parseInt(a.getAttribute("data-lc-files-rm")||"-1",10);d>=0&&e.stagedFiles.splice(d,1),r();});});}e.renderStagedFiles=r;function s(a){let d=Array.from(a||[]);for(let u of d){let m=u;e.stagedFiles.find(function(g){return g.name===m.name&&g.size===m.size&&g.lastModified===m.lastModified})||e.stagedFiles.push(m);}r();}e.syncDisabledState=function(){let a=ae(e.cardId);e.dropzone&&e.dropzone.classList.toggle("lc-disabled",a),e.attachBtn&&(e.attachBtn.disabled=a||e.loading),e.uploadBtn&&(e.uploadBtn.disabled=a||e.loading),e.fileInput&&(e.fileInput.disabled=a);};async function o(){if(e.loading||!e.cardId||!e.stagedFiles.length||e.disposed)return;let a=e.cardId,d=e.stagedFiles.slice();e.loading=true,e.uploadBtn.disabled=true,e.attachBtn.disabled=true,e.dropzone.classList.add("lc-disabled");try{await Promise.resolve(p.onAction(a,"file-upload",{files:d})),e.stagedFiles=[],r(),e.listPane&&e.listPane.refresh();}catch(u){e.staged.innerHTML='<span class="text-danger">Upload failed: '+x(String(u&&u.message||u))+"</span>";}finally{e.loading=false,e.syncDisabledState();}}e.uploadFiles=o;let l=[];function f(a,d,u){a.addEventListener(d,u),l.push({t:a,e:d,h:u});}return f(e.attachBtn,"click",function(){e.fileInput.click();}),f(e.fileInput,"change",function(a){s(a.target&&a.target.files?a.target.files:[]),a.target.value="";}),f(e.uploadBtn,"click",o),f(e.dropzone,"click",function(){!e.loading&&!ae(e.cardId)&&e.fileInput.click();}),f(e.dropzone,"dragover",function(a){a.preventDefault(),e.dropzone.classList.add("lc-drag-over");}),f(e.dropzone,"dragleave",function(){e.dropzone.classList.remove("lc-drag-over");}),f(e.dropzone,"drop",function(a){a.preventDefault(),e.dropzone.classList.remove("lc-drag-over"),!ae(e.cardId)&&s(a.dataTransfer&&a.dataTransfer.files?a.dataTransfer.files:[]);}),e.refresh=function(){e.disposed||(e.syncDisabledState(),e.listPane&&(e.listPane.cardId=e.cardId,e.listPane.refresh()));},e.dispose=function(){if(!e.disposed){if(e.disposed=true,l.forEach(function(a){try{a.t.removeEventListener(a.e,a.h);}catch{}}),l.length=0,e.listPane)try{e.listPane.dispose();}catch{}e.stagedFiles=[],k.delete(e);}},k.add(e),e.syncDisabledState(),e}function ze(){if(j.backdrop)return;let n=document.createElement("div");n.className="lc-files-modal-backdrop",n.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" data-lc-files-footer></div> </div></div>',document.body.appendChild(n);let t=n.querySelector("[data-lc-files-body]"),e=n.querySelector("[data-lc-files-footer]"),i=n.querySelector(".lc-files-modal-title"),r=n.querySelector("[data-lc-files-close]");j.backdrop=n,j.title=i,j.closeBtn=r,Q=de({container:e,cardId:null,isModal:true,listPaneEl:t,options:{showUploadedList:true,livePoll:false}}),W=Q.listPane;let s=function(){j.currentNodeId=null,Q&&(Q.cardId=null,Q.stagedFiles=[],Q.staged&&(Q.staged.innerHTML="")),W&&(W.cardId=null),n.classList.remove("lc-open"),j.pollingTimer&&(clearInterval(j.pollingTimer),j.pollingTimer=null);};r.addEventListener("click",s),n.addEventListener("click",function(o){o.target===n&&s();}),document.addEventListener("keydown",function(o){o.key==="Escape"&&n.classList.contains("lc-open")&&s();});}function ie(n){ze();let t=p.resolve(n);if(!t)return;let e=t.card&&t.card.meta&&t.card.meta.title||t.id;j.currentNodeId=n,j.title.textContent="Files: "+e,j.backdrop.classList.add("lc-open"),Q.cardId=n,W.cardId=n,Q.refresh(),j.pollingTimer&&clearInterval(j.pollingTimer),j.pollingTimer=setInterval(function(){W&&W.refresh();},1e3);}function We(n){if(n=n||{},!n.container)throw new Error("mountFilesUploadPane: container is required");if(!n.cardId)throw new Error("mountFilesUploadPane: cardId is required");let t=de({container:n.container,cardId:n.cardId,isModal:false,options:{placeholder:n.placeholder,accept:n.accept||null,showUploadedList:n.showUploadedList!==false,livePoll:n.livePoll!==false}});return {refresh:function(){t.refresh();},dispose:function(){t.dispose();}}}function Ve(n){if(n=n||{},!n.container)throw new Error("mountFilesListPane: container is required");if(!n.cardId)throw new Error("mountFilesListPane: cardId is required");let t=ce({container:n.container,cardId:n.cardId,isModal:false,options:{emptyText:n.emptyText||"No files uploaded yet.",livePoll:n.livePoll!==false}});return {refresh:function(){t.refresh();},dispose:function(){t.dispose();}}}function ue(n,t){if(!t||typeof t!="string")return;let e=De(t);if(!e.length)return;let i=e[0],r=e.slice(1).join("."),s={card:n&&n.card?n.card:{},card_data:n&&n.card_data?n.card_data:{},requires:n&&n.requires?n.requires:{},computed_values:n&&n.computed_values?n.computed_values:{},runtime_state:n&&n.runtime_state?n.runtime_state:{}};if(Object.prototype.hasOwnProperty.call(s,i))return r?St(s[i],r):s[i]}function we(n,t){let e=I[n];e&&e.forEach(i=>{try{i(n,t);}catch(r){console.error("LiveCard notify error",r);}});}function qe(n,t){return I[n]||(I[n]=new Set),I[n].add(t),()=>I[n].delete(t)}function Ye(n){let t=n&&n.card&&Array.isArray(n.card.requires)?n.card.requires:[];if(!t.length)return;let e=V(n.id),i={};Object.keys(I).concat(Object.keys(G)).forEach(function(l){let f=p.resolve(l);if(!(!f||!f.card)){var a=Array.isArray(f.card.provides)&&f.card.provides.length?f.card.provides.map(function(d){return typeof d=="string"?d:d.bindTo||d}):[f.id];a.forEach(function(d){i[d]=f.id;});}});let s={},o=[];t.forEach(function(l){var f=i[l]||l;s[f]||(s[f]=true,o.push(f));}),e.unsubs=o.map(l=>qe(l,()=>{let f=G[n.id];if(!f||!f.resultEl)return;let a=p.resolve(n.id);a&&(Be(a,f.resultEl),we(n.id));}));}function _e(n,t,e,i){let r=e.data||{};if(!Array.isArray(n)||!n.length){t.innerHTML=`<p class="text-muted small">${x(r.placeholder||"No data")}</p>`;return}let s=Math.min(n.length,r.maxRows||200),o=new Set;for(let g=0;g<Math.min(n.length,s);g++)Object.keys(n[g]).forEach(v=>o.add(v));let l=r.columns&&r.columns.length?r.columns:[...o],f=r.sortable!==false,a=null,d="asc",u=V(i.id);function m(){let g=n.slice(0,s);a!==null&&f&&(g=g.slice().sort((E,h)=>{let y=E[l[a]],b=h[l[a]];return y==null?1:b==null?-1:typeof y=="number"&&typeof b=="number"?d==="asc"?y-b:b-y:d==="asc"?String(y).localeCompare(String(b)):String(b).localeCompare(String(y))}));let v='<div class="table-responsive"><table class="table table-sm table-striped table-hover mb-0"><thead><tr>';l.forEach((E,h)=>{let y=a===h?d==="asc"?" \u2191":" \u2193":"";v+=`<th class="small text-nowrap"${f?' style="cursor:pointer"':""} data-col="${h}">${x(E)}${y}</th>`;}),v+="</tr></thead><tbody>",g.forEach(E=>{v+="<tr>",l.forEach(h=>{let y=E[h];v+=`<td class="small">${x(y!=null?String(y):"")}</td>`;}),v+="</tr>";}),v+="</tbody></table></div>",n.length>s&&(v+=`<p class="text-muted small mt-1">Showing ${s} of ${n.length} rows</p>`),t.innerHTML=v,f&&t.querySelectorAll("th[data-col]").forEach(E=>{E.addEventListener("click",()=>{let h=parseInt(E.dataset.col);a===h?d=d==="asc"?"desc":"asc":(a=h,d="asc"),m();},{signal:u.ac.signal});});}m();}function Le(n,t,e,i){let s=V(i.id).ac.signal,o=e.data||{},l=o.writeTo,f=l?ue(i,l)||{}:{},a=o.fields&&o.fields.properties||{},d=n&&typeof n=="object"&&!Array.isArray(n)?Object.keys(n):[];if(!d.length){t.innerHTML='<p class="text-muted small">No filter options</p>';return}let u='<div class="row g-2">';d.forEach(m=>{let g=Array.isArray(n[m])?n[m]:[],v=a[m]&&a[m].title||m;u+=`<div class="col-12 col-sm-6 col-md-4"><label class="form-label small mb-1">${x(v)}</label>`,u+=`<select class="form-select form-select-sm" data-fk="${x(m)}"><option value="">All</option>`,g.forEach(E=>{let h=String(E)===String(f[m]||"")?" selected":"";u+=`<option value="${x(String(E))}"${h}>${x(String(E))}</option>`;}),u+="</select></div>";}),u+="</div>",t.innerHTML=u,t.querySelectorAll("select[data-fk]").forEach(m=>{m.addEventListener("change",()=>{let g={};t.querySelectorAll("select[data-fk]").forEach(v=>{v.value&&(g[v.dataset.fk]=v.value);}),l&&dt(i,l,g),p.onPatchState(i.id,{fieldValues:g}),we(i.id,g);},{signal:s});});}function Xe(n,t,e){let i=e.label||"",r="\u2014",s="";n&&typeof n=="object"&&!Array.isArray(n)?(i=n.title||n.label||n.metric||i,r=n.value!=null?String(n.value):"\u2014",s=n.detail||""):n!=null&&(r=String(n));let o='<div class="text-center py-2">';i&&(o+=`<div class="text-muted small">${x(i)}</div>`),o+=`<div class="lc-metric-value">${x(r)}</div>`,s&&(o+=`<div class="small mt-1">${S(s)}</div>`),o+="</div>",t.innerHTML=o;}function Pe(n,t,e,i){let r=e.data||{};if(n==null){t.innerHTML="";return}if(typeof n=="object"&&!Array.isArray(n)){let s='<dl class="row mb-0">';Object.entries(n).forEach(([o,l])=>{s+=`<dt class="col-sm-5 small text-muted text-truncate">${x(o)}</dt>`,s+=`<dd class="col-sm-7 small mb-1">${x(l!=null?String(l):"\u2014")}</dd>`;}),t.innerHTML=s+"</dl>";return}if(Array.isArray(n)){if(!n.length){t.innerHTML=`<p class="text-muted small">${x(r.placeholder||"Empty")}</p>`;return}if(typeof n[0]=="string"||typeof n[0]=="number"){let s=r.maxRows||n.length,o='<ul class="list-unstyled mb-0">';n.slice(0,s).forEach(l=>{o+=`<li class="small mb-1">\u2022 ${x(String(l))}</li>`;}),t.innerHTML=o+"</ul>";return}_e(n,t,e,i);return}t.innerHTML=`<div class="small">${S(String(n))}</div>`;}function Ue(n,t,e,i){let r=e.data||{};if(!p.chartLib){_e(n,t,e,i);return}if(!Array.isArray(n)||!n.length){t.innerHTML='<p class="text-muted small">No chart data</p>';return}let s=V(i.id),o=e.id||"chart-"+Math.random().toString(36).slice(2,8),l=s.charts.findIndex(u=>u.key===o);l>=0&&(s.charts[l].inst.destroy(),s.charts.splice(l,1));let f=r.chartType||Lt(n);t.innerHTML='<div class="lc-chart-wrap"><canvas></canvas></div>';let a=t.querySelector("canvas").getContext("2d"),d;if(f==="pie"||f==="doughnut")d={type:f,data:{labels:n.map(u=>u.label||u.name||""),datasets:[{data:n.map(u=>u.value||0),backgroundColor:He.slice(0,n.length)}]}};else if(f==="line")d={type:"line",data:{labels:n.map(u=>u.x||u.date||u.label||""),datasets:[{label:e.label||"Value",data:n.map(u=>u.y||u.value||0),borderColor:He[0],tension:.3,fill:false}]}};else {let u=Object.keys(n[0]).filter(g=>typeof n[0][g]=="number"),m=Object.keys(n[0]).find(g=>typeof n[0][g]=="string");d={type:"bar",data:{labels:n.map(g=>g.label||g.name||(m?g[m]:"")),datasets:u.map((g,v)=>({label:g,data:n.map(E=>E[g]||0),backgroundColor:He[v%He.length]}))}};}d.options=Object.assign({responsive:true,maintainAspectRatio:false,plugins:{legend:{position:n.length>8?"bottom":"right"}}},r.chartOptions||{}),s.charts.push({key:o,inst:new p.chartLib(a,d)});}function Me(n,t,e,i){let s=V(i.id).ac.signal,o=e.data||{},l=o.writeTo,f=o.fields||{},a=f.properties||{},d=f.required||[],u=i.id+":"+(o.bind||l||""),m=n&&typeof n=="object"&&!Array.isArray(n)?Object.assign({},n):{};L[u]?(L[u].baseValues=m,Object.keys(L[u].journal).forEach(M=>{E(L[u].journal[M],m[M])&&delete L[u].journal[M];})):L[u]={baseValues:m,journal:{}};let g=L[u];function v(M,C){return M.type==="boolean"?!!C.checked:M.type==="number"||M.type==="integer"?C.value!==""?parseFloat(C.value):0:C.value}function E(M,C){return JSON.stringify(M)===JSON.stringify(C)}function h(){return Object.assign({},g.baseValues,g.journal)}function y(){return Object.keys(g.journal).length>0}function b(M){M.querySelectorAll("[data-key]").forEach(C=>{let $=C.dataset.key,X=a[$];if(!X)return;let Z=v(X,C),R=g.baseValues[$];E(Z,R)?delete g.journal[$]:g.journal[$]=Z;});}let F=document.createElement("form");F.className="row g-2",F.noValidate=true,Object.keys(a).forEach(M=>{let C=a[M],$=d.indexOf(M)>=0,X=["number","integer","boolean"].includes(C.type)||C.enum||C.format==="date",Z=document.createElement("div");Z.className=X?"col-12 col-md-6":"col-12";let R;if(C.type==="boolean"){let H=document.createElement("div");H.className="form-check mt-3",R=document.createElement("input"),R.type="checkbox",R.className="form-check-input";let J=document.createElement("label");J.className="form-check-label small",J.textContent=C.title||M,H.appendChild(R),H.appendChild(J),Z.appendChild(H);}else {let H=document.createElement("label");H.className="form-label small mb-1",H.textContent=C.title||M,Z.appendChild(H),C.enum?(R=document.createElement("select"),R.className="form-select form-select-sm",C.enum.forEach(J=>{let te=document.createElement("option");te.value=J,te.textContent=J,R.appendChild(te);})):C.type==="number"||C.type==="integer"?(R=document.createElement("input"),R.type="number",R.className="form-control form-control-sm",C.minimum!=null&&(R.min=C.minimum),C.maximum!=null&&(R.max=C.maximum),C.type==="integer"&&(R.step="1")):C.format==="date"?(R=document.createElement("input"),R.type="date",R.className="form-control form-control-sm"):(R=document.createElement("input"),R.type="text",R.className="form-control form-control-sm",C.placeholder&&(R.placeholder=C.placeholder)),Z.appendChild(R);}R.dataset.key=M,$&&(R.required=true);let se=h()[M];se!=null&&(C.type==="boolean"?R.checked=!!se:C.format==="date"?R.value=String(se).slice(0,10):R.value=se),F.appendChild(Z);});let re=document.createElement("div");re.className="col-12 mt-1";let Y=document.createElement("button");Y.type="button",Y.className="btn btn-sm btn-outline-secondary me-2"+(y()?"":" d-none"),Y.textContent="Discard";let ee=document.createElement("button");ee.type="submit",ee.className="btn btn-sm btn-primary"+(y()?"":" d-none"),ee.textContent="Save",re.appendChild(Y),re.appendChild(ee),F.appendChild(re),t.innerHTML="",t.appendChild(F),F.addEventListener("input",()=>{b(F);let M=y();ee.classList.toggle("d-none",!M),Y.classList.toggle("d-none",!M);},{signal:s}),F.addEventListener("submit",M=>{if(M.preventDefault(),!F.checkValidity()){F.classList.add("was-validated");return}b(F);let C=h();p.onPatchState(i.id,{fieldValues:C}),ee.textContent="Saving...",ne(t);},{signal:s}),Y.addEventListener("click",()=>{g.journal={},F.querySelectorAll("[data-key]").forEach(M=>{let C=M.dataset.key,$=a[C];if(!$)return;let X=g.baseValues[C];$.type==="boolean"?M.checked=!!X:$.format==="date"?M.value=X!=null?String(X).slice(0,10):"":M.value=X??"";}),Y.classList.add("d-none"),ee.classList.add("d-none");},{signal:s});}function Je(n,t,e,i){let s=V(i.id).ac.signal,o=e.data||{},l=o.writeTo,f=typeof n=="string"?n:"",a=i.id+":"+(o.bind||l||"");A[a]?(A[a].baseContent=f,A[a].journal===f&&(A[a].journal=null)):A[a]={baseContent:f,journal:null};let d=A[a];function u(){return d.journal!=null}function m(){return d.journal!=null?d.journal:d.baseContent}function g(b){d.journal=b===d.baseContent?null:b;}t.innerHTML=`
74
+ `,document.head.appendChild(c);}let yt={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};function x(c){return c?String(c).replace(/[&<>"']/g,p=>yt[p]):""}let be={},it={},lt={};function vt(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 wt(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");it[c]=p;}function xt(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");lt[c]=p;}function ot(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 Re(c,p){return p?c?typeof c=="string"||typeof p=="string"?[c,p].filter(function(w){return typeof w=="string"&&w.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 ct(){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?`
75
+ `:"")+p.styles),c.boardStyle=Re(c.boardStyle,p.boardStyle||p.rootStyle),c.listStyle=Re(c.listStyle,p.listStyle||p.gridStyle),c.canvasStyle=Re(c.canvasStyle,p.canvasStyle),c.canvasInnerStyle=Re(c.canvasInnerStyle,p.canvasInnerStyle));}),c}function Ce(c,p,w,I,_){c.className=ye(p,w),c.style.cssText=typeof I=="string"?I:"",typeof _=="string"&&_.trim()?(c.style.cssText&&!/;\s*$/.test(c.style.cssText)&&(c.style.cssText+=";"),c.style.cssText+=_):_&&typeof _=="object"&&Object.keys(_).forEach(function(L){_[L]!=null&&(c.style[L]=_[L]);});}function ke(c){return !!(c&&typeof c=="object"&&c.nodeType===1)}function Et(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 Ct(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 Et(p)?p:null}function kt(c){let p=Array.isArray(c)?c:[];for(let w=0;w<p.length;w+=1){let I=Se(p[w]),_=I?be[I]:null,L=Ct(_);if(L)return L}return null}function Se(c){let p=c&&c.card&&c.card.meta;return p&&(p.cardRenderer||p.card_renderer)||null}function me(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(_){return !_||typeof _!="object"?null:{role:typeof _.role=="string"?_.role.toLowerCase():"system",text:typeof _.text=="string"?_.text:typeof _.message=="string"?_.message:"",files:Array.isArray(_.files)?_.files:[]}}).filter(Boolean),receiving:!!p.receiving,processing:!!p.processing}}function De(c){return !c||typeof c!="string"?[]:c.replace(/\[(\d+)\]/g,".$1").split(".").filter(Boolean)}function St(c,p){if(!p||!c)return;let w=De(p),I=c;for(let _=0;_<w.length;_++){if(I==null)return;I=I[w[_]];}return I}function dt(c,p,w){let I=De(p);if(!I.length)return;let _=c;for(let L=0;L<I.length-1;L++)(_[I[L]]==null||typeof _[I[L]]!="object")&&(_[I[L]]={}),_=_[I[L]];_[I[I.length-1]]=w;}function ut(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="${x(c||"unknown")}"></span>`}function ft(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 _t(c){let p=String(c).match(/^(<=?|>=?|===?)\s*(.+)$/);return p?{op:p[1],value:parseFloat(p[2])}:null}function pt(c,p){let w=_t(p);if(!w||isNaN(w.value))return false;switch(w.op){case "<":return c<w.value;case "<=":return c<=w.value;case ">":return c>w.value;case ">=":return c>=w.value;case "=":case "==":case "===":return c===w.value}return false}function Lt(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 He=["#0d6efd","#198754","#ffc107","#dc3545","#6f42c1","#0dcaf0","#fd7e14","#20c997","#d63384","#6c757d"];function Mt(c){bt();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"},w={},I={},_={},L={},N={},q={};function ne(n){getComputedStyle(n).position==="static"&&(n.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>',n.appendChild(t);}let P={},G={},z=new Set,D=null,A={backdrop:null,title:null,closeBtn:null},k=new Set,Q=null,W=null,j={backdrop:null,title:null,closeBtn:null,currentNodeId:null};function S(n){if(!n)return "";let t=p.markdown?p.markdown(n):x(n);return p.sanitize?p.sanitize(t):t}function V(n){return w[n]||(w[n]={ac:new AbortController,timers:[],charts:[],unsubs:[]}),w[n]}function B(n){return (Array.isArray(n)?n:[]).map(function(e){if(!e||typeof e!="object")return null;let i=typeof e.role=="string"?e.role:"system",r=typeof e.text=="string"?e.text:typeof e.message=="string"?e.message:"",s=Array.isArray(e.files)?e.files:[];return {role:i.toLowerCase(),text:r,files:s}}).filter(Boolean)}function U(n){let t=Object.assign({placeholder:"Type a message...",showEmptyState:true,fileAttach:true,fileAccept:null,autoSubscribe:true},n&&n.options||{}),e={body:n.bodyEl,inputRow:n.inputRowEl,input:null,fileInput:null,staged:null,sendBtn:null,attachBtn:null,sendBtnIdleHtml:"",cardId:n.cardId||null,stagedFiles:[],loading:false,awaitingProcessingAck:false,disposed:false,isModal:!!n.isModal,options:t},i=t.fileAttach?'<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>':"";e.inputRow.innerHTML='<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">'+i+'<textarea class="form-control" data-lc-chat-input rows="1" placeholder="'+x(t.placeholder)+'"></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>',e.input=e.inputRow.querySelector("[data-lc-chat-input]"),e.fileInput=e.inputRow.querySelector("[data-lc-chat-file]"),e.staged=e.inputRow.querySelector("[data-lc-chat-staged]"),e.sendBtn=e.inputRow.querySelector("[data-lc-chat-send]"),e.attachBtn=e.inputRow.querySelector("[data-lc-chat-attach]"),e.sendBtnIdleHtml=e.sendBtn?e.sendBtn.innerHTML:"",t.fileAccept&&Array.isArray(t.fileAccept)&&e.fileInput&&e.fileInput.setAttribute("accept",t.fileAccept.join(","));function r(){e.input&&(e.input.style.height="auto",e.input.style.height=Math.min(e.input.scrollHeight,120)+"px");}e.resizeInput=r,e.syncComposerState=function(){let a=e.cardId?p.resolve(e.cardId):null,d=!!(a&&a.card_data&&a.card_data.features&&a.card_data.features.chat&&a.card_data.features.chat.disabled),u=!!me(a).processing;e.input&&(e.input.disabled=d,e.input.placeholder=d?"Chat is disabled for this card.":t.placeholder),e.attachBtn&&(e.attachBtn.disabled=d||u),e.sendBtn&&(e.sendBtn.disabled=d||u||!!e.loading||!!e.awaitingProcessingAck);},e.setSendButtonPending=function(a){if(e.awaitingProcessingAck=!!a,!e.sendBtn){e.syncComposerState();return}a?(e.sendBtn.setAttribute("aria-label","Waiting for AI response"),e.sendBtn.innerHTML='<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>'):(e.sendBtn.innerHTML=e.sendBtnIdleHtml,e.sendBtn.setAttribute("aria-label","Send")),e.syncComposerState();},e.appendMessage=function(a,d,u){if(!e.body||!d&&!(Array.isArray(u)&&u.length))return;let m=a==="user"||a==="assistant"?a:"system",g=m==="user"?"lc-chat-bubble-user":m==="assistant"?"lc-chat-bubble-assistant":"lc-chat-bubble-system",v=document.createElement("div");if(v.className="lc-chat-bubble "+g,m!=="system"){let h='<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>',y='<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>',b=document.createElement("span");b.className="lc-chat-icon",b.setAttribute("aria-hidden","true"),b.innerHTML=m==="user"?h:y,v.appendChild(b);}let E=document.createElement("div");if(E.className="lc-chat-bubble-content",m==="assistant"?E.innerHTML=S(d||""):E.textContent=d||"",Array.isArray(u)&&u.length){let h=document.createElement("div");h.className="small mt-1 text-muted",h.textContent="\u{1F4CE} "+u.map(function(y){return y?typeof y=="string"?y:y.name||"file":"file"}).join(", "),E.appendChild(h);}v.appendChild(E),e.body.appendChild(v),e.body.scrollTop=e.body.scrollHeight;},e.appendPending=function(a){if(!e.body)return;let d=document.createElement("div");d.className="lc-chat-bubble lc-chat-bubble-user lc-chat-bubble-pending",d.setAttribute("data-lc-chat-pending","1"),d.textContent=a||"";let u=document.createElement("span");u.className="spinner-border spinner-border-sm",u.setAttribute("role","status"),u.setAttribute("aria-label","Sending"),d.appendChild(u),e.body.appendChild(d),e.body.scrollTop=e.body.scrollHeight;},e.clearPending=function(){e.body&&e.body.querySelectorAll('[data-lc-chat-pending="1"]').forEach(function(a){a&&a.parentNode&&a.parentNode.removeChild(a);});},e.syncProcessingBar=function(){if(!e.body)return;let a=e.cardId?p.resolve(e.cardId):null,d=!!me(a).processing;e.syncComposerState();let u=e.body.querySelector(".lc-chat-processing");if(d){if(!u){let m='<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="12" r="9"/><path d="M12 7v5l3 2"/></svg>';u=document.createElement("div"),u.className="lc-chat-processing",u.innerHTML='<span class="lc-chat-icon" aria-hidden="true">'+m+'</span><span>AI working\u2026</span><span class="spinner-border spinner-border-sm" role="status" aria-label="AI working"></span>',e.body.appendChild(u);}e.body.scrollTop=e.body.scrollHeight;}else u&&u.remove();},e.refresh=function(){if(!e.body)return;if(!e.cardId){e.body.innerHTML="",e.syncComposerState();return}let a=p.resolve(e.cardId),d=[];a&&a.card_chats?d=me(a).messages:a&&a.card_data&&Array.isArray(a.card_data.messages)&&(d=a.card_data.messages);let u=B(d);if(e.body.innerHTML="",!u.length){t.showEmptyState&&(e.body.innerHTML='<div class="text-muted small">No messages yet.</div>'),e.syncProcessingBar();return}u.forEach(function(m){e.appendMessage(m.role,m.text,m.files);}),e.syncProcessingBar();};function s(){if(e.staged){if(!e.stagedFiles.length){e.staged.innerHTML="";return}e.staged.innerHTML=e.stagedFiles.map(function(a,d){return '<span class="badge text-bg-light border me-1 mb-1">'+x(a.name||"file")+' <button type="button" class="btn btn-sm btn-link text-danger p-0 ms-1" data-lc-rm-file="'+d+'">&times;</button></span>'}).join(""),e.staged.querySelectorAll("[data-lc-rm-file]").forEach(function(a){a.addEventListener("click",function(){let d=parseInt(a.getAttribute("data-lc-rm-file")||"-1",10);d>=0&&e.stagedFiles.splice(d,1),s();});});}}e.renderStagedFiles=s;async function l(){if(e.loading||!e.cardId||e.disposed)return;let a=e.cardId,d=(e.input.value||"").trim(),u=e.stagedFiles.slice();if(!(!d&&!u.length)){e.loading=true,e.syncComposerState(),e.setSendButtonPending(true),e.appendPending(d),e.input.value="",e.stagedFiles=[],r(),s();try{await Promise.resolve(p.onAction(a,"chat-send",{text:d,files:u}));}catch(m){e.setSendButtonPending(false),e.clearPending(),e.appendMessage("system","Failed to send message: "+String(m&&m.message||m),[]);}finally{e.loading=false,e.syncComposerState();}}}e.sendMessage=l;let o=[];function f(a,d,u){a.addEventListener(d,u),o.push({t:a,e:d,h:u});}if(e.attachBtn&&e.fileInput&&(f(e.attachBtn,"click",function(){e.fileInput.click();}),f(e.fileInput,"change",function(a){let d=a.target&&a.target.files?Array.from(a.target.files):[];for(let u of d)e.stagedFiles.find(function(m){return m.name===u.name&&m.size===u.size&&m.lastModified===u.lastModified})||e.stagedFiles.push(u);a.target.value="",s();})),f(e.sendBtn,"click",l),f(e.input,"input",r),f(e.input,"keydown",function(a){if(a.key==="Enter"&&!a.shiftKey){if(e.sendBtn&&e.sendBtn.disabled)return;a.preventDefault(),l();}}),r(),e.dispose=function(){if(!e.disposed){if(e.disposed=true,o.forEach(function(a){try{a.t.removeEventListener(a.e,a.h);}catch{}}),o.length=0,z.delete(e),t.autoSubscribe&&e.cardId&&typeof p.stopReceivingChats=="function")try{p.stopReceivingChats(e.cardId);}catch{}e.stagedFiles=[];}},z.add(e),e.syncComposerState(),e.cardId&&t.autoSubscribe&&typeof p.startReceivingChats=="function")try{p.startReceivingChats(e.cardId);}catch{}return e.cardId&&e.refresh(),e}function ve(){if(A.backdrop)return;let n=document.createElement("div");n.className="lc-chat-modal-backdrop",n.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" data-lc-chat-footer></div> </div></div>',document.body.appendChild(n);let t=n.querySelector("[data-lc-chat-body]"),e=n.querySelector("[data-lc-chat-footer]"),i=n.querySelector(".lc-chat-modal-title"),r=n.querySelector("[data-lc-chat-close]");A.backdrop=n,A.title=i,A.closeBtn=r,D=U({bodyEl:t,inputRowEl:e,cardId:null,isModal:true,options:{autoSubscribe:false}});let s=function(){let l=D?D.cardId:null;D&&(D.cardId=null,D.stagedFiles=[],D.staged&&(D.staged.innerHTML=""),D.input&&(D.input.value=""),D.setSendButtonPending(false),D.resizeInput()),n.classList.remove("lc-open"),l&&typeof p.stopReceivingChats=="function"&&p.stopReceivingChats(l);};r.addEventListener("click",s),n.addEventListener("click",function(l){l.target===n&&s();}),document.addEventListener("keydown",function(l){l.key==="Escape"&&n.classList.contains("lc-open")&&s();});}async function K(n){ve();let t=p.resolve(n);if(!t)return;let e=t.card&&t.card.meta&&t.card.meta.title||t.id;D.cardId=n,A.title.textContent="Chat: "+e,D.body.innerHTML='<div class="text-muted small">Loading...</div>',A.backdrop.classList.add("lc-open"),D.syncComposerState(),D.input.disabled||D.input.focus(),typeof p.startReceivingChats=="function"&&p.startReceivingChats(n),D.refresh();}function T(n){if(n=n||{},!n.container)throw new Error("mountChatPane: container is required");if(!n.cardId)throw new Error("mountChatPane: cardId is required");let t=n.container;t.innerHTML="";let e=document.createElement("div");e.className="lc-chat-pane-body modal-body bg-light";let i=document.createElement("div");i.className="lc-chat-pane-input modal-footer flex-column align-items-stretch border-top p-3 gap-3",t.appendChild(e),t.appendChild(i);let r=U({bodyEl:e,inputRowEl:i,cardId:n.cardId,isModal:false,options:{placeholder:n.placeholder,showEmptyState:n.showEmptyState!==false,fileAttach:n.fileAttach!==false,fileAccept:n.fileAccept||null,autoSubscribe:n.autoSubscribe!==false}});return {refresh:function(){r.refresh();},dispose:function(){r.dispose();}}}function O(n){let t=p.resolve(n);return (t&&t.card_data&&Array.isArray(t.card_data.files)?t.card_data.files:[]).filter(Boolean)}function ae(n){let t=n?p.resolve(n):null;return !!(t&&t.card_data&&t.card_data.features&&t.card_data.features.files&&t.card_data.features.files.disabled)}function oe(n){let t=Object.assign({emptyText:"No files uploaded yet.",livePoll:true},n&&n.options||{}),e={kind:"files-list",container:n.container,cardId:n.cardId||null,isModal:!!n.isModal,disposed:false,pollingTimer:null,options:t};return e.refresh=function(){if(e.disposed||!e.container)return;if(!e.cardId){e.container.innerHTML="";return}let i=O(e.cardId);if(!i.length){e.container.innerHTML='<div class="alert alert-light border small mb-0">'+x(t.emptyText)+"</div>";return}let r='<div class="list-group list-group-flush">';i.forEach(function(s,l){let o=s&&(s.name||s.stored_name)?s.name||s.stored_name:"file",f=s&&typeof s.size=="number"?"size: "+s.size+" bytes":"",a=s&&s.stored_name?String(s.stored_name):"",d=a?p.fileUrlBase+"/cards/"+encodeURIComponent(e.cardId)+"/files/"+l+"?sn="+encodeURIComponent(a):null;r+='<div class="list-group-item d-flex align-items-center justify-content-between gap-2">',r+='<div class="text-truncate"><div class="small fw-medium">'+x(o)+"</div>",r+='<div class="small text-muted">'+x(f)+"</div></div>",d&&(r+='<a class="btn btn-sm btn-outline-secondary flex-shrink-0" href="'+d+'">Download</a>'),r+="</div>";}),r+="</div>",e.container.innerHTML=r;},e.dispose=function(){e.disposed||(e.disposed=true,e.pollingTimer&&(clearInterval(e.pollingTimer),e.pollingTimer=null),k.delete(e));},k.add(e),e.refresh(),t.livePoll&&(e.pollingTimer=setInterval(function(){e.refresh();},1e3)),e}function he(n){let t=Object.assign({placeholder:"Drop files here or click to browse",accept:null,showUploadedList:true,livePoll:true},n&&n.options||{}),e={kind:"files-upload",container:n.container,cardId:n.cardId||null,isModal:!!n.isModal,disposed:false,loading:false,stagedFiles:[],options:t,listPane:null};e.container.innerHTML="";let i=t.accept&&Array.isArray(t.accept)&&t.accept.length?' accept="'+x(t.accept.join(","))+'"':"";if(e.container.innerHTML='<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">'+x(t.placeholder)+'</div><input type="file" class="d-none" data-lc-files-input multiple'+i+'></div><div data-lc-files-staged class="small w-100 d-flex flex-wrap gap-2 mt-2"></div><div class="d-flex justify-content-end gap-2 w-100 mt-2"><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>',e.dropzone=e.container.querySelector("[data-lc-files-dz]"),e.fileInput=e.container.querySelector("[data-lc-files-input]"),e.staged=e.container.querySelector("[data-lc-files-staged]"),e.attachBtn=e.container.querySelector("[data-lc-files-attach]"),e.uploadBtn=e.container.querySelector("[data-lc-files-upload]"),t.showUploadedList||n.listPaneEl){let a;n.listPaneEl?a=n.listPaneEl:(a=document.createElement("div"),a.className="lc-files-uploaded-list mb-2",e.container.insertBefore(a,e.dropzone)),e.listPane=oe({container:a,cardId:e.cardId,isModal:e.isModal,options:{livePoll:t.livePoll}});}function r(){if(!e.stagedFiles.length){e.staged.innerHTML="";return}e.staged.innerHTML=e.stagedFiles.map(function(a,d){return '<span class="badge text-bg-light border me-1 mb-1">'+x(a.name||"file")+' <button type="button" class="btn btn-sm btn-link text-danger p-0 ms-1" data-lc-files-rm="'+d+'">&times;</button></span>'}).join(""),e.staged.querySelectorAll("[data-lc-files-rm]").forEach(function(a){a.addEventListener("click",function(){let d=parseInt(a.getAttribute("data-lc-files-rm")||"-1",10);d>=0&&e.stagedFiles.splice(d,1),r();});});}e.renderStagedFiles=r;function s(a){let d=Array.from(a||[]);for(let u of d){let m=u;e.stagedFiles.find(function(g){return g.name===m.name&&g.size===m.size&&g.lastModified===m.lastModified})||e.stagedFiles.push(m);}r();}e.syncDisabledState=function(){let a=ae(e.cardId);e.dropzone&&e.dropzone.classList.toggle("lc-disabled",a),e.attachBtn&&(e.attachBtn.disabled=a||e.loading),e.uploadBtn&&(e.uploadBtn.disabled=a||e.loading),e.fileInput&&(e.fileInput.disabled=a);};async function l(){if(e.loading||!e.cardId||!e.stagedFiles.length||e.disposed)return;let a=e.cardId,d=e.stagedFiles.slice();e.loading=true,e.uploadBtn.disabled=true,e.attachBtn.disabled=true,e.dropzone.classList.add("lc-disabled");try{await Promise.resolve(p.onAction(a,"file-upload",{files:d})),e.stagedFiles=[],r(),e.listPane&&e.listPane.refresh();}catch(u){e.staged.innerHTML='<span class="text-danger">Upload failed: '+x(String(u&&u.message||u))+"</span>";}finally{e.loading=false,e.syncDisabledState();}}e.uploadFiles=l;let o=[];function f(a,d,u){a.addEventListener(d,u),o.push({t:a,e:d,h:u});}return f(e.attachBtn,"click",function(){e.fileInput.click();}),f(e.fileInput,"change",function(a){s(a.target&&a.target.files?a.target.files:[]),a.target.value="";}),f(e.uploadBtn,"click",l),f(e.dropzone,"click",function(){!e.loading&&!ae(e.cardId)&&e.fileInput.click();}),f(e.dropzone,"dragover",function(a){a.preventDefault(),e.dropzone.classList.add("lc-drag-over");}),f(e.dropzone,"dragleave",function(){e.dropzone.classList.remove("lc-drag-over");}),f(e.dropzone,"drop",function(a){a.preventDefault(),e.dropzone.classList.remove("lc-drag-over"),!ae(e.cardId)&&s(a.dataTransfer&&a.dataTransfer.files?a.dataTransfer.files:[]);}),e.refresh=function(){e.disposed||(e.syncDisabledState(),e.listPane&&(e.listPane.cardId=e.cardId,e.listPane.refresh()));},e.dispose=function(){if(!e.disposed){if(e.disposed=true,o.forEach(function(a){try{a.t.removeEventListener(a.e,a.h);}catch{}}),o.length=0,e.listPane)try{e.listPane.dispose();}catch{}e.stagedFiles=[],k.delete(e);}},k.add(e),e.syncDisabledState(),e}function ze(){if(j.backdrop)return;let n=document.createElement("div");n.className="lc-files-modal-backdrop",n.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" data-lc-files-footer></div> </div></div>',document.body.appendChild(n);let t=n.querySelector("[data-lc-files-body]"),e=n.querySelector("[data-lc-files-footer]"),i=n.querySelector(".lc-files-modal-title"),r=n.querySelector("[data-lc-files-close]");j.backdrop=n,j.title=i,j.closeBtn=r,Q=he({container:e,cardId:null,isModal:true,listPaneEl:t,options:{showUploadedList:true,livePoll:false}}),W=Q.listPane;let s=function(){j.currentNodeId=null,Q&&(Q.cardId=null,Q.stagedFiles=[],Q.staged&&(Q.staged.innerHTML="")),W&&(W.cardId=null),n.classList.remove("lc-open"),j.pollingTimer&&(clearInterval(j.pollingTimer),j.pollingTimer=null);};r.addEventListener("click",s),n.addEventListener("click",function(l){l.target===n&&s();}),document.addEventListener("keydown",function(l){l.key==="Escape"&&n.classList.contains("lc-open")&&s();});}function ie(n){ze();let t=p.resolve(n);if(!t)return;let e=t.card&&t.card.meta&&t.card.meta.title||t.id;j.currentNodeId=n,j.title.textContent="Files: "+e,j.backdrop.classList.add("lc-open"),Q.cardId=n,W.cardId=n,Q.refresh(),j.pollingTimer&&clearInterval(j.pollingTimer),j.pollingTimer=setInterval(function(){W&&W.refresh();},1e3);}function We(n){if(n=n||{},!n.container)throw new Error("mountFilesUploadPane: container is required");if(!n.cardId)throw new Error("mountFilesUploadPane: cardId is required");let t=he({container:n.container,cardId:n.cardId,isModal:false,options:{placeholder:n.placeholder,accept:n.accept||null,showUploadedList:n.showUploadedList!==false,livePoll:n.livePoll!==false}});return {refresh:function(){t.refresh();},dispose:function(){t.dispose();}}}function Ve(n){if(n=n||{},!n.container)throw new Error("mountFilesListPane: container is required");if(!n.cardId)throw new Error("mountFilesListPane: cardId is required");let t=oe({container:n.container,cardId:n.cardId,isModal:false,options:{emptyText:n.emptyText||"No files uploaded yet.",livePoll:n.livePoll!==false}});return {refresh:function(){t.refresh();},dispose:function(){t.dispose();}}}function ce(n,t){if(!t||typeof t!="string")return;let e=De(t);if(!e.length)return;let i=e[0],r=e.slice(1).join("."),s={card:n&&n.card?n.card:{},card_data:n&&n.card_data?n.card_data:{},requires:n&&n.requires?n.requires:{},computed_values:n&&n.computed_values?n.computed_values:{},runtime_state:n&&n.runtime_state?n.runtime_state:{}};if(Object.prototype.hasOwnProperty.call(s,i))return r?St(s[i],r):s[i]}function we(n,t){let e=I[n];e&&e.forEach(i=>{try{i(n,t);}catch(r){console.error("LiveCard notify error",r);}});}function qe(n,t){return I[n]||(I[n]=new Set),I[n].add(t),()=>I[n].delete(t)}function Ye(n){let t=n&&n.card&&Array.isArray(n.card.requires)?n.card.requires:[];if(!t.length)return;let e=V(n.id),i={};Object.keys(I).concat(Object.keys(G)).forEach(function(o){let f=p.resolve(o);if(!(!f||!f.card)){var a=Array.isArray(f.card.provides)&&f.card.provides.length?f.card.provides.map(function(d){return typeof d=="string"?d:d.bindTo||d}):[f.id];a.forEach(function(d){i[d]=f.id;});}});let s={},l=[];t.forEach(function(o){var f=i[o]||o;s[f]||(s[f]=true,l.push(f));}),e.unsubs=l.map(o=>qe(o,()=>{let f=G[n.id];if(!f||!f.resultEl)return;let a=p.resolve(n.id);a&&(Be(a,f.resultEl),we(n.id));}));}function _e(n,t,e,i){let r=e.data||{};if(!Array.isArray(n)||!n.length){t.innerHTML=`<p class="text-muted small">${x(r.placeholder||"No data")}</p>`;return}let s=Math.min(n.length,r.maxRows||200),l=new Set;for(let g=0;g<Math.min(n.length,s);g++)Object.keys(n[g]).forEach(v=>l.add(v));let o=r.columns&&r.columns.length?r.columns:[...l],f=r.sortable!==false,a=null,d="asc",u=V(i.id);function m(){let g=n.slice(0,s);a!==null&&f&&(g=g.slice().sort((E,h)=>{let y=E[o[a]],b=h[o[a]];return y==null?1:b==null?-1:typeof y=="number"&&typeof b=="number"?d==="asc"?y-b:b-y:d==="asc"?String(y).localeCompare(String(b)):String(b).localeCompare(String(y))}));let v='<div class="table-responsive"><table class="table table-sm table-striped table-hover mb-0"><thead><tr>';o.forEach((E,h)=>{let y=a===h?d==="asc"?" \u2191":" \u2193":"";v+=`<th class="small text-nowrap"${f?' style="cursor:pointer"':""} data-col="${h}">${x(E)}${y}</th>`;}),v+="</tr></thead><tbody>",g.forEach(E=>{v+="<tr>",o.forEach(h=>{let y=E[h];v+=`<td class="small">${x(y!=null?String(y):"")}</td>`;}),v+="</tr>";}),v+="</tbody></table></div>",n.length>s&&(v+=`<p class="text-muted small mt-1">Showing ${s} of ${n.length} rows</p>`),t.innerHTML=v,f&&t.querySelectorAll("th[data-col]").forEach(E=>{E.addEventListener("click",()=>{let h=parseInt(E.dataset.col);a===h?d=d==="asc"?"desc":"asc":(a=h,d="asc"),m();},{signal:u.ac.signal});});}m();}function Le(n,t,e,i){let s=V(i.id).ac.signal,l=e.data||{},o=l.writeTo,f=o?ce(i,o)||{}:{},a=l.fields&&l.fields.properties||{},d=n&&typeof n=="object"&&!Array.isArray(n)?Object.keys(n):[];if(!d.length){t.innerHTML='<p class="text-muted small">No filter options</p>';return}let u='<div class="row g-2">';d.forEach(m=>{let g=Array.isArray(n[m])?n[m]:[],v=a[m]&&a[m].title||m;u+=`<div class="col-12 col-sm-6 col-md-4"><label class="form-label small mb-1">${x(v)}</label>`,u+=`<select class="form-select form-select-sm" data-fk="${x(m)}"><option value="">All</option>`,g.forEach(E=>{let h=String(E)===String(f[m]||"")?" selected":"";u+=`<option value="${x(String(E))}"${h}>${x(String(E))}</option>`;}),u+="</select></div>";}),u+="</div>",t.innerHTML=u,t.querySelectorAll("select[data-fk]").forEach(m=>{m.addEventListener("change",()=>{let g={};t.querySelectorAll("select[data-fk]").forEach(v=>{v.value&&(g[v.dataset.fk]=v.value);}),o&&dt(i,o,g),p.onPatchState(i.id,{fieldValues:g}),we(i.id,g);},{signal:s});});}function Xe(n,t,e){let i=e.label||"",r="\u2014",s="";n&&typeof n=="object"&&!Array.isArray(n)?(i=n.title||n.label||n.metric||i,r=n.value!=null?String(n.value):"\u2014",s=n.detail||""):n!=null&&(r=String(n));let l='<div class="text-center py-2">';i&&(l+=`<div class="text-muted small">${x(i)}</div>`),l+=`<div class="lc-metric-value">${x(r)}</div>`,s&&(l+=`<div class="small mt-1">${S(s)}</div>`),l+="</div>",t.innerHTML=l;}function Pe(n,t,e,i){let r=e.data||{};if(n==null){t.innerHTML="";return}if(typeof n=="object"&&!Array.isArray(n)){let s='<dl class="row mb-0">';Object.entries(n).forEach(([l,o])=>{s+=`<dt class="col-sm-5 small text-muted text-truncate">${x(l)}</dt>`,s+=`<dd class="col-sm-7 small mb-1">${x(o!=null?String(o):"\u2014")}</dd>`;}),t.innerHTML=s+"</dl>";return}if(Array.isArray(n)){if(!n.length){t.innerHTML=`<p class="text-muted small">${x(r.placeholder||"Empty")}</p>`;return}if(typeof n[0]=="string"||typeof n[0]=="number"){let s=r.maxRows||n.length,l='<ul class="list-unstyled mb-0">';n.slice(0,s).forEach(o=>{l+=`<li class="small mb-1">\u2022 ${x(String(o))}</li>`;}),t.innerHTML=l+"</ul>";return}_e(n,t,e,i);return}t.innerHTML=`<div class="small">${S(String(n))}</div>`;}function Ue(n,t,e,i){let r=e.data||{};if(!p.chartLib){_e(n,t,e,i);return}if(!Array.isArray(n)||!n.length){t.innerHTML='<p class="text-muted small">No chart data</p>';return}let s=V(i.id),l=e.id||"chart-"+Math.random().toString(36).slice(2,8),o=s.charts.findIndex(u=>u.key===l);o>=0&&(s.charts[o].inst.destroy(),s.charts.splice(o,1));let f=r.chartType||Lt(n);t.innerHTML='<div class="lc-chart-wrap"><canvas></canvas></div>';let a=t.querySelector("canvas").getContext("2d"),d;if(f==="pie"||f==="doughnut")d={type:f,data:{labels:n.map(u=>u.label||u.name||""),datasets:[{data:n.map(u=>u.value||0),backgroundColor:He.slice(0,n.length)}]}};else if(f==="line")d={type:"line",data:{labels:n.map(u=>u.x||u.date||u.label||""),datasets:[{label:e.label||"Value",data:n.map(u=>u.y||u.value||0),borderColor:He[0],tension:.3,fill:false}]}};else {let u=Object.keys(n[0]).filter(g=>typeof n[0][g]=="number"),m=Object.keys(n[0]).find(g=>typeof n[0][g]=="string");d={type:"bar",data:{labels:n.map(g=>g.label||g.name||(m?g[m]:"")),datasets:u.map((g,v)=>({label:g,data:n.map(E=>E[g]||0),backgroundColor:He[v%He.length]}))}};}d.options=Object.assign({responsive:true,maintainAspectRatio:false,plugins:{legend:{position:n.length>8?"bottom":"right"}}},r.chartOptions||{}),s.charts.push({key:l,inst:new p.chartLib(a,d)});}function Me(n,t,e,i){let s=V(i.id).ac.signal,l=e.data||{},o=l.writeTo,f=l.fields||{},a=f.properties||{},d=f.required||[],u=i.id+":"+(l.bind||o||""),m=n&&typeof n=="object"&&!Array.isArray(n)?Object.assign({},n):{};L[u]?(L[u].baseValues=m,Object.keys(L[u].journal).forEach(M=>{E(L[u].journal[M],m[M])&&delete L[u].journal[M];})):L[u]={baseValues:m,journal:{}};let g=L[u];function v(M,C){return M.type==="boolean"?!!C.checked:M.type==="number"||M.type==="integer"?C.value!==""?parseFloat(C.value):0:C.value}function E(M,C){return JSON.stringify(M)===JSON.stringify(C)}function h(){return Object.assign({},g.baseValues,g.journal)}function y(){return Object.keys(g.journal).length>0}function b(M){M.querySelectorAll("[data-key]").forEach(C=>{let $=C.dataset.key,X=a[$];if(!X)return;let Z=v(X,C),R=g.baseValues[$];E(Z,R)?delete g.journal[$]:g.journal[$]=Z;});}let F=document.createElement("form");F.className="row g-2",F.noValidate=true,Object.keys(a).forEach(M=>{let C=a[M],$=d.indexOf(M)>=0,X=["number","integer","boolean"].includes(C.type)||C.enum||C.format==="date",Z=document.createElement("div");Z.className=X?"col-12 col-md-6":"col-12";let R;if(C.type==="boolean"){let H=document.createElement("div");H.className="form-check mt-3",R=document.createElement("input"),R.type="checkbox",R.className="form-check-input";let J=document.createElement("label");J.className="form-check-label small",J.textContent=C.title||M,H.appendChild(R),H.appendChild(J),Z.appendChild(H);}else {let H=document.createElement("label");H.className="form-label small mb-1",H.textContent=C.title||M,Z.appendChild(H),C.enum?(R=document.createElement("select"),R.className="form-select form-select-sm",C.enum.forEach(J=>{let te=document.createElement("option");te.value=J,te.textContent=J,R.appendChild(te);})):C.type==="number"||C.type==="integer"?(R=document.createElement("input"),R.type="number",R.className="form-control form-control-sm",C.minimum!=null&&(R.min=C.minimum),C.maximum!=null&&(R.max=C.maximum),C.type==="integer"&&(R.step="1")):C.format==="date"?(R=document.createElement("input"),R.type="date",R.className="form-control form-control-sm"):(R=document.createElement("input"),R.type="text",R.className="form-control form-control-sm",C.placeholder&&(R.placeholder=C.placeholder)),Z.appendChild(R);}R.dataset.key=M,$&&(R.required=true);let se=h()[M];se!=null&&(C.type==="boolean"?R.checked=!!se:C.format==="date"?R.value=String(se).slice(0,10):R.value=se),F.appendChild(Z);});let re=document.createElement("div");re.className="col-12 mt-1";let Y=document.createElement("button");Y.type="button",Y.className="btn btn-sm btn-outline-secondary me-2"+(y()?"":" d-none"),Y.textContent="Discard";let ee=document.createElement("button");ee.type="submit",ee.className="btn btn-sm btn-primary"+(y()?"":" d-none"),ee.textContent="Save",re.appendChild(Y),re.appendChild(ee),F.appendChild(re),t.innerHTML="",t.appendChild(F),F.addEventListener("input",()=>{b(F);let M=y();ee.classList.toggle("d-none",!M),Y.classList.toggle("d-none",!M);},{signal:s}),F.addEventListener("submit",M=>{if(M.preventDefault(),!F.checkValidity()){F.classList.add("was-validated");return}b(F);let C=h();p.onPatchState(i.id,{fieldValues:C}),ee.textContent="Saving...",ne(t);},{signal:s}),Y.addEventListener("click",()=>{g.journal={},F.querySelectorAll("[data-key]").forEach(M=>{let C=M.dataset.key,$=a[C];if(!$)return;let X=g.baseValues[C];$.type==="boolean"?M.checked=!!X:$.format==="date"?M.value=X!=null?String(X).slice(0,10):"":M.value=X??"";}),Y.classList.add("d-none"),ee.classList.add("d-none");},{signal:s});}function Je(n,t,e,i){let s=V(i.id).ac.signal,l=e.data||{},o=l.writeTo,f=typeof n=="string"?n:"",a=i.id+":"+(l.bind||o||"");N[a]?(N[a].baseContent=f,N[a].journal===f&&(N[a].journal=null)):N[a]={baseContent:f,journal:null};let d=N[a];function u(){return d.journal!=null}function m(){return d.journal!=null?d.journal:d.baseContent}function g(b){d.journal=b===d.baseContent?null:b;}t.innerHTML=`
76
76
  <textarea class="form-control form-control-sm lc-notes-textarea" rows="8" placeholder="Write markdown...">${x(m())}</textarea>
77
77
  <div class="mt-2">
78
78
  <button class="btn btn-sm btn-outline-secondary me-2 lc-n-discard${u()?"":" d-none"}" type="button">Discard</button>
79
79
  <button class="btn btn-sm btn-primary lc-n-save${u()?"":" d-none"}" type="button">Save</button>
80
- </div>`;let v=t.querySelector(".lc-notes-textarea"),E=t.querySelector(".lc-n-discard"),h=t.querySelector(".lc-n-save");function y(){let b=u();h.classList.toggle("d-none",!b),E.classList.toggle("d-none",!b);}v.addEventListener("input",()=>{g(v.value),y();},{signal:s}),h.addEventListener("click",()=>{let b=v.value;p.onPatchState(i.id,{fieldValues:{notes:b}}),h.textContent="Saving...",ne(t);},{signal:s}),E.addEventListener("click",()=>{d.journal=null,v.value=d.baseContent||"",y();},{signal:s});}function Ke(n,t,e,i){let s=V(i.id).ac.signal,o=e.data||{},l=o.writeTo||(typeof o.bind=="string"&&o.bind.startsWith("card_data.")?o.bind:void 0),f=o.schema&&o.schema.properties||{},a=o.addRow!==false,d=o.deleteRow!==false;function u(M){if(o.columns&&o.columns.length)return o.columns;let C=new Set;return M.forEach($=>{$&&typeof $=="object"&&Object.keys($).forEach(X=>C.add(X));}),[...C]}let m=i.id+":"+(o.bind||l||""),v=(Array.isArray(n)?n:[]).map(M=>Object.assign({},M));_[m]?(_[m].baseRows=v,_[m].journalRows&&JSON.stringify(_[m].journalRows)===JSON.stringify(v)&&(_[m].journalRows=null)):_[m]={baseRows:v,journalRows:null};let E=_[m];function h(){return Array.isArray(E.journalRows)}function y(){return (Array.isArray(E.journalRows)?E.journalRows:E.baseRows).map(C=>Object.assign({},C))}function b(M){JSON.stringify(M)===JSON.stringify(E.baseRows)?E.journalRows=null:E.journalRows=M.map(C=>Object.assign({},C));}function F(){let M=t.querySelector(".lc-et-save"),C=t.querySelector(".lc-et-discard");M&&M.classList.remove("d-none"),C&&C.classList.remove("d-none");}function re(){let M=y();p.onPatchState(i.id,{fieldValues:M});let C=t.querySelector(".lc-et-save");C&&(C.textContent="Saving..."),ne(t);}function Y(){E.journalRows=null,ee();}function ee(){let M=y(),C=u(M);if(!C.length&&!a){t.innerHTML=`<p class="text-muted small">${x(o.placeholder||"No data")}</p>`;return}let $='<div class="table-responsive"><table class="table table-sm table-bordered mb-0 lc-editable-table"><thead><tr>';if(C.forEach(H=>{$+=`<th class="small text-nowrap">${x(H)}</th>`;}),d&&($+='<th style="width:2rem"></th>'),$+="</tr></thead><tbody>",M.forEach((H,J)=>{$+="<tr>",C.forEach(te=>{let me=H[te],Ee=f[te]||{},he=Ee.type==="number"||Ee.type==="integer"||me!=null&&typeof me=="number",Oe=me!=null?String(me):"";$+=`<td class="p-0"><input type="${he?"number":"text"}" class="form-control form-control-sm border-0 rounded-0 lc-et-cell" data-row="${J}" data-col="${x(te)}" value="${x(Oe)}"${he?' step="any"':""}></td>`;}),d&&($+=`<td class="text-center align-middle p-0"><button class="btn btn-sm btn-link text-danger p-0 lc-et-del" data-row="${J}" title="Remove row">\u2715</button></td>`),$+="</tr>";}),!M.length){let H=C.length+(d?1:0);$+=`<tr><td colspan="${H}" class="text-muted small text-center">${x(o.placeholder||"No rows")}</td></tr>`;}$+="</tbody></table></div>";let X="";a&&(X+='<button class="btn btn-sm btn-outline-secondary mt-1 me-1 lc-et-add">+ Add row</button>'),X+=`<button class="btn btn-sm btn-outline-secondary mt-1 me-1 lc-et-discard${h()?"":" d-none"}">Discard</button>`,X+=`<button class="btn btn-sm btn-primary mt-1 lc-et-save${h()?"":" d-none"}">Save</button>`,t.innerHTML=$+X,t.querySelectorAll(".lc-et-cell").forEach(H=>{H.addEventListener("change",()=>{let J=parseInt(H.dataset.row),te=H.dataset.col,me=f[te]||{},Ee=me.type==="number"||me.type==="integer"||H.type==="number",he=y();if(he[J])if(he[J]=Object.assign({},he[J]),he[J][te]=Ee?H.value!==""?parseFloat(H.value):0:H.value,b(he),h())F();else {let Oe=t.querySelector(".lc-et-save"),ht=t.querySelector(".lc-et-discard");Oe&&Oe.classList.add("d-none"),ht&&ht.classList.add("d-none");}},{signal:s});}),t.querySelectorAll(".lc-et-del").forEach(H=>{H.addEventListener("click",()=>{let J=parseInt(H.dataset.row),te=y().filter((me,Ee)=>Ee!==J);b(te),ee();},{signal:s});});let Z=t.querySelector(".lc-et-add");Z&&Z.addEventListener("click",()=>{let H={},J=y();u(J).forEach(te=>{H[te]="";}),J.push(H),b(J),ee();},{signal:s});let R=t.querySelector(".lc-et-discard");R&&R.addEventListener("click",()=>{Y();},{signal:s});let se=t.querySelector(".lc-et-save");se&&se.addEventListener("click",()=>{re(),se.textContent="\u2713 Saved",setTimeout(()=>{se.textContent="Save";},1500);},{signal:s});}ee();}function xe(n,t,e,i){let s=V(i.id).ac.signal,l=(e.data||{}).writeTo,f=i.id+":"+(l||""),a=Array.isArray(n)?n.map(g=>Object.assign({},g)):[];if(!q[f])q[f]={currentState:a,pending:a.map(g=>Object.assign({},g))};else {let g=q[f],v=JSON.stringify(g.currentState)!==JSON.stringify(g.pending);g.currentState=a,v||(g.pending=a.map(E=>Object.assign({},E)));}let d=q[f];function u(){l&&dt(i,l,d.pending),p.onPatchState(i.id,{fieldValues:d.pending}),we(i.id,d.pending),d.currentState=d.pending.map(g=>Object.assign({},g));}function m(){let g=d.pending,v='<div class="lc-todo-list">';g.forEach((b,F)=>{let re=b.done?" checked":"",Y=b.done?" text-decoration-line-through text-muted":"";v+='<div class="lc-todo-item">',v+=`<input class="form-check-input flex-shrink-0" type="checkbox"${re} data-idx="${F}">`,v+=`<span class="small flex-grow-1${Y}">${x(b.text)}</span>`,v+=`<button class="btn btn-sm btn-link text-danger p-0" data-rm="${F}" title="Remove">\xD7</button></div>`;}),v+="</div>",v+='<div class="input-group input-group-sm mt-2"><input type="text" class="form-control" placeholder="Add item...">',v+='<button class="btn btn-outline-secondary lc-todo-add">+</button></div>',t.innerHTML=v,t.querySelectorAll("input[data-idx]").forEach(b=>{b.addEventListener("change",()=>{d.pending[parseInt(b.dataset.idx)].done=b.checked,u(),m();},{signal:s});}),t.querySelectorAll("[data-rm]").forEach(b=>{b.addEventListener("click",()=>{d.pending.splice(parseInt(b.dataset.rm),1),u(),m();},{signal:s});});let E=t.querySelector(".input-group input"),h=t.querySelector(".lc-todo-add"),y=()=>{let b=E.value.trim();b&&(d.pending.push({text:b,done:false}),u(),m());};h.addEventListener("click",y,{signal:s}),E.addEventListener("keydown",b=>{b.key==="Enter"&&(b.preventDefault(),y());},{signal:s});}m();}function Ge(n,t,e){let r=(e.data||{}).thresholds||{},s=typeof n=="number"?n:n&&n.value!=null?n.value:null,o="unknown",l="secondary";s!=null&&(r.green&&pt(s,r.green)?(o="green",l="success"):r.amber&&pt(s,r.amber)?(o="amber",l="warning"):(o="red",l="danger")),t.innerHTML=`
80
+ </div>`;let v=t.querySelector(".lc-notes-textarea"),E=t.querySelector(".lc-n-discard"),h=t.querySelector(".lc-n-save");function y(){let b=u();h.classList.toggle("d-none",!b),E.classList.toggle("d-none",!b);}v.addEventListener("input",()=>{g(v.value),y();},{signal:s}),h.addEventListener("click",()=>{let b=v.value;p.onPatchState(i.id,{fieldValues:{notes:b}}),h.textContent="Saving...",ne(t);},{signal:s}),E.addEventListener("click",()=>{d.journal=null,v.value=d.baseContent||"",y();},{signal:s});}function Ke(n,t,e,i){let s=V(i.id).ac.signal,l=e.data||{},o=l.writeTo||(typeof l.bind=="string"&&l.bind.startsWith("card_data.")?l.bind:void 0),f=l.schema&&l.schema.properties||{},a=l.addRow!==false,d=l.deleteRow!==false;function u(M){if(l.columns&&l.columns.length)return l.columns;let C=new Set;return M.forEach($=>{$&&typeof $=="object"&&Object.keys($).forEach(X=>C.add(X));}),[...C]}let m=i.id+":"+(l.bind||o||""),v=(Array.isArray(n)?n:[]).map(M=>Object.assign({},M));_[m]?(_[m].baseRows=v,_[m].journalRows&&JSON.stringify(_[m].journalRows)===JSON.stringify(v)&&(_[m].journalRows=null)):_[m]={baseRows:v,journalRows:null};let E=_[m];function h(){return Array.isArray(E.journalRows)}function y(){return (Array.isArray(E.journalRows)?E.journalRows:E.baseRows).map(C=>Object.assign({},C))}function b(M){JSON.stringify(M)===JSON.stringify(E.baseRows)?E.journalRows=null:E.journalRows=M.map(C=>Object.assign({},C));}function F(){let M=t.querySelector(".lc-et-save"),C=t.querySelector(".lc-et-discard");M&&M.classList.remove("d-none"),C&&C.classList.remove("d-none");}function re(){let M=y();p.onPatchState(i.id,{fieldValues:M});let C=t.querySelector(".lc-et-save");C&&(C.textContent="Saving..."),ne(t);}function Y(){E.journalRows=null,ee();}function ee(){let M=y(),C=u(M);if(!C.length&&!a){t.innerHTML=`<p class="text-muted small">${x(l.placeholder||"No data")}</p>`;return}let $='<div class="table-responsive"><table class="table table-sm table-bordered mb-0 lc-editable-table"><thead><tr>';if(C.forEach(H=>{$+=`<th class="small text-nowrap">${x(H)}</th>`;}),d&&($+='<th style="width:2rem"></th>'),$+="</tr></thead><tbody>",M.forEach((H,J)=>{$+="<tr>",C.forEach(te=>{let fe=H[te],Ee=f[te]||{},pe=Ee.type==="number"||Ee.type==="integer"||fe!=null&&typeof fe=="number",Oe=fe!=null?String(fe):"";$+=`<td class="p-0"><input type="${pe?"number":"text"}" class="form-control form-control-sm border-0 rounded-0 lc-et-cell" data-row="${J}" data-col="${x(te)}" value="${x(Oe)}"${pe?' step="any"':""}></td>`;}),d&&($+=`<td class="text-center align-middle p-0"><button class="btn btn-sm btn-link text-danger p-0 lc-et-del" data-row="${J}" title="Remove row">\u2715</button></td>`),$+="</tr>";}),!M.length){let H=C.length+(d?1:0);$+=`<tr><td colspan="${H}" class="text-muted small text-center">${x(l.placeholder||"No rows")}</td></tr>`;}$+="</tbody></table></div>";let X="";a&&(X+='<button class="btn btn-sm btn-outline-secondary mt-1 me-1 lc-et-add">+ Add row</button>'),X+=`<button class="btn btn-sm btn-outline-secondary mt-1 me-1 lc-et-discard${h()?"":" d-none"}">Discard</button>`,X+=`<button class="btn btn-sm btn-primary mt-1 lc-et-save${h()?"":" d-none"}">Save</button>`,t.innerHTML=$+X,t.querySelectorAll(".lc-et-cell").forEach(H=>{H.addEventListener("change",()=>{let J=parseInt(H.dataset.row),te=H.dataset.col,fe=f[te]||{},Ee=fe.type==="number"||fe.type==="integer"||H.type==="number",pe=y();if(pe[J])if(pe[J]=Object.assign({},pe[J]),pe[J][te]=Ee?H.value!==""?parseFloat(H.value):0:H.value,b(pe),h())F();else {let Oe=t.querySelector(".lc-et-save"),ht=t.querySelector(".lc-et-discard");Oe&&Oe.classList.add("d-none"),ht&&ht.classList.add("d-none");}},{signal:s});}),t.querySelectorAll(".lc-et-del").forEach(H=>{H.addEventListener("click",()=>{let J=parseInt(H.dataset.row),te=y().filter((fe,Ee)=>Ee!==J);b(te),ee();},{signal:s});});let Z=t.querySelector(".lc-et-add");Z&&Z.addEventListener("click",()=>{let H={},J=y();u(J).forEach(te=>{H[te]="";}),J.push(H),b(J),ee();},{signal:s});let R=t.querySelector(".lc-et-discard");R&&R.addEventListener("click",()=>{Y();},{signal:s});let se=t.querySelector(".lc-et-save");se&&se.addEventListener("click",()=>{re(),se.textContent="\u2713 Saved",setTimeout(()=>{se.textContent="Save";},1500);},{signal:s});}ee();}function xe(n,t,e,i){let s=V(i.id).ac.signal,o=(e.data||{}).writeTo,f=i.id+":"+(o||""),a=Array.isArray(n)?n.map(g=>Object.assign({},g)):[];if(!q[f])q[f]={currentState:a,pending:a.map(g=>Object.assign({},g))};else {let g=q[f],v=JSON.stringify(g.currentState)!==JSON.stringify(g.pending);g.currentState=a,v||(g.pending=a.map(E=>Object.assign({},E)));}let d=q[f];function u(){o&&dt(i,o,d.pending),p.onPatchState(i.id,{fieldValues:d.pending}),we(i.id,d.pending),d.currentState=d.pending.map(g=>Object.assign({},g));}function m(){let g=d.pending,v='<div class="lc-todo-list">';g.forEach((b,F)=>{let re=b.done?" checked":"",Y=b.done?" text-decoration-line-through text-muted":"";v+='<div class="lc-todo-item">',v+=`<input class="form-check-input flex-shrink-0" type="checkbox"${re} data-idx="${F}">`,v+=`<span class="small flex-grow-1${Y}">${x(b.text)}</span>`,v+=`<button class="btn btn-sm btn-link text-danger p-0" data-rm="${F}" title="Remove">\xD7</button></div>`;}),v+="</div>",v+='<div class="input-group input-group-sm mt-2"><input type="text" class="form-control" placeholder="Add item...">',v+='<button class="btn btn-outline-secondary lc-todo-add">+</button></div>',t.innerHTML=v,t.querySelectorAll("input[data-idx]").forEach(b=>{b.addEventListener("change",()=>{d.pending[parseInt(b.dataset.idx)].done=b.checked,u(),m();},{signal:s});}),t.querySelectorAll("[data-rm]").forEach(b=>{b.addEventListener("click",()=>{d.pending.splice(parseInt(b.dataset.rm),1),u(),m();},{signal:s});});let E=t.querySelector(".input-group input"),h=t.querySelector(".lc-todo-add"),y=()=>{let b=E.value.trim();b&&(d.pending.push({text:b,done:false}),u(),m());};h.addEventListener("click",y,{signal:s}),E.addEventListener("keydown",b=>{b.key==="Enter"&&(b.preventDefault(),y());},{signal:s});}m();}function Ge(n,t,e){let r=(e.data||{}).thresholds||{},s=typeof n=="number"?n:n&&n.value!=null?n.value:null,l="unknown",o="secondary";s!=null&&(r.green&&pt(s,r.green)?(l="green",o="success"):r.amber&&pt(s,r.amber)?(l="amber",o="warning"):(l="red",o="danger")),t.innerHTML=`
81
81
  <div class="d-flex align-items-center gap-3 py-2">
82
- <span class="lc-alert-dot lc-alert-${o}"></span>
82
+ <span class="lc-alert-dot lc-alert-${l}"></span>
83
83
  <div class="flex-grow-1">
84
84
  <div class="fw-bold">${s!=null?x(String(s)):"\u2014"}</div>
85
85
  ${e.label?`<div class="text-muted small">${x(e.label)}</div>`:""}
86
86
  </div>
87
- <span class="badge bg-${l} fs-6">${x(o)}</span>
88
- </div>`;}function Te(n,t){let e=typeof n=="string"?n:n&&n.text?n.text:"";if(!e){t.innerHTML='<p class="text-muted small fst-italic">No narrative yet. Click refresh to generate.</p>';return}t.innerHTML=`<div class="small">${S(e)}</div>`;}function Qe(n,t,e){let r=(e.data||{}).colorMap||{},s=n!=null?String(n):"",l={green:"success",amber:"warning",red:"danger",blue:"primary"}[r[s]]||r[s]||"secondary";t.innerHTML=`<span class="badge bg-${x(l)}">${x(s)}</span>`;}function Ie(n,t,e){let i=e.data||{},r=i.format||"default",s=e.style||i.style||"default";if((i.hideIfEmpty||e.hideIfEmpty)&&(n==null||n==="")){t.innerHTML="";return}if(r==="file-links"){if(!Array.isArray(n)||n.length===0){t.innerHTML='<div class="text-muted small">No files uploaded</div>';return}let a=[];n.forEach((u,m)=>{if(!u||!u.stored_name)return;let g=u.name||u.stored_name,v=e.data&&e.data.cardId?e.data.cardId:"unknown",E=`${p.fileUrlBase}/cards/${encodeURIComponent(v)}/files/${m}?sn=${encodeURIComponent(u.stored_name)}`,h=u.size?` (${Math.round(u.size/1024)}KB)`:"";a.push(`<div class="mb-2"><a href="${E}" class="btn btn-sm btn-outline-secondary">${x(g)}${x(h)}</a></div>`);});let d=a.join("");t.innerHTML=d;return}let l=s==="heading"?"h4":"div",f=s==="muted"?"text-muted small":s==="muted-italic"?"text-muted small fst-italic":s==="heading"?"fw-bold":"small";t.innerHTML=`<${l} class="${f}">${x(n!=null?String(n):"")}</${l}>`;}function Ae(n,t){let e="";typeof n=="string"?e=n:n&&typeof n=="object"&&n.text?e=n.text:n!=null&&(e=JSON.stringify(n,null,2)),t.innerHTML=e?S(e):"";}function be(n,t){if(n==null){t.innerHTML="";return}t.innerHTML=`<pre class="small mb-0">${x(JSON.stringify(n,null,2))}</pre>`;}function oe(n,t,e,i){let s=V(i.id).ac.signal,l=(e.data||{}).buttons||(Array.isArray(n)?n:[]);if(!l.length){t.innerHTML="";return}let f='<div class="d-flex gap-2 flex-wrap">';l.forEach(a=>{let d=a.style||"outline-secondary",u=a.size||"sm",m=typeof a.disabled=="string"?ue(i,a.disabled):a.disabled;f+=`<button class="btn btn-${x(d)} btn-${u}" data-action-id="${x(a.id)}"${m?" disabled":""}>`,f+=x(a.label||a.id),f+="</button>";}),f+="</div>",t.innerHTML=f,t.querySelectorAll("[data-action-id]").forEach(a=>{a.addEventListener("click",()=>{p.onAction(i.id,"action",{buttonId:a.dataset.actionId,elemId:e.id});},{signal:s});}),t._actions={setDisabled:(a,d)=>{let u=t.querySelector(`[data-action-id="${a}"]`);u&&(u.disabled=d);},setLabel:(a,d)=>{let u=t.querySelector(`[data-action-id="${a}"]`);u&&(u.textContent=d);}};}let fe=new Set(["table","editable-table","chart","metric","list","badge","text","narrative","markdown","form","filter","todo","alert"]);function $e(n,t,e,i){let r=e.data||{},s=r.viewBind?ue(i,r.viewBind):void 0,o,l;typeof s=="string"&&s?(o=s,l={}):s&&typeof s=="object"&&!Array.isArray(s)&&(o=typeof s.kind=="string"?s.kind:void 0,l=s.data&&typeof s.data=="object"?s.data:{}),(!o||!fe.has(o))&&(o=r.fallbackKind&&fe.has(r.fallbackKind)?r.fallbackKind:Array.isArray(n)?"table":typeof n=="string"?"text":"narrative");let f=Object.assign({},l,r);delete f.viewBind,delete f.fallbackKind,!f.bind&&l.bind&&(f.bind=l.bind);let a=Object.assign({},e,{kind:o},{data:f}),d=f.bind?ue(i,f.bind):n;(P[o]||P.table)(d,t,a,i);}P.table=_e,P["editable-table"]=Ke,P.filter=Le,P.metric=Xe,P.list=Pe,P.chart=Ue,P.form=Me,P.notes=Je,P.todo=xe,P.alert=Ge,P.narrative=Te,P.badge=Qe,P.text=Ie,P.markdown=Ae,P.custom=be,P.actions=oe,P.ref=$e;function Be(n,t){let e=n&&n.card?n.card.view:null;if(!e||!Array.isArray(e.elements)){t.innerHTML="";return}G[n.id]&&(G[n.id].elements={});let i=document.createElement("div");i.className="row g-2";let r=n.runtime_state&&n.runtime_state.task_status;if(r&&r!=="completed"){let o=document.createElement("div");o.className="col-12 d-flex align-items-center gap-2 mb-1";var s;r==="running"?s='<span class="spinner-border spinner-border-sm text-muted" style="width:.75rem;height:.75rem;flex-shrink:0"></span>':r==="failed"?s='<span style="font-size:.75rem;line-height:1;flex-shrink:0;color:#dc3545">&#x26A0;&#xFE0E;</span>':r==="not-started"?s='<span style="font-size:.75rem;line-height:1;flex-shrink:0" class="text-muted">&#x25CB;</span>':r==="inactivated"?s='<span style="font-size:.75rem;line-height:1;flex-shrink:0" class="text-muted">&#x2296;</span>':s='<span style="font-size:.75rem;line-height:1;flex-shrink:0" class="text-muted">&#x2013;</span>',o.innerHTML=s+'<span class="text-muted" style="font-size:.75rem">'+x(r)+"</span>",i.appendChild(o);}e.elements.forEach(o=>{if(o.visible&&!ue(n,o.visible))return;let l=o.data&&o.data.bind?ue(n,o.data.bind):void 0,f=document.createElement("div");if(f.className=o.className||"col-12",o.label&&o.kind!=="metric"&&o.kind!=="alert"){let u=document.createElement("div");u.className="small text-muted fw-medium mb-1",u.textContent=o.label,f.appendChild(u);}let a=document.createElement("div");f.appendChild(a);let d=P[o.kind]||P.custom;try{d(l,a,o,n);}catch(u){console.error("LiveCard render error",n.id,o.kind,u),a.innerHTML=`<div class="text-danger small">Render error: ${x(u.message)}</div>`;}o.id&&G[n.id]&&(G[n.id].elements[o.id]=a),i.appendChild(f);}),t.innerHTML="",t.appendChild(i);}function Fe(n,t,e){Ne(n.id);let r=V(n.id).ac.signal,s="lc-"+(n.id||"x"),o=n.card&&n.card.view&&n.card.view.features||{},l=`<div class="lc-card" id="${s}">`,f=o.refresh!==false&&p.onRefresh;l+='<div class="d-flex align-items-center gap-1 mb-2">',l+=ut(n.card_data&&n.card_data.status),l+=`<span class="text-muted small">${ft(n.card_data&&n.card_data.lastRun)}</span>`,n.card_data&&n.card_data.status==="error"&&n.card_data.error&&(l+=`<span class="badge bg-danger small" title="${x(n.card_data.error)}">Error</span>`),l+='<div class="d-flex align-items-center gap-1 ms-auto">';let a=n&&n.card_data&&Array.isArray(n.card_data.files)?n.card_data.files.length:0;l+=`<button class="btn btn-sm btn-outline-secondary d-inline-flex align-items-center" id="${s}-files-open" title="${a>0?"Files ("+a+")":"Files"}">`,l+='<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>',a>0&&(l+=`<span class="ms-1 small" aria-label="${a} files">${a}</span>`),l+="</button>",l+=`<button class="btn btn-sm btn-outline-secondary d-inline-flex align-items-center" id="${s}-chat-open" title="Chat">`,l+='<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>',l+="</button>",f&&(l+=`<button class="btn btn-sm btn-outline-secondary d-inline-flex align-items-center" id="${s}-refresh" title="Refresh">`,l+='<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>',l+="</button>"),l+="</div>",l+="</div>";let d=n.card_data&&n.card_data.llm_task_completion_inference,u=!!(d&&d.isTaskCompleted),m=n.card&&typeof n.card.when_is_task_completed=="string"&&n.card.when_is_task_completed.trim();(m||u)&&(l+='<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)">',u?l+='<span class="lc-inference-icon" title="Task completed" style="color:#198754;font-size:.75rem;line-height:1.2;flex-shrink:0">&#x25CF;</span>':l+='<span class="lc-inference-icon" style="color:#aaa;font-size:.75rem;line-height:1.4;flex-shrink:0" title="Awaiting inference">&#x25CB;</span>',m&&(l+=`<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> ${x(m)}</span>`),l+="</div>"),l+=`<div class="lc-result" id="${s}-result"></div>`,l+="</div>",t.innerHTML=l;let g=document.getElementById(s+"-result");G[n.id]={container:t,resultEl:g,uid:s},n.card_data&&n.card_data.status==="error"&&n.card_data.error?g.innerHTML=`<div class="text-danger small fw-semibold">Refresh failed</div><pre class="text-muted small mt-1" style="white-space:pre-wrap">${x(n.card_data.error)}</pre>`:Be(n,g);let v=document.getElementById(s+"-refresh");v&&p.onRefresh&&v.addEventListener("click",y=>{y.stopPropagation(),v.disabled=true,p.onRefresh(n.id);},{signal:r});let E=document.getElementById(s+"-chat-open");E&&E.addEventListener("click",y=>{y.stopPropagation(),K(n.id);},{signal:r});let h=document.getElementById(s+"-files-open");h&&h.addEventListener("click",y=>{y.stopPropagation(),ie(n.id);},{signal:r}),Ye(n);}function pe(n,t){let e=G[n];if(!e)return;let i=document.getElementById(e.uid+"-refresh");if(i&&(i.disabled=false),t.status){let a=e.container.querySelector(".lc-status-dot");if(a){let d={fresh:"var(--bs-success)",stale:"var(--bs-warning)",error:"var(--bs-danger)",loading:"var(--bs-info)"};a.style.background=d[t.status]||"var(--bs-secondary)",a.title=t.status;}}if(t.lastRun){let a=e.container.querySelector(".lc-status-dot + .text-muted");a&&(a.textContent=ft(t.lastRun));}let r=p.resolve(n);if(!r)return;r.card_data||(r.card_data={}),t.status&&(r.card_data.status=t.status),t.lastRun&&(r.card_data.lastRun=t.lastRun),t.error!==void 0&&(r.card_data.error=t.error),t.files!==void 0&&(r.card_data.files=Array.isArray(t.files)?t.files:[]);let s=document.getElementById(e.uid+"-files-open"),o=Array.isArray(r.card_data.files)?r.card_data.files.length:0;s&&(s.title=o>0?"Files ("+o+")":"Files",s.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>'+(o>0?'<span class="ms-1 small" aria-label="'+o+' files">'+o+"</span>":""));let l=document.getElementById(e.uid+"-files-count");l&&l.parentNode&&l.parentNode.removeChild(l);let f=e.container.querySelector(".lc-inference-bar");if(f){let a=r.card_data&&r.card_data.llm_task_completion_inference,d=!!(a&&a.isTaskCompleted),u=f.querySelector(".lc-inference-icon");u&&(u.title=d?"Task completed":"Awaiting inference",u.style.color=d?"#198754":"#aaa",u.innerHTML=d?"&#x25CF;":"&#x25CB;");}r.card_data.status==="error"&&r.card_data.error?e.resultEl.innerHTML=`<div class="text-danger small fw-semibold">Refresh failed</div><pre class="text-muted small mt-1" style="white-space:pre-wrap">${x(r.card_data.error)}</pre>`:Be(r,e.resultEl);}function Ne(n){let t=w[n];t&&(t.ac.abort(),t.timers.forEach(e=>clearTimeout(e)),t.charts.forEach(e=>{try{e.inst.destroy();}catch{}}),t.unsubs&&t.unsubs.forEach(e=>e()),delete w[n]),delete G[n];}function Ze(){Object.keys(w).forEach(Ne),Array.from(z).forEach(function(n){try{n.dispose();}catch{}}),z.clear(),B.backdrop&&B.backdrop.remove(),B.backdrop=null,B.title=null,B.closeBtn=null,D=null,j.pollingTimer&&clearInterval(j.pollingTimer),Array.from(k).forEach(function(n){try{n.dispose();}catch{}}),k.clear(),j.backdrop&&j.backdrop.remove(),j.backdrop=null,j.title=null,j.closeBtn=null,j.currentNodeId=null,j.pollingTimer=null,Q=null,W=null;}function et(){return !!(B.backdrop&&B.backdrop.classList.contains("lc-open"))}function je(n){return !n||!n.cardId||n.disposed?false:n.isModal?et():true}function tt(n,t,e){z.forEach(function(i){je(i)&&i.cardId===n&&i.appendMessage(t,e,[]);});}function nt(){z.forEach(function(n){je(n)&&n.refresh();});}function at(){z.forEach(function(n){je(n)&&(n.awaitingProcessingAck&&n.setSendButtonPending(false),n.clearPending(),n.syncProcessingBar(),n.refresh());});}function rt(n,t){let e=G[n];return e&&e.elements&&e.elements[t]||null}return {render:Fe,update:pe,destroy:Ne,destroyAll:Ze,notify:we,subscribe:qe,appendChatMessage:tt,refreshOpenChatModal:nt,onServerSseEvent:at,openChatModal:K,mountChatPane:T,openFilesModal:ie,mountFilesUploadPane:We,mountFilesListPane:Ve,getElement:rt,registerRenderer(n,t){P[n]=t;},renderers:P,getChatStateForCard(n){let t=p.resolve(n);return t?ge(t):{messages:[],receiving:false,processing:false}},startReceivingChatsForCard(n){typeof p.startReceivingChats=="function"&&p.startReceivingChats(n);},stopReceivingChatsForCard(n){typeof p.stopReceivingChats=="function"&&p.stopReceivingChats(n);},isReceivingChatsForCard(n){let t=p.resolve(n);return !t||!t.card_chats?false:!!t.card_chats.receiving}}}function mt(c,p,w){w=w||{};let I={current:w.mode||"board"},_={current:w.devMode||false},L=[],A={},q={},ne=w.showChat||false,P=w.defaultCol||6,G=lt(w.boardTheme,it),z=lt(w.boardRenderer,ot),D=ct(w.boardSkin,{boardClass:w.boardClass,listClass:w.listClass,canvasClass:w.canvasClass,canvasInnerClass:w.canvasInnerClass,styles:w.styles,boardStyle:w.boardStyle,listStyle:w.listStyle,canvasStyle:w.canvasStyle,canvasInnerStyle:w.canvasInnerStyle}),B=w.canvas||{},k={snap:B.snap||20,zoomMin:B.zoom&&B.zoom.min||.25,zoomMax:B.zoom&&B.zoom.max||2,zoom:B.zoom&&B.zoom.initial||1,edges:B.edges!==false,minWidth:B.minWidth||220,maxWidth:B.maxWidth||450,defaultW:B.defaultW||350,gapX:B.gapX||280,gapY:B.gapY||320,padX:B.padX||20,padY:B.padY||20,cardMaxH:B.cardMaxH||300,panX:0,panY:0},Q=new AbortController,W=Q.signal,j=[],S=B.edgeStyle||{};({color:S.color||"rgba(108, 117, 125, 0.6)",size:S.size||2,dash:S.dash!==false,animation:S.animation!==false,endPlug:S.endPlug||"arrow1"});let N=document.createElement("div");N.className="lc-board",p.appendChild(N);let U=null,le={mountEl:N,listEl:N},K=document.createElement("div");K.className="row g-3 lc-board-grid";let T=document.createElement("div");T.className="lc-canvas",T.style.cssText="position:relative;overflow:auto;width:100%;";let O=document.createElement("div");O.className="lc-canvas-inner",O.style.cssText="position:relative;transform-origin:0 0;min-width:100%;min-height:100%;",T.appendChild(O);let ae=document.createElementNS("http://www.w3.org/2000/svg","svg");ae.setAttribute("class","lc-canvas-edges"),ae.style.cssText="position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden;z-index:0;";let ce=document.createElementNS("http://www.w3.org/2000/svg","defs");ce.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>',ae.appendChild(ce),O.appendChild(ae);function de(){let t=kt(L);return ct(t,G,D)}function ze(t){let e=[t&&t.styles,z&&typeof z.styles=="string"?z.styles:""].filter(function(i){return typeof i=="string"&&i.trim()}).join(`
89
- `);if(!e){U&&U.parentNode&&U.parentNode.removeChild(U),U=null;return}U||(U=document.createElement("style"),U.setAttribute("data-lc-board-scope","1"),document.head.appendChild(U)),U.textContent=e;}function ie(t,e){return Object.assign({root:N,gridEl:K,canvasEl:T,canvasInner:O,appearance:t,mode:I.current,engine:c,nodes:L.slice(),containerEl:p},e||{})}function We(t){Ce(N,"lc-board",t.boardClass,"",t.boardStyle),Ce(K,"row g-3 lc-board-grid",t.listClass,"",t.listStyle);let e=K,i=K;if(z&&typeof z.createBoardHost=="function"){let r=z.createBoardHost(ie(t,{defaultMountEl:K,defaultListEl:K}));ke(r)?(e=r,i=r):r&&typeof r=="object"&&(e=r.mountEl||r.hostEl||r.containerEl||K,i=r.listEl||r.contentEl||r.mountEl||e);}return N.innerHTML="",e!==K&&i===K&&!e.contains(K)&&e.appendChild(K),e!==N?(i!==e&&!ke(i.parentNode)&&e.appendChild(i),N.appendChild(e)):i!==N&&!N.contains(i)&&N.appendChild(i),{mountEl:e,listEl:i}}function Ve(t){Ce(N,"lc-board",t.boardClass,"",t.boardStyle),Ce(T,"lc-canvas",t.canvasClass,"position:relative;overflow:auto;width:100%;",t.canvasStyle),Ce(O,"lc-canvas-inner",t.canvasInnerClass,"position:relative;transform-origin:0 0;min-width:100%;min-height:100%;",t.canvasInnerStyle);let e=T,i=T;if(z&&typeof z.createCanvasHost=="function"){let r=z.createCanvasHost(ie(t,{defaultMountEl:T,defaultSurfaceEl:T,defaultCanvasEl:T}));ke(r)?(e=r,i=r):r&&typeof r=="object"&&(e=r.mountEl||r.hostEl||r.containerEl||T,i=r.surfaceEl||r.canvasEl||r.mountEl||e);}return N.innerHTML="",e!==T&&i===T&&!e.contains(T)&&e.appendChild(T),e!==N?N.appendChild(e):i!==N&&!N.contains(i)&&N.appendChild(i),{mountEl:e,surfaceEl:i}}function ue(t,e,i){let r="col-12 col-md-"+qe(t),s=document.createElement("div"),o=null;if(s.className=r,s.dataset.nodeId=t.id,z&&typeof z.createBoardItem=="function"){let l=z.createBoardItem(t,ie(e,{listEl:i,defaultClassName:r,defaultContainerEl:s}));ke(l)?s=l:l&&typeof l=="object"&&(s=l.containerEl||l.colEl||l.mountEl||s,o=l.bodyEl||l.contentEl||null);}return s.dataset.nodeId||(s.dataset.nodeId=t.id),s.className||(s.className=r),{containerEl:s,bodyEl:o}}function we(t,e,i){let r="lc-canvas-card card shadow-sm",s=document.createElement("div"),o=null;if(s.className=r,s.dataset.nodeId=t.id,s.style.left=i.x+"px",s.style.top=i.y+"px",i.w&&(s.style.width=i.w+"px"),i.h&&(s.style.height=i.h+"px"),z&&typeof z.createCanvasItem=="function"){let l=z.createCanvasItem(t,ie(e,{defaultClassName:r,defaultContainerEl:s,position:i}));ke(l)?s=l:l&&typeof l=="object"&&(s=l.containerEl||l.cardEl||l.mountEl||s,o=l.bodyEl||l.contentEl||null);}return s.dataset.nodeId||(s.dataset.nodeId=t.id),s.className||(s.className=r),s.style.left=i.x+"px",s.style.top=i.y+"px",i.w&&(s.style.width=i.w+"px"),i.h&&(s.style.height=i.h+"px"),{containerEl:s,bodyEl:o}}if(!document.getElementById("lc-board-css")){let t=document.createElement("style");t.id="lc-board-css",t.textContent=`
87
+ <span class="badge bg-${o} fs-6">${x(l)}</span>
88
+ </div>`;}function Te(n,t){let e=typeof n=="string"?n:n&&n.text?n.text:"";if(!e){t.innerHTML='<p class="text-muted small fst-italic">No narrative yet. Click refresh to generate.</p>';return}t.innerHTML=`<div class="small">${S(e)}</div>`;}function Qe(n,t,e){let r=(e.data||{}).colorMap||{},s=n!=null?String(n):"",o={green:"success",amber:"warning",red:"danger",blue:"primary"}[r[s]]||r[s]||"secondary";t.innerHTML=`<span class="badge bg-${x(o)}">${x(s)}</span>`;}function Ie(n,t,e){let i=e.data||{},r=i.format||"default",s=e.style||i.style||"default";if((i.hideIfEmpty||e.hideIfEmpty)&&(n==null||n==="")){t.innerHTML="";return}if(r==="file-links"){if(!Array.isArray(n)||n.length===0){t.innerHTML='<div class="text-muted small">No files uploaded</div>';return}let a=[];n.forEach((u,m)=>{if(!u||!u.stored_name)return;let g=u.name||u.stored_name,v=e.data&&e.data.cardId?e.data.cardId:"unknown",E=`${p.fileUrlBase}/cards/${encodeURIComponent(v)}/files/${m}?sn=${encodeURIComponent(u.stored_name)}`,h=u.size?` (${Math.round(u.size/1024)}KB)`:"";a.push(`<div class="mb-2"><a href="${E}" class="btn btn-sm btn-outline-secondary">${x(g)}${x(h)}</a></div>`);});let d=a.join("");t.innerHTML=d;return}let o=s==="heading"?"h4":"div",f=s==="muted"?"text-muted small":s==="muted-italic"?"text-muted small fst-italic":s==="heading"?"fw-bold":"small";t.innerHTML=`<${o} class="${f}">${x(n!=null?String(n):"")}</${o}>`;}function Ae(n,t){let e="";typeof n=="string"?e=n:n&&typeof n=="object"&&n.text?e=n.text:n!=null&&(e=JSON.stringify(n,null,2)),t.innerHTML=e?S(e):"";}function ge(n,t){if(n==null){t.innerHTML="";return}t.innerHTML=`<pre class="small mb-0">${x(JSON.stringify(n,null,2))}</pre>`;}function le(n,t,e,i){let s=V(i.id).ac.signal,o=(e.data||{}).buttons||(Array.isArray(n)?n:[]);if(!o.length){t.innerHTML="";return}let f='<div class="d-flex gap-2 flex-wrap">';o.forEach(a=>{let d=a.style||"outline-secondary",u=a.size||"sm",m=typeof a.disabled=="string"?ce(i,a.disabled):a.disabled;f+=`<button class="btn btn-${x(d)} btn-${u}" data-action-id="${x(a.id)}"${m?" disabled":""}>`,f+=x(a.label||a.id),f+="</button>";}),f+="</div>",t.innerHTML=f,t.querySelectorAll("[data-action-id]").forEach(a=>{a.addEventListener("click",()=>{p.onAction(i.id,"action",{buttonId:a.dataset.actionId,elemId:e.id});},{signal:s});}),t._actions={setDisabled:(a,d)=>{let u=t.querySelector(`[data-action-id="${a}"]`);u&&(u.disabled=d);},setLabel:(a,d)=>{let u=t.querySelector(`[data-action-id="${a}"]`);u&&(u.textContent=d);}};}let de=new Set(["table","editable-table","chart","metric","list","badge","text","narrative","markdown","form","filter","todo","alert"]);function $e(n,t,e,i){let r=e.data||{},s=r.viewBind?ce(i,r.viewBind):void 0,l,o;typeof s=="string"&&s?(l=s,o={}):s&&typeof s=="object"&&!Array.isArray(s)&&(l=typeof s.kind=="string"?s.kind:void 0,o=s.data&&typeof s.data=="object"?s.data:{}),(!l||!de.has(l))&&(l=r.fallbackKind&&de.has(r.fallbackKind)?r.fallbackKind:Array.isArray(n)?"table":typeof n=="string"?"text":"narrative");let f=Object.assign({},o,r);delete f.viewBind,delete f.fallbackKind,!f.bind&&o.bind&&(f.bind=o.bind);let a=Object.assign({},e,{kind:l},{data:f}),d=f.bind?ce(i,f.bind):n;(P[l]||P.table)(d,t,a,i);}P.table=_e,P["editable-table"]=Ke,P.filter=Le,P.metric=Xe,P.list=Pe,P.chart=Ue,P.form=Me,P.notes=Je,P.todo=xe,P.alert=Ge,P.narrative=Te,P.badge=Qe,P.text=Ie,P.markdown=Ae,P.custom=ge,P.actions=le,P.ref=$e;function Be(n,t){let e=n&&n.card?n.card.view:null;if(!e||!Array.isArray(e.elements)){t.innerHTML="";return}G[n.id]&&(G[n.id].elements={});let i=document.createElement("div");i.className="row g-2";let r=n.runtime_state&&n.runtime_state.task_status;if(r&&r!=="completed"){let l=document.createElement("div");l.className="col-12 d-flex align-items-center gap-2 mb-1";var s;r==="running"?s='<span class="spinner-border spinner-border-sm text-muted" style="width:.75rem;height:.75rem;flex-shrink:0"></span>':r==="failed"?s='<span style="font-size:.75rem;line-height:1;flex-shrink:0;color:#dc3545">&#x26A0;&#xFE0E;</span>':r==="not-started"?s='<span style="font-size:.75rem;line-height:1;flex-shrink:0" class="text-muted">&#x25CB;</span>':r==="inactivated"?s='<span style="font-size:.75rem;line-height:1;flex-shrink:0" class="text-muted">&#x2296;</span>':s='<span style="font-size:.75rem;line-height:1;flex-shrink:0" class="text-muted">&#x2013;</span>',l.innerHTML=s+'<span class="text-muted" style="font-size:.75rem">'+x(r)+"</span>",i.appendChild(l);}e.elements.forEach(l=>{if(l.visible&&!ce(n,l.visible))return;let o=l.data&&l.data.bind?ce(n,l.data.bind):void 0,f=document.createElement("div");if(f.className=l.className||"col-12",l.label&&l.kind!=="metric"&&l.kind!=="alert"){let u=document.createElement("div");u.className="small text-muted fw-medium mb-1",u.textContent=l.label,f.appendChild(u);}let a=document.createElement("div");f.appendChild(a);let d=P[l.kind]||P.custom;try{d(o,a,l,n);}catch(u){console.error("LiveCard render error",n.id,l.kind,u),a.innerHTML=`<div class="text-danger small">Render error: ${x(u.message)}</div>`;}l.id&&G[n.id]&&(G[n.id].elements[l.id]=a),i.appendChild(f);}),t.innerHTML="",t.appendChild(i);}function Fe(n,t,e){Ne(n.id);let r=V(n.id).ac.signal,s="lc-"+(n.id||"x"),l=n.card&&n.card.view&&n.card.view.features||{},o=`<div class="lc-card" id="${s}">`,f=l.refresh!==false&&p.onRefresh;o+='<div class="d-flex align-items-center gap-1 mb-2">',o+=ut(n.card_data&&n.card_data.status),o+=`<span class="text-muted small">${ft(n.card_data&&n.card_data.lastRun)}</span>`,n.card_data&&n.card_data.status==="error"&&n.card_data.error&&(o+=`<span class="badge bg-danger small" title="${x(n.card_data.error)}">Error</span>`),o+='<div class="d-flex align-items-center gap-1 ms-auto">';let a=n&&n.card_data&&Array.isArray(n.card_data.files)?n.card_data.files.length:0;o+=`<button class="btn btn-sm btn-outline-secondary d-inline-flex align-items-center" id="${s}-files-open" title="${a>0?"Files ("+a+")":"Files"}">`,o+='<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>',a>0&&(o+=`<span class="ms-1 small" aria-label="${a} files">${a}</span>`),o+="</button>",o+=`<button class="btn btn-sm btn-outline-secondary d-inline-flex align-items-center" id="${s}-chat-open" title="Chat">`,o+='<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>',o+="</button>",f&&(o+=`<button class="btn btn-sm btn-outline-secondary d-inline-flex align-items-center" id="${s}-refresh" title="Refresh">`,o+='<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>',o+="</button>"),o+="</div>",o+="</div>";let d=n.card_data&&n.card_data.llm_task_completion_inference,u=!!(d&&d.isTaskCompleted),m=n.card&&typeof n.card.when_is_task_completed=="string"&&n.card.when_is_task_completed.trim();(m||u)&&(o+='<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)">',u?o+='<span class="lc-inference-icon" title="Task completed" style="color:#198754;font-size:.75rem;line-height:1.2;flex-shrink:0">&#x25CF;</span>':o+='<span class="lc-inference-icon" style="color:#aaa;font-size:.75rem;line-height:1.4;flex-shrink:0" title="Awaiting inference">&#x25CB;</span>',m&&(o+=`<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> ${x(m)}</span>`),o+="</div>"),o+=`<div class="lc-result" id="${s}-result"></div>`,o+="</div>",t.innerHTML=o;let g=document.getElementById(s+"-result");G[n.id]={container:t,resultEl:g,uid:s},n.card_data&&n.card_data.status==="error"&&n.card_data.error?g.innerHTML=`<div class="text-danger small fw-semibold">Refresh failed</div><pre class="text-muted small mt-1" style="white-space:pre-wrap">${x(n.card_data.error)}</pre>`:Be(n,g);let v=document.getElementById(s+"-refresh");v&&p.onRefresh&&v.addEventListener("click",y=>{y.stopPropagation(),v.disabled=true,p.onRefresh(n.id);},{signal:r});let E=document.getElementById(s+"-chat-open");E&&E.addEventListener("click",y=>{y.stopPropagation(),K(n.id);},{signal:r});let h=document.getElementById(s+"-files-open");h&&h.addEventListener("click",y=>{y.stopPropagation(),ie(n.id);},{signal:r}),Ye(n);}function ue(n,t){let e=G[n];if(!e)return;let i=document.getElementById(e.uid+"-refresh");if(i&&(i.disabled=false),t.status){let a=e.container.querySelector(".lc-status-dot");if(a){let d={fresh:"var(--bs-success)",stale:"var(--bs-warning)",error:"var(--bs-danger)",loading:"var(--bs-info)"};a.style.background=d[t.status]||"var(--bs-secondary)",a.title=t.status;}}if(t.lastRun){let a=e.container.querySelector(".lc-status-dot + .text-muted");a&&(a.textContent=ft(t.lastRun));}let r=p.resolve(n);if(!r)return;r.card_data||(r.card_data={}),t.status&&(r.card_data.status=t.status),t.lastRun&&(r.card_data.lastRun=t.lastRun),t.error!==void 0&&(r.card_data.error=t.error),t.files!==void 0&&(r.card_data.files=Array.isArray(t.files)?t.files:[]);let s=document.getElementById(e.uid+"-files-open"),l=Array.isArray(r.card_data.files)?r.card_data.files.length:0;s&&(s.title=l>0?"Files ("+l+")":"Files",s.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 o=document.getElementById(e.uid+"-files-count");o&&o.parentNode&&o.parentNode.removeChild(o);let f=e.container.querySelector(".lc-inference-bar");if(f){let a=r.card_data&&r.card_data.llm_task_completion_inference,d=!!(a&&a.isTaskCompleted),u=f.querySelector(".lc-inference-icon");u&&(u.title=d?"Task completed":"Awaiting inference",u.style.color=d?"#198754":"#aaa",u.innerHTML=d?"&#x25CF;":"&#x25CB;");}r.card_data.status==="error"&&r.card_data.error?e.resultEl.innerHTML=`<div class="text-danger small fw-semibold">Refresh failed</div><pre class="text-muted small mt-1" style="white-space:pre-wrap">${x(r.card_data.error)}</pre>`:Be(r,e.resultEl);}function Ne(n){let t=w[n];t&&(t.ac.abort(),t.timers.forEach(e=>clearTimeout(e)),t.charts.forEach(e=>{try{e.inst.destroy();}catch{}}),t.unsubs&&t.unsubs.forEach(e=>e()),delete w[n]),delete G[n];}function Ze(){Object.keys(w).forEach(Ne),Array.from(z).forEach(function(n){try{n.dispose();}catch{}}),z.clear(),A.backdrop&&A.backdrop.remove(),A.backdrop=null,A.title=null,A.closeBtn=null,D=null,j.pollingTimer&&clearInterval(j.pollingTimer),Array.from(k).forEach(function(n){try{n.dispose();}catch{}}),k.clear(),j.backdrop&&j.backdrop.remove(),j.backdrop=null,j.title=null,j.closeBtn=null,j.currentNodeId=null,j.pollingTimer=null,Q=null,W=null;}function et(){return !!(A.backdrop&&A.backdrop.classList.contains("lc-open"))}function je(n){return !n||!n.cardId||n.disposed?false:n.isModal?et():true}function tt(n,t,e){z.forEach(function(i){je(i)&&i.cardId===n&&i.appendMessage(t,e,[]);});}function nt(){z.forEach(function(n){je(n)&&n.refresh();});}function at(){z.forEach(function(n){je(n)&&(n.awaitingProcessingAck&&n.setSendButtonPending(false),n.clearPending(),n.syncProcessingBar(),n.refresh());});}function rt(n,t){let e=G[n];return e&&e.elements&&e.elements[t]||null}return {render:Fe,update:ue,destroy:Ne,destroyAll:Ze,notify:we,subscribe:qe,appendChatMessage:tt,refreshOpenChatModal:nt,onServerSseEvent:at,openChatModal:K,mountChatPane:T,openFilesModal:ie,mountFilesUploadPane:We,mountFilesListPane:Ve,getElement:rt,registerRenderer(n,t){P[n]=t;},renderers:P,getChatStateForCard(n){let t=p.resolve(n);return t?me(t):{messages:[],receiving:false,processing:false}},startReceivingChatsForCard(n){typeof p.startReceivingChats=="function"&&p.startReceivingChats(n);},stopReceivingChatsForCard(n){typeof p.stopReceivingChats=="function"&&p.stopReceivingChats(n);},isReceivingChatsForCard(n){let t=p.resolve(n);return !t||!t.card_chats?false:!!t.card_chats.receiving}}}function mt(c,p,w){w=w||{};let I={current:w.mode||"board"},_={current:w.devMode||false},L=[],N={},q={},ne=w.showChat||false,P=w.defaultCol||6,G=ot(w.boardTheme,it),z=ot(w.boardRenderer,lt),D=ct(w.boardSkin,{boardClass:w.boardClass,listClass:w.listClass,canvasClass:w.canvasClass,canvasInnerClass:w.canvasInnerClass,styles:w.styles,boardStyle:w.boardStyle,listStyle:w.listStyle,canvasStyle:w.canvasStyle,canvasInnerStyle:w.canvasInnerStyle}),A=w.canvas||{},k={snap:A.snap||20,zoomMin:A.zoom&&A.zoom.min||.25,zoomMax:A.zoom&&A.zoom.max||2,zoom:A.zoom&&A.zoom.initial||1,edges:A.edges!==false,minWidth:A.minWidth||220,maxWidth:A.maxWidth||450,defaultW:A.defaultW||350,gapX:A.gapX||280,gapY:A.gapY||320,padX:A.padX||20,padY:A.padY||20,cardMaxH:A.cardMaxH||300,panX:0,panY:0},Q=new AbortController,W=Q.signal,j=[],S=A.edgeStyle||{};({color:S.color||"rgba(108, 117, 125, 0.6)",size:S.size||2,dash:S.dash!==false,animation:S.animation!==false,endPlug:S.endPlug||"arrow1"});let B=document.createElement("div");B.className="lc-board",p.appendChild(B);let U=null,K=document.createElement("div");K.className="row g-3 lc-board-grid";let T=document.createElement("div");T.className="lc-canvas",T.style.cssText="position:relative;overflow:auto;width:100%;";let O=document.createElement("div");O.className="lc-canvas-inner",O.style.cssText="position:relative;transform-origin:0 0;min-width:100%;min-height:100%;",T.appendChild(O);let ae=document.createElementNS("http://www.w3.org/2000/svg","svg");ae.setAttribute("class","lc-canvas-edges"),ae.style.cssText="position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden;z-index:0;";let oe=document.createElementNS("http://www.w3.org/2000/svg","defs");oe.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>',ae.appendChild(oe),O.appendChild(ae);function he(){let t=kt(L);return ct(t,G,D)}function ze(t){let e=[t&&t.styles,z&&typeof z.styles=="string"?z.styles:""].filter(function(i){return typeof i=="string"&&i.trim()}).join(`
89
+ `);if(!e){U&&U.parentNode&&U.parentNode.removeChild(U),U=null;return}U||(U=document.createElement("style"),U.setAttribute("data-lc-board-scope","1"),document.head.appendChild(U)),U.textContent=e;}function ie(t,e){return Object.assign({root:B,gridEl:K,canvasEl:T,canvasInner:O,appearance:t,mode:I.current,engine:c,nodes:L.slice(),containerEl:p},e||{})}function We(t){Ce(B,"lc-board",t.boardClass,"",t.boardStyle),Ce(K,"row g-3 lc-board-grid",t.listClass,"",t.listStyle);let e=K,i=K;if(z&&typeof z.createBoardHost=="function"){let r=z.createBoardHost(ie(t,{defaultMountEl:K,defaultListEl:K}));ke(r)?(e=r,i=r):r&&typeof r=="object"&&(e=r.mountEl||r.hostEl||r.containerEl||K,i=r.listEl||r.contentEl||r.mountEl||e);}return B.innerHTML="",e!==K&&i===K&&!e.contains(K)&&e.appendChild(K),e!==B?(i!==e&&!ke(i.parentNode)&&e.appendChild(i),B.appendChild(e)):i!==B&&!B.contains(i)&&B.appendChild(i),{mountEl:e,listEl:i}}function Ve(t){Ce(B,"lc-board",t.boardClass,"",t.boardStyle),Ce(T,"lc-canvas",t.canvasClass,"position:relative;overflow:auto;width:100%;",t.canvasStyle),Ce(O,"lc-canvas-inner",t.canvasInnerClass,"position:relative;transform-origin:0 0;min-width:100%;min-height:100%;",t.canvasInnerStyle);let e=T,i=T;if(z&&typeof z.createCanvasHost=="function"){let r=z.createCanvasHost(ie(t,{defaultMountEl:T,defaultSurfaceEl:T,defaultCanvasEl:T}));ke(r)?(e=r,i=r):r&&typeof r=="object"&&(e=r.mountEl||r.hostEl||r.containerEl||T,i=r.surfaceEl||r.canvasEl||r.mountEl||e);}return B.innerHTML="",e!==T&&i===T&&!e.contains(T)&&e.appendChild(T),e!==B?B.appendChild(e):i!==B&&!B.contains(i)&&B.appendChild(i),{mountEl:e,surfaceEl:i}}function ce(t,e,i){let r="col-12 col-md-"+qe(t),s=document.createElement("div"),l=null;if(s.className=r,s.dataset.nodeId=t.id,z&&typeof z.createBoardItem=="function"){let o=z.createBoardItem(t,ie(e,{listEl:i,defaultClassName:r,defaultContainerEl:s}));ke(o)?s=o:o&&typeof o=="object"&&(s=o.containerEl||o.colEl||o.mountEl||s,l=o.bodyEl||o.contentEl||null);}return s.dataset.nodeId||(s.dataset.nodeId=t.id),s.className||(s.className=r),{containerEl:s,bodyEl:l}}function we(t,e,i){let r="lc-canvas-card card shadow-sm",s=document.createElement("div"),l=null;if(s.className=r,s.dataset.nodeId=t.id,s.style.left=i.x+"px",s.style.top=i.y+"px",i.w&&(s.style.width=i.w+"px"),i.h&&(s.style.height=i.h+"px"),z&&typeof z.createCanvasItem=="function"){let o=z.createCanvasItem(t,ie(e,{defaultClassName:r,defaultContainerEl:s,position:i}));ke(o)?s=o:o&&typeof o=="object"&&(s=o.containerEl||o.cardEl||o.mountEl||s,l=o.bodyEl||o.contentEl||null);}return s.dataset.nodeId||(s.dataset.nodeId=t.id),s.className||(s.className=r),s.style.left=i.x+"px",s.style.top=i.y+"px",i.w&&(s.style.width=i.w+"px"),i.h&&(s.style.height=i.h+"px"),{containerEl:s,bodyEl:l}}if(!document.getElementById("lc-board-css")){let t=document.createElement("style");t.id="lc-board-css",t.textContent=`
90
90
  .lc-canvas-card { position:absolute; min-width:${k.minWidth}px; cursor:grab; user-select:none; z-index:1; }
91
91
  .lc-canvas-card.lc-dragging { cursor:grabbing; z-index:10; box-shadow:0 8px 24px rgba(0,0,0,0.18)!important; }
92
92
  .lc-canvas-card .card-body { overflow:hidden; }
@@ -99,10 +99,10 @@
99
99
  @keyframes lc-edge-flow { to { stroke-dashoffset:-10; } }
100
100
  .lc-source-node { position:absolute; cursor:grab; user-select:none; z-index:1; }
101
101
  .lc-source-node.lc-dragging { cursor:grabbing; z-index:10; }
102
- `,document.head.appendChild(t);}function qe(t){let e=t&&t.card?t.card.view:null;return e&&e.layout&&e.layout.board&&e.layout.board.col?e.layout.board.col:P}function Ye(t,e,i,r,s){let o=c.renderers&&c.renderers[e];if(!o){r.innerHTML='<div class="text-muted small">No builtin renderer for '+x(e)+"</div>";return}try{o(i,r,s||{kind:e},t);}catch(l){r.innerHTML='<div class="text-danger small">Builtin render error: '+x(l&&l.message)+"</div>";}}function _e(t){return {chatState:ge(t),get chatMessages(){return c.getChatStateForCard?c.getChatStateForCard(t.id).messages:ge(t).messages},get isReceivingChats(){return c.isReceivingChatsForCard?c.isReceivingChatsForCard(t.id):!!ge(t).receiving},startReceivingChats:function(){c.startReceivingChatsForCard&&c.startReceivingChatsForCard(t.id);},stopReceivingChats:function(){c.stopReceivingChatsForCard&&c.stopReceivingChatsForCard(t.id);},renderBuiltin:function(e,i,r,s,o){Ye(e||t,i,r,s,o);},mountChatPane:function(e){return c.mountChatPane(Object.assign({},e,{cardId:t.id}))},mountFilesUploadPane:function(e){return c.mountFilesUploadPane(Object.assign({},e,{cardId:t.id}))},mountFilesListPane:function(e){return c.mountFilesListPane(Object.assign({},e,{cardId:t.id}))}}}function Le(t,e,i){let r=Se(t),s=r?ye[r]:null;if(!s||!s.renderBody)return null;let o=_e(t),l=null;s.createShell&&(l=s.createShell(t,{container:e,isCanvas:!!i}),l&&e.appendChild(l));let f=l||e;return s.renderBody(t,f,o),f}function Xe(){let t=w.positions||{};L.forEach((e,i)=>{if(!q[e.id])if(t[e.id])q[e.id]=Object.assign({},t[e.id]);else if(e.card&&e.card.view&&e.card.view.layout&&e.card.view.layout.canvas&&e.card.view.layout.canvas.x!=null)q[e.id]=Object.assign({},e.card.view.layout.canvas);else {let r=i%4,s=Math.floor(i/4);q[e.id]={x:r*k.gapX+k.padX,y:s*k.gapY+k.padY,w:k.defaultW};}});}function Pe(t){return t&&t.card&&Array.isArray(t.card.requires)?t.card.requires:[]}function Ue(t){return !t||!t.card?[t?t.id:""]:Array.isArray(t.card.provides)&&t.card.provides.length>0?t.card.provides.map(function(e){return typeof e=="string"?e:e.bindTo||e}):[t.id]}function Me(){var t={};return L.forEach(function(e){Ue(e).forEach(function(i){t[i]=e.id;});}),t}function Je(t,e){var i=[],r={};return Pe(t).forEach(function(s){var o=e[s];o&&!r[o]&&(r[o]=true,i.push(o));}),i}function Ke(t){let e=document.createElement("div");e.className="modal d-block",e.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 i=document.createElement("div");i.className="modal-dialog",i.style.cssText="width: 92%; max-width: 980px; max-height: 88vh; overflow: auto;";let r=document.createElement("div");r.className="modal-content";let s=document.createElement("div");s.className="modal-header",s.innerHTML=`<h5 class="modal-title">Card Inspector: ${x(t.card&&t.card.meta&&t.card.meta.title||t.id)}</h5><button type="button" class="btn-close" aria-label="Close"></button>`;let o=function(){e.remove();};s.querySelector(".btn-close").addEventListener("click",o);let l=document.createElement("div");l.className="modal-body",l.style.cssText="max-height: 64vh; overflow-y: auto;";let f=document.createElement("div");f.className="mb-4",f.innerHTML='<h6 class="fw-semibold mb-2">Card Definition (Read-only)</h6>';let a=t&&t.card?t.card:{};f.innerHTML+=`<pre style="background: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; font-size: 12px; white-space: pre-wrap; word-wrap: break-word;">${x(JSON.stringify(a,null,2))}</pre>`,l.appendChild(f);let d=document.createElement("div");d.className="mb-4",d.innerHTML='<h6 class="fw-semibold mb-2">Computed Values (Read-only)</h6>';let u=t.computed_values||{};d.innerHTML+=`<pre style="background: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; font-size: 12px; white-space: pre-wrap; word-wrap: break-word;">${x(JSON.stringify(u,null,2))}</pre>`,l.appendChild(d);let m=document.createElement("div");m.className="mb-4",m.innerHTML='<h6 class="fw-semibold mb-2">Requires (Read-only)</h6>';let g=t.requires||{};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;">${x(JSON.stringify(g,null,2))}</pre>`,l.appendChild(m);let v=document.createElement("div");v.className="mb-2",v.innerHTML='<h6 class="fw-semibold mb-2">Runtime Status (Read-only)</h6>';let E={status:t.card_data&&t.card_data.status,lastRun:t.card_data&&t.card_data.lastRun,error:t.card_data&&t.card_data.error};v.innerHTML+=`<pre style="background: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; font-size: 12px; white-space: pre-wrap; word-wrap: break-word;">${x(JSON.stringify(E,null,2))}</pre>`,l.appendChild(v);let h=document.createElement("div");h.className="modal-footer";let y=document.createElement("button");y.type="button",y.className="btn btn-secondary",y.textContent="Close",y.addEventListener("click",o),h.appendChild(y),r.appendChild(s),r.appendChild(l),r.appendChild(h),i.appendChild(r),e.appendChild(i),document.body.appendChild(e);}function xe(t){let e=document.createElement("div"),i=t&&t.card?t.card:{},r=i.meta&&i.meta.simulation===true,s=i.meta&&i.meta._gandalfCard===true,o=t&&t.runtime_state&&t.runtime_state.task_status==="running",l=r?" lc-simulation-card":s?" lc-gandalf-card":"";e.className="card shadow-sm h-100"+l+(o?" lc-running":"");let f=document.createElement("div");f.className="card-header d-flex align-items-center gap-2 py-2";let a=i.meta&&i.meta.title||t.id,d=i.meta&&i.meta.tags||[],u="";if(i.source_defs&&i.source_defs.length&&!i.view){var m=i.source_defs[0]||{};u='<span class="badge bg-info text-dark ms-auto">'+x(m.kind||"source")+"</span>";}else d.length&&(u=d.map(h=>'<span class="badge bg-secondary ms-1">'+x(h)+"</span>").join(""));if(f.innerHTML='<strong class="small">'+x(a)+"</strong>"+u,s){let h=document.createElement("span");h.className="lc-gandalf-caret",h.title="Collapse / expand",h.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>',f.appendChild(h);let y="lc-gandalf-collapsed:"+(t.id||a);sessionStorage.getItem(y)==="1"&&(e.classList.add("lc-collapsed"),f.dataset.gandalfCollapsed="1"),h.addEventListener("click",function(b){b.stopPropagation();let F=h.closest(".lc-gandalf-card")||e;F.classList.toggle("lc-collapsed"),sessionStorage.setItem(y,F.classList.contains("lc-collapsed")?"1":"0");}),h.addEventListener("pointerdown",b=>b.stopPropagation());}if(r){let h=document.createElement("span");h.className="d-inline-flex align-items-center gap-1 ms-auto";let y=document.createElement("button");y.className="btn btn-sm btn-outline-success lc-sim-pin",y.style.cssText="padding: 2px 6px;",y.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>',y.title="Pin this simulation card",y.dataset.nodeId=t.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=t.id,h.appendChild(y),h.appendChild(b),f.appendChild(h);}if(_.current){let h=document.createElement("button");h.className="btn btn-sm btn-outline-secondary",h.style.cssText="padding: 2px 6px;"+(r?"":" margin-left: auto;"),h.innerHTML="&lt;/&gt;",h.title="Inspect card data",h.addEventListener("click",function(y){y.stopPropagation(),Ke(t);}),f.appendChild(h);}let g=document.createElement("div");g.className="card-body p-2";let v=i.requires&&Array.isArray(i.requires)?i.requires:[],E=Array.isArray(i.provides)&&i.provides.length?i.provides.map(function(h){return typeof h=="string"?h:h.bindTo||h}):[t.id];if(v.length){let h=document.createElement("div");h.className="lc-token-row lc-token-row-requires",v.forEach(function(y){let b=document.createElement("span");b.className="lc-token-gem lc-token-gem-requires",b.dataset.token=y,b.title=y,h.appendChild(b);}),e.appendChild(h);}if(e.appendChild(f),e.appendChild(g),E.length){let h=document.createElement("div");h.className="lc-token-row lc-token-row-provides",E.forEach(function(y){let b=document.createElement("span");b.className="lc-token-gem lc-token-gem-provides",b.dataset.token=y,b.title=y,h.appendChild(b);}),e.appendChild(h);}return {wrap:e,header:f,body:g}}function Ge(t){let e=document.createElement("div");e.className="lc-source-node";let i=t.card_data&&t.card_data.status||"fresh",r=t&&t.card?t.card:{},s=r.meta&&r.meta.title||t.id,o=r.source_defs&&r.source_defs[0]&&r.source_defs[0].kind||"source";return e.innerHTML=`<div class="lc-source-pill shadow-sm">
102
+ `,document.head.appendChild(t);}function qe(t){let e=t&&t.card?t.card.view:null;return e&&e.layout&&e.layout.board&&e.layout.board.col?e.layout.board.col:P}function Ye(t,e,i,r,s){let l=c.renderers&&c.renderers[e];if(!l){r.innerHTML='<div class="text-muted small">No builtin renderer for '+x(e)+"</div>";return}try{l(i,r,s||{kind:e},t);}catch(o){r.innerHTML='<div class="text-danger small">Builtin render error: '+x(o&&o.message)+"</div>";}}function _e(t){return {chatState:me(t),get chatMessages(){return c.getChatStateForCard?c.getChatStateForCard(t.id).messages:me(t).messages},get isReceivingChats(){return c.isReceivingChatsForCard?c.isReceivingChatsForCard(t.id):!!me(t).receiving},startReceivingChats:function(){c.startReceivingChatsForCard&&c.startReceivingChatsForCard(t.id);},stopReceivingChats:function(){c.stopReceivingChatsForCard&&c.stopReceivingChatsForCard(t.id);},renderBuiltin:function(e,i,r,s,l){Ye(e||t,i,r,s,l);},mountChatPane:function(e){return c.mountChatPane(Object.assign({},e,{cardId:t.id}))},mountFilesUploadPane:function(e){return c.mountFilesUploadPane(Object.assign({},e,{cardId:t.id}))},mountFilesListPane:function(e){return c.mountFilesListPane(Object.assign({},e,{cardId:t.id}))}}}function Le(t,e,i){let r=Se(t),s=r?be[r]:null;if(!s||!s.renderBody)return null;let l=_e(t),o=null;s.createShell&&(o=s.createShell(t,{container:e,isCanvas:!!i}),o&&e.appendChild(o));let f=o||e;return s.renderBody(t,f,l),f}function Xe(){let t=w.positions||{};L.forEach((e,i)=>{if(!q[e.id])if(t[e.id])q[e.id]=Object.assign({},t[e.id]);else if(e.card&&e.card.view&&e.card.view.layout&&e.card.view.layout.canvas&&e.card.view.layout.canvas.x!=null)q[e.id]=Object.assign({},e.card.view.layout.canvas);else {let r=i%4,s=Math.floor(i/4);q[e.id]={x:r*k.gapX+k.padX,y:s*k.gapY+k.padY,w:k.defaultW};}});}function Pe(t){return t&&t.card&&Array.isArray(t.card.requires)?t.card.requires:[]}function Ue(t){return !t||!t.card?[t?t.id:""]:Array.isArray(t.card.provides)&&t.card.provides.length>0?t.card.provides.map(function(e){return typeof e=="string"?e:e.bindTo||e}):[t.id]}function Me(){var t={};return L.forEach(function(e){Ue(e).forEach(function(i){t[i]=e.id;});}),t}function Je(t,e){var i=[],r={};return Pe(t).forEach(function(s){var l=e[s];l&&!r[l]&&(r[l]=true,i.push(l));}),i}function Ke(t){let e=document.createElement("div");e.className="modal d-block",e.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 i=document.createElement("div");i.className="modal-dialog",i.style.cssText="width: 92%; max-width: 980px; max-height: 88vh; overflow: auto;";let r=document.createElement("div");r.className="modal-content";let s=document.createElement("div");s.className="modal-header",s.innerHTML=`<h5 class="modal-title">Card Inspector: ${x(t.card&&t.card.meta&&t.card.meta.title||t.id)}</h5><button type="button" class="btn-close" aria-label="Close"></button>`;let l=function(){e.remove();};s.querySelector(".btn-close").addEventListener("click",l);let o=document.createElement("div");o.className="modal-body",o.style.cssText="max-height: 64vh; overflow-y: auto;";let f=document.createElement("div");f.className="mb-4",f.innerHTML='<h6 class="fw-semibold mb-2">Card Definition (Read-only)</h6>';let a=t&&t.card?t.card:{};f.innerHTML+=`<pre style="background: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; font-size: 12px; white-space: pre-wrap; word-wrap: break-word;">${x(JSON.stringify(a,null,2))}</pre>`,o.appendChild(f);let d=document.createElement("div");d.className="mb-4",d.innerHTML='<h6 class="fw-semibold mb-2">Computed Values (Read-only)</h6>';let u=t.computed_values||{};d.innerHTML+=`<pre style="background: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; font-size: 12px; white-space: pre-wrap; word-wrap: break-word;">${x(JSON.stringify(u,null,2))}</pre>`,o.appendChild(d);let m=document.createElement("div");m.className="mb-4",m.innerHTML='<h6 class="fw-semibold mb-2">Requires (Read-only)</h6>';let g=t.requires||{};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;">${x(JSON.stringify(g,null,2))}</pre>`,o.appendChild(m);let v=document.createElement("div");v.className="mb-2",v.innerHTML='<h6 class="fw-semibold mb-2">Runtime Status (Read-only)</h6>';let E={status:t.card_data&&t.card_data.status,lastRun:t.card_data&&t.card_data.lastRun,error:t.card_data&&t.card_data.error};v.innerHTML+=`<pre style="background: #f5f5f5; padding: 10px; border-radius: 4px; overflow-x: auto; font-size: 12px; white-space: pre-wrap; word-wrap: break-word;">${x(JSON.stringify(E,null,2))}</pre>`,o.appendChild(v);let h=document.createElement("div");h.className="modal-footer";let y=document.createElement("button");y.type="button",y.className="btn btn-secondary",y.textContent="Close",y.addEventListener("click",l),h.appendChild(y),r.appendChild(s),r.appendChild(o),r.appendChild(h),i.appendChild(r),e.appendChild(i),document.body.appendChild(e);}function xe(t){let e=document.createElement("div"),i=t&&t.card?t.card:{},r=i.meta&&i.meta.simulation===true,s=i.meta&&i.meta._gandalfCard===true,l=t&&t.runtime_state&&t.runtime_state.task_status==="running",o=r?" lc-simulation-card":s?" lc-gandalf-card":"";e.className="card shadow-sm h-100"+o+(l?" lc-running":"");let f=document.createElement("div");f.className="card-header d-flex align-items-center gap-2 py-2";let a=i.meta&&i.meta.title||t.id,d=i.meta&&i.meta.tags||[],u="";if(i.source_defs&&i.source_defs.length&&!i.view){var m=i.source_defs[0]||{};u='<span class="badge bg-info text-dark ms-auto">'+x(m.kind||"source")+"</span>";}else d.length&&(u=d.map(h=>'<span class="badge bg-secondary ms-1">'+x(h)+"</span>").join(""));if(f.innerHTML='<strong class="small">'+x(a)+"</strong>"+u,s){let h=document.createElement("span");h.className="lc-gandalf-caret",h.title="Collapse / expand",h.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>',f.appendChild(h);let y="lc-gandalf-collapsed:"+(t.id||a);sessionStorage.getItem(y)==="1"&&(e.classList.add("lc-collapsed"),f.dataset.gandalfCollapsed="1"),h.addEventListener("click",function(b){b.stopPropagation();let F=h.closest(".lc-gandalf-card")||e;F.classList.toggle("lc-collapsed"),sessionStorage.setItem(y,F.classList.contains("lc-collapsed")?"1":"0");}),h.addEventListener("pointerdown",b=>b.stopPropagation());}if(r){let h=document.createElement("span");h.className="d-inline-flex align-items-center gap-1 ms-auto";let y=document.createElement("button");y.className="btn btn-sm btn-outline-success lc-sim-pin",y.style.cssText="padding: 2px 6px;",y.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>',y.title="Pin this simulation card",y.dataset.nodeId=t.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=t.id,h.appendChild(y),h.appendChild(b),f.appendChild(h);}if(_.current){let h=document.createElement("button");h.className="btn btn-sm btn-outline-secondary",h.style.cssText="padding: 2px 6px;"+(r?"":" margin-left: auto;"),h.innerHTML="&lt;/&gt;",h.title="Inspect card data",h.addEventListener("click",function(y){y.stopPropagation(),Ke(t);}),f.appendChild(h);}let g=document.createElement("div");g.className="card-body p-2";let v=i.requires&&Array.isArray(i.requires)?i.requires:[],E=Array.isArray(i.provides)&&i.provides.length?i.provides.map(function(h){return typeof h=="string"?h:h.bindTo||h}):[t.id];if(v.length){let h=document.createElement("div");h.className="lc-token-row lc-token-row-requires",v.forEach(function(y){let b=document.createElement("span");b.className="lc-token-gem lc-token-gem-requires",b.dataset.token=y,b.title=y,h.appendChild(b);}),e.appendChild(h);}if(e.appendChild(f),e.appendChild(g),E.length){let h=document.createElement("div");h.className="lc-token-row lc-token-row-provides",E.forEach(function(y){let b=document.createElement("span");b.className="lc-token-gem lc-token-gem-provides",b.dataset.token=y,b.title=y,h.appendChild(b);}),e.appendChild(h);}return {wrap:e,header:f,body:g}}function Ge(t){let e=document.createElement("div");e.className="lc-source-node";let i=t.card_data&&t.card_data.status||"fresh",r=t&&t.card?t.card:{},s=r.meta&&r.meta.title||t.id,l=r.source_defs&&r.source_defs[0]&&r.source_defs[0].kind||"source";return e.innerHTML=`<div class="lc-source-pill shadow-sm">
103
103
  ${ut(i)}
104
104
  <span class="fw-medium">${x(s)}</span>
105
- <span class="badge bg-info text-dark">${x(o)}</span>
106
- </div>`,e}function Te(){var t=100,e=0,i=0;O.querySelectorAll(".lc-canvas-card,.lc-source-node").forEach(function(r){var s=r.offsetLeft+r.offsetWidth,o=r.offsetTop+r.offsetHeight;s>e&&(e=s),o>i&&(i=o);}),O.style.width=e+t+"px",O.style.height=i+t+"px";}function Qe(){let t=de();ze(t),be(),document.body.style.overflow="";let e=We(t);le=e,e.listEl.innerHTML="";let i=L.filter(r=>r.card&&r.card.view).slice();i.sort((r,s)=>{let o=r.card&&r.card.view&&r.card.view.layout&&r.card.view.layout.board&&r.card.view.layout.board.order||0,l=s.card&&s.card.view&&s.card.view.layout&&s.card.view.layout.board&&s.card.view.layout.board.order||0;return o-l}),i.forEach(r=>{let s=ue(r,t,e.listEl),o=s.containerEl,l=Se(r),f=l?ye[l]:null;if(f&&f.renderBody){e.listEl.appendChild(o);let a=Le(r,s.bodyEl||o,false);A[r.id]={node:r,colEl:o,bodyEl:a||o,isCustom:true};}else {let{wrap:a,body:d}=xe(r);(s.bodyEl||o).appendChild(a),e.listEl.appendChild(o),A[r.id]={node:r,colEl:o,bodyEl:d},c.render(r,d,{showChat:ne});}}),Ae(),z&&typeof z.afterRenderBoard=="function"&&z.afterRenderBoard(ie(t,{mountEl:e.mountEl,listEl:e.listEl,cards:i.slice(),nodeMap:A}));}function Ie(){O.style.transform=`translate(${k.panX}px,${k.panY}px) scale(${k.zoom})`;}function Ae(){var t=Me(),e={};L.forEach(function(r){var s=r.card_data||r.card&&r.card.card_data,o=r.computed_values,l=s&&s.status,f=s&&Object.keys(s).length>0||o&&Object.keys(o).length>0;e[r.id]=f||l==="fresh"||l==="completed";});var i=N.querySelectorAll(".lc-token-gem");i.forEach(function(r){var s=r.dataset.token;if(s){if(r.classList.contains("lc-token-gem-provides")){var o=r.closest("[data-node-id]"),l=o&&o.dataset.nodeId;r.classList.toggle("lc-token-available",!!(l&&e[l]));}else if(r.classList.contains("lc-token-gem-requires")){var f=t[s];r.classList.toggle("lc-token-available",!!(f&&e[f]));}}});}function be(){j.forEach(function(t){try{t.remove();}catch{}}),j.length=0;}function oe(){j.forEach(function(t){try{t.position();}catch{}});}function fe(){if(be(),ae.querySelectorAll("line,path").forEach(function(e){e.remove();}),!!k.edges){var t=Me();L.forEach(function(e){var i=A[e.id];!i||!i.colEl||Pe(e).forEach(function(r){var s=t[r];if(s){var o=A[s];if(!(!o||!o.colEl)){var l=o.colEl.querySelector('.lc-token-gem-provides[data-token="'+r+'"]'),f=i.colEl.querySelector('.lc-token-gem-requires[data-token="'+r+'"]'),a,d,u,m,g=O.getBoundingClientRect();if(l){var v=l.getBoundingClientRect();a=(v.left+v.width/2-g.left)/k.zoom,d=(v.bottom-g.top)/k.zoom;}else {var E=o.colEl;a=E.offsetLeft+E.offsetWidth/2,d=E.offsetTop+E.offsetHeight;}if(f){var h=f.getBoundingClientRect();u=(h.left+h.width/2-g.left)/k.zoom,m=(h.top-g.top)/k.zoom;}else {var y=i.colEl;u=y.offsetLeft+y.offsetWidth/2,m=y.offsetTop;}var b=u-a,F=m-d,re=Math.sqrt(b*b+F*F),Y=Math.max(40,Math.min(re*.4,120)),ee=Math.abs(b),M=Math.abs(F),C,$,X,Z;if(M>ee*.4)C=a,$=d+Y,X=u,Z=m-Y;else {var R=b>0?1:-1;C=a+R*Y,$=d+Y*.5,X=u-R*Y,Z=m-Y*.5;}var se="M "+a+" "+d+" C "+C+" "+$+", "+X+" "+Z+", "+u+" "+m,H=document.createElementNS("http://www.w3.org/2000/svg","path");H.setAttribute("d",se),H.setAttribute("fill","none"),H.setAttribute("marker-end","url(#lc-arrow)"),H.classList.add("lc-edge-path"),ae.appendChild(H);}}});});}}function $e(t,e){let i,r,s,o,l=false;t.addEventListener("pointerdown",f=>{f.button===0&&(f.target.closest("input,textarea,select,button,a,.form-check-input")||(l=true,t.classList.add("lc-dragging"),t.setPointerCapture(f.pointerId),i=f.clientX,r=f.clientY,s=t.offsetLeft,o=t.offsetTop,f.preventDefault()));},{signal:W}),t.addEventListener("pointermove",f=>{if(!l)return;let a=(f.clientX-i)/k.zoom,d=(f.clientY-r)/k.zoom;t.style.left=s+a+"px",t.style.top=o+d+"px",j.length?oe():fe();},{signal:W}),t.addEventListener("pointerup",()=>{if(!l)return;l=false,t.classList.remove("lc-dragging");let f=t.offsetLeft,a=t.offsetTop;k.snap>1&&(f=Math.round(f/k.snap)*k.snap,a=Math.round(a/k.snap)*k.snap),t.style.left=f+"px",t.style.top=a+"px",q[e.id]=Object.assign(q[e.id]||{},{x:f,y:a}),e.card&&e.card.view&&(e.card.view.layout||(e.card.view.layout={}),e.card.view.layout.canvas||(e.card.view.layout.canvas={}),e.card.view.layout.canvas.x=f,e.card.view.layout.canvas.y=a),c.notify(e.id),Te(),j.length?oe():fe();},{signal:W});}function Be(t,e){let i=document.createElement("div");i.className="lc-resize-handle",t.appendChild(i),t.style.overflow="visible";let r=false,s,o,l,f;i.addEventListener("pointerdown",function(a){a.button===0&&(a.stopPropagation(),a.preventDefault(),r=true,t.classList.add("lc-resizing"),i.setPointerCapture(a.pointerId),s=a.clientX,o=a.clientY,l=t.offsetWidth,f=t.offsetHeight);},{signal:W}),i.addEventListener("pointermove",function(a){if(!r)return;let d=(a.clientX-s)/k.zoom,u=(a.clientY-o)/k.zoom,m=Math.max(k.minWidth,l+d),g=Math.max(80,f+u);t.style.width=m+"px",t.style.height=g+"px",j.length?oe():fe();},{signal:W}),i.addEventListener("pointerup",function(){if(!r)return;r=false,t.classList.remove("lc-resizing");let a=t.offsetWidth,d=t.offsetHeight,u=k.snap>1?Math.round(a/k.snap)*k.snap:a,m=k.snap>1?Math.round(d/k.snap)*k.snap:d;t.style.width=u+"px",t.style.height=m+"px",q[e.id]=Object.assign(q[e.id]||{},{w:u,h:m}),e.card&&e.card.view&&(e.card.view.layout||(e.card.view.layout={}),e.card.view.layout.canvas||(e.card.view.layout.canvas={}),e.card.view.layout.canvas.w=u,e.card.view.layout.canvas.h=m),c.notify(e.id),Te(),j.length?oe():fe();},{signal:W});}function Fe(){let t=de();ze(t),be(),document.body.style.overflow="hidden";let e=Ve(t);var i=T.getBoundingClientRect().top;T.style.height=B.height||"calc(100vh - "+i+"px)",O.querySelectorAll(".lc-canvas-card,.lc-source-node").forEach(a=>a.remove()),ae.querySelectorAll("line,path").forEach(function(a){a.remove();}),Xe(),Ie(),L.forEach(a=>{let d=q[a.id]||{x:0,y:0};if((!a.card||!a.card.view)&&a.card&&a.card.source_defs&&a.card.source_defs.length){let u=Ge(a);u.dataset.nodeId=a.id,u.style.left=d.x+"px",u.style.top=d.y+"px",O.appendChild(u),A[a.id]={node:a,colEl:u,bodyEl:null},$e(u,a);}else {let u=we(a,t,d),m=u.containerEl,g=a.card&&a.card.meta&&a.card.meta.simulation===true,v=a.card&&a.card.meta&&a.card.meta._gandalfCard===true,E=g?" lc-simulation-card":v?" lc-gandalf-card":"";m.className=ve(m.className||"lc-canvas-card card shadow-sm",E);let h=Se(a),y=h?ye[h]:null;if(y&&y.renderBody){O.appendChild(m);let b=Le(a,u.bodyEl||m,true);A[a.id]={node:a,colEl:m,bodyEl:b||m,isCustom:true};}else {let{wrap:b,body:F}=xe(a),re=u.bodyEl||m;for(;b.firstChild;)re.appendChild(b.firstChild);let Y=m.querySelector(".card-header");Y&&Y.dataset.gandalfCollapsed==="1"&&m.classList.add("lc-collapsed"),O.appendChild(m),A[a.id]={node:a,colEl:m,bodyEl:F},c.render(a,F,{showChat:false});}$e(m,a),Be(m,a);}}),Ae(),requestAnimationFrame(function(){Te(),fe();}),z&&typeof z.afterRenderCanvas=="function"&&z.afterRenderCanvas(ie(t,{mountEl:e.mountEl,surfaceEl:e.surfaceEl,nodeMap:A})),T.addEventListener("scroll",function(){oe();},{signal:W,passive:true});let r=false,s,o,l,f;T.addEventListener("pointerdown",a=>{a.target!==T&&a.target!==O||(a.button===1||a.button===0&&a.ctrlKey)&&(r=true,T.setPointerCapture(a.pointerId),s=a.clientX,o=a.clientY,l=k.panX,f=k.panY,a.preventDefault());},{signal:W}),T.addEventListener("pointermove",a=>{r&&(k.panX=l+(a.clientX-s),k.panY=f+(a.clientY-o),Ie(),oe());},{signal:W}),T.addEventListener("pointerup",()=>{r=false;},{signal:W}),T.addEventListener("wheel",a=>{if(!a.ctrlKey)return;a.preventDefault();let d=a.deltaY>0?.9:1.1;k.zoom=Math.min(k.zoomMax,Math.max(k.zoomMin,k.zoom*d)),Ie(),oe();},{signal:W,passive:false});}function pe(){I.current==="canvas"?Fe():Qe();}function Ne(){let t=Me(),e={},i={};L.forEach(o=>{e[o.id]=[],i[o.id]=0;}),L.forEach(o=>{Je(o,t).forEach(l=>{e[o.id]&&e[o.id].push(l);});});let r=true;for(;r;)r=false,L.forEach(o=>{(e[o.id]||[]).forEach(l=>{i[l]!=null&&i[l]+1>i[o.id]&&(i[o.id]=i[l]+1,r=true);});});let s={};L.forEach(o=>{let l=i[o.id]||0;s[l]||(s[l]=0);let f=s[l]++;q[o.id]={x:l*400+40,y:f*300+40,w:q[o.id]&&q[o.id].w||k.defaultW},o.view&&(o.view.layout||(o.view.layout={}),o.view.layout.canvas=Object.assign({},q[o.id]));}),I.current==="canvas"&&Fe();}function Ze(t){A[t.id]||(L.push(t),pe());}function et(t){c.destroy(t);let e=L.findIndex(i=>i.id===t);e>=0&&L.splice(e,1),delete A[t],delete q[t],pe();}function je(t){L.length=0,t.forEach(e=>{let i=A[e];i&&L.push(i.node);}),pe();}function tt(t,e){let i=A[t];if(!i)throw new Error("updateNode: unknown node id "+t);let r=i.node;e&&typeof e=="object"&&(e.card!==void 0&&(r.card=e.card),e.card_data!==void 0&&(r.card_data=e.card_data),e.requires!==void 0&&(r.requires=e.requires),e.computed_values!==void 0&&(r.computed_values=e.computed_values),e.runtime_state!==void 0&&(r.runtime_state=e.runtime_state),e.card_chats!==void 0&&(r.card_chats=e.card_chats)),c.destroy(t);let s=Se(r),o=s?ye[s]:null;if(o&&o.renderBody){let l=i.colEl;l.innerHTML="";let f=Le(r,l,I.current==="canvas");A[t]={node:r,colEl:l,bodyEl:f||l,isCustom:true};}else if(I.current==="board"){let l=i.colEl;l.innerHTML="";let f=xe(r);l.appendChild(f.wrap),A[t]={node:r,colEl:l,bodyEl:f.body},c.render(r,f.body,{showChat:ne});}else {let l=i.colEl;l.innerHTML="";let f=xe(r);for(;f.wrap.firstChild;)l.appendChild(f.wrap.firstChild);A[t]={node:r,colEl:l,bodyEl:f.body},c.render(r,f.body,{showChat:false});}if(Ae(),I.current==="board"&&z&&typeof z.afterRenderBoard=="function"){let l=de(),f=L.filter(a=>a.card&&a.card.view).slice();f.sort((a,d)=>{let u=a.card&&a.card.view&&a.card.view.layout&&a.card.view.layout.board&&a.card.view.layout.board.order||0,m=d.card&&d.card.view&&d.card.view.layout&&d.card.view.layout.board&&d.card.view.layout.board.order||0;return u-m}),z.afterRenderBoard(ie(l,{mountEl:le.mountEl,listEl:le.listEl,cards:f,nodeMap:A}));}}function nt(){be(),c.destroyAll(),L.length=0,Object.keys(A).forEach(t=>delete A[t]),Object.keys(q).forEach(t=>delete q[t]),N.innerHTML="";}function at(t){t!=="board"&&t!=="canvas"||(I.current=t,pe());}function rt(t){_.current=!!t,pe();}function n(){be(),document.body.style.overflow="",Q.abort(),U&&U.parentNode&&U.parentNode.removeChild(U),U=null,c.destroyAll(),L.length=0,Object.keys(A).forEach(t=>delete A[t]),N.innerHTML="",N.parentNode&&N.parentNode.removeChild(N);}return w.nodes&&w.nodes.length&&w.nodes.forEach(t=>L.push(t)),pe(),{add:Ze,remove:et,reorder:je,updateNode:tt,clear:nt,setMode:at,setDevMode:rt,autoLayout:Ne,destroy:n,get mode(){return I.current},get devMode(){return _.current},get nodes(){return L.slice()},get engine(){return c}}}function Tt(c,p,w){w=w||{};let I=w.initialState,_=w.getNodeIds,L=w.selectNode;if(typeof _!="function"||typeof L!="function")throw new Error("LiveCard.Board requires getNodeIds and selectNode functions");let A=I,q={},ne={};function P(S){return S==null||typeof S!="object"?JSON.stringify(S):Array.isArray(S)?"["+S.map(P).join(",")+"]":"{"+Object.keys(S).sort().map(N=>JSON.stringify(N)+":"+P(S[N])).join(",")+"}"}function G(S){return !S||typeof S!="object"?"null":P({card:S.card,card_data:S.card_data,requires:S.requires,computed_values:S.computed_values,runtime_state:S.runtime_state,card_chats:S.card_chats})}let D=_(A).map(S=>{let V=L(A,S);return q[S]=V,ne[S]=G(V),V}),B={};Object.keys(w).forEach(S=>{S==="initialState"||S==="getNodeIds"||S==="selectNode"||S==="nodes"||(B[S]=w[S]);}),B.nodes=D;let k=mt(c,p,B);function Q(S,V){return S!==V}function W(S){let V=typeof S=="function"?S(A):S;if(V===void 0)return;A=V;let N=_(A),U=new Set(N);Object.keys(q).forEach(T=>{U.has(T)||(k.remove(T),delete q[T],delete ne[T]);}),N.forEach(T=>{let O=L(A,T),ae=q[T],ce=G(O),de=ne[T];ae?Q(de,ce)&&k.updateNode(T,O):k.add(O),q[T]=O,ne[T]=ce;});let le=k.nodes.map(T=>T.id);(N.length!==le.length||N.some((T,O)=>T!==le[O]))&&k.reorder(N);}function j(){Object.keys(q).forEach(S=>delete q[S]),Object.keys(ne).forEach(S=>delete ne[S]),k.destroy();}return {setState:W,destroy:j,core:k,get state(){return A}}}return {init:Mt,Board:Tt,BoardCore:mt,registerCardRenderer:vt,registerBoardTheme:wt,registerBoardRenderer:xt}})(),gt=It;typeof globalThis<"u"&&(globalThis.LiveCard=gt);
105
+ <span class="badge bg-info text-dark">${x(l)}</span>
106
+ </div>`,e}function Te(){var t=100,e=0,i=0;O.querySelectorAll(".lc-canvas-card,.lc-source-node").forEach(function(r){var s=r.offsetLeft+r.offsetWidth,l=r.offsetTop+r.offsetHeight;s>e&&(e=s),l>i&&(i=l);}),O.style.width=e+t+"px",O.style.height=i+t+"px";}function Qe(){let t=he();ze(t),ge(),document.body.style.overflow="";let e=We(t);e.listEl.innerHTML="";let i=L.filter(r=>r.card&&r.card.view).slice();i.sort((r,s)=>{let l=r.card&&r.card.view&&r.card.view.layout&&r.card.view.layout.board&&r.card.view.layout.board.order||0,o=s.card&&s.card.view&&s.card.view.layout&&s.card.view.layout.board&&s.card.view.layout.board.order||0;return l-o}),i.forEach(r=>{let s=ce(r,t,e.listEl),l=s.containerEl,o=Se(r),f=o?be[o]:null;if(f&&f.renderBody){e.listEl.appendChild(l);let a=Le(r,s.bodyEl||l,false);N[r.id]={node:r,colEl:l,bodyEl:a||l,isCustom:true};}else {let{wrap:a,body:d}=xe(r);(s.bodyEl||l).appendChild(a),e.listEl.appendChild(l),N[r.id]={node:r,colEl:l,bodyEl:d},c.render(r,d,{showChat:ne});}}),Ae(),z&&typeof z.afterRenderBoard=="function"&&z.afterRenderBoard(ie(t,{mountEl:e.mountEl,listEl:e.listEl,cards:i.slice(),nodeMap:N}));}function Ie(){O.style.transform=`translate(${k.panX}px,${k.panY}px) scale(${k.zoom})`;}function Ae(){var t=Me(),e={};L.forEach(function(r){var s=r.card_data||r.card&&r.card.card_data,l=r.computed_values,o=s&&s.status,f=s&&Object.keys(s).length>0||l&&Object.keys(l).length>0;e[r.id]=f||o==="fresh"||o==="completed";});var i=B.querySelectorAll(".lc-token-gem");i.forEach(function(r){var s=r.dataset.token;if(s){if(r.classList.contains("lc-token-gem-provides")){var l=r.closest("[data-node-id]"),o=l&&l.dataset.nodeId;r.classList.toggle("lc-token-available",!!(o&&e[o]));}else if(r.classList.contains("lc-token-gem-requires")){var f=t[s];r.classList.toggle("lc-token-available",!!(f&&e[f]));}}});}function ge(){j.forEach(function(t){try{t.remove();}catch{}}),j.length=0;}function le(){j.forEach(function(t){try{t.position();}catch{}});}function de(){if(ge(),ae.querySelectorAll("line,path").forEach(function(e){e.remove();}),!!k.edges){var t=Me();L.forEach(function(e){var i=N[e.id];!i||!i.colEl||Pe(e).forEach(function(r){var s=t[r];if(s){var l=N[s];if(!(!l||!l.colEl)){var o=l.colEl.querySelector('.lc-token-gem-provides[data-token="'+r+'"]'),f=i.colEl.querySelector('.lc-token-gem-requires[data-token="'+r+'"]'),a,d,u,m,g=O.getBoundingClientRect();if(o){var v=o.getBoundingClientRect();a=(v.left+v.width/2-g.left)/k.zoom,d=(v.bottom-g.top)/k.zoom;}else {var E=l.colEl;a=E.offsetLeft+E.offsetWidth/2,d=E.offsetTop+E.offsetHeight;}if(f){var h=f.getBoundingClientRect();u=(h.left+h.width/2-g.left)/k.zoom,m=(h.top-g.top)/k.zoom;}else {var y=i.colEl;u=y.offsetLeft+y.offsetWidth/2,m=y.offsetTop;}var b=u-a,F=m-d,re=Math.sqrt(b*b+F*F),Y=Math.max(40,Math.min(re*.4,120)),ee=Math.abs(b),M=Math.abs(F),C,$,X,Z;if(M>ee*.4)C=a,$=d+Y,X=u,Z=m-Y;else {var R=b>0?1:-1;C=a+R*Y,$=d+Y*.5,X=u-R*Y,Z=m-Y*.5;}var se="M "+a+" "+d+" C "+C+" "+$+", "+X+" "+Z+", "+u+" "+m,H=document.createElementNS("http://www.w3.org/2000/svg","path");H.setAttribute("d",se),H.setAttribute("fill","none"),H.setAttribute("marker-end","url(#lc-arrow)"),H.classList.add("lc-edge-path"),ae.appendChild(H);}}});});}}function $e(t,e){let i,r,s,l,o=false;t.addEventListener("pointerdown",f=>{f.button===0&&(f.target.closest("input,textarea,select,button,a,.form-check-input")||(o=true,t.classList.add("lc-dragging"),t.setPointerCapture(f.pointerId),i=f.clientX,r=f.clientY,s=t.offsetLeft,l=t.offsetTop,f.preventDefault()));},{signal:W}),t.addEventListener("pointermove",f=>{if(!o)return;let a=(f.clientX-i)/k.zoom,d=(f.clientY-r)/k.zoom;t.style.left=s+a+"px",t.style.top=l+d+"px",j.length?le():de();},{signal:W}),t.addEventListener("pointerup",()=>{if(!o)return;o=false,t.classList.remove("lc-dragging");let f=t.offsetLeft,a=t.offsetTop;k.snap>1&&(f=Math.round(f/k.snap)*k.snap,a=Math.round(a/k.snap)*k.snap),t.style.left=f+"px",t.style.top=a+"px",q[e.id]=Object.assign(q[e.id]||{},{x:f,y:a}),e.card&&e.card.view&&(e.card.view.layout||(e.card.view.layout={}),e.card.view.layout.canvas||(e.card.view.layout.canvas={}),e.card.view.layout.canvas.x=f,e.card.view.layout.canvas.y=a),c.notify(e.id),Te(),j.length?le():de();},{signal:W});}function Be(t,e){let i=document.createElement("div");i.className="lc-resize-handle",t.appendChild(i),t.style.overflow="visible";let r=false,s,l,o,f;i.addEventListener("pointerdown",function(a){a.button===0&&(a.stopPropagation(),a.preventDefault(),r=true,t.classList.add("lc-resizing"),i.setPointerCapture(a.pointerId),s=a.clientX,l=a.clientY,o=t.offsetWidth,f=t.offsetHeight);},{signal:W}),i.addEventListener("pointermove",function(a){if(!r)return;let d=(a.clientX-s)/k.zoom,u=(a.clientY-l)/k.zoom,m=Math.max(k.minWidth,o+d),g=Math.max(80,f+u);t.style.width=m+"px",t.style.height=g+"px",j.length?le():de();},{signal:W}),i.addEventListener("pointerup",function(){if(!r)return;r=false,t.classList.remove("lc-resizing");let a=t.offsetWidth,d=t.offsetHeight,u=k.snap>1?Math.round(a/k.snap)*k.snap:a,m=k.snap>1?Math.round(d/k.snap)*k.snap:d;t.style.width=u+"px",t.style.height=m+"px",q[e.id]=Object.assign(q[e.id]||{},{w:u,h:m}),e.card&&e.card.view&&(e.card.view.layout||(e.card.view.layout={}),e.card.view.layout.canvas||(e.card.view.layout.canvas={}),e.card.view.layout.canvas.w=u,e.card.view.layout.canvas.h=m),c.notify(e.id),Te(),j.length?le():de();},{signal:W});}function Fe(){let t=he();ze(t),ge(),document.body.style.overflow="hidden";let e=Ve(t);var i=T.getBoundingClientRect().top;T.style.height=A.height||"calc(100vh - "+i+"px)",O.querySelectorAll(".lc-canvas-card,.lc-source-node").forEach(a=>a.remove()),ae.querySelectorAll("line,path").forEach(function(a){a.remove();}),Xe(),Ie(),L.forEach(a=>{let d=q[a.id]||{x:0,y:0};if((!a.card||!a.card.view)&&a.card&&a.card.source_defs&&a.card.source_defs.length){let u=Ge(a);u.dataset.nodeId=a.id,u.style.left=d.x+"px",u.style.top=d.y+"px",O.appendChild(u),N[a.id]={node:a,colEl:u,bodyEl:null},$e(u,a);}else {let u=we(a,t,d),m=u.containerEl,g=a.card&&a.card.meta&&a.card.meta.simulation===true,v=a.card&&a.card.meta&&a.card.meta._gandalfCard===true,E=g?" lc-simulation-card":v?" lc-gandalf-card":"";m.className=ye(m.className||"lc-canvas-card card shadow-sm",E);let h=Se(a),y=h?be[h]:null;if(y&&y.renderBody){O.appendChild(m);let b=Le(a,u.bodyEl||m,true);N[a.id]={node:a,colEl:m,bodyEl:b||m,isCustom:true};}else {let{wrap:b,body:F}=xe(a),re=u.bodyEl||m;for(;b.firstChild;)re.appendChild(b.firstChild);let Y=m.querySelector(".card-header");Y&&Y.dataset.gandalfCollapsed==="1"&&m.classList.add("lc-collapsed"),O.appendChild(m),N[a.id]={node:a,colEl:m,bodyEl:F},c.render(a,F,{showChat:false});}$e(m,a),Be(m,a);}}),Ae(),requestAnimationFrame(function(){Te(),de();}),z&&typeof z.afterRenderCanvas=="function"&&z.afterRenderCanvas(ie(t,{mountEl:e.mountEl,surfaceEl:e.surfaceEl,nodeMap:N})),T.addEventListener("scroll",function(){le();},{signal:W,passive:true});let r=false,s,l,o,f;T.addEventListener("pointerdown",a=>{a.target!==T&&a.target!==O||(a.button===1||a.button===0&&a.ctrlKey)&&(r=true,T.setPointerCapture(a.pointerId),s=a.clientX,l=a.clientY,o=k.panX,f=k.panY,a.preventDefault());},{signal:W}),T.addEventListener("pointermove",a=>{r&&(k.panX=o+(a.clientX-s),k.panY=f+(a.clientY-l),Ie(),le());},{signal:W}),T.addEventListener("pointerup",()=>{r=false;},{signal:W}),T.addEventListener("wheel",a=>{if(!a.ctrlKey)return;a.preventDefault();let d=a.deltaY>0?.9:1.1;k.zoom=Math.min(k.zoomMax,Math.max(k.zoomMin,k.zoom*d)),Ie(),le();},{signal:W,passive:false});}function ue(){I.current==="canvas"?Fe():Qe();}function Ne(){let t=Me(),e={},i={};L.forEach(l=>{e[l.id]=[],i[l.id]=0;}),L.forEach(l=>{Je(l,t).forEach(o=>{e[l.id]&&e[l.id].push(o);});});let r=true;for(;r;)r=false,L.forEach(l=>{(e[l.id]||[]).forEach(o=>{i[o]!=null&&i[o]+1>i[l.id]&&(i[l.id]=i[o]+1,r=true);});});let s={};L.forEach(l=>{let o=i[l.id]||0;s[o]||(s[o]=0);let f=s[o]++;q[l.id]={x:o*400+40,y:f*300+40,w:q[l.id]&&q[l.id].w||k.defaultW},l.view&&(l.view.layout||(l.view.layout={}),l.view.layout.canvas=Object.assign({},q[l.id]));}),I.current==="canvas"&&Fe();}function Ze(t){N[t.id]||(L.push(t),ue());}function et(t){c.destroy(t);let e=L.findIndex(i=>i.id===t);e>=0&&L.splice(e,1),delete N[t],delete q[t],ue();}function je(t){L.length=0,t.forEach(e=>{let i=N[e];i&&L.push(i.node);}),ue();}function tt(t,e){let i=N[t];if(!i)throw new Error("updateNode: unknown node id "+t);let r=i.node;e&&typeof e=="object"&&(e.card!==void 0&&(r.card=e.card),e.card_data!==void 0&&(r.card_data=e.card_data),e.requires!==void 0&&(r.requires=e.requires),e.computed_values!==void 0&&(r.computed_values=e.computed_values),e.runtime_state!==void 0&&(r.runtime_state=e.runtime_state),e.card_chats!==void 0&&(r.card_chats=e.card_chats)),c.destroy(t);let s=Se(r),l=s?be[s]:null;if(l&&l.renderBody){let o=i.colEl;o.innerHTML="";let f=Le(r,o,I.current==="canvas");N[t]={node:r,colEl:o,bodyEl:f||o,isCustom:true};}else if(I.current==="board"){let o=i.colEl;o.innerHTML="";let f=xe(r);o.appendChild(f.wrap),N[t]={node:r,colEl:o,bodyEl:f.body},c.render(r,f.body,{showChat:ne});}else {let o=i.colEl;o.innerHTML="";let f=xe(r);for(;f.wrap.firstChild;)o.appendChild(f.wrap.firstChild);N[t]={node:r,colEl:o,bodyEl:f.body},c.render(r,f.body,{showChat:false});}Ae();}function nt(){ge(),c.destroyAll(),L.length=0,Object.keys(N).forEach(t=>delete N[t]),Object.keys(q).forEach(t=>delete q[t]),B.innerHTML="";}function at(t){t!=="board"&&t!=="canvas"||(I.current=t,ue());}function rt(t){_.current=!!t,ue();}function n(){ge(),document.body.style.overflow="",Q.abort(),U&&U.parentNode&&U.parentNode.removeChild(U),U=null,c.destroyAll(),L.length=0,Object.keys(N).forEach(t=>delete N[t]),B.innerHTML="",B.parentNode&&B.parentNode.removeChild(B);}return w.nodes&&w.nodes.length&&w.nodes.forEach(t=>L.push(t)),ue(),{add:Ze,remove:et,reorder:je,updateNode:tt,clear:nt,setMode:at,setDevMode:rt,autoLayout:Ne,destroy:n,get mode(){return I.current},get devMode(){return _.current},get nodes(){return L.slice()},get engine(){return c}}}function Tt(c,p,w){w=w||{};let I=w.initialState,_=w.getNodeIds,L=w.selectNode;if(typeof _!="function"||typeof L!="function")throw new Error("LiveCard.Board requires getNodeIds and selectNode functions");let N=I,q={},ne={};function P(S){return S==null||typeof S!="object"?JSON.stringify(S):Array.isArray(S)?"["+S.map(P).join(",")+"]":"{"+Object.keys(S).sort().map(B=>JSON.stringify(B)+":"+P(S[B])).join(",")+"}"}function G(S){return !S||typeof S!="object"?"null":P({card:S.card,card_data:S.card_data,requires:S.requires,computed_values:S.computed_values,runtime_state:S.runtime_state,card_chats:S.card_chats})}let D=_(N).map(S=>{let V=L(N,S);return q[S]=V,ne[S]=G(V),V}),A={};Object.keys(w).forEach(S=>{S==="initialState"||S==="getNodeIds"||S==="selectNode"||S==="nodes"||(A[S]=w[S]);}),A.nodes=D;let k=mt(c,p,A);function Q(S,V){return S!==V}function W(S){let V=typeof S=="function"?S(N):S;if(V===void 0)return;N=V;let B=_(N),U=new Set(B);Object.keys(q).forEach(T=>{U.has(T)||(k.remove(T),delete q[T],delete ne[T]);}),B.forEach(T=>{let O=L(N,T),ae=q[T],oe=G(O),he=ne[T];ae?Q(he,oe)&&k.updateNode(T,O):k.add(O),q[T]=O,ne[T]=oe;});let ve=k.nodes.map(T=>T.id);(B.length!==ve.length||B.some((T,O)=>T!==ve[O]))&&k.reorder(B);}function j(){Object.keys(q).forEach(S=>delete q[S]),Object.keys(ne).forEach(S=>delete ne[S]),k.destroy();}return {setState:W,destroy:j,core:k,get state(){return N}}}return {init:Mt,Board:Tt,BoardCore:mt,registerCardRenderer:vt,registerBoardTheme:wt,registerBoardRenderer:xt}})(),gt=It;typeof globalThis<"u"&&(globalThis.LiveCard=gt);
107
107
  })();//# sourceMappingURL=live-cards.js.map
108
108
  //# 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.4.2/browser/live-cards.js"></script>
23
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.2/browser/board-livecards-client.js"></script>
22
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.3/browser/live-cards.js"></script>
23
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.3/browser/board-livecards-client.js"></script>
24
24
  </head>
25
25
  <body class="bg-light">
26
26
  <div class="container-fluid py-3">
@@ -37,8 +37,8 @@
37
37
  <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
38
38
  <script src="https://cdn.jsdelivr.net/npm/dompurify/dist/purify.min.js"></script>
39
39
  <script src="https://cdn.jsdelivr.net/npm/leader-line/leader-line.min.js"></script>
40
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.2/browser/live-cards.js"></script>
41
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.2/browser/board-livecards-client.js"></script>
40
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.3/browser/live-cards.js"></script>
41
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.3/browser/board-livecards-client.js"></script>
42
42
  </head>
43
43
  <body class="bg-light">
44
44
  <div class="container-fluid py-3">
@@ -6,13 +6,13 @@
6
6
  <title>Example Board Demo (LocalStorage Runtime)</title>
7
7
  <link rel="icon" type="image/svg+xml" href="../../browser/favicon.svg" />
8
8
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" />
9
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.2/browser/compute-jsonata.js"></script>
9
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.3/browser/compute-jsonata.js"></script>
10
10
  <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
11
11
  <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
12
12
  <script src="https://cdn.jsdelivr.net/npm/dompurify/dist/purify.min.js"></script>
13
13
  <script src="https://cdn.jsdelivr.net/npm/leader-line/leader-line.min.js"></script>
14
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.2/browser/live-cards.js"></script>
15
- <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.2/browser/board-livecards-localstorage.js"></script>
14
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.3/browser/live-cards.js"></script>
15
+ <script src="https://cdn.jsdelivr.net/npm/yaml-flow@8.4.3/browser/board-livecards-localstorage.js"></script>
16
16
  </head>
17
17
  <body class="bg-light">
18
18
  <div class="container-fluid py-3">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yaml-flow",
3
- "version": "8.4.2",
3
+ "version": "8.4.3",
4
4
  "description": "Unified workflow engine: step-machine (sequential) + event-graph (stateless DAG) with pluggable storage",
5
5
  "author": "",
6
6
  "license": "MIT",