grooph 0.4.1 → 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.
- package/README.md +33 -31
- package/THIRD-PARTY-NOTICES.md +5 -1
- package/dist/app/assets/App-CT9KxzfQ.css +1 -0
- package/dist/app/assets/App-D1pDFbEY.js +5 -0
- package/dist/app/assets/EmbedApp-CTausQWY.js +1 -0
- package/dist/app/assets/ExportPanel-CbRH4C69.js +8 -0
- package/dist/app/assets/Import-DF0XLxRI.js +1 -0
- package/dist/app/assets/SketchView-BjeUHG4X.js +143 -0
- package/dist/app/assets/{brakes-BJPDrrJT.js → brakes-B9b3hDX8.js} +1 -1
- package/dist/app/assets/{builtins-D_22fKRF.js → builtins-DzyPaYdd.js} +1 -1
- package/dist/app/assets/{compile-BAvi-rd0.js → compile-DL2budwP.js} +8 -8
- package/dist/app/assets/{front-BRl7rl-u.js → front-OxfL-OaD.js} +1 -1
- package/dist/app/assets/full-C0asYORc.js +1 -0
- package/dist/app/assets/graph-more-Dn_hNa20.js +2 -0
- package/dist/app/assets/graph-stage-CwNePnN4.js +4 -0
- package/dist/app/assets/graph-views-CmkQ41zC.js +2 -0
- package/dist/app/assets/{index-CeaKwKuU.js → index-B5ZkSF4L.js} +2 -2
- package/dist/app/assets/mermaid-read-cyqJ32v-.js +17 -0
- package/dist/app/assets/{plan-templates-BQu8G2sX.js → plan-templates-u2fF3GnS.js} +1 -1
- package/dist/app/assets/runs-BA5HKtsx.js +1 -0
- package/dist/app/assets/screens-CMMuexid.js +16 -0
- package/dist/app/assets/share-DV3wsAsJ.js +8 -0
- package/dist/app/assets/site-looks.v1.css +223 -0
- package/dist/app/assets/space-Cuy4YqyZ.js +1 -0
- package/dist/app/assets/styles-Dlp-yYlE.css +1 -0
- package/dist/app/assets/templates-DbAhWvP6.js +2 -0
- package/dist/app/assets/{themes-DtOBrLk0.js → themes-C34TrvOJ.js} +1 -1
- package/dist/app/assets/{units-DOIUgOIU.js → units-DlniUjfH.js} +1 -1
- package/dist/app/assets/{views-CLwg5VNv.js → views-CFqRShXD.js} +2 -1
- package/dist/app/grooph-app.json +1 -1
- package/dist/app/index.html +14 -11
- package/dist/app/llms.txt +6 -7
- package/dist/app/manifest.webmanifest +1 -1
- package/dist/app/og.png +0 -0
- package/dist/app/routes.json +42 -33
- package/dist/app/sw.js +7 -2
- package/dist/browser/grooph.d.ts +44 -0
- package/dist/browser/grooph.global.js +7 -0
- package/dist/browser/grooph.js +7 -0
- package/dist/bundle/grooph.js +6734 -2536
- package/hooks/grooph-event.mjs +163 -14
- package/package.json +14 -6
- package/dist/app/assets/App-48y1Ec5B.js +0 -5
- package/dist/app/assets/App-Cv1auMeh.css +0 -1
- package/dist/app/assets/EmbedApp-390Z2d4x.js +0 -1
- package/dist/app/assets/ExportPanel-Ca3wBB38.js +0 -8
- package/dist/app/assets/Import-ByMI7Uz9.js +0 -1
- package/dist/app/assets/graph-more-393HTgQE.js +0 -2
- package/dist/app/assets/graph-stage-BkrQGQ-z.js +0 -4
- package/dist/app/assets/graph-views-COQF_QTQ.js +0 -2
- package/dist/app/assets/runs-DcjRi7S6.js +0 -1
- package/dist/app/assets/screens-aIjMSzZg.js +0 -16
- package/dist/app/assets/share-BzIzB4EY.js +0 -8
- package/dist/app/assets/space-DWgrlnfB.js +0 -1
- package/dist/app/assets/styles-BA1aVO9R.css +0 -1
- package/dist/app/assets/templates-CoNTzuuz.js +0 -2
- package/dist/app/demo/run.txt +0 -1
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
var e=(e,t,n=[])=>({code:e,severity:`error`,message:t,at:n}),t=(e,t,n=[])=>({code:e,severity:`warning`,message:t,at:n}),n=e=>e.some(e=>e.severity===`error`),r=e=>`${e.severity===`error`?`error`:`warning`} ${e.code} ${e.message}${e.at.length>0?` [at: ${e.at.join(`, `)}]`:``}`,i=e=>typeof e==`object`&&!!e&&!Array.isArray(e),a=e=>e===null?`null`:Array.isArray(e)?`array`:typeof e;function o(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 s(e){return{...e,__optional:!0}}function c(e={}){let t=e.patternName??`string`;return o(t,{check(n,r,i){if(typeof n!=`string`){i.push({path:r,message:`expected ${t}, got ${a(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}})}var l=/^[a-z][a-z0-9-]*$/;function u(){return c({pattern:l,patternName:`kebab-case id`})}function d(e={}){let t=e.integer?`integer`:`number`;return o(t,{check(n,r,i){if(typeof n!=`number`||Number.isNaN(n)||!Number.isFinite(n)){i.push({path:r,message:`expected ${t}, got ${a(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 f(){return o(`boolean`,{check(e,t,n){typeof e!=`boolean`&&n.push({path:t,message:`expected boolean, got ${a(e)}`})},json:()=>({type:`boolean`})})}function p(){return o(`null`,{check(e,t,n){e!==null&&n.push({path:t,message:`expected null, got ${a(e)}`})},json:()=>({type:`null`})})}function m(e,t){return{...e,json:()=>({$ref:t})}}function h(e){return o(JSON.stringify(e),{check(t,n,r){t!==e&&r.push({path:n,message:`expected ${JSON.stringify(e)}, got ${JSON.stringify(t)??a(t)}`})},json:()=>({const:e})})}function g(...e){let t=`one of ${e.join(` | `)}`;return o(t,{check(n,r,i){(typeof n!=`string`||!e.includes(n))&&i.push({path:r,message:`expected ${t}, got ${JSON.stringify(n)??a(n)}`})},json:()=>({enum:[...e]})})}var _=/^[^\u0000-\u001f\u007f\u0085\u2028\u2029]+$/,v=/^[A-Za-z0-9][A-Za-z0-9._:/[\]-]*$/;function y(e,t,n={}){return o(t,{check(e,r,i){if(typeof e!=`string`||e.length===0){i.push({path:r,message:`expected ${t} (non-empty string), got ${a(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 b(e,t={}){let n=`array of ${e.describe}`;return o(n,{check(r,i,o){if(!Array.isArray(r)){o.push({path:i,message:`expected ${n}, got ${a(r)}`});return}t.minItems!==void 0&&r.length<t.minItems&&o.push({path:i,message:`expected at least ${t.minItems} item(s), got ${r.length}`}),t.maxItems!==void 0&&r.length>t.maxItems&&o.push({path:i,message:`expected at most ${t.maxItems} item(s), got ${r.length}`}),r.forEach((t,n)=>e.check(t,`${i}/${n}`,o))},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 x(e=`any JSON value`){let t=o(e,{check:()=>{},json:()=>({}),canon(e){if(Array.isArray(e))return e.map(e=>t.canon(e));if(i(e)){let n={};for(let r of Object.keys(e).sort())C(n,r,t.canon(e[r]));return n}return e}});return t}function S(e,t={}){let n=`object of ${e.describe}`;return o(n,{check(r,o,s){if(!i(r)){s.push({path:o,message:`expected ${n}, got ${a(r)}`});return}for(let[n,i]of Object.entries(r))t.keyPattern&&!t.keyPattern.test(n)&&s.push({path:`${o}/${w(n)}`,message:`expected ${t.keyName??`key`} matching ${t.keyPattern.source}, got ${JSON.stringify(n)}`}),e.check(i,`${o}/${w(n)}`,s)},json(n){let r={type:`object`,additionalProperties:e.json(n)};return t.keyPattern&&(r.propertyNames={pattern:t.keyPattern.source}),r},canon(t){if(!i(t))return t;let n={};for(let r of Object.keys(t).sort())C(n,r,e.canon(t[r]));return n},unknownKeys(t,n,r){if(i(t))for(let[i,a]of Object.entries(t))e.unknownKeys(a,`${n}/${w(i)}`,r)}})}function C(e,t,n){t===`__proto__`?Object.defineProperty(e,t,{value:n,enumerable:!0,writable:!0,configurable:!0}):e[t]=n}function w(e){return e.replace(/~/g,`~0`).replace(/\//g,`~1`)}var T=x();function E(e,t={}){let n=Object.keys(e),r=n.filter(t=>!(`__optional`in e[t])),s=t.describe??t.name??`object`;return o(s,{check(t,o,c){if(!i(t)){c.push({path:o,message:`expected ${s}, got ${a(t)}`});return}for(let e of r)(!(e in t)||t[e]===void 0)&&c.push({path:`${o}/${e}`,message:`missing required property "${e}"`});for(let r of n){let n=t[r];n!==void 0&&e[r].check(n,`${o}/${r}`,c)}},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(!i(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||C(r,e,T.canon(t[e]));return r},unknownKeys(t,r,a){if(i(t))for(let i of Object.keys(t)){if(t[i]===void 0)continue;let o=`${r}/${w(i)}`;n.includes(i)?e[i].unknownKeys(t[i],o,a):a.push({path:o,key:i,known:n})}}})}function D(e,t,n={}){let r=Object.keys(t),s=`${n.label??`object`} with ${e} one of ${r.join(` | `)}`;return o(s,{check(n,o,c){if(!i(n)){c.push({path:o,message:`expected ${s}, got ${a(n)}`});return}let l=n[e];if(typeof l!=`string`||!Object.hasOwn(t,l)){c.push({path:`${o}/${e}`,message:`expected ${e} to be one of ${r.join(` | `)}, got ${JSON.stringify(l)??`nothing`}`});return}t[l].check(n,o,c)},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(!i(n))return n;let r=n[e];return typeof r==`string`&&Object.hasOwn(t,r)?t[r].canon(n):T.canon(n)},unknownKeys(n,r,a){if(!i(n))return;let o=n[e];typeof o==`string`&&Object.hasOwn(t,o)&&t[o].unknownKeys(n,r,a)}})}function O(e,t,n,r={}){let i=r=>e(r)?t:n;return o(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 k(e,t={}){let n=t.describe??e.map(e=>e.describe).join(` | `);return o(n,{check(t,r,i){e.some(e=>e.accepts(t))||i.push({path:r,message:`expected ${n}, got ${JSON.stringify(t)??a(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):T.canon(t)},unknownKeys(t,n,r){e.find(e=>e.accepts(t))?.unknownKeys(t,n,r)}})}var A=(e,t)=>c({pattern:e,patternName:t}),j=()=>u(),M=y([`claude-code`,`codex`],`harness id`),N=y([`read-files`,`edit-files`,`write-outputs`,`run-commands`,`run-tests`,`web`,`spawn-agents`],`capability`,{pattern:_}),P=c({pattern:v,patternName:`model name`}),F=c({pattern:v,patternName:`skill name`}),ee=g(`frontier`,`strong`,`fast`),te=g(`low`,`medium`,`high`,`max`),ne=g(`lead`,`planner`,`builder`,`critic`,`tester`,`researcher`,`red-team`,`judge`,`synthesizer`),I=e=>({id:u(),kind:h(e),name:c(),description:s(c()),coupled:s(f())}),re=D(`kind`,{agent:E({...I(`agent`),by:s(g(`agent`,`person`)),role:k([ne,E({custom:c()})],{describe:`role name or { custom }`}),model:s(E({tier:ee,pin:s(S(P,{keyName:`harness id`}))})),effort:s(te),brief:c(),inputs:s(b(c())),outputs:b(c(),{minItems:1}),allow:s(b(N)),deny:s(b(N)),owns:s(b(c())),irreversible:s(b(c())),skills:s(b(F))},{name:`AgentNode`}),"human-gate":E({...I(`human-gate`),prompt:c(),options:s(b(c()))},{name:`HumanGateNode`}),check:E({...I(`check`),check:E({kind:g(`command`,`tests`,`diff`,`metric`,`evidence`),run:s(c()),pass:c(),threshold:s(d())})},{name:`CheckNode`}),merge:E({...I(`merge`),merges:b(c()),strategy:s(c())},{name:`MergeNode`}),stop:E({...I(`stop`),outcome:s(g(`success`,`halt`))},{name:`StopNode`})},{name:`Node`,label:`node`}),L=E({id:u(),from:j(),to:j(),when:s(k([g(`always`,`pass`,`fail`),E({verdict:c()})],{describe:`always | pass | fail | { verdict }`})),isolation:s(g(`fresh`,`shared`)),concurrency:s(E({max:d({integer:!0,minimum:1})})),retry:s(E({max:d({integer:!0,minimum:0})})),evidence:s(b(c())),approval:s(f()),label:s(c())},{name:`Edge`}),ie=E({kind:g(`file`,`url`,`metric`,`checklist`,`answer-key`,`artifact`),ref:c(),note:s(c())},{name:`Evidence`}),ae=E({name:c(),inspects:b(ie),acceptance:c(),aspiration:s(c()),answerKeyFrom:s(j())},{name:`Bar`}),oe=g(`dispatches`,`minutes`,`usd`,`turns`,`tokens`),se=D(`kind`,{human:E({kind:h(`human`),every:s(d({integer:!0,minimum:1})),then:s(j())}),budget:E({kind:h(`budget`),measure:oe,limit:d({minimum:0}),then:s(j())}),"bar-passed":E({kind:h(`bar-passed`),then:s(j())}),"diminishing-returns":E({kind:h(`diminishing-returns`),rounds:d({integer:!0,minimum:1}),metric:s(c()),threshold:s(d()),then:s(j())}),"evidence-invalid":E({kind:h(`evidence-invalid`),rounds:d({integer:!0,minimum:1}),then:s(j())}),"max-iterations":E({kind:h(`max-iterations`),n:d({integer:!0,minimum:1}),then:s(j())})},{name:`Stop`,label:`stop`}),ce=E({id:u(),name:c(),members:b(j()),back:b(j()),mode:s(g(`grind`,`judgment`)),bar:s(ae),stops:b(se)},{name:`Loop`}),le=E({id:u(),kind:k([g(`critic-isolation`,`no-self-grading`,`owner-per-artifact`,`concurrency-cap`,`no-live-graph-rewrite`,`evidence-required`),E({custom:c()})],{describe:`policy kind or { custom }`}),scope:A(/^(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:s(S(k([c(),d(),f()],{describe:`string | number | boolean`})))},{name:`Policy`}),ue=/^[a-z][a-z0-9-]*@[1-9][0-9]*$/,de=E({id:u(),name:c(),members:b(j()),coupled:s(f()),description:s(c({pattern:_,patternName:`one line of text`})),from:s(A(ue,`<template id>@<version>`)),with:s(S(c(),{keyPattern:/^[^{}\s]+$/,keyName:`slot key`}))},{name:`Group`}),fe=E({cost:g(`low`,`medium`,`high`),speed:g(`fast`,`medium`,`slow`),rigor:g(`light`,`standard`,`high`)},{name:`Profile`}),pe=E({kind:g(`graph`,`fragment`),title:c(),summary:c(),whenToUse:c(),notFor:s(c()),profile:fe,slots:s(b(E({key:c(),ask:c(),example:c()},{name:`TemplateSlot`}))),tags:s(b(c())),demo:s(c()),credits:s(b(E({name:c(),url:c(),note:c()},{name:`TemplateCredit`})))},{name:`Template`}),me=E({id:u(),run:c(),at:A(/^(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:s(c()),ended:s(c()),outcome:s(y([`pass`,`fail`,`halt`,`invalid-evidence`,`started`,`ending`],`outcome`)),verdict:s(c()),round:s(d({integer:!0,minimum:0})),stop:s(c()),evidence:s(b(c())),cost:s(E({measure:oe,amount:d()})),gaps:s(b(c())),proposal:s(E({summary:c(),patch:s(x())})),amendment:s(E({summary:c(),reason:c(),patch:s(x())})),text:s(c())},{name:`RunNote`}),he=E({grooph:h(0),id:u(),name:c(),version:d({integer:!0,minimum:0}),goal:s(c()),target:s(E({harness:M})),constraints:s(E({budget:s(c()),time:s(c()),other:s(c())})),adaptation:s(g(`adaptive`,`propose`,`fixed`)),lineage:s(E({pattern:s(c()),from:s(c())})),template:s(pe),description:s(c()),nodes:b(re),edges:b(L),loops:b(ce),policies:s(b(le)),groups:s(b(de)),notes:s(b(me)),layout:s(S(E({x:d(),y:d(),w:s(d()),h:s(d())}),{keyPattern:l,keyName:`node id`}))},{describe:`graph document`}),ge=`https://grooph.dev/schema/grooph-0.schema.json`;function _e(t){let n=[];return he.check(t,``,n),n.length>0?{issues:n.map(n=>e(`E_SCHEMA`,`${n.path===``?`/`:n.path}: ${n.message}`,ye(t,n.path)))}:{doc:t,issues:[]}}function ve(t){let n;try{n=JSON.parse(t)}catch(t){return{issues:[e(`E_SCHEMA`,`/: not valid JSON: ${t.message}`)]}}return _e(n)}function ye(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]}function be(e){return`${JSON.stringify(he.canon(e),null,2)}\n`}function xe(e){let{layout:t,...n}=e;return be(n)}var Se=e=>{let t=new Map;for(let n of e??[])t.has(n.id)||t.set(n.id,n);return t};function Ce(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:Se(t),edges:Se(n),loops:Se(e.loops),groups:Se(e.groups),policies:Se(e.policies),notes:Se(e.notes),owners:r,nodeOrder:a,outgoing:o,incoming:s}}var we=e=>e?.kind===`agent`;function Te(e,t){return[...t].sort((t,n)=>(e.nodeOrder.get(t)??0)-(e.nodeOrder.get(n)??0))}function Ee(e,t){let n=[...e.nodes.keys()],r=new Map;for(let e of n)r.set(e,[]);let i=new Set;for(let n of t)e.nodes.has(n.from)&&e.nodes.has(n.to)&&(r.get(n.from).push(n.to),n.from===n.to&&i.add(n.from));let a=0,o=new Map,s=new Map,c=new Set,l=[],u=[],d=t=>{o.set(t,a),s.set(t,a),a+=1,l.push(t),c.add(t);for(let e of r.get(t)??[])o.has(e)?c.has(e)&&s.set(t,Math.min(s.get(t),o.get(e))):(d(e),s.set(t,Math.min(s.get(t),s.get(e))));if(s.get(t)===o.get(t)){let n=[];for(;;){let e=l.pop();if(c.delete(e),n.push(e),e===t)break}(n.length>1||i.has(n[0]))&&u.push(Te(e,n))}};for(let e of n)o.has(e)||d(e);return u.sort((t,n)=>(e.nodeOrder.get(t[0])??0)-(e.nodeOrder.get(n[0])??0))}function De(e,t,n,r){if(!n.has(e)||!n.has(t))return!1;let i=new Set([e]),a=[e];for(;a.length>0;){let o=a.shift();if(o===t&&i.size>0&&o!==e)return!0;for(let e of r)if(e.from===o&&n.has(e.to)){if(e.to===t)return!0;i.has(e.to)||(i.add(e.to),a.push(e.to))}}return!1}var Oe={"claude-code":`Claude Code`,codex:`Codex`},ke=Object.keys(Oe),Ae=e=>Object.prototype.hasOwnProperty.call(Oe,e),je=e=>Ae(e)?Oe[e]:void 0,Me=[`critic`,`judge`,`red-team`],Ne=[`builder`,`synthesizer`,`planner`],Pe=e=>typeof e.role==`string`?e.role:e.role.custom,Fe=e=>typeof e.role!=`string`,Ie=e=>e.by===`person`?`person`:`agent`,R=e=>e?.kind===`agent`&&e.by===`person`,Le={agent:`Agent`,person:`Person`},Re=e=>e.kind===`agent`&&!Fe(e)&&Me.includes(e.role),ze=e=>e.kind===`agent`?Fe(e)?(e.owns??[]).length>0:Ne.includes(e.role):!1,Be=e=>e.when??`always`,Ve=e=>{let t=Be(e);return typeof t==`string`?t:`verdict ${t.verdict}`},He=e=>e.isolation??`fresh`;function Ue(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 We(e,t){if(!t)return[];let n=t.answerKeyFrom!==void 0&&e.nodes.has(t.answerKeyFrom);return(t.inspects??[]).filter(e=>e.kind!==`answer-key`||n)}var Ge=(e,t)=>We(e,t.bar).length>0;function Ke(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 qe(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}\``}var Je=e=>{if((e.nodes??[]).some(R))return!0;let t=e.target?.harness;return e.template===void 0&&(typeof t!=`string`||!Ae(t))},Ye=e=>(e.stops??[]).flatMap(t=>t.then===void 0||(e.members??[]).includes(t.then)?[]:[t.then]);function Xe(e){let t=e.doc.loops??[],n=new Set(t.flatMap(e=>e.back??[])),r=new Set(t.flatMap(Ye));return(e.doc.nodes??[]).filter(t=>!r.has(t.id)&&(e.incoming.get(t.id)??[]).every(e=>n.has(e.id))).map(e=>e.id)}function Ze(e,t){return(e.doc.loops??[]).filter(e=>(e.members??[]).includes(t))}function Qe(e,t){let n=new Set(t.filter(t=>e.nodes.has(t))),r=[...n];for(;r.length>0;){let t=r.shift(),i=(e.outgoing.get(t)??[]).map(e=>e.to);for(let n of e.doc.loops??[])(n.members??[]).includes(t)&&i.push(...Ye(n));for(let t of i)e.nodes.has(t)&&!n.has(t)&&(n.add(t),r.push(t))}return n}function $e(e,t,n){let r=t.scope;if(r===`graph`)return!0;let i=r.indexOf(`:`),a=r.slice(0,i),o=r.slice(i+1);return a===`edge`?o===n.id:a===`node`?o===n.from||o===n.to:a===`loop`&&(e.loops.get(o)?.members??[]).includes(n.to)}var et=[`fixed`,`propose`,`adaptive`];function tt(e){let t=[e.adaptation??`adaptive`];return(e.policies??[]).some(e=>e.kind===`no-live-graph-rewrite`&&e.scope===`graph`)&&t.push(`propose`),et.find(e=>t.includes(e))}function nt(e,t){if(e===t)return 0;let n=[Array.from({length:t.length+1},(e,t)=>t)];for(let r=1;r<=e.length;r+=1){let i=[r];for(let a=1;a<=t.length;a+=1){let o=e[r-1]===t[a-1]?0:1;i[a]=Math.min(n[r-1][a]+1,i[a-1]+1,n[r-1][a-1]+o),r>1&&a>1&&e[r-1]===t[a-2]&&e[r-2]===t[a-1]&&(i[a]=Math.min(i[a],n[r-2][a-2]+1))}n.push(i)}return n[e.length][t.length]}function rt(e,t){let n=Math.max(1,Math.min(3,Math.floor(e.length/3))),r,i=1/0;for(let a of t){let t=nt(e.toLowerCase(),a.toLowerCase());t<i&&t<=n&&(r=a,i=t)}return r}var it=(e,t)=>{let n=rt(e,t);return n===void 0?``:`; did you mean "${n}"?`};function at(e,t=`item`){let n=e.normalize(`NFKD`).replace(/[̀-ͯ]/g,``).toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``).replace(/^[^a-z]+/,``);return n===``?t:n}function ot(e,t){if(!t.has(e))return e;for(let n=2;;n++){let r=`${e}-${n}`;if(!t.has(r))return r}}function z(e){let t=new Set([e.id]);for(let n of[e.nodes,e.edges,e.loops,e.groups,e.policies,e.notes])for(let e of n??[])t.add(e.id);return t}function st(e,t){let n=at(t,``);return n===``||e===n||RegExp(`^${n}-\\d+$`).test(e)}var ct={agent:`Agent`,"human-gate":`Human gate`,check:`Check`,merge:`Merge`,stop:`Stop`};function lt(e,t,n){let r={...e};return n===void 0?delete r[t]:r[t]=n,r}var ut=e=>e.trim()===``?void 0:e,dt=e=>e.length===0?void 0:e,ft=e=>Math.round(e);function pt(e){let t={grooph:0,id:e.id??at(e.name,`graph`),name:e.name,version:1,nodes:[],edges:[],loops:[]};return e.goal!==void 0&&(t.goal=e.goal),e.target!==void 0&&(t.target={harness:e.target}),t}function mt(e,t,n){return lt(e,t,n)}function ht(e,t){return lt(e,`target`,t===void 0?void 0:{...e.target,harness:t})}function gt(e,t,n){let r=lt({...e.constraints},t,n);return lt(e,`constraints`,Object.keys(r).length===0?void 0:r)}function _t(e,t){let n={...e,name:t};if(!st(e.id,e.name))return n;let r=z(e);return r.delete(e.id),{...n,id:ot(at(t,`graph`),r)}}function vt(e,t,n){switch(e){case`agent`:return{id:t,kind:e,name:n,role:`builder`,brief:``,outputs:[]};case`human-gate`:return{id:t,kind:e,name:n,prompt:``};case`check`:return{id:t,kind:e,name:n,check:{kind:`tests`,pass:``}};case`merge`:return{id:t,kind:e,name:n,merges:[]};case`stop`:return{id:t,kind:e,name:n}}}function yt(e,t,n={}){let r=z(e),i=ct[t],a,o;if(n.name!==void 0)o=n.name,a=n.id??ot(at(o,at(i)),r);else{a=n.id??ot(at(i),r);let e=a.slice(at(i).length);o=n.id!==void 0||e===``?i:`${i} ${e.slice(1)}`}let s={...e,nodes:[...e.nodes,vt(t,a,o)]};return e.layout&&n.at&&(s=Ht(s,{[a]:n.at})),{doc:s,id:a}}function bt(e,t,n){return{...e,nodes:e.nodes.map(e=>e.id===t?n(e):e)}}function xt(e,t,n){let r=e.nodes.find(e=>e.id===t);if(!r)return{doc:e,id:t};let i=bt(e,t,e=>({...e,name:n}));if(!st(t,r.name))return{doc:i,id:t};let a=z(i);a.delete(t);let o=ot(at(n,at(ct[r.kind])),a);return o===t?{doc:i,id:t}:(i=Ut(i,t,o),{doc:i,id:o})}function St(e,t){let n=e;for(let r of e.edges)(r.from===t||r.to===t)&&(n=Et(n,r.id));if(n={...n,nodes:n.nodes.filter(e=>e.id!==t),loops:n.loops.map(e=>{let n={...e,members:e.members.filter(e=>e!==t)};return n={...n,stops:n.stops.map(e=>e.then===t?lt(e,`then`,void 0):e)},n.bar?.answerKeyFrom===t&&(n={...n,bar:lt(n.bar,`answerKeyFrom`,void 0)}),n})},n.layout&&t in n.layout){let{[t]:e,...r}=n.layout;n={...n,layout:r}}return n.groups&&(n={...n,groups:n.groups.map(e=>({...e,members:e.members.filter(e=>e!==t)}))}),Wt(n,`node:${t}`)}var Ct=(e,t)=>`e-${e}-${t}`;function wt(e,t,n,r={}){let i=r.id??ot(Ct(t,n),z(e));return{doc:{...e,edges:[...e.edges,{id:i,from:t,to:n}]},id:i}}function Tt(e,t,n){return{...e,edges:e.edges.map(e=>e.id===t?n(e):e)}}function Et(e,t){return Wt({...e,edges:e.edges.filter(e=>e.id!==t),loops:e.loops.map(e=>e.back.includes(t)?{...e,back:e.back.filter(e=>e!==t)}:e)},`edge:${t}`)}function Dt(e,t=[],n={}){let r=z(e),i,a;n.name===void 0?(i=n.id??ot(`loop`,r),a=n.id!==void 0||i===`loop`?`Loop`:`Loop ${i.slice(5)}`):(a=n.name,i=n.id??ot(at(a,`loop`),r));let o={id:i,name:a,members:t,back:[],stops:[]};return{doc:{...e,loops:[...e.loops,o]},id:i}}function Ot(e,t,n){return{...e,loops:e.loops.map(e=>e.id===t?n(e):e)}}function kt(e,t,n){let r=e.loops.find(e=>e.id===t);if(!r)return{doc:e,id:t};let i=Ot(e,t,e=>({...e,name:n}));if(!st(t,r.name))return{doc:i,id:t};let a=z(i);a.delete(t);let o=ot(at(n,`loop`),a);return o===t?{doc:i,id:t}:{doc:Ut(i,t,o),id:o}}function At(e,t){return Wt({...e,loops:e.loops.filter(e=>e.id!==t)},`loop:${t}`)}var jt=(e,t,n)=>{let r=e.includes(t),i=n??!r;return i===r?e:i?[...e,t]:e.filter(e=>e!==t)};function Mt(e,t,n,r){let i=new Map(e.nodes.map((e,t)=>[e.id,t]));return Ot(e,t,e=>({...e,members:jt(e.members,n,r).sort((e,t)=>(i.get(e)??1e9)-(i.get(t)??1e9))}))}function Nt(e,t,n,r){let i=new Map(e.edges.map((e,t)=>[e.id,t]));return Ot(e,t,e=>({...e,back:jt(e.back,n,r).sort((e,t)=>(i.get(e)??1e9)-(i.get(t)??1e9))}))}function Pt(e,t,n){return Ot(e,t,e=>lt(e,`bar`,n))}function Ft(e,t){let n=t?.then===void 0?{}:{then:t.then};switch(e){case`human`:return{kind:e,...n};case`budget`:return{kind:e,measure:`dispatches`,limit:12,...n};case`bar-passed`:return{kind:e,...n};case`diminishing-returns`:return{kind:e,rounds:2,...n};case`evidence-invalid`:return{kind:e,rounds:2,...n};case`max-iterations`:return{kind:e,n:4,...n}}}function It(e,t,n,r={}){let i={...Ft(n),...r,kind:n};return Ot(e,t,e=>({...e,stops:[...e.stops,i]}))}function Lt(e,t,n,r){return Ot(e,t,e=>({...e,stops:e.stops.map((e,t)=>t===n?r:e)}))}function Rt(e,t,n){return Ot(e,t,e=>({...e,stops:e.stops.filter((e,t)=>t!==n)}))}function zt(e,t,n,r){return Ot(e,t,e=>{let t=n+r;if(t<0||t>=e.stops.length)return e;let i=[...e.stops];return[i[n],i[t]]=[i[t],i[n]],{...e,stops:i}})}function Bt(e,t){let n=typeof t.kind==`string`?t.kind:t.kind.custom,r=t.id??ot(`p-${at(n,`policy`)}`,z(e)),i={id:r,kind:t.kind,scope:t.scope};return t.params!==void 0&&(i.params=t.params),{doc:{...e,policies:[...e.policies??[],i]},id:r}}function Vt(e,t){return e.policies?lt(e,`policies`,dt(e.policies.filter(e=>e.id!==t))):e}function Ht(e,t){let n={...e.layout};for(let[e,r]of Object.entries(t))n[e]={...n[e],x:ft(r.x),y:ft(r.y)};return{...e,layout:n}}function Ut(e,t,n){if(t===n)return e;if(e.id===t)return{...e,id:n};let r=e=>e===t?n:e,i=e=>{let r=e.indexOf(`:`);return r>0&&e.slice(r+1)===t?`${e.slice(0,r)}:${n}`:e},a=e.nodes.some(e=>e.id===t),o={...e,nodes:e.nodes.map(e=>e.id===t?{...e,id:n}:e),edges:e.edges.map(e=>{let n={...e,id:r(e.id),from:r(e.from),to:r(e.to)};return e.id===t||e.from===t||e.to===t?n:e}),loops:e.loops.map(e=>{let i={...e,id:r(e.id),members:e.members.map(r),back:e.back.map(r),stops:e.stops.map(e=>e.then===t?{...e,then:n}:e)};return i.bar?.answerKeyFrom===t&&(i.bar={...i.bar,answerKeyFrom:n}),i})};if(e.policies&&(o.policies=e.policies.map(e=>({...e,id:r(e.id),scope:i(e.scope)}))),e.groups&&(o.groups=e.groups.map(e=>({...e,id:r(e.id),members:e.members.map(r)}))),e.layout&&t in e.layout){let t={};for(let[n,i]of Object.entries(e.layout))t[r(n)]=i;o.layout=t}if(a)for(let e of o.edges){if(e.from!==n&&e.to!==n)continue;let r=Ct(e.from===n?t:e.from,e.to===n?t:e.to);if(e.id!==r&&!RegExp(`^${r}-\\d+$`).test(e.id))continue;let i=z(o);i.delete(e.id);let a=ot(Ct(e.from,e.to),i);a!==e.id&&(o=Ut(o,e.id,a))}return o}function Wt(e,t){return e.policies?.some(e=>e.scope===t)?{...e,policies:e.policies.filter(e=>e.scope!==t)}:e}var Gt=class extends Error{constructor(e){super(e),this.name=`TemplateError`}},Kt=/\{\{\s*([^{}\s]+)\s*\}\}/g,qt=new Set([`nodes`,`edges`,`loops`,`policies`,`groups`,`notes`,`layout`,`template`]);function Jt(e,t){if(typeof e==`string`)t(e);else if(Array.isArray(e))for(let n of e)Jt(n,t);else if(typeof e==`object`&&e)for(let n of Object.values(e))Jt(n,t)}function Yt(e,t){if(typeof e==`string`)return t(e);if(Array.isArray(e))return e.map(e=>Yt(e,t));if(typeof e==`object`&&e){let n={};for(let[r,i]of Object.entries(e))n[r]=Yt(i,t);return n}return e}function Xt(e){let t={};for(let[n,r]of Object.entries(e))qt.has(n)||(t[n]=r);let n=[e.nodes,e.edges,e.loops,e.policies,e.groups];return[{id:e.id,value:t},...n.flatMap(e=>(e??[]).map(e=>({id:e.id,value:e})))]}function Zt(e){let t=new Map;for(let n of Xt(e))Jt(n.value,e=>{for(let r of e.matchAll(Kt)){let e=t.get(r[1])??[];e.includes(n.id)||e.push(n.id),t.set(r[1],e)}});return[...t].map(([e,t])=>({key:e,at:t}))}function Qt(e,t){let n=e=>e.replace(Kt,(e,n)=>Object.hasOwn(t,n)?t[n]:e),r={};for(let[t,i]of Object.entries(e))r[t]=t===`template`||t===`notes`||t===`layout`?i:Yt(i,n);return r}function $t(e){let t=(e.template?.slots??[]).map(e=>e.key);return[...new Set([...t,...Zt(e).map(e=>e.key)])]}function en(e,t){let n=$t(e);for(let r of Object.keys(t))if(!n.includes(r))throw new Gt(`template "${e.id}" has no slot "${r}"${it(r,n)}${n.length>0?`; its slots are ${n.join(`, `)}`:`; it has no slots`}`)}function tn(e){if(!e.template)throw new Gt(`"${e.id}" is not a template: it has no template block`);return e.template}function nn(e,t){if(tn(e).kind===`fragment`)throw new Gt(`"${e.id}" is a fragment, not a whole graph; insert it into a graph instead (insertFragment, grooph template insert)`);let n=t.values??{};en(e,n);let{template:r,notes:i,...a}=e,o=Qt(a,n),s=z(o);return s.delete(o.id),{...o,id:t.id??ot(at(t.name,`graph`),s),name:t.name,version:1,lineage:{pattern:e.id,from:`${e.id}@${e.version}`}}}var rn=e=>{let t=Ct(e.from,e.to);return e.id===t||RegExp(`^${t}-\\d+$`).test(e.id)},an=(e,t)=>JSON.stringify(e)===JSON.stringify(t);function on(e,t,n={}){tn(t);let r=n.values??{};en(t,r);let i=``;if(n.prefix!==void 0&&n.prefix!==``&&(i=n.prefix.endsWith(`-`)?n.prefix:`${n.prefix}-`,!l.test(i)))throw new Gt(`prefix "${n.prefix}" must start with a letter and use only a-z, 0-9 and "-", so the ids it makes stay kebab-case`);let a=Qt(t,r),o=z(e),s={},c=(e,t)=>{let n=ot(t,o);return o.add(n),s[e]=n,n};for(let e of a.nodes)c(e.id,i+e.id);let u=e=>s[e]??e;for(let e of a.edges)c(e.id,rn(e)?Ct(u(e.from),u(e.to)):i+e.id);for(let e of a.loops)c(e.id,i+e.id);for(let e of a.groups??[])c(e.id,i+e.id);let d=e=>{if(e===`graph`)return e;let t=e.indexOf(`:`);return`${e.slice(0,t)}:${u(e.slice(t+1))}`},f=e.policies??[],p=[];for(let e of a.policies??[])e.scope===`graph`&&f.some(t=>t.scope===`graph`&&an(t.kind,e.kind)&&an(t.params,e.params))||p.push({...e,id:c(e.id,i+e.id),scope:d(e.scope)});let m=a.nodes.map(e=>({...e,id:u(e.id)})),h=a.edges.map(e=>({...e,id:u(e.id),from:u(e.from),to:u(e.to)})),g=a.loops.map(e=>{let t={...e,id:u(e.id),members:e.members.map(u),back:e.back.map(u),stops:e.stops.map(e=>e.then===void 0?e:{...e,then:u(e.then)})};return e.bar?.answerKeyFrom!==void 0&&(t.bar={...e.bar,answerKeyFrom:u(e.bar.answerKeyFrom)}),t}),_=(a.groups??[]).map(e=>({...e,id:u(e.id),members:e.members.map(u)})),v={...e,nodes:[...e.nodes,...m],edges:[...e.edges,...h],loops:[...e.loops,...g]};return p.length>0&&(v.policies=[...f,...p]),_.length>0&&(v.groups=[...e.groups??[],..._]),{doc:v,ids:s}}function sn(e,t){let{meta:n}=t;if(!l.test(n.id))throw new Gt(`template id "${n.id}" must be kebab-case, like "my-review-gate"`);let{notes:r,template:i,...a}=e,o=a;if(t.kind===`fragment`)o=cn(o,t.nodeIds??[]);else if(t.nodeIds!==void 0)throw new Gt(`nodeIds selects a fragment; pass kind: "fragment" with it`);let s=z(o);if(s.delete(o.id),s.has(n.id))throw new Gt(`template id "${n.id}" is already the id of an object inside it; choose another`);let c=[...n.slots??[]];for(let e of Zt(o))c.some(t=>t.key===e.key)||c.push({key:e.key,ask:`What should "${e.key}" be?`,example:e.key});let u={kind:t.kind,title:n.title,summary:n.summary,whenToUse:n.whenToUse,profile:n.profile??ln(o)};n.notFor!==void 0&&(u.notFor=n.notFor),c.length>0&&(u.slots=c),n.tags!==void 0&&n.tags.length>0&&(u.tags=n.tags),n.demo!==void 0&&(u.demo=n.demo),n.credits!==void 0&&n.credits.length>0&&(u.credits=n.credits.map(e=>({...e})));let d={from:`${e.id}@${e.version}`};return e.lineage?.pattern!==void 0&&(d.pattern=e.lineage.pattern),{...o,id:n.id,name:n.title,version:1,lineage:d,template:u}}function cn(e,t){if(t.length===0)throw new Gt(`a fragment needs at least one node id`);let n=e.nodes.map(e=>e.id);for(let r of t)if(!n.includes(r))throw new Gt(`no node "${r}" in "${e.id}"${it(r,n)}`);let r=new Set(t),i=e.edges.filter(e=>r.has(e.from)&&r.has(e.to)),a=new Set(i.map(e=>e.id)),o=e.loops.filter(e=>e.members.length>0&&e.members.every(e=>r.has(e))&&e.back.every(e=>a.has(e))).map(e=>{let t={...e,stops:e.stops.map(e=>{if(e.then===void 0||r.has(e.then))return e;let{then:t,...n}=e;return n})};if(e.bar?.answerKeyFrom!==void 0&&!r.has(e.bar.answerKeyFrom)){let{answerKeyFrom:n,...r}=e.bar;t.bar=r}return t}),s=new Set(o.map(e=>e.id)),c=new Set;for(let t=!0;t;){t=!1;for(let n of e.groups??[])c.has(n.id)||n.members.length===0||n.members.every(e=>r.has(e)||c.has(e))&&(c.add(n.id),t=!0)}let l=e=>{if(e===`graph`)return!1;let t=e.indexOf(`:`),n=e.slice(0,t),i=e.slice(t+1);return n===`node`&&r.has(i)||n===`edge`&&a.has(i)||n===`loop`&&s.has(i)},{goal:u,target:d,constraints:f,adaptation:p,description:m,layout:h,policies:g,groups:_,...v}=e,y={...v,nodes:e.nodes.filter(e=>r.has(e.id)),edges:i,loops:o},b=(g??[]).filter(e=>l(e.scope));b.length>0&&(y.policies=b);let x=(_??[]).filter(e=>c.has(e.id));return x.length>0&&(y.groups=x),y}function ln(e){let t=e.nodes.filter(e=>e.kind===`agent`),n=t.map(e=>e.model?.tier??`strong`),r=e.nodes.filter(Re).length,i=e.nodes.filter(e=>e.kind===`human-gate`).length,a=e.loops.filter(e=>e.bar!==void 0).length,o=n.includes(`frontier`)||t.length>=6?`high`:n.length>0&&n.every(e=>e===`fast`)?`low`:`medium`,s=a>=2||t.length>=6?`slow`:a===0&&i===0&&t.length<=3?`fast`:`medium`,c=e.loops.some(e=>e.bar?.answerKeyFrom!==void 0);return{cost:o,speed:s,rigor:r+i===0?`light`:r>=2||c?`high`:`standard`}}var un=24e3;function dn(e,t={}){let n=Ce(e);return[...fn(n),...pn(n),...mn(n),...gn(n),..._n(n),...vn(n),...yn(n),...bn(n),...xn(n),...t.forExport?Sn(n):[],...Tn(n),...En(n),...Dn(n),...kn(n),...jn(n),...Mn(n),...Pn(n),...Fn(n),...In(n),...Ln(n),...Rn(n),...zn(n),...Bn(n),...Vn(n),...Hn(n)]}function fn(t){let n=new Map;for(let e of t.owners){let t=n.get(e.id)??[];t.push(e.kind===`graph`?`the graph's own id`:`${e.kind}s[${e.index}]`),n.set(e.id,t)}let r=[];for(let[t,i]of n)i.length>1&&r.push(e(`E_DUPLICATE_ID`,`id "${t}" is used ${i.length} times: ${i.join(`, `)}`,[t]));return r}function pn(t){let n=[],r=e=>!t.nodes.has(e);for(let i of t.doc.edges??[])r(i.from)&&n.push(e(`E_DANGLING_REF`,`edge "${i.id}" starts at unknown node "${i.from}"`,[i.id])),r(i.to)&&n.push(e(`E_DANGLING_REF`,`edge "${i.id}" ends at unknown node "${i.to}"`,[i.id]));for(let i of t.doc.loops??[]){for(let t of i.members??[])r(t)&&n.push(e(`E_DANGLING_REF`,`loop "${i.id}" lists unknown member "${t}"`,[i.id]));for(let r of i.back??[])t.edges.has(r)||n.push(e(`E_DANGLING_REF`,`loop "${i.id}" lists unknown back edge "${r}"`,[i.id]));i.bar?.answerKeyFrom!==void 0&&r(i.bar.answerKeyFrom)&&n.push(e(`E_DANGLING_REF`,`loop "${i.id}" takes its answer key from unknown node "${i.bar.answerKeyFrom}"`,[i.id])),(i.stops??[]).forEach((t,a)=>{t.then!==void 0&&r(t.then)&&n.push(e(`E_DANGLING_REF`,`loop "${i.id}" stop ${a} (${t.kind}) continues at unknown node "${t.then}"`,[i.id]))})}for(let r of t.doc.groups??[])for(let i of r.members??[])!t.nodes.has(i)&&!t.groups.has(i)&&n.push(e(`E_DANGLING_REF`,`group "${r.id}" lists unknown member "${i}"`,[r.id]));for(let r of t.doc.policies??[]){let i=r.scope;if(i===`graph`)continue;let a=i.indexOf(`:`),o=i.slice(0,a),s=i.slice(a+1);o===`node`&&t.nodes.has(s)||o===`loop`&&t.loops.has(s)||o===`edge`&&t.edges.has(s)||n.push(e(`E_DANGLING_REF`,`policy "${r.id}" is scoped to unknown ${o} "${s}"`,[r.id]))}return n}function mn(t){let n=[],r=t.doc.edges??[];for(let i of t.doc.loops??[]){let a=i.back??[];if(a.length===0){n.push(e(`E_LOOP_BACK_EDGE`,`loop "${i.id}" has no back edge`,[i.id]));continue}let o=new Set(i.members??[]);for(let s of a){let a=t.edges.get(s);if(a){if(!o.has(a.from)||!o.has(a.to)){n.push(e(`E_LOOP_BACK_EDGE`,`loop "${i.id}": back edge "${a.id}" runs ${a.from} → ${a.to}, which is not inside the loop's members`,[i.id,a.id]));continue}De(a.to,a.from,o,r)||n.push(e(`E_LOOP_BACK_EDGE`,`loop "${i.id}": back edge "${a.id}" returns to ${a.to}, but no path inside the loop's members leads from there to ${a.from}`,[i.id,a.id]))}}}return n}var hn=(e,t)=>(t.members??[]).flatMap(t=>{let n=e.groups.get(t);return n?[n]:[]});function gn(t){let n=[],r=new Set;for(let i of t.doc.groups??[]){let a=(o,s)=>{for(let c of hn(t,o))if(c.id===i.id){let t=[...s].sort().join(` `);if(r.has(t))continue;r.add(t),n.push(e(`E_GROUP_CYCLE`,s.length===1?`group "${i.id}" lists itself as a member; a group cannot hold itself`:`group "${i.id}" holds itself: ${[...s,i.id].join(` → `)}; groups form a tree`,s))}else s.includes(c.id)||a(c,[...s,c.id])};a(i,[i.id])}return n}function _n(t){let n=Cn(t).filter(e=>e.role===`lead`);return n.length<2?[]:[e(`E_SECOND_LEAD`,`the graph has ${n.length} lead nodes (${wn(n.map(e=>e.id))}); a graph is one session and has at most one lead`,n.map(e=>e.id))]}function vn(t){return Cn(t).filter(e=>e.role===`lead`&&R(e)).map(t=>e(`E_PERSON_LEAD`,`node "${t.id}" is the lead and is marked as a person's step; the lead is the harness's own session: give the step another role, or leave it an agent's`,[t.id]))}function yn(t){let n=new Set;for(let e of t.doc.loops??[])if((e.stops??[]).length!==0)for(let t of e.back??[])n.add(t);return Ee(t,(t.doc.edges??[]).filter(e=>!n.has(e.id))).map(n=>e(`E_CYCLE_NO_STOP`,`cycle with no stop: ${Te(t,n).join(` → `)}. Cover it with a loop that has at least one stop.`,n))}function bn(t){let n=[];for(let r of t.doc.loops??[])Ue(t,r)===`judgment`&&(Ge(t,r)||n.push(e(`E_JUDGMENT_LOOP_NO_BAR`,r.bar?`judgment loop "${r.id}" has a bar with nothing inspectable; give it at least one file, url, metric, checklist, artifact, or an answer key from a node in the graph`:`judgment loop "${r.id}" has no bar; name what stopping looks like and what the critic inspects`,[r.id])));return n}function xn(t){let n=[];for(let r of t.doc.loops??[]){let i=r.stops??[];i.length!==0&&i.every(e=>e.kind===`bar-passed`)&&(Ge(t,r)||n.push(e(`E_STOP_NOT_INSPECTABLE`,`loop "${r.id}" stops only when its bar passes, but the bar names nothing a critic can inspect. An adjective is not a bar.`,[r.id])))}return n}function Sn(t){let n=[],r=t.doc,i=r.target?.harness;if(i===void 0||i.trim()===``?n.push(e(`E_NO_TARGET`,`export needs a target harness; set target.harness`,[r.id])):Ae(i)||n.push(e(`E_NO_TARGET`,`grooph has no compiler for the harness "${i}", so no package can be written for it; the document is a plan as it is`,[r.id])),(r.goal===void 0||r.goal.trim()===``)&&n.push(e(`E_NO_GOAL`,`export needs a goal; the lead brief is built from it`,[r.id])),r.template!==void 0)n.push(e(`E_IS_TEMPLATE`,`"${r.id}" is a template; instantiate it first (grooph template use ${r.id} --name <graph name>)`,[r.id]));else{for(let t of Zt(r))n.push(e(`E_UNFILLED_SLOT`,`slot {{${t.key}}} is still unfilled in ${wn(t.at)}; replace it with a real value before export`,t.at));let i=Cn(t).filter(R).map(e=>e.id);if(i.length>0){let[t,r]=i.length===1?[`is a person's step`,`it`]:[`are people's steps`,`each`];n.push(e(`E_PERSON_STEP_NOT_COMPILED`,`${wn(i)} ${t}, and grooph cannot yet hand a step to a person inside a harness, so no package is written; the plan exports as it is (PLAN.md, the picture, the file); make ${r} an agent's if the graph is to run`,i))}}return n}var Cn=e=>(e.doc.nodes??[]).filter(we),wn=e=>e.map(e=>`"${e}"`).join(`, `);function Tn(t){let n=(t.doc.policies??[]).filter(e=>e.kind===`critic-isolation`);if(n.length===0)return[];let r=[];for(let i of t.doc.edges??[]){let a=t.nodes.get(i.to);if(!a||!Re(a)||R(a))continue;let o=n.find(e=>$e(t,e,i));if(!o)continue;let s=t.nodes.get(i.from);He(i)===`shared`?r.push(e(`E_CRITIC_NOT_ISOLATED`,`edge "${i.id}" hands critic "${a.id}" shared context, but policy "${o.id}" requires critic isolation; make the edge fresh and list the evidence the critic may inspect`,[i.id,a.id])):s&&ze(s)&&(i.evidence??[]).length===0&&r.push(e(`E_CRITIC_NOT_ISOLATED`,`edge "${i.id}" runs from writer "${s.id}" to critic "${a.id}" with no evidence list, but policy "${o.id}" requires critic isolation; list what the critic may inspect`,[i.id,s.id,a.id]))}return r}function En(t){let n=new Map;for(let e of t.doc.nodes??[])if(ze(e)&&e.kind===`agent`)for(let t of new Set(e.owns??[]))n.set(t,[...n.get(t)??[],e.id]);let r=new Set;for(let e of t.doc.nodes??[])if(e.kind===`merge`)for(let t of e.merges??[])r.add(t);let i=[];for(let[t,a]of n)a.length<2||r.has(t)||i.push(e(`E_OWNERSHIP_CONFLICT`,`artifact "${t}" is owned by writers ${wn(a)} and no merge node lists it in merges; give it one owner, or add a merge node that merges it`,a));return i}function Dn(t){let n=[],r=e=>e.approval===!0||t.nodes.get(e.from)?.kind===`human-gate`,i=new Set(Xe(t));for(let a of Cn(t)){let o=a.irreversible??[];if(o.length===0||R(a))continue;let s=t.incoming.get(a.id)??[],c=s.filter(e=>!r(e)),l=(t.doc.loops??[]).flatMap(e=>(e.stops??[]).flatMap((t,n)=>t.then===a.id?[{loop:e,stop:t,i:n}]:[])),u=l.filter(({stop:e})=>e.kind!==`human`);if(i.has(a.id)&&s.length+l.length>0){n.push(e(`E_IRREVERSIBLE_NO_GATE`,`node "${a.id}" performs irreversible actions (${o.join(`, `)}) and is where the run starts: only ${s.length>0?`a loop's back edge (${wn(s.map(e=>e.id))})`:`a stop of its own loop`} leads to it, so no human decides before it runs the first time; put a human-gate node before it`,[a.id,...s.map(e=>e.id)]));continue}if(s.length+l.length>0&&c.length===0&&u.length===0)continue;let d=[...c.length>0?[wn(c.map(e=>e.id))]:[],...u.map(({loop:e,stop:t,i:n})=>`loop "${e.id}" stop ${n} (${t.kind}), which continues there`)],f=[...c.length>0?[`set approval: true on those edges, or start them at a human-gate node`]:[],...u.length>0?[`have the stop continue at a human-gate node that leads to it`]:[]];n.push(e(`E_IRREVERSIBLE_NO_GATE`,s.length+l.length===0?`node "${a.id}" performs irreversible actions (${o.join(`, `)}) and nothing leads to it, so no human decides before it runs; put a human-gate node before it`:`node "${a.id}" performs irreversible actions (${o.join(`, `)}) and can be reached without a human decision through ${d.join(` and `)}; every way in must pass a human: ${f.join(`, and `)}`,[a.id,...c.map(e=>e.id),...new Set(u.map(({loop:e})=>e.id))]))}return n}function On(e,t){let n=e.model?.pin;if(t!==void 0&&n?.[t]!==void 0)return`pin ${t}: ${n[t]}`;let r=n&&t===void 0?Object.keys(n).sort().map(e=>`${e}: ${n[e]}`):[];return[e.model?`tier ${e.model.tier}`:`the session default`,...r.map(e=>`pin ${e}`)].join(`, `)}function kn(e){let n=new Set((e.doc.loops??[]).flatMap(e=>e.back??[])),r=Cn(e).filter(e=>ze(e)&&!R(e)),i=e.doc.target?.harness,a=typeof i==`string`&&i.trim()!==``?i:void 0,o=[];for(let t of Cn(e).filter(e=>Re(e)&&!R(e))){let i=An(e,t.id,n),s=r.filter(e=>e.id!==t.id&&i.has(e.id));if(s.length===0)continue;let c=On(t,a);s.every(e=>On(e,a)===c)&&o.push({critic:t,writers:s})}return o.length===0?[]:[t(`W_HOMOGENEOUS_CRITICS`,`${o.map(({critic:e,writers:t})=>`critic "${e.id}" judges ${wn(t.map(e=>e.id))} on the same model (${On(e,a)})`).join(`; `)}; a critic on a different tier or pin may catch different mistakes`,Te(e,new Set(o.flatMap(({critic:e,writers:t})=>[e.id,...t.map(e=>e.id)]))))]}function An(e,t,n){let r=new Set([t]),i=new Set,a=[t];for(;a.length>0;){let t=a.shift();for(let o of e.incoming.get(t)??[]){if(n.has(o.id)||r.has(o.from))continue;r.add(o.from);let t=e.nodes.get(o.from);t&&ze(t)?i.add(o.from):a.push(o.from)}}return i}function jn(e){let n=[],r=(t,n=new Set)=>n.has(t)?[]:(n.add(t),(e.groups.get(t)?.members??[]).flatMap(t=>e.groups.has(t)?r(t,n):[t]));for(let i of e.doc.edges??[])if(!((i.concurrency?.max??1)<=1)){e.nodes.get(i.to)?.coupled===!0&&n.push(t(`W_FANOUT_ON_COUPLED`,`edge "${i.id}" fans out up to ${i.concurrency.max} at a time into "${i.to}", which is marked coupled; coupled work should run one at a time`,[i.id,i.to]));for(let a of e.doc.groups??[])a.coupled===!0&&r(a.id).includes(i.to)&&n.push(t(`W_FANOUT_ON_COUPLED`,`edge "${i.id}" fans out up to ${i.concurrency.max} at a time into "${i.to}", a member of coupled group "${a.id}"; coupled work should run one at a time`,[i.id,i.to,a.id]))}let i=new Map;for(let t of Cn(e))if(t.coupled===!0)for(let e of new Set(t.owns??[]))i.set(e,[...i.get(e)??[],t.id]);for(let[e,r]of i)r.length<2||n.push(t(`W_FANOUT_ON_COUPLED`,`coupled nodes ${wn(r)} both own "${e}"; coupled work on one artifact belongs in one node`,r));return n}function Mn(e){let n=[];for(let r of e.doc.loops??[]){let e=r.stops??[];if(e.some(e=>e.kind===`budget`))continue;let i=e.flatMap(e=>e.kind===`max-iterations`?[e.n]:[]);i.some(e=>e<=5)||n.push(t(`W_LONG_LOOP_NO_BUDGET`,`loop "${r.id}" has no budget stop and ${i.length===0?`no max-iterations stop`:`its max-iterations stop allows ${Math.min(...i)} rounds`}; add a budget stop, or cap it at 5 rounds or fewer`,[r.id]))}return n}var Nn=(e,t)=>e.trim().replace(/\s+/g,` `).toLowerCase()===t.trim().replace(/\s+/g,` `).toLowerCase();function Pn(e){let n=[];for(let r of e.doc.loops??[]){let e=r.bar,i=e?.aspiration??``;if(!e||i.trim()===``)continue;let a=e.acceptance??``;a.trim()===``?n.push(t(`W_ASPIRATION_AS_ACCEPTANCE`,`loop "${r.id}" has an aspiration but a blank acceptance, so nothing says when the bar is met; write a reachable acceptance and keep the aspiration as direction`,[r.id])):Nn(i,a)&&n.push(t(`W_ASPIRATION_AS_ACCEPTANCE`,`loop "${r.id}" uses its aspiration as its acceptance; the acceptance must be reachable, the aspiration is only direction`,[r.id]))}return n}function Fn(e){return(e.doc.loops??[]).filter(e=>(e.stops??[]).length>0&&(e.stops??[]).every(e=>e.kind===`max-iterations`)).map(e=>t(`W_ONLY_MAX_ITERATIONS`,`loop "${e.id}" stops only on max-iterations, which is a safety backstop, not a definition of done; add a bar-passed, budget or human stop`,[e.id]))}function In(e){let n=Xe(e),r=Qe(e,n);return(e.doc.nodes??[]).filter(e=>!r.has(e.id)).map(e=>t(`W_UNREACHABLE_NODE`,n.length===0?`node "${e.id}" is not reachable: the graph has no entry node (every node has an inbound edge that is not a loop back edge, or a loop's stop that continues there)`:`node "${e.id}" is not reachable from any entry node (${wn(n)}); connect it or remove it`,[e.id]))}function Ln(e){let n=e.doc.nodes??[];if(n.length===0||e.doc.template?.kind===`fragment`)return[];let r=Qe(e,Xe(e));return n.some(e=>e.kind===`stop`&&r.has(e.id))?[]:[t(`W_NO_TERMINAL`,n.some(e=>e.kind===`stop`)?`no stop node is reachable from an entry node, so the run ends only when no edge is left to take; connect a stop node`:`the graph has no stop node, so the run ends only when no edge is left to take; add one where the work is done`,[e.doc.id])]}function Rn(e){return Cn(e).filter(e=>e.role!==`lead`&&!R(e)&&(e.outputs??[]).length>0).filter(e=>!(e.allow??[]).some(e=>e===`edit-files`||e===`write-outputs`)).map(e=>t(`W_OUTPUT_NOT_WRITABLE`,`agent "${e.id}" must leave outputs behind but is allowed neither edit-files nor write-outputs, so it cannot write them itself; allow write-outputs`,[e.id]))}function zn(e){return Cn(e).filter(R).flatMap(e=>{let n=[`model`,`effort`,`skills`,`allow`,`deny`].filter(t=>e[t]!==void 0&&!(Array.isArray(e[t])&&e[t].length===0));return n.length===0?[]:[t(`W_PERSON_FIELDS_NOT_READ`,`step "${e.id}" is a person's and sets ${n.join(`, `)}: ${n.length===1?`that is`:`those are`} an agent's, and ${n.length===1?`is`:`are`} not read; remove ${n.length===1?`it`:`them`}`,[e.id])]})}function Bn(e){let n=e.doc.groups??[],r=(t,n,i=new Set)=>!i.has(t.id)&&(i.add(t.id),hn(e,t).some(e=>e.id===n||r(e,n,i))),i=new Map;for(let e of n)for(let t of new Set(e.members??[]))t!==e.id&&i.set(t,[...i.get(t)??[],e]);let a=[];for(let[n,o]of i){let i=o.filter(e=>!o.some(t=>t.id!==e.id&&r(e,t.id)));if(i.length<2)continue;let s=e.groups.has(n)?`group`:`node`,c=i.map(e=>`"${e.id}"`);a.push(t(`W_GROUP_OVERLAP`,`${s} "${n}" is a member of groups ${c.slice(0,-1).join(`, `)} and ${c.at(-1)}, and ${c.length===2?`neither holds the other`:`none of them holds another`}; views draw it in "${i[0].id}"`,[n,...i.map(e=>e.id)]))}return a}function Vn(e){let n=[];return he.unknownKeys(e.doc,``,n),n.map(({path:n,key:r,known:i})=>{let a=ye(e.doc,n.slice(0,n.lastIndexOf(`/`)));return t(`W_UNKNOWN_KEY`,`unknown key "${r}" at ${n}${it(r,i)}; it is kept, but grooph does not read it`,a.length>0?a:[e.doc.id])})}function Hn(e){let n=xe(e.doc).length;return n<=24e3?[]:[t(`W_DOC_TOO_LARGE`,`canonical document without layout is ${n} characters, over the ${un}-character budget for rewriting in one pass; split it or shorten the briefs`,[e.doc.id])]}var Un={setGraphName:[`name`],setGraphField:[`key`,`value`],setTarget:[`harness`],setConstraint:[`key`,`value`],addNode:[`kind`,`name`,`id`,`at`,`set`],setNodeName:[`id`,`name`],updateNode:[`id`,`set`],removeNode:[`id`],connect:[`from`,`to`,`id`,`set`],updateEdge:[`id`,`set`],removeEdge:[`id`],addLoop:[`members`,`name`,`id`,`set`],setLoopName:[`id`,`name`],updateLoop:[`id`,`set`],removeLoop:[`id`],toggleLoopMember:[`loop`,`node`,`on`],toggleLoopBack:[`loop`,`edge`,`on`],setBar:[`loop`,`bar`],addStop:[`loop`,`kind`,`set`],setStop:[`loop`,`index`,`stop`],removeStop:[`loop`,`index`],moveStop:[`loop`,`index`,`delta`],addPolicy:[`kind`,`scope`,`params`,`id`],removePolicy:[`id`],setPositions:[`positions`],renameId:[`from`,`to`]},Wn=Object.keys(Un),Gn=[`name`,`goal`,`description`,`adaptation`,`lineage`],Kn=[`budget`,`time`,`other`],qn=[`adaptive`,`propose`,`fixed`],Jn=[`human`,`budget`,`bar-passed`,`diminishing-returns`,`evidence-invalid`,`max-iterations`],Yn=Object.keys(ct),Xn=/^(graph|loop:[a-z][a-z0-9-]*|node:[a-z][a-z0-9-]*|edge:[a-z][a-z0-9-]*)$/;function Zn(e,t){let n=e,r=[];for(let[e,i]of t.entries()){let t=er(i)&&typeof i.op==`string`?i.op:`?`;try{let e=tr(n,i);n=e.doc,r.push(e.id??null)}catch(n){if(n instanceof $n)return{ok:!1,error:{index:e,op:t,message:n.message}};throw n}}return{ok:!0,doc:n,ids:r}}var Qn=e=>`ops[${e.index}] ${e.op}: ${e.message}`,$n=class extends Error{},B=e=>{throw new $n(e)},er=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function tr(e,t){if(!er(t))return B(`an op must be an object like {"op": "addNode", ...}, got ${JSON.stringify(t)}`);let n=t.op;if(typeof n!=`string`)return B(`missing "op": the op's name, one of ${Wn.join(`, `)}`);if(!(n in Un))return B(`unknown op "${n}"${it(n,Wn)}`);let r=new ir(e,t,Un[n]);switch(n){case`setGraphName`:{let t=_t(e,r.str(`name`));return{doc:t,id:t.id}}case`setGraphField`:{let t=r.oneOf(`key`,Gn);return r.raw(`value`)==null?{doc:mt(e,t,void 0)}:t===`adaptation`?{doc:mt(e,t,r.oneOf(`value`,qn))}:t===`lineage`?{doc:mt(e,t,r.obj(`value`))}:{doc:mt(e,t,r.str(`value`))}}case`setTarget`:return{doc:ht(e,r.nullableStr(`harness`))};case`setConstraint`:return{doc:gt(e,r.oneOf(`key`,Kn),r.nullableStr(`value`))};case`addNode`:{let t=yt(e,r.oneOf(`kind`,Yn),{at:r.optPosition(`at`),name:r.optStr(`name`),id:r.optNewId(`id`)}),n=r.optPatch(`set`,[`id`,`kind`]);return{doc:n?bt(t.doc,t.id,e=>nr(e,n)):t.doc,id:t.id}}case`setNodeName`:return xt(e,r.node(`id`),r.str(`name`));case`updateNode`:{let t=r.node(`id`),n=r.patch(`set`,[`id`,`kind`]);return{doc:bt(e,t,e=>nr(e,n))}}case`removeNode`:return{doc:St(e,r.node(`id`))};case`connect`:{let t=wt(e,r.node(`from`),r.node(`to`),{id:r.optNewId(`id`)}),n=r.optPatch(`set`,[`id`]);return{doc:n?Tt(t.doc,t.id,e=>nr(e,n)):t.doc,id:t.id}}case`updateEdge`:{let t=r.edge(`id`),n=r.patch(`set`,[`id`]);return{doc:Tt(e,t,e=>nr(e,n))}}case`removeEdge`:return{doc:Et(e,r.edge(`id`))};case`addLoop`:{let t=Dt(e,r.optList(`members`,(e,t)=>r.existingNode(e,t))??[],{name:r.optStr(`name`),id:r.optNewId(`id`)}),n=r.optPatch(`set`,[`id`]);return{doc:n?Ot(t.doc,t.id,e=>nr(e,n)):t.doc,id:t.id}}case`setLoopName`:return kt(e,r.loop(`id`),r.str(`name`));case`updateLoop`:{let t=r.loop(`id`),n=r.patch(`set`,[`id`]);return{doc:Ot(e,t,e=>nr(e,n))}}case`removeLoop`:return{doc:At(e,r.loop(`id`))};case`toggleLoopMember`:return{doc:Mt(e,r.loop(`loop`),r.node(`node`),r.optBool(`on`))};case`toggleLoopBack`:return{doc:Nt(e,r.loop(`loop`),r.edge(`edge`),r.optBool(`on`))};case`setBar`:return{doc:Pt(e,r.loop(`loop`),r.raw(`bar`)==null?void 0:r.obj(`bar`))};case`addStop`:return{doc:It(e,r.loop(`loop`),r.oneOf(`kind`,Jn),rr(r.optPatch(`set`,[`kind`])??{}))};case`setStop`:{let t=r.loop(`loop`),n=r.stopIndex(t,`index`),i=r.obj(`stop`);return Jn.includes(i.kind)||B(`"stop.kind" must be one of ${Jn.join(` | `)}, got ${JSON.stringify(i.kind)}`),{doc:Lt(e,t,n,i)}}case`removeStop`:{let t=r.loop(`loop`);return{doc:Rt(e,t,r.stopIndex(t,`index`))}}case`moveStop`:{let t=r.loop(`loop`),n=r.stopIndex(t,`index`),i=r.raw(`delta`);return i!==-1&&i!==1&&B(`"delta" must be -1 (earlier) or 1 (later), got ${JSON.stringify(i)}`),{doc:zt(e,t,n,i)}}case`addPolicy`:{let t=r.raw(`kind`),n=typeof t==`string`&&t!==``?t:er(t)&&typeof t.custom==`string`?{custom:t.custom}:B(`"kind" must be a policy kind (for example "critic-isolation") or {"custom": "..."}, got ${JSON.stringify(t)}`),i=r.str(`scope`);Xn.test(i)||B(`"scope" must be graph, loop:<id>, node:<id> or edge:<id>, got ${JSON.stringify(i)}`);let a=r.raw(`params`)===void 0?void 0:r.obj(`params`);return Bt(e,{kind:n,scope:i,id:r.optNewId(`id`),...a?{params:a}:{}})}case`removePolicy`:return{doc:Vt(e,r.policy(`id`))};case`setPositions`:{let t=r.obj(`positions`),n={};for(let[e,i]of Object.entries(t))r.existingNode(e,`positions key`),n[e]=r.position(i,`positions.${e}`);return{doc:Ht(e,n)}}case`renameId`:{let t=r.str(`from`),n=z(e);for(let t of e.notes??[])n.delete(t.id);n.has(t)||B(`no object has id "${t}"${it(t,n)}`);let i=r.newId(`to`);return{doc:Ut(e,t,i),id:i}}default:return B(`unknown op "${n}"`)}}function nr(e,t){let n={...e};for(let[e,r]of Object.entries(t))r===null?delete n[e]:n[e]=r;return n}var rr=e=>Object.fromEntries(Object.entries(e).filter(([,e])=>e!==null)),ir=class{doc;op;constructor(e,t,n){this.doc=e,this.op=t;for(let e of Object.keys(t))e===`op`||n.includes(e)||B(`unknown argument "${e}"${it(e,n)}; this op takes ${n.map(e=>`"${e}"`).join(`, `)}`)}raw(e){return this.op[e]}str(e){let t=this.op[e];return typeof t!=`string`&&B(`"${e}" must be a string, got ${ar(t)}`),t}optStr(e){return this.op[e]===void 0?void 0:this.str(e)}nullableStr(e){return this.op[e]==null?void 0:this.str(e)}optBool(e){let t=this.op[e];if(t!==void 0)return typeof t!=`boolean`&&B(`"${e}" must be true or false, got ${ar(t)}`),t}oneOf(e,t){let n=this.op[e];return(typeof n!=`string`||!t.includes(n))&&B(`"${e}" must be one of ${t.join(` | `)}, got ${ar(n)}${typeof n==`string`?it(n,t):``}`),n}obj(e){let t=this.op[e];er(t)||B(`"${e}" must be an object, got ${ar(t)}`);for(let n of[`__proto__`,`constructor`,`prototype`])Object.hasOwn(t,n)&&B(`"${e}" cannot hold the key "${n}"`);return t}optList(e,t){let n=this.op[e];if(n!==void 0)return Array.isArray(n)?n.map((n,r)=>t(n,`${e}[${r}]`)):B(`"${e}" must be a list, got ${ar(n)}`)}patch(e,t){let n=this.obj(e);for(let r of t)r in n&&B(r===`id`?`"${e}" cannot change the id; use renameId, which updates every reference`:`"${e}" cannot change "${r}"; remove the object and add a new one`);return n}optPatch(e,t){return this.op[e]===void 0?void 0:this.patch(e,t)}position(e,t){(!er(e)||typeof e.x!=`number`||typeof e.y!=`number`)&&B(`"${t}" must be {"x": number, "y": number}, got ${ar(e)}`);let{x:n,y:r}=e;return{x:n,y:r}}optPosition(e){return this.op[e]===void 0?void 0:this.position(this.op[e],e)}newId(e){let t=this.str(e);return l.test(t)||B(`"${e}" must be a kebab-case id (${l.source}), got ${JSON.stringify(t)}`),z(this.doc).has(t)&&B(`"${e}": id "${t}" is already used in this document`),t}optNewId(e){return this.op[e]===void 0?void 0:this.newId(e)}existingNode(e,t){if(typeof e!=`string`)return B(`"${t}" must be a node id, got ${ar(e)}`);let n=this.doc.nodes.map(e=>e.id);return n.includes(e)||B(`"${t}": no node "${e}"${it(e,n)}`),e}node(e){return this.existingNode(this.op[e],e)}edge(e){return this.existing(e,`edge`,this.doc.edges.map(e=>e.id))}loop(e){return this.existing(e,`loop`,this.doc.loops.map(e=>e.id))}policy(e){return this.existing(e,`policy`,(this.doc.policies??[]).map(e=>e.id))}stopIndex(e,t){let n=this.op[t],r=this.doc.loops.find(t=>t.id===e)?.stops??[];return(typeof n!=`number`||!Number.isInteger(n)||n<0||n>=r.length)&&B(r.length===0?`loop "${e}" has no stops yet`:`"${t}" must be a stop index from 0 to ${r.length-1} in loop "${e}", got ${ar(n)}`),n}existing(e,t,n){let r=this.str(e);return n.includes(r)||B(`"${e}": no ${t} "${r}"${it(r,n)}`),r}},ar=e=>e===void 0?`nothing`:Array.isArray(e)?`a list`:JSON.stringify(e),or=()=>d({integer:!0,minimum:0}),sr=E({agents:or(),people:s(or()),checks:or(),gates:or(),loops:or(),tiers:E({frontier:or(),strong:or(),fast:or(),unset:or()}),worstCaseRounds:k([or(),p()],{describe:`integer or null`}),budgets:b(c())},{name:`Shape`}),cr=O(e=>typeof e==`object`&&!!e&&!Array.isArray(e)&&`file`in e&&!(`grooph`in e),E({file:c({minLength:1})},{name:`CandidateFile`}),m(he,ge),{describe:`graph document or { file }`}),lr=E({id:u(),label:c({minLength:1}),graph:cr,basedOn:s(c()),rationale:c(),pros:b(c()),cons:b(c()),profile:fe,shape:s(sr)},{name:`Candidate`}),ur=E({groophProposals:h(0),id:u(),title:c(),brief:c(),candidates:b(lr,{minItems:1,maxItems:4}),recommendation:s(E({candidate:u(),why:c()}))},{describe:`proposal set`}),dr=(e,t,n,r=[])=>({code:e,severity:t,message:n,at:r});function fr(e){let t=[];return ur.check(e,``,t),t.length>0?{issues:t.map(t=>dr(`E_SCHEMA`,`error`,`${t.path===``?`/`:t.path}: ${t.message}`,ye(e,t.path)))}:{set:e,issues:[]}}var pr=e=>typeof e==`object`&&!!e&&!Array.isArray(e)&&`groophProposals`in e,mr=e=>!(`grooph`in e)&&`file`in e;function hr(e,t={}){let n=fr(e);if(!n.set)return n.issues;let r=e.candidates,i=[],a=new Map;a.set(e.id,[`the set's own id`]),r.forEach((e,t)=>a.set(e.id,[...a.get(e.id)??[],`candidates[${t}]`]));for(let[e,t]of a)t.length>1&&i.push(dr(`E_DUPLICATE_ID`,`error`,`id "${e}" is used ${t.length} times: ${t.join(`, `)}`,[e]));let o=new Map;for(let e of r){let t=gr(e.label);o.set(t,[...o.get(t)??[],e])}for(let e of o.values())e.length<2||i.push(dr(`E_DUPLICATE_LABEL`,`error`,`candidates ${e.map(e=>`"${e.id}"`).join(`, `)} share the label "${e[0].label}"; labels are what the owner says back, so each must differ (case is ignored)`,e.map(e=>e.id)));let s=e.recommendation?.candidate;s!==void 0&&!r.some(e=>e.id===s)&&i.push(dr(`E_DANGLING_REF`,`error`,`the recommendation names candidate "${s}", which is not in the set${it(s,r.map(e=>e.id))}`,[e.id]));for(let e of r){if(mr(e.graph)){t.requireInline&&i.push(dr(`E_CANDIDATE_INVALID`,`error`,`candidate "${e.id}" (${e.label}) points at ${e.graph.file} instead of carrying its graph; grooph share inlines it`,[e.id]));continue}let n=dn(e.graph).filter(e=>e.severity===`error`);if(n.length===0)continue;let r=[...new Set(n.map(e=>e.code))];i.push(dr(`E_CANDIDATE_INVALID`,`error`,`candidate "${e.id}" (${e.label}) has errors: ${r.join(`, `)}. First: ${n[0].message}. Fix its graph and run grooph validate on it`,[e.id]))}let c=[];ur.unknownKeys(e,``,c);for(let{path:t,key:n,known:r}of c.filter(e=>!/^\/candidates\/\d+\/graph\//.test(e.path))){let a=ye(e,t.slice(0,t.lastIndexOf(`/`)));i.push(dr(`W_UNKNOWN_KEY`,`warning`,`unknown key "${n}" at ${t}${it(n,r)}; it is kept, but grooph does not read it`,a.length>0?a:[e.id]))}return i}var gr=e=>e.trim().replace(/\s+/g,` `).toLowerCase(),_r=e=>{let t=(e.stops??[]).flatMap(e=>e.kind===`max-iterations`?[e.n]:[]);return t.length===0?void 0:Math.min(...t)};function vr(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`&&!R(e)&&(r[e.model?.tier??`unset`]+=1);let i=n.map(_r),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}: `:``}${yr(t.measure,t.limit)}`]:[]));return{agents:t.filter(e=>e.kind===`agent`&&!R(e)).length,...t.some(R)?{people:t.filter(R).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}}var yr=(e,t)=>e===`usd`?`$${t}`:`${t} ${e}`,br=(e,t,n=`${t}s`)=>`${e} ${e===1?t:n}`;function xr(e){let t=e.people??0,n=t===0?[br(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(br(e.checks,`check`)),e.gates>0&&n.push(br(e.gates,`gate`)),e.loops===0?n.push(`no loop`):(n.push(br(e.loops,`loop`)),n.push(e.worstCaseRounds===null?`no round cap`:`up to ${br(e.worstCaseRounds,`round`)}`)),n.push(...e.budgets),n.join(` · `)}function Sr(e){return[`frontier`,`strong`,`fast`,`unset`].filter(t=>e.tiers[t]>0).map(t=>`${e.tiers[t]} ${t===`unset`?`session default`:t}`).join(` · `)}var Cr=E({id:u(),name:c(),machine:c({minLength:1}),place:s(g(`local`,`cloud`)),account:c({minLength:1}),description:s(c())},{name:`Lane`}),wr=E({id:u(),name:c(),role:s(c()),description:s(c())},{name:`Person`}),Tr=E({id:u(),name:c(),lane:u(),harness:y([`claude-code`,`codex`],`harness id`),model:s(c()),role:c({minLength:1}),lifetime:s(g(`long-lived`,`per-task`,`scheduled`)),count:s(d({integer:!0,minimum:1})),graph:s(c({minLength:1})),repo:s(c()),description:s(c())},{name:`Session`}),Er=e=>h(e),Dr=D(`kind`,{branch:E({kind:Er(`branch`),repo:s(c()),ref:s(c())}),"pull-request":E({kind:Er(`pull-request`),repo:s(c())}),"session-message":E({kind:Er(`session-message`)}),"scheduled-message":E({kind:Er(`scheduled-message`),schedule:s(c())}),"review-page":E({kind:Er(`review-page`),where:s(c())}),person:E({kind:Er(`person`),who:s(c())}),notification:E({kind:Er(`notification`),where:s(c())}),other:E({kind:Er(`other`),name:s(c())})},{name:`Carrier`,label:`carrier`}),Or=E({id:u(),from:u(),to:u(),carrier:s(Dr),what:s(c()),label:s(c())},{name:`Handoff`}),kr=E({groophMap:h(0),id:u(),name:c(),version:d({integer:!0,minimum:0}),asOf:s(c({pattern:/^\d{4}-\d{2}-\d{2}$/,patternName:`date as YYYY-MM-DD`})),description:s(c()),lanes:b(Cr),people:s(b(wr)),sessions:b(Tr),handoffs:b(Or)},{describe:`operation map`}),V=(e,t,n=[])=>({code:e,severity:e.startsWith(`E_`)?`error`:`warning`,message:t,at:n});function Ar(e){let t=[];return kr.check(e,``,t),t.length>0?{issues:t.map(t=>V(`E_SCHEMA`,`${t.path===``?`/`:t.path}: ${t.message}`,ye(e,t.path)))}:{map:e,issues:[]}}var jr=e=>typeof e==`object`&&!!e&&!Array.isArray(e)&&`groophMap`in e;function Mr(e){return`${JSON.stringify(kr.canon(e),null,2)}\n`}var Nr={branch:`branch`,"pull-request":`pull request`,"session-message":`session message`,"scheduled-message":`scheduled message`,"review-page":`review page`,person:`person`,notification:`notification`,other:`other`},Pr=e=>e===void 0||e.trim()===``;function Fr(e){switch(e.kind){case`branch`:case`pull-request`:return{field:`repo`,value:e.repo};case`review-page`:return{field:`where`,value:e.where};case`person`:return{field:`who`,value:e.who};case`other`:return{field:`name`,value:e.name};case`session-message`:case`scheduled-message`:case`notification`:return{}}}function Ir(e,t){if(!e)return``;switch(e.kind){case`branch`:return Pr(e.repo)?``:`branch ${Pr(e.ref)?``:`${e.ref} `}on ${e.repo}`;case`pull-request`:return Pr(e.repo)?``:`pull request on ${e.repo}`;case`session-message`:return`session message`;case`scheduled-message`:return Pr(e.schedule)?`scheduled message`:`scheduled message, ${e.schedule}`;case`review-page`:return Pr(e.where)?``:`review page: ${e.where}`;case`person`:return Pr(e.who)?Pr(t)?``:`carried by ${t}`:`carried by ${e.who}`;case`notification`:return Pr(e.where)?`notification`:`notification, ${e.where}`;case`other`:return Pr(e.name)?``:e.name}}function Lr(e,t={}){let n=Ar(e);if(!n.map)return n.issues;let r=new Map(e.lanes.map(e=>[e.id,e])),i=new Map(e.sessions.map(e=>[e.id,e])),a=new Map((e.people??[]).map(e=>[e.id,e])),o=[],s=new Map,c=(e,t)=>s.set(e,[...s.get(e)??[],t]);c(e.id,`the map's own id`),e.lanes.forEach((e,t)=>c(e.id,`lanes[${t}]`)),(e.people??[]).forEach((e,t)=>c(e.id,`people[${t}]`)),e.sessions.forEach((e,t)=>c(e.id,`sessions[${t}]`)),e.handoffs.forEach((e,t)=>c(e.id,`handoffs[${t}]`));for(let[e,t]of s)t.length>1&&o.push(V(`E_DUPLICATE_ID`,`id "${e}" is used ${t.length} times: ${t.join(`, `)}`,[e]));for(let t of e.sessions)r.has(t.lane)||o.push(V(`E_DANGLING_REF`,`session "${t.id}" is in unknown lane "${t.lane}"${it(t.lane,[...r.keys()])}`,[t.id]));for(let t of e.handoffs)for(let[e,n]of[[`starts at`,t.from],[`ends at`,t.to]])if(!i.has(n)&&!a.has(n)){let r=a.size>0?`"${n}", which is neither a session nor a person`:`unknown session "${n}"`;o.push(V(`E_DANGLING_REF`,`handoff "${t.id}" ${e} ${r}${it(n,[...i.keys(),...a.keys()])}`,[t.id]))}for(let t of e.handoffs){let e=`"${t.from}" → "${t.to}"`;if(!t.carrier){o.push(V(`E_HANDOFF_NO_CARRIER`,`handoff "${t.id}" (${e}) names no carrier; say what moves the work across: a branch, a pull-request, a session-message, a scheduled-message, a review-page, a person, or other`,[t.id]));continue}let n=Fr(t.carrier);t.carrier.kind===`person`&&a.has(t.from)||n.field!==void 0&&Pr(n.value)&&o.push(V(`E_HANDOFF_NO_CARRIER`,`handoff "${t.id}" (${e}) is carried by a ${Nr[t.carrier.kind]} that is not named; set carrier.${n.field}`,[t.id]))}for(let t of e.handoffs){let e=i.get(t.from),n=i.get(t.to);if(!t.carrier||!e||!n)continue;let a=r.get(e.lane),s=r.get(n.lane),c=a&&s&&a.account!==s.account?`accounts "${a.account}" and "${s.account}"`:void 0,l=e.harness===n.harness?void 0:`harnesses "${e.harness}" and "${n.harness}"`,u=t.carrier.kind,d=u===`session-message`||u===`scheduled-message`,f=d?c??l:u===`review-page`?c:void 0;if(f===void 0)continue;let p=d?`a ${Nr[u]} stays inside one harness and one account`:`a published page belongs to the account that published it`;o.push(V(`W_CARRIER_CANNOT_CROSS`,`handoff "${t.id}" ("${t.from}" → "${t.to}") crosses ${f} by ${Nr[u]}; ${p}, so something else carries this: a branch, a pull request, or a person`,[t.id,t.from,t.to]))}for(let t of e.handoffs)t.carrier?.kind===`notification`&&i.has(t.to)&&o.push(V(`W_NOTIFY_NOT_PERSON`,`handoff "${t.id}" sends a notification to session "${t.to}"; a notification reaches a person, and a session is reached by a message, a branch or a pull request. Name the person it reaches, or the carrier that reaches the session`,[t.id,t.to]));let l=new Set(e.handoffs.map(e=>e.from)),u=new Set(e.handoffs.map(e=>e.to));for(let t of e.sessions)!l.has(t.id)&&!u.has(t.id)&&o.push(V(`W_SESSION_ISLAND`,`session "${t.id}" has no handoff in or out: nothing reaches it and it reaches nothing`,[t.id]));let d=new Set(e.handoffs.filter(e=>e.from!==e.to).flatMap(e=>[e.from,e.to]));for(let t of e.people??[])d.has(t.id)||o.push(V(`W_SESSION_ISLAND`,`person "${t.id}" has no handoff in or out: nothing reaches them and they reach nothing`,[t.id]));for(let t of e.sessions)u.has(t.id)&&!l.has(t.id)&&o.push(V(`W_NO_RETURN`,`session "${t.id}" is handed work and hands nothing on: add the handoff its results leave by, and name the carrier`,[t.id]));if(t.resolveGraph)for(let n of e.sessions)n.graph!==void 0&&t.resolveGraph(n.graph,n)===!1&&o.push(V(`W_GRAPH_UNRESOLVED`,`session "${n.id}" points at graph "${n.graph}", which is not a graph document that could be read`,[n.id]));let f=[];kr.unknownKeys(e,``,f);for(let t of f)o.push(V(`W_UNKNOWN_KEY`,`${t.path===``?`/`:t.path}: unknown key "${t.key}"${it(t.key,t.known)}`,ye(e,t.path)));let p=Mr(e).length;return p>24e3&&o.push(V(`W_DOC_TOO_LARGE`,`the map is ${p.toLocaleString(`en`)} characters in canonical form, over the ${un.toLocaleString(`en`)} a model rewrites in one pass; draw families as one session with a count, or split the map`,[e.id])),o}function Rr(e){let t=new Map(e.sessions.map(e=>[e.id,e])),n=new Map((e.people??[]).map(e=>[e.id,e])),r={};for(let t of e.handoffs){let e=t.carrier?.kind??`none`;r[e]=(r[e]??0)+1}let i={};for(let t of e.sessions)i[t.harness]=(i[t.harness]??0)+(t.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:r,harnesses:i,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 zr(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 Br(e,t){return e.sessions.find(e=>e.id===t)?.name||(e.people??[]).find(e=>e.id===t)?.name||t}var Vr=(e,t)=>(e.people??[]).find(e=>e.id===t.from);function Hr(e,t){let n=Vr(e,t);return Ir(t.carrier,n?n.name||n.id:void 0)}function Ur(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}function Wr(e,t){return{out:e.handoffs.filter(e=>e.from===t),in:e.handoffs.filter(e=>e.to===t)}}var Gr=()=>m(he,ge),Kr=E({groophRun:h(0),run:c({minLength:1}),progress:s(c()),source:Gr(),working:Gr(),notes:b(m(me,`${ge}#/$defs/RunNote`)),issues:s(b(E({line:d({integer:!0,minimum:1}),message:c()},{name:`RunNoteIssue`})))},{describe:`run bundle`}),qr={pass:`passed`,fail:`failed`,"invalid-evidence":`failed`,halt:`halted`},Jr=e=>e.outcome===`started`||e.outcome===`ending`;function Yr(e){if(e.outcome===`started`)return{kind:`started`};if(e.outcome!==`ending`){if(e.outcome!==void 0)return{kind:`result`,state:qr[e.outcome]??`passed`};if(e.ended!==void 0)return{kind:`result`,state:`passed`};if(e.started!==void 0)return{kind:`started`}}}var Xr=e=>{if(e===`graph`)return{kind:`graph`};let t=e.indexOf(`:`);return{kind:e.slice(0,t),id:e.slice(t+1)}},Zr=e=>e.at===`graph`&&e.outcome!==void 0&&!Jr(e);function Qr(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=$r(t);for(let s of e){s.cost&&(a[s.cost.measure]=(a[s.cost.measure]??0)+s.cost.amount);let e=Xr(s.at);if(e.kind===`node`&&e.id!==void 0){let t=n[e.id]??={state:`pending`,runs:0},a=Yr(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&&!Jr(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=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?ni(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=ri(e,Zr);if(l>=0){c=e[l];let t=c.outcome===`halt`&&e.slice(l+1).some(e=>e.at.startsWith(`node:`)&&Yr(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[ri(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 $r(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}var ei=[[`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]],ti=[`human`,`budget`,`bar-passed`,`diminishing-returns`,`evidence-invalid`,`max-iterations`];function ni(e,t){if(e.stop!==void 0)return ti.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=ei.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 ri(e,t){for(let n=e.length-1;n>=0;n--)if(t(e[n]))return n;return-1}var ii=e=>e.outcome===void 0||e.state===`halted`&&e.outcome===`halt`?e.state:`${e.state} · ${e.outcome}`,ai=(e,t)=>JSON.stringify(oi(e))===JSON.stringify(oi(t)),oi=e=>{if(Array.isArray(e))return e.map(oi);if(typeof e==`object`&&e){let t={};for(let n of Object.keys(e).sort())e[n]!==void 0&&(t[n]=oi(e[n]));return t}return e};function si(e,t,n){let r={},i=[],a=[...new Set([...Object.keys(e),...Object.keys(t)])].filter(e=>!n.includes(e));for(let n of a)ai(e[n],t[n])||(r[n]=t[n]===void 0?null:t[n],i.push({key:n,...e[n]===void 0?{}:{before:e[n]},...t[n]===void 0?{}:{after:t[n]}}));return{set:r,fields:i}}var ci={brief:`brief`,outputs:`outputs`,inputs:`inputs`,allow:`allowed capabilities`,deny:`denied capabilities`,owns:`owned artifacts`,irreversible:`irreversible actions`,model:`model`,effort:`effort`,role:`role`,name:`name`,description:`description`,prompt:`question`,options:`options`,check:`check`,merges:`merged artifacts`,strategy:`merge strategy`,outcome:`outcome`,coupled:`coupling`,when:`condition`,isolation:`isolation`,concurrency:`concurrency`,retry:`retries`,evidence:`evidence`,approval:`approval`,label:`label`,from:`start`,to:`end`,members:`members`,back:`back edges`,mode:`mode`,bar:`bar`,stops:`stops`},li=e=>{let t=e.map(e=>ci[e]??e);return t.length<=1?t[0]??``:`${t.slice(0,-1).join(`, `)} and ${t[t.length-1]}`},ui={budget:`budget`,time:`time limit`,other:`other limits`},di=[`name`,`goal`,`description`,`adaptation`,`lineage`],fi=e=>`${e.name||e.id} (${e.id})`,pi=(e,t)=>{let n=e=>t.nodes.find(t=>t.id===e)?.name||e;return`edge ${n(e.from)} → ${n(e.to)} (${e.id})`},mi=e=>`loop ${e.name||e.id} (${e.id})`,hi=e=>typeof e.kind==`string`?e.kind:`custom "${e.kind.custom}"`;function gi(e,t){let n=[],r=[],i=[],a=[],o=[],s=[];e.id!==t.id&&n.push({line:`Renamed the graph id from ${e.id} to ${t.id}`,op:{op:`renameId`,from:e.id,to:t.id},at:`graph`,fields:[{key:`id`,before:e.id,after:t.id}]});for(let r of di){if(ai(e[r],t[r]))continue;let i=e[r],a=t[r],o=r===`name`?`Renamed the graph from "${String(i??``)}" to "${String(a??``)}"`:r===`adaptation`?`Adaptation: ${String(i??`adaptive (default)`)} → ${String(a??`adaptive (default)`)}`:`${a===void 0?`Removed`:i===void 0?`Added`:`Changed`} the graph's ${r}`;n.push({line:o,op:{op:`setGraphField`,key:r,value:a??null},at:`graph`,fields:[{key:r,...i===void 0?{}:{before:i},...a===void 0?{}:{after:a}}]})}if(!ai(e.target,t.target)){let r=e.target?.harness,i=t.target?.harness;n.push({line:i===void 0?`Removed the target harness`:`Target harness: ${r??`none`} → ${i}`,op:{op:`setTarget`,harness:i??null},at:`graph`,fields:[{key:`target`,...r?{before:r}:{},...i?{after:i}:{}}]})}for(let r of[`budget`,`time`,`other`]){let i=e.constraints?.[r],a=t.constraints?.[r];if(i===a)continue;let o=a===void 0?`Removed`:i===void 0?`Added`:`Changed`;n.push({line:`${o} the graph's ${ui[r]} (constraints.${r})`,op:{op:`setConstraint`,key:r,value:a??null},at:`graph`,fields:[{key:`constraints.${r}`,...i===void 0?{}:{before:i},...a===void 0?{}:{after:a}}]})}ai(e.template,t.template)||s.push({line:`${t.template?`Changed`:`Removed`} the template block; no op expresses this`,at:`graph`,fields:[{key:`template`,before:e.template,after:t.template}]}),ai(e.groups,t.groups)||s.push({line:`Changed the groups; no op expresses this`,at:`graph`,fields:[{key:`groups`,before:e.groups,after:t.groups}]});let c=new Set([`grooph`,`id`,`name`,`version`,`goal`,`target`,`constraints`,`adaptation`,`lineage`,`template`,`description`,`nodes`,`edges`,`loops`,`policies`,`groups`,`notes`,`layout`]);for(let n of new Set([...Object.keys(e),...Object.keys(t)])){if(c.has(n))continue;let r=e[n],i=t[n];ai(r,i)||s.push({line:`Changed the unknown key "${n}"; no op expresses this`,at:`graph`,fields:[{key:n,before:r,after:i}]})}let l=new Map(e.nodes.map(e=>[e.id,e])),u=new Map(t.nodes.map(e=>[e.id,e]));for(let e of t.nodes){let t=l.get(e.id);if(!t){let{id:t,kind:n,name:i,...a}=e,o={...a};for(let r of Object.keys(vt(n,t,i)))!(r in e)&&![`id`,`kind`,`name`].includes(r)&&(o[r]=null);r.push({line:`Added ${n} node ${fi(e)}`,op:{op:`addNode`,kind:n,id:t,name:i,...Object.keys(o).length>0?{set:o}:{}},at:t,fields:[]});continue}if(t.kind!==e.kind){s.push({line:`${fi(e)} changed kind from ${t.kind} to ${e.kind}; no op expresses this`,at:e.id,fields:[{key:`kind`,before:t.kind,after:e.kind}]});continue}let{set:n,fields:a}=si(t,e,[`id`,`kind`]);a.length>0&&i.push({line:`Changed the ${li(a.map(e=>e.key))} of ${fi(e)}`,op:{op:`updateNode`,id:e.id,set:n},at:e.id,fields:a})}for(let t of e.nodes)u.has(t.id)||o.push({line:`Removed node ${fi(t)}`,op:{op:`removeNode`,id:t.id},at:t.id,fields:[]});let d=new Map(e.edges.map(e=>[e.id,e])),f=new Map(t.edges.map(e=>[e.id,e]));for(let e of t.edges){let n=d.get(e.id);if(!n){let{id:n,from:i,to:a,...o}=e;r.push({line:`Added ${pi(e,t)}`,op:{op:`connect`,from:i,to:a,id:n,...Object.keys(o).length>0?{set:o}:{}},at:n,fields:[]});continue}let{set:a,fields:o}=si(n,e,[`id`]);o.length>0&&i.push({line:`Changed the ${li(o.map(e=>e.key))} of ${pi(e,t)}`,op:{op:`updateEdge`,id:e.id,set:a},at:e.id,fields:o})}for(let t of e.edges)f.has(t.id)||o.push({line:`Removed ${pi(t,e)}`,op:{op:`removeEdge`,id:t.id},at:t.id,fields:[]});let p=new Map(e.loops.map(e=>[e.id,e])),m=new Map(t.loops.map(e=>[e.id,e]));for(let e of t.loops){let t=p.get(e.id);if(!t){let{id:t,name:n,members:i,...a}=e;r.push({line:`Added ${mi(e)}`,op:{op:`addLoop`,members:i,name:n,id:t,set:a},at:t,fields:[]});continue}let{set:n,fields:a}=si(t,e,[`id`]);a.length>0&&i.push({line:`Changed the ${li(a.map(e=>e.key))} of ${mi(e)}`,op:{op:`updateLoop`,id:e.id,set:n},at:e.id,fields:a})}for(let t of e.loops)m.has(t.id)||o.push({line:`Removed ${mi(t)}`,op:{op:`removeLoop`,id:t.id},at:t.id,fields:[]});let h=new Map((e.policies??[]).map(e=>[e.id,e])),g=new Map((t.policies??[]).map(e=>[e.id,e]));for(let t of e.policies??[]){let e=g.get(t.id);e&&ai(e,t)||a.push({line:`${e?`Replaced`:`Removed`} policy ${hi(t)} on ${t.scope} (${t.id})`,op:{op:`removePolicy`,id:t.id},at:t.id,fields:[]})}for(let e of t.policies??[]){let t=h.get(e.id);if(t&&ai(t,e))continue;let n={line:`${t?`Now`:`Added`} policy ${hi(e)} on ${e.scope} (${e.id})`,op:{op:`addPolicy`,kind:e.kind,scope:e.scope,id:e.id,...e.params?{params:e.params}:{}},at:e.id,fields:[]};if(t){let r=a.find(t=>t.at===e.id);r.line=`Changed policy ${hi(e)} on ${e.scope} (${e.id})`,r.fields=[{key:`policy`,before:t,after:e}],a.push({...n,line:``})}else a.push(n)}let _={removeLoop:0,removeEdge:1,removeNode:2};o.sort((e,t)=>(_[e.op.op]??0)-(_[t.op.op]??0));let v=[...n,...r,...i,...a,...o],y=v.map(e=>e.op),b=[...v,...s].filter(e=>e.line!==``),x=Zn(e,y);return{changes:b,ops:y,exact:s.length===0&&x.ok&&_i(x.doc)===_i(t)}}var _i=e=>{let{layout:t,notes:n,...r}=e;return be({...r,version:0})};function vi(e,t){let n=t.map(e=>xi(e.amendment?.patch)?e.amendment.patch:[]);return e.map(e=>{let r=t.filter((t,r)=>n[r].some(t=>bi(t,e)));if(r.length>0)return r.map(e=>e.id);if(e.at!==`graph`){let n=RegExp(`(^|[^a-z0-9-])${e.at.replace(/[-]/g,`\\-`)}([^a-z0-9-]|$)`),r=t.filter(e=>n.test(`${e.amendment.summary} ${e.amendment.reason} ${JSON.stringify(e.amendment.patch??``)}`));if(r.length>0)return r.map(e=>e.id)}return t.length===1&&n[0].length===0?[t[0].id]:[]})}var yi={setGraphName:`graph`,setGraphField:`graph`,setTarget:`graph`,setConstraint:`graph`,renameId:`graph`,addNode:`id`,setNodeName:`id`,updateNode:`id`,removeNode:`id`,connect:`id`,updateEdge:`id`,removeEdge:`id`,addLoop:`id`,setLoopName:`id`,updateLoop:`id`,removeLoop:`id`,toggleLoopMember:`loop`,toggleLoopBack:`loop`,setBar:`loop`,addStop:`loop`,setStop:`loop`,removeStop:`loop`,moveStop:`loop`,addPolicy:`id`,removePolicy:`id`};function bi(e,t){let n=yi[e.op];if(n===void 0)return!1;if(n===`graph`)return t.at===`graph`?e.op===`setConstraint`?t.fields.some(t=>t.key===`constraints.${String(e.key)}`):e.op===`setGraphField`?t.fields.some(t=>t.key===e.key):e.op===`setGraphName`?t.fields.some(e=>e.key===`name`):e.op===`setTarget`?t.fields.some(e=>e.key===`target`):e.op===`renameId`&&t.fields.some(e=>e.key===`id`):!1;if(e[n]!==t.at)return!1;let r=e.set;return t.op?.op.startsWith(`update`)&&typeof r==`object`&&r&&!Array.isArray(r)?Object.keys(r).some(e=>t.fields.some(t=>t.key===e)):!0}function xi(e){return Array.isArray(e)&&e.length>0&&e.every(e=>typeof e==`object`&&!!e&&!Array.isArray(e)&&Wn.includes(e.op))}function Si(e){return e==null?{kind:`none`}:xi(e)?{kind:`ops`,ops:e}:Array.isArray(e)&&e.some(e=>typeof e==`object`&&!!e&&`path`in e&&`op`in e)?{kind:`other`,why:`This patch uses index paths (JSON Patch), which grooph does not replay: paths like /nodes/2 point at whatever sits there now, so they break when anything is reordered. Read it and make the change by hand, or ask for it as grooph ops.`}:{kind:`other`,why:`This patch is not a list of grooph ops, so grooph cannot apply it. Read it and make the change by hand, or ask for it as grooph ops.`}}function Ci(e,t,n={}){let i=`${e.id}@${e.version}`,{notes:a,layout:o,...s}=t,c=o??e.layout,l=new Set(t.nodes.map(e=>e.id)),u=c?Object.fromEntries(Object.entries(c).filter(([e])=>l.has(e))):void 0,d={...s,id:e.id,name:e.name,version:e.version+1,lineage:{...t.lineage,from:i},...e.notes&&e.notes.length>0?{notes:e.notes}:{},...u&&Object.keys(u).length>0?{layout:u}:{}},f=dn(d,{forExport:!0}).filter(e=>e.severity===`error`);return f.length>0?{ok:!1,message:`The working copy has ${f.length===1?`an error`:`${f.length} errors`} that ${f.length===1?`blocks`:`block`} export, so it cannot become version ${e.version+1} of ${e.id}. Discard it, or fix the working copy and adopt again. First: ${r(f[0])}`,issues:f}:{ok:!0,doc:d,from:i,...n.run===void 0?{}:{run:n.run}}}var wi=e=>typeof e==`object`&&!!e&&!Array.isArray(e)&&`groophRun`in e;function Ti(e){if(wi(e)){let t=e.groophRun;if(typeof t==`number`&&t>0)return{issues:[`/groophRun: made by a newer grooph (run format ${t})`],newer:t}}let t=[];return Kr.check(e,``,t),t.length>0?{issues:t.map(e=>`${e.path===``?`/`:e.path}: ${e.message}`)}:{bundle:e,issues:[]}}function Ei(e){let t;try{t=JSON.parse(e)}catch(e){return{issues:[`/: not valid JSON: ${e.message}`]}}return Ti(t)}var Di=4e6,Oi=class extends Error{issues;constructor(e,t=[]){super(e),this.name=`ShareError`,this.issues=t}},ki=e=>{let{notes:t,...n}=e;return n};function Ai(e){if(jr(e)){let t=Ar(e);if(!t.map)throw new Oi(`this operation map does not match the map schema`,t.issues);return{v:1,kind:`map`,doc:kr.canon(t.map)}}if(wi(e)){let t=Ti(e);if(!t.bundle)throw new Oi(`this run bundle does not match the run bundle schema`,t.issues.map(e=>({code:`E_SCHEMA`,severity:`error`,message:e,at:[]})));return{v:1,kind:`run`,doc:Kr.canon(t.bundle)}}if(pr(e)){let t=e,n=hr(t,{requireInline:!0});if(n.some(e=>e.severity===`error`))throw new Oi(`proposal set "${t.id??`?`}" cannot be shared until these are fixed`,n);let r=t.candidates.map(e=>{let t=ki(e.graph);return{...e,graph:t,shape:vr(t)}});return{v:1,kind:`proposals`,doc:ur.canon({...t,candidates:r})}}let t=e,n=_e(t);if(!n.doc)throw new Oi(`"${t.id??`?`}" is not a graph document`,n.issues);let r=dn(n.doc);if(r.some(e=>e.severity===`error`))throw new Oi(`graph "${t.id}" cannot be shared until these are fixed`,r);return{v:1,kind:`graph`,doc:he.canon(ki(n.doc))}}var ji=e=>JSON.stringify(e);function Mi(e,t){return Vi(t(new TextEncoder().encode(ji(e))))}function Ni(e){let t=e.trim(),n=t.includes(`#`)?t.slice(t.indexOf(`#`)):t,r=/^#\/open\?(.*)$/.exec(n);if(!r)return/^[A-Za-z0-9_-]+$/.test(t)?t:void 0;for(let e of r[1].split(`&`)){let[t,n]=e.split(`=`);if(t===`d`)return n??``}}var H=(e,t=[])=>({ok:!1,message:e,details:t}),Pi=`The link is damaged: its data does not unpack. Links cut short or re-wrapped by a messenger look like this. Ask for the link again, or for the file (grooph share --out) and import it.`;function Fi(e,t){if(e.length===0)return H(`The link has nothing after d=, so there is no graph in it. It was probably cut off when it was sent.`);if(e.length>1e6)return H(`The link carries ${e.length.toLocaleString(`en`)} characters, far more than any graph needs, so it is not a grooph link. Nothing was unpacked.`);let n=Hi(e);if(!n)return/^[A-Za-z0-9_-]+$/.test(e)?H(Pi):H(`The link contains characters a grooph link never has, so part of it was changed or cut on the way. Ask for the link again, or for the file (grooph share --out).`);let r;try{r=t(n,Di)}catch(e){return e instanceof RangeError?H(`The link unpacks to more than ${Di/1e6} MB, far more than any graph, so it is not a grooph link. It was not opened.`):H(Pi)}let i;try{i=JSON.parse(new TextDecoder(`utf-8`,{fatal:!0}).decode(r))}catch{return H(Pi)}return Ii(i)}function Ii(e){if(typeof e!=`object`||!e||Array.isArray(e))return H(`The link unpacks, but not to a grooph share, so there is nothing here to open.`);let t=e,n=t.v;if(typeof n==`number`&&n>1)return H(`The link was made by a newer grooph (share format ${n}; this app reads 1). Reload the app to update it, then open the link again.`);if(n!==1)return H(`The link unpacks, but not to a grooph share, so there is nothing here to open.`);let r=t.kind,i=t.doc;if(r===`graph`){let e=_e(i);if(!e.doc)return H(`The link holds a graph that does not match the graph document schema, so it was not opened.`,Ri(e.issues));let t=ki(e.doc);return{ok:!0,envelope:{v:1,kind:`graph`,doc:t},issues:dn(t)}}if(r===`proposals`){let e=fr(i);if(!e.set)return H(`The link holds a proposal set that does not match its schema, so it was not opened.`,Ri(e.issues));let t=hr(e.set,{requireInline:!0}),n=t.filter(t=>t.code===`E_DUPLICATE_ID`||t.code===`E_CANDIDATE_INVALID`&&Li(e.set,t.at));if(n.length>0)return H(`The link holds a proposal set grooph cannot show, so it was not opened.`,Ri(n));let r=e.set.candidates.map(e=>{let t=ki(e.graph);return{...e,graph:t,shape:vr(t)}});return{ok:!0,envelope:{v:1,kind:`proposals`,doc:{...e.set,candidates:r}},issues:t}}if(r===`run`){let e=Ti(i);return e.bundle?{ok:!0,envelope:{v:1,kind:`run`,doc:e.bundle},issues:dn(e.bundle.working)}:e.newer===void 0?H(`The link holds a run record that does not match the run bundle schema, so it was not opened.`,e.issues):H(`The link holds a run from a newer grooph (run format ${e.newer}). Reload the app to update it, then open the link again.`)}if(r===`map`){let e=Ar(i);return e.map?{ok:!0,envelope:{v:1,kind:`map`,doc:e.map},issues:Lr(e.map)}:H(`The link holds an operation map that does not match the map schema, so it was not opened.`,Ri(e.issues))}return H(typeof r==`string`?`The link holds a "${r}", which this version of grooph does not know how to show. Reload the app to update it.`:`The link unpacks, but not to a grooph share, so there is nothing here to open.`)}var Li=(e,t)=>e.candidates.some(e=>t.includes(e.id)&&mr(e.graph)),Ri=e=>e.map(r),zi=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`,Bi=new Map([...zi].map((e,t)=>[e,t]));function Vi(e){let t=``;for(let n=0;n<e.length;n+=3){let r=e[n],i=e[n+1],a=e[n+2];t+=zi[r>>2]+zi[(r&3)<<4|(i??0)>>4],i!==void 0&&(t+=zi[(i&15)<<2|(a??0)>>6]),a!==void 0&&(t+=zi[a&63])}return t}function Hi(e){if(e.length%4==1)return;let t=new Uint8Array(Math.floor(e.length*3/4)),n=0;for(let r=0;r<e.length;r+=4){let i=[];for(let t=r;t<Math.min(r+4,e.length);t++){let n=Bi.get(e[t]);if(n===void 0)return;i.push(n)}t[n++]=i[0]<<2|i[1]>>4,i.length>2&&(t[n++]=(i[1]&15)<<4|i[2]>>2),i.length>3&&(t[n++]=(i[2]&3)<<6|i[3])}return t}var Ui={"bar-passed":`bar passed`,"max-iterations":`max iterations`,budget:`budget`,"diminishing-returns":`diminishing returns`,"evidence-invalid":`evidence invalid`,human:`human stop`},Wi=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)}},Gi=e=>e.round===void 0?``:` · round ${e.round}`;function Ki(e,t){let n=Wi(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${Gi(e)}`:i===`halt`?`${t} halted${Gi(e)}`:i!==void 0&&i!==`ending`?`${t}: ${e.verdict&&e.verdict!==i?`${i} (${e.verdict})`:i}${Gi(e)}`:e.amendment?`${t}: amendment${Gi(e)}`:e.proposal?`${t}: proposal${Gi(e)}`:`${t}${Gi(e)}`}if(n.kind===`loop`){let r=t.loops.find(e=>e.id===n.id)?.name||n.id,a=e.stop&&Object.hasOwn(Ui,e.stop)?` · ${Ui[e.stop]}`:``;return e.round!==void 0&&i!==void 0?`${r}: round ${e.round} ends, ${i}${a}`:e.proposal?`${r}: proposal`:`${r}${Gi(e)}${a}`}let a=t.edges.find(e=>e.id===n.id);return a?`${r(a.from)} → ${r(a.to)}${Gi(e)}`:`Edge ${n.id}`}function qi(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=Wi(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=Wi(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 Ji(e,t){let n=e.loops.filter(e=>e.fired!==void 0).map(e=>`${e.name} stopped on ${Ui[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 Yi(e,t){let n=[{index:0,summary:Qr([],t),caption:`Before the run`}];e.forEach((r,i)=>{n.push({index:i+1,note:r,summary:Qr(e.slice(0,i+1),t),focus:Wi(r),caption:Ki(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?qi(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.`:Ji(o,r.state===`running`)}}}var Xi={width:200,height:84,gapX:36,gapY:76};function Zi(e){let t=e.nodes.map(e=>e.id),n=new Set(t),r=new Set(e.loops.flatMap(e=>e.back)),i=ea(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 Qi(e,t=4,n=Xi){let r={},i=0;for(let a of Zi(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 $i(e,t=4,n=Xi){let r=e.layout??{},i=e.nodes.map(e=>e.id).filter(e=>!(e in r));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=Qi(e,t,n),o=e.nodes.filter(e=>e.id in r);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)),u=Math.min(...i.map(e=>a[e].x)),d=Math.min(...i.map(e=>a[e].y));for(let e of i)s[e]={x:c+a[e].x-u,y:l+n.height+n.gapY+a[e].y-d};return{positions:s,unplaced:i}}function ea(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}var ta=60,na=44,ra=40,ia=400,aa=4,oa=14,sa=8,ca=8,la=6,U={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)`]},ua=e=>{switch(e.kind){case`agent`:return Re(e)?`diamond`:ze(e)?`square`:`rounded`;case`check`:return`hexagon`;case`human-gate`:return`octagon`;case`merge`:return`circle`;case`stop`:return`dot`}};function da(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}}var fa=(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}},W=e=>{let t=Math.round(e*10)/10;return(Object.is(t,-0)?0:t).toString()},G=e=>`${W(e.x)},${W(e.y)}`,pa=e=>e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`),ma=()=>({minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}),ha=(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 ga(e){let t={};if(!(e.layout!==void 0&&e.nodes.some(t=>t.id in e.layout))){let n=Zi(e),r=(Math.max(1,...n.map(e=>e.length))-1)*na/2;return n.forEach((e,n)=>{let i=r-(e.length-1)*na/2;e.forEach((e,r)=>{t[e]={x:n*ta,y:i+r*na}})}),{centers:t,vertical:!1}}let{positions:n}=$i(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=ma();for(let e of i)ha(o,r[e].x,r[e].y);let s=o.maxX-o.minX,c=o.maxY-o.minY,l=a===1/0?1:ra/a;s*l>ia&&(l=ia/s),c*l>ia&&(l=ia/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 _a(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,ua(e)])),a=new Set(e.nodes.filter(e=>e.kind===`agent`&&(e.irreversible??[]).length>0).map(e=>e.id)),{centers:o,vertical:s}=ga(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=ma(),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=fa(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+oa+g.get(e.id)*sa},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=ca+n*la,l=ma();for(let e of x[t]){let t=o[e],n=fa(i.get(e),a.has(e));ha(l,t.x-n.x,t.y-n.top),ha(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;ha(u,f,p),ha(u,f+m,p+h),d.push(`<rect x="${W(f)}" y="${W(p)}" width="${W(m)}" height="${W(h)}" rx="10" stroke-width="1.3" stroke-dasharray="4 3" style="stroke:${U.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?U.gate:t===`fail`?U.warning:typeof t==`object`?U.muted:U.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=fa(i.get(e.from),a.has(e.from)),r=fa(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${G(d)} C${G(S)} ${G(C)} ${G(x)}`,ha(u,S.x,S.y,1),ha(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=fa(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${G(r)} C${G(l)} ${G(d)} ${G(o)}`,ha(u,l.x,l.y,1),ha(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*(da(i.get(e.from),t,n)+1)+x.x,y:c.y+o*(da(i.get(e.from),t,n)+1)+x.y},u={x:h.x-a*(da(i.get(e.to),-t,-n)+3)+x.x,y:h.y-o*(da(i.get(e.to),-t,-n)+3)+x.y};g=`M${G(l)} L${G(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(${W(e)} ${W(t)})">${S}</g>`),d.push(`<g transform="translate(${W(-e)} ${W(-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(G).join(` L`)} Z" style="fill:${n}"/>`)}for(let t of e.nodes){let e=o[t.id],n=i.get(t.id),r=fa(n,a.has(t.id));switch(ha(u,e.x-r.x,e.y-r.top),ha(u,e.x+r.x,e.y+r.bottom),n){case`square`:case`rounded`:d.push(`<rect x="${W(e.x-11)}" y="${W(e.y-11)}" width="22" height="22" rx="${n===`square`?2:7}" stroke-width="1.8" style="fill:${U.agentFill};stroke:${U.agent}"/>`);break;case`diamond`:d.push(`<path d="M${G({x:e.x,y:e.y-14})} L${G({x:e.x+14,y:e.y})} L${G({x:e.x,y:e.y+14})} L${G({x:e.x-14,y:e.y})} Z" stroke-width="1.8" style="fill:${U.agentFill};stroke:${U.agent}"/>`);break;case`hexagon`:d.push(`<path d="M${G({x:e.x-7,y:e.y-12})} L${G({x:e.x+7,y:e.y-12})} L${G({x:e.x+14,y:e.y})} L${G({x:e.x+7,y:e.y+12})} L${G({x:e.x-7,y:e.y+12})} L${G({x:e.x-14,y:e.y})} Z" stroke-width="1.8" style="fill:${U.surface};stroke:${U.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(G).join(` L`)} Z" stroke-width="2.4" style="fill:${U.surface};stroke:${U.gate}"/>`);break}case`circle`:d.push(`<circle cx="${W(e.x)}" cy="${W(e.y)}" r="11" stroke-width="1.8" style="fill:${U.surface};stroke:${U.merge}"/>`);break;case`dot`:d.push(`<circle cx="${W(e.x)}" cy="${W(e.y)}" r="6" style="fill:${t.kind===`stop`&&t.outcome===`halt`?U.warning:U.ink}"/>`)}a.has(t.id)&&d.push(`<path d="M${G({x:e.x-13,y:e.y+17})} L${G({x:e.x+13,y:e.y+17})}" stroke-width="3" style="stroke:${U.error}"/>`)}d.length===0&&ha(u,0,0,12);let T=u.minX-aa,E=u.minY-aa,D=u.maxX-u.minX+8,O=u.maxY-u.minY+8,k=pa(e.name||e.id);return[`<svg xmlns="http://www.w3.org/2000/svg" viewBox="${W(T)} ${W(E)} ${W(D)} ${W(O)}" width="${W(D*n)}" height="${W(O*n)}" role="img" fill="none" stroke-linecap="round" stroke-linejoin="round" class="grooph-glyph">`,`<title>${k}</title>`,...d,`</svg>`].join(`
|
|
2
|
-
`)}var va=e=>`n_${e.replace(/[^A-Za-z0-9_]/g,`_`)}`,ya=e=>`"${e.replace(/"/g,`#quot;`)}"`;function ba(e){let t=ya(`${e.name||e.id}${R(e)?` (a person)`:``}`);switch(e.kind){case`agent`:return Re(e)?`${va(e.id)}{${t}}`:ze(e)?`${va(e.id)}[${t}]`:`${va(e.id)}([${t}])`;case`check`:return`${va(e.id)}{{${t}}}`;case`human-gate`:return`${va(e.id)}[/${t}\\]`;case`merge`:return`${va(e.id)}((${t}))`;case`stop`:return`${va(e.id)}(((${t})))`}}function xa(e){let t=e.when??`always`,n=[];return t!==`always`&&n.push(typeof t==`string`?t:`verdict: ${t.verdict}`),e.approval&&n.push(`approval`),n.join(`, `)}function Sa(e,t){let n=e.stops[t];return`stop: ${Ke(n)}${n.then===void 0?``:` → ${n.then}`}`}function Ca(e){let t=new Map(e.nodes.map(e=>[e.id,e])),n=Ce(e),r=e.loops.map((e,n)=>({loop:e,i:n,members:new Set(e.members.filter(e=>t.has(e)))})),i=(e,t)=>e!==t&&t.members.size>0&&t.members.size<e.members.size&&[...t.members].every(t=>e.members.has(t)),a=new Map;for(let e of r){let t=r.filter(t=>i(t,e)).sort((e,t)=>e.members.size-t.members.size);t[0]&&a.set(e.i,t[0].i)}let o=new Map,s=[];for(let t of e.nodes){let e=r.filter(e=>e.members.has(t.id)).sort((e,t)=>e.members.size-t.members.size||e.i-t.i);if(e.length!==0){o.set(t.id,e[0].i);for(let n of e.slice(1))i(n,e[0])||s.push(`%% ${t.id} is also a member of loop ${n.loop.id}`)}}let c=[`%% grooph mermaid: a projection of ${e.name||e.id} (${e.id}@${e.version}). One way only: it does not round-trip.`,`%% Loops, stops, bars and brakes live in the graph document; edit that, not this.`,`flowchart LR`],l=new Set(e.loops.flatMap(e=>e.back)),u=(t,i)=>{let{loop:s}=r[t],l=` `.repeat(i);c.push(`${l}subgraph ${va(s.id)}[${ya(`${s.name||s.id} · ${Ue(n,s)} loop`)}]`);for(let n of e.nodes)o.get(n.id)===t&&c.push(`${l} ${ba(n)}`);s.stops.forEach((e,t)=>c.push(`${l} ${va(`${s.id}_stop_${t+1}`)}>${ya(Sa(s,t))}]:::stop`));for(let e of r)a.get(e.i)===t&&u(e.i,i+1);c.push(`${l}end`)};for(let e of r)a.has(e.i)||u(e.i,1);for(let t of e.nodes)o.has(t.id)||c.push(` ${ba(t)}`);c.push(...s.map(e=>` ${e}`));for(let n of e.edges){if(!t.has(n.from)||!t.has(n.to))continue;let e=xa(n),r=`${l.has(n.id)?`-.->`:`-->`}${e===``?``:`|${ya(e)}|`}`;c.push(` ${va(n.from)} ${r} ${va(n.to)}`)}return e.loops.some(e=>e.stops.length>0)&&c.push(` classDef stop fill:none,stroke-dasharray:3 3,font-size:12px`),`${c.join(`
|
|
3
|
-
`)}\n`}function wa(e,t=!1){let n=e.agents.reduce((e,t)=>e+(t.count??1),0),r=e.agents.reduce((e,t)=>e+Math.min(t.started,t.count??1),0),i=e.agents.reduce((e,t)=>e+t.running,0),a=[...e.agents.filter(e=>e.started>(e.count??1)).map(e=>`${e.started-(e.count??1)} more ${e.type}`),...e.unplanned];return`${r} of ${n} started${i>0?`, ${i} ${t?`not seen to finish`:`running`}`:``}${a.length>0?`; not in the plan: ${a.join(`, `)}`:``}`}var Ta=(e,t)=>t!==void 0&&e.state!==`ended`&&Ea(e.lastAt,t)>=1800,Ea=(e,t)=>Math.max(0,Math.round((Date.parse(t)-Date.parse(e))/1e3));function Da(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 Oa(e,t,n){let r=`${t.id}--`,i=new Set(t.nodes.map(e=>e.id)),a={};for(let t of e)for(let e of t.agents){if(!e.type.startsWith(r))continue;let t=e.type.slice(r.length);if(!i.has(t)||n!==void 0&&e.started<n&&(e.ended??e.lastAt)<n)continue;let o=a[t]??={running:0,runs:0};o.runs+=1,e.state===`running`&&(o.running+=1),(o.lastStarted===void 0||e.started>o.lastStarted)&&(o.lastStarted=e.started),e.ended!==void 0&&(o.lastEnded===void 0||e.ended>o.lastEnded)&&(o.lastEnded=e.ended)}return a}function ka(e,t){let n={...e.nodes},r=!1;for(let[e,i]of Object.entries(t)){let t=n[e];t&&i.running!==0&&t.state!==`running`&&(n[e]={...t,state:`running`,runs:Math.max(t.runs,i.runs)},r=!0)}return r?{...e,nodes:n}:e}function Aa(e,t,n){let r=new Set(t.sessions.map(e=>e.id)),i={};for(let t of e){if(t.source===void 0||!r.has(t.source))continue;let e=i[t.source]??={sessions:0,working:0,waiting:0,ended:0,agentsRunning:0,agentsDone:0,lastAt:t.lastAt};e.sessions+=1;let a=Ta(t,n);a?(e.quiet=(e.quiet??0)+1,(e.quietLastAt===void 0||t.lastAt>e.quietLastAt)&&(e.quietLastAt=t.lastAt)):e[t.state]+=1;for(let n of t.agents)n.state===`running`&&!a?e.agentsRunning+=1:n.state!==`running`&&(e.agentsDone+=1);t.lastAt>e.lastAt&&(e.lastAt=t.lastAt)}return i}function ja(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 ${Da(Ea(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`}`}var Ma={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`},Na={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`},Pa=`system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif`,Fa=`ui-monospace, 'SF Mono', Menlo, Consolas, 'Roboto Mono', monospace`;function Ia(e){return e===`light`?e=>Ma[e]:e===`dark`?e=>Na[e]:e=>`var(--gp-${e})`}function La(e){if(e!==`auto`)return``;let t=e=>Object.keys(Ma).map(t=>`--gp-${t}:${e[t]}`).join(`;`);return`<style>.grooph-picture{${t(Ma)}}@media (prefers-color-scheme:dark){.grooph-picture:not([data-theme="light"]){${t(Na)}}}.grooph-picture[data-theme="dark"]{${t(Na)}}</style>`}var K=e=>{let t=Math.round(e*10)/10;return(Object.is(t,-0)?0:t).toString()},Ra=e=>e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`),za=[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],Ba=[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],Va={"·":[364,361],"→":[1e3,1e3],"×":[818,867],"…":[1e3,1049],"—":[1e3,1e3],"–":[636,711],"’":[269,332],"‘":[269,332],"“":[459,587],"”":[459,587]},Ha=1.03;function Ua(e,t,n=`regular`){if(n===`mono`)return e.length*t*.62;let r=n===`bold`?Ba:za,i=+(n===`bold`),a=0;for(let t of e){let e=t.codePointAt(0);e>=32&&e<=126?a+=r[e-32]:Va[t]?a+=Va[t][i]:a+=e>11904?1e3:n===`bold`?720:650}return a/1e3*t*Ha}function Wa(e,t,n,r=`regular`){if(Ua(e,n,r)<=t)return e;let i=e;for(;i.length>1&&Ua(`${i}…`,n,r)>t;)i=i.slice(0,-1);return`${i.trimEnd()}…`}function q(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&&Ua(`${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)=>Wa(e,a(t),n,i)))}function J(e,t,n,r){let i=r.weight===`mono`?` font-family="${Fa}"`:``,a=r.weight===`bold`?` font-weight="700"`:``,o=r.anchor&&r.anchor!==`start`?` text-anchor="${r.anchor}"`:``;return`<text x="${K(e)}" y="${K(t)}" font-size="${K(r.size)}"${i}${a}${o} style="fill:${r.fill}">${Ra(n)}</text>`}function Y(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="${K(e)}" y="${K(t)}" width="${K(n)}" height="${K(r)}"${i.rx?` rx="${K(i.rx)}"`:``}${i.stroke?` stroke-width="${K(i.width??1)}"`:``}${i.dash?` stroke-dasharray="${i.dash}"`:``} style="${a}"/>`}function Ga(e,t,n,r){let i=r.size*.55,a=Ua(n,r.size,r.weight??`bold`)+i*2,o=r.size*1.55;return{svg:Y(e,t-r.size*1.08,a,o,{fill:r.fill,rx:o/2,...r.stroke?{stroke:r.stroke}:{}})+J(e+a/2,t,n,{size:r.size,fill:r.ink,weight:r.weight??`bold`,anchor:`middle`}),width:a}}function Ka(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 ${K(e)} ${K(t)}" width="${K(e)}" height="${K(t)}" role="img" font-family="${Pa}"><title>${Ra(n)}</title>`+La(r)+Y(0,0,e,t,{fill:i(`bg`)})+a+`</svg>
|
|
4
|
-
`}function qa(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}}var Ja=6.5,Ya=12,Xa={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}},Za=e=>Xa[e.carrier?.kind??`none`],Qa=(e,t)=>`fill="none" stroke-width="${K(e.width)}" stroke-linecap="round"${e.dash?` stroke-dasharray="${e.dash}"`:``} style="stroke:${t}"`,$a={"claude-code":`Claude Code`,codex:`Codex`},eo={"long-lived":`long-lived`,"per-task":`per task`,scheduled:`scheduled`};function to(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 no(e,t,n,r,i){let a=18;for(let n of q(e.name||e.id,t-24,17,2,`bold`))a+=17,i.push(J(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),zr(Rr(e))].filter(Boolean).join(` · `);for(let e of q(o,t-24,11,2))a+=13,i.push(J(12,a,e,{size:11,fill:r(`ink-3`)}));return a+12}var ro=7.2,io=e=>e.length>1?(Ua(e,8.5,`bold`)+4.5)/2:ro;function ao(e,t,n,r,i){let a=io(n);return n.length>1?Y(e-a,t-ro,a*2,ro*2,{fill:i(`bg`),stroke:r,rx:ro,width:1.3}):`<circle cx="${K(e)}" cy="${K(t)}" r="${ro}" stroke-width="1.3" style="fill:${i(`bg`)};stroke:${r}"/>`}var oo=(e,t,n,r)=>J(e,t+3.3,n,{size:n.length>1?8.5:9.5,fill:r(`ink`),weight:`bold`,anchor:`middle`}),so=(e,t,n,r,i)=>ao(e,t,n,r,i)+oo(e,t,n,i);function co(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}var lo=e=>(e+1)*13+4;function uo(e,t,n,r,i=0){let a=t-20,o=q(e.name||e.id,a,13.5,2+i,`bold`),s=10+o.length*16+10-3,c=e.role?q(e.role,a,11,Math.max(Ya,Math.floor((lo(n)-s-2)/13.5))):[],l=Math.max(s+(c.length?2+c.length*13.5:0),lo(n));return{height:l,family:!1,draw(n,i,a=l){let s=[Y(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(J(n+10,u,e,{size:13.5,fill:r(`ink`),weight:`bold`}));u+=2;for(let e of c)u+=13.5,s.push(J(n+10,u,e,{size:11,fill:r(`ink-2`)}));return`<g data-person="${e.id}">${s.join(``)}</g>`}}}function fo(e,t,n,r,i,a,o=0){let s=n-20,c=(t.count??1)>1,l=c?`×${t.count}`:``,u=c?Ua(l,10.5,`bold`)+12:0,d=$a[t.harness]??t.harness,f=a.live?.[t.id],p=q(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||Ua(m,10.5,`bold`)<=s?[Wa(m,s,10.5,`bold`)]:[Wa(d,s,10.5,`bold`),...q(t.model,s,10.5,2+o,`bold`)],g=[t.lifetime?eo[t.lifetime]:void 0,t.repo].filter(Boolean).join(` · `),_=g?q(g,s,10,3+o):[],v=Ur(e,t.id),y=v===void 0?[]:q(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=q(t.role,s,11,Math.max(Ya,Math.floor((lo(r)-b)/13.5))),S=Math.max(b+x.length*13.5,lo(r));return{height:S,family:c,draw(e,r,o=S){let d=[];c&&(d.push(Y(e+6,r+6,n-6,o-2,{fill:i(`surface`),stroke:i(`line`),rx:9})),d.push(Y(e+3,r+3,n-3,o-1,{fill:i(`surface`),stroke:i(`line`),rx:9}))),d.push(Y(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(J(e+10,m,t,{size:13.5,fill:i(`ink`),weight:`bold`})),r===0&&c&&d.push(Ga(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(J(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(J(e+10,m,t,{size:11,fill:i(`ink-2`)}));_.length&&(m+=1);for(let t of _)m+=13,d.push(J(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="${K(e+10+4.2)}" cy="${K(m-3.4)}" r="3.6" fill="none" stroke-width="1.8" stroke-dasharray="1.5 2.2" style="stroke:${i(`merge`)}"/>`),d.push(J(e+10+13,m,t,{size:10,fill:i(`merge`),weight:`bold`}))}),t.graph&&(m+=15,d.push(J(e+10,m,Wa(`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="${K(r)}" cy="${K(m-3.6)}" r="4.5" style="fill:${i(n)}"/>`:`<circle cx="${K(r)}" cy="${K(m-3.6)}" r="3.6" stroke-width="1.8" style="fill:${f.waiting>0||t?`none`:i(n)};stroke:${i(n)}"/>`),d.push(J(e+10+14,m,Wa(ja(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 po(e,t,n,r,i,a=0){let o=[],s=n-2,c=e.place??``,l=c?Ga(0,0,c,{size:9.5,fill:i(`surface`),ink:i(`ink-2`),stroke:i(`line-strong`)}):void 0;q(e.name||e.id,s-(l?l.width+8:0),12.5,2+a,`bold`).forEach((e,a)=>{a>0&&(r+=15),o.push(J(t+2,r,e,{size:12.5,fill:i(`ink`),weight:`bold`})),a===0&&l&&o.push(Ga(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 q(`${e.machine} · ${e.account}`,s,10.5,3+a))r+=13.5,o.push(J(t+2,r,n,{size:10.5,fill:i(`ink-3`)}));return{svg:o,cardsTop:r+9.5}}var mo=(e,t)=>t.carrier?Hr(e,t)||`${Nr[t.carrier.kind]} (not named)`:`no carrier named`;function ho(e,t,n,r,i,a,o,s=0){let c=Za(t),l=o(c.color),u=r+24,d=a-24,f=[],p=i+12;if(f.push(so(r+8,p-4,String(n),l,o)),q(t.from===t.to?`${Br(e,t.from)} → itself`:`${Br(e,t.from)} → ${Br(e,t.to)}`,d,12,2+s,`bold`).forEach((e,t)=>{t>0&&(p+=14),f.push(J(u,p,e,{size:12,fill:o(`ink`),weight:`bold`}))}),p+=14,f.push(`<path d="M${K(u)},${K(p-3.5)} h18" ${Qa(c,l)}/>`),q(mo(e,t),d-24,11,2+s,`bold`).forEach((e,t)=>{t>0&&(p+=13.5),f.push(J(u+24,p,e,{size:11,fill:l,weight:`bold`}))}),t.what)for(let e of q(t.what,d,11,4+s))p+=13.5,f.push(J(u,p,e,{size:11,fill:o(`ink-2`)}));return p+=11,{svg:`<g data-handoff-row="${t.id}">${Y(r-4,i-2,a+8,p-i-3,{fill:`transparent`,rx:8,mark:`row`})}${f.join(``)}</g>`,bottom:p}}var go=16,_o=14;function vo(e,t={}){let n=t.theme??`auto`,r=t.width??400,i=Ia(n),a=e.lanes,{sessions:o,people:s,handoffs:c,numberOf:l}=to(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}=qa(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-go-_o)/(m-1),v=m<=1?13:Math.min(13,Math.max(Ja,_(g*.43999999999999995)),Math.max(_(g-120),_(g*.43999999999999995))),y=c.length===0?0:go+(m-1)*v+_o,b=h-16-y,x=[],S=no(e,r,t,i,x),C=new Map,w=[];if(s.length>0){let e=S,t=[],n=e+8+12;t.push(J(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=uo(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="">${Y(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=po(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=fo(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(J(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}">${Y(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+go+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=Za(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${K(T+.5)},${K(o)} l6.5,-3.6 v7.2 z" style="fill:${r}"/>`,f=`<circle cx="${K(T)}" cy="${K(a)}" r="2.2" style="fill:${r}"/>`,p=String(l.get(e.id)),m=co(s,a,o,io(p),t,k,O),h=a+u*c,g=o-u*c,_=m-u*ro,v=m+u*ro,y=(_-h)*u>=0&&(g-v)*u>=0,b=y?`V${K(_)} M${K(s)},${K(v)} V${K(g)}`:`V${K(g)}`,x=`<path d="${`M${K(T)},${K(a)} H${K(s-c)} Q${K(s)},${K(a)} ${K(s)},${K(h)} ${b} Q${K(s)},${K(o)} ${K(s-c)},${K(o)} H${K(T+5.5)}`}" ${Qa(n,r)}/>${f}${d}`,S=`<g data-plate="${e.id}">${ao(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}">${oo(s,m,p,i)}</g>`)}),x.push(...A,...j,...M),e.handoffs.length>0){S+=6,x.push(J(12,S+11,`Handoffs`,{size:12.5,fill:i(`ink`),weight:`bold`})),S+=20;for(let t of e.handoffs){let n=ho(e,t,l.get(t.id),12,S,r-24,i);x.push(n.svg),S=n.bottom}}return Ka(r,S+12-6,e.name||e.id,n,i,x.join(``),`map`)}var yo=[ro,12,8,13,13,Ja,400,qa,io,mo,to,K,Ka,ho,no,Ia,po,so,ao,oo,uo,co,Y,fo,Qa,Za,J,Ua,q],bo=12,xo=10,So=30,Co=13,wo=16,To=12,Eo=6,Do={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`}},Oo={label:`Person`,color:`gate`},ko=e=>R(e)?Oo:Do[e.kind];function Ao(e){switch(e.kind){case`agent`:{let t=typeof e.role==`string`?e.role:e.role.custom;return R(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 jo(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 Mo(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 No(e,t={},n){let r=Je(n?.whole??e),i=t.theme??`auto`,a=t.width??400,o=Ia(i),s=Ce(e),c=new Map(e.nodes.map(e=>[e.id,e])),l=n?.ranks??Zi(e),u=l.flat(),d=new Map(u.map((e,t)=>[e,t])),f=new Map;l.forEach((e,t)=>e.forEach(e=>f.set(e,t)));let p=new Map;e.loops.forEach((e,t)=>{for(let n of e.back)p.has(n)||p.set(n,t)});let m=e.edges.filter(e=>c.has(e.from)&&c.has(e.to)),h=e=>p.has(e.id)||e.from===e.to?`right`:d.get(e.to)===d.get(e.from)+1?`next`:`left`,g=e=>{let t=new Map;m.forEach((n,r)=>{h(n)===e&&((t.get(n.from)??t.set(n.from,[]).get(n.from)).push({edge:n.id,end:`from`,other:d.get(n.to),n:r}),(t.get(n.to)??t.set(n.to,[]).get(n.to)).push({edge:n.id,end:`to`,other:d.get(n.from),n:r}))});for(let[e,n]of t){let t=d.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},_={left:g(`left`),right:g(`right`)},v=(e,t,n,r)=>_[e].get(t).findIndex(e=>e.edge===n&&e.end===r),y=e=>{let t=m.filter(t=>h(t)===e),n=(t,n,r)=>d.get(t)*1e3+v(e,t,n.id,r),{tracks:r,count:i}=qa(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:wo+(i-1)*Co+12}},b=y(`left`),x=y(`right`),S=l.some(e=>e.length>1),C=bo+b.margin+(S?Eo:0),w=a-24-b.margin-x.margin-(S?12:0),T=w-20,E=t=>e.loops.map((e,n)=>e.members.includes(t)?n:-1).filter(e=>e>=0),D=[],O=18;for(let t of q(e.name||e.id,a-24,17,2,`bold`))O+=17,D.push(J(bo,O,t,{size:17,fill:o(`ink`),weight:`bold`})),O+=4;let k=[e.target?.harness,e.nodes.length>0?xr(vr(n?.whole??e)):`no nodes yet`].filter(Boolean).join(` · `);for(let e of q(k,a-24,11,2))O+=13,D.push(J(bo,O,e,{size:11,fill:o(`ink-3`)}));if(e.goal){O+=5;for(let t of q(e.goal,a-24,11.5,3))O+=14.5,D.push(J(bo,O,t,{size:11.5,fill:o(`ink-2`)}))}O+=14;let A=new Map;for(let e of u){let t=c.get(e),r=q(t.name||t.id,T,13.5,2,`bold`),i=n?.faces.get(e),a=i?i.sub.flatMap(e=>q(e,T,10.5,2)):Ao(t)?q(Ao(t),T,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)+xo-3+(i?.room??0),l=(_.left.get(e)??[]).map(e=>e.edge),u=(_.right.get(e)??[]).map(e=>e.edge);A.set(e,{node:t,name:r,sub:a,extra:o,height:Math.max(s,(Math.max(l.length,u.length)+1)*To+2),y:0,left:l,right:u})}let j=[];l.forEach((e,t)=>{O+=n?.gaps[t]??0;let r=O;e.forEach((t,n)=>{let r=A.get(t);r.y=O+(e.length>1&&n===0?16:0),O=r.y+r.height+(n<e.length-1?8:0)}),e.length>1&&j.push(Y(C-Eo,r-Eo+2,w+12,O-r+12-2,{fill:o(`surface-2`),stroke:o(`line`),rx:12})+J(C+2,r+9,`${e.length} side by side`,{size:9.5,fill:o(`ink-3`),weight:`bold`})),t<l.length-1&&(O+=So)}),D.push(...j);let M=n?.draw(A,C,w,o);M&&D.push(M[0]);let N=[],P=m.filter(e=>h(e)===`next`);for(let e of P){let t=A.get(e.from),n=A.get(e.to),r=P.filter(t=>t.from===e.from&&t.to===e.to),i=C+w/2+(r.indexOf(e)-(r.length-1)/2)*64,a=t.y+t.height,s=n.y,c=Mo(e,void 0),l=o(c.color);D.push(`<g data-edge="${e.id}"><path d="M${K(i)},${K(a)} V${K(s-5.5)}" fill="none" stroke-width="${K(c.width)}" stroke-linecap="round"${c.dash?` stroke-dasharray="${c.dash}"`:``} style="stroke:${l}"/><path d="M${K(i)},${K(s-.5)} l-3.6,-6.5 h7.2 z" style="fill:${l}"/></g>`);let u=jo(e);if(u){let e=Ua(u,9.5,`bold`)+10.5;N.push(Ga(i-e/2,(a+s)/2+3.2,u,{size:9.5,fill:o(`bg`),ink:l,stroke:l}).svg)}}let F=(e,t)=>{let n=e===`right`?1:-1,r=e===`right`?C+w:C,i=[],a=(t,n,r)=>{let i=A.get(t),a=_[e].get(t);return i.y+i.height/2+(v(e,t,n,r)-(a.length-1)/2)*To};t.list.forEach((e,s)=>{let c=Mo(e,p.get(e.id)),l=o(c.color),u=a(e.from,e.id,`from`),d=a(e.to,e.id,`to`),f=r+n*(wo+t.tracks[s]*Co),m=Math.min(6,Math.abs(d-u)/2),h=d>=u?1:-1,g=`M${K(r)},${K(u)} H${K(f-n*m)} Q${K(f)},${K(u)} ${K(f)},${K(u+h*m)} V${K(d-h*m)} Q${K(f)},${K(d)} ${K(f-n*m)},${K(d)} H${K(r+n*5.5)}`;D.push(`<g data-edge="${e.id}"><path d="${g}" fill="none" stroke-width="${K(c.width)}" stroke-linecap="round"${c.dash?` stroke-dasharray="${c.dash}"`:``} style="stroke:${l}"/><circle cx="${K(r)}" cy="${K(u)}" r="2.2" style="fill:${l}"/><path d="M${K(r+n*.5)},${K(d)} l${K(n*6.5)},-3.6 v7.2 z" style="fill:${l}"/></g>`);let _=jo(e);if(!_)return;let v=Ua(_,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}),N.push(`<g transform="rotate(-90 ${K(f)} ${K(S)})">`+Y(f-v/2,S-6.5,v,13,{fill:o(`bg`),stroke:l,rx:6.5})+J(f,S+3.2,_,{size:9,fill:l,weight:`bold`,anchor:`middle`})+`</g>`)})};F(`left`,b),F(`right`,x);for(let e of u){let t=A.get(e),{node:r}=t,i=n?.faces.get(e)??ko(r),a=[],s=r.kind===`human-gate`;a.push(Y(C,t.y,w,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+xo+8;a.push(`<circle cx="${K(C+xo+3.5)}" cy="${K(c-3.4)}" r="3.5" style="fill:${o(i.color)}"/>`),a.push(J(C+xo+11,c,i.label,{size:9.5,fill:o(i.color),weight:`bold`})),E(e).forEach((e,t)=>{a.push(`<circle cx="${K(C+w-xo-3.5-t*10)}" cy="${K(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(J(C+xo,c,e,{size:13.5,fill:o(`ink`),weight:`bold`}));for(let e of t.sub)c+=13,a.push(J(C+xo,c,e,{size:10.5,fill:o(`ink-2`)}));t.extra&&(c+=14,a.push(J(C+xo,c,Wa(t.extra,T,10,`bold`),{size:10,fill:o(`gate`),weight:`bold`}))),D.push(`<g data-${i===ko(r)?`node`:`group`}="${e}">${a.join(``)}</g>`)}if(M&&D.push(M[1]),D.push(...N),O+=14,e.loops.length>0){O+=4,D.push(J(bo,O+11,e.loops.length===1?`Loop`:`Loops`,{size:12.5,fill:o(`ink`),weight:`bold`})),O+=20;let t=a-bo-28,n=e=>c.get(e)?.name||e;e.loops.forEach((e,i)=>{let a=o(`loop-${i%4}`),c=[];O+=12,c.push(`<circle cx="${K(17)}" cy="${K(O-4)}" r="4.5" style="fill:${a}"/>`),c.push(J(28,O,Wa(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 q(e,t,11,n))O+=13.5,c.push(J(28,O,i,{size:11,fill:o(r)}))};l(`${Ue(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}. ${Ke(e)}: ${qe(e,r).replace(/`/g,``)}`,2)),O+=12,D.push(`<g data-loop="${e.id}">${c.join(``)}</g>`)})}return Ka(a,O+bo-6,e.name||e.id,i,o,D.join(``),`graph`)}var Po={agent:`Agent`,"human-gate":`Human gate`,check:`Check`,merge:`Merge`,stop:`Stop`},X=(e,t)=>t===void 0?[]:Array.isArray(t)?t.length>0?[{label:e,list:t}]:[]:t.trim()===``?[]:[{label:e,text:t}];function Fo(e,t,n,r){let i=e.when??`always`,a=typeof i==`object`?`on verdict "${i.verdict}"`:i===`always`?`always`:`on ${i}`,o=[r?`back edge: starts the next round`:void 0,t===`to`?`${e.isolation??`fresh`} context`:void 0,e.evidence&&e.evidence.length>0?`sees ${e.evidence.join(`, `)}`:void 0,e.approval?`needs a person's approval`:void 0,e.concurrency?`at most ${e.concurrency.max} at once`:void 0,e.retry?`retry up to ${e.retry.max}`:void 0,e.label].filter(e=>e!==void 0&&e!==``);return`${a}, ${t} ${n(e[t])}${o.length>0?` (${o.join(`; `)})`:``}`}function Io(e){let t=Ce(e),n=new Map(e.nodes.map(e=>[e.id,e])),r=e=>n.get(e)?.name||e,i=new Set(e.loops.flatMap(e=>e.back)),a=[],o=e.groups??[],s=e=>o.find(t=>t.members.includes(e)),c=e=>{let t=s(e);for(let e=0;t&&!t.from&&e<o.length;e++)t=s(t.id);return t?.from?t:void 0},l=e=>c(e)?{inside:c(e).id}:{},u=vr(e),d=Je(e);a.push({id:e.id,kind:e.template?`Template`:`Graph`,title:e.name||e.id,items:[...X(`Goal`,e.goal),...X(`About`,e.description),...X(`Shape`,e.nodes.length>0?xr(u):void 0),...X(`Model tiers`,u.agents>0?Sr(u):void 0),...X(`Runs in`,e.target?.harness),...X(`Budget`,e.constraints?.budget),...X(`Time`,e.constraints?.time),...X(`Other limits`,e.constraints?.other),...X(`If the graph turns out wrong`,e.adaptation===`fixed`?`fixed: the lead follows it exactly, or halts and asks`:e.adaptation===`propose`?`propose: the lead changes nothing and records proposals`:`adaptive: the lead may amend its working copy, visibly, and is told never to loosen a brake`),...X(`Version`,`${e.id}@${e.version}`)]});for(let t of Zi(e).flat()){let o=n.get(t),s=e.edges.filter(e=>e.from===t&&n.has(e.to)).map(e=>Fo(e,`to`,r,i.has(e.id))),u=e.edges.filter(e=>e.to===t&&n.has(e.from)).map(e=>Fo(e,`from`,r,i.has(e.id))),d=e.loops.filter(e=>e.members.includes(t)).map(e=>e.name||e.id),f=(()=>{switch(o.kind){case`agent`:{let e=!R(o);return[...X(`Role`,typeof o.role==`string`?o.role:`${o.role.custom} (custom)`),...e?X(`Model`,[o.model?.tier??`session default`,...Object.entries(o.model?.pin??{}).map(([e,t])=>`${e}: ${t}`),o.effort?`${o.effort} effort`:``].filter(e=>e!==``).join(` · `)):[],...X(`Brief`,o.brief),...X(`Expects`,o.inputs),...X(`Leaves behind`,o.outputs),...e?[...X(`May`,o.allow),...X(`May not`,o.deny),...X(`Skills`,o.skills)]:[],...X(`Owns`,o.owns),...X(`Irreversible`,o.irreversible)]}case`human-gate`:return[...X(`Asks`,o.prompt),...X(`Answers`,o.options)];case`check`:return[...X(`Checks`,o.check.kind),...X(`Runs`,o.check.run),...X(`Passes when`,o.check.pass),...X(`Threshold`,o.check.threshold===void 0?void 0:String(o.check.threshold))];case`merge`:return[...X(`Merges`,o.merges),...X(`How`,o.strategy)];case`stop`:return[...X(`Ends the run with`,o.outcome??`its last result`)]}})();a.push({id:t,kind:R(o)?`Person`:Po[o.kind],title:o.name||o.id,items:[...X(`About`,o.description),...X(`Part of`,c(t)?.name),...f,...X(`In loop`,d),...X(`Then`,s),...X(`Reached`,u)],...l(t)})}for(let t of o)t.from&&a.push({id:t.id,kind:`Subgrooph`,title:t.name,items:[...X(`About`,t.description),...X(`Placed from`,`the template ${t.from.replace(`@`,`, version `)}`),...X(`Filled with`,Object.entries(t.with??{}).map(([e,t])=>`${e}: ${t}`)),...X(`Part of`,c(t.id)?.name),...X(`Holds`,[...e.nodes,...o].filter(e=>c(e.id)===t&&(!(`members`in e)||e.from)).map(e=>e.name||e.id))],...l(t.id)});for(let n of e.loops)a.push({id:n.id,kind:`Loop`,title:n.name||n.id,items:[...X(`Kind`,`${Ue(t,n)} loop`),...X(`Members`,n.members.map(r)),...X(`Bar`,n.bar?.name),...X(`Good enough to stop`,n.bar?.acceptance),...X(`Aiming at`,n.bar?.aspiration),...X(`The critic inspects`,n.bar?.inspects.map(e=>`${e.kind}: ${e.ref}${e.note?` (${e.note})`:``}`)),...X(`Stops, in order`,n.stops.map(e=>`${Ke(e)}: ${qe(e,d).replace(/`/g,``)}`))]});for(let t of e.policies??[])a.push({id:t.id,kind:`Policy`,title:typeof t.kind==`string`?t.kind:t.kind.custom,items:[...X(`Applies to`,t.scope),...X(`Settings`,Object.entries(t.params??{}).map(([e,t])=>`${e}: ${String(t)}`))]});return a}function Lo(e){let t=t=>Br(e,t),n=e=>e===`claude-code`?`Claude Code`:e===`codex`?`Codex`:e,r=(n,r)=>`${r} ${n.from===n.to?`itself`:t(n[r])}, by ${Hr(e,n)||(n.carrier?`${Nr[n.carrier.kind]} (not named)`:`no named carrier`)}${n.what?`: ${n.what}`:``}`,i=[{id:e.id,kind:`Operation map`,title:e.name||e.id,items:[...X(`As of`,e.asOf),...X(`Shape`,zr(Rr(e))),...X(`About`,e.description),...X(`Version`,`${e.id}@${e.version}`)]}];for(let t of e.people??[])i.push({id:t.id,kind:`Person`,title:t.name||t.id,items:[...X(`Role`,t.role),...X(`About`,t.description),...X(`Hands work`,e.handoffs.filter(e=>e.from===t.id).map(e=>r(e,`to`))),...X(`Is handed work`,e.handoffs.filter(e=>e.to===t.id).map(e=>r(e,`from`)))]});for(let t of e.lanes){i.push({id:t.id,kind:`Lane`,title:t.name||t.id,items:[...X(`Machine`,`${t.machine}${t.place?` (${t.place})`:``}`),...X(`Account`,t.account),...X(`About`,t.description),...X(`Sessions`,e.sessions.filter(e=>e.lane===t.id).map(e=>e.name||e.id))]});for(let a of e.sessions.filter(e=>e.lane===t.id)){let t=Ur(e,a.id);i.push({id:a.id,kind:`Session`,title:a.name||a.id,items:[...X(`Role`,a.role),...X(`Runs on`,[n(a.harness),a.model].filter(Boolean).join(` · `)),...X(`How many`,a.count&&a.count>1?`${a.count} like sessions, drawn as one`:void 0),...X(`Lifetime`,a.lifetime===`per-task`?`per task`:a.lifetime),...X(`Wakes itself`,t===void 0?void 0:t===``?`on a schedule`:t),...X(`Repository`,a.repo),...X(`Its graph`,a.graph),...X(`About`,a.description),...X(`Hands work`,e.handoffs.filter(e=>e.from===a.id).map(e=>r(e,`to`))),...X(`Is handed work`,e.handoffs.filter(e=>e.to===a.id).map(e=>r(e,`from`)))]})}}return i}function Ro(e){let t=[];return e.forEach((e,n)=>{t.push(`${n===0?`#`:`##`} ${n===0?``:`${e.kind}: `}${e.title}`,``),n>0&&t.push(`\`${e.id}\``,``);for(let n of e.items)if(n.list){t.push(`**${n.label}**`,``);for(let e of n.list)t.push(`- ${e}`);t.push(``)}else(n.text??``).includes(`
|
|
5
|
-
`)||(n.text??``).length>90?t.push(`**${n.label}**`,``,n.text.trim(),``):t.push(`**${n.label}:** ${n.text}`,``)}),`${t.join(`
|
|
6
|
-
`).replace(/\n{3,}/g,`
|
|
7
|
-
|
|
8
|
-
`).trimEnd()}\n`}var zo=[be,Mr,Ra,r,jr,ja,Lo,vo,Io,No,dn,Lr],Z=Uint8Array,Bo=Uint16Array,Vo=Int32Array,Ho=new Z([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Uo=new Z([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),Wo=new Z([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Go=function(e,t){for(var n=new Bo(31),r=0;r<31;++r)n[r]=t+=1<<e[r-1];for(var i=new Vo(n[30]),r=1;r<30;++r)for(var a=n[r];a<n[r+1];++a)i[a]=a-n[r]<<5|r;return{b:n,r:i}},Ko=Go(Ho,2),qo=Ko.b,Jo=Ko.r;qo[28]=258,Jo[258]=28;for(var Yo=Go(Uo,0),Xo=Yo.b,Zo=Yo.r,Qo=new Bo(32768),Q=0;Q<32768;++Q){var $o=(Q&43690)>>1|(Q&21845)<<1;$o=($o&52428)>>2|($o&13107)<<2,$o=($o&61680)>>4|($o&3855)<<4,Qo[Q]=(($o&65280)>>8|($o&255)<<8)>>1}for(var es=(function(e,t,n){for(var r=e.length,i=0,a=new Bo(t);i<r;++i)e[i]&&++a[e[i]-1];var o=new Bo(t);for(i=1;i<t;++i)o[i]=o[i-1]+a[i-1]<<1;var s;if(n){s=new Bo(1<<t);var c=15-t;for(i=0;i<r;++i)if(e[i])for(var l=i<<4|e[i],u=t-e[i],d=o[e[i]-1]++<<u,f=d|(1<<u)-1;d<=f;++d)s[Qo[d]>>c]=l}else for(s=new Bo(r),i=0;i<r;++i)e[i]&&(s[i]=Qo[o[e[i]-1]++]>>15-e[i]);return s}),ts=new Z(288),Q=0;Q<144;++Q)ts[Q]=8;for(var Q=144;Q<256;++Q)ts[Q]=9;for(var Q=256;Q<280;++Q)ts[Q]=7;for(var Q=280;Q<288;++Q)ts[Q]=8;for(var ns=new Z(32),Q=0;Q<32;++Q)ns[Q]=5;var rs=es(ts,9,0),is=es(ts,9,1),as=es(ns,5,0),os=es(ns,5,1),ss=function(e){for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},cs=function(e,t,n){var r=t/8|0;return(e[r]|e[r+1]<<8)>>(t&7)&n},ls=function(e,t){var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(t&7)},us=function(e){return(e+7)/8|0},ds=function(e,t,n){return(t==null||t<0)&&(t=0),(n==null||n>e.length)&&(n=e.length),new Z(e.subarray(t,n))},fs=[`unexpected EOF`,`invalid block type`,`invalid length/literal`,`invalid distance`,`stream finished`,`no stream handler`,,`no callback`,`invalid UTF-8 data`,`extra field too long`,`date not in range 1980-2099`,`filename too long`,`stream finishing`,`invalid zip data`],ps=function(e,t,n){var r=Error(t||fs[e]);if(r.code=e,Error.captureStackTrace&&Error.captureStackTrace(r,ps),!n)throw r;return r},ms=function(e,t,n,r){var i=e.length,a=r?r.length:0;if(!i||t.f&&!t.l)return n||new Z(0);var o=!n,s=o||t.i!=2,c=t.i;o&&(n=new Z(i*3));var l=function(e){var t=n.length;if(e>t){var r=new Z(Math.max(t*2,e));r.set(n),n=r}},u=t.f||0,d=t.p||0,f=t.b||0,p=t.l,m=t.d,h=t.m,g=t.n,_=i*8;do{if(!p){u=cs(e,d,1);var v=cs(e,d+1,3);if(d+=3,!v){var y=us(d)+4,b=e[y-4]|e[y-3]<<8,x=y+b;if(x>i){c&&ps(0);break}s&&l(f+b),n.set(e.subarray(y,x),f),t.b=f+=b,t.p=d=x*8,t.f=u;continue}if(v==1)p=is,m=os,h=9,g=5;else if(v==2){var S=cs(e,d,31)+257,C=cs(e,d+10,15)+4,w=S+cs(e,d+5,31)+1;d+=14;for(var T=new Z(w),E=new Z(19),D=0;D<C;++D)E[Wo[D]]=cs(e,d+D*3,7);d+=C*3;for(var O=ss(E),k=(1<<O)-1,A=es(E,O,1),D=0;D<w;){var j=A[cs(e,d,k)];d+=j&15;var y=j>>4;if(y<16)T[D++]=y;else{var M=0,N=0;for(y==16?(N=3+cs(e,d,3),d+=2,M=T[D-1]):y==17?(N=3+cs(e,d,7),d+=3):y==18&&(N=11+cs(e,d,127),d+=7);N--;)T[D++]=M}}var P=T.subarray(0,S),F=T.subarray(S);h=ss(P),g=ss(F),p=es(P,h,1),m=es(F,g,1)}else ps(1);if(d>_){c&&ps(0);break}}s&&l(f+131072);for(var ee=(1<<h)-1,te=(1<<g)-1,ne=d;;ne=d){var M=p[ls(e,d)&ee],I=M>>4;if(d+=M&15,d>_){c&&ps(0);break}if(M||ps(2),I<256)n[f++]=I;else if(I==256){ne=d,p=null;break}else{var re=I-254;if(I>264){var D=I-257,L=Ho[D];re=cs(e,d,(1<<L)-1)+qo[D],d+=L}var ie=m[ls(e,d)&te],ae=ie>>4;ie||ps(3),d+=ie&15;var F=Xo[ae];if(ae>3){var L=Uo[ae];F+=ls(e,d)&(1<<L)-1,d+=L}if(d>_){c&&ps(0);break}s&&l(f+131072);var oe=f+re;if(f<F){var se=a-F,ce=Math.min(F,oe);for(se+f<0&&ps(3);f<ce;++f)n[f]=r[se+f]}for(;f<oe;++f)n[f]=n[f-F]}}t.l=p,t.p=ne,t.b=f,t.f=u,p&&(u=1,t.m=h,t.d=m,t.n=g)}while(!u);return f!=n.length&&o?ds(n,0,f):n.subarray(0,f)},hs=function(e,t,n){n<<=t&7;var r=t/8|0;e[r]|=n,e[r+1]|=n>>8},gs=function(e,t,n){n<<=t&7;var r=t/8|0;e[r]|=n,e[r+1]|=n>>8,e[r+2]|=n>>16},_s=function(e,t){for(var n=[],r=0;r<e.length;++r)e[r]&&n.push({s:r,f:e[r]});var i=n.length,a=n.slice();if(!i)return{t:ws,l:0};if(i==1){var o=new Z(n[0].s+1);return o[n[0].s]=1,{t:o,l:1}}n.sort(function(e,t){return e.f-t.f}),n.push({s:-1,f:25001});var s=n[0],c=n[1],l=0,u=1,d=2;for(n[0]={s:-1,f:s.f+c.f,l:s,r:c};u!=i-1;)s=n[n[l].f<n[d].f?l++:d++],c=n[l!=u&&n[l].f<n[d].f?l++:d++],n[u++]={s:-1,f:s.f+c.f,l:s,r:c};for(var f=a[0].s,r=1;r<i;++r)a[r].s>f&&(f=a[r].s);var p=new Bo(f+1),m=vs(n[u-1],p,0);if(m>t){var r=0,h=0,g=m-t,_=1<<g;for(a.sort(function(e,t){return p[t.s]-p[e.s]||e.f-t.f});r<i;++r){var v=a[r].s;if(p[v]>t)h+=_-(1<<m-p[v]),p[v]=t;else break}for(h>>=g;h>0;){var y=a[r].s;p[y]<t?h-=1<<t-p[y]++-1:++r}for(;r>=0&&h;--r){var b=a[r].s;p[b]==t&&(--p[b],++h)}m=t}return{t:new Z(p),l:m}},vs=function(e,t,n){return e.s==-1?Math.max(vs(e.l,t,n+1),vs(e.r,t,n+1)):t[e.s]=n},ys=function(e){for(var t=e.length;t&&!e[--t];);for(var n=new Bo(++t),r=0,i=e[0],a=1,o=function(e){n[r++]=e},s=1;s<=t;++s)if(e[s]==i&&s!=t)++a;else{if(!i&&a>2){for(;a>138;a-=138)o(32754);a>2&&(o(a>10?a-11<<5|28690:a-3<<5|12305),a=0)}else if(a>3){for(o(i),--a;a>6;a-=6)o(8304);a>2&&(o(a-3<<5|8208),a=0)}for(;a--;)o(i);a=1,i=e[s]}return{c:n.subarray(0,r),n:t}},bs=function(e,t){for(var n=0,r=0;r<t.length;++r)n+=e[r]*t[r];return n},xs=function(e,t,n){var r=n.length,i=us(t+2);e[i]=r&255,e[i+1]=r>>8,e[i+2]=e[i]^255,e[i+3]=e[i+1]^255;for(var a=0;a<r;++a)e[i+a+4]=n[a];return(i+4+r)*8},Ss=function(e,t,n,r,i,a,o,s,c,l,u){hs(t,u++,n),++i[256];for(var d=_s(i,15),f=d.t,p=d.l,m=_s(a,15),h=m.t,g=m.l,_=ys(f),v=_.c,y=_.n,b=ys(h),x=b.c,S=b.n,C=new Bo(19),w=0;w<v.length;++w)++C[v[w]&31];for(var w=0;w<x.length;++w)++C[x[w]&31];for(var T=_s(C,7),E=T.t,D=T.l,O=19;O>4&&!E[Wo[O-1]];--O);var k=l+5<<3,A=bs(i,ts)+bs(a,ns)+o,j=bs(i,f)+bs(a,h)+o+14+3*O+bs(C,E)+2*C[16]+3*C[17]+7*C[18];if(c>=0&&k<=A&&k<=j)return xs(t,u,e.subarray(c,c+l));var M,N,P,F;if(hs(t,u,1+(j<A)),u+=2,j<A){M=es(f,p,0),N=f,P=es(h,g,0),F=h;var ee=es(E,D,0);hs(t,u,y-257),hs(t,u+5,S-1),hs(t,u+10,O-4),u+=14;for(var w=0;w<O;++w)hs(t,u+3*w,E[Wo[w]]);u+=3*O;for(var te=[v,x],ne=0;ne<2;++ne)for(var I=te[ne],w=0;w<I.length;++w){var re=I[w]&31;hs(t,u,ee[re]),u+=E[re],re>15&&(hs(t,u,I[w]>>5&127),u+=I[w]>>12)}}else M=rs,N=ts,P=as,F=ns;for(var w=0;w<s;++w){var L=r[w];if(L>255){var re=L>>18&31;gs(t,u,M[re+257]),u+=N[re+257],re>7&&(hs(t,u,L>>23&31),u+=Ho[re]);var ie=L&31;gs(t,u,P[ie]),u+=F[ie],ie>3&&(gs(t,u,L>>5&8191),u+=Uo[ie])}else gs(t,u,M[L]),u+=N[L]}return gs(t,u,M[256]),u+N[256]},Cs=new Vo([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),ws=new Z(0),Ts=function(e,t,n,r,i,a){var o=a.z||e.length,s=new Z(r+o+5*(1+Math.ceil(o/7e3))+i),c=s.subarray(r,s.length-i),l=a.l,u=(a.r||0)&7;if(t){u&&(c[0]=a.r>>3);for(var d=Cs[t-1],f=d>>13,p=d&8191,m=(1<<n)-1,h=a.p||new Bo(32768),g=a.h||new Bo(m+1),_=Math.ceil(n/3),v=2*_,y=function(t){return(e[t]^e[t+1]<<_^e[t+2]<<v)&m},b=new Vo(25e3),x=new Bo(288),S=new Bo(32),C=0,w=0,T=a.i||0,E=0,D=a.w||0,O=0;T+2<o;++T){var k=y(T),A=T&32767,j=g[k];if(h[A]=j,g[k]=A,D<=T){var M=o-T;if((C>7e3||E>24576)&&(M>423||!l)){u=Ss(e,c,0,b,x,S,w,E,O,T-O,u),E=C=w=0,O=T;for(var N=0;N<286;++N)x[N]=0;for(var N=0;N<30;++N)S[N]=0}var P=2,F=0,ee=p,te=A-j&32767;if(M>2&&k==y(T-te))for(var ne=Math.min(f,M)-1,I=Math.min(32767,T),re=Math.min(258,M);te<=I&&--ee&&A!=j;){if(e[T+P]==e[T+P-te]){for(var L=0;L<re&&e[T+L]==e[T+L-te];++L);if(L>P){if(P=L,F=te,L>ne)break;for(var ie=Math.min(te,L-2),ae=0,N=0;N<ie;++N){var oe=T-te+N&32767,se=oe-h[oe]&32767;se>ae&&(ae=se,j=oe)}}}A=j,j=h[A],te+=A-j&32767}if(F){b[E++]=268435456|Jo[P]<<18|Zo[F];var ce=Jo[P]&31,le=Zo[F]&31;w+=Ho[ce]+Uo[le],++x[257+ce],++S[le],D=T+P,++C}else b[E++]=e[T],++x[e[T]]}}for(T=Math.max(T,D);T<o;++T)b[E++]=e[T],++x[e[T]];u=Ss(e,c,l,b,x,S,w,E,O,T-O,u),l||(a.r=u&7|c[u/8|0]<<3,u-=7,a.h=g,a.p=h,a.i=T,a.w=D)}else{for(var T=a.w||0;T<o+l;T+=65535){var ue=T+65535;ue>=o&&(c[u/8|0]=l,ue=o),u=xs(c,u+1,e.subarray(T,ue))}a.i=o}return ds(s,0,r+us(u)+i)},Es=(function(){for(var e=new Int32Array(256),t=0;t<256;++t){for(var n=t,r=9;--r;)n=(n&1&&-306674912)^n>>>1;e[t]=n}return e})(),Ds=function(){var e=-1;return{p:function(t){for(var n=e,r=0;r<t.length;++r)n=Es[n&255^t[r]]^n>>>8;e=n},d:function(){return~e}}},Os=function(e,t,n,r,i){if(!i&&(i={l:1},t.dictionary)){var a=t.dictionary.subarray(-32768),o=new Z(a.length+e.length);o.set(a),o.set(e,a.length),e=o,i.w=a.length}return Ts(e,t.level==null?6:t.level,t.mem==null?i.l?Math.ceil(Math.max(8,Math.min(13,Math.log(e.length)))*1.5):20:12+t.mem,n,r,i)},ks=function(e,t){var n={};for(var r in e)n[r]=e[r];for(var r in t)n[r]=t[r];return n},$=function(e,t,n){for(;n;++t)e[t]=n,n>>>=8};function As(e,t){return Os(e,t||{},0,0)}function js(e,t){return ms(e,{i:2},t&&t.out,t&&t.dictionary)}var Ms=function(e,t,n,r){for(var i in e){var a=e[i],o=t+i,s=r;Array.isArray(a)&&(s=ks(r,a[1]),a=a[0]),ArrayBuffer.isView(a)?n[o]=[a,s]:(n[o+=`/`]=[new Z(0),s],Ms(a,o,n,r))}},Ns=typeof TextEncoder<`u`&&new TextEncoder,Ps=typeof TextDecoder<`u`&&new TextDecoder;try{Ps.decode(ws,{stream:!0})}catch{}function Fs(e,t){if(t){for(var n=new Z(e.length),r=0;r<e.length;++r)n[r]=e.charCodeAt(r);return n}if(Ns)return Ns.encode(e);for(var i=e.length,a=new Z(e.length+(e.length>>1)),o=0,s=function(e){a[o++]=e},r=0;r<i;++r){if(o+5>a.length){var c=new Z(o+8+(i-r<<1));c.set(a),a=c}var l=e.charCodeAt(r);l<128||t?s(l):l<2048?(s(192|l>>6),s(128|l&63)):l>55295&&l<57344?(l=65536+(l&1047552)|e.charCodeAt(++r)&1023,s(240|l>>18),s(128|l>>12&63),s(128|l>>6&63),s(128|l&63)):(s(224|l>>12),s(128|l>>6&63),s(128|l&63))}return ds(a,0,o)}var Is=function(e){var t=0;if(e)for(var n in e){var r=e[n].length;r>65535&&ps(9),t+=r+4}return t},Ls=function(e,t,n,r,i,a,o,s){var c=r.length,l=n.extra,u=s&&s.length,d=Is(l);$(e,t,o==null?67324752:33639248),t+=4,o!=null&&(e[t++]=20,e[t++]=n.os),e[t]=20,t+=2,e[t++]=n.flag<<1|(a<0&&8),e[t++]=i&&8,e[t++]=n.compression&255,e[t++]=n.compression>>8;var f=new Date(n.mtime==null?Date.now():n.mtime),p=f.getFullYear()-1980;if((p<0||p>119)&&ps(10),$(e,t,p<<25|f.getMonth()+1<<21|f.getDate()<<16|f.getHours()<<11|f.getMinutes()<<5|f.getSeconds()>>1),t+=4,a!=-1&&($(e,t,n.crc),$(e,t+4,a<0?-a-2:a),$(e,t+8,n.size)),$(e,t+12,c),$(e,t+14,d),t+=16,o!=null&&($(e,t,u),$(e,t+6,n.attrs),$(e,t+10,o),t+=14),e.set(r,t),t+=c,d)for(var m in l){var h=l[m],g=h.length;$(e,t,+m),$(e,t+2,g),e.set(h,t+4),t+=4+g}return u&&(e.set(s,t),t+=u),t},Rs=function(e,t,n,r,i){$(e,t,101010256),$(e,t+8,n),$(e,t+10,n),$(e,t+12,r),$(e,t+16,i)};function zs(e,t){t||={};var n={},r=[];Ms(e,``,n,t);var i=0,a=0;for(var o in n){var s=n[o],c=s[0],l=s[1],u=l.level==0?0:8,d=Fs(o),f=d.length,p=l.comment,m=p&&Fs(p),h=m&&m.length,g=Is(l.extra);f>65535&&ps(11);var _=u?As(c,l):c,v=_.length,y=Ds();y.p(c),r.push(ks(l,{size:c.length,crc:y.d(),c:_,f:d,m,u:f!=o.length||m&&p.length!=h,o:i,compression:u})),i+=30+f+g+v,a+=76+2*(f+g)+(h||0)+v}for(var b=new Z(a+22),x=i,S=a-i,C=0;C<r.length;++C){var d=r[C];Ls(b,d.o,d,d.f,d.u,d.c.length);var w=30+d.f.length+Is(d.extra);b.set(d.c,d.o+w),Ls(b,i,d,d.f,d.u,d.c.length,d.o,d.m),i+=16+w+(d.m?d.m.length:0)}return Rs(b,i,r.length,S,x),b}var Bs=e=>As(e,{level:9}),Vs=(e,t)=>{let n=js(e,{out:new Uint8Array(t+1)});if(n.length>t)throw RangeError(`unpacks to more than ${t} bytes`);return n},Hs;function Us(e){return Hs?.payload!==e&&(Hs={payload:e,opened:Fi(e,Vs)}),Hs.opened}function Ws(e){return`#/open?d=${Mi(Ai(e),Bs)}`}export{Zn as $,Ze as $t,gi as A,ht as At,Hr as B,ot as Bt,$i as C,gt as Ct,Ni as D,xt as Dt,Oi as E,kt as Et,ii as F,bt as Ft,Ar as G,Ve as Gt,jr as H,Ke as Ht,Qr as I,lt as It,pr as J,We as Jt,Ur as K,tt as Kt,Nr as L,z as Lt,wi as M,Mt,Ti as N,Tt as Nt,Ci as O,Ht as Ot,Ei as P,Ot as Pt,Un as Q,Ue as Qt,Mr as R,st as Rt,Zi as S,Pt as St,Yi as T,_t as Tt,Rr as U,He as Ut,Wr as V,Le as Vt,zr as W,Be as Wt,xr as X,R as Xt,fr as Y,Re as Yt,Sr as Z,ze as Zt,wa as _,Et as _t,zo as a,je as an,nn as at,_a as b,Rt as bt,No as c,_e as cn,Dt as ct,Xa as d,e as dn,wt as dt,Pe as en,Qn as et,Da as f,r as fn,zt as ft,ka as g,ut as gt,Oa as h,dt as ht,zs as i,Ae as in,on as it,vi as j,Nt as jt,Si as k,Lt as kt,yo as l,ve as ln,yt as lt,Aa as m,Ft as mt,Ws as n,qe as nn,Gt as nt,Io as o,Ce as on,$t as ot,Ta as p,n as pn,pt,vr as q,Xe as qt,Fs as r,ke as rn,sn as rt,Ro as s,be as sn,ct as st,Us as t,Ie as tn,dn as tt,vo as u,ue as un,It as ut,Ea as v,At as vt,Ui as w,mt as wt,Xi as x,Ut as xt,Ca as y,St as yt,Br as z,at as zt};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=128,t={yaw:-.46,pitch:.46},n=.96,r=[.1,1.05],i=30,a=1.4,o=e=>e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`).replace(/"/g,`"`),s={"claude-code":`Claude Code`,codex:`Codex`};function c(e,t){return e.place&&t.place&&e.place!==t.place?1.8:e.machine===t.machine?1:1.35}function l(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 u(e,t,n={}){let[,,,,,,,,,r,i,a,,,,u,,,,,,,f,,,p,m,h,g]=e,_=u(`auto`),v=Math.max(1,n.per??3),{sessions:y,people:b,handoffs:x,numberOf:S}=i(t),C=e=>t.sessions.find(t=>t.id===e)?.name||(t.people??[]).find(t=>t.id===e)?.name||e,w=(e,t,n,r,i,s=``,c)=>{let u=i>1?`×${i}`:``,d=u?h(u,9.5,`bold`)+10:0,p=g(t,e=>112-(u&&e===0?d+4:0),12.5,3,`bold`),v=c?l(c):void 0,y=7+p.length*15+13+(s?11.5:0)+(v?15:0)+6;return{id:e,h:y,svg:()=>{let t=[f(.7,.7,126.6,y-1.4,n?{fill:_(`gate-soft`),stroke:_(`gate`),rx:12,width:1.4,mark:`card`}:{fill:_(`surface`),stroke:_(`line-strong`),rx:8,mark:`card`})],i=5;if(p.forEach((e,n)=>{i+=15,t.push(m(8,i,e,{size:12.5,fill:_(`ink`),weight:`bold`})),n===0&&u&&t.push(f(120-d,i-10.5,d,14,{fill:_(`accent-soft`),rx:7})+m(120-d/2,i,u,{size:9.5,fill:_(`accent`),weight:`bold`,anchor:`middle`}))}),i+=13,t.push(m(8,i,g(r,112,9.5,1,`bold`)[0],{size:9.5,fill:_(n?`gate`:r===`Codex`?`check`:`accent`),weight:`bold`})),s&&t.push(m(8,i+=11.5,g(s,112,9,1)[0],{size:9,fill:_(`ink-3`)})),v){i+=15;let e=_(v.state===`working`?`accent`:v.state===`waiting`?`warning`:`ink-3`),n=v.state===`working`||v.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+m(18,i,g(v.says,104,9,1,`bold`)[0],{size:9,fill:e,weight:`bold`}))}return`<g data-${n?`person`:`session`}="${o(e)}"${v?` data-live="${v.state}"`:``}>${t.join(``)}</g>`}}},T=t.lanes,E=[...b.length?[{cls:` is-people`,mark:`data-people=""`,name:b.length===1?`Person`:`People`,sub:`on no machine, under no account`,place:``,gap:0,items:b.map(e=>w(e.id,e.name||e.id,!0,`person`,1))}]:[],...T.map((e,t)=>({cls:``,mark:`data-lane="${o(e.id)}"`,name:e.name||e.id,sub:`${e.machine} · ${e.account}`,place:e.place??``,gap:t===0?1:c(T[t-1],e),items:y.filter(t=>t.lane===e.id).map(e=>w(e.id,e.name||e.id,!1,s[e.harness]??e.harness,e.count??1,e.model,n.live?.[e.id]))}))],D=x.map(e=>({id:e.id,n:S.get(e.id),from:e.from,to:e.to,style:p(e)})),O=x.length,k=[{short:`all handoffs`,says:O===0?`This map has no handoffs to step through.`:O===1?`The map's one handoff is lit.`:`All ${O} handoffs are lit. Move the slider or press Play to light them one at a time.`}];if(x.forEach((e,n)=>{let i=e.from===e.to?`${C(e.from)} to itself`:`${C(e.from)} to ${C(e.to)}`;k.push({handoff:e.id,short:`handoff ${D[n].n} of ${t.handoffs.length}`,says:`Handoff ${D[n].n} of ${t.handoffs.length}: ${i} · ${r(t,e)}${e.what?` · ${e.what}`:``}`})}),n.live){let e=Object.values(n.live).map(e=>l(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`)];k.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 d(e,{title:t.name||t.id,sheets:E,links:D,stops:k,per:v,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 d(e,{title:n,sheets:r,links:i,stops:a,per:s,link:c,links_:l,none:u,range:d,note:f,flat:p,step:m=c}){let[,,,,,,,,,,,h,g,,,_,,v,,,,,,,b]=e,x=_(`auto`),S=Math.max(1,Math.min(s,Math.max(...r.map(e=>e.items.length),1))),C=48+S*128+(S-1)*14,w=e=>48+(Math.max(1,Math.ceil(e/S))-1)*104,T=Math.max(0,...r.map(e=>w(e.items.length)))+Math.max(0,r.length-1)*34,E=Math.max(40,...r.flatMap(e=>e.items.map(e=>e.h))),D=new Map,O=[],k=[],A=0;r.forEach((e,t)=>{A+=E+(t===0?0:56*e.gap),O.push(A);let n=w(e.items.length),i=T-(r.length-1-t)*34,a=i-n;k.push(`<div class="space-sheet${e.cls}" ${e.mark} style="width:${h(C)}px;height:${h(n)}px;transform:translate3d(0,${h(A)}px,${h(a)}px) rotateX(90deg)"></div><div class="space-label" style="width:${h(C)}px;transform:translate3d(0,${h(A+3)}px,${h(i)}px)"><b>${o(e.name)}</b>${e.place?`<i>${o(e.place)}</i>`:``}<span>${o(e.sub)}${e.items.length?``:u}</span></div>`),e.items.forEach((t,n)=>{let r=Math.floor(n/S),a=Math.min(S,e.items.length-r*S),o=(C-a*128-(a-1)*14)/2+n%S*142,s=i-24-r*104;D.set(t.id,{at:[o,A-t.h,s],h:t.h}),k.push(`<div class="space-card" style="width:128px;height:${h(t.h)}px;transform:translate3d(${h(o)}px,${h(A-t.h)}px,${h(s)}px)"><svg viewBox="0 0 128 ${h(t.h)}" width="128" height="${h(t.h)}">${t.svg()}</svg></div>`)})});let j=new Map;i.forEach((e,t)=>{let[n,r]=[D.get(e.from),D.get(e.to)];(j.get(e.from)??j.set(e.from,[]).get(e.from)).push({arc:t,from:!0,toward:r.at[0]-n.at[0]}),(j.get(e.to)??j.set(e.to,[]).get(e.to)).push({arc:t,from:!1,toward:n.at[0]-r.at[0]})});let M=new Map;for(let[e,t]of j){let n=D.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)=>M.set(`${e.arc}${e.from?`a`:`b`}`,[n.at[0]+64+(i-(t.length-1)/2)*r,n.at[1],n.at[2]]))}let N=new Map,P=i.map((e,t)=>{let[n,r]=[M.get(`${t}a`),M.get(`${t}b`)],i=[e.from,e.to].sort().join(` `),a=N.get(i)??0;N.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}});P.forEach((e,t)=>{let n=i[t],r=n.style,a=x(r.color),s=Math.max(1,Math.hypot(e.b[0]-e.a[0],e.b[1]-e.a[1],e.b[2]-e.a[2])),l=e.lift+9,[u,d]=[s/2,l-2*e.lift],f=Math.atan2(l-d,s-u),[p,m]=[s-Math.cos(f)*5,l-Math.sin(f)*5],g=`M0,${h(l)} Q${h(u)},${h(d)} ${h(p)},${h(m)}`;k.push(`<div class="space-arc" data-arc="${t}" style="width:${h(s)}px;height:${h(l+9)}px"><svg viewBox="0 0 ${h(s)} ${h(l+9)}" width="${h(s)}" height="${h(l+9)}"><g data-${c}="${o(n.id)}" tabindex="0"><path d="${g}" ${b(r,a)}/><path class="space-hit" d="${g}"/><circle cx="0" cy="${h(l)}" r="2.4" style="fill:${a}"/><path d="M0,0 L-8,-3.8 L-8,3.8 z" transform="translate(${h(s)},${h(l)}) rotate(${h(f*180/Math.PI)})" style="fill:${a}"/></g></svg></div><div class="space-n" data-arc="${t}" aria-hidden="true"><svg data-number="${o(n.id)}" viewBox="-11 -9 22 18" width="22" height="18">${v(0,0,String(e.n),a,x)}</svg></div>`)});let F=/<style>[\s\S]*?<\/style>/.exec(g(1,1,``,`auto`,x,``,`space`))?.[0]??``,I={min:[0,0,0],max:[C,(O[O.length-1]??0)+36,T]};for(let e of P){let n=y(e,t.yaw,t.pitch);for(let t of[0,1,2]){let r=(e.a[t]+e.b[t])/2+n[t]*(e.lift+9);I.min[t]=Math.min(I.min[t],r),I.max[t]=Math.max(I.max[t],r)}}let L=a.length-1;return{html:`<div class="space grooph-picture" data-picture="space">${F}<div class="space-bar"><span>Drag to turn. Pinch to move in and out, or pick the scene and scroll.</span><button type="button" data-do="out" aria-label="Move out">−</button><button type="button" data-do="in" aria-label="Move in">+</button><button type="button" data-do="reset">Starting view</button></div><div class="space-scene" tabindex="0" role="group" aria-label="${o(n)} in three dimensions: ${r.length} sheets, ${D.size} cards, ${i.length} ${l}. Drag, or use the arrow keys, to turn it; pinch, scroll, or use plus and minus, to move in and out."><div class="space-lens"><div class="space-world">${k.join(``)}</div></div></div><div class="space-time"><div class="space-steps"><button type="button" data-do="play" aria-label="Play"${L===0?` disabled`:``}>Play</button><button type="button" data-do="back" aria-label="Previous ${m}"${L===0?` disabled`:``}>‹</button><button type="button" data-do="next" aria-label="Next ${m}"${L===0?` disabled`:``}>›</button><input type="range" min="0" max="${L}" step="1" value="0" aria-label="${d}"${L===0?` disabled`:``}></div><output>${o(a[0].says)}</output><p class="space-note">${f}</p></div><p class="space-flat" role="status" hidden><span></span>${p}</p></div>`,box:I,arcs:P,stops:a,cards:D,floors:O}}var f=(e,t)=>[e[0]-t[0],e[1]-t[1],e[2]-t[2]],p=(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2],m=(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]],h=(e,t)=>[e[0]*t,e[1]*t,e[2]*t],g=e=>h(e,1/(Math.hypot(e[0],e[1],e[2])||1));function _(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)]}var v=(e,t)=>[-Math.cos(t)*Math.sin(e),-Math.sin(t),Math.cos(t)*Math.cos(e)];function y(e,t,n,r){let i=g(f(e.b,e.a)),a=v(t,n),o=f(a,h(i,p(a,i)));if(Math.hypot(...o)<.001)return r??[0,-1,0];let s=g(m(g(o),i)),c=_(s,t,n);return(r?p(s,r):Math.abs(c[1])>.2?-c[1]:-c[0])<0&&(s=h(s,-1)),s}function b(e,n,r,i,a=t.yaw,o=t.pitch){let s=h([e.min[0]+e.max[0],e.min[1]+e.max[1],e.min[2]+e.max[2]],.5),c=[0,1,2,3,4,5,6,7].map(t=>_(f([t&1?e.max[0]:e.min[0],t&2?e.max[1]:e.min[1],t&4?e.max[2]:e.min[2]],s),a,o)),l=e=>c.every(t=>{let a=i/Math.max(1,i-t[2]*e);return Math.abs(t[0]*e*a)<=n/2-14&&Math.abs(t[1]*e*a)<=r/2-14}),[u,d]=[.02,4];for(let e=0;e<24;e++){let e=(u+d)/2;l(e)?u=e:d=e}return u}function x(e){if(e.length<24)return;let t=Math.round(1e3/e.slice(-24).sort((e,t)=>e-t)[12]);return t<30?t:void 0}function S(e,t){let n=e.stops[Math.max(0,Math.min(e.stops.length-1,t))],r=e.arcs.findIndex(e=>e.id===n.handoff);return{stop:n,arcs:e.arcs.map((e,t)=>n.now?`past`:r<0?``:t===r?`lit`:n.alone?``:t<r?`past`:`ahead`),ends:r<0?n.ends??[]:[e.arcs[r].from,e.arcs[r].to]}}var C=()=>({...t,zoom:1,step:0}),w=!1;function T(e,i,o,s){if(!w){let e=document.createElement(`style`);e.textContent=`.map-picture:has(>.space){box-shadow:none;border:0;padding:0;overflow:visible;aspect-ratio:auto!important;max-width:1180px!important}.space{font:13px/1.4 var(--font);color:var(--ink);gap:10px;padding:0 12px;display:grid}@media (min-width:1100px){.is-wide .space{padding:0}.is-wide .map-picture [data-picture=space] :is([data-handoff],[data-number]){opacity:1!important}}.space button{border:1px solid var(--line-strong);background:var(--surface);min-width:40px;min-height:40px;font:inherit;color:var(--ink);cursor:pointer;border-radius:10px;padding:0 12px}.space button:is(:hover,:focus-visible){background:var(--surface-2)}.space button:disabled{opacity:.5;cursor:default}.space-bar,.space-steps{align-items:center;gap:6px;display:flex}.space-bar span{color:var(--ink-3);text-wrap:pretty;flex:1;font-size:12.5px}.space-scene{border:1px solid var(--line);background:var(--gp-bg);touch-action:none;cursor:grab;-webkit-user-select:none;user-select:none;border-radius:14px;height:clamp(340px,100vh - 300px,820px);position:relative;overflow:clip}.space-scene:active{cursor:grabbing}.space-scene:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.space-lens{position:absolute;inset:0}.space-world,.space-world>div{transform-origin:0 0;position:absolute;top:0;left:0}.space-world{transform-style:preserve-3d}.space-sheet{box-sizing:border-box;border:1.2px solid var(--gp-line-strong);background:color-mix(in srgb, var(--gp-surface-2) 72%, transparent);border-radius:12px}.space-sheet.is-people{border-style:dashed}.space-label{box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;color:var(--gp-ink-3);pointer-events:none;padding:0 4px;font-size:10.5px;line-height:1.5;overflow:hidden}.space-label b{color:var(--gp-ink);margin-right:6px;font-size:12px}.space-label i{border:1px solid var(--gp-line-strong);color:var(--gp-ink-2);border-radius:9px;padding:1px 7px;font-style:normal}.space-label span{text-overflow:ellipsis;display:block;overflow:hidden}.space svg{font-family:var(--font);overflow:visible}.space-arc{pointer-events:none}.space-arc [data-handoff]{pointer-events:stroke}.space-hit{fill:none;stroke:#0000;stroke-width:16px}.space-n{width:22px}.space-arc,.space-n{transition:opacity .16s ease-out}.space .is-past{opacity:.5}.space .is-ahead{opacity:.16}.space .space-arc.is-lit [data-handoff]>path:first-of-type{stroke-width:3.8px}.space [data-handoff]:focus-visible>.space-hit{stroke:var(--gp-accent);stroke-opacity:.3}.space :is([data-session],[data-person]):focus-visible>rect[data-card]{stroke-width:2.6px;stroke-dasharray:6 3;stroke:var(--gp-ink)!important}.space-n.is-lit svg{scale:1.45}.space :is([data-session],[data-person]).is-end>rect[data-card]{stroke-width:2.4px;stroke:var(--gp-accent)!important;fill:var(--gp-accent-soft)!important}.space-sheet.is-end{border-color:var(--gp-accent);background:color-mix(in srgb, var(--gp-accent-soft) 80%, transparent)}.space.is-now [data-live=working]>rect[data-card]{stroke-width:2.4px;stroke:var(--gp-accent)!important}.space.is-now [data-live=ended]{opacity:.55}.space-time{gap:6px;display:grid}.space-steps input{min-width:0;min-height:40px;accent-color:var(--accent);flex:1}.space output{text-wrap:pretty;min-height:2.8em;font-size:14px}.space-note,.space-flat{color:var(--ink-3);margin:0;font-size:12.5px}.space-flat{border:1px solid var(--line-strong);background:var(--surface);color:var(--ink);border-radius:10px;padding:10px 12px}.space.is-flat>:not(.space-flat,style){display:none}@media (prefers-reduced-motion:reduce){.space-arc,.space-n{transition:none}}`,document.head.append(e),w=!0}let c=t=>e.querySelector(t),l=c(`.space-scene`),u=c(`.space-lens`),d=c(`.space-world`),p=e.closest(`.map-stage`),_=c(`input[type="range"]`),v=c(`output`),C=c(`.space-flat`),T=c(`[data-do="play"]`),E=typeof matchMedia==`function`&&matchMedia(`(prefers-reduced-motion: reduce)`).matches,D=[],O=(e,t,n,r)=>{e.addEventListener(t,n,r),D.push(()=>e.removeEventListener(t,n,r))},k=e=>{C.querySelector(`span`).textContent=e,C.hidden=!1};if(O(C,`click`,e=>{let t=e.target.closest(`[data-flat]`)?.dataset.flat;t&&s(t),e.stopPropagation()}),typeof CSS>`u`||!CSS.supports(`transform-style`,`preserve-3d`))return e.classList.add(`is-flat`),k(`This browser cannot draw the map in three dimensions.`),()=>D.forEach(e=>e());let A=[(i.box.min[0]+i.box.max[0])/2,(i.box.min[1]+i.box.max[1])/2,(i.box.min[2]+i.box.max[2])/2],j=[...e.querySelectorAll(`.space-arc`)],M=[...e.querySelectorAll(`.space-n`)],N=i.arcs.map(()=>void 0),P=1400,F=1,I=()=>{let{yaw:e,pitch:t}=o;u.style.transform=`scale(${o.zoom})`,d.style.transform=`translate3d(${l.clientWidth/2}px,${l.clientHeight/2}px,0) scale3d(${F},${F},${F}) rotateX(${-t}rad) rotateY(${e}rad) translate3d(${-A[0]}px,${-A[1]}px,${-A[2]}px)`,i.arcs.forEach((n,r)=>{let i=g(f(n.b,n.a)),a=N[r]=y(n,e,t,N[r]),o=m(i,h(a,-1)),s=n.lift+9,c=[n.a[0]+a[0]*s,n.a[1]+a[1]*s,n.a[2]+a[2]*s];j[r].style.transform=`matrix3d(${i[0]},${i[1]},${i[2]},0,${-a[0]},${-a[1]},${-a[2]},0,${o[0]},${o[1]},${o[2]},0,${c[0]},${c[1]},${c[2]},1)`;let l=[(n.a[0]+n.b[0])/2+a[0]*n.lift,(n.a[1]+n.b[1])/2+a[1]*n.lift,(n.a[2]+n.b[2])/2+a[2]*n.lift];M[r].style.transform=`translate3d(${l[0]}px,${l[1]}px,${l[2]}px) rotateY(${-e}rad) rotateX(${t}rad) translate(-50%,-50%)`})},L=p?.clientHeight??0,R=()=>{let t=Math.max(340,Math.min(820,innerHeight-300));l.style.height=`${Math.max(180,Math.min(t,p?p.clientHeight-12-Number(p.dataset.keep??0):t))}px`,p&&p.clientHeight<L&&e.querySelector(`.is-on`)&&l.scrollIntoView({block:`nearest`}),L=p?.clientHeight??0,P=Math.max(900,l.clientWidth*1.7),u.style.perspective=`${P}px`,F=Math.min(a,b(i.box,l.clientWidth,l.clientHeight,P)),I()},z=[],B=0,V=0,H=0,U=!1,W=``,G,ee=e=>{if(B=0,U&&(H=e+160),U=!1,G){let n=Math.min(1,(e-(G.start||=e))/320),r=1-(1-n)**3;o.yaw=G.from.yaw+(t.yaw-G.from.yaw)*r,o.pitch=G.from.pitch+(t.pitch-G.from.pitch)*r,o.zoom=G.from.zoom+(1-G.from.zoom)*r,n>=1&&(G=void 0)}let n=`${o.yaw} ${o.pitch} ${o.zoom}`;V&&n!==W&&z.push(e-V),z.length>96&&z.splice(0,48),W=n,V=e,I();let r=x(z);r!==void 0&&C.hidden&&k(`This device is drawing the map in three dimensions ${r} times a second, fewer than 30: too slowly to turn it smoothly.`),G||e<H?B=requestAnimationFrame(ee):V=0},K=()=>{U=!0,B||=requestAnimationFrame(ee)};D.push(()=>cancelAnimationFrame(B));let te=()=>{V=0,z.length=0};document.addEventListener(`visibilitychange`,te),D.push(()=>document.removeEventListener(`visibilitychange`,te));let ne=(e,t)=>{o.yaw=Math.max(-.96,Math.min(n,e)),o.pitch=Math.max(r[0],Math.min(r[1],t)),K()},q=e=>{o.zoom=Math.max(.4,Math.min(5,o.zoom*e)),K()},re=()=>{E?(Object.assign(o,t,{zoom:1}),I()):(G={from:{...o},start:0},K())},J=new Map,Y=!1,X=0;O(l,`pointerdown`,e=>{(e.pointerType!==`mouse`||e.button===0)&&(e.isPrimary&&J.clear(),J.set(e.pointerId,[e.clientX,e.clientY]),clearTimeout(X),Y=!1,G=void 0)}),O(l,`pointermove`,e=>{e.pointerType===`mouse`&&e.buttons===0&&J.delete(e.pointerId);let t=J.get(e.pointerId);if(!t)return;let[n,r]=[e.clientX-t[0],e.clientY-t[1]];if(J.size===2){let n=[...J].find(([t])=>t!==e.pointerId)[1],[r,i]=[Math.hypot(t[0]-n[0],t[1]-n[1]),Math.hypot(e.clientX-n[0],e.clientY-n[1])];r>0&&q(i/r),Y=!0}else if(Y||Math.hypot(n,r)>4){if(!Y)try{l.setPointerCapture(e.pointerId)}catch{}Y=!0,ne(o.yaw+n*.006,o.pitch+r*.005)}else return;J.set(e.pointerId,[e.clientX,e.clientY])});for(let e of[`pointerup`,`pointercancel`])O(l,e,e=>{J.delete(e.pointerId),clearTimeout(X),X=window.setTimeout(()=>Y=!1,60)});D.push(()=>clearTimeout(X)),O(document,`click`,e=>{Y&&=(e.stopPropagation(),e.preventDefault(),!1)},{capture:!0}),O(l,`wheel`,e=>{(e.ctrlKey||l.contains(document.activeElement))&&(e.preventDefault(),q(Math.exp(-e.deltaY*(e.ctrlKey?.01:.0016))))},{passive:!1}),O(l,`keydown`,e=>{if(e.target!==l||e.metaKey||e.ctrlKey||e.altKey)return;let t={ArrowLeft:[-.09,0],ArrowRight:[.09,0],ArrowUp:[0,-.07],ArrowDown:[0,.07]}[e.key];if(t)ne(o.yaw+t[0],o.pitch+t[1]);else if(e.key===`+`||e.key===`=`)q(1.15);else if(e.key===`-`||e.key===`_`)q(1/1.15);else if(e.key===`0`||e.key===`Home`)re();else return;e.preventDefault()});let Z=0,Q=()=>{clearInterval(Z),Z=0,T.textContent=`Play`,T.setAttribute(`aria-label`,`Play`)},$=t=>{o.step=Math.max(0,Math.min(i.stops.length-1,t));let{stop:n,arcs:r,ends:a}=S(i,o.step);r.forEach((e,t)=>{for(let n of[j[t],M[t]])for(let t of[`lit`,`past`,`ahead`])n.classList.toggle(`is-${t}`,e===t)});for(let t of e.querySelectorAll(`.is-end`))t.classList.remove(`is-end`);for(let t of a)e.querySelector([`session`,`person`,`node`].map(e=>`[data-${e}="${CSS.escape(t)}"]`).join())?.classList.add(`is-end`);n.sheet&&e.querySelector(`.space-sheet[${n.sheet}]`)?.classList.add(`is-end`),e.classList.toggle(`is-now`,n.now===!0),_.value=String(o.step),_.setAttribute(`aria-valuetext`,n.short),v.textContent=n.says};O(_,`input`,()=>{Q(),$(Number(_.value))}),O(c(`.space-time`),`click`,e=>{let t=e.target.closest(`[data-do]`)?.dataset.do;if(e.stopPropagation(),t===`back`||t===`next`)Q(),$(o.step+(t===`next`?1:-1));else if(t===`play`){if(Z)return Q();o.step>=i.stops.length-1&&$(0),T.textContent=`Pause`,T.setAttribute(`aria-label`,`Pause`),Z=window.setInterval(()=>{$(o.step+1),o.step>=i.stops.length-1&&Q()},2400)}}),D.push(Q),O(c(`.space-bar`),`click`,e=>{let t=e.target.closest(`[data-do]`)?.dataset.do;e.stopPropagation(),t===`reset`?re():t&&q(t===`in`?1.25:.8)});let ie=!1,ae=window.setTimeout(()=>ie=!0,0);D.push(()=>clearTimeout(ae));let oe=new MutationObserver(e=>{for(let t of e){let e=t.target,n=e.getAttribute(`data-handoff`);if(!n||!e.classList.contains(`is-on`)||/\bis-on\b/.test(t.oldValue??``))continue;let r=i.stops.findIndex(e=>e.handoff===n);r>0&&r!==o.step&&(ie||o.step===0)&&(Q(),$(r))}});if(oe.observe(d,{attributes:!0,attributeFilter:[`class`],attributeOldValue:!0,subtree:!0}),D.push(()=>oe.disconnect()),O(l,`scroll`,()=>l.scrollTo(0,0)),typeof ResizeObserver==`function`){let e=new ResizeObserver(R);e.observe(l),p&&e.observe(p),D.push(()=>e.disconnect())}return R(),$(o.step),()=>D.forEach(e=>e())}export{e as CARD,i as FRAMES,t as START,c as apart,T as attach,y as bow,b as fit,C as held,S as lights,u as plan,d as scene,v as toEye,x as tooSlow,_ as turned};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--bg:#f1f5f3;--surface:#fdfefd;--surface-2:#e8eeeb;--ink:#161c19;--ink-2:#414a46;--ink-3:#5c6661;--line:#dadfdd;--line-strong:#b8c0bc;--dots:#c2c9c6;--accent:#1f5f4a;--accent-ink:#fff;--accent-soft:#d6efe3;--focus:#2f7d62;--error:#b42318;--error-soft:#fceae7;--warning:#955500;--warning-soft:#fcf0d9;--ok:#1f7a4d;--ok-soft:#d8f3e3;--edge:#6b7470;--highlight:#d97706;--kind-agent:#1f5f4a;--kind-human-gate:#b25e09;--kind-check:#2b5f9e;--kind-merge:#6b4fa0;--kind-stop:#5b5f66;--loop-0:#7a4cc2;--loop-1:#0f7c8c;--loop-2:#c2410c;--loop-3:#b5306e;--z-overlay:10;--z-toolbar:20;--z-banner:30;--z-chrome:40;--radius:10px;--shadow:0 1px 2px #12181512, 0 4px 14px #12181512;--shadow-up:0 -6px 24px #1218151a;--font:"Atkinson Hyperlegible Next", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--mono:"Atkinson Hyperlegible Mono", ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, "Roboto Mono", monospace;--night:#061a14;--night-2:#0d261f;--night-line:#2d423b;--night-ink:#edf4f0;--night-muted:#acbcb4;--bright:#64eab7;--mark:#64eab780;--shadow-card:0 1px 2px #061a140f, 0 18px 40px -16px #061a1447;--shadow-night:0 24px 60px -20px #000100cc;--gutter:clamp(16px, 4vw, 40px)}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}@supports (color:lab(0% 0 0)){:root{--bg:lab(96.3555% -1.64139 .476933);--surface:lab(99.563% -.656158 .190723);--surface-2:lab(93.5985% -2.29895 .667858);--ink:lab(9.68119% -3.97921 1.14982);--ink-2:lab(30.5884% -4.62346 1.33902);--ink-3:lab(42.1885% -4.61686 1.33817);--line:lab(88.4944% -2.29913 .66787);--line-strong:lab(76.9349% -3.28752 .954521);--dots:lab(80.4149% -3.2872 .954473);--accent-soft:lab(92.2838% -9.90188 2.86862);--ok-soft:lab(93.5137% -11.2521 4.4686);--edge:lab(47.9617% -3.95238 1.14636);--shadow:0 1px 2px lab(7.35267% -3.02959 .884002/.07), 0 4px 14px lab(7.35267% -3.02959 .884002/.07);--shadow-up:0 -6px 24px lab(7.35267% -3.02959 .884002/.1)}}@media (prefers-color-scheme:dark){:root{--bg:#0d100f;--surface:#171a19;--surface-2:#1e2321;--ink:#e8ecea;--ink-2:#b9bfbc;--ink-3:#939a97;--line:#2a2f2d;--line-strong:#464c49;--dots:#2a2f2d;--accent:#5dbb94;--accent-ink:#0d1a14;--accent-soft:#193429;--focus:#7fd0ad;--error:#ff8f80;--error-soft:#3a1e1b;--warning:#f0b35a;--warning-soft:#362a15;--ok:#6fcf9d;--ok-soft:#183124;--edge:#8d9491;--highlight:#f5a524;--kind-agent:#5dbb94;--kind-human-gate:#eb9a45;--kind-check:#6fa3e0;--kind-merge:#a88be0;--kind-stop:#9ba0a8;--loop-0:#a883f0;--loop-1:#3cc0d0;--loop-2:#f0874f;--loop-3:#ee6fa6;--shadow:0 1px 2px #0000004d, 0 4px 14px #00000040;--shadow-up:0 -6px 24px #0006;--mark:#64eab74d;--shadow-card:0 1px 2px #0000004d, 0 18px 40px -16px #000000b3}@supports (color:lab(0% 0 0)){:root{--bg:lab(4.49263% -1.31775 .384095);--surface:lab(9.03422% -2.31057 .66936);--surface-2:lab(13.1077% -2.64038 .764957);--ink:lab(93.121% -1.97011 .572383);--ink-2:lab(76.9079% -2.62874 .763452);--ink-3:lab(63.0148% -3.28898 .954711);--line:lab(18.9078% -2.63751 .764579);--line-strong:lab(31.6947% -3.29536 .955534);--dots:lab(18.9078% -2.63751 .764579);--accent-soft:lab(19.3333% -13.5044 3.86299);--ok-soft:lab(18.1729% -13.1214 5.17942);--edge:lab(60.6948% -3.28925 .954747)}}}:root[data-theme=meteor]{--bg:#f2f4f9;--surface:#fdfeff;--surface-2:#e9ecf3;--ink:#161d2b;--ink-2:#3b4253;--ink-3:#5d6371;--line:#dbdee5;--line-strong:#b9bec7;--dots:#c3c7d1;--accent:#2e6813;--accent-soft:#dfefc4;--focus:#357518;--edge:#6c727e;--night:#0e1526;--night-2:#172034;--night-line:#343d50;--night-ink:#eff2f7;--night-muted:#b1b7c5;--bright:#c3f344;--mark:#c3f3448c}@media (prefers-color-scheme:dark){:root[data-theme=meteor]{--bg:#0c0f17;--surface:#141924;--surface-2:#1c222d;--ink:#eef0f5;--ink-2:#c0c4cc;--ink-3:#989fab;--line:#2b303c;--line-strong:#464d5b;--dots:#2b303c;--accent:#bfeb56;--accent-ink:#0e1526;--accent-soft:#243014;--focus:#c3f344;--edge:#8c929f;--mark:#c3f34452}}@font-face{font-family:Atkinson Hyperlegible Next;src:url(/grooph/assets/fonts/atkinson-hyperlegible-next.v1.woff2)format("woff2");font-weight:400 800;font-style:normal;font-display:swap}@font-face{font-family:Atkinson Hyperlegible Next;src:url(/grooph/assets/fonts/atkinson-hyperlegible-next-italic.v1.woff2)format("woff2");font-weight:400 800;font-style:italic;font-display:swap}@font-face{font-family:Atkinson Hyperlegible Mono;src:url(/grooph/assets/fonts/atkinson-hyperlegible-mono.v1.woff2)format("woff2");font-weight:400 700;font-style:normal;font-display:swap}*,:before,:after{box-sizing:border-box}html,body,#root{height:100%}body{font:15px/1.45 var(--font);background:var(--bg);color:var(--ink);-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:100%;margin:0}button,input,select,textarea{font:inherit;color:inherit}button{cursor:pointer}a{color:var(--accent)}.mono{font-family:var(--mono);font-size:.92em}.muted{color:var(--ink-3)}.sr-only{clip:rect(0 0 0 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}::placeholder{color:var(--ink-3);opacity:1}:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.loop-c0{--loop:var(--loop-0)}.loop-c1{--loop:var(--loop-1)}.loop-c2{--loop:var(--loop-2)}.loop-c3{--loop:var(--loop-3)}.btn{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--surface);min-height:44px;color:var(--ink);white-space:nowrap;justify-content:center;align-items:center;gap:6px;padding:0 16px;font-size:15px;font-weight:550;text-decoration:none;display:inline-flex}.btn:active{background:var(--surface-2)}.btn:disabled{opacity:.45;cursor:default}.btn-primary{background:var(--accent);border-color:var(--accent);color:var(--accent-ink)}.btn-primary:active{background:var(--accent);filter:brightness(.92)}.btn-quiet{color:var(--ink-2);background:0 0;border-color:#0000}.btn-danger{background:var(--error);border-color:var(--error);color:var(--surface)}.btn-danger-text{color:var(--error)}.btn-small{min-height:44px;padding:0 12px;font-size:14px}.btn-large{min-height:52px;padding:0 20px;font-size:16px}.icon-btn{border-radius:var(--radius);width:44px;height:44px;color:var(--ink-2);background:0 0;border:0;flex:none;justify-content:center;align-items:center;display:inline-flex}.icon-btn:active{background:var(--surface-2)}.icon-btn[aria-pressed=true]{background:var(--accent-soft);color:var(--accent)}.icon-btn svg,.tool svg{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;width:22px;height:22px}.icon-btn svg circle{fill:currentColor;stroke:none}.link{color:var(--accent);text-underline-offset:3px;background:0 0;border:0;padding:0;font-weight:600;text-decoration:underline}.library{max-width:720px;padding:calc(20px + env(safe-area-inset-top)) 16px calc(28px + env(safe-area-inset-bottom));margin:0 auto}.library-head{margin-bottom:18px}.wordmark{letter-spacing:-.03em;color:var(--accent);margin:0;font-size:30px;font-weight:760}.library-head p{margin:2px 0 0}.library-actions{flex-wrap:wrap;gap:10px;margin-bottom:20px;display:flex}.library-actions .btn{flex:160px}.file-btn{position:relative}.file-btn input{opacity:0;cursor:pointer;width:100%;position:absolute;inset:0}.library-empty{text-align:center;padding:32px 0}.library-empty p{margin:4px 0}.graph-list{border-top:1px solid var(--line);margin:0;padding:0;list-style:none}.graph-row{border-bottom:1px solid var(--line);grid-template-columns:1fr auto;align-items:center;display:grid}.graph-open{text-align:left;background:0 0;border:0;flex-direction:column;gap:2px;min-width:0;min-height:64px;padding:12px 4px;display:flex}.graph-name{font-size:16px;font-weight:620}.graph-meta{color:var(--ink-3);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.row-actions,.rename{flex-wrap:wrap;grid-column:1/-1;gap:8px;padding:0 0 12px;display:flex}.rename{padding-top:10px}.rename .input{flex:180px}.library-foot{margin-top:28px;font-size:13px}.library-head{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.library-about{text-underline-offset:3px;align-items:center;min-height:44px;font-size:14px;font-weight:600;display:inline-flex}@media (min-width:900px){.library{max-width:1120px;padding-left:32px;padding-right:32px}.library .library-actions .btn{flex:none}.graph-list{grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:start;column-gap:32px;display:grid}}.land{-webkit-font-smoothing:antialiased;font-size:1.0625rem;line-height:1.6}.land h1,.land h2,.land h3{text-wrap:balance}.land p,.land li{text-wrap:pretty}.land .btn{border-width:1.5px;border-radius:12px;min-height:48px;padding:0 20px;font-size:1rem;font-weight:700}.land .btn-small{border-radius:10px;min-height:44px;padding:0 14px;font-size:.92rem}.land mark{background:linear-gradient(transparent 58%, var(--mark) 58%, var(--mark) 92%, transparent 92%);color:inherit;padding:0 .08em}.land-hero{background:var(--night);color:var(--night-ink);padding:clamp(36px,6vw,80px) 0 clamp(48px,7vw,96px);position:relative;overflow:hidden}.land-hero:before{content:"";background:radial-gradient(closest-side, color-mix(in oklch, var(--bright) 12%, transparent), transparent 70%);pointer-events:none;width:70vw;max-width:900px;height:70vw;max-height:900px;position:absolute;inset:-40% -10% auto auto}.land-hero .site-wrap{gap:clamp(28px,4vw,44px);display:grid;position:relative}.land-hero .muted{color:var(--night-muted)}.land-hero a,.land-hero .link-button{color:var(--night-ink)}.land-hero :focus-visible{outline-color:var(--bright)}.land-hero .btn{--hover:1.08;border-color:var(--night-line);color:var(--night-ink);background:#ffffff05;background:lab(100% 0 0/.02)}.land-hero .btn-primary{background:var(--bright);color:var(--night);border-color:#0000}.land-chip{border:1px solid var(--night-line);color:var(--night-muted);border-radius:999px;align-items:center;gap:8px;margin:0 0 20px;padding:6px 12px 6px 10px;font-size:.88rem;font-weight:600;display:inline-flex}.land-chip:before{content:"";background:var(--bright);width:8px;height:8px;box-shadow:0 0 0 4px color-mix(in oklch, var(--bright) 18%, transparent);border-radius:50%}.land-headline{letter-spacing:-.035em;margin:0;font-size:clamp(2.5rem,1.5rem + 4.2vw,4.25rem);font-weight:800;line-height:.98}.land-headline span{color:var(--bright);display:block}.land-lede{max-width:34em;color:var(--night-muted);margin:0;font-size:clamp(1.08rem,1rem + .35vw,1.28rem);line-height:1.55}.land-cta{flex-wrap:wrap;gap:12px;margin-top:28px;display:flex}.land-promise{color:var(--night-muted);flex-wrap:wrap;gap:8px 20px;margin:26px 0 0;padding:0;font-size:.95rem;list-style:none;display:flex}.land-promise li{align-items:center;gap:8px;display:inline-flex}.land-promise svg{width:16px;height:16px;color:var(--bright)}.land-figure{min-width:0;margin:0}.land-picture{box-shadow:var(--shadow-night);border:1px solid #ffffff1a;border:1px solid lab(100% 0 0/.1);border-radius:16px;overflow:hidden}.land-picture svg{width:100%;height:auto;display:block}.land-figure figcaption{margin-top:12px;font-size:.9rem}.land-section{padding:clamp(56px,8vw,112px) 0}.land-section+.land-section{border-top:1px solid var(--line)}.land-alt{background:var(--surface-2)}.land-h2{letter-spacing:-.03em;max-width:760px;margin:0 0 clamp(28px,4vw,48px);font-size:clamp(1.9rem,1.35rem + 2vw,3rem);font-weight:800;line-height:1.06}.land h3{letter-spacing:-.01em;margin:0;font-size:1.25rem;font-weight:750}.land-claims{gap:clamp(24px,4vw,48px);margin:0;padding:0;list-style:none;display:grid}.land-claims li{border-top:2px solid var(--accent);color:var(--ink-2);padding-top:14px}.land-claims strong{color:var(--ink);letter-spacing:-.01em;margin-bottom:6px;font-size:1.25rem;font-weight:750;display:block}.land-ways{gap:16px;display:grid}.land-way,.land-more-list li,.land-poster{border:1px solid var(--line);background:var(--surface);box-shadow:var(--shadow-card);border-radius:20px}.land-way{flex-direction:column;gap:12px;min-width:0;padding:clamp(20px,3vw,32px);display:flex}.land-way p,.land-more-list p,.land-poster p{color:var(--ink-2);margin:0}.land-way-actions{flex-wrap:wrap;gap:10px;margin-top:auto;display:flex}.copy-line{flex-wrap:wrap;align-items:center;gap:8px;margin-top:auto;display:flex}.copy-line-text{background:var(--surface-2);font-family:var(--mono);overflow-wrap:anywhere;-webkit-user-select:all;user-select:all;border-radius:8px;flex:100%;padding:10px 12px;font-size:13.5px;line-height:1.45}.copy-line-said{font-size:13px}.land-way .copy-line-text{background:var(--night);color:var(--night-ink);border-radius:12px;padding:14px 16px;font-size:.9rem;line-height:1.6}.land-device{margin-top:24px}.land-empty{text-align:left;padding:4px 0 12px}.land-device .library-actions{margin-bottom:12px}.land-strip-list{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:0;padding:0;list-style:none;display:grid}.land-tile{border:1px solid var(--line);background:var(--surface);height:100%;color:var(--ink);border-radius:14px;flex-direction:column;gap:8px;padding:10px 10px 12px;font-size:.95rem;font-weight:650;line-height:1.25;text-decoration:none;display:flex}.land-tile-glyph{background:var(--bg);border-radius:8px;height:64px;padding:6px}.land-poster h3{margin-bottom:8px}.land-poster{align-items:center;gap:20px;margin-top:clamp(28px,4vw,48px);padding:clamp(16px,3vw,28px);display:grid}.land-poster>a{border:1px solid var(--line);border-radius:12px;display:block;overflow:hidden}.land-poster img{aspect-ratio:3/2;object-fit:cover;object-position:top;width:100%;height:auto;display:block}.land-more-list{gap:16px;margin:0;padding:0;list-style:none;display:grid}.land-more-list li{align-content:start;gap:8px;padding:clamp(20px,3vw,28px);display:grid}.land-honest p{max-width:62ch;color:var(--ink-2);margin:0;font-size:1.25rem;line-height:1.5}.land .btn,.land-tile,.template-row{transition:border-color .16s ease-out,background-color .16s ease-out,transform .16s ease-out}@media (hover:hover){.land-hero .btn:hover{border-color:var(--night-muted);background:#ffffff12;background:lab(100% 0 0/.07)}.land-hero .btn-primary:hover{background:var(--bright);border-color:#0000}.land-tile:hover,.template-row:hover{border-color:var(--line-strong);transform:translateY(-1px)}}@media (min-width:640px){.land-strip-list{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:760px){.land-claims,.land-more-list{grid-template-columns:repeat(3,minmax(0,1fr))}.land-ways{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.land-poster{grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:clamp(24px,4vw,48px)}.land-device .library-actions .btn{flex:none}}@media (min-width:980px){.land-hero .site-wrap{grid-template:"title figure""copy figure"1fr/minmax(0,1fr) minmax(0,420px);align-items:start;column-gap:clamp(40px,6vw,88px)}.land-hero-title{grid-area:title;padding-top:24px}.land-hero-text{grid-area:copy}.land-figure{grid-area:figure}.land-strip-list{grid-template-columns:repeat(6,minmax(0,1fr))}}@media (prefers-reduced-motion:reduce){.land .btn,.land-tile,.template-row{transition:none}.land-tile:hover,.template-row:hover{transform:none}}.notice{border-radius:var(--radius);background:var(--warning-soft);color:var(--warning);padding:10px 12px;font-size:14px}.loading,.notfound{text-align:center;height:100%;color:var(--ink-2);place-content:center;gap:12px;display:grid}.editor{overscroll-behavior:none;grid-template-rows:auto auto minmax(0,1fr) auto;grid-template-columns:minmax(0,1fr);height:100dvh;display:grid;overflow:hidden}.topbar{padding:calc(6px + env(safe-area-inset-top)) 8px 6px 4px;background:var(--surface);border-bottom:1px solid var(--line);z-index:var(--z-chrome);align-items:center;gap:6px;display:flex}.title-btn{text-align:left;background:0 0;border:0;border-radius:8px;flex-direction:column;flex:1;justify-content:center;min-width:0;min-height:44px;padding:2px 6px;display:flex}.title-btn:active{background:var(--surface-2)}.title-name{text-overflow:ellipsis;white-space:nowrap;font-size:16px;font-weight:650;overflow:hidden}.title-sub{color:var(--ink-3);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.status{white-space:nowrap;border:1px solid #0000;border-radius:999px;flex:none;min-height:36px;padding:0 12px;font-size:13px;font-weight:650;position:relative}.status:before{content:"";position:absolute;inset:-4px 0}.status-ok{background:var(--ok-soft);color:var(--ok)}.status-warning{background:var(--warning-soft);color:var(--warning)}.status-error{background:var(--error-soft);color:var(--error)}.topbar-export{min-height:40px;padding:0 14px}.editor>.topbar{grid-row:1}.editor>.editor-notice{grid-row:2}.editor>.stage{grid-row:3}.editor>.sheet{grid-row:4}.stage{background:var(--bg);min-height:0;position:relative}.stage .react-flow{--xy-background-pattern-dots-color-default:var(--dots);--xy-edge-stroke-default:var(--edge);background:var(--bg)}.react-flow__attribution{opacity:.55;background:0 0;font-size:9px}.react-flow__attribution a{color:var(--ink-3)}.toolbar{left:50%;bottom:calc(12px + env(safe-area-inset-bottom));border:1px solid var(--line);background:var(--surface);box-shadow:var(--shadow);z-index:var(--z-toolbar);border-radius:16px;gap:2px;max-width:calc(100% - 16px);padding:4px;display:flex;position:absolute;transform:translate(-50%)}.has-sheet .toolbar{bottom:12px}.tool{min-width:60px;min-height:52px;color:var(--ink-2);background:0 0;border:0;border-radius:12px;flex-direction:column;justify-content:center;align-items:center;gap:2px;padding:4px 8px;font-size:12px;font-weight:600;display:flex}.tool:active{background:var(--surface-2)}.tool[aria-pressed=true]{background:var(--accent-soft);color:var(--accent)}.tool:disabled{opacity:.4;cursor:default}.loop-legend{z-index:var(--z-overlay);pointer-events:none;flex-wrap:wrap;gap:6px;display:flex;position:absolute;top:10px;left:10px;right:80px}.loop-pill{border:1px solid var(--line);background:var(--surface);min-height:34px;box-shadow:var(--shadow);color:var(--ink-2);pointer-events:auto;border-radius:999px;align-items:center;gap:7px;padding:0 12px;font-size:13px;font-weight:600;display:inline-flex;position:relative}.loop-pill:before{content:"";position:absolute;inset:-5px -2px}.loop-pill.is-on{border-color:var(--loop);color:var(--ink)}.loop-dot{background:var(--loop);border-radius:50%;flex:none;width:9px;height:9px;display:inline-block}.mode-banner{border:1px solid var(--accent);background:var(--accent-soft);color:var(--ink);z-index:var(--z-banner);box-shadow:var(--shadow);border-radius:12px;align-items:center;gap:10px;padding:8px 8px 8px 12px;font-size:14px;font-weight:550;display:flex;position:absolute;top:8px;left:8px;right:8px}.mode-banner span{flex:1}.empty-canvas{text-align:center;pointer-events:none;place-content:center;padding:0 32px 100px;display:grid;position:absolute;inset:0}.empty-canvas p{margin:3px 0}.sheet{background:var(--surface);border-top:1px solid var(--line);min-height:0;max-height:52dvh;box-shadow:var(--shadow-up);z-index:var(--z-chrome);border-radius:16px 16px 0 0;flex-direction:column;animation:.18s ease-out sheet-in;display:flex}@keyframes sheet-in{0%{opacity:0;transform:var(--sheet-from,translateY(14px))}}.sheet-expanded .sheet{max-height:86dvh}.sheet-expanded{grid-template-rows:auto auto minmax(72px,1fr) auto}.mode-active .sheet-body{display:none}.mode-active .sheet-toggle{visibility:hidden}.sheet-head{border-bottom:1px solid var(--line);align-items:center;gap:2px;padding:6px 6px 6px 16px;display:flex;position:relative}.sheet-head:before{content:"";background:var(--line-strong);border-radius:2px;width:36px;height:4px;margin-left:-18px;position:absolute;top:5px;left:50%}.sheet-title{flex:1;min-width:0;padding-top:6px}.sheet-title h2{margin:0;font-size:16px;font-weight:680}.sheet-sub{color:var(--ink-3);text-overflow:ellipsis;white-space:nowrap;font-size:13px;display:block;overflow:hidden}.sheet-body{overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding-bottom:env(safe-area-inset-bottom);overflow-y:auto}@media (min-width:900px){.editor{grid-template-rows:auto auto minmax(0,1fr);grid-template-columns:minmax(0,1fr) 400px}.editor>.editor-notice{grid-column:1}.editor:not(.has-sheet){grid-template-columns:minmax(0,1fr)}.topbar{grid-column:1/-1}.editor>.sheet,.sheet-expanded .sheet{border-top:0;border-left:1px solid var(--line);max-height:none;box-shadow:none;border-radius:0;grid-area:2/2/-1}.sheet-head:before,.sheet-toggle{display:none}}.inspector{padding:12px 16px 28px}.inspector-actions{flex-wrap:wrap;gap:8px;margin-bottom:14px;display:flex}.field{margin-bottom:14px}.field-label{color:var(--ink-2);margin-bottom:6px;font-size:13px;font-weight:620;display:block}.field-hint{color:var(--ink-3);margin-top:5px;font-size:13px}.level-list{margin:0;padding-left:1.1em}.level-list li+li{margin-top:2px}.level-list .is-on{color:var(--ink)}.input{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--surface);width:100%;min-height:44px;padding:10px 12px;font-size:16px;line-height:1.35;display:block}.input:focus{outline:2px solid var(--focus);outline-offset:-1px;border-color:#0000}.input.mono{font-size:15px}.textarea{resize:vertical;min-height:72px}.select{appearance:none;background-image:linear-gradient(45deg, transparent 50%, var(--ink-3) 50%), linear-gradient(135deg, var(--ink-3) 50%, transparent 50%);background-position:calc(100% - 18px),calc(100% - 13px);background-repeat:no-repeat;background-size:5px 5px;padding-right:36px}.segmented{background:var(--surface-2);border-radius:12px;flex-wrap:wrap;gap:3px;padding:3px;display:flex}.seg{min-height:40px;color:var(--ink-2);background:0 0;border:0;border-radius:9px;flex:auto;padding:0 10px;font-size:14px}.seg-on{background:var(--surface);color:var(--ink);box-shadow:var(--shadow);font-weight:650}.chips{flex-wrap:wrap;gap:6px;display:flex}.chip{border:1px solid var(--line-strong);background:var(--surface);min-height:44px;color:var(--ink-2);border-radius:999px;align-items:center;gap:6px;padding:0 12px;font-size:14px;display:inline-flex}.chip-on{border-color:var(--accent);background:var(--accent-soft);color:var(--ink);font-weight:600}.chip-small{font-size:13px}.inline-add{gap:8px;margin-top:8px;display:flex}.inline-add .input{flex:1;min-width:0}.toggle{cursor:pointer;align-items:center;gap:12px;min-height:44px;display:flex}.toggle input{opacity:0;width:1px;height:1px;position:absolute}.toggle-track{background:var(--line-strong);border-radius:14px;flex:none;width:46px;height:28px;transition:background .15s;position:relative}.toggle-track:after{content:"";background:var(--surface);border-radius:50%;width:22px;height:22px;transition:transform .15s;position:absolute;top:3px;left:3px;box-shadow:0 1px 2px #00000040}.toggle input:checked+.toggle-track{background:var(--accent)}.toggle input:checked+.toggle-track:after{transform:translate(18px)}.toggle input:focus-visible+.toggle-track{outline:2px solid var(--focus);outline-offset:2px}.toggle-label{font-weight:550}.section{border-top:1px solid var(--line);margin-top:8px;padding-top:14px}.section-head{justify-content:space-between;align-items:center;gap:8px;margin-bottom:10px;display:flex}.section-head h3{letter-spacing:.01em;margin:0;font-size:14px;font-weight:720}.card{border:1px solid var(--line);background:var(--surface-2);border-radius:12px;margin-bottom:10px;padding:12px 12px 4px}.card .input{background-color:var(--surface)}.card-head{align-items:flex-start;gap:10px;display:flex}.card-head .field{flex:1}.card-index{background:var(--surface);border:1px solid var(--line-strong);border-radius:50%;flex:none;place-content:center;width:28px;height:28px;margin-top:26px;font-size:13px;font-weight:700;display:grid}.card-actions{justify-content:flex-end;gap:4px;margin:-4px -6px 4px 0;display:flex}.more{border-top:1px solid var(--line);margin:4px 0 8px}.more>summary{min-height:48px;color:var(--ink-2);cursor:pointer;align-items:center;font-size:14px;font-weight:650;list-style:none;display:flex}.more>summary::-webkit-details-marker{display:none}.more>summary:before{content:"";border-bottom:2px solid;border-right:2px solid;width:7px;height:7px;margin:0 12px 0 4px;transition:transform .15s;transform:rotate(-45deg)}.more[open]>summary:before{transform:rotate(45deg)}.danger-zone{border-top:1px solid var(--line);margin-top:18px;padding-top:16px}.edge-route{margin:0 0 12px;font-size:16px}.pins .pin-row{align-items:center;gap:10px;display:flex}.pin-model{flex:1}.readonly{grid-template-columns:auto 1fr;gap:6px 14px;margin:0;font-size:14px;display:grid}.readonly dt{color:var(--ink-3)}.readonly dd{margin:0}.readonly-item{display:block}.empty{color:var(--ink-3);padding:16px}.add-menu{gap:10px;padding:12px 16px 24px;display:grid}@media (min-width:560px){.add-menu{grid-template-columns:1fr 1fr}}.add-kind{border:1px solid var(--line-strong);background:var(--surface);text-align:left;border-radius:12px;flex-direction:column;gap:2px;min-height:64px;padding:12px 14px;display:flex}.add-kind:active{background:var(--surface-2)}.add-kind-name{align-items:center;gap:9px;font-size:16px;font-weight:650;display:flex}.add-kind-hint{color:var(--ink-2);padding-left:19px;font-size:13.5px}.kind-mark{background:var(--kind);flex:none;width:10px;height:10px;display:inline-block}.kind-agent{border-radius:50%}.kind-human-gate{border-radius:1px;width:9px;height:9px;margin:0 .5px;transform:rotate(45deg)}.kind-check{border-radius:2px}.kind-merge{clip-path:polygon(50% 0,100% 100%,0 100%)}.kind-stop{clip-path:polygon(30% 0,70% 0,100% 30%,100% 70%,70% 100%,30% 100%,0 70%,0 30%)}.add-agent,.gnode-agent,.kind-agent{--kind:var(--kind-agent)}.add-human-gate,.gnode-human-gate,.kind-human-gate{--kind:var(--kind-human-gate)}.add-check,.gnode-check,.kind-check{--kind:var(--kind-check)}.gnode-merge,.kind-merge{--kind:var(--kind-merge)}.add-stop,.gnode-stop,.kind-stop{--kind:var(--kind-stop)}.all-clear{background:var(--ok-soft);color:var(--ok);border-radius:12px;margin:4px 0;padding:12px;font-weight:600}.issue-summary{color:var(--ink-2);margin:0 0 12px;font-size:14px}.issues{margin:0;padding:0;list-style:none}.issues li{margin-bottom:12px}.issue{border:1px solid var(--line);background:var(--surface);text-align:left;border-radius:10px;flex-direction:column;gap:4px;width:100%;padding:10px 12px;display:flex}.issue-error{--sev:var(--error)}.issue-warning{--sev:var(--warning)}.issue-active{background:var(--surface-2);outline:2px solid var(--highlight);outline-offset:-1px}.issue-head{align-items:baseline;gap:8px;display:flex}.issue-severity{color:var(--sev);align-items:center;gap:6px;font-size:13px;font-weight:700;display:inline-flex}.issue-severity:before{content:"";background:var(--sev);width:9px;height:9px}.issue-error .issue-severity:before{border-radius:50%}.issue-warning .issue-severity:before{clip-path:polygon(50% 0,100% 100%,0 100%)}.issue-code{color:var(--ink-2);font-size:12.5px}.issue-message{font-size:14px}.issue-at{flex-wrap:wrap;gap:6px;margin-top:6px;display:flex}.refusal{border:1px solid var(--error);background:var(--error-soft);border-radius:12px;margin-bottom:14px;padding:12px}.refusal p{margin:0 0 6px}.refusal .refusal-hint{font-weight:600}.warnings{background:var(--warning-soft);border-radius:12px;margin:12px 0;padding:10px 12px}.warnings p{color:var(--warning);margin:0 0 6px;font-weight:600}.issue-lines{font-family:var(--mono);white-space:pre-wrap;word-break:break-word;margin:8px 0;font-size:12px}.export-actions{flex-direction:column;gap:8px;display:flex}.files-title{margin:18px 0 8px;font-size:14px;font-weight:720}.files{border-top:1px solid var(--line);margin:0;padding:0;list-style:none}.files li{border-bottom:1px solid var(--line)}.file{text-align:left;background:0 0;border:0;justify-content:space-between;align-items:center;gap:10px;width:100%;min-height:44px;padding:8px 2px;display:flex}.file-path{word-break:break-all;min-width:0;font-size:13px}.file-size{color:var(--ink-3);flex:none;font-size:12px}.file-body{background:var(--surface-2);max-height:50dvh;font-family:var(--mono);white-space:pre-wrap;word-break:break-word;border-radius:8px;margin:0 0 10px;padding:10px;font-size:12px;overflow:auto}.gnode{border:1px solid var(--line-strong);background:var(--surface);width:200px;min-height:72px;box-shadow:var(--shadow);outline-offset:7px;border-radius:10px;outline-color:#0000;padding:9px 12px 10px;transition:opacity .15s,outline-color .16s,outline-offset .16s ease-out;position:relative}.gnode-stop{border-radius:22px;padding-left:16px}.gnode-kind{color:var(--kind);align-items:center;gap:6px;font-size:12px;font-weight:650;display:flex}.gnode-name{overflow-wrap:anywhere;margin-top:1px;font-size:15px;font-weight:650;line-height:1.25}.gnode-sub{color:var(--ink-2);text-overflow:ellipsis;white-space:nowrap;margin-top:2px;font-size:12.5px;overflow:hidden}.gnode-loops{gap:4px;display:flex;position:absolute;top:9px;right:10px}.gnode-issue{border:2px solid var(--surface);border-radius:50%;width:14px;height:14px;position:absolute;top:-6px;right:-6px}.issue-dot-error{background:var(--error)}.issue-dot-warning{background:var(--warning)}.gnode.in-loop{outline:2px solid var(--loop);outline-offset:2px}.gnode.is-selected{outline:2.5px solid var(--accent);outline-offset:2px}.gnode.is-highlighted{outline:3px solid var(--highlight);outline-offset:3px}.gnode.is-source{outline:2.5px dashed var(--accent);outline-offset:3px;animation:1.2s ease-in-out infinite pulse}.gnode.is-picked{outline:3px solid var(--loop);outline-offset:2px}.gnode.is-unpicked{opacity:.55}@keyframes pulse{50%{outline-offset:6px}}@media (prefers-reduced-motion:reduce){.gnode.is-source,.sheet{animation:none}.gnode{transition:none}}.ghandle{opacity:0;pointer-events:none}.react-flow__node{cursor:pointer}.react-flow__node:focus-visible{outline:0}.react-flow__node:focus-visible .gnode{outline:2px solid var(--focus);outline-offset:5px}.react-flow__node.dragging{cursor:grabbing}.gedge{color:var(--edge)}.gedge-hit{pointer-events:stroke;cursor:pointer}.gedge-line{stroke:currentColor;stroke-width:1.7px}.gedge-arrow{fill:currentColor}.gedge.is-back{color:var(--loop)}.gedge.is-back .gedge-line{stroke-dasharray:7 5}.gedge.has-error{color:var(--error)}.gedge.is-selected{color:var(--accent)}.gedge.is-selected .gedge-line,.gedge.is-highlighted .gedge-line,.gedge.is-picked .gedge-line{stroke-width:3px}.gedge.is-highlighted{color:var(--highlight)}.gedge.is-picked{color:var(--loop)}.gedge.is-unpicked{opacity:.4}.react-flow__viewport-portal{z-index:1;pointer-events:none}.gedge-label{border:1px solid var(--line-strong);background:var(--surface);min-height:28px;color:var(--ink-2);pointer-events:all;white-space:nowrap;border-radius:999px;align-items:center;gap:5px;padding:0 10px;font-size:12px;font-weight:650;display:inline-flex;position:absolute}.gedge-label:before{content:"";position:absolute;inset:-10px -6px}.gedge-label.is-quiet{border-width:2px;border-color:var(--edge);width:14px;height:14px;min-height:0;padding:0}.gedge-label.is-quiet:before{inset:-15px}.gedge-label.is-back{border-color:var(--loop);color:var(--loop)}.gedge-label.is-selected{background:var(--accent);border-color:var(--accent);color:var(--accent-ink)}.gedge-label.is-picked{background:var(--loop);border-color:var(--loop);color:var(--surface)}.gedge-approval{background:var(--warning-soft);color:var(--warning);border-radius:999px;padding:1px 6px;font-size:11px;font-weight:700}.viewer .stage .react-flow__node{cursor:pointer}.viewer-bar{left:12px;right:12px;bottom:calc(12px + env(safe-area-inset-bottom));border:1px solid var(--line);background:var(--surface);box-shadow:var(--shadow);z-index:var(--z-toolbar);border-radius:14px;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px 12px;padding:8px 8px 8px 14px;display:flex;position:absolute}.view-fit,.canvas-size{bottom:calc(12px + env(safe-area-inset-bottom));z-index:var(--z-overlay);border:1px solid var(--line);background:var(--surface);min-height:44px;box-shadow:var(--shadow);color:var(--ink-2);pointer-events:all;border-radius:999px;align-items:center;gap:6px;padding:0 14px;font-size:13px;font-weight:600;display:inline-flex;position:absolute}.view-fit{right:10px}.canvas-size{left:10px}.view-fit svg,.canvas-size svg{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;width:18px;height:18px}.view-fit:active,.canvas-size:active{background:var(--surface-2)}.viewer .view-fit{bottom:calc(108px + env(safe-area-inset-bottom))}@media (max-width:899px){.viewer.has-sheet .view-fit{bottom:12px}}.viewer-note{color:var(--ink-3);flex:160px;font-size:13px}.viewer-saved{flex:1;margin:0;padding:6px 0;font-size:14px}.has-sheet .viewer-bar{display:none}@media (min-width:900px){.has-sheet .viewer-bar{display:flex}}.readonly-row{display:contents}.readonly dd .prose,.readonly dd .plain-list{margin:0}.prose{white-space:pre-wrap;overflow-wrap:anywhere}.plain-list{margin:0;padding-left:18px}.link-problem{max-width:560px;padding:calc(40px + env(safe-area-inset-top)) 20px 32px;margin:0 auto}.link-problem h1{letter-spacing:-.01em;margin:0 0 10px;font-size:22px;font-weight:700}.link-problem p{margin:0 0 14px}.link-problem .btn{margin-top:8px}.compare{--gutter:16px;flex-direction:column;min-height:100dvh;display:flex}.compare-top{padding:calc(8px + env(safe-area-inset-top)) var(--gutter) 2px 4px;align-items:center;gap:6px;display:flex}.compare-heading{flex:1;min-width:0}.overline{letter-spacing:.02em;color:var(--ink-3);text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:650;display:block;overflow:hidden}.compare-heading h1{letter-spacing:-.01em;margin:0;font-size:19px;font-weight:720;line-height:1.25}.compare-brief{padding:4px var(--gutter) 10px;color:var(--ink-2);font-size:14px}.compare-brief>p{margin:0}.compare-brief .is-clamped{-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.compare-saved{color:var(--ok);margin:8px 0 0;font-weight:600}.cards{padding:4px var(--gutter) 16px;scroll-snap-type:x mandatory;scroll-padding-inline:var(--gutter);overscroll-behavior-x:contain;scrollbar-width:none;align-items:flex-start;gap:10px;display:flex;overflow-x:auto}.cards::-webkit-scrollbar{display:none}.ccard{scroll-snap-align:center;scroll-snap-stop:always;border:1px solid var(--line);background:var(--surface);max-width:460px;box-shadow:var(--shadow);border-radius:16px;flex-direction:column;flex:0 0 calc(100% - 22px);gap:12px;min-width:0;padding:14px 14px 16px;display:flex}.cards>.ccard:only-child{flex-basis:100%}.ccard.is-recommended{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent), var(--shadow)}.ccard-head{flex-direction:column;gap:4px;display:flex}.ccard-title{align-items:center;gap:8px;display:flex}.ccard-title h2{letter-spacing:-.02em;overflow-wrap:anywhere;margin:0;font-size:23px;font-weight:760;line-height:1.15}.ccard-index{font-variant-numeric:tabular-nums;margin-left:auto;font-size:12px}.badge{background:var(--accent);color:var(--accent-ink);border-radius:999px;flex:none;padding:3px 9px;font-size:12px;font-weight:700}.ccard-why{background:var(--accent-soft);border-radius:10px;margin:0;padding:7px 10px;font-size:13.5px;line-height:1.4}.ccard-based{font-size:12.5px}.credits{color:var(--ink-3);margin:0;padding:0;font-size:12.5px;line-height:1.4;list-style:none}.credits li+li{margin-top:2px}.ccard-profile{flex-wrap:wrap;align-content:flex-start;align-items:flex-start;gap:6px;margin:0;padding:0;list-style:none;display:flex}.pchip{border:1px solid var(--line-strong);color:var(--ink-2);border-radius:999px;align-items:center;gap:6px;padding:4px 10px 4px 8px;font-size:13px;font-weight:600;display:inline-flex}.meter{align-items:flex-end;gap:2px;height:11px;display:inline-flex}.meter i{background:var(--line-strong);border-radius:1px;width:3px}.meter i:first-child{height:5px}.meter i:nth-child(2){height:8px}.meter i:nth-child(3){height:11px}.meter[data-level="1"] i:first-child,.meter[data-level="2"] i:nth-child(-n+2),.meter[data-level="3"] i{background:var(--accent)}.ccard-shape p{margin:0}.shape-line{font-variant-numeric:tabular-nums;font-size:14px;font-weight:650}.tier-line{font-size:13px}.ccard-rationale{margin:0;font-size:14.5px;line-height:1.5}.ccard-status{flex-wrap:wrap;align-items:baseline;gap:6px 8px;font-size:13px;display:flex}.ccard-status .status{min-height:26px;padding:3px 10px}.ccard-status .status:before{content:none}.ccard-issues{color:var(--ink-2);flex-basis:100%;margin:0;padding-left:18px}.ccard-issues .mono{color:var(--warning);font-size:11.5px}.ccard-list h3{letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3);margin:0 0 4px;font-size:12px;font-weight:700}.ccard-list p{margin:0;font-size:14px}.pros,.cons{margin:0;padding:0;font-size:14px;list-style:none}.pros li,.cons li{padding-left:20px;position:relative}.pros li+li,.cons li+li{margin-top:4px}.pros li:before,.cons li:before{font-weight:800;position:absolute;top:0;left:2px}.pros li:before{content:"+";color:var(--ok)}.cons li:before{content:"−";color:var(--warning)}.ccard-canvas{flex-direction:column;align-items:flex-start;gap:8px;display:flex}.ccard-actions{display:none}.compare-bar{padding:8px var(--gutter) calc(10px + env(safe-area-inset-bottom));border-top:1px solid var(--line);background:var(--surface);box-shadow:var(--shadow-up);z-index:var(--z-chrome);margin-top:auto;position:sticky;bottom:0}.pager{align-items:center;gap:2px;margin-bottom:6px;display:flex}.pager-dot{background:0 0;border:0;width:28px;height:28px;position:relative}.pager-dot:after{content:"";background:var(--line-strong);border-radius:50%;transition:transform .15s;position:absolute;inset:10px}.pager-dot[aria-current=true]:after{background:var(--accent);transform:scale(1.35)}.pager-count{color:var(--ink-3);font-variant-numeric:tabular-nums;margin-left:6px;font-size:13px}.actions-row{gap:8px;display:flex}.actions-row .btn{flex:1 1 0;min-width:0;padding:0 12px}.actions-row .btn-primary{text-overflow:ellipsis;overflow:hidden}.actions-note{color:var(--ink-2);overflow-wrap:anywhere;margin:6px 0 0;font-size:13px}.selectable{-webkit-user-select:all;user-select:all}@media (min-width:900px){.compare{--gutter:28px;max-width:1400px;margin:0 auto}.compare-top{padding-top:calc(18px + env(safe-area-inset-top))}.compare-heading h1{font-size:24px}.compare-brief{max-width:78ch;font-size:15px}.compare-brief .is-clamped{-webkit-line-clamp:unset;line-clamp:none;display:block}.compare-brief>.link{display:none}.cards{grid-template-columns:repeat(var(--cards), minmax(0, 1fr));grid-template-rows:repeat(9,auto);gap:0 16px;padding-bottom:32px;display:grid;overflow:visible}.ccard{grid-row:span 9;grid-template-rows:subgrid;gap:0;max-width:none;padding:18px 18px 20px;display:grid}.ccard>*{padding-bottom:14px}.ccard>.ccard-list{border-top:1px solid var(--line);padding-top:12px}.ccard-actions{padding-bottom:0;display:block}.compare-bar{display:none}}.screen-head{align-items:flex-start;gap:6px;margin:0 0 14px -12px;display:flex}.screen-head h1{letter-spacing:-.02em;margin:4px 0 0;font-size:24px;font-weight:740;line-height:1.2}.screen-head p{margin:2px 0 0}.screen-head .overline{white-space:normal;margin-top:4px}.list-title{letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3);margin:22px 0 8px;padding:0;font-size:13px;font-weight:720}.template-list,.insert-list,.slot-list,.id-map{margin:0;padding:0;list-style:none}.template-list{gap:10px;display:grid}@media (min-width:640px){.template-list{grid-template-columns:1fr 1fr}}.template-list>li{display:flex}.template-list>li>.template-row{flex:auto}@media (min-width:900px){.template-list{grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}.template-list .template-row{flex-direction:column;align-items:stretch;gap:10px;padding:12px}.template-list .template-glyph,.template-list .template-glyph.is-long{width:100%;height:84px}}.template-row,.insert-row{border:1px solid var(--line);background:var(--surface);width:100%;min-height:64px;color:var(--ink);text-align:left;box-shadow:var(--shadow);border-radius:12px;flex-direction:column;gap:6px;padding:12px 14px;text-decoration:none;display:flex}.template-row{flex-direction:row;align-items:flex-start;gap:12px;padding:10px 12px 10px 10px}.template-row:active,.insert-row:active{background:var(--surface-2)}.template-text{flex-direction:column;flex:auto;gap:3px;min-width:0;display:flex}.template-title{flex-wrap:wrap;align-items:center;gap:8px;font-size:16px;font-weight:660;line-height:1.25;display:flex}.template-when,.template-not,.insert-summary{color:var(--ink-2);font-size:14px;line-height:1.4}.template-row .template-when{-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;font-size:13.5px;line-height:1.35;display:-webkit-box;overflow:hidden}.template-label{color:var(--ink);font-weight:700}.template-not .template-label{color:var(--warning)}.template-profile{margin-top:2px}.template-meters{gap:12px;margin:2px 0 0;padding:0;list-style:none;display:flex}.template-meter{letter-spacing:.02em;color:var(--ink-3);align-items:center;gap:5px;font-size:11.5px;font-weight:600;display:inline-flex}.glyph{display:block}.glyph svg{width:100%;height:100%;display:block}.template-glyph{background:var(--bg);border-radius:8px;flex:none;width:92px;height:58px;padding:4px}.graph-glyph{background:var(--surface-2);border-radius:6px;flex:none;width:72px;height:44px;padding:3px}.graph-open{flex-direction:row;align-items:center;gap:12px}.graph-text{flex-direction:column;gap:2px;min-width:0;display:flex}.template-row.has-long-glyph,.graph-open.has-long-glyph{flex-direction:column;align-items:stretch;gap:8px}.template-glyph.is-long,.graph-glyph.is-long{width:100%;height:64px}.ccard-glyph{border:1px solid var(--line);background:var(--bg);border-radius:12px;width:100%;max-height:180px;padding:10px 12px}.ccard-glyph svg{max-height:160px;margin:0 auto}.glyph-card{margin:0 0 12px}.glyph-large{border:1px solid var(--line);background:var(--bg);border-radius:12px;width:100%;max-height:200px;padding:12px}.glyph-large svg{max-height:176px;margin:0 auto}.glyph-actions{flex-wrap:wrap;gap:8px;margin-top:8px;display:flex}.glyph-note{margin-top:6px}.browse{gap:8px;margin-bottom:4px;display:grid}.browse-row{align-items:center;gap:8px;display:flex}.browse-q{flex:auto;min-width:0}.browse-toggle{flex:none;gap:6px}.browse-toggle.is-on{border-color:var(--accent);color:var(--accent)}.browse-count{background:var(--accent);min-width:20px;height:20px;color:var(--accent-ink);border-radius:999px;justify-content:center;align-items:center;padding:0 6px;font-size:12px;font-weight:700;display:inline-flex}.browse-meta{min-height:36px;font-size:13.5px}.browse-shown{font-variant-numeric:tabular-nums;flex:auto}.browse-sort{align-items:center;gap:6px;display:inline-flex}.browse-sort .input{width:auto;min-height:36px;padding:4px 8px;font-size:14px}.browse-clear{font-size:13.5px}.browse-filters{border:1px solid var(--line);background:var(--surface);border-radius:12px;gap:10px;padding:10px 12px 12px;display:grid}.browse-group{gap:6px;display:grid}.browse-group-label{letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3);font-size:12px;font-weight:720}.browse-chips .chip{min-height:40px}.chip-more{color:var(--accent);border-style:dashed}.browse-none,.templates .list-title{margin-top:16px}.templates-hint{margin-top:20px;font-size:14px}.badge-quiet{background:var(--surface-2);color:var(--ink-2);font-weight:650}.template-details .ccard-profile{margin:10px 0 6px}.template-details .credits{margin:2px 0 12px}.template-use{width:100%;margin:4px 0 6px}.slot-list{gap:8px;display:grid}.slot-list li{background:var(--surface-2);border-radius:10px;flex-direction:column;gap:2px;padding:9px 12px;display:flex}.slot-ask{font-weight:600}.slot-key{color:var(--accent);font-size:13px}.slot-example{color:var(--ink-2);font-size:13.5px}.use-form{gap:4px;display:grid}.use-form .slots{border:0;min-width:0;margin:8px 0 0;padding:0}.use-form .slots .list-title{margin-top:8px}.use-actions{padding:12px 16px calc(12px + env(safe-area-inset-bottom));background:var(--bg);border-top:1px solid var(--line);gap:4px;margin:12px -16px 0;display:grid;position:sticky;bottom:0}.insert-list{gap:8px;margin-top:10px;display:grid}.insert-row{box-shadow:none;border-color:var(--line-strong)}.insert-chosen{margin:4px 0 12px}.id-map{gap:2px;margin-bottom:10px;font-size:14px;display:grid}.id-map li{color:var(--ink-3);padding:4px 0}.id-map li.is-renamed{color:var(--ink);font-weight:650}.add-template{border-style:dashed}.kind-template{--kind:var(--accent);width:10px;height:10px;box-shadow:3px 3px 0 -1px var(--surface), 3px 3px 0 0 var(--accent);border-radius:2px}.title-btn.is-highlighted{box-shadow:inset 0 0 0 2px var(--highlight)}.persist-notice,.offer,.rename-warning{border:1px solid var(--line-strong);background:var(--surface);border-radius:12px;flex-wrap:wrap;align-items:center;gap:8px 12px;margin:0 0 14px;padding:10px 12px;font-size:14px;display:flex}.persist-notice p,.offer p,.rename-warning p{flex:220px;margin:0}.persist-notice.is-granted{border-color:var(--ok);background:var(--ok-soft)}.persist-notice.is-denied,.rename-warning{border-color:var(--warning);background:var(--warning-soft)}.offer{border-color:var(--accent);background:var(--accent-soft)}.offer-actions{flex-wrap:wrap;gap:8px;display:flex}.rename{flex-direction:column}.rename-row{flex-wrap:wrap;gap:8px;display:flex}.rename-row .input{flex:180px}.rename-warning{margin:0}.inspector .rename-warning{margin:0 0 12px}.editor-notice{margin:6px 8px 0;padding:6px 6px 6px 12px;font-size:13.5px;line-height:1.35}.toast{left:50%;bottom:calc(84px + env(safe-area-inset-bottom));background:var(--ink);max-width:calc(100% - 24px);color:var(--bg);box-shadow:var(--shadow);z-index:var(--z-banner);border-radius:12px;align-items:center;gap:4px;padding:4px 4px 4px 16px;font-size:14px;font-weight:560;animation:.16s ease-out toast-in;display:flex;position:absolute;transform:translate(-50%)}.toast span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.toast-action{min-width:64px;min-height:44px;color:inherit;text-underline-offset:3px;background:0 0;border:0;border-radius:9px;flex:none;padding:0 14px;font-weight:750;text-decoration:underline}.toast-action:active{background:color-mix(in oklch, var(--bg) 18%, transparent)}@keyframes toast-in{0%{opacity:0;transform:translate(-50%,8px)}}@media (max-width:899px){.sheet-expanded .toolbar,.sheet-expanded .loop-legend{display:none}.has-sheet .stage{flex-direction:column;display:flex}.has-sheet .stage>.react-flow{flex:1 1 0;height:auto;min-height:0}.has-sheet .toolbar{max-width:none;box-shadow:none;border-width:1px 0 0;border-radius:0;flex:none;justify-content:space-around;padding:2px 4px;position:static;transform:none}.has-sheet .toolbar .tool{flex:1 1 0;min-width:0;min-height:48px}.has-sheet .toast{bottom:62px}}@media (prefers-reduced-motion:reduce){.toast{animation:none}}.run-view{overscroll-behavior:none;grid-template-rows:auto minmax(220px,42dvh) minmax(0,1fr);grid-template-columns:minmax(0,1fr);height:100dvh;display:grid;overflow:hidden}.run-view>.topbar{grid-row:1}.run-view>.stage{border-bottom:1px solid var(--line);grid-row:2}.run-panel{background:var(--surface);flex-direction:column;grid-row:3;min-height:0;display:flex}@media (min-width:900px){.run-view{grid-template-rows:auto minmax(0,1fr);grid-template-columns:minmax(0,1fr) 440px}.run-view>.topbar{grid-column:1/-1}.run-view>.stage{border-bottom:0;grid-column:1}.run-panel{border-left:1px solid var(--line);grid-area:2/2}}@media (max-width:899px){.run-view.is-tall{grid-template-rows:auto minmax(220px,76dvh) minmax(0,1fr)}}@media (min-width:900px){.canvas-size{display:none}}.run-title:active{background:0 0}.run-view .stage .react-flow__node{cursor:pointer}.run-view .loop-legend{right:10px}.run-status{align-items:center;gap:5px;display:inline-flex}.run-status-running{background:var(--accent-soft);color:var(--accent)}.run-status-ended{background:var(--surface-2);color:var(--ink-2)}.state-icon{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;flex:none;width:14px;height:14px}.state-icon .fill{fill:currentColor;stroke:none}.run-badge{background:var(--surface-2);color:var(--ink-2);border-radius:999px;align-items:center;gap:4px;margin-top:7px;padding:2px 9px 2px 6px;font-size:12px;font-weight:650;display:inline-flex}.run-badge-running{background:var(--accent-soft);color:var(--accent)}.run-badge-passed{background:var(--ok-soft);color:var(--ok)}.run-badge-failed{background:var(--error-soft);color:var(--error)}.run-badge-halted{background:var(--warning-soft);color:var(--warning)}.run-count{font-variant-numeric:tabular-nums;opacity:.85}.gnode.run-pending{background:var(--bg);box-shadow:none;border-style:dashed}.gnode.run-running{border-color:var(--accent)}.gnode.run-passed{border-color:var(--ok)}.gnode.run-failed{border-color:var(--error)}.gnode.run-halted{border-color:var(--warning);border-width:2px}.gnode.run-running:after{content:"";border:2px solid var(--accent);pointer-events:none;border-radius:15px;animation:1.6s ease-out infinite run-pulse;position:absolute;inset:-7px}.gnode-stop.run-running:after{border-radius:27px}@keyframes run-pulse{0%{opacity:.9;transform:scale(.99)}75%,to{opacity:0;transform:scale(1.05)}}@media (prefers-reduced-motion:reduce){.gnode.run-running:after{opacity:1;animation:none;transform:none}}.loop-round{color:var(--ink-3);font-weight:600}.loop-stop{color:var(--ink-3);margin-left:-3px;font-weight:500}.run-facts{flex:none;padding:8px 14px 6px}.run-line{color:var(--ink-3);font-variant-numeric:tabular-nums;margin:0;font-size:13px}.run-origin{color:var(--ink-2);flex-wrap:wrap;align-items:center;gap:4px 10px;margin:4px 0 0;font-size:13px;display:flex}.run-origin>span:first-child{flex:180px}.run-origin .btn{min-height:44px}.run-origin.is-problem{color:var(--warning)}.live-dot{background:var(--ink-3);border-radius:50%;width:9px;height:9px;flex:none!important}.live-dot.is-on{background:var(--ok);animation:2s ease-in-out infinite live-blink}@keyframes live-blink{50%{opacity:.35}}@media (prefers-reduced-motion:reduce){.live-dot.is-on{animation:none}}.run-tabs{border-bottom:1px solid var(--line);scrollbar-width:none;flex:none;gap:2px;padding:0 8px;display:flex;overflow-x:auto}.run-tab{min-height:44px;color:var(--ink-3);white-space:nowrap;background:0 0;border:0;border-bottom:2.5px solid #0000;align-items:center;gap:6px;padding:0 10px;font-size:14px;font-weight:620;display:inline-flex}.run-tab.is-on{border-bottom-color:var(--accent);color:var(--ink)}.run-tab-count{background:var(--surface-2);font-variant-numeric:tabular-nums;text-align:center;border-radius:999px;min-width:20px;padding:0 6px;font-size:12px}.run-body{overscroll-behavior:contain;min-height:0;padding:4px 14px calc(24px + env(safe-area-inset-bottom));flex:1;overflow-y:auto}.run-intro{color:var(--ink-3);margin:8px 0 10px;font-size:13px}.run-log{font-family:var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;margin:8px 0;font-size:12.5px;line-height:1.5}.tl-list{margin:0;padding:0;list-style:none}.tl-item{border-top:1px solid var(--line)}.tl-item.is-on{background:var(--surface-2);margin:0 -14px;padding:0 14px}.tl-note{text-align:left;background:0 0;border:0;flex-direction:column;gap:3px;width:100%;min-height:48px;padding:10px 0;display:flex}.tl-head{flex-wrap:wrap;align-items:center;gap:4px 8px;font-size:14px;display:flex}.tl-where{font-weight:650}.tl-round,.tl-stop{color:var(--ink-3);font-size:12.5px}.tl-dot{flex:none;justify-content:center;align-items:center;width:14px;height:14px;display:inline-flex}.tl-dot:after{content:"";background:var(--ink-3);border-radius:50%;width:5px;height:5px}.tl-note .state-icon.state-passed{color:var(--ok)}.tl-note .state-icon.state-failed{color:var(--error)}.tl-note .state-icon.state-halted{color:var(--warning)}.tl-note .state-icon.state-running{color:var(--accent)}.tl-outcome{background:var(--surface-2);color:var(--ink-2);border-radius:999px;padding:1px 8px;font-size:12px;font-weight:650}.outcome-passed{background:var(--ok-soft);color:var(--ok)}.outcome-failed{background:var(--error-soft);color:var(--error)}.outcome-halted{background:var(--warning-soft);color:var(--warning)}.outcome-running{background:var(--accent-soft);color:var(--accent)}.tl-id{color:var(--ink-3);margin-left:auto;font-size:12px}.tl-marks{gap:6px;display:flex}.mark{letter-spacing:.02em;border:1px solid;border-radius:999px;padding:1px 8px;font-size:11.5px;font-weight:700}.mark-amendment{color:var(--kind-merge)}.mark-proposal{color:var(--kind-check)}.tl-text{color:var(--ink-2);overflow-wrap:anywhere;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:13.5px;display:-webkit-box;overflow:hidden}.tl-item.is-on .tl-text{-webkit-line-clamp:unset;display:block}.tl-details{padding:0 0 12px 22px}.tl-details .readonly{margin:0 0 8px}.tl-actions{flex-wrap:wrap;gap:6px;display:flex}.tl-pinned{margin:0;font-size:14px}.tl-unread{margin-top:14px}.tl-unread li{color:var(--ink-2);font-size:13px}.change-list,.proposal-list,.op-list{margin:0;padding:0;list-style:none}.change,.proposal{border-top:1px solid var(--line);padding:12px 0}.change-line,.proposal-summary{overflow-wrap:anywhere;margin:0 0 6px;font-size:15px;font-weight:650}.field-change{margin:6px 0}.field-key{color:var(--ink-3);margin-bottom:3px;font-size:12px;display:block}.field-diff{margin:0;padding:0;font-size:13px;list-style:none}.field-diff li,div.field-diff{overflow-wrap:anywhere;border-radius:6px;grid-template-columns:16px 1fr;gap:4px;padding:4px 6px;display:grid}.field-diff li+li,div.field-diff+div.field-diff{margin-top:3px}.field-diff .del,div.field-diff.del{background:var(--error-soft)}.field-diff .ins,div.field-diff.ins{background:var(--ok-soft)}.field-diff del{color:var(--ink-2);-webkit-text-decoration-color:var(--error);text-decoration-color:var(--error)}.field-diff ins{color:var(--ink);text-decoration:none}.sign{color:var(--ink-3);font-weight:700}.field-kept{color:var(--ink-3);margin:3px 0 0;font-size:12px}.change-why{color:var(--ink-2);margin:8px 0 0;font-size:13px}.change-why .link{min-height:0;font-size:12.5px}.change-why-label{font-weight:650}.change-why.is-unexplained{background:var(--warning-soft);color:var(--warning);border-radius:8px;padding:6px 8px;font-weight:600}.adopt{border-top:1px solid var(--line-strong);margin-top:14px;padding-top:12px}.adopt .actions-row{gap:8px;display:flex}.adopt-done{background:var(--ok-soft);border-radius:10px;margin:0;padding:10px 12px;font-size:14px}.proposal-meta{color:var(--ink-3);margin:0 0 6px;font-size:13px}.proposal-text{color:var(--ink-2);margin:0 0 8px;font-size:13.5px}.op-list{margin:6px 0}.op-list li{background:var(--surface-2);overflow-wrap:anywhere;border-radius:6px;padding:4px 8px;font-size:12.5px}.op-list li+li{margin-top:3px}.proposal .more{margin:4px 0 8px}.proposal-other .field-hint{margin:6px 0}.proposal .refusal-hint{background:var(--warning-soft);color:var(--warning);border-radius:8px;margin:8px 0 0;padding:8px 10px;font-size:13.5px;font-weight:600}.run-rows{border-left:2px solid var(--line);grid-column:1/-1;margin:-4px 0 10px;padding:0 0 0 14px;list-style:none}.run-row{min-height:44px;color:var(--ink);flex-wrap:wrap;align-items:baseline;gap:2px 10px;padding:10px 4px;text-decoration:none;display:flex}.run-row-name{font-size:14px;font-weight:600}.run-row-meta{color:var(--ink-3);font-size:13px}.orphan-runs .run-rows{margin:0}.map-stage{-webkit-overflow-scrolling:touch;overflow:auto}.map-picture{max-width:560px;margin:0 auto;padding:0 0 24px}.map-picture svg{width:100%;height:auto;display:block}.map-picture [data-session],.map-picture [data-person],.map-picture [data-handoff],.map-picture [data-plate],.map-picture [data-number],.map-picture [data-handoff-row]{cursor:pointer;outline:none}.map-picture [data-session].is-on>rect[data-card],.map-picture [data-session]:focus-visible>rect[data-card],.map-picture [data-person].is-on>rect[data-card],.map-picture [data-person]:focus-visible>rect[data-card]{stroke-width:2.4px;stroke:var(--accent)!important}.map-picture [data-handoff-row].is-on>rect[data-row],.map-picture [data-handoff-row]:focus-visible>rect[data-row]{fill:var(--accent-soft)!important}.map-picture [data-handoff].is-on>path:first-of-type{stroke-width:3.4px}.map-by-hand{gap:4px;margin:0;padding-left:1.1em;display:grid}.map-graph-link{color:var(--accent)}.map-handoffs{gap:6px;margin:0 0 12px;padding:0;list-style:none;display:grid}.map-handoff-line{border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);width:100%;min-height:44px;color:var(--ink-2);text-align:left;align-items:flex-start;gap:10px;padding:8px 10px;font-size:14px;display:flex}.map-handoff-line strong{color:var(--ink)}.map-handoff-n{border:1.5px solid var(--line-strong);width:22px;height:22px;color:var(--ink);border-radius:50%;flex:none;place-items:center;font-size:12px;font-weight:700;display:inline-grid}.keep{border-top:1px solid var(--line);margin-top:14px;padding-top:4px}.outline{padding:4px 16px 28px}.outline-section{border-bottom:1px solid var(--line);padding:14px 0 12px}.outline-section:last-child{border-bottom:0}.outline-kind{color:var(--accent);margin:0;font-size:12px;font-weight:700}.outline-head{justify-content:space-between;align-items:center;gap:10px;display:flex}.outline-head h3{margin:0;font-size:18px;line-height:1.3}.outline-items{margin:4px 0 0}.outline-item dt{color:var(--ink-3);margin-top:10px;font-size:13px;font-weight:600}.outline-item dd{white-space:pre-wrap;overflow-wrap:anywhere;margin:2px 0 0;line-height:1.5}.outline-item .plain-list{margin:0}@media (max-width:479px){.editor:not(.viewer)>.topbar{gap:4px}.editor:not(.viewer)>.topbar .icon-btn[aria-label=Outline]{width:38px}.editor:not(.viewer)>.topbar .topbar-export{padding:0 11px}.editor:not(.viewer)>.topbar .status{padding-left:10px;padding-right:10px}}.live-view{grid-template-rows:auto minmax(0,1fr);height:100dvh;display:grid}.live-main{padding:12px 12px calc(28px + env(safe-area-inset-bottom));overflow:auto}.live-group{max-width:640px;margin:0 auto}.live-source{letter-spacing:.02em;color:var(--ink-3);text-transform:uppercase;margin:14px 4px 6px;font-size:13px;font-weight:700}.live-empty{max-width:640px;margin:24px auto;padding:0 8px}.live-session{border:1px solid var(--line);background:var(--surface);border-radius:14px;margin:0 0 12px;overflow:hidden}.live-session.live-working{border-color:var(--accent)}.live-session-head{padding:12px 14px 10px}.live-session-title{justify-content:space-between;align-items:center;gap:10px;display:flex}.live-harness{color:var(--kind-agent);font-size:16px;font-weight:700}.live-harness-codex{color:var(--kind-check)}.live-state{align-items:center;gap:6px;min-height:28px;display:inline-flex}.live-state:before{display:none}.live-state-working{background:var(--accent-soft);color:var(--accent)}.live-state-quiet{background:var(--surface-2);color:var(--ink-3)}.live-state-waiting{background:var(--warning-soft);color:var(--warning)}.live-state-ended{background:var(--surface-2);color:var(--ink-3)}.live-session-sub,.live-session-facts{color:var(--ink-3);overflow-wrap:anywhere;margin:2px 0 0;font-size:13px}.live-session-facts{color:var(--ink-2)}.live-agents{border-top:1px solid var(--line);margin:0;padding:4px 14px 12px;list-style:none}.live-agent{align-items:flex-start;gap:10px;padding:8px 0 4px;display:flex}.live-mark{background:var(--ok-soft);width:20px;height:20px;color:var(--ok);border-radius:50%;flex:none;place-items:center;margin-top:1px;display:inline-grid}.live-mark svg{fill:none;stroke:currentColor;stroke-width:2.6px;stroke-linecap:round;stroke-linejoin:round;width:14px;height:14px}.live-agent.is-running .live-mark{background:var(--accent);box-shadow:0 0 0 0 var(--accent);animation:1.6s ease-out infinite live-ring}@keyframes live-ring{0%{box-shadow:0 0 0 0 color-mix(in oklab, var(--accent) 55%, transparent)}to{box-shadow:0 0 0 9px #0000}}@media (prefers-reduced-motion:reduce){.live-agent.is-running .live-mark{box-shadow:0 0 0 3px var(--accent-soft);animation:none}}.live-agent-text{flex-direction:column;min-width:0;display:flex}.live-agent-name{overflow-wrap:anywhere;flex-wrap:wrap;align-items:baseline;gap:6px;font-weight:650;display:flex}.live-id{color:var(--ink-3);font-size:12px;font-weight:400}.live-agent-facts{color:var(--ink-2);font-size:13px}.live-foot{max-width:640px;margin:8px auto 0;padding:0 4px}.live-plan{border-top:1px solid var(--line);background:var(--surface-2);padding:10px 14px 8px}.live-plan-head{margin:0 0 4px;font-size:14px;font-weight:650}.live-plan-sum{color:var(--ink-2);font-size:13px;font-weight:400;display:block}.live-plan-list{margin:0;padding:0;list-style:none}.live-plan-list li{grid-template-columns:1fr auto;gap:0 10px;padding:4px 0;font-size:14px;display:grid}.live-plan-type{font-weight:600}.live-plan-state{color:var(--ink-3);font-size:13px}[data-plan-state=started] .live-plan-state{color:var(--ok)}[data-plan-state=running] .live-plan-state{color:var(--accent);font-weight:650}.live-plan-purpose{color:var(--ink-3);grid-column:1/-1;font-size:13px}.live-plan-extra{color:var(--warning);margin:4px 0 0;font-size:13px}.live-notes{border-top:1px solid var(--line);color:var(--ink-2);margin:0;padding:8px 14px 12px;font-size:14px;list-style:none}.live-notes li{border-left:3px solid var(--line-strong);overflow-wrap:anywhere;margin:4px 0;padding:2px 0 2px 10px}.live-map{border:1px solid var(--line);border-radius:14px;max-width:640px;margin:0 auto 14px;overflow:hidden}.live-map .map-picture{max-width:none;padding:0}.outline-section.is-current{background:var(--bg);box-shadow:inset 3px 0 var(--accent);margin:0 -16px;padding-left:16px;padding-right:16px}@media (hover:hover){:is(.btn,.chip,.add-kind,.loop-pill,button.issue,.view-fit,.insert-row):hover:not(:disabled){filter:brightness(var(--hover,.96))}:is(.icon-btn,.tool,button.title-btn,.file,.seg):hover:not(:disabled,.seg-on,[aria-pressed=true]){background:var(--surface-2)}.gnode:hover:not(.run-state){border-color:var(--ink-3)}}@media (prefers-color-scheme:dark){:root{--hover:1.2}}@media (max-width:1099px){.sheet-rail:has(~.sheet){display:none}}@media (min-width:900px){.use-template{max-width:720px}}@media (min-width:1100px){.topbar{gap:8px;min-height:56px;padding:0 16px 0 8px}.topbar:before{content:"";background:var(--line-strong);order:1;width:1px;height:20px;margin:0 4px}.topbar>*{order:2}.topbar>a.icon-btn{order:0;gap:2px;padding-left:4px}.topbar .icon-btn{gap:7px;width:auto;padding:0 10px;font-size:14.5px;font-weight:560;text-decoration:none}.topbar .icon-btn:after{content:attr(aria-label)}.topbar .icon-btn svg{width:18px;height:18px}.title-btn{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-height:36px;padding:0 10px;line-height:36px;display:block;overflow:hidden}.title-name{font-size:15px}.title-sub{margin-left:10px}.title-btn+*{margin-left:auto}.editor{--rail:clamp(280px, 22vw, 340px);--side:clamp(340px, 27vw, 400px);grid-template-columns:minmax(0, 1fr) var(--side)}.editor.has-rail{grid-template-columns:var(--rail) minmax(0, 1fr)}.editor.has-rail.has-side{grid-template-columns:var(--rail) minmax(0, 1fr) var(--side)}.has-rail>.stage,.has-rail>.editor-notice{grid-column:2}.has-rail>.sheet{grid-column:3}.has-rail>.sheet-rail{--sheet-from:translateX(-14px);border-left:0;border-right:1px solid var(--line);grid-column:1}.sheet{--sheet-from:translateX(14px)}.sheet-head{min-height:56px;padding-right:8px}.sheet-title{padding-top:0}.mode-active .sheet-body{display:block}.mode-active .loop-legend{visibility:hidden}.add-menu{grid-template-columns:1fr}.outline-head h3{font-size:16px}.outline-item dd{font-size:14px}.editor-notice{border-width:0 0 1px;border-radius:0;margin:0;padding:5px 8px 5px 16px}.toolbar{border-radius:12px}.viewer-bar,.mode-banner{border-radius:12px;gap:8px 16px;width:max-content;max-width:calc(100% - 300px);padding:6px 6px 6px 16px;left:50%;right:auto;transform:translate(-50%)}.viewer .view-fit{bottom:calc(12px + env(safe-area-inset-bottom))}}@media (min-width:1100px) and (pointer:fine){.editor .btn{min-height:36px;padding:0 14px;font-size:14px}.editor .btn-small{min-height:30px;padding:0 10px;font-size:13px}.inspector-actions .btn-quiet{padding:0 8px}.editor .input{min-height:36px;padding:7px 10px;font-size:14px}.editor .input.mono{font-size:13px}.editor .chip,.editor .seg{min-height:30px;font-size:13px}.editor .toggle{min-height:36px}.topbar .icon-btn{height:36px}.sheet .icon-btn{width:32px;height:32px}.status,.loop-pill{min-height:28px;font-size:12.5px}.view-fit{min-height:36px}.tool{border-radius:8px;flex-direction:row;gap:6px;min-width:0;min-height:36px;padding:0 12px;font-size:13px}.tool svg{width:18px;height:18px}}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/builtins-D_22fKRF.js","assets/share-BzIzB4EY.js","assets/plan-templates-BQu8G2sX.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{n as e,r as t}from"./index-CeaKwKuU.js";import{Bt as n,Lt as r,ot as i,pn as a,tt as o,zt as s}from"./share-BzIzB4EY.js";var c,l=()=>e(`builtins`,()=>t(()=>import(`./builtins-D_22fKRF.js`),__vite__mapDeps([0,1]))).then(e=>c=e.BUILT_IN_TEMPLATES),u=()=>c;function d(e){let t=e=>+(e.template?.kind===`fragment`);return[...e].sort((e,n)=>t(e)-t(n)||e.template.title.localeCompare(n.template.title))}var f=e=>c?.find(t=>t.id===e),p,m=()=>e(`plan-templates`,()=>t(()=>import(`./plan-templates-BQu8G2sX.js`),__vite__mapDeps([2,1]))).then(e=>p=e.PLAN_TEMPLATES),h=`A plan: a graph a person follows. It has no recorded run, and no package for a harness is made of a graph with a person's step.`,g=()=>p;function _(e,t){let n=o(e);if(!a(n))return null;let r=[],i=new Set(e.nodes.map(e=>e.id));for(let e of t?.loops??[]){let n=e.members.filter(e=>!i.has(e));if(n.length>0&&n.length<e.members.length){let i=n.map(e=>{let n=t.nodes.find(t=>t.id===e)?.name;return n?`${e} (${n})`:e});r.push(`loop "${e.id}" stayed behind: a loop comes along only with all its members; add ${i.join(`, `)} to the selected nodes`)}}return{issues:n,hints:r}}function v(e){let t=e.template?.slots??[];return i(e).map(e=>t.find(t=>t.key===e)??{key:e,ask:`What should "${e}" be?`,example:``})}function y(e){let t={};for(let[n,r]of Object.entries(e))r.trim()!==``&&(t[n]=r.trim());return t}function b(e,t,i){let a=r(t);a.delete(t.id);for(let e of i)a.add(e);return n(s(e,`graph`),a)}var x={cost:{low:`Low cost`,medium:`Medium cost`,high:`High cost`},speed:{fast:`Fast`,medium:`Medium speed`,slow:`Slow`},rigor:{light:`Light rigor`,standard:`Standard rigor`,high:`High rigor`}},S={cost:{low:1,medium:2,high:3},speed:{fast:3,medium:2,slow:1},rigor:{light:1,standard:2,high:3}},C={cost:[`low`,`medium`,`high`],speed:[`fast`,`medium`,`slow`],rigor:[`light`,`standard`,`high`]};export{f as a,b as c,g as d,v as f,x as i,l,_ as m,S as n,u as o,d as p,C as r,y as s,h as t,m as u};
|
package/dist/app/demo/run.txt
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
7Vvbchu5Ef0V1OxDSNUMxaEkX6iHxLGVvWTXSdnOuuLIVYRmQBKrmcHUANSlbFflKR-Qyr_kPZ-yX5LTAObGi2w5yhtr1zY5AHoa3af7dEPQh-AqmMZhcCmLNJgG1aoIwiBVSTD9ECwqpcrlKzyajkM7NA0m48mj8dPJOIqfTk6OnmByWalFJbTG4DcMk9naFPaff7OSV1pE6ariRqriHP8dHHyreDY6OGDP0pTN7IQXfnxgxI0ZzphRTFfJYb1slP-iQ2aWgsniSmA-U3M2m6sq5-a1SFSR6lnIrqVZMiO00ZjmPrQS6CuJYbxI2auzZy9-OmPYrB6xF6oQ7HopCiYg-5ZJI3ISQKOHr85-_v7sbfT8u7Pnf_zx-9dvRnnKlipLoc6sKHP7lhk2qbXAI5LN2XKV84LxEua5EtqqnYtqIUZu9z_CtGxWiSsprmdTmKFSK6yL2WAuC6mXIh2S4VKpS26SJSQcs0MWj-lhzm9IP7cnGsAzbSBvLiuRTtnBwQWvnDopJHNTC6dXf_MNe6lSoenzR1bgI_uI1dysNPuIR1EU2T80erGSWSoqTHACxjAHzDTQppKJYYuK5zmvTlltAxYfH8bHVvF6O26Bn8kqkfEbkbISQp1RYcru-seH8eOh1YMllTQyad9N-5pzmWFHv_79X85Bj9iqyIVhgyeHxzFbiiyN1MqwhMMRXTVoLdnDr-VZhqUkQbME_2yoELayjmMSbTWy_osW3JDJDg6WPMNSK_CaQ9diwQBG62nrfLxs4P3Pzs-xD_GLgNUsQOdCpBc8ufR7tVb6CLMUKYn56B311omlb99ZOKUikRpOJ5_OWnVmU_tWbzHnePdkyYuFYHzBZYG9uUciucwk4oD9RAJght-eF1GNVPbrP_7JZiJqhUek3Mw9tx9p9ra9bFnqpvnFHk0zNnBemQxpY8-dinggCB8UD2xwrapLMoSphAgxlqg8lwbWHk43UgIbFOJ6GO4MdT_sop0id5CrVM4lhIXs-XfPXn579to-xrywhvxvtIdOphZ2sceqn-UsXU-KYq_4cMTOrmQqikTY5LOUGpAgeVM3czzCm-eh_xIBdJHV09wY_zDuzoh7M0YeFT9yuNLGu_UlPX02N2S9OoVQBo7GT6PJ-E38dHp0ND2avIPlYtbmBQvbg4NbQTExcDmvgYYLLhsZ3sUyE9NMFqKX8MSNNGw8tN41Sl2S851lInrJbMReQ0vNJjD5Wsoa2ix5xAYXq3SBAI4hplBIVIJDi7Te6rMcEYE_xqarl0AfRsA5Wq2qRLQcZQlKEoH1mQZTC55jYvBnes46z4lB6BOR3wJUhDl3MhFn8Lw1xL1JaYqtM7OqsHHeqMD0Klkyrtl5EC-Pxvl5EOLj8Yk-DxiyyHlwMh7n9EUW7u2r_AI-hnTtxI7YXwoJluMV8k3I8pA5WsuhjwUfcoSqgL2QkVEpZeQKvlVA5ylm3gKeCDGRQWezrNQ1afeKgvGsqlRV81ihiojyPUVjPevNbekmjdgby7QLdQfZjtizNp1qOBt7sBmaAESr8Vwjaly8IAvZ1EJvx2STYd417cWOkj9YJjhRqkK6PO0mvl8IS7rJdtK4PcD4WEnougVsNDkTMEu_gvMhRi_VdUEiiP-_hv4BPcPxwRB6l7wqXOmUZHyVInzAx8GnMKBY4wuLcPA_Aodqr6XAB7UQhVAr7SMN4uaVyneM_i4mYWB7fC0t8KfBG6ji0pWjMr3kpfBlU2tLVdhvkF0YCdzZv2hr9LSuC_wkwEMRPDBlxN5KwhUj0_rdsQtFsjHqwEpDSMEiY3Oey-wWwFXOu1e8kjBWwkt-ITNpMERu88aAr6sVKai0jtxS63KCZgEOImR67VGrFvQYinAfL7U2qBCXksKhqiR5xm48XfEsqtWlmkhTkYN3sjgeksvss2D6tw8uy3gDBE3djKmFabPN75vxSmWit8DunPxKBsGIMx65ScyRNgx5Ui6WmHkBY8zx9YWyVjZcX7rAhg0gpFvqjtifaKcZb2ggtBjvEBdqQ-2iiqcp1esuK6DapJIjpJyj-S2MQ3GAEBAuZIDg7HZk63qrBJVIxMYk6EJAYUFRhZeV0N2BP1U-lVsup5hjFDPE6VhyqyyIuCGzyqJE7MOuQb1D131sDT8MdXiYUN8wniqGwfswQCLpynPVT9dOENEy_tTlFTcrdQh0AmkXDiXePJps4u0GHOBVKCHVNb2IzBwRLZBwkUrTfAEII_fW959CD5wmaLfj5nk93A9ZWF9TsIE9UByICmtcQFojrEVkuapKpcWI_QEubSLCzuTwyxKz-tFXiWiptE-wtiFQm2Hj8uSWOLE5fC1aPOibza5jvs4qd6H-B0rmny1iQ5tNKEHYnoIyeEiFi6Mr4fia3GmnWE7UYCc9pzwjjUe9TRWWJWw7ccpW2r2aYK2lUSAHVSDdIO_bQhW7tRDhpquhUSvq1HZEiyUfkc0Z6JGcAGUKymjaKst9CI3YXxFOlslObWT5aJrLmxH7WVQpNV5ENU6hdfayXWmTp10bTLNPqTzhmUwjUReodinNIkyRIdryL-EFvfNCOKLsBaqbPe_smxitbyuuu2bxdE10bIOFFL8rzPuB3IT8tO_qtWLVse6VNxDNcjUefZ06g31k1D7in3VT7I7nayBYRLU2vZCmGC1uaUUn6NtAb5ugNthtTVA_8xHvejBXJ6AItccpeWk8T391RwdBymYPa0NfhtAGtvRtHa2pv2v1pR6j1fSFG4MxgGh6gAI2oeLl03tKfIsuP4rIJ6SNKqUlQqO6KaLxxUNCzDmORNVl2p24a8zQtDEEmFb3RlmrersTiiTKam5ydycNeLcJJ6_uEt6Dj5dv53fErLXorajeYivOj39ekMPHXaK-ZNvNEQg65A7KgJMM3VoHJ65GaDH2qv6eC-p2LHjbF7Z80moFmVY6xeGa17Zt7L0jI7yKUmzuyBddMZFTT4c2qmz20yVWO8V9cHTHK8tYO4FFpq75vjJyzpN20RaIkp04QqsEyZA9g7Nt3bn0R1cUCTWl-W6d92nPVWVrfbtm4xHRL8V4b18wRuTyTVdv9O9R27-Tw4LpcWfctfHWNVyvKtK6PboMqJ_JJZJaPP5kYVCqTCaymzHK2nlSq6zu0WtTb47oBN0fhhYVR_ffYLmMChURyUYYoMKtFbI5sCYDERr4c6f9wcL-YGF_sLA_WNgfLOwPFvYHC_uDhf3Bwv5gYX-wsD9Y2B8s7A8W9gcL-4OF-x8sgPW6ShXReDyOg92X6rhp1pMp4V2R-ontxY7JyfToyTuKHzSv7vIeq-c2mttXTT73Kiq5pm1A3PHGk_G7frL2U6k4W5FBxo0-de3YOGxdraOHVkughtoy_HhDa58iW5UTFKoUqztgxnPMJJx92tgdqnfEx5ajm-2HFvVNJCqDaaB7B6l3k87VFmNbW5zaK2t0LsFKJQsEGRoGlV0Rd9Ohw5zqyvpaXue8qHdcNFyz_vEXWb_JjTuN__g-mPCFRwsJ6gncLapxzcl9NU8eWM0dGMH_x_1d-Gzva732QbunLjV17nfVc_oXvO5uQJtzrBowkT3J6lxjO479vUbimnvAdcFL17hSm9895iJp9tAC7yh54vL6vOKJu6PlTsFqlCfo5IRHWud2pF5hNfK-ZTHmyIX08952Vyzj6ITZ7qd7Z3PKttzZdCeBncNCNliVJVV7GMU60EtP4wthroUoDrlrr0u4HhPolmTOs3Yvw1HnvIJKbyOK0RrMHn0OZlRhTJu64r4ounemmbSZpr58W98MPrW3_7QjbkQQnYpV9pIh3e-jBsvX9YOuwYenmxeHO1fu6GbjTXNTeEietzfzJofxuHMNecTecHs1s1cUURaqkUJ3YL2UdRs_fqh8v2nmjZQT30FDrpppa-i-lk8eWsvtWDmaTMeP7mKl-H9hpfqmdX3zunfjmg0oniJUn6JA2yOvmtgCg-S5cAdV4BlBJVtlOiG3LbpCdomwZ1RCYqnNETzTp_6UoHPVflWmfP22dZ_mOvdxK-Ejdc09Tx-GD7aY_w4M3UFb8VbaiscPrOYOENm7vdtA1NLWBqo2aCvu0Vb8f6ItVMG12yv0TShWL279QcQ9Kc07xV3j77cveuu15Q7i3KVlNvDIC_FZX0qQTHpoVKqQ-Nau_tOsLn80uFzLbnH8EAyy26Gt_-zxSa-h-mLrHa-zSvyFrFIzSudI0Bo6XLfs0N4sp99E0RuEY8_2Ha30mOe4zzHDTZKxSQIk0zbe69b_shand-ywM-Y2fUC_67EtL_jfAeHG_1zO_uCrfcnX_F4Gan19WR8zO6n0c1r_6xlEru6orfnJH3WYn_4L
|