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