friend-assistant 0.1.51 → 0.1.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/BUILD.json
CHANGED
package/dist/friend.mjs
CHANGED
|
@@ -16060,7 +16060,7 @@ function currentSelf() {
|
|
|
16060
16060
|
// ../server/src/system/npm.ts
|
|
16061
16061
|
import { spawn as spawn8 } from "node:child_process";
|
|
16062
16062
|
var PACKAGE = "friend-assistant";
|
|
16063
|
-
var runningVersion = () => true ? "0.1.
|
|
16063
|
+
var runningVersion = () => true ? "0.1.52" : "development";
|
|
16064
16064
|
async function npmLatest(fetchFn = fetch, timeoutMs = 1e4) {
|
|
16065
16065
|
try {
|
|
16066
16066
|
const res = await fetchFn(`https://registry.npmjs.org/${PACKAGE}/latest`, { headers: { accept: "application/json" }, signal: AbortSignal.timeout(timeoutMs) });
|
|
@@ -20832,7 +20832,7 @@ import { appendFileSync } from "node:fs";
|
|
|
20832
20832
|
import { join as join26 } from "node:path";
|
|
20833
20833
|
var PACKAGE2 = "friend-assistant";
|
|
20834
20834
|
var real2 = {
|
|
20835
|
-
current: () => true ? "0.1.
|
|
20835
|
+
current: () => true ? "0.1.52" : "development",
|
|
20836
20836
|
latest: () => new Promise((resolve13) => {
|
|
20837
20837
|
const child = crossSpawn5("npm", ["view", PACKAGE2, "version", "--prefer-online"], { stdio: ["ignore", "pipe", "ignore"] });
|
|
20838
20838
|
let out = "";
|
|
@@ -21147,7 +21147,7 @@ async function run(argv, io2) {
|
|
|
21147
21147
|
case "version":
|
|
21148
21148
|
case "--version":
|
|
21149
21149
|
case "-v":
|
|
21150
|
-
io2.out(true ? "0.1.
|
|
21150
|
+
io2.out(true ? "0.1.52" : "development");
|
|
21151
21151
|
return 0;
|
|
21152
21152
|
case "lan":
|
|
21153
21153
|
return await lanCommand(rest, io2);
|
|
@@ -4456,4 +4456,4 @@ ${e}</tr>
|
|
|
4456
4456
|
`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?`th`:`td`;return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>
|
|
4457
4457
|
`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${fE(e,!0)}</code>`}br(e){return`<br>`}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,text:n,tokens:r,autolink:i}){let a=i?fE(n,!0):this.parser.parseInline(r),o=mE(e);if(o===null)return a;e=fE(o,i);let s=`<a href="`+e+`"`;return t&&(s+=` title="`+fE(t)+`"`),s+=`>`+a+`</a>`,s}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=mE(e);if(i===null)return fE(n);e=i;let a=`<img src="${fE(e)}" alt="${fE(n)}"`;return t&&(a+=` title="${fE(t)}"`),a+=`>`,a}text(e){return`tokens`in e&&e.tokens?this.parser.parseInline(e.tokens):`escaped`in e&&e.escaped?e.text:fE(e.text)}},DE=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return``+e}image({text:e}){return``+e}br(){return``}checkbox({raw:e}){return e}},OE=class e{options;renderer;textRenderer;constructor(e){this.options=e||Hw,this.options.renderer=this.options.renderer||new EE,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new DE}static parse(t,n){return new e(n).parse(t)}static parseInline(t,n){return new e(n).parseInline(t)}parse(e){this.renderer.parser=this;let t=``;for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions?.renderers?.[r.type]){let e=r,n=this.options.extensions.renderers[e.type].call({parser:this},e);if(n!==!1||![`space`,`hr`,`heading`,`code`,`table`,`blockquote`,`list`,`checkbox`,`html`,`def`,`paragraph`,`text`].includes(e.type)){t+=n||``;continue}}let i=r;switch(i.type){case`space`:t+=this.renderer.space(i);break;case`hr`:t+=this.renderer.hr(i);break;case`heading`:t+=this.renderer.heading(i);break;case`code`:t+=this.renderer.code(i);break;case`table`:t+=this.renderer.table(i);break;case`blockquote`:t+=this.renderer.blockquote(i);break;case`list`:t+=this.renderer.list(i);break;case`checkbox`:t+=this.renderer.checkbox(i);break;case`html`:t+=this.renderer.html(i);break;case`def`:t+=this.renderer.def(i);break;case`paragraph`:t+=this.renderer.paragraph(i);break;case`text`:t+=this.renderer.text(i);break;default:{let e=`Token with "`+i.type+`" type was not found.`;if(this.options.silent)return console.error(e),``;throw Error(e)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let n=``;for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let e=this.options.extensions.renderers[i.type].call({parser:this},i);if(e!==!1||![`escape`,`html`,`link`,`image`,`checkbox`,`strong`,`em`,`codespan`,`br`,`del`,`text`].includes(i.type)){n+=e||``;continue}}let a=i;switch(a.type){case`escape`:n+=t.text(a);break;case`html`:n+=t.html(a);break;case`link`:n+=t.link(a);break;case`image`:n+=t.image(a);break;case`checkbox`:n+=t.checkbox(a);break;case`strong`:n+=t.strong(a);break;case`em`:n+=t.em(a);break;case`codespan`:n+=t.codespan(a);break;case`br`:n+=t.br(a);break;case`del`:n+=t.del(a);break;case`text`:n+=t.text(a);break;default:{let e=`Token with "`+a.type+`" type was not found.`;if(this.options.silent)return console.error(e),``;throw Error(e)}}}return n}},kE=class{options;block;constructor(e){this.options=e||Hw}static passThroughHooks=new Set([`preprocess`,`postprocess`,`processAllTokens`,`emStrongMask`]);static passThroughHooksRespectAsync=new Set([`preprocess`,`postprocess`,`processAllTokens`]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(e=this.block){return e?TE.lex:TE.lexInline}provideParser(e=this.block){return e?OE.parse:OE.parseInline}},AE=new class{defaults=Vw();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=OE;Renderer=EE;TextRenderer=DE;Lexer=TE;Tokenizer=wE;Hooks=kE;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(n=n.concat(t.call(this,r)),r.type){case`table`:{let e=r;for(let r of e.header)n=n.concat(this.walkTokens(r.tokens,t));for(let r of e.rows)for(let e of r)n=n.concat(this.walkTokens(e.tokens,t));break}case`list`:{let e=r;n=n.concat(this.walkTokens(e.items,t));break}default:{let e=r;this.defaults.extensions?.childTokens?.[e.type]?this.defaults.extensions.childTokens[e.type].forEach(r=>{let i=e[r].flat(1/0);n=n.concat(this.walkTokens(i,t))}):e.tokens&&(n=n.concat(this.walkTokens(e.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(e=>{let n={...e};if(n.async=this.defaults.async||n.async||!1,e.extensions&&(e.extensions.forEach(e=>{if(!e.name)throw Error(`extension name required`);if(`renderer`in e){let n=t.renderers[e.name];n?t.renderers[e.name]=function(...t){let r=e.renderer.apply(this,t);return r===!1&&(r=n.apply(this,t)),r}:t.renderers[e.name]=e.renderer}if(`tokenizer`in e){if(!e.level||e.level!==`block`&&e.level!==`inline`)throw Error(`extension level must be 'block' or 'inline'`);let n=t[e.level];n?n.unshift(e.tokenizer):t[e.level]=[e.tokenizer],e.start&&(e.level===`block`?t.startBlock?t.startBlock.push(e.start):t.startBlock=[e.start]:e.level===`inline`&&(t.startInline?t.startInline.push(e.start):t.startInline=[e.start]))}`childTokens`in e&&e.childTokens&&(t.childTokens[e.name]=e.childTokens)}),n.extensions=t),e.renderer){let t=this.defaults.renderer||new EE(this.defaults);for(let n in e.renderer){if(!(n in t))throw Error(`renderer '${n}' does not exist`);if([`options`,`parser`].includes(n))continue;let r=n,i=e.renderer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n||``}}n.renderer=t}if(e.tokenizer){let t=this.defaults.tokenizer||new wE(this.defaults);for(let n in e.tokenizer){if(!(n in t))throw Error(`tokenizer '${n}' does not exist`);if([`options`,`rules`,`lexer`].includes(n))continue;let r=n,i=e.tokenizer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.tokenizer=t}if(e.hooks){let t=this.defaults.hooks||new kE;for(let n in e.hooks){if(!(n in t))throw Error(`hook '${n}' does not exist`);if([`options`,`block`].includes(n))continue;let r=n,i=e.hooks[r],a=t[r];t[r]=kE.passThroughHooks.has(n)?e=>{if(this.defaults.async&&kE.passThroughHooksRespectAsync.has(n))return(async()=>{let n=await i.call(t,e);return a.call(t,n)})();let r=i.call(t,e);return a.call(t,r)}:(...e)=>{if(this.defaults.async)return(async()=>{let n=await i.apply(t,e);return n===!1&&(n=await a.apply(t,e)),n})();let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.hooks=t}if(e.walkTokens){let t=this.defaults.walkTokens,r=e.walkTokens;n.walkTokens=function(e){let n=[];return n.push(r.call(this,e)),t&&(n=n.concat(t.call(this,e))),n}}this.defaults={...this.defaults,...n}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return TE.lex(e,t??this.defaults)}parser(e,t){return OE.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let r={...n},i={...this.defaults,...r},a=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&r.async===!1)return a(Error(`marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.`));if(typeof t>`u`||t===null)return a(Error(`marked(): input parameter is undefined or null`));if(typeof t!=`string`)return a(Error(`marked(): input parameter is of type `+Object.prototype.toString.call(t)+`, string expected`));if(i.hooks&&(i.hooks.options=i,i.hooks.block=e),i.async)return(async()=>{let n=i.hooks?await i.hooks.preprocess(t):t,r=await(i.hooks?await i.hooks.provideLexer(e):e?TE.lex:TE.lexInline)(n,i),a=i.hooks?await i.hooks.processAllTokens(r):r;i.walkTokens&&await Promise.all(this.walkTokens(a,i.walkTokens));let o=await(i.hooks?await i.hooks.provideParser(e):e?OE.parse:OE.parseInline)(a,i);return i.hooks?await i.hooks.postprocess(o):o})().catch(a);try{i.hooks&&(t=i.hooks.preprocess(t));let n=(i.hooks?i.hooks.provideLexer(e):e?TE.lex:TE.lexInline)(t,i);i.hooks&&(n=i.hooks.processAllTokens(n)),i.walkTokens&&this.walkTokens(n,i.walkTokens);let r=(i.hooks?i.hooks.provideParser(e):e?OE.parse:OE.parseInline)(n,i);return i.hooks&&(r=i.hooks.postprocess(r)),r}catch(e){return a(e)}}}onError(e,t){return n=>{if(n.message+=`
|
|
4458
4458
|
Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error occurred:</p><pre>`+fE(n.message+``,!0)+`</pre>`;return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}};function jE(e,t){return AE.parse(e,t)}jE.options=jE.setOptions=function(e){return AE.setOptions(e),jE.defaults=AE.defaults,Uw(jE.defaults),jE},jE.getDefaults=Vw,jE.defaults=Hw;function ME(...e){return AE.use(...e),jE.defaults=AE.defaults,Uw(jE.defaults),jE}jE.use=ME,jE.walkTokens=function(e,t){return AE.walkTokens(e,t)},jE.parseInline=AE.parseInline,jE.Parser=OE,jE.parser=OE.parse,jE.Renderer=EE,jE.TextRenderer=DE,jE.Lexer=TE,jE.lexer=TE.lex,jE.Tokenizer=wE,jE.Hooks=kE,jE.parse=jE,jE.options,jE.setOptions,jE.walkTokens,jE.parseInline,OE.parse,TE.lex;var NE=!1;function PE(){NE||(NE=!0,Bw.addHook(`afterSanitizeAttributes`,e=>{e instanceof Element&&e.tagName===`A`&&(e.setAttribute(`rel`,`noopener noreferrer`),e.setAttribute(`target`,`_blank`))}))}function FE(e){PE();let t=jE.parse(e,{async:!1,breaks:!0});return Bw.sanitize(t,{ALLOWED_TAGS:[`p`,`br`,`strong`,`em`,`code`,`pre`,`ul`,`ol`,`li`,`a`,`h1`,`h2`,`h3`,`h4`,`h5`,`h6`,`blockquote`,`hr`,`del`,`table`,`thead`,`tbody`,`tr`,`th`,`td`],ALLOWED_ATTR:[`href`,`rel`,`target`],ALLOWED_URI_REGEXP:/^(?:https?:|mailto:)/i})}var IE=e=>Number.isFinite(e);function LE(e){let t=Math.floor(Math.log10(e)),n=e/10**t;return(n<=1?1:n<=2?2:n<=2.5?2.5:n<=5?5:10)*10**t}function RE(e,t,n=5){let r=IE(e)?e:0,i=IE(t)?t:r+1;r>i&&([r,i]=[i,r]),r===i&&(i=r+(Math.abs(r)||1));let a=LE((i-r)/Math.max(1,n-1)),o=Math.floor(r/a)*a,s=Math.ceil(i/a)*a,c=[];for(let e=o;e<=s+a/2;e+=a)c.push(Math.round(e*1e9)/1e9);return{min:o,max:s,ticks:c}}function zE(e,t){let[n,r]=e,[i,a]=t;return r===n?()=>i:e=>i+(e-n)/(r-n)*(a-i)}function BE(e){return e.map(([e,t],n)=>`${n===0?`M`:`L`}${e.toFixed(2)} ${t.toFixed(2)}`).join(` `)}function VE(e,t,n,r,i){let a=r=>{let i=r*Math.PI/180;return`${(e+n*Math.cos(i)).toFixed(2)} ${(t+n*Math.sin(i)).toFixed(2)}`},o=+(Math.abs(i-r)>180);return`M ${a(r)} A ${n} ${n} 0 ${o} 1 ${a(i)}`}function HE(e,t,n){return!IE(e)||!IE(t)||!IE(n)||n<=t?0:Math.min(1,Math.max(0,(e-t)/(n-t)))*240}function UE(e,t,n,r){let i=t.x-e.x,a=t.y-e.y,o=Math.hypot(i,a);if(o===0||o<=n+r)return{from:{...e},to:{...t}};let s=i/o,c=a/o;return{from:{x:e.x+s*n,y:e.y+c*n},to:{x:t.x-s*r,y:t.y-c*r}}}function WE(e,t,n){if(e<=0)return[];if(e===1)return[{x:t/2,y:n/2}];let r=Math.min(t,n)*.36;return Array.from({length:e},(i,a)=>{let o=-Math.PI/2+a*2*Math.PI/e;return{x:t/2+r*Math.cos(o),y:n/2+r*Math.sin(o)}})}var GE=e=>typeof e==`object`&&!!e&&!Array.isArray(e),KE=e=>typeof e==`string`?e:typeof e==`number`?String(e):``,qE=e=>Array.isArray(e)?e:[],JE=e=>typeof e==`number`?Number.isFinite(e)?e:null:typeof e==`string`&&e.trim()!==``&&Number.isFinite(Number(e))?Number(e):null,YE=(e,t)=>e.length>t?e.slice(0,t)+`…`:e,XE=[`var(--accent)`,`#ffb454`,`#7b8cff`,`#5ef0b0`,`#ff6b7a`,`#c792ea`],ZE=({text:e})=>e?(0,p.jsx)(`h3`,{className:`obj-title`,children:e}):null,QE=({text:e=`No data`})=>(0,p.jsx)(`p`,{className:`obj-empty`,children:e}),$E=400,eD=220,tD={l:44,r:12,t:10,b:28};function nD({props:e}){let t=e.kind===`bar`||e.kind===`area`?e.kind:`line`,n=qE(e.labels).slice(0,120).map(KE),r=qE(e.series).slice(0,6).map((e,t)=>{let n=GE(e)?e:{},r=qE(n.values).slice(0,120).map((e,t)=>({idx:t,v:JE(e)})).filter(e=>e.v!==null);return{name:KE(n.name)||`series ${t+1}`,points:r}}).filter(e=>e.points.length>0);if(r.length===0)return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(ZE,{text:KE(e.title)}),(0,p.jsx)(QE,{})]});let i=r.flatMap(e=>e.points.map(e=>e.v)),a=Math.min(...i),o=Math.max(...i),s=RE(t===`line`?a:Math.min(0,a),t===`line`?o:Math.max(0,o),5),c=Math.max(n.length,...r.map(e=>e.points[e.points.length-1].idx+1),2),l=zE([s.min,s.max],[eD-tD.b,tD.t]),u=zE([0,c-1],[tD.l,$E-tD.r]),d=($E-tD.l-tD.r)/c,f=Math.max(1,d*.7/r.length),m=(e,t)=>tD.l+e*d+d*.15+t*f,h=Math.max(1,Math.ceil(c/6)),g=KE(e.unit);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(ZE,{text:KE(e.title)}),(0,p.jsxs)(`svg`,{className:`obj-chart`,viewBox:`0 0 ${$E} ${eD}`,role:`img`,"aria-label":KE(e.title)||`chart`,children:[s.ticks.map(e=>(0,p.jsxs)(`g`,{children:[(0,p.jsx)(`line`,{className:`grid`,x1:tD.l,x2:$E-tD.r,y1:l(e),y2:l(e)}),(0,p.jsxs)(`text`,{className:`tick`,x:tD.l-6,y:l(e)+3,textAnchor:`end`,children:[e,g&&e===s.max?g:``]})]},e)),Array.from({length:c},(e,t)=>t).filter(e=>e%h===0&&n[e]).map(e=>(0,p.jsx)(`text`,{className:`tick`,x:t===`bar`?m(e,0)+f*r.length/2:u(e),y:212,textAnchor:`middle`,children:YE(n[e],8)},e)),r.map((e,n)=>{let r=XE[n%XE.length];if(t===`bar`)return(0,p.jsx)(`g`,{children:e.points.map(e=>(0,p.jsx)(`rect`,{className:`bar`,x:m(e.idx,n),y:Math.min(l(e.v),l(0)),width:f,height:Math.abs(l(e.v)-l(0)),fill:r},e.idx))},n);let i=e.points.map(e=>[u(e.idx),l(e.v)]),a=BE(i),o=`${a} L${i[i.length-1][0].toFixed(2)} ${l(s.min).toFixed(2)} L${i[0][0].toFixed(2)} ${l(s.min).toFixed(2)} Z`;return(0,p.jsxs)(`g`,{children:[t===`area`&&(0,p.jsx)(`path`,{className:`series-area`,d:o,fill:r,opacity:.18}),(0,p.jsx)(`path`,{className:`series-line`,d:a,fill:`none`,stroke:r,strokeWidth:2,strokeLinejoin:`round`})]},n)})]}),r.length>1&&(0,p.jsx)(`ul`,{className:`legend`,children:r.map((e,t)=>(0,p.jsxs)(`li`,{children:[(0,p.jsx)(`i`,{style:{background:XE[t%XE.length]}}),(0,p.jsx)(`span`,{children:e.name})]},t))})]})}function rD({props:e}){let t=JE(e.min)??0,n=JE(e.max)??100,r=JE(e.value)??t,i=HE(r,t,n),a=i/240;return(0,p.jsxs)(`div`,{className:`obj-gauge ${a>.95?`gauge-crit`:a>.8?`gauge-warn`:``}`,children:[(0,p.jsxs)(`svg`,{viewBox:`0 0 200 150`,role:`img`,"aria-label":`${KE(e.label)} ${r}`,children:[(0,p.jsx)(`path`,{className:`track`,d:VE(100,100,70,150,390),fill:`none`,strokeWidth:12,strokeLinecap:`round`}),i>0&&(0,p.jsx)(`path`,{className:`value`,d:VE(100,100,70,150,150+i),fill:`none`,strokeWidth:12,strokeLinecap:`round`})]}),(0,p.jsxs)(`div`,{className:`gauge-read`,children:[(0,p.jsx)(`span`,{className:`gauge-value`,children:String(Math.round(r*100)/100)}),KE(e.unit)&&(0,p.jsx)(`small`,{className:`gauge-unit`,children:KE(e.unit)})]}),(0,p.jsx)(`span`,{className:`obj-label`,children:KE(e.label)})]})}function iD({props:e}){let t=qE(e.items).slice(0,30).map(e=>GE(e)?e:{}).map(e=>({time:KE(e.time),title:KE(e.title),detail:KE(e.detail)})).filter(e=>e.title||e.time);return t.length===0?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(ZE,{text:KE(e.title)}),(0,p.jsx)(QE,{text:`Nothing to show`})]}):(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(ZE,{text:KE(e.title)}),(0,p.jsx)(`ol`,{className:`obj-timeline`,children:t.map((e,t)=>(0,p.jsxs)(`li`,{children:[(0,p.jsx)(`time`,{children:e.time}),(0,p.jsx)(`strong`,{children:e.title}),e.detail&&(0,p.jsx)(`span`,{children:e.detail})]},t))})]})}var aD=400,oD=300,sD=12;function cD({props:e}){let t=(0,l.useId)(),n=new Set,r=[];for(let t of qE(e.nodes)){let e=GE(t)?t:{},i=KE(e.id);if(i&&!n.has(i)&&(n.add(i),r.push({id:i,label:KE(e.label)||i}),r.length>=40))break}if(r.length===0)return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(ZE,{text:KE(e.title)}),(0,p.jsx)(QE,{text:`Nothing to show`})]});let i=new Map(r.map((e,t)=>[e.id,WE(r.length,aD,oD)[t]])),a=[];for(let t of qE(e.edges)){let e=GE(t)?t:{},n=KE(e.from),r=KE(e.to);if(i.has(n)&&i.has(r)&&n!==r&&(a.push({from:n,to:r,label:KE(e.label)}),a.length>=80))break}return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(ZE,{text:KE(e.title)}),(0,p.jsxs)(`svg`,{className:`obj-graph`,viewBox:`0 0 ${aD} ${oD}`,role:`img`,"aria-label":KE(e.title)||`graph`,children:[(0,p.jsx)(`defs`,{children:(0,p.jsx)(`marker`,{id:t,viewBox:`0 0 10 10`,refX:`9`,refY:`5`,markerWidth:`6`,markerHeight:`6`,orient:`auto-start-reverse`,children:(0,p.jsx)(`path`,{d:`M0 0 L10 5 L0 10 z`,className:`arrow`})})}),a.map((e,n)=>{let{from:r,to:a}=UE(i.get(e.from),i.get(e.to),14,17),o=(r.x+a.x)/2+(aD/2-(r.x+a.x)/2)*.25,s=(r.y+a.y)/2+(oD/2-(r.y+a.y)/2)*.25;return(0,p.jsxs)(`g`,{children:[(0,p.jsx)(`path`,{className:`edge`,d:`M ${r.x.toFixed(1)} ${r.y.toFixed(1)} Q ${o.toFixed(1)} ${s.toFixed(1)} ${a.x.toFixed(1)} ${a.y.toFixed(1)}`,fill:`none`,markerEnd:`url(#${t})`}),e.label&&(0,p.jsx)(`text`,{className:`edge-label`,x:o,y:s,textAnchor:`middle`,children:YE(e.label,12)})]},n)}),r.map(e=>{let t=i.get(e.id);return(0,p.jsxs)(`g`,{children:[(0,p.jsx)(`circle`,{className:`node`,cx:t.x,cy:t.y,r:sD}),(0,p.jsx)(`text`,{className:`node-label`,x:t.x,y:t.y+26,textAnchor:`middle`,children:YE(e.label,18)})]},e.id)})]})]})}var lD=30,uD=e=>Number.isFinite(e)?Math.max(0,Math.min(1,e)):1,dD=new class{current=1;goal=1;from=1;steps=1;n=0;timer=null;subs=new Set;get level(){return this.current}set(e,t=250){if(this.goal=uD(e),t<=0||this.goal===this.current){this.stop(),this.move(this.goal);return}this.from=this.current,this.steps=Math.max(1,Math.ceil(t/lD)),this.n=0,this.timer??=setInterval(()=>this.tick(),lD)}subscribe(e){return this.subs.add(e),()=>void this.subs.delete(e)}tick(){this.n++,this.n>=this.steps?(this.stop(),this.move(this.goal)):this.move(this.from+(this.goal-this.from)*this.n/this.steps)}stop(){this.timer&&clearInterval(this.timer),this.timer=null}move(e){if(e!==this.current){this.current=e;for(let t of[...this.subs])t(e)}}};function fD(e,t=dD){let n=e.volume,r=e.volume,i=!0,a=t=>{i&&(r=uD(n*t),e.volume=r)},o=()=>{if(!i||Math.abs(e.volume-r)<=.002)return;let a=t.level;a>.001&&(n=uD(e.volume/a)),r=e.volume};e.addEventListener(`volumechange`,o);let s=t.subscribe(a);return a(t.level),()=>{i=!1,s(),e.removeEventListener(`volumechange`,o),e.volume=n}}var pD=`https://www.youtube-nocookie.com`;function mD(e,t=dD,n=window){let r=100,i=null,a=!1,o=!0,s=!1,c=t=>e.contentWindow?.postMessage(JSON.stringify(t),pD),l=()=>c({event:`listening`,id:1,channel:`widget`}),u=e=>{i=e,c({event:`command`,func:`setVolume`,args:[e]})},d=e=>{o&&(e<.999?(a=!0,u(Math.round(r*e))):a&&(a=!1,u(Math.round(r))))},f=n=>{if(!o||n.source!==e.contentWindow)return;let c;try{c=JSON.parse(String(n.data)).info}catch{return}if(typeof c?.volume!=`number`)return;s=!0;let l=c.volume;if(i!==null&&Math.abs(l-i)<=1)return;let u=t.level;r=a&&u>.001?l/u:l,i=l};n.addEventListener(`message`,f),e.addEventListener?.(`load`,l),l();let p=setInterval(()=>s?clearInterval(p):l(),1e3),m=t.subscribe(d);return d(t.level),()=>{o=!1,clearInterval(p),m(),n.removeEventListener(`message`,f),e.removeEventListener?.(`load`,l),a&&hD(e,r)}}function hD(e,t){try{e.contentWindow?.postMessage(JSON.stringify({event:`command`,func:`setVolume`,args:[Math.round(t)]}),pD)}catch{}}var gD=e=>typeof e==`string`?e:typeof e==`number`?String(e):``,_D=e=>Array.isArray(e)?e:[],vD=e=>typeof e==`object`&&e?e:{},yD=/^\/api\/media\/[0-9a-f]{32}$/,bD=e=>typeof e==`string`&&yD.test(e)?e:null,xD=/^\/api\/video\/[0-9a-f]{32}$/,SD=e=>typeof e==`string`&&xD.test(e)?e:null,CD=({props:e})=>gD(e.title)?(0,p.jsx)(`h3`,{className:`obj-title`,children:gD(e.title)}):null;function wD({props:e}){let t=(0,l.useMemo)(()=>FE(gD(e.text)),[e.text]);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(CD,{props:e}),(0,p.jsx)(`div`,{className:`obj-md obj-doc`,dangerouslySetInnerHTML:{__html:t}})]})}function TD({props:e}){let t=Math.min(100,Math.max(0,Number(e.value)||0));return(0,p.jsxs)(`div`,{className:`obj-progress`,children:[(0,p.jsxs)(`div`,{className:`obj-progress-head`,children:[(0,p.jsx)(`span`,{className:`obj-label`,children:gD(e.label)}),(0,p.jsxs)(`span`,{className:`obj-progress-pct`,children:[Math.round(t),`%`]})]}),(0,p.jsx)(`div`,{className:`obj-progress-bar`,role:`progressbar`,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":Math.round(t),"aria-label":gD(e.label)||`Progress`,children:(0,p.jsx)(`i`,{style:{width:`${t}%`}})}),gD(e.detail)&&(0,p.jsx)(`span`,{className:`obj-progress-detail`,children:gD(e.detail)})]})}function ED({props:e}){let t=_D(e.items).map(e=>vD(typeof e==`object`&&e?e:{text:e})),n=t.filter(e=>e.done===!0).length;return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(CD,{props:e}),(0,p.jsx)(`ul`,{className:`obj-checklist`,children:t.map((e,t)=>(0,p.jsxs)(`li`,{className:e.done===!0?`done`:void 0,children:[(0,p.jsx)(`span`,{className:`box`,"aria-hidden":`true`,children:e.done===!0?`✓`:``}),(0,p.jsx)(`span`,{children:gD(e.text)})]},t))}),t.length>0&&(0,p.jsxs)(`small`,{className:`obj-progress-detail`,children:[n,` of `,t.length,` done`]})]})}function DD({props:e}){return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(CD,{props:e}),(0,p.jsx)(`dl`,{className:`obj-kv`,children:_D(e.rows).map((e,t)=>{let n=vD(e);return(0,p.jsxs)(`div`,{children:[(0,p.jsx)(`dt`,{children:gD(n.key)}),(0,p.jsx)(`dd`,{children:gD(n.value)})]},t)})})]})}var OD=e=>String(Math.floor(e)).padStart(2,`0`);function kD(e){let t=Math.max(0,Math.ceil(e));return`${OD(t/3600)}:${OD(t%3600/60)}:${OD(t%60)}`}function AD({props:e}){let t=(0,l.useRef)(null);if(t.current===null){let n=typeof e.to==`string`?Date.parse(e.to):NaN,r=Number(e.seconds);t.current=Number.isFinite(n)?n:Date.now()+(Number.isFinite(r)?r:0)*1e3}let[n,r]=(0,l.useState)(Date.now());(0,l.useEffect)(()=>{let e=setInterval(()=>r(Date.now()),250);return()=>clearInterval(e)},[]);let i=(t.current-n)/1e3;return(0,p.jsxs)(`div`,{className:`obj-countdown${i<=0?` done`:``}`,children:[(0,p.jsx)(`span`,{className:`obj-label`,children:gD(e.title)||gD(e.label)}),(0,p.jsx)(`span`,{className:`obj-countdown-time`,role:`timer`,children:kD(i)})]})}function jD({props:e}){let t=bD(e.src);return(0,p.jsxs)(`div`,{className:`obj-media`,children:[(0,p.jsx)(CD,{props:e}),t?(0,p.jsx)(`img`,{src:t,alt:gD(e.title)||`Picture`,loading:`lazy`}):(0,p.jsx)(`p`,{className:`obj-empty`,children:`This picture is not available.`})]})}function MD({src:e,web:t,title:n}){let[r,i]=(0,l.useState)(t?`loading`:`ready`),a=(0,l.useRef)(null);return(0,l.useEffect)(()=>a.current?fD(a.current):void 0,[r===`failed`]),r===`failed`?(0,p.jsx)(`p`,{className:`obj-empty`,children:`This video could not be played. Ask Friend to try again, or to play it in a window on the PC.`}):(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`video`,{ref:a,src:e,controls:!0,playsInline:!0,autoPlay:t,preload:t?`auto`:`metadata`,"aria-label":n,onLoadedData:()=>i(`ready`),onError:()=>i(`failed`)}),t&&r===`loading`&&(0,p.jsx)(`p`,{className:`obj-empty`,children:`Preparing the video…`})]})}var ND=/^[A-Za-z0-9_-]{11}$/;function PD({id:e,start:t,title:n}){let[r,i]=(0,l.useState)(!1),a=(0,l.useRef)(null);(0,l.useEffect)(()=>a.current?mD(a.current):void 0,[e]);let o=new URLSearchParams({autoplay:`1`,rel:`0`,playsinline:`1`,modestbranding:`1`,enablejsapi:`1`});return t>0&&o.set(`start`,String(t)),(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`iframe`,{ref:a,className:`obj-youtube`,src:`https://www.youtube-nocookie.com/embed/${e}?${o.toString()}`,title:n,allow:`autoplay; encrypted-media; fullscreen; picture-in-picture`,allowFullScreen:!0,referrerPolicy:`strict-origin-when-cross-origin`,onLoad:()=>i(!0)}),!r&&(0,p.jsx)(`p`,{className:`obj-empty`,children:`Loading the player…`})]})}function FD({props:e}){if(e.embed!==void 0){let t=typeof e.embed==`string`&&ND.test(e.embed)?e.embed:null,n=typeof e.start==`number`&&e.start>0&&e.start<=86400?Math.floor(e.start):0;return(0,p.jsxs)(`div`,{className:`obj-media obj-media-fill`,children:[(0,p.jsx)(CD,{props:e}),t?(0,p.jsx)(PD,{id:t,start:n,title:gD(e.title)||`YouTube video`},`${t}-${n}`):(0,p.jsx)(`p`,{className:`obj-empty`,children:`This clip is not available.`})]})}let t=SD(e.src),n=t??bD(e.src);return(0,p.jsxs)(`div`,{className:`obj-media`,children:[(0,p.jsx)(CD,{props:e}),n?(0,p.jsx)(MD,{src:n,web:t!==null,title:gD(e.title)||`Video`},n):(0,p.jsx)(`p`,{className:`obj-empty`,children:`This clip is not available.`})]})}function ID({props:e}){let t=bD(e.src);return(0,p.jsxs)(`div`,{className:`obj-media obj-pdf`,children:[(0,p.jsx)(CD,{props:e}),t?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`iframe`,{src:t,title:gD(e.title)||`Document`}),(0,p.jsx)(`a`,{className:`obj-open`,href:t,target:`_blank`,rel:`noopener noreferrer`,children:`Open in a new tab`})]}):(0,p.jsx)(`p`,{className:`obj-empty`,children:`This document is not available.`})]})}function LD({props:e}){let t=_D(e.items).map(vD).filter(e=>bD(e.src)),[n,r]=(0,l.useState)(0),i=Math.min(n,Math.max(0,t.length-1)),a=t[i];if(!a)return(0,p.jsx)(`p`,{className:`obj-empty`,children:`Nothing to show.`});let o=bD(a.src),s=a.kind===`video`;return(0,p.jsxs)(`div`,{className:`obj-media obj-gallery`,children:[(0,p.jsx)(CD,{props:e}),s?(0,p.jsx)(`video`,{src:o,controls:!0,playsInline:!0,preload:`metadata`},o):(0,p.jsx)(`img`,{src:o,alt:gD(a.caption)||`Picture ${i+1}`},o),(0,p.jsxs)(`div`,{className:`obj-gallery-bar`,children:[(0,p.jsx)(`button`,{type:`button`,"aria-label":`Previous`,disabled:t.length<2,onClick:()=>r((i+t.length-1)%t.length),children:`‹`}),(0,p.jsxs)(`span`,{children:[gD(a.caption),(0,p.jsxs)(`small`,{children:[i+1,` / `,t.length]})]}),(0,p.jsx)(`button`,{type:`button`,"aria-label":`Next`,disabled:t.length<2,onClick:()=>r((i+1)%t.length),children:`›`})]})]})}var RD=[`default-src 'none'`,`script-src 'unsafe-inline'`,`style-src 'unsafe-inline'`,`img-src data: blob:`,`form-action 'none'`,`base-uri 'none'`].join(`; `),zD=`html,body{margin:0;min-height:100%;background:#050b10;color:var(--ink,#d8f6ff);font:15px/1.5 var(--ui,system-ui,sans-serif)}`,BD=[`--accent`,`--ink`,`--muted`,`--ok`,`--warn`,`--bad`,`--glass`,`--edge`,`--ui`,`--mono`],VD=/^[\w\s#().,%'"/-]+$/;function HD(){if(typeof document>`u`)return``;let e=getComputedStyle(document.documentElement),t=BD.map(t=>[t,e.getPropertyValue(t).trim()]).filter(([,e])=>e&&VD.test(e));return t.length?`:root{${t.map(([e,t])=>`${e}:${t}`).join(`;`)}}`:``}function UD(e,t=``){return`<!doctype html><html><head><meta charset="utf-8"><meta http-equiv="Content-Security-Policy" content="${RD}"><meta name="viewport" content="width=device-width,initial-scale=1"><style>${t}${zD}</style></head><body>${e}</body></html>`}function WD({props:e}){let t=typeof e.html==`string`?e.html:``,n=typeof e.title==`string`?e.title:``,r=(0,l.useMemo)(()=>UD(t,HD()),[t]);return(0,p.jsxs)(`div`,{className:`obj-sandbox`,children:[n&&(0,p.jsx)(`h3`,{className:`obj-title`,children:n}),(0,p.jsx)(`iframe`,{title:n||`Page made by Friend`,sandbox:`allow-scripts`,referrerPolicy:`no-referrer`,allow:``,srcDoc:r})]})}var GD=e=>typeof e==`string`?e:typeof e==`number`?String(e):``,KD=e=>Array.isArray(e)?e:[];function qD({props:e}){let t=(0,l.useMemo)(()=>FE(GD(e.text)),[e.text]);return(0,p.jsxs)(p.Fragment,{children:[GD(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:GD(e.title)}),(0,p.jsx)(`div`,{className:`obj-md`,dangerouslySetInnerHTML:{__html:t}})]})}function JD({props:e}){return(0,p.jsxs)(`div`,{className:`obj-stat`,children:[(0,p.jsx)(`span`,{className:`obj-label`,children:GD(e.label)}),(0,p.jsxs)(`span`,{className:`obj-value`,children:[(0,p.jsx)(`span`,{children:GD(e.value)}),GD(e.unit)&&(0,p.jsx)(`small`,{children:GD(e.unit)})]}),GD(e.delta)&&(0,p.jsx)(`span`,{className:`obj-delta`,children:GD(e.delta)})]})}function YD({props:e}){return(0,p.jsxs)(p.Fragment,{children:[GD(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:GD(e.title)}),(0,p.jsx)(`ul`,{className:`obj-list`,children:KD(e.items).map((e,t)=>{let n=typeof e==`object`&&e?e:{text:e};return(0,p.jsx)(`li`,{className:n.done?`done`:void 0,children:GD(n.text)},t)})})]})}function XD({props:e}){let t=KD(e.columns),n=KD(e.rows);return(0,p.jsxs)(p.Fragment,{children:[GD(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:GD(e.title)}),(0,p.jsx)(`div`,{className:`obj-table-wrap`,children:(0,p.jsxs)(`table`,{className:`obj-table`,children:[(0,p.jsx)(`thead`,{children:(0,p.jsx)(`tr`,{children:t.map((e,t)=>(0,p.jsx)(`th`,{children:GD(e)},t))})}),(0,p.jsx)(`tbody`,{children:n.map((e,t)=>(0,p.jsx)(`tr`,{children:KD(e).map((e,t)=>(0,p.jsx)(`td`,{children:GD(e)},t))},t))})]})})]})}function ZD({props:e}){return(0,p.jsxs)(p.Fragment,{children:[GD(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:GD(e.title)}),(0,p.jsx)(`pre`,{className:`obj-code`,"data-lang":GD(e.language),children:(0,p.jsx)(`code`,{children:GD(e.code)})})]})}function QD({part:e}){let t=typeof e==`object`&&e?e:{},n=typeof t.type==`string`?t.type:``;if(n===`group`||n===`tabs`||n===`sandbox`)return null;let r=tO[n];return r?(0,p.jsx)(`div`,{className:`obj-part obj-part-${n}`,children:(0,p.jsx)(r,{props:typeof t.props==`object`&&t.props!==null?t.props:{}})}):null}function $D({props:e}){let t=e.layout===`row`||e.layout===`column`?e.layout:`grid`;return(0,p.jsxs)(p.Fragment,{children:[GD(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:GD(e.title)}),(0,p.jsx)(`div`,{className:`obj-group obj-group-${t}`,children:KD(e.items).map((e,t)=>(0,p.jsx)(QD,{part:e},t))})]})}function eO({props:e}){let t=KD(e.tabs).map(e=>typeof e==`object`&&e?e:{}),[n,r]=(0,l.useState)(0),i=Math.min(n,Math.max(0,t.length-1));return(0,p.jsxs)(p.Fragment,{children:[GD(e.title)&&(0,p.jsx)(`h3`,{className:`obj-title`,children:GD(e.title)}),(0,p.jsx)(`div`,{className:`obj-tabs`,role:`tablist`,children:t.map((e,t)=>(0,p.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":t===i,className:t===i?`on`:void 0,onClick:()=>r(t),children:GD(e.title)||`Tab ${t+1}`},t))}),t[i]&&(0,p.jsx)(QD,{part:t[i]})]})}var tO={card:qD,stat:JD,list:YD,table:XD,code:ZD,chart:nD,gauge:rD,timeline:iD,graph:cD,sandbox:WD,markdown:wD,image:jD,video:FD,pdf:ID,gallery:LD,group:$D,tabs:eO,progress:TD,checklist:ED,countdown:AD,kv:DD};function nO(e,t){let n=new Map(t.map(e=>[e.id,e])),r=[],i=new Set;for(let t of e){if(i.has(t.object.id))continue;i.add(t.object.id);let e=n.get(t.object.id);r.push(e?{object:e,leaving:!1}:{object:t.object,leaving:!0})}for(let e of t)i.has(e.id)||(i.add(e.id),r.push({object:e,leaving:!1}));return r}function rO(e,t){let[n,r]=(0,l.useState)(()=>e.map(e=>({object:e,leaving:!1}))),i=(0,l.useRef)(new Map);return(0,l.useEffect)(()=>{r(n=>{let a=nO(n,e),o=new Set(n.filter(e=>e.leaving).map(e=>e.object.id));for(let e of a){let n=i.current.get(e.object.id);if(!e.leaving)n&&clearTimeout(n),i.current.delete(e.object.id);else if(!o.has(e.object.id)&&!n){let n=e.object.id;i.current.set(n,setTimeout(()=>{i.current.delete(n),r(e=>e.filter(e=>!(e.object.id===n&&e.leaving)))},Math.max(t,0)))}}return t<=0?a.filter(e=>!e.leaving):a})},[e,t]),(0,l.useEffect)(()=>()=>{for(let e of i.current.values())clearTimeout(e);i.current.clear()},[]),n}var iO=.12,aO=.1,oO=.02,sO=(e,t,n)=>Math.min(Math.max(e,t),n);function cO(e){let t=sO(e.w,iO,1),n=sO(e.h,aO,1);return{x:sO(e.x,0,1-t),y:sO(e.y,0,1-n),w:t,h:n}}function lO(e,t){let n=t.getBoundingClientRect(),r=e.getBoundingClientRect();return n.width<=0||n.height<=0?null:cO({x:(r.left-n.left)/n.width,y:(r.top-n.top)/n.height,w:r.width/n.width,h:r.height/n.height})}function uO(e,t,n){let r=(0,l.useRef)(null),[i,a]=(0,l.useState)(null),o=(0,l.useCallback)((n,r)=>{let i=cO(r);t({type:`object.place`,id:n,placement:{x:i.x,y:i.y,w:i.w,h:i.h}}),e({type:`stage.move`,objectId:n,rect:i})},[e,t]),s=(0,l.useCallback)((e,t,i)=>{if(e.pointerType===`mouse`&&e.button!==0)return;let o=n(),s=e.currentTarget.closest(`[data-object]`);if(!o||!s||r.current)return;let c=lO(s,o);if(!c)return;let l=o.getBoundingClientRect();r.current={id:t.id,mode:i,pointer:e.pointerId,startX:e.clientX,startY:e.clientY,from:c,stageW:l.width,stageH:l.height};try{e.currentTarget.setPointerCapture(e.pointerId)}catch{}e.stopPropagation(),e.preventDefault(),a({id:t.id,box:c})},[n]),c=(e,t)=>{let n=(t.clientX-e.startX)/e.stageW,r=(t.clientY-e.startY)/e.stageH;return e.mode===`move`?cO({...e.from,x:e.from.x+n,y:e.from.y+r}):cO({...e.from,w:e.from.w+n,h:e.from.h+r})};return{preview:i,begin:s,move:(0,l.useCallback)(e=>{let t=r.current;t&&t.pointer===e.pointerId&&a({id:t.id,box:c(t,e)})},[]),end:(0,l.useCallback)((e,t)=>{let n=r.current;n&&n.pointer===e.pointerId&&(r.current=null,a(null),t||o(n.id,c(n,e)))},[o]),key:(0,l.useCallback)((e,t)=>{let r={ArrowLeft:[-.02,0],ArrowRight:[oO,0],ArrowUp:[0,-.02],ArrowDown:[0,oO]}[e.key],i=n(),a=e.currentTarget.closest(`[data-object]`);if(!r||!i||!a)return;let s=lO(a,i);s&&(e.preventDefault(),o(t.id,e.shiftKey?{...s,w:s.w+r[0],h:s.h+r[1]}:{...s,x:s.x+r[0],y:s.y+r[1]}))},[o,n])}}function dO(e,t){if(e===`auto`)return{position:`relative`};if(t.w<600)return{position:`relative`,width:`100%`};let[n,r,i,a]=typeof e==`string`?su[e]:[e.x*100,e.y*100,e.w*100,e.h*100],o={position:`absolute`,left:`${n}%`,top:`${r}%`,width:`${i}%`};return e===`top`||e===`bottom`?{...o,maxHeight:`${a}%`}:{...o,height:`${a}%`}}var fO=350,pO=()=>typeof matchMedia==`function`&&matchMedia(`(prefers-reduced-motion: reduce)`).matches,mO=class extends l.Component{state={failed:!1};static getDerivedStateFromError(){return{failed:!0}}render(){return this.state.failed?null:this.props.children}};function hO(){let e=()=>({w:window.innerWidth,h:window.innerHeight}),[t,n]=(0,l.useState)(e);return(0,l.useEffect)(()=>{let t=()=>n(e());return window.addEventListener(`resize`,t),()=>window.removeEventListener(`resize`,t)},[]),t}var gO=350;function _O({state:e,send:t,dispatch:n,voice:r,slash:i,onMenu:a,hudLayer:o}){let s=hO(),[c,u]=(0,l.useState)(0),[d,f]=(0,l.useState)(!1),m=L(),h=s.w<600,g=e.scene===`focus`||e.scene===`multi`,_=o&&cC(s.w,s.h)===`orbit`?(()=>{let t=nC(s.w,s.h),n=rC(`centre`,552,828,s.w,s.h);return{name:e.assistantName||`friend`,style:{left:n.x,top:n.y,width:378*t,height:36*t,"--ob-s":t}}})():void 0,v={"--accent":e.mood.accent,"--intensity":e.mood.intensity},y=e.voice.mode,b=y===`listening`?`listening`:y===`speaking`?`speaking`:y===`transcribing`?`thinking`:e.presence.state,x=Xx(e.look.reactivity),S=Math.min(1,(y===`listening`||y===`speaking`?e.voice.level:e.presence.amplitude)*x),C=(0,l.useRef)({timer:null,down:!1,talking:!1,id:null}),w=e=>{if(!(e.target===e.currentTarget||e.target.closest(`[data-presence]`))||e.pointerType===`mouse`&&e.button!==0)return;let t=C.current;if(!(t.down&&t.id!==null&&e.pointerId!==t.id)){t.timer&&clearTimeout(t.timer),t.down=!0,t.talking=!1,t.id=typeof e.pointerId==`number`?e.pointerId:null;try{t.id!==null&&e.currentTarget.setPointerCapture?.(t.id)}catch{}t.timer=r?setTimeout(()=>{t.down&&(t.talking=!0,r.pressStart())},gO):null}},T=(e,t)=>{let n=C.current;n.down&&(n.id===null||typeof e.pointerId!=`number`||e.pointerId===n.id)&&(n.down=!1,n.id=null,n.timer&&clearTimeout(n.timer),n.timer=null,n.talking?(n.talking=!1,t?r?.blur?.():r?.pressEnd()):t||u(e=>e+1))},E=(0,l.useRef)(null),D=uO(t,n,()=>E.current),O=rO(e.objects,pO()?0:fO),k=O.filter(e=>e.object.layer===`overlay`),A=O.filter(e=>e.object.layer!==`overlay`&&e.object.placement===`auto`),j=O.filter(e=>e.object.layer!==`overlay`&&e.object.placement!==`auto`),ee=({object:e,leaving:r})=>{let i=tO[e.type];if(!i)return null;let a=e.layer===`overlay`,o=!h&&!r&&!a,c=D.preview?.id===e.id?D.preview.box:null,l=c?{x:c.x,y:c.y,w:c.w,h:c.h}:e.placement;return(0,p.jsxs)(`section`,{"data-object":e.id,className:`obj glass${e.style===`alert`?` alert`:``}${a?` overlay`:``}${e.pinned?` pinned`:``}${c?` dragging`:``}${r?` leaving`:``}`,style:a?void 0:dO(l,s),children:[o&&(0,p.jsx)(`div`,{className:`obj-grip`,role:`button`,tabIndex:0,"aria-label":`Move ${e.id}. Drag, or use the arrow keys; hold Shift to resize.`,onPointerDown:t=>D.begin(t,e,`move`),onPointerMove:D.move,onPointerUp:e=>D.end(e,!1),onPointerCancel:e=>D.end(e,!0),onKeyDown:t=>D.key(t,e)}),!a&&(0,p.jsx)(`button`,{className:`obj-pin${e.pinned?` on`:``}`,"aria-label":e.pinned?`Unpin ${e.id}`:`Pin ${e.id} to the screen`,"aria-pressed":!!e.pinned,title:e.pinned?`Pinned: stays on the screen. Click to unpin.`:`Pin: keep this on the screen.`,disabled:r,onClick:()=>t({type:`stage.pin`,objectId:e.id,pinned:!e.pinned}),children:(0,p.jsx)(`svg`,{width:`14`,height:`14`,viewBox:`0 0 24 24`,fill:e.pinned?`currentColor`:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:(0,p.jsx)(`path`,{d:`M12 17v5M9 3h6l-1 7 3 3H7l3-3-1-7z`})})}),(0,p.jsx)(`button`,{className:`obj-close`,"aria-label":`Dismiss ${e.id}`,title:e.pinned?`Remove this widget`:`Dismiss`,disabled:r,onClick:()=>{t({type:`stage.event`,objectId:e.id,event:`dismiss`}),n({type:`object.dismiss`,id:e.id})},children:`×`}),o&&(0,p.jsx)(`div`,{className:`obj-resize`,"aria-hidden":`true`,onPointerDown:t=>D.begin(t,e,`resize`),onPointerMove:D.move,onPointerUp:e=>D.end(e,!1),onPointerCancel:e=>D.end(e,!0)}),(0,p.jsx)(mO,{children:(0,p.jsx)(i,{props:e.props})})]},e.id)};return(0,p.jsxs)(`div`,{ref:E,"data-testid":`stage`,className:`stage`,style:v,onPointerDown:w,onPointerUp:e=>T(e,!1),onPointerCancel:e=>T(e,!0),onContextMenu:e=>r&&e.preventDefault(),children:[e.look.ambient&&(0,p.jsx)(`div`,{className:`ambient`,"aria-hidden":`true`,style:{opacity:.35+.65*e.mood.intensity}}),(0,p.jsx)(Yx,{state:b,amplitude:S,pulse:e.presence.pulse,mode:g&&!o?`corner`:`full`,accent:e.mood.accent,style:e.presence.style,intensity:e.mood.intensity,scale:e.look.size}),o,(0,p.jsxs)(`div`,{className:h?`objects objects-stack`:`objects`,style:{zIndex:10},children:[A.length>0&&(0,p.jsx)(`div`,{className:`auto-grid`,children:A.map(ee)}),j.map(ee)]}),k.length>0&&(0,p.jsxs)(`div`,{className:`overlay-layer`,"data-testid":`overlay`,children:[(0,p.jsx)(`div`,{className:`overlay-backdrop`,onClick:()=>k.forEach(({object:e})=>{t({type:`stage.event`,objectId:e.id,event:`dismiss`}),n({type:`object.dismiss`,id:e.id})})}),k.map(ee)]}),e.look.captions&&e.captions&&(0,p.jsx)(`p`,{className:`captions captions-${e.look.captionSize}${e.captionDone?` done`:``}`,"aria-live":`polite`,children:e.captions}),m&&r&&!d&&(0,p.jsx)(dC,{voice:r,mode:y,onType:()=>u(e=>e+1),onMenu:()=>a?.()}),(0,p.jsx)(XS,{requestOpen:c,slash:i,onOpenChange:f,onSend:e=>t({type:`chat.send`,text:e}),..._?{hud:_}:{}})]})}function vO(){let e=()=>Math.random().toString(36).slice(2,12)+Date.now().toString(36);try{let t=sessionStorage.getItem(`friend.tab`);return t||(t=e(),sessionStorage.setItem(`friend.tab`,t)),t}catch{return e()}}function yO(){return`${location.protocol===`https:`?`wss`:`ws`}://${location.host}/ws`}function bO(e=yO()){let t=null,n=`connecting`,r=!1,i=0,a=!1,o=vO(),s=null,c=new Set,l=new Set,u=e=>{n=e,l.forEach(t=>t(e))};function d(){if(r)return;u(`connecting`);let n=new WebSocket(`${e}${e.includes(`?`)?`&`:`?`}tab=${o}${a?`&takeover=1`:``}`);t=n,n.onopen=()=>{i=0,a=!1,u(`open`)},n.onmessage=e=>{try{let t=JSON.parse(String(e.data));c.forEach(e=>e(t))}catch{}},n.onclose=e=>{if(!r){if(e.code===4401)return u(`unauthorized`);if(e.code===4409||e.code===4410)return u(`elsewhere`);u(`closed`),s=setTimeout(d,Math.min(500*2**i++,8e3))}},n.onerror=()=>{}}return d(),{send(e){t?.readyState===WebSocket.OPEN&&t.send(JSON.stringify(e))},onMessage(e){return c.add(e),()=>c.delete(e)},onState(e){return l.add(e),()=>l.delete(e)},state:()=>n,takeOver(){r||n!==`elsewhere`||(a=!0,i=0,d())},close(){r=!0,s&&clearTimeout(s),t?.close()}}}var xO={scene:`conversation`,objects:[],captions:``,captionDone:!0,presence:{state:`idle`,style:`sphere`,amplitude:0,pulse:0},mood:{accent:`#3fd8ff`,intensity:.6},approval:null,alerts:[],connection:`connecting`,chat:[],chatLive:!1,view:`companion`,look:{size:1,reactivity:.7,ambient:!0,captions:!0,captionSize:`medium`},viewKnown:!1,busy:!1,activity:null,deviceOnline:!1,voice:{mode:`idle`,level:0,available:!1,enrolled:!1},challenge:null,camera:{enabled:!1,stream:null},speaker:null,ownerName:``,assistantName:``,hud:null,music:null,hostMusic:null,musicCmd:null,uiOpen:null,stats:null,office:{enabled:!1,workers:[],tickets:[],quota:{fiveHour:null,sevenDay:null},feed:{}}},SO=200,CO=e=>e.length>SO?e.slice(-200):e,wO=0,TO=e=>Math.min(1,Math.max(0,e));function EO(e,t){switch(t.cmd){case`scene`:return{...e,scene:t.mode};case`show`:{let n=e.objects.findIndex(e=>e.id===t.object.id),r=n===-1?[...e.objects,t.object]:e.objects.map((e,r)=>r===n?t.object:e);return{...e,objects:r}}case`update`:return{...e,objects:e.objects.map(e=>e.id===t.id?{...e,props:{...e.props,...t.props}}:e)};case`hide`:return{...e,objects:e.objects.filter(e=>e.id!==t.id)};case`clear`:return{...e,objects:e.objects.filter(e=>e.pinned),scene:`conversation`};case`pin`:return{...e,objects:e.objects.map(e=>e.id===t.id?{...e,pinned:!0}:e)};case`unpin`:return{...e,objects:e.objects.map(e=>e.id===t.id?(({pinned:e,...t})=>t)(e):e)};case`place`:return{...e,objects:e.objects.map(e=>e.id===t.id?{...e,placement:t.placement}:e)};case`presence`:return{...e,presence:{...e.presence,state:t.state??e.presence.state,style:t.style??e.presence.style}};case`mood`:return{...e,mood:{accent:t.accent??e.mood.accent,intensity:t.intensity??e.mood.intensity}}}}function DO(e,t){let n=t;if(n&&typeof n==`object`){if(n.type===`conn`)return{...e,connection:n.value};if(n.type===`chat.seed`){let t=Array.isArray(n.lines)?n.lines:[];return e.chat.length===0?{...e,chat:CO(t)}:{...e,chat:CO([...t,...e.chat])}}if(n.type===`alert.add`)return{...e,alerts:[...e.alerts.slice(-3),{id:++wO,level:n.level,text:n.text}]};if(n.type===`camera.enable`)return{...e,camera:{enabled:n.value,stream:n.value?e.camera.stream:null}};if(n.type===`camera.open`)return{...e,camera:{...e.camera,stream:n.stream}};if(n.type===`camera.closed`)return{...e,camera:{...e.camera,stream:null}};if(n.type===`challenge.dismiss`)return e.challenge?.id===n.id?{...e,challenge:null}:e;if(n.type===`voice.mode`)return{...e,voice:{...e.voice,mode:n.mode,level:n.mode===`idle`?0:e.voice.level}};if(n.type===`voice.level`){let t=Number.isFinite(n.level)?Math.min(1,Math.max(0,n.level)):0;return{...e,voice:{...e.voice,level:t}}}if(n.type===`object.dismiss`)return{...e,objects:e.objects.filter(e=>e.id!==n.id)};if(n.type===`object.place`)return{...e,objects:e.objects.map(e=>e.id===n.id?{...e,placement:n.placement}:e)};if(n.type===`alert.dismiss`)return{...e,alerts:e.alerts.filter(e=>e.id!==n.id)}}let r=Yu.safeParse(t);if(!r.success)return e;let i=r.data;switch(i.type){case`snapshot`:return{...e,scene:i.stage.scene,objects:i.stage.objects,presence:{...e.presence,state:i.stage.presence.state,style:i.stage.presence.style},mood:i.stage.mood,approval:i.pendingApproval??null};case`stage`:return EO(e,i.command);case`chat.user`:return{...e,chat:CO([...e.chat,{role:`user`,text:i.text}]),chatLive:!1};case`ui.open`:return{...e,uiOpen:{n:(e.uiOpen?.n??0)+1,...i.integration?{integration:i.integration}:{}}};case`ui`:return{...e,view:i.view,look:i.look??e.look,ownerName:i.ownerName??e.ownerName,assistantName:i.assistantName??e.assistantName,hud:i.hud??e.hud,music:i.music??e.music,viewKnown:!0};case`music.host`:return{...e,hostMusic:i.state};case`music.command`:{let{type:t,...n}=i;return{...e,musicCmd:{n:(e.musicCmd?.n??0)+1,command:n}}}case`caption.delta`:{let t=e.captionDone,n=e.chat.at(-1),r=e.chatLive&&n?.role===`assistant`?[...e.chat.slice(0,-1),{role:`assistant`,text:n.text+i.text}]:CO([...e.chat,{role:`assistant`,text:i.text}]);return{...e,chat:r,chatLive:!0,captions:(t?``:e.captions)+i.text,captionDone:!1,presence:{...e.presence,amplitude:TO(.3+i.text.length*.04),pulse:e.presence.pulse+1}}}case`caption.end`:return{...e,chatLive:!1,captionDone:!0,presence:{...e.presence,amplitude:0}};case`approval.request`:{let{type:t,...n}=i;return{...e,approval:n}}case`approval.resolved`:return e.approval?.id===i.id?{...e,approval:null}:e;case`alert`:return{...e,alerts:[...e.alerts.slice(-3),{id:++wO,level:i.level,text:i.text}]};case`activity`:return{...e,activity:i.text};case`office.state`:{let t={};for(let n of i.workers)e.office.feed[n.id]&&(t[n.id]=e.office.feed[n.id]);return{...e,office:{enabled:i.enabled,workers:i.workers,tickets:i.tickets,quota:i.quota,feed:t}}}case`office.feed`:{if(!e.office.workers.some(e=>e.id===i.workerId))return e;let t={at:i.at,kind:i.kind,text:i.text},n=[...e.office.feed[i.workerId]??[],t].slice(-60);return{...e,office:{...e.office,feed:{...e.office.feed,[i.workerId]:n}}}}case`hud.stats`:return{...e,stats:{cpu:i.cpu,ramUsed:i.ramUsed,ramTotal:i.ramTotal,netDown:i.netDown,netUp:i.netUp,at:Date.now()}};case`status`:return{...e,busy:i.busy,activity:i.busy?e.activity:null,deviceOnline:i.deviceOnline,voice:{...e.voice,available:i.voiceAvailable??e.voice.available,enrolled:i.voiceEnrolled??e.voice.enrolled}};case`error`:return{...e,alerts:[...e.alerts.slice(-3),{id:++wO,level:`error`,text:i.message}]};case`voice.heard`:return{...e,captions:i.trust===`guest`?`Guest: ${i.text}`:i.trust===`member`&&i.speaker?`${i.speaker}: ${i.text}`:i.text,captionDone:!0,speaker:{name:i.trust===`member`?i.speaker??null:null,trust:i.trust??`unverified`,seq:(e.speaker?.seq??0)+1}};case`voice.challenge`:return{...e,challenge:{id:i.id,text:i.text}};case`voice.challenge.end`:return e.challenge?.id===i.id?{...e,challenge:null}:e;case`audio.chunk`:case`audio.stop`:case`audio.duck`:return e;case`camera.request`:case`camera.cancel`:case`screen.request`:case`screen.cancel`:return e}}var OO=1024,kO=.8,AO=300;function jO(e,t){let n=Math.min(1,OO/Math.max(e,t));return{width:Math.round(e*n),height:Math.round(t*n)}}function MO(e){let t=e?.name;return t===`NotAllowedError`||t===`SecurityError`?`permission`:t===`NotFoundError`||t===`OverconstrainedError`?`no-camera`:`busy`}async function NO(){if(!navigator.mediaDevices?.getUserMedia)throw Object.assign(Error(`This browser cannot use the camera here (use localhost or HTTPS).`),{name:`NotFoundError`});return navigator.mediaDevices.getUserMedia({video:{width:{ideal:1280}},audio:!1})}async function PO(e,t=AO){let n=document.createElement(`video`);n.muted=!0,n.playsInline=!0,n.srcObject=e,await n.play(),await new Promise(e=>setTimeout(e,t));let{width:r,height:i}=jO(n.videoWidth||640,n.videoHeight||480),a=document.createElement(`canvas`);return a.width=r,a.height=i,a.getContext(`2d`).drawImage(n,0,0,r,i),n.srcObject=null,new Promise((e,t)=>a.toBlob(n=>n?e(n):t(Error(`Could not encode the picture.`)),`image/jpeg`,kO))}var FO=class{opts;active=null;constructor(e){this.opts=e}async handle(e){if(e.type===`camera.cancel`){let t=this.active;t&&t.id===e.id&&(t.cancelled=!0,this.release(t));return}if(!this.opts.enabled())return this.opts.send({type:`camera.denied`,id:e.id,reason:`off`});if(this.active)return this.opts.send({type:`camera.denied`,id:e.id,reason:`busy`});let t={id:e.id,cancelled:!1,stream:null,opened:!1,released:!1};this.active=t;try{let n=await(this.opts.open??NO)();if(t.stream=n,t.cancelled){n.getTracks().forEach(e=>e.stop());return}t.opened=!0,this.opts.dispatch({type:`camera.open`,stream:n});let r=await(this.opts.frame??(e=>PO(e)))(n);if(t.cancelled)return;this.release(t);try{await this.opts.upload(e.id,r)}catch{this.opts.dispatch({type:`alert.add`,level:`warn`,text:`Could not send the camera picture to Friend.`})}}catch(n){t.cancelled||this.opts.send({type:`camera.denied`,id:e.id,reason:MO(n)})}finally{this.release(t),this.active===t&&(this.active=null)}}dispose(){let e=this.active;e&&(e.cancelled=!0,this.release(e))}release(e){e.released||(e.released=!0,e.stream?.getTracks().forEach(e=>e.stop()),e.opened&&this.opts.dispatch({type:`camera.closed`}))}};function IO(e,t){if(e.match(/^[a-z]+:\/\//i))return e;if(e.match(/^\/\//))return window.location.protocol+e;if(e.match(/^[a-z]+:/i))return e;let n=document.implementation.createHTMLDocument(),r=n.createElement(`base`),i=n.createElement(`a`);return n.head.appendChild(r),n.body.appendChild(i),t&&(r.href=t),i.href=e,i.href}var LO=(()=>{let e=0,t=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return()=>(e+=1,`u${t()}${e}`)})();function RO(e){let t=[];for(let n=0,r=e.length;n<r;n++)t.push(e[n]);return t}var zO=null;function BO(e={}){return zO||(e.includeStyleProperties?(zO=e.includeStyleProperties,zO):(zO=RO(window.getComputedStyle(document.documentElement)),zO))}function VO(e,t){let n=(e.ownerDocument.defaultView||window).getComputedStyle(e).getPropertyValue(t);return n?parseFloat(n.replace(`px`,``)):0}function HO(e){let t=VO(e,`border-left-width`),n=VO(e,`border-right-width`);return e.clientWidth+t+n}function UO(e){let t=VO(e,`border-top-width`),n=VO(e,`border-bottom-width`);return e.clientHeight+t+n}function WO(e,t={}){return{width:t.width||HO(e),height:t.height||UO(e)}}function GO(){let e,t;try{t=process}catch{}let n=t&&t.env?t.env.devicePixelRatio:null;return n&&(e=parseInt(n,10),Number.isNaN(e)&&(e=1)),e||window.devicePixelRatio||1}var KO=16384;function qO(e){(e.width>KO||e.height>KO)&&(e.width>KO&&e.height>KO?e.width>e.height?(e.height*=KO/e.width,e.width=KO):(e.width*=KO/e.height,e.height=KO):e.width>KO?(e.height*=KO/e.width,e.width=KO):(e.width*=KO/e.height,e.height=KO))}function JO(e){return new Promise((t,n)=>{let r=new Image;r.onload=()=>{r.decode().then(()=>{requestAnimationFrame(()=>t(r))})},r.onerror=n,r.crossOrigin=`anonymous`,r.decoding=`async`,r.src=e})}async function YO(e){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(e)).then(encodeURIComponent).then(e=>`data:image/svg+xml;charset=utf-8,${e}`)}async function XO(e,t,n){let r=`http://www.w3.org/2000/svg`,i=document.createElementNS(r,`svg`),a=document.createElementNS(r,`foreignObject`);return i.setAttribute(`width`,`${t}`),i.setAttribute(`height`,`${n}`),i.setAttribute(`viewBox`,`0 0 ${t} ${n}`),a.setAttribute(`width`,`100%`),a.setAttribute(`height`,`100%`),a.setAttribute(`x`,`0`),a.setAttribute(`y`,`0`),a.setAttribute(`externalResourcesRequired`,`true`),i.appendChild(a),a.appendChild(e),YO(i)}var ZO=(e,t)=>{if(e instanceof t)return!0;let n=Object.getPrototypeOf(e);return n===null?!1:n.constructor.name===t.name||ZO(n,t)};function QO(e){let t=e.getPropertyValue(`content`);return`${e.cssText} content: '${t.replace(/'|"/g,``)}';`}function $O(e,t){return BO(t).map(t=>`${t}: ${e.getPropertyValue(t)}${e.getPropertyPriority(t)?` !important`:``};`).join(` `)}function ek(e,t,n,r){let i=`.${e}:${t}`,a=n.cssText?QO(n):$O(n,r);return document.createTextNode(`${i}{${a}}`)}function tk(e,t,n,r){let i=window.getComputedStyle(e,n),a=i.getPropertyValue(`content`);if(a===``||a===`none`)return;let o=LO();try{t.className=`${t.className} ${o}`}catch{return}let s=document.createElement(`style`);s.appendChild(ek(o,n,i,r)),t.appendChild(s)}function nk(e,t,n){tk(e,t,`:before`,n),tk(e,t,`:after`,n)}var rk=`application/font-woff`,ik=`image/jpeg`,ak={woff:rk,woff2:rk,ttf:`application/font-truetype`,eot:`application/vnd.ms-fontobject`,png:`image/png`,jpg:ik,jpeg:ik,gif:`image/gif`,tiff:`image/tiff`,svg:`image/svg+xml`,webp:`image/webp`};function ok(e){let t=/\.([^./]*?)$/g.exec(e);return t?t[1]:``}function sk(e){return ak[ok(e).toLowerCase()]||``}function ck(e){return e.split(/,/)[1]}function lk(e){return e.search(/^(data:)/)!==-1}function uk(e,t){return`data:${t};base64,${e}`}async function dk(e,t,n){let r=await fetch(e,t);if(r.status===404)throw Error(`Resource "${r.url}" not found`);let i=await r.blob();return new Promise((e,t)=>{let a=new FileReader;a.onerror=t,a.onloadend=()=>{try{e(n({res:r,result:a.result}))}catch(e){t(e)}},a.readAsDataURL(i)})}var fk={};function pk(e,t,n){let r=e.replace(/\?.*/,``);return n&&(r=e),/ttf|otf|eot|woff2?/i.test(r)&&(r=r.replace(/.*\//,``)),t?`[${t}]${r}`:r}async function mk(e,t,n){let r=pk(e,t,n.includeQueryParams);if(fk[r]!=null)return fk[r];n.cacheBust&&(e+=(/\?/.test(e)?`&`:`?`)+new Date().getTime());let i;try{i=uk(await dk(e,n.fetchRequestInit,({res:e,result:n})=>(t||=e.headers.get(`Content-Type`)||``,ck(n))),t)}catch(t){i=n.imagePlaceholder||``;let r=`Failed to fetch resource: ${e}`;t&&(r=typeof t==`string`?t:t.message),r&&console.warn(r)}return fk[r]=i,i}async function hk(e){let t=e.toDataURL();return t===`data:,`?e.cloneNode(!1):JO(t)}async function gk(e,t){if(e.currentSrc){let t=document.createElement(`canvas`),n=t.getContext(`2d`);return t.width=e.clientWidth,t.height=e.clientHeight,n?.drawImage(e,0,0,t.width,t.height),JO(t.toDataURL())}let n=e.poster;return JO(await mk(n,sk(n),t))}async function _k(e,t){try{if(e?.contentDocument?.body)return await Dk(e.contentDocument.body,t,!0)}catch{}return e.cloneNode(!1)}async function vk(e,t){return ZO(e,HTMLCanvasElement)?hk(e):ZO(e,HTMLVideoElement)?gk(e,t):ZO(e,HTMLIFrameElement)?_k(e,t):e.cloneNode(bk(e))}var yk=e=>e.tagName!=null&&e.tagName.toUpperCase()===`SLOT`,bk=e=>e.tagName!=null&&e.tagName.toUpperCase()===`SVG`;async function xk(e,t,n){if(bk(t))return t;let r=[];return r=yk(e)&&e.assignedNodes?RO(e.assignedNodes()):ZO(e,HTMLIFrameElement)&&e.contentDocument?.body?RO(e.contentDocument.body.childNodes):RO((e.shadowRoot??e).childNodes),r.length===0||ZO(e,HTMLVideoElement)||await r.reduce((e,r)=>e.then(()=>Dk(r,n)).then(e=>{e&&t.appendChild(e)}),Promise.resolve()),t}function Sk(e,t,n){let r=t.style;if(!r)return;let i=window.getComputedStyle(e);i.cssText?(r.cssText=i.cssText,r.transformOrigin=i.transformOrigin):BO(n).forEach(n=>{let a=i.getPropertyValue(n);n===`font-size`&&a.endsWith(`px`)&&(a=`${Math.floor(parseFloat(a.substring(0,a.length-2)))-.1}px`),ZO(e,HTMLIFrameElement)&&n===`display`&&a===`inline`&&(a=`block`),n===`d`&&t.getAttribute(`d`)&&(a=`path(${t.getAttribute(`d`)})`),r.setProperty(n,a,i.getPropertyPriority(n))})}function Ck(e,t){ZO(e,HTMLTextAreaElement)&&(t.innerHTML=e.value),ZO(e,HTMLInputElement)&&t.setAttribute(`value`,e.value)}function wk(e,t){if(ZO(e,HTMLSelectElement)){let n=t,r=Array.from(n.children).find(t=>e.value===t.getAttribute(`value`));r&&r.setAttribute(`selected`,``)}}function Tk(e,t,n){return ZO(t,Element)&&(Sk(e,t,n),nk(e,t,n),Ck(e,t),wk(e,t)),t}async function Ek(e,t){let n=e.querySelectorAll?e.querySelectorAll(`use`):[];if(n.length===0)return e;let r={};for(let i=0;i<n.length;i++){let a=n[i].getAttribute(`xlink:href`);if(a){let n=e.querySelector(a),i=document.querySelector(a);!n&&i&&!r[a]&&(r[a]=await Dk(i,t,!0))}}let i=Object.values(r);if(i.length){let t=`http://www.w3.org/1999/xhtml`,n=document.createElementNS(t,`svg`);n.setAttribute(`xmlns`,t),n.style.position=`absolute`,n.style.width=`0`,n.style.height=`0`,n.style.overflow=`hidden`,n.style.display=`none`;let r=document.createElementNS(t,`defs`);n.appendChild(r);for(let e=0;e<i.length;e++)r.appendChild(i[e]);e.appendChild(n)}return e}async function Dk(e,t,n){return!n&&t.filter&&!t.filter(e)?null:Promise.resolve(e).then(e=>vk(e,t)).then(n=>xk(e,n,t)).then(n=>Tk(e,n,t)).then(e=>Ek(e,t))}var Ok=/url\((['"]?)([^'"]+?)\1\)/g,kk=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,Ak=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function jk(e){let t=e.replace(/([.*+?^${}()|\[\]\/\\])/g,`\\$1`);return RegExp(`(url\\(['"]?)(${t})(['"]?\\))`,`g`)}function Mk(e){let t=[];return e.replace(Ok,(e,n,r)=>(t.push(r),e)),t.filter(e=>!lk(e))}async function Nk(e,t,n,r,i){try{let a=n?IO(t,n):t,o=sk(t),s;return s=i?uk(await i(a),o):await mk(a,o,r),e.replace(jk(t),`$1${s}$3`)}catch{}return e}function Pk(e,{preferredFontFormat:t}){return t?e.replace(Ak,e=>{for(;;){let[n,,r]=kk.exec(e)||[];if(!r)return``;if(r===t)return`src: ${n};`}}):e}function Fk(e){return e.search(Ok)!==-1}async function Ik(e,t,n){if(!Fk(e))return e;let r=Pk(e,n);return Mk(r).reduce((e,r)=>e.then(e=>Nk(e,r,t,n)),Promise.resolve(r))}async function Lk(e,t,n){let r=t.style?.getPropertyValue(e);if(r){let i=await Ik(r,null,n);return t.style.setProperty(e,i,t.style.getPropertyPriority(e)),!0}return!1}async function Rk(e,t){await Lk(`background`,e,t)||await Lk(`background-image`,e,t),await Lk(`mask`,e,t)||await Lk(`-webkit-mask`,e,t)||await Lk(`mask-image`,e,t)||await Lk(`-webkit-mask-image`,e,t)}async function zk(e,t){let n=ZO(e,HTMLImageElement);if((!n||lk(e.src))&&(!ZO(e,SVGImageElement)||lk(e.href.baseVal)))return;let r=n?e.src:e.href.baseVal,i=await mk(r,sk(r),t);await new Promise((r,a)=>{e.onload=r,e.onerror=t.onImageErrorHandler?(...e)=>{try{r(t.onImageErrorHandler(...e))}catch(e){a(e)}}:a;let o=e;o.decode&&=r,o.loading===`lazy`&&(o.loading=`eager`),n?(e.srcset=``,e.src=i):e.href.baseVal=i})}async function Bk(e,t){let n=RO(e.childNodes).map(e=>Vk(e,t));await Promise.all(n).then(()=>e)}async function Vk(e,t){ZO(e,Element)&&(await Rk(e,t),await zk(e,t),await Bk(e,t))}function Hk(e,t){let{style:n}=e;t.backgroundColor&&(n.backgroundColor=t.backgroundColor),t.width&&(n.width=`${t.width}px`),t.height&&(n.height=`${t.height}px`);let r=t.style;return r!=null&&Object.keys(r).forEach(e=>{n[e]=r[e]}),e}var Uk={};async function Wk(e){let t=Uk[e];return t??(t={url:e,cssText:await(await fetch(e)).text()},Uk[e]=t,t)}async function Gk(e,t){let n=e.cssText,r=/url\(["']?([^"')]+)["']?\)/g,i=(n.match(/url\([^)]+\)/g)||[]).map(async i=>{let a=i.replace(r,`$1`);return a.startsWith(`https://`)||(a=new URL(a,e.url).href),dk(a,t.fetchRequestInit,({result:e})=>(n=n.replace(i,`url(${e})`),[i,e]))});return Promise.all(i).then(()=>n)}function Kk(e){if(e==null)return[];let t=[],n=e.replace(/(\/\*[\s\S]*?\*\/)/gi,``),r=RegExp(`((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})`,`gi`);for(;;){let e=r.exec(n);if(e===null)break;t.push(e[0])}n=n.replace(r,``);let i=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,a=RegExp(`((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})`,`gi`);for(;;){let e=i.exec(n);if(e===null){if(e=a.exec(n),e===null)break;i.lastIndex=a.lastIndex}else a.lastIndex=i.lastIndex;t.push(e[0])}return t}async function qk(e,t){let n=[],r=[];return e.forEach(n=>{if(`cssRules`in n)try{RO(n.cssRules||[]).forEach((e,i)=>{if(e.type===CSSRule.IMPORT_RULE){let a=i+1,o=e.href,s=Wk(o).then(e=>Gk(e,t)).then(e=>Kk(e).forEach(e=>{try{n.insertRule(e,e.startsWith(`@import`)?a+=1:n.cssRules.length)}catch(t){console.error(`Error inserting rule from remote css`,{rule:e,error:t})}})).catch(e=>{console.error(`Error loading remote css`,e.toString())});r.push(s)}})}catch(i){let a=e.find(e=>e.href==null)||document.styleSheets[0];n.href!=null&&r.push(Wk(n.href).then(e=>Gk(e,t)).then(e=>Kk(e).forEach(e=>{a.insertRule(e,a.cssRules.length)})).catch(e=>{console.error(`Error loading remote stylesheet`,e)})),console.error(`Error inlining remote css file`,i)}}),Promise.all(r).then(()=>(e.forEach(e=>{if(`cssRules`in e)try{RO(e.cssRules||[]).forEach(e=>{n.push(e)})}catch(t){console.error(`Error while reading CSS rules from ${e.href}`,t)}}),n))}function Jk(e){return e.filter(e=>e.type===CSSRule.FONT_FACE_RULE).filter(e=>Fk(e.style.getPropertyValue(`src`)))}async function Yk(e,t){if(e.ownerDocument==null)throw Error(`Provided element is not within a Document`);return Jk(await qk(RO(e.ownerDocument.styleSheets),t))}function Xk(e){return e.trim().replace(/["']/g,``)}function Zk(e){let t=new Set;function n(e){(e.style.fontFamily||getComputedStyle(e).fontFamily).split(`,`).forEach(e=>{t.add(Xk(e))}),Array.from(e.children).forEach(e=>{e instanceof HTMLElement&&n(e)})}return n(e),t}async function Qk(e,t){let n=await Yk(e,t),r=Zk(e);return(await Promise.all(n.filter(e=>r.has(Xk(e.style.fontFamily))).map(e=>{let n=e.parentStyleSheet?e.parentStyleSheet.href:null;return Ik(e.cssText,n,t)}))).join(`
|
|
4459
|
-
`)}async function $k(e,t){let n=t.fontEmbedCSS==null?t.skipFonts?null:await Qk(e,t):t.fontEmbedCSS;if(n){let t=document.createElement(`style`),r=document.createTextNode(n);t.appendChild(r),e.firstChild?e.insertBefore(t,e.firstChild):e.appendChild(t)}}async function eA(e,t={}){let{width:n,height:r}=WO(e,t),i=await Dk(e,t,!0);return await $k(i,t),await Vk(i,t),Hk(i,t),await XO(i,n,r)}async function tA(e,t={}){let{width:n,height:r}=WO(e,t),i=await JO(await eA(e,t)),a=document.createElement(`canvas`),o=a.getContext(`2d`),s=t.pixelRatio||GO(),c=t.canvasWidth||n,l=t.canvasHeight||r;return a.width=c*s,a.height=l*s,t.skipAutoScale||qO(a),a.style.width=`${c}`,a.style.height=`${l}`,t.backgroundColor&&(o.fillStyle=t.backgroundColor,o.fillRect(0,0,a.width,a.height)),o.drawImage(i,0,0,a.width,a.height),a}var nA=1600,rA=.85;function iA(e,t){let n=Math.min(1,nA/Math.max(e,t,1));return{width:Math.max(1,Math.round(e*n)),height:Math.max(1,Math.round(t*n))}}async function aA(){let e=document.documentElement.getBoundingClientRect(),t=await tA(document.body,{width:Math.round(e.width),height:Math.round(e.height),pixelRatio:1,backgroundColor:`#050b10`,filter:e=>!(e instanceof HTMLElement&&e.dataset.noCapture!==void 0)}),n=iA(t.width,t.height),r=document.createElement(`canvas`);return r.width=n.width,r.height=n.height,r.getContext(`2d`).drawImage(t,0,0,n.width,n.height),new Promise((e,t)=>r.toBlob(n=>n?e(n):t(Error(`Could not encode the picture.`)),`image/jpeg`,rA))}var oA=class{opts;active=null;constructor(e){this.opts=e}async handle(e){if(e.type===`screen.cancel`){this.active&&this.active.id===e.id&&(this.active.cancelled=!0);return}if(this.active)return this.opts.send({type:`screen.denied`,id:e.id,reason:`busy`});let t={id:e.id,cancelled:!1};this.active=t;try{let n=await(this.opts.capture??aA)();if(t.cancelled)return;try{await this.opts.upload(e.id,n)}catch{this.opts.dispatch({type:`alert.add`,level:`warn`,text:`Could not send the picture of the screen to Friend.`})}}catch(n){t.cancelled||this.opts.send({type:`screen.denied`,id:e.id,reason:sA(n)})}finally{this.active===t&&(this.active=null)}}dispose(){this.active&&(this.active.cancelled=!0)}};function sA(e){return e?.name===`NotSupportedError`?`unsupported`:`failed`}function cA(e,t){let n=(0,l.useRef)(t);n.current=t;let r=(0,l.useRef)(!1),i=(0,l.useRef)(null);(0,l.useEffect)(()=>{let t=e===`listening`||e===`speaking`;i.current&&clearTimeout(i.current),i.current=null,t?r.current||(r.current=!0,n.current({type:`audio.activity`,active:!0})):r.current&&(i.current=setTimeout(()=>{i.current=null,r.current=!1,n.current({type:`audio.activity`,active:!1})},900))},[e]),(0,l.useEffect)(()=>()=>{i.current&&clearTimeout(i.current),r.current&&(r.current=!1,n.current({type:`audio.activity`,active:!1}))},[])}var lA={401:`Please sign in again.`,413:`That recording was too long.`,409:`Friend is busy with the last request. Try again in a moment.`,429:`You're talking too fast. Wait a moment.`,503:`Voice is not available. Run: friend voice setup`};async function uA(e,t,n){let r;try{r=await fetch(e,{method:`POST`,headers:{"content-type":t.type||`audio/webm`},body:t,signal:n})}catch(e){throw e.name===`AbortError`?e:Error(`Could not reach Friend. Check the connection.`)}if(!r.ok){let e=``;try{e=(await r.json()).error??``}catch{}throw Error(e||lA[r.status]||`The voice request failed (${r.status}).`)}let i=await r.json();return{text:typeof i.text==`string`?i.text:``,wake:i.wake===!0}}async function dA(e,t){return{text:(await uA(`/api/voice/utterance`,e,t)).text}}async function fA(e,t){let n=await uA(`/api/voice/utterance?wake=1`,e,t);return{text:n.text,wake:n.wake===!0}}var pA=null;function mA(){try{pA??=new AudioContext,pA.resume().catch(()=>{});let e=pA.currentTime;for(let[t,n]of[660,990].entries()){let r=pA.createOscillator(),i=pA.createGain();r.frequency.value=n,i.gain.setValueAtTime(0,e+t*.11),i.gain.linearRampToValueAtTime(.18,e+t*.11+.02),i.gain.exponentialRampToValueAtTime(.001,e+t*.11+.14),r.connect(i).connect(pA.destination),r.start(e+t*.11),r.stop(e+t*.11+.16)}}catch{}}var hA=/busy with the last request|talking too fast/i,gA=3e4,_A=50,vA=class{deps;listener=null;awakeNow=!1;showing=!1;busyWithOne=!1;clock=null;meter=null;abort=null;lastAlert=0;constructor(e){this.deps=e}get enabled(){return this.listener!==null}get awake(){return this.awakeNow}async enable(){if(this.listener)return;let e=this.deps.makeListener({onUtterance:e=>void this.heard(e),onError:e=>{this.drop(),this.alert(e,!0)}});try{await e.start()}catch(e){this.alert(e.message,!0);return}this.listener=e}disable(){this.drop()}sync(){let e=this.listener;if(!e)return;let t=this.busyOther();if(e.pause(t),!this.awakeNow||t){this.clearClock(),this.stopMeter();return}this.deps.mode()===`idle`&&this.show(),this.clock||this.startClock(),this.startMeter()}busyOther(){let e=this.deps.mode();return e!==`listening`&&(this.showing=!1),e===`speaking`||e===`transcribing`||e===`listening`&&!this.showing}show(){this.showing=!0,this.deps.dispatch({type:`voice.mode`,mode:`listening`})}wakeUp(e){this.awakeNow=!0,e&&this.deps.chime(),this.clearClock(),this.show(),this.startClock(),this.startMeter()}sleep(){this.awakeNow=!1,this.clearClock(),this.stopMeter(),this.showing&&this.deps.dispatch({type:`voice.mode`,mode:`idle`}),this.showing=!1}drop(){let e=this.listener;this.listener=null,this.abort?.abort(),this.abort=null,this.busyWithOne=!1,this.sleep(),e?.stop()}startClock(){this.clearClock(),this.clock=setTimeout(()=>{this.clock=null,this.sleep()},this.deps.awakeMs??3e4)}clearClock(){this.clock&&clearTimeout(this.clock),this.clock=null}startMeter(){this.meter||=setInterval(()=>this.deps.dispatch({type:`voice.level`,level:this.listener?.level()??0}),_A)}stopMeter(){this.meter&&clearInterval(this.meter),this.meter=null}async heard(e){if(!this.listener||this.busyWithOne||this.busyOther())return;this.busyWithOne=!0;let t=new AbortController;this.abort=t;try{this.awakeNow?await this.request(e,t.signal):await this.check(e,t.signal)}catch(e){e.name!==`AbortError`&&!hA.test(e.message)&&this.alert(e.message,!1)}finally{this.abort===t&&(this.abort=null),this.busyWithOne=!1,this.listener&&this.awakeNow&&(this.clearClock(),this.deps.mode()===`transcribing`&&this.deps.dispatch({type:`voice.mode`,mode:`idle`}),this.sync())}}async check(e,t){let n=await this.deps.wake(e,t);this.listener&&n.wake&&this.wakeUp(!n.text)}async request(e,t){this.clearClock(),this.stopMeter(),this.showing=!1,this.deps.dispatch({type:`voice.mode`,mode:`transcribing`}),await this.deps.command(e,t)}alert(e,t){let n=Date.now();!t&&n-this.lastAlert<gA||(this.lastAlert=n,this.deps.dispatch({type:`alert.add`,level:`error`,text:e}))}},yA=0,bA=new Set;function xA(e){return bA.add(e),()=>bA.delete(e)}var SA=e=>bA.forEach(t=>{try{t(e)}catch{}}),CA=e=>/not compatible|audio capture|audiosession/i.test(String(e?.message??e));function wA(e){try{let t=navigator.audioSession;t&&t.type!==e&&(t.type=e)}catch{}}function TA(){yA===0&&wA(`playback`)}function EA(){yA++,yA===1&&SA(!0),wA(`play-and-record`);let e=!1;return()=>{e||(e=!0,yA=Math.max(0,yA-1),yA===0&&(wA(`playback`),SA(!1)))}}var DA=3,OA=.02,kA=.04,AA=class{minSpeechMs;endSilenceMs;maxMs;floor=null;loudSince=null;speaking=!1;startedAt=0;lastLoud=0;lastFeed=0;speechMs=0;constructor(e={}){this.minSpeechMs=e.minSpeechMs??300,this.endSilenceMs=e.endSilenceMs??800,this.maxMs=e.maxMs??8e3}get inSpeech(){return this.speaking}get maybeSpeech(){return this.loudSince!==null}feed(e,t){this.floor===null&&(this.floor=e);let n=e>Math.max(this.floor*DA+OA,kA),r=Math.min(100,Math.max(0,t-this.lastFeed));if(this.lastFeed=t,!this.speaking)return n?(this.loudSince??=t,t-this.loudSince<this.minSpeechMs?null:(this.speaking=!0,this.startedAt=this.loudSince,this.lastLoud=t,this.speechMs=t-this.loudSince,{type:`start`})):(this.loudSince=null,this.floor+=(e-this.floor)*(e<this.floor?.3:.02),null);n&&(this.lastLoud=t,this.speechMs+=r);let i=t-this.startedAt>=this.maxMs;if(!i&&t-this.lastLoud<this.endSilenceMs)return null;let a={type:`end`,ms:t-this.startedAt,speechMs:this.speechMs,forced:i};return this.speaking=!1,this.loudSince=null,i&&n&&(this.floor=e),a}reset(){this.speaking=!1,this.loudSince=null}},jA=[`audio/webm;codecs=opus`,`audio/webm`,`audio/mp4`,`audio/ogg;codecs=opus`],MA=50,NA=2e3,PA=2e3,FA=400,IA=e=>{let t=e?.name;return t===`NotAllowedError`||t===`SecurityError`?`Microphone permission was denied. Allow it in the browser to use hands-free.`:t===`NotFoundError`||t===`OverconstrainedError`?`No microphone was found.`:e?.message||`Could not open the microphone.`},LA=class{opts;stream=null;ctx=null;analyser=null;rec=null;chunks=[];recStartedAt=0;timer=null;seg;leaveSession=null;paused=!1;starting=!1;finishing=!1;opened=!1;now;constructor(e){this.opts=e,this.seg=new AA(e),this.now=e.now??(()=>Date.now())}static supported(){return typeof navigator<`u`&&!!navigator.mediaDevices?.getUserMedia&&typeof MediaRecorder<`u`}get listening(){return this.opened}async start(){if(!(this.opened||this.starting)){this.starting=!0;try{this.leaveSession=EA();try{this.stream=await navigator.mediaDevices.getUserMedia({audio:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}})}catch(e){throw this.leaveSession?.(),this.leaveSession=null,Error(IA(e))}for(let e of this.stream.getTracks())e.onended=()=>this.broke(`The microphone stopped working.`);try{this.ctx=new AudioContext,this.analyser=this.ctx.createAnalyser(),this.analyser.fftSize=1024,this.ctx.createMediaStreamSource(this.stream).connect(this.analyser),this.ctx.resume().catch(()=>{})}catch{throw this.release(),Error(`This browser cannot listen continuously here.`)}this.seg.reset(),this.beginRecording(),this.opened=!0,this.timer=setInterval(()=>this.tick(),MA)}finally{this.starting=!1}}}stop(){this.opened=!1,this.release()}pause(e){this.paused!==e&&(this.paused=e,this.seg.reset(),!e&&this.opened&&this.restartRecording())}level(){if(!this.analyser)return 0;let e=new Uint8Array(this.analyser.fftSize);this.analyser.getByteTimeDomainData(e);let t=0;for(let n of e)t+=((n-128)/128)**2;return Math.min(1,Math.sqrt(t/e.length)*4)}tick(){if(!this.opened)return;let e=this.now();if(this.ctx&&this.ctx.state!==`running`&&this.ctx.resume().catch(()=>{}),this.paused){e-this.recStartedAt>=NA&&this.restartRecording();return}let t=this.seg.feed(this.level(),e);t?.type===`end`?this.finish(t.ms,t.speechMs):!t&&!this.seg.inSpeech&&!this.seg.maybeSpeech&&e-this.recStartedAt>=NA&&this.restartRecording()}beginRecording(){if(!this.stream)return;let e=jA.find(e=>MediaRecorder.isTypeSupported(e));this.chunks=[];let t=new MediaRecorder(this.stream,e?{mimeType:e}:void 0);t.ondataavailable=e=>{e.data&&e.data.size>0&&this.chunks.push(e.data)},t.onerror=()=>this.broke(`The microphone stopped working.`),t.start(250),this.rec=t,this.recStartedAt=this.now()}restartRecording(){let e=this.rec;if(this.rec=null,e){e.ondataavailable=null,e.onstop=null,e.onerror=null;try{e.state!==`inactive`&&e.stop()}catch{}}this.opened&&this.beginRecording()}async finish(e,t){let n=this.rec;if(!n||this.finishing)return;this.finishing=!0;let r=n.mimeType||`audio/webm`,i=await new Promise(e=>{let t=!1,i=()=>{t||(t=!0,e(new Blob(this.chunks,{type:r})))},a=setTimeout(i,PA);n.onstop=()=>{clearTimeout(a),i()};try{n.state===`inactive`?i():n.stop()}catch{i()}});this.finishing=!1,this.rec=null,this.opened&&(this.beginRecording(),!this.paused&&e>=FA&&t>=FA/2&&i.size>0&&this.opts.onUtterance(i))}broke(e){this.opened&&(this.stop(),this.opts.onError(e))}release(){if(this.timer&&clearInterval(this.timer),this.timer=null,this.rec){this.rec.ondataavailable=null,this.rec.onstop=null,this.rec.onerror=null;try{this.rec.state!==`inactive`&&this.rec.stop()}catch{}}this.stream?.getTracks().forEach(e=>{e.onended=null,e.stop()}),this.ctx?.close().catch(()=>{}),this.stream=null,this.ctx=null,this.analyser=null,this.rec=null,this.chunks=[],this.leaveSession?.(),this.leaveSession=null}},RA=4096,zA=8,BA=20,VA=6e6;function HA(e){try{let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}catch{return null}}var UA=class{ctx=null;analyser=null;pending=new Map;queue=[];current=null;busy=!1;gen=0;isPlaying=!1;unwatch=null;listeners=new Set;unlock(){TA();let e=this.ensureContext();e.state!==`running`&&e.resume().catch(()=>{})}locked(){return!this.ctx||this.ctx.state!==`running`}enqueue(e){if(!Number.isInteger(e.seq)||e.seq<0||e.seq>RA)return;let t=HA(e.data);if(!t)return;let n=this.pending.get(e.id);if(n||(this.pending.size>=zA&&this.pending.delete(this.pending.keys().next().value),n={parts:new Map,lastSeq:null,bytes:0},this.pending.set(e.id,n)),n.bytes+=t.length,n.bytes>VA){this.pending.delete(e.id);return}if(n.parts.set(e.seq,t),e.last&&(n.lastSeq=e.seq),n.lastSeq===null||n.parts.size!==n.lastSeq+1)return;this.pending.delete(e.id);let r=new Uint8Array([...n.parts.values()].reduce((e,t)=>e+t.length,0)),i=0;for(let e=0;e<=n.lastSeq;e++){let t=n.parts.get(e);if(!t)return;r.set(t,i),i+=t.length}for(this.queue.push(r.buffer);this.queue.length>BA;)this.queue.shift();this.pump()}stop(){this.gen++,this.queue=[],this.pending.clear(),this.busy=!1;let e=this.current;if(this.current=null,e){e.onended=null;try{e.stop()}catch{}}this.setPlaying(!1)}dispose(){this.stop(),this.ctx?.close().catch(()=>{}),this.unwatch?.(),this.unwatch=null,this.ctx=null,this.analyser=null}playing(){return this.isPlaying}onChange(e){return this.listeners.add(e),()=>this.listeners.delete(e)}level(){if(!this.analyser||!this.isPlaying)return 0;let e=new Uint8Array(this.analyser.fftSize);this.analyser.getByteTimeDomainData(e);let t=0;for(let n of e)t+=((n-128)/128)**2;return Math.min(1,Math.sqrt(t/e.length)*4)}ensureContext(){if(!this.ctx){let e=window.AudioContext??window.webkitAudioContext;this.ctx=new e,this.analyser=this.ctx.createAnalyser(),this.analyser.fftSize=1024,this.analyser.connect(this.ctx.destination);let t=this.ctx;this.unwatch?.(),this.unwatch=xA(e=>{e&&t.state===`running`?t.suspend().catch(()=>{}):!e&&t.state!==`running`&&t.state!==`closed`&&t.resume().catch(()=>{})})}return this.ctx}setPlaying(e){this.isPlaying!==e&&(this.isPlaying=e,this.listeners.forEach(t=>t(e)))}async pump(){if(this.busy)return;let e=this.queue.shift();if(!e){this.setPlaying(!1);return}this.busy=!0;let t=this.gen;try{let n=this.ensureContext();if(n.state!==`running`){try{await n.resume()}catch{}if(t!==this.gen)return;if(n.state!==`running`){this.queue.unshift(e),this.busy=!1;return}}let r=await n.decodeAudioData(e);if(t!==this.gen)return;let i=n.createBufferSource();i.buffer=r,i.connect(this.analyser),i.onended=()=>{this.current===i&&(this.current=null,this.busy=!1,this.pump())},this.current=i,this.setPlaying(!0),i.start()}catch{if(t!==this.gen)return;this.busy=!1,this.pump()}}},WA=e=>new Promise(t=>setTimeout(t,e)),GA=[`audio/webm;codecs=opus`,`audio/webm`,`audio/mp4`,`audio/ogg;codecs=opus`],KA=3e3;function qA(e){let t=e;return t?.name===`NotAllowedError`||t?.name===`SecurityError`?Error(`Microphone permission was denied. Allow it in the browser to talk.`):t?.name===`NotFoundError`||t?.name===`OverconstrainedError`?Error(`No microphone was found.`):Error(t?.message||`Could not open the microphone.`)}var JA=class e{opts;stream=null;rec=null;chunks=[];ctx=null;analyser=null;timer=null;starting=!1;leaveSession=null;constructor(e={}){this.opts=e}static supported(){return typeof navigator<`u`&&!!navigator.mediaDevices?.getUserMedia&&typeof MediaRecorder<`u`}get active(){return this.rec!==null}async start(){if(!(this.rec||this.starting)){if(!e.supported())throw Error(`This browser cannot record audio here (use localhost or HTTPS).`);this.starting=!0;try{this.leaveSession=EA();try{let e=()=>navigator.mediaDevices.getUserMedia({audio:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}});try{this.stream=await e()}catch(t){if(!CA(t))throw t;await WA(250),this.leaveSession?.(),this.leaveSession=EA(),this.stream=await e()}}catch(e){throw this.leaveSession?.(),this.leaveSession=null,qA(e)}try{let e=GA.find(e=>MediaRecorder.isTypeSupported(e));this.chunks=[];let t=new MediaRecorder(this.stream,e?{mimeType:e}:void 0);t.ondataavailable=e=>{e.data&&e.data.size>0&&this.chunks.push(e.data)},t.onerror=()=>this.failed();for(let e of this.stream.getTracks())e.onended=()=>this.failed();this.openMeter(this.stream),t.start(250),this.rec=t,this.opts.maxMs&&(this.timer=setTimeout(()=>{this.timer=null,this.opts.onLimit?.()},this.opts.maxMs))}catch(e){throw this.release(),qA(e)}}finally{this.starting=!1}}}stop(){let e=this.rec;return e?new Promise(t=>{let n=!1,r=null,i=()=>{if(n)return;n=!0,r&&clearTimeout(r);let i=new Blob(this.chunks,{type:e.mimeType||`audio/webm`});this.release(),t(i)};if(r=setTimeout(i,KA),e.onstop=i,e.state===`inactive`)return i();try{e.stop()}catch{i()}}):Promise.reject(Error(`Not recording.`))}cancel(){let e=this.rec;if(e){e.ondataavailable=null,e.onstop=null,e.onerror=null;try{e.state!==`inactive`&&e.stop()}catch{}}this.release()}level(){if(!this.analyser||!this.rec)return 0;let e=new Uint8Array(this.analyser.fftSize);this.analyser.getByteTimeDomainData(e);let t=0;for(let n of e)t+=((n-128)/128)**2;return Math.min(1,Math.sqrt(t/e.length)*4)}failed(){this.rec&&(this.cancel(),this.opts.onError?.())}openMeter(e){try{this.ctx=new AudioContext,this.analyser=this.ctx.createAnalyser(),this.analyser.fftSize=1024,this.ctx.createMediaStreamSource(e).connect(this.analyser)}catch{this.analyser=null}}release(){this.timer&&clearTimeout(this.timer),this.timer=null,this.stream?.getTracks().forEach(e=>{e.onended=null,e.stop()}),this.ctx?.close().catch(()=>{}),this.stream=null,this.rec=null,this.ctx=null,this.analyser=null,this.chunks=[],this.leaveSession?.(),this.leaveSession=null}},YA=2e3,XA=()=>typeof window<`u`&&window.isSecureContext===!1,ZA=50,QA=class{deps;recorder;player;mode=`idle`;pressed=!1;disposed=!1;uploads=0;toldAboutSound=!1;quiet=!1;abort=null;poll=null;unsubscribe;constructor(e){this.deps=e;let t=()=>this.recorderFailed();this.recorder=e.recorder??e.makeRecorder?.(t)??new JA({maxMs:6e4,onLimit:()=>void this.pressEnd(),onError:t}),this.player=e.player??new UA,this.unsubscribe=this.player.onChange(e=>{this.mode!==`listening`&&this.mode!==`transcribing`&&this.setMode(e?`speaking`:`idle`)})}async pressStart(){if(!(this.pressed||this.disposed)){if(!this.deps.available()){this.alert(`warn`,`Voice is not available. Run: friend voice setup`);return}if(!(this.deps.supported?.()??JA.supported())){this.alert(`warn`,XA()?`This page is not secure, so the browser blocks the microphone. On the PC run: friend lan https on, restart Friend, and open the https:// address.`:`This browser cannot record audio here (use localhost or HTTPS).`);return}this.pressed=!0,this.player.unlock(),this.player.playing()&&(this.deps.send({type:`voice.interrupt`}),this.player.stop());try{await this.recorder.start()}catch(e){this.pressed=!1,this.alert(`error`,e.message),this.setMode(`idle`);return}if(!this.pressed){this.recorder.cancel(),this.setMode(`idle`);return}this.setMode(`listening`)}}async pressEnd(){if(!this.pressed||(this.pressed=!1,!this.recorder.active))return;let e=await this.recorder.stop();if(e.size<YA){this.alert(`info`,`Hold the key a little longer while you speak.`),this.setMode(`idle`);return}this.setMode(`transcribing`);let t=new AbortController;this.abort=t,this.uploads++;try{let{text:n}=await this.deps.post(e,t.signal);n.trim()||this.alert(`info`,`I didn't catch that.`)}catch(e){e.name!==`AbortError`&&this.alert(`error`,e.message)}finally{this.uploads--,this.abort===t&&(this.abort=null),this.settle()}}blur(){this.pressed&&(this.pressed=!1,this.recorder.cancel(),this.setMode(`idle`))}setQuiet(e){this.quiet=e,e&&this.player.stop()}handleServer(e){if(e.type!==`audio.chunk`)return this.player.stop();this.quiet||(this.player.enqueue(e),!this.toldAboutSound&&this.player.locked?.()&&(this.toldAboutSound=!0,this.deps.dispatch({type:`alert.add`,level:`info`,text:`Sound is blocked by the browser. Click or press a key once anywhere on the page to hear me.`})))}unlock(){this.player.unlock()}dispose(){this.disposed=!0,this.pressed=!1,this.stopPolling(),this.abort?.abort(),this.recorder.cancel(),this.player.stop(),this.player.dispose?.(),this.unsubscribe()}recorderFailed(){this.pressed=!1,this.recorder.cancel(),this.alert(`error`,`The microphone stopped working.`),this.setMode(`idle`)}settle(){this.uploads>0||this.mode!==`transcribing`||this.setMode(this.player.playing()?`speaking`:`idle`)}setMode(e){this.disposed||(this.mode=e,this.deps.dispatch({type:`voice.mode`,mode:e}),e===`listening`||e===`speaking`?this.startPolling():this.stopPolling())}startPolling(){this.stopPolling(),this.poll=setInterval(()=>{let e=this.mode===`listening`?this.recorder.level():this.player.level();this.deps.dispatch({type:`voice.level`,level:e})},ZA)}stopPolling(){this.poll&&clearInterval(this.poll),this.poll=null}alert(e,t){this.disposed||this.deps.dispatch({type:`alert.add`,level:e,text:t})}};function $A(e){let[t,n]=(0,l.useReducer)(DO,xO),r=(0,l.useRef)(null),i=(0,l.useRef)(null),a=(0,l.useRef)(!1),o=(0,l.useRef)(null),s=(0,l.useRef)(null),[c,u]=(0,l.useState)(!1),d=(0,l.useRef)(e);d.current=e;let f=(0,l.useRef)(t);f.current=t,(0,l.useEffect)(()=>{let e=bO();r.current=e;let t=new QA({send:t=>e.send(t),dispatch:e=>n(e),post:dA,available:()=>f.current.voice.available});i.current=t,t.setQuiet(a.current);let c=new vA({makeListener:e=>new LA(e),wake:fA,command:dA,mode:()=>f.current.voice.mode,chime:mA,dispatch:e=>n(e)});s.current=c;let l=new FO({send:t=>e.send(t),dispatch:e=>n(e),enabled:()=>f.current.camera.enabled,upload:async(e,t)=>{let n=await fetch(`/api/camera/frame/${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`image/jpeg`},body:t});if(!n.ok)throw Error(`upload failed (${n.status})`)}});o.current=l;let p=new oA({send:t=>e.send(t),dispatch:e=>n(e),upload:async(e,t)=>{let n=await fetch(`/api/screen/frame/${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`image/jpeg`},body:t});if(!n.ok)throw Error(`upload failed (${n.status})`)}}),m=e.onMessage(e=>{n(e);let r=e?.type,i=e?.id;(r===`camera.request`||r===`camera.cancel`)&&typeof i==`string`&&l.handle({type:r,id:i}),(r===`screen.request`||r===`screen.cancel`)&&typeof i==`string`&&p.handle({type:r,id:i}),r===`audio.duck`&&dD.set(e.level??1),(r===`audio.chunk`||r===`audio.stop`)&&t.handleServer(e)}),h=e.onState(e=>{n({type:`conn`,value:e}),e!==`open`&&dD.set(1,0),e===`unauthorized`&&d.current(),e===`elsewhere`&&(c.disable(),u(!1),t.blur(),l.dispose(),p.dispose())});return()=>{m(),h(),c.disable(),s.current=null,t.dispose(),l.dispose(),p.dispose(),e.close(),i.current=null,o.current=null,r.current=null}},[]),(0,l.useEffect)(()=>{t.camera.enabled||o.current?.dispose()},[t.camera.enabled]),(0,l.useEffect)(()=>{s.current?.sync()},[t.voice.mode]);let p=(0,l.useCallback)(async e=>{let t=s.current;if(t){e?await t.enable():t.disable(),u(t.enabled);try{localStorage.setItem(`friend.handsFree`,t.enabled?`1`:`0`)}catch{}}},[]),m=(0,l.useRef)(!1);(0,l.useEffect)(()=>{if(!m.current&&t.voice.available){m.current=!0;try{localStorage.getItem(`friend.handsFree`)===`1`&&LA.supported()&&p(!0)}catch{}}},[t.voice.available,p]);let h=(0,l.useMemo)(()=>({on:c,supported:LA.supported(),toggle:()=>void p(!s.current?.enabled)}),[c,p]),g=(0,l.useCallback)(e=>r.current?.send(e),[]);return cA(t.voice.mode,g),{state:t,send:g,dispatch:(0,l.useCallback)(e=>n(e),[]),voice:(0,l.useMemo)(()=>({pressStart:()=>void i.current?.pressStart(),pressEnd:()=>void i.current?.pressEnd(),blur:()=>i.current?.blur(),unlock:()=>i.current?.unlock(),setQuiet:e=>{a.current=e,i.current?.setQuiet(e)}}),[]),handsFree:h,useHere:(0,l.useCallback)(()=>r.current?.takeOver(),[]),officeStop:(0,l.useCallback)(e=>g({type:`office.stop`,...e?{workerId:e}:{}}),[g]),officeSay:(0,l.useCallback)((e,t)=>g({type:`office.say`,workerId:e,text:t}),[g])}}var ej={401:`Please sign in again.`,403:`Incorrect PIN.`,413:`That recording was too long.`,429:`Too many attempts. Wait a moment.`,503:`Voice is not available. Run: friend voice setup`};async function tj(e,t){let n;try{n=await fetch(e,t)}catch{throw Error(`Could not reach Friend. Check the connection.`)}if(!n.ok){let e=``;try{e=(await n.json()).error??``}catch{}throw Error(e||ej[n.status]||`The request failed (${n.status}).`)}return await n.json()}var nj=(e,t)=>({method:e,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),rj={state:()=>tj(`/api/voice/enroll`,{}),sample:e=>tj(`/api/voice/enroll/sample`,{method:`POST`,headers:{"content-type":e.type||`audio/webm`},body:e}),finish:e=>tj(`/api/voice/enroll/finish`,nj(`POST`,{pin:e})),cancel:async()=>{await tj(`/api/voice/enroll/cancel`,nj(`POST`,{}))},remove:async e=>{await tj(`/api/voice/enroll`,nj(`DELETE`,{pin:e}))}},ij=[`Friend, good evening. It is a pleasant day to get things done.`,`Open my projects and show me what changed today.`,`My voice is my key, so please remember it well.`,`Check the weather and read me the latest headlines.`,`Always protect the boss, and never trust a stranger.`],aj=15e3;function oj({api:e=rj,createRecorder:t=e=>new JA(e),onClose:n,who:r}){let[i,a]=(0,l.useState)(null),[o,s]=(0,l.useState)(0),[c,u]=(0,l.useState)(null),[f,m]=(0,l.useState)(`record`),[h,g]=(0,l.useState)(!1),[_,v]=(0,l.useState)(!1),[y,b]=(0,l.useState)(null),[x,S]=(0,l.useState)(``),C=(0,l.useRef)(!0),w=(0,l.useRef)(null);(0,l.useEffect)(()=>(C.current=!0,e.state().then(e=>{C.current&&(a(e),s(e.samples))}).catch(e=>C.current&&b(e.message)),()=>{C.current=!1,w.current?.cancel(),w.current=null}),[e]);let E=(0,l.useCallback)(async()=>{let t=w.current;if(t){w.current=null,g(!1),v(!0);try{let n=await t.stop(),r=await e.sample(n);if(!C.current)return;s(r.count),u(r.note)}catch(e){C.current&&b(e.message)}finally{C.current&&v(!1)}}},[e]),D=async()=>{b(null),u(null);let e=t({maxMs:aj,onLimit:()=>void E(),onError:()=>{w.current=null,C.current&&(g(!1),b(`The microphone stopped working. Try again.`))}});try{await e.start()}catch(e){C.current&&b(e.message);return}if(!C.current)return e.cancel();w.current=e,g(!0)},O=async e=>{b(null),v(!0);try{await e()}catch(e){C.current&&b(e.message)}finally{C.current&&(v(!1),S(``))}},k=async()=>{w.current?.cancel(),w.current=null,await e.cancel().catch(()=>{}),n()},A=i?.min??3,j=o%ij.length,ee=o<ij.length?`Phrase ${o+1} of ${ij.length}`:`Extra recording (${o} so far)`;return(0,p.jsxs)(`div`,{className:`approval enroll glass`,role:`dialog`,"aria-label":`Voice enrollment`,style:{pointerEvents:`auto`},children:[(0,p.jsx)(`div`,{className:`approval-head`,children:(0,p.jsx)(`span`,{className:`approval-title`,children:r?`Teach Friend ${r}'s voice`:`Teach Friend your voice`})}),f===`record`&&(0,p.jsxs)(p.Fragment,{children:[!r&&i?.enrolled&&(0,p.jsx)(`p`,{className:`auth-note`,children:`Your voice is already saved. Saving a new one replaces it.`}),r&&(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Hand the device to `,r,`. `,r,` reads each sentence aloud, close to the microphone, in a quiet room.`]}),(0,p.jsxs)(`p`,{className:`auth-note`,children:[ee,`. Press Record, read this aloud in a quiet room, then press Stop.`]}),(0,p.jsx)(`pre`,{className:`approval-summary`,"data-testid":`enroll-phrase`,style:{whiteSpace:`pre-wrap`},children:ij[j]}),(0,p.jsxs)(`div`,{role:`status`,className:`auth-note`,children:[o,` recorded`,o>=A?` — enough to save`:` — at least ${A} needed`,`.`,c?` ${c}`:``]}),y&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:y}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[h?(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,onClick:()=>void E(),children:`Stop`}):(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:_||!i||o>=(i?.max??8),onClick:()=>void D(),children:_?`Uploading…`:`Record`}),(0,p.jsx)(`button`,{type:`button`,style:d,disabled:h||_||o<A,onClick:()=>m(`pin-save`),children:r?`Save ${r}'s voice`:`Save my voice`}),!r&&i?.enrolled&&(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,disabled:h||_,onClick:()=>m(`pin-delete`),children:`Delete my voice`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>void k(),children:`Cancel`})]})]}),(f===`pin-save`||f===`pin-delete`)&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:f===`pin-save`?r?`Enter your PIN to save ${r}'s voice.`:`Enter your PIN to save your voice.`:`Enter your PIN to delete your saved voice.`}),(0,p.jsx)(T,{pin:x,onChange:S,onSubmit:f===`pin-save`?()=>!_&&void O(async()=>{await e.finish(x),C.current&&m(`saved`)}):void 0}),y&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:y}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[f===`pin-save`?(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:_||x.length<6,onClick:()=>void O(async()=>{await e.finish(x),C.current&&m(`saved`)}),children:`Save`}):(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,disabled:_||x.length<6,onClick:()=>void O(async()=>{await e.remove(x),C.current&&m(`deleted`)}),children:`Delete`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{S(``),b(null),m(`record`)},children:`Back`})]})]}),(f===`saved`||f===`deleted`)&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:f===`saved`?r?`${r}'s voice is saved. From now on I will know when ${r} is talking.`:`Your voice is saved. From now on I will tell you apart from other speakers.`:`Your voice was deleted. Every voice is treated as yours until you enroll again.`}),(0,p.jsx)(`div`,{className:`approval-actions`,children:(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,onClick:n,children:`Done`})})]})]})}var sj=new Set([`INPUT`,`TEXTAREA`,`SELECT`,`BUTTON`,`A`,`SUMMARY`]),cj=new Set([`button`,`checkbox`,`switch`,`tab`,`menuitem`,`link`,`radio`,`option`,`textbox`,`combobox`,`slider`]),lj=e=>e instanceof HTMLInputElement&&e.hasAttribute(`data-space-talks`)&&e.value===``,uj=e=>!lj(e)&&e instanceof HTMLElement&&(sj.has(e.tagName)||e.isContentEditable||cj.has(e.getAttribute(`role`)??``)),dj=e=>e.code===`Space`||e.key===` `;function fj(e){let t=(0,l.useRef)(e);t.current=e,(0,l.useEffect)(()=>{let e=!1,n=n=>{!dj(n)||n.ctrlKey||n.metaKey||n.altKey||uj(n.target)||uj(document.activeElement)||(n.preventDefault(),!(n.repeat||e)&&(e=!0,t.current.pressStart()))},r=n=>{dj(n)&&e&&(e=!1,n.preventDefault(),t.current.pressEnd())},i=()=>{e=!1,t.current.blur()},a=()=>{document.hidden&&i()};return window.addEventListener(`keydown`,n),window.addEventListener(`keyup`,r),window.addEventListener(`blur`,i),document.addEventListener(`visibilitychange`,a),()=>{window.removeEventListener(`keydown`,n),window.removeEventListener(`keyup`,r),window.removeEventListener(`blur`,i),document.removeEventListener(`visibilitychange`,a)}},[])}function pj(e){let t=(0,l.useRef)(e);t.current=e,(0,l.useEffect)(()=>{let e=()=>t.current.unlock(),n=[`pointerdown`,`keydown`,`touchend`];for(let t of n)window.addEventListener(t,e,{passive:!0});return()=>{for(let t of n)window.removeEventListener(t,e)}},[])}function mj({onUseHere:e}){return(0,p.jsx)(`div`,{className:`elsewhere`,role:`alertdialog`,"aria-labelledby":`elsewhere-title`,"data-testid":`elsewhere`,children:(0,p.jsxs)(`div`,{className:`elsewhere-card`,children:[(0,p.jsx)(`h2`,{id:`elsewhere-title`,children:`Friend is open in another window`}),(0,p.jsx)(`p`,{children:`Friend works in one window at a time. Click “Use here” to use it in this window instead; the other one will stop.`}),(0,p.jsx)(`button`,{type:`button`,className:`elsewhere-btn`,onClick:e,autoFocus:!0,children:`Use here`})]})})}function hj(e,t,n){let r=Math.max(100,Math.round(e)),i=Math.max(100,Math.round(t));return{width:r,height:i,kind:r<=599?`phone`:n||r<1024?`tablet`:`desktop`,orientation:i>r?`portrait`:`landscape`,touch:n}}var gj=()=>typeof matchMedia==`function`&&matchMedia(`(pointer: coarse)`).matches;function _j(){return hj(window.innerWidth,window.innerHeight,gj())}var vj=(e,t)=>!!e&&e.width===t.width&&e.height===t.height&&e.kind===t.kind&&e.orientation===t.orientation&&e.touch===t.touch;function yj(e,t){let n=(0,l.useRef)(null),r=(0,l.useRef)(e);r.current=e,(0,l.useEffect)(()=>{if(t!==`open`){n.current=null;return}let e=()=>{let e=_j();vj(n.current,e)||(n.current=e,r.current({type:`ui.screen`,...e}))};e();let i=null,a=()=>{i&&clearTimeout(i),i=setTimeout(e,400)};return window.addEventListener(`resize`,a),window.addEventListener(`orientationchange`,a),()=>{i&&clearTimeout(i),window.removeEventListener(`resize`,a),window.removeEventListener(`orientationchange`,a)}},[t])}var bj={401:`Please sign in again.`,403:`Incorrect PIN.`,413:`That recording was too long.`,429:`Too many attempts. Wait a moment.`,503:`Voice is not available. Run: friend voice setup`};async function xj(e,t={}){let n;try{n=await fetch(e,t)}catch{throw Error(`Could not reach Friend. Check the connection.`)}if(!n.ok){let e=``;try{e=(await n.json()).error??``}catch{}throw Error(e||bj[n.status]||`The request failed (${n.status}).`)}return await n.json()}var Sj=(e,t)=>({method:e,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),Cj={overview:()=>xj(`/api/voice/people`),begin:e=>xj(`/api/voice/people/begin`,Sj(`POST`,{name:e})),recording:{state:async()=>(await xj(`/api/voice/people`)).enrolling??{enrolled:!1,samples:0,min:3,max:8},sample:e=>xj(`/api/voice/people/sample`,{method:`POST`,headers:{"content-type":e.type||`audio/webm`},body:e}),finish:e=>xj(`/api/voice/people/finish`,Sj(`POST`,{pin:e})),cancel:async()=>{await xj(`/api/voice/people/cancel`,Sj(`POST`,{}))},remove:async()=>{}},removePerson:async(e,t)=>{await xj(`/api/voice/people/${e}`,Sj(`DELETE`,{pin:t}))}};function wj({api:e=Cj,createRecorder:t,onClose:n}){let[r,i]=(0,l.useState)(null),[a,o]=(0,l.useState)({kind:`list`}),[s,c]=(0,l.useState)(``),[u,f]=(0,l.useState)(``),[m,h]=(0,l.useState)(!1),[g,_]=(0,l.useState)(null),v=(0,l.useRef)(!0),y=(0,l.useCallback)(()=>{e.overview().then(e=>v.current&&i(e)).catch(e=>v.current&&_(e.message))},[e]);(0,l.useEffect)(()=>(v.current=!0,y(),()=>{v.current=!1}),[y]);let b=async()=>{_(null),h(!0);try{let t=await e.begin(s.trim());v.current&&o({kind:`record`,name:t.name})}catch(e){v.current&&_(e.message)}finally{v.current&&h(!1)}},x=async t=>{_(null),h(!0);try{if(await e.removePerson(t.id,u),!v.current)return;o({kind:`list`}),y()}catch(e){v.current&&_(e.message)}finally{v.current&&(h(!1),f(``))}};return a.kind===`record`?(0,p.jsx)(oj,{api:e.recording,who:a.name,...t?{createRecorder:t}:{},onClose:()=>{c(``),o({kind:`list`}),y()}}):(0,p.jsxs)(`div`,{className:`approval enroll glass`,role:`dialog`,"aria-label":`Family voices`,style:{pointerEvents:`auto`},children:[(0,p.jsx)(`div`,{className:`approval-head`,children:(0,p.jsx)(`span`,{className:`approval-title`,children:`Family voices`})}),a.kind===`list`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:`Friend knows your voice. Add the people at home, so it knows who is talking and answers them by name. They can chat and ask for the weather, but cannot use your PC or see your private things.`}),r&&!r.ownerEnrolled&&(0,p.jsx)(`p`,{className:`auth-note`,children:`First teach Friend your own voice (Esc, then Enroll my voice).`}),r&&r.people.length===0&&r.ownerEnrolled&&(0,p.jsx)(`p`,{className:`auth-note`,children:`Nobody added yet.`}),r&&r.people.length>0&&(0,p.jsx)(`ul`,{className:`household-list`,"aria-label":`People Friend knows`,children:r.people.map(e=>(0,p.jsxs)(`li`,{className:`household-row`,children:[(0,p.jsx)(`span`,{children:e.name}),(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,onClick:()=>o({kind:`remove`,person:e}),"aria-label":`Remove ${e.name}`,children:`Remove`})]},e.id))}),r&&r.ownerEnrolled&&r.people.length<r.max&&(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Add a person`}),(0,p.jsx)(`input`,{value:s,maxLength:40,placeholder:`Name, for example Priya`,onChange:e=>c(e.target.value),onKeyDown:e=>e.key===`Enter`&&s.trim()&&!m&&void b()})]}),g&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:g}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[r&&r.ownerEnrolled&&r.people.length<r.max&&(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:m||!s.trim(),onClick:()=>void b(),children:`Record their voice`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:n,children:`Close`})]})]}),a.kind===`remove`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Enter your PIN to remove `,a.person.name,`’s voice. Friend will treat their voice as a stranger’s.`]}),(0,p.jsx)(T,{pin:u,onChange:f}),g&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:g}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,disabled:m||u.length<6,onClick:()=>void x(a.person),children:`Remove`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{f(``),_(null),o({kind:`list`})},children:`Back`})]})]})]})}var Tj=`▌▍▎▏█▓▒░<>/\\|+-=*#%&0123456789ABCDEF`;function Ej(e,t,n=Math.random){let r=[...e];if(t>=1)return e;let i=Math.floor(r.length*Math.max(0,t));return r.map((e,t)=>t<i||e===` `?e:Tj[Math.floor(n()*36)]).join(``)}var Dj=e=>e.length===0?0:Math.min(24,Math.max(6,Math.ceil([...e].length/2)));function Oj(e,t){let[n,r]=(0,l.useState)(e),i=(0,l.useRef)(e);return(0,l.useEffect)(()=>{if(!t||e===i.current){i.current=e,r(e);return}i.current=e;let n=Dj(e);if(n===0){r(e);return}let a=0,o=setInterval(()=>{a++,r(Ej(e,a/n)),a>=n&&clearInterval(o)},320/n);return()=>clearInterval(o)},[e,t]),n}function kj(e){let t=e.currentTarget,n=t.getBoundingClientRect(),r=document.createElement(`span`);r.className=`hud-ripple`;let i=Math.max(n.width,n.height)*2;r.style.width=r.style.height=`${i}px`,r.style.left=`${e.clientX-n.left-i/2}px`,r.style.top=`${e.clientY-n.top-i/2}px`,t.appendChild(r),r.addEventListener(`animationend`,()=>r.remove(),{once:!0}),setTimeout(()=>r.remove(),900)}function Aj({items:e,animations:t,onAction:n}){let[r,i]=(0,l.useState)(null),a=(0,l.useRef)(void 0);if((0,l.useEffect)(()=>()=>clearTimeout(a.current),[]),e.length===0)return null;let o=e=>{t!==`off`&&(i(e.id),clearTimeout(a.current),a.current=setTimeout(()=>i(null),650)),n(e)};return(0,p.jsxs)(me,{id:`launcher`,label:`Quick launch`,wholeBox:!0,testId:`launcher`,className:`hud hud-launcher${t===`full`?` hud-boot`:``}`,children:[(0,p.jsx)(`div`,{className:`hud-kicker`,children:`Quick launch`}),(0,p.jsx)(`ul`,{className:`hud-stack`,children:e.map((e,n)=>(0,p.jsx)(`li`,{className:`hud-tab hud-cut${r===e.id?` engaged`:``}${t===`full`?` hud-boot`:``}`,style:{"--i":n+1},children:(0,p.jsxs)(`button`,{type:`button`,className:`hud-tab-main`,"aria-label":e.label,onPointerDown:t===`off`?void 0:kj,onClick:()=>o(e),children:[(0,p.jsx)(`span`,{className:`hud-icon`,"aria-hidden":`true`,children:e.icon}),(0,p.jsx)(`span`,{className:`hud-tab-label`,children:e.label}),(0,p.jsx)(`span`,{className:`hud-tab-engaged`,"aria-hidden":`true`,children:`ENGAGED`}),(0,p.jsx)(`span`,{className:`hud-sweep`,"aria-hidden":`true`}),(0,p.jsx)(`span`,{className:`hud-scan`,"aria-hidden":`true`})]})},e.id))})]})}var jj=class extends l.Component{state={failed:!1};static getDerivedStateFromError(){return{failed:!0}}render(){return this.state.failed?null:this.props.children}};function Mj(e){let t=()=>({w:window.innerWidth,h:window.innerHeight}),[n,r]=(0,l.useState)(t);return(0,l.useEffect)(()=>{if(e)return;let n=()=>r(t());return window.addEventListener(`resize`,n),()=>window.removeEventListener(`resize`,n)},[e]),e??n}var Nj=(e,t=0,n=100)=>Number.isFinite(e)?Math.min(n,Math.max(t,e)):t,Pj=e=>e?{x:e.x,y:e.y,width:e.w,height:e.h}:{};function Fj(){return(0,p.jsx)(`svg`,{width:`0`,height:`0`,"aria-hidden":`true`,style:{position:`absolute`},children:(0,p.jsxs)(`defs`,{children:[(0,p.jsxs)(`filter`,{id:`ob-glow`,x:`-50%`,y:`-50%`,width:`200%`,height:`200%`,children:[(0,p.jsx)(`feGaussianBlur`,{stdDeviation:`3`,result:`b`}),(0,p.jsxs)(`feMerge`,{children:[(0,p.jsx)(`feMergeNode`,{in:`b`}),(0,p.jsx)(`feMergeNode`,{in:`SourceGraphic`})]})]}),(0,p.jsxs)(`filter`,{id:`ob-glow2`,x:`-50%`,y:`-50%`,width:`200%`,height:`200%`,children:[(0,p.jsx)(`feGaussianBlur`,{stdDeviation:`7`,result:`b`}),(0,p.jsxs)(`feMerge`,{children:[(0,p.jsx)(`feMergeNode`,{in:`b`}),(0,p.jsx)(`feMergeNode`,{in:`SourceGraphic`})]})]}),(0,p.jsxs)(`radialGradient`,{id:`ob-orbg`,cx:`50%`,cy:`45%`,r:`55%`,children:[(0,p.jsx)(`stop`,{offset:`0`,stopColor:`#cffafe`}),(0,p.jsx)(`stop`,{offset:`0.25`,stopColor:`#22d3ee`}),(0,p.jsx)(`stop`,{offset:`0.6`,stopColor:`#0e7490`}),(0,p.jsx)(`stop`,{offset:`1`,stopColor:`#042f3c`})]}),(0,p.jsxs)(`linearGradient`,{id:`ob-sweep`,x1:`0`,y1:`0`,x2:`1`,y2:`0`,children:[(0,p.jsx)(`stop`,{offset:`0`,stopColor:`#22d3ee`,stopOpacity:`0`}),(0,p.jsx)(`stop`,{offset:`1`,stopColor:`#22d3ee`,stopOpacity:`0.7`})]}),(0,p.jsxs)(`linearGradient`,{id:`ob-fade`,x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[(0,p.jsx)(`stop`,{offset:`0`,stopColor:`#010609`}),(0,p.jsx)(`stop`,{offset:`0.15`,stopColor:`#010609`,stopOpacity:`0`}),(0,p.jsx)(`stop`,{offset:`0.85`,stopColor:`#010609`,stopOpacity:`0`}),(0,p.jsx)(`stop`,{offset:`1`,stopColor:`#010609`})]})]})})}function Ij({variant:e=`chamfer`,tone:t=`cyan`,title:n,running:r=!1,className:i=``,style:a,children:o,...s}){return(0,p.jsxs)(`section`,{...s,className:`ob-frame ob-v-${e} ${i}`.trim(),"data-tone":t,...r?{"data-running":``}:{},style:a,children:[n&&(0,p.jsx)(`header`,{className:`ob-frame-title`,children:n}),(0,p.jsx)(`div`,{className:`ob-frame-body`,children:o})]})}var Lj=`M60 170A90 90 0 0 1 240 170`,Rj=`M76 170A74 74 0 0 1 224 170`;function zj({value:e,inner:t,label:n=`Gauge`,tone:r=`cyan`,frame:i}){let a=Math.round(Nj(e));return(0,p.jsxs)(`svg`,{className:i?void 0:`ob-svg`,...Pj(i),viewBox:`0 0 300 190`,role:`img`,"aria-label":`${n} ${a}%`,"data-value":a,"data-tone":r,children:[(0,p.jsx)(`path`,{d:Lj,className:`ob-track`,strokeWidth:`14`,pathLength:100}),(0,p.jsx)(`path`,{d:Lj,className:`ob-fill`,strokeWidth:`14`,pathLength:100,strokeDasharray:`${a} 100`,"data-arc":`outer`}),t!==void 0&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:Rj,className:`ob-track`,strokeWidth:`6`,pathLength:100}),(0,p.jsx)(`path`,{d:Rj,className:`ob-fill`,strokeWidth:`6`,pathLength:100,strokeDasharray:`${Math.round(Nj(t))} 100`,stroke:`#a78bfa`,"data-arc":`inner`})]})]})}function Bj({levels:e,tone:t=`cyan`,frame:n}){let r=Math.max(1,e.length)*12;return(0,p.jsx)(`svg`,{className:n?void 0:`ob-svg`,...Pj(n),viewBox:`0 0 ${r} 100`,preserveAspectRatio:`none`,"aria-hidden":`true`,"data-tone":t,children:e.map((e,t)=>(0,p.jsx)(`rect`,{className:`ob-eq`,x:t*12,y:0,width:8,height:100,style:{"--lv":Math.max(.05,Nj(e,0,1)),animationDelay:`${-(t*.37%.9)}s`,transform:`scaleY(${Math.max(.05,Nj(e,0,1))})`}},t))})}var Vj=`M0 40H40L52 20L66 62L80 8L96 52L108 40H190L202 28L214 48L226 40H300`;function Hj({tone:e=`cyan`,frame:t}){return(0,p.jsxs)(`svg`,{className:t?void 0:`ob-svg`,...Pj(t),viewBox:`0 0 300 70`,"aria-hidden":`true`,"data-tone":e,children:[(0,p.jsx)(`path`,{className:`ob-ecg-base`,d:Vj}),(0,p.jsx)(`path`,{className:`ob-ecg`,d:Vj})]})}function Uj({blips:e,frame:t}){return(0,p.jsxs)(`svg`,{className:t?void 0:`ob-svg`,...Pj(t),viewBox:`-120 -120 240 240`,role:`img`,"aria-label":`Devices: ${e.map(e=>e.label).join(`, `)||`none`}`,children:[(0,p.jsxs)(`g`,{fill:`none`,stroke:`var(--ob-line)`,children:[(0,p.jsx)(`circle`,{r:`110`}),(0,p.jsx)(`circle`,{r:`73`}),(0,p.jsx)(`circle`,{r:`36`}),(0,p.jsx)(`line`,{x1:`-110`,x2:`110`}),(0,p.jsx)(`line`,{y1:`-110`,y2:`110`})]}),(0,p.jsx)(`circle`,{r:`110`,fill:`none`,stroke:`#67e8f9`,strokeWidth:`2`,strokeDasharray:`1 9`}),(0,p.jsxs)(`g`,{className:`ob-sweep`,children:[(0,p.jsx)(`path`,{d:`M0 0L110 0A110 110 0 0 0 95 -55Z`,fill:`url(#ob-sweep)`}),(0,p.jsx)(`line`,{x2:`110`,stroke:`#67e8f9`,strokeWidth:`2`})]}),e.map(e=>{let t=e.angle*Math.PI/180,n=Math.cos(t)*Nj(e.distance,0,1)*100,r=-Math.sin(t)*Nj(e.distance,0,1)*100;return(0,p.jsxs)(`g`,{"data-blip":``,...e.dim?{"data-dim":``}:{},children:[(0,p.jsx)(`circle`,{className:`ob-blip${e.warn?` ob-blip-warn`:``}`,cx:n,cy:r,r:`5`}),(0,p.jsx)(`text`,{x:n+9,y:r+4,fontSize:`11`,fill:`currentColor`,opacity:e.dim?.5:1,children:e.label})]},e.label)})]})}var Wj={done:`var(--ob-green)`,doing:`var(--ob-cyan)`,review:`var(--ob-orange)`,todo:`var(--ob-dim)`},Gj=e=>e%2==0?6:5;function Kj({cells:e,placeholder:t=!1,frame:n}){t&&(e=Array.from({length:11},()=>({status:`todo`})));let r=[],i=0,a=0;for(let t of e)a>=Gj(i)&&(i++,a=0),r.push({x:20+a*40+i%2*20,y:20+i*35,status:t.status}),a++;let o=r.length?i+1:1;return(0,p.jsx)(`svg`,{className:n?void 0:`ob-svg`,...Pj(n),viewBox:`0 0 260 ${o*35+10}`,"aria-hidden":`true`,...t?{"data-placeholder":``}:{},children:r.map((e,t)=>(0,p.jsx)(`polygon`,{"data-status":e.status,points:`-20,0 -10,-17.3 10,-17.3 20,0 10,17.3 -10,17.3`,transform:`translate(${e.x} ${e.y})`,fill:`none`,stroke:Wj[e.status],strokeWidth:`1.6`,className:e.status===`review`?`ob-pulse`:void 0},t))})}function qj({rings:e,placeholder:t=!1,frame:n}){t&&(e=[{value:0},{value:0},{value:0}]);let r=t?{"aria-hidden":!0,"data-placeholder":``}:{role:`img`,"aria-label":e.map(e=>`${e.label??`ring`} ${Math.round(Nj(e.value))}%`).join(`, `)||`no data`};return(0,p.jsx)(`svg`,{className:n?void 0:`ob-svg`,...Pj(n),viewBox:`-50 -50 100 100`,...r,children:e.map((e,t)=>{let n=38-t*12;if(n<=2)return null;let r=Math.round(Nj(e.value));return(0,p.jsxs)(`g`,{"data-tone":e.tone??`cyan`,transform:`rotate(-90)`,children:[(0,p.jsx)(`circle`,{r:n,className:`ob-track`,strokeWidth:`8`}),(0,p.jsx)(`circle`,{r:n,className:`ob-fill`,strokeWidth:`8`,pathLength:100,strokeDasharray:`${r} 100`,"data-ring":t,"data-value":r})]},t)})})}function Jj({value:e,segments:t=60,radius:n=205,size:r=460}){let i=Math.round(t*Nj(e)/100),a=r/2;return(0,p.jsx)(`svg`,{className:`ob-svg`,viewBox:`0 0 ${r} ${r}`,"aria-hidden":`true`,children:Array.from({length:t},(e,r)=>{let o=(-90+r*360/t)*Math.PI/180,[s,c]=[n-7,n+7];return(0,p.jsx)(`line`,{className:`ob-seg`,"data-seg":``,"data-on":r<i?`true`:`false`,x1:a+s*Math.cos(o),y1:a+s*Math.sin(o),x2:a+c*Math.cos(o),y2:a+c*Math.sin(o)},r)})})}var Yj={running:`green`,waiting:`orange`,idle:`cyan`,add:`cyan`};function Xj({label:e,glyph:t,caption:n,detail:r,status:i=`idle`,onClick:a,x:o,y:s}){let c=o!==void 0&&s!==void 0?{left:o,top:s}:void 0;return(0,p.jsxs)(`button`,{type:`button`,className:`ob-node`,"data-tone":Yj[i],"data-status":i,"aria-label":r?`${e}, ${r}`:e,title:e,style:c,onClick:a,children:[(0,p.jsxs)(`svg`,{viewBox:`-34 -30 68 60`,"aria-hidden":`true`,children:[(0,p.jsx)(`polygon`,{points:`-34,0 -17,-29.4 17,-29.4 34,0 17,29.4 -17,29.4`}),(0,p.jsx)(`text`,{className:`ob-node-label${t?` ob-glyph`:``}`,children:t??(e.length>6?`${e.slice(0,5)}…`:e)})]}),n&&(0,p.jsx)(`span`,{className:`ob-node-caption`,children:n})]})}function Zj({x1:e,y1:t,x2:n,y2:r,tone:i=`cyan`,flowing:a=!0}){return(0,p.jsx)(`line`,{className:`ob-link${a?` ob-flow`:``}`,"data-tone":i,x1:e,y1:t,x2:n,y2:r})}var Qj={starting:`running`,running:`running`,waiting:`waiting`,idle:`idle`,paused:`idle`,stopped:`idle`,failed:`idle`};function $j(e,t){let n=e.slice(0,5).map(e=>({id:e.id,label:e.name,glyph:e.name.slice(0,6).toUpperCase(),caption:e.name,status:Qj[e.status],detail:e.detail||e.status,kind:`worker`}));return t&&e.length<5&&n.push({id:`hire`,label:`Hire a worker`,glyph:`+`,caption:`HIRE WORKER`,status:`add`,detail:`HIRE WORKER`,kind:`hire`}),n}var eM={done:`done`,doing:`doing`,review:`review`,blocked:`review`,todo:`todo`},tM=[`done`,`doing`,`review`,`todo`];function nM(e){return[...e].sort((e,t)=>e.id-t.id).slice(-11).map(e=>({status:eM[e.status]})).sort((e,t)=>tM.indexOf(e.status)-tM.indexOf(t.status))}function rM(e){let t=[...new Set(e.map(e=>e.projectId))];if(t.length!==0)return t.length===1?t[0]:`${t.length} projects`}var iM=e=>e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e);function aM(e){let t=e=>e.name.slice(0,6).toUpperCase(),n=e.filter(e=>e.budget!==null&&e.budget>0);if(n.length>0)return n.slice(0,3).map(e=>{let n=Nj(e.tokens/e.budget*100);return{label:t(e),value:n,text:`${Math.round(n)}%`}});let r=Math.max(0,...e.map(e=>e.tokens));return[...e].sort((e,t)=>t.tokens-e.tokens).slice(0,3).map(e=>({label:t(e),value:r>0?Nj(Math.max(+(e.tokens>0),Math.round(e.tokens/r*100))):0,text:iM(e.tokens)}))}var oM={tool:`green`,result:`green`,approval:`orange`,error:`orange`,text:`plain`};function sM(e,t){if(e!==`idle`||!t.enabled)return e;if(t.workers.some(e=>e.status===`waiting`))return`needs you`;let n=t.workers.filter(e=>e.status===`running`||e.status===`starting`).length;return n>0?`working · ${n}`:e}function cM(e,t,n=8){return t.flatMap(t=>(e[t.id]??[]).map(e=>({...e,name:t.name.slice(0,6).toUpperCase().padEnd(7)}))).sort((e,t)=>e.at-t.at).slice(-n).map(e=>({text:`${e.name}${e.text}`,tone:oM[e.kind]??`plain`}))}var lM=e=>{let t=Math.max(1,Math.round(e/6e4));return t>=60?`${Math.floor(t/60)}H ${String(t%60).padStart(2,`0`)}M`.replace(/ 0(\d)M/,` $1M`):`${t}M`};function uM(e,t,n){let r=e.fiveHour;return r&&r.resetsAt*1e3>n?{value:Math.round(Nj(r.utilization*100)),reset:lM(r.resetsAt*1e3-n),real:!0}:{value:t,reset:null,real:!1}}function dM(e){let t=new Map(e.map(e=>[e.id,e])),n=e=>{let n=new Set([e.id]);for(let r=e.managerId;r&&t.has(r);r=t.get(r).managerId){if(n.has(r))return r===e.id;n.add(r)}return!1},r=e=>e.managerId&&t.has(e.managerId)&&!n(e)?e.managerId:`friend`,i=new Map;for(let t of e)i.set(r(t),[...i.get(r(t))??[],t]);let a=new Map,o=e=>{let t=i.get(e)??[],n=t.length===0?190:Math.max(190,t.reduce((e,t)=>e+o(t.id),0)+(t.length-1)*26);return a.set(e,n),n};o(`friend`);let s=[],c=[],l=0,u=(e,n,r)=>{l=Math.max(l,r);let o=i.get(e)??[],d=r*134,f;if(o.length===0)f=n+(a.get(e)-190)/2;else{let t=n,i=o.map(e=>{let n=u(e.id,t,r+1);return t+=a.get(e.id)+26,n});f=(i[0]+i[i.length-1])/2;for(let[t,n]of o.entries())c.push({from:e,to:n.id,x1:f+95,y1:d+78,x2:i[t]+95,y2:d+78+56})}return s.push({id:e,x:f,y:d,worker:e===`friend`?null:t.get(e)}),f};return u(`friend`,0,0),{nodes:s,edges:c,width:a.get(`friend`),height:(l+1)*78+l*56}}var fM=[{id:`system`,title:`System`,anchor:`left`,box:{x:40,y:70,w:300,h:220},tone:`cyan`,minDensity:`standard`},{id:`voice`,title:`Voice`,anchor:`left`,box:{x:40,y:310,w:300,h:150},tone:`cyan`,minDensity:`standard`},{id:`network`,title:`Network`,anchor:`left`,box:{x:40,y:480,w:300,h:110},tone:`cyan`,minDensity:`standard`},{id:`feed`,title:`Activity`,anchor:`left`,box:{x:40,y:650,w:430,h:210},tone:`green`,minDensity:`standard`},{id:`radar`,title:`Devices`,anchor:`right`,box:{x:1310,y:60,w:250,h:270},tone:`cyan`,minDensity:`standard`},{id:`tickets`,title:`Tickets`,anchor:`right`,box:{x:1300,y:320,w:270,h:160},tone:`green`,minDensity:`standard`},{id:`budget`,title:`Budget`,anchor:`right`,box:{x:1300,y:480,w:270,h:110},tone:`cyan`,minDensity:`standard`},{id:`approval`,title:`Approvals`,anchor:`right`,box:{x:1180,y:650,w:380,h:210},tone:`orange`,minDensity:`standard`},{id:`usage`,title:`Usage`,anchor:`centre`,box:{x:700,y:215,w:200,h:30},tone:`cyan`,minDensity:`calm`}];if(fM.length!==Tu.length)throw Error(`the widget registry and HUD_WIDGET_IDS differ`);var pM={calm:0,standard:1,full:2};function mM(e,t,n,r){return fM.filter(n=>{if(n.id===`approval`&&r)return!0;let i=t[n.id];return i===!1?!1:i===!0||pM[e]>=pM[n.minDensity]})}function hM({rings:e=[]}){let t=e.length===0;return(0,p.jsxs)(`svg`,{className:`ob-wsvg`,viewBox:`0 0 270 110`,children:[(0,p.jsx)(qj,{rings:e.map((e,t)=>({value:e.value,label:e.label,tone:[`cyan`,`cyan`,`green`][t]??`cyan`})),placeholder:t,frame:{x:-10,y:-10,w:100,h:100}}),(0,p.jsx)(`text`,{className:`ob-lab`,x:`104`,y:`26`,children:`BUDGET`}),t?(0,p.jsx)(`text`,{className:`ob-sm`,x:`104`,y:`46`,children:`No workers yet`}):e.slice(0,3).map((e,t)=>(0,p.jsxs)(`text`,{className:`ob-sm`,x:`104`,y:46+t*18,children:[e.label,` `,e.text??`${Math.round(e.value)}%`]},e.label))]})}var gM=8,_M=46,vM=e=>e.length>_M?`${e.slice(0,45)}…`:e;function yM({lines:e,activity:t,busy:n,limit:r=gM,marquee:i=!1}){let a=Math.min(r,gM-+!!n),o=i?e:e.slice(-a),s=`M0 0H400L430 30V210H0Z`,c=(e,t,n)=>(0,p.jsxs)(`text`,{className:`tone`in e?`ob-sm ${e.tone===`green`?`ob-grn`:e.tone===`orange`?`ob-org`:``}`.trim():e.role===`user`?`ob-sm`:`ob-sm ob-grn`,x:`22`,y:t,children:[`tone`in e?``:e.role===`user`?`▸ `:`◂ `,vM(e.text)]},n);return(0,p.jsxs)(`svg`,{className:`ob-wsvg ob-feed-svg`,viewBox:`0 0 430 210`,"aria-live":`polite`,children:[(0,p.jsx)(`defs`,{children:(0,p.jsx)(`clipPath`,{id:`ob-feed-clip`,children:(0,p.jsx)(`rect`,{x:`0`,y:`38`,width:`430`,height:`168`})})}),(0,p.jsx)(`path`,{className:`ob-feed-frame`,d:s}),(0,p.jsx)(`path`,{className:`ob-feed-run`,d:s,pathLength:100}),(0,p.jsx)(`text`,{className:`ob-lab`,x:`16`,y:`18`,children:`WORKER FEED · LIVE`}),(0,p.jsx)(`circle`,{className:`ob-pulse`,cx:`410`,cy:`14`,r:`4`,fill:`#34d399`}),o.length===0&&!n&&(0,p.jsx)(`text`,{className:`ob-dim`,x:`22`,y:`60`,children:`Nothing yet`}),(0,p.jsx)(`g`,{clipPath:`url(#ob-feed-clip)`,children:i?(0,p.jsx)(`g`,{className:`ob-feed-scroll`,style:{"--n":o.length*20},children:[0,1].flatMap(e=>o.map((t,n)=>c(t,56+(e*o.length+n)*20,`${e}-${n}`)))}):(0,p.jsxs)(`g`,{className:`ob-feed-in`,children:[o.map((e,t)=>c(e,56+t*20,String(t))),n&&(0,p.jsxs)(`text`,{className:`ob-sm ob-org`,x:`22`,y:56+o.length*20,children:[`⚙ `,vM(t??`Working…`)]})]},`${e.length}:${o.at(-1)?.text??``}`)}),(0,p.jsx)(`rect`,{className:`ob-feed-fade`,x:`1`,y:`38`,width:`428`,height:`168`,fill:`url(#ob-fade)`,pointerEvents:`none`})]})}function bM({lines:e,activity:t,busy:n,workers:r=[]}){return(0,p.jsxs)(`div`,{className:`ob-feed`,"aria-live":`polite`,children:[e.length===0&&r.length===0&&!n&&(0,p.jsx)(`p`,{className:`ob-li ob-sub`,children:`Nothing yet`}),r.map((e,t)=>(0,p.jsx)(`p`,{className:`ob-li${e.tone===`green`?` ob-live`:e.tone===`orange`?` ob-warn`:``}`,children:e.text},`w${t}`)),e.slice(-200).map((e,t)=>(0,p.jsxs)(`p`,{className:`ob-li ${e.role===`user`?`ob-user`:``}`,children:[e.role===`user`?`▸ `:`◂ `,e.text]},t)),n&&(0,p.jsxs)(`p`,{className:`ob-li ob-live`,children:[`⚙ `,t??`Working…`]})]})}function xM({stats:e,now:t=Date.now()}){let n=e?Math.round(e.cpu):0,r=e&&e.ramTotal>0?Math.round(100*e.ramUsed/e.ramTotal):0,i=!!e&&t-e.at>1e4;return(0,p.jsxs)(`svg`,{className:`ob-wsvg`,viewBox:`0 0 300 220`,children:[(0,p.jsx)(`text`,{className:`ob-lab`,x:`12`,y:`8`,children:`SYSTEM · CPU / RAM`}),(0,p.jsx)(`path`,{className:`ob-bracket`,d:`M0 20H20M0 20V40M300 20H280M300 20V40`}),(0,p.jsx)(zj,{value:n,inner:r,label:`CPU`,frame:{x:0,y:20,w:300,h:190}}),e?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`text`,{className:`ob-big`,x:`150`,y:`170`,textAnchor:`middle`,children:[n,`%`]}),(0,p.jsxs)(`text`,{className:`ob-dim`,x:`150`,y:`192`,textAnchor:`middle`,children:[`CPU · RAM `,r,`%`,i?` · STALE`:``]})]}):(0,p.jsx)(`text`,{className:`ob-dim`,x:`150`,y:`180`,textAnchor:`middle`,children:`Waiting for data`})]})}function SM(e){if(e<1024)return`${Math.round(e)} B`;let t=[`KB`,`MB`,`GB`,`TB`],n=e/1024,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r++;return`${n.toFixed(1)} ${t[r]}`}function CM({stats:e,now:t=Date.now()}){let n=!!e&&e.netDown===0&&e.netUp===0,r=!!e&&t-e.at>1e4;return(0,p.jsxs)(`svg`,{className:`ob-wsvg`,viewBox:`0 0 300 110`,children:[(0,p.jsx)(`text`,{className:`ob-lab`,x:`0`,y:`8`,children:`NETWORK`}),(0,p.jsx)(Hj,{frame:{x:0,y:20,w:300,h:70}}),(0,p.jsxs)(`text`,{className:`ob-dim`,x:`0`,y:`104`,children:[e?n?`n/a`:`↓ ${SM(e.netDown)}/s ↑ ${SM(e.netUp)}/s`:`Waiting for data`,r?` · stale`:``]})]})}function wM({deviceOnline:e,voiceAvailable:t,blips:n}){return(0,p.jsxs)(`svg`,{className:`ob-wsvg`,viewBox:`0 0 250 270`,children:[(0,p.jsx)(`text`,{className:`ob-lab`,x:`20`,y:`21`,children:`DEVICES · RADAR`}),(0,p.jsx)(Uj,{frame:{x:10,y:25,w:240,h:240},blips:n??[{angle:40,distance:.45,label:`This screen`},{angle:150,distance:.7,label:`PC`,dim:!e},{angle:250,distance:.6,label:`Voice`,dim:!t}]})]})}var TM=[{status:`done`,label:`DONE`},{status:`doing`,label:`DOING`},{status:`review`,label:`REVIEW`},{status:`todo`,label:`TODO`}];function EM({cells:e=[],project:t}){let n=e.length===0;return(0,p.jsxs)(`svg`,{className:`ob-wsvg`,viewBox:`0 0 270 160`,children:[(0,p.jsxs)(`text`,{className:`ob-lab`,x:`0`,y:`8`,children:[`TICKETS · `,t??`no workers yet`]}),(0,p.jsx)(Kj,{cells:e,placeholder:n,frame:{x:0,y:20,w:260,h:80}}),(0,p.jsx)(`text`,{className:`ob-dim`,x:`0`,y:`130`,children:TM.map(t=>`■ ${t.label} ${e.filter(e=>e.status===t.status).length}`).join(` `)})]})}var DM=Array.from({length:20},(e,t)=>.35+.65*Math.abs(Math.sin(t*1.7+1))),OM=.45;function kM({level:e,mode:t}){let n=Nj(e,0,1),r=Math.max(OM,n),i=Math.round(n*5);return(0,p.jsxs)(`svg`,{className:`ob-wsvg`,viewBox:`0 0 300 160`,children:[(0,p.jsx)(`text`,{className:`ob-lab`,x:`0`,y:`8`,children:`VOICE · SPECTRUM`}),(0,p.jsx)(`line`,{className:`ob-ecg-base`,x1:`0`,x2:`300`,y1:`130`,y2:`130`}),(0,p.jsx)(Bj,{levels:DM.map(e=>r*e),frame:{x:0,y:40,w:240,h:90}}),(0,p.jsxs)(`text`,{className:`ob-dim`,x:`0`,y:`150`,children:[`MIC `,`▮`.repeat(i),`▯`.repeat(5-i),` · `,t]})]})}var AM={system:`How hard this PC is working. The big arc is the processor; the thin arc inside it is the memory.`,voice:`The sound Friend is hearing or speaking, live.`,network:`How fast data moves in and out of this PC. Some PCs do not report it.`,feed:`The conversation and what Friend is doing right now.`,radar:`The things Friend can reach: this screen, the PC's agent and the voice. A dim one is offline.`,tickets:`The work given to hired workers, one cell each. Switch the Office on in Settings to hire workers.`,budget:`How much of each worker's limit is used. Limits are set in Settings, Office.`,approval:`Something is waiting for your answer.`,usage:`Today's usage compared with your busiest day of the last 30.`},jM={voice:`Voice`,chat:`Chat`,task:`Scheduled tasks`,channel:`Messages`,other:`Other`};function MM({api:e}){let[t,n]=(0,l.useState)(null),[r,i]=(0,l.useState)(!1);return(0,l.useEffect)(()=>{let t=!0;return e.summary(30).then(e=>t&&n(e)).catch(()=>t&&i(!0)),()=>{t=!1}},[e]),r?(0,p.jsx)(`p`,{className:`ob-li ob-sub`,children:`Could not read the usage`}):t?t.bySource.length===0?(0,p.jsx)(`p`,{className:`ob-li ob-sub`,children:`No usage yet`}):(0,p.jsx)(`div`,{className:`ob-usage-detail`,children:t.bySource.map(e=>(0,p.jsxs)(`p`,{className:`ob-li`,children:[jM[e.source]??e.source,` · `,OS(e.input+e.output),` tokens · `,e.turns,` turns`]},e.source))}):(0,p.jsx)(`p`,{className:`ob-li ob-sub`,children:`Reading…`})}function NM({id:e,state:t,rect:n,usageApi:r=TS,onClose:i}){let a=(0,l.useRef)(null);(0,l.useEffect)(()=>a.current?.focus(),[e]);let o=fM.find(t=>t.id===e)?.title??e,s=(()=>{switch(e){case`system`:return(0,p.jsx)(xM,{stats:t.stats});case`network`:return(0,p.jsx)(CM,{stats:t.stats});case`radar`:return(0,p.jsx)(wM,{deviceOnline:t.deviceOnline,voiceAvailable:t.voice.available});case`voice`:return(0,p.jsx)(kM,{level:t.voice.level,mode:t.voice.mode});case`feed`:return(0,p.jsx)(bM,{lines:t.chat,activity:t.activity,busy:t.busy,workers:t.office.enabled?cM(t.office.feed,t.office.workers,60):[]});case`tickets`:return(0,p.jsx)(EM,{cells:nM(t.office.tickets),...rM(t.office.tickets)?{project:rM(t.office.tickets)}:{}});case`budget`:return(0,p.jsx)(hM,{rings:aM(t.office.workers)});case`usage`:return(0,p.jsx)(MM,{api:r});default:return null}})();return(0,p.jsxs)(Ij,{variant:`chamfer`,running:!0,title:o,className:`ob-expanded ob-hit`,style:{position:`absolute`,left:n.x,top:n.y,width:n.width,height:n.height},role:`dialog`,"aria-label":o,children:[(0,p.jsx)(`button`,{ref:a,type:`button`,className:`ob-close`,"aria-label":`Close`,onClick:i,children:`×`}),(0,p.jsx)(`div`,{className:`ob-expanded-body`,children:s}),(0,p.jsx)(`p`,{className:`ob-explain`,children:AM[e]})]})}function PM({worker:e,feed:t,rect:n,send:r,onClose:i}){let a=(0,l.useRef)(null),o=(0,l.useRef)(null),[s,c]=(0,l.useState)(``),[u,d]=(0,l.useState)(!1);(0,l.useEffect)(()=>a.current?.focus(),[e.id]),(0,l.useEffect)(()=>{let e=o.current;e&&(e.scrollTop=e.scrollHeight)},[t.length]);let f=()=>{let t=s.trim();t&&(r({type:`office.say`,workerId:e.id,text:t}),c(``))},m=e.status===`starting`||e.status===`running`||e.status===`waiting`;return(0,p.jsxs)(Ij,{variant:`chamfer`,running:!0,title:e.name,className:`ob-expanded ob-hit`,style:{position:`absolute`,left:n.x,top:n.y,width:n.width,height:n.height},role:`dialog`,"aria-label":e.name,children:[(0,p.jsx)(`button`,{ref:a,type:`button`,className:`ob-close`,"aria-label":`Close`,onClick:i,children:`×`}),(0,p.jsxs)(`div`,{className:`ob-expanded-body ob-worker`,children:[(0,p.jsxs)(`p`,{className:`ob-li`,children:[e.status,e.detail?` · ${e.detail}`:``]}),(0,p.jsxs)(`p`,{className:`ob-li ob-sub`,children:[`Tokens `,e.tokens,e.budget?` of ${e.budget}`:``]}),(0,p.jsx)(`div`,{className:`ob-worker-log`,ref:o,"aria-live":`polite`,children:t.length===0?(0,p.jsx)(`p`,{className:`ob-li ob-sub`,children:`Nothing yet`}):t.map((e,t)=>(0,p.jsx)(`p`,{"data-feed-line":``,"data-kind":e.kind,className:`ob-li${e.kind===`tool`||e.kind===`result`?` ob-live`:``}`,children:e.text},`${e.at}-${t}`))})]}),(0,p.jsxs)(`form`,{className:`ob-worker-say`,onSubmit:e=>{e.preventDefault(),f()},children:[(0,p.jsx)(`input`,{type:`text`,"aria-label":`Say to ${e.name}`,placeholder:`Say to ${e.name}`,value:s,maxLength:2e3,onChange:e=>c(e.target.value)}),(0,p.jsx)(`button`,{type:`submit`,children:`Send`}),(0,p.jsx)(`button`,{type:`button`,className:`ob-stop`,disabled:!m,onClick:()=>r({type:`office.stop`,workerId:e.id}),children:`Stop`}),(0,p.jsx)(`button`,{type:`button`,className:`ob-stop`,onClick:()=>u?r({type:`office.fire`,workerId:e.id}):d(!0),onBlur:()=>d(!1),children:u?`Confirm remove`:`Remove`})]})]})}var FM={starting:`running`,running:`running`,waiting:`waiting`,idle:`idle`,paused:`idle`,stopped:`idle`,failed:`failed`};function IM({workers:e,name:t,rect:n,onWorker:r,onClose:i}){let a=(0,l.useRef)(null),o=(0,l.useRef)(null),[s,c]=(0,l.useState)(1),u=dM(e);return(0,l.useEffect)(()=>a.current?.focus(),[]),(0,l.useEffect)(()=>{let e=o.current,t=e?.clientWidth||n.width-24,r=e?.clientHeight||n.height-70;c(Math.min(1,t/u.width,r/u.height)||1)},[u.width,u.height,n.width,n.height]),(0,p.jsxs)(Ij,{variant:`chamfer`,running:!0,title:`Office team`,className:`ob-expanded ob-hit`,style:{position:`absolute`,left:n.x,top:n.y,width:n.width,height:n.height},role:`dialog`,"aria-label":`Office team`,children:[(0,p.jsx)(`button`,{ref:a,type:`button`,className:`ob-close`,"aria-label":`Close`,onClick:i,children:`×`}),(0,p.jsx)(`div`,{className:`ob-expanded-body ob-org-holder`,ref:o,children:(0,p.jsxs)(`div`,{className:`ob-org`,style:{width:u.width,height:u.height,transform:`scale(${s})`,left:`calc(50% - ${u.width*s/2}px)`},children:[(0,p.jsx)(`svg`,{className:`ob-org-edges`,width:u.width,height:u.height,"aria-hidden":`true`,children:u.edges.map(e=>(0,p.jsx)(`path`,{"data-edge":`${e.from}>${e.to}`,d:`M${e.x1} ${e.y1}C${e.x1} ${(e.y1+e.y2)/2} ${e.x2} ${(e.y1+e.y2)/2} ${e.x2} ${e.y2}`},`${e.from}>${e.to}`))}),u.nodes.map(e=>e.worker?(0,p.jsxs)(`button`,{type:`button`,className:`ob-org-card`,"data-status":FM[e.worker.status],"aria-label":`${e.worker.name}, ${e.worker.title}, ${e.worker.detail||e.worker.status}`,style:{left:e.x,top:e.y,width:190,height:78},onClick:()=>r(e.id),children:[(0,p.jsxs)(`b`,{children:[(0,p.jsx)(`i`,{"aria-hidden":`true`}),` `,e.worker.name]}),(0,p.jsx)(`span`,{children:e.worker.title}),(0,p.jsx)(`small`,{children:e.worker.detail||e.worker.status}),e.worker.budget?(0,p.jsx)(`em`,{style:{width:`${Math.min(100,100*e.worker.tokens/e.worker.budget)}%`}}):null]},e.id):(0,p.jsxs)(`div`,{className:`ob-org-card ob-org-root`,style:{left:e.x,top:e.y,width:190,height:78},children:[(0,p.jsx)(`b`,{children:t}),(0,p.jsx)(`span`,{children:`Friend · the owner's assistant`})]},e.id))]})})]})}var LM=[{id:`code`,label:`CODE`,status:`running`,detail:`▶ Hero.tsx · 62%`,at:{x:800,y:108,anchor:`middle`}},{id:`test`,label:`TEST`,status:`running`,detail:`▶ 12/12 passing`,at:{x:1135,y:268,anchor:`start`}},{id:`rev`,label:`REV`,status:`waiting`,detail:`⏸ needs approval`,at:{x:1135,y:632,anchor:`start`}},{id:`hire`,label:`+`,status:`add`,detail:`HIRE WORKER`,at:{x:465,y:632,anchor:`end`}},{id:`arch`,label:`ARCH`,status:`idle`,detail:`idle`,at:{x:465,y:268,anchor:`end`}}],RM=[{text:`CODE ▶ edit src/Hero.tsx`,tone:`green`},{text:`CODE + 42 lines - 6 lines`,tone:`plain`},{text:`TEST ▶ pnpm test`,tone:`green`},{text:`TEST 12 passed · 0 failed`,tone:`plain`},{text:`REV ⏸ wants: npm install`,tone:`orange`},{text:`CODE ▶ edit src/Nav.tsx`,tone:`green`},{text:`CODE + 18 lines`,tone:`plain`}],zM=(e,t)=>Array.from({length:t},()=>({status:e})),BM=[...zM(`done`,3),...zM(`doing`,3),...zM(`review`,1),...zM(`todo`,4)],VM=[{label:`CODE`,value:42},{label:`TEST`,value:70},{label:`REV`,value:25}],HM=[{angle:49,distance:.64,label:`PC`},{angle:207,distance:.67,label:`PHONE`},{angle:286,distance:.73,label:`ALEXA?`,warn:!0}],UM={id:`sample`,tool:`shell.run`,summary:`npm install --save zod`,tier:`T2`,needsPin:!1},WM=e=>({cpu:38,ramUsed:61,ramTotal:100,netDown:2516582.4,netUp:314572.8,at:e});function GM({approval:e,send:t}){return e?(0,p.jsx)(KM,{approval:e,send:t}):(0,p.jsx)(`p`,{className:`ob-li ob-sub`,children:`None waiting`})}function KM({approval:e,send:t}){let{pin:n,setPin:r,respond:i,canApprove:a}=nt(e,t);return(0,p.jsxs)(`div`,{className:`ob-approval`,role:`alertdialog`,"aria-label":`Approval needed`,children:[(0,p.jsxs)(`svg`,{className:`ob-tri`,viewBox:`0 0 56 52`,"aria-hidden":`true`,children:[(0,p.jsx)(`path`,{d:`M4 48L28 4L52 48Z`}),(0,p.jsx)(`text`,{x:`28`,y:`42`,textAnchor:`middle`,children:`!`})]}),(0,p.jsxs)(`div`,{className:`ob-appr-text`,children:[(0,p.jsxs)(`span`,{className:`ob-appr-title`,children:[`APPROVAL NEEDED `,(0,p.jsx)(`span`,{className:`tier tier-${e.tier}`,children:e.tier})]}),!e.tool.startsWith(`office.`)&&(0,p.jsxs)(`span`,{className:`ob-appr-sub`,children:[e.tool,` wants to run:`]}),(0,p.jsx)(`pre`,{className:`ob-summary`,"data-testid":`approval-summary`,children:e.summary})]}),e.needsPin&&(0,p.jsx)(T,{pin:n,onChange:r,onSubmit:()=>a&&i(`approve`)}),(0,p.jsxs)(`div`,{className:`ob-actions`,children:[(0,p.jsx)(`button`,{type:`button`,className:`ob-btn ob-yes`,disabled:!a,onClick:()=>i(`approve`),children:`Approve`}),e.tier===`T2`&&!e.needsPin&&e.tool!==`camera.snap`&&!e.tool.startsWith(`office.`)&&(0,p.jsx)(`button`,{type:`button`,className:`ob-btn`,onClick:()=>i(`approve_always`),children:`Always allow`}),(0,p.jsx)(`button`,{type:`button`,className:`ob-btn ob-no`,onClick:()=>i(`deny`),children:`Deny`})]})]})}function qM(){let[e,t]=(0,l.useState)(()=>typeof document<`u`&&document.hidden);return(0,l.useEffect)(()=>{let e=()=>t(document.hidden);return document.addEventListener(`visibilitychange`,e),()=>document.removeEventListener(`visibilitychange`,e)},[]),e}function JM(e){let[t,n]=(0,l.useState)(()=>new Date);return(0,l.useEffect)(()=>{let t=setInterval(()=>n(new Date),e);return()=>clearInterval(t)},[e]),t}var YM=e=>t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),e())},XM=e=>ct({connection:e.connection,deviceOnline:e.deviceOnline,approval:e.approval,voiceMode:e.voice.mode,busy:e.busy,activity:e.activity}).text;function ZM(e,t){let n=t.stats;switch(e){case`system`:return n?`CPU ${Math.round(n.cpu)}% · RAM ${n.ramTotal>0?Math.round(100*n.ramUsed/n.ramTotal):0}%`:`Waiting for data`;case`voice`:return t.voice.mode;case`network`:return n?n.netDown===0&&n.netUp===0?`n/a`:`↓ ${Math.round(n.netDown/1024)} KB/s ↑ ${Math.round(n.netUp/1024)} KB/s`:`Waiting for data`;case`feed`:return t.chat.at(-1)?.text??`Nothing yet`;case`radar`:return[`This screen`,t.deviceOnline?`PC`:null,t.voice.available?`Voice`:null].filter(Boolean).join(` · `);case`approval`:return`None waiting`;default:return t.office.enabled&&t.office.workers.length>0?`${t.office.workers.length} worker${t.office.workers.length===1?``:`s`}`:`No workers yet`}}function QM({usage:e,reset:t=null,real:n=!1,style:r,onClick:i}){let a=typeof e==`number`&&Number.isFinite(e);return(0,p.jsxs)(`button`,{type:`button`,className:`ob-usage-label ob-hit`,"data-widget":`usage`,title:n?`How full your Claude subscription's five-hour window is`:`Today's usage compared with your busiest day of the last 30`,style:r,onClick:i,"aria-label":a?n?`Usage ${Math.round(e)} percent of the five-hour window${t?`, resets in ${t}`:``}`:`Usage ${Math.round(e)} percent of your busiest day`:`Usage, no data yet`,children:[`USAGE `,a?`${Math.round(e)}%`:`—`,t?` · RESET ${t}`:``]})}function $M({hud:e,state:t,preview:n}){let r=JM(e.clock.seconds?1e3:15e3),i=e.clock.locale||void 0,a=r.toLocaleTimeString(i,{hour:`2-digit`,minute:`2-digit`,...e.clock.seconds?{second:`2-digit`}:{},hour12:e.clock.hour12}),o=r.toLocaleDateString(i,{weekday:`short`,day:`2-digit`,month:`short`}),s=`M330 44H560L590 20H1010L1040 44H1270`,c=t.connection===`open`;return(0,p.jsxs)(`g`,{"data-testid":`orbital-topbar`,children:[(0,p.jsx)(`path`,{className:`ob-topbar-base`,d:s}),(0,p.jsx)(`path`,{className:`ob-topbar-run`,d:s,pathLength:100}),(0,p.jsx)(`text`,{className:`ob-title`,x:`800`,y:`40`,textAnchor:`middle`,children:`F R I E N D`}),n&&(0,p.jsx)(`text`,{className:`ob-sample-tag`,x:`800`,y:`62`,textAnchor:`middle`,children:`SAMPLE DATA · NOT REAL`}),(0,p.jsx)(`circle`,{className:c?`ob-pulse`:void 0,cx:`30`,cy:`34`,r:`4`,fill:c?`#34d399`:`#fb923c`}),(0,p.jsxs)(`text`,{className:`ob-lab`,x:`40`,y:`38`,children:[(t.assistantName||`FRIEND`).toUpperCase(),` · `,c?`ONLINE`:`OFFLINE`]}),(0,p.jsxs)(`text`,{className:`ob-dim`,x:`40`,y:`58`,children:[e.terminalLabel,` · VOICE · `,t.voice.mode,` LINK · `,typeof location>`u`?``:location.host]}),(0,p.jsxs)(`text`,{className:`ob-lab`,x:`1560`,y:`38`,textAnchor:`end`,children:[a,` · `,o]})]})}function eN({hud:e,state:t,usage:n=null,viewport:r,usageApi:i,send:a=()=>{},onHire:o,onLaunch:s,onExpand:c}){let{w:u,h:d}=Mj(r),f=qM(),m=cC(u,d),h=e.preview===!0&&m===`orbit`,g=mM(h?`full`:e.density,e.widgets,m,t.approval!==null),_=h?{...t,stats:WM(Date.now()),voice:{...t.voice,mode:`listening`,level:.85}}:t,v=t.approval!==null,y=t.approval?.needsPin===!0,b=e=>e.id===`approval`?v?`orange`:`cyan`:e.tone,[x,S]=(0,l.useState)(null),[C,w]=(0,l.useState)(null),[T,E]=(0,l.useState)(!1),D=JM(3e4),O=(0,l.useRef)(null),k=(0,l.useCallback)(()=>{S(null),w(null),E(!1),O.current?.focus(),O.current=null},[]),A=e=>()=>{x===null&&C===null&&!T&&(O.current=document.activeElement instanceof HTMLElement?document.activeElement:null),w(null),E(!1),S(e),c({kind:`widget`,id:e})};(0,l.useEffect)(()=>{if(x===null&&C===null&&!T||v)return;let e=e=>{e.key===`Escape`&&(e.preventDefault(),e.stopImmediatePropagation(),k())};return window.addEventListener(`keydown`,e,!0),()=>window.removeEventListener(`keydown`,e,!0)},[x,C,T,v,k]);let j=m===`compact`?u-16:Math.max(280,Math.min(760,u*.62)),ee={x:(u-j)/2,y:d*.14,width:j,height:Math.max(220,Math.min(560,d*.7))},M=v?null:x,N=M&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`div`,{className:`ob-backdrop ob-hit`,onPointerDown:e=>{e.stopPropagation(),k()}}),(0,p.jsx)(jj,{children:(0,p.jsx)(NM,{id:M,state:t,rect:ee,...i?{usageApi:i}:{},onClose:k})})]}),P=t.office.enabled&&!h,F=v||!P?void 0:t.office.workers.find(e=>e.id===C),te=e=>{x===null&&C===null&&!T&&(O.current=document.activeElement instanceof HTMLElement?document.activeElement:null),S(null),E(!1),w(e)},ne=P&&t.office.workers.length>0,re=()=>{x===null&&C===null&&!T&&(O.current=document.activeElement instanceof HTMLElement?document.activeElement:null),S(null),w(null),E(!0)},I={...ee,x:Math.max(8,ee.x-60),width:Math.min(u-16,ee.width+120)},ie=T&&ne&&!v&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`div`,{className:`ob-backdrop ob-hit`,onPointerDown:e=>{e.stopPropagation(),k()}}),(0,p.jsx)(jj,{children:(0,p.jsx)(IM,{workers:t.office.workers,name:t.assistantName||`Friend`,rect:I,onWorker:te,onClose:k})})]}),ae=F&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`div`,{className:`ob-backdrop ob-hit`,onPointerDown:e=>{e.stopPropagation(),k()}}),(0,p.jsx)(jj,{children:(0,p.jsx)(PM,{worker:F,feed:t.office.feed[F.id]??[],rect:ee,send:a,onClose:k})})]}),L=m===`compact`?u-16:Math.max(340,Math.min(480,u*.34)),R=Math.min(d-16,y?Math.max(300,Math.min(520,d*.7)):Math.max(260,Math.min(420,d*.55))),oe={x:(u-L)/2,y:(d-R)/2,width:L,height:R},se=v,ce=se&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`div`,{className:`ob-backdrop ob-modal-backdrop`}),(0,p.jsx)(jj,{children:(0,p.jsx)(Ij,{"data-widget":`approval`,variant:`octagon`,tone:`orange`,title:`Approvals`,running:!0,className:`ob-zone ob-hit ob-static ob-modal`,style:{position:`absolute`,left:oe.x,top:oe.y,width:oe.width,height:oe.height},children:(0,p.jsx)(GM,{approval:t.approval,send:a})})})]}),le={className:`orbital`,"data-testid":`orbital`,"data-mode":m,"data-hud-anim":e.animations,...f?{"data-paused":``}:{}},ue=g.some(e=>e.id===`usage`),z=h?{value:42,reset:null,real:!1}:uM(t.office.quota,n,D.getTime()),B=e=>{switch(e){case`system`:return(0,p.jsx)(xM,{stats:_.stats});case`network`:return(0,p.jsx)(CM,{stats:_.stats});case`radar`:return(0,p.jsx)(wM,{deviceOnline:_.deviceOnline,voiceAvailable:_.voice.available,...h?{blips:HM}:{}});case`voice`:return(0,p.jsx)(kM,{level:_.voice.level,mode:_.voice.mode});case`feed`:{let e=P?cM(t.office.feed,t.office.workers):[];return(0,p.jsx)(yM,{lines:h?RM:e.length>0?e:_.chat,activity:_.activity,busy:h||e.length>0?!1:_.busy,marquee:h})}case`tickets`:return P?(0,p.jsx)(EM,{cells:nM(t.office.tickets),...rM(t.office.tickets)?{project:rM(t.office.tickets)}:{}}):(0,p.jsx)(EM,{...h?{cells:BM,project:`landing-page`}:{}});case`budget`:return(0,p.jsx)(hM,{...h?{rings:VM}:P?{rings:aM(t.office.workers)}:{}});default:return null}};if(m===`compact`){let n=e=>(0,p.jsx)(jj,{children:(0,p.jsx)(Ij,{"data-widget":e.id,variant:`chamfer`,tone:b(e),title:e.title,className:`ob-zone ob-hit`,style:{minWidth:170,height:100,flex:`none`},role:`button`,tabIndex:0,"aria-label":e.title,onClick:A(e.id),onKeyDown:YM(A(e.id)),children:(0,p.jsx)(`p`,{className:`ob-li`,children:ZM(e.id,t)})})},e.id);return(0,p.jsxs)(`div`,{...le,children:[(0,p.jsx)(Fj,{}),(0,p.jsxs)(`div`,{className:`ob-chips`,children:[ne&&(0,p.jsxs)(`button`,{type:`button`,className:`ob-chip ob-hit`,onClick:re,children:[`Team · `,t.office.workers.length]}),P&&t.office.workers.map(e=>(0,p.jsx)(`button`,{type:`button`,className:`ob-chip ob-hit`,onClick:()=>te(e.id),children:e.name},e.id)),e.launcher.map(e=>(0,p.jsxs)(`button`,{type:`button`,className:`ob-chip ob-hit`,onClick:()=>s(e),children:[(0,p.jsx)(`span`,{"aria-hidden":`true`,children:e.icon}),` `,e.label]},e.id))]}),(0,p.jsx)(`p`,{className:`ob-compact-status`,children:XM(t)}),(0,p.jsxs)(`div`,{className:`ob-strip`,children:[g.filter(e=>e.anchor!==`centre`&&!(e.id===`approval`&&v)).map(n),ue&&(0,p.jsx)(QM,{usage:z.value,reset:z.reset,real:z.real,onClick:A(`usage`)})]}),N,ae,ie,ce]})}let V=nC(u,d),de=sC(ZS,900),fe=e.launcher.map(e=>({id:e.id,label:e.label,glyph:e.icon,caption:e.label,status:`idle`,onClick:()=>s(e)})),pe=P?$j(t.office.workers,!0):[],me=e=>({id:e.id,label:e.label,glyph:e.glyph,caption:e.caption,status:e.status,onClick:()=>o?.()}),he=pe.map((e,t)=>e.kind===`hire`?me(e):{id:e.id,label:e.label,glyph:e.glyph,caption:e.caption,status:e.status,detail:e.detail,...LM[t]?{at:LM[t].at}:{},onClick:()=>te(e.id)}),H=h?LM.map(e=>({id:e.id,label:e.label,glyph:e.label,status:e.status,detail:e.detail,at:e.at,onClick:()=>{}})):P?t.office.workers.length>0?he:[...fe,...he]:fe,ge=oC(H.length,ZS,900),_e=z.value,ve=(e,t,n)=>{let r=rC(e,0,0,u,d);return(0,p.jsx)(`div`,{className:`ob-canvas ob-canvas-${t}`,style:{left:r.x,top:r.y,width:ZS,height:900,transform:`scale(${V})`},children:n})},U=e=>{let n={left:e.box.x,top:e.box.y,width:e.box.w,height:e.box.h};return e.id===`approval`?se?null:(0,p.jsx)(jj,{children:(0,p.jsx)(`div`,{"data-widget":`approval`,className:`ob-w ob-hit ob-static`,style:n,children:v?(0,p.jsx)(Ij,{variant:`octagon`,tone:`orange`,running:!0,className:`ob-approval-frame`,children:(0,p.jsx)(GM,{approval:t.approval,send:a})}):h?(0,p.jsx)(Ij,{variant:`octagon`,tone:`orange`,running:!0,className:`ob-approval-frame`,children:(0,p.jsx)(GM,{approval:UM,send:()=>{}})}):(0,p.jsx)(Ij,{variant:`bracket`,title:`Approvals`,children:(0,p.jsx)(GM,{approval:null,send:a})})})},e.id):(0,p.jsx)(jj,{children:(0,p.jsx)(`div`,{"data-widget":e.id,className:`ob-w ob-hit`,style:n,role:`button`,tabIndex:0,"aria-label":e.title,onClick:A(e.id),onKeyDown:YM(A(e.id)),children:B(e.id)})},e.id)},ye=e=>g.filter(t=>t.anchor===e),W=(t.assistantName||`FRIEND`).toUpperCase(),be=Math.min(1,Math.max(0,t.voice.level,t.presence.amplitude)),xe=rC(`centre`,0,0,u,d);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`div`,{className:`ob-base`,"aria-hidden":`true`,children:(0,p.jsx)(`div`,{className:`ob-canvas`,style:{left:xe.x,top:xe.y,width:ZS,height:900,transform:`scale(${V})`},children:(0,p.jsx)(`svg`,{className:`ob-scene`,width:ZS,height:900,viewBox:`0 0 ${ZS} 900`,children:(0,p.jsx)(`g`,{className:`ob-disc-wrap`,style:{transform:`scale(${Number((1+.18*be).toFixed(3))})`},children:(0,p.jsx)(`circle`,{className:`ob-disc ob-breathe`,cx:de.cx,cy:de.cy,r:`104`,fill:`url(#ob-orbg)`,filter:`url(#ob-glow2)`})})})})}),(0,p.jsxs)(`div`,{...le,style:{"--s":V},children:[(0,p.jsx)(Fj,{}),(0,p.jsx)(`div`,{className:`ob-bg`,"aria-hidden":`true`}),(0,p.jsx)(`span`,{className:`ob-corner ob-tl`,"aria-hidden":`true`}),(0,p.jsx)(`span`,{className:`ob-corner ob-tr`,"aria-hidden":`true`}),(0,p.jsx)(`span`,{className:`ob-corner ob-bl`,"aria-hidden":`true`}),(0,p.jsx)(`span`,{className:`ob-corner ob-br`,"aria-hidden":`true`}),ve(`centre`,`centre`,(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`svg`,{className:`ob-scene`,width:ZS,height:900,viewBox:`0 0 ${ZS} 900`,"aria-hidden":`true`,children:[(0,p.jsx)(jj,{children:(0,p.jsx)($M,{hud:e,state:_,preview:h})}),(0,p.jsx)(`circle`,{cx:de.cx,cy:de.cy,r:`104`,className:`ob-orb-ring`}),(0,p.jsx)(`circle`,{cx:de.cx,cy:de.cy,r:`104`,className:`ob-ping`}),(0,p.jsx)(`g`,{className:`ob-spin ob-fast`,children:(0,p.jsx)(`circle`,{cx:de.cx,cy:de.cy,r:`128`,className:`ob-ring-dash`})}),(0,p.jsx)(`g`,{className:`ob-spin ob-reverse`,children:(0,p.jsx)(`circle`,{cx:de.cx,cy:de.cy,r:`150`,className:`ob-ring-long`})}),(0,p.jsx)(`g`,{className:`ob-spin`,children:(0,p.jsx)(`circle`,{cx:de.cx,cy:de.cy,r:`172`,className:`ob-ring-thin`})}),(0,p.jsx)(`circle`,{cx:de.cx,cy:de.cy,r:300,className:`ob-orbit`}),(0,p.jsx)(`g`,{className:`ob-spin ob-reverse ob-slow`,children:(0,p.jsx)(`circle`,{cx:de.cx,cy:de.cy,r:`330`,className:`ob-ring-outer`})}),ge.map((e,t)=>{let n={x:Math.cos(e.angle*Math.PI/180),y:Math.sin(e.angle*Math.PI/180)};return(0,p.jsx)(Zj,{tone:H[t].status===`waiting`?`orange`:`cyan`,x1:de.cx+n.x*104,y1:de.cy+n.y*104,x2:de.cx+n.x*266,y2:de.cy+n.y*266},H[t].id)}),H.map(e=>e.at&&e.detail&&(0,p.jsx)(`text`,{className:`ob-node-detail${e.status===`running`?` ob-grn`:e.status===`waiting`?` ob-org`:``}`,x:e.at.x,y:e.at.y,textAnchor:e.at.anchor,children:e.detail},e.id))]}),ne&&(0,p.jsxs)(`button`,{type:`button`,className:`ob-team-btn ob-hit`,style:{left:de.cx,top:de.cy+52},onClick:re,children:[`TEAM · `,t.office.workers.length]}),(0,p.jsxs)(`div`,{className:`ob-orb-label`,style:{left:de.cx,top:de.cy},"aria-hidden":`true`,children:[(0,p.jsx)(`b`,{children:W}),(0,p.jsx)(`small`,{children:sM(t.voice.mode,h?{enabled:!1,workers:[]}:t.office)})]}),ue&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`div`,{className:`ob-usage-ring`,style:{left:de.cx-230,top:de.cy-230,width:460,height:460},children:(0,p.jsx)(Jj,{value:_e??0,radius:205,size:460})}),(0,p.jsx)(QM,{usage:_e,reset:z.reset,real:z.real,style:{position:`absolute`,left:800,top:692,transform:`translate(-50%, -50%)`},onClick:A(`usage`)})]}),ge.map((e,t)=>{let n=H[t];return(0,p.jsx)(jj,{children:(0,p.jsx)(Xj,{x:e.x,y:e.y,label:n.label,glyph:n.glyph,status:n.status,...n.caption?{caption:n.caption}:{},...n.detail?{detail:n.detail}:{},onClick:n.onClick})},n.id)}),(0,p.jsx)(`div`,{className:`ob-cmd`,"aria-hidden":`true`,children:(0,p.jsx)(`small`,{children:`[ HOLD TO TALK ]`})})]})),ve(`left`,`left`,ye(`left`).map(U)),ve(`right`,`right`,ye(`right`).map(U)),N,ae,ie,ce]})]})}var tN=3e5,nN=(e=new Date)=>`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`,rN={today:0,peak:0,share:null,error:!1};function iN(e=TS,t=!0){let[n,r]=(0,l.useState)(rN);return(0,l.useEffect)(()=>{if(!t)return;let n=!0,i=()=>e.summary(30).then(e=>{if(!n)return;let t=e.days.map(e=>({day:e.day,n:e.input+e.output})),i=Math.max(0,...t.map(e=>e.n)),a=t.find(e=>e.day===nN())?.n??0;r({today:a,peak:i,share:i>0?Math.min(1,Math.max(0,a/i)):null,error:!1})}).catch(()=>n&&r({...rN,error:!0}));i();let a=setInterval(()=>void i(),tN);return()=>{n=!1,clearInterval(a)}},[e,t]),n}var aN=(e,t=18)=>(0,p.jsx)(`svg`,{width:t,height:t,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:e}),oN=()=>aN((0,p.jsx)(`path`,{d:`M7 4.5v15l12-7.5z`,fill:`currentColor`})),sN=()=>aN((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`rect`,{x:`6`,y:`4.5`,width:`4`,height:`15`,fill:`currentColor`}),(0,p.jsx)(`rect`,{x:`14`,y:`4.5`,width:`4`,height:`15`,fill:`currentColor`})]})),cN=()=>aN((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M5 5v14l10-7z`,fill:`currentColor`}),(0,p.jsx)(`path`,{d:`M18 5v14`})]})),lN=()=>aN((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M19 5v14L9 12z`,fill:`currentColor`}),(0,p.jsx)(`path`,{d:`M6 5v14`})]})),uN=()=>aN((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M3 7h3.5c3 0 4 2 5.5 5s2.500 5 5.500 5H21`}),(0,p.jsx)(`path`,{d:`M3 17h3.5c1.500 0 2.500-.6 3.400-1.800M13.500 8.800C14.500 7.600 15.500 7 17 7h4`}),(0,p.jsx)(`path`,{d:`m18.500 4.500 2.500 2.500-2.500 2.500M18.500 14.500l2.500 2.500-2.500 2.500`})]})),dN=()=>aN((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M17 3l3 3-3 3`}),(0,p.jsx)(`path`,{d:`M4 11V9a3 3 0 0 1 3-3h13M7 21l-3-3 3-3`}),(0,p.jsx)(`path`,{d:`M20 13v2a3 3 0 0 1-3 3H4`})]})),fN=()=>aN((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M4 9.500v5h3.500L12 18.500v-13L7.500 9.500z`,fill:`currentColor`}),(0,p.jsx)(`path`,{d:`M15.500 9a4 4 0 0 1 0 6M18 6.500a7.500 7.500 0 0 1 0 11`})]})),pN=()=>aN((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M4 9.500v5h3.500L12 18.500v-13L7.500 9.500z`,fill:`currentColor`}),(0,p.jsx)(`path`,{d:`m16 9 5 6M21 9l-5 6`})]})),mN=()=>aN((0,p.jsx)(`path`,{d:`M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5`})),hN=()=>aN((0,p.jsx)(`path`,{d:`M9 4v5H4M15 4v5h5M9 20v-5H4M15 20v-5h5`})),gN=()=>aN((0,p.jsx)(`path`,{d:`M6 6l12 12M18 6 6 18`})),_N=()=>aN((0,p.jsx)(`path`,{d:`M9 18V6l10-2v12`}),22),vN=56,yN=()=>({bars:new Float32Array(vN),bass:0,left:0,right:0});function bN(e,t,n,r,i){let a=n?.82:.9;if(t&&n){t.getByteFrequencyData(i);let n=Math.min(i.length,96);for(let t=0;t<vN;t++){let r=Math.min(n-1,Math.floor((t/vN)**1.6*n));e.bars[t]=Math.max((i[r]??0)/255,e.bars[t]*a)}}else if(n)for(let t=0;t<vN;t++)e.bars[t]=Math.max(.12+.28*Math.abs(Math.sin(r/420+t*.55)*Math.cos(r/900+t*.21)),e.bars[t]*a);else for(let t=0;t<vN;t++)e.bars[t]=e.bars[t]*a;let o=0;for(let t=0;t<6;t++)o+=e.bars[t];e.bass=Math.min(1,o/6*1.15);let s=0,c=0;for(let t=0;t<vN/2;t++)s+=e.bars[t],c+=e.bars[t+vN/2];e.left=Math.min(1,s/(vN/2)*1.6),e.right=Math.min(1,c/(vN/2)*3.2)}function xN({progress:e,playing:t,cover:n,analyser:r,levels:i,visualizer:a,animate:o,size:s}){let c=(0,l.useRef)(null),u=(0,l.useRef)(null),d=(0,l.useRef)(new Uint8Array(new ArrayBuffer(128)));(0,l.useEffect)(()=>{let e=c.current,n=e?.getContext(`2d`);if(!e||!n||!o)return;let l=0,f=Math.min(2,window.devicePixelRatio||1);e.width=e.height=Math.round(s*f);let p=getComputedStyle(e).getPropertyValue(`--accent`).trim()||`#3fd8ff`,m=e=>{if(bN(i,r,t,e,d.current),u.current?.style.setProperty(`--bass`,i.bass.toFixed(3)),n.setTransform(f,0,0,f,0,0),n.clearRect(0,0,s,s),a){let e=s/2,t=s*.335,r=s*.135;n.lineCap=`round`,n.lineWidth=Math.max(1.5,s/90);for(let a=0;a<vN;a++){let o=a/vN*Math.PI*2-Math.PI/2,s=i.bars[a],c=2+s*r;n.strokeStyle=p,n.globalAlpha=.35+s*.65,n.beginPath(),n.moveTo(e+Math.cos(o)*t,e+Math.sin(o)*t),n.lineTo(e+Math.cos(o)*(t+c),e+Math.sin(o)*(t+c)),n.stroke()}n.globalAlpha=1}(t||!i.bars.every(e=>e<.01)||a)&&(l=requestAnimationFrame(m))};return l=requestAnimationFrame(m),()=>cancelAnimationFrame(l)},[r,t,a,o,s,i]);let f=Math.max(0,Math.min(1,e))*100;return(0,p.jsxs)(`div`,{ref:u,className:`hud-dial${t?` playing`:``}`,style:{width:s,height:s},role:`img`,"aria-label":`Playback dial`,children:[(0,p.jsxs)(`svg`,{className:`hud-dial-svg`,viewBox:`0 0 200 200`,"aria-hidden":`true`,children:[(0,p.jsx)(`circle`,{className:`hud-dial-ticks`,cx:`100`,cy:`100`,r:`96`}),(0,p.jsx)(`circle`,{className:`hud-dial-track`,cx:`100`,cy:`100`,r:`88`}),(0,p.jsx)(`circle`,{className:`hud-dial-arc`,cx:`100`,cy:`100`,r:`88`,pathLength:`100`,strokeDasharray:`${f} 100`,transform:`rotate(-90 100 100)`}),(0,p.jsx)(`circle`,{className:`hud-dial-inner`,cx:`100`,cy:`100`,r:`62`}),(0,p.jsxs)(`g`,{className:`hud-needle`,children:[(0,p.jsx)(`line`,{x1:`100`,y1:`100`,x2:`100`,y2:`14`}),(0,p.jsx)(`circle`,{cx:`100`,cy:`14`,r:`2.500`})]})]}),(0,p.jsx)(`canvas`,{ref:c,className:`hud-spectrum`,style:{width:s,height:s},"aria-hidden":`true`}),(0,p.jsx)(`div`,{className:`hud-cover`,style:n?{backgroundImage:`url("${n}")`}:void 0,children:!n&&(0,p.jsx)(_N,{})})]})}var SN=e=>{let t=Math.max(0,Math.floor(Number.isFinite(e)?e:0));return`${Math.floor(t/60)}:${String(t%60).padStart(2,`0`)}`},CN=new Map,wN=e=>{let t=zu(e);return t&&t.source===`local`?t.id:null},TN=e=>zu(e)?.source===`spotify`,EN=e=>zu(e)?.source===`soundcloud`,DN=e=>zu(e)?.source===`audius`,ON={spotify:`Spotify`,soundcloud:`SoundCloud`,audius:`Audius`};function kN(e){let[t,n]=(0,l.useState)(e?CN.get(e)??!1:!1);return(0,l.useEffect)(()=>{if(!e)return n(!1);if(CN.has(e))return n(CN.get(e));let t=!0,r=new Image;r.onload=()=>{CN.set(e,!0),t&&n(!0)},r.onerror=()=>{CN.set(e,!1),t&&n(!1)};let i=wN(e);return i?(r.src=`/api/music/cover/${i}`,()=>{t=!1}):n(!1)},[e]),e&&t?`/api/music/cover/${wN(e)}`:null}async function AN(e,t){let n=await fetch(`/api/music/library?q=${encodeURIComponent(e)}&limit=${t}`);return n.ok?await n.json():{tracks:[],total:0}}function jN(){let[e,t]=(0,l.useState)(null);return(0,l.useEffect)(()=>{let e=!0;return fetch(`/api/music/sources`).then(e=>e.ok?e.json():null).then(n=>{let r={};for(let e of[`spotify`,`soundcloud`,`audius`]){let t=n?.sources?.find(t=>t.id===e)?.status;t&&(r[e]={connected:t.connected,needs:t.needs})}e&&n&&t(r)}).catch(()=>{}),()=>{e=!1}},[]),e}async function MN(e,t,n){let r=await fetch(`/api/music/search?q=${encodeURIComponent(t)}&source=${e}&limit=${n}`);if(!r.ok)return{tracks:[],total:0};let i=((await r.json()).tracks??[]).map(e=>({id:e.ref,title:e.title,artist:e.artist,album:e.album,durationSec:e.durationSec}));return{tracks:i,total:i.length}}var NN=e=>({id:e.id,title:e.title,artist:e.artist,album:e.album,durationSec:e.durationSec});function PN({levels:e,animate:t,side:n}){let r=(0,l.useRef)(null);return(0,l.useEffect)(()=>{if(!t)return;let i=0,a=r.current,o=()=>{if(a){let t=n===`left`?e.left:e.right,r=Math.round(t*12);a.querySelectorAll(`i`).forEach((e,t)=>e.classList.toggle(`on`,t<r))}i=requestAnimationFrame(o)};return i=requestAnimationFrame(o),()=>cancelAnimationFrame(i)},[e,t,n]),(0,p.jsx)(`div`,{ref:r,className:`hud-levels ${n}`,"aria-hidden":`true`,children:Array.from({length:12},(e,t)=>(0,p.jsx)(`i`,{},t))})}function FN({player:e,anim:t}){let{state:n,dispatch:r}=e,i=(0,l.useCallback)(async()=>{if(n.queue.length>0)return r({type:`resume`});let e=await AN(``,500);r({type:`play`,tracks:e.tracks.map(NN),mode:`replace`,...n.shuffle?{shuffle:!0}:{}})},[n.queue.length,n.shuffle,r]),a=e=>n=>{t!==`off`&&kj(n),e()};return(0,p.jsxs)(`div`,{className:`hud-controls`,role:`group`,"aria-label":`Player controls`,children:[(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":`Shuffle`,"aria-pressed":n.shuffle,title:`Shuffle`,onClick:()=>r({type:`shuffle`}),children:(0,p.jsx)(uN,{})}),(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":`Previous track`,title:`Previous`,onPointerDown:a(()=>{}),onClick:()=>r({type:`previous`}),children:(0,p.jsx)(lN,{})}),(0,p.jsx)(`button`,{type:`button`,className:`hud-btn hud-btn-main`,"aria-label":n.playing?`Pause`:`Play`,title:n.playing?`Pause`:`Play`,onPointerDown:a(()=>{}),onClick:()=>n.playing?r({type:`pause`}):void i(),children:n.playing?(0,p.jsx)(sN,{}):(0,p.jsx)(oN,{})}),(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":`Next track`,title:`Next`,onPointerDown:a(()=>{}),onClick:()=>r({type:`next`}),children:(0,p.jsx)(cN,{})}),(0,p.jsxs)(`button`,{type:`button`,className:`hud-btn${n.repeat===`off`?``:` on`}`,"aria-label":`Repeat: ${n.repeat}`,title:`Repeat: ${n.repeat}`,onClick:()=>r({type:`repeat`,mode:n.repeat===`off`?`all`:n.repeat===`all`?`one`:`off`}),children:[(0,p.jsx)(dN,{}),n.repeat===`one`&&(0,p.jsx)(`sup`,{children:`1`})]})]})}function IN({player:e}){let{state:t,dispatch:n}=e,r=t.duration>0?t.position/t.duration*100:0;return(0,p.jsxs)(`div`,{className:`hud-timeline`,children:[(0,p.jsx)(`span`,{className:`hud-time`,children:SN(t.position)}),(0,p.jsx)(`input`,{type:`range`,className:`hud-range`,"aria-label":`Position`,min:0,max:Math.max(1,Math.floor(t.duration)),step:1,value:Math.min(Math.floor(t.position),Math.max(1,Math.floor(t.duration))),style:{"--fill":`${r}%`},disabled:t.duration<=0,onChange:e=>n({type:`seek`,seconds:Number(e.target.value)})}),(0,p.jsxs)(`span`,{className:`hud-time`,children:[`-`,SN(Math.max(0,t.duration-t.position))]})]})}function LN({player:e}){let{state:t,dispatch:n}=e;return(0,p.jsxs)(`div`,{className:`hud-volume`,children:[(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":t.muted?`Unmute`:`Mute`,onClick:()=>n({type:`mute`}),children:t.muted||t.volume===0?(0,p.jsx)(pN,{}):(0,p.jsx)(fN,{})}),(0,p.jsx)(`input`,{type:`range`,className:`hud-range`,"aria-label":`Volume`,min:0,max:100,value:t.muted?0:t.volume,style:{"--fill":`${t.muted?0:t.volume}%`},onChange:e=>n({type:`volume`,level:Number(e.target.value)})})]})}function RN({player:e,anim:t}){let{state:n,dispatch:r}=e,[i,a]=(0,l.useState)(n.queue.length?`queue`:`library`),[o,s]=(0,l.useState)(``),[c,u]=(0,l.useState)(`folder`),[d,f]=(0,l.useState)(null),m=jN(),h=[`spotify`,`soundcloud`,`audius`].filter(e=>m?.[e]?.connected),g=c!==`folder`&&h.includes(c)?c:null,_=g?m?.[g]?.needs:null;(0,l.useEffect)(()=>{if(i!==`library`)return;let e=!0;if(g&&!o.trim()){f(null);return}let t=()=>g?MN(g,o.trim(),30):AN(o,100),n=setTimeout(()=>void t().then(t=>e&&f(t)),o?250:0);return()=>{e=!1,clearTimeout(n)}},[i,o,g]);let v=i===`queue`?n.queue.map((e,t)=>({track:e,index:t})):(d?.tracks??[]).map((e,t)=>({track:NN(e),index:t}));return(0,p.jsxs)(`div`,{className:`hud-playlist`,children:[(0,p.jsxs)(`div`,{className:`hud-tabs`,role:`tablist`,children:[[`queue`,`library`].map(e=>(0,p.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":i===e,className:`hud-chip${i===e?` on`:``}`,onClick:()=>a(e),children:e===`queue`?`Queue (${n.queue.length})`:`Library`},e)),i===`queue`&&n.queue.length>0&&(0,p.jsx)(`button`,{type:`button`,className:`hud-chip`,onClick:()=>r({type:`clear`}),children:`Clear`})]}),i===`library`&&h.length>0&&(0,p.jsx)(`div`,{className:`hud-tabs`,role:`tablist`,"aria-label":`Where to look`,children:[`folder`,...h].map(e=>(0,p.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":c===e,className:`hud-chip${c===e?` on`:``}`,onClick:()=>{u(e),f(null)},children:e===`folder`?`Folder`:ON[e]},e))}),i===`library`&&(0,p.jsx)(`input`,{className:`hud-search`,type:`search`,placeholder:`Search title, artist or album`,"aria-label":`Search the music`,value:o,onChange:e=>s(e.target.value)}),(0,p.jsxs)(`ul`,{className:`hud-list`,children:[v.length===0&&(0,p.jsx)(`li`,{className:`hud-empty`,children:i===`queue`?`The queue is empty.`:g&&!o.trim()?`Type to search ${ON[g]}.`:d?`No music matches.`:`Loading…`}),i===`library`&&g&&_&&(0,p.jsx)(`li`,{className:`hud-empty`,children:_}),v.map(({track:e,index:a},o)=>{let s=i===`queue`&&a===n.index;return(0,p.jsxs)(`li`,{className:`hud-tab hud-cut${s?` current`:``}${t===`full`?` hud-boot`:``}`,style:{"--i":Math.min(o,12)},children:[(0,p.jsxs)(`button`,{type:`button`,className:`hud-tab-main`,"aria-current":s?`true`:void 0,onPointerDown:t===`off`?void 0:kj,onClick:()=>r(i===`queue`?{type:`jump`,index:a}:{type:`play`,tracks:(d?.tracks??[]).map(NN),mode:`replace`,start:a}),children:[(0,p.jsx)(`span`,{className:`hud-tab-title`,children:e.title}),(0,p.jsxs)(`small`,{children:[e.artist||e.album,TN(e.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`SPOTIFY`}),EN(e.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`SOUNDCLOUD`}),DN(e.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`AUDIUS`})]})]}),i===`library`&&(0,p.jsx)(`button`,{type:`button`,className:`hud-mini`,"aria-label":`Add ${e.title} to the queue`,title:`Add to the queue`,onClick:()=>r({type:`play`,tracks:[e],mode:`add`}),children:`+`}),i===`queue`&&(0,p.jsx)(`button`,{type:`button`,className:`hud-mini`,"aria-label":`Remove ${e.title} from the queue`,title:`Remove`,onClick:()=>r({type:`remove`,index:a}),children:`×`})]},`${e.id}-${a}`)})]})]})}function zN({player:e,music:t,animations:n}){let{state:r,dispatch:i,current:a,blocked:o,notice:s,analyser:c,unlock:u}=e,d=(0,l.useMemo)(yN,[]),f=kN(a?.id),m=r.view===`full`,h=Oj(a?.title??``,n===`full`);if(!t?.folderSet||r.view===`hidden`)return null;let g=r.duration>0?r.position/r.duration:0,_=n!==`off`;return(0,p.jsxs)(me,{id:`music`,label:`Music player`,wholeBox:!0,testId:`music`,className:`hud hud-music hud-cut ${m?`full`:`mini`}${r.playing?` playing`:``}${n===`full`?` hud-boot`:``}`,children:[(0,p.jsxs)(`header`,{className:`hud-music-head`,children:[(0,p.jsx)(`span`,{className:`hud-kicker`,children:`Media player`}),(0,p.jsxs)(`span`,{className:`hud-head-actions`,children:[(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":m?`Smaller player`:`Bigger player`,title:m?`Smaller`:`Bigger`,onClick:()=>i({type:`view`,view:m?`mini`:`full`}),children:m?(0,p.jsx)(hN,{}):(0,p.jsx)(mN,{})}),(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":`Hide the player`,title:`Hide (the music keeps playing)`,onClick:()=>i({type:`view`,view:`hidden`}),children:(0,p.jsx)(gN,{})})]})]}),(0,p.jsxs)(`div`,{className:`hud-music-body`,children:[(0,p.jsxs)(`div`,{className:`hud-music-left`,children:[m&&(0,p.jsx)(PN,{levels:d,animate:_,side:`left`}),(0,p.jsx)(xN,{progress:g,playing:r.playing,cover:f,analyser:c,levels:d,visualizer:t.visualizer,animate:_,size:m?250:112}),m&&(0,p.jsx)(PN,{levels:d,animate:_,side:`right`})]}),(0,p.jsxs)(`div`,{className:`hud-music-main`,children:[(0,p.jsxs)(`div`,{className:`hud-now`,"aria-live":`polite`,children:[(0,p.jsx)(`b`,{className:`hud-title`,children:a?h:`Nothing playing`}),(0,p.jsxs)(`small`,{className:`hud-sub`,children:[a?[a.artist,a.album].filter(Boolean).join(` — `):`Press play, or ask for some music.`,a&&TN(a.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`SPOTIFY`}),a&&EN(a.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`SOUNDCLOUD`}),a&&DN(a.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`AUDIUS`}),e.remote&&(0,p.jsx)(`em`,{className:`hud-source`,children:`THIS PC`})]})]}),(0,p.jsx)(IN,{player:e}),(0,p.jsx)(FN,{player:e,anim:n}),m&&(0,p.jsx)(LN,{player:e}),s&&(0,p.jsx)(`p`,{className:`hud-notice`,role:`status`,children:s}),o&&(0,p.jsx)(`button`,{type:`button`,className:`hud-unlock`,onClick:u,children:`Tap to enable sound`})]}),m&&(0,p.jsx)(RN,{player:e,anim:n})]})]})}var BN=/^spotify:/,VN=class{local;makeSpotify;active;spotify=null;listeners=new Map;wrapped=new Map;vol=1;mute=!1;pre=``;constructor(e,t){this.local=e,this.makeSpotify=t,this.active=e}get element(){return this.local}get error(){return this.active.error??null}wrap(e){let t=this.wrapped.get(e);return t||(t={local:()=>{this.active===this.local&&e()},spot:()=>{this.spotify&&this.active===this.spotify&&e()}},this.wrapped.set(e,t)),t}spot(){if(!this.spotify){let e=this.makeSpotify();e.volume=this.vol,e.muted=this.mute,e.preload=this.pre;for(let[t,n]of this.listeners)for(let r of n)e.addEventListener(t,this.wrap(r).spot);this.spotify=e}return this.spotify}dispose(){this.spotify?.dispose?.(),this.spotify=null,this.active=this.local}get src(){return this.active.src}set src(e){let t=BN.test(e)?this.spot():this.local;t===this.active?e===``&&this.active.pause():(this.active.pause(),this.active=t),this.active.src=e}get currentTime(){return this.active.currentTime}set currentTime(e){this.active.currentTime=e}get duration(){return this.active.duration}get paused(){return this.active.paused}get volume(){return this.vol}set volume(e){this.vol=e,this.local.volume=e,this.spotify&&(this.spotify.volume=e)}get muted(){return this.mute}set muted(e){this.mute=e,this.local.muted=e,this.spotify&&(this.spotify.muted=e)}get preload(){return this.pre}set preload(e){this.pre=e,this.local.preload=e,this.spotify&&(this.spotify.preload=e)}play(){return this.active.play()}pause(){this.active.pause()}addEventListener(e,t){let n=this.listeners.get(e);n||this.listeners.set(e,n=new Set),n.add(t);let r=this.wrap(t);this.local.addEventListener(e,r.local),this.spotify?.addEventListener(e,r.spot)}removeEventListener(e,t){this.listeners.get(e)?.delete(t);let n=this.wrap(t);this.local.removeEventListener(e,n.local),this.spotify?.removeEventListener(e,n.spot)}},HN=/^spotify:([A-Za-z0-9_-]{1,64})$/,UN=`Spotify Premium is needed to play on this screen.`;async function WN(){let e=await fetch(`/api/music/spotify/token`,{cache:`no-store`});if(!e.ok)throw Error(`Spotify is not connected.`);return(await e.json()).accessToken}function GN(){let e=window;return e.Spotify?Promise.resolve(e.Spotify):new Promise((t,n)=>{e.onSpotifyWebPlaybackSDKReady=()=>e.Spotify?t(e.Spotify):n(Error(`no sdk`));let r=document.createElement(`script`);r.src=`https://sdk.scdn.co/spotify-player.js`,r.async=!0,r.onerror=()=>n(Error(`blocked`)),document.head.appendChild(r)})}function KN(e){let t=e.fetch??((...e)=>fetch(...e)),n=e.now??Date.now,r=new Map,i=null,a=null,o=null,s=null,c=!1,l=null,u=null,d=0,f=0,p=0,m=!0,h=1,g=!1,_,v=e=>{for(let t of r.get(e)??[])t()},y=()=>g?0:h,b=()=>{_&&clearInterval(_),_=void 0},x=()=>{_||=setInterval(()=>v(`timeupdate`),250)},S={error:null,preload:``,get src(){return s??``},set src(e){let t=HN.exec(e);c=e!==``&&!t,s=t?e:null,l=null,u=null,d=0,p=0,S.error=null,t||b()},get currentTime(){return m?d:d+(n()-f)/1e3},set currentTime(e){d=e,f=n(),i?.seek(Math.round(e*1e3)).catch(()=>{})},get duration(){return p},get paused(){return m},get volume(){return h},set volume(e){h=e,i?.setVolume(y()).catch(()=>{})},get muted(){return g},set muted(e){g=e,i?.setVolume(y()).catch(()=>{})},async play(){if(c||!s)throw Error(`That is not a Spotify track.`);let r=HN.exec(s),a=s,o=await T();if(s!==a)return;if(l===s){await i?.resume().catch(()=>{}),m=!1,f=n(),x();return}let u=await e.getToken().catch(()=>null);if(!u)throw C(`Spotify is not connected. Connect it in Plugins, Spotify.`);let d;try{d=await t(`https://api.spotify.com/v1/me/player/play?device_id=${encodeURIComponent(o)}`,{method:`PUT`,headers:{authorization:`Bearer ${u}`,"content-type":`application/json`},body:JSON.stringify({uris:[`spotify:track:${r[1]}`]})})}catch{throw C(`Friend could not reach Spotify right now.`)}if(d.status===403)throw C(UN);if(d.status===401)throw C(`Spotify sign-in has ended. Reconnect Spotify in Plugins, Spotify.`);if(d.status===404)throw C(`Spotify could not find this screen or that track.`);if(d.status===429)throw C(`Spotify is asking Friend to slow down. Try again in a minute.`);if(!d.ok)throw C(`Spotify could not play that.`);s===a&&(l=a,m=!1,f=n(),x())},pause(){m=!0,d+=(n()-f)/1e3,f=n(),b(),i?.pause().catch(()=>{})},dispose(){b();try{i?.disconnect()}catch{}i=null,a=null,s=null,l=null},addEventListener(e,t){let n=r.get(e);n||r.set(e,n=new Set),n.add(t)},removeEventListener(e,t){r.get(e)?.delete(t)}};function C(e){S.error=e,m=!0,b(),v(`error`);let t=Error(e),n=o;return o=null,n?.reject(t),t}function w(e){if(!e)return;d=e.position/1e3,f=n(),p=e.duration/1e3,m=e.paused,v(`timeupdate`),v(`loadedmetadata`),v(`durationchange`);let t=s?HN.exec(s)?.[1]:void 0;t&&e.paused&&e.position===0&&u!==s&&(e.track_window.previous_tracks??[]).some(e=>e.id===t)&&(u=s,b(),v(`ended`))}function T(){if(a)return Promise.resolve(a);if(o)return o.promise;let t,n,r=new Promise((e,r)=>{t=e,n=r}),s={promise:r,resolve:t,reject:n};o=s;let c=setTimeout(()=>{o===s&&C(`Spotify's player did not start. Check that this browser allows Spotify's player, then try again.`)},e.readyTimeoutMs??15e3),l=()=>clearTimeout(c);return r.then(l,l),(async()=>{try{if(!i){let t;try{t=await(e.loadSdk??GN)()}catch{o===s&&C(`Spotify's player could not be loaded. Check that nothing blocks sdk.scdn.co.`);return}let n=new t.Player({name:e.deviceName??`Friend`,volume:y(),getOAuthToken:t=>{e.getToken().then(t,()=>{})}});i=n,n.addListener(`ready`,(e=>{a=e.device_id;let t=o;o=null,t?.resolve(e.device_id)})),n.addListener(`not_ready`,(()=>{a=null})),n.addListener(`player_state_changed`,(e=>w(e))),n.addListener(`account_error`,(()=>void C(UN))),n.addListener(`authentication_error`,(()=>void C(`Spotify sign-in has ended. Reconnect Spotify in Plugins, Spotify.`))),n.addListener(`initialization_error`,(()=>void C(`Spotify's player does not work in this browser.`))),n.addListener(`playback_error`,(()=>void C(`Spotify could not play that.`)))}!await i.connect()&&o===s&&C(`Spotify's player could not connect.`)}catch{o===s&&C(`Spotify's player could not connect.`)}})(),r}return S}var qN=e=>{let t=zu(e);return t?t.source===`local`?`/api/music/track/${t.id}`:t.source===`soundcloud`||t.source===`audius`?`/api/music/stream/${e}`:e:`/api/music/track/${e}`},JN=(e,t)=>od(e,t),YN=`friend.music`,XN=1e3,ZN=1.5,QN=()=>{try{return JSON.parse(localStorage.getItem(YN)??`{}`)}catch{return{}}},$N=e=>{try{localStorage.setItem(YN,JSON.stringify({volume:e.volume,muted:e.muted,shuffle:e.shuffle,repeat:e.repeat,view:e.view}))}catch{}};function eP({music:e,cmd:t,send:n,connection:r,createAudio:i,createSpotify:a,remote:o=!1}){let[s,c]=(0,l.useReducer)(JN,void 0,()=>{let e=QN();return nd({volume:e.volume??70,shuffle:e.shuffle??!1,repeat:e.repeat??`all`,view:e.view??`mini`})}),[u,d]=(0,l.useState)(!1),[f,p]=(0,l.useState)(null),[m,h]=(0,l.useState)(null),g=(0,l.useRef)(null),_=(0,l.useRef)(!1),v=(0,l.useRef)(s);v.current=s;let y=(0,l.useRef)(!1),b=(0,l.useRef)(null),x=(0,l.useRef)(0),S=(0,l.useRef)(!1);(0,l.useEffect)(()=>{if(!e||S.current)return;S.current=!0;let t=QN();c({type:`volume`,level:t.volume??e.volume}),c({type:`repeat`,mode:t.repeat??e.repeat}),(t.shuffle??e.shuffle)&&c({type:`shuffle`,on:!0}),c({type:`view`,view:t.view??e.startView}),t.muted&&c({type:`mute`,on:!0})},[e]);let C=()=>{if(!g.current){let e=new VN(i?i():new Audio,a??(()=>KN({getToken:WN})));e.preload=`auto`,g.current=e}return g.current},w=(0,l.useRef)(!1),T=(0,l.useCallback)(()=>{let e=g.current;if(e&&e.src){w.current=!0;try{let t=e.play();t&&typeof t.then==`function`?t.then(()=>{w.current=!1,d(!1)},()=>{w.current=!1;let e=g.current?.error??null;e?p(e):d(!0)}):(w.current=!1,d(!1))}catch{w.current=!1,d(!0)}E.current||O()}},[]),E=(0,l.useRef)(!1),D=(0,l.useRef)(null),O=()=>{let e=g.current,t=e instanceof VN?e.element:e,n=typeof window<`u`?window.AudioContext??window.webkitAudioContext:void 0;if(t&&n&&typeof t.play==`function`)try{let e=new n;D.current=e;let r=e.createMediaElementSource(t),i=e.createAnalyser();i.fftSize=256,i.smoothingTimeConstant=.82,r.connect(i),i.connect(e.destination),E.current=!0,h(i)}catch{E.current=!0}};(0,l.useEffect)(()=>{if(o)return;let e=C(),t=0,n=()=>{let n=Date.now();n-t<250||(t=n,c({type:`time`,position:e.currentTime||0,duration:Number.isFinite(e.duration)?e.duration:0}))},r=()=>c({type:`time`,position:e.currentTime||0,duration:Number.isFinite(e.duration)?e.duration:0}),i=()=>c({type:`ended`}),a=()=>{let t=e.error??null;p(t),c(t?{type:`pause`}:{type:`failed`})};return e.addEventListener(`timeupdate`,n),e.addEventListener(`loadedmetadata`,r),e.addEventListener(`durationchange`,r),e.addEventListener(`ended`,i),e.addEventListener(`error`,a),()=>{e.removeEventListener(`timeupdate`,n),e.removeEventListener(`loadedmetadata`,r),e.removeEventListener(`durationchange`,r),e.removeEventListener(`ended`,i),e.removeEventListener(`error`,a),e.pause(),D.current?.close().catch(()=>{}),D.current=null,e.dispose(),b.current=null,g.current=null,E.current=!1,h(null)}},[o]),(0,l.useEffect)(()=>{o&&c({type:`stop`})},[o]);let k=s.index>=0?s.queue[s.index]??null:null;(0,l.useEffect)(()=>{let e=g.current;if(o||!e)return;let t=k?.id??null;if(t!==b.current){if(b.current=t,!t){e.pause(),e.src=``;return}p(null),e.src=qN(t),s.playing&&T()}},[k?.id,s.playing,T,o]),(0,l.useEffect)(()=>{let e=g.current;!o&&e&&e.src&&(s.playing&&e.paused&&!_.current&&!w.current?T():!s.playing&&!e.paused&&e.pause())},[s.playing,s.position,T,o]),(0,l.useEffect)(()=>{let e=g.current;e&&(e.volume=s.volume/100*dD.level,e.muted=s.muted)},[s.volume,s.muted]),(0,l.useEffect)(()=>dD.subscribe(e=>{let t=g.current;t&&(t.volume=v.current.volume/100*e)}),[]),(0,l.useEffect)(()=>{let e=g.current;e&&e.src&&Math.abs((e.currentTime||0)-s.position)>ZN&&(e.currentTime=s.position)},[s.position]),(0,l.useEffect)(()=>$N(s),[s.volume,s.muted,s.shuffle,s.repeat,s.view]),(0,l.useEffect)(()=>{if(!t||t.n===x.current)return;x.current=t.n;let e=sd(t.command);e&&c(e)},[t]),(0,l.useEffect)(()=>{let e=()=>{y.current=!0,_.current&&T()};return window.addEventListener(`pointerdown`,e,{passive:!0}),window.addEventListener(`keydown`,e),()=>{window.removeEventListener(`pointerdown`,e),window.removeEventListener(`keydown`,e)}},[T]),_.current=u;let A=(0,l.useRef)(0);return(0,l.useEffect)(()=>{if(r!==`open`||o)return;let e=()=>{let e=v.current,t=e.index>=0?e.queue[e.index]:void 0;A.current=Date.now(),n({type:`music.state`,state:{playing:e.playing,trackId:t?.id??null,title:t?.title??``,artist:t?.artist??``,album:t?.album??``,position:e.position,duration:e.duration,volume:e.volume,muted:e.muted,shuffle:e.shuffle,repeat:e.repeat,view:e.view,queue:e.queue.slice(0,50).map(e=>({id:e.id,title:e.title.slice(0,200)})),index:e.index,active:(typeof document>`u`||document.visibilityState===`visible`)&&y.current}})};e();let t=setInterval(()=>s.playing&&Date.now()-A.current>=XN&&e(),XN);return()=>clearInterval(t)},[r,o,k?.id,s.playing,s.volume,s.muted,s.shuffle,s.repeat,s.view,s.queue.length,s.index]),(0,l.useEffect)(()=>{let e=typeof navigator<`u`?navigator.mediaSession:void 0;if(e&&!o)try{k&&typeof MediaMetadata<`u`&&(e.metadata=new MediaMetadata({title:k.title,artist:k.artist,album:k.album,artwork:[{src:`/api/music/cover/${k.id}`}]})),e.playbackState=s.playing?`playing`:k?`paused`:`none`,e.setActionHandler(`play`,()=>c({type:`resume`})),e.setActionHandler(`pause`,()=>c({type:`pause`})),e.setActionHandler(`previoustrack`,()=>c({type:`previous`})),e.setActionHandler(`nexttrack`,()=>c({type:`next`})),e.setActionHandler(`seekto`,e=>typeof e.seekTime==`number`&&c({type:`seek`,seconds:e.seekTime}))}catch{}},[k?.id,s.playing,o]),{remote:!1,state:s,dispatch:c,current:k,blocked:u,notice:f,analyser:m,unlock:T,audio:g}}function tP(e,t){if(!e)return{state:{queue:[],index:-1,playing:!1,position:0,duration:0,volume:70,muted:!1,shuffle:!1,repeat:`all`,view:t},current:null};let n=e.queue.map((t,n)=>n===e.index?{id:t.id,title:e.title||t.title,artist:e.artist,album:e.album,durationSec:e.duration>0?e.duration:null}:{id:t.id,title:t.title,artist:``,album:``,durationSec:null});return{state:{queue:n,index:e.index,playing:e.playing,position:e.position,duration:e.duration,volume:e.volume,muted:e.muted,shuffle:e.shuffle,repeat:e.repeat,view:t},current:e.index>=0?n[e.index]??null:null}}function nP({local:e,host:t,send:n}){let r=e.state.view,{state:i,current:a}=(0,l.useMemo)(()=>tP(t,r),[t,r]),o=e.dispatch,s=(0,l.useCallback)(e=>{if(e.type===`view`)return o(e);let t=cd(e);t&&n({type:`music.remote`,command:t})},[o,n]);return(0,l.useMemo)(()=>({...e,remote:!0,state:i,dispatch:s,current:a,blocked:!1,notice:null,analyser:null,unlock:()=>{}}),[e,i,s,a])}function rP(e){let t=new URLSearchParams(e).get(`music`);return t===`connected`?{level:`info`,text:`Spotify is connected. Ask Friend to play something.`}:t===`failed`?{level:`warn`,text:`Spotify did not connect. Open Plugins, Spotify and press Connect again.`}:null}function iP({onSignedOut:e}){let{state:t,send:n,dispatch:r,voice:i,handsFree:a,useHere:o}=$A(e);fj(i),pj(i),yj(n,t.connection);let[s,c]=(0,l.useState)(xe),u=(0,l.useCallback)(e=>{Se(e),c(e)},[]),[d,f]=(0,l.useState)(we),m=(0,l.useCallback)(e=>{Te(e),f(e)},[]);(0,l.useEffect)(()=>i.setQuiet(d),[i,d]);let[h,g]=(0,l.useState)(!1),[_,v]=(0,l.useState)(!1),[y,b]=(0,l.useState)(!1),[x,S]=(0,l.useState)(void 0),[C,w]=(0,l.useState)(null),[T,E]=(0,l.useState)(ye),D=e=>{W(e),E(e)},O=T===`orb`?Ye:Ee,[k,A]=(0,l.useState)(!1),[j,ee]=(0,l.useState)(0),[M,P]=(0,l.useState)(null),F=de(t.view),te=t.music?.output===`host`,ne=eP({music:t.music,cmd:t.musicCmd,send:n,connection:t.connection,remote:te}),re=nP({local:ne,host:t.hostMusic,send:n}),ae=te?re:ne,R=t.hud?.animations??`full`,oe=e=>{let{type:i,value:a}=e.action;if(i===`url`)window.open(a,`_blank`,`noopener,noreferrer`);else if(i===`prompt`)n({type:`chat.send`,text:a});else if(i===`music`||i===`panel`&&a===`music`){if(!t.music?.folderSet){r({type:`alert.add`,level:`info`,text:`No music folder is chosen yet. Pick one in Settings, Widgets, and the player opens.`}),w(`widgets`);return}if(i===`panel`){F.toggle(`music`,!0),ae.state.view===`hidden`&&ae.dispatch({type:`view`,view:`mini`});return}let e=sd({action:a});e&&ae.dispatch(e)}else a===`plugins`?b(!0):a===`settings`?w(`model`):(a===`chat`||a===`tasks`)&&F.toggle(a,!0)},se=t.viewKnown&&t.hud?.layout===`orbital`,ce=iN(void 0,se),le=Mj(),ue=cC(le.w,le.h)===`orbit`,z=(0,l.useMemo)(()=>{let e=s?{...t,objects:[],captions:``}:t;return se&&ue?{...e,look:{...e.look,size:e.look.size*QS}}:e},[s,t,se,ue]),B=(0,l.useRef)(!1);(0,l.useEffect)(()=>{B.current||!t.voice.available||t.voice.enrolled||(B.current=!0,r({type:`alert.add`,level:`info`,text:`Voice recognition is not set up. Press Esc, then Enroll my voice.`}))},[t.voice.available,t.voice.enrolled,r]);let fe=L(),pe=(0,l.useRef)(!1);(0,l.useEffect)(()=>{if(!fe||pe.current||t.connection!==`open`)return;pe.current=!0;let e=!1;try{e=localStorage.getItem(`friend.touchHint`)===`1`,localStorage.setItem(`friend.touchHint`,`1`)}catch{}e||r({type:`alert.add`,level:`info`,text:`Hold the round mic button to talk, or tap it once to start and again to send. The keyboard button types; the menu button opens settings.`})},[fe,t.connection,r]);let me=t.uiOpen?.n??0,H=t.uiOpen?.integration;(0,l.useEffect)(()=>{me!==0&&(S(H),b(!0))},[me,H]);let ge=(0,l.useRef)(!1);(0,l.useEffect)(()=>{if(ge.current)return;ge.current=!0;let e=rP(window.location.search);e&&(r({type:`alert.add`,level:e.level,text:e.text}),window.history.replaceState(null,``,window.location.pathname))},[r]);let ve=(0,l.useRef)(!1);(0,l.useEffect)(()=>{ve.current||t.connection!==`open`||(ve.current=!0,fetch(`/api/history`).then(e=>e.ok?e.json():[]).then(e=>r({type:`chat.seed`,lines:e})).catch(()=>{}))},[t.connection,r]),(0,l.useEffect)(()=>{t.connection===`open`&&n({type:`ui.panels`,open:[...F.show.chat?[`chat`]:[],...F.show.tasks?[`tasks`]:[]]})},[t.connection,F.show.chat,F.show.tasks,n]);let U=(0,l.useRef)(!1);(0,l.useEffect)(()=>{t.viewKnown&&t.view===`minimal`&&!U.current&&(U.current=!0,r({type:`alert.add`,level:`info`,text:`The view is Minimal, so the status line and clock are hidden. Press Esc, then View, to bring them back.`}))},[t.viewKnown,t.view,r]);let be=e=>{pd.save({view:e}).catch(e=>r({type:`alert.add`,level:`warn`,text:e.message}))},Ce=(0,l.useMemo)(()=>I({notify:e=>r({type:`alert.add`,level:`info`,text:e}),openSettings:()=>w(`model`),openLook:()=>w(`look`),openConnectors:()=>A(!0),openPlugins:()=>b(!0),openVoice:t.voice.available?()=>g(!0):null,muted:s,setMuted:u,quiet:d,setQuiet:m,cameraOn:t.camera.enabled,setCamera:e=>r({type:`camera.enable`,value:e}),clearScreen:()=>{for(let e of t.objects)n({type:`stage.event`,objectId:e.id,event:`dismiss`})},statusLine:()=>ct({connection:t.connection,deviceOnline:t.deviceOnline,approval:t.approval,voiceMode:t.voice.mode,busy:t.busy,activity:t.activity}).text,endSession:t=>{fetch(t===`lock`?`/api/lock`:`/api/logout`,{method:`POST`,headers:{"content-type":`application/json`},body:`{}`}).catch(()=>{}).finally(e)},panelOn:e=>F.show[e],setPanel:(e,t)=>F.toggle(e,t),view:t.view,setView:be,openHelp:P,resetLayout:()=>{V(),window.location.reload()}}),[r,n,s,e,F.show,F.toggle,t.view,t.voice.available,t.voice.mode,t.camera.enabled,t.objects,t.connection,t.deviceOnline,t.approval,t.busy,t.activity]);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(_O,{state:z,send:n,dispatch:r,voice:i,slash:Ce,onMenu:()=>ee(e=>e+1),hudLayer:se&&t.hud?(0,p.jsx)(jj,{children:(0,p.jsx)(eN,{hud:t.hud,state:t,usage:ce.share===null?null:ce.share*100,send:n,onHire:()=>w(`office`),onLaunch:oe,onExpand:()=>{}})}):null}),(0,p.jsxs)(dt,{approval:t.approval,challenge:t.challenge,cameraStream:t.camera.stream,alerts:t.alerts,connection:t.connection,deviceOnline:t.deviceOnline,voiceMode:t.voice.mode,busy:t.busy,activity:t.activity,showStatus:t.viewKnown&&F.show.status&&!se,showClock:t.viewKnown&&F.show.clock&&!se,profile:t.viewKnown&&F.show.profile&&!se?{ownerName:t.ownerName,speaker:t.speaker}:null,assistantName:t.assistantName,hud:t.hud,hudApproval:se,send:n,dispatch:r,children:[t.viewKnown&&F.show.chat&&(0,p.jsx)(he,{lines:t.chat,live:t.chatLive,onSend:e=>n({type:`chat.send`,text:e}),onClose:()=>F.toggle(`chat`,!1)}),t.viewKnown&&F.show.tasks&&(0,p.jsx)(_e,{busy:t.busy,onClose:()=>F.toggle(`tasks`,!1)}),t.viewKnown&&F.show.launcher&&t.hud&&!se&&(0,p.jsx)(Aj,{items:t.hud.launcher,animations:R,onAction:oe}),t.viewKnown&&F.show.music&&(0,p.jsx)(zN,{player:ae,music:t.music,animations:R}),h&&(0,p.jsx)(oj,{onClose:()=>g(!1)}),_&&(0,p.jsx)(wj,{onClose:()=>v(!1)}),y&&(0,p.jsx)(_f,{variant:T===`orb`?`holo`:`classic`,...x?{initialConfigure:x}:{},onClose:()=>{b(!1),S(void 0)}}),C&&(0,p.jsx)(JS,{initialTab:C,variant:T===`orb`?`holo`:`classic`,onClose:()=>w(null)}),k&&(0,p.jsx)(N,{variant:T===`orb`?`holo`:`classic`,onClose:()=>A(!1)}),M&&(0,p.jsx)(ie,{commands:M,onClose:()=>P(null)})]}),(0,p.jsx)(O,{voiceMode:t.voice.mode,busy:t.busy,onClassic:()=>D(`classic`),onOrb:()=>D(`orb`),muted:s,onToggleMute:()=>u(!s),quiet:d,onToggleQuiet:()=>m(!d),onSignedOut:e,voiceAvailable:t.voice.available,voiceEnrolled:t.voice.enrolled,onEnroll:()=>g(!0),onHousehold:()=>v(!0),handsFreeOn:a.on,onToggleHandsFree:a.supported?a.toggle:void 0,assistantName:t.assistantName,onPlugins:()=>b(!0),onSettings:e=>w(e??`model`),onConnectors:()=>A(!0),cameraOn:t.camera.enabled,onToggleCamera:()=>r({type:`camera.enable`,value:!t.camera.enabled}),chatOn:F.show.chat,onToggleChat:()=>F.toggle(`chat`),tasksOn:F.show.tasks,onToggleTasks:()=>F.toggle(`tasks`),musicOn:F.show.music,onToggleMusic:()=>F.toggle(`music`),launcherOn:F.show.launcher,onToggleLauncher:()=>F.toggle(`launcher`),view:t.view,onView:be,openRequest:j}),t.connection===`elsewhere`&&(0,p.jsx)(mj,{onUseHere:o})]})}function aP(){let[e,t]=(0,l.useState)(`loading`);return(0,l.useEffect)(()=>{let e=!0,n=n=>e&&t(n);return(async()=>{try{if(!(await(await fetch(`/api/state`)).json()).hasOwner)return n(`setup`);let e=await(await fetch(`/api/session`,{cache:`no-store`})).json();n(e.signedIn===!0?`stage`:`login`)}catch{n(`login`)}})(),()=>{e=!1}},[]),e===`loading`?(0,p.jsx)(`div`,{className:`boot`,"aria-busy":`true`}):e===`setup`?(0,p.jsx)(g,{onDone:()=>t(`login`)}):e===`login`?(0,p.jsx)(h,{onLoggedIn:()=>t(`stage`)}):(0,p.jsx)(iP,{onSignedOut:()=>t(`login`)})}(0,u.createRoot)(document.getElementById(`root`)).render((0,p.jsx)(l.StrictMode,{children:(0,p.jsx)(aP,{})}));
|
|
4459
|
+
`)}async function $k(e,t){let n=t.fontEmbedCSS==null?t.skipFonts?null:await Qk(e,t):t.fontEmbedCSS;if(n){let t=document.createElement(`style`),r=document.createTextNode(n);t.appendChild(r),e.firstChild?e.insertBefore(t,e.firstChild):e.appendChild(t)}}async function eA(e,t={}){let{width:n,height:r}=WO(e,t),i=await Dk(e,t,!0);return await $k(i,t),await Vk(i,t),Hk(i,t),await XO(i,n,r)}async function tA(e,t={}){let{width:n,height:r}=WO(e,t),i=await JO(await eA(e,t)),a=document.createElement(`canvas`),o=a.getContext(`2d`),s=t.pixelRatio||GO(),c=t.canvasWidth||n,l=t.canvasHeight||r;return a.width=c*s,a.height=l*s,t.skipAutoScale||qO(a),a.style.width=`${c}`,a.style.height=`${l}`,t.backgroundColor&&(o.fillStyle=t.backgroundColor,o.fillRect(0,0,a.width,a.height)),o.drawImage(i,0,0,a.width,a.height),a}var nA=1600,rA=.85;function iA(e,t){let n=Math.min(1,nA/Math.max(e,t,1));return{width:Math.max(1,Math.round(e*n)),height:Math.max(1,Math.round(t*n))}}async function aA(){let e=document.documentElement.getBoundingClientRect(),t=await tA(document.body,{width:Math.round(e.width),height:Math.round(e.height),pixelRatio:1,backgroundColor:`#050b10`,filter:e=>!(e instanceof HTMLElement&&e.dataset.noCapture!==void 0)}),n=iA(t.width,t.height),r=document.createElement(`canvas`);return r.width=n.width,r.height=n.height,r.getContext(`2d`).drawImage(t,0,0,n.width,n.height),new Promise((e,t)=>r.toBlob(n=>n?e(n):t(Error(`Could not encode the picture.`)),`image/jpeg`,rA))}var oA=class{opts;active=null;constructor(e){this.opts=e}async handle(e){if(e.type===`screen.cancel`){this.active&&this.active.id===e.id&&(this.active.cancelled=!0);return}if(this.active)return this.opts.send({type:`screen.denied`,id:e.id,reason:`busy`});let t={id:e.id,cancelled:!1};this.active=t;try{let n=await(this.opts.capture??aA)();if(t.cancelled)return;try{await this.opts.upload(e.id,n)}catch{this.opts.dispatch({type:`alert.add`,level:`warn`,text:`Could not send the picture of the screen to Friend.`})}}catch(n){t.cancelled||this.opts.send({type:`screen.denied`,id:e.id,reason:sA(n)})}finally{this.active===t&&(this.active=null)}}dispose(){this.active&&(this.active.cancelled=!0)}};function sA(e){return e?.name===`NotSupportedError`?`unsupported`:`failed`}function cA(e,t){let n=(0,l.useRef)(t);n.current=t;let r=(0,l.useRef)(!1),i=(0,l.useRef)(null);(0,l.useEffect)(()=>{let t=e===`listening`||e===`speaking`;i.current&&clearTimeout(i.current),i.current=null,t?r.current||(r.current=!0,n.current({type:`audio.activity`,active:!0})):r.current&&(i.current=setTimeout(()=>{i.current=null,r.current=!1,n.current({type:`audio.activity`,active:!1})},900))},[e]),(0,l.useEffect)(()=>()=>{i.current&&clearTimeout(i.current),r.current&&(r.current=!1,n.current({type:`audio.activity`,active:!1}))},[])}var lA={401:`Please sign in again.`,413:`That recording was too long.`,409:`Friend is busy with the last request. Try again in a moment.`,429:`You're talking too fast. Wait a moment.`,503:`Voice is not available. Run: friend voice setup`};async function uA(e,t,n){let r;try{r=await fetch(e,{method:`POST`,headers:{"content-type":t.type||`audio/webm`},body:t,signal:n})}catch(e){throw e.name===`AbortError`?e:Error(`Could not reach Friend. Check the connection.`)}if(!r.ok){let e=``;try{e=(await r.json()).error??``}catch{}throw Error(e||lA[r.status]||`The voice request failed (${r.status}).`)}let i=await r.json();return{text:typeof i.text==`string`?i.text:``,wake:i.wake===!0}}async function dA(e,t){return{text:(await uA(`/api/voice/utterance`,e,t)).text}}async function fA(e,t){let n=await uA(`/api/voice/utterance?wake=1`,e,t);return{text:n.text,wake:n.wake===!0}}var pA=null;function mA(){try{pA??=new AudioContext,pA.resume().catch(()=>{});let e=pA.currentTime;for(let[t,n]of[660,990].entries()){let r=pA.createOscillator(),i=pA.createGain();r.frequency.value=n,i.gain.setValueAtTime(0,e+t*.11),i.gain.linearRampToValueAtTime(.18,e+t*.11+.02),i.gain.exponentialRampToValueAtTime(.001,e+t*.11+.14),r.connect(i).connect(pA.destination),r.start(e+t*.11),r.stop(e+t*.11+.16)}}catch{}}var hA=/busy with the last request|talking too fast/i,gA=3e4,_A=50,vA=class{deps;listener=null;awakeNow=!1;showing=!1;busyWithOne=!1;clock=null;meter=null;abort=null;lastAlert=0;constructor(e){this.deps=e}get enabled(){return this.listener!==null}get awake(){return this.awakeNow}async enable(){if(this.listener)return;let e=this.deps.makeListener({onUtterance:e=>void this.heard(e),onError:e=>{this.drop(),this.alert(e,!0)}});try{await e.start()}catch(e){this.alert(e.message,!0);return}this.listener=e}disable(){this.drop()}sync(){let e=this.listener;if(!e)return;let t=this.busyOther();if(e.pause(t),!this.awakeNow||t){this.clearClock(),this.stopMeter();return}this.deps.mode()===`idle`&&this.show(),this.clock||this.startClock(),this.startMeter()}busyOther(){let e=this.deps.mode();return e!==`listening`&&(this.showing=!1),e===`speaking`||e===`transcribing`||e===`listening`&&!this.showing}show(){this.showing=!0,this.deps.dispatch({type:`voice.mode`,mode:`listening`})}wakeUp(e){this.awakeNow=!0,e&&this.deps.chime(),this.clearClock(),this.show(),this.startClock(),this.startMeter()}sleep(){this.awakeNow=!1,this.clearClock(),this.stopMeter(),this.showing&&this.deps.dispatch({type:`voice.mode`,mode:`idle`}),this.showing=!1}drop(){let e=this.listener;this.listener=null,this.abort?.abort(),this.abort=null,this.busyWithOne=!1,this.sleep(),e?.stop()}startClock(){this.clearClock(),this.clock=setTimeout(()=>{this.clock=null,this.sleep()},this.deps.awakeMs??3e4)}clearClock(){this.clock&&clearTimeout(this.clock),this.clock=null}startMeter(){this.meter||=setInterval(()=>this.deps.dispatch({type:`voice.level`,level:this.listener?.level()??0}),_A)}stopMeter(){this.meter&&clearInterval(this.meter),this.meter=null}async heard(e){if(!this.listener||this.busyWithOne||this.busyOther())return;this.busyWithOne=!0;let t=new AbortController;this.abort=t;try{this.awakeNow?await this.request(e,t.signal):await this.check(e,t.signal)}catch(e){e.name!==`AbortError`&&!hA.test(e.message)&&this.alert(e.message,!1)}finally{this.abort===t&&(this.abort=null),this.busyWithOne=!1,this.listener&&this.awakeNow&&(this.clearClock(),this.deps.mode()===`transcribing`&&this.deps.dispatch({type:`voice.mode`,mode:`idle`}),this.sync())}}async check(e,t){let n=await this.deps.wake(e,t);this.listener&&n.wake&&this.wakeUp(!n.text)}async request(e,t){this.clearClock(),this.stopMeter(),this.showing=!1,this.deps.dispatch({type:`voice.mode`,mode:`transcribing`}),await this.deps.command(e,t)}alert(e,t){let n=Date.now();!t&&n-this.lastAlert<gA||(this.lastAlert=n,this.deps.dispatch({type:`alert.add`,level:`error`,text:e}))}},yA=0,bA=new Set;function xA(e){return bA.add(e),()=>bA.delete(e)}var SA=e=>bA.forEach(t=>{try{t(e)}catch{}}),CA=e=>/not compatible|audio capture|audiosession/i.test(String(e?.message??e));function wA(e){try{let t=navigator.audioSession;t&&t.type!==e&&(t.type=e)}catch{}}function TA(){yA===0&&wA(`playback`)}function EA(){yA++,yA===1&&SA(!0),wA(`play-and-record`);let e=!1;return()=>{e||(e=!0,yA=Math.max(0,yA-1),yA===0&&(wA(`playback`),SA(!1)))}}var DA=3,OA=.02,kA=.04,AA=class{minSpeechMs;endSilenceMs;maxMs;floor=null;loudSince=null;speaking=!1;startedAt=0;lastLoud=0;lastFeed=0;speechMs=0;constructor(e={}){this.minSpeechMs=e.minSpeechMs??300,this.endSilenceMs=e.endSilenceMs??800,this.maxMs=e.maxMs??8e3}get inSpeech(){return this.speaking}get maybeSpeech(){return this.loudSince!==null}feed(e,t){this.floor===null&&(this.floor=e);let n=e>Math.max(this.floor*DA+OA,kA),r=Math.min(100,Math.max(0,t-this.lastFeed));if(this.lastFeed=t,!this.speaking)return n?(this.loudSince??=t,t-this.loudSince<this.minSpeechMs?null:(this.speaking=!0,this.startedAt=this.loudSince,this.lastLoud=t,this.speechMs=t-this.loudSince,{type:`start`})):(this.loudSince=null,this.floor+=(e-this.floor)*(e<this.floor?.3:.02),null);n&&(this.lastLoud=t,this.speechMs+=r);let i=t-this.startedAt>=this.maxMs;if(!i&&t-this.lastLoud<this.endSilenceMs)return null;let a={type:`end`,ms:t-this.startedAt,speechMs:this.speechMs,forced:i};return this.speaking=!1,this.loudSince=null,i&&n&&(this.floor=e),a}reset(){this.speaking=!1,this.loudSince=null}},jA=[`audio/webm;codecs=opus`,`audio/webm`,`audio/mp4`,`audio/ogg;codecs=opus`],MA=50,NA=2e3,PA=2e3,FA=400,IA=e=>{let t=e?.name;return t===`NotAllowedError`||t===`SecurityError`?`Microphone permission was denied. Allow it in the browser to use hands-free.`:t===`NotFoundError`||t===`OverconstrainedError`?`No microphone was found.`:e?.message||`Could not open the microphone.`},LA=class{opts;stream=null;ctx=null;analyser=null;rec=null;chunks=[];recStartedAt=0;timer=null;seg;leaveSession=null;paused=!1;starting=!1;finishing=!1;opened=!1;now;constructor(e){this.opts=e,this.seg=new AA(e),this.now=e.now??(()=>Date.now())}static supported(){return typeof navigator<`u`&&!!navigator.mediaDevices?.getUserMedia&&typeof MediaRecorder<`u`}get listening(){return this.opened}async start(){if(!(this.opened||this.starting)){this.starting=!0;try{this.leaveSession=EA();try{this.stream=await navigator.mediaDevices.getUserMedia({audio:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}})}catch(e){throw this.leaveSession?.(),this.leaveSession=null,Error(IA(e))}for(let e of this.stream.getTracks())e.onended=()=>this.broke(`The microphone stopped working.`);try{this.ctx=new AudioContext,this.analyser=this.ctx.createAnalyser(),this.analyser.fftSize=1024,this.ctx.createMediaStreamSource(this.stream).connect(this.analyser),this.ctx.resume().catch(()=>{})}catch{throw this.release(),Error(`This browser cannot listen continuously here.`)}this.seg.reset(),this.beginRecording(),this.opened=!0,this.timer=setInterval(()=>this.tick(),MA)}finally{this.starting=!1}}}stop(){this.opened=!1,this.release()}pause(e){this.paused!==e&&(this.paused=e,this.seg.reset(),!e&&this.opened&&this.restartRecording())}level(){if(!this.analyser)return 0;let e=new Uint8Array(this.analyser.fftSize);this.analyser.getByteTimeDomainData(e);let t=0;for(let n of e)t+=((n-128)/128)**2;return Math.min(1,Math.sqrt(t/e.length)*4)}tick(){if(!this.opened)return;let e=this.now();if(this.ctx&&this.ctx.state!==`running`&&this.ctx.resume().catch(()=>{}),this.paused){e-this.recStartedAt>=NA&&this.restartRecording();return}let t=this.seg.feed(this.level(),e);t?.type===`end`?this.finish(t.ms,t.speechMs):!t&&!this.seg.inSpeech&&!this.seg.maybeSpeech&&e-this.recStartedAt>=NA&&this.restartRecording()}beginRecording(){if(!this.stream)return;let e=jA.find(e=>MediaRecorder.isTypeSupported(e));this.chunks=[];let t=new MediaRecorder(this.stream,e?{mimeType:e}:void 0);t.ondataavailable=e=>{e.data&&e.data.size>0&&this.chunks.push(e.data)},t.onerror=()=>this.broke(`The microphone stopped working.`),t.start(250),this.rec=t,this.recStartedAt=this.now()}restartRecording(){let e=this.rec;if(this.rec=null,e){e.ondataavailable=null,e.onstop=null,e.onerror=null;try{e.state!==`inactive`&&e.stop()}catch{}}this.opened&&this.beginRecording()}async finish(e,t){let n=this.rec;if(!n||this.finishing)return;this.finishing=!0;let r=n.mimeType||`audio/webm`,i=await new Promise(e=>{let t=!1,i=()=>{t||(t=!0,e(new Blob(this.chunks,{type:r})))},a=setTimeout(i,PA);n.onstop=()=>{clearTimeout(a),i()};try{n.state===`inactive`?i():n.stop()}catch{i()}});this.finishing=!1,this.rec=null,this.opened&&(this.beginRecording(),!this.paused&&e>=FA&&t>=FA/2&&i.size>0&&this.opts.onUtterance(i))}broke(e){this.opened&&(this.stop(),this.opts.onError(e))}release(){if(this.timer&&clearInterval(this.timer),this.timer=null,this.rec){this.rec.ondataavailable=null,this.rec.onstop=null,this.rec.onerror=null;try{this.rec.state!==`inactive`&&this.rec.stop()}catch{}}this.stream?.getTracks().forEach(e=>{e.onended=null,e.stop()}),this.ctx?.close().catch(()=>{}),this.stream=null,this.ctx=null,this.analyser=null,this.rec=null,this.chunks=[],this.leaveSession?.(),this.leaveSession=null}},RA=4096,zA=8,BA=20,VA=6e6;function HA(e){try{let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}catch{return null}}var UA=class{ctx=null;analyser=null;pending=new Map;queue=[];current=null;busy=!1;gen=0;isPlaying=!1;unwatch=null;listeners=new Set;unlock(){TA();let e=this.ensureContext();e.state!==`running`&&e.resume().catch(()=>{})}locked(){return!this.ctx||this.ctx.state!==`running`}enqueue(e){if(!Number.isInteger(e.seq)||e.seq<0||e.seq>RA)return;let t=HA(e.data);if(!t)return;let n=this.pending.get(e.id);if(n||(this.pending.size>=zA&&this.pending.delete(this.pending.keys().next().value),n={parts:new Map,lastSeq:null,bytes:0},this.pending.set(e.id,n)),n.bytes+=t.length,n.bytes>VA){this.pending.delete(e.id);return}if(n.parts.set(e.seq,t),e.last&&(n.lastSeq=e.seq),n.lastSeq===null||n.parts.size!==n.lastSeq+1)return;this.pending.delete(e.id);let r=new Uint8Array([...n.parts.values()].reduce((e,t)=>e+t.length,0)),i=0;for(let e=0;e<=n.lastSeq;e++){let t=n.parts.get(e);if(!t)return;r.set(t,i),i+=t.length}for(this.queue.push(r.buffer);this.queue.length>BA;)this.queue.shift();this.pump()}stop(){this.gen++,this.queue=[],this.pending.clear(),this.busy=!1;let e=this.current;if(this.current=null,e){e.onended=null;try{e.stop()}catch{}}this.setPlaying(!1)}dispose(){this.stop(),this.ctx?.close().catch(()=>{}),this.unwatch?.(),this.unwatch=null,this.ctx=null,this.analyser=null}playing(){return this.isPlaying}onChange(e){return this.listeners.add(e),()=>this.listeners.delete(e)}level(){if(!this.analyser||!this.isPlaying)return 0;let e=new Uint8Array(this.analyser.fftSize);this.analyser.getByteTimeDomainData(e);let t=0;for(let n of e)t+=((n-128)/128)**2;return Math.min(1,Math.sqrt(t/e.length)*4)}ensureContext(){if(!this.ctx){let e=window.AudioContext??window.webkitAudioContext;this.ctx=new e,this.analyser=this.ctx.createAnalyser(),this.analyser.fftSize=1024,this.analyser.connect(this.ctx.destination);let t=this.ctx;this.unwatch?.(),this.unwatch=xA(e=>{e&&t.state===`running`?t.suspend().catch(()=>{}):!e&&t.state!==`running`&&t.state!==`closed`&&t.resume().catch(()=>{})})}return this.ctx}setPlaying(e){this.isPlaying!==e&&(this.isPlaying=e,this.listeners.forEach(t=>t(e)))}async pump(){if(this.busy)return;let e=this.queue.shift();if(!e){this.setPlaying(!1);return}this.busy=!0;let t=this.gen;try{let n=this.ensureContext();if(n.state!==`running`){try{await n.resume()}catch{}if(t!==this.gen)return;if(n.state!==`running`){this.queue.unshift(e),this.busy=!1;return}}let r=await n.decodeAudioData(e);if(t!==this.gen)return;let i=n.createBufferSource();i.buffer=r,i.connect(this.analyser),i.onended=()=>{this.current===i&&(this.current=null,this.busy=!1,this.pump())},this.current=i,this.setPlaying(!0),i.start()}catch{if(t!==this.gen)return;this.busy=!1,this.pump()}}},WA=e=>new Promise(t=>setTimeout(t,e)),GA=[`audio/webm;codecs=opus`,`audio/webm`,`audio/mp4`,`audio/ogg;codecs=opus`],KA=3e3;function qA(e){let t=e;return t?.name===`NotAllowedError`||t?.name===`SecurityError`?Error(`Microphone permission was denied. Allow it in the browser to talk.`):t?.name===`NotFoundError`||t?.name===`OverconstrainedError`?Error(`No microphone was found.`):Error(t?.message||`Could not open the microphone.`)}var JA=class e{opts;stream=null;rec=null;chunks=[];ctx=null;analyser=null;timer=null;starting=!1;leaveSession=null;constructor(e={}){this.opts=e}static supported(){return typeof navigator<`u`&&!!navigator.mediaDevices?.getUserMedia&&typeof MediaRecorder<`u`}get active(){return this.rec!==null}async start(){if(!(this.rec||this.starting)){if(!e.supported())throw Error(`This browser cannot record audio here (use localhost or HTTPS).`);this.starting=!0;try{this.leaveSession=EA();try{let e=()=>navigator.mediaDevices.getUserMedia({audio:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}});try{this.stream=await e()}catch(t){if(!CA(t))throw t;await WA(250),this.leaveSession?.(),this.leaveSession=EA(),this.stream=await e()}}catch(e){throw this.leaveSession?.(),this.leaveSession=null,qA(e)}try{let e=GA.find(e=>MediaRecorder.isTypeSupported(e));this.chunks=[];let t=new MediaRecorder(this.stream,e?{mimeType:e}:void 0);t.ondataavailable=e=>{e.data&&e.data.size>0&&this.chunks.push(e.data)},t.onerror=()=>this.failed();for(let e of this.stream.getTracks())e.onended=()=>this.failed();this.openMeter(this.stream),t.start(250),this.rec=t,this.opts.maxMs&&(this.timer=setTimeout(()=>{this.timer=null,this.opts.onLimit?.()},this.opts.maxMs))}catch(e){throw this.release(),qA(e)}}finally{this.starting=!1}}}stop(){let e=this.rec;return e?new Promise(t=>{let n=!1,r=null,i=()=>{if(n)return;n=!0,r&&clearTimeout(r);let i=new Blob(this.chunks,{type:e.mimeType||`audio/webm`});this.release(),t(i)};if(r=setTimeout(i,KA),e.onstop=i,e.state===`inactive`)return i();try{e.stop()}catch{i()}}):Promise.reject(Error(`Not recording.`))}cancel(){let e=this.rec;if(e){e.ondataavailable=null,e.onstop=null,e.onerror=null;try{e.state!==`inactive`&&e.stop()}catch{}}this.release()}level(){if(!this.analyser||!this.rec)return 0;let e=new Uint8Array(this.analyser.fftSize);this.analyser.getByteTimeDomainData(e);let t=0;for(let n of e)t+=((n-128)/128)**2;return Math.min(1,Math.sqrt(t/e.length)*4)}failed(){this.rec&&(this.cancel(),this.opts.onError?.())}openMeter(e){try{this.ctx=new AudioContext,this.analyser=this.ctx.createAnalyser(),this.analyser.fftSize=1024,this.ctx.createMediaStreamSource(e).connect(this.analyser)}catch{this.analyser=null}}release(){this.timer&&clearTimeout(this.timer),this.timer=null,this.stream?.getTracks().forEach(e=>{e.onended=null,e.stop()}),this.ctx?.close().catch(()=>{}),this.stream=null,this.rec=null,this.ctx=null,this.analyser=null,this.chunks=[],this.leaveSession?.(),this.leaveSession=null}},YA=2e3,XA=()=>typeof window<`u`&&window.isSecureContext===!1,ZA=50,QA=class{deps;recorder;player;mode=`idle`;pressed=!1;disposed=!1;uploads=0;toldAboutSound=!1;quiet=!1;abort=null;poll=null;unsubscribe;constructor(e){this.deps=e;let t=()=>this.recorderFailed();this.recorder=e.recorder??e.makeRecorder?.(t)??new JA({maxMs:6e4,onLimit:()=>void this.pressEnd(),onError:t}),this.player=e.player??new UA,this.unsubscribe=this.player.onChange(e=>{this.mode!==`listening`&&this.mode!==`transcribing`&&this.setMode(e?`speaking`:`idle`)})}async pressStart(){if(!(this.pressed||this.disposed)){if(!this.deps.available()){this.alert(`warn`,`Voice is not available. Run: friend voice setup`);return}if(!(this.deps.supported?.()??JA.supported())){this.alert(`warn`,XA()?`This page is not secure, so the browser blocks the microphone. On the PC run: friend lan https on, restart Friend, and open the https:// address.`:`This browser cannot record audio here (use localhost or HTTPS).`);return}this.pressed=!0,this.player.unlock(),this.player.playing()&&(this.deps.send({type:`voice.interrupt`}),this.player.stop());try{await this.recorder.start()}catch(e){this.pressed=!1,this.alert(`error`,e.message),this.setMode(`idle`);return}if(!this.pressed){this.recorder.cancel(),this.setMode(`idle`);return}this.setMode(`listening`)}}async pressEnd(){if(!this.pressed||(this.pressed=!1,!this.recorder.active))return;let e=await this.recorder.stop();if(e.size<YA){this.alert(`info`,`Hold the key a little longer while you speak.`),this.setMode(`idle`);return}this.setMode(`transcribing`);let t=new AbortController;this.abort=t,this.uploads++;try{let{text:n}=await this.deps.post(e,t.signal);n.trim()||this.alert(`info`,`I didn't catch that.`)}catch(e){e.name!==`AbortError`&&this.alert(`error`,e.message)}finally{this.uploads--,this.abort===t&&(this.abort=null),this.settle()}}blur(){this.pressed&&(this.pressed=!1,this.recorder.cancel(),this.setMode(`idle`))}setQuiet(e){this.quiet=e,e&&this.player.stop()}handleServer(e){if(e.type!==`audio.chunk`)return this.player.stop();this.quiet||(this.player.enqueue(e),!this.toldAboutSound&&this.player.locked?.()&&(this.toldAboutSound=!0,this.deps.dispatch({type:`alert.add`,level:`info`,text:`Sound is blocked by the browser. Click or press a key once anywhere on the page to hear me.`})))}unlock(){this.player.unlock()}dispose(){this.disposed=!0,this.pressed=!1,this.stopPolling(),this.abort?.abort(),this.recorder.cancel(),this.player.stop(),this.player.dispose?.(),this.unsubscribe()}recorderFailed(){this.pressed=!1,this.recorder.cancel(),this.alert(`error`,`The microphone stopped working.`),this.setMode(`idle`)}settle(){this.uploads>0||this.mode!==`transcribing`||this.setMode(this.player.playing()?`speaking`:`idle`)}setMode(e){this.disposed||(this.mode=e,this.deps.dispatch({type:`voice.mode`,mode:e}),e===`listening`||e===`speaking`?this.startPolling():this.stopPolling())}startPolling(){this.stopPolling(),this.poll=setInterval(()=>{let e=this.mode===`listening`?this.recorder.level():this.player.level();this.deps.dispatch({type:`voice.level`,level:e})},ZA)}stopPolling(){this.poll&&clearInterval(this.poll),this.poll=null}alert(e,t){this.disposed||this.deps.dispatch({type:`alert.add`,level:e,text:t})}};function $A(e){let[t,n]=(0,l.useReducer)(DO,xO),r=(0,l.useRef)(null),i=(0,l.useRef)(null),a=(0,l.useRef)(!1),o=(0,l.useRef)(null),s=(0,l.useRef)(null),[c,u]=(0,l.useState)(!1),d=(0,l.useRef)(e);d.current=e;let f=(0,l.useRef)(t);f.current=t,(0,l.useEffect)(()=>{let e=bO();r.current=e;let t=new QA({send:t=>e.send(t),dispatch:e=>n(e),post:dA,available:()=>f.current.voice.available});i.current=t,t.setQuiet(a.current);let c=new vA({makeListener:e=>new LA(e),wake:fA,command:dA,mode:()=>f.current.voice.mode,chime:mA,dispatch:e=>n(e)});s.current=c;let l=new FO({send:t=>e.send(t),dispatch:e=>n(e),enabled:()=>f.current.camera.enabled,upload:async(e,t)=>{let n=await fetch(`/api/camera/frame/${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`image/jpeg`},body:t});if(!n.ok)throw Error(`upload failed (${n.status})`)}});o.current=l;let p=new oA({send:t=>e.send(t),dispatch:e=>n(e),upload:async(e,t)=>{let n=await fetch(`/api/screen/frame/${encodeURIComponent(e)}`,{method:`POST`,headers:{"content-type":`image/jpeg`},body:t});if(!n.ok)throw Error(`upload failed (${n.status})`)}}),m=e.onMessage(e=>{n(e);let r=e?.type,i=e?.id;(r===`camera.request`||r===`camera.cancel`)&&typeof i==`string`&&l.handle({type:r,id:i}),(r===`screen.request`||r===`screen.cancel`)&&typeof i==`string`&&p.handle({type:r,id:i}),r===`audio.duck`&&dD.set(e.level??1),(r===`audio.chunk`||r===`audio.stop`)&&t.handleServer(e)}),h=e.onState(e=>{n({type:`conn`,value:e}),e!==`open`&&dD.set(1,0),e===`unauthorized`&&d.current(),e===`elsewhere`&&(c.disable(),u(!1),t.blur(),l.dispose(),p.dispose())});return()=>{m(),h(),c.disable(),s.current=null,t.dispose(),l.dispose(),p.dispose(),e.close(),i.current=null,o.current=null,r.current=null}},[]),(0,l.useEffect)(()=>{t.camera.enabled||o.current?.dispose()},[t.camera.enabled]),(0,l.useEffect)(()=>{s.current?.sync()},[t.voice.mode]);let p=(0,l.useCallback)(async e=>{let t=s.current;if(t){e?await t.enable():t.disable(),u(t.enabled);try{localStorage.setItem(`friend.handsFree`,t.enabled?`1`:`0`)}catch{}}},[]),m=(0,l.useRef)(!1);(0,l.useEffect)(()=>{if(!m.current&&t.voice.available){m.current=!0;try{localStorage.getItem(`friend.handsFree`)===`1`&&LA.supported()&&p(!0)}catch{}}},[t.voice.available,p]);let h=(0,l.useMemo)(()=>({on:c,supported:LA.supported(),toggle:()=>void p(!s.current?.enabled)}),[c,p]),g=(0,l.useCallback)(e=>r.current?.send(e),[]);return cA(t.voice.mode,g),{state:t,send:g,dispatch:(0,l.useCallback)(e=>n(e),[]),voice:(0,l.useMemo)(()=>({pressStart:()=>void i.current?.pressStart(),pressEnd:()=>void i.current?.pressEnd(),blur:()=>i.current?.blur(),unlock:()=>i.current?.unlock(),setQuiet:e=>{a.current=e,i.current?.setQuiet(e)}}),[]),handsFree:h,useHere:(0,l.useCallback)(()=>r.current?.takeOver(),[]),officeStop:(0,l.useCallback)(e=>g({type:`office.stop`,...e?{workerId:e}:{}}),[g]),officeSay:(0,l.useCallback)((e,t)=>g({type:`office.say`,workerId:e,text:t}),[g])}}var ej={401:`Please sign in again.`,403:`Incorrect PIN.`,413:`That recording was too long.`,429:`Too many attempts. Wait a moment.`,503:`Voice is not available. Run: friend voice setup`};async function tj(e,t){let n;try{n=await fetch(e,t)}catch{throw Error(`Could not reach Friend. Check the connection.`)}if(!n.ok){let e=``;try{e=(await n.json()).error??``}catch{}throw Error(e||ej[n.status]||`The request failed (${n.status}).`)}return await n.json()}var nj=(e,t)=>({method:e,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),rj={state:()=>tj(`/api/voice/enroll`,{}),sample:e=>tj(`/api/voice/enroll/sample`,{method:`POST`,headers:{"content-type":e.type||`audio/webm`},body:e}),finish:e=>tj(`/api/voice/enroll/finish`,nj(`POST`,{pin:e})),cancel:async()=>{await tj(`/api/voice/enroll/cancel`,nj(`POST`,{}))},remove:async e=>{await tj(`/api/voice/enroll`,nj(`DELETE`,{pin:e}))}},ij=[`Friend, good evening. It is a pleasant day to get things done.`,`Open my projects and show me what changed today.`,`My voice is my key, so please remember it well.`,`Check the weather and read me the latest headlines.`,`Always protect the boss, and never trust a stranger.`],aj=15e3;function oj({api:e=rj,createRecorder:t=e=>new JA(e),onClose:n,who:r}){let[i,a]=(0,l.useState)(null),[o,s]=(0,l.useState)(0),[c,u]=(0,l.useState)(null),[f,m]=(0,l.useState)(`record`),[h,g]=(0,l.useState)(!1),[_,v]=(0,l.useState)(!1),[y,b]=(0,l.useState)(null),[x,S]=(0,l.useState)(``),C=(0,l.useRef)(!0),w=(0,l.useRef)(null);(0,l.useEffect)(()=>(C.current=!0,e.state().then(e=>{C.current&&(a(e),s(e.samples))}).catch(e=>C.current&&b(e.message)),()=>{C.current=!1,w.current?.cancel(),w.current=null}),[e]);let E=(0,l.useCallback)(async()=>{let t=w.current;if(t){w.current=null,g(!1),v(!0);try{let n=await t.stop(),r=await e.sample(n);if(!C.current)return;s(r.count),u(r.note)}catch(e){C.current&&b(e.message)}finally{C.current&&v(!1)}}},[e]),D=async()=>{b(null),u(null);let e=t({maxMs:aj,onLimit:()=>void E(),onError:()=>{w.current=null,C.current&&(g(!1),b(`The microphone stopped working. Try again.`))}});try{await e.start()}catch(e){C.current&&b(e.message);return}if(!C.current)return e.cancel();w.current=e,g(!0)},O=async e=>{b(null),v(!0);try{await e()}catch(e){C.current&&b(e.message)}finally{C.current&&(v(!1),S(``))}},k=async()=>{w.current?.cancel(),w.current=null,await e.cancel().catch(()=>{}),n()},A=i?.min??3,j=o%ij.length,ee=o<ij.length?`Phrase ${o+1} of ${ij.length}`:`Extra recording (${o} so far)`;return(0,p.jsxs)(`div`,{className:`approval enroll glass`,role:`dialog`,"aria-label":`Voice enrollment`,style:{pointerEvents:`auto`},children:[(0,p.jsx)(`div`,{className:`approval-head`,children:(0,p.jsx)(`span`,{className:`approval-title`,children:r?`Teach Friend ${r}'s voice`:`Teach Friend your voice`})}),f===`record`&&(0,p.jsxs)(p.Fragment,{children:[!r&&i?.enrolled&&(0,p.jsx)(`p`,{className:`auth-note`,children:`Your voice is already saved. Saving a new one replaces it.`}),r&&(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Hand the device to `,r,`. `,r,` reads each sentence aloud, close to the microphone, in a quiet room.`]}),(0,p.jsxs)(`p`,{className:`auth-note`,children:[ee,`. Press Record, read this aloud in a quiet room, then press Stop.`]}),(0,p.jsx)(`pre`,{className:`approval-summary`,"data-testid":`enroll-phrase`,style:{whiteSpace:`pre-wrap`},children:ij[j]}),(0,p.jsxs)(`div`,{role:`status`,className:`auth-note`,children:[o,` recorded`,o>=A?` — enough to save`:` — at least ${A} needed`,`.`,c?` ${c}`:``]}),y&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:y}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[h?(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,onClick:()=>void E(),children:`Stop`}):(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:_||!i||o>=(i?.max??8),onClick:()=>void D(),children:_?`Uploading…`:`Record`}),(0,p.jsx)(`button`,{type:`button`,style:d,disabled:h||_||o<A,onClick:()=>m(`pin-save`),children:r?`Save ${r}'s voice`:`Save my voice`}),!r&&i?.enrolled&&(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,disabled:h||_,onClick:()=>m(`pin-delete`),children:`Delete my voice`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>void k(),children:`Cancel`})]})]}),(f===`pin-save`||f===`pin-delete`)&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:f===`pin-save`?r?`Enter your PIN to save ${r}'s voice.`:`Enter your PIN to save your voice.`:`Enter your PIN to delete your saved voice.`}),(0,p.jsx)(T,{pin:x,onChange:S,onSubmit:f===`pin-save`?()=>!_&&void O(async()=>{await e.finish(x),C.current&&m(`saved`)}):void 0}),y&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:y}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[f===`pin-save`?(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:_||x.length<6,onClick:()=>void O(async()=>{await e.finish(x),C.current&&m(`saved`)}),children:`Save`}):(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,disabled:_||x.length<6,onClick:()=>void O(async()=>{await e.remove(x),C.current&&m(`deleted`)}),children:`Delete`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{S(``),b(null),m(`record`)},children:`Back`})]})]}),(f===`saved`||f===`deleted`)&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:f===`saved`?r?`${r}'s voice is saved. From now on I will know when ${r} is talking.`:`Your voice is saved. From now on I will tell you apart from other speakers.`:`Your voice was deleted. Every voice is treated as yours until you enroll again.`}),(0,p.jsx)(`div`,{className:`approval-actions`,children:(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,onClick:n,children:`Done`})})]})]})}var sj=new Set([`INPUT`,`TEXTAREA`,`SELECT`,`BUTTON`,`A`,`SUMMARY`]),cj=new Set([`button`,`checkbox`,`switch`,`tab`,`menuitem`,`link`,`radio`,`option`,`textbox`,`combobox`,`slider`]),lj=e=>e instanceof HTMLInputElement&&e.hasAttribute(`data-space-talks`)&&e.value===``,uj=e=>!lj(e)&&e instanceof HTMLElement&&(sj.has(e.tagName)||e.isContentEditable||cj.has(e.getAttribute(`role`)??``)),dj=e=>e.code===`Space`||e.key===` `;function fj(e){let t=(0,l.useRef)(e);t.current=e,(0,l.useEffect)(()=>{let e=!1,n=n=>{!dj(n)||n.ctrlKey||n.metaKey||n.altKey||uj(n.target)||uj(document.activeElement)||(n.preventDefault(),!(n.repeat||e)&&(e=!0,t.current.pressStart()))},r=n=>{dj(n)&&e&&(e=!1,n.preventDefault(),t.current.pressEnd())},i=()=>{e=!1,t.current.blur()},a=()=>{document.hidden&&i()};return window.addEventListener(`keydown`,n),window.addEventListener(`keyup`,r),window.addEventListener(`blur`,i),document.addEventListener(`visibilitychange`,a),()=>{window.removeEventListener(`keydown`,n),window.removeEventListener(`keyup`,r),window.removeEventListener(`blur`,i),document.removeEventListener(`visibilitychange`,a)}},[])}function pj(e){let t=(0,l.useRef)(e);t.current=e,(0,l.useEffect)(()=>{let e=()=>t.current.unlock(),n=[`pointerdown`,`keydown`,`touchend`];for(let t of n)window.addEventListener(t,e,{passive:!0});return()=>{for(let t of n)window.removeEventListener(t,e)}},[])}function mj({onUseHere:e}){return(0,p.jsx)(`div`,{className:`elsewhere`,role:`alertdialog`,"aria-labelledby":`elsewhere-title`,"data-testid":`elsewhere`,children:(0,p.jsxs)(`div`,{className:`elsewhere-card`,children:[(0,p.jsx)(`h2`,{id:`elsewhere-title`,children:`Friend is open in another window`}),(0,p.jsx)(`p`,{children:`Friend works in one window at a time. Click “Use here” to use it in this window instead; the other one will stop.`}),(0,p.jsx)(`button`,{type:`button`,className:`elsewhere-btn`,onClick:e,autoFocus:!0,children:`Use here`})]})})}function hj(e,t,n){let r=Math.max(100,Math.round(e)),i=Math.max(100,Math.round(t));return{width:r,height:i,kind:r<=599?`phone`:n||r<1024?`tablet`:`desktop`,orientation:i>r?`portrait`:`landscape`,touch:n}}var gj=()=>typeof matchMedia==`function`&&matchMedia(`(pointer: coarse)`).matches;function _j(){return hj(window.innerWidth,window.innerHeight,gj())}var vj=(e,t)=>!!e&&e.width===t.width&&e.height===t.height&&e.kind===t.kind&&e.orientation===t.orientation&&e.touch===t.touch;function yj(e,t){let n=(0,l.useRef)(null),r=(0,l.useRef)(e);r.current=e,(0,l.useEffect)(()=>{if(t!==`open`){n.current=null;return}let e=()=>{let e=_j();vj(n.current,e)||(n.current=e,r.current({type:`ui.screen`,...e}))};e();let i=null,a=()=>{i&&clearTimeout(i),i=setTimeout(e,400)};return window.addEventListener(`resize`,a),window.addEventListener(`orientationchange`,a),()=>{i&&clearTimeout(i),window.removeEventListener(`resize`,a),window.removeEventListener(`orientationchange`,a)}},[t])}var bj={401:`Please sign in again.`,403:`Incorrect PIN.`,413:`That recording was too long.`,429:`Too many attempts. Wait a moment.`,503:`Voice is not available. Run: friend voice setup`};async function xj(e,t={}){let n;try{n=await fetch(e,t)}catch{throw Error(`Could not reach Friend. Check the connection.`)}if(!n.ok){let e=``;try{e=(await n.json()).error??``}catch{}throw Error(e||bj[n.status]||`The request failed (${n.status}).`)}return await n.json()}var Sj=(e,t)=>({method:e,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),Cj={overview:()=>xj(`/api/voice/people`),begin:e=>xj(`/api/voice/people/begin`,Sj(`POST`,{name:e})),recording:{state:async()=>(await xj(`/api/voice/people`)).enrolling??{enrolled:!1,samples:0,min:3,max:8},sample:e=>xj(`/api/voice/people/sample`,{method:`POST`,headers:{"content-type":e.type||`audio/webm`},body:e}),finish:e=>xj(`/api/voice/people/finish`,Sj(`POST`,{pin:e})),cancel:async()=>{await xj(`/api/voice/people/cancel`,Sj(`POST`,{}))},remove:async()=>{}},removePerson:async(e,t)=>{await xj(`/api/voice/people/${e}`,Sj(`DELETE`,{pin:t}))}};function wj({api:e=Cj,createRecorder:t,onClose:n}){let[r,i]=(0,l.useState)(null),[a,o]=(0,l.useState)({kind:`list`}),[s,c]=(0,l.useState)(``),[u,f]=(0,l.useState)(``),[m,h]=(0,l.useState)(!1),[g,_]=(0,l.useState)(null),v=(0,l.useRef)(!0),y=(0,l.useCallback)(()=>{e.overview().then(e=>v.current&&i(e)).catch(e=>v.current&&_(e.message))},[e]);(0,l.useEffect)(()=>(v.current=!0,y(),()=>{v.current=!1}),[y]);let b=async()=>{_(null),h(!0);try{let t=await e.begin(s.trim());v.current&&o({kind:`record`,name:t.name})}catch(e){v.current&&_(e.message)}finally{v.current&&h(!1)}},x=async t=>{_(null),h(!0);try{if(await e.removePerson(t.id,u),!v.current)return;o({kind:`list`}),y()}catch(e){v.current&&_(e.message)}finally{v.current&&(h(!1),f(``))}};return a.kind===`record`?(0,p.jsx)(oj,{api:e.recording,who:a.name,...t?{createRecorder:t}:{},onClose:()=>{c(``),o({kind:`list`}),y()}}):(0,p.jsxs)(`div`,{className:`approval enroll glass`,role:`dialog`,"aria-label":`Family voices`,style:{pointerEvents:`auto`},children:[(0,p.jsx)(`div`,{className:`approval-head`,children:(0,p.jsx)(`span`,{className:`approval-title`,children:`Family voices`})}),a.kind===`list`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`p`,{className:`auth-note`,children:`Friend knows your voice. Add the people at home, so it knows who is talking and answers them by name. They can chat and ask for the weather, but cannot use your PC or see your private things.`}),r&&!r.ownerEnrolled&&(0,p.jsx)(`p`,{className:`auth-note`,children:`First teach Friend your own voice (Esc, then Enroll my voice).`}),r&&r.people.length===0&&r.ownerEnrolled&&(0,p.jsx)(`p`,{className:`auth-note`,children:`Nobody added yet.`}),r&&r.people.length>0&&(0,p.jsx)(`ul`,{className:`household-list`,"aria-label":`People Friend knows`,children:r.people.map(e=>(0,p.jsxs)(`li`,{className:`household-row`,children:[(0,p.jsx)(`span`,{children:e.name}),(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,onClick:()=>o({kind:`remove`,person:e}),"aria-label":`Remove ${e.name}`,children:`Remove`})]},e.id))}),r&&r.ownerEnrolled&&r.people.length<r.max&&(0,p.jsxs)(`label`,{className:`settings-field`,children:[(0,p.jsx)(`span`,{children:`Add a person`}),(0,p.jsx)(`input`,{value:s,maxLength:40,placeholder:`Name, for example Priya`,onChange:e=>c(e.target.value),onKeyDown:e=>e.key===`Enter`&&s.trim()&&!m&&void b()})]}),g&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:g}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[r&&r.ownerEnrolled&&r.people.length<r.max&&(0,p.jsx)(`button`,{type:`button`,style:d,className:`primary`,disabled:m||!s.trim(),onClick:()=>void b(),children:`Record their voice`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:n,children:`Close`})]})]}),a.kind===`remove`&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`p`,{className:`auth-note`,children:[`Enter your PIN to remove `,a.person.name,`’s voice. Friend will treat their voice as a stranger’s.`]}),(0,p.jsx)(T,{pin:u,onChange:f}),g&&(0,p.jsx)(`p`,{role:`alert`,className:`auth-error`,children:g}),(0,p.jsxs)(`div`,{className:`approval-actions`,children:[(0,p.jsx)(`button`,{type:`button`,style:d,className:`danger`,disabled:m||u.length<6,onClick:()=>void x(a.person),children:`Remove`}),(0,p.jsx)(`button`,{type:`button`,style:d,onClick:()=>{f(``),_(null),o({kind:`list`})},children:`Back`})]})]})]})}var Tj=`▌▍▎▏█▓▒░<>/\\|+-=*#%&0123456789ABCDEF`;function Ej(e,t,n=Math.random){let r=[...e];if(t>=1)return e;let i=Math.floor(r.length*Math.max(0,t));return r.map((e,t)=>t<i||e===` `?e:Tj[Math.floor(n()*36)]).join(``)}var Dj=e=>e.length===0?0:Math.min(24,Math.max(6,Math.ceil([...e].length/2)));function Oj(e,t){let[n,r]=(0,l.useState)(e),i=(0,l.useRef)(e);return(0,l.useEffect)(()=>{if(!t||e===i.current){i.current=e,r(e);return}i.current=e;let n=Dj(e);if(n===0){r(e);return}let a=0,o=setInterval(()=>{a++,r(Ej(e,a/n)),a>=n&&clearInterval(o)},320/n);return()=>clearInterval(o)},[e,t]),n}function kj(e){let t=e.currentTarget,n=t.getBoundingClientRect(),r=document.createElement(`span`);r.className=`hud-ripple`;let i=Math.max(n.width,n.height)*2;r.style.width=r.style.height=`${i}px`,r.style.left=`${e.clientX-n.left-i/2}px`,r.style.top=`${e.clientY-n.top-i/2}px`,t.appendChild(r),r.addEventListener(`animationend`,()=>r.remove(),{once:!0}),setTimeout(()=>r.remove(),900)}function Aj({items:e,animations:t,onAction:n}){let[r,i]=(0,l.useState)(null),a=(0,l.useRef)(void 0);if((0,l.useEffect)(()=>()=>clearTimeout(a.current),[]),e.length===0)return null;let o=e=>{t!==`off`&&(i(e.id),clearTimeout(a.current),a.current=setTimeout(()=>i(null),650)),n(e)};return(0,p.jsxs)(me,{id:`launcher`,label:`Quick launch`,wholeBox:!0,testId:`launcher`,className:`hud hud-launcher${t===`full`?` hud-boot`:``}`,children:[(0,p.jsx)(`div`,{className:`hud-kicker`,children:`Quick launch`}),(0,p.jsx)(`ul`,{className:`hud-stack`,children:e.map((e,n)=>(0,p.jsx)(`li`,{className:`hud-tab hud-cut${r===e.id?` engaged`:``}${t===`full`?` hud-boot`:``}`,style:{"--i":n+1},children:(0,p.jsxs)(`button`,{type:`button`,className:`hud-tab-main`,"aria-label":e.label,onPointerDown:t===`off`?void 0:kj,onClick:()=>o(e),children:[(0,p.jsx)(`span`,{className:`hud-icon`,"aria-hidden":`true`,children:e.icon}),(0,p.jsx)(`span`,{className:`hud-tab-label`,children:e.label}),(0,p.jsx)(`span`,{className:`hud-tab-engaged`,"aria-hidden":`true`,children:`ENGAGED`}),(0,p.jsx)(`span`,{className:`hud-sweep`,"aria-hidden":`true`}),(0,p.jsx)(`span`,{className:`hud-scan`,"aria-hidden":`true`})]})},e.id))})]})}var jj=class extends l.Component{state={failed:!1};static getDerivedStateFromError(){return{failed:!0}}render(){return this.state.failed?null:this.props.children}};function Mj(e){let t=()=>({w:window.innerWidth,h:window.innerHeight}),[n,r]=(0,l.useState)(t);return(0,l.useEffect)(()=>{if(e)return;let n=()=>r(t());return window.addEventListener(`resize`,n),()=>window.removeEventListener(`resize`,n)},[e]),e??n}var Nj=(e,t=0,n=100)=>Number.isFinite(e)?Math.min(n,Math.max(t,e)):t,Pj=e=>e?{x:e.x,y:e.y,width:e.w,height:e.h}:{};function Fj(){return(0,p.jsx)(`svg`,{width:`0`,height:`0`,"aria-hidden":`true`,style:{position:`absolute`},children:(0,p.jsxs)(`defs`,{children:[(0,p.jsxs)(`filter`,{id:`ob-glow`,x:`-50%`,y:`-50%`,width:`200%`,height:`200%`,children:[(0,p.jsx)(`feGaussianBlur`,{stdDeviation:`3`,result:`b`}),(0,p.jsxs)(`feMerge`,{children:[(0,p.jsx)(`feMergeNode`,{in:`b`}),(0,p.jsx)(`feMergeNode`,{in:`SourceGraphic`})]})]}),(0,p.jsxs)(`filter`,{id:`ob-glow2`,x:`-50%`,y:`-50%`,width:`200%`,height:`200%`,children:[(0,p.jsx)(`feGaussianBlur`,{stdDeviation:`7`,result:`b`}),(0,p.jsxs)(`feMerge`,{children:[(0,p.jsx)(`feMergeNode`,{in:`b`}),(0,p.jsx)(`feMergeNode`,{in:`SourceGraphic`})]})]}),(0,p.jsxs)(`radialGradient`,{id:`ob-orbg`,cx:`50%`,cy:`45%`,r:`55%`,children:[(0,p.jsx)(`stop`,{offset:`0`,stopColor:`#cffafe`}),(0,p.jsx)(`stop`,{offset:`0.25`,stopColor:`#22d3ee`}),(0,p.jsx)(`stop`,{offset:`0.6`,stopColor:`#0e7490`}),(0,p.jsx)(`stop`,{offset:`1`,stopColor:`#042f3c`})]}),(0,p.jsxs)(`linearGradient`,{id:`ob-sweep`,x1:`0`,y1:`0`,x2:`1`,y2:`0`,children:[(0,p.jsx)(`stop`,{offset:`0`,stopColor:`#22d3ee`,stopOpacity:`0`}),(0,p.jsx)(`stop`,{offset:`1`,stopColor:`#22d3ee`,stopOpacity:`0.7`})]}),(0,p.jsxs)(`linearGradient`,{id:`ob-fade`,x1:`0`,y1:`0`,x2:`0`,y2:`1`,children:[(0,p.jsx)(`stop`,{offset:`0`,stopColor:`#010609`}),(0,p.jsx)(`stop`,{offset:`0.15`,stopColor:`#010609`,stopOpacity:`0`}),(0,p.jsx)(`stop`,{offset:`0.85`,stopColor:`#010609`,stopOpacity:`0`}),(0,p.jsx)(`stop`,{offset:`1`,stopColor:`#010609`})]})]})})}function Ij({variant:e=`chamfer`,tone:t=`cyan`,title:n,running:r=!1,className:i=``,style:a,children:o,...s}){return(0,p.jsxs)(`section`,{...s,className:`ob-frame ob-v-${e} ${i}`.trim(),"data-tone":t,...r?{"data-running":``}:{},style:a,children:[n&&(0,p.jsx)(`header`,{className:`ob-frame-title`,children:n}),(0,p.jsx)(`div`,{className:`ob-frame-body`,children:o})]})}var Lj=`M60 170A90 90 0 0 1 240 170`,Rj=`M76 170A74 74 0 0 1 224 170`;function zj({value:e,inner:t,label:n=`Gauge`,tone:r=`cyan`,frame:i}){let a=Math.round(Nj(e));return(0,p.jsxs)(`svg`,{className:i?void 0:`ob-svg`,...Pj(i),viewBox:`0 0 300 190`,role:`img`,"aria-label":`${n} ${a}%`,"data-value":a,"data-tone":r,children:[(0,p.jsx)(`path`,{d:Lj,className:`ob-track`,strokeWidth:`14`,pathLength:100}),(0,p.jsx)(`path`,{d:Lj,className:`ob-fill`,strokeWidth:`14`,pathLength:100,strokeDasharray:`${a} 100`,"data-arc":`outer`}),t!==void 0&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:Rj,className:`ob-track`,strokeWidth:`6`,pathLength:100}),(0,p.jsx)(`path`,{d:Rj,className:`ob-fill`,strokeWidth:`6`,pathLength:100,strokeDasharray:`${Math.round(Nj(t))} 100`,stroke:`#a78bfa`,"data-arc":`inner`})]})]})}function Bj({levels:e,tone:t=`cyan`,frame:n}){let r=Math.max(1,e.length)*12;return(0,p.jsx)(`svg`,{className:n?void 0:`ob-svg`,...Pj(n),viewBox:`0 0 ${r} 100`,preserveAspectRatio:`none`,"aria-hidden":`true`,"data-tone":t,children:e.map((e,t)=>(0,p.jsx)(`rect`,{className:`ob-eq`,x:t*12,y:0,width:8,height:100,style:{"--lv":Math.max(.05,Nj(e,0,1)),animationDelay:`${-(t*.37%.9)}s`,transform:`scaleY(${Math.max(.05,Nj(e,0,1))})`}},t))})}var Vj=`M0 40H40L52 20L66 62L80 8L96 52L108 40H190L202 28L214 48L226 40H300`;function Hj({tone:e=`cyan`,frame:t}){return(0,p.jsxs)(`svg`,{className:t?void 0:`ob-svg`,...Pj(t),viewBox:`0 0 300 70`,"aria-hidden":`true`,"data-tone":e,children:[(0,p.jsx)(`path`,{className:`ob-ecg-base`,d:Vj}),(0,p.jsx)(`path`,{className:`ob-ecg`,d:Vj})]})}function Uj({blips:e,frame:t}){return(0,p.jsxs)(`svg`,{className:t?void 0:`ob-svg`,...Pj(t),viewBox:`-120 -120 240 240`,role:`img`,"aria-label":`Devices: ${e.map(e=>e.label).join(`, `)||`none`}`,children:[(0,p.jsxs)(`g`,{fill:`none`,stroke:`var(--ob-line)`,children:[(0,p.jsx)(`circle`,{r:`110`}),(0,p.jsx)(`circle`,{r:`73`}),(0,p.jsx)(`circle`,{r:`36`}),(0,p.jsx)(`line`,{x1:`-110`,x2:`110`}),(0,p.jsx)(`line`,{y1:`-110`,y2:`110`})]}),(0,p.jsx)(`circle`,{r:`110`,fill:`none`,stroke:`#67e8f9`,strokeWidth:`2`,strokeDasharray:`1 9`}),(0,p.jsxs)(`g`,{className:`ob-sweep`,children:[(0,p.jsx)(`path`,{d:`M0 0L110 0A110 110 0 0 0 95 -55Z`,fill:`url(#ob-sweep)`}),(0,p.jsx)(`line`,{x2:`110`,stroke:`#67e8f9`,strokeWidth:`2`})]}),e.map(e=>{let t=e.angle*Math.PI/180,n=Math.cos(t)*Nj(e.distance,0,1)*100,r=-Math.sin(t)*Nj(e.distance,0,1)*100;return(0,p.jsxs)(`g`,{"data-blip":``,...e.dim?{"data-dim":``}:{},children:[(0,p.jsx)(`circle`,{className:`ob-blip${e.warn?` ob-blip-warn`:``}`,cx:n,cy:r,r:`5`}),(0,p.jsx)(`text`,{x:n+9,y:r+4,fontSize:`11`,fill:`currentColor`,opacity:e.dim?.5:1,children:e.label})]},e.label)})]})}var Wj={done:`var(--ob-green)`,doing:`var(--ob-cyan)`,review:`var(--ob-orange)`,todo:`var(--ob-dim)`},Gj=e=>e%2==0?6:5;function Kj({cells:e,placeholder:t=!1,frame:n}){t&&(e=Array.from({length:11},()=>({status:`todo`})));let r=[],i=0,a=0;for(let t of e)a>=Gj(i)&&(i++,a=0),r.push({x:20+a*40+i%2*20,y:20+i*35,status:t.status}),a++;let o=r.length?i+1:1;return(0,p.jsx)(`svg`,{className:n?void 0:`ob-svg`,...Pj(n),viewBox:`0 0 260 ${o*35+10}`,"aria-hidden":`true`,...t?{"data-placeholder":``}:{},children:r.map((e,t)=>(0,p.jsx)(`polygon`,{"data-status":e.status,points:`-20,0 -10,-17.3 10,-17.3 20,0 10,17.3 -10,17.3`,transform:`translate(${e.x} ${e.y})`,fill:`none`,stroke:Wj[e.status],strokeWidth:`1.6`,className:e.status===`review`?`ob-pulse`:void 0},t))})}function qj({rings:e,placeholder:t=!1,frame:n}){t&&(e=[{value:0},{value:0},{value:0}]);let r=t?{"aria-hidden":!0,"data-placeholder":``}:{role:`img`,"aria-label":e.map(e=>`${e.label??`ring`} ${Math.round(Nj(e.value))}%`).join(`, `)||`no data`};return(0,p.jsx)(`svg`,{className:n?void 0:`ob-svg`,...Pj(n),viewBox:`-50 -50 100 100`,...r,children:e.map((e,t)=>{let n=38-t*12;if(n<=2)return null;let r=Math.round(Nj(e.value));return(0,p.jsxs)(`g`,{"data-tone":e.tone??`cyan`,transform:`rotate(-90)`,children:[(0,p.jsx)(`circle`,{r:n,className:`ob-track`,strokeWidth:`8`}),(0,p.jsx)(`circle`,{r:n,className:`ob-fill`,strokeWidth:`8`,pathLength:100,strokeDasharray:`${r} 100`,"data-ring":t,"data-value":r})]},t)})})}function Jj({value:e,segments:t=60,radius:n=205,size:r=460}){let i=Math.round(t*Nj(e)/100),a=r/2;return(0,p.jsx)(`svg`,{className:`ob-svg`,viewBox:`0 0 ${r} ${r}`,"aria-hidden":`true`,children:Array.from({length:t},(e,r)=>{let o=(-90+r*360/t)*Math.PI/180,[s,c]=[n-7,n+7];return(0,p.jsx)(`line`,{className:`ob-seg`,"data-seg":``,"data-on":r<i?`true`:`false`,x1:a+s*Math.cos(o),y1:a+s*Math.sin(o),x2:a+c*Math.cos(o),y2:a+c*Math.sin(o)},r)})})}var Yj={running:`green`,waiting:`orange`,idle:`cyan`,add:`cyan`};function Xj({label:e,glyph:t,caption:n,detail:r,status:i=`idle`,onClick:a,x:o,y:s}){let c=o!==void 0&&s!==void 0?{left:o,top:s}:void 0;return(0,p.jsxs)(`button`,{type:`button`,className:`ob-node`,"data-tone":Yj[i],"data-status":i,"aria-label":r?`${e}, ${r}`:e,title:e,style:c,onClick:a,children:[(0,p.jsxs)(`svg`,{viewBox:`-34 -30 68 60`,"aria-hidden":`true`,children:[(0,p.jsx)(`polygon`,{points:`-34,0 -17,-29.4 17,-29.4 34,0 17,29.4 -17,29.4`}),(0,p.jsx)(`text`,{className:`ob-node-label${t?` ob-glyph`:``}`,children:t??(e.length>6?`${e.slice(0,5)}…`:e)})]}),n&&(0,p.jsx)(`span`,{className:`ob-node-caption`,children:n})]})}function Zj({x1:e,y1:t,x2:n,y2:r,tone:i=`cyan`,flowing:a=!0}){return(0,p.jsx)(`line`,{className:`ob-link${a?` ob-flow`:``}`,"data-tone":i,x1:e,y1:t,x2:n,y2:r})}var Qj={starting:`running`,running:`running`,waiting:`waiting`,idle:`idle`,paused:`idle`,stopped:`idle`,failed:`idle`};function $j(e,t){let n=e.slice(0,5).map(e=>({id:e.id,label:e.name,glyph:e.name.slice(0,6).toUpperCase(),caption:e.name,status:Qj[e.status],detail:e.detail||e.status,kind:`worker`}));return t&&e.length<5&&n.push({id:`hire`,label:`Hire a worker`,glyph:`+`,caption:`HIRE WORKER`,status:`add`,detail:`HIRE WORKER`,kind:`hire`}),n}var eM={done:`done`,doing:`doing`,review:`review`,blocked:`review`,todo:`todo`},tM=[`done`,`doing`,`review`,`todo`];function nM(e){return[...e].sort((e,t)=>e.id-t.id).slice(-11).map(e=>({status:eM[e.status]})).sort((e,t)=>tM.indexOf(e.status)-tM.indexOf(t.status))}function rM(e){let t=[...new Set(e.map(e=>e.projectId))];if(t.length!==0)return t.length===1?t[0]:`${t.length} projects`}var iM=e=>e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e);function aM(e){let t=e=>e.name.slice(0,6).toUpperCase(),n=e.filter(e=>e.budget!==null&&e.budget>0);if(n.length>0)return n.slice(0,3).map(e=>{let n=Nj(e.tokens/e.budget*100);return{label:t(e),value:n,text:`${Math.round(n)}%`}});let r=Math.max(0,...e.map(e=>e.tokens));return[...e].sort((e,t)=>t.tokens-e.tokens).slice(0,3).map(e=>({label:t(e),value:r>0?Nj(Math.max(+(e.tokens>0),Math.round(e.tokens/r*100))):0,text:iM(e.tokens)}))}var oM={tool:`green`,result:`green`,approval:`orange`,error:`orange`,text:`plain`};function sM(e,t){if(e!==`idle`||!t.enabled)return e;if(t.workers.some(e=>e.status===`waiting`))return`needs you`;let n=t.workers.filter(e=>e.status===`running`||e.status===`starting`).length;return n>0?`working · ${n}`:e}function cM(e,t,n=8){return t.flatMap(t=>(e[t.id]??[]).map(e=>({...e,name:t.name.slice(0,6).toUpperCase().padEnd(7)}))).sort((e,t)=>e.at-t.at).slice(-n).map(e=>({text:`${e.name}${e.text}`,tone:oM[e.kind]??`plain`}))}var lM=e=>{let t=Math.max(1,Math.round(e/6e4));return t>=60?`${Math.floor(t/60)}H ${String(t%60).padStart(2,`0`)}M`.replace(/ 0(\d)M/,` $1M`):`${t}M`};function uM(e,t,n){let r=e.fiveHour;return r&&r.resetsAt*1e3>n?{value:Math.round(Nj(r.utilization*100)),reset:lM(r.resetsAt*1e3-n),real:!0}:{value:t,reset:null,real:!1}}function dM(e){let t=new Map(e.map(e=>[e.id,e])),n=e=>{let n=new Set([e.id]);for(let r=e.managerId;r&&t.has(r);r=t.get(r).managerId){if(n.has(r))return r===e.id;n.add(r)}return!1},r=e=>e.managerId&&t.has(e.managerId)&&!n(e)?e.managerId:`friend`,i=new Map;for(let t of e)i.set(r(t),[...i.get(r(t))??[],t]);let a=new Map,o=e=>{let t=i.get(e)??[],n=t.length===0?190:Math.max(190,t.reduce((e,t)=>e+o(t.id),0)+(t.length-1)*26);return a.set(e,n),n};o(`friend`);let s=[],c=[],l=0,u=(e,n,r)=>{l=Math.max(l,r);let o=i.get(e)??[],d=r*134,f;if(o.length===0)f=n+(a.get(e)-190)/2;else{let t=n,i=o.map(e=>{let n=u(e.id,t,r+1);return t+=a.get(e.id)+26,n});f=(i[0]+i[i.length-1])/2;for(let[t,n]of o.entries())c.push({from:e,to:n.id,x1:f+95,y1:d+78,x2:i[t]+95,y2:d+78+56})}return s.push({id:e,x:f,y:d,worker:e===`friend`?null:t.get(e)}),f};return u(`friend`,0,0),{nodes:s,edges:c,width:a.get(`friend`),height:(l+1)*78+l*56}}var fM=[{id:`system`,title:`System`,anchor:`left`,box:{x:40,y:70,w:300,h:220},tone:`cyan`,minDensity:`standard`},{id:`voice`,title:`Voice`,anchor:`left`,box:{x:40,y:310,w:300,h:150},tone:`cyan`,minDensity:`standard`},{id:`network`,title:`Network`,anchor:`left`,box:{x:40,y:480,w:300,h:110},tone:`cyan`,minDensity:`standard`},{id:`feed`,title:`Activity`,anchor:`left`,box:{x:40,y:650,w:430,h:210},tone:`green`,minDensity:`standard`},{id:`radar`,title:`Devices`,anchor:`right`,box:{x:1310,y:60,w:250,h:270},tone:`cyan`,minDensity:`standard`},{id:`tickets`,title:`Tickets`,anchor:`right`,box:{x:1300,y:320,w:270,h:160},tone:`green`,minDensity:`standard`},{id:`budget`,title:`Budget`,anchor:`right`,box:{x:1300,y:480,w:270,h:110},tone:`cyan`,minDensity:`standard`},{id:`approval`,title:`Approvals`,anchor:`right`,box:{x:1180,y:650,w:380,h:210},tone:`orange`,minDensity:`standard`},{id:`usage`,title:`Usage`,anchor:`centre`,box:{x:700,y:215,w:200,h:30},tone:`cyan`,minDensity:`calm`}];if(fM.length!==Tu.length)throw Error(`the widget registry and HUD_WIDGET_IDS differ`);var pM={calm:0,standard:1,full:2};function mM(e,t,n,r){return fM.filter(n=>{if(n.id===`approval`&&r)return!0;let i=t[n.id];return i===!1?!1:i===!0||pM[e]>=pM[n.minDensity]})}function hM({rings:e=[]}){let t=e.length===0;return(0,p.jsxs)(`svg`,{className:`ob-wsvg`,viewBox:`0 0 270 110`,children:[(0,p.jsx)(qj,{rings:e.map((e,t)=>({value:e.value,label:e.label,tone:[`cyan`,`cyan`,`green`][t]??`cyan`})),placeholder:t,frame:{x:-10,y:-10,w:100,h:100}}),(0,p.jsx)(`text`,{className:`ob-lab`,x:`104`,y:`26`,children:`BUDGET`}),t?(0,p.jsx)(`text`,{className:`ob-sm`,x:`104`,y:`46`,children:`No workers yet`}):e.slice(0,3).map((e,t)=>(0,p.jsxs)(`text`,{className:`ob-sm`,x:`104`,y:46+t*18,children:[e.label,` `,e.text??`${Math.round(e.value)}%`]},e.label))]})}var gM=8,_M=46,vM=e=>e.length>_M?`${e.slice(0,45)}…`:e;function yM({lines:e,activity:t,busy:n,limit:r=gM,marquee:i=!1}){let a=Math.min(r,gM-+!!n),o=i?e:e.slice(-a),s=`M0 0H400L430 30V210H0Z`,c=(e,t,n)=>(0,p.jsxs)(`text`,{className:`tone`in e?`ob-sm ${e.tone===`green`?`ob-grn`:e.tone===`orange`?`ob-org`:``}`.trim():e.role===`user`?`ob-sm`:`ob-sm ob-grn`,x:`22`,y:t,children:[`tone`in e?``:e.role===`user`?`▸ `:`◂ `,vM(e.text)]},n);return(0,p.jsxs)(`svg`,{className:`ob-wsvg ob-feed-svg`,viewBox:`0 0 430 210`,"aria-live":`polite`,children:[(0,p.jsx)(`defs`,{children:(0,p.jsx)(`clipPath`,{id:`ob-feed-clip`,children:(0,p.jsx)(`rect`,{x:`0`,y:`38`,width:`430`,height:`168`})})}),(0,p.jsx)(`path`,{className:`ob-feed-frame`,d:s}),(0,p.jsx)(`path`,{className:`ob-feed-run`,d:s,pathLength:100}),(0,p.jsx)(`text`,{className:`ob-lab`,x:`16`,y:`18`,children:`WORKER FEED · LIVE`}),(0,p.jsx)(`circle`,{className:`ob-pulse`,cx:`410`,cy:`14`,r:`4`,fill:`#34d399`}),o.length===0&&!n&&(0,p.jsx)(`text`,{className:`ob-dim`,x:`22`,y:`60`,children:`Nothing yet`}),(0,p.jsx)(`g`,{clipPath:`url(#ob-feed-clip)`,children:i?(0,p.jsx)(`g`,{className:`ob-feed-scroll`,style:{"--n":o.length*20},children:[0,1].flatMap(e=>o.map((t,n)=>c(t,56+(e*o.length+n)*20,`${e}-${n}`)))}):(0,p.jsxs)(`g`,{className:`ob-feed-in`,children:[o.map((e,t)=>c(e,56+t*20,String(t))),n&&(0,p.jsxs)(`text`,{className:`ob-sm ob-org`,x:`22`,y:56+o.length*20,children:[`⚙ `,vM(t??`Working…`)]})]},`${e.length}:${o.at(-1)?.text??``}`)}),(0,p.jsx)(`rect`,{className:`ob-feed-fade`,x:`1`,y:`38`,width:`428`,height:`168`,fill:`url(#ob-fade)`,pointerEvents:`none`})]})}function bM({lines:e,activity:t,busy:n,workers:r=[]}){let i=(0,l.useRef)(null);return(0,l.useEffect)(()=>{let e=i.current;e&&(e.scrollTop=e.scrollHeight)},[e.length,r.length]),(0,p.jsxs)(`div`,{className:`ob-feed`,"aria-live":`polite`,ref:i,children:[e.length===0&&r.length===0&&!n&&(0,p.jsx)(`p`,{className:`ob-li ob-sub`,children:`Nothing yet`}),r.map((e,t)=>(0,p.jsx)(`p`,{className:`ob-li${e.tone===`green`?` ob-live`:e.tone===`orange`?` ob-warn`:``}`,children:e.text},`w${t}`)),e.slice(-200).map((e,t)=>(0,p.jsxs)(`p`,{className:`ob-li ${e.role===`user`?`ob-user`:``}`,children:[e.role===`user`?`▸ `:`◂ `,e.text]},t)),n&&(0,p.jsxs)(`p`,{className:`ob-li ob-live`,children:[`⚙ `,t??`Working…`]})]})}function xM({stats:e,now:t=Date.now()}){let n=e?Math.round(e.cpu):0,r=e&&e.ramTotal>0?Math.round(100*e.ramUsed/e.ramTotal):0,i=!!e&&t-e.at>1e4;return(0,p.jsxs)(`svg`,{className:`ob-wsvg`,viewBox:`0 0 300 220`,children:[(0,p.jsx)(`text`,{className:`ob-lab`,x:`12`,y:`8`,children:`SYSTEM · CPU / RAM`}),(0,p.jsx)(`path`,{className:`ob-bracket`,d:`M0 20H20M0 20V40M300 20H280M300 20V40`}),(0,p.jsx)(zj,{value:n,inner:r,label:`CPU`,frame:{x:0,y:20,w:300,h:190}}),e?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`text`,{className:`ob-big`,x:`150`,y:`170`,textAnchor:`middle`,children:[n,`%`]}),(0,p.jsxs)(`text`,{className:`ob-dim`,x:`150`,y:`192`,textAnchor:`middle`,children:[`CPU · RAM `,r,`%`,i?` · STALE`:``]})]}):(0,p.jsx)(`text`,{className:`ob-dim`,x:`150`,y:`180`,textAnchor:`middle`,children:`Waiting for data`})]})}function SM(e){if(e<1024)return`${Math.round(e)} B`;let t=[`KB`,`MB`,`GB`,`TB`],n=e/1024,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r++;return`${n.toFixed(1)} ${t[r]}`}function CM({stats:e,now:t=Date.now()}){let n=!!e&&e.netDown===0&&e.netUp===0,r=!!e&&t-e.at>1e4;return(0,p.jsxs)(`svg`,{className:`ob-wsvg`,viewBox:`0 0 300 110`,children:[(0,p.jsx)(`text`,{className:`ob-lab`,x:`0`,y:`8`,children:`NETWORK`}),(0,p.jsx)(Hj,{frame:{x:0,y:20,w:300,h:70}}),(0,p.jsxs)(`text`,{className:`ob-dim`,x:`0`,y:`104`,children:[e?n?`n/a`:`↓ ${SM(e.netDown)}/s ↑ ${SM(e.netUp)}/s`:`Waiting for data`,r?` · stale`:``]})]})}function wM({deviceOnline:e,voiceAvailable:t,blips:n}){return(0,p.jsxs)(`svg`,{className:`ob-wsvg`,viewBox:`0 0 250 270`,children:[(0,p.jsx)(`text`,{className:`ob-lab`,x:`20`,y:`21`,children:`DEVICES · RADAR`}),(0,p.jsx)(Uj,{frame:{x:10,y:25,w:240,h:240},blips:n??[{angle:40,distance:.45,label:`This screen`},{angle:150,distance:.7,label:`PC`,dim:!e},{angle:250,distance:.6,label:`Voice`,dim:!t}]})]})}var TM=[{status:`done`,label:`DONE`},{status:`doing`,label:`DOING`},{status:`review`,label:`REVIEW`},{status:`todo`,label:`TODO`}];function EM({cells:e=[],project:t}){let n=e.length===0;return(0,p.jsxs)(`svg`,{className:`ob-wsvg`,viewBox:`0 0 270 160`,children:[(0,p.jsxs)(`text`,{className:`ob-lab`,x:`0`,y:`8`,children:[`TICKETS · `,t??`no workers yet`]}),(0,p.jsx)(Kj,{cells:e,placeholder:n,frame:{x:0,y:20,w:260,h:80}}),(0,p.jsx)(`text`,{className:`ob-dim`,x:`0`,y:`130`,children:TM.map(t=>`■ ${t.label} ${e.filter(e=>e.status===t.status).length}`).join(` `)})]})}var DM=Array.from({length:20},(e,t)=>.35+.65*Math.abs(Math.sin(t*1.7+1))),OM=.45;function kM({level:e,mode:t}){let n=Nj(e,0,1),r=Math.max(OM,n),i=Math.round(n*5);return(0,p.jsxs)(`svg`,{className:`ob-wsvg`,viewBox:`0 0 300 160`,children:[(0,p.jsx)(`text`,{className:`ob-lab`,x:`0`,y:`8`,children:`VOICE · SPECTRUM`}),(0,p.jsx)(`line`,{className:`ob-ecg-base`,x1:`0`,x2:`300`,y1:`130`,y2:`130`}),(0,p.jsx)(Bj,{levels:DM.map(e=>r*e),frame:{x:0,y:40,w:240,h:90}}),(0,p.jsxs)(`text`,{className:`ob-dim`,x:`0`,y:`150`,children:[`MIC `,`▮`.repeat(i),`▯`.repeat(5-i),` · `,t]})]})}var AM={system:`How hard this PC is working. The big arc is the processor; the thin arc inside it is the memory.`,voice:`The sound Friend is hearing or speaking, live.`,network:`How fast data moves in and out of this PC. Some PCs do not report it.`,feed:`The conversation and what Friend is doing right now.`,radar:`The things Friend can reach: this screen, the PC's agent and the voice. A dim one is offline.`,tickets:`The work given to hired workers, one cell each. Switch the Office on in Settings to hire workers.`,budget:`How much of each worker's limit is used. Limits are set in Settings, Office.`,approval:`Something is waiting for your answer.`,usage:`Today's usage compared with your busiest day of the last 30.`},jM={voice:`Voice`,chat:`Chat`,task:`Scheduled tasks`,channel:`Messages`,other:`Other`};function MM({api:e}){let[t,n]=(0,l.useState)(null),[r,i]=(0,l.useState)(!1);return(0,l.useEffect)(()=>{let t=!0;return e.summary(30).then(e=>t&&n(e)).catch(()=>t&&i(!0)),()=>{t=!1}},[e]),r?(0,p.jsx)(`p`,{className:`ob-li ob-sub`,children:`Could not read the usage`}):t?t.bySource.length===0?(0,p.jsx)(`p`,{className:`ob-li ob-sub`,children:`No usage yet`}):(0,p.jsx)(`div`,{className:`ob-usage-detail`,children:t.bySource.map(e=>(0,p.jsxs)(`p`,{className:`ob-li`,children:[jM[e.source]??e.source,` · `,OS(e.input+e.output),` tokens · `,e.turns,` turns`]},e.source))}):(0,p.jsx)(`p`,{className:`ob-li ob-sub`,children:`Reading…`})}function NM({id:e,state:t,rect:n,usageApi:r=TS,onClose:i}){let a=(0,l.useRef)(null);(0,l.useEffect)(()=>a.current?.focus(),[e]);let o=fM.find(t=>t.id===e)?.title??e,s=(()=>{switch(e){case`system`:return(0,p.jsx)(xM,{stats:t.stats});case`network`:return(0,p.jsx)(CM,{stats:t.stats});case`radar`:return(0,p.jsx)(wM,{deviceOnline:t.deviceOnline,voiceAvailable:t.voice.available});case`voice`:return(0,p.jsx)(kM,{level:t.voice.level,mode:t.voice.mode});case`feed`:return(0,p.jsx)(bM,{lines:t.chat,activity:t.activity,busy:t.busy,workers:t.office.enabled?cM(t.office.feed,t.office.workers,60):[]});case`tickets`:return(0,p.jsx)(EM,{cells:nM(t.office.tickets),...rM(t.office.tickets)?{project:rM(t.office.tickets)}:{}});case`budget`:return(0,p.jsx)(hM,{rings:aM(t.office.workers)});case`usage`:return(0,p.jsx)(MM,{api:r});default:return null}})();return(0,p.jsxs)(Ij,{variant:`chamfer`,running:!0,title:o,className:`ob-expanded ob-hit`,style:{position:`absolute`,left:n.x,top:n.y,width:n.width,height:n.height},role:`dialog`,"aria-label":o,children:[(0,p.jsx)(`button`,{ref:a,type:`button`,className:`ob-close`,"aria-label":`Close`,onClick:i,children:`×`}),(0,p.jsx)(`div`,{className:`ob-expanded-body`,children:s}),(0,p.jsx)(`p`,{className:`ob-explain`,children:AM[e]})]})}function PM({worker:e,feed:t,rect:n,send:r,onClose:i}){let a=(0,l.useRef)(null),o=(0,l.useRef)(null),[s,c]=(0,l.useState)(``),[u,d]=(0,l.useState)(!1);(0,l.useEffect)(()=>a.current?.focus(),[e.id]),(0,l.useEffect)(()=>{let e=o.current;e&&(e.scrollTop=e.scrollHeight)},[t.length]);let f=()=>{let t=s.trim();t&&(r({type:`office.say`,workerId:e.id,text:t}),c(``))},m=e.status===`starting`||e.status===`running`||e.status===`waiting`;return(0,p.jsxs)(Ij,{variant:`chamfer`,running:!0,title:e.name,className:`ob-expanded ob-hit`,style:{position:`absolute`,left:n.x,top:n.y,width:n.width,height:n.height},role:`dialog`,"aria-label":e.name,children:[(0,p.jsx)(`button`,{ref:a,type:`button`,className:`ob-close`,"aria-label":`Close`,onClick:i,children:`×`}),(0,p.jsxs)(`div`,{className:`ob-expanded-body ob-worker`,children:[(0,p.jsxs)(`p`,{className:`ob-li`,children:[e.status,e.detail?` · ${e.detail}`:``]}),(0,p.jsxs)(`p`,{className:`ob-li ob-sub`,children:[`Tokens `,e.tokens,e.budget?` of ${e.budget}`:``]}),(0,p.jsx)(`div`,{className:`ob-worker-log`,ref:o,"aria-live":`polite`,children:t.length===0?(0,p.jsx)(`p`,{className:`ob-li ob-sub`,children:`Nothing yet`}):t.map((e,t)=>(0,p.jsx)(`p`,{"data-feed-line":``,"data-kind":e.kind,className:`ob-li${e.kind===`tool`||e.kind===`result`?` ob-live`:``}`,children:e.text},`${e.at}-${t}`))})]}),(0,p.jsxs)(`form`,{className:`ob-worker-say`,onSubmit:e=>{e.preventDefault(),f()},children:[(0,p.jsx)(`input`,{type:`text`,"aria-label":`Say to ${e.name}`,placeholder:`Say to ${e.name}`,value:s,maxLength:2e3,onChange:e=>c(e.target.value)}),(0,p.jsx)(`button`,{type:`submit`,children:`Send`}),(0,p.jsx)(`button`,{type:`button`,className:`ob-stop`,disabled:!m,onClick:()=>r({type:`office.stop`,workerId:e.id}),children:`Stop`}),(0,p.jsx)(`button`,{type:`button`,className:`ob-stop`,onClick:()=>u?r({type:`office.fire`,workerId:e.id}):d(!0),onBlur:()=>d(!1),children:u?`Confirm remove`:`Remove`})]})]})}var FM={starting:`running`,running:`running`,waiting:`waiting`,idle:`idle`,paused:`idle`,stopped:`idle`,failed:`failed`};function IM({workers:e,name:t,rect:n,onWorker:r,onClose:i}){let a=(0,l.useRef)(null),o=(0,l.useRef)(null),[s,c]=(0,l.useState)(1),u=dM(e);return(0,l.useEffect)(()=>a.current?.focus(),[]),(0,l.useEffect)(()=>{let e=o.current,t=e?.clientWidth||n.width-24,r=e?.clientHeight||n.height-70;c(Math.min(1,t/u.width,r/u.height)||1)},[u.width,u.height,n.width,n.height]),(0,p.jsxs)(Ij,{variant:`chamfer`,running:!0,title:`Office team`,className:`ob-expanded ob-hit`,style:{position:`absolute`,left:n.x,top:n.y,width:n.width,height:n.height},role:`dialog`,"aria-label":`Office team`,children:[(0,p.jsx)(`button`,{ref:a,type:`button`,className:`ob-close`,"aria-label":`Close`,onClick:i,children:`×`}),(0,p.jsx)(`div`,{className:`ob-expanded-body ob-org-holder`,ref:o,children:(0,p.jsxs)(`div`,{className:`ob-org`,style:{width:u.width,height:u.height,transform:`scale(${s})`,left:`calc(50% - ${u.width*s/2}px)`},children:[(0,p.jsx)(`svg`,{className:`ob-org-edges`,width:u.width,height:u.height,"aria-hidden":`true`,children:u.edges.map(e=>(0,p.jsx)(`path`,{"data-edge":`${e.from}>${e.to}`,d:`M${e.x1} ${e.y1}C${e.x1} ${(e.y1+e.y2)/2} ${e.x2} ${(e.y1+e.y2)/2} ${e.x2} ${e.y2}`},`${e.from}>${e.to}`))}),u.nodes.map(e=>e.worker?(0,p.jsxs)(`button`,{type:`button`,className:`ob-org-card`,"data-status":FM[e.worker.status],"aria-label":`${e.worker.name}, ${e.worker.title}, ${e.worker.detail||e.worker.status}`,style:{left:e.x,top:e.y,width:190,height:78},onClick:()=>r(e.id),children:[(0,p.jsxs)(`b`,{children:[(0,p.jsx)(`i`,{"aria-hidden":`true`}),` `,e.worker.name]}),(0,p.jsx)(`span`,{children:e.worker.title}),(0,p.jsx)(`small`,{children:e.worker.detail||e.worker.status}),e.worker.budget?(0,p.jsx)(`em`,{style:{width:`${Math.min(100,100*e.worker.tokens/e.worker.budget)}%`}}):null]},e.id):(0,p.jsxs)(`div`,{className:`ob-org-card ob-org-root`,style:{left:e.x,top:e.y,width:190,height:78},children:[(0,p.jsx)(`b`,{children:t}),(0,p.jsx)(`span`,{children:`Friend · the owner's assistant`})]},e.id))]})})]})}var LM=[{id:`code`,label:`CODE`,status:`running`,detail:`▶ Hero.tsx · 62%`,at:{x:800,y:108,anchor:`middle`}},{id:`test`,label:`TEST`,status:`running`,detail:`▶ 12/12 passing`,at:{x:1135,y:268,anchor:`start`}},{id:`rev`,label:`REV`,status:`waiting`,detail:`⏸ needs approval`,at:{x:1135,y:632,anchor:`start`}},{id:`hire`,label:`+`,status:`add`,detail:`HIRE WORKER`,at:{x:465,y:632,anchor:`end`}},{id:`arch`,label:`ARCH`,status:`idle`,detail:`idle`,at:{x:465,y:268,anchor:`end`}}],RM=[{text:`CODE ▶ edit src/Hero.tsx`,tone:`green`},{text:`CODE + 42 lines - 6 lines`,tone:`plain`},{text:`TEST ▶ pnpm test`,tone:`green`},{text:`TEST 12 passed · 0 failed`,tone:`plain`},{text:`REV ⏸ wants: npm install`,tone:`orange`},{text:`CODE ▶ edit src/Nav.tsx`,tone:`green`},{text:`CODE + 18 lines`,tone:`plain`}],zM=(e,t)=>Array.from({length:t},()=>({status:e})),BM=[...zM(`done`,3),...zM(`doing`,3),...zM(`review`,1),...zM(`todo`,4)],VM=[{label:`CODE`,value:42},{label:`TEST`,value:70},{label:`REV`,value:25}],HM=[{angle:49,distance:.64,label:`PC`},{angle:207,distance:.67,label:`PHONE`},{angle:286,distance:.73,label:`ALEXA?`,warn:!0}],UM={id:`sample`,tool:`shell.run`,summary:`npm install --save zod`,tier:`T2`,needsPin:!1},WM=e=>({cpu:38,ramUsed:61,ramTotal:100,netDown:2516582.4,netUp:314572.8,at:e});function GM({approval:e,send:t}){return e?(0,p.jsx)(KM,{approval:e,send:t}):(0,p.jsx)(`p`,{className:`ob-li ob-sub`,children:`None waiting`})}function KM({approval:e,send:t}){let{pin:n,setPin:r,respond:i,canApprove:a}=nt(e,t);return(0,p.jsxs)(`div`,{className:`ob-approval`,role:`alertdialog`,"aria-label":`Approval needed`,children:[(0,p.jsxs)(`svg`,{className:`ob-tri`,viewBox:`0 0 56 52`,"aria-hidden":`true`,children:[(0,p.jsx)(`path`,{d:`M4 48L28 4L52 48Z`}),(0,p.jsx)(`text`,{x:`28`,y:`42`,textAnchor:`middle`,children:`!`})]}),(0,p.jsxs)(`div`,{className:`ob-appr-text`,children:[(0,p.jsxs)(`span`,{className:`ob-appr-title`,children:[`APPROVAL NEEDED `,(0,p.jsx)(`span`,{className:`tier tier-${e.tier}`,children:e.tier})]}),!e.tool.startsWith(`office.`)&&(0,p.jsxs)(`span`,{className:`ob-appr-sub`,children:[e.tool,` wants to run:`]}),(0,p.jsx)(`pre`,{className:`ob-summary`,"data-testid":`approval-summary`,children:e.summary})]}),e.needsPin&&(0,p.jsx)(T,{pin:n,onChange:r,onSubmit:()=>a&&i(`approve`)}),(0,p.jsxs)(`div`,{className:`ob-actions`,children:[(0,p.jsx)(`button`,{type:`button`,className:`ob-btn ob-yes`,disabled:!a,onClick:()=>i(`approve`),children:`Approve`}),e.tier===`T2`&&!e.needsPin&&e.tool!==`camera.snap`&&!e.tool.startsWith(`office.`)&&(0,p.jsx)(`button`,{type:`button`,className:`ob-btn`,onClick:()=>i(`approve_always`),children:`Always allow`}),(0,p.jsx)(`button`,{type:`button`,className:`ob-btn ob-no`,onClick:()=>i(`deny`),children:`Deny`})]})]})}function qM(){let[e,t]=(0,l.useState)(()=>typeof document<`u`&&document.hidden);return(0,l.useEffect)(()=>{let e=()=>t(document.hidden);return document.addEventListener(`visibilitychange`,e),()=>document.removeEventListener(`visibilitychange`,e)},[]),e}function JM(e){let[t,n]=(0,l.useState)(()=>new Date);return(0,l.useEffect)(()=>{let t=setInterval(()=>n(new Date),e);return()=>clearInterval(t)},[e]),t}var YM=e=>t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),e())},XM=e=>ct({connection:e.connection,deviceOnline:e.deviceOnline,approval:e.approval,voiceMode:e.voice.mode,busy:e.busy,activity:e.activity}).text;function ZM(e,t){let n=t.stats;switch(e){case`system`:return n?`CPU ${Math.round(n.cpu)}% · RAM ${n.ramTotal>0?Math.round(100*n.ramUsed/n.ramTotal):0}%`:`Waiting for data`;case`voice`:return t.voice.mode;case`network`:return n?n.netDown===0&&n.netUp===0?`n/a`:`↓ ${Math.round(n.netDown/1024)} KB/s ↑ ${Math.round(n.netUp/1024)} KB/s`:`Waiting for data`;case`feed`:return t.chat.at(-1)?.text??`Nothing yet`;case`radar`:return[`This screen`,t.deviceOnline?`PC`:null,t.voice.available?`Voice`:null].filter(Boolean).join(` · `);case`approval`:return`None waiting`;default:return t.office.enabled&&t.office.workers.length>0?`${t.office.workers.length} worker${t.office.workers.length===1?``:`s`}`:`No workers yet`}}function QM({usage:e,reset:t=null,real:n=!1,style:r,onClick:i}){let a=typeof e==`number`&&Number.isFinite(e);return(0,p.jsxs)(`button`,{type:`button`,className:`ob-usage-label ob-hit`,"data-widget":`usage`,title:n?`How full your Claude subscription's five-hour window is`:`Today's usage compared with your busiest day of the last 30`,style:r,onClick:i,"aria-label":a?n?`Usage ${Math.round(e)} percent of the five-hour window${t?`, resets in ${t}`:``}`:`Usage ${Math.round(e)} percent of your busiest day`:`Usage, no data yet`,children:[`USAGE `,a?`${Math.round(e)}%`:`—`,t?` · RESET ${t}`:``]})}function $M({hud:e,state:t,preview:n}){let r=JM(e.clock.seconds?1e3:15e3),i=e.clock.locale||void 0,a=r.toLocaleTimeString(i,{hour:`2-digit`,minute:`2-digit`,...e.clock.seconds?{second:`2-digit`}:{},hour12:e.clock.hour12}),o=r.toLocaleDateString(i,{weekday:`short`,day:`2-digit`,month:`short`}),s=`M330 44H560L590 20H1010L1040 44H1270`,c=t.connection===`open`;return(0,p.jsxs)(`g`,{"data-testid":`orbital-topbar`,children:[(0,p.jsx)(`path`,{className:`ob-topbar-base`,d:s}),(0,p.jsx)(`path`,{className:`ob-topbar-run`,d:s,pathLength:100}),(0,p.jsx)(`text`,{className:`ob-title`,x:`800`,y:`40`,textAnchor:`middle`,children:`F R I E N D`}),n&&(0,p.jsx)(`text`,{className:`ob-sample-tag`,x:`800`,y:`62`,textAnchor:`middle`,children:`SAMPLE DATA · NOT REAL`}),(0,p.jsx)(`circle`,{className:c?`ob-pulse`:void 0,cx:`30`,cy:`34`,r:`4`,fill:c?`#34d399`:`#fb923c`}),(0,p.jsxs)(`text`,{className:`ob-lab`,x:`40`,y:`38`,children:[(t.assistantName||`FRIEND`).toUpperCase(),` · `,c?`ONLINE`:`OFFLINE`]}),(0,p.jsxs)(`text`,{className:`ob-dim`,x:`40`,y:`58`,children:[e.terminalLabel,` · VOICE · `,t.voice.mode,` LINK · `,typeof location>`u`?``:location.host]}),(0,p.jsxs)(`text`,{className:`ob-lab`,x:`1560`,y:`38`,textAnchor:`end`,children:[a,` · `,o]})]})}function eN({hud:e,state:t,usage:n=null,viewport:r,usageApi:i,send:a=()=>{},onHire:o,onLaunch:s,onExpand:c}){let{w:u,h:d}=Mj(r),f=qM(),m=cC(u,d),h=e.preview===!0&&m===`orbit`,g=mM(h?`full`:e.density,e.widgets,m,t.approval!==null),_=h?{...t,stats:WM(Date.now()),voice:{...t.voice,mode:`listening`,level:.85}}:t,v=t.approval!==null,y=t.approval?.needsPin===!0,b=e=>e.id===`approval`?v?`orange`:`cyan`:e.tone,[x,S]=(0,l.useState)(null),[C,w]=(0,l.useState)(null),[T,E]=(0,l.useState)(!1),D=JM(3e4),O=(0,l.useRef)(null),k=(0,l.useCallback)(()=>{S(null),w(null),E(!1),O.current?.focus(),O.current=null},[]),A=e=>()=>{x===null&&C===null&&!T&&(O.current=document.activeElement instanceof HTMLElement?document.activeElement:null),w(null),E(!1),S(e),c({kind:`widget`,id:e})};(0,l.useEffect)(()=>{if(x===null&&C===null&&!T||v)return;let e=e=>{e.key===`Escape`&&(e.preventDefault(),e.stopImmediatePropagation(),k())};return window.addEventListener(`keydown`,e,!0),()=>window.removeEventListener(`keydown`,e,!0)},[x,C,T,v,k]);let j=m===`compact`?u-16:Math.max(280,Math.min(760,u*.62)),ee={x:(u-j)/2,y:d*.14,width:j,height:Math.max(220,Math.min(560,d*.7))},M=v?null:x,N=M&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`div`,{className:`ob-backdrop ob-hit`,onPointerDown:e=>{e.stopPropagation(),k()}}),(0,p.jsx)(jj,{children:(0,p.jsx)(NM,{id:M,state:t,rect:ee,...i?{usageApi:i}:{},onClose:k})})]}),P=t.office.enabled&&!h,F=v||!P?void 0:t.office.workers.find(e=>e.id===C),te=e=>{x===null&&C===null&&!T&&(O.current=document.activeElement instanceof HTMLElement?document.activeElement:null),S(null),E(!1),w(e)},ne=P&&t.office.workers.length>0,re=()=>{x===null&&C===null&&!T&&(O.current=document.activeElement instanceof HTMLElement?document.activeElement:null),S(null),w(null),E(!0)},I={...ee,x:Math.max(8,ee.x-60),width:Math.min(u-16,ee.width+120)},ie=T&&ne&&!v&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`div`,{className:`ob-backdrop ob-hit`,onPointerDown:e=>{e.stopPropagation(),k()}}),(0,p.jsx)(jj,{children:(0,p.jsx)(IM,{workers:t.office.workers,name:t.assistantName||`Friend`,rect:I,onWorker:te,onClose:k})})]}),ae=F&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`div`,{className:`ob-backdrop ob-hit`,onPointerDown:e=>{e.stopPropagation(),k()}}),(0,p.jsx)(jj,{children:(0,p.jsx)(PM,{worker:F,feed:t.office.feed[F.id]??[],rect:ee,send:a,onClose:k})})]}),L=m===`compact`?u-16:Math.max(340,Math.min(480,u*.34)),R=Math.min(d-16,y?Math.max(300,Math.min(520,d*.7)):Math.max(260,Math.min(420,d*.55))),oe={x:(u-L)/2,y:(d-R)/2,width:L,height:R},se=v,ce=se&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`div`,{className:`ob-backdrop ob-modal-backdrop`}),(0,p.jsx)(jj,{children:(0,p.jsx)(Ij,{"data-widget":`approval`,variant:`octagon`,tone:`orange`,title:`Approvals`,running:!0,className:`ob-zone ob-hit ob-static ob-modal`,style:{position:`absolute`,left:oe.x,top:oe.y,width:oe.width,height:oe.height},children:(0,p.jsx)(GM,{approval:t.approval,send:a})})})]}),le={className:`orbital`,"data-testid":`orbital`,"data-mode":m,"data-hud-anim":e.animations,...f?{"data-paused":``}:{}},ue=g.some(e=>e.id===`usage`),z=h?{value:42,reset:null,real:!1}:uM(t.office.quota,n,D.getTime()),B=e=>{switch(e){case`system`:return(0,p.jsx)(xM,{stats:_.stats});case`network`:return(0,p.jsx)(CM,{stats:_.stats});case`radar`:return(0,p.jsx)(wM,{deviceOnline:_.deviceOnline,voiceAvailable:_.voice.available,...h?{blips:HM}:{}});case`voice`:return(0,p.jsx)(kM,{level:_.voice.level,mode:_.voice.mode});case`feed`:{let e=P?cM(t.office.feed,t.office.workers):[];return(0,p.jsx)(yM,{lines:h?RM:e.length>0?e:_.chat,activity:_.activity,busy:h||e.length>0?!1:_.busy,marquee:h})}case`tickets`:return P?(0,p.jsx)(EM,{cells:nM(t.office.tickets),...rM(t.office.tickets)?{project:rM(t.office.tickets)}:{}}):(0,p.jsx)(EM,{...h?{cells:BM,project:`landing-page`}:{}});case`budget`:return(0,p.jsx)(hM,{...h?{rings:VM}:P?{rings:aM(t.office.workers)}:{}});default:return null}};if(m===`compact`){let n=e=>(0,p.jsx)(jj,{children:(0,p.jsx)(Ij,{"data-widget":e.id,variant:`chamfer`,tone:b(e),title:e.title,className:`ob-zone ob-hit`,style:{minWidth:170,height:100,flex:`none`},role:`button`,tabIndex:0,"aria-label":e.title,onClick:A(e.id),onKeyDown:YM(A(e.id)),children:(0,p.jsx)(`p`,{className:`ob-li`,children:ZM(e.id,t)})})},e.id);return(0,p.jsxs)(`div`,{...le,children:[(0,p.jsx)(Fj,{}),(0,p.jsxs)(`div`,{className:`ob-chips`,children:[ne&&(0,p.jsxs)(`button`,{type:`button`,className:`ob-chip ob-hit`,onClick:re,children:[`Team · `,t.office.workers.length]}),P&&t.office.workers.map(e=>(0,p.jsx)(`button`,{type:`button`,className:`ob-chip ob-hit`,onClick:()=>te(e.id),children:e.name},e.id)),e.launcher.map(e=>(0,p.jsxs)(`button`,{type:`button`,className:`ob-chip ob-hit`,onClick:()=>s(e),children:[(0,p.jsx)(`span`,{"aria-hidden":`true`,children:e.icon}),` `,e.label]},e.id))]}),(0,p.jsx)(`p`,{className:`ob-compact-status`,children:XM(t)}),(0,p.jsxs)(`div`,{className:`ob-strip`,children:[g.filter(e=>e.anchor!==`centre`&&!(e.id===`approval`&&v)).map(n),ue&&(0,p.jsx)(QM,{usage:z.value,reset:z.reset,real:z.real,onClick:A(`usage`)})]}),N,ae,ie,ce]})}let V=nC(u,d),de=sC(ZS,900),fe=e.launcher.map(e=>({id:e.id,label:e.label,glyph:e.icon,caption:e.label,status:`idle`,onClick:()=>s(e)})),pe=P?$j(t.office.workers,!0):[],me=e=>({id:e.id,label:e.label,glyph:e.glyph,caption:e.caption,status:e.status,onClick:()=>o?.()}),he=pe.map((e,t)=>e.kind===`hire`?me(e):{id:e.id,label:e.label,glyph:e.glyph,caption:e.caption,status:e.status,detail:e.detail,...LM[t]?{at:LM[t].at}:{},onClick:()=>te(e.id)}),H=h?LM.map(e=>({id:e.id,label:e.label,glyph:e.label,status:e.status,detail:e.detail,at:e.at,onClick:()=>{}})):P?t.office.workers.length>0?he:[...fe,...he]:fe,ge=oC(H.length,ZS,900),_e=z.value,ve=(e,t,n)=>{let r=rC(e,0,0,u,d);return(0,p.jsx)(`div`,{className:`ob-canvas ob-canvas-${t}`,style:{left:r.x,top:r.y,width:ZS,height:900,transform:`scale(${V})`},children:n})},U=e=>{let n={left:e.box.x,top:e.box.y,width:e.box.w,height:e.box.h};return e.id===`approval`?se?null:(0,p.jsx)(jj,{children:(0,p.jsx)(`div`,{"data-widget":`approval`,className:`ob-w ob-hit ob-static`,style:n,children:v?(0,p.jsx)(Ij,{variant:`octagon`,tone:`orange`,running:!0,className:`ob-approval-frame`,children:(0,p.jsx)(GM,{approval:t.approval,send:a})}):h?(0,p.jsx)(Ij,{variant:`octagon`,tone:`orange`,running:!0,className:`ob-approval-frame`,children:(0,p.jsx)(GM,{approval:UM,send:()=>{}})}):(0,p.jsx)(Ij,{variant:`bracket`,title:`Approvals`,children:(0,p.jsx)(GM,{approval:null,send:a})})})},e.id):(0,p.jsx)(jj,{children:(0,p.jsx)(`div`,{"data-widget":e.id,className:`ob-w ob-hit`,style:n,role:`button`,tabIndex:0,"aria-label":e.title,onClick:A(e.id),onKeyDown:YM(A(e.id)),children:B(e.id)})},e.id)},ye=e=>g.filter(t=>t.anchor===e),W=(t.assistantName||`FRIEND`).toUpperCase(),be=Math.min(1,Math.max(0,t.voice.level,t.presence.amplitude)),xe=rC(`centre`,0,0,u,d);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`div`,{className:`ob-base`,"aria-hidden":`true`,children:(0,p.jsx)(`div`,{className:`ob-canvas`,style:{left:xe.x,top:xe.y,width:ZS,height:900,transform:`scale(${V})`},children:(0,p.jsx)(`svg`,{className:`ob-scene`,width:ZS,height:900,viewBox:`0 0 ${ZS} 900`,children:(0,p.jsx)(`g`,{className:`ob-disc-wrap`,style:{transform:`scale(${Number((1+.18*be).toFixed(3))})`},children:(0,p.jsx)(`circle`,{className:`ob-disc ob-breathe`,cx:de.cx,cy:de.cy,r:`104`,fill:`url(#ob-orbg)`,filter:`url(#ob-glow2)`})})})})}),(0,p.jsxs)(`div`,{...le,style:{"--s":V},children:[(0,p.jsx)(Fj,{}),(0,p.jsx)(`div`,{className:`ob-bg`,"aria-hidden":`true`}),(0,p.jsx)(`span`,{className:`ob-corner ob-tl`,"aria-hidden":`true`}),(0,p.jsx)(`span`,{className:`ob-corner ob-tr`,"aria-hidden":`true`}),(0,p.jsx)(`span`,{className:`ob-corner ob-bl`,"aria-hidden":`true`}),(0,p.jsx)(`span`,{className:`ob-corner ob-br`,"aria-hidden":`true`}),ve(`centre`,`centre`,(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`svg`,{className:`ob-scene`,width:ZS,height:900,viewBox:`0 0 ${ZS} 900`,"aria-hidden":`true`,children:[(0,p.jsx)(jj,{children:(0,p.jsx)($M,{hud:e,state:_,preview:h})}),(0,p.jsx)(`circle`,{cx:de.cx,cy:de.cy,r:`104`,className:`ob-orb-ring`}),(0,p.jsx)(`circle`,{cx:de.cx,cy:de.cy,r:`104`,className:`ob-ping`}),(0,p.jsx)(`g`,{className:`ob-spin ob-fast`,children:(0,p.jsx)(`circle`,{cx:de.cx,cy:de.cy,r:`128`,className:`ob-ring-dash`})}),(0,p.jsx)(`g`,{className:`ob-spin ob-reverse`,children:(0,p.jsx)(`circle`,{cx:de.cx,cy:de.cy,r:`150`,className:`ob-ring-long`})}),(0,p.jsx)(`g`,{className:`ob-spin`,children:(0,p.jsx)(`circle`,{cx:de.cx,cy:de.cy,r:`172`,className:`ob-ring-thin`})}),(0,p.jsx)(`circle`,{cx:de.cx,cy:de.cy,r:300,className:`ob-orbit`}),(0,p.jsx)(`g`,{className:`ob-spin ob-reverse ob-slow`,children:(0,p.jsx)(`circle`,{cx:de.cx,cy:de.cy,r:`330`,className:`ob-ring-outer`})}),ge.map((e,t)=>{let n={x:Math.cos(e.angle*Math.PI/180),y:Math.sin(e.angle*Math.PI/180)};return(0,p.jsx)(Zj,{tone:H[t].status===`waiting`?`orange`:`cyan`,x1:de.cx+n.x*104,y1:de.cy+n.y*104,x2:de.cx+n.x*266,y2:de.cy+n.y*266},H[t].id)}),H.map(e=>e.at&&e.detail&&(0,p.jsx)(`text`,{className:`ob-node-detail${e.status===`running`?` ob-grn`:e.status===`waiting`?` ob-org`:``}`,x:e.at.x,y:e.at.y,textAnchor:e.at.anchor,children:e.detail},e.id))]}),ne&&(0,p.jsxs)(`button`,{type:`button`,className:`ob-team-btn ob-hit`,style:{left:de.cx,top:de.cy+52},onClick:re,children:[`TEAM · `,t.office.workers.length]}),(0,p.jsxs)(`div`,{className:`ob-orb-label`,style:{left:de.cx,top:de.cy},"aria-hidden":`true`,children:[(0,p.jsx)(`b`,{children:W}),(0,p.jsx)(`small`,{children:sM(t.voice.mode,h?{enabled:!1,workers:[]}:t.office)})]}),ue&&(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`div`,{className:`ob-usage-ring`,style:{left:de.cx-230,top:de.cy-230,width:460,height:460},children:(0,p.jsx)(Jj,{value:_e??0,radius:205,size:460})}),(0,p.jsx)(QM,{usage:_e,reset:z.reset,real:z.real,style:{position:`absolute`,left:800,top:692,transform:`translate(-50%, -50%)`},onClick:A(`usage`)})]}),ge.map((e,t)=>{let n=H[t];return(0,p.jsx)(jj,{children:(0,p.jsx)(Xj,{x:e.x,y:e.y,label:n.label,glyph:n.glyph,status:n.status,...n.caption?{caption:n.caption}:{},...n.detail?{detail:n.detail}:{},onClick:n.onClick})},n.id)}),(0,p.jsx)(`div`,{className:`ob-cmd`,"aria-hidden":`true`,children:(0,p.jsx)(`small`,{children:`[ HOLD TO TALK ]`})})]})),ve(`left`,`left`,ye(`left`).map(U)),ve(`right`,`right`,ye(`right`).map(U)),N,ae,ie,ce]})]})}var tN=3e5,nN=(e=new Date)=>`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`,rN={today:0,peak:0,share:null,error:!1};function iN(e=TS,t=!0){let[n,r]=(0,l.useState)(rN);return(0,l.useEffect)(()=>{if(!t)return;let n=!0,i=()=>e.summary(30).then(e=>{if(!n)return;let t=e.days.map(e=>({day:e.day,n:e.input+e.output})),i=Math.max(0,...t.map(e=>e.n)),a=t.find(e=>e.day===nN())?.n??0;r({today:a,peak:i,share:i>0?Math.min(1,Math.max(0,a/i)):null,error:!1})}).catch(()=>n&&r({...rN,error:!0}));i();let a=setInterval(()=>void i(),tN);return()=>{n=!1,clearInterval(a)}},[e,t]),n}var aN=(e,t=18)=>(0,p.jsx)(`svg`,{width:t,height:t,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:e}),oN=()=>aN((0,p.jsx)(`path`,{d:`M7 4.5v15l12-7.5z`,fill:`currentColor`})),sN=()=>aN((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`rect`,{x:`6`,y:`4.5`,width:`4`,height:`15`,fill:`currentColor`}),(0,p.jsx)(`rect`,{x:`14`,y:`4.5`,width:`4`,height:`15`,fill:`currentColor`})]})),cN=()=>aN((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M5 5v14l10-7z`,fill:`currentColor`}),(0,p.jsx)(`path`,{d:`M18 5v14`})]})),lN=()=>aN((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M19 5v14L9 12z`,fill:`currentColor`}),(0,p.jsx)(`path`,{d:`M6 5v14`})]})),uN=()=>aN((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M3 7h3.5c3 0 4 2 5.5 5s2.500 5 5.500 5H21`}),(0,p.jsx)(`path`,{d:`M3 17h3.5c1.500 0 2.500-.6 3.400-1.800M13.500 8.800C14.500 7.600 15.500 7 17 7h4`}),(0,p.jsx)(`path`,{d:`m18.500 4.500 2.500 2.500-2.500 2.500M18.500 14.500l2.500 2.500-2.500 2.500`})]})),dN=()=>aN((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M17 3l3 3-3 3`}),(0,p.jsx)(`path`,{d:`M4 11V9a3 3 0 0 1 3-3h13M7 21l-3-3 3-3`}),(0,p.jsx)(`path`,{d:`M20 13v2a3 3 0 0 1-3 3H4`})]})),fN=()=>aN((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M4 9.500v5h3.500L12 18.500v-13L7.500 9.500z`,fill:`currentColor`}),(0,p.jsx)(`path`,{d:`M15.500 9a4 4 0 0 1 0 6M18 6.500a7.500 7.500 0 0 1 0 11`})]})),pN=()=>aN((0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(`path`,{d:`M4 9.500v5h3.500L12 18.500v-13L7.500 9.500z`,fill:`currentColor`}),(0,p.jsx)(`path`,{d:`m16 9 5 6M21 9l-5 6`})]})),mN=()=>aN((0,p.jsx)(`path`,{d:`M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5`})),hN=()=>aN((0,p.jsx)(`path`,{d:`M9 4v5H4M15 4v5h5M9 20v-5H4M15 20v-5h5`})),gN=()=>aN((0,p.jsx)(`path`,{d:`M6 6l12 12M18 6 6 18`})),_N=()=>aN((0,p.jsx)(`path`,{d:`M9 18V6l10-2v12`}),22),vN=56,yN=()=>({bars:new Float32Array(vN),bass:0,left:0,right:0});function bN(e,t,n,r,i){let a=n?.82:.9;if(t&&n){t.getByteFrequencyData(i);let n=Math.min(i.length,96);for(let t=0;t<vN;t++){let r=Math.min(n-1,Math.floor((t/vN)**1.6*n));e.bars[t]=Math.max((i[r]??0)/255,e.bars[t]*a)}}else if(n)for(let t=0;t<vN;t++)e.bars[t]=Math.max(.12+.28*Math.abs(Math.sin(r/420+t*.55)*Math.cos(r/900+t*.21)),e.bars[t]*a);else for(let t=0;t<vN;t++)e.bars[t]=e.bars[t]*a;let o=0;for(let t=0;t<6;t++)o+=e.bars[t];e.bass=Math.min(1,o/6*1.15);let s=0,c=0;for(let t=0;t<vN/2;t++)s+=e.bars[t],c+=e.bars[t+vN/2];e.left=Math.min(1,s/(vN/2)*1.6),e.right=Math.min(1,c/(vN/2)*3.2)}function xN({progress:e,playing:t,cover:n,analyser:r,levels:i,visualizer:a,animate:o,size:s}){let c=(0,l.useRef)(null),u=(0,l.useRef)(null),d=(0,l.useRef)(new Uint8Array(new ArrayBuffer(128)));(0,l.useEffect)(()=>{let e=c.current,n=e?.getContext(`2d`);if(!e||!n||!o)return;let l=0,f=Math.min(2,window.devicePixelRatio||1);e.width=e.height=Math.round(s*f);let p=getComputedStyle(e).getPropertyValue(`--accent`).trim()||`#3fd8ff`,m=e=>{if(bN(i,r,t,e,d.current),u.current?.style.setProperty(`--bass`,i.bass.toFixed(3)),n.setTransform(f,0,0,f,0,0),n.clearRect(0,0,s,s),a){let e=s/2,t=s*.335,r=s*.135;n.lineCap=`round`,n.lineWidth=Math.max(1.5,s/90);for(let a=0;a<vN;a++){let o=a/vN*Math.PI*2-Math.PI/2,s=i.bars[a],c=2+s*r;n.strokeStyle=p,n.globalAlpha=.35+s*.65,n.beginPath(),n.moveTo(e+Math.cos(o)*t,e+Math.sin(o)*t),n.lineTo(e+Math.cos(o)*(t+c),e+Math.sin(o)*(t+c)),n.stroke()}n.globalAlpha=1}(t||!i.bars.every(e=>e<.01)||a)&&(l=requestAnimationFrame(m))};return l=requestAnimationFrame(m),()=>cancelAnimationFrame(l)},[r,t,a,o,s,i]);let f=Math.max(0,Math.min(1,e))*100;return(0,p.jsxs)(`div`,{ref:u,className:`hud-dial${t?` playing`:``}`,style:{width:s,height:s},role:`img`,"aria-label":`Playback dial`,children:[(0,p.jsxs)(`svg`,{className:`hud-dial-svg`,viewBox:`0 0 200 200`,"aria-hidden":`true`,children:[(0,p.jsx)(`circle`,{className:`hud-dial-ticks`,cx:`100`,cy:`100`,r:`96`}),(0,p.jsx)(`circle`,{className:`hud-dial-track`,cx:`100`,cy:`100`,r:`88`}),(0,p.jsx)(`circle`,{className:`hud-dial-arc`,cx:`100`,cy:`100`,r:`88`,pathLength:`100`,strokeDasharray:`${f} 100`,transform:`rotate(-90 100 100)`}),(0,p.jsx)(`circle`,{className:`hud-dial-inner`,cx:`100`,cy:`100`,r:`62`}),(0,p.jsxs)(`g`,{className:`hud-needle`,children:[(0,p.jsx)(`line`,{x1:`100`,y1:`100`,x2:`100`,y2:`14`}),(0,p.jsx)(`circle`,{cx:`100`,cy:`14`,r:`2.500`})]})]}),(0,p.jsx)(`canvas`,{ref:c,className:`hud-spectrum`,style:{width:s,height:s},"aria-hidden":`true`}),(0,p.jsx)(`div`,{className:`hud-cover`,style:n?{backgroundImage:`url("${n}")`}:void 0,children:!n&&(0,p.jsx)(_N,{})})]})}var SN=e=>{let t=Math.max(0,Math.floor(Number.isFinite(e)?e:0));return`${Math.floor(t/60)}:${String(t%60).padStart(2,`0`)}`},CN=new Map,wN=e=>{let t=zu(e);return t&&t.source===`local`?t.id:null},TN=e=>zu(e)?.source===`spotify`,EN=e=>zu(e)?.source===`soundcloud`,DN=e=>zu(e)?.source===`audius`,ON={spotify:`Spotify`,soundcloud:`SoundCloud`,audius:`Audius`};function kN(e){let[t,n]=(0,l.useState)(e?CN.get(e)??!1:!1);return(0,l.useEffect)(()=>{if(!e)return n(!1);if(CN.has(e))return n(CN.get(e));let t=!0,r=new Image;r.onload=()=>{CN.set(e,!0),t&&n(!0)},r.onerror=()=>{CN.set(e,!1),t&&n(!1)};let i=wN(e);return i?(r.src=`/api/music/cover/${i}`,()=>{t=!1}):n(!1)},[e]),e&&t?`/api/music/cover/${wN(e)}`:null}async function AN(e,t){let n=await fetch(`/api/music/library?q=${encodeURIComponent(e)}&limit=${t}`);return n.ok?await n.json():{tracks:[],total:0}}function jN(){let[e,t]=(0,l.useState)(null);return(0,l.useEffect)(()=>{let e=!0;return fetch(`/api/music/sources`).then(e=>e.ok?e.json():null).then(n=>{let r={};for(let e of[`spotify`,`soundcloud`,`audius`]){let t=n?.sources?.find(t=>t.id===e)?.status;t&&(r[e]={connected:t.connected,needs:t.needs})}e&&n&&t(r)}).catch(()=>{}),()=>{e=!1}},[]),e}async function MN(e,t,n){let r=await fetch(`/api/music/search?q=${encodeURIComponent(t)}&source=${e}&limit=${n}`);if(!r.ok)return{tracks:[],total:0};let i=((await r.json()).tracks??[]).map(e=>({id:e.ref,title:e.title,artist:e.artist,album:e.album,durationSec:e.durationSec}));return{tracks:i,total:i.length}}var NN=e=>({id:e.id,title:e.title,artist:e.artist,album:e.album,durationSec:e.durationSec});function PN({levels:e,animate:t,side:n}){let r=(0,l.useRef)(null);return(0,l.useEffect)(()=>{if(!t)return;let i=0,a=r.current,o=()=>{if(a){let t=n===`left`?e.left:e.right,r=Math.round(t*12);a.querySelectorAll(`i`).forEach((e,t)=>e.classList.toggle(`on`,t<r))}i=requestAnimationFrame(o)};return i=requestAnimationFrame(o),()=>cancelAnimationFrame(i)},[e,t,n]),(0,p.jsx)(`div`,{ref:r,className:`hud-levels ${n}`,"aria-hidden":`true`,children:Array.from({length:12},(e,t)=>(0,p.jsx)(`i`,{},t))})}function FN({player:e,anim:t}){let{state:n,dispatch:r}=e,i=(0,l.useCallback)(async()=>{if(n.queue.length>0)return r({type:`resume`});let e=await AN(``,500);r({type:`play`,tracks:e.tracks.map(NN),mode:`replace`,...n.shuffle?{shuffle:!0}:{}})},[n.queue.length,n.shuffle,r]),a=e=>n=>{t!==`off`&&kj(n),e()};return(0,p.jsxs)(`div`,{className:`hud-controls`,role:`group`,"aria-label":`Player controls`,children:[(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":`Shuffle`,"aria-pressed":n.shuffle,title:`Shuffle`,onClick:()=>r({type:`shuffle`}),children:(0,p.jsx)(uN,{})}),(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":`Previous track`,title:`Previous`,onPointerDown:a(()=>{}),onClick:()=>r({type:`previous`}),children:(0,p.jsx)(lN,{})}),(0,p.jsx)(`button`,{type:`button`,className:`hud-btn hud-btn-main`,"aria-label":n.playing?`Pause`:`Play`,title:n.playing?`Pause`:`Play`,onPointerDown:a(()=>{}),onClick:()=>n.playing?r({type:`pause`}):void i(),children:n.playing?(0,p.jsx)(sN,{}):(0,p.jsx)(oN,{})}),(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":`Next track`,title:`Next`,onPointerDown:a(()=>{}),onClick:()=>r({type:`next`}),children:(0,p.jsx)(cN,{})}),(0,p.jsxs)(`button`,{type:`button`,className:`hud-btn${n.repeat===`off`?``:` on`}`,"aria-label":`Repeat: ${n.repeat}`,title:`Repeat: ${n.repeat}`,onClick:()=>r({type:`repeat`,mode:n.repeat===`off`?`all`:n.repeat===`all`?`one`:`off`}),children:[(0,p.jsx)(dN,{}),n.repeat===`one`&&(0,p.jsx)(`sup`,{children:`1`})]})]})}function IN({player:e}){let{state:t,dispatch:n}=e,r=t.duration>0?t.position/t.duration*100:0;return(0,p.jsxs)(`div`,{className:`hud-timeline`,children:[(0,p.jsx)(`span`,{className:`hud-time`,children:SN(t.position)}),(0,p.jsx)(`input`,{type:`range`,className:`hud-range`,"aria-label":`Position`,min:0,max:Math.max(1,Math.floor(t.duration)),step:1,value:Math.min(Math.floor(t.position),Math.max(1,Math.floor(t.duration))),style:{"--fill":`${r}%`},disabled:t.duration<=0,onChange:e=>n({type:`seek`,seconds:Number(e.target.value)})}),(0,p.jsxs)(`span`,{className:`hud-time`,children:[`-`,SN(Math.max(0,t.duration-t.position))]})]})}function LN({player:e}){let{state:t,dispatch:n}=e;return(0,p.jsxs)(`div`,{className:`hud-volume`,children:[(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":t.muted?`Unmute`:`Mute`,onClick:()=>n({type:`mute`}),children:t.muted||t.volume===0?(0,p.jsx)(pN,{}):(0,p.jsx)(fN,{})}),(0,p.jsx)(`input`,{type:`range`,className:`hud-range`,"aria-label":`Volume`,min:0,max:100,value:t.muted?0:t.volume,style:{"--fill":`${t.muted?0:t.volume}%`},onChange:e=>n({type:`volume`,level:Number(e.target.value)})})]})}function RN({player:e,anim:t}){let{state:n,dispatch:r}=e,[i,a]=(0,l.useState)(n.queue.length?`queue`:`library`),[o,s]=(0,l.useState)(``),[c,u]=(0,l.useState)(`folder`),[d,f]=(0,l.useState)(null),m=jN(),h=[`spotify`,`soundcloud`,`audius`].filter(e=>m?.[e]?.connected),g=c!==`folder`&&h.includes(c)?c:null,_=g?m?.[g]?.needs:null;(0,l.useEffect)(()=>{if(i!==`library`)return;let e=!0;if(g&&!o.trim()){f(null);return}let t=()=>g?MN(g,o.trim(),30):AN(o,100),n=setTimeout(()=>void t().then(t=>e&&f(t)),o?250:0);return()=>{e=!1,clearTimeout(n)}},[i,o,g]);let v=i===`queue`?n.queue.map((e,t)=>({track:e,index:t})):(d?.tracks??[]).map((e,t)=>({track:NN(e),index:t}));return(0,p.jsxs)(`div`,{className:`hud-playlist`,children:[(0,p.jsxs)(`div`,{className:`hud-tabs`,role:`tablist`,children:[[`queue`,`library`].map(e=>(0,p.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":i===e,className:`hud-chip${i===e?` on`:``}`,onClick:()=>a(e),children:e===`queue`?`Queue (${n.queue.length})`:`Library`},e)),i===`queue`&&n.queue.length>0&&(0,p.jsx)(`button`,{type:`button`,className:`hud-chip`,onClick:()=>r({type:`clear`}),children:`Clear`})]}),i===`library`&&h.length>0&&(0,p.jsx)(`div`,{className:`hud-tabs`,role:`tablist`,"aria-label":`Where to look`,children:[`folder`,...h].map(e=>(0,p.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":c===e,className:`hud-chip${c===e?` on`:``}`,onClick:()=>{u(e),f(null)},children:e===`folder`?`Folder`:ON[e]},e))}),i===`library`&&(0,p.jsx)(`input`,{className:`hud-search`,type:`search`,placeholder:`Search title, artist or album`,"aria-label":`Search the music`,value:o,onChange:e=>s(e.target.value)}),(0,p.jsxs)(`ul`,{className:`hud-list`,children:[v.length===0&&(0,p.jsx)(`li`,{className:`hud-empty`,children:i===`queue`?`The queue is empty.`:g&&!o.trim()?`Type to search ${ON[g]}.`:d?`No music matches.`:`Loading…`}),i===`library`&&g&&_&&(0,p.jsx)(`li`,{className:`hud-empty`,children:_}),v.map(({track:e,index:a},o)=>{let s=i===`queue`&&a===n.index;return(0,p.jsxs)(`li`,{className:`hud-tab hud-cut${s?` current`:``}${t===`full`?` hud-boot`:``}`,style:{"--i":Math.min(o,12)},children:[(0,p.jsxs)(`button`,{type:`button`,className:`hud-tab-main`,"aria-current":s?`true`:void 0,onPointerDown:t===`off`?void 0:kj,onClick:()=>r(i===`queue`?{type:`jump`,index:a}:{type:`play`,tracks:(d?.tracks??[]).map(NN),mode:`replace`,start:a}),children:[(0,p.jsx)(`span`,{className:`hud-tab-title`,children:e.title}),(0,p.jsxs)(`small`,{children:[e.artist||e.album,TN(e.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`SPOTIFY`}),EN(e.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`SOUNDCLOUD`}),DN(e.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`AUDIUS`})]})]}),i===`library`&&(0,p.jsx)(`button`,{type:`button`,className:`hud-mini`,"aria-label":`Add ${e.title} to the queue`,title:`Add to the queue`,onClick:()=>r({type:`play`,tracks:[e],mode:`add`}),children:`+`}),i===`queue`&&(0,p.jsx)(`button`,{type:`button`,className:`hud-mini`,"aria-label":`Remove ${e.title} from the queue`,title:`Remove`,onClick:()=>r({type:`remove`,index:a}),children:`×`})]},`${e.id}-${a}`)})]})]})}function zN({player:e,music:t,animations:n}){let{state:r,dispatch:i,current:a,blocked:o,notice:s,analyser:c,unlock:u}=e,d=(0,l.useMemo)(yN,[]),f=kN(a?.id),m=r.view===`full`,h=Oj(a?.title??``,n===`full`);if(!t?.folderSet||r.view===`hidden`)return null;let g=r.duration>0?r.position/r.duration:0,_=n!==`off`;return(0,p.jsxs)(me,{id:`music`,label:`Music player`,wholeBox:!0,testId:`music`,className:`hud hud-music hud-cut ${m?`full`:`mini`}${r.playing?` playing`:``}${n===`full`?` hud-boot`:``}`,children:[(0,p.jsxs)(`header`,{className:`hud-music-head`,children:[(0,p.jsx)(`span`,{className:`hud-kicker`,children:`Media player`}),(0,p.jsxs)(`span`,{className:`hud-head-actions`,children:[(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":m?`Smaller player`:`Bigger player`,title:m?`Smaller`:`Bigger`,onClick:()=>i({type:`view`,view:m?`mini`:`full`}),children:m?(0,p.jsx)(hN,{}):(0,p.jsx)(mN,{})}),(0,p.jsx)(`button`,{type:`button`,className:`hud-btn`,"aria-label":`Hide the player`,title:`Hide (the music keeps playing)`,onClick:()=>i({type:`view`,view:`hidden`}),children:(0,p.jsx)(gN,{})})]})]}),(0,p.jsxs)(`div`,{className:`hud-music-body`,children:[(0,p.jsxs)(`div`,{className:`hud-music-left`,children:[m&&(0,p.jsx)(PN,{levels:d,animate:_,side:`left`}),(0,p.jsx)(xN,{progress:g,playing:r.playing,cover:f,analyser:c,levels:d,visualizer:t.visualizer,animate:_,size:m?250:112}),m&&(0,p.jsx)(PN,{levels:d,animate:_,side:`right`})]}),(0,p.jsxs)(`div`,{className:`hud-music-main`,children:[(0,p.jsxs)(`div`,{className:`hud-now`,"aria-live":`polite`,children:[(0,p.jsx)(`b`,{className:`hud-title`,children:a?h:`Nothing playing`}),(0,p.jsxs)(`small`,{className:`hud-sub`,children:[a?[a.artist,a.album].filter(Boolean).join(` — `):`Press play, or ask for some music.`,a&&TN(a.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`SPOTIFY`}),a&&EN(a.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`SOUNDCLOUD`}),a&&DN(a.id)&&(0,p.jsx)(`em`,{className:`hud-source`,children:`AUDIUS`}),e.remote&&(0,p.jsx)(`em`,{className:`hud-source`,children:`THIS PC`})]})]}),(0,p.jsx)(IN,{player:e}),(0,p.jsx)(FN,{player:e,anim:n}),m&&(0,p.jsx)(LN,{player:e}),s&&(0,p.jsx)(`p`,{className:`hud-notice`,role:`status`,children:s}),o&&(0,p.jsx)(`button`,{type:`button`,className:`hud-unlock`,onClick:u,children:`Tap to enable sound`})]}),m&&(0,p.jsx)(RN,{player:e,anim:n})]})]})}var BN=/^spotify:/,VN=class{local;makeSpotify;active;spotify=null;listeners=new Map;wrapped=new Map;vol=1;mute=!1;pre=``;constructor(e,t){this.local=e,this.makeSpotify=t,this.active=e}get element(){return this.local}get error(){return this.active.error??null}wrap(e){let t=this.wrapped.get(e);return t||(t={local:()=>{this.active===this.local&&e()},spot:()=>{this.spotify&&this.active===this.spotify&&e()}},this.wrapped.set(e,t)),t}spot(){if(!this.spotify){let e=this.makeSpotify();e.volume=this.vol,e.muted=this.mute,e.preload=this.pre;for(let[t,n]of this.listeners)for(let r of n)e.addEventListener(t,this.wrap(r).spot);this.spotify=e}return this.spotify}dispose(){this.spotify?.dispose?.(),this.spotify=null,this.active=this.local}get src(){return this.active.src}set src(e){let t=BN.test(e)?this.spot():this.local;t===this.active?e===``&&this.active.pause():(this.active.pause(),this.active=t),this.active.src=e}get currentTime(){return this.active.currentTime}set currentTime(e){this.active.currentTime=e}get duration(){return this.active.duration}get paused(){return this.active.paused}get volume(){return this.vol}set volume(e){this.vol=e,this.local.volume=e,this.spotify&&(this.spotify.volume=e)}get muted(){return this.mute}set muted(e){this.mute=e,this.local.muted=e,this.spotify&&(this.spotify.muted=e)}get preload(){return this.pre}set preload(e){this.pre=e,this.local.preload=e,this.spotify&&(this.spotify.preload=e)}play(){return this.active.play()}pause(){this.active.pause()}addEventListener(e,t){let n=this.listeners.get(e);n||this.listeners.set(e,n=new Set),n.add(t);let r=this.wrap(t);this.local.addEventListener(e,r.local),this.spotify?.addEventListener(e,r.spot)}removeEventListener(e,t){this.listeners.get(e)?.delete(t);let n=this.wrap(t);this.local.removeEventListener(e,n.local),this.spotify?.removeEventListener(e,n.spot)}},HN=/^spotify:([A-Za-z0-9_-]{1,64})$/,UN=`Spotify Premium is needed to play on this screen.`;async function WN(){let e=await fetch(`/api/music/spotify/token`,{cache:`no-store`});if(!e.ok)throw Error(`Spotify is not connected.`);return(await e.json()).accessToken}function GN(){let e=window;return e.Spotify?Promise.resolve(e.Spotify):new Promise((t,n)=>{e.onSpotifyWebPlaybackSDKReady=()=>e.Spotify?t(e.Spotify):n(Error(`no sdk`));let r=document.createElement(`script`);r.src=`https://sdk.scdn.co/spotify-player.js`,r.async=!0,r.onerror=()=>n(Error(`blocked`)),document.head.appendChild(r)})}function KN(e){let t=e.fetch??((...e)=>fetch(...e)),n=e.now??Date.now,r=new Map,i=null,a=null,o=null,s=null,c=!1,l=null,u=null,d=0,f=0,p=0,m=!0,h=1,g=!1,_,v=e=>{for(let t of r.get(e)??[])t()},y=()=>g?0:h,b=()=>{_&&clearInterval(_),_=void 0},x=()=>{_||=setInterval(()=>v(`timeupdate`),250)},S={error:null,preload:``,get src(){return s??``},set src(e){let t=HN.exec(e);c=e!==``&&!t,s=t?e:null,l=null,u=null,d=0,p=0,S.error=null,t||b()},get currentTime(){return m?d:d+(n()-f)/1e3},set currentTime(e){d=e,f=n(),i?.seek(Math.round(e*1e3)).catch(()=>{})},get duration(){return p},get paused(){return m},get volume(){return h},set volume(e){h=e,i?.setVolume(y()).catch(()=>{})},get muted(){return g},set muted(e){g=e,i?.setVolume(y()).catch(()=>{})},async play(){if(c||!s)throw Error(`That is not a Spotify track.`);let r=HN.exec(s),a=s,o=await T();if(s!==a)return;if(l===s){await i?.resume().catch(()=>{}),m=!1,f=n(),x();return}let u=await e.getToken().catch(()=>null);if(!u)throw C(`Spotify is not connected. Connect it in Plugins, Spotify.`);let d;try{d=await t(`https://api.spotify.com/v1/me/player/play?device_id=${encodeURIComponent(o)}`,{method:`PUT`,headers:{authorization:`Bearer ${u}`,"content-type":`application/json`},body:JSON.stringify({uris:[`spotify:track:${r[1]}`]})})}catch{throw C(`Friend could not reach Spotify right now.`)}if(d.status===403)throw C(UN);if(d.status===401)throw C(`Spotify sign-in has ended. Reconnect Spotify in Plugins, Spotify.`);if(d.status===404)throw C(`Spotify could not find this screen or that track.`);if(d.status===429)throw C(`Spotify is asking Friend to slow down. Try again in a minute.`);if(!d.ok)throw C(`Spotify could not play that.`);s===a&&(l=a,m=!1,f=n(),x())},pause(){m=!0,d+=(n()-f)/1e3,f=n(),b(),i?.pause().catch(()=>{})},dispose(){b();try{i?.disconnect()}catch{}i=null,a=null,s=null,l=null},addEventListener(e,t){let n=r.get(e);n||r.set(e,n=new Set),n.add(t)},removeEventListener(e,t){r.get(e)?.delete(t)}};function C(e){S.error=e,m=!0,b(),v(`error`);let t=Error(e),n=o;return o=null,n?.reject(t),t}function w(e){if(!e)return;d=e.position/1e3,f=n(),p=e.duration/1e3,m=e.paused,v(`timeupdate`),v(`loadedmetadata`),v(`durationchange`);let t=s?HN.exec(s)?.[1]:void 0;t&&e.paused&&e.position===0&&u!==s&&(e.track_window.previous_tracks??[]).some(e=>e.id===t)&&(u=s,b(),v(`ended`))}function T(){if(a)return Promise.resolve(a);if(o)return o.promise;let t,n,r=new Promise((e,r)=>{t=e,n=r}),s={promise:r,resolve:t,reject:n};o=s;let c=setTimeout(()=>{o===s&&C(`Spotify's player did not start. Check that this browser allows Spotify's player, then try again.`)},e.readyTimeoutMs??15e3),l=()=>clearTimeout(c);return r.then(l,l),(async()=>{try{if(!i){let t;try{t=await(e.loadSdk??GN)()}catch{o===s&&C(`Spotify's player could not be loaded. Check that nothing blocks sdk.scdn.co.`);return}let n=new t.Player({name:e.deviceName??`Friend`,volume:y(),getOAuthToken:t=>{e.getToken().then(t,()=>{})}});i=n,n.addListener(`ready`,(e=>{a=e.device_id;let t=o;o=null,t?.resolve(e.device_id)})),n.addListener(`not_ready`,(()=>{a=null})),n.addListener(`player_state_changed`,(e=>w(e))),n.addListener(`account_error`,(()=>void C(UN))),n.addListener(`authentication_error`,(()=>void C(`Spotify sign-in has ended. Reconnect Spotify in Plugins, Spotify.`))),n.addListener(`initialization_error`,(()=>void C(`Spotify's player does not work in this browser.`))),n.addListener(`playback_error`,(()=>void C(`Spotify could not play that.`)))}!await i.connect()&&o===s&&C(`Spotify's player could not connect.`)}catch{o===s&&C(`Spotify's player could not connect.`)}})(),r}return S}var qN=e=>{let t=zu(e);return t?t.source===`local`?`/api/music/track/${t.id}`:t.source===`soundcloud`||t.source===`audius`?`/api/music/stream/${e}`:e:`/api/music/track/${e}`},JN=(e,t)=>od(e,t),YN=`friend.music`,XN=1e3,ZN=1.5,QN=()=>{try{return JSON.parse(localStorage.getItem(YN)??`{}`)}catch{return{}}},$N=e=>{try{localStorage.setItem(YN,JSON.stringify({volume:e.volume,muted:e.muted,shuffle:e.shuffle,repeat:e.repeat,view:e.view}))}catch{}};function eP({music:e,cmd:t,send:n,connection:r,createAudio:i,createSpotify:a,remote:o=!1}){let[s,c]=(0,l.useReducer)(JN,void 0,()=>{let e=QN();return nd({volume:e.volume??70,shuffle:e.shuffle??!1,repeat:e.repeat??`all`,view:e.view??`mini`})}),[u,d]=(0,l.useState)(!1),[f,p]=(0,l.useState)(null),[m,h]=(0,l.useState)(null),g=(0,l.useRef)(null),_=(0,l.useRef)(!1),v=(0,l.useRef)(s);v.current=s;let y=(0,l.useRef)(!1),b=(0,l.useRef)(null),x=(0,l.useRef)(0),S=(0,l.useRef)(!1);(0,l.useEffect)(()=>{if(!e||S.current)return;S.current=!0;let t=QN();c({type:`volume`,level:t.volume??e.volume}),c({type:`repeat`,mode:t.repeat??e.repeat}),(t.shuffle??e.shuffle)&&c({type:`shuffle`,on:!0}),c({type:`view`,view:t.view??e.startView}),t.muted&&c({type:`mute`,on:!0})},[e]);let C=()=>{if(!g.current){let e=new VN(i?i():new Audio,a??(()=>KN({getToken:WN})));e.preload=`auto`,g.current=e}return g.current},w=(0,l.useRef)(!1),T=(0,l.useCallback)(()=>{let e=g.current;if(e&&e.src){w.current=!0;try{let t=e.play();t&&typeof t.then==`function`?t.then(()=>{w.current=!1,d(!1)},()=>{w.current=!1;let e=g.current?.error??null;e?p(e):d(!0)}):(w.current=!1,d(!1))}catch{w.current=!1,d(!0)}E.current||O()}},[]),E=(0,l.useRef)(!1),D=(0,l.useRef)(null),O=()=>{let e=g.current,t=e instanceof VN?e.element:e,n=typeof window<`u`?window.AudioContext??window.webkitAudioContext:void 0;if(t&&n&&typeof t.play==`function`)try{let e=new n;D.current=e;let r=e.createMediaElementSource(t),i=e.createAnalyser();i.fftSize=256,i.smoothingTimeConstant=.82,r.connect(i),i.connect(e.destination),E.current=!0,h(i)}catch{E.current=!0}};(0,l.useEffect)(()=>{if(o)return;let e=C(),t=0,n=()=>{let n=Date.now();n-t<250||(t=n,c({type:`time`,position:e.currentTime||0,duration:Number.isFinite(e.duration)?e.duration:0}))},r=()=>c({type:`time`,position:e.currentTime||0,duration:Number.isFinite(e.duration)?e.duration:0}),i=()=>c({type:`ended`}),a=()=>{let t=e.error??null;p(t),c(t?{type:`pause`}:{type:`failed`})};return e.addEventListener(`timeupdate`,n),e.addEventListener(`loadedmetadata`,r),e.addEventListener(`durationchange`,r),e.addEventListener(`ended`,i),e.addEventListener(`error`,a),()=>{e.removeEventListener(`timeupdate`,n),e.removeEventListener(`loadedmetadata`,r),e.removeEventListener(`durationchange`,r),e.removeEventListener(`ended`,i),e.removeEventListener(`error`,a),e.pause(),D.current?.close().catch(()=>{}),D.current=null,e.dispose(),b.current=null,g.current=null,E.current=!1,h(null)}},[o]),(0,l.useEffect)(()=>{o&&c({type:`stop`})},[o]);let k=s.index>=0?s.queue[s.index]??null:null;(0,l.useEffect)(()=>{let e=g.current;if(o||!e)return;let t=k?.id??null;if(t!==b.current){if(b.current=t,!t){e.pause(),e.src=``;return}p(null),e.src=qN(t),s.playing&&T()}},[k?.id,s.playing,T,o]),(0,l.useEffect)(()=>{let e=g.current;!o&&e&&e.src&&(s.playing&&e.paused&&!_.current&&!w.current?T():!s.playing&&!e.paused&&e.pause())},[s.playing,s.position,T,o]),(0,l.useEffect)(()=>{let e=g.current;e&&(e.volume=s.volume/100*dD.level,e.muted=s.muted)},[s.volume,s.muted]),(0,l.useEffect)(()=>dD.subscribe(e=>{let t=g.current;t&&(t.volume=v.current.volume/100*e)}),[]),(0,l.useEffect)(()=>{let e=g.current;e&&e.src&&Math.abs((e.currentTime||0)-s.position)>ZN&&(e.currentTime=s.position)},[s.position]),(0,l.useEffect)(()=>$N(s),[s.volume,s.muted,s.shuffle,s.repeat,s.view]),(0,l.useEffect)(()=>{if(!t||t.n===x.current)return;x.current=t.n;let e=sd(t.command);e&&c(e)},[t]),(0,l.useEffect)(()=>{let e=()=>{y.current=!0,_.current&&T()};return window.addEventListener(`pointerdown`,e,{passive:!0}),window.addEventListener(`keydown`,e),()=>{window.removeEventListener(`pointerdown`,e),window.removeEventListener(`keydown`,e)}},[T]),_.current=u;let A=(0,l.useRef)(0);return(0,l.useEffect)(()=>{if(r!==`open`||o)return;let e=()=>{let e=v.current,t=e.index>=0?e.queue[e.index]:void 0;A.current=Date.now(),n({type:`music.state`,state:{playing:e.playing,trackId:t?.id??null,title:t?.title??``,artist:t?.artist??``,album:t?.album??``,position:e.position,duration:e.duration,volume:e.volume,muted:e.muted,shuffle:e.shuffle,repeat:e.repeat,view:e.view,queue:e.queue.slice(0,50).map(e=>({id:e.id,title:e.title.slice(0,200)})),index:e.index,active:(typeof document>`u`||document.visibilityState===`visible`)&&y.current}})};e();let t=setInterval(()=>s.playing&&Date.now()-A.current>=XN&&e(),XN);return()=>clearInterval(t)},[r,o,k?.id,s.playing,s.volume,s.muted,s.shuffle,s.repeat,s.view,s.queue.length,s.index]),(0,l.useEffect)(()=>{let e=typeof navigator<`u`?navigator.mediaSession:void 0;if(e&&!o)try{k&&typeof MediaMetadata<`u`&&(e.metadata=new MediaMetadata({title:k.title,artist:k.artist,album:k.album,artwork:[{src:`/api/music/cover/${k.id}`}]})),e.playbackState=s.playing?`playing`:k?`paused`:`none`,e.setActionHandler(`play`,()=>c({type:`resume`})),e.setActionHandler(`pause`,()=>c({type:`pause`})),e.setActionHandler(`previoustrack`,()=>c({type:`previous`})),e.setActionHandler(`nexttrack`,()=>c({type:`next`})),e.setActionHandler(`seekto`,e=>typeof e.seekTime==`number`&&c({type:`seek`,seconds:e.seekTime}))}catch{}},[k?.id,s.playing,o]),{remote:!1,state:s,dispatch:c,current:k,blocked:u,notice:f,analyser:m,unlock:T,audio:g}}function tP(e,t){if(!e)return{state:{queue:[],index:-1,playing:!1,position:0,duration:0,volume:70,muted:!1,shuffle:!1,repeat:`all`,view:t},current:null};let n=e.queue.map((t,n)=>n===e.index?{id:t.id,title:e.title||t.title,artist:e.artist,album:e.album,durationSec:e.duration>0?e.duration:null}:{id:t.id,title:t.title,artist:``,album:``,durationSec:null});return{state:{queue:n,index:e.index,playing:e.playing,position:e.position,duration:e.duration,volume:e.volume,muted:e.muted,shuffle:e.shuffle,repeat:e.repeat,view:t},current:e.index>=0?n[e.index]??null:null}}function nP({local:e,host:t,send:n}){let r=e.state.view,{state:i,current:a}=(0,l.useMemo)(()=>tP(t,r),[t,r]),o=e.dispatch,s=(0,l.useCallback)(e=>{if(e.type===`view`)return o(e);let t=cd(e);t&&n({type:`music.remote`,command:t})},[o,n]);return(0,l.useMemo)(()=>({...e,remote:!0,state:i,dispatch:s,current:a,blocked:!1,notice:null,analyser:null,unlock:()=>{}}),[e,i,s,a])}function rP(e){let t=new URLSearchParams(e).get(`music`);return t===`connected`?{level:`info`,text:`Spotify is connected. Ask Friend to play something.`}:t===`failed`?{level:`warn`,text:`Spotify did not connect. Open Plugins, Spotify and press Connect again.`}:null}function iP({onSignedOut:e}){let{state:t,send:n,dispatch:r,voice:i,handsFree:a,useHere:o}=$A(e);fj(i),pj(i),yj(n,t.connection);let[s,c]=(0,l.useState)(xe),u=(0,l.useCallback)(e=>{Se(e),c(e)},[]),[d,f]=(0,l.useState)(we),m=(0,l.useCallback)(e=>{Te(e),f(e)},[]);(0,l.useEffect)(()=>i.setQuiet(d),[i,d]);let[h,g]=(0,l.useState)(!1),[_,v]=(0,l.useState)(!1),[y,b]=(0,l.useState)(!1),[x,S]=(0,l.useState)(void 0),[C,w]=(0,l.useState)(null),[T,E]=(0,l.useState)(ye),D=e=>{W(e),E(e)},O=T===`orb`?Ye:Ee,[k,A]=(0,l.useState)(!1),[j,ee]=(0,l.useState)(0),[M,P]=(0,l.useState)(null),F=de(t.view),te=t.music?.output===`host`,ne=eP({music:t.music,cmd:t.musicCmd,send:n,connection:t.connection,remote:te}),re=nP({local:ne,host:t.hostMusic,send:n}),ae=te?re:ne,R=t.hud?.animations??`full`,oe=e=>{let{type:i,value:a}=e.action;if(i===`url`)window.open(a,`_blank`,`noopener,noreferrer`);else if(i===`prompt`)n({type:`chat.send`,text:a});else if(i===`music`||i===`panel`&&a===`music`){if(!t.music?.folderSet){r({type:`alert.add`,level:`info`,text:`No music folder is chosen yet. Pick one in Settings, Widgets, and the player opens.`}),w(`widgets`);return}if(i===`panel`){F.toggle(`music`,!0),ae.state.view===`hidden`&&ae.dispatch({type:`view`,view:`mini`});return}let e=sd({action:a});e&&ae.dispatch(e)}else a===`plugins`?b(!0):a===`settings`?w(`model`):(a===`chat`||a===`tasks`)&&F.toggle(a,!0)},se=t.viewKnown&&t.hud?.layout===`orbital`,ce=iN(void 0,se),le=Mj(),ue=cC(le.w,le.h)===`orbit`,z=(0,l.useMemo)(()=>{let e=s?{...t,objects:[],captions:``}:t;return se&&ue?{...e,look:{...e.look,size:e.look.size*QS}}:e},[s,t,se,ue]),B=(0,l.useRef)(!1);(0,l.useEffect)(()=>{B.current||!t.voice.available||t.voice.enrolled||(B.current=!0,r({type:`alert.add`,level:`info`,text:`Voice recognition is not set up. Press Esc, then Enroll my voice.`}))},[t.voice.available,t.voice.enrolled,r]);let fe=L(),pe=(0,l.useRef)(!1);(0,l.useEffect)(()=>{if(!fe||pe.current||t.connection!==`open`)return;pe.current=!0;let e=!1;try{e=localStorage.getItem(`friend.touchHint`)===`1`,localStorage.setItem(`friend.touchHint`,`1`)}catch{}e||r({type:`alert.add`,level:`info`,text:`Hold the round mic button to talk, or tap it once to start and again to send. The keyboard button types; the menu button opens settings.`})},[fe,t.connection,r]);let me=t.uiOpen?.n??0,H=t.uiOpen?.integration;(0,l.useEffect)(()=>{me!==0&&(S(H),b(!0))},[me,H]);let ge=(0,l.useRef)(!1);(0,l.useEffect)(()=>{if(ge.current)return;ge.current=!0;let e=rP(window.location.search);e&&(r({type:`alert.add`,level:e.level,text:e.text}),window.history.replaceState(null,``,window.location.pathname))},[r]);let ve=(0,l.useRef)(!1);(0,l.useEffect)(()=>{ve.current||t.connection!==`open`||(ve.current=!0,fetch(`/api/history`).then(e=>e.ok?e.json():[]).then(e=>r({type:`chat.seed`,lines:e})).catch(()=>{}))},[t.connection,r]),(0,l.useEffect)(()=>{t.connection===`open`&&n({type:`ui.panels`,open:[...F.show.chat?[`chat`]:[],...F.show.tasks?[`tasks`]:[]]})},[t.connection,F.show.chat,F.show.tasks,n]);let U=(0,l.useRef)(!1);(0,l.useEffect)(()=>{t.viewKnown&&t.view===`minimal`&&!U.current&&(U.current=!0,r({type:`alert.add`,level:`info`,text:`The view is Minimal, so the status line and clock are hidden. Press Esc, then View, to bring them back.`}))},[t.viewKnown,t.view,r]);let be=e=>{pd.save({view:e}).catch(e=>r({type:`alert.add`,level:`warn`,text:e.message}))},Ce=(0,l.useMemo)(()=>I({notify:e=>r({type:`alert.add`,level:`info`,text:e}),openSettings:()=>w(`model`),openLook:()=>w(`look`),openConnectors:()=>A(!0),openPlugins:()=>b(!0),openVoice:t.voice.available?()=>g(!0):null,muted:s,setMuted:u,quiet:d,setQuiet:m,cameraOn:t.camera.enabled,setCamera:e=>r({type:`camera.enable`,value:e}),clearScreen:()=>{for(let e of t.objects)n({type:`stage.event`,objectId:e.id,event:`dismiss`})},statusLine:()=>ct({connection:t.connection,deviceOnline:t.deviceOnline,approval:t.approval,voiceMode:t.voice.mode,busy:t.busy,activity:t.activity}).text,endSession:t=>{fetch(t===`lock`?`/api/lock`:`/api/logout`,{method:`POST`,headers:{"content-type":`application/json`},body:`{}`}).catch(()=>{}).finally(e)},panelOn:e=>F.show[e],setPanel:(e,t)=>F.toggle(e,t),view:t.view,setView:be,openHelp:P,resetLayout:()=>{V(),window.location.reload()}}),[r,n,s,e,F.show,F.toggle,t.view,t.voice.available,t.voice.mode,t.camera.enabled,t.objects,t.connection,t.deviceOnline,t.approval,t.busy,t.activity]);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(_O,{state:z,send:n,dispatch:r,voice:i,slash:Ce,onMenu:()=>ee(e=>e+1),hudLayer:se&&t.hud?(0,p.jsx)(jj,{children:(0,p.jsx)(eN,{hud:t.hud,state:t,usage:ce.share===null?null:ce.share*100,send:n,onHire:()=>w(`office`),onLaunch:oe,onExpand:()=>{}})}):null}),(0,p.jsxs)(dt,{approval:t.approval,challenge:t.challenge,cameraStream:t.camera.stream,alerts:t.alerts,connection:t.connection,deviceOnline:t.deviceOnline,voiceMode:t.voice.mode,busy:t.busy,activity:t.activity,showStatus:t.viewKnown&&F.show.status&&!se,showClock:t.viewKnown&&F.show.clock&&!se,profile:t.viewKnown&&F.show.profile&&!se?{ownerName:t.ownerName,speaker:t.speaker}:null,assistantName:t.assistantName,hud:t.hud,hudApproval:se,send:n,dispatch:r,children:[t.viewKnown&&F.show.chat&&(0,p.jsx)(he,{lines:t.chat,live:t.chatLive,onSend:e=>n({type:`chat.send`,text:e}),onClose:()=>F.toggle(`chat`,!1)}),t.viewKnown&&F.show.tasks&&(0,p.jsx)(_e,{busy:t.busy,onClose:()=>F.toggle(`tasks`,!1)}),t.viewKnown&&F.show.launcher&&t.hud&&!se&&(0,p.jsx)(Aj,{items:t.hud.launcher,animations:R,onAction:oe}),t.viewKnown&&F.show.music&&(0,p.jsx)(zN,{player:ae,music:t.music,animations:R}),h&&(0,p.jsx)(oj,{onClose:()=>g(!1)}),_&&(0,p.jsx)(wj,{onClose:()=>v(!1)}),y&&(0,p.jsx)(_f,{variant:T===`orb`?`holo`:`classic`,...x?{initialConfigure:x}:{},onClose:()=>{b(!1),S(void 0)}}),C&&(0,p.jsx)(JS,{initialTab:C,variant:T===`orb`?`holo`:`classic`,onClose:()=>w(null)}),k&&(0,p.jsx)(N,{variant:T===`orb`?`holo`:`classic`,onClose:()=>A(!1)}),M&&(0,p.jsx)(ie,{commands:M,onClose:()=>P(null)})]}),(0,p.jsx)(O,{voiceMode:t.voice.mode,busy:t.busy,onClassic:()=>D(`classic`),onOrb:()=>D(`orb`),muted:s,onToggleMute:()=>u(!s),quiet:d,onToggleQuiet:()=>m(!d),onSignedOut:e,voiceAvailable:t.voice.available,voiceEnrolled:t.voice.enrolled,onEnroll:()=>g(!0),onHousehold:()=>v(!0),handsFreeOn:a.on,onToggleHandsFree:a.supported?a.toggle:void 0,assistantName:t.assistantName,onPlugins:()=>b(!0),onSettings:e=>w(e??`model`),onConnectors:()=>A(!0),cameraOn:t.camera.enabled,onToggleCamera:()=>r({type:`camera.enable`,value:!t.camera.enabled}),chatOn:F.show.chat,onToggleChat:()=>F.toggle(`chat`),tasksOn:F.show.tasks,onToggleTasks:()=>F.toggle(`tasks`),musicOn:F.show.music,onToggleMusic:()=>F.toggle(`music`),launcherOn:F.show.launcher,onToggleLauncher:()=>F.toggle(`launcher`),view:t.view,onView:be,openRequest:j}),t.connection===`elsewhere`&&(0,p.jsx)(mj,{onUseHere:o})]})}function aP(){let[e,t]=(0,l.useState)(`loading`);return(0,l.useEffect)(()=>{let e=!0,n=n=>e&&t(n);return(async()=>{try{if(!(await(await fetch(`/api/state`)).json()).hasOwner)return n(`setup`);let e=await(await fetch(`/api/session`,{cache:`no-store`})).json();n(e.signedIn===!0?`stage`:`login`)}catch{n(`login`)}})(),()=>{e=!1}},[]),e===`loading`?(0,p.jsx)(`div`,{className:`boot`,"aria-busy":`true`}):e===`setup`?(0,p.jsx)(g,{onDone:()=>t(`login`)}):e===`login`?(0,p.jsx)(h,{onLoggedIn:()=>t(`stage`)}):(0,p.jsx)(iP,{onSignedOut:()=>t(`login`)})}(0,u.createRoot)(document.getElementById(`root`)).render((0,p.jsx)(l.StrictMode,{children:(0,p.jsx)(aP,{})}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.orb-layer,.holo-layer{--orb-cyan:#35f0ff;--orb-cyan-soft:#35f0ff2e;--orb-teal:#1296a561;--orb-teal-edge:#35f0ff73;--orb-teal-hover:#35f0ff9e;--orb-orange:#ff9a2e;--orb-grey:#8b98a3;--orb-ink:#e9fdff;--orb-text:#9fe9f2;--orb-danger:#ff5a6e;--orb-glass:#06121cd1;--orb-tint:#3c0a5a8c;--orb-font:Orbitron, Rajdhani, "Segoe UI", system-ui, sans-serif;--orb-open-ms:.25s;font-family:var(--orb-font);grid-template-rows:minmax(0,1fr);place-items:center;display:grid;inset:0}.orb-backdrop{background:radial-gradient(circle at 50% 50%, var(--orb-tint), #05020ee0);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);animation:.2s ease-out orb-fade;position:absolute;inset:0}.orb-svg{pointer-events:none;width:min(94vmin,680px);height:min(94vmin,680px);position:relative;overflow:visible}.orb-svg .orb-arc:focus-visible,.orb-svg .orb-core:focus-visible{outline:none}.orb-arc,.orb-core{pointer-events:auto;cursor:pointer;outline:none}.orb-arc{color:#bff9ff;transform-origin:0 0;animation:orb-arc-in var(--orb-open-ms) ease-out both}.orb-arc path{fill:var(--orb-teal);stroke:var(--orb-teal-edge);stroke-width:1px;transition:fill .16s ease-out,filter .16s ease-out}.orb-arc:hover path,.orb-arc.is-hover path,.orb-arc:focus-visible path{fill:var(--orb-teal-hover);filter:drop-shadow(0 0 8px var(--orb-cyan))}.orb-arc.is-open path,.orb-sub.is-on path{fill:#35f0ff80;stroke:var(--orb-cyan)}.orb-sub.is-danger path{fill:#ff5a6e42;stroke:#ff5a6eb3}.orb-sub.is-danger:hover path,.orb-sub.is-danger.is-hover path,.orb-sub.is-danger:focus-visible path{fill:#ff5a6e8c;filter:drop-shadow(0 0 8px var(--orb-danger))}.orb-arc-label{letter-spacing:.16em;text-transform:uppercase;fill:var(--orb-text);pointer-events:none;font-size:9px;font-weight:600}.orb-sub.is-on .orb-arc-label{fill:#fff}.orb-halo{fill:none;stroke:var(--orb-cyan-soft);stroke-width:7px;filter:blur(3px);animation:3.2s ease-in-out infinite alternate orb-pulse}.orb-disc{stroke:#35f0ff59;stroke-width:1px}.orb-ring{fill:none;stroke:var(--orb-cyan);stroke-width:2.5px;filter:drop-shadow(0 0 5px var(--orb-cyan));transition:filter .2s ease-out}.orb-ticks{fill:none;stroke:#35f0ff99;stroke-width:5px;stroke-dasharray:1.1 3.014}.orb-gauge{fill:none;stroke:var(--orb-orange);stroke-width:3.5px;stroke-linecap:round;filter:drop-shadow(0 0 3px var(--orb-orange))}.orb-segments{fill:none;stroke:var(--orb-grey);stroke-width:3px;stroke-dasharray:9 3.5;opacity:.8}.orb-name{letter-spacing:.28em;fill:var(--orb-ink);filter:drop-shadow(0 0 4px var(--orb-cyan));pointer-events:none;font-weight:700}.orb-caption{letter-spacing:.3em;fill:var(--orb-cyan);pointer-events:none;font-size:6.5px;font-weight:600}.orb-core:hover .orb-ring,.orb-core:focus-visible .orb-ring,.orb-hover .orb-ring{filter:drop-shadow(0 0 11px var(--orb-cyan))}.orb-busy .orb-gauge{transform-origin:0 0;animation:2.4s linear infinite orb-spin}@keyframes orb-fade{0%{opacity:0}}@keyframes orb-arc-in{0%{opacity:0;transform:scale(.72)}}@keyframes orb-pulse{0%{opacity:.45}to{opacity:1}}@keyframes orb-spin{to{transform:rotate(360deg)}}.holo-layer{z-index:1000;pointer-events:none;padding:12px;position:fixed}.holo-panel{pointer-events:auto;width:min(1040px,100%);min-height:0;max-height:100%;color:var(--orb-text);background:linear-gradient(180deg, #081824e6, var(--orb-glass));border:1px solid var(--orb-teal-edge);clip-path:polygon(14px 0,calc(100% - 14px) 0,100% 14px,100% calc(100% - 14px),calc(100% - 14px) 100%,14px 100%,0 calc(100% - 14px),0 14px);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);grid-template-rows:auto minmax(0,1fr) auto;gap:10px;padding:18px 64px 16px;animation:.3s ease-out holo-in;display:grid;position:relative}.holo-panel:before,.holo-panel:after{content:"";background:linear-gradient(180deg, transparent, var(--orb-cyan), transparent);width:5px;box-shadow:0 0 14px var(--orb-cyan);position:absolute;top:12%;bottom:12%}.holo-panel:before{left:14px}.holo-panel:after{right:14px}.holo-head{justify-content:center;align-items:center;gap:14px;display:flex}.holo-title{letter-spacing:.32em;text-transform:uppercase;color:var(--orb-ink);text-shadow:0 0 8px var(--orb-cyan);margin:0;font-size:15px;font-weight:600}.holo-dots{gap:6px;display:flex}.holo-dots i{background:#35f0ff40;width:18px;height:3px}.holo-dots i.on{background:var(--orb-cyan);box-shadow:0 0 8px var(--orb-cyan)}.holo-page{width:52px;height:140px;color:var(--orb-cyan);cursor:pointer;background:0 0;border:0;padding:0;position:absolute;top:50%;translate:0 -50%}.holo-page:before{content:"";background:var(--orb-cyan);opacity:.45;transition:opacity .16s,filter .16s;position:absolute;inset:10px 8px}.holo-prev:before{clip-path:polygon(100% 0,0 50%,100% 100%,100% 82%,36% 50%,100% 18%)}.holo-next:before{clip-path:polygon(0 0,100% 50%,0 100%,0 82%,64% 50%,0 18%)}.holo-page:hover:before,.holo-page:focus-visible:before{opacity:1;filter:drop-shadow(0 0 8px var(--orb-cyan))}.holo-page:focus-visible{outline:none}.holo-prev{left:18px}.holo-next{right:18px}.holo-prev span,.holo-next span{font-size:0;position:absolute;inset:0}.holo-body{min-height:0;padding:4px 6px;overflow-y:auto}.holo-foot{border:1px solid var(--orb-teal-edge);background:#35f0ff0d;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:14px;padding:10px 12px;display:grid}.holo-help{letter-spacing:.04em;color:var(--orb-text);opacity:.85;margin:0;font-size:11px;line-height:1.5}.holo-help b{color:var(--orb-orange);font-weight:600}.holo-actions{flex-wrap:wrap;justify-content:flex-end;gap:10px;display:flex}.holo-btn{min-width:112px;font:600 12px var(--orb-font);letter-spacing:.3em;text-transform:uppercase;color:var(--orb-ink);border:1px solid var(--orb-teal-edge);clip-path:polygon(10px 0,100% 0,calc(100% - 10px) 100%,0 100%);cursor:pointer;background:#35f0ff1f;padding:10px 18px;transition:background .16s,box-shadow .16s}.holo-btn:hover:not(:disabled),.holo-btn:focus-visible{box-shadow:0 0 12px var(--orb-cyan);background:#35f0ff4d;outline:none}.holo-btn:disabled{opacity:.35;cursor:default}.holo-btn.quiet{letter-spacing:.18em;background:0 0;min-width:0}.holo-btn.warn{border-color:var(--orb-orange);color:var(--orb-orange)}.holo-tabs{gap:8px;margin-bottom:12px;display:flex}.holo-tab{font:600 12px var(--orb-font);letter-spacing:.24em;text-transform:uppercase;color:var(--orb-text);border:1px solid var(--orb-teal-edge);clip-path:polygon(8px 0,100% 0,calc(100% - 8px) 100%,0 100%);cursor:pointer;background:0 0;padding:8px 18px;transition:background .16s,box-shadow .16s}.holo-tab small{color:var(--orb-cyan);margin-left:6px}.holo-tab:hover,.holo-tab:focus-visible{background:#35f0ff24;outline:none}.holo-tab.on{color:var(--orb-ink);background:#35f0ff42;box-shadow:0 0 12px #35f0ff80}.holo-cards{grid-template-columns:repeat(2,minmax(0,1fr));align-content:start;gap:12px;min-height:min(432px,55vh);margin:0;padding:0;list-style:none;display:grid}.holo-card{border:1px solid var(--orb-teal-edge);clip-path:polygon(10px 0,100% 0,100% calc(100% - 10px),calc(100% - 10px) 100%,0 100%,0 10px);background:#35f0ff0d;grid-template-rows:auto 1fr auto;gap:8px;min-height:132px;padding:12px 14px;transition:background .16s;display:grid}.holo-card:hover{background:#35f0ff1a}.holo-card-head{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.holo-card-head strong{letter-spacing:.1em;text-transform:uppercase;color:var(--orb-ink);font-size:13px}.holo-card-head small,.holo-version{color:var(--orb-text);opacity:.75}.holo-card-note{overflow-wrap:anywhere;font-size:12px;line-height:1.5}.holo-card-actions{flex-wrap:wrap;gap:8px;display:flex}.holo-badge{letter-spacing:.18em;text-transform:uppercase;white-space:nowrap;border:1px solid;padding:2px 8px;font-size:10px}.holo-badge.on{color:var(--orb-cyan);box-shadow:0 0 8px #35f0ff66}.holo-badge.off{color:var(--orb-grey)}.holo-badge.warn{color:var(--orb-orange)}.holo-badge.error{color:var(--orb-danger)}.holo-btn.sm{letter-spacing:.2em;min-width:0;padding:7px 12px;font-size:10px}.holo-btn.go{background:#35f0ff42}.holo-btn.warn{background:0 0}@media (width<=720px){.holo-cards{grid-template-columns:1fr}}.holo-body .settings-field span{letter-spacing:.08em;text-transform:uppercase;color:var(--orb-text);font-size:11px}.holo-body input:not([type=checkbox]):not([type=range]),.holo-body select,.holo-body textarea{color:var(--orb-ink);border:1px solid var(--orb-teal-edge);background:#020a10b3;border-radius:0}.holo-body input:focus,.holo-body select:focus,.holo-body textarea:focus{border-color:var(--orb-cyan);outline:none;box-shadow:0 0 8px #35f0ff80}.holo-body .plugins-heading{letter-spacing:.24em;text-transform:uppercase;color:var(--orb-cyan)}.holo-body .approval-actions{flex-wrap:wrap;gap:10px;margin-top:12px;display:flex}.holo-body .approval-actions button{min-width:112px;font:600 12px var(--orb-font);letter-spacing:.24em;text-transform:uppercase;color:var(--orb-ink);border:1px solid var(--orb-teal-edge);clip-path:polygon(10px 0,100% 0,calc(100% - 10px) 100%,0 100%);cursor:pointer;background:#35f0ff1a;border-radius:0;padding:9px 18px}.holo-body .approval-actions button.primary{background:#35f0ff47}.holo-body .approval-actions button.danger{color:var(--orb-orange);border-color:var(--orb-orange);background:0 0}.holo-body .approval-actions button:hover:not(:disabled),.holo-body .approval-actions button:focus-visible{box-shadow:0 0 12px var(--orb-cyan);background:#35f0ff5c;outline:none}.holo-body .approval-actions button:disabled{opacity:.35;cursor:default}.holo-body .auth-note,.holo-body .connector-steps{color:var(--orb-text)}.holo-body .auth-error{color:var(--orb-danger)}.holo-body .connector-warning{color:var(--orb-orange)}.holo-body .connector-form{max-width:640px;margin:0 auto}@keyframes holo-in{0%{opacity:0;transform:scale(.96)}}@media (width<=720px){.holo-panel{padding:14px 14px 12px}.holo-page{width:52px;height:44px;top:10px;translate:none}.holo-page:before{inset:8px 12px}.holo-prev{left:4px}.holo-next{right:4px}.holo-foot{grid-template-columns:1fr}}@media (prefers-reduced-motion:reduce){.orb-backdrop,.orb-arc,.orb-halo,.orb-busy .orb-gauge,.holo-panel{animation:none}.orb-arc path,.orb-ring,.holo-btn,.holo-page{transition:none}}.of-tab{--of-c:#3fd8ff;--of-o:#fb923c;--of-g:#34d399;flex-direction:column;gap:14px;font-family:ui-monospace,Cascadia Code,Consolas,monospace;display:flex}.of-code{letter-spacing:.22em;color:color-mix(in srgb, var(--of-c) 70%, transparent);font-size:10px}.of-note{color:#e0fbffb8;margin:4px 0 0;font-size:12px;line-height:1.5}.of-hero,.of-card{border:1px solid color-mix(in srgb, var(--of-c) 38%, transparent);clip-path:polygon(0 0,calc(100% - 18px) 0,100% 18px,100% 100%,18px 100%,0 calc(100% - 18px));background:linear-gradient(160deg,#081e2ac7,#040e16c7);position:relative;box-shadow:inset 0 0 30px #3fd8ff0f}.of-hero{grid-template-columns:1fr auto;align-items:center;gap:16px;padding:14px 22px 14px 16px;display:grid}.of-hero h3{letter-spacing:.2em;text-transform:uppercase;color:#e0fbff;text-shadow:0 0 12px color-mix(in srgb, var(--of-c) 60%, transparent);margin:2px 0 0;font-size:18px}.of-tab[data-on=true] .of-hero{border-color:color-mix(in srgb, var(--of-g) 60%, transparent)}.of-switch{cursor:pointer;grid-template-columns:auto auto;grid-template-areas:"track state""text text";place-items:center start;gap:4px 10px;display:grid}.of-switch input{opacity:0;width:1px;height:1px;position:absolute}.of-track{border:1px solid var(--of-c);clip-path:polygon(6px 0,100% 0,calc(100% - 6px) 100%,0 100%);background:#00141ecc;grid-area:track;width:52px;height:24px;display:block;position:relative}.of-track i{background:var(--of-c);opacity:.55;clip-path:polygon(4px 0,100% 0,calc(100% - 4px) 100%,0 100%);width:20px;height:16px;transition:left .2s,background .2s,opacity .2s;position:absolute;top:3px;left:4px}.of-switch input:checked+.of-track i{background:var(--of-g);opacity:1;box-shadow:0 0 10px var(--of-g);left:26px}.of-switch input:focus-visible+.of-track{outline:2px solid var(--of-c);outline-offset:2px}.of-state{letter-spacing:.2em;color:var(--of-o);grid-area:state;font-size:11px}.of-tab[data-on=true] .of-state{color:var(--of-g)}.of-switch-text{color:#e0fbff;grid-area:text;font-size:12px}.of-card{padding:0 0 14px}.of-card-head{background:linear-gradient(90deg, color-mix(in srgb, var(--of-c) 22%, transparent), transparent 70%);border-bottom:1px solid color-mix(in srgb, var(--of-c) 35%, transparent);align-items:baseline;gap:12px;padding:8px 18px 8px 14px;display:flex}.of-card-head h4{letter-spacing:.24em;text-transform:uppercase;color:var(--of-c);margin:0;font-size:13px;font-weight:600}.of-card>.of-note{margin-top:8px;padding:0 18px 0 14px}.of-card-body{flex-direction:column;gap:10px;padding:10px 18px 0 14px;display:flex}.of-grid{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px 14px;display:grid}.of-field{flex-direction:column;gap:4px;min-width:0;display:flex}.of-label{letter-spacing:.16em;text-transform:uppercase;color:color-mix(in srgb, var(--of-c) 80%, transparent);font-size:10px}.of-hint{color:#e0fbff8c;font-size:11px;line-height:1.4}.of-field input:not([type=checkbox]),.of-field select,.of-field textarea{box-sizing:border-box;color:#e0fbff;border:1px solid color-mix(in srgb, var(--of-c) 30%, transparent);border-left:3px solid var(--of-c);width:100%;font:inherit;background:#00121cb3;border-radius:0;padding:6px 9px;font-size:13px}.of-field textarea{resize:vertical;line-height:1.45}.of-field input:focus-visible,.of-field select:focus-visible,.of-field textarea:focus-visible{border-color:var(--of-c);box-shadow:0 0 12px color-mix(in srgb, var(--of-c) 45%, transparent);outline:none}.of-item{border:1px solid color-mix(in srgb, var(--of-c) 28%, transparent);background:#030e168c;flex-direction:column;gap:10px;margin:0;padding:12px 14px;display:flex;position:relative}.of-item:before,.of-item:after{content:"";border:2px solid var(--of-c);pointer-events:none;width:10px;height:10px;position:absolute}.of-item:before{border-bottom:0;border-right:0;top:-1px;left:-1px}.of-item:after{border-top:0;border-left:0;bottom:-1px;right:-1px}.of-item legend{letter-spacing:.1em;color:#e0fbff;padding:0 8px;font-size:12px}.of-add,.of-remove{font:inherit;letter-spacing:.18em;text-transform:uppercase;cursor:pointer;background:0 0;align-self:flex-start;padding:7px 14px;font-size:11px}.of-add{color:var(--of-c);border:1px dashed var(--of-c)}.of-add:hover,.of-add:focus-visible{background:color-mix(in srgb, var(--of-c) 14%, transparent);box-shadow:0 0 12px color-mix(in srgb, var(--of-c) 40%, transparent);outline:none}.of-remove{color:var(--of-o);border:1px solid color-mix(in srgb, var(--of-o) 55%, transparent)}.of-remove:hover,.of-remove:focus-visible{background:color-mix(in srgb, var(--of-o) 16%, transparent);outline:none}.of-problem{color:#ffd9b8;border-left:3px solid var(--of-o);background:color-mix(in srgb, var(--of-o) 12%, transparent);margin:0;padding:5px 9px;font-size:12px}@media (width<=560px){.of-hero{grid-template-columns:1fr}}.orbital{--ob-cyan:var(--accent,#22d3ee);--ob-green:#34d399;--ob-orange:#fb923c;--ob-dark:#031018;--ob-line:color-mix(in srgb, var(--ob-cyan) 55%, transparent);--ob-dim:color-mix(in srgb, var(--ob-cyan) 28%, transparent);z-index:5;pointer-events:none;color:#a5f3fc;font-family:Consolas,Courier New,monospace;position:absolute;inset:0}.orbital [data-tone=cyan]{--ob-tone:var(--ob-cyan)}.orbital [data-tone=green]{--ob-tone:var(--ob-green)}.orbital [data-tone=orange]{--ob-tone:var(--ob-orange)}.orbital .ob-hit{pointer-events:auto}.ob-frame{--cut:10px;background:color-mix(in srgb, var(--ob-tone,var(--ob-cyan)) 60%, transparent);clip-path:polygon(0 0, calc(100% - var(--cut)) 0, 100% var(--cut), 100% 100%, var(--cut) 100%, 0 calc(100% - var(--cut)));min-height:0;position:relative}.ob-frame:before{content:"";background:linear-gradient(color-mix(in srgb, var(--ob-dark) 94%, transparent), color-mix(in srgb, var(--ob-dark) 90%, transparent));clip-path:inherit;position:absolute;inset:1px}.ob-frame>*{position:relative}.ob-frame[data-running]:after{content:"";background:linear-gradient(100deg, transparent 0 40%, var(--ob-tone,var(--ob-cyan)) 50%, transparent 60% 100%) 0 0 / 300% 100%;clip-path:inherit;mix-blend-mode:screen;opacity:.9;animation:5s linear infinite ob-run;position:absolute;inset:0}.ob-frame[data-running]:before{z-index:1}.ob-frame-body{z-index:2;padding:6px 9px;position:relative}.ob-frame-title{z-index:2;color:var(--ob-tone,var(--ob-cyan));letter-spacing:.16em;text-transform:uppercase;justify-content:space-between;padding:5px 9px 0;font-size:10px;display:flex;position:relative}.ob-v-octagon{--cut:22px;clip-path:polygon(var(--cut) 0, calc(100% - var(--cut)) 0, 100% var(--cut), 100% calc(100% - var(--cut)), calc(100% - var(--cut)) 100%, var(--cut) 100%, 0 calc(100% - var(--cut)), 0 var(--cut))}.ob-v-slant{--cut:14px;clip-path:polygon(var(--cut) 0, 100% 0, calc(100% - var(--cut)) 100%, 0 100%)}.ob-v-bracket{clip-path:none;background:0 0}.ob-v-bracket:before{clip-path:none;border:0 solid var(--ob-tone,var(--ob-cyan));background:0 0;background:linear-gradient(var(--ob-tone,var(--ob-cyan)), var(--ob-tone,var(--ob-cyan))) top left / 18px 2px no-repeat, linear-gradient(var(--ob-tone,var(--ob-cyan)), var(--ob-tone,var(--ob-cyan))) top left / 2px 18px no-repeat, linear-gradient(var(--ob-tone,var(--ob-cyan)), var(--ob-tone,var(--ob-cyan))) top right / 18px 2px no-repeat, linear-gradient(var(--ob-tone,var(--ob-cyan)), var(--ob-tone,var(--ob-cyan))) top right / 2px 18px no-repeat, linear-gradient(var(--ob-tone,var(--ob-cyan)), var(--ob-tone,var(--ob-cyan))) bottom left / 18px 2px no-repeat, linear-gradient(var(--ob-tone,var(--ob-cyan)), var(--ob-tone,var(--ob-cyan))) bottom left / 2px 18px no-repeat, linear-gradient(var(--ob-tone,var(--ob-cyan)), var(--ob-tone,var(--ob-cyan))) bottom right / 18px 2px no-repeat, linear-gradient(var(--ob-tone,var(--ob-cyan)), var(--ob-tone,var(--ob-cyan))) bottom right / 2px 18px no-repeat;inset:0}.ob-frame[data-tone=orange]{animation:1.8s ease-in-out infinite ob-pulse}.ob-svg{width:100%;height:auto;display:block;overflow:visible}.ob-track{fill:none;stroke:var(--ob-dim)}.ob-fill{fill:none;stroke:var(--ob-tone,var(--ob-cyan));filter:url(#ob-glow);transition:stroke-dasharray .6s}.ob-eq{fill:var(--ob-tone,var(--ob-cyan));transform-box:fill-box;transform-origin:bottom;animation:.9s ease-in-out infinite alternate ob-eq}.ob-ecg-base{fill:none;stroke:var(--ob-dim);stroke-width:1.5px}.ob-ecg{fill:none;stroke:#67e8f9;stroke-width:2.5px;stroke-dasharray:140 400;filter:url(#ob-glow);animation:2.4s linear infinite ob-ecg}.ob-link{stroke:var(--ob-tone,var(--ob-cyan));stroke-width:1.5px;fill:none;filter:url(#ob-glow)}.ob-flow{stroke-dasharray:5 11;animation:1s linear infinite ob-flow}.ob-seg{stroke:var(--ob-dim);stroke-width:10px}.ob-seg[data-on=true]{stroke:var(--ob-cyan);filter:url(#ob-glow)}.ob-sweep{transform-box:view-box;transform-origin:0 0;animation:4s linear infinite ob-spin}.ob-blip{fill:var(--ob-green);filter:url(#ob-glow);animation:1.8s ease-in-out infinite ob-pulse}[data-dim] .ob-blip{fill:var(--ob-dim);filter:none;animation:none}.ob-spin{transform-box:fill-box;transform-origin:50%;animation:40s linear infinite ob-spin}.ob-breathe{transform-box:fill-box;transform-origin:50%;animation:4s ease-in-out infinite ob-breathe}.ob-ping{transform-box:fill-box;transform-origin:50%;animation:3s ease-out infinite ob-ping}.ob-blink{animation:1s steps(2,end) infinite ob-blink}.ob-node{cursor:pointer;color:#e0fbff;pointer-events:auto;background:0 0;border:0;padding:0;position:absolute;transform:translate(-50%,-50%)}.ob-node svg{filter:url(#ob-glow);width:68px;height:60px;display:block}.ob-node polygon{fill:var(--ob-dark);stroke:var(--ob-tone,var(--ob-cyan));stroke-width:1.6px}.ob-node:hover polygon,.ob-node:focus-visible polygon{fill:color-mix(in srgb, var(--ob-tone,var(--ob-cyan)) 22%, var(--ob-dark))}.ob-node:focus-visible{outline-offset:4px;outline:2px solid #fff}.ob-node[data-status=waiting] svg{animation:.9s ease-in-out infinite ob-pulse}.ob-node[data-status=idle] svg,.ob-node[data-status=add] svg{opacity:.6}.ob-node-label{letter-spacing:.1em;fill:#e0fbff;text-anchor:middle;dominant-baseline:central;font-size:11px}@keyframes ob-spin{to{transform:rotate(360deg)}}@keyframes ob-flow{to{stroke-dashoffset:-32px}}@keyframes ob-run{0%{background-position:100% 0}to{background-position:-200% 0}}@keyframes ob-pulse{0%,to{opacity:.45}50%{opacity:1}}@keyframes ob-eq{0%{transform:scaleY(calc(var(--lv,1) * .25))}to{transform:scaleY(var(--lv,1))}}@keyframes ob-ecg{to{stroke-dashoffset:-540px}}@keyframes ob-ping{0%{opacity:.8;transform:scale(.6)}to{opacity:0;transform:scale(2.4)}}@keyframes ob-breathe{0%,to{transform:scale(.96)}50%{transform:scale(1.06)}}@keyframes ob-blink{50%{opacity:0}}@keyframes ob-runline{0%{stroke-dashoffset:0}to{stroke-dashoffset:-100px}}.orbital[data-hud-anim=off],.orbital[data-hud-anim=off] *,.orbital[data-hud-anim=off] :before,.orbital[data-hud-anim=off] :after{transition:none!important;animation:none!important}.orbital[data-hud-anim=reduced] :not(.ob-pulse):not(.ob-breathe),.orbital[data-hud-anim=reduced] :before,.orbital[data-hud-anim=reduced] :after{animation:none!important}@media (prefers-reduced-motion:reduce){.orbital,.orbital *,.orbital :before,.orbital :after{transition:none!important;animation:none!important}}.orbital[data-paused],.orbital[data-paused] *,.orbital[data-paused] :before,.orbital[data-paused] :after{animation-play-state:paused!important}.ob-scene{pointer-events:none;width:100%;height:100%;position:absolute;inset:0;overflow:visible}.ob-ring-dash{fill:none;stroke:var(--ob-cyan);stroke-width:10px;stroke-dasharray:2 8;opacity:.7}.ob-ring-long{fill:none;stroke:#67e8f9;stroke-width:1.5px;stroke-dasharray:60 20 8 20}.ob-ring-thin{fill:none;stroke:var(--ob-dim);stroke-width:1px;stroke-dasharray:2 6}.ob-orbit{fill:none;stroke:var(--ob-line);stroke-opacity:.5;stroke-dasharray:3 9}.ob-fast{animation-duration:14s}.ob-reverse{animation-direction:reverse}.ob-usage-ring{pointer-events:none;position:absolute}.ob-usage-label{color:#9be9f7;font:inherit;letter-spacing:.14em;cursor:pointer;background:0 0;border:0;padding:4px 8px;font-size:11px;position:absolute}.ob-usage-label:hover,.ob-usage-label:focus-visible{color:#fff}.ob-zone{cursor:pointer;color:#bdeef7;overflow:hidden}.ob-zone:focus-visible{outline-offset:2px;outline:2px solid #fff}.ob-zone:hover{filter:brightness(1.25)}.ob-topbar{cursor:default}.ob-topbar-row{letter-spacing:.14em;color:#e0fbff;white-space:nowrap;justify-content:space-between;align-items:center;gap:12px;height:100%;font-size:12px;display:flex;overflow:hidden}.ob-status{color:var(--ob-cyan);text-overflow:ellipsis;overflow:hidden}.ob-hint{letter-spacing:.16em;color:color-mix(in srgb, var(--ob-cyan) 70%, transparent);pointer-events:none;justify-content:center;align-items:center;margin:0;font-size:11px;display:flex;position:absolute}.orbital[data-mode=compact] .ob-chips{pointer-events:none;gap:6px;display:flex;position:absolute;top:8px;left:8px;right:8px;overflow-x:auto}.ob-chip{background:color-mix(in srgb, var(--ob-dark) 90%, transparent);border:1px solid var(--ob-line);color:#e0fbff;font:inherit;clip-path:polygon(0 0,calc(100% - 8px) 0,100% 8px,100% 100%,8px 100%,0 calc(100% - 8px));cursor:pointer;flex:none;padding:6px 10px;font-size:12px}.orbital[data-mode=compact] .ob-strip{scroll-snap-type:x proximity;pointer-events:none;gap:8px;display:flex;position:absolute;bottom:110px;left:8px;right:8px;overflow-x:auto}.orbital[data-mode=compact] .ob-strip .ob-zone{position:relative}.orbital[data-mode=compact] .ob-usage-label{flex:none;align-self:center;position:relative}.ob-li{border-left:2px solid var(--ob-dim);color:#bdeef7;white-space:nowrap;text-overflow:ellipsis;margin:2px 0;padding-left:6px;font-size:12px;overflow:hidden}.ob-user{color:#e0fbff;border-color:var(--ob-cyan)}.ob-live{color:var(--ob-green);border-color:var(--ob-green)}.ob-sub{color:color-mix(in srgb, var(--ob-cyan) 60%, transparent);letter-spacing:.12em;text-transform:uppercase;font-size:10px}.ob-voice,.ob-tickets,.ob-budget{flex-direction:column;gap:2px;display:flex}.ob-static{cursor:default}.ob-approval{color:#fed7aa;grid-template-columns:64px 1fr;align-items:start;gap:8px 12px;max-height:100%;font-size:12px;display:grid;overflow:auto}.ob-summary{white-space:pre-wrap;color:#fff;font:inherit;margin:0;font-size:13px}.ob-warn{color:var(--ob-orange);animation:.9s ease-in-out infinite ob-pulse}.ob-actions{flex-wrap:wrap;gap:6px;display:flex}.ob-btn{border:1px solid var(--ob-orange);color:#fed7aa;font:inherit;letter-spacing:.1em;cursor:pointer;text-transform:uppercase;background:0 0;padding:6px 10px;font-size:11px}.ob-btn:hover:not(:disabled),.ob-btn:focus-visible{background:color-mix(in srgb, var(--ob-orange) 25%, transparent)}.ob-btn:disabled{opacity:.4;cursor:not-allowed}.ob-yes{background:color-mix(in srgb, var(--ob-orange) 20%, transparent)}.ob-backdrop{background:#0106098c;position:absolute;inset:0}.ob-expanded{cursor:default;z-index:5;overflow:hidden}.ob-expanded .ob-frame-body{flex-direction:column;gap:10px;height:calc(100% - 22px);display:flex;overflow:auto}.ob-expanded-body{flex:1;min-height:0;overflow:auto}.ob-worker{flex-direction:column;gap:4px;display:flex}.ob-worker-log{flex:1;min-height:0;overflow:auto}.ob-worker-log .ob-li{white-space:normal;word-break:break-word;overflow:visible}.ob-worker-say{gap:6px;margin-top:8px;display:flex}.ob-worker-say input{border:1px solid var(--ob-dim);color:#e0fbff;min-width:0;font:inherit;background:#00141e99;flex:1;padding:5px 8px;font-size:13px}.ob-worker-say input:focus-visible{outline:1px solid var(--ob-cyan)}.ob-worker-say button{border:1px solid var(--ob-cyan);color:#e0fbff;font:inherit;letter-spacing:.1em;text-transform:uppercase;cursor:pointer;background:0 0;padding:4px 12px;font-size:12px}.ob-worker-say button:disabled{opacity:.4;cursor:default}.ob-worker-say .ob-stop{border-color:var(--ob-orange);color:var(--ob-orange)}.ob-explain{color:color-mix(in srgb, var(--ob-cyan) 75%, transparent);margin:0;font-size:12px;line-height:1.4}.ob-close{z-index:3;color:#e0fbff;font:inherit;cursor:pointer;background:0 0;border:0;font-size:22px;line-height:1;position:absolute;top:4px;right:12px}.ob-close:hover,.ob-close:focus-visible{color:#fff;outline:1px solid var(--ob-cyan)}.ob-zone .ob-frame-body,.ob-expanded-body{flex-direction:column;min-height:0;display:flex}.ob-zone .ob-frame-body{height:calc(100% - 22px)}.ob-zone .ob-frame-body>div,.ob-expanded-body>div{flex-direction:column;flex:1 1 0;min-height:0;display:flex}.ob-zone .ob-frame-body>.ob-svg,.ob-zone .ob-frame-body>div>.ob-svg,.ob-expanded-body>.ob-svg,.ob-expanded-body>div>.ob-svg{flex:1 1 0;width:100%;height:0;min-height:0}.ob-feed{overflow-y:auto}.ob-feed>*,.ob-worker-log>*{flex:none}.ob-feed>:first-child{margin-top:auto}.ob-feed .ob-li{white-space:normal;overflow-wrap:anywhere;overflow:visible}.ob-topbar .ob-frame-body{align-items:center;height:100%;padding-top:0;padding-bottom:0;display:flex}.ob-topbar-row{width:100%}.ob-glyph{letter-spacing:0;font-size:17px}.ob-strip>*,.ob-chips>*{pointer-events:auto}.ob-compact-status{letter-spacing:.12em;color:var(--ob-cyan);white-space:nowrap;text-overflow:ellipsis;pointer-events:none;margin:0;font-size:11px;position:absolute;top:48px;left:12px;right:12px;overflow:hidden}.ob-modal-backdrop{z-index:6;pointer-events:auto}.ob-modal{z-index:7}.ob-tier-row{align-items:center;gap:8px;display:flex}.ob-topbar{pointer-events:none;background:0 0}.ob-topbar-line{width:100%;height:100%;position:absolute;inset:0;overflow:visible}.ob-topbar-base{fill:none;stroke:var(--ob-line);stroke-width:1.5px;vector-effect:non-scaling-stroke}.ob-topbar-run{fill:none;stroke:#67e8f9;stroke-width:2.5px;vector-effect:non-scaling-stroke;stroke-dasharray:6 94;filter:url(#ob-glow);animation:5s linear infinite ob-runline}.ob-topbar-row{grid-template-columns:1fr auto 1fr;align-items:start;height:100%;padding:4px 8px 0;display:grid;position:relative}.ob-topbar-left{flex-direction:column;line-height:1.5;display:flex;overflow:hidden}.ob-topbar-left b{color:#e0fbff;letter-spacing:.14em;white-space:nowrap;font-size:12px;font-weight:400}.ob-topbar-left small{letter-spacing:.1em;color:color-mix(in srgb, var(--ob-cyan) 70%, transparent);white-space:nowrap;text-overflow:ellipsis;font-size:10px;overflow:hidden}.ob-title{color:#e0fbff;letter-spacing:.5em;text-shadow:0 0 8px var(--ob-cyan);padding-top:2px;font-size:17px}.ob-time{letter-spacing:.14em;color:#e0fbff;white-space:nowrap;justify-self:end;font-size:12px}.ob-orb-label{text-align:center;pointer-events:none;color:#e0fbff;text-shadow:0 0 10px #000, 0 0 6px var(--ob-cyan);position:absolute;transform:translate(-50%,-50%)}.ob-orb-label b{letter-spacing:.3em;font-size:17px;display:block}.ob-orb-label small{letter-spacing:.25em;text-transform:uppercase;margin-top:2px;font-size:10px;display:block}.ob-node-caption{letter-spacing:.12em;color:#bdeef7;white-space:nowrap;text-shadow:0 0 6px #000;margin-top:2px;font-size:11px;position:absolute;top:100%;left:50%;transform:translate(-50%)}[data-placeholder]{opacity:.35}[data-placeholder] polygon{stroke:var(--ob-dim)}.ob-bg{pointer-events:none;background-image:linear-gradient(#22d3ee12 1px,#0000 1px),linear-gradient(90deg,#22d3ee12 1px,#0000 1px);background-size:calc(40px * var(--s,1)) calc(40px * var(--s,1));background-position:50%;position:absolute;inset:0;overflow:hidden}.ob-bg:after{content:"";opacity:.08;background:#22d3ee;height:3px;animation:7s linear infinite ob-scan;position:absolute;top:0;left:0;right:0}@keyframes ob-scan{0%{transform:translateY(-10px)}to{transform:translateY(100vh)}}.ob-corner{pointer-events:none;border:0 solid #67e8f9;width:30px;height:30px;position:absolute}.ob-tl{border-top-width:2px;border-left-width:2px;top:10px;left:10px}.ob-tr{border-top-width:2px;border-right-width:2px;top:10px;right:10px}.ob-bl{border-bottom-width:2px;border-left-width:2px;bottom:10px;left:10px}.ob-br{border-bottom-width:2px;border-right-width:2px;bottom:10px;right:10px}.ob-canvas{transform-origin:0 0;pointer-events:none;position:absolute}.ob-canvas .ob-scene{width:1600px;height:900px;position:absolute;top:0;left:0}.ob-w{cursor:pointer;color:#bdeef7;position:absolute}.ob-w:focus-visible{outline-offset:2px;outline:2px solid #fff}.ob-w:hover{filter:brightness(1.25)}.ob-w.ob-static{cursor:default}.ob-w>.ob-frame{height:100%}.ob-wsvg{width:100%;height:100%;display:block;overflow:visible}.ob-wsvg text,.ob-scene text{fill:#a5f3fc;letter-spacing:.12em;font-family:inherit}.ob-wsvg .ob-lab,.ob-scene .ob-lab{fill:#22d3ee;text-transform:uppercase;font-size:11px}.ob-wsvg .ob-dim,.ob-scene .ob-dim{fill:#5aa9bb;text-transform:uppercase;font-size:10px}.ob-wsvg .ob-big{fill:#e0fbff;letter-spacing:.06em;font-size:26px}.ob-wsvg .ob-sm{fill:#bdeef7;font-size:12px}.ob-wsvg .ob-grn{fill:#6ee7b7}.ob-wsvg .ob-org{fill:#fb923c}.ob-bracket{fill:none;stroke:#22d3ee;stroke-width:2px}.ob-feed-frame{fill:#031018d9;stroke:#0e7490}.ob-feed-run{fill:none;stroke:#67e8f9;stroke-width:2px;stroke-dasharray:6 94;filter:url(#ob-glow);vector-effect:non-scaling-stroke;animation:7s linear infinite ob-runline}.ob-scene .ob-title{fill:#e0fbff;letter-spacing:.5em;filter:url(#ob-glow);font-size:18px}.ob-scene .ob-topbar-base{fill:none;stroke:#0e7490;stroke-width:1.5px;vector-effect:none}.ob-scene .ob-topbar-run{fill:none;stroke:#67e8f9;stroke-width:2.5px;vector-effect:none;stroke-dasharray:8 92;filter:url(#ob-glow);animation:5s linear infinite ob-runline}.ob-orb-ring{fill:none;stroke:#67e8f9;stroke-width:1.5px}.ob-ping{fill:none;stroke:#22d3ee;transform-box:fill-box;transform-origin:50%;animation:3s ease-out infinite ob-ping}.ob-ring-outer{fill:none;stroke:#22d3ee;stroke-opacity:.12;stroke-width:22px;stroke-dasharray:1 28}.ob-slow{animation-duration:90s}.ob-orb-label b{font-size:20px}.ob-cmd{clip-path:polygon(24px 0,536px 0,560px 100%,0 100%);pointer-events:none;color:#bdeef7;background:#22d3ee;width:560px;height:36px;font-size:12px;position:absolute;top:828px;left:520px}.ob-cmd:before{content:"";clip-path:inherit;background:#031018;position:absolute;inset:1px}.ob-cmd>*{position:relative}.ob-cmd{justify-content:space-between;align-items:center;padding:0 40px 0 32px;display:flex}.ob-cmd>small{letter-spacing:.14em;color:#5aa9bb;font-size:10px}.ob-cursor{vertical-align:middle;background:#22d3ee;width:8px;height:14px;margin-left:6px;animation:1s steps(2,end) infinite ob-blink;display:inline-block}.ob-approval-frame{--cut:40px;height:100%}.ob-approval-frame .ob-frame-body{height:100%;padding:18px 28px}.ob-btn.ob-yes{clip-path:polygon(0 0,calc(100% - 14px) 0,100% 50%,calc(100% - 14px) 100%,0 100%);padding-right:22px}.ob-btn.ob-no{clip-path:polygon(14px 0,100% 0,100% 100%,14px 100%,0 50%);padding-left:22px}.ob-base{z-index:0;pointer-events:none;background:radial-gradient(#06222e 0%,#010609 70%);position:absolute;inset:0;overflow:hidden}.ob-disc-wrap{transform-box:fill-box;transform-origin:50%;transition:transform .12s ease-out}.ob-scene .ob-sample-tag{fill:#fb923c;letter-spacing:.2em;font-size:10px}.ob-scene .ob-node-detail{fill:#bdeef7;letter-spacing:.1em;font-size:12px}.ob-scene .ob-node-detail.ob-grn{fill:#6ee7b7}.ob-scene .ob-node-detail.ob-org,.ob-blip-warn{fill:#fb923c}.ob-pulse{animation:1.8s ease-in-out infinite ob-pulse}.ob-tri{width:56px;height:52px}.ob-tri path{fill:none;stroke:var(--ob-orange);stroke-width:3px;animation:.9s ease-in-out infinite ob-pulse}.ob-tri text{fill:var(--ob-orange);font-size:24px}.ob-appr-text{flex-direction:column;gap:4px;min-width:0;display:flex}.ob-appr-title{letter-spacing:.16em;color:var(--ob-orange);font-size:11px}.ob-appr-sub{color:#fed7aa;font-size:12px}.ob-approval .ob-summary{color:#fff;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;max-height:40vh;font-size:16px;overflow-y:auto}.ob-approval .pinpad,.ob-approval .ob-actions{grid-column:1/-1}.ob-actions{gap:10px}.ob-btn{padding:10px 20px;font-size:12px}.ob-approval-frame .ob-actions{flex-wrap:nowrap;gap:8px}.ob-approval-frame .ob-btn{letter-spacing:.06em;white-space:nowrap;padding:9px 14px;font-size:11px}.ob-frame[data-tone=orange].ob-approval-frame{animation:none}.ob-feed-scroll{animation:14s linear infinite ob-feed-scroll}@keyframes ob-feed-scroll{0%{transform:translateY(0)}to{transform:translateY(calc(var(--n) * -1px))}}.ob-feed-in{animation:.35s ease-out ob-feed-in}@keyframes ob-feed-in{0%{opacity:.4;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.ob-cmd{justify-content:flex-end}.command-bar.command-bar-hud{-webkit-backdrop-filter:none;backdrop-filter:none;font-size:calc(12px * var(--ob-s,1));background:0 0;border:0;gap:0;padding:0;font-family:Consolas,Courier New,monospace;display:block;position:absolute;bottom:auto;transform:none}.command-bar-hud input{width:100%;height:100%;min-height:0;font:inherit;color:#bdeef7;letter-spacing:.04em;padding:0}.command-bar-hud input::placeholder{color:#bdeef7;opacity:.9}.command-bar-hud button[type=submit]{opacity:0;border:0;width:1px;min-width:0;height:1px;min-height:0;padding:0;position:absolute;overflow:hidden}.command-bar-hud .slash-list{margin-bottom:8px;bottom:100%}.stage:has(.orbital[data-mode=orbit]) .captions{bottom:17%}.of-check{color:#e0fbff;flex-wrap:wrap;align-items:center;gap:4px 8px;padding:4px 2px;font-size:13px;display:flex}.of-check .of-hint{flex-basis:100%}.ob-orb-label small{text-transform:uppercase;letter-spacing:.14em}.ob-team-btn{border:1px solid var(--ob-cyan);color:#e0fbff;font:inherit;letter-spacing:.22em;cursor:pointer;clip-path:polygon(8px 0,100% 0,calc(100% - 8px) 100%,0 100%);background:#00141eb3;padding:3px 12px;font-size:11px;position:absolute;transform:translate(-50%)}.ob-team-btn:hover,.ob-team-btn:focus-visible{background:color-mix(in srgb, var(--ob-cyan) 22%, transparent);box-shadow:0 0 12px var(--ob-cyan);outline:none}.ob-org-holder{position:relative;overflow:auto}.ob-org{transform-origin:0 0;position:absolute;top:0}.ob-org-edges{position:absolute;inset:0;overflow:visible}.ob-org-edges path{fill:none;stroke:var(--ob-cyan);stroke-width:1.5px;opacity:.55}.ob-org-card{box-sizing:border-box;text-align:left;font:inherit;color:#e0fbff;border:1px solid color-mix(in srgb, var(--ob-cyan) 55%, transparent);clip-path:polygon(0 0,calc(100% - 12px) 0,100% 12px,100% 100%,12px 100%,0 calc(100% - 12px));cursor:pointer;background:linear-gradient(160deg,#082230e6,#030e16e6);flex-direction:column;justify-content:center;gap:2px;padding:6px 12px;display:flex;position:absolute;overflow:hidden}.ob-org-card b{letter-spacing:.06em;align-items:center;gap:6px;font-size:13px;display:flex}.ob-org-card b i{background:var(--ob-dim,#5a7f8a);border-radius:50%;width:8px;height:8px;display:inline-block}.ob-org-card span{color:var(--ob-cyan);font-size:11px}.ob-org-card small{color:#e0fbffa6;white-space:nowrap;text-overflow:ellipsis;font-size:10px;overflow:hidden}.ob-org-card em{background:var(--ob-cyan);height:3px;position:absolute;bottom:0;left:0}.ob-org-card[data-status=running]{border-color:var(--ob-green)}.ob-org-card[data-status=running] b i{background:var(--ob-green);box-shadow:0 0 8px var(--ob-green)}.ob-org-card[data-status=waiting]{border-color:var(--ob-orange);animation:1.4s ease-in-out infinite ob-pulse}.ob-org-card[data-status=waiting] b i{background:var(--ob-orange)}.ob-org-card[data-status=failed] b i{background:#f87171}.ob-org-root{cursor:default;border-color:var(--ob-cyan);box-shadow:inset 0 0 18px #3fd8ff26}.ob-li.ob-warn{color:var(--ob-orange);border-color:var(--ob-orange)}:root{--accent:#3fd8ff;--warn:#ffb454;--bad:#ff6b7a;--ok:#5ef0b0;--ink:#d4ecf7;--muted:#7fa3b6;--glass:#06141c9e;--edge:color-mix(in srgb, var(--accent) 48%, transparent);--ui:"Segoe UI", system-ui, -apple-system, "Helvetica Neue", Arial, sans-serif;--mono:"Cascadia Mono", "SF Mono", Consolas, ui-monospace, monospace;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{color:var(--ink);font:16px/1.5 var(--ui);-webkit-tap-highlight-color:transparent;background:#000;overflow:hidden}button,input{font:inherit;color:inherit}button{cursor:pointer}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.stage{touch-action:manipulation;background:#000;position:fixed;inset:0;overflow:hidden}.ambient{pointer-events:none;background:radial-gradient(ellipse at 50% 55%, color-mix(in srgb, var(--accent) 10%, transparent), transparent 62%), linear-gradient(#3fd8ff0b 1px, transparent 1px) 0 0 / 64px 64px, linear-gradient(90deg, #3fd8ff0b 1px, transparent 1px) 0 0 / 64px 64px;position:absolute;inset:0;-webkit-mask-image:radial-gradient(#000 30%,#0000 78%);mask-image:radial-gradient(#000 30%,#0000 78%)}.presence{z-index:1;transition:inset .7s cubic-bezier(.2,.7,.2,1),width .7s,height .7s,opacity .5s;position:absolute}.presence-full{inset:0}.presence-corner{left:max(10px, env(safe-area-inset-left));bottom:max(52px, calc(env(safe-area-inset-bottom) + 42px));width:clamp(96px,16vw,190px);height:clamp(96px,16vw,190px)}.objects{pointer-events:none;position:absolute;inset:0}.objects-stack{pointer-events:auto;padding:max(56px, env(safe-area-inset-top)) 14px 140px;flex-direction:column;gap:12px;display:flex;overflow-y:auto}.auto-grid{pointer-events:none;padding:max(24px, env(safe-area-inset-top)) 24px 24px clamp(120px, 20vw, 230px);grid-template-columns:repeat(auto-fit,minmax(min(280px,100%),1fr));align-content:safe center;align-items:start;gap:12px;display:grid;position:absolute;inset:0;overflow-y:auto}.auto-grid>.obj{pointer-events:auto}.objects-stack>.auto-grid{flex-direction:column;padding:0;display:flex;position:static;overflow:visible}.obj.leaving{pointer-events:none;animation:.35s forwards leave}@keyframes leave{to{opacity:0;transform:scale(.96)translateY(-6px)}}@media (prefers-reduced-motion:reduce){.obj.leaving{animation:none}}.glass{background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid var(--edge);box-shadow:0 0 22px color-mix(in srgb, var(--accent) 16%, transparent), inset 0 0 28px #3fd8ff0d;clip-path:polygon(0 0,calc(100% - 14px) 0,100% 14px,100% 100%,14px 100%,0 calc(100% - 14px))}.obj{pointer-events:auto;min-width:0;padding:16px 18px;animation:.45s both appear;overflow:auto}.obj.alert{border-color:var(--warn)}.overlay-layer{z-index:40;pointer-events:none;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.overlay-backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);pointer-events:auto;background:#02080ca8;animation:.3s both appear;position:absolute;inset:0}.obj.overlay{z-index:1;width:min(760px,94vw);max-height:80vh;box-shadow:0 0 40px color-mix(in srgb, var(--accent) 30%, transparent);position:relative}@keyframes appear{0%{opacity:0;transform:translateY(8px)scale(.985)}}.obj-close{width:44px;height:44px;color:var(--muted);background:0 0;border:0;font-size:1.5rem;line-height:1;position:absolute;top:2px;right:6px}.obj-close:hover{color:var(--accent)}.obj-title{letter-spacing:.16em;text-transform:uppercase;color:var(--accent);margin:0 36px 8px 0;font-size:.78rem;font-weight:600}.obj-md>:first-child{margin-top:0}.obj-md>:last-child{margin-bottom:0}.obj-md a{color:var(--accent)}.obj-md code{font-family:var(--mono);background:#3fd8ff1a;padding:0 4px;font-size:.9em}.obj-stat{gap:2px;display:grid}.obj-label{letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-size:.78rem}.obj-value{font-variant-numeric:tabular-nums;font-size:clamp(2rem,6vw,3.6rem);font-weight:300;line-height:1.05}.obj-value small{color:var(--muted);margin-left:4px;font-size:.4em}.obj-delta{color:var(--ok);font-size:.9rem}.obj-list{gap:4px;margin:0;padding-left:1.1rem;display:grid}.obj-list .done{color:var(--muted);text-decoration:line-through}.obj-table-wrap{overflow-x:auto}.obj-table{border-collapse:collapse;width:100%;font-size:.92rem}.obj-table th{text-align:left;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);font-size:.72rem;font-weight:600}.obj-table th,.obj-table td{font-variant-numeric:tabular-nums;border-bottom:1px solid #3fd8ff2e;padding:6px 10px}.obj-code{font:.86rem/1.5 var(--mono);margin:0;overflow:auto}.obj-empty{color:var(--muted);margin:0}.integration-steps{color:var(--muted);gap:4px;margin:4px 0 10px;padding-left:1.2rem;font-size:.86rem;display:grid}.integration-steps li.done{color:var(--ok)}.obj-doc{max-height:70vh;overflow:auto}.obj-doc h1,.obj-doc h2,.obj-doc h3,.obj-doc h4{color:var(--accent);letter-spacing:.06em;font-weight:500}.obj-doc table{border-collapse:collapse;width:100%;font-size:.92rem}.obj-doc th,.obj-doc td{border:1px solid color-mix(in srgb, var(--accent) 22%, transparent);text-align:left;padding:5px 9px}.obj-doc th{color:var(--accent);letter-spacing:.14em;text-transform:uppercase;font-size:.72rem;font-weight:500}.obj-doc pre{border:1px solid color-mix(in srgb, var(--accent) 22%, transparent);font:.86rem/1.5 var(--mono);background:#3fd8ff0d;padding:8px 10px;overflow:auto}.obj-doc blockquote{border-left:2px solid var(--edge);color:var(--muted);margin:.6em 0;padding-left:12px}.obj-progress{gap:6px;min-width:0;display:grid}.obj-progress-head{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.obj-progress-pct{font:1.1rem var(--mono);font-variant-numeric:tabular-nums}.obj-progress-bar{border:1px solid var(--edge);background:#3fd8ff12;height:8px}.obj-progress-bar i{background:var(--accent);height:100%;box-shadow:0 0 10px var(--accent);transition:width .4s;display:block}.obj-progress-detail{color:var(--muted);font-size:.82rem}.obj-checklist{gap:6px;margin:0;padding:0;list-style:none;display:grid}.obj-checklist li{align-items:center;gap:10px;display:flex}.obj-checklist .box{border:1px solid var(--accent);width:16px;height:16px;color:var(--accent);flex:none;place-items:center;font-size:.8rem;display:inline-grid}.obj-checklist .done{color:var(--muted)}.obj-checklist .done span:last-child{text-decoration:line-through}.obj-kv{gap:4px;margin:0;display:grid}.obj-kv>div{border-bottom:1px solid color-mix(in srgb, var(--accent) 16%, transparent);justify-content:space-between;gap:18px;padding:3px 0;display:flex}.obj-kv dt{color:var(--muted);letter-spacing:.14em;text-transform:uppercase;font-size:.78rem}.obj-kv dd{font-family:var(--mono);font-variant-numeric:tabular-nums;text-align:right;margin:0}.obj-countdown{justify-items:center;gap:2px;display:grid}.obj-countdown-time{font:300 clamp(2rem, 6vw, 3.4rem) var(--mono);font-variant-numeric:tabular-nums;text-shadow:0 0 14px var(--accent)}.obj-countdown.done .obj-countdown-time{color:var(--warn);text-shadow:0 0 14px var(--warn)}.obj-media{flex-direction:column;gap:6px;width:100%;max-height:100%;display:flex}.obj-media img,.obj-media video{object-fit:contain;border:1px solid var(--edge);background:#050b10;max-width:100%;max-height:50vh;margin:0 auto;display:block}.obj-pdf iframe{border:1px solid var(--edge);background:#050b10;width:100%;min-width:0;height:min(520px,62vh)}.obj-open{color:var(--accent);letter-spacing:.1em;text-transform:uppercase;font-size:.82rem}.obj-gallery-bar{justify-content:space-between;align-items:center;gap:10px;display:flex}.obj-gallery-bar span{color:var(--ink);justify-items:center;font-size:.86rem;display:grid}.obj-gallery-bar small{color:var(--muted);font-family:var(--mono)}.obj-gallery-bar button{border:1px solid var(--edge);min-width:44px;min-height:44px;color:var(--accent);cursor:pointer;background:0 0;font-size:1.3rem}.obj-gallery-bar button:disabled{opacity:.3;cursor:default}.obj-group{align-items:start;gap:14px;display:grid}.obj-group-grid{grid-template-columns:repeat(auto-fit,minmax(170px,1fr))}.obj-group-row{grid-auto-columns:minmax(150px,1fr);grid-auto-flow:column;overflow-x:auto}.obj-group-column{grid-template-columns:1fr}.obj-part{border:1px solid color-mix(in srgb, var(--accent) 20%, transparent);background:#3fd8ff0a;min-width:0;padding:8px 10px}.obj-tabs{border-bottom:1px solid var(--edge);gap:2px;margin-bottom:8px;display:flex;overflow-x:auto}.obj-tabs button{min-height:40px;color:var(--muted);letter-spacing:.14em;text-transform:uppercase;cursor:pointer;white-space:nowrap;background:0 0;border:0;padding:8px 14px;font-size:.78rem}.obj-tabs button.on{color:var(--accent);box-shadow:inset 0 -2px 0 var(--accent);text-shadow:0 0 8px var(--accent)}.obj-chart{width:100%;height:auto;display:block}.obj-chart .grid{stroke:#3fd8ff24;stroke-width:1px}.obj-chart .tick{fill:var(--muted);font:10px var(--mono);font-variant-numeric:tabular-nums}.legend{color:var(--muted);flex-wrap:wrap;gap:6px 14px;margin:6px 0 0;padding:0;font-size:.8rem;list-style:none;display:flex}.legend i{width:10px;height:10px;margin-right:6px;display:inline-block}.obj-gauge{justify-items:center;display:grid}.obj-gauge svg{width:min(100%,260px);height:auto}.obj-gauge .track{stroke:#3fd8ff26}.obj-gauge .value{stroke:var(--accent);filter:drop-shadow(0 0 6px var(--accent))}.obj-gauge.gauge-warn .value{stroke:var(--warn);filter:drop-shadow(0 0 6px var(--warn))}.obj-gauge.gauge-crit .value{stroke:var(--bad);filter:drop-shadow(0 0 6px var(--bad))}.gauge-read{align-items:baseline;gap:4px;margin-top:-62px;display:flex}.gauge-value{font-variant-numeric:tabular-nums;font-size:clamp(1.8rem,5vw,2.8rem);font-weight:300}.gauge-unit{color:var(--muted)}.obj-gauge .obj-label{margin-top:18px}.obj-timeline{border-left:1px solid var(--edge);gap:14px;margin:8px 0 0;padding:0 0 0 20px;list-style:none;display:grid}.obj-timeline li{gap:2px;display:grid;position:relative}.obj-timeline li:before{content:"";background:var(--accent);width:9px;height:9px;box-shadow:0 0 8px var(--accent);border-radius:50%;position:absolute;top:.5em;left:-25px}.obj-timeline time{font:.75rem/1.3 var(--mono);color:var(--accent)}.obj-timeline span{color:var(--muted);font-size:.9rem}.obj-graph{width:100%;height:auto;max-height:70vh;margin:0 auto;display:block}.obj[style*=" height:"] .obj-graph{max-height:calc(100% - 32px)}.obj-graph .edge{stroke:color-mix(in srgb, var(--accent) 55%, transparent);stroke-width:1.4px}.obj-graph .arrow{fill:var(--accent)}.obj-graph .node{fill:#3fd8ff26;stroke:var(--accent);stroke-width:1.5px}.obj-graph .node-label{fill:var(--ink);font:10px var(--ui)}.obj-graph .edge-label{fill:var(--muted);font:9px var(--ui)}.captions{z-index:20;left:50%;bottom:max(7%, env(safe-area-inset-bottom));text-align:center;pointer-events:none;text-shadow:0 0 18px #000,0 0 4px #000;text-wrap:balance;width:min(780px,100% - 32px);margin:0;font-size:clamp(1.1rem,2.6vw,1.6rem);font-weight:300;position:absolute;transform:translate(-50%)}.captions.done{animation:1.4s 8s forwards fadeOut}@keyframes fadeOut{to{opacity:0}}.command-bar{z-index:30;left:50%;bottom:max(14px, env(safe-area-inset-bottom));background:var(--glass);border:1px solid var(--edge);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);gap:8px;width:min(640px,100% - 24px);padding:8px;display:flex;position:absolute;transform:translate(-50%)}.command-bar input{background:0 0;border:0;outline:none;flex:1;min-height:44px;padding:0 10px;font-size:1.05rem}.command-bar button{border:1px solid var(--edge);background:0 0;min-width:44px;min-height:44px}.conn-badge{top:max(10px, env(safe-area-inset-top));font:500 .78rem var(--mono);letter-spacing:.08em;color:var(--warn);border:1px solid var(--warn);background:#0009;padding:6px 12px;position:absolute;right:12px}.mic-indicator{left:50%;top:max(12px, env(safe-area-inset-top));font:500 .82rem var(--mono);letter-spacing:.1em;text-transform:uppercase;color:#ffd9a0;border:1px solid var(--warn);background:#000000c7;align-items:center;gap:10px;padding:8px 16px;display:flex;position:absolute;transform:translate(-50%)}.mic-indicator i{background:var(--bad);width:10px;height:10px;box-shadow:0 0 10px var(--bad);border-radius:50%;animation:1s ease-in-out infinite mic-pulse}.mic-transcribing i{background:var(--warn);box-shadow:0 0 10px var(--warn)}@keyframes mic-pulse{50%{opacity:.35}}@media (prefers-reduced-motion:reduce){.mic-indicator i{animation:none}}.toasts{top:max(48px, env(safe-area-inset-top));gap:6px;width:min(420px,100% - 24px);display:grid;position:absolute;left:50%;transform:translate(-50%)}.toast{border:1px solid var(--edge);background:#000000d1;padding:10px 14px;font-size:.92rem}.toast-warn{border-color:var(--warn);color:#ffd9a0}.toast-error{border-color:var(--bad);color:#ffc2c9}.approval{border-color:var(--warn);background:#020c12eb;width:min(460px,100% - 24px);max-height:calc(100% - 24px);padding:20px;position:absolute;top:50%;left:50%;overflow:auto;transform:translate(-50%,-50%);box-shadow:0 0 0 100vmax #0000008c,0 0 30px #ffb45440}.plugins{flex-direction:column;width:min(560px,100% - 24px);display:flex;overflow:hidden}.plugins-body{min-height:0;padding-right:4px;overflow-y:auto}.plugins-heading{letter-spacing:.14em;text-transform:uppercase;color:var(--muted);margin:14px 0 6px;font-size:.78rem}.usage-totals{grid-template-columns:repeat(3,1fr);gap:8px;margin:12px 0;display:grid}.usage-totals div{text-align:center;background:#ffffff0a;gap:2px;padding:8px 10px;display:grid}.usage-totals strong{color:var(--accent);font-size:1.35rem}.usage-totals span{color:var(--muted);font-size:.74rem}.usage-bars{align-items:flex-end;gap:2px;height:96px;margin:8px 0 12px;display:flex}.usage-bar-col{flex-direction:column;flex:1 1 0;justify-content:flex-end;align-items:center;gap:2px;min-width:0;height:100%;display:flex}.usage-bar{background:var(--accent);opacity:.8;border-radius:2px 2px 0 0;width:100%;min-height:1px}.usage-bar-day{color:var(--muted);font-size:.6rem}.usage-table{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%;font-size:.82rem}.usage-table th,.usage-table td{text-align:right;border-bottom:1px solid #ffffff0f;padding:4px 6px}.usage-table th:first-child{text-align:left;font-weight:400}.usage-table thead th{color:var(--muted);letter-spacing:.08em;text-transform:uppercase;font-size:.72rem}.usage-list{gap:4px;margin:0;padding:0;font-size:.84rem;list-style:none;display:grid}.usage-list li{background:#ffffff0a;flex-wrap:wrap;justify-content:space-between;gap:4px 10px;padding:6px 10px;display:flex}.usage-list li span:last-child{color:var(--muted)}.plugin-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.plugin-list li{background:#ffffff0a;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 10px;padding:8px 10px;display:flex}.plugin-info{flex:180px;min-width:0}.plugin-info .auth-note{font-size:.82rem}.plugin-actions{flex-wrap:wrap;gap:6px;display:flex}.plugin-actions button{border:1px solid var(--edge);background:0 0;padding:0 12px}.obj-sandbox{flex-direction:column;gap:6px;width:100%;min-width:min(560px,80vw);height:min(420px,60vh);display:flex}.obj-sandbox iframe{border:1px solid var(--edge);background:#050b10;flex:1;width:100%;min-height:200px}.camera-indicator{border-color:var(--bad);color:#ffc2c9;letter-spacing:.12em;text-transform:uppercase;background:#020c12e6;align-items:center;gap:10px;padding:6px 12px 6px 6px;font-size:.8rem;display:flex;position:absolute;bottom:12px;right:12px}.camera-indicator video{object-fit:cover;background:#000;width:72px;height:54px}.camera-indicator span:before{content:"";background:var(--bad);border-radius:50%;width:8px;height:8px;margin-right:8px;display:inline-block}.challenge,.enroll{border-color:var(--accent);box-shadow:0 0 0 100vmax #0000008c,0 0 30px #3fd8ff40}.challenge .approval-title,.enroll .approval-title{color:var(--accent)}.approval-head{align-items:center;gap:10px;display:flex}.approval-title{letter-spacing:.18em;text-transform:uppercase;color:var(--warn);font-size:.8rem}.tier{font:600 .74rem var(--mono);border:1px solid;padding:2px 8px}.tier-T2{color:var(--warn)}.tier-T3{color:var(--bad)}.approval-summary{font:.95rem/1.5 var(--mono);word-break:break-all;background:#ffffff0a;max-height:40vh;margin:14px 0;padding:10px 12px;overflow:auto}.approval-actions{flex-wrap:wrap;gap:8px;margin-top:14px;display:flex}.approval-actions button,.owner-menu button,.auth button{border:1px solid var(--edge);letter-spacing:.04em;background:0 0;padding:0 16px}button.primary{background:color-mix(in srgb, var(--accent) 22%, transparent);border-color:var(--accent)}button.danger{border-color:var(--bad);color:#ffc2c9}button:disabled{opacity:.4;cursor:not-allowed}.pinpad{justify-items:center;gap:8px;display:grid}.pin-dots{letter-spacing:.4em;min-height:1.6em;color:var(--accent);font-size:1.6rem}.pin-keys{grid-template-columns:repeat(3,64px);gap:8px;display:grid}.pin-keys button{border:1px solid var(--edge);background:#3fd8ff0d;font-size:1.2rem}.owner-menu{top:max(60px, env(safe-area-inset-top));background:#020c12f0;gap:8px;width:220px;padding:12px;display:grid;left:12px}.boot{background:#000;height:100%}.auth{gap:8px;width:min(380px,100% - 28px);padding:24px;display:grid;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.auth h1{letter-spacing:.3em;text-transform:uppercase;color:var(--accent);margin:0 0 6px;font-size:1.1rem;font-weight:300}.auth label{letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin-top:6px;font-size:.78rem}.auth input{border:1px solid var(--edge);background:#ffffff0a;padding:0 12px}.auth button{margin-top:12px}.auth-note{color:var(--muted);margin:0;font-size:.9rem}.auth-error{color:#ffc2c9;margin:4px 0 0;font-size:.9rem}@media (width<=599px){.presence-full{inset:0}.captions{bottom:max(11%, env(safe-area-inset-bottom))}}@media (prefers-reduced-motion:reduce){.obj,.presence{transition:none;animation:none}}.status-badge{left:12px;bottom:max(12px, env(safe-area-inset-bottom));font:500 .78rem var(--mono);letter-spacing:.08em;color:var(--ink);border:1px solid var(--edge);background:#0000008c;align-items:center;gap:9px;max-width:min(60vw,360px);padding:6px 12px;display:flex;position:absolute}.status-badge span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.status-badge i{background:var(--muted);border-radius:50%;flex:none;width:9px;height:9px}.status-idle i{background:var(--ok);box-shadow:0 0 8px var(--ok)}.status-working i,.status-speaking i{background:var(--accent);box-shadow:0 0 10px var(--accent);animation:1s ease-in-out infinite mic-pulse}.status-listening i{background:var(--bad);box-shadow:0 0 10px var(--bad);animation:1s ease-in-out infinite mic-pulse}.status-waiting{border-color:var(--warn);color:#ffd9a0}.status-waiting i{background:var(--warn);box-shadow:0 0 10px var(--warn);animation:1s ease-in-out infinite mic-pulse}.status-offline{border-color:var(--warn);color:var(--warn)}.status-offline i{background:var(--warn)}@media (prefers-reduced-motion:reduce){.status-badge i{animation:none!important}}.clock{right:12px;bottom:max(12px, env(safe-area-inset-bottom));text-align:right;color:var(--muted);line-height:1.15;font-family:var(--mono);pointer-events:none;position:absolute}.clock b{color:var(--ink);letter-spacing:.06em;font-size:1.15rem;font-weight:500;display:block}.clock span{letter-spacing:.1em;text-transform:uppercase;font-size:.7rem}.settings{flex-direction:column;width:min(520px,100% - 24px);max-height:calc(100% - 24px);display:flex}.settings-body{gap:6px;min-height:0;padding-right:4px;display:grid;overflow-y:auto}.settings-field{gap:3px;display:grid}.settings-field>span{letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-size:.74rem}.settings-field input:not([type=range]):not([type=checkbox]),.settings-field select{border:1px solid var(--edge);color:var(--ink);min-height:40px;font:inherit;background:#ffffff0a;padding:0 10px}.settings-field select option{background:#06141c}.settings-check{align-items:center;gap:10px;min-height:40px;display:flex}.slash-list{border:1px solid var(--edge);background:#020c12f5;max-height:40vh;margin:0;padding:4px;list-style:none;position:absolute;bottom:calc(100% + 6px);left:0;right:0;overflow-y:auto}.slash-list li{cursor:pointer;align-items:baseline;gap:10px;padding:7px 10px;display:flex}.slash-list li.on,.slash-list li:hover{background:color-mix(in srgb, var(--accent) 18%, transparent)}.slash-list b{font:600 .9rem var(--mono);color:var(--accent)}.slash-list i{font:.78rem var(--mono);color:var(--warn);font-style:normal}.slash-list span{color:var(--muted);font-size:.82rem}.movable{position:absolute}.movable[data-panel=status],.movable[data-panel=clock]{cursor:grab;touch-action:none;pointer-events:auto}.movable:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.panel{resize:both;flex-direction:column;width:clamp(260px,28vw,420px);min-width:220px;min-height:140px;max-height:80vh;padding:0;display:flex;overflow:hidden}.panel-chat{height:62vh}.panel-tasks{width:clamp(240px,26vw,360px);height:40vh}.panel-head{cursor:grab;touch-action:none;border-bottom:1px solid var(--edge);-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;gap:10px;padding:8px 12px;display:flex}.panel-head .obj-close{position:static}.chat-lines{flex:1;align-content:start;gap:8px;min-height:0;padding:10px 12px;display:grid;overflow-y:auto}.chat-line{white-space:pre-wrap;overflow-wrap:anywhere;max-width:92%;margin:0;padding:7px 10px;font-size:.9rem}.chat-user{background:color-mix(in srgb, var(--accent) 18%, transparent);border:1px solid var(--edge);justify-self:end}.chat-assistant{background:#ffffff0d;justify-self:start}.chat-form{border-top:1px solid var(--edge);gap:6px;padding:8px;display:flex}.chat-form input{border:1px solid var(--edge);min-width:0;color:var(--ink);min-height:40px;font:inherit;background:#ffffff0a;flex:1;padding:0 10px}.chat-form button{border:1px solid var(--edge);color:var(--ink);background:0 0;min-height:40px;padding:0 14px}.task-body{flex:1;min-height:0;padding:10px 12px;overflow-y:auto}.task-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.task-list li{border-left:3px solid var(--accent);background:#ffffff0a;gap:2px;padding:8px 10px;display:grid}.task-list li.overdue{border-left-color:var(--bad)}.task-title{overflow-wrap:anywhere;font-size:.95rem}.task-due{font:.75rem var(--mono);color:var(--muted)}.task-list li.overdue .task-due{color:var(--bad)}@media (width<=600px){.panel{resize:none;width:calc(100% - 24px);left:12px!important}.panel-chat{height:52vh;bottom:56px;top:auto!important}.panel-tasks{height:30vh;top:56px!important}}.help{flex-direction:column;width:min(560px,100% - 24px);max-height:calc(100% - 24px);display:flex}.help-list{gap:4px;min-height:0;margin:8px 0;display:grid;overflow-y:auto}.help-row{border-bottom:1px solid #ffffff0f;grid-template-columns:minmax(130px,38%) 1fr;gap:12px;padding:6px 4px;display:grid}.help-row dt{font:600 .9rem var(--mono);color:var(--accent);overflow-wrap:anywhere}.help-row dt i{color:var(--warn);font-style:normal;font-weight:400}.help-row dd{color:var(--ink);margin:0;font-size:.9rem}@media (width<=600px){.help-row{grid-template-columns:1fr;gap:2px}}.connectors{width:min(600px,100% - 24px);max-height:calc(100% - 24px);overflow-y:auto}.connector-form{gap:8px;display:grid}.connector-form textarea,.settings-field textarea{border:1px solid var(--edge);color:var(--ink);font:.85rem var(--mono);resize:vertical;background:#ffffff0a;padding:8px 10px}.connector-steps{color:var(--muted);gap:4px;margin:0;padding-left:20px;font-size:.88rem;display:grid}.connector-warning{border-left:3px solid var(--warn);color:#ffd9a0;padding-left:10px}.conn-status{font:.74rem var(--mono)}.conn-ready{color:var(--ok)}.conn-error{color:var(--bad)}.conn-connecting{color:var(--warn)}.conn-off{color:var(--muted)}.settings-wide{width:min(980px,100% - 24px);height:min(720px,100% - 24px)}.settings-layout{flex:1;grid-template-columns:190px 1fr;gap:16px;min-height:0;margin-top:8px;display:grid}.settings-tabs{align-content:start;gap:6px;display:grid}.settings-tab{text-align:left;color:var(--ink);background:0 0;border:1px solid #0000;gap:2px;padding:10px 12px;display:grid}.settings-tab small{color:var(--muted);font-size:.74rem}.settings-tab:hover{background:#ffffff0d}.settings-tab.on{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 16%, transparent)}.settings-wide .settings-body{align-content:start;padding-right:8px}@media (width<=700px){.settings-wide{height:calc(100% - 24px)}.settings-layout{grid-template-columns:1fr;gap:8px}.settings-tabs{grid-auto-columns:1fr;grid-auto-flow:column;overflow-x:auto}.settings-tab small{display:none}}.look-tab{grid-template-columns:minmax(220px,300px) 1fr;align-items:start;gap:18px;display:grid}.look-side{gap:10px;display:grid;position:sticky;top:0}.look-controls{gap:6px;min-width:0;display:grid}@media (width<=860px){.look-tab{grid-template-columns:1fr}.look-side{position:static}}.look-preview{border:1px solid var(--edge);background:#000;height:230px;position:relative;overflow:hidden}.look-preview-glow{background:radial-gradient(ellipse at 50% 55%, color-mix(in srgb, var(--accent) 22%, transparent), transparent 65%);position:absolute;inset:0}.look-preview-stage{position:absolute;inset:0}.look-preview-caption{text-align:center;text-shadow:0 0 10px #000;margin:0;position:absolute;bottom:8px;left:8px;right:8px}.look-preview .presence-full{inset:0}.theme-grid{grid-template-columns:repeat(auto-fill,minmax(118px,1fr));gap:8px;display:grid}.theme-card{border:1px solid var(--edge);color:var(--ink);text-align:left;background:#ffffff08;justify-items:start;gap:1px;padding:10px;display:grid}.theme-card i{background:var(--swatch);width:22px;height:22px;box-shadow:0 0 12px var(--swatch);border-radius:50%;margin-bottom:4px}.theme-card small{color:var(--muted);font-size:.72rem}.theme-card.on,.style-choice.on{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 18%, transparent)}.style-row{grid-template-columns:repeat(3,1fr);gap:8px;display:grid}.style-choice{border:1px solid var(--edge);color:var(--ink);text-align:left;background:#ffffff08;gap:2px;padding:10px;display:grid}.style-choice small{color:var(--muted);font-size:.72rem}.swatch-row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.swatch{border:2px solid #0000;border-radius:50%;width:32px;height:32px;min-height:32px;padding:0}.swatch.on{box-shadow:0 0 0 2px var(--accent);border-color:#fff}.swatch-custom{color:var(--muted);align-items:center;gap:6px;font-size:.8rem;display:flex}.swatch-custom input[type=color]{border:1px solid var(--edge);background:0 0;width:40px;height:32px;padding:0}.captions-small{font-size:clamp(.9rem,2vw,1.15rem)}.captions-medium{font-size:clamp(1.1rem,2.6vw,1.6rem)}.captions-large{font-size:clamp(1.4rem,3.6vw,2.3rem)}.voice-hear{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.connector-command{border:1px solid var(--edge);font:.85rem var(--mono);-webkit-user-select:all;user-select:all;background:#ffffff0d;margin:0;padding:8px 10px;overflow-x:auto}html,body{overscroll-behavior:none}@media (pointer:coarse){.stage{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}}input,textarea,select,.connector-command{-webkit-user-select:text;user-select:text}.owner-menu{max-height:calc(100dvh - 80px);overflow-y:auto}.touch-controls{z-index:25;left:0;right:0;bottom:max(14px, env(safe-area-inset-bottom));pointer-events:none;justify-content:center;align-items:flex-end;gap:26px;display:flex;position:absolute}.touch-controls>*{pointer-events:auto}.touch-talk{justify-items:center;gap:6px;display:grid}.touch-hint{max-width:70vw;font:500 .74rem var(--mono);letter-spacing:.06em;color:var(--muted);text-align:center;text-shadow:0 0 6px #000,0 0 2px #000;padding:2px 10px}.touch-mic,.touch-side{border:1px solid var(--edge);color:var(--ink);background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);touch-action:none;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;border-radius:50%;place-items:center;padding:0;display:grid}.touch-mic{border-color:var(--accent);width:76px;height:76px;box-shadow:0 0 22px color-mix(in srgb, var(--accent) 30%, transparent)}.touch-mic.on{background:color-mix(in srgb, var(--bad) 40%, transparent);border-color:var(--bad);box-shadow:0 0 28px var(--bad);animation:1s ease-in-out infinite mic-pulse}.touch-side{touch-action:manipulation;width:52px;height:52px;margin-bottom:12px}@media (prefers-reduced-motion:reduce){.touch-mic.on{animation:none}}@media (pointer:coarse){.captions{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 150px)}.status-badge,.clock{bottom:max(8px, env(safe-area-inset-bottom))}.presence-corner{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 70px)}}@media (width<=600px) and (pointer:coarse){.panel-chat{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 150px);height:min(48vh,100dvh - 260px)}.objects-stack{padding-bottom:190px}}.elsewhere{z-index:3000;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#000000c7;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.elsewhere-card{border:1px solid var(--edge);background:var(--glass);max-width:380px;color:var(--ink);text-align:center;border-radius:16px;padding:24px}.elsewhere-card h2{margin:0 0 10px;font-size:1.15rem}.elsewhere-card p{color:var(--muted);margin:0 0 18px;line-height:1.45}.elsewhere-btn{border:1px solid var(--accent);background:color-mix(in srgb, var(--accent) 25%, transparent);min-height:48px;color:var(--ink);font:600 1rem var(--mono);cursor:pointer;border-radius:24px;padding:0 28px}.obj-grip{cursor:grab;touch-action:none;border-radius:8px 8px 0 0;height:22px;position:absolute;top:0;left:0;right:92px}.obj-grip:before{content:"";background:var(--muted);opacity:.35;border-radius:2px;width:34px;height:3px;margin-left:-17px;transition:opacity .15s;position:absolute;top:8px;left:50%}.obj:hover .obj-grip:before,.obj-grip:focus-visible:before{opacity:.9}.obj-grip:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.obj.dragging{cursor:grabbing;box-shadow:0 0 0 1px var(--accent), 0 8px 30px #00000080;-webkit-user-select:none;user-select:none;transition:none;animation:none}.obj-pin{width:44px;height:44px;color:var(--muted);opacity:.55;background:0 0;border:0;place-items:center;display:grid;position:absolute;top:2px;right:50px}.obj:hover .obj-pin,.obj-pin.on,.obj-pin:focus-visible{opacity:1}.obj-pin.on,.obj-pin:hover{color:var(--accent)}.obj.pinned{border-color:color-mix(in srgb, var(--accent) 55%, transparent)}.obj-resize{cursor:nwse-resize;touch-action:none;opacity:0;background:linear-gradient(135deg, transparent 55%, var(--accent) 56%, var(--accent) 64%, transparent 65%, transparent 76%, var(--accent) 77%, var(--accent) 85%, transparent 86%);width:22px;height:22px;transition:opacity .15s;position:absolute;bottom:0;right:0}.obj:hover .obj-resize,.obj.dragging .obj-resize{opacity:.7}@media (pointer:coarse){.obj-pin{opacity:1}.obj-resize{opacity:.7;width:30px;height:30px}.obj-grip{height:30px}.obj-grip:before{opacity:.7;top:12px}}.obj-media.obj-media-fill{height:100%;min-height:min(360px,60vh)}.obj-media-fill .obj-youtube{border:1px solid var(--edge);background:#000;flex:auto;width:100%;height:100%;min-height:0;display:block}.profile-badge{top:max(56px, calc(env(safe-area-inset-top) + 48px));border:1px solid var(--edge);background:var(--glass);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);color:var(--ink);cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;border-radius:12px;align-items:center;gap:8px;padding:6px 12px 6px 8px;display:flex;position:fixed;left:12px}.profile-shield{color:var(--accent);flex:none}.profile-shield.member{color:#8ff0b0}.profile-shield.guest{color:var(--warn)}.profile-text{min-width:0;line-height:1.15;display:grid}.profile-text b{text-overflow:ellipsis;white-space:nowrap;max-width:130px;font-size:.86rem;font-weight:600;overflow:hidden}.profile-text small{font:500 .64rem var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}@media (width<=600px){.profile-text{display:none}.profile-badge{padding:4px 6px}}.obj[style*=height]>.obj-sandbox{height:100%}.obj[style*=height]>.obj-sandbox iframe{min-height:0}.hud{--hud-line:color-mix(in srgb, var(--accent) 62%, transparent);--hud-line-dim:color-mix(in srgb, var(--accent) 26%, transparent);--hud-glow:color-mix(in srgb, var(--accent) 42%, transparent);--hud-bg:#030d14d1;--hud-bg-hi:#081e2ae6;--cut:10px;color:var(--ink);font-family:var(--mono);-webkit-user-select:none;user-select:none}.hud-cut{background:var(--hud-line);clip-path:polygon(0 0, calc(100% - var(--cut)) 0, 100% var(--cut), 100% 100%, var(--cut) 100%, 0 calc(100% - var(--cut)));position:relative}.hud-cut:before{content:"";background:var(--hud-bg);clip-path:polygon(0 0, calc(100% - var(--cut) + 1px) 0, 100% calc(var(--cut) - 1px), 100% 100%, calc(var(--cut) - 1px) 100%, 0 calc(100% - var(--cut) + 1px));z-index:0;transition:background .14s ease-out;position:absolute;inset:1px}.hud-cut>*{z-index:1;position:relative}.hud-kicker{letter-spacing:.22em;text-transform:uppercase;color:var(--muted);margin:0 0 6px 2px;font-size:.62rem}.hud-profile{top:max(56px, calc(env(safe-area-inset-top) + 48px));cursor:grab;touch-action:none;align-items:center;display:flex;position:fixed;left:12px}.hud-emblem{z-index:2;background:radial-gradient(circle, var(--hud-bg-hi), var(--hud-bg));width:64px;height:64px;box-shadow:0 0 18px var(--hud-glow), inset 0 0 12px var(--hud-line-dim);border-radius:50%;flex:none;place-items:center;display:grid;position:relative}.hud-emblem-svg{color:var(--accent)}.hud-emblem-svg.member{color:#8ff0b0}.hud-emblem-svg.guest{color:var(--warn)}.hud-ring-chase{opacity:0;transform-origin:32px 32px}.hud-tag{--cut:9px;gap:1px;min-width:176px;margin-left:-14px;padding:6px 18px 7px 24px;line-height:1.15;display:grid}.hud-tag b{letter-spacing:.02em;text-overflow:ellipsis;white-space:nowrap;max-width:190px;font-size:.95rem;font-weight:600;overflow:hidden}.hud-tag small{letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-size:.62rem}.hud-tag .hud-tag-top{color:var(--accent);letter-spacing:.2em}.hud-tag:after{content:"";background:var(--accent);width:2px;box-shadow:0 0 8px var(--hud-glow);z-index:1;position:absolute;top:8px;bottom:8px;left:10px}.hud-profile.member .hud-tag:after{background:#8ff0b0}.hud-profile.guest .hud-tag:after{background:var(--warn)}.hud-clock{top:max(56px, calc(env(safe-area-inset-top) + 48px));cursor:grab;touch-action:none;text-align:left;position:fixed;left:332px}.hud-clock time{align-items:flex-end;gap:14px;display:flex}.hud-date{justify-items:start;line-height:1;display:grid}.hud-day{letter-spacing:.02em;text-shadow:0 0 14px var(--hud-glow);font-size:3.1rem;font-weight:700;display:flex}.hud-month{background:var(--accent);color:#031018;letter-spacing:.22em;text-transform:uppercase;clip-path:polygon(0 0,100% 0,calc(100% - 6px) 100%,0 100%);margin-top:2px;padding:1px 8px 1px 6px;font-size:.7rem;font-weight:700}.hud-weekday{letter-spacing:.2em;text-transform:uppercase;color:var(--muted);margin-top:3px;font-size:.64rem}.hud-time-block{gap:5px;min-width:150px;padding-bottom:4px;display:grid}.hud-clock-time{letter-spacing:.06em;align-items:baseline;font-size:1.55rem;display:flex}.hud-colon{color:var(--accent);margin:0 1px;font-style:normal}.hud-period{letter-spacing:.2em;color:var(--muted);margin-left:6px;font-size:.62rem}.hud-line{background:linear-gradient(90deg, var(--hud-line), transparent);height:1px;position:relative}.hud-line:after{content:"";border:1px solid var(--accent);background:var(--hud-bg);border-radius:50%;width:7px;height:7px;position:absolute;top:-3px;left:-3px}.hud-dot{background:var(--accent);width:5px;height:5px;box-shadow:0 0 8px var(--accent);border-radius:50%;position:absolute;top:-2px;left:0}.hud-digit{display:inline-block}.hud-launcher{left:12px;top:calc(max(56px, env(safe-area-inset-top) + 48px) + 86px);cursor:grab;touch-action:none;position:fixed}.hud-stack{gap:6px;margin:0;padding:0;list-style:none;display:grid}.hud-tab{--cut:9px;align-items:stretch;min-width:176px;transition:transform .14s ease-out,filter .14s ease-out;display:flex}.hud-tab-main{color:var(--ink);font:inherit;letter-spacing:.06em;text-align:left;cursor:pointer;background:0 0;border:0;flex:1;grid-template-columns:26px 1fr;align-items:center;gap:10px;min-height:40px;padding:7px 18px 9px 10px;font-size:.82rem;display:grid;position:relative;overflow:hidden}.hud-tab-main:focus-visible{outline:1px dashed var(--accent);outline-offset:-3px}.hud-icon{background:var(--hud-line-dim);width:26px;height:26px;color:var(--accent);place-items:center;font-size:.95rem;transition:background .14s ease-out,color .14s;display:grid}.hud-tab-label{text-transform:uppercase;letter-spacing:.14em;font-size:.74rem}.hud-tab-engaged{letter-spacing:.2em;color:var(--accent);opacity:0;font-size:.74rem;position:absolute;top:50%;left:46px;transform:translateY(-50%)}.hud-tab:after{content:"";background:var(--accent);width:26%;height:2px;box-shadow:0 0 6px var(--hud-glow);z-index:2;transition:width .22s ease-out;position:absolute;bottom:4px;left:12px}.hud-sweep,.hud-scan{pointer-events:none;opacity:0;position:absolute;inset:0}.hud-sweep{background:linear-gradient(100deg, transparent 30%, color-mix(in srgb, var(--accent) 38%, transparent) 50%, transparent 70%);transform:translate(-100%)}.hud-scan{background:linear-gradient(180deg, transparent, color-mix(in srgb, var(--accent) 55%, transparent) 50%, transparent);height:14px;inset:-14px 0 auto}.hud-ripple{background:radial-gradient(circle, color-mix(in srgb, var(--accent) 55%, transparent), transparent 62%);opacity:.9;pointer-events:none;border-radius:50%;animation:.6s ease-out forwards hud-ripple;position:absolute;transform:scale(0)}@media (hover:hover){.hud-tab:hover{filter:brightness(1.22);transform:translate(6px)}.hud-tab:hover:after{width:calc(100% - 24px)}.hud-tab:hover:before{background:var(--hud-bg-hi)}.hud-tab:hover .hud-icon{background:var(--accent);color:#031018}.hud-tab:hover .hud-sweep{opacity:1;animation:.6s ease-out hud-sweep}}.hud-tab:active{transform:translate(3px)scale(.97)}.hud-tab:active:before{background:color-mix(in srgb, var(--accent) 18%, var(--hud-bg))}.hud-tab.engaged .hud-tab-label{opacity:0}.hud-tab.engaged .hud-tab-engaged{opacity:1;animation:.65s steps(2,end) hud-flicker}.hud-tab.engaged .hud-scan{opacity:1;animation:.45s linear hud-scan}.hud-tab.current:before{background:var(--hud-bg-hi)}.hud-tab.current:after{width:calc(100% - 24px)}.hud-tab.current .hud-tab-title{color:var(--accent)}.hud-btn{background:var(--hud-line-dim);width:36px;height:32px;color:var(--ink);cursor:pointer;clip-path:polygon(7px 0,100% 0,calc(100% - 7px) 100%,0 100%);border:0;place-items:center;padding:0;transition:background .14s ease-out,color .14s,transform .1s;display:inline-grid;position:relative;overflow:hidden}.hud-btn sup{color:var(--accent);font-size:.55rem;position:absolute;top:3px;right:6px}.hud-btn.on,.hud-btn[aria-pressed=true]{color:var(--accent);background:color-mix(in srgb, var(--accent) 24%, transparent)}.hud-btn-main{background:var(--accent);color:#031018;width:52px;height:36px}.hud-btn:focus-visible{outline:1px dashed var(--accent);outline-offset:2px}@media (hover:hover){.hud-btn:hover{background:color-mix(in srgb, var(--accent) 44%, transparent);color:#fff}.hud-btn-main:hover{background:color-mix(in srgb, var(--accent) 78%, #fff);color:#031018}}.hud-btn:active{transform:scale(.94)}.hud-range{appearance:none;cursor:pointer;--fill:0%;background:0 0;width:100%;height:14px;margin:0}.hud-range::-webkit-slider-runnable-track{background:linear-gradient(90deg, var(--accent) var(--fill), var(--hud-line-dim) var(--fill));height:2px}.hud-range::-moz-range-track{background:var(--hud-line-dim);height:2px}.hud-range::-moz-range-progress{background:var(--accent);height:2px}.hud-range::-webkit-slider-thumb{-webkit-appearance:none;background:var(--accent);clip-path:polygon(0 0,100% 0,100% 70%,50% 100%,0 70%);width:9px;height:13px;box-shadow:0 0 8px var(--hud-glow);border:0;margin-top:-5.5px}.hud-range::-moz-range-thumb{background:var(--accent);border:0;border-radius:0;width:9px;height:13px}.hud-range:disabled{opacity:.4;cursor:default}.hud-chip{border:1px solid var(--hud-line-dim);color:var(--muted);font:inherit;letter-spacing:.16em;text-transform:uppercase;cursor:pointer;background:0 0;padding:4px 12px;font-size:.66rem;transition:color .14s,border-color .14s,background .14s}.hud-chip.on{color:var(--accent);border-color:var(--accent);background:color-mix(in srgb, var(--accent) 12%, transparent)}@media (hover:hover){.hud-chip:hover{color:var(--ink);border-color:var(--hud-line)}}.hud-mini{border:1px solid var(--hud-line-dim);width:30px;height:30px;color:var(--accent);font:inherit;cursor:pointer;background:0 0;align-self:center;margin-right:8px;font-size:1.05rem;transition:background .14s,color .14s}@media (hover:hover){.hud-mini:hover{background:var(--accent);color:#031018}}.hud-music{--cut:14px;cursor:grab;touch-action:none;padding:10px 14px 12px;position:fixed;bottom:12px;right:12px}.hud-music.mini{width:min(560px,100vw - 24px)}.hud-music.full{width:min(1000px,100vw - 24px);max-height:calc(100vh - 24px);padding:12px 16px 16px;overflow:auto}.hud-music-head{justify-content:space-between;align-items:center;margin-bottom:6px;display:flex}.hud-music-head .hud-kicker{margin:0}.hud-head-actions{gap:4px;display:flex}.hud-head-actions .hud-btn{width:30px;height:24px}.hud-music-body{align-items:center;gap:16px;display:flex}.hud-music.full .hud-music-body{align-items:stretch;gap:22px}.hud-music-left{flex:none;align-items:center;gap:12px;display:flex}.hud-music-main{flex:1;align-content:center;gap:8px;min-width:0;display:grid}.hud-now{gap:2px;min-width:0;display:grid}.hud-title{letter-spacing:.02em;white-space:nowrap;text-overflow:ellipsis;font-variant-ligatures:none;font-size:1rem;font-weight:600;overflow:hidden}.hud-music.full .hud-title{white-space:normal;font-size:1.35rem}.hud-sub{letter-spacing:.1em;text-transform:uppercase;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:.7rem;overflow:hidden}.hud-timeline{grid-template-columns:auto 1fr auto;align-items:center;gap:10px;display:grid}.hud-time{letter-spacing:.1em;color:var(--muted);font-variant-numeric:tabular-nums;font-size:.7rem}.hud-controls{align-items:center;gap:6px;display:flex}.hud-controls .hud-btn:first-child{margin-right:6px}.hud-controls .hud-btn:last-child{margin-left:6px}.hud-volume{grid-template-columns:auto 1fr;align-items:center;gap:8px;max-width:260px;display:grid}.hud-unlock{border:1px solid var(--warn);color:var(--warn);font:inherit;letter-spacing:.16em;text-transform:uppercase;cursor:pointer;background:0 0;justify-self:start;padding:4px 12px;font-size:.66rem;animation:1.4s ease-in-out infinite hud-pulse}.hud-dial{--bass:0;flex:none;position:relative}.hud-dial-svg{width:100%;height:100%;position:absolute;inset:0;overflow:visible}.hud-dial-ticks{fill:none;stroke:var(--hud-line);stroke-width:3px;stroke-dasharray:1 5.02}.hud-dial-track{fill:none;stroke:var(--hud-line-dim);stroke-width:2px}.hud-dial-arc{fill:none;stroke:var(--accent);stroke-width:3px;stroke-linecap:butt;filter:drop-shadow(0 0 4px var(--hud-glow));transition:stroke-dasharray .25s linear}.hud-dial-inner{fill:none;stroke:var(--hud-line-dim);stroke-width:1px}.hud-needle{transform-origin:100px 100px;opacity:.85}.hud-needle line{stroke:var(--accent);stroke-width:1.4px;stroke-linecap:round}.hud-needle circle{fill:var(--accent);filter:drop-shadow(0 0 4px var(--accent))}.hud-spectrum{pointer-events:none;position:absolute;inset:0}.hud-cover{color:var(--hud-line);background:var(--hud-bg-hi) center / cover no-repeat;box-shadow:0 0 16px var(--hud-line-dim), inset 0 0 14px #0000008c;border:1px solid var(--hud-line);transform:scale(calc(1 + var(--bass) * .045));border-radius:50%;place-items:center;display:grid;position:absolute;inset:20%}.hud-levels{flex-direction:column-reverse;gap:3px;width:9px;height:220px;display:flex}.hud-levels i{background:var(--hud-line-dim);flex:1;transition:background 80ms linear,box-shadow 80ms linear;display:block}.hud-levels i.on{background:var(--accent);box-shadow:0 0 6px var(--hud-glow)}.hud-levels i:nth-child(n+10).on{background:var(--warn);box-shadow:0 0 6px color-mix(in srgb, var(--warn) 50%, transparent)}.hud-playlist{grid-template-rows:auto auto minmax(0,1fr);gap:8px;width:300px;min-width:0;max-height:340px;display:grid}.hud-tabs{flex-wrap:wrap;gap:6px;display:flex}.hud-search{border:1px solid var(--hud-line-dim);width:100%;color:var(--ink);font:inherit;background:#0000004d;padding:6px 10px;font-size:.8rem}.hud-search:focus{border-color:var(--accent);outline:none}.hud-list{align-content:start;gap:5px;min-height:0;margin:0;padding:0 4px 0 0;list-style:none;display:grid;overflow-y:auto}.hud-list .hud-tab{--cut:7px;min-width:0}.hud-list .hud-tab-main{grid-template-columns:1fr;gap:1px;min-height:0;padding:6px 12px 8px 14px;display:grid}.hud-tab-title{letter-spacing:.03em;white-space:nowrap;text-overflow:ellipsis;font-size:.8rem;overflow:hidden}.hud-list small{letter-spacing:.12em;text-transform:uppercase;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:.62rem;overflow:hidden}.hud-source{letter-spacing:.18em;color:#031018;background:var(--accent);clip-path:polygon(0 0,100% 0,calc(100% - 4px) 100%,0 100%);vertical-align:1px;margin-left:8px;padding:0 5px;font-size:.56rem;font-style:normal}.hud-notice{border-left:2px solid var(--warn);letter-spacing:.06em;color:var(--warn);margin:0;padding:4px 10px;font-size:.7rem}.hud-empty{color:var(--muted);padding:10px 4px;font-size:.75rem}@keyframes hud-spin{to{transform:rotate(360deg)}}@keyframes hud-sweep{0%{transform:translate(-100%)}to{transform:translate(100%)}}@keyframes hud-scan{0%{top:-14px}to{top:calc(100% + 14px)}}@keyframes hud-ripple{to{opacity:0;transform:scale(1)}}@keyframes hud-flicker{0%,to{opacity:1}25%{opacity:.2}50%{opacity:1}75%{opacity:.45}}@keyframes hud-pulse{0%,to{opacity:1}50%{opacity:.45}}@keyframes hud-boot{0%{opacity:0;filter:brightness(2.2);transform:translate(-14px)}30%{opacity:1}42%{opacity:.35}56%{opacity:1}70%{opacity:.7}to{opacity:1;filter:none;transform:none}}@keyframes hud-roll{0%{opacity:0;transform:translateY(60%)}to{opacity:1;transform:none}}@keyframes hud-blink{0%,49%{opacity:1}50%,to{opacity:.25}}@keyframes hud-travel{0%{left:0}to{left:calc(100% - 5px)}}@keyframes hud-flare{0%{box-shadow:0 0 18px var(--hud-glow), 0 0 0 0 var(--accent)}60%{box-shadow:0 0 30px var(--accent), 0 0 0 14px transparent}to{box-shadow:0 0 18px var(--hud-glow), 0 0 0 0 transparent}}[data-hud-anim=full] .hud-boot{animation:.55s ease-out both hud-boot;animation-delay:calc(var(--i,0) * 80ms)}[data-hud-anim=full] .hud-ring-turn{transform-origin:32px 32px;animation:40s linear infinite hud-spin}[data-hud-anim=full] .hud-profile.speaking .hud-ring-turn{animation-duration:7s}[data-hud-anim=full] .hud-profile.speaking .hud-emblem{animation:.9s ease-out hud-flare}[data-hud-anim=full] .hud-profile.busy .hud-ring-chase{opacity:1;animation:1.5s linear infinite hud-spin}[data-hud-anim=full] .hud-profile.listening .hud-emblem{box-shadow:0 0 26px var(--accent), inset 0 0 14px var(--hud-line-dim)}[data-hud-anim=full] .hud-digit{animation:.35s ease-out hud-roll}[data-hud-anim=full] .hud-colon{animation:1s step-end infinite hud-blink}[data-hud-anim=full] .hud-dot{animation:1s linear infinite hud-travel}[data-hud-anim=full] .hud-dial.playing .hud-needle{animation:3s linear infinite hud-spin}[data-hud-anim=full] .hud-dial.playing .hud-cover{animation:22s linear infinite hud-spin-keep}@keyframes hud-spin-keep{to{rotate:360deg}}[data-hud-anim=full] .hud-tab-main:focus-visible{animation:1.6s ease-in-out infinite hud-pulse}[data-hud-anim=reduced] .hud-boot,[data-hud-anim=reduced] .hud-digit,[data-hud-anim=reduced] .hud-colon,[data-hud-anim=reduced] .hud-dot{animation:none}[data-hud-anim=reduced] .hud-needle{display:none}[data-hud-anim=off] .hud *,[data-hud-anim=off] .hud{transition:none!important;animation:none!important}[data-hud-anim=off] .hud-tab:hover{transform:none}[data-hud-anim=off] .hud-needle{display:none}@media (prefers-reduced-motion:reduce){.hud *,.hud{transition:none!important;animation:none!important}.hud-tab:hover{transform:none}}@media (width<=900px){.hud-clock{left:12px;top:calc(max(56px, env(safe-area-inset-top) + 48px) + 76px)}.hud-launcher{top:calc(max(56px, env(safe-area-inset-top) + 48px) + 180px)}}@media (width<=640px){.hud-tag{min-width:120px}.hud-tag b{max-width:110px}.hud-day{font-size:2.2rem}.hud-launcher .hud-tab{min-width:0}.hud-launcher .hud-tab-main{grid-template-columns:26px;padding:7px 8px 9px}.hud-launcher .hud-tab-label,.hud-launcher .hud-tab-engaged,.hud-launcher .hud-kicker{display:none}.hud-music.mini{bottom:56px}.hud-music.full .hud-music-body{flex-direction:column;align-items:center}.hud-music.full .hud-music-left{flex-wrap:wrap;justify-content:center}.hud-playlist{width:100%;max-height:220px}.hud-levels{height:120px}}
|
package/dist/web/index.html
CHANGED
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
9
9
|
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
|
|
10
10
|
<title>Friend</title>
|
|
11
|
-
<script type="module" crossorigin src="/assets/index-
|
|
12
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
11
|
+
<script type="module" crossorigin src="/assets/index-CfLYyqNC.js"></script>
|
|
12
|
+
<link rel="stylesheet" crossorigin href="/assets/index-JCj4prbi.css">
|
|
13
13
|
</head>
|
|
14
14
|
<body>
|
|
15
15
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "friend-assistant",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.52",
|
|
4
4
|
"description": "A self-hosted personal AI assistant for your own PC: a full-screen stage, voice, tools with your approval, and your Claude subscription or a local model.",
|
|
5
5
|
"keywords": ["ai", "assistant", "jarvis", "voice", "claude", "ollama", "mcp", "self-hosted"],
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.orb-layer,.holo-layer{--orb-cyan:#35f0ff;--orb-cyan-soft:#35f0ff2e;--orb-teal:#1296a561;--orb-teal-edge:#35f0ff73;--orb-teal-hover:#35f0ff9e;--orb-orange:#ff9a2e;--orb-grey:#8b98a3;--orb-ink:#e9fdff;--orb-text:#9fe9f2;--orb-danger:#ff5a6e;--orb-glass:#06121cd1;--orb-tint:#3c0a5a8c;--orb-font:Orbitron, Rajdhani, "Segoe UI", system-ui, sans-serif;--orb-open-ms:.25s;font-family:var(--orb-font);grid-template-rows:minmax(0,1fr);place-items:center;display:grid;inset:0}.orb-backdrop{background:radial-gradient(circle at 50% 50%, var(--orb-tint), #05020ee0);-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);animation:.2s ease-out orb-fade;position:absolute;inset:0}.orb-svg{pointer-events:none;width:min(94vmin,680px);height:min(94vmin,680px);position:relative;overflow:visible}.orb-svg .orb-arc:focus-visible,.orb-svg .orb-core:focus-visible{outline:none}.orb-arc,.orb-core{pointer-events:auto;cursor:pointer;outline:none}.orb-arc{color:#bff9ff;transform-origin:0 0;animation:orb-arc-in var(--orb-open-ms) ease-out both}.orb-arc path{fill:var(--orb-teal);stroke:var(--orb-teal-edge);stroke-width:1px;transition:fill .16s ease-out,filter .16s ease-out}.orb-arc:hover path,.orb-arc.is-hover path,.orb-arc:focus-visible path{fill:var(--orb-teal-hover);filter:drop-shadow(0 0 8px var(--orb-cyan))}.orb-arc.is-open path,.orb-sub.is-on path{fill:#35f0ff80;stroke:var(--orb-cyan)}.orb-sub.is-danger path{fill:#ff5a6e42;stroke:#ff5a6eb3}.orb-sub.is-danger:hover path,.orb-sub.is-danger.is-hover path,.orb-sub.is-danger:focus-visible path{fill:#ff5a6e8c;filter:drop-shadow(0 0 8px var(--orb-danger))}.orb-arc-label{letter-spacing:.16em;text-transform:uppercase;fill:var(--orb-text);pointer-events:none;font-size:9px;font-weight:600}.orb-sub.is-on .orb-arc-label{fill:#fff}.orb-halo{fill:none;stroke:var(--orb-cyan-soft);stroke-width:7px;filter:blur(3px);animation:3.2s ease-in-out infinite alternate orb-pulse}.orb-disc{stroke:#35f0ff59;stroke-width:1px}.orb-ring{fill:none;stroke:var(--orb-cyan);stroke-width:2.5px;filter:drop-shadow(0 0 5px var(--orb-cyan));transition:filter .2s ease-out}.orb-ticks{fill:none;stroke:#35f0ff99;stroke-width:5px;stroke-dasharray:1.1 3.014}.orb-gauge{fill:none;stroke:var(--orb-orange);stroke-width:3.5px;stroke-linecap:round;filter:drop-shadow(0 0 3px var(--orb-orange))}.orb-segments{fill:none;stroke:var(--orb-grey);stroke-width:3px;stroke-dasharray:9 3.5;opacity:.8}.orb-name{letter-spacing:.28em;fill:var(--orb-ink);filter:drop-shadow(0 0 4px var(--orb-cyan));pointer-events:none;font-weight:700}.orb-caption{letter-spacing:.3em;fill:var(--orb-cyan);pointer-events:none;font-size:6.5px;font-weight:600}.orb-core:hover .orb-ring,.orb-core:focus-visible .orb-ring,.orb-hover .orb-ring{filter:drop-shadow(0 0 11px var(--orb-cyan))}.orb-busy .orb-gauge{transform-origin:0 0;animation:2.4s linear infinite orb-spin}@keyframes orb-fade{0%{opacity:0}}@keyframes orb-arc-in{0%{opacity:0;transform:scale(.72)}}@keyframes orb-pulse{0%{opacity:.45}to{opacity:1}}@keyframes orb-spin{to{transform:rotate(360deg)}}.holo-layer{z-index:1000;pointer-events:none;padding:12px;position:fixed}.holo-panel{pointer-events:auto;width:min(1040px,100%);min-height:0;max-height:100%;color:var(--orb-text);background:linear-gradient(180deg, #081824e6, var(--orb-glass));border:1px solid var(--orb-teal-edge);clip-path:polygon(14px 0,calc(100% - 14px) 0,100% 14px,100% calc(100% - 14px),calc(100% - 14px) 100%,14px 100%,0 calc(100% - 14px),0 14px);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);grid-template-rows:auto minmax(0,1fr) auto;gap:10px;padding:18px 64px 16px;animation:.3s ease-out holo-in;display:grid;position:relative}.holo-panel:before,.holo-panel:after{content:"";background:linear-gradient(180deg, transparent, var(--orb-cyan), transparent);width:5px;box-shadow:0 0 14px var(--orb-cyan);position:absolute;top:12%;bottom:12%}.holo-panel:before{left:14px}.holo-panel:after{right:14px}.holo-head{justify-content:center;align-items:center;gap:14px;display:flex}.holo-title{letter-spacing:.32em;text-transform:uppercase;color:var(--orb-ink);text-shadow:0 0 8px var(--orb-cyan);margin:0;font-size:15px;font-weight:600}.holo-dots{gap:6px;display:flex}.holo-dots i{background:#35f0ff40;width:18px;height:3px}.holo-dots i.on{background:var(--orb-cyan);box-shadow:0 0 8px var(--orb-cyan)}.holo-page{width:52px;height:140px;color:var(--orb-cyan);cursor:pointer;background:0 0;border:0;padding:0;position:absolute;top:50%;translate:0 -50%}.holo-page:before{content:"";background:var(--orb-cyan);opacity:.45;transition:opacity .16s,filter .16s;position:absolute;inset:10px 8px}.holo-prev:before{clip-path:polygon(100% 0,0 50%,100% 100%,100% 82%,36% 50%,100% 18%)}.holo-next:before{clip-path:polygon(0 0,100% 50%,0 100%,0 82%,64% 50%,0 18%)}.holo-page:hover:before,.holo-page:focus-visible:before{opacity:1;filter:drop-shadow(0 0 8px var(--orb-cyan))}.holo-page:focus-visible{outline:none}.holo-prev{left:18px}.holo-next{right:18px}.holo-prev span,.holo-next span{font-size:0;position:absolute;inset:0}.holo-body{min-height:0;padding:4px 6px;overflow-y:auto}.holo-foot{border:1px solid var(--orb-teal-edge);background:#35f0ff0d;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:14px;padding:10px 12px;display:grid}.holo-help{letter-spacing:.04em;color:var(--orb-text);opacity:.85;margin:0;font-size:11px;line-height:1.5}.holo-help b{color:var(--orb-orange);font-weight:600}.holo-actions{flex-wrap:wrap;justify-content:flex-end;gap:10px;display:flex}.holo-btn{min-width:112px;font:600 12px var(--orb-font);letter-spacing:.3em;text-transform:uppercase;color:var(--orb-ink);border:1px solid var(--orb-teal-edge);clip-path:polygon(10px 0,100% 0,calc(100% - 10px) 100%,0 100%);cursor:pointer;background:#35f0ff1f;padding:10px 18px;transition:background .16s,box-shadow .16s}.holo-btn:hover:not(:disabled),.holo-btn:focus-visible{box-shadow:0 0 12px var(--orb-cyan);background:#35f0ff4d;outline:none}.holo-btn:disabled{opacity:.35;cursor:default}.holo-btn.quiet{letter-spacing:.18em;background:0 0;min-width:0}.holo-btn.warn{border-color:var(--orb-orange);color:var(--orb-orange)}.holo-tabs{gap:8px;margin-bottom:12px;display:flex}.holo-tab{font:600 12px var(--orb-font);letter-spacing:.24em;text-transform:uppercase;color:var(--orb-text);border:1px solid var(--orb-teal-edge);clip-path:polygon(8px 0,100% 0,calc(100% - 8px) 100%,0 100%);cursor:pointer;background:0 0;padding:8px 18px;transition:background .16s,box-shadow .16s}.holo-tab small{color:var(--orb-cyan);margin-left:6px}.holo-tab:hover,.holo-tab:focus-visible{background:#35f0ff24;outline:none}.holo-tab.on{color:var(--orb-ink);background:#35f0ff42;box-shadow:0 0 12px #35f0ff80}.holo-cards{grid-template-columns:repeat(2,minmax(0,1fr));align-content:start;gap:12px;min-height:min(432px,55vh);margin:0;padding:0;list-style:none;display:grid}.holo-card{border:1px solid var(--orb-teal-edge);clip-path:polygon(10px 0,100% 0,100% calc(100% - 10px),calc(100% - 10px) 100%,0 100%,0 10px);background:#35f0ff0d;grid-template-rows:auto 1fr auto;gap:8px;min-height:132px;padding:12px 14px;transition:background .16s;display:grid}.holo-card:hover{background:#35f0ff1a}.holo-card-head{justify-content:space-between;align-items:baseline;gap:10px;display:flex}.holo-card-head strong{letter-spacing:.1em;text-transform:uppercase;color:var(--orb-ink);font-size:13px}.holo-card-head small,.holo-version{color:var(--orb-text);opacity:.75}.holo-card-note{overflow-wrap:anywhere;font-size:12px;line-height:1.5}.holo-card-actions{flex-wrap:wrap;gap:8px;display:flex}.holo-badge{letter-spacing:.18em;text-transform:uppercase;white-space:nowrap;border:1px solid;padding:2px 8px;font-size:10px}.holo-badge.on{color:var(--orb-cyan);box-shadow:0 0 8px #35f0ff66}.holo-badge.off{color:var(--orb-grey)}.holo-badge.warn{color:var(--orb-orange)}.holo-badge.error{color:var(--orb-danger)}.holo-btn.sm{letter-spacing:.2em;min-width:0;padding:7px 12px;font-size:10px}.holo-btn.go{background:#35f0ff42}.holo-btn.warn{background:0 0}@media (width<=720px){.holo-cards{grid-template-columns:1fr}}.holo-body .settings-field span{letter-spacing:.08em;text-transform:uppercase;color:var(--orb-text);font-size:11px}.holo-body input:not([type=checkbox]):not([type=range]),.holo-body select,.holo-body textarea{color:var(--orb-ink);border:1px solid var(--orb-teal-edge);background:#020a10b3;border-radius:0}.holo-body input:focus,.holo-body select:focus,.holo-body textarea:focus{border-color:var(--orb-cyan);outline:none;box-shadow:0 0 8px #35f0ff80}.holo-body .plugins-heading{letter-spacing:.24em;text-transform:uppercase;color:var(--orb-cyan)}.holo-body .approval-actions{flex-wrap:wrap;gap:10px;margin-top:12px;display:flex}.holo-body .approval-actions button{min-width:112px;font:600 12px var(--orb-font);letter-spacing:.24em;text-transform:uppercase;color:var(--orb-ink);border:1px solid var(--orb-teal-edge);clip-path:polygon(10px 0,100% 0,calc(100% - 10px) 100%,0 100%);cursor:pointer;background:#35f0ff1a;border-radius:0;padding:9px 18px}.holo-body .approval-actions button.primary{background:#35f0ff47}.holo-body .approval-actions button.danger{color:var(--orb-orange);border-color:var(--orb-orange);background:0 0}.holo-body .approval-actions button:hover:not(:disabled),.holo-body .approval-actions button:focus-visible{box-shadow:0 0 12px var(--orb-cyan);background:#35f0ff5c;outline:none}.holo-body .approval-actions button:disabled{opacity:.35;cursor:default}.holo-body .auth-note,.holo-body .connector-steps{color:var(--orb-text)}.holo-body .auth-error{color:var(--orb-danger)}.holo-body .connector-warning{color:var(--orb-orange)}.holo-body .connector-form{max-width:640px;margin:0 auto}@keyframes holo-in{0%{opacity:0;transform:scale(.96)}}@media (width<=720px){.holo-panel{padding:14px 14px 12px}.holo-page{width:52px;height:44px;top:10px;translate:none}.holo-page:before{inset:8px 12px}.holo-prev{left:4px}.holo-next{right:4px}.holo-foot{grid-template-columns:1fr}}@media (prefers-reduced-motion:reduce){.orb-backdrop,.orb-arc,.orb-halo,.orb-busy .orb-gauge,.holo-panel{animation:none}.orb-arc path,.orb-ring,.holo-btn,.holo-page{transition:none}}.of-tab{--of-c:#3fd8ff;--of-o:#fb923c;--of-g:#34d399;flex-direction:column;gap:14px;font-family:ui-monospace,Cascadia Code,Consolas,monospace;display:flex}.of-code{letter-spacing:.22em;color:color-mix(in srgb, var(--of-c) 70%, transparent);font-size:10px}.of-note{color:#e0fbffb8;margin:4px 0 0;font-size:12px;line-height:1.5}.of-hero,.of-card{border:1px solid color-mix(in srgb, var(--of-c) 38%, transparent);clip-path:polygon(0 0,calc(100% - 18px) 0,100% 18px,100% 100%,18px 100%,0 calc(100% - 18px));background:linear-gradient(160deg,#081e2ac7,#040e16c7);position:relative;box-shadow:inset 0 0 30px #3fd8ff0f}.of-hero{grid-template-columns:1fr auto;align-items:center;gap:16px;padding:14px 22px 14px 16px;display:grid}.of-hero h3{letter-spacing:.2em;text-transform:uppercase;color:#e0fbff;text-shadow:0 0 12px color-mix(in srgb, var(--of-c) 60%, transparent);margin:2px 0 0;font-size:18px}.of-tab[data-on=true] .of-hero{border-color:color-mix(in srgb, var(--of-g) 60%, transparent)}.of-switch{cursor:pointer;grid-template-columns:auto auto;grid-template-areas:"track state""text text";place-items:center start;gap:4px 10px;display:grid}.of-switch input{opacity:0;width:1px;height:1px;position:absolute}.of-track{border:1px solid var(--of-c);clip-path:polygon(6px 0,100% 0,calc(100% - 6px) 100%,0 100%);background:#00141ecc;grid-area:track;width:52px;height:24px;display:block;position:relative}.of-track i{background:var(--of-c);opacity:.55;clip-path:polygon(4px 0,100% 0,calc(100% - 4px) 100%,0 100%);width:20px;height:16px;transition:left .2s,background .2s,opacity .2s;position:absolute;top:3px;left:4px}.of-switch input:checked+.of-track i{background:var(--of-g);opacity:1;box-shadow:0 0 10px var(--of-g);left:26px}.of-switch input:focus-visible+.of-track{outline:2px solid var(--of-c);outline-offset:2px}.of-state{letter-spacing:.2em;color:var(--of-o);grid-area:state;font-size:11px}.of-tab[data-on=true] .of-state{color:var(--of-g)}.of-switch-text{color:#e0fbff;grid-area:text;font-size:12px}.of-card{padding:0 0 14px}.of-card-head{background:linear-gradient(90deg, color-mix(in srgb, var(--of-c) 22%, transparent), transparent 70%);border-bottom:1px solid color-mix(in srgb, var(--of-c) 35%, transparent);align-items:baseline;gap:12px;padding:8px 18px 8px 14px;display:flex}.of-card-head h4{letter-spacing:.24em;text-transform:uppercase;color:var(--of-c);margin:0;font-size:13px;font-weight:600}.of-card>.of-note{margin-top:8px;padding:0 18px 0 14px}.of-card-body{flex-direction:column;gap:10px;padding:10px 18px 0 14px;display:flex}.of-grid{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px 14px;display:grid}.of-field{flex-direction:column;gap:4px;min-width:0;display:flex}.of-label{letter-spacing:.16em;text-transform:uppercase;color:color-mix(in srgb, var(--of-c) 80%, transparent);font-size:10px}.of-hint{color:#e0fbff8c;font-size:11px;line-height:1.4}.of-field input:not([type=checkbox]),.of-field select,.of-field textarea{box-sizing:border-box;color:#e0fbff;border:1px solid color-mix(in srgb, var(--of-c) 30%, transparent);border-left:3px solid var(--of-c);width:100%;font:inherit;background:#00121cb3;border-radius:0;padding:6px 9px;font-size:13px}.of-field textarea{resize:vertical;line-height:1.45}.of-field input:focus-visible,.of-field select:focus-visible,.of-field textarea:focus-visible{border-color:var(--of-c);box-shadow:0 0 12px color-mix(in srgb, var(--of-c) 45%, transparent);outline:none}.of-item{border:1px solid color-mix(in srgb, var(--of-c) 28%, transparent);background:#030e168c;flex-direction:column;gap:10px;margin:0;padding:12px 14px;display:flex;position:relative}.of-item:before,.of-item:after{content:"";border:2px solid var(--of-c);pointer-events:none;width:10px;height:10px;position:absolute}.of-item:before{border-bottom:0;border-right:0;top:-1px;left:-1px}.of-item:after{border-top:0;border-left:0;bottom:-1px;right:-1px}.of-item legend{letter-spacing:.1em;color:#e0fbff;padding:0 8px;font-size:12px}.of-add,.of-remove{font:inherit;letter-spacing:.18em;text-transform:uppercase;cursor:pointer;background:0 0;align-self:flex-start;padding:7px 14px;font-size:11px}.of-add{color:var(--of-c);border:1px dashed var(--of-c)}.of-add:hover,.of-add:focus-visible{background:color-mix(in srgb, var(--of-c) 14%, transparent);box-shadow:0 0 12px color-mix(in srgb, var(--of-c) 40%, transparent);outline:none}.of-remove{color:var(--of-o);border:1px solid color-mix(in srgb, var(--of-o) 55%, transparent)}.of-remove:hover,.of-remove:focus-visible{background:color-mix(in srgb, var(--of-o) 16%, transparent);outline:none}.of-problem{color:#ffd9b8;border-left:3px solid var(--of-o);background:color-mix(in srgb, var(--of-o) 12%, transparent);margin:0;padding:5px 9px;font-size:12px}@media (width<=560px){.of-hero{grid-template-columns:1fr}}.orbital{--ob-cyan:var(--accent,#22d3ee);--ob-green:#34d399;--ob-orange:#fb923c;--ob-dark:#031018;--ob-line:color-mix(in srgb, var(--ob-cyan) 55%, transparent);--ob-dim:color-mix(in srgb, var(--ob-cyan) 28%, transparent);z-index:5;pointer-events:none;color:#a5f3fc;font-family:Consolas,Courier New,monospace;position:absolute;inset:0}.orbital [data-tone=cyan]{--ob-tone:var(--ob-cyan)}.orbital [data-tone=green]{--ob-tone:var(--ob-green)}.orbital [data-tone=orange]{--ob-tone:var(--ob-orange)}.orbital .ob-hit{pointer-events:auto}.ob-frame{--cut:10px;background:color-mix(in srgb, var(--ob-tone,var(--ob-cyan)) 60%, transparent);clip-path:polygon(0 0, calc(100% - var(--cut)) 0, 100% var(--cut), 100% 100%, var(--cut) 100%, 0 calc(100% - var(--cut)));min-height:0;position:relative}.ob-frame:before{content:"";background:linear-gradient(color-mix(in srgb, var(--ob-dark) 94%, transparent), color-mix(in srgb, var(--ob-dark) 90%, transparent));clip-path:inherit;position:absolute;inset:1px}.ob-frame>*{position:relative}.ob-frame[data-running]:after{content:"";background:linear-gradient(100deg, transparent 0 40%, var(--ob-tone,var(--ob-cyan)) 50%, transparent 60% 100%) 0 0 / 300% 100%;clip-path:inherit;mix-blend-mode:screen;opacity:.9;animation:5s linear infinite ob-run;position:absolute;inset:0}.ob-frame[data-running]:before{z-index:1}.ob-frame-body{z-index:2;padding:6px 9px;position:relative}.ob-frame-title{z-index:2;color:var(--ob-tone,var(--ob-cyan));letter-spacing:.16em;text-transform:uppercase;justify-content:space-between;padding:5px 9px 0;font-size:10px;display:flex;position:relative}.ob-v-octagon{--cut:22px;clip-path:polygon(var(--cut) 0, calc(100% - var(--cut)) 0, 100% var(--cut), 100% calc(100% - var(--cut)), calc(100% - var(--cut)) 100%, var(--cut) 100%, 0 calc(100% - var(--cut)), 0 var(--cut))}.ob-v-slant{--cut:14px;clip-path:polygon(var(--cut) 0, 100% 0, calc(100% - var(--cut)) 100%, 0 100%)}.ob-v-bracket{clip-path:none;background:0 0}.ob-v-bracket:before{clip-path:none;border:0 solid var(--ob-tone,var(--ob-cyan));background:0 0;background:linear-gradient(var(--ob-tone,var(--ob-cyan)), var(--ob-tone,var(--ob-cyan))) top left / 18px 2px no-repeat, linear-gradient(var(--ob-tone,var(--ob-cyan)), var(--ob-tone,var(--ob-cyan))) top left / 2px 18px no-repeat, linear-gradient(var(--ob-tone,var(--ob-cyan)), var(--ob-tone,var(--ob-cyan))) top right / 18px 2px no-repeat, linear-gradient(var(--ob-tone,var(--ob-cyan)), var(--ob-tone,var(--ob-cyan))) top right / 2px 18px no-repeat, linear-gradient(var(--ob-tone,var(--ob-cyan)), var(--ob-tone,var(--ob-cyan))) bottom left / 18px 2px no-repeat, linear-gradient(var(--ob-tone,var(--ob-cyan)), var(--ob-tone,var(--ob-cyan))) bottom left / 2px 18px no-repeat, linear-gradient(var(--ob-tone,var(--ob-cyan)), var(--ob-tone,var(--ob-cyan))) bottom right / 18px 2px no-repeat, linear-gradient(var(--ob-tone,var(--ob-cyan)), var(--ob-tone,var(--ob-cyan))) bottom right / 2px 18px no-repeat;inset:0}.ob-frame[data-tone=orange]{animation:1.8s ease-in-out infinite ob-pulse}.ob-svg{width:100%;height:auto;display:block;overflow:visible}.ob-track{fill:none;stroke:var(--ob-dim)}.ob-fill{fill:none;stroke:var(--ob-tone,var(--ob-cyan));filter:url(#ob-glow);transition:stroke-dasharray .6s}.ob-eq{fill:var(--ob-tone,var(--ob-cyan));transform-box:fill-box;transform-origin:bottom;animation:.9s ease-in-out infinite alternate ob-eq}.ob-ecg-base{fill:none;stroke:var(--ob-dim);stroke-width:1.5px}.ob-ecg{fill:none;stroke:#67e8f9;stroke-width:2.5px;stroke-dasharray:140 400;filter:url(#ob-glow);animation:2.4s linear infinite ob-ecg}.ob-link{stroke:var(--ob-tone,var(--ob-cyan));stroke-width:1.5px;fill:none;filter:url(#ob-glow)}.ob-flow{stroke-dasharray:5 11;animation:1s linear infinite ob-flow}.ob-seg{stroke:var(--ob-dim);stroke-width:10px}.ob-seg[data-on=true]{stroke:var(--ob-cyan);filter:url(#ob-glow)}.ob-sweep{transform-box:view-box;transform-origin:0 0;animation:4s linear infinite ob-spin}.ob-blip{fill:var(--ob-green);filter:url(#ob-glow);animation:1.8s ease-in-out infinite ob-pulse}[data-dim] .ob-blip{fill:var(--ob-dim);filter:none;animation:none}.ob-spin{transform-box:fill-box;transform-origin:50%;animation:40s linear infinite ob-spin}.ob-breathe{transform-box:fill-box;transform-origin:50%;animation:4s ease-in-out infinite ob-breathe}.ob-ping{transform-box:fill-box;transform-origin:50%;animation:3s ease-out infinite ob-ping}.ob-blink{animation:1s steps(2,end) infinite ob-blink}.ob-node{cursor:pointer;color:#e0fbff;pointer-events:auto;background:0 0;border:0;padding:0;position:absolute;transform:translate(-50%,-50%)}.ob-node svg{filter:url(#ob-glow);width:68px;height:60px;display:block}.ob-node polygon{fill:var(--ob-dark);stroke:var(--ob-tone,var(--ob-cyan));stroke-width:1.6px}.ob-node:hover polygon,.ob-node:focus-visible polygon{fill:color-mix(in srgb, var(--ob-tone,var(--ob-cyan)) 22%, var(--ob-dark))}.ob-node:focus-visible{outline-offset:4px;outline:2px solid #fff}.ob-node[data-status=waiting] svg{animation:.9s ease-in-out infinite ob-pulse}.ob-node[data-status=idle] svg,.ob-node[data-status=add] svg{opacity:.6}.ob-node-label{letter-spacing:.1em;fill:#e0fbff;text-anchor:middle;dominant-baseline:central;font-size:11px}@keyframes ob-spin{to{transform:rotate(360deg)}}@keyframes ob-flow{to{stroke-dashoffset:-32px}}@keyframes ob-run{0%{background-position:100% 0}to{background-position:-200% 0}}@keyframes ob-pulse{0%,to{opacity:.45}50%{opacity:1}}@keyframes ob-eq{0%{transform:scaleY(calc(var(--lv,1) * .25))}to{transform:scaleY(var(--lv,1))}}@keyframes ob-ecg{to{stroke-dashoffset:-540px}}@keyframes ob-ping{0%{opacity:.8;transform:scale(.6)}to{opacity:0;transform:scale(2.4)}}@keyframes ob-breathe{0%,to{transform:scale(.96)}50%{transform:scale(1.06)}}@keyframes ob-blink{50%{opacity:0}}@keyframes ob-runline{0%{stroke-dashoffset:0}to{stroke-dashoffset:-100px}}.orbital[data-hud-anim=off],.orbital[data-hud-anim=off] *,.orbital[data-hud-anim=off] :before,.orbital[data-hud-anim=off] :after{transition:none!important;animation:none!important}.orbital[data-hud-anim=reduced] :not(.ob-pulse):not(.ob-breathe),.orbital[data-hud-anim=reduced] :before,.orbital[data-hud-anim=reduced] :after{animation:none!important}@media (prefers-reduced-motion:reduce){.orbital,.orbital *,.orbital :before,.orbital :after{transition:none!important;animation:none!important}}.orbital[data-paused],.orbital[data-paused] *,.orbital[data-paused] :before,.orbital[data-paused] :after{animation-play-state:paused!important}.ob-scene{pointer-events:none;width:100%;height:100%;position:absolute;inset:0;overflow:visible}.ob-ring-dash{fill:none;stroke:var(--ob-cyan);stroke-width:10px;stroke-dasharray:2 8;opacity:.7}.ob-ring-long{fill:none;stroke:#67e8f9;stroke-width:1.5px;stroke-dasharray:60 20 8 20}.ob-ring-thin{fill:none;stroke:var(--ob-dim);stroke-width:1px;stroke-dasharray:2 6}.ob-orbit{fill:none;stroke:var(--ob-line);stroke-opacity:.5;stroke-dasharray:3 9}.ob-fast{animation-duration:14s}.ob-reverse{animation-direction:reverse}.ob-usage-ring{pointer-events:none;position:absolute}.ob-usage-label{color:#9be9f7;font:inherit;letter-spacing:.14em;cursor:pointer;background:0 0;border:0;padding:4px 8px;font-size:11px;position:absolute}.ob-usage-label:hover,.ob-usage-label:focus-visible{color:#fff}.ob-zone{cursor:pointer;color:#bdeef7;overflow:hidden}.ob-zone:focus-visible{outline-offset:2px;outline:2px solid #fff}.ob-zone:hover{filter:brightness(1.25)}.ob-topbar{cursor:default}.ob-topbar-row{letter-spacing:.14em;color:#e0fbff;white-space:nowrap;justify-content:space-between;align-items:center;gap:12px;height:100%;font-size:12px;display:flex;overflow:hidden}.ob-status{color:var(--ob-cyan);text-overflow:ellipsis;overflow:hidden}.ob-hint{letter-spacing:.16em;color:color-mix(in srgb, var(--ob-cyan) 70%, transparent);pointer-events:none;justify-content:center;align-items:center;margin:0;font-size:11px;display:flex;position:absolute}.orbital[data-mode=compact] .ob-chips{pointer-events:none;gap:6px;display:flex;position:absolute;top:8px;left:8px;right:8px;overflow-x:auto}.ob-chip{background:color-mix(in srgb, var(--ob-dark) 90%, transparent);border:1px solid var(--ob-line);color:#e0fbff;font:inherit;clip-path:polygon(0 0,calc(100% - 8px) 0,100% 8px,100% 100%,8px 100%,0 calc(100% - 8px));cursor:pointer;flex:none;padding:6px 10px;font-size:12px}.orbital[data-mode=compact] .ob-strip{scroll-snap-type:x proximity;pointer-events:none;gap:8px;display:flex;position:absolute;bottom:110px;left:8px;right:8px;overflow-x:auto}.orbital[data-mode=compact] .ob-strip .ob-zone{position:relative}.orbital[data-mode=compact] .ob-usage-label{flex:none;align-self:center;position:relative}.ob-li{border-left:2px solid var(--ob-dim);color:#bdeef7;white-space:nowrap;text-overflow:ellipsis;margin:2px 0;padding-left:6px;font-size:12px;overflow:hidden}.ob-user{color:#e0fbff;border-color:var(--ob-cyan)}.ob-live{color:var(--ob-green);border-color:var(--ob-green)}.ob-sub{color:color-mix(in srgb, var(--ob-cyan) 60%, transparent);letter-spacing:.12em;text-transform:uppercase;font-size:10px}.ob-voice,.ob-tickets,.ob-budget{flex-direction:column;gap:2px;display:flex}.ob-static{cursor:default}.ob-approval{color:#fed7aa;grid-template-columns:64px 1fr;align-items:start;gap:8px 12px;max-height:100%;font-size:12px;display:grid;overflow:auto}.ob-summary{white-space:pre-wrap;color:#fff;font:inherit;margin:0;font-size:13px}.ob-warn{color:var(--ob-orange);animation:.9s ease-in-out infinite ob-pulse}.ob-actions{flex-wrap:wrap;gap:6px;display:flex}.ob-btn{border:1px solid var(--ob-orange);color:#fed7aa;font:inherit;letter-spacing:.1em;cursor:pointer;text-transform:uppercase;background:0 0;padding:6px 10px;font-size:11px}.ob-btn:hover:not(:disabled),.ob-btn:focus-visible{background:color-mix(in srgb, var(--ob-orange) 25%, transparent)}.ob-btn:disabled{opacity:.4;cursor:not-allowed}.ob-yes{background:color-mix(in srgb, var(--ob-orange) 20%, transparent)}.ob-backdrop{background:#0106098c;position:absolute;inset:0}.ob-expanded{cursor:default;z-index:5;overflow:hidden}.ob-expanded .ob-frame-body{flex-direction:column;gap:10px;height:calc(100% - 22px);display:flex;overflow:auto}.ob-expanded-body{flex:1;min-height:0;overflow:auto}.ob-worker{flex-direction:column;gap:4px;display:flex}.ob-worker-log{flex:1;min-height:0;overflow:auto}.ob-worker-log .ob-li{white-space:normal;word-break:break-word;overflow:visible}.ob-worker-say{gap:6px;margin-top:8px;display:flex}.ob-worker-say input{border:1px solid var(--ob-dim);color:#e0fbff;min-width:0;font:inherit;background:#00141e99;flex:1;padding:5px 8px;font-size:13px}.ob-worker-say input:focus-visible{outline:1px solid var(--ob-cyan)}.ob-worker-say button{border:1px solid var(--ob-cyan);color:#e0fbff;font:inherit;letter-spacing:.1em;text-transform:uppercase;cursor:pointer;background:0 0;padding:4px 12px;font-size:12px}.ob-worker-say button:disabled{opacity:.4;cursor:default}.ob-worker-say .ob-stop{border-color:var(--ob-orange);color:var(--ob-orange)}.ob-explain{color:color-mix(in srgb, var(--ob-cyan) 75%, transparent);margin:0;font-size:12px;line-height:1.4}.ob-close{z-index:3;color:#e0fbff;font:inherit;cursor:pointer;background:0 0;border:0;font-size:22px;line-height:1;position:absolute;top:4px;right:12px}.ob-close:hover,.ob-close:focus-visible{color:#fff;outline:1px solid var(--ob-cyan)}.ob-zone .ob-frame-body,.ob-expanded-body{flex-direction:column;min-height:0;display:flex}.ob-zone .ob-frame-body{height:calc(100% - 22px)}.ob-zone .ob-frame-body>div,.ob-expanded-body>div{flex-direction:column;flex:1 1 0;min-height:0;display:flex}.ob-zone .ob-frame-body>.ob-svg,.ob-zone .ob-frame-body>div>.ob-svg,.ob-expanded-body>.ob-svg,.ob-expanded-body>div>.ob-svg{flex:1 1 0;width:100%;height:0;min-height:0}.ob-feed{justify-content:flex-end;overflow:hidden}.ob-topbar .ob-frame-body{align-items:center;height:100%;padding-top:0;padding-bottom:0;display:flex}.ob-topbar-row{width:100%}.ob-glyph{letter-spacing:0;font-size:17px}.ob-strip>*,.ob-chips>*{pointer-events:auto}.ob-compact-status{letter-spacing:.12em;color:var(--ob-cyan);white-space:nowrap;text-overflow:ellipsis;pointer-events:none;margin:0;font-size:11px;position:absolute;top:48px;left:12px;right:12px;overflow:hidden}.ob-modal-backdrop{z-index:6;pointer-events:auto}.ob-modal{z-index:7}.ob-tier-row{align-items:center;gap:8px;display:flex}.ob-topbar{pointer-events:none;background:0 0}.ob-topbar-line{width:100%;height:100%;position:absolute;inset:0;overflow:visible}.ob-topbar-base{fill:none;stroke:var(--ob-line);stroke-width:1.5px;vector-effect:non-scaling-stroke}.ob-topbar-run{fill:none;stroke:#67e8f9;stroke-width:2.5px;vector-effect:non-scaling-stroke;stroke-dasharray:6 94;filter:url(#ob-glow);animation:5s linear infinite ob-runline}.ob-topbar-row{grid-template-columns:1fr auto 1fr;align-items:start;height:100%;padding:4px 8px 0;display:grid;position:relative}.ob-topbar-left{flex-direction:column;line-height:1.5;display:flex;overflow:hidden}.ob-topbar-left b{color:#e0fbff;letter-spacing:.14em;white-space:nowrap;font-size:12px;font-weight:400}.ob-topbar-left small{letter-spacing:.1em;color:color-mix(in srgb, var(--ob-cyan) 70%, transparent);white-space:nowrap;text-overflow:ellipsis;font-size:10px;overflow:hidden}.ob-title{color:#e0fbff;letter-spacing:.5em;text-shadow:0 0 8px var(--ob-cyan);padding-top:2px;font-size:17px}.ob-time{letter-spacing:.14em;color:#e0fbff;white-space:nowrap;justify-self:end;font-size:12px}.ob-orb-label{text-align:center;pointer-events:none;color:#e0fbff;text-shadow:0 0 10px #000, 0 0 6px var(--ob-cyan);position:absolute;transform:translate(-50%,-50%)}.ob-orb-label b{letter-spacing:.3em;font-size:17px;display:block}.ob-orb-label small{letter-spacing:.25em;text-transform:uppercase;margin-top:2px;font-size:10px;display:block}.ob-node-caption{letter-spacing:.12em;color:#bdeef7;white-space:nowrap;text-shadow:0 0 6px #000;margin-top:2px;font-size:11px;position:absolute;top:100%;left:50%;transform:translate(-50%)}[data-placeholder]{opacity:.35}[data-placeholder] polygon{stroke:var(--ob-dim)}.ob-bg{pointer-events:none;background-image:linear-gradient(#22d3ee12 1px,#0000 1px),linear-gradient(90deg,#22d3ee12 1px,#0000 1px);background-size:calc(40px * var(--s,1)) calc(40px * var(--s,1));background-position:50%;position:absolute;inset:0;overflow:hidden}.ob-bg:after{content:"";opacity:.08;background:#22d3ee;height:3px;animation:7s linear infinite ob-scan;position:absolute;top:0;left:0;right:0}@keyframes ob-scan{0%{transform:translateY(-10px)}to{transform:translateY(100vh)}}.ob-corner{pointer-events:none;border:0 solid #67e8f9;width:30px;height:30px;position:absolute}.ob-tl{border-top-width:2px;border-left-width:2px;top:10px;left:10px}.ob-tr{border-top-width:2px;border-right-width:2px;top:10px;right:10px}.ob-bl{border-bottom-width:2px;border-left-width:2px;bottom:10px;left:10px}.ob-br{border-bottom-width:2px;border-right-width:2px;bottom:10px;right:10px}.ob-canvas{transform-origin:0 0;pointer-events:none;position:absolute}.ob-canvas .ob-scene{width:1600px;height:900px;position:absolute;top:0;left:0}.ob-w{cursor:pointer;color:#bdeef7;position:absolute}.ob-w:focus-visible{outline-offset:2px;outline:2px solid #fff}.ob-w:hover{filter:brightness(1.25)}.ob-w.ob-static{cursor:default}.ob-w>.ob-frame{height:100%}.ob-wsvg{width:100%;height:100%;display:block;overflow:visible}.ob-wsvg text,.ob-scene text{fill:#a5f3fc;letter-spacing:.12em;font-family:inherit}.ob-wsvg .ob-lab,.ob-scene .ob-lab{fill:#22d3ee;text-transform:uppercase;font-size:11px}.ob-wsvg .ob-dim,.ob-scene .ob-dim{fill:#5aa9bb;text-transform:uppercase;font-size:10px}.ob-wsvg .ob-big{fill:#e0fbff;letter-spacing:.06em;font-size:26px}.ob-wsvg .ob-sm{fill:#bdeef7;font-size:12px}.ob-wsvg .ob-grn{fill:#6ee7b7}.ob-wsvg .ob-org{fill:#fb923c}.ob-bracket{fill:none;stroke:#22d3ee;stroke-width:2px}.ob-feed-frame{fill:#031018d9;stroke:#0e7490}.ob-feed-run{fill:none;stroke:#67e8f9;stroke-width:2px;stroke-dasharray:6 94;filter:url(#ob-glow);vector-effect:non-scaling-stroke;animation:7s linear infinite ob-runline}.ob-scene .ob-title{fill:#e0fbff;letter-spacing:.5em;filter:url(#ob-glow);font-size:18px}.ob-scene .ob-topbar-base{fill:none;stroke:#0e7490;stroke-width:1.5px;vector-effect:none}.ob-scene .ob-topbar-run{fill:none;stroke:#67e8f9;stroke-width:2.5px;vector-effect:none;stroke-dasharray:8 92;filter:url(#ob-glow);animation:5s linear infinite ob-runline}.ob-orb-ring{fill:none;stroke:#67e8f9;stroke-width:1.5px}.ob-ping{fill:none;stroke:#22d3ee;transform-box:fill-box;transform-origin:50%;animation:3s ease-out infinite ob-ping}.ob-ring-outer{fill:none;stroke:#22d3ee;stroke-opacity:.12;stroke-width:22px;stroke-dasharray:1 28}.ob-slow{animation-duration:90s}.ob-orb-label b{font-size:20px}.ob-cmd{clip-path:polygon(24px 0,536px 0,560px 100%,0 100%);pointer-events:none;color:#bdeef7;background:#22d3ee;width:560px;height:36px;font-size:12px;position:absolute;top:828px;left:520px}.ob-cmd:before{content:"";clip-path:inherit;background:#031018;position:absolute;inset:1px}.ob-cmd>*{position:relative}.ob-cmd{justify-content:space-between;align-items:center;padding:0 40px 0 32px;display:flex}.ob-cmd>small{letter-spacing:.14em;color:#5aa9bb;font-size:10px}.ob-cursor{vertical-align:middle;background:#22d3ee;width:8px;height:14px;margin-left:6px;animation:1s steps(2,end) infinite ob-blink;display:inline-block}.ob-approval-frame{--cut:40px;height:100%}.ob-approval-frame .ob-frame-body{height:100%;padding:18px 28px}.ob-btn.ob-yes{clip-path:polygon(0 0,calc(100% - 14px) 0,100% 50%,calc(100% - 14px) 100%,0 100%);padding-right:22px}.ob-btn.ob-no{clip-path:polygon(14px 0,100% 0,100% 100%,14px 100%,0 50%);padding-left:22px}.ob-base{z-index:0;pointer-events:none;background:radial-gradient(#06222e 0%,#010609 70%);position:absolute;inset:0;overflow:hidden}.ob-disc-wrap{transform-box:fill-box;transform-origin:50%;transition:transform .12s ease-out}.ob-scene .ob-sample-tag{fill:#fb923c;letter-spacing:.2em;font-size:10px}.ob-scene .ob-node-detail{fill:#bdeef7;letter-spacing:.1em;font-size:12px}.ob-scene .ob-node-detail.ob-grn{fill:#6ee7b7}.ob-scene .ob-node-detail.ob-org,.ob-blip-warn{fill:#fb923c}.ob-pulse{animation:1.8s ease-in-out infinite ob-pulse}.ob-tri{width:56px;height:52px}.ob-tri path{fill:none;stroke:var(--ob-orange);stroke-width:3px;animation:.9s ease-in-out infinite ob-pulse}.ob-tri text{fill:var(--ob-orange);font-size:24px}.ob-appr-text{flex-direction:column;gap:4px;min-width:0;display:flex}.ob-appr-title{letter-spacing:.16em;color:var(--ob-orange);font-size:11px}.ob-appr-sub{color:#fed7aa;font-size:12px}.ob-approval .ob-summary{color:#fff;white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;max-height:40vh;font-size:16px;overflow-y:auto}.ob-approval .pinpad,.ob-approval .ob-actions{grid-column:1/-1}.ob-actions{gap:10px}.ob-btn{padding:10px 20px;font-size:12px}.ob-approval-frame .ob-actions{flex-wrap:nowrap;gap:8px}.ob-approval-frame .ob-btn{letter-spacing:.06em;white-space:nowrap;padding:9px 14px;font-size:11px}.ob-frame[data-tone=orange].ob-approval-frame{animation:none}.ob-feed-scroll{animation:14s linear infinite ob-feed-scroll}@keyframes ob-feed-scroll{0%{transform:translateY(0)}to{transform:translateY(calc(var(--n) * -1px))}}.ob-feed-in{animation:.35s ease-out ob-feed-in}@keyframes ob-feed-in{0%{opacity:.4;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.ob-cmd{justify-content:flex-end}.command-bar.command-bar-hud{-webkit-backdrop-filter:none;backdrop-filter:none;font-size:calc(12px * var(--ob-s,1));background:0 0;border:0;gap:0;padding:0;font-family:Consolas,Courier New,monospace;display:block;position:absolute;bottom:auto;transform:none}.command-bar-hud input{width:100%;height:100%;min-height:0;font:inherit;color:#bdeef7;letter-spacing:.04em;padding:0}.command-bar-hud input::placeholder{color:#bdeef7;opacity:.9}.command-bar-hud button[type=submit]{opacity:0;border:0;width:1px;min-width:0;height:1px;min-height:0;padding:0;position:absolute;overflow:hidden}.command-bar-hud .slash-list{margin-bottom:8px;bottom:100%}.stage:has(.orbital[data-mode=orbit]) .captions{bottom:17%}.of-check{color:#e0fbff;flex-wrap:wrap;align-items:center;gap:4px 8px;padding:4px 2px;font-size:13px;display:flex}.of-check .of-hint{flex-basis:100%}.ob-orb-label small{text-transform:uppercase;letter-spacing:.14em}.ob-team-btn{border:1px solid var(--ob-cyan);color:#e0fbff;font:inherit;letter-spacing:.22em;cursor:pointer;clip-path:polygon(8px 0,100% 0,calc(100% - 8px) 100%,0 100%);background:#00141eb3;padding:3px 12px;font-size:11px;position:absolute;transform:translate(-50%)}.ob-team-btn:hover,.ob-team-btn:focus-visible{background:color-mix(in srgb, var(--ob-cyan) 22%, transparent);box-shadow:0 0 12px var(--ob-cyan);outline:none}.ob-org-holder{position:relative;overflow:auto}.ob-org{transform-origin:0 0;position:absolute;top:0}.ob-org-edges{position:absolute;inset:0;overflow:visible}.ob-org-edges path{fill:none;stroke:var(--ob-cyan);stroke-width:1.5px;opacity:.55}.ob-org-card{box-sizing:border-box;text-align:left;font:inherit;color:#e0fbff;border:1px solid color-mix(in srgb, var(--ob-cyan) 55%, transparent);clip-path:polygon(0 0,calc(100% - 12px) 0,100% 12px,100% 100%,12px 100%,0 calc(100% - 12px));cursor:pointer;background:linear-gradient(160deg,#082230e6,#030e16e6);flex-direction:column;justify-content:center;gap:2px;padding:6px 12px;display:flex;position:absolute;overflow:hidden}.ob-org-card b{letter-spacing:.06em;align-items:center;gap:6px;font-size:13px;display:flex}.ob-org-card b i{background:var(--ob-dim,#5a7f8a);border-radius:50%;width:8px;height:8px;display:inline-block}.ob-org-card span{color:var(--ob-cyan);font-size:11px}.ob-org-card small{color:#e0fbffa6;white-space:nowrap;text-overflow:ellipsis;font-size:10px;overflow:hidden}.ob-org-card em{background:var(--ob-cyan);height:3px;position:absolute;bottom:0;left:0}.ob-org-card[data-status=running]{border-color:var(--ob-green)}.ob-org-card[data-status=running] b i{background:var(--ob-green);box-shadow:0 0 8px var(--ob-green)}.ob-org-card[data-status=waiting]{border-color:var(--ob-orange);animation:1.4s ease-in-out infinite ob-pulse}.ob-org-card[data-status=waiting] b i{background:var(--ob-orange)}.ob-org-card[data-status=failed] b i{background:#f87171}.ob-org-root{cursor:default;border-color:var(--ob-cyan);box-shadow:inset 0 0 18px #3fd8ff26}.ob-li.ob-warn{color:var(--ob-orange);border-color:var(--ob-orange)}:root{--accent:#3fd8ff;--warn:#ffb454;--bad:#ff6b7a;--ok:#5ef0b0;--ink:#d4ecf7;--muted:#7fa3b6;--glass:#06141c9e;--edge:color-mix(in srgb, var(--accent) 48%, transparent);--ui:"Segoe UI", system-ui, -apple-system, "Helvetica Neue", Arial, sans-serif;--mono:"Cascadia Mono", "SF Mono", Consolas, ui-monospace, monospace;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{color:var(--ink);font:16px/1.5 var(--ui);-webkit-tap-highlight-color:transparent;background:#000;overflow:hidden}button,input{font:inherit;color:inherit}button{cursor:pointer}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.stage{touch-action:manipulation;background:#000;position:fixed;inset:0;overflow:hidden}.ambient{pointer-events:none;background:radial-gradient(ellipse at 50% 55%, color-mix(in srgb, var(--accent) 10%, transparent), transparent 62%), linear-gradient(#3fd8ff0b 1px, transparent 1px) 0 0 / 64px 64px, linear-gradient(90deg, #3fd8ff0b 1px, transparent 1px) 0 0 / 64px 64px;position:absolute;inset:0;-webkit-mask-image:radial-gradient(#000 30%,#0000 78%);mask-image:radial-gradient(#000 30%,#0000 78%)}.presence{z-index:1;transition:inset .7s cubic-bezier(.2,.7,.2,1),width .7s,height .7s,opacity .5s;position:absolute}.presence-full{inset:0}.presence-corner{left:max(10px, env(safe-area-inset-left));bottom:max(52px, calc(env(safe-area-inset-bottom) + 42px));width:clamp(96px,16vw,190px);height:clamp(96px,16vw,190px)}.objects{pointer-events:none;position:absolute;inset:0}.objects-stack{pointer-events:auto;padding:max(56px, env(safe-area-inset-top)) 14px 140px;flex-direction:column;gap:12px;display:flex;overflow-y:auto}.auto-grid{pointer-events:none;padding:max(24px, env(safe-area-inset-top)) 24px 24px clamp(120px, 20vw, 230px);grid-template-columns:repeat(auto-fit,minmax(min(280px,100%),1fr));align-content:safe center;align-items:start;gap:12px;display:grid;position:absolute;inset:0;overflow-y:auto}.auto-grid>.obj{pointer-events:auto}.objects-stack>.auto-grid{flex-direction:column;padding:0;display:flex;position:static;overflow:visible}.obj.leaving{pointer-events:none;animation:.35s forwards leave}@keyframes leave{to{opacity:0;transform:scale(.96)translateY(-6px)}}@media (prefers-reduced-motion:reduce){.obj.leaving{animation:none}}.glass{background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid var(--edge);box-shadow:0 0 22px color-mix(in srgb, var(--accent) 16%, transparent), inset 0 0 28px #3fd8ff0d;clip-path:polygon(0 0,calc(100% - 14px) 0,100% 14px,100% 100%,14px 100%,0 calc(100% - 14px))}.obj{pointer-events:auto;min-width:0;padding:16px 18px;animation:.45s both appear;overflow:auto}.obj.alert{border-color:var(--warn)}.overlay-layer{z-index:40;pointer-events:none;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.overlay-backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);pointer-events:auto;background:#02080ca8;animation:.3s both appear;position:absolute;inset:0}.obj.overlay{z-index:1;width:min(760px,94vw);max-height:80vh;box-shadow:0 0 40px color-mix(in srgb, var(--accent) 30%, transparent);position:relative}@keyframes appear{0%{opacity:0;transform:translateY(8px)scale(.985)}}.obj-close{width:44px;height:44px;color:var(--muted);background:0 0;border:0;font-size:1.5rem;line-height:1;position:absolute;top:2px;right:6px}.obj-close:hover{color:var(--accent)}.obj-title{letter-spacing:.16em;text-transform:uppercase;color:var(--accent);margin:0 36px 8px 0;font-size:.78rem;font-weight:600}.obj-md>:first-child{margin-top:0}.obj-md>:last-child{margin-bottom:0}.obj-md a{color:var(--accent)}.obj-md code{font-family:var(--mono);background:#3fd8ff1a;padding:0 4px;font-size:.9em}.obj-stat{gap:2px;display:grid}.obj-label{letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-size:.78rem}.obj-value{font-variant-numeric:tabular-nums;font-size:clamp(2rem,6vw,3.6rem);font-weight:300;line-height:1.05}.obj-value small{color:var(--muted);margin-left:4px;font-size:.4em}.obj-delta{color:var(--ok);font-size:.9rem}.obj-list{gap:4px;margin:0;padding-left:1.1rem;display:grid}.obj-list .done{color:var(--muted);text-decoration:line-through}.obj-table-wrap{overflow-x:auto}.obj-table{border-collapse:collapse;width:100%;font-size:.92rem}.obj-table th{text-align:left;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);font-size:.72rem;font-weight:600}.obj-table th,.obj-table td{font-variant-numeric:tabular-nums;border-bottom:1px solid #3fd8ff2e;padding:6px 10px}.obj-code{font:.86rem/1.5 var(--mono);margin:0;overflow:auto}.obj-empty{color:var(--muted);margin:0}.integration-steps{color:var(--muted);gap:4px;margin:4px 0 10px;padding-left:1.2rem;font-size:.86rem;display:grid}.integration-steps li.done{color:var(--ok)}.obj-doc{max-height:70vh;overflow:auto}.obj-doc h1,.obj-doc h2,.obj-doc h3,.obj-doc h4{color:var(--accent);letter-spacing:.06em;font-weight:500}.obj-doc table{border-collapse:collapse;width:100%;font-size:.92rem}.obj-doc th,.obj-doc td{border:1px solid color-mix(in srgb, var(--accent) 22%, transparent);text-align:left;padding:5px 9px}.obj-doc th{color:var(--accent);letter-spacing:.14em;text-transform:uppercase;font-size:.72rem;font-weight:500}.obj-doc pre{border:1px solid color-mix(in srgb, var(--accent) 22%, transparent);font:.86rem/1.5 var(--mono);background:#3fd8ff0d;padding:8px 10px;overflow:auto}.obj-doc blockquote{border-left:2px solid var(--edge);color:var(--muted);margin:.6em 0;padding-left:12px}.obj-progress{gap:6px;min-width:0;display:grid}.obj-progress-head{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.obj-progress-pct{font:1.1rem var(--mono);font-variant-numeric:tabular-nums}.obj-progress-bar{border:1px solid var(--edge);background:#3fd8ff12;height:8px}.obj-progress-bar i{background:var(--accent);height:100%;box-shadow:0 0 10px var(--accent);transition:width .4s;display:block}.obj-progress-detail{color:var(--muted);font-size:.82rem}.obj-checklist{gap:6px;margin:0;padding:0;list-style:none;display:grid}.obj-checklist li{align-items:center;gap:10px;display:flex}.obj-checklist .box{border:1px solid var(--accent);width:16px;height:16px;color:var(--accent);flex:none;place-items:center;font-size:.8rem;display:inline-grid}.obj-checklist .done{color:var(--muted)}.obj-checklist .done span:last-child{text-decoration:line-through}.obj-kv{gap:4px;margin:0;display:grid}.obj-kv>div{border-bottom:1px solid color-mix(in srgb, var(--accent) 16%, transparent);justify-content:space-between;gap:18px;padding:3px 0;display:flex}.obj-kv dt{color:var(--muted);letter-spacing:.14em;text-transform:uppercase;font-size:.78rem}.obj-kv dd{font-family:var(--mono);font-variant-numeric:tabular-nums;text-align:right;margin:0}.obj-countdown{justify-items:center;gap:2px;display:grid}.obj-countdown-time{font:300 clamp(2rem, 6vw, 3.4rem) var(--mono);font-variant-numeric:tabular-nums;text-shadow:0 0 14px var(--accent)}.obj-countdown.done .obj-countdown-time{color:var(--warn);text-shadow:0 0 14px var(--warn)}.obj-media{flex-direction:column;gap:6px;width:100%;max-height:100%;display:flex}.obj-media img,.obj-media video{object-fit:contain;border:1px solid var(--edge);background:#050b10;max-width:100%;max-height:50vh;margin:0 auto;display:block}.obj-pdf iframe{border:1px solid var(--edge);background:#050b10;width:100%;min-width:0;height:min(520px,62vh)}.obj-open{color:var(--accent);letter-spacing:.1em;text-transform:uppercase;font-size:.82rem}.obj-gallery-bar{justify-content:space-between;align-items:center;gap:10px;display:flex}.obj-gallery-bar span{color:var(--ink);justify-items:center;font-size:.86rem;display:grid}.obj-gallery-bar small{color:var(--muted);font-family:var(--mono)}.obj-gallery-bar button{border:1px solid var(--edge);min-width:44px;min-height:44px;color:var(--accent);cursor:pointer;background:0 0;font-size:1.3rem}.obj-gallery-bar button:disabled{opacity:.3;cursor:default}.obj-group{align-items:start;gap:14px;display:grid}.obj-group-grid{grid-template-columns:repeat(auto-fit,minmax(170px,1fr))}.obj-group-row{grid-auto-columns:minmax(150px,1fr);grid-auto-flow:column;overflow-x:auto}.obj-group-column{grid-template-columns:1fr}.obj-part{border:1px solid color-mix(in srgb, var(--accent) 20%, transparent);background:#3fd8ff0a;min-width:0;padding:8px 10px}.obj-tabs{border-bottom:1px solid var(--edge);gap:2px;margin-bottom:8px;display:flex;overflow-x:auto}.obj-tabs button{min-height:40px;color:var(--muted);letter-spacing:.14em;text-transform:uppercase;cursor:pointer;white-space:nowrap;background:0 0;border:0;padding:8px 14px;font-size:.78rem}.obj-tabs button.on{color:var(--accent);box-shadow:inset 0 -2px 0 var(--accent);text-shadow:0 0 8px var(--accent)}.obj-chart{width:100%;height:auto;display:block}.obj-chart .grid{stroke:#3fd8ff24;stroke-width:1px}.obj-chart .tick{fill:var(--muted);font:10px var(--mono);font-variant-numeric:tabular-nums}.legend{color:var(--muted);flex-wrap:wrap;gap:6px 14px;margin:6px 0 0;padding:0;font-size:.8rem;list-style:none;display:flex}.legend i{width:10px;height:10px;margin-right:6px;display:inline-block}.obj-gauge{justify-items:center;display:grid}.obj-gauge svg{width:min(100%,260px);height:auto}.obj-gauge .track{stroke:#3fd8ff26}.obj-gauge .value{stroke:var(--accent);filter:drop-shadow(0 0 6px var(--accent))}.obj-gauge.gauge-warn .value{stroke:var(--warn);filter:drop-shadow(0 0 6px var(--warn))}.obj-gauge.gauge-crit .value{stroke:var(--bad);filter:drop-shadow(0 0 6px var(--bad))}.gauge-read{align-items:baseline;gap:4px;margin-top:-62px;display:flex}.gauge-value{font-variant-numeric:tabular-nums;font-size:clamp(1.8rem,5vw,2.8rem);font-weight:300}.gauge-unit{color:var(--muted)}.obj-gauge .obj-label{margin-top:18px}.obj-timeline{border-left:1px solid var(--edge);gap:14px;margin:8px 0 0;padding:0 0 0 20px;list-style:none;display:grid}.obj-timeline li{gap:2px;display:grid;position:relative}.obj-timeline li:before{content:"";background:var(--accent);width:9px;height:9px;box-shadow:0 0 8px var(--accent);border-radius:50%;position:absolute;top:.5em;left:-25px}.obj-timeline time{font:.75rem/1.3 var(--mono);color:var(--accent)}.obj-timeline span{color:var(--muted);font-size:.9rem}.obj-graph{width:100%;height:auto;max-height:70vh;margin:0 auto;display:block}.obj[style*=" height:"] .obj-graph{max-height:calc(100% - 32px)}.obj-graph .edge{stroke:color-mix(in srgb, var(--accent) 55%, transparent);stroke-width:1.4px}.obj-graph .arrow{fill:var(--accent)}.obj-graph .node{fill:#3fd8ff26;stroke:var(--accent);stroke-width:1.5px}.obj-graph .node-label{fill:var(--ink);font:10px var(--ui)}.obj-graph .edge-label{fill:var(--muted);font:9px var(--ui)}.captions{z-index:20;left:50%;bottom:max(7%, env(safe-area-inset-bottom));text-align:center;pointer-events:none;text-shadow:0 0 18px #000,0 0 4px #000;text-wrap:balance;width:min(780px,100% - 32px);margin:0;font-size:clamp(1.1rem,2.6vw,1.6rem);font-weight:300;position:absolute;transform:translate(-50%)}.captions.done{animation:1.4s 8s forwards fadeOut}@keyframes fadeOut{to{opacity:0}}.command-bar{z-index:30;left:50%;bottom:max(14px, env(safe-area-inset-bottom));background:var(--glass);border:1px solid var(--edge);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);gap:8px;width:min(640px,100% - 24px);padding:8px;display:flex;position:absolute;transform:translate(-50%)}.command-bar input{background:0 0;border:0;outline:none;flex:1;min-height:44px;padding:0 10px;font-size:1.05rem}.command-bar button{border:1px solid var(--edge);background:0 0;min-width:44px;min-height:44px}.conn-badge{top:max(10px, env(safe-area-inset-top));font:500 .78rem var(--mono);letter-spacing:.08em;color:var(--warn);border:1px solid var(--warn);background:#0009;padding:6px 12px;position:absolute;right:12px}.mic-indicator{left:50%;top:max(12px, env(safe-area-inset-top));font:500 .82rem var(--mono);letter-spacing:.1em;text-transform:uppercase;color:#ffd9a0;border:1px solid var(--warn);background:#000000c7;align-items:center;gap:10px;padding:8px 16px;display:flex;position:absolute;transform:translate(-50%)}.mic-indicator i{background:var(--bad);width:10px;height:10px;box-shadow:0 0 10px var(--bad);border-radius:50%;animation:1s ease-in-out infinite mic-pulse}.mic-transcribing i{background:var(--warn);box-shadow:0 0 10px var(--warn)}@keyframes mic-pulse{50%{opacity:.35}}@media (prefers-reduced-motion:reduce){.mic-indicator i{animation:none}}.toasts{top:max(48px, env(safe-area-inset-top));gap:6px;width:min(420px,100% - 24px);display:grid;position:absolute;left:50%;transform:translate(-50%)}.toast{border:1px solid var(--edge);background:#000000d1;padding:10px 14px;font-size:.92rem}.toast-warn{border-color:var(--warn);color:#ffd9a0}.toast-error{border-color:var(--bad);color:#ffc2c9}.approval{border-color:var(--warn);background:#020c12eb;width:min(460px,100% - 24px);max-height:calc(100% - 24px);padding:20px;position:absolute;top:50%;left:50%;overflow:auto;transform:translate(-50%,-50%);box-shadow:0 0 0 100vmax #0000008c,0 0 30px #ffb45440}.plugins{flex-direction:column;width:min(560px,100% - 24px);display:flex;overflow:hidden}.plugins-body{min-height:0;padding-right:4px;overflow-y:auto}.plugins-heading{letter-spacing:.14em;text-transform:uppercase;color:var(--muted);margin:14px 0 6px;font-size:.78rem}.usage-totals{grid-template-columns:repeat(3,1fr);gap:8px;margin:12px 0;display:grid}.usage-totals div{text-align:center;background:#ffffff0a;gap:2px;padding:8px 10px;display:grid}.usage-totals strong{color:var(--accent);font-size:1.35rem}.usage-totals span{color:var(--muted);font-size:.74rem}.usage-bars{align-items:flex-end;gap:2px;height:96px;margin:8px 0 12px;display:flex}.usage-bar-col{flex-direction:column;flex:1 1 0;justify-content:flex-end;align-items:center;gap:2px;min-width:0;height:100%;display:flex}.usage-bar{background:var(--accent);opacity:.8;border-radius:2px 2px 0 0;width:100%;min-height:1px}.usage-bar-day{color:var(--muted);font-size:.6rem}.usage-table{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%;font-size:.82rem}.usage-table th,.usage-table td{text-align:right;border-bottom:1px solid #ffffff0f;padding:4px 6px}.usage-table th:first-child{text-align:left;font-weight:400}.usage-table thead th{color:var(--muted);letter-spacing:.08em;text-transform:uppercase;font-size:.72rem}.usage-list{gap:4px;margin:0;padding:0;font-size:.84rem;list-style:none;display:grid}.usage-list li{background:#ffffff0a;flex-wrap:wrap;justify-content:space-between;gap:4px 10px;padding:6px 10px;display:flex}.usage-list li span:last-child{color:var(--muted)}.plugin-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.plugin-list li{background:#ffffff0a;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 10px;padding:8px 10px;display:flex}.plugin-info{flex:180px;min-width:0}.plugin-info .auth-note{font-size:.82rem}.plugin-actions{flex-wrap:wrap;gap:6px;display:flex}.plugin-actions button{border:1px solid var(--edge);background:0 0;padding:0 12px}.obj-sandbox{flex-direction:column;gap:6px;width:100%;min-width:min(560px,80vw);height:min(420px,60vh);display:flex}.obj-sandbox iframe{border:1px solid var(--edge);background:#050b10;flex:1;width:100%;min-height:200px}.camera-indicator{border-color:var(--bad);color:#ffc2c9;letter-spacing:.12em;text-transform:uppercase;background:#020c12e6;align-items:center;gap:10px;padding:6px 12px 6px 6px;font-size:.8rem;display:flex;position:absolute;bottom:12px;right:12px}.camera-indicator video{object-fit:cover;background:#000;width:72px;height:54px}.camera-indicator span:before{content:"";background:var(--bad);border-radius:50%;width:8px;height:8px;margin-right:8px;display:inline-block}.challenge,.enroll{border-color:var(--accent);box-shadow:0 0 0 100vmax #0000008c,0 0 30px #3fd8ff40}.challenge .approval-title,.enroll .approval-title{color:var(--accent)}.approval-head{align-items:center;gap:10px;display:flex}.approval-title{letter-spacing:.18em;text-transform:uppercase;color:var(--warn);font-size:.8rem}.tier{font:600 .74rem var(--mono);border:1px solid;padding:2px 8px}.tier-T2{color:var(--warn)}.tier-T3{color:var(--bad)}.approval-summary{font:.95rem/1.5 var(--mono);word-break:break-all;background:#ffffff0a;max-height:40vh;margin:14px 0;padding:10px 12px;overflow:auto}.approval-actions{flex-wrap:wrap;gap:8px;margin-top:14px;display:flex}.approval-actions button,.owner-menu button,.auth button{border:1px solid var(--edge);letter-spacing:.04em;background:0 0;padding:0 16px}button.primary{background:color-mix(in srgb, var(--accent) 22%, transparent);border-color:var(--accent)}button.danger{border-color:var(--bad);color:#ffc2c9}button:disabled{opacity:.4;cursor:not-allowed}.pinpad{justify-items:center;gap:8px;display:grid}.pin-dots{letter-spacing:.4em;min-height:1.6em;color:var(--accent);font-size:1.6rem}.pin-keys{grid-template-columns:repeat(3,64px);gap:8px;display:grid}.pin-keys button{border:1px solid var(--edge);background:#3fd8ff0d;font-size:1.2rem}.owner-menu{top:max(60px, env(safe-area-inset-top));background:#020c12f0;gap:8px;width:220px;padding:12px;display:grid;left:12px}.boot{background:#000;height:100%}.auth{gap:8px;width:min(380px,100% - 28px);padding:24px;display:grid;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.auth h1{letter-spacing:.3em;text-transform:uppercase;color:var(--accent);margin:0 0 6px;font-size:1.1rem;font-weight:300}.auth label{letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin-top:6px;font-size:.78rem}.auth input{border:1px solid var(--edge);background:#ffffff0a;padding:0 12px}.auth button{margin-top:12px}.auth-note{color:var(--muted);margin:0;font-size:.9rem}.auth-error{color:#ffc2c9;margin:4px 0 0;font-size:.9rem}@media (width<=599px){.presence-full{inset:0}.captions{bottom:max(11%, env(safe-area-inset-bottom))}}@media (prefers-reduced-motion:reduce){.obj,.presence{transition:none;animation:none}}.status-badge{left:12px;bottom:max(12px, env(safe-area-inset-bottom));font:500 .78rem var(--mono);letter-spacing:.08em;color:var(--ink);border:1px solid var(--edge);background:#0000008c;align-items:center;gap:9px;max-width:min(60vw,360px);padding:6px 12px;display:flex;position:absolute}.status-badge span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.status-badge i{background:var(--muted);border-radius:50%;flex:none;width:9px;height:9px}.status-idle i{background:var(--ok);box-shadow:0 0 8px var(--ok)}.status-working i,.status-speaking i{background:var(--accent);box-shadow:0 0 10px var(--accent);animation:1s ease-in-out infinite mic-pulse}.status-listening i{background:var(--bad);box-shadow:0 0 10px var(--bad);animation:1s ease-in-out infinite mic-pulse}.status-waiting{border-color:var(--warn);color:#ffd9a0}.status-waiting i{background:var(--warn);box-shadow:0 0 10px var(--warn);animation:1s ease-in-out infinite mic-pulse}.status-offline{border-color:var(--warn);color:var(--warn)}.status-offline i{background:var(--warn)}@media (prefers-reduced-motion:reduce){.status-badge i{animation:none!important}}.clock{right:12px;bottom:max(12px, env(safe-area-inset-bottom));text-align:right;color:var(--muted);line-height:1.15;font-family:var(--mono);pointer-events:none;position:absolute}.clock b{color:var(--ink);letter-spacing:.06em;font-size:1.15rem;font-weight:500;display:block}.clock span{letter-spacing:.1em;text-transform:uppercase;font-size:.7rem}.settings{flex-direction:column;width:min(520px,100% - 24px);max-height:calc(100% - 24px);display:flex}.settings-body{gap:6px;min-height:0;padding-right:4px;display:grid;overflow-y:auto}.settings-field{gap:3px;display:grid}.settings-field>span{letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-size:.74rem}.settings-field input:not([type=range]):not([type=checkbox]),.settings-field select{border:1px solid var(--edge);color:var(--ink);min-height:40px;font:inherit;background:#ffffff0a;padding:0 10px}.settings-field select option{background:#06141c}.settings-check{align-items:center;gap:10px;min-height:40px;display:flex}.slash-list{border:1px solid var(--edge);background:#020c12f5;max-height:40vh;margin:0;padding:4px;list-style:none;position:absolute;bottom:calc(100% + 6px);left:0;right:0;overflow-y:auto}.slash-list li{cursor:pointer;align-items:baseline;gap:10px;padding:7px 10px;display:flex}.slash-list li.on,.slash-list li:hover{background:color-mix(in srgb, var(--accent) 18%, transparent)}.slash-list b{font:600 .9rem var(--mono);color:var(--accent)}.slash-list i{font:.78rem var(--mono);color:var(--warn);font-style:normal}.slash-list span{color:var(--muted);font-size:.82rem}.movable{position:absolute}.movable[data-panel=status],.movable[data-panel=clock]{cursor:grab;touch-action:none;pointer-events:auto}.movable:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.panel{resize:both;flex-direction:column;width:clamp(260px,28vw,420px);min-width:220px;min-height:140px;max-height:80vh;padding:0;display:flex;overflow:hidden}.panel-chat{height:62vh}.panel-tasks{width:clamp(240px,26vw,360px);height:40vh}.panel-head{cursor:grab;touch-action:none;border-bottom:1px solid var(--edge);-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;gap:10px;padding:8px 12px;display:flex}.panel-head .obj-close{position:static}.chat-lines{flex:1;align-content:start;gap:8px;min-height:0;padding:10px 12px;display:grid;overflow-y:auto}.chat-line{white-space:pre-wrap;overflow-wrap:anywhere;max-width:92%;margin:0;padding:7px 10px;font-size:.9rem}.chat-user{background:color-mix(in srgb, var(--accent) 18%, transparent);border:1px solid var(--edge);justify-self:end}.chat-assistant{background:#ffffff0d;justify-self:start}.chat-form{border-top:1px solid var(--edge);gap:6px;padding:8px;display:flex}.chat-form input{border:1px solid var(--edge);min-width:0;color:var(--ink);min-height:40px;font:inherit;background:#ffffff0a;flex:1;padding:0 10px}.chat-form button{border:1px solid var(--edge);color:var(--ink);background:0 0;min-height:40px;padding:0 14px}.task-body{flex:1;min-height:0;padding:10px 12px;overflow-y:auto}.task-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.task-list li{border-left:3px solid var(--accent);background:#ffffff0a;gap:2px;padding:8px 10px;display:grid}.task-list li.overdue{border-left-color:var(--bad)}.task-title{overflow-wrap:anywhere;font-size:.95rem}.task-due{font:.75rem var(--mono);color:var(--muted)}.task-list li.overdue .task-due{color:var(--bad)}@media (width<=600px){.panel{resize:none;width:calc(100% - 24px);left:12px!important}.panel-chat{height:52vh;bottom:56px;top:auto!important}.panel-tasks{height:30vh;top:56px!important}}.help{flex-direction:column;width:min(560px,100% - 24px);max-height:calc(100% - 24px);display:flex}.help-list{gap:4px;min-height:0;margin:8px 0;display:grid;overflow-y:auto}.help-row{border-bottom:1px solid #ffffff0f;grid-template-columns:minmax(130px,38%) 1fr;gap:12px;padding:6px 4px;display:grid}.help-row dt{font:600 .9rem var(--mono);color:var(--accent);overflow-wrap:anywhere}.help-row dt i{color:var(--warn);font-style:normal;font-weight:400}.help-row dd{color:var(--ink);margin:0;font-size:.9rem}@media (width<=600px){.help-row{grid-template-columns:1fr;gap:2px}}.connectors{width:min(600px,100% - 24px);max-height:calc(100% - 24px);overflow-y:auto}.connector-form{gap:8px;display:grid}.connector-form textarea,.settings-field textarea{border:1px solid var(--edge);color:var(--ink);font:.85rem var(--mono);resize:vertical;background:#ffffff0a;padding:8px 10px}.connector-steps{color:var(--muted);gap:4px;margin:0;padding-left:20px;font-size:.88rem;display:grid}.connector-warning{border-left:3px solid var(--warn);color:#ffd9a0;padding-left:10px}.conn-status{font:.74rem var(--mono)}.conn-ready{color:var(--ok)}.conn-error{color:var(--bad)}.conn-connecting{color:var(--warn)}.conn-off{color:var(--muted)}.settings-wide{width:min(980px,100% - 24px);height:min(720px,100% - 24px)}.settings-layout{flex:1;grid-template-columns:190px 1fr;gap:16px;min-height:0;margin-top:8px;display:grid}.settings-tabs{align-content:start;gap:6px;display:grid}.settings-tab{text-align:left;color:var(--ink);background:0 0;border:1px solid #0000;gap:2px;padding:10px 12px;display:grid}.settings-tab small{color:var(--muted);font-size:.74rem}.settings-tab:hover{background:#ffffff0d}.settings-tab.on{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 16%, transparent)}.settings-wide .settings-body{align-content:start;padding-right:8px}@media (width<=700px){.settings-wide{height:calc(100% - 24px)}.settings-layout{grid-template-columns:1fr;gap:8px}.settings-tabs{grid-auto-columns:1fr;grid-auto-flow:column;overflow-x:auto}.settings-tab small{display:none}}.look-tab{grid-template-columns:minmax(220px,300px) 1fr;align-items:start;gap:18px;display:grid}.look-side{gap:10px;display:grid;position:sticky;top:0}.look-controls{gap:6px;min-width:0;display:grid}@media (width<=860px){.look-tab{grid-template-columns:1fr}.look-side{position:static}}.look-preview{border:1px solid var(--edge);background:#000;height:230px;position:relative;overflow:hidden}.look-preview-glow{background:radial-gradient(ellipse at 50% 55%, color-mix(in srgb, var(--accent) 22%, transparent), transparent 65%);position:absolute;inset:0}.look-preview-stage{position:absolute;inset:0}.look-preview-caption{text-align:center;text-shadow:0 0 10px #000;margin:0;position:absolute;bottom:8px;left:8px;right:8px}.look-preview .presence-full{inset:0}.theme-grid{grid-template-columns:repeat(auto-fill,minmax(118px,1fr));gap:8px;display:grid}.theme-card{border:1px solid var(--edge);color:var(--ink);text-align:left;background:#ffffff08;justify-items:start;gap:1px;padding:10px;display:grid}.theme-card i{background:var(--swatch);width:22px;height:22px;box-shadow:0 0 12px var(--swatch);border-radius:50%;margin-bottom:4px}.theme-card small{color:var(--muted);font-size:.72rem}.theme-card.on,.style-choice.on{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 18%, transparent)}.style-row{grid-template-columns:repeat(3,1fr);gap:8px;display:grid}.style-choice{border:1px solid var(--edge);color:var(--ink);text-align:left;background:#ffffff08;gap:2px;padding:10px;display:grid}.style-choice small{color:var(--muted);font-size:.72rem}.swatch-row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.swatch{border:2px solid #0000;border-radius:50%;width:32px;height:32px;min-height:32px;padding:0}.swatch.on{box-shadow:0 0 0 2px var(--accent);border-color:#fff}.swatch-custom{color:var(--muted);align-items:center;gap:6px;font-size:.8rem;display:flex}.swatch-custom input[type=color]{border:1px solid var(--edge);background:0 0;width:40px;height:32px;padding:0}.captions-small{font-size:clamp(.9rem,2vw,1.15rem)}.captions-medium{font-size:clamp(1.1rem,2.6vw,1.6rem)}.captions-large{font-size:clamp(1.4rem,3.6vw,2.3rem)}.voice-hear{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.connector-command{border:1px solid var(--edge);font:.85rem var(--mono);-webkit-user-select:all;user-select:all;background:#ffffff0d;margin:0;padding:8px 10px;overflow-x:auto}html,body{overscroll-behavior:none}@media (pointer:coarse){.stage{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}}input,textarea,select,.connector-command{-webkit-user-select:text;user-select:text}.owner-menu{max-height:calc(100dvh - 80px);overflow-y:auto}.touch-controls{z-index:25;left:0;right:0;bottom:max(14px, env(safe-area-inset-bottom));pointer-events:none;justify-content:center;align-items:flex-end;gap:26px;display:flex;position:absolute}.touch-controls>*{pointer-events:auto}.touch-talk{justify-items:center;gap:6px;display:grid}.touch-hint{max-width:70vw;font:500 .74rem var(--mono);letter-spacing:.06em;color:var(--muted);text-align:center;text-shadow:0 0 6px #000,0 0 2px #000;padding:2px 10px}.touch-mic,.touch-side{border:1px solid var(--edge);color:var(--ink);background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);touch-action:none;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;border-radius:50%;place-items:center;padding:0;display:grid}.touch-mic{border-color:var(--accent);width:76px;height:76px;box-shadow:0 0 22px color-mix(in srgb, var(--accent) 30%, transparent)}.touch-mic.on{background:color-mix(in srgb, var(--bad) 40%, transparent);border-color:var(--bad);box-shadow:0 0 28px var(--bad);animation:1s ease-in-out infinite mic-pulse}.touch-side{touch-action:manipulation;width:52px;height:52px;margin-bottom:12px}@media (prefers-reduced-motion:reduce){.touch-mic.on{animation:none}}@media (pointer:coarse){.captions{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 150px)}.status-badge,.clock{bottom:max(8px, env(safe-area-inset-bottom))}.presence-corner{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 70px)}}@media (width<=600px) and (pointer:coarse){.panel-chat{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 150px);height:min(48vh,100dvh - 260px)}.objects-stack{padding-bottom:190px}}.elsewhere{z-index:3000;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#000000c7;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.elsewhere-card{border:1px solid var(--edge);background:var(--glass);max-width:380px;color:var(--ink);text-align:center;border-radius:16px;padding:24px}.elsewhere-card h2{margin:0 0 10px;font-size:1.15rem}.elsewhere-card p{color:var(--muted);margin:0 0 18px;line-height:1.45}.elsewhere-btn{border:1px solid var(--accent);background:color-mix(in srgb, var(--accent) 25%, transparent);min-height:48px;color:var(--ink);font:600 1rem var(--mono);cursor:pointer;border-radius:24px;padding:0 28px}.obj-grip{cursor:grab;touch-action:none;border-radius:8px 8px 0 0;height:22px;position:absolute;top:0;left:0;right:92px}.obj-grip:before{content:"";background:var(--muted);opacity:.35;border-radius:2px;width:34px;height:3px;margin-left:-17px;transition:opacity .15s;position:absolute;top:8px;left:50%}.obj:hover .obj-grip:before,.obj-grip:focus-visible:before{opacity:.9}.obj-grip:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.obj.dragging{cursor:grabbing;box-shadow:0 0 0 1px var(--accent), 0 8px 30px #00000080;-webkit-user-select:none;user-select:none;transition:none;animation:none}.obj-pin{width:44px;height:44px;color:var(--muted);opacity:.55;background:0 0;border:0;place-items:center;display:grid;position:absolute;top:2px;right:50px}.obj:hover .obj-pin,.obj-pin.on,.obj-pin:focus-visible{opacity:1}.obj-pin.on,.obj-pin:hover{color:var(--accent)}.obj.pinned{border-color:color-mix(in srgb, var(--accent) 55%, transparent)}.obj-resize{cursor:nwse-resize;touch-action:none;opacity:0;background:linear-gradient(135deg, transparent 55%, var(--accent) 56%, var(--accent) 64%, transparent 65%, transparent 76%, var(--accent) 77%, var(--accent) 85%, transparent 86%);width:22px;height:22px;transition:opacity .15s;position:absolute;bottom:0;right:0}.obj:hover .obj-resize,.obj.dragging .obj-resize{opacity:.7}@media (pointer:coarse){.obj-pin{opacity:1}.obj-resize{opacity:.7;width:30px;height:30px}.obj-grip{height:30px}.obj-grip:before{opacity:.7;top:12px}}.obj-media.obj-media-fill{height:100%;min-height:min(360px,60vh)}.obj-media-fill .obj-youtube{border:1px solid var(--edge);background:#000;flex:auto;width:100%;height:100%;min-height:0;display:block}.profile-badge{top:max(56px, calc(env(safe-area-inset-top) + 48px));border:1px solid var(--edge);background:var(--glass);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);color:var(--ink);cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;border-radius:12px;align-items:center;gap:8px;padding:6px 12px 6px 8px;display:flex;position:fixed;left:12px}.profile-shield{color:var(--accent);flex:none}.profile-shield.member{color:#8ff0b0}.profile-shield.guest{color:var(--warn)}.profile-text{min-width:0;line-height:1.15;display:grid}.profile-text b{text-overflow:ellipsis;white-space:nowrap;max-width:130px;font-size:.86rem;font-weight:600;overflow:hidden}.profile-text small{font:500 .64rem var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}@media (width<=600px){.profile-text{display:none}.profile-badge{padding:4px 6px}}.obj[style*=height]>.obj-sandbox{height:100%}.obj[style*=height]>.obj-sandbox iframe{min-height:0}.hud{--hud-line:color-mix(in srgb, var(--accent) 62%, transparent);--hud-line-dim:color-mix(in srgb, var(--accent) 26%, transparent);--hud-glow:color-mix(in srgb, var(--accent) 42%, transparent);--hud-bg:#030d14d1;--hud-bg-hi:#081e2ae6;--cut:10px;color:var(--ink);font-family:var(--mono);-webkit-user-select:none;user-select:none}.hud-cut{background:var(--hud-line);clip-path:polygon(0 0, calc(100% - var(--cut)) 0, 100% var(--cut), 100% 100%, var(--cut) 100%, 0 calc(100% - var(--cut)));position:relative}.hud-cut:before{content:"";background:var(--hud-bg);clip-path:polygon(0 0, calc(100% - var(--cut) + 1px) 0, 100% calc(var(--cut) - 1px), 100% 100%, calc(var(--cut) - 1px) 100%, 0 calc(100% - var(--cut) + 1px));z-index:0;transition:background .14s ease-out;position:absolute;inset:1px}.hud-cut>*{z-index:1;position:relative}.hud-kicker{letter-spacing:.22em;text-transform:uppercase;color:var(--muted);margin:0 0 6px 2px;font-size:.62rem}.hud-profile{top:max(56px, calc(env(safe-area-inset-top) + 48px));cursor:grab;touch-action:none;align-items:center;display:flex;position:fixed;left:12px}.hud-emblem{z-index:2;background:radial-gradient(circle, var(--hud-bg-hi), var(--hud-bg));width:64px;height:64px;box-shadow:0 0 18px var(--hud-glow), inset 0 0 12px var(--hud-line-dim);border-radius:50%;flex:none;place-items:center;display:grid;position:relative}.hud-emblem-svg{color:var(--accent)}.hud-emblem-svg.member{color:#8ff0b0}.hud-emblem-svg.guest{color:var(--warn)}.hud-ring-chase{opacity:0;transform-origin:32px 32px}.hud-tag{--cut:9px;gap:1px;min-width:176px;margin-left:-14px;padding:6px 18px 7px 24px;line-height:1.15;display:grid}.hud-tag b{letter-spacing:.02em;text-overflow:ellipsis;white-space:nowrap;max-width:190px;font-size:.95rem;font-weight:600;overflow:hidden}.hud-tag small{letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-size:.62rem}.hud-tag .hud-tag-top{color:var(--accent);letter-spacing:.2em}.hud-tag:after{content:"";background:var(--accent);width:2px;box-shadow:0 0 8px var(--hud-glow);z-index:1;position:absolute;top:8px;bottom:8px;left:10px}.hud-profile.member .hud-tag:after{background:#8ff0b0}.hud-profile.guest .hud-tag:after{background:var(--warn)}.hud-clock{top:max(56px, calc(env(safe-area-inset-top) + 48px));cursor:grab;touch-action:none;text-align:left;position:fixed;left:332px}.hud-clock time{align-items:flex-end;gap:14px;display:flex}.hud-date{justify-items:start;line-height:1;display:grid}.hud-day{letter-spacing:.02em;text-shadow:0 0 14px var(--hud-glow);font-size:3.1rem;font-weight:700;display:flex}.hud-month{background:var(--accent);color:#031018;letter-spacing:.22em;text-transform:uppercase;clip-path:polygon(0 0,100% 0,calc(100% - 6px) 100%,0 100%);margin-top:2px;padding:1px 8px 1px 6px;font-size:.7rem;font-weight:700}.hud-weekday{letter-spacing:.2em;text-transform:uppercase;color:var(--muted);margin-top:3px;font-size:.64rem}.hud-time-block{gap:5px;min-width:150px;padding-bottom:4px;display:grid}.hud-clock-time{letter-spacing:.06em;align-items:baseline;font-size:1.55rem;display:flex}.hud-colon{color:var(--accent);margin:0 1px;font-style:normal}.hud-period{letter-spacing:.2em;color:var(--muted);margin-left:6px;font-size:.62rem}.hud-line{background:linear-gradient(90deg, var(--hud-line), transparent);height:1px;position:relative}.hud-line:after{content:"";border:1px solid var(--accent);background:var(--hud-bg);border-radius:50%;width:7px;height:7px;position:absolute;top:-3px;left:-3px}.hud-dot{background:var(--accent);width:5px;height:5px;box-shadow:0 0 8px var(--accent);border-radius:50%;position:absolute;top:-2px;left:0}.hud-digit{display:inline-block}.hud-launcher{left:12px;top:calc(max(56px, env(safe-area-inset-top) + 48px) + 86px);cursor:grab;touch-action:none;position:fixed}.hud-stack{gap:6px;margin:0;padding:0;list-style:none;display:grid}.hud-tab{--cut:9px;align-items:stretch;min-width:176px;transition:transform .14s ease-out,filter .14s ease-out;display:flex}.hud-tab-main{color:var(--ink);font:inherit;letter-spacing:.06em;text-align:left;cursor:pointer;background:0 0;border:0;flex:1;grid-template-columns:26px 1fr;align-items:center;gap:10px;min-height:40px;padding:7px 18px 9px 10px;font-size:.82rem;display:grid;position:relative;overflow:hidden}.hud-tab-main:focus-visible{outline:1px dashed var(--accent);outline-offset:-3px}.hud-icon{background:var(--hud-line-dim);width:26px;height:26px;color:var(--accent);place-items:center;font-size:.95rem;transition:background .14s ease-out,color .14s;display:grid}.hud-tab-label{text-transform:uppercase;letter-spacing:.14em;font-size:.74rem}.hud-tab-engaged{letter-spacing:.2em;color:var(--accent);opacity:0;font-size:.74rem;position:absolute;top:50%;left:46px;transform:translateY(-50%)}.hud-tab:after{content:"";background:var(--accent);width:26%;height:2px;box-shadow:0 0 6px var(--hud-glow);z-index:2;transition:width .22s ease-out;position:absolute;bottom:4px;left:12px}.hud-sweep,.hud-scan{pointer-events:none;opacity:0;position:absolute;inset:0}.hud-sweep{background:linear-gradient(100deg, transparent 30%, color-mix(in srgb, var(--accent) 38%, transparent) 50%, transparent 70%);transform:translate(-100%)}.hud-scan{background:linear-gradient(180deg, transparent, color-mix(in srgb, var(--accent) 55%, transparent) 50%, transparent);height:14px;inset:-14px 0 auto}.hud-ripple{background:radial-gradient(circle, color-mix(in srgb, var(--accent) 55%, transparent), transparent 62%);opacity:.9;pointer-events:none;border-radius:50%;animation:.6s ease-out forwards hud-ripple;position:absolute;transform:scale(0)}@media (hover:hover){.hud-tab:hover{filter:brightness(1.22);transform:translate(6px)}.hud-tab:hover:after{width:calc(100% - 24px)}.hud-tab:hover:before{background:var(--hud-bg-hi)}.hud-tab:hover .hud-icon{background:var(--accent);color:#031018}.hud-tab:hover .hud-sweep{opacity:1;animation:.6s ease-out hud-sweep}}.hud-tab:active{transform:translate(3px)scale(.97)}.hud-tab:active:before{background:color-mix(in srgb, var(--accent) 18%, var(--hud-bg))}.hud-tab.engaged .hud-tab-label{opacity:0}.hud-tab.engaged .hud-tab-engaged{opacity:1;animation:.65s steps(2,end) hud-flicker}.hud-tab.engaged .hud-scan{opacity:1;animation:.45s linear hud-scan}.hud-tab.current:before{background:var(--hud-bg-hi)}.hud-tab.current:after{width:calc(100% - 24px)}.hud-tab.current .hud-tab-title{color:var(--accent)}.hud-btn{background:var(--hud-line-dim);width:36px;height:32px;color:var(--ink);cursor:pointer;clip-path:polygon(7px 0,100% 0,calc(100% - 7px) 100%,0 100%);border:0;place-items:center;padding:0;transition:background .14s ease-out,color .14s,transform .1s;display:inline-grid;position:relative;overflow:hidden}.hud-btn sup{color:var(--accent);font-size:.55rem;position:absolute;top:3px;right:6px}.hud-btn.on,.hud-btn[aria-pressed=true]{color:var(--accent);background:color-mix(in srgb, var(--accent) 24%, transparent)}.hud-btn-main{background:var(--accent);color:#031018;width:52px;height:36px}.hud-btn:focus-visible{outline:1px dashed var(--accent);outline-offset:2px}@media (hover:hover){.hud-btn:hover{background:color-mix(in srgb, var(--accent) 44%, transparent);color:#fff}.hud-btn-main:hover{background:color-mix(in srgb, var(--accent) 78%, #fff);color:#031018}}.hud-btn:active{transform:scale(.94)}.hud-range{appearance:none;cursor:pointer;--fill:0%;background:0 0;width:100%;height:14px;margin:0}.hud-range::-webkit-slider-runnable-track{background:linear-gradient(90deg, var(--accent) var(--fill), var(--hud-line-dim) var(--fill));height:2px}.hud-range::-moz-range-track{background:var(--hud-line-dim);height:2px}.hud-range::-moz-range-progress{background:var(--accent);height:2px}.hud-range::-webkit-slider-thumb{-webkit-appearance:none;background:var(--accent);clip-path:polygon(0 0,100% 0,100% 70%,50% 100%,0 70%);width:9px;height:13px;box-shadow:0 0 8px var(--hud-glow);border:0;margin-top:-5.5px}.hud-range::-moz-range-thumb{background:var(--accent);border:0;border-radius:0;width:9px;height:13px}.hud-range:disabled{opacity:.4;cursor:default}.hud-chip{border:1px solid var(--hud-line-dim);color:var(--muted);font:inherit;letter-spacing:.16em;text-transform:uppercase;cursor:pointer;background:0 0;padding:4px 12px;font-size:.66rem;transition:color .14s,border-color .14s,background .14s}.hud-chip.on{color:var(--accent);border-color:var(--accent);background:color-mix(in srgb, var(--accent) 12%, transparent)}@media (hover:hover){.hud-chip:hover{color:var(--ink);border-color:var(--hud-line)}}.hud-mini{border:1px solid var(--hud-line-dim);width:30px;height:30px;color:var(--accent);font:inherit;cursor:pointer;background:0 0;align-self:center;margin-right:8px;font-size:1.05rem;transition:background .14s,color .14s}@media (hover:hover){.hud-mini:hover{background:var(--accent);color:#031018}}.hud-music{--cut:14px;cursor:grab;touch-action:none;padding:10px 14px 12px;position:fixed;bottom:12px;right:12px}.hud-music.mini{width:min(560px,100vw - 24px)}.hud-music.full{width:min(1000px,100vw - 24px);max-height:calc(100vh - 24px);padding:12px 16px 16px;overflow:auto}.hud-music-head{justify-content:space-between;align-items:center;margin-bottom:6px;display:flex}.hud-music-head .hud-kicker{margin:0}.hud-head-actions{gap:4px;display:flex}.hud-head-actions .hud-btn{width:30px;height:24px}.hud-music-body{align-items:center;gap:16px;display:flex}.hud-music.full .hud-music-body{align-items:stretch;gap:22px}.hud-music-left{flex:none;align-items:center;gap:12px;display:flex}.hud-music-main{flex:1;align-content:center;gap:8px;min-width:0;display:grid}.hud-now{gap:2px;min-width:0;display:grid}.hud-title{letter-spacing:.02em;white-space:nowrap;text-overflow:ellipsis;font-variant-ligatures:none;font-size:1rem;font-weight:600;overflow:hidden}.hud-music.full .hud-title{white-space:normal;font-size:1.35rem}.hud-sub{letter-spacing:.1em;text-transform:uppercase;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:.7rem;overflow:hidden}.hud-timeline{grid-template-columns:auto 1fr auto;align-items:center;gap:10px;display:grid}.hud-time{letter-spacing:.1em;color:var(--muted);font-variant-numeric:tabular-nums;font-size:.7rem}.hud-controls{align-items:center;gap:6px;display:flex}.hud-controls .hud-btn:first-child{margin-right:6px}.hud-controls .hud-btn:last-child{margin-left:6px}.hud-volume{grid-template-columns:auto 1fr;align-items:center;gap:8px;max-width:260px;display:grid}.hud-unlock{border:1px solid var(--warn);color:var(--warn);font:inherit;letter-spacing:.16em;text-transform:uppercase;cursor:pointer;background:0 0;justify-self:start;padding:4px 12px;font-size:.66rem;animation:1.4s ease-in-out infinite hud-pulse}.hud-dial{--bass:0;flex:none;position:relative}.hud-dial-svg{width:100%;height:100%;position:absolute;inset:0;overflow:visible}.hud-dial-ticks{fill:none;stroke:var(--hud-line);stroke-width:3px;stroke-dasharray:1 5.02}.hud-dial-track{fill:none;stroke:var(--hud-line-dim);stroke-width:2px}.hud-dial-arc{fill:none;stroke:var(--accent);stroke-width:3px;stroke-linecap:butt;filter:drop-shadow(0 0 4px var(--hud-glow));transition:stroke-dasharray .25s linear}.hud-dial-inner{fill:none;stroke:var(--hud-line-dim);stroke-width:1px}.hud-needle{transform-origin:100px 100px;opacity:.85}.hud-needle line{stroke:var(--accent);stroke-width:1.4px;stroke-linecap:round}.hud-needle circle{fill:var(--accent);filter:drop-shadow(0 0 4px var(--accent))}.hud-spectrum{pointer-events:none;position:absolute;inset:0}.hud-cover{color:var(--hud-line);background:var(--hud-bg-hi) center / cover no-repeat;box-shadow:0 0 16px var(--hud-line-dim), inset 0 0 14px #0000008c;border:1px solid var(--hud-line);transform:scale(calc(1 + var(--bass) * .045));border-radius:50%;place-items:center;display:grid;position:absolute;inset:20%}.hud-levels{flex-direction:column-reverse;gap:3px;width:9px;height:220px;display:flex}.hud-levels i{background:var(--hud-line-dim);flex:1;transition:background 80ms linear,box-shadow 80ms linear;display:block}.hud-levels i.on{background:var(--accent);box-shadow:0 0 6px var(--hud-glow)}.hud-levels i:nth-child(n+10).on{background:var(--warn);box-shadow:0 0 6px color-mix(in srgb, var(--warn) 50%, transparent)}.hud-playlist{grid-template-rows:auto auto minmax(0,1fr);gap:8px;width:300px;min-width:0;max-height:340px;display:grid}.hud-tabs{flex-wrap:wrap;gap:6px;display:flex}.hud-search{border:1px solid var(--hud-line-dim);width:100%;color:var(--ink);font:inherit;background:#0000004d;padding:6px 10px;font-size:.8rem}.hud-search:focus{border-color:var(--accent);outline:none}.hud-list{align-content:start;gap:5px;min-height:0;margin:0;padding:0 4px 0 0;list-style:none;display:grid;overflow-y:auto}.hud-list .hud-tab{--cut:7px;min-width:0}.hud-list .hud-tab-main{grid-template-columns:1fr;gap:1px;min-height:0;padding:6px 12px 8px 14px;display:grid}.hud-tab-title{letter-spacing:.03em;white-space:nowrap;text-overflow:ellipsis;font-size:.8rem;overflow:hidden}.hud-list small{letter-spacing:.12em;text-transform:uppercase;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:.62rem;overflow:hidden}.hud-source{letter-spacing:.18em;color:#031018;background:var(--accent);clip-path:polygon(0 0,100% 0,calc(100% - 4px) 100%,0 100%);vertical-align:1px;margin-left:8px;padding:0 5px;font-size:.56rem;font-style:normal}.hud-notice{border-left:2px solid var(--warn);letter-spacing:.06em;color:var(--warn);margin:0;padding:4px 10px;font-size:.7rem}.hud-empty{color:var(--muted);padding:10px 4px;font-size:.75rem}@keyframes hud-spin{to{transform:rotate(360deg)}}@keyframes hud-sweep{0%{transform:translate(-100%)}to{transform:translate(100%)}}@keyframes hud-scan{0%{top:-14px}to{top:calc(100% + 14px)}}@keyframes hud-ripple{to{opacity:0;transform:scale(1)}}@keyframes hud-flicker{0%,to{opacity:1}25%{opacity:.2}50%{opacity:1}75%{opacity:.45}}@keyframes hud-pulse{0%,to{opacity:1}50%{opacity:.45}}@keyframes hud-boot{0%{opacity:0;filter:brightness(2.2);transform:translate(-14px)}30%{opacity:1}42%{opacity:.35}56%{opacity:1}70%{opacity:.7}to{opacity:1;filter:none;transform:none}}@keyframes hud-roll{0%{opacity:0;transform:translateY(60%)}to{opacity:1;transform:none}}@keyframes hud-blink{0%,49%{opacity:1}50%,to{opacity:.25}}@keyframes hud-travel{0%{left:0}to{left:calc(100% - 5px)}}@keyframes hud-flare{0%{box-shadow:0 0 18px var(--hud-glow), 0 0 0 0 var(--accent)}60%{box-shadow:0 0 30px var(--accent), 0 0 0 14px transparent}to{box-shadow:0 0 18px var(--hud-glow), 0 0 0 0 transparent}}[data-hud-anim=full] .hud-boot{animation:.55s ease-out both hud-boot;animation-delay:calc(var(--i,0) * 80ms)}[data-hud-anim=full] .hud-ring-turn{transform-origin:32px 32px;animation:40s linear infinite hud-spin}[data-hud-anim=full] .hud-profile.speaking .hud-ring-turn{animation-duration:7s}[data-hud-anim=full] .hud-profile.speaking .hud-emblem{animation:.9s ease-out hud-flare}[data-hud-anim=full] .hud-profile.busy .hud-ring-chase{opacity:1;animation:1.5s linear infinite hud-spin}[data-hud-anim=full] .hud-profile.listening .hud-emblem{box-shadow:0 0 26px var(--accent), inset 0 0 14px var(--hud-line-dim)}[data-hud-anim=full] .hud-digit{animation:.35s ease-out hud-roll}[data-hud-anim=full] .hud-colon{animation:1s step-end infinite hud-blink}[data-hud-anim=full] .hud-dot{animation:1s linear infinite hud-travel}[data-hud-anim=full] .hud-dial.playing .hud-needle{animation:3s linear infinite hud-spin}[data-hud-anim=full] .hud-dial.playing .hud-cover{animation:22s linear infinite hud-spin-keep}@keyframes hud-spin-keep{to{rotate:360deg}}[data-hud-anim=full] .hud-tab-main:focus-visible{animation:1.6s ease-in-out infinite hud-pulse}[data-hud-anim=reduced] .hud-boot,[data-hud-anim=reduced] .hud-digit,[data-hud-anim=reduced] .hud-colon,[data-hud-anim=reduced] .hud-dot{animation:none}[data-hud-anim=reduced] .hud-needle{display:none}[data-hud-anim=off] .hud *,[data-hud-anim=off] .hud{transition:none!important;animation:none!important}[data-hud-anim=off] .hud-tab:hover{transform:none}[data-hud-anim=off] .hud-needle{display:none}@media (prefers-reduced-motion:reduce){.hud *,.hud{transition:none!important;animation:none!important}.hud-tab:hover{transform:none}}@media (width<=900px){.hud-clock{left:12px;top:calc(max(56px, env(safe-area-inset-top) + 48px) + 76px)}.hud-launcher{top:calc(max(56px, env(safe-area-inset-top) + 48px) + 180px)}}@media (width<=640px){.hud-tag{min-width:120px}.hud-tag b{max-width:110px}.hud-day{font-size:2.2rem}.hud-launcher .hud-tab{min-width:0}.hud-launcher .hud-tab-main{grid-template-columns:26px;padding:7px 8px 9px}.hud-launcher .hud-tab-label,.hud-launcher .hud-tab-engaged,.hud-launcher .hud-kicker{display:none}.hud-music.mini{bottom:56px}.hud-music.full .hud-music-body{flex-direction:column;align-items:center}.hud-music.full .hud-music-left{flex-wrap:wrap;justify-content:center}.hud-playlist{width:100%;max-height:220px}.hud-levels{height:120px}}
|