livedesk 0.1.697 → 0.1.701

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +21 -3
  2. package/bin/livedesk.js +16 -8
  3. package/client/package.json +5 -5
  4. package/diagnostics/vuvodesk-linux-desktop.mjs +188 -0
  5. package/electron/entitlements.mac.plist +12 -12
  6. package/electron/recurring-update-owner.mjs +2 -2
  7. package/electron/update-manager.mjs +59 -16
  8. package/hub/package.json +1 -1
  9. package/hub/src/plan-device-access.test.mjs +8 -8
  10. package/hub/src/remote-hub.js +12 -3
  11. package/hub/src/server.js +1 -1
  12. package/package.json +7 -7
  13. package/web/dist/app.html +1 -1
  14. package/web/dist/app.webmanifest +1 -1
  15. package/web/dist/assets/{AgentSettingsTab-DRWDCG0o.js → AgentSettingsTab-D0oebRk-.js} +1 -1
  16. package/web/dist/assets/{AgentsPage-BnF3p9G1.js → AgentsPage-BBj64SpA.js} +1 -1
  17. package/web/dist/assets/{CaptureGallery-8lr9Ct1i.js → CaptureGallery-DF6gZHy0.js} +1 -1
  18. package/web/dist/assets/DesktopUpdatePanel-BaRZzRao.js +1 -0
  19. package/web/dist/assets/HubApp-C-E5cpCr.css +1 -0
  20. package/web/dist/assets/HubApp-DJsiVqWP.js +182 -0
  21. package/web/dist/assets/{MonitorStackIcon-led0pnag.js → MonitorStackIcon-BD7Yn-Z9.js} +5 -5
  22. package/web/dist/assets/{SettingsPage-k202bRU1.js → SettingsPage-CXmk161K.js} +1 -1
  23. package/web/dist/assets/SettingsTabs-C_xNvq7v.js +1 -0
  24. package/web/dist/assets/{ShareFilesPage-DRW1qS1Z.js → ShareFilesPage-Dx5yYsbk.js} +1 -1
  25. package/web/dist/assets/{SupportPage-DXkBQh_W.js → SupportPage-DAsms8Kr.js} +1 -1
  26. package/web/dist/assets/{VuvoDeskApp-BHcF72r3.js → VuvoDeskApp-9sUnuvyS.js} +1 -1
  27. package/web/dist/assets/{app-DcrmhmnT.js → app-CUM2wTSb.js} +2 -2
  28. package/web/dist/assets/{client-D-D35ghV.js → client-DV0v4wud.js} +1 -1
  29. package/web/dist/assets/frame-lifecycle-D-BxeTQV.js +1 -0
  30. package/web/dist/assets/{icons-ChMazCZR.js → icons-BwhnWKHR.js} +1 -1
  31. package/web/dist/assets/main-BbK4NG31.js +2 -0
  32. package/web/dist/assets/{pwa-startup-BiuYh5eN.js → pwa-startup-C8kDd3Vd.js} +1 -1
  33. package/web/dist/assets/{react-CnkEM7Rb.js → react-Dm67yaJf.js} +1 -1
  34. package/web/dist/index.html +6 -6
  35. package/web/dist/sw.js +2 -2
  36. package/web/dist/vuvodesk-build-evidence.json +58 -58
  37. package/web/dist/assets/DesktopUpdatePanel-DopP2EeD.js +0 -1
  38. package/web/dist/assets/HubApp-CqNxUVJD.js +0 -182
  39. package/web/dist/assets/HubApp-DdHHVOM0.css +0 -1
  40. package/web/dist/assets/SettingsTabs-v57M-CCZ.js +0 -1
  41. package/web/dist/assets/frame-lifecycle-D91nchvm.js +0 -1
  42. package/web/dist/assets/main-BXBJt96-.js +0 -2
