grooph 0.4.0 → 0.5.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 (58) hide show
  1. package/README.md +33 -31
  2. package/THIRD-PARTY-NOTICES.md +5 -1
  3. package/dist/app/assets/App-CT9KxzfQ.css +1 -0
  4. package/dist/app/assets/App-D1pDFbEY.js +5 -0
  5. package/dist/app/assets/EmbedApp-CTausQWY.js +1 -0
  6. package/dist/app/assets/ExportPanel-CbRH4C69.js +8 -0
  7. package/dist/app/assets/Import-DF0XLxRI.js +1 -0
  8. package/dist/app/assets/SketchView-BjeUHG4X.js +143 -0
  9. package/dist/app/assets/brakes-B9b3hDX8.js +1 -0
  10. package/dist/app/assets/{builtins-Cbs5iQtH.js → builtins-DzyPaYdd.js} +1 -1
  11. package/dist/app/assets/{compile-BAvi-rd0.js → compile-DL2budwP.js} +8 -8
  12. package/dist/app/assets/{front-BRl7rl-u.js → front-OxfL-OaD.js} +1 -1
  13. package/dist/app/assets/full-C0asYORc.js +1 -0
  14. package/dist/app/assets/graph-more-Dn_hNa20.js +2 -0
  15. package/dist/app/assets/graph-stage-CwNePnN4.js +4 -0
  16. package/dist/app/assets/graph-views-CmkQ41zC.js +2 -0
  17. package/dist/app/assets/{index-BoSi6XYh.js → index-B5ZkSF4L.js} +2 -2
  18. package/dist/app/assets/mermaid-read-cyqJ32v-.js +17 -0
  19. package/dist/app/assets/{plan-templates-BQu8G2sX.js → plan-templates-u2fF3GnS.js} +1 -1
  20. package/dist/app/assets/runs-BA5HKtsx.js +1 -0
  21. package/dist/app/assets/screens-CMMuexid.js +16 -0
  22. package/dist/app/assets/share-DV3wsAsJ.js +8 -0
  23. package/dist/app/assets/site-looks.v1.css +223 -0
  24. package/dist/app/assets/space-Cuy4YqyZ.js +1 -0
  25. package/dist/app/assets/styles-Dlp-yYlE.css +1 -0
  26. package/dist/app/assets/templates-DbAhWvP6.js +2 -0
  27. package/dist/app/assets/{themes-DtOBrLk0.js → themes-C34TrvOJ.js} +1 -1
  28. package/dist/app/assets/{units-DRaa5U2m.js → units-DlniUjfH.js} +1 -1
  29. package/dist/app/assets/{views-DCEDX6Qx.js → views-CFqRShXD.js} +2 -1
  30. package/dist/app/grooph-app.json +1 -1
  31. package/dist/app/index.html +14 -11
  32. package/dist/app/llms.txt +6 -7
  33. package/dist/app/manifest.webmanifest +1 -1
  34. package/dist/app/og.png +0 -0
  35. package/dist/app/routes.json +42 -33
  36. package/dist/app/sw.js +7 -2
  37. package/dist/browser/grooph.d.ts +44 -0
  38. package/dist/browser/grooph.global.js +7 -0
  39. package/dist/browser/grooph.js +7 -0
  40. package/dist/bundle/grooph.js +7082 -2606
  41. package/hooks/grooph-event.mjs +163 -14
  42. package/package.json +14 -6
  43. package/dist/app/assets/App-CFO6bPna.js +0 -5
  44. package/dist/app/assets/App-Cv1auMeh.css +0 -1
  45. package/dist/app/assets/EmbedApp-B5LWao3x.js +0 -1
  46. package/dist/app/assets/ExportPanel-VWus7GM3.js +0 -8
  47. package/dist/app/assets/Import-YEKofx4_.js +0 -1
  48. package/dist/app/assets/brakes-9E9PsV_Z.js +0 -1
  49. package/dist/app/assets/graph-more-BKW9C4-h.js +0 -2
  50. package/dist/app/assets/graph-stage-CWh3OWga.js +0 -4
  51. package/dist/app/assets/graph-views-tFUJK-be.js +0 -2
  52. package/dist/app/assets/runs-DcjRi7S6.js +0 -1
  53. package/dist/app/assets/screens-YUd2HaLm.js +0 -16
  54. package/dist/app/assets/share-BzIzB4EY.js +0 -8
  55. package/dist/app/assets/space-DWgrlnfB.js +0 -1
  56. package/dist/app/assets/styles-BA1aVO9R.css +0 -1
  57. package/dist/app/assets/templates-DvzLa5sE.js +0 -2
  58. package/dist/app/demo/run.txt +0 -1
