@huynle/hub 0.11.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/README.md +19 -5
- package/package.json +1 -1
- package/packages/claude-code/package.json +1 -1
- package/packages/claude-code/src/sessions.ts +4 -1
- package/packages/cli/dist/hub-cli.js +240 -83
- package/packages/cli/package.json +1 -1
- package/packages/cli/src/cli.ts +12 -7
- package/packages/cli/src/decisions.ts +52 -4
- package/packages/cli/src/format.ts +9 -0
- package/packages/cli/src/mcp.ts +20 -4
- package/packages/cli/src/team-intake-mcp.ts +2 -1
- package/packages/cli/src/teams-mcp.ts +7 -3
- package/packages/codex/package.json +1 -1
- package/packages/codex/src/sessions.ts +14 -3
- package/packages/node/package.json +1 -1
- package/packages/preset/package.json +1 -1
- package/packages/protocol/package.json +1 -1
- package/packages/protocol/schema/api/v1/_root.json +119 -0
- package/packages/protocol/schema/api/v1/account.json +419 -0
- package/packages/protocol/schema/api/v1/decisions.json +635 -0
- package/packages/protocol/schema/api/v1/discovery.json +110 -0
- package/packages/protocol/schema/api/v1/events.json +679 -0
- package/packages/protocol/schema/api/v1/session-actions.json +660 -0
- package/packages/protocol/schema/api/v1/sessions.json +2055 -0
- package/packages/protocol/schema/api/v1/speech.json +492 -0
- package/packages/protocol/schema/api/v1/unspecified.json +282 -0
- package/packages/protocol/schema/app-delivery/v1.schema.json +67 -5
- package/packages/protocol/schema/app-front/v1.schema.json +7 -3
- package/packages/protocol/src/api-v1.ts +8 -0
- package/packages/protocol/src/index.ts +2 -0
- package/packages/protocol/src/teams.ts +13 -1
- package/packages/runtime-openshell/package.json +1 -1
- package/packages/runtime-sdk/package.json +1 -1
- package/packages/sdk/package.json +1 -1
- package/packages/sdk/src/app-front.ts +2 -2
- package/packages/sdk/src/ask-fields.ts +76 -0
- package/packages/sdk/src/client.ts +11 -2
- package/packages/sdk/src/envelope.ts +3 -2
- package/packages/sdk/src/index.ts +1 -0
- package/packages/sdk/src/team-intake.ts +6 -0
- package/packages/sdk/src/teams.ts +2 -0
- package/packages/sdk/src/types.ts +36 -4
- package/packages/sdk/src/wake.ts +9 -4
- package/packages/spoke-sdk/package.json +1 -1
- package/src/central/agent/agent-limits.ts +185 -0
- package/src/central/agent/app-decisions.ts +6 -5
- package/src/central/agent/decisions.ts +130 -9
- package/src/central/agent/delivery.ts +134 -22
- package/src/central/agent/errors.ts +2 -1
- package/src/central/agent/events.ts +20 -2
- package/src/central/agent/launch-engine.ts +6 -3
- package/src/central/agent/message-limits.ts +5 -2
- package/src/central/agent/message-routes.ts +33 -6
- package/src/central/agent/messages.ts +7 -0
- package/src/central/agent/placement.ts +4 -2
- package/src/central/agent/read-routes.ts +5 -0
- package/src/central/agent/routes.ts +2 -0
- package/src/central/agent/subscriptions.ts +13 -4
- package/src/central/api-v1.ts +115 -0
- package/src/central/artifacts/store.ts +4 -2
- package/src/central/concierge/board-results.ts +2 -1
- package/src/central/concierge/notifier.ts +4 -2
- package/src/central/config.ts +20 -6
- package/src/central/health/classify.ts +209 -0
- package/src/central/http.ts +285 -23
- package/src/central/recording/index.ts +2 -1
- package/src/central/recording/schema.ts +2 -1
- package/src/central/registry.ts +34 -3
- package/src/central/teams/budgets.ts +144 -0
- package/src/central/teams/hop-stalls.ts +14 -6
- package/src/central/teams/intake.ts +38 -6
- package/src/central/teams/involvement.ts +95 -0
- package/src/central/teams/item-decisions.ts +60 -0
- package/src/central/teams/item-eligibility.ts +35 -0
- package/src/central/teams/item-stalls.ts +87 -0
- package/src/central/teams/loops.ts +40 -0
- package/src/central/teams/progress.ts +154 -0
- package/src/central/teams/routes.ts +2 -2
- package/src/central/teams/store.ts +21 -5
- package/src/central/teams/validation.ts +17 -6
- package/src/central/workspaces/coordinator.ts +3 -1
- package/src/spoke/hub-tool.ts +26 -11
- package/web/dist/assets/{ArtifactPage-C5MMqXLN.js → ArtifactPage-TbFJi59n.js} +1 -1
- package/web/dist/assets/{ArtifactPane-CXSCmhyJ.js → ArtifactPane-7D-M-Ich.js} +1 -1
- package/web/dist/assets/{ArtifactWorkbench-S0RxNGWy.js → ArtifactWorkbench-DlCLEjut.js} +1 -1
- package/web/dist/assets/{Diagram-BGmyRb-R.js → Diagram-PvOPetOI.js} +1 -1
- package/web/dist/assets/{Library-CFmMbXEa.js → Library-Cdi83pOV.js} +2 -2
- package/web/dist/assets/{ProfilesDestination-7jpOc2HM.js → ProfilesDestination-cryC7P6j.js} +1 -1
- package/web/dist/assets/TeamsPage-B4xrlGhp.js +1 -0
- package/web/dist/assets/Watchtower-60B1JX_J.js +2 -0
- package/web/dist/assets/index-DA0gKIzv.js +33 -0
- package/web/dist/assets/live-B2IfKm37.js +5 -0
- package/web/dist/assets/{live-BUofsQpz.css → live-De-kd3eW.css} +1 -1
- package/web/dist/assets/{renderer2d-B2Nh39UN.js → renderer2d-CsZnF3_o.js} +1 -1
- package/web/dist/assets/{renderer3d-CTYbljHH.js → renderer3d-BIMA0wFn.js} +2 -2
- package/web/dist/assets/{safe-area-CkhEclGo.js → safe-area-dtrnw9NF.js} +1 -1
- package/web/dist/index.html +1 -1
- package/web/dist/assets/TeamsPage-C1NGrUR-.js +0 -1
- package/web/dist/assets/Watchtower-DnvlJaU0.js +0 -2
- package/web/dist/assets/index-Da8SKXMw.js +0 -33
- package/web/dist/assets/live-BmqLASSo.js +0 -5
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{$ as e,A as t,B as n,C as r,D as i,G as a,I as o,J as s,N as c,Q as l,S as u,T as d,U as f,W as p,b as m,et as h,h as g,k as _,t as v,tt as y,u as b,x,y as S}from"./ui-CFB4wQfF.js";import{B as C,F as w,L as T,M as E,N as D,P as O,R as k,U as A,V as j,j as M,k as ee,l as te,s as ne,z as re}from"./toast-q818mjUF.js";import{t as N}from"./plural-Bspvoqfq.js";import{O as P,at as F,ot as ie}from"./index-DA0gKIzv.js";var I={teamsPerUser:100,rolesPerTeam:32,edgesPerTeam:256,sessionsPerRole:16,openIntakePerTeam:500,hopLimit:1e4};function L(e){if(!T(e))return`body must be an object`;if(!E(e.name))return`name must be 2–40 lowercase letters, digits or dashes`;if(!M(e.title))return`title must be 1–120 characters of text`;if(e.description!==void 0&&!D(e.description,4e3))return`description must be at most ${ee} characters`;if(e.mode!==`open`&&e.mode!==`restricted`)return`mode must be open or restricted`;if(e.hopLimit!==void 0&&(!Number.isSafeInteger(e.hopLimit)||e.hopLimit<1||e.hopLimit>I.hopLimit))return`hopLimit must be a whole number from 1 to ${I.hopLimit}`;if(!Array.isArray(e.roles)||e.roles.length===0||e.roles.length>I.rolesPerTeam)return`roles must list 1–${I.rolesPerTeam} roles`;let t=new Set;for(let n of e.roles){if(!T(n)||!E(n.name))return`each role needs a slug name`;if(t.has(n.name))return`role ${n.name} is listed twice`;if(t.add(n.name),n.label!==void 0&&!M(n.label))return`role ${n.name} label must be 1–120 characters`;if(n.externalContact!==void 0&&typeof n.externalContact!=`boolean`)return`role ${n.name} externalContact must be true or false`}if(typeof e.entryRole!=`string`||!t.has(e.entryRole))return`entryRole must name one of the roles`;let n=e.edges??[];if(!Array.isArray(n)||n.length>I.edgesPerTeam)return`edges must be a list of at most ${I.edgesPerTeam}`;for(let e of n){if(!T(e)||typeof e.from!=`string`||typeof e.to!=`string`||!t.has(e.from)||!t.has(e.to))return`each edge must connect two listed roles`;if(e.from===e.to)return`an edge must connect two different roles`;if(!Array.isArray(e.kinds)||e.kinds.length===0||!e.kinds.every(e=>e===`msg`||e===`ask`))return`edge kinds must be msg and/or ask`;if(e.direction!==`one-way`&&e.direction!==`two-way`)return`edge direction must be one-way or two-way`}return w(e.tags)??O(e.metadata)}var R=e=>typeof e==`object`&&!!e&&!Array.isArray(e),z=e=>typeof e==`string`&&e.length>0?e:void 0,B=e=>typeof e==`number`&&Number.isFinite(e)?e:void 0,V=e=>Array.isArray(e)?e.filter(e=>typeof e==`string`):[],ae=/^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$/,H=e=>({ok:!1,error:e}),U=e=>({ok:!0,spec:e});function oe(e){if(!R(e)||!z(e.name))return;let t={name:e.name};for(let n of[`label`,`description`])z(e[n])&&(t[n]=e[n]);typeof e.externalContact==`boolean`&&(t.externalContact=e.externalContact),Array.isArray(e.responsibilities)&&(t.responsibilities=V(e.responsibilities)),R(e.profile)&&z(e.profile.profileID)&&(t.profile={profileID:e.profile.profileID,...B(e.profile.version)===void 0?{}:{version:e.profile.version}}),R(e.prefs)&&(t.prefs=Object.fromEntries(Object.entries(e.prefs).filter(([,e])=>typeof e==`string`)));for(let n of[`minMembers`,`maxMembers`])B(e[n])!==void 0&&(t[n]=e[n]);return t}function se(e){if(!R(e)||!z(e.from)||!z(e.to))return;let t=V(e.kinds).filter(e=>e===`msg`||e===`ask`);return{from:e.from,to:e.to,kinds:t,direction:e.direction===`two-way`?`two-way`:`one-way`}}function ce(e){if(!R(e)||!z(e.name)||typeof e.title!=`string`||!Array.isArray(e.roles))return;let t=R(e.metadata)?Object.fromEntries(Object.entries(e.metadata).filter(([,e])=>typeof e==`string`)):void 0;return{name:e.name,title:e.title,...z(e.description)?{description:e.description}:{},mode:e.mode===`open`?`open`:`restricted`,...R(e.itemBudget)&&B(e.itemBudget.wakes)!==void 0&&B(e.itemBudget.hours)!==void 0?{itemBudget:{wakes:e.itemBudget.wakes,hours:e.itemBudget.hours}}:{},...R(e.loop)&&B(e.loop.messages)!==void 0&&B(e.loop.windowMinutes)!==void 0?{loop:{messages:e.loop.messages,windowMinutes:e.loop.windowMinutes}}:{},roles:e.roles.map(oe).filter(e=>!!e),entryRole:typeof e.entryRole==`string`?e.entryRole:``,edges:Array.isArray(e.edges)?e.edges.map(se).filter(e=>!!e):[],...Array.isArray(e.tags)?{tags:V(e.tags)}:{},...t?{metadata:t}:{},...Array.isArray(e.projects)?{projects:V(e.projects)}:{}}}function le(e){if(!R(e)||!R(e.team))return;let t=e.team,n=ce(t);if(!z(t.id)||!n||B(t.revision)===void 0)return;let r=R(e.draft)?ce(e.draft.spec):void 0;return{team:{id:t.id,name:n.name,title:n.title,revision:t.revision,version:B(t.version)??1,state:t.state===`archived`?`archived`:`active`,paused:t.paused===!0,hasDraft:R(t.draft)||!!r},published:n,...r?{draft:r}:{}}}var ue=(e,t)=>e.roles.some(e=>e.name===t);function de(e,t,n){let r=t.trim();if(!ae.test(r))return H(`A role name is 2–40 lowercase letters, digits or dashes`);if(ue(e,r))return H(`There is already a role ${r}`);if(e.roles.length>=I.rolesPerTeam)return H(`A team has at most ${I.rolesPerTeam} roles`);let i=n?.trim();return U({...e,roles:[...e.roles,{name:r,...i?{label:i}:{}}]})}function fe(e,t){return ue(e,t)?e.entryRole===t?H(`${t} is the entry role: make another role the entry role first`):U({...e,roles:e.roles.filter(e=>e.name!==t),edges:e.edges.filter(e=>e.from!==t&&e.to!==t)}):H(`There is no role ${t}`)}function pe(e,t,n){let r=e.roles.findIndex(e=>e.name===t);if(r<0)return H(`There is no role ${t}`);let i={...e.roles[r]};for(let[e,t]of Object.entries(n))t===void 0||t===``||t===!1?delete i[e]:i[e]=typeof t==`string`?t.trim():t;return i.name=t,U({...e,roles:e.roles.map((e,t)=>t===r?i:e)})}function me(e,t){return ue(e,t)?U({...e,entryRole:t}):H(`There is no role ${t}`)}function he(e,t){if(!ue(e,t.from)||!ue(e,t.to))return H(`A path connects two roles of the team`);if(t.from===t.to)return H(`A path connects two different roles`);let n=[`msg`,`ask`].filter(e=>t.kinds.includes(e));if(n.length===0)return H(`Choose what the path permits: messages, asks or both`);let r=e=>e.from===t.from&&e.to===t.to||e.from===t.to&&e.to===t.from&&(t.direction===`two-way`||e.direction===`two-way`),i=e.edges.filter(e=>!r(e));return i.length>=I.edgesPerTeam?H(`A team has at most ${I.edgesPerTeam} paths`):U({...e,edges:[...i,{from:t.from,to:t.to,kinds:n,direction:t.direction}]})}function ge(e,t,n){let r=e=>e.from===t&&e.to===n||e.direction===`two-way`&&e.from===n&&e.to===t;return e.edges.some(r)?U({...e,edges:e.edges.filter(e=>!r(e))}):H(`There is no path ${t} → ${n}`)}var _e=(e,t)=>U({...e,mode:t});function ve(e,t){let n={...e},r=(e,t,n,r)=>!/^[1-9][0-9]*$/.test(e)||Number(e)<t||Number(e)>n?{error:`${r} must be ${t}–${n}`}:{value:Number(e)};if(t.itemBudgetWakes!==void 0||t.itemBudgetHours!==void 0){let i=(t.itemBudgetWakes??String(e.itemBudget?.wakes??``)).trim(),a=(t.itemBudgetHours??String(e.itemBudget?.hours??``)).trim();if(!i&&!a)delete n.itemBudget;else{if(!i||!a)return H(`Item budget needs both wakes and hours, or neither`);let e=r(i,10,5e3,`Budget wakes`),t=r(a,1,720,`Budget hours`);if(e.error||t.error)return H(e.error??t.error);n.itemBudget={wakes:e.value,hours:t.value}}}if(t.loopMessages!==void 0||t.loopWindowMinutes!==void 0){let i=(t.loopMessages??String(e.loop?.messages??``)).trim(),a=(t.loopWindowMinutes??String(e.loop?.windowMinutes??``)).trim();if(!i&&!a)delete n.loop;else{if(!i||!a)return H(`Loop threshold needs both messages and minutes, or neither`);let e=r(i,4,200,`Loop messages`),t=r(a,5,240,`Loop minutes`);if(e.error||t.error)return H(e.error??t.error);n.loop={messages:e.value,windowMinutes:t.value}}}if(t.hopLimit!==void 0){let e=t.hopLimit.trim();if(!e)delete n.hopLimit;else if(!/^[1-9][0-9]*$/.test(e)||Number(e)>I.hopLimit)return H(`Hop limit must be a whole number from 1 to ${I.hopLimit}`);else n.hopLimit=Number(e)}if(t.title!==void 0&&(n.title=t.title.trim()),t.description!==void 0){let e=t.description.trim();e?n.description=e:delete n.description}if(t.tags!==void 0){let e=[...new Set(t.tags.split(/[\s,]+/).filter(Boolean))];e.length?n.tags=e:delete n.tags}if(t.metadata!==void 0){let e={};for(let n of t.metadata.split(`
|
|
2
|
+
`)){if(!n.trim())continue;let t=n.indexOf(`=`);if(t<=0)return H(`Metadata is key=value, one per line ("${n.trim().slice(0,40)}")`);e[n.slice(0,t).trim()]=n.slice(t+1).trim()}Object.keys(e).length?n.metadata=e:delete n.metadata}return U(n)}var ye=e=>(e.tags??[]).join(`, `),be=e=>Object.entries(e.metadata??{}).map(([e,t])=>`${e}=${t}`).join(`
|
|
3
|
+
`);function xe(e){let t=[],n=new Set(e.roles.map(e=>e.name));e.roles.length===0?t.push({level:`error`,field:`roles`,message:`Add at least one role`}):n.has(e.entryRole)||t.push({level:`error`,field:`entry`,message:`Choose an entry role: it receives the team's work`});let r=new Map;for(let i of e.edges){let e=`edge:${i.from}>${i.to}`;if(!n.has(i.from)||!n.has(i.to)){t.push({level:`error`,field:e,message:`The path ${i.from} → ${i.to} points at a role that isn't in the team`});continue}let a=[i.from,i.to].sort().join(`>`),o=r.get(a);if(o&&(o.from===i.from||o.direction===`two-way`||i.direction===`two-way`)){let[n,r]=[i.from,i.to].sort();t.push({level:`error`,field:e,message:o.from===i.from&&o.to===i.to?`${i.from} → ${i.to} is drawn twice`:`${n} and ${r} already have a two-way path: edit that one`})}else r.set(a,i)}if(!t.some(e=>e.level===`error`)){let n=L(e);n&&t.push({level:`error`,field:/^roles? |^each role|^role /.test(n)?`roles`:/^entryRole/.test(n)?`entry`:/edge/.test(n)?`edges`:`team`,message:n})}if(e.mode===`restricted`&&e.roles.length>1)for(let n of e.roles)e.edges.some(e=>e.from===n.name||e.to===n.name)||t.push({level:`warning`,field:`role:${n.name}`,message:`${n.name} has no path: in a restricted team its members can't message anyone in the team`});return t}var Se=e=>e.some(e=>e.level===`error`),Ce=e=>({past:[],present:e,future:[]});function we(e,t){return JSON.stringify(t)===JSON.stringify(e.present)?e:{past:[...e.past,e.present].slice(-100),present:t,future:[]}}function Te(e){return e.past.length===0?e:{past:e.past.slice(0,-1),present:e.past[e.past.length-1],future:[e.present,...e.future]}}function Ee(e){return e.future.length===0?e:{past:[...e.past,e.present],present:e.future[0],future:e.future.slice(1)}}function De(e,t){return{expectedRevision:t,title:e.title,description:e.description??null,mode:e.mode,hopLimit:e.hopLimit??null,itemBudget:e.itemBudget??null,loop:e.loop??null,roles:e.roles,entryRole:e.entryRole,edges:e.edges,tags:e.tags?.length?e.tags:null,metadata:e.metadata&&Object.keys(e.metadata).length?e.metadata:null,...e.projects?{projects:e.projects.length?e.projects:null}:{}}}function Oe(e){let t=e.name.trim();if(!ae.test(t))return{ok:!1,field:`name`,error:`The name is the team's address (#name): 2–40 lowercase letters, digits or dashes. It can't change later.`};let n=e.title.trim();if(!n||n.length>120)return{ok:!1,field:`title`,error:`Give the team a title (up to 120 characters)`};let r=e.entryRole.trim();if(!ae.test(r))return{ok:!1,field:`entry`,error:`The entry role (for example pm) is 2–40 lowercase letters, digits or dashes`};let i=e.entryLabel?.trim(),a=e.hopLimit?.trim();return a&&(!/^[1-9][0-9]*$/.test(a)||Number(a)>I.hopLimit)?{ok:!1,field:`hopLimit`,error:`Hop limit must be a whole number from 1 to ${I.hopLimit}`}:{ok:!0,body:{name:t,title:n,mode:e.mode,...a?{hopLimit:Number(a)}:{},roles:[{name:r,...i?{label:i}:{}}],entryRole:r,edges:[]}}}var ke=e=>JSON.stringify(e,(e,t)=>R(t)?Object.fromEntries(Object.keys(t).sort().map(e=>[e,t[e]])):t);function Ae(e,t){return{added:[...t.keys()].filter(t=>!e.has(t)),removed:[...e.keys()].filter(e=>!t.has(e)),changed:[...t.keys()].filter(n=>e.has(n)&&ke(e.get(n))!==ke(t.get(n)))}}function je(e,t){let n=[`title`,`description`,`mode`,`entryRole`,`hopLimit`,`itemBudget`,`loop`].filter(n=>ke(e[n])!==ke(t[n])),r=e=>new Map(e.roles.map(e=>[e.name,e])),i=e=>new Map(e.edges.map(e=>[`${e.from}>${e.to}`,{...e,kinds:[...e.kinds].sort()}])),a=(e=[],t=[])=>({added:t.filter(t=>!e.includes(t)),removed:e.filter(e=>!t.includes(e))});return{fields:n,roles:Ae(r(e),r(t)),edges:Ae(i(e),i(t)),tags:a(e.tags,t.tags),metadata:Ae(new Map(Object.entries(e.metadata??{})),new Map(Object.entries(t.metadata??{}))),projects:a(e.projects,t.projects)}}function Me(e){if(!R(e)||!R(e.diff))return;let t=e.diff,n=e=>({added:R(e)?V(e.added):[],removed:R(e)?V(e.removed):[],changed:R(e)?V(e.changed):[]}),r=e=>({added:R(e)?V(e.added):[],removed:R(e)?V(e.removed):[]});return{fields:V(t.fields),roles:n(t.roles),edges:n(t.edges),tags:r(t.tags),metadata:n(t.metadata),projects:r(t.projects)}}var Ne={title:`title`,description:`description`,mode:`communication (open/restricted)`,entryRole:`entry role`,hopLimit:`hop limit`,itemBudget:`item budget`,loop:`loop threshold`},Pe=e=>e.replace(`>`,` → `);function Fe(e){let t=[];e.fields.length&&t.push(`Changed: ${e.fields.map(e=>Ne[e]??e).join(`, `)}`);let n=(e,n,r=e=>e)=>n.length&&t.push(`${e}: ${n.map(r).join(`, `)}`);return n(`Roles added`,e.roles.added),n(`Roles removed`,e.roles.removed),n(`Roles changed`,e.roles.changed),n(`Paths added`,e.edges.added,Pe),n(`Paths removed`,e.edges.removed,Pe),n(`Paths changed`,e.edges.changed,Pe),n(`Tags added`,e.tags.added),n(`Tags removed`,e.tags.removed),n(`Metadata added`,e.metadata.added),n(`Metadata removed`,e.metadata.removed),n(`Metadata changed`,e.metadata.changed),n(`Projects added`,e.projects.added),n(`Projects removed`,e.projects.removed),t}var Ie=e=>Fe(e).length===0;function Le(e){let t=e,n=typeof t?.message==`string`&&t.message?t.message:String(e);if(t?.status===409&&t.code===`conflict`){let e=B(t.details?.currentRevision);return{kind:`conflict`,message:`Someone changed this team${e===void 0?``:` (revision ${e} now)`}.`,...e===void 0?{}:{currentRevision:e},missing:[]}}return t?.status===403&&t.code===`needs_user`?{kind:`needs_user`,message:n,missing:(Array.isArray(t.details?.missing)?t.details.missing:[]).filter(R).map(e=>`${z(e.verb)??`?`}${z(e.directory)?` in ${e.directory}`:``}`)}:{kind:`error`,message:n,missing:[]}}function Re(e){let t=R(e)?e.roster:void 0;if(!R(t)||!Array.isArray(t.roles))return;let n=t.roles.filter(R).map(e=>({role:String(e.role??``),entry:e.entry===!0,minMembers:B(e.minMembers)??0,maxMembers:B(e.maxMembers)??I.sessionsPerRole,vacant:e.vacant===!0,understaffed:e.understaffed===!0,launching:B(e.launching)??0,seats:(Array.isArray(e.seats)?e.seats:[]).filter(R).map(e=>R(e.staffing)?{s:e.staffing,presence:z(e.presence)??`unknown`,stalled:e.stalled===`hop cap`}:void 0).filter(e=>!!e&&!!z(e.s.id)&&!!z(e.s.sessionID)).map(({s:e,presence:t,stalled:n})=>({staffingID:e.id,sessionID:e.sessionID,revision:B(e.revision)??1,generation:B(e.generation)??1,presence:t,...n?{stalled:`hop cap`}:{}}))}));return{roles:n,seats:n.flatMap(e=>e.seats.map(t=>({sessionID:t.sessionID,role:e.role})))}}function ze(e,t,n,r){let i={label:n.title||n.name,name:t.name,mode:n.mode,roles:n.roles.map(e=>e.name),entryRole:n.entryRole,tags:n.tags??[],...n.metadata?{metadata:n.metadata}:{}},a=e.nodes.some(e=>e.id===t.id),o=e.nodes.map(e=>{if(e.id===t.id){let{metadata:t,...n}=e;return{...n,...i}}if(e.kind!==`session`||!r)return e;let n=e.seats.filter(e=>e.teamID!==t.id),a=r.filter(t=>t.sessionID===e.id).map(e=>({teamID:t.id,role:e.role}));if(!a.length&&n.length===e.seats.length&&!e.teamIDs.includes(t.id))return e;let o=[...n,...a],s=[...new Set([...e.teamIDs.filter(e=>e!==t.id||a.length),...o.map(e=>e.teamID)])];return{...e,seats:o,teamIDs:s}});return a||o.push({id:t.id,kind:`team`,depth:0,workspaceIDs:[],teamIDs:[],harnesses:[],seats:[],projects:n.projects??[],...i}),{...e,nodes:o}}function Be(e,t){let n=`role:${t}:`;return e.startsWith(n)?e.slice(n.length):void 0}function Ve(e,t,n){let r=Be(n,e);if(r===void 0)return;let i=Be(t,e);if(i!==void 0)return i===r?void 0:{type:`connect`,from:i,to:r};if(t.startsWith(`ses_`))return{type:`attach`,sessionID:t,role:r}}function He(e){let t=e.repo.trim();if(!t.startsWith(`/`))return{ok:!1,field:`repo`,error:`Name the repository on the machine (an absolute path)`};let n=e.branch?.trim();if(e.mode===`worktree`&&!n)return{ok:!1,field:`branch`,error:`A worktree needs a branch name`};let r=e.remote?.trim();if(e.mode===`clone`&&!r)return{ok:!1,field:`remote`,error:`A clone needs the remote URL`};let i=e.name?.trim();if(i&&!ae.test(i))return{ok:!1,field:`name`,error:`A session name is 2–40 lowercase letters, digits or dashes`};let a=e.profile?.trim()?/^(.+)@([0-9]+)$/.exec(e.profile.trim()):void 0;if(e.profile?.trim()&&!a)return{ok:!1,field:`profile`,error:`Choose a profile version`};let o=e.prompt?.trim(),s=e.model?.trim();if(s&&(s.length>200||!/^[A-Za-z0-9._-]{1,80}\/[!-~]+$/.test(s)))return{ok:!1,field:`model`,error:`Use provider/model (at most 200 characters)`};let c=e.timeout?.trim();if(c){let e=/^(\d{1,9})([smhd])$/.exec(c),t=e?Number(e[1])*{s:1e3,m:6e4,h:36e5,d:864e5}[e[2]]:0;if(t<6e4||t>2592e6)return{ok:!1,field:`timeout`,error:`Timeout must be 1 minute to 30 days (e.g. 30m, 4h, 2d)`}}return{ok:!0,body:{role:e.role,launch:{workspace:{repo:t,mode:e.mode,...n&&e.mode===`worktree`?{branch:n}:{},...r&&e.mode===`clone`?{remote:r}:{}},...e.harness?{harness:e.harness}:{},...e.machine?{placement:{machine:e.machine}}:{},...a?{agentProfile:{profileID:a[1],version:Number(a[2])}}:{},...i?{name:i}:{},...o?{prompt:o}:{},...s?{model:s}:{},...e.endWhen||c?{end:{...e.endWhen?{when:e.endWhen}:{},...c?{timeout:c}:{}}}:{}}}}}var Ue=[`low`,`normal`,`high`,`urgent`];function We(e){let t=e.title.trim();if(!t)return{ok:!1,field:`title`,error:`Give the task a title`};if(t.length>120||/\n/.test(t))return{ok:!1,field:`title`,error:`A title is one line of at most 120 characters`};let n=e.brief?.trim();if(n&&n.length>16e3)return{ok:!1,field:`brief`,error:`A brief is at most 16,000 characters`};let r=(e.criteria??``).split(`
|
|
4
|
+
`).map(e=>e.trim()).filter(Boolean);if(r.length>8)return{ok:!1,field:`criteria`,error:`At most 8 criteria`};if(r.some(e=>e.length>200))return{ok:!1,field:`criteria`,error:`A criterion is at most 200 characters`};let i=Ue.find(t=>t===e.priority);return{ok:!0,body:{title:t,...n?{brief:n}:{},...i&&i!==`normal`?{priority:i}:{},...r.length?{criteria:r}:{}}}}function Ge(e,t){return e===void 0||!t?`ok`:t.hopCeiling!==void 0&&e>t.hopCeiling?`capped`:e>t.hopLimit?`lower-global`:`ok`}var Ke=e=>typeof e==`object`&&!!e&&!Array.isArray(e),qe=e=>typeof e==`string`&&e.length>0?e:void 0,Je=e=>typeof e==`number`&&Number.isFinite(e)?e:void 0,Ye=[`queued`,`routed`,`done`,`cancelled`,`failed`],Xe=[`open`,`in_progress`,`blocked`];function Ze(e){if(!Ke(e)||!qe(e.id)||typeof e.title!=`string`)return;let t=Ye.find(t=>t===e.status),n=Je(e.createdAt);if(!t||n===void 0)return;let r=Xe.find(t=>t===e.progress),i={id:e.id,title:e.title,status:t,priority:qe(e.priority)??`normal`,revision:Je(e.revision)??1,createdAt:n,updatedAt:Je(e.updatedAt)??n};r&&(i.progress=r);for(let t of[`sessionID`,`workspaceID`,`assignmentID`,`reason`,`lastError`,`ref`])qe(e[t])&&(i[t]=e[t]);return i}function Qe(e){let t=(Ke(e)&&Array.isArray(e.items)?e.items:[]).map(Ze).filter(e=>!!e).sort((e,t)=>t.createdAt-e.createdAt),n=Ke(e)?qe(e.cursor):void 0;return n?{items:t,cursor:n}:{items:t}}var $e={queued:`Queued`,routed:`Routed`,in_progress:`In progress`,blocked:`Blocked`,done:`Done`,failed:`Failed`,cancelled:`Cancelled`};function et(e){return e.status===`routed`?e.progress===`in_progress`||e.progress===`blocked`?e.progress:`routed`:e.status}var tt=e=>e.status===`queued`||e.status===`routed`;function nt(e){let t=(...e)=>[`queued`,`routed`,`working`,`closed`].map((t,n)=>({step:t,state:e[n]}));switch(et(e)){case`queued`:return t(`current`,`todo`,`todo`,`todo`);case`routed`:return t(`done`,`current`,`todo`,`todo`);case`in_progress`:return t(`done`,`done`,`current`,`todo`);case`blocked`:return t(`done`,`done`,`blocked`,`todo`);case`done`:return t(`done`,`done`,`done`,`done`);default:return e.sessionID||e.assignmentID?t(`done`,`done`,`done`,`failed`):t(`done`,`skipped`,`skipped`,`failed`)}}function rt(e){if(!Ke(e))return;let t=t=>Je(e[t])??0;return{queued:t(`queued`),routed:t(`routed`),done:t(`done`),cancelled:t(`cancelled`),failed:t(`failed`),open:t(`open`),inProgress:t(`inProgress`),blocked:t(`blocked`)}}var it=e=>e.queued+e.routed;function at(e,t,n){return{...e,...t?{seatsFilled:t.seats.length}:{},vacantRoles:t?t.roles.filter(e=>e.vacant||!e.seats.length).map(e=>e.role):[],...n?{openIntake:it(n)}:{}}}function ot(e){return(Ke(e)&&Array.isArray(e.items)?e.items:[]).filter(Ke).map(e=>({version:Je(e.version),publishedAt:Je(e.publishedAt)})).filter(e=>e.version!==void 0&&e.publishedAt!==void 0).sort((e,t)=>t.version-e.version)}var st=(e,t)=>t?e.nodes.find(e=>e.kind===`machine`&&e.machineID===t)?.label:void 0,ct=e=>e.status!==`offline`&&e.status!==`ended`;function lt(e,t){return e.seats.map(e=>{let n=t?.nodes.find(t=>t.id===e.sessionID&&t.kind===`session`),r=t&&n?st(t,n.machineID):void 0;return{...e,online:e.presence===`online`,name:n?.label??e.sessionID,...r?{machine:r}:{},...n?.harness?{harness:n.harness}:{}}})}function ut(e,t){if(!e)return[];let n=t=>e.nodes.find(e=>e.id===t)?.label??t,r=t.query.trim().toLowerCase();return e.nodes.filter(e=>e.kind===`session`&&e.status!==`ended`).map(r=>{let i=st(e,r.machineID),a=t.roster?t.roster.filter(e=>e.sessionID===r.id).map(e=>e.role):r.seats.filter(e=>e.teamID===t.teamID).map(e=>e.role),o=r.seats.filter(e=>e.teamID!==t.teamID).map(e=>({teamID:e.teamID,team:n(e.teamID),role:e.role}));return{sessionID:r.id,name:r.label,...i?{machine:i}:{},...r.harness?{harness:r.harness}:{},online:ct(r),seated:a.includes(t.role),here:a,memberships:o,hay:[r.label,r.id,i,r.harness,...o.flatMap(e=>[e.team,e.role])].filter(Boolean).join(` `).toLowerCase()}}).filter(e=>!r||e.hay.includes(r)).sort((e,t)=>Number(t.online)-Number(e.online)||e.name.localeCompare(t.name)||(e.sessionID<t.sessionID?-1:1)).map(({hay:e,...t})=>t)}function dt(e){if(e.visible)return e.openWork?5e3:3e4}function ft(e,t,n){return e>=n?e>n?`full (${e} of ${n})`:`full (${n})`:t>0&&e<t?`${e} of ${t} required`:`${N(e,`member`)} · up to ${n}`}function pt(e){if(!Ke(e)||typeof e.limit!=`number`||typeof e.maxDepth!=`number`||typeof e.stalled!=`boolean`)return;let t=(Array.isArray(e.seats)?e.seats:[]).filter(Ke).flatMap(e=>typeof e.sessionID==`string`&&typeof e.role==`string`&&typeof e.depth==`number`?[{sessionID:e.sessionID,role:e.role,depth:e.depth}]:[]);return{limit:e.limit,maxDepth:e.maxDepth,stalled:e.stalled,seats:t}}function mt(e){return{text:`hops ${e.maxDepth}/${e.limit}`,warn:e.stalled||e.maxDepth>=e.limit*.8}}var ht=[`msg`,`ask`,`reply`,`decision`,`launch`,`policy`],gt=[...ht,`denied`],_t=[`working`,`idle`,`needs-you`,`error`,`offline`,`ended`],W=e=>typeof e==`object`&&!!e&&!Array.isArray(e),G=e=>typeof e==`string`&&e.length>0?e:void 0,K=e=>typeof e==`number`&&Number.isFinite(e)?e:void 0,vt=e=>Array.isArray(e)?e.filter(e=>typeof e==`string`&&e.length>0):[];function yt(e){if(!W(e))return;let t={};for(let[n,r]of Object.entries(e))typeof r==`number`&&Number.isFinite(r)&&r>0&&(t[n]=r);return Object.keys(t).length?t:void 0}function bt(e){if(!W(e))return;let t={};for(let[n,r]of Object.entries(e))n&&typeof r==`string`&&(t[n]=r);return Object.keys(t).length?t:void 0}function xt(e){return Array.isArray(e)?e.filter(e=>W(e)&&!!G(e.teamID)&&!!G(e.role)).map(e=>({teamID:e.teamID,role:e.role})):[]}var St=new Set([`hub`,`machine`,`session`,`user`,`team`]),Ct=new Set([`idle`,`working`,`blocked`,`error`,`offline`,`ended`]),q=(e,t)=>t===void 0?{}:{[e]:t};function wt(e){if(!W(e))return;let t=G(e.id),n=G(e.kind);if(!t||!n||!St.has(n))return;let r=G(e.status),i=n===`session`&&e.concierge===!0,a=G(e.label)??t;return{id:t,kind:e.party===`app`?`app`:n,label:i&&!a.startsWith(`@`)?`@@concierge`:a,...q(`concierge`,i?!0:void 0),...q(`machineID`,G(e.machineID)),...q(`harness`,G(e.harness)),...q(`parentID`,G(e.parentID)),...q(`rootID`,G(e.rootID)),...q(`supervisorID`,G(e.supervisorID)),...q(`launchID`,G(e.launchID)),depth:K(e.depth)??0,...q(`status`,r&&Ct.has(r)?r:void 0),...q(`online`,typeof e.online==`boolean`?e.online:void 0),roles:vt(e.roles),workspaceIDs:vt(e.workspaceIDs),teamIDs:vt(e.teamIDs),harnesses:vt(e.harnesses),...q(`project`,G(e.project)),...q(`lastSeen`,K(e.lastSeen)),tags:vt(e.tags),...q(`labels`,bt(e.labels)),seats:xt(e.seats),...q(`name`,G(e.name)),projects:vt(e.projects),...q(`mode`,e.mode===`open`||e.mode===`restricted`?e.mode:void 0),...q(`paused`,e.paused===!0||void 0),...q(`metadata`,bt(e.metadata)),...q(`entryRole`,G(e.entryRole))}}function Tt(e,t){if(!W(e))return;let n=G(e.id),r=G(e.kind),i=G(e.from),a=G(e.to);if(n&&r&&ht.includes(r)&&i&&a&&t.has(i)&&t.has(a))return{id:n,kind:r,from:i,to:a,count:K(e.count)??0,lastAt:K(e.lastAt)??0,...q(`firstAt`,K(e.firstAt)),...q(`states`,yt(e.states)),...q(`delivery`,yt(e.delivery)),...q(`declined`,K(e.declined)||void 0),...q(`denied`,K(e.denied)||void 0),...q(`roleAddressed`,K(e.roleAddressed)||void 0),...q(`teamID`,G(e.teamID)),...q(`permitted`,typeof e.permitted==`boolean`?e.permitted:void 0),...q(`kinds`,vt(e.kinds).length?vt(e.kinds):void 0)}}function Et(e){if(!W(e)||e.v!==1||!Array.isArray(e.nodes)||!Array.isArray(e.edges))return;let t=new Map;for(let n of e.nodes){let e=wt(n);e&&!t.has(e.id)&&t.set(e.id,e)}t.has(`hub`)||t.set(`hub`,{id:`hub`,kind:`hub`,label:`Hub`,depth:0,roles:[],workspaceIDs:[],teamIDs:[],harnesses:[],tags:[],seats:[],projects:[]});let n=new Set(t.keys()),r=e.edges.map(e=>Tt(e,n)).filter(e=>e!==void 0),i=K(e.at)??0,a=W(e.window)?{since:K(e.window.since)??0,until:K(e.window.until)??i}:{since:0,until:i},o=W(e.retention)?e.retention:{};return{at:i,window:a,nodes:[...t.values()],edges:r,truncated:o.truncated===!0,...q(`oldestAt`,K(o.oldestAt)),capped:e.capped===!0,hiddenMessages:W(e.hidden)?K(e.hidden.messages)??0:0}}function Dt(e,t,n=[]){let r=W(t)&&Array.isArray(t.sessions)?t.sessions:[],i=new Map(e.nodes.map(e=>[e.id,e]));for(let e of r){if(!W(e)||!G(e.sessionID)||e.archived===!0)continue;let t=e.sessionID,r=i.get(t);if(r&&r.kind!==`session`)continue;let a=(Array.isArray(e.teams)?e.teams.filter(W):[]).flatMap(e=>G(e.teamID)&&i.get(e.teamID)?.kind===`team`?vt(e.roles).map(t=>({teamID:e.teamID,role:t})):[]);if(!r&&(!a.length||!a.some(e=>i.get(e.teamID)?.kind===`team`)))continue;let o=G(e.machineID),s=n.find(e=>e.id===o);s&&!i.has(`machine:${s.id}`)&&i.set(`machine:${s.id}`,{id:`machine:${s.id}`,kind:`machine`,label:s.name,machineID:s.id,depth:0,roles:[],workspaceIDs:[],teamIDs:[],harnesses:[],tags:[],seats:[],projects:[]});let c=G(e.harness)??n.flatMap(e=>e.processes).find(e=>e.sessions.some(e=>e.id===t))?.harness,l=G(e.name)?`@${String(e.name).replace(/^@/,``)}`:void 0;i.set(t,{...r??{id:t,kind:`session`,label:t,depth:0,roles:[],workspaceIDs:[],teamIDs:[],harnesses:[],tags:[],seats:[],projects:[]},...r?.label===t||!r?{label:l??t}:{},...!r?.machineID&&o?{machineID:o}:{},...!r?.harness&&c?{harness:c}:{},...!r?.teamIDs.length||!r?.seats.length?{teamIDs:[...new Set([...r?.teamIDs??[],...a.map(e=>e.teamID)])]}:{},...r?.seats.length?{}:{seats:a},...r?{}:{status:e.online===!0?`idle`:`offline`,online:e.online===!0}})}return{...e,nodes:[...i.values()]}}function Ot(e){switch(e.status){case`working`:case`idle`:case`error`:case`offline`:case`ended`:return e.status;case`blocked`:return`needs-you`}return e.online===!1?`offline`:void 0}var kt={working:`Working`,idle:`Idle`,"needs-you":`Needs you`,error:`Error`,offline:`Offline`,ended:`Ended`},At={working:`--blue`,idle:`--faint`,"needs-you":`--warn`,error:`--err`,offline:`--line-2`,ended:`--faint`},jt={working:`pulse`,idle:`thin`,"needs-you":`thick`,error:`double`,offline:`broken`,ended:`none`},Mt=[`--accent`,`--blue`,`--violet`,`--orange`,`--ok`,`--warn`],Nt=[`●`,`▲`,`■`,`◆`,`★`,`⬟`,`✚`,`⬢`],Pt=[`opencode`,`claude-code`,`codex`],Ft={opencode:`sphere`,"claude-code":`cube`,codex:`octahedron`},It=e=>e.harness??`unknown`,Lt=e=>Ft[e]??(e===`unknown`?`dodecahedron`:`tetrahedron`),Rt=e=>e===`unknown`?`Unknown harness`:P(e),zt={sphere:`circle`,cube:`square`,octahedron:`diamond`,tetrahedron:`triangle`,dodecahedron:`pentagon`},Bt=[{kind:`msg`,label:`Message`,style:`solid`,color:`--accent`,description:`A message from one party to another; dashed while some are still queued or pending.`},{kind:`ask`,label:`Ask`,style:`solid`,color:`--blue`,description:`A question waiting for a reply; dashed while one is open.`},{kind:`reply`,label:`Reply`,style:`solid`,color:`--violet`,description:`Replies and declines to asks.`},{kind:`decision`,label:`Decision`,style:`solid`,color:`--warn`,description:`An ask to you, answered on the console; dashed while open.`},{kind:`launch`,label:`Launch`,style:`solid`,color:`--orange`,description:`Who started a session.`},{kind:`policy`,label:`Team path`,style:`dotted`,color:`--muted`,description:`A path a restricted team declares, with or without traffic: an arrowhead at one end is one-way, at both ends two-way; the kinds it permits are written on it.`},{kind:`denied`,label:`Denied attempt`,style:`dashed`,color:`--err`,description:`Messages a team's policy refused, marked with a cross and the count (only you see these).`}],Vt=()=>Bt,Ht=e=>Bt.find(t=>t.kind===e).label,Ut=e=>Bt.find(t=>t.kind===e).color,Wt={"1h":{ms:36e5,label:`Last hour`},"6h":{ms:216e5,label:`Last 6 hours`},"24h":{ms:864e5,label:`Last 24 hours`},"7d":{ms:6048e5,label:`Last 7 days`}},Gt={machine:`Machine`,harness:`Harness`,workspace:`Workspace`,team:`Team`,none:`Nothing`},Kt={window:`24h`,groupBy:`machine`,tree:!0,kinds:new Set([`msg`,`ask`,`reply`,`decision`,`launch`,`denied`]),search:``},qt=e=>`machine:${e}`,Jt=e=>e.kind===`hub`||e.kind===`user`||e.kind===`app`;function Yt(e,t){return e.nodes.filter(e=>e.kind===`machine`).sort((e,t)=>Number(t.online===!0)-Number(e.online===!0)||e.label.localeCompare(t.label)||(e.id<t.id?-1:1)).map((e,n)=>{let r=e.machineID??e.id.replace(/^machine:/,``);return{id:r,label:e.label,index:n,color:Mt[n%Mt.length],symbol:Nt[n%Nt.length],sessions:t.filter(e=>e.machineID===r).length,online:e.online===!0}})}function Xt(e){let t=new Map;for(let n of e)t.set(It(n),(t.get(It(n))??0)+1);let n=e=>Pt.includes(e)?Pt.indexOf(e):e===`unknown`?1e3:100;return[...t.keys()].sort((e,t)=>n(e)-n(t)||e.localeCompare(t)).map(e=>({id:e,label:Rt(e),shape:Lt(e),sessions:t.get(e)}))}function Zt(e){return e.every(e=>e.kind===`policy`)?`dotted`:an(e)?`dashed`:`solid`}var Qt=e=>Math.round((.6+Math.min(5.4,Math.log2(1+Math.max(0,e))*1.2))*100)/100,$t={holdMs:5e3,liveHalfLifeMs:45e3,idleHalfLifeMs:6e3,floor:.05};function en(e,t){if(!e.lastAt)return 0;let n=Math.max(0,t-e.lastAt);if(n<=$t.holdMs)return 1;if(n>9e5)return 0;let r=.5**((n-$t.holdMs)/(e.live?$t.liveHalfLifeMs:$t.idleHalfLifeMs));return r<$t.floor?0:r}function tn(e,t,n){return n.reducedMotion||t<=0?0:Math.max(1,Math.round(t*Math.min(4,1+Math.floor(Math.log2(Math.max(1,e))))))}var nn=e=>e===`dropped`||e===`expired`?`not delivered`:e,rn=e=>e&&Object.keys(e).length?Object.entries(e).map(([e,t])=>`${nn(e)} ${t}`).join(`, `):void 0,an=e=>e.some(e=>(e.delivery?.pending??0)+(e.delivery?.queued??0)>0||(e.states?.open??0)>0),J=(e,t,n,r=!1)=>({id:`s|${e}|${t}`,source:e,target:t,kind:`structure`,structure:n,count:0,lastAt:0,width:.4,style:`solid`,particles:0,edgeIDs:[],...r?{bridge:!0}:{}});function on(e,t,n,r){let i=new Map;for(let n of e){if(n.kind===`policy`)continue;let e=t(n.from),r=t(n.to);if(e===void 0||r===void 0||e===r)continue;let a=`${n.kind}|${e}|${r}`,o=i.get(a)??{kind:n.kind,source:e,target:r,edges:[]};o.edges.push(n),i.set(a,o)}return[...i.entries()].map(([e,t])=>{let i=t.edges.reduce((e,t)=>e+t.count,0),a=Math.max(0,...t.edges.map(e=>e.lastAt)),o=an(t.edges)||t.edges.some(e=>r(e.from)||r(e.to));return{id:t.edges.length===1?t.edges[0].id:e,source:t.source,target:t.target,kind:t.kind,count:i,lastAt:a,width:Qt(i),style:Zt(t.edges),particles:tn(i,en({lastAt:a,live:o},n.now),n),live:o,edgeIDs:t.edges.map(e=>e.id)}})}function sn(e,t,n){let r=new Map,i=new Map;for(let a of e){if(a.kind!==`policy`)continue;let e=t(a.from),o=t(a.to);if(e!==void 0&&o!==void 0&&e!==o){if(n.has(`policy`)&&a.permitted!==!1){let[t,n]=e<o?[e,o]:[o,e],i=`${t}|${n}|${a.teamID??``}`,s=r.get(i)??{a:t,b:n,directions:new Set,edges:[]};s.directions.add(`${e}|${o}`),s.edges.push(a),r.set(i,s)}if(n.has(`denied`)&&(a.denied??0)>0){let t=`${e}|${o}`,n=i.get(t)??{source:e,target:o,edges:[]};n.edges.push(a),i.set(t,n)}}}let a=[];for(let[e,t]of r){let n=t.directions.size>1,[r,i]=n?[t.a,t.b]:t.directions.values().next().value.split(`|`),o=t.edges.reduce((e,t)=>e+t.count,0),s=[...new Set(t.edges.flatMap(e=>e.kinds??[]))].sort();a.push({id:t.edges.length===1?t.edges[0].id:`policy|${e}`,source:r,target:i,kind:`policy`,count:o,lastAt:Math.max(0,...t.edges.map(e=>e.lastAt)),width:Qt(o),style:`dotted`,particles:0,edgeIDs:t.edges.map(e=>e.id),twoWay:n,kinds:s})}for(let[e,t]of i){let n=t.edges.reduce((e,t)=>e+(t.denied??0),0);a.push({id:`denied|${e}`,source:t.source,target:t.target,kind:`denied`,count:n,denied:n,lastAt:Math.max(0,...t.edges.map(e=>e.lastAt)),width:Qt(n),style:`dashed`,particles:0,edgeIDs:t.edges.map(e=>e.id)})}return a.sort((e,t)=>e.kind<t.kind?-1:e.kind>t.kind?1:e.source<t.source?-1:e.source>t.source?1:e.target<t.target?-1:+(e.target>t.target))}function cn(e,t=0,n=0){switch(e){case`hub`:return 14;case`machine`:case`cluster`:case`team`:return 7;case`role`:return 4.5;case`aggregate`:return Math.round((4+Math.log2(1+n)*2)*10)/10;case`user`:case`app`:return 5;default:return Math.round((3+Math.min(5,Math.log2(1+t)))*10)/10}}function ln(e){return e.split(/[\s,]+/).filter(Boolean).map(e=>{let t=e.indexOf(`=`);return t<=0?{key:t===0?e.slice(1):e}:{key:e.slice(0,t),value:e.slice(t+1)}}).filter(e=>e.key.length>0)}var Y=(e,t)=>`role:${e}:${t}`,un=`group:none`,dn={machine:`No machine`,harness:`Sessions`,workspace:`No workspace`,team:`No team`,none:`All sessions`},fn=(e,t)=>e.label.localeCompare(t.label)||(e.id<t.id?-1:+(e.id>t.id));function pn(e,t){let n=new Map(e.nodes.filter(e=>e.kind===`team`).map(e=>[e.id,e])),r=(e,t)=>e===t||n.get(e)?.name===t,[i,a]=t.role?t.role.split(`#`,2):[],o=t.project?.toLowerCase(),s=t.meta?ln(t.meta):[],c=(e,t)=>e!==void 0&&Object.prototype.hasOwnProperty.call(e,t.key)&&(t.value===void 0||e[t.key].toLowerCase()===t.value.toLowerCase());return e=>(!t.machine||e.machineID===t.machine)&&(!t.harness||It(e)===t.harness)&&(!t.states?.size||Ot(e)!==void 0&&t.states.has(Ot(e)))&&(!t.team||e.teamIDs.some(e=>r(e,t.team)))&&(!i||e.seats.some(e=>e.role===i&&(!a||r(e.teamID,a)))||!a&&e.roles.some(e=>e===i||e.split(`.`)[0]===i))&&(o===void 0||e.project?.toLowerCase()===o)&&(!t.workspace||e.workspaceIDs.includes(t.workspace))&&(!t.tag||e.tags.includes(t.tag)||e.teamIDs.some(e=>n.get(e)?.tags.includes(t.tag)))&&s.every(t=>c(e.labels,t)||e.teamIDs.some(e=>c(n.get(e)?.metadata,t)))}var mn=e=>!!(e.machine||e.harness||e.states?.size||e.team||e.role||e.project||e.workspace||e.tag||e.meta?.trim());function hn(e,t,n){let r=n.maxNodes??600,i=new Map(e.nodes.map(e=>[e.id,e])),a=e=>i.get(e)?.status===`working`,o=e.nodes.filter(e=>e.kind===`session`).filter(pn(e,t)),s=new Set(o.map(e=>e.id)),c=Yt(e,o),l=new Map(c.map(e=>[e.id,e.index])),u=new Map(c.map(e=>[e.id,e.label])),d=e.nodes.filter(Jt),f=t.groupBy===`machine`?e.nodes.filter(e=>e.kind===`machine`&&(!t.machine||e.machineID===t.machine)):[];f.sort((e,t)=>(l.get(e.machineID??``)??1e9)-(l.get(t.machineID??``)??1e9));let p=new Set(f.map(e=>e.id)),m=e.nodes.filter(e=>e.kind===`team`),h=new Set(m.map(e=>e.id)),g=t.team?new Set(m.filter(e=>e.id===t.team||e.name===t.team).map(e=>e.id)):void 0,_=t.groupBy===`team`,v=_?m.filter(e=>(!g||g.has(e.id))&&(!mn(t)||o.some(t=>t.teamIDs.includes(e.id)))).sort(fn):[],y=new Set(v.map(e=>e.id)),b=e=>{let t=e.roles.length?[...e.roles]:[...new Set(o.flatMap(t=>t.seats.filter(t=>t.teamID===e.id).map(e=>e.role)))].sort();return e.entryRole&&t.includes(e.entryRole)?[e.entryRole,...t.filter(t=>t!==e.entryRole)]:t},x=new Map(v.map(e=>[e.id,b(e)])),S=new Map;if(_){for(let t of e.nodes)if(t.kind===`session`)for(let e of t.seats)S.set(Y(e.teamID,e.role),(S.get(Y(e.teamID,e.role))??0)+1)}let C=e=>s.has(e)||i.has(e)&&Jt(i.get(e))||p.has(e),w=e=>e.kind===`policy`?t.kinds.has(`policy`)&&e.permitted!==!1||t.kinds.has(`denied`)&&(e.denied??0)>0:t.kinds.has(e.kind),T=e.edges.filter(e=>w(e)&&C(e.from)&&C(e.to)),E=new Map;for(let e of T)if(e.kind!==`policy`)for(let t of[e.from,e.to])E.set(t,(E.get(t)??0)+e.count);let D=new Map,O=e=>e.teamIDs.find(e=>y.has(e)),k=e=>{switch(t.groupBy){case`machine`:return e.machineID&&p.has(qt(e.machineID))?qt(e.machineID):`hub`;case`harness`:{let t=It(e),n=`group:harness:${t}`;return D.has(n)||D.set(n,{id:n,kind:`cluster`,label:Rt(t),shape:Lt(t),size:cn(`cluster`),match:!1,dim:!1}),n}case`workspace`:{let t=e.workspaceIDs[0];if(!t)return`hub`;let n=`group:workspace:${t}`;return D.has(n)||D.set(n,{id:n,kind:`cluster`,label:t,size:cn(`cluster`),match:!1,dim:!1}),n}case`team`:return O(e)??`hub`;case`none`:return`hub`}},A=e=>{let t=O(e);if(t===void 0)return;let n=e.seats.filter(e=>e.teamID===t);return n.find(e=>e.role===i.get(t)?.entryRole)??n[0]},j=e=>e.parentID!==void 0&&s.has(e.parentID)?e.parentID:void 0,M=e=>{let t=e;for(let e=0;e<64;e++){let e=j(t);if(e===void 0)break;t=i.get(e)}return t},ee=e=>{let n=e;for(let e=0;e<64&&!(_&&O(n)!==void 0);e++){let e=t.tree?j(n):void 0;if(e===void 0)break;n=i.get(e)}let r=k(n),a=r===`hub`?un:r;if(!_||a===un)return{group:a};let o=A(n);return o?{group:a,section:Y(o.teamID,o.role)}:{group:a}},te=e=>{let t=e.teamIDs.filter(e=>h.has(e)).length;return t>1?t:void 0},ne=(e,t)=>({id:e.id,kind:`session`,label:e.label,...q(`machine`,e.machineID===void 0?void 0:l.get(e.machineID)),harness:It(e),shape:Lt(It(e)),...q(`ring`,Ot(e)),size:cn(`session`,E.get(e.id)??0),match:!1,dim:!1,...q(`folded`,t),...q(`teams`,te(e)),...q(`seat`,_?A(e)?.role:void 0)}),re=e=>({id:e.id,kind:`team`,label:e.label,size:cn(`team`),match:!1,dim:!1,...q(`mode`,e.mode),...q(`paused`,e.paused)}),N=e=>[...d.map(e=>({id:e.id,kind:e.kind,label:e.label,size:cn(e.kind),match:!1,dim:!1})),...f.map(e=>({id:e.id,kind:`machine`,label:e.label,...q(`machine`,e.machineID===void 0?void 0:l.get(e.machineID)),...q(`ring`,e.online===!1?`offline`:void 0),size:cn(`machine`),match:!1,dim:!1})),...v.map(re),...e?v.flatMap(e=>x.get(e.id).map(t=>({id:Y(e.id,t),kind:`role`,label:t,size:cn(`role`),match:!1,dim:!1,team:e.id,entry:t===e.entryRole,staffed:S.get(Y(e.id,t))??0,vacant:!S.get(Y(e.id,t))}))):[]],P=e=>[...d.filter(e=>e.id!==`hub`).map(e=>J(`hub`,e.id,`party`)),...f.map(e=>J(`hub`,e.id,`group`)),...v.map(e=>J(`hub`,e.id,`group`)),...e?v.flatMap(e=>x.get(e.id).map(t=>J(e.id,Y(e.id,t),`team`))):[]],F=(e,t,n)=>{for(let r of n){let n=D.get(r);n&&(e.push(n),t.push(J(`hub`,r,`group`)))}},ie=(e,n,r,i)=>{let a=i&&t.tree?j(e):void 0;a!==void 0&&n.push(J(a,e.id,`tree`));let o=_?A(e):void 0;if(o)n.push(J(Y(o.teamID,o.role),e.id,`seat`));else if(a===void 0){let t=k(e);r.add(t),n.push(J(t,e.id,`group`))}if(_)for(let t of e.seats)t!==o&&y.has(t.teamID)&&x.get(t.teamID).includes(t.role)&&n.push(J(Y(t.teamID,t.role),e.id,`seat`,!0))},I=new Map,L=`full`,R=N(!0),z=P(!0),B=new Set;for(let e of o)R.push(ne(e)),ie(e,z,B,!0),I.set(e.id,ee(e));F(R,z,B),z.push(...on(T,e=>e,n,a),...sn(T,e=>e,t.kinds));let V=!1;if(R.length>r){L=`roots`;let e=new Map;for(let t of o){let n=M(t);e.set(n.id,(e.get(n.id)??0)+(n.id===t.id?0:1))}R=N(!0),z=P(!0),B.clear(),I.clear();for(let[t,n]of e){let e=i.get(t);R.push(ne(e,n||void 0)),ie(e,z,B,!1),I.set(t,ee(e))}F(R,z,B);let c=e=>s.has(e)?M(i.get(e)).id:e;if(z.push(...on(T,c,n,a),...sn(T,c,t.kinds)),R.length>r){if(t.groupBy===`none`)V=!0;else{L=`groups`;let e=new Map,c=e=>`agg:${k(M(e))}`;for(let t of o)e.set(c(t),(e.get(c(t))??0)+1);R=N(!1),z=P(!1),B.clear(),I.clear();for(let[t,n]of e){let e=t.slice(4);B.add(e);let r=D.get(e)??R.find(t=>t.id===e);R.push({id:t,kind:`aggregate`,label:`${n} sessions${r&&r.id!==`hub`?` · ${r.label}`:``}`,...q(`machine`,r?.machine),size:cn(`aggregate`,0,n),match:!1,dim:!1,folded:n}),z.push(J(e,t,`group`)),I.set(t,{group:e===`hub`?un:e})}F(R,z,B);let l=e=>s.has(e)?c(i.get(e)):e;z.push(...on(T,l,n,a),...sn(T,l,t.kinds)),R.length>r&&(V=!0)}}}let ae=t.search.trim().toLowerCase(),H=0;return ae&&(R=R.map(e=>{let t=i.get(e.id),n=e=>Object.entries(e??{}).map(([e,t])=>`${e}=${t}`),r=[e.label,e.id,...t?.roles??[],...(t?.seats??[]).map(e=>e.role),t?.project??``,t?.name??``,...t?.tags??[],...n(t?.labels),...n(t?.metadata),t?.kind===`session`&&t.machineID?u.get(t.machineID)??``:``].join(`
|
|
5
|
+
`).toLowerCase().includes(ae);return r&&H++,{...e,match:r,dim:!r}})),{groups:U(),teams:v.map(e=>({id:e.id,label:e.label,...q(`mode`,e.mode),...q(`paused`,e.paused),...q(`entryRole`,e.entryRole),members:o.filter(t=>t.teamIDs.includes(e.id)).length})),nodes:R,links:z,machines:c,harnesses:Xt(o),lod:L,tooLarge:V,matches:H,sessionIDs:o.map(e=>e.id),edgeIDs:T.map(e=>e.id),messages:T.filter(e=>e.kind!==`policy`).reduce((e,t)=>e+t.count,0),now:n.now};function U(){let e=new Map,n=(t,n=[{members:[]}])=>e.set(t.id,{group:t,sections:n}),r=L!==`groups`;for(let e of f)n({id:e.id,label:e.label,kind:`machine`,...q(`machine`,e.machineID===void 0?void 0:l.get(e.machineID)),online:e.online===!0});let a=Xt(o).map(e=>`group:harness:${e.id}`),s=[...D.values()].sort(t.groupBy===`harness`?(e,t)=>a.indexOf(e.id)-a.indexOf(t.id):fn);for(let e of s)(B.has(e.id)||[...I.values()].some(t=>t.group===e.id))&&n({id:e.id,label:e.label,kind:t.groupBy});for(let e of v)n({id:e.id,label:e.label,kind:`team`,...q(`mode`,e.mode),...q(`paused`,e.paused),...q(`entryRole`,e.entryRole)},r?x.get(e.id).map(t=>({id:Y(e.id,t),label:t,entry:t===e.entryRole,members:[]})):[{members:[]}]);let c=()=>e.get(un)??(n({id:un,label:dn[t.groupBy],kind:`none`}),e.get(un)),u=[...I.keys()],d=new Map;for(let e of u){let t=i.get(e)?.parentID;t!==void 0&&I.has(t)&&(d.get(t)??d.set(t,[]).get(t)).push(e)}let p=new Set,m=(t,n)=>{if(p.has(t))return;p.add(t);let r=I.get(t),i=e.get(r.group)??c();if(((r.section===void 0?void 0:i.sections.find(e=>e.id===r.section))??i.sections.find(e=>e.id===void 0)??(i.sections.push({label:`Members`,members:[]}),i.sections.at(-1))).members.push(t),n<64)for(let e of d.get(t)??[])m(e,n+1)};for(let e of u){let t=i.get(e)?.parentID;(t===void 0||!I.has(t))&&m(e,0)}for(let e of u)m(e,0);let h=[...e.values()].filter(e=>e.group.id!==un),g=e.get(un);return g&&h.push(g),h.map(e=>({...e.group,sections:e.sections.map(e=>({...q(`id`,e.id),...q(`label`,e.label),...e.entry===void 0?{}:{entry:e.entry},members:e.members}))}))}}function gn(e){return e.chosen===`list`?{mode:`list`,reason:`chosen`}:e.tooLarge?{mode:`list`,reason:`large`}:e.chosen===`2d`?{mode:`2d`}:e.webgl?{mode:`3d`}:{mode:`2d`,reason:`webgl`}}function _n(e){let t={};for(let n of e){let e=Ot(n);e&&(t[e]=(t[e]??0)+1)}return t}var vn=`app:concierge`;function yn(e){if(e.id===vn)return`service`;if(e.concierge)return e.status===`ended`||/ \(previous\)$/.test(e.label)?`previous`:`current`}function bn(e,t){let n=e.nodes.find(e=>e.id===t);if(!n)return;let r=t=>e.nodes.find(e=>e.id===t)?.label??t,i=e.edges.filter(e=>e.kind!==`policy`),a=e.nodes.filter(e=>e.kind===`session`),o=n.kind===`machine`?new Set(a.filter(e=>e.machineID===n.machineID).map(e=>e.id)):void 0,s=i.filter(e=>n.kind===`hub`?!0:o?o.has(e.from)||o.has(e.to):e.from===t||e.to===t),c={},l=new Map,u=0,d=0;for(let e of s){if(c[e.kind]=(c[e.kind]??0)+e.count,n.kind===`hub`||o)continue;e.from===t&&(u+=e.count),e.to===t&&(d+=e.count);let r=e.from===t?e.to:e.from;l.set(r,(l.get(r)??0)+e.count)}let f=n.machineID?e.nodes.find(e=>e.kind===`machine`&&e.machineID===n.machineID)?.label:void 0,p=e.nodes.filter(e=>e.kind===`machine`);return{id:t,kind:n.kind,title:n.label,...q(`ring`,Ot(n)),...q(`machine`,f),...q(`harness`,n.kind===`session`?Rt(It(n)):void 0),...q(`project`,n.project),roles:n.roles,workspaceIDs:n.workspaceIDs,...q(`parentID`,n.parentID),...q(`supervisorID`,n.supervisorID),...q(`supervisorLabel`,n.supervisorID?r(n.supervisorID):void 0),...q(`launchID`,n.launchID),...q(`concierge`,n.concierge),...q(`conciergeRole`,yn(n)),children:a.filter(e=>e.parentID===t).map(e=>e.id),sent:u,received:d,routed:s.reduce((e,t)=>e+t.count,0),byKind:c,peers:[...l.entries()].map(([e,t])=>({id:e,label:r(e),count:t})).sort((e,t)=>t.count-e.count||e.label.localeCompare(t.label)),...n.kind===`hub`?{states:_n(a),machinesOnline:{online:p.filter(e=>e.online).length,total:p.length}}:{},...o?{states:_n(a.filter(e=>o.has(e.id)))}:{},...q(`online`,n.online),...q(`lastSeen`,n.lastSeen),openable:n.kind===`session`,seats:n.seats.map(e=>({teamID:e.teamID,team:r(e.teamID),role:e.role})),...q(`labels`,n.labels),tags:n.tags,...n.kind===`team`?{team:m(n)}:{}};function m(e){let t=e.entryRole?[e.entryRole,...e.roles.filter(t=>t!==e.entryRole)]:[...e.roles],n=e=>t.includes(e)?t.indexOf(e):t.length,r=a.flatMap(t=>t.seats.filter(t=>t.teamID===e.id).map(e=>({id:t.id,label:t.label,role:e.role}))).sort((e,t)=>n(e.role)-n(t.role)||e.role.localeCompare(t.role)||e.label.localeCompare(t.label));return{...q(`mode`,e.mode),...q(`entryRole`,e.entryRole),...q(`paused`,e.paused),tags:e.tags,...q(`metadata`,e.metadata),members:r}}}function xn(e,t){let n=e.edges.find(e=>e.id===t);if(!n)return;let r=t=>e.nodes.find(e=>e.id===t)?.label??t;return{...n,label:Ht(n.kind),fromLabel:r(n.from),toLabel:r(n.to),...q(`teamLabel`,n.teamID?r(n.teamID):void 0)}}function Sn(e){if(!W(e)||!Array.isArray(e.messages))return{messages:[]};let t=[];for(let n of e.messages){if(!W(n))continue;let e=G(n.id),r=G(n.kind),i=G(n.state),a=G(n.from),o=G(n.to),s=K(n.at);e&&r&&i&&a&&o&&s!==void 0&&t.push({id:e,kind:r,state:i,from:a,to:o,at:s,...q(`delivery`,G(n.delivery)),...q(`decisionID`,G(n.decisionID))})}return{messages:t,...q(`cursor`,G(e.cursor))}}function Cn(e){if(!W(e)||!W(e.message))return;let t=e.message,n=G(t.id);if(!n||typeof t.text!=`string`)return;let r=W(e.answer)&&typeof e.answer.text==`string`?e.answer.text:void 0;return{id:n,text:t.text,...q(`at`,K(t.at)),...q(`kind`,G(t.kind)),...q(`state`,G(t.state)),...q(`answer`,r)}}function wn(e,t){let n=new Map(e.nodes.map(e=>[e.id,e])),r=new Set(t.sessionIDs),i=t.sessionIDs.map(e=>n.get(e)).filter(Boolean),a=t.edgeIDs.map(t=>e.edges.find(e=>e.id===t)).filter(Boolean),o=new Map,s=new Map;for(let e of a)e.kind!==`policy`&&(o.set(e.from,(o.get(e.from)??0)+e.count),s.set(e.to,(s.get(e.to)??0)+e.count));let c=new Map(t.machines.map(e=>[e.id,e.index])),l=new Map(t.machines.map(e=>[e.id,e.label])),u=(e,t)=>e.label.localeCompare(t.label)||(e.id<t.id?-1:1),d=e=>i.filter(t=>t.parentID===e).sort(u),f=i.filter(e=>!e.parentID||!r.has(e.parentID)).sort((e,t)=>(c.get(e.machineID??``)??1e9)-(c.get(t.machineID??``)??1e9)||u(e,t)),p=[],m=(e,t)=>{let n=Ot(e);if(p.push({id:e.id,label:e.label,machine:e.machineID&&l.get(e.machineID)||`—`,harness:Rt(It(e)),state:n?kt[n]:`—`,depth:t,sent:o.get(e.id)??0,received:s.get(e.id)??0}),t<64)for(let n of d(e.id))m(n,t+1)};for(let e of f)m(e,0);let h=e=>n.get(e)?.label??e;return{nodes:p,edges:a.map(e=>({id:e.id,kind:Ht(e.kind),from:h(e.from),to:h(e.to),count:e.count,lastAt:e.lastAt,style:Zt([e])})).sort((e,t)=>t.count-e.count||t.lastAt-e.lastAt)}}var Tn=(e,t)=>`/api/agent/graph?since=${t-Wt[e.window].ms}&until=${t}`,En=new Set([`catalog`,`status`,`decision`,`agent`,`resync`]),Dn=e=>typeof e.type==`string`&&En.has(e.type),On=[`3d`,`2d`,`list`],kn=`watchtower.view`,An=`watchtower.presets`,jn=`watchtower.`,Mn=`birdsEye.`;function Nn(e){try{let t=[];for(let n=0;n<e.length;n++){let r=e.key(n);r?.startsWith(Mn)&&t.push(r)}for(let n of t)try{let t=e.getItem(n),r=jn+n.slice(9);t!==null&&e.getItem(r)===null&&e.setItem(r,t),e.removeItem(n)}catch{}}catch{}}var Pn=e=>e!==null&&e in Wt,Fn=e=>e!==null&&e in Gt,In=e=>typeof e==`string`&&On.includes(e),Ln=[[`machine`,`machine`],[`harness`,`harness`],[`team`,`team`],[`role`,`role`],[`project`,`project`],[`workspace`,`ws`],[`tag`,`tag`],[`meta`,`meta`],[`q`,`q`]],Rn=200,zn=(e,t)=>e.length===t.size&&e.every(e=>t.has(e)),Bn=e=>In(e)?e:void 0;function Vn(e,t){let n=new URLSearchParams(e),r=n.get(`window`),i=n.get(`group`),a=n.get(`view`),o=/^(node|edge):(.+)$/.exec(n.get(`sel`)??``),s={};for(let[e,t]of Ln){let r=n.get(t)?.trim();r&&(s[e]=r.slice(0,Rn))}let c=n.get(`state`),l=n.get(`kinds`),u=l===null?void 0:gt.filter(e=>l.split(`,`).includes(e));return{window:Pn(r)?r:Kt.window,view:In(a)?a:t??`3d`,groupBy:Fn(i)?i:Kt.groupBy,...o?{selected:{type:o[1],id:o[2]}}:{},...s,...c&&_t.includes(c)?{state:c}:{},...u&&!zn(u,Kt.kinds)?{kinds:u}:{},...n.get(`tree`)===`0`?{tree:!1}:{}}}function Hn(e,t=`3d`){let n=new URLSearchParams;e.window!==Kt.window&&n.set(`window`,e.window),(e.view!==`3d`||t!==`3d`)&&n.set(`view`,e.view),e.groupBy!==Kt.groupBy&&n.set(`group`,e.groupBy);for(let[t,r]of Ln)e[t]&&n.set(r,e[t]);e.state&&n.set(`state`,e.state),e.kinds&&!zn(e.kinds,Kt.kinds)&&n.set(`kinds`,gt.filter(t=>e.kinds.includes(t)).join(`,`)),e.tree===!1&&n.set(`tree`,`0`),e.selected&&n.set(`sel`,`${e.selected.type}:${e.selected.id}`);let r=n.toString();return r?`?${r}`:``}function Un(e){return{window:e.window,groupBy:e.groupBy,tree:e.tree!==!1,kinds:e.kinds?new Set(e.kinds):Kt.kinds,...e.state?{states:new Set([e.state])}:{},...q(`machine`,e.machine),...q(`harness`,e.harness),...q(`team`,e.team),...q(`role`,e.role),...q(`project`,e.project),...q(`workspace`,e.workspace),...q(`tag`,e.tag),...q(`meta`,e.meta),search:e.q??``}}function Wn(e){let t=e=>[...new Set(e)].sort((e,t)=>e.localeCompare(t)),n=e.nodes.filter(e=>e.kind===`session`),r=e.nodes.filter(e=>e.kind===`team`);return{teams:r.sort(fn).map(e=>({id:e.id,label:e.label})),roles:t([...n.flatMap(e=>[...e.roles,...e.seats.map(e=>e.role)]),...r.flatMap(e=>e.roles)]),projects:t(n.flatMap(e=>e.project?[e.project]:[])),workspaces:t(n.flatMap(e=>e.workspaceIDs)),tags:t([...n,...r].flatMap(e=>e.tags)),metaKeys:t([...n.flatMap(e=>Object.keys(e.labels??{})),...r.flatMap(e=>Object.keys(e.metadata??{}))])}}var Gn=e=>{let{selected:t,...n}=e;return Hn({...n,view:`3d`})};function Kn(e,t){return{...Vn(t,e.view),view:e.view,...e.selected?{selected:e.selected}:{}}}function qn(e){try{let t=JSON.parse(e??`[]`);return Array.isArray(t)?t.filter(e=>W(e)&&typeof e.name==`string`&&e.name.trim().length>0&&typeof e.search==`string`).map(e=>({name:e.name,search:e.search})).slice(-20):[]}catch{return[]}}function Jn(e,t,n){let r=t.trim().slice(0,60);if(!r)return[...e];let i=e.findIndex(e=>e.name===r);return(i>=0?e.map((e,t)=>t===i?{name:r,search:n}:e):[...e,{name:r,search:n}]).slice(-20)}var Yn=(e,t)=>e.filter(e=>e.name!==t);function Xn(e){return e instanceof re?{kind:`offline`,message:e.message}:e instanceof k?e.status===404&&e.code===`not_found`?{kind:`missing`,message:`This hub doesn't have the interaction graph yet.`}:e.status===403||e.status===401?{kind:`forbidden`,message:e.message||`This device may not read the interaction graph.`}:e.status===503?{kind:`offline`,message:e.message||`The hub is offline.`}:{kind:`error`,message:e.message}:{kind:`error`,message:e instanceof Error?e.message:String(e)}}async function Zn(e){let t=Et(await A(e));if(!t)throw Error(`The hub answered something that isn't an interaction graph`);return Dt(t,await A(`/api/agent/who`).catch(()=>void 0),F.machines??[])}var Qn=(e,t)=>`since=${t-Wt[e].ms}&until=${t}`;async function $n(e,t,n,r){let i=`/api/agent/graph/${e.type===`edge`?`edges`:`nodes`}/${j(e.id)}`;return Sn(await A(`${i}?${Qn(t,n)}&limit=50${r?`&cursor=${j(r)}`:``}`))}async function er(e){let t=Cn(await A(`/api/agent/messages/${j(e)}`));if(!t)throw Error(`The hub didn't return this message's text`);return t}var tr=`/api/agent/teams`,X=e=>`${tr}/${j(e)}`,Z=async(e,t,n,r)=>(await C(e,{method:t,...n===void 0?{}:{json:n},...r?{headers:{"idempotency-key":r}}:{}})).json().catch(()=>({}));function nr(e){let t=le(e);if(!t)throw Error(`The hub answered something that isn't a team`);return t}async function rr(){return((await A(`${tr}?limit=200`)).items??[]).map(e=>le({team:e})?.team).filter(e=>!!e).map(e=>({id:e.id,name:e.name,title:e.title,paused:e.paused,hasDraft:e.hasDraft}))}async function ir(e=`all`){return((await A(`${tr}?limit=200&state=${e}`)).items??[]).flatMap(e=>{let t=le({team:e}),n=ce(e);if(!t||!n)return[];let r=t.team;return[{id:r.id,name:r.name,title:r.title,mode:n.mode,entryRole:n.entryRole,paused:r.paused,state:r.state,hasDraft:r.hasDraft,tags:n.tags??[],roles:n.roles.length}]})}async function ar(e){let t=await A(`${X(e)}/status`),n=Re({roster:t.roster}),r=rt(t.intake);return{...n?{roster:n}:{},...r?{intake:r}:{}}}var or=async e=>pt(await A(`/api/teams/${j(e)}/hops`)),sr=async e=>pt(await(await C(`/api/teams/${j(e)}/renew`,{method:`POST`,json:{}})).json());async function cr(e,t=50){return Qe(await A(`${X(e)}/intake?limit=${t}`)).items}async function lr(e,t,n,r,i){return Ze((await Z(`${X(e)}/intake/${j(t)}/status`,`POST`,{status:n,expectedRevision:r,...i?{reason:i}:{}})).intake)}async function ur(e){return ot(await A(`${X(e)}/versions?limit=50`))}async function dr(e,t,n){return await Z(`${X(e)}/${t?`archive`:`restore`}`,`POST`,{expectedRevision:n}),fr(e)}var fr=async e=>nr(await A(X(e))),pr=async(e,t)=>nr(await Z(tr,`POST`,e,t));async function mr(e,t,n){return await Z(X(e),`PATCH`,De(t,n)),fr(e)}async function hr(e,t){return await Z(`${X(e)}/draft?expectedRevision=${t}`,`DELETE`),fr(e)}async function gr(e){let t=Me(await A(`${X(e)}/diff?to=draft`));if(!t)throw Error(`The hub didn't answer a diff`);return t}async function _r(e,t){return await Z(`${X(e)}/publish`,`POST`,{expectedRevision:t}),fr(e)}async function vr(e,t,n){return await Z(`${X(e)}/${t?`pause`:`resume`}`,`POST`,{expectedRevision:n}),fr(e)}async function yr(e){let t=Re(await A(`${X(e)}/roster`));if(!t)throw Error(`The hub didn't answer a roster`);return t}var br=(e,t,n,r)=>Z(`${X(e)}/staffing`,`PUT`,{role:t,sessionID:n},r),xr=(e,t,n)=>Z(`${X(e)}/staffing/launch`,`POST`,t,n),Sr=(e,t,n)=>Z(`${X(e)}/staffing/${j(t)}?expectedRevision=${n}`,`DELETE`);async function Cr(e,t,n){let r=await Z(`${X(e)}/intake`,`POST`,t,n),i=Ze(r.intake);return{id:String(r.intake?.id??``),status:String(r.intake?.status??`queued`),...i?{intake:i}:{}}}async function wr(){try{return((await A(`/api/agent/profiles?state=active&limit=200`)).items??[]).filter(e=>typeof e.id==`string`&&typeof e.latestVersion==`number`).map(e=>({id:e.id,title:String(e.title||e.name),version:e.latestVersion}))}catch{return[]}}var Tr=()=>crypto.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2)}`;function Er(e,t={}){let[n,r]=s(),[i,a]=s(``),[o,c]=s(),[l,u]=s(),[d,f]=s(),[m,h]=s(),[g,_]=s(),[v,y]=s(``),[b,x]=s(),[S,C]=s(!1),[w,T]=s(),E=()=>o()?.present,D=e=>JSON.stringify(e??null),O=p(()=>!!o()&&D(E())!==D(l())),A=p(()=>E()?xe(E()):[]),j=()=>n()?.team,M=()=>j()?.id??e,ee=p(()=>new Set(n()?.published.roles.map(e=>e.name)??[])),te=p(()=>n()&&E()?je(n().published,E()):void 0),ne=p(()=>(g()??[]).some(tt)),re=()=>t.onChanged?.(),N=async()=>{try{f(await yr(e))}catch{f(void 0)}},P=async()=>{if(t.intake)try{let[e,t]=await Promise.all([cr(M()),ar(M()).catch(()=>({}))]);_(e),y(``),t.intake&&h(t.intake)}catch(e){y(Le(e).message),g()||_([])}},F=(e,t)=>{let n=e.draft??e.published;r(e),u(n);let i=o();(!t||!i)&&c(Ce(n))},ie=async()=>{try{F(await fr(e),!1),await Promise.all([N(),P()])}catch(e){a(e instanceof k&&e.status===404?`This hub doesn't have that team (or teams at all).`:Le(e).message)}},I=async()=>{if(!S()&&n()){try{let t=await fr(e);t.team.revision!==j()?.revision&&F(t,O())}catch{}await Promise.all([N(),P()])}},L=async t=>{C(!0),x(void 0);try{await t()}catch(t){let n=Le(t);if(n.kind===`conflict`){try{F(await fr(e),!0),await N()}catch{}T(void 0),x({kind:`conflict`,text:`${n.message} Your edits are kept on top of the latest version: review them, then save or publish again — or discard your edits to see theirs.`})}else x({kind:n.kind,text:n.message,missing:n.missing})}finally{C(!1)}},R,z=e=>{if(!e.ok)return x(R={kind:`error`,text:e.error});R&&b()===R&&x(void 0),R=void 0,T(void 0),c(we(o(),e.spec))},B=()=>o()&&c(Te(o())),V=()=>o()&&c(Ee(o())),ae=e=>{e.target.matches(`input[type=text], input[type=search], input:not([type]), textarea`)||(e.metaKey||e.ctrlKey)&&e.key.toLowerCase()===`z`&&(e.preventDefault(),e.shiftKey?V():B())},H=async()=>{let t=await mr(e,E(),j().revision);return F(t,!1),t},U=()=>L(async()=>{await H(),x({kind:`ok`,text:`Draft saved. It isn't live until you publish it.`})}),oe=()=>L(async()=>{O()&&await H(),j().hasDraft?T(await gr(e)):x({kind:`ok`,text:`Nothing to publish: the draft matches version ${j().version}.`})}),se=()=>L(async()=>{let t=j().version,n=await _r(e,j().revision);F(n,!1),T(void 0),await N(),re(),x({kind:`ok`,text:n.team.version>t?`Published version ${n.team.version}.`:`Nothing changed: the draft matched the published version.`})}),ce=()=>L(async()=>{j().hasDraft?F(await hr(e,j().revision),!1):F(n(),!1),T(void 0),x({kind:`ok`,text:`Draft discarded.`})}),le=()=>L(async()=>{let t=!j().paused;F(await vr(e,t,j().revision),!0),re(),x({kind:`ok`,text:t?`Paused: the team takes no new work or members until you resume it.`:`Resumed: the team takes work again.`})}),ue=()=>L(async()=>{let t=j().state!==`archived`;F(await dr(e,t,j().revision),!0),re(),x({kind:`ok`,text:t?`Archived: its communication policy no longer applies. Seats are kept; restore it to use it again.`:`Restored: the team's policy applies again.`})}),de=Tr(),fe=async(t,n,r)=>{let i=!1;return await L(async()=>{await br(e,t,n,de),de=Tr(),await N(),re(),x({kind:`ok`,text:`${r} is staffed as ${t}.`}),i=!0}),i},pe=(t,n,r,i)=>L(async()=>{await Sr(e,t,n),await N(),re(),x({kind:`ok`,text:`${r} no longer holds ${i}.`})}),me=Tr(),he=async(t,n)=>{let r=!1;return await L(async()=>{let i=await xr(e,n,me);me=Tr(),await N(),x({kind:`ok`,text:`Launching a new ${t}${i.request?.id?` (request ${i.request.id})`:``}. It joins the role once the session starts.`}),r=!0}),r},ge=Tr();return{id:e,read:n,team:j,spec:E,hist:o,dirty:O,probs:A,roster:d,summary:m,items:g,intakeError:v,openWork:ne,notice:b,setNotice:x,busy:S,preview:w,setPreview:T,publishedRoles:ee,localPreview:te,loadError:i,blocked:()=>Se(A()),fieldProblem:(e,t)=>A().find(n=>n.field===e&&n.level===t)?.message,load:ie,refresh:I,loadRoster:N,loadIntake:P,apply:z,undo:B,redo:V,onKey:ae,saveDraft:U,review:oe,publish:se,discard:ce,togglePause:le,toggleArchive:ue,attach:fe,unstaff:pe,launch:he,submit:async e=>{let t=!1;return await L(async()=>{let r=await Cr(M(),e,ge);ge=Tr(),r.intake&&_([r.intake,...(g()??[]).filter(e=>e.id!==r.intake.id)]),x({kind:`ok`,text:`Task ${r.id} ${r.status}: it goes to the entry role (${n().published.entryRole}).`}),t=!0}),t&&P(),t},setIntake:(e,t)=>L(async()=>{let n=await lr(M(),e.id,t,e.revision);n&&_((g()??[]).map(e=>e.id===n.id?n:e)),x({kind:`ok`,text:`${e.title}: ${t===`cancelled`?`cancelled`:`marked ${t.replace(`_`,` `)}`}.`})})}}var Dr=_(`<p class="small muted">hub-wide: <!> (<!>)<!>. The effective limit is the lower of this and the hub-wide value.`),Or=_(`<p class="small warn">Capped by the hub ceiling (<!>): this team uses the lower hub-wide limit.`),kr=_(`<p class="small warn">This team will use the lower hub-wide limit.`),Q=_(`<input>`),Ar=_(`<p>Missing grants:`),jr=_(`<ul>`),Mr=_(`<p class=muted>Staffing never issues grants: grant these in Settings → Agents, or staff the role yourself here.`),Nr=_(`<div><p>`),Pr=_(`<li>`),Fr=_(`<span>`),Ir=_(`<label class=te-field><span>`),Lr=_(`<fieldset class=te-mode><legend>Communication</legend><label class=wt-check><input type=radio><span>Open team: everyone may message and ask everyone</span></label><label class=wt-check><input type=radio><span>Restricted paths: only the paths you draw`),Rr=_(`<span class="te-chip te-chip-warn">Paused: no new members or tasks`),zr=_(`<span class="te-chip te-chip-warn">Archived: its policy no longer applies`),Br=_(`<p class=te-status role=status aria-label="Team state"><span class=te-chip>`),Vr=_(`<div class=te-toolbar role=toolbar aria-label=Draft><button type=button class="btn small"aria-keyshortcuts=Control+Z>Undo</button><button type=button class="btn small"aria-keyshortcuts=Control+Shift+Z>Redo</button><button type=button class="btn small">Save draft</button><button type=button class="btn small primary">Review and publish…</button><button type=button class="btn small">Discard draft`),Hr=_(`<p class="muted te-pending">Unsaved: `),Ur=_(`<section class=te-preview role=region><h3>Publish version <!>?</h3><p class=muted>Delivery and staffing switch to the new version when you publish. Publishing is refused while sessions hold a role it removes.</p><div class=te-row><button type=button class="btn primary">Publish version </button><button type=button class=btn>Keep editing`),Wr=_(`<div role=alert class=te-problems><p>Fix these before saving:</p><ul>`),Gr=_(`<p>No changes against version <!>.`),Kr=_(`<fieldset><legend>Item budget (optional team override)</legend><p class="small muted">Effective: <!> wakes, <!> hours (<!>).</p><button type=button class="btn small">Use hub-wide item budget`),qr=_(`<fieldset><legend>Loop threshold (optional team override)</legend><p class="small muted">Effective: <!> messages / <!> min (<!>).</p><button type=button class="btn small">Use hub-wide loop threshold`),Jr=_(`<textarea>`),Yr=_(`<p class=te-err role=alert>`),Xr=_(`<ul class=te-roles aria-label=Roles>`),Zr=_(`<form class="te-row te-add"aria-label="Add role"><input type=text aria-label="New role name"placeholder="role name (dev)"><input type=text aria-label="New role label"placeholder="label (optional)"><button type=submit class="btn small">Add role`),Qr=_(`<span class=te-chip>new in draft`),$r=_(`<li class=te-role><div class=te-row><strong></strong><label class=wt-check><input type=radio><span></span></label><button type=button class="btn small">Remove</button></div><label class=wt-check><input type=checkbox><span>May contact sessions outside the team`),ei=_(`<p class=muted>Open team: every member may message and ask every other. The paths below are kept and apply again if you switch back to restricted.`),ti=_(`<ul class=te-paths aria-label=Paths>`),ni=_(`<form class="te-form te-connect"aria-label="Connect roles"><h4 class=te-form-title>Connect two roles</h4><div class=te-row><label class=te-field><span>From</span><select aria-label="Path from"><option value>Pick a role</option></select></label><label class=te-field><span>To</span><select aria-label="Path to"><option value>Pick a role</option></select></label></div><fieldset class=te-mode><legend>Direction</legend><label class=wt-check><input type=radio><span>One-way (from may contact to)</span></label><label class=wt-check><input type=radio><span>Two-way (both may contact each other)</span></label></fieldset><fieldset class=te-mode><legend>Permits</legend><label class=wt-check><input type=checkbox><span>Messages (msg)</span></label><label class=wt-check><input type=checkbox><span>Questions (ask)</span></label></fieldset><button type=submit class="btn small primary">Add path`),ri=_(`<p class=muted>No paths yet. `),ii=_(`<span class=te-err> — `),ai=_(`<li><span> <!> <!> · <!> · </span> <button type=button class="btn small">Edit</button><button type=button class="btn small">Remove`),oi=_(`<option>`),si=_(`<p><strong>Restricted.</strong> Members may only use these paths; the entry role <code></code> receives the team's work.`),ci=_(`<ul class=tm-edges>`),li=_(`<div class=tm-policy aria-label="Published communication">`),ui=_(`<p><strong>Open team.</strong> Every member may message and ask every other; the entry role <code></code> receives the team's work.`),di=_(`<p class=muted>No paths are published: members can't reach each other.`),fi=_(`<li><span class=tm-node></span><span class=tm-arrow></span><span class=tm-node></span><span class=muted> `),pi=_(`<p class=muted>Members unknown (the roster didn't load).`),mi=_(`<p class=muted>The team is paused: resume it to add members.`),hi=_(`<p class=muted>Tip: on the 2D canvas, drag a session onto a role to add it.`),gi=_(`<div class=tm-members>`),_i=_(`<span class=muted> `),vi=_(`<span class=te-chip>entry role: receives the work`),yi=_(`<span class="te-chip te-chip-warn">`),bi=_(`<span class="muted tm-count">`),xi=_(`<ul class=tm-seats>`),Si=_(`<div class="te-row tm-role-actions"><button type=button class="btn small primary">+ Add member</button><button type=button class="btn small">Launch new <!>…`),Ci=_(`<section class=tm-role role=group><header class=tm-role-head><div class=tm-role-name><strong>`),wi=_(`<p class=muted>Publish the draft to add members to <!>.`),Ti=_(`<p class="muted tm-empty">No members yet.`),Ei=_(`<li class=tm-seat><span aria-hidden=true></span><a class=tm-seat-name></a><span class="muted tm-seat-facts"></span><button type=button class="btn small">Unstaff`),Di=_(`<fieldset class=tm-choices><legend class=sr-only>Sessions`),Oi=_(`<p class=te-memberships role=status aria-label="Other memberships">`),ki=_(`<form><p class=muted>Pick a running session to hold <!>. A session may hold roles in several teams.</p><input type=search class=tm-search aria-label="Search sessions"placeholder="Search by name, machine, harness or team"><div class="dialog-actions tm-picker-actions"><button type=button class="btn small tm-launch-instead">Launch a new member instead…</button><button type=button class=btn>Cancel</button><button type=submit class="btn primary">Add to `),Ai=_(`<p class=muted>Loading sessions…`),ji=_(`<p class=muted>`),Mi=_(`<label class=tm-choice><input type=radio><span aria-hidden=true></span><span class=tm-choice-text><strong></strong><span class=muted> </span><span class=tm-choice-note>`),Ni=_(`<button type=button class="btn small">Cancel`),Pi=_(`<form class=te-form aria-label="Launch a new member"><h4 class=te-form-title>Launch a new member</h4><div class=te-row><button type=submit class="btn small primary">Launch member`),Fi=_(`<select><option value>Pick a role`),Ii=_(`<select><option value>Any machine (the hub picks)`),Li=_(`<select><option value>The role's default`),Ri=_(`<select><option value>The role's profile (or none)`),zi=_(`<option> (v<!>)`),Bi=_(`<select><option value>Default (idle)</option><option value=idle>Idle</option><option value=asked>Asked</option><option value=never>Never`),Vi=_(`<select><option value=worktree>New worktree</option><option value=checkout>The checkout itself</option><option value=clone>A fresh clone`),Hi=_(`<form class="te-form tm-submit"aria-label="Submit a task"><div class=te-row></div><div class=te-row><button type=submit class="btn primary">Submit task</button><span class=muted>It goes to the entry role (<!>) of the published team.`),Ui=_(`<select>`),Wi=_(`<p class=muted role=note>Couldn't refresh the tasks: `),Gi=_(`<ul class=tm-intake aria-label=Tasks>`),Ki=_(`<p class=muted>Loading tasks…`),qi=_(`<p class=muted>No tasks yet. Submitted tasks and their progress show up here.`),Ji=_(`<span class=muted>With`),Yi=_(`<a>`),Xi=_(`<a>Workspace assignment`),Zi=_(`<button type=button class="btn small">Mark done`),Qi=_(`<span class=tm-intake-actions><button type=button class="btn small">Cancel`),$i=_(`<li class=tm-intake-item><div class=tm-intake-head><strong class=tm-intake-title></strong><span></span></div><ol class=tm-steps aria-label=Progress></ol><p class="muted tm-intake-facts"></p><div class="te-row tm-intake-links">`),ea=_(`<span class=muted>Waiting for the entry role.`),ta=_(`<ul class=tm-versions aria-label=Versions>`),na=_(`<p class=muted>History unavailable: `),ra=_(`<p class=muted>Loading history…`),ia=_(`<span class=te-chip>live`),aa=_(`<li><strong>Version </strong><span class=muted> published `),oa=_(`<span class="tm-badge warn">stalled: hop cap`),sa=_(`<span role=alert class=tm-warn>`),ca=_(`<div class=tm-hops><span class=tm-hops-count title="The deepest agent-to-agent hop count among the team's members, and the team's effective hop limit"></span><button type=button class="btn small">`);function la(e){let[t,a]=s();y(()=>void A(`/api/agent/agent-limits`).then(a).catch(()=>void 0));let c=()=>Ge(e.value,t());return[n($,{label:`Agent hop limit (optional)`,children:n=>(()=>{var r=Q();return i(r,l(n,{type:`number`,min:`1`,get max(){return t()?.hopCeiling??1e4},get value(){return e.value??``},onChange:t=>e.change(t.currentTarget.value)}),!1,!1),r})()}),(()=>{var e=Dr(),n=e.firstChild.nextSibling,i=n.nextSibling.nextSibling,a=i.nextSibling.nextSibling;return a.nextSibling,u(e,()=>t()?.hopLimit??`unknown`,n),u(e,()=>t()?.sources.hopLimit??`unavailable`,i),u(e,(()=>{var e=r(()=>t()?.hopCeiling!==void 0);return()=>e()?`; ceiling ${t().hopCeiling}`:``})(),a),e})(),n(o,{get when(){return c()===`capped`},get children(){var e=Or(),n=e.firstChild.nextSibling;return n.nextSibling,u(e,()=>t().hopCeiling,n),e}}),n(o,{get when(){return c()===`lower-global`},get children(){return kr()}})]}function ua(e){return n(o,{get when(){return e.notice},children:e=>(()=>{var t=Nr(),r=t.firstChild;return u(r,()=>e().text),u(t,n(o,{get when(){return e().missing?.length},get children(){return[Ar(),(()=>{var t=jr();return u(t,n(c,{get each(){return[...e().missing]},children:e=>(()=>{var t=Pr();return u(t,e),t})()})),t})(),Mr()]}}),null),a(n=>{var r=`te-notice te-${e().kind}`,i=e().kind===`ok`?`status`:`alert`;return r!==n.e&&m(t,n.e=r),i!==n.t&&d(t,`role`,n.t=i),n},{e:void 0,t:void 0}),t})()})}var da=0;function $(e){let t=`te-f${++da}`,r=()=>e.error??e.warning;return(()=>{var i=Ir(),s=i.firstChild;return d(i,`for`,t),u(s,()=>e.label),u(i,()=>e.children({id:t,"aria-label":e.label,...r()?{"aria-describedby":`${t}-msg`}:{},...e.error?{"aria-invalid":!0}:{}}),null),u(i,n(o,{get when(){return r()},get children(){var n=Fr();return d(n,`id`,`${t}-msg`),u(n,r),a(()=>m(n,e.error?`te-err`:`te-warn`)),n}}),null),i})()}function fa(e){return(()=>{var t=Lr(),n=t.firstChild.nextSibling,r=n.firstChild,i=n.nextSibling.firstChild;return r.addEventListener(`change`,()=>e.onChange(`open`)),i.addEventListener(`change`,()=>e.onChange(`restricted`)),a(t=>{var n=e.name,a=e.name;return n!==t.e&&d(r,`name`,t.e=n),a!==t.t&&d(i,`name`,t.t=a),t},{e:void 0,t:void 0}),a(()=>r.checked=e.value===`open`),a(()=>i.checked=e.value===`restricted`),t})()}var pa=e=>e.direction===`two-way`?`⇄`:`→`;function ma(e){let t=e.c,r=()=>{let e=t.team();return e?t.dirty()?`Draft · unsaved edits`:e.hasDraft?`Draft saved · not published (version ${e.version} is live)`:`Published · version ${e.version}`:``};return(()=>{var e=Br(),i=e.firstChild;return u(i,r),u(e,n(o,{get when(){return t.team()?.paused},get children(){return Rr()}}),null),u(e,n(o,{get when(){return t.team()?.state===`archived`},get children(){return zr()}}),null),a(()=>d(e,`data-state`,t.dirty()?`dirty`:t.team()?.hasDraft?`draft`:`published`)),e})()}function ha(e){let t=e.c;return[(()=>{var e=Vr(),n=e.firstChild,r=n.nextSibling,i=r.nextSibling,o=i.nextSibling,s=o.nextSibling;return S(n,`click`,t.undo,!0),S(r,`click`,t.redo,!0),i.$$click=()=>void t.saveDraft(),o.$$click=()=>void t.review(),s.$$click=()=>void t.discard(),a(e=>{var a=!t.hist()?.past.length,c=!t.hist()?.future.length,l=!t.dirty()||t.busy()||t.blocked(),u=t.busy()||t.blocked()||!t.dirty()&&!t.team()?.hasDraft,d=t.busy()||!t.dirty()&&!t.team()?.hasDraft;return a!==e.e&&(n.disabled=e.e=a),c!==e.t&&(r.disabled=e.t=c),l!==e.a&&(i.disabled=e.a=l),u!==e.o&&(o.disabled=e.o=u),d!==e.i&&(s.disabled=e.i=d),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),e})(),n(o,{get when(){return r(()=>!!(t.dirty()&&t.localPreview()))()&&!Ie(t.localPreview())},get children(){var e=Hr();return e.firstChild,u(e,()=>Fe(t.localPreview()).join(` · `),null),e}}),n(o,{get when(){return t.preview()},get children(){var e=Ur(),r=e.firstChild,i=r.firstChild.nextSibling;i.nextSibling;var s=r.nextSibling,l=s.nextSibling.firstChild;l.firstChild;var f=l.nextSibling;return u(r,()=>t.team().version+1,i),u(e,n(o,{get when(){return!Ie(t.preview())},get fallback(){return(()=>{var e=Gr(),n=e.firstChild.nextSibling;return n.nextSibling,u(e,()=>t.team().version,n),e})()},get children(){var e=jr();return u(e,n(c,{get each(){return Fe(t.preview())},children:e=>(()=>{var t=Pr();return u(t,e),t})()})),e}}),s),l.$$click=()=>void t.publish(),u(l,()=>t.team().version+1,null),f.$$click=()=>t.setPreview(void 0),a(n=>{var i=`te-preview-${t.id}`,a=`te-preview-${t.id}`,o=t.busy();return i!==n.e&&d(e,`aria-labelledby`,n.e=i),a!==n.t&&d(r,`id`,n.t=a),o!==n.a&&(l.disabled=n.a=o),n},{e:void 0,t:void 0,a:void 0}),e}}),n(o,{get when(){return t.probs().some(e=>e.level===`error`)},get children(){var e=Wr(),r=e.firstChild.nextSibling;return u(r,n(c,{get each(){return t.probs().filter(e=>e.level===`error`)},children:e=>(()=>{var t=Pr();return u(t,()=>e.message),t})()})),e}})]}function ga(e){let t=e.c,c=()=>t.spec(),[d,f]=s();y(()=>void A(`/api/agent/agent-limits`).then(f).catch(()=>void 0));let p=()=>c().itemBudget??d()?.itemBudget,m=()=>c().loop??d()?.loop,h=(e,n)=>{let r=c().itemBudget??d()?.itemBudget;r&&t.apply(ve(c(),{itemBudgetWakes:e===`wakes`?n:String(r.wakes),itemBudgetHours:e===`hours`?n:String(r.hours)}))},g=(e,n)=>{let r=c().loop??d()?.loop;r&&t.apply(ve(c(),{loopMessages:e===`messages`?n:String(r.messages),loopWindowMinutes:e===`windowMinutes`?n:String(r.windowMinutes)}))};return[n($,{label:`Title`,get error(){return t.fieldProblem(`team`,`error`)},children:e=>(()=>{var n=Q();return i(n,l(e,{type:`text`,get value(){return c().title},onChange:e=>t.apply(ve(c(),{title:e.currentTarget.value}))}),!1,!1),n})()}),n($,{label:`Description`,children:e=>(()=>{var n=Jr();return i(n,l(e,{rows:`2`,get value(){return c().description??``},onChange:e=>t.apply(ve(c(),{description:e.currentTarget.value}))}),!1,!1),n})()}),n(la,{get value(){return c().hopLimit},change:e=>t.apply(ve(c(),{hopLimit:e}))}),(()=>{var e=Kr(),o=e.firstChild.nextSibling,s=o.firstChild.nextSibling,f=s.nextSibling.nextSibling,m=f.nextSibling.nextSibling;m.nextSibling;var g=o.nextSibling;return u(o,()=>p()?.wakes??`unknown`,s),u(o,()=>p()?.hours??`unknown`,f),u(o,(()=>{var e=r(()=>!!c().itemBudget);return()=>e()?`team override`:d()?.sources.itemBudget??`loading`})(),m),u(e,n($,{label:`Team item budget wakes`,children:e=>(()=>{var t=Q();return i(t,l(e,{type:`number`,min:`10`,max:`5000`,get disabled(){return!d()},get value(){return p()?.wakes??``},onChange:e=>h(`wakes`,e.currentTarget.value)}),!1,!1),t})()}),g),u(e,n($,{label:`Team item budget hours`,children:e=>(()=>{var t=Q();return i(t,l(e,{type:`number`,min:`1`,max:`720`,get disabled(){return!d()},get value(){return p()?.hours??``},onChange:e=>h(`hours`,e.currentTarget.value)}),!1,!1),t})()}),g),g.$$click=()=>t.apply(ve(c(),{itemBudgetWakes:``,itemBudgetHours:``})),a(()=>g.disabled=!c().itemBudget),e})(),(()=>{var e=qr(),o=e.firstChild.nextSibling,s=o.firstChild.nextSibling,f=s.nextSibling.nextSibling,p=f.nextSibling.nextSibling;p.nextSibling;var h=o.nextSibling;return u(o,()=>m()?.messages??`unknown`,s),u(o,()=>m()?.windowMinutes??`unknown`,f),u(o,(()=>{var e=r(()=>!!c().loop);return()=>e()?`team override`:d()?.sources.loop??`loading`})(),p),u(e,n($,{label:`Team loop messages`,children:e=>(()=>{var t=Q();return i(t,l(e,{type:`number`,min:`4`,max:`200`,get disabled(){return!d()},get value(){return m()?.messages??``},onChange:e=>g(`messages`,e.currentTarget.value)}),!1,!1),t})()}),h),u(e,n($,{label:`Team loop window minutes`,children:e=>(()=>{var t=Q();return i(t,l(e,{type:`number`,min:`5`,max:`240`,get disabled(){return!d()},get value(){return m()?.windowMinutes??``},onChange:e=>g(`windowMinutes`,e.currentTarget.value)}),!1,!1),t})()}),h),h.$$click=()=>t.apply(ve(c(),{loopMessages:``,loopWindowMinutes:``})),a(()=>h.disabled=!c().loop),e})(),n($,{label:`Tags (comma separated)`,children:e=>(()=>{var n=Q();return i(n,l(e,{type:`text`,get value(){return ye(c())},onChange:e=>t.apply(ve(c(),{tags:e.currentTarget.value}))}),!1,!1),n})()}),n($,{label:`Metadata (key=value per line)`,children:e=>(()=>{var n=Jr();return i(n,l(e,{rows:`2`,get value(){return be(c())},onChange:e=>t.apply(ve(c(),{metadata:e.currentTarget.value}))}),!1,!1),n})()}),n(o,{get when(){return e.withMode},get children(){return n(fa,{get value(){return c().mode},onChange:e=>t.apply(_e(c(),e)),get name(){return`te-mode-${t.id}`}})}})]}function _a(e){let r=e.c,f=()=>r.spec(),[p,m]=s(``),[h,g]=s(``);return[n(o,{get when(){return r.fieldProblem(`entry`,`error`)||r.fieldProblem(`roles`,`error`)},get children(){var e=Yr();return u(e,()=>r.fieldProblem(`entry`,`error`)??r.fieldProblem(`roles`,`error`)),e}}),(()=>{var s=Xr();return u(s,n(c,{get each(){return[...f().roles]},children:s=>(()=>{var c=$r(),p=c.firstChild,m=p.firstChild,h=m.nextSibling,g=h.firstChild,_=g.nextSibling,v=h.nextSibling,y=p.nextSibling,b=y.firstChild;return u(m,()=>s.name),u(p,n(o,{get when(){return!r.publishedRoles().has(s.name)},get children(){return Qr()}}),h),g.addEventListener(`change`,()=>r.apply(me(f(),s.name))),u(_,()=>f().entryRole===s.name?`★ Entry role`:`Entry role`),v.$$click=()=>r.apply(fe(f(),s.name)),u(c,n($,{get label(){return`Label of ${s.name}`},get warning(){return r.fieldProblem(`role:${s.name}`,`warning`)},children:n=>(()=>{var a=Q();return t(t=>e.roleInput?.(s.name,t),a),i(a,l(n,{type:`text`,get value(){return s.label??``},onChange:e=>r.apply(pe(f(),s.name,{label:e.currentTarget.value}))}),!1,!1),a})()}),y),b.addEventListener(`change`,e=>r.apply(pe(f(),s.name,{externalContact:e.currentTarget.checked}))),a(e=>{var t=s.name,n=`te-entry-${r.id}`,i=`Entry role: ${s.name}`,a=f().entryRole===s.name,o=`Remove role ${s.name}`;return t!==e.e&&d(c,`data-role`,e.e=t),n!==e.t&&d(g,`name`,e.t=n),i!==e.a&&d(g,`aria-label`,e.a=i),a!==e.o&&(v.disabled=e.o=a),o!==e.i&&d(v,`aria-label`,e.i=o),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),a(()=>g.checked=f().entryRole===s.name),a(()=>b.checked=s.externalContact===!0),c})()})),s})(),(()=>{var e=Zr(),t=e.firstChild,n=t.nextSibling,i=n.nextSibling;return e.addEventListener(`submit`,e=>{e.preventDefault();let t=de(f(),p(),h());r.apply(t),t.ok&&(m(``),g(``))}),t.$$input=e=>m(e.currentTarget.value),n.$$input=e=>g(e.currentTarget.value),a(()=>i.disabled=!p().trim()),a(()=>t.value=p()),a(()=>n.value=h()),e})()]}function va(e){let r=e.c,i=()=>r.spec(),[l,f]=s(``),[p,h]=s(``),[g,_]=s(`one-way`),[v,b]=s(!0),[x,S]=s(!1),C,w=(e,t)=>{let n=i().edges.find(n=>n.from===e&&n.to===t);f(e),h(t),n&&(_(n.direction),b(n.kinds.includes(`msg`)),S(n.kinds.includes(`ask`))),queueMicrotask(()=>C?.focus())};y(()=>e.handle?.({prefill:w}));let T=e=>{e.preventDefault();let t=[...v()?[`msg`]:[],...x()?[`ask`]:[]];r.apply(he(i(),{from:l(),to:p(),kinds:t,direction:g()}))},E=e=>r.fieldProblem(`edge:${e.from}>${e.to}`,`error`);return[n(o,{get when(){return i().mode===`open`},get children(){return ei()}}),n(o,{get when(){return i().edges.length},get fallback(){return(()=>{var t=ri();return t.firstChild,u(t,()=>e.canvasHint?`Drag from one role to another on the 2D canvas, or use the form below.`:`Connect two roles below.`,null),t})()},get children(){var e=ti();return u(e,n(c,{get each(){return[...i().edges]},children:e=>(()=>{var t=ai(),s=t.firstChild,c=s.firstChild,l=c.nextSibling,f=l.nextSibling.nextSibling,p=f.nextSibling.nextSibling;p.nextSibling;var h=s.nextSibling,g=h.nextSibling,_=g.nextSibling;return u(s,()=>e.from,c),u(s,()=>pa(e),l),u(s,()=>e.to,f),u(s,()=>e.direction,p),u(s,()=>e.kinds.join(` + `),null),u(t,n(o,{get when(){return E(e)},get children(){var t=ii();return t.firstChild,u(t,()=>E(e),null),t}}),h),g.$$click=()=>w(e.from,e.to),_.$$click=()=>r.apply(ge(i(),e.from,e.to)),a(t=>{var n=E(e)?`te-err`:``,r=`Edit path ${e.from} to ${e.to}`,i=`Remove path ${e.from} to ${e.to}`;return n!==t.e&&m(s,t.e=n),r!==t.t&&d(g,`aria-label`,t.t=r),i!==t.a&&d(_,`aria-label`,t.a=i),t},{e:void 0,t:void 0,a:void 0}),t})()})),e}}),(()=>{var e=ni(),o=e.firstChild.nextSibling,s=o.firstChild,m=s.firstChild.nextSibling;m.firstChild;var y=s.nextSibling.firstChild.nextSibling;y.firstChild;var w=o.nextSibling,E=w.firstChild.nextSibling,D=E.firstChild,O=E.nextSibling.firstChild,k=w.nextSibling,A=k.firstChild.nextSibling,j=A.firstChild,M=A.nextSibling.firstChild,ee=k.nextSibling;e.addEventListener(`submit`,T),m.addEventListener(`change`,e=>f(e.currentTarget.value)),u(m,n(c,{get each(){return[...i().roles]},children:e=>(()=>{var t=oi();return u(t,()=>e.name),a(()=>t.selected=l()===e.name),a(()=>t.value=e.name),t})()}),null),y.addEventListener(`change`,e=>h(e.currentTarget.value)),u(y,n(c,{get each(){return[...i().roles]},children:e=>(()=>{var t=oi();return u(t,()=>e.name),a(()=>t.selected=p()===e.name),a(()=>t.value=e.name),t})()}),null),D.addEventListener(`change`,()=>_(`one-way`));var te=C;return typeof te==`function`?t(te,D):C=D,O.addEventListener(`change`,()=>_(`two-way`)),j.addEventListener(`change`,e=>b(e.currentTarget.checked)),M.addEventListener(`change`,e=>S(e.currentTarget.checked)),a(e=>{var t=`te-dir-${r.id}`,n=`te-dir-${r.id}`,i=!l()||!p();return t!==e.e&&d(D,`name`,e.e=t),n!==e.t&&d(O,`name`,e.t=n),i!==e.a&&(ee.disabled=e.a=i),e},{e:void 0,t:void 0,a:void 0}),a(()=>m.value=l()),a(()=>y.value=p()),a(()=>D.checked=g()===`one-way`),a(()=>O.checked=g()===`two-way`),a(()=>j.checked=v()),a(()=>M.checked=x()),e})()]}function ya(e){let t=()=>e.c.read().published;return(()=>{var e=li();return u(e,n(o,{get when(){return t().mode===`restricted`},get fallback(){return(()=>{var e=ui(),n=e.firstChild.nextSibling.nextSibling;return u(n,()=>t().entryRole),e})()},get children(){return[(()=>{var e=si(),n=e.firstChild.nextSibling.nextSibling;return u(n,()=>t().entryRole),e})(),n(o,{get when(){return t().edges.length},get fallback(){return di()},get children(){var e=ci();return u(e,n(c,{get each(){return[...t().edges]},children:e=>(()=>{var t=fi(),n=t.firstChild,r=n.nextSibling,i=r.nextSibling,o=i.nextSibling;return o.firstChild,u(n,()=>e.from),u(r,()=>pa(e)),u(i,()=>e.to),u(o,()=>e.kinds.join(` + `),null),a(()=>d(r,`aria-label`,e.direction===`two-way`?`both ways`:`to`)),t})()})),e}})]}})),e})()}function ba(e){let t=e.c,[i,f]=s(),[h,g]=s();y(()=>e.handle?.({add:(e,t)=>f({role:e,...t?{sessionID:t}:{}})}));let _=p(()=>{let e=t.roster()?.roles??(t.read()?.published.roles??[]).map(e=>({role:e.name,entry:e.name===t.read().published.entryRole,minMembers:e.minMembers??0,maxMembers:e.maxMembers??16,vacant:!0,understaffed:!1,launching:0,seats:[]})),n=(t.spec()?.roles??[]).filter(e=>!t.publishedRoles().has(e.name)).map(e=>({role:e.name,draftOnly:!0}));return[...e,...n]}),v=p(()=>new Map(_().map(e=>[e.role,e]))),b=p(()=>_().map(e=>e.role),void 0,{equals:(e,t)=>e.length===t.length&&e.every((e,n)=>e===t[n])}),x=e=>t.read()?.published.roles.find(t=>t.name===e)?.label,S=()=>!!t.team()?.paused;return(()=>{var s=gi();return u(s,n(o,{get when(){return!t.roster()},get children(){return pi()}}),null),u(s,n(o,{get when(){return S()},get children(){return mi()}}),null),u(s,n(c,{get each(){return b()},children:i=>{let s=()=>v().get(i),l=()=>{let e=s();return e&&`seats`in e?e:void 0},_=p(()=>l()?lt(l(),e.snap):[]),y=e=>_().find(t=>t.staffingID===e);return(()=>{var s=Ci(),p=s.firstChild,v=p.firstChild,b=v.firstChild;return d(s,`aria-label`,`Role ${i}`),d(s,`data-role`,i),u(b,()=>l()?.entry?`★ `:``,null),u(b,i,null),u(v,n(o,{get when(){return x(i)},get children(){var e=_i();return e.firstChild,u(e,()=>x(i),null),e}}),null),u(v,n(o,{get when(){return l()?.entry},get children(){return vi()}}),null),u(v,n(o,{get when(){return!l()},get children(){return Qr()}}),null),u(v,n(o,{get when(){return r(()=>!!l())()&&(l().vacant||l().understaffed)},get children(){var e=yi();return u(e,()=>l()?.vacant?`vacant`:`understaffed`),e}}),null),u(p,n(o,{get when(){return l()},get children(){var e=bi();return u(e,(()=>{var e=r(()=>!!l());return()=>e()?ft(l().seats.length,l().minMembers,l().maxMembers):``})(),null),u(e,(()=>{var e=r(()=>!!l()?.launching);return()=>e()?` · ${l().launching} launching`:``})(),null),e}}),null),u(s,n(o,{get when(){return!!l()},get fallback(){return(()=>{var e=wi(),t=e.firstChild.nextSibling;return t.nextSibling,u(e,i,t),e})()},get children(){return[n(o,{get when(){return _().length>0},get fallback(){return Ti()},get children(){var e=xi();return d(e,`aria-label`,`Members of ${i}`),u(e,n(c,{get each(){return _().map(e=>e.staffingID)},children:e=>n(o,{get when(){return y(e)},children:e=>(()=>{var n=Ei(),r=n.firstChild,o=r.nextSibling,s=o.nextSibling,c=s.nextSibling;return u(o,()=>e().name),u(s,()=>[e().online?`online`:e().presence===`unknown`?`presence unknown`:e().presence,e().stalled?`stalled: ${e().stalled}`:``,e().machine,e().harness,`gen ${e().generation}`].filter(Boolean).join(` · `)),c.$$click=()=>void t.unstaff(e().staffingID,e().revision,e().name,i),a(n=>{var a=`tm-dot ${e().online?`on`:`off`}`,s=te(e().sessionID),l=t.busy(),u=`Unstaff ${e().name} from ${i}`;return a!==n.e&&m(r,n.e=a),s!==n.t&&d(o,`href`,n.t=s),l!==n.a&&(c.disabled=n.a=l),u!==n.o&&d(c,`aria-label`,n.o=u),n},{e:void 0,t:void 0,a:void 0,o:void 0}),n})()})})),e}}),(()=>{var e=Si(),n=e.firstChild,r=n.nextSibling,o=r.firstChild.nextSibling;return o.nextSibling,n.$$click=()=>f({role:i}),d(n,`aria-label`,`Add member to ${i}`),r.$$click=()=>g(h()===i?void 0:i),u(r,i,o),a(e=>{var a=S()||t.busy(),o=S()||t.busy(),s=h()===i;return a!==e.e&&(n.disabled=e.e=a),o!==e.t&&(r.disabled=e.t=o),s!==e.a&&d(r,`aria-expanded`,e.a=s),e},{e:void 0,t:void 0,a:void 0}),e})(),n(o,{get when(){return h()===i},get children(){return n(Sa,{c:t,get snap(){return e.snap},role:i,onDone:()=>g(void 0)})}})]}}),null),s})()}}),null),u(s,n(o,{get when(){return e.canvasHint},get children(){return hi()}}),null),u(s,n(o,{get when(){return i()},keyed:!0,children:r=>n(xa,l({c:t,get snap(){return e.snap},get role(){return r.role}},()=>r.sessionID?{sessionID:r.sessionID}:{},{onClose:()=>f(void 0),onLaunch:()=>g(r.role)}))}),null),s})()}function xa(e){let i=e.c,[l,f]=s(``),[h,g]=s(e.sessionID??``),_,b=t=>({teamID:i.id,role:e.role,query:t,...i.roster()?{roster:i.roster().seats}:{}}),x=p(()=>ut(e.snap,b(l()))),C=p(()=>ut(e.snap,b(``)).find(e=>e.sessionID===h())),w=()=>C()?.name??h();y(()=>e.sessionID&&queueMicrotask(()=>_?.focus()));let T=async t=>{t.preventDefault(),h()&&await i.attach(e.role,h(),w())&&e.onClose()},E=e=>e.map(e=>`${e.team} (${e.role})`).join(`, `);return n(v,{open:!0,get title(){return`Add a member to ${e.role}`},get onClose(){return e.onClose},class:`tm-picker`,get children(){var s=ki(),p=s.firstChild,v=p.firstChild.nextSibling;v.nextSibling;var y=p.nextSibling,b=y.nextSibling,D=b.firstChild,O=D.nextSibling,k=O.nextSibling;k.firstChild,s.addEventListener(`submit`,T),u(p,()=>e.role,v),y.$$input=e=>f(e.currentTarget.value),u(s,n(o,{get when(){return e.snap},get fallback(){return Ai()},get children(){var t=Di();return t.firstChild,u(t,n(o,{get when(){return x().length},get fallback(){return(()=>{var e=ji();return u(e,()=>l()?`No session matches.`:`No running sessions.`),e})()},get children(){return n(c,{get each(){return x()},children:t=>(()=>{var n=Mi(),o=n.firstChild,s=o.nextSibling,c=s.nextSibling.firstChild,l=c.nextSibling;l.firstChild;var f=l.nextSibling;return o.addEventListener(`change`,()=>g(t.sessionID)),u(c,()=>t.name),u(l,()=>[t.online?`online`:`offline`,t.machine,t.harness].filter(Boolean).join(` · `),null),u(f,(()=>{var n=r(()=>!!t.seated);return()=>n()?`Already holds ${e.role}.`:r(()=>!!t.memberships.length)()?`Also in ${E([...t.memberships])}`:`In no other team`})(),null),u(f,(()=>{var e=r(()=>!(!t.here.length||t.seated));return()=>e()?` · here as ${t.here.join(`, `)}`:``})(),null),a(e=>{var r=h()===t.sessionID,a=!!t.seated,c=`tm-pick-${i.id}`,l=t.seated,u=`tm-dot ${t.online?`on`:`off`}`;return r!==e.e&&n.classList.toggle(`chosen`,e.e=r),a!==e.t&&n.classList.toggle(`seated`,e.t=a),c!==e.a&&d(o,`name`,e.a=c),l!==e.o&&(o.disabled=e.o=l),u!==e.i&&m(s,e.i=u),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),a(()=>o.value=t.sessionID),a(()=>o.checked=h()===t.sessionID),n})()})}}),null),t}}),b),u(s,n(o,{get when(){return h()},get children(){var e=Oi();return u(e,(()=>{var e=r(()=>!!C()?.memberships.length);return()=>e()?`${w()} is also in: ${C().memberships.map(e=>`${e.team} as ${e.role}`).join(`; `)}.`:`${w()} is in no other team.`})()),e}}),b),u(s,n(ua,{get notice(){return r(()=>i.notice()?.kind===`ok`)()?void 0:i.notice()}}),b),D.$$click=()=>{e.onClose(),e.onLaunch()},S(O,`click`,e.onClose,!0);var A=_;return typeof A==`function`?t(A,k):_=k,u(k,()=>e.role,null),a(t=>{var n=`Add a member to ${e.role}`,r=!e.sessionID,a=!h()||i.busy();return n!==t.e&&d(s,`aria-label`,t.e=n),r!==t.t&&(y.autofocus=t.t=r),a!==t.a&&(k.disabled=t.a=a),t},{e:void 0,t:void 0,a:void 0}),a(()=>y.value=l()),s}})}function Sa(e){let t=e.c,[r,d]=s(e.role??``),[f,m]=s(``),[h,g]=s(``),[_,v]=s(``),[b,x]=s(``),[S,C]=s(`worktree`),[w,T]=s(``),[E,D]=s(``),[O,k]=s(``),[A,j]=s(``),[M,ee]=s(``),[te,ne]=s(``),[re,N]=s(``),[P,F]=s(),[ie,I]=s([]);y(()=>void wr().then(I));let L=p(()=>(e.snap?.nodes??[]).filter(e=>e.kind===`machine`)),R=p(()=>{let e=L().find(e=>e.machineID===f());return e?.harnesses.length?e.harnesses:[`opencode`,`claude-code`,`codex`]}),z=e=>P()?.field===e?P().error:void 0,B=async n=>{n.preventDefault();let i=He({role:r(),machine:f(),harness:h(),profile:_(),repo:b(),mode:S(),branch:w(),remote:E(),name:O(),prompt:A(),model:M(),endWhen:te()||void 0,timeout:re()});if(!r())return F({field:`role`,error:`Choose a published role`});if(!i.ok)return F({field:i.field,error:i.error});F(void 0),await t.launch(r(),i.body)&&e.onDone?.()};return(()=>{var s=Pi(),p=s.firstChild.nextSibling,_=p.firstChild;return s.addEventListener(`submit`,B),u(s,n($,{label:`Role`,get error(){return z(`role`)},children:e=>(()=>{var o=Fi();return o.firstChild,i(o,l(e,{onChange:e=>d(e.currentTarget.value)}),!1,!0),u(o,n(c,{get each(){return[...t.publishedRoles()]},children:e=>(()=>{var t=oi();return t.value=e,u(t,e),a(()=>t.selected=r()===e),t})()}),null),o})()}),p),u(s,n($,{label:`Machine`,children:e=>(()=>{var t=Ii();return t.firstChild,i(t,l(e,{onChange:e=>m(e.currentTarget.value)}),!1,!0),u(t,n(c,{get each(){return L().map(e=>e.machineID??e.id)},children:e=>{let t=()=>L().find(t=>(t.machineID??t.id)===e);return(()=>{var n=oi();return n.value=e,u(n,()=>t()?.label??e,null),u(n,()=>t()?.online===!1?` (offline)`:``,null),a(()=>n.selected=f()===e),n})()}}),null),t})()}),p),u(s,n($,{label:`Harness`,children:e=>(()=>{var t=Li();return t.firstChild,i(t,l(e,{onChange:e=>g(e.currentTarget.value)}),!1,!0),u(t,n(c,{get each(){return R()},children:e=>(()=>{var t=oi();return t.value=e,u(t,e),a(()=>t.selected=h()===e),t})()}),null),t})()}),p),u(s,n($,{label:`Agent profile`,children:e=>(()=>{var t=Ri();return t.firstChild,i(t,l(e,{onChange:e=>v(e.currentTarget.value)}),!1,!0),u(t,n(c,{get each(){return ie()},children:e=>(()=>{var t=zi(),n=t.firstChild,r=n.nextSibling;return r.nextSibling,u(t,()=>e.title,n),u(t,()=>e.version,r),a(()=>t.value=`${e.id}@${e.version}`),t})()}),null),t})()}),p),u(s,n($,{label:`Model (optional)`,get error(){return z(`model`)},children:e=>(()=>{var t=Q();return i(t,l(e,{type:`text`,placeholder:`provider/model (role default if blank)`,get value(){return M()},onInput:e=>ee(e.currentTarget.value)}),!1,!1),t})()}),p),u(s,n($,{label:`End when`,children:e=>(()=>{var t=Bi();return i(t,l(e,{get value(){return te()},onChange:e=>ne(e.currentTarget.value)}),!1,!0),t})()}),p),u(s,n($,{label:`Timeout (optional)`,get error(){return z(`timeout`)},children:e=>(()=>{var t=Q();return i(t,l(e,{type:`text`,placeholder:`30m, 4h, 2d (blank: no timeout)`,get value(){return re()},onInput:e=>N(e.currentTarget.value)}),!1,!1),t})()}),p),u(s,n($,{label:`Repository on the machine`,get error(){return z(`repo`)},children:e=>(()=>{var t=Q();return i(t,l(e,{type:`text`,placeholder:`/home/you/projects/app`,get value(){return b()},onInput:e=>x(e.currentTarget.value)}),!1,!1),t})()}),p),u(s,n($,{label:`Workspace`,children:e=>(()=>{var t=Vi();return i(t,l(e,{onChange:e=>C(e.currentTarget.value)}),!1,!0),t})()}),p),u(s,n(o,{get when(){return S()===`worktree`},get children(){return n($,{label:`Branch`,get error(){return z(`branch`)},children:e=>(()=>{var t=Q();return i(t,l(e,{type:`text`,get value(){return w()},onInput:e=>T(e.currentTarget.value)}),!1,!1),t})()})}}),p),u(s,n(o,{get when(){return S()===`clone`},get children(){return n($,{label:`Remote`,get error(){return z(`remote`)},children:e=>(()=>{var t=Q();return i(t,l(e,{type:`text`,get value(){return E()},onInput:e=>D(e.currentTarget.value)}),!1,!1),t})()})}}),p),u(s,n($,{label:`Session name (optional)`,get error(){return z(`name`)},children:e=>(()=>{var t=Q();return i(t,l(e,{type:`text`,get value(){return O()},onInput:e=>k(e.currentTarget.value)}),!1,!1),t})()}),p),u(s,n($,{label:`First prompt (optional)`,children:e=>(()=>{var t=Jr();return i(t,l(e,{rows:`2`,get value(){return A()},onInput:e=>j(e.currentTarget.value)}),!1,!1),t})()}),p),u(p,n(o,{get when(){return e.onDone},get children(){var t=Ni();return t.$$click=()=>e.onDone(),t}}),null),a(()=>_.disabled=t.busy()||!!t.team()?.paused),s})()}function Ca(e){let t=e.c,[d,f]=s(``),[p,m]=s(``),[h,g]=s(`normal`),[_,v]=s(``),[y,b]=s(),x=e=>y()?.field===e?y().error:void 0,S=async e=>{e.preventDefault();let n=We({title:d(),brief:p(),priority:h(),criteria:_()});if(!n.ok)return b({field:n.field,error:n.error});b(void 0),await t.submit(n.body)&&(f(``),m(``),v(``))};return n(o,{get when(){return r(()=>!t.team()?.paused)()&&t.team()?.state!==`archived`},get fallback(){return(()=>{var e=ji();return u(e,()=>t.team()?.state===`archived`?`The team is archived: restore it to give it work.`:`The team is paused: it takes no new work. Resume it first.`),e})()},get children(){var e=Hi(),r=e.firstChild,o=r.nextSibling,s=o.firstChild,y=s.nextSibling,b=y.firstChild.nextSibling;return b.nextSibling,e.addEventListener(`submit`,S),u(e,n($,{label:`Task title`,get error(){return x(`title`)},children:e=>(()=>{var t=Q();return i(t,l(e,{type:`text`,placeholder:`What should the team do?`,get value(){return d()},onInput:e=>f(e.currentTarget.value)}),!1,!1),t})()}),r),u(e,n($,{label:`Brief`,get error(){return x(`brief`)},children:e=>(()=>{var t=Jr();return i(t,l(e,{rows:`3`,get value(){return p()},onInput:e=>m(e.currentTarget.value)}),!1,!1),t})()}),r),u(r,n($,{label:`Priority`,children:e=>(()=>{var t=Ui();return i(t,l(e,{onChange:e=>g(e.currentTarget.value)}),!1,!0),u(t,n(c,{get each(){return[...Ue]},children:e=>(()=>{var t=oi();return t.value=e,u(t,e),a(()=>t.selected=h()===e),t})()})),t})()})),u(e,n($,{label:`Done when (one per line)`,get error(){return x(`criteria`)},children:e=>(()=>{var t=Jr();return i(t,l(e,{rows:`2`,get value(){return _()},onInput:e=>v(e.currentTarget.value)}),!1,!1),t})()}),o),u(y,()=>t.read()?.published.entryRole,b),a(()=>s.disabled=t.busy()),e}})}var wa={queued:`Submitted`,routed:`Routed`,working:`Working`,closed:`Closed`};function Ta(e){let t=e.c,r=p(()=>e.limit?(t.items()??[]).slice(0,e.limit):t.items()??[]),i=t=>e.snap?.nodes.find(e=>e.id===t)?.label??t;return[n(o,{get when(){return t.intakeError()},get children(){var e=Wi();return e.firstChild,u(e,()=>t.intakeError(),null),e}}),n(o,{get when(){return t.items()},get fallback(){return Ki()},get children(){return n(o,{get when(){return r().length},get fallback(){return qi()},get children(){var e=Gi();return u(e,n(c,{get each(){return r().map(e=>e.id)},children:e=>n(o,{get when(){return r().find(t=>t.id===e)},children:e=>n(Ea,{c:t,get item(){return e()},sessionName:i})})})),e}})}})]}function Ea(e){let t=()=>e.item,r=()=>et(t());return(()=>{var i=$i(),s=i.firstChild,l=s.firstChild,f=l.nextSibling,p=s.nextSibling,h=p.nextSibling,g=h.nextSibling;return u(l,()=>t().title),u(f,()=>$e[r()]),u(p,n(c,{get each(){return nt(t())},children:e=>(()=>{var t=Pr();return u(t,()=>wa[e.step]),a(n=>{var r=`tm-step tm-step-${e.state}`,i=e.state===`current`||e.state===`blocked`?`step`:void 0;return r!==n.e&&m(t,n.e=r),i!==n.t&&d(t,`aria-current`,n.t=i),n},{e:void 0,t:void 0}),t})()})),u(h,()=>[t().priority===`normal`?void 0:`${t().priority} priority`,`submitted ${b(t().createdAt)}`,t().updatedAt===t().createdAt?void 0:`updated ${b(t().updatedAt)}`,t().lastError?`last routing error: ${t().lastError}`:void 0,t().reason?`reason: ${t().reason}`:void 0].filter(Boolean).join(` · `)),u(g,n(o,{get when(){return t().sessionID},get fallback(){return n(o,{get when(){return t().status===`queued`},get children(){return ea()}})},get children(){return[Ji(),(()=>{var n=Yi();return u(n,()=>e.sessionName(t().sessionID)),a(()=>d(n,`href`,te(t().sessionID))),n})()]}}),null),u(g,n(o,{get when(){return t().workspaceID},get children(){var e=Xi();return a(n=>{var r=`/watchtower?group=workspace&ws=${encodeURIComponent(t().workspaceID)}`,i=`Assignment ${t().assignmentID??``} in workspace ${t().workspaceID}`;return r!==n.e&&d(e,`href`,n.e=r),i!==n.t&&d(e,`title`,n.t=i),n},{e:void 0,t:void 0}),e}}),null),u(g,n(o,{get when(){return tt(t())},get children(){var r=Qi(),i=r.firstChild;return u(r,n(o,{get when(){return t().status===`routed`},get children(){var n=Zi();return n.$$click=()=>void e.c.setIntake(t(),`done`),a(r=>{var i=e.c.busy(),a=`Mark ${t().title} done`;return i!==r.e&&(n.disabled=r.e=i),a!==r.t&&d(n,`aria-label`,r.t=a),r},{e:void 0,t:void 0}),n}}),i),i.$$click=()=>void e.c.setIntake(t(),`cancelled`),a(n=>{var r=e.c.busy(),a=`Cancel ${t().title}`;return r!==n.e&&(i.disabled=n.e=r),a!==n.t&&d(i,`aria-label`,n.t=a),n},{e:void 0,t:void 0}),r}}),null),a(e=>{var t=r(),n=`tm-phase tm-phase-${r()}`;return t!==e.e&&d(i,`data-phase`,e.e=t),n!==e.t&&m(f,e.t=n),e},{e:void 0,t:void 0}),i})()}function Da(t){let[r,i]=s(),[a,l]=s(``);return f(e(()=>t.c.team()?.version,()=>void ur(t.c.id).then(e=>(i(e),l(``))).catch(e=>l(e.message)))),n(o,{get when(){return!a()},get fallback(){return(()=>{var e=na();return e.firstChild,u(e,a,null),e})()},get children(){return n(o,{get when(){return r()},get fallback(){return ra()},get children(){var e=ta();return u(e,n(c,{get each(){return r()},children:e=>(()=>{var r=aa(),i=r.firstChild;i.firstChild;var a=i.nextSibling;return a.firstChild,u(i,()=>e.version,null),u(a,()=>b(e.publishedAt),null),u(r,n(o,{get when(){return e.version===t.c.team()?.version},get children(){return ia()}}),null),r})()})),e}})}})}function Oa(e){let[t,r]=s(!1),[i,c]=s(``),l=async()=>{let t=e.hops;if(t?.stalled||await g(`Renew ${e.title}? Every member's hop count goes back to 0, so the team's agents can keep messaging each other for another ${t?.limit??`full`} hops without you.`,`Renew`)){r(!0),c(``);try{e.onRenewed(await sr(e.teamID))}catch(e){c(Le(e).message)}finally{r(!1)}}};return n(o,{get when(){return e.hops},children:r=>(()=>{var s=ca(),c=s.firstChild,f=c.nextSibling;return u(c,()=>mt(r()).text),u(s,n(o,{get when(){return r().stalled},get children(){return oa()}}),f),f.$$click=()=>void l(),u(f,()=>t()?`Renewing…`:`Renew`),u(s,n(o,{get when(){return i()},get children(){var e=sa();return u(e,i),e}}),null),a(n=>{var i=!!mt(r()).warn,a=!!r().stalled,o=t(),s=`Renew ${e.title}`;return i!==n.e&&c.classList.toggle(`tm-warn`,n.e=i),a!==n.t&&f.classList.toggle(`primary`,n.t=a),o!==n.a&&(f.disabled=n.a=o),s!==n.o&&d(f,`aria-label`,n.o=s),n},{e:void 0,t:void 0,a:void 0,o:void 0}),s})()})}x([`click`,`input`]);var ka=_(`<p role=alert class=wt-error>`),Aa=_(`<form class="te-form tm-create"aria-label="New team"><div class=te-row></div><p class=muted>Creating publishes version 1 at once. You add members and more roles next.</p><div class=dialog-actions><button type=button class=btn>Cancel</button><button type=submit class="btn primary">Create team`),ja=_(`<input>`),Ma=e=>`/teams/${encodeURIComponent(e)}`;function Na(e){let[t,r]=s(``),[c,d]=s(``),[f,p]=s(`restricted`),[m,h]=s(`pm`),[g,_]=s(`Project manager`),[y,b]=s(``),[x,C]=s(),[w,T]=s(!1),E=Tr(),D=e=>x()?.field===e?x().error:void 0,O=async n=>{n.preventDefault();let i=Oe({name:t(),title:c(),mode:f(),entryRole:m(),entryLabel:g(),hopLimit:y()});if(!i.ok)return C({field:i.field,error:i.error});C(void 0),T(!0);try{let t=await pr(i.body,E);E=Tr(),e.onClose(),r(``),d(``),e.onCreated?e.onCreated(t.team.id):ne(Ma(t.team.id))}catch(e){C({field:`form`,error:Le(e).message})}finally{T(!1)}};return n(v,{get open(){return e.open},title:`New team`,get onClose(){return e.onClose},get children(){var s=Aa(),v=s.firstChild,x=v.nextSibling,C=x.nextSibling.firstChild,T=C.nextSibling;return s.addEventListener(`submit`,O),u(s,n($,{label:`Name (the #team address, can't change)`,get error(){return D(`name`)},children:e=>(()=>{var n=ja();return i(n,l(e,{get value(){return t()},onInput:e=>r(e.currentTarget.value),placeholder:`product-a`,autofocus:!0}),!1,!1),n})()}),v),u(s,n($,{label:`Title`,get error(){return D(`title`)},children:e=>(()=>{var t=ja();return i(t,l(e,{get value(){return c()},onInput:e=>d(e.currentTarget.value),placeholder:`Product A`}),!1,!1),t})()}),v),u(s,n(fa,{get value(){return f()},onChange:p,name:`tm-new-mode`}),v),u(s,n($,{label:`Agent hop limit (optional; effective limit is the lower of team and hub-wide)`,get error(){return D(`hopLimit`)},children:e=>(()=>{var t=ja();return i(t,l(e,{type:`number`,min:`1`,max:`10000`,get value(){return y()},onInput:e=>b(e.currentTarget.value)}),!1,!1),t})()}),v),u(v,n($,{label:`Entry role (receives the team's work)`,get error(){return D(`entry`)},children:e=>(()=>{var t=ja();return i(t,l(e,{get value(){return m()},onInput:e=>h(e.currentTarget.value)}),!1,!1),t})()}),null),u(v,n($,{label:`Entry role label`,children:e=>(()=>{var t=ja();return i(t,l(e,{get value(){return g()},onInput:e=>_(e.currentTarget.value)}),!1,!1),t})()}),null),u(s,n(o,{get when(){return D(`form`)},get children(){var e=ka();return u(e,()=>D(`form`)),e}}),x),S(C,`click`,e.onClose,!0),a(()=>T.disabled=w()),s}})}x([`click`]);var Pa=new Set([`agent`,`status`,`catalog`,`resync`,`decision`]),Fa=2e3;function Ia(t,n){let r,i=Date.now(),a=!1,o=!1,s=!0,c=()=>document.visibilityState===`visible`,l=async()=>{if(!a&&s){a=!0,o=!1,i=Date.now();try{await t()}finally{a=!1,o?d():u()}}},u=()=>{clearTimeout(r);let e=dt({visible:c(),openWork:n()});e!==void 0&&s&&(r=setTimeout(()=>void l(),e))},d=()=>{c()&&s&&(o=!0,!a&&(clearTimeout(r),r=setTimeout(()=>void l(),Math.max(0,i+Fa-Date.now()))))};y(()=>{let e=ie(e=>typeof e.type==`string`&&Pa.has(e.type)&&d()),t=()=>c()?void l():clearTimeout(r);document.addEventListener(`visibilitychange`,t),u(),h(()=>{s=!1,e(),clearTimeout(r),document.removeEventListener(`visibilitychange`,t)})}),f(e(n,()=>!a&&!o&&u(),{defer:!0}))}export{Nn as $,_t as A,rn as B,er as C,gt as D,Gt as E,kn as F,xn as G,Ut as H,Wt as I,Tn as J,Wn as K,Kn as L,kt as M,jt as N,Mt as O,zt as P,wn as Q,hn as R,$n as S,Xn as T,Ht as U,nn as V,Vt as W,Rt as X,It as Y,Dn as Z,Er as _,ha as a,Gn as at,rr as b,ba as c,Hn as ct,va as d,Le as dt,bn as et,ya as f,Be as ft,Da as g,ma as h,ga as i,Bn as it,At as j,An as k,fa as l,at as lt,Ca as m,ze as mt,Na as n,qn as nt,Oa as o,gn as ot,_a as p,_e as pt,en as q,Ma as r,Vn as rt,Ta as s,Jn as st,Ia as t,Un as tt,ua as u,Ve as ut,or as v,Zn as w,ar as x,ir as y,Yn as z};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.te-status{flex-wrap:wrap;align-items:center;gap:6px;margin:0 0 6px;display:flex}.te-chip{border:1px solid var(--line-2);background:var(--bg);border-radius:999px;padding:2px 8px;font-size:.75rem;display:inline-block}.te-status[data-state=dirty] .te-chip:first-child,.te-status[data-state=draft] .te-chip:first-child{border-color:var(--warn);color:var(--text);background:color-mix(in srgb, var(--warn) 14%, transparent)}.te-status[data-state=published] .te-chip:first-child{border-color:var(--ok);background:color-mix(in srgb, var(--ok) 12%, transparent)}.te-chip-warn{border-color:var(--warn)}.te-toolbar,.te-row{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.te-toolbar{border-bottom:1px solid var(--line);margin-bottom:6px;padding:6px 0}.te-pending{margin:4px 0;font-size:.75rem}.te-form{border:1px solid var(--line);border-radius:var(--r);background:var(--bg);gap:8px;margin:8px 0;padding:10px;display:grid}.te-form-title{margin:0;font-size:.8125rem;font-weight:600}.te-field{flex:1;gap:2px;min-width:0;display:grid}.te-field>span:first-child{color:var(--muted);font-size:.75rem}:is(.te-panel,.tm-detail,.tm-dialog-form,.tm-picker) :is(input[type=text],input[type=search],input:not([type]),select,textarea),.dialog .te-form :is(input[type=text],input:not([type]),select,textarea){border:1px solid var(--line-2);border-radius:var(--r);background:var(--raise);min-height:32px;color:var(--text);font:inherit;box-sizing:border-box;width:100%;padding:4px 8px}.te-add input{flex:1;min-width:100px;width:auto!important}[aria-invalid=true]{border-color:var(--err)!important}.te-err{color:var(--err);font-size:.75rem}.te-warn{color:var(--warn);font-size:.75rem}.te-mode{border:none;gap:4px;margin:4px 0;padding:0;display:grid}.te-mode legend{color:var(--muted);margin-bottom:2px;padding:0;font-size:.75rem}.te-mode .wt-check,.te-role .wt-check,.tm-archived-toggle{align-items:center;gap:6px;display:flex}.te-roles,.te-paths,.te-list{gap:6px;margin:0;padding:0;list-style:none;display:grid}.te-role{border:1px solid var(--line);border-radius:var(--r);gap:4px;padding:6px 8px;display:grid}.te-notice{border:1px solid var(--line-2);border-radius:var(--r);background:var(--bg);margin:6px 0;padding:6px 10px}.te-notice p{margin:2px 0}.te-notice ul{margin:2px 0;padding-left:18px}.te-conflict,.te-needs_user,.te-error{border-color:var(--err)}.te-ok{border-color:var(--ok)}.te-preview{border:2px solid var(--accent);border-radius:var(--r);margin:6px 0;padding:8px 10px}.te-preview h3{text-transform:none;letter-spacing:0;color:var(--text);margin:0 0 6px;font-size:.9375rem}.te-preview ul{margin:0 0 6px;padding-left:18px}.te-problems{border:1px solid var(--err);border-radius:var(--r);color:var(--err);padding:6px 10px}.te-problems p,.te-problems ul{margin:2px 0}.te-memberships{color:var(--muted);margin:0;font-size:.75rem}.tm-members{gap:10px;display:grid}.tm-role{border:1px solid var(--line);border-radius:var(--r);background:var(--raise);gap:6px;padding:10px 12px;display:grid}.tm-role-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:6px;display:flex}.tm-role-name{flex-wrap:wrap;align-items:baseline;gap:6px;display:flex}.tm-count{font-size:.75rem}.tm-empty{margin:0;font-size:.8125rem}.tm-seats{gap:4px;margin:0;padding:0;list-style:none;display:grid}.tm-seat{border-radius:var(--r);background:var(--bg);flex-wrap:wrap;align-items:center;gap:6px 8px;padding:4px 6px;display:flex}.tm-seat-name{color:var(--text);font-weight:600}.tm-seat-facts{flex:1;min-width:140px;font-size:.75rem}.tm-dot{background:var(--faint,var(--muted));border-radius:50%;flex:none;width:8px;height:8px}.tm-dot.on{background:var(--ok)}.tm-role-actions{margin-top:2px}.tm-picker{width:min(560px,94vw)}.tm-picker form{gap:8px;display:grid}.tm-picker p{margin:0}.tm-choices{border:none;gap:4px;max-height:min(46vh,360px);margin:0;padding:0;display:grid;overflow:auto}.tm-choice{border:1px solid var(--line);border-radius:var(--r);cursor:pointer;align-items:flex-start;gap:8px;padding:8px;display:flex}.tm-choice .tm-dot{margin-top:6px}.tm-choice.chosen{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 10%, transparent)}.tm-choice.seated{opacity:.6;cursor:default}.tm-choice input{margin-top:3px}.tm-choice-text{gap:1px;min-width:0;display:grid}.tm-choice-note{color:var(--muted);font-size:.75rem}.tm-picker-actions{flex-wrap:wrap}.tm-launch-instead{margin-right:auto}.tm-submit{background:var(--raise)}.tm-intake{gap:8px;margin:0;padding:0;list-style:none;display:grid}.tm-intake-item{border:1px solid var(--line);border-radius:var(--r);background:var(--raise);gap:6px;padding:10px 12px;display:grid}.tm-intake-item[data-phase=blocked],.tm-intake-item[data-phase=failed]{border-color:var(--err)}.tm-intake-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:6px;display:flex}.tm-intake-title{overflow-wrap:anywhere}.tm-phase{border:1px solid var(--line-2);border-radius:999px;padding:2px 8px;font-size:.75rem;font-weight:600}.tm-phase-queued{color:var(--muted)}.tm-phase-routed,.tm-phase-in_progress{border-color:var(--accent);color:var(--text);background:color-mix(in srgb, var(--accent) 14%, transparent)}.tm-phase-blocked,.tm-phase-failed{border-color:var(--err);color:var(--err)}.tm-phase-done{border-color:var(--ok);color:var(--ok)}.tm-phase-cancelled{color:var(--muted);text-decoration:line-through}.tm-steps{color:var(--muted);grid-template-columns:repeat(4,1fr);gap:4px;margin:0;padding:0;font-size:.6875rem;list-style:none;display:grid}.tm-step{border-top:3px solid var(--line-2);padding-top:3px}.tm-step-done{border-color:var(--ok);color:var(--text)}.tm-step-current{border-color:var(--accent);color:var(--text);font-weight:600}.tm-step-blocked,.tm-step-failed{border-color:var(--err);color:var(--err);font-weight:600}.tm-step-skipped{border-top-style:dashed}.tm-intake-facts{margin:0;font-size:.75rem}.tm-intake-links{font-size:.8125rem}.tm-intake-actions{gap:6px;margin-left:auto;display:inline-flex}.tm-policy p{margin:0 0 6px}.tm-edges{gap:4px;margin:0;padding:0;list-style:none;display:grid}.tm-edges li{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.tm-node{border:1px solid var(--line-2);background:var(--raise);font-family:var(--mono);border-radius:999px;padding:2px 10px;font-size:.8125rem}.tm-arrow{color:var(--accent);font-weight:700}.tm-versions{gap:4px;margin:0;padding:0;list-style:none;display:grid}.tm-lede{max-width:70ch;margin:0 0 14px}.tm-cards{grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px;margin:0;padding:0;list-style:none;display:grid}.tm-card{border:1px solid var(--line);background:var(--raise);border-radius:10px;align-content:start;gap:8px;padding:12px 14px;display:grid;position:relative}.tm-card:hover{border-color:var(--line-2)}.tm-card:focus-within{outline:2px solid var(--accent);outline-offset:1px}.tm-card.archived{opacity:.7}.tm-card-head{flex-wrap:wrap;align-items:baseline;gap:6px;display:flex}.tm-card-title{color:var(--text);font-size:1rem;font-weight:600;text-decoration:none}.tm-card-title:after{content:"";border-radius:inherit;position:absolute;inset:0}.tm-card-title:focus-visible{outline:none}.tm-badges{flex-wrap:wrap;gap:4px;display:flex}.tm-badge{border:1px solid var(--line-2);background:var(--bg);border-radius:999px;padding:1px 8px;font-size:.75rem;display:inline-block}.tm-badge.warn{border-color:var(--warn);color:var(--warn)}.tm-mode-restricted{border-color:var(--accent)}.tm-card-facts{gap:2px;margin:0;font-size:.8125rem;display:grid}.tm-card-facts dd{margin:0}.tm-warn{color:var(--warn)}.tm-tags{flex-wrap:wrap;gap:4px;margin:0;padding:0;list-style:none;display:flex}.tm-tags li{background:var(--raise-2);color:var(--muted);border-radius:4px;padding:1px 6px;font-size:.6875rem}.tm-empty-state{border:1px dashed var(--line-2);text-align:center;border-radius:10px;justify-items:center;gap:10px;padding:24px;display:grid}.tm-archived-toggle{margin-top:12px;font-size:.8125rem}.tm-create{background:0 0;border:none;padding:0}.tm-back{color:var(--muted);margin-bottom:8px;font-size:.8125rem;text-decoration:none;display:inline-block}.tm-back:hover{color:var(--text)}.tm-detail{gap:8px;display:grid}.tm-head{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;display:flex}.tm-head-main{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.tm-handle{font-family:var(--mono)}a.btn{color:var(--text);text-decoration:none}.tm-draft-note{border:1px solid var(--warn);border-radius:var(--r);margin:0;padding:6px 10px;font-size:.8125rem}.tm-linkish{all:unset;color:var(--accent);cursor:pointer;text-decoration:underline}.tm-linkish:focus-visible{outline:2px solid var(--accent)}.tm-tabs{border-bottom:1px solid var(--line);scrollbar-width:none;gap:2px;display:flex;overflow-x:auto}.tm-tab{all:unset;cursor:pointer;color:var(--muted);white-space:nowrap;border-bottom:2px solid #0000;align-items:center;gap:6px;padding:8px 12px;font-size:.875rem;display:inline-flex}.tm-tab:hover{color:var(--text)}.tm-tab[aria-selected=true]{color:var(--text);border-bottom-color:var(--accent);font-weight:600}.tm-tab:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.tm-tab-count{background:var(--accent);min-width:18px;color:var(--accent-ink);text-align:center;border-radius:999px;padding:0 5px;font-size:.6875rem}.tm-panel{gap:12px;padding-top:6px;display:grid}.tm-section h2{margin:0 0 8px;font-size:.9375rem}@media (max-width:760px){.tm-cards{grid-template-columns:1fr}.tm-head{align-items:flex-start}.tm-tab{padding:8px 10px}.tm-intake-actions{margin-left:0}}
|
|
1
|
+
.te-status{flex-wrap:wrap;align-items:center;gap:6px;margin:0 0 6px;display:flex}.te-chip{border:1px solid var(--line-2);background:var(--bg);border-radius:999px;padding:2px 8px;font-size:.75rem;display:inline-block}.te-status[data-state=dirty] .te-chip:first-child,.te-status[data-state=draft] .te-chip:first-child{border-color:var(--warn);color:var(--text);background:color-mix(in srgb, var(--warn) 14%, transparent)}.te-status[data-state=published] .te-chip:first-child{border-color:var(--ok);background:color-mix(in srgb, var(--ok) 12%, transparent)}.te-chip-warn{border-color:var(--warn)}.te-toolbar,.te-row{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.te-toolbar{border-bottom:1px solid var(--line);margin-bottom:6px;padding:6px 0}.te-pending{margin:4px 0;font-size:.75rem}.te-form{border:1px solid var(--line);border-radius:var(--r);background:var(--bg);gap:8px;margin:8px 0;padding:10px;display:grid}.te-form-title{margin:0;font-size:.8125rem;font-weight:600}.te-field{flex:1;gap:2px;min-width:0;display:grid}.te-field>span:first-child{color:var(--muted);font-size:.75rem}:is(.te-panel,.tm-detail,.tm-dialog-form,.tm-picker) :is(input[type=text],input[type=search],input:not([type]),select,textarea),.dialog .te-form :is(input[type=text],input:not([type]),select,textarea){border:1px solid var(--line-2);border-radius:var(--r);background:var(--raise);min-height:32px;color:var(--text);font:inherit;box-sizing:border-box;width:100%;padding:4px 8px}.te-add input{flex:1;min-width:100px;width:auto!important}[aria-invalid=true]{border-color:var(--err)!important}.te-err{color:var(--err);font-size:.75rem}.te-warn{color:var(--warn);font-size:.75rem}.te-mode{border:none;gap:4px;margin:4px 0;padding:0;display:grid}.te-mode legend{color:var(--muted);margin-bottom:2px;padding:0;font-size:.75rem}.te-mode .wt-check,.te-role .wt-check,.tm-archived-toggle{align-items:center;gap:6px;display:flex}.te-roles,.te-paths,.te-list{gap:6px;margin:0;padding:0;list-style:none;display:grid}.te-role{border:1px solid var(--line);border-radius:var(--r);gap:4px;padding:6px 8px;display:grid}.te-notice{border:1px solid var(--line-2);border-radius:var(--r);background:var(--bg);margin:6px 0;padding:6px 10px}.te-notice p{margin:2px 0}.te-notice ul{margin:2px 0;padding-left:18px}.te-conflict,.te-needs_user,.te-error{border-color:var(--err)}.te-ok{border-color:var(--ok)}.te-preview{border:2px solid var(--accent);border-radius:var(--r);margin:6px 0;padding:8px 10px}.te-preview h3{text-transform:none;letter-spacing:0;color:var(--text);margin:0 0 6px;font-size:.9375rem}.te-preview ul{margin:0 0 6px;padding-left:18px}.te-problems{border:1px solid var(--err);border-radius:var(--r);color:var(--err);padding:6px 10px}.te-problems p,.te-problems ul{margin:2px 0}.te-memberships{color:var(--muted);margin:0;font-size:.75rem}.tm-members{gap:10px;display:grid}.tm-role{border:1px solid var(--line);border-radius:var(--r);background:var(--raise);gap:6px;padding:10px 12px;display:grid}.tm-role-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:6px;display:flex}.tm-role-name{flex-wrap:wrap;align-items:baseline;gap:6px;display:flex}.tm-count{font-size:.75rem}.tm-empty{margin:0;font-size:.8125rem}.tm-seats{gap:4px;margin:0;padding:0;list-style:none;display:grid}.tm-seat{border-radius:var(--r);background:var(--bg);flex-wrap:wrap;align-items:center;gap:6px 8px;padding:4px 6px;display:flex}.tm-seat-name{color:var(--text);font-weight:600}.tm-seat-facts{flex:1;min-width:140px;font-size:.75rem}.tm-dot{background:var(--faint,var(--muted));border-radius:50%;flex:none;width:8px;height:8px}.tm-dot.on{background:var(--ok)}.tm-role-actions{margin-top:2px}.tm-picker{width:min(560px,94vw)}.tm-picker form{gap:8px;display:grid}.tm-picker p{margin:0}.tm-choices{border:none;gap:4px;max-height:min(46vh,360px);margin:0;padding:0;display:grid;overflow:auto}.tm-choice{border:1px solid var(--line);border-radius:var(--r);cursor:pointer;align-items:flex-start;gap:8px;padding:8px;display:flex}.tm-choice .tm-dot{margin-top:6px}.tm-choice.chosen{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 10%, transparent)}.tm-choice.seated{opacity:.6;cursor:default}.tm-choice input{margin-top:3px}.tm-choice-text{gap:1px;min-width:0;display:grid}.tm-choice-note{color:var(--muted);font-size:.75rem}.tm-picker-actions{flex-wrap:wrap}.tm-launch-instead{margin-right:auto}.tm-submit{background:var(--raise)}.tm-intake{gap:8px;margin:0;padding:0;list-style:none;display:grid}.tm-intake-item{border:1px solid var(--line);border-radius:var(--r);background:var(--raise);gap:6px;padding:10px 12px;display:grid}.tm-intake-item[data-phase=blocked],.tm-intake-item[data-phase=failed]{border-color:var(--err)}.tm-intake-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:6px;display:flex}.tm-intake-title{overflow-wrap:anywhere}.tm-phase{border:1px solid var(--line-2);border-radius:999px;padding:2px 8px;font-size:.75rem;font-weight:600}.tm-phase-queued{color:var(--muted)}.tm-phase-routed,.tm-phase-in_progress{border-color:var(--accent);color:var(--text);background:color-mix(in srgb, var(--accent) 14%, transparent)}.tm-phase-blocked,.tm-phase-failed{border-color:var(--err);color:var(--err)}.tm-phase-done{border-color:var(--ok);color:var(--ok)}.tm-phase-cancelled{color:var(--muted);text-decoration:line-through}.tm-steps{color:var(--muted);grid-template-columns:repeat(4,1fr);gap:4px;margin:0;padding:0;font-size:.6875rem;list-style:none;display:grid}.tm-step{border-top:3px solid var(--line-2);padding-top:3px}.tm-step-done{border-color:var(--ok);color:var(--text)}.tm-step-current{border-color:var(--accent);color:var(--text);font-weight:600}.tm-step-blocked,.tm-step-failed{border-color:var(--err);color:var(--err);font-weight:600}.tm-step-skipped{border-top-style:dashed}.tm-intake-facts{margin:0;font-size:.75rem}.tm-intake-links{font-size:.8125rem}.tm-intake-actions{gap:6px;margin-left:auto;display:inline-flex}.tm-policy p{margin:0 0 6px}.tm-edges{gap:4px;margin:0;padding:0;list-style:none;display:grid}.tm-edges li{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.tm-node{border:1px solid var(--line-2);background:var(--raise);font-family:var(--mono);border-radius:999px;padding:2px 10px;font-size:.8125rem}.tm-arrow{color:var(--accent);font-weight:700}.tm-versions{gap:4px;margin:0;padding:0;list-style:none;display:grid}.tm-lede{max-width:70ch;margin:0 0 14px}.tm-cards{grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px;margin:0;padding:0;list-style:none;display:grid}.tm-card{border:1px solid var(--line);background:var(--raise);border-radius:10px;align-content:start;gap:8px;padding:12px 14px;display:grid;position:relative}.tm-card:hover{border-color:var(--line-2)}.tm-card:focus-within{outline:2px solid var(--accent);outline-offset:1px}.tm-card.archived{opacity:.7}.tm-card-head{flex-wrap:wrap;align-items:baseline;gap:6px;display:flex}.tm-card-title{color:var(--text);font-size:1rem;font-weight:600;text-decoration:none}.tm-card-title:after{content:"";border-radius:inherit;position:absolute;inset:0}.tm-card-title:focus-visible{outline:none}.tm-badges{flex-wrap:wrap;gap:4px;display:flex}.tm-badge{border:1px solid var(--line-2);background:var(--bg);border-radius:999px;padding:1px 8px;font-size:.75rem;display:inline-block}.tm-badge.warn{border-color:var(--warn);color:var(--warn)}.tm-mode-restricted{border-color:var(--accent)}.tm-card-facts{gap:2px;margin:0;font-size:.8125rem;display:grid}.tm-card-facts dd{margin:0}.tm-warn{color:var(--warn)}.tm-hops{z-index:1;flex-wrap:wrap;align-items:center;gap:6px;font-size:.85rem;display:flex;position:relative}.tm-tags{flex-wrap:wrap;gap:4px;margin:0;padding:0;list-style:none;display:flex}.tm-tags li{background:var(--raise-2);color:var(--muted);border-radius:4px;padding:1px 6px;font-size:.6875rem}.tm-empty-state{border:1px dashed var(--line-2);text-align:center;border-radius:10px;justify-items:center;gap:10px;padding:24px;display:grid}.tm-archived-toggle{margin-top:12px;font-size:.8125rem}.tm-create{background:0 0;border:none;padding:0}.tm-back{color:var(--muted);margin-bottom:8px;font-size:.8125rem;text-decoration:none;display:inline-block}.tm-back:hover{color:var(--text)}.tm-detail{gap:8px;display:grid}.tm-head{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;display:flex}.tm-head-main{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.tm-handle{font-family:var(--mono)}a.btn{color:var(--text);text-decoration:none}.tm-draft-note{border:1px solid var(--warn);border-radius:var(--r);margin:0;padding:6px 10px;font-size:.8125rem}.tm-linkish{all:unset;color:var(--accent);cursor:pointer;text-decoration:underline}.tm-linkish:focus-visible{outline:2px solid var(--accent)}.tm-tabs{border-bottom:1px solid var(--line);scrollbar-width:none;gap:2px;display:flex;overflow-x:auto}.tm-tab{all:unset;cursor:pointer;color:var(--muted);white-space:nowrap;border-bottom:2px solid #0000;align-items:center;gap:6px;padding:8px 12px;font-size:.875rem;display:inline-flex}.tm-tab:hover{color:var(--text)}.tm-tab[aria-selected=true]{color:var(--text);border-bottom-color:var(--accent);font-weight:600}.tm-tab:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.tm-tab-count{background:var(--accent);min-width:18px;color:var(--accent-ink);text-align:center;border-radius:999px;padding:0 5px;font-size:.6875rem}.tm-panel{gap:12px;padding-top:6px;display:grid}.tm-section h2{margin:0 0 8px;font-size:.9375rem}@media (max-width:760px){.tm-cards{grid-template-columns:1fr}.tm-head{align-items:flex-start}.tm-tab{padding:8px 10px}.tm-intake-actions{margin-left:0}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,B as t,E as n,G as r,V as i,j as a,k as o}from"./live-BmqLASSo.js";import{a as s,i as c,n as l,o as u,r as d}from"./Watchtower-DnvlJaU0.js";import{a as f,c as p,i as m,r as h,s as g,t as _}from"./safe-area-CkhEclGo.js";var v={w:76,h:58,pad:16,header:38,role:118,gap:40,band:120,party:120,roleRow:92},y=14,b=8,x=200,S=420,C=(e,t)=>Math.max(1,Math.min(t,Math.ceil(Math.sqrt(e*2))));function ee(e){let t=new Map,n=new Set(e.nodes.map(e=>e.id));t.set(`hub`,{x:0,y:0}),e.nodes.filter(e=>e.id!==`hub`&&(e.kind===`hub`||e.kind===`user`||e.kind===`app`)).forEach((e,n)=>t.set(e.id,{x:(n%2==0?-1:1)*v.party*(Math.floor(n/2)+1),y:0}));let r=e.groups.map(e=>{let t=e.sections.map(e=>{let t=e.id!==void 0,n=C(e.members.length,t?b:y),r=Math.max(1,Math.ceil(e.members.length/n));return{cols:n,rows:r,role:t,w:(t?v.role+v.w/2:0)+n*v.w,h:r*(t?v.roleRow:v.h)}});return{group:e,sections:t,w:Math.max((e.kind===`team`?S:x)-2*v.pad,...t.map(e=>e.w))+2*v.pad,h:v.header+t.reduce((e,t)=>e+t.h,0)+v.pad}}),i=r.reduce((e,t)=>e+(t.w+v.gap)*(t.h+v.gap),0),a=Math.max(...r.map(e=>e.w),Math.sqrt(i)*1.5,1),o=[],s=[],c=0;for(let e of r)s.length&&c+v.gap+e.w>a&&(o.push(s),s=[],c=0),c+=(s.length?v.gap:0)+e.w,s.push(e);s.length&&o.push(s);let l=[],u=v.band;for(let e of o){let r=-(e.reduce((e,t)=>e+t.w,0)+v.gap*(e.length-1))/2;for(let i of e){let{group:e}=i,a=[],o=u+v.header;e.sections.forEach((e,s)=>{let c=i.sections[s],l={x:r+v.pad,y:o,w:i.w-2*v.pad,h:c.h};a.push({...l,...e.id===void 0?{}:{id:e.id},...e.label===void 0?{}:{label:e.label},...e.entry===void 0?{}:{entry:e.entry}});let u=c.role?v.roleRow:v.h;e.id!==void 0&&n.has(e.id)&&t.set(e.id,{x:l.x+v.role/2,y:o+u/2});let d=l.x+(c.role?v.role+s%2*(v.w/2):0);e.members.forEach((e,n)=>t.set(e,{x:d+n%c.cols*v.w+v.w/2,y:o+Math.floor(n/c.cols)*u+u/2})),o+=c.h}),n.has(e.id)&&t.set(e.id,{x:r+v.pad+12,y:u+v.header/2}),l.push({id:e.id,label:e.label,kind:e.kind,x:r,y:u,w:i.w,h:i.h,...e.machine===void 0?{}:{machine:e.machine},...e.online===void 0?{}:{online:e.online},...e.mode===void 0?{}:{mode:e.mode},...e.paused===void 0?{}:{paused:e.paused},...e.entryRole===void 0?{}:{entryRole:e.entryRole},members:e.sections.reduce((e,t)=>e+t.members.length,0),sections:a}),r+=i.w+v.gap}u+=Math.max(...e.map(e=>e.h))+v.gap}let d=e.nodes.filter(e=>!t.has(e.id));d.forEach((e,n)=>t.set(e.id,{x:(n-(d.length-1)/2)*v.w,y:u+v.h/2}));let f=[],p=[];for(let e of t.values())f.push(e.x-v.w/2,e.x+v.w/2),p.push(e.y-v.h/2,e.y+v.h/2);for(let e of l)f.push(e.x,e.x+e.w),p.push(e.y,e.y+e.h);let m=Math.min(...f)-40,h=Math.min(...p)-40;return{positions:t,boxes:l,bounds:{x:m,y:h,w:Math.max(...f)+40-m,h:Math.max(...p)+40-h}}}function te(e,t,n,r){let i=Math.max(1,t.width-n.left-n.right),a=Math.max(1,t.height-n.top-n.bottom),o=Math.max(r.min,Math.min(r.max,Math.min(i/Math.max(1,e.w),a/Math.max(1,e.h))));return{k:o,x:n.left+i/2-(e.x+e.w/2)*o,y:n.top+a/2-(e.y+e.h/2)*o}}function ne(e,t,n){let r=t===void 0?void 0:e.get(t);if(!r)return e.keys().next().value;let i,a=1/0;for(let[o,s]of e){if(o===t)continue;let e=s.x-r.x,c=s.y-r.y,[l,u]=n===`right`?[e,c]:n===`left`?[-e,c]:n===`down`?[c,e]:[-c,e];if(l<=0||Math.abs(u)>l*2)continue;let d=l+2*Math.abs(u);d<a&&(a=d,i=o)}return i??t}var re={glow:!0,pulses:!0,labels:12},w=.04,ie=4,ae=.55,oe=9.5,T={w:180,h:120},E=`system-ui, -apple-system, sans-serif`,se=e=>e.kind===`hub`?22:e.kind===`role`?13:Math.max(8,Math.min(20,e.size*1.9)),D=e=>e.kind===`hub`||e.kind===`role`?13:e.kind===`aggregate`?se(e)*.8:e.kind===`session`?Math.max(5,Math.min(11,3+e.size)):8,ce=(e,t)=>e.length>t?`${e.slice(0,t-1)}…`:e;function le(e){let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)|0;return(t>>>0)%1e3/1e3}function ue(e,t){return e.kind===`hub`?t(`--accent`):e.kind===`user`||e.kind===`app`?t(`--text`):e.kind===`team`||e.kind===`role`?t(`--violet`):e.kind===`cluster`?t(`--muted`):e.machine===void 0?t(`--faint`):t(n[e.machine%n.length])}function de(e,t,n,r){e.beginPath(),e.roundRect(t-v.role/2+8,n-r,v.role-16,r*2,r)}function fe(e,t,n){let r=t.x-e.x,i=t.y-e.y,a={x:(e.x+t.x)/2-i*n,y:(e.y+t.y)/2+r*n};return{c:a,mid:{x:.25*e.x+.5*a.x+.25*t.x,y:.25*e.y+.5*a.y+.25*t.y}}}var pe=e=>e.kind===`structure`?e.bridge?.18:0:e.kind===`policy`?.22:e.kind===`denied`?-.22:.1;function me(e,t,n,r,i,a,o){let s=Math.atan2(n.y-t.y,n.x-t.x);e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(n.x-r*Math.cos(s-.45),n.y-r*Math.sin(s-.45)),e.lineTo(n.x-r*Math.cos(s+.45),n.y-r*Math.sin(s+.45)),e.closePath(),e.setLineDash([]),e.fillStyle=i?o:a,e.fill(),e.strokeStyle=a,e.lineWidth=1.4,e.stroke()}function he(e,t,n){let r=Math.hypot(e.x-t.x,e.y-t.y)||1;return{x:e.x-(e.x-t.x)/r*n,y:e.y-(e.y-t.y)/r*n}}function ge(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=r||i?Math.max(0,Math.min(1,((e.x-t.x)*r+(e.y-t.y)*i)/(r*r+i*i))):0;return Math.hypot(e.x-(t.x+a*r),e.y-(t.y+a*i))}function O(n,y){let b=document.createElement(`canvas`);b.className=`wt-canvas2d`;let x=b.getContext(`2d`);if(!x)throw Error(`This browser can't draw on a canvas`);let S=document.createElement(`canvas`);S.className=`wt-minimap`,S.setAttribute(`aria-hidden`,`true`),S.title=`Minimap: click to move the view`;let C=S.getContext(`2d`),O=document.createElement(`span`);O.className=`wt-tip wt-tip2d`,O.hidden=!0,n.append(b,S,O);let k,A,j=()=>`#888`,_e=!0,M,N,P,ve,F=n.clientWidth||300,I=n.clientHeight||150,L={k:1,x:F/2,y:80},R=!1,z=0,ye=0,be={s:1,ox:0,oy:0},B=new Map,xe=new Set,V=re,H=!1,U=!1,Se=0,Ce=0,we=new Map,Te=new Set,Ee=new Map,De=new Map,Oe=0,ke=!1,Ae=()=>window.devicePixelRatio||1,je=e=>({x:e.x*L.k+L.x,y:e.y*L.k+L.y}),W=(e,t)=>({x:(e-L.x)/L.k,y:(t-L.y)/L.k}),G=(e,t)=>{let n=b.getBoundingClientRect();return{x:e-n.left,y:t-n.top}},K=()=>{Ne=!0,z||=requestAnimationFrame(Qe)},q=document.createElement(`canvas`),Me=q.getContext(`2d`),J=x,Ne=!0,Pe=``,Y=(e,t)=>{cancelAnimationFrame(ye);let n={...e,k:Math.max(w,Math.min(ie,e.k))};if(!t||!_e){L=n,K();return}let r=L,i=performance.now(),a=e=>{let t=Math.min(1,(e-i)/260),o=1-(1-t)**3;L={k:r.k+(n.k-r.k)*o,x:r.x+(n.x-r.x)*o,y:r.y+(n.y-r.y)*o},Qe(),t<1&&(ye=requestAnimationFrame(a))};ye=requestAnimationFrame(a)},Fe=e=>{if(!A)return;let t=A.positions.get(`hub`);Y(U&&t?{k:1.3,x:F/2-t.x*1.3,y:I/2-t.y*1.3}:te(A.bounds,{width:F,height:I},_(n),{min:w,max:1.4}),e)},Ie=(e,t,n,r=!1)=>{let i=Math.max(w,Math.min(ie,L.k*n)),a=W(e,t);R=!0,Y({k:i,x:e-a.x*i,y:t-a.y*i},r)},Le=(e,t,n=L.k)=>Y({k:n,x:F/2-e.x*n,y:I/2-e.y*n},t);function Re(e){let t=J,n=e.kind===`team`,r=n&&e.mode===`restricted`,i=j(we.get(e.id)??`--line-2`);t.save(),t.beginPath(),t.roundRect(e.x,e.y,e.w,e.h,22),V.glow&&(t.shadowColor=u(i,H?.35:.22),t.shadowBlur=36*L.k),t.fillStyle=u(i,H?.075:.06),t.fill(),t.shadowBlur=0,t.lineWidth=n?1.6:1,t.setLineDash(r?[8,5]:e.online===!1?[4,4]:[]),t.strokeStyle=u(i,n?.65:.4),t.stroke(),t.setLineDash([]),e.sections.forEach((e,n)=>{e.entry&&(t.fillStyle=u(j(`--accent`),.09),t.beginPath(),t.roundRect(e.x,e.y+2,e.w,e.h-4,10),t.fill()),n>0&&e.id!==void 0&&(t.strokeStyle=u(i,.18),t.lineWidth=1,t.beginPath(),t.moveTo(e.x+10,e.y),t.lineTo(e.x+e.w-10,e.y),t.stroke())}),t.beginPath(),t.rect(e.x,e.y,e.w-8,v.header),t.clip();let a=e.x+v.pad+(xe.has(e.id)?30:4),o=e.y+v.header/2,s=ce(e.label,28);t.fillStyle=j(`--text`),t.font=`650 13px ${E}`,t.textBaseline=`middle`,t.fillText(s,a,o);let c=k?.teams.find(t=>t.id===e.id)?.members??e.members,l=n?`${r?`Restricted: declared paths only`:`Open: everyone may message everyone`}${e.paused?` · paused`:``} · ${c} seated`:`${e.members} ${e.members===1?`node`:`nodes`}${e.online===!1?` · offline`:``}`;t.fillStyle=j(`--muted`),t.font=`12px ${E}`,t.fillText(l,a+t.measureText(s).width+18,o),t.restore()}function ze(e,n){let r=n.get(e.source),i=n.get(e.target);if(!r||!i||e.kind===`structure`&&e.structure!==`tree`&&e.structure!==`party`&&e.structure!==`seat`&&!e.bridge)return;let a=J,o=B.get(e.source),s=B.get(e.target),{c,mid:l}=fe(r,i,pe(e)),d=e.kind===`structure`,f=d&&e.structure===`seat`,p=j(d?e.bridge||f?`--violet`:`--line-2`:t(e.kind)),m=qe(),h=!m||e.source===m||e.target===m;a.save(),a.globalAlpha=(o?.dim&&s?.dim?.15:1)*(h?1:.2),a.setLineDash(d?e.bridge?[3,4]:[]:e.style===`dotted`?[1.5,4.5]:e.style===`dashed`?[7,4]:[]),a.lineCap=`round`;let g=d?i:he(i,c,(s?D(s):0)+6),_=e.kind===`policy`&&e.twoWay?he(r,c,(o?D(o):0)+6):f&&o?.kind===`role`?{x:r.x+v.role/2-8,y:r.y}:r,y=()=>{a.beginPath(),a.moveTo(_.x,_.y),a.quadraticCurveTo(c.x,c.y,g.x,g.y)};if(d){a.strokeStyle=u(p,e.bridge?.8:f?.6:.55),a.lineWidth=e.bridge?1.4:f?1.5:1,y(),a.stroke(),a.restore();return}let b=k&&k.links.length>120?.55:1,x=e.kind===`policy`?.6:e.kind===`denied`?.85:Math.min(.95,.45+e.width*.09)*b,S=e.kind===`policy`?1.6:Math.max(1.1,e.width*.75);V.glow&&e.kind!==`policy`&&(a.strokeStyle=u(p,(H?.16:.1)*x),a.lineWidth=S*4,y(),a.stroke());let C=a.createLinearGradient(_.x,_.y,g.x,g.y);C.addColorStop(0,u(p,x*.35)),C.addColorStop(1,u(p,x)),a.strokeStyle=C,a.lineWidth=S,y(),a.stroke();let ee=j(`--bg`),te=e.kind===`policy`?10:6+Math.min(3,e.width);me(a,c,g,te,e.kind===`policy`,u(p,Math.max(.7,x)),ee),e.kind===`policy`&&e.twoWay&&me(a,c,_,te,!0,p,ee),a.textBaseline=`middle`,e.kind===`denied`?(a.setLineDash([]),a.strokeStyle=p,a.lineWidth=2.2,a.beginPath(),a.moveTo(l.x-5,l.y-5),a.lineTo(l.x+5,l.y+5),a.moveTo(l.x+5,l.y-5),a.lineTo(l.x-5,l.y+5),a.stroke(),a.fillStyle=p,a.font=`600 11px ${E}`,a.fillText(`${e.denied??e.count} denied`,l.x+9,l.y)):e.kind===`policy`&&L.k>=.7&&e.kinds?.length&&(a.fillStyle=j(`--muted`),a.font=`11px ${E}`,a.fillText(`${e.twoWay?`⇄`:`→`} ${e.kinds.join(`, `)}`,l.x+6,l.y)),a.restore()}function Be(e,n){if(!_e||!V.pulses||!k)return 0;let i=J,a=Se+(Date.now()-Ce),o=0;i.save(),H&&(i.globalCompositeOperation=`lighter`);for(let s of k.links){if(s.kind===`structure`||s.kind===`policy`||s.kind===`denied`)continue;let c=r(s,a);if(P!==void 0&&(s.source===P||s.target===P)&&(c=Math.max(c,.55)),c<=0)continue;let u=e.get(s.source),d=e.get(s.target);if(!u||!d)continue;let{c:f}=fe(u,d,pe(s)),p=B.get(s.target),m=he(d,f,(p?D(p):0)+6),h=Math.min(4,1+Math.floor(Math.log2(Math.max(1,s.count)))),g=Math.max(1,Math.round(c*h)),_=.16+.34*c,v=le(s.id),y=j(t(s.kind));for(let e=0;e<g;e++){o++;let t=(v+e/g+n*_)%1,r=(1-t)**2*u.x+2*(1-t)*t*f.x+t*t*m.x,a=(1-t)**2*u.y+2*(1-t)*t*f.y+t*t*m.y;l(i,r,a,9,y,(.35+.65*c)*(H?.9:.6)),i.fillStyle=H?`#ffffff`:y,i.globalAlpha=.5+.5*c,i.beginPath(),i.arc(r,a,2.2,0,Math.PI*2),i.fill(),i.globalAlpha=1}}return i.restore(),o}function Ve(e,t,n,r){if(!e.ring||a[e.ring]===`none`)return;let i=J,s=a[e.ring];i.strokeStyle=j(o[e.ring]),i.setLineDash(s===`broken`?[4,3]:[]),i.lineWidth=s===`thick`?3:s===`thin`?1:1.8,i.beginPath(),i.arc(t,n,r+4,0,Math.PI*2),i.stroke(),s===`double`&&(i.lineWidth=1.1,i.beginPath(),i.arc(t,n,r+7,0,Math.PI*2),i.stroke()),i.setLineDash([])}function He(e,t){let n=J,r=D(e),i=!qe()||X.has(e.id);n.save(),n.globalAlpha=(e.dim?.25:1)*(i?1:.3);let a=ue(e,j);V.glow&&e.kind!==`role`&&l(n,t.x,t.y,r*(e.kind===`hub`?U?9:5:3.4),e.match?j(`--accent`):a,(H?.55:.32)*(e.dim?.4:1)*(e.id===P||e.id===M?1.5:1)),e.kind===`role`?(de(n,t.x,t.y,r),e.vacant||(n.fillStyle=u(a,e.entry?.22:.1),n.fill()),n.strokeStyle=u(a,e.entry?1:.7),n.lineWidth=e.entry?2.4:1.3,n.setLineDash(e.vacant?[4,3]:[]),n.stroke(),n.setLineDash([])):d(n,c(e),t.x,t.y,r,a,H?`#ffffff`:u(`#ffffff`,.9)),Ve(e,t.x,t.y,r),e.teams&&(n.strokeStyle=j(`--violet`),n.lineWidth=1.4,n.setLineDash([2,3]),n.beginPath(),n.arc(t.x,t.y,r+10,0,Math.PI*2),n.stroke(),n.setLineDash([]),n.fillStyle=j(`--violet`),n.font=`700 10px ${E}`,n.textBaseline=`middle`,n.fillText(`×${e.teams}`,t.x+r+6,t.y-r-6)),(e.id===M||e.id===N)&&(n.strokeStyle=j(`--accent`),n.lineWidth=e.id===M?2.5:2,n.setLineDash(e.id===M?[]:[5,3]),n.beginPath(),e.kind===`role`?n.roundRect(t.x-v.role/2+4,t.y-r-4,v.role-8,r*2+8,r+4):n.arc(t.x,t.y,r+(e.teams?14:9),0,Math.PI*2),n.stroke(),n.setLineDash([])),n.textAlign=`center`,n.textBaseline=`middle`,e.kind===`role`?(n.fillStyle=j(e.vacant?`--muted`:`--text`),n.font=`${e.entry?700:500} ${e.vacant?11:12}px ${E}`,n.fillText(ce(`${e.entry?`★ `:``}${f(e)}`,16),t.x,t.y)):e.kind===`aggregate`?(n.fillStyle=j(`--text`),n.font=`600 11px ${E}`,n.fillText(String(e.folded??``),t.x,t.y)):e.folded&&e.kind===`session`&&(n.fillStyle=j(`--bg`),n.font=`700 9px ${E}`,n.fillText(`+${e.folded}`,t.x,t.y));let o=De.get(e.id);if(o){let r=Ue(e);n.globalAlpha=e.dim?.6:i?1:.5,n.fillStyle=j(e.dim?`--faint`:e.kind===`session`?`--muted`:`--text`),n.font=We(e,r),n.lineWidth=r/11*3,n.strokeStyle=u(j(`--bg`),.85);let a=o.box.y+o.box.h/2;n.strokeText(o.text,t.x,a),n.fillText(o.text,t.x,a)}n.restore()}let Ue=e=>(e.kind===`hub`?13:11)*Math.max(1,Math.min(1.5,oe/11/L.k)),We=(e,t)=>`${e.kind===`hub`?700:500} ${t}px ${E}`;function Ge(e){if(!k||!A)return new Map;let t=[];for(let e of k.nodes){if(e.kind===`role`||e.kind===`aggregate`||xe.has(e.id))continue;let n=A.positions.get(e.id);if(!n)continue;let r=e.kind!==`session`||e.match||e.id===M||e.id===N||e.id===P;if(!r&&!(L.k>=1||L.k>=ae&&Te.has(e.id)))continue;let i=Ue(e),a=ce(e.label,14),o=ce(e.label,9);t.push({id:e.id,x:n.x,y:n.y+D(e)+(e.ring?16:13)*(i/11)-i*.65,h:i*1.3,texts:r||o===a?[a]:[a,o],pinned:r,rank:(Te.has(e.id)?1e6:0)+(Ee.get(e.id)??0),font:We(e,i)})}return t.sort((e,t)=>t.rank-e.rank||(e.id<t.id?-1:+(e.id>t.id))),g(t,(t,n)=>(e.font!==n.font&&(e.font=n.font),e.measureText(t).width+4))}let X=new Set,Ke;function qe(){let e=P??M;if(e!==Ke&&(Ke=e,X=new Set(e===void 0?[]:[e]),e!==void 0&&k))for(let t of k.links)t.source===e&&X.add(t.target),t.target===e&&X.add(t.source);return e!==void 0&&B.has(e)?e:void 0}function Je(){let e=J;e.save();let t=11,n=()=>((t=t*16807%2147483647)-1)/2147483646;e.fillStyle=j(`--accent`);for(let t=0;t<260;t++){let t=n()*Math.PI*2,r=60+n()**.7*900;e.globalAlpha=(H?.35:.22)*(1-r/1e3),e.beginPath(),e.arc(Math.cos(t)*r,Math.sin(t)*r*.6,.8+n()*1.6,0,Math.PI*2),e.fill()}e.restore()}function Ye(){if(!A)return;let e=Ae();S.width!==T.w*e&&(S.width=T.w*e,S.height=T.h*e);let t=C;t.setTransform(e,0,0,e,0,0),t.clearRect(0,0,T.w,T.h),t.globalAlpha=.92,t.fillStyle=j(`--raise`),t.fillRect(0,0,T.w,T.h),t.globalAlpha=1;let n=A.bounds,r=Math.min(T.w/n.w,T.h/n.h),i=(T.w-n.w*r)/2-n.x*r,a=(T.h-n.h*r)/2-n.y*r;t.strokeStyle=j(`--line-2`),t.lineWidth=1;for(let e of A.boxes)t.strokeRect(e.x*r+i,e.y*r+a,e.w*r,e.h*r);for(let[e,n]of A.positions){let o=B.get(e);if(!o)continue;let s=o.kind===`hub`?4:2;t.fillStyle=o.match?j(`--accent`):ue(o,j),t.fillRect(n.x*r+i-s/2,n.y*r+a-s/2,s,s)}let o=W(0,0);t.strokeStyle=j(`--accent`),t.lineWidth=1.5,t.strokeRect(o.x*r+i,o.y*r+a,F/L.k*r,I/L.k*r),be={s:r,ox:i,oy:a}}function Xe(){let e=Me,t=Ae();if((q.width!==b.width||q.height!==b.height)&&(q.width=b.width,q.height=b.height),e.setTransform(t,0,0,t,0,0),e.fillStyle=j(`--bg`),e.fillRect(0,0,F,I),k&&A){e.setTransform(t*L.k,0,0,t*L.k,t*L.x,t*L.y),J=e;try{U&&Je();for(let e of A.boxes)Re(e);let t=A.positions;for(let e of k.links)e.kind===`structure`&&ze(e,t);for(let e of k.links)e.kind!==`structure`&&ze(e,t);De=Ge(e),Ze();for(let e of k.nodes){let n=t.get(e.id);n&&He(e,n)}}finally{J=x}}}function Ze(){if(!A)return;let e=A.bounds,t=e=>Math.round(e*10)/10;n.dataset.content=JSON.stringify({x:t(e.x*L.k+L.x),y:t(e.y*L.k+L.y),w:t(e.w*L.k),h:t(e.h*L.k)}),n.dataset.labelBoxes=JSON.stringify([...De.values()].map(({box:e})=>[t(e.x*L.k+L.x),t(e.y*L.k+L.y),t(e.w*L.k),t(e.h*L.k)]))}function Qe(){z=0;let e=performance.now(),t=x,r=`${L.k},${L.x},${L.y},${b.width},${b.height}`;if((Ne||r!==Pe)&&(Xe(),Ye(),Ne=!1,Pe=r),t.setTransform(1,0,0,1,0,0),t.drawImage(q,0,0),!k||!A)return;let i=Ae();t.setTransform(i*L.k,0,0,i*L.k,i*L.x,i*L.y),Oe=Be(A.positions,performance.now()/1e3),ve&&(t.save(),ve(t,L),t.restore()),n.dataset.zoom=L.k.toFixed(3),n.dataset.pulses=String(Oe),n.dataset.drawMs=(performance.now()-e).toFixed(1),ke=Oe>0&&!document.hidden,n.dataset.animating=String(ke),ke&&!z&&(z=requestAnimationFrame(Qe))}function $e(e,t){if(!k||!A)return;let n=W(e,t),r;for(let e of k.nodes){let t=A.positions.get(e.id);if(!t)continue;let i=e.kind===`role`?Math.abs(n.x-t.x)<=v.role/2-8&&Math.abs(n.y-t.y)<=se(e)?-1:1/0:Math.hypot(n.x-t.x,n.y-t.y)-se(e)-3;i<=0&&(!r||i<r.d)&&(r={id:e.id,d:i})}if(r)return{type:`node`,id:r.id};let i=6/L.k,a;for(let e of k.links){if(e.kind===`structure`)continue;let t=A.positions.get(e.source),r=A.positions.get(e.target);if(!t||!r)continue;let{c:o}=fe(t,r,pe(e)),s=t;for(let c=1;c<=16;c++){let l=c/16,u={x:(1-l)**2*t.x+2*(1-l)*l*o.x+l*l*r.x,y:(1-l)**2*t.y+2*(1-l)*l*o.y+l*l*r.y},d=ge(n,s,u);d<=i&&(!a||d<a.d)&&(a={l:e,d}),s=u}}if(a)return{type:`link`,link:a.l};let o=A.boxes.find(e=>n.x>=e.x&&n.x<=e.x+e.w&&n.y>=e.y&&n.y<=e.y+e.h);return o?{type:`box`,id:o.id}:void 0}function et(t){let n=B.get(t);if(!n)return``;let r=[n.label];return n.kind===`role`&&r.push(n.entry?`entry role`:`role`,n.vacant?`vacant`:`${n.staffed??0} staffed`),n.seat&&r.push(`seat: ${n.seat}`),n.kind===`team`&&r.push(n.mode===`restricted`?`restricted team`:`open team`),n.kind===`machine`&&r.push(`machine`),n.ring&&r.push(e[n.ring]),n.teams&&r.push(`in ${n.teams} teams`),n.folded&&n.kind===`session`&&r.push(`+${n.folded} folded`),r.join(` · `)}function tt(e){let t=e=>B.get(e)?.label??e;return e.kind===`structure`?``:e.kind===`policy`?`Team path ${t(e.source)} ${e.twoWay?`⇄`:`→`} ${t(e.target)}${e.kinds?.length?` · ${e.kinds.join(`, `)}`:``}${e.count?` · ${e.count} sent along it`:``}`:e.kind===`denied`?`${e.denied??e.count} denied: ${t(e.source)} → ${t(e.target)}`:`${i(e.kind)} · ${t(e.source)} → ${t(e.target)} · ${e.count}`}let Z=new Map,Q,$;b.addEventListener(`pointerdown`,e=>{b.setPointerCapture?.(e.pointerId);let t=G(e.clientX,e.clientY);if(Z.set(e.pointerId,t),Z.size===2){let[e,t]=[...Z.values()];$={d:Math.hypot(e.x-t.x,e.y-t.y)||1,k:L.k,mid:{x:(e.x+t.x)/2,y:(e.y+t.y)/2}},Q=void 0}else Q={...t,t:L,moved:!1}}),b.addEventListener(`pointermove`,e=>{let t=G(e.clientX,e.clientY);if(Z.has(e.pointerId)&&Z.set(e.pointerId,t),$&&Z.size===2){let[e,t]=[...Z.values()],n=Math.max(w,Math.min(ie,$.k*(Math.hypot(e.x-t.x,e.y-t.y)||1)/$.d)),r=W($.mid.x,$.mid.y);R=!0,Y({k:n,x:$.mid.x-r.x*n,y:$.mid.y-r.y*n},!1);return}if(Q){!Q.moved&&Math.hypot(t.x-Q.x,t.y-Q.y)>4&&(Q.moved=!0),Q.moved&&(R=!0,O.hidden=!0,Y({k:Q.t.k,x:Q.t.x+t.x-Q.x,y:Q.t.y+t.y-Q.y},!1));return}let n=$e(t.x,t.y),r=n?.type===`node`?n.id:void 0;b.style.cursor=n&&n.type!==`box`?`pointer`:`grab`,r!==P&&(P=r,K());let i=n?.type===`node`?et(n.id):n?.type===`link`?tt(n.link):``;O.hidden=!i,i&&(O.textContent=i,O.style.left=`${Math.min(t.x+14,F-220)}px`,O.style.top=`${t.y+14}px`)}),b.addEventListener(`pointerup`,e=>{if(Z.delete(e.pointerId),Z.size<2&&($=void 0),!Q)return;let t=!Q.moved;if(Q=void 0,!t)return;let n=G(e.clientX,e.clientY),r=$e(n.x,n.y);r?.type===`node`?(N=r.id,y.onNode(r.id)):r?.type===`link`?y.onLink(r.link):y.onBackground(),K()}),b.addEventListener(`pointercancel`,e=>{Z.delete(e.pointerId),Q=void 0,$=void 0}),b.addEventListener(`pointerleave`,()=>{O.hidden=!0,P!==void 0&&(P=void 0,K())}),b.addEventListener(`wheel`,e=>{e.preventDefault();let t=G(e.clientX,e.clientY);Ie(t.x,t.y,Math.exp(-e.deltaY*(e.ctrlKey?.01:.0015)))},{passive:!1}),b.addEventListener(`dblclick`,e=>{let t=G(e.clientX,e.clientY);Ie(t.x,t.y,2,!0)});let nt=e=>{let t=S.getBoundingClientRect(),{s:n,ox:r,oy:i}=be;R=!0,Le({x:(e.clientX-t.left-r)/n,y:(e.clientY-t.top-i)/n},!1)};S.addEventListener(`pointerdown`,e=>{S.setPointerCapture?.(e.pointerId),nt(e)}),S.addEventListener(`pointermove`,e=>{S.hasPointerCapture?.(e.pointerId)&&nt(e)});let rt=e=>{let t=et(e);y.announce(t?`${t}. Enter opens it.`:``)},it=e=>{let t=A?.positions.get(e);if(!t)return;let n=je(t);(n.x<40||n.y<40||n.x>F-40||n.y>I-40)&&Le(t,!0,Math.max(L.k,.7))},at=e=>{N=e,e&&(it(e),rt(e)),K()},ot=e=>{if(e.target!==n||!A)return;let t={ArrowLeft:`left`,ArrowRight:`right`,ArrowUp:`up`,ArrowDown:`down`}[e.key];t&&e.shiftKey?(e.preventDefault(),R=!0,Y({...L,x:L.x+(t===`left`?80:t===`right`?-80:0),y:L.y+(t===`up`?80:t===`down`?-80:0)},!1)):t?(e.preventDefault(),at(ne(A.positions,N??`hub`,t))):(e.key===`Enter`||e.key===` `)&&N?(e.preventDefault(),y.onNode(N)):e.key===`Home`?(e.preventDefault(),at(`hub`)):e.key===`+`||e.key===`=`||e.key===`-`||e.key===`_`?(e.preventDefault(),Ie(F/2,I/2,e.key===`+`||e.key===`=`?1.25:.8,!0)):e.key===`0`&&(e.preventDefault(),R=!1,Fe(!0))},st=()=>{N===void 0&&(N=M!==void 0&&B.has(M)?M:`hub`),rt(N),K()};n.addEventListener(`keydown`,ot),n.addEventListener(`focus`,st);let ct=()=>document.visibilityState===`visible`&&K();return document.addEventListener(`visibilitychange`,ct),{update(e,t,r){k=e,j=t,_e=r.motion,M=r.selected,V={...re,...r.look},H=s(j(`--bg`)),Se=e.now,Ce=Date.now(),U=!e.nodes.some(e=>e.kind===`session`||e.kind===`aggregate`);let i=p(e);we=new Map(i.map(e=>[e.id,e.color])),Te=m(e,{max:V.labels}),Ee=h(e),Ke=`\0`,B.clear();for(let t of e.nodes)B.set(t.id,t);A=ee(e),xe.clear();for(let e of A.boxes)B.has(e.id)&&xe.add(e.id);N!==void 0&&!B.has(N)&&(N=void 0);let a=n.dataset;a.nodes=String(e.nodes.length),a.boxes=String(A.boxes.length),a.teams=String(A.boxes.filter(e=>e.kind===`team`).length),a.policy=String(e.links.filter(e=>e.kind===`policy`).length),a.twoWay=String(e.links.filter(e=>e.kind===`policy`&&e.twoWay).length),a.denied=String(e.links.filter(e=>e.kind===`denied`).length),a.bridges=String(e.links.filter(e=>e.bridge).length),a.tethers=String(e.links.filter(e=>e.structure===`seat`&&!e.bridge).length),a.vacant=String(e.nodes.filter(e=>e.kind===`role`&&e.vacant).length),a.selected=M??``,a.regions=String(i.length),a.empty=String(U),R||Fe(!1),K()},focus(e,t){let n=A?.positions.get(e);n&&(N=e,R=!0,Le(n,t,Math.max(L.k,1)),K())},reset(e){R=!1,Fe(e)},resize(e,t){F=Math.max(1,e),I=Math.max(1,t);let n=Ae();b.width=Math.round(F*n),b.height=Math.round(I*n),b.style.width=`${F}px`,b.style.height=`${I}px`,R||Fe(!1),K()},destroy(){cancelAnimationFrame(z),cancelAnimationFrame(ye),n.removeEventListener(`keydown`,ot),n.removeEventListener(`focus`,st),document.removeEventListener(`visibilitychange`,ct),n.replaceChildren()},hitTest(e,t){let n=G(e,t);return $e(n.x,n.y)},toWorld(e,t){let n=G(e,t);return W(n.x,n.y)},setOverlay(e){ve=e,K()},layout:()=>A}}export{O as createRenderer2D};
|
|
1
|
+
import{H as e,M as t,N as n,O as r,U as i,j as a,q as o}from"./live-B2IfKm37.js";import{a as s,i as c,n as l,o as u,r as d}from"./Watchtower-60B1JX_J.js";import{a as f,c as p,i as m,r as h,s as g,t as _}from"./safe-area-dtrnw9NF.js";var v={w:76,h:58,pad:16,header:38,role:118,gap:40,band:120,party:120,roleRow:92},y=14,b=8,x=200,S=420,C=(e,t)=>Math.max(1,Math.min(t,Math.ceil(Math.sqrt(e*2))));function ee(e){let t=new Map,n=new Set(e.nodes.map(e=>e.id));t.set(`hub`,{x:0,y:0}),e.nodes.filter(e=>e.id!==`hub`&&(e.kind===`hub`||e.kind===`user`||e.kind===`app`)).forEach((e,n)=>t.set(e.id,{x:(n%2==0?-1:1)*v.party*(Math.floor(n/2)+1),y:0}));let r=e.groups.map(e=>{let t=e.sections.map(e=>{let t=e.id!==void 0,n=C(e.members.length,t?b:y),r=Math.max(1,Math.ceil(e.members.length/n));return{cols:n,rows:r,role:t,w:(t?v.role+v.w/2:0)+n*v.w,h:r*(t?v.roleRow:v.h)}});return{group:e,sections:t,w:Math.max((e.kind===`team`?S:x)-2*v.pad,...t.map(e=>e.w))+2*v.pad,h:v.header+t.reduce((e,t)=>e+t.h,0)+v.pad}}),i=r.reduce((e,t)=>e+(t.w+v.gap)*(t.h+v.gap),0),a=Math.max(...r.map(e=>e.w),Math.sqrt(i)*1.5,1),o=[],s=[],c=0;for(let e of r)s.length&&c+v.gap+e.w>a&&(o.push(s),s=[],c=0),c+=(s.length?v.gap:0)+e.w,s.push(e);s.length&&o.push(s);let l=[],u=v.band;for(let e of o){let r=-(e.reduce((e,t)=>e+t.w,0)+v.gap*(e.length-1))/2;for(let i of e){let{group:e}=i,a=[],o=u+v.header;e.sections.forEach((e,s)=>{let c=i.sections[s],l={x:r+v.pad,y:o,w:i.w-2*v.pad,h:c.h};a.push({...l,...e.id===void 0?{}:{id:e.id},...e.label===void 0?{}:{label:e.label},...e.entry===void 0?{}:{entry:e.entry}});let u=c.role?v.roleRow:v.h;e.id!==void 0&&n.has(e.id)&&t.set(e.id,{x:l.x+v.role/2,y:o+u/2});let d=l.x+(c.role?v.role+s%2*(v.w/2):0);e.members.forEach((e,n)=>t.set(e,{x:d+n%c.cols*v.w+v.w/2,y:o+Math.floor(n/c.cols)*u+u/2})),o+=c.h}),n.has(e.id)&&t.set(e.id,{x:r+v.pad+12,y:u+v.header/2}),l.push({id:e.id,label:e.label,kind:e.kind,x:r,y:u,w:i.w,h:i.h,...e.machine===void 0?{}:{machine:e.machine},...e.online===void 0?{}:{online:e.online},...e.mode===void 0?{}:{mode:e.mode},...e.paused===void 0?{}:{paused:e.paused},...e.entryRole===void 0?{}:{entryRole:e.entryRole},members:e.sections.reduce((e,t)=>e+t.members.length,0),sections:a}),r+=i.w+v.gap}u+=Math.max(...e.map(e=>e.h))+v.gap}let d=e.nodes.filter(e=>!t.has(e.id));d.forEach((e,n)=>t.set(e.id,{x:(n-(d.length-1)/2)*v.w,y:u+v.h/2}));let f=[],p=[];for(let e of t.values())f.push(e.x-v.w/2,e.x+v.w/2),p.push(e.y-v.h/2,e.y+v.h/2);for(let e of l)f.push(e.x,e.x+e.w),p.push(e.y,e.y+e.h);let m=Math.min(...f)-40,h=Math.min(...p)-40;return{positions:t,boxes:l,bounds:{x:m,y:h,w:Math.max(...f)+40-m,h:Math.max(...p)+40-h}}}function te(e,t,n,r){let i=Math.max(1,t.width-n.left-n.right),a=Math.max(1,t.height-n.top-n.bottom),o=Math.max(r.min,Math.min(r.max,Math.min(i/Math.max(1,e.w),a/Math.max(1,e.h))));return{k:o,x:n.left+i/2-(e.x+e.w/2)*o,y:n.top+a/2-(e.y+e.h/2)*o}}function ne(e,t,n){let r=t===void 0?void 0:e.get(t);if(!r)return e.keys().next().value;let i,a=1/0;for(let[o,s]of e){if(o===t)continue;let e=s.x-r.x,c=s.y-r.y,[l,u]=n===`right`?[e,c]:n===`left`?[-e,c]:n===`down`?[c,e]:[-c,e];if(l<=0||Math.abs(u)>l*2)continue;let d=l+2*Math.abs(u);d<a&&(a=d,i=o)}return i??t}var re={glow:!0,pulses:!0,labels:12},w=.04,ie=4,ae=.55,oe=9.5,T={w:180,h:120},E=`system-ui, -apple-system, sans-serif`,se=e=>e.kind===`hub`?22:e.kind===`role`?13:Math.max(8,Math.min(20,e.size*1.9)),D=e=>e.kind===`hub`||e.kind===`role`?13:e.kind===`aggregate`?se(e)*.8:e.kind===`session`?Math.max(5,Math.min(11,3+e.size)):8,ce=(e,t)=>e.length>t?`${e.slice(0,t-1)}…`:e;function le(e){let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)|0;return(t>>>0)%1e3/1e3}function ue(e,t){return e.kind===`hub`?t(`--accent`):e.kind===`user`||e.kind===`app`?t(`--text`):e.kind===`team`||e.kind===`role`?t(`--violet`):e.kind===`cluster`?t(`--muted`):e.machine===void 0?t(`--faint`):t(r[e.machine%r.length])}function de(e,t,n,r){e.beginPath(),e.roundRect(t-v.role/2+8,n-r,v.role-16,r*2,r)}function fe(e,t,n){let r=t.x-e.x,i=t.y-e.y,a={x:(e.x+t.x)/2-i*n,y:(e.y+t.y)/2+r*n};return{c:a,mid:{x:.25*e.x+.5*a.x+.25*t.x,y:.25*e.y+.5*a.y+.25*t.y}}}var pe=e=>e.kind===`structure`?e.bridge?.18:0:e.kind===`policy`?.22:e.kind===`denied`?-.22:.1;function me(e,t,n,r,i,a,o){let s=Math.atan2(n.y-t.y,n.x-t.x);e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(n.x-r*Math.cos(s-.45),n.y-r*Math.sin(s-.45)),e.lineTo(n.x-r*Math.cos(s+.45),n.y-r*Math.sin(s+.45)),e.closePath(),e.setLineDash([]),e.fillStyle=i?o:a,e.fill(),e.strokeStyle=a,e.lineWidth=1.4,e.stroke()}function he(e,t,n){let r=Math.hypot(e.x-t.x,e.y-t.y)||1;return{x:e.x-(e.x-t.x)/r*n,y:e.y-(e.y-t.y)/r*n}}function ge(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=r||i?Math.max(0,Math.min(1,((e.x-t.x)*r+(e.y-t.y)*i)/(r*r+i*i))):0;return Math.hypot(e.x-(t.x+a*r),e.y-(t.y+a*i))}function O(r,y){let b=document.createElement(`canvas`);b.className=`wt-canvas2d`;let x=b.getContext(`2d`);if(!x)throw Error(`This browser can't draw on a canvas`);let S=document.createElement(`canvas`);S.className=`wt-minimap`,S.setAttribute(`aria-hidden`,`true`),S.title=`Minimap: click to move the view`;let C=S.getContext(`2d`),O=document.createElement(`span`);O.className=`wt-tip wt-tip2d`,O.hidden=!0,r.append(b,S,O);let k,A,j=()=>`#888`,_e=!0,M,N,P,ve,F=r.clientWidth||300,I=r.clientHeight||150,L={k:1,x:F/2,y:80},R=!1,z=0,ye=0,be={s:1,ox:0,oy:0},B=new Map,xe=new Set,V=re,H=!1,U=!1,Se=0,Ce=0,we=new Map,Te=new Set,Ee=new Map,De=new Map,Oe=0,ke=!1,Ae=()=>window.devicePixelRatio||1,je=e=>({x:e.x*L.k+L.x,y:e.y*L.k+L.y}),W=(e,t)=>({x:(e-L.x)/L.k,y:(t-L.y)/L.k}),G=(e,t)=>{let n=b.getBoundingClientRect();return{x:e-n.left,y:t-n.top}},K=()=>{Ne=!0,z||=requestAnimationFrame(Qe)},q=document.createElement(`canvas`),Me=q.getContext(`2d`),J=x,Ne=!0,Pe=``,Y=(e,t)=>{cancelAnimationFrame(ye);let n={...e,k:Math.max(w,Math.min(ie,e.k))};if(!t||!_e){L=n,K();return}let r=L,i=performance.now(),a=e=>{let t=Math.min(1,(e-i)/260),o=1-(1-t)**3;L={k:r.k+(n.k-r.k)*o,x:r.x+(n.x-r.x)*o,y:r.y+(n.y-r.y)*o},Qe(),t<1&&(ye=requestAnimationFrame(a))};ye=requestAnimationFrame(a)},Fe=e=>{if(!A)return;let t=A.positions.get(`hub`);Y(U&&t?{k:1.3,x:F/2-t.x*1.3,y:I/2-t.y*1.3}:te(A.bounds,{width:F,height:I},_(r),{min:w,max:1.4}),e)},Ie=(e,t,n,r=!1)=>{let i=Math.max(w,Math.min(ie,L.k*n)),a=W(e,t);R=!0,Y({k:i,x:e-a.x*i,y:t-a.y*i},r)},Le=(e,t,n=L.k)=>Y({k:n,x:F/2-e.x*n,y:I/2-e.y*n},t);function Re(e){let t=J,n=e.kind===`team`,r=n&&e.mode===`restricted`,i=j(we.get(e.id)??`--line-2`);t.save(),t.beginPath(),t.roundRect(e.x,e.y,e.w,e.h,22),V.glow&&(t.shadowColor=u(i,H?.35:.22),t.shadowBlur=36*L.k),t.fillStyle=u(i,H?.075:.06),t.fill(),t.shadowBlur=0,t.lineWidth=n?1.6:1,t.setLineDash(r?[8,5]:e.online===!1?[4,4]:[]),t.strokeStyle=u(i,n?.65:.4),t.stroke(),t.setLineDash([]),e.sections.forEach((e,n)=>{e.entry&&(t.fillStyle=u(j(`--accent`),.09),t.beginPath(),t.roundRect(e.x,e.y+2,e.w,e.h-4,10),t.fill()),n>0&&e.id!==void 0&&(t.strokeStyle=u(i,.18),t.lineWidth=1,t.beginPath(),t.moveTo(e.x+10,e.y),t.lineTo(e.x+e.w-10,e.y),t.stroke())}),t.beginPath(),t.rect(e.x,e.y,e.w-8,v.header),t.clip();let a=e.x+v.pad+(xe.has(e.id)?30:4),o=e.y+v.header/2,s=ce(e.label,28);t.fillStyle=j(`--text`),t.font=`650 13px ${E}`,t.textBaseline=`middle`,t.fillText(s,a,o);let c=k?.teams.find(t=>t.id===e.id)?.members??e.members,l=n?`${r?`Restricted: declared paths only`:`Open: everyone may message everyone`}${e.paused?` · paused`:``} · ${c} seated`:`${e.members} ${e.members===1?`node`:`nodes`}${e.online===!1?` · offline`:``}`;t.fillStyle=j(`--muted`),t.font=`12px ${E}`,t.fillText(l,a+t.measureText(s).width+18,o),t.restore()}function ze(t,n){let r=n.get(t.source),i=n.get(t.target);if(!r||!i||t.kind===`structure`&&t.structure!==`tree`&&t.structure!==`party`&&t.structure!==`seat`&&!t.bridge)return;let a=J,o=B.get(t.source),s=B.get(t.target),{c,mid:l}=fe(r,i,pe(t)),d=t.kind===`structure`,f=d&&t.structure===`seat`,p=j(d?t.bridge||f?`--violet`:`--line-2`:e(t.kind)),m=qe(),h=!m||t.source===m||t.target===m;a.save(),a.globalAlpha=(o?.dim&&s?.dim?.15:1)*(h?1:.2),a.setLineDash(d?t.bridge?[3,4]:[]:t.style===`dotted`?[1.5,4.5]:t.style===`dashed`?[7,4]:[]),a.lineCap=`round`;let g=d?i:he(i,c,(s?D(s):0)+6),_=t.kind===`policy`&&t.twoWay?he(r,c,(o?D(o):0)+6):f&&o?.kind===`role`?{x:r.x+v.role/2-8,y:r.y}:r,y=()=>{a.beginPath(),a.moveTo(_.x,_.y),a.quadraticCurveTo(c.x,c.y,g.x,g.y)};if(d){a.strokeStyle=u(p,t.bridge?.8:f?.6:.55),a.lineWidth=t.bridge?1.4:f?1.5:1,y(),a.stroke(),a.restore();return}let b=k&&k.links.length>120?.55:1,x=t.kind===`policy`?.6:t.kind===`denied`?.85:Math.min(.95,.45+t.width*.09)*b,S=t.kind===`policy`?1.6:Math.max(1.1,t.width*.75);V.glow&&t.kind!==`policy`&&(a.strokeStyle=u(p,(H?.16:.1)*x),a.lineWidth=S*4,y(),a.stroke());let C=a.createLinearGradient(_.x,_.y,g.x,g.y);C.addColorStop(0,u(p,x*.35)),C.addColorStop(1,u(p,x)),a.strokeStyle=C,a.lineWidth=S,y(),a.stroke();let ee=j(`--bg`),te=t.kind===`policy`?10:6+Math.min(3,t.width);me(a,c,g,te,t.kind===`policy`,u(p,Math.max(.7,x)),ee),t.kind===`policy`&&t.twoWay&&me(a,c,_,te,!0,p,ee),a.textBaseline=`middle`,t.kind===`denied`?(a.setLineDash([]),a.strokeStyle=p,a.lineWidth=2.2,a.beginPath(),a.moveTo(l.x-5,l.y-5),a.lineTo(l.x+5,l.y+5),a.moveTo(l.x+5,l.y-5),a.lineTo(l.x-5,l.y+5),a.stroke(),a.fillStyle=p,a.font=`600 11px ${E}`,a.fillText(`${t.denied??t.count} denied`,l.x+9,l.y)):t.kind===`policy`&&L.k>=.7&&t.kinds?.length&&(a.fillStyle=j(`--muted`),a.font=`11px ${E}`,a.fillText(`${t.twoWay?`⇄`:`→`} ${t.kinds.join(`, `)}`,l.x+6,l.y)),a.restore()}function Be(t,n){if(!_e||!V.pulses||!k)return 0;let r=J,i=Se+(Date.now()-Ce),a=0;r.save(),H&&(r.globalCompositeOperation=`lighter`);for(let s of k.links){if(s.kind===`structure`||s.kind===`policy`||s.kind===`denied`)continue;let c=o(s,i);if(P!==void 0&&(s.source===P||s.target===P)&&(c=Math.max(c,.55)),c<=0)continue;let u=t.get(s.source),d=t.get(s.target);if(!u||!d)continue;let{c:f}=fe(u,d,pe(s)),p=B.get(s.target),m=he(d,f,(p?D(p):0)+6),h=Math.min(4,1+Math.floor(Math.log2(Math.max(1,s.count)))),g=Math.max(1,Math.round(c*h)),_=.16+.34*c,v=le(s.id),y=j(e(s.kind));for(let e=0;e<g;e++){a++;let t=(v+e/g+n*_)%1,i=(1-t)**2*u.x+2*(1-t)*t*f.x+t*t*m.x,o=(1-t)**2*u.y+2*(1-t)*t*f.y+t*t*m.y;l(r,i,o,9,y,(.35+.65*c)*(H?.9:.6)),r.fillStyle=H?`#ffffff`:y,r.globalAlpha=.5+.5*c,r.beginPath(),r.arc(i,o,2.2,0,Math.PI*2),r.fill(),r.globalAlpha=1}}return r.restore(),a}function Ve(e,t,r,i){if(!e.ring||n[e.ring]===`none`)return;let o=J,s=n[e.ring];o.strokeStyle=j(a[e.ring]),o.setLineDash(s===`broken`?[4,3]:[]),o.lineWidth=s===`thick`?3:s===`thin`?1:1.8,o.beginPath(),o.arc(t,r,i+4,0,Math.PI*2),o.stroke(),s===`double`&&(o.lineWidth=1.1,o.beginPath(),o.arc(t,r,i+7,0,Math.PI*2),o.stroke()),o.setLineDash([])}function He(e,t){let n=J,r=D(e),i=!qe()||X.has(e.id);n.save(),n.globalAlpha=(e.dim?.25:1)*(i?1:.3);let a=ue(e,j);V.glow&&e.kind!==`role`&&l(n,t.x,t.y,r*(e.kind===`hub`?U?9:5:3.4),e.match?j(`--accent`):a,(H?.55:.32)*(e.dim?.4:1)*(e.id===P||e.id===M?1.5:1)),e.kind===`role`?(de(n,t.x,t.y,r),e.vacant||(n.fillStyle=u(a,e.entry?.22:.1),n.fill()),n.strokeStyle=u(a,e.entry?1:.7),n.lineWidth=e.entry?2.4:1.3,n.setLineDash(e.vacant?[4,3]:[]),n.stroke(),n.setLineDash([])):d(n,c(e),t.x,t.y,r,a,H?`#ffffff`:u(`#ffffff`,.9)),Ve(e,t.x,t.y,r),e.teams&&(n.strokeStyle=j(`--violet`),n.lineWidth=1.4,n.setLineDash([2,3]),n.beginPath(),n.arc(t.x,t.y,r+10,0,Math.PI*2),n.stroke(),n.setLineDash([]),n.fillStyle=j(`--violet`),n.font=`700 10px ${E}`,n.textBaseline=`middle`,n.fillText(`×${e.teams}`,t.x+r+6,t.y-r-6)),(e.id===M||e.id===N)&&(n.strokeStyle=j(`--accent`),n.lineWidth=e.id===M?2.5:2,n.setLineDash(e.id===M?[]:[5,3]),n.beginPath(),e.kind===`role`?n.roundRect(t.x-v.role/2+4,t.y-r-4,v.role-8,r*2+8,r+4):n.arc(t.x,t.y,r+(e.teams?14:9),0,Math.PI*2),n.stroke(),n.setLineDash([])),n.textAlign=`center`,n.textBaseline=`middle`,e.kind===`role`?(n.fillStyle=j(e.vacant?`--muted`:`--text`),n.font=`${e.entry?700:500} ${e.vacant?11:12}px ${E}`,n.fillText(ce(`${e.entry?`★ `:``}${f(e)}`,16),t.x,t.y)):e.kind===`aggregate`?(n.fillStyle=j(`--text`),n.font=`600 11px ${E}`,n.fillText(String(e.folded??``),t.x,t.y)):e.folded&&e.kind===`session`&&(n.fillStyle=j(`--bg`),n.font=`700 9px ${E}`,n.fillText(`+${e.folded}`,t.x,t.y));let o=De.get(e.id);if(o){let r=Ue(e);n.globalAlpha=e.dim?.6:i?1:.5,n.fillStyle=j(e.dim?`--faint`:e.kind===`session`?`--muted`:`--text`),n.font=We(e,r),n.lineWidth=r/11*3,n.strokeStyle=u(j(`--bg`),.85);let a=o.box.y+o.box.h/2;n.strokeText(o.text,t.x,a),n.fillText(o.text,t.x,a)}n.restore()}let Ue=e=>(e.kind===`hub`?13:11)*Math.max(1,Math.min(1.5,oe/11/L.k)),We=(e,t)=>`${e.kind===`hub`?700:500} ${t}px ${E}`;function Ge(e){if(!k||!A)return new Map;let t=[];for(let e of k.nodes){if(e.kind===`role`||e.kind===`aggregate`||xe.has(e.id))continue;let n=A.positions.get(e.id);if(!n)continue;let r=e.kind!==`session`||e.match||e.id===M||e.id===N||e.id===P;if(!r&&!(L.k>=1||L.k>=ae&&Te.has(e.id)))continue;let i=Ue(e),a=ce(e.label,14),o=ce(e.label,9);t.push({id:e.id,x:n.x,y:n.y+D(e)+(e.ring?16:13)*(i/11)-i*.65,h:i*1.3,texts:r||o===a?[a]:[a,o],pinned:r,rank:(Te.has(e.id)?1e6:0)+(Ee.get(e.id)??0),font:We(e,i)})}return t.sort((e,t)=>t.rank-e.rank||(e.id<t.id?-1:+(e.id>t.id))),g(t,(t,n)=>(e.font!==n.font&&(e.font=n.font),e.measureText(t).width+4))}let X=new Set,Ke;function qe(){let e=P??M;if(e!==Ke&&(Ke=e,X=new Set(e===void 0?[]:[e]),e!==void 0&&k))for(let t of k.links)t.source===e&&X.add(t.target),t.target===e&&X.add(t.source);return e!==void 0&&B.has(e)?e:void 0}function Je(){let e=J;e.save();let t=11,n=()=>((t=t*16807%2147483647)-1)/2147483646;e.fillStyle=j(`--accent`);for(let t=0;t<260;t++){let t=n()*Math.PI*2,r=60+n()**.7*900;e.globalAlpha=(H?.35:.22)*(1-r/1e3),e.beginPath(),e.arc(Math.cos(t)*r,Math.sin(t)*r*.6,.8+n()*1.6,0,Math.PI*2),e.fill()}e.restore()}function Ye(){if(!A)return;let e=Ae();S.width!==T.w*e&&(S.width=T.w*e,S.height=T.h*e);let t=C;t.setTransform(e,0,0,e,0,0),t.clearRect(0,0,T.w,T.h),t.globalAlpha=.92,t.fillStyle=j(`--raise`),t.fillRect(0,0,T.w,T.h),t.globalAlpha=1;let n=A.bounds,r=Math.min(T.w/n.w,T.h/n.h),i=(T.w-n.w*r)/2-n.x*r,a=(T.h-n.h*r)/2-n.y*r;t.strokeStyle=j(`--line-2`),t.lineWidth=1;for(let e of A.boxes)t.strokeRect(e.x*r+i,e.y*r+a,e.w*r,e.h*r);for(let[e,n]of A.positions){let o=B.get(e);if(!o)continue;let s=o.kind===`hub`?4:2;t.fillStyle=o.match?j(`--accent`):ue(o,j),t.fillRect(n.x*r+i-s/2,n.y*r+a-s/2,s,s)}let o=W(0,0);t.strokeStyle=j(`--accent`),t.lineWidth=1.5,t.strokeRect(o.x*r+i,o.y*r+a,F/L.k*r,I/L.k*r),be={s:r,ox:i,oy:a}}function Xe(){let e=Me,t=Ae();if((q.width!==b.width||q.height!==b.height)&&(q.width=b.width,q.height=b.height),e.setTransform(t,0,0,t,0,0),e.fillStyle=j(`--bg`),e.fillRect(0,0,F,I),k&&A){e.setTransform(t*L.k,0,0,t*L.k,t*L.x,t*L.y),J=e;try{U&&Je();for(let e of A.boxes)Re(e);let t=A.positions;for(let e of k.links)e.kind===`structure`&&ze(e,t);for(let e of k.links)e.kind!==`structure`&&ze(e,t);De=Ge(e),Ze();for(let e of k.nodes){let n=t.get(e.id);n&&He(e,n)}}finally{J=x}}}function Ze(){if(!A)return;let e=A.bounds,t=e=>Math.round(e*10)/10;r.dataset.content=JSON.stringify({x:t(e.x*L.k+L.x),y:t(e.y*L.k+L.y),w:t(e.w*L.k),h:t(e.h*L.k)}),r.dataset.labelBoxes=JSON.stringify([...De.values()].map(({box:e})=>[t(e.x*L.k+L.x),t(e.y*L.k+L.y),t(e.w*L.k),t(e.h*L.k)]))}function Qe(){z=0;let e=performance.now(),t=x,n=`${L.k},${L.x},${L.y},${b.width},${b.height}`;if((Ne||n!==Pe)&&(Xe(),Ye(),Ne=!1,Pe=n),t.setTransform(1,0,0,1,0,0),t.drawImage(q,0,0),!k||!A)return;let i=Ae();t.setTransform(i*L.k,0,0,i*L.k,i*L.x,i*L.y),Oe=Be(A.positions,performance.now()/1e3),ve&&(t.save(),ve(t,L),t.restore()),r.dataset.zoom=L.k.toFixed(3),r.dataset.pulses=String(Oe),r.dataset.drawMs=(performance.now()-e).toFixed(1),ke=Oe>0&&!document.hidden,r.dataset.animating=String(ke),ke&&!z&&(z=requestAnimationFrame(Qe))}function $e(e,t){if(!k||!A)return;let n=W(e,t),r;for(let e of k.nodes){let t=A.positions.get(e.id);if(!t)continue;let i=e.kind===`role`?Math.abs(n.x-t.x)<=v.role/2-8&&Math.abs(n.y-t.y)<=se(e)?-1:1/0:Math.hypot(n.x-t.x,n.y-t.y)-se(e)-3;i<=0&&(!r||i<r.d)&&(r={id:e.id,d:i})}if(r)return{type:`node`,id:r.id};let i=6/L.k,a;for(let e of k.links){if(e.kind===`structure`)continue;let t=A.positions.get(e.source),r=A.positions.get(e.target);if(!t||!r)continue;let{c:o}=fe(t,r,pe(e)),s=t;for(let c=1;c<=16;c++){let l=c/16,u={x:(1-l)**2*t.x+2*(1-l)*l*o.x+l*l*r.x,y:(1-l)**2*t.y+2*(1-l)*l*o.y+l*l*r.y},d=ge(n,s,u);d<=i&&(!a||d<a.d)&&(a={l:e,d}),s=u}}if(a)return{type:`link`,link:a.l};let o=A.boxes.find(e=>n.x>=e.x&&n.x<=e.x+e.w&&n.y>=e.y&&n.y<=e.y+e.h);return o?{type:`box`,id:o.id}:void 0}function et(e){let n=B.get(e);if(!n)return``;let r=[n.label];return n.kind===`role`&&r.push(n.entry?`entry role`:`role`,n.vacant?`vacant`:`${n.staffed??0} staffed`),n.seat&&r.push(`seat: ${n.seat}`),n.kind===`team`&&r.push(n.mode===`restricted`?`restricted team`:`open team`),n.kind===`machine`&&r.push(`machine`),n.ring&&r.push(t[n.ring]),n.teams&&r.push(`in ${n.teams} teams`),n.folded&&n.kind===`session`&&r.push(`+${n.folded} folded`),r.join(` · `)}function tt(e){let t=e=>B.get(e)?.label??e;return e.kind===`structure`?``:e.kind===`policy`?`Team path ${t(e.source)} ${e.twoWay?`⇄`:`→`} ${t(e.target)}${e.kinds?.length?` · ${e.kinds.join(`, `)}`:``}${e.count?` · ${e.count} sent along it`:``}`:e.kind===`denied`?`${e.denied??e.count} denied: ${t(e.source)} → ${t(e.target)}`:`${i(e.kind)} · ${t(e.source)} → ${t(e.target)} · ${e.count}`}let Z=new Map,Q,$;b.addEventListener(`pointerdown`,e=>{b.setPointerCapture?.(e.pointerId);let t=G(e.clientX,e.clientY);if(Z.set(e.pointerId,t),Z.size===2){let[e,t]=[...Z.values()];$={d:Math.hypot(e.x-t.x,e.y-t.y)||1,k:L.k,mid:{x:(e.x+t.x)/2,y:(e.y+t.y)/2}},Q=void 0}else Q={...t,t:L,moved:!1}}),b.addEventListener(`pointermove`,e=>{let t=G(e.clientX,e.clientY);if(Z.has(e.pointerId)&&Z.set(e.pointerId,t),$&&Z.size===2){let[e,t]=[...Z.values()],n=Math.max(w,Math.min(ie,$.k*(Math.hypot(e.x-t.x,e.y-t.y)||1)/$.d)),r=W($.mid.x,$.mid.y);R=!0,Y({k:n,x:$.mid.x-r.x*n,y:$.mid.y-r.y*n},!1);return}if(Q){!Q.moved&&Math.hypot(t.x-Q.x,t.y-Q.y)>4&&(Q.moved=!0),Q.moved&&(R=!0,O.hidden=!0,Y({k:Q.t.k,x:Q.t.x+t.x-Q.x,y:Q.t.y+t.y-Q.y},!1));return}let n=$e(t.x,t.y),r=n?.type===`node`?n.id:void 0;b.style.cursor=n&&n.type!==`box`?`pointer`:`grab`,r!==P&&(P=r,K());let i=n?.type===`node`?et(n.id):n?.type===`link`?tt(n.link):``;O.hidden=!i,i&&(O.textContent=i,O.style.left=`${Math.min(t.x+14,F-220)}px`,O.style.top=`${t.y+14}px`)}),b.addEventListener(`pointerup`,e=>{if(Z.delete(e.pointerId),Z.size<2&&($=void 0),!Q)return;let t=!Q.moved;if(Q=void 0,!t)return;let n=G(e.clientX,e.clientY),r=$e(n.x,n.y);r?.type===`node`?(N=r.id,y.onNode(r.id)):r?.type===`link`?y.onLink(r.link):y.onBackground(),K()}),b.addEventListener(`pointercancel`,e=>{Z.delete(e.pointerId),Q=void 0,$=void 0}),b.addEventListener(`pointerleave`,()=>{O.hidden=!0,P!==void 0&&(P=void 0,K())}),b.addEventListener(`wheel`,e=>{e.preventDefault();let t=G(e.clientX,e.clientY);Ie(t.x,t.y,Math.exp(-e.deltaY*(e.ctrlKey?.01:.0015)))},{passive:!1}),b.addEventListener(`dblclick`,e=>{let t=G(e.clientX,e.clientY);Ie(t.x,t.y,2,!0)});let nt=e=>{let t=S.getBoundingClientRect(),{s:n,ox:r,oy:i}=be;R=!0,Le({x:(e.clientX-t.left-r)/n,y:(e.clientY-t.top-i)/n},!1)};S.addEventListener(`pointerdown`,e=>{S.setPointerCapture?.(e.pointerId),nt(e)}),S.addEventListener(`pointermove`,e=>{S.hasPointerCapture?.(e.pointerId)&&nt(e)});let rt=e=>{let t=et(e);y.announce(t?`${t}. Enter opens it.`:``)},it=e=>{let t=A?.positions.get(e);if(!t)return;let n=je(t);(n.x<40||n.y<40||n.x>F-40||n.y>I-40)&&Le(t,!0,Math.max(L.k,.7))},at=e=>{N=e,e&&(it(e),rt(e)),K()},ot=e=>{if(e.target!==r||!A)return;let t={ArrowLeft:`left`,ArrowRight:`right`,ArrowUp:`up`,ArrowDown:`down`}[e.key];t&&e.shiftKey?(e.preventDefault(),R=!0,Y({...L,x:L.x+(t===`left`?80:t===`right`?-80:0),y:L.y+(t===`up`?80:t===`down`?-80:0)},!1)):t?(e.preventDefault(),at(ne(A.positions,N??`hub`,t))):(e.key===`Enter`||e.key===` `)&&N?(e.preventDefault(),y.onNode(N)):e.key===`Home`?(e.preventDefault(),at(`hub`)):e.key===`+`||e.key===`=`||e.key===`-`||e.key===`_`?(e.preventDefault(),Ie(F/2,I/2,e.key===`+`||e.key===`=`?1.25:.8,!0)):e.key===`0`&&(e.preventDefault(),R=!1,Fe(!0))},st=()=>{N===void 0&&(N=M!==void 0&&B.has(M)?M:`hub`),rt(N),K()};r.addEventListener(`keydown`,ot),r.addEventListener(`focus`,st);let ct=()=>document.visibilityState===`visible`&&K();return document.addEventListener(`visibilitychange`,ct),{update(e,t,n){k=e,j=t,_e=n.motion,M=n.selected,V={...re,...n.look},H=s(j(`--bg`)),Se=e.now,Ce=Date.now(),U=!e.nodes.some(e=>e.kind===`session`||e.kind===`aggregate`);let i=p(e);we=new Map(i.map(e=>[e.id,e.color])),Te=m(e,{max:V.labels}),Ee=h(e),Ke=`\0`,B.clear();for(let t of e.nodes)B.set(t.id,t);A=ee(e),xe.clear();for(let e of A.boxes)B.has(e.id)&&xe.add(e.id);N!==void 0&&!B.has(N)&&(N=void 0);let a=r.dataset;a.nodes=String(e.nodes.length),a.boxes=String(A.boxes.length),a.teams=String(A.boxes.filter(e=>e.kind===`team`).length),a.policy=String(e.links.filter(e=>e.kind===`policy`).length),a.twoWay=String(e.links.filter(e=>e.kind===`policy`&&e.twoWay).length),a.denied=String(e.links.filter(e=>e.kind===`denied`).length),a.bridges=String(e.links.filter(e=>e.bridge).length),a.tethers=String(e.links.filter(e=>e.structure===`seat`&&!e.bridge).length),a.vacant=String(e.nodes.filter(e=>e.kind===`role`&&e.vacant).length),a.selected=M??``,a.regions=String(i.length),a.empty=String(U),R||Fe(!1),K()},focus(e,t){let n=A?.positions.get(e);n&&(N=e,R=!0,Le(n,t,Math.max(L.k,1)),K())},reset(e){R=!1,Fe(e)},resize(e,t){F=Math.max(1,e),I=Math.max(1,t);let n=Ae();b.width=Math.round(F*n),b.height=Math.round(I*n),b.style.width=`${F}px`,b.style.height=`${I}px`,R||Fe(!1),K()},destroy(){cancelAnimationFrame(z),cancelAnimationFrame(ye),r.removeEventListener(`keydown`,ot),r.removeEventListener(`focus`,st),document.removeEventListener(`visibilitychange`,ct),r.replaceChildren()},hitTest(e,t){let n=G(e,t);return $e(n.x,n.y)},toWorld(e,t){let n=G(e,t);return W(n.x,n.y)},setOverlay(e){ve=e,K()},layout:()=>A}}export{O as createRenderer2D};
|