@@ -1 +1 @@
1
- import{j as t}from"./pwa-startup-BiuYh5eN.js";import{r as c,d as A,S as q,T as I,e as z}from"./icons-ChMazCZR.js";import{h as x}from"./MonitorStackIcon-led0pnag.js";import"./pwa-bootstrap-ljOQTt2e.js";const E={enabled:!0};function w(i){return{enabled:i?.enabled===!0}}async function L(i,p,f){let l=null;for(let s=0;s<2;s+=1){const g=await x("/api/settings",{signal:f},p);if(g.settings.agent?.enabled===i)return;try{await x("/api/settings",{method:"PATCH",signal:f,body:JSON.stringify({revision:g.revision,agent:{enabled:i}})},p);return}catch(a){if(l=a,s!==0||!String(a instanceof Error?a.message:a).startsWith("409 "))throw a}}throw l}function H({hubUrl:i,showToast:p}){const[f,l]=c.useState(E),[s,g]=c.useState(null),[a,m]=c.useState(""),[j,v]=c.useState(""),[y,d]=c.useState(""),b=c.useRef(0),u=c.useRef(null);c.useEffect(()=>{let e=!0;u.current?.abort();const n=new AbortController;u.current=n;const h=++b.current;return g(null),l(E),m(""),d(""),v(""),x("/api/settings/agent",{signal:n.signal},i).then(o=>{!e||n.signal.aborted||h!==b.current||(g(o.settings),l(w(o.settings)))}).catch(o=>{e&&!n.signal.aborted&&h===b.current&&d(o instanceof Error?o.message:String(o))}),()=>{e=!1,n.abort(),u.current===n&&(u.current=null)}},[i]);const k=(e,n)=>l(h=>({...h,[e]:n})),C=e=>{g(e),l(w(e))},S=()=>({generation:b.current,controller:u.current}),r=e=>e.generation===b.current&&e.controller!==null&&e.controller===u.current&&!e.controller.signal.aborted,R=async()=>{if(!s){d("Agent settings are not available yet.");return}const e=S();if(r(e)){m("save"),d(""),v("");try{if(await L(f.enabled,i,e.controller.signal),!r(e))return;const n=await x("/api/settings/agent",{signal:e.controller.signal},i);if(!r(e))return;C(n.settings),v("Codex Agent settings saved.")}catch(n){r(e)&&d(n instanceof Error?n.message:String(n))}finally{r(e)&&m("")}}},T=async()=>{const e=S();if(r(e)){m("test"),d(""),v("");try{const n=await x("/api/settings/agent/test",{method:"POST",signal:e.controller.signal,body:JSON.stringify({})},i);if(!r(e))return;const h=await x("/api/settings/agent",{signal:e.controller.signal},i);if(!r(e))return;C(h.settings);const o=Number.isFinite(n.connection?.latencyMs)?Math.max(0,Math.round(n.connection.latencyMs)):null;p(`Codex Agent connection verified${o!==null?` in ${o} ms.`:"."}`,"success")}catch(n){r(e)&&d(n instanceof Error?n.message:String(n))}finally{r(e)&&m("")}}},D=s?.codexInstallation==="installed"&&s.codexAuth==="signed-in",N=s!==null;return t.jsxs("div",{className:"settings-tab-content agent-settings-content",children:[t.jsxs("section",{className:"settings-section-card agent-enable-card",children:[t.jsxs("label",{className:"settings-toggle agent-enable-toggle",children:[t.jsx("input",{type:"checkbox",checked:f.enabled,onChange:e=>k("enabled",e.target.checked),disabled:!N||a!==""}),t.jsx("span",{children:"Enable Codex Agent"})]}),t.jsxs("p",{className:"settings-help",children:[t.jsx(A,{size:12})," Enabled by default. Agent commands use only the Codex account signed in on this Hub."]})]}),y&&t.jsx("div",{className:"agent-settings-alert error",role:"alert",children:y}),j&&t.jsx("div",{className:"agent-settings-alert success",role:"status",children:j}),t.jsxs("section",{className:"settings-section-card",children:[t.jsxs("div",{className:"settings-section-heading",children:[t.jsxs("div",{children:[t.jsx("span",{children:"Connection"}),t.jsx("h3",{children:"Codex SDK / CLI"})]}),t.jsx(q,{size:20})]}),t.jsxs("div",{className:"agent-connection-row",children:[t.jsx("span",{className:`agent-connection-dot ${D?"connected":s?.codexAuth==="not-signed-in"?"unavailable":""}`}),t.jsx("span",{children:s?.codexInstallation==="not-installed"?"Codex SDK not installed":s?.codexAuth==="signed-in"?"Codex CLI signed in":s?.codexAuth==="not-signed-in"?"Codex CLI sign-in required":"Codex status not tested"}),t.jsxs("button",{className:"settings-reset",onClick:()=>{T()},disabled:a!=="",type:"button",children:[t.jsx(I,{size:15})," ",a==="test"?"Testing":"Test connection"]})]}),t.jsxs("p",{className:"settings-help",children:[t.jsx(A,{size:12})," The Hub uses the installed Codex SDK / CLI to plan approved commands and run them through VuvoDesk Agent tools on selected computers. VuvoDesk never asks for separate credentials."]})]}),t.jsx("div",{className:"settings-action-row agent-settings-actions",children:t.jsxs("button",{className:"text-button primary",onClick:()=>{R()},disabled:!N||a!=="",type:"button",children:[t.jsx(z,{size:15})," ",a==="save"?"Saving":"Save Agent settings"]})})]})}export{H as AgentSettingsTab};
1
+ import{j as t}from"./pwa-startup-C8kDd3Vd.js";import{r as c,d as A,S as q,T as I,e as z}from"./icons-BwhnWKHR.js";import{h as x}from"./MonitorStackIcon-BD7Yn-Z9.js";import"./pwa-bootstrap-ljOQTt2e.js";const E={enabled:!0};function w(i){return{enabled:i?.enabled===!0}}async function L(i,p,f){let l=null;for(let s=0;s<2;s+=1){const g=await x("/api/settings",{signal:f},p);if(g.settings.agent?.enabled===i)return;try{await x("/api/settings",{method:"PATCH",signal:f,body:JSON.stringify({revision:g.revision,agent:{enabled:i}})},p);return}catch(a){if(l=a,s!==0||!String(a instanceof Error?a.message:a).startsWith("409 "))throw a}}throw l}function H({hubUrl:i,showToast:p}){const[f,l]=c.useState(E),[s,g]=c.useState(null),[a,m]=c.useState(""),[j,v]=c.useState(""),[y,d]=c.useState(""),b=c.useRef(0),u=c.useRef(null);c.useEffect(()=>{let e=!0;u.current?.abort();const n=new AbortController;u.current=n;const h=++b.current;return g(null),l(E),m(""),d(""),v(""),x("/api/settings/agent",{signal:n.signal},i).then(o=>{!e||n.signal.aborted||h!==b.current||(g(o.settings),l(w(o.settings)))}).catch(o=>{e&&!n.signal.aborted&&h===b.current&&d(o instanceof Error?o.message:String(o))}),()=>{e=!1,n.abort(),u.current===n&&(u.current=null)}},[i]);const k=(e,n)=>l(h=>({...h,[e]:n})),C=e=>{g(e),l(w(e))},S=()=>({generation:b.current,controller:u.current}),r=e=>e.generation===b.current&&e.controller!==null&&e.controller===u.current&&!e.controller.signal.aborted,R=async()=>{if(!s){d("Agent settings are not available yet.");return}const e=S();if(r(e)){m("save"),d(""),v("");try{if(await L(f.enabled,i,e.controller.signal),!r(e))return;const n=await x("/api/settings/agent",{signal:e.controller.signal},i);if(!r(e))return;C(n.settings),v("Codex Agent settings saved.")}catch(n){r(e)&&d(n instanceof Error?n.message:String(n))}finally{r(e)&&m("")}}},T=async()=>{const e=S();if(r(e)){m("test"),d(""),v("");try{const n=await x("/api/settings/agent/test",{method:"POST",signal:e.controller.signal,body:JSON.stringify({})},i);if(!r(e))return;const h=await x("/api/settings/agent",{signal:e.controller.signal},i);if(!r(e))return;C(h.settings);const o=Number.isFinite(n.connection?.latencyMs)?Math.max(0,Math.round(n.connection.latencyMs)):null;p(`Codex Agent connection verified${o!==null?` in ${o} ms.`:"."}`,"success")}catch(n){r(e)&&d(n instanceof Error?n.message:String(n))}finally{r(e)&&m("")}}},D=s?.codexInstallation==="installed"&&s.codexAuth==="signed-in",N=s!==null;return t.jsxs("div",{className:"settings-tab-content agent-settings-content",children:[t.jsxs("section",{className:"settings-section-card agent-enable-card",children:[t.jsxs("label",{className:"settings-toggle agent-enable-toggle",children:[t.jsx("input",{type:"checkbox",checked:f.enabled,onChange:e=>k("enabled",e.target.checked),disabled:!N||a!==""}),t.jsx("span",{children:"Enable Codex Agent"})]}),t.jsxs("p",{className:"settings-help",children:[t.jsx(A,{size:12})," Enabled by default. Agent commands use only the Codex account signed in on this Hub."]})]}),y&&t.jsx("div",{className:"agent-settings-alert error",role:"alert",children:y}),j&&t.jsx("div",{className:"agent-settings-alert success",role:"status",children:j}),t.jsxs("section",{className:"settings-section-card",children:[t.jsxs("div",{className:"settings-section-heading",children:[t.jsxs("div",{children:[t.jsx("span",{children:"Connection"}),t.jsx("h3",{children:"Codex SDK / CLI"})]}),t.jsx(q,{size:20})]}),t.jsxs("div",{className:"agent-connection-row",children:[t.jsx("span",{className:`agent-connection-dot ${D?"connected":s?.codexAuth==="not-signed-in"?"unavailable":""}`}),t.jsx("span",{children:s?.codexInstallation==="not-installed"?"Codex SDK not installed":s?.codexAuth==="signed-in"?"Codex CLI signed in":s?.codexAuth==="not-signed-in"?"Codex CLI sign-in required":"Codex status not tested"}),t.jsxs("button",{className:"settings-reset",onClick:()=>{T()},disabled:a!=="",type:"button",children:[t.jsx(I,{size:15})," ",a==="test"?"Testing":"Test connection"]})]}),t.jsxs("p",{className:"settings-help",children:[t.jsx(A,{size:12})," The Hub uses the installed Codex SDK / CLI to plan approved commands and run them through VuvoDesk Agent tools on selected computers. VuvoDesk never asks for separate credentials."]})]}),t.jsx("div",{className:"settings-action-row agent-settings-actions",children:t.jsxs("button",{className:"text-button primary",onClick:()=>{R()},disabled:!N||a!=="",type:"button",children:[t.jsx(z,{size:15})," ",a==="save"?"Saving":"Save Agent settings"]})})]})}export{H as AgentSettingsTab};
@@ -1,4 +1,4 @@
1
- import{j as t}from"./pwa-startup-BiuYh5eN.js";import{r as d,ae as ht,af as Ce,a3 as yt,y as ee,X as xe,ag as vt,ah as wt,ai as Ze,aj as kt,ak as bt,al as Se,b as H,am as Ct,O as xt,an as _e,m as St,ao as jt,S as Je,ap as At,N as Rt,c as Nt,aq as Pt,ar as It,A as Tt,as as ue,M as Xe}from"./icons-ChMazCZR.js";import{r as Et,h as F}from"./MonitorStackIcon-led0pnag.js";import"./pwa-bootstrap-ljOQTt2e.js";const Ot=d.forwardRef(function({value:s,onChange:n,onSubmit:r,onOpenSuggestedTasks:i,suggestedOpen:m=!1,suggestedTaskCount:c,disabled:v=!1,placeholder:S="Ask VuvoDesk to work across your machines...",compact:g=!1},x){return t.jsxs("form",{className:"agents-composer",onSubmit:w=>{w.preventDefault(),r()},children:[t.jsx("button",{className:`agents-suggested-trigger ${m?"active":""}`,type:"button","aria-label":c===void 0?"Open Suggested tasks":`Open Suggested tasks (${c} available)`,"aria-expanded":m,onClick:i,disabled:v,children:t.jsx(ht,{size:17})}),t.jsx("textarea",{ref:x,value:s,onChange:w=>n(w.target.value.slice(0,4e3)),placeholder:S,"aria-label":"Ask VuvoDesk",rows:g?1:2,disabled:v}),t.jsxs("button",{className:"agents-run-button",type:"submit",disabled:v||!s.trim(),children:[v?t.jsx(Ce,{className:"spin",size:16}):t.jsx(yt,{size:16}),v?"Running":"Run"]})]})}),$t=["read","processControl","serviceControl","applicationControl","fileRead","fileWrite","fileDelete","shell","script","softwareInstall","network","systemPower","systemConfiguration","userAccount"];function de(e){return e.deviceName?.trim()||e.hostname?.trim()||e.deviceId}function pe(e){return e.connected!==!0?!1:e.synthetic===!0?!0:!e.channels||e.channels.control===!0}function Dt(e){return e==="running"||e==="completed"||e==="failed"||e==="cancelled"?e:"queued"}function _t(e){switch(e){case"process.list":return"Process list";case"system.health":return"System health";case"gpu.status":return"GPU status";case"disk.status":return"Disk status";case"service.status":return"Service status";case"diagnostics.collect":return"Diagnostics";case"process.control":return"Process control";case"service.control":return"Service control";case"application.launch":return"Launch application";case"application.close":return"Close application";case"file.read":return"Read file";case"file.write":return"Write file";case"file.delete":return"Delete file";case"file.list":return"List directory";case"command.run":return"Run command";case"script.run":return"Run script";case"software.install":return"Install software";case"network.status":return"Network status";case"system.power":return"Power action";case"system.configure":return"System configuration";case"logs.collect":return"Collect logs"}}const Mt=64*1024,Me="[Earlier log output hidden by PWA display limit.]",Qe=new TextEncoder,zt=new TextDecoder("utf-8",{fatal:!0}),ze=16*1024,Lt=200,Le="(?:access[_-]?(?:token|key)|refresh[_-]?token|id[_-]?token|pair[_-]?(?:token|key)|authorization|api[_-]?key|private[_-]?key|connection[_-]?string|credential|password|passwd|secret|cookie|set-cookie)",Ft="(?:access[_-]?(?:token|key)|refresh[_-]?token|id[_-]?token|pair[_-]?(?:token|key)|token|authorization|api[_-]?key|private[_-]?key|connection[_-]?string|credential|password|passwd|secret|cookie|set-cookie)",Bt="(?:access[_-]?(?:token|key)|refresh[_-]?token|id[_-]?token|pair[_-]?(?:token|key)|token|authorization|api[_-]?key|credential|password|secret|cookie)",qt=/\b(?:sk-(?:proj-|ant-)?[A-Za-z0-9_-]{8,}|gh[pousr]_[A-Za-z0-9]{8,}|github_pat_[A-Za-z0-9_]{8,}|(?:AKIA|ASIA)[A-Z0-9]{16}|AIza[A-Za-z0-9_-]{35}|npm_[A-Za-z0-9]{8,}|xox[a-z]-[A-Za-z0-9-]{8,}|(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{8,})\b/g;function Ut(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function Fe(e){return Qe.encode(e).byteLength}function Be(e,s){const n=Qe.encode(e);if(n.byteLength<=s)return{value:e,truncated:!1};let r=n.byteLength-s;for(;r<n.byteLength&&(n[r]&192)===128;)r+=1;let i=zt.decode(n.subarray(r));const m=i.indexOf(`
1
+ import{j as t}from"./pwa-startup-C8kDd3Vd.js";import{r as d,ae as ht,af as Ce,a3 as yt,y as ee,X as xe,ag as vt,ah as wt,ai as Ze,aj as kt,ak as bt,al as Se,b as H,am as Ct,O as xt,an as _e,m as St,ao as jt,S as Je,ap as At,N as Rt,c as Nt,aq as Pt,ar as It,A as Tt,as as ue,M as Xe}from"./icons-BwhnWKHR.js";import{r as Et,h as F}from"./MonitorStackIcon-BD7Yn-Z9.js";import"./pwa-bootstrap-ljOQTt2e.js";const Ot=d.forwardRef(function({value:s,onChange:n,onSubmit:r,onOpenSuggestedTasks:i,suggestedOpen:m=!1,suggestedTaskCount:c,disabled:v=!1,placeholder:S="Ask VuvoDesk to work across your machines...",compact:g=!1},x){return t.jsxs("form",{className:"agents-composer",onSubmit:w=>{w.preventDefault(),r()},children:[t.jsx("button",{className:`agents-suggested-trigger ${m?"active":""}`,type:"button","aria-label":c===void 0?"Open Suggested tasks":`Open Suggested tasks (${c} available)`,"aria-expanded":m,onClick:i,disabled:v,children:t.jsx(ht,{size:17})}),t.jsx("textarea",{ref:x,value:s,onChange:w=>n(w.target.value.slice(0,4e3)),placeholder:S,"aria-label":"Ask VuvoDesk",rows:g?1:2,disabled:v}),t.jsxs("button",{className:"agents-run-button",type:"submit",disabled:v||!s.trim(),children:[v?t.jsx(Ce,{className:"spin",size:16}):t.jsx(yt,{size:16}),v?"Running":"Run"]})]})}),$t=["read","processControl","serviceControl","applicationControl","fileRead","fileWrite","fileDelete","shell","script","softwareInstall","network","systemPower","systemConfiguration","userAccount"];function de(e){return e.deviceName?.trim()||e.hostname?.trim()||e.deviceId}function pe(e){return e.connected!==!0?!1:e.synthetic===!0?!0:!e.channels||e.channels.control===!0}function Dt(e){return e==="running"||e==="completed"||e==="failed"||e==="cancelled"?e:"queued"}function _t(e){switch(e){case"process.list":return"Process list";case"system.health":return"System health";case"gpu.status":return"GPU status";case"disk.status":return"Disk status";case"service.status":return"Service status";case"diagnostics.collect":return"Diagnostics";case"process.control":return"Process control";case"service.control":return"Service control";case"application.launch":return"Launch application";case"application.close":return"Close application";case"file.read":return"Read file";case"file.write":return"Write file";case"file.delete":return"Delete file";case"file.list":return"List directory";case"command.run":return"Run command";case"script.run":return"Run script";case"software.install":return"Install software";case"network.status":return"Network status";case"system.power":return"Power action";case"system.configure":return"System configuration";case"logs.collect":return"Collect logs"}}const Mt=64*1024,Me="[Earlier log output hidden by PWA display limit.]",Qe=new TextEncoder,zt=new TextDecoder("utf-8",{fatal:!0}),ze=16*1024,Lt=200,Le="(?:access[_-]?(?:token|key)|refresh[_-]?token|id[_-]?token|pair[_-]?(?:token|key)|authorization|api[_-]?key|private[_-]?key|connection[_-]?string|credential|password|passwd|secret|cookie|set-cookie)",Ft="(?:access[_-]?(?:token|key)|refresh[_-]?token|id[_-]?token|pair[_-]?(?:token|key)|token|authorization|api[_-]?key|private[_-]?key|connection[_-]?string|credential|password|passwd|secret|cookie|set-cookie)",Bt="(?:access[_-]?(?:token|key)|refresh[_-]?token|id[_-]?token|pair[_-]?(?:token|key)|token|authorization|api[_-]?key|credential|password|secret|cookie)",qt=/\b(?:sk-(?:proj-|ant-)?[A-Za-z0-9_-]{8,}|gh[pousr]_[A-Za-z0-9]{8,}|github_pat_[A-Za-z0-9_]{8,}|(?:AKIA|ASIA)[A-Z0-9]{16}|AIza[A-Za-z0-9_-]{35}|npm_[A-Za-z0-9]{8,}|xox[a-z]-[A-Za-z0-9-]{8,}|(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{8,})\b/g;function Ut(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function Fe(e){return Qe.encode(e).byteLength}function Be(e,s){const n=Qe.encode(e);if(n.byteLength<=s)return{value:e,truncated:!1};let r=n.byteLength-s;for(;r<n.byteLength&&(n[r]&192)===128;)r+=1;let i=zt.decode(n.subarray(r));const m=i.indexOf(`
2
2
  `);return m>=0&&m<i.length-1&&(i=i.slice(m+1)),{value:i,truncated:!0}}function et(e){return e.replace(/-----BEGIN [^-\r\n]*PRIVATE KEY-----[\s\S]*?-----END [^-\r\n]*PRIVATE KEY-----/gi,"[REDACTED PRIVATE KEY]").replace(/\b(?:proxy-)?authorization\s*[:=]\s*[^\r\n]*|\b(?:set-)?cookie\s*[:=]\s*[^\r\n]*/gi,"credential-header=[REDACTED]").replace(/\bBearer\s+(?:"[^"]*"|'[^']*'|[^\s,;]+)/gi,"Bearer [REDACTED]").replace(new RegExp(`("${Le}"\\s*:\\s*")[^"\\r\\n]*(")`,"gi"),"$1[REDACTED]$2").replace(new RegExp(`('${Le}'\\s*:\\s*')[^'\\r\\n]*(')`,"gi"),"$1[REDACTED]$2").replace(new RegExp(`((?:[A-Za-z0-9.-]+[_-])?${Ft}\\s*[:=]\\s*)(?!\\[REDACTED\\])[^\\s,;&]+`,"gi"),"$1[REDACTED]").replace(new RegExp(`([?&]${Bt}=)[^&\\s]+`,"gi"),"$1[REDACTED]").replace(/\b(?:eyJ|[A-Za-z0-9_-]{8,}\.)[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g,"[REDACTED TOKEN]").replace(qt,"[REDACTED KEY]")}function Gt(e){return typeof e!="string"?"source unknown":et(e).replace(/[\u0000-\u001f\u007f]/g," ").trim().slice(0,64)||"source unknown"}function qe(e){return typeof e=="number"&&Number.isSafeInteger(e)&&e>=0?Math.floor(e):null}function Vt(e){if(typeof e!="string"||e.length===0)return{output:"",displayTruncated:!1};const s=Be(e.replace(/\r\n?/g,`
3
3
  `),Mt);let n=et(s.value).replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g," ").trim(),r=s.truncated;const i=n?n.split(`
4
4
  `):[];if(i.length>Lt-1&&(n=i.slice(-199).join(`
@@ -1 +1 @@
1
- import{j as e}from"./pwa-startup-BiuYh5eN.js";import{r as i,R as x,E as j,D as u,f as g,h as f}from"./icons-ChMazCZR.js";import{l as b,c as d,d as y}from"./HubApp-CqNxUVJD.js";import"./pwa-bootstrap-ljOQTt2e.js";import"./public-site-routing-pddZbLCj.js";import"./MonitorStackIcon-led0pnag.js";import"./supabase-C7qjtLN3.js";import"./frame-lifecycle-D91nchvm.js";function z({hubUrl:s,onToast:n}){const[o,m]=i.useState([]),[h,c]=i.useState(!0),r=i.useCallback(async()=>{c(!0);try{m((await b(s)).captures||[])}catch(t){n(t instanceof Error?t.message:String(t))}finally{c(!1)}},[s,n]);i.useEffect(()=>{r()},[r]);const p=async t=>{const a=d(t.id,s);if(navigator.share)try{await navigator.share({title:t.fileName,url:a});return}catch{}window.open(a,"_blank","noopener,noreferrer")};return e.jsxs("section",{className:"capture-gallery",children:[e.jsxs("header",{children:[e.jsxs("div",{children:[e.jsx("span",{className:"settings-eyebrow",children:"Capture Gallery"}),e.jsx("h2",{children:"Saved captures"})]}),e.jsxs("button",{className:"text-button",onClick:()=>{r()},type:"button",children:[e.jsx(x,{size:15})," Refresh"]})]}),h?e.jsx("p",{className:"settings-help",children:"Loading captures..."}):o.length===0?e.jsx("p",{className:"settings-help",children:"No captures saved yet."}):e.jsx("div",{className:"capture-gallery-grid",children:o.map(t=>{const a=d(t.id,s);return e.jsxs("article",{className:"capture-gallery-card",children:[t.mimeType.startsWith("image/")?e.jsx("img",{src:a,alt:t.target.label}):e.jsx("video",{src:a,controls:!0,preload:"metadata"}),e.jsxs("div",{className:"capture-gallery-card-body",children:[e.jsx("strong",{children:t.fileName}),e.jsxs("small",{children:[t.target.label," · ",new Date(t.createdAt).toLocaleString()," · ",Math.ceil(t.sizeBytes/1024)," KB"]}),e.jsxs("div",{children:[e.jsx("button",{className:"icon-button",title:"Open","aria-label":"Open",onClick:()=>window.open(a,"_blank","noopener,noreferrer"),type:"button",children:e.jsx(j,{size:15})}),e.jsx("a",{className:"icon-button",title:"Download","aria-label":"Download",href:`${a}?download=1`,download:t.fileName,children:e.jsx(u,{size:15})}),e.jsx("button",{className:"icon-button",title:"Share","aria-label":"Share",onClick:()=>{p(t)},type:"button",children:e.jsx(g,{size:15})}),e.jsx("button",{className:"icon-button danger",title:"Delete","aria-label":"Delete",onClick:()=>{window.confirm(`Delete ${t.fileName}?`)&&y(t.id,s).then(()=>r()).catch(l=>n(l instanceof Error?l.message:String(l)))},type:"button",children:e.jsx(f,{size:15})})]})]})]},t.id)})})]})}export{z as CaptureGallery};
1
+ import{j as e}from"./pwa-startup-C8kDd3Vd.js";import{r as i,R as x,E as j,D as u,f as g,h as f}from"./icons-BwhnWKHR.js";import{l as b,c as d,d as y}from"./HubApp-DJsiVqWP.js";import"./pwa-bootstrap-ljOQTt2e.js";import"./public-site-routing-pddZbLCj.js";import"./MonitorStackIcon-BD7Yn-Z9.js";import"./supabase-C7qjtLN3.js";import"./frame-lifecycle-D-BxeTQV.js";function z({hubUrl:s,onToast:n}){const[o,m]=i.useState([]),[h,c]=i.useState(!0),r=i.useCallback(async()=>{c(!0);try{m((await b(s)).captures||[])}catch(t){n(t instanceof Error?t.message:String(t))}finally{c(!1)}},[s,n]);i.useEffect(()=>{r()},[r]);const p=async t=>{const a=d(t.id,s);if(navigator.share)try{await navigator.share({title:t.fileName,url:a});return}catch{}window.open(a,"_blank","noopener,noreferrer")};return e.jsxs("section",{className:"capture-gallery",children:[e.jsxs("header",{children:[e.jsxs("div",{children:[e.jsx("span",{className:"settings-eyebrow",children:"Capture Gallery"}),e.jsx("h2",{children:"Saved captures"})]}),e.jsxs("button",{className:"text-button",onClick:()=>{r()},type:"button",children:[e.jsx(x,{size:15})," Refresh"]})]}),h?e.jsx("p",{className:"settings-help",children:"Loading captures..."}):o.length===0?e.jsx("p",{className:"settings-help",children:"No captures saved yet."}):e.jsx("div",{className:"capture-gallery-grid",children:o.map(t=>{const a=d(t.id,s);return e.jsxs("article",{className:"capture-gallery-card",children:[t.mimeType.startsWith("image/")?e.jsx("img",{src:a,alt:t.target.label}):e.jsx("video",{src:a,controls:!0,preload:"metadata"}),e.jsxs("div",{className:"capture-gallery-card-body",children:[e.jsx("strong",{children:t.fileName}),e.jsxs("small",{children:[t.target.label," · ",new Date(t.createdAt).toLocaleString()," · ",Math.ceil(t.sizeBytes/1024)," KB"]}),e.jsxs("div",{children:[e.jsx("button",{className:"icon-button",title:"Open","aria-label":"Open",onClick:()=>window.open(a,"_blank","noopener,noreferrer"),type:"button",children:e.jsx(j,{size:15})}),e.jsx("a",{className:"icon-button",title:"Download","aria-label":"Download",href:`${a}?download=1`,download:t.fileName,children:e.jsx(u,{size:15})}),e.jsx("button",{className:"icon-button",title:"Share","aria-label":"Share",onClick:()=>{p(t)},type:"button",children:e.jsx(g,{size:15})}),e.jsx("button",{className:"icon-button danger",title:"Delete","aria-label":"Delete",onClick:()=>{window.confirm(`Delete ${t.fileName}?`)&&y(t.id,s).then(()=>r()).catch(l=>n(l instanceof Error?l.message:String(l)))},type:"button",children:e.jsx(f,{size:15})})]})]})]},t.id)})})]})}export{z as CaptureGallery};
@@ -0,0 +1 @@
1
+ import{j as e}from"./pwa-startup-C8kDd3Vd.js";import{r as o,P as g,D as b,R as D}from"./icons-BwhnWKHR.js";import"./pwa-bootstrap-ljOQTt2e.js";function V(t){if(!t)return"Reading the installed version...";const a=String(t.errorCode||t.error||"");switch(t.state){case"checking":return"Checking for a newer VuvoDesk version...";case"available":return`Version ${t.availableVersion||""} is available.`;case"downloading":return`Downloading version ${t.availableVersion||""} (${Math.round(t.progress||0)}%).`;case"downloaded":return`Version ${t.availableVersion||""} is ready. Restart to install it.`;case"installing":return"Closing VuvoDesk safely and starting the update...";case"current":return"This computer has the latest VuvoDesk version.";case"error":return/authorization-required/i.test(a)?"Linux could not authorize or start the installer. Check for updates here, then choose Restart and update and approve the administrator request.":/runtime-recovery-failed/i.test(a)?"The local VuvoDesk service could not restart. Quit VuvoDesk completely and reopen it.":/owner-cleanup-stuck|owner-reset-failed/i.test(a)?"The Windows update service could not reset. Quit VuvoDesk completely, reopen it, and check again.":/installer-launch-failed/i.test(a)?"The installer could not start. VuvoDesk restored its local service so you can retry.":/version-mismatch/i.test(a)?"The downloaded update did not match the expected version. VuvoDesk will retry safely.":/stalled|timed-out/i.test(a)?"The update connection stopped responding. VuvoDesk will retry automatically.":"The update server could not be reached. VuvoDesk will retry automatically.";case"development":return"Desktop updates are available in an installed VuvoDesk build.";case"unavailable":return"Updates are not available for this desktop build.";default:return"VuvoDesk checks once when the desktop app starts."}}function C(){const t=window.liveDesk?.updates,a=window.liveDesk?.app,[s,i]=o.useState(null),[f,u]=o.useState(!1),[n,p]=o.useState(null),[m,h]=o.useState(!1);if(o.useEffect(()=>{if(!t)return;let r=!0;t.getStatus?.().then(c=>{r&&i(c)});const d=t.onStatus?.(c=>{r&&i(c)});return()=>{r=!1,d?.()}},[t]),o.useEffect(()=>{if(!a?.getAutoStart)return;let r=!0;return a.getAutoStart().then(d=>{r&&p(d)}),()=>{r=!1}},[a]),!t&&!a?.getAutoStart)return null;const v=s?.state==="downloaded"||s?.downloaded===!0,k=!!s?.reopenRequired||/runtime-recovery-failed|owner-cleanup-stuck|owner-reset-failed/i.test(String(s?.errorCode||"")),l=f||s?.state==="checking"||s?.state==="downloading"||s?.state==="installing",x=s?.channel==="dev"?"Development":s?.channel==="stable"?"Stable":s?.channel||"Unknown",j=async()=>{if(t){u(!0);try{const r=v?await t.install?.():await t.check?.();r&&i(r)}finally{u(!1)}}},w=async r=>{if(a?.setAutoStart){h(!0);try{p(await a.setAutoStart(r))}finally{h(!1)}}},y=n?.enabled!==n?.registered;return e.jsxs(e.Fragment,{children:[n?.supported===!0&&e.jsxs("section",{className:"settings-section-card desktop-auto-start-card",children:[e.jsxs("div",{className:"settings-section-heading",children:[e.jsxs("div",{children:[e.jsx("span",{children:"Computer startup"}),e.jsx("h3",{children:"Start VuvoDesk after this computer restarts"})]}),e.jsx(g,{size:20})]}),e.jsx("p",{className:"settings-help",children:"VuvoDesk starts automatically when you sign in after Windows, macOS, or Linux restarts, then reconnects this computer quietly."}),e.jsxs("div",{className:"desktop-auto-start-setting",children:[e.jsxs("div",{className:"desktop-auto-start-copy",children:[e.jsx(g,{size:18}),e.jsxs("span",{children:[e.jsx("strong",{children:"Automatic startup"}),e.jsx("small",{children:"You can also change this from the VuvoDesk tray menu."})]})]}),e.jsxs("label",{className:"settings-toggle desktop-auto-start-toggle",children:[e.jsx("input",{"aria-label":"Start VuvoDesk after this computer restarts",type:"checkbox",checked:n.enabled,onChange:r=>{w(r.target.checked)},disabled:m}),e.jsx("span",{children:n.enabled?"On":"Off"})]}),(n.error||y)&&e.jsx("p",{className:"desktop-auto-start-error",role:"alert",children:"Automatic startup could not be registered. VuvoDesk saved your choice and will retry next time it opens."})]})]}),t&&e.jsxs("section",{className:"settings-section-card desktop-update-card",children:[e.jsxs("div",{className:"settings-section-heading",children:[e.jsxs("div",{children:[e.jsx("span",{children:"Desktop app"}),e.jsx("h3",{children:"VuvoDesk updates"})]}),e.jsx(b,{size:20})]}),e.jsx("p",{className:"settings-help","aria-live":"polite",children:V(s)}),e.jsxs("div",{className:"desktop-update-meta",children:[e.jsx("span",{children:"Installed"}),e.jsx("strong",{children:s?.currentVersion||"Unknown"}),e.jsx("span",{children:"Channel"}),e.jsx("strong",{children:x}),s?.availableVersion&&e.jsxs(e.Fragment,{children:[e.jsx("span",{children:"Available"}),e.jsx("strong",{children:s.availableVersion})]})]}),e.jsxs("button",{className:"settings-reset desktop-update-action",onClick:()=>{j()},disabled:l||k,type:"button",children:[e.jsx(D,{size:15,className:l?"desktop-update-spin":""}),k?"Reopen VuvoDesk":v?"Restart and update":l?"Updating...":"Check for updates"]})]})]})}export{C as DesktopUpdatePanel};
@@ -0,0 +1 @@
1
+ .account-dialog-backdrop{position:fixed;inset:0;z-index:1700;display:grid;place-items:center;padding:20px;background:#080f1ca3;backdrop-filter:blur(5px);-webkit-backdrop-filter:blur(5px);overscroll-behavior:contain}.account-dialog{width:min(1120px,calc(100vw - 40px));max-height:min(860px,calc(100dvh - 40px));display:grid;grid-template-rows:auto minmax(0,1fr) auto;overflow:hidden;color:#172033;border:1px solid rgb(255 255 255 / 72%);border-radius:24px;background:#f8fafc;box-shadow:0 28px 80px #03081459}.account-dialog button,.account-dialog input{font:inherit}.account-dialog button{touch-action:manipulation}.account-dialog-header{min-height:88px;display:flex;align-items:center;justify-content:space-between;gap:24px;padding:18px 22px;border-bottom:1px solid #e5eaf1;background:#fff}.account-dialog-identity{min-width:0;display:flex;align-items:center;gap:14px}.account-dialog-identity>span:last-child{min-width:0;display:grid;gap:2px}.account-dialog-identity small,.account-section-heading>div>span,.account-current-plan-copy small{color:#68758a;font-size:11px;font-weight:750;letter-spacing:.055em;text-transform:uppercase}.account-dialog-identity strong{overflow:hidden;font-size:18px;line-height:1.25;text-overflow:ellipsis;white-space:nowrap}.account-dialog-identity>span:last-child>span{overflow:hidden;color:#6b7280;font-size:12px;text-overflow:ellipsis;white-space:nowrap}.account-dialog-avatar{width:50px;height:50px;flex:0 0 50px;display:grid;place-items:center;overflow:hidden;color:#fff;border-radius:16px;background:#172033;font-size:18px;font-weight:800}.account-dialog-avatar img{width:100%;height:100%;object-fit:cover}.account-dialog-close{width:40px;height:40px;flex:0 0 40px;display:grid;place-items:center;color:#5b6574;border:1px solid #dbe1e9;border-radius:12px;background:#f8fafc;cursor:pointer}.account-dialog-close:hover,.account-dialog-close:focus-visible{color:#111827;border-color:#aeb8c6;outline:3px solid rgb(91 87 255 / 16%)}.account-dialog-body{min-height:0;display:grid;gap:22px;padding:22px;overflow-y:auto;overscroll-behavior:contain}.account-workspace-switcher{display:grid;gap:9px}.account-workspace-switcher>div:first-child{display:flex;align-items:baseline;justify-content:space-between;gap:12px}.account-workspace-switcher>div:first-child>span{color:#273449;font-size:11px;font-weight:820;letter-spacing:.045em;text-transform:uppercase}.account-workspace-switcher>div:first-child>small{color:#7b8595;font-size:10px}.account-workspace-list{display:flex;gap:8px;overflow-x:auto;padding:2px;scrollbar-width:thin}.account-workspace-list button{min-width:195px;display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:9px;padding:10px;color:#435066;border:1px solid #dfe5ed;border-radius:12px;background:#fff;text-align:left;cursor:pointer}.account-workspace-list button.active{color:#2f2a70;border-color:#8c85e8;background:#f3f1ff;box-shadow:0 0 0 2px #5b57ff17}.account-workspace-list button:disabled:not(.active){opacity:.58;cursor:not-allowed}.account-workspace-list button>span:first-child{width:30px;height:30px;display:grid;place-items:center;color:#fff;border-radius:9px;background:#26354c}.account-workspace-list button.active>span:first-child{background:#5b57cf}.account-workspace-list button>span:nth-child(2){min-width:0;display:grid;gap:2px}.account-workspace-list button strong,.account-workspace-list button small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.account-workspace-list button strong{font-size:11px}.account-workspace-list button small{color:#7b8595;font-size:9px}.account-workspace-list button em{color:#5a55a9;font-size:9px;font-style:normal;font-weight:800}.account-current-plan{display:grid;grid-template-columns:minmax(220px,1.1fr) minmax(190px,.75fr) minmax(220px,.9fr);align-items:center;gap:20px;padding:20px;color:#fff;border-radius:18px;background:linear-gradient(135deg,#111827,#25344d);box-shadow:0 12px 30px #0f172a24}.account-current-plan.plan-plus{background:linear-gradient(135deg,#312e81,#5b57ff)}.account-current-plan.plan-business{background:linear-gradient(135deg,#0f3f38,#117565)}.account-current-plan.plan-team{background:linear-gradient(135deg,#4c1d95,#7c3aed)}.account-current-plan-copy{min-width:0;display:flex;align-items:center;gap:13px}.account-current-plan-copy>span:last-child{min-width:0;display:grid;gap:3px}.account-current-plan-copy small,.account-current-plan-copy>span:last-child>span{color:#ffffffb3}.account-current-plan-copy strong{font-size:22px}.account-current-plan-copy>span:last-child>span{overflow:hidden;font-size:12px;text-overflow:ellipsis;white-space:nowrap}.account-current-plan-icon{width:42px;height:42px;flex:0 0 42px;display:grid;place-items:center;border:1px solid rgb(255 255 255 / 18%);border-radius:13px;background:#ffffff1f}.account-device-usage{display:grid;gap:6px}.account-device-usage>span:first-child{display:flex;align-items:center;gap:6px;color:#ffffffb8;font-size:11px;font-weight:700}.account-device-usage>strong{font-size:22px}.account-device-usage>strong small{color:#ffffffa6;font-size:12px;font-weight:650}.account-device-meter{width:100%;height:5px;overflow:hidden;border-radius:999px;background:#ffffff2e}.account-device-meter i{height:100%;display:block;border-radius:inherit;background:#fff}.account-runtime-facts{margin:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.account-runtime-facts div{min-width:0;display:grid;gap:2px;padding:9px 11px;border:1px solid rgb(255 255 255 / 12%);border-radius:11px;background:#ffffff14}.account-runtime-facts dt{color:#fff9;font-size:10px}.account-runtime-facts dd{margin:0;overflow:hidden;font-size:11px;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.account-plan-section,.account-team-panel{display:grid;gap:14px}.account-developer-plan-notice{display:flex;align-items:center;gap:9px;padding:10px 12px;color:#4c1d95;border:1px solid #ddd6fe;border-radius:11px;background:#f5f3ff;font-size:11.5px;line-height:1.4}.account-developer-plan-notice svg{flex:0 0 auto}.account-developer-plan-notice strong{margin-right:4px}.account-section-heading{display:flex;align-items:end;justify-content:space-between;gap:18px}.account-section-heading h2{margin:4px 0 0;color:#172033;font-size:17px;letter-spacing:-.02em}.account-section-heading>small{color:#68758a;font-size:11px;text-align:right}.account-plan-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}.account-plan-card{min-width:0;display:grid;grid-template-rows:auto auto auto auto 1fr auto;gap:9px;padding:16px;border:1px solid #dfe5ed;border-radius:15px;background:#fff}.account-plan-card.current{border-color:#5b57ff;box-shadow:0 0 0 2px #5b57ff1c}.account-plan-card.plan-team{background:linear-gradient(180deg,#fbf9ff,#fff)}.account-plan-card-title{display:flex;align-items:center;justify-content:space-between;gap:8px}.account-plan-card-title>span{display:flex;align-items:center;gap:6px;color:#172033;font-size:14px;font-weight:800}.account-plan-card-title em{display:flex;align-items:center;gap:3px;padding:4px 6px;color:#4338ca;border-radius:999px;background:#eef2ff;font-size:9px;font-style:normal;font-weight:800;text-transform:uppercase}.account-plan-card>p{margin:0;color:#7a8494;font-size:11px}.account-plan-card>strong{color:#273449;font-size:12px}.account-plan-price{color:#172033;font-size:15px;font-weight:850;letter-spacing:-.025em}.account-plan-ltd-price{width:fit-content;padding:4px 7px;color:#075985;border:1px solid #bae6fd;border-radius:8px;background:#f0f9ff;font-size:10px;font-weight:800}.account-plan-card ul{margin:0;padding:0;display:grid;align-content:start;gap:7px;list-style:none}.account-plan-card li{display:flex;align-items:flex-start;gap:5px;color:#526075;font-size:10.5px;line-height:1.35}.account-plan-card li svg{flex:0 0 auto;margin-top:1px;color:#159275}.account-plan-action,.account-plan-state{min-height:34px;display:flex;align-items:center;justify-content:center;gap:6px;border-radius:10px;font-size:10.5px;font-weight:780}.account-plan-actions{display:grid;gap:6px}.account-plan-action{color:#fff;border:0;background:#172033;cursor:pointer}.account-plan-action.secondary{color:#273449;border:1px solid #cfd7e3;background:#f7f9fc}.account-plan-action.developer{background:#6d28d9}.account-plan-action.developer:hover,.account-plan-action.developer:focus-visible{background:#4c1d95}.account-plan-action.secondary:hover,.account-plan-action.secondary:focus-visible{color:#fff;border-color:#172033;background:#172033}.account-plan-action:hover,.account-plan-action:focus-visible{background:#000;outline:3px solid rgb(91 87 255 / 16%)}.account-plan-action:disabled{opacity:.5;cursor:not-allowed}.account-plan-state{color:#556176;border:1px solid #e3e7ed;background:#f6f8fa}.account-plan-card.current .account-plan-state{color:#4338ca;border-color:#d8d7ff;background:#f1f0ff}.account-team-panel{padding:18px;border:1px solid #dfd8f5;border-radius:16px;background:#fbf9ff}.account-team-members{margin:0;padding:0;display:grid;gap:7px;list-style:none}.account-team-rename{display:grid;gap:6px;margin-bottom:10px}.account-team-rename>label{color:#4e5a6c;font-size:10px;font-weight:750}.account-team-rename>span,.account-team-invite-compose{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:7px}.account-team-rename input,.account-team-rename button,.account-team-leave{height:38px;border-radius:10px;font-size:10.5px}.account-team-operator-note{margin:10px 0 0;padding:10px 12px;color:#514868;border:1px solid #ded6ef;border-radius:10px;background:#fff;font-size:10.5px;font-weight:700}.account-team-error{display:block;margin-top:8px;color:#b42318;font-size:10px}.account-session-revocation-error{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:.25rem .75rem;align-items:center;padding:.8rem .9rem;border:1px solid #fca5a5;border-radius:.75rem;background:#fff1f2;color:#7f1d1d}.account-session-revocation-error strong,.account-session-revocation-error span{grid-column:1}.account-session-revocation-error span{font-size:.8rem;color:#991b1b}.account-session-revocation-error button{grid-column:2;grid-row:1 / span 2;border:1px solid rgba(254,202,202,.42);border-radius:.55rem;padding:.55rem .7rem;background:#7f1d1d;color:#fff;cursor:pointer}.account-session-revocation-error button:disabled{cursor:wait;opacity:.6}.account-team-rename input{min-width:0;padding:0 11px;color:#172033;border:1px solid #d9d4e6;background:#fff}.account-team-rename button{padding:0 13px;color:#fff;border:0;background:#5b45bf;font-weight:780;cursor:pointer}.account-team-members li{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto auto;align-items:center;gap:10px;padding:9px 10px;border:1px solid #e3dff0;border-radius:11px;background:#fff}.account-member-avatar{width:31px;height:31px;display:grid;place-items:center;color:#fff;border-radius:9px;background:#6d5bd0;font-size:11px;font-weight:800}.account-team-members li>span:nth-child(2){min-width:0;display:grid}.account-team-members li strong,.account-team-members li small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.account-team-members li strong{font-size:11px}.account-team-members li small{color:#778195;font-size:9.5px}.account-team-members li em,.account-member-status{font-size:9px;font-style:normal;font-weight:750;text-transform:capitalize}.account-team-members li em{color:#4c3fb2}.account-member-status{padding:4px 6px;color:#17745f;border-radius:999px;background:#e7f7f1}.account-member-status.status-invited{color:#98620c;background:#fff5d9}.account-team-members li>button{color:#a23636;border:0;background:transparent;font-size:9.5px;font-weight:750;cursor:pointer}.account-team-invite{display:grid;gap:6px}.account-team-invite>label{color:#4e5a6c;font-size:10px;font-weight:750}.account-team-invite>span{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:7px}.account-team-invite input{min-width:0;height:38px;padding:0 11px;color:#172033;border:1px solid #d9d4e6;border-radius:10px;background:#fff;font-size:11px}.account-team-invite button{height:38px;display:flex;align-items:center;gap:6px;padding:0 13px;color:#fff;border:0;border-radius:10px;background:#5b45bf;font-size:10.5px;font-weight:780;cursor:pointer}.account-team-invite>.account-create-invite{width:fit-content}.account-team-invite-compose>.account-create-invite{width:auto}.account-team-invite-result{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:7px}.account-team-invite-result>small{grid-column:1 / -1;color:#746d86;font-size:9.5px}.account-team-invite>p{margin:0;color:#7a738b;font-size:9.5px}.account-team-invite button:disabled,.account-team-invite input:disabled{opacity:.55;cursor:not-allowed}.account-team-invite>small{color:#b42318;font-size:10px}.account-team-empty{margin:0;padding:15px;color:#6c6680;border:1px dashed #d6cde9;border-radius:11px;background:#ffffffb3;font-size:11px}.account-team-leave{width:fit-content;margin-top:10px;padding:0 13px;color:#a23636;border:1px solid #ead1d1;background:#fff;font-weight:750;cursor:pointer}.account-team-rename button:disabled,.account-team-rename input:disabled,.account-team-leave:disabled{opacity:.55;cursor:not-allowed}.account-dialog-footer{min-height:66px;display:flex;align-items:center;justify-content:space-between;gap:18px;padding:13px 22px;border-top:1px solid #e5eaf1;background:#fff}.account-dialog-footer>span{display:flex;align-items:center;gap:7px;color:#697589;font-size:11px}.account-auth-action{min-height:38px;display:flex;align-items:center;justify-content:center;gap:7px;padding:0 15px;color:#2c3749;border:1px solid #d8dee7;border-radius:11px;background:#fff;font-size:11px;font-weight:780;cursor:pointer}.account-auth-action.primary{color:#fff;border-color:#172033;background:#172033}.account-auth-action:disabled{opacity:.55;cursor:wait}@media(max-width:900px){.account-dialog{width:min(760px,calc(100vw - 24px));max-height:calc(100dvh - 24px);border-radius:20px}.account-dialog-backdrop{padding:12px}.account-current-plan{grid-template-columns:minmax(0,1fr) minmax(160px,.75fr)}.account-runtime-facts{grid-column:1 / -1}.account-plan-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(max-width:560px){.account-dialog-backdrop{align-items:stretch;padding:0}.account-dialog{width:100vw;max-height:100dvh;border:0;border-radius:0}.account-dialog-header{min-height:74px;padding:12px 14px}.account-dialog-avatar{width:42px;height:42px;flex-basis:42px;border-radius:13px}.account-dialog-identity strong{font-size:15px}.account-dialog-body{gap:18px;padding:14px}.account-current-plan{grid-template-columns:minmax(0,1fr);gap:14px;padding:16px}.account-runtime-facts{grid-column:auto}.account-section-heading{align-items:flex-start;flex-direction:column;gap:5px}.account-section-heading>small{text-align:left}.account-plan-grid{grid-template-columns:minmax(0,1fr)}.account-plan-card{min-height:auto}.account-team-members li{grid-template-columns:auto minmax(0,1fr) auto}.account-team-members li>em{grid-column:2}.account-member-status{grid-column:3;grid-row:1}.account-team-members li>button{grid-column:3;grid-row:2}.account-team-invite>span{grid-template-columns:minmax(0,1fr)}.account-team-invite button{justify-content:center}.account-dialog-footer{align-items:stretch;flex-direction:column;padding:11px 14px}.account-dialog-footer>span{line-height:1.4}.account-auth-action{width:100%}}@media(max-height:520px)and (orientation:landscape){.account-dialog-backdrop{padding:6px}.account-dialog{width:min(1000px,calc(100vw - 12px));max-height:calc(100dvh - 12px);border-radius:15px}.account-dialog-header{min-height:60px;padding:8px 14px}.account-dialog-avatar{width:38px;height:38px;flex-basis:38px;border-radius:11px}.account-dialog-body{gap:14px;padding:12px 14px}.account-current-plan{grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;padding:12px}.account-runtime-facts{grid-column:auto}.account-plan-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.account-plan-card{padding:12px}.account-dialog-footer{min-height:54px;padding:8px 14px}}@media(prefers-reduced-motion:reduce){.account-dialog-backdrop,.account-dialog{scroll-behavior:auto}}.plan-limit-dialog{box-sizing:border-box;width:min(520px,calc(100vw - 28px));max-height:calc(100dvh - 28px);overflow:auto;margin:auto;padding:26px;border:1px solid #cbd5e1;border-radius:20px;background:#fff;color:#172033;box-shadow:0 24px 80px #0005;font-size:14px;line-height:1.55}.plan-limit-dialog::backdrop{background:#0f172a99}.plan-limit-heading{display:flex;justify-content:space-between;align-items:center;color:#536179;font-size:11px;font-weight:700;letter-spacing:.08em}.plan-limit-dialog h2{margin:8px 0 14px;font-size:24px;line-height:1.2}.plan-limit-dialog button{cursor:pointer;border:1px solid #cbd5e1;border-radius:9px;background:#fff;color:#172033;padding:10px 14px;font:inherit}.plan-limit-dialog button:focus-visible{outline:3px solid #2563eb;outline-offset:2px}.plan-limit-dialog .plan-limit-close{font-size:22px;line-height:1;padding:6px 10px}.plan-limit-counts{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:22px 0;padding:14px 10px;border-radius:12px;background:#f1f5f9;text-align:center}.plan-limit-counts dt{color:#536179;font-size:12px}.plan-limit-counts dd{margin:4px 0 0;font-size:28px;font-weight:700}.plan-limit-counts div:last-child dd{color:#b45309}.plan-limit-note{color:#536179;font-size:12px}.plan-limit-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:22px}.plan-limit-actions .primary{background:#2563eb;color:#fff;border-color:#2563eb}@media(max-width:400px){.plan-limit-dialog{padding:20px}.plan-limit-actions button{flex:1 1 auto}}.remote-status-button{position:relative;display:inline-grid;place-items:center;width:34px;height:34px;padding:0;border:1px solid #d8e1ed;border-radius:9px;background:#fff;color:#24344d;cursor:pointer;transition:.15s}.remote-status-button:hover,.remote-status-button:focus-visible,.remote-status-button.active{border-color:#6d9df8;background:#edf4ff;color:#285fb7;outline:none}.debug-status-button:hover,.debug-status-button:focus-visible,.debug-status-button.active{border-color:#9b83e6;background:#f4f0ff;color:#6842bd}.computer-stats-button{display:inline-flex;align-items:center;justify-content:center;gap:6px;width:auto;padding:0 10px;font-size:12px;font-weight:600}.remote-status-spinner{width:15px;height:15px;border:2px solid #c4d4ed;border-top-color:#356ec2;border-radius:50%;animation:remote-status-spin .7s linear infinite}@keyframes remote-status-spin{to{transform:rotate(360deg)}}.remote-status-lines{position:absolute;left:10px;right:10px;bottom:10px;z-index:7;display:grid;gap:4px;max-height:calc(100% - 50px);overflow:auto;line-height:1;pointer-events:none}.remote-status-lines.mode-debug{pointer-events:auto;touch-action:pan-y;overscroll-behavior:contain;scrollbar-gutter:stable}.remote-status-line{display:grid;grid-template-columns:17px minmax(0,1fr);align-items:start;gap:6px;padding:6px 7px;border:1px solid rgba(255,255,255,.12);border-radius:7px;background:#05090fdb;box-shadow:0 6px 16px #0003}.remote-status-line>svg{margin-top:1px}.remote-status-line>span{min-width:0;display:flex;align-items:baseline;gap:5px;overflow:hidden}.remote-status-line strong,.remote-status-line small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.remote-status-line strong{flex:0 1 auto;color:#f8fafc;font-size:10px;font-weight:900}.remote-status-line small{flex:1 1 auto;color:#b9c4d4;font-size:9px}.remote-status-line small:before{content:"—";margin-right:5px;color:#738096}.remote-status-line.state-ok>svg{color:#34d399}.remote-status-line.state-warning>svg{color:#f59e0b}.remote-status-lines.mode-debug .remote-status-line{border-color:#a78bfa3d;background:#0f0a1ce6}.remote-status-lines.mode-debug .remote-status-line strong{color:#ede9fe}.remote-status-lines.mode-debug .remote-status-line small{color:#c4b5fd}.remote-status-dialog{position:fixed;top:70px;left:50%;z-index:80;width:min(430px,calc(100vw - 32px));max-height:calc(100vh - 92px);overflow:auto;padding:16px;transform:translate(-50%);border:1px solid #d6e0ee;border-radius:14px;background:#fffffffa;box-shadow:0 24px 64px #0f172a3d;color:#172033}.remote-status-dialog>header{display:grid;grid-template-columns:38px minmax(0,1fr) 32px;align-items:center;gap:10px}.remote-status-dialog-mark{display:grid;place-items:center;width:36px;height:36px;border-radius:10px;background:#e8f1ff;color:#285fb7}.remote-status-dialog h2{margin:2px 0 0;font-size:18px}.remote-status-dialog header small{color:#718096;font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.08em}.remote-status-dialog header button{display:grid;place-items:center;width:30px;height:30px;padding:0;border:0;border-radius:8px;background:transparent;color:#5c6c82;cursor:pointer}.remote-status-dialog header button:hover{background:#eef2f7}.remote-status-dialog>p{margin:13px 0;color:#5b6b80;font-size:12px;line-height:1.55}.remote-status-dialog-list{display:grid;gap:7px}.remote-status-dialog-row{display:grid;grid-template-columns:19px minmax(0,1fr);align-items:start;gap:8px;padding:10px;border:1px solid #e3e9f1;border-radius:10px;background:#f8fafc}.remote-status-dialog-row>svg{margin-top:1px}.remote-status-dialog-row>span{display:grid;gap:4px}.remote-status-dialog-row strong{font-size:12px}.remote-status-dialog-row small{color:#64748b;font-size:10px;line-height:1.4}.remote-status-dialog-row.state-ok>svg{color:#10b981}.remote-status-dialog-row.state-warning{border-color:#f3d49c;background:#fffaf0}.remote-status-dialog-row.state-warning>svg{color:#e58b08}.remote-status-dialog>footer{margin-top:12px;color:#8491a3;font-size:10px;text-align:right}@media(max-width:900px){.remote-status-dialog{top:62px}.remote-status-lines{left:6px;right:6px;bottom:6px}.remote-status-line{padding:5px}.remote-status-line small{display:none}}.capture-toolbar{display:flex;align-items:center;gap:6px}.capture-action{position:relative;display:inline-flex;align-items:center;justify-content:center;gap:5px;min-width:34px;height:34px;padding:0 8px;border:1px solid #d8e1ed;border-radius:9px;background:#fff;color:#24344d;cursor:pointer;transition:.15s}.capture-action:hover:not(:disabled),.capture-action:focus-visible{border-color:#7da7ff;background:#f2f6ff;outline:none}.capture-action:disabled{opacity:.42;cursor:not-allowed}.capture-action.active{border-color:#ef7d83;background:#fff0f1;color:#c6323a}.capture-action.timelapse-active{border-color:#a887e8;background:#f3efff;color:#7043be}.capture-action small{font-size:9px;font-weight:700;line-height:1}.capture-action span{font-size:11px;font-variant-numeric:tabular-nums}.capture-toolbar.compact .capture-action{height:32px;min-width:32px}.capture-toolbar.recording-active{border-radius:10px}.capture-toolbar.recording-active .capture-action:first-child{border-color:#efc7ca}.top-actions-divider{width:1px;height:22px;background:#d8e1ed;margin:0 4px}.capture-gallery{margin-top:16px;padding:18px;border:1px solid #dbe4ef;border-radius:14px;background:#fff}.capture-gallery>header{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:14px}.capture-gallery>header h2{margin:3px 0 0;font-size:20px}.capture-gallery>header .text-button{display:inline-flex;align-items:center;gap:6px}.capture-gallery-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px}.capture-gallery-card{overflow:hidden;border:1px solid #e1e8f0;border-radius:11px;background:#f8fafc}.capture-gallery-card>img,.capture-gallery-card>video{display:block;width:100%;height:130px;object-fit:contain;background:#0b1220}.capture-gallery-card-body{display:grid;gap:6px;padding:10px}.capture-gallery-card-body>strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px}.capture-gallery-card-body>small{color:#64748b;font-size:10px;line-height:1.4}.capture-gallery-card-body>div{display:flex;gap:5px}.capture-gallery-card-body .icon-button{display:inline-flex;align-items:center;justify-content:center}.capture-gallery-card-body .icon-button.danger{color:#bd3c4a}@media(max-width:900px){.capture-toolbar{display:none}.capture-toolbar.compact{display:flex}.capture-toolbar.compact .capture-action:not(:nth-child(2)){display:none}.capture-toolbar.compact:after{content:"Capture";font-size:11px;font-weight:700;color:#53657e;margin-left:2px}}