@huynle/hub 0.0.0-stage → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/CHANGELOG.md +269 -0
  2. package/Dockerfile +51 -0
  3. package/LICENSE +21 -0
  4. package/README.md +1029 -2
  5. package/bin/hub.ts +20 -0
  6. package/docker/hub-deps.ts +42 -0
  7. package/package.json +85 -4
  8. package/rpc.ts +2 -0
  9. package/scripts/hub-local.sh +28 -0
  10. package/scripts/io.github.huynle.hub.plist +42 -0
  11. package/server.ts +3 -0
  12. package/src/central/assets.ts +74 -0
  13. package/src/central/auth.ts +271 -0
  14. package/src/central/config.ts +310 -0
  15. package/src/central/http.ts +1247 -0
  16. package/src/central/main.ts +136 -0
  17. package/src/central/oidc.ts +295 -0
  18. package/src/central/push-target.ts +97 -0
  19. package/src/central/push.ts +285 -0
  20. package/src/central/registry.ts +1153 -0
  21. package/src/central/speech/models.ts +89 -0
  22. package/src/central/speech/openai.ts +66 -0
  23. package/src/central/speech/openrouter.ts +71 -0
  24. package/src/central/speech/provider.ts +74 -0
  25. package/src/central/speech/service.ts +168 -0
  26. package/src/central/speech/settings.ts +375 -0
  27. package/src/central/spoke-ws.ts +300 -0
  28. package/src/central/store.ts +653 -0
  29. package/src/config.ts +170 -0
  30. package/src/env.ts +63 -0
  31. package/src/index.ts +236 -0
  32. package/src/key.ts +17 -0
  33. package/src/loopback.ts +41 -0
  34. package/src/migrate.ts +105 -0
  35. package/src/openrouter.ts +3 -0
  36. package/src/options.ts +33 -0
  37. package/src/protocol.ts +650 -0
  38. package/src/reply.ts +27 -0
  39. package/src/rpc.ts +98 -0
  40. package/src/setup.ts +124 -0
  41. package/src/speakable.ts +35 -0
  42. package/src/spoke/client.ts +272 -0
  43. package/src/spoke/conversation.ts +93 -0
  44. package/src/spoke/enroll.ts +79 -0
  45. package/src/spoke/herdr.ts +346 -0
  46. package/src/spoke/listing.ts +108 -0
  47. package/src/spoke/localhub.ts +287 -0
  48. package/src/spoke/locations.ts +34 -0
  49. package/src/spoke/own-server.ts +32 -0
  50. package/src/spoke/presence.ts +45 -0
  51. package/src/spoke/singleton.ts +103 -0
  52. package/src/spoke/spoke.ts +1212 -0
  53. package/src/spoke/summary.ts +117 -0
  54. package/src/spoke/timeline.ts +93 -0
  55. package/src/spoke/tracker.ts +345 -0
  56. package/src/spoke/watch.ts +78 -0
  57. package/src/status.ts +232 -0
  58. package/src/tui-commands.ts +53 -0
  59. package/src/tui-forms.ts +77 -0
  60. package/src/tui-presence.ts +75 -0
  61. package/src/tui.ts +479 -0
  62. package/src/turns.ts +94 -0
  63. package/src/voice-command.ts +65 -0
  64. package/tui.ts +2 -0
  65. package/web/dist/apple-touch-icon.png +0 -0
  66. package/web/dist/assets/index-DClBvfLL.css +1 -0
  67. package/web/dist/assets/index-Djo_yF0a.js +12 -0
  68. package/web/dist/favicon.ico +0 -0
  69. package/web/dist/icon-192.png +0 -0
  70. package/web/dist/icon-512.png +0 -0
  71. package/web/dist/icon-maskable-512.png +0 -0
  72. package/web/dist/icon.svg +18 -0
  73. package/web/dist/index.html +25 -0
  74. package/web/dist/manifest.webmanifest +18 -0
  75. package/web/dist/sw.js +151 -0
  76. package/web/dist/vad-worklet.js +27 -0
