var u=[];function p(e){u.push(e)}function $(){for(;u.length;){let e=u.pop();try{e?.()}catch{}}}function f(e){return e.getAttribute("data-r-flow-graph")??e.getAttribute("data-r-event-stream")??e.getAttribute("data-r-worker-panel")??""}function g(e){return e.getAttribute("data-r-graph-token")??""}function _(e){return typeof e=="string"?e:e&&typeof e=="object"&&"0"in e?String(e[0]):"node"}function k(e){let t=e.type??"event";switch(t){case"log":return`[log] ${e.message}`;case"progress":return`[progress] ${e.value}%`;case"ai_thinking":return`[ai] ${e.content}`;case"tool_call":return`[tool] ${e.tool}`;case"node_start":return`[start] ${_(e.node)}`;case"node_done":return`[done] ${_(e.node)} (${e.duration_ms}ms)`;case"node_failed":return`[error] ${e.error}`;case"result":return`[result] ${JSON.stringify(e.data)}`;case"graph_done":return"[graph] complete";default:return`[${t}]`}}function l(e,t){if(!t)return e;let r=e.includes("?")?"&":"?";return`${e}${r}token=${encodeURIComponent(t)}`}function m(e){let t={};return e&&(t["X-Resuma-Graph-Token"]=e),t}function y(){let e=document.getElementById("resuma-state");if(!e?.textContent)return"";try{return JSON.parse(e.textContent).csrf_token??""}catch{return""}}function S(e){let t=m(e),r=y();return r&&(t["x-resuma-csrf"]=r),t}function L(e){let t=Math.floor(e/1e3),r=Math.floor(t/3600),s=Math.floor(t%3600/60),a=t%60;return r>0?`${r}h ${s}m`:s>0?`${s}m ${a}s`:`${a}s`}function v(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}async function x(){if(typeof window.__resuma?.action=="function")try{return await window.__resuma.action("exec_status",[])}catch{}try{let e=await fetch("/_resuma/status",{credentials:"same-origin"});return e.ok?await e.json():null}catch{return null}}function b(e,t){let r=t.queues.reduce((n,i)=>n+i.pending,0),s=t.queues.reduce((n,i)=>n+i.processing,0),a=r>10?"r-flow-dash__badge r-flow-dash__badge--warn":t.ok?"r-flow-dash__badge":"r-flow-dash__badge r-flow-dash__badge--err",o=t.workers.names.length>0?t.workers.names.map(n=>`<span class="r-flow-dash__chip">${v(n)}</span>`).join(""):'<span class="r-flow-dash__chip">none registered</span>',c=t.queues.map(n=>{let i=n.pending+n.processing+n.done+n.failed||1,d=Math.round(n.processing/i*100);return`<tr>
<td>${v(n.queue)}</td>
<td>${n.pending}</td>
<td>${n.processing}</td>
<td>${n.done}</td>
<td>${n.failed}</td>
<td><div class="r-flow-dash__bar"><span style="width:${d}%"></span></div></td>
</tr>`}).join("");e.innerHTML=`
<header class="r-flow-dash__header">
<h2 class="r-flow-dash__title">Resuma OS</h2>
<span class="${a}">${t.ok?"healthy":"degraded"} \xB7 uptime ${L(t.uptime_ms)}</span>
</header>
<div class="r-flow-dash__grid">
<div class="r-flow-dash__stat"><p class="r-flow-dash__stat-label">Workers</p><p class="r-flow-dash__stat-value">${t.workers.registered}</p></div>
<div class="r-flow-dash__stat"><p class="r-flow-dash__stat-label">Graphs running</p><p class="r-flow-dash__stat-value">${t.graphs.running}</p></div>
<div class="r-flow-dash__stat"><p class="r-flow-dash__stat-label">Graphs paused</p><p class="r-flow-dash__stat-value">${t.graphs.paused}</p></div>
<div class="r-flow-dash__stat"><p class="r-flow-dash__stat-label">Queue pending</p><p class="r-flow-dash__stat-value">${r}</p></div>
<div class="r-flow-dash__stat"><p class="r-flow-dash__stat-label">Processing</p><p class="r-flow-dash__stat-value">${s}</p></div>
<div class="r-flow-dash__stat"><p class="r-flow-dash__stat-label">Scheduler due</p><p class="r-flow-dash__stat-value">${t.scheduler.due}</p></div>
</div>
<section class="r-flow-dash__section">
<h3>Workers</h3>
<div class="r-flow-dash__chips">${o}</div>
</section>
<section class="r-flow-dash__section">
<h3>Queues</h3>
<table class="r-flow-dash__table">
<thead><tr><th>Name</th><th>Pending</th><th>Active</th><th>Done</th><th>Failed</th><th>Load</th></tr></thead>
<tbody>${c}</tbody>
</table>
</section>
<section class="r-flow-dash__section">
<h3>Scheduler</h3>
<p style="margin:0;font-size:.8rem;color:#94a3b8">${t.scheduler.enabled} enabled \xB7 ${t.scheduler.total} total \xB7 ${t.scheduler.due} due now</p>
</section>`}function H(e){let t=e.querySelector("[data-r-flow-dashboard-root]")??e,r=Number(e.getAttribute("data-r-flow-dashboard-poll")??"5000")||5e3,s=e.getAttribute("data-r-flow-dashboard-init"),a=async()=>{let n=await x();n&&b(t,n)};if(s)try{b(t,JSON.parse(s))}catch{}a();let o=window.setInterval(()=>{a()},r),c=()=>clearInterval(o);e.addEventListener("resuma:disconnect",c,{once:!0}),p(c)}function E(e,t,r){if(!e||typeof EventSource>"u")return()=>{};let s=l(`/_resuma/graph/${encodeURIComponent(e)}/events`,t),a=new EventSource(s);return a.onmessage=o=>{try{r(JSON.parse(o.data))}catch{}},()=>a.close()}function M(e,t){let r=e.querySelector("[data-r-flow-graph-track]"),s=e.querySelector("[data-r-flow-graph-status]"),a=t.nodes??[];if(r&&(a.length?(r.innerHTML="",a.forEach((o,c)=>{if(c>0){let d=document.createElement("span");d.className="r-flow-graph__arrow",d.textContent="\u2192",r.appendChild(d)}let n=document.createElement("span");n.className=`r-flow-graph__node r-flow-graph__node--${o.status}`;let i=o.status==="done"?"\u2713":o.status==="running"?"\u25CF":o.status==="failed"?"\u2717":o.status==="paused"?"\u2016":"\u25CB";n.textContent=`${i} ${o.label}`,r.appendChild(n)})):r.textContent="No nodes"),s){let o=t.worker?` \xB7 ${t.worker}`:"",c=t.status??"unknown";s.textContent=`Status: ${c}${o}`}}async function h(e,t,r){let s=l(`/_resuma/graph/${encodeURIComponent(t)}`,r),a=await fetch(s,{headers:m(r),credentials:"same-origin"});if(!a.ok)return;let o=await a.json();M(e,o)}function T(e){let t=f(e),r=g(e);if(!t||(h(e,t,r),!(e.getAttribute("data-r-flow-graph-live")==="true")))return;let a=E(t,r,()=>{h(e,t,r)});p(a)}function C(e){let t=f(e),r=g(e);if(!t)return;let s=e.querySelector("ul")??e,a=200,o=n=>{let i=document.createElement("li");for(i.textContent=n,s.appendChild(i);s.children.length>a;)s.removeChild(s.firstChild);s.scrollTop=s.scrollHeight},c=E(t,r,n=>o(k(n)));p(c)}function A(e){let t=f(e),r=g(e);if(!t)return;let s=()=>({method:"POST",credentials:"same-origin",headers:S(r)}),a=e.closest("[data-r-flow-execution]"),o=async c=>{if(!(await fetch(l(`/_resuma/graph/${encodeURIComponent(t)}/${c}`,r),s())).ok)return;let i=a?.querySelector("[data-r-flow-graph]");i&&h(i,t,r)};e.querySelector("[data-r-worker-pause]")?.addEventListener("click",()=>{o("pause")}),e.querySelector("[data-r-worker-resume]")?.addEventListener("click",()=>{o("resume")}),e.querySelector("[data-r-worker-cancel]")?.addEventListener("click",()=>{o("cancel")}),e.querySelector("[data-r-worker-replay]")?.addEventListener("click",async()=>{let c=await fetch(l(`/_resuma/graph/${encodeURIComponent(t)}/replay`,r),{headers:m(r),credentials:"same-origin"});if(!c.ok)return;let n=await c.json(),i=e.closest("[data-r-flow-execution]")?.querySelector("[data-r-event-stream] ul");if(i){i.innerHTML="";for(let d of n){let w=document.createElement("li");w.textContent=k(d),i.appendChild(w)}}})}function R(e=document){$(),e.querySelectorAll("[data-r-flow-dashboard]").forEach(H),e.querySelectorAll("[data-r-flow-graph]").forEach(T),e.querySelectorAll("[data-r-event-stream]").forEach(C),e.querySelectorAll("[data-r-worker-panel]").forEach(A)}export{R as initFlowWidgets};