@huynle/hub 0.7.4 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/CHANGELOG.md +217 -0
  2. package/Dockerfile +7 -2
  3. package/README.md +148 -19
  4. package/package.json +5 -3
  5. package/packages/claude-code/package.json +1 -1
  6. package/packages/claude-code/src/daemon.ts +8 -1
  7. package/packages/claude-code/src/launcher.ts +29 -9
  8. package/packages/claude-code/src/profile.ts +173 -0
  9. package/packages/claude-code/src/sessions.ts +22 -4
  10. package/packages/cli/dist/hub-cli.js +6474 -3470
  11. package/packages/cli/package.json +1 -1
  12. package/packages/cli/src/artifact-jobs-mcp.ts +226 -0
  13. package/packages/cli/src/artifacts-mcp.ts +160 -0
  14. package/packages/cli/src/bootstrap/enrollment/enroll.ts +20 -8
  15. package/packages/cli/src/bootstrap/enrollment/policy.ts +125 -12
  16. package/packages/cli/src/bootstrap/enrollment/status.ts +3 -2
  17. package/packages/cli/src/cli.ts +95 -13
  18. package/packages/cli/src/format.ts +48 -10
  19. package/packages/cli/src/http.ts +1 -0
  20. package/packages/cli/src/intents.ts +23 -0
  21. package/packages/cli/src/login.ts +20 -6
  22. package/packages/cli/src/mcp.ts +380 -9
  23. package/packages/cli/src/messaging.ts +3 -1
  24. package/packages/cli/src/setup/commands.ts +3 -2
  25. package/packages/cli/src/setup/runtime.ts +3 -2
  26. package/packages/cli/src/team-intake-mcp.ts +158 -0
  27. package/packages/cli/src/teams-mcp.ts +403 -0
  28. package/packages/cli/src/watchlist.ts +135 -0
  29. package/packages/codex/package.json +1 -1
  30. package/packages/codex/src/profile.ts +163 -0
  31. package/packages/codex/src/sessions.ts +12 -0
  32. package/packages/codex/src/spoke.ts +19 -1
  33. package/packages/node/package.json +1 -1
  34. package/packages/node/src/config.ts +96 -2
  35. package/packages/node/src/opencode-warm.ts +325 -0
  36. package/packages/node/src/run.ts +27 -1
  37. package/packages/preset/package.json +1 -1
  38. package/packages/preset/src/profile.ts +34 -0
  39. package/packages/preset/src/spoke.ts +4 -0
  40. package/packages/protocol/package.json +1 -1
  41. package/packages/protocol/src/artifacts.ts +142 -0
  42. package/packages/protocol/src/concierge.ts +366 -0
  43. package/packages/protocol/src/contracts.ts +104 -0
  44. package/packages/protocol/src/graph.ts +70 -0
  45. package/packages/protocol/src/hub-workspace.ts +201 -0
  46. package/packages/protocol/src/index.ts +169 -6
  47. package/packages/protocol/src/launch.ts +22 -0
  48. package/packages/protocol/src/profiles.ts +301 -0
  49. package/packages/protocol/src/teams.ts +204 -0
  50. package/packages/runtime-openshell/package.json +1 -1
  51. package/packages/runtime-sdk/package.json +1 -1
  52. package/packages/sdk/package.json +1 -1
  53. package/packages/sdk/src/address.ts +50 -2
  54. package/packages/sdk/src/artifact-jobs.ts +194 -0
  55. package/packages/sdk/src/artifacts.ts +187 -0
  56. package/packages/sdk/src/client.ts +226 -5
  57. package/packages/sdk/src/concierge.ts +88 -0
  58. package/packages/sdk/src/errors.ts +3 -1
  59. package/packages/sdk/src/index.ts +5 -0
  60. package/packages/sdk/src/team-intake.ts +122 -0
  61. package/packages/sdk/src/teams.ts +346 -0
  62. package/packages/sdk/src/types.ts +548 -1
  63. package/packages/spoke-sdk/package.json +1 -1
  64. package/packages/spoke-sdk/src/index.ts +1 -0
  65. package/packages/spoke-sdk/src/profile-apply.ts +245 -0
  66. package/src/central/actions.ts +7 -0
  67. package/src/central/agent/acting-routes.ts +2 -1
  68. package/src/central/agent/acting-switch.ts +2 -1
  69. package/src/central/agent/acting.ts +215 -10
  70. package/src/central/agent/app-tokens.ts +3 -2
  71. package/src/central/agent/audit.ts +17 -0
  72. package/src/central/agent/body.ts +163 -0
  73. package/src/central/agent/decisions.ts +69 -2
  74. package/src/central/agent/delivery.ts +95 -15
  75. package/src/central/agent/directory-routes.ts +37 -7
  76. package/src/central/agent/directory.ts +70 -14
  77. package/src/central/agent/errors.ts +5 -0
  78. package/src/central/agent/events-routes.ts +21 -4
  79. package/src/central/agent/events.ts +11 -3
  80. package/src/central/agent/form-check.ts +85 -0
  81. package/src/central/agent/grant-requests.ts +2 -1
  82. package/src/central/agent/grant-routes.ts +4 -3
  83. package/src/central/agent/grants.ts +29 -2
  84. package/src/central/agent/idempotency.ts +133 -0
  85. package/src/central/agent/intent-routes.ts +116 -0
  86. package/src/central/agent/intents.ts +505 -0
  87. package/src/central/agent/interaction-graph-routes.ts +212 -0
  88. package/src/central/agent/interaction-graph.ts +865 -0
  89. package/src/central/agent/launch-engine.ts +16 -2
  90. package/src/central/agent/launch-routes.ts +6 -1
  91. package/src/central/agent/launch-spec.ts +14 -1
  92. package/src/central/agent/message-routes.ts +2 -1
  93. package/src/central/agent/messages.ts +27 -2
  94. package/src/central/agent/names.ts +12 -2
  95. package/src/central/agent/read-routes.ts +86 -19
  96. package/src/central/agent/routes.ts +176 -5
  97. package/src/central/agent/webhook-routes.ts +2 -1
  98. package/src/central/agent-data.ts +4 -0
  99. package/src/central/artifacts/access.ts +44 -0
  100. package/src/central/artifacts/blob-store.ts +113 -0
  101. package/src/central/artifacts/blob-support.ts +98 -0
  102. package/src/central/artifacts/events.ts +27 -0
  103. package/src/central/artifacts/host-caps.ts +162 -0
  104. package/src/central/artifacts/host.ts +315 -0
  105. package/src/central/artifacts/idempotency.ts +109 -0
  106. package/src/central/artifacts/jobs-routes.ts +773 -0
  107. package/src/central/artifacts/jobs.ts +344 -0
  108. package/src/central/artifacts/maintenance.ts +103 -0
  109. package/src/central/artifacts/routes.ts +360 -0
  110. package/src/central/artifacts/store.ts +776 -0
  111. package/src/central/artifacts/workspaces.ts +31 -0
  112. package/src/central/backend/file-blobs.ts +377 -0
  113. package/src/central/backend/index.ts +12 -3
  114. package/src/central/backend/memory-blobs.ts +116 -0
  115. package/src/central/backend/postgres-blobs.ts +513 -0
  116. package/src/central/backend/postgres-migrate.ts +33 -0
  117. package/src/central/backend/postgres-state.ts +19 -0
  118. package/src/central/backend/types.ts +8 -0
  119. package/src/central/concierge/activity.ts +142 -0
  120. package/src/central/concierge/arm.ts +63 -0
  121. package/src/central/concierge/board-render.ts +190 -0
  122. package/src/central/concierge/board-results.ts +169 -0
  123. package/src/central/concierge/board-routes.ts +339 -0
  124. package/src/central/concierge/board.ts +249 -0
  125. package/src/central/concierge/context.ts +221 -0
  126. package/src/central/concierge/entitlements.ts +13 -0
  127. package/src/central/concierge/guard.ts +120 -0
  128. package/src/central/concierge/inbound.ts +89 -0
  129. package/src/central/concierge/index.ts +84 -0
  130. package/src/central/concierge/notes.ts +41 -0
  131. package/src/central/concierge/notifier.ts +986 -0
  132. package/src/central/concierge/prompt.ts +130 -0
  133. package/src/central/concierge/proposals.ts +262 -0
  134. package/src/central/concierge/push-remap.ts +49 -0
  135. package/src/central/concierge/routes.ts +62 -0
  136. package/src/central/concierge/schedule.ts +113 -0
  137. package/src/central/concierge/service.ts +243 -0
  138. package/src/central/concierge/session-routes.ts +69 -0
  139. package/src/central/concierge/settings.ts +217 -0
  140. package/src/central/concierge/supervisor.ts +740 -0
  141. package/src/central/concierge/tiers.ts +260 -0
  142. package/src/central/concierge/watchlist-routes.ts +277 -0
  143. package/src/central/concierge/watchlist.ts +273 -0
  144. package/src/central/config.ts +7 -1
  145. package/src/central/http.ts +632 -49
  146. package/src/central/mcp-http.ts +10 -21
  147. package/src/central/profiles/apply.ts +333 -0
  148. package/src/central/profiles/content.ts +174 -0
  149. package/src/central/profiles/events.ts +40 -0
  150. package/src/central/profiles/idempotency.ts +14 -0
  151. package/src/central/profiles/import.ts +139 -0
  152. package/src/central/profiles/routes.ts +356 -0
  153. package/src/central/profiles/store.ts +597 -0
  154. package/src/central/profiles/usage-ports.ts +120 -0
  155. package/src/central/profiles/usage.ts +364 -0
  156. package/src/central/push.ts +7 -0
  157. package/src/central/registry.ts +43 -6
  158. package/src/central/store.ts +4 -0
  159. package/src/central/teams/collections.ts +34 -0
  160. package/src/central/teams/discovery.ts +346 -0
  161. package/src/central/teams/draft-edits.ts +46 -0
  162. package/src/central/teams/events.ts +46 -0
  163. package/src/central/teams/intake-routes.ts +100 -0
  164. package/src/central/teams/intake.ts +772 -0
  165. package/src/central/teams/policy.ts +231 -0
  166. package/src/central/teams/routes.ts +516 -0
  167. package/src/central/teams/seats.ts +272 -0
  168. package/src/central/teams/staffing.ts +888 -0
  169. package/src/central/teams/store.ts +667 -0
  170. package/src/central/teams/validation.ts +256 -0
  171. package/src/central/workspaces/board.ts +408 -0
  172. package/src/central/workspaces/checkpoints.ts +316 -0
  173. package/src/central/workspaces/coordinator.ts +841 -0
  174. package/src/central/workspaces/events.ts +85 -0
  175. package/src/central/workspaces/lifecycle.ts +93 -0
  176. package/src/central/workspaces/master.ts +490 -0
  177. package/src/central/workspaces/members.ts +632 -0
  178. package/src/central/workspaces/routes.ts +354 -0
  179. package/src/central/workspaces/sidechats-routes.ts +410 -0
  180. package/src/central/workspaces/sidechats.ts +482 -0
  181. package/src/central/workspaces/store.ts +571 -0
  182. package/src/central/workspaces/supervision.ts +355 -0
  183. package/src/index.ts +97 -15
  184. package/src/spoke/concierge-agent.ts +33 -0
  185. package/src/spoke/deliver.ts +22 -4
  186. package/src/spoke/fork-revert.ts +142 -0
  187. package/src/spoke/hub-rpc.ts +41 -5
  188. package/src/spoke/hub-tool.ts +383 -18
  189. package/src/spoke/listing.ts +47 -4
  190. package/src/spoke/profile-apply.ts +298 -0
  191. package/src/spoke/session-context.ts +176 -0
  192. package/src/spoke/spoke.ts +319 -20
  193. package/src/spoke/timeline.ts +6 -1
  194. package/src/spoke/tracker.ts +23 -1
  195. package/src/spoke/who-teams.ts +81 -0
  196. package/src/tui-messaging.ts +32 -18
  197. package/web/dist/assets/ArtifactPage-BS0gVkfu.js +1 -0
  198. package/web/dist/assets/ArtifactPane-PLYHNs6s.js +1 -0
  199. package/web/dist/assets/ArtifactWorkbench-9eTj1CeW.css +1 -0
  200. package/web/dist/assets/ArtifactWorkbench-LkDyJ5Dv.js +6 -0
  201. package/web/dist/assets/Library-CtxRqTjo.js +2 -0
  202. package/web/dist/assets/Library-DYsFj_5c.css +1 -0
  203. package/web/dist/assets/ProfilesDestination-BYiHKLmc.js +1 -0
  204. package/web/dist/assets/TeamsPage-BwjsAAUC.js +1 -0
  205. package/web/dist/assets/Watchtower-C4swrWVs.js +2 -0
  206. package/web/dist/assets/Watchtower-CTgqHk5g.css +1 -0
  207. package/web/dist/assets/index-DaH5GUdV.js +31 -0
  208. package/web/dist/assets/index-WWuKfWxL.css +1 -0
  209. package/web/dist/assets/live-BUofsQpz.css +1 -0
  210. package/web/dist/assets/live-YyTjE47g.js +5 -0
  211. package/web/dist/assets/pane-layout-CKC4I00k.js +1 -0
  212. package/web/dist/assets/plural-Bspvoqfq.js +1 -0
  213. package/web/dist/assets/renderer2d-CX5j3NcD.js +1 -0
  214. package/web/dist/assets/renderer3d-BXIVOvfi.js +5393 -0
  215. package/web/dist/assets/safe-area-DfPsOdWR.js +1 -0
  216. package/web/dist/assets/source-CvUHTc3O.js +1 -0
  217. package/web/dist/assets/ui-C9Igxzjm.js +1 -0
  218. package/web/dist/index.html +5 -2
  219. package/web/dist/sw.js +22 -2
  220. package/web/dist/assets/index-Dm8OmkaO.css +0 -1
  221. package/web/dist/assets/index-FUJbj_Du.js +0 -20