@@ -0,0 +1,12 @@
1
+ (function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e={context:void 0,registry:void 0,effects:void 0,done:!1,getContextId(){return t(this.context.count)},getNextContextId(){return t(this.context.count++)}};function t(t){let n=String(t),r=n.length-1;return e.context.id+(r?String.fromCharCode(96+r):``)+n}function n(t){e.context=t}var r=(e,t)=>e===t,i=Symbol(`solid-proxy`),a=typeof Proxy==`function`,o=Symbol(`solid-track`),s={equals:r},c=null,l=xe,u=1,d=2,f={owned:null,cleanups:null,context:null,owner:null},p={},m=null,h=null,g=null,_=null,v=null,y=0;function b(e,t){let n=g,r=m,i=e.length===0,a=t===void 0?r:t,o=i?f:{owned:null,cleanups:null,context:a?a.context:null,owner:a},s=i?e:()=>e(()=>T(()=>Te(o)));m=o,g=null;try{return D(s,!0)}finally{g=n,m=r}}function x(e,t){t=t?Object.assign({},s,t):s;let n={value:e,observers:null,observerSlots:null,comparator:t.equals||void 0};return[me.bind(n),e=>(typeof e==`function`&&(e=h&&h.running&&h.sources.has(n)?e(n.tValue):e(n.value)),he(n,e))]}function ee(e,t,n){ge(ve(e,t,!0,u))}function S(e,t,n){ge(ve(e,t,!1,u))}function C(e,t,n){l=Se;let r=ve(e,t,!1,u),i=pe&&de(pe);i&&(r.suspense=i),(!n||!n.render)&&(r.user=!0),v?v.push(r):ge(r)}function w(e,t,n){n=n?Object.assign({},s,n):s;let r=ve(e,t,!0,0);return r.observers=null,r.observerSlots=null,r.comparator=n.equals||void 0,ge(r),me.bind(r)}function te(e){return e&&typeof e==`object`&&`then`in e}function ne(t,n,r){let i,a,o;typeof n==`function`?(i=t,a=n,o=r||{}):(i=!0,a=t,o=n||{});let s=null,c=p,l=null,u=!1,d=!1,f=`initialValue`in o,_=typeof i==`function`&&w(i),v=new Set,[y,b]=(o.storage||x)(o.initialValue),[S,C]=x(void 0),[ne,re]=x(void 0,{equals:!1}),[ie,ae]=x(f?`ready`:`unresolved`);m&&oe(()=>{for(let e of v.keys())e.decrement();v.clear(),h&&s&&h.promises.delete(s),s=null}),e.context&&(l=e.getNextContextId(),o.ssrLoadFrom===`initial`?c=o.initialValue:e.load&&e.has(l)&&(c=e.load(l)));function E(e,t,n,r){return s===e&&(s=null,r!==void 0&&(f=!0),(e===c||t===c)&&o.onHydrated&&queueMicrotask(()=>o.onHydrated(r,{value:t})),c=p,h&&e&&u?(h.promises.delete(e),u=!1,D(()=>{h.running=!0,se(t,n)},!1)):se(t,n)),t}function se(e,t){D(()=>{t===void 0&&b(()=>e),ae(t===void 0?f?`ready`:`unresolved`:`errored`),C(t);for(let e of v.keys())e.decrement();v.clear()},!1)}function le(){let e=pe&&de(pe),t=y(),n=S();if(n!==void 0&&!s)throw n;return g&&!g.user&&e&&ee(()=>{ne(),s&&(e.resolved&&h&&u?h.promises.add(s):v.has(e)||(e.increment(),v.add(e)))}),t}function ue(e=!0){if(e!==!1&&d)return;d=!1;let t=_?_():i;if(u=h&&h.running,t==null||t===!1){E(s,T(y));return}h&&s&&h.promises.delete(s);let n,r=c===p?T(()=>{try{return a(t,{value:y(),refetching:e})}catch(e){n=e}}):c;if(n!==void 0)E(s,void 0,De(n),t);else return te(r)?(s=r,`v`in r?(r.s===1?E(s,r.v,void 0,t):E(s,void 0,De(r.v),t),r):(d=!0,queueMicrotask(()=>d=!1),D(()=>{ae(f?`refreshing`:`pending`),re()},!1),r.then(e=>E(r,e,void 0,t),e=>E(r,void 0,De(e),t)))):(E(s,r,void 0,t),r)}Object.defineProperties(le,{state:{get:()=>ie()},error:{get:()=>S()},loading:{get(){let e=ie();return e===`pending`||e===`refreshing`}},latest:{get(){if(!f)return le();let e=S();if(e&&!s)throw e;return y()}}});let fe=m;return _?ee(()=>(fe=m,ue(!1))):ue(!1),[le,{refetch:e=>ce(fe,()=>ue(e)),mutate:b}]}function re(e){return D(e,!1)}function T(e){if(g===null)return e();let t=g;g=null;try{return e()}finally{g=t}}function ie(e,t,n){let r=Array.isArray(e),i,a=n&&n.defer;return n=>{let o;if(r){o=Array(e.length);for(let t=0;t<e.length;t++)o[t]=e[t]()}else o=e();if(a)return a=!1,n;let s=T(()=>t(o,i,n));return i=o,s}}function ae(e){C(()=>T(e))}function oe(e){return m===null||(m.cleanups===null?m.cleanups=[e]:m.cleanups.push(e)),e}function E(){return g}function se(){return m}function ce(e,t){let n=m,r=g;m=e,g=null;try{return D(t,!0)}catch(e){ke(e)}finally{m=n,g=r}}var[le,ue]=x(!1);function de(e){let t;return m&&m.context&&(t=m.context[e.id])!==void 0?t:e.defaultValue}function fe(e){let t=w(e),n=w(()=>Ae(t()));return n.toArray=()=>{let e=n();return Array.isArray(e)?e:e==null?[]:[e]},n}var pe;function me(){let e=h&&h.running;if(this.sources&&(e?this.tState:this.state)){if((e?this.tState:this.state)===u)ge(this);else{let e=_;_=null,D(()=>Ce(this),!1),_=e}}if(g){let e=this.observers;if(!e||e[e.length-1]!==g){let t=e?e.length:0;g.sources?(g.sources.push(this),g.sourceSlots.push(t)):(g.sources=[this],g.sourceSlots=[t]),e?(e.push(g),this.observerSlots.push(g.sources.length-1)):(this.observers=[g],this.observerSlots=[g.sources.length-1])}}return e&&h.sources.has(this)?this.tValue:this.value}function he(e,t,n){let r=h&&h.running&&h.sources.has(e)?e.tValue:e.value;if(!e.comparator||!e.comparator(r,t)){if(h){let r=h.running;(r||!n&&h.sources.has(e))&&(h.sources.add(e),e.tValue=t),r||(e.value=t)}else e.value=t;e.observers&&e.observers.length&&D(()=>{for(let t=0;t<e.observers.length;t+=1){let n=e.observers[t],r=h&&h.running;r&&h.disposed.has(n)||((r?!n.tState:!n.state)&&(n.pure?_.push(n):v.push(n),n.observers&&we(n)),r?n.tState=u:n.state=u)}if(_.length>1e6)throw _=[],Error()},!1)}return t}function ge(e){if(!e.fn)return;Te(e);let t=y;_e(e,h&&h.running&&h.sources.has(e)?e.tValue:e.value,t),h&&!h.running&&h.sources.has(e)&&queueMicrotask(()=>{D(()=>{h&&(h.running=!0),g=m=e,_e(e,e.tValue,t),g=m=null},!1)})}function _e(e,t,n){let r,i=m,a=g;g=m=e;try{r=e.fn(t)}catch(t){return e.pure&&(h&&h.running?(e.tState=u,e.tOwned&&e.tOwned.forEach(Te),e.tOwned=void 0):(e.state=u,e.owned&&e.owned.forEach(Te),e.owned=null)),e.updatedAt=n+1,ke(t)}finally{g=a,m=i}(!e.updatedAt||e.updatedAt<=n)&&(e.updatedAt!=null&&`observers`in e?he(e,r,!0):h&&h.running&&e.pure?(h.sources.has(e)||(e.value=r),h.sources.add(e),e.tValue=r):e.value=r,e.updatedAt=n)}function ve(e,t,n,r=u,i){let a={fn:e,state:r,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:t,owner:m,context:m?m.context:null,pure:n};return h&&h.running&&(a.state=0,a.tState=r),m===null||m!==f&&(h&&h.running&&m.pure?m.tOwned?m.tOwned.push(a):m.tOwned=[a]:m.owned?m.owned.push(a):m.owned=[a]),a}function ye(e){let t=h&&h.running;if((t?e.tState:e.state)===0)return;if((t?e.tState:e.state)===d)return Ce(e);if(e.suspense&&T(e.suspense.inFallback))return e.suspense.effects.push(e);let n=[e];for(;(e=e.owner)&&(!e.updatedAt||e.updatedAt<y);){if(t&&h.disposed.has(e))return;(t?e.tState:e.state)&&n.push(e)}for(let r=n.length-1;r>=0;r--){if(e=n[r],t){let t=e,i=n[r+1];for(;(t=t.owner)&&t!==i;)if(h.disposed.has(t))return}if((t?e.tState:e.state)===u)ge(e);else if((t?e.tState:e.state)===d){let t=_;_=null,D(()=>Ce(e,n[0]),!1),_=t}}}function D(e,t){if(_)return e();let n=!1;t||(_=[]),v?n=!0:v=[],y++;try{let t=e();return be(n),t}catch(e){n||(v=null),_=null,ke(e)}}function be(e){if(_&&=(xe(_),null),e)return;let t;if(h){if(!h.promises.size&&!h.queue.size){let e=h.sources,n=h.disposed;v.push.apply(v,h.effects),t=h.resolve;for(let e of v)`tState`in e&&(e.state=e.tState),delete e.tState;h=null,D(()=>{for(let e of n)Te(e);for(let t of e){if(t.value=t.tValue,t.owned)for(let e=0,n=t.owned.length;e<n;e++)Te(t.owned[e]);t.tOwned&&(t.owned=t.tOwned),delete t.tValue,delete t.tOwned,t.tState=0}ue(!1)},!1)}else if(h.running){h.running=!1,h.effects.push.apply(h.effects,v),v=null,ue(!0);return}}let n=v;v=null,n.length&&D(()=>l(n),!1),t&&t()}function xe(e){for(let t=0;t<e.length;t++)ye(e[t])}function Se(t){let r,i=0;for(r=0;r<t.length;r++){let e=t[r];e.user?t[i++]=e:ye(e)}if(e.context){if(e.count){e.effects||=[],e.effects.push(...t.slice(0,i));return}n()}for(e.effects&&(e.done||!e.count)&&(t=[...e.effects,...t],i+=e.effects.length,delete e.effects),r=0;r<i;r++)ye(t[r])}function Ce(e,t){let n=h&&h.running;n?e.tState=0:e.state=0;for(let r=0;r<e.sources.length;r+=1){let i=e.sources[r];if(i.sources){let e=n?i.tState:i.state;e===u?i!==t&&(!i.updatedAt||i.updatedAt<y)&&ye(i):e===d&&Ce(i,t)}}}function we(e){let t=h&&h.running;for(let n=0;n<e.observers.length;n+=1){let r=e.observers[n];(t?!r.tState:!r.state)&&(t?r.tState=d:r.state=d,r.pure?_.push(r):v.push(r),r.observers&&we(r))}}function Te(e){let t;if(e.sources)for(;e.sources.length;){let t=e.sources.pop(),n=e.sourceSlots.pop(),r=t.observers;if(r&&r.length){let e=r.pop(),i=t.observerSlots.pop();n<r.length&&(e.sourceSlots[i]=n,r[n]=e,t.observerSlots[n]=i)}}if(e.tOwned){for(t=e.tOwned.length-1;t>=0;t--)Te(e.tOwned[t]);delete e.tOwned}if(h&&h.running&&e.pure)Ee(e,!0);else if(e.owned){for(t=e.owned.length-1;t>=0;t--)Te(e.owned[t]);e.owned=null}if(e.cleanups){for(t=e.cleanups.length-1;t>=0;t--)e.cleanups[t]();e.cleanups=null}h&&h.running?e.tState=0:e.state=0}function Ee(e,t){if(t||(e.tState=0,h.disposed.add(e)),e.owned)for(let t=0;t<e.owned.length;t++)Ee(e.owned[t])}function De(e){return e instanceof Error?e:Error(typeof e==`string`?e:`Unknown error`,{cause:e})}function Oe(e,t,n){try{for(let n of t)n(e)}catch(e){ke(e,n&&n.owner||null)}}function ke(e,t=m){let n=c&&t&&t.context&&t.context[c],r=De(e);if(!n)throw r;v?v.push({fn(){Oe(r,n,t)},state:u}):Oe(r,n,t)}function Ae(e){if(typeof e==`function`&&!e.length)return Ae(e());if(Array.isArray(e)){let t=[];for(let n=0;n<e.length;n++){let r=Ae(e[n]);if(Array.isArray(r)){if(r.length<32768)t.push.apply(t,r);else for(let e=0;e<r.length;e++)t.push(r[e])}else t.push(r)}return t}return e}var je=Symbol(`fallback`);function Me(e){for(let t=0;t<e.length;t++)e[t]()}function Ne(e,t,n={}){let r=[],i=[],a=[],s=0,c=t.length>1?[]:null;return oe(()=>Me(a)),()=>{let l=e()||[],u=l.length,d,f;return l[o],T(()=>{let e,t,o,m,h,g,_,v,y;if(u===0)s!==0&&(Me(a),a=[],r=[],i=[],s=0,c&&=[]),n.fallback&&(r=[je],i[0]=b(e=>(a[0]=e,n.fallback())),s=1);else if(s===0){for(i=Array(u),f=0;f<u;f++)r[f]=l[f],i[f]=b(p);s=u}else{for(o=Array(u),m=Array(u),c&&(h=Array(u)),g=0,_=Math.min(s,u);g<_&&r[g]===l[g];g++);for(_=s-1,v=u-1;_>=g&&v>=g&&r[_]===l[v];_--,v--)o[v]=i[_],m[v]=a[_],c&&(h[v]=c[_]);for(e=new Map,t=Array(v+1),f=v;f>=g;f--)y=l[f],d=e.get(y),t[f]=d===void 0?-1:d,e.set(y,f);for(d=g;d<=_;d++)y=r[d],f=e.get(y),f!==void 0&&f!==-1?(o[f]=i[d],m[f]=a[d],c&&(h[f]=c[d]),f=t[f],e.set(y,f)):a[d]();for(f=g;f<u;f++)f in o?(i[f]=o[f],a[f]=m[f],c&&(c[f]=h[f],c[f](f))):i[f]=b(p);i=i.slice(0,s=u),r=l.slice(0)}return i});function p(e){if(a[f]=e,c){let[e,n]=x(f);return c[f]=n,t(l[f],e)}return t(l[f])}}}function O(e,t){return T(()=>e(t||{}))}function Pe(){return!0}var Fe={get(e,t,n){return t===i?n:e.get(t)},has(e,t){return t===i||e.has(t)},set:Pe,deleteProperty:Pe,getOwnPropertyDescriptor(e,t){return{configurable:!0,enumerable:!0,get(){return e.get(t)},set:Pe,deleteProperty:Pe}},ownKeys(e){return e.keys()}};function Ie(e){return(e=typeof e==`function`?e():e)?e:{}}function Le(){for(let e=0,t=this.length;e<t;++e){let t=this[e]();if(t!==void 0)return t}}function Re(...e){let t=!1;for(let n=0;n<e.length;n++){let r=e[n];t||=!!r&&i in r,e[n]=typeof r==`function`?(t=!0,w(r)):r}if(a&&t)return new Proxy({get(t){for(let n=e.length-1;n>=0;n--){let r=Ie(e[n])[t];if(r!==void 0)return r}},has(t){for(let n=e.length-1;n>=0;n--)if(t in Ie(e[n]))return!0;return!1},keys(){let t=[];for(let n=0;n<e.length;n++)t.push(...Object.keys(Ie(e[n])));return[...new Set(t)]}},Fe);let n={},r=Object.create(null);for(let t=e.length-1;t>=0;t--){let i=e[t];if(!i)continue;let a=Object.getOwnPropertyNames(i);for(let e=a.length-1;e>=0;e--){let t=a[e];if(t===`__proto__`||t===`constructor`)continue;let o=Object.getOwnPropertyDescriptor(i,t);if(!r[t])r[t]=o.get?{enumerable:!0,configurable:!0,get:Le.bind(n[t]=[o.get.bind(i)])}:o.value===void 0?void 0:o;else{let e=n[t];e&&(o.get?e.push(o.get.bind(i)):o.value!==void 0&&e.push(()=>o.value))}}}let o={},s=Object.keys(r);for(let e=s.length-1;e>=0;e--){let t=s[e],n=r[t];n&&n.get?Object.defineProperty(o,t,n):o[t]=n?n.value:void 0}return o}function ze(e,...t){let n=t.length;if(a&&i in e){let r=n>1?t.flat():t[0],i=new Set,a=t.map(t=>{let n=t.filter(e=>!i.has(e)&&(i.add(e),!0));return new Proxy({get(t){return n.includes(t)?e[t]:void 0},has(t){return n.includes(t)&&t in e},keys(){return n.filter(t=>t in e)}},Fe)});return a.push(new Proxy({get(t){return r.includes(t)?void 0:e[t]},has(t){return!r.includes(t)&&t in e},keys(){return Object.keys(e).filter(e=>!r.includes(e))}},Fe)),a}let r=[];for(let e=0;e<=n;e++)r[e]={};for(let i of Object.getOwnPropertyNames(e)){let a=n;for(let e=0;e<t.length;e++)if(t[e].includes(i)){a=e;break}let o=Object.getOwnPropertyDescriptor(e,i);!o.get&&!o.set&&o.enumerable&&o.writable&&o.configurable?r[a][i]=o.value:Object.defineProperty(r[a],i,o)}return r}var Be=e=>`Stale read from <${e}>.`;function k(e){let t=`fallback`in e&&{fallback:()=>e.fallback};return w(Ne(()=>e.each,e.children,t||void 0))}function A(e){let t=e.keyed,n=w(()=>e.when,void 0,void 0),r=t?n:w(n,void 0,{equals:(e,t)=>!e==!t});return w(()=>{let i=r();if(i){let a=e.children;return typeof a==`function`&&a.length>0?T(()=>a(t?i:()=>{if(!T(r))throw Be(`Show`);return n()})):a}return e.fallback},void 0,void 0)}function j(e){let t=fe(()=>e.children),n=w(()=>{let e=t(),n=Array.isArray(e)?e:[e],r=()=>void 0;for(let e=0;e<n.length;e++){let t=e,i=n[e],a=r,o=w(()=>a()?void 0:i.when,void 0,void 0),s=i.keyed?o:w(o,void 0,{equals:(e,t)=>!e==!t});r=()=>a()||(s()?[t,o,i]:void 0)}return r});return w(()=>{let t=n()();if(!t)return e.fallback;let[r,i,a]=t,o=a.children;return typeof o==`function`&&o.length>0?T(()=>o(a.keyed?i():()=>{if(T(n)()?.[0]!==r)throw Be(`Match`);return i()})):o},void 0,void 0)}function M(e){return e}var Ve=new Set([`className`,`value`,`readOnly`,`noValidate`,`formNoValidate`,`isMap`,`noModule`,`playsInline`,`adAuctionHeaders`,`allowFullscreen`,`browsingTopics`,`defaultChecked`,`defaultMuted`,`defaultSelected`,`disablePictureInPicture`,`disableRemotePlayback`,`preservesPitch`,`shadowRootClonable`,`shadowRootCustomElementRegistry`,`shadowRootDelegatesFocus`,`shadowRootSerializable`,`sharedStorageWritable`,...`allowfullscreen.async.alpha.autofocus.autoplay.checked.controls.default.disabled.formnovalidate.hidden.indeterminate.inert.ismap.loop.multiple.muted.nomodule.novalidate.open.playsinline.readonly.required.reversed.seamless.selected.adauctionheaders.browsingtopics.credentialless.defaultchecked.defaultmuted.defaultselected.defer.disablepictureinpicture.disableremoteplayback.preservespitch.shadowrootclonable.shadowrootcustomelementregistry.shadowrootdelegatesfocus.shadowrootserializable.sharedstoragewritable`.split(`.`)]),He=new Set([`innerHTML`,`textContent`,`innerText`,`children`]),Ue=Object.assign(Object.create(null),{className:`class`,htmlFor:`for`}),We=Object.assign(Object.create(null),{class:`className`,novalidate:{$:`noValidate`,FORM:1},formnovalidate:{$:`formNoValidate`,BUTTON:1,INPUT:1},ismap:{$:`isMap`,IMG:1},nomodule:{$:`noModule`,SCRIPT:1},playsinline:{$:`playsInline`,VIDEO:1},readonly:{$:`readOnly`,INPUT:1,TEXTAREA:1},adauctionheaders:{$:`adAuctionHeaders`,IFRAME:1},allowfullscreen:{$:`allowFullscreen`,IFRAME:1},browsingtopics:{$:`browsingTopics`,IMG:1},defaultchecked:{$:`defaultChecked`,INPUT:1},defaultmuted:{$:`defaultMuted`,AUDIO:1,VIDEO:1},defaultselected:{$:`defaultSelected`,OPTION:1},disablepictureinpicture:{$:`disablePictureInPicture`,VIDEO:1},disableremoteplayback:{$:`disableRemotePlayback`,AUDIO:1,VIDEO:1},preservespitch:{$:`preservesPitch`,AUDIO:1,VIDEO:1},shadowrootclonable:{$:`shadowRootClonable`,TEMPLATE:1},shadowrootdelegatesfocus:{$:`shadowRootDelegatesFocus`,TEMPLATE:1},shadowrootserializable:{$:`shadowRootSerializable`,TEMPLATE:1},sharedstoragewritable:{$:`sharedStorageWritable`,IFRAME:1,IMG:1}});function Ge(e,t){let n=We[e];return typeof n==`object`?n[t]?n.$:void 0:n}var Ke=new Set([`beforeinput`,`click`,`dblclick`,`contextmenu`,`focusin`,`focusout`,`input`,`keydown`,`keyup`,`mousedown`,`mousemove`,`mouseout`,`mouseover`,`mouseup`,`pointerdown`,`pointermove`,`pointerout`,`pointerover`,`pointerup`,`touchend`,`touchmove`,`touchstart`]),qe=new Set(`altGlyph.altGlyphDef.altGlyphItem.animate.animateColor.animateMotion.animateTransform.circle.clipPath.color-profile.cursor.defs.desc.ellipse.feBlend.feColorMatrix.feComponentTransfer.feComposite.feConvolveMatrix.feDiffuseLighting.feDisplacementMap.feDistantLight.feDropShadow.feFlood.feFuncA.feFuncB.feFuncG.feFuncR.feGaussianBlur.feImage.feMerge.feMergeNode.feMorphology.feOffset.fePointLight.feSpecularLighting.feSpotLight.feTile.feTurbulence.filter.font.font-face.font-face-format.font-face-name.font-face-src.font-face-uri.foreignObject.g.glyph.glyphRef.hkern.image.line.linearGradient.marker.mask.metadata.missing-glyph.mpath.path.pattern.polygon.polyline.radialGradient.rect.set.stop.svg.switch.symbol.text.textPath.tref.tspan.use.view.vkern`.split(`.`)),Je={xlink:`http://www.w3.org/1999/xlink`,xml:`http://www.w3.org/XML/1998/namespace`},N=e=>w(()=>e());function Ye(e,t,n){let r=n.length,i=t.length,a=r,o=0,s=0,c=t[i-1].nextSibling,l=null;for(;o<i||s<a;)if(t[o]===n[s])o++,s++;else{for(;t[i-1]===n[a-1];)i--,a--;if(i===o){let t=a<r?s?n[s-1].nextSibling:n[a-s]:c;for(;s<a;)e.insertBefore(n[s++],t)}else if(a===s)for(;o<i;)(!l||!l.has(t[o]))&&t[o].remove(),o++;else if(t[o]===n[a-1]&&n[s]===t[i-1]){let r=t[--i].nextSibling;e.insertBefore(n[s++],t[o++].nextSibling),e.insertBefore(n[--a],r),t[i]=n[a]}else{if(!l){l=new Map;let e=s;for(;e<a;)l.set(n[e],e++)}let r=l.get(t[o]);if(r!=null){if(s<r&&r<a){let c=o,u=1,d;for(;++c<i&&c<a&&(d=l.get(t[c]))!=null&&d===r+u;)u++;if(u>r-s){let i=t[o];for(;s<r;)e.insertBefore(n[s++],i)}else e.replaceChild(n[s++],t[o++])}else o++}else t[o++].remove()}}}var P=`_$DX_DELEGATE`;function Xe(e,t,n,r={}){let i;return b(r=>{i=r,t===document?e():B(t,e(),!n&&t.firstChild?null:void 0,n)},r.owner),()=>{i(),t.textContent=``}}function F(e,t,n,r){let i,a=()=>{let t=r?document.createElementNS(`http://www.w3.org/1998/Math/MathML`,`template`):document.createElement(`template`);return t.innerHTML=e,n?t.content.firstChild.firstChild:r?t.firstChild:t.content.firstChild},o=t?()=>T(()=>document.importNode(i||=a(),!0)):()=>(i||=a()).cloneNode(!0);return o.cloneNode=o,o}function I(e,t=window.document){let n=t[P]||(t[P]=new Set);for(let r=0,i=e.length;r<i;r++){let i=e[r];n.has(i)||(n.add(i),t.addEventListener(i,ut))}}function L(e,t,n){ot(e)||(n==null?e.removeAttribute(t):e.setAttribute(t,n))}function Ze(e,t,n,r){ot(e)||(r==null?e.removeAttributeNS(t,n):e.setAttributeNS(t,n,r))}function Qe(e,t,n){ot(e)||(n?e.setAttribute(t,``):e.removeAttribute(t))}function R(e,t){ot(e)||(t==null?e.removeAttribute(`class`):e.className=t)}function $e(e,t,n,r){if(r)Array.isArray(n)?(e[`$$${t}`]=n[0],e[`$$${t}Data`]=n[1]):e[`$$${t}`]=n;else if(Array.isArray(n)){let r=n[0];e.addEventListener(t,n[0]=t=>r.call(e,n[1],t))}else e.addEventListener(t,n,typeof n!=`function`&&n)}function et(e,t,n={}){let r=Object.keys(t||{}),i=Object.keys(n),a,o;for(a=0,o=i.length;a<o;a++){let r=i[a];r&&r!==`undefined`&&!t[r]&&(ct(e,r,!1),delete n[r])}for(a=0,o=r.length;a<o;a++){let i=r[a],o=!!t[i];i&&i!==`undefined`&&n[i]!==o&&o&&(ct(e,i,!0),n[i]=o)}return n}function tt(e,t,n){if(!t)return n?L(e,`style`):t;let r=e.style;if(typeof t==`string`)return r.cssText=t;typeof n==`string`&&(r.cssText=n=void 0),n||={},t||={};let i,a;for(a in n)t[a]??r.removeProperty(a),delete n[a];for(a in t)i=t[a],i!==n[a]&&(r.setProperty(a,i),n[a]=i);return n}function nt(e,t,n){n==null?e.style.removeProperty(t):e.style.setProperty(t,n)}function rt(e,t={},n,r){let i={};return r||S(()=>i.children=dt(e,t.children,i.children)),S(()=>typeof t.ref==`function`&&z(t.ref,e)),S(()=>it(e,t,n,!0,i,!0)),i}function z(e,t,n){return T(()=>e(t,n))}function B(e,t,n,r){if(n!==void 0&&!r&&(r=[]),typeof t!=`function`)return dt(e,t,r,n);S(r=>dt(e,t(),r,n),r)}function it(e,t,n,r,i={},a=!1){t||={};for(let r in i)if(!(r in t)){if(r===`children`)continue;i[r]=lt(e,r,null,i[r],n,a,t)}for(let o in t){if(o===`children`){r||dt(e,t.children);continue}let s=t[o];i[o]=lt(e,o,s,i[o],n,a,t)}}function at(t){let n,r;return!ot()||!(n=e.registry.get(r=ht()))?t():(e.completed&&e.completed.add(n),e.registry.delete(r),n)}function ot(t){return!!e.context&&!e.done&&(!t||t.isConnected)}function st(e){return e.toLowerCase().replace(/-([a-z])/g,(e,t)=>t.toUpperCase())}function ct(e,t,n){let r=t.trim().split(/\s+/);for(let t=0,i=r.length;t<i;t++)e.classList.toggle(r[t],n)}function lt(e,t,n,r,i,a,o){let s,c,l,u,d;if(t===`style`)return tt(e,n,r);if(t===`classList`)return et(e,n,r);if(n===r)return r;if(t===`ref`)a||n(e);else if(t.slice(0,3)===`on:`){let i=t.slice(3);r&&e.removeEventListener(i,r,typeof r!=`function`&&r),n&&e.addEventListener(i,n,typeof n!=`function`&&n)}else if(t.slice(0,10)===`oncapture:`){let i=t.slice(10);r&&e.removeEventListener(i,r,!0),n&&e.addEventListener(i,n,!0)}else if(t.slice(0,2)===`on`){let i=t.slice(2).toLowerCase(),a=Ke.has(i);if(!a&&r){let t=Array.isArray(r)?r[0]:r;e.removeEventListener(i,t)}(a||n)&&($e(e,i,n,a),a&&I([i]))}else if(t.slice(0,5)===`attr:`)L(e,t.slice(5),n);else if(t.slice(0,5)===`bool:`)Qe(e,t.slice(5),n);else if((d=t.slice(0,5)===`prop:`)||(l=He.has(t))||!i&&((u=Ge(t,e.tagName))||(c=Ve.has(t)))||(s=e.nodeName.includes(`-`)||`is`in o)){if(d)t=t.slice(5),c=!0;else if(ot(e))return n;t===`class`||t===`className`?R(e,n):s&&!c&&!l?e[st(t)]=n:(t===`value`||t===`defaultValue`)&&(e.nodeName===`INPUT`||e.nodeName===`TEXTAREA`)?e[u||t]=n??``:e[u||t]=n}else{let r=i&&t.indexOf(`:`)>-1&&Je[t.split(`:`)[0]];r?Ze(e,r,t,n):L(e,Ue[t]||t,n)}return n}function ut(t){if(e.registry&&e.events&&e.events.find(([e,n])=>n===t))return;let n=t.target,r=`$$${t.type}`,i=t.target,a=t.currentTarget,o=e=>Object.defineProperty(t,"target",{configurable:!0,value:e}),s=()=>{let e=n[r];if(e&&!n.disabled){let i=n[`${r}Data`];if(i===void 0?e.call(n,t):e.call(n,i,t),t.cancelBubble)return}return n.host&&typeof n.host!=`string`&&!n.host._$host&&n.contains(t.target)&&o(n.host),!0},c=()=>{for(;s()&&(n=n._$host||n.parentNode||n.host););};Object.defineProperty(t,"currentTarget",{configurable:!0,get(){return n||document}}),e.registry&&!e.done&&(e.done=_$HY.done=!0);try{if(t.composedPath){let e=t.composedPath();o(e[0]);for(let t=0;t<e.length-2&&(n=e[t],s());t++){if(n._$host){n=n._$host,c();break}if(n.parentNode===a)break}}else c();o(i)}finally{t=n=null}}function dt(e,t,n,r,i){let a=ot(e);if(a){!n&&(n=[...e.childNodes]);let t=[];for(let e=0;e<n.length;e++){let r=n[e];r.nodeType===8&&r.data.slice(0,2)===`!$`?r.remove():t.push(r)}n=t}for(;typeof n==`function`;)n=n();if(t===n)return n;let o=typeof t,s=r!==void 0;if(e=s&&n[0]&&n[0].parentNode||e,o===`string`||o===`number`){if(a||o===`number`&&(t=t.toString(),t===n))return n;if(s){let i=n[0];i&&i.nodeType===3?i.data!==t&&(i.data=t):i=document.createTextNode(t),n=mt(e,n,r,i)}else n=n!==``&&typeof n==`string`?e.firstChild.data=t:e.textContent=t}else if(t==null||o===`boolean`){if(a)return n;n=mt(e,n,r)}else if(o===`function`)return S(()=>{let i=t();for(;typeof i==`function`;)i=i();n=dt(e,i,n,r)}),()=>n;else if(Array.isArray(t)){let o=[],c=n&&Array.isArray(n);if(ft(o,t,n,i))return S(()=>n=dt(e,o,n,r,!0)),()=>n;if(a){if(!o.length)return n;if(r===void 0)return n=[...e.childNodes];let t=o[0];if(t.parentNode!==e)return n;let i=[t];for(;(t=t.nextSibling)!==r;)i.push(t);return n=i}if(o.length===0){if(n=mt(e,n,r),s)return n}else c?n.length===0?pt(e,o,r):Ye(e,n,o):(n&&mt(e),pt(e,o));n=o}else if(t.nodeType){if(a&&t.parentNode)return n=s?[t]:t;if(Array.isArray(n)){if(s)return n=mt(e,n,r,t);mt(e,n,null,t)}else n==null||n===``||!e.firstChild?e.appendChild(t):e.replaceChild(t,e.firstChild);n=t}return n}function ft(e,t,n,r){let i=!1;for(let a=0,o=t.length;a<o;a++){let o=t[a],s=n&&n[e.length],c;if(o!=null&&o!==!0&&o!==!1){if((c=typeof o)==`object`&&o.nodeType)e.push(o);else if(Array.isArray(o))i=ft(e,o,s)||i;else if(c===`function`){if(r){for(;typeof o==`function`;)o=o();i=ft(e,Array.isArray(o)?o:[o],Array.isArray(s)?s:[s])||i}else e.push(o),i=!0}else{let t=String(o);s&&s.nodeType===3&&s.data===t?e.push(s):e.push(document.createTextNode(t))}}}return i}function pt(e,t,n=null){for(let r=0,i=t.length;r<i;r++)e.insertBefore(t[r],n)}function mt(e,t,n,r){if(n===void 0)return e.textContent=``;let i=r||document.createTextNode(``);if(t.length){let r=!1;for(let a=t.length-1;a>=0;a--){let o=t[a];if(i!==o){let t=o.parentNode===e;!r&&!a?t?e.replaceChild(i,o):e.insertBefore(i,n):t&&o.remove()}else r=!0}}else e.insertBefore(i,n);return[i]}function ht(){return e.getNextContextId()}var gt=`http://www.w3.org/2000/svg`;function _t(e,t=!1,n=void 0){return t?document.createElementNS(gt,e):document.createElement(e,{is:n})}function vt(t){let{useShadow:n}=t,r=document.createTextNode(``),i=()=>t.mount||document.body,a=se(),o,s=!!e.context;return C(()=>{s&&(se().user=s=!1),o||=ce(a,()=>w(()=>t.children));let e=i();if(e instanceof HTMLHeadElement){let[t,n]=x(!1);b(n=>B(e,()=>t()?n():o(),null)),oe(()=>n(!0))}else{let i=_t(t.isSVG?`g`:`div`,t.isSVG),a=n&&i.attachShadow?i.attachShadow({mode:`open`}):i;Object.defineProperty(i,"_$host",{get(){return r.parentNode},configurable:!0}),B(a,o),e.appendChild(i),t.ref&&t.ref(i),oe(()=>e.contains(i)&&e.removeChild(i))}},void 0,{render:!s}),r}function yt(t,n){let r=w(t);return w(()=>{let t=r();switch(typeof t){case`function`:return T(()=>t(n));case`string`:let r=qe.has(t),i=e.context?at():_t(t,r,T(()=>n.is));return rt(i,n,r),i}})}function bt(e){let[,t]=ze(e,[`component`]);return yt(()=>e.component,t)}var V=e=>e==null?``:String(e).trim(),xt=Object.freeze([[`role`,`Admins first`],[`email`,`Email`],[`lastSeen`,`Last seen`]]),St=Object.freeze([[`all`,`All`],[`admins`,`Admins`],[`active`,`Active`],[`disabled`,`Disabled`]]),Ct=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 wt(e){return e?.user?.role===`admin`}function Tt(e){let t=e?.user,n=e?.auth===`oidc`?`oidc`:`pairing`,r=wt(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 Et=Object.freeze([[`users`,`Users`],[`machines`,`Machines`],[`approvals`,`Approvals`],[`audit`,`Audit log`]]);function Dt(e){return wt(e)?Et.filter(([t])=>t!==`users`||e?.auth===`oidc`):[]}function Ot(e,t){return wt(e)&&t?.scope===`user`?[`user`,`default`]:[`user`]}function kt(e){return e&&e.startsWith(`/`)&&!e.startsWith(`//`)&&!e.includes(`\\`)?e:`/`}function At(e,t){if(e?.mode===`oidc`&&typeof e.signIn==`string`&&e.signIn)return`${e.signIn}?next=${encodeURIComponent(kt(t))}`}function jt(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 Mt={stt:[`provider`,`model`,`baseURL`,`language`],tts:[`provider`,`model`,`voice`,`baseURL`,`speed`]};function Nt(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 Mt[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 Pt(e){return{[e]:Object.fromEntries([...Mt[e],`apiKey`].map(e=>[e,null]))}}function Ft(e){let t=V(e);if(!t)return`Unknown action`;if(Ct[t])return Ct[t];let n=t.replace(/[._-]+/g,` `).trim().toLowerCase();return n.charAt(0).toUpperCase()+n.slice(1)}function It(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:Ft(e.action),target:e.target===void 0?void 0:n.get(e.target)??e.target,detail:e.detail}))}var Lt=e=>(V(e.email)||V(e.name)||e.id).toLowerCase();function Rt(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)=>Lt(e).localeCompare(Lt(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 zt(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 Bt(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 Vt=class extends Error{status;code;field;constructor(e,t){super(t),this.status=e}},Ht;function Ut(e){Ht=e}async function H(e,{method:t=`GET`,json:n,body:r,headers:i={},signal:a,keepalive:o}={}){let s={method:t,credentials:`same-origin`,headers:{...i},signal:a,keepalive:o};n===void 0?r!==void 0&&(s.body=r):(s.headers[`content-type`]=`application/json`,s.body=JSON.stringify(n));let c=await fetch(e,s);if(!c.ok){let e=await c.json().catch(()=>({}));c.status===401&&Ht?.();let t=new Vt(c.status,e.error||`HTTP ${c.status}`);throw typeof e.field==`string`&&(t.field=e.field),typeof e.code==`string`&&(t.code=e.code),t}return c}var U=async e=>(await H(e)).json(),Wt=encodeURIComponent,W=e=>`/api/sessions/${Wt(e)}`,G=e=>e instanceof Error?e.message:String(e),Gt=Symbol(`store-raw`),Kt=Symbol(`store-node`),qt=Symbol(`store-has`),Jt=Symbol(`store-self`);function Yt(e){let t=e[i];if(!t&&(Object.defineProperty(e,i,{value:t=new Proxy(e,rn)}),!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 Xt(e){let t;return typeof e==`object`&&!!e&&(e[i]||!(t=Object.getPrototypeOf(e))||t===Object.prototype||Array.isArray(e))}function Zt(e,t=new Set){let n,r,i,a;if(n=e!=null&&e[Gt])return n;if(!Xt(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=Zt(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=Zt(i,t))!==i&&(e[a]=r))}return e}function Qt(e,t){let n=e[t];return n||Object.defineProperty(e,t,{value:n=Object.create(null)}),n}function $t(e,t,n){if(e[t])return e[t];let[r,i]=x(n,{equals:!1,internal:!0});return r.$=i,e[t]=r}function en(e,t){let n=Reflect.getOwnPropertyDescriptor(e,t);return!n||n.get||!n.configurable||t===i||t===Kt||(delete n.value,delete n.writable,n.get=()=>e[i][t]),n}function tn(e){E()&&$t(Qt(e,Kt),Jt)()}function nn(e){return tn(e),Reflect.ownKeys(e)}var rn={get(e,t,n){if(t===Gt)return e;if(t===i)return n;if(t===o)return tn(e),n;let r=Qt(e,Kt),a=r[t],s=a?a():e[t];if(t===Kt||t===qt||t===`__proto__`)return s;if(!a){let n=Object.getOwnPropertyDescriptor(e,t);E()&&(typeof s!=`function`||Object.prototype.hasOwnProperty.call(e,t))&&!(n&&n.get)&&(s=$t(r,t,s)())}return Xt(s)?Yt(s):s},has(e,t){return t===Gt||t===i||t===o||t===Kt||t===qt||t===`__proto__`||(E()&&$t(Qt(e,qt),t)(),t in e)},set(){return!0},deleteProperty(){return!0},ownKeys:nn,getOwnPropertyDescriptor:en};function an(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[qt]&&e[qt][t]&&i!==void 0&&e[qt][t].$()):(e[t]=n,e[qt]&&e[qt][t]&&i===void 0&&e[qt][t].$());let o=Qt(e,Kt),s;if((s=$t(o,t,i))&&s.$(()=>n),Array.isArray(e)&&e.length!==a){for(let t=e.length;t<a;t++)(s=o[t])&&s.$();(s=$t(o,`length`,a))&&s.$(e.length)}(s=o[Jt])&&s.$()}function on(e,t){let n=Object.keys(t);for(let r=0;r<n.length;r+=1){let i=n[r];sn(i)||an(e,i,t[i])}}function sn(e){return e===`__proto__`||e===`constructor`||e===`prototype`}function cn(e,t){if(typeof t==`function`&&(t=t(e)),t=Zt(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&&an(e,n,r)}an(e,`length`,r)}else on(e,t)}function ln(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&&sn(r)))return;if(Array.isArray(r)){for(let i=0;i<r.length;i++)ln(e,[r[i]].concat(t),n);return}if(o&&a===`function`){for(let i=0;i<e.length;i++)r(e[i],i)&&ln(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)ln(e,[r].concat(t),n);return}if(t.length>1){ln(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=Zt(a),r===void 0||Xt(i)&&Xt(a)&&!Array.isArray(a)?on(i,a):an(e,r,a))}function un(...[e,t]){let n=Zt(e||{}),r=Array.isArray(n),i=Yt(n);function a(...e){re(()=>{r&&e.length===1?cn(n,e[0]):ln(n,e)})}return[i,a]}var dn=Symbol(`store-root`);function fn(e){return e===`__proto__`||e===`constructor`||e===`prototype`}function pn(e,t,n,r,i){if(fn(n))return;let a=t[n];if(e===a)return;let o=Array.isArray(e);if(n!==dn&&(!Xt(e)||!Xt(a)||o!==Array.isArray(a)||i&&e[i]!==a[i])){an(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++)pn(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++)an(a,n,e[n]);for(;n<e.length;n++)an(a,n,f[n]),pn(e[n],a,n,r,i);a.length>e.length&&an(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?(an(a,n,f[n]),pn(e[n],a,n,r,i)):an(a,n,e[n])}else for(let t=0,n=e.length;t<n;t++)pn(e[t],a,t,r,i);a.length>e.length&&an(a,`length`,e.length);return}let s=Object.keys(e);for(let t=0,n=s.length;t<n;t++)fn(s[t])||pn(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&&an(a,c[t],void 0)}function mn(e,t={}){let{merge:n,key:r=`id`}=t,i=Zt(e);return e=>{if(!Xt(e)||!Xt(i))return i;let t=pn(i,{[dn]:e},dn,n,r);return t===void 0?e:t}}var hn=new WeakMap,gn={get(e,t){if(t===Gt)return e;let n=e[t];if(t===i||t===o||t===Kt||t===qt||t===`__proto__`)return n;let r;return Xt(n)?hn.get(n)||(hn.set(n,r=new Proxy(n,gn)),r):n},set(e,t,n){return an(e,t,Zt(n)),!0},deleteProperty(e,t){return an(e,t,void 0,!0),!0}};function _n(e){return t=>{if(Xt(t)){let n;(n=hn.get(t))||hn.set(t,n=new Proxy(t,gn)),e(n)}return t}}var vn={blocked:0,working:1,error:2,idle:3},yn=e=>vn[e]??3,bn=e=>String(e??``).replace(/(.)[\\/]+$/,`$1`);function xn(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 vn?e.state:`idle`}function Sn(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 Cn(e){let t=`idle`;for(let n of e)yn(n)<vn[t]&&(t=n);return t}function wn(e){if(!e)return;if(e.kind===`thinking`)return`Thinking…`;let t=e.tool||`tool`;return e.summary?`${t} · ${e.summary}`:t}function Tn(e){return String(e??``).normalize(`NFD`).replace(/\p{M}/gu,``).toLowerCase()}var En=e=>Tn(e).split(/\s+/).filter(Boolean);function Dn(e,t){let n=En(t);if(!n.length)return!0;let r=[e.title||`Untitled`,e.projectName,e.project,e.directory].filter(Boolean).map(Tn);return n.every(e=>r.some(t=>t.includes(e)))}function On(e,t){let n=bn(e),r=bn(t);return n===r?``:n.startsWith(`${r}/`)?n.slice(r.length+1):n}var kn=e=>String(e??``).replace(/(.)[\\/]+$/,`$1`),An=e=>kn(e).split(/[\\/]/).pop()||String(e??``),jn=[`hiddenSessions`,`hiddenWorkspaces`,`pinnedSessions`,`pinnedWorkspaces`],Mn=500,Nn=4096,Pn=e=>Array.isArray(e)?[...new Set(e.filter(e=>typeof e==`string`&&e.length>0&&e.length<=Nn))].slice(0,Mn):[];function Fn(e){let t=e,n=t&&typeof t==`object`&&t.prefs&&typeof t.prefs==`object`?t.prefs:e??{};return Object.fromEntries(jn.map(e=>[e,Pn(n[e])]))}function In(e,t,n,r){if(!jn.includes(t))throw Error(`unknown prefs list: ${t}`);let i=e[t]??[];if(i.includes(n)===r)return{prefs:e,patch:void 0};let a=r?[...i,n]:i.filter(e=>e!==n);return{prefs:{...e,[t]:a},patch:{[t]:a}}}var Ln=e=>{try{let t=JSON.parse(e??`null`);return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}catch{return[]}};function Rn(e,t,n){let r=e!=null||t!=null,i={};for(let[r,a]of[[`pinnedSessions`,e],[`pinnedWorkspaces`,t]]){let e=n[r]??[],t=Ln(a).filter(t=>!e.includes(t));t.length&&(i[r]=Pn([...e,...t]))}return{clear:r,patch:Object.keys(i).length?i:void 0}}var zn={working:`working`,blocked:`blocked`};function Bn(e){return Cn([xn(e),zn[e?.terminal?.status??``]??`idle`])}var Vn=e=>!!e?.open&&e.terminal?.source===`herdr`&&!!e.terminal.workspaceID,Hn=e=>kn(e?.project||e?.directory);function Un(e){return Vn(e)?`herdr:${e.terminal.workspaceID}`:Hn(e)}var Wn=(e,t)=>Hn(e)===t||kn(e.directory)===t||Vn(e)&&Un(e)===t;function Gn(e,t){if(t.sessions.has(e.id))return!0;for(let n of t.workspaces)if(Wn(e,n))return!0;return!1}function Kn(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 qn(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?Kn(e,t):t)}return[...r.values()]}function Jn(e){let t=Yn(e);return e=>Gn(e,t)}var Yn=e=>({sessions:new Set(e?.hiddenSessions??[]),workspaces:new Set(e?.hiddenWorkspaces??[])}),Xn=e=>e?.terminals?.herdr?.workspaces??[];function Zn(e){let t=kn(e.project||e.directory),n=e.project?On(e.directory,t):``;return`${e.projectName||An(t)}${n?` › ${n}`:``}`}function Qn(e,t,n){let r=Vn(e)?e.terminal.workspace||Xn(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:Bn(e),blockers:Sn(e),exposed:e.exposed!==!1,pinned:n.has(e.id),nowText:wn(e.now),where:Zn(e),workspace:r??(e.projectName||An(Hn(e))),machineID:t?.id}}var $n=50,er=200;function tr(e){let t=Xn(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(kn))),r=qn(e),i=new Map,a=new Map;for(let e of r){let t=kn(e.directory);t&&(i.set(t,Math.max(i.get(t)??0,e.updated??0)),a.set(t,Zn(e)))}for(let e of r){let t=kn(e.project);if(!t||a.has(t))continue;let n=Math.max(...r.filter(e=>kn(e.project)===t).map(e=>e.updated??0));i.set(t,n),a.set(t,e.projectName||An(t))}let o=[...i.entries()].filter(([e])=>!n.has(e)).sort((e,t)=>t[1]-e[1]).slice(0,$n).map(([e])=>({kind:`folder`,key:e,label:a.get(e)??An(e),directories:[e]}));return{herdr:!!e?.terminals?.herdr,targets:[...t,...o]}}function nr({target:e,directory:t,title:n,openInHerdr:r}){let i={directory:t},a=String(n??``).trim().slice(0,er);return a&&(i.title=a),r&&e?.kind===`herdr`&&e.workspaceID&&(i.herdrWorkspace=e.workspaceID),i}function rr(e,t,n){let r=new Set(t.pinnedSessions),i=Jn(t),a=[];for(let t of e??[])for(let e of qn(t)){let o=Qn(e,t,r),s=o.open?o.terminal?.source===`herdr`?`herdr`:`tui`:`background`,c=n[o.id];a.push({...o,machineName:t.name,machineOnline:!!t.online,source:s,running:o.state===`working`||o.state===`blocked`,hidden:i(e),unread:c!==void 0&&o.updated>c,group:Un(e)})}return a.sort((e,t)=>t.updated-e.updated)}var ir=Object.freeze({query:``,filters:Object.freeze({status:`all`,source:`all`,machine:``,hidden:!1}),sort:Object.freeze({key:`activity`,dir:`desc`})}),ar=[`status`,`title`,`project`,`server`,`source`,`activity`],or=[`all`,`needs`,`running`,`idle`],sr=[`all`,`open`,`background`],cr=(e,t)=>e.localeCompare(t,void 0,{sensitivity:`base`}),lr=(e,t)=>t.updated-e.updated,ur={status:(e,t)=>vn[e.state]-vn[t.state]||lr(e,t),title:(e,t)=>cr(e.title,t.title)||lr(e,t),project:(e,t)=>cr(e.workspace,t.workspace)||lr(e,t),server:(e,t)=>cr(e.machineName,t.machineName)||lr(e,t),source:(e,t)=>cr(e.source,t.source)||lr(e,t),activity:(e,t)=>e.updated-t.updated};function dr(e,t){return!(e.hidden!==t.hidden||t.status===`needs`&&e.state!==`blocked`||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 fr(e,t){if(!t.trim()||Dn(e,t))return!0;let n=Tn(t).split(/\s+/).filter(Boolean),r=[e.title,e.workspace,e.where,e.directory,e.machineName].map(Tn);return n.every(e=>r.some(t=>t.includes(e)))}function pr(e,t){let n=ur[t.sort.key],r=t.sort.key===`activity`?t.sort.dir===`desc`?-1:1:t.sort.dir===`asc`?1:-1;return e.filter(e=>dr(e,t.filters)&&fr(e,t.query)).sort((e,t)=>r*n(e,t))}var mr=(e,t,n)=>t.includes(e)?e:n;function hr(e){let t;try{if(t=JSON.parse(e??`null`)??{},typeof t!=`object`||Array.isArray(t))return ir}catch{return ir}let n=t.filters??{},r=t.sort??{},i=ir,a=mr(r.key,ar,i.sort.key),o=a===r.key?mr(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:mr(n.status,or,i.filters.status),source:mr(n.source,sr,i.filters.source),machine:typeof n.machine==`string`&&n.machine.length<=200?n.machine:``,hidden:n.hidden===!0},l=Object.keys(c).every(e=>c[e]===i.filters[e]);return l&&s===i.sort?ir:{query:``,filters:l?i.filters:c,sort:s}}function gr(e){return JSON.stringify({filters:e.filters,sort:e.sort})}function _r(e,{query:t,groupBy:n,sortBy:r,recentLimit:i=20}){let a=e.filter(e=>!e.hidden),o=r===`title`?(e,t)=>cr(e.title,t.title)||lr(e,t):lr;if(t.trim())return[{id:`results`,title:`Results`,kind:`results`,rows:a.filter(e=>fr(e,t)).sort(lr)}];let s=new Set,c=e=>{for(let t of e)s.add(t.id);return e},l=[],u=e=>e.rows.length&&l.push(e);u({id:`needs`,title:`Needs you`,kind:`needs`,rows:c(a.filter(e=>e.state===`blocked`).sort(lr))}),u({id:`running`,title:`Running`,kind:`running`,rows:c(a.filter(e=>!s.has(e.id)&&e.running).sort(lr))}),u({id:`pinned`,title:`Pinned`,kind:`pinned`,rows:c(a.filter(e=>!s.has(e.id)&&e.pinned).sort(o))});let d=new Map;for(let e of a){if(s.has(e.id)||!e.open)continue;let t=n===`machine`?e.machineID:`${e.machineID}\u0000${e.group}`,r=d.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:[]},d.set(t,r)),r.rows.push(e)}let f=e=>Math.max(...e.map(e=>e.updated)),p=[...d.values()].sort((e,t)=>r===`title`&&cr(e.title,t.title)||f(t.rows)-f(e.rows));for(let e of p){e.rows.sort(o),c(e.rows);let t=[...e.rows].sort(lr);u({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 u({id:`recents`,title:`Recents`,kind:`recents`,rows:a.filter(e=>!s.has(e.id)).sort(lr).slice(0,i)}),l}function vr(e,t){return t.phase!==`off`&&t.sessionID===e.id||e.conversation===!0}var yr=.75,br=.05;function xr(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/br)/Math.round(1/br);return Math.min(2,Math.max(yr,Number(n.toFixed(2))))}function Sr(e){let t=xr(e);return`${Number.isInteger(t)?t.toFixed(1):String(t)}×`}var Cr={working:`working`,blocked:`blocked`,error:`failed`,idle:`done`},wr=160,Tr=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(`
2
+ `).map(e=>e.trim()).filter(Boolean).at(-1);a&&(i.line=a.length>wr?`…${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=Cr[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`:Dr(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 Dr(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 ${Dr(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 Er(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 Dr(e){if(e.kind===`thinking`)return`Thinking…`;let t=e.tool||`tool`;return e.summary?`${t} · ${e.summary}`:t}var Or=Object.freeze({working:`Working on it.`,subagent:`Started a subagent.`,still:`Still working.`}),kr=class{ackMs;quietMs;stillMs;enabled=!0;busy=!1;awaiting;pendingSubagent=!1;lastSay=-1/0;lastSpoke=-1/0;user=!1;agent=!1;cue=!1;constructor({ackMs:e=5e3,quietMs:t=3e3,stillMs:n=4e4}={}){this.ackMs=e,this.quietMs=t,this.stillMs=n}get gated(){return this.user||this.agent||this.cue}heard(e){return this.awaiting=e,this.enabled&&!this.user?[{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`}]:[]}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:Or[e]}]}},Ar=new Set([`working`,`blocked`]);function jr(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`&&!Ar.has(t??``)?i.push(e.id):Ar.has(t??``)&&!Ar.has(e.state)&&a.push(e.id)}for(let[e,t]of r)Ar.has(t)&&a.push(e);return{started:i,finished:a}}function Mr(e){return(e??[]).some(e=>e.state===`working`)}var Nr=Object.freeze([`openrouter`,`openai-compatible`]),Pr={stt:[`provider`,`model`,`baseURL`,`language`],tts:[`provider`,`model`,`voice`,`baseURL`,`speed`]},Fr=e=>e==null?``:String(e).trim();function Ir(e){let t={};for(let n of[`stt`,`tts`]){let r=e?.[n]??{};t[n]=Object.fromEntries(Pr[n].map(e=>[e,Fr(r[e])])),t[n].apiKey={action:`keep`,value:``}}return t}function Lr(e,t){let n={};for(let r of[`stt`,`tts`]){let i=e?.[r]??{},a=t[r],o={};for(let e of Pr[r]){if(e===`baseURL`&&Fr(a.provider)!==`openai-compatible`)continue;let t=Fr(a[e]);t!==Fr(i[e])&&(o[e]=t===``?null:e===`speed`?Number(t):t)}a.apiKey?.action===`set`?o.apiKey=Fr(a.apiKey.value):a.apiKey?.action===`clear`&&(o.apiKey=null),Object.keys(o).length&&(n[r]=o)}return n}function Rr(e){let t={};for(let n of[`stt`,`tts`]){let r=e[n],i=(e,r)=>t[`${n}.${e}`]=r;if(Nr.includes(Fr(r.provider))||i(`provider`,`Choose a provider.`),Fr(r.model)||i(`model`,`Enter a model.`),Fr(r.provider)===`openai-compatible`){let e=Fr(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`){Fr(r.voice)||i(`voice`,`Enter a voice.`);let e=Fr(r.speed);e&&!(Number(e)>=.25&&Number(e)<=4)&&i(`speed`,`Use a number from 0.25 to 4.`)}r.apiKey?.action===`set`&&!Fr(r.apiKey.value)&&i(`apiKey`,`Paste the new key, or cancel.`)}return t}function zr(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 Br=/^(localhost|127(?:\.\d{1,3}){3}|\[::1\])$/i;function Vr(e,t){if(!e||e.stt&&e.tts)return;let n=!1;try{n=Br.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 Hr=()=>({machines:void 0,reads:{},prefs:Fn({}),prefsSource:`unknown`,prefsPending:0,prefsStale:!1,connection:`connecting`,enrollmentRev:0}),Ur=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function Wr(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 Gr(e,t){if(!Ur(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 Wr(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 Wr(e.machines,t.sessionID,e=>{e.conversation=t.on,n=!0}),n}case`reads`:return Ur(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=Fn(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 Kr(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??qr(e,t)}function qr(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=Jr(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 Jr(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 Yr(e){return(e??[]).some(e=>e.state===`working`||e.state===`blocked`)}var Xr=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 Tr(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(!Ur(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 Ur(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}}},Zr=e=>e&&e.startsWith(`/`)&&!e.startsWith(`//`)&&!e.includes(`\\`)?e:`/`;function Qr(e){let t=e.pathname,n=e.searchParams;if(t===`/pair`)return{name:`pair`,next:Zr(n.get(`next`)),error:n.get(`error`)??``};if(t===`/approve`)return{name:`approve`,code:n.get(`code`)??``};if(t===`/new`)return{name:`new`,machine:n.get(`machine`)??void 0,dir:n.get(`dir`)??void 0,key:n.get(`key`)??void 0};if(t===`/settings`)return{name:`settings`,section:e.hash.slice(1)||void 0};let r=/^\/s\/([^/]+)$/.exec(t);if(r)try{return{name:`session`,id:decodeURIComponent(r[1])}}catch{return{name:`home`}}return{name:`home`}}var[$r,ei]=x(new URL(location.href)),ti=$r,K=()=>Qr($r()),ni=0;function ri(e,{replace:t=!1}={}){let n=new URL(e,location.origin);n.pathname+n.search+n.hash!==location.pathname+location.search+location.hash&&(history[t?`replaceState`:`pushState`]({},``,n.pathname+n.search+n.hash),t||ni++),ei(new URL(location.href))}window.addEventListener(`popstate`,()=>{ni=Math.max(0,ni-1),ei(new URL(location.href))}),document.addEventListener(`click`,e=>{let t=e.target?.closest?.(`a[href]`);if(!t||t.target||t.hasAttribute(`download`)||e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let n=t.getAttribute(`href`)??``;!n.startsWith(`/`)||n.startsWith(`//`)||n.startsWith(`/auth/`)||n.startsWith(`/api/`)||(e.preventDefault(),ri(n))});var ii=e=>`/s/${encodeURIComponent(e)}`,[ai,oi]=x(),si=ai,ci=0,li;function q(e,t=``,n){let r=++ci;oi({id:r,text:e,kind:t,action:n}),clearTimeout(li),li=setTimeout(()=>ai()?.id===r&&oi(void 0),n||t?8e3:4e3)}var ui=()=>oi(void 0),[J,Y]=un(Hr()),di=new Xr,[fi,pi]=x(0),mi=fi,[X,hi]=x(),[gi,_i]=x(),[vi,yi]=x(),[bi,xi]=x([]),Si=new Set;function Ci(e){return Si.add(e),()=>Si.delete(e)}var wi=b(()=>w(()=>rr(J.machines,J.prefs,J.reads))),Ti=e=>Kr(J.machines,e);Ut(()=>{K().name!==`pair`&&(Ni(),hi(void 0),Ei())});function Ei(){let e=location.pathname+location.search;ri(`/pair${e===`/`||e.startsWith(`/pair`)?``:`?next=${Wt(e)}`}`,{replace:!0})}async function Di(){if(X())return!0;let e=await fetch(`/api/me`,{credentials:`same-origin`});if(e.status===401)return Ei(),!1;if(!e.ok)throw Error(`HTTP ${e.status}`);return hi(await e.json()),!0}async function Oi(){if(gi()!==void 0)return gi()??null;try{let e=await fetch(`/api/auth`,{credentials:`same-origin`}),t=e.ok?await e.json():null;return _i(t),t}catch{return null}}var ki,Ai,ji=1e3;function Mi(){if(ki)return;clearTimeout(Ai),Y(`connection`,`connecting`);let e=new EventSource(`/api/events`,{withCredentials:!0});ki=e,e.onopen=()=>{ji=1e3,Y(`connection`,`live`),Hi(),Fi(),Li()},e.onerror=async()=>{Y(`connection`,`down`),(await fetch(`/api/me`,{credentials:`same-origin`}).catch(()=>void 0))?.status===401?(Ni(),hi(void 0),Ei()):e.readyState===EventSource.CLOSED&&ki===e&&(ki=void 0,Ai=setTimeout(Mi,ji),ji=Math.min(3e4,ji*2))},e.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{return}Pi(t)}}function Ni(){ki?.close(),ki=void 0,clearTimeout(Ai)}function Pi(e){re(()=>{if(e.type===`prefs`?(Y(_n(t=>Gr(t,e))),J.prefsStale&&!J.prefsPending&&Ui()):Y(_n(t=>Gr(t,e))),e.type===`status`){let t=Ti(e.sessionID);!di.has(e.sessionID)&&t&&di.feed(e.sessionID)}di.apply(e)!==void 0&&pi(e=>e+1),e.type===`enrollment`&&Li(),e.type===`handoff`&&(K().name!==`session`||K().id!==e.sessionID)&&q(`Handed off: ${Ti(e.sessionID)?.session.title||e.sessionID}`,``,{label:`Open`,run:()=>ri(`/s/${Wt(e.sessionID)}`)})});for(let t of Si)t(e)}async function Fi(){try{let{reads:e}=await U(`/api/reads`);Y(`reads`,e??{})}catch{}}async function Ii(e){try{let{reads:t}=await(await H(`${W(e)}/read`,{method:`POST`,json:{}})).json();t&&typeof t==`object`&&Y(`reads`,t)}catch{}}async function Li(){if(!wt(X()))xi([]);else try{xi((await U(`/api/enrollments`)).enrollments??[])}catch{xi([])}}async function Ri(){try{yi((await U(`/api/settings/speech`)).ready??null)}catch{yi(null)}}var zi=`voice.viewPrefs`,Bi=!1,Vi=()=>J.prefsSource===`hub`||J.prefsSource===`local`;async function Hi(){if(!(Vi()||Bi)){Bi=!0;try{Y({prefs:Fn(await U(`/api/prefs/view`)),prefsSource:`hub`})}catch(e){if(e instanceof Vt&&e.status===404){let e;try{e=JSON.parse(localStorage.getItem(zi)??`null`)}catch{}Y({prefs:Fn(e),prefsSource:`local`})}else Y(`prefsSource`,`error`)}finally{Bi=!1}Vi()&&await Wi()}}async function Ui(){Y({prefsStale:!1,prefsSource:`unknown`}),await Hi()}async function Wi(){let{clear:e,patch:t}=Rn(localStorage.getItem(`voice.pins`),localStorage.getItem(`voice.pinnedWorkspaces`),J.prefs);e&&(t&&(Y(`prefs`,e=>({...e,...t})),!(await Gi(t)).ok)||(localStorage.removeItem(`voice.pins`),localStorage.removeItem(`voice.pinnedWorkspaces`)))}async function Gi(e){if(J.prefsSource===`local`)return localStorage.setItem(zi,JSON.stringify(J.prefs)),{ok:!0};Y(`prefsPending`,e=>e+1);try{let t=await(await H(`/api/prefs/view`,{method:`PUT`,json:e})).json().catch(()=>void 0);return J.prefsPending===1&&t&&!J.prefsStale&&Y(`prefs`,Fn(t)),{ok:!0}}catch(e){return{ok:!1,error:e}}finally{Y(`prefsPending`,e=>e-1),!J.prefsPending&&J.prefsStale&&Ui()}}function Ki(e,t,n,{message:r,undo:i=!1}={}){if(!Vi()){q(`Your view settings are still loading. Try again in a moment.`,`err`),Hi();return}let{prefs:a,patch:o}=In(J.prefs,e,t,n);o&&(Y(`prefs`,a),r&&q(r,``,i?{label:`Undo`,run:()=>Ki(e,t,!n)}:void 0),Gi(o).then(({ok:r,error:i})=>{r||(Y(`prefs`,In(J.prefs,e,t,!n).prefs),q(`Could not save that change: ${G(i)}`,`err`))}))}async function qi(e,t){try{return await H(`${W(e)}/expose`,{method:`POST`,json:{on:t}}),q(t?`Voice enabled`:`Voice disabled`),!0}catch(e){return q(`Could not ${t?`enable`:`disable`} Voice: ${G(e)}`,`err`),!1}}async function Ji(e){try{let{stopped:t}=await(await H(`${W(e)}/stop`,{method:`POST`,json:{}})).json(),n=Array.isArray(t)?t.length:0;q(n?`Stopped ${n} session${n===1?``:`s`}`:`Nothing was running`)}catch(e){q(`Could not stop: ${G(e)}`,`err`)}}var Yi=F(`<svg viewBox="72 51 368 368"aria-hidden=true><g transform="translate(0 20.7)"><g stroke=currentColor stroke-width=22 stroke-linecap=round><line x1=256 y1=256 x2=256 y2=90></line><line x1=256 y1=256 x2=399.8 y2=339></line><line x1=256 y1=256 x2=112.2 y2=339></line></g><g fill=currentColor><circle cx=256 cy=90 r=40></circle><circle cx=399.8 cy=339 r=40></circle><circle cx=112.2 cy=339 r=40></circle></g><circle class=hub-mark-gap cx=256 cy=256 r=71></circle><circle class=hub-mark-hub cx=256 cy=256 r=60>`);function Xi(e){let t=()=>e.size??18;return(()=>{var n=Yi();return S(r=>{var i=`hub-mark${e.class?` ${e.class}`:``}`,a=t(),o=t();return i!==r.e&&L(n,`class`,r.e=i),a!==r.t&&L(n,`width`,r.t=a),o!==r.a&&L(n,`height`,r.a=o),r},{e:void 0,t:void 0,a:void 0}),n})()}var Zi=F(`<svg viewBox="0 0 24 24"aria-hidden=true>`),Qi=F(`<svg><path></svg>`,!1,!0,!1),$i=F(`<span class=voice-dot role=img aria-label="Voice mode on"title="Voice mode on">`),ea=F(`<span class=spinner>`),ta=F(`<span role=img>`),na=F(`<span class=status-dot>`),ra=F(`<button type=button>`),ia=F(`<button type=button aria-haspopup=menu>`),aa=F(`<div class=menu role=menu>`),oa=F(`<div class=menu-sep role=separator>`),sa=F(`<div class=menu-section>`),ca=F(`<span class=menu-hint>`),la=F(`<kbd class=menu-key>`),ua=F(`<button type=button><span class=menu-check></span><span class=menu-label>`),da=F(`<div class=dialog-head><h2>`),fa=F(`<div class=dialog-body>`),pa=F(`<dialog>`),ma={menu:[`M4 6h16`,`M4 12h16`,`M4 18h16`],sidebar:[`M4 5h16v14H4z`,`M9 5v14`],rail:[`M4 5h16v14H4z`,`M15 5v14`],plus:[`M12 5v14`,`M5 12h14`],file:[`M6 3h8l4 4v14H6z`,`M14 3v4h4`],more:[`M5 12h.01`,`M12 12h.01`,`M19 12h.01`],search:[`M11 4a7 7 0 1 0 0 14a7 7 0 0 0 0-14z`,`M20 20l-4-4`],mic:[`M12 3a3 3 0 0 1 3 3v6a3 3 0 0 1-6 0V6a3 3 0 0 1 3-3z`,`M5 11a7 7 0 0 0 14 0`,`M12 18v3`],wave:[`M3 12h2`,`M7 8v8`,`M11 5v14`,`M15 8v8`,`M19 11v2`],stop:[`M7 7h10v10H7z`],send:[`M12 19V5`,`M5 12l7-7 7 7`],chevron:[`M9 6l6 6-6 6`],down:[`M6 9l6 6 6-6`],close:[`M6 6l12 12`,`M18 6L6 18`],back:[`M15 5l-7 7 7 7`],settings:[`M4 7h10M18 7h2M4 17h4M12 17h8`,`M16 5v4`,`M10 15v4`],branch:[`M6 3v12`,`M18 9a3 3 0 1 0 0-6a3 3 0 0 0 0 6z`,`M6 21a3 3 0 1 0 0-6a3 3 0 0 0 0 6z`,`M18 9a9 9 0 0 1-9 9`],server:[`M4 5h16v6H4z`,`M4 13h16v6H4z`,`M8 8h.01`,`M8 16h.01`],diff:[`M12 3v6`,`M9 6h6`,`M9 18h6`,`M5 3h14v18H5z`],pin:[`M12 17v5`,`M8 3h8l-1 6 3 3H6l3-3z`],muted:[`M12 3a3 3 0 0 1 3 3v6a3 3 0 0 1-6 0V6a3 3 0 0 1 3-3z`,`M5 11a7 7 0 0 0 14 0`,`M4 4l16 16`],home:[`M4 11l8-7 8 7`,`M6 10v10h12V10`],cloud:[`M7 18h10a4 4 0 0 0 .5-7.97A6 6 0 0 0 6.1 9.1A4.5 4.5 0 0 0 7 18z`],folder:[`M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z`],bell:[`M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9`,`M10.3 21a1.94 1.94 0 0 0 3.4 0`]};function Z(e){return(()=>{var t=Zi();return B(t,O(k,{get each(){return[...ma[e.name]]},children:e=>(()=>{var t=Qi();return L(t,`d`,e),t})()})),S(()=>L(t,`class`,`icon ${e.class??``}`)),t})()}var ha={idle:`Idle`,working:`Running`,blocked:`Needs you`,error:`Error`};function ga(){return $i()}function _a(e){return(()=>{var t=ta();return B(t,O(A,{get when(){return e.state===`working`},get fallback(){return na()},get children(){return ea()}})),S(n=>{var r=`status ${e.state} ${e.class??``}`,i=ha[e.state],a=ha[e.state];return r!==n.e&&R(t,n.e=r),i!==n.t&&L(t,`aria-label`,n.t=i),a!==n.a&&L(t,`title`,n.a=a),n},{e:void 0,t:void 0,a:void 0}),t})()}function va(e){let[t,n]=ze(e,[`icon`,`label`,`class`]);return(()=>{var e=ra();return rt(e,Re({get class(){return`icon-btn ${t.class??``}`},get"aria-label"(){return t.label},get title(){return t.label}},n),!1,!0),B(e,O(Z,{get name(){return t.icon}})),e})()}function ya(e){let[t,n]=x(!1),r,i,[a,o]=x({top:0,left:0,right:0,bottom:0}),s=()=>{let e=r.getBoundingClientRect();o({top:e.bottom+4,left:e.left,right:window.innerWidth-e.right,bottom:window.innerHeight-e.top+4})},c=()=>n(!1),l=e=>{if(!t())return;let n=e.target;!r.contains(n)&&!i?.contains(n)&&c()},u=n=>{if(t()){if(n.key===`Escape`)c(),r.focus();else if(/^[1-9]$/.test(n.key)&&!(n.target instanceof HTMLInputElement||n.target instanceof HTMLTextAreaElement)){let t=e.items().filter(e=>typeof e==`object`&&`run`in e&&!e.disabled)[Number(n.key)-1];t&&(n.preventDefault(),c(),t.run())}}};ae(()=>{document.addEventListener(`mousedown`,l),document.addEventListener(`keydown`,u)}),oe(()=>{document.removeEventListener(`mousedown`,l),document.removeEventListener(`keydown`,u)});let d=()=>{let t=0;return e.items().map(e=>({item:e,index:typeof e==`object`&&`run`in e&&!e.disabled?++t:0}))};return[(()=>{var i=ia();i.$$click=e=>{e.stopPropagation(),e.preventDefault(),s(),n(!t())};var a=r;return typeof a==`function`?z(a,i):r=i,B(i,()=>e.text??O(Z,{get name(){return e.icon??`more`}})),S(n=>{var r=e.class??`icon-btn`,a=e.label,o=e.label,s=t();return r!==n.e&&R(i,n.e=r),a!==n.t&&L(i,`aria-label`,n.t=a),o!==n.a&&L(i,`title`,n.a=o),s!==n.o&&L(i,`aria-expanded`,n.o=s),n},{e:void 0,t:void 0,a:void 0,o:void 0}),i})(),O(A,{get when(){return t()},get children(){return O(vt,{get children(){var t=aa(),n=i;return typeof n==`function`?z(n,t):i=t,B(t,O(k,{get each(){return d()},children:({item:e,index:t})=>e===`sep`?oa():`section`in e?(()=>{var t=sa();return B(t,()=>e.section),t})():(()=>{var n=ua(),r=n.firstChild,i=r.nextSibling;return n.$$click=t=>{t.stopPropagation(),c(),e.run()},B(r,()=>e.checked?`✓`:``),B(i,()=>e.label),B(n,O(A,{get when(){return e.hint},get children(){var t=ca();return B(t,()=>e.hint),t}}),null),B(n,O(A,{when:t>0&&t<10,get children(){var e=la();return B(e,t),e}}),null),S(t=>{var r=e.checked===void 0?`menuitem`:`menuitemradio`,i=e.checked,a=`menu-item${e.danger?` danger`:``}`,o=e.disabled;return r!==t.e&&L(n,`role`,t.e=r),i!==t.t&&L(n,`aria-checked`,t.t=i),a!==t.a&&R(n,t.a=a),o!==t.o&&(n.disabled=t.o=o),t},{e:void 0,t:void 0,a:void 0,o:void 0}),n})()})),S(n=>tt(t,{...e.up?{bottom:`${a().bottom}px`}:{top:`${a().top}px`},...e.align===`left`?{left:`${a().left}px`}:{right:`${a().right}px`}},n)),t}})}})]}function ba(e){let t;return C(()=>{let n=e.open;t&&(n&&!t.open?t.showModal():!n&&t.open&&t.close())}),(()=>{var n=pa();n.$$click=n=>n.target===t&&e.onClose(),n.addEventListener(`close`,()=>e.onClose());var r=t;return typeof r==`function`?z(r,n):t=n,B(n,O(A,{get when(){return e.open},get children(){return[(()=>{var t=da(),n=t.firstChild;return B(n,()=>e.title),B(t,O(va,{icon:`close`,label:`Close`,onClick:()=>e.onClose()}),null),t})(),(()=>{var t=fa();return B(t,()=>e.children),t})()]}})),S(t=>{var r=`dialog${e.wide?` wide`:``} ${e.class??``}`,i=e.title;return r!==t.e&&R(n,t.e=r),i!==t.t&&L(n,`aria-label`,t.t=i),t},{e:void 0,t:void 0}),n})()}var[xa,Sa]=x(Date.now());setInterval(()=>Sa(Date.now()),3e4);var Ca=xa;function wa(e,t=xa()){if(!e)return``;let n=Math.max(0,Math.round((t-e)/1e3));return n<45?`just now`:n<3600?`${Math.round(n/60)}m ago`:n<86400?`${Math.round(n/3600)}h ago`:`${Math.round(n/86400)}d ago`}var Ta=e=>String(e??``).replace(/[\\/]+$/,``).split(/[\\/]/).pop()||e||``,Ea=(e,t)=>`${e} ${t}${e===1?``:`s`}`,Da={herdr:`Herdr`,tui:`TUI`,background:`Background`};I([`click`]);var Oa=F(`<p class=error role=alert>`),ka=F(`<form class="card stack"novalidate><div class=field><label for=pair-code>Pairing code</label><input id=pair-code class=pair-code type=text inputmode=numeric autocomplete=one-time-code maxlength=6></div><p class="small muted">Open /voice → Pair a phone on a computer connected to this hub to get a 6-digit code. For the very first device, use the code printed in the hub's log.</p><div class=field><label for=pair-name>Device name</label><input id=pair-name type=text maxlength=64></div><button type=submit class="btn primary">Pair`),Aa=F(`<p class=muted>Sign in to see and control your own OpenCode sessions.`),ja=F(`<a class="btn primary signin">Sign in with Google`),Ma=F(`<details class=card><summary>Have a pairing code?`),Na=F(`<main class=entry><h1 class="display brand-big"> Hub`),Pa=F(`<p class=muted>Loading…`),Fa=F(`<p class=muted>Pair this browser with your hub to see and control your OpenCode sessions.`),Ia=F(`<strong>`),La=F(`<p>`),Ra=F(`<p class="small muted">Approve only if this code matches the one shown in OpenCode.`),za=F(`<p class=small>`),Ba=F(`<div class=row><button type=button class="btn primary">Approve</button><button type=button class="btn danger">Deny`),Va=F(`<p role=status>`),Ha=F(`<main class=entry><h1 class=display>Approve machine</h1><div class="card stack"><a class=btn href=/>Back to sessions`),Ua=F(`<p>No code given.`),Wa=F(`<strong class=mono>`);function Ga(){let e=navigator.userAgent,t=/Pixel[^;)]*/.exec(e)?.[0]||(/iPhone/.test(e)?`iPhone`:/iPad/.test(e)?`iPad`:/Android/.test(e)?`Android`:/Mac OS X/.test(e)?`Mac`:/Windows/.test(e)?`Windows`:`Browser`),n=/Edg\//.test(e)?`Edge`:/Firefox\//.test(e)?`Firefox`:/Chrome\//.test(e)?`Chrome`:/Safari\//.test(e)?`Safari`:``;return`${t.trim()}${n?` · ${n}`:``}`.slice(0,64)}function Ka(e){let[t,n]=x(),[r,i]=x(!1),[a,o]=x(``),[s,c]=x(Ga()),[l,u]=x(e.error?`Sign-in did not work: ${e.error}`:``),[d,f]=x(!1);ae(async()=>{let[t,r]=await Promise.all([fetch(`/api/me`,{credentials:`same-origin`}).catch(()=>void 0),Oi()]);if(t?.ok)return hi(await t.json()),ri(e.next,{replace:!0});n(At(r??void 0,e.next)),i(!0)});let p=async t=>{t.preventDefault();let n=a().replace(/\D/g,``);if(n.length!==6)return u(`Enter the 6-digit code.`);f(!0),u(``);try{await H(`/api/pair`,{method:`POST`,json:{code:n,deviceName:s().trim()||Ga()}}),hi(void 0),ri(e.next,{replace:!0})}catch(e){u(e instanceof Vt&&e.status===401?`That code is wrong or expired. Get a fresh one and try again.`:G(e)),f(!1)}},m=()=>(()=>{var e=ka(),t=e.firstChild,n=t.firstChild.nextSibling,r=t.nextSibling.nextSibling,i=r.firstChild.nextSibling,u=r.nextSibling;return e.addEventListener(`submit`,p),n.$$input=e=>o(e.currentTarget.value),i.$$input=e=>c(e.currentTarget.value),B(e,O(A,{get when(){return l()},get children(){var e=Oa();return B(e,l),e}}),u),S(()=>u.disabled=d()),S(()=>n.value=a()),S(()=>i.value=s()),e})();return(()=>{var n=Na(),i=n.firstChild,a=i.firstChild;return B(i,O(Xi,{class:`brand-mark`,size:30}),a),B(n,O(A,{get when(){return r()},get fallback(){return Pa()},get children(){return O(A,{get when(){return t()},get fallback(){return[Fa(),N(m)]},get children(){return[Aa(),(()=>{var e=ja();return S(()=>L(e,`href`,t())),e})(),(()=>{var t=Ma();return t.firstChild,B(t,m,null),S(()=>t.open=!!e.error),t})()]}})}}),null),n})()}function qa(e){let t=()=>e.code.toUpperCase(),[n,r]=x(``),[i,a]=x(``),[o,s]=x(!1),[c,l]=x(!wt(X()));ae(async()=>{await Li(),l(!0)});let u=()=>bi().find(e=>e.userCode===t()),d=()=>`No pending request with code ${t()}. It may have expired or been answered already.`,f=async e=>{s(!0);let n=u()?.machineName;try{await H(`/api/enrollments/${Wt(t())}/${e}`,{method:`POST`,json:{}}),a(e===`approve`?`${n??`The machine`} is approved and belongs to you. It will connect in a few seconds.`:`Denied ${n??`the request with code ${t()}`}.`)}catch(e){r(e instanceof Vt&&e.status===404?d():G(e)),s(!1)}};return(()=>{var e=Ha(),r=e.firstChild.nextSibling,a=r.firstChild;return B(r,O(A,{get when(){return!i()},get fallback(){return(()=>{var e=Va();return B(e,i),e})()},get children(){return O(A,{get when(){return t()},get fallback(){return Ua()},get children(){return O(A,{get when(){return c()},get fallback(){return Pa()},get children(){return O(A,{get when(){return!wt(X())||u()},get fallback(){return(()=>{var e=La();return B(e,d),e})()},get children(){return[(()=>{var e=La();return B(e,O(A,{get when(){return u()},get fallback(){return[`A machine showing code `,(()=>{var e=Wa();return B(e,t),e})(),` wants to connect to this hub.`]},get children(){return[(()=>{var e=Ia();return B(e,()=>u().machineName),e})(),` wants to connect to this hub.`]}})),e})(),(()=>{var e=Ra(),t=e.firstChild;return B(e,(()=>{var e=N(()=>!!u());return()=>e()?`Code ${u().userCode} · requested ${wa(u().created)}. `:``})(),t),e})(),(()=>{var e=za();return B(e,()=>jt(X())),e})(),(()=>{var e=Ba(),t=e.firstChild,n=t.nextSibling;return t.$$click=()=>void f(`approve`),n.$$click=()=>void f(`deny`),S(e=>{var r=o(),i=o();return r!==e.e&&(t.disabled=e.e=r),i!==e.t&&(n.disabled=e.t=i),e},{e:void 0,t:void 0}),e})(),O(A,{get when(){return n()},get children(){var e=Va();return B(e,n),e}})]}})}})}})}}),a),e})()}I([`input`,`click`]);function Ja(e){return e.supported?e.permission===`denied`?{state:`blocked`,message:`Notifications are blocked for this site. Allow them in the browser's site settings, then reload.`,action:`none`,warn:!0}:e.permission==="default"?{state:`off`,message:`Notifications are off on this device.`,action:`enable`,warn:!0}:!e.worker||!e.endpoint||!e.hubSubscribed?{state:`repair`,message:`Allowed, but this device is not subscribed on this hub, so nothing will arrive (this happens after the hub moves to a new address). Enable again to fix it.`,action:`enable`,warn:!0}:{state:`on`,message:`On for this device.`,action:`disable`,warn:!1}:{state:`unsupported`,message:`This browser can't get notifications here. On iPhone, add the app to the Home Screen first (iOS 16.4+); everywhere else the hub must be on https.`,action:`none`,warn:!0}}var Ya=e=>e.supported&&e.permission===`granted`&&(!e.endpoint||!e.hubSubscribed);function Xa(e){if(e.subscriptions===0)return{ok:!1,text:`This device is not subscribed; enable notifications first`};if(e.sent>0)return{ok:!0,text:e.sent===1?`Test notification sent to this device`:`Test notification sent (${e.sent} subscriptions)`};let t=e.failed[0];return t?{ok:!1,text:`Test failed: ${t.host} ${t.status===void 0?`did not answer`:`answered ${t.status}`}`}:{ok:!1,text:`Test failed`}}var Za=[[`question`,`A session asks a question`],[`permission`,`A session needs permission`],[`failed`,`A session failed`],[`finished`,`A session finished (not Voice turns)`],[`handoff`,`Hand-offs from the terminal`],[`say`,`Voice replies when you're not watching`]];function Qa(){try{return Intl.DateTimeFormat().resolvedOptions().timeZone||`UTC`}catch{return`UTC`}}var $a=()=>`serviceWorker`in navigator&&`PushManager`in window&&`Notification`in window&&window.isSecureContext;function eo(e){let t=`=`.repeat((4-e.length%4)%4),n=atob((e+t).replace(/-/g,`+`).replace(/_/g,`/`));return Uint8Array.from(n,e=>e.charCodeAt(0))}var to=(e,t)=>!e||e.byteLength!==t.byteLength?!1:new Uint8Array(e).every((e,n)=>e===t[n]),[no,ro]=x(0),[io,ao]=x(new Set),oo=()=>`Notification`in window?Notification.permission:`default`;async function so(){if(`serviceWorker`in navigator)return await navigator.serviceWorker.getRegistration(`/`).catch(()=>void 0)??void 0}async function co(){if($a())return await(await so())?.pushManager.getSubscription()??void 0}async function lo(e){let t=await U(`/api/push/prefs${e?`?endpoint=${encodeURIComponent(e)}`:``}`);return ao(new Set(t.muted??[])),t}async function uo(){let e=$a(),t=e?await so():void 0,n=await t?.pushManager.getSubscription().catch(()=>null)??void 0,r=await lo(n?.endpoint).catch(()=>void 0);return{env:{supported:e,permission:oo(),worker:!!t,...n?{endpoint:n.endpoint}:{},hubSubscribed:!!r?.subscribed,hubSubscriptions:r?.subscriptions??0},view:r}}async function fo(){let{publicKey:e}=await U(`/api/push/key`),t=eo(e);await so()||await navigator.serviceWorker.register(`/sw.js`,{scope:`/`});let n=await navigator.serviceWorker.ready,r=await n.pushManager.getSubscription();return r&&!to(r.options?.applicationServerKey,t)&&(await r.unsubscribe(),r=null),r??=await n.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:t}),await H(`/api/push/subscribe`,{method:`POST`,json:{subscription:r.toJSON()}}),r}async function po(){if(!$a())throw Error(`This browser does not support push notifications here. On iPhone, add the app to the Home Screen first (iOS 16.4+).`);if(await Notification.requestPermission()!==`granted`)throw Error(`Notifications are blocked. Allow them in the browser's site settings.`);await fo()}async function mo(){let e=await co();e&&(await H(`/api/push/unsubscribe`,{method:`POST`,json:{endpoint:e.endpoint}}).catch(()=>{}),await e.unsubscribe().catch(()=>{}))}async function ho(){return(await H(`/api/push/test`,{method:`POST`,json:{}})).json()}async function go(e,t){let n=io(),r=new Set(n);t?r.add(e):r.delete(e),ao(r);try{let n=await(await H(`/api/push/mute`,{method:`PUT`,json:{sessionID:e,muted:t}})).json();ao(new Set(n.muted)),q(t?`Notifications muted for this session`:`Notifications on for this session`)}catch(e){ao(n),q(e instanceof Error?e.message:String(e),`err`)}}async function _o(){let{env:e}=await uo().catch(()=>({env:void 0}));e&&Ya(e)&&await fo().then(()=>ro(e=>e+1),e=>console.warn(`push re-subscribe:`,e?.message??e))}function vo(){`serviceWorker`in navigator&&(navigator.serviceWorker.register(`/sw.js`,{scope:`/`}).catch(e=>console.warn(`service worker:`,e.message)),navigator.serviceWorker.addEventListener(`message`,e=>{let t=e.data;if(t?.type===`navigate`&&typeof t.url==`string`){let e=new URL(t.url,location.origin);e.origin===location.origin&&ri(e.pathname+e.search)}for(let e of yo)e(t)}))}var yo=new Set;function bo(e){return yo.add(e),()=>yo.delete(e)}function xo(e,{open:t=!0}={}){return[...t?[{label:`Open`,run:()=>ri(ii(e.id))}]:[],{label:e.pinned?`Unpin`:`Pin`,run:()=>Ki(`pinnedSessions`,e.id,!e.pinned)},{label:e.hidden?`Unhide`:`Hide`,run:()=>Ki(`hiddenSessions`,e.id,!e.hidden,{message:e.hidden?`Unhid “${e.title}”`:`Hid “${e.title}”`,undo:!0})},...e.running?[{label:`Stop`,run:()=>void Ji(e.id),danger:!0}]:[],`sep`,{label:e.exposed?`Disallow Voice`:`Allow Voice`,run:()=>void qi(e.id,!e.exposed)},io().has(e.id)?{label:`Unmute notifications`,run:()=>void go(e.id,!1)}:{label:`Mute notifications`,run:()=>void go(e.id,!0)}]}var So=window.matchMedia(`(max-width: 760px)`),[Co,wo]=x(So.matches);So.addEventListener(`change`,()=>{wo(So.matches),No(!So.matches&&localStorage.getItem(Do)!==`0`)});var To=Co,Eo=`hub.sidebar.collapsed`,Do=`hub.rail.open`,[Oo,ko]=x(localStorage.getItem(Eo)===`1`),[Ao,jo]=x(!1),[Mo,No]=x(!So.matches&&localStorage.getItem(Do)!==`0`);function Po(e){ko(e),localStorage.setItem(Eo,e?`1`:`0`)}function Fo(e){No(e),Co()||localStorage.setItem(Do,e?`1`:`0`)}function Io(){Co()?jo(!Ao()):Po(!Oo())}var Lo=class{deps;state={phase:`idle`};recording;release;run=0;listeners=new Set;constructor(e){this.deps=e}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}forSession(e){let t=this.state.sessionID===e;return{recording:t&&(this.state.phase===`recording`||this.state.phase===`starting`)?this.state.secondsLeft??60:!1,transcribing:t&&this.state.phase===`transcribing`}}async toggle(e){let{phase:t}=this.state;if(t===`idle`)return this.start(e);if(t===`recording`&&this.state.sessionID===e)return this.finish()}viewing(e){let{phase:t}=this.state;(t===`recording`||t===`starting`)&&this.state.sessionID!==e&&this.cancel(`Dictation cancelled: you left the session it was for.`)}cancel(e){this.state.phase!==`idle`&&(this.run++,this.recording?.cancel(),this.recording=void 0,this.unhold(),this.set({phase:`idle`}),e&&this.deps.notify(e,`warn`))}async start(e){let t=++this.run;this.set({phase:`starting`,sessionID:e,secondsLeft:60}),this.release=this.deps.hold?.();let n;try{n=await this.deps.record(e=>{t===this.run&&this.state.phase===`recording`&&this.set({...this.state,secondsLeft:e})})}catch(e){return t===this.run?(this.unhold(),this.set({phase:`idle`}),this.deps.notify(e instanceof Error?e.message:String(e),`err`)):void 0}if(t!==this.run)return n.cancel();this.recording=n,this.set({phase:`recording`,sessionID:e,secondsLeft:60})}async finish(){let e=this.recording,t=this.state.sessionID;if(!e||!t)return;let n=this.run;this.recording=void 0,this.set({phase:`transcribing`,sessionID:t});try{let r=(await e.finish()).trim();if(n!==this.run)return;r?this.deps.deliver(t,r):this.deps.notify(`Didn't catch that. Try again.`,`warn`)}catch(e){n===this.run&&this.deps.notify(e instanceof Error?e.message:String(e),`err`)}finally{n===this.run&&(this.unhold(),this.set({phase:`idle`}))}}unhold(){let e=this.release;this.release=void 0,e?.()}set(e){this.state=e;for(let e of[...this.listeners])e()}},Ro={phase:`off`,voice:`off`,level:0,held:``,paused:!1},zo=class{deps;state=Ro;conversation;run=0;sinks=new Map;listeners=new Set;bubbles=0;constructor(e){this.deps=e}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}isOn(e){return this.state.phase!==`off`&&this.state.sessionID===e}errorFor(e){return this.state.error?.sessionID===e?this.state.error.message:void 0}needsTap(e){return this.state.error?.sessionID===e&&this.state.error.gesture===!0}toggle(e){return this.isOn(e)?this.stop():this.start(e)}end(){return this.stop()}async start(e){if(this.isOn(e))return;this.state.phase!==`off`&&await this.stop();let t=++this.run,n=``,r=!1;this.set({...Ro,phase:`starting`,sessionID:e,voice:`starting`});let i=await this.deps.expose(e);if(t!==this.run)return;if(!i)return this.set({...Ro,error:{sessionID:e,message:`Could not turn Voice on for this session.`}});let a=this.deps.create(e,{state:e=>t===this.run&&this.set({...this.state,voice:e,paused:e===`paused`}),level:e=>t===this.run&&this.set({...this.state,level:e}),held:e=>t===this.run&&this.set({...this.state,held:e}),user:t=>this.sinks.get(e)?.user(t)??`voice:${++this.bubbles}`,tick:(t,n)=>this.sinks.get(e)?.tick(t,n),agent:t=>this.sinks.get(e)?.agent(t),note:(i,a)=>{if((a===`err`||a===`gesture`)&&t===this.run&&this.state.phase===`starting`){n=i,r=a===`gesture`;return}let o=this.sinks.get(e);o?o.note(i,a):this.deps.notify(i,a)},ended:()=>{t===this.run&&this.conversation===a&&this.state.phase!==`starting`&&(this.run++,this.conversation=void 0,this.set(Ro))}});this.conversation=a;let o=await a.start();if(t===this.run){if(!o)return this.run++,this.conversation=void 0,this.set({...Ro,error:{sessionID:e,message:n||`Could not start Voice mode.`,...r?{gesture:r}:{}}});this.set({...this.state,phase:`on`,agent:a.agent})}}async stop(e={}){this.run++;let t=this.conversation;this.conversation=void 0,this.state.phase!==`off`&&this.set(Ro),this.deps.stopPlayback(),await t?.stop(e.keepalive?{keepalive:!0}:void 0)}mute(){let e=this.conversation;e&&(e.paused?e.resume():e.pause(),this.set({...this.state,paused:e.paused}))}hold(){let e=this.conversation;return!e||e.paused?()=>{}:(e.pause(),this.set({...this.state,paused:!0}),()=>{this.conversation===e&&e.paused&&(e.resume(),this.set({...this.state,paused:!1}))})}async sendTyped(e,t){let n=this.conversation;return!n||n.sessionID!==e||this.state.phase!==`on`?!1:(await n.sendTyped(t),!0)}onEvent(e){this.conversation&&e.sessionID===this.conversation.sessionID&&this.conversation.onEvent(e)}onStatus(e,t){this.conversation?.sessionID===e&&this.conversation.onStatus(t)}attach(e,t){return this.sinks.set(e,t),()=>{this.sinks.get(e)===t&&this.sinks.delete(e)}}set(e){this.state=e;for(let e of[...this.listeners])e()}},Bo=3e3,Vo=`Voice mode on`,Ho={starting:`starting`,listening:`listening`,hearing:`listening`,transcribing:`thinking`,sent:`thinking`,speaking:`speaking`,paused:`muted`,off:`off`},Uo=(e,t,n)=>({sessionID:e,title:Vo,body:`${t} · ${Ho[n]??n}`}),Wo=class{controller;surface;options;shown;shownAt=0;timer;mediaFor;now;setTimer;clearTimer;unsubscribe;constructor(e,t,n){this.controller=e,this.surface=t,this.options=n,this.now=n.now??Date.now,this.setTimer=n.setTimer??((e,t)=>setTimeout(e,t)),this.clearTimer=n.clearTimer??(e=>clearTimeout(e)),this.unsubscribe=e.subscribe(()=>this.refresh())}needsPermission(){return this.controller.state.phase===`on`&&!this.surface.allowed()}async endFromNotification(e){this.controller.state.phase!==`off`&&this.controller.state.sessionID===e&&await this.controller.end()}refresh(){let e=this.controller.state;if(e.phase!==`on`||!e.sessionID)return this.clear();let t=e.sessionID,n=this.options.title(t);if(this.mediaFor!==t&&(this.mediaFor=t,this.surface.media({title:Vo,artist:n},()=>void this.controller.end())),!this.surface.allowed())return;let r=Uo(t,n,e.voice);if(this.shown&&this.shown.sessionID===r.sessionID&&this.shown.body===r.body)return this.cancel();let i=this.shown?.sessionID===t?this.shownAt+Bo-this.now():0;if(i<=0)return this.show(r);this.timer===void 0&&(this.timer=this.setTimer(()=>{this.timer=void 0,this.refresh()},i))}dispose(){this.unsubscribe(),this.cancel(),this.surface.close(),this.mediaFor&&this.surface.media(null),this.shown=this.mediaFor=void 0}show(e){this.cancel(),this.surface.show(e),this.shown=e,this.shownAt=this.now()}clear(){this.cancel(),this.shown&&this.surface.close(),this.mediaFor&&this.surface.media(null),this.shown=this.mediaFor=void 0}cancel(){this.timer!==void 0&&(this.clearTimer(this.timer),this.timer=void 0)}},Go=[`image/png`,`image/jpeg`,`image/webp`,`image/gif`],Ko={maxImages:4,maxSide:1600,perImageBase64:18e4,totalBase64:7e5},qo=[.85,.72,.6,.48,.36],Jo=[1,.75,.55,.4,.28,.2],Yo=class extends Error{constructor(e=`This image is too large to attach, even after shrinking it`){super(e),this.name=`ImageTooLargeError`}},Xo=e=>4*Math.ceil(e/3),Zo=e=>Go.includes(e);function Qo(e,t,n=Ko){if(e>=n.maxImages)return`Attach at most ${n.maxImages} images to a message`;if(!Zo(t))return`Only PNG, JPEG, WebP or GIF images can be attached`}function $o(e,t=Ko){return Math.max(0,Math.min(t.perImageBase64,t.totalBase64-e))}function es(e,t,n){let r=Math.min(1,n/Math.max(e,t));return{width:Math.max(1,Math.round(e*r)),height:Math.max(1,Math.round(t*r))}}function ts(e,t){let n=t===`image/png`?`png`:t===`image/gif`?`gif`:t===`image/webp`?`webp`:`jpg`;return`${e.replace(/\.[A-Za-z0-9]{1,5}$/,``)||`image`}.${n}`}async function ns(e,t,n,r=Ko){if(t<=0)throw new Yo(`No room for another image in this message`);let i=es(e.width,e.height,r.maxSide);for(let r of Jo){let a=Math.max(1,Math.round(i.width*r)),o=Math.max(1,Math.round(i.height*r)),s=[...e.keepPng?[{type:`image/png`,width:a,height:o}]:[],...qo.map(e=>({type:`image/jpeg`,quality:e,width:a,height:o}))];for(let e of s){let r=await n(e);if(Xo(r.size)<=t)return{blob:r,request:e}}}throw new Yo}var rs=()=>({draft:``,images:[],pending:[],stopping:!1});function is(e,t){switch(t.type){case`input`:return{...e,draft:t.text,error:void 0};case`attach`:return e.images.length>=Ko.maxImages?e:{...e,images:[...e.images,t.image],error:void 0};case`detach`:return{...e,images:e.images.filter(e=>e.id!==t.id),error:void 0};case`attachError`:return{...e,error:t.message};case`submit`:{let n=e.draft.trim();if(!n&&!e.images.length)return e;let r={id:t.id,text:n,...e.images.length?{images:e.images}:{}};return{...e,draft:``,images:[],pending:[...e.pending,r],error:void 0}}case`accepted`:return e.pending.some(e=>e.id===t.id)?{...e,pending:e.pending.filter(e=>e.id!==t.id)}:e;case`rejected`:{let n=e.pending.find(e=>e.id===t.id);return n?{...e,draft:e.draft&&n.text?`${n.text}\n${e.draft}`:n.text||e.draft,images:[...n.images??[],...e.images].slice(0,Ko.maxImages),pending:e.pending.filter(e=>e.id!==t.id),error:t.message}:e}case`stop`:return{...e,stopping:!0};case`stopped`:return{...e,stopping:!1}}}function as(e,{running:t,offline:n}){let r=e.draft.trim().length>0||e.images.length>0,i=e.pending.length>0&&!t;return{primary:t?`steer`:`send`,canSubmit:r&&!n&&!i,showStop:t,canStop:t&&!n&&!e.stopping,...n?{hint:`The machine running this session is disconnected; it is read-only until it reconnects.`}:{}}}var os=class{drafts=new Map;listeners=new Set;get(e){return this.drafts.get(e)??``}set(e,t){if(this.get(e)!==t){t?this.drafts.set(e,t):this.drafts.delete(e);for(let t of[...this.listeners])t(e)}}append(e,t){let n=this.get(e).replace(/\s+$/,``),r=n?`${n} ${t}`:t;return this.set(e,r),r}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}},ss={heard:[{freq:880,ms:80}],done:[{freq:660,ms:70},{gap:50},{freq:990,ms:70}]};function cs(e,t){e.defaultPlaybackRate=t,e.playbackRate=t,e.preservesPitch=!0,e.webkitPreservesPitch=!0}var ls=class{api;speed;onSpeaking;phrases=new Map;audio;ctx;speaking=!1;constructor({api:e,speed:t,onSpeaking:n,audio:r}){this.api=e,this.speed=t,this.onSpeaking=n,this.audio=r??new Audio}unlock(){let e=globalThis,t=e.AudioContext||e.webkitAudioContext;t&&((!this.ctx||this.ctx.state===`closed`)&&(this.ctx=new t),this.ctx.resume?.().catch(()=>{}))}play(e){for(let t of e??[])t.type===`earcon`?this.earcon(t.name):t.type===`speak`&&this.say(t.text)}earcon(e){let t=this.ctx,n=ss[e];if(!t||!n||t.state===`closed`)return;let r=t.currentTime+.01;for(let e of n){if(e.gap){r+=e.gap/1e3;continue}let n=t.createOscillator(),i=t.createGain(),a=r+(e.ms??0)/1e3;n.type=`sine`,n.frequency.value=e.freq??440,i.gain.setValueAtTime(1e-4,r),i.gain.exponentialRampToValueAtTime(.12,r+.012),i.gain.exponentialRampToValueAtTime(1e-4,a),n.connect(i).connect(t.destination),n.start(r),n.stop(a+.02),r=a}}phrase(e){let t=this.phrases.get(e);return t||(t=this.api(`/api/speak`,{method:`POST`,json:{text:e}}).then(async e=>URL.createObjectURL(await e.blob())),this.phrases.set(e,t),t.catch(()=>this.phrases.delete(e))),t}async say(e){let t;try{t=await this.phrase(e)}catch{return}let n=this.audio;if(this.setSpeaking(!0),n.src=t,cs(n,this.speed?.()??1),!await n.play().then(()=>!0,()=>!1))return this.setSpeaking(!1);await new Promise(e=>{n.onended=n.onpause=n.onerror=()=>e()}),n.onended=n.onpause=n.onerror=null,this.setSpeaking(!1)}stop(){this.audio.paused||this.audio.pause(),this.setSpeaking(!1)}setSpeaking(e){e!==this.speaking&&(this.speaking=e,this.onSpeaking?.(e))}close(){this.stop(),this.ctx?.close?.().catch(()=>{}),this.ctx=void 0}};function us(e){let t=new URL(e),n=t.searchParams.get(`voice`)===`1`;return t.searchParams.delete(`voice`),{voice:n,path:`${t.pathname}${t.search}${t.hash}`}}function ds(e){return e.audioState===`suspended`||e.error===`NotAllowedError`&&!e.activated&&e.micPermission!==`denied`}var fs=new Set([`um`,`umm`,`uh`,`uhh`,`uhm`,`erm`,`er`,`eh`,`ah`,`hmm`,`hm`,`mm`,`mmm`,`mhm`,`mm-hmm`,`uh-huh`]),ps=new Set([...fs,`and`,`but`,`so`,`or`,`because`,`cause`,`then`,`with`,`to`,`the`,`a`,`an`,`of`,`for`,`if`,`that`,`like`,`maybe`]),ms=new Map([[`stop`,`interrupt`],[`cancel`,`interrupt`],[`never mind`,`interrupt`],[`nevermind`,`interrupt`],[`stop that`,`interrupt`],[`hold on`,`interrupt`],[`pause listening`,`pause`]]);function hs(e){return String(e??``).toLowerCase().replace(/[^\p{L}\p{N}'\s-]+/gu,` `).split(/\s+/).map(e=>e.replace(/^[-']+|[-']+$/g,``)).filter(Boolean)}function gs(e){return ms.get(hs(e).join(` `))}function _s(e){return hs(e).every(e=>fs.has(e))}function vs(e){let t=String(e??``).trim(),n=hs(t);return!n.length||ps.has(n[n.length-1])||/(\.\.\.|…|[,;:\-–—])["'”’)\]]*$/.test(t)?!1:/[.?!]["'”’)\]]*$/.test(t)?!0:n.length>=3}var ys=new Set([`e.g.`,`i.e.`,`mr.`,`mrs.`,`ms.`,`dr.`,`st.`,`vs.`,`cf.`,`prof.`,`jr.`,`sr.`,`approx.`,`no.`,`fig.`]),bs=/[.?!…]+["'”’)\]]*(?=\s|$)/g;function xs(e,{minChars:t=4,maxChars:n=300}={}){let r=String(e??``).replace(/```[\s\S]*?(?:```|$)/g,`
3
+ (code omitted)
4
+ `).split(/\r?\n/).map(e=>e.replace(/\s+/g,` `).trim()).filter(Boolean).flatMap(Ss),i=[],a=``;for(let e of r){let n=a?`${a} ${e}`:e;n.length<t?a=n:(i.push(n),a=``)}return a&&(i.length?i[i.length-1]+=` ${a}`:i.push(a)),i.flatMap(e=>Cs(e,n))}function Ss(e){let t=[],n=0;for(let r of e.matchAll(bs)){let i=r.index+r[0].length;if(i>=e.length)break;let a=e.slice(i).trimStart()[0]??``;if(!/[?!]/.test(r[0])){let t=e.lastIndexOf(` `,r.index)+1,n=e.slice(t,i).toLowerCase(),o=t===0&&/^\d+[.)]$/.test(n);if(ys.has(n.replace(/["'”’)\]]+$/,``))||o||/\p{Ll}/u.test(a))continue}t.push(e.slice(n,i).trim()),n=i}let r=e.slice(n).trim();return r&&t.push(r),t.filter(Boolean)}function Cs(e,t){let n=[],r=e;for(;r.length>t;){let e=r.slice(0,t),i=Math.max(e.lastIndexOf(`, `),e.lastIndexOf(`; `));i=i>t/2?i+1:e.lastIndexOf(` `),i<=0&&(i=t),n.push(r.slice(0,i).trim()),r=r.slice(i).trim()}return r&&n.push(r),n}var ws=16e3;function Ts(e,t,n){if(t===n)return Float32Array.from(e);let r=Math.floor(e.length*n/t),i=new Float32Array(r),a=t/n;if(a>1)for(let t=0;t<r;t++){let n=Math.floor(t*a),r=Math.min(e.length,Math.max(n+1,Math.floor((t+1)*a))),o=0;for(let t=n;t<r;t++)o+=e[t];i[t]=o/(r-n)}else for(let t=0;t<r;t++){let n=t*a,r=Math.floor(n),o=e[Math.min(r+1,e.length-1)];i[t]=e[r]+(o-e[r])*(n-r)}return i}function Es(e,t){let n=Ts(e,t,ws),r=new Uint8Array(44+n.length*2),i=new DataView(r.buffer),a=(e,t)=>{for(let n=0;n<t.length;n++)r[e+n]=t.charCodeAt(n)};a(0,`RIFF`),i.setUint32(4,r.length-8,!0),a(8,`WAVE`),a(12,`fmt `),i.setUint32(16,16,!0),i.setUint16(20,1,!0),i.setUint16(22,1,!0),i.setUint32(24,ws,!0),i.setUint32(28,ws*2,!0),i.setUint16(32,2,!0),i.setUint16(34,16,!0),a(36,`data`),i.setUint32(40,n.length*2,!0);for(let e=0;e<n.length;e++){let t=Math.max(-1,Math.min(1,n[e]));i.setInt16(44+e*2,Math.round(t<0?t*32768:t*32767),!0)}return r}var Ds=200,Os=120,ks=4,As=e=>e.reduce((e,t)=>e+t.ms,0);function js(e,t){for(;e.length>1&&As(e)-e[0].ms>=t;)e.shift()}var Ms=class{sampleRate;minSpeechMs;endSilenceMs;preRollMs;maxSegmentMs;marginDb;minDb;speakingBoostDb;speaking=!1;floor=void 0;state=`silence`;preroll=[];frames=[];segmentMs=0;voicedMs=0;gapMs=0;silenceMs=0;constructor({sampleRate:e,minSpeechMs:t=250,endSilenceMs:n=550,preRollMs:r=300,maxSegmentMs:i=6e4,marginDb:a=10,minDb:o=-50,speakingBoostDb:s=8}){this.sampleRate=e,this.minSpeechMs=t,this.endSilenceMs=n,this.preRollMs=r,this.maxSegmentMs=i,this.marginDb=a,this.minDb=o,this.speakingBoostDb=s,this.reset()}get active(){return this.state===`speech`}reset(){this.state=`silence`,this.preroll=[],this.frames=[],this.segmentMs=0,this.voicedMs=0,this.gapMs=0,this.silenceMs=0}process(e){let t={samples:Float32Array.from(e),ms:e.length/this.sampleRate*1e3},n=0;for(let e of t.samples)n+=e*e;let r=20*Math.log10(Math.max(Math.sqrt(n/Math.max(1,e.length)),1e-7));this.floor??=r;let i=Math.max(this.floor+this.marginDb,this.minDb)+(this.speaking?this.speakingBoostDb:0),a=r>=(this.state===`speech`?i-ks:i),o=Math.max(0,Math.min(1,(r-this.floor)/36)),s=t.ms/(this.state===`speech`?15e3:4e3);this.floor+=(r-this.floor)*(r<this.floor?.2:Math.min(1,s));let c=[];if(this.state===`silence`)a?(this.state=`onset`,this.frames=[...this.preroll,t],this.segmentMs=As(this.frames),this.preroll=[],this.voicedMs=t.ms,this.gapMs=0):(this.preroll.push(t),js(this.preroll,this.preRollMs));else if(this.state===`onset`)this.frames.push(t),this.segmentMs+=t.ms,a?(this.voicedMs+=t.ms,this.gapMs=0):(this.gapMs+=t.ms)>Os&&(this.preroll=this.frames,js(this.preroll,this.preRollMs),this.frames=[],this.state=`silence`),this.state===`onset`&&this.voicedMs>=this.minSpeechMs&&(this.state=`speech`,this.silenceMs=0,c.push({type:`start`}));else if(this.frames.push(t),this.segmentMs+=t.ms,this.silenceMs=a?0:this.silenceMs+t.ms,this.silenceMs>=this.endSilenceMs){let e=this.silenceMs-Ds;for(;this.frames.length&&this.frames[this.frames.length-1].ms<=e;)e-=this.frames.pop().ms;c.push(this.finish(!1))}else this.segmentMs>=this.maxSegmentMs&&c.push(this.finish(!0));return{level:o,voiced:a,events:c}}finish(e){let t=new Float32Array(this.frames.reduce((e,t)=>e+t.samples.length,0)),n=0;for(let e of this.frames)t.set(e.samples,n),n+=e.samples.length;return this.reset(),{type:`end`,samples:t,durationMs:t.length/this.sampleRate*1e3,forced:e}}},Ns=class{sendFn;holdMs;maxUtteranceMs;onHeld;setTimer;clearTimer;nextID=1;pending=[];text=``;ms=0;speaking=!1;timer;constructor({send:e,holdMs:t=1500,maxUtteranceMs:n=6e4,onHeld:r,setTimer:i=setTimeout,clearTimer:a=clearTimeout}){this.sendFn=e,this.holdMs=t,this.maxUtteranceMs=n,this.onHeld=r,this.setTimer=i,this.clearTimer=a,this.reset()}get held(){return this.text}reset(){this.cancelHold(),this.pending=[],this.text=``,this.ms=0,this.speaking=!1,this.onHeld?.(``)}speechStarted(){this.speaking=!0,this.cancelHold()}segmentEnded(e){this.speaking=!1;let t=this.nextID++;return this.pending.push({id:t,ms:e}),t}transcribed(e,t){let n=this.pending.find(t=>t.id===e);if(n){for(n.text=String(t??``).replace(/\s+/g,` `).trim();this.pending[0]?.text!==void 0;)this.apply(this.pending.shift());this.evaluate()}}apply({text:e,ms:t}){gs(e)?(this.cancelHold(),this.text=``,this.ms=0,this.sendFn(e)):_s(e)||(this.text=this.text?`${this.text} ${e}`:e,this.ms+=t,(vs(this.text)||this.ms>=this.maxUtteranceMs)&&this.flush())}evaluate(){this.onHeld?.(this.text),!(!this.text||this.speaking||this.pending.length)&&(this.cancelHold(),this.timer=this.setTimer(()=>{this.timer=void 0,this.flush()},this.holdMs))}flush(){this.cancelHold();let e=this.text;this.text=``,this.ms=0,e&&this.sendFn(e),this.onHeld?.(``)}cancelHold(){this.timer!==void 0&&this.clearTimer(this.timer),this.timer=void 0}},Ps=class{synth;play;stop;onState;onError;items=[];generation=0;controller=new AbortController;speaking=!1;playing=!1;constructor({synth:e,play:t,stop:n,onState:r,onError:i}){this.synth=e,this.play=t,this.stop=n,this.onState=r,this.onError=i}enqueue(e){for(let t of e)String(t??``).trim()&&this.items.push({text:String(t).trim()});this.items.length&&(this.speaking?this.prefetch():this.run(this.generation))}prefetch(){this.fetch(this.items[0]),this.playing||this.fetch(this.items[1])}clear(){this.generation++,this.controller.abort(),this.controller=new AbortController,this.items=[],this.playing=!1,this.stop(),this.setSpeaking(!1)}fetch(e){e&&!e.audio&&(e.audio=this.synth(e.text,this.controller.signal),e.audio.catch(()=>{}))}async run(e){for(this.setSpeaking(!0);e===this.generation&&this.items.length;){let t=this.items[0];this.prefetch();let n;try{n=await t.audio}catch(n){if(e!==this.generation)return;this.items.shift(),this.onError?.(n,t.text);continue}if(e!==this.generation)return;this.items.shift(),this.playing=!0,this.prefetch();try{await this.play(n)}catch(n){e===this.generation&&this.onError?.(n,t.text)}finally{e===this.generation&&(this.playing=!1)}}e===this.generation&&this.setSpeaking(!1)}setSpeaking(e){e!==this.speaking&&(this.speaking=e,this.onState?.(e))}},Fs=12,Is=e=>String(e??``).replace(/\s+/g,` `).trim();function Ls(e,t){let n=Is(e),r=Is(t);if(!n)return{mode:`new`,text:t};if(n.includes(r))return{mode:`keep`,text:e};if(r.startsWith(n))return{mode:`update`,text:t};for(let e=Math.min(n.length,r.length-1);e>=Fs;e--)if(n.endsWith(r.slice(0,e)))return{mode:`update`,text:n+r.slice(e)};return{mode:`new`,text:t}}function Rs(e,t,n){let r=new Map((e??[]).map(e=>[e.id,e])),i=[],a=e=>`Subagent “${e.title||e.id}”`;for(let e of t){if(e.id===n)continue;let t=r.get(e.id)?.state;r.delete(e.id),e.state!==t&&(e.state===`working`?i.push(`${a(e)} is working`):e.state===`error`?i.push(`${a(e)} failed${e.detail?`: ${e.detail}`:``}`):e.state===`blocked`?i.push(`${a(e)} needs you`):(t===`working`||t===`blocked`)&&i.push(`${a(e)} finished`))}for(let e of r.values())e.id!==n&&(e.state===`working`||e.state===`blocked`)&&i.push(`${a(e)} finished`);return i}var zs=2500,Bs=1e3,Vs=2,Hs=`Tap to start Voice mode`,Us=`GestureRequired`,Ws=500,Gs=()=>navigator.userActivation?.hasBeenActive??!0;async function Ks(){try{return(await navigator.permissions.query({name:`microphone`})).state}catch{return`unknown`}}function qs(e){return{audio:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0,...e?{deviceId:{exact:e}}:{}}}}var Js=class{sessionID;api;player;ui;opts;active=!1;paused=!1;agent;inflight=0;sent=new Map;heardAt=0;lastStatus;scheduler=new kr;cuePlayer;onVisibility;stream;ctx;source;sink;tap;vad;endpointer;queue;ticker;silence;silenceURL;wakeLock;warnedAutoplay=!1;state;attempt=0;constructor({sessionID:e,api:t,player:n,ui:r,options:i={}}){this.sessionID=e,this.api=t,this.player=n,this.ui=r,this.opts={cues:!0,background:!1,speed:()=>1,title:()=>`OpenCode session`,...i},this.lastStatus=i.status,this.scheduler.enabled=this.opts.cues!==!1,this.scheduler.working(Mr(i.status),Date.now()),this.cuePlayer=new ls({api:this.api,speed:this.opts.speed,onSpeaking:e=>this.scheduler.cueSpeaking(e,Date.now())}),this.onVisibility=()=>{document.visibilityState===`visible`&&this.active&&!this.opts.background&&this.lockScreen()}}get path(){return`/api/sessions/${encodeURIComponent(this.sessionID)}`}async start(){if(this.active)return!0;let e=++this.attempt,t=()=>e!==this.attempt;this.ui.state(`starting`),this.cuePlayer.unlock(),this.opts.background&&this.startSilence();let n=window;if(!navigator.mediaDevices?.getUserMedia||!(n.AudioContext||n.webkitAudioContext))return this.ui.note(`This browser cannot listen here (the microphone needs HTTPS).`,`err`),this.ui.state(`off`),!1;let r;try{r=await navigator.mediaDevices.getUserMedia(qs(this.opts.deviceId))}catch(e){if(t())return!1;let n=e;return ds({error:n.name,micPermission:await Ks(),activated:Gs()})?this.ui.note(Hs,`gesture`):this.ui.note(n.name===`NotAllowedError`?`Microphone permission was denied. Allow it in the browser's site settings.`:`Microphone: ${n.message}`,`err`),this.ui.state(`off`),this.stopSilence(),!1}if(t())return r.getTracks().forEach(e=>e.stop()),!1;this.stream=r;try{let{agent:e}=await(await this.api(`${this.path}/conversation`,{method:`POST`,json:{on:!0}})).json();this.agent=e}catch(e){return this.release(),this.stopSilence(),t()||(this.ui.note(`Could not start Voice mode: ${e.message}`,`err`),this.ui.state(`off`)),!1}if(t())return this.release(),await this.api(`${this.path}/conversation`,{method:`POST`,json:{on:!1}}).catch(()=>{}),!1;this.active=!0;try{await this.listen()}catch(e){return t()||(e.name===Us?this.ui.note(Hs,`gesture`):this.ui.note(`Could not start listening: ${e.message}`,`err`),await this.stop()),!1}return!t()&&(this.opts.background?this.mediaSession():this.lockScreen(),document.addEventListener(`visibilitychange`,this.onVisibility),this.ticker=setInterval(()=>this.tickCues(),Bs),this.refresh(),!0)}async listen(){let e=window,t=e.AudioContext||e.webkitAudioContext,n=this.ctx=new t;if(await Promise.race([n.resume().catch(()=>{}),new Promise(e=>setTimeout(e,Ws))]),ds({audioState:n.state,activated:Gs()}))throw Object.assign(Error(Hs),{name:Us});if(this.source=n.createMediaStreamSource(this.stream),this.sink=n.createGain(),this.sink.gain.value=0,this.sink.connect(n.destination),n.audioWorklet&&`AudioWorkletNode`in window){await n.audioWorklet.addModule(`/vad-worklet.js`);let e=new AudioWorkletNode(n,`vad-tap`,{numberOfInputs:1,numberOfOutputs:1,channelCount:1});e.port.onmessage=e=>this.frame(e.data),this.tap=e}else{let e=n.createScriptProcessor(1024,1,1);e.onaudioprocess=e=>this.frame(Float32Array.from(e.inputBuffer.getChannelData(0))),this.tap=e}this.source.connect(this.tap),this.tap.connect(this.sink),this.vad=new Ms({sampleRate:n.sampleRate}),this.endpointer=new Ns({send:e=>void this.deliver(e),onHeld:e=>this.ui.held?.(e)}),this.queue=new Ps({synth:(e,t)=>this.synth(e,t),play:e=>this.play(e),stop:()=>{this.player.paused||this.player.pause()},onState:e=>{this.vad&&(this.vad.speaking=e),this.scheduler.agentSpeaking(e,Date.now()),e&&this.cuePlayer.stop(),this.refresh()},onError:e=>{e?.name!==`AbortError`&&this.ui.note(`Could not read the reply aloud: ${e?.message}`,`err`)}})}frame(e){if(!this.active||!this.vad||this.paused)return;let{level:t,events:n}=this.vad.process(e);this.ui.level(t);for(let e of n){if(e.type===`start`)this.endpointer.speechStarted(),this.scheduler.userTalking(!0,Date.now()),this.cuePlayer.stop(),this.queue.speaking&&this.queue.clear();else{this.scheduler.userTalking(!1,Date.now());let t=this.endpointer.segmentEnded(e.durationMs);this.transcribe(t,Es(e.samples,this.vad.sampleRate))}this.refresh()}}async transcribe(e,t){this.inflight++,this.refresh();let n=``;try{n=(await(await this.api(`/api/transcribe`,{method:`POST`,body:t,headers:{"content-type":`audio/wav`}})).json()).text??``}catch(e){this.active&&this.ui.note(`Transcription failed: ${e.message}`,`err`)}finally{this.inflight--}this.active&&(this.endpointer?.transcribed(e,n),this.refresh())}async deliver(e){let t=gs(e);if(t===`pause`)return this.ui.note(`Paused listening.`),this.stop();if(t===`interrupt`){this.queue?.clear(),this.ui.note(`“${e}” — interrupting.`);try{await this.api(`${this.path}/interrupt`,{method:`POST`,json:{}})}catch(e){this.ui.note(`Could not interrupt: ${e.message}`,`err`)}return}let n=this.ui.user(e);try{let{inboxID:t}=await(await this.api(`${this.path}/utterance`,{method:`POST`,json:{text:e}})).json();this.sent.get(t)===`heard`?this.ui.tick(n,`heard`):this.ui.tick(n,`sent`),this.sent.set(t,n)}catch(e){let t=e;this.ui.tick(n,`failed`),this.ui.note(t.status===409?t.message:`Could not send: ${t.message}`,`err`)}}sendTyped(e){return this.queue?.clear(),this.deliver(e)}onEvent(e){if(e.sessionID===this.sessionID){if(e.type===`heard`){let t=this.sent.get(e.inboxID);t!==void 0&&t!==`heard`?this.ui.tick(t,`heard`):this.sent.set(e.inboxID,`heard`),this.heardAt=Date.now(),this.active&&!this.paused&&this.cuePlayer.play(this.scheduler.heard(this.heardAt)),this.refresh(),setTimeout(()=>this.refresh(),2550)}else if(e.type===`say`){if(!this.active)return;this.scheduler.agentSaid(Date.now()),this.cuePlayer.stop(),this.ui.agent(e),this.queue?.enqueue(xs(e.text))}else e.type===`conversation`&&!e.on&&this.active&&(this.ui.note(`Voice mode was turned off.`),this.stop({post:!1}))}}onStatus(e){let t=Date.now(),{started:n,finished:r}=jr(this.lastStatus,e,this.sessionID);if(this.lastStatus=e,this.scheduler.working(Mr(e),t),this.active){for(let e=0;e<n.length;e++)this.scheduler.subagentStarted(t);r.length&&!this.paused&&this.cuePlayer.play(this.scheduler.subagentFinished(t)),this.tickCues()}}tickCues(){this.active&&!this.paused&&this.cuePlayer.play(this.scheduler.tick(Date.now()))}setCues(e){this.scheduler.enabled=e,e||this.cuePlayer.stop()}setBackground(e){this.opts.background=e,this.active&&(e?(this.wakeLock?.release().catch(()=>{}),this.wakeLock=void 0,this.startSilence(),this.mediaSession()):(this.stopSilence(),this.clearMediaSession(),this.lockScreen()))}pause(){this.active&&!this.paused&&(this.paused=!0,this.queue?.clear(),this.cuePlayer.stop(),this.endpointer?.reset(),this.vad?.reset(),this.stream?.getAudioTracks().forEach(e=>e.enabled=!1),this.silence?.pause(),navigator.mediaSession&&(navigator.mediaSession.playbackState=`paused`),this.ui.level(0),this.refresh())}resume(){this.active&&this.paused&&(this.paused=!1,this.stream?.getAudioTracks().forEach(e=>e.enabled=!0),this.ctx?.resume().catch(()=>{}),this.opts.background&&(this.silence?.play().catch(()=>{}),navigator.mediaSession&&(navigator.mediaSession.playbackState=`playing`)),this.refresh())}mediaSession(){navigator.mediaSession&&(navigator.mediaSession.playbackState=this.paused?`paused`:`playing`)}clearMediaSession(){navigator.mediaSession&&(navigator.mediaSession.playbackState=`none`)}startSilence(){if(!this.silence){let e=URL.createObjectURL(new Blob([Es(new Float32Array(16e3*Vs),16e3)],{type:`audio/wav`})),t=new Audio(e);t.loop=!0,t.setAttribute(`aria-hidden`,`true`),this.silence=t,this.silenceURL=e}this.silence.play().catch(()=>{})}stopSilence(){this.silence&&=(this.silence.pause(),this.silence.removeAttribute(`src`),this.silence.load(),this.silenceURL&&URL.revokeObjectURL(this.silenceURL),this.silenceURL=void 0)}hush(){if(this.paused)return this.resume();this.queue?.clear(),this.cuePlayer.stop()}async synth(e,t){let n=await this.api(`/api/speak`,{method:`POST`,json:{text:e},signal:t});return URL.createObjectURL(await n.blob())}async play(e){let t=this.player;try{if(t.src=e,!await t.play().then(()=>!0,()=>!1)){this.warnedAutoplay||this.ui.note(`The browser blocked audio playback. Tap the mic to allow it.`),this.warnedAutoplay=!0;return}await new Promise(e=>{t.onended=t.onpause=t.onerror=()=>e()})}finally{t.onended=t.onpause=t.onerror=null,URL.revokeObjectURL(e)}}refresh(){if(!this.active)return;let e=this.paused?`paused`:this.queue?.speaking?`speaking`:this.vad?.active?`hearing`:this.inflight>0||this.endpointer?.held?`transcribing`:Date.now()-this.heardAt<zs?`sent`:`listening`;e!==this.state&&(this.state=e,this.ui.state(e))}async lockScreen(){if(`wakeLock`in navigator&&document.visibilityState===`visible`&&(!this.wakeLock||this.wakeLock.released))try{this.wakeLock=await navigator.wakeLock.request(`screen`)}catch{}}release(){this.stream?.getTracks().forEach(e=>e.stop()),this.stream=void 0}async stop({post:e=!0,keepalive:t=!1}={}){this.attempt++;let n=this.active;this.active=!1,this.paused=!1,this.state=void 0,document.removeEventListener(`visibilitychange`,this.onVisibility),clearInterval(this.ticker),this.cuePlayer.close(),this.stopSilence(),this.opts.background&&this.clearMediaSession(),this.queue?.clear(),this.endpointer?.reset(),this.vad?.reset();try{this.source?.disconnect(),this.tap?.disconnect(),this.tap&&`port`in this.tap&&(this.tap.port.onmessage=null),this.sink?.disconnect()}catch{}this.ctx?.close().catch(()=>{}),this.ctx=this.source=this.tap=this.sink=this.vad=void 0,this.release(),this.wakeLock?.release().catch(()=>{}),this.wakeLock=void 0,this.ui.level(0),this.ui.held?.(``),this.ui.state(`off`),this.ui.ended(),e&&n&&await this.api(`${this.path}/conversation`,{method:`POST`,json:{on:!1},keepalive:t}).catch(()=>{})}},Ys=`voice.speed`,Xs=`voice.cues`,Zs=`voice.background`,Qs=`voice.micDevice`,$s={get speed(){return xr(localStorage.getItem(Ys))},set speed(e){localStorage.setItem(Ys,String(xr(e))),cs(Q,xr(e))},get cues(){return localStorage.getItem(Xs)!==`0`},set cues(e){localStorage.setItem(Xs,e?`1`:`0`)},get background(){return localStorage.getItem(Zs)===`1`},set background(e){localStorage.setItem(Zs,e?`1`:`0`)}},Q=new Audio;Q.preload=`none`,cs(Q,$s.speed);function ec(){Q.paused&&(Q.muted=!0,Q.play().catch(()=>{}).finally(()=>{Q.pause(),Q.muted=!1}))}var[tc,nc]=x(localStorage.getItem(Qs)??``);function rc(e){nc(e),localStorage.setItem(Qs,e)}async function ic(){if(!navigator.mediaDevices?.enumerateDevices)return[];let e=(await navigator.mediaDevices.enumerateDevices()).filter(e=>e.kind===`audioinput`);if(e.length&&e.every(e=>!e.label))try{(await navigator.mediaDevices.getUserMedia({audio:!0})).getTracks().forEach(e=>e.stop()),e=(await navigator.mediaDevices.enumerateDevices()).filter(e=>e.kind===`audioinput`)}catch{}return e}async function ac(e,t){let n=await navigator.mediaDevices.getUserMedia(qs(e||void 0)),r=new AudioContext,i=r.createMediaStreamSource(n),a=r.createAnalyser();a.fftSize=512,i.connect(a);let o=new Float32Array(a.fftSize),s=0,c=()=>{a.getFloatTimeDomainData(o);let e=0;for(let t of o)e+=t*t;let n=20*Math.log10(Math.max(Math.sqrt(e/o.length),1e-7));t(Math.max(0,Math.min(1,(n+60)/50))),s=requestAnimationFrame(c)};return c(),()=>{cancelAnimationFrame(s),n.getTracks().forEach(e=>e.stop()),r.close()}}var oc=6e4;function sc(){for(let e of[`audio/webm;codecs=opus`,`audio/webm`,`audio/mp4`,`audio/ogg;codecs=opus`])if(window.MediaRecorder?.isTypeSupported?.(e))return e;return``}async function cc(e){if(!navigator.mediaDevices?.getUserMedia||!window.MediaRecorder)throw Error(`This browser cannot record here (the microphone needs HTTPS).`);let t;try{t=await navigator.mediaDevices.getUserMedia(qs(tc()||void 0))}catch(e){let t=e;throw Error(t.name===`NotAllowedError`?`Microphone permission was denied. Allow it in the browser's site settings.`:`Microphone: ${t.message}`)}let n=sc(),r=new MediaRecorder(t,n?{mimeType:n}:void 0),i=[],a=Date.now();r.ondataavailable=e=>e.data.size&&i.push(e.data);let o=!1,s=new Promise((e,a)=>{r.onstop=async()=>{if(clearInterval(c),clearTimeout(l),t.getTracks().forEach(e=>e.stop()),o)return e(``);let s=new Blob(i,{type:(r.mimeType||n||`audio/webm`).split(`;`)[0]});if(!s.size)return e(``);try{let{text:t}=await(await H(`/api/transcribe`,{method:`POST`,body:s,headers:{"content-type":s.type}})).json();e(String(t??``).trim())}catch(e){let t=e;a(Error(t.status===413?`That recording was too long.`:`Transcription failed: ${t.message}`))}}});r.start();let c=setInterval(()=>e?.(Math.max(0,Math.ceil((oc-(Date.now()-a))/1e3))),1e3),l=setTimeout(()=>r.state===`recording`&&r.stop(),oc);return{finish(){return r.state===`recording`&&r.stop(),s},cancel(){o=!0,r.state===`recording`&&r.stop()}}}var $=new zo({async expose(e){let t=()=>Ti(e)?.session.exposed!==!1;if(t())return!0;if(!await qi(e,!0))return!1;for(let e=0;e<25&&!t();e++)await new Promise(e=>setTimeout(e,200));return!0},create:(e,t)=>new Js({sessionID:e,api:H,player:Q,ui:t,options:{cues:$s.cues,background:$s.background,speed:()=>$s.speed,title:()=>Ti(e)?.session.title||`OpenCode session`,status:Ti(e)?.session.status,deviceId:tc()||void 0}}),stopPlayback:()=>{Q.paused||Q.pause()},notify:(e,t)=>q(e,t===`err`?`err`:``)}),[lc,uc]=x(0);$.subscribe(()=>uc(e=>e+1));var dc=`voice-mode`,fc=Promise.resolve(),pc=e=>{fc=fc.then(async()=>{let t=`serviceWorker`in navigator?await navigator.serviceWorker.getRegistration(`/`):void 0;t&&await e(t)}).catch(()=>{})},mc={allowed:()=>`Notification`in window&&Notification.permission===`granted`&&`serviceWorker`in navigator,show:e=>pc(t=>t.showNotification(e.title,{body:e.body,tag:dc,silent:!0,requireInteraction:!0,icon:`/icon-192.png`,badge:`/icon-192.png`,data:{kind:`voice`,sessionID:e.sessionID,url:`/s/${encodeURIComponent(e.sessionID)}`},renotify:!1,actions:[{action:`end`,title:`End`},{action:`open`,title:`Open`}]})),close:()=>pc(async e=>(await e.getNotifications({tag:dc})).forEach(e=>e.close())),media:(e,t)=>{let n=navigator.mediaSession;if(n)try{n.metadata=e&&`MediaMetadata`in window?new MediaMetadata({title:e.title,artist:e.artist,artwork:[{src:`/icon-192.png`,sizes:`192x192`,type:`image/png`},{src:`/icon-512.png`,sizes:`512x512`,type:`image/png`}]}):null;let r=e&&t?()=>t():null;n.setActionHandler(`pause`,r);for(let e of[`stop`,`play`])try{n.setActionHandler(e,e===`stop`?r:null)}catch{}}catch{}}},hc=new Wo($,mc,{title:e=>Ti(e)?.session.title||`OpenCode session`});bo(e=>{e?.type===`voice-end`&&typeof e.sessionID==`string`&&hc.endFromNotification(e.sessionID)});function gc(){return lc(),hc.needsPermission()}async function _c(){try{await po()}catch(e){q(e instanceof Error?e.message:String(e),`err`)}hc.refresh(),uc(e=>e+1)}function vc(){return lc(),$.state}var yc=()=>{let e=vc().sessionID;return e?Ti(e)?.session.title||`Session`:``};Ci(e=>{e.type===`say`||e.type===`heard`||e.type===`conversation`?$.onEvent(e):e.type===`status`&&typeof e.sessionID==`string`&&Array.isArray(e.sessions)&&$.onStatus(e.sessionID,e.sessions)}),window.addEventListener(`pagehide`,()=>{$.stop({keepalive:!0}),mc.close()});var bc=new os,xc=new Lo({record:e=>cc(e),deliver:(e,t)=>void bc.append(e,t),notify:(e,t)=>q(e,t),hold:()=>$.hold()}),[Sc,Cc]=x(0);xc.subscribe(()=>Cc(e=>e+1));function wc(e){return Sc(),xc.forSession(e)}var Tc=F(`<div class=banner><span></span><a class="btn small"href=/settings#machines>Review`),Ec=F(`<div class=banner><span><strong>Set up speech</strong> · </span><a class="btn small"href=/settings#speech>Set up`),Dc=F(`<select aria-label=Server><option value>All servers`),Oc=F(`<div class=empty><p class=display>No machines yet</p><p class=muted>In OpenCode run /voice → Connect this machine, then approve it here.`),kc=F(`<ul class=home-list>`),Ac=F(`<div class=home><header class=home-head><h1 class=display>All sessions</h1><a class="btn primary"href=/new> New session</a></header><div class=home-tools><label class=search><input type=search placeholder="Search title, project, folder or server"aria-label="Search sessions"></label></div><div class=chips role=group aria-label=Filters></div><p class="count muted"role=status>`),jc=F(`<option>`),Mc=F(`<button type=button class=chip>`),Nc=F(`<p class="muted small offline-line"><strong></strong> · offline · seen `),Pc=F(`<table class=sessions-table><thead><tr><th class=col-now>Now</th><th class=col-actions><span class=sr-only>Actions</span></th></tr></thead><tbody>`),Fc=F(`<th><button type=button class=th-btn><span class=sort-mark aria-hidden=true>`),Ic=F(`<tr><td colspan=8 class="muted empty-cell">No sessions match.`),Lc=F(`<span class=unread-dot role=img aria-label=Unread>`),Rc=F(`<tr><td class=col-status><span class=sr-only></span></td><td class=col-title><a></a></td><td class=col-project></td><td class=col-server><span></span></td><td class=col-source></td><td class=col-activity></td><td class="col-now muted"></td><td class=col-actions>`),zc=F(`<li><a class=home-item-link><span class=home-item-text><span class=home-item-title></span><span class="home-item-meta muted">`),Bc=`hub.table`;function Vc(e){mi();let t=e.blockers[0];if(e.state===`blocked`&&t)return`${t.kind===`permission`?`Permission`:`Question`}: ${t.summary}`;if(e.state!==`working`)return``;let n=di.has(e.id)?di.feed(e.id):void 0,r=n?.pulse();return r?.busy&&r.label!==`Working`?r.label:n?.now()??e.nowText??`Working`}var Hc=[[`status`,`Status`],[`title`,`Title`],[`project`,`Project`],[`server`,`Server`],[`source`,`Open in`],[`activity`,`Last activity`]],Uc=[[`needs`,`Needs you`,{status:`needs`}],[`running`,`Running`,{status:`running`}],[`idle`,`Idle`,{status:`idle`}],[`open`,`Open in terminal`,{source:`open`}],[`background`,`Background`,{source:`background`}],[`hidden`,`Hidden`,{hidden:!0}]];function Wc(){let[e,t]=x(hr(localStorage.getItem(Bc))),[n,r]=x(``),i=e=>{t(e),localStorage.setItem(Bc,gr(e))},a=w(()=>pr(wi(),{...e(),query:n()})),o=()=>J.machines??[],s=t=>Object.keys(t).every(n=>e().filters[n]===t[n]),c=t=>{let n=e().filters,r=Object.fromEntries(Object.keys(t).map(e=>[e,ir.filters[e]]));i({...e(),filters:s(t)?{...n,...r}:{...n,...t}})},l=t=>{let n=e().sort;i({...e(),sort:{key:t,dir:n.key===t?n.dir===`asc`?`desc`:`asc`:t===`activity`?`desc`:`asc`}})},u=()=>Vr(vi()??void 0,X()?.publicURL);return(()=>{var t=Ac(),d=t.firstChild,f=d.firstChild.nextSibling,p=f.firstChild,m=d.nextSibling,h=m.firstChild,g=h.firstChild,_=m.nextSibling,v=_.nextSibling;return B(f,O(Z,{name:`plus`}),p),B(t,O(A,{get when(){return bi().length},get children(){var e=Tc(),t=e.firstChild;return B(t,(()=>{var e=N(()=>bi().length===1);return()=>e()?`${bi()[0].machineName} wants to connect.`:`${bi().length} machines want to connect.`})()),e}}),m),B(t,O(A,{get when(){return u()},get children(){var e=Ec(),t=e.firstChild;return t.firstChild.nextSibling,B(t,()=>u().reason,null),e}}),m),B(h,O(Z,{name:`search`}),g),g.$$input=e=>r(e.currentTarget.value),B(m,O(A,{get when(){return o().length>1},get children(){var t=Dc();return t.firstChild,t.addEventListener(`change`,t=>i({...e(),filters:{...e().filters,machine:t.currentTarget.value}})),B(t,O(k,{get each(){return o()},children:e=>(()=>{var t=jc();return B(t,()=>e.name),S(()=>t.value=e.id),t})()}),null),S(()=>t.value=e().filters.machine),t}}),null),B(_,O(k,{each:Uc,children:([e,t,n])=>(()=>{var r=Mc();return r.$$click=()=>c(n),L(r,`data-chip`,e),B(r,t),S(()=>L(r,`aria-pressed`,s(n))),r})()})),B(v,(()=>{var e=N(()=>J.machines===void 0);return()=>e()?`Loading…`:`${a().length} of ${wi().filter(e=>!e.hidden).length} sessions`})()),B(t,O(A,{get when(){return N(()=>!!J.machines)()&&J.machines.length===0},get children(){return Oc()}}),null),B(t,O(A,{get when(){return To()},get fallback(){return O(Gc,{get rows(){return a()},get table(){return e()},sortBy:l})},get children(){var e=kc();return B(e,O(k,{get each(){return a()},children:e=>O(Kc,{row:e})})),e}}),null),B(t,O(k,{get each(){return o().filter(e=>!e.online)},children:e=>(()=>{var t=Nc(),n=t.firstChild;return n.nextSibling,B(n,()=>e.name),B(t,()=>wa(e.lastSeen,Ca()),null),t})()}),null),S(()=>g.value=n()),t})()}function Gc(e){let t=t=>e.table.sort.key===t?e.table.sort.dir===`asc`?`ascending`:`descending`:`none`;return(()=>{var n=Pc(),r=n.firstChild,i=r.firstChild,a=i.firstChild,o=r.nextSibling;return B(i,O(k,{each:Hc,children:([n,r])=>(()=>{var i=Fc(),a=i.firstChild,o=a.firstChild;return R(i,`col-${n}`),a.$$click=()=>e.sortBy(n),B(a,r,o),B(o,(()=>{var t=N(()=>e.table.sort.key===n);return()=>t()?e.table.sort.dir===`asc`?`↑`:`↓`:``})()),S(()=>L(i,`aria-sort`,t(n))),i})()}),a),B(o,O(k,{get each(){return e.rows},get fallback(){return Ic()},children:e=>(()=>{var t=Rc(),n=t.firstChild,r=n.firstChild,i=n.nextSibling,a=i.firstChild,o=i.nextSibling,s=o.nextSibling,c=s.firstChild,l=s.nextSibling,u=l.nextSibling,d=u.nextSibling,f=d.nextSibling;return t.$$click=t=>!t.target.closest(`button,a,select`)&&ri(ii(e.id)),B(n,O(_a,{get state(){return e.state}}),r),B(r,()=>ha[e.state]),B(i,O(A,{get when(){return vr(e,vc())},get children(){return O(ga,{})}}),a),B(a,()=>e.title),B(i,O(A,{get when(){return e.unread},get children(){return Lc()}}),null),B(o,()=>e.where),B(c,()=>e.machineName),B(l,()=>Da[e.source]),B(u,()=>wa(e.updated,Ca())),B(d,()=>Vc(e)),B(f,O(ya,{get label(){return`More actions for ${e.title}`},class:`icon-btn small`,items:()=>xo(e)})),S(n=>{var r=`${e.unread?`unread`:``}`,i=ii(e.id),s=e.directory,l=e.machineOnline?``:`muted`;return r!==n.e&&R(t,n.e=r),i!==n.t&&L(a,`href`,n.t=i),s!==n.a&&L(o,`title`,n.a=s),l!==n.o&&R(c,n.o=l),n},{e:void 0,t:void 0,a:void 0,o:void 0}),t})()})),n})()}function Kc(e){let t=()=>e.row;return(()=>{var e=zc(),n=e.firstChild,r=n.firstChild,i=r.firstChild,a=i.nextSibling;return B(n,O(_a,{get state(){return t().state}}),r),B(i,O(A,{get when(){return vr(t(),vc())},get children(){return O(ga,{})}}),null),B(i,()=>t().title,null),B(i,O(A,{get when(){return t().unread},get children(){return Lc()}}),null),B(a,()=>Vc(t())||`${t().where} · ${t().machineName} · ${wa(t().updated,Ca())}`),B(e,O(ya,{get label(){return`More actions for ${t().title}`},class:`icon-btn small`,items:()=>xo(t())}),null),S(r=>{var i=`home-item${t().unread?` unread`:``}`,a=ii(t().id);return i!==r.e&&R(e,r.e=i),a!==r.t&&L(n,`href`,r.t=a),r},{e:void 0,t:void 0}),e})()}I([`input`,`click`]);var qc={service:`background service`,standalone:`standalone`};function Jc(e){return(e??[]).map(e=>{let t=!!e.online,n=e.processes.find(e=>e.kind===`service`)??e.processes[0],r=t?n?[qc[n.kind]??n.kind,n.opencodeVersion?`OpenCode ${n.opencodeVersion}`:``].filter(Boolean).join(` · `):`online`:`offline`;return{id:e.id,name:e.name,online:t,disabled:!t,detail:r,herdr:t&&!!e.terminals?.herdr,canCreate:t&&e.processes.some(e=>e.kind===`service`)}}).sort((e,t)=>Number(t.online)-Number(e.online)||e.name.localeCompare(t.name))}function Yc(e,t,n){let r=t=>t?e.find(e=>e.id===t&&e.online):void 0;return(r(t)??r(n)??e.find(e=>e.canCreate)??e.find(e=>e.online))?.id}function Xc(e,t,n){let r=(t,n)=>{let r=t?e.find(e=>e.key===t):void 0;if(r)return{key:r.key,dir:n&&r.directories.includes(n)?n:r.directories[0]??n??``}},i=e[0];return r(t.key,t.dir)??r(n?.key,n?.dir)??(i?{key:i.key,dir:i.directories[0]??``}:void 0)}function Zc(e,t){let n=Tn(t).split(/\s+/).filter(Boolean);return n.length?e.filter(e=>{let t=[e.label,...e.directories].map(Tn);return n.every(e=>t.some(t=>t.includes(e)))}):[...e]}var Qc=`hub.newSession`;function $c(e){try{let t=JSON.parse(e.getItem(`hub.newSession`)??`null`);if(t&&typeof t.machine==`string`&&typeof t.key==`string`&&typeof t.dir==`string`)return{machine:t.machine,key:t.key,dir:t.dir}}catch{}}function el(e,t){try{e.setItem(Qc,JSON.stringify({machine:t.machine,key:t.key,dir:t.dir}))}catch{}}var tl=`hub.railCollapsed`;function nl(e){try{let t=JSON.parse(e.getItem(`hub.railCollapsed`)??`[]`);return new Set(Array.isArray(t)?t.filter(e=>typeof e==`string`):[])}catch{return new Set}}function rl(e,t){let n=nl(e);n.has(t)?n.delete(t):n.add(t);try{e.setItem(tl,JSON.stringify([...n]))}catch{}return n}var il=0,al=e=>e.reduce((e,t)=>e+t.data.length,0);async function ol(e,t){let n=Qo(t.length,e.type);if(n)throw Error(n);let r=await sl(e);try{let n=e.type!==`image/jpeg`&&ll(r),{blob:i,request:a}=await ns({width:r.width,height:r.height,keepPng:n},$o(al(t)),e=>ul(r,e)),o=await dl(i);return{id:`img${++il}`,mime:a.type,data:o.slice(o.indexOf(`,`)+1),name:ts(e.name||`image`,a.type),preview:URL.createObjectURL(i)}}finally{`close`in r&&r.close()}}async function sl(e){try{return await createImageBitmap(e)}catch{let t=URL.createObjectURL(e);try{let e=new Image;return e.src=t,await e.decode(),e}catch{throw Error(`Could not read ${e.name||`this image`}`)}finally{URL.revokeObjectURL(t)}}}function cl(e,t){let n=document.createElement(`canvas`);n.width=e,n.height=t;let r=n.getContext(`2d`);if(!r)throw Error(`This browser cannot process images`);return[n,r]}function ll(e){let t=Math.max(1,Math.min(64,e.width)),n=Math.max(1,Math.min(64,e.height)),[,r]=cl(t,n);r.drawImage(e,0,0,t,n);let i=r.getImageData(0,0,t,n).data;for(let e=3;e<i.length;e+=4)if(i[e]<255)return!0;return!1}function ul(e,t){let[n,r]=cl(t.width,t.height);return t.type===`image/jpeg`&&(r.fillStyle=`#fff`,r.fillRect(0,0,t.width,t.height)),r.imageSmoothingQuality=`high`,r.drawImage(e,0,0,t.width,t.height),new Promise((e,r)=>n.toBlob(t=>t?e(t):r(Error(`Could not encode the image`)),t.type,t.quality))}function dl(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>t(String(r.result)),r.onerror=()=>n(Error(`Could not read the encoded image`)),r.readAsDataURL(e)})}function fl(e){if(!e)return[];let t=[...e.files].filter(e=>e.type.startsWith(`image/`));return t.length?t:[...e.items].flatMap(e=>e.kind===`file`&&e.type.startsWith(`image/`)?[e.getAsFile()].filter(e=>!!e):[])}var pl=new Map;function ml(e,t){pl.set(e,t)}function hl(e){let t=pl.get(e);return pl.delete(e),t}var gl=F(`<li class="attachment busy"aria-label="Preparing image"><span class="spinner small">`),_l=F(`<ul class=attachments aria-label="Attached images">`),vl=F(`<span class="spinner small">`),yl=F(`<form class="composer new-composer"><div class=composer-box><textarea rows=3 aria-label="Describe a task or ask a question"placeholder="Describe a task or ask a question"></textarea><input type=file class=sr-only tabindex=-1 aria-hidden=true data-testid=new-attach-input multiple><div class=composer-actions><button type=button class=icon-btn aria-label="Attach images"></button><span class=grow></span><button type=submit class="send icon-send"aria-label="Start session"title="Start session">`),bl=F(`<span class="meta-chip readonly"title="Branch of this folder"><span class="chip-text mono">`),xl=F(`<label class="meta-chip toggle-chip"><input type=checkbox><span class=chip-text>Open in Herdr tab`),Sl=F(`<div class=env-meta role=group aria-label="Where the session runs">`),Cl=F('<p class="small warn"> has no background service connected; start `opencode serve --service` there to create sessions.'),wl=F(`<p class=error role=alert>`),Tl=F(`<div class=new-session><header class=topbar><h1 class=title>New session</h1></header><div class="column narrow new-column"><p class="display greeting">What should we work on?`),El=F(`<p class=muted>No machine is connected to this hub yet.`),Dl=F(`<li class=attachment><img><button type=button class=attachment-remove>`),Ol=F(`<span aria-hidden=true>`),kl=F(`<span class=chip-text>`),Al=F(`<button type=button class="meta-chip folder-chip"aria-haspopup=dialog aria-label="Choose project folder"><span class=chip-text>`),jl=F(`<div class="menu folder-menu"role=dialog aria-label="Choose project folder"><input class=folder-search type=search placeholder="Search folders"aria-label="Search folders"><div class=folder-list role=listbox aria-label=Folders>`),Ml=F(`<p class="muted small pad">No folder matches.`),Nl=F(`<div class=menu-section> · Herdr`),Pl=F(`<button type=button role=option class=menu-item><span class=menu-check></span><span class=menu-label></span><span class=menu-hint>`),Fl=F(`<button type=button role=option class=menu-item><span class=menu-check></span><span class=menu-label></span><span class="menu-hint mono">`);function Il(e){let t=$c(localStorage),n=()=>J.machines??[],r=w(()=>Jc(n())),[i,a]=x(),o=()=>{let n=i();return n&&r().some(e=>e.id===n&&e.online)?n:Yc(r(),e.machine,t?.machine)},s=()=>r().find(e=>e.id===o()),c=()=>n().find(e=>e.id===o()),l=w(()=>{let t=c();if(!t)return[];let n=tr(t).targets;return e.key&&e.dir&&t.id===e.machine&&!n.some(t=>t.key===e.key)&&n.push({kind:`folder`,key:e.key,label:Ta(e.dir),directories:[e.dir]}),n}),[u,d]=x(),f=()=>{let n=u();if(n&&n.machine===o()&&l().some(e=>e.key===n.key))return{key:n.key,dir:n.dir};let r=o()===e.machine?{key:e.key,dir:e.dir}:{};return Xc(l(),r,t?.machine===o()?t:void 0)},p=()=>l().find(e=>e.key===f()?.key),m=e=>e.directories.length?e.directories:l().filter(e=>e.kind===`folder`).flatMap(e=>e.directories),h=()=>{let e=f(),t=p();return!e||!t?``:e.dir&&m(t).includes(e.dir)?e.dir:m(t)[0]??``},g=(e,t)=>e?.processes.flatMap(e=>e.sessions).filter(e=>!e.parentID&&e.directory===t).sort((e,t)=>(t.updated??0)-(e.updated??0))[0],[_]=ne(()=>{let e=g(c(),h());return e?e.id:void 0},async e=>(await U(`${W(e)}/summary`).catch(()=>({}))).branch),[v,y]=x(!0),b=()=>!!s()?.herdr&&p()?.kind===`herdr`&&v(),[ee,C]=x(``),[te,re]=x([]),[T,ie]=x(!1),[oe,E]=x(``),[se,ce]=x(!1),le=Promise.resolve(),ue=e=>{le=le.then(async()=>{ie(!0);try{for(let t of e)try{let e=await ol(t,te());re(t=>[...t,e])}catch(e){E(G(e))}}finally{ie(!1)}})},de=()=>!se()&&!T()&&!!s()?.canCreate&&!!h()&&(!!ee().trim()||te().length>0),fe=async()=>{let e=s(),t=p(),n=h();if(de()&&e&&t){ce(!0),E(``);try{let r=nr({target:t,directory:n,openInHerdr:b()}),i=await(await H(`/api/machines/${Wt(e.id)}/sessions`,{method:`POST`,json:r})).json();el(localStorage,{machine:e.id,key:t.key,dir:n}),ml(i.sessionID,{text:ee().trim(),images:te()}),ri(ii(i.sessionID),{replace:!0}),i.warning?q(`Session created, but Herdr didn't open it: ${i.warning}`,`warn`):i.openedIn===`herdr`&&q(`Opened in Herdr · ${t.label}`)}catch(t){E(t instanceof Vt&&t.status===409?`The background service on ${e.name} isn't connected. Start it, then try again.`:`Could not create the session: ${G(t)}`),ce(!1)}}},pe=()=>[{section:`Choose environment`},...r().map(e=>({label:e.name,hint:e.online?e.canCreate?e.detail:`${e.detail} · no background service`:`offline`,checked:e.id===o(),disabled:e.disabled,run:()=>a(e.id)}))],me,he;ae(()=>me?.focus());let ge=()=>{me.style.height=`auto`,me.style.height=`${Math.min(me.scrollHeight,320)}px`};return(()=>{var e=Tl(),t=e.firstChild,n=t.firstChild,i=t.nextSibling;return i.firstChild,B(t,O(A,{get when(){return To()},get children(){return O(va,{icon:`menu`,label:`Open sidebar`,onClick:Io})}}),n),B(i,O(A,{get when(){return r().length},get fallback(){return El()},get children(){return[(()=>{var e=yl(),t=e.firstChild,n=t.firstChild,r=n.nextSibling,i=r.nextSibling.firstChild,a=i.nextSibling.nextSibling;e.addEventListener(`drop`,e=>{let t=fl(e.dataTransfer);t.length&&(e.preventDefault(),ue(t))}),e.addEventListener(`dragover`,e=>[...e.dataTransfer?.types??[]].includes(`Files`)&&e.preventDefault()),e.addEventListener(`submit`,e=>{e.preventDefault(),fe()}),B(t,O(A,{get when(){return te().length||T()},get children(){var e=_l();return B(e,O(k,{get each(){return te()},children:e=>(()=>{var t=Dl(),n=t.firstChild,r=n.nextSibling;return r.$$click=()=>re(t=>t.filter(t=>t.id!==e.id)),B(r,O(Z,{name:`close`})),S(t=>{var i=e.preview,a=e.name,o=e.name,s=`Remove ${e.name}`;return i!==t.e&&L(n,`src`,t.e=i),a!==t.t&&L(n,`alt`,t.t=a),o!==t.a&&L(n,`title`,t.a=o),s!==t.o&&L(r,`aria-label`,t.o=s),t},{e:void 0,t:void 0,a:void 0,o:void 0}),t})()}),null),B(e,O(A,{get when(){return T()},get children(){return gl()}}),null),e}}),n),n.$$keydown=e=>{e.key===`Enter`&&!e.shiftKey&&!e.isComposing&&!(matchMedia(`(max-width: 760px)`).matches&&`ontouchstart`in window)&&(e.preventDefault(),fe())},n.addEventListener(`paste`,e=>{let t=fl(e.clipboardData);t.length&&(e.preventDefault(),ue(t))}),n.$$input=e=>{C(e.currentTarget.value),ge()};var o=me;typeof o==`function`?z(o,n):me=n,r.addEventListener(`change`,e=>{let t=[...e.currentTarget.files??[]];e.currentTarget.value=``,t.length&&ue(t)});var s=he;return typeof s==`function`?z(s,r):he=r,i.$$click=()=>he.click(),B(i,O(Z,{name:`plus`})),B(a,O(A,{get when(){return se()},get fallback(){return O(Z,{name:`send`})},get children(){return vl()}})),S(e=>{var t=Go.join(`,`),n=te().length>=Ko.maxImages||T(),o=!de();return t!==e.e&&L(r,`accept`,e.e=t),n!==e.t&&(i.disabled=e.t=n),o!==e.a&&(a.disabled=e.a=o),e},{e:void 0,t:void 0,a:void 0}),S(()=>n.value=ee()),e})(),(()=>{var e=Sl();return B(e,O(ya,{label:`Choose environment`,class:`meta-chip env-chip`,align:`left`,items:pe,get text(){return[O(Z,{name:`cloud`}),(()=>{var e=Ol();return S(()=>R(e,`online-dot${s()?.online?` on`:``}`)),e})(),(()=>{var e=kl();return B(e,()=>s()?.name??`No environment`),e})(),O(Z,{name:`down`,class:`chip-caret`})]}}),null),B(e,O(Ll,{get targets(){return l()},get current(){return f()},get dir(){return h()},get disabled(){return!s()},foldersOf:m,onPick:(e,t)=>d({machine:o(),key:e,dir:t})}),null),B(e,O(A,{get when(){return _()},get children(){var e=bl(),t=e.firstChild;return B(e,O(Z,{name:`branch`}),t),B(t,_),e}}),null),B(e,O(A,{get when(){return N(()=>!!s()?.herdr)()&&p()?.kind===`herdr`},get children(){var e=xl(),t=e.firstChild;return t.addEventListener(`change`,e=>y(e.currentTarget.checked)),S(()=>L(e,`title`,`Open the new session in a new tab of the Herdr workspace ${p().label}`)),S(()=>t.checked=v()),e}}),null),e})(),O(A,{get when(){return N(()=>!!s())()&&!s().canCreate},get children(){var e=Cl(),t=e.firstChild;return B(e,()=>s().name,t),e}}),O(A,{get when(){return oe()},get children(){var e=wl();return B(e,oe),e}})]}}),null),e})()}function Ll(e){let[t,n]=x(!1),[r,i]=x(``),[a,o]=x({top:0,left:0}),s,c,l,u=()=>Zc(e.targets,r()),d=()=>{let t=e.targets.find(t=>t.key===e.current?.key);return t?t.kind===`herdr`&&e.dir?`${t.label} · ${Ta(e.dir)}`:t.label:`No folder`},f=()=>{let e=s.getBoundingClientRect();o({top:e.bottom+4,left:e.left}),i(``),n(!t()),t()&&queueMicrotask(()=>l?.focus())},p=e=>{t()&&!s.contains(e.target)&&!c?.contains(e.target)&&n(!1)},m=e=>{t()&&e.key===`Escape`&&(n(!1),s.focus())};ae(()=>{document.addEventListener(`mousedown`,p),document.addEventListener(`keydown`,m)}),oe(()=>{document.removeEventListener(`mousedown`,p),document.removeEventListener(`keydown`,m)});let h=(t,r)=>{e.onPick(t,r),n(!1)};return[(()=>{var n=Al(),r=n.firstChild;n.$$click=f;var i=s;return typeof i==`function`?z(i,n):s=n,B(n,O(Z,{name:`folder`}),r),B(r,d),B(n,O(Z,{name:`down`,class:`chip-caret`}),null),S(r=>{var i=t(),a=e.dir||`Choose a folder`,o=e.disabled;return i!==r.e&&L(n,`aria-expanded`,r.e=i),a!==r.t&&L(n,`title`,r.t=a),o!==r.a&&(n.disabled=r.a=o),r},{e:void 0,t:void 0,a:void 0}),n})(),O(A,{get when(){return t()},get children(){return O(vt,{get children(){var t=jl(),n=t.firstChild,o=n.nextSibling,s=c;typeof s==`function`?z(s,t):c=t,n.$$keydown=t=>{let n=u()[0];t.key===`Enter`&&n&&(t.preventDefault(),h(n.key,e.foldersOf(n)[0]??``))},n.$$input=e=>i(e.currentTarget.value);var d=l;return typeof d==`function`?z(d,n):l=n,B(o,O(A,{get when(){return u().length},get fallback(){return Ml()},get children(){return O(k,{get each(){return u()},children:t=>O(A,{get when(){return N(()=>t.kind===`herdr`)()&&e.foldersOf(t).length>1},get fallback(){return(()=>{var n=Pl(),r=n.firstChild,i=r.nextSibling,a=i.nextSibling;return n.$$click=()=>h(t.key,e.foldersOf(t)[0]??``),B(r,()=>e.current?.key===t.key?`✓`:``),B(i,()=>t.label),B(a,(()=>{var n=N(()=>t.kind===`herdr`);return()=>n()?`Herdr`:Ta(e.foldersOf(t)[0]??``)})()),S(r=>{var i=e.current?.key===t.key,a=e.foldersOf(t)[0];return i!==r.e&&L(n,`aria-selected`,r.e=i),a!==r.t&&L(n,`title`,r.t=a),r},{e:void 0,t:void 0}),n})()},get children(){return[(()=>{var e=Nl(),n=e.firstChild;return B(e,()=>t.label,n),e})(),O(k,{get each(){return e.foldersOf(t)},children:n=>(()=>{var r=Fl(),i=r.firstChild,a=i.nextSibling,o=a.nextSibling;return r.$$click=()=>h(t.key,n),L(r,`title`,n),B(i,()=>e.current?.key===t.key&&e.dir===n?`✓`:``),B(a,()=>Ta(n)),B(o,n),S(()=>L(r,`aria-selected`,e.current?.key===t.key&&e.dir===n)),r})()})]}})})}})),S(e=>{var n=`${a().top}px`,r=`${a().left}px`;return n!==e.e&&nt(t,`top`,e.e=n),r!==e.t&&nt(t,`left`,e.t=r),e},{e:void 0,t:void 0}),S(()=>n.value=r()),t}})}})]}I([`input`,`keydown`,`click`]);var Rl=e=>String(e??``).normalize(`NFD`).replace(/\p{M}/gu,``).toLowerCase(),zl=e=>`${e.providerID}/${e.modelID}`,Bl=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=Rl(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&&!Rl([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:zl(e),variants:e.variant?[e.variant]:[],stale:!0}}},Vl=e=>`${e}:reasoning`,Hl=class{items=new Map;subagents=new Map;details=new Map;load(e){for(let t of e??[]){let e=t?.kind===`reasoning`&&typeof t.messageID==`string`?Vl(t.messageID):void 0,n=e!==void 0&&e!==t.key?this.items.get(e):void 0;n?(this.items.delete(e),this.upsert({...t,text:t.text||n.text||``})):this.upsert(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(Vl(t));let a=i?.key??Vl(t);this.upsert({key:a,kind:`reasoning`,messageID:t,...e?{sessionID:e}:{},text:`${i?.text??``}${n}`,state:`running`,at:i?.at??r})}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.items.set(e.key,{...this.items.get(e.key)??{},...e})}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`);for(let a of e??[]){let o=a?.id;if(!a||typeof o!=`string`||!o||o===t||!r.has(o)&&!(i&&(e??[])[0]?.id===t))continue;n.add(o);let s=typeof a.since==`number`?a.since:void 0,c=this.subagents.get(o)??{id:o,at:s??Date.now()};this.subagents.set(o,{...c,title:typeof a.title==`string`?a.title:void 0,state:a.state===`idle`?`done`:a.state,since:s})}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.map(e=>({at:e.at??0,rows:[e]}));for(let e of this.subagents.values())n.push({at:e.at??0,rows:[{key:`sub:${e.id}`,kind:`subagent`,label:e.title||e.id,state:e.state,sessionID:e.id,depth:0},...(t.get(e.id)??[]).sort((e,t)=>(e.at??0)-(t.at??0))]});return n.sort((e,t)=>e.at-t.at).flatMap(e=>e.rows)}},Ul=(e,t,n)=>`/api/sessions/${encodeURIComponent(e)}/timeline/messages/${encodeURIComponent(t)}/files/${n}`;function Wl(e){let t=[];if(Array.isArray(e.images))e.images.forEach((n,r)=>{n&&typeof n.mime==`string`&&t.push({key:`${e.key}:${r}`,name:String(n.name||`image`),mime:n.mime,...typeof n.preview==`string`?{src:n.preview}:{}})});else if(Array.isArray(e.files))for(let n of e.files){if(!n||typeof n.mime!=`string`||!Number.isInteger(n.index))continue;let r=Zo(n.mime)&&typeof e.sessionID==`string`&&typeof e.messageID==`string`;t.push({key:`${e.key}:${n.index}`,name:typeof n.name==`string`&&n.name?n.name:n.mime.startsWith(`image/`)?`image`:`file`,mime:n.mime,...r?{src:Ul(e.sessionID,e.messageID,n.index)}:{}})}return t}function Gl(e){let t=[];for(let n of e)if(!((n.depth??0)>0))switch(n.kind){case`user`:{let e=Wl(n);(n.text||e.length)&&t.push({type:`user`,key:n.key,text:n.text??``,...e.length?{images:e}:{}});break}case`assistant`:n.text&&t.push({type:`assistant`,key:n.key,text:n.text,live:n.live===!0});break;case`reasoning`:{let e=n.state===`running`,r=!e&&typeof n.at==`number`&&typeof n.completed==`number`?Math.max(0,Math.round((n.completed-n.at)/1e3)):void 0;t.push({type:`thought`,key:n.key,text:n.text??``,running:e,...r===void 0?{}:{seconds:r}});break}case`tool`:{let e=t[t.length-1],r=e?.type===`tools`?e:void 0,i=r??{type:`tools`,key:`tools:${n.key}`,items:[],failed:0,running:0};i.items.push(n),n.state===`failed`&&i.failed++,n.state===`running`&&i.running++,r||t.push(i);break}case`subagent`:n.sessionID&&t.push({type:`subagent`,key:n.key,sessionID:n.sessionID,label:n.label??n.sessionID,state:n.state??`working`})}return t}var Kl=`The model didn't share its reasoning text (only an encrypted summary).`;function ql(e){let t=e.running?`Thinking…`:e.seconds===void 0?`Thought`:`Thought for ${e.seconds}s`;return e.text?{label:t,body:e.text,muted:!1}:{label:t,body:e.running?`Waiting for the model's reasoning…`:Kl,muted:!0}}var Jl=F(`<p class=composer-error role=alert>`),Yl=F(`<p class="composer-hint muted small">`),Xl=F(`<li class="attachment busy"aria-label="Preparing image"><span class="spinner small">`),Zl=F(`<ul class=attachments aria-label="Attached images">`),Ql=F(`<button type=button class="btn stop"aria-label="Stop the session and its subagents"> Stop`),$l=F(`<span class=sr-only>`),eu=F(`<form><div class=composer-box><textarea rows=1 aria-label=Message></textarea><input type=file class=sr-only tabindex=-1 aria-hidden=true data-testid=attach-input multiple><div class=composer-actions><button type=button class=icon-btn aria-label="Attach images"></button><span class=grow></span><button type=button></button><div><button type=button class=split-main></button></div><button type=submit></button></div></div><div class=composer-meta><span class="muted small"></span><span class=grow></span><button type=button class=model-chip title="Voice model (the orchestrator you talk to)">Voice: </button><button type=button class=model-chip title="Worker model (subagents that do the work)">Worker: `),tu=F(`<li class=attachment><img><button type=button class=attachment-remove title=Remove>`),nu=F(`<span class="spinner small">`),ru=F(`<button type=button class=split-chev aria-label="Choose microphone"aria-haspopup=dialog>`),iu=F(`<p class="error small pad">`),au=F(`<div class="menu mic-picker"role=dialog aria-label=Microphone><div class=menu-section>Microphone</div><div class=level aria-label="Input level"role=meter aria-valuemin=0 aria-valuemax=100><span>`),ou=F(`<button type=button class=menu-item role=menuitemradio><span class=menu-check></span><span class=menu-label>`),su=F(`<span class=muted> · “<!>…”`),cu=F(`<p class="voice-hint small">Allow notifications to keep a “Voice mode on” notification with an End button while the screen is off. <button type=button class=link>Allow notifications`),lu=F(`<div role=region aria-label="Voice mode"><div class=wave aria-hidden=true></div><span class=voice-state role=status aria-live=polite></span><span class=grow></span><button type=button class=model-chip title="Voice model"></button><button type=button></button><button type=button class="btn small end">End`),uu=F(`<span>`);function du(e){let t,n,[r,i]=x(!1),a=()=>e.images.length>=Ko.maxImages,o=()=>{t.style.height=`auto`,t.style.height=`${Math.min(t.scrollHeight,280)}px`};C(()=>{e.draft,queueMicrotask(o)});let s=()=>e.view.primary===`steer`?`Steer`:`Send`;return(()=>{var o=eu(),c=o.firstChild,l=c.firstChild,u=l.nextSibling,d=u.nextSibling,f=d.firstChild,p=f.nextSibling.nextSibling,m=p.nextSibling,h=m.firstChild,g=m.nextSibling,_=c.nextSibling.firstChild,v=_.nextSibling.nextSibling;v.firstChild;var y=v.nextSibling;y.firstChild,o.addEventListener(`drop`,t=>{let n=fl(t.dataTransfer);i(!1),n.length&&(t.preventDefault(),e.onAttach(n))}),o.addEventListener(`dragleave`,e=>{e.currentTarget.contains(e.relatedTarget)||i(!1)}),o.addEventListener(`dragover`,e=>{[...e.dataTransfer?.types??[]].includes(`Files`)&&(e.preventDefault(),i(!0))}),o.addEventListener(`submit`,t=>{t.preventDefault(),e.view.canSubmit&&!e.attaching&&e.onSubmit()}),B(o,O(A,{get when(){return e.error},get children(){var t=Jl();return B(t,()=>e.error),t}}),c),B(o,O(A,{get when(){return e.view.hint},get children(){var t=Yl();return B(t,()=>e.view.hint),t}}),c),B(c,O(A,{get when(){return e.images.length||e.attaching},get children(){var t=Zl();return B(t,O(k,{get each(){return e.images},children:t=>(()=>{var n=tu(),r=n.firstChild,i=r.nextSibling;return i.$$click=()=>e.onDetach(t.id),B(i,O(Z,{name:`close`})),S(e=>{var n=t.preview,a=t.name,o=t.name,s=`Remove ${t.name}`;return n!==e.e&&L(r,`src`,e.e=n),a!==e.t&&L(r,`alt`,e.t=a),o!==e.a&&L(r,`title`,e.a=o),s!==e.o&&L(i,`aria-label`,e.o=s),e},{e:void 0,t:void 0,a:void 0,o:void 0}),n})()}),null),B(t,O(A,{get when(){return e.attaching},get children(){return Xl()}}),null),t}}),l),l.$$keydown=t=>{t.key===`Enter`&&!t.shiftKey&&!t.isComposing&&!(matchMedia(`(max-width: 760px)`).matches&&`ontouchstart`in window)&&(t.preventDefault(),e.view.canSubmit&&!e.attaching&&e.onSubmit())},l.addEventListener(`paste`,t=>{let n=fl(t.clipboardData);n.length&&(t.preventDefault(),e.onAttach(n))}),l.$$input=t=>e.onInput(t.currentTarget.value);var b=t;typeof b==`function`?z(b,l):t=l,u.addEventListener(`change`,t=>{let n=[...t.currentTarget.files??[]];t.currentTarget.value=``,n.length&&e.onAttach(n)});var x=n;return typeof x==`function`?z(x,u):n=u,f.$$click=()=>n.click(),B(f,O(Z,{name:`plus`})),$e(p,`click`,e.onDictate,!0),B(p,O(A,{get when(){return!e.transcribing},get fallback(){return nu()},get children(){return O(Z,{get name(){return e.dictating===!1?`mic`:`stop`}})}})),$e(h,`click`,e.onVoice,!0),B(h,O(Z,{name:`wave`})),B(m,O(fu,{}),null),B(d,O(A,{get when(){return e.view.showStop},get children(){var t=Ql(),n=t.firstChild;return $e(t,`click`,e.onStop,!0),B(t,O(Z,{name:`stop`}),n),S(()=>t.disabled=!e.view.canStop),t}}),g),B(g,O(A,{get when(){return e.view.primary===`send`},get fallback(){return s()},get children(){return[O(Z,{name:`send`}),(()=>{var e=$l();return B(e,s),e})()]}})),B(_,()=>e.metaLeft),v.$$click=()=>e.onModel(`voice`),B(v,()=>e.voiceModel,null),y.$$click=()=>e.onModel(`worker`),B(y,()=>e.workerModel,null),S(t=>{var n=`composer${r()?` dragging`:``}`,i=e.voiceOn?`Voice mode is on — talk, or type here`:e.view.primary===`steer`?`Steer the running session…`:`Reply…`,s=Go.join(`,`),c=a()?`At most ${Ko.maxImages} images per message`:`Attach images (or paste / drop them here)`,d=a()||e.attaching,_=`icon-btn${e.dictating===!1?``:` recording`}`,v=e.dictating===!1?`Dictate`:`Stop dictation`,y=e.voiceBlocked??(e.dictating===!1?`Dictate`:`Stop dictation (${e.dictating}s left)`),b=!!e.voiceBlocked||e.transcribing||e.voiceOn,x=`split${e.voiceOn?` on`:``}`,ee=e.voiceOn,S=e.voiceOn?`End Voice mode`:`Start Voice mode`,C=e.voiceBlocked??(e.voiceOn?`End Voice mode`:`Voice mode: talk hands-free`),w=!!e.voiceBlocked&&!e.voiceOn,te=`btn primary send ${e.view.primary}`,ne=!e.view.canSubmit||e.attaching;return n!==t.e&&R(o,t.e=n),i!==t.t&&L(l,`placeholder`,t.t=i),s!==t.a&&L(u,`accept`,t.a=s),c!==t.o&&L(f,`title`,t.o=c),d!==t.i&&(f.disabled=t.i=d),_!==t.n&&R(p,t.n=_),v!==t.s&&L(p,`aria-label`,t.s=v),y!==t.h&&L(p,`title`,t.h=y),b!==t.r&&(p.disabled=t.r=b),x!==t.d&&R(m,t.d=x),ee!==t.l&&L(h,`aria-pressed`,t.l=ee),S!==t.u&&L(h,`aria-label`,t.u=S),C!==t.c&&L(h,`title`,t.c=C),w!==t.w&&(h.disabled=t.w=w),te!==t.m&&R(g,t.m=te),ne!==t.f&&(g.disabled=t.f=ne),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,r:void 0,d:void 0,l:void 0,u:void 0,c:void 0,w:void 0,m:void 0,f:void 0}),S(()=>l.value=e.draft),o})()}function fu(){let[e,t]=x(!1),[n,r]=x([]),[i,a]=x(0),[o,s]=x(``),c,l,u,[d,f]=x({right:0,bottom:0}),p=async()=>{u?.(),u=void 0;try{u=await ac(tc(),a),s(``)}catch(e){s(e.name===`NotAllowedError`?`Microphone permission was denied.`:`Microphone: ${e.message}`)}},m=async()=>{let e=c.getBoundingClientRect();if(f({right:window.innerWidth-e.right,bottom:window.innerHeight-e.top+6}),t(!0),!navigator.mediaDevices)return s(`This browser cannot use the microphone here (it needs HTTPS).`);r(await ic().catch(()=>[])),p()},h=()=>{t(!1),u?.(),u=void 0,a(0)},g=t=>e()&&!c.contains(t.target)&&!l?.contains(t.target)&&h(),_=t=>e()&&t.key===`Escape`&&h();return document.addEventListener(`mousedown`,g),document.addEventListener(`keydown`,_),oe(()=>{document.removeEventListener(`mousedown`,g),document.removeEventListener(`keydown`,_),h()}),[(()=>{var t=ru();t.$$click=()=>e()?h():void m();var n=c;return typeof n==`function`?z(n,t):c=t,B(t,O(Z,{name:`down`})),S(()=>L(t,`aria-expanded`,e())),t})(),O(A,{get when(){return e()},get children(){return O(vt,{get children(){var e=au(),t=e.firstChild.nextSibling,r=t.firstChild,a=l;return typeof a==`function`?z(a,e):l=e,B(e,O(k,{get each(){return[{deviceId:``,label:`System default`},...n().filter(e=>e.deviceId&&e.deviceId!=="default")]},children:(e,t)=>(()=>{var n=ou(),r=n.firstChild,i=r.nextSibling;return n.$$click=()=>{rc(e.deviceId),p()},B(r,()=>tc()===e.deviceId?`✓`:``),B(i,()=>e.label||`Microphone ${t()}`),S(()=>L(n,`aria-checked`,tc()===e.deviceId)),n})()}),t),B(e,O(A,{get when(){return o()},get children(){var e=iu();return B(e,o),e}}),null),S(n=>{var a=`${d().right}px`,o=`${d().bottom}px`,s=Math.round(i()*100),c=`${Math.round(i()*100)}%`;return a!==n.e&&nt(e,`right`,n.e=a),o!==n.t&&nt(e,`bottom`,n.t=o),s!==n.a&&L(t,`aria-valuenow`,n.a=s),c!==n.o&&nt(r,`width`,n.o=c),n},{e:void 0,t:void 0,a:void 0,o:void 0}),e}})}})]}var pu={starting:`Starting…`,listening:`Listening`,hearing:`Listening`,transcribing:`Thinking`,sent:`Thinking`,speaking:`Speaking`,paused:`Muted`,off:`Off`};function mu(e){let t=()=>e.state===`listening`&&e.working?`Thinking`:pu[e.state],n=[.5,.8,1,.7,.45];return(()=>{var r=lu(),i=r.firstChild,a=i.nextSibling,o=a.nextSibling.nextSibling,s=o.nextSibling,c=s.nextSibling;return B(i,O(k,{each:n,children:t=>(()=>{var n=uu();return S(r=>nt(n,`transform`,`scaleY(${Math.max(.15,Math.min(1,(e.state===`speaking`?.6:e.level)*t*1.6))})`)),n})()})),B(a,t,null),B(a,O(A,{get when(){return e.held},get children(){var t=su(),n=t.firstChild.nextSibling;return n.nextSibling,B(t,()=>e.held,n),t}}),null),$e(o,`click`,e.onModel,!0),B(o,()=>e.model),$e(s,`click`,e.onMute,!0),B(s,O(Z,{get name(){return e.state===`paused`?`muted`:`mic`}})),$e(c,`click`,e.onEnd,!0),B(r,O(A,{get when(){return e.notifyHint},get children(){var t=cu(),n=t.firstChild.nextSibling;return n.$$click=()=>e.onAllowNotifications?.(),t}}),null),S(t=>{var n=`voice-bar ${e.state}`,i=`icon-btn${e.state===`paused`?` on`:``}`,a=e.state===`paused`,o=e.state===`paused`?`Unmute`:`Mute`,c=e.state===`paused`?`Unmute`:`Mute`;return n!==t.e&&R(r,t.e=n),i!==t.t&&R(s,t.t=i),a!==t.a&&L(s,`aria-pressed`,t.a=a),o!==t.o&&L(s,`aria-label`,t.o=o),c!==t.i&&L(s,`title`,t.i=c),t},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),r})()}I([`input`,`keydown`,`click`]);var hu=e=>String(e??``).normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).toLowerCase();function gu(e){let t=e,n=Array.isArray(e)?e:Array.isArray(t?.models)?t.models:[],r=new Set,i=[];for(let e of n){let t=e,n=typeof e==`string`?e.trim():typeof t?.id==`string`?t.id.trim():``;if(!n||r.has(n))continue;r.add(n);let a=typeof t?.name==`string`?t.name.trim():``;i.push(a&&a!==n?{id:n,name:a}:{id:n})}return i}function _u(e){let t=e?.note;return!Array.isArray(e)&&typeof t==`string`&&t.trim()?t.trim():void 0}var vu=e=>e.includes(`/`)?e.slice(0,e.lastIndexOf(`/`)):``;function yu(e,t,{current:n=``,limit:r=200,grouped:i=!1}={}){let a=String(t??``).trim(),o=hu(a),s=o.split(/\s+/).filter(Boolean),c=[...e??[]],l=String(n??``).trim();l&&!c.some(e=>e.id===l)&&c.unshift({id:l,custom:!0});let u=[];if(c.forEach((e,t)=>{let n=hu(e.id),r=`${n} ${hu(e.name)}`;if(!s.every(e=>r.includes(e)))return;let i=o?n===o?0:n.startsWith(o)?1:2:e.id===l?0:1;u.push({option:e,rank:i,index:t})}),u.sort((e,t)=>e.rank-t.rank||e.index-t.index),i){let e=new Map;for(let t of u)e.has(vu(t.option.id))||e.set(vu(t.option.id),e.size);u.sort((t,n)=>e.get(vu(t.option.id))-e.get(vu(n.option.id)))}let d=u.slice(0,r).map(({option:e})=>({id:e.id,...e.name?{name:e.name}:{},...l&&e.id===l?{current:!0}:{},...e.custom?{custom:!0}:{}})),f=c.some(e=>e.id===a);return{items:d,total:u.length,more:Math.max(0,u.length-r),...a&&!f?{custom:a}:{}}}function bu(e,t,n){return n?t===`home`?0:t===`end`?n-1:e<0?t>0?0:n-1:((e+t)%n+n)%n:-1}var xu=()=>({query:``,active:0}),Su=e=>[void 0,...(e.variants??[]).filter(e=>e!=="default")];function Cu(e,t,n=100){if(t.chosen)return{mode:`variants`,model:t.chosen,rows:Su(t.chosen)};let r=e.groups(t.query).flatMap(e=>e.items.map(t=>({...t,group:e.providerID})));return{mode:`models`,rows:r.slice(0,n),total:r.length,more:Math.max(0,r.length-n)}}var wu=(e,t)=>({...e,query:t,active:0}),Tu=(e,t)=>({providerID:e.providerID,modelID:e.modelID,...t?{variant:t}:{}});function Eu(e,t,n){let r=Cu(e,t);if(r.mode===`variants`)return n<0||n>=r.rows.length?{state:t}:{state:t,pick:Tu(r.model,r.rows[n])};let i=r.rows[n];return i?Su(i).length>1?{state:{...t,chosen:i,active:0}}:{state:t,pick:Tu(i)}:{state:t}}function Du(e,t,n,{inSearch:r}){let i=Cu(e,t).rows.length;if(n===`ArrowDown`||n===`ArrowUp`)return{state:{...t,active:Math.max(0,bu(t.active,n===`ArrowDown`?1:-1,i))},handled:!0};if(n===`Enter`)return{...Eu(e,t,t.active),handled:!0};if(n===`Backspace`&&t.chosen&&!r)return{state:{...t,chosen:void 0,active:0},handled:!0};if(/^[1-9]$/.test(n)&&!r){let r=Number(n)-1;return r>=i?{state:t,handled:!1}:{...Eu(e,t,r),handled:!0}}return{state:t,handled:!1}}var Ou=(e,t)=>({[e]:t}),ku=F(`<div>`),Au=F(`<p class="error small"role=alert>Couldn't load models: `),ju=F(`<p class="muted small">Loading models…`),Mu=F(`<input type=search class=picker-search placeholder="Search models"aria-label="Search models"autofocus>`),Nu=F(`<p class="muted small"role=status>`),Pu=F(`<ul class=picker-list role=listbox aria-label=Models>`),Fu=F(`<li class="muted small">No models match.`),Iu=F(`<div class="picker-group muted small">`),Lu=F(`<span class="po-id muted">variants ›`),Ru=F(`<span class=po-mark>✓`),zu=F(`<kbd>`),Bu=F(`<li><button type=button role=option><span class=po-name></span><span class="po-id muted">`),Vu=F(`<div class=stack><div class=row><button type=button class="btn small"aria-label="Back to models">‹ Back</button><p class="muted small">Variant of </p></div><ul class=picker-list role=listbox aria-label=Variants>`),Hu=F(`<li><button type=button role=option><span class=po-name></span><kbd>`);function Uu(e,t){let n=e?.prefs[t]??e?.defaults[t];return n?`${n.modelID}${n.variant?` · ${n.variant}`:``}`:`default`}function Wu(e){let[t,n]=x(),[r,i]=x(``),[a,o]=x();return{prefs:t,error:r,load:async()=>{try{n(await U(`${W(e())}/model-prefs`)),i(``)}catch(e){i(G(e))}},loadCatalog:async()=>{if(a())return a();let{models:t}=await U(`${W(e())}/models`),n=new Bl(t);return o(n),n},save:async(t,r)=>{try{n(await(await H(`${W(e())}/model-prefs`,{method:`PUT`,json:Ou(t,r)})).json()),q(`${t===`voice`?`Voice`:`Worker`} model applies to the next ${t===`voice`?`turn`:`task`}.`)}catch(e){q(`Couldn't set the ${t===`voice`?`Voice`:`Worker`} model: ${G(e)}`,`err`)}}}}function Gu(e){let[t,n]=x(xu()),[r,i]=x(),[a,o]=x(``),s=()=>e.kind!==void 0,c=()=>e.kind?e.models.prefs()?.prefs[e.kind]??e.models.prefs()?.defaults[e.kind]:void 0,l=e=>c()?.providerID===e.providerID&&c()?.modelID===e.modelID,u=()=>{n(xu()),o(``),e.models.loadCatalog().then(i,e=>o(G(e)))},d=w(()=>r()?Cu(r(),t()):void 0),f=t=>{if(n(t.state),!t.pick||!e.kind)return;let r=e.kind;e.onClose(),e.models.save(r,t.pick)},p=e=>r()&&f(Eu(r(),t(),e)),m=e=>{if(!r()||e.altKey||e.ctrlKey||e.metaKey)return;let n=Du(r(),t(),e.key,{inSearch:e.target instanceof HTMLInputElement});if(!n.handled)return;e.preventDefault(),f(n);let i=e.currentTarget;queueMicrotask(()=>i.querySelector(`.picker-opt.active`)?.scrollIntoView({block:`nearest`}))};return C(ie(s,e=>e&&u())),O(ba,{get open(){return s()},get title(){return`${e.kind===`voice`?`Voice`:`Worker`} model`},get onClose(){return e.onClose},class:`picker`,get children(){var e=ku();return e.$$keydown=m,B(e,O(A,{get when(){return!a()},get fallback(){return(()=>{var e=Au();return e.firstChild,B(e,a,null),e})()},get children(){return O(A,{get when(){return d()},get fallback(){return ju()},children:e=>O(A,{get when(){return N(()=>e().mode===`models`)()&&e()},get fallback(){return O(Ku,{get view(){return e()},get active(){return t().active},get current(){return c()},onPick:p,onBack:()=>n(e=>({...e,chosen:void 0,active:0}))})},children:e=>[(()=>{var e=Mu();return e.$$input=e=>n(t=>wu(t,e.currentTarget.value)),S(()=>e.value=t().query),e})(),(()=>{var t=Nu();return B(t,(()=>{var t=N(()=>e().total===1);return()=>t()?`1 model`:`${e().total} models`})(),null),B(t,(()=>{var t=N(()=>!!e().more);return()=>t()?` · showing ${e().rows.length}, search to narrow`:``})(),null),t})(),(()=>{var n=Pu();return B(n,O(k,{get each(){return e().rows},get fallback(){return Fu()},children:(n,r)=>(()=>{var i=Bu(),a=i.firstChild,o=a.firstChild,s=o.nextSibling;return B(i,O(A,{get when(){return r()===0||e().rows[r()-1].group!==n.group},get children(){var e=Iu();return B(e,()=>n.group),e}}),a),a.$$click=()=>p(r()),B(o,()=>n.name||n.modelID),B(s,()=>n.modelID),B(a,O(A,{get when(){return(n.variants??[]).some(e=>e!=="default")},get children(){return Lu()}}),null),B(a,O(A,{get when(){return l(n)},get children(){return Ru()}}),null),B(a,O(A,{get when(){return r()<9},get children(){var e=zu();return B(e,()=>r()+1),e}}),null),S(e=>{var i=`picker-opt${t().active===r()?` active`:``}`,o=l(n);return i!==e.e&&R(a,e.e=i),o!==e.t&&L(a,`aria-selected`,e.t=o),e},{e:void 0,t:void 0}),i})()})),n})()]})})}})),e}})}function Ku(e){let t;ae(()=>t?.focus());let n=()=>e.current?.providerID===e.view.model.providerID&&e.current?.modelID===e.view.model.modelID;return(()=>{var r=Vu(),i=r.firstChild,a=i.firstChild,o=a.nextSibling;o.firstChild;var s=i.nextSibling;return $e(a,`click`,e.onBack,!0),B(o,()=>e.view.model.name||e.view.model.modelID,null),B(s,O(k,{get each(){return e.view.rows},children:(r,i)=>(()=>{var a=Hu(),o=a.firstChild,s=o.firstChild,c=s.nextSibling;return o.$$click=()=>e.onPick(i()),z(e=>i()===0&&(t=e),o),B(s,r??`Default`),B(o,O(A,{get when(){return N(()=>!!n())()&&e.current?.variant===r},get children(){return Ru()}}),c),B(c,()=>i()+1),S(t=>{var a=`picker-opt${e.active===i()?` active`:``}`,s=n()&&e.current?.variant===r;return a!==t.e&&R(o,t.e=a),s!==t.t&&L(o,`aria-selected`,t.t=s),t},{e:void 0,t:void 0}),a})()})),r})()}I([`keydown`,`input`,`click`]);var qu=/^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/;function Ju(e){let t=[],n=0,r=0,i=!1;for(let a of String(e??``).replace(/\r\n?/g,`
5
+ `).split(`
6
+ `)){let e=qu.exec(a);if(e)n=Number(e[1]),r=Number(e[2]),i=!0,t.push({type:`hunk`,text:a});else if(!i||a.startsWith(`\\`))a&&t.push({type:`meta`,text:a});else if(a.startsWith(`+`))t.push({type:`add`,text:a.slice(1),newNo:r++});else if(a.startsWith(`-`))t.push({type:`del`,text:a.slice(1),oldNo:n++});else if(a.startsWith(` `)||a===``){if(a===``&&t.length&&t[t.length-1].type!==`context`)continue;t.push({type:`context`,text:a.slice(1),oldNo:n++,newNo:r++})}else i=!1,t.push({type:`meta`,text:a})}return t}var Yu=F(`<section><h3><button type=button class=card-toggle><span>`),Xu=F(`<ul class=mcp-list>`),Zu=F(`<aside class=rail aria-label="Session details"><div class=rail-head><span class=rail-title>Details`),Qu=F(`<p class="muted small">Not reported by any connected machine.`),$u=F(`<dl class=kv><dt>Machine</dt><dd><span aria-hidden=true></span> <span class=muted>· </span></dd><dt>Project</dt><dd class=mono></dd><dt>Branch</dt><dd class=mono></dd><dt>Open in</dt><dd>`),ed=F(`<span class=muted>`),td=F(`<p class="muted small">`),nd=F(`<div class=meter role=meter aria-valuemin=0 aria-valuemax=100 aria-label="Context used"><span>`),rd=F(`<p class=small><strong></strong><span class=muted> `),id=F(`<li><span aria-hidden=true></span><span class=mcp-name></span><span class="muted small">`),ad=F(`<span class=diffstat><span class=add>+</span> <span class=del>−`),od=F(`<ul class=file-list>`),sd=F(`<p class="muted small">No changes.`),cd=F(`<li><button type=button class=file><span></span><span class=file-name></span><span class="diffstat small"><span class=add>+</span> <span class=del>−`),ld=F(`<p class="muted small more-files">+<!> more <!> (only the most-changed files are listed)`),ud=F(`<table class=diff><tbody>`),dd=F(`<p class="muted small pad">The diff is too large to show completely (512 KB).`),fd=F(`<section class=diff-panel><header class=diff-head><select aria-label="Changed file"></select><label class="small muted wrap-toggle"><input type=checkbox> Wrap</label></header><div>`),pd=F(`<option>`),md=F(`<p class="muted small pad">Loading diff…`),hd=F(`<p class="muted small pad">`),gd=F(`<p class="muted small pad">No textual changes (binary file, or a rename).`),_d=F(`<tr><td class=ln></td><td class=ln></td><td class=code-line><span class=sign>`),vd=e=>e.truncated&&e.totalFiles?Math.max(0,e.totalFiles-e.files.length):0,[yd,bd]=x(nl(localStorage));function xd(e){let t=()=>!yd().has(e.id);return(()=>{var n=Yu(),r=n.firstChild,i=r.firstChild,a=i.firstChild;return i.$$click=()=>bd(rl(localStorage,e.id)),B(i,O(Z,{name:`chevron`,class:`card-chevron`}),a),B(a,()=>e.title),B(r,()=>e.extra,null),B(n,O(A,{get when(){return t()},get children(){return e.children}}),null),S(r=>{var a=`rail-card${t()?``:` collapsed`}`,o=e.label??e.title,s=e.domID,c=e.id,l=t();return a!==r.e&&R(n,r.e=a),o!==r.t&&L(n,`aria-label`,r.t=o),s!==r.a&&L(n,`id`,r.a=s),c!==r.o&&L(n,`data-card`,r.o=c),l!==r.i&&L(i,`aria-expanded`,r.i=l),r},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0}),n})()}var Sd=e=>e>=1e3?`${(e/1e3).toFixed(e>=1e5?0:1)}k`:String(e);function Cd(e){let t=()=>e.found?.session,n=()=>t()?.open?t()?.terminal?.source===`herdr`?`herdr`:`tui`:`background`,r=()=>{let t=e.summary?.mcp;return t?.length?`Connectors · ${t.filter(e=>e.status===`connected`).length} connected`:`Connectors`};return(()=>{var i=Zu(),a=i.firstChild;return a.firstChild,B(a,O(va,{icon:`close`,label:`Close details`,get onClick(){return e.onClose}}),null),B(i,O(xd,{id:`environment`,title:`Environment`,get children(){return O(A,{get when(){return e.found},get fallback(){return Qu()},children:r=>(()=>{var i=$u(),a=i.firstChild.nextSibling,o=a.firstChild,s=o.nextSibling,c=s.nextSibling;c.firstChild;var l=a.nextSibling.nextSibling,u=l.nextSibling.nextSibling,d=u.nextSibling.nextSibling;return B(a,()=>r().machine.name,s),B(c,(()=>{var e=N(()=>J.connection!==`live`);return()=>e()?`Connecting`:r().machine.online?`online`:`offline`})(),null),B(l,()=>Ta(e.summary?.directory??r().session.directory)),B(u,()=>e.summary?.branch??(()=>{var t=ed();return B(t,()=>e.loading?`…`:`—`),t})()),B(d,()=>Da[n()],null),B(d,(()=>{var e=N(()=>!!t()?.terminal?.workspace);return()=>e()?` · ${t().terminal.workspace}`:``})(),null),S(t=>{var n=`online-dot${r().machine.online&&J.connection===`live`?` on`:``}`,i=e.summary?.directory??r().session.directory;return n!==t.e&&R(o,t.e=n),i!==t.t&&L(l,`title`,t.t=i),t},{e:void 0,t:void 0}),i})()})}}),null),B(i,O(xd,{id:`context`,title:`Context`,get children(){return O(A,{get when(){return e.summary?.context},get fallback(){return(()=>{var t=td();return B(t,()=>e.loading?`Loading…`:`No usage reported yet.`),t})()},children:e=>[(()=>{var t=nd(),n=t.firstChild;return S(r=>{var i=e().percent??0,a=`${e().percent??0}%`,o=(e().percent??0)>80?`hot`:``;return i!==r.e&&L(t,`aria-valuenow`,r.e=i),a!==r.t&&nt(n,`width`,r.t=a),o!==r.a&&R(n,r.a=o),r},{e:void 0,t:void 0,a:void 0}),t})(),(()=>{var t=rd(),n=t.firstChild,r=n.nextSibling;return r.firstChild,B(n,(()=>{var t=N(()=>e().percent!==void 0);return()=>t()?`${e().percent}%`:Sd(e().used)})()),B(r,(()=>{var t=N(()=>!!e().limit);return()=>t()?`${Sd(e().used)} / ${Sd(e().limit)} tokens`:`tokens`})(),null),B(r,(()=>{var t=N(()=>!!e().model);return()=>t()?` · ${e().model}`:``})(),null),t})()]})}}),null),B(i,O(xd,{id:`mcp`,get title(){return r()},label:`MCP servers`,get children(){return O(A,{get when(){return e.summary?.mcp?.length},get fallback(){return(()=>{var t=td();return B(t,()=>e.loading?`Loading…`:`No MCP servers.`),t})()},get children(){var t=Xu();return B(t,O(k,{get each(){return e.summary.mcp},children:e=>(()=>{var t=id(),n=t.firstChild,r=n.nextSibling,i=r.nextSibling;return B(r,()=>e.name),B(i,()=>e.status.replace(`_`,` `)),S(r=>{var i=e.error??e.status,a=`mcp-dot ${e.status}`;return i!==r.e&&L(t,`title`,r.e=i),a!==r.t&&R(n,r.t=a),r},{e:void 0,t:void 0}),t})()})),t}})}}),null),B(i,O(xd,{id:`changes`,title:`Changes`,domID:`rail-changes`,get extra(){return O(A,{get when(){return e.summary?.changes},children:e=>(()=>{var t=ad(),n=t.firstChild;n.firstChild;var r=n.nextSibling.nextSibling;return r.firstChild,B(n,()=>e().additions,null),B(r,()=>e().deletions,null),t})()})},get children(){return O(A,{get when(){return e.summary?.changes},get fallback(){return(()=>{var t=td();return B(t,(()=>{var t=N(()=>!!e.loading);return()=>t()?`Loading…`:e.summaryError||`No working-tree changes reported (not a git repository, or OpenCode is still warming up).`})()),t})()},children:t=>O(A,{get when(){return t().files.length},get fallback(){return sd()},get children(){return[(()=>{var n=od();return B(n,O(k,{get each(){return t().files},children:t=>(()=>{var n=cd(),r=n.firstChild,i=r.firstChild,a=i.nextSibling,o=a.nextSibling.firstChild;o.firstChild;var s=o.nextSibling.nextSibling;return s.firstChild,r.$$click=()=>e.onFile(t.file),B(i,()=>t.status[0].toUpperCase()),B(a,()=>t.file),B(o,()=>t.additions,null),B(s,()=>t.deletions,null),S(e=>{var n=t.file,a=`file-status ${t.status}`;return n!==e.e&&L(r,`title`,e.e=n),a!==e.t&&R(i,e.t=a),e},{e:void 0,t:void 0}),n})()})),n})(),O(A,{get when(){return vd(t())},children:e=>(()=>{var t=ld(),n=t.firstChild.nextSibling,r=n.nextSibling.nextSibling;return r.nextSibling,B(t,e,n),B(t,()=>e()===1?`file`:`files`,r),t})()})]}})})}}),null),i})()}function wd(e){let[t]=ne(()=>e.file,async t=>U(`${W(e.sessionID)}/diff?file=${Wt(t)}`)),[n,r]=x(!1);return(()=>{var i=fd(),a=i.firstChild,o=a.firstChild,s=o.nextSibling,c=s.firstChild,l=a.nextSibling;return B(a,O(Z,{name:`diff`}),o),o.addEventListener(`change`,t=>e.onFile(t.currentTarget.value)),B(o,O(k,{get each(){return e.files},children:e=>(()=>{var t=pd();return t.value=e,B(t,e),t})()})),B(a,O(A,{get when(){return t()},children:e=>(()=>{var t=ad(),n=t.firstChild;n.firstChild;var r=n.nextSibling.nextSibling;return r.firstChild,B(n,()=>e().additions,null),B(r,()=>e().deletions,null),t})()}),s),c.addEventListener(`change`,e=>r(e.currentTarget.checked)),B(a,O(va,{icon:`close`,label:`Close diff`,get onClick(){return e.onClose}}),null),B(l,O(A,{get when(){return!t.loading},get fallback(){return md()},get children(){return O(A,{get when(){return!t.error},get fallback(){return(()=>{var e=hd();return B(e,(()=>{var e=N(()=>t.error?.message===`No changes for that file`);return()=>e()?`This file has no changes any more.`:`Could not load the diff: ${t.error?.message}`})()),e})()},get children(){return O(A,{get when(){return t()?.patch},get fallback(){return gd()},get children(){return[(()=>{var e=ud(),n=e.firstChild;return B(n,O(k,{get each(){return Ju(t().patch).filter(e=>e.type!==`meta`)},children:e=>(()=>{var t=_d(),n=t.firstChild,r=n.nextSibling,i=r.nextSibling,a=i.firstChild;return B(n,()=>e.oldNo??``),B(r,()=>e.newNo??``),B(a,(()=>{var t=N(()=>e.type===`add`);return()=>t()?`+`:e.type===`del`?`−`:` `})()),B(i,()=>e.text,null),S(()=>R(t,e.type)),t})()})),e})(),O(A,{get when(){return t().truncated},get children(){return dd()}})]}})}})}})),S(t=>{var r=`Changes in ${e.file}`,a=`diff-body${n()?` wrap`:``}`;return r!==t.e&&L(i,`aria-label`,t.e=r),a!==t.t&&R(l,t.t=a),t},{e:void 0,t:void 0}),S(()=>o.value=e.file),S(()=>c.checked=n()),i})()}I([`click`]);var Td=F(`<div role=status><a class=voice-pill-link title="Go to the session in Voice mode">Voice: <strong></strong></a><button type=button class="btn small end"aria-label="End Voice mode">End`);function Ed(){let e=()=>vc().sessionID??``;return(()=>{var t=Td(),n=t.firstChild,r=n.firstChild.nextSibling,i=n.nextSibling;return B(t,O(Z,{name:`wave`}),n),B(r,yc),i.$$click=()=>void $.end(),S(r=>{var i=`voice-pill ${vc().voice}`,a=`Voice mode is on in ${yc()}`,o=ii(e());return i!==r.e&&R(t,r.e=i),a!==r.t&&L(t,`aria-label`,r.t=a),o!==r.a&&L(n,`href`,r.a=o),r},{e:void 0,t:void 0,a:void 0}),t})()}I([`click`]);function Dd(e){let t={};for(let n of e)n.type!==`external`&&(n.type===`boolean`?t[n.key]=n.default===!0:n.type===`multiselect`?t[n.key]=Array.isArray(n.default)?[...n.default]:[]:t[n.key]=n.default===void 0||Array.isArray(n.default)?``:String(n.default));return t}function Od(e,t){return e&&(e.type===`number`||e.type===`integer`)&&typeof t==`string`&&t.trim()?Number(t):typeof t==`string`?t.trim():t}function kd(e,t){let n=new Map(e.map(e=>[e.key,e]));return e.filter(e=>(e.when??[]).every(e=>{let r=Od(n.get(e.key),t[e.key])===e.value;return e.op===`eq`?r:!r}))}var Ad=e=>typeof e==`string`?e.trim():``;function jd(e,t){let n={};for(let r of kd(e,t)){let e=Md(r,t[r.key]);e&&(n[r.key]=e)}return n}function Md(e,t){switch(e.type){case`external`:return;case`boolean`:return;case`multiselect`:{let n=Array.isArray(t)?t:[];return e.minItems!==void 0&&n.length<e.minItems?`Choose at least ${e.minItems}`:e.required&&!n.length?`Required`:e.maxItems!==void 0&&n.length>e.maxItems?`Choose at most ${e.maxItems}`:void 0}case`number`:case`integer`:{let n=Ad(t);if(!n)return e.required?`Required`:void 0;let r=Number(n);return Number.isFinite(r)?e.type===`integer`&&!Number.isInteger(r)?`Enter a whole number`:e.minimum!==void 0&&r<e.minimum?`At least ${e.minimum}`:e.maximum!==void 0&&r>e.maximum?`At most ${e.maximum}`:void 0:`Enter a number`}case`string`:{let n=Ad(t);if(!n)return e.required?`Required`:void 0;if(e.options?.length&&!e.custom&&!e.options.some(e=>e.value===n))return`Choose one of the options`;if(e.minLength!==void 0&&n.length<e.minLength)return`At least ${e.minLength} characters`;if(e.maxLength!==void 0&&n.length>e.maxLength)return`At most ${e.maxLength} characters`;if(e.pattern)try{if(!new RegExp(e.pattern).test(n))return`Doesn't match the expected format`}catch{}return}}}function Nd(e,t){let n={};for(let r of kd(e,t)){let e=t[r.key];if(r.type!==`external`){if(r.type===`boolean`)n[r.key]=e===!0;else if(r.type===`multiselect`)n[r.key]=Array.isArray(e)?[...e]:[];else{let t=Ad(e);if(!t)continue;n[r.key]=r.type===`number`||r.type===`integer`?Number(t):t}}}return n}var Pd=F(`<p class="blocker-text mono">`),Fd=F(`<p class=blocker-text>`),Id=F(`<div role=group><p class=blocker-head><strong>`),Ld=F(`<p class="muted small">This question has nothing to fill in here; answer it in the terminal.`),Rd=F(`<div class=row><button type=button class="btn small primary">Allow once</button><button type=button class="btn small">Always allow</button><button type=button class="btn small danger">Deny`),zd=F(`<form class=form-card novalidate><fieldset><div class=row><button type=submit class="btn small primary"></button><button type=button class="btn small">Dismiss`),Bd=F(`<p class="field-error small"role=alert>`),Vd=F(`<div>`),Hd=F(`<span class=field-title>`),Ud=F(`<span class="field-desc muted small">`),Wd=F(`<a class="btn small"target=_blank rel="noopener noreferrer">Open link`),Gd=F(`<label class=check><input type=checkbox>`),Kd=F(`<input type=text placeholder="Other (comma separated)">`),qd=F(`<div role=group class=choice-group>`),Jd=F(`<input type=text placeholder="Type your own answer">`),Yd=F(`<div role=radiogroup class=choice-group>`),Xd=F(`<label class=text-field>`),Zd=F(`<input type=text>`),Qd=F(`<span class="muted small"> — `),$d=F(`<label class=choice><input type=checkbox><span>`),ef=F(`<label class=choice><input type=radio><span>`);function tf(e,t){return!(e instanceof Vt)||e.status!==409||e.code!==`gone`?!1:(q(`Already answered or expired`),t(),!0)}function nf(e){let[t,n]=x(!1),r=()=>e.blocker,i=()=>r().sessionID&&r().sessionID!==e.rootID?` (${r().sessionTitle||`subagent`})`:``,a=()=>r().kind===`permission`?`Permission request`:`Question`;return O(A,{get when(){return!t()},get children(){var t=Id(),o=t.firstChild,s=o.firstChild;return B(s,(()=>{var e=N(()=>r().kind===`permission`);return()=>e()?`Permission`:r().question?`Question`:`Form`})()),B(o,i,null),B(t,O(j,{get fallback(){return Ld()},get children(){return[O(M,{get when(){return r().kind===`permission`},get children(){return[(()=>{var e=Pd();return B(e,()=>r().summary),e})(),O(rf,{get sessionID(){return e.sessionID},get blocker(){return r()},onGone:()=>n(!0)})]}}),O(M,{get when(){return N(()=>r().kind===`form`)()&&r().fields?.length},get children(){return[O(A,{get when(){return!r().question||r().summary!==`Questions`},get children(){var e=Fd();return B(e,()=>r().summary),e}}),O(af,{get sessionID(){return e.sessionID},get blocker(){return r()},get fields(){return r().fields},onGone:()=>n(!0)})]}})]}}),null),S(e=>{var n=`card blocker ${r().kind}`,i=`${a()}: ${r().summary}`;return n!==e.e&&R(t,e.e=n),i!==e.t&&L(t,`aria-label`,e.t=i),e},{e:void 0,t:void 0}),t}})}function rf(e){let[t,n]=x(!1),r=async t=>{n(!0);try{await H(`${W(e.sessionID)}/permission`,{method:`POST`,json:{requestID:e.blocker.id,decision:t}}),q(t===`reject`?`Denied`:`Allowed`)}catch(t){tf(t,e.onGone)||q(G(t),`err`),n(!1)}};return(()=>{var e=Rd(),n=e.firstChild,i=n.nextSibling,a=i.nextSibling;return n.$$click=()=>void r(`once`),i.$$click=()=>void r(`always`),a.$$click=()=>void r(`reject`),S(e=>{var r=t(),o=t(),s=t();return r!==e.e&&(n.disabled=e.e=r),o!==e.t&&(i.disabled=e.t=o),s!==e.a&&(a.disabled=e.a=s),e},{e:void 0,t:void 0,a:void 0}),e})()}function af(e){let[t,n]=x(Dd(e.fields)),[r,i]=x({}),[a,o]=x(!1),[s,c]=x(!1),l=w(()=>kd(e.fields,t())),u=(e,t)=>{n(n=>({...n,[e]:t})),r()[e]&&i(t=>Object.fromEntries(Object.entries(t).filter(([t])=>t!==e)))},d=async(t,n)=>{o(!0);try{await H(`${W(e.sessionID)}/form`,{method:`POST`,json:{formID:e.blocker.id,...t}}),c(!0),q(n)}catch(t){tf(t,e.onGone)||q(G(t),`err`),o(!1)}},f=n=>{n.preventDefault();let r=jd(e.fields,t());i(r),!Object.keys(r).length&&d({answer:Nd(e.fields,t())},`Answer sent`)},p=()=>a()||s();return(()=>{var n=zd(),i=n.firstChild,a=i.firstChild,o=a.firstChild,c=o.nextSibling;return n.addEventListener(`submit`,f),B(i,O(k,{get each(){return l()},children:n=>(()=>{var i=Vd();return B(i,O(of,{field:n,get value(){return t()[n.key]},onChange:e=>u(n.key,e),get formID(){return e.blocker.id}}),null),B(i,O(A,{get when(){return r()[n.key]},get children(){var e=Bd();return B(e,()=>r()[n.key]),e}}),null),S(e=>{var t=`form-field ${n.type}`,r=n.key;return t!==e.e&&R(i,e.e=t),r!==e.t&&L(i,`data-key`,e.t=r),e},{e:void 0,t:void 0}),i})()}),a),B(o,()=>s()?`Sent`:`Submit`),c.$$click=()=>void d({cancel:!0},`Dismissed`),S(()=>i.disabled=p()),n})()}function of(e){let t=()=>e.field,n=()=>`f-${e.formID}-${t().key}`,r=()=>t().title||t().key,i=()=>typeof e.value==`string`?e.value:``,a=()=>Array.isArray(e.value)?e.value:[],o=()=>new Set((t().options??[]).map(e=>e.value)),s=()=>[(()=>{var e=Hd();return B(e,r,null),B(e,()=>t().required?` *`:``,null),e})(),O(A,{get when(){return t().description},get children(){var e=Ud();return B(e,()=>t().description),e}})];return O(j,{get children(){return[O(M,{get when(){return t().type===`external`},get children(){return[O(s,{}),(()=>{var e=Wd();return S(()=>L(e,`href`,t().url)),e})()]}}),O(M,{get when(){return t().type===`boolean`},get children(){var t=Gd(),n=t.firstChild;return n.addEventListener(`change`,t=>e.onChange(t.currentTarget.checked)),B(t,O(s,{}),null),S(()=>n.checked=e.value===!0),t}}),O(M,{get when(){return t().type===`multiselect`},get children(){var n=qd();return B(n,O(s,{}),null),B(n,O(k,{get each(){return t().options??[]},children:t=>(()=>{var n=$d(),r=n.firstChild,i=r.nextSibling;return r.addEventListener(`change`,n=>e.onChange(n.currentTarget.checked?[...a(),t.value]:a().filter(e=>e!==t.value))),B(i,()=>t.label),B(n,O(A,{get when(){return t.description},get children(){var e=Qd();return e.firstChild,B(e,()=>t.description,null),e}}),null),S(()=>r.checked=a().includes(t.value)),n})()}),null),B(n,O(A,{get when(){return t().custom},get children(){var t=Kd();return t.addEventListener(`change`,t=>e.onChange([...a().filter(e=>o().has(e)),...t.currentTarget.value.split(`,`).map(e=>e.trim()).filter(Boolean)])),S(()=>L(t,`aria-label`,`${r()}: other`)),S(()=>t.value=a().filter(e=>!o().has(e)).join(`, `)),t}}),null),S(()=>L(n,`aria-label`,r())),n}}),O(M,{get when(){return N(()=>t().type===`string`)()&&t().options?.length},get children(){var a=Yd();return B(a,O(s,{}),null),B(a,O(k,{get each(){return t().options??[]},children:t=>(()=>{var r=ef(),a=r.firstChild,o=a.nextSibling;return a.addEventListener(`change`,()=>e.onChange(t.value)),B(o,()=>t.label),B(r,O(A,{get when(){return t.description},get children(){var e=Qd();return e.firstChild,B(e,()=>t.description,null),e}}),null),S(()=>L(a,`name`,n())),S(()=>a.checked=i()===t.value),r})()}),null),B(a,O(A,{get when(){return t().custom},get children(){var t=Jd();return t.$$input=t=>e.onChange(t.currentTarget.value),S(()=>L(t,`aria-label`,`${r()}: your own answer`)),S(()=>t.value=o().has(i())?``:i()),t}}),null),S(()=>L(a,`aria-label`,r())),a}}),O(M,{when:!0,get children(){return[(()=>{var e=Xd();return B(e,O(s,{})),S(()=>L(e,`for`,n())),e})(),(()=>{var r=Zd();return r.$$input=t=>e.onChange(t.currentTarget.value),S(e=>{var i=n(),a=t().type===`number`||t().type===`integer`?`decimal`:void 0,o=t().placeholder??``;return i!==e.e&&L(r,`id`,e.e=i),a!==e.t&&L(r,`inputmode`,e.t=a),o!==e.a&&L(r,`placeholder`,e.a=o),e},{e:void 0,t:void 0,a:void 0}),S(()=>r.value=i()),r})()]}})]}})}I([`click`,`input`]);var sf=/^\s{0,3}(```+|~~~+)\s*([\w+-]*)/,cf=/^\s{0,3}(#{1,6})\s+(.*?)\s*#*\s*$/,lf=/^\s{0,3}[-*+]\s+(.*)$/,uf=/^\s{0,3}(\d{1,9})[.)]\s+(.*)$/,df=/^\s{0,3}([-*_])(\s*\1){2,}\s*$/,ff=/^\s{0,3}>\s?(.*)$/;function pf(e){let t=String(e??``).replace(/\r\n?/g,`
7
+ `).split(`
8
+ `),n=[],r=[],i=()=>{r.length&&n.push({type:`paragraph`,text:r.join(`
9
+ `)}),r=[]};for(let e=0;e<t.length;e++){let a=t[e],o=sf.exec(a);if(o){i();let r=o[1],a=[];for(e++;e<t.length&&!t[e].trim().startsWith(r);)a.push(t[e++]);n.push({type:`code`,lang:o[2]??``,text:a.join(`
10
+ `)});continue}if(!a.trim()){i();continue}let s=cf.exec(a);if(s){i(),n.push({type:`heading`,level:s[1].length,text:s[2]});continue}if(df.test(a)){i(),n.push({type:`rule`});continue}let c=ff.exec(a);if(c){i();let r=[c[1]];for(;e+1<t.length&&ff.test(t[e+1]);)r.push(ff.exec(t[++e])[1]);n.push({type:`quote`,text:r.join(`
11
+ `)});continue}let l=lf.exec(a),u=uf.exec(a);if(l||u){i();let r=!l,a=[l?l[1]:u[2]];for(;e+1<t.length;){let n=t[e+1],i=r?uf.exec(n):lf.exec(n);if(i)a.push(r?i[2]:i[1]),e++;else if(n.trim()&&/^\s{2,}\S/.test(n))a[a.length-1]+=`\n${n.trim()}`,e++;else break}n.push({type:`list`,ordered:r,...r?{start:Number(u[1])}:{},items:a})}else r.push(a)}return i(),n}function mf(e){let t=e.trim();if(!/[\\\s\u0000-\u001f\u007f-\u009f]/.test(t)&&(/^(https?:|mailto:)/i.test(t)||t.startsWith(`/`)&&!t.startsWith(`//`)))return t}function hf(e){let t=[],n=``,r=e=>{n&&t.push({type:`text`,text:n}),n=``,t.push(e)},i=String(e??``),a=0;for(;a<i.length;){let e=i[a];if(e==="`"){let e=i.indexOf("`",a+1);if(e>a){r({type:`code`,text:i.slice(a+1,e)}),a=e+1;continue}}if((e===`*`||e===`_`)&&i[a+1]===e){let t=i.indexOf(e+e,a+2);if(t>a+2){r({type:`strong`,children:hf(i.slice(a+2,t))}),a=t+2;continue}}if((e===`*`||e===`_`)&&i[a+1]!==e&&i[a+1]!==` `&&(e===`*`||a===0||!/\w/.test(i[a-1]))){let t=i.indexOf(e,a+1);if(t>a+1&&i[t-1]!==` `){r({type:`em`,children:hf(i.slice(a+1,t))}),a=t+1;continue}}if(e===`[`){let e=i.indexOf(`](`,a+1),o=e>0?gf(i,e+2):-1;if(e>a&&o>e){let s=hf(i.slice(a+1,e)),c=mf(i.slice(e+2,o));c?r({type:`link`,href:c,children:s}):(n&&t.push({type:`text`,text:n}),n=``,t.push(...s)),a=o+1;continue}}n+=e,a++}return n&&t.push({type:`text`,text:n}),t}function gf(e,t){let n=0;for(let r=t;r<e.length;r++)if(e[r]===`(`)n++;else if(e[r]===`)`){if(n===0)return r;n--}else if(e[r]===`
12
+ `)return-1;return-1}var _f=F(`<code>`),vf=F(`<strong>`),yf=F(`<em>`),bf=F(`<a rel="noopener noreferrer">`),xf=F(`<div class=md>`),Sf=F(`<hr>`),Cf=F(`<p>`),wf=F(`<li>`),Tf=F(`<pre class=code><code>`),Ef=F(`<blockquote>`);function Df(e){return O(k,{get each(){return e.nodes},children:e=>O(j,{get children(){return[O(M,{get when(){return e.type===`text`&&e},children:e=>N(()=>e().text)}),O(M,{get when(){return e.type===`code`&&e},children:e=>(()=>{var t=_f();return B(t,()=>e().text),t})()}),O(M,{get when(){return e.type===`strong`&&e},children:e=>(()=>{var t=vf();return B(t,O(Df,{get nodes(){return e().children}})),t})()}),O(M,{get when(){return e.type===`em`&&e},children:e=>(()=>{var t=yf();return B(t,O(Df,{get nodes(){return e().children}})),t})()}),O(M,{get when(){return e.type===`link`&&e},children:e=>(()=>{var t=bf();return B(t,O(Df,{get nodes(){return e().children}})),S(n=>{var r=e().href,i=e().href.startsWith(`/`)?void 0:`_blank`;return r!==n.e&&L(t,`href`,n.e=r),i!==n.t&&L(t,`target`,n.t=i),n},{e:void 0,t:void 0}),t})()})]}})})}var Of=e=>hf(e);function kf(e){let t=w(()=>pf(e.text));return(()=>{var e=xf();return B(e,O(k,{get each(){return t()},children:e=>O(j,{get children(){return[O(M,{get when(){return e.type===`paragraph`&&e},children:e=>(()=>{var t=Cf();return B(t,O(Df,{get nodes(){return Of(e().text)}})),t})()}),O(M,{get when(){return e.type===`heading`&&e},children:e=>O(bt,{get component(){return`h${Math.min(6,e().level+2)}`},get children(){return O(Df,{get nodes(){return Of(e().text)}})}})}),O(M,{get when(){return e.type===`list`&&e},children:e=>O(bt,{get component(){return e().ordered?`ol`:`ul`},get start(){return N(()=>!!e().ordered)()?e().start:void 0},get children(){return O(k,{get each(){return e().items},children:e=>(()=>{var t=wf();return B(t,O(Df,{get nodes(){return Of(e)}})),t})()})}})}),O(M,{get when(){return e.type===`code`&&e},children:e=>(()=>{var t=Tf(),n=t.firstChild;return B(n,()=>e().text),S(()=>L(t,`data-lang`,e().lang||void 0)),t})()}),O(M,{get when(){return e.type===`quote`&&e},children:e=>(()=>{var t=Ef();return B(t,O(Df,{get nodes(){return Of(e().text)}})),t})()}),O(M,{get when(){return e.type===`rule`},get children(){return Sf()}})]}})})),e})()}var Af=F(`<a class=msg-image target=_blank rel=noopener><img loading=lazy>`,!0,!1,!1),jf=F(`<span class=file-chip> `),Mf=F(`<div class=transcript aria-label=Conversation>`),Nf=F(`<div class=msg-images>`),Pf=F(`<div class=pill>`),Ff=F(`<div class="msg user"><div class=user-body>`),If=F(`<span>`),Lf=F(`<div>`),Rf=F(`<a><span class=sub-mark aria-hidden=true></span><span class=sub-label>Subagent · <strong></strong></span><span class="sub-state muted">`),zf=F(`<span class=spinner>`),Bf=F(`<span class="spinner small">`),Vf=F(`<div class="fold thought"><button type=button class=fold-head><span>`),Hf=F(`<ul class="fold-body tool-list">`),Uf=F(`<div><button type=button class=fold-head><span>`),Wf=F(`<pre class=code>`),Gf=F(`<div class=tool-detail>`),Kf=F(`<li><button type=button class=tool-head><span class=tool-mark></span><span class=tool-name></span><span class="tool-summary muted"></span><span class="tool-time muted">`),qf=F(`<span class="muted small">Loading full details…`),Jf=F(`<span class="error small">`),Yf={pending:[`…`,`Sending`],sent:[`✓`,`Sent`],heard:[`✓✓`,`Heard by the agent`],failed:[`!`,`Not sent`]};function Xf(e){let[t,n]=x(!1);return O(A,{get when(){return N(()=>!!e.image.src)()&&!t()},get fallback(){return(()=>{var t=jf(),n=t.firstChild;return B(t,O(Z,{name:`file`}),n),B(t,()=>e.image.name,null),S(()=>L(t,`title`,e.image.mime)),t})()},get children(){var t=Af(),r=t.firstChild;return r.addEventListener(`error`,()=>n(!0)),S(n=>{var i=e.image.src,a=e.image.name,o=e.image.src,s=e.image.name;return i!==n.e&&L(t,`href`,n.e=i),a!==n.t&&L(t,`title`,n.t=a),o!==n.a&&L(r,`src`,n.a=o),s!==n.o&&L(r,`alt`,n.o=s),n},{e:void 0,t:void 0,a:void 0,o:void 0}),t}})}function Zf(e){return(()=>{var t=Mf();return B(t,O(k,{get each(){return e.blocks},children:t=>O(j,{get children(){return[O(M,{get when(){return t.type===`user`&&t},children:t=>(()=>{var n=Ff(),r=n.firstChild;return B(r,O(A,{get when(){return t().images?.length},get children(){var e=Nf();return B(e,O(k,{get each(){return t().images},children:e=>O(Xf,{image:e})})),e}}),null),B(r,O(A,{get when(){return t().text},get children(){var e=Pf();return B(e,()=>t().text),e}}),null),B(n,O(A,{get when(){return e.ticks[t().key]},children:e=>(()=>{var t=If();return B(t,()=>Yf[e()][0]),S(n=>{var r=`tick ${e()}`,i=Yf[e()][1],a=Yf[e()][1];return r!==n.e&&R(t,n.e=r),i!==n.t&&L(t,`aria-label`,n.t=i),a!==n.a&&L(t,`title`,n.a=a),n},{e:void 0,t:void 0,a:void 0}),t})()}),null),S(()=>L(n,`data-key`,t().key)),n})()}),O(M,{get when(){return t.type===`assistant`&&t},children:e=>(()=>{var t=Lf();return B(t,O(kf,{get text(){return e().text}})),S(n=>{var r=`msg assistant${e().live?` live`:``}`,i=e().key;return r!==n.e&&R(t,n.e=r),i!==n.t&&L(t,`data-key`,n.t=i),n},{e:void 0,t:void 0}),t})()}),O(M,{get when(){return t.type===`thought`&&t},children:t=>O(Qf,{get block(){return t()},get expanded(){return e.expanded},get onToggle(){return e.onToggle}})}),O(M,{get when(){return t.type===`tools`&&t},children:t=>O($f,{get block(){return t()},get sessionID(){return e.sessionID},get onDetail(){return e.onDetail},get expanded(){return e.expanded},get onToggle(){return e.onToggle}})}),O(M,{get when(){return t.type===`subagent`&&t},children:e=>(()=>{var t=Rf(),n=t.firstChild,r=n.nextSibling,i=r.firstChild.nextSibling,a=r.nextSibling;return B(n,(()=>{var t=N(()=>e().state===`working`);return()=>t()?zf():`◆`})()),B(i,()=>e().label),B(a,()=>e().state),B(t,O(Z,{name:`chevron`,class:`chev`}),null),S(n=>{var r=`subagent ${e().state}`,i=ii(e().sessionID);return r!==n.e&&R(t,n.e=r),i!==n.t&&L(t,`href`,n.t=i),n},{e:void 0,t:void 0}),t})()})]}})})),t})()}function Qf(e){let t=()=>!!e.expanded[e.block.key],n=t=>e.onToggle(e.block.key,t),r=()=>ql(e.block);return(()=>{var i=Vf(),a=i.firstChild,o=a.firstChild;return a.$$click=()=>n(!t()),B(a,O(A,{get when(){return e.block.running},get children(){return Bf()}}),o),B(o,()=>r().label),B(a,O(Z,{name:`chevron`,class:`chev`}),null),B(i,O(A,{get when(){return t()},get children(){var e=Lf();return B(e,()=>r().body),S(()=>R(e,`fold-body reasoning${r().muted?` hidden-reasoning`:``}`)),e}}),null),S(()=>L(a,`aria-expanded`,t())),i})()}function $f(e){let t=()=>!!e.expanded[e.block.key],n=t=>e.onToggle(e.block.key,t),r=()=>e.block.items.length,i=()=>{let t=e.block;return t.running?`Using ${r()===1?t.items[0].name??`a tool`:`${r()} tools`}…`:`Used ${r()} tool${r()===1?``:`s`}${t.failed?` (${t.failed} failed)`:``}`};return(()=>{var r=Uf(),a=r.firstChild,o=a.firstChild;return a.$$click=()=>n(!t()),B(a,O(A,{get when(){return e.block.running},get children(){return Bf()}}),o),B(o,i),B(a,O(Z,{name:`chevron`,class:`chev`}),null),B(r,O(A,{get when(){return t()},get children(){var t=Hf();return B(t,O(k,{get each(){return e.block.items},children:t=>O(ep,{row:t,get sessionID(){return e.sessionID},get onDetail(){return e.onDetail},get expanded(){return e.expanded},get onToggle(){return e.onToggle}})})),t}}),null),S(n=>{var i=`fold tools${e.block.failed?` has-failed`:``}`,o=t();return i!==n.e&&R(r,n.e=i),o!==n.t&&L(a,`aria-expanded`,n.t=o),n},{e:void 0,t:void 0}),r})()}function ep(e){let t=()=>!!e.expanded[`tool:${e.row.key}`],n=t=>e.onToggle(`tool:${e.row.key}`,t),[r,i]=x(!1),[a,o]=x(``),s=()=>e.row,c=()=>s().completed&&s().at?Er(s().completed-s().at):``,l=async()=>{let r=!t();if(n(r),r&&s().detail===void 0&&s().messageID&&s().partID!==void 0){i(!0),o(``);try{let t=await U(`${W(e.sessionID)}/timeline/messages/${Wt(s().messageID)}/parts/${Wt(String(s().partID))}`);e.onDetail(s().key,t.detail)}catch(e){o(G(e))}finally{i(!1)}}},u=()=>typeof s().summary==`string`?s().summary:``;return(()=>{var e=Kf(),n=e.firstChild,i=n.firstChild,o=i.nextSibling,d=o.nextSibling,f=d.nextSibling;return n.$$click=l,B(i,(()=>{var e=N(()=>s().state===`running`);return()=>e()?Bf():s().state===`failed`?`✕`:`✓`})()),B(o,()=>s().name??`tool`),B(d,u),B(f,c),B(e,O(A,{get when(){return t()},get children(){var e=Gf();return B(e,O(A,{get when(){return!r()},get fallback(){return qf()},get children(){return O(A,{get when(){return!a()},get fallback(){return(()=>{var e=Jf();return B(e,a),e})()},get children(){var e=Wf();return B(e,()=>JSON.stringify(s().detail??{summary:u()||void 0,error:s().error},null,2)),e}})}})),e}}),null),S(r=>{var a=`tool ${s().state??``}`,o=t(),c=s().state??``;return a!==r.e&&R(e,r.e=a),o!==r.t&&L(n,`aria-expanded`,r.t=o),c!==r.a&&L(i,`aria-label`,r.a=c),r},{e:void 0,t:void 0,a:void 0}),e})()}I([`click`]);var tp=F(`<button type=button class="btn small changes"aria-label="Show changes"><span class=add>+</span> <span class=del>−`),np=F(`<div class="banner warn">No connected OpenCode process reports this session. It is read-only until its machine reconnects.`),rp=F(`<p class="working-line muted"role=status><span class="spinner small"></span> `),ip=F(`<p class="idle-line muted small"> · last activity `),ap=F(`<button type=button class="btn primary tap-to-start">Tap to start Voice mode`),op=F(`<p class="note err voice-error"role=alert>Voice mode: `),sp=F(`<div class=sheet-backdrop>`),cp=F(`<div><div class=session-main><header class=topbar><div class=topbar-title></div></header><div class=scroller><div class=column></div></div><div class=dock><div class=column>`),lp=F(`<a class="crumb muted"> <span class=crumb-sep aria-hidden=true>/`),up=F(`<h1 class=title>`),dp=F(`<span class=chip-server><span aria-hidden=true>`),fp=F(`<p class="muted pad">Loading conversation…`),pp=F(`<p class="muted pad empty-session">No messages yet. Type below, or start Voice mode.`),mp=F(`<p>`),hp=F(`<div class=empty><p class=display>Session not found</p><p class=muted>It may belong to another account, or it no longer exists.</p><a class="btn primary"href=/>Back to sessions`),gp=3e4,_p=2e3,vp;function yp(e){let t=e.id,n=()=>Ti(t),r=()=>wi().find(e=>e.id===t),i=()=>n()?.session.status,a=()=>Yr(l()?i()?.filter(e=>u().has(e.id)):i()),o=()=>!n(),s=()=>n()?.session.exposed!==!1,c=()=>typeof n()?.session.rootID==`string`?n().session.rootID:t,l=()=>c()!==t,u=w(()=>Jr(i(),t)),d=(e,t)=>e===c()&&(!l()||typeof t==`string`&&u().has(t)),f=()=>{let e=n()?.session.parentID;if(typeof e==`string`&&e)return{id:e,title:i()?.find(t=>t.id===e)?.title||Ti(e)?.session.title||`Parent session`}},p=new Hl,[m,h]=x(0),g=()=>h(e=>e+1),[_,v]=x(!1),[y,b]=x(!1),[ee,te]=x([]),[ne,E]=x({}),se=0,ce=(e,t=``)=>te(n=>[...n.slice(-20),{key:`n${++se}`,text:e,kind:t}]),le=new Map,ue=w(()=>{m(),p.status(i(),t);let e=new Map,n=Gl(p.rows()).map(t=>{let n=JSON.stringify(t),r=le.get(t.key),i=r&&r.json===n?r:{json:n,block:t};return e.set(t.key,i),i.block});return le=e,n}),[de,fe]=un({}),pe,me=!0,he=()=>requestAnimationFrame(()=>pe&&(pe.scrollTop=pe.scrollHeight));C(ie(ue,()=>me&&he()));async function ge(){try{let e,n=0;do{let r=await U(`${W(t)}/timeline?limit=200${e?`&cursor=${encodeURIComponent(e)}`:``}`);p.load(r.items),e=r.cursor,n++}while(e&&n<10);v(!0),g(),he()}catch(e){e instanceof Vt&&e.status===404&&!n()?b(!0):ce(e instanceof Vt&&e.status===409?`No OpenCode process for this session is connected; history is unavailable until it reconnects.`:`Could not load the conversation: ${G(e)}`,`err`),v(!0)}}async function _e(){try{let e=await U(W(t)),n=di.feed(c());n.load(e.activity??[]),e.status&&n.status(e.status)}catch{}}let ve=T(()=>i()),ye=Ci(e=>{let n=typeof e.rootID==`string`?e.rootID:e.sessionID;if(e.type===`activity`&&d(n,e.sessionID)&&e.item&&e.item.kind!==`thinking`){let t=e.item;p.upsert({key:`activity:${e.sessionID}:${t.id}`,sessionID:e.sessionID,kind:`tool`,...t.tool?{name:t.tool}:{},...t.summary?{summary:t.summary}:{},...t.error?{error:t.error}:{},state:t.state,at:p.get(`activity:${e.sessionID}:${t.id}`)?.at??t.at}),g()}else if(e.type===`reasoning`&&d(n,e.sessionID)&&typeof e.messageID==`string`&&typeof e.delta==`string`)p.appendReasoning({sessionID:e.sessionID,messageID:e.messageID,delta:e.delta}),g();else if(e.type===`delta`&&d(n,e.sessionID)&&typeof e.messageID==`string`&&typeof e.text==`string`){let t=`${e.messageID}:text`;p.upsert({key:t,messageID:e.messageID,sessionID:e.sessionID,kind:`assistant`,text:`${p.get(t)?.text??``}${e.text}`,live:!0,at:p.get(t)?.at??Date.now()}),p.endReasoning(e.sessionID),g()}else if(e.type===`status`&&e.sessionID===c()){for(let n of Rs(ve,e.sessions,t))ce(n,`sys`);if(ve=e.sessions,!Yr(e.sessions)){for(let e of p.rows())e.live&&p.upsert({key:e.key,live:!1});p.endReasoning(void 0)}g(),Ne()}}),D;C(ie(()=>n()?.session.updated,()=>{clearTimeout(D),D=setTimeout(()=>document.visibilityState===`visible`&&void Ii(t),400)}));let be=(e,n=!1)=>H(`${W(t)}/presence`,{method:`POST`,json:{visible:e},keepalive:n}).catch(()=>{}),xe=()=>{be(document.visibilityState===`visible`,document.visibilityState!==`visible`),document.visibilityState===`visible`&&Ii(t)},Se,[Ce,we]=x(),[Te,Ee]=x(``),[De,Oe]=x(!0),ke=0,Ae,je=0;async function Me(){ke=Date.now();try{let e=await U(`${W(t)}/summary`);we(e),Ee(``),(!e.branch||!e.changes)&&je<2&&(je++,clearTimeout(Ae),Ae=setTimeout(Me,4e3))}catch(e){Ee(e instanceof Vt&&e.status===409?`The machine is disconnected.`:`Could not load details: ${G(e)}`)}finally{Oe(!1)}}function Ne(){clearTimeout(Ae),Ae=setTimeout(Me,Math.max(0,_p-(Date.now()-ke)))}let[Pe,Fe]=x(),Ie=Wu(()=>t),[Le,Re]=x(),[ze,Be]=x({...rs(),draft:bc.get(t)}),j=e=>{Be(t=>is(t,e)),bc.set(t,ze().draft)};oe(bc.subscribe(e=>{e===t&&bc.get(t)!==ze().draft&&Be(e=>is(e,{type:`input`,text:bc.get(t)}))}));let M=()=>as(ze(),{running:a(),offline:o()}),Ve=0,[He,Ue]=x(!1),We=Promise.resolve();function Ge(e){We=We.then(async()=>{Ue(!0);try{for(let t of e)try{j({type:`attach`,image:await ol(t,ze().images)})}catch(e){j({type:`attachError`,message:G(e)})}}finally{Ue(!1)}})}async function Ke(){let e=ze().draft.trim(),n=ze().images;if(!e&&!n.length)return;if(Xe()&&!n.length){j({type:`input`,text:``}),$.sendTyped(t,e);return}let r=++Ve,i=`local:${r}`,a=Date.now();re(()=>{j({type:`submit`,id:r}),p.upsert({key:i,kind:`user`,text:e,at:a,...n.length?{images:n.map(({name:e,mime:t,preview:n})=>({name:e,mime:t,preview:n}))}:{}}),E(e=>({...e,[i]:`pending`})),g()}),me=!0,he();try{let o={text:e,...n.length?{images:n.map(({mime:e,data:t,name:n})=>({mime:e,data:t,name:n}))}:{}},s=await H(`${W(t)}/turn`,{method:`POST`,json:o}),c=await s.json().catch(()=>({}));if(j({type:`accepted`,id:r}),E(e=>({...e,[i]:s.status===202?`sent`:`heard`})),s.status===202)q(`Steered the running session`);else{let e=p.rows().some(e=>e.kind===`assistant`&&(e.at??0)>=a&&e.text);c.reply&&!e&&p.upsert({key:`reply:${r}`,kind:`assistant`,text:c.reply,at:Date.now()}),c.outcome===`timeout`?ce(`The agent is still working; the reply may be partial.`,`sys`):c.outcome&&c.outcome!==`succeeded`&&ce(`Turn ${c.outcome}${c.message?`: ${c.message}`:``}`,`err`),g()}}catch(e){let t=e instanceof Vt&&e.status===504?`OpenCode did not answer in time. The session may still be working.`:G(e);re(()=>{j({type:`rejected`,id:r,message:t}),p.upsert({key:i,kind:`user`,text:``,images:[]}),g()})}}async function qe(){j({type:`stop`});try{let{stopped:e}=await(await H(`${W(t)}/stop`,{method:`POST`,json:{}})).json(),n=Array.isArray(e)?e.length:0;q(n?`Stopped ${n} session${n===1?``:`s`}`:`Nothing was running`)}catch(e){q(`Could not stop: ${G(e)}`,`err`)}finally{j({type:`stopped`})}}let Je=()=>wc(t),Ye=()=>xc.toggle(t),P=vc,Xe=()=>P().phase!==`off`&&P().sessionID===t,F=()=>P().phase!==`off`&&P().sessionID!==void 0&&P().sessionID!==t,I=()=>P().error?.sessionID===t&&!P().error.gesture?P().error.message:void 0,Ze=()=>P().error?.sessionID===t&&P().error.gesture===!0,Qe=()=>Vr(vi()??void 0,X()?.publicURL)?.micBlocked?`Set up speech in Settings to use the microphone`:void 0;oe($.attach(t,{user:e=>{let t=`voice:${++se}`;return p.upsert({key:t,kind:`user`,text:e,at:Date.now()}),E(e=>({...e,[t]:`pending`})),g(),t},tick:(e,t)=>E(n=>({...n,[e]:t})),agent:e=>{let t=e.messageID?`${e.messageID}:text`:`say:${++se}`,{mode:n,text:r}=Ls(p.get(t)?.text??``,e.text);n!==`keep`&&(p.upsert({key:t,messageID:e.messageID,kind:`assistant`,text:r,at:p.get(t)?.at??Date.now()}),g())},note:(e,t)=>ce(e,t??`sys`)}));async function $e(){Xe()||(ec(),xc.cancel()),await $.toggle(t),$.isOn(t)&&$.state.phase===`on`&&ce(`Voice mode on${$.state.agent?` (${$.state.agent} agent)`:``}. Speak naturally; say “stop” to interrupt, “pause listening” to end.`,`sys`)}let et=us(location.href);et.voice&&(vp=t,ri(et.path,{replace:!0})),C(()=>{vp===t&&n()&&!Qe()&&(vp=void 0,Xe()||$e())}),ae(()=>{let e=hl(t);e&&(re(()=>{j({type:`input`,text:e.text});for(let t of e.images)j({type:`attach`,image:t})}),Ke()),ge(),_e(),Me(),Ie.load(),Ii(t),be(document.visibilityState===`visible`),Se=setInterval(()=>document.visibilityState===`visible`&&void be(!0),gp),document.addEventListener(`visibilitychange`,xe)});let tt=()=>void be(!1,!0);window.addEventListener(`pagehide`,tt),oe(()=>{ye(),clearInterval(Se),clearTimeout(Ae),clearTimeout(D),document.removeEventListener(`visibilitychange`,xe),window.removeEventListener(`pagehide`,tt),tt()});let nt=!1;C(()=>{n()?nt=!0:nt&&J.machines&&(q(`That session is gone (deleted, or its machine was revoked).`,`warn`),ri(`/`,{replace:!0}))});let rt=()=>Sn(n()?.session).filter(e=>!l()||e.sessionID!==void 0&&u().has(e.sessionID)),it=()=>(mi(),Ca(),di.has(c())?di.feed(c()).pulse():void 0),[at,ot]=x(Date.now()),st=setInterval(()=>ot(Date.now()),1e3);oe(()=>clearInterval(st));let ct=()=>{if(l()){let e=i()?.find(e=>e.id===t);return e?.state===`working`?(at(),`Working${e.since?` · ${Er(Date.now()-e.since)}`:``}`):void 0}let e=it();if(a()&&e?.busy)return at(),`${e.label}${e.since?` · ${Er(Date.now()-e.since)}`:``}`},lt=()=>{let e=n()?.session;if(!e)return`Not connected`;let t=rt().length;return`${Xe()&&P().agent?`${P().agent} agent`:e.conversation?`Voice agent`:`Session agent`} · ${t?`${t} request${t===1?``:`s`} waiting`:s()?`Voice on`:`Voice off`}`},ut=()=>Ce()?.changes?.files.map(e=>e.file)??[];return(()=>{var e=cp(),i=e.firstChild,s=i.firstChild,c=s.firstChild,l=s.nextSibling,u=l.firstChild,d=l.nextSibling.firstChild;B(s,O(A,{get when(){return To()},get children(){return O(va,{icon:`menu`,label:`Open sidebar`,onClick:Io})}}),c),B(c,O(A,{get when(){return f()},children:e=>(()=>{var t=lp(),n=t.firstChild,r=n.nextSibling;return B(t,O(Z,{name:`chevron`,class:`crumb-chev`}),n),B(t,()=>e().title,r),S(n=>{var r=ii(e().id),i=`Back to ${e().title}`,a=`Back to ${e().title}`;return r!==n.e&&L(t,`href`,n.e=r),i!==n.t&&L(t,`title`,n.t=i),a!==n.a&&L(t,`aria-label`,n.a=a),n},{e:void 0,t:void 0,a:void 0}),t})()}),null),B(c,O(A,{get when(){return r()},get fallback(){return(()=>{var e=up();return B(e,()=>n()?.session.title||(J.machines?`Session`:`Loading…`)),e})()},children:e=>[O(_a,{get state(){return e().state}}),(()=>{var t=up();return B(t,()=>e().title),S(()=>L(t,`title`,e().title)),t})(),O(ya,{label:`Session actions`,class:`icon-btn small`,items:()=>xo(e(),{open:!1})})]}),null),B(s,O(A,{get when(){return n()},children:e=>(()=>{var t=dp(),n=t.firstChild;return B(t,()=>e().machine.name,null),B(t,O(A,{get when(){return Ce()?.branch},get children(){return[O(Z,{name:`branch`}),N(()=>Ce().branch)]}}),null),S(r=>{var i=`${e().machine.name}${Ce()?.branch?` · ${Ce().branch}`:``} · ${e().session.directory}`,a=`online-dot${e().machine.online?` on`:``}`;return i!==r.e&&L(t,`title`,r.e=i),a!==r.t&&R(n,r.t=a),r},{e:void 0,t:void 0}),t})()}),null),B(s,O(A,{get when(){return Ce()?.changes?.files.length},get children(){var e=tp(),t=e.firstChild;t.firstChild;var n=t.nextSibling.nextSibling;return n.firstChild,e.$$click=()=>Fe(ut()[0]),B(t,()=>Ce().changes.additions,null),B(n,()=>Ce().changes.deletions,null),e}}),null),B(s,O(A,{get when(){return F()},get children(){return O(Ed,{})}}),null),B(s,O(va,{icon:`rail`,get label(){return Mo()?`Hide details`:`Show details`},get"aria-pressed"(){return Mo()},onClick:()=>Fo(!Mo())}),null),B(i,O(A,{get when(){return N(()=>!!o())()&&J.machines},get children(){return np()}}),l),l.addEventListener(`scroll`,e=>me=e.currentTarget.scrollHeight-e.currentTarget.scrollTop-e.currentTarget.clientHeight<80);var m=pe;return typeof m==`function`?z(m,l):pe=l,B(u,O(A,{get when(){return!y()},get fallback(){return O(bp,{})},get children(){return[O(A,{get when(){return _()},get fallback(){return fp()},get children(){return O(A,{get when(){return ue().length||ee().length},get fallback(){return pp()},get children(){return O(Zf,{sessionID:t,get blocks(){return ue()},get ticks(){return ne()},expanded:de,onToggle:(e,t)=>fe(e,t),onDetail:(e,t)=>{p.detail(e,t),g()}})}})}}),O(k,{get each(){return ee()},children:e=>(()=>{var t=mp();return B(t,()=>e.text),S(n=>{var r=`note ${e.kind}`,i=e.kind===`err`?`alert`:void 0;return r!==n.e&&R(t,n.e=r),i!==n.t&&L(t,`role`,n.t=i),n},{e:void 0,t:void 0}),t})()}),O(k,{get each(){return rt()},children:e=>O(nf,{sessionID:t,blocker:e,rootID:t})}),O(A,{get when(){return ct()},get children(){var e=rp();return e.firstChild.nextSibling,B(e,ct,null),e}}),O(A,{get when(){return N(()=>!(a()||!n()))()&&r()},get children(){var e=ip(),t=e.firstChild;return B(e,()=>ha[r().state],t),B(e,()=>wa(r().updated,Ca()),null),e}})]}})),B(d,O(A,{get when(){return Xe()},get children(){return O(mu,{get state(){return P().voice},get level(){return P().level},get held(){return P().held},get working(){return a()},get model(){return Uu(Ie.prefs(),`voice`)},onMute:()=>$.mute(),onEnd:()=>void $.end(),onModel:()=>Re(`voice`),get notifyHint(){return gc()},onAllowNotifications:()=>void _c()})}}),null),B(d,O(A,{get when(){return Ze()},get children(){var e=ap();return e.$$click=()=>void $e(),e}}),null),B(d,O(A,{get when(){return I()},get children(){var e=op();return e.firstChild,B(e,I,null),e}}),null),B(d,O(du,{get draft(){return ze().draft},get images(){return ze().images},get attaching(){return He()},get view(){return M()},get error(){return ze().error},get voiceOn(){return Xe()},get voiceBlocked(){return Qe()},get dictating(){return Je().recording},get transcribing(){return Je().transcribing},get metaLeft(){return lt()},get voiceModel(){return N(()=>!!Ie.error())()?`unavailable`:Uu(Ie.prefs(),`voice`)},get workerModel(){return N(()=>!!Ie.error())()?`unavailable`:Uu(Ie.prefs(),`worker`)},onInput:e=>j({type:`input`,text:e}),onAttach:Ge,onDetach:e=>{let t=ze().images.find(t=>t.id===e);t?.preview.startsWith(`blob:`)&&URL.revokeObjectURL(t.preview),j({type:`detach`,id:e})},onSubmit:()=>void Ke(),onStop:()=>void qe(),onDictate:()=>void Ye(),onVoice:()=>void $e(),onModel:e=>Re(e)}),null),B(i,O(A,{get when(){return Pe()},get children(){return O(wd,{sessionID:t,get file(){return Pe()},get files(){return N(()=>!!ut().length)()?ut():[Pe()]},onFile:Fe,onClose:()=>Fe(void 0)})}}),null),B(e,O(A,{get when(){return Mo()},get children(){return[O(A,{get when(){return To()},get children(){var e=sp();return e.$$click=()=>Fo(!1),e}}),O(Cd,{get found(){return n()},get summary(){return Ce()},get summaryError(){return Te()},get loading(){return De()},onFile:e=>Fe(e),onClose:()=>Fo(!1)})]}}),null),B(e,O(Gu,{get kind(){return Le()},models:Ie,onClose:()=>Re(void 0)}),null),S(()=>R(e,`session-layout${Mo()?` with-rail`:``}`)),e})()}function bp(){return hp()}I([`click`]);var xp=F(`<input type=search class=picker-search autofocus>`),Sp=F(`<button type=button class="btn small">Retry`),Cp=F(`<p class="muted small"role=status>`),wp=F(`<p class="muted small picker-note">`),Tp=F(`<li><button type=button><span class=po-name>Use “<!>”</span><span class="po-id muted">as a custom `),Ep=F(`<ul class=picker-list role=listbox>`),Dp=F(`<div class="picker-group muted small">`),Op=F(`<span class="po-id muted">`),kp=F(`<span class=po-mark>✓ Current`),Ap=F(`<li><button type=button><span class=po-name>`);function jp(e){let[t,n]=x(``),[r,i]=x(),[a,o]=x(``),[s,c]=x(``),[l,u]=x(0),d=()=>{let t=e.request;t&&(i(void 0),o(``),c(``),t.load().then(e=>{if(Array.isArray(e))return i(e);c(e.note??``),i(e.options)},e=>o(G(e))))};C(ie(()=>e.request,e=>{e&&(n(``),u(0),d())}));let f=w(()=>yu(r()??[],t(),{current:e.request?.current,grouped:e.request?.grouped})),p=()=>[...f().items.map(e=>e.id),...f().custom?[f().custom]:[]],m=t=>{let n=e.request;e.onClose(),n?.onPick(t)},h=()=>e.request?.noun??`option`;return O(ba,{get open(){return!!e.request},get title(){return e.request?.title??``},get onClose(){return e.onClose},class:`picker`,get children(){return[(()=>{var e=xp();return e.$$keydown=e=>{let t={ArrowDown:1,ArrowUp:-1};if(e.key in t)e.preventDefault(),u(bu(l(),t[e.key],p().length));else if(e.key===`Enter`){e.preventDefault();let t=p()[l()];t&&m(t)}},e.$$input=e=>{n(e.currentTarget.value),u(0)},S(t=>{var n=`Search or type a ${h()}`,r=`Search ${h()}s`;return n!==t.e&&L(e,`placeholder`,t.e=n),r!==t.t&&L(e,`aria-label`,t.t=r),t},{e:void 0,t:void 0}),S(()=>e.value=t()),e})(),(()=>{var e=Cp();return B(e,(()=>{var e=N(()=>!!a());return()=>e()?`Couldn't load the ${h()} list: ${a()}. Type any ${h()}.`:N(()=>r()===void 0)()?`Loading ${h()}s…`:N(()=>!r().length)()?`No suggestions. Type any ${h()}.`:`${f().total} ${f().total===1?h():`${h()}s`}`})(),null),B(e,O(A,{get when(){return a()},get children(){return[` `,(()=>{var e=Sp();return e.$$click=d,e})()]}}),null),e})(),O(A,{get when(){return s()},get children(){var e=wp();return B(e,s),e}}),(()=>{var t=Ep();return B(t,O(k,{get each(){return f().items},children:(t,n)=>(()=>{var r=Ap(),i=r.firstChild,a=i.firstChild;return B(r,O(A,{get when(){return N(()=>!!e.request?.grouped)()&&(n()===0||vu(f().items[n()-1].id)!==vu(t.id))},get children(){var e=Dp();return B(e,()=>vu(t.id)||`Other`),e}}),i),i.$$click=()=>m(t.id),B(a,()=>t.id),B(i,O(A,{get when(){return t.name},get children(){var e=Op();return B(e,()=>t.name),e}}),null),B(i,O(A,{get when(){return t.current},get children(){return kp()}}),null),S(e=>{var r=`picker-opt${l()===n()?` active`:``}`,a=!!t.current;return r!==e.e&&R(i,e.e=r),a!==e.t&&L(i,`aria-selected`,e.t=a),e},{e:void 0,t:void 0}),r})()}),null),B(t,O(A,{get when(){return f().custom},get children(){var e=Tp(),t=e.firstChild,n=t.firstChild,r=n.firstChild.nextSibling;r.nextSibling;var i=n.nextSibling;return i.firstChild,t.$$click=()=>m(f().custom),B(n,()=>f().custom,r),B(i,h,null),S(()=>R(t,`picker-opt${l()===f().items.length?` active`:``}`)),e}}),null),t})()]}})}I([`input`,`keydown`,`click`]);var Mp=F(`<div class=chips role=group aria-label="Which speech settings"><button type=button class=chip>Yours</button><button type=button class=chip>Server default`),Np=F(`<div class="speech-panel stack">`),Pp=F(`<p class=error>`),Fp=F(`<p class=muted>Loading…`),Ip=F(`<p class="small inherit">`),Lp=F(`<p class="small muted">`),Rp=F(`<p class=field-error>`),zp=F(`<div class=field><label>`),Bp=F(`<input type=text autocomplete=off autocapitalize=off>`),Vp=F(`<div class=row><button type=button class="btn small">Browse…`),Hp=F(`<input type=password autocomplete=new-password placeholder="Paste the new key"aria-label="New API key">`),Up=F(`<div class=row><button type=button class="btn small">Cancel`),Wp=F(`<div class="field key-field"><span class=field-label>API key`),Gp=F(`<p>`),Kp=F(`<button type=button class="btn small">Undo`),qp=F(`<button type=button class="btn small danger">Clear`),Jp=F(`<div class=row><button type=button class="btn small">`),Yp=F(`<fieldset class="card speech-card"><legend>`),Xp=F(`<div class="row reset-row"><span class="small muted grow"></span><button type=button class="btn small">Reset to server default`),Zp=F(`<option>`),Qp=F(`<select>`),$p=F(`<p class="small muted">The server default is used by everyone on this hub for whatever they have not set themselves. Their own keys stay private.`),em=F(`<button type=button class=btn>Preview voice`),tm=F(`<form class=stack novalidate><div class=row><button type=submit class="btn primary">Save</button></div><p role=status>`),nm=F(`<div class=banner><div><strong>Speech is not set up yet</strong><p class=small></p><p class="small muted">OpenRouter covers both directions with one key (openrouter.ai/keys). Or point both at your own OpenAI-compatible servers.`),rm=[[`openrouter`,`OpenRouter`],[`openai-compatible`,`OpenAI-compatible`]],im={settings:`from settings`,config:`from hub.json`,env:`from env`,user:`yours`},am={user:`/api/settings/speech`,default:`/api/settings/speech/default`},om={stt:`Speech-to-text`,tts:`Text-to-speech`};function sm(){let[e,t]=x(`user`),[n,r]=x(!1),[i,a]=x(),[o,s]=x(``),c=async t=>{a(void 0),s(``);try{let n=await U(am[t]);t===`user`&&r(Ot(X(),n).length>1),e()===t&&a(n)}catch(e){s(e instanceof Vt&&e.status===403?t==="default"?`Only admins can change the server default.`:`This account cannot change speech settings.`:e instanceof Vt&&e.status===404?`This hub does not support speech settings.`:`Could not load speech settings: ${G(e)}`)}};ae(()=>void c(`user`));let l=n=>{n!==e()&&(t(n),c(n))};return(()=>{var t=Np();return B(t,O(A,{get when(){return n()},get children(){var t=Mp(),n=t.firstChild,r=n.nextSibling;return n.$$click=()=>l(`user`),r.$$click=()=>l(`default`),S(t=>{var i=e()===`user`,a=e()==="default";return i!==t.e&&L(n,`aria-pressed`,t.e=i),a!==t.t&&L(r,`aria-pressed`,t.t=a),t},{e:void 0,t:void 0}),t}}),null),B(t,O(A,{get when(){return!o()},get fallback(){return(()=>{var e=Pp();return B(e,o),e})()},get children(){return O(A,{get when(){return i()},get fallback(){return Fp()},keyed:!0,children:t=>O(cm,{settings:t,get scope(){return e()},onSaved:e=>a(e)})})}}),null),t})()}function cm(e){let[t,n]=un(Ir(e.settings)),[r,i]=x({}),[a,o]=x({text:``,kind:``}),[s,c]=x(!1),[l,u]=x(),d=()=>e.scope===`user`?Nt(e.settings):void 0,f=()=>e.scope===`user`?Vr(e.settings.ready,X()?.publicURL):void 0,p=()=>Object.keys(Lr(e.settings,Zt(t))).length>0,m={},h=e=>(m[e]??=U(`/api/settings/speech/models?kind=${e}`).then(e=>({options:gu(e),note:_u(e)})),m[e].catch(()=>delete m[e]),m[e]),g=(e,t,n,i,a)=>{let o=()=>d()?.[e]?.[t];return(()=>{var s=zp(),c=s.firstChild;return L(c,`for`,`sp-${e}-${t}`),B(c,n),B(s,i,null),B(s,O(A,{get when(){return o()?.inherited},get children(){var e=Ip();return B(e,()=>o().note),e}}),null),B(s,O(A,{when:a,get children(){var e=Lp();return B(e,a),e}}),null),B(s,O(A,{get when(){return r()[`${e}.${t}`]},get children(){var n=Rp();return B(n,()=>r()[`${e}.${t}`]),n}}),null),s})()},_=(e,i,a={})=>(()=>{var o=Bp();return L(o,`id`,`sp-${e}-${i}`),L(o,`spellcheck`,!1),rt(o,Re(a,{get value(){return t[e][i]},get"aria-invalid"(){return!!r()[`${e}.${i}`]},onInput:t=>n(e,i,t.currentTarget.value)}),!1,!1),o})(),v=(e,r,i,a,o)=>(()=>{var s=Vp(),c=s.firstChild;return B(s,()=>_(e,r,{placeholder:`Choose or type a ${a}`}),c),c.$$click=()=>u({title:i,noun:a,current:t[e][r]??``,load:o,grouped:r===`model`,onPick:t=>n(e,r,t)}),s})(),y=i=>{let a=e.settings[i].apiKey??{set:!1,source:`none`},o=()=>d()?.[i].apiKey,s=()=>t[i].apiKey,c=()=>d()?!o()?.inherited&&a.set:a.set&&a.source===`settings`;return(()=>{var e=Wp();return e.firstChild,B(e,O(A,{get when(){return s().action===`set`},get fallback(){return[(()=>{var e=Gp();return B(e,(()=>{var e=N(()=>s().action===`clear`);return()=>e()?`Key will be removed when you save.`:N(()=>!!o()?.inherited)()?o().note:N(()=>!!a.set)()?`Key set${a.last4?` ••••${a.last4}`:``} (${im[a.source]??a.source})`:`No key set`})()),S(()=>R(e,`key-summary${o()?.inherited&&s().action!==`clear`?` inherit`:``}`)),e})(),(()=>{var e=Jp(),t=e.firstChild;return t.$$click=()=>n(i,`apiKey`,{action:`set`,value:``}),B(t,(()=>{var e=N(()=>!!o()?.inherited);return()=>e()?`Use your own key`:a.set?`Replace`:`Add key`})()),B(e,O(A,{get when(){return s().action===`clear`},get children(){var e=Kp();return e.$$click=()=>n(i,`apiKey`,{action:`keep`,value:``}),e}}),null),B(e,O(A,{get when(){return N(()=>s().action!==`clear`)()&&c()},get children(){var e=qp();return e.$$click=()=>n(i,`apiKey`,{action:`clear`,value:``}),e}}),null),e})()]},get children(){return[(()=>{var e=Hp();return e.$$input=e=>n(i,`apiKey`,`value`,e.currentTarget.value),L(e,`id`,`sp-${i}-apiKey`),S(()=>e.value=s().value),e})(),(()=>{var e=Up(),t=e.firstChild;return t.$$click=()=>n(i,`apiKey`,{action:`keep`,value:``}),e})()]}}),null),B(e,O(A,{get when(){return r()[`${i}.apiKey`]},get children(){var e=Rp();return B(e,()=>r()[`${i}.apiKey`]),e}}),null),e})()},b=async t=>{if(confirm(`Reset ${om[t].toLowerCase()} to the server default? Your own ${om[t].toLowerCase()} settings are removed.`))try{let n=await(await H(am.user,{method:`PUT`,json:Pt(t)})).json().catch(()=>({})),r=n?.stt&&n?.tts?n:await U(am.user);yi(r.ready??null),e.onSaved(r),q(`${om[t]} reset to the server default`)}catch(e){q(`Could not reset: ${G(e)}`,`err`)}},ee=r=>(()=>{var i=Yp(),a=i.firstChild;return B(a,()=>om[r]),B(i,O(A,{get when(){return d()},children:e=>(()=>{var t=Xp(),n=t.firstChild,i=n.nextSibling;return B(n,(()=>{var t=N(()=>!!e().own[r]);return()=>t()?`${e().own[r]} of your own setting${e().own[r]===1?``:`s`}`:`All from the server default`})()),i.$$click=()=>void b(r),S(()=>i.disabled=!e().own[r]),t})()}),null),B(i,()=>g(r,`provider`,`Provider`,(()=>{var e=Qp();return e.addEventListener(`change`,e=>n(r,`provider`,e.currentTarget.value)),L(e,`id`,`sp-${r}-provider`),B(e,O(k,{each:rm,children:([e,t])=>(()=>{var n=Zp();return n.value=e,B(n,t),n})()}),null),B(e,O(A,{get when(){return!rm.some(([e])=>e===t[r].provider)},get children(){var e=Zp();return B(e,()=>t[r].provider||`—`),S(()=>e.value=t[r].provider),e}}),null),S(()=>e.value=t[r].provider),e})()),null),B(i,O(A,{get when(){return t[r].provider===`openai-compatible`},get children(){return g(r,`baseURL`,`Base URL`,_(r,`baseURL`,{inputmode:`url`,placeholder:`http://host:port/v1`}))}}),null),B(i,()=>g(r,`model`,`Model`,v(r,`model`,r===`stt`?`Speech-to-text model`:`Text-to-speech model`,`model`,()=>h(r))),null),B(i,O(A,{when:r===`tts`,get fallback(){return g(r,`language`,`Language (optional)`,_(r,`language`,{placeholder:`auto, e.g. en`}))},get children(){return[N(()=>g(r,`voice`,`Voice`,v(r,`voice`,`Voice`,`voice`,async()=>gu(zr(e.settings.voiceHints,t.tts.model))))),N(()=>g(r,`speed`,`Server-side speed (optional)`,_(r,`speed`,{inputmode:`decimal`,placeholder:`default`}),`0.25–4, applied by the TTS provider. Your device's voice speed is separate.`))]}}),null),B(i,()=>y(r),null),i})(),C=async r=>{r.preventDefault();let a=Zt(t),s=Rr(a);if(i(s),Object.keys(s).length)return o({text:`Fix the highlighted fields.`,kind:`error`});let l=Lr(e.settings,a);if(!Object.keys(l).length)return o({text:`Nothing to save.`,kind:`muted`});c(!0),o({text:`Saving…`,kind:`muted`});try{let t=await(await H(am[e.scope],{method:`PUT`,json:l})).json().catch(()=>({})),r=t?.stt&&t?.tts?t:await U(am[e.scope]);e.scope===`user`?yi(r.ready??null):Ri(),n(mn(Ir(r))),e.onSaved(r),q(e.scope==="default"?`Server default saved`:`Speech settings saved`)}catch(e){let t=e.field;t&&i({[t]:G(e)}),o({text:`Could not save: ${G(e)}`,kind:`error`})}finally{c(!1)}},w=async()=>{o({text:p()?`Previewing the saved voice (save to hear your changes)…`:`Previewing…`,kind:`muted`});let e;try{let t=await(await H(`/api/settings/speech/test`,{method:`POST`,json:{kind:`tts`,text:`Hi! This is how replies will sound.`}})).blob();if(e=URL.createObjectURL(t),Q.src=e,cs(Q,$s.speed),!await Q.play().then(()=>!0,()=>!1))throw Error(`the browser blocked playback`);o({text:`Playing preview.`,kind:`muted`}),await new Promise(e=>Q.onended=Q.onpause=Q.onerror=()=>e()),o({text:``,kind:``})}catch(e){o({text:`Preview failed: ${G(e)}`,kind:`error`})}finally{Q.onended=Q.onpause=Q.onerror=null,e&&URL.revokeObjectURL(e)}};return(()=>{var t=tm(),n=t.firstChild,r=n.firstChild,i=n.nextSibling;return t.$$input=()=>o({text:p()?`Unsaved changes.`:``,kind:`muted`}),t.addEventListener(`submit`,C),B(t,O(A,{get when(){return e.scope==="default"},get children(){return $p()}}),n),B(t,O(A,{get when(){return f()},children:e=>(()=>{var t=nm(),n=t.firstChild,r=n.firstChild.nextSibling;return r.nextSibling,B(r,()=>e().reason),B(n,O(A,{get when(){return e().storage},get children(){var t=Lp();return B(t,()=>e().storage),t}}),null),t})()}),n),B(t,()=>ee(`stt`),n),B(t,()=>ee(`tts`),n),B(n,O(A,{get when(){return e.scope===`user`},get children(){var e=em();return e.$$click=()=>void w(),e}}),null),B(i,()=>a().text),B(t,O(jp,{get request(){return l()},onClose:()=>u(void 0)}),null),S(e=>{var t=s(),n=`small ${a().kind}`;return t!==e.e&&(r.disabled=e.e=t),n!==e.t&&R(i,e.t=n),e},{e:void 0,t:void 0}),t})()}I([`click`,`input`]);var lm=F(`<section class=settings-section><h2>`),um=F(`<div class=settings><header class=topbar><h1 class=title>Settings</h1></header><div class=settings-body><nav class=settings-nav aria-label="Settings sections"></nav><div class=settings-content><p class="small muted">Server <!> · v`),dm=F(`<a>`),fm=F(`<span class=badge-pill>`),pm=F(`<div class="small muted">`),mm=F(`<div class=account-card><span aria-hidden=true></span><div class=grow><div><strong></strong></div><div class="small muted">This device: </div></div><button type=button class="btn danger">Sign out`),hm=F(`<h3>Notify me when`),gm=F(`<p class="small warn">These apply once this device is subscribed.`),_m=F(`<ul class=switches><li><label class=switch><span>Quiet hours</span><input type=checkbox>`),vm=F(`<p class="small muted"> muted (⋯ menu of a session → Unmute notifications).`),ym=F(`<p class="small muted">Checking this device…`),bm=F(`<p role=status>`),xm=F(`<dl class="notify-facts small muted"><dt>Permission</dt><dd></dd><dt>Service worker</dt><dd></dd><dt>Subscribed on this hub</dt><dd>`),Sm=F(`<button type=button class="btn small primary">Enable notifications on this device`),Cm=F(`<button type=button class="btn small">Turn off on this device`),wm=F(`<button type=button class="btn small">Send test notification`),Tm=F(`<div class=row-actions>`),Em=F(`<p data-test-result>`),Dm=F(`<li><label class=switch><span></span><input type=checkbox>`),Om=F(`<div class=quiet-hours><label>From <input type=time></label><label>to <input type=time></label><span class="small muted">. Hand-offs still come through.`),km=F(`<ul class=switches><li class=speed><label for=voice-speed>Voice speed</label><input id=voice-speed type=range><output for=voice-speed></output></li><li><label class=switch><span>Progress cues</span><input type=checkbox></label><p class="small muted">In Voice mode: a soft tone when the agent hears you, “Working on it.”, “Started a subagent.” and “Still working.”</p></li><li><label class=switch><span>Keep listening when the screen is off</span><input type=checkbox></label><p class="small muted">Off: the screen stays on while listening. On: lock-screen controls and best-effort listening with the screen off (Android Chrome). Applies the next time Voice mode starts.`),Am=F(`<h3>Waiting for approval`),jm=F(`<ul class=list>`),Mm=F(`<li><div class=grow><div class=name></div><div class="small muted">Code <!> · requested </div></div><button type=button class="btn small primary">Approve</button><button type=button class="btn small danger">Deny`),Nm=F(`<p class="small muted">None. In OpenCode run /voice → Connect this machine.`),Pm=F(`<li><div class=grow><div class=name><span aria-hidden=true></span> </div><div class="small muted"></div></div><button type=button class="btn small danger">Revoke`),Fm=F(`<p class="small muted">`),Im=F(`<span class=muted> · this device`),Lm=F(`<li><div class=grow><div class=name></div><div class="small muted">last seen </div></div><button type=button class="btn small danger">`),Rm=F(`<div class=chips role=group aria-label="Admin sections">`),zm=F(`<p class=error role=alert>`),Bm=F(`<p class="small muted">Approving a machine makes it yours. Someone else's machine: let them approve it from their phone with the code OpenCode shows (/approve?code=…).`),Vm=F(`<span class=count>`),Hm=F(`<button type=button class=chip>`),Um=F(`<p class=muted>No machines are waiting for approval.`),Wm=F(`<div class=stack><div class=row><input type=search class=grow placeholder="Search by email or name"aria-label="Search users"><select aria-label=Show></select><select aria-label="Sort by">`),Gm=F(`<option>`),Km=F(`<p class=muted>`),qm=F(`<li class=muted>No users match.`),Jm=F(`<span class=badge-pill>Admin`),Ym=F(`<span class="badge-pill off">Disabled`),Xm=F(`<span class=badge-pill>You`),Zm=F(`<li><div class=grow><div class=name></div><div class="small muted"> · <!> · seen `),Qm=F(`<button type=button>`),$m=F(`<p class=muted>No machines are connected to this hub yet.`),eh=F(`<li><div class=grow><div class=name><span aria-hidden=true></span> </div><div class="small muted"> · </div></div><button type=button class="btn small danger">Revoke`),th=F(`<ol class="list audit">`),nh=F(`<p class=muted>Nothing recorded yet.`),rh=F(`<li><div class=grow><div class=name></div><div class="small muted"></div></div><time class="small muted">`),ih=[[`account`,`Account`],[`notifications`,`Notifications`],[`voice`,`Voice`],[`speech`,`Speech`],[`machines`,`Machines`],[`devices`,`Devices`],[`admin`,`Admin`]];function ah(e){return(()=>{var t=lm(),n=t.firstChild;return B(n,()=>e.title),B(t,()=>e.children,null),S(r=>{var i=e.id,a=`h-${e.id}`,o=`h-${e.id}`;return i!==r.e&&L(t,`id`,r.e=i),a!==r.t&&L(t,`aria-labelledby`,r.t=a),o!==r.a&&L(n,`id`,r.a=o),r},{e:void 0,t:void 0,a:void 0}),t})()}function oh(){ae(()=>{let e=ti().hash.slice(1);e&&requestAnimationFrame(()=>document.getElementById(e)?.scrollIntoView({block:`start`}))});let e=()=>ih.filter(([e])=>e!==`admin`||wt(X()));return(()=>{var t=um(),n=t.firstChild,r=n.firstChild,i=n.nextSibling.firstChild,a=i.nextSibling,o=a.firstChild,s=o.firstChild.nextSibling;return s.nextSibling,B(n,O(A,{get when(){return To()},get children(){return O(va,{icon:`menu`,label:`Open sidebar`,onClick:Io})}}),r),B(i,O(k,{get each(){return e()},children:([e,t])=>(()=>{var n=dm();return n.$$click=t=>(t.preventDefault(),document.getElementById(e)?.scrollIntoView({behavior:`smooth`,block:`start`}),history.replaceState(null,``,`#${e}`)),L(n,`href`,`#${e}`),B(n,t),n})()})),B(a,O(ch,{}),o),B(a,O(lh,{}),o),B(a,O(uh,{}),o),B(a,O(ah,{id:`speech`,title:`Speech`,get children(){return O(sm,{})}}),o),B(a,O(ph,{}),o),B(a,O(mh,{}),o),B(a,O(A,{get when(){return wt(X())},get children(){return O(_h,{})}}),o),B(o,()=>X()?.publicURL??location.origin,s),B(o,()=>X()?.version??`?`,null),t})()}async function sh(){(Tt(X()).mode!==`pairing`||confirm(`Sign out this device? You will need a new pairing code.`))&&(await(await co().catch(()=>void 0))?.unsubscribe().catch(()=>{}),await H(`/api/logout`,{method:`POST`,json:{}}).catch(()=>{}),Ni(),location.href=`/`)}function ch(){let e=()=>Tt(X());return O(ah,{id:`account`,title:`Account`,get children(){var t=mm(),n=t.firstChild,r=n.nextSibling,i=r.firstChild,a=i.firstChild,o=i.nextSibling;o.firstChild;var s=r.nextSibling;return B(n,()=>e().initial),B(a,()=>e().title),B(i,O(A,{get when(){return e().badge},get children(){var t=fm();return B(t,()=>e().badge),t}}),null),B(r,O(A,{get when(){return e().subtitle},get children(){var t=pm();return B(t,()=>e().subtitle),t}}),o),B(o,()=>X()?.device?.name??`paired`,null),s.$$click=()=>void sh(),S(()=>R(n,`avatar large${e().badge?` admin`:``}`)),t}})}function lh(){let[e,{refetch:t}]=ne(no,()=>uo()),[n,r]=x(!1),[i,a]=x(),[o,s]=x(),[c,l]=x(null),u=()=>e()?Ja(e().env):void 0,d=()=>e()?.view,f=()=>o()??d()?.prefs,p=()=>o()?c():d()?.quietHours??null,m=async(e,n)=>{r(!0);try{await e(),n&&q(n)}catch(e){q(G(e),`err`)}finally{r(!1),s(void 0),t()}},h=async e=>{try{let t=await(await H(`/api/push/prefs`,{method:`PUT`,json:e})).json();s(t.prefs),l(t.quietHours??null)}catch(e){q(G(e),`err`)}},g=async()=>{a(void 0);try{a(Xa(await ho()))}catch(e){a({ok:!1,text:G(e)})}};return O(ah,{id:`notifications`,title:`Notifications`,get children(){return[O(A,{get when(){return u()},get fallback(){return ym()},children:t=>[(()=>{var e=bm();return B(e,()=>t().message),S(n=>{var r=t().warn?`notify-status warn`:`notify-status ok`,i=t().state;return r!==n.e&&R(e,n.e=r),i!==n.t&&L(e,`data-state`,n.t=i),n},{e:void 0,t:void 0}),e})(),(()=>{var t=xm(),n=t.firstChild.nextSibling,r=n.nextSibling.nextSibling,i=r.nextSibling.nextSibling;return B(n,(()=>{var t=N(()=>!!e().env.supported);return()=>t()?e().env.permission:`unsupported`})()),B(r,()=>e().env.worker?`registered`:`not registered`),B(i,()=>e().env.hubSubscribed?`yes`:`no`),t})(),(()=>{var r=Tm();return B(r,O(A,{get when(){return t().action===`enable`},get children(){var e=Sm();return e.$$click=()=>void m(po,`Notifications are on for this device`),S(()=>e.disabled=n()),e}}),null),B(r,O(A,{get when(){return t().action===`disable`},get children(){var e=Cm();return e.$$click=()=>void m(mo,`Notifications are off for this device`),S(()=>e.disabled=n()),e}}),null),B(r,O(A,{get when(){return e().env.hubSubscriptions>0},get children(){var e=wm();return e.$$click=()=>void g(),e}}),null),r})(),O(A,{get when(){return i()},children:e=>(()=>{var t=Em();return B(t,()=>e().text),S(()=>R(t,e().ok?`small ok`:`small err`)),t})()})]}),O(A,{get when(){return f()},get children(){return[hm(),O(A,{get when(){return N(()=>!!u())()&&u().state!==`on`},get children(){return gm()}}),(()=>{var e=_m(),t=e.firstChild,n=t.firstChild.firstChild.nextSibling;return B(e,O(k,{each:Za,children:([e,t])=>(()=>{var n=Dm(),r=n.firstChild.firstChild,i=r.nextSibling;return B(r,t),i.addEventListener(`change`,t=>void h({[e]:t.currentTarget.checked})),L(i,`data-pref`,e),S(()=>i.checked=!!f()[e]),n})()}),t),n.addEventListener(`change`,e=>void h({quietHours:e.currentTarget.checked?{start:`22:00`,end:`07:00`,timeZone:Qa()}:null})),B(t,O(A,{get when(){return p()},children:e=>(()=>{var t=Om(),n=t.firstChild,r=n.firstChild.nextSibling,i=n.nextSibling,a=i.firstChild.nextSibling,o=i.nextSibling,s=o.firstChild;return r.addEventListener(`change`,t=>void h({quietHours:{...e(),start:t.currentTarget.value,timeZone:Qa()}})),a.addEventListener(`change`,t=>void h({quietHours:{...e(),end:t.currentTarget.value,timeZone:Qa()}})),B(o,()=>e().timeZone,s),S(()=>r.value=e().start),S(()=>a.value=e().end),t})()}),null),S(()=>n.checked=!!p()),e})(),O(A,{get when(){return io().size},get children(){var e=vm(),t=e.firstChild;return B(e,()=>Ea(io().size,`session`),t),e}})]}})]}})}function uh(){let[e,t]=x($s.speed);return O(ah,{id:`voice`,title:`Voice`,get children(){var n=km(),r=n.firstChild,i=r.firstChild.nextSibling,a=i.nextSibling,o=r.nextSibling,s=o.firstChild.firstChild.nextSibling,c=o.nextSibling.firstChild.firstChild.nextSibling;return i.$$input=e=>{$s.speed=Number(e.currentTarget.value),t($s.speed)},L(i,`min`,yr),L(i,`max`,2),L(i,`step`,br),B(a,()=>Sr(e())),s.addEventListener(`change`,e=>$s.cues=e.currentTarget.checked),c.addEventListener(`change`,e=>$s.background=e.currentTarget.checked),S(()=>L(i,`aria-valuetext`,Sr(e()))),S(()=>i.value=e()),S(()=>s.checked=$s.cues),S(()=>c.checked=$s.background),n}})}async function dh(e,t){try{await H(`/api/enrollments/${Wt(e.userCode)}/${t}`,{method:`POST`,json:{}}),q(t===`approve`?`${e.machineName} approved; it belongs to you`:`Request denied`)}catch(e){q(G(e),`err`)}Li()}function fh(){return O(A,{get when(){return bi().length},get children(){return[Am(),(()=>{var e=jm();return B(e,O(k,{get each(){return bi()},children:e=>(()=>{var t=Mm(),n=t.firstChild,r=n.firstChild,i=r.nextSibling,a=i.firstChild.nextSibling;a.nextSibling;var o=n.nextSibling,s=o.nextSibling;return B(r,()=>e.machineName),B(i,()=>e.userCode,a),B(i,()=>wa(e.created,Ca()),null),o.$$click=()=>void dh(e,`approve`),s.$$click=()=>void dh(e,`deny`),t})()})),e})()]}})}function ph(){let e=async e=>{if(confirm(`Revoke ${e.name}? Its OpenCode processes disconnect and it must be connected again.`))try{await H(`/api/machines/${Wt(e.id)}`,{method:`DELETE`}),q(`${e.name} revoked`)}catch(e){q(G(e),`err`)}};return O(ah,{id:`machines`,title:`Machines`,get children(){return[O(fh,{}),O(A,{get when(){return(J.machines??[]).length},get fallback(){return Nm()},get children(){var t=jm();return B(t,O(k,{get each(){return J.machines},children:t=>(()=>{var n=Pm(),r=n.firstChild,i=r.firstChild,a=i.firstChild;a.nextSibling;var o=i.nextSibling,s=r.nextSibling;return B(i,()=>t.name,null),B(o,(()=>{var e=N(()=>!!t.online);return()=>e()?`online · ${Ea(t.processes.length,`OpenCode process`)}`:`offline · seen ${wa(t.lastSeen,Ca())}`})()),s.$$click=()=>void e(t),S(e=>{var n=`online-dot${t.online?` on`:``}`,r=`Revoke machine ${t.name}`;return n!==e.e&&R(a,e.e=n),r!==e.t&&L(s,`aria-label`,e.t=r),e},{e:void 0,t:void 0}),n})()})),t}})]}})}function mh(){let[e,{refetch:t}]=ne(()=>U(`/api/devices`).then(e=>e.devices)),n=async e=>{if(e.current)return void sh();if(confirm(`Revoke ${e.name}?`)){try{await H(`/api/devices/${Wt(e.id)}`,{method:`DELETE`}),q(`${e.name} revoked`)}catch(e){q(G(e),`err`)}t()}};return O(ah,{id:`devices`,title:`Devices`,get children(){return O(A,{get when(){return e()},get fallback(){return(()=>{var t=Fm();return B(t,(()=>{var t=N(()=>!!e.error);return()=>t()?G(e.error):`Loading…`})()),t})()},get children(){var t=jm();return B(t,O(k,{get each(){return e()},children:e=>(()=>{var t=Lm(),r=t.firstChild,i=r.firstChild,a=i.nextSibling;a.firstChild;var o=r.nextSibling;return B(i,()=>e.name,null),B(i,O(A,{get when(){return e.current},get children(){return Im()}}),null),B(a,()=>wa(e.lastSeen,Ca()),null),o.$$click=()=>void n(e),B(o,()=>e.current?`Sign out`:`Revoke`),t})()})),t}})}})}var hh=(e,t)=>Array.isArray(e)?e:Array.isArray(e?.[t])?e[t]:[],gh=e=>e.id===`local`?`Hub owner (pairing)`:e.name||e.email||e.id;function _h(){let e=()=>Dt(X()),[t,n]=x(e()[0]?.[0]??`machines`),[r,i]=x(``),a=async(e,t)=>{try{return await e(),i(``),q(t),!0}catch(e){return i(Bt(e)),q(r(),`err`),!1}};return O(ah,{id:`admin`,title:`Admin`,get children(){return[(()=>{var r=Rm();return B(r,O(k,{get each(){return e()},children:([e,r])=>(()=>{var a=Hm();return a.$$click=()=>(n(e),i(``)),B(a,r,null),B(a,O(A,{get when(){return e===`approvals`&&bi().length},get children(){var e=Vm();return B(e,()=>bi().length),e}}),null),S(()=>L(a,`aria-pressed`,t()===e)),a})()})),r})(),O(A,{get when(){return r()},get children(){var e=zm();return B(e,r),e}}),O(A,{get when(){return t()===`users`},get children(){return O(vh,{change:a})}}),O(A,{get when(){return t()===`machines`},get children(){return O(yh,{change:a})}}),O(A,{get when(){return t()===`approvals`},get children(){return[Bm(),O(A,{get when(){return bi().length},get fallback(){return Um()},get children(){return O(fh,{})}})]}}),O(A,{get when(){return t()===`audit`},get children(){return O(bh,{})}})]}})}function vh(e){let[t,{refetch:n}]=ne(()=>U(`/api/admin/users`).then(e=>hh(e,`users`))),[r,i]=x(``),[a,o]=x(`all`),[s,c]=x(`role`),l=async(t,r)=>{confirm(r.confirm)&&(await e.change(()=>H(`/api/admin/users/${Wt(t.id)}`,{method:`PUT`,json:r.change}),`${gh(t)}: ${r.label.toLowerCase()} done`)&&t.id===X()?.user?.id&&(hi(void 0),await Di().catch(()=>!1)),n())};return(()=>{var e=Wm(),n=e.firstChild.firstChild,u=n.nextSibling,d=u.nextSibling;return n.$$input=e=>i(e.currentTarget.value),u.addEventListener(`change`,e=>o(e.currentTarget.value)),B(u,O(k,{each:St,children:([e,t])=>(()=>{var n=Gm();return n.value=e,B(n,t),n})()})),d.addEventListener(`change`,e=>c(e.currentTarget.value)),B(d,O(k,{each:xt,children:([e,t])=>(()=>{var n=Gm();return n.value=e,B(n,t),n})()})),B(e,O(A,{get when(){return t()},get fallback(){return(()=>{var e=Km();return B(e,(()=>{var e=N(()=>!!t.error);return()=>e()?`Could not load: ${Bt(t.error)}`:`Loading…`})()),e})()},get children(){var e=jm();return B(e,O(k,{get each(){return Rt(t(),{query:r(),filter:a(),sort:s()})},get fallback(){return qm()},children:e=>(()=>{var n=Zm(),r=n.firstChild,i=r.firstChild,a=i.nextSibling,o=a.firstChild,s=o.nextSibling;return s.nextSibling,B(i,()=>gh(e),null),B(i,O(A,{get when(){return e.role===`admin`},get children(){return Jm()}}),null),B(i,O(A,{get when(){return e.disabled},get children(){return Ym()}}),null),B(i,O(A,{get when(){return e.id===X()?.user?.id},get children(){return Xm()}}),null),B(r,O(A,{get when(){return N(()=>!!e.name)()&&e.email},get children(){var t=pm();return B(t,()=>e.email),t}}),a),B(a,()=>Ea(e.machines??0,`machine`),o),B(a,()=>Ea(e.devices??0,`device`),s),B(a,()=>wa(e.lastSeen,Ca())||`never`,null),B(n,O(k,{get each(){return zt(e,t(),X()?.user?.id)},children:t=>(()=>{var n=Qm();return n.$$click=()=>void l(e,t),B(n,()=>t.label),S(()=>R(n,`btn small${t.danger?` danger`:``}`)),n})()}),null),S(()=>R(n,e.disabled?`disabled`:``)),n})()})),e}}),null),S(()=>n.value=r()),S(()=>u.value=a()),S(()=>d.value=s()),e})()}function yh(e){let[t,{refetch:n}]=ne(()=>U(`/api/admin/machines`).then(e=>hh(e,`machines`)));return O(A,{get when(){return t()},get fallback(){return(()=>{var e=Km();return B(e,(()=>{var e=N(()=>!!t.error);return()=>e()?`Could not load: ${Bt(t.error)}`:`Loading…`})()),e})()},get children(){return O(A,{get when(){return t().length},get fallback(){return $m()},get children(){var r=jm();return B(r,O(k,{get each(){return t()},children:t=>{let r=t.ownerEmail??(t.ownerID===`local`?`hub owner`:t.ownerID)??`unknown`;return(()=>{var i=eh(),a=i.firstChild,o=a.firstChild,s=o.firstChild;s.nextSibling;var c=o.nextSibling,l=c.firstChild,u=a.nextSibling;return B(o,()=>t.name,null),B(c,r,l),B(c,()=>t.ownerID===X()?.user?.id?` (you)`:``,l),B(c,(()=>{var e=N(()=>!!t.online);return()=>e()?`online`:`offline · seen ${wa(t.lastSeen,Ca())}`})(),null),u.$$click=async()=>{confirm(`Revoke ${t.name} (${r})? Its OpenCode processes disconnect and it must be connected again.`)&&(await e.change(()=>H(`/api/admin/machines/${Wt(t.id)}`,{method:`DELETE`}),`${t.name} revoked`),n())},S(()=>R(s,`online-dot${t.online?` on`:``}`)),i})()}})),r}})}})}function bh(){let[e]=ne(async()=>{let[e,t,n]=await Promise.all([U(`/api/admin/audit`),U(`/api/admin/users`).then(e=>hh(e,`users`),()=>[]),U(`/api/admin/machines`).then(e=>hh(e,`machines`),()=>[])]),r=[...t.map(e=>({id:e.id,email:e.id===`local`?`hub owner`:e.email,name:e.name})),...n.map(e=>({id:e.id,name:e.name}))];return It(hh(e,`audit`).length?hh(e,`audit`):hh(e,`entries`),r)});return O(A,{get when(){return e()},get fallback(){return(()=>{var t=Km();return B(t,(()=>{var t=N(()=>!!e.error);return()=>t()?`Could not load: ${Bt(e.error)}`:`Loading…`})()),t})()},get children(){return O(A,{get when(){return e().length},get fallback(){return nh()},get children(){var t=th();return B(t,O(k,{get each(){return e()},children:e=>(()=>{var t=rh(),n=t.firstChild,r=n.firstChild,i=r.nextSibling,a=n.nextSibling;return B(r,()=>e.action),B(i,()=>e.actor,null),B(i,(()=>{var t=N(()=>!!e.target);return()=>t()?` → ${e.target}`:``})(),null),B(i,(()=>{var t=N(()=>!!e.detail);return()=>t()?` · ${e.detail}`:``})(),null),B(a,()=>wa(e.at,Ca())),S(t=>{var n=new Date(e.at).toISOString(),r=new Date(e.at).toLocaleString();return n!==t.e&&L(a,`datetime`,t.e=n),r!==t.t&&L(a,`title`,t.t=r),t},{e:void 0,t:void 0}),t})()})),t}})}})}I([`click`,`input`]);var xh=F(`<span class=badge title="Machines waiting for approval">`),Sh=F(`<nav class=sidebar aria-label=Sessions><div class=side-top><a class=brand href=/><span class=brand-name>Hub</span></a></div><div class=side-search><input type=search placeholder="Search sessions"aria-label="Search sessions"></div><a class=side-new href=/new> New session</a><a href=/> All sessions</a><div class=side-head><span>Sessions</span></div><div class=side-scroll></div><div class=side-foot><a class=account href=/settings><span aria-hidden=true></span><span class=account-name>`),Ch=F(`<p class=side-empty>`),wh=F(`<a class="icon-btn small">`),Th=F(`<section><div class=side-section-head><span class=side-section-title></span></div><ul class=side-list>`),Eh=F(`<span class=unread-dot role=img aria-label=Unread>`),Dh=F(`<li><a class=side-row-link><span class=side-title>`),Oh=`hub.sidebar.groupBy`,kh=`hub.sidebar.sort`;function Ah(e){let[t,n]=x(``),[r,i]=x(localStorage.getItem(Oh)===`machine`?`machine`:`project`),[a,o]=x(localStorage.getItem(kh)===`title`?`title`:`recent`),s=w(()=>_r(wi(),{query:t(),groupBy:r(),sortBy:a()})),c=()=>{let e=K();return e.name===`session`?e.id:void 0},l=()=>Tt(X()),u=(e,t)=>{e&&(i(e),localStorage.setItem(Oh,e)),t&&(o(t),localStorage.setItem(kh,t))};return(()=>{var i=Sh(),o=i.firstChild,d=o.firstChild,f=d.firstChild,p=o.nextSibling,m=p.firstChild,h=p.nextSibling,g=h.firstChild,_=h.nextSibling,v=_.firstChild,y=_.nextSibling;y.firstChild;var b=y.nextSibling,x=b.nextSibling.firstChild,ee=x.firstChild,C=ee.nextSibling;return d.$$click=()=>e.phone&&e.onClose(),B(d,O(Xi,{class:`brand-mark`}),f),B(o,O(A,{get when(){return e.phone},get fallback(){return O(va,{icon:`sidebar`,label:`Collapse sidebar (⌘B)`,get onClick(){return e.onCollapse}})},get children(){return O(va,{icon:`close`,label:`Close sidebar`,get onClick(){return e.onClose}})}}),null),B(p,O(Z,{name:`search`}),m),m.$$keydown=e=>e.key===`Escape`&&n(``),m.$$input=e=>n(e.currentTarget.value),h.$$click=()=>e.phone&&e.onClose(),B(h,O(Z,{name:`plus`}),g),_.$$click=()=>e.phone&&e.onClose(),B(_,O(Z,{name:`home`}),v),B(y,O(ya,{label:`Group and sort`,items:()=>[{section:`Group by`},{label:`Project`,checked:r()===`project`,run:()=>u(`project`,void 0)},{label:`Server`,checked:r()===`machine`,run:()=>u(`machine`,void 0)},{section:`Sort by`},{label:`Recent activity`,checked:a()===`recent`,run:()=>u(void 0,`recent`)},{label:`Title`,checked:a()===`title`,run:()=>u(void 0,`title`)}]}),null),B(b,O(A,{get when(){return s().length},get fallback(){return(()=>{var e=Ch();return B(e,()=>t()?`No sessions match.`:`No sessions yet.`),e})()},get children(){return O(k,{get each(){return s()},children:t=>(()=>{var n=Th(),r=n.firstChild,i=r.firstChild,a=r.nextSibling;return B(i,()=>t.title),B(r,O(A,{get when(){return N(()=>t.kind===`group`)()&&t.machineID},get children(){var e=wh();return B(e,O(Z,{name:`plus`})),S(n=>{var r=`New session in ${t.title}`,i=`New session in ${t.title}`,a=`/new?machine=${encodeURIComponent(t.machineID)}${t.directory?`&dir=${encodeURIComponent(t.directory)}`:``}${t.key?`&key=${encodeURIComponent(t.key)}`:``}`;return r!==n.e&&L(e,`aria-label`,n.e=r),i!==n.t&&L(e,`title`,n.t=i),a!==n.a&&L(e,`href`,n.a=a),n},{e:void 0,t:void 0,a:void 0}),e}}),null),B(a,O(k,{get each(){return t.rows},children:t=>O(jh,{row:t,get active(){return c()===t.id},onPick:()=>e.phone&&e.onClose()})})),S(e=>{var r=`side-section ${t.kind}`,i=t.title;return r!==e.e&&R(n,e.e=r),i!==e.t&&L(n,`aria-label`,e.t=i),e},{e:void 0,t:void 0}),n})()})}})),x.$$click=()=>e.phone&&e.onClose(),B(ee,()=>l().initial),B(C,()=>l().title),B(x,O(A,{get when(){return bi().length},get children(){var e=xh();return B(e,()=>bi().length),e}}),null),B(x,O(Z,{name:`settings`}),null),S(e=>{var t=`side-link${K().name===`home`?` active`:``}`,n=`Settings (${l().title})`,r=`avatar${l().badge?` admin`:``}`;return t!==e.e&&R(_,e.e=t),n!==e.t&&L(x,`aria-label`,e.t=n),r!==e.a&&R(ee,e.a=r),e},{e:void 0,t:void 0,a:void 0}),S(()=>m.value=t()),i})()}function jh(e){let t=()=>e.row,n=()=>vc().phase!==`off`&&vc().sessionID===t().id;return(()=>{var r=Dh(),i=r.firstChild,a=i.firstChild;return $e(i,`click`,e.onPick,!0),B(i,O(_a,{get state(){return t().state}}),a),B(i,O(A,{get when(){return vr(t(),vc())},get children(){return O(ga,{})}}),a),B(a,()=>t().title),B(i,O(A,{get when(){return t().unread},get children(){return Eh()}}),null),B(r,O(ya,{get label(){return`More actions for ${t().title}`},class:`icon-btn small row-more`,items:()=>xo(t(),{open:!1})}),null),S(a=>{var o=`side-row${e.active?` active`:``}${t().unread?` unread`:``}${n()?` voice-here`:``}`,s=ii(t().id),c=e.active?`page`:void 0,l=`${t().title} · ${t().where} · ${t().machineName}`;return o!==a.e&&R(r,a.e=o),s!==a.t&&L(i,`href`,a.t=s),c!==a.a&&L(i,`aria-current`,a.a=c),l!==a.o&&L(i,`title`,a.o=l),a},{e:void 0,t:void 0,a:void 0,o:void 0}),r})()}I([`click`,`input`,`keydown`]);var Mh=F(`<main class=entry><p></p><button type=button class=btn>Retry`),Nh=F(`<main class=entry><p class=muted>Loading…`),Ph=F(`<div class=drawer-backdrop>`),Fh=F(`<div class=voice-strip>`),Ih=F(`<div class=conn-banner role=status>Reconnecting to the hub…`),Lh=F(`<div><main class=main>`),Rh=F(`<button type=button class="btn small">`),zh=F(`<div role=status aria-live=polite><span>`),Bh=F(`<header class=topbar><span class="title display">Hub`),Vh=F(`<div class=home-shell><div class=home-scroll>`);function Hh(){let[e,t]=x(``),[n,r]=x(!1),i=async()=>{t(``);try{if(!await Di())return;Mi(),Ri(),_o(),r(!0)}catch(e){t(`Cannot reach the hub: ${e.message}`)}};return C(ie(()=>K().name,e=>{e!==`pair`&&!n()&&i(),To()&&jo(!1)})),C(()=>{!X()&&n()&&K().name!==`pair`&&r(!1)}),C(()=>{let e=K();xc.viewing(e.name===`session`?e.id:void 0)}),ae(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&e.key.toLowerCase()===`b`&&(e.preventDefault(),Io())};document.addEventListener(`keydown`,e),oe(()=>document.removeEventListener(`keydown`,e))}),C(()=>{n()&&location.hash===`#speech`&&K().name!==`settings`&&ri(`/settings#speech`,{replace:!0})}),[O(j,{get children(){return[O(M,{get when(){return N(()=>K().name===`pair`)()&&K()},children:e=>O(Ka,{get next(){return e().next},get error(){return e().error}})}),O(M,{get when(){return e()},get children(){var t=Mh(),n=t.firstChild,r=n.nextSibling;return B(n,e),r.$$click=()=>void i(),t}}),O(M,{get when(){return!n()},get children(){return Nh()}}),O(M,{get when(){return N(()=>K().name===`approve`)()&&K()},children:e=>O(qa,{get code(){return e().code}})}),O(M,{when:!0,get children(){var e=Lh(),t=e.firstChild;return B(e,O(A,{get when(){return!To()||Ao()},get children(){return[O(A,{get when(){return To()},get children(){var e=Ph();return e.$$click=()=>jo(!1),e}}),O(A,{get when(){return!Oo()||To()},get children(){return O(Ah,{get phone(){return To()},onClose:()=>jo(!1),onCollapse:Io})}})]}}),t),B(t,O(A,{get when(){return N(()=>!!Oo())()&&!To()},get children(){return O(va,{icon:`sidebar`,label:`Show sidebar (⌘B)`,class:`expand-sidebar`,onClick:Io})}}),null),B(t,O(A,{get when(){return N(()=>vc().phase!==`off`)()&&K().name!==`session`},get children(){var e=Fh();return B(e,O(Ed,{})),e}}),null),B(t,O(A,{get when(){return J.connection===`down`},get children(){return Ih()}}),null),B(t,O(j,{get children(){return[O(M,{get when(){return N(()=>K().name===`session`)()&&K()},keyed:!0,children:e=>O(yp,{get id(){return e.id}})}),O(M,{get when(){return N(()=>K().name===`new`)()&&K()},children:e=>O(Il,Re(()=>e()))}),O(M,{get when(){return K().name===`settings`},get children(){return O(oh,{})}}),O(M,{when:!0,get children(){return O(Uh,{})}})]}}),null),S(()=>R(e,`shell${Oo()&&!To()?` collapsed`:``}${To()?` phone`:``}${Ao()?` drawer`:``}`)),e}})]}}),O(A,{get when(){return si()},children:e=>(()=>{var t=zh(),n=t.firstChild;return B(n,()=>e().text),B(t,O(A,{get when(){return e().action},get children(){var t=Rh();return t.$$click=()=>{e().action.run(),ui()},B(t,()=>e().action.label),t}}),null),S(()=>R(t,`toast ${e().kind}`)),t})()})]}function Uh(){return(()=>{var e=Vh(),t=e.firstChild;return B(e,O(A,{get when(){return To()},get children(){var e=Bh(),t=e.firstChild;return B(e,O(va,{icon:`menu`,label:`Open sidebar`,onClick:Io}),t),e}}),t),B(t,O(Wc,{})),e})()}I([`click`]),Xe(()=>O(Hh,{}),document.getElementById(`root`)),vo();