@@ -0,0 +1,7 @@
1
+ var e=Object.defineProperty,t=(t,n)=>{let r={};for(var i in t)e(r,i,{get:t[i],enumerable:!0});return n||e(r,Symbol.toStringTag,{value:`Module`}),r};function n(e,t){let n=new Map((e.groups??[]).map(e=>[e.id,e])),r=n.get(t);if(!r)return;let i=new Set,a=[],o=new Set([t]),s=e=>{for(let t of e.members){let e=n.get(t);e?o.has(t)||(o.add(t),a.push(t),s(e)):i.add(t)}};return s(r),{nodes:e.nodes.filter(e=>i.has(e.id)).map(e=>e.id),groups:a,edges:e.edges.filter(e=>i.has(e.from)&&i.has(e.to)).map(e=>e.id),loops:e.loops.filter(e=>e.members.length>0&&e.members.every(e=>i.has(e))).map(e=>e.id),entries:e.edges.filter(e=>!i.has(e.from)&&i.has(e.to)),exits:e.edges.filter(e=>i.has(e.from)&&!i.has(e.to))}}const r={edge:`ink-2`,"ink-3":`ink-3`,ink:`ink`,surface:`surface`,"accent-soft":`accent-soft`,"kind-agent":`accent`,"kind-human-gate":`gate`,"kind-check":`check`,"kind-merge":`merge`,warning:`warning`,error:`error`,"loop-0":`loop-0`,"loop-1":`loop-1`,"loop-2":`loop-2`,"loop-3":`loop-3`},i=e=>(Math.round(e*10)/10).toString(),a=(e,t)=>e===0?[]:[`${e} ${t}${e===1?``:`s`}`];function o(e,t=[]){let r=(e.groups??[]).filter(e=>e.from!==void 0),i=new Map,a=new Map(r.map(e=>[e.id,0])),o=new Map;for(let t of r){let r=n(e,t.id);i.set(t.id,new Set(r.nodes)),o.set(t.id,r.loops);for(let e of r.groups)a.has(e)&&a.set(e,a.get(e)+1)}let s=e=>r.filter(t=>i.get(t.id).has(e)).sort((e,t)=>a.get(e.id)-a.get(t.id)),c=e=>t===`all`||t.includes(e.id),l=e=>s(e).find(e=>!c(e))?.id??e,u=new Map(r.map(e=>[e.id,e])),d=new Set,f=[];for(let t of e.nodes){let e=l(t.id);d.has(e)||(d.add(e),f.push(e===t.id?t:{id:e,kind:`merge`,name:u.get(e).name,merges:[]}))}let p=e.edges.flatMap(e=>{let t=l(e.from),n=l(e.to);return t===n&&e.from!==e.to?[]:[{...e,from:t,to:n}]}),m=new Set(p.map(e=>e.id)),h=e.loops.flatMap(e=>{let t=[...new Set(e.members.map(l))];return t.length===1&&u.has(t[0])?[]:[{...e,members:t,back:e.back.filter(e=>m.has(e))}]}),{groups:g,layout:_,...v}=e,y=r.filter(e=>i.get(e.id).size>0&&(d.has(e.id)||c(e)&&[...i.get(e.id)].some(t=>s(t).every(t=>a.get(t.id)>a.get(e.id)||c(t))))).sort((e,t)=>a.get(e.id)-a.get(t.id)).map(t=>({group:t,open:!d.has(t.id),depth:a.get(t.id),nodes:e.nodes.filter(e=>i.get(t.id).has(e.id)).map(e=>e.id),cards:[...new Set([...i.get(t.id)].map(l))],loops:o.get(t.id)}));return{doc:{...v,nodes:f,edges:p,loops:h},boxes:y,stands:l,chain:s}}function s(e,t){let n=new Set(t.nodes),{groups:r,layout:i,...a}=e;return{...a,name:t.group.name,nodes:e.nodes.filter(e=>n.has(e.id)),edges:e.edges.filter(e=>n.has(e.from)&&n.has(e.to)),loops:e.loops.filter(e=>t.loops.includes(e.id))}}function c(e,t){let n=new Set(t.nodes),r=e.nodes.filter(e=>n.has(e.id));return{line:[t.group.from,...a(r.length,`node`),...a(r.filter(e=>e.kind===`human-gate`).length,`human gate`),...a(t.loops.length,`loop`)].join(` · `),irreversible:r.flatMap(e=>e.kind===`agent`?e.irreversible??[]:[])}}function l(e,t,n={}){let[a,l,u,d,f,p]=e,{open:m,...h}=n;if(!(t.groups??[]).some(e=>e.from!==void 0))return a(t,h);let{doc:g,boxes:_,stands:v,chain:y}=o(t,m),b=new Map(_.map(e=>[e.group.id,new Set(e.nodes)])),x=new Map(_.map(e=>[e.group.id,e.depth])),S=e=>_.some(t=>t.group===e&&t.open),C=(e,t)=>y(e)[t]?.id??e,w=(e,n,r)=>l({...g,nodes:[...new Set(e.map(e=>C(e,r)))].map(e=>({id:e})),edges:t.edges.filter(e=>n(e.from)&&n(e.to)).map(e=>({...e,from:C(e.from,r),to:C(e.to,r)})),loops:t.loops}),T=t.nodes.map(e=>e.id),E=w(T,()=>!0,0),D=[],O=(e,t)=>{let n=E.findIndex(t=>t.includes(e.id)),r=b.get(e.id);if(n<0||!r||!S(e))return;let i=T.filter(e=>r.has(e)),a=E[n].filter(t=>t!==e.id);E.splice(n,1,...a.length>0?[a]:[],...w(i,e=>r.has(e),t+1)),D.push(e);for(let e of new Set(i.map(e=>y(e)[t+1]).filter(e=>e!==void 0)))O(e,t+1)};for(let e of new Set(T.map(e=>y(e)[0]).filter(e=>e!==void 0)))O(e,0);let k=e=>{let t=new Set([...b.get(e.id)].map(v)),n=E.flatMap((e,n)=>e.some(e=>t.has(e))?[n]:[]);return[n[0],n[n.length-1]]},A=E.map(()=>0);for(let e of D){let[t,n]=k(e);A[t]+=24,n+1<E.length&&(A[n+1]+=10)}let j=new Map,M=new Map;for(let e of _){if(e.open)continue;let n=e.group,r=/^<svg[^>]*viewBox="([^"]+)" width="([\d.]+)" height="([\d.]+)"[^>]*>\s*<title>[^<]*<\/title>/.exec(u(s(t,e))),i=r?Math.min(1,34/Number(r[3]),200/Number(r[2])):0;r&&j.set(n.id,{svg:`viewBox="${r[1]}" fill="none" stroke-linecap="round" stroke-linejoin="round">${r.input.slice(r[0].length).trim()}`,width:Number(r[2])*i,height:Number(r[3])*i});let a=c(t,e);M.set(n.id,{label:`Subgrooph`,color:`ink-2`,sub:[a.line,...n.description?[n.description]:[]],extra:a.irreversible.length>0?`irreversible inside: ${a.irreversible.join(`, `)}`:``,room:r?Number(r[3])*i+6:0})}return a(g,h,{ranks:E,gaps:A,faces:M,whole:t,draw:(e,t,n,a)=>{let o=[],s=[];for(let[c,l]of j){let u=e.get(c);if(!u)continue;o.push(d(t+4,u.y+4,n,u.height,{fill:a(`surface-2`),stroke:a(`line-strong`),rx:9}));let f=l.svg.replace(/var\(--([a-z0-9-]+), #[0-9a-f]+\)/g,(e,t)=>a(r[t]??`ink-2`));s.push(`<svg x="${i(t+10)}" y="${i(u.y+u.height-l.height-8)}" width="${i(l.width)}" height="${i(l.height)}" ${f}`)}for(let r of D){let[i,s]=k(r),c=D.filter(e=>e!==r&&x.get(e.id)>x.get(r.id)&&[...b.get(e.id)].every(e=>b.get(r.id).has(e))),l=5+4*Math.max(0,...c.map(e=>x.get(e.id)-x.get(r.id))),u=Math.min(...E[i].map(t=>e.get(t).y))-24*(c.filter(e=>k(e)[0]===i).length+1)+4,m=Math.max(...E[s].map(t=>e.get(t).y+e.get(t).height))+4+4*c.filter(e=>k(e)[1]===s).length;o.push(`<g data-group="${r.id}" data-open="">`+d(t-l,u,n+2*l,m-u,{stroke:a(`line-strong`),rx:12,dash:`5 4`})+f(t-l+8,u+13,p(r.name,n/2-34,9.5,`bold`),{size:9.5,fill:a(`ink-3`),weight:`bold`})+f(t+n+l-8,u+13,p(r.from,n/2-34,9.5),{size:9.5,fill:a(`ink-3`),anchor:`end`})+`</g>`)}return[o.join(``),s.join(``)]}})}const u={width:200,height:84,gapX:36,gapY:76};function d(e){let t=e.nodes.map(e=>e.id),n=new Set(t),r=new Set(e.loops.flatMap(e=>e.back)),i=m(t,e.edges.filter(e=>!r.has(e.id)&&n.has(e.from)&&n.has(e.to)&&e.from!==e.to).map(e=>[e.from,e.to])),a=new Map(t.map(e=>[e,[]]));for(let[e,t]of i)a.get(t).push(e);let o=new Map,s=(e,t)=>{let n=o.get(e);if(n!==void 0)return n;t.add(e);let r=0;for(let n of a.get(e))t.has(n)||(r=Math.max(r,s(n,t)+1));return t.delete(e),o.set(e,r),r};for(let e of t)s(e,new Set);let c=[];for(let e of t)(c[o.get(e)]??=[]).push(e);let l=new Map(t.map(e=>[e,[]]));for(let[e,t]of i)l.get(e).push(t),l.get(t).push(e);let u=new Map(t.map((e,t)=>[e,t]));for(let e=0;e<2;e++){let e=new Map;c.forEach(t=>t?.forEach((t,n)=>e.set(t,n)));for(let t=1;t<c.length;t++){let n=c[t];if(!n)continue;let r=n=>{let r=l.get(n).filter(e=>o.get(e)===t-1);return r.length===0?e.get(n):r.reduce((t,n)=>t+e.get(n),0)/r.length};n.sort((e,t)=>r(e)-r(t)||u.get(e)-u.get(t)),n.forEach((t,n)=>e.set(t,n))}}return c.filter(e=>e!==void 0)}function f(e,t=4,n=u){let r={},i=0;for(let a of d(e))for(let e=0;e<a.length;e+=t){let o=a.slice(e,e+t),s=o.length*n.width+(o.length-1)*n.gapX;o.forEach((e,t)=>{r[e]={x:Math.round(t*(n.width+n.gapX)-s/2),y:i}}),i+=n.height+n.gapY}return r}function p(e,t=4,n=u){let r=e.layout??{},i=e.nodes.map(e=>e.id).filter(e=>!Object.hasOwn(r,e));if(i.length===0){let t={};for(let n of e.nodes)t[n.id]={x:r[n.id].x,y:r[n.id].y};return{positions:t,unplaced:i}}let a=f(e,t,n),o=e.nodes.filter(e=>Object.hasOwn(r,e.id));if(o.length===0)return{positions:a,unplaced:i};let s={};for(let e of o)s[e.id]={x:r[e.id].x,y:r[e.id].y};let c=Math.min(...o.map(e=>r[e.id].x)),l=Math.max(...o.map(e=>r[e.id].y)),d=Math.min(...i.map(e=>a[e].x)),p=Math.min(...i.map(e=>a[e].y));for(let e of i)s[e]={x:c+a[e].x-d,y:l+n.height+n.gapY+a[e].y-p};return{positions:s,unplaced:i}}function m(e,t){let n=new Map(e.map(e=>[e,[]]));for(let e of t)n.get(e[0]).push(e);let r=new Map,i=[],a=e=>{r.set(e,1);for(let t of n.get(e)){let e=r.get(t[1]);e!==1&&(i.push(t),e===void 0&&a(t[1]))}r.set(e,2)};for(let t of e)r.has(t)||a(t);return i}const h={"claude-code":`Claude Code`,codex:`Codex`};Object.keys(h);const g=e=>Object.prototype.hasOwnProperty.call(h,e),_=[`critic`,`judge`,`red-team`],v=[`builder`,`synthesizer`,`planner`],y=e=>typeof e.role==`string`?e.role:e.role.custom,b=e=>typeof e.role!=`string`,x=e=>e?.kind===`agent`&&e.by===`person`,S={agent:`Agent`,person:`Person`},C=e=>e.kind===`agent`&&!b(e)&&_.includes(e.role),w=e=>e.kind===`agent`?b(e)?(e.owns??[]).length>0:v.includes(e.role):!1,T=e=>e.when??`always`,E=e=>{let t=T(e);return typeof t==`string`?t:`verdict ${t.verdict}`};function D(e,t){if(t.mode)return t.mode;let n=(t.back??[]).map(t=>e.edges.get(t)).filter(e=>!!e);return n.length===0||n.every(t=>e.nodes.get(t.from)?.kind===`check`)?`grind`:`judgment`}function O(e){switch(e.kind){case`human`:return e.every===void 0?`human halt`:`human halt, asked every ${e.every} round(s)`;case`budget`:return`budget: ${e.limit} ${e.measure}`;case`bar-passed`:return`bar passed`;case`diminishing-returns`:return`diminishing returns over ${e.rounds} round(s)${e.metric?` on ${e.metric}`:``}${e.threshold===void 0?``:` (threshold ${e.threshold})`}`;case`evidence-invalid`:return`evidence invalid for ${e.rounds} round(s)`;case`max-iterations`:return`max iterations: ${e.n}`;default:return JSON.stringify(e)}}function k(e,t=!1){return e.then===void 0?e.kind===`bar-passed`?`follow the loop's pass exit edges`:t?`stop here and decide`:`halt the run and report to the human`:`continue at node \`${e.then}\``}const A=e=>{if((e.nodes??[]).some(x))return!0;let t=e.target?.harness;return e.template===void 0&&(typeof t!=`string`||!g(t))},j=e=>e.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g,``).replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`),M={edge:`var(--edge, #5c6663)`,muted:`var(--ink-3, #6b7370)`,ink:`var(--ink, #2b302e)`,surface:`var(--surface, #ffffff)`,agentFill:`var(--accent-soft, #e3efe9)`,agent:`var(--kind-agent, #1f5f4a)`,gate:`var(--kind-human-gate, #b25e09)`,check:`var(--kind-check, #2b5f9e)`,merge:`var(--kind-merge, #6b4fa0)`,warning:`var(--warning, #955500)`,error:`var(--error, #b42318)`,loops:[`var(--loop-0, #7a4cc2)`,`var(--loop-1, #0f7c8c)`,`var(--loop-2, #c2410c)`,`var(--loop-3, #b5306e)`]},N=e=>{switch(e.kind){case`agent`:return C(e)?`diamond`:w(e)?`square`:`rounded`;case`check`:return`hexagon`;case`human-gate`:return`octagon`;case`merge`:return`circle`;case`stop`:return`dot`}};function P(e,t,n){let r=Math.hypot(t,n)||1,i=Math.abs(t/r),a=Math.abs(n/r);switch(e){case`square`:case`rounded`:return Math.min(11/Math.max(i,a),11*Math.SQRT2-1);case`diamond`:return 14/(i+a);case`hexagon`:case`octagon`:return 13;case`circle`:return 11;case`dot`:return 6}}const F=(e,t)=>{let n=e===`diamond`||e===`hexagon`?14:e===`dot`?6:e===`octagon`?13:11,r=e===`diamond`?14:e===`dot`?6:e===`octagon`?13:e===`hexagon`?12:11;return{x:t?Math.max(n,13):n,top:r,bottom:t?19:r}},I=e=>{let t=Math.round(e*10)/10;return(Object.is(t,-0)?0:t).toString()},L=e=>`${I(e.x)},${I(e.y)}`,ee=()=>({minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}),R=(e,t,n,r=0)=>{e.minX=Math.min(e.minX,t-r),e.minY=Math.min(e.minY,n-r),e.maxX=Math.max(e.maxX,t+r),e.maxY=Math.max(e.maxY,n+r)};function te(e){let t={};if(!(e.layout!==void 0&&e.nodes.some(t=>t.id in e.layout))){let n=d(e),r=(Math.max(1,...n.map(e=>e.length))-1)*44/2;return n.forEach((e,n)=>{let i=r-(e.length-1)*44/2;e.forEach((e,r)=>{t[e]={x:n*60,y:i+r*44}})}),{centers:t,vertical:!1}}let{positions:n}=p(e),r={};for(let t of e.nodes){let i=n[t.id],a=e.layout[t.id];r[t.id]={x:i.x+(a?.w??200)/2,y:i.y+(a?.h??84)/2}}let i=e.nodes.map(e=>e.id),a=1/0;for(let e=0;e<i.length;e++)for(let t=e+1;t<i.length;t++){let n=Math.hypot(r[i[e]].x-r[i[t]].x,r[i[e]].y-r[i[t]].y);n>0&&(a=Math.min(a,n))}let o=ee();for(let e of i)R(o,r[e].x,r[e].y);let s=o.maxX-o.minX,c=o.maxY-o.minY,l=a===1/0?1:40/a;s*l>400&&(l=400/s),c*l>400&&(l=400/c);for(let e of i)t[e]={x:(r[e].x-o.minX)*l,y:(r[e].y-o.minY)*l};return{centers:t,vertical:c>s}}function ne(e,t={}){let n=t.scale??1,r=new Map(e.nodes.map(e=>[e.id,e])),i=new Map(e.nodes.map(e=>[e.id,N(e)])),a=new Set(e.nodes.filter(e=>e.kind===`agent`&&(e.irreversible??[]).length>0).map(e=>e.id)),{centers:o,vertical:s}=te(e),c=e.edges.filter(e=>r.has(e.from)&&r.has(e.to)),l=new Map;e.loops.forEach((e,t)=>{for(let n of e.back)l.has(n)||l.set(n,t)});let u=ee(),d=[],f=e=>s?e.y:e.x,p=e=>s?e.x:e.y,m=(e,t)=>s?{x:t,y:e}:{x:e,y:t},h=e=>{let t=F(i.get(e),a.has(e));return p(o[e])+(s?t.x:t.bottom)},g=new Map,_=t=>Math.min(...e.loops.filter(e=>e.back.includes(t)).map(e=>e.members.length)),v=e=>Math.abs(f(o[e.from])-f(o[e.to]));c.filter(e=>l.has(e.id)).map((e,t)=>({e,i:t})).sort((e,t)=>_(e.e.id)-_(t.e.id)||v(e.e)-v(t.e)||e.i-t.i).forEach(({e},t)=>g.set(e.id,t));let y=(e,t)=>{let n=e[t],r=c.filter(e=>l.has(e.id)&&e.from!==e.to&&e[t]===n).sort((e,t)=>g.get(e.id)-g.get(t.id));return(r.findIndex(t=>t.id===e.id)-(r.length-1)/2)*6},b=e=>{let t=Math.min(f(o[e.from]),f(o[e.to])),n=Math.max(f(o[e.from]),f(o[e.to])),i=-1/0;for(let e of r.keys())f(o[e])>=t-1&&f(o[e])<=n+1&&(i=Math.max(i,h(e)));return i+14+g.get(e.id)*8},x=e.loops.map(e=>new Set(e.members.filter(e=>r.has(e)))),S=(e,t)=>e!==t&&x[t].size>0&&x[t].size<x[e].size&&[...x[t]].every(t=>x[e].has(t)),C=e.loops.map((t,n)=>({loop:t,i:n,inside:e.loops.filter((e,t)=>S(n,t)).length})).filter(({i:e})=>x[e].size>0).sort((e,t)=>t.inside-e.inside||e.i-t.i);for(let{loop:e,i:t,inside:n}of C){let r=8+n*6,l=ee();for(let e of x[t]){let t=o[e],n=F(i.get(e),a.has(e));R(l,t.x-n.x,t.y-n.top),R(l,t.x+n.x,t.y+n.bottom)}for(let t of c){if(!e.back.includes(t.id)||!g.has(t.id))continue;let n=b(t);s?l.maxX=Math.max(l.maxX,n):l.maxY=Math.max(l.maxY,n)}let f=l.minX-r,p=l.minY-r,m=l.maxX-l.minX+2*r,h=l.maxY-l.minY+2*r;R(u,f,p),R(u,f+m,p+h),d.push(`<rect x="${I(f)}" y="${I(p)}" width="${I(m)}" height="${I(h)}" rx="10" stroke-width="1.3" stroke-dasharray="4 3" style="stroke:${M.loops[t%4]}"/>`)}let w=new Map;for(let e of c){if(l.has(e.id))continue;let t=[e.from,e.to].sort().join(`\0`);w.set(t,[...w.get(t)??[],e.id])}for(let e of c){let t=e.when??`always`,n=e.approval?M.gate:t===`fail`?M.warning:typeof t==`object`?M.muted:M.edge,r=t===`fail`?` stroke-dasharray="5 3"`:typeof t==`object`?` stroke-dasharray="1.5 3.5"`:``,c=o[e.from],h=o[e.to],g,_,v,x={x:0,y:0};if(l.has(e.id)&&e.from!==e.to){let t=b(e),n=F(i.get(e.from),a.has(e.from)),r=F(i.get(e.to),a.has(e.to)),o=f(c)+y(e,`from`),l=f(h)+y(e,`to`),d=m(o,p(c)+(s?n.x:n.bottom)+1),x=m(l,p(h)+(s?r.x:r.bottom)+3),S=m(o,t),C=m(l,t);g=`M${L(d)} C${L(S)} ${L(C)} ${L(x)}`,R(u,S.x,S.y,1),R(u,C.x,C.y,1),_=x,v=s?{x:-1,y:0}:{x:0,y:-1}}else if(e.from===e.to){let t=F(i.get(e.from),a.has(e.from)),n=p(c)+(s?t.x:t.bottom),r=m(f(c)+5,n+1),o=m(f(c)-5,n+3),l=m(f(c)+18,n+20),d=m(f(c)-18,n+20);g=`M${L(r)} C${L(l)} ${L(d)} ${L(o)}`,R(u,l.x,l.y,1),R(u,d.x,d.y,1),_=o,v=s?{x:-1,y:0}:{x:0,y:-1}}else{let t=h.x-c.x,n=h.y-c.y,r=Math.hypot(t,n)||1,a=t/r,o=n/r,s=w.get([e.from,e.to].sort().join(`\0`))??[e.id];if(s.length>1){let t=s.indexOf(e.id)-(s.length-1)/2;x={x:-o*t*5,y:a*t*5}}let l={x:c.x+a*(P(i.get(e.from),t,n)+1)+x.x,y:c.y+o*(P(i.get(e.from),t,n)+1)+x.y},u={x:h.x-a*(P(i.get(e.to),-t,-n)+3)+x.x,y:h.y-o*(P(i.get(e.to),-t,-n)+3)+x.y};g=`M${L(l)} L${L(u)}`,_=u,v={x:a,y:o}}let S=`<path d="${g}" stroke-width="1.6"${r} style="stroke:${n}"/>`;if(e.approval){let e=-v.y*1.7,t=v.x*1.7;d.push(`<g transform="translate(${I(e)} ${I(t)})">${S}</g>`),d.push(`<g transform="translate(${I(-e)} ${I(-t)})">${S}</g>`)}else d.push(S);let C=-v.y,T=v.x,E=[_,{x:_.x-v.x*7+C*7*.5,y:_.y-v.y*7+T*7*.5},{x:_.x-v.x*7-C*7*.5,y:_.y-v.y*7-T*7*.5}];d.push(`<path d="M${E.map(L).join(` L`)} Z" style="fill:${n}"/>`)}for(let t of e.nodes){let e=o[t.id],n=i.get(t.id),r=F(n,a.has(t.id));switch(R(u,e.x-r.x,e.y-r.top),R(u,e.x+r.x,e.y+r.bottom),n){case`square`:case`rounded`:d.push(`<rect x="${I(e.x-11)}" y="${I(e.y-11)}" width="22" height="22" rx="${n===`square`?2:7}" stroke-width="1.8" style="fill:${M.agentFill};stroke:${M.agent}"/>`);break;case`diamond`:d.push(`<path d="M${L({x:e.x,y:e.y-14})} L${L({x:e.x+14,y:e.y})} L${L({x:e.x,y:e.y+14})} L${L({x:e.x-14,y:e.y})} Z" stroke-width="1.8" style="fill:${M.agentFill};stroke:${M.agent}"/>`);break;case`hexagon`:d.push(`<path d="M${L({x:e.x-7,y:e.y-12})} L${L({x:e.x+7,y:e.y-12})} L${L({x:e.x+14,y:e.y})} L${L({x:e.x+7,y:e.y+12})} L${L({x:e.x-7,y:e.y+12})} L${L({x:e.x-14,y:e.y})} Z" stroke-width="1.8" style="fill:${M.surface};stroke:${M.check}"/>`);break;case`octagon`:{let t=[];for(let n=0;n<8;n++){let r=(22.5+n*45)*Math.PI/180;t.push({x:e.x+13*Math.cos(r),y:e.y+13*Math.sin(r)})}d.push(`<path d="M${t.map(L).join(` L`)} Z" stroke-width="2.4" style="fill:${M.surface};stroke:${M.gate}"/>`);break}case`circle`:d.push(`<circle cx="${I(e.x)}" cy="${I(e.y)}" r="11" stroke-width="1.8" style="fill:${M.surface};stroke:${M.merge}"/>`);break;case`dot`:d.push(`<circle cx="${I(e.x)}" cy="${I(e.y)}" r="6" style="fill:${t.kind===`stop`&&t.outcome===`halt`?M.warning:M.ink}"/>`)}a.has(t.id)&&d.push(`<path d="M${L({x:e.x-13,y:e.y+17})} L${L({x:e.x+13,y:e.y+17})}" stroke-width="3" style="stroke:${M.error}"/>`)}d.length===0&&R(u,0,0,12);let T=u.minX-4,E=u.minY-4,D=u.maxX-u.minX+8,O=u.maxY-u.minY+8,k=j(e.name||e.id);return[`<svg xmlns="http://www.w3.org/2000/svg" viewBox="${I(T)} ${I(E)} ${I(D)} ${I(O)}" width="${I(D*n)}" height="${I(O*n)}" role="img" fill="none" stroke-linecap="round" stroke-linejoin="round" class="grooph-glyph">`,`<title>${k}</title>`,...d,`</svg>`].join(`
2
+ `)}const re=e=>{let t=new Map;for(let n of e??[])t.has(n.id)||t.set(n.id,n);return t};function ie(e){let t=e.nodes??[],n=e.edges??[],r=[],i=(e,t)=>{(t??[]).forEach((t,n)=>r.push({kind:e,id:t.id,index:n}))};i(`graph`,[e]),i(`node`,t),i(`edge`,n),i(`loop`,e.loops),i(`group`,e.groups),i(`policy`,e.policies),i(`note`,e.notes);let a=new Map;t.forEach((e,t)=>{a.has(e.id)||a.set(e.id,t)});let o=new Map,s=new Map;for(let e of n)(o.get(e.from)??o.set(e.from,[]).get(e.from)).push(e),(s.get(e.to)??s.set(e.to,[]).get(e.to)).push(e);return{doc:e,nodes:re(t),edges:re(n),loops:re(e.loops),groups:re(e.groups),policies:re(e.policies),notes:re(e.notes),owners:r,nodeOrder:a,outgoing:o,incoming:s}}const ae={nodes:500,edges:2e3,loops:200,groups:200,loopMembers:2e3,groupMembers:2e3,loopStops:2e3},oe={sessions:200,handoffs:1e3,lanes:100,people:100},se=e=>e.toLocaleString(`en`);function ce(e,t){if(typeof e!=`object`||!e||Array.isArray(e))return;let n=e,r=(e,t)=>Array.isArray(n[e])?n[e].reduce((e,n)=>e+(typeof n==`object`&&n?le(n[t]):0),0):0,i=t===`graph`?[[`/nodes`,`nodes`,le(n.nodes),ae.nodes],[`/edges`,`edges`,le(n.edges),ae.edges],[`/loops`,`loops`,le(n.loops),ae.loops],[`/groups`,`groups`,le(n.groups),ae.groups],[`/loops`,`members of loops in all`,r(`loops`,`members`),ae.loopMembers],[`/groups`,`members of groups in all`,r(`groups`,`members`),ae.groupMembers],[`/loops`,`stops of loops in all`,r(`loops`,`stops`),ae.loopStops]]:[[`/sessions`,`sessions`,le(n.sessions),oe.sessions],[`/handoffs`,`handoffs`,le(n.handoffs),oe.handoffs],[`/lanes`,`lanes`,le(n.lanes),oe.lanes],[`/people`,`people`,le(n.people),oe.people]];for(let[e,n,r,a]of i)if(!(r<=a))return{path:e,message:`${se(r)} ${n}, more than the ${se(a)} grooph draws in ${t===`graph`?`a graph`:`a map`}`}}const le=e=>Array.isArray(e)?e.length:0,ue=(e,t,n=[])=>({code:e,severity:`error`,message:t,at:n}),de=e=>typeof e==`object`&&!!e&&!Array.isArray(e),z=e=>e===null?`null`:Array.isArray(e)?`array`:typeof e;function B(e,t){let n={describe:e,check:t.check,json:t.json,canon:t.canon??(e=>e),unknownKeys:t.unknownKeys??(()=>{}),accepts(e){let t=[];return n.check(e,``,t),t.length===0}};return n}function V(e){return{...e,__optional:!0}}function H(e={}){let t=e.patternName??`string`;return B(t,{check(n,r,i){if(typeof n!=`string`){i.push({path:r,message:`expected ${t}, got ${z(n)}`});return}if(e.minLength!==void 0&&n.length<e.minLength){i.push({path:r,message:`expected ${t} of at least ${e.minLength} character(s)`});return}e.pattern&&!e.pattern.test(n)&&i.push({path:r,message:`expected ${t} matching ${e.pattern.source}, got ${JSON.stringify(n)}`})},json(){let t={type:`string`};return e.pattern&&(t.pattern=e.pattern.source),e.minLength!==void 0&&(t.minLength=e.minLength),t}})}const fe=/^[a-z][a-z0-9-]*$/;function U(){return H({pattern:fe,patternName:`kebab-case id`})}function W(e={}){let t=e.integer?`integer`:`number`;return B(t,{check(n,r,i){if(typeof n!=`number`||Number.isNaN(n)||!Number.isFinite(n)){i.push({path:r,message:`expected ${t}, got ${z(n)}`});return}if(e.integer&&!Number.isInteger(n)){i.push({path:r,message:`expected ${t}, got ${n}`});return}e.minimum!==void 0&&n<e.minimum&&i.push({path:r,message:`expected ${t} >= ${e.minimum}, got ${n}`})},json(){let t={type:e.integer?`integer`:`number`};return e.minimum!==void 0&&(t.minimum=e.minimum),t}})}function pe(){return B(`boolean`,{check(e,t,n){typeof e!=`boolean`&&n.push({path:t,message:`expected boolean, got ${z(e)}`})},json:()=>({type:`boolean`})})}function me(){return B(`null`,{check(e,t,n){e!==null&&n.push({path:t,message:`expected null, got ${z(e)}`})},json:()=>({type:`null`})})}function he(e,t){return{...e,json:()=>({$ref:t})}}function ge(e){return B(JSON.stringify(e),{check(t,n,r){t!==e&&r.push({path:n,message:`expected ${JSON.stringify(e)}, got ${JSON.stringify(t)??z(t)}`})},json:()=>({const:e})})}function G(...e){let t=`one of ${e.join(` | `)}`;return B(t,{check(n,r,i){(typeof n!=`string`||!e.includes(n))&&i.push({path:r,message:`expected ${t}, got ${JSON.stringify(n)??z(n)}`})},json:()=>({enum:[...e]})})}const _e=/^[^\u0000-\u001f\u007f\u0085\u2028\u2029]+$/,ve=/^[A-Za-z0-9][A-Za-z0-9._:/[\]-]*$/;function ye(e,t,n={}){return B(t,{check(e,r,i){if(typeof e!=`string`||e.length===0){i.push({path:r,message:`expected ${t} (non-empty string), got ${z(e)}`});return}n.pattern&&!n.pattern.test(e)&&i.push({path:r,message:`expected ${t} matching ${n.pattern.source}, got ${JSON.stringify(e)}`})},json:()=>({type:`string`,minLength:1,...n.pattern?{pattern:n.pattern.source}:{},examples:[...e]})})}function K(e,t={}){let n=`array of ${e.describe}`;return B(n,{check(r,i,a){if(!Array.isArray(r)){a.push({path:i,message:`expected ${n}, got ${z(r)}`});return}t.minItems!==void 0&&r.length<t.minItems&&a.push({path:i,message:`expected at least ${t.minItems} item(s), got ${r.length}`}),t.maxItems!==void 0&&r.length>t.maxItems&&a.push({path:i,message:`expected at most ${t.maxItems} item(s), got ${r.length}`}),r.forEach((t,n)=>e.check(t,`${i}/${n}`,a))},json(n){let r={type:`array`,items:e.json(n)};return t.minItems!==void 0&&(r.minItems=t.minItems),t.maxItems!==void 0&&(r.maxItems=t.maxItems),r},canon(t){return Array.isArray(t)?t.map(t=>e.canon(t)):t},unknownKeys(t,n,r){Array.isArray(t)&&t.forEach((t,i)=>e.unknownKeys(t,`${n}/${i}`,r))}})}function be(e=`any JSON value`){let t=B(e,{check:()=>{},json:()=>({}),canon(e){if(Array.isArray(e))return e.map(e=>t.canon(e));if(de(e)){let n={};for(let r of Object.keys(e).sort())Se(n,r,t.canon(e[r]));return n}return e}});return t}function xe(e,t={}){let n=`object of ${e.describe}`;return B(n,{check(r,i,a){if(!de(r)){a.push({path:i,message:`expected ${n}, got ${z(r)}`});return}for(let[n,o]of Object.entries(r))t.keyPattern&&!t.keyPattern.test(n)&&a.push({path:`${i}/${Ce(n)}`,message:`expected ${t.keyName??`key`} matching ${t.keyPattern.source}, got ${JSON.stringify(n)}`}),e.check(o,`${i}/${Ce(n)}`,a)},json(n){let r={type:`object`,additionalProperties:e.json(n)};return t.keyPattern&&(r.propertyNames={pattern:t.keyPattern.source}),r},canon(t){if(!de(t))return t;let n={};for(let r of Object.keys(t).sort())Se(n,r,e.canon(t[r]));return n},unknownKeys(t,n,r){if(de(t))for(let[i,a]of Object.entries(t))e.unknownKeys(a,`${n}/${Ce(i)}`,r)}})}function Se(e,t,n){t===`__proto__`?Object.defineProperty(e,t,{value:n,enumerable:!0,writable:!0,configurable:!0}):e[t]=n}function Ce(e){return e.replace(/~/g,`~0`).replace(/\//g,`~1`)}const we=be();function q(e,t={}){let n=Object.keys(e),r=n.filter(t=>!(`__optional`in e[t])),i=t.describe??t.name??`object`;return B(i,{check(t,a,o){if(!de(t)){o.push({path:a,message:`expected ${i}, got ${z(t)}`});return}for(let e of r)(!(e in t)||t[e]===void 0)&&o.push({path:`${a}/${e}`,message:`missing required property "${e}"`});for(let r of n){let n=t[r];n!==void 0&&e[r].check(n,`${a}/${r}`,o)}},json(i){let a={};for(let t of n)a[t]=e[t].json(i);let o={type:`object`,properties:a,required:r};return r.length===0&&delete o.required,t.name?(i.defs[t.name]=o,{$ref:`#/$defs/${t.name}`}):o},canon(t){if(!de(t))return t;let r={};for(let i of n)t[i]!==void 0&&(r[i]=e[i].canon(t[i]));for(let e of Object.keys(t).sort())n.includes(e)||t[e]===void 0||Se(r,e,we.canon(t[e]));return r},unknownKeys(t,r,i){if(de(t))for(let a of Object.keys(t)){if(t[a]===void 0)continue;let o=`${r}/${Ce(a)}`;n.includes(a)?e[a].unknownKeys(t[a],o,i):i.push({path:o,key:a,known:n})}}})}function Te(e,t,n={}){let r=Object.keys(t),i=`${n.label??`object`} with ${e} one of ${r.join(` | `)}`;return B(i,{check(n,a,o){if(!de(n)){o.push({path:a,message:`expected ${i}, got ${z(n)}`});return}let s=n[e];if(typeof s!=`string`||!Object.hasOwn(t,s)){o.push({path:`${a}/${e}`,message:`expected ${e} to be one of ${r.join(` | `)}, got ${JSON.stringify(s)??`nothing`}`});return}t[s].check(n,a,o)},json(e){let i={oneOf:r.map(n=>t[n].json(e))};return n.name?(e.defs[n.name]=i,{$ref:`#/$defs/${n.name}`}):i},canon(n){if(!de(n))return n;let r=n[e];return typeof r==`string`&&Object.hasOwn(t,r)?t[r].canon(n):we.canon(n)},unknownKeys(n,r,i){if(!de(n))return;let a=n[e];typeof a==`string`&&Object.hasOwn(t,a)&&t[a].unknownKeys(n,r,i)}})}function Ee(e,t,n,r={}){let i=r=>e(r)?t:n;return B(r.describe??`${t.describe} | ${n.describe}`,{check:(e,t,n)=>i(e).check(e,t,n),json:e=>({anyOf:[t.json(e),n.json(e)]}),canon:e=>i(e).canon(e),unknownKeys:(e,t,n)=>i(e).unknownKeys(e,t,n)})}function De(e,t={}){let n=t.describe??e.map(e=>e.describe).join(` | `);return B(n,{check(t,r,i){e.some(e=>e.accepts(t))||i.push({path:r,message:`expected ${n}, got ${JSON.stringify(t)??z(t)}`})},json(t){return{anyOf:e.map(e=>e.json(t))}},canon(t){let n=e.find(e=>e.accepts(t));return n?n.canon(t):we.canon(t)},unknownKeys(t,n,r){e.find(e=>e.accepts(t))?.unknownKeys(t,n,r)}})}const Oe=(e,t)=>H({pattern:e,patternName:t}),J=()=>U(),ke=ye([`claude-code`,`codex`],`harness id`),Ae=ye([`read-files`,`edit-files`,`write-outputs`,`run-commands`,`run-tests`,`web`,`spawn-agents`],`capability`,{pattern:_e}),je=H({pattern:ve,patternName:`model name`}),Me=H({pattern:ve,patternName:`skill name`}),Ne=G(`frontier`,`strong`,`fast`),Pe=G(`low`,`medium`,`high`,`max`),Fe=G(`lead`,`planner`,`builder`,`critic`,`tester`,`researcher`,`red-team`,`judge`,`synthesizer`),Ie=e=>({id:U(),kind:ge(e),name:H(),description:V(H()),coupled:V(pe())}),Le=Te(`kind`,{agent:q({...Ie(`agent`),by:V(G(`agent`,`person`)),role:De([Fe,q({custom:H()})],{describe:`role name or { custom }`}),model:V(q({tier:Ne,pin:V(xe(je,{keyName:`harness id`}))})),effort:V(Pe),brief:H(),inputs:V(K(H())),outputs:K(H(),{minItems:1}),allow:V(K(Ae)),deny:V(K(Ae)),owns:V(K(H())),irreversible:V(K(H())),skills:V(K(Me))},{name:`AgentNode`}),"human-gate":q({...Ie(`human-gate`),prompt:H(),options:V(K(H()))},{name:`HumanGateNode`}),check:q({...Ie(`check`),check:q({kind:G(`command`,`tests`,`diff`,`metric`,`evidence`),run:V(H()),pass:H(),threshold:V(W())})},{name:`CheckNode`}),merge:q({...Ie(`merge`),merges:K(H()),strategy:V(H())},{name:`MergeNode`}),stop:q({...Ie(`stop`),outcome:V(G(`success`,`halt`))},{name:`StopNode`})},{name:`Node`,label:`node`}),Re=q({id:U(),from:J(),to:J(),when:V(De([G(`always`,`pass`,`fail`),q({verdict:H()})],{describe:`always | pass | fail | { verdict }`})),isolation:V(G(`fresh`,`shared`)),concurrency:V(q({max:W({integer:!0,minimum:1})})),retry:V(q({max:W({integer:!0,minimum:0})})),evidence:V(K(H())),approval:V(pe()),label:V(H())},{name:`Edge`}),ze=q({kind:G(`file`,`url`,`metric`,`checklist`,`answer-key`,`artifact`),ref:H(),note:V(H())},{name:`Evidence`}),Be=q({name:H(),inspects:K(ze),acceptance:H(),aspiration:V(H()),answerKeyFrom:V(J())},{name:`Bar`}),Ve=G(`dispatches`,`minutes`,`usd`,`turns`,`tokens`),He=Te(`kind`,{human:q({kind:ge(`human`),every:V(W({integer:!0,minimum:1})),then:V(J())}),budget:q({kind:ge(`budget`),measure:Ve,limit:W({minimum:0}),then:V(J())}),"bar-passed":q({kind:ge(`bar-passed`),then:V(J())}),"diminishing-returns":q({kind:ge(`diminishing-returns`),rounds:W({integer:!0,minimum:1}),metric:V(H()),threshold:V(W()),then:V(J())}),"evidence-invalid":q({kind:ge(`evidence-invalid`),rounds:W({integer:!0,minimum:1}),then:V(J())}),"max-iterations":q({kind:ge(`max-iterations`),n:W({integer:!0,minimum:1}),then:V(J())})},{name:`Stop`,label:`stop`}),Ue=q({id:U(),name:H(),members:K(J()),back:K(J()),mode:V(G(`grind`,`judgment`)),bar:V(Be),stops:K(He)},{name:`Loop`}),We=q({id:U(),kind:De([G(`critic-isolation`,`no-self-grading`,`owner-per-artifact`,`concurrency-cap`,`no-live-graph-rewrite`,`evidence-required`),q({custom:H()})],{describe:`policy kind or { custom }`}),scope:Oe(/^(graph|loop:[a-z][a-z0-9-]*|node:[a-z][a-z0-9-]*|edge:[a-z][a-z0-9-]*)$/,`scope (graph | loop:<id> | node:<id> | edge:<id>)`),params:V(xe(De([H(),W(),pe()],{describe:`string | number | boolean`})))},{name:`Policy`}),Ge=q({id:U(),name:H(),members:K(J()),coupled:V(pe()),description:V(H({pattern:_e,patternName:`one line of text`})),from:V(Oe(/^[a-z][a-z0-9-]*@[1-9][0-9]*$/,`<template id>@<version>`)),with:V(xe(H(),{keyPattern:/^[^{}\s]+$/,keyName:`slot key`}))},{name:`Group`}),Ke=q({cost:G(`low`,`medium`,`high`),speed:G(`fast`,`medium`,`slow`),rigor:G(`light`,`standard`,`high`)},{name:`Profile`}),qe=q({kind:G(`graph`,`fragment`),title:H(),summary:H(),whenToUse:H(),notFor:V(H()),profile:Ke,slots:V(K(q({key:H(),ask:H(),example:H()},{name:`TemplateSlot`}))),tags:V(K(H())),demo:V(H()),credits:V(K(q({name:H(),url:H(),note:H()},{name:`TemplateCredit`})))},{name:`Template`}),Je=q({id:U(),run:H(),at:Oe(/^(graph|node:[a-z][a-z0-9-]*|edge:[a-z][a-z0-9-]*|loop:[a-z][a-z0-9-]*)$/,`run-note location (graph | node:<id> | edge:<id> | loop:<id>)`),started:V(H()),ended:V(H()),outcome:V(ye([`pass`,`fail`,`halt`,`invalid-evidence`,`started`,`ending`],`outcome`)),verdict:V(H()),round:V(W({integer:!0,minimum:0})),stop:V(H()),evidence:V(K(H())),cost:V(q({measure:Ve,amount:W()})),gaps:V(K(H())),proposal:V(q({summary:H(),patch:V(be())})),amendment:V(q({summary:H(),reason:H(),patch:V(be())})),text:V(H())},{name:`RunNote`}),Ye=q({grooph:ge(0),id:U(),name:H(),version:W({integer:!0,minimum:0}),goal:V(H()),target:V(q({harness:ke})),constraints:V(q({budget:V(H()),time:V(H()),other:V(H())})),adaptation:V(G(`adaptive`,`propose`,`fixed`)),lineage:V(q({pattern:V(H()),from:V(H())})),template:V(qe),description:V(H()),nodes:K(Le),edges:K(Re),loops:K(Ue),policies:V(K(We)),groups:V(K(Ge)),notes:V(K(Je)),layout:V(xe(q({x:W(),y:W(),w:V(W()),h:V(W())}),{keyPattern:fe,keyName:`node id`}))},{describe:`graph document`}),Xe=`https://grooph.dev/schema/grooph-0.schema.json`;function Ze(e){let t=ce(e,`graph`);if(t)return{issues:[ue(`E_SCHEMA`,`${t.path}: ${t.message}`,[])]};let n=[];return Ye.check(e,``,n),n.length>0?{issues:n.map(t=>ue(`E_SCHEMA`,`${t.path===``?`/`:t.path}: ${t.message}`,Qe(e,t.path)))}:{doc:e,issues:[]}}function Qe(e,t){let n=t.split(`/`).filter(e=>e!==``),r=e,i;for(let e of n){if(typeof r!=`object`||!r)break;let t=e.replace(/~1/g,`/`).replace(/~0/g,`~`);if(r=r[t],typeof r==`object`&&r&&!Array.isArray(r)){let e=r.id;typeof e==`string`&&(i=e)}}return i===void 0?[]:[i]}const $e=()=>W({integer:!0,minimum:0}),et=q({agents:$e(),people:V($e()),checks:$e(),gates:$e(),loops:$e(),tiers:q({frontier:$e(),strong:$e(),fast:$e(),unset:$e()}),worstCaseRounds:De([$e(),me()],{describe:`integer or null`}),budgets:K(H())},{name:`Shape`}),tt=Ee(e=>typeof e==`object`&&!!e&&!Array.isArray(e)&&`file`in e&&!(`grooph`in e),q({file:H({minLength:1})},{name:`CandidateFile`}),he(Ye,Xe),{describe:`graph document or { file }`}),nt=q({id:U(),label:H({minLength:1}),graph:tt,basedOn:V(H()),rationale:H(),pros:K(H()),cons:K(H()),profile:Ke,shape:V(et)},{name:`Candidate`});q({groophProposals:ge(0),id:U(),title:H(),brief:H(),candidates:K(nt,{minItems:1,maxItems:4}),recommendation:V(q({candidate:U(),why:H()}))},{describe:`proposal set`});const rt={agent:`Agent`,"human-gate":`Human gate`,check:`Check`,merge:`Merge`,stop:`Stop`},it=e=>{let t=(e.stops??[]).flatMap(e=>e.kind===`max-iterations`?[e.n]:[]);return t.length===0?void 0:Math.min(...t)};function at(e){let t=e.nodes??[],n=e.loops??[],r={frontier:0,strong:0,fast:0,unset:0};for(let e of t)e.kind===`agent`&&!x(e)&&(r[e.model?.tier??`unset`]+=1);let i=n.map(it),a=null;if(i.every(e=>e!==void 0)){let e=n.map(e=>new Set(e.members??[])),t=(t,n)=>t!==n&&e[n].size<e[t].size&&[...e[n]].every(n=>e[t].has(n));a=i.reduce((e,n,r)=>e+i.reduce((e,n,i)=>t(i,r)?e*n:e,n),0)}let o=n.filter(e=>(e.stops??[]).some(e=>e.kind===`budget`)),s=o.flatMap(e=>(e.stops??[]).flatMap(t=>t.kind===`budget`?[`${o.length>1?`${e.name||e.id}: `:``}${ot(t.measure,t.limit)}`]:[]));return{agents:t.filter(e=>e.kind===`agent`&&!x(e)).length,...t.some(x)?{people:t.filter(x).length}:{},checks:t.filter(e=>e.kind===`check`).length,gates:t.filter(e=>e.kind===`human-gate`).length+(e.edges??[]).filter(e=>e.approval===!0).length,loops:n.length,tiers:r,worstCaseRounds:a,budgets:s}}const ot=(e,t)=>e===`usd`?`$${t}`:`${t} ${e}`,st=(e,t,n=`${t}s`)=>`${e} ${e===1?t:n}`;function ct(e){let t=e.people??0,n=t===0?[st(e.agents,`agent`)]:[t===1?`1 person's step`:`${t} people's steps`,...e.agents>0?[e.agents===1?`1 agent's step`:`${e.agents} agents' steps`]:[]];return e.checks>0&&n.push(st(e.checks,`check`)),e.gates>0&&n.push(st(e.gates,`gate`)),e.loops===0?n.push(`no loop`):(n.push(st(e.loops,`loop`)),n.push(e.worstCaseRounds===null?`no round cap`:`up to ${st(e.worstCaseRounds,`round`)}`)),n.push(...e.budgets),n.join(` · `)}const lt={bg:`#f1f4f3`,surface:`#fdfefe`,"surface-2":`#e8edeb`,ink:`#1a201e`,"ink-2":`#454c49`,"ink-3":`#5f6764`,line:`#dce1df`,"line-strong":`#b9c1be`,accent:`#1f5f4a`,"accent-soft":`#dcefe6`,gate:`#b25e09`,"gate-soft":`#fcf0d9`,check:`#2b5f9e`,merge:`#6b4fa0`,stop:`#5b5f66`,ok:`#1f7a4d`,"ok-soft":`#dff3e6`,warning:`#955500`,error:`#b42318`,"error-soft":`#fceae7`,"loop-0":`#7a4cc2`,"loop-1":`#0f7c8c`,"loop-2":`#c2410c`,"loop-3":`#b5306e`},ut={bg:`#111514`,surface:`#1b201e`,"surface-2":`#242a27`,ink:`#ebefed`,"ink-2":`#c0c7c4`,"ink-3":`#99a19e`,line:`#2d3331`,"line-strong":`#4a524f`,accent:`#5dbb94`,"accent-soft":`#1e3a30`,gate:`#eb9a45`,"gate-soft":`#362a15`,check:`#6fa3e0`,merge:`#a88be0`,stop:`#9ba0a8`,ok:`#6fcf9d`,"ok-soft":`#1c3a2a`,warning:`#f0b35a`,error:`#ff8f80`,"error-soft":`#3a1e1b`,"loop-0":`#a883f0`,"loop-1":`#3cc0d0`,"loop-2":`#f0874f`,"loop-3":`#ee6fa6`};function dt(e){return e===`light`?e=>lt[e]:e===`dark`?e=>ut[e]:e=>`var(--gp-${e})`}function ft(e){if(e!==`auto`)return``;let t=e=>Object.keys(lt).map(t=>`--gp-${t}:${e[t]}`).join(`;`);return`<style>:where(.grooph-picture){${t(lt)}}@media (prefers-color-scheme:dark){:where(.grooph-picture:not([data-theme="light"])){${t(ut)}}}:where(.grooph-picture[data-theme="dark"]){${t(ut)}}</style>`}Object.keys(lt);const Y=e=>{let t=Math.round(e*10)/10;return(Object.is(t,-0)?0:t).toString()},pt=[352,394,459,818,636,1076,727,269,454,454,636,818,364,454,364,454,636,636,636,636,636,636,636,636,636,636,454,454,818,818,818,556,1015,684,686,722,771,667,611,778,751,421,500,693,557,843,748,787,667,787,722,684,616,732,684,989,685,667,685,454,454,454,818,636,636,601,623,521,623,596,352,623,633,274,344,592,274,973,633,607,623,623,427,521,394,633,592,818,592,592,525,635,454,635,818],mt=[342,402,587,867,711,1272,862,332,543,543,711,867,361,480,361,689,711,711,711,711,711,711,711,711,711,711,402,402,867,867,867,617,975,776,762,724,830,683,650,811,837,546,556,771,637,948,847,850,733,850,782,710,682,812,764,1128,764,737,692,543,689,543,867,711,711,668,699,588,699,664,422,699,712,342,403,671,342,1058,712,687,699,699,497,593,456,712,650,980,669,651,597,711,543,711,867],ht={"·":[364,361],"→":[1e3,1e3],"×":[818,867],"…":[1e3,1049],"—":[1e3,1e3],"–":[636,711],"’":[269,332],"‘":[269,332],"“":[459,587],"”":[459,587]};function X(e,t,n=`regular`){if(n===`mono`)return e.length*t*.62;let r=n===`bold`?mt:pt,i=+(n===`bold`),a=0;for(let t of e){let e=t.codePointAt(0);e>=32&&e<=126?a+=r[e-32]:ht[t]?a+=ht[t][i]:a+=e>11904?1e3:n===`bold`?720:650}return a/1e3*t*1.03}function gt(e,t,n,r=`regular`){if(X(e,n,r)<=t)return e;let i=t-X(`…`,n,r),a=0,o=0;for(let t of e){let e=X(t,n,r);if(o>0&&a+e>i)break;a+=e,o+=t.length}return`${e.slice(0,o).trimEnd()}…`}function Z(e,t,n,r,i=`regular`){let a=typeof t==`number`?()=>t:t,o=e.trim().split(/\s+/).filter(e=>e!==``),s=[],c=0;for(;c<o.length&&s.length<r;){let e=o[c++];for(;c<o.length&&X(`${e} ${o[c]}`,n,i)<=a(s.length);)e=`${e} ${o[c++]}`;s.push(e)}return s.length===0?[``]:(c<o.length&&(s[s.length-1]=`${s[s.length-1]} ${o.slice(c).join(` `)}`),s.map((e,t)=>gt(e,a(t),n,i)))}function Q(e,t,n,r){let i=r.weight===`mono`?` font-family="ui-monospace, 'SF Mono', Menlo, Consolas, 'Roboto Mono', monospace"`:``,a=r.weight===`bold`?` font-weight="700"`:``,o=r.anchor&&r.anchor!==`start`?` text-anchor="${r.anchor}"`:``;return`<text x="${Y(e)}" y="${Y(t)}" font-size="${Y(r.size)}"${i}${a}${o} style="fill:${r.fill}">${j(n)}</text>`}function _t(e,t,n,r,i){let a=[`fill:${i.fill??`none`}`,...i.stroke?[`stroke:${i.stroke}`]:[]].join(`;`);return`<rect${i.mark?` data-${i.mark}=""`:``} x="${Y(e)}" y="${Y(t)}" width="${Y(n)}" height="${Y(r)}"${i.rx?` rx="${Y(i.rx)}"`:``}${i.stroke?` stroke-width="${Y(i.width??1)}"`:``}${i.dash?` stroke-dasharray="${i.dash}"`:``} style="${a}"/>`}function vt(e,t,n,r){let i=r.size*.55,a=X(n,r.size,r.weight??`bold`)+i*2,o=r.size*1.55;return{svg:_t(e,t-r.size*1.08,a,o,{fill:r.fill,rx:o/2,...r.stroke?{stroke:r.stroke}:{}})+Q(e+a/2,t,n,{size:r.size,fill:r.ink,weight:r.weight??`bold`,anchor:`middle`}),width:a}}function yt(e,t,n,r,i,a,o){return`<svg xmlns="http://www.w3.org/2000/svg" class="grooph-picture" data-picture="${o}" viewBox="0 0 ${Y(e)} ${Y(t)}" width="${Y(e)}" height="${Y(t)}" role="img" font-family="system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif"><title>${j(n)}</title>`+ft(r)+_t(0,0,e,t,{fill:i(`bg`)})+a+`</svg>
3
+ `}function bt(e,t=0){let n=e.map((e,t)=>({i:t,lo:Math.min(e.from,e.to),hi:Math.max(e.from,e.to)})).sort((e,t)=>e.hi-e.lo-(t.hi-t.lo)||e.lo-t.lo||e.i-t.i),r=[],i=Array(e.length).fill(0);for(let e of n){let n=0;for(;r[n]?.some(n=>e.lo<=n.hi+t&&n.lo<=e.hi+t);)n++;(r[n]??=[]).push({lo:e.lo,hi:e.hi}),i[e.i]=n}return{tracks:i,count:r.length}}const xt={agent:{label:`Agent`,color:`accent`},"human-gate":{label:`Human gate`,color:`gate`},check:{label:`Check`,color:`check`},merge:{label:`Merge`,color:`merge`},stop:{label:`Stop`,color:`stop`}},St={label:`Person`,color:`gate`},Ct=e=>x(e)?St:xt[e.kind];function wt(e){switch(e.kind){case`agent`:{let t=typeof e.role==`string`?e.role:e.role.custom;return x(e)?t:[t,e.model?.tier,e.effort].filter(Boolean).join(` · `)}case`human-gate`:return e.options&&e.options.length>0?e.options.join(` / `):e.prompt;case`check`:return[e.check.kind,e.check.run].filter(Boolean).join(` · `);case`merge`:return[e.strategy,e.merges.length>0?`merges ${e.merges.join(`, `)}`:void 0].filter(Boolean).join(` · `);case`stop`:return e.outcome??`ends the run`}}function Tt(e){let t=e.when??`always`;return[typeof t==`object`?t.verdict:t===`always`?e.label??``:t,e.approval?`approval`:``].filter(e=>e!==``).join(` · `)}function Et(e,t){if(t!==void 0)return{color:`loop-${t%4}`,dash:`5 3`,width:1.6};if(e.approval)return{color:`gate`,width:2};let n=e.when??`always`;return n===`fail`?{color:`warning`,dash:`5 3`,width:1.5}:typeof n==`object`?{color:`ink-3`,dash:`1.5 3`,width:1.7}:{color:`ink-2`,width:1.5}}function Dt(e,t={},n){let r=A(n?.whole??e),i=t.theme??`auto`,a=t.width??400,o=dt(i),s=ie(e),c=new Map(e.nodes.map(e=>[e.id,e])),l=n?.ranks??d(e),u=l.flat(),f=new Map(u.map((e,t)=>[e,t])),p=new Map;l.forEach((e,t)=>e.forEach(e=>p.set(e,t)));let m=new Map;e.loops.forEach((e,t)=>{for(let n of e.back)m.has(n)||m.set(n,t)});let h=e.edges.filter(e=>c.has(e.from)&&c.has(e.to)),g=e=>m.has(e.id)||e.from===e.to?`right`:f.get(e.to)===f.get(e.from)+1?`next`:`left`,_=e=>{let t=new Map;h.forEach((n,r)=>{g(n)===e&&((t.get(n.from)??t.set(n.from,[]).get(n.from)).push({edge:n.id,end:`from`,other:f.get(n.to),n:r}),(t.get(n.to)??t.set(n.to,[]).get(n.to)).push({edge:n.id,end:`to`,other:f.get(n.from),n:r}))});for(let[e,n]of t){let t=f.get(e),r=e=>e.other<t?0:e.other===t?1:2;n.sort((e,t)=>r(e)-r(t)||(r(e)===0?t.other-e.other:e.other-t.other)||e.n-t.n||(e.end===`from`?-1:1))}return t},v={left:_(`left`),right:_(`right`)},y=(e,t,n,r)=>v[e].get(t).findIndex(e=>e.edge===n&&e.end===r),b=e=>{let t=h.filter(t=>g(t)===e),n=(t,n,r)=>f.get(t)*1e3+y(e,t,n.id,r),{tracks:r,count:i}=bt(t.map(e=>({from:n(e.from,e,`from`),to:n(e.to,e,`to`)})));return{list:t,tracks:r,margin:t.length===0?0:16+(i-1)*13+12}},x=b(`left`),S=b(`right`),C=l.some(e=>e.length>1),w=12+x.margin+(C?6:0),T=a-24-x.margin-S.margin-(C?12:0),E=T-20,j=t=>e.loops.map((e,n)=>e.members.includes(t)?n:-1).filter(e=>e>=0),M=[],N=18;for(let t of Z(e.name||e.id,a-24,17,2,`bold`))N+=17,M.push(Q(12,N,t,{size:17,fill:o(`ink`),weight:`bold`})),N+=4;let P=[e.target?.harness,e.nodes.length>0?ct(at(n?.whole??e)):`no nodes yet`].filter(Boolean).join(` · `);for(let e of Z(P,a-24,11,2))N+=13,M.push(Q(12,N,e,{size:11,fill:o(`ink-3`)}));if(e.goal){N+=5;for(let t of Z(e.goal,a-24,11.5,3))N+=14.5,M.push(Q(12,N,t,{size:11.5,fill:o(`ink-2`)}))}N+=14;let F=new Map;for(let e of u){let t=c.get(e),r=Z(t.name||t.id,E,13.5,2,`bold`),i=n?.faces.get(e),a=i?i.sub.flatMap(e=>Z(e,E,10.5,2)):wt(t)?Z(wt(t),E,10.5,2):[],o=i?i.extra:t.kind===`agent`&&(t.irreversible??[]).length>0?`irreversible: ${t.irreversible.join(`, `)}`:``,s=24+r.length*15.5+a.length*13+(o?14:0)+10-3+(i?.room??0),l=(v.left.get(e)??[]).map(e=>e.edge),u=(v.right.get(e)??[]).map(e=>e.edge);F.set(e,{node:t,name:r,sub:a,extra:o,height:Math.max(s,(Math.max(l.length,u.length)+1)*12+2),y:0,left:l,right:u})}let I=[];l.forEach((e,t)=>{N+=n?.gaps[t]??0;let r=N;e.forEach((t,n)=>{let r=F.get(t);r.y=N+(e.length>1&&n===0?16:0),N=r.y+r.height+(n<e.length-1?8:0)}),e.length>1&&I.push(_t(w-6,r-6+2,T+12,N-r+12-2,{fill:o(`surface-2`),stroke:o(`line`),rx:12})+Q(w+2,r+9,`${e.length} side by side`,{size:9.5,fill:o(`ink-3`),weight:`bold`})),t<l.length-1&&(N+=30)}),M.push(...I);let L=n?.draw(F,w,T,o);L&&M.push(L[0]);let ee=[],R=h.filter(e=>g(e)===`next`);for(let e of R){let t=F.get(e.from),n=F.get(e.to),r=R.filter(t=>t.from===e.from&&t.to===e.to),i=w+T/2+(r.indexOf(e)-(r.length-1)/2)*64,a=t.y+t.height,s=n.y,c=Et(e,void 0),l=o(c.color);M.push(`<g data-edge="${e.id}"><path d="M${Y(i)},${Y(a)} V${Y(s-5.5)}" fill="none" stroke-width="${Y(c.width)}" stroke-linecap="round"${c.dash?` stroke-dasharray="${c.dash}"`:``} style="stroke:${l}"/><path d="M${Y(i)},${Y(s-.5)} l-3.6,-6.5 h7.2 z" style="fill:${l}"/></g>`);let u=Tt(e);if(u){let e=X(u,9.5,`bold`)+10.5;ee.push(vt(i-e/2,(a+s)/2+3.2,u,{size:9.5,fill:o(`bg`),ink:l,stroke:l}).svg)}}let te=(e,t)=>{let n=e===`right`?1:-1,r=e===`right`?w+T:w,i=[],a=(t,n,r)=>{let i=F.get(t),a=v[e].get(t);return i.y+i.height/2+(y(e,t,n,r)-(a.length-1)/2)*12};t.list.forEach((e,s)=>{let c=Et(e,m.get(e.id)),l=o(c.color),u=a(e.from,e.id,`from`),d=a(e.to,e.id,`to`),f=r+n*(16+t.tracks[s]*13),p=Math.min(6,Math.abs(d-u)/2),h=d>=u?1:-1,g=`M${Y(r)},${Y(u)} H${Y(f-n*p)} Q${Y(f)},${Y(u)} ${Y(f)},${Y(u+h*p)} V${Y(d-h*p)} Q${Y(f)},${Y(d)} ${Y(f-n*p)},${Y(d)} H${Y(r+n*5.5)}`;M.push(`<g data-edge="${e.id}"><path d="${g}" fill="none" stroke-width="${Y(c.width)}" stroke-linecap="round"${c.dash?` stroke-dasharray="${c.dash}"`:``} style="stroke:${l}"/><circle cx="${Y(r)}" cy="${Y(u)}" r="2.2" style="fill:${l}"/><path d="M${Y(r+n*.5)},${Y(d)} l${Y(n*6.5)},-3.6 v7.2 z" style="fill:${l}"/></g>`);let _=Tt(e);if(!_)return;let v=X(_,9,`bold`)+9,y=Math.min(u,d)+v/2+2,b=Math.max(u,d)-v/2-2,x=e=>i.every(t=>Math.abs(t.x-f)>14||Math.abs(t.y-e)>(t.w+v)/2+2),S=(u+d)/2;for(let e=1;!x(S)&&e<60;e++){let t=(u+d)/2+(e%2==1?1:-1)*Math.ceil(e/2)*7;t>=y&&t<=b&&x(t)&&(S=t)}i.push({x:f,y:S,w:v}),ee.push(`<g transform="rotate(-90 ${Y(f)} ${Y(S)})">`+_t(f-v/2,S-6.5,v,13,{fill:o(`bg`),stroke:l,rx:6.5})+Q(f,S+3.2,_,{size:9,fill:l,weight:`bold`,anchor:`middle`})+`</g>`)})};te(`left`,x),te(`right`,S);for(let e of u){let t=F.get(e),{node:r}=t,i=n?.faces.get(e)??Ct(r),a=[],s=r.kind===`human-gate`;a.push(_t(w,t.y,T,t.height,{fill:o(`surface`),stroke:o(s?`gate`:`line-strong`),rx:r.kind===`stop`?16:9,width:s?1.8:1,mark:`card`}));let c=t.y+10+8;a.push(`<circle cx="${Y(w+10+3.5)}" cy="${Y(c-3.4)}" r="3.5" style="fill:${o(i.color)}"/>`),a.push(Q(w+10+11,c,i.label,{size:9.5,fill:o(i.color),weight:`bold`})),j(e).forEach((e,t)=>{a.push(`<circle cx="${Y(w+T-10-3.5-t*10)}" cy="${Y(c-3.4)}" r="3.5" style="fill:${o(`loop-${e%4}`)}"/>`)}),c+=4;for(let e of t.name)c+=15.5,a.push(Q(w+10,c,e,{size:13.5,fill:o(`ink`),weight:`bold`}));for(let e of t.sub)c+=13,a.push(Q(w+10,c,e,{size:10.5,fill:o(`ink-2`)}));t.extra&&(c+=14,a.push(Q(w+10,c,gt(t.extra,E,10,`bold`),{size:10,fill:o(`gate`),weight:`bold`}))),M.push(`<g data-${i===Ct(r)?`node`:`group`}="${e}">${a.join(``)}</g>`)}if(L&&M.push(L[1]),M.push(...ee),N+=14,e.loops.length>0){N+=4,M.push(Q(12,N+11,e.loops.length===1?`Loop`:`Loops`,{size:12.5,fill:o(`ink`),weight:`bold`})),N+=20;let t=a-12-28,n=e=>c.get(e)?.name||e;e.loops.forEach((e,i)=>{let a=o(`loop-${i%4}`),c=[];N+=12,c.push(`<circle cx="${Y(17)}" cy="${Y(N-4)}" r="4.5" style="fill:${a}"/>`),c.push(Q(28,N,gt(e.name||e.id,t,12,`bold`),{size:12,fill:o(`ink`),weight:`bold`}));let l=(e,n,r=`ink-2`)=>{for(let i of Z(e,t,11,n))N+=13.5,c.push(Q(28,N,i,{size:11,fill:o(r)}))};l(`${D(s,e)} loop · ${e.members.map(n).join(`, `)}`,2,`ink-3`),e.bar&&l(`Bar: ${e.bar.name}. ${e.bar.acceptance}`,3),e.stops.forEach((e,t)=>l(`${t+1}. ${O(e)}: ${k(e,r).replace(/`/g,``)}`,2)),N+=12,M.push(`<g data-loop="${e.id}">${c.join(``)}</g>`)})}return yt(a,N+12-6,e.name||e.id,i,o,M.join(``),`graph`)}const Ot=[Dt,d,ne,_t,Q,gt],kt=(e,t)=>Math.max(0,Math.round((Date.parse(t)-Date.parse(e))/1e3));function At(e){return e<60?`${e} s`:e<3600?`${Math.floor(e/60)} min${e%60?` ${e%60} s`:``}`:`${Math.floor(e/3600)} h${Math.floor(e%3600/60)?` ${Math.floor(e%3600/60)} min`:``}`}function jt(e,t){let n=e.quiet??0,r=(t,n)=>e.sessions>1?`${t} of ${e.sessions} ${n}`:n,i=t===void 0?`gone quiet`:`last seen ${At(kt(e.quietLastAt??e.lastAt,t))} ago`;return`${e.working>0?r(e.working,`working`):e.waiting>0?r(e.waiting,`waiting`):n>0?i:`ended`}${e.agentsRunning+e.agentsDone===0||n>0&&e.working+e.waiting===0?``:` · ${e.agentsRunning} running, ${e.agentsDone} done`}`}const Mt=q({id:U(),name:H(),machine:H({minLength:1}),place:V(G(`local`,`cloud`)),account:H({minLength:1}),description:V(H())},{name:`Lane`}),Nt=q({id:U(),name:H(),role:V(H()),description:V(H())},{name:`Person`}),Pt=q({id:U(),name:H(),lane:U(),harness:ye([`claude-code`,`codex`],`harness id`),model:V(H()),role:H({minLength:1}),lifetime:V(G(`long-lived`,`per-task`,`scheduled`)),count:V(W({integer:!0,minimum:1})),graph:V(H({minLength:1})),repo:V(H()),description:V(H())},{name:`Session`}),Ft=e=>ge(e),It=Te(`kind`,{branch:q({kind:Ft(`branch`),repo:V(H()),ref:V(H())}),"pull-request":q({kind:Ft(`pull-request`),repo:V(H())}),"session-message":q({kind:Ft(`session-message`)}),"scheduled-message":q({kind:Ft(`scheduled-message`),schedule:V(H())}),"review-page":q({kind:Ft(`review-page`),where:V(H())}),person:q({kind:Ft(`person`),who:V(H())}),notification:q({kind:Ft(`notification`),where:V(H())}),other:q({kind:Ft(`other`),name:V(H())})},{name:`Carrier`,label:`carrier`}),Lt=q({id:U(),from:U(),to:U(),carrier:V(It),what:V(H()),label:V(H())},{name:`Handoff`}),Rt=q({groophMap:ge(0),id:U(),name:H(),version:W({integer:!0,minimum:0}),asOf:V(H({pattern:/^\d{4}-\d{2}-\d{2}$/,patternName:`date as YYYY-MM-DD`})),description:V(H()),lanes:K(Mt),people:V(K(Nt)),sessions:K(Pt),handoffs:K(Lt)},{describe:`operation map`}),zt=(e,t,n=[])=>({code:e,severity:e.startsWith(`E_`)?`error`:`warning`,message:t,at:n});function Bt(e){let t=ce(e,`map`);if(t)return{issues:[zt(`E_SCHEMA`,`${t.path}: ${t.message}`,[])]};let n=[];return Rt.check(e,``,n),n.length>0?{issues:n.map(t=>zt(`E_SCHEMA`,`${t.path===``?`/`:t.path}: ${t.message}`,Qe(e,t.path)))}:{map:e,issues:[]}}const Vt={branch:`branch`,"pull-request":`pull request`,"session-message":`session message`,"scheduled-message":`scheduled message`,"review-page":`review page`,person:`person`,notification:`notification`,other:`other`},Ht=e=>e===void 0||e.trim()===``;function Ut(e,t){if(!e)return``;switch(e.kind){case`branch`:return Ht(e.repo)?``:`branch ${Ht(e.ref)?``:`${e.ref} `}on ${e.repo}`;case`pull-request`:return Ht(e.repo)?``:`pull request on ${e.repo}`;case`session-message`:return`session message`;case`scheduled-message`:return Ht(e.schedule)?`scheduled message`:`scheduled message, ${e.schedule}`;case`review-page`:return Ht(e.where)?``:`review page: ${e.where}`;case`person`:return Ht(e.who)?Ht(t)?``:`carried by ${t}`:`carried by ${e.who}`;case`notification`:return Ht(e.where)?`notification`:`notification, ${e.where}`;case`other`:return Ht(e.name)?``:e.name}}function Wt(e){let t=new Map(e.sessions.map(e=>[e.id,e])),n=new Map((e.people??[]).map(e=>[e.id,e])),r=e=>{let t=new Map;for(let[n,r]of e)t.set(n,(t.get(n)??0)+r);return Object.fromEntries(t)},i=r(e.handoffs.map(e=>[e.carrier?.kind??`none`,1])),a=r(e.sessions.map(e=>[e.harness,e.count??1]));return{lanes:e.lanes.length,sessions:e.sessions.length,sessionsCounted:e.sessions.reduce((e,t)=>e+(t.count??1),0),handoffs:e.handoffs.length,carriers:i,harnesses:a,crossLane:e.handoffs.filter(e=>{let n=t.get(e.from),r=t.get(e.to);return n!==void 0&&r!==void 0&&n.lane!==r.lane}).length,byHand:e.handoffs.flatMap(e=>{if(e.from===e.to&&n.has(e.from))return[];let t=n.get(e.from);return t?[{handoff:e.id,from:e.from,to:e.to,who:t.name||t.id,starts:!0}]:e.carrier?.kind===`person`?[{handoff:e.id,from:e.from,to:e.to,who:e.carrier.who??``}]:[]}),...n.size>0?{people:n.size}:{}}}function Gt(e){let t=(e,t)=>`${e} ${t}${e===1?``:`s`}`,n=e.sessionsCounted===e.sessions?``:` (${e.sessionsCounted} counting families)`,r=e.byHand.length,i=e.people?` · ${e.people} ${e.people===1?`person`:`people`}`:``,a=e.byHand.some(e=>e.starts)?`waiting on a person`:`carried by a person`;return`${t(e.lanes,`lane`)} · ${t(e.sessions,`session`)}${n}${i} · ${t(e.handoffs,`handoff`)}${r>0?`, ${r} ${a}`:``}`}function Kt(e,t){return e.sessions.find(e=>e.id===t)?.name||(e.people??[]).find(e=>e.id===t)?.name||t}const qt=(e,t)=>(e.people??[]).find(e=>e.id===t.from);function Jt(e,t){let n=qt(e,t);return Ut(t.carrier,n?n.name||n.id:void 0)}function Yt(e,t){let n=e.handoffs.find(e=>e.from===t&&e.to===t&&e.carrier?.kind===`scheduled-message`);return n?n.carrier?.kind===`scheduled-message`?n.carrier.schedule??``:``:void 0}const Xt=6.5,Zt={branch:{color:`accent`,width:1.6},"pull-request":{color:`check`,width:1.6},"session-message":{color:`ink-2`,dash:`5 3`,width:1.4},"scheduled-message":{color:`merge`,dash:`1.5 3`,width:1.8},"review-page":{color:`loop-3`,dash:`7 3 1.5 3`,width:1.4},person:{color:`gate`,width:2.4},notification:{color:`loop-1`,dash:`0.1 4.5`,width:2.6},other:{color:`ink-3`,dash:`3 3`,width:1.4},none:{color:`error`,dash:`2 2`,width:1.4}},Qt=e=>Zt[e.carrier?.kind??`none`],$t=(e,t)=>`fill="none" stroke-width="${Y(e.width)}" stroke-linecap="round"${e.dash?` stroke-dasharray="${e.dash}"`:``} style="stroke:${t}"`,en={"claude-code":`Claude Code`,codex:`Codex`},tn={"long-lived":`long-lived`,"per-task":`per task`,scheduled:`scheduled`};function nn(e){let t=new Set(e.lanes.map(e=>e.id)),n=e.sessions.filter(e=>t.has(e.lane)),r=e.people??[],i=new Set([...r,...n].map(e=>e.id));return{sessions:n,people:r,handoffs:e.handoffs.filter(e=>i.has(e.from)&&i.has(e.to)),numberOf:new Map(e.handoffs.map((e,t)=>[e.id,t+1]))}}function rn(e,t,n,r,i){let a=18;for(let n of Z(e.name||e.id,t-24,17,2,`bold`))a+=17,i.push(Q(12,a,n,{size:17,fill:r(`ink`),weight:`bold`})),a+=4;let o=[(n.live&&n.at?`live at ${n.at.slice(0,16).replace(`T`,` `)} UTC`:void 0)??(e.asOf?`as of ${e.asOf}`:void 0),Gt(Wt(e))].filter(Boolean).join(` · `);for(let e of Z(o,t-24,11,2))a+=13,i.push(Q(12,a,e,{size:11,fill:r(`ink-3`)}));return a+12}const an=7.2,on=e=>e.length>1?(X(e,8.5,`bold`)+4.5)/2:an;function sn(e,t,n,r,i){let a=on(n);return n.length>1?_t(e-a,t-an,a*2,an*2,{fill:i(`bg`),stroke:r,rx:an,width:1.3}):`<circle cx="${Y(e)}" cy="${Y(t)}" r="${an}" stroke-width="1.3" style="fill:${i(`bg`)};stroke:${r}"/>`}const cn=(e,t,n,r)=>Q(e,t+3.3,n,{size:n.length>1?8.5:9.5,fill:r(`ink`),weight:`bold`,anchor:`middle`}),ln=(e,t,n,r,i)=>sn(e,t,n,r,i)+cn(e,t,n,i);function un(e,t,n,r,i,a,o){let s=Math.min(t,n)+9,c=Math.max(t,n)-9,l=t=>{let n=1/0;for(let i of a)Math.abs(i.x-e)<=i.half+r+1&&(n=Math.min(n,Math.abs(i.y-t)-20.4));for(let a of o)a.of!==i&&!(a.to<e-r-1)&&!(a.from>e+r+1)&&(n=Math.min(n,Math.abs(a.y-t)-9.7));return n},u=(t+n)/2,d=u;if(l(u)<0&&c>s){let e={at:u,room:l(u)};for(let t=1;t*4<=c-s;t++){for(let n of[u+t*4,u-t*4]){if(n<s||n>c)continue;let t=l(n);(t>=0&&e.room<0||e.room<0&&t>e.room)&&(e={at:n,room:t})}if(e.room>=0)break}d=e.at}return a.push({x:e,y:d,half:r}),d}const dn=e=>(e+1)*13+4;function fn(e,t,n,r,i=0){let a=t-20,o=Z(e.name||e.id,a,13.5,2+i,`bold`),s=10+o.length*16+10-3,c=e.role?Z(e.role,a,11,Math.max(12,Math.floor((dn(n)-s-2)/13.5))):[],l=Math.max(s+(c.length?2+c.length*13.5:0),dn(n));return{height:l,family:!1,draw(n,i,a=l){let s=[_t(n,i,t,a,{fill:r(`gate-soft`),stroke:r(`gate`),rx:14,width:1.4,mark:`card`})],u=i+10-5;for(let e of o)u+=16,s.push(Q(n+10,u,e,{size:13.5,fill:r(`ink`),weight:`bold`}));u+=2;for(let e of c)u+=13.5,s.push(Q(n+10,u,e,{size:11,fill:r(`ink-2`)}));return`<g data-person="${e.id}">${s.join(``)}</g>`}}}function pn(e,t,n,r,i,a,o=0){let s=n-20,c=(t.count??1)>1,l=c?`×${t.count}`:``,u=c?X(l,10.5,`bold`)+12:0,d=Object.hasOwn(en,t.harness)?en[t.harness]:t.harness,f=a.live?.[t.id],p=Z(t.name||t.id,e=>s-(c&&e===0?u+6:0),13.5,2+o,`bold`),m=t.model?`${d} · ${t.model}`:d,h=!t.model||X(m,10.5,`bold`)<=s?[gt(m,s,10.5,`bold`)]:[gt(d,s,10.5,`bold`),...Z(t.model,s,10.5,2+o,`bold`)],g=[t.lifetime?tn[t.lifetime]:void 0,t.repo].filter(Boolean).join(` · `),_=g?Z(g,s,10,3+o):[],v=Yt(e,t.id),y=v===void 0?[]:Z(v===``?`wakes itself`:`wakes itself · ${v}`,s-13,10,2,`bold`),b=10+p.length*16+1+h.length*13+2+_.length*13+ +!!_.length+(y.length?2+y.length*13:0)+(t.graph?15:0)+(f?19:0)+10-3,x=Z(t.role,s,11,Math.max(12,Math.floor((dn(r)-b)/13.5))),S=Math.max(b+x.length*13.5,dn(r));return{height:S,family:c,draw(e,r,o=S){let d=[];c&&(d.push(_t(e+6,r+6,n-6,o-2,{fill:i(`surface`),stroke:i(`line`),rx:9})),d.push(_t(e+3,r+3,n-3,o-1,{fill:i(`surface`),stroke:i(`line`),rx:9}))),d.push(_t(e,r,n,o,{fill:i(`surface`),stroke:i(`line-strong`),rx:9,mark:`card`}));let m=r+10-5;p.forEach((t,r)=>{m+=16,d.push(Q(e+10,m,t,{size:13.5,fill:i(`ink`),weight:`bold`})),r===0&&c&&d.push(vt(e+n-10-u,m-.5,l,{size:10.5,fill:i(`accent-soft`),ink:i(`accent`)}).svg)}),m+=1;for(let n of h)m+=13,d.push(Q(e+10,m,n,{size:10.5,fill:i(t.harness===`codex`?`check`:`accent`),weight:`bold`}));m+=2;for(let t of x)m+=13.5,d.push(Q(e+10,m,t,{size:11,fill:i(`ink-2`)}));_.length&&(m+=1);for(let t of _)m+=13,d.push(Q(e+10,m,t,{size:10,fill:i(`ink-3`)}));if(y.forEach((t,n)=>{m+=n===0?15:13,n===0&&d.push(`<circle data-wakes="" cx="${Y(e+10+4.2)}" cy="${Y(m-3.4)}" r="3.6" fill="none" stroke-width="1.8" stroke-dasharray="1.5 2.2" style="stroke:${i(`merge`)}"/>`),d.push(Q(e+10+13,m,t,{size:10,fill:i(`merge`),weight:`bold`}))}),t.graph&&(m+=15,d.push(Q(e+10,m,gt(`graph: ${t.graph}`,s,10,`mono`),{size:10,fill:i(`loop-0`),weight:`mono`}))),f){m+=19;let t=f.working===0&&f.waiting===0&&(f.quiet??0)>0,n=f.working>0?`accent`:f.waiting>0?`warning`:`ink-3`,r=e+10+4.5;d.push(f.working>0?`<circle cx="${Y(r)}" cy="${Y(m-3.6)}" r="4.5" style="fill:${i(n)}"/>`:`<circle cx="${Y(r)}" cy="${Y(m-3.6)}" r="3.6" stroke-width="1.8" style="fill:${f.waiting>0||t?`none`:i(n)};stroke:${i(n)}"/>`),d.push(Q(e+10+14,m,gt(jt(f,a.at),s-14,10.5,`bold`),{size:10.5,fill:i(n),weight:`bold`}))}return`<g data-session="${t.id}"${f?` data-live="${f.working>0?`working`:f.waiting>0?`waiting`:(f.quiet??0)>0?`quiet`:`ended`}"`:``}>${d.join(``)}</g>`}}}function mn(e,t,n,r,i,a=0){let o=[],s=n-2,c=e.place??``,l=c?vt(0,0,c,{size:9.5,fill:i(`surface`),ink:i(`ink-2`),stroke:i(`line-strong`)}):void 0;Z(e.name||e.id,s-(l?l.width+8:0),12.5,2+a,`bold`).forEach((e,a)=>{a>0&&(r+=15),o.push(Q(t+2,r,e,{size:12.5,fill:i(`ink`),weight:`bold`})),a===0&&l&&o.push(vt(t+n-l.width,r-.5,c,{size:9.5,fill:i(`surface`),ink:i(`ink-2`),stroke:i(`line-strong`)}).svg)});for(let n of Z(`${e.machine} · ${e.account}`,s,10.5,3+a))r+=13.5,o.push(Q(t+2,r,n,{size:10.5,fill:i(`ink-3`)}));return{svg:o,cardsTop:r+9.5}}const hn=(e,t)=>t.carrier?Jt(e,t)||`${Vt[t.carrier.kind]} (not named)`:`no carrier named`;function gn(e,t,n,r,i,a,o,s=0){let c=Qt(t),l=o(c.color),u=r+24,d=a-24,f=[],p=i+12;if(f.push(ln(r+8,p-4,String(n),l,o)),Z(t.from===t.to?`${Kt(e,t.from)} → itself`:`${Kt(e,t.from)} → ${Kt(e,t.to)}`,d,12,2+s,`bold`).forEach((e,t)=>{t>0&&(p+=14),f.push(Q(u,p,e,{size:12,fill:o(`ink`),weight:`bold`}))}),p+=14,f.push(`<path d="M${Y(u)},${Y(p-3.5)} h18" ${$t(c,l)}/>`),Z(hn(e,t),d-24,11,2+s,`bold`).forEach((e,t)=>{t>0&&(p+=13.5),f.push(Q(u+24,p,e,{size:11,fill:l,weight:`bold`}))}),t.what)for(let e of Z(t.what,d,11,4+s))p+=13.5,f.push(Q(u,p,e,{size:11,fill:o(`ink-2`)}));return p+=11,{svg:`<g data-handoff-row="${t.id}">${_t(r-4,i-2,a+8,p-i-3,{fill:`transparent`,rx:8,mark:`row`})}${f.join(``)}</g>`,bottom:p}}const _n=[an,12,8,13,13,Xt,400,bt,on,hn,nn,Y,yt,gn,rn,dt,mn,ln,sn,cn,fn,un,_t,pn,$t,Qt,Q,X,Z];function vn(e){let[t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y,b,x,S,C,w,T,E,D,O,k]=e;return{BADGE_R:t,M:n,PAD:r,SLOT:i,TRACK:a,TRACK_MIN:o,PICTURE_WIDTH:s,assignTracks:c,badgeHalf:l,carriedBy:u,drawn:d,fmt:f,frame:p,handoffRow:m,heading:h,inkFor:g,laneHead:_,numberBadge:v,numberRing:y,numberText:b,personCard:x,placeNumber:S,rect:C,sessionCard:w,stroke:T,styleOf:E,text:D,textWidth:O,wrap:k}}const yn=5.5,bn=(e,t,n)=>Math.max(t,Math.min(n,e));function xn(e){let t=[];for(let n of e){let e=t[t.length-1],r=t[t.length-2];e&&e[0]===n[0]&&e[1]===n[1]||(e&&r&&(r[0]===e[0]&&e[0]===n[0]||r[1]===e[1]&&e[1]===n[1])&&t.pop(),t.push(n))}return t}function Sn(e,t,n={}){let{BADGE_R:r,M:i,PAD:a,SLOT:o,TRACK:s,TRACK_MIN:c,assignTracks:l,badgeHalf:u,drawn:d,fmt:f,frame:p,handoffRow:m,heading:h,inkFor:g,laneHead:_,numberRing:v,numberText:y,personCard:b,placeNumber:x,rect:S,sessionCard:C,stroke:w,styleOf:T,text:E}=vn(e),D=n.theme??`auto`,O=g(D),k=t.lanes,A=k.length,{sessions:j,people:M,handoffs:N,numberOf:P}=d(t),F=k.map(e=>j.filter(t=>t.lane===e.id)),I=new Map;M.forEach((e,t)=>I.set(e.id,{lane:-1,k:t})),F.forEach((e,t)=>e.forEach((e,n)=>I.set(e.id,{lane:t,k:n})));let L=N.map(e=>[I.get(e.from),I.get(e.to)]),ee=k.map(()=>[0,0]),R=k.map(()=>!1);for(let[e,t]of L)e.lane>=0&&t.lane>=0&&e.lane!==t.lane?(ee[e.lane][+(e.lane<t.lane)]++,ee[t.lane][+(t.lane<e.lane)]++):e.lane<0!=t.lane<0&&(R[Math.max(e.lane,t.lane)]=!0);let te=ee.map(([e,t])=>e<=t?0:1),ne=ee.map(([e,t],n)=>R[n]?1-te[n]:+(t<=e)),re=[],ie=[],ae=N.map((e,t)=>{let[n,r]=L[t],i=(e,t,n,r)=>re[re.push({g:e,group:t,lo:Math.min(n,r),hi:Math.max(n,r),t:0})-1],a=(n,r,i,a)=>ie[ie.push({id:n?e.from:e.to,other:n?e.to:e.from,side:r,lean:i,run:a,arc:t,from:n,y:0})-1];if(n.lane<0&&r.lane<0)return{};if(n.lane<0||r.lane<0){let e=n.lane<0?r:n,t=te[e.lane],o=a(n.lane>=0,t,-1,i(e.lane+t,t?0:2,-1,e.k));return n.lane<0?{to:o}:{from:o}}if(n.lane===r.lane){let e=ne[n.lane],t=i(n.lane+e,e?0:2,n.k,r.k);return{from:a(!0,e,Math.sign(r.k-n.k),t),to:a(!1,e,Math.sign(n.k-r.k),t)}}let o=+(n.lane<r.lane);if(Math.abs(n.lane-r.lane)===1){let e=i(Math.max(n.lane,r.lane),1,0,0);return{from:a(!0,o,0,e),to:a(!1,1-o,0,e)}}return{from:a(!0,o,-1,i(n.lane+o,o?0:2,-1,n.k)),to:a(!1,1-o,-1,i(r.lane+1-o,o?2:0,-1,r.k))}}),oe=Array.from({length:A+1},()=>[0,0,0]);for(let e=0;e<=A;e++)for(let t of[0,2]){let n=re.filter(n=>n.g===e&&n.group===t),{tracks:r,count:i}=l(n.map(e=>({from:e.lo,to:e.hi})));n.forEach((e,t)=>e.t=r[t]),oe[e][t]=i}for(let e of re)e.group===1&&(e.t=oe[e.g][1]++);let se=oe.map(e=>e[0]+e[1]+e[2]),ce=se.reduce((e,t)=>e+Math.max(0,t-1),0),le=e=>e===0&&M.length?18:9,ue=e=>se[e]?le(e)+(e===A&&M.length?18:9):e>0&&e<A?10:0,de=2*i+A*2*a+se.reduce((e,t,n)=>e+ue(n),0),z=s,B=168,V=n.width;if(V!==void 0&&Number.isFinite(V)&&A>0){let e=e=>(V-de-ce*e)/A;e(s)<150&&ce&&(z=bn((V-de-A*150)/ce,c,s)),B=bn(e(z),150,168)}let H=[],fe=[],U=i;for(let e=0;e<=A;e++)H.push(U),U+=ue(e)+Math.max(0,se[e]-1)*z,e<A&&(fe.push(U),U+=B+2*a);let W=Math.max(U+i,340,M.length?2*(i+a)+M.length*150+(M.length-1)*8:0),pe=(W-U-i)/2;fe.forEach((e,t)=>fe[t]=e+pe);let me=e=>pe+H[e.g]+le(e.g)+(e.group===0?e.t:e.group===1?oe[e.g][0]+e.t:se[e.g]-1-e.t)*z,he=[],ge=[],G=h(t,W,n,O,he),_e=new Map,ve=G;if(M.length>0){let e=G,t=(W-2*i-2*a-(M.length-1)*8)/M.length,n=M.map(e=>b(e,t,0,O,3)),r=Math.max(...n.map(e=>e.height));M.forEach((o,s)=>{let c=i+a+s*(t+8);_e.set(o.id,[c,c+t]),ge.push(n[s].draw(c,e+a+21.5,r))}),ve=e+a+21.5+r,G=ve+a,he.push(`<g data-people="">${S(i,e,W-2*i,G-e,{fill:O(`surface-2`),stroke:O(`line`),rx:12,dash:`5 4`})}${E(i+a+2,e+a+12,M.length===1?`Person`:`People`,{size:12.5,fill:O(`ink`),weight:`bold`})}</g>`)}let ye=M.map(()=>[]),K=e=>(_e.get(M[e].id)[0]+_e.get(M[e].id)[1])/2;N.forEach((e,t)=>{let[n,r]=L[t],{from:i,to:a}=ae[t];n.lane<0&&ye[n.k].push({arc:t,end:0,toward:a?me(a.run):n.k===r.k?NaN:K(r.k)}),r.lane<0&&ye[r.k].push({arc:t,end:1,toward:i?me(i.run):n.k===r.k?NaN:K(n.k)})});let be=N.map(()=>[0,0]),xe=re.map(me);M.forEach((e,t)=>{let[n,r]=_e.get(e.id),i=e=>e>=n+9.5&&e<=r-9.5,a=bn((r-n-16)/(ye[t].filter(e=>!i(e.toward)).length+1),3,o),s=[],c=(e,t)=>{let i=bn(e,n+8,r-8);for(let e=a;e>=1.5;e/=2)for(let a=i;a>=n+8&&a<=r-8;a+=t)if(xe.every(t=>Math.abs(t-a)>=Math.min(5,e))&&s.every(t=>Math.abs(t-a)>=e-.01))return s.push(a),a;return s.push(i),i};for(let e of ye[t]){let a=e.toward;be[e.arc][e.end]=i(a)?a:Number.isNaN(a)?c(K(t)+(e.end?7:-7),e.end?1:-1):a<n+9.5?c(n+12,1):c(r-12,-1)}});let Se=N.map((e,t)=>{let{from:n,to:r}=ae[t];if(!(n&&r&&n.run===r.run))return[n?me(n.run):be[t][0],r?me(r.run):be[t][1]]}),Ce=Se.flatMap((e,t)=>e&&e[0]!==e[1]?[{arc:t,from:e[0],to:e[1]}]:[]),we=l(Ce,6),q=G+(we.count?20+(we.count-1)*11:M.length?10:0),Te=new Map(Ce.map((e,t)=>[e.arc,q-10-we.tracks[t]*11])),Ee=k.map((e,t)=>_(e,fe[t]+a,B,q+a+12,O,3)),De=Math.max(q+a,...Ee.map(e=>e.cardsTop)),Oe=new Map;for(let e of ie)(Oe.get(e.id)??Oe.set(e.id,[[],[]]).get(e.id))[e.side].push(e);let J=new Map,ke=De;F.forEach((e,r)=>{let i=De;for(let o of e){let e=Oe.get(o.id)??[[],[]],s=C(t,o,B,Math.max(e[0].length,e[1].length),O,n,3);J.set(o.id,{x:fe[r]+a,y:i,h:s.height}),ge.push(s.draw(fe[r]+a,i)),i+=s.height+(s.family?14:8)}e.length===0&&(Ee[r].svg.push(E(fe[r]+a+2,De+12,`no sessions`,{size:10.5,fill:O(`ink-3`)})),i+=20),ke=Math.max(ke,i+a-8)}),k.forEach((e,t)=>he.push(`<g data-lane="${e.id}">${S(fe[t],q,B+2*a,ke-q,{fill:O(`surface-2`),stroke:O(`line`),rx:12})}${Ee[t].svg.join(``)}</g>`)),he.push(...ge),G=A>0?ke+10:q;let Ae=e=>J.get(e).y+J.get(e).h/2,je=e=>e.lean?-e.lean*e.run.t:e.run.group===1?Ae(e.other):-1/0;for(let[e,t]of Oe)for(let n of t)n.sort((e,t)=>e.lean-t.lean||je(e)-je(t)||e.arc-t.arc||(e.from?-1:1)),n.forEach((t,r)=>t.y=Ae(e)+(r-(n.length-1)/2)*o+(t.side?-2.5:2.5));for(let e=1;e<A;e++){let t=ae.flatMap(({from:t,to:n})=>t&&n&&t.run===n.run&&t.run.g===e&&t.run.group===1?[t.side?{run:t.run,left:t.y,right:n.y}:{run:t.run,left:n.y,right:t.y}]:[]),n=e=>e.right<e.left;t.sort((e,t)=>Number(n(t))-Number(n(e))||(n(e)?e.left-t.left:t.left-e.left));let r=(e,t)=>Math.abs(e.left-t.right)<2;for(let e=0;e<t.length;e++)for(let n=e+1;n<t.length;n++)r(t[n],t[e])&&!r(t[e],t[n])&&([t[e],t[n]]=[t[n],t[e]]);t.forEach((e,t)=>e.run.t=t)}let Me=e=>[J.get(e.id).x+(e.side?B:0),e.y],Ne=N.map((e,t)=>{let{from:n,to:r}=ae[t];if(n&&r&&n.run===r.run)return xn([Me(n),[me(n.run),n.y],[me(r.run),r.y],Me(r)]);let[i,a]=Se[t],o=Te.get(t)??q,s=(e,t)=>e?[Me(e),[t,e.y]]:[[t,ve]];return xn([...s(n,i),[i,o],[a,o],...s(r,a).reverse()])}),Pe=Ne.flatMap((e,t)=>e.slice(1).flatMap((n,r)=>n[1]===e[r][1]?[{y:n[1],from:Math.min(n[0],e[r][0]),to:Math.max(n[0],e[r][0]),of:t}]:[])),Fe=Ne.flatMap((e,t)=>e.slice(1).flatMap((n,r)=>n[0]===e[r][0]?[{y:n[0],from:Math.min(n[1],e[r][1]),to:Math.max(n[1],e[r][1]),of:t}]:[])),Ie=[],Le=[],Re=[],ze=[],Be=[];if(N.forEach((e,t)=>{let n=Ne[t],i=T(e),a=O(i.color),o=String(P.get(e.id)),s=n.length-2;if(s<0)return;let c=e=>Math.abs(n[e+1][0]-n[e][0])+Math.abs(n[e+1][1]-n[e][1]),l=e=>n[e][0]===n[e+1][0],d=n.map((e,t)=>t===0||t>s?0:Math.min(6,c(t-1)/2,c(t)/2)),p=e=>{let t=-1;for(let n=0;n<=s;n++)l(n)===e&&(t<0||c(n)>c(t))&&(t=n);return t},m=p(!1),h=p(!0);m>=0&&(h<0||c(h)<24&&c(m)>=40)&&(h=-1);let g=u(o),[_,b,S]=[0,0,!1];if(h>=0){let[e,i]=[n[h][1],n[h+1][1]],a=Math.sign(i-e);_=n[h][0],b=x(_,e,i,g,t,Ie,Pe),Le.push({x:b,y:_,half:r}),S=(b-a*r-(e+a*d[h]))*a>=0&&(i-a*(h===s?yn:d[h+1])-(b+a*r))*a>=0}else m>=0&&(b=n[m][1],_=x(b,n[m][0],n[m+1][0],r,t,Le,Fe),Ie.push({x:_,y:b,half:g}));let C=`M${f(n[0][0])},${f(n[0][1])}`,E=0,D=0;for(let e=0;e<=s;e++){let[t,i]=n[e+1];E=Math.sign(t-n[e][0]),D=Math.sign(i-n[e][1]);let a=e===s?yn:d[e+1];S&&e===h&&(C+=` L${f(_)},${f(b-D*r)} M${f(_)},${f(b+D*r)}`),C+=` L${f(t-E*a)},${f(i-D*a)}`,e<s&&(C+=` Q${f(t)},${f(i)} ${f(t+Math.sign(n[e+2][0]-t)*a)},${f(i+Math.sign(n[e+2][1]-i)*a)}`)}let[k,A]=[n[s+1][0]-.5*E,n[s+1][1]-.5*D],j=`<path d="M${f(k)},${f(A)} L${f(k-6.5*E-3.6*D)},${f(A-6.5*D-3.6*E)} L${f(k-6.5*E+3.6*D)},${f(A-6.5*D+3.6*E)} z" style="fill:${a}"/>`,M=`<circle cx="${f(n[0][0])}" cy="${f(n[0][1])}" r="2.2" style="fill:${a}"/>`,N=`<g data-plate="${e.id}">${v(_,b,o,a,O)}</g>`;S&&Re.push(N),ze.push(`<g data-handoff="${e.id}"><path d="${C}" ${w(i,a)}/>${M}${j}</g>${S?``:N}`),Be.push(`<g data-number="${e.id}">${y(_,b,o,O)}</g>`)}),he.push(...Re,...ze,...Be),t.handoffs.length>0){G+=6,he.push(E(i,G+11,`Handoffs`,{size:12.5,fill:O(`ink`),weight:`bold`})),G+=20;let e=bn(Math.floor((W-2*i+16)/306),1,t.handoffs.length),n=(W-2*i-(e-1)*16)/e,r=(e,r,i)=>m(t,e,P.get(e.id),r,i,n,O,3),a=t.handoffs.map(e=>r(e,0,0).bottom),o=a.reduce((e,t)=>e+t,0),s=0,c=G,l=0,u=G;t.handoffs.forEach((t,d)=>{let f=Math.min(e-1,Math.floor((l+a[d]/2)*e/o));f!==s&&(c=G),s=f;let p=r(t,i+s*(n+16),c);he.push(p.svg),c=p.bottom,l+=a[d],u=Math.max(u,c)}),G=u}return p(W,G+i-6,t.name||t.id,D,O,he.join(``),`map`)}function Cn(e,t,n={}){let{M:r,PICTURE_WIDTH:i,carriedBy:a,drawn:o,fmt:s,frame:c,heading:l,inkFor:u,numberBadge:d,rect:f,stroke:p,styleOf:m,text:h,textWidth:g,wrap:_}=vn(e),v=n.theme??`auto`,y=u(v),{sessions:b,people:x,handoffs:S,numberOf:C}=o(t),w=[...x.length?[{id:``,name:x.length===1?`Person`:`People`,person:!0,of:x.map(e=>({id:e.id,name:e.name||e.id}))}]:[],...t.lanes.map(e=>({id:e.id,name:e.name||e.id,person:!1,of:b.filter(t=>t.lane===e.id).map(e=>({id:e.id,name:`${e.name||e.id}${(e.count??1)>1?` ×${e.count}`:``}`}))}))].filter(e=>e.of.length>0),T=w.flatMap(e=>e.of),E=Math.max(1,T.length),D=Math.max(0,...T.flatMap(e=>e.name.split(/\s+/).map(e=>g(e,10,`bold`)))),O=Math.min(104,Math.max(62,D+14)),k=r+E*O+14,A=Number.isFinite(n.width)?Math.min(360,Math.max(190,n.width-r-k)):270,j=k+A+r,M=new Map(T.map((e,t)=>[e.id,r+(t+.5)*O])),N=[],P=Math.min(j,i),F=l(t,P,n,y,N)-12;for(let e of _(`Read down: the order the map lists its handoffs in. An order, not a clock: a map records no times.`,P-2*r,11,3))F+=14,N.push(h(r,F,e,{size:11,fill:y(`ink-2`)}));F+=12;let I=F,L=w.map(e=>_(e.name,e.of.length*O-14,9.5,3,`bold`)),ee=T.map(e=>_(e.name,O-12,10,6,`bold`)),R=I+8+Math.max(0,...L.map(e=>e.length))*12+3,te=9+Math.max(1,...ee.map(e=>e.length))*12.5,ne=[],re=[],ie=0;w.forEach((e,t)=>{let n=r+ie*O,i=e.of.length*O,a=L[t].map((e,t)=>h(n+i/2,I+16+t*12,e,{size:9.5,fill:y(`ink-2`),weight:`bold`,anchor:`middle`})).join(``);ne.push(t=>`<g data-${e.person?`people=""`:`lane="${e.id}"`}>${f(n+1.5,I,i-3,t-I,{fill:y(`surface-2`),stroke:y(`line`),rx:12,...e.person?{dash:`5 4`}:{}})}${a}</g>`);for(let t of e.of){let n=M.get(t.id),r=ee[ie++];re.push(`<g data-${e.person?`person`:`session`}="${t.id}">${f(n-O/2+4,R,O-8,te,e.person?{fill:y(`gate-soft`),stroke:y(`gate`),rx:12,width:1.4,mark:`card`}:{fill:y(`surface`),stroke:y(`line-strong`),rx:8,mark:`card`})}${r.map((e,t)=>h(n,R+(te-r.length*12.5)/2+9.5+t*12.5,e,{size:10,fill:y(`ink`),weight:`bold`,anchor:`middle`})).join(``)}</g>`)}}),N.push(h(k,R+te/2+3.5,`Carried by, and what is handed`,{size:10,fill:y(`ink-3`)})),F=R+te+8;let ae=[],oe=[];S.forEach((e,n)=>{let i=m(e),o=y(i.color),c=_(a(t,e),A,10.5,3,`bold`),l=e.what?_(e.what,A,10.5,8):[],u=Math.max(30,(c.length+l.length)*13+12),g=F+u/2;n>0&&oe.push(`<path d="M${s(r)},${s(F)} H${s(j-r)}" stroke-width="1" style="stroke:${y(`line`)}"/>`);let v=M.get(e.from),b=M.get(e.to),x=Math.sign(b-v),S=x===0?`M${s(v)},${s(g-6)} h20 v12 H${s(v+5.5)}`:`M${s(v)},${s(g)} H${s(b-x*5.5)}`,[w,T,E]=x===0?[v+.5,g+6,-1]:[b-x*.5,g,x],D=g-(c.length+l.length)*13/2-3;ae.push(`<g data-handoff="${e.id}">${f(r-4,F+1.5,j-2*r+8,u-3,{fill:`transparent`,rx:8,mark:`row`})}<path d="${S}" ${p(i,o)}/><circle cx="${s(v)}" cy="${s(x===0?g-6:g)}" r="2.2" style="fill:${o}"/><path d="M${s(w)},${s(T)} l${s(-6.5*E)},-3.6 v7.2 z" style="fill:${o}"/>`+d(x===0?v+20:v+x*Math.min(19,Math.abs(b-v)*.42),g,String(C.get(e.id)),o,y)+c.map(e=>h(k,D+=13,e,{size:10.5,fill:o,weight:`bold`})).join(``)+l.map(e=>h(k,D+=13,e,{size:10.5,fill:y(`ink-2`)})).join(``)+`</g>`),F+=u}),S.length===0&&(F+=30);let se=F+6,ce=T.map(e=>`<path d="M${s(M.get(e.id))},${s(R+te)} V${s(se-6)}" stroke-width="1" style="stroke:${y(`line-strong`)}"/>`);return N.push(...ne.map(e=>e(se)),...oe,...ce,...re,...ae),c(j,se+r,t.name||t.id,v,y,N.join(``),`sequence`)}function wn(e,t={}){let n=t.theme??`auto`,r=t.width??400,i=dt(n),a=e.lanes,{sessions:o,people:s,handoffs:c,numberOf:l}=nn(e),u=new Map;for(let e of s)u.set(e.id,u.size);for(let e of a)for(let t of o)t.lane===e.id&&u.set(t.id,u.size);let d=new Map;for(let e of c)(d.get(e.from)??d.set(e.from,[]).get(e.from)).push({handoff:e.id,end:`from`,other:u.get(e.to)}),(d.get(e.to)??d.set(e.to,[]).get(e.to)).push({handoff:e.id,end:`to`,other:u.get(e.from)});for(let[e,t]of d){let n=u.get(e),r=e=>e.other<n?0:e.other===n?1:2;t.sort((e,t)=>r(e)-r(t)||(r(e)===0?t.other-e.other:e.other-t.other)||l.get(e.handoff)-l.get(t.handoff)||(e.end===`from`?-1:1))}let f=(e,t,n)=>u.get(e)*1e3+d.get(e).findIndex(e=>e.handoff===t&&e.end===n),{tracks:p,count:m}=bt(c.map(e=>({from:f(e.from,e.id,`from`),to:f(e.to,e.id,`to`)}))),h=r-24,g=h-16,_=e=>(e-16-14)/(m-1),v=m<=1?13:Math.min(13,Math.max(Xt,_(g*.43999999999999995)),Math.max(_(g-120),_(g*.43999999999999995))),y=c.length===0?0:16+(m-1)*v+14,b=h-16-y,x=[],S=rn(e,r,t,i,x),C=new Map,w=[];if(s.length>0){let e=S,t=[],n=e+8+12;t.push(Q(22,n,s.length===1?`Person`:`People`,{size:12.5,fill:i(`ink`),weight:`bold`})),n+=9.5;for(let e of s){let t=d.get(e.id)??[],r=fn(e,b,t.length,i);C.set(e.id,{height:r.height,y:n,slots:t}),w.push(r.draw(20,n)),n+=r.height+8}let r=n+8-8;x.push(`<g data-people="">${_t(12,e,h,r-e,{fill:i(`surface-2`),stroke:i(`line`),rx:12,dash:`5 4`})}${t.join(``)}</g>`),S=r+10}for(let n of a){let r=S,a=mn(n,20,b,r+8+12,i),s=a.svg,c=a.cardsTop,l=o.filter(e=>e.lane===n.id);for(let n of l){let r=d.get(n.id)??[],a=pn(e,n,b,r.length,i,t);C.set(n.id,{height:a.height,y:c,slots:r}),w.push(a.draw(20,c)),c+=a.height+(a.family?14:8)}l.length===0&&(c+=12,s.push(Q(22,c,`no sessions`,{size:10.5,fill:i(`ink-3`)})),c+=8);let u=c+8-8;x.push(`<g data-lane="${n.id}">${_t(12,r,h,u-r,{fill:i(`surface-2`),stroke:i(`line`),rx:12})}${s.join(``)}</g>`),S=u+10}x.push(...w);let T=20+b,E=(e,t,n)=>{let r=C.get(e),i=r.slots.findIndex(e=>e.handoff===t&&e.end===n);return r.y+r.height/2+(i-(r.slots.length-1)/2)*13},D=c.map((e,t)=>({y1:E(e.from,e.id,`from`),y2:E(e.to,e.id,`to`),x:T+16+p[t]*v})),O=D.flatMap((e,t)=>[e.y1,e.y2].map(n=>({y:n,from:-1/0,to:e.x,of:t}))),k=[],A=[],j=[],M=[];if(c.forEach((e,t)=>{let n=Qt(e),r=i(n.color),{y1:a,y2:o,x:s}=D[t],c=Math.min(6,Math.abs(o-a)/2),u=o>=a?1:-1,d=`<path d="M${Y(T+.5)},${Y(o)} l6.5,-3.6 v7.2 z" style="fill:${r}"/>`,f=`<circle cx="${Y(T)}" cy="${Y(a)}" r="2.2" style="fill:${r}"/>`,p=String(l.get(e.id)),m=un(s,a,o,on(p),t,k,O),h=a+u*c,g=o-u*c,_=m-u*an,v=m+u*an,y=(_-h)*u>=0&&(g-v)*u>=0,b=y?`V${Y(_)} M${Y(s)},${Y(v)} V${Y(g)}`:`V${Y(g)}`,x=`<path d="${`M${Y(T)},${Y(a)} H${Y(s-c)} Q${Y(s)},${Y(a)} ${Y(s)},${Y(h)} ${b} Q${Y(s)},${Y(o)} ${Y(s-c)},${Y(o)} H${Y(T+5.5)}`}" ${$t(n,r)}/>${f}${d}`,S=`<g data-plate="${e.id}">${sn(s,m,p,r,i)}</g>`;y&&A.push(S),j.push(`<g data-handoff="${e.id}">${x}</g>${y?``:S}`),M.push(`<g data-number="${e.id}">${cn(s,m,p,i)}</g>`)}),x.push(...A,...j,...M),e.handoffs.length>0){S+=6,x.push(Q(12,S+11,`Handoffs`,{size:12.5,fill:i(`ink`),weight:`bold`})),S+=20;for(let t of e.handoffs){let n=gn(e,t,l.get(t.id),12,S,r-24,i);x.push(n.svg),S=n.bottom}}return yt(r,S+12-6,e.name||e.id,n,i,x.join(``),`map`)}Object.keys(rt);const Tn=()=>he(Ye,Xe);q({groophRun:ge(0),run:H({minLength:1}),progress:V(H()),source:Tn(),working:Tn(),notes:K(he(Je,`${Xe}#/$defs/RunNote`)),issues:V(K(q({line:W({integer:!0,minimum:1}),message:H()},{name:`RunNoteIssue`})))},{describe:`run bundle`});const En={pass:`passed`,fail:`failed`,"invalid-evidence":`failed`,halt:`halted`},Dn=e=>e.outcome===`started`||e.outcome===`ending`;function On(e){if(e.outcome===`started`)return{kind:`started`};if(e.outcome!==`ending`){if(e.outcome!==void 0)return{kind:`result`,state:En[e.outcome]??`passed`};if(e.ended!==void 0)return{kind:`result`,state:`passed`};if(e.started!==void 0)return{kind:`started`}}}const kn=e=>{if(e===`graph`)return{kind:`graph`};let t=e.indexOf(`:`);return{kind:e.slice(0,t),id:e.slice(t+1)}},An=e=>e.at===`graph`&&e.outcome!==void 0&&!Dn(e),jn=(e,t,n)=>Object.hasOwn(e,t)?e[t]:e[t]=n();function Mn(e,t){let n={};for(let e of t.nodes)n[e.id]={state:`pending`,runs:0};let r={};for(let e of t.loops)r[e.id]={round:null};let i=new Set,a={},o=Nn(t);for(let s of e){s.cost&&(a[s.cost.measure]=(a[s.cost.measure]??0)+s.cost.amount);let e=kn(s.at);if(e.kind===`node`&&e.id!==void 0){let t=jn(n,e.id,()=>({state:`pending`,runs:0})),a=On(s);if(a?.kind===`started`?(t.runs+=1,t.state=`running`,i.add(e.id)):a?.kind===`result`&&(i.delete(e.id)||(t.runs+=1),t.state=a.state),s.outcome!==void 0&&!Dn(s)&&(t.lastOutcome=s.outcome),s.verdict!==void 0&&(t.lastVerdict=s.verdict),s.round!==void 0){t.round=s.round;let n=o.get(e.id);n!==void 0&&(r[n].round=s.round)}t.lastNote=s.id}else if(e.kind===`loop`&&e.id!==void 0){let n=jn(r,e.id,()=>({round:null}));if(s.round===void 0&&s.outcome===void 0)continue;s.round!==void 0&&(n.round=s.round);let i=t.loops.find(t=>t.id===e.id),a=i?In(s,i):void 0;n.lastStop={note:s.id,...s.round===void 0?{}:{round:s.round},...s.outcome===void 0?{}:{outcome:s.outcome},...a?{fired:a}:{},...s.text===void 0?{}:{text:s.text}}}}let s=`running`,c,l=Ln(e,An);if(l>=0){c=e[l];let t=c.outcome===`halt`&&e.slice(l+1).some(e=>e.at.startsWith(`node:`)&&On(e)!==void 0);s=t?`running`:c.outcome===`halt`?`halted`:`ended`,t&&(c=void 0)}else i.size===0&&Object.values(n).some(e=>e.state===`halted`)&&(c=e[Ln(e,e=>e.at.startsWith(`node:`)&&e.outcome===`halt`)],s=`halted`);if(s!==`running`)for(let e of i)n[e].state=`halted`;let u=e.find(e=>e.started!==void 0)?.started,d=s===`running`?void 0:c?.ended;return{run:e[0]?.run??``,state:s,...s!==`running`&&c?.outcome!==void 0?{outcome:c.outcome}:{},...u===void 0?{}:{started:u},...d===void 0?{}:{ended:d},nodes:n,loops:r,amendments:e.filter(e=>e.amendment!==void 0),proposals:e.filter(e=>e.proposal!==void 0),cost:a,timeline:[...e]}}function Nn(e){let t=new Map;for(let n of e.nodes){let r;for(let t of e.loops)t.members.includes(n.id)&&(r===void 0||t.members.length<r.members.length)&&(r=t);r&&t.set(n.id,r.id)}return t}const Pn=[[`bar-passed`,/\bbar[ -]pass(?:ed|es)\b/i],[`max-iterations`,/\bmax[ -]iterations?\b/i],[`budget`,/\bbudget\b/i],[`diminishing-returns`,/\bdiminishing\b/i],[`evidence-invalid`,/\bevidence[ -]invalid\b|\binvalid[ -]evidence\b/i],[`human`,/\bhuman (?:stop|halt)\b/i]],Fn=[`human`,`budget`,`bar-passed`,`diminishing-returns`,`evidence-invalid`,`max-iterations`];function In(e,t){if(e.stop!==void 0)return Fn.includes(e.stop)?e.stop:void 0;if(e.outcome!==`pass`&&e.outcome!==`halt`)return;let n=e.text??``,r=new Set(t.stops.map(e=>e.kind)),i=Pn.filter(([e,t])=>r.has(e)&&t.test(n)),a=i.filter(([,e])=>RegExp(`${e.source}[^.;]{0,40}?\\bfire`,`i`).test(n));if(a.length===1)return a[0][0];if(i.length===1)return i[0][0];if(e.outcome===`pass`&&r.has(`bar-passed`)&&i.length===0)return`bar-passed`}function Ln(e,t){for(let n=e.length-1;n>=0;n--)if(t(e[n]))return n;return-1}new Map([...`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`].map((e,t)=>[e,t]));const Rn={"bar-passed":`bar passed`,"max-iterations":`max iterations`,budget:`budget`,"diminishing-returns":`diminishing returns`,"evidence-invalid":`evidence invalid`,human:`human stop`},zn=e=>{if(e.at===`graph`)return{kind:`graph`};let t=e.at.indexOf(`:`);return{kind:e.at.slice(0,t),id:e.at.slice(t+1)}},Bn=e=>e.round===void 0?``:` · round ${e.round}`;function Vn(e,t){let n=zn(e),r=e=>t.nodes.find(t=>t.id===e)?.name||e,i=e.outcome;if(n.kind===`graph`)return i===void 0?e.started!==void 0&&e.ended===void 0?`Run started`:`Run note`:i===`ending`?`Run ending`:i===`halt`?`Run halted`:`Run ended · ${i}`;if(n.kind===`node`){let t=r(n.id);return i===`started`?`${t} dispatched${Bn(e)}`:i===`halt`?`${t} halted${Bn(e)}`:i!==void 0&&i!==`ending`?`${t}: ${e.verdict&&e.verdict!==i?`${i} (${e.verdict})`:i}${Bn(e)}`:e.amendment?`${t}: amendment${Bn(e)}`:e.proposal?`${t}: proposal${Bn(e)}`:`${t}${Bn(e)}`}if(n.kind===`loop`){let r=t.loops.find(e=>e.id===n.id)?.name||n.id,a=e.stop&&Object.hasOwn(Rn,e.stop)?` · ${Rn[e.stop]}`:``;return e.round!==void 0&&i!==void 0?`${r}: round ${e.round} ends, ${i}${a}`:e.proposal?`${r}: proposal`:`${r}${Bn(e)}${a}`}let a=t.edges.find(e=>e.id===n.id);return a?`${r(a.from)} → ${r(a.to)}${Bn(e)}`:`Edge ${n.id}`}function Hn(e,t,n){let r=e=>{let n=e===void 0?void 0:t.nodes.find(t=>t.id===e);return n?{id:n.id,name:n.name||n.id,kind:n.kind}:void 0};if(n.state===`halted`)for(let t=e.length-1;t>=0;t--){let n=zn(e[t]);if(n.kind===`node`&&e[t].outcome===`halt`)return r(n.id)}for(let i=e.length-1;i>=0;i--){let a=zn(e[i]),o=r(a.kind===`node`?a.id:a.kind===`edge`?t.edges.find(e=>e.id===a.id)?.to:void 0);if(o?.kind===`stop`||o&&n.state===`halted`&&o.kind===`human-gate`)return o}}function Un(e,t){let n=e.loops.filter(e=>e.fired!==void 0).map(e=>`${e.name} stopped on ${Rn[e.fired]}${e.round===void 0?``:` in round ${e.round}`}`),r=e.at?` at ${e.at.name}${e.at.kind===`human-gate`?` (a human gate)`:``}`:``,i=t?`The record stops while the run was still going.`:e.state===`halted`?`The run halted${r}.`:`The run ended${r}${e.outcome?`: ${e.outcome}`:``}.`;if(n.length===0){let t=e.loops.filter(e=>e.round!==void 0);return`${i}${t.length>0?` No loop stop fired; ${t.map(e=>`${e.name} ran to round ${e.round}`).join(`, `)}.`:``}`}return`${n.join(`. `)}. ${i}`}function Wn(e,t){let n=[{index:0,summary:Mn([],t),caption:`Before the run`}];e.forEach((r,i)=>{let a;n.push({index:i+1,note:r,get summary(){return a??=Mn(e.slice(0,i+1),t)},focus:zn(r),caption:Vn(r,t)})});let r=n[n.length-1].summary,i=t.loops.filter(e=>r.loops[e.id]?.round!==null&&r.loops[e.id]!==void 0).map(e=>{let t=r.loops[e.id],n=t.lastStop;return{loop:e.id,name:e.name||e.id,...t.round===null?{}:{round:n?.round??t.round},...n?.outcome===void 0?{}:{outcome:n.outcome},...n?.fired===void 0?{}:{fired:n.fired}}}),a=e.length>0?Hn(e,t,r):void 0,o={state:r.state,...r.outcome===void 0?{}:{outcome:r.outcome},loops:i,...a?{at:a}:{}};return{steps:n,end:{...o,line:e.length===0?`The run has no notes yet.`:Un(o,r.state===`running`)}}}const $=e=>`\`${e.replace(/\|/g,`\\|`)}\``;`${$(`git diff`)}${$(`git diff --no-index /dev/null <file>`)}${$(`git diff`)}${$(`--no-index`)}${$(`cd`)}${$(`git add -N <file>`)}`,`${$(`approval`)}`,`${$(`irreversible`)}`,`${$(`budget`)}${$(`max-iterations`)}`,`${$(`acceptance`)}`,`${$(`adaptation`)}`,`${$(`patch`)}${$(`grooph apply --ops`)}${$(`[{"op":"updateNode","id":"<node-id>","set":{"effort":"high"}}]`)}${$(`grooph apply`)}`,`${$(`git diff`)}${$(`git diff --no-index /dev/null <file>`)}${$(`git diff`)}${$(`--no-index`)}${$(`cd`)}${$(`git add -N <file>`)}`,`${$(`approval`)}`,`${$(`irreversible`)}`,`${$(`budget`)}${$(`max-iterations`)}`,`${$(`acceptance`)}`,`${$(`adaptation`)}`,`${$(`patch`)}${$(`grooph apply --ops`)}${$(`[{"op":"updateNode","id":"<node-id>","set":{"effort":"high"}}]`)}${$(`grooph apply`)}`;const Gn=[`paper`,`blueprint`,`ink`,`phosphor`,`transit`,`chalk`],Kn=`"Atkinson Hyperlegible Next",system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif`,qn=`"Atkinson Hyperlegible Mono",ui-monospace,"SF Mono",Menlo,Consolas,"Roboto Mono",monospace`,Jn=`"Chalkboard SE","Comic Sans MS",${Kn}`,Yn=`& rect[data-card]`,Xn=`& rect[data-card][stroke-width="1.8"]`,Zn=`& rect[data-card][stroke-width="1.4"]`,Qn=`& rect[data-card][rx="16"]`,$n=`& [data-node]>rect[data-card],& [data-session]>rect[data-card],& [data-session]>rect[rx="9"]`,er=`& [data-edge] path[fill="none"]`,tr=`& [data-node]>text[font-size="9.5"]`,nr=`letter-spacing:-.05em`,rr={name:`blueprint`,label:`Blueprint`,use:`For architecture notes and slides, where the picture should read as an engineering drawing.`,light:{bg:`#f2f6fc`,surface:`#f8fbff`,"surface-2":`#e3ebf7`,ink:`#0f2f63`,"ink-2":`#24467e`,"ink-3":`#48628f`,line:`#d3dff0`,"line-strong":`#24467e`,accent:`#0f2f63`,"accent-soft":`#dde7f6`,gate:`#a4470b`,"gate-soft":`#fbeedd`,check:`#1d4e9e`,merge:`#5a3fa0`,stop:`#48628f`,ok:`#1c6b4a`,"ok-soft":`#dcf0e6`,warning:`#8a5200`,error:`#a8261c`,"error-soft":`#fbe6e3`,"loop-0":`#0a6a9c`,"loop-1":`#6a45b5`,"loop-2":`#a8431a`,"loop-3":`#9c2a63`},dark:{bg:`#143d73`,surface:`#184683`,"surface-2":`#1d4f92`,ink:`#f1f6ff`,"ink-2":`#d0def5`,"ink-3":`#b3c8eb`,line:`#2a5594`,"line-strong":`#d0def5`,accent:`#f1f6ff`,"accent-soft":`#24579e`,gate:`#ffc566`,"gate-soft":`#3a4f6e`,check:`#a9d1ff`,merge:`#d7c2ff`,stop:`#b3c8eb`,ok:`#9ff0c0`,"ok-soft":`#1c5a60`,warning:`#ffd27f`,error:`#ffb3a8`,"error-soft":`#5a3550`,"loop-0":`#7fe3ff`,"loop-1":`#d7c2ff`,"loop-2":`#ffb08a`,"loop-3":`#f8afdb`},rules:()=>`${Yn}{stroke-width:1.2}${Xn}{stroke-width:2.4}${$n},& rect[rx="7.4"],& rect[rx="6.5"],& rect[rx="8.1"]{rx:0;ry:0}${Qn}{rx:16px;ry:16px}${tr}{font-family:${qn};font-weight:500;text-transform:uppercase;letter-spacing:.09em}& [data-node]>text[font-size="10.5"],& [data-lane] text[font-size="10.5"]{font-family:${qn};font-size:8.5px;${nr}}& text[font-size="17"]{text-transform:uppercase;letter-spacing:.06em;font-size:12.5px}`,defs:(e,t)=>`<pattern id="${t}" width="20" height="20" patternUnits="userSpaceOnUse"><path d="M20,.5H.5V20" fill="none" stroke-width="1" style="stroke:${e(`line`)}"/></pattern>`,ground:!0,canvas:{radius:0,stop:16,border:1.2,gate:2.4,edge:1.5,caps:.09,labelFace:qn}},ir=`#000000`,ar=`#f6f6f6`,or={name:`ink`,label:`Ink`,use:`For papers and print. One ink and no tints, so it survives a photocopier.`,light:{bg:`#ffffff`,surface:`#ffffff`,"surface-2":`#f1f1f1`,ink:ir,"ink-2":`#1c1c1c`,"ink-3":`#3d3d3d`,line:`#bdbdbd`,"line-strong":ir,accent:ir,"accent-soft":`#ececec`,gate:ir,"gate-soft":`#ececec`,check:ir,merge:ir,stop:ir,ok:ir,"ok-soft":`#ececec`,warning:ir,error:ir,"error-soft":`#ececec`,"loop-0":ir,"loop-1":ir,"loop-2":ir,"loop-3":ir},dark:{bg:`#0b0b0b`,surface:`#0b0b0b`,"surface-2":`#1c1c1c`,ink:ar,"ink-2":`#e2e2e2`,"ink-3":`#bdbdbd`,line:`#4a4a4a`,"line-strong":ar,accent:ar,"accent-soft":`#222222`,gate:ar,"gate-soft":`#222222`,check:ar,merge:ar,stop:ar,ok:ar,"ok-soft":`#222222`,warning:ar,error:ar,"error-soft":`#222222`,"loop-0":ar,"loop-1":ar,"loop-2":ar,"loop-3":ar},face:`Georgia,"Times New Roman",Times,serif`,rules:()=>`${Yn}{stroke-width:.8}${Xn}{stroke-width:3}${Zn}{stroke-width:2.4}${$n}{rx:2px;ry:2px}${Qn}{rx:16px;ry:16px}${er}{stroke-width:1.1}& [data-edge] path[stroke-width="2"]{stroke-width:2.4}& [data-edge] path[stroke-dasharray="5 3"]{stroke-dasharray:3.5 2.5}${tr}{text-transform:uppercase;letter-spacing:.1em;font-size:8.5px}`,canvas:{radius:2,stop:16,border:.8,gate:3,edge:1.1,caps:.1}},sr={bg:`#0a0f0b`,surface:`#0e1610`,"surface-2":`#132017`,ink:`#b8f5c2`,"ink-2":`#8fd69b`,"ink-3":`#6aa876`,line:`#1c2e21`,"line-strong":`#3c6b48`,accent:`#5dff8a`,"accent-soft":`#123620`,gate:`#ffb84a`,"gate-soft":`#33260e`,check:`#7fd4ff`,merge:`#c9a6ff`,stop:`#9fb5a4`,ok:`#5dff8a`,"ok-soft":`#123620`,warning:`#ffb84a`,error:`#ff7a6a`,"error-soft":`#3a1714`,"loop-0":`#6fe3ff`,"loop-1":`#ffd84a`,"loop-2":`#ff8f6a`,"loop-3":`#ff8fd0`},cr={blueprint:rr,ink:or,phosphor:{name:`phosphor`,label:`Phosphor`,use:`For terminals and dark dashboards. Fixed-width lettering on a dark screen, with gates in amber.`,light:sr,dark:sr,face:qn,rules:()=>`& g rect,&>rect[rx]{rx:2px;ry:2px}${Qn}{rx:16px;ry:16px}${Zn}{rx:12px;ry:12px}& rect[rx="7.2"]{rx:7.2px;ry:7.2px}${Xn}{stroke-width:2.2}& text{${nr}}& text[font-size="17"]{font-size:16px}& text[font-size="13.5"]{font-size:12.25px}& text[font-size="12.5"]{font-size:11.25px}& text[font-size="12"]{font-size:11px}& text[font-size="11.5"]{font-size:9.75px}& text[font-size="11"]{font-size:9px}& text[font-size="10.5"]{font-size:8.5px}& text[font-size="10"]{font-size:8px}& text[font-size="11"][font-weight="700"]{font-size:10.5px}& text[font-size="10.5"][font-weight="700"]{font-size:9.75px}& text[font-size="10"][font-weight="700"]{font-size:9.5px}& text[font-size="9.5"]{font-size:8.75px}& text[font-size="9"]{font-size:8.25px}${tr}{text-transform:uppercase;letter-spacing:.06em}`,defs:(e,t)=>`<pattern id="${t}" width="3" height="3" patternUnits="userSpaceOnUse"><path d="M0,.5H3" fill="none" stroke-width="1" style="stroke:${e(`surface-2`)}"/></pattern>`,ground:!0,canvas:{radius:2,stop:16,border:1,gate:2.2,edge:1.5,caps:.1}},transit:{name:`transit`,label:`Transit`,use:`For talks and posters seen from across a room. Edges are thick route lines and each loop keeps its own color.`,light:{bg:`#ffffff`,surface:`#ffffff`,"surface-2":`#eef1f5`,ink:`#0f1b2d`,"ink-2":`#26344a`,"ink-3":`#4a5a72`,line:`#d5dbe4`,"line-strong":`#0f1b2d`,accent:`#0f1b2d`,"accent-soft":`#e3e9f2`,gate:`#b04f00`,"gate-soft":`#fdeed9`,check:`#0057b8`,merge:`#6b3fb0`,stop:`#0f1b2d`,ok:`#007a4d`,"ok-soft":`#dbf2e6`,warning:`#8f5200`,error:`#c4281c`,"error-soft":`#fde7e4`,"loop-0":`#d7261e`,"loop-1":`#007a4d`,"loop-2":`#b85300`,"loop-3":`#b0178a`,route:`#0057b8`},dark:{bg:`#0d1524`,surface:`#121c2e`,"surface-2":`#1a2740`,ink:`#f3f6fb`,"ink-2":`#cfd8e6`,"ink-3":`#9fadc2`,line:`#26344d`,"line-strong":`#f3f6fb`,accent:`#f3f6fb`,"accent-soft":`#1f2e49`,gate:`#ffab4a`,"gate-soft":`#3a2a12`,check:`#6db3ff`,merge:`#b99cff`,stop:`#f3f6fb`,ok:`#5fd6a0`,"ok-soft":`#143a2a`,warning:`#ffc266`,error:`#ff8a7d`,"error-soft":`#3d1c19`,"loop-0":`#ff6b5e`,"loop-1":`#5fd6a0`,"loop-2":`#ffab4a`,"loop-3":`#f07ad0`,route:`#6db3ff`},face:Kn,rules:e=>`& [data-edge] [style="stroke:${e(`ink-2`)}"]{stroke:${e(`route`)}!important}& [data-edge] [style="fill:${e(`ink-2`)}"]{fill:${e(`route`)}!important}${er}{stroke-width:4.5}& [data-edge] path[stroke-dasharray="5 3"]{stroke-dasharray:10 5;stroke-linecap:butt}& [data-edge] path[stroke-dasharray="1.5 3"]{stroke-dasharray:.1 8}@supports (transform-box:fill-box){& [data-edge] path+path,& [data-edge] circle+path{transform-box:fill-box;transform-origin:center;transform:scale(1.6)}}& [data-edge] circle{r:4.2px;stroke:${e(`bg`)};stroke-width:1.5}${Yn}{stroke-width:2.6}${Xn}{stroke-width:4.2}${Zn}{stroke-width:3.4}${$n}{rx:22px;ry:22px}${Qn}{rx:5px;ry:5px}${tr}{text-transform:uppercase;letter-spacing:.08em}`,canvas:{radius:22,stop:5,border:2.6,gate:4.2,edge:4.5,caps:.08}},chalk:{name:`chalk`,label:`Chalk`,use:`For early drafts and teaching. Hand lettering and lines that wobble say the graph is still open to change.`,light:{bg:`#f6f7f7`,surface:`#fbfbfb`,"surface-2":`#eceeee`,ink:`#2a2e32`,"ink-2":`#454a50`,"ink-3":`#62686f`,line:`#d5d8db`,"line-strong":`#4a5057`,accent:`#2456a6`,"accent-soft":`#dfe8f6`,gate:`#a94e08`,"gate-soft":`#fbeedd`,check:`#2456a6`,merge:`#6a45b5`,stop:`#62686f`,ok:`#1c6b4a`,"ok-soft":`#dcf0e6`,warning:`#8a5200`,error:`#a8261c`,"error-soft":`#fbe6e3`,"loop-0":`#7a3fb8`,"loop-1":`#0e7584`,"loop-2":`#b8430f`,"loop-3":`#a82a66`},dark:{bg:`#26302e`,surface:`#2a3533`,"surface-2":`#313d3a`,ink:`#f3f2ec`,"ink-2":`#d9dcd5`,"ink-3":`#b0b8b1`,line:`#3d4a47`,"line-strong":`#d9dcd5`,accent:`#a8d8ff`,"accent-soft":`#2f4652`,gate:`#ffd28a`,"gate-soft":`#4a4230`,check:`#a8d8ff`,merge:`#d9c2ff`,stop:`#b0b8b1`,ok:`#a6e8c0`,"ok-soft":`#2c4a3c`,warning:`#ffd28a`,error:`#ffb0a6`,"error-soft":`#4f3532`,"loop-0":`#f5a8cc`,"loop-1":`#9fe0d6`,"loop-2":`#ffb48a`,"loop-3":`#d9c2ff`},face:Jn,rules:()=>`${Yn},& [data-edge],& [data-plate],& [data-lane]>rect,& [data-people]>rect,&[data-picture="map"] [data-handoff]{filter:url(#gp-chalk)}${Yn}{stroke-width:1.5}${Xn}{stroke-width:2.6}${er}{stroke-width:1.8}& text{letter-spacing:.01em}`,defs:()=>`<filter id="gp-chalk"><feTurbulence type="fractalNoise" baseFrequency=".035" numOctaves="2" seed="4" result="n"/><feDisplacementMap in="SourceGraphic" in2="n" scale="3" xChannelSelector="R" yChannelSelector="G"/></filter>`,canvas:{radius:9,stop:16,border:1.5,gate:2.6,edge:1.8}}},lr=e=>Gn.includes(e),ur=[`light`,`dark`,`auto`];function dr(e){if(ur.includes(e))return{name:`paper`,form:e};let t=e.lastIndexOf(`-`),n=t>0&&ur.includes(e.slice(t+1))?e.slice(t+1):void 0,r=n?e.slice(0,t):e;return lr(r)?{name:r,...n?{form:n}:{}}:void 0}function fr(e,t=`auto`){if(e===void 0||e===`paper`||!lr(e))return;let n=cr[e],r=`.grooph-picture[data-look="${n.name}"]`,i=e=>Object.keys(e).map(t=>`--gp-${t}:${e[t]}`).join(`;`),a=`gp-${n.name}${t===`auto`?``:`-${t}`}`,o=t===`auto`,s=t===`dark`?n.dark:n.light,c=o?e=>`var(--gp-${e})`:e=>s[e]??``,l=`${r}:not([data-theme="light"])`,u=o?n.dark===n.light?`${r},${l}{${i(n.light)}}`:`${r}{${i(n.light)}}@media (prefers-color-scheme:dark){${l}{${i(n.dark)}}}${r}[data-theme="dark"]{${i(n.dark)}}`:``,d=n.face?`${r}{font-family:${n.face}}`:``;return{name:n.name,css:`${u}${d}${n.rules(c).replaceAll(`&`,r)}`,defs:n.defs?n.defs(c,a):``,ground:n.ground?`<rect width="100%" height="100%" fill="url(#${a})"/>`:``,colors:s}}function pr(e,t,n=`auto`){let r=fr(t,n);if(!r)return e;let i=/^(<svg [^>]* data-picture="[a-z]+")([^>]*>)(<title>[^<]*<\/title>)<style>[^<]*<\/style>(<rect [^>]*\/>)/;if(!i.test(e)||/^<svg [^>]* data-look=/.test(e))throw Error(`themed() takes a picture as core draws it to follow the viewer: picture(doc), with no theme of its own`);let a=e.replace(i,(e,t,n,i,a)=>`${t} data-look="${r.name}"${n}${i}<style>${r.css}</style>${r.defs?`<defs>${r.defs}</defs>`:``}${a}${r.ground}`);return n===`auto`?a:a.replace(/ style="[^"]*"/g,e=>e.replace(/var\(--gp-([a-z0-9-]+)\)/g,(e,t)=>r.colors[t]))}const mr={frontier:104,strong:68,fast:34,unset:16},[hr,gr]=[.76,.94],_r=e=>`${Math.round(e*10)/10} min`;function vr(e,t){let n=[];return e.run?.dispatches.forEach((r,i)=>{if(t.dispatches!==void 0&&i>=t.dispatches)return;let a=n.find(e=>e.id===r.node)??n[n.push({id:r.node,name:e.nodes.find(e=>e.id===r.node).name,words:[],total:``,sum:0,some:!1,more:!1})-1];a.words.push(`${r.round===null?``:`${e.loops.find(e=>e.id===r.loop)?.name??``} round ${r.round}, `}${r.minutes===null?`no time`:_r(r.minutes)}${r.outcome===`pass`||!r.outcome?``:`, ${r.outcome}`}`),a.sum+=Math.round((r.minutes??0)*10)/10,a.some||=r.minutes!==null,a.more||=r.minutes===null,a.total=a.more?a.some?`${_r(a.sum)} and more`:`no time`:_r(a.sum)}),n}const yr={yaw:-.18,pitch:.44},br=({card:e,edgeLine:t,hue:n,lerp:r})=>(i,a)=>{let o=[],s=Object.create(null),c=(e,t,n,r,i,a,s={})=>{let[c,l,u,d]=[e[0]-t/2,e[0]+t/2,e[2]-n/2,e[2]+n/2],f=(e,t)=>void o.push({t:`poly`,pts:e,fill:a,fa:t,stroke:`card`,w:.8,...s});f([[c,r,u],[l,r,u],[l,i,u],[c,i,u]],.5),f([[c,r,u],[c,r,d],[c,i,d],[c,i,u]],.62),f([[l,r,u],[l,r,d],[l,i,d],[l,i,u]],.62),f([[c,r,d],[l,r,d],[l,i,d],[c,i,d]],.8),f([[c,i,u],[l,i,u],[l,i,d],[c,i,d]],1)};for(let t of i.nodes){let n=s[t.id]=[t.at[0]*hr,0,t.at[1]*gr],r=5;if(i.run){c(n,66,42,0,4,`floor`),r=4,i.run.dispatches.forEach((e,i)=>{if(e.node!==t.id||a.dispatches!==void 0&&i>=a.dispatches)return;let o=Math.max(1,(e.minutes??0)*7.5);c(n,58,36,r,r+o,e.outcome===`pass`?`ok`:e.outcome===`fail`?`bad`:`ink-3`,{key:`node:${t.id}`,...e.minutes===null?{alpha:.4}:{}}),r+=o});let e=vr(i,a).find(e=>e.id===t.id);e&&o.push({t:`text`,at:[n[0]-33,r,n[2]+18],text:e.total,align:`right`,size:10,fill:`ink-2`,or:[{at:[n[0],r+12,n[2]],align:`center`}]})}else t.tier?(r=mr[t.tier]??mr.unset,c(n,58,36,0,r,`k-agent`,{key:`node:${t.id}`,...t.tier===`unset`?{alpha:.4}:{}}),o.push({t:`text`,at:[n[0]-33,r/2,n[2]+18],text:t.tier===`unset`?`session default`:t.tier,align:`right`,size:10,fill:`ink-2`,or:[{at:[n[0],r+12,n[2]],align:`center`}]})):c(n,58,36,0,5,`floor`,{key:`node:${t.id}`});o.push(e(t,[n[0]+29,0,n[2]+18],{stand:!0,side:!0,small:i.narrow,moves:[[hr,0,0],[0,0,gr]]}))}for(let e of i.loops.filter(e=>e.members.length>0)){let t=e.members.map(e=>s[e]),r=e.inside?0:12,[a,c,l,u]=[Math.min(...t.map(e=>e[0]))-48-r,Math.max(...t.map(e=>e[0]))+48+r,Math.min(...t.map(e=>e[2]))-38-r,Math.max(...t.map(e=>e[2]))+38+r];o.push({t:`poly`,pts:[[a,-1,l],[c,-1,l],[c,-1,u],[a,-1,u]],fill:n(i,e.id),fa:.14,stroke:n(i,e.id),key:`loop:${e.id}`,lift:-600}),o.push({t:`text`,at:[a-4,0,u],text:e.name,align:`right`,fill:n(i,e.id),size:10.5,bold:!0,or:[{at:[c+4,0,u]}]})}let l=Object.create(null),u=(e,t)=>{let[n,r]=[t[0]-e[0],t[2]-e[2]],i=n||r?Math.min(.5,35/Math.abs(n||1e-9),24/Math.abs(r||1e-9)):0;return n||r?[e[0]+n*i,1,e[2]+r*i]:[e[0]-35,1,e[2]]},d=e=>a.took.some(t=>t.edge===e&&(a.k===0||t.step<=a.k));i.edges.forEach((e,n)=>{let[a,c]=[u(s[e.from],s[e.to]),u(s[e.to],s[e.from])],f=i.edges.slice(0,n).filter(t=>t.from===e.from&&t.to===e.to||t.from===e.to&&t.to===e.from).length,p=Math.hypot(c[0]-a[0],c[2]-a[2]),[m,h]=p?((e,t)=>e>0||!e&&t<0?[-e,-t]:[e,t])((a[2]-c[2])/p,(c[0]-a[0])/p):[-1,0],g=(e.back||!p?34+p*.16:0)+18*f;for(let t of p?[...i.nodes,...i.nodes,...i.nodes]:[]){if(t.id===e.from||t.id===e.to)continue;let[n,r]=[s[t.id][0]-a[0],s[t.id][2]-a[2]],i=(n*(c[0]-a[0])+r*(c[2]-a[2]))/(p*p),o=n*m+r*h;i>.06&&i<.94&&Math.abs(o-g*4*i*(1-i))<44&&(g=Math.max(g,(44+o)/Math.max(.36,4*i*(1-i))))}l[e.id]=g?Array.from({length:19},(e,t)=>(e=>[e[0]+m*g*4*(t/18)*(1-t/18),e[1],e[2]+h*g*4*(t/18)*(1-t/18)])(r(a,c,t/18))):[a,c],o.push(t(i,e,l[e.id],i.run&&!d(e.id)?{alpha:.3}:{}))});for(let e of o)e.t!==`card`&&(e.grow=!0);return{prims:o,node:e=>s[e],path:e=>l[e]}},xr=[[`stairs`,`Stairs`,`Each loop is a floor with its own nodes standing on it; a loop inside it has a floor of its own.`],[`panes`,`Panes`,`The picture as it is, with each loop and each subgrooph lifted toward you on a pane of its own.`],[`spiral`,`Spiral`,`Each loop is a spiral: a round is one turn upward, and the brakes that count rounds are places on the way up, the lid where max iterations stops it.`],[`rings`,`Rings`,`Each loop is a ring, with its own nodes standing around it; a loop inside another is a ring standing on the outer one.`],[`columns`,`Columns`,`Every node where the picture has it, an agent as a column: taller for a higher tier (an order, not a model), and on a run a block for each dispatch, as tall as its own minutes.`]],Sr={"human-gate":[`Human gate`,`gate`],check:[`Check`,`check`],merge:[`Merge`,`merge`],stop:[`Stop`,`stop`]};function Cr(e){let t=new Map(d(e).flat().map((e,t)=>[e,t])),n=e=>!!e&&t.has(e.from)&&t.has(e.to),r=new Map(e.loops.flatMap(e=>e.back.map(t=>[t,e]))),i=e.edges.filter(e=>n(e)&&!r.has(e.id)).sort((e,n)=>t.get(e.from)-t.get(n.from)||t.get(e.to)-t.get(n.to)),a=[...r].map(([t,n])=>({edge:e.edges.find(e=>e.id===t),loop:n})).filter(e=>n(e.edge));return[...i.map(e=>({edge:e})),...a]}function wr(e,t,n,r){let[,,,,,,,,,,,,,,,i,,,,,,,a,,,,o,,s]=_n,c=i(`auto`),l=t=>e.nodes.find(e=>e.id===t)?.name||t,u=d(e).flat(),f=new Map(u.map((e,t)=>[e,t])),p=e.loops.map((e,t)=>({loop:e,k:t,members:new Set(e.members)})),m=(e.groups??[]).filter(e=>e.from),h=e=>{let t=p.filter(t=>t.members.has(e)).sort((e,t)=>e.members.size-t.members.size)[0];if(t)return`loop ${t.loop.id}`;let n=m.find(t=>t.members.includes(e));return n?`unit ${n.id}`:``},g=new Map;for(let t of u){let n=e.nodes.find(e=>e.id===t);(g.get(h(t))??g.set(h(t),[]).get(h(t))).push(n)}let _=e=>{let t=e.kind===`agent`&&e.by===`person`,[r,i]=e.kind===`agent`?t?[`Person · ${y(e)}`,`gate`]:[y(e),`accent`]:Sr[e.kind],l=e.kind===`agent`&&!t&&e.model?e.model.tier:``,u=s(e.name||e.id,n-16,12.5,3,`bold`),d=7+u.length*15+13+(l?11.5:0)+6;return{id:e.id,h:d,svg:()=>{let t=e.kind===`human-gate`?{fill:c(`gate-soft`),stroke:c(`gate`),rx:12,width:1.8}:{fill:c(`surface`),stroke:c(e.kind===`agent`?`line-strong`:i),rx:e.kind===`stop`?2:8,width:e.kind===`agent`?1:1.4},f=5,p=u.map(e=>o(8,f+=15,e,{size:12.5,fill:c(`ink`),weight:`bold`}));return`<g data-node="${j(e.id)}" data-kind="${e.kind}">${a(.7,.7,n-1.4,d-1.4,{...t,mark:`card`})}${p.join(``)}${o(8,f+=13,s(r,n-16,9.5,1,`bold`)[0],{size:9.5,fill:c(i),weight:`bold`})}${l?o(8,f+11.5,l,{size:9,fill:c(`ink-3`)}):``}</g>`}}},v=[...g.keys()].filter(e=>e!==``).sort((e,t)=>f.get(g.get(e)[0].id)-f.get(g.get(t)[0].id)),b=[...g.has(``)||v.length===0?[``]:[],...v].map((t,n)=>{let r=(g.get(t)??[]).map(_),i=p.find(e=>`loop ${e.loop.id}`===t),a=m.find(e=>`unit ${e.id}`===t);if(i){let e=p.filter(e=>e!==i&&i.loop.members.every(t=>e.members.has(t))).sort((e,t)=>e.members.size-t.members.size)[0];return{cls:``,mark:`data-loop="${j(i.loop.id)}"`,name:i.loop.name||i.loop.id,place:`loop`,sub:`${e?`inside ${e.loop.name||e.loop.id} · `:``}stops: ${i.loop.stops.map(O).join(`; `)}`,gap:n===0?0:1,items:r}}return a?{cls:``,mark:`data-unit="${j(a.id)}"`,name:a.name||a.id,place:`subgrooph`,sub:`from ${a.from}`,gap:n===0?0:1,items:r}:{cls:` is-people`,mark:`data-outside=""`,name:v.length?`Outside any loop`:e.name||e.id,place:``,sub:v.length?`what a run passes once`:`no loop`,gap:0,items:r}}),x=Cr(e),S=x.map(({edge:t,loop:n},r)=>({id:t.id,n:r+1,from:t.from,to:t.to,style:n?{color:`loop-${e.loops.indexOf(n)%4}`,dash:`6 4`,width:2.2}:{color:`ink-2`,width:1.6}})),C=x.length,w=[{short:`all steps`,says:C===0?`This graph has no edges to step through.`:C===1?`The graph's one edge is lit.`:`All ${C} steps are lit. Move the slider or press Play to follow a first pass, one edge at a time.`}];x.forEach(({edge:e,loop:t},n)=>{let r=T(e)===`always`?``:` · when ${E(e)}`;w.push({handoff:e.id,short:`step ${n+1} of ${C}`,says:`Step ${n+1} of ${C}: ${e.from===e.to?`${l(e.from)} to itself`:`${l(e.from)} to ${l(e.to)}`}${r}${t?` · back into ${t.name||t.id}: another round, until ${t.stops.map(O).join(`; `)}`:``}`})});let D={title:e.name||e.id,sheets:b,links:S,per:t,link:`edge`,links_:`edges`,none:` · no nodes`,flat:` The picture shows the same graph, flat. <button type="button" data-flat="picture">Picture</button>`};if(r?.length){let t=Wn(r,e),n=new Set(b.map(e=>e.mark)),i=t=>t?.kind===`edge`?{handoff:t.id}:t?.kind===`node`?{ends:[t.id]}:t?.kind===`loop`?n.has(`data-loop="${j(t.id)}"`)?{sheet:`data-loop="${j(t.id)}"`}:{ends:e.loops.find(e=>e.id===t.id)?.members??[]}:{};return{...D,stops:t.steps.map((e,t)=>t===0?{short:`before the run`,says:`Before the run: ${r.length} note${r.length===1?``:`s`} to follow. Move the slider or press Play.`}:{short:`note ${t} of ${r.length}`,says:`Note ${t} of ${r.length}: ${e.caption}`,alone:!0,...i(e.focus)}),step:`note`,range:`Note, in the order the run wrote them`,note:`The run's own notes, in the order it wrote them. ${t.end.line}`}}return{...D,stops:w,range:`Step, in the order a first pass takes them`,note:`The edges a first pass takes, in order, and then one turn of each loop. An order, not a clock: a graph records no times.`}}const Tr={agent:[`agent`,`Agent`],check:[`check`,`Check`],"human-gate":[`gate`,`Human gate`],merge:[`gate`,`Merge`],stop:[`stop`,`Stop`]};function Er(e){let t=e.groups??[],n=new Map(t.map(e=>[e,t.filter(t=>t.id!==e.id&&e.members.includes(t.id))])),r=new Map(t.map(e=>{let t=new Set,r=new Set([e]);for(let i=[...n.get(e)];i.length;){let e=i.pop();t.add(e.id),r.has(e)||(r.add(e),i.push(...n.get(e)))}return[e,t]})),i=new Map,a=e=>{if(i.has(e))return i.get(e);let n=t.filter(t=>t.id!==e&&t.members.includes(e)),a=(n.find(e=>!n.some(t=>t.id!==e.id&&r.get(e).has(t.id)))??n[0])?.id??null;return i.set(e,a),a},o=(n,r)=>r.has(n)?[]:(r.add(n),[...e.nodes.filter(e=>a(e.id)===n).map(e=>e.id),...t.filter(e=>a(e.id)===n).flatMap(e=>o(e.id,r))]);return t.map(e=>({id:e.id,name:e.name||e.id,from:e.from??null,nodes:o(e.id,new Set),inside:a(e.id)}))}const Dr=e=>e<640?2:4;function Or(e,t,n,r=!1){let i=d(e),a=new Map(i.flat().map((e,t)=>[e,t])),o=t,s=t=>e.nodes.some(e=>e.id===t),c=t=>e.nodes.find(e=>e.id===t)?.name||t,l=e=>e.members.filter(s),u=t=>l(t).length?e.loops.filter(e=>e.id!==t.id&&l(e).length>l(t).length&&l(t).every(t=>e.members.includes(t))).sort((e,t)=>l(e).length-l(t).length)[0]?.id??null:null,f=e.loops.map(t=>{let n=e=>t.stops.find(t=>t.kind===e),r=n(`budget`),i=t.stops.flatMap(e=>e.kind===`max-iterations`?[e.n]:[]),o=t.stops.flatMap(e=>e.kind===`budget`&&e.measure===`dispatches`?[e.limit]:[]);return{id:t.id,name:t.name||t.id,inside:u(t),members:l(t).sort((e,t)=>(a.get(e)??0)-(a.get(t)??0)),own:[],back:t.back,stops:t.stops.map(O),brakes:t.stops.flatMap(e=>e.kind===`max-iterations`?[{kind:e.kind,n:e.n}]:e.kind===`budget`?[{kind:e.kind,measure:e.measure,limit:e.limit}]:e.kind===`human`?[{kind:e.kind,every:e.every??null}]:[]),cap:i.length?i.reduce((e,t)=>Math.min(e,t)):null,budget:r?{measure:r.measure,limit:r.limit}:null,dispatches:o.length?o.reduce((e,t)=>Math.min(e,t)):null,human:n(`human`)?.every??null,perRound:t.members.map(t=>e.nodes.find(e=>e.id===t)).filter(e=>e?.kind===`check`||e?.kind===`agent`&&e.role!==`lead`&&!x(e)).length}}),p=e=>f.filter(t=>t.members.includes(e)).sort((e,t)=>e.members.length-t.members.length)[0]?.id??null;for(let e of f)e.own=e.members.filter(t=>p(t)===e.id);let m=new Map(e.loops.flatMap(e=>e.back.map(t=>[t,e.id]))),h=e.edges.filter(e=>s(e.from)&&s(e.to)),g=h.filter(e=>!m.has(e.id)&&a.has(e.from)&&a.has(e.to)).sort((e,t)=>a.get(e.from)-a.get(t.from)||a.get(e.to)-a.get(t.to)),_=[...m].flatMap(([e,t])=>h.filter(t=>t.id===e&&a.has(t.from)&&a.has(t.to)).map(e=>({e,loop:t}))),v={narrow:r,id:e.id,name:e.name||e.id,rows:i,nodes:e.nodes.map(e=>({id:e.id,name:e.name||e.id,kind:x(e)?`person`:Tr[e.kind][0],word:x(e)?S.person:Tr[e.kind][1],line:e.kind===`agent`?x(e)?`${S.person} · ${y(e)}`:[y(e),e.model?.tier??`session default`,e.effort].filter(Boolean).join(` · `):Tr[e.kind][1],tier:e.kind===`agent`&&!x(e)?e.model?.tier??`unset`:null,loop:p(e.id),at:[o[e.id]?.x??0,o[e.id]?.y??0]})),edges:h.map(e=>({id:e.id,from:e.from,to:e.to,when:T(e)?E(e):``,back:m.get(e.id)??null,on:e.when})),loops:f,groups:Er(e),pass:[...g.map(e=>({e,loop:null})),..._].map(({e,loop:t})=>({edge:e.id,loop:t,says:`${e.from===e.to?`${c(e.from)} to itself`:`${c(e.from)} to ${c(e.to)}`}${T(e)===`always`?``:` · when ${E(e)}`}${t?` · back into ${f.find(e=>e.id===t).name}: another round, until ${f.find(e=>e.id===t).stops.join(`; `)}`:``}`}))};if(n?.length){let t=Wn(n,e),r=new Map,i=[],a=e=>!!f.find(t=>t.id===e)?.inside,o=(e,t)=>{for(let n=f.find(t=>t.id===e)?.inside;n;n=f.find(e=>e.id===n)?.inside)if(n===t)return!0;return!1},c=Object.create(null),l=Object.create(null),u=Ar(v.edges),d=!1;for(let{focus:e,note:n}of t.steps.slice(1))if(e&&n){if(e.kind===`node`&&s(e.id)){let t=p(e.id),r=u.into(e.id).flatMap(e=>e.back?[e.back]:[]);for(let e of f)r.some(t=>o(e.id,t))&&delete l[e.id];t&&a(t)&&n.round!==void 0&&(d||=r.some(e=>o(t,e))?n.round!==0:r.includes(t)&&n.round<=(l[t]??-1),c[t]=l[t]=n.round),u.at(e.id,{round:null,outcome:n.outcome??null,verdict:n.verdict??null,open:n.outcome===`started`})}else e.kind===`loop`&&(n.round!==void 0&&(d||=n.round>(c[e.id]??n.round),c[e.id]=void 0),n.stop!==void 0&&u.stopped(e.id,n.stop===`human`))}let m=Object.create(null),g=Object.create(null),_=Ar(v.edges),y=t.steps.slice(1).map(t=>{let n=t.note,c=t.focus??{kind:`graph`},l=c.kind===`graph`||(c.kind===`node`?s(c.id):c.kind===`edge`?h.some(e=>e.id===c.id):f.some(e=>e.id===c.id))?c:{kind:`graph`},u=n.proposal?.summary??n.amendment?.summary??n.text??``,v=l.kind===`node`?e.nodes.find(e=>e.id===l.id):void 0,y=v?p(v.id):l.kind===`loop`?l.id:null,b=d&&v&&a(y)?void 0:n.round;for(let e of new Set(v?_.into(v.id).flatMap(e=>e.back?[e.back]:[]):[])){(e!==y||b===void 0)&&(m[e]=(m[e]??0)+1);for(let t of f)o(t.id,e)&&(m[t.id]=0)}let S=y?m[y]=b??m[y]??0:null;v&&_.at(v.id,{round:S,outcome:n.outcome??null,verdict:n.verdict??null,open:n.outcome===`started`}),l.kind===`loop`&&n.stop!==void 0&&_.stopped(l.id,n.stop===`human`);for(let e in m)g[e]=Math.max(g[e]??0,m[e]);let C={says:t.caption,about:l.kind,id:`id`in l?l.id:null,round:S,outcome:n.outcome??null,verdict:n.verdict??null,what:n.proposal?`proposal`:n.amendment?`amendment`:null,open:n.outcome===`started`,stop:l.kind===`loop`?n.stop??null:null,words:u.length>150?`${u.slice(0,u.lastIndexOf(` `,150))} …`:u};if(v&&(v.kind===`agent`||v.kind===`check`)&&!x(v)&&n.outcome&&n.outcome!==`started`){let e=e=>(Date.parse(n.ended??``)-Date.parse(e??``))/6e4,t=e(n.started)>=0?e(n.started):e(r.get(v.id));C.dispatch=i.push({node:v.id,loop:y,round:S,outcome:n.outcome??null,minutes:t>=0?t:null})-1,r.delete(v.id)}else v&&n.outcome===`started`&&n.started&&r.set(v.id,n.started);return C});v.run={end:t.end.line,at:t.end.at&&s(t.end.at.id)?t.end.at.id:null,dispatches:i,most:g,notes:y,rounds:Object.assign(Object.create(null),Object.fromEntries(t.end.loops.map(e=>[e.loop,e.round??-1])))}}return v}function kr(e,t,n){for(let r=e.find(e=>e.id===t)?.inside??null,i=0;r&&i<=e.length;r=e.find(e=>e.id===r)?.inside??null,i+=1)if(r===n)return!0;return!1}function Ar(e){let t=new Map,n=new Map,[r,i,a,o]=[0,null,null,null];return{into(r,s){if(a===r)return[];let c=n.get(r)??-1;return[...t].filter(([e,t])=>!t.open&&(e===r||t.k>c)).sort(([e,t],[n,r])=>Number(n===i)-Number(e===i)||r.k-t.k).flatMap(([t,n])=>{let i=e.filter(e=>e.from===t&&e.to===r&&!(e.back&&n.not.has(e.back)&&(s||e.back!==o))),a=i.find(e=>typeof e.on==`object`&&e.on.verdict===n.verdict)??i.find(e=>typeof e.on==`string`&&e.on===n.routes)??i.find(e=>e.on===void 0||e.on===`always`);return a?[{...a,r0:n.round??0}]:[]})},at(e,s){r+=1;let c=t.get(e);(s.open?!c||c.open:(s.outcome??s.verdict)!==null)&&t.set(e,{...s,k:r,routes:s.outcome===`invalid-evidence`&&c?.outcome===`invalid-evidence`&&!c.open&&c.round===s.round?`fail`:s.outcome,not:new Set}),n.set(e,r),[i,a,o]=[e,s.open?e:null,s.open||(s.outcome??s.verdict)!==null?null:o]},stopped(e,n){for(let n of t.values())n.not.add(e);(n||o===e)&&(o=n?e:null)}}}function jr(e){let t=t=>e.edges.find(e=>e.id===t);if(!e.run)return e.pass.length?[{says:e.pass.length===1?`The graph's one edge is lit.`:`All ${e.pass.length} steps are lit. Move the slider or press Play to follow a first pass, one edge at a time.`},...e.pass.map((n,r)=>{let i=t(n.edge);return{says:`Step ${r+1} of ${e.pass.length}: ${n.says}`,edge:i.id,nodes:[i.from,i.to],from:i.from,to:i.to,r0:0,r1:+!!n.loop,...n.loop?{loops:[]}:{}}})]:[{says:`This graph has no edges to step through.`}];let{notes:n,dispatches:r,end:i}=e.run,a=e.loops.flatMap(e=>{let t=[...new Set(r.flatMap(t=>t.loop===e.id&&t.round!==null?[t.round]:[]))];return t.length?[`round${t.length===1?``:`s`} ${t.length>2?`${t.slice(0,-1).join(`, `)} and ${t[t.length-1]}`:t.join(` and `)} of ${e.name}`]:[]}),o=[{says:`The whole run: ${r.length} dispatch${r.length===1?``:`es`}${a.length?`, in ${a.join(`; `)}`:``}. ${i} Move the slider or press Play to follow its ${n.length} notes.`}],s=Ar(e.edges),c=0,l=null;n.forEach((t,r)=>{let i=`Note ${r+1} of ${n.length}`,a={says:``,...t.dispatch===void 0?{}:{dispatch:t.dispatch}};if(t.about===`node`&&t.id){let e=t.round??0,[n,...r]=s.into(t.id);Object.assign(a,{says:`${i}: ${t.says}`,nodes:[t.id],to:t.id,r1:e},n?{edge:n.id,from:n.from,r0:n.r0}:{},r.length?{also:r.map(e=>({edge:e.id,r0:e.r0}))}:{}),s.at(t.id,{round:t.round,outcome:t.outcome,verdict:t.verdict,open:t.open}),[c,l]=[e,t.id]}else if(t.about===`loop`&&t.id)Object.assign(a,{says:`${i}: ${t.says}`,loops:[t.id]}),t.stop&&s.stopped(t.id,t.stop===`human`);else if(t.about===`edge`&&t.id){let n=e.edges.find(e=>e.id===t.id);Object.assign(a,{says:t.what?`${i}, a ${t.what} about the edge ${t.says}, not a move along it: ${t.words}`:`${i}, at the edge ${t.says}: ${t.words}`},n?{edge:n.id,nodes:[n.from,n.to],about:!0,r0:c}:{})}else a.says=`${i}, ${t.what?`an ${t.what}`:`about the run`}: ${t.words}`;o.push(a)});let u=o[n.map(e=>e.about===`graph`&&e.outcome!==null).lastIndexOf(!0)+1],d=e.run.at;if(d&&d!==l&&u!==o[0]&&!u.nodes&&!u.edge&&!u.loops){let[e,...t]=s.into(d,!0);e&&Object.assign(u,{nodes:[d],to:d,edge:e.id,from:e.from,r0:e.r0,r1:0},t.length?{also:t.map(e=>({edge:e.id,r0:e.r0}))}:{})}return o}var Mr=t({TAU:()=>Nr,along:()=>Gr,arch:()=>Ur,by:()=>Fr,card:()=>Lr,circle:()=>Rr,edgeLine:()=>Wr,ground:()=>Hr,hue:()=>Ir,lerp:()=>Pr,reach:()=>Kr,shownAt:()=>qr,stationOf:()=>Vr,stations:()=>Br});const Nr=Math.PI*2,Pr=(e,t,n)=>[e[0]+(t[0]-e[0])*n,e[1]+(t[1]-e[1])*n,e[2]+(t[2]-e[2])*n],Fr=(e,t)=>e.find(e=>e.id===t),Ir=(e,t)=>`loop-${e.loops.findIndex(e=>e.id===t)%4}`,Lr=(e,t,n={stand:!0})=>({t:`card`,at:t,id:e.id,key:`node:${e.id}`,...n}),Rr=(e,t,n,r=40,i=0,a=Nr)=>Array.from({length:r+1},(o,s)=>[e[0]+t*Math.cos(i+(a-i)*s/r),n,e[2]+t*Math.sin(i+(a-i)*s/r)]),zr=e=>{let t=new Map(e.rows.flat().map((e,t)=>[e,t]));return n=>t.get(n)??e.rows.flat().length};function Br(e,t){let n=zr(e),r=e.loops.filter(e=>e.inside===t.id),i=t.members.filter(e=>!t.own.includes(e)&&!r.some(t=>t.members.includes(e)));return[...t.own.map(e=>({node:e,first:n(e)})),...r.map(e=>({loop:e,first:Math.min(...e.members.map(n))})),...i.map(e=>({away:e,first:n(e)}))].sort((e,t)=>e.first-t.first)}const Vr=(e,t)=>e.findIndex(e=>e.node===t||e.away===t||!!e.loop?.members.includes(t));function Hr(e){let t=zr(e);return[...e.nodes.filter(e=>!e.loop).map(e=>({node:e.id,first:t(e.id)})),...e.loops.filter(e=>!e.inside).map(e=>({loop:e,first:Math.min(...e.members.map(t))}))].sort((e,t)=>e.first-t.first)}const Ur=(e,t,n,r=16)=>Array.from({length:r+1},(i,a)=>{let o=Pr(e,t,a/r);return[o[0],o[1]+n*4*(a/r)*(1-a/r),o[2]]}),Wr=(e,t,n,r={})=>({t:`line`,pts:n,stroke:t.back?Ir(e,t.back):`ink-2`,...t.back?{dash:[6,4]}:{},w:t.back?1.8:1.4,arrow:!0,key:`edge:${t.id}`,inset:[2,1],from:t.from,to:t.to,...r}),Gr=(e,t)=>{let n=Math.max(0,Math.min(1,t))*(e.length-1),r=Math.min(e.length-2,Math.floor(n));return e.length<2?e[0]:Pr(e[r],e[r+1],n-r)};function Kr(e,t,n){let[r,i]=[{},{}];for(let a of t.slice(1,n+1)){let t=a.to;if(!t)continue;let n=new Set(a.about?[]:[a.edge,...(a.also??[]).map(e=>e.edge)].flatMap(t=>e.edges.find(e=>e.id===t)?.back??[]));for(let t of n)for(let n of e.loops)kr(e.loops,n.id,t)&&(i[n.id]=0);for(let o of e.loops){if(!o.members.includes(t))continue;o.own.includes(t)?i[o.id]=a.r1??0:i[o.id]=(i[o.id]??0)+ +!!n.has(o.id);let s=Br(e,o),c=i[o.id]+Math.max(0,Vr(s,t))/s.length;r[o.id]={now:c,most:Math.max(c,r[o.id]?.most??0)}}}return r}function qr(e,t,n){let r=t[n],i=e=>e.edge&&!e.about?[{edge:e.edge,r0:e.r0??0},...e.also??[]].map(t=>({...t,r1:e.r1??0})):[],a=r.about&&r.edge?[`edge:${r.edge}`]:i(r).flatMap(e=>[`edge:${e.edge}`,`edge:${e.edge}@${e.r0}>${e.r1}`]),o=[...(r.nodes??[]).map(e=>`node:${e}`),...a,...(r.loops??[]).map(e=>`loop:${e}`)],s={k:n,lit:o.length?new Set(o):null,took:e.run?t.flatMap((e,t)=>i(e).map(e=>({...e,step:t}))):[]};return r.about&&r.edge&&(s.about={edge:r.edge,r0:r.r0??0}),e.run&&n>0&&(s.dispatches=t.slice(1,n+1).filter(e=>e.dispatch!==void 0).length),e.run&&(s.until=Kr(e,t,n||t.length-1)),s}const[Jr,Yr]=[.8,.4];function Xr(e,t){let n=[...e.map(e=>({loop:e,name:e.name,ids:e.members,sub:`loop`,depth:0})),...t.filter(e=>e.from).map(e=>({group:e,name:e.name,ids:e.nodes,sub:`subgrooph, from ${e.from}`,depth:0}))].filter(e=>e.ids.length>0),r=(e,t,n)=>{for(let r=t.inside,i=0;r&&i<=e.length;r=e.find(e=>e.id===r)?.inside??null,i+=1)if(r===n.id)return!0;return!1},i=(e,t)=>e.ids.every(e=>t.ids.includes(e)),a=(n,a)=>n!==a&&(n.loop&&a.loop?r(e,a.loop,n.loop):n.group&&a.group?r(t,a.group,n.group):n.group?i(a,n):i(a,n)&&n.ids.length>a.ids.length);for(let e of n)e.depth=n.filter(t=>a(t,e)).length+1;return n}const Zr={yaw:-.86,pitch:.16},Qr=e=>{let t=[],n=Object.create(null),r=Xr(e.loops,e.groups),i=e=>Math.max(0,...r.filter(t=>t.ids.includes(e)).map(e=>e.depth));for(let t of e.nodes)n[t.id]=[t.at[0]*Jr,-t.at[1]*Yr,i(t.id)*84];for(let r of e.nodes)t.push(Lr(r,n[r.id],{moves:[[Jr,0,0],[0,-Yr,0]]}));let a=(e,t)=>{let r=e.map(e=>n[e]);return[Math.min(...r.map(e=>e[0]))-58-t,Math.max(...r.map(e=>e[0]))+58+t,Math.min(...r.map(e=>e[1]))-22-t,Math.max(...r.map(e=>e[1]))+22+t]},[o,s,c,l]=a(e.nodes.map(e=>e.id),42);t.push({t:`poly`,pts:[[o,c,-8],[s,c,-8],[s,l,-8],[o,l,-8]],fill:`floor`,fa:.7,stroke:`line-strong`,lift:-600}),t.push({t:`text`,at:[o+4,l+10,-8],text:`the picture`,fill:`ink-3`,size:10});for(let n of r){let[r,i,o,s]=a(n.ids,8+(4-Math.min(4,n.depth))*9),c=n.depth*84-12,l=n.loop?Ir(e,n.loop.id):`ink-3`;t.push({t:`poly`,pts:[[r,o,c],[i,o,c],[i,s,c],[r,s,c]],fill:l,fa:n.loop?.15:.08,stroke:l,...n.loop?{key:`loop:${n.loop.id}`}:{dash:[5,4]},w:1.3,lift:n.depth*30-80});let[u,d]=[[[r+4,s+10,c],[i-4,s+10,c]],[[r+4,o-10,c],[i-4,o-10,c]]],[f,p]=n.depth%2?[u,d]:[d,u];t.push({t:`text`,at:f[0],text:`${n.name} · ${n.sub}`,fill:l,size:10.5,bold:!0,max:200,or:[{at:f[1],align:`right`},{at:p[0]},{at:p[1],align:`right`},{at:[r-6,(o+s)/2,c],align:`right`},{at:[i+6,(o+s)/2,c]}]}),t.push({t:`line`,pts:[[r,o,-8],[i,o,-8],[i,s,-8],[r,s,-8],[r,o,-8]],stroke:l,w:1,dash:[2,4],alpha:.6})}let u=Object.create(null);return e.edges.forEach((r,i)=>{let[a,o]=[n[r.from],n[r.to]],s=e.edges.slice(0,i).filter(e=>e.from===r.from&&e.to===r.to||e.from===r.to&&e.to===r.from).length,c=r.back||r.from===r.to,l=(c?70+Math.abs(a[1]-o[1])*.2:0)+22*s,d=c?50:0,[f,p]=r.from===r.to?[1,0]:[o[1]-a[1],a[0]-o[0]],m=(f<0||!f&&p>0?-l:l)/(Math.hypot(f,p)||1);u[r.id]=l?Array.from({length:19},(e,t)=>(e=>[e[0]+m*f*4*(t/18)*(1-t/18),e[1]+m*p*4*(t/18)*(1-t/18),e[2]])(Pr([a[0]+d,a[1],a[2]],[o[0]+d,o[1],o[2]],t/18))):[a,o],t.push(Wr(e,r,u[r.id],{inset:[4,8]}))}),{prims:t,node:e=>n[e],path:e=>u[e]}},$r={yaw:-.5,pitch:.86},ei=({arch:e,by:t,card:n,circle:r,edgeLine:i,ground:a,hue:o,stations:s,TAU:c,under:l})=>(u,d)=>{let f=[],p=Object.create(null),m=Object.create(null),h=Object.create(null),g=e=>{let t=u.loops.filter(t=>t.inside===e.id).map(g),n=s(u,e).length;return Math.max(e.inside?60:84,n*(e.inside?30:40),...t.map(e=>e+30),t.length>1?(Math.max(...t)+20)/Math.sin(Math.PI/n):0)},_=e=>g(e)+Math.max(0,...u.loops.filter(t=>t.inside===e.id).map(_)),v=e=>64+Math.max(0,1.16*g(e)*Math.cos(Math.PI/s(u,e).length)),y=e=>(Math.PI-.5)%(c/e)-Math.PI/e,b=(e,t,n,r)=>(n=>[e[0]+t*Math.sin(n),e[1],e[2]-t*Math.cos(n)])(c*n/r+(e[1]?y(r):0));function x(e,i){let a=s(u,e),c=g(e);m[e.id]={c:i,r:c,stops:a};let l=o(u,e.id);f.push({t:`poly`,pts:[...r(i,c+15,i[1],48),...r(i,c-15,i[1],48).reverse()],fill:l,fa:.2,key:`loop:${e.id}`});let h=u.run?d.until?.[e.id]??null:void 0;f.push({t:`text`,at:[i[0]-(c+24)*.65,i[1],i[2]+(c+24)*.76],text:`${e.name}${h===void 0?``:h===null?`
4
+ not entered`:`\nround ${Math.floor(h.now)}`}`,align:`right`,bold:!0,fill:l,size:10.5,max:110}),a.forEach((e,r)=>{let s=b(i,c,r,a.length);if(e.node)p[e.node]=s,f.push(n(t(u.nodes,e.node),s,{stand:!0,small:u.narrow}));else if(e.loop){let t=[s[0],s[1]+v(e.loop),s[2]];f.push({t:`line`,pts:[s,t],stroke:o(u,e.loop.id),w:1.2,dash:[2,3]},{t:`dot`,at:s,r:4,fill:o(u,e.loop.id),lift:-3990}),x(e.loop,t)}else e.away&&f.push({t:`text`,at:s,text:`${t(u.nodes,e.away).name}: on ${t(u.loops,t(u.nodes,e.away).loop).name}`,align:`center`,fill:`ink-3`,size:10.5,max:96})})}let S=u.narrow?Math.tan(.5):0,C=a(u),w=0;for(let e of C)if(e.node)p[e.node]=[w*S,0,w],f.push(n(t(u.nodes,e.node),p[e.node],{stand:!0,side:!0,small:u.loops.length>0}),{t:`dot`,at:p[e.node],r:3,fill:`ink-2`,lift:-3990}),w+=78;else if(e.loop){let t=_(e.loop)+6,n=e=>(e=>e?.86*v(e)+n(e):0)(s(u,e)[0]?.loop);w+=w?56+n(e.loop):0,x(e.loop,[(w+t)*S,0,w+t]),w+=2*t+58}let T=(e,n)=>e.findIndex(e=>e.node===n||!!e.loop&&(t(u.nodes,n).loop===e.loop.id||l(u.loops,t(u.nodes,n).loop??``,e.loop.id))),E=e=>d.took.some(t=>t.edge===e&&(d.k===0||t.step<=d.k)),D=(e,t,n,r)=>{let i=p[e.id],[a,o,s,c]=[n[0]-t[0],n[2]-t[2],i[0]-t[0],i[2]-t[2]],l=Math.hypot(a,o)||1,u=Math.max(0,Math.min(1,(s*a+c*o)/(l*l))),d=((c-o*u)*a-(s-a*u)*o)/(o<0?-l:l),f=e.loop?62:34;return(r===null?Math.hypot(s-a*u,c-o*u):u>.06&&u<.94?Math.abs(d-r*4*u*(1-u)):f)+6<f?(f+(r===null?Math.abs(d):d))/Math.max(.36,4*u*(1-u)):0},O=(e,t,n)=>{let r=u.nodes.filter(t=>t.id!==e.from&&t.id!==e.to),i=r.reduce((e,r)=>e+D(r,t,n,null),0);for(let e of i?[...r,...r,...r]:[])i=Math.max(i,D(e,t,n,i));return i};u.edges.forEach((t,n)=>{let[a,o]=[p[t.from],p[t.to]],s=u.edges.slice(0,n).filter(e=>e.from===t.from&&e.to===t.to).length,l=u.loops.filter(e=>e.members.includes(t.from)&&e.members.includes(t.to)).sort((e,t)=>e.members.length-t.members.length)[0],d;if(l){let{c:e,r:n,stops:r}=m[l.id],[i,c,u]=[T(r,t.from),T(r,t.to),r.length],f=(t,r)=>Array.from({length:25},(i,a)=>b(e,n+16*s,t+(r-t)*a/24,u));i>=0&&c>=0&&!t.back&&c===i+1?d=f(i,c):i>=0&&c>=0&&t.back===l.id&&i===u-1&&c===0&&(d=f(i,u)),d&&=[...r[i].loop||s?[a]:[],...d,...r[c%u].loop||s?[o]:[]]}if(!d&&t.from===t.to){let e=l?m[l.id].c:[a[0]+1,0,a[2]],t=(26+8*s)/(Math.hypot(a[0]-e[0],a[2]-e[2])||1),n=[a[0]+(a[0]-e[0])*t,a[1],a[2]+(a[2]-e[2])*t],i=Math.atan2(a[2]-n[2],a[0]-n[0]);d=r(n,26+8*s,a[1],24,i,i+c)}let[g,_]=[O(t,a,o),Math.hypot(o[0]-a[0],o[2]-a[2])||1],[v,y]=[(o[2]-a[2])/_,(o[0]-a[0])/_].map(e=>o[2]<a[2]?-e:e);h[t.id]=d??e(a,o,(t.back?54:0)+22*s,18).map((e,t)=>[e[0]-v*g*4*(t/18)*(1-t/18),e[1],e[2]+y*g*4*(t/18)*(1-t/18)]),f.push(i(u,t,h[t.id],u.run&&!E(t.id)?{alpha:.3}:{}))});for(let e of f)e.t!==`card`&&(e.grow=!0);return{prims:f,node:e=>p[e],path:e=>h[e]}},ti=(e,t)=>{let n=t.cap??Math.max(e.run?(e.run.most[t.id]??-1)+1:1,1)+2;return Number.isFinite(n)?Math.min(50,Math.max(1,n)):50};function ni(e,t){let n=e.cap,r=e.brakes.findIndex(e=>e.kind===`max-iterations`&&e.n===n),i=e.brakes.map((e,i)=>{if(e.kind!==`human`||!e.every||!(e.every>=1))return null;let a=Array.from({length:Math.floor(t/e.every)},(t,n)=>(n+1)*e.every);return{within:a,drawn:a.filter(e=>n===null||e<n||e===n&&i<r)}}),a=[...new Set(i.flatMap(e=>e?.drawn??[]))].sort((e,t)=>e-t),o=e.dispatches!==null&&e.perRound?e.dispatches/e.perRound:null,s=o!==null&&o<=t+1.5?o:null,c=e.brakes.map((r,a)=>{if(r.kind===`max-iterations`)return`max iterations: ${r.n}${r.n===n?` (the lid, over round ${r.n-1}${r.n>t?`: not drawn, above the ${t} rounds shown`:``})`:` (a looser cap: the lid stops the loop first)`}`;if(r.kind===`human`){let e=i[a];if(!e)return`human halt (no place on the way up)`;let t=e.drawn.length?`the amber ring${e.drawn.length===1?``:`s`}`:e.within.length?`no ring: only at the lid, where the cap is looked at first`:`not within the rounds drawn`;return`a person is asked every ${r.every===1?`round`:`${r.every} rounds`} (${t})`}if(r.measure!==`dispatches`||!e.perRound)return`budget: ${r.limit} ${r.measure} (no place on the way up)`;let[o,c]=[Math.floor(r.limit/e.perRound),r.limit%e.perRound];return`budget: ${r.limit} dispatches, at most ${o} full round${o===1?``:`s`}${c?` and ${c} more`:``}${r.limit===e.dispatches?s===null?` (not drawn: above the rounds shown)`:` (the dashed ring, a reading)`:` (a looser budget)`}`});return n===null&&c.unshift(`no lid: no cap on rounds`),{words:c,lid:n,asked:a,budget:s}}const ri=e=>e===`pass`?`ok`:e===`fail`?`bad`:`ink-3`,ii={yaw:-.42,pitch:.3},ai=(e,t)=>{let n=[],r=Object.create(null),i=Object.create(null),a=t=>Math.max(e.narrow?76:64,Br(e,t).length*(e.narrow?31:27)),o=(e,t,n=0)=>[e.c[0]-(e.r+n)*Math.cos(Nr*t),e.c[1]+t*54,e.c[2]+(e.r+n)*Math.sin(Nr*t)],s=(e,t,n)=>{let r=Math.max(1,Math.ceil(Math.abs(n-t)*36));return Array.from({length:r+1},(i,a)=>o(e,t+(n-t)*a/r))};function c(c,l){let u=Br(e,c),d=Math.max(1,u.length),f=i[c.id]={c:l,r:a(c),stops:u,k:d},p=Ir(e,c.id),m=e.run?t.until?.[c.id]??null:null,h=e.run?m?.most??null:(d-1)/d,g=ti(e,c);n.push({t:`poly`,pts:Rr(l,f.r+12,l[1]),fill:`floor`,fa:.8,stroke:`line`,lift:-400}),n.push({t:`line`,pts:[[l[0],l[1],l[2]],[l[0],l[1]+g*54,l[2]]],stroke:`line-strong`,w:1}),n.push({t:`line`,pts:s(f,0,g),stroke:p,w:1.3,alpha:.5,dash:[3,4]}),h!==null&&h>0&&n.push({t:`line`,pts:s(f,0,Math.min(h,g)),stroke:p,w:3.2,key:`loop:${c.id}`});let _=ni(c,g);_.lid!==null&&_.lid<=g&&n.push({t:`poly`,pts:Rr(l,f.r+18,l[1]+_.lid*54),fill:`brake`,fa:.24,stroke:`brake`,w:1.8,lift:300});for(let e of _.asked)n.push({t:`line`,pts:Rr(l,f.r+(e===_.lid?9:18),l[1]+e*54),stroke:`k-gate`,w:2.2,lift:320});_.budget!==null&&n.push({t:`line`,pts:Rr(l,f.r+18,l[1]+_.budget*54),stroke:`brake`,w:1.2,dash:[4,4],alpha:.85});let v=Math.max(g,_.budget??0),y=e.run?m===null?`
5
+ not entered`:`\nround ${Math.floor(m.now)}${c.cap?`, lid over round ${c.cap-1}`:``}`:``;n.push({t:`text`,at:[l[0],l[1]+v*54+46,l[2]],text:`${c.name}${y}`,align:`center`,up:!0,fill:p,size:11,bold:!0,max:Math.max(120,2*f.r+30)}),u.forEach((t,i)=>{if(t.node){let a=o(f,i/d,46);r[t.node]=[a[0],a[1]-30,a[2]],n.push(Lr(Fr(e.nodes,t.node),r[t.node],{stand:!0,small:e.narrow}),{t:`line`,pts:[o(f,i/d),o(f,i/d,30)],stroke:p,w:1,alpha:.7})}else t.loop?n.push({t:`text`,at:o(f,i/d,e.narrow?84:34),text:`${t.loop.name}: the spiral ${e.narrow?`above`:`beside`}`,align:`center`,fill:Ir(e,t.loop.id),size:10.5,bold:!0,max:96}):t.away&&n.push({t:`text`,at:o(f,i/d,34),text:`${Fr(e.nodes,t.away).name}: on ${Fr(e.loops,Fr(e.nodes,t.away).loop).name}`,align:`center`,fill:`ink-3`,size:10.5,max:96})});let b=(e.run?.dispatches??[]).flatMap((e,n)=>{let r=u.findIndex(t=>t.node===e.node);return r<0||e.round===null?[]:[{d:e,i:r,round:e.round,shown:t.dispatches===void 0||n<t.dispatches}]}),x=new Map,S=new Map;for(let{i:e,round:t}of b)S.set(`${t}:${e}`,(S.get(`${t}:${e}`)??0)+1);for(let{d:e,i:t,round:r,shown:i}of b){let a=`${r}:${t}`,s=(x.get(a)??-1)+1;x.set(a,s);let c=Math.min(13,(f.r-10)/Math.max(1,S.get(a)-1));i&&r<g&&n.push({t:`dot`,at:o(f,r+t/d,-c*s),r:6,fill:ri(e.outcome),stroke:`card`})}}let l=[],u=t=>(e.loops.filter(e=>e.inside===t.id).forEach(u),void l.push({loop:t,first:0}));for(let t of Hr(e))t.loop?u(t.loop):l.push(t);let d=l.findIndex(e=>e.loop),f=l.length-1-[...l].reverse().findIndex(e=>e.loop),p=0;if(e.narrow&&d>=0){let t=0;for(let n of l){let i=n.loop?ti(e,n.loop):0,[o,s]=n.loop?[Math.max(i,ni(n.loop,i).budget??0)*54+96,.3*(a(n.loop)+50)+56]:[23,23];t+=o,n.loop?c(n.loop,[0,-t,0]):r[n.node]=[-60,-t,0],t+=s}}else l.forEach((e,t)=>{if(e.loop){let t=a(e.loop)+40;c(e.loop,[p+t,0,0]),p+=2*t+56}else d>=0&&t>d&&t<f&&(r[e.node]=[p+20,0,130],p+=190)});e.narrow&&d>=0||(d>=0?(l.slice(0,d).reverse().forEach((e,t)=>r[e.node]=[-170-t*56,0,-230-t*124]),l.slice(f+1).forEach((e,t)=>r[e.node]=[p-6+t*20,0,130+t*124])):(l.forEach((t,n)=>r[t.node]=e.narrow?[0,(l.length-1-n)*52,0]:[n*20,0,(n-(l.length-1)/2)*150]),n.push({t:`text`,at:e.narrow?[60,l.length*52+10,0]:[10*l.length,60,-75*l.length],text:`No loop in this graph: nothing goes round, and there is no spiral to draw.`,align:`center`,up:!0,fill:`ink-3`,size:11,max:220})));for(let t of l)t.node&&n.push(Lr(Fr(e.nodes,t.node),r[t.node],{stand:!0,side:!0,small:d>=0}),{t:`dot`,at:r[t.node],r:3,fill:`ink-2`,lift:-3990});let m=(t,n=0)=>{let a=e.loops.find(n=>n.id===Fr(e.nodes,t).loop),s=a&&i[a.id],c=s?s.stops.findIndex(e=>e.node===t):-1;return s&&c>=0?o(s,n+c/s.k):r[t]},h=t=>e.loops.find(e=>e.own.includes(t.from)&&e.own.includes(t.to)),g=(t,n=0,r=0)=>{let a=Fr(e.edges,t),c=e.edges.slice(0,e.edges.indexOf(a)).filter(e=>e.from===a.from&&e.to===a.to).length,u=h(a);if(u){let t=i[u.id],[l,d]=[t.stops.findIndex(e=>e.node===a.from),t.stops.findIndex(e=>e.node===a.to)],f=a.back===u.id;if(!a.back&&d===l+1||f&&l===t.k-1&&d===0)return s(t,n+l/t.k,(f?n+1:r)+d/t.k);let p=!a.back||f?r:kr(e.loops,u.id,a.back)?0:e.run?r:n;return Ur(o(t,n+l/t.k),o(t,p+d/t.k),26+14*c,18)}let d=(t,n)=>Fr(e.nodes,t).loop?n:0,f=Fr(e.nodes,a.to).loop,p=a.back?f&&kr(e.loops,f,a.back)?0:f===a.back||e.run?d(a.to,r):0:d(a.to,r),g=e=>l.findIndex(t=>t.node===e||!!t.loop?.own.includes(e)),[_,v]=[g(a.from),g(a.to)].sort((e,t)=>e-t),y=Fr(e.nodes,a.from).loop&&f?0:26*l.slice(_+1,v).filter(e=>e.node).length,[b,x]=[m(a.from,d(a.from,n)),m(a.to,p)];if(!e.narrow)return Ur(b,x,(a.back?40:y)+14*c,18);let S=e=>e.own.includes(a.from)||e.own.includes(a.to),C=e.loops.flatMap(t=>[i[t.id].c[1]+ti(e,t)*54,...S(t)&&Math.abs((t.own.includes(a.from)?b:x)[1]-i[t.id].c[1])>=54?[i[t.id].c[1]]:[]].map(e=>({loop:t,u:(e-b[1])/(x[1]-b[1]||1)}))).filter(e=>e.u>0&&e.u<1),w=C.find(e=>S(e.loop))?.loop,T=!y&&(w?(w.own.includes(a.from)?b:x)[0]>0:b[0]>0&&x[0]>0)?1:-1,E=a.back?40:y*1.3;for(let{loop:e,u:t}of C)E=Math.max(E,(i[e.id].r+30-T*(b[0]+(x[0]-b[0])*t))/Math.max(.36,4*t*(1-t)));return E+=26*c+12*n+10*r,Ur(b,x,0,18).map((e,t)=>[e[0]+T*E*4*(t/18)*(1-t/18),e[1],e[2]])},_=new Set,v=(r,a,o,s={})=>{let c=`edge:${r.id}@${a}>${o}`;if(_.has(c))return;_.add(c);let l=r.back?void 0:h(r),u=l&&i[l.id],d=!!u&&u.stops.findIndex(e=>e.node===r.to)===u.stops.findIndex(e=>e.node===r.from)+1;n.push(Wr(e,r,g(r.id,a,o),{key:c,...d&&l?{hide:!t.lit?.has(c),stroke:Ir(e,l.id),w:3.2}:{},...s}))};for(let n of e.edges){let r=t.took.filter(e=>e.edge===n.id&&(t.k===0||e.step<=t.k));if(!e.run)v(n,0,+!!n.back);else if(r.length)for(let e of r)v(n,e.r0,e.r1);else t.took.some(e=>e.edge===n.id)||v(n,0,+!!n.back,{alpha:.3})}if(t.about){let r=Fr(e.edges,t.about.edge);n.some(e=>e.key?.startsWith(`edge:${r.id}@`))||v(r,0,+!!r.back,{alpha:.3});for(let e of n)e.key?.startsWith(`edge:${r.id}@`)&&(e.hide=!1,t.lit?.add(e.key))}for(let e of n)e.t!==`card`&&(e.grow=!0);return{prims:n,node:m,path:g}},oi={yaw:-.46,pitch:.46},si=e=>e.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g,``).replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`),ci={"claude-code":`Claude Code`,codex:`Codex`};function li(e,t){return e.place&&t.place&&e.place!==t.place?1.8:e.machine===t.machine?1:1.35}function ui(e){let t=e.working>0?`working`:e.waiting>0?`waiting`:(e.quiet??0)>0?`quiet`:`ended`,n=e.agentsRunning>0?` · ${e.agentsRunning} agent${e.agentsRunning===1?``:`s`}`:``;return{state:t,says:`${t===`quiet`?`gone quiet`:t}${t===`working`?n:``}`}}function di(e,t,n={}){let[,,,,,,,,,r,i,a,,,,o,,,,,,,s,,,c,l,u,d]=e,f=o(`auto`),p=Math.max(1,n.per??3),{sessions:m,people:h,handoffs:g,numberOf:_}=i(t),v=e=>t.sessions.find(t=>t.id===e)?.name||(t.people??[]).find(t=>t.id===e)?.name||e,y=(e,t,n,r,i,o=``,c)=>{let p=i>1?`×${i}`:``,m=p?u(p,9.5,`bold`)+10:0,h=d(t,e=>112-(p&&e===0?m+4:0),12.5,3,`bold`),g=c?ui(c):void 0,_=7+h.length*15+13+(o?11.5:0)+(g?15:0)+6;return{id:e,h:_,svg:()=>{let t=[s(.7,.7,126.6,_-1.4,n?{fill:f(`gate-soft`),stroke:f(`gate`),rx:12,width:1.4,mark:`card`}:{fill:f(`surface`),stroke:f(`line-strong`),rx:8,mark:`card`})],i=5;if(h.forEach((e,n)=>{i+=15,t.push(l(8,i,e,{size:12.5,fill:f(`ink`),weight:`bold`})),n===0&&p&&t.push(s(120-m,i-10.5,m,14,{fill:f(`accent-soft`),rx:7})+l(120-m/2,i,p,{size:9.5,fill:f(`accent`),weight:`bold`,anchor:`middle`}))}),i+=13,t.push(l(8,i,d(r,112,9.5,1,`bold`)[0],{size:9.5,fill:f(n?`gate`:r===`Codex`?`check`:`accent`),weight:`bold`})),o&&t.push(l(8,i+=11.5,d(o,112,9,1)[0],{size:9,fill:f(`ink-3`)})),g){i+=15;let e=f(g.state===`working`?`accent`:g.state===`waiting`?`warning`:`ink-3`),n=g.state===`working`||g.state===`ended`?`<circle cx="11" cy="${a(i-3.2)}" r="3.4" style="fill:${e}"/>`:`<circle cx="11" cy="${a(i-3.2)}" r="2.8" fill="none" stroke-width="1.6" style="stroke:${e}"/>`;t.push(n+l(18,i,d(g.says,104,9,1,`bold`)[0],{size:9,fill:e,weight:`bold`}))}return`<g data-${n?`person`:`session`}="${si(e)}"${g?` data-live="${g.state}"`:``}>${t.join(``)}</g>`}}},b=t.lanes,x=[...h.length?[{cls:` is-people`,mark:`data-people=""`,name:h.length===1?`Person`:`People`,sub:`on no machine, under no account`,place:``,gap:0,items:h.map(e=>y(e.id,e.name||e.id,!0,`person`,1))}]:[],...b.map((e,t)=>({cls:``,mark:`data-lane="${si(e.id)}"`,name:e.name||e.id,sub:`${e.machine} · ${e.account}`,place:e.place??``,gap:t===0?1:li(b[t-1],e),items:m.filter(t=>t.lane===e.id).map(e=>y(e.id,e.name||e.id,!1,Object.hasOwn(ci,e.harness)?ci[e.harness]:e.harness,e.count??1,e.model,n.live?.[e.id]))}))],S=g.map(e=>({id:e.id,n:_.get(e.id),from:e.from,to:e.to,style:c(e)})),C=g.length,w=[{short:`all handoffs`,says:C===0?`This map has no handoffs to step through.`:C===1?`The map's one handoff is lit.`:`All ${C} handoffs are lit. Move the slider or press Play to light them one at a time.`}];if(g.forEach((e,n)=>{let i=e.from===e.to?`${v(e.from)} to itself`:`${v(e.from)} to ${v(e.to)}`;w.push({handoff:e.id,short:`handoff ${S[n].n} of ${t.handoffs.length}`,says:`Handoff ${S[n].n} of ${t.handoffs.length}: ${i} · ${r(t,e)}${e.what?` · ${e.what}`:``}`})}),n.live){let e=Object.values(n.live).map(e=>ui(e).state),t=(t,n)=>e.includes(t)?[`${e.filter(e=>e===t).length} ${n}`]:[],r=[...t(`working`,`working`),...t(`waiting`,`waiting`),...t(`quiet`,`gone quiet`),...t(`ended`,`ended`)];w.push({now:!0,short:`now`,says:`Now${n.at?`, as the hooks saw it at ${n.at.slice(0,16).replace(`T`,` `)} UTC`:``}: ${r.length?r.join(`, `):`no session has been seen`}.`})}return{title:t.name||t.id,sheets:x,links:S,stops:w,per:p,link:`handoff`,links_:`handoffs`,none:` · no sessions`,range:`Handoff, in the order the map lists them`,note:`The order the map lists its handoffs in. An order, not a clock: a map records no times${n.live?`; the slider's last stop is now`:``}.`,flat:` The picture and the sequence show the same map, flat. <button type="button" data-flat="picture">Picture</button> <button type="button" data-flat="sequence">Sequence</button>`}}function fi({sheets:e,links:t,per:n}){let r=Math.max(1,Math.min(n,Math.max(...e.map(e=>e.items.length),1))),i=48+r*128+(r-1)*14,a=e=>48+(Math.max(1,Math.ceil(e/r))-1)*104,o=Math.max(0,...e.map(e=>a(e.items.length)))+Math.max(0,e.length-1)*34,s=Math.max(40,...e.flatMap(e=>e.items.map(e=>e.h))),c=new Map,l=[],u=[],d=0;e.forEach((t,n)=>{d+=s+(n===0?0:56*t.gap),l.push(d);let f=a(t.items.length),p=o-(e.length-1-n)*34,m=p-f,h=[];u.push({sheet:t,floor:d,front:p,back:m,depth:f,at:h}),t.items.forEach((e,n)=>{let a=Math.floor(n/r),o=Math.min(r,t.items.length-a*r),s=(i-o*128-(o-1)*14)/2+n%r*142,l=p-24-a*104;h.push([s,d-e.h,l]),c.set(e.id,{at:h[n],h:e.h})})});let f=new Map;t.forEach((e,t)=>{let[n,r]=[c.get(e.from),c.get(e.to)];(f.get(e.from)??f.set(e.from,[]).get(e.from)).push({arc:t,from:!0,toward:r.at[0]-n.at[0]}),(f.get(e.to)??f.set(e.to,[]).get(e.to)).push({arc:t,from:!1,toward:n.at[0]-r.at[0]})});let p=new Map;for(let[e,t]of f){let n=c.get(e);t.sort((e,t)=>e.toward-t.toward||e.arc-t.arc||(e.from?-1:1));let r=Math.min(11,108/Math.max(1,t.length-1));t.forEach((e,i)=>p.set(`${e.arc}${e.from?`a`:`b`}`,[n.at[0]+64+(i-(t.length-1)/2)*r,n.at[1],n.at[2]]))}let m=new Map,h=t.map((e,t)=>{let[n,r]=[p.get(`${t}a`),p.get(`${t}b`)],i=[e.from,e.to].sort().join(` `),a=m.get(i)??0;m.set(i,a+1);let o=Math.hypot(r[0]-n[0],r[1]-n[1],r[2]-n[2]);return{id:e.id,n:e.n,from:e.from,to:e.to,a:n,b:r,lift:16+o*.16+a*9}}),g={min:[0,0,0],max:[i,(l[l.length-1]??0)+36,o]};for(let e of h){let t=bi(e,oi.yaw,oi.pitch);for(let n of[0,1,2]){let r=(e.a[n]+e.b[n])/2+t[n]*(e.lift+9);g.min[n]=Math.min(g.min[n],r),g.max[n]=Math.max(g.max[n],r)}}return{width:i,placed:u,cards:c,arcs:h,floors:l,box:g}}const pi=(e,t)=>[e[0]-t[0],e[1]-t[1],e[2]-t[2]],mi=(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2],hi=(e,t)=>[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]],gi=(e,t)=>[e[0]*t,e[1]*t,e[2]*t],_i=e=>gi(e,1/(Math.hypot(e[0],e[1],e[2])||1));function vi(e,t,n){let[r,i]=[e[0]*Math.cos(t)+e[2]*Math.sin(t),-e[0]*Math.sin(t)+e[2]*Math.cos(t)];return[r,e[1]*Math.cos(n)+i*Math.sin(n),-e[1]*Math.sin(n)+i*Math.cos(n)]}const yi=(e,t)=>[-Math.cos(t)*Math.sin(e),-Math.sin(t),Math.cos(t)*Math.cos(e)];function bi(e,t,n,r){let i=_i(pi(e.b,e.a)),a=yi(t,n),o=pi(a,gi(i,mi(a,i)));if(Math.hypot(...o)<.001)return r??[0,-1,0];let s=_i(hi(_i(o),i)),c=vi(s,t,n);return(r?mi(s,r):Math.abs(c[1])>.2?-c[1]:-c[0])<0&&(s=gi(s,-1)),s}function xi(e,t,n){let r=(e,t)=>{let n=[...e],r=t;for(;n.length>2&&r>0;){let e=Math.hypot(n[1][0]-n[0][0],n[1][1]-n[0][1]);if(e>r)break;r-=e,n.shift()}let i=Math.hypot(n[1][0]-n[0][0],n[1][1]-n[0][1]);return i>r+1&&(n[0]=[n[0][0]+(n[1][0]-n[0][0])*r/i,n[0][1]+(n[1][1]-n[0][1])*r/i]),n};return r(r(e,t).reverse(),n).reverse()}function Si(e,[t,n,r,i]){let a=e=>e[0]>t&&e[0]<t+r&&e[1]>n&&e[1]<n+i;if(e.length<2||!a(e[e.length-1]))return null;let o=e.length-1;for(;o>0&&a(e[o-1]);)--o;if(o===0)return null;let[s,c]=[e[o-1],e[o]],[l,u]=[0,1];for(let e=0;e<12;e+=1)a([s[0]+(c[0]-s[0])*((l+u)/2),s[1]+(c[1]-s[1])*((l+u)/2)])?u=(l+u)/2:l=(l+u)/2;return[...e.slice(0,o),[s[0]+(c[0]-s[0])*l,s[1]+(c[1]-s[1])*l]]}function Ci(e){let[t,n]=[1/0,-1/0];for(let r of e)[t,n]=[Math.min(t,r),Math.max(n,r)];return[t,n]}const wi=xr.map(([e])=>e),Ti=(e,t=3)=>{let n=Math.round(e*10**t)/10**t;return(Object.is(n,-0)?0:n).toString()},Ei=(e,t,n)=>Math.max(t,Math.min(n,e));function Di(e,t){let n=t.layout===`phone`?400:800,[,r,i]=xr.find(([e])=>e===t.view)??xr[0],a=t.view===`stairs`?Vi(wr(e,ji(n),128),n,`edge`):Ri(e,t.view,n),o=e.name||e.id;return Mi(Ai(n,o,`${r}. ${i}`,`${o} as ${t.view===`stairs`?`the stairs`:Ni[t.view].as}`,t.view===`stairs`?`space`:t.view,a),t.theme??`auto`)}function Oi(e,t={}){let n=t.layout===`phone`?400:800,r=di(_n,e,{per:ji(n),...t.live?{live:t.live}:{},...t.at?{at:t.at}:{}}),i=e.name||e.id;return Mi(Ai(n,i,ki,`${i} as the stairs`,`space`,Vi(r,n,`handoff`)),t.theme??`auto`)}const ki=`Stairs. Each lane is a sheet, the people's on top; each session is a card standing on its lane's sheet, and each handoff an arc from one card to another, numbered as the map lists them.`;function Ai(e,t,n,r,i,a){let o=dt(`auto`),s=[],c=10;for(let n of Z(t,e-32,17,2,`bold`))c+=17,s.push(Q(16,c,n,{size:17,fill:o(`ink`),weight:`bold`})),c+=4;for(let t of Z(n,e-32,11.5,4))c+=14.5,s.push(Q(16,c,t,{size:11.5,fill:o(`ink-3`)}));let l=c+8,u=[],d=l+a.h;for(let{name:t,color:n,says:r}of a.key??[]){let i=X(`${t}:`,11,`bold`)-X(`${t}:`,11);Z(`${t}: ${r}`,t=>e-32-(t===0?i:0),11,6).forEach((e,r)=>{d+=15,u.push(r===0&&e.startsWith(`${t}: `)?`<text x="16" y="${Y(d)}" font-size="11"><tspan font-weight="700" style="fill:${o(n)}">${j(t)}:</tspan><tspan style="fill:${o(`ink-2`)}"> ${j(e.slice(t.length+2))}</tspan></text>`:Q(16,d,e,{size:11,fill:o(`ink-2`)}))}),d+=4}return yt(e,Math.ceil(d+(u.length?12:0)),r,`auto`,o,`${s.join(``)}<g transform="translate(0,${Y(l)})">${a.body}</g>${u.join(``)}`,i)}const ji=e=>e<640?3:e<900?4:6;function Mi(e,t){if(t===`auto`)return e;let n=dt(t);return e.replace(/<style>[^<]*<\/style>/,``).replace(/ style="[^"]*"/g,e=>e.replace(/var\(--gp-([a-z0-9-]+)\)/g,(e,t)=>n(t)))}const Ni={panes:{view:Qr,start:Zr,as:`panes`},spiral:{view:ai,start:ii,as:`a spiral for each loop`},rings:{view:ei({...Mr,under:kr}),start:$r,as:`a ring for each loop`},columns:{view:br(Mr),start:yr,as:`columns`}},Pi={ink:`ink`,"ink-2":`ink-2`,"ink-3":`ink-3`,line:`line`,"line-strong":`line-strong`,card:`surface`,ground:`bg`,floor:`surface-2`,accent:`accent`,"accent-soft":`accent-soft`,"loop-0":`loop-0`,"loop-1":`loop-1`,"loop-2":`loop-2`,"loop-3":`loop-3`,"k-agent":`accent`,"k-check":`check`,"k-gate":`gate`,"k-stop":`stop`,ok:`ok`,bad:`warning`,brake:`error`},Fi={agent:`accent`,check:`check`,person:`gate`,gate:`gate`,stop:`stop`},Ii={width:106,padding:[4,6,5,9],edge:4,radius:7,name:[11.5,1.25],line:[9.5,1.3],small:{min:56,max:150,padding:3}};function Li(e,t){let{width:n,padding:[r,i,a,o],edge:s,name:[c,l],line:[u,d]}=Ii,[f,p]=[c*l,u*d],m=s+o+i+1;if(t){let{min:t,max:n,padding:r}=Ii.small,i=[gt(e.name,n-m,c,`bold`)],a=e.kind===`person`?gt(e.line,n-m,u):null;return{w:Ei(Math.max(X(i[0],c,`bold`),a?X(a,u):0)+m,t,n),h:2+2*r+f+(a?p:0),names:i,line:a}}let h=Z(e.name,n-m,c,2,`bold`);return{w:n,h:2+r+a+h.length*f+p,names:h,line:gt(e.line,n-m,u)}}function Ri(e,t,n){let r=Ni[t],i=n<640,a=Or(e,p(e,Dr(n),u).positions,void 0,i),o=r.view(a,qr(a,jr(a),0)).prims,s=o.filter(e=>!e.hide),c=dt(`auto`),l=new Map(o.flatMap(e=>e.t===`card`?[[e.id,Li(a.nodes.find(t=>t.id===e.id),!!e.small)]]:[]));if(!a.nodes.length)return{body:Q(16,24,`This graph has no nodes to draw.`,{size:12,fill:c(`ink-3`)}),h:40};let{yaw:d,pitch:f}=r.start,m=e=>`pts`in e?e.pts:[e.at],h=o.flatMap(m),g=[0,1,2].map(e=>(([e,t])=>(e+t)/2)(Ci(h.map(t=>t[e])))),_=e=>{let[t,n,r]=[e[0]-g[0],e[1]-g[1],e[2]-g[2]],[i,a,o,s]=[Math.cos(d),Math.sin(d),Math.cos(f),Math.sin(f)],[c,l]=[t*i+r*a,-t*a+r*i];return[c,n*o-l*s,n*s+l*o]},v=(e,t)=>t*2600/(2600-e*t),y=(e,t)=>{if(e.t===`card`){let n=l.get(e.id),r=(e.small?n.w*t:106)/2+5;return e.side?e.small?[8,r*2,14,14]:[8,128,22,22]:e.stand?[r,r,Math.max(60,n.h*1.15+14),8]:[58,58,24,24]}return e.t===`text`?[8,8,e.up?16*e.text.split(`
6
+ `).length*1.6:12,12]:[3,3,3,3]},b=o.flatMap(e=>m(e).map(t=>[_(t),e])),x=e=>{let t=b.map(([t,n])=>[t,v(t[2],e),y(n,Ei(v(t[2],e),.72,1.15))]);return[Ci(t.map(([e,t,n])=>e[0]*t-n[0]))[0],Ci(t.map(([e,t,n])=>e[0]*t+n[1]))[1],Ci(t.map(([e,t,n])=>-e[1]*t-n[2]))[0],Ci(t.map(([e,t,n])=>-e[1]*t+n[3]))[1]]},S=Math.max(1,Ci(b.map(([e])=>e[2]))[1]),[C,w]=[Math.min(.05,650/S),Math.min(1,650/S)];if(x(w)[1]-x(w)[0]<=n-16)C=w;else for(let e=0;e<18;e+=1){let e=(C+w)/2,[t,r]=x(e);r-t<=n-16?C=e:w=e}let T=C,[E,D,O,k]=x(T),A=Math.ceil(k-O+16),M=[(E+D)/2/T,-(O+k)/2/T],N=e=>{let[t,r,i]=_(e),a=v(i,T);return[n/2+(t-M[0])*a,A/2-(r-M[1])*a,i,a]},P=e=>c(Pi[e]??`ink-2`),F=s.map(e=>{let t=m(e).map(N);return{p:e,pts:t,depth:t.reduce((e,t)=>e+t[2],0)/t.length+(e.t===`poly`?-90:e.t===`line`?-20:e.t===`dot`?4e3:e.t===`text`?60:0)+(e.lift??0)}}).sort((e,t)=>e.depth-t.depth),I=new Map,L=[];for(let{p:e,pts:t}of F){if(e.t!==`card`)continue;let n=l.get(e.id),r=a.nodes.find(t=>t.id===e.id),[i,o,,s]=t[0],u=Ei(s,.72,1.15),[d,f]=[n.w*u,n.h*u],p=[e.side?i+9:i-d/2,e.stand&&!e.side?o-f-13:o-f/2,d,f];I.set(e.id,p),L.push(Bi(r,n,p,u,c,!!e.small))}let ee=[],R=(e,t)=>Math.max(0,Math.min(e[0]+e[2],t[0]+t[2])-Math.max(e[0],t[0]))*Math.max(0,Math.min(e[1]+e[3],t[1]+t[3])-Math.max(e[1],t[1])),te=[];for(let{p:e,pts:t}of F){if(e.t===`card`)continue;let r=e.alpha??1,i=r<1?` opacity="${Ti(r,2)}"`:``,a=`dash`in e&&e.dash?` stroke-dasharray="${e.dash.join(` `)}"`:``;if(e.t===`poly`){let n=`M${t.map(e=>`${Y(e[0])},${Y(e[1])}`).join(` L`)} Z`,r=e.fill?`fill:${P(e.fill)}`:`fill:none`;te.push(`<path d="${n}"${e.fill&&(e.fa??1)<1?` fill-opacity="${Ti(e.fa,2)}"`:``}${e.stroke?` stroke-width="${Y(e.w??1)}" stroke-linejoin="round"${a}`:``}${i} style="${r}${e.stroke?`;stroke:${P(e.stroke)}`:``}"/>`)}else if(e.t===`line`){let n=t,[r,o]=[e.from?I.get(e.from):void 0,e.to?I.get(e.to):void 0],s=[o?Si(n,o):null,r?Si([...n].reverse(),r):null];s[0]&&(n=s[0]),s[1]&&(n=Si([...n].reverse(),r)?.reverse()??n),e.inset&&(n=xi(n,s[1]?2:e.inset[0],s[0]?1:e.inset[1]));let c=P(e.stroke??`ink-2`),l=`M${n.map(e=>`${Y(e[0])},${Y(e[1])}`).join(` L`)}`,u=``;if(e.arrow&&n.length>1){let[e,t]=[n[n.length-2],n[n.length-1]],r=Math.atan2(t[1]-e[1],t[0]-e[0]);u=`<path d="M${Y(t[0])},${Y(t[1])} L${Y(t[0]-9*Math.cos(r-.42))},${Y(t[1]-9*Math.sin(r-.42))} L${Y(t[0]-9*Math.cos(r+.42))},${Y(t[1]-9*Math.sin(r+.42))} z" style="fill:${c}"/>`}let d=`<path d="${l}" fill="none" stroke-width="${Y(e.w??1.4)}" stroke-linecap="round" stroke-linejoin="round"${a} style="stroke:${c}"/>${u}`,f=e.key?.startsWith(`edge:`)?e.key.slice(5).replace(/@.*$/,``):void 0;te.push(f===void 0?i||u?`<g${i}>${d}</g>`:d:`<g data-edge="${j(f)}"${i}>${d}</g>`)}else if(e.t===`dot`)te.push(`<circle cx="${Y(t[0][0])}" cy="${Y(t[0][1])}" r="${Y(e.r??5)}"${e.stroke?` stroke-width="${Y(e.w??2)}"`:``}${i} style="fill:${e.fill?P(e.fill):`none`}${e.stroke?`;stroke:${P(e.stroke)}`:``}"/>`);else{let r=e.size??11,a=e.bold?`bold`:`regular`,o=Math.min(e.max??220,n-12),s=e.text.split(`
7
+ `).flatMap((t,n)=>Z(t,o,r,99,a).map(t=>({words:t,head:n<(e.heads??0)}))),l=Math.max(...s.map(({words:e})=>X(e,r,a))),u=s.length*(r+3),d=[{at:t[0],align:e.align},...(e.or??[]).map(e=>({at:N(e.at),align:e.align}))].map(t=>{let i=[Ei(t.at[0]-(t.align===`center`?l/2:t.align===`right`?l:0),4,Math.max(4,n-4-l)),t.at[1]-(e.up?u-(r+3)/2:u/2),l,u];return{...t,box:i,under:[...I.values(),...ee].reduce((e,t)=>e+R(i,t),0)}}),f=e.or?d.find(e=>e.under===0)??[...d].sort((e,t)=>e.under-t.under)[0]:d[0];e.or&&ee.push(f.box);let p=s.map(({words:t,head:i},o)=>{let l=X(t,r,a),u=Ei(f.at[0]-(f.align===`center`?l/2:f.align===`right`?l:0),4,Math.max(4,n-4-l)),d=f.at[1]+(e.up?o-(s.length-1):o-(s.length-1)/2)*(r+3)+r*.35;return zi(u,d,t,r,e.bold,P(i&&e.headFill?e.headFill:e.fill??`ink-2`),c)});te.push(i?`<g${i}>${p.join(``)}</g>`:p.join(``))}}let ne=t===`spiral`?a.loops.map((e,t)=>({name:e.name,color:`loop-${t%4}`,says:ni(e,ti(a,e)).words.join(`; `)})):[];return{body:te.join(``)+L.join(``),h:A,...ne.length?{key:ne}:{}}}const zi=(e,t,n,r,i,a,o)=>`<text x="${Y(e)}" y="${Y(t)}" font-size="${Y(r)}"${i?` font-weight="700"`:``} stroke-width="3.5" stroke-linejoin="round" paint-order="stroke" style="fill:${a};stroke:${o(`bg`)};stroke-opacity:.9">${j(n)}</text>`;function Bi(e,t,[n,r],i,a,o){let{padding:s,edge:c,radius:l,name:[u,d],line:[f,p]}=Ii,[m,h,g,_]=[1+(o?Ii.small.padding:s[0]),c+s[3],u*d,f*p],v=t.names.map((e,t)=>Q(h,m+(t+.5)*g+u*.35,e,{size:u,fill:a(`ink`),weight:`bold`})),y=t.line===null?``:Q(h,m+t.names.length*g+_/2+f*.35,t.line,{size:f,fill:a(`ink-3`)}),[b,x]=[t.w,t.h],S=l-Math.sqrt(l*l-(l-c)**2);return`<g data-node="${j(e.id)}" data-kind="${e.kind}" transform="translate(${Y(n)},${Y(r)}) scale(${Ti(i)})"><rect data-card="" x="0.5" y="0.5" width="${Y(b-1)}" height="${Y(x-1)}" rx="${l}" stroke-width="1" style="fill:${a(`surface`)};stroke:${a(`line-strong`)}"/><path d="M${c},${Ti(S,2)} A${l},${l} 0 0 0 0,${l} V${Y(x-l)} A${l},${l} 0 0 0 ${c},${Ti(x-S,2)} Z" style="fill:${a(Fi[e.kind])}"/><g>${v.join(``)}${y}</g></g>`}function Vi(e,t,n){let r=dt(`auto`),{width:i,placed:a,arcs:o,box:s}=fi(e),{yaw:c,pitch:l}=oi,u=Math.max(900,t*1.7),d=[(s.min[0]+s.max[0])/2,(s.min[1]+s.max[1])/2,(s.min[2]+s.max[2])/2],f=[0,1,2,3,4,5,6,7].map(e=>vi(pi([e&1?s.max[0]:s.min[0],e&2?s.max[1]:s.min[1],e&4?s.max[2]:s.min[2]],d),c,l)),p=e=>Math.max(...f.map(t=>Math.abs(t[0]*e*(u/Math.max(1,u-t[2]*e))))),m=()=>{let[e,n]=[.02,1];if(p(n)<=t/2-14)return n;for(let r=0;r<24;r+=1){let r=(e+n)/2;p(r)<=t/2-14?e=r:n=r}return e},h=e=>(Math.max(...f.map(e=>e[1]))-Math.min(...f.map(e=>e[1])))*e,g=m();for(let e=0;e<24&&u<1.7*h(g)-.5;e+=1)u=1.7*h(g),g=m();let _=f.map(e=>e[1]*g*(u/Math.max(1,u-e[2]*g))),v=Math.ceil(Math.max(..._)-Math.min(..._)+28),y=14-Math.min(..._),b=e=>{let[n,r,i]=gi(vi(pi(e,d),c,l),g),a=u/Math.max(1,u-i);return[t/2+n*a,y+r*a,a*g,i]},x=(e,t,n,r,i)=>{let[a,o,s]=[b(e),b([e[0]+t[0]*r,e[1]+t[1]*r,e[2]+t[2]*r]),b([e[0]+n[0]*i,e[1]+n[1]*i,e[2]+n[2]*i])];return`matrix(${Ti((o[0]-a[0])/r,4)},${Ti((o[1]-a[1])/r,4)},${Ti((s[0]-a[0])/i,4)},${Ti((s[1]-a[1])/i,4)},${Y(a[0])},${Y(a[1])})`},S=e=>`M${e.map(e=>b(e)).map(e=>`${Y(e[0])},${Y(e[1])}`).join(` L`)}`,[C,w]=[[1,0,0],[0,1,0]],T=a.map(e=>e.floor),E=e=>(e=>e<0?T.length:e)(T.findIndex(t=>t>=e)),D=[],O=(e,t,n=0)=>void D.push({level:E(e[1]),depth:b(e)[3]+n,svg:t}),k=a.map(({sheet:t,floor:n,front:a,back:o,at:s})=>{let c=(e,t,r)=>Array.from({length:7},(i,a)=>[e+12*Math.cos(r+a*Math.PI/12),n,t+12*Math.sin(r+a*Math.PI/12)]),l=[...c(i-12,o+12,-Math.PI/2),...c(i-12,a-12,0),...c(12,a-12,Math.PI/2),...c(12,o+12,Math.PI)],u=b([i/2,n,(a+o)/2])[2],d=gt(t.name,i-8,12,`bold`),f=X(d,12,`bold`),p=t.place&&f+6+X(t.place,10.5)+14<=i-8?t.place:``,m=p?X(p,10.5)+14:0,h=gt(`${t.sub}${t.items.length?``:e.none}`,i-8,10.5);return O([i/2,n+19,a],`<g transform="${x([0,n+3,a],C,w,i,32)}">`+Q(4,11.6,d,{size:12,fill:r(`ink`),weight:`bold`})+(p?`<rect x="${Y(4+f+6)}" y="1.6" width="${Y(m)}" height="14" rx="7" stroke-width="1" style="fill:none;stroke:${r(`line-strong`)}"/>${Q(4+f+6+7,11.6,p,{size:10.5,fill:r(`ink-2`)})}`:``)+Q(4,27.4,h,{size:10.5,fill:r(`ink-3`)})+`</g>`),t.items.forEach((e,t)=>{let n=s[t];O([n[0]+64,n[1]+e.h/2,n[2]],`<g transform="${x(n,C,w,128,e.h)}">${e.svg()}</g>`)}),`<path data-sheet="" d="${S(l)} Z" fill-opacity="0.72" stroke-width="${Y(1.2*u)}" stroke-linejoin="round"${t.cls.includes(`is-people`)?` stroke-dasharray="${Y(5*u)} ${Y(3*u)}"`:``} style="fill:${r(`surface-2`)};stroke:${r(`line-strong`)}"/>`});o.forEach((t,i)=>{let a=e.links[i].style,o=r(a.color),s=_i(pi(t.b,t.a)),u=bi(t,c,l),d=Math.max(1,Math.hypot(t.b[0]-t.a[0],t.b[1]-t.a[1],t.b[2]-t.a[2])),f=t.lift+9,p=[t.a[0]+u[0]*f,t.a[1]+u[1]*f,t.a[2]+u[2]*f],m=(e,t)=>[p[0]+s[0]*e-u[0]*t,p[1]+s[1]*e-u[1]*t,p[2]+s[2]*e-u[2]*t],[h,g]=[d/2,f-2*t.lift],_=Math.atan2(f-g,d-h),[v,y]=[d-Math.cos(_)*5,f-Math.sin(_)*5],x=Array.from({length:33},(e,t)=>{let n=t/32;return m(2*n*(1-n)*h+n*n*v,(1-n)**2*f+2*n*(1-n)*g+n*n*y)}),C=b(m(d/2,f-t.lift))[2],w=a.dash?a.dash.split(` `).map(e=>Number(e)*C):void 0,T=D.length,k=0;for(let e=0;e<32;e+=4){let r=x.slice(e,e+5),i=r.map(b),s=r[2];O(s,`<g data-${n}="${j(t.id)}"><path d="${S(r)}" fill="none" stroke-width="${Y(a.width*C)}" stroke-linecap="round"${w?` stroke-dasharray="${w.map(Y).join(` `)}" stroke-dashoffset="${Y(k)}"`:``} style="stroke:${o}"/></g>`);for(let e=1;e<i.length;e+=1)k+=Math.hypot(i[e][0]-i[e-1][0],i[e][1]-i[e-1][1])}let A=b(m(0,f)),M=(e,t)=>m(d+e*Math.cos(_)-t*Math.sin(_),f+e*Math.sin(_)+t*Math.cos(_));O(m(0,f),`<g data-${n}="${j(t.id)}"><circle cx="${Y(A[0])}" cy="${Y(A[1])}" r="${Y(2.4*A[2])}" style="fill:${o}"/></g>`,.5),O(M(-4,0),`<g data-${n}="${j(t.id)}"><path d="${S([M(0,0),M(-8,-3.8),M(-8,3.8)])} z" style="fill:${o}"/></g>`,.5);let N=[(t.a[0]+t.b[0])/2+u[0]*t.lift,(t.a[1]+t.b[1])/2+u[1]*t.lift,(t.a[2]+t.b[2])/2+u[2]*t.lift],P=b(N),F=D.slice(T).filter(e=>e.level===E(N[1]));D.push({level:E(N[1]),depth:Math.max(P[3],...F.map(e=>e.depth))+.1,svg:`<g transform="translate(${Y(P[0])},${Y(P[1])}) scale(${Ti(P[2])})">${ln(0,0,String(t.n),o,r)}</g>`})});let A=[];for(let e=a.length;e>=0;--e)e<a.length&&A.push(k[e]),A.push(...D.filter(t=>t.level===e).sort((e,t)=>e.depth-t.depth).map(e=>e.svg));return{body:A.join(``),h:v}}const Hi=(e,t={})=>l(Ot,e,t),Ui=(e,t={})=>Sn(_n,e,t),Wi=(e,t={})=>Cn(_n,e,t);var Gi=class extends Error{code;constructor(e,t){super(t),this.name=`GroophError`,this.code=e}};const Ki=[...wi,`sequence`],qi=e=>e[0]?e[0].message:`it does not match the document's schema`;function Ji(e,t={}){let n=e;if(typeof e==`string`)try{n=JSON.parse(e)}catch(e){throw new Gi(`bad-json`,`This is not JSON, so there is no grooph document in it: ${e.message}`)}let r=typeof n==`object`&&n&&!Array.isArray(n)?`groophMap`in n?`map`:`grooph`in n?`graph`:void 0:void 0;if(r===void 0)throw new Gi(`not-grooph`,`This is not a grooph document: a graph starts with "grooph": 0 and an operation map with "groophMap": 0.`);let i=ce(n,r);if(i)throw new Gi(`too-large`,`This ${r===`map`?`operation map`:`graph`} is too large to draw: ${i.message}.`);let a=dr(t.theme??`paper`);if(!a)throw new Gi(`bad-option`,`There is no theme "${String(t.theme)}": paper, blueprint, ink, phosphor, transit or chalk, or light, dark or auto.`);if(t.layout!==void 0&&t.layout!==`wide`&&t.layout!==`phone`)throw new Gi(`bad-option`,`The layout is wide or phone, not "${String(t.layout)}".`);let o=t.view;if(o!==void 0&&!Ki.includes(o))throw new Gi(`bad-option`,`There is no view "${String(o)}": ${Ki.join(`, `)}.`);if(o===`sequence`&&r!==`map`)throw new Gi(`bad-option`,`The sequence is a view of an operation map; this is a graph.`);if(o!==void 0&&o!==`sequence`&&o!==`stairs`&&r===`map`)throw new Gi(`bad-option`,`A map has the stairs in three dimensions, not ${o}.`);let s={theme:a.name===`paper`?a.form??`auto`:`auto`},c=a.form??`auto`,l;if(r===`map`){let e=Bt(n);if(!e.map)throw new Gi(`not-grooph`,`This is not an operation map grooph can draw: ${qi(e.issues)}.`);let r=e.map;l=o===`stairs`?Oi(r,{...s,layout:t.layout??`wide`}):o===`sequence`?Wi(r,s):(t.layout===`wide`?Ui:wn)(r,s)}else{let e=Ze(n);if(!e.doc)throw new Gi(`not-grooph`,`This is not a graph grooph can draw: ${qi(e.issues)}.`);let r=e.doc;l=o===void 0?Hi(r,s):Di(r,{...s,view:o,layout:t.layout??`wide`})}a.name!==`paper`&&(l=pr(l,a.name,c));let u=/viewBox="0 0 ([\d.]+) ([\d.]+)"/.exec(l);return{svg:l,width:Number(u?.[1]??0),height:Number(u?.[2]??0)}}const Yi=640,Xi=680;function Zi(e,t,n={}){let r=t,i,a=!1,o=e.ownerDocument,s=()=>{if(n.layout)return n.layout;let t=e.clientWidth;return t<=0?i??`wide`:t<(i===`phone`?680:640)?`phone`:`wide`},c=()=>{if(!a){i=s();try{let{svg:t}=Ji(r,{...n,layout:i}),a=new DOMParser().parseFromString(t,`image/svg+xml`),s=a.documentElement;if(s.nodeName!==`svg`||a.getElementsByTagName(`parsererror`).length>0)throw Error(`The drawing could not be read as SVG.`);let c=o.importNode(s,!0);c.style.maxWidth=`100%`,c.style.height=`auto`,e.replaceChildren(c)}catch(t){let n=o.createElement(`p`);n.className=`grooph-error`,n.setAttribute(`role`,`alert`),n.textContent=t instanceof Error?t.message:String(t),e.replaceChildren(n)}}};c();let l=n.layout===void 0&&typeof ResizeObserver<`u`?new ResizeObserver(()=>void(s()!==i&&c())):void 0;return l?.observe(e),{update(e){r=e,c()},destroy(){a=!0,l?.disconnect(),e.replaceChildren()}}}function Qi(e={}){let{root:t=document,...n}=e;return[...t.querySelectorAll(`pre.grooph, script[type="application/grooph+json"]`)].map(e=>{let t=e.ownerDocument.createElement(`div`);t.className=`grooph`;let r=e.dataset,i={...n,...r.theme?{theme:r.theme}:{},...r.layout?{layout:r.layout}:{},...r.view?{view:r.view}:{}},a=e.textContent??``;return e.replaceWith(t),Zi(t,a,i)})}export{Gi as GroophError,Yi as PHONE_BELOW,Xi as WIDE_FROM,Qi as drawAll,Zi as mount,Ji as render};