@huynle/hub 0.10.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +3 -1
  3. package/package.json +1 -1
  4. package/packages/claude-code/package.json +1 -1
  5. package/packages/cli/dist/hub-cli.js +9 -7
  6. package/packages/cli/package.json +1 -1
  7. package/packages/codex/package.json +1 -1
  8. package/packages/node/package.json +1 -1
  9. package/packages/preset/package.json +1 -1
  10. package/packages/protocol/package.json +1 -1
  11. package/packages/protocol/src/index.ts +13 -1
  12. package/packages/runtime-openshell/package.json +1 -1
  13. package/packages/runtime-sdk/package.json +1 -1
  14. package/packages/sdk/package.json +1 -1
  15. package/packages/spoke-sdk/package.json +1 -1
  16. package/src/central/http.ts +33 -4
  17. package/src/spoke/spoke.ts +19 -0
  18. package/web/dist/assets/{ArtifactPage-Bz992ZX6.js → ArtifactPage-CsPjam8D.js} +1 -1
  19. package/web/dist/assets/{ArtifactPane-BJZNixJC.js → ArtifactPane-B9weO8L6.js} +1 -1
  20. package/web/dist/assets/{ArtifactWorkbench-Dti3VP07.js → ArtifactWorkbench-DzKhMs3l.js} +1 -1
  21. package/web/dist/assets/{Diagram-B4HdUxw0.js → Diagram-CuRIffka.js} +1 -1
  22. package/web/dist/assets/{Library-CpzD2HDW.js → Library-rv5DGtrm.js} +2 -2
  23. package/web/dist/assets/{ProfilesDestination-DlQeogea.js → ProfilesDestination-DUuQ9jmd.js} +1 -1
  24. package/web/dist/assets/{TeamsPage-4xdWCaI-.js → TeamsPage-D_17MkvN.js} +1 -1
  25. package/web/dist/assets/{Watchtower-CpQdIRns.js → Watchtower-DlrNOJ7X.js} +2 -2
  26. package/web/dist/assets/{index-BS6lA6fN.js → index-bX8B6NLo.js} +6 -6
  27. package/web/dist/assets/{index-BC0O1gfR.css → index-rW6LKQj1.css} +1 -1
  28. package/web/dist/assets/{live-CVUFIdUX.js → live-BGLA-peO.js} +1 -1
  29. package/web/dist/assets/{renderer2d-IaJiloPi.js → renderer2d-DyANQ1WS.js} +1 -1
  30. package/web/dist/assets/{renderer3d-ZiD1uKGW.js → renderer3d-vYYKFAJq.js} +1 -1
  31. package/web/dist/assets/{safe-area-C7IAlkgY.js → safe-area-B2Bk__FK.js} +1 -1
  32. package/web/dist/index.html +2 -2
