@huynle/hub 0.9.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +309 -0
- package/Dockerfile +5 -1
- package/README.md +153 -77
- package/package.json +7 -4
- package/packages/claude-code/package.json +1 -1
- package/packages/cli/dist/hub-cli.js +532 -261
- package/packages/cli/package.json +1 -1
- package/packages/cli/src/cli.ts +36 -1
- package/packages/cli/src/subscriptions.ts +49 -0
- package/packages/codex/package.json +1 -1
- package/packages/codex/src/sessions.ts +10 -6
- package/packages/codex/src/spoke.ts +2 -1
- 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/app-delivery/v1.schema.json +7 -5
- package/packages/protocol/schema/app-front/v1.schema.json +410 -0
- package/packages/protocol/src/app-front.ts +293 -0
- package/packages/protocol/src/concierge.ts +10 -1
- package/packages/protocol/src/context-cards.ts +59 -0
- package/packages/protocol/src/credentials.ts +39 -2
- package/packages/protocol/src/index.ts +69 -11
- 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 +524 -0
- package/packages/sdk/src/client.ts +37 -4
- package/packages/sdk/src/envelope.ts +9 -2
- package/packages/sdk/src/errors.ts +1 -0
- package/packages/sdk/src/index.ts +1 -0
- package/packages/sdk/src/types.ts +39 -1
- package/packages/spoke-sdk/package.json +1 -1
- package/packages/spoke-sdk/src/delivery.ts +17 -1
- package/packages/spoke-sdk/src/harness-spoke.ts +4 -3
- package/packages/voice-client/README.md +146 -0
- package/packages/voice-client/src/vad/LICENSE +21 -0
- package/src/central/agent/acting-routes.ts +17 -3
- package/src/central/agent/acting.ts +12 -3
- package/src/central/agent/actor.ts +6 -1
- package/src/central/agent/app-decisions.ts +146 -0
- package/src/central/agent/app-tokens.ts +9 -3
- package/src/central/agent/audit.ts +3 -0
- package/src/central/agent/connect-routes.ts +64 -0
- package/src/central/agent/connect.ts +868 -0
- package/src/central/agent/conversation.ts +625 -0
- package/src/central/agent/decisions.ts +71 -6
- package/src/central/agent/delivery.ts +3 -0
- package/src/central/agent/directory.ts +5 -0
- package/src/central/agent/errors.ts +2 -0
- package/src/central/agent/grant-requests.ts +46 -9
- package/src/central/agent/grants.ts +13 -2
- package/src/central/agent/message-limits.ts +2 -2
- package/src/central/agent/message-routes.ts +13 -4
- package/src/central/agent/read-routes.ts +16 -2
- package/src/central/agent/routes.ts +108 -6
- package/src/central/agent/speech-routes.ts +316 -0
- package/src/central/agent/subscription-routes.ts +174 -0
- package/src/central/agent/subscriptions.ts +980 -0
- package/src/central/agent/webhooks.ts +5 -2
- package/src/central/agent-data.ts +43 -1
- package/src/central/backend/memory-counters.ts +2 -2
- package/src/central/backend/types.ts +5 -2
- package/src/central/backend/valkey-counters.ts +5 -4
- package/src/central/client-address.ts +16 -0
- package/src/central/concierge/board-render.ts +52 -1
- package/src/central/concierge/board-routes.ts +25 -2
- package/src/central/concierge/board.ts +11 -1
- package/src/central/concierge/context.ts +29 -8
- package/src/central/concierge/grant-request.ts +216 -0
- package/src/central/concierge/prompt.ts +49 -2
- package/src/central/concierge/session-routes.ts +3 -0
- package/src/central/config.ts +88 -5
- package/src/central/context-cards/budget.ts +121 -0
- package/src/central/context-cards/changes.ts +29 -0
- package/src/central/context-cards/config.ts +145 -0
- package/src/central/context-cards/engine.ts +379 -0
- package/src/central/context-cards/inputs.ts +111 -0
- package/src/central/context-cards/pickup.ts +134 -0
- package/src/central/context-cards/registry.ts +89 -0
- package/src/central/context-cards/routes.ts +37 -0
- package/src/central/context-cards/service.ts +367 -0
- package/src/central/context-cards/store.ts +67 -0
- package/src/central/context-cards/types.ts +88 -0
- package/src/central/fetcher.ts +10 -2
- package/src/central/front-relays.ts +423 -0
- package/src/central/http.ts +517 -56
- package/src/central/human-activity.ts +453 -0
- package/src/central/llm/chat.ts +133 -0
- package/src/central/push-target.ts +11 -2
- package/src/central/registry.ts +162 -9
- package/src/central/speech/service.ts +9 -0
- package/src/central/spoke-ws.ts +13 -0
- package/src/central/store.ts +9 -12
- package/src/config.ts +30 -13
- package/src/index.ts +45 -43
- package/src/rpc.ts +33 -4
- package/src/spoke/concierge-agent.ts +1 -1
- package/src/spoke/conversation.ts +6 -75
- package/src/spoke/deliver.ts +18 -8
- package/src/spoke/hub-rpc.ts +7 -2
- package/src/spoke/hub-tool-subscriptions.ts +82 -0
- package/src/spoke/hub-tool-title.ts +89 -0
- package/src/spoke/hub-tool.ts +56 -18
- package/src/spoke/session-context.ts +10 -2
- package/src/spoke/spoke.ts +209 -238
- package/src/spoke/summary.ts +36 -1
- package/src/spoke/taskboard.ts +5 -6
- package/src/spoke/voice-front.ts +323 -30
- package/src/spoke/who-teams.ts +51 -2
- package/src/tui-messaging.ts +24 -10
- package/src/tui.ts +6 -6
- package/web/dist/assets/{ArtifactPage-BKISN-Qj.js → ArtifactPage-Bz992ZX6.js} +1 -1
- package/web/dist/assets/{ArtifactPane-CKOiAUNH.js → ArtifactPane-BJZNixJC.js} +1 -1
- package/web/dist/assets/ArtifactWorkbench-Dti3VP07.js +6 -0
- package/web/dist/assets/{Diagram-vdpmp3xu.css → Diagram-7y8kg3og.css} +1 -1
- package/web/dist/assets/Diagram-B4HdUxw0.js +1 -0
- package/web/dist/assets/{Library-CcjZXsfF.js → Library-CpzD2HDW.js} +2 -2
- package/web/dist/assets/Lightbox-BlbivCkd.js +1 -0
- package/web/dist/assets/MediaImage-Ch3ryIdR.js +4 -0
- package/web/dist/assets/ProfilesDestination-DlQeogea.js +1 -0
- package/web/dist/assets/{TeamsPage-CDyjrK-I.js → TeamsPage-4xdWCaI-.js} +1 -1
- package/web/dist/assets/{Watchtower-DYwoUWME.js → Watchtower-CpQdIRns.js} +2 -2
- package/web/dist/assets/{artifacts-DU9uRgs1.js → artifacts-But87Jfo.js} +1 -1
- package/web/dist/assets/index-BC0O1gfR.css +1 -0
- package/web/dist/assets/index-BS6lA6fN.js +33 -0
- package/web/dist/assets/{live-ycZ_aQZO.js → live-CVUFIdUX.js} +2 -2
- package/web/dist/assets/{pane-layout-0RrLHGDr.js → pane-layout-BW0RdX5a.js} +1 -1
- package/web/dist/assets/{renderer2d-BIwbgRoX.js → renderer2d-IaJiloPi.js} +1 -1
- package/web/dist/assets/{renderer3d-C1a7eYGQ.js → renderer3d-ZiD1uKGW.js} +1 -1
- package/web/dist/assets/{safe-area-DHhPy61Q.js → safe-area-C7IAlkgY.js} +1 -1
- package/web/dist/assets/{source-BWlvaODa.js → source-C-De8L3s.js} +1 -1
- package/web/dist/assets/toast-CXTwTvDw.js +9 -0
- package/web/dist/assets/vad-worklet-BfxJhrXy.js +27 -0
- package/web/dist/index.html +6 -6
- package/web/dist/assets/ArtifactWorkbench-d7R1o-rs.js +0 -6
- package/web/dist/assets/Diagram-azw2B_QH.js +0 -1
- package/web/dist/assets/Lightbox-Du56MXGX.js +0 -1
- package/web/dist/assets/MediaImage-Ds_JUx3a.js +0 -4
- package/web/dist/assets/ProfilesDestination-DdzbzmeK.js +0 -1
- package/web/dist/assets/index-C3ci5UtY.css +0 -1
- package/web/dist/assets/index-LNMZCqgE.js +0 -36
- package/web/dist/assets/toast-Cuu2K0hx.js +0 -1
- /package/{web/src/voice → packages/voice-client/src}/turn/LICENSE +0 -0
|
@@ -1,5 +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,k as g,t as _,tt as v,u as y,x as b,y as x}from"./ui-CFB4wQfF.js";import{
|
|
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,k as g,t as _,tt as v,u as y,x as b,y as x}from"./ui-CFB4wQfF.js";import{B as S,F as C,L as w,M as T,N as E,P as D,R as O,U as k,V as A,j,k as M,l as N,s as ee,z as te}from"./toast-CXTwTvDw.js";import{t as P}from"./plural-Bspvoqfq.js";import{O as F,ot as I}from"./index-BS6lA6fN.js";var L={teamsPerUser:100,rolesPerTeam:32,edgesPerTeam:256,sessionsPerRole:16,openIntakePerTeam:500};function ne(e){if(!w(e))return`body must be an object`;if(!T(e.name))return`name must be 2–40 lowercase letters, digits or dashes`;if(!j(e.title))return`title must be 1–120 characters of text`;if(e.description!==void 0&&!E(e.description,4e3))return`description must be at most ${M} characters`;if(e.mode!==`open`&&e.mode!==`restricted`)return`mode must be open or restricted`;if(!Array.isArray(e.roles)||e.roles.length===0||e.roles.length>L.rolesPerTeam)return`roles must list 1–${L.rolesPerTeam} roles`;let t=new Set;for(let n of e.roles){if(!w(n)||!T(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&&!j(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>L.edgesPerTeam)return`edges must be a list of at most ${L.edgesPerTeam}`;for(let e of n){if(!w(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 C(e.tags)??D(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`):[],H=/^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$/,U=e=>({ok:!1,error:e}),W=e=>({ok:!0,spec:e});function re(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 ie(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 ae(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`,roles:e.roles.map(re).filter(e=>!!e),entryRole:typeof e.entryRole==`string`?e.entryRole:``,edges:Array.isArray(e.edges)?e.edges.map(ie).filter(e=>!!e):[],...Array.isArray(e.tags)?{tags:V(e.tags)}:{},...t?{metadata:t}:{},...Array.isArray(e.projects)?{projects:V(e.projects)}:{}}}function oe(e){if(!R(e)||!R(e.team))return;let t=e.team,n=ae(t);if(!z(t.id)||!n||B(t.revision)===void 0)return;let r=R(e.draft)?ae(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 se=(e,t)=>e.roles.some(e=>e.name===t);function ce(e,t,n){let r=t.trim();if(!H.test(r))return U(`A role name is 2–40 lowercase letters, digits or dashes`);if(se(e,r))return U(`There is already a role ${r}`);if(e.roles.length>=L.rolesPerTeam)return U(`A team has at most ${L.rolesPerTeam} roles`);let i=n?.trim();return W({...e,roles:[...e.roles,{name:r,...i?{label:i}:{}}]})}function le(e,t){return se(e,t)?e.entryRole===t?U(`${t} is the entry role: make another role the entry role first`):W({...e,roles:e.roles.filter(e=>e.name!==t),edges:e.edges.filter(e=>e.from!==t&&e.to!==t)}):U(`There is no role ${t}`)}function ue(e,t,n){let r=e.roles.findIndex(e=>e.name===t);if(r<0)return U(`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,W({...e,roles:e.roles.map((e,t)=>t===r?i:e)})}function de(e,t){return se(e,t)?W({...e,entryRole:t}):U(`There is no role ${t}`)}function fe(e,t){if(!se(e,t.from)||!se(e,t.to))return U(`A path connects two roles of the team`);if(t.from===t.to)return U(`A path connects two different roles`);let n=[`msg`,`ask`].filter(e=>t.kinds.includes(e));if(n.length===0)return U(`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>=L.edgesPerTeam?U(`A team has at most ${L.edgesPerTeam} paths`):W({...e,edges:[...i,{from:t.from,to:t.to,kinds:n,direction:t.direction}]})}function pe(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)?W({...e,edges:e.edges.filter(e=>!r(e))}):U(`There is no path ${t} → ${n}`)}var me=(e,t)=>W({...e,mode:t});function he(e,t){let n={...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
2
|
`)){if(!n.trim())continue;let t=n.indexOf(`=`);if(t<=0)return U(`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 W(n)}var ge=e=>(e.tags??[]).join(`, `),_e=e=>Object.entries(e.metadata??{}).map(([e,t])=>`${e}=${t}`).join(`
|
|
3
3
|
`);function ve(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=ne(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 ye=e=>e.some(e=>e.level===`error`),be=e=>({past:[],present:e,future:[]});function xe(e,t){return JSON.stringify(t)===JSON.stringify(e.present)?e:{past:[...e.past,e.present].slice(-100),present:t,future:[]}}function Se(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 Ce(e){return e.future.length===0?e:{past:[...e.past,e.present],present:e.future[0],future:e.future.slice(1)}}function we(e,t){return{expectedRevision:t,title:e.title,description:e.description??null,mode:e.mode,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 Te(e){let t=e.name.trim();if(!H.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(!H.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();return{ok:!0,body:{name:t,title:n,mode:e.mode,roles:[{name:r,...i?{label:i}:{}}],entryRole:r,edges:[]}}}var Ee=e=>JSON.stringify(e,(e,t)=>R(t)?Object.fromEntries(Object.keys(t).sort().map(e=>[e,t[e]])):t);function De(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)&&Ee(e.get(n))!==Ee(t.get(n)))}}function Oe(e,t){let n=[`title`,`description`,`mode`,`entryRole`].filter(n=>(e[n]??``)!==(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:De(r(e),r(t)),edges:De(i(e),i(t)),tags:a(e.tags,t.tags),metadata:De(new Map(Object.entries(e.metadata??{})),new Map(Object.entries(t.metadata??{}))),projects:a(e.projects,t.projects)}}function ke(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 Ae={title:`title`,description:`description`,mode:`communication (open/restricted)`,entryRole:`entry role`},je=e=>e.replace(`>`,` → `);function Me(e){let t=[];e.fields.length&&t.push(`Changed: ${e.fields.map(e=>Ae[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,je),n(`Paths removed`,e.edges.removed,je),n(`Paths changed`,e.edges.changed,je),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 Ne=e=>Me(e).length===0;function Pe(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 Fe(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)??L.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`}:void 0).filter(e=>!!e&&!!z(e.s.id)&&!!z(e.s.sessionID)).map(({s:e,presence:t})=>({staffingID:e.id,sessionID:e.sessionID,revision:B(e.revision)??1,generation:B(e.generation)??1,presence:t}))}));return{roles:n,seats:n.flatMap(e=>e.seats.map(t=>({sessionID:t.sessionID,role:e.role})))}}function Ie(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 Le(e,t){let n=`role:${t}:`;return e.startsWith(n)?e.slice(n.length):void 0}function Re(e,t,n){let r=Le(n,e);if(r===void 0)return;let i=Le(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 ze(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&&!H.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();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}:{}}}}}var Be=[`low`,`normal`,`high`,`urgent`];function Ve(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
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=Be.find(t=>t===e.priority);return{ok:!0,body:{title:t,...n?{brief:n}:{},...i&&i!==`normal`?{priority:i}:{},...r.length?{criteria:r}:{}}}}var He=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Ue=e=>typeof e==`string`&&e.length>0?e:void 0,We=e=>typeof e==`number`&&Number.isFinite(e)?e:void 0,Ge=[`queued`,`routed`,`done`,`cancelled`,`failed`],Ke=[`open`,`in_progress`,`blocked`];function qe(e){if(!He(e)||!Ue(e.id)||typeof e.title!=`string`)return;let t=Ge.find(t=>t===e.status),n=We(e.createdAt);if(!t||n===void 0)return;let r=Ke.find(t=>t===e.progress),i={id:e.id,title:e.title,status:t,priority:Ue(e.priority)??`normal`,revision:We(e.revision)??1,createdAt:n,updatedAt:We(e.updatedAt)??n};r&&(i.progress=r);for(let t of[`sessionID`,`workspaceID`,`assignmentID`,`reason`,`lastError`,`ref`])Ue(e[t])&&(i[t]=e[t]);return i}function Je(e){let t=(He(e)&&Array.isArray(e.items)?e.items:[]).map(qe).filter(e=>!!e).sort((e,t)=>t.createdAt-e.createdAt),n=He(e)?Ue(e.cursor):void 0;return n?{items:t,cursor:n}:{items:t}}var Ye={queued:`Queued`,routed:`Routed`,in_progress:`In progress`,blocked:`Blocked`,done:`Done`,failed:`Failed`,cancelled:`Cancelled`};function Xe(e){return e.status===`routed`?e.progress===`in_progress`||e.progress===`blocked`?e.progress:`routed`:e.status}var Ze=e=>e.status===`queued`||e.status===`routed`;function Qe(e){let t=(...e)=>[`queued`,`routed`,`working`,`closed`].map((t,n)=>({step:t,state:e[n]}));switch(Xe(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 $e(e){if(!He(e))return;let t=t=>We(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 et=e=>e.queued+e.routed;function tt(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:et(n)}:{}}}function nt(e){return(He(e)&&Array.isArray(e.items)?e.items:[]).filter(He).map(e=>({version:We(e.version),publishedAt:We(e.publishedAt)})).filter(e=>e.version!==void 0&&e.publishedAt!==void 0).sort((e,t)=>t.version-e.version)}var rt=(e,t)=>t?e.nodes.find(e=>e.kind===`machine`&&e.machineID===t)?.label:void 0,it=e=>e.status!==`offline`&&e.status!==`ended`;function at(e,t){return e.seats.map(e=>{let n=t?.nodes.find(t=>t.id===e.sessionID&&t.kind===`session`),r=t&&n?rt(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 ot(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=rt(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:it(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 st(e){if(e.visible)return e.openWork?5e3:3e4}function ct(e,t,n){return e>=n?e>n?`full (${e} of ${n})`:`full (${n})`:t>0&&e<t?`${e} of ${t} required`:`${P(e,`member`)} · up to ${n}`}var lt=[`msg`,`ask`,`reply`,`decision`,`launch`,`policy`],ut=[...lt,`denied`],dt=[`working`,`idle`,`needs-you`,`error`,`offline`,`ended`],G=e=>typeof e==`object`&&!!e&&!Array.isArray(e),K=e=>typeof e==`string`&&e.length>0?e:void 0,q=e=>typeof e==`number`&&Number.isFinite(e)?e:void 0,ft=e=>Array.isArray(e)?e.filter(e=>typeof e==`string`&&e.length>0):[];function pt(e){if(!G(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 mt(e){if(!G(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 ht(e){return Array.isArray(e)?e.filter(e=>G(e)&&!!K(e.teamID)&&!!K(e.role)).map(e=>({teamID:e.teamID,role:e.role})):[]}var gt=new Set([`hub`,`machine`,`session`,`user`,`team`]),_t=new Set([`idle`,`working`,`blocked`,`error`,`offline`,`ended`]),J=(e,t)=>t===void 0?{}:{[e]:t};function vt(e){if(!G(e))return;let t=K(e.id),n=K(e.kind);if(!t||!n||!gt.has(n))return;let r=K(e.status),i=n===`session`&&e.concierge===!0,a=K(e.label)??t;return{id:t,kind:e.party===`app`?`app`:n,label:i&&!a.startsWith(`@`)?`@@concierge`:a,...J(`concierge`,i?!0:void 0),...J(`machineID`,K(e.machineID)),...J(`harness`,K(e.harness)),...J(`parentID`,K(e.parentID)),...J(`rootID`,K(e.rootID)),...J(`supervisorID`,K(e.supervisorID)),...J(`launchID`,K(e.launchID)),depth:q(e.depth)??0,...J(`status`,r&&_t.has(r)?r:void 0),...J(`online`,typeof e.online==`boolean`?e.online:void 0),roles:ft(e.roles),workspaceIDs:ft(e.workspaceIDs),teamIDs:ft(e.teamIDs),harnesses:ft(e.harnesses),...J(`project`,K(e.project)),...J(`lastSeen`,q(e.lastSeen)),tags:ft(e.tags),...J(`labels`,mt(e.labels)),seats:ht(e.seats),...J(`name`,K(e.name)),projects:ft(e.projects),...J(`mode`,e.mode===`open`||e.mode===`restricted`?e.mode:void 0),...J(`paused`,e.paused===!0||void 0),...J(`metadata`,mt(e.metadata)),...J(`entryRole`,K(e.entryRole))}}function yt(e,t){if(!G(e))return;let n=K(e.id),r=K(e.kind),i=K(e.from),a=K(e.to);if(n&&r&<.includes(r)&&i&&a&&t.has(i)&&t.has(a))return{id:n,kind:r,from:i,to:a,count:q(e.count)??0,lastAt:q(e.lastAt)??0,...J(`firstAt`,q(e.firstAt)),...J(`states`,pt(e.states)),...J(`delivery`,pt(e.delivery)),...J(`declined`,q(e.declined)||void 0),...J(`denied`,q(e.denied)||void 0),...J(`roleAddressed`,q(e.roleAddressed)||void 0),...J(`teamID`,K(e.teamID)),...J(`permitted`,typeof e.permitted==`boolean`?e.permitted:void 0),...J(`kinds`,ft(e.kinds).length?ft(e.kinds):void 0)}}function bt(e){if(!G(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=vt(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=>yt(e,n)).filter(e=>e!==void 0),i=q(e.at)??0,a=G(e.window)?{since:q(e.window.since)??0,until:q(e.window.until)??i}:{since:0,until:i},o=G(e.retention)?e.retention:{};return{at:i,window:a,nodes:[...t.values()],edges:r,truncated:o.truncated===!0,...J(`oldestAt`,q(o.oldestAt)),capped:e.capped===!0,hiddenMessages:G(e.hidden)?q(e.hidden.messages)??0:0}}function xt(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 St={working:`Working`,idle:`Idle`,"needs-you":`Needs you`,error:`Error`,offline:`Offline`,ended:`Ended`},Ct={working:`--blue`,idle:`--faint`,"needs-you":`--warn`,error:`--err`,offline:`--line-2`,ended:`--faint`},wt={working:`pulse`,idle:`thin`,"needs-you":`thick`,error:`double`,offline:`broken`,ended:`none`},Tt=[`--accent`,`--blue`,`--violet`,`--orange`,`--ok`,`--warn`],Et=[`●`,`▲`,`■`,`◆`,`★`,`⬟`,`✚`,`⬢`],Dt=[`opencode`,`claude-code`,`codex`],Ot={opencode:`sphere`,"claude-code":`cube`,codex:`octahedron`},kt=e=>e.harness??`unknown`,At=e=>Ot[e]??(e===`unknown`?`dodecahedron`:`tetrahedron`),jt=e=>e===`unknown`?`Unknown harness`:F(e),Mt={sphere:`circle`,cube:`square`,octahedron:`diamond`,tetrahedron:`triangle`,dodecahedron:`pentagon`},Nt=[{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).`}],Pt=()=>Nt,Ft=e=>Nt.find(t=>t.kind===e).label,It=e=>Nt.find(t=>t.kind===e).color,Lt={"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`}},Rt={machine:`Machine`,harness:`Harness`,workspace:`Workspace`,team:`Team`,none:`Nothing`},zt={window:`24h`,groupBy:`machine`,tree:!0,kinds:new Set([`msg`,`ask`,`reply`,`decision`,`launch`,`denied`]),search:``},Bt=e=>`machine:${e}`,Vt=e=>e.kind===`hub`||e.kind===`user`||e.kind===`app`;function Ht(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:Tt[n%Tt.length],symbol:Et[n%Et.length],sessions:t.filter(e=>e.machineID===r).length,online:e.online===!0}})}function Ut(e){let t=new Map;for(let n of e)t.set(kt(n),(t.get(kt(n))??0)+1);let n=e=>Dt.includes(e)?Dt.indexOf(e):e===`unknown`?1e3:100;return[...t.keys()].sort((e,t)=>n(e)-n(t)||e.localeCompare(t)).map(e=>({id:e,label:jt(e),shape:At(e),sessions:t.get(e)}))}function Wt(e){return e.every(e=>e.kind===`policy`)?`dotted`:Zt(e)?`dashed`:`solid`}var Gt=e=>Math.round((.6+Math.min(5.4,Math.log2(1+Math.max(0,e))*1.2))*100)/100,Kt={holdMs:5e3,liveHalfLifeMs:45e3,idleHalfLifeMs:6e3,floor:.05};function qt(e,t){if(!e.lastAt)return 0;let n=Math.max(0,t-e.lastAt);if(n<=Kt.holdMs)return 1;if(n>9e5)return 0;let r=.5**((n-Kt.holdMs)/(e.live?Kt.liveHalfLifeMs:Kt.idleHalfLifeMs));return r<Kt.floor?0:r}function Jt(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 Yt=e=>e===`dropped`||e===`expired`?`not delivered`:e,Xt=e=>e&&Object.keys(e).length?Object.entries(e).map(([e,t])=>`${Yt(e)} ${t}`).join(`, `):void 0,Zt=e=>e.some(e=>(e.delivery?.pending??0)+(e.delivery?.queued??0)>0||(e.states?.open??0)>0),Y=(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 Qt(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=Zt(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:Gt(i),style:Wt(t.edges),particles:Jt(i,qt({lastAt:a,live:o},n.now),n),live:o,edgeIDs:t.edges.map(e=>e.id)}})}function $t(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:Gt(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:Gt(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 en(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 tn(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 X=(e,t)=>`role:${e}:${t}`,nn=`group:none`,rn={machine:`No machine`,harness:`Sessions`,workspace:`No workspace`,team:`No team`,none:`All sessions`},an=(e,t)=>e.label.localeCompare(t.label)||(e.id<t.id?-1:+(e.id>t.id));function on(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?tn(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||kt(e)===t.harness)&&(!t.states?.size||xt(e)!==void 0&&t.states.has(xt(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 sn=e=>!!(e.machine||e.harness||e.states?.size||e.team||e.role||e.project||e.workspace||e.tag||e.meta?.trim());function cn(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(on(e,t)),s=new Set(o.map(e=>e.id)),c=Ht(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(Vt),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))&&(!sn(t)||o.some(t=>t.teamIDs.includes(e.id)))).sort(an):[],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(X(e.teamID,e.role),(S.get(X(e.teamID,e.role))??0)+1)}let C=e=>s.has(e)||i.has(e)&&Vt(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(Bt(e.machineID))?Bt(e.machineID):`hub`;case`harness`:{let t=kt(e),n=`group:harness:${t}`;return D.has(n)||D.set(n,{id:n,kind:`cluster`,label:jt(t),shape:At(t),size:en(`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:en(`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},N=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`?nn:r;if(!_||a===nn)return{group:a};let o=A(n);return o?{group:a,section:X(o.teamID,o.role)}:{group:a}},ee=e=>{let t=e.teamIDs.filter(e=>h.has(e)).length;return t>1?t:void 0},te=(e,t)=>({id:e.id,kind:`session`,label:e.label,...J(`machine`,e.machineID===void 0?void 0:l.get(e.machineID)),harness:kt(e),shape:At(kt(e)),...J(`ring`,xt(e)),size:en(`session`,E.get(e.id)??0),match:!1,dim:!1,...J(`folded`,t),...J(`teams`,ee(e)),...J(`seat`,_?A(e)?.role:void 0)}),P=e=>({id:e.id,kind:`team`,label:e.label,size:en(`team`),match:!1,dim:!1,...J(`mode`,e.mode),...J(`paused`,e.paused)}),F=e=>[...d.map(e=>({id:e.id,kind:e.kind,label:e.label,size:en(e.kind),match:!1,dim:!1})),...f.map(e=>({id:e.id,kind:`machine`,label:e.label,...J(`machine`,e.machineID===void 0?void 0:l.get(e.machineID)),...J(`ring`,e.online===!1?`offline`:void 0),size:en(`machine`),match:!1,dim:!1})),...v.map(P),...e?v.flatMap(e=>x.get(e.id).map(t=>({id:X(e.id,t),kind:`role`,label:t,size:en(`role`),match:!1,dim:!1,team:e.id,entry:t===e.entryRole,staffed:S.get(X(e.id,t))??0,vacant:!S.get(X(e.id,t))}))):[]],I=e=>[...d.filter(e=>e.id!==`hub`).map(e=>Y(`hub`,e.id,`party`)),...f.map(e=>Y(`hub`,e.id,`group`)),...v.map(e=>Y(`hub`,e.id,`group`)),...e?v.flatMap(e=>x.get(e.id).map(t=>Y(e.id,X(e.id,t),`team`))):[]],L=(e,t,n)=>{for(let r of n){let n=D.get(r);n&&(e.push(n),t.push(Y(`hub`,r,`group`)))}},ne=(e,n,r,i)=>{let a=i&&t.tree?j(e):void 0;a!==void 0&&n.push(Y(a,e.id,`tree`));let o=_?A(e):void 0;if(o)n.push(Y(X(o.teamID,o.role),e.id,`seat`));else if(a===void 0){let t=k(e);r.add(t),n.push(Y(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(Y(X(t.teamID,t.role),e.id,`seat`,!0))},R=new Map,z=`full`,B=F(!0),V=I(!0),H=new Set;for(let e of o)B.push(te(e)),ne(e,V,H,!0),R.set(e.id,N(e));L(B,V,H),V.push(...Qt(T,e=>e,n,a),...$t(T,e=>e,t.kinds));let U=!1;if(B.length>r){z=`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))}B=F(!0),V=I(!0),H.clear(),R.clear();for(let[t,n]of e){let e=i.get(t);B.push(te(e,n||void 0)),ne(e,V,H,!1),R.set(t,N(e))}L(B,V,H);let c=e=>s.has(e)?M(i.get(e)).id:e;if(V.push(...Qt(T,c,n,a),...$t(T,c,t.kinds)),B.length>r){if(t.groupBy===`none`)U=!0;else{z=`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);B=F(!1),V=I(!1),H.clear(),R.clear();for(let[t,n]of e){let e=t.slice(4);H.add(e);let r=D.get(e)??B.find(t=>t.id===e);B.push({id:t,kind:`aggregate`,label:`${n} sessions${r&&r.id!==`hub`?` · ${r.label}`:``}`,...J(`machine`,r?.machine),size:en(`aggregate`,0,n),match:!1,dim:!1,folded:n}),V.push(Y(e,t,`group`)),R.set(t,{group:e===`hub`?nn:e})}L(B,V,H);let l=e=>s.has(e)?c(i.get(e)):e;V.push(...Qt(T,l,n,a),...$t(T,l,t.kinds)),B.length>r&&(U=!0)}}}let W=t.search.trim().toLowerCase(),re=0;return W&&(B=B.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(W);return r&&re++,{...e,match:r,dim:!r}})),{groups:ie(),teams:v.map(e=>({id:e.id,label:e.label,...J(`mode`,e.mode),...J(`paused`,e.paused),...J(`entryRole`,e.entryRole),members:o.filter(t=>t.teamIDs.includes(e.id)).length})),nodes:B,links:V,machines:c,harnesses:Ut(o),lod:z,tooLarge:U,matches:re,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 ie(){let e=new Map,n=(t,n=[{members:[]}])=>e.set(t.id,{group:t,sections:n}),r=z!==`groups`;for(let e of f)n({id:e.id,label:e.label,kind:`machine`,...J(`machine`,e.machineID===void 0?void 0:l.get(e.machineID)),online:e.online===!0});let a=Ut(o).map(e=>`group:harness:${e.id}`),s=[...D.values()].sort(t.groupBy===`harness`?(e,t)=>a.indexOf(e.id)-a.indexOf(t.id):an);for(let e of s)(H.has(e.id)||[...R.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`,...J(`mode`,e.mode),...J(`paused`,e.paused),...J(`entryRole`,e.entryRole)},r?x.get(e.id).map(t=>({id:X(e.id,t),label:t,entry:t===e.entryRole,members:[]})):[{members:[]}]);let c=()=>e.get(nn)??(n({id:nn,label:rn[t.groupBy],kind:`none`}),e.get(nn)),u=[...R.keys()],d=new Map;for(let e of u){let t=i.get(e)?.parentID;t!==void 0&&R.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=R.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||!R.has(t))&&m(e,0)}for(let e of u)m(e,0);let h=[...e.values()].filter(e=>e.group.id!==nn),g=e.get(nn);return g&&h.push(g),h.map(e=>({...e.group,sections:e.sections.map(e=>({...J(`id`,e.id),...J(`label`,e.label),...e.entry===void 0?{}:{entry:e.entry},members:e.members}))}))}}function ln(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 un(e){let t={};for(let n of e){let e=xt(n);e&&(t[e]=(t[e]??0)+1)}return t}var dn=`app:concierge`;function fn(e){if(e.id===dn)return`service`;if(e.concierge)return e.status===`ended`||/ \(previous\)$/.test(e.label)?`previous`:`current`}function pn(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,...J(`ring`,xt(n)),...J(`machine`,f),...J(`harness`,n.kind===`session`?jt(kt(n)):void 0),...J(`project`,n.project),roles:n.roles,workspaceIDs:n.workspaceIDs,...J(`parentID`,n.parentID),...J(`supervisorID`,n.supervisorID),...J(`supervisorLabel`,n.supervisorID?r(n.supervisorID):void 0),...J(`launchID`,n.launchID),...J(`concierge`,n.concierge),...J(`conciergeRole`,fn(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:un(a),machinesOnline:{online:p.filter(e=>e.online).length,total:p.length}}:{},...o?{states:un(a.filter(e=>o.has(e.id)))}:{},...J(`online`,n.online),...J(`lastSeen`,n.lastSeen),openable:n.kind===`session`,seats:n.seats.map(e=>({teamID:e.teamID,team:r(e.teamID),role:e.role})),...J(`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{...J(`mode`,e.mode),...J(`entryRole`,e.entryRole),...J(`paused`,e.paused),tags:e.tags,...J(`metadata`,e.metadata),members:r}}}function mn(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:Ft(n.kind),fromLabel:r(n.from),toLabel:r(n.to),...J(`teamLabel`,n.teamID?r(n.teamID):void 0)}}function hn(e){if(!G(e)||!Array.isArray(e.messages))return{messages:[]};let t=[];for(let n of e.messages){if(!G(n))continue;let e=K(n.id),r=K(n.kind),i=K(n.state),a=K(n.from),o=K(n.to),s=q(n.at);e&&r&&i&&a&&o&&s!==void 0&&t.push({id:e,kind:r,state:i,from:a,to:o,at:s,...J(`delivery`,K(n.delivery)),...J(`decisionID`,K(n.decisionID))})}return{messages:t,...J(`cursor`,K(e.cursor))}}function gn(e){if(!G(e)||!G(e.message))return;let t=e.message,n=K(t.id);if(!n||typeof t.text!=`string`)return;let r=G(e.answer)&&typeof e.answer.text==`string`?e.answer.text:void 0;return{id:n,text:t.text,...J(`at`,q(t.at)),...J(`kind`,K(t.kind)),...J(`state`,K(t.state)),...J(`answer`,r)}}function _n(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=xt(e);if(p.push({id:e.id,label:e.label,machine:e.machineID&&l.get(e.machineID)||`—`,harness:jt(kt(e)),state:n?St[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:Ft(e.kind),from:h(e.from),to:h(e.to),count:e.count,lastAt:e.lastAt,style:Wt([e])})).sort((e,t)=>t.count-e.count||t.lastAt-e.lastAt)}}var vn=(e,t)=>`/api/agent/graph?since=${t-Lt[e.window].ms}&until=${t}`,yn=new Set([`catalog`,`status`,`decision`,`agent`,`resync`]),bn=e=>typeof e.type==`string`&&yn.has(e.type),xn=[`3d`,`2d`,`list`],Sn=`watchtower.view`,Cn=`watchtower.presets`,wn=`watchtower.`,Tn=`birdsEye.`;function En(e){try{let t=[];for(let n=0;n<e.length;n++){let r=e.key(n);r?.startsWith(Tn)&&t.push(r)}for(let n of t)try{let t=e.getItem(n),r=wn+n.slice(9);t!==null&&e.getItem(r)===null&&e.setItem(r,t),e.removeItem(n)}catch{}}catch{}}var Dn=e=>e!==null&&e in Lt,On=e=>e!==null&&e in Rt,kn=e=>typeof e==`string`&&xn.includes(e),An=[[`machine`,`machine`],[`harness`,`harness`],[`team`,`team`],[`role`,`role`],[`project`,`project`],[`workspace`,`ws`],[`tag`,`tag`],[`meta`,`meta`],[`q`,`q`]],jn=200,Mn=(e,t)=>e.length===t.size&&e.every(e=>t.has(e)),Nn=e=>kn(e)?e:void 0;function Pn(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 An){let r=n.get(t)?.trim();r&&(s[e]=r.slice(0,jn))}let c=n.get(`state`),l=n.get(`kinds`),u=l===null?void 0:ut.filter(e=>l.split(`,`).includes(e));return{window:Dn(r)?r:zt.window,view:kn(a)?a:t??`3d`,groupBy:On(i)?i:zt.groupBy,...o?{selected:{type:o[1],id:o[2]}}:{},...s,...c&&dt.includes(c)?{state:c}:{},...u&&!Mn(u,zt.kinds)?{kinds:u}:{},...n.get(`tree`)===`0`?{tree:!1}:{}}}function Fn(e,t=`3d`){let n=new URLSearchParams;e.window!==zt.window&&n.set(`window`,e.window),(e.view!==`3d`||t!==`3d`)&&n.set(`view`,e.view),e.groupBy!==zt.groupBy&&n.set(`group`,e.groupBy);for(let[t,r]of An)e[t]&&n.set(r,e[t]);e.state&&n.set(`state`,e.state),e.kinds&&!Mn(e.kinds,zt.kinds)&&n.set(`kinds`,ut.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 In(e){return{window:e.window,groupBy:e.groupBy,tree:e.tree!==!1,kinds:e.kinds?new Set(e.kinds):zt.kinds,...e.state?{states:new Set([e.state])}:{},...J(`machine`,e.machine),...J(`harness`,e.harness),...J(`team`,e.team),...J(`role`,e.role),...J(`project`,e.project),...J(`workspace`,e.workspace),...J(`tag`,e.tag),...J(`meta`,e.meta),search:e.q??``}}function Ln(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(an).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 Rn=e=>{let{selected:t,...n}=e;return Fn({...n,view:`3d`})};function zn(e,t){return{...Pn(t,e.view),view:e.view,...e.selected?{selected:e.selected}:{}}}function Bn(e){try{let t=JSON.parse(e??`[]`);return Array.isArray(t)?t.filter(e=>G(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 Vn(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 Hn=(e,t)=>e.filter(e=>e.name!==t);function Un(e){return e instanceof j?{kind:`offline`,message:e.message}:e instanceof E?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 Wn(e){let t=bt(await w(e));if(!t)throw Error(`The hub answered something that isn't an interaction graph`);return t}var Gn=(e,t)=>`since=${t-Lt[e].ms}&until=${t}`;async function Kn(e,t,n,r){let i=`/api/agent/graph/${e.type===`edge`?`edges`:`nodes`}/${C(e.id)}`;return hn(await w(`${i}?${Gn(t,n)}&limit=50${r?`&cursor=${C(r)}`:``}`))}async function qn(e){let t=gn(await w(`/api/agent/messages/${C(e)}`));if(!t)throw Error(`The hub didn't return this message's text`);return t}var Jn=`/api/agent/teams`,Z=e=>`${Jn}/${C(e)}`,Q=async(e,t,n,r)=>(await te(e,{method:t,...n===void 0?{}:{json:n},...r?{headers:{"idempotency-key":r}}:{}})).json().catch(()=>({}));function Yn(e){let t=oe(e);if(!t)throw Error(`The hub answered something that isn't a team`);return t}async function Xn(){return((await w(`${Jn}?limit=200`)).items??[]).map(e=>oe({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 Zn(e=`all`){return((await w(`${Jn}?limit=200&state=${e}`)).items??[]).flatMap(e=>{let t=oe({team:e}),n=ae(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 Qn(e){let t=await w(`${Z(e)}/status`),n=Fe({roster:t.roster}),r=$e(t.intake);return{...n?{roster:n}:{},...r?{intake:r}:{}}}async function $n(e,t=50){return Je(await w(`${Z(e)}/intake?limit=${t}`)).items}async function er(e,t,n,r,i){return qe((await Q(`${Z(e)}/intake/${C(t)}/status`,`POST`,{status:n,expectedRevision:r,...i?{reason:i}:{}})).intake)}async function tr(e){return nt(await w(`${Z(e)}/versions?limit=50`))}async function nr(e,t,n){return await Q(`${Z(e)}/${t?`archive`:`restore`}`,`POST`,{expectedRevision:n}),rr(e)}var rr=async e=>Yn(await w(Z(e))),ir=async(e,t)=>Yn(await Q(Jn,`POST`,e,t));async function ar(e,t,n){return await Q(Z(e),`PATCH`,we(t,n)),rr(e)}async function or(e,t){return await Q(`${Z(e)}/draft?expectedRevision=${t}`,`DELETE`),rr(e)}async function sr(e){let t=ke(await w(`${Z(e)}/diff?to=draft`));if(!t)throw Error(`The hub didn't answer a diff`);return t}async function cr(e,t){return await Q(`${Z(e)}/publish`,`POST`,{expectedRevision:t}),rr(e)}async function lr(e,t,n){return await Q(`${Z(e)}/${t?`pause`:`resume`}`,`POST`,{expectedRevision:n}),rr(e)}async function ur(e){let t=Fe(await w(`${Z(e)}/roster`));if(!t)throw Error(`The hub didn't answer a roster`);return t}var dr=(e,t,n,r)=>Q(`${Z(e)}/staffing`,`PUT`,{role:t,sessionID:n},r),fr=(e,t,n)=>Q(`${Z(e)}/staffing/launch`,`POST`,t,n),pr=(e,t,n)=>Q(`${Z(e)}/staffing/${C(t)}?expectedRevision=${n}`,`DELETE`);async function mr(e,t,n){let r=await Q(`${Z(e)}/intake`,`POST`,t,n),i=qe(r.intake);return{id:String(r.intake?.id??``),status:String(r.intake?.status??`queued`),...i?{intake:i}:{}}}async function hr(){try{return((await w(`/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 gr=()=>crypto.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2)}`;function _r(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(),D=()=>o()?.present,O=e=>JSON.stringify(e??null),k=p(()=>!!o()&&O(D())!==O(l())),A=p(()=>D()?ve(D()):[]),j=()=>n()?.team,M=()=>j()?.id??e,N=p(()=>new Set(n()?.published.roles.map(e=>e.name)??[])),ee=p(()=>n()&&D()?Oe(n().published,D()):void 0),te=p(()=>(g()??[]).some(Ze)),P=()=>t.onChanged?.(),F=async()=>{try{f(await ur(e))}catch{f(void 0)}},I=async()=>{if(t.intake)try{let[e,t]=await Promise.all([$n(M()),Qn(M()).catch(()=>({}))]);_(e),y(``),t.intake&&h(t.intake)}catch(e){y(Pe(e).message),g()||_([])}},L=(e,t)=>{let n=e.draft??e.published;r(e),u(n);let i=o();(!t||!i)&&c(be(n))},ne=async()=>{try{L(await rr(e),!1),await Promise.all([F(),I()])}catch(e){a(e instanceof E&&e.status===404?`This hub doesn't have that team (or teams at all).`:Pe(e).message)}},R=async()=>{if(!S()&&n()){try{let t=await rr(e);t.team.revision!==j()?.revision&&L(t,k())}catch{}await Promise.all([F(),I()])}},z=async t=>{C(!0),x(void 0);try{await t()}catch(t){let n=Pe(t);if(n.kind===`conflict`){try{L(await rr(e),!0),await F()}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)}},B,V=e=>{if(!e.ok)return x(B={kind:`error`,text:e.error});B&&b()===B&&x(void 0),B=void 0,T(void 0),c(xe(o(),e.spec))},H=()=>o()&&c(Se(o())),U=()=>o()&&c(Ce(o())),W=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?U():H())},re=async()=>{let t=await ar(e,D(),j().revision);return L(t,!1),t},ie=()=>z(async()=>{await re(),x({kind:`ok`,text:`Draft saved. It isn't live until you publish it.`})}),ae=()=>z(async()=>{k()&&await re(),j().hasDraft?T(await sr(e)):x({kind:`ok`,text:`Nothing to publish: the draft matches version ${j().version}.`})}),oe=()=>z(async()=>{let t=j().version,n=await cr(e,j().revision);L(n,!1),T(void 0),await F(),P(),x({kind:`ok`,text:n.team.version>t?`Published version ${n.team.version}.`:`Nothing changed: the draft matched the published version.`})}),se=()=>z(async()=>{j().hasDraft?L(await or(e,j().revision),!1):L(n(),!1),T(void 0),x({kind:`ok`,text:`Draft discarded.`})}),ce=()=>z(async()=>{let t=!j().paused;L(await lr(e,t,j().revision),!0),P(),x({kind:`ok`,text:t?`Paused: the team takes no new work or members until you resume it.`:`Resumed: the team takes work again.`})}),le=()=>z(async()=>{let t=j().state!==`archived`;L(await nr(e,t,j().revision),!0),P(),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.`})}),ue=gr(),de=async(t,n,r)=>{let i=!1;return await z(async()=>{await dr(e,t,n,ue),ue=gr(),await F(),P(),x({kind:`ok`,text:`${r} is staffed as ${t}.`}),i=!0}),i},fe=(t,n,r,i)=>z(async()=>{await pr(e,t,n),await F(),P(),x({kind:`ok`,text:`${r} no longer holds ${i}.`})}),pe=gr(),me=async(t,n)=>{let r=!1;return await z(async()=>{let i=await fr(e,n,pe);pe=gr(),await F(),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},he=gr();return{id:e,read:n,team:j,spec:D,hist:o,dirty:k,probs:A,roster:d,summary:m,items:g,intakeError:v,openWork:te,notice:b,setNotice:x,busy:S,preview:w,setPreview:T,publishedRoles:N,localPreview:ee,loadError:i,blocked:()=>ye(A()),fieldProblem:(e,t)=>A().find(n=>n.field===e&&n.level===t)?.message,load:ne,refresh:R,loadRoster:F,loadIntake:I,apply:V,undo:H,redo:U,onKey:W,saveDraft:ie,review:ae,publish:oe,discard:se,togglePause:ce,toggleArchive:le,attach:de,unstaff:fe,launch:me,submit:async e=>{let t=!1;return await z(async()=>{let r=await mr(M(),e,he);he=gr(),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&&I(),t},setIntake:(e,t)=>z(async()=>{let n=await er(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 vr=g(`<p>Missing grants:`),yr=g(`<ul>`),br=g(`<p class=muted>Staffing never issues grants: grant these in Settings → Agents, or staff the role yourself here.`),xr=g(`<div><p>`),Sr=g(`<li>`),Cr=g(`<span>`),wr=g(`<label class=te-field><span>`),Tr=g(`<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`),Er=g(`<span class="te-chip te-chip-warn">Paused: no new members or tasks`),Dr=g(`<span class="te-chip te-chip-warn">Archived: its policy no longer applies`),Or=g(`<p class=te-status role=status aria-label="Team state"><span class=te-chip>`),kr=g(`<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`),Ar=g(`<p class="muted te-pending">Unsaved: `),jr=g(`<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`),Mr=g(`<div role=alert class=te-problems><p>Fix these before saving:</p><ul>`),Nr=g(`<p>No changes against version <!>.`),Pr=g(`<input>`),Fr=g(`<textarea>`),Ir=g(`<p class=te-err role=alert>`),Lr=g(`<ul class=te-roles aria-label=Roles>`),Rr=g(`<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`),zr=g(`<span class=te-chip>new in draft`),Br=g(`<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`),Vr=g(`<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.`),Hr=g(`<ul class=te-paths aria-label=Paths>`),Ur=g(`<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`),Wr=g(`<p class=muted>No paths yet. `),Gr=g(`<span class=te-err> — `),Kr=g(`<li><span> <!> <!> · <!> · </span> <button type=button class="btn small">Edit</button><button type=button class="btn small">Remove`),qr=g(`<option>`),Jr=g(`<p><strong>Restricted.</strong> Members may only use these paths; the entry role <code></code> receives the team's work.`),Yr=g(`<ul class=tm-edges>`),Xr=g(`<div class=tm-policy aria-label="Published communication">`),Zr=g(`<p><strong>Open team.</strong> Every member may message and ask every other; the entry role <code></code> receives the team's work.`),Qr=g(`<p class=muted>No paths are published: members can't reach each other.`),$r=g(`<li><span class=tm-node></span><span class=tm-arrow></span><span class=tm-node></span><span class=muted> `),ei=g(`<p class=muted>Members unknown (the roster didn't load).`),ti=g(`<p class=muted>The team is paused: resume it to add members.`),ni=g(`<p class=muted>Tip: on the 2D canvas, drag a session onto a role to add it.`),ri=g(`<div class=tm-members>`),ii=g(`<span class=muted> `),ai=g(`<span class=te-chip>entry role: receives the work`),oi=g(`<span class="te-chip te-chip-warn">`),si=g(`<span class="muted tm-count">`),ci=g(`<ul class=tm-seats>`),li=g(`<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 <!>…`),ui=g(`<section class=tm-role role=group><header class=tm-role-head><div class=tm-role-name><strong>`),di=g(`<p class=muted>Publish the draft to add members to <!>.`),fi=g(`<p class="muted tm-empty">No members yet.`),pi=g(`<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`),mi=g(`<fieldset class=tm-choices><legend class=sr-only>Sessions`),hi=g(`<p class=te-memberships role=status aria-label="Other memberships">`),gi=g(`<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 `),_i=g(`<p class=muted>Loading sessions…`),vi=g(`<p class=muted>`),yi=g(`<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>`),bi=g(`<button type=button class="btn small">Cancel`),xi=g(`<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`),Si=g(`<select><option value>Pick a role`),Ci=g(`<select><option value>Any machine (the hub picks)`),wi=g(`<select><option value>The role's default`),Ti=g(`<select><option value>The role's profile (or none)`),Ei=g(`<option> (v<!>)`),Di=g(`<select><option value=worktree>New worktree</option><option value=checkout>The checkout itself</option><option value=clone>A fresh clone`),Oi=g(`<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.`),ki=g(`<select>`),Ai=g(`<p class=muted role=note>Couldn't refresh the tasks: `),ji=g(`<ul class=tm-intake aria-label=Tasks>`),Mi=g(`<p class=muted>Loading tasks…`),Ni=g(`<p class=muted>No tasks yet. Submitted tasks and their progress show up here.`),Pi=g(`<span class=muted>With`),Fi=g(`<a>`),Ii=g(`<a>Workspace assignment`),Li=g(`<button type=button class="btn small">Mark done`),Ri=g(`<span class=tm-intake-actions><button type=button class="btn small">Cancel`),zi=g(`<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">`),Bi=g(`<span class=muted>Waiting for the entry role.`),Vi=g(`<ul class=tm-versions aria-label=Versions>`),Hi=g(`<p class=muted>History unavailable: `),Ui=g(`<p class=muted>Loading history…`),Wi=g(`<span class=te-chip>live`),Gi=g(`<li><strong>Version </strong><span class=muted> published `);function Ki(e){return n(o,{get when(){return e.notice},children:e=>(()=>{var t=xr(),r=t.firstChild;return u(r,()=>e().text),u(t,n(o,{get when(){return e().missing?.length},get children(){return[vr(),(()=>{var t=yr();return u(t,n(c,{get each(){return[...e().missing]},children:e=>(()=>{var t=Sr();return u(t,e),t})()})),t})(),br()]}}),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 qi=0;function $(e){let t=`te-f${++qi}`,r=()=>e.error??e.warning;return(()=>{var i=wr(),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=Cr();return d(n,`id`,`${t}-msg`),u(n,r),a(()=>m(n,e.error?`te-err`:`te-warn`)),n}}),null),i})()}function Ji(e){return(()=>{var t=Tr(),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 Yi=e=>e.direction===`two-way`?`⇄`:`→`;function Xi(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=Or(),i=e.firstChild;return u(i,r),u(e,n(o,{get when(){return t.team()?.paused},get children(){return Er()}}),null),u(e,n(o,{get when(){return t.team()?.state===`archived`},get children(){return Dr()}}),null),a(()=>d(e,`data-state`,t.dirty()?`dirty`:t.team()?.hasDraft?`draft`:`published`)),e})()}function Zi(e){let t=e.c;return[(()=>{var e=kr(),n=e.firstChild,r=n.nextSibling,i=r.nextSibling,o=i.nextSibling,s=o.nextSibling;return x(n,`click`,t.undo,!0),x(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()))()&&!Ne(t.localPreview())},get children(){var e=Ar();return e.firstChild,u(e,()=>Me(t.localPreview()).join(` · `),null),e}}),n(o,{get when(){return t.preview()},get children(){var e=jr(),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!Ne(t.preview())},get fallback(){return(()=>{var e=Nr(),n=e.firstChild.nextSibling;return n.nextSibling,u(e,()=>t.team().version,n),e})()},get children(){var e=yr();return u(e,n(c,{get each(){return Me(t.preview())},children:e=>(()=>{var t=Sr();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=Mr(),r=e.firstChild.nextSibling;return u(r,n(c,{get each(){return t.probs().filter(e=>e.level===`error`)},children:e=>(()=>{var t=Sr();return u(t,()=>e.message),t})()})),e}})]}function Qi(e){let t=e.c,r=()=>t.spec();return[n($,{label:`Title`,get error(){return t.fieldProblem(`team`,`error`)},children:e=>(()=>{var n=Pr();return i(n,l(e,{type:`text`,get value(){return r().title},onChange:e=>t.apply(he(r(),{title:e.currentTarget.value}))}),!1,!1),n})()}),n($,{label:`Description`,children:e=>(()=>{var n=Fr();return i(n,l(e,{rows:`2`,get value(){return r().description??``},onChange:e=>t.apply(he(r(),{description:e.currentTarget.value}))}),!1,!1),n})()}),n($,{label:`Tags (comma separated)`,children:e=>(()=>{var n=Pr();return i(n,l(e,{type:`text`,get value(){return ge(r())},onChange:e=>t.apply(he(r(),{tags:e.currentTarget.value}))}),!1,!1),n})()}),n($,{label:`Metadata (key=value per line)`,children:e=>(()=>{var n=Fr();return i(n,l(e,{rows:`2`,get value(){return _e(r())},onChange:e=>t.apply(he(r(),{metadata:e.currentTarget.value}))}),!1,!1),n})()}),n(o,{get when(){return e.withMode},get children(){return n(Ji,{get value(){return r().mode},onChange:e=>t.apply(me(r(),e)),get name(){return`te-mode-${t.id}`}})}})]}function $i(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=Ir();return u(e,()=>r.fieldProblem(`entry`,`error`)??r.fieldProblem(`roles`,`error`)),e}}),(()=>{var s=Lr();return u(s,n(c,{get each(){return[...f().roles]},children:s=>(()=>{var c=Br(),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 zr()}}),h),g.addEventListener(`change`,()=>r.apply(de(f(),s.name))),u(_,()=>f().entryRole===s.name?`★ Entry role`:`Entry role`),v.$$click=()=>r.apply(le(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=Pr();return t(t=>e.roleInput?.(s.name,t),a),i(a,l(n,{type:`text`,get value(){return s.label??``},onChange:e=>r.apply(ue(f(),s.name,{label:e.currentTarget.value}))}),!1,!1),a})()}),y),b.addEventListener(`change`,e=>r.apply(ue(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=Rr(),t=e.firstChild,n=t.nextSibling,i=n.nextSibling;return e.addEventListener(`submit`,e=>{e.preventDefault();let t=ce(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 ea(e){let r=e.c,i=()=>r.spec(),[l,f]=s(``),[p,h]=s(``),[g,_]=s(`one-way`),[y,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())};v(()=>e.handle?.({prefill:w}));let T=e=>{e.preventDefault();let t=[...y()?[`msg`]:[],...x()?[`ask`]:[]];r.apply(fe(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 Vr()}}),n(o,{get when(){return i().edges.length},get fallback(){return(()=>{var t=Wr();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=Hr();return u(e,n(c,{get each(){return[...i().edges]},children:e=>(()=>{var t=Kr(),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,()=>Yi(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=Gr();return t.firstChild,u(t,()=>E(e),null),t}}),h),g.$$click=()=>w(e.from,e.to),_.$$click=()=>r.apply(pe(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=Ur(),o=e.firstChild.nextSibling,s=o.firstChild,m=s.firstChild.nextSibling;m.firstChild;var v=s.nextSibling.firstChild.nextSibling;v.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,N=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=qr();return u(t,()=>e.name),a(()=>t.selected=l()===e.name),a(()=>t.value=e.name),t})()}),null),v.addEventListener(`change`,e=>h(e.currentTarget.value)),u(v,n(c,{get each(){return[...i().roles]},children:e=>(()=>{var t=qr();return u(t,()=>e.name),a(()=>t.selected=p()===e.name),a(()=>t.value=e.name),t})()}),null),D.addEventListener(`change`,()=>_(`one-way`));var ee=C;return typeof ee==`function`?t(ee,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&&(N.disabled=e.a=i),e},{e:void 0,t:void 0,a:void 0}),a(()=>m.value=l()),a(()=>v.value=p()),a(()=>D.checked=g()===`one-way`),a(()=>O.checked=g()===`two-way`),a(()=>j.checked=y()),a(()=>M.checked=x()),e})()]}function ta(e){let t=()=>e.c.read().published;return(()=>{var e=Xr();return u(e,n(o,{get when(){return t().mode===`restricted`},get fallback(){return(()=>{var e=Zr(),n=e.firstChild.nextSibling.nextSibling;return u(n,()=>t().entryRole),e})()},get children(){return[(()=>{var e=Jr(),n=e.firstChild.nextSibling.nextSibling;return u(n,()=>t().entryRole),e})(),n(o,{get when(){return t().edges.length},get fallback(){return Qr()},get children(){var e=Yr();return u(e,n(c,{get each(){return[...t().edges]},children:e=>(()=>{var t=$r(),n=t.firstChild,r=n.nextSibling,i=r.nextSibling,o=i.nextSibling;return o.firstChild,u(n,()=>e.from),u(r,()=>Yi(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 na(e){let t=e.c,[i,f]=s(),[h,g]=s();v(()=>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]}),y=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=ri();return u(s,n(o,{get when(){return!t.roster()},get children(){return ei()}}),null),u(s,n(o,{get when(){return S()},get children(){return ti()}}),null),u(s,n(c,{get each(){return b()},children:i=>{let s=()=>y().get(i),l=()=>{let e=s();return e&&`seats`in e?e:void 0},_=p(()=>l()?at(l(),e.snap):[]),v=e=>_().find(t=>t.staffingID===e);return(()=>{var s=ui(),p=s.firstChild,y=p.firstChild,b=y.firstChild;return d(s,`aria-label`,`Role ${i}`),d(s,`data-role`,i),u(b,()=>l()?.entry?`★ `:``,null),u(b,i,null),u(y,n(o,{get when(){return x(i)},get children(){var e=ii();return e.firstChild,u(e,()=>x(i),null),e}}),null),u(y,n(o,{get when(){return l()?.entry},get children(){return ai()}}),null),u(y,n(o,{get when(){return!l()},get children(){return zr()}}),null),u(y,n(o,{get when(){return r(()=>!!l())()&&(l().vacant||l().understaffed)},get children(){var e=oi();return u(e,()=>l()?.vacant?`vacant`:`understaffed`),e}}),null),u(p,n(o,{get when(){return l()},get children(){var e=si();return u(e,(()=>{var e=r(()=>!!l());return()=>e()?ct(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=di(),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 fi()},get children(){var e=ci();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 v(e)},children:e=>(()=>{var n=pi(),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().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=N(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=li(),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(ia,{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 ni()}}),null),u(s,n(o,{get when(){return i()},keyed:!0,children:r=>n(ra,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 ra(e){let i=e.c,[l,f]=s(``),[h,g]=s(e.sessionID??``),y,b=t=>({teamID:i.id,role:e.role,query:t,...i.roster()?{roster:i.roster().seats}:{}}),S=p(()=>ot(e.snap,b(l()))),C=p(()=>ot(e.snap,b(``)).find(e=>e.sessionID===h())),w=()=>C()?.name??h();v(()=>e.sessionID&&queueMicrotask(()=>y?.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(_,{open:!0,get title(){return`Add a member to ${e.role}`},get onClose(){return e.onClose},class:`tm-picker`,get children(){var s=gi(),p=s.firstChild,_=p.firstChild.nextSibling;_.nextSibling;var v=p.nextSibling,b=v.nextSibling,D=b.firstChild,O=D.nextSibling,k=O.nextSibling;k.firstChild,s.addEventListener(`submit`,T),u(p,()=>e.role,_),v.$$input=e=>f(e.currentTarget.value),u(s,n(o,{get when(){return e.snap},get fallback(){return _i()},get children(){var t=mi();return t.firstChild,u(t,n(o,{get when(){return S().length},get fallback(){return(()=>{var e=vi();return u(e,()=>l()?`No session matches.`:`No running sessions.`),e})()},get children(){return n(c,{get each(){return S()},children:t=>(()=>{var n=yi(),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=hi();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(Ki,{get notice(){return r(()=>i.notice()?.kind===`ok`)()?void 0:i.notice()}}),b),D.$$click=()=>{e.onClose(),e.onLaunch()},x(O,`click`,e.onClose,!0);var A=y;return typeof A==`function`?t(A,k):y=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&&(v.autofocus=t.t=r),a!==t.a&&(k.disabled=t.a=a),t},{e:void 0,t:void 0,a:void 0}),a(()=>v.value=l()),s}})}function ia(e){let t=e.c,[r,d]=s(e.role??``),[f,m]=s(``),[h,g]=s(``),[_,y]=s(``),[b,x]=s(``),[S,C]=s(`worktree`),[w,T]=s(``),[E,D]=s(``),[O,k]=s(``),[A,j]=s(``),[M,N]=s(),[ee,te]=s([]);v(()=>void hr().then(te));let P=p(()=>(e.snap?.nodes??[]).filter(e=>e.kind===`machine`)),F=p(()=>{let e=P().find(e=>e.machineID===f());return e?.harnesses.length?e.harnesses:[`opencode`,`claude-code`,`codex`]}),I=e=>M()?.field===e?M().error:void 0,L=async n=>{n.preventDefault();let i=ze({role:r(),machine:f(),harness:h(),profile:_(),repo:b(),mode:S(),branch:w(),remote:E(),name:O(),prompt:A()});if(!r())return N({field:`role`,error:`Choose a published role`});if(!i.ok)return N({field:i.field,error:i.error});N(void 0),await t.launch(r(),i.body)&&e.onDone?.()};return(()=>{var s=xi(),p=s.firstChild.nextSibling,_=p.firstChild;return s.addEventListener(`submit`,L),u(s,n($,{label:`Role`,get error(){return I(`role`)},children:e=>(()=>{var o=Si();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=qr();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=Ci();return t.firstChild,i(t,l(e,{onChange:e=>m(e.currentTarget.value)}),!1,!0),u(t,n(c,{get each(){return P().map(e=>e.machineID??e.id)},children:e=>{let t=()=>P().find(t=>(t.machineID??t.id)===e);return(()=>{var n=qr();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=wi();return t.firstChild,i(t,l(e,{onChange:e=>g(e.currentTarget.value)}),!1,!0),u(t,n(c,{get each(){return F()},children:e=>(()=>{var t=qr();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=Ti();return t.firstChild,i(t,l(e,{onChange:e=>y(e.currentTarget.value)}),!1,!0),u(t,n(c,{get each(){return ee()},children:e=>(()=>{var t=Ei(),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:`Repository on the machine`,get error(){return I(`repo`)},children:e=>(()=>{var t=Pr();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=Di();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 I(`branch`)},children:e=>(()=>{var t=Pr();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 I(`remote`)},children:e=>(()=>{var t=Pr();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 I(`name`)},children:e=>(()=>{var t=Pr();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=Fr();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=bi();return t.$$click=()=>e.onDone(),t}}),null),a(()=>_.disabled=t.busy()||!!t.team()?.paused),s})()}function aa(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=Ve({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=vi();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=Oi(),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=Pr();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=Fr();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=ki();return i(t,l(e,{onChange:e=>g(e.currentTarget.value)}),!1,!0),u(t,n(c,{get each(){return[...Be]},children:e=>(()=>{var t=qr();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=Fr();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 oa={queued:`Submitted`,routed:`Routed`,working:`Working`,closed:`Closed`};function sa(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=Ai();return e.firstChild,u(e,()=>t.intakeError(),null),e}}),n(o,{get when(){return t.items()},get fallback(){return Mi()},get children(){return n(o,{get when(){return r().length},get fallback(){return Ni()},get children(){var e=ji();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(ca,{c:t,get item(){return e()},sessionName:i})})})),e}})}})]}function ca(e){let t=()=>e.item,r=()=>Xe(t());return(()=>{var i=zi(),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,()=>Ye[r()]),u(p,n(c,{get each(){return Qe(t())},children:e=>(()=>{var t=Sr();return u(t,()=>oa[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 ${y(t().createdAt)}`,t().updatedAt===t().createdAt?void 0:`updated ${y(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 Bi()}})},get children(){return[Pi(),(()=>{var n=Fi();return u(n,()=>e.sessionName(t().sessionID)),a(()=>d(n,`href`,N(t().sessionID))),n})()]}}),null),u(g,n(o,{get when(){return t().workspaceID},get children(){var e=Ii();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 Ze(t())},get children(){var r=Ri(),i=r.firstChild;return u(r,n(o,{get when(){return t().status===`routed`},get children(){var n=Li();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 la(t){let[r,i]=s(),[a,l]=s(``);return f(e(()=>t.c.team()?.version,()=>void tr(t.c.id).then(e=>(i(e),l(``))).catch(e=>l(e.message)))),n(o,{get when(){return!a()},get fallback(){return(()=>{var e=Hi();return e.firstChild,u(e,a,null),e})()},get children(){return n(o,{get when(){return r()},get fallback(){return Ui()},get children(){var e=Vi();return u(e,n(c,{get each(){return r()},children:e=>(()=>{var r=Gi(),i=r.firstChild;i.firstChild;var a=i.nextSibling;return a.firstChild,u(i,()=>e.version,null),u(a,()=>y(e.publishedAt),null),u(r,n(o,{get when(){return e.version===t.c.team()?.version},get children(){return Wi()}}),null),r})()})),e}})}})}b([`click`,`input`]);var ua=g(`<p role=alert class=wt-error>`),da=g(`<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`),fa=g(`<input>`),pa=e=>`/teams/${encodeURIComponent(e)}`;function ma(e){let[t,r]=s(``),[c,d]=s(``),[f,p]=s(`restricted`),[m,h]=s(`pm`),[g,v]=s(`Project manager`),[y,b]=s(),[S,C]=s(!1),w=gr(),T=e=>y()?.field===e?y().error:void 0,E=async n=>{n.preventDefault();let i=Te({name:t(),title:c(),mode:f(),entryRole:m(),entryLabel:g()});if(!i.ok)return b({field:i.field,error:i.error});b(void 0),C(!0);try{let t=await ir(i.body,w);w=gr(),e.onClose(),r(``),d(``),e.onCreated?e.onCreated(t.team.id):ee(pa(t.team.id))}catch(e){b({field:`form`,error:Pe(e).message})}finally{C(!1)}};return n(_,{get open(){return e.open},title:`New team`,get onClose(){return e.onClose},get children(){var s=da(),_=s.firstChild,y=_.nextSibling,b=y.nextSibling.firstChild,C=b.nextSibling;return s.addEventListener(`submit`,E),u(s,n($,{label:`Name (the #team address, can't change)`,get error(){return T(`name`)},children:e=>(()=>{var n=fa();return i(n,l(e,{get value(){return t()},onInput:e=>r(e.currentTarget.value),placeholder:`product-a`,autofocus:!0}),!1,!1),n})()}),_),u(s,n($,{label:`Title`,get error(){return T(`title`)},children:e=>(()=>{var t=fa();return i(t,l(e,{get value(){return c()},onInput:e=>d(e.currentTarget.value),placeholder:`Product A`}),!1,!1),t})()}),_),u(s,n(Ji,{get value(){return f()},onChange:p,name:`tm-new-mode`}),_),u(_,n($,{label:`Entry role (receives the team's work)`,get error(){return T(`entry`)},children:e=>(()=>{var t=fa();return i(t,l(e,{get value(){return m()},onInput:e=>h(e.currentTarget.value)}),!1,!1),t})()}),null),u(_,n($,{label:`Entry role label`,children:e=>(()=>{var t=fa();return i(t,l(e,{get value(){return g()},onInput:e=>v(e.currentTarget.value)}),!1,!1),t})()}),null),u(s,n(o,{get when(){return T(`form`)},get children(){var e=ua();return u(e,()=>T(`form`)),e}}),y),x(b,`click`,e.onClose,!0),a(()=>C.disabled=S()),s}})}b([`click`]);var ha=new Set([`agent`,`status`,`catalog`,`resync`,`decision`]),ga=2e3;function _a(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=st({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+ga-Date.now()))))};v(()=>{let e=I(e=>typeof e.type==`string`&&ha.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{In as $,St as A,It as B,Un as C,Cn as D,Tt as E,zn as F,qt as G,Pt as H,cn as I,jt as J,vn as K,Hn as L,Mt as M,Sn as N,dt as O,Lt as P,pn as Q,Xt as R,Wn as S,ut as T,mn as U,Ft as V,Ln as W,_n as X,bn as Y,En as Z,Zn as _,Zi as a,Vn as at,Kn as b,Ji as c,Re as ct,ta as d,me as dt,Bn as et,$i as f,Ie as ft,_r as g,la as h,Qi as i,ln as it,wt as j,Ct as k,Ki as l,Pe as lt,Xi as m,ma as n,Nn as nt,sa as o,Fn as ot,aa as p,kt as q,pa as r,Rn as rt,na as s,tt as st,_a as t,Pn as tt,ea as u,Le as ut,Xn as v,Rt as w,qn as x,Qn as y,Yt as z};
|
|
5
|
+
`).toLowerCase().includes(W);return r&&re++,{...e,match:r,dim:!r}})),{groups:ie(),teams:v.map(e=>({id:e.id,label:e.label,...J(`mode`,e.mode),...J(`paused`,e.paused),...J(`entryRole`,e.entryRole),members:o.filter(t=>t.teamIDs.includes(e.id)).length})),nodes:B,links:V,machines:c,harnesses:Ut(o),lod:z,tooLarge:U,matches:re,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 ie(){let e=new Map,n=(t,n=[{members:[]}])=>e.set(t.id,{group:t,sections:n}),r=z!==`groups`;for(let e of f)n({id:e.id,label:e.label,kind:`machine`,...J(`machine`,e.machineID===void 0?void 0:l.get(e.machineID)),online:e.online===!0});let a=Ut(o).map(e=>`group:harness:${e.id}`),s=[...D.values()].sort(t.groupBy===`harness`?(e,t)=>a.indexOf(e.id)-a.indexOf(t.id):an);for(let e of s)(H.has(e.id)||[...R.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`,...J(`mode`,e.mode),...J(`paused`,e.paused),...J(`entryRole`,e.entryRole)},r?x.get(e.id).map(t=>({id:X(e.id,t),label:t,entry:t===e.entryRole,members:[]})):[{members:[]}]);let c=()=>e.get(nn)??(n({id:nn,label:rn[t.groupBy],kind:`none`}),e.get(nn)),u=[...R.keys()],d=new Map;for(let e of u){let t=i.get(e)?.parentID;t!==void 0&&R.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=R.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||!R.has(t))&&m(e,0)}for(let e of u)m(e,0);let h=[...e.values()].filter(e=>e.group.id!==nn),g=e.get(nn);return g&&h.push(g),h.map(e=>({...e.group,sections:e.sections.map(e=>({...J(`id`,e.id),...J(`label`,e.label),...e.entry===void 0?{}:{entry:e.entry},members:e.members}))}))}}function ln(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 un(e){let t={};for(let n of e){let e=xt(n);e&&(t[e]=(t[e]??0)+1)}return t}var dn=`app:concierge`;function fn(e){if(e.id===dn)return`service`;if(e.concierge)return e.status===`ended`||/ \(previous\)$/.test(e.label)?`previous`:`current`}function pn(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,...J(`ring`,xt(n)),...J(`machine`,f),...J(`harness`,n.kind===`session`?jt(kt(n)):void 0),...J(`project`,n.project),roles:n.roles,workspaceIDs:n.workspaceIDs,...J(`parentID`,n.parentID),...J(`supervisorID`,n.supervisorID),...J(`supervisorLabel`,n.supervisorID?r(n.supervisorID):void 0),...J(`launchID`,n.launchID),...J(`concierge`,n.concierge),...J(`conciergeRole`,fn(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:un(a),machinesOnline:{online:p.filter(e=>e.online).length,total:p.length}}:{},...o?{states:un(a.filter(e=>o.has(e.id)))}:{},...J(`online`,n.online),...J(`lastSeen`,n.lastSeen),openable:n.kind===`session`,seats:n.seats.map(e=>({teamID:e.teamID,team:r(e.teamID),role:e.role})),...J(`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{...J(`mode`,e.mode),...J(`entryRole`,e.entryRole),...J(`paused`,e.paused),tags:e.tags,...J(`metadata`,e.metadata),members:r}}}function mn(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:Ft(n.kind),fromLabel:r(n.from),toLabel:r(n.to),...J(`teamLabel`,n.teamID?r(n.teamID):void 0)}}function hn(e){if(!G(e)||!Array.isArray(e.messages))return{messages:[]};let t=[];for(let n of e.messages){if(!G(n))continue;let e=K(n.id),r=K(n.kind),i=K(n.state),a=K(n.from),o=K(n.to),s=q(n.at);e&&r&&i&&a&&o&&s!==void 0&&t.push({id:e,kind:r,state:i,from:a,to:o,at:s,...J(`delivery`,K(n.delivery)),...J(`decisionID`,K(n.decisionID))})}return{messages:t,...J(`cursor`,K(e.cursor))}}function gn(e){if(!G(e)||!G(e.message))return;let t=e.message,n=K(t.id);if(!n||typeof t.text!=`string`)return;let r=G(e.answer)&&typeof e.answer.text==`string`?e.answer.text:void 0;return{id:n,text:t.text,...J(`at`,q(t.at)),...J(`kind`,K(t.kind)),...J(`state`,K(t.state)),...J(`answer`,r)}}function _n(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=xt(e);if(p.push({id:e.id,label:e.label,machine:e.machineID&&l.get(e.machineID)||`—`,harness:jt(kt(e)),state:n?St[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:Ft(e.kind),from:h(e.from),to:h(e.to),count:e.count,lastAt:e.lastAt,style:Wt([e])})).sort((e,t)=>t.count-e.count||t.lastAt-e.lastAt)}}var vn=(e,t)=>`/api/agent/graph?since=${t-Lt[e.window].ms}&until=${t}`,yn=new Set([`catalog`,`status`,`decision`,`agent`,`resync`]),bn=e=>typeof e.type==`string`&&yn.has(e.type),xn=[`3d`,`2d`,`list`],Sn=`watchtower.view`,Cn=`watchtower.presets`,wn=`watchtower.`,Tn=`birdsEye.`;function En(e){try{let t=[];for(let n=0;n<e.length;n++){let r=e.key(n);r?.startsWith(Tn)&&t.push(r)}for(let n of t)try{let t=e.getItem(n),r=wn+n.slice(9);t!==null&&e.getItem(r)===null&&e.setItem(r,t),e.removeItem(n)}catch{}}catch{}}var Dn=e=>e!==null&&e in Lt,On=e=>e!==null&&e in Rt,kn=e=>typeof e==`string`&&xn.includes(e),An=[[`machine`,`machine`],[`harness`,`harness`],[`team`,`team`],[`role`,`role`],[`project`,`project`],[`workspace`,`ws`],[`tag`,`tag`],[`meta`,`meta`],[`q`,`q`]],jn=200,Mn=(e,t)=>e.length===t.size&&e.every(e=>t.has(e)),Nn=e=>kn(e)?e:void 0;function Pn(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 An){let r=n.get(t)?.trim();r&&(s[e]=r.slice(0,jn))}let c=n.get(`state`),l=n.get(`kinds`),u=l===null?void 0:ut.filter(e=>l.split(`,`).includes(e));return{window:Dn(r)?r:zt.window,view:kn(a)?a:t??`3d`,groupBy:On(i)?i:zt.groupBy,...o?{selected:{type:o[1],id:o[2]}}:{},...s,...c&&dt.includes(c)?{state:c}:{},...u&&!Mn(u,zt.kinds)?{kinds:u}:{},...n.get(`tree`)===`0`?{tree:!1}:{}}}function Fn(e,t=`3d`){let n=new URLSearchParams;e.window!==zt.window&&n.set(`window`,e.window),(e.view!==`3d`||t!==`3d`)&&n.set(`view`,e.view),e.groupBy!==zt.groupBy&&n.set(`group`,e.groupBy);for(let[t,r]of An)e[t]&&n.set(r,e[t]);e.state&&n.set(`state`,e.state),e.kinds&&!Mn(e.kinds,zt.kinds)&&n.set(`kinds`,ut.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 In(e){return{window:e.window,groupBy:e.groupBy,tree:e.tree!==!1,kinds:e.kinds?new Set(e.kinds):zt.kinds,...e.state?{states:new Set([e.state])}:{},...J(`machine`,e.machine),...J(`harness`,e.harness),...J(`team`,e.team),...J(`role`,e.role),...J(`project`,e.project),...J(`workspace`,e.workspace),...J(`tag`,e.tag),...J(`meta`,e.meta),search:e.q??``}}function Ln(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(an).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 Rn=e=>{let{selected:t,...n}=e;return Fn({...n,view:`3d`})};function zn(e,t){return{...Pn(t,e.view),view:e.view,...e.selected?{selected:e.selected}:{}}}function Bn(e){try{let t=JSON.parse(e??`[]`);return Array.isArray(t)?t.filter(e=>G(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 Vn(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 Hn=(e,t)=>e.filter(e=>e.name!==t);function Un(e){return e instanceof te?{kind:`offline`,message:e.message}:e instanceof O?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 Wn(e){let t=bt(await k(e));if(!t)throw Error(`The hub answered something that isn't an interaction graph`);return t}var Gn=(e,t)=>`since=${t-Lt[e].ms}&until=${t}`;async function Kn(e,t,n,r){let i=`/api/agent/graph/${e.type===`edge`?`edges`:`nodes`}/${A(e.id)}`;return hn(await k(`${i}?${Gn(t,n)}&limit=50${r?`&cursor=${A(r)}`:``}`))}async function qn(e){let t=gn(await k(`/api/agent/messages/${A(e)}`));if(!t)throw Error(`The hub didn't return this message's text`);return t}var Jn=`/api/agent/teams`,Z=e=>`${Jn}/${A(e)}`,Q=async(e,t,n,r)=>(await S(e,{method:t,...n===void 0?{}:{json:n},...r?{headers:{"idempotency-key":r}}:{}})).json().catch(()=>({}));function Yn(e){let t=oe(e);if(!t)throw Error(`The hub answered something that isn't a team`);return t}async function Xn(){return((await k(`${Jn}?limit=200`)).items??[]).map(e=>oe({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 Zn(e=`all`){return((await k(`${Jn}?limit=200&state=${e}`)).items??[]).flatMap(e=>{let t=oe({team:e}),n=ae(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 Qn(e){let t=await k(`${Z(e)}/status`),n=Fe({roster:t.roster}),r=$e(t.intake);return{...n?{roster:n}:{},...r?{intake:r}:{}}}async function $n(e,t=50){return Je(await k(`${Z(e)}/intake?limit=${t}`)).items}async function er(e,t,n,r,i){return qe((await Q(`${Z(e)}/intake/${A(t)}/status`,`POST`,{status:n,expectedRevision:r,...i?{reason:i}:{}})).intake)}async function tr(e){return nt(await k(`${Z(e)}/versions?limit=50`))}async function nr(e,t,n){return await Q(`${Z(e)}/${t?`archive`:`restore`}`,`POST`,{expectedRevision:n}),rr(e)}var rr=async e=>Yn(await k(Z(e))),ir=async(e,t)=>Yn(await Q(Jn,`POST`,e,t));async function ar(e,t,n){return await Q(Z(e),`PATCH`,we(t,n)),rr(e)}async function or(e,t){return await Q(`${Z(e)}/draft?expectedRevision=${t}`,`DELETE`),rr(e)}async function sr(e){let t=ke(await k(`${Z(e)}/diff?to=draft`));if(!t)throw Error(`The hub didn't answer a diff`);return t}async function cr(e,t){return await Q(`${Z(e)}/publish`,`POST`,{expectedRevision:t}),rr(e)}async function lr(e,t,n){return await Q(`${Z(e)}/${t?`pause`:`resume`}`,`POST`,{expectedRevision:n}),rr(e)}async function ur(e){let t=Fe(await k(`${Z(e)}/roster`));if(!t)throw Error(`The hub didn't answer a roster`);return t}var dr=(e,t,n,r)=>Q(`${Z(e)}/staffing`,`PUT`,{role:t,sessionID:n},r),fr=(e,t,n)=>Q(`${Z(e)}/staffing/launch`,`POST`,t,n),pr=(e,t,n)=>Q(`${Z(e)}/staffing/${A(t)}?expectedRevision=${n}`,`DELETE`);async function mr(e,t,n){let r=await Q(`${Z(e)}/intake`,`POST`,t,n),i=qe(r.intake);return{id:String(r.intake?.id??``),status:String(r.intake?.status??`queued`),...i?{intake:i}:{}}}async function hr(){try{return((await k(`/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 gr=()=>crypto.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2)}`;function _r(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),k=p(()=>!!o()&&D(E())!==D(l())),A=p(()=>E()?ve(E()):[]),j=()=>n()?.team,M=()=>j()?.id??e,N=p(()=>new Set(n()?.published.roles.map(e=>e.name)??[])),ee=p(()=>n()&&E()?Oe(n().published,E()):void 0),te=p(()=>(g()??[]).some(Ze)),P=()=>t.onChanged?.(),F=async()=>{try{f(await ur(e))}catch{f(void 0)}},I=async()=>{if(t.intake)try{let[e,t]=await Promise.all([$n(M()),Qn(M()).catch(()=>({}))]);_(e),y(``),t.intake&&h(t.intake)}catch(e){y(Pe(e).message),g()||_([])}},L=(e,t)=>{let n=e.draft??e.published;r(e),u(n);let i=o();(!t||!i)&&c(be(n))},ne=async()=>{try{L(await rr(e),!1),await Promise.all([F(),I()])}catch(e){a(e instanceof O&&e.status===404?`This hub doesn't have that team (or teams at all).`:Pe(e).message)}},R=async()=>{if(!S()&&n()){try{let t=await rr(e);t.team.revision!==j()?.revision&&L(t,k())}catch{}await Promise.all([F(),I()])}},z=async t=>{C(!0),x(void 0);try{await t()}catch(t){let n=Pe(t);if(n.kind===`conflict`){try{L(await rr(e),!0),await F()}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)}},B,V=e=>{if(!e.ok)return x(B={kind:`error`,text:e.error});B&&b()===B&&x(void 0),B=void 0,T(void 0),c(xe(o(),e.spec))},H=()=>o()&&c(Se(o())),U=()=>o()&&c(Ce(o())),W=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?U():H())},re=async()=>{let t=await ar(e,E(),j().revision);return L(t,!1),t},ie=()=>z(async()=>{await re(),x({kind:`ok`,text:`Draft saved. It isn't live until you publish it.`})}),ae=()=>z(async()=>{k()&&await re(),j().hasDraft?T(await sr(e)):x({kind:`ok`,text:`Nothing to publish: the draft matches version ${j().version}.`})}),oe=()=>z(async()=>{let t=j().version,n=await cr(e,j().revision);L(n,!1),T(void 0),await F(),P(),x({kind:`ok`,text:n.team.version>t?`Published version ${n.team.version}.`:`Nothing changed: the draft matched the published version.`})}),se=()=>z(async()=>{j().hasDraft?L(await or(e,j().revision),!1):L(n(),!1),T(void 0),x({kind:`ok`,text:`Draft discarded.`})}),ce=()=>z(async()=>{let t=!j().paused;L(await lr(e,t,j().revision),!0),P(),x({kind:`ok`,text:t?`Paused: the team takes no new work or members until you resume it.`:`Resumed: the team takes work again.`})}),le=()=>z(async()=>{let t=j().state!==`archived`;L(await nr(e,t,j().revision),!0),P(),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.`})}),ue=gr(),de=async(t,n,r)=>{let i=!1;return await z(async()=>{await dr(e,t,n,ue),ue=gr(),await F(),P(),x({kind:`ok`,text:`${r} is staffed as ${t}.`}),i=!0}),i},fe=(t,n,r,i)=>z(async()=>{await pr(e,t,n),await F(),P(),x({kind:`ok`,text:`${r} no longer holds ${i}.`})}),pe=gr(),me=async(t,n)=>{let r=!1;return await z(async()=>{let i=await fr(e,n,pe);pe=gr(),await F(),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},he=gr();return{id:e,read:n,team:j,spec:E,hist:o,dirty:k,probs:A,roster:d,summary:m,items:g,intakeError:v,openWork:te,notice:b,setNotice:x,busy:S,preview:w,setPreview:T,publishedRoles:N,localPreview:ee,loadError:i,blocked:()=>ye(A()),fieldProblem:(e,t)=>A().find(n=>n.field===e&&n.level===t)?.message,load:ne,refresh:R,loadRoster:F,loadIntake:I,apply:V,undo:H,redo:U,onKey:W,saveDraft:ie,review:ae,publish:oe,discard:se,togglePause:ce,toggleArchive:le,attach:de,unstaff:fe,launch:me,submit:async e=>{let t=!1;return await z(async()=>{let r=await mr(M(),e,he);he=gr(),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&&I(),t},setIntake:(e,t)=>z(async()=>{let n=await er(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 vr=g(`<p>Missing grants:`),yr=g(`<ul>`),br=g(`<p class=muted>Staffing never issues grants: grant these in Settings → Agents, or staff the role yourself here.`),xr=g(`<div><p>`),Sr=g(`<li>`),Cr=g(`<span>`),wr=g(`<label class=te-field><span>`),Tr=g(`<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`),Er=g(`<span class="te-chip te-chip-warn">Paused: no new members or tasks`),Dr=g(`<span class="te-chip te-chip-warn">Archived: its policy no longer applies`),Or=g(`<p class=te-status role=status aria-label="Team state"><span class=te-chip>`),kr=g(`<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`),Ar=g(`<p class="muted te-pending">Unsaved: `),jr=g(`<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`),Mr=g(`<div role=alert class=te-problems><p>Fix these before saving:</p><ul>`),Nr=g(`<p>No changes against version <!>.`),Pr=g(`<input>`),Fr=g(`<textarea>`),Ir=g(`<p class=te-err role=alert>`),Lr=g(`<ul class=te-roles aria-label=Roles>`),Rr=g(`<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`),zr=g(`<span class=te-chip>new in draft`),Br=g(`<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`),Vr=g(`<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.`),Hr=g(`<ul class=te-paths aria-label=Paths>`),Ur=g(`<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`),Wr=g(`<p class=muted>No paths yet. `),Gr=g(`<span class=te-err> — `),Kr=g(`<li><span> <!> <!> · <!> · </span> <button type=button class="btn small">Edit</button><button type=button class="btn small">Remove`),qr=g(`<option>`),Jr=g(`<p><strong>Restricted.</strong> Members may only use these paths; the entry role <code></code> receives the team's work.`),Yr=g(`<ul class=tm-edges>`),Xr=g(`<div class=tm-policy aria-label="Published communication">`),Zr=g(`<p><strong>Open team.</strong> Every member may message and ask every other; the entry role <code></code> receives the team's work.`),Qr=g(`<p class=muted>No paths are published: members can't reach each other.`),$r=g(`<li><span class=tm-node></span><span class=tm-arrow></span><span class=tm-node></span><span class=muted> `),ei=g(`<p class=muted>Members unknown (the roster didn't load).`),ti=g(`<p class=muted>The team is paused: resume it to add members.`),ni=g(`<p class=muted>Tip: on the 2D canvas, drag a session onto a role to add it.`),ri=g(`<div class=tm-members>`),ii=g(`<span class=muted> `),ai=g(`<span class=te-chip>entry role: receives the work`),oi=g(`<span class="te-chip te-chip-warn">`),si=g(`<span class="muted tm-count">`),ci=g(`<ul class=tm-seats>`),li=g(`<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 <!>…`),ui=g(`<section class=tm-role role=group><header class=tm-role-head><div class=tm-role-name><strong>`),di=g(`<p class=muted>Publish the draft to add members to <!>.`),fi=g(`<p class="muted tm-empty">No members yet.`),pi=g(`<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`),mi=g(`<fieldset class=tm-choices><legend class=sr-only>Sessions`),hi=g(`<p class=te-memberships role=status aria-label="Other memberships">`),gi=g(`<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 `),_i=g(`<p class=muted>Loading sessions…`),vi=g(`<p class=muted>`),yi=g(`<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>`),bi=g(`<button type=button class="btn small">Cancel`),xi=g(`<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`),Si=g(`<select><option value>Pick a role`),Ci=g(`<select><option value>Any machine (the hub picks)`),wi=g(`<select><option value>The role's default`),Ti=g(`<select><option value>The role's profile (or none)`),Ei=g(`<option> (v<!>)`),Di=g(`<select><option value=worktree>New worktree</option><option value=checkout>The checkout itself</option><option value=clone>A fresh clone`),Oi=g(`<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.`),ki=g(`<select>`),Ai=g(`<p class=muted role=note>Couldn't refresh the tasks: `),ji=g(`<ul class=tm-intake aria-label=Tasks>`),Mi=g(`<p class=muted>Loading tasks…`),Ni=g(`<p class=muted>No tasks yet. Submitted tasks and their progress show up here.`),Pi=g(`<span class=muted>With`),Fi=g(`<a>`),Ii=g(`<a>Workspace assignment`),Li=g(`<button type=button class="btn small">Mark done`),Ri=g(`<span class=tm-intake-actions><button type=button class="btn small">Cancel`),zi=g(`<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">`),Bi=g(`<span class=muted>Waiting for the entry role.`),Vi=g(`<ul class=tm-versions aria-label=Versions>`),Hi=g(`<p class=muted>History unavailable: `),Ui=g(`<p class=muted>Loading history…`),Wi=g(`<span class=te-chip>live`),Gi=g(`<li><strong>Version </strong><span class=muted> published `);function Ki(e){return n(o,{get when(){return e.notice},children:e=>(()=>{var t=xr(),r=t.firstChild;return u(r,()=>e().text),u(t,n(o,{get when(){return e().missing?.length},get children(){return[vr(),(()=>{var t=yr();return u(t,n(c,{get each(){return[...e().missing]},children:e=>(()=>{var t=Sr();return u(t,e),t})()})),t})(),br()]}}),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 qi=0;function $(e){let t=`te-f${++qi}`,r=()=>e.error??e.warning;return(()=>{var i=wr(),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=Cr();return d(n,`id`,`${t}-msg`),u(n,r),a(()=>m(n,e.error?`te-err`:`te-warn`)),n}}),null),i})()}function Ji(e){return(()=>{var t=Tr(),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 Yi=e=>e.direction===`two-way`?`⇄`:`→`;function Xi(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=Or(),i=e.firstChild;return u(i,r),u(e,n(o,{get when(){return t.team()?.paused},get children(){return Er()}}),null),u(e,n(o,{get when(){return t.team()?.state===`archived`},get children(){return Dr()}}),null),a(()=>d(e,`data-state`,t.dirty()?`dirty`:t.team()?.hasDraft?`draft`:`published`)),e})()}function Zi(e){let t=e.c;return[(()=>{var e=kr(),n=e.firstChild,r=n.nextSibling,i=r.nextSibling,o=i.nextSibling,s=o.nextSibling;return x(n,`click`,t.undo,!0),x(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()))()&&!Ne(t.localPreview())},get children(){var e=Ar();return e.firstChild,u(e,()=>Me(t.localPreview()).join(` · `),null),e}}),n(o,{get when(){return t.preview()},get children(){var e=jr(),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!Ne(t.preview())},get fallback(){return(()=>{var e=Nr(),n=e.firstChild.nextSibling;return n.nextSibling,u(e,()=>t.team().version,n),e})()},get children(){var e=yr();return u(e,n(c,{get each(){return Me(t.preview())},children:e=>(()=>{var t=Sr();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=Mr(),r=e.firstChild.nextSibling;return u(r,n(c,{get each(){return t.probs().filter(e=>e.level===`error`)},children:e=>(()=>{var t=Sr();return u(t,()=>e.message),t})()})),e}})]}function Qi(e){let t=e.c,r=()=>t.spec();return[n($,{label:`Title`,get error(){return t.fieldProblem(`team`,`error`)},children:e=>(()=>{var n=Pr();return i(n,l(e,{type:`text`,get value(){return r().title},onChange:e=>t.apply(he(r(),{title:e.currentTarget.value}))}),!1,!1),n})()}),n($,{label:`Description`,children:e=>(()=>{var n=Fr();return i(n,l(e,{rows:`2`,get value(){return r().description??``},onChange:e=>t.apply(he(r(),{description:e.currentTarget.value}))}),!1,!1),n})()}),n($,{label:`Tags (comma separated)`,children:e=>(()=>{var n=Pr();return i(n,l(e,{type:`text`,get value(){return ge(r())},onChange:e=>t.apply(he(r(),{tags:e.currentTarget.value}))}),!1,!1),n})()}),n($,{label:`Metadata (key=value per line)`,children:e=>(()=>{var n=Fr();return i(n,l(e,{rows:`2`,get value(){return _e(r())},onChange:e=>t.apply(he(r(),{metadata:e.currentTarget.value}))}),!1,!1),n})()}),n(o,{get when(){return e.withMode},get children(){return n(Ji,{get value(){return r().mode},onChange:e=>t.apply(me(r(),e)),get name(){return`te-mode-${t.id}`}})}})]}function $i(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=Ir();return u(e,()=>r.fieldProblem(`entry`,`error`)??r.fieldProblem(`roles`,`error`)),e}}),(()=>{var s=Lr();return u(s,n(c,{get each(){return[...f().roles]},children:s=>(()=>{var c=Br(),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 zr()}}),h),g.addEventListener(`change`,()=>r.apply(de(f(),s.name))),u(_,()=>f().entryRole===s.name?`★ Entry role`:`Entry role`),v.$$click=()=>r.apply(le(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=Pr();return t(t=>e.roleInput?.(s.name,t),a),i(a,l(n,{type:`text`,get value(){return s.label??``},onChange:e=>r.apply(ue(f(),s.name,{label:e.currentTarget.value}))}),!1,!1),a})()}),y),b.addEventListener(`change`,e=>r.apply(ue(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=Rr(),t=e.firstChild,n=t.nextSibling,i=n.nextSibling;return e.addEventListener(`submit`,e=>{e.preventDefault();let t=ce(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 ea(e){let r=e.c,i=()=>r.spec(),[l,f]=s(``),[p,h]=s(``),[g,_]=s(`one-way`),[y,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())};v(()=>e.handle?.({prefill:w}));let T=e=>{e.preventDefault();let t=[...y()?[`msg`]:[],...x()?[`ask`]:[]];r.apply(fe(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 Vr()}}),n(o,{get when(){return i().edges.length},get fallback(){return(()=>{var t=Wr();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=Hr();return u(e,n(c,{get each(){return[...i().edges]},children:e=>(()=>{var t=Kr(),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,()=>Yi(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=Gr();return t.firstChild,u(t,()=>E(e),null),t}}),h),g.$$click=()=>w(e.from,e.to),_.$$click=()=>r.apply(pe(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=Ur(),o=e.firstChild.nextSibling,s=o.firstChild,m=s.firstChild.nextSibling;m.firstChild;var v=s.nextSibling.firstChild.nextSibling;v.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,N=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=qr();return u(t,()=>e.name),a(()=>t.selected=l()===e.name),a(()=>t.value=e.name),t})()}),null),v.addEventListener(`change`,e=>h(e.currentTarget.value)),u(v,n(c,{get each(){return[...i().roles]},children:e=>(()=>{var t=qr();return u(t,()=>e.name),a(()=>t.selected=p()===e.name),a(()=>t.value=e.name),t})()}),null),D.addEventListener(`change`,()=>_(`one-way`));var ee=C;return typeof ee==`function`?t(ee,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&&(N.disabled=e.a=i),e},{e:void 0,t:void 0,a:void 0}),a(()=>m.value=l()),a(()=>v.value=p()),a(()=>D.checked=g()===`one-way`),a(()=>O.checked=g()===`two-way`),a(()=>j.checked=y()),a(()=>M.checked=x()),e})()]}function ta(e){let t=()=>e.c.read().published;return(()=>{var e=Xr();return u(e,n(o,{get when(){return t().mode===`restricted`},get fallback(){return(()=>{var e=Zr(),n=e.firstChild.nextSibling.nextSibling;return u(n,()=>t().entryRole),e})()},get children(){return[(()=>{var e=Jr(),n=e.firstChild.nextSibling.nextSibling;return u(n,()=>t().entryRole),e})(),n(o,{get when(){return t().edges.length},get fallback(){return Qr()},get children(){var e=Yr();return u(e,n(c,{get each(){return[...t().edges]},children:e=>(()=>{var t=$r(),n=t.firstChild,r=n.nextSibling,i=r.nextSibling,o=i.nextSibling;return o.firstChild,u(n,()=>e.from),u(r,()=>Yi(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 na(e){let t=e.c,[i,f]=s(),[h,g]=s();v(()=>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]}),y=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=ri();return u(s,n(o,{get when(){return!t.roster()},get children(){return ei()}}),null),u(s,n(o,{get when(){return S()},get children(){return ti()}}),null),u(s,n(c,{get each(){return b()},children:i=>{let s=()=>y().get(i),l=()=>{let e=s();return e&&`seats`in e?e:void 0},_=p(()=>l()?at(l(),e.snap):[]),v=e=>_().find(t=>t.staffingID===e);return(()=>{var s=ui(),p=s.firstChild,y=p.firstChild,b=y.firstChild;return d(s,`aria-label`,`Role ${i}`),d(s,`data-role`,i),u(b,()=>l()?.entry?`★ `:``,null),u(b,i,null),u(y,n(o,{get when(){return x(i)},get children(){var e=ii();return e.firstChild,u(e,()=>x(i),null),e}}),null),u(y,n(o,{get when(){return l()?.entry},get children(){return ai()}}),null),u(y,n(o,{get when(){return!l()},get children(){return zr()}}),null),u(y,n(o,{get when(){return r(()=>!!l())()&&(l().vacant||l().understaffed)},get children(){var e=oi();return u(e,()=>l()?.vacant?`vacant`:`understaffed`),e}}),null),u(p,n(o,{get when(){return l()},get children(){var e=si();return u(e,(()=>{var e=r(()=>!!l());return()=>e()?ct(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=di(),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 fi()},get children(){var e=ci();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 v(e)},children:e=>(()=>{var n=pi(),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().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=N(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=li(),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(ia,{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 ni()}}),null),u(s,n(o,{get when(){return i()},keyed:!0,children:r=>n(ra,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 ra(e){let i=e.c,[l,f]=s(``),[h,g]=s(e.sessionID??``),y,b=t=>({teamID:i.id,role:e.role,query:t,...i.roster()?{roster:i.roster().seats}:{}}),S=p(()=>ot(e.snap,b(l()))),C=p(()=>ot(e.snap,b(``)).find(e=>e.sessionID===h())),w=()=>C()?.name??h();v(()=>e.sessionID&&queueMicrotask(()=>y?.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(_,{open:!0,get title(){return`Add a member to ${e.role}`},get onClose(){return e.onClose},class:`tm-picker`,get children(){var s=gi(),p=s.firstChild,_=p.firstChild.nextSibling;_.nextSibling;var v=p.nextSibling,b=v.nextSibling,D=b.firstChild,O=D.nextSibling,k=O.nextSibling;k.firstChild,s.addEventListener(`submit`,T),u(p,()=>e.role,_),v.$$input=e=>f(e.currentTarget.value),u(s,n(o,{get when(){return e.snap},get fallback(){return _i()},get children(){var t=mi();return t.firstChild,u(t,n(o,{get when(){return S().length},get fallback(){return(()=>{var e=vi();return u(e,()=>l()?`No session matches.`:`No running sessions.`),e})()},get children(){return n(c,{get each(){return S()},children:t=>(()=>{var n=yi(),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=hi();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(Ki,{get notice(){return r(()=>i.notice()?.kind===`ok`)()?void 0:i.notice()}}),b),D.$$click=()=>{e.onClose(),e.onLaunch()},x(O,`click`,e.onClose,!0);var A=y;return typeof A==`function`?t(A,k):y=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&&(v.autofocus=t.t=r),a!==t.a&&(k.disabled=t.a=a),t},{e:void 0,t:void 0,a:void 0}),a(()=>v.value=l()),s}})}function ia(e){let t=e.c,[r,d]=s(e.role??``),[f,m]=s(``),[h,g]=s(``),[_,y]=s(``),[b,x]=s(``),[S,C]=s(`worktree`),[w,T]=s(``),[E,D]=s(``),[O,k]=s(``),[A,j]=s(``),[M,N]=s(),[ee,te]=s([]);v(()=>void hr().then(te));let P=p(()=>(e.snap?.nodes??[]).filter(e=>e.kind===`machine`)),F=p(()=>{let e=P().find(e=>e.machineID===f());return e?.harnesses.length?e.harnesses:[`opencode`,`claude-code`,`codex`]}),I=e=>M()?.field===e?M().error:void 0,L=async n=>{n.preventDefault();let i=ze({role:r(),machine:f(),harness:h(),profile:_(),repo:b(),mode:S(),branch:w(),remote:E(),name:O(),prompt:A()});if(!r())return N({field:`role`,error:`Choose a published role`});if(!i.ok)return N({field:i.field,error:i.error});N(void 0),await t.launch(r(),i.body)&&e.onDone?.()};return(()=>{var s=xi(),p=s.firstChild.nextSibling,_=p.firstChild;return s.addEventListener(`submit`,L),u(s,n($,{label:`Role`,get error(){return I(`role`)},children:e=>(()=>{var o=Si();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=qr();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=Ci();return t.firstChild,i(t,l(e,{onChange:e=>m(e.currentTarget.value)}),!1,!0),u(t,n(c,{get each(){return P().map(e=>e.machineID??e.id)},children:e=>{let t=()=>P().find(t=>(t.machineID??t.id)===e);return(()=>{var n=qr();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=wi();return t.firstChild,i(t,l(e,{onChange:e=>g(e.currentTarget.value)}),!1,!0),u(t,n(c,{get each(){return F()},children:e=>(()=>{var t=qr();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=Ti();return t.firstChild,i(t,l(e,{onChange:e=>y(e.currentTarget.value)}),!1,!0),u(t,n(c,{get each(){return ee()},children:e=>(()=>{var t=Ei(),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:`Repository on the machine`,get error(){return I(`repo`)},children:e=>(()=>{var t=Pr();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=Di();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 I(`branch`)},children:e=>(()=>{var t=Pr();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 I(`remote`)},children:e=>(()=>{var t=Pr();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 I(`name`)},children:e=>(()=>{var t=Pr();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=Fr();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=bi();return t.$$click=()=>e.onDone(),t}}),null),a(()=>_.disabled=t.busy()||!!t.team()?.paused),s})()}function aa(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=Ve({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=vi();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=Oi(),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=Pr();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=Fr();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=ki();return i(t,l(e,{onChange:e=>g(e.currentTarget.value)}),!1,!0),u(t,n(c,{get each(){return[...Be]},children:e=>(()=>{var t=qr();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=Fr();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 oa={queued:`Submitted`,routed:`Routed`,working:`Working`,closed:`Closed`};function sa(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=Ai();return e.firstChild,u(e,()=>t.intakeError(),null),e}}),n(o,{get when(){return t.items()},get fallback(){return Mi()},get children(){return n(o,{get when(){return r().length},get fallback(){return Ni()},get children(){var e=ji();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(ca,{c:t,get item(){return e()},sessionName:i})})})),e}})}})]}function ca(e){let t=()=>e.item,r=()=>Xe(t());return(()=>{var i=zi(),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,()=>Ye[r()]),u(p,n(c,{get each(){return Qe(t())},children:e=>(()=>{var t=Sr();return u(t,()=>oa[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 ${y(t().createdAt)}`,t().updatedAt===t().createdAt?void 0:`updated ${y(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 Bi()}})},get children(){return[Pi(),(()=>{var n=Fi();return u(n,()=>e.sessionName(t().sessionID)),a(()=>d(n,`href`,N(t().sessionID))),n})()]}}),null),u(g,n(o,{get when(){return t().workspaceID},get children(){var e=Ii();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 Ze(t())},get children(){var r=Ri(),i=r.firstChild;return u(r,n(o,{get when(){return t().status===`routed`},get children(){var n=Li();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 la(t){let[r,i]=s(),[a,l]=s(``);return f(e(()=>t.c.team()?.version,()=>void tr(t.c.id).then(e=>(i(e),l(``))).catch(e=>l(e.message)))),n(o,{get when(){return!a()},get fallback(){return(()=>{var e=Hi();return e.firstChild,u(e,a,null),e})()},get children(){return n(o,{get when(){return r()},get fallback(){return Ui()},get children(){var e=Vi();return u(e,n(c,{get each(){return r()},children:e=>(()=>{var r=Gi(),i=r.firstChild;i.firstChild;var a=i.nextSibling;return a.firstChild,u(i,()=>e.version,null),u(a,()=>y(e.publishedAt),null),u(r,n(o,{get when(){return e.version===t.c.team()?.version},get children(){return Wi()}}),null),r})()})),e}})}})}b([`click`,`input`]);var ua=g(`<p role=alert class=wt-error>`),da=g(`<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`),fa=g(`<input>`),pa=e=>`/teams/${encodeURIComponent(e)}`;function ma(e){let[t,r]=s(``),[c,d]=s(``),[f,p]=s(`restricted`),[m,h]=s(`pm`),[g,v]=s(`Project manager`),[y,b]=s(),[S,C]=s(!1),w=gr(),T=e=>y()?.field===e?y().error:void 0,E=async n=>{n.preventDefault();let i=Te({name:t(),title:c(),mode:f(),entryRole:m(),entryLabel:g()});if(!i.ok)return b({field:i.field,error:i.error});b(void 0),C(!0);try{let t=await ir(i.body,w);w=gr(),e.onClose(),r(``),d(``),e.onCreated?e.onCreated(t.team.id):ee(pa(t.team.id))}catch(e){b({field:`form`,error:Pe(e).message})}finally{C(!1)}};return n(_,{get open(){return e.open},title:`New team`,get onClose(){return e.onClose},get children(){var s=da(),_=s.firstChild,y=_.nextSibling,b=y.nextSibling.firstChild,C=b.nextSibling;return s.addEventListener(`submit`,E),u(s,n($,{label:`Name (the #team address, can't change)`,get error(){return T(`name`)},children:e=>(()=>{var n=fa();return i(n,l(e,{get value(){return t()},onInput:e=>r(e.currentTarget.value),placeholder:`product-a`,autofocus:!0}),!1,!1),n})()}),_),u(s,n($,{label:`Title`,get error(){return T(`title`)},children:e=>(()=>{var t=fa();return i(t,l(e,{get value(){return c()},onInput:e=>d(e.currentTarget.value),placeholder:`Product A`}),!1,!1),t})()}),_),u(s,n(Ji,{get value(){return f()},onChange:p,name:`tm-new-mode`}),_),u(_,n($,{label:`Entry role (receives the team's work)`,get error(){return T(`entry`)},children:e=>(()=>{var t=fa();return i(t,l(e,{get value(){return m()},onInput:e=>h(e.currentTarget.value)}),!1,!1),t})()}),null),u(_,n($,{label:`Entry role label`,children:e=>(()=>{var t=fa();return i(t,l(e,{get value(){return g()},onInput:e=>v(e.currentTarget.value)}),!1,!1),t})()}),null),u(s,n(o,{get when(){return T(`form`)},get children(){var e=ua();return u(e,()=>T(`form`)),e}}),y),x(b,`click`,e.onClose,!0),a(()=>C.disabled=S()),s}})}b([`click`]);var ha=new Set([`agent`,`status`,`catalog`,`resync`,`decision`]),ga=2e3;function _a(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=st({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+ga-Date.now()))))};v(()=>{let e=I(e=>typeof e.type==`string`&&ha.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{In as $,St as A,It as B,Un as C,Cn as D,Tt as E,zn as F,qt as G,Pt as H,cn as I,jt as J,vn as K,Hn as L,Mt as M,Sn as N,dt as O,Lt as P,pn as Q,Xt as R,Wn as S,ut as T,mn as U,Ft as V,Ln as W,_n as X,bn as Y,En as Z,Zn as _,Zi as a,Vn as at,Kn as b,Ji as c,Re as ct,ta as d,me as dt,Bn as et,$i as f,Ie as ft,_r as g,la as h,Qi as i,ln as it,wt as j,Ct as k,Ki as l,Pe as lt,Xi as m,ma as n,Nn as nt,sa as o,Fn as ot,aa as p,kt as q,pa as r,Rn as rt,na as s,tt as st,_a as t,Pn as tt,ea as u,Le as ut,Xn as v,Rt as w,qn as x,Qn as y,Yt as z};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{I as e}from"./toast-CXTwTvDw.js";var t={workspacesPerUser:200,membersPerWorkspace:200,bindingsPerWorkspace:16,supervisionLinksPerWorkspace:400,supervisionDepth:6,checkpointsPerSupervisor:50,sideChatsPerWorkspace:100,sideChatContextItems:20,sideChatContextBytes:65536,panes:4};function n(e,n,r,i=t.supervisionDepth){let a=new Map(e);a.set(n,r);let o=e=>{let t=new Set,n=0;for(let r=e;r!==void 0;r=a.get(r)){if(t.has(r))return`cycle`;t.add(r),a.has(r)&&n++}return n},s=0;for(let e of a.keys()){let t=o(e);if(t===`cycle`)return`cycle`;s=Math.max(s,t)}return s>i?`depth`:void 0}var r=t.panes,i=`hub.paneLayout.v1`,a=[`single`,`vertical`,`horizontal`,`grid`],o=t=>typeof t==`string`&&e.test(t),s=e=>`artifactID`in e&&e.sessionID===void 0?e.artifactID:void 0,c=(e,t)=>s(e)!==void 0||s(t)!==void 0?s(e)===s(t):e.sessionID===t.sessionID&&e.sideChatID===t.sideChatID,l=s,u=c;function d(e){if(typeof e!=`object`||!e)return;let{sessionID:t,sideChatID:n,artifactID:r}=e;return t===void 0?o(r)?{artifactID:r}:void 0:!o(t)||n!==void 0&&!o(n)?void 0:o(n)?{sessionID:t,sideChatID:n}:{sessionID:t}}function f(e){return{v:1,split:`single`,panes:e?[{sessionID:e}]:[],focused:0}}function p(e,t,n){let r=Number.isInteger(n)?Math.min(Math.max(0,n),Math.max(0,t.length-1)):0;return{v:1,split:t.length<=1?`single`:e===`single`?`vertical`:e,panes:t,focused:r}}function m(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e;if(t.v!==1||!Array.isArray(t.panes))return;let n=[];for(let e of t.panes){if(n.length>=r)break;let t=d(e)??(typeof e==`object`&&e&&o(e.sessionID)?{sessionID:e.sessionID}:void 0);t&&(n.some(e=>c(e,t))||n.push(t))}return p(a.includes(t.split)?t.split:`vertical`,n,typeof t.focused==`number`?t.focused:0)}function h(e,t,n={}){let i=d(t);if(!i)return{layout:e,outcome:`invalid`};let a=e.panes.findIndex(e=>c(e,i));if(a>=0)return{layout:a===e.focused?e:p(e.split,e.panes,a),outcome:`focused`};if(!e.panes.length)return{layout:p(e.split,[i],0),outcome:`added`};if(n.beside){if(e.panes.length>=r)return{layout:e,outcome:`limit`};let t=e.focused+1;return{layout:p(e.split,[...e.panes.slice(0,t),i,...e.panes.slice(t)],t),outcome:`added`}}return{layout:p(e.split,e.panes.map((t,n)=>n===e.focused?i:t),e.focused),outcome:`replaced`}}function g(e,t){if(!Number.isInteger(t)||t<0||t>=e.panes.length)return e;let n=e.panes.filter((e,n)=>n!==t);return p(e.split,n,t<e.focused?e.focused-1:e.focused)}function _(e,t){return!Number.isInteger(t)||t<0||t>=e.panes.length||t===e.focused?e:p(e.split,e.panes,t)}function v(e,t){return!a.includes(t)||e.panes.length<=1||t===`single`||t===e.split?e:p(t,e.panes,e.focused)}function y(e){try{let t=e?.getItem(i);return t?m(JSON.parse(t)):void 0}catch{return}}function b(e,t){if(!e)return!1;try{return e.setItem(i,JSON.stringify(t)),!0}catch{return!1}}function x(e,t,n){let r=e.panes.length,i=e=>Number.isInteger(e)&&e>=0&&e<r;if(!i(t)||!i(n)||t===n)return e;let a=e.panes.map((e,t)=>t);return a.splice(n,0,...a.splice(t,1)),p(e.split,a.map(t=>e.panes[t]),a.indexOf(e.focused))}function S(e,t){let n=e.panes.length;return n>1?_(e,(e.focused+t+n)%n):e}export{y as a,l as c,v as d,p as f,n as g,t as h,_ as i,u as l,d as m,g as n,x as o,f as p,S as r,h as s,r as t,b as u};
|
|
@@ -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-ycZ_aQZO.js";import{a as s,i as c,n as l,o as u,r as d}from"./Watchtower-DYwoUWME.js";import{a as f,c as p,i as m,r as h,s as g,t as _}from"./safe-area-DHhPy61Q.js";var v={w:76,h:58,pad:16,header:38,role:118,gap:40,band:120,party:120,roleRow:92},y=14,b=8,x=200,S=420,C=(e,t)=>Math.max(1,Math.min(t,Math.ceil(Math.sqrt(e*2))));function ee(e){let t=new Map,n=new Set(e.nodes.map(e=>e.id));t.set(`hub`,{x:0,y:0}),e.nodes.filter(e=>e.id!==`hub`&&(e.kind===`hub`||e.kind===`user`||e.kind===`app`)).forEach((e,n)=>t.set(e.id,{x:(n%2==0?-1:1)*v.party*(Math.floor(n/2)+1),y:0}));let r=e.groups.map(e=>{let t=e.sections.map(e=>{let t=e.id!==void 0,n=C(e.members.length,t?b:y),r=Math.max(1,Math.ceil(e.members.length/n));return{cols:n,rows:r,role:t,w:(t?v.role+v.w/2:0)+n*v.w,h:r*(t?v.roleRow:v.h)}});return{group:e,sections:t,w:Math.max((e.kind===`team`?S:x)-2*v.pad,...t.map(e=>e.w))+2*v.pad,h:v.header+t.reduce((e,t)=>e+t.h,0)+v.pad}}),i=r.reduce((e,t)=>e+(t.w+v.gap)*(t.h+v.gap),0),a=Math.max(...r.map(e=>e.w),Math.sqrt(i)*1.5,1),o=[],s=[],c=0;for(let e of r)s.length&&c+v.gap+e.w>a&&(o.push(s),s=[],c=0),c+=(s.length?v.gap:0)+e.w,s.push(e);s.length&&o.push(s);let l=[],u=v.band;for(let e of o){let r=-(e.reduce((e,t)=>e+t.w,0)+v.gap*(e.length-1))/2;for(let i of e){let{group:e}=i,a=[],o=u+v.header;e.sections.forEach((e,s)=>{let c=i.sections[s],l={x:r+v.pad,y:o,w:i.w-2*v.pad,h:c.h};a.push({...l,...e.id===void 0?{}:{id:e.id},...e.label===void 0?{}:{label:e.label},...e.entry===void 0?{}:{entry:e.entry}});let u=c.role?v.roleRow:v.h;e.id!==void 0&&n.has(e.id)&&t.set(e.id,{x:l.x+v.role/2,y:o+u/2});let d=l.x+(c.role?v.role+s%2*(v.w/2):0);e.members.forEach((e,n)=>t.set(e,{x:d+n%c.cols*v.w+v.w/2,y:o+Math.floor(n/c.cols)*u+u/2})),o+=c.h}),n.has(e.id)&&t.set(e.id,{x:r+v.pad+12,y:u+v.header/2}),l.push({id:e.id,label:e.label,kind:e.kind,x:r,y:u,w:i.w,h:i.h,...e.machine===void 0?{}:{machine:e.machine},...e.online===void 0?{}:{online:e.online},...e.mode===void 0?{}:{mode:e.mode},...e.paused===void 0?{}:{paused:e.paused},...e.entryRole===void 0?{}:{entryRole:e.entryRole},members:e.sections.reduce((e,t)=>e+t.members.length,0),sections:a}),r+=i.w+v.gap}u+=Math.max(...e.map(e=>e.h))+v.gap}let d=e.nodes.filter(e=>!t.has(e.id));d.forEach((e,n)=>t.set(e.id,{x:(n-(d.length-1)/2)*v.w,y:u+v.h/2}));let f=[],p=[];for(let e of t.values())f.push(e.x-v.w/2,e.x+v.w/2),p.push(e.y-v.h/2,e.y+v.h/2);for(let e of l)f.push(e.x,e.x+e.w),p.push(e.y,e.y+e.h);let m=Math.min(...f)-40,h=Math.min(...p)-40;return{positions:t,boxes:l,bounds:{x:m,y:h,w:Math.max(...f)+40-m,h:Math.max(...p)+40-h}}}function te(e,t,n,r){let i=Math.max(1,t.width-n.left-n.right),a=Math.max(1,t.height-n.top-n.bottom),o=Math.max(r.min,Math.min(r.max,Math.min(i/Math.max(1,e.w),a/Math.max(1,e.h))));return{k:o,x:n.left+i/2-(e.x+e.w/2)*o,y:n.top+a/2-(e.y+e.h/2)*o}}function ne(e,t,n){let r=t===void 0?void 0:e.get(t);if(!r)return e.keys().next().value;let i,a=1/0;for(let[o,s]of e){if(o===t)continue;let e=s.x-r.x,c=s.y-r.y,[l,u]=n===`right`?[e,c]:n===`left`?[-e,c]:n===`down`?[c,e]:[-c,e];if(l<=0||Math.abs(u)>l*2)continue;let d=l+2*Math.abs(u);d<a&&(a=d,i=o)}return i??t}var re={glow:!0,pulses:!0,labels:12},w=.04,ie=4,ae=.55,oe=9.5,T={w:180,h:120},E=`system-ui, -apple-system, sans-serif`,se=e=>e.kind===`hub`?22:e.kind===`role`?13:Math.max(8,Math.min(20,e.size*1.9)),D=e=>e.kind===`hub`||e.kind===`role`?13:e.kind===`aggregate`?se(e)*.8:e.kind===`session`?Math.max(5,Math.min(11,3+e.size)):8,ce=(e,t)=>e.length>t?`${e.slice(0,t-1)}…`:e;function le(e){let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)|0;return(t>>>0)%1e3/1e3}function ue(e,t){return e.kind===`hub`?t(`--accent`):e.kind===`user`||e.kind===`app`?t(`--text`):e.kind===`team`||e.kind===`role`?t(`--violet`):e.kind===`cluster`?t(`--muted`):e.machine===void 0?t(`--faint`):t(n[e.machine%n.length])}function de(e,t,n,r){e.beginPath(),e.roundRect(t-v.role/2+8,n-r,v.role-16,r*2,r)}function fe(e,t,n){let r=t.x-e.x,i=t.y-e.y,a={x:(e.x+t.x)/2-i*n,y:(e.y+t.y)/2+r*n};return{c:a,mid:{x:.25*e.x+.5*a.x+.25*t.x,y:.25*e.y+.5*a.y+.25*t.y}}}var pe=e=>e.kind===`structure`?e.bridge?.18:0:e.kind===`policy`?.22:e.kind===`denied`?-.22:.1;function me(e,t,n,r,i,a,o){let s=Math.atan2(n.y-t.y,n.x-t.x);e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(n.x-r*Math.cos(s-.45),n.y-r*Math.sin(s-.45)),e.lineTo(n.x-r*Math.cos(s+.45),n.y-r*Math.sin(s+.45)),e.closePath(),e.setLineDash([]),e.fillStyle=i?o:a,e.fill(),e.strokeStyle=a,e.lineWidth=1.4,e.stroke()}function he(e,t,n){let r=Math.hypot(e.x-t.x,e.y-t.y)||1;return{x:e.x-(e.x-t.x)/r*n,y:e.y-(e.y-t.y)/r*n}}function ge(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=r||i?Math.max(0,Math.min(1,((e.x-t.x)*r+(e.y-t.y)*i)/(r*r+i*i))):0;return Math.hypot(e.x-(t.x+a*r),e.y-(t.y+a*i))}function O(n,y){let b=document.createElement(`canvas`);b.className=`wt-canvas2d`;let x=b.getContext(`2d`);if(!x)throw Error(`This browser can't draw on a canvas`);let S=document.createElement(`canvas`);S.className=`wt-minimap`,S.setAttribute(`aria-hidden`,`true`),S.title=`Minimap: click to move the view`;let C=S.getContext(`2d`),O=document.createElement(`span`);O.className=`wt-tip wt-tip2d`,O.hidden=!0,n.append(b,S,O);let k,A,j=()=>`#888`,_e=!0,M,N,P,ve,F=n.clientWidth||300,I=n.clientHeight||150,L={k:1,x:F/2,y:80},R=!1,z=0,ye=0,be={s:1,ox:0,oy:0},B=new Map,xe=new Set,V=re,H=!1,U=!1,Se=0,Ce=0,we=new Map,Te=new Set,Ee=new Map,De=new Map,Oe=0,ke=!1,Ae=()=>window.devicePixelRatio||1,je=e=>({x:e.x*L.k+L.x,y:e.y*L.k+L.y}),W=(e,t)=>({x:(e-L.x)/L.k,y:(t-L.y)/L.k}),G=(e,t)=>{let n=b.getBoundingClientRect();return{x:e-n.left,y:t-n.top}},K=()=>{Ne=!0,z||=requestAnimationFrame(Qe)},q=document.createElement(`canvas`),Me=q.getContext(`2d`),J=x,Ne=!0,Pe=``,Y=(e,t)=>{cancelAnimationFrame(ye);let n={...e,k:Math.max(w,Math.min(ie,e.k))};if(!t||!_e){L=n,K();return}let r=L,i=performance.now(),a=e=>{let t=Math.min(1,(e-i)/260),o=1-(1-t)**3;L={k:r.k+(n.k-r.k)*o,x:r.x+(n.x-r.x)*o,y:r.y+(n.y-r.y)*o},Qe(),t<1&&(ye=requestAnimationFrame(a))};ye=requestAnimationFrame(a)},Fe=e=>{if(!A)return;let t=A.positions.get(`hub`);Y(U&&t?{k:1.3,x:F/2-t.x*1.3,y:I/2-t.y*1.3}:te(A.bounds,{width:F,height:I},_(n),{min:w,max:1.4}),e)},Ie=(e,t,n,r=!1)=>{let i=Math.max(w,Math.min(ie,L.k*n)),a=W(e,t);R=!0,Y({k:i,x:e-a.x*i,y:t-a.y*i},r)},Le=(e,t,n=L.k)=>Y({k:n,x:F/2-e.x*n,y:I/2-e.y*n},t);function Re(e){let t=J,n=e.kind===`team`,r=n&&e.mode===`restricted`,i=j(we.get(e.id)??`--line-2`);t.save(),t.beginPath(),t.roundRect(e.x,e.y,e.w,e.h,22),V.glow&&(t.shadowColor=u(i,H?.35:.22),t.shadowBlur=36*L.k),t.fillStyle=u(i,H?.075:.06),t.fill(),t.shadowBlur=0,t.lineWidth=n?1.6:1,t.setLineDash(r?[8,5]:e.online===!1?[4,4]:[]),t.strokeStyle=u(i,n?.65:.4),t.stroke(),t.setLineDash([]),e.sections.forEach((e,n)=>{e.entry&&(t.fillStyle=u(j(`--accent`),.09),t.beginPath(),t.roundRect(e.x,e.y+2,e.w,e.h-4,10),t.fill()),n>0&&e.id!==void 0&&(t.strokeStyle=u(i,.18),t.lineWidth=1,t.beginPath(),t.moveTo(e.x+10,e.y),t.lineTo(e.x+e.w-10,e.y),t.stroke())}),t.beginPath(),t.rect(e.x,e.y,e.w-8,v.header),t.clip();let a=e.x+v.pad+(xe.has(e.id)?30:4),o=e.y+v.header/2,s=ce(e.label,28);t.fillStyle=j(`--text`),t.font=`650 13px ${E}`,t.textBaseline=`middle`,t.fillText(s,a,o);let c=k?.teams.find(t=>t.id===e.id)?.members??e.members,l=n?`${r?`Restricted: declared paths only`:`Open: everyone may message everyone`}${e.paused?` · paused`:``} · ${c} seated`:`${e.members} ${e.members===1?`node`:`nodes`}${e.online===!1?` · offline`:``}`;t.fillStyle=j(`--muted`),t.font=`12px ${E}`,t.fillText(l,a+t.measureText(s).width+18,o),t.restore()}function ze(e,n){let r=n.get(e.source),i=n.get(e.target);if(!r||!i||e.kind===`structure`&&e.structure!==`tree`&&e.structure!==`party`&&e.structure!==`seat`&&!e.bridge)return;let a=J,o=B.get(e.source),s=B.get(e.target),{c,mid:l}=fe(r,i,pe(e)),d=e.kind===`structure`,f=d&&e.structure===`seat`,p=j(d?e.bridge||f?`--violet`:`--line-2`:t(e.kind)),m=qe(),h=!m||e.source===m||e.target===m;a.save(),a.globalAlpha=(o?.dim&&s?.dim?.15:1)*(h?1:.2),a.setLineDash(d?e.bridge?[3,4]:[]:e.style===`dotted`?[1.5,4.5]:e.style===`dashed`?[7,4]:[]),a.lineCap=`round`;let g=d?i:he(i,c,(s?D(s):0)+6),_=e.kind===`policy`&&e.twoWay?he(r,c,(o?D(o):0)+6):f&&o?.kind===`role`?{x:r.x+v.role/2-8,y:r.y}:r,y=()=>{a.beginPath(),a.moveTo(_.x,_.y),a.quadraticCurveTo(c.x,c.y,g.x,g.y)};if(d){a.strokeStyle=u(p,e.bridge?.8:f?.6:.55),a.lineWidth=e.bridge?1.4:f?1.5:1,y(),a.stroke(),a.restore();return}let b=k&&k.links.length>120?.55:1,x=e.kind===`policy`?.6:e.kind===`denied`?.85:Math.min(.95,.45+e.width*.09)*b,S=e.kind===`policy`?1.6:Math.max(1.1,e.width*.75);V.glow&&e.kind!==`policy`&&(a.strokeStyle=u(p,(H?.16:.1)*x),a.lineWidth=S*4,y(),a.stroke());let C=a.createLinearGradient(_.x,_.y,g.x,g.y);C.addColorStop(0,u(p,x*.35)),C.addColorStop(1,u(p,x)),a.strokeStyle=C,a.lineWidth=S,y(),a.stroke();let ee=j(`--bg`),te=e.kind===`policy`?10:6+Math.min(3,e.width);me(a,c,g,te,e.kind===`policy`,u(p,Math.max(.7,x)),ee),e.kind===`policy`&&e.twoWay&&me(a,c,_,te,!0,p,ee),a.textBaseline=`middle`,e.kind===`denied`?(a.setLineDash([]),a.strokeStyle=p,a.lineWidth=2.2,a.beginPath(),a.moveTo(l.x-5,l.y-5),a.lineTo(l.x+5,l.y+5),a.moveTo(l.x+5,l.y-5),a.lineTo(l.x-5,l.y+5),a.stroke(),a.fillStyle=p,a.font=`600 11px ${E}`,a.fillText(`${e.denied??e.count} denied`,l.x+9,l.y)):e.kind===`policy`&&L.k>=.7&&e.kinds?.length&&(a.fillStyle=j(`--muted`),a.font=`11px ${E}`,a.fillText(`${e.twoWay?`⇄`:`→`} ${e.kinds.join(`, `)}`,l.x+6,l.y)),a.restore()}function Be(e,n){if(!_e||!V.pulses||!k)return 0;let i=J,a=Se+(Date.now()-Ce),o=0;i.save(),H&&(i.globalCompositeOperation=`lighter`);for(let s of k.links){if(s.kind===`structure`||s.kind===`policy`||s.kind===`denied`)continue;let c=r(s,a);if(P!==void 0&&(s.source===P||s.target===P)&&(c=Math.max(c,.55)),c<=0)continue;let u=e.get(s.source),d=e.get(s.target);if(!u||!d)continue;let{c:f}=fe(u,d,pe(s)),p=B.get(s.target),m=he(d,f,(p?D(p):0)+6),h=Math.min(4,1+Math.floor(Math.log2(Math.max(1,s.count)))),g=Math.max(1,Math.round(c*h)),_=.16+.34*c,v=le(s.id),y=j(t(s.kind));for(let e=0;e<g;e++){o++;let t=(v+e/g+n*_)%1,r=(1-t)**2*u.x+2*(1-t)*t*f.x+t*t*m.x,a=(1-t)**2*u.y+2*(1-t)*t*f.y+t*t*m.y;l(i,r,a,9,y,(.35+.65*c)*(H?.9:.6)),i.fillStyle=H?`#ffffff`:y,i.globalAlpha=.5+.5*c,i.beginPath(),i.arc(r,a,2.2,0,Math.PI*2),i.fill(),i.globalAlpha=1}}return i.restore(),o}function Ve(e,t,n,r){if(!e.ring||a[e.ring]===`none`)return;let i=J,s=a[e.ring];i.strokeStyle=j(o[e.ring]),i.setLineDash(s===`broken`?[4,3]:[]),i.lineWidth=s===`thick`?3:s===`thin`?1:1.8,i.beginPath(),i.arc(t,n,r+4,0,Math.PI*2),i.stroke(),s===`double`&&(i.lineWidth=1.1,i.beginPath(),i.arc(t,n,r+7,0,Math.PI*2),i.stroke()),i.setLineDash([])}function He(e,t){let n=J,r=D(e),i=!qe()||X.has(e.id);n.save(),n.globalAlpha=(e.dim?.25:1)*(i?1:.3);let a=ue(e,j);V.glow&&e.kind!==`role`&&l(n,t.x,t.y,r*(e.kind===`hub`?U?9:5:3.4),e.match?j(`--accent`):a,(H?.55:.32)*(e.dim?.4:1)*(e.id===P||e.id===M?1.5:1)),e.kind===`role`?(de(n,t.x,t.y,r),e.vacant||(n.fillStyle=u(a,e.entry?.22:.1),n.fill()),n.strokeStyle=u(a,e.entry?1:.7),n.lineWidth=e.entry?2.4:1.3,n.setLineDash(e.vacant?[4,3]:[]),n.stroke(),n.setLineDash([])):d(n,c(e),t.x,t.y,r,a,H?`#ffffff`:u(`#ffffff`,.9)),Ve(e,t.x,t.y,r),e.teams&&(n.strokeStyle=j(`--violet`),n.lineWidth=1.4,n.setLineDash([2,3]),n.beginPath(),n.arc(t.x,t.y,r+10,0,Math.PI*2),n.stroke(),n.setLineDash([]),n.fillStyle=j(`--violet`),n.font=`700 10px ${E}`,n.textBaseline=`middle`,n.fillText(`×${e.teams}`,t.x+r+6,t.y-r-6)),(e.id===M||e.id===N)&&(n.strokeStyle=j(`--accent`),n.lineWidth=e.id===M?2.5:2,n.setLineDash(e.id===M?[]:[5,3]),n.beginPath(),e.kind===`role`?n.roundRect(t.x-v.role/2+4,t.y-r-4,v.role-8,r*2+8,r+4):n.arc(t.x,t.y,r+(e.teams?14:9),0,Math.PI*2),n.stroke(),n.setLineDash([])),n.textAlign=`center`,n.textBaseline=`middle`,e.kind===`role`?(n.fillStyle=j(e.vacant?`--muted`:`--text`),n.font=`${e.entry?700:500} ${e.vacant?11:12}px ${E}`,n.fillText(ce(`${e.entry?`★ `:``}${f(e)}`,16),t.x,t.y)):e.kind===`aggregate`?(n.fillStyle=j(`--text`),n.font=`600 11px ${E}`,n.fillText(String(e.folded??``),t.x,t.y)):e.folded&&e.kind===`session`&&(n.fillStyle=j(`--bg`),n.font=`700 9px ${E}`,n.fillText(`+${e.folded}`,t.x,t.y));let o=De.get(e.id);if(o){let r=Ue(e);n.globalAlpha=e.dim?.6:i?1:.5,n.fillStyle=j(e.dim?`--faint`:e.kind===`session`?`--muted`:`--text`),n.font=We(e,r),n.lineWidth=r/11*3,n.strokeStyle=u(j(`--bg`),.85);let a=o.box.y+o.box.h/2;n.strokeText(o.text,t.x,a),n.fillText(o.text,t.x,a)}n.restore()}let Ue=e=>(e.kind===`hub`?13:11)*Math.max(1,Math.min(1.5,oe/11/L.k)),We=(e,t)=>`${e.kind===`hub`?700:500} ${t}px ${E}`;function Ge(e){if(!k||!A)return new Map;let t=[];for(let e of k.nodes){if(e.kind===`role`||e.kind===`aggregate`||xe.has(e.id))continue;let n=A.positions.get(e.id);if(!n)continue;let r=e.kind!==`session`||e.match||e.id===M||e.id===N||e.id===P;if(!r&&!(L.k>=1||L.k>=ae&&Te.has(e.id)))continue;let i=Ue(e),a=ce(e.label,14),o=ce(e.label,9);t.push({id:e.id,x:n.x,y:n.y+D(e)+(e.ring?16:13)*(i/11)-i*.65,h:i*1.3,texts:r||o===a?[a]:[a,o],pinned:r,rank:(Te.has(e.id)?1e6:0)+(Ee.get(e.id)??0),font:We(e,i)})}return t.sort((e,t)=>t.rank-e.rank||(e.id<t.id?-1:+(e.id>t.id))),g(t,(t,n)=>(e.font!==n.font&&(e.font=n.font),e.measureText(t).width+4))}let X=new Set,Ke;function qe(){let e=P??M;if(e!==Ke&&(Ke=e,X=new Set(e===void 0?[]:[e]),e!==void 0&&k))for(let t of k.links)t.source===e&&X.add(t.target),t.target===e&&X.add(t.source);return e!==void 0&&B.has(e)?e:void 0}function Je(){let e=J;e.save();let t=11,n=()=>((t=t*16807%2147483647)-1)/2147483646;e.fillStyle=j(`--accent`);for(let t=0;t<260;t++){let t=n()*Math.PI*2,r=60+n()**.7*900;e.globalAlpha=(H?.35:.22)*(1-r/1e3),e.beginPath(),e.arc(Math.cos(t)*r,Math.sin(t)*r*.6,.8+n()*1.6,0,Math.PI*2),e.fill()}e.restore()}function Ye(){if(!A)return;let e=Ae();S.width!==T.w*e&&(S.width=T.w*e,S.height=T.h*e);let t=C;t.setTransform(e,0,0,e,0,0),t.clearRect(0,0,T.w,T.h),t.globalAlpha=.92,t.fillStyle=j(`--raise`),t.fillRect(0,0,T.w,T.h),t.globalAlpha=1;let n=A.bounds,r=Math.min(T.w/n.w,T.h/n.h),i=(T.w-n.w*r)/2-n.x*r,a=(T.h-n.h*r)/2-n.y*r;t.strokeStyle=j(`--line-2`),t.lineWidth=1;for(let e of A.boxes)t.strokeRect(e.x*r+i,e.y*r+a,e.w*r,e.h*r);for(let[e,n]of A.positions){let o=B.get(e);if(!o)continue;let s=o.kind===`hub`?4:2;t.fillStyle=o.match?j(`--accent`):ue(o,j),t.fillRect(n.x*r+i-s/2,n.y*r+a-s/2,s,s)}let o=W(0,0);t.strokeStyle=j(`--accent`),t.lineWidth=1.5,t.strokeRect(o.x*r+i,o.y*r+a,F/L.k*r,I/L.k*r),be={s:r,ox:i,oy:a}}function Xe(){let e=Me,t=Ae();if((q.width!==b.width||q.height!==b.height)&&(q.width=b.width,q.height=b.height),e.setTransform(t,0,0,t,0,0),e.fillStyle=j(`--bg`),e.fillRect(0,0,F,I),k&&A){e.setTransform(t*L.k,0,0,t*L.k,t*L.x,t*L.y),J=e;try{U&&Je();for(let e of A.boxes)Re(e);let t=A.positions;for(let e of k.links)e.kind===`structure`&&ze(e,t);for(let e of k.links)e.kind!==`structure`&&ze(e,t);De=Ge(e),Ze();for(let e of k.nodes){let n=t.get(e.id);n&&He(e,n)}}finally{J=x}}}function Ze(){if(!A)return;let e=A.bounds,t=e=>Math.round(e*10)/10;n.dataset.content=JSON.stringify({x:t(e.x*L.k+L.x),y:t(e.y*L.k+L.y),w:t(e.w*L.k),h:t(e.h*L.k)}),n.dataset.labelBoxes=JSON.stringify([...De.values()].map(({box:e})=>[t(e.x*L.k+L.x),t(e.y*L.k+L.y),t(e.w*L.k),t(e.h*L.k)]))}function Qe(){z=0;let e=performance.now(),t=x,r=`${L.k},${L.x},${L.y},${b.width},${b.height}`;if((Ne||r!==Pe)&&(Xe(),Ye(),Ne=!1,Pe=r),t.setTransform(1,0,0,1,0,0),t.drawImage(q,0,0),!k||!A)return;let i=Ae();t.setTransform(i*L.k,0,0,i*L.k,i*L.x,i*L.y),Oe=Be(A.positions,performance.now()/1e3),ve&&(t.save(),ve(t,L),t.restore()),n.dataset.zoom=L.k.toFixed(3),n.dataset.pulses=String(Oe),n.dataset.drawMs=(performance.now()-e).toFixed(1),ke=Oe>0&&!document.hidden,n.dataset.animating=String(ke),ke&&!z&&(z=requestAnimationFrame(Qe))}function $e(e,t){if(!k||!A)return;let n=W(e,t),r;for(let e of k.nodes){let t=A.positions.get(e.id);if(!t)continue;let i=e.kind===`role`?Math.abs(n.x-t.x)<=v.role/2-8&&Math.abs(n.y-t.y)<=se(e)?-1:1/0:Math.hypot(n.x-t.x,n.y-t.y)-se(e)-3;i<=0&&(!r||i<r.d)&&(r={id:e.id,d:i})}if(r)return{type:`node`,id:r.id};let i=6/L.k,a;for(let e of k.links){if(e.kind===`structure`)continue;let t=A.positions.get(e.source),r=A.positions.get(e.target);if(!t||!r)continue;let{c:o}=fe(t,r,pe(e)),s=t;for(let c=1;c<=16;c++){let l=c/16,u={x:(1-l)**2*t.x+2*(1-l)*l*o.x+l*l*r.x,y:(1-l)**2*t.y+2*(1-l)*l*o.y+l*l*r.y},d=ge(n,s,u);d<=i&&(!a||d<a.d)&&(a={l:e,d}),s=u}}if(a)return{type:`link`,link:a.l};let o=A.boxes.find(e=>n.x>=e.x&&n.x<=e.x+e.w&&n.y>=e.y&&n.y<=e.y+e.h);return o?{type:`box`,id:o.id}:void 0}function et(t){let n=B.get(t);if(!n)return``;let r=[n.label];return n.kind===`role`&&r.push(n.entry?`entry role`:`role`,n.vacant?`vacant`:`${n.staffed??0} staffed`),n.seat&&r.push(`seat: ${n.seat}`),n.kind===`team`&&r.push(n.mode===`restricted`?`restricted team`:`open team`),n.kind===`machine`&&r.push(`machine`),n.ring&&r.push(e[n.ring]),n.teams&&r.push(`in ${n.teams} teams`),n.folded&&n.kind===`session`&&r.push(`+${n.folded} folded`),r.join(` · `)}function tt(e){let t=e=>B.get(e)?.label??e;return e.kind===`structure`?``:e.kind===`policy`?`Team path ${t(e.source)} ${e.twoWay?`⇄`:`→`} ${t(e.target)}${e.kinds?.length?` · ${e.kinds.join(`, `)}`:``}${e.count?` · ${e.count} sent along it`:``}`:e.kind===`denied`?`${e.denied??e.count} denied: ${t(e.source)} → ${t(e.target)}`:`${i(e.kind)} · ${t(e.source)} → ${t(e.target)} · ${e.count}`}let Z=new Map,Q,$;b.addEventListener(`pointerdown`,e=>{b.setPointerCapture?.(e.pointerId);let t=G(e.clientX,e.clientY);if(Z.set(e.pointerId,t),Z.size===2){let[e,t]=[...Z.values()];$={d:Math.hypot(e.x-t.x,e.y-t.y)||1,k:L.k,mid:{x:(e.x+t.x)/2,y:(e.y+t.y)/2}},Q=void 0}else Q={...t,t:L,moved:!1}}),b.addEventListener(`pointermove`,e=>{let t=G(e.clientX,e.clientY);if(Z.has(e.pointerId)&&Z.set(e.pointerId,t),$&&Z.size===2){let[e,t]=[...Z.values()],n=Math.max(w,Math.min(ie,$.k*(Math.hypot(e.x-t.x,e.y-t.y)||1)/$.d)),r=W($.mid.x,$.mid.y);R=!0,Y({k:n,x:$.mid.x-r.x*n,y:$.mid.y-r.y*n},!1);return}if(Q){!Q.moved&&Math.hypot(t.x-Q.x,t.y-Q.y)>4&&(Q.moved=!0),Q.moved&&(R=!0,O.hidden=!0,Y({k:Q.t.k,x:Q.t.x+t.x-Q.x,y:Q.t.y+t.y-Q.y},!1));return}let n=$e(t.x,t.y),r=n?.type===`node`?n.id:void 0;b.style.cursor=n&&n.type!==`box`?`pointer`:`grab`,r!==P&&(P=r,K());let i=n?.type===`node`?et(n.id):n?.type===`link`?tt(n.link):``;O.hidden=!i,i&&(O.textContent=i,O.style.left=`${Math.min(t.x+14,F-220)}px`,O.style.top=`${t.y+14}px`)}),b.addEventListener(`pointerup`,e=>{if(Z.delete(e.pointerId),Z.size<2&&($=void 0),!Q)return;let t=!Q.moved;if(Q=void 0,!t)return;let n=G(e.clientX,e.clientY),r=$e(n.x,n.y);r?.type===`node`?(N=r.id,y.onNode(r.id)):r?.type===`link`?y.onLink(r.link):y.onBackground(),K()}),b.addEventListener(`pointercancel`,e=>{Z.delete(e.pointerId),Q=void 0,$=void 0}),b.addEventListener(`pointerleave`,()=>{O.hidden=!0,P!==void 0&&(P=void 0,K())}),b.addEventListener(`wheel`,e=>{e.preventDefault();let t=G(e.clientX,e.clientY);Ie(t.x,t.y,Math.exp(-e.deltaY*(e.ctrlKey?.01:.0015)))},{passive:!1}),b.addEventListener(`dblclick`,e=>{let t=G(e.clientX,e.clientY);Ie(t.x,t.y,2,!0)});let nt=e=>{let t=S.getBoundingClientRect(),{s:n,ox:r,oy:i}=be;R=!0,Le({x:(e.clientX-t.left-r)/n,y:(e.clientY-t.top-i)/n},!1)};S.addEventListener(`pointerdown`,e=>{S.setPointerCapture?.(e.pointerId),nt(e)}),S.addEventListener(`pointermove`,e=>{S.hasPointerCapture?.(e.pointerId)&&nt(e)});let rt=e=>{let t=et(e);y.announce(t?`${t}. Enter opens it.`:``)},it=e=>{let t=A?.positions.get(e);if(!t)return;let n=je(t);(n.x<40||n.y<40||n.x>F-40||n.y>I-40)&&Le(t,!0,Math.max(L.k,.7))},at=e=>{N=e,e&&(it(e),rt(e)),K()},ot=e=>{if(e.target!==n||!A)return;let t={ArrowLeft:`left`,ArrowRight:`right`,ArrowUp:`up`,ArrowDown:`down`}[e.key];t&&e.shiftKey?(e.preventDefault(),R=!0,Y({...L,x:L.x+(t===`left`?80:t===`right`?-80:0),y:L.y+(t===`up`?80:t===`down`?-80:0)},!1)):t?(e.preventDefault(),at(ne(A.positions,N??`hub`,t))):(e.key===`Enter`||e.key===` `)&&N?(e.preventDefault(),y.onNode(N)):e.key===`Home`?(e.preventDefault(),at(`hub`)):e.key===`+`||e.key===`=`||e.key===`-`||e.key===`_`?(e.preventDefault(),Ie(F/2,I/2,e.key===`+`||e.key===`=`?1.25:.8,!0)):e.key===`0`&&(e.preventDefault(),R=!1,Fe(!0))},st=()=>{N===void 0&&(N=M!==void 0&&B.has(M)?M:`hub`),rt(N),K()};n.addEventListener(`keydown`,ot),n.addEventListener(`focus`,st);let ct=()=>document.visibilityState===`visible`&&K();return document.addEventListener(`visibilitychange`,ct),{update(e,t,r){k=e,j=t,_e=r.motion,M=r.selected,V={...re,...r.look},H=s(j(`--bg`)),Se=e.now,Ce=Date.now(),U=!e.nodes.some(e=>e.kind===`session`||e.kind===`aggregate`);let i=p(e);we=new Map(i.map(e=>[e.id,e.color])),Te=m(e,{max:V.labels}),Ee=h(e),Ke=`\0`,B.clear();for(let t of e.nodes)B.set(t.id,t);A=ee(e),xe.clear();for(let e of A.boxes)B.has(e.id)&&xe.add(e.id);N!==void 0&&!B.has(N)&&(N=void 0);let a=n.dataset;a.nodes=String(e.nodes.length),a.boxes=String(A.boxes.length),a.teams=String(A.boxes.filter(e=>e.kind===`team`).length),a.policy=String(e.links.filter(e=>e.kind===`policy`).length),a.twoWay=String(e.links.filter(e=>e.kind===`policy`&&e.twoWay).length),a.denied=String(e.links.filter(e=>e.kind===`denied`).length),a.bridges=String(e.links.filter(e=>e.bridge).length),a.tethers=String(e.links.filter(e=>e.structure===`seat`&&!e.bridge).length),a.vacant=String(e.nodes.filter(e=>e.kind===`role`&&e.vacant).length),a.selected=M??``,a.regions=String(i.length),a.empty=String(U),R||Fe(!1),K()},focus(e,t){let n=A?.positions.get(e);n&&(N=e,R=!0,Le(n,t,Math.max(L.k,1)),K())},reset(e){R=!1,Fe(e)},resize(e,t){F=Math.max(1,e),I=Math.max(1,t);let n=Ae();b.width=Math.round(F*n),b.height=Math.round(I*n),b.style.width=`${F}px`,b.style.height=`${I}px`,R||Fe(!1),K()},destroy(){cancelAnimationFrame(z),cancelAnimationFrame(ye),n.removeEventListener(`keydown`,ot),n.removeEventListener(`focus`,st),document.removeEventListener(`visibilitychange`,ct),n.replaceChildren()},hitTest(e,t){let n=G(e,t);return $e(n.x,n.y)},toWorld(e,t){let n=G(e,t);return W(n.x,n.y)},setOverlay(e){ve=e,K()},layout:()=>A}}export{O as createRenderer2D};
|
|
1
|
+
import{A as e,B as t,E as n,G as r,V as i,j as a,k as o}from"./live-CVUFIdUX.js";import{a as s,i as c,n as l,o as u,r as d}from"./Watchtower-CpQdIRns.js";import{a as f,c as p,i as m,r as h,s as g,t as _}from"./safe-area-C7IAlkgY.js";var v={w:76,h:58,pad:16,header:38,role:118,gap:40,band:120,party:120,roleRow:92},y=14,b=8,x=200,S=420,C=(e,t)=>Math.max(1,Math.min(t,Math.ceil(Math.sqrt(e*2))));function ee(e){let t=new Map,n=new Set(e.nodes.map(e=>e.id));t.set(`hub`,{x:0,y:0}),e.nodes.filter(e=>e.id!==`hub`&&(e.kind===`hub`||e.kind===`user`||e.kind===`app`)).forEach((e,n)=>t.set(e.id,{x:(n%2==0?-1:1)*v.party*(Math.floor(n/2)+1),y:0}));let r=e.groups.map(e=>{let t=e.sections.map(e=>{let t=e.id!==void 0,n=C(e.members.length,t?b:y),r=Math.max(1,Math.ceil(e.members.length/n));return{cols:n,rows:r,role:t,w:(t?v.role+v.w/2:0)+n*v.w,h:r*(t?v.roleRow:v.h)}});return{group:e,sections:t,w:Math.max((e.kind===`team`?S:x)-2*v.pad,...t.map(e=>e.w))+2*v.pad,h:v.header+t.reduce((e,t)=>e+t.h,0)+v.pad}}),i=r.reduce((e,t)=>e+(t.w+v.gap)*(t.h+v.gap),0),a=Math.max(...r.map(e=>e.w),Math.sqrt(i)*1.5,1),o=[],s=[],c=0;for(let e of r)s.length&&c+v.gap+e.w>a&&(o.push(s),s=[],c=0),c+=(s.length?v.gap:0)+e.w,s.push(e);s.length&&o.push(s);let l=[],u=v.band;for(let e of o){let r=-(e.reduce((e,t)=>e+t.w,0)+v.gap*(e.length-1))/2;for(let i of e){let{group:e}=i,a=[],o=u+v.header;e.sections.forEach((e,s)=>{let c=i.sections[s],l={x:r+v.pad,y:o,w:i.w-2*v.pad,h:c.h};a.push({...l,...e.id===void 0?{}:{id:e.id},...e.label===void 0?{}:{label:e.label},...e.entry===void 0?{}:{entry:e.entry}});let u=c.role?v.roleRow:v.h;e.id!==void 0&&n.has(e.id)&&t.set(e.id,{x:l.x+v.role/2,y:o+u/2});let d=l.x+(c.role?v.role+s%2*(v.w/2):0);e.members.forEach((e,n)=>t.set(e,{x:d+n%c.cols*v.w+v.w/2,y:o+Math.floor(n/c.cols)*u+u/2})),o+=c.h}),n.has(e.id)&&t.set(e.id,{x:r+v.pad+12,y:u+v.header/2}),l.push({id:e.id,label:e.label,kind:e.kind,x:r,y:u,w:i.w,h:i.h,...e.machine===void 0?{}:{machine:e.machine},...e.online===void 0?{}:{online:e.online},...e.mode===void 0?{}:{mode:e.mode},...e.paused===void 0?{}:{paused:e.paused},...e.entryRole===void 0?{}:{entryRole:e.entryRole},members:e.sections.reduce((e,t)=>e+t.members.length,0),sections:a}),r+=i.w+v.gap}u+=Math.max(...e.map(e=>e.h))+v.gap}let d=e.nodes.filter(e=>!t.has(e.id));d.forEach((e,n)=>t.set(e.id,{x:(n-(d.length-1)/2)*v.w,y:u+v.h/2}));let f=[],p=[];for(let e of t.values())f.push(e.x-v.w/2,e.x+v.w/2),p.push(e.y-v.h/2,e.y+v.h/2);for(let e of l)f.push(e.x,e.x+e.w),p.push(e.y,e.y+e.h);let m=Math.min(...f)-40,h=Math.min(...p)-40;return{positions:t,boxes:l,bounds:{x:m,y:h,w:Math.max(...f)+40-m,h:Math.max(...p)+40-h}}}function te(e,t,n,r){let i=Math.max(1,t.width-n.left-n.right),a=Math.max(1,t.height-n.top-n.bottom),o=Math.max(r.min,Math.min(r.max,Math.min(i/Math.max(1,e.w),a/Math.max(1,e.h))));return{k:o,x:n.left+i/2-(e.x+e.w/2)*o,y:n.top+a/2-(e.y+e.h/2)*o}}function ne(e,t,n){let r=t===void 0?void 0:e.get(t);if(!r)return e.keys().next().value;let i,a=1/0;for(let[o,s]of e){if(o===t)continue;let e=s.x-r.x,c=s.y-r.y,[l,u]=n===`right`?[e,c]:n===`left`?[-e,c]:n===`down`?[c,e]:[-c,e];if(l<=0||Math.abs(u)>l*2)continue;let d=l+2*Math.abs(u);d<a&&(a=d,i=o)}return i??t}var re={glow:!0,pulses:!0,labels:12},w=.04,ie=4,ae=.55,oe=9.5,T={w:180,h:120},E=`system-ui, -apple-system, sans-serif`,se=e=>e.kind===`hub`?22:e.kind===`role`?13:Math.max(8,Math.min(20,e.size*1.9)),D=e=>e.kind===`hub`||e.kind===`role`?13:e.kind===`aggregate`?se(e)*.8:e.kind===`session`?Math.max(5,Math.min(11,3+e.size)):8,ce=(e,t)=>e.length>t?`${e.slice(0,t-1)}…`:e;function le(e){let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)|0;return(t>>>0)%1e3/1e3}function ue(e,t){return e.kind===`hub`?t(`--accent`):e.kind===`user`||e.kind===`app`?t(`--text`):e.kind===`team`||e.kind===`role`?t(`--violet`):e.kind===`cluster`?t(`--muted`):e.machine===void 0?t(`--faint`):t(n[e.machine%n.length])}function de(e,t,n,r){e.beginPath(),e.roundRect(t-v.role/2+8,n-r,v.role-16,r*2,r)}function fe(e,t,n){let r=t.x-e.x,i=t.y-e.y,a={x:(e.x+t.x)/2-i*n,y:(e.y+t.y)/2+r*n};return{c:a,mid:{x:.25*e.x+.5*a.x+.25*t.x,y:.25*e.y+.5*a.y+.25*t.y}}}var pe=e=>e.kind===`structure`?e.bridge?.18:0:e.kind===`policy`?.22:e.kind===`denied`?-.22:.1;function me(e,t,n,r,i,a,o){let s=Math.atan2(n.y-t.y,n.x-t.x);e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(n.x-r*Math.cos(s-.45),n.y-r*Math.sin(s-.45)),e.lineTo(n.x-r*Math.cos(s+.45),n.y-r*Math.sin(s+.45)),e.closePath(),e.setLineDash([]),e.fillStyle=i?o:a,e.fill(),e.strokeStyle=a,e.lineWidth=1.4,e.stroke()}function he(e,t,n){let r=Math.hypot(e.x-t.x,e.y-t.y)||1;return{x:e.x-(e.x-t.x)/r*n,y:e.y-(e.y-t.y)/r*n}}function ge(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=r||i?Math.max(0,Math.min(1,((e.x-t.x)*r+(e.y-t.y)*i)/(r*r+i*i))):0;return Math.hypot(e.x-(t.x+a*r),e.y-(t.y+a*i))}function O(n,y){let b=document.createElement(`canvas`);b.className=`wt-canvas2d`;let x=b.getContext(`2d`);if(!x)throw Error(`This browser can't draw on a canvas`);let S=document.createElement(`canvas`);S.className=`wt-minimap`,S.setAttribute(`aria-hidden`,`true`),S.title=`Minimap: click to move the view`;let C=S.getContext(`2d`),O=document.createElement(`span`);O.className=`wt-tip wt-tip2d`,O.hidden=!0,n.append(b,S,O);let k,A,j=()=>`#888`,_e=!0,M,N,P,ve,F=n.clientWidth||300,I=n.clientHeight||150,L={k:1,x:F/2,y:80},R=!1,z=0,ye=0,be={s:1,ox:0,oy:0},B=new Map,xe=new Set,V=re,H=!1,U=!1,Se=0,Ce=0,we=new Map,Te=new Set,Ee=new Map,De=new Map,Oe=0,ke=!1,Ae=()=>window.devicePixelRatio||1,je=e=>({x:e.x*L.k+L.x,y:e.y*L.k+L.y}),W=(e,t)=>({x:(e-L.x)/L.k,y:(t-L.y)/L.k}),G=(e,t)=>{let n=b.getBoundingClientRect();return{x:e-n.left,y:t-n.top}},K=()=>{Ne=!0,z||=requestAnimationFrame(Qe)},q=document.createElement(`canvas`),Me=q.getContext(`2d`),J=x,Ne=!0,Pe=``,Y=(e,t)=>{cancelAnimationFrame(ye);let n={...e,k:Math.max(w,Math.min(ie,e.k))};if(!t||!_e){L=n,K();return}let r=L,i=performance.now(),a=e=>{let t=Math.min(1,(e-i)/260),o=1-(1-t)**3;L={k:r.k+(n.k-r.k)*o,x:r.x+(n.x-r.x)*o,y:r.y+(n.y-r.y)*o},Qe(),t<1&&(ye=requestAnimationFrame(a))};ye=requestAnimationFrame(a)},Fe=e=>{if(!A)return;let t=A.positions.get(`hub`);Y(U&&t?{k:1.3,x:F/2-t.x*1.3,y:I/2-t.y*1.3}:te(A.bounds,{width:F,height:I},_(n),{min:w,max:1.4}),e)},Ie=(e,t,n,r=!1)=>{let i=Math.max(w,Math.min(ie,L.k*n)),a=W(e,t);R=!0,Y({k:i,x:e-a.x*i,y:t-a.y*i},r)},Le=(e,t,n=L.k)=>Y({k:n,x:F/2-e.x*n,y:I/2-e.y*n},t);function Re(e){let t=J,n=e.kind===`team`,r=n&&e.mode===`restricted`,i=j(we.get(e.id)??`--line-2`);t.save(),t.beginPath(),t.roundRect(e.x,e.y,e.w,e.h,22),V.glow&&(t.shadowColor=u(i,H?.35:.22),t.shadowBlur=36*L.k),t.fillStyle=u(i,H?.075:.06),t.fill(),t.shadowBlur=0,t.lineWidth=n?1.6:1,t.setLineDash(r?[8,5]:e.online===!1?[4,4]:[]),t.strokeStyle=u(i,n?.65:.4),t.stroke(),t.setLineDash([]),e.sections.forEach((e,n)=>{e.entry&&(t.fillStyle=u(j(`--accent`),.09),t.beginPath(),t.roundRect(e.x,e.y+2,e.w,e.h-4,10),t.fill()),n>0&&e.id!==void 0&&(t.strokeStyle=u(i,.18),t.lineWidth=1,t.beginPath(),t.moveTo(e.x+10,e.y),t.lineTo(e.x+e.w-10,e.y),t.stroke())}),t.beginPath(),t.rect(e.x,e.y,e.w-8,v.header),t.clip();let a=e.x+v.pad+(xe.has(e.id)?30:4),o=e.y+v.header/2,s=ce(e.label,28);t.fillStyle=j(`--text`),t.font=`650 13px ${E}`,t.textBaseline=`middle`,t.fillText(s,a,o);let c=k?.teams.find(t=>t.id===e.id)?.members??e.members,l=n?`${r?`Restricted: declared paths only`:`Open: everyone may message everyone`}${e.paused?` · paused`:``} · ${c} seated`:`${e.members} ${e.members===1?`node`:`nodes`}${e.online===!1?` · offline`:``}`;t.fillStyle=j(`--muted`),t.font=`12px ${E}`,t.fillText(l,a+t.measureText(s).width+18,o),t.restore()}function ze(e,n){let r=n.get(e.source),i=n.get(e.target);if(!r||!i||e.kind===`structure`&&e.structure!==`tree`&&e.structure!==`party`&&e.structure!==`seat`&&!e.bridge)return;let a=J,o=B.get(e.source),s=B.get(e.target),{c,mid:l}=fe(r,i,pe(e)),d=e.kind===`structure`,f=d&&e.structure===`seat`,p=j(d?e.bridge||f?`--violet`:`--line-2`:t(e.kind)),m=qe(),h=!m||e.source===m||e.target===m;a.save(),a.globalAlpha=(o?.dim&&s?.dim?.15:1)*(h?1:.2),a.setLineDash(d?e.bridge?[3,4]:[]:e.style===`dotted`?[1.5,4.5]:e.style===`dashed`?[7,4]:[]),a.lineCap=`round`;let g=d?i:he(i,c,(s?D(s):0)+6),_=e.kind===`policy`&&e.twoWay?he(r,c,(o?D(o):0)+6):f&&o?.kind===`role`?{x:r.x+v.role/2-8,y:r.y}:r,y=()=>{a.beginPath(),a.moveTo(_.x,_.y),a.quadraticCurveTo(c.x,c.y,g.x,g.y)};if(d){a.strokeStyle=u(p,e.bridge?.8:f?.6:.55),a.lineWidth=e.bridge?1.4:f?1.5:1,y(),a.stroke(),a.restore();return}let b=k&&k.links.length>120?.55:1,x=e.kind===`policy`?.6:e.kind===`denied`?.85:Math.min(.95,.45+e.width*.09)*b,S=e.kind===`policy`?1.6:Math.max(1.1,e.width*.75);V.glow&&e.kind!==`policy`&&(a.strokeStyle=u(p,(H?.16:.1)*x),a.lineWidth=S*4,y(),a.stroke());let C=a.createLinearGradient(_.x,_.y,g.x,g.y);C.addColorStop(0,u(p,x*.35)),C.addColorStop(1,u(p,x)),a.strokeStyle=C,a.lineWidth=S,y(),a.stroke();let ee=j(`--bg`),te=e.kind===`policy`?10:6+Math.min(3,e.width);me(a,c,g,te,e.kind===`policy`,u(p,Math.max(.7,x)),ee),e.kind===`policy`&&e.twoWay&&me(a,c,_,te,!0,p,ee),a.textBaseline=`middle`,e.kind===`denied`?(a.setLineDash([]),a.strokeStyle=p,a.lineWidth=2.2,a.beginPath(),a.moveTo(l.x-5,l.y-5),a.lineTo(l.x+5,l.y+5),a.moveTo(l.x+5,l.y-5),a.lineTo(l.x-5,l.y+5),a.stroke(),a.fillStyle=p,a.font=`600 11px ${E}`,a.fillText(`${e.denied??e.count} denied`,l.x+9,l.y)):e.kind===`policy`&&L.k>=.7&&e.kinds?.length&&(a.fillStyle=j(`--muted`),a.font=`11px ${E}`,a.fillText(`${e.twoWay?`⇄`:`→`} ${e.kinds.join(`, `)}`,l.x+6,l.y)),a.restore()}function Be(e,n){if(!_e||!V.pulses||!k)return 0;let i=J,a=Se+(Date.now()-Ce),o=0;i.save(),H&&(i.globalCompositeOperation=`lighter`);for(let s of k.links){if(s.kind===`structure`||s.kind===`policy`||s.kind===`denied`)continue;let c=r(s,a);if(P!==void 0&&(s.source===P||s.target===P)&&(c=Math.max(c,.55)),c<=0)continue;let u=e.get(s.source),d=e.get(s.target);if(!u||!d)continue;let{c:f}=fe(u,d,pe(s)),p=B.get(s.target),m=he(d,f,(p?D(p):0)+6),h=Math.min(4,1+Math.floor(Math.log2(Math.max(1,s.count)))),g=Math.max(1,Math.round(c*h)),_=.16+.34*c,v=le(s.id),y=j(t(s.kind));for(let e=0;e<g;e++){o++;let t=(v+e/g+n*_)%1,r=(1-t)**2*u.x+2*(1-t)*t*f.x+t*t*m.x,a=(1-t)**2*u.y+2*(1-t)*t*f.y+t*t*m.y;l(i,r,a,9,y,(.35+.65*c)*(H?.9:.6)),i.fillStyle=H?`#ffffff`:y,i.globalAlpha=.5+.5*c,i.beginPath(),i.arc(r,a,2.2,0,Math.PI*2),i.fill(),i.globalAlpha=1}}return i.restore(),o}function Ve(e,t,n,r){if(!e.ring||a[e.ring]===`none`)return;let i=J,s=a[e.ring];i.strokeStyle=j(o[e.ring]),i.setLineDash(s===`broken`?[4,3]:[]),i.lineWidth=s===`thick`?3:s===`thin`?1:1.8,i.beginPath(),i.arc(t,n,r+4,0,Math.PI*2),i.stroke(),s===`double`&&(i.lineWidth=1.1,i.beginPath(),i.arc(t,n,r+7,0,Math.PI*2),i.stroke()),i.setLineDash([])}function He(e,t){let n=J,r=D(e),i=!qe()||X.has(e.id);n.save(),n.globalAlpha=(e.dim?.25:1)*(i?1:.3);let a=ue(e,j);V.glow&&e.kind!==`role`&&l(n,t.x,t.y,r*(e.kind===`hub`?U?9:5:3.4),e.match?j(`--accent`):a,(H?.55:.32)*(e.dim?.4:1)*(e.id===P||e.id===M?1.5:1)),e.kind===`role`?(de(n,t.x,t.y,r),e.vacant||(n.fillStyle=u(a,e.entry?.22:.1),n.fill()),n.strokeStyle=u(a,e.entry?1:.7),n.lineWidth=e.entry?2.4:1.3,n.setLineDash(e.vacant?[4,3]:[]),n.stroke(),n.setLineDash([])):d(n,c(e),t.x,t.y,r,a,H?`#ffffff`:u(`#ffffff`,.9)),Ve(e,t.x,t.y,r),e.teams&&(n.strokeStyle=j(`--violet`),n.lineWidth=1.4,n.setLineDash([2,3]),n.beginPath(),n.arc(t.x,t.y,r+10,0,Math.PI*2),n.stroke(),n.setLineDash([]),n.fillStyle=j(`--violet`),n.font=`700 10px ${E}`,n.textBaseline=`middle`,n.fillText(`×${e.teams}`,t.x+r+6,t.y-r-6)),(e.id===M||e.id===N)&&(n.strokeStyle=j(`--accent`),n.lineWidth=e.id===M?2.5:2,n.setLineDash(e.id===M?[]:[5,3]),n.beginPath(),e.kind===`role`?n.roundRect(t.x-v.role/2+4,t.y-r-4,v.role-8,r*2+8,r+4):n.arc(t.x,t.y,r+(e.teams?14:9),0,Math.PI*2),n.stroke(),n.setLineDash([])),n.textAlign=`center`,n.textBaseline=`middle`,e.kind===`role`?(n.fillStyle=j(e.vacant?`--muted`:`--text`),n.font=`${e.entry?700:500} ${e.vacant?11:12}px ${E}`,n.fillText(ce(`${e.entry?`★ `:``}${f(e)}`,16),t.x,t.y)):e.kind===`aggregate`?(n.fillStyle=j(`--text`),n.font=`600 11px ${E}`,n.fillText(String(e.folded??``),t.x,t.y)):e.folded&&e.kind===`session`&&(n.fillStyle=j(`--bg`),n.font=`700 9px ${E}`,n.fillText(`+${e.folded}`,t.x,t.y));let o=De.get(e.id);if(o){let r=Ue(e);n.globalAlpha=e.dim?.6:i?1:.5,n.fillStyle=j(e.dim?`--faint`:e.kind===`session`?`--muted`:`--text`),n.font=We(e,r),n.lineWidth=r/11*3,n.strokeStyle=u(j(`--bg`),.85);let a=o.box.y+o.box.h/2;n.strokeText(o.text,t.x,a),n.fillText(o.text,t.x,a)}n.restore()}let Ue=e=>(e.kind===`hub`?13:11)*Math.max(1,Math.min(1.5,oe/11/L.k)),We=(e,t)=>`${e.kind===`hub`?700:500} ${t}px ${E}`;function Ge(e){if(!k||!A)return new Map;let t=[];for(let e of k.nodes){if(e.kind===`role`||e.kind===`aggregate`||xe.has(e.id))continue;let n=A.positions.get(e.id);if(!n)continue;let r=e.kind!==`session`||e.match||e.id===M||e.id===N||e.id===P;if(!r&&!(L.k>=1||L.k>=ae&&Te.has(e.id)))continue;let i=Ue(e),a=ce(e.label,14),o=ce(e.label,9);t.push({id:e.id,x:n.x,y:n.y+D(e)+(e.ring?16:13)*(i/11)-i*.65,h:i*1.3,texts:r||o===a?[a]:[a,o],pinned:r,rank:(Te.has(e.id)?1e6:0)+(Ee.get(e.id)??0),font:We(e,i)})}return t.sort((e,t)=>t.rank-e.rank||(e.id<t.id?-1:+(e.id>t.id))),g(t,(t,n)=>(e.font!==n.font&&(e.font=n.font),e.measureText(t).width+4))}let X=new Set,Ke;function qe(){let e=P??M;if(e!==Ke&&(Ke=e,X=new Set(e===void 0?[]:[e]),e!==void 0&&k))for(let t of k.links)t.source===e&&X.add(t.target),t.target===e&&X.add(t.source);return e!==void 0&&B.has(e)?e:void 0}function Je(){let e=J;e.save();let t=11,n=()=>((t=t*16807%2147483647)-1)/2147483646;e.fillStyle=j(`--accent`);for(let t=0;t<260;t++){let t=n()*Math.PI*2,r=60+n()**.7*900;e.globalAlpha=(H?.35:.22)*(1-r/1e3),e.beginPath(),e.arc(Math.cos(t)*r,Math.sin(t)*r*.6,.8+n()*1.6,0,Math.PI*2),e.fill()}e.restore()}function Ye(){if(!A)return;let e=Ae();S.width!==T.w*e&&(S.width=T.w*e,S.height=T.h*e);let t=C;t.setTransform(e,0,0,e,0,0),t.clearRect(0,0,T.w,T.h),t.globalAlpha=.92,t.fillStyle=j(`--raise`),t.fillRect(0,0,T.w,T.h),t.globalAlpha=1;let n=A.bounds,r=Math.min(T.w/n.w,T.h/n.h),i=(T.w-n.w*r)/2-n.x*r,a=(T.h-n.h*r)/2-n.y*r;t.strokeStyle=j(`--line-2`),t.lineWidth=1;for(let e of A.boxes)t.strokeRect(e.x*r+i,e.y*r+a,e.w*r,e.h*r);for(let[e,n]of A.positions){let o=B.get(e);if(!o)continue;let s=o.kind===`hub`?4:2;t.fillStyle=o.match?j(`--accent`):ue(o,j),t.fillRect(n.x*r+i-s/2,n.y*r+a-s/2,s,s)}let o=W(0,0);t.strokeStyle=j(`--accent`),t.lineWidth=1.5,t.strokeRect(o.x*r+i,o.y*r+a,F/L.k*r,I/L.k*r),be={s:r,ox:i,oy:a}}function Xe(){let e=Me,t=Ae();if((q.width!==b.width||q.height!==b.height)&&(q.width=b.width,q.height=b.height),e.setTransform(t,0,0,t,0,0),e.fillStyle=j(`--bg`),e.fillRect(0,0,F,I),k&&A){e.setTransform(t*L.k,0,0,t*L.k,t*L.x,t*L.y),J=e;try{U&&Je();for(let e of A.boxes)Re(e);let t=A.positions;for(let e of k.links)e.kind===`structure`&&ze(e,t);for(let e of k.links)e.kind!==`structure`&&ze(e,t);De=Ge(e),Ze();for(let e of k.nodes){let n=t.get(e.id);n&&He(e,n)}}finally{J=x}}}function Ze(){if(!A)return;let e=A.bounds,t=e=>Math.round(e*10)/10;n.dataset.content=JSON.stringify({x:t(e.x*L.k+L.x),y:t(e.y*L.k+L.y),w:t(e.w*L.k),h:t(e.h*L.k)}),n.dataset.labelBoxes=JSON.stringify([...De.values()].map(({box:e})=>[t(e.x*L.k+L.x),t(e.y*L.k+L.y),t(e.w*L.k),t(e.h*L.k)]))}function Qe(){z=0;let e=performance.now(),t=x,r=`${L.k},${L.x},${L.y},${b.width},${b.height}`;if((Ne||r!==Pe)&&(Xe(),Ye(),Ne=!1,Pe=r),t.setTransform(1,0,0,1,0,0),t.drawImage(q,0,0),!k||!A)return;let i=Ae();t.setTransform(i*L.k,0,0,i*L.k,i*L.x,i*L.y),Oe=Be(A.positions,performance.now()/1e3),ve&&(t.save(),ve(t,L),t.restore()),n.dataset.zoom=L.k.toFixed(3),n.dataset.pulses=String(Oe),n.dataset.drawMs=(performance.now()-e).toFixed(1),ke=Oe>0&&!document.hidden,n.dataset.animating=String(ke),ke&&!z&&(z=requestAnimationFrame(Qe))}function $e(e,t){if(!k||!A)return;let n=W(e,t),r;for(let e of k.nodes){let t=A.positions.get(e.id);if(!t)continue;let i=e.kind===`role`?Math.abs(n.x-t.x)<=v.role/2-8&&Math.abs(n.y-t.y)<=se(e)?-1:1/0:Math.hypot(n.x-t.x,n.y-t.y)-se(e)-3;i<=0&&(!r||i<r.d)&&(r={id:e.id,d:i})}if(r)return{type:`node`,id:r.id};let i=6/L.k,a;for(let e of k.links){if(e.kind===`structure`)continue;let t=A.positions.get(e.source),r=A.positions.get(e.target);if(!t||!r)continue;let{c:o}=fe(t,r,pe(e)),s=t;for(let c=1;c<=16;c++){let l=c/16,u={x:(1-l)**2*t.x+2*(1-l)*l*o.x+l*l*r.x,y:(1-l)**2*t.y+2*(1-l)*l*o.y+l*l*r.y},d=ge(n,s,u);d<=i&&(!a||d<a.d)&&(a={l:e,d}),s=u}}if(a)return{type:`link`,link:a.l};let o=A.boxes.find(e=>n.x>=e.x&&n.x<=e.x+e.w&&n.y>=e.y&&n.y<=e.y+e.h);return o?{type:`box`,id:o.id}:void 0}function et(t){let n=B.get(t);if(!n)return``;let r=[n.label];return n.kind===`role`&&r.push(n.entry?`entry role`:`role`,n.vacant?`vacant`:`${n.staffed??0} staffed`),n.seat&&r.push(`seat: ${n.seat}`),n.kind===`team`&&r.push(n.mode===`restricted`?`restricted team`:`open team`),n.kind===`machine`&&r.push(`machine`),n.ring&&r.push(e[n.ring]),n.teams&&r.push(`in ${n.teams} teams`),n.folded&&n.kind===`session`&&r.push(`+${n.folded} folded`),r.join(` · `)}function tt(e){let t=e=>B.get(e)?.label??e;return e.kind===`structure`?``:e.kind===`policy`?`Team path ${t(e.source)} ${e.twoWay?`⇄`:`→`} ${t(e.target)}${e.kinds?.length?` · ${e.kinds.join(`, `)}`:``}${e.count?` · ${e.count} sent along it`:``}`:e.kind===`denied`?`${e.denied??e.count} denied: ${t(e.source)} → ${t(e.target)}`:`${i(e.kind)} · ${t(e.source)} → ${t(e.target)} · ${e.count}`}let Z=new Map,Q,$;b.addEventListener(`pointerdown`,e=>{b.setPointerCapture?.(e.pointerId);let t=G(e.clientX,e.clientY);if(Z.set(e.pointerId,t),Z.size===2){let[e,t]=[...Z.values()];$={d:Math.hypot(e.x-t.x,e.y-t.y)||1,k:L.k,mid:{x:(e.x+t.x)/2,y:(e.y+t.y)/2}},Q=void 0}else Q={...t,t:L,moved:!1}}),b.addEventListener(`pointermove`,e=>{let t=G(e.clientX,e.clientY);if(Z.has(e.pointerId)&&Z.set(e.pointerId,t),$&&Z.size===2){let[e,t]=[...Z.values()],n=Math.max(w,Math.min(ie,$.k*(Math.hypot(e.x-t.x,e.y-t.y)||1)/$.d)),r=W($.mid.x,$.mid.y);R=!0,Y({k:n,x:$.mid.x-r.x*n,y:$.mid.y-r.y*n},!1);return}if(Q){!Q.moved&&Math.hypot(t.x-Q.x,t.y-Q.y)>4&&(Q.moved=!0),Q.moved&&(R=!0,O.hidden=!0,Y({k:Q.t.k,x:Q.t.x+t.x-Q.x,y:Q.t.y+t.y-Q.y},!1));return}let n=$e(t.x,t.y),r=n?.type===`node`?n.id:void 0;b.style.cursor=n&&n.type!==`box`?`pointer`:`grab`,r!==P&&(P=r,K());let i=n?.type===`node`?et(n.id):n?.type===`link`?tt(n.link):``;O.hidden=!i,i&&(O.textContent=i,O.style.left=`${Math.min(t.x+14,F-220)}px`,O.style.top=`${t.y+14}px`)}),b.addEventListener(`pointerup`,e=>{if(Z.delete(e.pointerId),Z.size<2&&($=void 0),!Q)return;let t=!Q.moved;if(Q=void 0,!t)return;let n=G(e.clientX,e.clientY),r=$e(n.x,n.y);r?.type===`node`?(N=r.id,y.onNode(r.id)):r?.type===`link`?y.onLink(r.link):y.onBackground(),K()}),b.addEventListener(`pointercancel`,e=>{Z.delete(e.pointerId),Q=void 0,$=void 0}),b.addEventListener(`pointerleave`,()=>{O.hidden=!0,P!==void 0&&(P=void 0,K())}),b.addEventListener(`wheel`,e=>{e.preventDefault();let t=G(e.clientX,e.clientY);Ie(t.x,t.y,Math.exp(-e.deltaY*(e.ctrlKey?.01:.0015)))},{passive:!1}),b.addEventListener(`dblclick`,e=>{let t=G(e.clientX,e.clientY);Ie(t.x,t.y,2,!0)});let nt=e=>{let t=S.getBoundingClientRect(),{s:n,ox:r,oy:i}=be;R=!0,Le({x:(e.clientX-t.left-r)/n,y:(e.clientY-t.top-i)/n},!1)};S.addEventListener(`pointerdown`,e=>{S.setPointerCapture?.(e.pointerId),nt(e)}),S.addEventListener(`pointermove`,e=>{S.hasPointerCapture?.(e.pointerId)&&nt(e)});let rt=e=>{let t=et(e);y.announce(t?`${t}. Enter opens it.`:``)},it=e=>{let t=A?.positions.get(e);if(!t)return;let n=je(t);(n.x<40||n.y<40||n.x>F-40||n.y>I-40)&&Le(t,!0,Math.max(L.k,.7))},at=e=>{N=e,e&&(it(e),rt(e)),K()},ot=e=>{if(e.target!==n||!A)return;let t={ArrowLeft:`left`,ArrowRight:`right`,ArrowUp:`up`,ArrowDown:`down`}[e.key];t&&e.shiftKey?(e.preventDefault(),R=!0,Y({...L,x:L.x+(t===`left`?80:t===`right`?-80:0),y:L.y+(t===`up`?80:t===`down`?-80:0)},!1)):t?(e.preventDefault(),at(ne(A.positions,N??`hub`,t))):(e.key===`Enter`||e.key===` `)&&N?(e.preventDefault(),y.onNode(N)):e.key===`Home`?(e.preventDefault(),at(`hub`)):e.key===`+`||e.key===`=`||e.key===`-`||e.key===`_`?(e.preventDefault(),Ie(F/2,I/2,e.key===`+`||e.key===`=`?1.25:.8,!0)):e.key===`0`&&(e.preventDefault(),R=!1,Fe(!0))},st=()=>{N===void 0&&(N=M!==void 0&&B.has(M)?M:`hub`),rt(N),K()};n.addEventListener(`keydown`,ot),n.addEventListener(`focus`,st);let ct=()=>document.visibilityState===`visible`&&K();return document.addEventListener(`visibilitychange`,ct),{update(e,t,r){k=e,j=t,_e=r.motion,M=r.selected,V={...re,...r.look},H=s(j(`--bg`)),Se=e.now,Ce=Date.now(),U=!e.nodes.some(e=>e.kind===`session`||e.kind===`aggregate`);let i=p(e);we=new Map(i.map(e=>[e.id,e.color])),Te=m(e,{max:V.labels}),Ee=h(e),Ke=`\0`,B.clear();for(let t of e.nodes)B.set(t.id,t);A=ee(e),xe.clear();for(let e of A.boxes)B.has(e.id)&&xe.add(e.id);N!==void 0&&!B.has(N)&&(N=void 0);let a=n.dataset;a.nodes=String(e.nodes.length),a.boxes=String(A.boxes.length),a.teams=String(A.boxes.filter(e=>e.kind===`team`).length),a.policy=String(e.links.filter(e=>e.kind===`policy`).length),a.twoWay=String(e.links.filter(e=>e.kind===`policy`&&e.twoWay).length),a.denied=String(e.links.filter(e=>e.kind===`denied`).length),a.bridges=String(e.links.filter(e=>e.bridge).length),a.tethers=String(e.links.filter(e=>e.structure===`seat`&&!e.bridge).length),a.vacant=String(e.nodes.filter(e=>e.kind===`role`&&e.vacant).length),a.selected=M??``,a.regions=String(i.length),a.empty=String(U),R||Fe(!1),K()},focus(e,t){let n=A?.positions.get(e);n&&(N=e,R=!0,Le(n,t,Math.max(L.k,1)),K())},reset(e){R=!1,Fe(e)},resize(e,t){F=Math.max(1,e),I=Math.max(1,t);let n=Ae();b.width=Math.round(F*n),b.height=Math.round(I*n),b.style.width=`${F}px`,b.style.height=`${I}px`,R||Fe(!1),K()},destroy(){cancelAnimationFrame(z),cancelAnimationFrame(ye),n.removeEventListener(`keydown`,ot),n.removeEventListener(`focus`,st),document.removeEventListener(`visibilitychange`,ct),n.replaceChildren()},hitTest(e,t){let n=G(e,t);return $e(n.x,n.y)},toWorld(e,t){let n=G(e,t);return W(n.x,n.y)},setOverlay(e){ve=e,K()},layout:()=>A}}export{O as createRenderer2D};
|