@huynle/hub 0.10.1 → 0.11.1

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