@@ -1 +1 @@
1
- import{A as e,B as t,E as n,G as r,V as i,j as a,k as o}from"./live-CVUFIdUX.js";import{a as s,i as c,n as l,o as u,r as d}from"./Watchtower-CpQdIRns.js";import{a as f,c as p,i as m,r as h,s as g,t as _}from"./safe-area-C7IAlkgY.js";var v={w:76,h:58,pad:16,header:38,role:118,gap:40,band:120,party:120,roleRow:92},y=14,b=8,x=200,S=420,C=(e,t)=>Math.max(1,Math.min(t,Math.ceil(Math.sqrt(e*2))));function ee(e){let t=new Map,n=new Set(e.nodes.map(e=>e.id));t.set(`hub`,{x:0,y:0}),e.nodes.filter(e=>e.id!==`hub`&&(e.kind===`hub`||e.kind===`user`||e.kind===`app`)).forEach((e,n)=>t.set(e.id,{x:(n%2==0?-1:1)*v.party*(Math.floor(n/2)+1),y:0}));let r=e.groups.map(e=>{let t=e.sections.map(e=>{let t=e.id!==void 0,n=C(e.members.length,t?b:y),r=Math.max(1,Math.ceil(e.members.length/n));return{cols:n,rows:r,role:t,w:(t?v.role+v.w/2:0)+n*v.w,h:r*(t?v.roleRow:v.h)}});return{group:e,sections:t,w:Math.max((e.kind===`team`?S:x)-2*v.pad,...t.map(e=>e.w))+2*v.pad,h:v.header+t.reduce((e,t)=>e+t.h,0)+v.pad}}),i=r.reduce((e,t)=>e+(t.w+v.gap)*(t.h+v.gap),0),a=Math.max(...r.map(e=>e.w),Math.sqrt(i)*1.5,1),o=[],s=[],c=0;for(let e of r)s.length&&c+v.gap+e.w>a&&(o.push(s),s=[],c=0),c+=(s.length?v.gap:0)+e.w,s.push(e);s.length&&o.push(s);let l=[],u=v.band;for(let e of o){let r=-(e.reduce((e,t)=>e+t.w,0)+v.gap*(e.length-1))/2;for(let i of e){let{group:e}=i,a=[],o=u+v.header;e.sections.forEach((e,s)=>{let c=i.sections[s],l={x:r+v.pad,y:o,w:i.w-2*v.pad,h:c.h};a.push({...l,...e.id===void 0?{}:{id:e.id},...e.label===void 0?{}:{label:e.label},...e.entry===void 0?{}:{entry:e.entry}});let u=c.role?v.roleRow:v.h;e.id!==void 0&&n.has(e.id)&&t.set(e.id,{x:l.x+v.role/2,y:o+u/2});let d=l.x+(c.role?v.role+s%2*(v.w/2):0);e.members.forEach((e,n)=>t.set(e,{x:d+n%c.cols*v.w+v.w/2,y:o+Math.floor(n/c.cols)*u+u/2})),o+=c.h}),n.has(e.id)&&t.set(e.id,{x:r+v.pad+12,y:u+v.header/2}),l.push({id:e.id,label:e.label,kind:e.kind,x:r,y:u,w:i.w,h:i.h,...e.machine===void 0?{}:{machine:e.machine},...e.online===void 0?{}:{online:e.online},...e.mode===void 0?{}:{mode:e.mode},...e.paused===void 0?{}:{paused:e.paused},...e.entryRole===void 0?{}:{entryRole:e.entryRole},members:e.sections.reduce((e,t)=>e+t.members.length,0),sections:a}),r+=i.w+v.gap}u+=Math.max(...e.map(e=>e.h))+v.gap}let d=e.nodes.filter(e=>!t.has(e.id));d.forEach((e,n)=>t.set(e.id,{x:(n-(d.length-1)/2)*v.w,y:u+v.h/2}));let f=[],p=[];for(let e of t.values())f.push(e.x-v.w/2,e.x+v.w/2),p.push(e.y-v.h/2,e.y+v.h/2);for(let e of l)f.push(e.x,e.x+e.w),p.push(e.y,e.y+e.h);let m=Math.min(...f)-40,h=Math.min(...p)-40;return{positions:t,boxes:l,bounds:{x:m,y:h,w:Math.max(...f)+40-m,h:Math.max(...p)+40-h}}}function te(e,t,n,r){let i=Math.max(1,t.width-n.left-n.right),a=Math.max(1,t.height-n.top-n.bottom),o=Math.max(r.min,Math.min(r.max,Math.min(i/Math.max(1,e.w),a/Math.max(1,e.h))));return{k:o,x:n.left+i/2-(e.x+e.w/2)*o,y:n.top+a/2-(e.y+e.h/2)*o}}function ne(e,t,n){let r=t===void 0?void 0:e.get(t);if(!r)return e.keys().next().value;let i,a=1/0;for(let[o,s]of e){if(o===t)continue;let e=s.x-r.x,c=s.y-r.y,[l,u]=n===`right`?[e,c]:n===`left`?[-e,c]:n===`down`?[c,e]:[-c,e];if(l<=0||Math.abs(u)>l*2)continue;let d=l+2*Math.abs(u);d<a&&(a=d,i=o)}return i??t}var re={glow:!0,pulses:!0,labels:12},w=.04,ie=4,ae=.55,oe=9.5,T={w:180,h:120},E=`system-ui, -apple-system, sans-serif`,se=e=>e.kind===`hub`?22:e.kind===`role`?13:Math.max(8,Math.min(20,e.size*1.9)),D=e=>e.kind===`hub`||e.kind===`role`?13:e.kind===`aggregate`?se(e)*.8:e.kind===`session`?Math.max(5,Math.min(11,3+e.size)):8,ce=(e,t)=>e.length>t?`${e.slice(0,t-1)}…`:e;function le(e){let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)|0;return(t>>>0)%1e3/1e3}function ue(e,t){return e.kind===`hub`?t(`--accent`):e.kind===`user`||e.kind===`app`?t(`--text`):e.kind===`team`||e.kind===`role`?t(`--violet`):e.kind===`cluster`?t(`--muted`):e.machine===void 0?t(`--faint`):t(n[e.machine%n.length])}function de(e,t,n,r){e.beginPath(),e.roundRect(t-v.role/2+8,n-r,v.role-16,r*2,r)}function fe(e,t,n){let r=t.x-e.x,i=t.y-e.y,a={x:(e.x+t.x)/2-i*n,y:(e.y+t.y)/2+r*n};return{c:a,mid:{x:.25*e.x+.5*a.x+.25*t.x,y:.25*e.y+.5*a.y+.25*t.y}}}var pe=e=>e.kind===`structure`?e.bridge?.18:0:e.kind===`policy`?.22:e.kind===`denied`?-.22:.1;function me(e,t,n,r,i,a,o){let s=Math.atan2(n.y-t.y,n.x-t.x);e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(n.x-r*Math.cos(s-.45),n.y-r*Math.sin(s-.45)),e.lineTo(n.x-r*Math.cos(s+.45),n.y-r*Math.sin(s+.45)),e.closePath(),e.setLineDash([]),e.fillStyle=i?o:a,e.fill(),e.strokeStyle=a,e.lineWidth=1.4,e.stroke()}function he(e,t,n){let r=Math.hypot(e.x-t.x,e.y-t.y)||1;return{x:e.x-(e.x-t.x)/r*n,y:e.y-(e.y-t.y)/r*n}}function ge(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=r||i?Math.max(0,Math.min(1,((e.x-t.x)*r+(e.y-t.y)*i)/(r*r+i*i))):0;return Math.hypot(e.x-(t.x+a*r),e.y-(t.y+a*i))}function O(n,y){let b=document.createElement(`canvas`);b.className=`wt-canvas2d`;let x=b.getContext(`2d`);if(!x)throw Error(`This browser can't draw on a canvas`);let S=document.createElement(`canvas`);S.className=`wt-minimap`,S.setAttribute(`aria-hidden`,`true`),S.title=`Minimap: click to move the view`;let C=S.getContext(`2d`),O=document.createElement(`span`);O.className=`wt-tip wt-tip2d`,O.hidden=!0,n.append(b,S,O);let k,A,j=()=>`#888`,_e=!0,M,N,P,ve,F=n.clientWidth||300,I=n.clientHeight||150,L={k:1,x:F/2,y:80},R=!1,z=0,ye=0,be={s:1,ox:0,oy:0},B=new Map,xe=new Set,V=re,H=!1,U=!1,Se=0,Ce=0,we=new Map,Te=new Set,Ee=new Map,De=new Map,Oe=0,ke=!1,Ae=()=>window.devicePixelRatio||1,je=e=>({x:e.x*L.k+L.x,y:e.y*L.k+L.y}),W=(e,t)=>({x:(e-L.x)/L.k,y:(t-L.y)/L.k}),G=(e,t)=>{let n=b.getBoundingClientRect();return{x:e-n.left,y:t-n.top}},K=()=>{Ne=!0,z||=requestAnimationFrame(Qe)},q=document.createElement(`canvas`),Me=q.getContext(`2d`),J=x,Ne=!0,Pe=``,Y=(e,t)=>{cancelAnimationFrame(ye);let n={...e,k:Math.max(w,Math.min(ie,e.k))};if(!t||!_e){L=n,K();return}let r=L,i=performance.now(),a=e=>{let t=Math.min(1,(e-i)/260),o=1-(1-t)**3;L={k:r.k+(n.k-r.k)*o,x:r.x+(n.x-r.x)*o,y:r.y+(n.y-r.y)*o},Qe(),t<1&&(ye=requestAnimationFrame(a))};ye=requestAnimationFrame(a)},Fe=e=>{if(!A)return;let t=A.positions.get(`hub`);Y(U&&t?{k:1.3,x:F/2-t.x*1.3,y:I/2-t.y*1.3}:te(A.bounds,{width:F,height:I},_(n),{min:w,max:1.4}),e)},Ie=(e,t,n,r=!1)=>{let i=Math.max(w,Math.min(ie,L.k*n)),a=W(e,t);R=!0,Y({k:i,x:e-a.x*i,y:t-a.y*i},r)},Le=(e,t,n=L.k)=>Y({k:n,x:F/2-e.x*n,y:I/2-e.y*n},t);function Re(e){let t=J,n=e.kind===`team`,r=n&&e.mode===`restricted`,i=j(we.get(e.id)??`--line-2`);t.save(),t.beginPath(),t.roundRect(e.x,e.y,e.w,e.h,22),V.glow&&(t.shadowColor=u(i,H?.35:.22),t.shadowBlur=36*L.k),t.fillStyle=u(i,H?.075:.06),t.fill(),t.shadowBlur=0,t.lineWidth=n?1.6:1,t.setLineDash(r?[8,5]:e.online===!1?[4,4]:[]),t.strokeStyle=u(i,n?.65:.4),t.stroke(),t.setLineDash([]),e.sections.forEach((e,n)=>{e.entry&&(t.fillStyle=u(j(`--accent`),.09),t.beginPath(),t.roundRect(e.x,e.y+2,e.w,e.h-4,10),t.fill()),n>0&&e.id!==void 0&&(t.strokeStyle=u(i,.18),t.lineWidth=1,t.beginPath(),t.moveTo(e.x+10,e.y),t.lineTo(e.x+e.w-10,e.y),t.stroke())}),t.beginPath(),t.rect(e.x,e.y,e.w-8,v.header),t.clip();let a=e.x+v.pad+(xe.has(e.id)?30:4),o=e.y+v.header/2,s=ce(e.label,28);t.fillStyle=j(`--text`),t.font=`650 13px ${E}`,t.textBaseline=`middle`,t.fillText(s,a,o);let c=k?.teams.find(t=>t.id===e.id)?.members??e.members,l=n?`${r?`Restricted: declared paths only`:`Open: everyone may message everyone`}${e.paused?` · paused`:``} · ${c} seated`:`${e.members} ${e.members===1?`node`:`nodes`}${e.online===!1?` · offline`:``}`;t.fillStyle=j(`--muted`),t.font=`12px ${E}`,t.fillText(l,a+t.measureText(s).width+18,o),t.restore()}function ze(e,n){let r=n.get(e.source),i=n.get(e.target);if(!r||!i||e.kind===`structure`&&e.structure!==`tree`&&e.structure!==`party`&&e.structure!==`seat`&&!e.bridge)return;let a=J,o=B.get(e.source),s=B.get(e.target),{c,mid:l}=fe(r,i,pe(e)),d=e.kind===`structure`,f=d&&e.structure===`seat`,p=j(d?e.bridge||f?`--violet`:`--line-2`:t(e.kind)),m=qe(),h=!m||e.source===m||e.target===m;a.save(),a.globalAlpha=(o?.dim&&s?.dim?.15:1)*(h?1:.2),a.setLineDash(d?e.bridge?[3,4]:[]:e.style===`dotted`?[1.5,4.5]:e.style===`dashed`?[7,4]:[]),a.lineCap=`round`;let g=d?i:he(i,c,(s?D(s):0)+6),_=e.kind===`policy`&&e.twoWay?he(r,c,(o?D(o):0)+6):f&&o?.kind===`role`?{x:r.x+v.role/2-8,y:r.y}:r,y=()=>{a.beginPath(),a.moveTo(_.x,_.y),a.quadraticCurveTo(c.x,c.y,g.x,g.y)};if(d){a.strokeStyle=u(p,e.bridge?.8:f?.6:.55),a.lineWidth=e.bridge?1.4:f?1.5:1,y(),a.stroke(),a.restore();return}let b=k&&k.links.length>120?.55:1,x=e.kind===`policy`?.6:e.kind===`denied`?.85:Math.min(.95,.45+e.width*.09)*b,S=e.kind===`policy`?1.6:Math.max(1.1,e.width*.75);V.glow&&e.kind!==`policy`&&(a.strokeStyle=u(p,(H?.16:.1)*x),a.lineWidth=S*4,y(),a.stroke());let C=a.createLinearGradient(_.x,_.y,g.x,g.y);C.addColorStop(0,u(p,x*.35)),C.addColorStop(1,u(p,x)),a.strokeStyle=C,a.lineWidth=S,y(),a.stroke();let ee=j(`--bg`),te=e.kind===`policy`?10:6+Math.min(3,e.width);me(a,c,g,te,e.kind===`policy`,u(p,Math.max(.7,x)),ee),e.kind===`policy`&&e.twoWay&&me(a,c,_,te,!0,p,ee),a.textBaseline=`middle`,e.kind===`denied`?(a.setLineDash([]),a.strokeStyle=p,a.lineWidth=2.2,a.beginPath(),a.moveTo(l.x-5,l.y-5),a.lineTo(l.x+5,l.y+5),a.moveTo(l.x+5,l.y-5),a.lineTo(l.x-5,l.y+5),a.stroke(),a.fillStyle=p,a.font=`600 11px ${E}`,a.fillText(`${e.denied??e.count} denied`,l.x+9,l.y)):e.kind===`policy`&&L.k>=.7&&e.kinds?.length&&(a.fillStyle=j(`--muted`),a.font=`11px ${E}`,a.fillText(`${e.twoWay?`⇄`:`→`} ${e.kinds.join(`, `)}`,l.x+6,l.y)),a.restore()}function Be(e,n){if(!_e||!V.pulses||!k)return 0;let i=J,a=Se+(Date.now()-Ce),o=0;i.save(),H&&(i.globalCompositeOperation=`lighter`);for(let s of k.links){if(s.kind===`structure`||s.kind===`policy`||s.kind===`denied`)continue;let c=r(s,a);if(P!==void 0&&(s.source===P||s.target===P)&&(c=Math.max(c,.55)),c<=0)continue;let u=e.get(s.source),d=e.get(s.target);if(!u||!d)continue;let{c:f}=fe(u,d,pe(s)),p=B.get(s.target),m=he(d,f,(p?D(p):0)+6),h=Math.min(4,1+Math.floor(Math.log2(Math.max(1,s.count)))),g=Math.max(1,Math.round(c*h)),_=.16+.34*c,v=le(s.id),y=j(t(s.kind));for(let e=0;e<g;e++){o++;let t=(v+e/g+n*_)%1,r=(1-t)**2*u.x+2*(1-t)*t*f.x+t*t*m.x,a=(1-t)**2*u.y+2*(1-t)*t*f.y+t*t*m.y;l(i,r,a,9,y,(.35+.65*c)*(H?.9:.6)),i.fillStyle=H?`#ffffff`:y,i.globalAlpha=.5+.5*c,i.beginPath(),i.arc(r,a,2.2,0,Math.PI*2),i.fill(),i.globalAlpha=1}}return i.restore(),o}function Ve(e,t,n,r){if(!e.ring||a[e.ring]===`none`)return;let i=J,s=a[e.ring];i.strokeStyle=j(o[e.ring]),i.setLineDash(s===`broken`?[4,3]:[]),i.lineWidth=s===`thick`?3:s===`thin`?1:1.8,i.beginPath(),i.arc(t,n,r+4,0,Math.PI*2),i.stroke(),s===`double`&&(i.lineWidth=1.1,i.beginPath(),i.arc(t,n,r+7,0,Math.PI*2),i.stroke()),i.setLineDash([])}function He(e,t){let n=J,r=D(e),i=!qe()||X.has(e.id);n.save(),n.globalAlpha=(e.dim?.25:1)*(i?1:.3);let a=ue(e,j);V.glow&&e.kind!==`role`&&l(n,t.x,t.y,r*(e.kind===`hub`?U?9:5:3.4),e.match?j(`--accent`):a,(H?.55:.32)*(e.dim?.4:1)*(e.id===P||e.id===M?1.5:1)),e.kind===`role`?(de(n,t.x,t.y,r),e.vacant||(n.fillStyle=u(a,e.entry?.22:.1),n.fill()),n.strokeStyle=u(a,e.entry?1:.7),n.lineWidth=e.entry?2.4:1.3,n.setLineDash(e.vacant?[4,3]:[]),n.stroke(),n.setLineDash([])):d(n,c(e),t.x,t.y,r,a,H?`#ffffff`:u(`#ffffff`,.9)),Ve(e,t.x,t.y,r),e.teams&&(n.strokeStyle=j(`--violet`),n.lineWidth=1.4,n.setLineDash([2,3]),n.beginPath(),n.arc(t.x,t.y,r+10,0,Math.PI*2),n.stroke(),n.setLineDash([]),n.fillStyle=j(`--violet`),n.font=`700 10px ${E}`,n.textBaseline=`middle`,n.fillText(`×${e.teams}`,t.x+r+6,t.y-r-6)),(e.id===M||e.id===N)&&(n.strokeStyle=j(`--accent`),n.lineWidth=e.id===M?2.5:2,n.setLineDash(e.id===M?[]:[5,3]),n.beginPath(),e.kind===`role`?n.roundRect(t.x-v.role/2+4,t.y-r-4,v.role-8,r*2+8,r+4):n.arc(t.x,t.y,r+(e.teams?14:9),0,Math.PI*2),n.stroke(),n.setLineDash([])),n.textAlign=`center`,n.textBaseline=`middle`,e.kind===`role`?(n.fillStyle=j(e.vacant?`--muted`:`--text`),n.font=`${e.entry?700:500} ${e.vacant?11:12}px ${E}`,n.fillText(ce(`${e.entry?`★ `:``}${f(e)}`,16),t.x,t.y)):e.kind===`aggregate`?(n.fillStyle=j(`--text`),n.font=`600 11px ${E}`,n.fillText(String(e.folded??``),t.x,t.y)):e.folded&&e.kind===`session`&&(n.fillStyle=j(`--bg`),n.font=`700 9px ${E}`,n.fillText(`+${e.folded}`,t.x,t.y));let o=De.get(e.id);if(o){let r=Ue(e);n.globalAlpha=e.dim?.6:i?1:.5,n.fillStyle=j(e.dim?`--faint`:e.kind===`session`?`--muted`:`--text`),n.font=We(e,r),n.lineWidth=r/11*3,n.strokeStyle=u(j(`--bg`),.85);let a=o.box.y+o.box.h/2;n.strokeText(o.text,t.x,a),n.fillText(o.text,t.x,a)}n.restore()}let Ue=e=>(e.kind===`hub`?13:11)*Math.max(1,Math.min(1.5,oe/11/L.k)),We=(e,t)=>`${e.kind===`hub`?700:500} ${t}px ${E}`;function Ge(e){if(!k||!A)return new Map;let t=[];for(let e of k.nodes){if(e.kind===`role`||e.kind===`aggregate`||xe.has(e.id))continue;let n=A.positions.get(e.id);if(!n)continue;let r=e.kind!==`session`||e.match||e.id===M||e.id===N||e.id===P;if(!r&&!(L.k>=1||L.k>=ae&&Te.has(e.id)))continue;let i=Ue(e),a=ce(e.label,14),o=ce(e.label,9);t.push({id:e.id,x:n.x,y:n.y+D(e)+(e.ring?16:13)*(i/11)-i*.65,h:i*1.3,texts:r||o===a?[a]:[a,o],pinned:r,rank:(Te.has(e.id)?1e6:0)+(Ee.get(e.id)??0),font:We(e,i)})}return t.sort((e,t)=>t.rank-e.rank||(e.id<t.id?-1:+(e.id>t.id))),g(t,(t,n)=>(e.font!==n.font&&(e.font=n.font),e.measureText(t).width+4))}let X=new Set,Ke;function qe(){let e=P??M;if(e!==Ke&&(Ke=e,X=new Set(e===void 0?[]:[e]),e!==void 0&&k))for(let t of k.links)t.source===e&&X.add(t.target),t.target===e&&X.add(t.source);return e!==void 0&&B.has(e)?e:void 0}function Je(){let e=J;e.save();let t=11,n=()=>((t=t*16807%2147483647)-1)/2147483646;e.fillStyle=j(`--accent`);for(let t=0;t<260;t++){let t=n()*Math.PI*2,r=60+n()**.7*900;e.globalAlpha=(H?.35:.22)*(1-r/1e3),e.beginPath(),e.arc(Math.cos(t)*r,Math.sin(t)*r*.6,.8+n()*1.6,0,Math.PI*2),e.fill()}e.restore()}function Ye(){if(!A)return;let e=Ae();S.width!==T.w*e&&(S.width=T.w*e,S.height=T.h*e);let t=C;t.setTransform(e,0,0,e,0,0),t.clearRect(0,0,T.w,T.h),t.globalAlpha=.92,t.fillStyle=j(`--raise`),t.fillRect(0,0,T.w,T.h),t.globalAlpha=1;let n=A.bounds,r=Math.min(T.w/n.w,T.h/n.h),i=(T.w-n.w*r)/2-n.x*r,a=(T.h-n.h*r)/2-n.y*r;t.strokeStyle=j(`--line-2`),t.lineWidth=1;for(let e of A.boxes)t.strokeRect(e.x*r+i,e.y*r+a,e.w*r,e.h*r);for(let[e,n]of A.positions){let o=B.get(e);if(!o)continue;let s=o.kind===`hub`?4:2;t.fillStyle=o.match?j(`--accent`):ue(o,j),t.fillRect(n.x*r+i-s/2,n.y*r+a-s/2,s,s)}let o=W(0,0);t.strokeStyle=j(`--accent`),t.lineWidth=1.5,t.strokeRect(o.x*r+i,o.y*r+a,F/L.k*r,I/L.k*r),be={s:r,ox:i,oy:a}}function Xe(){let e=Me,t=Ae();if((q.width!==b.width||q.height!==b.height)&&(q.width=b.width,q.height=b.height),e.setTransform(t,0,0,t,0,0),e.fillStyle=j(`--bg`),e.fillRect(0,0,F,I),k&&A){e.setTransform(t*L.k,0,0,t*L.k,t*L.x,t*L.y),J=e;try{U&&Je();for(let e of A.boxes)Re(e);let t=A.positions;for(let e of k.links)e.kind===`structure`&&ze(e,t);for(let e of k.links)e.kind!==`structure`&&ze(e,t);De=Ge(e),Ze();for(let e of k.nodes){let n=t.get(e.id);n&&He(e,n)}}finally{J=x}}}function Ze(){if(!A)return;let e=A.bounds,t=e=>Math.round(e*10)/10;n.dataset.content=JSON.stringify({x:t(e.x*L.k+L.x),y:t(e.y*L.k+L.y),w:t(e.w*L.k),h:t(e.h*L.k)}),n.dataset.labelBoxes=JSON.stringify([...De.values()].map(({box:e})=>[t(e.x*L.k+L.x),t(e.y*L.k+L.y),t(e.w*L.k),t(e.h*L.k)]))}function Qe(){z=0;let e=performance.now(),t=x,r=`${L.k},${L.x},${L.y},${b.width},${b.height}`;if((Ne||r!==Pe)&&(Xe(),Ye(),Ne=!1,Pe=r),t.setTransform(1,0,0,1,0,0),t.drawImage(q,0,0),!k||!A)return;let i=Ae();t.setTransform(i*L.k,0,0,i*L.k,i*L.x,i*L.y),Oe=Be(A.positions,performance.now()/1e3),ve&&(t.save(),ve(t,L),t.restore()),n.dataset.zoom=L.k.toFixed(3),n.dataset.pulses=String(Oe),n.dataset.drawMs=(performance.now()-e).toFixed(1),ke=Oe>0&&!document.hidden,n.dataset.animating=String(ke),ke&&!z&&(z=requestAnimationFrame(Qe))}function $e(e,t){if(!k||!A)return;let n=W(e,t),r;for(let e of k.nodes){let t=A.positions.get(e.id);if(!t)continue;let i=e.kind===`role`?Math.abs(n.x-t.x)<=v.role/2-8&&Math.abs(n.y-t.y)<=se(e)?-1:1/0:Math.hypot(n.x-t.x,n.y-t.y)-se(e)-3;i<=0&&(!r||i<r.d)&&(r={id:e.id,d:i})}if(r)return{type:`node`,id:r.id};let i=6/L.k,a;for(let e of k.links){if(e.kind===`structure`)continue;let t=A.positions.get(e.source),r=A.positions.get(e.target);if(!t||!r)continue;let{c:o}=fe(t,r,pe(e)),s=t;for(let c=1;c<=16;c++){let l=c/16,u={x:(1-l)**2*t.x+2*(1-l)*l*o.x+l*l*r.x,y:(1-l)**2*t.y+2*(1-l)*l*o.y+l*l*r.y},d=ge(n,s,u);d<=i&&(!a||d<a.d)&&(a={l:e,d}),s=u}}if(a)return{type:`link`,link:a.l};let o=A.boxes.find(e=>n.x>=e.x&&n.x<=e.x+e.w&&n.y>=e.y&&n.y<=e.y+e.h);return o?{type:`box`,id:o.id}:void 0}function et(t){let n=B.get(t);if(!n)return``;let r=[n.label];return n.kind===`role`&&r.push(n.entry?`entry role`:`role`,n.vacant?`vacant`:`${n.staffed??0} staffed`),n.seat&&r.push(`seat: ${n.seat}`),n.kind===`team`&&r.push(n.mode===`restricted`?`restricted team`:`open team`),n.kind===`machine`&&r.push(`machine`),n.ring&&r.push(e[n.ring]),n.teams&&r.push(`in ${n.teams} teams`),n.folded&&n.kind===`session`&&r.push(`+${n.folded} folded`),r.join(` · `)}function tt(e){let t=e=>B.get(e)?.label??e;return e.kind===`structure`?``:e.kind===`policy`?`Team path ${t(e.source)} ${e.twoWay?`⇄`:`→`} ${t(e.target)}${e.kinds?.length?` · ${e.kinds.join(`, `)}`:``}${e.count?` · ${e.count} sent along it`:``}`:e.kind===`denied`?`${e.denied??e.count} denied: ${t(e.source)} → ${t(e.target)}`:`${i(e.kind)} · ${t(e.source)} → ${t(e.target)} · ${e.count}`}let Z=new Map,Q,$;b.addEventListener(`pointerdown`,e=>{b.setPointerCapture?.(e.pointerId);let t=G(e.clientX,e.clientY);if(Z.set(e.pointerId,t),Z.size===2){let[e,t]=[...Z.values()];$={d:Math.hypot(e.x-t.x,e.y-t.y)||1,k:L.k,mid:{x:(e.x+t.x)/2,y:(e.y+t.y)/2}},Q=void 0}else Q={...t,t:L,moved:!1}}),b.addEventListener(`pointermove`,e=>{let t=G(e.clientX,e.clientY);if(Z.has(e.pointerId)&&Z.set(e.pointerId,t),$&&Z.size===2){let[e,t]=[...Z.values()],n=Math.max(w,Math.min(ie,$.k*(Math.hypot(e.x-t.x,e.y-t.y)||1)/$.d)),r=W($.mid.x,$.mid.y);R=!0,Y({k:n,x:$.mid.x-r.x*n,y:$.mid.y-r.y*n},!1);return}if(Q){!Q.moved&&Math.hypot(t.x-Q.x,t.y-Q.y)>4&&(Q.moved=!0),Q.moved&&(R=!0,O.hidden=!0,Y({k:Q.t.k,x:Q.t.x+t.x-Q.x,y:Q.t.y+t.y-Q.y},!1));return}let n=$e(t.x,t.y),r=n?.type===`node`?n.id:void 0;b.style.cursor=n&&n.type!==`box`?`pointer`:`grab`,r!==P&&(P=r,K());let i=n?.type===`node`?et(n.id):n?.type===`link`?tt(n.link):``;O.hidden=!i,i&&(O.textContent=i,O.style.left=`${Math.min(t.x+14,F-220)}px`,O.style.top=`${t.y+14}px`)}),b.addEventListener(`pointerup`,e=>{if(Z.delete(e.pointerId),Z.size<2&&($=void 0),!Q)return;let t=!Q.moved;if(Q=void 0,!t)return;let n=G(e.clientX,e.clientY),r=$e(n.x,n.y);r?.type===`node`?(N=r.id,y.onNode(r.id)):r?.type===`link`?y.onLink(r.link):y.onBackground(),K()}),b.addEventListener(`pointercancel`,e=>{Z.delete(e.pointerId),Q=void 0,$=void 0}),b.addEventListener(`pointerleave`,()=>{O.hidden=!0,P!==void 0&&(P=void 0,K())}),b.addEventListener(`wheel`,e=>{e.preventDefault();let t=G(e.clientX,e.clientY);Ie(t.x,t.y,Math.exp(-e.deltaY*(e.ctrlKey?.01:.0015)))},{passive:!1}),b.addEventListener(`dblclick`,e=>{let t=G(e.clientX,e.clientY);Ie(t.x,t.y,2,!0)});let nt=e=>{let t=S.getBoundingClientRect(),{s:n,ox:r,oy:i}=be;R=!0,Le({x:(e.clientX-t.left-r)/n,y:(e.clientY-t.top-i)/n},!1)};S.addEventListener(`pointerdown`,e=>{S.setPointerCapture?.(e.pointerId),nt(e)}),S.addEventListener(`pointermove`,e=>{S.hasPointerCapture?.(e.pointerId)&&nt(e)});let rt=e=>{let t=et(e);y.announce(t?`${t}. Enter opens it.`:``)},it=e=>{let t=A?.positions.get(e);if(!t)return;let n=je(t);(n.x<40||n.y<40||n.x>F-40||n.y>I-40)&&Le(t,!0,Math.max(L.k,.7))},at=e=>{N=e,e&&(it(e),rt(e)),K()},ot=e=>{if(e.target!==n||!A)return;let t={ArrowLeft:`left`,ArrowRight:`right`,ArrowUp:`up`,ArrowDown:`down`}[e.key];t&&e.shiftKey?(e.preventDefault(),R=!0,Y({...L,x:L.x+(t===`left`?80:t===`right`?-80:0),y:L.y+(t===`up`?80:t===`down`?-80:0)},!1)):t?(e.preventDefault(),at(ne(A.positions,N??`hub`,t))):(e.key===`Enter`||e.key===` `)&&N?(e.preventDefault(),y.onNode(N)):e.key===`Home`?(e.preventDefault(),at(`hub`)):e.key===`+`||e.key===`=`||e.key===`-`||e.key===`_`?(e.preventDefault(),Ie(F/2,I/2,e.key===`+`||e.key===`=`?1.25:.8,!0)):e.key===`0`&&(e.preventDefault(),R=!1,Fe(!0))},st=()=>{N===void 0&&(N=M!==void 0&&B.has(M)?M:`hub`),rt(N),K()};n.addEventListener(`keydown`,ot),n.addEventListener(`focus`,st);let ct=()=>document.visibilityState===`visible`&&K();return document.addEventListener(`visibilitychange`,ct),{update(e,t,r){k=e,j=t,_e=r.motion,M=r.selected,V={...re,...r.look},H=s(j(`--bg`)),Se=e.now,Ce=Date.now(),U=!e.nodes.some(e=>e.kind===`session`||e.kind===`aggregate`);let i=p(e);we=new Map(i.map(e=>[e.id,e.color])),Te=m(e,{max:V.labels}),Ee=h(e),Ke=`\0`,B.clear();for(let t of e.nodes)B.set(t.id,t);A=ee(e),xe.clear();for(let e of A.boxes)B.has(e.id)&&xe.add(e.id);N!==void 0&&!B.has(N)&&(N=void 0);let a=n.dataset;a.nodes=String(e.nodes.length),a.boxes=String(A.boxes.length),a.teams=String(A.boxes.filter(e=>e.kind===`team`).length),a.policy=String(e.links.filter(e=>e.kind===`policy`).length),a.twoWay=String(e.links.filter(e=>e.kind===`policy`&&e.twoWay).length),a.denied=String(e.links.filter(e=>e.kind===`denied`).length),a.bridges=String(e.links.filter(e=>e.bridge).length),a.tethers=String(e.links.filter(e=>e.structure===`seat`&&!e.bridge).length),a.vacant=String(e.nodes.filter(e=>e.kind===`role`&&e.vacant).length),a.selected=M??``,a.regions=String(i.length),a.empty=String(U),R||Fe(!1),K()},focus(e,t){let n=A?.positions.get(e);n&&(N=e,R=!0,Le(n,t,Math.max(L.k,1)),K())},reset(e){R=!1,Fe(e)},resize(e,t){F=Math.max(1,e),I=Math.max(1,t);let n=Ae();b.width=Math.round(F*n),b.height=Math.round(I*n),b.style.width=`${F}px`,b.style.height=`${I}px`,R||Fe(!1),K()},destroy(){cancelAnimationFrame(z),cancelAnimationFrame(ye),n.removeEventListener(`keydown`,ot),n.removeEventListener(`focus`,st),document.removeEventListener(`visibilitychange`,ct),n.replaceChildren()},hitTest(e,t){let n=G(e,t);return $e(n.x,n.y)},toWorld(e,t){let n=G(e,t);return W(n.x,n.y)},setOverlay(e){ve=e,K()},layout:()=>A}}export{O as createRenderer2D};
1
+ import{A as e,B as t,E as n,G as r,V as i,j as a,k as o}from"./live-BGLA-peO.js";import{a as s,i as c,n as l,o as u,r as d}from"./Watchtower-DlrNOJ7X.js";import{a as f,c as p,i as m,r as h,s as g,t as _}from"./safe-area-B2Bk__FK.js";var v={w:76,h:58,pad:16,header:38,role:118,gap:40,band:120,party:120,roleRow:92},y=14,b=8,x=200,S=420,C=(e,t)=>Math.max(1,Math.min(t,Math.ceil(Math.sqrt(e*2))));function ee(e){let t=new Map,n=new Set(e.nodes.map(e=>e.id));t.set(`hub`,{x:0,y:0}),e.nodes.filter(e=>e.id!==`hub`&&(e.kind===`hub`||e.kind===`user`||e.kind===`app`)).forEach((e,n)=>t.set(e.id,{x:(n%2==0?-1:1)*v.party*(Math.floor(n/2)+1),y:0}));let r=e.groups.map(e=>{let t=e.sections.map(e=>{let t=e.id!==void 0,n=C(e.members.length,t?b:y),r=Math.max(1,Math.ceil(e.members.length/n));return{cols:n,rows:r,role:t,w:(t?v.role+v.w/2:0)+n*v.w,h:r*(t?v.roleRow:v.h)}});return{group:e,sections:t,w:Math.max((e.kind===`team`?S:x)-2*v.pad,...t.map(e=>e.w))+2*v.pad,h:v.header+t.reduce((e,t)=>e+t.h,0)+v.pad}}),i=r.reduce((e,t)=>e+(t.w+v.gap)*(t.h+v.gap),0),a=Math.max(...r.map(e=>e.w),Math.sqrt(i)*1.5,1),o=[],s=[],c=0;for(let e of r)s.length&&c+v.gap+e.w>a&&(o.push(s),s=[],c=0),c+=(s.length?v.gap:0)+e.w,s.push(e);s.length&&o.push(s);let l=[],u=v.band;for(let e of o){let r=-(e.reduce((e,t)=>e+t.w,0)+v.gap*(e.length-1))/2;for(let i of e){let{group:e}=i,a=[],o=u+v.header;e.sections.forEach((e,s)=>{let c=i.sections[s],l={x:r+v.pad,y:o,w:i.w-2*v.pad,h:c.h};a.push({...l,...e.id===void 0?{}:{id:e.id},...e.label===void 0?{}:{label:e.label},...e.entry===void 0?{}:{entry:e.entry}});let u=c.role?v.roleRow:v.h;e.id!==void 0&&n.has(e.id)&&t.set(e.id,{x:l.x+v.role/2,y:o+u/2});let d=l.x+(c.role?v.role+s%2*(v.w/2):0);e.members.forEach((e,n)=>t.set(e,{x:d+n%c.cols*v.w+v.w/2,y:o+Math.floor(n/c.cols)*u+u/2})),o+=c.h}),n.has(e.id)&&t.set(e.id,{x:r+v.pad+12,y:u+v.header/2}),l.push({id:e.id,label:e.label,kind:e.kind,x:r,y:u,w:i.w,h:i.h,...e.machine===void 0?{}:{machine:e.machine},...e.online===void 0?{}:{online:e.online},...e.mode===void 0?{}:{mode:e.mode},...e.paused===void 0?{}:{paused:e.paused},...e.entryRole===void 0?{}:{entryRole:e.entryRole},members:e.sections.reduce((e,t)=>e+t.members.length,0),sections:a}),r+=i.w+v.gap}u+=Math.max(...e.map(e=>e.h))+v.gap}let d=e.nodes.filter(e=>!t.has(e.id));d.forEach((e,n)=>t.set(e.id,{x:(n-(d.length-1)/2)*v.w,y:u+v.h/2}));let f=[],p=[];for(let e of t.values())f.push(e.x-v.w/2,e.x+v.w/2),p.push(e.y-v.h/2,e.y+v.h/2);for(let e of l)f.push(e.x,e.x+e.w),p.push(e.y,e.y+e.h);let m=Math.min(...f)-40,h=Math.min(...p)-40;return{positions:t,boxes:l,bounds:{x:m,y:h,w:Math.max(...f)+40-m,h:Math.max(...p)+40-h}}}function te(e,t,n,r){let i=Math.max(1,t.width-n.left-n.right),a=Math.max(1,t.height-n.top-n.bottom),o=Math.max(r.min,Math.min(r.max,Math.min(i/Math.max(1,e.w),a/Math.max(1,e.h))));return{k:o,x:n.left+i/2-(e.x+e.w/2)*o,y:n.top+a/2-(e.y+e.h/2)*o}}function ne(e,t,n){let r=t===void 0?void 0:e.get(t);if(!r)return e.keys().next().value;let i,a=1/0;for(let[o,s]of e){if(o===t)continue;let e=s.x-r.x,c=s.y-r.y,[l,u]=n===`right`?[e,c]:n===`left`?[-e,c]:n===`down`?[c,e]:[-c,e];if(l<=0||Math.abs(u)>l*2)continue;let d=l+2*Math.abs(u);d<a&&(a=d,i=o)}return i??t}var re={glow:!0,pulses:!0,labels:12},w=.04,ie=4,ae=.55,oe=9.5,T={w:180,h:120},E=`system-ui, -apple-system, sans-serif`,se=e=>e.kind===`hub`?22:e.kind===`role`?13:Math.max(8,Math.min(20,e.size*1.9)),D=e=>e.kind===`hub`||e.kind===`role`?13:e.kind===`aggregate`?se(e)*.8:e.kind===`session`?Math.max(5,Math.min(11,3+e.size)):8,ce=(e,t)=>e.length>t?`${e.slice(0,t-1)}…`:e;function le(e){let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)|0;return(t>>>0)%1e3/1e3}function ue(e,t){return e.kind===`hub`?t(`--accent`):e.kind===`user`||e.kind===`app`?t(`--text`):e.kind===`team`||e.kind===`role`?t(`--violet`):e.kind===`cluster`?t(`--muted`):e.machine===void 0?t(`--faint`):t(n[e.machine%n.length])}function de(e,t,n,r){e.beginPath(),e.roundRect(t-v.role/2+8,n-r,v.role-16,r*2,r)}function fe(e,t,n){let r=t.x-e.x,i=t.y-e.y,a={x:(e.x+t.x)/2-i*n,y:(e.y+t.y)/2+r*n};return{c:a,mid:{x:.25*e.x+.5*a.x+.25*t.x,y:.25*e.y+.5*a.y+.25*t.y}}}var pe=e=>e.kind===`structure`?e.bridge?.18:0:e.kind===`policy`?.22:e.kind===`denied`?-.22:.1;function me(e,t,n,r,i,a,o){let s=Math.atan2(n.y-t.y,n.x-t.x);e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(n.x-r*Math.cos(s-.45),n.y-r*Math.sin(s-.45)),e.lineTo(n.x-r*Math.cos(s+.45),n.y-r*Math.sin(s+.45)),e.closePath(),e.setLineDash([]),e.fillStyle=i?o:a,e.fill(),e.strokeStyle=a,e.lineWidth=1.4,e.stroke()}function he(e,t,n){let r=Math.hypot(e.x-t.x,e.y-t.y)||1;return{x:e.x-(e.x-t.x)/r*n,y:e.y-(e.y-t.y)/r*n}}function ge(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=r||i?Math.max(0,Math.min(1,((e.x-t.x)*r+(e.y-t.y)*i)/(r*r+i*i))):0;return Math.hypot(e.x-(t.x+a*r),e.y-(t.y+a*i))}function O(n,y){let b=document.createElement(`canvas`);b.className=`wt-canvas2d`;let x=b.getContext(`2d`);if(!x)throw Error(`This browser can't draw on a canvas`);let S=document.createElement(`canvas`);S.className=`wt-minimap`,S.setAttribute(`aria-hidden`,`true`),S.title=`Minimap: click to move the view`;let C=S.getContext(`2d`),O=document.createElement(`span`);O.className=`wt-tip wt-tip2d`,O.hidden=!0,n.append(b,S,O);let k,A,j=()=>`#888`,_e=!0,M,N,P,ve,F=n.clientWidth||300,I=n.clientHeight||150,L={k:1,x:F/2,y:80},R=!1,z=0,ye=0,be={s:1,ox:0,oy:0},B=new Map,xe=new Set,V=re,H=!1,U=!1,Se=0,Ce=0,we=new Map,Te=new Set,Ee=new Map,De=new Map,Oe=0,ke=!1,Ae=()=>window.devicePixelRatio||1,je=e=>({x:e.x*L.k+L.x,y:e.y*L.k+L.y}),W=(e,t)=>({x:(e-L.x)/L.k,y:(t-L.y)/L.k}),G=(e,t)=>{let n=b.getBoundingClientRect();return{x:e-n.left,y:t-n.top}},K=()=>{Ne=!0,z||=requestAnimationFrame(Qe)},q=document.createElement(`canvas`),Me=q.getContext(`2d`),J=x,Ne=!0,Pe=``,Y=(e,t)=>{cancelAnimationFrame(ye);let n={...e,k:Math.max(w,Math.min(ie,e.k))};if(!t||!_e){L=n,K();return}let r=L,i=performance.now(),a=e=>{let t=Math.min(1,(e-i)/260),o=1-(1-t)**3;L={k:r.k+(n.k-r.k)*o,x:r.x+(n.x-r.x)*o,y:r.y+(n.y-r.y)*o},Qe(),t<1&&(ye=requestAnimationFrame(a))};ye=requestAnimationFrame(a)},Fe=e=>{if(!A)return;let t=A.positions.get(`hub`);Y(U&&t?{k:1.3,x:F/2-t.x*1.3,y:I/2-t.y*1.3}:te(A.bounds,{width:F,height:I},_(n),{min:w,max:1.4}),e)},Ie=(e,t,n,r=!1)=>{let i=Math.max(w,Math.min(ie,L.k*n)),a=W(e,t);R=!0,Y({k:i,x:e-a.x*i,y:t-a.y*i},r)},Le=(e,t,n=L.k)=>Y({k:n,x:F/2-e.x*n,y:I/2-e.y*n},t);function Re(e){let t=J,n=e.kind===`team`,r=n&&e.mode===`restricted`,i=j(we.get(e.id)??`--line-2`);t.save(),t.beginPath(),t.roundRect(e.x,e.y,e.w,e.h,22),V.glow&&(t.shadowColor=u(i,H?.35:.22),t.shadowBlur=36*L.k),t.fillStyle=u(i,H?.075:.06),t.fill(),t.shadowBlur=0,t.lineWidth=n?1.6:1,t.setLineDash(r?[8,5]:e.online===!1?[4,4]:[]),t.strokeStyle=u(i,n?.65:.4),t.stroke(),t.setLineDash([]),e.sections.forEach((e,n)=>{e.entry&&(t.fillStyle=u(j(`--accent`),.09),t.beginPath(),t.roundRect(e.x,e.y+2,e.w,e.h-4,10),t.fill()),n>0&&e.id!==void 0&&(t.strokeStyle=u(i,.18),t.lineWidth=1,t.beginPath(),t.moveTo(e.x+10,e.y),t.lineTo(e.x+e.w-10,e.y),t.stroke())}),t.beginPath(),t.rect(e.x,e.y,e.w-8,v.header),t.clip();let a=e.x+v.pad+(xe.has(e.id)?30:4),o=e.y+v.header/2,s=ce(e.label,28);t.fillStyle=j(`--text`),t.font=`650 13px ${E}`,t.textBaseline=`middle`,t.fillText(s,a,o);let c=k?.teams.find(t=>t.id===e.id)?.members??e.members,l=n?`${r?`Restricted: declared paths only`:`Open: everyone may message everyone`}${e.paused?` · paused`:``} · ${c} seated`:`${e.members} ${e.members===1?`node`:`nodes`}${e.online===!1?` · offline`:``}`;t.fillStyle=j(`--muted`),t.font=`12px ${E}`,t.fillText(l,a+t.measureText(s).width+18,o),t.restore()}function ze(e,n){let r=n.get(e.source),i=n.get(e.target);if(!r||!i||e.kind===`structure`&&e.structure!==`tree`&&e.structure!==`party`&&e.structure!==`seat`&&!e.bridge)return;let a=J,o=B.get(e.source),s=B.get(e.target),{c,mid:l}=fe(r,i,pe(e)),d=e.kind===`structure`,f=d&&e.structure===`seat`,p=j(d?e.bridge||f?`--violet`:`--line-2`:t(e.kind)),m=qe(),h=!m||e.source===m||e.target===m;a.save(),a.globalAlpha=(o?.dim&&s?.dim?.15:1)*(h?1:.2),a.setLineDash(d?e.bridge?[3,4]:[]:e.style===`dotted`?[1.5,4.5]:e.style===`dashed`?[7,4]:[]),a.lineCap=`round`;let g=d?i:he(i,c,(s?D(s):0)+6),_=e.kind===`policy`&&e.twoWay?he(r,c,(o?D(o):0)+6):f&&o?.kind===`role`?{x:r.x+v.role/2-8,y:r.y}:r,y=()=>{a.beginPath(),a.moveTo(_.x,_.y),a.quadraticCurveTo(c.x,c.y,g.x,g.y)};if(d){a.strokeStyle=u(p,e.bridge?.8:f?.6:.55),a.lineWidth=e.bridge?1.4:f?1.5:1,y(),a.stroke(),a.restore();return}let b=k&&k.links.length>120?.55:1,x=e.kind===`policy`?.6:e.kind===`denied`?.85:Math.min(.95,.45+e.width*.09)*b,S=e.kind===`policy`?1.6:Math.max(1.1,e.width*.75);V.glow&&e.kind!==`policy`&&(a.strokeStyle=u(p,(H?.16:.1)*x),a.lineWidth=S*4,y(),a.stroke());let C=a.createLinearGradient(_.x,_.y,g.x,g.y);C.addColorStop(0,u(p,x*.35)),C.addColorStop(1,u(p,x)),a.strokeStyle=C,a.lineWidth=S,y(),a.stroke();let ee=j(`--bg`),te=e.kind===`policy`?10:6+Math.min(3,e.width);me(a,c,g,te,e.kind===`policy`,u(p,Math.max(.7,x)),ee),e.kind===`policy`&&e.twoWay&&me(a,c,_,te,!0,p,ee),a.textBaseline=`middle`,e.kind===`denied`?(a.setLineDash([]),a.strokeStyle=p,a.lineWidth=2.2,a.beginPath(),a.moveTo(l.x-5,l.y-5),a.lineTo(l.x+5,l.y+5),a.moveTo(l.x+5,l.y-5),a.lineTo(l.x-5,l.y+5),a.stroke(),a.fillStyle=p,a.font=`600 11px ${E}`,a.fillText(`${e.denied??e.count} denied`,l.x+9,l.y)):e.kind===`policy`&&L.k>=.7&&e.kinds?.length&&(a.fillStyle=j(`--muted`),a.font=`11px ${E}`,a.fillText(`${e.twoWay?`⇄`:`→`} ${e.kinds.join(`, `)}`,l.x+6,l.y)),a.restore()}function Be(e,n){if(!_e||!V.pulses||!k)return 0;let i=J,a=Se+(Date.now()-Ce),o=0;i.save(),H&&(i.globalCompositeOperation=`lighter`);for(let s of k.links){if(s.kind===`structure`||s.kind===`policy`||s.kind===`denied`)continue;let c=r(s,a);if(P!==void 0&&(s.source===P||s.target===P)&&(c=Math.max(c,.55)),c<=0)continue;let u=e.get(s.source),d=e.get(s.target);if(!u||!d)continue;let{c:f}=fe(u,d,pe(s)),p=B.get(s.target),m=he(d,f,(p?D(p):0)+6),h=Math.min(4,1+Math.floor(Math.log2(Math.max(1,s.count)))),g=Math.max(1,Math.round(c*h)),_=.16+.34*c,v=le(s.id),y=j(t(s.kind));for(let e=0;e<g;e++){o++;let t=(v+e/g+n*_)%1,r=(1-t)**2*u.x+2*(1-t)*t*f.x+t*t*m.x,a=(1-t)**2*u.y+2*(1-t)*t*f.y+t*t*m.y;l(i,r,a,9,y,(.35+.65*c)*(H?.9:.6)),i.fillStyle=H?`#ffffff`:y,i.globalAlpha=.5+.5*c,i.beginPath(),i.arc(r,a,2.2,0,Math.PI*2),i.fill(),i.globalAlpha=1}}return i.restore(),o}function Ve(e,t,n,r){if(!e.ring||a[e.ring]===`none`)return;let i=J,s=a[e.ring];i.strokeStyle=j(o[e.ring]),i.setLineDash(s===`broken`?[4,3]:[]),i.lineWidth=s===`thick`?3:s===`thin`?1:1.8,i.beginPath(),i.arc(t,n,r+4,0,Math.PI*2),i.stroke(),s===`double`&&(i.lineWidth=1.1,i.beginPath(),i.arc(t,n,r+7,0,Math.PI*2),i.stroke()),i.setLineDash([])}function He(e,t){let n=J,r=D(e),i=!qe()||X.has(e.id);n.save(),n.globalAlpha=(e.dim?.25:1)*(i?1:.3);let a=ue(e,j);V.glow&&e.kind!==`role`&&l(n,t.x,t.y,r*(e.kind===`hub`?U?9:5:3.4),e.match?j(`--accent`):a,(H?.55:.32)*(e.dim?.4:1)*(e.id===P||e.id===M?1.5:1)),e.kind===`role`?(de(n,t.x,t.y,r),e.vacant||(n.fillStyle=u(a,e.entry?.22:.1),n.fill()),n.strokeStyle=u(a,e.entry?1:.7),n.lineWidth=e.entry?2.4:1.3,n.setLineDash(e.vacant?[4,3]:[]),n.stroke(),n.setLineDash([])):d(n,c(e),t.x,t.y,r,a,H?`#ffffff`:u(`#ffffff`,.9)),Ve(e,t.x,t.y,r),e.teams&&(n.strokeStyle=j(`--violet`),n.lineWidth=1.4,n.setLineDash([2,3]),n.beginPath(),n.arc(t.x,t.y,r+10,0,Math.PI*2),n.stroke(),n.setLineDash([]),n.fillStyle=j(`--violet`),n.font=`700 10px ${E}`,n.textBaseline=`middle`,n.fillText(`×${e.teams}`,t.x+r+6,t.y-r-6)),(e.id===M||e.id===N)&&(n.strokeStyle=j(`--accent`),n.lineWidth=e.id===M?2.5:2,n.setLineDash(e.id===M?[]:[5,3]),n.beginPath(),e.kind===`role`?n.roundRect(t.x-v.role/2+4,t.y-r-4,v.role-8,r*2+8,r+4):n.arc(t.x,t.y,r+(e.teams?14:9),0,Math.PI*2),n.stroke(),n.setLineDash([])),n.textAlign=`center`,n.textBaseline=`middle`,e.kind===`role`?(n.fillStyle=j(e.vacant?`--muted`:`--text`),n.font=`${e.entry?700:500} ${e.vacant?11:12}px ${E}`,n.fillText(ce(`${e.entry?`★ `:``}${f(e)}`,16),t.x,t.y)):e.kind===`aggregate`?(n.fillStyle=j(`--text`),n.font=`600 11px ${E}`,n.fillText(String(e.folded??``),t.x,t.y)):e.folded&&e.kind===`session`&&(n.fillStyle=j(`--bg`),n.font=`700 9px ${E}`,n.fillText(`+${e.folded}`,t.x,t.y));let o=De.get(e.id);if(o){let r=Ue(e);n.globalAlpha=e.dim?.6:i?1:.5,n.fillStyle=j(e.dim?`--faint`:e.kind===`session`?`--muted`:`--text`),n.font=We(e,r),n.lineWidth=r/11*3,n.strokeStyle=u(j(`--bg`),.85);let a=o.box.y+o.box.h/2;n.strokeText(o.text,t.x,a),n.fillText(o.text,t.x,a)}n.restore()}let Ue=e=>(e.kind===`hub`?13:11)*Math.max(1,Math.min(1.5,oe/11/L.k)),We=(e,t)=>`${e.kind===`hub`?700:500} ${t}px ${E}`;function Ge(e){if(!k||!A)return new Map;let t=[];for(let e of k.nodes){if(e.kind===`role`||e.kind===`aggregate`||xe.has(e.id))continue;let n=A.positions.get(e.id);if(!n)continue;let r=e.kind!==`session`||e.match||e.id===M||e.id===N||e.id===P;if(!r&&!(L.k>=1||L.k>=ae&&Te.has(e.id)))continue;let i=Ue(e),a=ce(e.label,14),o=ce(e.label,9);t.push({id:e.id,x:n.x,y:n.y+D(e)+(e.ring?16:13)*(i/11)-i*.65,h:i*1.3,texts:r||o===a?[a]:[a,o],pinned:r,rank:(Te.has(e.id)?1e6:0)+(Ee.get(e.id)??0),font:We(e,i)})}return t.sort((e,t)=>t.rank-e.rank||(e.id<t.id?-1:+(e.id>t.id))),g(t,(t,n)=>(e.font!==n.font&&(e.font=n.font),e.measureText(t).width+4))}let X=new Set,Ke;function qe(){let e=P??M;if(e!==Ke&&(Ke=e,X=new Set(e===void 0?[]:[e]),e!==void 0&&k))for(let t of k.links)t.source===e&&X.add(t.target),t.target===e&&X.add(t.source);return e!==void 0&&B.has(e)?e:void 0}function Je(){let e=J;e.save();let t=11,n=()=>((t=t*16807%2147483647)-1)/2147483646;e.fillStyle=j(`--accent`);for(let t=0;t<260;t++){let t=n()*Math.PI*2,r=60+n()**.7*900;e.globalAlpha=(H?.35:.22)*(1-r/1e3),e.beginPath(),e.arc(Math.cos(t)*r,Math.sin(t)*r*.6,.8+n()*1.6,0,Math.PI*2),e.fill()}e.restore()}function Ye(){if(!A)return;let e=Ae();S.width!==T.w*e&&(S.width=T.w*e,S.height=T.h*e);let t=C;t.setTransform(e,0,0,e,0,0),t.clearRect(0,0,T.w,T.h),t.globalAlpha=.92,t.fillStyle=j(`--raise`),t.fillRect(0,0,T.w,T.h),t.globalAlpha=1;let n=A.bounds,r=Math.min(T.w/n.w,T.h/n.h),i=(T.w-n.w*r)/2-n.x*r,a=(T.h-n.h*r)/2-n.y*r;t.strokeStyle=j(`--line-2`),t.lineWidth=1;for(let e of A.boxes)t.strokeRect(e.x*r+i,e.y*r+a,e.w*r,e.h*r);for(let[e,n]of A.positions){let o=B.get(e);if(!o)continue;let s=o.kind===`hub`?4:2;t.fillStyle=o.match?j(`--accent`):ue(o,j),t.fillRect(n.x*r+i-s/2,n.y*r+a-s/2,s,s)}let o=W(0,0);t.strokeStyle=j(`--accent`),t.lineWidth=1.5,t.strokeRect(o.x*r+i,o.y*r+a,F/L.k*r,I/L.k*r),be={s:r,ox:i,oy:a}}function Xe(){let e=Me,t=Ae();if((q.width!==b.width||q.height!==b.height)&&(q.width=b.width,q.height=b.height),e.setTransform(t,0,0,t,0,0),e.fillStyle=j(`--bg`),e.fillRect(0,0,F,I),k&&A){e.setTransform(t*L.k,0,0,t*L.k,t*L.x,t*L.y),J=e;try{U&&Je();for(let e of A.boxes)Re(e);let t=A.positions;for(let e of k.links)e.kind===`structure`&&ze(e,t);for(let e of k.links)e.kind!==`structure`&&ze(e,t);De=Ge(e),Ze();for(let e of k.nodes){let n=t.get(e.id);n&&He(e,n)}}finally{J=x}}}function Ze(){if(!A)return;let e=A.bounds,t=e=>Math.round(e*10)/10;n.dataset.content=JSON.stringify({x:t(e.x*L.k+L.x),y:t(e.y*L.k+L.y),w:t(e.w*L.k),h:t(e.h*L.k)}),n.dataset.labelBoxes=JSON.stringify([...De.values()].map(({box:e})=>[t(e.x*L.k+L.x),t(e.y*L.k+L.y),t(e.w*L.k),t(e.h*L.k)]))}function Qe(){z=0;let e=performance.now(),t=x,r=`${L.k},${L.x},${L.y},${b.width},${b.height}`;if((Ne||r!==Pe)&&(Xe(),Ye(),Ne=!1,Pe=r),t.setTransform(1,0,0,1,0,0),t.drawImage(q,0,0),!k||!A)return;let i=Ae();t.setTransform(i*L.k,0,0,i*L.k,i*L.x,i*L.y),Oe=Be(A.positions,performance.now()/1e3),ve&&(t.save(),ve(t,L),t.restore()),n.dataset.zoom=L.k.toFixed(3),n.dataset.pulses=String(Oe),n.dataset.drawMs=(performance.now()-e).toFixed(1),ke=Oe>0&&!document.hidden,n.dataset.animating=String(ke),ke&&!z&&(z=requestAnimationFrame(Qe))}function $e(e,t){if(!k||!A)return;let n=W(e,t),r;for(let e of k.nodes){let t=A.positions.get(e.id);if(!t)continue;let i=e.kind===`role`?Math.abs(n.x-t.x)<=v.role/2-8&&Math.abs(n.y-t.y)<=se(e)?-1:1/0:Math.hypot(n.x-t.x,n.y-t.y)-se(e)-3;i<=0&&(!r||i<r.d)&&(r={id:e.id,d:i})}if(r)return{type:`node`,id:r.id};let i=6/L.k,a;for(let e of k.links){if(e.kind===`structure`)continue;let t=A.positions.get(e.source),r=A.positions.get(e.target);if(!t||!r)continue;let{c:o}=fe(t,r,pe(e)),s=t;for(let c=1;c<=16;c++){let l=c/16,u={x:(1-l)**2*t.x+2*(1-l)*l*o.x+l*l*r.x,y:(1-l)**2*t.y+2*(1-l)*l*o.y+l*l*r.y},d=ge(n,s,u);d<=i&&(!a||d<a.d)&&(a={l:e,d}),s=u}}if(a)return{type:`link`,link:a.l};let o=A.boxes.find(e=>n.x>=e.x&&n.x<=e.x+e.w&&n.y>=e.y&&n.y<=e.y+e.h);return o?{type:`box`,id:o.id}:void 0}function et(t){let n=B.get(t);if(!n)return``;let r=[n.label];return n.kind===`role`&&r.push(n.entry?`entry role`:`role`,n.vacant?`vacant`:`${n.staffed??0} staffed`),n.seat&&r.push(`seat: ${n.seat}`),n.kind===`team`&&r.push(n.mode===`restricted`?`restricted team`:`open team`),n.kind===`machine`&&r.push(`machine`),n.ring&&r.push(e[n.ring]),n.teams&&r.push(`in ${n.teams} teams`),n.folded&&n.kind===`session`&&r.push(`+${n.folded} folded`),r.join(` · `)}function tt(e){let t=e=>B.get(e)?.label??e;return e.kind===`structure`?``:e.kind===`policy`?`Team path ${t(e.source)} ${e.twoWay?`⇄`:`→`} ${t(e.target)}${e.kinds?.length?` · ${e.kinds.join(`, `)}`:``}${e.count?` · ${e.count} sent along it`:``}`:e.kind===`denied`?`${e.denied??e.count} denied: ${t(e.source)} → ${t(e.target)}`:`${i(e.kind)} · ${t(e.source)} → ${t(e.target)} · ${e.count}`}let Z=new Map,Q,$;b.addEventListener(`pointerdown`,e=>{b.setPointerCapture?.(e.pointerId);let t=G(e.clientX,e.clientY);if(Z.set(e.pointerId,t),Z.size===2){let[e,t]=[...Z.values()];$={d:Math.hypot(e.x-t.x,e.y-t.y)||1,k:L.k,mid:{x:(e.x+t.x)/2,y:(e.y+t.y)/2}},Q=void 0}else Q={...t,t:L,moved:!1}}),b.addEventListener(`pointermove`,e=>{let t=G(e.clientX,e.clientY);if(Z.has(e.pointerId)&&Z.set(e.pointerId,t),$&&Z.size===2){let[e,t]=[...Z.values()],n=Math.max(w,Math.min(ie,$.k*(Math.hypot(e.x-t.x,e.y-t.y)||1)/$.d)),r=W($.mid.x,$.mid.y);R=!0,Y({k:n,x:$.mid.x-r.x*n,y:$.mid.y-r.y*n},!1);return}if(Q){!Q.moved&&Math.hypot(t.x-Q.x,t.y-Q.y)>4&&(Q.moved=!0),Q.moved&&(R=!0,O.hidden=!0,Y({k:Q.t.k,x:Q.t.x+t.x-Q.x,y:Q.t.y+t.y-Q.y},!1));return}let n=$e(t.x,t.y),r=n?.type===`node`?n.id:void 0;b.style.cursor=n&&n.type!==`box`?`pointer`:`grab`,r!==P&&(P=r,K());let i=n?.type===`node`?et(n.id):n?.type===`link`?tt(n.link):``;O.hidden=!i,i&&(O.textContent=i,O.style.left=`${Math.min(t.x+14,F-220)}px`,O.style.top=`${t.y+14}px`)}),b.addEventListener(`pointerup`,e=>{if(Z.delete(e.pointerId),Z.size<2&&($=void 0),!Q)return;let t=!Q.moved;if(Q=void 0,!t)return;let n=G(e.clientX,e.clientY),r=$e(n.x,n.y);r?.type===`node`?(N=r.id,y.onNode(r.id)):r?.type===`link`?y.onLink(r.link):y.onBackground(),K()}),b.addEventListener(`pointercancel`,e=>{Z.delete(e.pointerId),Q=void 0,$=void 0}),b.addEventListener(`pointerleave`,()=>{O.hidden=!0,P!==void 0&&(P=void 0,K())}),b.addEventListener(`wheel`,e=>{e.preventDefault();let t=G(e.clientX,e.clientY);Ie(t.x,t.y,Math.exp(-e.deltaY*(e.ctrlKey?.01:.0015)))},{passive:!1}),b.addEventListener(`dblclick`,e=>{let t=G(e.clientX,e.clientY);Ie(t.x,t.y,2,!0)});let nt=e=>{let t=S.getBoundingClientRect(),{s:n,ox:r,oy:i}=be;R=!0,Le({x:(e.clientX-t.left-r)/n,y:(e.clientY-t.top-i)/n},!1)};S.addEventListener(`pointerdown`,e=>{S.setPointerCapture?.(e.pointerId),nt(e)}),S.addEventListener(`pointermove`,e=>{S.hasPointerCapture?.(e.pointerId)&&nt(e)});let rt=e=>{let t=et(e);y.announce(t?`${t}. Enter opens it.`:``)},it=e=>{let t=A?.positions.get(e);if(!t)return;let n=je(t);(n.x<40||n.y<40||n.x>F-40||n.y>I-40)&&Le(t,!0,Math.max(L.k,.7))},at=e=>{N=e,e&&(it(e),rt(e)),K()},ot=e=>{if(e.target!==n||!A)return;let t={ArrowLeft:`left`,ArrowRight:`right`,ArrowUp:`up`,ArrowDown:`down`}[e.key];t&&e.shiftKey?(e.preventDefault(),R=!0,Y({...L,x:L.x+(t===`left`?80:t===`right`?-80:0),y:L.y+(t===`up`?80:t===`down`?-80:0)},!1)):t?(e.preventDefault(),at(ne(A.positions,N??`hub`,t))):(e.key===`Enter`||e.key===` `)&&N?(e.preventDefault(),y.onNode(N)):e.key===`Home`?(e.preventDefault(),at(`hub`)):e.key===`+`||e.key===`=`||e.key===`-`||e.key===`_`?(e.preventDefault(),Ie(F/2,I/2,e.key===`+`||e.key===`=`?1.25:.8,!0)):e.key===`0`&&(e.preventDefault(),R=!1,Fe(!0))},st=()=>{N===void 0&&(N=M!==void 0&&B.has(M)?M:`hub`),rt(N),K()};n.addEventListener(`keydown`,ot),n.addEventListener(`focus`,st);let ct=()=>document.visibilityState===`visible`&&K();return document.addEventListener(`visibilitychange`,ct),{update(e,t,r){k=e,j=t,_e=r.motion,M=r.selected,V={...re,...r.look},H=s(j(`--bg`)),Se=e.now,Ce=Date.now(),U=!e.nodes.some(e=>e.kind===`session`||e.kind===`aggregate`);let i=p(e);we=new Map(i.map(e=>[e.id,e.color])),Te=m(e,{max:V.labels}),Ee=h(e),Ke=`\0`,B.clear();for(let t of e.nodes)B.set(t.id,t);A=ee(e),xe.clear();for(let e of A.boxes)B.has(e.id)&&xe.add(e.id);N!==void 0&&!B.has(N)&&(N=void 0);let a=n.dataset;a.nodes=String(e.nodes.length),a.boxes=String(A.boxes.length),a.teams=String(A.boxes.filter(e=>e.kind===`team`).length),a.policy=String(e.links.filter(e=>e.kind===`policy`).length),a.twoWay=String(e.links.filter(e=>e.kind===`policy`&&e.twoWay).length),a.denied=String(e.links.filter(e=>e.kind===`denied`).length),a.bridges=String(e.links.filter(e=>e.bridge).length),a.tethers=String(e.links.filter(e=>e.structure===`seat`&&!e.bridge).length),a.vacant=String(e.nodes.filter(e=>e.kind===`role`&&e.vacant).length),a.selected=M??``,a.regions=String(i.length),a.empty=String(U),R||Fe(!1),K()},focus(e,t){let n=A?.positions.get(e);n&&(N=e,R=!0,Le(n,t,Math.max(L.k,1)),K())},reset(e){R=!1,Fe(e)},resize(e,t){F=Math.max(1,e),I=Math.max(1,t);let n=Ae();b.width=Math.round(F*n),b.height=Math.round(I*n),b.style.width=`${F}px`,b.style.height=`${I}px`,R||Fe(!1),K()},destroy(){cancelAnimationFrame(z),cancelAnimationFrame(ye),n.removeEventListener(`keydown`,ot),n.removeEventListener(`focus`,st),document.removeEventListener(`visibilitychange`,ct),n.replaceChildren()},hitTest(e,t){let n=G(e,t);return $e(n.x,n.y)},toWorld(e,t){let n=G(e,t);return W(n.x,n.y)},setOverlay(e){ve=e,K()},layout:()=>A}}export{O as createRenderer2D};