@huynle/hub 0.8.7 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +129 -0
- package/README.md +69 -12
- package/package.json +5 -1
- package/packages/claude-code/package.json +1 -1
- package/packages/cli/dist/hub-cli.js +278 -35
- package/packages/cli/package.json +1 -1
- package/packages/cli/src/cli.ts +23 -10
- package/packages/cli/src/http.ts +1 -0
- package/packages/cli/src/launches.ts +5 -1
- package/packages/cli/src/mcp.ts +28 -8
- package/packages/cli/src/messaging.ts +14 -0
- package/packages/cli/src/team-intake-mcp.ts +26 -2
- package/packages/codex/package.json +1 -1
- package/packages/node/package.json +1 -1
- package/packages/preset/package.json +1 -1
- package/packages/protocol/package.json +1 -1
- package/packages/protocol/schema/app-delivery/v1.schema.json +677 -0
- package/packages/protocol/src/artifacts.ts +43 -0
- package/packages/protocol/src/credentials.ts +38 -0
- package/packages/protocol/src/index.ts +56 -5
- package/packages/protocol/src/launch.ts +7 -2
- package/packages/protocol/src/markdown.ts +753 -0
- package/packages/protocol/src/media-allowlist.ts +240 -0
- package/packages/protocol/src/media.ts +120 -0
- package/packages/protocol/src/preview-bundle.ts +221 -0
- package/packages/protocol/src/voice-recording.ts +8 -0
- package/packages/runtime-openshell/package.json +1 -1
- package/packages/runtime-sdk/package.json +1 -1
- package/packages/sdk/package.json +1 -1
- package/packages/sdk/src/client.ts +17 -3
- package/packages/sdk/src/errors.ts +1 -0
- package/packages/sdk/src/team-intake.ts +8 -0
- package/packages/sdk/src/types.ts +16 -2
- package/packages/spoke-sdk/package.json +1 -1
- package/src/central/agent/delivery.ts +35 -6
- package/src/central/agent/errors.ts +2 -0
- package/src/central/agent/events.ts +11 -2
- package/src/central/agent/launch-engine.ts +65 -4
- package/src/central/agent/launch-routes.ts +8 -0
- package/src/central/agent/launch-spec.ts +18 -1
- package/src/central/agent/launch-store.ts +2 -2
- package/src/central/agent/message-routes.ts +49 -11
- package/src/central/agent/messages.ts +17 -4
- package/src/central/agent/not-after.ts +28 -0
- package/src/central/agent/placement.ts +36 -4
- package/src/central/agent/routes.ts +3 -1
- package/src/central/agent/webhook-routes.ts +21 -9
- package/src/central/agent/webhooks.ts +27 -9
- package/src/central/artifacts/host.ts +3 -1
- package/src/central/artifacts/maintenance.ts +2 -1
- package/src/central/artifacts/preview-bundle.ts +81 -0
- package/src/central/artifacts/previews.ts +94 -0
- package/src/central/artifacts/routes.ts +12 -1
- package/src/central/artifacts/store.ts +198 -8
- package/src/central/config.ts +34 -0
- package/src/central/fetch-budget.ts +59 -0
- package/src/central/fetcher.ts +372 -0
- package/src/central/http.ts +277 -22
- package/src/central/media-remote.ts +248 -0
- package/src/central/media-timeline.ts +317 -0
- package/src/central/media-unfurl.ts +119 -0
- package/src/central/profiles/content.ts +3 -35
- package/src/central/recording/routes.ts +2 -2
- package/src/central/recording/schema.ts +3 -1
- package/src/central/registry.ts +449 -21
- package/src/central/spoke-ws.ts +17 -3
- package/src/central/store.ts +21 -0
- package/src/central/teams/intake-routes.ts +2 -1
- package/src/central/teams/intake.ts +200 -15
- package/src/central/unfurl-parse.ts +313 -0
- package/src/index.ts +68 -8
- package/src/speakable.ts +33 -1
- package/src/spoke/conversation.ts +7 -4
- package/src/spoke/deliver.ts +19 -0
- package/src/spoke/media-bytes.ts +171 -0
- package/src/spoke/media-policy.ts +394 -0
- package/src/spoke/media.ts +189 -0
- package/src/spoke/own-server.ts +30 -0
- package/src/spoke/preview-bundle.ts +538 -0
- package/src/spoke/spoke.ts +387 -17
- package/src/spoke/timeline.ts +59 -5
- package/src/spoke/voice-front.ts +335 -0
- package/web/dist/assets/24BXRY42-Zfr7jm_p.js +2 -0
- package/web/dist/assets/4FHPYW2L-C6Z67098.js +2 -0
- package/web/dist/assets/4LWW3ZNH-CUiYeygH.js +1 -0
- package/web/dist/assets/5THPTBWS-Ce_hS451.js +1 -0
- package/web/dist/assets/5XYWFMKW-CW-BCKiK.js +4 -0
- package/web/dist/assets/64PMEAB3-BjpCDGU9.js +8 -0
- package/web/dist/assets/6BEWHPQE-BpNa96Ze.js +2 -0
- package/web/dist/assets/6PIGVMFT-YXn9Hgnb.js +1 -0
- package/web/dist/assets/75JW6PN6-BFpDBuGN.js +2 -0
- package/web/dist/assets/7WLXJQOR-D6QVYUu9.js +1 -0
- package/web/dist/assets/7XWI72E6-BMuIspEy.js +2 -0
- package/web/dist/assets/A4UD2L5Z-BQzcD9dU.js +8 -0
- package/web/dist/assets/ArtifactPage-4GoBqSpU.js +1 -0
- package/web/dist/assets/ArtifactPane-Dx_0iWwH.js +1 -0
- package/web/dist/assets/ArtifactWorkbench-CuHgARMk.js +6 -0
- package/web/dist/assets/BGW36YJW-CJMhya8S.js +4 -0
- package/web/dist/assets/CGIZI67J-DYDSLME8.js +2 -0
- package/web/dist/assets/DKTLEL5E-DciMwFJ1.js +1 -0
- package/web/dist/assets/DNNCRC2E-BIeKf5t-.js +5 -0
- package/web/dist/assets/Diagram-CZM_R7MG.js +1 -0
- package/web/dist/assets/Diagram-vdpmp3xu.css +1 -0
- package/web/dist/assets/E67EBMDD--AucIw59.js +5 -0
- package/web/dist/assets/EFYWJBJK-CVywe_D5.js +1 -0
- package/web/dist/assets/EXE5EH6O-DR1IHCTr.js +4 -0
- package/web/dist/assets/FTXIJQGB-BZVuiBn1.js +1 -0
- package/web/dist/assets/G3MDBVQH-BZmnMkFw.js +1 -0
- package/web/dist/assets/G6GPDDNC-DEz8F449.js +2 -0
- package/web/dist/assets/G76NGGFM-CrB2V34K.js +1 -0
- package/web/dist/assets/GH6G3TJC-D3RTYEH4.js +2 -0
- package/web/dist/assets/HPNUA7RO-B19NeNOJ.js +1 -0
- package/web/dist/assets/HQRGC5D7-Dmpzq6Rn.js +4 -0
- package/web/dist/assets/IX6Z2TVR-DphRHnek.js +5 -0
- package/web/dist/assets/J77NQRCJ-B7AGcxvw.js +3 -0
- package/web/dist/assets/JAD36DTZ-B9-dbsS0.js +5 -0
- package/web/dist/assets/LF3NJQAX-koL91UZ9.js +2 -0
- package/web/dist/assets/LRZCOFJZ-Cdjasfuf.js +6 -0
- package/web/dist/assets/Library-TwvrwqSk.js +2 -0
- package/web/dist/assets/Lightbox-C8KNKwOA.css +1 -0
- package/web/dist/assets/Lightbox-Du56MXGX.js +1 -0
- package/web/dist/assets/MediaImage-Ds_JUx3a.js +4 -0
- package/web/dist/assets/N5NF2FGY-OuapYTfr.js +2 -0
- package/web/dist/assets/N7OWWQHY-BNLd-Q_U.js +2 -0
- package/web/dist/assets/NT5JY5WP-1lJM-aun.js +1 -0
- package/web/dist/assets/OT7W3RNY-jDL3drzX.js +4 -0
- package/web/dist/assets/P67P66DB-CE-opRb8.js +3 -0
- package/web/dist/assets/PFLLLM7K-DDJFgzW3.js +2 -0
- package/web/dist/assets/PUAMC4MJ-CtBm-WuU.js +12 -0
- package/web/dist/assets/PVFCHRLY-CG5JXv60.js +2 -0
- package/web/dist/assets/ProfilesDestination-rKNDpLjR.js +1 -0
- package/web/dist/assets/QQW2P742-BbcEkpa4.js +1 -0
- package/web/dist/assets/RVARI57O-CgA1WoRv.js +1 -0
- package/web/dist/assets/S63OEDPG-CKlhpvl2.js +3 -0
- package/web/dist/assets/SG5TVYLW-BBtiwXPL.js +2 -0
- package/web/dist/assets/TeamsPage-DtJylLrt.js +1 -0
- package/web/dist/assets/UGRSUGA2-urZ_hx83.js +5 -0
- package/web/dist/assets/V44WA6U7-DYfX3OlM.js +1 -0
- package/web/dist/assets/V67O4WWV-xYxJ00QW.js +1 -0
- package/web/dist/assets/VBUCM3YD-JHGjuJC_.js +1 -0
- package/web/dist/assets/VINGRCPA-DZuJa3SH.js +7 -0
- package/web/dist/assets/WL6DNKX4-BHqripdA.js +2 -0
- package/web/dist/assets/WQ63CJYP-D6G5frDY.js +2 -0
- package/web/dist/assets/Watchtower-Bmgdyfjb.js +2 -0
- package/web/dist/assets/XOYAOB3S-L-KeA1EF.js +13 -0
- package/web/dist/assets/Y5LQLG3M-dr2-erb8.js +2 -0
- package/web/dist/assets/YIK6JTN6--1t-Ud8k.js +2 -0
- package/web/dist/assets/artifacts-DU9uRgs1.js +1 -0
- package/web/dist/assets/index-C3ci5UtY.css +1 -0
- package/web/dist/assets/index-D-xG9nrc.js +36 -0
- package/web/dist/assets/lazy-f3CuUNJZ.js +43 -0
- package/web/dist/assets/live-7q72Lyj2.js +5 -0
- package/web/dist/assets/mermaid.worker-WDVRAh32.js +1 -0
- package/web/dist/assets/pane-layout-0RrLHGDr.js +1 -0
- package/web/dist/assets/preload-helper-BLdHbfdN.js +1 -0
- package/web/dist/assets/{renderer2d-CYag1CnR.js → renderer2d-hfZxM6Xl.js} +1 -1
- package/web/dist/assets/{renderer3d-BRB6rgDJ.js → renderer3d-Km9vipTM.js} +1 -1
- package/web/dist/assets/{safe-area-fOy0AOuG.js → safe-area-BAbgBiFk.js} +1 -1
- package/web/dist/assets/{silero-worker-DhlIHyD_.js → silero-worker-e802lB5T.js} +1 -1
- package/web/dist/assets/smart-turn-v3.2-cpu-WpeLRbPA.onnx +0 -0
- package/web/dist/assets/smart-turn-worker-DaVJPdvJ.js +11 -0
- package/web/dist/assets/source-BWlvaODa.js +1 -0
- package/web/dist/assets/toast-Cuu2K0hx.js +1 -0
- package/web/dist/assets/ui-CFB4wQfF.js +3 -0
- package/web/dist/index.html +8 -6
- package/web/src/voice/turn/LICENSE +28 -0
- package/web/dist/assets/ArtifactPage-Dq7VW-bU.js +0 -1
- package/web/dist/assets/ArtifactPane-DKwbMTX9.js +0 -1
- package/web/dist/assets/ArtifactWorkbench-vrgIfncX.js +0 -6
- package/web/dist/assets/Library-D6-Go6Cu.js +0 -2
- package/web/dist/assets/ProfilesDestination-BOML2Dgf.js +0 -1
- package/web/dist/assets/TeamsPage-CNBTE8gB.js +0 -1
- package/web/dist/assets/Watchtower-Dor1Ubjy.js +0 -2
- package/web/dist/assets/hub-CrbItiwP.js +0 -13
- package/web/dist/assets/index-82Ce0IAf.css +0 -1
- package/web/dist/assets/index-D9SP3_0z.js +0 -22
- package/web/dist/assets/live-BNJgy0vg.js +0 -5
- package/web/dist/assets/pane-layout-EdR1kRrG.js +0 -1
- package/web/dist/assets/preload-helper-DqrJTq0t.js +0 -1
- package/web/dist/assets/source-Wbq35qGp.js +0 -1
- package/web/dist/assets/ui-j5FFk90B.js +0 -3
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/renderer2d-CYag1CnR.js","assets/live-BNJgy0vg.js","assets/ui-j5FFk90B.js","assets/hub-CrbItiwP.js","assets/pane-layout-EdR1kRrG.js","assets/plural-Bspvoqfq.js","assets/index-D9SP3_0z.js","assets/preload-helper-DqrJTq0t.js","assets/index-82Ce0IAf.css","assets/live-BUofsQpz.css","assets/safe-area-fOy0AOuG.js","assets/renderer3d-BRB6rgDJ.js","assets/renderer3d-Co5yCKMg.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{$ as e,At as t,C as n,Ct as r,Et as i,Gt as a,Ht as o,It as s,Lt as c,Mt as l,Nt as u,Ot as d,Pt as f,S as p,T as m,Tt as h,Ut as g,Vt as _,Wt as v,a as y,bt as b,dt as x,ft as S,g as C,gt as w,ht as T,i as E,lt as D,pt as O,r as k,u as A,ut as j,yt as M}from"./ui-j5FFk90B.js";import{A as ee}from"./hub-CrbItiwP.js";import{i as te,t as N}from"./preload-helper-DqrJTq0t.js";import{F as P,I as ne,L as F,N as I,P as re,R as ie,k as ae}from"./index-D9SP3_0z.js";import{$ as oe,A as L,C as se,D as ce,F as le,H as R,I as ue,J as de,K as fe,L as pe,M as me,N as he,O as ge,P as _e,Q as ve,R as ye,S as be,T as xe,U as Se,V as Ce,W as we,X as Te,Y as Ee,Z as De,a as Oe,at as ke,b as Ae,ct as je,et as Me,f as Ne,ft as Pe,g as Fe,i as Ie,it as Le,j as Re,k as z,l as ze,lt as B,m as Be,n as Ve,nt as He,o as Ue,ot as We,p as Ge,q as Ke,r as V,rt as qe,s as H,t as Je,tt as Ye,u as Xe,ut as Ze,v as Qe,w as U,x as W,z as $e}from"./live-BNJgy0vg.js";var G=Object.create,K=Object.defineProperty,et=Object.getOwnPropertyDescriptor,tt=Object.getOwnPropertyNames,nt=Object.getPrototypeOf,rt=Object.prototype.hasOwnProperty,it=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t,t.exports),e=null),t.exports),q=(e,t)=>{let n={};for(var r in e)K(n,r,{get:e[r],enumerable:!0});return t||K(n,Symbol.toStringTag,{value:`Module`}),n},J=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=tt(t),a=0,o=i.length,s;a<o;a++)s=i[a],!rt.call(e,s)&&s!==n&&K(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=et(t,s))||r.enumerable});return e},at=(e,t,n)=>(n=e==null?{}:G(nt(e)),J(t||!e||!e.__esModule||!rt.call(e,`default`)?K(n,`default`,{value:e,enumerable:!0}):n,e)),ot=[`machine`,`harness`,`state`,`team`,`role`,`project`,`workspace`,`tag`,`meta`],Y={machine:`Machine`,harness:`Harness`,state:`State`,team:`Team`,role:`Role`,project:`Project`,workspace:`Workspace`,tag:`Tag`,meta:`Metadata`},st=`watchtower.filtersOpen`,ct=`watchtower.legendOpen`;function lt(e,t={}){let n=[];for(let r of ot){let i=e[r];if(!i)continue;let a=r===`state`?L[e.state]:r===`machine`||r===`harness`||r===`team`?t[r]?.(i)??i:i;n.push({key:r,label:Y[r],value:a,clear:{[r]:void 0}})}if(e.q&&n.push({key:`q`,label:`Search`,value:e.q,clear:{q:void 0}}),e.kinds){let t=oe(e).kinds.size;n.push({key:`kinds`,label:`Lines`,value:t===xe.length?`all kinds`:`${t} of ${xe.length} kinds`,clear:{kinds:void 0}})}return e.tree===!1&&n.push({key:`tree`,label:`Session tree`,value:`off`,clear:{tree:void 0}}),n}var ut=e=>lt(e).filter(e=>e.key!==`q`).length,dt=(e,t)=>ot.filter(n=>!!e[n]||t.includes(n)),ft=(e,t)=>{let n=new Set(dt(e,t));return ot.filter(e=>!n.has(e))},pt=(e,t)=>e===`1`||e!==`0`&&t;function mt(e,t,n){if(!(n<=0))switch(t){case`ArrowRight`:case`ArrowDown`:return(e+1)%n;case`ArrowLeft`:case`ArrowUp`:return(e-1+n)%n;case`Home`:return 0;case`End`:return n-1;default:return}}var ht=2500;function gt(e){return e.panelOpen||e.focusInside||e.hover?!1:e.now-e.lastActivity>=ht}var _t=(e,t)=>e>Math.min(120,t/4),vt=M(`<div class=wt-backdrop aria-hidden=true>`),yt=M(`<section role=dialog tabindex=-1><header class=wt-panel-head><h2></h2></header><div class=wt-panel-body>`),bt=M(`<div class=wt-handle aria-hidden=true>`);function xt(e){let n,r=t=>{e.onClose(),t&&e.opener&&queueMicrotask(()=>document.getElementById(e.opener)?.focus())};return v(()=>{e.autoFocus&&n.focus({preventScroll:!0})}),[t(i,{get when(){return e.phone},get children(){var e=vt();return e.$$click=()=>r(!1),e}}),(()=>{var i=yt(),a=i.firstChild,o=a.firstChild,s=a.nextSibling;i.$$keydown=e=>{e.key!==`Escape`||e.defaultPrevented||(e.preventDefault(),r(!0))};var c=n;return typeof c==`function`?b(c,i):n=i,S(i,t(St,{onClose:()=>r(!1)}),a),S(o,()=>e.title),S(a,()=>e.actions,null),S(a,t(E,{icon:`close`,get label(){return`Close ${e.title.toLowerCase()}`},onClick:()=>r(!0)}),null),S(s,()=>e.children),f(t=>{var n=e.id,r=`wt-panel wt-sheetable ${e.class??``}`,a=!!e.phone,s=e.phone?`true`:`false`,c=`${e.id}-title`,l=`${e.id}-title`;return n!==t.e&&T(i,`id`,t.e=n),r!==t.t&&j(i,t.t=r),a!==t.a&&i.classList.toggle(`wt-sheet`,t.a=a),s!==t.o&&T(i,`aria-modal`,t.o=s),c!==t.i&&T(i,`aria-labelledby`,t.i=c),l!==t.n&&T(o,`id`,t.n=l),t},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0}),i})()]}function St(e){let t=0,n=0,r=null,i=t=>{if(!r)return;let i=r.offsetHeight;r.style.transform=``,r.style.transition=``,r=null,t&&_t(n,i)&&e.onClose()};return(()=>{var e=bt();return e.addEventListener(`pointercancel`,()=>i(!1)),e.$$pointerup=()=>i(!0),e.$$pointermove=e=>{r&&(n=Math.max(0,e.clientY-t),r.style.transform=`translateY(${n}px)`)},e.$$pointerdown=e=>{r=e.currentTarget.closest(`.wt-sheetable`),r&&(t=e.clientY,n=0,r.style.transition=`none`,e.currentTarget.setPointerCapture?.(e.pointerId))},e})()}x([`click`,`keydown`,`pointerdown`,`pointermove`,`pointerup`]);var Ct=M(`<div class=te-row><button type=button class="btn small">Edit team</button><a class="btn small">Open team page`),wt=M(`<p role=alert class=wt-error>Could not load the timeline: <!> <button type=button class=btn>Retry`),Tt=M(`<p class=muted>Loading…`),Et=M(`<p class=muted>No messages in this window.`),Dt=M(`<button type=button class=btn>Load older`),Ot=M(`<aside class="wt-slider wt-sheetable"aria-label=Details><header class=wt-slider-head><h2></h2></header><div class=wt-slider-body><section class=wt-section><h3>Timeline</h3><ol class=wt-timeline>`),kt=M(`<p class=muted>This is no longer in the chosen window.`),At=M(`<span class=muted>Loading…`),jt=M(`<span class=wt-error>`),Mt=M(`<div class=wt-text>`),Nt=M(`<div class="wt-text wt-answer"><span class=muted>Answer: `),Pt=M(`<li><div class=wt-tl-row><span class=wt-tl-kind></span><span> → </span><span class=muted> · `),Ft=M(`<button type=button class="btn wt-show-text">Show text`),It=M(`<dl class=wt-facts>`),Lt=M(`<dt>`),Rt=M(`<dd>`),zt=M(`<section class=wt-section><h3>Members</h3><ul class=wt-peers>`),Bt=M(`<p class=wt-actions><a class="btn primary"href=/concierge>`),Vt=M(`<span class="btn wt-drag"draggable=true title="Drag onto a pane: an edge splits, the centre replaces"aria-hidden=true> Drag into a pane`),Ht=M(`<p class=wt-actions><a class="btn primary">Open session</a> <button type=button class=btn>Open in pane beside</button> <button type=button class=btn>Start side chat…`),Ut=M(`<section class=wt-section><h3>Supervised by</h3><button type=button class=wt-link>`),Wt=M(`<section class=wt-section><h3>Parent</h3><button type=button class=wt-link>`),Gt=M(`<section class=wt-section><h3>Subsessions</h3><ul class=wt-peers>`),Kt=M(`<section class=wt-section><h3>Talks with</h3><ul class=wt-peers>`),qt=M(`<li><button type=button class=wt-link></button><span class=muted> · `),Jt=M(`<li><button type=button class=wt-link>`),Yt=M(`<p class=wt-endpoints><button type=button class=wt-link></button><span aria-hidden=true> → </span><span class=sr-only> to </span><button type=button class=wt-link>`),Xt={msg:`Message`,ask:`Ask`,reply:`Reply`,decline:`Decline`};function Zt(e){let n,a=t=>e.snap.nodes.find(e=>e.id===t)?.label??t,[s,u]=c([]),[p,m]=c(),[_,y]=c(`loading`),[x,w]=c(``),[D,k]=c({}),j=0,M=async t=>{let n=++j,r=e.selection;y(`loading`);try{let i=await Ae(r,e.window,Date.now(),t?p():void 0);if(n!==j)return;u(t?[...s(),...i.messages]:i.messages),m(i.cursor),y(`ready`)}catch(e){if(n!==j)return;w(se(e).message),y(`error`)}};l(o(()=>`${e.selection.type}:${e.selection.id}:${e.window}`,()=>{u([]),m(void 0),k({}),M(!1)}));let ee=async e=>{k({...D(),[e]:`loading`});try{let t=await W(e);k({...D(),[e]:t})}catch(t){k({...D(),[e]:{error:se(t).message}})}};v(()=>{let t=t=>{t.key===`Escape`&&!t.defaultPrevented&&!C()&&e.onClose()};document.addEventListener(`keydown`,t),g(()=>document.removeEventListener(`keydown`,t))});let te=()=>e.edge?e.edge.label:e.node?.title??e.selection.id;return(()=>{var o=Ot(),c=o.firstChild,l=c.firstChild,u=c.nextSibling,m=u.firstChild,g=m.firstChild.nextSibling,v=n;return typeof v==`function`?b(v,o):n=o,S(o,t(St,{onClose:()=>e.onClose()}),c),S(l,te),S(c,t(E,{icon:`close`,label:`Close details`,onClick:()=>e.onClose()}),null),S(u,t(d,{get fallback(){return kt()},get children(){return[t(h,{get when(){return e.edge},children:n=>t(rn,{get edge(){return n()},get onSelect(){return e.onSelect}})}),t(h,{get when(){return e.node},children:n=>t(nn,{get node(){return n()},label:a,get onSelect(){return e.onSelect}})})]}}),m),S(u,t(i,{get when(){return O(()=>e.node?.kind===`team`)()&&e.onEditTeam},get children(){var t=Ct(),n=t.firstChild,r=n.nextSibling;return n.$$click=()=>e.onEditTeam(e.node.id),f(()=>T(r,`href`,`/teams/${encodeURIComponent(e.node.id)}`)),t}}),m),S(m,t(i,{get when(){return _()===`error`},get children(){var e=wt(),t=e.firstChild.nextSibling,n=t.nextSibling.nextSibling;return S(e,x,t),n.$$click=()=>void M(!1),e}}),g),S(g,t(r,{get each(){return s()},children:e=>{let n=()=>D()[e.id];return(()=>{var r=Pt(),o=r.firstChild.firstChild,s=o.nextSibling,c=s.firstChild,l=s.nextSibling,u=l.firstChild;return S(o,()=>Xt[e.kind]??e.kind),S(s,()=>a(e.from),c),S(s,()=>a(e.to),null),S(l,()=>e.state,u),S(l,(()=>{var t=O(()=>!!e.delivery);return()=>t()?` · ${$e(e.delivery)}`:``})(),u),S(l,()=>e.decisionID?` · Decision`:``,u),S(l,()=>A(e.at),null),S(r,t(d,{get fallback(){return(()=>{var t=Ft();return t.$$click=()=>void ee(e.id),t})()},get children(){return[t(h,{get when(){return n()===`loading`},get children(){return At()}}),t(h,{get when(){return O(()=>typeof n()==`object`&&n()!==null)()&&`error`in n()},get children(){var e=jt();return S(e,()=>n().error),e}}),t(h,{get when(){return O(()=>typeof n()==`object`&&n()!==null)()&&`text`in n()},get children(){return[(()=>{var e=Mt();return S(e,()=>n().text),e})(),t(i,{get when(){return n().answer},get children(){var e=Nt();return e.firstChild,S(e,()=>n().answer,null),e}})]}})]}}),null),r})()}})),S(m,t(i,{get when(){return _()===`loading`},get children(){return Tt()}}),null),S(m,t(i,{get when(){return O(()=>_()===`ready`)()&&!s().length},get children(){return Et()}}),null),S(m,t(i,{get when(){return O(()=>_()===`ready`)()&&p()},get children(){var e=Dt();return e.$$click=()=>void M(!0),e}}),null),o})()}function Qt(e){return(()=>{var n=It();return S(n,t(r,{get each(){return e.rows.filter(e=>e[1]!==void 0&&e[1]!==``)},children:([e,t])=>[(()=>{var t=Lt();return S(t,e),t})(),(()=>{var e=Rt();return S(e,t),e})()]})),n})()}var $t=e=>Ce(e),en=e=>e&&Object.keys(e).length?Object.entries(e).map(([e,t])=>`${e}=${t}`).join(`, `):void 0,tn=e=>e?Object.entries(e).map(([e,t])=>`${e} ${t}`).join(`, `):void 0;function nn(e){let n=()=>e.node,a={current:`Concierge (hub-managed session)`,previous:`Previous Concierge session (ended)`,service:`The hub's Concierge service (its updates, digests and launches)`},o=()=>n().conciergeRole?a[n().conciergeRole]:n().concierge?a.current:{hub:`Hub`,user:`You`,app:`App`,machine:`Machine`,session:`Session`,team:`Team`}[n().kind];return[t(Qt,{get rows(){return[[`Kind`,o()],[`State`,n().ring?L[n().ring]:void 0],[`Machine`,n().machine],[`Harness`,n().harness],[`Project`,n().project],[`Mode`,n().team?.mode===`restricted`?`Restricted: only its team paths`:n().team?.mode===`open`?`Open: everyone may message everyone`:void 0],[`Entry role`,n().team?.entryRole],[`Paused`,n().team?.paused?`yes`:void 0],[n().kind===`team`?`Roles`:`Directory roles`,n().roles.join(`, `)||void 0],[`Teams`,n().seats.map(e=>`${e.team} (${e.role})`).join(`, `)||void 0],[`Tags`,(n().team?.tags??n().tags).join(`, `)||void 0],[`Launch labels`,en(n().labels)],[`Metadata`,en(n().team?.metadata)],[`Workspaces`,n().workspaceIDs.join(`, `)||void 0],[`Launch`,n().launchID],[`Last seen`,n().lastSeen?A(n().lastSeen):void 0],...n().kind===`hub`||n().kind===`machine`?[[`Messages through it`,n().routed]]:[[`Sent`,n().sent],[`Received`,n().received]],[`By kind`,Object.entries(n().byKind).map(([e,t])=>`${$t(e)} ${t}`).join(`, `)||void 0],[`Sessions`,n().states?Object.entries(n().states).map(([e,t])=>`${L[e]} ${t}`).join(`, `):void 0],[`Machines online`,n().machinesOnline?`${n().machinesOnline.online} of ${n().machinesOnline.total}`:void 0]]}}),t(i,{get when(){return n().team?.members.length},get children(){var i=zt(),a=i.firstChild.nextSibling;return S(a,t(r,{get each(){return[...n().team.members]},children:t=>(()=>{var n=qt(),r=n.firstChild,i=r.nextSibling;return i.firstChild,r.$$click=()=>e.onSelect({type:`node`,id:t.id}),S(r,()=>t.label),S(i,()=>t.role,null),n})()})),i}}),t(i,{get when(){return O(()=>!!n().openable)()&&n().concierge},get children(){var e=Bt(),t=e.firstChild;return S(t,()=>n().conciergeRole===`previous`?`Open the current Concierge`:`Open the Concierge`),e}}),t(i,{get when(){return O(()=>!!n().openable)()&&!n().concierge},get children(){var e=Ht(),r=e.firstChild,a=r.nextSibling.nextSibling,o=a.nextSibling.nextSibling;return a.$$click=()=>te(n().id),S(e,t(i,{get when(){return!F()},get children(){return[(()=>{var e=Vt(),r=e.firstChild;return D(e,`dragend`,P),e.addEventListener(`dragstart`,e=>ne(e,{target:{sessionID:n().id},label:n().title})),S(e,t(k,{name:`grip`}),r),e})(),` `]}}),o),o.$$click=()=>re(n().id,n().workspaceIDs[0]?{workspaceID:n().workspaceIDs[0]}:{}),f(()=>T(r,`href`,m(n().id))),e}}),t(i,{get when(){return n().supervisorID},get children(){var t=Ut(),r=t.firstChild.nextSibling;return r.$$click=()=>e.onSelect({type:`node`,id:n().supervisorID}),S(r,()=>n().supervisorLabel??n().supervisorID),t}}),t(i,{get when(){return n().parentID},get children(){var t=Wt(),r=t.firstChild.nextSibling;return r.$$click=()=>e.onSelect({type:`node`,id:n().parentID}),S(r,()=>e.label(n().parentID)),t}}),t(i,{get when(){return n().children.length},get children(){var i=Gt(),a=i.firstChild.nextSibling;return S(a,t(r,{get each(){return[...n().children]},children:t=>(()=>{var n=Jt(),r=n.firstChild;return r.$$click=()=>e.onSelect({type:`node`,id:t}),S(r,()=>e.label(t)),n})()})),i}}),t(i,{get when(){return n().peers.length},get children(){var i=Kt(),a=i.firstChild.nextSibling;return S(a,t(r,{get each(){return[...n().peers]},children:t=>(()=>{var n=qt(),r=n.firstChild,i=r.nextSibling;return i.firstChild,r.$$click=()=>e.onSelect({type:`node`,id:t.id}),S(r,()=>t.label),S(i,()=>t.count,null),n})()})),i}})]}function rn(e){let n=()=>e.edge;return[(()=>{var t=Yt(),r=t.firstChild,i=r.nextSibling.nextSibling.nextSibling;return r.$$click=()=>e.onSelect({type:`node`,id:n().from}),S(r,()=>n().fromLabel),i.$$click=()=>e.onSelect({type:`node`,id:n().to}),S(i,()=>n().toLabel),t})(),t(Qt,{get rows(){return[[`Messages`,n().kind===`policy`?void 0:n().count],[`First`,n().firstAt?A(n().firstAt):void 0],[`Last`,n().lastAt?A(n().lastAt):void 0],[`States`,tn(n().states)],[`Delivery`,ye(n().delivery)],[`Declined`,n().declined],[`Refused by team policy`,n().denied],[`To a role address`,n().roleAddressed],[`Team`,n().teamLabel??n().teamID],[`Permitted kinds`,n().kinds?.join(`, `)],[`Permitted path`,n().permitted===void 0?void 0:n().permitted?`yes`:`no (refused attempts only)`]]}})]}x([`click`]);var an=M(`<svg viewBox="0 0 24 24"width=16 height=16 fill=none stroke=currentColor stroke-width=1.8 stroke-linecap=round stroke-linejoin=round aria-hidden=true>`),on=M(`<svg><path></svg>`,!1,!0,!1),sn=M(`<button type=button class=wt-dock-item><span class=wt-dock-text>`),cn=M(`<span class="wt-dock-matches muted"role=status> `),ln=M(`<span class=wt-dock-search><input type=search aria-label="Search nodes"placeholder="Search @name, role, machine…"><button type=button class=wt-dock-close aria-label="Close search"title="Close search">`),un=M(`<div class=wt-dock-wrap><div class=wt-dock role=toolbar aria-label="Watchtower controls"aria-orientation=horizontal><div class=wt-dock-seg role=group aria-label=View></div><span class=wt-dock-sep aria-hidden=true></span><span class=wt-dock-more>`),dn=M(`<button type=button class="wt-dock-item wt-dock-view">`),fn=M(`<span class=wt-badge aria-hidden=true>`),pn=M(`<button type=button class=wt-dock-item aria-label=Search title="Search nodes"aria-expanded=false>`),mn={filters:[`M4 6h16`,`M7 12h10`,`M10 18h4`],legend:[`M12 3a9 9 0 1 0 0 18a9 9 0 0 0 0-18z`,`M12 11v6`,`M12 7.5h.01`],teams:[`M9 11a3 3 0 1 0 0-6a3 3 0 0 0 0 6z`,`M3 20a6 6 0 0 1 12 0`,`M16 5.5a3 3 0 0 1 0 5.5`,`M21 20a6 6 0 0 0-4-5.6`],hub:[`M12 9a3 3 0 1 0 0 6a3 3 0 0 0 0-6z`,`M12 3v6`,`M12 15v6`,`M3 12h6`,`M15 12h6`],reset:[`M4 9V4h5`,`M20 9V4h-5`,`M4 15v5h5`,`M20 15v5h-5`],pause:[`M8 5v14`,`M16 5v14`],play:[`M7 5l12 7-12 7z`],search:[`M11 4a7 7 0 1 0 0 14a7 7 0 0 0 0-14z`,`M20 20l-4-4`],close:[`M6 6l12 12`,`M18 6L6 18`],more:[`M5 12h.01`,`M12 12h.01`,`M19 12h.01`]};function hn(e){return(()=>{var n=an();return S(n,t(r,{get each(){return[...mn[e.name]]},children:e=>(()=>{var t=on();return T(t,`d`,e),t})()})),f(()=>T(n,`class`,`wt-glyph wt-glyph-${e.name}`)),n})()}function gn(e){let n,a,[o,s]=c(!!e.search),[l,u]=c(!1),[d,p]=c(Date.now()),[m,h]=c(Date.now()),[_,x]=c(!1),[C,w]=c(!1),E=()=>gt({now:m(),lastActivity:d(),panelOpen:e.panelOpen,focusInside:C(),hover:_()}),D,O=()=>{let e=Date.now();e-d()<150&&!E()||(p(e),h(e),clearTimeout(D),D=setTimeout(()=>h(Date.now()),ht+50))},k=!1;v(()=>{let e=[`pointermove`,`pointerdown`,`touchstart`,`keydown`,`wheel`];for(let t of e)window.addEventListener(t,O,{passive:!0});let t=e=>{k&&(k=!1,e.preventDefault(),e.stopPropagation())};n.addEventListener(`click`,t,!0),O(),j();let r=n.parentElement,i=r?new ResizeObserver(()=>u(r.clientWidth<=540)):void 0;r&&i.observe(r),g(()=>i?.disconnect()),g(()=>{n.removeEventListener(`click`,t,!0);for(let t of e)window.removeEventListener(t,O);clearTimeout(D)})});let A=()=>[...n.querySelectorAll(`.wt-dock-item`)].filter(e=>e.offsetParent!==null&&!e.disabled),j=e=>{let t=A(),r=e&&t.includes(e)?e:t.find(e=>e.tabIndex===0)??t[0];for(let e of n.querySelectorAll(`.wt-dock-item`))e.tabIndex=e===r?0:-1},M=e=>{let t=e.target;if(t.tagName===`INPUT`||!t.classList.contains(`wt-dock-item`))return;let n=A(),r=mt(n.indexOf(t),e.key,n.length);r!==void 0&&(e.preventDefault(),n[r].focus())},ee=!1,te=()=>{ee=!0,s(!0)},N=()=>{s(!1),queueMicrotask(()=>a?.focus())},P=e=>(()=>{var n=sn(),r=n.firstChild;return n.$$click=()=>e.onClick(),S(n,t(i,{get when(){return e.glyph},children:e=>t(hn,{get name(){return e()}})}),r),S(r,()=>e.text),S(n,()=>e.badge,null),f(t=>{var r=e.id,i=!!e.wide,a=e.label,o=e.title??e.label,s=e.pressed,c=e.expanded,l=e.expanded?e.controls:void 0,u=e.disabled;return r!==t.e&&T(n,`id`,t.e=r),i!==t.t&&n.classList.toggle(`wt-dock-wide`,t.t=i),a!==t.a&&T(n,`aria-label`,t.a=a),o!==t.o&&T(n,`title`,t.o=o),s!==t.i&&T(n,`aria-pressed`,t.i=s),c!==t.n&&T(n,`aria-expanded`,t.n=c),l!==t.s&&T(n,`aria-controls`,t.s=l),u!==t.h&&(n.disabled=t.h=u),t},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0}),n})();return(()=>{var s=un(),c=s.firstChild,u=c.firstChild,d=u.nextSibling.nextSibling;c.$$focusout=e=>{n.contains(e.relatedTarget)||w(!1)},c.$$focusin=e=>{w(!0),e.target.classList.contains(`wt-dock-item`)&&j(e.target)},c.$$pointerdown=e=>{k=E()&&e.pointerType===`touch`},c.addEventListener(`pointerleave`,()=>x(!1)),c.addEventListener(`pointerenter`,()=>x(!0)),c.$$keydown=M;var p=n;return typeof p==`function`?b(p,c):n=c,S(u,t(r,{each:[[`3d`,`3D`],[`2d`,`2D`],[`list`,`List`]],children:([t,n])=>(()=>{var r=dn();return r.$$click=()=>e.setView(t),S(r,n),f(()=>T(r,`aria-pressed`,e.view===t)),r})()})),S(c,()=>P({id:`wt-dock-filters`,label:e.filterCount?`Filters (${e.filterCount} active)`:`Filters`,text:`Filters`,glyph:`filters`,expanded:e.filtersOpen,controls:`wt-filters`,onClick:e.onFilters,badge:t(i,{get when(){return e.filterCount},get children(){var t=fn();return S(t,()=>e.filterCount),t}})}),d),S(c,()=>P({id:`wt-dock-legend`,label:`Legend`,text:`Legend`,glyph:`legend`,expanded:e.legendOpen,controls:`wt-legend`,onClick:e.onLegend}),d),S(c,()=>P({id:`wt-dock-teams`,label:`Teams`,text:`Teams`,glyph:`teams`,pressed:e.teamsOpen,onClick:e.onTeams}),d),S(c,()=>P({label:`Hub details`,text:`Hub`,glyph:`hub`,wide:!0,onClick:e.onHub}),d),S(c,()=>P({label:`Reset view`,text:`Reset`,glyph:`reset`,wide:!0,disabled:!e.drawn,onClick:e.onReset}),d),S(c,()=>P({label:e.paused?`Resume motion`:`Pause motion`,text:e.paused?`Resume`:`Pause`,glyph:e.paused?`play`:`pause`,wide:!0,pressed:e.paused,disabled:e.reduced,...e.reduced?{title:`Motion is off: your system asks for reduced motion`}:{},onClick:e.onPause}),d),S(d,t(y,{label:`More controls`,class:`wt-dock-item`,up:!0,align:`right`,items:()=>[...l()?[{label:`Hub details`,run:e.onHub},{label:`Reset view`,run:e.onReset,disabled:!e.drawn},{label:e.paused?`Resume motion`:`Pause motion`,run:e.onPause,disabled:e.reduced}]:[],{label:`Re-layout`,run:()=>e.onRelayout?.(),disabled:!e.canRelayout}],get text(){return t(hn,{name:`more`})}})),S(c,t(i,{get when(){return o()},get fallback(){return(()=>{var e=pn();e.$$click=te;var n=a;return typeof n==`function`?b(n,e):a=e,S(e,t(hn,{name:`search`})),e})()},get children(){var n=ln(),r=n.firstChild,a=r.nextSibling;return S(n,t(hn,{name:`search`}),r),r.$$keydown=t=>{t.key===`Enter`?(t.preventDefault(),e.onSearchEnter()):t.key===`Escape`&&(t.preventDefault(),N())},r.$$input=t=>e.onSearch(t.currentTarget.value),b(e=>{ee&&(ee=!1,queueMicrotask(()=>e.focus()))},r),S(n,t(i,{get when(){return e.search.trim()},get children(){var t=cn(),n=t.firstChild;return S(t,()=>e.matches??0,n),S(t,()=>e.matches===1?`match`:`matches`,null),t}}),a),a.$$click=N,S(a,t(hn,{name:`close`})),f(()=>r.value=e.search),n}}),null),f(e=>{var t=E()?`true`:`false`,n=o()?`open`:void 0;return t!==e.e&&T(c,`data-faded`,e.e=t),n!==e.t&&T(c,`data-search`,e.t=n),e},{e:void 0,t:void 0}),s})()}x([`click`,`keydown`,`pointerdown`,`focusin`,`focusout`,`input`]);var _n=M(`<label class=wt-field><span></span><input type=text class=wt-meta aria-label=Metadata aria-describedby=wt-meta-help placeholder="key=value"list=wt-meta-keys><datalist id=wt-meta-keys></datalist><span id=wt-meta-help class=sr-only>Launch labels and team metadata: key=value or key, several separated by spaces (all must match).`),vn=M(`<option>`),yn=M(`<fieldset class=wt-fs><legend>View</legend><div class=wt-fs-row><label class=wt-field><span>Time window</span><select aria-label="Time window"></select></label><label class=wt-field><span>Group by</span><select aria-label="Group by"></select></label><label class=wt-check><input type=checkbox><span>Session tree`),bn=M(`<div class=wt-scope>`),xn=M(`<select class=wt-add aria-label="Add filter"><option value selected>+ Add filter`),Sn=M(`<fieldset class=wt-fs><legend>Scope`),Cn=M(`<fieldset class=wt-fs><legend>Show</legend><div class=wt-kinds>`),wn=M(`<form class=wt-preset-form><input type=text aria-label="Preset name"placeholder="Preset name"maxlength=60><button type=submit class="btn small">Save</button><button type=button class="btn small">Cancel`),Tn=M(`<button type=button class="btn small">Delete preset`),En=M(`<footer class=wt-panel-foot role=group aria-label=Presets><select aria-label="Filter presets"><option value></option></select><span class=wt-foot-gap></span><button type=button class="btn small">Clear filters</button><button type=button class="btn small">Copy link</button><span class="muted wt-copied"role=status>`),Dn=M(`<p class="muted wt-fs-empty">Everything is shown. Add a filter to narrow it.`),On=M(`<div class=wt-scope-row><button type=button class=wt-x>×`),kn=M(`<label class=wt-toggle><input type=checkbox><span>`),An=M(`<button type=button class="btn small">Save preset`),jn=M(`<button type=button class=wt-chip-clear>Clear all`),Mn=M(`<div class=wt-chipbar><ul class=wt-chips aria-label="Active filters">`),Nn=M(`<li class=wt-chip><span><span class=wt-chip-label>:</span> </span><button type=button class=wt-x title=Remove>×`),Pn=M(`<label class=wt-field><span></span><select><option value>`),Fn={machine:void 0,harness:void 0,state:void 0,team:void 0,role:void 0,project:void 0,workspace:void 0,tag:void 0,meta:void 0,q:void 0,kinds:void 0,tree:void 0},In={get(e){try{return localStorage.getItem(e)}catch{return null}},set(e,t){try{localStorage.setItem(e,t)}catch{}}};function Ln(e){let[n,a]=c([]),o=()=>dt(e.url,n()),s=()=>ft(e.url,n()),l=()=>oe(e.url).kinds,u=(t,n)=>e.setURL({[t]:n.trim()?n:void 0}),d=e=>{a([...n(),e]),queueMicrotask(()=>document.getElementById(`wt-scope-${e}`)?.focus())},p=t=>{a(n().filter(e=>e!==t)),e.setURL({[t]:void 0})},m=(t,n)=>{let r=new Set(l());n?r.add(t):r.delete(t),e.setURL({kinds:xe.filter(e=>r.has(e))})},[h,g]=c(Me(In.get(ce))),[_,v]=c(``),[y,x]=c(!1),[C,w]=c(``),[E,D]=c(``),O=e=>{g(e),In.set(ce,JSON.stringify(e))},k=t=>{v(t);let n=h().find(e=>e.name===t);n&&e.go(le(e.url,n.search))},A=()=>{let t=C().trim();t&&(O(ke(h(),t,qe(e.url))),v(t),x(!1),w(``))},j=async()=>{try{await navigator.clipboard.writeText(location.href),D(`Link copied`)}catch{D(`Copy the address bar to share these filters`)}setTimeout(()=>D(``),3e3)},M=n=>{let i=Y[n],a=`wt-scope-${n}`;switch(n){case`machine`:return t(X,{id:a,label:i,all:`All machines`,get value(){return e.url.machine},get options(){return e.machines},onChange:e=>u(n,e)});case`harness`:return t(X,{id:a,label:i,all:`All harnesses`,get value(){return e.url.harness},get options(){return e.harnesses},onChange:e=>u(n,e)});case`state`:return t(X,{id:a,label:i,all:`Any state`,get value(){return e.url.state},get options(){return ge.map(e=>({value:e,label:L[e]}))},onChange:t=>e.setURL({state:t||void 0})});case`team`:return t(X,{id:a,label:i,all:`All teams`,get value(){return e.teamValue},get options(){return e.choices.teams.map(e=>({value:e.id,label:e.label}))},onChange:e=>u(n,e)});case`role`:return t(X,{id:a,label:i,all:`Any role`,get value(){return e.url.role},get options(){return e.choices.roles.map(e=>({value:e,label:e}))},onChange:e=>u(n,e)});case`project`:return t(X,{id:a,label:i,all:`All projects`,get value(){return e.url.project},get options(){return e.choices.projects.map(e=>({value:e,label:e}))},onChange:e=>u(n,e)});case`workspace`:return t(X,{id:a,label:i,all:`All workspaces`,get value(){return e.url.workspace},get options(){return e.choices.workspaces.map(e=>({value:e,label:e}))},onChange:e=>u(n,e)});case`tag`:return t(X,{id:a,label:i,all:`Any tag`,get value(){return e.url.tag},get options(){return e.choices.tags.map(e=>({value:e,label:e}))},onChange:e=>u(n,e)});case`meta`:return(()=>{var n=_n(),o=n.firstChild,s=o.nextSibling,c=s.nextSibling;return T(n,`for`,a),S(o,i),s.$$input=e=>u(`meta`,e.currentTarget.value),s.addEventListener(`change`,e=>u(`meta`,e.currentTarget.value)),T(s,`id`,a),S(c,t(r,{get each(){return[...e.choices.metaKeys]},children:e=>(()=>{var t=vn();return t.value=`${e}=`,t})()})),f(()=>s.value=e.url.meta??``),n})()}};return t(xt,{id:`wt-filters`,title:`Filters`,class:`wt-pop wt-pop-filters`,get phone(){return e.phone},get autoFocus(){return e.autoFocus},opener:`wt-dock-filters`,get onClose(){return e.onClose},get children(){return[(()=>{var n=yn(),i=n.firstChild.nextSibling.firstChild,a=i.firstChild.nextSibling,o=i.nextSibling,s=o.firstChild.nextSibling,c=o.nextSibling.firstChild;return a.addEventListener(`change`,t=>e.setURL({window:t.currentTarget.value})),S(a,t(r,{get each(){return Object.entries(_e)},children:([t,n])=>(()=>{var r=vn();return r.value=t,S(r,()=>n.label),f(()=>r.selected=e.url.window===t),r})()})),s.addEventListener(`change`,t=>e.setURL({groupBy:t.currentTarget.value})),S(s,t(r,{get each(){return Object.entries(U)},children:([t,n])=>(()=>{var r=vn();return r.value=t,S(r,n),f(()=>r.selected=e.url.groupBy===t),r})()})),c.addEventListener(`change`,t=>e.setURL({tree:t.currentTarget.checked?void 0:!1})),f(()=>c.checked=e.url.tree!==!1),n})(),(()=>{var e=Sn();return e.firstChild,S(e,t(i,{get when(){return o().length},get fallback(){return Dn()},get children(){var e=bn();return S(e,t(r,{get each(){return o()},children:e=>(()=>{var t=On(),n=t.firstChild;return S(t,()=>M(e),n),n.$$click=()=>p(e),f(t=>{var r=`Remove ${Y[e]} filter`,i=`Remove ${Y[e]} filter`;return r!==t.e&&T(n,`aria-label`,t.e=r),i!==t.t&&T(n,`title`,t.t=i),t},{e:void 0,t:void 0}),t})()})),e}}),null),S(e,t(i,{get when(){return s().length},get children(){var e=xn();return e.firstChild,e.addEventListener(`change`,e=>{let t=e.currentTarget.value;e.currentTarget.value=``,t&&d(t)}),S(e,t(r,{get each(){return s()},children:e=>(()=>{var t=vn();return t.value=e,S(t,()=>Y[e]),t})()}),null),e}}),null),e})(),(()=>{var e=Cn(),n=e.firstChild.nextSibling;return S(n,t(r,{get each(){return[...R()]},children:e=>(()=>{var t=kn(),n=t.firstChild,r=n.nextSibling;return n.addEventListener(`change`,t=>m(e.kind,t.currentTarget.checked)),S(r,()=>e.label),f(()=>T(t,`title`,e.description)),f(()=>n.checked=l().has(e.kind)),t})()})),e})(),(()=>{var n=En(),o=n.firstChild,s=o.firstChild,c=o.nextSibling,l=c.nextSibling,u=l.nextSibling,d=u.nextSibling;return o.addEventListener(`change`,e=>k(e.currentTarget.value)),S(s,()=>h().length?`Choose a preset…`:`No presets yet`),S(o,t(r,{get each(){return h()},children:e=>(()=>{var t=vn();return S(t,()=>e.name),f(()=>t.selected=_()===e.name),f(()=>t.value=e.name),t})()}),null),S(n,t(i,{get when(){return y()},get fallback(){return(()=>{var e=An();return e.$$click=()=>x(!0),e})()},get children(){var e=wn(),t=e.firstChild,n=t.nextSibling,r=n.nextSibling;return e.addEventListener(`submit`,e=>{e.preventDefault(),A()}),b(e=>queueMicrotask(()=>e.focus()),t),t.$$input=e=>w(e.currentTarget.value),r.$$click=()=>x(!1),f(()=>n.disabled=!C().trim()),f(()=>t.value=C()),e}}),c),S(n,t(i,{get when(){return _()},get children(){var e=Tn();return e.$$click=()=>{O(pe(h(),_())),v(``)},e}}),c),l.$$click=()=>{a([]),e.setURL(Fn)},u.$$click=()=>void j(),S(d,E),f(t=>{var n=_()===``,r=!lt(e.url).length;return n!==t.e&&(s.selected=t.e=n),r!==t.t&&(l.disabled=t.t=r),t},{e:void 0,t:void 0}),n})()]}})}function Rn(e){return t(i,{get when(){return e.chips.length},get children(){var n=Mn(),a=n.firstChild;return S(a,t(r,{get each(){return e.chips},children:t=>(()=>{var n=Nn(),r=n.firstChild,i=r.firstChild,a=i.firstChild;i.nextSibling;var o=r.nextSibling;return S(i,()=>t.label,a),S(r,()=>t.value,null),o.$$click=()=>e.onRemove(t),f(()=>T(o,`aria-label`,`Remove filter ${t.label}: ${t.value}`)),n})()})),S(n,t(i,{get when(){return e.chips.length>1},get children(){var t=jn();return t.$$click=()=>e.onClear(),t}}),null),n}})}function X(e){let n=()=>e.value&&!e.options.some(t=>t.value===e.value)?[...e.options,{value:e.value,label:e.value}]:e.options;return(()=>{var i=Pn(),a=i.firstChild,o=a.nextSibling,s=o.firstChild;return S(a,()=>e.label),o.addEventListener(`change`,t=>e.onChange(t.currentTarget.value)),S(s,()=>e.all),S(o,t(r,{get each(){return n()},children:t=>(()=>{var n=vn();return S(n,()=>t.label),f(()=>n.selected=e.value===t.value),f(()=>n.value=t.value),n})()}),null),f(t=>{var n=e.id,r=e.id,a=e.label,c=!e.value;return n!==t.e&&T(i,`for`,t.e=n),r!==t.t&&T(o,`id`,t.t=r),a!==t.a&&T(o,`aria-label`,t.a=a),c!==t.o&&(s.selected=t.o=c),t},{e:void 0,t:void 0,a:void 0,o:void 0}),i})()}x([`input`,`click`]);var zn=M(`<div class="wt-canvas wt-2d"><div class=wt-2d-host tabindex=0 role=application aria-roledescription="graph canvas"aria-label="Interaction graph (2D)"aria-describedby=wt-2d-help></div><p id=wt-2d-help class=sr-only>Arrow keys move between nodes, Enter opens the focused node, Home goes to the hub, Shift and arrow keys pan, plus and minus zoom, 0 fits everything. The list view shows the same as a table.</p><p class="sr-only wt-2d-live"role=status aria-live=polite>`);function Bn(e){let t,n,r=!1,i,[a,o]=c(``);return v(()=>{N(()=>import(`./renderer2d-CYag1CnR.js`).then(a=>{if(r)return;try{n=a.createRenderer2D(t,{onNode:t=>e.onNode(t),onLink:t=>e.onLink(t),onBackground:()=>e.onBackground(),announce:o})}catch(t){e.onFail(t);return}n.resize(t.clientWidth,t.clientHeight),i=e.onRenderer?.(n,t),l(()=>n?.update(e.view,e.palette,{motion:e.motion,...e.selected===void 0?{}:{selected:e.selected},...e.look?{look:e.look}:{}})),l(()=>{let t=e.focus;t&&n?.focus(t.id,e.motion)});let s=!0;l(()=>{e.resetSeq,s?s=!1:n?.reset(e.motion)})}),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])).catch(t=>!r&&e.onFail(t));let a=new ResizeObserver(()=>n?.resize(t.clientWidth,t.clientHeight));a.observe(t),g(()=>{r=!0,a.disconnect(),i?.(),n?.destroy(),n=void 0})}),(()=>{var e=zn(),n=e.firstChild,r=n.nextSibling.nextSibling,i=t;return typeof i==`function`?b(i,n):t=n,S(r,a),e})()}var Vn=M(`<div class=wt-canvas>`);function Hn(){try{let e=document.createElement(`canvas`);return!!(e.getContext(`webgl2`)??e.getContext(`webgl`))}catch{return!1}}function Un(e){let t,n,r=!1,i;return v(()=>{N(()=>import(`./renderer3d-BRB6rgDJ.js`).then(a=>{if(r)return;try{n=a.createRenderer(t,{onNode:t=>e.onNode(t),onLink:t=>e.onLink(t),onBackground:()=>e.onBackground()},{motion:e.motion,...e.options?{options:e.options}:{}})}catch(t){e.onFail(t);return}n.resize(t.clientWidth,t.clientHeight),i=e.onRenderer?.(n)??void 0,l(()=>e.options&&n?.setOptions(e.options)),l(()=>n?.setSelected(e.selected));let o=!1;l(()=>{n?.update(e.view,e.palette,e.motion),o||(o=!0,setTimeout(()=>n?.reset(!1),250))}),l(()=>{let t=e.focus;t&&n?.focus(t.id,e.motion)});let s=!0;l(()=>{e.resetSeq,s?s=!1:n?.reset(e.motion)})}),__vite__mapDeps([11,1,2,3,4,5,6,7,8,9,10,12])).catch(t=>!r&&e.onFail(t));let a=new ResizeObserver(()=>n?.resize(t.clientWidth,t.clientHeight));a.observe(t);let o=()=>document.visibilityState===`hidden`?n?.pause():n?.resume();document.addEventListener(`visibilitychange`,o),g(()=>{r=!0,i?.(),a.disconnect(),document.removeEventListener(`visibilitychange`,o),n?.destroy(),n=void 0})}),(()=>{var e=Vn(),n=t;return typeof n==`function`?b(n,e):t=e,e})()}var Wn={sphere:`circle`,cube:`square`,octahedron:`diamond`,tetrahedron:`triangle`,dodecahedron:`pentagon`};function Gn(e){switch(e.kind){case`hub`:return`hub`;case`machine`:return`hexagon`;case`user`:return`ring`;case`app`:return`hollow-triangle`;case`team`:case`cluster`:return`hollow-square`;case`role`:return e.vacant?`dashed-ring`:`pill`;case`aggregate`:return`dashed-ring`;default:return Wn[e.shape??`dodecahedron`]??`pentagon`}}var Kn=e=>e===`hexagon`||e===`ring`||e===`hollow-triangle`||e===`hollow-square`||e===`dashed-ring`||e===`pill`;function qn(e,t,n,r,i,a=-Math.PI/2){e.beginPath();for(let o=0;o<i;o++){let s=a+o*2*Math.PI/i;o===0?e.moveTo(t+r*Math.cos(s),n+r*Math.sin(s)):e.lineTo(t+r*Math.cos(s),n+r*Math.sin(s))}e.closePath()}function Jn(e,t,n,r,i){switch(t){case`square`:case`hollow-square`:e.beginPath(),e.roundRect(n-i*.82,r-i*.82,i*1.64,i*1.64,i*.28);return;case`diamond`:qn(e,n,r,i*1.08,4);return;case`triangle`:case`hollow-triangle`:qn(e,n,r+i*.15,i*1.12,3);return;case`pentagon`:qn(e,n,r,i,5);return;case`hexagon`:qn(e,n,r,i,6,0);return;case`pill`:e.beginPath(),e.roundRect(n-i*1.4,r-i*.6,i*2.8,i*1.2,i*.6);return;default:e.beginPath(),e.arc(n,r,i,0,Math.PI*2)}}function Yn(e,t,n,r,i,a,o=`#ffffff`){if(e.save(),Jn(e,t,n,r,i),Kn(t))e.lineWidth=Math.max(1.2,i*.24),e.strokeStyle=a,t===`dashed-ring`&&e.setLineDash([i*.5,i*.35]),e.stroke(),e.setLineDash([]),e.beginPath(),e.arc(n,r,i*.24,0,Math.PI*2),e.fillStyle=a,e.fill();else{let s=e.createRadialGradient(n-i*.25,r-i*.3,i*.05,n,r,i*1.1);s.addColorStop(0,o),s.addColorStop(t===`hub`?.45:.3,a),s.addColorStop(1,a),e.fillStyle=s,e.fill()}e.restore()}function Xn(e,t,n,r,i,a){if(a<=0||r<=0)return;e.save(),e.globalAlpha=Math.min(1,a);let o=e.createRadialGradient(t,n,0,t,n,r);o.addColorStop(0,Zn(i,.9)),o.addColorStop(.3,Zn(i,.32)),o.addColorStop(1,Zn(i,0)),e.fillStyle=o,e.beginPath(),e.arc(t,n,r,0,Math.PI*2),e.fill(),e.restore()}function Zn(e,t){let n=/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(e.trim());if(!n)return e;let r=n[1].length===3?[...n[1]].map(e=>e+e).join(``):n[1],[i,a,o]=[0,2,4].map(e=>parseInt(r.slice(e,e+2),16));return`rgba(${i}, ${a}, ${o}, ${Math.max(0,Math.min(1,t))})`}function Qn(e){let t=/^#([0-9a-f]{6})$/i.exec(e.trim());if(!t)return!1;let[n,r,i]=[0,2,4].map(e=>parseInt(t[1].slice(e,e+2),16)/255);return .2126*n+.7152*r+.0722*i<.4}var $n=M(`<canvas class=wt-glyph-swatch aria-hidden=true>`),er=M(`<details class=wt-legend-sec open><summary>Teams</summary><ul><li><span class="wt-hull wt-hull-open"aria-hidden=true></span><span>Open team <span class=muted>· solid hull: everyone may message everyone, so no lines are drawn</span></span></li><li><span class="wt-hull wt-hull-restricted"aria-hidden=true></span><span>Restricted team <span class=muted>· dashed hull: only its team paths</span></span></li><li><span class="wt-role wt-role-entry"aria-hidden=true>★</span><span>Entry role <span class=muted>· ★, bold and tinted: receives the team's work</span></span></li><li><span class=wt-role aria-hidden=true></span><span>Role <span class=muted>· a row of its members, each tied to it by a violet tether</span></span></li><li><span class="wt-role wt-role-vacant"aria-hidden=true></span><span>Vacant role <span class=muted>· hollow and dashed, labelled “vacant”: nobody holds it</span></span></li><li><span class="wt-line wt-line-solid wt-line-tether"aria-hidden=true></span><span>Staffed <span class=muted>· a tether from a role to each session that holds it</span></span></li><li><span class=wt-multi aria-hidden=true>×2</span><span>In several teams <span class=muted>· dotted outer ring and ×N, drawn once; a dashed bridge reaches each other seat`),tr=M(`<div class=wt-legend-body><details class=wt-legend-sec open><summary>Machines (color)</summary><ul></ul></details><details class=wt-legend-sec open><summary>Harness (glyph)</summary><ul></ul></details><details class=wt-legend-sec open><summary>Markers</summary><ul><li><span class=wt-region aria-hidden=true></span><span>Region <span class=muted>· a soft tinted area per group of the current Group by (a machine keeps its colour)</span></span></li></ul></details><details class=wt-legend-sec open><summary>State (ring)</summary><ul></ul></details><details class=wt-legend-sec open><summary>Interactions (line)</summary><ul><li><span class="wt-line wt-line-solid wt-line-structure"aria-hidden=true></span><span>Structure <span class=muted>· thin grey: hub → group → session → subsession</span></span></li></ul><p class="muted wt-legend-note">Fibers brighten towards the receiver; brighter fibers carry more messages. Pulses travel along a fiber after a message, fade with its age, and stop once nothing on it is working or waiting.`),nr=M(`<button type=button class="btn small wt-compact"title="Hide the explanations">Compact`),rr=M(`<li><span class=wt-swatch role=img></span><span><span class=muted> · <!> sessions`),ir=M(`<li><span> <span class=muted>· <!> · `),ar=M(`<li><span> <span class=muted>· `),or=M(`<li><span aria-hidden=true></span><span> <span class=muted>· `),sr={sphere:`circle`,cube:`square`,octahedron:`diamond`,tetrahedron:`triangle`,dodecahedron:`pentagon`},cr={policy:`dotted; in 2D an arrowhead at one end is one-way, at both ends two-way`,denied:`dashed red with ✕ and the count`},lr=[{glyph:`hub`,color:`--accent`,label:`Hub`,text:`the bright core in the middle`},{glyph:`ring`,color:`--text`,label:`You`,text:`hollow circle`},{glyph:`hollow-triangle`,color:`--text`,label:`App`,text:`hollow triangle`},{glyph:`hexagon`,color:`--muted`,label:`Machine`,text:`hollow hexagon, at the head of its region`},{glyph:`hollow-square`,color:`--violet`,label:`Team or cluster`,text:`hollow square`},{glyph:`dashed-ring`,color:`--muted`,label:`Folded sessions`,text:`dashed ring with the count`}];function ur(e){let t,n=()=>e.size??14,[r,i]=c(0);return v(()=>{let e=matchMedia(`(prefers-color-scheme: dark)`),t=()=>i(e=>e+1);e.addEventListener(`change`,t),g(()=>e.removeEventListener(`change`,t))}),l(()=>{I(),r();let i=window.devicePixelRatio||1,a=n();t.width=Math.round(a*i),t.height=Math.round(a*i);let o=t.getContext(`2d`);if(!o)return;o.setTransform(i,0,0,i,0,0),o.clearRect(0,0,a,a);let s=getComputedStyle(t).getPropertyValue(e.color).trim()||`#888888`;Yn(o,e.glyph,a/2,a/2,a*.36,s,`#ffffff`)}),(()=>{var e=$n(),r=t;return typeof r==`function`?b(r,e):t=e,f(t=>{var r=`${n()}px`,i=`${n()}px`;return r!==t.e&&w(e,`width`,t.e=r),i!==t.t&&w(e,`height`,t.t=i),t},{e:void 0,t:void 0}),e})()}var dr={pulse:`pulsing ring`,thin:`thin ring`,thick:`thick ring`,double:`double ring`,broken:`broken ring`,none:`no ring`},fr=`watchtower.legendCompact`;function pr(e){let n=()=>e.view.teams.length>0||e.view.nodes.some(e=>e.teams||e.kind===`role`),[a,o]=c(mr(fr)===`1`),s=e=>{o(e);try{localStorage.setItem(fr,e?`1`:`0`)}catch{}};return t(xt,{id:`wt-legend`,title:`Legend`,get class(){return e.mode===`list`&&!e.phone?`wt-legend wt-panel-inline`:`wt-legend wt-pop wt-pop-legend`},get phone(){return e.phone},get autoFocus(){return e.autoFocus},opener:`wt-dock-legend`,get onClose(){return e.onClose},get actions(){return(()=>{var e=nr();return e.$$click=()=>s(!a()),f(()=>T(e,`aria-pressed`,a())),e})()},get children(){var o=tr(),s=o.firstChild,c=s.firstChild.nextSibling,l=s.nextSibling,u=l.firstChild.nextSibling,d=l.nextSibling,p=d.firstChild.nextSibling,m=p.firstChild,h=d.nextSibling,g=h.firstChild.nextSibling,_=h.nextSibling,v=_.firstChild.nextSibling,y=v.firstChild;return S(c,t(r,{get each(){return e.view.machines},children:e=>(()=>{var t=rr(),n=t.firstChild,r=n.nextSibling,i=r.firstChild,a=i.firstChild.nextSibling;return a.nextSibling,S(n,()=>e.symbol),S(r,()=>e.label,i),S(i,()=>e.sessions,a),S(i,()=>e.online?``:` · offline`,null),f(t=>{var r=`var(${e.color})`,i=`Marker ${e.symbol}`;return r!==t.e&&w(n,`color`,t.e=r),i!==t.t&&T(n,`aria-label`,t.t=i),t},{e:void 0,t:void 0}),t})()})),S(u,t(r,{get each(){return e.view.harnesses},children:e=>(()=>{var n=ir(),r=n.firstChild,i=r.firstChild,a=i.nextSibling,o=a.firstChild.nextSibling;return o.nextSibling,S(n,t(ur,{get glyph(){return sr[e.shape]},color:`--muted`}),r),S(r,()=>e.label,i),S(a,()=>me[e.shape],o),S(a,()=>e.sessions,null),n})()})),S(p,t(r,{get each(){return[...lr]},children:e=>(()=>{var n=ar(),r=n.firstChild,i=r.firstChild,a=i.nextSibling;return a.firstChild,S(n,t(ur,{get glyph(){return e.glyph},get color(){return e.color}}),r),S(r,()=>e.label,i),S(a,()=>e.text,null),n})()}),m),S(g,t(r,{get each(){return[...ge]},children:e=>(()=>{var t=or(),n=t.firstChild,r=n.nextSibling,i=r.firstChild,a=i.nextSibling;return a.firstChild,S(r,()=>L[e],i),S(a,()=>dr[Re[e]],null),f(t=>{var r=`wt-ring wt-ring-${Re[e]}`,i=`var(${z[e]})`;return r!==t.e&&j(n,t.e=r),i!==t.t&&w(n,`border-color`,t.t=i),t},{e:void 0,t:void 0}),t})()})),S(o,t(i,{get when(){return n()},get children(){return er()}}),_),S(v,t(r,{get each(){return[...R()]},children:e=>(()=>{var t=or(),n=t.firstChild,r=n.nextSibling,i=r.firstChild,a=i.nextSibling;return a.firstChild,S(r,()=>e.label,i),S(a,()=>cr[e.kind]??`solid, dashed while waiting`,null),f(r=>{var i=e.description,a=`wt-line wt-line-${e.style}`,o=`var(${e.color})`;return i!==r.e&&T(t,`title`,r.e=i),a!==r.t&&j(n,r.t=a),o!==r.a&&w(n,`border-color`,r.a=o),r},{e:void 0,t:void 0,a:void 0}),t})()}),y),f(()=>o.classList.toggle(`wt-legend-compact`,!!a())),o}})}function mr(e){try{return localStorage.getItem(e)}catch{return null}}x([`click`]);var hr=M(`<p class=muted>No sessions match.`),gr=M(`<p class=muted>No interactions match.`),_r=M(`<div class=wt-list><table class=wt-table aria-label=Sessions><thead><tr><th scope=col>Session</th><th scope=col>Machine</th><th scope=col>Harness</th><th scope=col>State</th><th scope=col>Sent</th><th scope=col>Received</th></tr></thead><tbody></tbody></table><table class=wt-table aria-label=Interactions><thead><tr><th scope=col>Kind</th><th scope=col>From → to</th><th scope=col>Messages</th><th scope=col>Last</th></tr></thead><tbody>`),vr=M(`<span class=muted aria-hidden=true>↳ `),yr=M(`<tr><td><button type=button class=wt-link></button></td><td></td><td></td><td></td><td></td><td>`),br=M(`<span class=muted> (<!>)`),xr=M(`<tr><td></td><td><button type=button class=wt-link> → </button></td><td></td><td>`);function Sr(e){return(()=>{var n=_r(),a=n.firstChild,o=a.firstChild.nextSibling,s=a.nextSibling,c=s.firstChild.nextSibling;return S(n,()=>e.children,a),S(o,t(r,{get each(){return e.nodes},children:n=>(()=>{var r=yr(),a=r.firstChild,o=a.firstChild,s=a.nextSibling,c=s.nextSibling,l=c.nextSibling,u=l.nextSibling,d=u.nextSibling;return S(a,t(i,{get when(){return n.depth>0},get children(){return vr()}}),o),o.$$click=()=>e.onNode(n.id),S(o,()=>n.label),S(s,()=>n.machine),S(c,()=>n.harness),S(l,()=>n.state),S(u,()=>n.sent),S(d,()=>n.received),f(t=>{var i=e.selected===n.id,o=`${8+n.depth*16}px`;return i!==t.e&&r.classList.toggle(`selected`,t.e=i),o!==t.t&&w(a,`padding-left`,t.t=o),t},{e:void 0,t:void 0}),r})()})),S(n,t(i,{get when(){return!e.nodes.length},get children(){return hr()}}),s),S(c,t(r,{get each(){return e.edges},children:n=>(()=>{var r=xr(),a=r.firstChild,o=a.nextSibling,s=o.firstChild,c=s.firstChild,l=o.nextSibling,u=l.nextSibling;return S(a,()=>n.kind,null),S(a,t(i,{get when(){return n.style!==`solid`},get children(){var e=br(),t=e.firstChild.nextSibling;return t.nextSibling,S(e,()=>n.style===`dashed`?`waiting`:`permitted path`,t),e}}),null),s.$$click=()=>e.onEdge(n.id),S(s,()=>n.from,c),S(s,()=>n.to,null),S(l,()=>n.count),S(u,(()=>{var e=O(()=>!!n.lastAt);return()=>e()?A(n.lastAt):`—`})()),f(t=>{var i=e.selected===n.id,a=`${n.kind} from ${n.from} to ${n.to}`;return i!==t.e&&r.classList.toggle(`selected`,t.e=i),a!==t.t&&T(s,`aria-label`,t.t=a),t},{e:void 0,t:void 0}),r})()})),S(n,t(i,{get when(){return!e.edges.length},get children(){return gr()}}),null),n})()}x([`click`]);var[Cr,wr]=c(),[Tr,Er]=c(),[Dr,Or]=c(),kr=0,Z=Cr,Q=Tr,Ar=Dr,$=(e=`pick`)=>wr(e);function jr(){wr(void 0),Er(void 0)}var Mr=Er,Nr=e=>Or({...e,seq:++kr}),Pr=(e,t)=>getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t;function Fr(e,t,n,r){let i=Math.atan2(n.y-t.y,n.x-t.x);e.beginPath(),e.moveTo(n.x,n.y),e.lineTo(n.x-r*Math.cos(i-.4),n.y-r*Math.sin(i-.4)),e.lineTo(n.x-r*Math.cos(i+.4),n.y-r*Math.sin(i+.4)),e.closePath(),e.fill()}function Ir(e,t,n){let r=Math.hypot(t.x-e.x,t.y-e.y)||1,i=(t.x-e.x)/r,a=(t.y-e.y)/r;return[{x:e.x+i*n,y:e.y+a*n},{x:t.x-i*n,y:t.y-a*n}]}function Lr(e,t,n){let r,i,a=(t,n)=>{let a=Q(),o=e.layout();if(!a||!o)return;c(a.id,o.positions,n);let s=e=>o.positions.get(`role:${a.id}:${e}`),l=Pr(`--accent`,`#3b82f6`);if(t.lineWidth=2/Math.max(.5,n.k),t.strokeStyle=l,t.fillStyle=l,t.font=`${11/Math.max(.6,n.k)}px system-ui, sans-serif`,t.textAlign=`center`,a.spec.mode===`restricted`)for(let e of a.spec.edges){let n=s(e.from),r=s(e.to);if(!n||!r)continue;let[i,a]=Ir(n,r,16);t.setLineDash([6,4]),t.beginPath(),t.moveTo(i.x,i.y),t.lineTo(a.x,a.y),t.stroke(),t.setLineDash([]),Fr(t,i,a,9),e.direction===`two-way`&&Fr(t,a,i,9),t.fillText(`${e.kinds.join(`+`)}${e.direction===`two-way`?` ⇄`:``}`,(i.x+a.x)/2,(i.y+a.y)/2-6)}if(r?.moved&&r.at){let e=o.positions.get(r.from);if(e){let a=i?o.positions.get(i)??r.at:r.at;t.setLineDash([]),t.lineWidth=3/Math.max(.5,n.k),t.beginPath(),t.moveTo(e.x,e.y),t.lineTo(a.x,a.y),t.stroke(),Fr(t,e,a,11),i&&(t.beginPath(),t.arc(a.x,a.y,20,0,Math.PI*2),t.stroke())}}},o=``,c=(e,n,r)=>{let i=t.getBoundingClientRect(),a={};for(let[t,o]of n)(Ze(t,e)!==void 0||t.startsWith(`ses_`))&&(a[t]=[Math.round(i.left+o.x*r.k+r.x),Math.round(i.top+o.y*r.k+r.y)]);let s=JSON.stringify(a);s!==o&&(t.dataset.editorPoints=o=s)},u=e=>{let t=Q();return!!t&&(Ze(e,t.id)!==void 0||e.startsWith(`ses_`))},d=n=>{if(n.button!==0||!Q())return;let i=e.hitTest(n.clientX,n.clientY);i?.type===`node`&&u(i.id)&&(n.stopPropagation(),n.preventDefault(),n.target.setPointerCapture?.(n.pointerId),r={from:i.id,start:{x:n.clientX,y:n.clientY},moved:!1,pointer:n.pointerId},t.dataset.editorDrag=`pending`)},f=n=>{if(!r||n.pointerId!==r.pointer||(n.stopPropagation(),!r.moved&&Math.hypot(n.clientX-r.start.x,n.clientY-r.start.y)>5&&(r.moved=!0),!r.moved))return;r.at=e.toWorld(n.clientX,n.clientY);let o=e.hitTest(n.clientX,n.clientY),s=Q();i=o?.type===`node`&&s&&je(s.id,r.from,o.id)?o.id:void 0,t.dataset.editorDrag=i?`over`:`dragging`,e.setOverlay(a)},p=o=>{if(!r||o.pointerId!==r.pointer)return;o.stopPropagation();let s=r;r=void 0;let c=i;if(i=void 0,delete t.dataset.editorDrag,e.setOverlay(a),!s.moved)return n(s.from);let l=Q(),u=l&&c?je(l.id,s.from,c):void 0;u&&Nr(u)},m=()=>{r=void 0,i=void 0,delete t.dataset.editorDrag,e.setOverlay(a)};t.addEventListener(`pointerdown`,d,!0),t.addEventListener(`pointermove`,f,!0),t.addEventListener(`pointerup`,p,!0),t.addEventListener(`pointercancel`,m,!0);let h=s(n=>(l(()=>{let n=Q();t.dataset.editorPaths=n?String(n.spec.mode===`restricted`?n.spec.edges.length:0):``,e.setOverlay(n?a:void 0)}),n));return()=>{h(),t.removeEventListener(`pointerdown`,d,!0),t.removeEventListener(`pointermove`,f,!0),t.removeEventListener(`pointerup`,p,!0),t.removeEventListener(`pointercancel`,m,!0),e.setOverlay(void 0)}}var Rr=M(`<aside class="wt-slider wt-sheetable te-panel"aria-label="Team editor">`),zr=M(`<div class=wt-slider-head><h2>Teams`),Br=M(`<p role=alert class=wt-error>`),Vr=M(`<ul class="te-list te-team-list">`),Hr=M(`<section class=wt-section aria-labelledby=te-teams><div class="te-row te-picker-head"><h3 id=te-teams>Open a team</h3><button type=button class="btn small primary">New team</button></div><p class=muted>Teams also have their own page: <a href=/teams>Teams</a>.`),Ur=M(`<div class=wt-slider-body>`),Wr=M(`<p class=muted>No teams yet. Create one to staff roles and give it work.`),Gr=M(`<li><button type=button class=te-team-open><strong></strong><span class=muted>#`),Kr=M(`<div class=wt-slider-head><h2>`),qr=M(`<button type=button class="btn small">All teams`),Jr=M(`<div class="te-row te-panel-links"><span class=muted> #</span><a class="btn small">Open team page`),Yr=M(`<section class=wt-section aria-labelledby=te-members><h3 id=te-members>Members`),Xr=M(`<section class=wt-section aria-labelledby=te-intake><h3 id=te-intake>Submit a task to the team</h3><h4 class=te-sub>Recent tasks`),Zr=M(`<section class="wt-section te-draft"aria-labelledby=te-draft><h3 id=te-draft>Edit the team (draft)</h3><h4 class=te-sub id=te-details>Details</h4><h4 class=te-sub id=te-roles>Roles</h4><h4 class=te-sub id=te-paths>Communication paths`),Qr=M(`<section class=wt-section aria-labelledby=te-life><h3 id=te-life>Team</h3><div class=te-row><button type=button class="btn small"></button><button type=button class="btn small">All teams`),$r=M(`<div class="wt-slider-body te-body">`),ei=M(`<dt>Paths`),ti=M(`<dd>`),ni=M(`<dt>Tags`),ri=M(`<section class=wt-section aria-label="Team overview"><dl class=wt-facts><dt>Communication</dt><dd></dd><dt>Entry role</dt><dd></dd><dt>Roles</dt><dd></dd></dl><h3>Members</h3><button type=button class=btn>Edit with form`);function ii(e){return(()=>{var n=Rr();return S(n,t(St,{onClose:jr}),null),S(n,t(i,{get when(){return Z()===`pick`},get fallback(){return t(i,{get when(){return Z()},keyed:!0,children:n=>t(oi,_({id:n},e))})},get children(){return t(ai,e)}}),null),n})()}function ai(n){let[a,o]=c(),[s,l]=c(``),[u,d]=c(!1);return v(async()=>{try{o(await Qe())}catch(t){l(t instanceof e&&t.status===404?`This hub doesn't have teams yet.`:B(t).message)}}),[(()=>{var e=zr();return e.firstChild,S(e,t(E,{icon:`close`,label:`Close the team editor`,onClick:jr}),null),e})(),(()=>{var e=Ur();return S(e,t(i,{get when(){return s()},get children(){var e=Br();return S(e,s),e}}),null),S(e,t(i,{get when(){return a()},get children(){var e=Hr(),n=e.firstChild,o=n.firstChild.nextSibling,s=n.nextSibling;return o.$$click=()=>d(!0),S(e,t(i,{get when(){return a().length},get fallback(){return Wr()},get children(){var e=Vr();return S(e,t(r,{get each(){return a()},children:e=>(()=>{var t=Gr(),n=t.firstChild,r=n.firstChild,i=r.nextSibling;return i.firstChild,n.$$click=()=>$(e.id),S(r,()=>e.title),S(i,()=>e.name,null),S(i,()=>e.paused?` · paused`:``,null),S(i,()=>e.hasDraft?` · draft`:``,null),f(()=>T(n,`aria-label`,`Edit ${e.title}`)),t})()})),e}}),s),e}}),null),e})(),t(Ve,{get open(){return u()},onClose:()=>d(!1),onCreated:e=>{n.onChanged(),$(e)}})]}function oi(e){let n=Fe(e.id,{intake:!0,onChanged:e.onChanged}),[r,a]=c(e.phone);v(()=>void n.load()),Je(()=>n.refresh(),n.openWork),l(()=>{let e=n.team(),t=n.spec();e&&t&&Mr({id:e.id,name:e.name,spec:t,...n.roster()?{seats:n.roster().seats}:{}})}),g(()=>Mr(void 0));let s,u,d=new Map,p=t=>e.snap?.nodes.find(e=>e.id===t)?.label??t;return l(o(Ar,e=>{if(e&&n.spec()&&!r()){if(e.type===`connect`)u?.prefill(e.from,e.to),n.setNotice({kind:`ok`,text:`Path ${e.from} → ${e.to}: choose its direction and kinds, then Add path.`});else if(e.type===`attach`){if(!n.publishedRoles().has(e.role))return n.setNotice({kind:`error`,text:`${e.role} isn't published yet: publish the draft, then staff it.`});n.setNotice({kind:`ok`,text:`Add ${p(e.sessionID)} to ${e.role}? Check its other teams, then confirm.`}),s?.add(e.role,e.sessionID)}else e.type===`role`&&queueMicrotask(()=>d.get(e.role)?.focus())}},{defer:!0})),[(()=>{var e=Kr(),r=e.firstChild;return S(r,(()=>{var e=O(()=>!!n.team());return()=>e()?`Team: ${n.spec()?.title||n.team().title}`:`Team`})()),S(e,t(E,{icon:`close`,label:`Close the team editor`,onClick:jr}),null),e})(),(()=>{var o=$r();return D(o,`keydown`,n.onKey,!0),S(o,t(i,{get when(){return n.loadError()},get children(){return[(()=>{var e=Br();return S(e,()=>n.loadError()),e})(),(()=>{var e=qr();return e.$$click=()=>$(`pick`),e})()]}}),null),S(o,t(i,{get when(){return O(()=>!!n.team())()&&n.spec()},get children(){return[(()=>{var e=Jr(),r=e.firstChild;r.firstChild;var i=r.nextSibling;return S(e,t(Be,{c:n}),r),S(r,()=>n.team().name,null),f(()=>T(i,`href`,V(n.team().id))),e})(),t(ze,{get notice(){return n.notice()}}),t(i,{get when(){return!r()},get fallback(){return t(si,{c:n,get snap(){return e.snap},onEdit:()=>a(!1)})},get children(){return[(()=>{var r=Yr();return r.firstChild,S(r,t(H,{c:n,get snap(){return e.snap},canvasHint:!0,handle:e=>s=e}),null),r})(),(()=>{var r=Xr(),i=r.firstChild.nextSibling;return S(r,t(Ge,{c:n}),i),S(r,t(Ue,{c:n,get snap(){return e.snap},limit:5}),null),r})(),(()=>{var e=Zr(),r=e.firstChild.nextSibling,i=r.nextSibling,a=i.nextSibling;return S(e,t(Oe,{c:n}),r),S(e,t(Ie,{c:n,withMode:!0}),i),S(e,t(Ne,{c:n,roleInput:(e,t)=>d.set(e,t)}),a),S(e,t(Xe,{c:n,canvasHint:!0,handle:e=>u=e}),null),e})()]}}),(()=>{var e=Qr(),t=e.firstChild.nextSibling.firstChild,r=t.nextSibling;return t.$$click=()=>void n.togglePause(),S(t,()=>n.team().paused?`Resume team`:`Pause team`),r.$$click=()=>$(`pick`),f(()=>t.disabled=n.busy()),e})()]}}),null),o})()]}function si(e){let n=()=>e.c.read().published;return(()=>{var r=ri(),a=r.firstChild,o=a.firstChild.nextSibling,s=o.nextSibling.nextSibling,c=s.nextSibling.nextSibling,l=a.nextSibling.nextSibling;return S(o,()=>n().mode===`open`?`Open: everyone may message everyone`:`Restricted: only the drawn paths`),S(s,()=>n().entryRole),S(c,()=>n().roles.map(e=>e.label?`${e.name} (${e.label})`:e.name).join(`, `)),S(a,t(i,{get when(){return n().mode===`restricted`},get children(){return[ei(),(()=>{var e=ti();return S(e,()=>n().edges.map(e=>`${e.from} ${e.direction===`two-way`?`⇄`:`→`} ${e.to} (${e.kinds.join(`+`)})`).join(`, `)||`none`),e})()]}}),null),S(a,t(i,{get when(){return n().tags?.length},get children(){return[ni(),(()=>{var e=ti();return S(e,()=>n().tags.join(`, `)),e})()]}}),null),S(r,t(H,{get c(){return e.c},get snap(){return e.snap}}),l),D(l,`click`,e.onEdit,!0),r})()}x([`click`,`keydown`]);var ci=q({default:()=>Ni}),li=M(`<p role=status class=wt-notice>Older interactions may have been evicted: the hub keeps only the most recent messages.`),ui=M(`<p role=status class=wt-notice>The hub cut this graph at its limits. Narrow the time window to see everything.`),di=M(`<p role=status class=wt-notice> messages with archived or deleted sessions are left out.`),fi=M(`<p role=status class=wt-notice>Subsessions are folded into their root to keep the picture readable. The list shows every session.`),pi=M(`<p role=status class=wt-notice>Sessions are folded per group to keep the picture readable. Narrow the filters or pick another grouping to see them; the list shows every session.`),mi=M(`<p role=status class=wt-notice>3D needs WebGL, which this browser can't use, so here's the 2D view.`),hi=M(`<p role=status class=wt-notice>This graph is too large to draw, so here's the list. Narrow the filters or group by machine.`),gi=M(`<p role=alert class="wt-notice wt-error">Couldn't refresh: <!>. Showing the last snapshot. <button type=button class="btn small">Retry`),_i=M(`<p role=alert class=wt-error>Could not load the interaction graph: `),vi=M(`<button type=button class=btn>Retry`),yi=M(`<div class=wt-center>`),bi=M(`<div class=wt-center><p class=muted>Loading…`),xi=M(`<button type=button class="btn primary wt-empty-cta">Connect a machine`),Si=M(`<p class="muted small">Copy the one-line installer, run it on the machine, then approve the machine in Settings.`),Ci=M(`<div class=wt-empty><p class=muted>No sessions or interactions in this window yet.`),wi=M(`<div class=wt-page><header class="topbar wt-top"><h1 class=title>Watchtower</h1><span class="wt-live muted"role=status></span></header><div class=wt-notices></div><div class=wt-stage><div class=wt-overlay>`),Ti=M(`<p class=muted>`),Ei=M(`<p class="muted small">Start a session on a machine, or pick a longer time window in Filters.`),Di=3e3,Oi=3e4;function ki(){let e=matchMedia(`(prefers-color-scheme: dark)`),[t,n]=c(0),r=()=>n(e=>e+1);return e.addEventListener(`change`,r),g(()=>e.removeEventListener(`change`,r)),u(()=>{I(),t();let e=getComputedStyle(document.documentElement),n=new Map;return t=>{let r=n.get(t);return r===void 0&&n.set(t,r=e.getPropertyValue(t).trim()||`#888888`),r}})}function Ai(){let e=matchMedia(`(prefers-reduced-motion: reduce)`),[t,n]=c(e.matches),r=()=>n(e.matches);return e.addEventListener(`change`,r),g(()=>e.removeEventListener(`change`,r)),t}var ji={get(e){try{return localStorage.getItem(e)}catch{return null}},set(e,t){try{localStorage.setItem(e,t)}catch{}}},Mi=1100;function Ni(e){try{De(localStorage)}catch{}let[r,s]=c(He(ji.get(he))),m=u(()=>Ye(p().search,r()),void 0,{equals:(e,t)=>We(e)===We(t)}),y=e=>n(`/watchtower${We(e,r()??`3d`)}`,{replace:!0}),x=e=>y({...m(),...e}),D=e=>{ji.set(he,e),s(e),x({view:e})},k=()=>m().q??``,[A,j]=c(!1),[M,te]=c(innerWidth),N=()=>!F()&&M()>=Mi,[P,ne]=c(!F()&&pt(ji.get(`watchtower.filtersOpen`),!1)),[I,re]=c(!F()&&pt(ji.get(`watchtower.legendOpen`),innerWidth>=1280));P()&&I()&&innerWidth<1280&&re(!1);let[L,ce]=c(),le=e=>{ce(e?`filters`:void 0),ne(e),ji.set(st,e?`1`:`0`),e&&pe(`filters`)},R=e=>{ce(e?`legend`:void 0),re(e),ji.set(ct,e?`1`:`0`),e&&pe(`legend`)},pe=e=>{e!==`filters`&&!N()&&ne(!1),e!==`legend`&&!N()&&re(!1),e!==`side`&&F()&&(a(m).selected&&J(void 0),Z()&&jr())},me=Ai(),ge=()=>!me()&&!A(),_e=ki(),[ye]=c(Hn()),[xe,Ce]=c(!1),[Oe,ke]=c(!1),[Ae,je]=c(),[Me,Ne]=c(0),[Fe,Ie]=c(),Re=u(()=>m().window),[z,ze]=c(),[B,Be]=c(),[Ve,Ue]=c(!0),Ge=0,V,qe=0,H=async()=>{clearTimeout(V),V=void 0;let e=++qe;Ge=Date.now(),Ue(!0);try{let t=await be(fe({window:a(Re)},Date.now()));if(e!==qe)return;ze(t),Be(void 0)}catch(t){if(e!==qe)return;Be(se(t))}finally{e===qe&&Ue(!1)}},Je=()=>{V||document.visibilityState===`hidden`||(V=setTimeout(()=>void H(),Math.max(0,Ge+Di-Date.now())))};l(o(Re,()=>void H())),v(()=>{let e=ee(e=>Ee(e)&&Je()),t=setInterval(()=>document.visibilityState===`visible`&&Date.now()-Ge>=Oi&&void H(),5e3),n=()=>document.visibilityState===`visible`&&Date.now()-Ge>=Oi&&void H();document.addEventListener(`visibilitychange`,n),g(()=>{e(),clearInterval(t),clearTimeout(V),document.removeEventListener(`visibilitychange`,n)})});let Xe=u(()=>{let e=z(),t=Q();return e&&t?Pe(e,t,t.spec,t.seats):e});g(jr),v(()=>{let e=p().searchParams.get(`edit`);e&&$(e)}),l(o(Z,e=>e&&e!==`pick`&&a(m).groupBy!==`team`&&x({groupBy:`team`})));let Qe=u(()=>oe(m())),U=u(()=>{let e=Xe();return e?ue(e,Qe(),{now:e.at,reducedMotion:!ge()}):void 0}),W=u(()=>{let e=Le({webgl:ye()&&!xe(),tooLarge:U()?.tooLarge??!1,chosen:m().view});return e.mode===`2d`&&Oe()?{mode:`list`,reason:`chosen`}:e}),$e=()=>W().reason,G=()=>W().mode===`3d`||W().mode===`2d`,K=u(()=>{let e=z();return e?we(e):{teams:[],roles:[],projects:[],workspaces:[],tags:[],metaKeys:[]}}),et=u(()=>(z()?.nodes??[]).filter(e=>e.kind===`team`)),tt=u(()=>lt(m(),{machine:e=>U()?.machines.find(t=>t.id===e)?.label??e,harness:de,team:e=>K().teams.find(t=>t.id===e)?.label??e})),nt=u(()=>{let e=Xe(),t=U();return e&&t&&W().mode===`list`?Te(e,t):{nodes:[],edges:[]}}),rt=u(()=>[...new Set((z()?.nodes??[]).filter(e=>e.kind===`session`).map(Ke))].sort((e,t)=>de(e).localeCompare(de(t)))),it=u(()=>{let e=z();return!!e&&!e.nodes.some(e=>e.kind===`session`)&&!e.edges.length}),q=()=>m().selected,J=e=>x({selected:e}),at=u(()=>{let e=z(),t=q();return e&&t?.type===`node`?ve(e,t.id):void 0}),ot=u(()=>{let e=z(),t=q();return e&&t?.type===`edge`?Se(e,t.id):void 0});l(o([q,Z],([e,t])=>(e||t)&&F()&&pe(`side`)));let Y=e=>{if(e.startsWith(`agg:`)||e.startsWith(`group:`))return;let t=Q(),n=t?Ze(e,t.id):void 0;if(n!==void 0)return Nr({type:`role`,role:n});let r=/^role:([^:]+):/.exec(e);J({type:`node`,id:r?r[1]:e})},dt=e=>{let t=z(),n=[...e.edgeIDs].sort((e,n)=>(t?.edges.find(e=>e.id===n)?.count??0)-(t?.edges.find(t=>t.id===e)?.count??0))[0];n&&J({type:`edge`,id:n})},ft=()=>{let e=U()?.nodes.find(e=>e.match&&!e.id.startsWith(`agg:`)&&!e.id.startsWith(`group:`)&&!e.id.startsWith(`role:`));e&&(J({type:`node`,id:e.id}),je({id:e.id,seq:(Ae()?.seq??0)+1}))},mt=()=>!!(z()&&q())||!!Z(),ht=()=>F()?`0px`:Z()?`min(440px, 100%)`:z()&&q()?`min(380px, 100%)`:`0px`,gt;return v(()=>{let e=new ResizeObserver(()=>te(gt.clientWidth));e.observe(gt),te(gt.clientWidth),P()&&I()&&!N()&&re(!1);let t=e=>{e.key!==`Escape`||e.defaultPrevented||C()||q()||Z()||(P()?le(!1):I()&&R(!1))};document.addEventListener(`keydown`,t),g(()=>{e.disconnect(),document.removeEventListener(`keydown`,t)})}),(()=>{var e=wi(),n=e.firstChild,r=n.firstChild,a=r.nextSibling,o=n.nextSibling,s=o.nextSibling,c=s.firstChild;S(n,t(i,{get when(){return F()},get children(){return t(E,{icon:`menu`,label:`Open sidebar`,onClick:ie})}}),r),S(a,()=>Ve()&&z()?`Updating…`:``),S(n,t(i,{get when(){return!F()},get children(){return t(E,{icon:`sidebar`,label:`Toggle sidebar (⌘B)`,onClick:ie})}}),null),S(o,t(i,{get when(){return z()?.truncated},get children(){return li()}}),null),S(o,t(i,{get when(){return z()?.capped},get children(){return ui()}}),null),S(o,t(i,{get when(){return(z()?.hiddenMessages??0)>0},get children(){var e=di(),t=e.firstChild;return S(e,()=>z().hiddenMessages,t),e}}),null),S(o,t(i,{get when(){return O(()=>U()?.lod===`roots`)()&&G()},get children(){return fi()}}),null),S(o,t(i,{get when(){return O(()=>U()?.lod===`groups`)()&&G()},get children(){return pi()}}),null),S(o,t(i,{get when(){return O(()=>W().mode===`2d`)()&&$e()===`webgl`},get children(){return mi()}}),null),S(o,t(i,{get when(){return O(()=>W().mode===`list`)()&&$e()===`large`},get children(){return hi()}}),null),S(o,t(i,{get when(){return O(()=>!!B())()&&z()},get children(){var e=gi(),t=e.firstChild.nextSibling,n=t.nextSibling.nextSibling;return S(e,()=>B().message,t),n.$$click=()=>void H(),e}}),null);var l=gt;return typeof l==`function`?b(l,s):gt=s,S(s,t(d,{get children(){return[t(h,{get when(){return O(()=>!z())()&&B()},get children(){var e=yi();return S(e,t(i,{get when(){return B().kind!==`missing`},get fallback(){return(()=>{var e=Ti();return S(e,()=>B().message),e})()},get children(){return[(()=>{var e=_i();return e.firstChild,S(e,()=>B().message,null),e})(),(()=>{var e=vi();return e.$$click=()=>void H(),e})()]}})),e}}),t(h,{get when(){return!z()},get children(){return bi()}}),t(h,{get when(){return O(()=>W().mode===`3d`)()&&U()},children:e=>t(Un,_({get view(){return e()},get palette(){return _e()},get motion(){return ge()},get focus(){return Ae()},get resetSeq(){return Me()},onNode:Y,onLink:dt,onBackground:()=>void 0,onFail:()=>Ce(!0)},()=>q()?.type===`node`?{selected:q().id}:{},{onRenderer:e=>(Ie(e),()=>Ie(void 0))}))}),t(h,{get when(){return O(()=>W().mode===`2d`)()&&U()},children:e=>t(Bn,_({get view(){return e()},get palette(){return _e()},get motion(){return ge()}},()=>q()?.type===`node`?{selected:q().id}:{},{get focus(){return Ae()},get resetSeq(){return Me()},onNode:Y,onLink:dt,onBackground:()=>void 0,onFail:()=>ke(!0),onRenderer:(e,t)=>Lr(e,t,Y)}))}),t(h,{get when(){return W().mode===`list`},get children(){return t(Sr,{get nodes(){return nt().nodes},get edges(){return nt().edges},get selected(){return q()?.id},onNode:Y,onEdge:e=>J({type:`edge`,id:e}),get children(){return t(i,{get when(){return O(()=>!(!I()||F()))()&&U()},children:e=>t(pr,{get view(){return e()},mode:`list`,phone:!1,get autoFocus(){return L()===`legend`},onClose:()=>R(!1)})})}})}})]}}),c),S(s,t(i,{get when(){return it()},get children(){var e=Ci();return e.firstChild,S(e,t(i,{get when(){return!z().nodes.some(e=>e.kind===`machine`)},get fallback(){return Ei()},get children(){return[(()=>{var e=xi();return e.$$click=()=>ae(),e})(),Si()]}}),null),f(()=>e.classList.toggle(`wt-empty-drawn`,!!G())),e}}),c),S(c,t(Rn,{get chips(){return tt()},onRemove:e=>x(e.clear),onClear:()=>x(Fn)}),null),S(c,t(i,{get when(){return O(()=>!!(I()&&U()))()&&(G()||F())},get children(){return t(pr,{get view(){return U()},get mode(){return O(()=>W().mode===`2d`)()?`2d`:W().mode===`list`?`list`:`3d`},get phone(){return F()},get autoFocus(){return L()===`legend`},onClose:()=>R(!1)})}}),null),S(c,t(i,{get when(){return O(()=>!!P())()&&z()},get children(){return t(Ln,{get url(){return m()},get phone(){return F()},get autoFocus(){return L()===`filters`},get machines(){return(U()?.machines??[]).map(e=>({value:e.id,label:e.label}))},get harnesses(){return rt().map(e=>({value:e,label:de(e)}))},get choices(){return K()},get teamValue(){return et().find(e=>e.id===m().team||e.name===m().team)?.id??m().team},setURL:x,go:y,onClose:()=>le(!1)})}}),null),S(c,t(gn,_({get view(){return m().view},get drawn(){return G()},get filtersOpen(){return P()},get filterCount(){return ut(m())},get legendOpen(){return I()},get teamsOpen(){return!!Z()},get paused(){return A()},get reduced(){return me()},get panelOpen(){return P()||I()&&F()||F()&&mt()},get search(){return k()}},()=>k().trim()?{matches:U()?.matches??0}:{},{setView:D,onFilters:()=>le(!P()),onLegend:()=>R(!I()),onTeams:()=>Z()?jr():$(),onHub:()=>J({type:`node`,id:`hub`}),onReset:()=>Ne(e=>e+1),onPause:()=>j(!A()),get canRelayout(){return O(()=>W().mode===`3d`)()&&!!Fe()},onRelayout:()=>Fe()?.relayout(),onSearch:e=>x({q:e.trim()?e:void 0}),onSearchEnter:ft})),null),S(s,t(i,{get when(){return O(()=>!!(z()&&q()))()&&!Z()},get children(){return t(Zt,{get snap(){return z()},get selection(){return q()},get node(){return at()},get edge(){return ot()},get window(){return m().window},onSelect:J,onClose:()=>J(void 0),onEditTeam:e=>$(e)})}}),null),S(s,t(i,{get when(){return Z()},get children(){return t(ii,{get snap(){return Xe()},get phone(){return F()},onChanged:()=>void H()})}}),null),f(e=>{var t=W().mode,n=ge()?`live`:`static`,r=tt().length?``:void 0,i=ht();return t!==e.e&&T(s,`data-mode`,e.e=t),n!==e.t&&T(s,`data-motion`,e.t=n),r!==e.a&&T(s,`data-chips`,e.a=r),i!==e.o&&w(s,`--wt-side`,e.o=i),e},{e:void 0,t:void 0,a:void 0,o:void 0}),e})()}x([`click`]);export{Qn as a,at as c,Ni as default,Gn as i,Xn as n,Zn as o,Yn as r,it as s,ci as t};
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import{$ as e,C as t,E as n,It as r,Lt as i,Mt as a,Nt as o,St as s,Ut as c,at as l,it as u,kt as d,nt as f,ot as p,rt as m,tt as h,w as ee,xt as g,y as _,zt as te}from"./ui-j5FFk90B.js";import{n as ne,t as re}from"./pane-layout-EdR1kRrG.js";var v=e=>e==null?``:String(e).trim(),ie=Object.freeze([[`role`,`Admins first`],[`email`,`Email`],[`lastSeen`,`Last seen`]]),ae=Object.freeze([[`all`,`All`],[`admins`,`Admins`],[`active`,`Active`],[`disabled`,`Disabled`]]),oe=Object.freeze({signin:`Signed in`,"signin.denied":`Sign-in refused`,"device.pair":`Paired a device`,"device.revoke":`Revoked a device`,"machine.approve":`Approved a machine`,"machine.deny":`Denied a machine`,"machine.revoke":`Revoked a machine`,"user.role":`Changed a role`,"user.disable":`Disabled a user`,"user.enable":`Enabled a user`,"speech.default":`Changed the server speech default`,"migrate.local":`Moved the hub owner's machines and devices to the first admin`});function y(e){return e?.user?.role===`admin`}function se(e){let t=e?.user,n=e?.auth===`oidc`?`oidc`:`pairing`,r=y(e);if(n!==`oidc`)return{mode:n,admin:r,title:`This hub`,initial:`H`};let i=v(t?.name),a=v(t?.email),o=i||a||`Signed in`;return{mode:n,admin:r,title:o,...i&&a?{subtitle:a}:{},initial:(o.match(/[\p{L}\p{N}]/u)?.[0]??`?`).toUpperCase(),...r?{badge:`Admin`}:{}}}var ce=Object.freeze([[`users`,`Users`],[`machines`,`Machines`],[`approvals`,`Approvals`],[`audit`,`Audit log`]]);function le(e){return y(e)?ce.filter(([t])=>t!==`users`||e?.auth===`oidc`):[]}function ue(e,t){return y(e)&&t?.scope===`user`?[`user`,`default`]:[`user`]}function de(e){return e&&e.startsWith(`/`)&&!e.startsWith(`//`)&&!e.includes(`\\`)?e:`/`}function fe(e,t){if(e?.mode===`oidc`&&typeof e.signIn==`string`&&e.signIn)return`${e.signIn}?next=${encodeURIComponent(de(t))}`}function pe(e){let t=e?.auth===`oidc`?v(e?.user?.email):``;return t?`This machine will belong to you (${t}).`:`This machine will belong to you.`}var me={stt:[`provider`,`model`,`baseURL`,`language`],tts:[`provider`,`model`,`voice`,`baseURL`,`speed`]};function he(e){let t=e;if(t?.scope!==`user`)return;let n=t.default??{},r=t.user&&typeof t.user==`object`?t.user:void 0,i={own:{stt:0,tts:0}};for(let e of[`stt`,`tts`]){let a=t[e]??{},o=n[e]??{},s=r?.[e]??{},c={};for(let t of me[e]){let n=r?s[t]===void 0||s[t]===null:v(a[t])===v(o[t]),l=v(o[t]);c[t]=n?{inherited:n,note:l?`Using server default: ${l}`:`Server default: not set`}:{inherited:n},n||i.own[e]++}let l=r?!!s.apiKey?.set:a.apiKey?.source===`user`;c.apiKey=l?{inherited:!1}:{inherited:!0,note:o.apiKey?.set===!1?`Key: server default (none set)`:`Key: server default`},l&&i.own[e]++,i[e]=c}return i}function ge(e){return{[e]:Object.fromEntries([...me[e],`apiKey`].map(e=>[e,null]))}}function _e(e){let t=v(e);if(!t)return`Unknown action`;if(oe[t])return oe[t];let n=t.replace(/[._-]+/g,` `).trim().toLowerCase();return n.charAt(0).toUpperCase()+n.slice(1)}function ve(e,t=[]){let n=new Map(t.map(e=>[e.id,v(e.email)||v(e.name)||e.id])),r=e=>e===`system`?`System`:n.get(e)??e;return[...e??[]].sort((e,t)=>t.at-e.at).map(e=>({at:e.at,actor:r(e.actor),action:_e(e.action),target:e.target===void 0?void 0:n.get(e.target)??e.target,detail:e.detail}))}var ye=e=>(v(e.email)||v(e.name)||e.id).toLowerCase();function be(e,{query:t=``,filter:n=`all`,sort:r=`role`}={}){let i=v(t).toLowerCase(),a=e=>(!i||`${v(e.email)} ${v(e.name)}`.toLowerCase().includes(i))&&(n===`admins`?e.role===`admin`:n===`disabled`?!!e.disabled:n!==`active`||!e.disabled),o=(e,t)=>ye(e).localeCompare(ye(t)),s=r===`lastSeen`?(e,t)=>(t.lastSeen??0)-(e.lastSeen??0)||o(e,t):r===`email`?o:(e,t)=>Number(!!e.disabled)-Number(!!t.disabled)||Number(t.role===`admin`)-Number(e.role===`admin`)||o(e,t);return(e??[]).filter(a).sort(s)}function xe(e,t,n){let r=v(e.email)||v(e.name)||e.id,i=e.id===n,a=(t??[]).filter(e=>e.role===`admin`&&!e.disabled).length,o=e.role===`admin`&&!e.disabled&&a<=1;return[e.role===`admin`?{label:`Remove admin`,change:{role:`user`},danger:!0,...o?{lastAdmin:!0}:{},confirm:i?`Remove your own admin role? You will lose access to the admin screens.`:`Remove admin from ${r}?`}:{label:`Make admin`,change:{role:`admin`},confirm:`Make ${r} an admin? Admins manage users, machines and the server speech default.`},e.disabled?{label:`Enable`,change:{disabled:!1},confirm:`Enable ${r}?`}:{label:`Disable`,change:{disabled:!0},danger:!0,...o?{lastAdmin:!0}:{},confirm:i?`Disable your own account? This device is signed out.`:`Disable ${r}? Their phones and machines are disconnected until you enable them again.`}]}function Se(e){let t=v(e?.message);return t&&!/^HTTP \d+$/.test(t)?t:e?.status===403?`Only admins can do that.`:`The server refused the change (HTTP ${e?.status??`?`}).`}var Ce=e=>String(e??``).normalize(`NFD`).replace(/\p{M}/gu,``).toLowerCase(),we=e=>`${e.providerID}/${e.modelID}`,Te=class{models;constructor(e=[]){this.models=Array.isArray(e)?e.filter(e=>e&&typeof e.providerID==`string`&&typeof e.modelID==`string`):[]}groups(e=``){let t=Ce(e.trim()),n=new Map,r=this.models.some(e=>e.enabled!==!1);for(let e of this.models){if(r&&e.enabled===!1||t&&!Ce([e.name,e.modelID,e.providerID].join(` `)).includes(t))continue;let i=n.get(e.providerID)??[];i.push({...e,variants:[...e.variants??[]]}),n.set(e.providerID,i)}return[...n].sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>({providerID:e,items:t.sort((e,t)=>(e.name||e.modelID).localeCompare(t.name||t.modelID))}))}selection(e){if(!e)return;let t=this.models.find(t=>t.providerID===e.providerID&&t.modelID===e.modelID);return t?{...t,variants:[...t.variants??[]],stale:t.enabled===!1}:{...e,name:we(e),variants:e.variant?[e.variant]:[],stale:!0}}},Ee=e=>`${e}:reasoning`,De=(e,t)=>t===void 0?`${e}:text`:`${e}:text:${t}`,Oe=e=>`hubmsg:${e}`,ke=1e3,Ae=(e,t)=>`activity:${e}:${t}`,je=(e,t)=>e.pos-t.pos||e.live-t.live,Me=class{items=new Map;subagents=new Map;details=new Map;places=new Map;top=0;bottom=0;liveSeq=0;seenSeq=0;loaded=!1;snapshots=0;history=new Set;load(e,t={}){let n=(e??[]).filter(e=>e&&typeof e.key==`string`),r=n.filter(e=>typeof e.pos!=`number`&&!this.places.has(e.key));r.forEach((e,n)=>{this.places.set(e.key,{pos:t.older?this.bottom-r.length+n:this.top+1+n,live:0})});for(let e of n){typeof e.pos==`number`&&Number.isFinite(e.pos)&&this.places.set(e.key,{pos:e.pos,live:0});let t=this.places.get(e.key).pos;this.top=Math.max(this.top,t),this.bottom=Math.min(this.bottom,t),this.history.add(e.key)}for(let e of n){let t=this.liveTwin(e);t?(this.items.delete(t.key),this.places.delete(t.key),t.kind===`reasoning`?this.put({...e,text:e.text||t.text||``}):t.kind===`tool`?this.put({...Ne(t,[`summary`,`error`]),...e}):this.put(e)):this.put(e)}if(!t.older){this.loaded=!0;for(let[e,t]of this.places)t.live>0&&t.pos<this.top&&this.places.set(e,{...t,pos:this.top});for(let e of this.subagents.values())e.place&&e.place.pos<this.top&&(e.place={...e.place,pos:this.top})}}liveTwin(e){if(this.history.has(e.key)&&this.items.has(e.key))return;let t=typeof e.messageID==`string`?e.messageID:void 0,n=[];e.kind===`reasoning`&&t&&n.push(Ee(t)),e.kind===`assistant`&&t&&(typeof e.ordinal==`number`&&n.push(De(t,e.ordinal)),(e.ordinal===void 0||e.ordinal===0)&&n.push(De(t))),e.kind===`tool`&&typeof e.callID==`string`&&typeof e.sessionID==`string`&&n.push(Ae(e.sessionID,e.callID)),e.kind===`message`&&t&&n.push(Oe(t));for(let t of n){let n=t===e.key?void 0:this.items.get(t);if(n&&!this.history.has(t))return n}if(e.kind===`user`&&typeof e.text==`string`&&e.text){for(let t of this.items.values())if(t.kind===`user`&&!t.messageID&&!this.history.has(t.key)&&t.text===e.text)return t}}appendReasoning({sessionID:e,messageID:t,delta:n,at:r=Date.now()}){let i;for(let e of this.items.values())e.kind===`reasoning`&&e.messageID===t&&e.state===`running`&&(i=e);i??=this.items.get(Ee(t));let a=i?.key??Ee(t);this.upsert({key:a,kind:`reasoning`,messageID:t,...e?{sessionID:e}:{},text:`${i?.text??``}${n}`,state:`running`,at:i?.at??r})}appendText({sessionID:e,messageID:t,ordinal:n,delta:r,at:i=Date.now()}){let a=De(t,n),o=this.items.get(a);this.upsert({key:a,messageID:t,...e?{sessionID:e}:{},kind:`assistant`,text:`${o?.text??``}${r}`,live:!0,at:o?.at??i}),this.endReasoning(e)}liveTextKey(e){let t=De(e),n=-1;for(let r of this.items.values()){if(r.kind!==`assistant`||r.messageID!==e||this.history.has(r.key))continue;let i=r.key.startsWith(`${e}:text:`)?Number(r.key.slice(e.length+6)):NaN;Number.isInteger(i)&&i>n&&([t,n]=[r.key,i])}return t}activity(e,t){if(!t||typeof t.id!=`string`||t.kind===`thinking`)return;let n=Ae(e,t.id),r=this.items.get(n);this.upsert({key:n,sessionID:e,kind:`tool`,callID:t.id,...t.tool?{name:t.tool}:{},...t.summary?{summary:t.summary}:{},...t.error?{error:t.error}:{},...t.childSessionID?{childSessionID:t.childSessionID}:{},state:t.state,at:r?.at??t.at})}endReasoning(e,t=Date.now()){for(let n of this.items.values())n.kind===`reasoning`&&n.state===`running`&&(e===void 0||n.sessionID===e)&&this.upsert({key:n.key,kind:n.kind,state:`done`,completed:t})}upsert(e){e&&typeof e.key==`string`&&(this.places.has(e.key)||this.places.set(e.key,this.livePlace()),this.put(e))}livePlace(){return{pos:this.top,live:++this.liveSeq}}put(e){this.items.set(e.key,{...this.items.get(e.key)??{},...e})}hubMessage(e){if(e&&typeof e.key==`string`&&typeof e.messageID==`string`){for(let[t,n]of this.items)if(t!==e.key&&n.kind===`message`&&n.messageID===e.messageID&&this.history.has(t))return;if(!this.places.has(e.key)){if(typeof e.at==`number`&&Number.isFinite(e.at)){let t=e.at*ke;this.places.set(e.key,{pos:t,live:0}),this.top=Math.max(this.top,t)}else this.places.set(e.key,this.livePlace())}this.put(e)}}fromHistory(e){return this.history.has(e)}forgetHistory(){for(let e of this.history)this.items.delete(e),this.places.delete(e);this.history.clear()}clear(){this.items.clear(),this.places.clear(),this.details.clear(),this.history.clear(),this.top=0,this.bottom=0,this.loaded=!1}get(e){return this.items.get(e)}status(e,t){let n=new Set,r=new Set([t]);for(let t=!0;t;){t=!1;for(let n of e??[])typeof n?.id==`string`&&typeof n.parentID==`string`&&r.has(n.parentID)&&!r.has(n.id)&&(r.add(n.id),t=!0)}let i=(e??[]).every(e=>e?.id===t||typeof e?.parentID!=`string`),a=this.snapshots>0&&this.loaded;e?.length&&this.snapshots++;for(let o of e??[]){let s=o?.id;if(!o||typeof s!=`string`||!s||s===t||!r.has(s)&&!(i&&(e??[])[0]?.id===t))continue;n.add(s);let c=typeof o.since==`number`?o.since:void 0,l=o.state===`idle`?`done`:o.state,u=this.subagents.get(s)??{id:s,seen:++this.seenSeq,...a&&l===`working`?{place:this.livePlace()}:{}};this.subagents.set(s,{...u,title:typeof o.title==`string`?o.title:void 0,state:l,since:c})}for(let e of this.subagents.values())!n.has(e.id)&&e.state===`working`&&(e.state=`done`)}detail(e,t){this.details.set(e,t)}rows(){let e=[],t=new Map;for(let n of this.items.values()){let r={...n,depth:0,...this.details.has(n.key)?{detail:this.details.get(n.key)}:{}};if(n.sessionID&&this.subagents.has(n.sessionID)){let e=t.get(n.sessionID)??[];e.push({...r,depth:1}),t.set(n.sessionID,e)}else e.push(r)}let n=e=>this.places.get(e)??{pos:this.top,live:2**53-1},r=(e,t)=>je(n(e.key),n(t.key)),i=e=>[{key:`sub:${e.id}`,kind:`subagent`,label:e.title||e.id,state:e.state,sessionID:e.id,depth:0},...(t.get(e.id)??[]).sort(r)],a=[],o=new Set;for(let t of e.sort(r)){let e=typeof t.childSessionID==`string`&&!o.has(t.childSessionID)?this.subagents.get(t.childSessionID):void 0;e&&o.add(e.id),a.push({place:n(t.key),rows:e?i(e):[t]})}let s=[...this.subagents.values()].filter(e=>!o.has(e.id));s.filter(e=>!e.place).sort((e,t)=>(e.since??1/0)-(t.since??1/0)||e.seen-t.seen).forEach((e,t)=>a.push({place:{pos:-1/0,live:t},rows:i(e)}));for(let e of s)e.place&&a.push({place:e.place,rows:i(e)});return a.sort((e,t)=>je(e.place,t.place)).flatMap(e=>e.rows)}};function Ne(e,t){return Object.fromEntries(t.filter(t=>e[t]!==void 0).map(t=>[t,e[t]]))}function Pe(e){let t=e&&typeof e==`object`?e:{},n=e=>typeof e==`string`&&e?e:void 0;return t.kind===`session`?n(t.name)?`@${t.name}`:String(t.sessionID??`?`):t.kind===`user`?`@me`:t.kind===`app`?`app ${n(t.label)??String(t.tokenID??`?`)}`:`?`}function Fe(e,t){let n=t&&typeof t==`object`?t:void 0;if(!n||typeof n.id!=`string`||!n.id||typeof n.kind!=`string`||typeof n.to!=`string`)return;let r=t=>t?.kind===`session`&&t.sessionID===e,i=r(n.from)?`out`:r(n.recipient)?`in`:void 0;if(i)return{key:Oe(n.id),kind:`message`,messageID:n.id,sessionID:e,text:typeof n.text==`string`?n.text:``,...typeof n.at==`number`?{at:n.at}:{},direction:i,message:{kind:n.kind,from:Pe(n.from),to:n.to,...typeof n.replyTo==`string`?{replyTo:n.replyTo}:{}},recipient:Pe(n.recipient),...typeof n.state==`string`?{state:n.state}:{},...typeof n.delivery==`string`?{delivery:n.delivery}:{}}}var Ie=new Set([`open`,`answered`,`expired`,`closed`]),Le=e=>!!e&&typeof e==`object`&&!Array.isArray(e);function Re(e){if(!Le(e))return;let{id:t,question:n,options:r,state:i,about:a,at:o,from:s}=e;if(typeof t!=`string`||!t.startsWith(`dec_`)||typeof n!=`string`||!Array.isArray(r)||!Array.isArray(a)||typeof i!=`string`||!Ie.has(i)||typeof o!=`number`||!Le(s))return;let c=r.filter(e=>Le(e)&&typeof e.id==`string`&&typeof e.label==`string`),{as:l,...u}=e;return{...u,...l===`concierge`?{as:`concierge`}:{},options:c,about:a.filter(e=>typeof e==`string`)}}var ze=(e,t)=>t.at-e.at||(e.id<t.id?1:-1);function Be(e){return e.filter(e=>e.state===`open`).sort(ze)}function Ve(e,t){return Be([...e.filter(e=>e.id!==t.id),t])}function He(e,t){return e.filter(e=>e.from.kind===`session`&&e.from.sessionID===t||e.about.includes(t))}var Ue=new Set,We=(e,t=Ue)=>e.as===`concierge`||e.from.kind===`session`&&t.has(e.from.sessionID)?`@@concierge`:Pe(e.from),Ge=e=>e.tier===`tap`?`Answer here (tap): only a signed-in console can answer this one.`:``;function Ke(e,t){let n=e-t;if(n<0)return``;let r=Math.floor(n/1e3),i=Math.floor(r/86400),a=Math.floor(r%86400/3600),o=Math.floor(r%3600/60);return i?`${i}d ${a}h`:a?`${a}h ${o}m`:o?`${o}m ${r%60}s`:`${r}s`}function qe(e,t){if(e.deadline===void 0)return``;let n=Ke(e.deadline,t);if(!n)return`Past its deadline`;let r=e.onTimeout?e.options.find(t=>t.id===e.onTimeout)?.label:void 0;return`Deadline in ${n}${r?` · then ${r}`:``}`}function Je(e,t,n){let r=n.trim();return e.options.length?t===void 0||!e.options.some(e=>e.id===t)?{ok:!1,problem:`Pick one of the options`}:{ok:!0,body:{option:t,...r?{text:r}:{}}}:r?{ok:!0,body:{text:r}}:{ok:!1,problem:`Type an answer`}}var Ye=class{seq=0;settled=0;pending=new Map;begin(e=Date.now()){let t=++this.seq;return this.pending.set(t,{at:e,events:[]}),t}event(e,t=Date.now()){for(let[n,r]of this.pending)t-r.at>3e4?this.pending.delete(n):r.events.push(e)}settle(e,t){let n=this.pending.get(e)?.events;if(this.pending.delete(e),!(!n||e<this.settled))return this.settled=e,n.reduce((e,t)=>Ve(e,t),Be(t))}fail(e){this.pending.delete(e)}},Xe=`@@concierge`,Ze=/\nThe Concierge's note: ([\s\S]*)$/,Qe=/proposes to deny ([\s\S]*) in (?:@[\w-]+|ses_\w+)\.(?:\nThe Concierge's note: [\s\S]*)?$/,$e=/^[\s\S]*? asks to approve( always(?: \(saves [\s\S]*?\))?)? ([\s\S]*)\. Outside its grant: ([\s\S]*)$/,et=`a permission request (details unknown)`,b=e=>typeof e==`string`&&e?e:void 0;function tt(e){let t=Array.isArray(e.resources)?e.resources.filter(e=>typeof e==`string`):void 0,n=b(e.action);if(n&&t)return e.summary===`${n}: ${t.join(`, `)}`||!e.summary.startsWith(`${n}: `)?{action:n,resources:t}:{action:n,resources:[e.summary.slice(n.length+2)]};let r=e.summary.indexOf(`: `);return r<0?{action:n??b(e.summary),resources:t??[]}:{action:n??e.summary.slice(0,r),resources:t??[e.summary.slice(r+2)]}}function nt(e){let t=e.indexOf(`: `);return t<0?{action:e,resources:[]}:{action:e.slice(0,t),resources:[e.slice(t+2)]}}function rt(e,t,n){if(e)return{...tt(e),...t?.save?.length?{saves:[...t.save]}:{},source:`live`};if(t&&typeof t.action==`string`){let e=[...t.resources??[]],n=t.save?.length?[...t.save]:void 0,r=(e,t)=>typeof e==`number`&&e>t?e-t:void 0,i=r(t.resourcesTotal,e.length),a=r(t.savesTotal,n?.length??0),o=Array.isArray(t.cut)?t.cut.filter(e=>(e.field===`resources`||e.field===`save`)&&Number.isInteger(e.index)&&typeof e.length==`number`):[];return{action:t.action,resources:e,...n?{saves:n}:{},source:`request`,...i?{resourcesMore:i}:{},...a?{savesMore:a}:{},...o.length?{cut:o}:{},...t.truncated===!0?{incomplete:!0}:{}}}let r=n();return r?{...r,source:`text`}:void 0}var it=e=>e?{...e.action?{action:e.action}:{},resources:e.resources,...e.saves?{saves:e.saves}:{},source:e.source,...e.resourcesMore?{resourcesMore:e.resourcesMore}:{},...e.savesMore?{savesMore:e.savesMore}:{},...e.cut?{cut:e.cut}:{},...e.incomplete?{incomplete:e.incomplete}:{}}:{resources:[]};function at(e,t,n,r){if(r)for(let i of new Set(t.filter(e=>!!e))){let t=e.blockers(i).find(e=>e.kind===n&&e.id===r);if(t)return t}}var ot=(e,t)=>({id:t,label:e.label(t)??t}),st=e=>Array.isArray(e)?e.map(String).join(`, `):typeof e==`object`&&e?JSON.stringify(e):String(e);function ct(e,t){let n=e.action;if(n?.kind===`permission`){let r=We(e),i=e.from.kind===`session`&&r===e.from.sessionID?t.label(e.from.sessionID)??r:r,a=$e.exec(e.question),o=n.sessionID??n.rootID??e.about[0],s=rt(at(t,[n.sessionID,n.rootID,...e.about],`permission`,n.requestID),n.request,()=>a&&a[2]!==et?nt(a[2]):void 0),c=b(n.reason)??a?.[3]?.trim(),l=e.recommendation?.why;return{kind:`permission`,requester:i,...o?{target:ot(t,o)}:{},...it(s),always:n.always===!0||!!a?.[1],...n.requestID?{requestID:n.requestID}:{},...c?{outsideGrant:c}:{},...l?{purpose:{by:i,text:l}}:{}}}if(n?.kind===`act`&&n.target){let r=n.input??{},i=e.recommendation?.why??Ze.exec(e.question)?.[1]?.trim(),a={kind:`proposal`,verb:n.verb??`act`,target:ot(t,n.target),always:!1,...i?{purpose:{by:Xe,text:i}}:{}};switch(n.verb){case`deny`:{let i=b(r.requestID),o=at(t,[n.target],`permission`,i),s=Qe.exec(e.question)?.[1],c=rt(o,n.request,()=>s&&s!==`permission request ${i}`?nt(s):void 0);return{...a,...it(c),...i?{requestID:i}:{}}}case`prompt`:return{...a,resources:[],...b(r.text)?{text:b(r.text)}:{}};case`answer`:{let e=b(r.formID),i=at(t,[n.target],`form`,e),o=r.answer&&typeof r.answer==`object`&&!Array.isArray(r.answer)?Object.entries(r.answer).map(([e,t])=>({key:e,value:st(t)})):void 0;return{...a,resources:[],...e?{formID:e}:{},...i?{form:i.summary}:{},...r.cancel===!0?{cancel:!0}:o?{answer:o}:{},...i?{source:`live`}:{}}}default:return{...a,resources:[]}}}if(n)return;let r=[...new Set(e.about)].flatMap(e=>t.blockers(e).filter(e=>e.kind===`permission`).map(t=>({s:e,b:t})));if(r.length!==1)return;let{s:i,b:a}=r[0],o=tt(a);return{kind:`ask`,target:ot(t,i),...o.action?{action:o.action}:{},resources:o.resources,always:!1,requestID:a.id,source:`live`}}function lt(e){if(e.action?.kind!==`act`)return e.question;let t=e.question.replace(Ze,``);return e.action.verb===`prompt`||e.action.verb===`answer`?t.split(`
|
|
2
|
-
`)[0]:t}var ut=typeof Intl<`u`&&`Segmenter`in Intl?new Intl.Segmenter(void 0,{granularity:`grapheme`}):void 0;function dt(e){return ut?Array.from(ut.segment(e),e=>e.segment):Array.from(e)}function ft(e,{chars:t=400,lines:n=8}={}){let r=e,i=!1,a=r.split(`
|
|
3
|
-
`);a.length>n&&(r=a.slice(0,n).join(`
|
|
4
|
-
`),i=!0);let o=dt(r);return o.length>t&&(r=o.slice(0,t).join(``),i=!0),{text:i?`${r}…`:r,cut:i}}var pt=RegExp(`(\\u{1F3F4}[\\u{E0030}-\\u{E0039}\\u{E0061}-\\u{E007A}]{1,30}\\u{E007F})|[\\u0000-\\u0008\\u000B-\\u001F\\u007F-\\u009F\\u00AD\\u034F\\u061C\\u115F\\u1160\\u180E\\u200B\\u200C\\u200E\\u200F\\u2028-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\u3164\\uFEFF\\uFFA0\\uFFF9-\\uFFFB\\u{E0000}-\\u{E007F}]`,`gu`);function mt(e){return e.replace(pt,(e,t)=>t||`⟨U+${e.codePointAt(0).toString(16).toUpperCase().padStart(4,`0`)}⟩`)}var ht=/(?<![\w/.-])ses_[A-Za-z0-9]{1,64}(?![\w])/g,gt=10,_t=e=>e.length>12?`${e.slice(0,gt)}…`:e,vt=e=>e.replace(/[/\\]+$/,``).split(/[/\\]/).pop()||``;function yt(e,t,n=!1){if(n)return`the Concierge`;let r=t?.name?.trim().replace(/^@+/,``);if(r)return`@${r}`;let i=t?.title?.trim();if(i)return i;let a=t?.directory?vt(t.directory):``;return a?`${a} · ${_t(e)}`:_t(e)}function bt(e,t){return e.replace(ht,e=>t(e))}function xt(e,t){let n=e&&typeof e==`object`?e:{},r=e=>typeof e==`string`&&e?e:void 0;return n.kind===`session`?r(n.name)?`@${String(n.name).replace(/^@+/,``)}`:typeof n.sessionID==`string`?t(n.sessionID):`?`:n.kind===`user`?`@me`:n.kind===`app`?`app ${r(n.label)??String(n.tokenID??`?`)}`:`?`}function St(e,t,n=new Set){return We(e,n)===`@@concierge`?`@@concierge`:xt(e.from,t)}var Ct=e=>e.from.kind===`session`?e.from.sessionID:e.from.kind===`app`?e.from.tokenID:void 0;function wt(e,t,n=new Set){let r=e.action;return r?.kind===`permission`&&r.request&&typeof r.request.action==`string`?`${St(e,t,n)} asks to approve ${r.request.action}${r.always?` always`:``}`:bt(lt(e),t)}var Tt=[`approve`,`deny`,`answer`,`prompt`,`stop`,`roles`,`launch`],Et=new Set([`active`,`expired`,`revoked`]),x=e=>!!e&&typeof e==`object`&&!Array.isArray(e),S=e=>Array.isArray(e)&&e.every(e=>typeof e==`string`),C=[`sessions:read`,`sessions:manage`,`messages:send`,`messages:read`,`sessions:act`,`sessions:launch`,`events:subscribe`,`profiles:read`,`profiles:manage`,`profiles:assign`,`workspaces:read`,`workspaces:manage`,`artifacts:read`,`artifacts:write`,`artifacts:ai`,`teams:read`,`teams:manage`,`teams:submit`];function Dt(e){if(x(e)&&typeof e.id==`string`&&/^[0-9a-f]{16}$/.test(e.id)&&S(e.scopes))return{id:e.id,...typeof e.label==`string`?{label:e.label}:{},scopes:e.scopes.filter(e=>C.includes(e)),...typeof e.created==`number`?{created:e.created}:{}}}function Ot(e){return(x(e)&&Array.isArray(e.tokens)?e.tokens:[]).map(Dt).filter(e=>!!e)}function kt(e,t){let n=e.trim();if(!n)return{ok:!1,error:`Give the token a label`};if(!t.length)return{ok:!1,error:`Pick at least one scope`};let r=t.find(e=>!C.includes(e));return r?{ok:!1,error:`Unknown scope: ${r}`}:{ok:!0,body:{label:n,scopes:[...new Set(t)]}}}var At={"sessions:read":`Read your sessions and their activity`,"sessions:manage":`Name sessions and claim roles`,"messages:send":`Send messages and asks, reply and decline`,"messages:read":`Read messages to it`,"sessions:act":`Approve, deny, answer, prompt and stop sessions (only under a grant)`,"sessions:launch":`Launch sessions (only under a grant with verb launch for the repo)`,"events:subscribe":`Subscribe webhooks to events`,"profiles:read":`Read your shared agent profiles (instructions, skills, commands)`,"profiles:manage":`Create, revise and archive your agent profiles`,"profiles:assign":`Pin agent profiles to sessions (also needs a prompt grant on the session)`,"workspaces:read":`Read your workspaces, their members, supervision and boards`,"workspaces:manage":`Create, edit and archive workspaces; add members, supervise, start side chats`,"artifacts:read":`Read your artifacts and their revisions (including workspace-shared ones)`,"artifacts:write":`Create and revise artifacts, and accept AI edits the app requested`,"artifacts:ai":`Ask AI about artifacts and request edits or actions (run by sessions it may already use)`,"teams:read":`Read your teams, their roles, roster and intake`,"teams:manage":`Create, edit, publish, staff, pause and archive teams`,"teams:submit":`Submit work to a team's intake`},jt=e=>C.includes(e);function Mt(e){let t=x(e)?e.login:void 0;if(x(t)&&typeof t.userCode==`string`&&typeof t.clientName==`string`&&S(t.scopes)&&typeof t.created==`number`&&typeof t.expiresAt==`number`)return{userCode:t.userCode,clientName:t.clientName,scopes:t.scopes.filter(jt),created:t.created,expiresAt:t.expiresAt}}function Nt(e){return C.map(t=>{let n=e.scopes.includes(t);return{scope:t,label:At[t],requested:n,checked:n}})}function Pt(e){if(!e.length)return{ok:!1,error:`Pick at least one scope`};let t=e.find(e=>!jt(e));return t?{ok:!1,error:`Unknown scope: ${t}`}:{ok:!0,body:{scopes:[...new Set(e)]}}}function Ft(e){if(!x(e))return;let{id:t,holder:n,scope:r,allow:i,permissions:a,allowAlways:o,maxActionsPerHour:s,created:c,expiresAt:l,state:u}=e;if(typeof t==`string`&&typeof n==`string`&&typeof u==`string`&&Et.has(u)&&x(r)&&S(r.projects)&&S(i)&&x(a)&&S(a.allow)&&S(a.never)&&typeof o==`boolean`&&typeof s==`number`&&typeof c==`number`&&typeof l==`number`)return e}function It(e){return(x(e)&&Array.isArray(e.grants)?e.grants:[]).map(Ft).filter(e=>!!e)}function Lt(e,t){return e.state===`revoked`||e.revokedAt!==void 0?`revoked`:e.state===`expired`||t>=e.expiresAt?`expired`:`active`}var Rt={active:`Active`,expired:`Expired`,revoked:`Revoked`};function zt(e,t){if(e<=t)return``;let n=Math.ceil((e-t)/6e4),r=Math.floor(n/1440),i=Math.floor(n%1440/60),a=n%60;return r>=2?`${Math.round(n/1440)} d`:r===1?i?`1 d ${i} h`:`1 d`:i?a?`${i} h ${a} min`:`${i} h`:`${a} min`}function Bt(e,t){let n=Lt(e,t);return{id:e.id,holder:e.holderSessionID?`${e.holder} (${e.holderSessionID})`:e.holder,state:n,stateLabel:Rt[n],projects:e.scope.projects.join(`, `),verbs:e.allow.join(`, `),permit:e.permissions.allow.join(`, `),never:e.permissions.never.join(`, `),limits:[e.allowAlways?`may allow always`:``,`${e.maxActionsPerHour} actions an hour`].filter(Boolean).join(` · `),expiry:n===`active`?`Expires in ${zt(e.expiresAt,t)}`:Rt[n],editable:n===`active`}}function Vt(e){return{holder:e?.holder??``,projects:e?e.scope.projects.join(`
|
|
5
|
-
`):``,allow:e?[...e.allow]:[],permit:e?e.permissions.allow.join(`
|
|
6
|
-
`):``,never:e?e.permissions.never.join(`
|
|
7
|
-
`):``,expires:`8h`,maxActionsPerHour:String(e?.maxActionsPerHour??60),allowAlways:e?.allowAlways??!1}}var Ht=e=>e.split(`
|
|
8
|
-
`).map(e=>e.trim()).filter(Boolean),Ut=/^\d+(s|m|h|d)?$/,Wt=e=>/^([A-Za-z]:)?[\\/]/.test(e);function Gt(e){let t={},n=e.holder.trim();n||(t.holder=`Who holds it: @@orchestrator, @name, ses_… or app:<token id>`);let r=Ht(e.projects),i=r.find(e=>!Wt(e));r.length?i!==void 0&&(t.projects=`${i} is not an absolute directory`):t.projects=`At least one project directory`;let a=Tt.filter(t=>e.allow.includes(t));a.length||(t.allow=`Pick at least one action`);let o=e.expires.trim();Ut.test(o)||(t.expires=`A duration: seconds, or 30m, 8h, 2d`);let s=e.maxActionsPerHour.trim(),c=/^\d+$/.test(s)?Number(s):NaN;return c>=1&&c<=1e3||(t.maxActionsPerHour=`A whole number from 1 to 1000`),Object.keys(t).length?{ok:!1,errors:t}:{ok:!0,body:{holder:n,scope:{projects:r},allow:a,permissions:{allow:Ht(e.permit),never:Ht(e.never)},expires:o,maxActionsPerHour:c,allowAlways:e.allowAlways}}}function Kt(e){if(/^permissions\.never/.test(e))return`never`;if(/^permissions/.test(e))return`permit`;if(/^scope/.test(e))return`projects`;if(/^allow\b/.test(e))return`allow`;if(/^expires/.test(e))return`expires`;if(/^maxActionsPerHour/.test(e))return`maxActionsPerHour`;if(/^allowAlways/.test(e))return`allowAlways`;if(/holder|^No app token|^No session|^No such session/i.test(e))return`holder`}function qt(e){if(!x(e))return;let{seq:t,at:n,actor:r,verb:i,target:a,decision:o,outcome:s}=e;if(typeof t==`number`&&typeof n==`number`&&x(r)&&typeof r.kind==`string`&&typeof i==`string`&&x(a)&&typeof o==`string`&&typeof s==`string`)return e}function Jt(e){if(!x(e))return{entries:[]};let t=(Array.isArray(e.entries)?e.entries:[]).map(qt).filter(e=>!!e);return typeof e.next==`number`?{entries:t,next:e.next}:{entries:t}}var Yt={allow:`allowed`,needs_user:`needs you`,forbidden:`refused`,paused:`paused`,rate_limited:`rate limited`,busy:`hub busy`},Xt={ok:`done`,failed:`failed`,gone:`already answered`,offline:`offline`,unsupported:`unsupported`,escalated:`sent to you`,refused:`refused`},Zt=new Set([`forbidden`,`paused`,`rate_limited`,`busy`]),Qt=new Set([`failed`,`refused`,`offline`,`unsupported`]),$t={"acting.pause":`turned agent actions off`,"acting.resume":`turned agent actions on`},en={approve:[`approved`,`approved $`],deny:[`denied`,`denied $`],answer:[`answered`,`answered $`],prompt:[`prompted a session`,`prompted $`],stop:[`stopped a session`,`stopped $`],propose:[`proposed an action`,`proposed an action for $`],msg:[`sent a message`,`messaged $`],roles:[`claimed a role`,`claimed a role for $`],"roles.release":[`released a role`,`released a role of $`],launch:[`launched a session`,`launched $`],"launch.stop":[`stopped a launch`,`stopped the launch of $`],"team.staff":[`staffed a team role`,`staffed a team role with $`],"team.unstaff":[`unstaffed a team role`,`unstaffed $ from a team role`],"team.denied":[`sent a message the team's rules refused`,`sent $ a message the team's rules refused`],"grant.request":[`asked for a grant`,`asked for a grant for $`],"grant.approve":[`approved a grant request`,`approved a grant request from $`],"grant.deny":[`denied a grant request`,`denied a grant request from $`]},tn={deny:[`proposed denying`,`proposed denying a request in`],answer:[`proposed answering`,`proposed answering a form in`],prompt:[`proposed prompting`,`proposed a prompt to`],stop:[`proposed stopping`,`proposed stopping`]},nn=/^Decision dec_[A-Za-z0-9]{1,64}: (\w+)$/;function rn(e,t,n){let r=tn[nn.exec(e??``)?.[1]??``],i=n?` in ${n}`:``;return t?`${r?r[0]:`proposed an action on`} ${t}${i}`:n?`${r?r[1]:`proposed an action for`} ${n}`:`proposed an action`}function an(e,t,n,r){if(e===`propose`)return rn(r,t,n);let i=en[e];return i?t?`${i[0]} ${t}${n?` in ${n}`:``}`:n?i[1].replace(`$`,n):i[0]:[e.replace(/[._]+/g,` `).trim()||e,t,t&&n?`in ${n}`:n].filter(Boolean).join(` `)}var on=(e,t)=>e.as===`concierge`?`@@concierge`:e.actor.kind===`user`?`you`:t?xt(e.actor,e=>t(e)??_t(e)):Pe(e.actor);function sn(e,t){if(e.outcome!==`escalated`)return;let n=/\bDecision (dec_[A-Za-z0-9]{1,64})\b/.exec(e.reason??``)?.[1];for(let r of t)if(n?r.id===n:e.target.requestID&&r.action?.requestID===e.target.requestID)return r}function cn(e){if(e.state!==`answered`)return e.state;let t=e.answer?.option,n=e.options.find(e=>e.id===t)?.label??t;return n?`answered “${n}”`:`answered`}var ln=`Shell, outside folders and tools always need the user's tap`,un=`The Concierge never answers “always”: the user decides`,dn={approve:`Approved`,deny:`Denied`,answer:`Answered`,prompt:`Prompted`,stop:`Stopped`},fn=e=>e.replace(/\binGrant\s*=\s*yes\b/gi,`inside your grant`).replace(/\binGrant\s*=\s*no\b/gi,`outside your grant`).replace(/\bauto\s*=\s*yes\b/gi,`approvable without you`).replace(/\bauto\s*=\s*no\b/gi,`needs your tap`).replace(/\bdec_[A-Za-z0-9]{1,64}\b/g,`a Decision`),pn=/[\u061c\u200b-\u200f\u2028-\u202e\u2060-\u206f\ufeff\u{E0000}-\u{E007F}]/gu,mn=300;function hn(e){let t=fn(e).replace(pn,``).replace(/«/g,`‹`).replace(/»/g,`›`).replace(/[\u0000-\u001f\u007f-\u009f]/g,` `).replace(/\s+/g,` `).trim(),n=Array.from(t);return`«${n.length>mn?`${n.slice(0,299).join(``)}…`:t}»`}function gn(e){let t=e.reason??``;if(e.decision===`busy`)return`Refused: the hub was busy (its state did not answer in time); try again`;if(e.reason===`concierge inbound rule`)return`Refused: only you can message the Concierge`;if(e.actor.kind===`user`&&/^Decision dec_[A-Za-z0-9]{1,64} proposed by @@concierge$/.test(t))return`You said yes to the Concierge's proposal`;if(e.as!==`concierge`)return t;if(t===`concierge outbound rule`)return`Refused: the Concierge may message only you`;if(e.verb===`propose`)return`The Concierge proposed this for your answer`;if(t===ln)return`Needed your tap: shell commands, outside folders and tools always do`;if(t===un)return`Needed your tap: the Concierge never answers “always”`;if(e.decision===`needs_user`)return t?`Needed you: ${fn(t).replace(/ outside the grant\b/,` outside the Concierge's grant`)}`:`Needed you`;let n=dn[e.verb];return n&&e.decision===`allow`&&e.outcome===`ok`?`${n} by the Concierge inside your grant${t?`. Its note: ${hn(t)}`:``}`:fn(t)}function _n(e,t,n){let r=e.target.requestID??e.target.formID,i=e.target.requestID?`a permission request`:e.target.formID?`a form`:void 0,a=e.target.sessionID,o=a?n?.(a)??_t(a):``,s=$t[e.verb]??an(e.verb,i,o,e.reason),c=$t[e.verb]?void 0:[r,r&&a?`in ${a}`:a].filter(Boolean).join(` `)||void 0,l=Yt[e.decision]??e.decision,u=Xt[e.outcome]??e.outcome,d=e.decision===`allow`&&e.outcome===`ok`,f=t&&t.state!==`open`?`${u} · ${cn(t)}`:void 0;return{seq:e.seq,at:e.at,who:on(e,n??(()=>void 0)),what:s,...c?{whatTitle:c}:{},result:d?`done`:f??(l===u?l:`${l} · ${u}`),tone:d||t?.state===`answered`?`ok`:Zt.has(e.decision)||Qt.has(e.outcome)?`err`:`warn`,grant:e.grant?`grant`:``,...e.grant?{grantTitle:e.grant}:{},reason:gn(e)}}var vn={approve:`Approved`,deny:`Denied`,answer:`Answered`},yn=3,bn=3,xn=e=>e.replace(/[\\/]+$/,``).split(/[\\/]/).pop()||e;function Sn(e,t,n){let r=n?.(e);if(t.as===`concierge`||r?.holder===`@@concierge`)return`the Concierge's grant`;let i=r?.scope.projects.map(xn)??[];if(!i.length)return`your grant`;let a=i.slice(0,bn).join(`, `);return`your grant for ${i.length>bn?`${a} and ${i.length-bn} more`:a}`}function Cn(e,t,n){let r=vn[e.verb];if(!r||e.decision!==`allow`||e.outcome!==`ok`)return;let i=`${r} by ${on(e,t)}`;return e.grant?{text:`${i} · ${Sn(e.grant,e,n)}`,title:e.grant}:{text:i}}function wn(e,t,n){return Cn(e,t,n)?.text}function Tn(e,t){return[t,...e.filter(e=>e.seq!==t.seq)].sort((e,t)=>t.seq-e.seq).slice(0,100)}function En(e,t,n,r){for(let i of e){if(i.target.requestID!==t&&i.target.formID!==t)continue;let e=Cn(i,n,r);if(e)return e}}function Dn(e,t,n,r,i,a,o){let s=[];for(let c of[...e].sort((e,t)=>t.at-e.at||t.seq-e.seq)){if(s.length>=yn)break;if(!c.target.sessionID||!t.has(c.target.sessionID)||n-c.at>6e5||r!==void 0&&c.at<r)continue;let e=Cn(c,a,o),l=c.target.requestID??c.target.formID??`seq-${c.seq}`;e&&!i?.has(l)&&!s.some(e=>e.key===l)&&s.push({key:l,...e,at:c.at})}return s}function On(e,t,n,r=6e4,i){for(let a of[...e].sort((e,t)=>t.at-e.at||t.seq-e.seq)){if(n-a.at>r)break;if(a.verb!==`deny`||!a.target.sessionID||!t.has(a.target.sessionID))continue;let e=wn(a,void 0,i);if(e)return{key:a.target.requestID??a.target.formID??`seq-${a.seq}`,text:e}}}function kn(e,t,n,r){let{since:i,until:a}=n,o;for(let n of e){if(n.verb!==`deny`||n.target.sessionID!==t||i!==void 0&&n.at<i||a!==void 0&&n.at>=a)continue;let e=wn(n,void 0,r);e&&(!o||(i===void 0?n.at>o.e.at||n.at===o.e.at&&n.seq>o.e.seq:n.at<o.e.at||n.at===o.e.at&&n.seq<o.e.seq))&&(o={e:n,text:e})}return o&&{key:o.e.target.requestID??o.e.target.formID??`seq-${o.e.seq}`,text:o.text}}function An(e,t){return e.filter(e=>e.denial===void 0||!t.has(e.denial))}function jn(e){let t=e.enabled!==!1,n=e.hubEnabled!==!1;return{on:t,hubOn:n,note:n?t?``:`Agents cannot act for you (approve, deny, answer, prompt, stop, launch). Reading and messaging still work.`:`An admin turned agent actions off for the whole hub: no agent can approve, deny, answer, prompt, stop or launch until it is on again.`}}var Mn=/^(.*?) asks to approve( always(?: \(saves .*?\))?)? (.*?)\. Outside its grant: (.*)$/s,Nn=`a permission request (details unknown)`;function Pn(e){if(e.action?.kind!==`permission`)return;let t={requester:We(e),always:e.action.always===!0,...e.action.requestID?{requestID:e.action.requestID}:{}},n=Mn.exec(e.question);if(!n)return{...t,action:void 0,resources:[],reason:void 0};let r=n[3],i=r.indexOf(`: `),a=r!==Nn;return{...t,always:t.always||!!n[2],action:a?i<0?r:r.slice(0,i):void 0,resources:a&&i>=0?r.slice(i+2).split(`, `).filter(Boolean):[],reason:n[4].trim()||void 0}}function Fn(e,t){return!x(e)||typeof e.by!=`string`||e.recommends!==`approve`?``:`${t?bt(e.by,t):e.by} recommends Approve${typeof e.why==`string`&&e.why?`: ${e.why}`:``}`}var In=Symbol(`store-raw`),w=Symbol(`store-node`),T=Symbol(`store-has`),Ln=Symbol(`store-self`);function Rn(e){let t=e[g];if(!t&&(Object.defineProperty(e,g,{value:t=new Proxy(e,Wn)}),!Array.isArray(e))){let n=Object.keys(e),r=Object.getOwnPropertyDescriptors(e),i=Object.getPrototypeOf(e),a=i!==null&&typeof e==`object`&&!!e&&!Array.isArray(e)&&i!==Object.prototype;if(a){let e=Object.getOwnPropertyDescriptors(i);n.push(...Object.keys(e)),Object.assign(r,e)}for(let i=0,o=n.length;i<o;i++){let o=n[i];a&&o===`constructor`||r[o].get&&Object.defineProperty(e,o,{configurable:!0,enumerable:r[o].enumerable,get:r[o].get.bind(t)})}}return t}function E(e){let t;return typeof e==`object`&&!!e&&(e[g]||!(t=Object.getPrototypeOf(e))||t===Object.prototype||Array.isArray(e))}function D(e,t=new Set){let n,r,i,a;if(n=e!=null&&e[In])return n;if(!E(e)||t.has(e))return e;if(Array.isArray(e)){Object.isFrozen(e)?e=e.slice(0):t.add(e);for(let n=0,a=e.length;n<a;n++)i=e[n],(r=D(i,t))!==i&&(e[n]=r)}else{Object.isFrozen(e)?e=Object.assign({},e):t.add(e);let n=Object.keys(e),o=Object.getOwnPropertyDescriptors(e);for(let s=0,c=n.length;s<c;s++)a=n[s],!o[a].get&&(i=e[a],(r=D(i,t))!==i&&(e[a]=r))}return e}function zn(e,t){let n=e[t];return n||Object.defineProperty(e,t,{value:n=Object.create(null)}),n}function Bn(e,t,n){if(e[t])return e[t];let[r,a]=i(n,{equals:!1,internal:!0});return r.$=a,e[t]=r}function Vn(e,t){let n=Reflect.getOwnPropertyDescriptor(e,t);return!n||n.get||!n.configurable||t===g||t===w||(delete n.value,delete n.writable,n.get=()=>e[g][t]),n}function Hn(e){te()&&Bn(zn(e,w),Ln)()}function Un(e){return Hn(e),Reflect.ownKeys(e)}var Wn={get(e,t,n){if(t===In)return e;if(t===g)return n;if(t===s)return Hn(e),n;let r=zn(e,w),i=r[t],a=i?i():e[t];if(t===w||t===T||t===`__proto__`)return a;if(!i){let n=Object.getOwnPropertyDescriptor(e,t);te()&&(typeof a!=`function`||Object.prototype.hasOwnProperty.call(e,t))&&!(n&&n.get)&&(a=Bn(r,t,a)())}return E(a)?Rn(a):a},has(e,t){return t===In||t===g||t===s||t===w||t===T||t===`__proto__`||(te()&&Bn(zn(e,T),t)(),t in e)},set(){return!0},deleteProperty(){return!0},ownKeys:Un,getOwnPropertyDescriptor:Vn};function O(e,t,n,r=!1){if(t===`__proto__`||!r&&e[t]===n)return;let i=e[t],a=e.length;n===void 0?(delete e[t],e[T]&&e[T][t]&&i!==void 0&&e[T][t].$()):(e[t]=n,e[T]&&e[T][t]&&i===void 0&&e[T][t].$());let o=zn(e,w),s;if((s=Bn(o,t,i))&&s.$(()=>n),Array.isArray(e)&&e.length!==a){for(let t=e.length;t<a;t++)(s=o[t])&&s.$();(s=Bn(o,`length`,a))&&s.$(e.length)}(s=o[Ln])&&s.$()}function Gn(e,t){let n=Object.keys(t);for(let r=0;r<n.length;r+=1){let i=n[r];Kn(i)||O(e,i,t[i])}}function Kn(e){return e===`__proto__`||e===`constructor`||e===`prototype`}function qn(e,t){if(typeof t==`function`&&(t=t(e)),t=D(t),Array.isArray(t)){if(e===t)return;let n=0,r=t.length;for(;n<r;n++){let r=t[n];e[n]!==r&&O(e,n,r)}O(e,`length`,r)}else Gn(e,t)}function Jn(e,t,n=[]){let r,i=e;if(t.length>1){r=t.shift();let a=typeof r,o=Array.isArray(e);if(a===`string`&&(r===`__proto__`||t.length>1&&Kn(r)))return;if(Array.isArray(r)){for(let i=0;i<r.length;i++)Jn(e,[r[i]].concat(t),n);return}if(o&&a===`function`){for(let i=0;i<e.length;i++)r(e[i],i)&&Jn(e,[i].concat(t),n);return}if(o&&a===`object`){let{from:i=0,to:a=e.length-1,by:o=1}=r;for(let r=i;r<=a;r+=o)Jn(e,[r].concat(t),n);return}if(t.length>1){Jn(e[r],t,[r].concat(n));return}i=e[r],n=[r].concat(n)}let a=t[0];typeof a==`function`&&(a=a(i,n),a===i)||(r!==void 0||a!=null)&&(a=D(a),r===void 0||E(i)&&E(a)&&!Array.isArray(a)?Gn(i,a):O(e,r,a))}function Yn(...[e,t]){let n=D(e||{}),r=Array.isArray(n),i=Rn(n);function a(...e){d(()=>{r&&e.length===1?qn(n,e[0]):Jn(n,e)})}return[i,a]}var Xn=Symbol(`store-root`);function Zn(e){return e===`__proto__`||e===`constructor`||e===`prototype`}function k(e,t,n,r,i){if(Zn(n))return;let a=t[n];if(e===a)return;let o=Array.isArray(e);if(n!==Xn&&(!E(e)||!E(a)||o!==Array.isArray(a)||i&&e[i]!==a[i])){O(t,n,e);return}if(o){if(e.length&&a.length&&(!r||i&&e[0]&&e[0][i]!=null)){let t,n,o,s,c,l,u,d;for(o=0,s=Math.min(a.length,e.length);o<s&&(a[o]===e[o]||i&&a[o]&&e[o]&&a[o][i]&&a[o][i]===e[o][i]);o++)k(e[o],a,o,r,i);let f=Array(e.length),p=new Map;for(s=a.length-1,c=e.length-1;s>=o&&c>=o&&(a[s]===e[c]||i&&a[s]&&e[c]&&a[s][i]&&a[s][i]===e[c][i]);s--,c--)f[c]=a[s];if(o>c||o>s){for(n=o;n<=c;n++)O(a,n,e[n]);for(;n<e.length;n++)O(a,n,f[n]),k(e[n],a,n,r,i);a.length>e.length&&O(a,`length`,e.length);return}for(u=Array(c+1),n=c;n>=o;n--)l=e[n],d=i&&l?l[i]:l,t=p.get(d),u[n]=t===void 0?-1:t,p.set(d,n);for(t=o;t<=s;t++)l=a[t],d=i&&l?l[i]:l,n=p.get(d),n!==void 0&&n!==-1&&(f[n]=a[t],n=u[n],p.set(d,n));for(n=o;n<e.length;n++)n in f?(O(a,n,f[n]),k(e[n],a,n,r,i)):O(a,n,e[n])}else for(let t=0,n=e.length;t<n;t++)k(e[t],a,t,r,i);a.length>e.length&&O(a,`length`,e.length);return}let s=Object.keys(e);for(let t=0,n=s.length;t<n;t++)Zn(s[t])||k(e[s[t]],a,s[t],r,i);let c=Object.keys(a);for(let t=0,n=c.length;t<n;t++)e[c[t]]===void 0&&O(a,c[t],void 0)}function Qn(e,t={}){let{merge:n,key:r=`id`}=t,i=D(e);return e=>{if(!E(e)||!E(i))return i;let t=k(i,{[Xn]:e},Xn,n,r);return t===void 0?e:t}}var $n=new WeakMap,er={get(e,t){if(t===In)return e;let n=e[t];if(t===g||t===s||t===w||t===T||t===`__proto__`)return n;let r;return E(n)?$n.get(n)||($n.set(n,r=new Proxy(n,er)),r):n},set(e,t,n){return O(e,t,D(n)),!0},deleteProperty(e,t){return O(e,t,void 0,!0),!0}};function A(e){return t=>{if(E(t)){let n;(n=$n.get(t))||$n.set(t,n=new Proxy(t,er)),e(n)}return t}}var j={blocked:0,working:1,error:2,idle:3},tr=e=>j[e]??3,nr=e=>String(e??``).replace(/(.)[\\/]+$/,`$1`);function rr(e){let t=Array.isArray(e?.status)?e.status:[];return t.length?t.some(e=>e.state===`blocked`)?`blocked`:t[0]?.state===`error`?`error`:t.some(e=>e.state===`working`)?`working`:`idle`:e?.blockers?.length?`blocked`:e?.state!==void 0&&e.state in j?e.state:`idle`}function ir(e){let t=Array.isArray(e?.status)?e.status:[];return(t.length?t:[{id:e?.id,title:e?.title,blockers:e?.blockers}]).flatMap(e=>(e.blockers??[]).map(t=>({...t,sessionID:e.id,sessionTitle:e.title})))}function ar(e){let t=`idle`;for(let n of e)tr(n)<j[t]&&(t=n);return t}function or(e){if(!e)return;if(e.kind===`thinking`)return`Thinking…`;let t=e.tool||`tool`;return e.summary?`${t} · ${e.summary}`:t}function sr(e){return String(e??``).normalize(`NFD`).replace(/\p{M}/gu,``).toLowerCase()}var cr=e=>sr(e).split(/\s+/).filter(Boolean);function lr(e,t){let n=cr(t);if(!n.length)return!0;let r=[e.title||`Untitled`,e.projectName,e.project,e.directory].filter(Boolean).map(sr);return n.every(e=>r.some(t=>t.includes(e)))}function ur(e,t){let n=nr(e),r=nr(t);return n===r?``:n.startsWith(`${r}/`)?n.slice(r.length+1):n}var M=e=>String(e??``).replace(/(.)[\\/]+$/,`$1`),dr=e=>M(e).split(/[\\/]/).pop()||String(e??``),fr=[`hiddenSessions`,`hiddenWorkspaces`,`pinnedSessions`,`pinnedWorkspaces`],pr=500,mr=5e3,hr=4096,gr=e=>e===`hiddenSessions`?mr:pr,_r=(e,t=pr)=>{if(!Array.isArray(e))return[];let n=[...new Set(e.filter(e=>typeof e==`string`&&e.length>0&&e.length<=hr))];return n.length>t?n.slice(n.length-t):n};function vr(e){let t=e,n=t&&typeof t==`object`&&t.prefs&&typeof t.prefs==`object`?t.prefs:e??{};return Object.fromEntries(fr.map(e=>[e,_r(n[e],gr(e))]))}function yr(e){let t=e.trim();return t?t.length>200?{error:`Title is longer than 200 characters`}:{title:t}:{error:`Enter a title`}}function br(e,t,n){let r;for(let i of e??[])for(let e of i.processes)for(let i of e.sessions)if(i.id===t){r??=i.title??``,i.title=n;for(let e of i.status??[])e.id===t&&(e.title=n)}return r}var xr=class{graceMs;pending=new Map;constructor(e=5e3){this.graceMs=e}set(e,t,n){this.pending.set(e,{title:t,at:n})}has(e){return this.pending.has(e)}drop(e,t){this.pending.get(e)?.title===t&&this.pending.delete(e)}apply(e,t){for(let[n,{title:r,at:i}]of[...this.pending]){let a=Sr(e,n);a===r||t-i>this.graceMs?this.pending.delete(n):a!==void 0&&br(e,n,r)}}},Sr=(e,t)=>{for(let n of e??[])for(let e of n.processes)for(let n of e.sessions)if(n.id===t)return n.title??``};function Cr(e,t,n,r){if(!fr.includes(t))throw Error(`unknown prefs list: ${t}`);let i=e[t]??[],a=new Set(i),o=new Set(n.filter(e=>a.has(e)!==r));if(!o.size)return{prefs:e,patch:void 0};let s=r?_r([...i,...o],gr(t)):i.filter(e=>!o.has(e));return{prefs:{...e,[t]:s},patch:{[t]:s}}}var wr=e=>{try{let t=JSON.parse(e??`null`);return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}catch{return[]}};function Tr(e,t,n){let r=e!=null||t!=null,i={};for(let[r,a]of[[`pinnedSessions`,e],[`pinnedWorkspaces`,t]]){let e=n[r]??[],t=wr(a).filter(t=>!e.includes(t));t.length&&(i[r]=_r([...e,...t]))}return{clear:r,patch:Object.keys(i).length?i:void 0}}var Er={working:`working`,blocked:`blocked`};function Dr(e){let t=rr(e);return ar([t,e?.terminal?.status===`blocked`&&t!==`blocked`?`working`:Er[e?.terminal?.status??``]??`idle`])}function Or(e){return e?.terminal?.status===`blocked`&&rr(e)!==`blocked`}var kr=e=>!!e?.open&&e.terminal?.source===`herdr`&&!!e.terminal.workspaceID,Ar=e=>M(e?.project||e?.directory);function jr(e){return kr(e)?`herdr:${e.terminal.workspaceID}`:Ar(e)}var Mr=(e,t)=>Ar(e)===t||M(e.directory)===t||kr(e)&&jr(e)===t;function Nr(e,t){if(t.sessions.has(e.id))return!0;for(let n of t.workspaces)if(Mr(e,n))return!0;return!1}function Pr(e,t){let n=(t.updated??0)>(e.updated??0)?t:e,r=e.open?e:t.open?t:void 0;return{...n,conversation:!!(e.conversation||t.conversation),busy:!!(e.busy||t.busy),...r?{open:!0,terminal:r.terminal}:{}}}function Fr(e){let t=e?.processes??[],n=new Set(t.flatMap(e=>e.sessions.map(e=>e.id))),r=new Map;for(let e of t)for(let t of e.sessions){if(t.parentID&&n.has(t.parentID))continue;let e=r.get(t.id);r.set(t.id,e?Pr(e,t):t)}return[...r.values()]}function Ir(e){let t=Lr(e);return e=>Nr(e,t)}var Lr=e=>({sessions:new Set(e?.hiddenSessions??[]),workspaces:new Set(e?.hiddenWorkspaces??[])}),Rr=e=>e?.terminals?.herdr?.workspaces??[];function zr(e){let t=M(e.project||e.directory),n=e.project?ur(e.directory,t):``;return`${e.projectName||dr(t)}${n?` › ${n}`:``}`}function Br(e,t,n){let r=zr(t),i=n?.trim()||void 0;return{machine:e,where:r,...i?{branch:i}:{},text:[e,r,i].filter(Boolean).join(` · `)}}function Vr(e,t,n){let r=kr(e)?e.terminal.workspace||Rr(t).find(t=>t.id===e.terminal.workspaceID)?.label||e.terminal.workspaceID:void 0;return{...e,title:e.title||e.terminal?.title||`Untitled`,updated:e.updated??0,state:Dr(e),waitingInTerminal:Or(e),blockers:ir(e),exposed:e.exposed!==!1,pinned:n.has(e.id),nowText:or(e.now),where:zr(e),workspace:r??(e.projectName||dr(Ar(e))),machineID:t?.id}}var Hr=50,Ur=200;function Wr(e){let t=Rr(e).map(e=>({kind:`herdr`,key:`herdr:${e.id}`,workspaceID:e.id,label:e.label||e.id,directories:[...e.directories??[]]})),n=new Set(t.flatMap(e=>e.directories.map(M))),r=Fr(e),i=new Map,a=new Map;for(let e of r){let t=M(e.directory);t&&(i.set(t,Math.max(i.get(t)??0,e.updated??0)),a.set(t,zr(e)))}for(let e of r){let t=M(e.project);if(!t||a.has(t))continue;let n=Math.max(...r.filter(e=>M(e.project)===t).map(e=>e.updated??0));i.set(t,n),a.set(t,e.projectName||dr(t))}let o=[...i.entries()].filter(([e])=>!n.has(e)).sort((e,t)=>t[1]-e[1]).slice(0,Hr).map(([e])=>({kind:`folder`,key:e,label:a.get(e)??dr(e),directories:[e]}));return{herdr:!!e?.terminals?.herdr,targets:[...t,...o]}}function Gr({target:e,directory:t,title:n,openInHerdr:r}){let i={directory:t},a=String(n??``).trim().slice(0,Ur);return a&&(i.title=a),r&&e?.kind===`herdr`&&e.workspaceID&&(i.herdrWorkspace=e.workspaceID),i}function Kr(e){if(typeof e==`string`&&e)return e.includes(`budget`)?`Quota exceeded`:qr[e]}var qr={"provider.quota":`Quota exceeded`,"provider.free-limit":`Quota exceeded`,"provider.auth":`Authentication failed`,"provider.rate-limit":`Rate limited`,"provider.internal":`Provider unavailable`,"provider.transport":`Provider unavailable`,"provider.timeout":`Provider unavailable`,"provider.content-filter":`Blocked by content filter`,"provider.no-route":`No route to model`,"provider.invalid-request":`Invalid request`,"provider.invalid-output":`Invalid model output`,"provider.unsupported-operation":`Unsupported operation`,"tool.execution":`Tool failed`,"permission.rejected":`Permission rejected`};function Jr(e){return typeof e==`number`&&Number.isInteger(e)&&e>=100&&e<=999?`HTTP ${e}`:void 0}function Yr(e,t){if(typeof e!=`number`||!Number.isFinite(e)||e<=t)return;let n=Math.ceil((e-t)/1e3);if(n<60)return`${n}s`;let r=Math.floor(n/60);return r<60?`${r}m ${n%60}s`:`${Math.floor(r/60)}h ${r%60}m`}var Xr=e=>typeof e==`string`&&e.trim()?e.trim():void 0,Zr=(e,t)=>e.toLowerCase()===t.toLowerCase(),Qr=(e,t)=>e&&t&&!Zr(e,t)?t:void 0;function $r(e){let t=Kr(e.errorType),n=Xr(e.message),r=Jr(e.errorStatus),i=Qr(t,n);return`${t??n??`Error`}${r?` (${r})`:``}${i?`: ${i}`:``}`}function ei(e,t){let n=typeof e.attempt==`number`?` (attempt ${e.attempt})`:``,r=Yr(e.next,t),i=Kr(e.errorType),a=Xr(e.message),o=Qr(i,a),s=i?o?`${i} — ${o}`:i:a;return`Retrying${n}${r?` · next in ${r}`:``}${s?`: ${s}`:``}`}var ti=e=>!!e&&typeof e==`object`&&typeof e.id==`string`;function ni(e,t){let n=Array.isArray(e)?e.filter(ti):[],r=t?n.find(e=>e.id===t):n[0];if(!r)return;if(r.state===`error`)return ri(r);if(r.state===`working`||r.state===`blocked`)return;let i=new Set([r.id]);for(let e=!0;e;){e=!1;for(let t of n)t.parentID&&i.has(t.parentID)&&!i.has(t.id)&&(i.add(t.id),e=!0)}let a=n.find(e=>e.id!==r.id&&i.has(e.id)&&e.state===`error`);return a?ri(a):void 0}function ri(e){let t=Xr(e.detail),n=Jr(e.errorStatus),r=Xr(e.title);return{sessionID:e.id,...r?{title:r}:{},label:Kr(e.errorType)??t??`Error`,...t?{message:t}:{},...n?{status:n}:{},text:$r({errorType:e.errorType,errorStatus:e.errorStatus,message:t})}}var ii=e=>Array.isArray(e)?e:[];function ai(e){return ii(e).flatMap(e=>(Array.isArray(e.jobs)?e.jobs:[]).map(t=>({...t,sessionID:e.id,sessionTitle:e.title??``})))}function oi(e){return ai(e).filter(e=>e.status===`running`).length}function si(e,t){let n=ai(e),r=n.filter(e=>e.status===`running`).sort((e,t)=>(e.started??0)-(t.started??0)),i=n.filter(e=>e.status!==`running`&&e.ended!==void 0&&t-e.ended<=6e4).sort((e,t)=>(t.ended??0)-(e.ended??0));return[...r,...i]}function ci(e){let t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s`;let n=Math.floor(t/60);return n<60?`${n}m ${t%60}s`:`${Math.floor(n/60)}h ${n%60}m`}function li(e,t){if(e.status===`running`)return e.started===void 0?`running`:`running · ${ci(t-e.started)}`;let n=e.status===`killed`?`killed`:e.status===`timeout`?`timed out`:void 0,r=e.exit===void 0?void 0:`exit ${e.exit}`,i=e.started!==void 0&&e.ended!==void 0?ci(e.ended-e.started):void 0;return n?[n,r].filter(Boolean).join(` · `):[r??`ended`,i].filter(Boolean).join(` · `)}function ui(e){return e<=0?``:`${e} job${e===1?``:`s`}`}function di(e,t,n=Date.now()){let r=ii(e),i=(t?r.find(e=>e.id===t&&e.retry):void 0)??r.find(e=>e.retry);return i?.retry?ei(i.retry,n):void 0}function fi(e,t,n,r=new Set){let i=new Set(t.pinnedSessions),a=new Set(t.hiddenSessions),o=Ir(t),s=[];for(let t of e??[])for(let e of Fr(t)){if(r.has(e.id))continue;let c=Vr(e,t,i),l=c.open?c.terminal?.source===`herdr`?`herdr`:`tui`:`background`,u=n[c.id],d=c.state===`working`?di(e.status,void 0,1/0):void 0,f=c.state===`error`?ni(e.status,c.id)?.text??`Error`:void 0;s.push({...c,machineName:t.name,machineOnline:!!t.online,source:l,running:c.state===`working`||c.state===`blocked`,hidden:o(e),archived:a.has(c.id),unread:u!==void 0&&c.updated>u,group:jr(e),jobs:oi(e.status),...d?{retry:d}:{},...f?{error:f}:{}})}return s.sort((e,t)=>t.updated-e.updated)}function pi(e,t){if(!e?.length)return t;let n=new Map(e.map(e=>[e.id,e]));return t.map(e=>{let t=n.get(e.id);return t&&JSON.stringify(t)===JSON.stringify(e)?t:e})}var N=Object.freeze({query:``,filters:Object.freeze({status:`all`,source:`all`,machine:``,archived:!1}),sort:Object.freeze({key:`activity`,dir:`desc`})}),mi=[`status`,`title`,`project`,`server`,`source`,`activity`],hi=[`all`,`needs`,`running`,`idle`],gi=[`all`,`open`,`background`],P=(e,t)=>e.localeCompare(t,void 0,{sensitivity:`base`}),F=(e,t)=>t.updated-e.updated,_i={status:(e,t)=>j[e.state]-j[t.state]||F(e,t),title:(e,t)=>P(e.title,t.title)||F(e,t),project:(e,t)=>P(e.workspace,t.workspace)||F(e,t),server:(e,t)=>P(e.machineName,t.machineName)||F(e,t),source:(e,t)=>P(e.source,t.source)||F(e,t),activity:(e,t)=>e.updated-t.updated};function vi(e,t){let n=t.status===`needs`&&e.state===`blocked`;return!((t.archived?!e.hidden:e.hidden&&!n)||t.status===`needs`&&!wi(e)||t.status===`running`&&!e.running||t.status===`idle`&&e.running||t.source===`open`&&e.source===`background`||t.source===`background`&&e.source!==`background`||t.machine&&e.machineID!==t.machine)}function yi(e,t){if(!t.trim()||lr(e,t))return!0;let n=sr(t).split(/\s+/).filter(Boolean),r=[e.title,e.workspace,e.where,e.directory,e.machineName].map(sr);return n.every(e=>r.some(t=>t.includes(e)))}function bi(e,t){let n=_i[t.sort.key],r=t.sort.key===`activity`?t.sort.dir===`desc`?-1:1:t.sort.dir===`asc`?1:-1;return e.filter(e=>vi(e,t.filters)&&yi(e,t.query)).sort((e,t)=>r*n(e,t))}var xi=(e,t,n)=>t.includes(e)?e:n;function Si(e){let t;try{if(t=JSON.parse(e??`null`)??{},typeof t!=`object`||Array.isArray(t))return N}catch{return N}let n=t.filters??{},r=t.sort??{},i=N,a=xi(r.key,mi,i.sort.key),o=a===r.key?xi(r.dir,[`asc`,`desc`],i.sort.dir):i.sort.dir,s=a===i.sort.key&&o===i.sort.dir?i.sort:{key:a,dir:o},c={status:xi(n.status,hi,i.filters.status),source:xi(n.source,gi,i.filters.source),machine:typeof n.machine==`string`&&n.machine.length<=200?n.machine:``,archived:n.archived===!0||n.hidden===!0},l=Object.keys(c).every(e=>c[e]===i.filters[e]);return l&&s===i.sort?N:{query:``,filters:l?i.filters:c,sort:s}}function Ci(e){return JSON.stringify({filters:e.filters,sort:e.sort})}var wi=e=>e.state===`blocked`||e.state===`error`&&!e.hidden;function Ti(e,{query:t,groupBy:n,sortBy:r,recentLimit:i=20}){let a=e.filter(e=>!e.hidden),o=e.filter(wi),s=r===`title`?(e,t)=>P(e.title,t.title)||F(e,t):F;if(t.trim())return[{id:`results`,title:`Results`,kind:`results`,rows:a.filter(e=>yi(e,t)).sort(F)}];let c=new Set,l=e=>{for(let t of e)c.add(t.id);return e},u=[],d=e=>e.rows.length&&u.push(e);d({id:`needs`,title:`Needs you`,kind:`needs`,rows:l(o.sort(F))}),d({id:`running`,title:`Running`,kind:`running`,rows:l(a.filter(e=>!c.has(e.id)&&e.running).sort(F))}),d({id:`pinned`,title:`Pinned`,kind:`pinned`,rows:l(a.filter(e=>!c.has(e.id)&&e.pinned).sort(s))});let f=new Map;for(let e of a){if(c.has(e.id)||!e.open)continue;let t=n===`machine`?e.machineID:`${e.machineID}\u0000${e.group}`,r=f.get(t);r||(r={title:n===`machine`?e.machineName:e.workspace,key:n===`machine`?e.machineID:e.group,machineID:e.machineID,directory:e.directory,rows:[]},f.set(t,r)),r.rows.push(e)}let p=e=>Math.max(...e.map(e=>e.updated)),m=[...f.values()].sort((e,t)=>r===`title`&&P(e.title,t.title)||p(t.rows)-p(e.rows));for(let e of m){e.rows.sort(s),l(e.rows);let t=[...e.rows].sort(F);d({id:`group:${e.machineID}:${e.key}`,title:e.title,kind:`group`,key:e.key,machineID:e.machineID,directory:t[0].directory,rows:e.rows})}return d({id:`recents`,title:`Recents`,kind:`recents`,rows:a.filter(e=>!c.has(e.id)).sort(F).slice(0,i)}),u}var Ei=864e5;function Di(e,t,n){if(!Number.isInteger(t)||t<1)return[];let r=n-t*Ei;return e.filter(e=>!e.hidden&&!e.running&&!e.pinned&&!e.open&&e.updated<r)}function Oi(e,t){return t.phase!==`off`&&t.sessionID===e.id||e.conversation===!0}function ki(e,t,n,r){let i=`${e} of ${t} sessions`;return!r||!n?i:`${i} · ${n===1?`1 Decision waits`:`${n} Decisions wait`} for you (above)`}var Ai=.75,ji=.05;function Mi(e){let t=typeof e==`string`?e.trim()?Number(e):NaN:Number(e??NaN);if(!Number.isFinite(t))return 1;let n=Math.round(t/ji)/Math.round(1/ji);return Math.min(2,Math.max(Ai,Number(n.toFixed(2))))}function Ni(e){let t=Mi(e);return`${Number.isInteger(t)?t.toFixed(1):String(t)}×`}var Pi={working:`working`,blocked:`blocked`,error:`failed`,idle:`done`},Fi=160,Ii=class{rootID;max;maxSubagents;maxText;items=[];subagents=new Map;seq=0;rootState;rootSince;busyAt;writing;lastAt;constructor(e,{max:t=30,maxSubagents:n=10,maxText:r=4e3}={}){this.rootID=e,this.max=t,this.maxSubagents=n,this.maxText=r}touch(e){e!==void 0&&Number.isFinite(e)&&!((this.lastAt??-1/0)>=e)&&(this.lastAt=e)}reasoning(e,t,n,r=Date.now()){let i=`thinking:${t}`;this.items.some(e=>e.id===i)||this.activity(e,{id:i,kind:`thinking`,state:`running`,at:r});let a=this.items.find(e=>e.id===i);a&&(a.text=`${a.text??``}${n??``}`.slice(-this.maxText)),this.touch(r)}text(e,t,n,r=Date.now()){for(let t of this.items)t.sessionID===e&&t.kind===`thinking`&&t.state===`running`&&(t.state=`done`);if(this.touch(r),e===this.rootID){this.writing={messageID:t,at:r};return}let i=this.subagents.get(e);i||(i={id:e,state:`working`,at:r},this.subagents.set(e,i),this.trim()),i.msg!==t&&(i.out=``),i.msg=t,i.out=`${i.out??``}${n??``}`.slice(-600);let a=i.out.split(`
|
|
9
|
-
`).map(e=>e.trim()).filter(Boolean).at(-1);a&&(i.line=a.length>Fi?`…${a.slice(-159)}`:a)}activity(e,t){if(!t||typeof t.id!=`string`)return;let n=t.sessionID??e??this.rootID,r=this.items.find(e=>e.id===t.id);if(r){r.state=t.state??r.state,t.error!==void 0&&(r.error=t.error),t.summary&&(r.summary=t.summary),t.tool&&(r.tool=t.tool),this.touch(t.at);return}let i=Number.isFinite(t.at)?t.at:Date.now();this.touch(i);for(let e of this.items)e.sessionID===n&&e.kind===`thinking`&&e.state===`running`&&e.at<=i&&(e.state=`done`);let a={id:t.id,sessionID:n,kind:t.kind===`thinking`?`thinking`:`tool`,tool:t.tool,summary:t.summary,state:t.state??`running`,error:t.error,at:i,seq:++this.seq},o=this.items.length;for(;o>0&&this.items[o-1].at>i;)o--;this.items.splice(o,0,a),n!==this.rootID&&!this.subagents.has(n)&&this.subagents.set(n,{id:n,state:`working`,at:i}),this.trim()}load(e){for(let t of[...e??[]].sort((e,t)=>(e.at??0)-(t.at??0)))this.activity(t.sessionID??this.rootID,t)}status(e,t=Date.now()){let n=new Set,r=this.stateKey(),i;for(let r of e??[]){if(r.id===this.rootID){i=r;continue}n.add(r.id);let e=Pi[r.state]??`working`,a=this.subagents.get(r.id);a?(a.state=e,r.title&&(a.title=r.title),a.since=r.since):e!==`done`&&this.subagents.set(r.id,{id:r.id,title:r.title,state:e,at:t,since:r.since})}for(let e of this.subagents.values())!n.has(e.id)&&(e.state===`working`||e.state===`blocked`)&&(e.state=`done`);let a=i?.state===`working`||i?.state===`blocked`||[...this.subagents.values()].some(e=>e.state===`working`||e.state===`blocked`);if(i&&!a)for(let e of this.items)e.state===`running`&&(e.state=`done`);i&&(this.rootState=i.state,this.rootSince=i.since,i.state!==`working`&&(this.writing=void 0)),this.rootState===`working`||[...this.subagents.values()].some(e=>e.state===`working`)?this.busyAt===void 0&&(this.busyAt=t):this.busyAt=void 0,r!==void 0&&r!==this.stateKey()&&this.touch(t),this.trim()}stateKey(){if(this.rootState!==void 0)return[this.rootState,...[...this.subagents.values()].map(e=>`${e.id}=${e.state}`)].join(` `)}trim(){for(;this.items.length>this.max;){let e=this.items.findIndex(e=>e.state!==`running`);this.items.splice(e===-1?0:e,1)}if(this.subagents.size>this.maxSubagents){let e=[...this.subagents.values()].filter(e=>e.state===`done`||e.state===`failed`).sort((e,t)=>e.at-t.at);for(let t of e.slice(0,this.subagents.size-this.maxSubagents))this.subagents.delete(t.id)}}rows(){let e=e=>!(e.kind===`thinking`&&e.state!==`running`&&!e.text),t=(e,t)=>({key:e.id,depth:t,kind:e.kind,label:e.kind===`thinking`&&e.state!==`running`?`Thought`:Ri(e),state:e.state,error:e.error,sessionID:e.sessionID,...e.text?{text:e.text}:{}}),n=[];for(let r of this.items)r.sessionID===this.rootID&&e(r)&&n.push({at:r.at,seq:r.seq,rows:[t(r,0)]});for(let r of this.subagents.values())n.push({at:r.at,seq:0,rows:[{key:`sub:${r.id}`,depth:0,kind:`subagent`,label:r.title||r.id,state:r.state,sessionID:r.id,...r.line?{line:r.line}:{}},...this.items.filter(t=>t.sessionID===r.id&&e(t)).map(e=>t(e,1))]});return n.sort((e,t)=>e.at-t.at||e.seq-t.seq).flatMap(e=>e.rows)}now(){for(let e=this.items.length-1;e>=0;e--)if(this.items[e].state===`running`)return Ri(this.items[e]);let e=[...this.subagents.values()].reverse().find(e=>e.state===`working`);return e?`Subagent: ${e.title||e.id}`:void 0}pulse(){let e=[...this.subagents.values()].filter(e=>e.state===`working`),t=this.rootState===`working`,n=t||e.length>0,r=!n&&(this.rootState===`blocked`||[...this.subagents.values()].some(e=>e.state===`blocked`)),i=r?`Needs you`:`Idle`,a;if(n){let n=this.items.filter(e=>e.sessionID===this.rootID),r=[...n].reverse().find(e=>e.state===`running`),o=r?r.kind===`thinking`?`Thinking`:`Running ${Ri(r)}`:void 0,s=this.writing;s&&!n.some(e=>e.at>s.at)&&(o=`Writing reply`);let c=e.length,l=c===0?``:o||c>1?`${c} subagent${c===1?``:`s`} working`:`Subagent “${e[0].title||e[0].id}” working`;i=o&&l?`${o} · ${l}`:o||l||`Working`;let u=[t?this.rootSince:void 0,...e.map(e=>e.since)].filter(e=>typeof e==`number`&&Number.isFinite(e));a=u.length?Math.min(...u):this.busyAt}return{busy:n,blocked:r,label:i,since:a,lastAt:this.lastAt}}};function Li(e){let t=Math.max(0,Math.floor((Number(e)||0)/1e3)),n=e=>String(e).padStart(2,`0`);return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m ${n(t%60)}s`:`${Math.floor(t/3600)}h ${n(Math.floor(t%3600/60))}m`}function Ri(e){if(e.kind===`thinking`)return`Thinking…`;let t=e.tool||`tool`;return e.summary?`${t} · ${e.summary}`:t}var zi=Object.freeze({working:Object.freeze([`On it.`,`Give me a sec.`,`One moment.`,`Let me check.`,`Okay, looking into it.`,`Sure, one sec.`,`Hang on.`,`Let me see.`,`Checking now.`,`Bear with me.`]),subagent:Object.freeze([`I'll hand that off.`,`Starting that in the background.`,`Sending that off now.`,`Getting a helper on it.`,`Passing that along.`]),still:Object.freeze([`Still on it.`,`Almost there.`,`Still working through it.`,`Bear with me, still going.`,`Taking a bit longer.`])});function Bi(){let e=Object.values(zi),t=[];for(let n=0;n<Math.max(...e.map(e=>e.length));n++)for(let r of e)n<r.length&&t.push(r[n]);return t}var Vi=class{rng;ready;bags=new Map;last=new Map;used=new Map;count=0;constructor({rng:e=Math.random,ready:t=()=>!0}={}){this.rng=e,this.ready=t}pick(e){let t=zi[e],n=this.last.get(e),r=this.bags.get(e);r?.length||(r=this.shuffle(t),r.length>1&&r[0]===n&&r.push(r.shift()),this.bags.set(e,r));let i=e=>e!==n||t.length<2,a=r.findIndex(e=>i(e)&&this.ready(e)),o;if(a>=0)o=r.splice(a,1)[0];else{let e=t.filter(e=>i(e)&&this.ready(e)).sort((e,t)=>(this.used.get(e)??0)-(this.used.get(t)??0))[0];e?o=e:(a=r.findIndex(i),o=a>=0?r.splice(a,1)[0]:t.find(i))}return o??=t[0],this.last.set(e,o),this.used.set(o,++this.count),o}shuffle(e){let t=[...e];for(let e=t.length-1;e>0;e--){let n=Math.floor(this.rng()*(e+1));[t[e],t[n]]=[t[n],t[e]]}return t}},Hi=class{ackMs;quietMs;stillMs;enabled=!0;busy=!1;awaiting;pendingSubagent=!1;lastSay=-1/0;lastSpoke=-1/0;user=!1;agent=!1;cue=!1;pick;constructor({ackMs:e=2500,quietMs:t=3e3,stillMs:n=4e4,pick:r}={}){if(!r){let e=new Vi;r=t=>e.pick(t)}this.pick=r,this.ackMs=e,this.quietMs=t,this.stillMs=n}get gated(){return this.user||this.agent||this.cue}heard(e,{tone:t=!0}={}){return this.awaiting=Math.min(this.awaiting??e,e),t&&this.enabled&&!this.user?[{type:`earcon`,name:`heard`}]:[]}awaitReply(e){this.awaiting=e}speechEnded(e){return this.userTalking(!1,e),this.enabled?[{type:`earcon`,name:`heard`}]:[]}working(e,t){e&&!this.busy&&(this.lastSpoke=Math.max(this.lastSpoke,t)),e||(this.awaiting=void 0,this.pendingSubagent=!1),this.busy=e}agentSaid(e){this.lastSay=e,this.spoke(e)}agentSpeaking(e,t){this.agent=e,this.spoke(t)}userTalking(e,t){this.user=e,e||(this.lastSpoke=Math.max(this.lastSpoke,t))}cueSpeaking(e,t){this.cue=e,e||(this.lastSpoke=Math.max(this.lastSpoke,t))}subagentStarted(e){e-this.lastSay>=this.quietMs&&(this.pendingSubagent=!0)}subagentFinished(e){return this.enabled&&!this.user?[{type:`earcon`,name:`done`}]:[]}nextDue(e){if(this.enabled&&!this.gated){if(this.pendingSubagent)return e;if(this.busy)return Math.min(this.awaiting===void 0?1/0:this.awaiting+this.ackMs,this.lastSpoke+this.stillMs)}}tick(e){return!this.enabled||this.gated?[]:this.pendingSubagent?this.say(`subagent`,e):this.awaiting!==void 0&&this.busy&&e-this.awaiting>=this.ackMs?this.say(`working`,e):this.busy&&e-this.lastSpoke>=this.stillMs?this.say(`still`,e):[]}spoke(e){this.awaiting=void 0,this.pendingSubagent=!1,this.lastSpoke=Math.max(this.lastSpoke,e)}say(e,t){return this.spoke(t),[{type:`speak`,cue:e,text:this.pick(e)}]}},Ui=class{scheduler;playFn;ready;now;setTimer;clearTimer;timer;constructor({scheduler:e,play:t,ready:n=()=>!0,now:r=()=>Date.now(),setTimer:i=(e,t)=>setTimeout(e,t),clearTimer:a=e=>clearTimeout(e)}){this.scheduler=e,this.playFn=t,this.ready=n,this.now=r,this.setTimer=i,this.clearTimer=a}poke(){if(this.stop(),this.ready())for(let e=0;e<3;e++){let e=this.now(),t=this.scheduler.nextDue(e);if(t===void 0||!Number.isFinite(t))return;if(t>e){this.timer=this.setTimer(()=>{this.timer=void 0,this.poke()},t-e);return}let n=this.scheduler.tick(e);n.length&&this.playFn(n)}}stop(){this.timer!==void 0&&this.clearTimer(this.timer),this.timer=void 0}},Wi=new Set([`working`,`blocked`]);function Gi(e,t,n){let r=new Map((e??[]).filter(e=>e.id!==n).map(e=>[e.id,e.state])),i=[],a=[];for(let e of t??[]){if(e.id===n)continue;let t=r.get(e.id);r.delete(e.id),e.state===`working`&&!Wi.has(t??``)?i.push(e.id):Wi.has(t??``)&&!Wi.has(e.state)&&a.push(e.id)}for(let[e,t]of r)Wi.has(t)&&a.push(e);return{started:i,finished:a}}function Ki(e){return(e??[]).some(e=>e.state===`working`)}var qi=Object.freeze([`openrouter`,`openai-compatible`]),Ji={stt:[`provider`,`model`,`baseURL`,`language`],tts:[`provider`,`model`,`voice`,`baseURL`,`speed`]},I=e=>e==null?``:String(e).trim();function Yi(e){let t={};for(let n of[`stt`,`tts`]){let r=e?.[n]??{};t[n]=Object.fromEntries(Ji[n].map(e=>[e,I(r[e])])),t[n].apiKey={action:`keep`,value:``}}return t}function Xi(e,t){let n={};for(let r of[`stt`,`tts`]){let i=e?.[r]??{},a=t[r],o={};for(let e of Ji[r]){if(e===`baseURL`&&I(a.provider)!==`openai-compatible`)continue;let t=I(a[e]);t!==I(i[e])&&(o[e]=t===``?null:e===`speed`?Number(t):t)}a.apiKey?.action===`set`?o.apiKey=I(a.apiKey.value):a.apiKey?.action===`clear`&&(o.apiKey=null),Object.keys(o).length&&(n[r]=o)}return n}function Zi(e){let t={};for(let n of[`stt`,`tts`]){let r=e[n],i=(e,r)=>t[`${n}.${e}`]=r;if(qi.includes(I(r.provider))||i(`provider`,`Choose a provider.`),I(r.model)||i(`model`,`Enter a model.`),I(r.provider)===`openai-compatible`){let e=I(r.baseURL);e?/^https?:\/\/[^\s/]+/i.test(e)||i(`baseURL`,`Enter an http:// or https:// URL.`):i(`baseURL`,`Enter the server's base URL.`)}if(n===`tts`){I(r.voice)||i(`voice`,`Enter a voice.`);let e=I(r.speed);e&&!(Number(e)>=.25&&Number(e)<=4)&&i(`speed`,`Use a number from 0.25 to 4.`)}r.apiKey?.action===`set`&&!I(r.apiKey.value)&&i(`apiKey`,`Paste the new key, or cancel.`)}return t}function Qi(e,t){let n;for(let r of Object.keys(e??{}))String(t??``).startsWith(r)&&(n===void 0||r.length>n.length)&&(n=r);return n===void 0?[]:[...e[n]??[]]}var $i=/^(localhost|127(?:\.\d{1,3}){3}|\[::1\])$/i;function ea(e,t){if(!e||e.stt&&e.tts)return;let n=!1;try{n=$i.test(new URL(t??``).hostname)}catch{n=!1}return{reason:e.reason||`Choose a speech provider and add its API key in Settings → Speech.`,micBlocked:!e.stt,...n?{storage:`Keys are stored on this computer in ~/.local/state/hub`}:{}}}var ta=()=>({machines:void 0,reads:{},prefs:vr({}),prefsSource:`unknown`,prefsPending:0,prefsStale:!1,connection:`connecting`,enrollmentRev:0}),na=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function ra(e,t,n){for(let r of e??[])for(let e of r.processes)for(let r of e.sessions)r.id===t&&n(r)}function ia(e,t){if(!na(t)||typeof t.type!=`string`)return!1;switch(t.type){case`catalog`:return Array.isArray(t.machines)?(e.machines=t.machines,!0):!1;case`status`:{if(typeof t.sessionID!=`string`||!Array.isArray(t.sessions))return!1;let n=!1;return ra(e.machines,t.sessionID,e=>{e.status=t.sessions,n=!0}),n}case`conversation`:{if(typeof t.sessionID!=`string`||typeof t.on!=`boolean`)return!1;let n=!1;return ra(e.machines,t.sessionID,e=>{e.conversation=t.on,n=!0}),n}case`reads`:return na(t.reads)?(e.reads=Object.fromEntries(Object.entries(t.reads).filter(e=>typeof e[1]==`number`)),!0):!1;case`prefs`:return e.prefsSource===`hub`?e.prefsPending?(e.prefsStale=!0,!0):(e.prefs=vr(t.prefs),!0):!1;case`enrollment`:return e.enrollmentRev++,!0;case`handoff`:return typeof t.sessionID==`string`&&(e.notice={kind:`handoff`,sessionID:t.sessionID,at:Date.now()},!0);default:return!1}}function aa(e,t){let n;for(let r of e??[])for(let e of r.processes){let i=e.sessions.find(e=>e.id===t);i&&(!n||(i.updated??0)>(n.session.updated??0))&&(n={session:i,machine:r,process:e})}return n??oa(e,t)}function oa(e,t){for(let n of e??[])for(let e of n.processes)for(let r of e.sessions){let i=Array.isArray(r.status)?r.status:[],a=i.find(e=>e.id===t);if(!a||r.id===t)continue;let o=sa(i,t),s=i.filter(e=>e.id&&o.has(e.id)),c=s.some(e=>e.state===`blocked`)?`blocked`:a.state===`error`?`error`:s.some(e=>e.state===`working`)?`working`:`idle`;return{session:{...r,id:t,title:a.title??``,...a.parentID?{parentID:a.parentID}:{},rootID:r.id,state:c,blockers:a.blockers??[],busy:!1,conversation:!1},machine:n,process:e}}}function sa(e,t){let n=new Set([t]);for(let t=!0;t;){t=!1;for(let r of e??[])r.id&&r.parentID&&n.has(r.parentID)&&!n.has(r.id)&&(n.add(r.id),t=!0)}return n}function ca(e){return(e??[]).some(e=>e.state===`working`||e.state===`blocked`)}var la=class{max;feeds=new Map;constructor(e=50){this.max=e}has(e){return this.feeds.has(e)}feed(e,t){let n=this.feeds.get(e);if(!n)for(n=new Ii(e),t&&n.status(t),this.feeds.set(e,n);this.feeds.size>this.max;)this.feeds.delete(this.feeds.keys().next().value);return n}apply(e){if(!na(e))return;let t=typeof e.sessionID==`string`?e.sessionID:void 0;if(!t)return;let n=typeof e.rootID==`string`?e.rootID:t,r=typeof e.messageID==`string`?e.messageID:void 0;switch(e.type){case`activity`:return na(e.item)?(this.feed(n).activity(t,e.item),n):void 0;case`delta`:return typeof e.text!=`string`||!e.text?void 0:(this.feed(n).text(t,r,e.text),n);case`reasoning`:return typeof e.delta!=`string`||!e.delta?void 0:(this.feed(n).reasoning(t,r??`unknown`,e.delta),n);case`status`:return Array.isArray(e.sessions)?(this.feed(t).status(e.sessions),t):void 0;default:return}}};function ua(e,t){let n=new URLSearchParams;e.lite&&n.set(`lite`,`1`),e.session&&n.set(`session`,e.session),e.sessions&&e.sessions.length>1&&n.set(`sessions`,e.sessions.join(`,`)),t&&n.set(`last`,t);let r=n.toString().replace(/\+/g,`%20`);return r?`/api/events?${r}`:`/api/events`}var da=class{deps;state=`stopped`;lastID;scope={lite:!1};hideTimer;staleTimer;constructor(e){this.deps=e}start(e){this.scope=e,this.reopen(`start`)}received(e){e&&(this.lastID=e),this.state===`open`&&this.watch()}setScope(e){let t=ua(e)===ua(this.scope);this.scope=e,!t&&this.state===`open`&&this.reopen(`scope`)}hidden(){this.state===`open`&&this.hideTimer===void 0&&(this.hideTimer=this.deps.setTimer(()=>{this.hideTimer=void 0,!(this.state!==`open`||this.deps.keepOpen())&&(this.clear(),this.state=`paused`,this.deps.close())},this.deps.hiddenMs??3e4))}visible(){this.hideTimer!==void 0&&(this.deps.clearTimer(this.hideTimer),this.hideTimer=void 0),this.state===`paused`&&this.reopen(`resume`)}reopen(e=`reconnect`){this.state===`open`&&this.deps.close(),this.clear(),this.state=`open`,this.deps.open(ua(this.scope,this.lastID),e),this.watch()}stop(){if(this.state===`stopped`)return;this.clear();let e=this.state===`open`;this.state=`stopped`,e&&this.deps.close()}watch(){this.staleTimer!==void 0&&this.deps.clearTimer(this.staleTimer),this.staleTimer=this.deps.setTimer(()=>{this.staleTimer=void 0,this.state===`open`&&this.reopen(`stale`)},this.deps.staleMs??45e3)}clear(){for(let e of[this.hideTimer,this.staleTimer])e!==void 0&&this.deps.clearTimer(e);this.hideTimer=this.staleTimer=void 0}};function fa(e,t){return t===`scope`&&e===`live`?{connection:`live`,reconnecting:!1}:{connection:`connecting`,reconnecting:e!==`connecting`}}var pa=e=>e===`app:concierge`||e===`app concierge`,ma=/^(ses_[A-Za-z0-9]+)(?: \(sub ses_[A-Za-z0-9]+\))? (.*)$/,ha=/^[!+-] (.*)$/,ga=/^… (\d+) more updates not listed$/,_a=2,va={permission:`needs a permission`,question:`has a question`};function ya(e,t){let n=/^machine \S+ (online|offline)$/.exec(e);if(n)return`a machine went ${n[1]}`;let r=ma.exec(e);if(!r)return`something changed`;let i=t(r[1])??r[1],a=r[2];if(/^turn_done\b/.test(a))return`${i} finished a turn`;let o=/^blocker:(\w+)/.exec(a);if(o)return`${i} ${va[o[1]]??`is blocked (${o[1]})`}`;if(/^blocker_closed\b/.test(a))return`${i} was unblocked`;if(a===`state:error`)return`${i} hit an error`;if(a===`online`)return`${i} came online`;if(a===`offline`||a===`state:offline`)return`${i} went offline`;if(a===`state:working`)return`${i} started working`;let s=/^state:(\w+)$/.exec(a);if(s)return`${i} is ${s[1]}`;if(/^decision dec_/.test(a))return`${i} has a Decision for you`;let c=/^launch \S+ ended:(\w+)$/.exec(a);return c?`${i}'s launch ended (${c[1]})`:/^intent_cleared\b/.test(a)||/^intent:title\b/.test(a)?`${i}'s intent was cleared (it shows its title again)`:/^intent:/.test(a)?`${i}'s intent changed`:a===`pinned`||a===`unpinned`?`${i} was ${a}`:`${i} changed`}function ba(e,t){if(typeof e!=`string`)return;let[n=``,...r]=e.split(`
|
|
10
|
-
`),i=/^Concierge digest \(.*?\) b\d+ .*?: (.*)$/.exec(n);if(i)return`Digest: ${i[1]}`;if(!/^Concierge update b\d+ /.test(n))return;if(/ changes were missed | some changes were missed/.test(n))return`Update: some changes were missed — catching up`;let a=[],o=0;for(let e of r){let n=ga.exec(e);n&&(o+=Number(n[1]));let r=ha.exec(e);r&&(a.length<_a?a.push(ya(r[1],t)):o++)}return/· quiet hours ended: /.test(n)&&a.unshift(`quiet hours ended`),a.length||a.push(`something changed in your sessions`),`Update: ${[...a,...o?[`${o} more`]:[]].join(` · `)}`}var xa=60,Sa=/(`[^`]*`|\]\([^)]*\)|<[a-z][a-z0-9+.-]*:[^>\s]*>|\b[a-z][a-z0-9+.-]*:\/\/[^\s<>()]+)|(?<![\w#/[(])((?:Decision )?)(dec_[A-Za-z0-9]{1,64})(?!\w)/g,Ca=e=>{let t=Intl.Segmenter;return t?Array.from(new t(void 0,{granularity:`grapheme`}).segment(e),e=>e.segment):Array.from(e)},wa=e=>{let t=e.replace(/\s+/g,` `).trim(),n=Ca(t);return n.length>xa?`${n.slice(0,59).join(``)}…`:t};function Ta(e){if(!e.includes(`dec_`))return[];let t=new Set;for(let n of e.matchAll(Sa))!n[1]&&n[3]&&t.add(n[3]);return[...t]}function Ea(e,t,n={}){let r=n.unknown===`link`;if(!t.length&&!r||!e.includes(`dec_`))return[{text:e}];let i=new Map(t.map(e=>[e.id,e])),a=[],o=0,s=e=>{let t=a.at(-1);!e.href&&t&&!t.href?a[a.length-1]={text:t.text+e.text}:e.text&&a.push(e)};for(let t of e.matchAll(Sa)){let[n,a,c,l]=t;if(a||!l)continue;let u=i.get(l);if(!u&&!r)continue;s({text:e.slice(o,t.index)});let d=`/concierge#decision-${l}`;if(u){let e=`Decision “${wa(u.question)}”`;s({text:u.state===`open`?e:`${e} (${u.state})`,href:d})}else s({text:c&&e.startsWith(`: `,t.index+n.length)?`Decision (answered)`:c?`Decision`:`a Decision`,href:d});o=t.index+n.length}return s({text:e.slice(o)}),a.length?a:[{text:e}]}function Da(e,t,n={}){return Ea(e,t,n).map(e=>e.href?`[${Oa(e.text)}](${e.href})`:e.text).join(``)}var Oa=e=>e.replace(/[\\`*_[\]<>~=]/g,`\\$&`);function ka(e,t){return e.replace(/(?<![\w/])ses_[A-Za-z0-9]{1,64}(?!\w)/g,e=>t(e)??e)}function Aa(e){if(e.state===`expired`)return`Expired without an answer`;if(e.state===`closed`)return e.closed?.reason?`Closed: ${e.closed.reason}`:`Closed`;let t=e.answer,n=t?.option===void 0?t?.text:e.options.find(e=>e.id===t.option)?.label??t.option;return!t||n===void 0?`Answered`:t.answeredBy===`timeout`?`Answered “${n}” when it timed out`:`You answered “${n}”`}var ja=2e3,Ma=6e4,Na=class{options;found=new Map;missing=new Set;failures=new Map;asking=new Map;queue=[];running=0;now;constructor(e){this.options=e,this.now=e.now??Date.now}recall(e){let t=this.found.get(e);if(t!==void 0)return Promise.resolve(t);if(this.missing.has(e))return Promise.resolve(void 0);let n=this.asking.get(e);if(n)return n;let r=this.failures.get(e);if(r&&this.now()<r.retryAt)return Promise.resolve(void 0);let i=this.running<4?this.ask(e):new Promise(e=>this.queue.push(e)).then(()=>this.ask(e));return this.asking.set(e,i),i}async ask(e){this.running++;try{let t=this.options.parse(await this.options.fetch(e));return this.failures.delete(e),t===void 0?this.missing.add(e):this.found.set(e,t),t}catch(t){let n=this.options.status(t);if(n!==void 0&&n!==429&&n<500)this.failures.delete(e),this.missing.add(e);else{let t=(this.failures.get(e)?.count??0)+1;this.failures.set(e,{count:t,retryAt:this.now()+Math.min(ja*2**(t-1),Ma)})}return}finally{this.running--,this.asking.delete(e),this.queue.shift()?.()}}};function Pa(e,t){let n=new Set;for(let r of e)if((r.type===`assistant`?r.live!==!0:r.type===`message`&&!r.primer&&!pa(r.from))&&typeof r.text==`string`)for(let e of Ta(r.text))t.has(e)||n.add(e);return[...n]}var Fa=new Set([`disabled`,`starting`,`running`,`waiting_machine`,`backoff`,`failed`,`stopping`]),L=e=>typeof e==`object`&&!!e&&!Array.isArray(e),R=e=>typeof e==`string`,Ia=e=>typeof e==`number`&&Number.isFinite(e);function La(e){if(L(e)&&R(e.state)&&Fa.has(e.state))return{state:e.state,...R(e.reason)?{reason:e.reason.slice(0,200)}:{},...R(e.sessionID)?{sessionID:e.sessionID}:{},hiddenSessionIDs:Array.isArray(e.hiddenSessionIDs)?e.hiddenSessionIDs.filter(R):[],...R(e.launchID)?{launchID:e.launchID}:{},...R(e.machineID)?{machineID:e.machineID}:{},generation:Ia(e.generation)?e.generation:0,since:Ia(e.since)?e.since:0,...Ia(e.nextAttemptAt)?{nextAttemptAt:e.nextAttemptAt}:{}}}function Ra(e){if(!L(e)||!L(e.settings))return;let t=La(e.status);if(!t)return;let n=Array.isArray(e.machines)?e.machines.filter(L).filter(e=>R(e.id)&&R(e.name)).map(e=>({id:e.id,name:e.name,eligible:e.eligible===!0,online:e.online===!0,...R(e.reason)?{reason:e.reason}:{},roots:Array.isArray(e.roots)?e.roots.filter(R):[]})):[];return{settings:e.settings,status:t,machines:n}}function za(e,t,n){let r=new Set(e?e.hiddenSessionIDs:n??[]);for(let e of t??[])for(let t of e.processes??[])for(let e of t.sessions??[])(e.agent===`concierge`||e.contextRevision!==void 0)&&r.add(e.id);return r}var Ba=4e3,Va=(e,t,n)=>e||t&&n;function Ha(e,t,n,r,i,a){return za(t,r,a).has(e)?`concierge`:!n||i===!1&&!Ua(e,r)?`wait`:`session`}var Ua=(e,t)=>(t??[]).some(t=>(t.processes??[]).some(t=>(t.sessions??[]).some(t=>t.id===e))),Wa=e=>`concierge.hidden.${e??`local`}`;function Ga(e){let t=[];for(let n=0;n<e.length;n++){let r=e.key(n);(r===`concierge.hidden`||r?.startsWith(`concierge.hidden.`))&&t.push(r)}for(let n of t)e.removeItem(n)}function Ka(e){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`string`&&e.length<=128).slice(-20):[]}catch{return[]}}var qa=e=>e<6e4?`${Math.max(1,Math.ceil(e/1e3))} s`:`${Math.ceil(e/6e4)} min`;function Ja(e,t,n){if(!e)return`Off`;let r=t.find(t=>t.id===e.machineID)?.name??`its machine`;switch(e.state){case`disabled`:return`Off`;case`starting`:return e.reason?.startsWith(`Waiting`)?e.reason:`Starting on ${r}`;case`running`:return`Running on ${r}`;case`waiting_machine`:return`Waiting for ${r}${e.reason?`: ${e.reason}`:``}`;case`backoff`:return e.nextAttemptAt===void 0?`Relaunching`:`Relaunching in ${qa(e.nextAttemptAt-n)}`;case`failed`:return`Failed${e.reason?`: ${e.reason}`:``}`;case`stopping`:return`Stopping`}}function Ya(e){let t=e=>e.eligible?0:e.online?2:1;return[...e].sort((e,n)=>t(e)-t(n)||e.name.localeCompare(n.name)).map(e=>({...e,selectable:e.eligible||!e.online,note:e.eligible?`Ready`:e.online?e.reason??`Cannot host the Concierge`:`Offline: the Concierge waits for it`}))}var Xa=(e,t)=>{let n=t.replace(/\/+$/,``);return e===n||e.startsWith(`${n}/`)};function Za(e,t){if(!e.machineID)return`Pick a machine`;let n=t.find(t=>t.id===e.machineID);if(!n)return`That machine is not yours any more: pick another`;if(!n.eligible&&n.online)return`${n.name} cannot host the Concierge: ${n.reason??`not eligible`}`;if(!e.directory)return`Pick a directory (a git repo on ${n.name})`;if(n.roots.length&&!n.roots.some(t=>Xa(e.directory,t)))return`The directory must be under one of ${n.name}'s workspace roots: ${n.roots.join(`, `)}`}var Qa=e=>({allow:[`answer`,`deny`,`approve`],projects:[...e],permissions:{allow:[`read`,`edit`],never:[`shell:git push*`,`shell:rm *`]},allowAlways:!1,expires:`7d`,maxActionsPerHour:60}),$a=[`answer`,`deny`,`approve`,`stop`,`prompt`];function eo(e,t){let n=e??Qa(t?[t]:[]);return{projects:[...n.projects],allow:[...n.allow],permit:n.permissions.allow.join(`
|
|
11
|
-
`),never:n.permissions.never.join(`
|
|
12
|
-
`),expires:n.expires,maxActionsPerHour:String(n.maxActionsPerHour)}}var to=e=>e.split(`
|
|
13
|
-
`).map(e=>e.trim()).filter(Boolean),no=/^(\d+)(h|d)$/;function ro(e){let t={},n=[...new Set(e.projects.map(e=>e.trim()).filter(Boolean))];n.length||(t.projects=`Pick at least one project`),$a.filter(t=>e.allow.includes(t)).length||(t.allow=`Pick at least one action`);let r=e.expires.trim(),i=no.exec(r),a=i?Number(i[1])*(i[2]===`d`?24:1):NaN;a>=1&&a<=720||(t.expires=`1h to 30d, for example 8h or 7d`);let o=e.maxActionsPerHour.trim(),s=/^\d+$/.test(o)?Number(o):NaN;return s>=1&&s<=1e3||(t.maxActionsPerHour=`A whole number from 1 to 1000`),Object.keys(t).length?{ok:!1,errors:t}:{ok:!0,body:{allow:e.allow.filter(e=>$a.includes(e)),projects:n,permissions:{allow:to(e.permit),never:to(e.never)},allowAlways:!1,expires:r,maxActionsPerHour:s}}}function io(e){let t=to(e).filter(e=>/^(shell|bash)\b/.test(e));return t.length?`Shell rules (${t.join(`, `)}) never auto-approve: the Concierge always asks for your tap on a shell request. In shell patterns * also matches &&, | and ;.`:void 0}function ao(e){if(/^grant\.permissions\.never/.test(e))return`never`;if(/^grant\.permissions/.test(e))return`permit`;if(/^grant\.projects|^scope/.test(e))return`projects`;if(/^grant\.allow\b/.test(e))return`allow`;if(/^grant\.expires/.test(e))return`expires`;if(/^grant\.maxActionsPerHour/.test(e))return`maxActionsPerHour`;if(/^permissions\.never/.test(e))return`never`;if(/^permissions/.test(e))return`permit`}function oo(e,t,n){let r=[...(e?.processes??[]).flatMap(e=>e.sessions.map(e=>(e.project||e.directory).replace(/\/+$/,``)))].filter(Boolean).sort();return[...new Set([...t?[t]:[],...n,...r])]}function so(e){let t=e.permissions.allow,n=e.permissions.never;return{head:`${e.allow.join(`, `)} in ${e.projects.join(`, `)}`,permissions:t.length?`Permissions ${t.join(`, `)}${n.length?` · never ${n.join(`, `)}`:``}`:`Permissions: none (it approves nothing)`}}function co(e,t){let n=zt(e,t);return n?`expires in ${n}`:`expired`}var lo=[`machineID`,`directory`,`model`,`grant`,`connectors`,`timeZone`,`quietHours`,`quietAllowsUrgent`,`digests`];function uo(e,t){let n={};for(let r of lo)JSON.stringify(e[r])!==JSON.stringify(t[r])&&(n[r]=t[r]===void 0?null:t[r]);return{...n,expectedRevision:e.revision}}var fo=`__other__`,po=e=>(e??``).replace(/\/+$/,``);function mo(e,t){if(!e)return{projects:[],roots:[]};let n=[...new Set(e.roots.map(po).filter(Boolean))],r=(t??[]).find(t=>t.id===e.id)?.processes.flatMap(e=>e.sessions.map(e=>po(e.project)||po(e.directory)))??[],i=[...new Set(r)].filter(e=>e.startsWith(`/`)&&(!n.length||n.some(t=>Xa(e,t)))).sort();return{projects:i,roots:n.filter(e=>!i.includes(e))}}function ho(e,t){if(!e)return`Pick a machine first.`;if(!e.online)return`${e.name} is offline: its projects show when it is back; you can type a folder.`;let n=[...new Set(e.roots.map(po).filter(Boolean))],r=n.length?` under ${n.join(`, `)}`:``;return t.projects.length?`A git repo on ${e.name}${r}. It is used as is: no branch switch.`:`${e.name} reports no projects${r} yet: pick a root or type a folder.`}var go=(e,t)=>e?t.includes(e)?e:fo:``;function _o(e,t,n,r){if(e.machineID===t.id)return e;let{projects:i,roots:a}=mo(t,n),o=e.directory!==void 0&&(i.includes(e.directory)||a.includes(e.directory)),s=e.model!==void 0&&r!==void 0&&!r.includes(e.model)?void 0:e.model;return{...e,machineID:t.id,directory:o?e.directory:void 0,model:s}}var vo=(e,t)=>e.model!==void 0&&!t.includes(e.model)?{...e,model:void 0}:e,yo=/^[A-Za-z0-9._-]{1,80}\/[!-~]{1,200}$/;function bo(e){let t=L(e)&&Array.isArray(e.models)?e.models:[],n=new Map;for(let e of t){if(!L(e)||!R(e.providerID)||!R(e.modelID)||e.enabled===!1)continue;let t=`${e.providerID}/${e.modelID}`;yo.test(t)&&!n.has(t)&&n.set(t,{value:t,label:R(e.name)&&e.name?e.name.slice(0,120):e.modelID,provider:e.providerID})}return[...n.values()].sort((e,t)=>e.provider.localeCompare(t.provider)||e.label.localeCompare(t.label))}function xo(e){if(!e)return`Pick a machine first`;if(!e.online)return`${e.name} is offline: type a model, or keep the machine default`;if(!e.eligible)return e.reason??`It cannot host the Concierge`}var So=new Set([`yes`,`approve`,`go ahead`,`do it`]),Co=new Set([`no`,`deny`,`don't`,`dont`,`hold`]),wo=new Set([`um`,`umm`,`uh`,`uhm`,`uhh`,`er`,`erm`,`hm`,`hmm`,`ah`,`please`]),To=80;function Eo(e){if(typeof e!=`string`||e.length>To||/[??]/.test(e))return;let t=e.normalize(`NFC`).toLowerCase().replace(/[\u2018\u2019\u02bc`´]/g,`'`).replace(/[.,!?;:…"“”«»()[\]{}\-–—]+/g,` `).split(/\s+/).filter(Boolean),n=0,r=t.length;for(;n<r&&wo.has(t[n]);)n++;for(;r>n&&wo.has(t[r-1]);)r--;let i=t.slice(n,r).join(` `);if(So.has(i))return`yes`;if(Co.has(i))return`no`}function Do(e){if(e===null)return null;if(!e||typeof e!=`object`||Array.isArray(e))return;let{decisionID:t,expiresAt:n}=e;if(typeof t==`string`&&/^dec_[A-Za-z0-9]{1,64}$/.test(t))return{decisionID:t,...typeof n==`number`&&Number.isFinite(n)?{expiresAt:n}:{}}}function Oo(e,t,n){if(!t||t.expiresAt!==void 0&&t.expiresAt<=n)return;let r=e.find(e=>e.id===t.decisionID);return r&&r.state===`open`&&r.tier===`confirm`?r:void 0}function ko(e,t,{tiers:n=`confirm`}={}){if(!t)return[];let r=new Set([...t.hiddenSessionIDs,...t.sessionID?[t.sessionID]:[]]);return e.filter(e=>e.state===`open`&&(n===`all`||e.tier===`confirm`)&&(e.from.kind===`session`&&r.has(e.from.sessionID)||e.as===`concierge`)).sort((e,t)=>t.at-e.at)}function Ao(e,t){if(t===`yes`&&e.action?.kind===`grant`)return;let n=e.options.filter(e=>t===`yes`?!e.safe&&e.id!==`always`:e.safe===!0);return n.length===1?n[0].id:void 0}function jo(e,t){if(!t||t.tier!==`confirm`||t.state!==`open`)return{kind:`speech`};let n=Eo(e),r=n&&Ao(t,n);return n&&r?{kind:`answer`,decisionID:t.id,option:r,intent:n}:{kind:`speech`}}var Mo=60;function No(e,t){if(!e)return`Answered a Decision by text`;let n=Array.from(e.question.replace(/\s+/g,` `).trim());return`Answered Decision “${n.length>Mo?`${n.slice(0,59).join(``)}…`:n.join(``)}” by text: ${e.options.find(e=>e.id===t)?.label??t}`}var Po=e=>e&&e.state!==`disabled`?!0:`hidden`,Fo={starting:`starting`,backoff:`restarting soon`,waiting_machine:`waiting for its machine`,stopping:`stopping`};function Io(e,t,n,r,i=0,a){if(e.state===`disabled`)return{label:`Concierge (off — set it up)`,title:`Concierge is off — click to set it up in Settings → Concierge`,indicator:`off`};let o=!!t&&(t.expiresAt===void 0||t.expiresAt>r)&&(a===void 0||a.has(t.decisionID)),s=Math.max(i,+!!o),c=s>1?` — ${s} Decisions wait for your answer`:s?` — a Decision waits for your answer`:``,[l,u]=e.state===`failed`?[`Concierge (stopped — restart it)`,`attention`]:e.state===`running`?[`Concierge (running${c})`,s?`attention`:`running`]:[`Concierge (${Fo[e.state]}${c})`,s?`attention`:`busy`];return{label:l,title:`${l} — ${n?`close`:`open`} it`,indicator:u,...i>0?{count:s}:{}}}var Lo=e=>e?`Ask what needs you, or start Voice and talk.`:`Ask what needs you.`,Ro=e=>`${e?`Say or type`:`Type`} “yes” or “no” (or tap). Anything else goes to the Concierge.`,zo=`The Concierge is off. Turn it on in Settings → Concierge.`;function Bo(e,t){if(!e||e.state===`disabled`)return zo;let n=t?.name??`its machine`;switch(e.state){case`failed`:return e.reason?`Stopped: ${e.reason}. Restart it when you are ready.`:`Stopped. Restart it when you are ready.`;case`stopping`:return`Stopping…`;case`backoff`:return`Relaunching…`}if(e.state===`waiting_machine`||t?.online===!1)return`Concierge runs on ${n}, which is offline`;if(e.state===`starting`)return`Starting on ${n}…`}function Vo(e,t){let n=`/api/sessions/${encodeURIComponent(t.sessionID)}/utterance`;return async(r,i)=>{let a=i?.json?.text;if(r!==n||i?.method!==`POST`||typeof a!=`string`||t.current()!==t.sessionID||t.present?.()===!1)return e(r,i);let o=jo(a,t.armed());return o.kind===`speech`?e(r,i):(await t.answer(o.decisionID,o.option),Response.json({inboxID:`decision:${o.decisionID}`}))}}var Ho=[`Sun`,`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`];function Uo(e,t,n){let r=new Set(e??[0,1,2,3,4,5,6]);n?r.add(t):r.size>1&&r.delete(t);let i=[...r].filter(e=>Number.isInteger(e)&&e>=0&&e<=6).sort((e,t)=>e-t);return i.length===7?void 0:i}function Wo(e,t,n){return n===void 0||!e||e.sessionID===t.sessionID?n:null}function Go(e,t){let n=e;for(let e=n.panes.length-1;e>=0;e--){let r=n.panes[e].sessionID;r!==void 0&&t.has(r)&&(n=ne(n,e))}return n}function Ko(e,t){if(e&&e.expiresAt!==void 0)return Math.max(0,e.expiresAt-t)}function qo(e,t){return e&&e.expiresAt!==void 0&&e.expiresAt<=t?null:e}var Jo=class{events=0;seq=0;settled=0;started=new Map;begin(){let e=++this.seq;return this.started.set(e,this.events),e}event(){this.events++}fresh(e){let t=this.started.get(e);return this.started.delete(e),t!==this.events||e<this.settled?!1:(this.settled=e,!0)}};function Yo(e,t,n){return ko(e,t,{tiers:`all`}).filter(e=>e.id!==n?.id)}var Xo=class{onChange;entries=[];focusedID;seq=0;constructor(e=()=>{}){this.onChange=e}register(e,t=()=>!0){let n=`pane_${++this.seq}`;return this.entries.push({paneID:n,sessionID:e,visible:t}),this.focusedID===void 0&&(this.focusedID=n),this.onChange(),n}release(e){let t=this.entries.length;this.entries=this.entries.filter(t=>t.paneID!==e),this.entries.length!==t&&(this.focusedID===e&&(this.focusedID=this.entries[0]?.paneID),this.onChange())}focus(e){return this.entries.some(t=>t.paneID===e)?(this.focusedID!==e&&(this.focusedID=e,this.onChange()),!0):!1}focused(){return this.focusedID}views(){return this.entries.map(e=>({paneID:e.paneID,sessionID:e.sessionID,visible:e.visible(),focused:e.paneID===this.focusedID}))}};function Zo(e){let t=e.find(e=>e.focused);return t?.visible?t:void 0}function Qo(e,t=re){let n=[],r=Zo(e);for(let i of r?[r,...e]:e){if(n.length>=t)break;i.visible&&!n.includes(i.sessionID)&&n.push(i.sessionID)}return n}function $o(e,t,n){let r=t.length?Qo(t):n?[n]:[],[i]=r;return i?r.length>1?{lite:e,session:i,sessions:r}:{lite:e,session:i}:{lite:e}}function es(e,t,n=re){if(!t)return e;let r=e.sessions??(e.session?[e.session]:[]);if(r.includes(t))return e;let i=[...r.slice(0,Math.max(0,n-1)),t],[a]=i;return i.length>1?{lite:e.lite,session:a,sessions:i}:{lite:e.lite,session:a}}function ts(e){return Zo(e)?.sessionID}function ns(e,t){return Zo(e)?.paneID===t}var rs=class{all=!1;requested=new Set;confirmed=new Set;pending=!1;opened(e){this.all=!e.lite,this.confirmed=new Set(e.session?[e.session]:[]),this.requested=new Set([...this.confirmed,...e.sessions??[]]),this.pending=this.requested.size>this.confirmed.size}message(e){if(!this.pending||typeof e!=`object`||!e)return!1;let{type:t,sessions:n}=e;if(t===`scope`){if(!Array.isArray(n))return!1;for(let e of n)typeof e==`string`&&this.requested.has(e)&&this.confirmed.add(e);return this.pending=!1,!0}return typeof t==`string`&&(this.pending=!1,!0)}covers(e){return this.all||this.confirmed.has(e)?!0:this.pending&&this.requested.has(e)?void 0:!1}},[is,as]=i(0),os=new Xo(()=>as(e=>e+1));function ss(){return is(),os.views()}var cs=()=>ts(ss()),ls=(e,t)=>$o(e,ss(),t);function us(e,t=()=>!0){let n=os.register(e,t);return{paneID:n,focus:()=>void os.focus(n),takesInput:()=>ns(ss(),n),streamed:()=>gs(e),release:()=>os.release(n)}}var ds=new rs,[fs,ps]=i(0);function ms(e){ds.opened(e),ps(e=>e+1)}function hs(e){ds.message(e)&&ps(e=>e+1)}function gs(e){return fs(),ds.covers(e)}var _s=`x-hub-recording`,vs=`x-hub-segment`,ys=`x-hub-tts-ref`,bs=`x-hub-recording-audio`,xs={retentionMs:6048e5,userBytes:524288e3,recordingBytes:157286400,segmentBytes:2097152,segmentsPerRecording:5e3,eventsPerBatch:200,batchBytes:262144,keepaliveBatchBytes:61440,eventsPerRecording:5e4,eventBytesPerRecording:33554432,recordingsStored:200,activePerUser:4,maxDurationMs:144e5,idleEndMs:6e5,sweepMs:9e5,textChars:2e3,utteranceChars:4e3,replyChars:32e3,messageChars:300,consoleBufferEvents:2e3,flushMs:5e3,flushEvents:100,hubFlushMs:2e3,hubFlushEvents:100},z=(e,t=[])=>({required:e,optional:t}),Ss={state:z([`state`]),detector:z([`mode`],[`avgMs`]),"speech.start":z([`bargeIn`]),"speech.end":z([`segment`,`durationMs`,`speechMs`,`forced`]),"segment.closed":z([`segment`,`bytes`,`durationMs`,`speechMs`,`forced`]),"stt.sent":z([`segment`,`bytes`]),"stt.received":z([`segment`,`text`],[`junk`,`empty`,`failed`,`audio`]),"utterance.held":z([`text`]),"utterance.merged":z([`segments`,`pauseMs`]),"utterance.sent":z([`text`,`segments`,`reason`,`holdMs`]),"utterance.accepted":z([`inboxID`]),"utterance.failed":z([`message`],[`status`]),"utterance.command":z([`command`,`text`]),heard:z([`inboxID`]),"say.received":z([`messageID`,`ordinal`,`chars`,`sentences`,`muted`],[`seq`]),"tts.sentence.queued":z([`ref`,`text`]),"tts.request":z([`ref`]),"tts.first.byte":z([`ref`]),"tts.sentence.played":z([`ref`]),"tts.sentence.ended":z([`ref`,`playedMs`,`completed`],[`durationMs`]),"barge.in":z([`cause`,`spoken`,`unplayed`,`mutedMessages`],[`playing`]),"cue.played":z([`cue`],[`name`,`text`]),mic:z([`live`],[`reason`]),control:z([`action`],[`on`]),"turn.timing":z([`firstAudio`],[`speechEnd`,`transcript`,`accepted`,`firstSay`,`firstByte`]),"decision.voice":z([`decisionID`,`option`,`outcome`]),"clock.sync":z([`t0`,`t1`,`hubAt`]),error:z([`where`,`message`])},B=xs,Cs={"stt.received":{text:B.textChars,failed:B.messageChars},"utterance.held":{text:B.utteranceChars},"utterance.sent":{text:B.utteranceChars},"utterance.failed":{message:B.messageChars},"utterance.command":{text:B.utteranceChars},"tts.sentence.queued":{text:B.textChars},"cue.played":{text:B.textChars},error:{message:B.messageChars}};function ws(e,t){if(e.length<=t)return e;let n=e.slice(0,t),r=n.charCodeAt(n.length-1);return r>=55296&&r<=56319?n.slice(0,-1):n}function Ts(e,t){let n=Ss[e],r={kind:e};for(let[i,a]of Object.entries(t)){if(a===void 0)continue;if(!n.required.includes(i)&&!n.optional.includes(i))throw Error(`${e}: unknown field ${i}`);let t=Cs[e]?.[i];r[i]=t!==void 0&&typeof a==`string`?ws(a,t):a}for(let t of n.required)if(r[t]===void 0)throw Error(`${e}: missing field ${t}`);if(e===`barge.in`){let e=e=>({...e,text:ws(e.text,B.textChars)}),t=r.spoken;r.spoken={text:ws(t.text,B.replyChars),estimated:t.estimated},r.playing&&=e(r.playing),r.unplayed=r.unplayed.slice(0,Os).map(e),r.mutedMessages=r.mutedMessages.slice(0,Os)}return r}var Es=e=>`${e.messageID}:${e.ordinal}:${e.seq??``}:${e.i}`;function Ds(e){let t=e||``,n=/Android/i.test(t)?`android`:/iPhone|iPad|iPod/i.test(t)?`ios`:`desktop`;return`${n}-${n===`ios`?/CriOS/.test(t)?`chrome`:/FxiOS/.test(t)?`firefox`:`safari`:/Firefox\//.test(t)?`firefox`:/SamsungBrowser/.test(t)?`samsung`:/Edg\//.test(t)?`edge`:/Chrome\//.test(t)?`chrome`:/Safari\//.test(t)?`safari`:`other`}`.slice(0,60)}var Os=20,ks=14;function As(e,t,n){let r=n&&n>0?n:e.length/ks*1e3,i=r>0?Math.min(1,Math.max(0,t/r)):0;if(i>=1)return e.trim();let a=i*e.length,o=0;for(let t=0;t<=e.length;t++)t<e.length&&!/\s/.test(e[t])||Math.abs(t-a)<Math.abs(o-a)&&(o=t);return e.slice(0,o).trim()}function js(e){let{cause:t,completed:n,playing:r,unplayed:i}=e,a=new Set([...r?[r.ref.messageID]:[],...i.map(e=>e.ref.messageID)]),o=e.turnRunning===!1?e.mutedMessages.filter(e=>a.has(e)):e.mutedMessages;if(!r&&!i.length&&!o.length)return;let s=new Set([...r?[r.ref.messageID]:[],...i.map(e=>e.ref.messageID),...o]),c=n.filter(e=>s.has(e.ref.messageID)).map(e=>e.text.trim());return r&&c.push(As(r.text,r.playedMs,r.durationMs)),Ts(`barge.in`,{cause:t,...r?{playing:{ref:r.ref,text:r.text,playedMs:Math.round(r.playedMs),...r.durationMs===void 0?{}:{durationMs:Math.round(r.durationMs)}}}:{},spoken:{text:c.filter(Boolean).join(` `),estimated:!!r},unplayed:i.map(e=>({ref:e.ref,text:e.text})),mutedMessages:[...o]})}function Ms(e,t){return(e===200||e===201)&&typeof t?.recording?.id==`string`?{kind:`started`,recording:t.recording,audio:t.audio!==!1,...typeof t.hubAt==`number`?{hubAt:t.hubAt}:{}}:e===404||e===405||e===501||e===409&&t?.code===`recording_off`?{kind:`off`}:e===0?{kind:`failed`,reason:`offline`}:e===429&&t?.code===`rate_limited`?{kind:`failed`,reason:`${t.limit??B.activePerUser} recordings are already running`}:e===429&&t?.code===`limit`?{kind:`failed`,reason:`${t.limit??B.recordingsStored} recordings stored; delete some in Settings → Voice`}:{kind:`failed`,reason:typeof t?.error==`string`&&t.error?t.error:`HTTP ${e}`}}var Ns=new TextEncoder,V=e=>Ns.encode(e).length,Ps=V(`{"events":[]}`),H=e=>e.kind===`clock.sync`,Fs=e=>Math.max(0,Math.round(e*10)/10);function Is(e,t){let n=[],r=Ps;for(let i of e){if(n.length&&i.seq!==n[n.length-1].seq+1)break;let e=V(JSON.stringify(i))+ +!!n.length;if(r+e>t)break;n.push(i),r+=e}let i=e.length-n.length,a=n[n.length-1];if(!i||!a)return n;let o={seq:a.seq+1,t:a.t,kind:`error`,where:`upload`,message:`dropped ${i} events at page close`};return r+1+V(JSON.stringify(o))<=t&&n.push(o),n}var Ls=class{deps;limits;now;setTimer;clearTimer;seq=0;pending=[];batch;sending=!1;ready=!1;flushTimer;retryTimer;attempt=0;acked=0;flushTarget=0;waiters=[];kickQueued=!1;dropped=0;audio;stopped=!1;constructor(e){this.deps=e,this.limits={...xs,...e.limits},this.now=e.now??(()=>performance.now()),this.setTimer=e.setTimer??((e,t)=>setTimeout(e,t)),this.clearTimer=e.clearTimer??(e=>clearTimeout(e))}get buffered(){return this.pending.length+(this.batch?.length??0)}record(e){return this.add(e,!0)}add(e,t){if(this.stopped)return;let n=++this.seq,r=Fs(this.now()),i={...e,seq:n,t:r},a=V(JSON.stringify(i));for(Ps+a>this.limits.batchBytes&&(i={seq:n,t:r,kind:`error`,where:`upload`,message:`event too large: ${e.kind}`},a=V(JSON.stringify(i))),this.pending.push({e:i,bytes:a});t&&this.pending.length>this.limits.consoleBufferEvents;)this.pending.shift(),this.dropped++;return this.ready&&!H(i)&&this.scheduled(),n}open(e){this.stopped||this.ready||(this.ready=!0,e&&this.record(Ts(`clock.sync`,e)),this.pending.some(e=>!H(e.e))&&this.scheduled())}flush(){let e=this.lastActiveSeq();if(this.stopped||e<=this.acked)return Promise.resolve();this.flushTarget=Math.max(this.flushTarget,e);let t=new Promise(t=>this.waiters.push({target:e,resolve:t}));return this.kick(),t}discard(){this.halt()}close(){if(this.stopped)return;let e=[...this.batch??[],...this.pending.map(e=>e.e)],t=this.ready;if(this.halt(),!t||!e.length)return;let n=Is(e,this.limits.keepaliveBatchBytes);n.length&&this.deps.send(n,{keepalive:!0}).catch(()=>{})}halt(){this.stopped=!0,this.pending=[],this.batch=void 0,this.clearTimer(this.flushTimer),this.clearTimer(this.retryTimer),this.flushTimer=this.retryTimer=void 0,this.settle()}lastActiveSeq(){for(let e=this.pending.length-1;e>=0;e--)if(!H(this.pending[e].e))return this.pending[e].e.seq;let e=this.batch??[];for(let t=e.length-1;t>=0;t--)if(!H(e[t]))return e[t].seq;return 0}activePending(){let e=0;for(let t of this.pending)H(t.e)||e++;return e}scheduled(){if(this.activePending()>=this.limits.flushEvents){if(this.kickQueued)return;this.kickQueued=!0,queueMicrotask(()=>{this.kickQueued=!1,this.kick()})}else this.flushTimer===void 0&&(this.flushTimer=this.setTimer(()=>{this.flushTimer=void 0,this.kick()},this.limits.flushMs))}take(){let e=[],t=Ps;for(;this.pending.length&&e.length<this.limits.eventsPerBatch;){let n=this.pending[0],r=n.bytes+ +!!e.length;if(e.length&&t+r>this.limits.batchBytes)break;e.push(n.e),t+=r,this.pending.shift()}return e}kick(){if(!(!this.ready||this.stopped||this.sending||this.retryTimer!==void 0)){if(!this.batch){if(!this.pending.some(e=>!H(e.e)))return;this.batch=this.take()}this.clearTimer(this.flushTimer),this.flushTimer=void 0,this.sending=!0,this.send(this.batch)}}async send(e){let t=this.now(),n;try{n=await this.deps.send(e,{})}catch{n={status:0}}if(this.sending=!1,this.stopped||this.batch!==e)return;let r=this.now(),{status:i,body:a}=n;if(i>=200&&i<300){if(this.batch=void 0,this.attempt=0,this.acked=Math.max(this.acked,e[e.length-1].seq),typeof a?.hubAt==`number`&&this.add(Ts(`clock.sync`,{t0:Fs(t),t1:Fs(r),hubAt:a.hubAt}),!1),typeof a?.audio==`boolean`&&a.audio!==this.audio&&(this.audio=a.audio,this.deps.onAudio?.(a.audio)),this.dropped){let e=this.dropped;this.dropped=0,this.add(Ts(`error`,{where:`upload`,message:`dropped ${e} events (offline too long)`}),!1)}}else if(i===400)this.batch=void 0,this.attempt=0,this.acked=Math.max(this.acked,e[e.length-1].seq);else if(i===404||i===409||i===413){let e=typeof a?.code==`string`?a.code:i===404?`gone`:i===413?`limit`:`ended`;this.halt(),this.deps.onStop?.({status:i,code:e,...typeof a?.reason==`string`?{reason:a.reason}:{}});return}else{let e=(this.deps.backoffMs??(e=>Math.min(3e4,1e3*2**e)))(this.attempt++);this.retryTimer=this.setTimer(()=>{this.retryTimer=void 0,this.kick()},e);return}this.settle(),this.acked<this.flushTarget||this.activePending()>=this.limits.flushEvents?this.kick():this.activePending()>0&&this.flushTimer===void 0&&this.scheduled()}settle(){let e=this.waiters;this.waiters=[];for(let t of e)this.stopped||t.target<=this.acked?t.resolve():this.waiters.push(t)}},Rs=1048576,zs={label:`Record voice conversations (developer)`,description:`Saves your voice segments, transcripts, replies, timing and Concierge actions on this hub, for 7 days. Only you can see them.`,details:[`While Voice mode runs on this device: each speech segment exactly as sent to speech-to-text, what was heard and sent, the replies and what was actually spoken before you interrupted, the timing, and the Concierge's tool calls and Decisions. Not recorded: costs, other sessions' text, the replies' audio.`,`Applies the next time Voice mode starts; a device shows ● Recording while it records. Kept 7 days, then deleted; at most ${B.userBytes/Rs} MB in all (${B.recordingBytes/Rs} MB per recording, ${B.recordingsStored} recordings).`,`Secrets in known token formats are scrubbed from the text. Audio is kept even when a secret is scrubbed from the text, and secrets spoken in a way the patterns do not match stay in the text and the audio.`,`Recordings are not encrypted at rest: whoever runs this hub can read them on its disk or database. Delete is immediate.`]};function Bs(e){let t=[`B`,`KB`,`MB`,`GB`],n=Math.max(0,e),r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r++;return`${r===0||n>=10?String(Math.round(n)):n.toFixed(1)} ${t[r]}`}var Vs=e=>`${Bs(e.bytes)} of ${Bs(e.capBytes)}`;function Hs(e){let t=Math.max(0,Math.floor(e/1e3));if(t<60)return`${t} s`;let n=Math.floor(t/60);return n<60?`${n} min`:`${Math.floor(n/60)} h${n%60?` ${n%60} min`:``}`}var Us={date:e=>new Date(e).toLocaleDateString(void 0,{month:`short`,day:`numeric`}),time:e=>new Date(e).toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`})};function Ws(e){let t=e?.name?.trim().replace(/^@+/,``);if(t)return`@${t}`;let n=e?.directory?.replace(/[/\\]+$/,``).split(/[/\\]/).pop();return n?`OpenCode session · ${n}`:`OpenCode session`}function Gs(e,t,n=Us,r=()=>Ws(void 0)){let i=e.state===`active`;return{kind:e.kind===`concierge`?`Concierge`:`Voice`,title:e.sessionTitle||r(e.sessionID),device:e.deviceName||`a device`,started:`${n.date(e.startedAt)} ${n.time(e.startedAt)}`,length:i?`${Hs(t-e.startedAt)} · recording now`:Hs((e.endedAt??t)-e.startedAt),segments:`${e.segments} segment${e.segments===1?``:`s`}`,size:Bs(e.bytes),expires:`deleted on ${n.date(e.expiresAt)}`,active:i,...e.audio?{}:{note:`no audio (storage full)`}}}function Ks(e){let t=e,n=new Set;return{get:()=>t,set(e){t=e;for(let e of[...n])e()},subscribe(e){return n.add(e),()=>n.delete(e)}}}var U={on:!1,audio:!0},qs=Ks(U),Js=e=>e.audio?`Recording`:`Recording · no audio (storage full)`,Ys=e=>e.on?` · recording`:``,Xs=Ks({}),Zs=5e3,Qs=new Set([`stored`,`skipped-cap`,`failed`,`off`]),$s=e=>e&&Qs.has(e)?e:void 0,ec=()=>{let e=globalThis.crypto;if(e?.randomUUID)return e.randomUUID();let t=Array.from({length:32},()=>Math.floor(Math.random()*16).toString(16)).join(``);return`${t.slice(0,8)}-${t.slice(8,12)}-4${t.slice(13,16)}-a${t.slice(17,20)}-${t.slice(20)}`},tc=(e,t=!1)=>({method:`POST`,credentials:`same-origin`,headers:{"content-type":`application/json`},body:JSON.stringify(e),...t?{keepalive:!0}:{}}),W;function nc(e){e?.type===`recording`&&(e.settings&&typeof e.settings.enabled==`boolean`&&rc(e.settings),W?.onMessage(e))}function rc(e){Xs.set({supported:!0,settings:e}),e.enabled||W?.turnedOff()}function ic(e,t){W?.event(e,t)}var ac=class{fetch;now;epoch;limits;take;running=!1;rolled=!1;sessionID=``;client={};retried=new Set;audio=!0;onNote;constructor(e={}){this.fetch=e.fetch??((e,t)=>globalThis.fetch(e,{credentials:`same-origin`,...t})),this.now=e.now??(()=>performance.now()),this.epoch=e.epoch??(()=>Date.now()),this.limits=e.limits}get recordingID(){let e=this.take;return e?.id&&!e.uploader.stopped?e.id:void 0}get active(){return this.recordingID!==void 0}get buffered(){return this.take?.uploader.buffered??0}start(e,t={}){if(this.running)return;this.running=!0,this.rolled=!1,this.sessionID=e;let n=globalThis.navigator;this.client={platform:Ds(n?.userAgent??``),...t},W=this,this.indicate(U),this.begin()}event(e,t){try{this.take?.uploader.record(Ts(e,t))}catch{}}record(e){try{this.take?.uploader.record(e)}catch{}}transcribeHeaders(e){let t=this.recordingID;return t?{[_s]:t,[vs]:String(e)}:{}}speakHeaders(e){let t=this.recordingID;return t&&e?{[_s]:t,[ys]:Es(e)}:{}}segmentAudio(e,t,n){let r=this.recordingID;t===`failed`&&r&&!this.retried.has(e)&&(this.retried.add(e),this.fetch(`/api/recordings/${encodeURIComponent(r)}/segments/${e}`,{method:`PUT`,credentials:`same-origin`,headers:{"content-type":`audio/wav`},body:n}).catch(()=>{}))}async stop({keepalive:e=!1,reason:t=`stopped`}={}){if(!this.running)return;this.running=!1,W===this&&(W=void 0);let n=this.take;this.take=void 0,this.indicate(U),n&&(e?(n.uploader.close(),n.id&&this.end(n.id,t,!0)):(await n.started,n.id&&!n.uploader.stopped&&(await Promise.race([n.uploader.flush(),new Promise(e=>setTimeout(e,Zs))]),n.uploader.close(),await this.end(n.id,t,!1))))}turnedOff(){let e=this.take;e&&(e.uploader.discard(),this.take=void 0,this.indicate(U))}onMessage(e){if(e?.type!==`recording`)return;e.settings?.enabled===!1&&this.turnedOff();let t=this.take;if(t?.id&&e.recordingID===t.id){if(typeof e.audio==`boolean`&&this.audioChanged(t,e.audio),e.state===`deleted`)t.uploader.discard(),this.take=void 0,this.indicate(U);else if(e.state===`ended`){if(e.reason===`conversation_off`)return;t.uploader.discard(),this.ended(t,{status:409,code:`recording_ended`,...typeof e.reason==`string`?{reason:e.reason}:{}})}}}begin(){let e;e={uploader:new Ls({send:(t,{keepalive:n})=>this.sendEvents(e,t,!!n),now:this.now,onStop:t=>this.ended(e,t),onAudio:t=>this.audioChanged(e,t),...this.limits?{limits:this.limits}:{}}),started:Promise.resolve()},this.take=e,e.started=this.open(e).catch(()=>e.uploader.discard())}async open(e){let t;try{let n=await this.fetch(`/api/settings/recording`);if(n.status===404||n.status===405)return Xs.set({supported:!1}),e.uploader.discard();if(n.ok){let{settings:e}=await n.json();e&&Xs.set({supported:!0,settings:e}),t=e?.enabled}}catch{}if(t===!1||this.take!==e||!this.running)return e.uploader.discard();let n={perf:this.now(),epoch:this.epoch()},r=this.now(),i=0,a;try{let e=await this.fetch(`/api/recordings`,tc({sessionID:this.sessionID,clientID:ec(),anchor:n,client:this.client}));i=e.status,a=await e.json().catch(()=>({}))}catch{}let o=this.now(),s=Ms(i,a);s.kind===`started`?(e.id=s.recording.id,this.audio=s.audio,e.uploader.open(s.hubAt===void 0?void 0:{t0:r,t1:o,hubAt:s.hubAt}),this.take===e&&this.running&&this.indicate({on:!0,audio:this.audio,sessionID:this.sessionID,recordingID:e.id})):(e.uploader.discard(),s.kind===`failed`&&t===!0&&this.take===e&&this.running&&this.onNote?.(`Not recording: ${s.reason}`))}async sendEvents(e,t,n){let r=await this.fetch(`/api/recordings/${encodeURIComponent(e.id??``)}/events`,tc({events:t},n));return{status:r.status,body:await r.json().catch(()=>({}))}}end(e,t,n){return this.fetch(`/api/recordings/${encodeURIComponent(e)}/end`,tc({reason:t},n)).then(()=>{},()=>{})}ended(e,t){if(this.take!==e)return;this.take=void 0;let n=t.reason;if(n===`max_duration`&&this.running&&!this.rolled){this.rolled=!0,this.indicate(U),this.begin();return}let r=t.code===`limit`||n===`limit`?`Recording stopped: limit reached`:void 0;this.indicate(r?{...U,note:r}:U),r&&this.onNote?.(r)}audioChanged(e,t){if(this.take!==e||t===this.audio)return;this.audio=t;let n=qs.get();n.on&&n.recordingID===e.id&&this.indicate({...n,audio:t})}indicate(e){qs.set(e)}};async function oc(e,t,n={}){let r=await(n.fetch??((e,t)=>globalThis.fetch(e,{credentials:`same-origin`,...t})))(`/api/recordings/${encodeURIComponent(e)}/segments/${t}`);if(!r.ok){let e=await r.json().catch(()=>({}));throw Error(typeof e.error==`string`&&e.error?e.error:`HTTP ${r.status}`)}let i=await r.blob(),a=(n.createURL??(e=>URL.createObjectURL(e)))(i),o=n.revokeURL??(e=>URL.revokeObjectURL(e)),s=!1,c=()=>{s||(s=!0,o(a))},l=(n.audio??(()=>new Audio))();l.addEventListener(`ended`,c),l.addEventListener(`error`,c),l.src=a;try{await l.play()}catch(e){throw c(),e}}var[G,K]=Yn(ta()),sc=new la,[cc,lc]=i(0),uc=cc,[dc,fc]=i(),[pc,mc]=i(),[hc,gc]=i(),[_c,vc]=i([]),[yc,bc]=i([]),[xc,Sc]=i(new Map),Cc=xc,wc=200;function Tc(e){e.length&&Sc(t=>{let n=new Map(t);for(let t of e)n.delete(t.id),n.set(t.id,t);for(;n.size>wc;)n.delete(n.keys().next().value);return n})}var[Ec,Dc]=i(),[q,Oc]=i(!1),[kc,Ac]=i(!1),jc=()=>Va(q(),kc(),G.machines!==void 0),[Mc,Nc]=i();r(()=>a(()=>{let e=Mc(),t=Ko(e,Date.now());if(t===void 0)return;let n=setTimeout(()=>Nc(t=>t===e?qo(t,Date.now()):t),t+50);c(()=>clearTimeout(n))}));var Pc=r(()=>o(()=>{let e=dc();if(!e)return[];try{return Ka(localStorage.getItem(Wa(e.user?.id)))}catch{return[]}}));r(()=>a(()=>{let e=Ec(),t=dc();if(q()&&t)try{localStorage.setItem(Wa(t.user?.id),JSON.stringify((e?.hiddenSessionIDs??[]).slice(-20)))}catch{}}));var Fc=r(()=>o(()=>za(Ec(),G.machines,q()?[]:Pc()),void 0,{equals:(e,t)=>e.size===t.size&&[...e].every(e=>t.has(e))}));n(()=>Fc());var[Ic,Lc]=i([]),[Rc,zc]=i(new Map),Bc=new Set;async function Vc(){try{zc(new Map(It(await u(`/api/agent/grants`)).map(e=>[e.id,e])))}catch{}}var Hc=e=>Rc().get(e),Uc=new Set;function Wc(e){return Uc.add(e),()=>Uc.delete(e)}var Gc=r(()=>o(e=>pi(e,fi(G.machines,G.prefs,G.reads,Fc())))),J=e=>aa(G.machines,e),Kc=e=>Fc().has(e)?`the Concierge`:J(e)?.session.title||void 0,[qc,Jc]=i(new Map);async function Yc(){try{let e=await u(`/api/agent/who`),t=Array.isArray(e?.sessions)?e.sessions:[];Jc(new Map(t.flatMap(e=>e&&typeof e==`object`&&typeof e.sessionID==`string`&&typeof e.name==`string`&&e.name?[[e.sessionID,e.name]]:[])))}catch{}}function Xc(e){if(Fc().has(e))return yt(e,void 0,!0);let t=J(e)?.session,n=qc().get(e);if(!n)for(let t of Cc().values())t.from.kind===`session`&&t.from.sessionID===e&&t.from.name&&(n=t.from.name);return yt(e,{name:n,title:t?.title,directory:typeof t?.project==`string`&&t.project||t?.directory})}var Y=new xr;p(()=>{ee().name!==`pair`&&(gl(),fc(void 0),Zc())});function Zc(){let e=location.pathname+location.search;t(`/pair${e===`/`||e.startsWith(`/pair`)?``:`?next=${f(e)}`}`,{replace:!0})}async function Qc(){if(dc())return!0;let e=await fetch(`/api/me`,{credentials:`same-origin`});if(e.status===401)return Zc(),!1;if(!e.ok)throw Error(`HTTP ${e.status}`);return fc(await e.json()),!0}async function $c(){if(pc()!==void 0)return pc()??null;try{let e=await fetch(`/api/auth`,{credentials:`same-origin`}),t=e.ok?await e.json():null;return mc(t),t}catch{return null}}var X,el,tl=1e3,nl=()=>!1,rl={lite:!1},[il,al]=i(``),ol,sl=!1,Z=new da({setTimer:(e,t)=>setTimeout(e,t),clearTimer:e=>clearTimeout(e),open:(e,t)=>ml(e,t),close:()=>pl(),keepOpen:()=>nl()});function cl(e){nl=e}function ll(e){rl=e,Z.setScope(e)}var ul=!1;function dl(){ul||(ul=!0,document.addEventListener(`visibilitychange`,()=>document.visibilityState===`hidden`?Z.hidden():Z.visible()),window.addEventListener(`pageshow`,e=>{e.persisted&&Z.state!==`stopped`&&Z.reopen()}),window.addEventListener(`online`,()=>Z.state===`open`&&G.connection===`down`&&Z.reopen()))}function fl(e={lite:!1}){Z.state===`stopped`&&(dl(),rl=e,Z.start(e),q()||(Sl(),setTimeout(()=>!q()&&Ac(!0),Ba)),document.visibilityState===`hidden`&&Z.hidden())}function pl(){clearTimeout(el),X?.close(),X=void 0,Z.state===`paused`&&K(`connection`,`paused`)}function ml(e,t){clearTimeout(el),X?.close();let n=fa(G.connection,t);sl=n.reconnecting,n.reconnecting&&hl(`reconnecting`),K(`connection`,n.connection),ms(rl);let r=new EventSource(e,{withCredentials:!0});X=r,r.onopen=()=>{tl=1e3,K(`connection`,`live`),sl&&hl(`updated`,2e3),sl=!1,Il(),vl(),jl(),El(),Yc(),Vc(),Sl()},r.onerror=async()=>{X===r&&(K(`connection`,`down`),(await fetch(`/api/me`,{credentials:`same-origin`}).catch(()=>void 0))?.status===401?(gl(),fc(void 0),Zc()):r.readyState===EventSource.CLOSED&&X===r&&(X=void 0,el=setTimeout(()=>Z.state===`open`&&Z.reopen(),tl),tl=Math.min(3e4,tl*2)))},r.addEventListener(`ping`,()=>Z.received()),r.onmessage=e=>{Z.received(e.lastEventId||void 0);let t;try{t=JSON.parse(e.data)}catch{return}_l(t)}}function hl(e,t){clearTimeout(ol),al(e),t&&(ol=setTimeout(()=>al(``),t))}function gl(){Z.stop(),X?.close(),X=void 0,clearTimeout(el)}function _l(e){d(()=>{if(hs(e),e.type===`prefs`?(K(A(t=>ia(t,e))),G.prefsStale&&!G.prefsPending&&Ll()):e.type===`catalog`?K(A(t=>{ia(t,e),Y.apply(t.machines,Date.now())})):K(A(t=>ia(t,e))),e.type===`status`){let t=J(e.sessionID);!sc.has(e.sessionID)&&t&&sc.feed(e.sessionID)}if(sc.apply(e)!==void 0&&lc(e=>e+1),e.type===`enrollment`&&jl(),e.type===`recording`&&nc(e),e.type===`decision`){let t=Re(e.decision);t&&($.event(t),bc(e=>Ve(e,t)),Tc([t]))}if(e.type===`concierge`){let t=La(e.status);t&&(Nc(e=>Wo(Ec(),t,e)),Dc(t),Oc(!0),bl++);let n=Do(e.armed);n!==void 0&&(wl.event(),Nc(n))}if(e.type===`agent`){let t=qt(e.entry);t&&Lc(e=>Tn(e,t)),t?.grant&&!Rc().has(t.grant)&&!Bc.has(t.grant)&&(Bc.add(t.grant),Vc())}if(e.type===`resync`&&(vl(),Ll(),jl(),El(),Yc(),Vc(),Sl()),e.type===`handoff`&&(ee().name!==`session`||ee().id!==e.sessionID)){let n=J(e.sessionID);_(`Handed off: ${n?.session.title||e.sessionID}`,``,{label:`Open`,run:()=>t(`/s/${f(e.sessionID)}`)})}});for(let t of Uc)t(e)}async function vl(){try{let{reads:e}=await u(`/api/reads`);K(`reads`,e??{})}catch{}}async function yl(e){try{let{reads:t}=await(await h(`${l(e)}/read`,{method:`POST`,json:{}})).json();t&&typeof t==`object`&&K(`reads`,t)}catch{}}var bl=0,Q,xl;function Sl(){return Q?(xl??=Q.then(()=>(xl=void 0,Sl())),xl):(Q=Cl().finally(()=>Q=void 0),Q)}async function Cl(){let t=bl;try{let e=Ra(await u(`/api/agent/concierge`));e&&t===bl&&Dc(e.status)}catch(n){n instanceof e&&n.status===404&&t===bl&&Dc(void 0);return}finally{Oc(!0)}await Tl()}var wl=new Jo;async function Tl(){let t=wl.begin();try{let e=Do((await u(`/api/agent/concierge/arm`)).armed);wl.fresh(t)&&e!==void 0&&Nc(qo(e,Date.now()))}catch(n){wl.fresh(t)&&n instanceof e&&(n.status===404||n.status===403)&&Nc(void 0)}}var $=new Ye;async function El(){let t=$.begin();try{let{decisions:e}=await u(`/api/decisions?state=open`),n=$.settle(t,(e??[]).map(Re).filter(e=>!!e));if(!n)return;bc(n),Tc(n)}catch(n){$.fail(t),n instanceof e&&n.status===404&&bc([])}}var Dl=new Na({fetch:e=>u(`/api/decisions/${f(e)}`),parse:e=>Re(e?.decision)??void 0,status:t=>t instanceof e?t.status:void 0});function Ol(e){let t=xc().get(e);return t?Promise.resolve(t):Dl.recall(e).then(t=>(t&&!xc().has(e)&&Tc([t]),t))}function kl(e){$.event(e),bc(t=>Ve(t,e)),Tc([e])}function Al(e){let t=yc().find(t=>t.id===e);t&&$.event({...t,state:`closed`}),bc(t=>t.filter(t=>t.id!==e)),El()}async function jl(){if(!y(dc()))vc([]);else try{vc((await u(`/api/enrollments`)).enrollments??[])}catch{vc([])}}async function Ml(){try{gc((await u(`/api/settings/speech`)).ready??null)}catch{gc(null)}}var Nl=`voice.viewPrefs`,Pl=!1,Fl=()=>G.prefsSource===`hub`||G.prefsSource===`local`;async function Il(){if(!(Fl()||Pl)){Pl=!0;try{K({prefs:vr(await u(`/api/prefs/view`)),prefsSource:`hub`})}catch(t){if(t instanceof e&&t.status===404){let e;try{e=JSON.parse(localStorage.getItem(Nl)??`null`)}catch{}K({prefs:vr(e),prefsSource:`local`})}else K(`prefsSource`,`error`)}finally{Pl=!1}Fl()&&await Rl()}}async function Ll(){K({prefsStale:!1,prefsSource:`unknown`}),await Il()}async function Rl(){let{clear:e,patch:t}=Tr(localStorage.getItem(`voice.pins`),localStorage.getItem(`voice.pinnedWorkspaces`),G.prefs);e&&(t&&(K(`prefs`,e=>({...e,...t})),!(await zl(t)).ok)||(localStorage.removeItem(`voice.pins`),localStorage.removeItem(`voice.pinnedWorkspaces`)))}async function zl(e){if(G.prefsSource===`local`)return localStorage.setItem(Nl,JSON.stringify(G.prefs)),{ok:!0};K(`prefsPending`,e=>e+1);try{let t=await(await h(`/api/prefs/view`,{method:`PUT`,json:e})).json().catch(()=>void 0);return G.prefsPending===1&&t&&!G.prefsStale&&K(`prefs`,vr(t)),{ok:!0}}catch(e){return{ok:!1,error:e}}finally{K(`prefsPending`,e=>e-1),!G.prefsPending&&G.prefsStale&&Ll()}}function Bl(e,t,n,r={}){Vl(e,[t],n,r)}function Vl(e,t,n,{message:r,undo:i=!1}={}){if(!Fl()){_(`Your view settings are still loading. Try again in a moment.`,`err`),Il();return}let a=new Set(G.prefs[e]),o=t.filter(e=>a.has(e)!==n),{prefs:s,patch:c}=Cr(G.prefs,e,o,n);c&&(K(`prefs`,s),r&&_(r,``,i?{label:`Undo`,run:()=>Vl(e,o,!n)}:void 0),zl(c).then(({ok:t,error:r})=>{t||(K(`prefs`,Cr(G.prefs,e,o,!n).prefs),_(`Could not save that change: ${m(r)}`,`err`))}))}async function Hl(e,t){try{return await h(`${l(e)}/expose`,{method:`POST`,json:{on:t}}),_(t?`Voice enabled`:`Voice disabled`),!0}catch(e){return _(`Could not ${t?`enable`:`disable`} Voice: ${m(e)}`,`err`),!1}}async function Ul(e,t){let n=yr(t);if(`error`in n)return _(n.error,`err`),!1;let{title:r}=n,i=J(e)?.session.title;if(i===r)return!1;Y.set(e,r,Date.now()),K(A(t=>void br(t.machines,e,r)));try{let t=await(await h(`${l(e)}/rename`,{method:`POST`,json:{title:r}})).json().catch(()=>void 0),n=typeof t?.title==`string`&&t.title?t.title:r;return n!==r&&J(e)?.session.title===r&&(Y.drop(e,r),Y.set(e,n,Date.now()),K(A(t=>void br(t.machines,e,n)))),!0}catch(t){return Y.drop(e,r),i!==void 0&&J(e)?.session.title===r&&K(A(t=>void br(t.machines,e,i))),_(`Could not rename: ${m(t)}`,`err`),!1}}var[Wl,Gl]=i(new Set),Kl=e=>Wl().has(e),ql=(e,t)=>Gl(n=>{let r=new Set(n);return t?r.add(e):r.delete(e),r}),Jl=6e4;async function Yl(e){if(Kl(e))return;let t=J(e)?.session.title;ql(e,!0);let n=!1;try{let r=await(await h(`${l(e)}/rename`,{method:`POST`,json:{auto:!0}})).json().catch(()=>void 0);if(r?.pending){n=!0,_(`OpenCode is still naming it; the title changes when it's ready`);let r=Date.now()+Jl,i=()=>{let n=J(e)?.session.title;n!==void 0&&n!==t?(ql(e,!1),_(`Renamed to “${n}”`)):Date.now()>=r?ql(e,!1):setTimeout(i,500)};setTimeout(i,500);return}let i=typeof r?.title==`string`?r.title:void 0;if(r?.unchanged||!i||i===t){_(`OpenCode kept the title`);return}Y.set(e,i,Date.now()),K(A(t=>void br(t.machines,e,i))),_(`Renamed to “${i}”`)}catch(e){_(`Could not auto-name: ${m(e)}`,`err`)}finally{n||ql(e,!1)}}async function Xl(e){try{await h(`${l(e)}/error/dismiss`,{method:`POST`,json:{}})}catch(e){_(`Could not dismiss the error: ${m(e)}`,`err`)}}async function Zl(e){try{let{stopped:t}=await(await h(`${l(e)}/stop`,{method:`POST`,json:{}})).json(),n=Array.isArray(t)?t.length:0;_(n?`Stopped ${n} session${n===1?``:`s`}`:`Nothing was running`)}catch(e){_(`Could not stop: ${m(e)}`,`err`)}}export{Ys as $,Nt as $n,Da as $t,Wc as A,oi as An,Me as Ar,ro as At,hc as B,ir as Bn,ge as Br,co as Bt,uc as C,Ci as Cn,Je as Cr,jo as Ct,J as D,li as Dn,Re as Dr,Ga as Dt,Ml as E,Oi as En,He as Er,Qa as Et,fc as F,ei as Fn,Se as Fr,vo as Ft,ac as G,C as Gn,be as Gr,uo as Gt,gl as H,Yn as Hn,he as Hr,Ya as Ht,gc as I,ni as In,le as Ir,bo as It,oc as J,Dn as Jn,Pa as Jt,$s as K,Tt as Kn,io as Kt,ll as L,Gr as Ln,pe as Lr,xo as Lt,Ul as M,Yr as Mn,ae as Mr,ao as Mt,Gc as N,Kr as Nn,ie as Nr,so as Nt,yl as O,ui as On,Ge as Or,ho as Ot,Kc as P,Jr as Pn,se as Pr,_o as Pt,rc as Q,Pt as Qn,pa as Qt,Hl as R,Wr as Rn,ve as Rr,go as Rt,sc as S,Si as Sn,mt as Sr,Bo as St,jl as T,bi as Tn,qe as Tr,fo as Tt,Zl as U,Qn as Un,ue as Ur,Ra as Ut,fl as V,sr as Vn,fe as Vr,oo as Vt,il as W,D as Wn,xe as Wr,Ha as Wt,qs as X,sn as Xn,ba as Xt,ic as Y,kt as Yn,Aa as Yt,Xs as Z,_n as Zn,Ea as Zt,Hc as _,Zi as _n,Ct as _r,Vo as _t,Vl as a,Hi as an,Kt as ar,bs as at,G as b,ki as bn,ft as br,Lo as bt,q as c,Mi as cn,Dt as cr,us as ct,Cc as d,Ni as dn,Mt as dr,No as dt,ka as en,kn as er,zs as et,Xl as f,Ki as fn,Ft as fr,Oo as ft,Qc as g,Gi as gn,St as gr,Po as gt,_c as h,ea as hn,Fn as hr,ko as ht,Bl as i,Vi as in,Bt as ir,Vs as it,Ol as j,si as jn,Fe as jr,eo as jt,dc as k,di as kn,Te as kr,mo as kt,jc as l,Bi as ln,Ot as lr,es as lt,Al as m,Xi as mn,On as mr,Io as mt,Yl as n,ca as nn,Pn as nr,Gs as nt,Ec as o,Ai as on,En as or,cs as ot,Xc as p,Yi as pn,It as pr,Ro as pt,Js as q,jn as qn,Ja as qt,Kl as r,Ui as rn,Gt as rr,Ws as rt,Mc as s,ji as sn,An as sr,ls as st,Ic as t,sa as tn,Vt as tr,js as tt,yc as u,Li as un,Jt as ur,Ho as ut,Fc as v,Qi as vn,wt as vr,Uo as vt,$c as w,Ti as wn,Ke as wr,$a as wt,cl as x,Di as xn,ct as xr,Yo as xt,Pc as y,N as yn,bt as yr,Go as yt,kl as z,Br as zn,y as zr,Za as zt};
|