@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
+ import{E as e}from"./live-YyTjE47g.js";var t=`watchtower.layout`,n=1e3,r=[`--accent`,`--blue`,`--violet`,`--orange`,`--ok`,`--warn`];function i(e,t=0){let n=110+26*Math.sqrt(Math.max(1,e))+7*Math.sqrt(Math.max(0,t)),r=Math.PI*(3-Math.sqrt(5));return Array.from({length:e},(t,i)=>{let a=e===1?0:1-i/(e-1)*2,o=Math.sqrt(1-a*a),s=i*r;return[l(Math.cos(s)*o*n),l(a*n*.55),l(Math.sin(s)*o*n)]})}function a(t){let n=new Set(t.nodes.map(e=>e.id)),a=i(t.groups.length,t.groups.reduce((e,t)=>e+t.sections.reduce((e,t)=>e+t.members.length,0),0));return t.groups.map((t,i)=>{let o=[];n.has(t.id)&&o.push(t.id);for(let e of t.sections)e.id!==void 0&&n.has(e.id)&&o.push(e.id),o.push(...e.members);let s=t.machine===void 0?r[i%r.length]:e[t.machine%e.length];return{id:t.id,label:t.label,color:s,center:a[i],members:o}})}function o(e){let t=new Map;for(let n of e.links)n.kind!==`structure`&&n.kind!==`policy`&&(t.set(n.source,(t.get(n.source)??0)+n.count),t.set(n.target,(t.get(n.target)??0)+n.count));return t}function s(e,t){let n=new Set,r=new Set(e.groups.map(e=>e.id));for(let t of e.nodes)(t.kind===`hub`||t.kind===`user`||t.kind===`app`||t.kind===`role`||r.has(t.id)||t.match)&&n.add(t.id);let i=o(e),a=e.nodes.filter(e=>!n.has(e.id)&&e.kind!==`role`);a.sort((e,t)=>(i.get(t.id)??0)-(i.get(e.id)??0)||(e.id<t.id?-1:+(e.id>t.id)));for(let e of a.slice(0,Math.max(0,t.max)))n.add(e.id);for(let e of t.extra??[])n.add(e);return n}var c=e=>e.kind===`role`&&e.vacant?`${e.label} · vacant`:e.label,l=e=>Math.round(e*10)/10,u=e=>typeof e==`number`&&Number.isFinite(e);function d(e){let t=new Map;if(!e)return t;let n;try{n=JSON.parse(e)}catch{return t}if(typeof n!=`object`||!n||Array.isArray(n))return t;let{v:r,p:i}=n;if(r!==1||typeof i!=`object`||!i||Array.isArray(i))return t;for(let[e,n]of Object.entries(i)){if(t.size>=1e3)break;if(!Array.isArray(n)||n.length!==3)continue;let[r,i,a]=n;u(r)&&u(i)&&u(a)&&t.set(e,[r,i,a])}return t}function f(e,t,r=n){let i={},a=0;for(let n of[e,t])for(let[e,t]of n){if(a>=r)break;e in i||!t.every(u)||(i[e]=[l(t[0]),l(t[1]),l(t[2])],a++)}return JSON.stringify({v:1,p:i})}function p(e,t){let n=2166136261;for(let t=0;t<e.length;t++)n=Math.imul(n^e.charCodeAt(t),16777619);let r=(n>>>0)%1e3/1e3,i=(Math.imul(n,2654435761)>>>0)%1e3/1e3,a=r*Math.PI*2,o=i*2-1,s=Math.sqrt(1-o*o),c=t*(.6+.4*r);return[Math.cos(a)*s*c,o*c,Math.sin(a)*s*c]}function m(e,t){let n=new Map,r=new Set,i=new Map;for(let t of a(e))for(let e of t.members)i.set(e,t);let o=new Map,s=new Map;for(let t of e.links)t.kind===`structure`&&(o.get(t.target)??o.set(t.target,[]).get(t.target)).push(t.source),(s.get(t.target)??s.set(t.target,[]).get(t.target)).push(t.source),(s.get(t.source)??s.set(t.source,[]).get(t.source)).push(t.target);n.set(`hub`,[0,0,0]);for(let r of e.nodes){if(r.id===`hub`)continue;let e=t.get(r.id);e&&n.set(r.id,e)}let c=new Set(e.groups.map(e=>e.id)),u=[...e.nodes.filter(e=>c.has(e.id)),...e.nodes.filter(e=>!c.has(e.id))];for(let e of u){if(n.has(e.id))continue;r.add(e.id);let t=[...o.get(e.id)??[],...s.get(e.id)??[]].find(e=>e!==`hub`&&n.has(e)),a=i.get(e.id),c=t===void 0?a?.center:n.get(t),u=p(e.id,t===void 0?a?24:40:14),d=c??[0,0,0];n.set(e.id,[l(d[0]+u[0]),l(d[1]+u[1]),l(d[2]+u[2])])}return{positions:n,fresh:r}}function h(e,t){let n=new Map,r=[],i=e=>r.some(t=>e.x<t.x+t.w&&t.x<e.x+e.w&&e.y<t.y+t.h&&t.y<e.y+e.h),a=[...e.filter(e=>e.pinned),...e.filter(e=>!e.pinned)];for(let e of a)for(let a of e.texts){let o=t(a,e),s={x:e.x-o/2,y:e.y,w:o,h:e.h};if(e.pinned||!i(s)){r.push(s),n.set(e.id,{text:a,box:s});break}}return n}var g=8,_=900;function v(e){let t={top:0,right:0,bottom:0,left:0},n=e.closest(`.wt-stage`);if(!n)return t;let r=e.getBoundingClientRect();if(!r.height)return t;let i=n.querySelector(`.wt-dock`)?.getBoundingClientRect(),a=n.querySelector(`.wt-chips`)?.getBoundingClientRect(),o=r.width>=_?n.querySelector(`.wt-pop-legend`)?.getBoundingClientRect():void 0,s=o&&o.width?Math.max(0,o.right-r.left+g):0,c=i&&i.height?Math.max(0,r.bottom-i.top+g):0,l=a&&a.height?Math.max(0,a.bottom-r.top+g):0;return{top:Math.min(l,r.height/3),right:0,bottom:Math.min(c,r.height/3),left:Math.min(s,r.width/3)}}export{c as a,a as c,s as i,m as l,t as n,d as o,o as r,h as s,v as t,f as u};
@@ -0,0 +1 @@
1
+ import{H as e,Y as t,tt as n}from"./ui-C9Igxzjm.js";var r={artifactsPerUser:5e3,revisionsPerArtifact:500,blobBytes:26214400,userBlobBytes:2147483648,bundleFiles:200,chunkBytes:1048576,aiJobsPerUser:8,aiJobsPerArtifact:2,aiInstructionChars:8e3},i=[`markdown`,`code`,`image`,`table`,`chart`,`dashboard`,`html`,`app`,`file`],a=[`html`,`app`],o=[`text/markdown`,`text/plain`,`text/csv`,`text/html`,`text/css`,`text/javascript`,`application/json`,`application/pdf`,`image/png`,`image/jpeg`,`image/gif`,`image/webp`,`image/svg+xml`],s=e=>typeof e==`string`&&/^sha256:[0-9a-f]{64}$/.test(e);function c(e){if(!t(e))return`blob must be an object`;if(!s(e.hash))return`hash must be sha256:<64 hex>`;if(typeof e.bytes!=`number`||!Number.isSafeInteger(e.bytes)||e.bytes<0||e.bytes>r.blobBytes)return`bytes must be 0–${r.blobBytes}`;if(!o.includes(e.mediaType))return`mediaType is not allowed`;if(e.path!==void 0&&(typeof e.path!=`string`||!/^(?!\/)(?!.*(?:^|\/)\.\.?(?:\/|$))[A-Za-z0-9._/-]{1,200}$/.test(e.path)))return`path must be a relative path without . or .. segments`}var l=`/api/agent/artifacts`,u={workspace:``,type:``},d=e=>typeof e==`string`&&i.includes(e);function f(t){let n=typeof t==`string`?new URLSearchParams(t):t,r=n.get(`workspace`)??``,i=n.get(`type`)??``;return{workspace:r===`none`||e(`workspace`,r)?r:``,type:d(i)?i:``}}function p(e){let t=new URLSearchParams;e.workspace&&t.set(`workspace`,e.workspace),e.type&&t.set(`type`,e.type);let n=t.toString();return n?`?${n}`:``}var m=e=>e.workspace&&e.workspace!==`none`?e.workspace:``;function h(e,t){let n=new URLSearchParams({state:`active`,limit:`50`}),r=m(e);return r&&n.set(`workspace`,r),t&&n.set(`cursor`,t),`${l}?${n}`}var g=e=>typeof e==`string`&&e.length>0;function _(e){if(!e||typeof e!=`object`)return;let t=e;if(g(t.id)&&typeof t.title==`string`&&d(t.kind)&&typeof t.updatedAt==`number`)return{id:t.id,title:t.title,kind:t.kind,visibility:t.visibility===`workspace`?`workspace`:`private`,...g(t.workspaceID)?{workspaceID:t.workspaceID}:{},...g(t.description)?{description:t.description}:{},updatedAt:t.updatedAt}}function v(e){let t=e&&typeof e==`object`?e:{};return{items:Array.isArray(t.items)?t.items.flatMap(e=>_(e)??[]):[],...g(t.cursor)?{cursor:t.cursor}:{}}}function y(e,t){return e.filter(e=>(t.type===``||e.kind===t.type)&&(t.workspace===``||(t.workspace===`none`?!e.workspaceID:e.workspaceID===t.workspace)))}function b(e){return e.status===422||e.code===`unsupported`?{kind:`unsupported`,text:`Artifacts aren't supported on this hub yet.`}:e.status===404?{kind:`unavailable`,text:`This hub doesn't have artifacts.`}:e.status===403||e.status===401?{kind:`forbidden`,text:`This device isn't allowed to read artifacts.`}:{kind:`error`,text:e.message?`Could not load artifacts: ${e.message}`:`Could not load artifacts (HTTP ${e.status}).`}}function x(e){let t=e&&typeof e==`object`?e:{};return{status:typeof t.status==`number`?t.status:0,...typeof t.code==`string`?{code:t.code}:{},message:typeof t.message==`string`?t.message:String(e)}}function S(e,t){return t?`None of the artifacts loaded so far match. Load more to keep looking.`:e.workspace===``&&e.type===``?`No artifacts yet. Artifacts that your sessions create show up here.`:`No artifacts match these filters.`}var C=(e,t)=>t.get(e)??`Workspace ${e.slice(0,12)}…`,w=e=>`/artifacts/${encodeURIComponent(e)}`;function T(e,t){let n=u,r,i=0,a=[],o,s={status:`loading`},c=()=>s.status===`ready`?{status:`ready`,items:y(a,n),total:a.length,more:o!==void 0,loadingMore:s.loadingMore,...s.moreError?{moreError:s.moreError}:{}}:s,l=e=>{s=e,t(c())};function d(u){n=u;let d=m(u);if(d===r&&s.status===`ready`){t(c());return}r=d;let f=++i;a=[],o=void 0,l({status:`loading`}),e.list(u).then(e=>{f===i&&(a=[...e.items],o=e.cursor,l({status:`ready`,loadingMore:!1}))},e=>f===i&&l({status:`error`,error:b(x(e))}))}function f(){if(s.status!==`ready`||s.loadingMore||o===void 0)return;let t=i;l({status:`ready`,loadingMore:!0}),e.list(n,o).then(e=>{if(t!==i)return;let n=new Set(a.map(e=>e.id));a=[...a,...e.items.filter(e=>!n.has(e.id))],o=e.cursor,l({status:`ready`,loadingMore:!1})},e=>t===i&&l({status:`ready`,loadingMore:!1,moreError:b(x(e)).text}))}function p(){r=void 0,d(n)}return{load:d,more:f,reload:p,view:c}}var E={list:async(e,t)=>v(await n(h(e,t)))};async function D(){try{return((await n(`/api/agent/workspaces?state=active&limit=200`)).items??[]).flatMap(e=>typeof e.id==`string`&&typeof e.title==`string`?[{id:e.id,title:e.title}]:[])}catch{return[]}}export{S as a,C as c,a as d,c as f,T as i,i as l,D as n,p as o,w as r,f as s,E as t,r as u};
@@ -0,0 +1 @@
1
+ var e={context:void 0,registry:void 0,effects:void 0,done:!1,getContextId(){return t(this.context.count)},getNextContextId(){return t(this.context.count++)}};function t(t){let n=String(t),r=n.length-1;return e.context.id+(r?String.fromCharCode(96+r):``)+n}function n(t){e.context=t}var r=(e,t)=>e===t,i=Symbol(`solid-proxy`),a=typeof Proxy==`function`,o=Symbol(`solid-track`),s={equals:r},c=null,l=_e,u=1,d=2,f={owned:null,cleanups:null,context:null,owner:null},p={},m=null,h=null,g=null,_=null,v=null,y=0;function b(e,t){let n=g,r=m,i=e.length===0,a=t===void 0?r:t,o=i?f:{owned:null,cleanups:null,context:a?a.context:null,owner:a},s=i?e:()=>e(()=>T(()=>I(o)));m=o,g=null;try{return P(s,!0)}finally{g=n,m=r}}function x(e,t){t=t?Object.assign({},s,t):s;let n={value:e,observers:null,observerSlots:null,comparator:t.equals||void 0};return[pe.bind(n),e=>(typeof e==`function`&&(e=h&&h.running&&h.sources.has(n)?e(n.tValue):e(n.value)),me(n,e))]}function ee(e,t,n){j(M(e,t,!0,u))}function S(e,t,n){j(M(e,t,!1,u))}function C(e,t,n){l=ve;let r=M(e,t,!1,u),i=A&&ue(A);i&&(r.suspense=i),(!n||!n.render)&&(r.user=!0),v?v.push(r):j(r)}function w(e,t,n){n=n?Object.assign({},s,n):s;let r=M(e,t,!0,0);return r.observers=null,r.observerSlots=null,r.comparator=n.equals||void 0,j(r),pe.bind(r)}function te(e){return e&&typeof e==`object`&&`then`in e}function ne(t,n,r){let i,a,o;typeof n==`function`?(i=t,a=n,o=r||{}):(i=!0,a=t,o=n||{});let s=null,c=p,l=null,u=!1,d=!1,f=`initialValue`in o,_=typeof i==`function`&&w(i),v=new Set,[y,b]=(o.storage||x)(o.initialValue),[S,C]=x(void 0),[ne,re]=x(void 0,{equals:!1}),[ie,ae]=x(f?`ready`:`unresolved`);m&&E(()=>{for(let e of v.keys())e.decrement();v.clear(),h&&s&&h.promises.delete(s),s=null}),e.context&&(l=e.getNextContextId(),o.ssrLoadFrom===`initial`?c=o.initialValue:e.load&&e.has(l)&&(c=e.load(l)));function D(e,t,n,r){return s===e&&(s=null,r!==void 0&&(f=!0),(e===c||t===c)&&o.onHydrated&&queueMicrotask(()=>o.onHydrated(r,{value:t})),c=p,h&&e&&u?(h.promises.delete(e),u=!1,P(()=>{h.running=!0,O(t,n)},!1)):O(t,n)),t}function O(e,t){P(()=>{t===void 0&&b(()=>e),ae(t===void 0?f?`ready`:`unresolved`:`errored`),C(t);for(let e of v.keys())e.decrement();v.clear()},!1)}function se(){let e=A&&ue(A),t=y(),n=S();if(n!==void 0&&!s)throw n;return g&&!g.user&&e&&ee(()=>{ne(),s&&(e.resolved&&h&&u?h.promises.add(s):v.has(e)||(e.increment(),v.add(e)))}),t}function k(e=!0){if(e!==!1&&d)return;d=!1;let t=_?_():i;if(u=h&&h.running,t==null||t===!1){D(s,T(y));return}h&&s&&h.promises.delete(s);let n,r=c===p?T(()=>{try{return a(t,{value:y(),refetching:e})}catch(e){n=e}}):c;if(n!==void 0)D(s,void 0,L(n),t);else return te(r)?(s=r,`v`in r?(r.s===1?D(s,r.v,void 0,t):D(s,void 0,L(r.v),t),r):(d=!0,queueMicrotask(()=>d=!1),P(()=>{ae(f?`refreshing`:`pending`),re()},!1),r.then(e=>D(r,e,void 0,t),e=>D(r,void 0,L(e),t)))):(D(s,r,void 0,t),r)}Object.defineProperties(se,{state:{get:()=>ie()},error:{get:()=>S()},loading:{get(){let e=ie();return e===`pending`||e===`refreshing`}},latest:{get(){if(!f)return se();let e=S();if(e&&!s)throw e;return y()}}});let ce=m;return _?ee(()=>(ce=m,k(!1))):k(!1),[se,{refetch:e=>oe(ce,()=>k(e)),mutate:b}]}function re(e){return P(e,!1)}function T(e){if(g===null)return e();let t=g;g=null;try{return e()}finally{g=t}}function ie(e,t,n){let r=Array.isArray(e),i,a=n&&n.defer;return n=>{let o;if(r){o=Array(e.length);for(let t=0;t<e.length;t++)o[t]=e[t]()}else o=e();if(a)return a=!1,n;let s=T(()=>t(o,i,n));return i=o,s}}function ae(e){C(()=>T(e))}function E(e){return m===null||(m.cleanups===null?m.cleanups=[e]:m.cleanups.push(e)),e}function D(){return g}function O(){return m}function oe(e,t){let n=m,r=g;m=e,g=null;try{return P(t,!0)}catch(e){R(e)}finally{m=n,g=r}}var[se,k]=x(!1);function ce(e){v.push.apply(v,e),e.length=0}function le(e,t){let n=Symbol(`context`);return{id:n,Provider:Ce(n),defaultValue:e}}function ue(e){let t;return m&&m.context&&(t=m.context[e.id])!==void 0?t:e.defaultValue}function de(e){let t=w(e),n=w(()=>Se(t()));return n.toArray=()=>{let e=n();return Array.isArray(e)?e:e==null?[]:[e]},n}var A;function fe(){return A||=le()}function pe(){let e=h&&h.running;if(this.sources&&(e?this.tState:this.state)){if((e?this.tState:this.state)===u)j(this);else{let e=_;_=null,P(()=>F(this),!1),_=e}}if(g){let e=this.observers;if(!e||e[e.length-1]!==g){let t=e?e.length:0;g.sources?(g.sources.push(this),g.sourceSlots.push(t)):(g.sources=[this],g.sourceSlots=[t]),e?(e.push(g),this.observerSlots.push(g.sources.length-1)):(this.observers=[g],this.observerSlots=[g.sources.length-1])}}return e&&h.sources.has(this)?this.tValue:this.value}function me(e,t,n){let r=h&&h.running&&h.sources.has(e)?e.tValue:e.value;if(!e.comparator||!e.comparator(r,t)){if(h){let r=h.running;(r||!n&&h.sources.has(e))&&(h.sources.add(e),e.tValue=t),r||(e.value=t)}else e.value=t;e.observers&&e.observers.length&&P(()=>{for(let t=0;t<e.observers.length;t+=1){let n=e.observers[t],r=h&&h.running;r&&h.disposed.has(n)||((r?!n.tState:!n.state)&&(n.pure?_.push(n):v.push(n),n.observers&&ye(n)),r?n.tState=u:n.state=u)}if(_.length>1e6)throw _=[],Error()},!1)}return t}function j(e){if(!e.fn)return;I(e);let t=y;he(e,h&&h.running&&h.sources.has(e)?e.tValue:e.value,t),h&&!h.running&&h.sources.has(e)&&queueMicrotask(()=>{P(()=>{h&&(h.running=!0),g=m=e,he(e,e.tValue,t),g=m=null},!1)})}function he(e,t,n){let r,i=m,a=g;g=m=e;try{r=e.fn(t)}catch(t){return e.pure&&(h&&h.running?(e.tState=u,e.tOwned&&e.tOwned.forEach(I),e.tOwned=void 0):(e.state=u,e.owned&&e.owned.forEach(I),e.owned=null)),e.updatedAt=n+1,R(t)}finally{g=a,m=i}(!e.updatedAt||e.updatedAt<=n)&&(e.updatedAt!=null&&`observers`in e?me(e,r,!0):h&&h.running&&e.pure?(h.sources.has(e)||(e.value=r),h.sources.add(e),e.tValue=r):e.value=r,e.updatedAt=n)}function M(e,t,n,r=u,i){let a={fn:e,state:r,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:t,owner:m,context:m?m.context:null,pure:n};return h&&h.running&&(a.state=0,a.tState=r),m===null||m!==f&&(h&&h.running&&m.pure?m.tOwned?m.tOwned.push(a):m.tOwned=[a]:m.owned?m.owned.push(a):m.owned=[a]),a}function N(e){let t=h&&h.running;if((t?e.tState:e.state)===0)return;if((t?e.tState:e.state)===d)return F(e);if(e.suspense&&T(e.suspense.inFallback))return e.suspense.effects.push(e);let n=[e];for(;(e=e.owner)&&(!e.updatedAt||e.updatedAt<y);){if(t&&h.disposed.has(e))return;(t?e.tState:e.state)&&n.push(e)}for(let r=n.length-1;r>=0;r--){if(e=n[r],t){let t=e,i=n[r+1];for(;(t=t.owner)&&t!==i;)if(h.disposed.has(t))return}if((t?e.tState:e.state)===u)j(e);else if((t?e.tState:e.state)===d){let t=_;_=null,P(()=>F(e,n[0]),!1),_=t}}}function P(e,t){if(_)return e();let n=!1;t||(_=[]),v?n=!0:v=[],y++;try{let t=e();return ge(n),t}catch(e){n||(v=null),_=null,R(e)}}function ge(e){if(_&&=(_e(_),null),e)return;let t;if(h){if(!h.promises.size&&!h.queue.size){let e=h.sources,n=h.disposed;v.push.apply(v,h.effects),t=h.resolve;for(let e of v)`tState`in e&&(e.state=e.tState),delete e.tState;h=null,P(()=>{for(let e of n)I(e);for(let t of e){if(t.value=t.tValue,t.owned)for(let e=0,n=t.owned.length;e<n;e++)I(t.owned[e]);t.tOwned&&(t.owned=t.tOwned),delete t.tValue,delete t.tOwned,t.tState=0}k(!1)},!1)}else if(h.running){h.running=!1,h.effects.push.apply(h.effects,v),v=null,k(!0);return}}let n=v;v=null,n.length&&P(()=>l(n),!1),t&&t()}function _e(e){for(let t=0;t<e.length;t++)N(e[t])}function ve(t){let r,i=0;for(r=0;r<t.length;r++){let e=t[r];e.user?t[i++]=e:N(e)}if(e.context){if(e.count){e.effects||=[],e.effects.push(...t.slice(0,i));return}n()}for(e.effects&&(e.done||!e.count)&&(t=[...e.effects,...t],i+=e.effects.length,delete e.effects),r=0;r<i;r++)N(t[r])}function F(e,t){let n=h&&h.running;n?e.tState=0:e.state=0;for(let r=0;r<e.sources.length;r+=1){let i=e.sources[r];if(i.sources){let e=n?i.tState:i.state;e===u?i!==t&&(!i.updatedAt||i.updatedAt<y)&&N(i):e===d&&F(i,t)}}}function ye(e){let t=h&&h.running;for(let n=0;n<e.observers.length;n+=1){let r=e.observers[n];(t?!r.tState:!r.state)&&(t?r.tState=d:r.state=d,r.pure?_.push(r):v.push(r),r.observers&&ye(r))}}function I(e){let t;if(e.sources)for(;e.sources.length;){let t=e.sources.pop(),n=e.sourceSlots.pop(),r=t.observers;if(r&&r.length){let e=r.pop(),i=t.observerSlots.pop();n<r.length&&(e.sourceSlots[i]=n,r[n]=e,t.observerSlots[n]=i)}}if(e.tOwned){for(t=e.tOwned.length-1;t>=0;t--)I(e.tOwned[t]);delete e.tOwned}if(h&&h.running&&e.pure)be(e,!0);else if(e.owned){for(t=e.owned.length-1;t>=0;t--)I(e.owned[t]);e.owned=null}if(e.cleanups){for(t=e.cleanups.length-1;t>=0;t--)e.cleanups[t]();e.cleanups=null}h&&h.running?e.tState=0:e.state=0}function be(e,t){if(t||(e.tState=0,h.disposed.add(e)),e.owned)for(let t=0;t<e.owned.length;t++)be(e.owned[t])}function L(e){return e instanceof Error?e:Error(typeof e==`string`?e:`Unknown error`,{cause:e})}function xe(e,t,n){try{for(let n of t)n(e)}catch(e){R(e,n&&n.owner||null)}}function R(e,t=m){let n=c&&t&&t.context&&t.context[c],r=L(e);if(!n)throw r;v?v.push({fn(){xe(r,n,t)},state:u}):xe(r,n,t)}function Se(e){if(typeof e==`function`&&!e.length)return Se(e());if(Array.isArray(e)){let t=[];for(let n=0;n<e.length;n++){let r=Se(e[n]);if(Array.isArray(r)){if(r.length<32768)t.push.apply(t,r);else for(let e=0;e<r.length;e++)t.push(r[e])}else t.push(r)}return t}return e}function Ce(e,t){return function(t){let n;return S(()=>n=T(()=>(m.context={...m.context,[e]:t.value},de(()=>t.children))),void 0),n}}var we=Symbol(`fallback`);function z(e){for(let t=0;t<e.length;t++)e[t]()}function Te(e,t,n={}){let r=[],i=[],a=[],s=0,c=t.length>1?[]:null;return E(()=>z(a)),()=>{let l=e()||[],u=l.length,d,f;return l[o],T(()=>{let e,t,o,m,h,g,_,v,y;if(u===0)s!==0&&(z(a),a=[],r=[],i=[],s=0,c&&=[]),n.fallback&&(r=[we],i[0]=b(e=>(a[0]=e,n.fallback())),s=1);else if(s===0){for(i=Array(u),f=0;f<u;f++)r[f]=l[f],i[f]=b(p);s=u}else{for(o=Array(u),m=Array(u),c&&(h=Array(u)),g=0,_=Math.min(s,u);g<_&&r[g]===l[g];g++);for(_=s-1,v=u-1;_>=g&&v>=g&&r[_]===l[v];_--,v--)o[v]=i[_],m[v]=a[_],c&&(h[v]=c[_]);for(e=new Map,t=Array(v+1),f=v;f>=g;f--)y=l[f],d=e.get(y),t[f]=d===void 0?-1:d,e.set(y,f);for(d=g;d<=_;d++)y=r[d],f=e.get(y),f!==void 0&&f!==-1?(o[f]=i[d],m[f]=a[d],c&&(h[f]=c[d]),f=t[f],e.set(y,f)):a[d]();for(f=g;f<u;f++)f in o?(i[f]=o[f],a[f]=m[f],c&&(c[f]=h[f],c[f](f))):i[f]=b(p);i=i.slice(0,s=u),r=l.slice(0)}return i});function p(e){if(a[f]=e,c){let[e,n]=x(f);return c[f]=n,t(l[f],e)}return t(l[f])}}}function Ee(e,t,n={}){let r=[],i=[],a=[],s=[],c=0,l;return E(()=>z(a)),()=>{let u=e()||[],d=u.length;return u[o],T(()=>{if(d===0)return c!==0&&(z(a),a=[],r=[],i=[],c=0,s=[]),n.fallback&&(r=[we],i[0]=b(e=>(a[0]=e,n.fallback())),c=1),i;for(r[0]===we&&(a[0](),a=[],r=[],i=[],c=0),l=0;l<d;l++)l<r.length&&r[l]!==u[l]?s[l](()=>u[l]):l>=r.length&&(i[l]=b(f));for(;l<r.length;l++)a[l]();return c=s.length=a.length=d,r=u.slice(0),i=i.slice(0,c)});function f(e){a[l]=e;let[n,r]=x(u[l]);return s[l]=r,t(n,l)}}}function B(e,t){return T(()=>e(t||{}))}function V(){return!0}var De={get(e,t,n){return t===i?n:e.get(t)},has(e,t){return t===i||e.has(t)},set:V,deleteProperty:V,getOwnPropertyDescriptor(e,t){return{configurable:!0,enumerable:!0,get(){return e.get(t)},set:V,deleteProperty:V}},ownKeys(e){return e.keys()}};function Oe(e){return(e=typeof e==`function`?e():e)?e:{}}function ke(){for(let e=0,t=this.length;e<t;++e){let t=this[e]();if(t!==void 0)return t}}function Ae(...e){let t=!1;for(let n=0;n<e.length;n++){let r=e[n];t||=!!r&&i in r,e[n]=typeof r==`function`?(t=!0,w(r)):r}if(a&&t)return new Proxy({get(t){for(let n=e.length-1;n>=0;n--){let r=Oe(e[n])[t];if(r!==void 0)return r}},has(t){for(let n=e.length-1;n>=0;n--)if(t in Oe(e[n]))return!0;return!1},keys(){let t=[];for(let n=0;n<e.length;n++)t.push(...Object.keys(Oe(e[n])));return[...new Set(t)]}},De);let n={},r=Object.create(null);for(let t=e.length-1;t>=0;t--){let i=e[t];if(!i)continue;let a=Object.getOwnPropertyNames(i);for(let e=a.length-1;e>=0;e--){let t=a[e];if(t===`__proto__`||t===`constructor`)continue;let o=Object.getOwnPropertyDescriptor(i,t);if(!r[t])r[t]=o.get?{enumerable:!0,configurable:!0,get:ke.bind(n[t]=[o.get.bind(i)])}:o.value===void 0?void 0:o;else{let e=n[t];e&&(o.get?e.push(o.get.bind(i)):o.value!==void 0&&e.push(()=>o.value))}}}let o={},s=Object.keys(r);for(let e=s.length-1;e>=0;e--){let t=s[e],n=r[t];n&&n.get?Object.defineProperty(o,t,n):o[t]=n?n.value:void 0}return o}function je(e,...t){let n=t.length;if(a&&i in e){let r=n>1?t.flat():t[0],i=new Set,a=t.map(t=>{let n=t.filter(e=>!i.has(e)&&(i.add(e),!0));return new Proxy({get(t){return n.includes(t)?e[t]:void 0},has(t){return n.includes(t)&&t in e},keys(){return n.filter(t=>t in e)}},De)});return a.push(new Proxy({get(t){return r.includes(t)?void 0:e[t]},has(t){return!r.includes(t)&&t in e},keys(){return Object.keys(e).filter(e=>!r.includes(e))}},De)),a}let r=[];for(let e=0;e<=n;e++)r[e]={};for(let i of Object.getOwnPropertyNames(e)){let a=n;for(let e=0;e<t.length;e++)if(t[e].includes(i)){a=e;break}let o=Object.getOwnPropertyDescriptor(e,i);!o.get&&!o.set&&o.enumerable&&o.writable&&o.configurable?r[a][i]=o.value:Object.defineProperty(r[a],i,o)}return r}function Me(t){let r,i,a=()=>{if(!i){let e=i=t();e.then(e=>{r=()=>e.default},()=>{i===e&&(i=void 0)})}return i},o=t=>{let i=e.context;if(i){let[t,o]=x();e.count||=0,e.count++,a().then(t=>{!e.done&&n(i),e.count--,o(()=>t.default),n()},t=>{!e.done&&n(i),e.count--,o(()=>()=>{throw t}),n()}),r=t}else if(!r){let[e]=ne(()=>a().then(e=>e.default));r=e,E(()=>r=void 0)}let o;return w(()=>(o=r?.())?T(()=>{if(!i||e.done)return o(t);let r=e.context;n(i);let a=o(t);return n(r),a}):``)};return o.preload=()=>a(),o}var Ne=e=>`Stale read from <${e}>.`;function Pe(e){let t=`fallback`in e&&{fallback:()=>e.fallback};return w(Te(()=>e.each,e.children,t||void 0))}function Fe(e){let t=`fallback`in e&&{fallback:()=>e.fallback};return w(Ee(()=>e.each,e.children,t||void 0))}function H(e){let t=e.keyed,n=w(()=>e.when,void 0,void 0),r=t?n:w(n,void 0,{equals:(e,t)=>!e==!t});return w(()=>{let i=r();if(i){let a=e.children;return typeof a==`function`&&a.length>0?T(()=>a(t?i:()=>{if(!T(r))throw Ne(`Show`);return n()})):a}return e.fallback},void 0,void 0)}function Ie(e){let t=de(()=>e.children),n=w(()=>{let e=t(),n=Array.isArray(e)?e:[e],r=()=>void 0;for(let e=0;e<n.length;e++){let t=e,i=n[e],a=r,o=w(()=>a()?void 0:i.when,void 0,void 0),s=i.keyed?o:w(o,void 0,{equals:(e,t)=>!e==!t});r=()=>a()||(s()?[t,o,i]:void 0)}return r});return w(()=>{let t=n()();if(!t)return e.fallback;let[r,i,a]=t,o=a.children;return typeof o==`function`&&o.length>0?T(()=>o(a.keyed?i():()=>{if(T(n)()?.[0]!==r)throw Ne(`Match`);return i()})):o},void 0,void 0)}function Le(e){return e}var Re=le();function ze(t){let r=0,i,a,o,s,c,[l,u]=x(!1),d=fe(),f={increment:()=>{++r===1&&u(!0)},decrement:()=>{--r===0&&u(!1)},inFallback:l,effects:[],resolved:!1},p=O();if(e.context&&e.load){let t=e.getContextId(),r=e.load(t);if(r&&(typeof r!=`object`||r.s!==1?o=r:e.gather(t)),o&&o!==`$$f`){let[r,i]=x(void 0,{equals:!1});s=r,o.then(()=>{if(e.done)return i();e.gather(t),n(a),i(),n()},e=>{c=e,i()})}}let m=ue(Re);m&&(i=m.register(f.inFallback));let h;return E(()=>h&&h()),B(d.Provider,{value:f,get children(){return w(()=>{if(c)throw c;if(a=e.context,s){s(),s=void 0;return}a&&o===`$$f`&&n();let r=w(()=>t.children);return w(e=>{let s=f.inFallback(),{showContent:c=!0,showFallback:l=!0}=i?i():{};if((!s||o&&o!==`$$f`)&&c)return f.resolved=!0,h&&h(),h=a=o=void 0,ce(f.effects),r();if(l)return h?e:b(e=>(h=e,a&&=(n({id:a.id+`F`,count:0}),void 0),t.fallback),p)})})}})}var Be=new Set([`className`,`value`,`readOnly`,`noValidate`,`formNoValidate`,`isMap`,`noModule`,`playsInline`,`adAuctionHeaders`,`allowFullscreen`,`browsingTopics`,`defaultChecked`,`defaultMuted`,`defaultSelected`,`disablePictureInPicture`,`disableRemotePlayback`,`preservesPitch`,`shadowRootClonable`,`shadowRootCustomElementRegistry`,`shadowRootDelegatesFocus`,`shadowRootSerializable`,`sharedStorageWritable`,...`allowfullscreen.async.alpha.autofocus.autoplay.checked.controls.default.disabled.formnovalidate.hidden.indeterminate.inert.ismap.loop.multiple.muted.nomodule.novalidate.open.playsinline.readonly.required.reversed.seamless.selected.adauctionheaders.browsingtopics.credentialless.defaultchecked.defaultmuted.defaultselected.defer.disablepictureinpicture.disableremoteplayback.preservespitch.shadowrootclonable.shadowrootcustomelementregistry.shadowrootdelegatesfocus.shadowrootserializable.sharedstoragewritable`.split(`.`)]),Ve=new Set([`innerHTML`,`textContent`,`innerText`,`children`]),He=Object.assign(Object.create(null),{className:`class`,htmlFor:`for`}),Ue=Object.assign(Object.create(null),{class:`className`,novalidate:{$:`noValidate`,FORM:1},formnovalidate:{$:`formNoValidate`,BUTTON:1,INPUT:1},ismap:{$:`isMap`,IMG:1},nomodule:{$:`noModule`,SCRIPT:1},playsinline:{$:`playsInline`,VIDEO:1},readonly:{$:`readOnly`,INPUT:1,TEXTAREA:1},adauctionheaders:{$:`adAuctionHeaders`,IFRAME:1},allowfullscreen:{$:`allowFullscreen`,IFRAME:1},browsingtopics:{$:`browsingTopics`,IMG:1},defaultchecked:{$:`defaultChecked`,INPUT:1},defaultmuted:{$:`defaultMuted`,AUDIO:1,VIDEO:1},defaultselected:{$:`defaultSelected`,OPTION:1},disablepictureinpicture:{$:`disablePictureInPicture`,VIDEO:1},disableremoteplayback:{$:`disableRemotePlayback`,AUDIO:1,VIDEO:1},preservespitch:{$:`preservesPitch`,AUDIO:1,VIDEO:1},shadowrootclonable:{$:`shadowRootClonable`,TEMPLATE:1},shadowrootdelegatesfocus:{$:`shadowRootDelegatesFocus`,TEMPLATE:1},shadowrootserializable:{$:`shadowRootSerializable`,TEMPLATE:1},sharedstoragewritable:{$:`sharedStorageWritable`,IFRAME:1,IMG:1}});function We(e,t){let n=Ue[e];return typeof n==`object`?n[t]?n.$:void 0:n}var Ge=new Set([`beforeinput`,`click`,`dblclick`,`contextmenu`,`focusin`,`focusout`,`input`,`keydown`,`keyup`,`mousedown`,`mousemove`,`mouseout`,`mouseover`,`mouseup`,`pointerdown`,`pointermove`,`pointerout`,`pointerover`,`pointerup`,`touchend`,`touchmove`,`touchstart`]),Ke=new Set(`altGlyph.altGlyphDef.altGlyphItem.animate.animateColor.animateMotion.animateTransform.circle.clipPath.color-profile.cursor.defs.desc.ellipse.feBlend.feColorMatrix.feComponentTransfer.feComposite.feConvolveMatrix.feDiffuseLighting.feDisplacementMap.feDistantLight.feDropShadow.feFlood.feFuncA.feFuncB.feFuncG.feFuncR.feGaussianBlur.feImage.feMerge.feMergeNode.feMorphology.feOffset.fePointLight.feSpecularLighting.feSpotLight.feTile.feTurbulence.filter.font.font-face.font-face-format.font-face-name.font-face-src.font-face-uri.foreignObject.g.glyph.glyphRef.hkern.image.line.linearGradient.marker.mask.metadata.missing-glyph.mpath.path.pattern.polygon.polyline.radialGradient.rect.set.stop.svg.switch.symbol.text.textPath.tref.tspan.use.view.vkern`.split(`.`)),qe={xlink:`http://www.w3.org/1999/xlink`,xml:`http://www.w3.org/XML/1998/namespace`},Je=e=>w(()=>e());function Ye(e,t,n){let r=n.length,i=t.length,a=r,o=0,s=0,c=t[i-1].nextSibling,l=null;for(;o<i||s<a;)if(t[o]===n[s])o++,s++;else{for(;t[i-1]===n[a-1];)i--,a--;if(i===o){let t=a<r?s?n[s-1].nextSibling:n[a-s]:c;for(;s<a;)e.insertBefore(n[s++],t)}else if(a===s)for(;o<i;)(!l||!l.has(t[o]))&&t[o].remove(),o++;else if(t[o]===n[a-1]&&n[s]===t[i-1]){let r=t[--i].nextSibling;e.insertBefore(n[s++],t[o++].nextSibling),e.insertBefore(n[--a],r),t[i]=n[a]}else{if(!l){l=new Map;let e=s;for(;e<a;)l.set(n[e],e++)}let r=l.get(t[o]);if(r!=null){if(s<r&&r<a){let c=o,u=1,d;for(;++c<i&&c<a&&(d=l.get(t[c]))!=null&&d===r+u;)u++;if(u>r-s){let i=t[o];for(;s<r;)e.insertBefore(n[s++],i)}else e.replaceChild(n[s++],t[o++])}else o++}else t[o++].remove()}}}var Xe=`_$DX_DELEGATE`;function Ze(e,t,n,r={}){let i;return b(r=>{i=r,t===document?e():q(t,e(),!n&&t.firstChild?null:void 0,n)},r.owner),()=>{i(),t.textContent=``}}function U(e,t,n,r){let i,a=()=>{let t=r?document.createElementNS(`http://www.w3.org/1998/Math/MathML`,`template`):document.createElement(`template`);return t.innerHTML=e,n?t.content.firstChild.firstChild:r?t.firstChild:t.content.firstChild},o=t?()=>T(()=>document.importNode(i||=a(),!0)):()=>(i||=a()).cloneNode(!0);return o.cloneNode=o,o}function Qe(e,t=window.document){let n=t[Xe]||(t[Xe]=new Set);for(let r=0,i=e.length;r<i;r++){let i=e[r];n.has(i)||(n.add(i),t.addEventListener(i,dt))}}function W(e,t,n){J(e)||(n==null?e.removeAttribute(t):e.setAttribute(t,n))}function $e(e,t,n,r){J(e)||(r==null?e.removeAttributeNS(t,n):e.setAttributeNS(t,n,r))}function et(e,t,n){J(e)||(n?e.setAttribute(t,``):e.removeAttribute(t))}function G(e,t){J(e)||(t==null?e.removeAttribute(`class`):e.className=t)}function tt(e,t,n,r){if(r)Array.isArray(n)?(e[`$$${t}`]=n[0],e[`$$${t}Data`]=n[1]):e[`$$${t}`]=n;else if(Array.isArray(n)){let r=n[0];e.addEventListener(t,n[0]=t=>r.call(e,n[1],t))}else e.addEventListener(t,n,typeof n!=`function`&&n)}function nt(e,t,n={}){let r=Object.keys(t||{}),i=Object.keys(n),a,o;for(a=0,o=i.length;a<o;a++){let r=i[a];r&&r!==`undefined`&&!t[r]&&(lt(e,r,!1),delete n[r])}for(a=0,o=r.length;a<o;a++){let i=r[a],o=!!t[i];i&&i!==`undefined`&&n[i]!==o&&o&&(lt(e,i,!0),n[i]=o)}return n}function rt(e,t,n){if(!t)return n?W(e,`style`):t;let r=e.style;if(typeof t==`string`)return r.cssText=t;typeof n==`string`&&(r.cssText=n=void 0),n||={},t||={};let i,a;for(a in n)t[a]??r.removeProperty(a),delete n[a];for(a in t)i=t[a],i!==n[a]&&(r.setProperty(a,i),n[a]=i);return n}function it(e,t,n){n==null?e.style.removeProperty(t):e.style.setProperty(t,n)}function at(e,t={},n,r){let i={};return r||S(()=>i.children=Y(e,t.children,i.children)),S(()=>typeof t.ref==`function`&&K(t.ref,e)),S(()=>ot(e,t,n,!0,i,!0)),i}function K(e,t,n){return T(()=>e(t,n))}function q(e,t,n,r){if(n!==void 0&&!r&&(r=[]),typeof t!=`function`)return Y(e,t,r,n);S(r=>Y(e,t(),r,n),r)}function ot(e,t,n,r,i={},a=!1){t||={};for(let r in i)if(!(r in t)){if(r===`children`)continue;i[r]=ut(e,r,null,i[r],n,a,t)}for(let o in t){if(o===`children`){r||Y(e,t.children);continue}let s=t[o];i[o]=ut(e,o,s,i[o],n,a,t)}}function st(t){let n,r;return!J()||!(n=e.registry.get(r=mt()))?t():(e.completed&&e.completed.add(n),e.registry.delete(r),n)}function J(t){return!!e.context&&!e.done&&(!t||t.isConnected)}function ct(e){return e.toLowerCase().replace(/-([a-z])/g,(e,t)=>t.toUpperCase())}function lt(e,t,n){let r=t.trim().split(/\s+/);for(let t=0,i=r.length;t<i;t++)e.classList.toggle(r[t],n)}function ut(e,t,n,r,i,a,o){let s,c,l,u,d;if(t===`style`)return rt(e,n,r);if(t===`classList`)return nt(e,n,r);if(n===r)return r;if(t===`ref`)a||n(e);else if(t.slice(0,3)===`on:`){let i=t.slice(3);r&&e.removeEventListener(i,r,typeof r!=`function`&&r),n&&e.addEventListener(i,n,typeof n!=`function`&&n)}else if(t.slice(0,10)===`oncapture:`){let i=t.slice(10);r&&e.removeEventListener(i,r,!0),n&&e.addEventListener(i,n,!0)}else if(t.slice(0,2)===`on`){let i=t.slice(2).toLowerCase(),a=Ge.has(i);if(!a&&r){let t=Array.isArray(r)?r[0]:r;e.removeEventListener(i,t)}(a||n)&&(tt(e,i,n,a),a&&Qe([i]))}else if(t.slice(0,5)===`attr:`)W(e,t.slice(5),n);else if(t.slice(0,5)===`bool:`)et(e,t.slice(5),n);else if((d=t.slice(0,5)===`prop:`)||(l=Ve.has(t))||!i&&((u=We(t,e.tagName))||(c=Be.has(t)))||(s=e.nodeName.includes(`-`)||`is`in o)){if(d)t=t.slice(5),c=!0;else if(J(e))return n;t===`class`||t===`className`?G(e,n):s&&!c&&!l?e[ct(t)]=n:(t===`value`||t===`defaultValue`)&&(e.nodeName===`INPUT`||e.nodeName===`TEXTAREA`)?e[u||t]=n??``:e[u||t]=n}else{let r=i&&t.indexOf(`:`)>-1&&qe[t.split(`:`)[0]];r?$e(e,r,t,n):W(e,He[t]||t,n)}return n}function dt(t){if(e.registry&&e.events&&e.events.find(([e,n])=>n===t))return;let n=t.target,r=`$$${t.type}`,i=t.target,a=t.currentTarget,o=e=>Object.defineProperty(t,"target",{configurable:!0,value:e}),s=()=>{let e=n[r];if(e&&!n.disabled){let i=n[`${r}Data`];if(i===void 0?e.call(n,t):e.call(n,i,t),t.cancelBubble)return}return n.host&&typeof n.host!=`string`&&!n.host._$host&&n.contains(t.target)&&o(n.host),!0},c=()=>{for(;s()&&(n=n._$host||n.parentNode||n.host););};Object.defineProperty(t,"currentTarget",{configurable:!0,get(){return n||document}}),e.registry&&!e.done&&(e.done=_$HY.done=!0);try{if(t.composedPath){let e=t.composedPath();o(e[0]);for(let t=0;t<e.length-2&&(n=e[t],s());t++){if(n._$host){n=n._$host,c();break}if(n.parentNode===a)break}}else c();o(i)}finally{t=n=null}}function Y(e,t,n,r,i){let a=J(e);if(a){!n&&(n=[...e.childNodes]);let t=[];for(let e=0;e<n.length;e++){let r=n[e];r.nodeType===8&&r.data.slice(0,2)===`!$`?r.remove():t.push(r)}n=t}for(;typeof n==`function`;)n=n();if(t===n)return n;let o=typeof t,s=r!==void 0;if(e=s&&n[0]&&n[0].parentNode||e,o===`string`||o===`number`){if(a||o===`number`&&(t=t.toString(),t===n))return n;if(s){let i=n[0];i&&i.nodeType===3?i.data!==t&&(i.data=t):i=document.createTextNode(t),n=X(e,n,r,i)}else n=n!==``&&typeof n==`string`?e.firstChild.data=t:e.textContent=t}else if(t==null||o===`boolean`){if(a)return n;n=X(e,n,r)}else if(o===`function`)return S(()=>{let i=t();for(;typeof i==`function`;)i=i();n=Y(e,i,n,r)}),()=>n;else if(Array.isArray(t)){let o=[],c=n&&Array.isArray(n);if(ft(o,t,n,i))return S(()=>n=Y(e,o,n,r,!0)),()=>n;if(a){if(!o.length)return n;if(r===void 0)return n=[...e.childNodes];let t=o[0];if(t.parentNode!==e)return n;let i=[t];for(;(t=t.nextSibling)!==r;)i.push(t);return n=i}if(o.length===0){if(n=X(e,n,r),s)return n}else c?n.length===0?pt(e,o,r):Ye(e,n,o):(n&&X(e),pt(e,o));n=o}else if(t.nodeType){if(a&&t.parentNode)return n=s?[t]:t;if(Array.isArray(n)){if(s)return n=X(e,n,r,t);X(e,n,null,t)}else n==null||n===``||!e.firstChild?e.appendChild(t):e.replaceChild(t,e.firstChild);n=t}return n}function ft(e,t,n,r){let i=!1;for(let a=0,o=t.length;a<o;a++){let o=t[a],s=n&&n[e.length],c;if(o!=null&&o!==!0&&o!==!1){if((c=typeof o)==`object`&&o.nodeType)e.push(o);else if(Array.isArray(o))i=ft(e,o,s)||i;else if(c===`function`){if(r){for(;typeof o==`function`;)o=o();i=ft(e,Array.isArray(o)?o:[o],Array.isArray(s)?s:[s])||i}else e.push(o),i=!0}else{let t=String(o);s&&s.nodeType===3&&s.data===t?e.push(s):e.push(document.createTextNode(t))}}}return i}function pt(e,t,n=null){for(let r=0,i=t.length;r<i;r++)e.insertBefore(t[r],n)}function X(e,t,n,r){if(n===void 0)return e.textContent=``;let i=r||document.createTextNode(``);if(t.length){let r=!1;for(let a=t.length-1;a>=0;a--){let o=t[a];if(i!==o){let t=o.parentNode===e;!r&&!a?t?e.replaceChild(i,o):e.insertBefore(i,n):t&&o.remove()}else r=!0}}else e.insertBefore(i,n);return[i]}function mt(){return e.getNextContextId()}var ht=`http://www.w3.org/2000/svg`;function gt(e,t=!1,n=void 0){return t?document.createElementNS(ht,e):document.createElement(e,{is:n})}function _t(t){let{useShadow:n}=t,r=document.createTextNode(``),i=()=>t.mount||document.body,a=O(),o,s=!!e.context;return C(()=>{s&&(O().user=s=!1),o||=oe(a,()=>w(()=>t.children));let e=i();if(e instanceof HTMLHeadElement){let[t,n]=x(!1);b(n=>q(e,()=>t()?n():o(),null)),E(()=>n(!0))}else{let i=gt(t.isSVG?`g`:`div`,t.isSVG),a=n&&i.attachShadow?i.attachShadow({mode:`open`}):i;Object.defineProperty(i,"_$host",{get(){return r.parentNode},configurable:!0}),q(a,o),e.appendChild(i),t.ref&&t.ref(i),E(()=>e.contains(i)&&e.removeChild(i))}},void 0,{render:!s}),r}function vt(t,n){let r=w(t);return w(()=>{let t=r();switch(typeof t){case`function`:return T(()=>t(n));case`string`:let r=Ke.has(t),i=e.context?st():gt(t,r,T(()=>n.is));return at(i,n,r),i}})}function yt(e){let[,t]=je(e,[`component`]);return vt(()=>e.component,t)}var bt=class extends Error{status;code;field;hint;details;constructor(e,t){super(t),this.status=e}},xt=class extends Error{cause;name=`NetworkError`;constructor(e){super(`Can't reach the hub: the connection dropped. Check your network and try again.`),this.cause=e}},St;function Ct(e){St=e}async function wt(e,{method:t=`GET`,json:n,body:r,headers:i={},signal:a,keepalive:o}={}){let s={method:t,credentials:`same-origin`,headers:{...i},signal:a,keepalive:o};n===void 0?r!==void 0&&(s.body=r):(s.headers[`content-type`]=`application/json`,s.body=JSON.stringify(n));let c;try{c=await fetch(e,s)}catch(e){throw e instanceof TypeError?new xt(e):e}if(!c.ok){let e=await c.json().catch(()=>({}));c.status===401&&St?.();let t=e.error&&typeof e.error==`object`?e.error:e,n=typeof e.error==`string`?e.error:typeof t.message==`string`?t.message:``,r=new bt(c.status,n||`HTTP ${c.status}`);throw typeof t.field==`string`&&(r.field=t.field),typeof t.code==`string`&&(r.code=t.code),typeof t.hint==`string`&&(r.hint=t.hint),e.error&&typeof e.error==`object`&&(r.details=t),r}return c}var Tt=async e=>(await wt(e)).json(),Et=encodeURIComponent,Dt=e=>`/api/sessions/${Et(e)}`,Ot=e=>e instanceof Error?e.message:String(e),kt=e=>typeof e==`object`&&!!e&&!Array.isArray(e),At=/^[A-Za-z0-9_.:@/+~-]{1,300}$/,jt=/[\p{Cc}\p{Cf}\u2028\u2029]/u,Mt={workspace:`ws`,binding:`wsb`,member:`wsm`,assignment:`asg`,supervision:`sup`,checkpoint:`chk`,sideChat:`chat`,profile:`prof`,artifact:`art`,revision:`rev`,blob:`blob`,aiJob:`job`,team:`team`,staffing:`stf`,intake:`itk`},Nt=/^[A-Za-z0-9]{16,32}$/;function Pt(e,t){if(typeof t!=`string`)return!1;let n=`${Mt[e]}_`;return t.startsWith(n)&&Nt.test(t.slice(n.length))}var Ft=/^[a-z0-9-]{2,40}$/,It=e=>typeof e==`string`&&Ft.test(e),Lt=(e,t=120)=>typeof e==`string`&&e.trim().length>0&&e.length<=t&&!jt.test(e),Rt=4e3,zt=/[\u0000-\u0009\u000b-\u001f\u007f\u2028\u2029\u200b-\u200f\u202a-\u202e\u2066-\u2069]/,Bt=(e,t=Rt)=>typeof e==`string`&&e.length<=t&&!zt.test(e);function Vt(e){if(e!==void 0){if(!Array.isArray(e)||e.length>32)return`tags must be a list of at most 32`;if(!e.every(It))return`each tag must be 2–40 lowercase letters, digits or dashes`;if(new Set(e).size!==e.length)return`tags must be unique`}}function Ht(e){if(e===void 0)return;if(typeof e!=`object`||!e||Array.isArray(e))return`metadata must be an object`;let t=Object.entries(e);if(t.length>32)return`metadata has more than 32 keys`;for(let[e,n]of t){if(!It(e))return`metadata key ${JSON.stringify(String(e).slice(0,50))} must be a slug`;if(!Lt(n,200))return`metadata.${e} must be 1–200 characters of text`}}var Z=e=>e.signedIn,Q=[{id:`sessions`,label:`All sessions`,icon:`home`,route:`/`,order:10,available:e=>Z(e)?!0:`hidden`},{id:`concierge`,label:`Concierge`,icon:`spark`,route:`/concierge`,order:15,available:e=>Z(e)&&e.concierge!==void 0&&e.concierge!==`disabled`?!0:`hidden`},{id:`artifacts`,label:`Artifacts`,icon:`file`,route:`/artifacts`,order:20,available:e=>Z(e)?!0:`hidden`},{id:`teams`,label:`Teams`,icon:`team`,route:`/teams`,order:25,available:e=>Z(e)?!0:`hidden`},{id:`watchtower`,label:`Watchtower`,icon:`watchtower`,route:`/watchtower`,order:30,available:e=>Z(e)?!0:`hidden`},{id:`profiles`,label:`Agent profiles`,icon:`settings`,route:`/profiles`,order:40,available:e=>Z(e)?!0:`hidden`}],Ut={"/birds-eye":`/watchtower`};function Wt(e,t=``,n=``){for(let[r,i]of Object.entries(Ut))if(e===r||e.startsWith(`${r}/`))return`${i}${e.slice(r.length)}${t}${n}`}function Gt(e,t){try{return e.available(t)}catch{return`hidden`}}function Kt(e,t=Q){return[...t].sort((e,t)=>e.order-t.order).flatMap(t=>{let n=Gt(t,e);return n===`hidden`?[]:[{dest:t,enabled:n===!0}]})}var qt=(e,t)=>Gt(e,t)===!0?`ok`:`unavailable`;function Jt(e,t=Q){for(let n of t)if(n.route!==`/`&&(e===n.route||e.startsWith(`${n.route}/`)))try{return{dest:n,rest:e.slice(n.route.length).split(`/`).filter(Boolean).map(decodeURIComponent)}}catch{return}}function Yt(e,t=Q){return e===`/`?t.find(e=>e.route===`/`)?.id:Jt(e,t)?.dest.id}function Xt(e){return e.supported?e.permission===`denied`?{state:`blocked`,message:`Notifications are blocked for this site. Allow them in the browser's site settings, then reload.`,action:`none`,warn:!0}:e.permission==="default"?{state:`off`,message:`Notifications are off on this device.`,action:`enable`,warn:!0}:!e.worker||!e.endpoint||!e.hubSubscribed?{state:`repair`,message:`Allowed, but this device is not subscribed on this hub, so nothing will arrive (this happens after the hub moves to a new address). Enable again to fix it.`,action:`enable`,warn:!0}:{state:`on`,message:`On for this device.`,action:`disable`,warn:!1}:{state:`unsupported`,message:`This browser can't get notifications here. On iPhone, add the app to the Home Screen first (iOS 16.4+); everywhere else the hub must be on https.`,action:`none`,warn:!0}}var Zt=e=>e.supported&&e.permission===`granted`&&(!e.endpoint||!e.hubSubscribed);function Qt(e){if(e.subscriptions===0)return{ok:!1,text:`This device is not subscribed; enable notifications first`};if(e.sent>0)return{ok:!0,text:e.sent===1?`Test notification sent to this device`:`Test notification sent (${e.sent} subscriptions)`};let t=e.failed[0];return t?{ok:!1,text:`Test failed: ${t.host} ${t.status===void 0?`did not answer`:`answered ${t.status}`}`}:{ok:!1,text:`Test failed`}}var $t=[1,2,5,10,15,30,60],en=[{title:`Needs you`,kinds:[{key:`question`,label:`Question`,description:`A session or subagent asks you something.`},{key:`permission`,label:`Needs permission`,description:`A tool call waits for your OK (answer from the notification).`},{key:`decision`,label:`Decision`,description:`A session asks you to decide (hub ask @me), with options and a recommendation.`},{key:`message`,label:`Message`,description:`Agent messaging needs you: a message to you, an unanswered ask, or sessions looping.`},{key:`concierge`,label:`Concierge`,description:`Your Concierge needs you or has news: its questions, permissions, decisions, messages and spoken replies.`}]},{title:`Session`,kinds:[{key:`done`,label:`All done`,description:`The session and all its subagents and scripts finished; nothing waits on you. Once per run.`},{key:`failed`,label:`Failed`,description:`The session's run failed (provider or tool error), with the reason.`},{key:`providerError`,label:`Model provider error`,description:`Quota, budget, auth or model-routing errors of the session or a subagent; once per run.`},{key:`turn`,label:`Turn finished`,description:`Every reply of the main session, also the short ones between subagents. Noisy.`},{key:`stopped`,label:`Stopped`,description:`A run stopped without you asking (OpenCode shut down, inactivity).`},{key:`retry`,label:`Retrying`,description:`The provider failed and OpenCode is retrying the request.`}]},{title:`Subagents`,kinds:[{key:`subagentDone`,label:`Subagent finished`,description:`Each subagent that finishes, by name.`},{key:`subagentFailed`,label:`Subagent failed`,description:`Each subagent that fails, with the reason.`}]},{title:`Scripts and tools`,kinds:[{key:`jobDone`,label:`Script finished`,description:`A background shell or terminal exited 0.`},{key:`jobFailed`,label:`Script failed`,description:`A background shell or terminal exited non-zero, was killed or timed out.`},{key:`longTool`,label:`Long tool finished`,description:`A tool call that ran 30 seconds or more ended.`}]},{title:`Voice`,kinds:[{key:`say`,label:`Spoken reply`,description:`Voice mode replies while no device shows the session.`},{key:`handoff`,label:`Hand-off`,description:`A session sent to this device from the terminal (ignores quiet hours).`}]},{title:`Activity digest`,kinds:[{key:`activity`,label:`Activity`,description:`One quiet, self-replacing summary per session: subagents, long tools, scripts, idle.`}]}],tn=en.flatMap(e=>e.kinds);function nn(e){let t=tn.filter(t=>e[t.key]).map(e=>e.label);return t.length?`You'll get: ${t.join(`, `)}.`:`You'll get no notifications on this device.`}function rn(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||`UTC`}catch{return`UTC`}}var an=[{id:`general`,label:`General`,description:`Account, theme, text size and the Hub app`},{id:`notifications`,label:`Notifications`,description:`This device's notifications, what to notify about, quiet hours`},{id:`voice`,label:`Voice & speech`,description:`Voice mode, mic sensitivity, speech-to-text and text-to-speech`},{id:`machines`,label:`Machines & devices`,description:`Connected machines, approvals, signed-in browsers and apps`},{id:`agents`,label:`Agents & access`,description:`App tokens, acting switches, grants and agent activity`},{id:`concierge`,label:`Concierge`,description:`Your hub-managed assistant: machine, directory, model and its grant`},{id:`teams`,label:`Teams`,description:`Team isolation: what team members see`},{id:`admin`,label:`Admin`,description:`Users, all machines, approvals and the audit log`,admin:!0}],on=e=>an.filter(t=>e||!t.admin);function sn(e){if(e!==`/settings`&&!e.startsWith(`/settings/`))return;let t=e.slice(10).split(`/`)[0]??``;if(!t)return{};try{return{section:decodeURIComponent(t)}}catch{return{section:t}}}function cn(e,t){return e===void 0?t.phone?`list`:`general`:on(t.admin).find(t=>t.id===e)?.id}var ln={account:`general`,appearance:`general`,notifications:`notifications`,voice:`voice`,speech:`voice`,machines:`machines`,devices:`machines`,agents:`agents`,admin:`admin`};function un(e){let t=e.replace(/^#/,``);if(!t)return;let n=ln[t];if(n)return`/settings/${n}#${t}`;if(an.some(e=>e.id===t))return`/settings/${t}`}var dn=[{id:`account`,section:`general`,label:`Account`,description:`Who you are signed in as; sign out of this device`,keywords:`sign out logout user email`},{id:`set-theme`,section:`general`,label:`Color theme`,description:`Light, dark or the system's theme`,keywords:`appearance light dark system mode`},{id:`set-text-size`,section:`general`,label:`Text size`,description:`How big text is on this device`,keywords:`appearance font scale zoom`},{id:`add-app`,section:`general`,label:`Add the Hub app`,description:`Link the Hub app on a phone or tablet with a QR code`,keywords:`mobile android ios install pair link`},{id:`notifications`,section:`notifications`,label:`Notifications on this device`,description:`Enable or turn off push notifications here; permission and subscription status`,keywords:`push enable subscribe permission service worker`},{id:`notify-test`,section:`notifications`,label:`Send test notification`,description:`Check that notifications reach this device`,keywords:`push try`},{id:`quiet-hours`,section:`notifications`,label:`Quiet hours`,description:`No notifications at night (hand-offs still come through)`,keywords:`do not disturb night sleep time`},{id:`set-voice-speed`,section:`voice`,label:`Voice speed`,description:`How fast replies are spoken`,keywords:`rate tts`},{id:`set-sensitivity`,section:`voice`,label:`Mic sensitivity`,description:`How sure Voice mode must be that you are speaking to it`,keywords:`microphone noise vad`},{id:`set-cues`,section:`voice`,label:`Progress cues`,description:`Tones and short acknowledgements while the agent works`,keywords:`sounds acknowledgement`},{id:`set-background`,section:`voice`,label:`Keep listening when the screen is off`,description:`Lock-screen controls and listening with the screen off`,keywords:`background lock screen`},{id:`speech`,section:`voice`,label:`Speech`,description:`Speech-to-text and text-to-speech provider, model, voice and API keys`,keywords:`stt tts transcription openrouter openai key`},{id:`machines`,section:`machines`,label:`Machines`,description:`Computers running OpenCode connected to this hub; approve or revoke them`,keywords:`computer approve enrollment revoke opencode`},{id:`devices`,section:`machines`,label:`Devices`,description:`Browsers and the Hub app signed in to your account; revoke them`,keywords:`browser phone sessions revoke sign out`},{id:`agents`,section:`agents`,label:`Acting switch`,description:`Whether sessions and apps may act for you at all`,keywords:`pause kill switch acting`},{id:`app-tokens`,section:`agents`,label:`App tokens`,description:`Tokens for MCP gateways, CLIs and other apps, with their scopes`,keywords:`api key token scopes mcp cli`},{id:`grants`,section:`agents`,label:`Grants`,description:`What sessions and apps may approve, deny, answer, prompt or stop for you`,keywords:`permissions delegate allow`},{id:`agent-activity`,section:`agents`,label:`Agent activity`,description:`What agents did for you (the agent audit)`,keywords:`audit log history`},{id:`concierge`,section:`concierge`,label:`Concierge`,description:`Turn the Concierge on or off, pick its machine and directory, restart it`,keywords:`assistant butler watch sessions`},{id:`concierge-grant`,section:`concierge`,label:`Concierge grant`,description:`What the Concierge may do for you without asking; renew or remove it`,keywords:`permissions approve deny preset`},{id:`team-isolation`,section:`teams`,label:`Team isolation`,description:`Team members see only their teams' sessions, not your other sessions`,keywords:`teams privacy hide members`}],fn=[{id:`admin`,section:`admin`,label:`Users`,description:`Everyone on this hub: roles, disable, remove`,keywords:`admin accounts people`},{id:`admin-machines`,section:`admin`,label:`All machines`,description:`Every machine connected to this hub, by owner`,keywords:`admin revoke`},{id:`admin-audit`,section:`admin`,label:`Audit log`,description:`Who changed what on this hub`,keywords:`admin history`}],pn=(e,t)=>({id:`pref-${e.key}`,section:`notifications`,label:e.label,description:e.description,keywords:`notify ${t}`});function mn(e){return[...dn,...en.flatMap(e=>e.kinds.map(t=>pn(t,e.title))),...e?fn:[]]}var hn=e=>an.find(t=>t.id===e)?.label??e;function gn(e,t){let n=e.trim().toLowerCase();if(!n)return[];let r=n.split(/\s+/),i=e=>{let t=e.label.toLowerCase();return t.startsWith(n)?0:t.includes(n)?1:r.every(e=>t.includes(e))?2:3};return t.filter(e=>{let t=`${e.label} ${e.description} ${e.keywords??``} ${hn(e.section)}`.toLowerCase();return r.every(e=>t.includes(e))}).map((e,t)=>({e,i:t,r:i(e)})).sort((e,t)=>e.r-t.r||e.i-t.i).map(e=>e.e)}function _n(e,t){let n=e.filter(e=>e.key in t);if(!n.length)return``;let r=n.filter(e=>t[e.key]);return r.length===n.length?`All on`:r.length?`${r.length} of ${n.length} on: ${r.map(e=>e.label).join(`, `)}`:`All off`}var vn=e=>e&&e.startsWith(`/`)&&!e.startsWith(`//`)&&!e.includes(`\\`)?e:`/`;function yn(e){let t=e.pathname,n=e.searchParams;if(t===`/pair`)return{name:`pair`,next:vn(n.get(`next`)),error:n.get(`error`)??``};if(t===`/approve`)return{name:`approve`,code:n.get(`code`)??``};if(t===`/new`)return{name:`new`,machine:n.get(`machine`)??void 0,dir:n.get(`dir`)??void 0,key:n.get(`key`)??void 0};if(t===`/panes`)return{name:`panes`};if(t===`/concierge`||t.startsWith(`/concierge/`))return{name:`concierge`};let r=sn(t);if(r)return{name:`settings`,...r};let i=Jt(t);if(i)return{name:`feature`,id:i.dest.id,rest:i.rest};let a=/^\/s\/([^/]+)$/.exec(t);if(a)try{return{name:`session`,id:decodeURIComponent(a[1])}}catch{return{name:`home`}}return{name:`home`}}function bn(){let e=(location.pathname===`/settings`?un(location.hash):void 0)??Wt(location.pathname,location.search,location.hash);return e&&history.replaceState(history.state,``,e),new URL(location.href)}var[xn,Sn]=x(bn()),Cn=xn,wn=()=>yn(xn()),$=0;function Tn(e,{replace:t=!1}={}){let n=new URL(e,location.origin);n.pathname+n.search+n.hash!==location.pathname+location.search+location.hash&&(history[t?`replaceState`:`pushState`]({},``,n.pathname+n.search+n.hash),t||$++),Sn(bn())}function En(e=`/`){$>0?history.back():Tn(e)}window.addEventListener(`popstate`,()=>{$=Math.max(0,$-1),Sn(bn())}),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[href]`);if(!t||t.target||t.hasAttribute(`download`)||e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let n=t.getAttribute(`href`)??``;!n.startsWith(`/`)||n.startsWith(`//`)||n.startsWith(`/auth/`)||n.startsWith(`/api/`)||(e.preventDefault(),Tn(n))});var Dn=()=>new Set;function On(e){Dn=e}var kn=e=>Dn().has(e),An=e=>Dn().has(e)?`/concierge`:`/s/${encodeURIComponent(e)}`,[jn,Mn]=x(),Nn=jn,Pn=0,Fn;function In(e,t=``,n){let r=++Pn;Mn({id:r,text:e,kind:t,action:n}),clearTimeout(Fn),Fn=setTimeout(()=>jn()?.id===r&&Mn(void 0),n||t?8e3:4e3)}var Ln=()=>Mn(void 0),Rn=U(`<svg viewBox="0 0 24 24"aria-hidden=true>`),zn=U(`<svg><path></svg>`,!1,!0,!1),Bn=U(`<span class=voice-dot role=img aria-label="Voice mode on"title="Voice mode on">`),Vn=U(`<span class=spinner>`),Hn=U(`<span role=img>`),Un=U(`<span class=status-dot>`),Wn=U(`<button type=button>`),Gn=U(`<button type=button aria-haspopup=menu>`),Kn=U(`<div class=menu role=menu>`),qn=U(`<div class=menu-sep role=separator>`),Jn=U(`<div class=menu-section>`),Yn=U(`<span class=menu-hint>`),Xn=U(`<kbd class=menu-key>`),Zn=U(`<button type=button><span class=menu-check></span><span class=menu-label>`),Qn=U(`<div class=dialog-head><h2>`),$n=U(`<div class=dialog-body>`),er=U(`<dialog>`),tr=U(`<span class=error-badge role=img>!`),nr={menu:[`M4 6h16`,`M4 12h16`,`M4 18h16`],sidebar:[`M4 5h16v14H4z`,`M9 5v14`],rail:[`M4 5h16v14H4z`,`M15 5v14`],plus:[`M12 5v14`,`M5 12h14`],file:[`M6 3h8l4 4v14H6z`,`M14 3v4h4`],more:[`M5 12h.01`,`M12 12h.01`,`M19 12h.01`],search:[`M11 4a7 7 0 1 0 0 14a7 7 0 0 0 0-14z`,`M20 20l-4-4`],mic:[`M12 3a3 3 0 0 1 3 3v6a3 3 0 0 1-6 0V6a3 3 0 0 1 3-3z`,`M5 11a7 7 0 0 0 14 0`,`M12 18v3`],wave:[`M3 12h2`,`M7 8v8`,`M11 5v14`,`M15 8v8`,`M19 11v2`],stop:[`M7 7h10v10H7z`],send:[`M12 19V5`,`M5 12l7-7 7 7`],chevron:[`M9 6l6 6-6 6`],down:[`M6 9l6 6 6-6`],close:[`M6 6l12 12`,`M18 6L6 18`],back:[`M15 5l-7 7 7 7`],settings:[`M4 7h10M18 7h2M4 17h4M12 17h8`,`M16 5v4`,`M10 15v4`],branch:[`M6 3v12`,`M18 9a3 3 0 1 0 0-6a3 3 0 0 0 0 6z`,`M6 21a3 3 0 1 0 0-6a3 3 0 0 0 0 6z`,`M18 9a9 9 0 0 1-9 9`],server:[`M4 5h16v6H4z`,`M4 13h16v6H4z`,`M8 8h.01`,`M8 16h.01`],diff:[`M12 3v6`,`M9 6h6`,`M9 18h6`,`M5 3h14v18H5z`],pin:[`M12 17v5`,`M8 3h8l-1 6 3 3H6l3-3z`],muted:[`M12 3a3 3 0 0 1 3 3v6a3 3 0 0 1-6 0V6a3 3 0 0 1 3-3z`,`M5 11a7 7 0 0 0 14 0`,`M4 4l16 16`],home:[`M4 11l8-7 8 7`,`M6 10v10h12V10`],cloud:[`M7 18h10a4 4 0 0 0 .5-7.97A6 6 0 0 0 6.1 9.1A4.5 4.5 0 0 0 7 18z`],folder:[`M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z`],bell:[`M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9`,`M10.3 21a1.94 1.94 0 0 0 3.4 0`],watchtower:[`M6 7l6-4 6 4`,`M8 7h8v4H8z`,`M9 11l-2 10`,`M15 11l2 10`,`M8.2 15h7.6`],copy:[`M9 9h11v11H9z`,`M5 15H4V4h11v1`],fork:[`M6 3v5a6 6 0 0 0 6 6`,`M18 3v5a6 6 0 0 1-6 6v7`,`M4 5l2-2 2 2`,`M16 5l2-2 2 2`],undo:[`M9 14L4 9l5-5`,`M4 9h11a5 5 0 0 1 0 10h-3`],download:[`M12 4v11`,`M7 10l5 5 5-5`,`M5 20h14`],edit:[`M4 20h4L19 9l-4-4L4 16z`,`M13 7l4 4`],info:[`M12 3a9 9 0 1 0 0 18a9 9 0 0 0 0-18z`,`M12 11v5`,`M12 8h.01`],check:[`M5 12l5 5 9-10`],spark:[`M12 3l1.8 5.2L19 10l-5.2 1.8L12 17l-1.8-5.2L5 10l5.2-1.8z`,`M19 16l.7 1.8 1.8.7-1.8.7L19 21l-.7-1.8-1.8-.7 1.8-.7z`],split:[`M4 5h16v14H4z`,`M12 5v14`],expand:[`M14 4h6v6`,`M20 4l-7 7`,`M10 20H4v-6`,`M4 20l7-7`],archive:[`M4 5h16v4H4z`,`M6 9v10h12V9`,`M10 13h4`],wrap:[`M4 6h16`,`M4 12h13a3 3 0 0 1 0 6h-4`,`M15 16l-2 2 2 2`,`M4 18h5`],lock:[`M6 11h12v9H6z`,`M8 11V8a4 4 0 0 1 8 0v3`],code:[`M9 8l-4 4 4 4`,`M15 8l4 4-4 4`],image:[`M4 5h16v14H4z`,`M4 16l5-5 4 4 2-2 5 5`,`M15 9h.01`],table:[`M4 5h16v14H4z`,`M4 10h16`,`M4 15h16`,`M10 5v14`],chart:[`M4 20h16`,`M7 16v-5`,`M12 16V7`,`M17 16v-8`],grid:[`M4 4h7v7H4z`,`M13 4h7v7h-7z`,`M4 13h7v7H4z`,`M13 13h7v7h-7z`],stack:[`M4 5h16v14H4z`,`M4 12h16`],grip:[`M9 6h.01`,`M15 6h.01`,`M9 12h.01`,`M15 12h.01`,`M9 18h.01`,`M15 18h.01`],app:[`M4 5h16v14H4z`,`M4 9h16`,`M7 7h.01`,`M10 7h.01`],doc:[`M6 3h8l4 4v14H6z`,`M14 3v4h4`,`M9 12h6`,`M9 16h6`],team:[`M9 11a3 3 0 1 0 0-6a3 3 0 0 0 0 6z`,`M3 20a6 6 0 0 1 12 0`,`M16 11a2.5 2.5 0 1 0 0-5`,`M17 14.2a5 5 0 0 1 4 4.8`]};function rr(e){return(()=>{var t=Rn();return q(t,B(Pe,{get each(){return[...nr[e.name]]},children:e=>(()=>{var t=zn();return W(t,`d`,e),t})()})),S(()=>W(t,`class`,`icon ${e.class??``}`)),t})()}var ir={idle:`Idle`,working:`Running`,blocked:`Needs you`,error:`Error`};function ar(){return Bn()}function or(e){return(()=>{var t=Hn();return q(t,B(H,{get when(){return e.state===`working`},get fallback(){return Un()},get children(){return Vn()}})),S(n=>{var r=`status ${e.state} ${e.class??``}`,i=ir[e.state],a=ir[e.state];return r!==n.e&&G(t,n.e=r),i!==n.t&&W(t,`aria-label`,n.t=i),a!==n.a&&W(t,`title`,n.a=a),n},{e:void 0,t:void 0,a:void 0}),t})()}function sr(e){let[t,n]=je(e,[`icon`,`label`,`class`]);return(()=>{var e=Wn();return at(e,Ae({get class(){return`icon-btn ${t.class??``}`},get"aria-label"(){return t.label},get title(){return t.label}},n),!1,!0),q(e,B(rr,{get name(){return t.icon}})),e})()}function cr(e){let[t,n]=x(!1),r,i,[a,o]=x({top:0,left:0,right:0,bottom:0}),s=()=>{let e=r.getBoundingClientRect();o({top:e.bottom+4,left:e.left,right:window.innerWidth-e.right,bottom:window.innerHeight-e.top+4})},c=()=>n(!1),l=e=>{if(!t())return;let n=e.target;!r.contains(n)&&!i?.contains(n)&&c()},u=n=>{if(t()){if(n.key===`Escape`)c(),r.focus();else if(/^[1-9]$/.test(n.key)&&!(n.target instanceof HTMLInputElement||n.target instanceof HTMLTextAreaElement)){let t=e.items().filter(e=>typeof e==`object`&&`run`in e&&!e.disabled)[Number(n.key)-1];t&&(n.preventDefault(),c(),t.run())}}};ae(()=>{document.addEventListener(`mousedown`,l),document.addEventListener(`keydown`,u)}),E(()=>{document.removeEventListener(`mousedown`,l),document.removeEventListener(`keydown`,u)});let d=()=>{let t=0;return e.items().map(e=>({item:e,index:typeof e==`object`&&`run`in e&&!e.disabled?++t:0}))};return[(()=>{var i=Gn();i.$$click=e=>{e.stopPropagation(),e.preventDefault(),s(),n(!t())};var a=r;return typeof a==`function`?K(a,i):r=i,q(i,()=>e.text??B(rr,{get name(){return e.icon??`more`}})),S(n=>{var r=e.class??`icon-btn`,a=e.label,o=e.label,s=t();return r!==n.e&&G(i,n.e=r),a!==n.t&&W(i,`aria-label`,n.t=a),o!==n.a&&W(i,`title`,n.a=o),s!==n.o&&W(i,`aria-expanded`,n.o=s),n},{e:void 0,t:void 0,a:void 0,o:void 0}),i})(),B(H,{get when(){return t()},get children(){return B(_t,{get children(){var t=Kn(),n=i;return typeof n==`function`?K(n,t):i=t,q(t,B(Pe,{get each(){return d()},children:({item:e,index:t})=>e===`sep`?qn():`section`in e?(()=>{var t=Jn();return q(t,()=>e.section),t})():(()=>{var n=Zn(),r=n.firstChild,i=r.nextSibling;return n.$$click=t=>{t.stopPropagation(),c(),e.run()},q(r,()=>e.checked?`✓`:``),q(i,()=>e.label),q(n,B(H,{get when(){return e.hint},get children(){var t=Yn();return q(t,()=>e.hint),t}}),null),q(n,B(H,{when:t>0&&t<10,get children(){var e=Xn();return q(e,t),e}}),null),S(t=>{var r=e.checked===void 0?`menuitem`:`menuitemradio`,i=e.checked,a=`menu-item${e.danger?` danger`:``}`,o=e.disabled;return r!==t.e&&W(n,`role`,t.e=r),i!==t.t&&W(n,`aria-checked`,t.t=i),a!==t.a&&G(n,t.a=a),o!==t.o&&(n.disabled=t.o=o),t},{e:void 0,t:void 0,a:void 0,o:void 0}),n})()})),S(n=>rt(t,{...e.up?{bottom:`${a().bottom}px`}:{top:`${a().top}px`},...e.align===`left`?{left:`${a().left}px`}:{right:`${a().right}px`}},n)),t}})}})]}function lr(e){let t;return C(()=>{let n=e.open;t&&(n&&!t.open?t.showModal():!n&&t.open&&t.close())}),(()=>{var n=er();n.$$click=n=>n.target===t&&e.onClose(),n.addEventListener(`close`,()=>e.onClose());var r=t;return typeof r==`function`?K(r,n):t=n,q(n,B(H,{get when(){return e.open},get children(){return[(()=>{var t=Qn(),n=t.firstChild;return q(n,()=>e.title),q(t,B(sr,{icon:`close`,label:`Close`,onClick:()=>e.onClose()}),null),t})(),(()=>{var t=$n();return q(t,()=>e.children),t})()]}})),S(t=>{var r=`dialog${e.wide?` wide`:``} ${e.class??``}`,i=e.title;return r!==t.e&&G(n,t.e=r),i!==t.t&&W(n,`aria-label`,t.t=i),t},{e:void 0,t:void 0}),n})()}var[ur,dr]=x(Date.now());setInterval(()=>dr(Date.now()),3e4);var fr=ur,[pr,mr]=x(Date.now());setInterval(()=>mr(Date.now()),1e3);var hr=pr;function gr(e){return(()=>{var t=tr();return S(n=>{var r=`Error: ${e.text}`,i=e.text;return r!==n.e&&W(t,`aria-label`,n.e=r),i!==n.t&&W(t,`title`,n.t=i),n},{e:void 0,t:void 0}),t})()}function _r(e,t=ur()){if(!e)return``;let n=Math.max(0,Math.round((t-e)/1e3));return n<45?`just now`:n<3600?`${Math.round(n/60)}m ago`:n<86400?`${Math.round(n/3600)}h ago`:`${Math.round(n/86400)}d ago`}var vr=e=>String(e??``).replace(/[\\/]+$/,``).split(/[\\/]/).pop()||e||``,yr={herdr:`Herdr`,tui:`TUI`,background:`Background`};Qe([`click`]);export{Et as $,en as A,w as At,qt as B,ae as Bt,On as C,H as Ct,mn as D,B as Dt,gn as E,re as Et,nn as F,D as Ft,Bt as G,Pt as H,Zt as I,Me as It,At as J,Ht as K,Q as L,Ae as Lt,Qt as M,ne as Mt,rn as N,b as Nt,on as O,ee as Ot,Xt as P,x as Pt,wt as Q,Yt as R,ie as Rt,An as S,Le as St,cn as T,Ie as Tt,Lt as U,Rt as V,T as Vt,It as W,bt as X,kt as Y,xt as Z,En as _,K as _t,cr as a,_t as at,Tn as b,Pe as bt,or as c,Qe as ct,vr as d,Ze as dt,Ot as et,fr as f,W as ft,In as g,U as gt,Ln as h,rt as ht,sr as i,yt as it,tn as j,S as jt,$t as k,C as kt,ar as l,q as lt,Nn as m,at as mt,gr as n,Dt as nt,yr as o,tt as ot,hr as p,it as pt,Vt as q,rr as r,Ct as rt,ir as s,G as st,lr as t,Tt as tt,_r as u,Je as ut,kn as v,i as vt,_n as w,ze as wt,wn as x,Fe as xt,Cn as y,o as yt,Kt as z,E as zt};
@@ -28,8 +28,11 @@
28
28
  <link rel="icon" href="/icon.svg" type="image/svg+xml" />
29
29
  <link rel="icon" href="/icon-192.png" type="image/png" sizes="192x192" />
30
30
  <link rel="apple-touch-icon" href="/apple-touch-icon.png" />
31
- <script type="module" crossorigin src="/assets/index-FUJbj_Du.js"></script>
32
- <link rel="stylesheet" crossorigin href="/assets/index-Dm8OmkaO.css">
31
+ <script type="module" crossorigin src="/assets/index-DaH5GUdV.js"></script>
32
+ <link rel="modulepreload" crossorigin href="/assets/ui-C9Igxzjm.js">
33
+ <link rel="modulepreload" crossorigin href="/assets/pane-layout-CKC4I00k.js">
34
+ <link rel="modulepreload" crossorigin href="/assets/plural-Bspvoqfq.js">
35
+ <link rel="stylesheet" crossorigin href="/assets/index-WWuKfWxL.css">
33
36
  </head>
34
37
  <body>
35
38
  <div id="root"></div>
package/web/dist/sw.js CHANGED
@@ -7,7 +7,7 @@ self.addEventListener("install", () => self.skipWaiting())
7
7
  self.addEventListener("activate", (event) => event.waitUntil(self.clients.claim()))
8
8
 
9
9
  /** Kinds that wait for the user: stay on screen until handled. */
10
- const STICKY = new Set(["question", "permission", "blocked", "decision"])
10
+ const STICKY = new Set(["question", "permission", "blocked", "decision", "concierge"])
11
11
  /** Progress kinds replace the previous one of the session quietly (same tag, no new alert). */
12
12
  const QUIET = new Set(["finished", "turn", "retry", "subagentDone", "jobDone", "longTool", "activity"])
13
13
  const VIBRATE = {
@@ -15,6 +15,7 @@ const VIBRATE = {
15
15
  permission: [200, 100, 200],
16
16
  blocked: [200, 100, 200],
17
17
  decision: [200, 100, 200],
18
+ concierge: [200, 100, 200],
18
19
  message: [150, 80, 150],
19
20
  failed: [300],
20
21
  providerError: [300, 100, 300],
@@ -27,6 +28,25 @@ const VIBRATE = {
27
28
  const sessionURL = (sessionID) => (sessionID ? `/s/${encodeURIComponent(sessionID)}` : "/")
28
29
  /** A Decision's card: in its session (or Home), marked by ?decision=. */
29
30
  const decisionURL = (sessionID, decisionID) => `${sessionURL(sessionID)}?decision=${encodeURIComponent(decisionID)}`
31
+ /**
32
+ * A console path from the payload, else "": no control characters or backslashes (browsers strip tabs and newlines,
33
+ * so "/\t/evil.com" would become "//evil.com"), resolved against this origin and kept only when it stays on it.
34
+ */
35
+ function consolePath(url) {
36
+ if (typeof url !== "string" || !url.startsWith("/") || /[\u0000-\u001f\u007f\\]/.test(url)) return ""
37
+ try {
38
+ const resolved = new URL(url, self.location.origin)
39
+ return resolved.origin === self.location.origin ? resolved.pathname + resolved.search + resolved.hash : ""
40
+ } catch {
41
+ return ""
42
+ }
43
+ }
44
+ /**
45
+ * Where a tap opens. The Concierge's alerts (kind "concierge", CON-04 remaps them from its hidden session) open the
46
+ * Concierge panel: the payload's url when it is a console path, else /concierge; never the hidden session's page.
47
+ */
48
+ const clickURL = (kind, url, sessionID, decisionID) =>
49
+ kind === "concierge" ? consolePath(url) || "/concierge" : decisionID ? decisionURL(sessionID, decisionID) : sessionURL(sessionID)
30
50
 
31
51
  async function postJSON(path, body) {
32
52
  return fetch(path, {
@@ -136,7 +156,7 @@ self.addEventListener("push", (event) => {
136
156
  badge: "/icon-192.png",
137
157
  timestamp: Date.now(),
138
158
  actions,
139
- data: { url: decisionID ? decisionURL(sessionID, decisionID) : sessionURL(sessionID), sessionID, kind, requestID },
159
+ data: { url: clickURL(kind, data.url, sessionID, decisionID), sessionID, kind, requestID },
140
160
  })
141
161
  })(),
142
162
  )
@@ -1 +0,0 @@
1
- :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}.expand-sidebar{z-index:5;position:absolute;top:9px;left:8px}.shell.collapsed .topbar,.shell.collapsed .home-head{padding-left:48px}.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}.tick{color:var(--faint);font-size:.6875rem}.tick.heard{color:var(--ok)}.tick.failed{color:var(--err)}.tick.queued{color:var(--warn)}.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;c‍ursor: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 *{c‍ursor:col-resize!important;-webkit-user-select:none!important;user-select:none!important}html.resizing iframe{pointer-events:none}.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}.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:24px;padding:0 24px;display:flex;overflow:auto}.settings-nav{flex-direction:column;flex:none;align-self:flex-start;gap:2px;width:150px;padding-top:24px;display:flex;position:sticky;top:0}.settings-nav a{color:var(--muted);border-radius:6px;padding:5px 8px}.settings-nav a:hover{background:var(--raise-2);color:var(--text)}.settings-content{flex:1;max-width:720px;padding:12px 0 48px}.settings-section{border-bottom:1px solid var(--line);padding:18px 0;scroll-margin-top:8px}.settings-section h2{font:400 1.25rem var(--serif);margin:0 0 12px}.settings-section h3{color:var(--muted);font-size:.8125rem;font-weight:500}.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}.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-group{margin:14px 0 0}.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{opacity:.4;cursor:default}.env-meta{flex-wrap:wrap;align-items:center;gap:4px;margin-top:8px;display:flex}.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}}