yaml-flow 8.2.4 → 8.3.0

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