@huynle/hub 0.11.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +19 -5
  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 +240 -83
  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/mcp.ts +20 -4
  12. package/packages/cli/src/team-intake-mcp.ts +2 -1
  13. package/packages/cli/src/teams-mcp.ts +7 -3
  14. package/packages/codex/package.json +1 -1
  15. package/packages/codex/src/sessions.ts +14 -3
  16. package/packages/node/package.json +1 -1
  17. package/packages/preset/package.json +1 -1
  18. package/packages/protocol/package.json +1 -1
  19. package/packages/protocol/schema/api/v1/_root.json +119 -0
  20. package/packages/protocol/schema/api/v1/account.json +419 -0
  21. package/packages/protocol/schema/api/v1/decisions.json +635 -0
  22. package/packages/protocol/schema/api/v1/discovery.json +110 -0
  23. package/packages/protocol/schema/api/v1/events.json +679 -0
  24. package/packages/protocol/schema/api/v1/session-actions.json +660 -0
  25. package/packages/protocol/schema/api/v1/sessions.json +2055 -0
  26. package/packages/protocol/schema/api/v1/speech.json +492 -0
  27. package/packages/protocol/schema/api/v1/unspecified.json +282 -0
  28. package/packages/protocol/schema/app-delivery/v1.schema.json +67 -5
  29. package/packages/protocol/schema/app-front/v1.schema.json +7 -3
  30. package/packages/protocol/src/api-v1.ts +8 -0
  31. package/packages/protocol/src/index.ts +2 -0
  32. package/packages/protocol/src/teams.ts +13 -1
  33. package/packages/runtime-openshell/package.json +1 -1
  34. package/packages/runtime-sdk/package.json +1 -1
  35. package/packages/sdk/package.json +1 -1
  36. package/packages/sdk/src/app-front.ts +2 -2
  37. package/packages/sdk/src/ask-fields.ts +76 -0
  38. package/packages/sdk/src/client.ts +11 -2
  39. package/packages/sdk/src/envelope.ts +3 -2
  40. package/packages/sdk/src/index.ts +1 -0
  41. package/packages/sdk/src/team-intake.ts +6 -0
  42. package/packages/sdk/src/teams.ts +2 -0
  43. package/packages/sdk/src/types.ts +36 -4
  44. package/packages/sdk/src/wake.ts +9 -4
  45. package/packages/spoke-sdk/package.json +1 -1
  46. package/src/central/agent/agent-limits.ts +185 -0
  47. package/src/central/agent/app-decisions.ts +6 -5
  48. package/src/central/agent/decisions.ts +130 -9
  49. package/src/central/agent/delivery.ts +134 -22
  50. package/src/central/agent/errors.ts +2 -1
  51. package/src/central/agent/events.ts +20 -2
  52. package/src/central/agent/launch-engine.ts +6 -3
  53. package/src/central/agent/message-limits.ts +5 -2
  54. package/src/central/agent/message-routes.ts +33 -6
  55. package/src/central/agent/messages.ts +7 -0
  56. package/src/central/agent/placement.ts +4 -2
  57. package/src/central/agent/read-routes.ts +5 -0
  58. package/src/central/agent/routes.ts +2 -0
  59. package/src/central/agent/subscriptions.ts +13 -4
  60. package/src/central/api-v1.ts +115 -0
  61. package/src/central/artifacts/store.ts +4 -2
  62. package/src/central/concierge/board-results.ts +2 -1
  63. package/src/central/concierge/notifier.ts +4 -2
  64. package/src/central/config.ts +20 -6
  65. package/src/central/health/classify.ts +209 -0
  66. package/src/central/http.ts +285 -23
  67. package/src/central/recording/index.ts +2 -1
  68. package/src/central/recording/schema.ts +2 -1
  69. package/src/central/registry.ts +34 -3
  70. package/src/central/teams/budgets.ts +144 -0
  71. package/src/central/teams/hop-stalls.ts +14 -6
  72. package/src/central/teams/intake.ts +38 -6
  73. package/src/central/teams/involvement.ts +95 -0
  74. package/src/central/teams/item-decisions.ts +60 -0
  75. package/src/central/teams/item-eligibility.ts +35 -0
  76. package/src/central/teams/item-stalls.ts +87 -0
  77. package/src/central/teams/loops.ts +40 -0
  78. package/src/central/teams/progress.ts +154 -0
  79. package/src/central/teams/routes.ts +2 -2
  80. package/src/central/teams/store.ts +21 -5
  81. package/src/central/teams/validation.ts +17 -6
  82. package/src/central/workspaces/coordinator.ts +3 -1
  83. package/src/spoke/hub-tool.ts +26 -11
  84. package/web/dist/assets/{ArtifactPage-C5MMqXLN.js → ArtifactPage-TbFJi59n.js} +1 -1
  85. package/web/dist/assets/{ArtifactPane-CXSCmhyJ.js → ArtifactPane-7D-M-Ich.js} +1 -1
  86. package/web/dist/assets/{ArtifactWorkbench-S0RxNGWy.js → ArtifactWorkbench-DlCLEjut.js} +1 -1
  87. package/web/dist/assets/{Diagram-BGmyRb-R.js → Diagram-PvOPetOI.js} +1 -1
  88. package/web/dist/assets/{Library-CFmMbXEa.js → Library-Cdi83pOV.js} +2 -2
  89. package/web/dist/assets/{ProfilesDestination-7jpOc2HM.js → ProfilesDestination-cryC7P6j.js} +1 -1
  90. package/web/dist/assets/TeamsPage-B4xrlGhp.js +1 -0
  91. package/web/dist/assets/Watchtower-60B1JX_J.js +2 -0
  92. package/web/dist/assets/index-DA0gKIzv.js +33 -0
  93. package/web/dist/assets/live-B2IfKm37.js +5 -0
  94. package/web/dist/assets/{live-BUofsQpz.css → live-De-kd3eW.css} +1 -1
  95. package/web/dist/assets/{renderer2d-B2Nh39UN.js → renderer2d-CsZnF3_o.js} +1 -1
  96. package/web/dist/assets/{renderer3d-CTYbljHH.js → renderer3d-BIMA0wFn.js} +2 -2
  97. package/web/dist/assets/{safe-area-CkhEclGo.js → safe-area-dtrnw9NF.js} +1 -1
  98. package/web/dist/index.html +1 -1
  99. package/web/dist/assets/TeamsPage-C1NGrUR-.js +0 -1
  100. package/web/dist/assets/Watchtower-DnvlJaU0.js +0 -2
  101. package/web/dist/assets/index-Da8SKXMw.js +0 -33
  102. package/web/dist/assets/live-BmqLASSo.js +0 -5