@@ -0,0 +1 @@
1
+ .awb{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.av-page{height:100%}.awb.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.awb.resizing iframe{pointer-events:none}.awb-side{border-left:1px solid var(--line);background:var(--bg);flex-direction:column;flex:none;min-height:0;display:flex;position:relative}.awb-side[hidden]{display:none}.awb-side>.aai{flex:1}.awb-resize{z-index:2;cursor:col-resize;touch-action:none;width:8px;position:absolute;top:0;bottom:0;left:-4px}.awb-resize:after{content:"";background:0 0;width:2px;transition:background .15s;position:absolute;top:0;bottom:0;left:3px}.awb-resize:hover:after,.awb-resize:focus-visible:after,.awb.resizing .awb-resize:after{background:var(--accent)}.awb-resize:focus-visible{outline:none}.awb-side.sheet{z-index:25;border:1px solid var(--line-2);height:min(78%,680px);box-shadow:0 -12px 40px var(--shadow);border-bottom:0;border-radius:16px 16px 0 0;position:absolute;bottom:0;left:0;right:0;overflow:hidden}.awb-grab{background:var(--line-2);border-radius:2px;flex:none;width:36px;height:4px;margin:6px auto 0}.awb-scrim{z-index:24;background:color-mix(in srgb, var(--bg) 45%, transparent);position:absolute;inset:0}.awb-ai-toggle{border:1px solid var(--line-2);background:var(--raise);height:30px;color:var(--text);font:600 .75rem/1 var(--sans);cursor:pointer;border-radius:999px;flex:none;align-items:center;gap:5px;margin-left:4px;padding:0 10px 0 8px;display:inline-flex}.awb-ai-toggle .icon{color:var(--accent)}.awb-ai-toggle:hover{background:var(--raise-2)}.awb-ai-toggle[aria-pressed=true]{background:color-mix(in srgb, var(--accent) 14%, var(--raise));border-color:color-mix(in srgb, var(--accent) 45%, var(--line-2))}.awb-ai-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.awb-badge{background:var(--accent);min-width:16px;height:16px;color:var(--accent-ink);border-radius:999px;place-items:center;padding:0 4px;font-size:.625rem;display:inline-grid}.awb.narrow .awb-ai-toggle{height:34px}.cmp-interactive{flex-direction:column;display:flex}.cmp-interactive .artifact-host{gap:0}.cmp-interactive .artifact-host-note{display:none}.cmp-interactive .artifact-host-status{padding:12px 16px}.cmp-interactive .artifact-host-frame{border:0;border-radius:0;min-height:360px}.cmp-disclose{border-top:1px solid var(--line);background:var(--side);color:var(--faint);align-items:flex-start;gap:8px;margin:0;padding:8px 14px;font-size:.75rem;display:flex}.cmp-disclose .icon{flex:none;width:14px;height:14px;margin-top:2px}.cmp-disclose strong{color:var(--muted);font-weight:600}.cmp-consent{flex-direction:column;gap:10px;display:flex}.cmp-card{border:1px solid color-mix(in srgb, var(--accent) 55%, var(--line));background:var(--raise);box-shadow:0 2px 8px var(--shadow);border-radius:14px;flex-direction:column;gap:8px;padding:10px 12px 12px;font-size:.8125rem;display:flex}.cmp-card-head{align-items:center;gap:8px;margin:0;display:flex}.cmp-card-icon{background:color-mix(in srgb, var(--accent) 12%, transparent);width:24px;height:24px;color:var(--accent);border-radius:6px;flex:none;place-items:center;display:inline-grid}.cmp-instruction{border-left:3px solid var(--accent);background:var(--side);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:0 8px 8px 0;max-height:12em;margin:0;padding:6px 10px;font-family:inherit;font-size:.875rem;overflow:auto}.cmp-note{color:var(--muted);margin:0;font-size:.75rem}.cmp-note.err{color:var(--err)}.cmp-row{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.cmp-card .aai-picker{flex:none}.cmp-actions{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.cmp-done{color:var(--muted);align-items:flex-start;gap:6px;margin:0;font-size:.75rem;display:flex}.cmp-done .icon{width:14px;height:14px;color:var(--faint);flex:none;margin-top:2px}.cmp-quote{overflow-wrap:anywhere;font-style:italic}.cmp-page-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.cmp-start{flex-direction:column;gap:10px;display:flex}.cmp-start label{flex-direction:column;gap:2px;display:flex}.cmp-empty{flex-direction:column;gap:8px;padding:24px;display:flex}@media (max-width:640px){.cmp-actions .btn{min-height:40px}}.awb.pane .pane-tools{border-left:1px solid var(--line);align-items:center;margin-left:2px;padding-left:4px;display:inline-flex}.ws-section .link-btn{color:var(--accent);cursor:pointer;font:inherit;background:0 0;border:0;padding:0;text-decoration:underline}.ws-list{margin:0;padding:0;list-style:none}.ws-item{margin:2px 0 6px}.ws-head{width:100%;min-height:30px;color:var(--text);cursor:pointer;text-align:left;font:inherit;background:0 0;border:0;border-radius:6px;align-items:center;gap:6px;padding:0 8px;display:flex}.ws-head:hover{background:var(--raise-2)}.ws-head .icon{width:14px;height:14px;color:var(--muted);flex:none}.ws-title{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.ws-goal{color:var(--muted);-webkit-line-clamp:2;-webkit-box-orient:vertical;margin:0 8px 2px 28px;font-size:.75rem;display:-webkit-box;overflow:hidden}.ws-panel{padding:2px 0 2px 8px}.ws-notice{min-height:0;color:var(--muted);margin:0 8px;font-size:.7188rem}.ws-notice:empty{display:none}.ws-tree{margin:0;padding:0;list-style:none}.ws-node{--ws-depth:0;padding-left:calc(var(--ws-depth) * 14px);border-radius:6px;outline:none;position:relative}.ws-node:focus-visible>.ws-row{box-shadow:0 0 0 2px var(--accent) inset}.ws-node.away .ws-member{color:var(--muted)}.ws-node.dragged{opacity:.5}.ws-node.drop-inside>.ws-row{background:var(--raise-2);box-shadow:0 0 0 1px var(--accent) inset}.ws-node.drop-before>.ws-row{box-shadow:0 -2px 0 var(--accent)}.ws-node.drop-after>.ws-row{box-shadow:0 2px 0 var(--accent)}.ws-node[draggable=true]>.ws-row{cursor:grab}.ws-row{border-radius:6px;align-items:center;gap:6px;min-height:28px;padding:0 2px 0 8px;display:flex}.ws-row:hover{background:var(--raise-2)}.ws-member{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text);flex:auto;font-size:.8125rem;text-decoration:none;overflow:hidden}.ws-meta{color:var(--faint);flex-wrap:wrap;align-items:center;gap:3px 4px;margin:0 8px 2px 30px;font-size:.6875rem;display:flex}.ws-badge{border:1px solid var(--line-2);color:var(--muted);white-space:nowrap;border-radius:6px;padding:2px 4px;font-size:.625rem;line-height:1}.ws-badge.master{color:var(--accent);border-color:var(--accent)}.ws-badge.offline{color:var(--err);border-color:var(--err)}.ws-keys{color:var(--faint);margin:0 8px 2px 30px;font-size:.6875rem}.ws-rel a{color:inherit}.ws-assignments{color:var(--muted);margin:0 8px 2px 30px;padding:0;font-size:.7188rem;list-style:none}.ws-assignment-status{color:var(--faint)}.ws-assignment.blocked .ws-assignment-status{color:var(--warn)}.ws-controls{color:var(--muted);margin:0 8px 4px 30px;font-size:.6875rem}.ws-controls summary{cursor:pointer;color:var(--faint)}.ws-controls p,.ws-controls ul{margin:4px 0}.ws-controls ul{padding-left:14px}.ws-root-drop{border:1px dashed var(--line-2);text-align:center;color:var(--muted);border-radius:6px;margin:4px 8px;padding:6px;font-size:.7188rem}.ws-root-drop.over{border-color:var(--accent);color:var(--accent)}.ws-keys{margin-left:8px}.feature-nav ul,.nav-rail-links ul{margin:0;padding:0;list-style:none}.nav-link .icon{flex:none}.nav-link:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.nav-link.active{color:var(--text)}.nav-link.disabled{opacity:.5;cursor:default}.nav-link.disabled:hover{background:0 0}.side-sessions{flex-direction:column;flex:1;min-height:0;display:flex}.nav-rail{background:var(--side);border-right:1px solid var(--line);flex-direction:column;flex:none;align-items:center;gap:6px;width:48px;padding:9px 0;display:flex}.nav-rail-links ul{flex-direction:column;gap:2px;display:flex}.nav-rail .nav-link{justify-content:center;width:32px;height:32px;margin:0;padding:0}.feature-page{flex-direction:column;flex:1;min-height:0;display:flex}.feature-scroll{flex:1;min-height:0;overflow:auto}.feature-body{max-width:980px;margin:0 auto;padding:16px 20px 40px}.feature-note{color:var(--muted)}@media (max-width:760px){.feature-body{padding:12px 14px 40px}}.side-top-actions{align-items:center;gap:2px;display:flex}.concierge-btn{position:relative}.concierge-btn.on{background:var(--raise-2);color:var(--accent)}.concierge-btn.ind-off{color:var(--muted)}.concierge-btn.ind-running{color:var(--accent)}.concierge-ind{border:1px solid var(--side);pointer-events:none;border-radius:50%;width:8px;height:8px;position:absolute;top:4px;right:4px}.concierge-ind.ind-off{background:var(--muted);opacity:.7}.concierge-ind.ind-busy{background:var(--warn)}.concierge-ind.ind-attention{background:var(--err);color:#fff;place-items:center;width:14px;height:14px;font-size:10px;font-weight:700;line-height:1;display:grid;top:1px;right:1px}.side-top{container:side-top/inline-size}.concierge-btn.labelled{align-items:center;gap:4px;width:auto;min-width:30px;padding-inline:6px;display:inline-flex}.concierge-btn-text{font-size:.8125rem;font-weight:500;display:none}@container side-top (width>=200px){.concierge-btn-text{display:inline}.concierge-btn.labelled .concierge-ind{left:16px;right:auto}.concierge-btn.labelled .concierge-ind.ind-attention{top:-1px;left:12px}}.concierge-panel{background:var(--bg);outline:none;flex-direction:column;min-height:0;display:flex}.concierge-panel.side{border-left:1px solid var(--line);width:min(440px,40vw);min-width:320px;height:100%;box-shadow:-12px 0 32px var(--shadow);flex:none;position:relative}.concierge-panel.page{flex:1;width:100%}.concierge-head{border-bottom:1px solid var(--line);flex:none;align-items:center;gap:8px;min-height:max(48px,2.4rem);padding:8px 10px 8px 14px;display:flex}.concierge-head .title{margin:0;font-size:.9375rem;font-weight:600}.concierge-title{min-width:0}.concierge-status{text-overflow:ellipsis;white-space:nowrap;margin:0;overflow:hidden}.concierge-mark{color:var(--accent);flex:none}.concierge-notice{border-radius:var(--r);border:1px solid color-mix(in srgb, var(--warn) 40%, var(--line));color:var(--warn);background:color-mix(in srgb, var(--warn) 8%, var(--bg));margin:8px 12px 0;padding:8px 10px;font-size:.8125rem}.concierge-notice.err{border-color:color-mix(in srgb, var(--err) 40%, var(--line));color:var(--err);background:color-mix(in srgb, var(--err) 7%, var(--bg))}.concierge-asked{flex-direction:column;gap:8px;margin-top:8px;padding:0 12px;display:flex}.concierge-scroll{overscroll-behavior:contain;flex:1;min-height:0;padding:8px 12px;overflow-y:auto}.concierge-scroll .transcript{max-width:none}.concierge-idle{flex-direction:column;flex:1;justify-content:flex-end;display:flex}.concierge-dock{border-top:1px solid var(--line);padding:8px 12px calc(8px + env(safe-area-inset-bottom));flex-direction:column;flex:none;gap:6px;display:flex}.concierge-idle .concierge-composer{margin:8px 12px calc(8px + env(safe-area-inset-bottom))}.concierge-composer{align-items:flex-end;gap:6px;display:flex}.concierge-composer textarea{resize:none;min-height:36px;max-height:200px;font:inherit;flex:1;line-height:1.4}.concierge-composer textarea:disabled{opacity:.6}.concierge-voice.on{background:var(--accent);color:var(--accent-ink);border-radius:var(--r)}.armed-decision{border-color:color-mix(in srgb, var(--accent) 55%, var(--line));box-shadow:0 0 0 1px color-mix(in srgb, var(--accent) 30%, transparent);margin:8px 12px 0}.armed-question{white-space:pre-wrap;overflow-wrap:anywhere;margin:6px 0;font-size:.9375rem}.armed-options{flex-wrap:wrap;gap:8px;margin:8px 0 4px;display:flex}.armed-options .btn{min-height:40px;padding:0 18px}.armed-hint{margin:4px 0 0}.armed-left{font-variant-numeric:tabular-nums}@media (max-width:760px){.concierge-head{padding-left:6px}.armed-options .btn{flex:1}}#concierge-quiet .row,#concierge-digests li.row{flex-wrap:wrap;align-items:center;gap:8px}#concierge-quiet .text-field{flex-direction:row;align-items:center;gap:6px}.digest-days{flex-wrap:wrap;flex:1;gap:4px 10px;display:flex}.digest-days .check{align-items:center;gap:3px;display:inline-flex}#concierge-watchlist input[type=number]{width:6em}.concierge-panel .decision.flash{animation:1.2s ease-out 2 concierge-flash}@keyframes concierge-flash{0%{box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 60%, transparent)}to{box-shadow:0 0 #0000}}.concierge-panel .hub-update .fold-head{text-align:start;font-size:.8125rem}.concierge-panel .hub-msg-text a{color:var(--accent);text-underline-offset:2px;text-decoration:underline}.concierge-panel .hub-update .fold-body{white-space:pre-wrap;font-size:.8125rem}#concierge{padding-bottom:72px}#concierge .stack>label.text-field{flex-direction:column;align-items:stretch;gap:4px;display:flex}#concierge .stack>label.text-field>input:not([type=number]),#concierge .stack>label.text-field>textarea{box-sizing:border-box;width:100%;max-width:44rem}#concierge #concierge-time-zone>input{max-width:20rem}#concierge-quiet .text-field input:placeholder-shown{color:var(--muted)}.closed-decision{opacity:.92;margin:8px 12px 0}.closed-decision .decision-head{align-items:center;gap:6px;display:flex}.concierge-panel a[href^="/concierge#decision-"]{vertical-align:bottom;max-width:100%;display:inline-block}.prof-page{flex-direction:column;height:100%;min-height:0;display:flex}.prof-body{flex:1;min-height:0;display:flex}.prof-list{border-right:1px solid var(--line);flex-direction:column;flex:none;gap:8px;width:280px;padding:10px 8px;display:flex;overflow:auto}.prof-filter{gap:4px;display:flex}.prof-filter .btn[aria-pressed=true]{background:var(--raise-2);border-color:var(--line-2);font-weight:600}.prof-items{flex-direction:column;gap:2px;margin:0;padding:0;list-style:none;display:flex}.prof-item{color:var(--text);border-radius:6px;flex-direction:column;gap:2px;padding:7px 9px;text-decoration:none;display:flex}.prof-item:hover{background:var(--raise-2)}.prof-item[aria-current=page]{background:var(--raise-2);box-shadow:0 0 0 1px var(--line-2) inset}.prof-item .prof-sub{color:var(--muted);font-size:.75rem}.prof-detail{flex:1;min-width:0;padding:16px 24px 48px;overflow:auto}.prof-detail h2{font:400 1.25rem var(--serif);margin:0}.prof-detail h3{color:var(--muted);margin:18px 0 6px;font-size:.8125rem;font-weight:500}.prof-head{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.prof-tag{border:1px solid var(--line-2);color:var(--muted);border-radius:6px;padding:1px 6px;font-size:.6875rem}.prof-tag.archived{color:var(--warn);border-color:var(--warn)}.prof-note{color:var(--muted);margin:6px 0;font-size:.75rem}.prof-tabs{gap:4px;margin:12px 0 4px;display:flex}.prof-tabs .btn[aria-selected=true]{background:var(--raise-2);font-weight:600}.prof-editor{flex-direction:column;gap:10px;max-width:760px;display:flex}.prof-editor label{color:var(--muted);flex-direction:column;gap:4px;font-size:.7812rem;display:flex}.prof-editor textarea,.prof-editor input{color:var(--text);font:inherit;box-sizing:border-box;width:100%;font-size:.8125rem}.prof-editor textarea{font-family:var(--mono);resize:vertical;min-height:64px}.prof-part{border:1px solid var(--line);border-radius:var(--r);flex-direction:column;gap:6px;padding:8px 10px;display:flex}.prof-part-head{align-items:flex-end;gap:6px;display:flex}.prof-part-head label{flex:1;min-width:0}.prof-preview{color:var(--muted);margin:0;font-size:.7188rem}.prof-preview.bad{color:var(--err)}.prof-history{flex-direction:column;gap:4px;max-width:760px;margin:0;padding:0;list-style:none;display:flex}.prof-history li{border:1px solid var(--line);border-radius:6px;flex-wrap:wrap;align-items:center;gap:8px;padding:6px 8px;font-size:.8125rem;display:flex}.prof-history .mono{font-family:var(--mono);color:var(--faint);font-size:.7188rem}.prof-history pre{white-space:pre-wrap;background:var(--side);border-radius:6px;flex-basis:100%;max-height:240px;margin:4px 0 0;padding:6px 8px;font-size:.75rem;overflow:auto}.prof-detail .prof-back{display:none}.prof-filters{flex-wrap:wrap;gap:4px;display:flex}.prof-filters select{font:inherit;color:var(--text);max-width:100%;font-size:.75rem}.prof-item .prof-desc{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:.75rem;overflow:hidden}.prof-chips{flex-wrap:wrap;gap:4px;margin-top:2px;display:flex}.prof-use{background:var(--raise-2);color:var(--text);border-radius:9px;padding:1px 6px;font-size:.6875rem}.prof-use.unused{color:var(--faint);border:1px dashed var(--line-2);background:0 0}.prof-use.older{color:var(--warn);background:color-mix(in srgb, var(--warn) 12%, transparent)}.prof-details{border:1px solid var(--line);border-radius:var(--r);flex-direction:column;align-items:flex-start;gap:8px;max-width:760px;margin:10px 0 4px;padding:8px 12px;display:flex}.prof-facts{grid-template-columns:max-content 1fr;gap:3px 14px;margin:0;font-size:.8125rem;display:grid}.prof-facts dt{color:var(--muted)}.prof-facts dd{overflow-wrap:anywhere;margin:0}.prof-details .prof-editor{width:100%}.prof-meta-row{align-items:center;gap:6px;display:flex}.prof-meta-row input{flex:1;min-width:0}.prof-usage{max-width:760px}.prof-uses{flex-direction:column;gap:4px;margin:0;padding:0;list-style:none;display:flex}.prof-uses li{border:1px solid var(--line);border-radius:6px;flex-wrap:wrap;align-items:center;gap:8px;padding:6px 8px;font-size:.8125rem;display:flex}.prof-uses .mono{font-family:var(--mono);font-size:.7188rem}.prof-dot{background:var(--faint);border-radius:50%;flex:none;width:8px;height:8px}.prof-dot.on{background:var(--ok)}.prof-chip{color:var(--muted);border:1px solid var(--line);white-space:nowrap;cursor:pointer;text-overflow:ellipsis;background:0 0;border-radius:13px;align-items:center;gap:4px;max-width:260px;padding:2px 10px;font-size:.75rem;display:inline-flex;overflow:hidden}.prof-chip:hover{background:var(--raise-2)}.prof-chip.ok{color:var(--ok);border-color:color-mix(in srgb, var(--ok) 45%, var(--line))}.prof-chip.warn,.prof-chip.pending{color:var(--warn);border-color:color-mix(in srgb, var(--warn) 45%, var(--line))}.prof-chip.pending{border-style:dashed}.prof-chip.err{color:var(--err);border-color:color-mix(in srgb, var(--err) 45%, var(--line))}.prof-chip .prof-up{color:var(--accent);font-weight:600}.prof-dialog .dialog-body{flex-direction:column;gap:10px;display:flex}.prof-dialog h3{margin:4px 0;font-size:.8125rem;font-weight:600}.prof-dialog label{color:var(--muted);flex-direction:column;gap:4px;font-size:.7812rem;display:flex}.prof-dialog select,.prof-dialog input,.prof-dialog textarea{color:var(--text);font:inherit;font-size:.8125rem}.prof-guidance{flex-direction:column;gap:2px;margin:0;padding-left:18px;font-size:.8125rem;display:flex}.prof-status{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.prof-status .prof-chip{cursor:default}.prof-upgrade{border:1px solid color-mix(in srgb, var(--accent) 45%, var(--line));border-radius:var(--r);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;padding:8px 10px;font-size:.8125rem;display:flex}.prof-palette .dialog-body{flex-direction:column;gap:8px;display:flex}.prof-commands{flex-direction:column;gap:2px;max-height:46vh;margin:0;padding:0;list-style:none;display:flex;overflow:auto}.prof-command{cursor:pointer;border-radius:6px;flex-direction:column;gap:1px;padding:6px 8px;display:flex}.prof-command[aria-selected=true]{background:var(--raise-2);box-shadow:0 0 0 1px var(--accent) inset}.prof-command .prof-sub{color:var(--muted);font-size:.75rem}.prof-secret{color:var(--muted);border-left:3px solid var(--warn);margin:0;padding:4px 8px;font-size:.75rem}@media (max-width:760px){.prof-list{border-right:0;flex:1;width:auto}.prof-body.has-detail .prof-list,.prof-body:not(.has-detail) .prof-detail{display:none}.prof-detail{padding:12px 14px 48px}.prof-detail .prof-back{margin-bottom:8px;display:inline-flex}.prof-chip{max-width:140px}}.pane-drop{z-index:8;outline:1px dashed color-mix(in srgb, var(--accent) 45%, transparent);outline-offset:-4px;background:color-mix(in srgb, var(--bg,#000) 18%, transparent);border-radius:6px;min-width:0;min-height:0;position:relative}.pane-drop-area{pointer-events:none;background:color-mix(in srgb, var(--accent) 22%, transparent);box-shadow:inset 0 0 0 2px var(--accent);border-radius:6px;transition:inset .12s ease-out;position:absolute}.pane-drop-area[data-zone=center]{inset:10%}.pane-drop-area[data-zone=left]{inset:0 50% 0 0}.pane-drop-area[data-zone=right]{inset:0 0 0 50%}.pane-drop-area[data-zone=top]{inset:0 0 50%}.pane-drop-area[data-zone=bottom]{inset:50% 0 0}.pane-drop[data-refused] .pane-drop-area{background:color-mix(in srgb, var(--warn) 18%, transparent);box-shadow:inset 0 0 0 2px var(--warn)}.pane-drop-hint{pointer-events:none;background:var(--raise-2);border:1px solid var(--line-2);box-shadow:0 6px 18px var(--shadow);white-space:nowrap;text-overflow:ellipsis;border-radius:999px;max-width:90%;padding:4px 12px;font-size:.8125rem;position:absolute;top:50%;left:50%;overflow:hidden;transform:translate(-50%,-50%)}.pane-drop[data-refused] .pane-drop-hint{color:var(--warn)}.pane-drop-label{pointer-events:none;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:.75rem;position:absolute;top:6px;left:8px;right:8px;overflow:hidden}.cmp-empty.pane-empty-drop{flex:1;position:relative}.cmp-empty .pane-drop{position:absolute;inset:8px}.pane-dock{z-index:25;background:color-mix(in srgb, var(--bg,#000) 55%, transparent);justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.pane-dock-card{background:var(--raise);border:1px solid var(--line-2);width:min(520px,90%);box-shadow:0 16px 48px var(--shadow);border-radius:12px;padding:14px}.pane-dock-title{white-space:nowrap;text-overflow:ellipsis;margin:0 0 10px;font-weight:500;overflow:hidden}.pane-dock-map{gap:6px;height:260px;display:grid}.pane-dock-pane{background:var(--raise-2)}.pane-dock-empty{justify-content:center;align-items:center;height:200px;display:flex}.pane-dock-empty .pane-drop-label{text-align:center;position:static}.pane-dock-note{margin:10px 0 0;font-size:.75rem}.pane-grip{width:24px;height:24px;color:var(--faint);cursor:grab;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}.pane-grip:hover{color:var(--text);background:var(--raise-2)}.pane-grip:active{cursor:grabbing}.pane-grip .icon{width:14px;height:14px}.side-row-link[draggable=true],.lib-row[draggable=true]{-webkit-user-drag:element}.wt-drag{cursor:grab}.seg{border:1px solid var(--line);background:var(--side,transparent);border-radius:8px;gap:2px;padding:2px;display:inline-flex}.seg button{width:30px;height:24px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}.seg button:hover{color:var(--text)}.seg button[aria-pressed=true]{background:var(--raise-2);color:var(--text);box-shadow:0 0 0 1px var(--line-2)}.seg button:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.seg .icon{width:16px;height:16px}@media (prefers-reduced-motion:reduce){.pane-drop-area{transition:none}}.pane-grip .icon{stroke-width:3.2px}:root{--bg:#f6f7f9;--side:#eef0f3;--raise:#fff;--raise-2:#e8ebef;--line:#d9dde3;--line-2:#c9ced6;--text:#22252a;--muted:#69707b;--faint:#9299a3;--accent:#0e7268;--accent-ink:#fff;--ok:#16834a;--warn:#9a5b08;--err:#b42318;--add:#16834a;--del:#b42318;--violet:#8954c7;--orange:#b96508;--blue:#2769b4;--mark:#22252a;--shadow:#1018281f;--serif:ui-serif, "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, serif;--sans:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--mono:ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;--side-w:235px;--rail-w:260px;--col:680px;--r:8px;--font-scale:1;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#101214;--side:#171a1e;--raise:#1b1f24;--raise-2:#22272d;--line:#2d333b;--line-2:#3a424d;--text:#e7e5e0;--muted:#9ca3ad;--faint:#6f7782;--accent:#3ad3bf;--accent-ink:#04201c;--ok:#50d890;--warn:#efb851;--err:#ff8e82;--add:#50d890;--del:#ff8e82;--violet:#b68cff;--orange:#f2a340;--blue:#64a8ef;--mark:#e7e5e0;--shadow:#0006}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#101214;--side:#171a1e;--raise:#1b1f24;--raise-2:#22272d;--line:#2d333b;--line-2:#3a424d;--text:#e7e5e0;--muted:#9ca3ad;--faint:#6f7782;--accent:#3ad3bf;--accent-ink:#04201c;--ok:#50d890;--warn:#efb851;--err:#ff8e82;--add:#50d890;--del:#ff8e82;--violet:#b68cff;--orange:#f2a340;--blue:#64a8ef;--mark:#e7e5e0;--shadow:#0006}}*{box-sizing:border-box}html{font-size:calc(100% * var(--font-scale,1));-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}html,body{background:var(--bg);height:100%;color:var(--text);-webkit-font-smoothing:antialiased;margin:0}body{font:.875rem/1.5 var(--sans)}#root{height:100%}a{color:inherit;text-decoration:none}button,input,select,textarea{font:inherit;color:inherit}.sr-only{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.muted{color:var(--muted)}.small{font-size:.7812rem}.mono,code,pre{font-family:var(--mono)}.display{font-family:var(--serif);letter-spacing:-.01em;font-weight:400}.grow{flex:1}.row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.stack{flex-direction:column;gap:12px;display:flex}.pad{padding:12px 16px}.error{color:var(--err)}.ok{color:var(--ok)}.icon{fill:none;stroke:currentColor;stroke-width:1.8px;stroke-linecap:round;stroke-linejoin:round;flex:none;width:16px;height:16px}kbd{font:.6875rem var(--mono);color:var(--faint);border:1px solid var(--line-2);border-radius:4px;padding:0 4px}:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.btn{border-radius:var(--r);border:1px solid var(--line-2);background:var(--raise);cursor:pointer;white-space:nowrap;align-items:center;gap:6px;min-height:32px;padding:0 12px;display:inline-flex}.btn:hover:not(:disabled){background:var(--raise-2)}.btn:disabled{opacity:.45;cursor:default}.btn.small{height:auto;min-height:26px;padding:0 9px;font-size:.7812rem}.btn.primary{background:var(--accent);color:var(--accent-ink);border-color:#0000;font-weight:600}.btn.primary:hover:not(:disabled){background:color-mix(in srgb, var(--accent) 88%, var(--text))}.btn.danger{color:var(--err)}.icon-btn{width:30px;height:30px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;place-items:center;display:inline-grid}.icon-btn:hover:not(:disabled){background:var(--raise-2);color:var(--text)}.icon-btn:disabled{opacity:.4;cursor:default}.icon-btn.small{width:24px;height:24px}.icon-btn.on,.icon-btn[aria-pressed=true]{color:var(--accent)}.icon-btn.recording{color:var(--err)}input[type=search],input[type=text],input[type=password],select,textarea{background:var(--raise);border:1px solid var(--line);border-radius:var(--r);min-height:32px;padding:6px 10px}input:focus,select:focus,textarea:focus{border-color:var(--line-2);box-shadow:0 0 0 1px var(--line-2);outline:none}.chips{flex-wrap:wrap;gap:6px;display:flex}.chip{border:1px solid var(--line);min-height:26px;color:var(--muted);cursor:pointer;background:0 0;border-radius:13px;padding:0 10px;font-size:.7812rem}.chip[aria-pressed=true]{background:var(--raise-2);color:var(--text);border-color:var(--line-2)}.chip .count{color:var(--accent);margin-left:4px}.card{background:var(--raise);border:1px solid var(--line);border-radius:10px;padding:14px}.banner{border:1px solid var(--line);background:var(--side);border-radius:var(--r);justify-content:space-between;align-items:center;gap:12px;margin:8px 0;padding:8px 12px;display:flex}.banner.warn{border-color:color-mix(in srgb, var(--warn) 45%, var(--line));color:var(--warn);border-width:0 0 1px;border-radius:0;margin:0}.badge{background:var(--accent);min-width:18px;height:18px;color:var(--accent-ink);border-radius:9px;place-items:center;padding:0 5px;font-size:.6875rem;font-weight:700;display:inline-grid}.badge-pill{border:1px solid var(--line-2);color:var(--muted);border-radius:8px;margin-left:6px;padding:1px 6px;font-size:.6875rem}.badge-pill.off{color:var(--err)}.status{flex:none;place-items:center;width:14px;height:14px;display:inline-grid}.status-dot{background:var(--faint);border-radius:50%;width:7px;height:7px}.status.blocked .status-dot{background:var(--warn);box-shadow:0 0 0 3px color-mix(in srgb, var(--warn) 14%, transparent)}.status.error .status-dot{background:var(--err)}.spinner{border:1.6px solid color-mix(in srgb, var(--accent) 27%, transparent);border-top-color:var(--accent);border-radius:50%;flex:none;width:12px;height:12px;animation:.8s linear infinite spin;display:inline-block}.spinner.small{width:10px;height:10px}@keyframes spin{to{transform:rotate(360deg)}}.unread-dot{background:var(--accent);border-radius:50%;flex:none;width:6px;height:6px;margin-left:6px;display:inline-block}.online-dot{background:var(--faint);vertical-align:middle;border-radius:50%;width:6px;height:6px;margin-right:6px;display:inline-block}.online-dot.on{background:var(--ok)}.voice-dot{background:var(--ok);vertical-align:middle;border-radius:50%;flex:none;width:8px;height:8px;margin-right:6px;animation:1.8s ease-in-out infinite voice-dot-pulse;display:inline-block}@keyframes voice-dot-pulse{0%,to{box-shadow:0 0 0 0 color-mix(in srgb, var(--ok) 55%, transparent)}50%{box-shadow:0 0 0 4px color-mix(in srgb, var(--ok) 0%, transparent)}}@media (prefers-reduced-motion:reduce){.voice-dot{animation:none}}.shell{height:100%;display:flex;overflow:hidden}.sidebar{width:var(--side-w);background:var(--side);border-right:1px solid var(--line);flex-direction:column;flex:none;min-height:0;display:flex}.main{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;position:relative}.conn-banner{background:color-mix(in srgb, var(--warn) 16%, var(--bg));color:var(--warn);text-align:center;padding:3px;font-size:.7812rem}.side-top{justify-content:space-between;align-items:center;padding:10px 8px 6px 14px;display:flex}.brand{align-items:center;gap:8px;display:flex}.brand-mark{flex:none}.hub-mark{color:var(--mark);--mark-gap:var(--bg)}.hub-mark-gap{fill:var(--mark-gap)}.hub-mark-hub{fill:var(--accent)}.sidebar .hub-mark{--mark-gap:var(--side)}.brand-name{font-family:var(--serif);font-size:1.0625rem}.side-search{border:1px solid var(--line);border-radius:var(--r);color:var(--faint);background:var(--bg);align-items:center;gap:6px;margin:4px 10px;padding:0 8px;display:flex}.side-search input{width:100%;min-height:30px;box-shadow:none;background:0 0;border:0;padding:0}.side-new,.side-link{color:var(--text);border-radius:6px;align-items:center;gap:8px;margin:2px 8px;padding:6px 8px;display:flex}.side-new:hover,.side-link:hover,.side-link.active{background:var(--raise-2)}.side-link{color:var(--muted)}.side-head{color:var(--faint);justify-content:space-between;align-items:center;padding:10px 8px 0 16px;font-size:.75rem;display:flex}.side-scroll{flex:1;min-height:0;padding:0 6px 12px;overflow:auto}.side-section{margin-top:10px}.side-section-head{justify-content:space-between;align-items:center;height:24px;padding:0 4px 2px 10px;display:flex}.side-section-title{color:var(--faint);text-transform:none;letter-spacing:.02em;text-overflow:ellipsis;white-space:nowrap;font-size:.7188rem;overflow:hidden}.side-section.needs .side-section-title{color:var(--warn)}.side-section-head .icon-btn{opacity:0}.side-section:hover .side-section-head .icon-btn,.side-section-head .icon-btn:focus-visible{opacity:1}.side-list{margin:0;padding:0;list-style:none}.side-row{border-radius:6px;align-items:center;display:flex;position:relative}.side-row:hover,.side-row.active{background:var(--raise-2)}.side-row-link{min-width:0;color:var(--muted);flex:1;align-items:center;gap:8px;padding:5px 4px 5px 8px;display:flex}.side-row.active .side-row-link,.side-row.unread .side-row-link{color:var(--text)}.side-title{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.row-more{opacity:0;margin-right:2px}.side-row:hover .row-more,.side-row.active .row-more,.row-more[aria-expanded=true],.row-more:focus-visible{opacity:1}.side-empty{color:var(--faint);padding:12px;font-size:.7812rem}.side-foot{border-top:1px solid var(--line);padding:8px}.account{color:var(--muted);border-radius:6px;align-items:center;gap:8px;padding:6px;display:flex}.account:hover{background:var(--raise-2);color:var(--text)}.account-name{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.avatar{background:var(--raise-2);width:24px;height:24px;color:var(--text);border-radius:50%;flex:none;place-items:center;font-size:.75rem;font-weight:600;display:inline-grid}.avatar.admin{box-shadow:0 0 0 1.5px var(--accent)}.avatar.large{width:40px;height:40px;font-size:1.0625rem}.menu{z-index:50;background:var(--raise);border:1px solid var(--line-2);min-width:200px;max-width:320px;box-shadow:0 12px 32px var(--shadow);border-radius:10px;padding:4px;position:fixed}.menu-item{text-align:left;cursor:pointer;background:0 0;border:0;border-radius:6px;align-items:center;gap:6px;width:100%;padding:6px 8px;display:flex}.menu-item:hover:not(:disabled){background:var(--raise-2)}.menu-item.danger{color:var(--err)}.menu-check{width:14px;color:var(--accent)}.menu-label{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}.menu-hint{color:var(--faint);font-size:.75rem}.menu-section{color:var(--faint);padding:6px 8px 2px;font-size:.7188rem}.menu-sep{background:var(--line);height:1px;margin:4px 0}.mic-picker{width:280px}.level{background:var(--bg);border-radius:3px;height:6px;margin:8px;overflow:hidden}.level span{background:var(--ok);height:100%;transition:width 80ms linear;display:block}.dialog{background:var(--raise);color:var(--text);border:1px solid var(--line-2);border-radius:12px;width:min(520px,94vw);max-height:84vh;padding:0}.dialog::backdrop{background:#0009}.dialog-head{justify-content:space-between;align-items:center;padding:12px 14px 6px;display:flex}.dialog-head h2{margin:0;font-size:.9375rem;font-weight:600}.dialog-body{max-height:calc(84vh - 56px);padding:4px 14px 14px;overflow:auto}.add-app-body{gap:10px;display:grid}.add-app .qr{width:min(260px,70vw);height:auto;image-rendering:pixelated;border-radius:8px;margin:4px auto;display:block}.add-app-link{word-break:break-all;background:var(--bg);border:1px solid var(--line-2);-webkit-user-select:all;user-select:all;border-radius:6px;padding:6px 8px;font-size:.7188rem}.add-app-countdown{font-variant-numeric:tabular-nums}.add-app-expired{justify-items:center;gap:8px;padding:24px 0;display:grid}.picker-search{width:100%;margin-bottom:8px}.picker-list{max-height:55vh;margin:0;padding:0;list-style:none;overflow:auto}.picker-group{text-transform:none;padding:8px 8px 2px;font-weight:600}.picker-note{margin:0 0 6px}.picker-opt{cursor:pointer;text-align:left;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;width:100%;padding:7px 8px;display:flex}.picker-opt:hover,.picker-opt.active{background:var(--raise-2)}.picker-opt[aria-selected=true] .po-name{color:var(--accent)}.po-name{text-overflow:ellipsis;flex:1;min-width:0;overflow:hidden}.po-mark{color:var(--accent);font-size:.75rem}.toast{left:50%;bottom:calc(24px + env(safe-area-inset-bottom));z-index:60;background:var(--raise-2);border:1px solid var(--line-2);box-shadow:0 8px 24px var(--shadow);border-radius:10px;align-items:center;gap:10px;max-width:92vw;padding:8px 12px;display:flex;position:fixed;transform:translate(-50%)}.toast.err{border-color:#6a3036}.toast.warn{border-color:#5a4a2a}.topbar{border-bottom:1px solid var(--line);flex:none;align-items:center;gap:8px;height:max(48px,2.4rem);padding:0 12px;display:flex}.topbar-title{flex:1;align-items:center;gap:8px;min-width:0;display:flex}.topbar .title{text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:.875rem;font-weight:500;overflow:hidden}.title-btn{all:unset;cursor:text;text-overflow:ellipsis;white-space:nowrap;border-radius:4px;display:block;overflow:hidden}.title-btn:hover,.title-btn:focus-visible{box-shadow:0 0 0 1px var(--line-2)}input[type=text].rename-field{width:100%;min-width:0;min-height:26px;font:inherit;color:var(--text);flex:1;padding:2px 6px}.topbar input.rename-field.title{max-width:520px}.rename-wrap{vertical-align:middle;flex:1;align-items:center;gap:4px;width:100%;min-width:0;max-width:100%;display:inline-flex}.topbar .rename-wrap{max-width:560px}.auto-name-btn{flex:none;font-size:14px;line-height:1}.naming{white-space:nowrap;flex:none;align-items:center;gap:4px;margin-left:6px;font-weight:400;display:inline-flex}.chip-server{color:var(--muted);border:1px solid var(--line);white-space:nowrap;border-radius:13px;align-items:center;gap:4px;max-width:420px;padding:2px 10px;font-size:.75rem;display:inline-flex;overflow:hidden}.chip-server .place-where{text-overflow:ellipsis;min-width:0;overflow:hidden}.session-place{color:var(--muted);border-bottom:1px solid var(--line);white-space:nowrap;flex:none;align-items:center;gap:4px;padding:4px 12px;font-size:.75rem;display:flex;overflow:hidden}.session-place .place-machine{color:var(--text,inherit);font-weight:500}.session-place .place-where,.session-place .place-branch{text-overflow:ellipsis;min-width:0;overflow:hidden}.session-place .icon{flex:none;width:12px;height:12px;margin-left:4px}.chip-server .icon{width:12px;height:12px;margin-left:6px}.chip-evidence{color:var(--muted);border:1px dashed var(--line);white-space:nowrap;cursor:help;border-radius:13px;align-items:center;padding:2px 10px;font-size:.75rem;display:inline-flex}.chip-evidence.screen,.chip-evidence.unknown{color:var(--warn);border-color:#5a4a2a}.btn.changes{font-family:var(--mono)}.add{color:var(--add)}.del{color:var(--del)}.home-shell{flex-direction:column;height:100%;min-height:0;display:flex}.home-scroll{flex:1;overflow:auto}.home{max-width:1180px;margin:0 auto;padding:24px 28px 48px}.home-head{justify-content:space-between;align-items:center;margin-bottom:12px;display:flex}.home-head h1{margin:0;font-size:1.75rem}.home-tools{gap:8px;margin:12px 0 8px;display:flex}.search{border:1px solid var(--line);border-radius:var(--r);background:var(--raise);color:var(--faint);flex:1;align-items:center;gap:8px;padding:0 10px;display:flex}.search input{width:100%;box-shadow:none;background:0 0;border:0}.count{margin:10px 0 4px;font-size:.75rem}.sessions-table{border-collapse:collapse;table-layout:fixed;width:100%}.sessions-table th{text-align:left;color:var(--faint);border-bottom:1px solid var(--line);padding:0;font-size:.75rem;font-weight:500}.th-btn{color:inherit;cursor:pointer;background:0 0;border:0;gap:4px;padding:8px 6px;display:inline-flex}.th-btn:hover{color:var(--text)}.sort-mark{color:var(--accent)}.sessions-table td{border-bottom:1px solid var(--line);text-overflow:ellipsis;white-space:nowrap;color:var(--muted);padding:7px 6px;overflow:hidden}.sessions-table tbody tr{cursor:pointer}.sessions-table tbody tr:hover{background:var(--side)}.sessions-table .col-title a{color:var(--text)}.sessions-table tr.unread .col-title a{font-weight:600}.col-status{width:64px}.col-pick{text-align:center;width:32px}.col-pick input{vertical-align:middle;cursor:pointer;margin:0}.home-tools .btn.small{min-height:32px}.bulk-bar{border:1px solid var(--line);border-radius:var(--r);background:var(--raise);align-items:center;gap:8px;margin:8px 0 0;padding:6px 10px;font-size:.8125rem;display:flex}.bulk-bar span{margin-right:auto}.archive-inactive{flex-direction:column;gap:12px;display:flex}.archive-inactive input[type=number]{background:var(--raise);border:1px solid var(--line);border-radius:var(--r);width:120px;min-height:32px;padding:6px 10px}.dialog-actions{justify-content:flex-end;gap:8px;display:flex}.col-title{width:30%}.col-project{width:16%}.col-server,.col-source{width:9%}.col-activity{width:10%}.col-actions{text-align:right;width:40px}.empty-cell{text-align:center;padding:24px!important}.home-list{margin:0;padding:0;list-style:none}.home-item{border-bottom:1px solid var(--line);align-items:center;display:flex}.home-item-link{flex:1;align-items:center;gap:10px;min-width:0;padding:10px 4px;display:flex}.home-item-text{flex-direction:column;flex:1;min-width:0;display:flex}.home-item-title,.home-item-meta{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.home-item.unread .home-item-title{font-weight:600}.home-item-meta{font-size:.7812rem}.offline-line{margin-top:10px}.empty{text-align:center;padding:48px 16px}.empty .display{margin:0 0 6px;font-size:1.375rem}.session-layout{height:100%;min-height:0;display:flex}.session-main{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;position:relative}.scroller{overflow-anchor:none;flex:1;min-height:0;overflow:auto}.history-sentinel{height:1px}.history-edge{text-align:center;justify-content:center;align-items:center;gap:8px;margin:16px 0 0;display:flex}.history-edge.error{color:var(--err)}.column{max-width:var(--col);margin:0 auto;padding:0 20px}.column.narrow{max-width:560px;padding-top:40px}.transcript{flex-direction:column;gap:14px;padding:24px 0 8px;display:flex}.msg.user{align-self:flex-end;align-items:flex-end;gap:6px;max-width:85%;display:flex}.user-body{flex-direction:column;align-items:flex-end;gap:6px;min-width:0;display:flex}.msg-images{flex-wrap:wrap;justify-content:flex-end;gap:6px;display:flex}.msg-image{border:1px solid var(--line-2);background:var(--raise-2);border-radius:10px;display:block;overflow:hidden}.msg-image img{object-fit:contain;max-width:min(220px,60vw);max-height:220px;display:block}.file-chip{background:var(--raise-2);color:var(--muted);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;align-items:center;gap:6px;max-width:240px;padding:4px 10px;font-size:.7812rem;display:inline-flex;overflow:hidden}.file-chip .icon{flex:none;width:14px;height:14px}.pill{background:var(--raise-2);white-space:pre-wrap;overflow-wrap:anywhere;border-radius:14px;padding:8px 14px}.msg-note{text-align:right;overflow-wrap:anywhere;margin:0}.tick{color:var(--faint);font-size:.6875rem}.tick.heard{color:var(--ok)}.tick.failed{color:var(--err)}.tick.queued{color:var(--warn)}.user-body{position:relative}.msg-tools{z-index:2;background:var(--raise);border:1px solid var(--line-2);opacity:0;pointer-events:none;border-radius:8px;gap:2px;margin-top:2px;padding:2px;transition:opacity .12s;display:flex;position:absolute;top:100%;right:0;box-shadow:0 2px 8px #0000001f}.msg-tools .icon-btn{width:28px;height:28px}.msg-tools .icon-btn[aria-disabled=true]{opacity:.4;cursor:default}.msg.user:hover .msg-tools,.msg.user:focus-within .msg-tools,.msg.user.tools-open .msg-tools{opacity:1;pointer-events:auto}.msg-more{opacity:.35;align-self:center;width:26px;height:26px;display:inline-grid}.msg.user:hover .msg-more,.msg.user:focus-within .msg-more,.msg.user.tools-open .msg-more{opacity:1}@media (hover:none){.msg-more{opacity:1}.msg.user:hover:not(.tools-open):not(:focus-within) .msg-tools{opacity:0;pointer-events:none}}.revert-banner{background:var(--raise-2);border:1px solid var(--line-2);border-radius:10px;align-items:center;gap:8px;margin:0 0 8px;padding:6px 8px 6px 12px;font-size:.8125rem;display:flex}.revert-banner .icon{width:16px;height:16px;color:var(--muted);flex:none}.revert-banner .revert-text{flex:1;min-width:0}.hub-msg-delivery{color:var(--warn);font-size:.6875rem}.composer-unavailable{align-items:center;gap:10px;padding:10px 2px;display:flex}.composer-unavailable p{flex:1;margin:0}.msg.assistant{overflow-wrap:anywhere;line-height:1.6}.msg.assistant.live .md>:is(p,h3,h4,h5,h6):last-child:after,.msg.assistant.live .md>:is(ul,ol):last-child>li:last-child>p:last-child:after{content:"▍";color:var(--accent);animation:1s steps(2,end) infinite blink}@keyframes blink{50%{opacity:0}}.md>:first-child{margin-top:0}.md>:last-child{margin-bottom:0}.md{min-width:0}.md p{margin:0 0 .7em}.md h3,.md h4,.md h5,.md h6{letter-spacing:-.005em;color:var(--violet);margin:1.15em 0 .45em;font-weight:600;line-height:1.35}.md h3{border-bottom:1px solid var(--line);padding-bottom:.25em;font-size:1.14em}.md h4{font-size:1.05em}.md h5,.md h6{color:color-mix(in srgb, var(--violet) 72%, var(--muted));font-size:1em}.md ul,.md ol{margin:0 0 .7em;padding-left:1.5em}.md li{margin:.15em 0}.md li::marker{color:var(--orange)}.md li>p{margin:0}.md li>:is(ul,ol){margin:.15em 0 .2em}.md :is(ul,ol).loose>li{margin:.35em 0}.md :is(ul,ol).loose>li>p{margin:0 0 .5em}.md :is(ul,ol).loose>li>p:last-child{margin-bottom:0}.md li.task{list-style:none;position:relative}.md li.task>input[type=checkbox]{width:.95em;height:.95em;accent-color:var(--accent);margin:0;position:absolute;top:.3em;left:-1.35em}.md li.task>input:checked~p{color:var(--muted)}.md .inline-code{color:var(--ok);background:color-mix(in srgb, var(--accent) 9%, var(--raise-2));border:1px solid color-mix(in srgb, var(--accent) 24%, var(--line));overflow-wrap:anywhere;border-radius:5px;padding:.05em .35em;font-size:.88em}.md a .inline-code{color:inherit}.md :is(th,td) .inline-code{white-space:nowrap;overflow-wrap:normal}.md strong{color:var(--orange);font-weight:600}.md del{color:var(--faint)}.md mark{background:color-mix(in srgb, var(--orange) 18%, transparent);color:var(--orange);-webkit-box-decoration-break:clone;box-decoration-break:clone;border-radius:3px;padding:0 .15em}.md .md-image{color:var(--accent)}.md .md-image:before{content:"🖼 "}.md blockquote{border-left:3px solid var(--line-2);color:var(--muted);margin:0 0 .7em;padding:.15em 0 .15em .85em}.md blockquote>:last-child{margin-bottom:0}.md a{color:var(--ok);text-decoration:underline;-webkit-text-decoration-color:color-mix(in srgb, var(--ok) 40%, transparent);text-decoration-color:color-mix(in srgb, var(--ok) 40%, transparent);text-underline-offset:2px;overflow-wrap:anywhere}.md a:hover{text-decoration-color:currentColor}.md hr{border:0;border-top:1px solid var(--line);margin:1em 0}.md .table-wrap{border:1px solid var(--line);border-radius:var(--r);max-width:100%;margin:0 0 .8em;overflow-x:auto}.md table{border-collapse:collapse;min-width:100%;font-size:.93em;line-height:1.45}.md th,.md td{border-bottom:1px solid var(--line);text-align:left;vertical-align:top;overflow-wrap:normal;padding:.4em .75em}.md th{background:var(--side);color:var(--text);white-space:nowrap;font-weight:600}.md tbody tr:last-child td{border-bottom:0}.md tbody tr:nth-child(2n) td{background:color-mix(in srgb, var(--text) 3%, transparent)}.md th+th,.md td+td{border-left:1px solid var(--line)}.md .code-block{border:1px solid var(--line);border-radius:var(--r);background:var(--side);margin:0 0 .8em;overflow:hidden}.md .code-head{border-bottom:1px solid var(--line);color:var(--faint);align-items:center;gap:2px;padding:2px 4px 2px 10px;font-size:.8em;display:flex}.md .code-lang{font-family:var(--mono);text-transform:lowercase;flex:1}.md .code-btn{color:var(--muted);cursor:pointer;font-size:inherit;background:0 0;border:0;border-radius:5px;min-height:24px;padding:3px 8px}.md .code-btn:hover{background:var(--raise-2);color:var(--text)}.md .code-btn[aria-pressed=true]{color:var(--accent)}.md pre.code{background:0 0;border:0;border-radius:0;margin:0;padding:.7em .9em;line-height:1.5;overflow:auto}.md .code-block.wrap pre.code{white-space:pre-wrap;overflow-wrap:anywhere}.md pre code{background:0 0;padding:0}.tok-comment{color:var(--faint);font-style:italic}.tok-string{color:var(--ok)}.tok-number{color:var(--orange)}.tok-keyword{color:var(--violet)}.tok-type,.tok-attr{color:var(--orange)}.tok-fn,.tok-meta{color:var(--blue)}.tok-prop,.tok-tag{color:var(--err)}.tok-add{color:var(--add);background:color-mix(in srgb, var(--add) 10%, transparent)}.tok-del{color:var(--del);background:color-mix(in srgb, var(--del) 10%, transparent)}pre.code{white-space:pre;font-size:.75rem}.fold-head{color:var(--muted);cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:2px 0;font-size:.8125rem;display:inline-flex}.fold-head:hover:not(:disabled){color:var(--text)}.fold-head:disabled{cursor:default}.fold-head .chev{width:13px;height:13px;transition:transform .15s}.fold-head[aria-expanded=true] .chev{transform:rotate(90deg)}.fold.has-failed .fold-head{color:#c9a0a4}.fold-body{border-left:1px solid var(--line);margin:6px 0 0 2px;padding-left:12px}.reasoning{color:var(--muted);white-space:pre-wrap;max-height:320px;font-size:.8125rem;overflow:auto}.reasoning.hidden-reasoning{font-style:italic}.tool-list{list-style:none}.tool-head{cursor:pointer;text-align:left;background:0 0;border:0;align-items:center;gap:8px;width:100%;padding:3px 0;font-size:.8125rem;display:flex}.tool-mark{width:14px;color:var(--ok);font-size:.6875rem}.tool.failed .tool-mark{color:var(--err)}.tool-name{font-family:var(--mono);font-size:.7812rem}.tool-summary{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:.7812rem;overflow:hidden}.tool-detail pre{background:var(--side);border:1px solid var(--line);border-radius:6px;max-height:360px;padding:8px;overflow:auto}.hub-msg{border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:var(--r);max-width:85%;padding:6px 10px}.hub-msg.out{align-self:flex-end}.hub-msg-head{color:var(--muted);align-items:center;gap:6px;margin-bottom:2px;font-size:.7812rem;display:flex}.hub-msg-mark{color:var(--accent)}.hub-msg-kind{font-family:var(--mono);text-transform:uppercase;font-size:.7188rem}.hub-msg-label{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.hub-msg-text{white-space:pre-wrap;overflow-wrap:anywhere;font-size:.875rem}.hub-note .fold-body{color:var(--muted)}.subagent{border:1px solid var(--line);border-radius:var(--r);color:var(--muted);align-items:center;gap:8px;padding:8px 10px;display:flex}.subagent:hover{background:var(--side);color:var(--text)}.sub-mark{color:var(--accent);place-items:center;width:14px;display:inline-grid}.sub-label{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.sub-label strong{color:var(--text);font-weight:500}.subagent .chev{width:14px;height:14px}.note{color:var(--muted);margin:6px 0;font-size:.7812rem}.note.err{color:var(--err)}.working-line{align-items:center;gap:8px;margin:10px 0;font-size:.8125rem;display:flex}.idle-line{margin:12px 0 20px}.empty-session{text-align:center;padding-top:18vh}.blocker{border-color:#5a4a2a;margin:12px 0}.blocker-head{color:var(--warn);margin:0 0 4px}.blocker-text{white-space:pre-wrap;overflow-wrap:anywhere;margin:0 0 10px;font-size:.7812rem}.decisions{margin:12px 0}.decisions .section-title{color:var(--warn);margin:0 0 6px;font-size:.875rem}.decision{border-color:#5a4a2a;margin:12px 0}.decision.urgency-high{border-color:var(--err)}.decision.targeted{box-shadow:0 0 0 2px var(--accent)}.decision-question{font-size:.875rem}.decision-deadline{color:var(--warn);margin:0 0 8px}.decision-deadline.overdue{color:var(--err)}.decision .badge-pill.urgency.high{color:var(--err);border-color:var(--err)}.decision .badge-pill.recommended{color:var(--accent);border-color:var(--accent)}.decision .badge-pill.safe{color:var(--ok);border-color:var(--ok)}.decision .choice.recommended>span:first-of-type{font-weight:600}.decision-why{margin:6px 0}.decision-note,.decision textarea{width:100%;margin:6px 0}.decision-tier{margin:4px 0 8px}.decision .badge-pill.agent-request{color:var(--warn);border-color:var(--warn)}.escalation-details{grid-template-columns:max-content 1fr;gap:2px 12px;margin:0 0 10px;display:grid}.escalation-details dt{color:var(--muted)}.escalation-details dd{overflow-wrap:anywhere;min-width:0;margin:0}.escalation-resource{margin:0 6px 2px 0;display:inline-block}.blocker-recommendation{color:var(--accent);margin:-4px 0 10px}.answered-by{margin:6px 0}.blocker .answered-by{margin:8px 0 0}.grant-row .grant-facts{grid-template-columns:max-content 1fr;gap:2px 12px;margin:4px 0 0;display:grid}.grant-row .grant-facts dt{color:var(--muted)}.grant-row .grant-facts dd{overflow-wrap:anywhere;min-width:0;margin:0}.grant-row.ended{opacity:.6}.badge-pill.active{color:var(--ok);border-color:var(--ok)}.grant-form{flex-direction:column;gap:12px;display:flex}.grant-form label.text-field{flex-direction:column;gap:4px;display:flex}.grant-form textarea,.grant-form input[type=text]{width:100%}.grant-verbs{border:0;flex-wrap:wrap;gap:4px 14px;margin:0;padding:0;display:flex}.audit-row .audit-result.ok{color:var(--ok)}.audit-row .audit-result.warn{color:var(--warn)}.audit-row .audit-result.err{color:var(--err)}.form-card fieldset{border:0;min-width:0;margin:0;padding:0}.form-card fieldset:disabled{opacity:.6}.form-field{flex-direction:column;gap:4px;margin:0 0 12px;display:flex}.field-title{font-weight:500}.field-desc{display:block}.choice-group{flex-direction:column;gap:4px;display:flex}.choice,.check{cursor:pointer;align-items:baseline;gap:8px;display:flex}.choice-group input[type=text],.form-field>input[type=text]{width:100%}.field-error{color:var(--err);margin:0}.dock{padding:8px 0 calc(12px + env(safe-area-inset-bottom));background:linear-gradient(transparent, var(--bg) 18px);flex:none}.composer-box{border:1px solid var(--line-2);background:var(--raise);border-radius:14px;padding:10px 10px 6px 14px}.composer-box:focus-within{border-color:var(--line-2)}.composer textarea{resize:none;width:100%;min-height:24px;max-height:280px;box-shadow:none;background:0 0;border:0;padding:0;line-height:1.5}.composer.dragging .composer-box{border-color:var(--accent);border-style:dashed}.attachments{flex-wrap:wrap;gap:8px;margin:0 0 8px;padding:0;list-style:none;display:flex}.attachment{border:1px solid var(--line-2);background:var(--raise-2);border-radius:10px;justify-content:center;align-items:center;width:64px;height:64px;display:flex;position:relative;overflow:hidden}.attachment img{object-fit:cover;width:100%;height:100%;display:block}.attachment-remove{color:#fff;cursor:pointer;background:#000000a6;border:0;border-radius:50%;justify-content:center;align-items:center;width:22px;height:22px;padding:0;display:flex;position:absolute;top:3px;right:3px}.attachment-remove .icon{width:13px;height:13px}.composer-actions{align-items:center;gap:4px;margin-top:4px;display:flex}.composer-meta{align-items:center;gap:6px;padding:6px 4px 0;display:flex}.composer-meta>.muted{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.composer-error{color:var(--err);margin:0 0 6px;font-size:.7812rem}.composer-hint{margin:0 0 6px}.btn.send{border-radius:8px;min-width:30px;height:30px;padding:0 9px}.btn.send.steer{padding:0 12px}.btn.stop{height:30px;color:var(--text)}.split{border:1px solid var(--line-2);border-radius:8px;height:30px;display:inline-flex;overflow:hidden}.split button{color:var(--muted);cursor:pointer;background:0 0;border:0;place-items:center;display:grid}.split button:hover:not(:disabled){background:var(--raise-2);color:var(--text)}.split button:disabled{opacity:.4;cursor:default}.split-main{width:32px}.split.on .split-main{background:var(--accent);color:var(--accent-ink)}.split.on .split-main:hover:not(:disabled){background:var(--accent);color:var(--accent-ink);filter:brightness(1.08)}.voice-pill{border:1px solid var(--accent);min-height:28px;color:var(--accent);border-radius:999px;align-items:center;gap:6px;min-width:0;max-width:320px;padding:0 4px 0 8px;font-size:.75rem;display:inline-flex}.voice-pill .icon{flex:none;width:14px;height:14px}.voice-pill-link{color:inherit;text-overflow:ellipsis;white-space:nowrap;min-width:0;text-decoration:none;overflow:hidden}.voice-pill-link strong{color:var(--text);font-weight:500}.voice-pill .btn.small{height:22px;padding:0 8px}.voice-strip{justify-content:flex-end;padding:8px 12px 0;display:flex}.side-row.voice-here .side-title{color:var(--accent)}.voice-error{margin:0 0 8px}.split-chev{width:20px;border-left:1px solid var(--line-2)!important}.split-chev .icon{width:12px;height:12px}.split.on{border-color:var(--accent)}.split.on .split-main{color:var(--accent)}.model-chip{color:var(--faint);cursor:pointer;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:0;border-radius:6px;max-width:220px;padding:2px 6px;font-size:.75rem;overflow:hidden}.model-chip:hover{background:var(--raise-2);color:var(--text)}.voice-bar{border:1px solid var(--line-2);background:var(--side);border-radius:12px;align-items:center;gap:10px;margin-bottom:8px;padding:6px 8px 6px 12px;display:flex}.voice-bar.paused{opacity:.8}.voice-bar.suspended{border-color:#5a4a2a;flex-wrap:wrap}.voice-bar.suspended .voice-state{color:var(--warn);flex:12em;min-width:0}.voice-bar.suspended .wave span{background:var(--warn)}.wave{align-items:center;gap:3px;height:22px;display:flex}.wave span{background:var(--accent);transform-origin:50%;border-radius:2px;width:3px;height:22px;transition:transform 80ms linear}.voice-bar.speaking .wave span{animation:.9s ease-in-out infinite talk}.voice-bar.speaking .wave span:nth-child(2){animation-delay:.15s}.voice-bar.speaking .wave span:nth-child(3){animation-delay:.3s}.voice-bar.speaking .wave span:nth-child(4){animation-delay:.45s}@keyframes talk{50%{transform:scaleY(.25)}}.voice-state{font-size:.8125rem}.voice-ignored{color:var(--faint);font-style:italic}.btn.end{color:var(--err)}.rail{width:var(--rail-w);border-left:1px solid var(--line);background:var(--bg);flex:none;padding:0 12px 24px;overflow:auto}.panel-handle{z-index:6;cursor:col-resize;touch-action:none;outline:none;flex:none;width:6px;margin:0 -3px;position:relative}.panel-handle:before{content:"";background:0 0;width:1px;transition:background .12s;position:absolute;top:0;bottom:0;left:50%;transform:translate(-50%)}.panel-handle:hover:before,.panel-handle.dragging:before,.panel-handle:focus-visible:before{background:var(--accent);width:2px}html.resizing,html.resizing *{cursor:col-resize!important;-webkit-user-select:none!important;user-select:none!important}html.resizing iframe{pointer-events:none}.workspace{flex-direction:column;flex:1;min-height:0;display:flex}.pane-grid{flex:1;min-height:0;display:grid}.pane{outline:none;flex-direction:column;min-width:0;min-height:0;display:flex;container-type:inline-size}.pane[hidden]{display:none}.pane>.session-layout{flex:1;height:auto;min-height:0}.workspace.ws-split .pane{box-shadow:inset 0 0 0 1px var(--line)}.workspace.ws-split .pane[data-focused]{box-shadow:inset 0 2px 0 var(--accent), inset 0 0 0 1px var(--line)}.pane:focus-visible{box-shadow:inset 0 0 0 2px var(--accent)!important}.pane-bar{border-bottom:1px solid var(--line);flex:none;align-items:center;gap:6px;padding:4px 12px;display:flex}.pane-count{margin-left:auto;font-size:.75rem}.pane-tools{flex:none;gap:2px;display:inline-flex}@container (width<=720px){.pane .chip-server{display:none}}.icon-btn.flip svg{transform:rotate(180deg)}.pane-handle{width:auto;margin:0}.pane-handle[data-axis=rows]{cursor:row-resize}.pane-handle[data-axis=rows]:before{width:auto;height:1px;inset:50% 0 auto;transform:translateY(-50%)}.pane-handle[data-axis=rows]:hover:before,.pane-handle[data-axis=rows].dragging:before,.pane-handle[data-axis=rows]:focus-visible:before{width:auto;height:2px}html.resizing-rows,html.resizing-rows *{cursor:row-resize!important;-webkit-user-select:none!important;user-select:none!important}.pane-tabs{border-bottom:1px solid var(--line);scrollbar-width:none;flex:none;display:flex;overflow-x:auto}.pane-tab{border-bottom:2px solid #0000;flex:none;align-items:center;min-width:0;max-width:60%;padding-right:4px;display:flex}.pane-tab.selected{border-bottom-color:var(--accent)}.pane-tab [role=tab]{min-height:40px;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;cursor:pointer;background:0 0;border:0;padding:0 4px 0 12px;overflow:hidden}.pane-tab.selected [role=tab]{color:var(--text)}.rail-head{justify-content:space-between;align-items:center;height:48px;display:flex}.rail-title{color:var(--muted);font-size:.8125rem}.rail-card{border-top:1px solid var(--line);padding:12px 0}.rail-card h3{color:var(--faint);justify-content:space-between;margin:0 0 8px;font-size:.75rem;font-weight:500;display:flex}.kv{grid-template-columns:64px 1fr;gap:4px 8px;margin:0;font-size:.7812rem;display:grid}.kv dt{color:var(--faint)}.kv dd{text-overflow:ellipsis;white-space:nowrap;margin:0;overflow:hidden}.kv dd.kv-path{align-items:center;gap:4px;display:flex}.kv-path .path-tail{text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;flex:1;min-width:0;overflow:hidden}.kv-path .icon-btn{flex:none;width:22px;height:22px}.meter{background:var(--raise-2);border-radius:3px;height:6px;margin-bottom:6px;overflow:hidden}.meter span{background:var(--accent);height:100%;display:block}.meter span.hot{background:var(--warn)}.mcp-list,.file-list{margin:0;padding:0;list-style:none}.mcp-list li{align-items:center;gap:8px;padding:2px 0;font-size:.7812rem;display:flex}.mcp-name{text-overflow:ellipsis;flex:1;overflow:hidden}.mcp-dot{background:var(--faint);border-radius:50%;width:6px;height:6px}.mcp-dot.connected{background:var(--ok)}.mcp-dot.failed,.mcp-dot.needs_auth{background:var(--err)}.mcp-dot.pending{background:var(--warn)}.diffstat{font-family:var(--mono);font-size:.75rem}.file{cursor:pointer;text-align:left;background:0 0;border:0;border-radius:5px;align-items:center;gap:6px;width:100%;padding:3px 4px;font-size:.7812rem;display:flex}.file:hover{background:var(--raise-2)}.file-status{font:600 .6562rem var(--mono);width:14px;color:var(--warn)}.file-status.added{color:var(--add)}.file-status.deleted{color:var(--del)}.file-name{text-overflow:ellipsis;white-space:nowrap;text-align:left;min-width:0;font-family:var(--mono);direction:rtl;flex:1;overflow:hidden}.diff-panel{z-index:20;background:var(--side);border:1px solid var(--line-2);border-radius:12px;flex-direction:column;display:flex;position:absolute;inset:48px 12px 12px;box-shadow:0 16px 48px #000a}.diff-head{border-bottom:1px solid var(--line);align-items:center;gap:10px;padding:8px 10px;display:flex}.diff-head select{min-width:0;font-family:var(--mono);flex:1;font-size:.7812rem}.wrap-toggle{align-items:center;gap:4px;display:inline-flex}.diff-body{flex:1;overflow:auto}table.diff{border-collapse:collapse;width:100%;font:.75rem/1.55 var(--mono)}table.diff td{vertical-align:top;padding:0 8px}table.diff .ln{width:1%;color:var(--faint);text-align:right;-webkit-user-select:none;user-select:none;white-space:nowrap}table.diff .code-line{white-space:pre}.diff-body.wrap table.diff .code-line{white-space:pre-wrap;overflow-wrap:anywhere}table.diff tr.add{background:#7fb68518}table.diff tr.del{background:#e06c7518}table.diff tr.hunk td{color:var(--faint);background:var(--raise);padding:3px 8px}table.diff .sign{color:var(--faint);margin-right:8px}.settings,.new-session{flex-direction:column;height:100%;min-height:0;display:flex}.settings-body{flex:1;gap:28px;padding:0 24px;display:flex;overflow:auto}.settings-nav{flex-direction:column;flex:none;align-self:flex-start;gap:2px;width:200px;padding-top:20px;display:flex;position:sticky;top:0}.settings-nav a{color:var(--muted);border-radius:6px;padding:6px 10px}.settings-nav a:hover{background:var(--raise-2);color:var(--text)}.settings-nav a[aria-current=page]{background:var(--raise-2);color:var(--text);box-shadow:inset 2px 0 0 var(--accent);font-weight:500}.settings-search{margin-bottom:10px}.settings-search input{width:100%}.settings-content{flex:1;min-width:0;max-width:720px;padding:12px 0 48px}.settings-page-title{font:400 1.5rem var(--serif);margin:10px 0 4px}.settings-section{border-bottom:1px solid var(--line);padding:16px 0;scroll-margin-top:8px}.settings-section:last-child{border-bottom:0}.settings-section .section-title{font:400 1.125rem var(--serif);color:var(--text);margin:0 0 10px}.settings-section h3{color:var(--muted);font-size:.8125rem;font-weight:500}.settings-footer{margin-top:24px}.settings-results,.settings-list{border:1px solid var(--line);border-radius:10px;margin:8px 0;padding:0;list-style:none}.settings-results li,.settings-list li{border-bottom:1px solid var(--line)}.settings-results li:last-child,.settings-list li:last-child{border-bottom:0}.settings-results a,.settings-list a{color:inherit;align-items:center;gap:10px;padding:10px 12px;display:flex}.settings-results a{flex-direction:column;align-items:flex-start;gap:2px}.settings-results a:hover,.settings-list a:hover{background:var(--raise-2)}.settings-list .grow{flex-direction:column;gap:2px;min-width:0;display:flex}.settings-list .icon{color:var(--faint);flex:none}.settings-empty{padding:12px 0}.settings-hit{border-radius:6px;animation:2.4s ease-out settings-hit}@keyframes settings-hit{0%,40%{background:color-mix(in srgb, var(--accent) 22%, transparent);box-shadow:0 0 0 2px var(--accent)}to{background:0 0;box-shadow:0 0 0 2px #0000}}.list{border:1px solid var(--line);border-radius:10px;margin:0;padding:0;list-style:none}.list li{border-bottom:1px solid var(--line);flex-wrap:wrap;align-items:center;gap:8px;padding:10px 12px;display:flex}.list li:last-child{border-bottom:0}.list li.disabled{opacity:.6}.name{font-weight:500}.switches{flex-direction:column;gap:10px;margin:10px 0 0;padding:0;list-style:none;display:flex}.appearance-theme{justify-content:space-between;align-items:center;gap:12px;display:flex}.theme-toggle{border:1px solid var(--line);background:var(--raise-2);border-radius:999px;gap:2px;padding:3px;display:inline-flex}.theme-choice{min-height:28px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:999px;align-items:center;gap:5px;padding:2px 9px;font-size:.75rem;display:inline-flex}.theme-choice:hover{color:var(--text)}.theme-choice[aria-checked=true]{background:var(--raise);color:var(--text);box-shadow:0 1px 3px var(--shadow)}.switch{cursor:pointer;justify-content:space-between;align-items:center;gap:12px;display:flex}.speed{align-items:center;gap:12px;display:flex}.speed input{accent-color:var(--accent);flex:1}.account-card{align-items:center;gap:12px;display:flex}.field{flex-direction:column;gap:4px;display:flex}.field label,.field-label{color:var(--muted);font-size:.7812rem}.field .row input{flex:1}.field-error{color:var(--err);margin:0;font-size:.75rem}.inherit{color:var(--faint);margin:0}.speech-card{flex-direction:column;gap:10px;display:flex}.speech-card legend{color:var(--muted);padding:0 6px}.key-summary{margin:0;font-size:.8125rem}.entry{flex-direction:column;gap:14px;max-width:440px;margin:0 auto;padding:12vh 20px 40px;display:flex}.brand-big{align-items:center;gap:12px;margin:0;font-size:1.875rem;display:flex}.pair-code{font-family:var(--mono);letter-spacing:.3em;font-size:1.25rem}.greeting{margin:0 0 18px;font-size:1.625rem}details.card summary{cursor:pointer;color:var(--muted)}.drawer-backdrop,.sheet-backdrop{z-index:30;background:#0009;position:fixed;inset:0}@media (max-width:760px){.shell.phone .sidebar{z-index:40;width:min(86vw,320px);padding-top:env(safe-area-inset-top);position:fixed;inset:0 auto 0 0;box-shadow:8px 0 32px #000a}.topbar{padding-top:env(safe-area-inset-top);height:calc(48px + env(safe-area-inset-top))}.home{padding:16px 14px 40px}.home-head h1{font-size:1.5rem}.column{padding:0 14px}.chip-server,.btn.changes{display:none}.rail{z-index:40;border:1px solid var(--line-2);width:auto;max-height:72vh;padding-bottom:calc(24px + env(safe-area-inset-bottom));border-radius:16px 16px 0 0;position:fixed;bottom:0;left:0;right:0;box-shadow:0 -12px 40px #000a}.diff-panel{inset:calc(48px + env(safe-area-inset-top)) 0 0;border-radius:0}.settings-nav{display:none}.settings-body{padding:0 14px}.settings-page-title{display:none}.composer-meta .model-chip{max-width:40vw}.msg.user{max-width:92%}}.notify-status{border-radius:var(--r);border:1px solid var(--line);margin:8px 0;padding:8px 12px}.notify-status.warn{color:var(--warn);border-color:#5a4a2a}.notify-status.ok{color:var(--ok,inherit)}.notify-facts{grid-template-columns:max-content 1fr;gap:2px 12px;margin:0 0 8px;display:grid}.notify-facts dd{margin:0}.row-actions{flex-wrap:wrap;gap:8px;display:flex}.quiet-hours{flex-wrap:wrap;align-items:center;gap:8px;margin-top:6px;display:flex}.notify-summary{margin:4px 0 8px}.notify-status-row{flex-wrap:wrap;align-items:baseline;gap:4px 12px;margin:8px 0;display:flex}.notify-status-row .notify-status{flex:260px;margin:0}.notify-details summary{cursor:pointer;color:var(--muted)}.notify-details[open]{flex-basis:100%}.notify-details .notify-facts{margin:6px 0 0}.notify-group{border:1px solid var(--line);border-radius:10px;margin:8px 0 0}.notify-group>summary{cursor:pointer;flex-wrap:wrap;align-items:baseline;gap:4px 10px;padding:10px 12px;list-style:none;display:flex}.notify-group>summary::-webkit-details-marker{display:none}.notify-group>summary:before{content:"▸";color:var(--faint);width:.8em}.notify-group[open]>summary:before{content:"▾"}#notifications .notify-group>summary h4{margin:0}.notify-group-summary{text-align:right;flex:1;min-width:0}.notify-group>.switches{padding:0 12px 8px}.notify-group h4,#notifications h4{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;margin:14px 0 0;font-size:.8125rem;font-weight:500}.notify-kind{flex-direction:column;gap:2px;min-width:0;display:flex}.notify-kind .small{line-height:1.35}.switch input[type=checkbox]{flex:none}.notify-test{flex-wrap:wrap;align-items:center;gap:6px;display:inline-flex}.notify-test select{max-width:60vw}p.small.warn{color:var(--warn)}p.small.err{color:var(--err,#e5484d)}p.small.ok{color:var(--ok,inherit)}.voice-bar{flex-wrap:wrap}.voice-hint{color:var(--muted,inherit);flex-basis:100%;margin:2px 0 0}button.link{color:var(--accent,#fab283);cursor:pointer;font:inherit;background:0 0;border:0;padding:0;text-decoration:underline}.tap-to-start{width:100%;margin-bottom:8px;padding:14px;font-size:1.05em;display:block}.new-column{max-width:720px;padding-top:12vh}.new-composer .composer-box{padding:14px 12px 8px 16px}.new-composer textarea{resize:none;width:100%;min-height:72px;color:inherit;font:inherit;background:0 0;border:0;outline:0;font-size:.9375rem}.icon-send{background:var(--accent);width:32px;height:32px;color:var(--accent-ink);cursor:pointer;border:0;border-radius:50%;justify-content:center;align-items:center;display:inline-flex}.icon-send:disabled{background:var(--raise-2);color:var(--faint);cursor:not-allowed}.env-meta{flex-wrap:wrap;align-items:center;gap:4px;margin-top:8px;display:flex}.new-dir{overflow-wrap:anywhere;margin:6px 4px 0}.meta-chip{color:var(--faint);cursor:pointer;background:0 0;border:0;border-radius:6px;align-items:center;gap:6px;max-width:280px;padding:4px 8px;font-size:.7812rem;display:inline-flex}.meta-chip:hover:not(:disabled):not(.readonly){background:var(--raise-2);color:var(--text)}.meta-chip.readonly{cursor:default}.meta-chip .icon{flex:none;width:14px;height:14px}.meta-chip .online-dot{margin:0}.chip-text{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.chip-caret{opacity:.6}.toggle-chip input{margin:0}.folder-menu{width:360px;max-width:calc(100vw - 16px);padding:6px}.folder-search{box-sizing:border-box;width:100%;margin-bottom:4px}.folder-list{max-height:50vh;overflow:auto}.folder-list .menu-hint{text-overflow:ellipsis;white-space:nowrap;max-width:160px;overflow:hidden}.rail-card h3{align-items:center}.card-toggle{color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:4px;padding:0;display:inline-flex}.card-toggle:hover{color:var(--text)}.card-chevron{width:12px;height:12px;transition:transform .15s;transform:rotate(90deg)}.rail-card.collapsed .card-chevron{transform:rotate(0)}.rail-card.collapsed h3{margin-bottom:0}.new-column{box-sizing:border-box;width:100%}.menu-label{flex:1 0 auto;max-width:100%}.menu-hint{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:0;overflow:hidden}.crumb{white-space:nowrap;text-overflow:ellipsis;align-items:center;gap:4px;max-width:30%;font-size:.8125rem;text-decoration:none;display:inline-flex;overflow:hidden}.crumb:hover{color:var(--text)}.crumb-chev{width:12px;height:12px;transform:rotate(180deg)}.crumb-sep{margin:0 4px}.sync-note{z-index:30;pointer-events:none;background:var(--side);color:var(--muted,var(--faint));border:1px solid var(--line);border-radius:999px;padding:2px 10px;font-size:.857rem;position:absolute;top:6px;left:50%;transform:translate(-50%)}.sync-note.updated{color:var(--accent)}.jobs-badge{background:var(--line);min-width:16px;height:16px;color:var(--text);border-radius:8px;flex:none;justify-content:center;align-items:center;margin-left:4px;padding:0 4px;font-size:.75rem;line-height:1;display:inline-flex}.job-list{flex-direction:column;gap:6px;margin:0;padding:0;list-style:none;display:flex}.job{grid-template-columns:auto 1fr;align-items:center;column-gap:8px;display:grid}.job .muted{grid-column:2}.job-command{text-overflow:ellipsis;white-space:nowrap;font-size:.893rem;overflow:hidden}.job-dot{background:var(--faint);border-radius:50%;width:7px;height:7px}.job-dot.on{background:var(--accent)}.job-dot.bad{background:var(--warn)}.retry-note{color:var(--warn);margin:0 0 6px}.activity-hint{border:1px solid var(--accent);border-radius:var(--r);background:color-mix(in srgb, var(--accent) 10%, transparent);margin:6px 0 10px;padding:8px 10px;font-size:.929rem}.scroller,.home-scroll{touch-action:pan-x pan-y}@media (pointer:coarse){input[type=search],input[type=text],input[type=password],input[type=number],select,textarea,.composer textarea,.new-composer textarea{font-size:max(16px,1rem)}}.banner.session-error{border-width:0 0 1px;border-color:color-mix(in srgb, var(--err) 45%, var(--line));background:color-mix(in srgb, var(--err) 10%, var(--bg));color:var(--text);border-radius:0;justify-content:flex-start;align-items:flex-start;margin:0}.session-error-mark,.turn-error-mark{color:var(--err);flex:none;font-weight:600;line-height:1.4}.session-error-body,.turn-error-body{flex-direction:column;gap:2px;min-width:0;display:flex}.session-error-head,.turn-error-head{color:var(--err);flex-wrap:wrap;align-items:baseline;gap:4px 8px;display:flex}.session-error-status,.turn-error-status{border:1px solid;border-radius:999px;padding:0 6px;font-size:.75rem}.session-error-where{font-size:.8125rem}.session-error-message,.turn-error-message{overflow-wrap:anywhere;white-space:pre-wrap;max-height:8em;font-size:.8125rem;overflow:auto}.msg.turn-error{border:1px solid color-mix(in srgb, var(--err) 45%, var(--line));border-radius:var(--r);background:color-mix(in srgb, var(--err) 8%, transparent);align-items:flex-start;gap:8px;padding:8px 12px;display:flex}.msg.turn-retry{color:var(--muted);overflow-wrap:anywhere;align-items:baseline;gap:8px;margin:6px 0;font-size:.8125rem;display:flex}.msg.turn-retry.waiting{color:var(--warn)}.turn-retry-mark{flex:none}.error-badge{background:var(--err);min-width:16px;height:16px;color:var(--bg);border-radius:8px;flex:none;justify-content:center;align-items:center;margin-left:4px;font-size:.75rem;font-weight:700;line-height:1;display:inline-flex}.col-now.error,.home-item-meta.error{color:var(--err)}.rail-error{color:var(--err);border:1px solid color-mix(in srgb, var(--err) 45%, var(--line));border-radius:var(--r);overflow-wrap:anywhere;margin:0 0 10px;padding:6px 10px}@media (max-width:760px){.banner.session-error{padding:8px 14px}.session-error-message{max-height:5.5em}}
@@ -0,0 +1 @@
1
+ .te-status{flex-wrap:wrap;align-items:center;gap:6px;margin:0 0 6px;display:flex}.te-chip{border:1px solid var(--line-2);background:var(--bg);border-radius:999px;padding:2px 8px;font-size:.75rem;display:inline-block}.te-status[data-state=dirty] .te-chip:first-child,.te-status[data-state=draft] .te-chip:first-child{border-color:var(--warn);color:var(--text);background:color-mix(in srgb, var(--warn) 14%, transparent)}.te-status[data-state=published] .te-chip:first-child{border-color:var(--ok);background:color-mix(in srgb, var(--ok) 12%, transparent)}.te-chip-warn{border-color:var(--warn)}.te-toolbar,.te-row{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.te-toolbar{border-bottom:1px solid var(--line);margin-bottom:6px;padding:6px 0}.te-pending{margin:4px 0;font-size:.75rem}.te-form{border:1px solid var(--line);border-radius:var(--r);background:var(--bg);gap:8px;margin:8px 0;padding:10px;display:grid}.te-form-title{margin:0;font-size:.8125rem;font-weight:600}.te-field{flex:1;gap:2px;min-width:0;display:grid}.te-field>span:first-child{color:var(--muted);font-size:.75rem}:is(.te-panel,.tm-detail,.tm-dialog-form,.tm-picker) :is(input[type=text],input[type=search],input:not([type]),select,textarea),.dialog .te-form :is(input[type=text],input:not([type]),select,textarea){border:1px solid var(--line-2);border-radius:var(--r);background:var(--raise);min-height:32px;color:var(--text);font:inherit;box-sizing:border-box;width:100%;padding:4px 8px}.te-add input{flex:1;min-width:100px;width:auto!important}[aria-invalid=true]{border-color:var(--err)!important}.te-err{color:var(--err);font-size:.75rem}.te-warn{color:var(--warn);font-size:.75rem}.te-mode{border:none;gap:4px;margin:4px 0;padding:0;display:grid}.te-mode legend{color:var(--muted);margin-bottom:2px;padding:0;font-size:.75rem}.te-mode .wt-check,.te-role .wt-check,.tm-archived-toggle{align-items:center;gap:6px;display:flex}.te-roles,.te-paths,.te-list{gap:6px;margin:0;padding:0;list-style:none;display:grid}.te-role{border:1px solid var(--line);border-radius:var(--r);gap:4px;padding:6px 8px;display:grid}.te-notice{border:1px solid var(--line-2);border-radius:var(--r);background:var(--bg);margin:6px 0;padding:6px 10px}.te-notice p{margin:2px 0}.te-notice ul{margin:2px 0;padding-left:18px}.te-conflict,.te-needs_user,.te-error{border-color:var(--err)}.te-ok{border-color:var(--ok)}.te-preview{border:2px solid var(--accent);border-radius:var(--r);margin:6px 0;padding:8px 10px}.te-preview h3{text-transform:none;letter-spacing:0;color:var(--text);margin:0 0 6px;font-size:.9375rem}.te-preview ul{margin:0 0 6px;padding-left:18px}.te-problems{border:1px solid var(--err);border-radius:var(--r);color:var(--err);padding:6px 10px}.te-problems p,.te-problems ul{margin:2px 0}.te-memberships{color:var(--muted);margin:0;font-size:.75rem}.tm-members{gap:10px;display:grid}.tm-role{border:1px solid var(--line);border-radius:var(--r);background:var(--raise);gap:6px;padding:10px 12px;display:grid}.tm-role-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:6px;display:flex}.tm-role-name{flex-wrap:wrap;align-items:baseline;gap:6px;display:flex}.tm-count{font-size:.75rem}.tm-empty{margin:0;font-size:.8125rem}.tm-seats{gap:4px;margin:0;padding:0;list-style:none;display:grid}.tm-seat{border-radius:var(--r);background:var(--bg);flex-wrap:wrap;align-items:center;gap:6px 8px;padding:4px 6px;display:flex}.tm-seat-name{color:var(--text);font-weight:600}.tm-seat-facts{flex:1;min-width:140px;font-size:.75rem}.tm-dot{background:var(--faint,var(--muted));border-radius:50%;flex:none;width:8px;height:8px}.tm-dot.on{background:var(--ok)}.tm-role-actions{margin-top:2px}.tm-picker{width:min(560px,94vw)}.tm-picker form{gap:8px;display:grid}.tm-picker p{margin:0}.tm-choices{border:none;gap:4px;max-height:min(46vh,360px);margin:0;padding:0;display:grid;overflow:auto}.tm-choice{border:1px solid var(--line);border-radius:var(--r);cursor:pointer;align-items:flex-start;gap:8px;padding:8px;display:flex}.tm-choice .tm-dot{margin-top:6px}.tm-choice.chosen{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 10%, transparent)}.tm-choice.seated{opacity:.6;cursor:default}.tm-choice input{margin-top:3px}.tm-choice-text{gap:1px;min-width:0;display:grid}.tm-choice-note{color:var(--muted);font-size:.75rem}.tm-picker-actions{flex-wrap:wrap}.tm-launch-instead{margin-right:auto}.tm-submit{background:var(--raise)}.tm-intake{gap:8px;margin:0;padding:0;list-style:none;display:grid}.tm-intake-item{border:1px solid var(--line);border-radius:var(--r);background:var(--raise);gap:6px;padding:10px 12px;display:grid}.tm-intake-item[data-phase=blocked],.tm-intake-item[data-phase=failed]{border-color:var(--err)}.tm-intake-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:6px;display:flex}.tm-intake-title{overflow-wrap:anywhere}.tm-phase{border:1px solid var(--line-2);border-radius:999px;padding:2px 8px;font-size:.75rem;font-weight:600}.tm-phase-queued{color:var(--muted)}.tm-phase-routed,.tm-phase-in_progress{border-color:var(--accent);color:var(--text);background:color-mix(in srgb, var(--accent) 14%, transparent)}.tm-phase-blocked,.tm-phase-failed{border-color:var(--err);color:var(--err)}.tm-phase-done{border-color:var(--ok);color:var(--ok)}.tm-phase-cancelled{color:var(--muted);text-decoration:line-through}.tm-steps{color:var(--muted);grid-template-columns:repeat(4,1fr);gap:4px;margin:0;padding:0;font-size:.6875rem;list-style:none;display:grid}.tm-step{border-top:3px solid var(--line-2);padding-top:3px}.tm-step-done{border-color:var(--ok);color:var(--text)}.tm-step-current{border-color:var(--accent);color:var(--text);font-weight:600}.tm-step-blocked,.tm-step-failed{border-color:var(--err);color:var(--err);font-weight:600}.tm-step-skipped{border-top-style:dashed}.tm-intake-facts{margin:0;font-size:.75rem}.tm-intake-links{font-size:.8125rem}.tm-intake-actions{gap:6px;margin-left:auto;display:inline-flex}.tm-policy p{margin:0 0 6px}.tm-edges{gap:4px;margin:0;padding:0;list-style:none;display:grid}.tm-edges li{flex-wrap:wrap;align-items:center;gap:6px;display:flex}.tm-node{border:1px solid var(--line-2);background:var(--raise);font-family:var(--mono);border-radius:999px;padding:2px 10px;font-size:.8125rem}.tm-arrow{color:var(--accent);font-weight:700}.tm-versions{gap:4px;margin:0;padding:0;list-style:none;display:grid}.tm-lede{max-width:70ch;margin:0 0 14px}.tm-cards{grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px;margin:0;padding:0;list-style:none;display:grid}.tm-card{border:1px solid var(--line);background:var(--raise);border-radius:10px;align-content:start;gap:8px;padding:12px 14px;display:grid;position:relative}.tm-card:hover{border-color:var(--line-2)}.tm-card:focus-within{outline:2px solid var(--accent);outline-offset:1px}.tm-card.archived{opacity:.7}.tm-card-head{flex-wrap:wrap;align-items:baseline;gap:6px;display:flex}.tm-card-title{color:var(--text);font-size:1rem;font-weight:600;text-decoration:none}.tm-card-title:after{content:"";border-radius:inherit;position:absolute;inset:0}.tm-card-title:focus-visible{outline:none}.tm-badges{flex-wrap:wrap;gap:4px;display:flex}.tm-badge{border:1px solid var(--line-2);background:var(--bg);border-radius:999px;padding:1px 8px;font-size:.75rem;display:inline-block}.tm-badge.warn{border-color:var(--warn);color:var(--warn)}.tm-mode-restricted{border-color:var(--accent)}.tm-card-facts{gap:2px;margin:0;font-size:.8125rem;display:grid}.tm-card-facts dd{margin:0}.tm-warn{color:var(--warn)}.tm-tags{flex-wrap:wrap;gap:4px;margin:0;padding:0;list-style:none;display:flex}.tm-tags li{background:var(--raise-2);color:var(--muted);border-radius:4px;padding:1px 6px;font-size:.6875rem}.tm-empty-state{border:1px dashed var(--line-2);text-align:center;border-radius:10px;justify-items:center;gap:10px;padding:24px;display:grid}.tm-archived-toggle{margin-top:12px;font-size:.8125rem}.tm-create{background:0 0;border:none;padding:0}.tm-back{color:var(--muted);margin-bottom:8px;font-size:.8125rem;text-decoration:none;display:inline-block}.tm-back:hover{color:var(--text)}.tm-detail{gap:8px;display:grid}.tm-head{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;display:flex}.tm-head-main{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.tm-handle{font-family:var(--mono)}a.btn{color:var(--text);text-decoration:none}.tm-draft-note{border:1px solid var(--warn);border-radius:var(--r);margin:0;padding:6px 10px;font-size:.8125rem}.tm-linkish{all:unset;color:var(--accent);cursor:pointer;text-decoration:underline}.tm-linkish:focus-visible{outline:2px solid var(--accent)}.tm-tabs{border-bottom:1px solid var(--line);scrollbar-width:none;gap:2px;display:flex;overflow-x:auto}.tm-tab{all:unset;cursor:pointer;color:var(--muted);white-space:nowrap;border-bottom:2px solid #0000;align-items:center;gap:6px;padding:8px 12px;font-size:.875rem;display:inline-flex}.tm-tab:hover{color:var(--text)}.tm-tab[aria-selected=true]{color:var(--text);border-bottom-color:var(--accent);font-weight:600}.tm-tab:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.tm-tab-count{background:var(--accent);min-width:18px;color:var(--accent-ink);text-align:center;border-radius:999px;padding:0 5px;font-size:.6875rem}.tm-panel{gap:12px;padding-top:6px;display:grid}.tm-section h2{margin:0 0 8px;font-size:.9375rem}@media (max-width:760px){.tm-cards{grid-template-columns:1fr}.tm-head{align-items:flex-start}.tm-tab{padding:8px 10px}.tm-intake-actions{margin-left:0}}
@@ -0,0 +1,5 @@
1
+ import{$ as e,At as t,Bt as n,Ct as r,Dt as i,G as a,K as o,Lt as s,Pt as c,Q as l,Rt as u,S as d,U as f,V as p,W as m,X as h,Y as g,Z as _,_t as v,b as y,bt as b,ct as x,ft as S,gt as C,jt as w,kt as T,lt as E,mt as D,ot as O,q as k,st as A,t as j,tt as M,u as N,ut as P,zt as ee}from"./ui-C9Igxzjm.js";import{t as F}from"./plural-Bspvoqfq.js";import{H as I,M as L}from"./index-DaH5GUdV.js";var R={teamsPerUser:100,rolesPerTeam:32,edgesPerTeam:256,sessionsPerRole:16,openIntakePerTeam:500};function te(e){if(!g(e))return`body must be an object`;if(!m(e.name))return`name must be 2–40 lowercase letters, digits or dashes`;if(!f(e.title))return`title must be 1–120 characters of text`;if(e.description!==void 0&&!a(e.description,4e3))return`description must be at most ${p} characters`;if(e.mode!==`open`&&e.mode!==`restricted`)return`mode must be open or restricted`;if(!Array.isArray(e.roles)||e.roles.length===0||e.roles.length>R.rolesPerTeam)return`roles must list 1–${R.rolesPerTeam} roles`;let t=new Set;for(let n of e.roles){if(!g(n)||!m(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&&!f(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>R.edgesPerTeam)return`edges must be a list of at most ${R.edgesPerTeam}`;for(let e of n){if(!g(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 k(e.tags)??o(e.metadata)}var z=e=>typeof e==`object`&&!!e&&!Array.isArray(e),B=e=>typeof e==`string`&&e.length>0?e:void 0,V=e=>typeof e==`number`&&Number.isFinite(e)?e:void 0,H=e=>Array.isArray(e)?e.filter(e=>typeof e==`string`):[],U=/^[a-z0-9][a-z0-9-]{0,38}[a-z0-9]$/,W=e=>({ok:!1,error:e}),G=e=>({ok:!0,spec:e});function ne(e){if(!z(e)||!B(e.name))return;let t={name:e.name};for(let n of[`label`,`description`])B(e[n])&&(t[n]=e[n]);typeof e.externalContact==`boolean`&&(t.externalContact=e.externalContact),Array.isArray(e.responsibilities)&&(t.responsibilities=H(e.responsibilities)),z(e.profile)&&B(e.profile.profileID)&&(t.profile={profileID:e.profile.profileID,...V(e.profile.version)===void 0?{}:{version:e.profile.version}}),z(e.prefs)&&(t.prefs=Object.fromEntries(Object.entries(e.prefs).filter(([,e])=>typeof e==`string`)));for(let n of[`minMembers`,`maxMembers`])V(e[n])!==void 0&&(t[n]=e[n]);return t}function re(e){if(!z(e)||!B(e.from)||!B(e.to))return;let t=H(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 ie(e){if(!z(e)||!B(e.name)||typeof e.title!=`string`||!Array.isArray(e.roles))return;let t=z(e.metadata)?Object.fromEntries(Object.entries(e.metadata).filter(([,e])=>typeof e==`string`)):void 0;return{name:e.name,title:e.title,...B(e.description)?{description:e.description}:{},mode:e.mode===`open`?`open`:`restricted`,roles:e.roles.map(ne).filter(e=>!!e),entryRole:typeof e.entryRole==`string`?e.entryRole:``,edges:Array.isArray(e.edges)?e.edges.map(re).filter(e=>!!e):[],...Array.isArray(e.tags)?{tags:H(e.tags)}:{},...t?{metadata:t}:{},...Array.isArray(e.projects)?{projects:H(e.projects)}:{}}}function ae(e){if(!z(e)||!z(e.team))return;let t=e.team,n=ie(t);if(!B(t.id)||!n||V(t.revision)===void 0)return;let r=z(e.draft)?ie(e.draft.spec):void 0;return{team:{id:t.id,name:n.name,title:n.title,revision:t.revision,version:V(t.version)??1,state:t.state===`archived`?`archived`:`active`,paused:t.paused===!0,hasDraft:z(t.draft)||!!r},published:n,...r?{draft:r}:{}}}var oe=(e,t)=>e.roles.some(e=>e.name===t);function se(e,t,n){let r=t.trim();if(!U.test(r))return W(`A role name is 2–40 lowercase letters, digits or dashes`);if(oe(e,r))return W(`There is already a role ${r}`);if(e.roles.length>=R.rolesPerTeam)return W(`A team has at most ${R.rolesPerTeam} roles`);let i=n?.trim();return G({...e,roles:[...e.roles,{name:r,...i?{label:i}:{}}]})}function ce(e,t){return oe(e,t)?e.entryRole===t?W(`${t} is the entry role: make another role the entry role first`):G({...e,roles:e.roles.filter(e=>e.name!==t),edges:e.edges.filter(e=>e.from!==t&&e.to!==t)}):W(`There is no role ${t}`)}function le(e,t,n){let r=e.roles.findIndex(e=>e.name===t);if(r<0)return W(`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,G({...e,roles:e.roles.map((e,t)=>t===r?i:e)})}function ue(e,t){return oe(e,t)?G({...e,entryRole:t}):W(`There is no role ${t}`)}function de(e,t){if(!oe(e,t.from)||!oe(e,t.to))return W(`A path connects two roles of the team`);if(t.from===t.to)return W(`A path connects two different roles`);let n=[`msg`,`ask`].filter(e=>t.kinds.includes(e));if(n.length===0)return W(`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>=R.edgesPerTeam?W(`A team has at most ${R.edgesPerTeam} paths`):G({...e,edges:[...i,{from:t.from,to:t.to,kinds:n,direction:t.direction}]})}function fe(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)?G({...e,edges:e.edges.filter(e=>!r(e))}):W(`There is no path ${t} → ${n}`)}var pe=(e,t)=>G({...e,mode:t});function me(e,t){let n={...e};if(t.title!==void 0&&(n.title=t.title.trim()),t.description!==void 0){let e=t.description.trim();e?n.description=e:delete n.description}if(t.tags!==void 0){let e=[...new Set(t.tags.split(/[\s,]+/).filter(Boolean))];e.length?n.tags=e:delete n.tags}if(t.metadata!==void 0){let e={};for(let n of t.metadata.split(`
2
+ `)){if(!n.trim())continue;let t=n.indexOf(`=`);if(t<=0)return W(`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 G(n)}var he=e=>(e.tags??[]).join(`, `),ge=e=>Object.entries(e.metadata??{}).map(([e,t])=>`${e}=${t}`).join(`
3
+ `);function _e(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=te(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 ve=e=>e.some(e=>e.level===`error`),ye=e=>({past:[],present:e,future:[]});function be(e,t){return JSON.stringify(t)===JSON.stringify(e.present)?e:{past:[...e.past,e.present].slice(-100),present:t,future:[]}}function xe(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 Se(e){return e.future.length===0?e:{past:[...e.past,e.present],present:e.future[0],future:e.future.slice(1)}}function Ce(e,t){return{expectedRevision:t,title:e.title,description:e.description??null,mode:e.mode,roles:e.roles,entryRole:e.entryRole,edges:e.edges,tags:e.tags?.length?e.tags:null,metadata:e.metadata&&Object.keys(e.metadata).length?e.metadata:null,...e.projects?{projects:e.projects.length?e.projects:null}:{}}}function we(e){let t=e.name.trim();if(!U.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(!U.test(r))return{ok:!1,field:`entry`,error:`The entry role (for example pm) is 2–40 lowercase letters, digits or dashes`};let i=e.entryLabel?.trim();return{ok:!0,body:{name:t,title:n,mode:e.mode,roles:[{name:r,...i?{label:i}:{}}],entryRole:r,edges:[]}}}var Te=e=>JSON.stringify(e,(e,t)=>z(t)?Object.fromEntries(Object.keys(t).sort().map(e=>[e,t[e]])):t);function Ee(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)&&Te(e.get(n))!==Te(t.get(n)))}}function De(e,t){let n=[`title`,`description`,`mode`,`entryRole`].filter(n=>(e[n]??``)!==(t[n]??``)),r=e=>new Map(e.roles.map(e=>[e.name,e])),i=e=>new Map(e.edges.map(e=>[`${e.from}>${e.to}`,{...e,kinds:[...e.kinds].sort()}])),a=(e=[],t=[])=>({added:t.filter(t=>!e.includes(t)),removed:e.filter(e=>!t.includes(e))});return{fields:n,roles:Ee(r(e),r(t)),edges:Ee(i(e),i(t)),tags:a(e.tags,t.tags),metadata:Ee(new Map(Object.entries(e.metadata??{})),new Map(Object.entries(t.metadata??{}))),projects:a(e.projects,t.projects)}}function Oe(e){if(!z(e)||!z(e.diff))return;let t=e.diff,n=e=>({added:z(e)?H(e.added):[],removed:z(e)?H(e.removed):[],changed:z(e)?H(e.changed):[]}),r=e=>({added:z(e)?H(e.added):[],removed:z(e)?H(e.removed):[]});return{fields:H(t.fields),roles:n(t.roles),edges:n(t.edges),tags:r(t.tags),metadata:n(t.metadata),projects:r(t.projects)}}var ke={title:`title`,description:`description`,mode:`communication (open/restricted)`,entryRole:`entry role`},Ae=e=>e.replace(`>`,` → `);function je(e){let t=[];e.fields.length&&t.push(`Changed: ${e.fields.map(e=>ke[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,Ae),n(`Paths removed`,e.edges.removed,Ae),n(`Paths changed`,e.edges.changed,Ae),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 Me=e=>je(e).length===0;function Ne(e){let t=e,n=typeof t?.message==`string`&&t.message?t.message:String(e);if(t?.status===409&&t.code===`conflict`){let e=V(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(z).map(e=>`${B(e.verb)??`?`}${B(e.directory)?` in ${e.directory}`:``}`)}:{kind:`error`,message:n,missing:[]}}function Pe(e){let t=z(e)?e.roster:void 0;if(!z(t)||!Array.isArray(t.roles))return;let n=t.roles.filter(z).map(e=>({role:String(e.role??``),entry:e.entry===!0,minMembers:V(e.minMembers)??0,maxMembers:V(e.maxMembers)??R.sessionsPerRole,vacant:e.vacant===!0,understaffed:e.understaffed===!0,launching:V(e.launching)??0,seats:(Array.isArray(e.seats)?e.seats:[]).filter(z).map(e=>z(e.staffing)?{s:e.staffing,presence:B(e.presence)??`unknown`}:void 0).filter(e=>!!e&&!!B(e.s.id)&&!!B(e.s.sessionID)).map(({s:e,presence:t})=>({staffingID:e.id,sessionID:e.sessionID,revision:V(e.revision)??1,generation:V(e.generation)??1,presence:t}))}));return{roles:n,seats:n.flatMap(e=>e.seats.map(t=>({sessionID:t.sessionID,role:e.role})))}}function Fe(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 Ie(e,t){let n=`role:${t}:`;return e.startsWith(n)?e.slice(n.length):void 0}function Le(e,t,n){let r=Ie(n,e);if(r===void 0)return;let i=Ie(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 Re(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&&!U.test(i))return{ok:!1,field:`name`,error:`A session name is 2–40 lowercase letters, digits or dashes`};let a=e.profile?.trim()?/^(.+)@([0-9]+)$/.exec(e.profile.trim()):void 0;if(e.profile?.trim()&&!a)return{ok:!1,field:`profile`,error:`Choose a profile version`};let o=e.prompt?.trim();return{ok:!0,body:{role:e.role,launch:{workspace:{repo:t,mode:e.mode,...n&&e.mode===`worktree`?{branch:n}:{},...r&&e.mode===`clone`?{remote:r}:{}},...e.harness?{harness:e.harness}:{},...e.machine?{placement:{machine:e.machine}}:{},...a?{agentProfile:{profileID:a[1],version:Number(a[2])}}:{},...i?{name:i}:{},...o?{prompt:o}:{}}}}}var ze=[`low`,`normal`,`high`,`urgent`];function Be(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=ze.find(t=>t===e.priority);return{ok:!0,body:{title:t,...n?{brief:n}:{},...i&&i!==`normal`?{priority:i}:{},...r.length?{criteria:r}:{}}}}var Ve=e=>typeof e==`object`&&!!e&&!Array.isArray(e),He=e=>typeof e==`string`&&e.length>0?e:void 0,Ue=e=>typeof e==`number`&&Number.isFinite(e)?e:void 0,We=[`queued`,`routed`,`done`,`cancelled`,`failed`],Ge=[`open`,`in_progress`,`blocked`];function Ke(e){if(!Ve(e)||!He(e.id)||typeof e.title!=`string`)return;let t=We.find(t=>t===e.status),n=Ue(e.createdAt);if(!t||n===void 0)return;let r=Ge.find(t=>t===e.progress),i={id:e.id,title:e.title,status:t,priority:He(e.priority)??`normal`,revision:Ue(e.revision)??1,createdAt:n,updatedAt:Ue(e.updatedAt)??n};r&&(i.progress=r);for(let t of[`sessionID`,`workspaceID`,`assignmentID`,`reason`,`lastError`,`ref`])He(e[t])&&(i[t]=e[t]);return i}function qe(e){let t=(Ve(e)&&Array.isArray(e.items)?e.items:[]).map(Ke).filter(e=>!!e).sort((e,t)=>t.createdAt-e.createdAt),n=Ve(e)?He(e.cursor):void 0;return n?{items:t,cursor:n}:{items:t}}var Je={queued:`Queued`,routed:`Routed`,in_progress:`In progress`,blocked:`Blocked`,done:`Done`,failed:`Failed`,cancelled:`Cancelled`};function Ye(e){return e.status===`routed`?e.progress===`in_progress`||e.progress===`blocked`?e.progress:`routed`:e.status}var Xe=e=>e.status===`queued`||e.status===`routed`;function Ze(e){let t=(...e)=>[`queued`,`routed`,`working`,`closed`].map((t,n)=>({step:t,state:e[n]}));switch(Ye(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 Qe(e){if(!Ve(e))return;let t=t=>Ue(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 $e=e=>e.queued+e.routed;function et(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:$e(n)}:{}}}function tt(e){return(Ve(e)&&Array.isArray(e.items)?e.items:[]).filter(Ve).map(e=>({version:Ue(e.version),publishedAt:Ue(e.publishedAt)})).filter(e=>e.version!==void 0&&e.publishedAt!==void 0).sort((e,t)=>t.version-e.version)}var nt=(e,t)=>t?e.nodes.find(e=>e.kind===`machine`&&e.machineID===t)?.label:void 0,rt=e=>e.status!==`offline`&&e.status!==`ended`;function it(e,t){return e.seats.map(e=>{let n=t?.nodes.find(t=>t.id===e.sessionID&&t.kind===`session`),r=t&&n?nt(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 at(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=nt(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:rt(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 ot(e){if(e.visible)return e.openWork?5e3:3e4}function st(e,t,n){return e>=n?e>n?`full (${e} of ${n})`:`full (${n})`:t>0&&e<t?`${e} of ${t} required`:`${F(e,`member`)} · up to ${n}`}var ct=[`msg`,`ask`,`reply`,`decision`,`launch`,`policy`],lt=[...ct,`denied`],ut=[`working`,`idle`,`needs-you`,`error`,`offline`,`ended`],K=e=>typeof e==`object`&&!!e&&!Array.isArray(e),q=e=>typeof e==`string`&&e.length>0?e:void 0,J=e=>typeof e==`number`&&Number.isFinite(e)?e:void 0,dt=e=>Array.isArray(e)?e.filter(e=>typeof e==`string`&&e.length>0):[];function ft(e){if(!K(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 pt(e){if(!K(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 mt(e){return Array.isArray(e)?e.filter(e=>K(e)&&!!q(e.teamID)&&!!q(e.role)).map(e=>({teamID:e.teamID,role:e.role})):[]}var ht=new Set([`hub`,`machine`,`session`,`user`,`team`]),gt=new Set([`idle`,`working`,`blocked`,`error`,`offline`,`ended`]),Y=(e,t)=>t===void 0?{}:{[e]:t};function _t(e){if(!K(e))return;let t=q(e.id),n=q(e.kind);if(!t||!n||!ht.has(n))return;let r=q(e.status),i=n===`session`&&e.concierge===!0,a=q(e.label)??t;return{id:t,kind:e.party===`app`?`app`:n,label:i&&!a.startsWith(`@`)?`@@concierge`:a,...Y(`concierge`,i?!0:void 0),...Y(`machineID`,q(e.machineID)),...Y(`harness`,q(e.harness)),...Y(`parentID`,q(e.parentID)),...Y(`rootID`,q(e.rootID)),...Y(`supervisorID`,q(e.supervisorID)),...Y(`launchID`,q(e.launchID)),depth:J(e.depth)??0,...Y(`status`,r&&gt.has(r)?r:void 0),...Y(`online`,typeof e.online==`boolean`?e.online:void 0),roles:dt(e.roles),workspaceIDs:dt(e.workspaceIDs),teamIDs:dt(e.teamIDs),harnesses:dt(e.harnesses),...Y(`project`,q(e.project)),...Y(`lastSeen`,J(e.lastSeen)),tags:dt(e.tags),...Y(`labels`,pt(e.labels)),seats:mt(e.seats),...Y(`name`,q(e.name)),projects:dt(e.projects),...Y(`mode`,e.mode===`open`||e.mode===`restricted`?e.mode:void 0),...Y(`paused`,e.paused===!0||void 0),...Y(`metadata`,pt(e.metadata)),...Y(`entryRole`,q(e.entryRole))}}function vt(e,t){if(!K(e))return;let n=q(e.id),r=q(e.kind),i=q(e.from),a=q(e.to);if(n&&r&&ct.includes(r)&&i&&a&&t.has(i)&&t.has(a))return{id:n,kind:r,from:i,to:a,count:J(e.count)??0,lastAt:J(e.lastAt)??0,...Y(`firstAt`,J(e.firstAt)),...Y(`states`,ft(e.states)),...Y(`delivery`,ft(e.delivery)),...Y(`declined`,J(e.declined)||void 0),...Y(`denied`,J(e.denied)||void 0),...Y(`roleAddressed`,J(e.roleAddressed)||void 0),...Y(`teamID`,q(e.teamID)),...Y(`permitted`,typeof e.permitted==`boolean`?e.permitted:void 0),...Y(`kinds`,dt(e.kinds).length?dt(e.kinds):void 0)}}function yt(e){if(!K(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=_t(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=>vt(e,n)).filter(e=>e!==void 0),i=J(e.at)??0,a=K(e.window)?{since:J(e.window.since)??0,until:J(e.window.until)??i}:{since:0,until:i},o=K(e.retention)?e.retention:{};return{at:i,window:a,nodes:[...t.values()],edges:r,truncated:o.truncated===!0,...Y(`oldestAt`,J(o.oldestAt)),capped:e.capped===!0,hiddenMessages:K(e.hidden)?J(e.hidden.messages)??0:0}}function bt(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 xt={working:`Working`,idle:`Idle`,"needs-you":`Needs you`,error:`Error`,offline:`Offline`,ended:`Ended`},St={working:`--blue`,idle:`--faint`,"needs-you":`--warn`,error:`--err`,offline:`--line-2`,ended:`--faint`},Ct={working:`pulse`,idle:`thin`,"needs-you":`thick`,error:`double`,offline:`broken`,ended:`none`},wt=[`--accent`,`--blue`,`--violet`,`--orange`,`--ok`,`--warn`],Tt=[`●`,`▲`,`■`,`◆`,`★`,`⬟`,`✚`,`⬢`],Et=[`opencode`,`claude-code`,`codex`],Dt={opencode:`sphere`,"claude-code":`cube`,codex:`octahedron`},Ot=e=>e.harness??`unknown`,kt=e=>Dt[e]??(e===`unknown`?`dodecahedron`:`tetrahedron`),At=e=>e===`unknown`?`Unknown harness`:L(e),jt={sphere:`circle`,cube:`square`,octahedron:`diamond`,tetrahedron:`triangle`,dodecahedron:`pentagon`},Mt=[{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).`}],Nt=()=>Mt,Pt=e=>Mt.find(t=>t.kind===e).label,Ft=e=>Mt.find(t=>t.kind===e).color,It={"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`}},Lt={machine:`Machine`,harness:`Harness`,workspace:`Workspace`,team:`Team`,none:`Nothing`},Rt={window:`24h`,groupBy:`machine`,tree:!0,kinds:new Set([`msg`,`ask`,`reply`,`decision`,`launch`,`denied`]),search:``},zt=e=>`machine:${e}`,Bt=e=>e.kind===`hub`||e.kind===`user`||e.kind===`app`;function Vt(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:wt[n%wt.length],symbol:Tt[n%Tt.length],sessions:t.filter(e=>e.machineID===r).length,online:e.online===!0}})}function Ht(e){let t=new Map;for(let n of e)t.set(Ot(n),(t.get(Ot(n))??0)+1);let n=e=>Et.includes(e)?Et.indexOf(e):e===`unknown`?1e3:100;return[...t.keys()].sort((e,t)=>n(e)-n(t)||e.localeCompare(t)).map(e=>({id:e,label:At(e),shape:kt(e),sessions:t.get(e)}))}function Ut(e){return e.every(e=>e.kind===`policy`)?`dotted`:Xt(e)?`dashed`:`solid`}var Wt=e=>Math.round((.6+Math.min(5.4,Math.log2(1+Math.max(0,e))*1.2))*100)/100,Gt={holdMs:5e3,liveHalfLifeMs:45e3,idleHalfLifeMs:6e3,floor:.05};function Kt(e,t){if(!e.lastAt)return 0;let n=Math.max(0,t-e.lastAt);if(n<=Gt.holdMs)return 1;if(n>9e5)return 0;let r=.5**((n-Gt.holdMs)/(e.live?Gt.liveHalfLifeMs:Gt.idleHalfLifeMs));return r<Gt.floor?0:r}function qt(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 Jt=e=>e===`dropped`?`not delivered`:e,Yt=e=>e&&Object.keys(e).length?Object.entries(e).map(([e,t])=>`${Jt(e)} ${t}`).join(`, `):void 0,Xt=e=>e.some(e=>(e.delivery?.pending??0)+(e.delivery?.queued??0)>0||(e.states?.open??0)>0),X=(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 Zt(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=Xt(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:Wt(i),style:Ut(t.edges),particles:qt(i,Kt({lastAt:a,live:o},n.now),n),live:o,edgeIDs:t.edges.map(e=>e.id)}})}function Qt(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:Wt(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:Wt(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 $t(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 en(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 tn=(e,t)=>`role:${e}:${t}`,nn=`group:none`,rn={machine:`No machine`,harness:`Sessions`,workspace:`No workspace`,team:`No team`,none:`All sessions`},an=(e,t)=>e.label.localeCompare(t.label)||(e.id<t.id?-1:+(e.id>t.id));function on(e,t){let n=new Map(e.nodes.filter(e=>e.kind===`team`).map(e=>[e.id,e])),r=(e,t)=>e===t||n.get(e)?.name===t,[i,a]=t.role?t.role.split(`#`,2):[],o=t.project?.toLowerCase(),s=t.meta?en(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||Ot(e)===t.harness)&&(!t.states?.size||bt(e)!==void 0&&t.states.has(bt(e)))&&(!t.team||e.teamIDs.some(e=>r(e,t.team)))&&(!i||e.seats.some(e=>e.role===i&&(!a||r(e.teamID,a)))||!a&&e.roles.some(e=>e===i||e.split(`.`)[0]===i))&&(o===void 0||e.project?.toLowerCase()===o)&&(!t.workspace||e.workspaceIDs.includes(t.workspace))&&(!t.tag||e.tags.includes(t.tag)||e.teamIDs.some(e=>n.get(e)?.tags.includes(t.tag)))&&s.every(t=>c(e.labels,t)||e.teamIDs.some(e=>c(n.get(e)?.metadata,t)))}var sn=e=>!!(e.machine||e.harness||e.states?.size||e.team||e.role||e.project||e.workspace||e.tag||e.meta?.trim());function cn(e,t,n){let r=n.maxNodes??600,i=new Map(e.nodes.map(e=>[e.id,e])),a=e=>i.get(e)?.status===`working`,o=e.nodes.filter(e=>e.kind===`session`).filter(on(e,t)),s=new Set(o.map(e=>e.id)),c=Vt(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(Bt),f=t.groupBy===`machine`?e.nodes.filter(e=>e.kind===`machine`&&(!t.machine||e.machineID===t.machine)):[];f.sort((e,t)=>(l.get(e.machineID??``)??1e9)-(l.get(t.machineID??``)??1e9));let p=new Set(f.map(e=>e.id)),m=e.nodes.filter(e=>e.kind===`team`),h=new Set(m.map(e=>e.id)),g=t.team?new Set(m.filter(e=>e.id===t.team||e.name===t.team).map(e=>e.id)):void 0,_=t.groupBy===`team`,v=_?m.filter(e=>(!g||g.has(e.id))&&(!sn(t)||o.some(t=>t.teamIDs.includes(e.id)))).sort(an):[],y=new Set(v.map(e=>e.id)),b=e=>{let t=e.roles.length?[...e.roles]:[...new Set(o.flatMap(t=>t.seats.filter(t=>t.teamID===e.id).map(e=>e.role)))].sort();return e.entryRole&&t.includes(e.entryRole)?[e.entryRole,...t.filter(t=>t!==e.entryRole)]:t},x=new Map(v.map(e=>[e.id,b(e)])),S=new Map;if(_){for(let t of e.nodes)if(t.kind===`session`)for(let e of t.seats)S.set(tn(e.teamID,e.role),(S.get(tn(e.teamID,e.role))??0)+1)}let C=e=>s.has(e)||i.has(e)&&Bt(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(zt(e.machineID))?zt(e.machineID):`hub`;case`harness`:{let t=Ot(e),n=`group:harness:${t}`;return D.has(n)||D.set(n,{id:n,kind:`cluster`,label:At(t),shape:kt(t),size:$t(`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:$t(`cluster`),match:!1,dim:!1}),n}case`team`:return O(e)??`hub`;case`none`:return`hub`}},A=e=>{let t=O(e);if(t===void 0)return;let n=e.seats.filter(e=>e.teamID===t);return n.find(e=>e.role===i.get(t)?.entryRole)??n[0]},j=e=>e.parentID!==void 0&&s.has(e.parentID)?e.parentID:void 0,M=e=>{let t=e;for(let e=0;e<64;e++){let e=j(t);if(e===void 0)break;t=i.get(e)}return t},N=e=>{let n=e;for(let e=0;e<64&&!(_&&O(n)!==void 0);e++){let e=t.tree?j(n):void 0;if(e===void 0)break;n=i.get(e)}let r=k(n),a=r===`hub`?nn:r;if(!_||a===nn)return{group:a};let o=A(n);return o?{group:a,section:tn(o.teamID,o.role)}:{group:a}},P=e=>{let t=e.teamIDs.filter(e=>h.has(e)).length;return t>1?t:void 0},ee=(e,t)=>({id:e.id,kind:`session`,label:e.label,...Y(`machine`,e.machineID===void 0?void 0:l.get(e.machineID)),harness:Ot(e),shape:kt(Ot(e)),...Y(`ring`,bt(e)),size:$t(`session`,E.get(e.id)??0),match:!1,dim:!1,...Y(`folded`,t),...Y(`teams`,P(e)),...Y(`seat`,_?A(e)?.role:void 0)}),F=e=>({id:e.id,kind:`team`,label:e.label,size:$t(`team`),match:!1,dim:!1,...Y(`mode`,e.mode),...Y(`paused`,e.paused)}),I=e=>[...d.map(e=>({id:e.id,kind:e.kind,label:e.label,size:$t(e.kind),match:!1,dim:!1})),...f.map(e=>({id:e.id,kind:`machine`,label:e.label,...Y(`machine`,e.machineID===void 0?void 0:l.get(e.machineID)),...Y(`ring`,e.online===!1?`offline`:void 0),size:$t(`machine`),match:!1,dim:!1})),...v.map(F),...e?v.flatMap(e=>x.get(e.id).map(t=>({id:tn(e.id,t),kind:`role`,label:t,size:$t(`role`),match:!1,dim:!1,team:e.id,entry:t===e.entryRole,staffed:S.get(tn(e.id,t))??0,vacant:!S.get(tn(e.id,t))}))):[]],L=e=>[...d.filter(e=>e.id!==`hub`).map(e=>X(`hub`,e.id,`party`)),...f.map(e=>X(`hub`,e.id,`group`)),...v.map(e=>X(`hub`,e.id,`group`)),...e?v.flatMap(e=>x.get(e.id).map(t=>X(e.id,tn(e.id,t),`team`))):[]],R=(e,t,n)=>{for(let r of n){let n=D.get(r);n&&(e.push(n),t.push(X(`hub`,r,`group`)))}},te=(e,n,r,i)=>{let a=i&&t.tree?j(e):void 0;a!==void 0&&n.push(X(a,e.id,`tree`));let o=_?A(e):void 0;if(o)n.push(X(tn(o.teamID,o.role),e.id,`seat`));else if(a===void 0){let t=k(e);r.add(t),n.push(X(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(X(tn(t.teamID,t.role),e.id,`seat`,!0))},z=new Map,B=`full`,V=I(!0),H=L(!0),U=new Set;for(let e of o)V.push(ee(e)),te(e,H,U,!0),z.set(e.id,N(e));R(V,H,U),H.push(...Zt(T,e=>e,n,a),...Qt(T,e=>e,t.kinds));let W=!1;if(V.length>r){B=`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))}V=I(!0),H=L(!0),U.clear(),z.clear();for(let[t,n]of e){let e=i.get(t);V.push(ee(e,n||void 0)),te(e,H,U,!1),z.set(t,N(e))}R(V,H,U);let c=e=>s.has(e)?M(i.get(e)).id:e;if(H.push(...Zt(T,c,n,a),...Qt(T,c,t.kinds)),V.length>r){if(t.groupBy===`none`)W=!0;else{B=`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);V=I(!1),H=L(!1),U.clear(),z.clear();for(let[t,n]of e){let e=t.slice(4);U.add(e);let r=D.get(e)??V.find(t=>t.id===e);V.push({id:t,kind:`aggregate`,label:`${n} sessions${r&&r.id!==`hub`?` · ${r.label}`:``}`,...Y(`machine`,r?.machine),size:$t(`aggregate`,0,n),match:!1,dim:!1,folded:n}),H.push(X(e,t,`group`)),z.set(t,{group:e===`hub`?nn:e})}R(V,H,U);let l=e=>s.has(e)?c(i.get(e)):e;H.push(...Zt(T,l,n,a),...Qt(T,l,t.kinds)),V.length>r&&(W=!0)}}}let G=t.search.trim().toLowerCase(),ne=0;return G&&(V=V.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(G);return r&&ne++,{...e,match:r,dim:!r}})),{groups:re(),teams:v.map(e=>({id:e.id,label:e.label,...Y(`mode`,e.mode),...Y(`paused`,e.paused),...Y(`entryRole`,e.entryRole),members:o.filter(t=>t.teamIDs.includes(e.id)).length})),nodes:V,links:H,machines:c,harnesses:Ht(o),lod:B,tooLarge:W,matches:ne,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 re(){let e=new Map,n=(t,n=[{members:[]}])=>e.set(t.id,{group:t,sections:n}),r=B!==`groups`;for(let e of f)n({id:e.id,label:e.label,kind:`machine`,...Y(`machine`,e.machineID===void 0?void 0:l.get(e.machineID)),online:e.online===!0});let a=Ht(o).map(e=>`group:harness:${e.id}`),s=[...D.values()].sort(t.groupBy===`harness`?(e,t)=>a.indexOf(e.id)-a.indexOf(t.id):an);for(let e of s)(U.has(e.id)||[...z.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`,...Y(`mode`,e.mode),...Y(`paused`,e.paused),...Y(`entryRole`,e.entryRole)},r?x.get(e.id).map(t=>({id:tn(e.id,t),label:t,entry:t===e.entryRole,members:[]})):[{members:[]}]);let c=()=>e.get(nn)??(n({id:nn,label:rn[t.groupBy],kind:`none`}),e.get(nn)),u=[...z.keys()],d=new Map;for(let e of u){let t=i.get(e)?.parentID;t!==void 0&&z.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=z.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||!z.has(t))&&m(e,0)}for(let e of u)m(e,0);let h=[...e.values()].filter(e=>e.group.id!==nn),g=e.get(nn);return g&&h.push(g),h.map(e=>({...e.group,sections:e.sections.map(e=>({...Y(`id`,e.id),...Y(`label`,e.label),...e.entry===void 0?{}:{entry:e.entry},members:e.members}))}))}}function ln(e){return e.chosen===`list`?{mode:`list`,reason:`chosen`}:e.tooLarge?{mode:`list`,reason:`large`}:e.chosen===`2d`?{mode:`2d`}:e.webgl?{mode:`3d`}:{mode:`2d`,reason:`webgl`}}function un(e){let t={};for(let n of e){let e=bt(n);e&&(t[e]=(t[e]??0)+1)}return t}var dn=`app:concierge`;function fn(e){if(e.id===dn)return`service`;if(e.concierge)return e.status===`ended`||/ \(previous\)$/.test(e.label)?`previous`:`current`}function pn(e,t){let n=e.nodes.find(e=>e.id===t);if(!n)return;let r=t=>e.nodes.find(e=>e.id===t)?.label??t,i=e.edges.filter(e=>e.kind!==`policy`),a=e.nodes.filter(e=>e.kind===`session`),o=n.kind===`machine`?new Set(a.filter(e=>e.machineID===n.machineID).map(e=>e.id)):void 0,s=i.filter(e=>n.kind===`hub`?!0:o?o.has(e.from)||o.has(e.to):e.from===t||e.to===t),c={},l=new Map,u=0,d=0;for(let e of s){if(c[e.kind]=(c[e.kind]??0)+e.count,n.kind===`hub`||o)continue;e.from===t&&(u+=e.count),e.to===t&&(d+=e.count);let r=e.from===t?e.to:e.from;l.set(r,(l.get(r)??0)+e.count)}let f=n.machineID?e.nodes.find(e=>e.kind===`machine`&&e.machineID===n.machineID)?.label:void 0,p=e.nodes.filter(e=>e.kind===`machine`);return{id:t,kind:n.kind,title:n.label,...Y(`ring`,bt(n)),...Y(`machine`,f),...Y(`harness`,n.kind===`session`?At(Ot(n)):void 0),...Y(`project`,n.project),roles:n.roles,workspaceIDs:n.workspaceIDs,...Y(`parentID`,n.parentID),...Y(`supervisorID`,n.supervisorID),...Y(`supervisorLabel`,n.supervisorID?r(n.supervisorID):void 0),...Y(`launchID`,n.launchID),...Y(`concierge`,n.concierge),...Y(`conciergeRole`,fn(n)),children:a.filter(e=>e.parentID===t).map(e=>e.id),sent:u,received:d,routed:s.reduce((e,t)=>e+t.count,0),byKind:c,peers:[...l.entries()].map(([e,t])=>({id:e,label:r(e),count:t})).sort((e,t)=>t.count-e.count||e.label.localeCompare(t.label)),...n.kind===`hub`?{states:un(a),machinesOnline:{online:p.filter(e=>e.online).length,total:p.length}}:{},...o?{states:un(a.filter(e=>o.has(e.id)))}:{},...Y(`online`,n.online),...Y(`lastSeen`,n.lastSeen),openable:n.kind===`session`,seats:n.seats.map(e=>({teamID:e.teamID,team:r(e.teamID),role:e.role})),...Y(`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{...Y(`mode`,e.mode),...Y(`entryRole`,e.entryRole),...Y(`paused`,e.paused),tags:e.tags,...Y(`metadata`,e.metadata),members:r}}}function mn(e,t){let n=e.edges.find(e=>e.id===t);if(!n)return;let r=t=>e.nodes.find(e=>e.id===t)?.label??t;return{...n,label:Pt(n.kind),fromLabel:r(n.from),toLabel:r(n.to),...Y(`teamLabel`,n.teamID?r(n.teamID):void 0)}}function hn(e){if(!K(e)||!Array.isArray(e.messages))return{messages:[]};let t=[];for(let n of e.messages){if(!K(n))continue;let e=q(n.id),r=q(n.kind),i=q(n.state),a=q(n.from),o=q(n.to),s=J(n.at);e&&r&&i&&a&&o&&s!==void 0&&t.push({id:e,kind:r,state:i,from:a,to:o,at:s,...Y(`delivery`,q(n.delivery)),...Y(`decisionID`,q(n.decisionID))})}return{messages:t,...Y(`cursor`,q(e.cursor))}}function gn(e){if(!K(e)||!K(e.message))return;let t=e.message,n=q(t.id);if(!n||typeof t.text!=`string`)return;let r=K(e.answer)&&typeof e.answer.text==`string`?e.answer.text:void 0;return{id:n,text:t.text,...Y(`at`,J(t.at)),...Y(`kind`,q(t.kind)),...Y(`state`,q(t.state)),...Y(`answer`,r)}}function _n(e,t){let n=new Map(e.nodes.map(e=>[e.id,e])),r=new Set(t.sessionIDs),i=t.sessionIDs.map(e=>n.get(e)).filter(Boolean),a=t.edgeIDs.map(t=>e.edges.find(e=>e.id===t)).filter(Boolean),o=new Map,s=new Map;for(let e of a)e.kind!==`policy`&&(o.set(e.from,(o.get(e.from)??0)+e.count),s.set(e.to,(s.get(e.to)??0)+e.count));let c=new Map(t.machines.map(e=>[e.id,e.index])),l=new Map(t.machines.map(e=>[e.id,e.label])),u=(e,t)=>e.label.localeCompare(t.label)||(e.id<t.id?-1:1),d=e=>i.filter(t=>t.parentID===e).sort(u),f=i.filter(e=>!e.parentID||!r.has(e.parentID)).sort((e,t)=>(c.get(e.machineID??``)??1e9)-(c.get(t.machineID??``)??1e9)||u(e,t)),p=[],m=(e,t)=>{let n=bt(e);if(p.push({id:e.id,label:e.label,machine:e.machineID&&l.get(e.machineID)||`—`,harness:At(Ot(e)),state:n?xt[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:Pt(e.kind),from:h(e.from),to:h(e.to),count:e.count,lastAt:e.lastAt,style:Ut([e])})).sort((e,t)=>t.count-e.count||t.lastAt-e.lastAt)}}var vn=(e,t)=>`/api/agent/graph?since=${t-It[e.window].ms}&until=${t}`,yn=new Set([`catalog`,`status`,`decision`,`agent`,`resync`]),bn=e=>typeof e.type==`string`&&yn.has(e.type),xn=[`3d`,`2d`,`list`],Sn=`watchtower.view`,Cn=`watchtower.presets`,wn=`watchtower.`,Tn=`birdsEye.`;function En(e){try{let t=[];for(let n=0;n<e.length;n++){let r=e.key(n);r?.startsWith(Tn)&&t.push(r)}for(let n of t)try{let t=e.getItem(n),r=wn+n.slice(9);t!==null&&e.getItem(r)===null&&e.setItem(r,t),e.removeItem(n)}catch{}}catch{}}var Dn=e=>e!==null&&e in It,On=e=>e!==null&&e in Lt,kn=e=>typeof e==`string`&&xn.includes(e),An=[[`machine`,`machine`],[`harness`,`harness`],[`team`,`team`],[`role`,`role`],[`project`,`project`],[`workspace`,`ws`],[`tag`,`tag`],[`meta`,`meta`],[`q`,`q`]],jn=200,Mn=(e,t)=>e.length===t.size&&e.every(e=>t.has(e)),Nn=e=>kn(e)?e:void 0;function Pn(e,t){let n=new URLSearchParams(e),r=n.get(`window`),i=n.get(`group`),a=n.get(`view`),o=/^(node|edge):(.+)$/.exec(n.get(`sel`)??``),s={};for(let[e,t]of An){let r=n.get(t)?.trim();r&&(s[e]=r.slice(0,jn))}let c=n.get(`state`),l=n.get(`kinds`),u=l===null?void 0:lt.filter(e=>l.split(`,`).includes(e));return{window:Dn(r)?r:Rt.window,view:kn(a)?a:t??`3d`,groupBy:On(i)?i:Rt.groupBy,...o?{selected:{type:o[1],id:o[2]}}:{},...s,...c&&ut.includes(c)?{state:c}:{},...u&&!Mn(u,Rt.kinds)?{kinds:u}:{},...n.get(`tree`)===`0`?{tree:!1}:{}}}function Fn(e,t=`3d`){let n=new URLSearchParams;e.window!==Rt.window&&n.set(`window`,e.window),(e.view!==`3d`||t!==`3d`)&&n.set(`view`,e.view),e.groupBy!==Rt.groupBy&&n.set(`group`,e.groupBy);for(let[t,r]of An)e[t]&&n.set(r,e[t]);e.state&&n.set(`state`,e.state),e.kinds&&!Mn(e.kinds,Rt.kinds)&&n.set(`kinds`,lt.filter(t=>e.kinds.includes(t)).join(`,`)),e.tree===!1&&n.set(`tree`,`0`),e.selected&&n.set(`sel`,`${e.selected.type}:${e.selected.id}`);let r=n.toString();return r?`?${r}`:``}function In(e){return{window:e.window,groupBy:e.groupBy,tree:e.tree!==!1,kinds:e.kinds?new Set(e.kinds):Rt.kinds,...e.state?{states:new Set([e.state])}:{},...Y(`machine`,e.machine),...Y(`harness`,e.harness),...Y(`team`,e.team),...Y(`role`,e.role),...Y(`project`,e.project),...Y(`workspace`,e.workspace),...Y(`tag`,e.tag),...Y(`meta`,e.meta),search:e.q??``}}function Ln(e){let t=e=>[...new Set(e)].sort((e,t)=>e.localeCompare(t)),n=e.nodes.filter(e=>e.kind===`session`),r=e.nodes.filter(e=>e.kind===`team`);return{teams:r.sort(an).map(e=>({id:e.id,label:e.label})),roles:t([...n.flatMap(e=>[...e.roles,...e.seats.map(e=>e.role)]),...r.flatMap(e=>e.roles)]),projects:t(n.flatMap(e=>e.project?[e.project]:[])),workspaces:t(n.flatMap(e=>e.workspaceIDs)),tags:t([...n,...r].flatMap(e=>e.tags)),metaKeys:t([...n.flatMap(e=>Object.keys(e.labels??{})),...r.flatMap(e=>Object.keys(e.metadata??{}))])}}var Rn=e=>{let{selected:t,...n}=e;return Fn({...n,view:`3d`})};function zn(e,t){return{...Pn(t,e.view),view:e.view,...e.selected?{selected:e.selected}:{}}}function Bn(e){try{let t=JSON.parse(e??`[]`);return Array.isArray(t)?t.filter(e=>K(e)&&typeof e.name==`string`&&e.name.trim().length>0&&typeof e.search==`string`).map(e=>({name:e.name,search:e.search})).slice(-20):[]}catch{return[]}}function Vn(e,t,n){let r=t.trim().slice(0,60);if(!r)return[...e];let i=e.findIndex(e=>e.name===r);return(i>=0?e.map((e,t)=>t===i?{name:r,search:n}:e):[...e,{name:r,search:n}]).slice(-20)}var Hn=(e,t)=>e.filter(e=>e.name!==t);function Un(e){return e instanceof _?{kind:`offline`,message:e.message}:e instanceof h?e.status===404&&e.code===`not_found`?{kind:`missing`,message:`This hub doesn't have the interaction graph yet.`}:e.status===403||e.status===401?{kind:`forbidden`,message:e.message||`This device may not read the interaction graph.`}:e.status===503?{kind:`offline`,message:e.message||`The hub is offline.`}:{kind:`error`,message:e.message}:{kind:`error`,message:e instanceof Error?e.message:String(e)}}async function Wn(e){let t=yt(await M(e));if(!t)throw Error(`The hub answered something that isn't an interaction graph`);return t}var Gn=(e,t)=>`since=${t-It[e].ms}&until=${t}`;async function Kn(t,n,r,i){let a=`/api/agent/graph/${t.type===`edge`?`edges`:`nodes`}/${e(t.id)}`;return hn(await M(`${a}?${Gn(n,r)}&limit=50${i?`&cursor=${e(i)}`:``}`))}async function qn(t){let n=gn(await M(`/api/agent/messages/${e(t)}`));if(!n)throw Error(`The hub didn't return this message's text`);return n}var Jn=`/api/agent/teams`,Z=t=>`${Jn}/${e(t)}`,Q=async(e,t,n,r)=>(await l(e,{method:t,...n===void 0?{}:{json:n},...r?{headers:{"idempotency-key":r}}:{}})).json().catch(()=>({}));function Yn(e){let t=ae(e);if(!t)throw Error(`The hub answered something that isn't a team`);return t}async function Xn(){return((await M(`${Jn}?limit=200`)).items??[]).map(e=>ae({team:e})?.team).filter(e=>!!e).map(e=>({id:e.id,name:e.name,title:e.title,paused:e.paused,hasDraft:e.hasDraft}))}async function Zn(e=`all`){return((await M(`${Jn}?limit=200&state=${e}`)).items??[]).flatMap(e=>{let t=ae({team:e}),n=ie(e);if(!t||!n)return[];let r=t.team;return[{id:r.id,name:r.name,title:r.title,mode:n.mode,entryRole:n.entryRole,paused:r.paused,state:r.state,hasDraft:r.hasDraft,tags:n.tags??[],roles:n.roles.length}]})}async function Qn(e){let t=await M(`${Z(e)}/status`),n=Pe({roster:t.roster}),r=Qe(t.intake);return{...n?{roster:n}:{},...r?{intake:r}:{}}}async function $n(e,t=50){return qe(await M(`${Z(e)}/intake?limit=${t}`)).items}async function er(t,n,r,i,a){return Ke((await Q(`${Z(t)}/intake/${e(n)}/status`,`POST`,{status:r,expectedRevision:i,...a?{reason:a}:{}})).intake)}async function tr(e){return tt(await M(`${Z(e)}/versions?limit=50`))}async function nr(e,t,n){return await Q(`${Z(e)}/${t?`archive`:`restore`}`,`POST`,{expectedRevision:n}),rr(e)}var rr=async e=>Yn(await M(Z(e))),ir=async(e,t)=>Yn(await Q(Jn,`POST`,e,t));async function ar(e,t,n){return await Q(Z(e),`PATCH`,Ce(t,n)),rr(e)}async function or(e,t){return await Q(`${Z(e)}/draft?expectedRevision=${t}`,`DELETE`),rr(e)}async function sr(e){let t=Oe(await M(`${Z(e)}/diff?to=draft`));if(!t)throw Error(`The hub didn't answer a diff`);return t}async function cr(e,t){return await Q(`${Z(e)}/publish`,`POST`,{expectedRevision:t}),rr(e)}async function lr(e,t,n){return await Q(`${Z(e)}/${t?`pause`:`resume`}`,`POST`,{expectedRevision:n}),rr(e)}async function ur(e){let t=Pe(await M(`${Z(e)}/roster`));if(!t)throw Error(`The hub didn't answer a roster`);return t}var dr=(e,t,n,r)=>Q(`${Z(e)}/staffing`,`PUT`,{role:t,sessionID:n},r),fr=(e,t,n)=>Q(`${Z(e)}/staffing/launch`,`POST`,t,n),pr=(t,n,r)=>Q(`${Z(t)}/staffing/${e(n)}?expectedRevision=${r}`,`DELETE`);async function mr(e,t,n){let r=await Q(`${Z(e)}/intake`,`POST`,t,n),i=Ke(r.intake);return{id:String(r.intake?.id??``),status:String(r.intake?.status??`queued`),...i?{intake:i}:{}}}async function hr(){try{return((await M(`/api/agent/profiles?state=active&limit=200`)).items??[]).filter(e=>typeof e.id==`string`&&typeof e.latestVersion==`number`).map(e=>({id:e.id,title:String(e.title||e.name),version:e.latestVersion}))}catch{return[]}}var gr=()=>crypto.randomUUID?.()??`${Date.now()}-${Math.random().toString(36).slice(2)}`;function _r(e,n={}){let[r,i]=c(),[a,o]=c(``),[s,l]=c(),[u,d]=c(),[f,p]=c(),[m,g]=c(),[_,v]=c(),[y,b]=c(``),[x,S]=c(),[C,w]=c(!1),[T,E]=c(),D=()=>s()?.present,O=e=>JSON.stringify(e??null),k=t(()=>!!s()&&O(D())!==O(u())),A=t(()=>D()?_e(D()):[]),j=()=>r()?.team,M=()=>j()?.id??e,N=t(()=>new Set(r()?.published.roles.map(e=>e.name)??[])),P=t(()=>r()&&D()?De(r().published,D()):void 0),ee=t(()=>(_()??[]).some(Xe)),F=()=>n.onChanged?.(),I=async()=>{try{p(await ur(e))}catch{p(void 0)}},L=async()=>{if(n.intake)try{let[e,t]=await Promise.all([$n(M()),Qn(M()).catch(()=>({}))]);v(e),b(``),t.intake&&g(t.intake)}catch(e){b(Ne(e).message),_()||v([])}},R=(e,t)=>{let n=e.draft??e.published;i(e),d(n);let r=s();(!t||!r)&&l(ye(n))},te=async()=>{try{R(await rr(e),!1),await Promise.all([I(),L()])}catch(e){o(e instanceof h&&e.status===404?`This hub doesn't have that team (or teams at all).`:Ne(e).message)}},z=async()=>{if(!C()&&r()){try{let t=await rr(e);t.team.revision!==j()?.revision&&R(t,k())}catch{}await Promise.all([I(),L()])}},B=async t=>{w(!0),S(void 0);try{await t()}catch(t){let n=Ne(t);if(n.kind===`conflict`){try{R(await rr(e),!0),await I()}catch{}E(void 0),S({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 S({kind:n.kind,text:n.message,missing:n.missing})}finally{w(!1)}},V,H=e=>{if(!e.ok)return S(V={kind:`error`,text:e.error});V&&x()===V&&S(void 0),V=void 0,E(void 0),l(be(s(),e.spec))},U=()=>s()&&l(xe(s())),W=()=>s()&&l(Se(s())),G=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?W():U())},ne=async()=>{let t=await ar(e,D(),j().revision);return R(t,!1),t},re=()=>B(async()=>{await ne(),S({kind:`ok`,text:`Draft saved. It isn't live until you publish it.`})}),ie=()=>B(async()=>{k()&&await ne(),j().hasDraft?E(await sr(e)):S({kind:`ok`,text:`Nothing to publish: the draft matches version ${j().version}.`})}),ae=()=>B(async()=>{let t=j().version,n=await cr(e,j().revision);R(n,!1),E(void 0),await I(),F(),S({kind:`ok`,text:n.team.version>t?`Published version ${n.team.version}.`:`Nothing changed: the draft matched the published version.`})}),oe=()=>B(async()=>{j().hasDraft?R(await or(e,j().revision),!1):R(r(),!1),E(void 0),S({kind:`ok`,text:`Draft discarded.`})}),se=()=>B(async()=>{let t=!j().paused;R(await lr(e,t,j().revision),!0),F(),S({kind:`ok`,text:t?`Paused: the team takes no new work or members until you resume it.`:`Resumed: the team takes work again.`})}),ce=()=>B(async()=>{let t=j().state!==`archived`;R(await nr(e,t,j().revision),!0),F(),S({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.`})}),le=gr(),ue=async(t,n,r)=>{let i=!1;return await B(async()=>{await dr(e,t,n,le),le=gr(),await I(),F(),S({kind:`ok`,text:`${r} is staffed as ${t}.`}),i=!0}),i},de=(t,n,r,i)=>B(async()=>{await pr(e,t,n),await I(),F(),S({kind:`ok`,text:`${r} no longer holds ${i}.`})}),fe=gr(),pe=async(t,n)=>{let r=!1;return await B(async()=>{let i=await fr(e,n,fe);fe=gr(),await I(),S({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},me=gr();return{id:e,read:r,team:j,spec:D,hist:s,dirty:k,probs:A,roster:f,summary:m,items:_,intakeError:y,openWork:ee,notice:x,setNotice:S,busy:C,preview:T,setPreview:E,publishedRoles:N,localPreview:P,loadError:a,blocked:()=>ve(A()),fieldProblem:(e,t)=>A().find(n=>n.field===e&&n.level===t)?.message,load:te,refresh:z,loadRoster:I,loadIntake:L,apply:H,undo:U,redo:W,onKey:G,saveDraft:re,review:ie,publish:ae,discard:oe,togglePause:se,toggleArchive:ce,attach:ue,unstaff:de,launch:pe,submit:async e=>{let t=!1;return await B(async()=>{let n=await mr(M(),e,me);me=gr(),n.intake&&v([n.intake,...(_()??[]).filter(e=>e.id!==n.intake.id)]),S({kind:`ok`,text:`Task ${n.id} ${n.status}: it goes to the entry role (${r().published.entryRole}).`}),t=!0}),t&&L(),t},setIntake:(e,t)=>B(async()=>{let n=await er(M(),e.id,t,e.revision);n&&v((_()??[]).map(e=>e.id===n.id?n:e)),S({kind:`ok`,text:`${e.title}: ${t===`cancelled`?`cancelled`:`marked ${t.replace(`_`,` `)}`}.`})})}}var vr=C(`<p>Missing grants:`),yr=C(`<ul>`),br=C(`<p class=muted>Staffing never issues grants: grant these in Settings → Agents, or staff the role yourself here.`),xr=C(`<div><p>`),Sr=C(`<li>`),Cr=C(`<span>`),wr=C(`<label class=te-field><span>`),Tr=C(`<fieldset class=te-mode><legend>Communication</legend><label class=wt-check><input type=radio><span>Open team: everyone may message and ask everyone</span></label><label class=wt-check><input type=radio><span>Restricted paths: only the paths you draw`),Er=C(`<span class="te-chip te-chip-warn">Paused: no new members or tasks`),Dr=C(`<span class="te-chip te-chip-warn">Archived: its policy no longer applies`),Or=C(`<p class=te-status role=status aria-label="Team state"><span class=te-chip>`),kr=C(`<div class=te-toolbar role=toolbar aria-label=Draft><button type=button class="btn small"aria-keyshortcuts=Control+Z>Undo</button><button type=button class="btn small"aria-keyshortcuts=Control+Shift+Z>Redo</button><button type=button class="btn small">Save draft</button><button type=button class="btn small primary">Review and publish…</button><button type=button class="btn small">Discard draft`),Ar=C(`<p class="muted te-pending">Unsaved: `),jr=C(`<section class=te-preview role=region><h3>Publish version <!>?</h3><p class=muted>Delivery and staffing switch to the new version when you publish. Publishing is refused while sessions hold a role it removes.</p><div class=te-row><button type=button class="btn primary">Publish version </button><button type=button class=btn>Keep editing`),Mr=C(`<div role=alert class=te-problems><p>Fix these before saving:</p><ul>`),Nr=C(`<p>No changes against version <!>.`),Pr=C(`<input>`),Fr=C(`<textarea>`),Ir=C(`<p class=te-err role=alert>`),Lr=C(`<ul class=te-roles aria-label=Roles>`),Rr=C(`<form class="te-row te-add"aria-label="Add role"><input type=text aria-label="New role name"placeholder="role name (dev)"><input type=text aria-label="New role label"placeholder="label (optional)"><button type=submit class="btn small">Add role`),zr=C(`<span class=te-chip>new in draft`),Br=C(`<li class=te-role><div class=te-row><strong></strong><label class=wt-check><input type=radio><span></span></label><button type=button class="btn small">Remove</button></div><label class=wt-check><input type=checkbox><span>May contact sessions outside the team`),Vr=C(`<p class=muted>Open team: every member may message and ask every other. The paths below are kept and apply again if you switch back to restricted.`),Hr=C(`<ul class=te-paths aria-label=Paths>`),Ur=C(`<form class="te-form te-connect"aria-label="Connect roles"><h4 class=te-form-title>Connect two roles</h4><div class=te-row><label class=te-field><span>From</span><select aria-label="Path from"><option value>Pick a role</option></select></label><label class=te-field><span>To</span><select aria-label="Path to"><option value>Pick a role</option></select></label></div><fieldset class=te-mode><legend>Direction</legend><label class=wt-check><input type=radio><span>One-way (from may contact to)</span></label><label class=wt-check><input type=radio><span>Two-way (both may contact each other)</span></label></fieldset><fieldset class=te-mode><legend>Permits</legend><label class=wt-check><input type=checkbox><span>Messages (msg)</span></label><label class=wt-check><input type=checkbox><span>Questions (ask)</span></label></fieldset><button type=submit class="btn small primary">Add path`),Wr=C(`<p class=muted>No paths yet. `),Gr=C(`<span class=te-err> — `),Kr=C(`<li><span> <!> <!> · <!> · </span> <button type=button class="btn small">Edit</button><button type=button class="btn small">Remove`),qr=C(`<option>`),Jr=C(`<p><strong>Restricted.</strong> Members may only use these paths; the entry role <code></code> receives the team's work.`),Yr=C(`<ul class=tm-edges>`),Xr=C(`<div class=tm-policy aria-label="Published communication">`),Zr=C(`<p><strong>Open team.</strong> Every member may message and ask every other; the entry role <code></code> receives the team's work.`),Qr=C(`<p class=muted>No paths are published: members can't reach each other.`),$r=C(`<li><span class=tm-node></span><span class=tm-arrow></span><span class=tm-node></span><span class=muted> `),ei=C(`<p class=muted>Members unknown (the roster didn't load).`),ti=C(`<p class=muted>The team is paused: resume it to add members.`),ni=C(`<p class=muted>Tip: on the 2D canvas, drag a session onto a role to add it.`),ri=C(`<div class=tm-members>`),ii=C(`<span class=muted> `),ai=C(`<span class=te-chip>entry role: receives the work`),oi=C(`<span class="te-chip te-chip-warn">`),si=C(`<span class="muted tm-count">`),ci=C(`<ul class=tm-seats>`),li=C(`<div class="te-row tm-role-actions"><button type=button class="btn small primary">+ Add member</button><button type=button class="btn small">Launch new <!>…`),ui=C(`<section class=tm-role role=group><header class=tm-role-head><div class=tm-role-name><strong>`),di=C(`<p class=muted>Publish the draft to add members to <!>.`),fi=C(`<p class="muted tm-empty">No members yet.`),pi=C(`<li class=tm-seat><span aria-hidden=true></span><a class=tm-seat-name></a><span class="muted tm-seat-facts"></span><button type=button class="btn small">Unstaff`),mi=C(`<fieldset class=tm-choices><legend class=sr-only>Sessions`),hi=C(`<p class=te-memberships role=status aria-label="Other memberships">`),gi=C(`<form><p class=muted>Pick a running session to hold <!>. A session may hold roles in several teams.</p><input type=search class=tm-search aria-label="Search sessions"placeholder="Search by name, machine, harness or team"><div class="dialog-actions tm-picker-actions"><button type=button class="btn small tm-launch-instead">Launch a new member instead…</button><button type=button class=btn>Cancel</button><button type=submit class="btn primary">Add to `),_i=C(`<p class=muted>Loading sessions…`),vi=C(`<p class=muted>`),yi=C(`<label class=tm-choice><input type=radio><span aria-hidden=true></span><span class=tm-choice-text><strong></strong><span class=muted> </span><span class=tm-choice-note>`),bi=C(`<button type=button class="btn small">Cancel`),xi=C(`<form class=te-form aria-label="Launch a new member"><h4 class=te-form-title>Launch a new member</h4><div class=te-row><button type=submit class="btn small primary">Launch member`),Si=C(`<select><option value>Pick a role`),Ci=C(`<select><option value>Any machine (the hub picks)`),wi=C(`<select><option value>The role's default`),Ti=C(`<select><option value>The role's profile (or none)`),Ei=C(`<option> (v<!>)`),Di=C(`<select><option value=worktree>New worktree</option><option value=checkout>The checkout itself</option><option value=clone>A fresh clone`),Oi=C(`<form class="te-form tm-submit"aria-label="Submit a task"><div class=te-row></div><div class=te-row><button type=submit class="btn primary">Submit task</button><span class=muted>It goes to the entry role (<!>) of the published team.`),ki=C(`<select>`),Ai=C(`<p class=muted role=note>Couldn't refresh the tasks: `),ji=C(`<ul class=tm-intake aria-label=Tasks>`),Mi=C(`<p class=muted>Loading tasks…`),Ni=C(`<p class=muted>No tasks yet. Submitted tasks and their progress show up here.`),Pi=C(`<span class=muted>With`),Fi=C(`<a>`),Ii=C(`<a>Workspace assignment`),Li=C(`<button type=button class="btn small">Mark done`),Ri=C(`<span class=tm-intake-actions><button type=button class="btn small">Cancel`),zi=C(`<li class=tm-intake-item><div class=tm-intake-head><strong class=tm-intake-title></strong><span></span></div><ol class=tm-steps aria-label=Progress></ol><p class="muted tm-intake-facts"></p><div class="te-row tm-intake-links">`),Bi=C(`<span class=muted>Waiting for the entry role.`),Vi=C(`<ul class=tm-versions aria-label=Versions>`),Hi=C(`<p class=muted>History unavailable: `),Ui=C(`<p class=muted>Loading history…`),Wi=C(`<span class=te-chip>live`),Gi=C(`<li><strong>Version </strong><span class=muted> published `);function Ki(e){return i(r,{get when(){return e.notice},children:e=>(()=>{var t=xr(),n=t.firstChild;return E(n,()=>e().text),E(t,i(r,{get when(){return e().missing?.length},get children(){return[vr(),(()=>{var t=yr();return E(t,i(b,{get each(){return[...e().missing]},children:e=>(()=>{var t=Sr();return E(t,e),t})()})),t})(),br()]}}),null),w(n=>{var r=`te-notice te-${e().kind}`,i=e().kind===`ok`?`status`:`alert`;return r!==n.e&&A(t,n.e=r),i!==n.t&&S(t,`role`,n.t=i),n},{e:void 0,t:void 0}),t})()})}var qi=0;function $(e){let t=`te-f${++qi}`,n=()=>e.error??e.warning;return(()=>{var a=wr(),o=a.firstChild;return S(a,`for`,t),E(o,()=>e.label),E(a,()=>e.children({id:t,"aria-label":e.label,...n()?{"aria-describedby":`${t}-msg`}:{},...e.error?{"aria-invalid":!0}:{}}),null),E(a,i(r,{get when(){return n()},get children(){var r=Cr();return S(r,`id`,`${t}-msg`),E(r,n),w(()=>A(r,e.error?`te-err`:`te-warn`)),r}}),null),a})()}function Ji(e){return(()=>{var t=Tr(),n=t.firstChild.nextSibling,r=n.firstChild,i=n.nextSibling.firstChild;return r.addEventListener(`change`,()=>e.onChange(`open`)),i.addEventListener(`change`,()=>e.onChange(`restricted`)),w(t=>{var n=e.name,a=e.name;return n!==t.e&&S(r,`name`,t.e=n),a!==t.t&&S(i,`name`,t.t=a),t},{e:void 0,t:void 0}),w(()=>r.checked=e.value===`open`),w(()=>i.checked=e.value===`restricted`),t})()}var Yi=e=>e.direction===`two-way`?`⇄`:`→`;function Xi(e){let t=e.c,n=()=>{let e=t.team();return e?t.dirty()?`Draft · unsaved edits`:e.hasDraft?`Draft saved · not published (version ${e.version} is live)`:`Published · version ${e.version}`:``};return(()=>{var e=Or(),a=e.firstChild;return E(a,n),E(e,i(r,{get when(){return t.team()?.paused},get children(){return Er()}}),null),E(e,i(r,{get when(){return t.team()?.state===`archived`},get children(){return Dr()}}),null),w(()=>S(e,`data-state`,t.dirty()?`dirty`:t.team()?.hasDraft?`draft`:`published`)),e})()}function Zi(e){let t=e.c;return[(()=>{var e=kr(),n=e.firstChild,r=n.nextSibling,i=r.nextSibling,a=i.nextSibling,o=a.nextSibling;return O(n,`click`,t.undo,!0),O(r,`click`,t.redo,!0),i.$$click=()=>void t.saveDraft(),a.$$click=()=>void t.review(),o.$$click=()=>void t.discard(),w(e=>{var s=!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 s!==e.e&&(n.disabled=e.e=s),c!==e.t&&(r.disabled=e.t=c),l!==e.a&&(i.disabled=e.a=l),u!==e.o&&(a.disabled=e.o=u),d!==e.i&&(o.disabled=e.i=d),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),e})(),i(r,{get when(){return P(()=>!!(t.dirty()&&t.localPreview()))()&&!Me(t.localPreview())},get children(){var e=Ar();return e.firstChild,E(e,()=>je(t.localPreview()).join(` · `),null),e}}),i(r,{get when(){return t.preview()},get children(){var e=jr(),n=e.firstChild,a=n.firstChild.nextSibling;a.nextSibling;var o=n.nextSibling,s=o.nextSibling.firstChild;s.firstChild;var c=s.nextSibling;return E(n,()=>t.team().version+1,a),E(e,i(r,{get when(){return!Me(t.preview())},get fallback(){return(()=>{var e=Nr(),n=e.firstChild.nextSibling;return n.nextSibling,E(e,()=>t.team().version,n),e})()},get children(){var e=yr();return E(e,i(b,{get each(){return je(t.preview())},children:e=>(()=>{var t=Sr();return E(t,e),t})()})),e}}),o),s.$$click=()=>void t.publish(),E(s,()=>t.team().version+1,null),c.$$click=()=>t.setPreview(void 0),w(r=>{var i=`te-preview-${t.id}`,a=`te-preview-${t.id}`,o=t.busy();return i!==r.e&&S(e,`aria-labelledby`,r.e=i),a!==r.t&&S(n,`id`,r.t=a),o!==r.a&&(s.disabled=r.a=o),r},{e:void 0,t:void 0,a:void 0}),e}}),i(r,{get when(){return t.probs().some(e=>e.level===`error`)},get children(){var e=Mr(),n=e.firstChild.nextSibling;return E(n,i(b,{get each(){return t.probs().filter(e=>e.level===`error`)},children:e=>(()=>{var t=Sr();return E(t,()=>e.message),t})()})),e}})]}function Qi(e){let t=e.c,n=()=>t.spec();return[i($,{label:`Title`,get error(){return t.fieldProblem(`team`,`error`)},children:e=>(()=>{var r=Pr();return D(r,s(e,{type:`text`,get value(){return n().title},onChange:e=>t.apply(me(n(),{title:e.currentTarget.value}))}),!1,!1),r})()}),i($,{label:`Description`,children:e=>(()=>{var r=Fr();return D(r,s(e,{rows:`2`,get value(){return n().description??``},onChange:e=>t.apply(me(n(),{description:e.currentTarget.value}))}),!1,!1),r})()}),i($,{label:`Tags (comma separated)`,children:e=>(()=>{var r=Pr();return D(r,s(e,{type:`text`,get value(){return he(n())},onChange:e=>t.apply(me(n(),{tags:e.currentTarget.value}))}),!1,!1),r})()}),i($,{label:`Metadata (key=value per line)`,children:e=>(()=>{var r=Fr();return D(r,s(e,{rows:`2`,get value(){return ge(n())},onChange:e=>t.apply(me(n(),{metadata:e.currentTarget.value}))}),!1,!1),r})()}),i(r,{get when(){return e.withMode},get children(){return i(Ji,{get value(){return n().mode},onChange:e=>t.apply(pe(n(),e)),get name(){return`te-mode-${t.id}`}})}})]}function $i(e){let t=e.c,n=()=>t.spec(),[a,o]=c(``),[l,u]=c(``);return[i(r,{get when(){return t.fieldProblem(`entry`,`error`)||t.fieldProblem(`roles`,`error`)},get children(){var e=Ir();return E(e,()=>t.fieldProblem(`entry`,`error`)??t.fieldProblem(`roles`,`error`)),e}}),(()=>{var a=Lr();return E(a,i(b,{get each(){return[...n().roles]},children:a=>(()=>{var o=Br(),c=o.firstChild,l=c.firstChild,u=l.nextSibling,d=u.firstChild,f=d.nextSibling,p=u.nextSibling,m=c.nextSibling,h=m.firstChild;return E(l,()=>a.name),E(c,i(r,{get when(){return!t.publishedRoles().has(a.name)},get children(){return zr()}}),u),d.addEventListener(`change`,()=>t.apply(ue(n(),a.name))),E(f,()=>n().entryRole===a.name?`★ Entry role`:`Entry role`),p.$$click=()=>t.apply(ce(n(),a.name)),E(o,i($,{get label(){return`Label of ${a.name}`},get warning(){return t.fieldProblem(`role:${a.name}`,`warning`)},children:r=>(()=>{var i=Pr();return v(t=>e.roleInput?.(a.name,t),i),D(i,s(r,{type:`text`,get value(){return a.label??``},onChange:e=>t.apply(le(n(),a.name,{label:e.currentTarget.value}))}),!1,!1),i})()}),m),h.addEventListener(`change`,e=>t.apply(le(n(),a.name,{externalContact:e.currentTarget.checked}))),w(e=>{var r=a.name,i=`te-entry-${t.id}`,s=`Entry role: ${a.name}`,c=n().entryRole===a.name,l=`Remove role ${a.name}`;return r!==e.e&&S(o,`data-role`,e.e=r),i!==e.t&&S(d,`name`,e.t=i),s!==e.a&&S(d,`aria-label`,e.a=s),c!==e.o&&(p.disabled=e.o=c),l!==e.i&&S(p,`aria-label`,e.i=l),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),w(()=>d.checked=n().entryRole===a.name),w(()=>h.checked=a.externalContact===!0),o})()})),a})(),(()=>{var e=Rr(),r=e.firstChild,i=r.nextSibling,s=i.nextSibling;return e.addEventListener(`submit`,e=>{e.preventDefault();let r=se(n(),a(),l());t.apply(r),r.ok&&(o(``),u(``))}),r.$$input=e=>o(e.currentTarget.value),i.$$input=e=>u(e.currentTarget.value),w(()=>s.disabled=!a().trim()),w(()=>r.value=a()),w(()=>i.value=l()),e})()]}function ea(e){let t=e.c,a=()=>t.spec(),[o,s]=c(``),[l,u]=c(``),[d,f]=c(`one-way`),[p,m]=c(!0),[h,g]=c(!1),_,y=(e,t)=>{let n=a().edges.find(n=>n.from===e&&n.to===t);s(e),u(t),n&&(f(n.direction),m(n.kinds.includes(`msg`)),g(n.kinds.includes(`ask`))),queueMicrotask(()=>_?.focus())};n(()=>e.handle?.({prefill:y}));let x=e=>{e.preventDefault();let n=[...p()?[`msg`]:[],...h()?[`ask`]:[]];t.apply(de(a(),{from:o(),to:l(),kinds:n,direction:d()}))},C=e=>t.fieldProblem(`edge:${e.from}>${e.to}`,`error`);return[i(r,{get when(){return a().mode===`open`},get children(){return Vr()}}),i(r,{get when(){return a().edges.length},get fallback(){return(()=>{var t=Wr();return t.firstChild,E(t,()=>e.canvasHint?`Drag from one role to another on the 2D canvas, or use the form below.`:`Connect two roles below.`,null),t})()},get children(){var e=Hr();return E(e,i(b,{get each(){return[...a().edges]},children:e=>(()=>{var n=Kr(),o=n.firstChild,s=o.firstChild,c=s.nextSibling,l=c.nextSibling.nextSibling,u=l.nextSibling.nextSibling;u.nextSibling;var d=o.nextSibling,f=d.nextSibling,p=f.nextSibling;return E(o,()=>e.from,s),E(o,()=>Yi(e),c),E(o,()=>e.to,l),E(o,()=>e.direction,u),E(o,()=>e.kinds.join(` + `),null),E(n,i(r,{get when(){return C(e)},get children(){var t=Gr();return t.firstChild,E(t,()=>C(e),null),t}}),d),f.$$click=()=>y(e.from,e.to),p.$$click=()=>t.apply(fe(a(),e.from,e.to)),w(t=>{var n=C(e)?`te-err`:``,r=`Edit path ${e.from} to ${e.to}`,i=`Remove path ${e.from} to ${e.to}`;return n!==t.e&&A(o,t.e=n),r!==t.t&&S(f,`aria-label`,t.t=r),i!==t.a&&S(p,`aria-label`,t.a=i),t},{e:void 0,t:void 0,a:void 0}),n})()})),e}}),(()=>{var e=Ur(),n=e.firstChild.nextSibling,r=n.firstChild,c=r.firstChild.nextSibling;c.firstChild;var y=r.nextSibling.firstChild.nextSibling;y.firstChild;var C=n.nextSibling,T=C.firstChild.nextSibling,D=T.firstChild,O=T.nextSibling.firstChild,k=C.nextSibling,A=k.firstChild.nextSibling,j=A.firstChild,M=A.nextSibling.firstChild,N=k.nextSibling;e.addEventListener(`submit`,x),c.addEventListener(`change`,e=>s(e.currentTarget.value)),E(c,i(b,{get each(){return[...a().roles]},children:e=>(()=>{var t=qr();return E(t,()=>e.name),w(()=>t.selected=o()===e.name),w(()=>t.value=e.name),t})()}),null),y.addEventListener(`change`,e=>u(e.currentTarget.value)),E(y,i(b,{get each(){return[...a().roles]},children:e=>(()=>{var t=qr();return E(t,()=>e.name),w(()=>t.selected=l()===e.name),w(()=>t.value=e.name),t})()}),null),D.addEventListener(`change`,()=>f(`one-way`));var P=_;return typeof P==`function`?v(P,D):_=D,O.addEventListener(`change`,()=>f(`two-way`)),j.addEventListener(`change`,e=>m(e.currentTarget.checked)),M.addEventListener(`change`,e=>g(e.currentTarget.checked)),w(e=>{var n=`te-dir-${t.id}`,r=`te-dir-${t.id}`,i=!o()||!l();return n!==e.e&&S(D,`name`,e.e=n),r!==e.t&&S(O,`name`,e.t=r),i!==e.a&&(N.disabled=e.a=i),e},{e:void 0,t:void 0,a:void 0}),w(()=>c.value=o()),w(()=>y.value=l()),w(()=>D.checked=d()===`one-way`),w(()=>O.checked=d()===`two-way`),w(()=>j.checked=p()),w(()=>M.checked=h()),e})()]}function ta(e){let t=()=>e.c.read().published;return(()=>{var e=Xr();return E(e,i(r,{get when(){return t().mode===`restricted`},get fallback(){return(()=>{var e=Zr(),n=e.firstChild.nextSibling.nextSibling;return E(n,()=>t().entryRole),e})()},get children(){return[(()=>{var e=Jr(),n=e.firstChild.nextSibling.nextSibling;return E(n,()=>t().entryRole),e})(),i(r,{get when(){return t().edges.length},get fallback(){return Qr()},get children(){var e=Yr();return E(e,i(b,{get each(){return[...t().edges]},children:e=>(()=>{var t=$r(),n=t.firstChild,r=n.nextSibling,i=r.nextSibling,a=i.nextSibling;return a.firstChild,E(n,()=>e.from),E(r,()=>Yi(e)),E(i,()=>e.to),E(a,()=>e.kinds.join(` + `),null),w(()=>S(r,`aria-label`,e.direction===`two-way`?`both ways`:`to`)),t})()})),e}})]}})),e})()}function na(e){let a=e.c,[o,l]=c(),[u,f]=c();n(()=>e.handle?.({add:(e,t)=>l({role:e,...t?{sessionID:t}:{}})}));let p=t(()=>{let e=a.roster()?.roles??(a.read()?.published.roles??[]).map(e=>({role:e.name,entry:e.name===a.read().published.entryRole,minMembers:e.minMembers??0,maxMembers:e.maxMembers??16,vacant:!0,understaffed:!1,launching:0,seats:[]})),t=(a.spec()?.roles??[]).filter(e=>!a.publishedRoles().has(e.name)).map(e=>({role:e.name,draftOnly:!0}));return[...e,...t]}),m=t(()=>new Map(p().map(e=>[e.role,e]))),h=t(()=>p().map(e=>e.role),void 0,{equals:(e,t)=>e.length===t.length&&e.every((e,n)=>e===t[n])}),g=e=>a.read()?.published.roles.find(t=>t.name===e)?.label,_=()=>!!a.team()?.paused;return(()=>{var n=ri();return E(n,i(r,{get when(){return!a.roster()},get children(){return ei()}}),null),E(n,i(r,{get when(){return _()},get children(){return ti()}}),null),E(n,i(b,{get each(){return h()},children:n=>{let o=()=>m().get(n),s=()=>{let e=o();return e&&`seats`in e?e:void 0},c=t(()=>s()?it(s(),e.snap):[]),p=e=>c().find(t=>t.staffingID===e);return(()=>{var t=ui(),o=t.firstChild,m=o.firstChild,h=m.firstChild;return S(t,`aria-label`,`Role ${n}`),S(t,`data-role`,n),E(h,()=>s()?.entry?`★ `:``,null),E(h,n,null),E(m,i(r,{get when(){return g(n)},get children(){var e=ii();return e.firstChild,E(e,()=>g(n),null),e}}),null),E(m,i(r,{get when(){return s()?.entry},get children(){return ai()}}),null),E(m,i(r,{get when(){return!s()},get children(){return zr()}}),null),E(m,i(r,{get when(){return P(()=>!!s())()&&(s().vacant||s().understaffed)},get children(){var e=oi();return E(e,()=>s()?.vacant?`vacant`:`understaffed`),e}}),null),E(o,i(r,{get when(){return s()},get children(){var e=si();return E(e,(()=>{var e=P(()=>!!s());return()=>e()?st(s().seats.length,s().minMembers,s().maxMembers):``})(),null),E(e,(()=>{var e=P(()=>!!s()?.launching);return()=>e()?` · ${s().launching} launching`:``})(),null),e}}),null),E(t,i(r,{get when(){return!!s()},get fallback(){return(()=>{var e=di(),t=e.firstChild.nextSibling;return t.nextSibling,E(e,n,t),e})()},get children(){return[i(r,{get when(){return c().length>0},get fallback(){return fi()},get children(){var e=ci();return S(e,`aria-label`,`Members of ${n}`),E(e,i(b,{get each(){return c().map(e=>e.staffingID)},children:e=>i(r,{get when(){return p(e)},children:e=>(()=>{var t=pi(),r=t.firstChild,i=r.nextSibling,o=i.nextSibling,s=o.nextSibling;return E(i,()=>e().name),E(o,()=>[e().online?`online`:e().presence===`unknown`?`presence unknown`:e().presence,e().machine,e().harness,`gen ${e().generation}`].filter(Boolean).join(` · `)),s.$$click=()=>void a.unstaff(e().staffingID,e().revision,e().name,n),w(t=>{var o=`tm-dot ${e().online?`on`:`off`}`,c=d(e().sessionID),l=a.busy(),u=`Unstaff ${e().name} from ${n}`;return o!==t.e&&A(r,t.e=o),c!==t.t&&S(i,`href`,t.t=c),l!==t.a&&(s.disabled=t.a=l),u!==t.o&&S(s,`aria-label`,t.o=u),t},{e:void 0,t:void 0,a:void 0,o:void 0}),t})()})})),e}}),(()=>{var e=li(),t=e.firstChild,r=t.nextSibling,i=r.firstChild.nextSibling;return i.nextSibling,t.$$click=()=>l({role:n}),S(t,`aria-label`,`Add member to ${n}`),r.$$click=()=>f(u()===n?void 0:n),E(r,n,i),w(e=>{var i=_()||a.busy(),o=_()||a.busy(),s=u()===n;return i!==e.e&&(t.disabled=e.e=i),o!==e.t&&(r.disabled=e.t=o),s!==e.a&&S(r,`aria-expanded`,e.a=s),e},{e:void 0,t:void 0,a:void 0}),e})(),i(r,{get when(){return u()===n},get children(){return i(ia,{c:a,get snap(){return e.snap},role:n,onDone:()=>f(void 0)})}})]}}),null),t})()}}),null),E(n,i(r,{get when(){return e.canvasHint},get children(){return ni()}}),null),E(n,i(r,{get when(){return o()},keyed:!0,children:t=>i(ra,s({c:a,get snap(){return e.snap},get role(){return t.role}},()=>t.sessionID?{sessionID:t.sessionID}:{},{onClose:()=>l(void 0),onLaunch:()=>f(t.role)}))}),null),n})()}function ra(e){let a=e.c,[o,s]=c(``),[l,u]=c(e.sessionID??``),d,f=t=>({teamID:a.id,role:e.role,query:t,...a.roster()?{roster:a.roster().seats}:{}}),p=t(()=>at(e.snap,f(o()))),m=t(()=>at(e.snap,f(``)).find(e=>e.sessionID===l())),h=()=>m()?.name??l();n(()=>e.sessionID&&queueMicrotask(()=>d?.focus()));let g=async t=>{t.preventDefault(),l()&&await a.attach(e.role,l(),h())&&e.onClose()},_=e=>e.map(e=>`${e.team} (${e.role})`).join(`, `);return i(j,{open:!0,get title(){return`Add a member to ${e.role}`},get onClose(){return e.onClose},class:`tm-picker`,get children(){var t=gi(),n=t.firstChild,c=n.firstChild.nextSibling;c.nextSibling;var f=n.nextSibling,y=f.nextSibling,x=y.firstChild,C=x.nextSibling,T=C.nextSibling;T.firstChild,t.addEventListener(`submit`,g),E(n,()=>e.role,c),f.$$input=e=>s(e.currentTarget.value),E(t,i(r,{get when(){return e.snap},get fallback(){return _i()},get children(){var t=mi();return t.firstChild,E(t,i(r,{get when(){return p().length},get fallback(){return(()=>{var e=vi();return E(e,()=>o()?`No session matches.`:`No running sessions.`),e})()},get children(){return i(b,{get each(){return p()},children:t=>(()=>{var n=yi(),r=n.firstChild,i=r.nextSibling,o=i.nextSibling.firstChild,s=o.nextSibling;s.firstChild;var c=s.nextSibling;return r.addEventListener(`change`,()=>u(t.sessionID)),E(o,()=>t.name),E(s,()=>[t.online?`online`:`offline`,t.machine,t.harness].filter(Boolean).join(` · `),null),E(c,(()=>{var n=P(()=>!!t.seated);return()=>n()?`Already holds ${e.role}.`:P(()=>!!t.memberships.length)()?`Also in ${_([...t.memberships])}`:`In no other team`})(),null),E(c,(()=>{var e=P(()=>!(!t.here.length||t.seated));return()=>e()?` · here as ${t.here.join(`, `)}`:``})(),null),w(e=>{var o=l()===t.sessionID,s=!!t.seated,c=`tm-pick-${a.id}`,u=t.seated,d=`tm-dot ${t.online?`on`:`off`}`;return o!==e.e&&n.classList.toggle(`chosen`,e.e=o),s!==e.t&&n.classList.toggle(`seated`,e.t=s),c!==e.a&&S(r,`name`,e.a=c),u!==e.o&&(r.disabled=e.o=u),d!==e.i&&A(i,e.i=d),e},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),w(()=>r.value=t.sessionID),w(()=>r.checked=l()===t.sessionID),n})()})}}),null),t}}),y),E(t,i(r,{get when(){return l()},get children(){var e=hi();return E(e,(()=>{var e=P(()=>!!m()?.memberships.length);return()=>e()?`${h()} is also in: ${m().memberships.map(e=>`${e.team} as ${e.role}`).join(`; `)}.`:`${h()} is in no other team.`})()),e}}),y),E(t,i(Ki,{get notice(){return P(()=>a.notice()?.kind===`ok`)()?void 0:a.notice()}}),y),x.$$click=()=>{e.onClose(),e.onLaunch()},O(C,`click`,e.onClose,!0);var D=d;return typeof D==`function`?v(D,T):d=T,E(T,()=>e.role,null),w(n=>{var r=`Add a member to ${e.role}`,i=!e.sessionID,o=!l()||a.busy();return r!==n.e&&S(t,`aria-label`,n.e=r),i!==n.t&&(f.autofocus=n.t=i),o!==n.a&&(T.disabled=n.a=o),n},{e:void 0,t:void 0,a:void 0}),w(()=>f.value=o()),t}})}function ia(e){let a=e.c,[o,l]=c(e.role??``),[u,d]=c(``),[f,p]=c(``),[m,h]=c(``),[g,_]=c(``),[v,y]=c(`worktree`),[x,S]=c(``),[C,T]=c(``),[O,k]=c(``),[A,j]=c(``),[M,N]=c(),[P,ee]=c([]);n(()=>void hr().then(ee));let F=t(()=>(e.snap?.nodes??[]).filter(e=>e.kind===`machine`)),I=t(()=>{let e=F().find(e=>e.machineID===u());return e?.harnesses.length?e.harnesses:[`opencode`,`claude-code`,`codex`]}),L=e=>M()?.field===e?M().error:void 0,R=async t=>{t.preventDefault();let n=Re({role:o(),machine:u(),harness:f(),profile:m(),repo:g(),mode:v(),branch:x(),remote:C(),name:O(),prompt:A()});if(!o())return N({field:`role`,error:`Choose a published role`});if(!n.ok)return N({field:n.field,error:n.error});N(void 0),await a.launch(o(),n.body)&&e.onDone?.()};return(()=>{var t=xi(),n=t.firstChild.nextSibling,c=n.firstChild;return t.addEventListener(`submit`,R),E(t,i($,{label:`Role`,get error(){return L(`role`)},children:e=>(()=>{var t=Si();return t.firstChild,D(t,s(e,{onChange:e=>l(e.currentTarget.value)}),!1,!0),E(t,i(b,{get each(){return[...a.publishedRoles()]},children:e=>(()=>{var t=qr();return t.value=e,E(t,e),w(()=>t.selected=o()===e),t})()}),null),t})()}),n),E(t,i($,{label:`Machine`,children:e=>(()=>{var t=Ci();return t.firstChild,D(t,s(e,{onChange:e=>d(e.currentTarget.value)}),!1,!0),E(t,i(b,{get each(){return F().map(e=>e.machineID??e.id)},children:e=>{let t=()=>F().find(t=>(t.machineID??t.id)===e);return(()=>{var n=qr();return n.value=e,E(n,()=>t()?.label??e,null),E(n,()=>t()?.online===!1?` (offline)`:``,null),w(()=>n.selected=u()===e),n})()}}),null),t})()}),n),E(t,i($,{label:`Harness`,children:e=>(()=>{var t=wi();return t.firstChild,D(t,s(e,{onChange:e=>p(e.currentTarget.value)}),!1,!0),E(t,i(b,{get each(){return I()},children:e=>(()=>{var t=qr();return t.value=e,E(t,e),w(()=>t.selected=f()===e),t})()}),null),t})()}),n),E(t,i($,{label:`Agent profile`,children:e=>(()=>{var t=Ti();return t.firstChild,D(t,s(e,{onChange:e=>h(e.currentTarget.value)}),!1,!0),E(t,i(b,{get each(){return P()},children:e=>(()=>{var t=Ei(),n=t.firstChild,r=n.nextSibling;return r.nextSibling,E(t,()=>e.title,n),E(t,()=>e.version,r),w(()=>t.value=`${e.id}@${e.version}`),t})()}),null),t})()}),n),E(t,i($,{label:`Repository on the machine`,get error(){return L(`repo`)},children:e=>(()=>{var t=Pr();return D(t,s(e,{type:`text`,placeholder:`/home/you/projects/app`,get value(){return g()},onInput:e=>_(e.currentTarget.value)}),!1,!1),t})()}),n),E(t,i($,{label:`Workspace`,children:e=>(()=>{var t=Di();return D(t,s(e,{onChange:e=>y(e.currentTarget.value)}),!1,!0),t})()}),n),E(t,i(r,{get when(){return v()===`worktree`},get children(){return i($,{label:`Branch`,get error(){return L(`branch`)},children:e=>(()=>{var t=Pr();return D(t,s(e,{type:`text`,get value(){return x()},onInput:e=>S(e.currentTarget.value)}),!1,!1),t})()})}}),n),E(t,i(r,{get when(){return v()===`clone`},get children(){return i($,{label:`Remote`,get error(){return L(`remote`)},children:e=>(()=>{var t=Pr();return D(t,s(e,{type:`text`,get value(){return C()},onInput:e=>T(e.currentTarget.value)}),!1,!1),t})()})}}),n),E(t,i($,{label:`Session name (optional)`,get error(){return L(`name`)},children:e=>(()=>{var t=Pr();return D(t,s(e,{type:`text`,get value(){return O()},onInput:e=>k(e.currentTarget.value)}),!1,!1),t})()}),n),E(t,i($,{label:`First prompt (optional)`,children:e=>(()=>{var t=Fr();return D(t,s(e,{rows:`2`,get value(){return A()},onInput:e=>j(e.currentTarget.value)}),!1,!1),t})()}),n),E(n,i(r,{get when(){return e.onDone},get children(){var t=bi();return t.$$click=()=>e.onDone(),t}}),null),w(()=>c.disabled=a.busy()||!!a.team()?.paused),t})()}function aa(e){let t=e.c,[n,a]=c(``),[o,l]=c(``),[u,d]=c(`normal`),[f,p]=c(``),[m,h]=c(),g=e=>m()?.field===e?m().error:void 0,_=async e=>{e.preventDefault();let r=Be({title:n(),brief:o(),priority:u(),criteria:f()});if(!r.ok)return h({field:r.field,error:r.error});h(void 0),await t.submit(r.body)&&(a(``),l(``),p(``))};return i(r,{get when(){return P(()=>!t.team()?.paused)()&&t.team()?.state!==`archived`},get fallback(){return(()=>{var e=vi();return E(e,()=>t.team()?.state===`archived`?`The team is archived: restore it to give it work.`:`The team is paused: it takes no new work. Resume it first.`),e})()},get children(){var e=Oi(),r=e.firstChild,c=r.nextSibling,m=c.firstChild,h=m.nextSibling,v=h.firstChild.nextSibling;return v.nextSibling,e.addEventListener(`submit`,_),E(e,i($,{label:`Task title`,get error(){return g(`title`)},children:e=>(()=>{var t=Pr();return D(t,s(e,{type:`text`,placeholder:`What should the team do?`,get value(){return n()},onInput:e=>a(e.currentTarget.value)}),!1,!1),t})()}),r),E(e,i($,{label:`Brief`,get error(){return g(`brief`)},children:e=>(()=>{var t=Fr();return D(t,s(e,{rows:`3`,get value(){return o()},onInput:e=>l(e.currentTarget.value)}),!1,!1),t})()}),r),E(r,i($,{label:`Priority`,children:e=>(()=>{var t=ki();return D(t,s(e,{onChange:e=>d(e.currentTarget.value)}),!1,!0),E(t,i(b,{get each(){return[...ze]},children:e=>(()=>{var t=qr();return t.value=e,E(t,e),w(()=>t.selected=u()===e),t})()})),t})()})),E(e,i($,{label:`Done when (one per line)`,get error(){return g(`criteria`)},children:e=>(()=>{var t=Fr();return D(t,s(e,{rows:`2`,get value(){return f()},onInput:e=>p(e.currentTarget.value)}),!1,!1),t})()}),c),E(h,()=>t.read()?.published.entryRole,v),w(()=>m.disabled=t.busy()),e}})}var oa={queued:`Submitted`,routed:`Routed`,working:`Working`,closed:`Closed`};function sa(e){let n=e.c,a=t(()=>e.limit?(n.items()??[]).slice(0,e.limit):n.items()??[]),o=t=>e.snap?.nodes.find(e=>e.id===t)?.label??t;return[i(r,{get when(){return n.intakeError()},get children(){var e=Ai();return e.firstChild,E(e,()=>n.intakeError(),null),e}}),i(r,{get when(){return n.items()},get fallback(){return Mi()},get children(){return i(r,{get when(){return a().length},get fallback(){return Ni()},get children(){var e=ji();return E(e,i(b,{get each(){return a().map(e=>e.id)},children:e=>i(r,{get when(){return a().find(t=>t.id===e)},children:e=>i(ca,{c:n,get item(){return e()},sessionName:o})})})),e}})}})]}function ca(e){let t=()=>e.item,n=()=>Ye(t());return(()=>{var a=zi(),o=a.firstChild,s=o.firstChild,c=s.nextSibling,l=o.nextSibling,u=l.nextSibling,f=u.nextSibling;return E(s,()=>t().title),E(c,()=>Je[n()]),E(l,i(b,{get each(){return Ze(t())},children:e=>(()=>{var t=Sr();return E(t,()=>oa[e.step]),w(n=>{var r=`tm-step tm-step-${e.state}`,i=e.state===`current`||e.state===`blocked`?`step`:void 0;return r!==n.e&&A(t,n.e=r),i!==n.t&&S(t,`aria-current`,n.t=i),n},{e:void 0,t:void 0}),t})()})),E(u,()=>[t().priority===`normal`?void 0:`${t().priority} priority`,`submitted ${N(t().createdAt)}`,t().updatedAt===t().createdAt?void 0:`updated ${N(t().updatedAt)}`,t().lastError?`last routing error: ${t().lastError}`:void 0,t().reason?`reason: ${t().reason}`:void 0].filter(Boolean).join(` · `)),E(f,i(r,{get when(){return t().sessionID},get fallback(){return i(r,{get when(){return t().status===`queued`},get children(){return Bi()}})},get children(){return[Pi(),(()=>{var n=Fi();return E(n,()=>e.sessionName(t().sessionID)),w(()=>S(n,`href`,d(t().sessionID))),n})()]}}),null),E(f,i(r,{get when(){return t().workspaceID},get children(){var e=Ii();return w(n=>{var r=`/watchtower?group=workspace&ws=${encodeURIComponent(t().workspaceID)}`,i=`Assignment ${t().assignmentID??``} in workspace ${t().workspaceID}`;return r!==n.e&&S(e,`href`,n.e=r),i!==n.t&&S(e,`title`,n.t=i),n},{e:void 0,t:void 0}),e}}),null),E(f,i(r,{get when(){return Xe(t())},get children(){var n=Ri(),a=n.firstChild;return E(n,i(r,{get when(){return t().status===`routed`},get children(){var n=Li();return n.$$click=()=>void e.c.setIntake(t(),`done`),w(r=>{var i=e.c.busy(),a=`Mark ${t().title} done`;return i!==r.e&&(n.disabled=r.e=i),a!==r.t&&S(n,`aria-label`,r.t=a),r},{e:void 0,t:void 0}),n}}),a),a.$$click=()=>void e.c.setIntake(t(),`cancelled`),w(n=>{var r=e.c.busy(),i=`Cancel ${t().title}`;return r!==n.e&&(a.disabled=n.e=r),i!==n.t&&S(a,`aria-label`,n.t=i),n},{e:void 0,t:void 0}),n}}),null),w(e=>{var t=n(),r=`tm-phase tm-phase-${n()}`;return t!==e.e&&S(a,`data-phase`,e.e=t),r!==e.t&&A(c,e.t=r),e},{e:void 0,t:void 0}),a})()}function la(e){let[t,n]=c(),[a,o]=c(``);return T(u(()=>e.c.team()?.version,()=>void tr(e.c.id).then(e=>(n(e),o(``))).catch(e=>o(e.message)))),i(r,{get when(){return!a()},get fallback(){return(()=>{var e=Hi();return e.firstChild,E(e,a,null),e})()},get children(){return i(r,{get when(){return t()},get fallback(){return Ui()},get children(){var n=Vi();return E(n,i(b,{get each(){return t()},children:t=>(()=>{var n=Gi(),a=n.firstChild;a.firstChild;var o=a.nextSibling;return o.firstChild,E(a,()=>t.version,null),E(o,()=>N(t.publishedAt),null),E(n,i(r,{get when(){return t.version===e.c.team()?.version},get children(){return Wi()}}),null),n})()})),n}})}})}x([`click`,`input`]);var ua=C(`<p role=alert class=wt-error>`),da=C(`<form class="te-form tm-create"aria-label="New team"><div class=te-row></div><p class=muted>Creating publishes version 1 at once. You add members and more roles next.</p><div class=dialog-actions><button type=button class=btn>Cancel</button><button type=submit class="btn primary">Create team`),fa=C(`<input>`),pa=e=>`/teams/${encodeURIComponent(e)}`;function ma(e){let[t,n]=c(``),[a,o]=c(``),[l,u]=c(`restricted`),[d,f]=c(`pm`),[p,m]=c(`Project manager`),[h,g]=c(),[_,v]=c(!1),b=gr(),x=e=>h()?.field===e?h().error:void 0,S=async r=>{r.preventDefault();let i=we({name:t(),title:a(),mode:l(),entryRole:d(),entryLabel:p()});if(!i.ok)return g({field:i.field,error:i.error});g(void 0),v(!0);try{let t=await ir(i.body,b);b=gr(),e.onClose(),n(``),o(``),e.onCreated?e.onCreated(t.team.id):y(pa(t.team.id))}catch(e){g({field:`form`,error:Ne(e).message})}finally{v(!1)}};return i(j,{get open(){return e.open},title:`New team`,get onClose(){return e.onClose},get children(){var c=da(),h=c.firstChild,g=h.nextSibling,v=g.nextSibling.firstChild,y=v.nextSibling;return c.addEventListener(`submit`,S),E(c,i($,{label:`Name (the #team address, can't change)`,get error(){return x(`name`)},children:e=>(()=>{var r=fa();return D(r,s(e,{get value(){return t()},onInput:e=>n(e.currentTarget.value),placeholder:`product-a`,autofocus:!0}),!1,!1),r})()}),h),E(c,i($,{label:`Title`,get error(){return x(`title`)},children:e=>(()=>{var t=fa();return D(t,s(e,{get value(){return a()},onInput:e=>o(e.currentTarget.value),placeholder:`Product A`}),!1,!1),t})()}),h),E(c,i(Ji,{get value(){return l()},onChange:u,name:`tm-new-mode`}),h),E(h,i($,{label:`Entry role (receives the team's work)`,get error(){return x(`entry`)},children:e=>(()=>{var t=fa();return D(t,s(e,{get value(){return d()},onInput:e=>f(e.currentTarget.value)}),!1,!1),t})()}),null),E(h,i($,{label:`Entry role label`,children:e=>(()=>{var t=fa();return D(t,s(e,{get value(){return p()},onInput:e=>m(e.currentTarget.value)}),!1,!1),t})()}),null),E(c,i(r,{get when(){return x(`form`)},get children(){var e=ua();return E(e,()=>x(`form`)),e}}),g),O(v,`click`,e.onClose,!0),w(()=>y.disabled=_()),c}})}x([`click`]);var ha=new Set([`agent`,`status`,`catalog`,`resync`,`decision`]),ga=2e3;function _a(e,t){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 e()}finally{a=!1,o?f():d()}}},d=()=>{clearTimeout(r);let e=ot({visible:c(),openWork:t()});e!==void 0&&s&&(r=setTimeout(()=>void l(),e))},f=()=>{c()&&s&&(o=!0,!a&&(clearTimeout(r),r=setTimeout(()=>void l(),Math.max(0,i+ga-Date.now()))))};n(()=>{let e=I(e=>typeof e.type==`string`&&ha.has(e.type)&&f()),t=()=>c()?void l():clearTimeout(r);document.addEventListener(`visibilitychange`,t),d(),ee(()=>{s=!1,e(),clearTimeout(r),document.removeEventListener(`visibilitychange`,t)})}),T(u(t,()=>!a&&!o&&d(),{defer:!0}))}export{In as $,xt as A,Ft as B,Un as C,Cn as D,wt as E,zn as F,Kt as G,Nt as H,cn as I,At as J,vn as K,Hn as L,jt as M,Sn as N,ut as O,It as P,pn as Q,Yt as R,Wn as S,lt as T,mn as U,Pt as V,Ln as W,_n as X,bn as Y,En as Z,Zn as _,Zi as a,Vn as at,Kn as b,Ji as c,Le as ct,ta as d,pe as dt,Bn as et,$i as f,Fe as ft,_r as g,la as h,Qi as i,ln as it,Ct as j,St as k,Ki as l,Ne as lt,Xi as m,ma as n,Nn as nt,sa as o,Fn as ot,aa as p,Ot as q,pa as r,Rn as rt,na as s,et as st,_a as t,Pn as tt,ea as u,Ie as ut,Xn as v,Lt as w,qn as x,Qn as y,Jt as z};
@@ -0,0 +1 @@
1
+ import{J as e}from"./ui-C9Igxzjm.js";var t={workspacesPerUser:200,membersPerWorkspace:200,bindingsPerWorkspace:16,supervisionLinksPerWorkspace:400,supervisionDepth:6,checkpointsPerSupervisor:50,sideChatsPerWorkspace:100,sideChatContextItems:20,sideChatContextBytes:65536,panes:4};function n(e,n,r,i=t.supervisionDepth){let a=new Map(e);a.set(n,r);let o=e=>{let t=new Set,n=0;for(let r=e;r!==void 0;r=a.get(r)){if(t.has(r))return`cycle`;t.add(r),a.has(r)&&n++}return n},s=0;for(let e of a.keys()){let t=o(e);if(t===`cycle`)return`cycle`;s=Math.max(s,t)}return s>i?`depth`:void 0}var r=t.panes,i=`hub.paneLayout.v1`,a=[`single`,`vertical`,`horizontal`,`grid`],o=t=>typeof t==`string`&&e.test(t),s=e=>`artifactID`in e&&e.sessionID===void 0?e.artifactID:void 0,c=(e,t)=>s(e)!==void 0||s(t)!==void 0?s(e)===s(t):e.sessionID===t.sessionID&&e.sideChatID===t.sideChatID,l=s,u=c;function d(e){if(typeof e!=`object`||!e)return;let{sessionID:t,sideChatID:n,artifactID:r}=e;return t===void 0?o(r)?{artifactID:r}:void 0:!o(t)||n!==void 0&&!o(n)?void 0:o(n)?{sessionID:t,sideChatID:n}:{sessionID:t}}function f(e){return{v:1,split:`single`,panes:e?[{sessionID:e}]:[],focused:0}}function p(e,t,n){let r=Number.isInteger(n)?Math.min(Math.max(0,n),Math.max(0,t.length-1)):0;return{v:1,split:t.length<=1?`single`:e===`single`?`vertical`:e,panes:t,focused:r}}function m(e){if(typeof e!=`object`||!e||Array.isArray(e))return;let t=e;if(t.v!==1||!Array.isArray(t.panes))return;let n=[];for(let e of t.panes){if(n.length>=r)break;let t=d(e)??(typeof e==`object`&&e&&o(e.sessionID)?{sessionID:e.sessionID}:void 0);t&&(n.some(e=>c(e,t))||n.push(t))}return p(a.includes(t.split)?t.split:`vertical`,n,typeof t.focused==`number`?t.focused:0)}function h(e,t,n={}){let i=d(t);if(!i)return{layout:e,outcome:`invalid`};let a=e.panes.findIndex(e=>c(e,i));if(a>=0)return{layout:a===e.focused?e:p(e.split,e.panes,a),outcome:`focused`};if(!e.panes.length)return{layout:p(e.split,[i],0),outcome:`added`};if(n.beside){if(e.panes.length>=r)return{layout:e,outcome:`limit`};let t=e.focused+1;return{layout:p(e.split,[...e.panes.slice(0,t),i,...e.panes.slice(t)],t),outcome:`added`}}return{layout:p(e.split,e.panes.map((t,n)=>n===e.focused?i:t),e.focused),outcome:`replaced`}}function g(e,t){if(!Number.isInteger(t)||t<0||t>=e.panes.length)return e;let n=e.panes.filter((e,n)=>n!==t);return p(e.split,n,t<e.focused?e.focused-1:e.focused)}function _(e,t){return!Number.isInteger(t)||t<0||t>=e.panes.length||t===e.focused?e:p(e.split,e.panes,t)}function v(e,t){return!a.includes(t)||e.panes.length<=1||t===`single`||t===e.split?e:p(t,e.panes,e.focused)}function y(e){try{let t=e?.getItem(i);return t?m(JSON.parse(t)):void 0}catch{return}}function b(e,t){if(!e)return!1;try{return e.setItem(i,JSON.stringify(t)),!0}catch{return!1}}function x(e,t,n){let r=e.panes.length,i=e=>Number.isInteger(e)&&e>=0&&e<r;if(!i(t)||!i(n)||t===n)return e;let a=e.panes.map((e,t)=>t);return a.splice(n,0,...a.splice(t,1)),p(e.split,a.map(t=>e.panes[t]),a.indexOf(e.focused))}function S(e,t){let n=e.panes.length;return n>1?_(e,(e.focused+t+n)%n):e}export{y as a,l as c,v as d,p as f,n as g,t as h,_ as i,u as l,d as m,g as n,x as o,f as p,S as r,h as s,r as t,b as u};
@@ -0,0 +1 @@
1
+ function e(e){let t=e.length>1&&e===e.toUpperCase()&&e!==e.toLowerCase(),n=e.toLowerCase(),r=/(s|x|z|ch|sh)$/.test(n)?`es`:/[^aeiou]y$/.test(n)?`ies`:`s`;return(r===`ies`?e.slice(0,-1):e)+(t?r.toUpperCase():r)}var t=(t,n,r)=>`${t} ${t===1?n:r??e(n)}`;export{t};
@@ -0,0 +1 @@
1
+ import{A as e,B as t,E as n,G as r,V as i,j as a,k as o}from"./live-YyTjE47g.js";import{a as s,i as c,n as l,o as u,r as d}from"./Watchtower-C4swrWVs.js";import{a as f,c as p,i as m,r as h,s as g,t as _}from"./safe-area-DfPsOdWR.js";var v={w:76,h:58,pad:16,header:38,role:118,gap:40,band:120,party:120,roleRow:92},y=14,b=8,x=200,S=420,C=(e,t)=>Math.max(1,Math.min(t,Math.ceil(Math.sqrt(e*2))));function ee(e){let t=new Map,n=new Set(e.nodes.map(e=>e.id));t.set(`hub`,{x:0,y:0}),e.nodes.filter(e=>e.id!==`hub`&&(e.kind===`hub`||e.kind===`user`||e.kind===`app`)).forEach((e,n)=>t.set(e.id,{x:(n%2==0?-1:1)*v.party*(Math.floor(n/2)+1),y:0}));let r=e.groups.map(e=>{let t=e.sections.map(e=>{let t=e.id!==void 0,n=C(e.members.length,t?b:y),r=Math.max(1,Math.ceil(e.members.length/n));return{cols:n,rows:r,role:t,w:(t?v.role+v.w/2:0)+n*v.w,h:r*(t?v.roleRow:v.h)}});return{group:e,sections:t,w:Math.max((e.kind===`team`?S:x)-2*v.pad,...t.map(e=>e.w))+2*v.pad,h:v.header+t.reduce((e,t)=>e+t.h,0)+v.pad}}),i=r.reduce((e,t)=>e+(t.w+v.gap)*(t.h+v.gap),0),a=Math.max(...r.map(e=>e.w),Math.sqrt(i)*1.5,1),o=[],s=[],c=0;for(let e of r)s.length&&c+v.gap+e.w>a&&(o.push(s),s=[],c=0),c+=(s.length?v.gap:0)+e.w,s.push(e);s.length&&o.push(s);let l=[],u=v.band;for(let e of o){let r=-(e.reduce((e,t)=>e+t.w,0)+v.gap*(e.length-1))/2;for(let i of e){let{group:e}=i,a=[],o=u+v.header;e.sections.forEach((e,s)=>{let c=i.sections[s],l={x:r+v.pad,y:o,w:i.w-2*v.pad,h:c.h};a.push({...l,...e.id===void 0?{}:{id:e.id},...e.label===void 0?{}:{label:e.label},...e.entry===void 0?{}:{entry:e.entry}});let u=c.role?v.roleRow:v.h;e.id!==void 0&&n.has(e.id)&&t.set(e.id,{x:l.x+v.role/2,y:o+u/2});let d=l.x+(c.role?v.role+s%2*(v.w/2):0);e.members.forEach((e,n)=>t.set(e,{x:d+n%c.cols*v.w+v.w/2,y:o+Math.floor(n/c.cols)*u+u/2})),o+=c.h}),n.has(e.id)&&t.set(e.id,{x:r+v.pad+12,y:u+v.header/2}),l.push({id:e.id,label:e.label,kind:e.kind,x:r,y:u,w:i.w,h:i.h,...e.machine===void 0?{}:{machine:e.machine},...e.online===void 0?{}:{online:e.online},...e.mode===void 0?{}:{mode:e.mode},...e.paused===void 0?{}:{paused:e.paused},...e.entryRole===void 0?{}:{entryRole:e.entryRole},members:e.sections.reduce((e,t)=>e+t.members.length,0),sections:a}),r+=i.w+v.gap}u+=Math.max(...e.map(e=>e.h))+v.gap}let d=e.nodes.filter(e=>!t.has(e.id));d.forEach((e,n)=>t.set(e.id,{x:(n-(d.length-1)/2)*v.w,y:u+v.h/2}));let f=[],p=[];for(let e of t.values())f.push(e.x-v.w/2,e.x+v.w/2),p.push(e.y-v.h/2,e.y+v.h/2);for(let e of l)f.push(e.x,e.x+e.w),p.push(e.y,e.y+e.h);let m=Math.min(...f)-40,h=Math.min(...p)-40;return{positions:t,boxes:l,bounds:{x:m,y:h,w:Math.max(...f)+40-m,h:Math.max(...p)+40-h}}}function te(e,t,n,r){let i=Math.max(1,t.width-n.left-n.right),a=Math.max(1,t.height-n.top-n.bottom),o=Math.max(r.min,Math.min(r.max,Math.min(i/Math.max(1,e.w),a/Math.max(1,e.h))));return{k:o,x:n.left+i/2-(e.x+e.w/2)*o,y:n.top+a/2-(e.y+e.h/2)*o}}function ne(e,t,n){let r=t===void 0?void 0:e.get(t);if(!r)return e.keys().next().value;let i,a=1/0;for(let[o,s]of e){if(o===t)continue;let e=s.x-r.x,c=s.y-r.y,[l,u]=n===`right`?[e,c]:n===`left`?[-e,c]:n===`down`?[c,e]:[-c,e];if(l<=0||Math.abs(u)>l*2)continue;let d=l+2*Math.abs(u);d<a&&(a=d,i=o)}return i??t}var re={glow:!0,pulses:!0,labels:12},w=.04,ie=4,ae=.55,oe=9.5,T={w:180,h:120},E=`system-ui, -apple-system, sans-serif`,se=e=>e.kind===`hub`?22:e.kind===`role`?13:Math.max(8,Math.min(20,e.size*1.9)),D=e=>e.kind===`hub`||e.kind===`role`?13:e.kind===`aggregate`?se(e)*.8:e.kind===`session`?Math.max(5,Math.min(11,3+e.size)):8,ce=(e,t)=>e.length>t?`${e.slice(0,t-1)}…`:e;function le(e){let t=0;for(let n=0;n<e.length;n++)t=t*31+e.charCodeAt(n)|0;return(t>>>0)%1e3/1e3}function ue(e,t){return e.kind===`hub`?t(`--accent`):e.kind===`user`||e.kind===`app`?t(`--text`):e.kind===`team`||e.kind===`role`?t(`--violet`):e.kind===`cluster`?t(`--muted`):e.machine===void 0?t(`--faint`):t(n[e.machine%n.length])}function de(e,t,n,r){e.beginPath(),e.roundRect(t-v.role/2+8,n-r,v.role-16,r*2,r)}function fe(e,t,n){let r=t.x-e.x,i=t.y-e.y,a={x:(e.x+t.x)/2-i*n,y:(e.y+t.y)/2+r*n};return{c:a,mid:{x:.25*e.x+.5*a.x+.25*t.x,y:.25*e.y+.5*a.y+.25*t.y}}}var pe=e=>e.kind===`structure`?e.bridge?.18:0:e.kind===`policy`?.22:e.kind===`denied`?-.22:.1;function me(e,t,n,r,i,a,o){let s=Math.atan2(n.y-t.y,n.x-t.x);e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(n.x-r*Math.cos(s-.45),n.y-r*Math.sin(s-.45)),e.lineTo(n.x-r*Math.cos(s+.45),n.y-r*Math.sin(s+.45)),e.closePath(),e.setLineDash([]),e.fillStyle=i?o:a,e.fill(),e.strokeStyle=a,e.lineWidth=1.4,e.stroke()}function he(e,t,n){let r=Math.hypot(e.x-t.x,e.y-t.y)||1;return{x:e.x-(e.x-t.x)/r*n,y:e.y-(e.y-t.y)/r*n}}function ge(e,t,n){let r=n.x-t.x,i=n.y-t.y,a=r||i?Math.max(0,Math.min(1,((e.x-t.x)*r+(e.y-t.y)*i)/(r*r+i*i))):0;return Math.hypot(e.x-(t.x+a*r),e.y-(t.y+a*i))}function O(n,y){let b=document.createElement(`canvas`);b.className=`wt-canvas2d`;let x=b.getContext(`2d`);if(!x)throw Error(`This browser can't draw on a canvas`);let S=document.createElement(`canvas`);S.className=`wt-minimap`,S.setAttribute(`aria-hidden`,`true`),S.title=`Minimap: click to move the view`;let C=S.getContext(`2d`),O=document.createElement(`span`);O.className=`wt-tip wt-tip2d`,O.hidden=!0,n.append(b,S,O);let k,A,j=()=>`#888`,_e=!0,M,N,P,ve,F=n.clientWidth||300,I=n.clientHeight||150,L={k:1,x:F/2,y:80},R=!1,z=0,ye=0,be={s:1,ox:0,oy:0},B=new Map,xe=new Set,V=re,H=!1,U=!1,Se=0,Ce=0,we=new Map,Te=new Set,Ee=new Map,De=new Map,Oe=0,ke=!1,Ae=()=>window.devicePixelRatio||1,je=e=>({x:e.x*L.k+L.x,y:e.y*L.k+L.y}),W=(e,t)=>({x:(e-L.x)/L.k,y:(t-L.y)/L.k}),G=(e,t)=>{let n=b.getBoundingClientRect();return{x:e-n.left,y:t-n.top}},K=()=>{Ne=!0,z||=requestAnimationFrame(Qe)},q=document.createElement(`canvas`),Me=q.getContext(`2d`),J=x,Ne=!0,Pe=``,Y=(e,t)=>{cancelAnimationFrame(ye);let n={...e,k:Math.max(w,Math.min(ie,e.k))};if(!t||!_e){L=n,K();return}let r=L,i=performance.now(),a=e=>{let t=Math.min(1,(e-i)/260),o=1-(1-t)**3;L={k:r.k+(n.k-r.k)*o,x:r.x+(n.x-r.x)*o,y:r.y+(n.y-r.y)*o},Qe(),t<1&&(ye=requestAnimationFrame(a))};ye=requestAnimationFrame(a)},Fe=e=>{if(!A)return;let t=A.positions.get(`hub`);Y(U&&t?{k:1.3,x:F/2-t.x*1.3,y:I/2-t.y*1.3}:te(A.bounds,{width:F,height:I},_(n),{min:w,max:1.4}),e)},Ie=(e,t,n,r=!1)=>{let i=Math.max(w,Math.min(ie,L.k*n)),a=W(e,t);R=!0,Y({k:i,x:e-a.x*i,y:t-a.y*i},r)},Le=(e,t,n=L.k)=>Y({k:n,x:F/2-e.x*n,y:I/2-e.y*n},t);function Re(e){let t=J,n=e.kind===`team`,r=n&&e.mode===`restricted`,i=j(we.get(e.id)??`--line-2`);t.save(),t.beginPath(),t.roundRect(e.x,e.y,e.w,e.h,22),V.glow&&(t.shadowColor=u(i,H?.35:.22),t.shadowBlur=36*L.k),t.fillStyle=u(i,H?.075:.06),t.fill(),t.shadowBlur=0,t.lineWidth=n?1.6:1,t.setLineDash(r?[8,5]:e.online===!1?[4,4]:[]),t.strokeStyle=u(i,n?.65:.4),t.stroke(),t.setLineDash([]),e.sections.forEach((e,n)=>{e.entry&&(t.fillStyle=u(j(`--accent`),.09),t.beginPath(),t.roundRect(e.x,e.y+2,e.w,e.h-4,10),t.fill()),n>0&&e.id!==void 0&&(t.strokeStyle=u(i,.18),t.lineWidth=1,t.beginPath(),t.moveTo(e.x+10,e.y),t.lineTo(e.x+e.w-10,e.y),t.stroke())}),t.beginPath(),t.rect(e.x,e.y,e.w-8,v.header),t.clip();let a=e.x+v.pad+(xe.has(e.id)?30:4),o=e.y+v.header/2,s=ce(e.label,28);t.fillStyle=j(`--text`),t.font=`650 13px ${E}`,t.textBaseline=`middle`,t.fillText(s,a,o);let c=k?.teams.find(t=>t.id===e.id)?.members??e.members,l=n?`${r?`Restricted: declared paths only`:`Open: everyone may message everyone`}${e.paused?` · paused`:``} · ${c} seated`:`${e.members} ${e.members===1?`node`:`nodes`}${e.online===!1?` · offline`:``}`;t.fillStyle=j(`--muted`),t.font=`12px ${E}`,t.fillText(l,a+t.measureText(s).width+18,o),t.restore()}function ze(e,n){let r=n.get(e.source),i=n.get(e.target);if(!r||!i||e.kind===`structure`&&e.structure!==`tree`&&e.structure!==`party`&&e.structure!==`seat`&&!e.bridge)return;let a=J,o=B.get(e.source),s=B.get(e.target),{c,mid:l}=fe(r,i,pe(e)),d=e.kind===`structure`,f=d&&e.structure===`seat`,p=j(d?e.bridge||f?`--violet`:`--line-2`:t(e.kind)),m=qe(),h=!m||e.source===m||e.target===m;a.save(),a.globalAlpha=(o?.dim&&s?.dim?.15:1)*(h?1:.2),a.setLineDash(d?e.bridge?[3,4]:[]:e.style===`dotted`?[1.5,4.5]:e.style===`dashed`?[7,4]:[]),a.lineCap=`round`;let g=d?i:he(i,c,(s?D(s):0)+6),_=e.kind===`policy`&&e.twoWay?he(r,c,(o?D(o):0)+6):f&&o?.kind===`role`?{x:r.x+v.role/2-8,y:r.y}:r,y=()=>{a.beginPath(),a.moveTo(_.x,_.y),a.quadraticCurveTo(c.x,c.y,g.x,g.y)};if(d){a.strokeStyle=u(p,e.bridge?.8:f?.6:.55),a.lineWidth=e.bridge?1.4:f?1.5:1,y(),a.stroke(),a.restore();return}let b=k&&k.links.length>120?.55:1,x=e.kind===`policy`?.6:e.kind===`denied`?.85:Math.min(.95,.45+e.width*.09)*b,S=e.kind===`policy`?1.6:Math.max(1.1,e.width*.75);V.glow&&e.kind!==`policy`&&(a.strokeStyle=u(p,(H?.16:.1)*x),a.lineWidth=S*4,y(),a.stroke());let C=a.createLinearGradient(_.x,_.y,g.x,g.y);C.addColorStop(0,u(p,x*.35)),C.addColorStop(1,u(p,x)),a.strokeStyle=C,a.lineWidth=S,y(),a.stroke();let ee=j(`--bg`),te=e.kind===`policy`?10:6+Math.min(3,e.width);me(a,c,g,te,e.kind===`policy`,u(p,Math.max(.7,x)),ee),e.kind===`policy`&&e.twoWay&&me(a,c,_,te,!0,p,ee),a.textBaseline=`middle`,e.kind===`denied`?(a.setLineDash([]),a.strokeStyle=p,a.lineWidth=2.2,a.beginPath(),a.moveTo(l.x-5,l.y-5),a.lineTo(l.x+5,l.y+5),a.moveTo(l.x+5,l.y-5),a.lineTo(l.x-5,l.y+5),a.stroke(),a.fillStyle=p,a.font=`600 11px ${E}`,a.fillText(`${e.denied??e.count} denied`,l.x+9,l.y)):e.kind===`policy`&&L.k>=.7&&e.kinds?.length&&(a.fillStyle=j(`--muted`),a.font=`11px ${E}`,a.fillText(`${e.twoWay?`⇄`:`→`} ${e.kinds.join(`, `)}`,l.x+6,l.y)),a.restore()}function Be(e,n){if(!_e||!V.pulses||!k)return 0;let i=J,a=Se+(Date.now()-Ce),o=0;i.save(),H&&(i.globalCompositeOperation=`lighter`);for(let s of k.links){if(s.kind===`structure`||s.kind===`policy`||s.kind===`denied`)continue;let c=r(s,a);if(P!==void 0&&(s.source===P||s.target===P)&&(c=Math.max(c,.55)),c<=0)continue;let u=e.get(s.source),d=e.get(s.target);if(!u||!d)continue;let{c:f}=fe(u,d,pe(s)),p=B.get(s.target),m=he(d,f,(p?D(p):0)+6),h=Math.min(4,1+Math.floor(Math.log2(Math.max(1,s.count)))),g=Math.max(1,Math.round(c*h)),_=.16+.34*c,v=le(s.id),y=j(t(s.kind));for(let e=0;e<g;e++){o++;let t=(v+e/g+n*_)%1,r=(1-t)**2*u.x+2*(1-t)*t*f.x+t*t*m.x,a=(1-t)**2*u.y+2*(1-t)*t*f.y+t*t*m.y;l(i,r,a,9,y,(.35+.65*c)*(H?.9:.6)),i.fillStyle=H?`#ffffff`:y,i.globalAlpha=.5+.5*c,i.beginPath(),i.arc(r,a,2.2,0,Math.PI*2),i.fill(),i.globalAlpha=1}}return i.restore(),o}function Ve(e,t,n,r){if(!e.ring||a[e.ring]===`none`)return;let i=J,s=a[e.ring];i.strokeStyle=j(o[e.ring]),i.setLineDash(s===`broken`?[4,3]:[]),i.lineWidth=s===`thick`?3:s===`thin`?1:1.8,i.beginPath(),i.arc(t,n,r+4,0,Math.PI*2),i.stroke(),s===`double`&&(i.lineWidth=1.1,i.beginPath(),i.arc(t,n,r+7,0,Math.PI*2),i.stroke()),i.setLineDash([])}function He(e,t){let n=J,r=D(e),i=!qe()||X.has(e.id);n.save(),n.globalAlpha=(e.dim?.25:1)*(i?1:.3);let a=ue(e,j);V.glow&&e.kind!==`role`&&l(n,t.x,t.y,r*(e.kind===`hub`?U?9:5:3.4),e.match?j(`--accent`):a,(H?.55:.32)*(e.dim?.4:1)*(e.id===P||e.id===M?1.5:1)),e.kind===`role`?(de(n,t.x,t.y,r),e.vacant||(n.fillStyle=u(a,e.entry?.22:.1),n.fill()),n.strokeStyle=u(a,e.entry?1:.7),n.lineWidth=e.entry?2.4:1.3,n.setLineDash(e.vacant?[4,3]:[]),n.stroke(),n.setLineDash([])):d(n,c(e),t.x,t.y,r,a,H?`#ffffff`:u(`#ffffff`,.9)),Ve(e,t.x,t.y,r),e.teams&&(n.strokeStyle=j(`--violet`),n.lineWidth=1.4,n.setLineDash([2,3]),n.beginPath(),n.arc(t.x,t.y,r+10,0,Math.PI*2),n.stroke(),n.setLineDash([]),n.fillStyle=j(`--violet`),n.font=`700 10px ${E}`,n.textBaseline=`middle`,n.fillText(`×${e.teams}`,t.x+r+6,t.y-r-6)),(e.id===M||e.id===N)&&(n.strokeStyle=j(`--accent`),n.lineWidth=e.id===M?2.5:2,n.setLineDash(e.id===M?[]:[5,3]),n.beginPath(),e.kind===`role`?n.roundRect(t.x-v.role/2+4,t.y-r-4,v.role-8,r*2+8,r+4):n.arc(t.x,t.y,r+(e.teams?14:9),0,Math.PI*2),n.stroke(),n.setLineDash([])),n.textAlign=`center`,n.textBaseline=`middle`,e.kind===`role`?(n.fillStyle=j(e.vacant?`--muted`:`--text`),n.font=`${e.entry?700:500} ${e.vacant?11:12}px ${E}`,n.fillText(ce(`${e.entry?`★ `:``}${f(e)}`,16),t.x,t.y)):e.kind===`aggregate`?(n.fillStyle=j(`--text`),n.font=`600 11px ${E}`,n.fillText(String(e.folded??``),t.x,t.y)):e.folded&&e.kind===`session`&&(n.fillStyle=j(`--bg`),n.font=`700 9px ${E}`,n.fillText(`+${e.folded}`,t.x,t.y));let o=De.get(e.id);if(o){let r=Ue(e);n.globalAlpha=e.dim?.6:i?1:.5,n.fillStyle=j(e.dim?`--faint`:e.kind===`session`?`--muted`:`--text`),n.font=We(e,r),n.lineWidth=r/11*3,n.strokeStyle=u(j(`--bg`),.85);let a=o.box.y+o.box.h/2;n.strokeText(o.text,t.x,a),n.fillText(o.text,t.x,a)}n.restore()}let Ue=e=>(e.kind===`hub`?13:11)*Math.max(1,Math.min(1.5,oe/11/L.k)),We=(e,t)=>`${e.kind===`hub`?700:500} ${t}px ${E}`;function Ge(e){if(!k||!A)return new Map;let t=[];for(let e of k.nodes){if(e.kind===`role`||e.kind===`aggregate`||xe.has(e.id))continue;let n=A.positions.get(e.id);if(!n)continue;let r=e.kind!==`session`||e.match||e.id===M||e.id===N||e.id===P;if(!r&&!(L.k>=1||L.k>=ae&&Te.has(e.id)))continue;let i=Ue(e),a=ce(e.label,14),o=ce(e.label,9);t.push({id:e.id,x:n.x,y:n.y+D(e)+(e.ring?16:13)*(i/11)-i*.65,h:i*1.3,texts:r||o===a?[a]:[a,o],pinned:r,rank:(Te.has(e.id)?1e6:0)+(Ee.get(e.id)??0),font:We(e,i)})}return t.sort((e,t)=>t.rank-e.rank||(e.id<t.id?-1:+(e.id>t.id))),g(t,(t,n)=>(e.font!==n.font&&(e.font=n.font),e.measureText(t).width+4))}let X=new Set,Ke;function qe(){let e=P??M;if(e!==Ke&&(Ke=e,X=new Set(e===void 0?[]:[e]),e!==void 0&&k))for(let t of k.links)t.source===e&&X.add(t.target),t.target===e&&X.add(t.source);return e!==void 0&&B.has(e)?e:void 0}function Je(){let e=J;e.save();let t=11,n=()=>((t=t*16807%2147483647)-1)/2147483646;e.fillStyle=j(`--accent`);for(let t=0;t<260;t++){let t=n()*Math.PI*2,r=60+n()**.7*900;e.globalAlpha=(H?.35:.22)*(1-r/1e3),e.beginPath(),e.arc(Math.cos(t)*r,Math.sin(t)*r*.6,.8+n()*1.6,0,Math.PI*2),e.fill()}e.restore()}function Ye(){if(!A)return;let e=Ae();S.width!==T.w*e&&(S.width=T.w*e,S.height=T.h*e);let t=C;t.setTransform(e,0,0,e,0,0),t.clearRect(0,0,T.w,T.h),t.globalAlpha=.92,t.fillStyle=j(`--raise`),t.fillRect(0,0,T.w,T.h),t.globalAlpha=1;let n=A.bounds,r=Math.min(T.w/n.w,T.h/n.h),i=(T.w-n.w*r)/2-n.x*r,a=(T.h-n.h*r)/2-n.y*r;t.strokeStyle=j(`--line-2`),t.lineWidth=1;for(let e of A.boxes)t.strokeRect(e.x*r+i,e.y*r+a,e.w*r,e.h*r);for(let[e,n]of A.positions){let o=B.get(e);if(!o)continue;let s=o.kind===`hub`?4:2;t.fillStyle=o.match?j(`--accent`):ue(o,j),t.fillRect(n.x*r+i-s/2,n.y*r+a-s/2,s,s)}let o=W(0,0);t.strokeStyle=j(`--accent`),t.lineWidth=1.5,t.strokeRect(o.x*r+i,o.y*r+a,F/L.k*r,I/L.k*r),be={s:r,ox:i,oy:a}}function Xe(){let e=Me,t=Ae();if((q.width!==b.width||q.height!==b.height)&&(q.width=b.width,q.height=b.height),e.setTransform(t,0,0,t,0,0),e.fillStyle=j(`--bg`),e.fillRect(0,0,F,I),k&&A){e.setTransform(t*L.k,0,0,t*L.k,t*L.x,t*L.y),J=e;try{U&&Je();for(let e of A.boxes)Re(e);let t=A.positions;for(let e of k.links)e.kind===`structure`&&ze(e,t);for(let e of k.links)e.kind!==`structure`&&ze(e,t);De=Ge(e),Ze();for(let e of k.nodes){let n=t.get(e.id);n&&He(e,n)}}finally{J=x}}}function Ze(){if(!A)return;let e=A.bounds,t=e=>Math.round(e*10)/10;n.dataset.content=JSON.stringify({x:t(e.x*L.k+L.x),y:t(e.y*L.k+L.y),w:t(e.w*L.k),h:t(e.h*L.k)}),n.dataset.labelBoxes=JSON.stringify([...De.values()].map(({box:e})=>[t(e.x*L.k+L.x),t(e.y*L.k+L.y),t(e.w*L.k),t(e.h*L.k)]))}function Qe(){z=0;let e=performance.now(),t=x,r=`${L.k},${L.x},${L.y},${b.width},${b.height}`;if((Ne||r!==Pe)&&(Xe(),Ye(),Ne=!1,Pe=r),t.setTransform(1,0,0,1,0,0),t.drawImage(q,0,0),!k||!A)return;let i=Ae();t.setTransform(i*L.k,0,0,i*L.k,i*L.x,i*L.y),Oe=Be(A.positions,performance.now()/1e3),ve&&(t.save(),ve(t,L),t.restore()),n.dataset.zoom=L.k.toFixed(3),n.dataset.pulses=String(Oe),n.dataset.drawMs=(performance.now()-e).toFixed(1),ke=Oe>0&&!document.hidden,n.dataset.animating=String(ke),ke&&!z&&(z=requestAnimationFrame(Qe))}function $e(e,t){if(!k||!A)return;let n=W(e,t),r;for(let e of k.nodes){let t=A.positions.get(e.id);if(!t)continue;let i=e.kind===`role`?Math.abs(n.x-t.x)<=v.role/2-8&&Math.abs(n.y-t.y)<=se(e)?-1:1/0:Math.hypot(n.x-t.x,n.y-t.y)-se(e)-3;i<=0&&(!r||i<r.d)&&(r={id:e.id,d:i})}if(r)return{type:`node`,id:r.id};let i=6/L.k,a;for(let e of k.links){if(e.kind===`structure`)continue;let t=A.positions.get(e.source),r=A.positions.get(e.target);if(!t||!r)continue;let{c:o}=fe(t,r,pe(e)),s=t;for(let c=1;c<=16;c++){let l=c/16,u={x:(1-l)**2*t.x+2*(1-l)*l*o.x+l*l*r.x,y:(1-l)**2*t.y+2*(1-l)*l*o.y+l*l*r.y},d=ge(n,s,u);d<=i&&(!a||d<a.d)&&(a={l:e,d}),s=u}}if(a)return{type:`link`,link:a.l};let o=A.boxes.find(e=>n.x>=e.x&&n.x<=e.x+e.w&&n.y>=e.y&&n.y<=e.y+e.h);return o?{type:`box`,id:o.id}:void 0}function et(t){let n=B.get(t);if(!n)return``;let r=[n.label];return n.kind===`role`&&r.push(n.entry?`entry role`:`role`,n.vacant?`vacant`:`${n.staffed??0} staffed`),n.seat&&r.push(`seat: ${n.seat}`),n.kind===`team`&&r.push(n.mode===`restricted`?`restricted team`:`open team`),n.kind===`machine`&&r.push(`machine`),n.ring&&r.push(e[n.ring]),n.teams&&r.push(`in ${n.teams} teams`),n.folded&&n.kind===`session`&&r.push(`+${n.folded} folded`),r.join(` · `)}function tt(e){let t=e=>B.get(e)?.label??e;return e.kind===`structure`?``:e.kind===`policy`?`Team path ${t(e.source)} ${e.twoWay?`⇄`:`→`} ${t(e.target)}${e.kinds?.length?` · ${e.kinds.join(`, `)}`:``}${e.count?` · ${e.count} sent along it`:``}`:e.kind===`denied`?`${e.denied??e.count} denied: ${t(e.source)} → ${t(e.target)}`:`${i(e.kind)} · ${t(e.source)} → ${t(e.target)} · ${e.count}`}let Z=new Map,Q,$;b.addEventListener(`pointerdown`,e=>{b.setPointerCapture?.(e.pointerId);let t=G(e.clientX,e.clientY);if(Z.set(e.pointerId,t),Z.size===2){let[e,t]=[...Z.values()];$={d:Math.hypot(e.x-t.x,e.y-t.y)||1,k:L.k,mid:{x:(e.x+t.x)/2,y:(e.y+t.y)/2}},Q=void 0}else Q={...t,t:L,moved:!1}}),b.addEventListener(`pointermove`,e=>{let t=G(e.clientX,e.clientY);if(Z.has(e.pointerId)&&Z.set(e.pointerId,t),$&&Z.size===2){let[e,t]=[...Z.values()],n=Math.max(w,Math.min(ie,$.k*(Math.hypot(e.x-t.x,e.y-t.y)||1)/$.d)),r=W($.mid.x,$.mid.y);R=!0,Y({k:n,x:$.mid.x-r.x*n,y:$.mid.y-r.y*n},!1);return}if(Q){!Q.moved&&Math.hypot(t.x-Q.x,t.y-Q.y)>4&&(Q.moved=!0),Q.moved&&(R=!0,O.hidden=!0,Y({k:Q.t.k,x:Q.t.x+t.x-Q.x,y:Q.t.y+t.y-Q.y},!1));return}let n=$e(t.x,t.y),r=n?.type===`node`?n.id:void 0;b.style.cursor=n&&n.type!==`box`?`pointer`:`grab`,r!==P&&(P=r,K());let i=n?.type===`node`?et(n.id):n?.type===`link`?tt(n.link):``;O.hidden=!i,i&&(O.textContent=i,O.style.left=`${Math.min(t.x+14,F-220)}px`,O.style.top=`${t.y+14}px`)}),b.addEventListener(`pointerup`,e=>{if(Z.delete(e.pointerId),Z.size<2&&($=void 0),!Q)return;let t=!Q.moved;if(Q=void 0,!t)return;let n=G(e.clientX,e.clientY),r=$e(n.x,n.y);r?.type===`node`?(N=r.id,y.onNode(r.id)):r?.type===`link`?y.onLink(r.link):y.onBackground(),K()}),b.addEventListener(`pointercancel`,e=>{Z.delete(e.pointerId),Q=void 0,$=void 0}),b.addEventListener(`pointerleave`,()=>{O.hidden=!0,P!==void 0&&(P=void 0,K())}),b.addEventListener(`wheel`,e=>{e.preventDefault();let t=G(e.clientX,e.clientY);Ie(t.x,t.y,Math.exp(-e.deltaY*(e.ctrlKey?.01:.0015)))},{passive:!1}),b.addEventListener(`dblclick`,e=>{let t=G(e.clientX,e.clientY);Ie(t.x,t.y,2,!0)});let nt=e=>{let t=S.getBoundingClientRect(),{s:n,ox:r,oy:i}=be;R=!0,Le({x:(e.clientX-t.left-r)/n,y:(e.clientY-t.top-i)/n},!1)};S.addEventListener(`pointerdown`,e=>{S.setPointerCapture?.(e.pointerId),nt(e)}),S.addEventListener(`pointermove`,e=>{S.hasPointerCapture?.(e.pointerId)&&nt(e)});let rt=e=>{let t=et(e);y.announce(t?`${t}. Enter opens it.`:``)},it=e=>{let t=A?.positions.get(e);if(!t)return;let n=je(t);(n.x<40||n.y<40||n.x>F-40||n.y>I-40)&&Le(t,!0,Math.max(L.k,.7))},at=e=>{N=e,e&&(it(e),rt(e)),K()},ot=e=>{if(e.target!==n||!A)return;let t={ArrowLeft:`left`,ArrowRight:`right`,ArrowUp:`up`,ArrowDown:`down`}[e.key];t&&e.shiftKey?(e.preventDefault(),R=!0,Y({...L,x:L.x+(t===`left`?80:t===`right`?-80:0),y:L.y+(t===`up`?80:t===`down`?-80:0)},!1)):t?(e.preventDefault(),at(ne(A.positions,N??`hub`,t))):(e.key===`Enter`||e.key===` `)&&N?(e.preventDefault(),y.onNode(N)):e.key===`Home`?(e.preventDefault(),at(`hub`)):e.key===`+`||e.key===`=`||e.key===`-`||e.key===`_`?(e.preventDefault(),Ie(F/2,I/2,e.key===`+`||e.key===`=`?1.25:.8,!0)):e.key===`0`&&(e.preventDefault(),R=!1,Fe(!0))},st=()=>{N===void 0&&(N=M!==void 0&&B.has(M)?M:`hub`),rt(N),K()};n.addEventListener(`keydown`,ot),n.addEventListener(`focus`,st);let ct=()=>document.visibilityState===`visible`&&K();return document.addEventListener(`visibilitychange`,ct),{update(e,t,r){k=e,j=t,_e=r.motion,M=r.selected,V={...re,...r.look},H=s(j(`--bg`)),Se=e.now,Ce=Date.now(),U=!e.nodes.some(e=>e.kind===`session`||e.kind===`aggregate`);let i=p(e);we=new Map(i.map(e=>[e.id,e.color])),Te=m(e,{max:V.labels}),Ee=h(e),Ke=`\0`,B.clear();for(let t of e.nodes)B.set(t.id,t);A=ee(e),xe.clear();for(let e of A.boxes)B.has(e.id)&&xe.add(e.id);N!==void 0&&!B.has(N)&&(N=void 0);let a=n.dataset;a.nodes=String(e.nodes.length),a.boxes=String(A.boxes.length),a.teams=String(A.boxes.filter(e=>e.kind===`team`).length),a.policy=String(e.links.filter(e=>e.kind===`policy`).length),a.twoWay=String(e.links.filter(e=>e.kind===`policy`&&e.twoWay).length),a.denied=String(e.links.filter(e=>e.kind===`denied`).length),a.bridges=String(e.links.filter(e=>e.bridge).length),a.tethers=String(e.links.filter(e=>e.structure===`seat`&&!e.bridge).length),a.vacant=String(e.nodes.filter(e=>e.kind===`role`&&e.vacant).length),a.selected=M??``,a.regions=String(i.length),a.empty=String(U),R||Fe(!1),K()},focus(e,t){let n=A?.positions.get(e);n&&(N=e,R=!0,Le(n,t,Math.max(L.k,1)),K())},reset(e){R=!1,Fe(e)},resize(e,t){F=Math.max(1,e),I=Math.max(1,t);let n=Ae();b.width=Math.round(F*n),b.height=Math.round(I*n),b.style.width=`${F}px`,b.style.height=`${I}px`,R||Fe(!1),K()},destroy(){cancelAnimationFrame(z),cancelAnimationFrame(ye),n.removeEventListener(`keydown`,ot),n.removeEventListener(`focus`,st),document.removeEventListener(`visibilitychange`,ct),n.replaceChildren()},hitTest(e,t){let n=G(e,t);return $e(n.x,n.y)},toWorld(e,t){let n=G(e,t);return W(n.x,n.y)},setOverlay(e){ve=e,K()},layout:()=>A}}export{O as createRenderer2D};