@@ -1,5 +0,0 @@
1
- import{$ as e,A as t,B as n,C as r,D as i,G as a,I as o,J as s,N as c,Q as l,S as u,T as d,U as f,W as p,b as m,et as h,k as g,t as _,tt as v,u as y,x as b,y as x}from"./ui-CFB4wQfF.js";import{B as S,F as C,L as w,M as T,N as E,P as D,R as O,U as k,V as A,j,k as M,l as ee,s as te,z as ne}from"./toast-q818mjUF.js";import{t as re}from"./plural-Bspvoqfq.js";import{O as N,at as P,ot as F}from"./index-Da8SKXMw.js";var I={teamsPerUser:100,rolesPerTeam:32,edgesPerTeam:256,sessionsPerRole:16,openIntakePerTeam:500,hopLimit:100};function L(e){if(!w(e))return`body must be an object`;if(!T(e.name))return`name must be 2–40 lowercase letters, digits or dashes`;if(!j(e.title))return`title must be 1–120 characters of text`;if(e.description!==void 0&&!E(e.description,4e3))return`description must be at most ${M} characters`;if(e.mode!==`open`&&e.mode!==`restricted`)return`mode must be open or restricted`;if(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(!w(n)||!T(n.name))return`each role needs a slug name`;if(t.has(n.name))return`role ${n.name} is listed twice`;if(t.add(n.name),n.label!==void 0&&!j(n.label))return`role ${n.name} label must be 1–120 characters`;if(n.externalContact!==void 0&&typeof n.externalContact!=`boolean`)return`role ${n.name} externalContact must be true or false`}if(typeof e.entryRole!=`string`||!t.has(e.entryRole))return`entryRole must name one of the roles`;let n=e.edges??[];if(!Array.isArray(n)||n.length>I.edgesPerTeam)return`edges must be a list of at most ${I.edgesPerTeam}`;for(let e of n){if(!w(e)||typeof e.from!=`string`||typeof e.to!=`string`||!t.has(e.from)||!t.has(e.to))return`each edge must connect two listed roles`;if(e.from===e.to)return`an edge must connect two different roles`;if(!Array.isArray(e.kinds)||e.kinds.length===0||!e.kinds.every(e=>e===`msg`||e===`ask`))return`edge kinds must be msg and/or ask`;if(e.direction!==`one-way`&&e.direction!==`two-way`)return`edge direction must be one-way or two-way`}return C(e.tags)??D(e.metadata)}var R=e=>typeof e==`object`&&!!e&&!Array.isArray(e),z=e=>typeof e==`string`&&e.length>0?e:void 0,B=e=>typeof e==`number`&&Number.isFinite(e)?e:void 0,V=e=>Array.isArray(e)?e.filter(e=>typeof e==`string`):[],ie=/^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$/,H=e=>({ok:!1,error:e}),U=e=>({ok:!0,spec:e});function ae(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 oe(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 se(e){if(!R(e)||!z(e.name)||typeof e.title!=`string`||!Array.isArray(e.roles))return;let t=R(e.metadata)?Object.fromEntries(Object.entries(e.metadata).filter(([,e])=>typeof e==`string`)):void 0;return{name:e.name,title:e.title,...z(e.description)?{description:e.description}:{},mode:e.mode===`open`?`open`:`restricted`,roles:e.roles.map(ae).filter(e=>!!e),entryRole:typeof e.entryRole==`string`?e.entryRole:``,edges:Array.isArray(e.edges)?e.edges.map(oe).filter(e=>!!e):[],...Array.isArray(e.tags)?{tags:V(e.tags)}:{},...t?{metadata:t}:{},...Array.isArray(e.projects)?{projects:V(e.projects)}:{}}}function ce(e){if(!R(e)||!R(e.team))return;let t=e.team,n=se(t);if(!z(t.id)||!n||B(t.revision)===void 0)return;let r=R(e.draft)?se(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 le=(e,t)=>e.roles.some(e=>e.name===t);function ue(e,t,n){let r=t.trim();if(!ie.test(r))return H(`A role name is 2–40 lowercase letters, digits or dashes`);if(le(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 de(e,t){return le(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 fe(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 pe(e,t){return le(e,t)?U({...e,entryRole:t}):H(`There is no role ${t}`)}function me(e,t){if(!le(e,t.from)||!le(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 he(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 ge=(e,t)=>U({...e,mode:t});function _e(e,t){let n={...e};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 ve=e=>(e.tags??[]).join(`, `),ye=e=>Object.entries(e.metadata??{}).map(([e,t])=>`${e}=${t}`).join(`
3
- `);function be(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 xe=e=>e.some(e=>e.level===`error`),Se=e=>({past:[],present:e,future:[]});function Ce(e,t){return JSON.stringify(t)===JSON.stringify(e.present)?e:{past:[...e.past,e.present].slice(-100),present:t,future:[]}}function we(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 Te(e){return e.future.length===0?e:{past:[...e.past,e.present],present:e.future[0],future:e.future.slice(1)}}function Ee(e,t){return{expectedRevision:t,title:e.title,description:e.description??null,mode:e.mode,hopLimit:e.hopLimit??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 De(e){let t=e.name.trim();if(!ie.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(!ie.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 Oe=e=>JSON.stringify(e,(e,t)=>R(t)?Object.fromEntries(Object.keys(t).sort().map(e=>[e,t[e]])):t);function ke(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)&&Oe(e.get(n))!==Oe(t.get(n)))}}function Ae(e,t){let n=[`title`,`description`,`mode`,`entryRole`,`hopLimit`].filter(n=>(e[n]??``)!==(t[n]??``)),r=e=>new Map(e.roles.map(e=>[e.name,e])),i=e=>new Map(e.edges.map(e=>[`${e.from}>${e.to}`,{...e,kinds:[...e.kinds].sort()}])),a=(e=[],t=[])=>({added:t.filter(t=>!e.includes(t)),removed:e.filter(e=>!t.includes(e))});return{fields:n,roles:ke(r(e),r(t)),edges:ke(i(e),i(t)),tags:a(e.tags,t.tags),metadata:ke(new Map(Object.entries(e.metadata??{})),new Map(Object.entries(t.metadata??{}))),projects:a(e.projects,t.projects)}}function je(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 Me={title:`title`,description:`description`,mode:`communication (open/restricted)`,entryRole:`entry role`,hopLimit:`hop limit`},Ne=e=>e.replace(`>`,` → `);function Pe(e){let t=[];e.fields.length&&t.push(`Changed: ${e.fields.map(e=>Me[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,Ne),n(`Paths removed`,e.edges.removed,Ne),n(`Paths changed`,e.edges.changed,Ne),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 Fe=e=>Pe(e).length===0;function Ie(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 Le(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 Re(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 ze(e,t){let n=`role:${t}:`;return e.startsWith(n)?e.slice(n.length):void 0}function Be(e,t,n){let r=ze(n,e);if(r===void 0)return;let i=ze(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 Ve(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&&!ie.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 He=[`low`,`normal`,`high`,`urgent`];function Ue(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=He.find(t=>t===e.priority);return{ok:!0,body:{title:t,...n?{brief:n}:{},...i&&i!==`normal`?{priority:i}:{},...r.length?{criteria:r}:{}}}}var We=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Ge=e=>typeof e==`string`&&e.length>0?e:void 0,Ke=e=>typeof e==`number`&&Number.isFinite(e)?e:void 0,qe=[`queued`,`routed`,`done`,`cancelled`,`failed`],Je=[`open`,`in_progress`,`blocked`];function Ye(e){if(!We(e)||!Ge(e.id)||typeof e.title!=`string`)return;let t=qe.find(t=>t===e.status),n=Ke(e.createdAt);if(!t||n===void 0)return;let r=Je.find(t=>t===e.progress),i={id:e.id,title:e.title,status:t,priority:Ge(e.priority)??`normal`,revision:Ke(e.revision)??1,createdAt:n,updatedAt:Ke(e.updatedAt)??n};r&&(i.progress=r);for(let t of[`sessionID`,`workspaceID`,`assignmentID`,`reason`,`lastError`,`ref`])Ge(e[t])&&(i[t]=e[t]);return i}function Xe(e){let t=(We(e)&&Array.isArray(e.items)?e.items:[]).map(Ye).filter(e=>!!e).sort((e,t)=>t.createdAt-e.createdAt),n=We(e)?Ge(e.cursor):void 0;return n?{items:t,cursor:n}:{items:t}}var Ze={queued:`Queued`,routed:`Routed`,in_progress:`In progress`,blocked:`Blocked`,done:`Done`,failed:`Failed`,cancelled:`Cancelled`};function Qe(e){return e.status===`routed`?e.progress===`in_progress`||e.progress===`blocked`?e.progress:`routed`:e.status}var $e=e=>e.status===`queued`||e.status===`routed`;function et(e){let t=(...e)=>[`queued`,`routed`,`working`,`closed`].map((t,n)=>({step:t,state:e[n]}));switch(Qe(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 tt(e){if(!We(e))return;let t=t=>Ke(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 nt=e=>e.queued+e.routed;function rt(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:nt(n)}:{}}}function it(e){return(We(e)&&Array.isArray(e.items)?e.items:[]).filter(We).map(e=>({version:Ke(e.version),publishedAt:Ke(e.publishedAt)})).filter(e=>e.version!==void 0&&e.publishedAt!==void 0).sort((e,t)=>t.version-e.version)}var at=(e,t)=>t?e.nodes.find(e=>e.kind===`machine`&&e.machineID===t)?.label:void 0,ot=e=>e.status!==`offline`&&e.status!==`ended`;function st(e,t){return e.seats.map(e=>{let n=t?.nodes.find(t=>t.id===e.sessionID&&t.kind===`session`),r=t&&n?at(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 ct(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=at(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:ot(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 lt(e){if(e.visible)return e.openWork?5e3:3e4}function ut(e,t,n){return e>=n?e>n?`full (${e} of ${n})`:`full (${n})`:t>0&&e<t?`${e} of ${t} required`:`${re(e,`member`)} · up to ${n}`}var dt=[`msg`,`ask`,`reply`,`decision`,`launch`,`policy`],ft=[...dt,`denied`],pt=[`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,mt=e=>Array.isArray(e)?e.filter(e=>typeof e==`string`&&e.length>0):[];function ht(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 gt(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 _t(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 vt=new Set([`hub`,`machine`,`session`,`user`,`team`]),yt=new Set([`idle`,`working`,`blocked`,`error`,`offline`,`ended`]),q=(e,t)=>t===void 0?{}:{[e]:t};function bt(e){if(!W(e))return;let t=G(e.id),n=G(e.kind);if(!t||!n||!vt.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&&yt.has(r)?r:void 0),...q(`online`,typeof e.online==`boolean`?e.online:void 0),roles:mt(e.roles),workspaceIDs:mt(e.workspaceIDs),teamIDs:mt(e.teamIDs),harnesses:mt(e.harnesses),...q(`project`,G(e.project)),...q(`lastSeen`,K(e.lastSeen)),tags:mt(e.tags),...q(`labels`,gt(e.labels)),seats:_t(e.seats),...q(`name`,G(e.name)),projects:mt(e.projects),...q(`mode`,e.mode===`open`||e.mode===`restricted`?e.mode:void 0),...q(`paused`,e.paused===!0||void 0),...q(`metadata`,gt(e.metadata)),...q(`entryRole`,G(e.entryRole))}}function xt(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&&dt.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`,ht(e.states)),...q(`delivery`,ht(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`,mt(e.kinds).length?mt(e.kinds):void 0)}}function St(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=bt(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=>xt(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 Ct(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`?mt(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 wt(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 Tt={working:`Working`,idle:`Idle`,"needs-you":`Needs you`,error:`Error`,offline:`Offline`,ended:`Ended`},Et={working:`--blue`,idle:`--faint`,"needs-you":`--warn`,error:`--err`,offline:`--line-2`,ended:`--faint`},Dt={working:`pulse`,idle:`thin`,"needs-you":`thick`,error:`double`,offline:`broken`,ended:`none`},Ot=[`--accent`,`--blue`,`--violet`,`--orange`,`--ok`,`--warn`],kt=[`●`,`▲`,`■`,`◆`,`★`,`⬟`,`✚`,`⬢`],At=[`opencode`,`claude-code`,`codex`],jt={opencode:`sphere`,"claude-code":`cube`,codex:`octahedron`},Mt=e=>e.harness??`unknown`,Nt=e=>jt[e]??(e===`unknown`?`dodecahedron`:`tetrahedron`),Pt=e=>e===`unknown`?`Unknown harness`:N(e),Ft={sphere:`circle`,cube:`square`,octahedron:`diamond`,tetrahedron:`triangle`,dodecahedron:`pentagon`},It=[{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).`}],Lt=()=>It,Rt=e=>It.find(t=>t.kind===e).label,zt=e=>It.find(t=>t.kind===e).color,Bt={"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`}},Vt={machine:`Machine`,harness:`Harness`,workspace:`Workspace`,team:`Team`,none:`Nothing`},Ht={window:`24h`,groupBy:`machine`,tree:!0,kinds:new Set([`msg`,`ask`,`reply`,`decision`,`launch`,`denied`]),search:``},Ut=e=>`machine:${e}`,Wt=e=>e.kind===`hub`||e.kind===`user`||e.kind===`app`;function Gt(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:Ot[n%Ot.length],symbol:kt[n%kt.length],sessions:t.filter(e=>e.machineID===r).length,online:e.online===!0}})}function Kt(e){let t=new Map;for(let n of e)t.set(Mt(n),(t.get(Mt(n))??0)+1);let n=e=>At.includes(e)?At.indexOf(e):e===`unknown`?1e3:100;return[...t.keys()].sort((e,t)=>n(e)-n(t)||e.localeCompare(t)).map(e=>({id:e,label:Pt(e),shape:Nt(e),sessions:t.get(e)}))}function qt(e){return e.every(e=>e.kind===`policy`)?`dotted`:en(e)?`dashed`:`solid`}var Jt=e=>Math.round((.6+Math.min(5.4,Math.log2(1+Math.max(0,e))*1.2))*100)/100,Yt={holdMs:5e3,liveHalfLifeMs:45e3,idleHalfLifeMs:6e3,floor:.05};function Xt(e,t){if(!e.lastAt)return 0;let n=Math.max(0,t-e.lastAt);if(n<=Yt.holdMs)return 1;if(n>9e5)return 0;let r=.5**((n-Yt.holdMs)/(e.live?Yt.liveHalfLifeMs:Yt.idleHalfLifeMs));return r<Yt.floor?0:r}function Zt(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 Qt=e=>e===`dropped`||e===`expired`?`not delivered`:e,$t=e=>e&&Object.keys(e).length?Object.entries(e).map(([e,t])=>`${Qt(e)} ${t}`).join(`, `):void 0,en=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 tn(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=en(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:Jt(i),style:qt(t.edges),particles:Zt(i,Xt({lastAt:a,live:o},n.now),n),live:o,edgeIDs:t.edges.map(e=>e.id)}})}function nn(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:Jt(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:Jt(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 rn(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 an(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}`,on=`group:none`,sn={machine:`No machine`,harness:`Sessions`,workspace:`No workspace`,team:`No team`,none:`All sessions`},cn=(e,t)=>e.label.localeCompare(t.label)||(e.id<t.id?-1:+(e.id>t.id));function ln(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?an(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||Mt(e)===t.harness)&&(!t.states?.size||wt(e)!==void 0&&t.states.has(wt(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 un=e=>!!(e.machine||e.harness||e.states?.size||e.team||e.role||e.project||e.workspace||e.tag||e.meta?.trim());function dn(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(ln(e,t)),s=new Set(o.map(e=>e.id)),c=Gt(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(Wt),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))&&(!un(t)||o.some(t=>t.teamIDs.includes(e.id)))).sort(cn):[],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)&&Wt(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(Ut(e.machineID))?Ut(e.machineID):`hub`;case`harness`:{let t=Mt(e),n=`group:harness:${t}`;return D.has(n)||D.set(n,{id:n,kind:`cluster`,label:Pt(t),shape:Nt(t),size:rn(`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:rn(`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`?on:r;if(!_||a===on)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:Mt(e),shape:Nt(Mt(e)),...q(`ring`,wt(e)),size:rn(`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:rn(`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:rn(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:rn(`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:rn(`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`)))}},I=(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))},L=new Map,R=`full`,z=N(!0),B=P(!0),V=new Set;for(let e of o)z.push(ne(e)),I(e,B,V,!0),L.set(e.id,ee(e));F(z,B,V),B.push(...tn(T,e=>e,n,a),...nn(T,e=>e,t.kinds));let ie=!1;if(z.length>r){R=`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))}z=N(!0),B=P(!0),V.clear(),L.clear();for(let[t,n]of e){let e=i.get(t);z.push(ne(e,n||void 0)),I(e,B,V,!1),L.set(t,ee(e))}F(z,B,V);let c=e=>s.has(e)?M(i.get(e)).id:e;if(B.push(...tn(T,c,n,a),...nn(T,c,t.kinds)),z.length>r){if(t.groupBy===`none`)ie=!0;else{R=`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);z=N(!1),B=P(!1),V.clear(),L.clear();for(let[t,n]of e){let e=t.slice(4);V.add(e);let r=D.get(e)??z.find(t=>t.id===e);z.push({id:t,kind:`aggregate`,label:`${n} sessions${r&&r.id!==`hub`?` · ${r.label}`:``}`,...q(`machine`,r?.machine),size:rn(`aggregate`,0,n),match:!1,dim:!1,folded:n}),B.push(J(e,t,`group`)),L.set(t,{group:e===`hub`?on:e})}F(z,B,V);let l=e=>s.has(e)?c(i.get(e)):e;B.push(...tn(T,l,n,a),...nn(T,l,t.kinds)),z.length>r&&(ie=!0)}}}let H=t.search.trim().toLowerCase(),U=0;return H&&(z=z.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(H);return r&&U++,{...e,match:r,dim:!r}})),{groups:ae(),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:z,links:B,machines:c,harnesses:Kt(o),lod:R,tooLarge:ie,matches:U,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 ae(){let e=new Map,n=(t,n=[{members:[]}])=>e.set(t.id,{group:t,sections:n}),r=R!==`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=Kt(o).map(e=>`group:harness:${e.id}`),s=[...D.values()].sort(t.groupBy===`harness`?(e,t)=>a.indexOf(e.id)-a.indexOf(t.id):cn);for(let e of s)(V.has(e.id)||[...L.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(on)??(n({id:on,label:sn[t.groupBy],kind:`none`}),e.get(on)),u=[...L.keys()],d=new Map;for(let e of u){let t=i.get(e)?.parentID;t!==void 0&&L.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=L.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||!L.has(t))&&m(e,0)}for(let e of u)m(e,0);let h=[...e.values()].filter(e=>e.group.id!==on),g=e.get(on);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 fn(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 pn(e){let t={};for(let n of e){let e=wt(n);e&&(t[e]=(t[e]??0)+1)}return t}var mn=`app:concierge`;function hn(e){if(e.id===mn)return`service`;if(e.concierge)return e.status===`ended`||/ \(previous\)$/.test(e.label)?`previous`:`current`}function gn(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`,wt(n)),...q(`machine`,f),...q(`harness`,n.kind===`session`?Pt(Mt(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`,hn(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:pn(a),machinesOnline:{online:p.filter(e=>e.online).length,total:p.length}}:{},...o?{states:pn(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 _n(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:Rt(n.kind),fromLabel:r(n.from),toLabel:r(n.to),...q(`teamLabel`,n.teamID?r(n.teamID):void 0)}}function vn(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 yn(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 bn(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=wt(e);if(p.push({id:e.id,label:e.label,machine:e.machineID&&l.get(e.machineID)||`—`,harness:Pt(Mt(e)),state:n?Tt[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:Rt(e.kind),from:h(e.from),to:h(e.to),count:e.count,lastAt:e.lastAt,style:qt([e])})).sort((e,t)=>t.count-e.count||t.lastAt-e.lastAt)}}var xn=(e,t)=>`/api/agent/graph?since=${t-Bt[e.window].ms}&until=${t}`,Sn=new Set([`catalog`,`status`,`decision`,`agent`,`resync`]),Cn=e=>typeof e.type==`string`&&Sn.has(e.type),wn=[`3d`,`2d`,`list`],Tn=`watchtower.view`,En=`watchtower.presets`,Dn=`watchtower.`,On=`birdsEye.`;function kn(e){try{let t=[];for(let n=0;n<e.length;n++){let r=e.key(n);r?.startsWith(On)&&t.push(r)}for(let n of t)try{let t=e.getItem(n),r=Dn+n.slice(9);t!==null&&e.getItem(r)===null&&e.setItem(r,t),e.removeItem(n)}catch{}}catch{}}var An=e=>e!==null&&e in Bt,jn=e=>e!==null&&e in Vt,Mn=e=>typeof e==`string`&&wn.includes(e),Nn=[[`machine`,`machine`],[`harness`,`harness`],[`team`,`team`],[`role`,`role`],[`project`,`project`],[`workspace`,`ws`],[`tag`,`tag`],[`meta`,`meta`],[`q`,`q`]],Pn=200,Fn=(e,t)=>e.length===t.size&&e.every(e=>t.has(e)),In=e=>Mn(e)?e:void 0;function Ln(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 Nn){let r=n.get(t)?.trim();r&&(s[e]=r.slice(0,Pn))}let c=n.get(`state`),l=n.get(`kinds`),u=l===null?void 0:ft.filter(e=>l.split(`,`).includes(e));return{window:An(r)?r:Ht.window,view:Mn(a)?a:t??`3d`,groupBy:jn(i)?i:Ht.groupBy,...o?{selected:{type:o[1],id:o[2]}}:{},...s,...c&&pt.includes(c)?{state:c}:{},...u&&!Fn(u,Ht.kinds)?{kinds:u}:{},...n.get(`tree`)===`0`?{tree:!1}:{}}}function Rn(e,t=`3d`){let n=new URLSearchParams;e.window!==Ht.window&&n.set(`window`,e.window),(e.view!==`3d`||t!==`3d`)&&n.set(`view`,e.view),e.groupBy!==Ht.groupBy&&n.set(`group`,e.groupBy);for(let[t,r]of Nn)e[t]&&n.set(r,e[t]);e.state&&n.set(`state`,e.state),e.kinds&&!Fn(e.kinds,Ht.kinds)&&n.set(`kinds`,ft.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 zn(e){return{window:e.window,groupBy:e.groupBy,tree:e.tree!==!1,kinds:e.kinds?new Set(e.kinds):Ht.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 Bn(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(cn).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 Vn=e=>{let{selected:t,...n}=e;return Rn({...n,view:`3d`})};function Hn(e,t){return{...Ln(t,e.view),view:e.view,...e.selected?{selected:e.selected}:{}}}function Un(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 Wn(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 Gn=(e,t)=>e.filter(e=>e.name!==t);function Kn(e){return e instanceof ne?{kind:`offline`,message:e.message}:e instanceof O?e.status===404&&e.code===`not_found`?{kind:`missing`,message:`This hub doesn't have the interaction graph yet.`}:e.status===403||e.status===401?{kind:`forbidden`,message:e.message||`This device may not read the interaction graph.`}:e.status===503?{kind:`offline`,message:e.message||`The hub is offline.`}:{kind:`error`,message:e.message}:{kind:`error`,message:e instanceof Error?e.message:String(e)}}async function qn(e){let t=St(await k(e));if(!t)throw Error(`The hub answered something that isn't an interaction graph`);return Ct(t,await k(`/api/agent/who`).catch(()=>void 0),P.machines??[])}var Jn=(e,t)=>`since=${t-Bt[e].ms}&until=${t}`;async function Yn(e,t,n,r){let i=`/api/agent/graph/${e.type===`edge`?`edges`:`nodes`}/${A(e.id)}`;return vn(await k(`${i}?${Jn(t,n)}&limit=50${r?`&cursor=${A(r)}`:``}`))}async function Xn(e){let t=yn(await k(`/api/agent/messages/${A(e)}`));if(!t)throw Error(`The hub didn't return this message's text`);return t}var Zn=`/api/agent/teams`,X=e=>`${Zn}/${A(e)}`,Z=async(e,t,n,r)=>(await S(e,{method:t,...n===void 0?{}:{json:n},...r?{headers:{"idempotency-key":r}}:{}})).json().catch(()=>({}));function Qn(e){let t=ce(e);if(!t)throw Error(`The hub answered something that isn't a team`);return t}async function $n(){return((await k(`${Zn}?limit=200`)).items??[]).map(e=>ce({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 er(e=`all`){return((await k(`${Zn}?limit=200&state=${e}`)).items??[]).flatMap(e=>{let t=ce({team:e}),n=se(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 tr(e){let t=await k(`${X(e)}/status`),n=Le({roster:t.roster}),r=tt(t.intake);return{...n?{roster:n}:{},...r?{intake:r}:{}}}async function nr(e,t=50){return Xe(await k(`${X(e)}/intake?limit=${t}`)).items}async function rr(e,t,n,r,i){return Ye((await Z(`${X(e)}/intake/${A(t)}/status`,`POST`,{status:n,expectedRevision:r,...i?{reason:i}:{}})).intake)}async function ir(e){return it(await k(`${X(e)}/versions?limit=50`))}async function ar(e,t,n){return await Z(`${X(e)}/${t?`archive`:`restore`}`,`POST`,{expectedRevision:n}),or(e)}var or=async e=>Qn(await k(X(e))),sr=async(e,t)=>Qn(await Z(Zn,`POST`,e,t));async function cr(e,t,n){return await Z(X(e),`PATCH`,Ee(t,n)),or(e)}async function lr(e,t){return await Z(`${X(e)}/draft?expectedRevision=${t}`,`DELETE`),or(e)}async function ur(e){let t=je(await k(`${X(e)}/diff?to=draft`));if(!t)throw Error(`The hub didn't answer a diff`);return t}async function dr(e,t){return await Z(`${X(e)}/publish`,`POST`,{expectedRevision:t}),or(e)}async function fr(e,t,n){return await Z(`${X(e)}/${t?`pause`:`resume`}`,`POST`,{expectedRevision:n}),or(e)}async function pr(e){let t=Le(await k(`${X(e)}/roster`));if(!t)throw Error(`The hub didn't answer a roster`);return t}var mr=(e,t,n,r)=>Z(`${X(e)}/staffing`,`PUT`,{role:t,sessionID:n},r),hr=(e,t,n)=>Z(`${X(e)}/staffing/launch`,`POST`,t,n),gr=(e,t,n)=>Z(`${X(e)}/staffing/${A(t)}?expectedRevision=${n}`,`DELETE`);async function _r(e,t,n){let r=await Z(`${X(e)}/intake`,`POST`,t,n),i=Ye(r.intake);return{id:String(r.intake?.id??``),status:String(r.intake?.status??`queued`),...i?{intake:i}:{}}}async function vr(){try{return((await k(`/api/agent/profiles?state=active&limit=200`)).items??[]).filter(e=>typeof e.id==`string`&&typeof e.latestVersion==`number`).map(e=>({id:e.id,title:String(e.title||e.name),version:e.latestVersion}))}catch{return[]}}var yr=()=>crypto.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2)}`;function br(e,t={}){let[n,r]=s(),[i,a]=s(``),[o,c]=s(),[l,u]=s(),[d,f]=s(),[m,h]=s(),[g,_]=s(),[v,y]=s(``),[b,x]=s(),[S,C]=s(!1),[w,T]=s(),E=()=>o()?.present,D=e=>JSON.stringify(e??null),k=p(()=>!!o()&&D(E())!==D(l())),A=p(()=>E()?be(E()):[]),j=()=>n()?.team,M=()=>j()?.id??e,ee=p(()=>new Set(n()?.published.roles.map(e=>e.name)??[])),te=p(()=>n()&&E()?Ae(n().published,E()):void 0),ne=p(()=>(g()??[]).some($e)),re=()=>t.onChanged?.(),N=async()=>{try{f(await pr(e))}catch{f(void 0)}},P=async()=>{if(t.intake)try{let[e,t]=await Promise.all([nr(M()),tr(M()).catch(()=>({}))]);_(e),y(``),t.intake&&h(t.intake)}catch(e){y(Ie(e).message),g()||_([])}},F=(e,t)=>{let n=e.draft??e.published;r(e),u(n);let i=o();(!t||!i)&&c(Se(n))},I=async()=>{try{F(await or(e),!1),await Promise.all([N(),P()])}catch(e){a(e instanceof O&&e.status===404?`This hub doesn't have that team (or teams at all).`:Ie(e).message)}},L=async()=>{if(!S()&&n()){try{let t=await or(e);t.team.revision!==j()?.revision&&F(t,k())}catch{}await Promise.all([N(),P()])}},R=async t=>{C(!0),x(void 0);try{await t()}catch(t){let n=Ie(t);if(n.kind===`conflict`){try{F(await or(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)}},z,B=e=>{if(!e.ok)return x(z={kind:`error`,text:e.error});z&&b()===z&&x(void 0),z=void 0,T(void 0),c(Ce(o(),e.spec))},V=()=>o()&&c(we(o())),ie=()=>o()&&c(Te(o())),H=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?ie():V())},U=async()=>{let t=await cr(e,E(),j().revision);return F(t,!1),t},ae=()=>R(async()=>{await U(),x({kind:`ok`,text:`Draft saved. It isn't live until you publish it.`})}),oe=()=>R(async()=>{k()&&await U(),j().hasDraft?T(await ur(e)):x({kind:`ok`,text:`Nothing to publish: the draft matches version ${j().version}.`})}),se=()=>R(async()=>{let t=j().version,n=await dr(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=()=>R(async()=>{j().hasDraft?F(await lr(e,j().revision),!1):F(n(),!1),T(void 0),x({kind:`ok`,text:`Draft discarded.`})}),le=()=>R(async()=>{let t=!j().paused;F(await fr(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=()=>R(async()=>{let t=j().state!==`archived`;F(await ar(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=yr(),fe=async(t,n,r)=>{let i=!1;return await R(async()=>{await mr(e,t,n,de),de=yr(),await N(),re(),x({kind:`ok`,text:`${r} is staffed as ${t}.`}),i=!0}),i},pe=(t,n,r,i)=>R(async()=>{await gr(e,t,n),await N(),re(),x({kind:`ok`,text:`${r} no longer holds ${i}.`})}),me=yr(),he=async(t,n)=>{let r=!1;return await R(async()=>{let i=await hr(e,n,me);me=yr(),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=yr();return{id:e,read:n,team:j,spec:E,hist:o,dirty:k,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:()=>xe(A()),fieldProblem:(e,t)=>A().find(n=>n.field===e&&n.level===t)?.message,load:I,refresh:L,loadRoster:N,loadIntake:P,apply:B,undo:V,redo:ie,onKey:H,saveDraft:ae,review:oe,publish:se,discard:ce,togglePause:le,toggleArchive:ue,attach:fe,unstaff:pe,launch:he,submit:async e=>{let t=!1;return await R(async()=>{let r=await _r(M(),e,ge);ge=yr(),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)=>R(async()=>{let n=await rr(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 xr=g(`<p>Missing grants:`),Sr=g(`<ul>`),Cr=g(`<p class=muted>Staffing never issues grants: grant these in Settings → Agents, or staff the role yourself here.`),wr=g(`<div><p>`),Tr=g(`<li>`),Er=g(`<span>`),Dr=g(`<label class=te-field><span>`),Or=g(`<fieldset class=te-mode><legend>Communication</legend><label class=wt-check><input type=radio><span>Open team: everyone may message and ask everyone</span></label><label class=wt-check><input type=radio><span>Restricted paths: only the paths you draw`),kr=g(`<span class="te-chip te-chip-warn">Paused: no new members or tasks`),Ar=g(`<span class="te-chip te-chip-warn">Archived: its policy no longer applies`),jr=g(`<p class=te-status role=status aria-label="Team state"><span class=te-chip>`),Mr=g(`<div class=te-toolbar role=toolbar aria-label=Draft><button type=button class="btn small"aria-keyshortcuts=Control+Z>Undo</button><button type=button class="btn small"aria-keyshortcuts=Control+Shift+Z>Redo</button><button type=button class="btn small">Save draft</button><button type=button class="btn small primary">Review and publish…</button><button type=button class="btn small">Discard draft`),Nr=g(`<p class="muted te-pending">Unsaved: `),Pr=g(`<section class=te-preview role=region><h3>Publish version <!>?</h3><p class=muted>Delivery and staffing switch to the new version when you publish. Publishing is refused while sessions hold a role it removes.</p><div class=te-row><button type=button class="btn primary">Publish version </button><button type=button class=btn>Keep editing`),Fr=g(`<div role=alert class=te-problems><p>Fix these before saving:</p><ul>`),Ir=g(`<p>No changes against version <!>.`),Q=g(`<input>`),Lr=g(`<textarea>`),Rr=g(`<p class=te-err role=alert>`),zr=g(`<ul class=te-roles aria-label=Roles>`),Br=g(`<form class="te-row te-add"aria-label="Add role"><input type=text aria-label="New role name"placeholder="role name (dev)"><input type=text aria-label="New role label"placeholder="label (optional)"><button type=submit class="btn small">Add role`),Vr=g(`<span class=te-chip>new in draft`),Hr=g(`<li class=te-role><div class=te-row><strong></strong><label class=wt-check><input type=radio><span></span></label><button type=button class="btn small">Remove</button></div><label class=wt-check><input type=checkbox><span>May contact sessions outside the team`),Ur=g(`<p class=muted>Open team: every member may message and ask every other. The paths below are kept and apply again if you switch back to restricted.`),Wr=g(`<ul class=te-paths aria-label=Paths>`),Gr=g(`<form class="te-form te-connect"aria-label="Connect roles"><h4 class=te-form-title>Connect two roles</h4><div class=te-row><label class=te-field><span>From</span><select aria-label="Path from"><option value>Pick a role</option></select></label><label class=te-field><span>To</span><select aria-label="Path to"><option value>Pick a role</option></select></label></div><fieldset class=te-mode><legend>Direction</legend><label class=wt-check><input type=radio><span>One-way (from may contact to)</span></label><label class=wt-check><input type=radio><span>Two-way (both may contact each other)</span></label></fieldset><fieldset class=te-mode><legend>Permits</legend><label class=wt-check><input type=checkbox><span>Messages (msg)</span></label><label class=wt-check><input type=checkbox><span>Questions (ask)</span></label></fieldset><button type=submit class="btn small primary">Add path`),Kr=g(`<p class=muted>No paths yet. `),qr=g(`<span class=te-err> — `),Jr=g(`<li><span> <!> <!> · <!> · </span> <button type=button class="btn small">Edit</button><button type=button class="btn small">Remove`),Yr=g(`<option>`),Xr=g(`<p><strong>Restricted.</strong> Members may only use these paths; the entry role <code></code> receives the team's work.`),Zr=g(`<ul class=tm-edges>`),Qr=g(`<div class=tm-policy aria-label="Published communication">`),$r=g(`<p><strong>Open team.</strong> Every member may message and ask every other; the entry role <code></code> receives the team's work.`),ei=g(`<p class=muted>No paths are published: members can't reach each other.`),ti=g(`<li><span class=tm-node></span><span class=tm-arrow></span><span class=tm-node></span><span class=muted> `),ni=g(`<p class=muted>Members unknown (the roster didn't load).`),ri=g(`<p class=muted>The team is paused: resume it to add members.`),ii=g(`<p class=muted>Tip: on the 2D canvas, drag a session onto a role to add it.`),ai=g(`<div class=tm-members>`),oi=g(`<span class=muted> `),si=g(`<span class=te-chip>entry role: receives the work`),ci=g(`<span class="te-chip te-chip-warn">`),li=g(`<span class="muted tm-count">`),ui=g(`<ul class=tm-seats>`),di=g(`<div class="te-row tm-role-actions"><button type=button class="btn small primary">+ Add member</button><button type=button class="btn small">Launch new <!>…`),fi=g(`<section class=tm-role role=group><header class=tm-role-head><div class=tm-role-name><strong>`),pi=g(`<p class=muted>Publish the draft to add members to <!>.`),mi=g(`<p class="muted tm-empty">No members yet.`),hi=g(`<li class=tm-seat><span aria-hidden=true></span><a class=tm-seat-name></a><span class="muted tm-seat-facts"></span><button type=button class="btn small">Unstaff`),gi=g(`<fieldset class=tm-choices><legend class=sr-only>Sessions`),_i=g(`<p class=te-memberships role=status aria-label="Other memberships">`),vi=g(`<form><p class=muted>Pick a running session to hold <!>. A session may hold roles in several teams.</p><input type=search class=tm-search aria-label="Search sessions"placeholder="Search by name, machine, harness or team"><div class="dialog-actions tm-picker-actions"><button type=button class="btn small tm-launch-instead">Launch a new member instead…</button><button type=button class=btn>Cancel</button><button type=submit class="btn primary">Add to `),yi=g(`<p class=muted>Loading sessions…`),bi=g(`<p class=muted>`),xi=g(`<label class=tm-choice><input type=radio><span aria-hidden=true></span><span class=tm-choice-text><strong></strong><span class=muted> </span><span class=tm-choice-note>`),Si=g(`<button type=button class="btn small">Cancel`),Ci=g(`<form class=te-form aria-label="Launch a new member"><h4 class=te-form-title>Launch a new member</h4><div class=te-row><button type=submit class="btn small primary">Launch member`),wi=g(`<select><option value>Pick a role`),Ti=g(`<select><option value>Any machine (the hub picks)`),Ei=g(`<select><option value>The role's default`),Di=g(`<select><option value>The role's profile (or none)`),Oi=g(`<option> (v<!>)`),ki=g(`<select><option value>Default (idle)</option><option value=idle>Idle</option><option value=asked>Asked</option><option value=never>Never`),Ai=g(`<select><option value=worktree>New worktree</option><option value=checkout>The checkout itself</option><option value=clone>A fresh clone`),ji=g(`<form class="te-form tm-submit"aria-label="Submit a task"><div class=te-row></div><div class=te-row><button type=submit class="btn primary">Submit task</button><span class=muted>It goes to the entry role (<!>) of the published team.`),Mi=g(`<select>`),Ni=g(`<p class=muted role=note>Couldn't refresh the tasks: `),Pi=g(`<ul class=tm-intake aria-label=Tasks>`),Fi=g(`<p class=muted>Loading tasks…`),Ii=g(`<p class=muted>No tasks yet. Submitted tasks and their progress show up here.`),Li=g(`<span class=muted>With`),Ri=g(`<a>`),zi=g(`<a>Workspace assignment`),Bi=g(`<button type=button class="btn small">Mark done`),Vi=g(`<span class=tm-intake-actions><button type=button class="btn small">Cancel`),Hi=g(`<li class=tm-intake-item><div class=tm-intake-head><strong class=tm-intake-title></strong><span></span></div><ol class=tm-steps aria-label=Progress></ol><p class="muted tm-intake-facts"></p><div class="te-row tm-intake-links">`),Ui=g(`<span class=muted>Waiting for the entry role.`),Wi=g(`<ul class=tm-versions aria-label=Versions>`),Gi=g(`<p class=muted>History unavailable: `),Ki=g(`<p class=muted>Loading history…`),qi=g(`<span class=te-chip>live`),Ji=g(`<li><strong>Version </strong><span class=muted> published `);function Yi(e){return n(o,{get when(){return e.notice},children:e=>(()=>{var t=wr(),r=t.firstChild;return u(r,()=>e().text),u(t,n(o,{get when(){return e().missing?.length},get children(){return[xr(),(()=>{var t=Sr();return u(t,n(c,{get each(){return[...e().missing]},children:e=>(()=>{var t=Tr();return u(t,e),t})()})),t})(),Cr()]}}),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 Xi=0;function $(e){let t=`te-f${++Xi}`,r=()=>e.error??e.warning;return(()=>{var i=Dr(),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=Er();return d(n,`id`,`${t}-msg`),u(n,r),a(()=>m(n,e.error?`te-err`:`te-warn`)),n}}),null),i})()}function Zi(e){return(()=>{var t=Or(),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 Qi=e=>e.direction===`two-way`?`⇄`:`→`;function $i(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=jr(),i=e.firstChild;return u(i,r),u(e,n(o,{get when(){return t.team()?.paused},get children(){return kr()}}),null),u(e,n(o,{get when(){return t.team()?.state===`archived`},get children(){return Ar()}}),null),a(()=>d(e,`data-state`,t.dirty()?`dirty`:t.team()?.hasDraft?`draft`:`published`)),e})()}function ea(e){let t=e.c;return[(()=>{var e=Mr(),n=e.firstChild,r=n.nextSibling,i=r.nextSibling,o=i.nextSibling,s=o.nextSibling;return x(n,`click`,t.undo,!0),x(r,`click`,t.redo,!0),i.$$click=()=>void t.saveDraft(),o.$$click=()=>void t.review(),s.$$click=()=>void t.discard(),a(e=>{var a=!t.hist()?.past.length,c=!t.hist()?.future.length,l=!t.dirty()||t.busy()||t.blocked(),u=t.busy()||t.blocked()||!t.dirty()&&!t.team()?.hasDraft,d=t.busy()||!t.dirty()&&!t.team()?.hasDraft;return a!==e.e&&(n.disabled=e.e=a),c!==e.t&&(r.disabled=e.t=c),l!==e.a&&(i.disabled=e.a=l),u!==e.o&&(o.disabled=e.o=u),d!==e.i&&(s.disabled=e.i=d),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),e})(),n(o,{get when(){return r(()=>!!(t.dirty()&&t.localPreview()))()&&!Fe(t.localPreview())},get children(){var e=Nr();return e.firstChild,u(e,()=>Pe(t.localPreview()).join(` · `),null),e}}),n(o,{get when(){return t.preview()},get children(){var e=Pr(),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!Fe(t.preview())},get fallback(){return(()=>{var e=Ir(),n=e.firstChild.nextSibling;return n.nextSibling,u(e,()=>t.team().version,n),e})()},get children(){var e=Sr();return u(e,n(c,{get each(){return Pe(t.preview())},children:e=>(()=>{var t=Tr();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=Fr(),r=e.firstChild.nextSibling;return u(r,n(c,{get each(){return t.probs().filter(e=>e.level===`error`)},children:e=>(()=>{var t=Tr();return u(t,()=>e.message),t})()})),e}})]}function ta(e){let t=e.c,r=()=>t.spec();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 r().title},onChange:e=>t.apply(_e(r(),{title:e.currentTarget.value}))}),!1,!1),n})()}),n($,{label:`Description`,children:e=>(()=>{var n=Lr();return i(n,l(e,{rows:`2`,get value(){return r().description??``},onChange:e=>t.apply(_e(r(),{description:e.currentTarget.value}))}),!1,!1),n})()}),n($,{label:`Agent hop limit (optional; at most the hub-wide limit)`,children:e=>(()=>{var n=Q();return i(n,l(e,{type:`number`,min:`1`,max:`100`,get value(){return r().hopLimit??``},onChange:e=>t.apply(_e(r(),{hopLimit:e.currentTarget.value}))}),!1,!1),n})()}),n($,{label:`Tags (comma separated)`,children:e=>(()=>{var n=Q();return i(n,l(e,{type:`text`,get value(){return ve(r())},onChange:e=>t.apply(_e(r(),{tags:e.currentTarget.value}))}),!1,!1),n})()}),n($,{label:`Metadata (key=value per line)`,children:e=>(()=>{var n=Lr();return i(n,l(e,{rows:`2`,get value(){return ye(r())},onChange:e=>t.apply(_e(r(),{metadata:e.currentTarget.value}))}),!1,!1),n})()}),n(o,{get when(){return e.withMode},get children(){return n(Zi,{get value(){return r().mode},onChange:e=>t.apply(ge(r(),e)),get name(){return`te-mode-${t.id}`}})}})]}function na(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=Rr();return u(e,()=>r.fieldProblem(`entry`,`error`)??r.fieldProblem(`roles`,`error`)),e}}),(()=>{var s=zr();return u(s,n(c,{get each(){return[...f().roles]},children:s=>(()=>{var c=Hr(),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 Vr()}}),h),g.addEventListener(`change`,()=>r.apply(pe(f(),s.name))),u(_,()=>f().entryRole===s.name?`★ Entry role`:`Entry role`),v.$$click=()=>r.apply(de(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(fe(f(),s.name,{label:e.currentTarget.value}))}),!1,!1),a})()}),y),b.addEventListener(`change`,e=>r.apply(fe(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=Br(),t=e.firstChild,n=t.nextSibling,i=n.nextSibling;return e.addEventListener(`submit`,e=>{e.preventDefault();let t=ue(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 ra(e){let r=e.c,i=()=>r.spec(),[l,f]=s(``),[p,h]=s(``),[g,_]=s(`one-way`),[y,b]=s(!0),[x,S]=s(!1),C,w=(e,t)=>{let n=i().edges.find(n=>n.from===e&&n.to===t);f(e),h(t),n&&(_(n.direction),b(n.kinds.includes(`msg`)),S(n.kinds.includes(`ask`))),queueMicrotask(()=>C?.focus())};v(()=>e.handle?.({prefill:w}));let T=e=>{e.preventDefault();let t=[...y()?[`msg`]:[],...x()?[`ask`]:[]];r.apply(me(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 Ur()}}),n(o,{get when(){return i().edges.length},get fallback(){return(()=>{var t=Kr();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=Wr();return u(e,n(c,{get each(){return[...i().edges]},children:e=>(()=>{var t=Jr(),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,()=>Qi(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=qr();return t.firstChild,u(t,()=>E(e),null),t}}),h),g.$$click=()=>w(e.from,e.to),_.$$click=()=>r.apply(he(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=Gr(),o=e.firstChild.nextSibling,s=o.firstChild,m=s.firstChild.nextSibling;m.firstChild;var v=s.nextSibling.firstChild.nextSibling;v.firstChild;var w=o.nextSibling,E=w.firstChild.nextSibling,D=E.firstChild,O=E.nextSibling.firstChild,k=w.nextSibling,A=k.firstChild.nextSibling,j=A.firstChild,M=A.nextSibling.firstChild,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=Yr();return u(t,()=>e.name),a(()=>t.selected=l()===e.name),a(()=>t.value=e.name),t})()}),null),v.addEventListener(`change`,e=>h(e.currentTarget.value)),u(v,n(c,{get each(){return[...i().roles]},children:e=>(()=>{var t=Yr();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(()=>v.value=p()),a(()=>D.checked=g()===`one-way`),a(()=>O.checked=g()===`two-way`),a(()=>j.checked=y()),a(()=>M.checked=x()),e})()]}function ia(e){let t=()=>e.c.read().published;return(()=>{var e=Qr();return u(e,n(o,{get when(){return t().mode===`restricted`},get fallback(){return(()=>{var e=$r(),n=e.firstChild.nextSibling.nextSibling;return u(n,()=>t().entryRole),e})()},get children(){return[(()=>{var e=Xr(),n=e.firstChild.nextSibling.nextSibling;return u(n,()=>t().entryRole),e})(),n(o,{get when(){return t().edges.length},get fallback(){return ei()},get children(){var e=Zr();return u(e,n(c,{get each(){return[...t().edges]},children:e=>(()=>{var t=ti(),n=t.firstChild,r=n.nextSibling,i=r.nextSibling,o=i.nextSibling;return o.firstChild,u(n,()=>e.from),u(r,()=>Qi(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 aa(e){let t=e.c,[i,f]=s(),[h,g]=s();v(()=>e.handle?.({add:(e,t)=>f({role:e,...t?{sessionID:t}:{}})}));let _=p(()=>{let e=t.roster()?.roles??(t.read()?.published.roles??[]).map(e=>({role:e.name,entry:e.name===t.read().published.entryRole,minMembers:e.minMembers??0,maxMembers:e.maxMembers??16,vacant:!0,understaffed:!1,launching:0,seats:[]})),n=(t.spec()?.roles??[]).filter(e=>!t.publishedRoles().has(e.name)).map(e=>({role:e.name,draftOnly:!0}));return[...e,...n]}),y=p(()=>new Map(_().map(e=>[e.role,e]))),b=p(()=>_().map(e=>e.role),void 0,{equals:(e,t)=>e.length===t.length&&e.every((e,n)=>e===t[n])}),x=e=>t.read()?.published.roles.find(t=>t.name===e)?.label,S=()=>!!t.team()?.paused;return(()=>{var s=ai();return u(s,n(o,{get when(){return!t.roster()},get children(){return ni()}}),null),u(s,n(o,{get when(){return S()},get children(){return ri()}}),null),u(s,n(c,{get each(){return b()},children:i=>{let s=()=>y().get(i),l=()=>{let e=s();return e&&`seats`in e?e:void 0},_=p(()=>l()?st(l(),e.snap):[]),v=e=>_().find(t=>t.staffingID===e);return(()=>{var s=fi(),p=s.firstChild,y=p.firstChild,b=y.firstChild;return d(s,`aria-label`,`Role ${i}`),d(s,`data-role`,i),u(b,()=>l()?.entry?`★ `:``,null),u(b,i,null),u(y,n(o,{get when(){return x(i)},get children(){var e=oi();return e.firstChild,u(e,()=>x(i),null),e}}),null),u(y,n(o,{get when(){return l()?.entry},get children(){return si()}}),null),u(y,n(o,{get when(){return!l()},get children(){return Vr()}}),null),u(y,n(o,{get when(){return r(()=>!!l())()&&(l().vacant||l().understaffed)},get children(){var e=ci();return u(e,()=>l()?.vacant?`vacant`:`understaffed`),e}}),null),u(p,n(o,{get when(){return l()},get children(){var e=li();return u(e,(()=>{var e=r(()=>!!l());return()=>e()?ut(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=pi(),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 mi()},get children(){var e=ui();return d(e,`aria-label`,`Members of ${i}`),u(e,n(c,{get each(){return _().map(e=>e.staffingID)},children:e=>n(o,{get when(){return v(e)},children:e=>(()=>{var n=hi(),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=ee(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=di(),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 ii()}}),null),u(s,n(o,{get when(){return i()},keyed:!0,children:r=>n(oa,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 oa(e){let i=e.c,[l,f]=s(``),[h,g]=s(e.sessionID??``),y,b=t=>({teamID:i.id,role:e.role,query:t,...i.roster()?{roster:i.roster().seats}:{}}),S=p(()=>ct(e.snap,b(l()))),C=p(()=>ct(e.snap,b(``)).find(e=>e.sessionID===h())),w=()=>C()?.name??h();v(()=>e.sessionID&&queueMicrotask(()=>y?.focus()));let T=async t=>{t.preventDefault(),h()&&await i.attach(e.role,h(),w())&&e.onClose()},E=e=>e.map(e=>`${e.team} (${e.role})`).join(`, `);return n(_,{open:!0,get title(){return`Add a member to ${e.role}`},get onClose(){return e.onClose},class:`tm-picker`,get children(){var s=vi(),p=s.firstChild,_=p.firstChild.nextSibling;_.nextSibling;var v=p.nextSibling,b=v.nextSibling,D=b.firstChild,O=D.nextSibling,k=O.nextSibling;k.firstChild,s.addEventListener(`submit`,T),u(p,()=>e.role,_),v.$$input=e=>f(e.currentTarget.value),u(s,n(o,{get when(){return e.snap},get fallback(){return yi()},get children(){var t=gi();return t.firstChild,u(t,n(o,{get when(){return S().length},get fallback(){return(()=>{var e=bi();return u(e,()=>l()?`No session matches.`:`No running sessions.`),e})()},get children(){return n(c,{get each(){return S()},children:t=>(()=>{var n=xi(),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=_i();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(Yi,{get notice(){return r(()=>i.notice()?.kind===`ok`)()?void 0:i.notice()}}),b),D.$$click=()=>{e.onClose(),e.onLaunch()},x(O,`click`,e.onClose,!0);var A=y;return typeof A==`function`?t(A,k):y=k,u(k,()=>e.role,null),a(t=>{var n=`Add a member to ${e.role}`,r=!e.sessionID,a=!h()||i.busy();return n!==t.e&&d(s,`aria-label`,t.e=n),r!==t.t&&(v.autofocus=t.t=r),a!==t.a&&(k.disabled=t.a=a),t},{e:void 0,t:void 0,a:void 0}),a(()=>v.value=l()),s}})}function sa(e){let t=e.c,[r,d]=s(e.role??``),[f,m]=s(``),[h,g]=s(``),[_,y]=s(``),[b,x]=s(``),[S,C]=s(`worktree`),[w,T]=s(``),[E,D]=s(``),[O,k]=s(``),[A,j]=s(``),[M,ee]=s(``),[te,ne]=s(``),[re,N]=s(``),[P,F]=s(),[I,L]=s([]);v(()=>void vr().then(L));let R=p(()=>(e.snap?.nodes??[]).filter(e=>e.kind===`machine`)),z=p(()=>{let e=R().find(e=>e.machineID===f());return e?.harnesses.length?e.harnesses:[`opencode`,`claude-code`,`codex`]}),B=e=>P()?.field===e?P().error:void 0,V=async n=>{n.preventDefault();let i=Ve({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=Ci(),p=s.firstChild.nextSibling,_=p.firstChild;return s.addEventListener(`submit`,V),u(s,n($,{label:`Role`,get error(){return B(`role`)},children:e=>(()=>{var o=wi();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=Yr();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=Ti();return t.firstChild,i(t,l(e,{onChange:e=>m(e.currentTarget.value)}),!1,!0),u(t,n(c,{get each(){return R().map(e=>e.machineID??e.id)},children:e=>{let t=()=>R().find(t=>(t.machineID??t.id)===e);return(()=>{var n=Yr();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=Ei();return t.firstChild,i(t,l(e,{onChange:e=>g(e.currentTarget.value)}),!1,!0),u(t,n(c,{get each(){return z()},children:e=>(()=>{var t=Yr();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=Di();return t.firstChild,i(t,l(e,{onChange:e=>y(e.currentTarget.value)}),!1,!0),u(t,n(c,{get each(){return I()},children:e=>(()=>{var t=Oi(),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 B(`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=ki();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 B(`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 B(`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=Ai();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 B(`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 B(`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 B(`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=Lr();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=Si();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=Ue({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=bi();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=ji(),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=Lr();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=Mi();return i(t,l(e,{onChange:e=>g(e.currentTarget.value)}),!1,!0),u(t,n(c,{get each(){return[...He]},children:e=>(()=>{var t=Yr();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=Lr();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 la={queued:`Submitted`,routed:`Routed`,working:`Working`,closed:`Closed`};function ua(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=Ni();return e.firstChild,u(e,()=>t.intakeError(),null),e}}),n(o,{get when(){return t.items()},get fallback(){return Fi()},get children(){return n(o,{get when(){return r().length},get fallback(){return Ii()},get children(){var e=Pi();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(da,{c:t,get item(){return e()},sessionName:i})})})),e}})}})]}function da(e){let t=()=>e.item,r=()=>Qe(t());return(()=>{var i=Hi(),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,()=>Ze[r()]),u(p,n(c,{get each(){return et(t())},children:e=>(()=>{var t=Tr();return u(t,()=>la[e.step]),a(n=>{var r=`tm-step tm-step-${e.state}`,i=e.state===`current`||e.state===`blocked`?`step`:void 0;return r!==n.e&&m(t,n.e=r),i!==n.t&&d(t,`aria-current`,n.t=i),n},{e:void 0,t:void 0}),t})()})),u(h,()=>[t().priority===`normal`?void 0:`${t().priority} priority`,`submitted ${y(t().createdAt)}`,t().updatedAt===t().createdAt?void 0:`updated ${y(t().updatedAt)}`,t().lastError?`last routing error: ${t().lastError}`:void 0,t().reason?`reason: ${t().reason}`:void 0].filter(Boolean).join(` · `)),u(g,n(o,{get when(){return t().sessionID},get fallback(){return n(o,{get when(){return t().status===`queued`},get children(){return Ui()}})},get children(){return[Li(),(()=>{var n=Ri();return u(n,()=>e.sessionName(t().sessionID)),a(()=>d(n,`href`,ee(t().sessionID))),n})()]}}),null),u(g,n(o,{get when(){return t().workspaceID},get children(){var e=zi();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 $e(t())},get children(){var r=Vi(),i=r.firstChild;return u(r,n(o,{get when(){return t().status===`routed`},get children(){var n=Bi();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 fa(t){let[r,i]=s(),[a,l]=s(``);return f(e(()=>t.c.team()?.version,()=>void ir(t.c.id).then(e=>(i(e),l(``))).catch(e=>l(e.message)))),n(o,{get when(){return!a()},get fallback(){return(()=>{var e=Gi();return e.firstChild,u(e,a,null),e})()},get children(){return n(o,{get when(){return r()},get fallback(){return Ki()},get children(){var e=Wi();return u(e,n(c,{get each(){return r()},children:e=>(()=>{var r=Ji(),i=r.firstChild;i.firstChild;var a=i.nextSibling;return a.firstChild,u(i,()=>e.version,null),u(a,()=>y(e.publishedAt),null),u(r,n(o,{get when(){return e.version===t.c.team()?.version},get children(){return qi()}}),null),r})()})),e}})}})}b([`click`,`input`]);var pa=g(`<p role=alert class=wt-error>`),ma=g(`<form class="te-form tm-create"aria-label="New team"><div class=te-row></div><p class=muted>Creating publishes version 1 at once. You add members and more roles next.</p><div class=dialog-actions><button type=button class=btn>Cancel</button><button type=submit class="btn primary">Create team`),ha=g(`<input>`),ga=e=>`/teams/${encodeURIComponent(e)}`;function _a(e){let[t,r]=s(``),[c,d]=s(``),[f,p]=s(`restricted`),[m,h]=s(`pm`),[g,v]=s(`Project manager`),[y,b]=s(``),[S,C]=s(),[w,T]=s(!1),E=yr(),D=e=>S()?.field===e?S().error:void 0,O=async n=>{n.preventDefault();let i=De({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 sr(i.body,E);E=yr(),e.onClose(),r(``),d(``),e.onCreated?e.onCreated(t.team.id):te(ga(t.team.id))}catch(e){C({field:`form`,error:Ie(e).message})}finally{T(!1)}};return n(_,{get open(){return e.open},title:`New team`,get onClose(){return e.onClose},get children(){var s=ma(),_=s.firstChild,S=_.nextSibling,C=S.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=ha();return i(n,l(e,{get value(){return t()},onInput:e=>r(e.currentTarget.value),placeholder:`product-a`,autofocus:!0}),!1,!1),n})()}),_),u(s,n($,{label:`Title`,get error(){return D(`title`)},children:e=>(()=>{var t=ha();return i(t,l(e,{get value(){return c()},onInput:e=>d(e.currentTarget.value),placeholder:`Product A`}),!1,!1),t})()}),_),u(s,n(Zi,{get value(){return f()},onChange:p,name:`tm-new-mode`}),_),u(s,n($,{label:`Agent hop limit (optional; at most the hub-wide limit)`,get error(){return D(`hopLimit`)},children:e=>(()=>{var t=ha();return i(t,l(e,{type:`number`,min:`1`,max:`100`,get value(){return y()},onInput:e=>b(e.currentTarget.value)}),!1,!1),t})()}),_),u(_,n($,{label:`Entry role (receives the team's work)`,get error(){return D(`entry`)},children:e=>(()=>{var t=ha();return i(t,l(e,{get value(){return m()},onInput:e=>h(e.currentTarget.value)}),!1,!1),t})()}),null),u(_,n($,{label:`Entry role label`,children:e=>(()=>{var t=ha();return i(t,l(e,{get value(){return g()},onInput:e=>v(e.currentTarget.value)}),!1,!1),t})()}),null),u(s,n(o,{get when(){return D(`form`)},get children(){var e=pa();return u(e,()=>D(`form`)),e}}),S),x(C,`click`,e.onClose,!0),a(()=>T.disabled=w()),s}})}b([`click`]);var va=new Set([`agent`,`status`,`catalog`,`resync`,`decision`]),ya=2e3;function ba(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=lt({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+ya-Date.now()))))};v(()=>{let e=F(e=>typeof e.type==`string`&&va.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{zn as $,Tt as A,zt as B,Kn as C,En as D,Ot as E,Hn as F,Xt as G,Lt as H,dn as I,Pt as J,xn as K,Gn as L,Ft as M,Tn as N,pt as O,Bt as P,gn as Q,$t as R,qn as S,ft as T,_n as U,Rt as V,Bn as W,bn as X,Cn as Y,kn as Z,er as _,ea as a,Wn as at,Yn as b,Zi as c,Be as ct,ia as d,ge as dt,Un as et,na as f,Re as ft,br as g,fa as h,ta as i,fn as it,Dt as j,Et as k,Yi as l,Ie as lt,$i as m,_a as n,In as nt,ua as o,Rn as ot,ca as p,Mt as q,ga as r,Vn as rt,aa as s,rt as st,ba as t,Ln as tt,ra as u,ze as ut,$n as v,Vt as w,Xn as x,tr as y,Qt as z};