@hienlh/ppm 0.22.0 → 0.22.1

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 (92) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/CLAUDE.md +1 -1
  3. package/assets/skills/ppm/SKILL.md +1 -1
  4. package/assets/skills/ppm/references/cli-reference.md +4 -4
  5. package/assets/skills/ppm/references/http-api.md +1 -1
  6. package/dist/web/assets/accounts-settings-section-D3BylchP.js +1 -0
  7. package/dist/web/assets/{ai-resource-editor-CdDpOwjh.js → ai-resource-editor-BLPcnhTM.js} +1 -1
  8. package/dist/web/assets/{ai-settings-section-X2UOfSaS.js → ai-settings-section-BtR7rF-T.js} +1 -1
  9. package/dist/web/assets/{ai-settings-section-B1hQyjAd.js → ai-settings-section-r9JctHNM.js} +1 -1
  10. package/dist/web/assets/{appearance-settings-section-DLoPK0LD.js → appearance-settings-section-CiMdk3sb.js} +1 -1
  11. package/dist/web/assets/{branch-review-tab-G84Ojzae.js → branch-review-tab-B1pFjlKM.js} +1 -1
  12. package/dist/web/assets/chat-tab-DZagX06m.js +15 -0
  13. package/dist/web/assets/{code-editor-D04iUPsZ.js → code-editor-BJhOEsnZ.js} +4 -4
  14. package/dist/web/assets/{codex-daily-guard-BSccLRGT.js → codex-daily-guard-CaCQJ4r_.js} +1 -1
  15. package/dist/web/assets/{conflict-editor-C4ay676e.js → conflict-editor-B7u_p49h.js} +3 -3
  16. package/dist/web/assets/{csv-preview-DbwEmG7o.js → csv-preview-CttjJU1e.js} +1 -1
  17. package/dist/web/assets/{database-viewer-S6LsALjX.js → database-viewer-Ca4HxIfx.js} +1 -1
  18. package/dist/web/assets/{diff-viewer-3oBA7vgQ.js → diff-viewer-9-XjLIwa.js} +1 -1
  19. package/dist/web/assets/{editor-language-service-DJmaKVY0.js → editor-language-service-D0DuEOs_.js} +1 -1
  20. package/dist/web/assets/{explorer-body-BQ0jyAGv.js → explorer-body-VdCBqcZu.js} +2 -2
  21. package/dist/web/assets/{explorer-window-content-jdkWt34J.js → explorer-window-content-BIsbl7Th.js} +1 -1
  22. package/dist/web/assets/extension-manager-section-HkY7geS5.js +1 -0
  23. package/dist/web/assets/{extension-webview-BGSDUbdK.js → extension-webview-DZG8YHX9.js} +1 -1
  24. package/dist/web/assets/{files-settings-section-Gnyd7han.js → files-settings-section-qnRtkX05.js} +1 -1
  25. package/dist/web/assets/{general-settings-section-V6Khh15V.js → general-settings-section-BAFSZmCE.js} +1 -1
  26. package/dist/web/assets/{git-log-panel-Bi513qjT.js → git-log-panel-2sGpfEla.js} +1 -1
  27. package/dist/web/assets/{glide-data-grid-DnQwYSmQ.js → glide-data-grid-f0hyITiF.js} +1 -1
  28. package/dist/web/assets/{group-chat-tab-DpczdwyV.js → group-chat-tab-Ck6sk7yY.js} +1 -1
  29. package/dist/web/assets/index-CEZVxM4G.js +52 -0
  30. package/dist/web/assets/{jira-watcher-section-f2HUbGDY.js → jira-watcher-section-CeLmhvu1.js} +1 -1
  31. package/dist/web/assets/keybindings-store-C_3ChOEf.js +1 -0
  32. package/dist/web/assets/{keyboard-shortcuts-section-BpvVEw_Y.js → keyboard-shortcuts-section-PVz6kuh2.js} +1 -1
  33. package/dist/web/assets/markdown-renderer-C140Ijk0.js +3 -0
  34. package/dist/web/assets/{markdown-renderer-Bcaf9_bA.js → markdown-renderer-Dz7-DYUg.js} +1 -1
  35. package/dist/web/assets/{mobile-explorer-sheet-Bol3XAO1.js → mobile-explorer-sheet-CUG_owdf.js} +1 -1
  36. package/dist/web/assets/notification-store-6vib1ISy.js +1 -0
  37. package/dist/web/assets/{ppmbot-settings-section-DKJUA3Kq.js → ppmbot-settings-section-Cji-Mil-.js} +1 -1
  38. package/dist/web/assets/{problems-panel-CFcoUx8h.js → problems-panel-a6_hrWvl.js} +1 -1
  39. package/dist/web/assets/{process-table-EKr2dqG6.js → process-table-CiIqlOIK.js} +1 -1
  40. package/dist/web/assets/{proxy-settings-section-B7qRVl8w.js → proxy-settings-section-BjI4IFgp.js} +1 -1
  41. package/dist/web/assets/{remote-desktop-clipboard-notice-0WDYsyCA.js → remote-desktop-clipboard-notice-eXYvwgx7.js} +1 -1
  42. package/dist/web/assets/{remote-desktop-mobile-sheet-COYDg16H.js → remote-desktop-mobile-sheet-Doh-fci-.js} +2 -2
  43. package/dist/web/assets/{remote-desktop-mobile-view-2DqSuS2U.js → remote-desktop-mobile-view-Dt8Akc3p.js} +1 -1
  44. package/dist/web/assets/{remote-desktop-readiness-gate-Dm_qMJMH.js → remote-desktop-readiness-gate-t83fqbID.js} +1 -1
  45. package/dist/web/assets/{remote-desktop-window-content-UodhsF7W.js → remote-desktop-window-content-CguhZMmx.js} +1 -1
  46. package/dist/web/assets/{schedules-settings-section-bG2lYfGv.js → schedules-settings-section-BVkpW5ms.js} +1 -1
  47. package/dist/web/assets/{settings-body-C06bFarv.js → settings-body-CoIxYAh6.js} +2 -2
  48. package/dist/web/assets/{settings-tab-34RSaASd.js → settings-tab-7DKVUTbM.js} +1 -1
  49. package/dist/web/assets/{settings-window-content-Dr_2lmHH.js → settings-window-content-3_39TeX-.js} +1 -1
  50. package/dist/web/assets/{sql-query-editor-BgRH0cHD.js → sql-query-editor-CQB7Yp7U.js} +1 -1
  51. package/dist/web/assets/{sqlite-viewer-DUxGslpa.js → sqlite-viewer-Bd7rjr1D.js} +1 -1
  52. package/dist/web/assets/{system-monitor-body-IZuLn7Qh.js → system-monitor-body-DsRXeMyU.js} +2 -2
  53. package/dist/web/assets/{system-monitor-tab-DiSA490Z.js → system-monitor-tab-DdSZgux3.js} +1 -1
  54. package/dist/web/assets/{system-monitor-window-content-CEaFISgj.js → system-monitor-window-content-ClPo4-El.js} +1 -1
  55. package/dist/web/assets/{tab-host-window-content-D0TN8Wrq.js → tab-host-window-content-d2TAD4PU.js} +1 -1
  56. package/dist/web/assets/{team-member-sheet-DDPNcCjd.js → team-member-sheet-7d2Qp-ie.js} +2 -2
  57. package/dist/web/assets/{team-member-window-content-DCiW_1-E.js → team-member-window-content-Bctg2gmg.js} +1 -1
  58. package/dist/web/assets/{terminal-tab-4ypP0NDY.js → terminal-tab-0HQic25V.js} +3 -3
  59. package/dist/web/assets/{tool-cards-Dd6E7Q3k.js → tool-cards-CmLLRACd.js} +2 -2
  60. package/dist/web/assets/{use-inline-blame-vrfFHuaR.js → use-inline-blame-sDMjcz1-.js} +3 -3
  61. package/dist/web/assets/{use-lsp-CsuZu49X.js → use-lsp-CBgID-EU.js} +1 -1
  62. package/dist/web/assets/{use-monaco-theme-BIVYJBIn.js → use-monaco-theme-gvhJ_jZh.js} +1 -1
  63. package/dist/web/assets/{use-websocket-BMbufhX7.js → use-websocket-C9wlRliB.js} +1 -1
  64. package/dist/web/assets/{video-preview-Byj8P_jA.js → video-preview-CSDK5j6H.js} +1 -1
  65. package/dist/web/index.html +1 -1
  66. package/dist/web/sw.js +1 -1
  67. package/docs/architecture/ai-chat-and-providers.md +9 -0
  68. package/package.json +1 -1
  69. package/packages/ext-git-graph/src/webview-html.test.ts +30 -5
  70. package/packages/ext-git-graph/src/webview-html.ts +99 -31
  71. package/src/services/edge-forwarder.ts +191 -191
  72. package/src/services/windows-process-tree.ts +351 -351
  73. package/src/shared/codex-daily-guard.ts +12 -5
  74. package/src/web/components/extensions/extension-tree-view.tsx +4 -11
  75. package/src/web/components/layout/command-palette.tsx +2 -18
  76. package/src/web/components/settings/accounts/account-card.tsx +2 -2
  77. package/src/web/components/settings/accounts/codex-accounts-section.tsx +4 -4
  78. package/src/web/components/settings/extension-manager-section.tsx +8 -1
  79. package/src/web/lib/extension-icons.ts +70 -0
  80. package/src/web/lib/tab-type-icons.ts +14 -0
  81. package/dist/web/assets/accounts-settings-section-BVr9-FZJ.js +0 -1
  82. package/dist/web/assets/chat-tab-DQJfjm8E.js +0 -15
  83. package/dist/web/assets/extension-manager-section-DG1guILi.js +0 -1
  84. package/dist/web/assets/index-DU68xk06.js +0 -52
  85. package/dist/web/assets/keybindings-store-DCRsnKg5.js +0 -1
  86. package/dist/web/assets/markdown-renderer-DGJp8HC3.js +0 -3
  87. package/dist/web/assets/notification-store-BXt54VIn.js +0 -1
  88. package/packages/vscode-compat/node_modules/.bin/tsc.bunx +0 -0
  89. package/packages/vscode-compat/node_modules/.bin/tsc.exe +0 -0
  90. package/packages/vscode-compat/node_modules/.bin/tsserver.bunx +0 -0
  91. package/packages/vscode-compat/node_modules/.bin/tsserver.exe +0 -0
  92. package/src/web/hooks/use-delayed-flag.ts +0 -35
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t,S as n}from"./vendor-markdown-CuWCHIVb.js";import"./vendor-ui-DmZ-Mb-H.js";import{Br as r,O as i,a,d as o,ir as s,j as c}from"./icons-DQjqk0lJ.js";import{r as l,s as u}from"./api-client-C1ZwRL4Y.js";import{n as d}from"./utils-Bmf_8h7Y.js";import"./portal-container-context-BarKmT4S.js";import{n as f}from"./use-is-mobile-TkcwP1Gx.js";import{t as p}from"./button-B9CTrsEf.js";import{a as m,n as h,o as g,t as _}from"./dialog-B84_DJQ8.js";import{t as v}from"./mobile-bottom-sheet-C3TniEP-.js";import"./use-visual-viewport-Lp878uzs.js";import{Lt as y,Y as b}from"./index-DU68xk06.js";import{n as x,t as S}from"./format-bytes-D1AQyUCt.js";var C=e(t(),1);function w(e,t){return{cpu:e.cpu,ramMB:e.ramMB,name:t,diskReadBps:e.diskReadBps,diskWriteBps:e.diskWriteBps,gpuPct:e.gpuPct,gpuMemMB:e.gpuMemMB,netInBps:e.netInBps,netOutBps:e.netOutBps}}function T(e,t){if(!(e===void 0&&t===void 0))return(e??0)+(t??0)}function E(e,t){return e===`disk`?T(t.diskReadBps,t.diskWriteBps):e===`net`?T(t.netInBps,t.netOutBps):e===`gpu`?t.gpuPct:t.gpuMemMB}function D(e){return e===`disk`||e===`gpu`||e===`gpuMem`||e===`net`}function O(e,t,n,r){return t?[...e].sort((e,i)=>{let a=r(e),o=r(i);if(t===`name`){let e=a.name.localeCompare(o.name);return n===`asc`?e:-e}if(t===`cpu`)return n===`asc`?a.cpu-o.cpu:o.cpu-a.cpu;if(t===`ram`)return n===`asc`?a.ramMB-o.ramMB:o.ramMB-a.ramMB;if(D(t)){let e=E(t,a),r=E(t,o);return e===void 0&&r===void 0?0:e===void 0?1:r===void 0?-1:n===`asc`?e-r:r-e}return 0}):e}var k={cpu:0,ramMB:0,count:0};function A(e,t){return t===void 0?e:(e??0)+t}function j(e,t,n){return{cpu:e.cpu+t.cpu,ramMB:e.ramMB+t.ramMB,count:e.count+n,diskReadBps:A(e.diskReadBps,t.diskReadBps),diskWriteBps:A(e.diskWriteBps,t.diskWriteBps),gpuMemMB:A(e.gpuMemMB,t.gpuMemMB),netInBps:A(e.netInBps,t.netInBps),netOutBps:A(e.netOutBps,t.netOutBps)}}function M(e,t){return e.toLowerCase().includes(t)}function N(e,t){return M(e.name,t)||M(e.command,t)}function ee(e){let{processes:t,groups:n,mode:r,ppmOnly:i,query:a,sortKey:o,sortDir:s,expanded:c}=e,l=a.trim().toLowerCase(),u=new Map(t.map(e=>[e.pid,e]));if(r===`flat`){let e=i?t.filter(e=>e.ppm):t;l&&(e=e.filter(e=>N(e,l))),e=O(e,o,s,e=>w(e,e.name));let n=e.reduce((e,t)=>j(e,t,1),k);return{rows:e.map(e=>({kind:`process`,proc:e,indent:!1})),totals:n,autoExpanded:new Set}}let d=i?n.filter(e=>e.ppm):n,f=new Set;l&&(d=d.filter(e=>{let t=M(e.label,l),n=e.pids.some(e=>{let t=u.get(e);return t?N(t,l):!1}),r=t||n;return r&&n&&f.add(e.key),r})),d=O(d,o,s,e=>w(e,e.label));let p=[];for(let e of d){let t=l&&f.has(e.key)||c.has(e.key);if(p.push({kind:`group`,group:e,expanded:t}),!t)continue;let n=e.pids.map(e=>u.get(e)).filter(e=>e!==void 0);l&&(n=n.filter(e=>N(e,l))),n=O(n,o,s,e=>w(e,e.name));for(let e of n)p.push({kind:`process`,proc:e,indent:!0})}return{rows:p,totals:d.reduce((e,t)=>j(e,t,t.count),k),autoExpanded:f}}function te(e,t,n){return e===n?t===`desc`?[n,`asc`]:[null,`desc`]:[n,`desc`]}var P=[`disk`,`gpu`,`net`],F={cpu:64,ram:80,disk:120,gpu:90,net:120},ne=`minmax(0,1fr)`,I=`44px`;function re(e){return e===`disk`||e===`gpu`||e===`net`}function L(e){return Math.round(Math.min(400,Math.max(48,e)))}function R(e,t){let n=t[e];return typeof n==`number`&&Number.isFinite(n)?L(n):F[e]}function z(e,t,n={}){let r=P.filter(t=>e[t]),i=re(t)&&e[t]?t:null,a=e=>`${R(e,n)}px`,o=[ne,a(`cpu`),a(`ram`)];return{wideTemplate:[...o,...r.map(a),I].join(` `),narrowTemplate:[...o,...i?[a(i)]:[],I].join(` `),columns:e,narrowExtra:i}}var B=`grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]`;function ie(e){return{"--sysmon-grid-n":e.narrowTemplate,"--sysmon-grid-w":e.wideTemplate}}function V(e,t){return e.narrowExtra===t?`block`:`hidden @lg:block`}function H(e){return e>80?`text-error`:e>50?`text-warning`:`text-success`}function ae(e){if(!e)return``;let t=Math.round((Date.now()-e)/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60);if(n<60)return`${n}m`;let r=Math.floor(n/60);return r<24?`${r}h ${n%60}m`:`${Math.floor(r/24)}d ${r%24}h`}function U(e,t){return e===void 0&&t===void 0?`—`:`↓ ${S(e??0)} ↑ ${S(t??0)}`}function W(e,t){return e===void 0&&t===void 0?`—`:`↓ ${S(e??0)} ↑ ${S(t??0)}`}function G(e,t){return e===void 0&&t===void 0?`—`:`${e===void 0?`—`:`${e.toFixed(0)}%`} · ${t===void 0?`—`:x(t)}`}function K(e,t){if(!(e===void 0&&t===void 0))return(e??0)+(t??0)}var q=n();function J({label:e,field:t,activeKey:n,activeDir:r,onClick:i,align:s=`right`,testId:c,className:l,resizeKey:u,resize:f}){let p=n===t,m=p?r===`asc`?o:a:null,h=p?r===`asc`?`ascending`:`descending`:`none`;return(0,q.jsxs)(`div`,{role:`columnheader`,"aria-sort":h,className:d(`relative py-1.5 px-2 font-medium select-none`,s===`left`?`text-left`:`text-right`,l),children:[(0,q.jsxs)(`button`,{type:`button`,"data-testid":c,onClick:()=>i(t),className:d(`flex items-center gap-0.5 w-full min-h-11 md:min-h-0 cursor-pointer hover:text-text-primary transition-colors`,s===`left`?`justify-start`:`justify-end`,p&&`text-text-primary`),children:[(0,q.jsx)(`span`,{className:`truncate`,children:e}),m&&(0,q.jsx)(m,{className:`size-3 shrink-0`})]}),u&&f&&(0,q.jsx)(`div`,{role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize ${e} column`,"data-testid":c?`${c}-resize`:void 0,onPointerDown:e=>f.onResizeStart(u,e),onDoubleClick:()=>f.onResizeReset(u),className:`hidden md:block absolute top-0 -right-1 h-full w-2 cursor-col-resize hover:bg-primary/40 active:bg-primary/60`})]})}var oe=150;function se({mode:e,onModeChange:t,ppmOnly:n,onPpmOnlyChange:r,onQueryChange:i}){let[a,o]=(0,C.useState)(``),c=(0,C.useRef)(null);return(0,C.useEffect)(()=>(c.current&&clearTimeout(c.current),c.current=setTimeout(()=>i(a),oe),()=>{c.current&&clearTimeout(c.current)}),[a]),(0,q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 p-2 border-b border-border shrink-0`,children:[(0,q.jsxs)(`div`,{className:`relative flex-1 min-w-[140px]`,children:[(0,q.jsx)(s,{className:`absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-text-subtle`}),(0,q.jsx)(`input`,{type:`text`,value:a,onChange:e=>o(e.target.value),placeholder:`Search processes`,"aria-label":`Search processes`,"data-testid":`sysmon-process-search`,className:`w-full min-h-11 md:min-h-8 pl-7 pr-2 text-sm rounded-md border border-border bg-transparent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`})]}),(0,q.jsx)(`button`,{type:`button`,onClick:()=>t(e===`grouped`?`flat`:`grouped`),"aria-pressed":e===`flat`,"data-testid":`sysmon-toggle-flat`,className:`min-h-11 md:min-h-8 px-3 text-xs rounded-md border border-border hover:bg-surface-hover transition-colors`,children:e===`flat`?`Flat`:`Grouped`}),(0,q.jsx)(`button`,{type:`button`,onClick:()=>r(!n),"aria-pressed":n,"data-testid":`sysmon-filter-ppm`,className:d(`min-h-11 md:min-h-8 px-3 text-xs rounded-md border transition-colors`,n?`border-primary bg-primary/10 text-primary`:`border-border hover:bg-surface-hover`),children:`PPM only`})]})}function ce({sortKey:e,sortDir:t,grid:n,onSort:r,resize:i}){let a={activeKey:e,activeDir:t,onClick:r,resize:i};return(0,q.jsxs)(`div`,{role:`row`,className:d(`grid gap-1 px-3 py-1.5 text-[11px] text-text-subtle border-b border-border sticky top-0 bg-background z-10`,B),children:[(0,q.jsx)(J,{label:`Process`,field:`name`,...a,resize:void 0,align:`left`,testId:`sysmon-sort-name`}),(0,q.jsx)(J,{label:`CPU`,field:`cpu`,...a,resizeKey:`cpu`,testId:`sysmon-sort-cpu`}),(0,q.jsx)(J,{label:`RAM`,field:`ram`,...a,resizeKey:`ram`,testId:`sysmon-sort-ram`}),n.columns.disk&&(0,q.jsx)(J,{label:`Disk`,field:`disk`,...a,resizeKey:`disk`,testId:`sysmon-col-disk`,className:V(n,`disk`)}),n.columns.gpu&&(0,q.jsx)(J,{label:`GPU`,field:`gpu`,...a,resizeKey:`gpu`,testId:`sysmon-col-gpu`,className:V(n,`gpu`)}),n.columns.net&&(0,q.jsx)(J,{label:`Net`,field:`net`,...a,resizeKey:`net`,testId:`sysmon-col-net`,className:V(n,`net`)}),(0,q.jsx)(`span`,{})]})}function le({totals:e,grid:t,gpuUtilPercent:n}){return(0,q.jsxs)(`div`,{className:d(`grid gap-1 px-3 py-1.5 text-xs font-medium border-t border-border shrink-0`,B),"data-testid":`sysmon-total`,"data-process-count":e.count,children:[(0,q.jsxs)(`span`,{className:`truncate`,children:[`Total (`,e.count,` processes)`]}),(0,q.jsxs)(`span`,{className:d(`text-right`,H(e.cpu)),children:[e.cpu.toFixed(1),`%`]}),(0,q.jsx)(`span`,{className:`text-right text-text-secondary`,children:x(e.ramMB)}),t.columns.disk&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(t,`disk`)),children:U(e.diskReadBps,e.diskWriteBps)}),t.columns.gpu&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(t,`gpu`)),children:G(n,e.gpuMemMB)}),t.columns.net&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(t,`net`)),children:W(e.netInBps,e.netOutBps)}),(0,q.jsx)(`span`,{})]})}var ue=`Protected: this app contains a PPM or OS-critical process — cannot be ended as a whole.`;function de({group:e,expanded:t,grid:n,killProtected:a,onToggle:o,onKillClick:s}){let l=t?i:c;return(0,q.jsxs)(`div`,{className:`grid items-center gap-1 min-h-11 md:min-h-7 px-3 text-xs cursor-pointer hover:bg-surface-hover transition-colors group/proc grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]`,onClick:()=>o(e.key),"data-testid":`sysmon-group-row`,"data-group-key":e.key,"data-count":e.count,"data-disk-bps":K(e.diskReadBps,e.diskWriteBps),"data-gpu-pct":e.gpuPct,"data-net-bps":K(e.netInBps,e.netOutBps),children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-1.5 min-w-0`,children:[(0,q.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),o(e.key)},"aria-expanded":t,"aria-label":`${t?`Collapse`:`Expand`} ${e.label}`,"data-testid":`sysmon-group-expand`,className:`flex items-center justify-center size-11 md:size-7 -ml-2 shrink-0`,children:(0,q.jsx)(l,{className:`size-3.5 text-text-subtle`})}),(0,q.jsx)(`span`,{className:`truncate font-medium`,children:e.label}),(0,q.jsxs)(`span`,{className:`text-text-subtle shrink-0`,children:[`(`,e.count,`)`]})]}),(0,q.jsxs)(`span`,{className:d(`text-right`,H(e.cpu)),children:[e.cpu.toFixed(1),`%`]}),(0,q.jsx)(`span`,{className:`text-right text-text-secondary`,children:x(e.ramMB)}),n.columns.disk&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(n,`disk`)),children:U(e.diskReadBps,e.diskWriteBps)}),n.columns.gpu&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(n,`gpu`)),children:G(e.gpuPct,e.gpuMemMB)}),n.columns.net&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(n,`net`)),children:W(e.netInBps,e.netOutBps)}),(0,q.jsx)(`div`,{className:`flex justify-end`,children:(0,q.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),s(e)},disabled:a,"aria-label":`End ${e.label} and its ${e.count} processes`,title:a?ue:`End ${e.label} (${e.count} processes)`,"data-testid":`sysmon-group-kill-btn`,className:d(`flex items-center justify-center size-11 md:size-7 rounded transition-all`,`can-hover:opacity-0 can-hover:group-hover/proc:opacity-100`,a?`opacity-40 cursor-not-allowed`:`hover:bg-error/20 hover:text-error active:bg-error/30`),children:(0,q.jsx)(r,{className:`size-3.5`})})})]})}var fe=`Protected: PPM or OS-critical process — cannot be ended.`;function pe({proc:e,indent:t,grid:n,onKillClick:i}){return(0,q.jsxs)(`div`,{className:`grid items-center gap-1 min-h-11 md:min-h-7 px-3 text-xs group/proc hover:bg-surface-hover transition-colors grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]`,"data-testid":`sysmon-process-row`,"data-pid":e.pid,"data-ppm":e.ppm,"data-protected":e.protected,"data-disk-bps":K(e.diskReadBps,e.diskWriteBps),"data-gpu-pct":e.gpuPct,"data-net-bps":K(e.netInBps,e.netOutBps),children:[(0,q.jsxs)(`div`,{className:d(`flex items-start gap-1.5 min-w-0`,t&&`pl-6`),children:[(0,q.jsx)(`span`,{className:`text-text-subtle shrink-0`,children:e.pid}),(0,q.jsx)(`span`,{className:`truncate text-text-secondary`,title:e.startedAt?`${e.command}\nRunning ${ae(e.startedAt)}`:e.command,children:e.command})]}),(0,q.jsxs)(`span`,{className:d(`text-right`,H(e.cpu)),children:[e.cpu.toFixed(1),`%`]}),(0,q.jsx)(`span`,{className:`text-right text-text-secondary`,children:x(e.ramMB)}),n.columns.disk&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(n,`disk`)),children:U(e.diskReadBps,e.diskWriteBps)}),n.columns.gpu&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(n,`gpu`)),children:G(e.gpuPct,e.gpuMemMB)}),n.columns.net&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(n,`net`)),children:W(e.netInBps,e.netOutBps)}),(0,q.jsx)(`div`,{className:`flex justify-end`,children:(0,q.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),i(e)},disabled:e.protected,"aria-label":`End process ${e.name} (${e.pid})`,title:e.protected?fe:`End process ${e.name}`,"data-testid":`sysmon-kill-btn`,className:d(`flex items-center justify-center size-11 md:size-7 rounded transition-all`,`can-hover:opacity-0 can-hover:group-hover/proc:opacity-100`,e.protected?`opacity-40 cursor-not-allowed`:`hover:bg-error/20 hover:text-error active:bg-error/30`),children:(0,q.jsx)(r,{className:`size-3.5`})})})]})}function me({target:e,onConfirm:t,onCancel:n}){let r=f(),[i,a]=(0,C.useState)(!1);if((0,C.useEffect)(()=>{e||a(!1)},[e]),!e)return null;let o=e.kind===`group`,s=o?`End app`:`End process`,c=o?e.group.cpu:e.proc.cpu,l=o?e.group.ramMB:e.proc.ramMB,u=(0,q.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-kill-confirm`,"data-kill-kind":e.kind,children:[o?(0,q.jsxs)(`p`,{className:`text-sm`,children:[`End `,(0,q.jsx)(`span`,{className:`font-medium`,children:e.group.label}),` and all its`,` `,(0,q.jsx)(`span`,{className:`font-medium`,children:e.members.length}),` processes?`]}):(0,q.jsxs)(`p`,{className:`text-sm`,children:[`End `,(0,q.jsx)(`span`,{className:`font-medium`,children:e.proc.name}),` (pid `,e.proc.pid,`)?`]}),(0,q.jsxs)(`p`,{className:`text-xs text-text-subtle`,children:[`CPU `,c.toFixed(1),`% · RAM `,x(l)]}),!o&&(0,q.jsxs)(`label`,{className:`flex items-center justify-between gap-3 min-h-11 py-1`,children:[(0,q.jsx)(`span`,{className:`text-sm`,children:`Also end child processes`}),(0,q.jsx)(b,{checked:i,onCheckedChange:a,"data-testid":`sysmon-kill-tree`,"aria-label":`Also end child processes`})]}),(0,q.jsxs)(`div`,{className:`flex flex-col-reverse md:flex-row gap-2 md:justify-end pt-2`,children:[(0,q.jsx)(p,{variant:`outline`,onClick:n,"data-testid":`sysmon-kill-confirm-cancel`,className:`min-h-11`,children:`Cancel`}),(0,q.jsx)(p,{variant:`destructive`,autoFocus:!1,onClick:()=>t(e,i),"data-testid":`sysmon-kill-confirm-ok`,className:`min-h-11`,children:o?`End ${e.members.length} processes`:`End process`})]})]});return r?(0,q.jsx)(v,{open:!0,onClose:n,children:(0,q.jsxs)(`div`,{className:`px-4 pb-4`,children:[(0,q.jsx)(`h2`,{className:`text-base font-semibold mb-3`,children:s}),u]})}):(0,q.jsx)(_,{open:!0,onOpenChange:e=>!e&&n(),children:(0,q.jsxs)(h,{children:[(0,q.jsx)(m,{children:(0,q.jsx)(g,{children:s})}),u]})})}function Y(e,t){return{pid:e.pid,startedAt:e.startedAt,tree:t}}function he(e,t){let n=e.rootPid===null?void 0:t.find(t=>t.pid===e.rootPid);return n?[Y(n,!0)]:t.map(e=>Y(e,!1))}function ge(e){return e.some(e=>e.protected)}async function X(e){let t=l(),n={"Content-Type":`application/json`,"X-PPM-Request":`1`};t&&(n.Authorization=`Bearer ${t}`);let r=await fetch(`/api/system/resources/kill`,{method:`POST`,headers:n,body:JSON.stringify(e)}),i;try{i=await r.json()}catch{throw Error(r.ok?`Empty response from server`:`Server error (HTTP ${r.status})`)}if(i.ok===!1)throw Error(i.error??`HTTP ${r.status}`);return i.data}function _e(e){let[t,n]=(0,C.useState)(null),r=(0,C.useCallback)(t=>{let n=new Map(e.processes.map(e=>[e.pid,e]));return t.pids.map(e=>n.get(e)).filter(e=>!!e)},[e.processes]),i=(0,C.useMemo)(()=>new Map(e.groups.map(e=>[e.key,ge(r(e))])),[e.groups,r]),a=(0,C.useCallback)(e=>n({kind:`process`,proc:e}),[]),o=(0,C.useCallback)(e=>n({kind:`group`,group:e,members:r(e)}),[r]),s=(0,C.useCallback)(()=>n(null),[]);return{pendingKill:t,groupProtected:i,requestKillProcess:a,requestKillGroup:o,confirmKill:(0,C.useCallback)(async(e,t)=>{if(n(null),e.kind===`process`){let{proc:n}=e;try{await X(Y(n,t)),u.success(`Ended ${n.name} (${n.pid})`)}catch(e){u.error(e instanceof Error?e.message:`Failed to end ${n.name}`)}return}let{group:r,members:i}=e,a=[];for(let e of he(r,i))try{await X(e)}catch(t){a.push(t instanceof Error?t.message:`pid ${e.pid}`)}a.length===0?u.success(`Ended ${r.label} (${i.length} processes)`):u.error(`${r.label}: ${a.length} of ${i.length} could not be ended — ${a[0]}`)},[]),cancelKill:s}}var Z=`ppm-sysmon-col-widths`;function Q(){try{let e=localStorage.getItem(Z);if(!e)return{};let t=JSON.parse(e),n={};for(let e of[`cpu`,`ram`,`disk`,`gpu`,`net`]){let r=t[e];typeof r==`number`&&Number.isFinite(r)&&(n[e]=L(r))}return n}catch{return{}}}function $(e){try{Object.keys(e).length===0?localStorage.removeItem(Z):localStorage.setItem(Z,JSON.stringify(e))}catch{}}function ve(){let[e,t]=(0,C.useState)(()=>typeof localStorage>`u`?{}:Q()),n=(0,C.useRef)(null);return(0,C.useEffect)(()=>{let e=e=>{let r=n.current;if(!r)return;let i=L(r.startWidth+(e.clientX-r.startX));t(e=>e[r.key]===i?e:{...e,[r.key]:i})},r=()=>{n.current&&(n.current=null,document.body.style.cursor=``,t(e=>($(e),e)))};return window.addEventListener(`pointermove`,e),window.addEventListener(`pointerup`,r),window.addEventListener(`pointercancel`,r),()=>{window.removeEventListener(`pointermove`,e),window.removeEventListener(`pointerup`,r),window.removeEventListener(`pointercancel`,r)}},[]),{widths:e,begin:(0,C.useCallback)((t,r)=>{r.preventDefault(),n.current={key:t,startX:r.clientX,startWidth:R(t,e)},document.body.style.cursor=`col-resize`},[e]),reset:(0,C.useCallback)(e=>{t(t=>{if(!(e in t))return t;let{[e]:n,...r}=t;return $(r),r})},[])}}var ye={disk:!1,gpu:!1,net:!1};function be({snapshot:e}){let t=f(),n=(0,C.useRef)(null),[r,i]=(0,C.useState)(`grouped`),[a,o]=(0,C.useState)(!1),[s,c]=(0,C.useState)(``),[l,u]=(0,C.useState)(null),[d,p]=(0,C.useState)(`desc`),[m,h]=(0,C.useState)(()=>new Set),{pendingKill:g,groupProtected:_,requestKillProcess:v,requestKillGroup:b,confirmKill:x,cancelKill:S}=_e(e),{widths:w,begin:T,reset:E}=ve(),{rows:D,totals:O}=(0,C.useMemo)(()=>ee({processes:e.processes,groups:e.groups,mode:r,ppmOnly:a,query:s,sortKey:l,sortDir:d,expanded:m}),[e.processes,e.groups,r,a,s,l,d,m]),k=e.processColumns??ye,A=(0,C.useMemo)(()=>z(k,l,w),[k,l,w]),j=e.system.gpus[0]?.utilPercent,M=y({count:D.length,getScrollElement:()=>n.current,estimateSize:()=>t?44:28,overscan:12}),N=(0,C.useCallback)(e=>{let[t,n]=te(l,d,e);u(t),p(n)},[l,d]),P=(0,C.useCallback)(e=>{h(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]);return(0,q.jsxs)(`div`,{className:`h-full flex flex-col min-h-0 @container`,style:ie(A),"data-testid":`sysmon-processes`,"data-row-count":D.length,children:[(0,q.jsx)(se,{mode:r,onModeChange:i,ppmOnly:a,onPpmOnlyChange:o,onQueryChange:c}),(0,q.jsx)(ce,{sortKey:l,sortDir:d,grid:A,onSort:N,resize:{onResizeStart:T,onResizeReset:E}}),(0,q.jsx)(`div`,{ref:n,className:`flex-1 min-h-0 overflow-y-auto`,children:(0,q.jsx)(`div`,{style:{height:M.getTotalSize(),position:`relative`},children:M.getVirtualItems().map(e=>{let t=D[e.index];return t?(0,q.jsx)(`div`,{style:{position:`absolute`,top:0,left:0,right:0,transform:`translateY(${e.start}px)`},children:t.kind===`group`?(0,q.jsx)(de,{group:t.group,expanded:t.expanded,grid:A,killProtected:_.get(t.group.key)??!0,onToggle:P,onKillClick:b}):(0,q.jsx)(pe,{proc:t.proc,indent:t.indent,grid:A,onKillClick:v})},t.kind===`group`?t.group.key:`p:${t.proc.pid}`):null})})}),(0,q.jsx)(le,{totals:O,grid:A,gpuUtilPercent:j}),(0,q.jsx)(me,{target:g,onConfirm:x,onCancel:S})]})}export{be as ProcessTable};
1
+ import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t,S as n}from"./vendor-markdown-CuWCHIVb.js";import"./vendor-ui-DmZ-Mb-H.js";import{Br as r,O as i,a,d as o,ir as s,j as c}from"./icons-DQjqk0lJ.js";import{r as l,s as u}from"./api-client-C1ZwRL4Y.js";import{n as d}from"./utils-Bmf_8h7Y.js";import"./portal-container-context-BarKmT4S.js";import{n as f}from"./use-is-mobile-TkcwP1Gx.js";import{t as p}from"./button-B9CTrsEf.js";import{a as m,n as h,o as g,t as _}from"./dialog-B84_DJQ8.js";import{t as v}from"./mobile-bottom-sheet-C3TniEP-.js";import"./use-visual-viewport-Lp878uzs.js";import{Lt as y,Y as b}from"./index-CEZVxM4G.js";import{n as x,t as S}from"./format-bytes-D1AQyUCt.js";var C=e(t(),1);function w(e,t){return{cpu:e.cpu,ramMB:e.ramMB,name:t,diskReadBps:e.diskReadBps,diskWriteBps:e.diskWriteBps,gpuPct:e.gpuPct,gpuMemMB:e.gpuMemMB,netInBps:e.netInBps,netOutBps:e.netOutBps}}function T(e,t){if(!(e===void 0&&t===void 0))return(e??0)+(t??0)}function E(e,t){return e===`disk`?T(t.diskReadBps,t.diskWriteBps):e===`net`?T(t.netInBps,t.netOutBps):e===`gpu`?t.gpuPct:t.gpuMemMB}function D(e){return e===`disk`||e===`gpu`||e===`gpuMem`||e===`net`}function O(e,t,n,r){return t?[...e].sort((e,i)=>{let a=r(e),o=r(i);if(t===`name`){let e=a.name.localeCompare(o.name);return n===`asc`?e:-e}if(t===`cpu`)return n===`asc`?a.cpu-o.cpu:o.cpu-a.cpu;if(t===`ram`)return n===`asc`?a.ramMB-o.ramMB:o.ramMB-a.ramMB;if(D(t)){let e=E(t,a),r=E(t,o);return e===void 0&&r===void 0?0:e===void 0?1:r===void 0?-1:n===`asc`?e-r:r-e}return 0}):e}var k={cpu:0,ramMB:0,count:0};function A(e,t){return t===void 0?e:(e??0)+t}function j(e,t,n){return{cpu:e.cpu+t.cpu,ramMB:e.ramMB+t.ramMB,count:e.count+n,diskReadBps:A(e.diskReadBps,t.diskReadBps),diskWriteBps:A(e.diskWriteBps,t.diskWriteBps),gpuMemMB:A(e.gpuMemMB,t.gpuMemMB),netInBps:A(e.netInBps,t.netInBps),netOutBps:A(e.netOutBps,t.netOutBps)}}function M(e,t){return e.toLowerCase().includes(t)}function N(e,t){return M(e.name,t)||M(e.command,t)}function ee(e){let{processes:t,groups:n,mode:r,ppmOnly:i,query:a,sortKey:o,sortDir:s,expanded:c}=e,l=a.trim().toLowerCase(),u=new Map(t.map(e=>[e.pid,e]));if(r===`flat`){let e=i?t.filter(e=>e.ppm):t;l&&(e=e.filter(e=>N(e,l))),e=O(e,o,s,e=>w(e,e.name));let n=e.reduce((e,t)=>j(e,t,1),k);return{rows:e.map(e=>({kind:`process`,proc:e,indent:!1})),totals:n,autoExpanded:new Set}}let d=i?n.filter(e=>e.ppm):n,f=new Set;l&&(d=d.filter(e=>{let t=M(e.label,l),n=e.pids.some(e=>{let t=u.get(e);return t?N(t,l):!1}),r=t||n;return r&&n&&f.add(e.key),r})),d=O(d,o,s,e=>w(e,e.label));let p=[];for(let e of d){let t=l&&f.has(e.key)||c.has(e.key);if(p.push({kind:`group`,group:e,expanded:t}),!t)continue;let n=e.pids.map(e=>u.get(e)).filter(e=>e!==void 0);l&&(n=n.filter(e=>N(e,l))),n=O(n,o,s,e=>w(e,e.name));for(let e of n)p.push({kind:`process`,proc:e,indent:!0})}return{rows:p,totals:d.reduce((e,t)=>j(e,t,t.count),k),autoExpanded:f}}function te(e,t,n){return e===n?t===`desc`?[n,`asc`]:[null,`desc`]:[n,`desc`]}var P=[`disk`,`gpu`,`net`],F={cpu:64,ram:80,disk:120,gpu:90,net:120},ne=`minmax(0,1fr)`,I=`44px`;function re(e){return e===`disk`||e===`gpu`||e===`net`}function L(e){return Math.round(Math.min(400,Math.max(48,e)))}function R(e,t){let n=t[e];return typeof n==`number`&&Number.isFinite(n)?L(n):F[e]}function z(e,t,n={}){let r=P.filter(t=>e[t]),i=re(t)&&e[t]?t:null,a=e=>`${R(e,n)}px`,o=[ne,a(`cpu`),a(`ram`)];return{wideTemplate:[...o,...r.map(a),I].join(` `),narrowTemplate:[...o,...i?[a(i)]:[],I].join(` `),columns:e,narrowExtra:i}}var B=`grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]`;function ie(e){return{"--sysmon-grid-n":e.narrowTemplate,"--sysmon-grid-w":e.wideTemplate}}function V(e,t){return e.narrowExtra===t?`block`:`hidden @lg:block`}function H(e){return e>80?`text-error`:e>50?`text-warning`:`text-success`}function ae(e){if(!e)return``;let t=Math.round((Date.now()-e)/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60);if(n<60)return`${n}m`;let r=Math.floor(n/60);return r<24?`${r}h ${n%60}m`:`${Math.floor(r/24)}d ${r%24}h`}function U(e,t){return e===void 0&&t===void 0?`—`:`↓ ${S(e??0)} ↑ ${S(t??0)}`}function W(e,t){return e===void 0&&t===void 0?`—`:`↓ ${S(e??0)} ↑ ${S(t??0)}`}function G(e,t){return e===void 0&&t===void 0?`—`:`${e===void 0?`—`:`${e.toFixed(0)}%`} · ${t===void 0?`—`:x(t)}`}function K(e,t){if(!(e===void 0&&t===void 0))return(e??0)+(t??0)}var q=n();function J({label:e,field:t,activeKey:n,activeDir:r,onClick:i,align:s=`right`,testId:c,className:l,resizeKey:u,resize:f}){let p=n===t,m=p?r===`asc`?o:a:null,h=p?r===`asc`?`ascending`:`descending`:`none`;return(0,q.jsxs)(`div`,{role:`columnheader`,"aria-sort":h,className:d(`relative py-1.5 px-2 font-medium select-none`,s===`left`?`text-left`:`text-right`,l),children:[(0,q.jsxs)(`button`,{type:`button`,"data-testid":c,onClick:()=>i(t),className:d(`flex items-center gap-0.5 w-full min-h-11 md:min-h-0 cursor-pointer hover:text-text-primary transition-colors`,s===`left`?`justify-start`:`justify-end`,p&&`text-text-primary`),children:[(0,q.jsx)(`span`,{className:`truncate`,children:e}),m&&(0,q.jsx)(m,{className:`size-3 shrink-0`})]}),u&&f&&(0,q.jsx)(`div`,{role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize ${e} column`,"data-testid":c?`${c}-resize`:void 0,onPointerDown:e=>f.onResizeStart(u,e),onDoubleClick:()=>f.onResizeReset(u),className:`hidden md:block absolute top-0 -right-1 h-full w-2 cursor-col-resize hover:bg-primary/40 active:bg-primary/60`})]})}var oe=150;function se({mode:e,onModeChange:t,ppmOnly:n,onPpmOnlyChange:r,onQueryChange:i}){let[a,o]=(0,C.useState)(``),c=(0,C.useRef)(null);return(0,C.useEffect)(()=>(c.current&&clearTimeout(c.current),c.current=setTimeout(()=>i(a),oe),()=>{c.current&&clearTimeout(c.current)}),[a]),(0,q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 p-2 border-b border-border shrink-0`,children:[(0,q.jsxs)(`div`,{className:`relative flex-1 min-w-[140px]`,children:[(0,q.jsx)(s,{className:`absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-text-subtle`}),(0,q.jsx)(`input`,{type:`text`,value:a,onChange:e=>o(e.target.value),placeholder:`Search processes`,"aria-label":`Search processes`,"data-testid":`sysmon-process-search`,className:`w-full min-h-11 md:min-h-8 pl-7 pr-2 text-sm rounded-md border border-border bg-transparent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`})]}),(0,q.jsx)(`button`,{type:`button`,onClick:()=>t(e===`grouped`?`flat`:`grouped`),"aria-pressed":e===`flat`,"data-testid":`sysmon-toggle-flat`,className:`min-h-11 md:min-h-8 px-3 text-xs rounded-md border border-border hover:bg-surface-hover transition-colors`,children:e===`flat`?`Flat`:`Grouped`}),(0,q.jsx)(`button`,{type:`button`,onClick:()=>r(!n),"aria-pressed":n,"data-testid":`sysmon-filter-ppm`,className:d(`min-h-11 md:min-h-8 px-3 text-xs rounded-md border transition-colors`,n?`border-primary bg-primary/10 text-primary`:`border-border hover:bg-surface-hover`),children:`PPM only`})]})}function ce({sortKey:e,sortDir:t,grid:n,onSort:r,resize:i}){let a={activeKey:e,activeDir:t,onClick:r,resize:i};return(0,q.jsxs)(`div`,{role:`row`,className:d(`grid gap-1 px-3 py-1.5 text-[11px] text-text-subtle border-b border-border sticky top-0 bg-background z-10`,B),children:[(0,q.jsx)(J,{label:`Process`,field:`name`,...a,resize:void 0,align:`left`,testId:`sysmon-sort-name`}),(0,q.jsx)(J,{label:`CPU`,field:`cpu`,...a,resizeKey:`cpu`,testId:`sysmon-sort-cpu`}),(0,q.jsx)(J,{label:`RAM`,field:`ram`,...a,resizeKey:`ram`,testId:`sysmon-sort-ram`}),n.columns.disk&&(0,q.jsx)(J,{label:`Disk`,field:`disk`,...a,resizeKey:`disk`,testId:`sysmon-col-disk`,className:V(n,`disk`)}),n.columns.gpu&&(0,q.jsx)(J,{label:`GPU`,field:`gpu`,...a,resizeKey:`gpu`,testId:`sysmon-col-gpu`,className:V(n,`gpu`)}),n.columns.net&&(0,q.jsx)(J,{label:`Net`,field:`net`,...a,resizeKey:`net`,testId:`sysmon-col-net`,className:V(n,`net`)}),(0,q.jsx)(`span`,{})]})}function le({totals:e,grid:t,gpuUtilPercent:n}){return(0,q.jsxs)(`div`,{className:d(`grid gap-1 px-3 py-1.5 text-xs font-medium border-t border-border shrink-0`,B),"data-testid":`sysmon-total`,"data-process-count":e.count,children:[(0,q.jsxs)(`span`,{className:`truncate`,children:[`Total (`,e.count,` processes)`]}),(0,q.jsxs)(`span`,{className:d(`text-right`,H(e.cpu)),children:[e.cpu.toFixed(1),`%`]}),(0,q.jsx)(`span`,{className:`text-right text-text-secondary`,children:x(e.ramMB)}),t.columns.disk&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(t,`disk`)),children:U(e.diskReadBps,e.diskWriteBps)}),t.columns.gpu&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(t,`gpu`)),children:G(n,e.gpuMemMB)}),t.columns.net&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(t,`net`)),children:W(e.netInBps,e.netOutBps)}),(0,q.jsx)(`span`,{})]})}var ue=`Protected: this app contains a PPM or OS-critical process — cannot be ended as a whole.`;function de({group:e,expanded:t,grid:n,killProtected:a,onToggle:o,onKillClick:s}){let l=t?i:c;return(0,q.jsxs)(`div`,{className:`grid items-center gap-1 min-h-11 md:min-h-7 px-3 text-xs cursor-pointer hover:bg-surface-hover transition-colors group/proc grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]`,onClick:()=>o(e.key),"data-testid":`sysmon-group-row`,"data-group-key":e.key,"data-count":e.count,"data-disk-bps":K(e.diskReadBps,e.diskWriteBps),"data-gpu-pct":e.gpuPct,"data-net-bps":K(e.netInBps,e.netOutBps),children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-1.5 min-w-0`,children:[(0,q.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),o(e.key)},"aria-expanded":t,"aria-label":`${t?`Collapse`:`Expand`} ${e.label}`,"data-testid":`sysmon-group-expand`,className:`flex items-center justify-center size-11 md:size-7 -ml-2 shrink-0`,children:(0,q.jsx)(l,{className:`size-3.5 text-text-subtle`})}),(0,q.jsx)(`span`,{className:`truncate font-medium`,children:e.label}),(0,q.jsxs)(`span`,{className:`text-text-subtle shrink-0`,children:[`(`,e.count,`)`]})]}),(0,q.jsxs)(`span`,{className:d(`text-right`,H(e.cpu)),children:[e.cpu.toFixed(1),`%`]}),(0,q.jsx)(`span`,{className:`text-right text-text-secondary`,children:x(e.ramMB)}),n.columns.disk&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(n,`disk`)),children:U(e.diskReadBps,e.diskWriteBps)}),n.columns.gpu&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(n,`gpu`)),children:G(e.gpuPct,e.gpuMemMB)}),n.columns.net&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(n,`net`)),children:W(e.netInBps,e.netOutBps)}),(0,q.jsx)(`div`,{className:`flex justify-end`,children:(0,q.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),s(e)},disabled:a,"aria-label":`End ${e.label} and its ${e.count} processes`,title:a?ue:`End ${e.label} (${e.count} processes)`,"data-testid":`sysmon-group-kill-btn`,className:d(`flex items-center justify-center size-11 md:size-7 rounded transition-all`,`can-hover:opacity-0 can-hover:group-hover/proc:opacity-100`,a?`opacity-40 cursor-not-allowed`:`hover:bg-error/20 hover:text-error active:bg-error/30`),children:(0,q.jsx)(r,{className:`size-3.5`})})})]})}var fe=`Protected: PPM or OS-critical process — cannot be ended.`;function pe({proc:e,indent:t,grid:n,onKillClick:i}){return(0,q.jsxs)(`div`,{className:`grid items-center gap-1 min-h-11 md:min-h-7 px-3 text-xs group/proc hover:bg-surface-hover transition-colors grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]`,"data-testid":`sysmon-process-row`,"data-pid":e.pid,"data-ppm":e.ppm,"data-protected":e.protected,"data-disk-bps":K(e.diskReadBps,e.diskWriteBps),"data-gpu-pct":e.gpuPct,"data-net-bps":K(e.netInBps,e.netOutBps),children:[(0,q.jsxs)(`div`,{className:d(`flex items-start gap-1.5 min-w-0`,t&&`pl-6`),children:[(0,q.jsx)(`span`,{className:`text-text-subtle shrink-0`,children:e.pid}),(0,q.jsx)(`span`,{className:`truncate text-text-secondary`,title:e.startedAt?`${e.command}\nRunning ${ae(e.startedAt)}`:e.command,children:e.command})]}),(0,q.jsxs)(`span`,{className:d(`text-right`,H(e.cpu)),children:[e.cpu.toFixed(1),`%`]}),(0,q.jsx)(`span`,{className:`text-right text-text-secondary`,children:x(e.ramMB)}),n.columns.disk&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(n,`disk`)),children:U(e.diskReadBps,e.diskWriteBps)}),n.columns.gpu&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(n,`gpu`)),children:G(e.gpuPct,e.gpuMemMB)}),n.columns.net&&(0,q.jsx)(`span`,{className:d(`text-right text-text-secondary tabular-nums truncate`,V(n,`net`)),children:W(e.netInBps,e.netOutBps)}),(0,q.jsx)(`div`,{className:`flex justify-end`,children:(0,q.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),i(e)},disabled:e.protected,"aria-label":`End process ${e.name} (${e.pid})`,title:e.protected?fe:`End process ${e.name}`,"data-testid":`sysmon-kill-btn`,className:d(`flex items-center justify-center size-11 md:size-7 rounded transition-all`,`can-hover:opacity-0 can-hover:group-hover/proc:opacity-100`,e.protected?`opacity-40 cursor-not-allowed`:`hover:bg-error/20 hover:text-error active:bg-error/30`),children:(0,q.jsx)(r,{className:`size-3.5`})})})]})}function me({target:e,onConfirm:t,onCancel:n}){let r=f(),[i,a]=(0,C.useState)(!1);if((0,C.useEffect)(()=>{e||a(!1)},[e]),!e)return null;let o=e.kind===`group`,s=o?`End app`:`End process`,c=o?e.group.cpu:e.proc.cpu,l=o?e.group.ramMB:e.proc.ramMB,u=(0,q.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-kill-confirm`,"data-kill-kind":e.kind,children:[o?(0,q.jsxs)(`p`,{className:`text-sm`,children:[`End `,(0,q.jsx)(`span`,{className:`font-medium`,children:e.group.label}),` and all its`,` `,(0,q.jsx)(`span`,{className:`font-medium`,children:e.members.length}),` processes?`]}):(0,q.jsxs)(`p`,{className:`text-sm`,children:[`End `,(0,q.jsx)(`span`,{className:`font-medium`,children:e.proc.name}),` (pid `,e.proc.pid,`)?`]}),(0,q.jsxs)(`p`,{className:`text-xs text-text-subtle`,children:[`CPU `,c.toFixed(1),`% · RAM `,x(l)]}),!o&&(0,q.jsxs)(`label`,{className:`flex items-center justify-between gap-3 min-h-11 py-1`,children:[(0,q.jsx)(`span`,{className:`text-sm`,children:`Also end child processes`}),(0,q.jsx)(b,{checked:i,onCheckedChange:a,"data-testid":`sysmon-kill-tree`,"aria-label":`Also end child processes`})]}),(0,q.jsxs)(`div`,{className:`flex flex-col-reverse md:flex-row gap-2 md:justify-end pt-2`,children:[(0,q.jsx)(p,{variant:`outline`,onClick:n,"data-testid":`sysmon-kill-confirm-cancel`,className:`min-h-11`,children:`Cancel`}),(0,q.jsx)(p,{variant:`destructive`,autoFocus:!1,onClick:()=>t(e,i),"data-testid":`sysmon-kill-confirm-ok`,className:`min-h-11`,children:o?`End ${e.members.length} processes`:`End process`})]})]});return r?(0,q.jsx)(v,{open:!0,onClose:n,children:(0,q.jsxs)(`div`,{className:`px-4 pb-4`,children:[(0,q.jsx)(`h2`,{className:`text-base font-semibold mb-3`,children:s}),u]})}):(0,q.jsx)(_,{open:!0,onOpenChange:e=>!e&&n(),children:(0,q.jsxs)(h,{children:[(0,q.jsx)(m,{children:(0,q.jsx)(g,{children:s})}),u]})})}function Y(e,t){return{pid:e.pid,startedAt:e.startedAt,tree:t}}function he(e,t){let n=e.rootPid===null?void 0:t.find(t=>t.pid===e.rootPid);return n?[Y(n,!0)]:t.map(e=>Y(e,!1))}function ge(e){return e.some(e=>e.protected)}async function X(e){let t=l(),n={"Content-Type":`application/json`,"X-PPM-Request":`1`};t&&(n.Authorization=`Bearer ${t}`);let r=await fetch(`/api/system/resources/kill`,{method:`POST`,headers:n,body:JSON.stringify(e)}),i;try{i=await r.json()}catch{throw Error(r.ok?`Empty response from server`:`Server error (HTTP ${r.status})`)}if(i.ok===!1)throw Error(i.error??`HTTP ${r.status}`);return i.data}function _e(e){let[t,n]=(0,C.useState)(null),r=(0,C.useCallback)(t=>{let n=new Map(e.processes.map(e=>[e.pid,e]));return t.pids.map(e=>n.get(e)).filter(e=>!!e)},[e.processes]),i=(0,C.useMemo)(()=>new Map(e.groups.map(e=>[e.key,ge(r(e))])),[e.groups,r]),a=(0,C.useCallback)(e=>n({kind:`process`,proc:e}),[]),o=(0,C.useCallback)(e=>n({kind:`group`,group:e,members:r(e)}),[r]),s=(0,C.useCallback)(()=>n(null),[]);return{pendingKill:t,groupProtected:i,requestKillProcess:a,requestKillGroup:o,confirmKill:(0,C.useCallback)(async(e,t)=>{if(n(null),e.kind===`process`){let{proc:n}=e;try{await X(Y(n,t)),u.success(`Ended ${n.name} (${n.pid})`)}catch(e){u.error(e instanceof Error?e.message:`Failed to end ${n.name}`)}return}let{group:r,members:i}=e,a=[];for(let e of he(r,i))try{await X(e)}catch(t){a.push(t instanceof Error?t.message:`pid ${e.pid}`)}a.length===0?u.success(`Ended ${r.label} (${i.length} processes)`):u.error(`${r.label}: ${a.length} of ${i.length} could not be ended — ${a[0]}`)},[]),cancelKill:s}}var Z=`ppm-sysmon-col-widths`;function Q(){try{let e=localStorage.getItem(Z);if(!e)return{};let t=JSON.parse(e),n={};for(let e of[`cpu`,`ram`,`disk`,`gpu`,`net`]){let r=t[e];typeof r==`number`&&Number.isFinite(r)&&(n[e]=L(r))}return n}catch{return{}}}function $(e){try{Object.keys(e).length===0?localStorage.removeItem(Z):localStorage.setItem(Z,JSON.stringify(e))}catch{}}function ve(){let[e,t]=(0,C.useState)(()=>typeof localStorage>`u`?{}:Q()),n=(0,C.useRef)(null);return(0,C.useEffect)(()=>{let e=e=>{let r=n.current;if(!r)return;let i=L(r.startWidth+(e.clientX-r.startX));t(e=>e[r.key]===i?e:{...e,[r.key]:i})},r=()=>{n.current&&(n.current=null,document.body.style.cursor=``,t(e=>($(e),e)))};return window.addEventListener(`pointermove`,e),window.addEventListener(`pointerup`,r),window.addEventListener(`pointercancel`,r),()=>{window.removeEventListener(`pointermove`,e),window.removeEventListener(`pointerup`,r),window.removeEventListener(`pointercancel`,r)}},[]),{widths:e,begin:(0,C.useCallback)((t,r)=>{r.preventDefault(),n.current={key:t,startX:r.clientX,startWidth:R(t,e)},document.body.style.cursor=`col-resize`},[e]),reset:(0,C.useCallback)(e=>{t(t=>{if(!(e in t))return t;let{[e]:n,...r}=t;return $(r),r})},[])}}var ye={disk:!1,gpu:!1,net:!1};function be({snapshot:e}){let t=f(),n=(0,C.useRef)(null),[r,i]=(0,C.useState)(`grouped`),[a,o]=(0,C.useState)(!1),[s,c]=(0,C.useState)(``),[l,u]=(0,C.useState)(null),[d,p]=(0,C.useState)(`desc`),[m,h]=(0,C.useState)(()=>new Set),{pendingKill:g,groupProtected:_,requestKillProcess:v,requestKillGroup:b,confirmKill:x,cancelKill:S}=_e(e),{widths:w,begin:T,reset:E}=ve(),{rows:D,totals:O}=(0,C.useMemo)(()=>ee({processes:e.processes,groups:e.groups,mode:r,ppmOnly:a,query:s,sortKey:l,sortDir:d,expanded:m}),[e.processes,e.groups,r,a,s,l,d,m]),k=e.processColumns??ye,A=(0,C.useMemo)(()=>z(k,l,w),[k,l,w]),j=e.system.gpus[0]?.utilPercent,M=y({count:D.length,getScrollElement:()=>n.current,estimateSize:()=>t?44:28,overscan:12}),N=(0,C.useCallback)(e=>{let[t,n]=te(l,d,e);u(t),p(n)},[l,d]),P=(0,C.useCallback)(e=>{h(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]);return(0,q.jsxs)(`div`,{className:`h-full flex flex-col min-h-0 @container`,style:ie(A),"data-testid":`sysmon-processes`,"data-row-count":D.length,children:[(0,q.jsx)(se,{mode:r,onModeChange:i,ppmOnly:a,onPpmOnlyChange:o,onQueryChange:c}),(0,q.jsx)(ce,{sortKey:l,sortDir:d,grid:A,onSort:N,resize:{onResizeStart:T,onResizeReset:E}}),(0,q.jsx)(`div`,{ref:n,className:`flex-1 min-h-0 overflow-y-auto`,children:(0,q.jsx)(`div`,{style:{height:M.getTotalSize(),position:`relative`},children:M.getVirtualItems().map(e=>{let t=D[e.index];return t?(0,q.jsx)(`div`,{style:{position:`absolute`,top:0,left:0,right:0,transform:`translateY(${e.start}px)`},children:t.kind===`group`?(0,q.jsx)(de,{group:t.group,expanded:t.expanded,grid:A,killProtected:_.get(t.group.key)??!0,onToggle:P,onKillClick:b}):(0,q.jsx)(pe,{proc:t.proc,indent:t.indent,grid:A,onKillClick:v})},t.kind===`group`?t.group.key:`p:${t.proc.pid}`):null})})}),(0,q.jsx)(le,{totals:O,grid:A,gpuUtilPercent:j}),(0,q.jsx)(me,{target:g,onConfirm:x,onCancel:S})]})}export{be as ProcessTable};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t,S as n}from"./vendor-markdown-CuWCHIVb.js";import"./vendor-ui-DmZ-Mb-H.js";import{Gn as r,Qn as i,ln as a,nt as o,xt as s}from"./icons-DQjqk0lJ.js";import"./api-client-C1ZwRL4Y.js";import"./portal-container-context-BarKmT4S.js";import{t as c}from"./button-B9CTrsEf.js";import{a as l,n as u,o as d,r as f,s as p,t as m}from"./dialog-B84_DJQ8.js";import{t as h}from"./input-C7Q8FxeL.js";import{Qt as g,Y as _,rt as v}from"./index-DU68xk06.js";import{getAISettings as y,getProxySettings as b,updateProxySettings as x}from"./api-settings-_7Q-ULxp.js";var S=e(t(),1),C=[{value:`claude-opus-5`,label:`Claude Opus 5`,hint:`most powerful`},{value:`claude-fable-5-1`,label:`Claude Fable 5.1`,hint:`flagship`},{value:`claude-fable-5`,label:`Claude Fable 5`,hint:`flagship`},{value:`claude-opus-4-8`,label:`Claude Opus 4.8`,hint:`powerful`},{value:`claude-opus-4-7`,label:`Claude Opus 4.7`,hint:`powerful`},{value:`claude-opus-4-6`,label:`Claude Opus 4.6`,hint:`powerful`},{value:`claude-sonnet-5`,label:`Claude Sonnet 5`,hint:`fast`},{value:`claude-sonnet-4-6`,label:`Claude Sonnet 4.6`,hint:`fast`},{value:`claude-haiku-4-5`,label:`Claude Haiku 4.5`,hint:`cheap`}];C.map(e=>e.value);function w(e,t){return`${e}/proxy${t?`/${t}`:``}`}function T(e,t){let n=w(e,t);return{anthropicBase:n,openAiBase:`${n}/v1`,anthropicMessages:`${n}/v1/messages`,openAiChatCompletions:`${n}/v1/chat/completions`,models:`${n}/v1/models`,imagesGenerations:t?`${n}/v1/images/generations`:null,imagesEdits:t?`${n}/v1/images/edits`:null}}var E=n(),D=`Hello! Reply briefly.`,O=`claude-opus-5`;function k(e){let[t,n]=(0,S.useState)(!1);return(0,E.jsxs)(m,{open:t,onOpenChange:n,children:[(0,E.jsx)(p,{asChild:!0,children:(0,E.jsxs)(c,{variant:`outline`,size:`sm`,className:`h-7 text-[11px] gap-1.5 cursor-pointer`,children:[(0,E.jsx)(s,{className:`size-3`}),`Test`]})}),(0,E.jsxs)(u,{className:`sm:max-w-md max-h-[85vh] overflow-y-auto`,children:[(0,E.jsxs)(l,{children:[(0,E.jsx)(d,{className:`text-sm`,children:`Test Proxy`}),(0,E.jsx)(f,{className:`text-[11px]`,children:`Send a test request and inspect the raw response.`})]}),t&&(0,E.jsx)(A,{...e})]})]})}function A({authKey:e,baseUrl:t,provider:n}){let[i,o]=(0,S.useState)(`anthropic`),[s,l]=(0,S.useState)(D),[u,d]=(0,S.useState)(n?``:O),[f,p]=(0,S.useState)(!0),[m,g]=(0,S.useState)(!1),[_,y]=(0,S.useState)(null),[b,x]=(0,S.useState)(null),[w,k]=(0,S.useState)(null),A=(0,S.useRef)(null),j=(0,S.useRef)(null);(0,S.useEffect)(()=>{A.current?.select()},[]),(0,S.useEffect)(()=>{j.current&&(j.current.scrollTop=j.current.scrollHeight)},[_]);let M=e=>{o(e),y(null),x(null),k(null)},N=async()=>{g(!0),y(null),x(null),k(null);let r=Date.now(),a=i===`openai`,o=T(t,n),c=a?o.openAiChatCompletions:o.anthropicMessages,l=JSON.stringify({...u?{model:u}:{},max_tokens:256,stream:f,messages:[{role:`user`,content:s}]}),d={"Content-Type":`application/json`};a?d.Authorization=`Bearer ${e}`:(d[`x-api-key`]=e,d[`anthropic-version`]=`2023-06-01`);try{let e=await fetch(c,{method:`POST`,headers:d,body:l});if(!e.ok){let t=await e.text();x(`HTTP ${e.status}: ${t}`),g(!1),k(Date.now()-r);return}if(f){let t=e.body?.getReader();if(!t){x(`No response body`),g(!1);return}let n=new TextDecoder,i=``;for(;;){let{done:e,value:r}=await t.read();if(e)break;i+=n.decode(r,{stream:!0}),y(i)}k(Date.now()-r)}else{let t=await e.text();try{y(JSON.stringify(JSON.parse(t),null,2))}catch{y(t)}k(Date.now()-r)}}catch(e){x(e.message)}finally{g(!1),k(e=>e??Date.now()-r)}};return(0,E.jsxs)(`div`,{className:`space-y-3 min-w-0`,children:[(0,E.jsxs)(`div`,{className:`space-y-1.5 min-w-0`,children:[(0,E.jsx)(v,{className:`text-[11px]`,children:`Auth Style`}),(0,E.jsx)(`div`,{className:`flex gap-1`,children:[`anthropic`,`openai`].map(e=>(0,E.jsx)(`button`,{onClick:()=>M(e),className:`flex-1 h-8 rounded-md text-[11px] font-medium border transition-colors cursor-pointer ${i===e?`bg-primary text-primary-foreground border-primary`:`bg-muted text-muted-foreground border-transparent hover:bg-muted/80`}`,children:e===`anthropic`?`Anthropic`:`OpenAI`},e))}),(0,E.jsxs)(`p`,{className:`text-[9px] text-muted-foreground break-all`,children:[i===`anthropic`?`x-api-key header`:`Authorization: Bearer header`,` · `,(0,E.jsx)(`code`,{children:`/proxy${n?`/${n}`:``}/v1/${i===`anthropic`?`messages`:`chat/completions`}`})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(v,{className:`text-[11px]`,children:`Model`}),n?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(h,{value:u,onChange:e=>d(e.target.value),placeholder:`leave empty to let the provider choose`,className:`h-8 text-[11px] font-mono`}),(0,E.jsxs)(`p`,{className:`text-[9px] text-muted-foreground`,children:[`Names come from `,(0,E.jsxs)(`code`,{children:[`GET /proxy/`,n,`/v1/models`]}),`.`]})]}):(0,E.jsx)(`select`,{value:u,onChange:e=>d(e.target.value),className:`h-8 w-full rounded-md border bg-background px-2 text-[11px]`,children:C.map(e=>(0,E.jsx)(`option`,{value:e.value,children:e.value},e.value))})]}),(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(v,{className:`text-[11px]`,children:`Streaming`}),(0,E.jsx)(`div`,{className:`flex gap-1`,children:[!0,!1].map(e=>(0,E.jsx)(`button`,{onClick:()=>p(e),className:`h-7 px-3 rounded-md text-[11px] font-medium border transition-colors cursor-pointer ${f===e?`bg-primary text-primary-foreground border-primary`:`bg-muted text-muted-foreground border-transparent hover:bg-muted/80`}`,children:e?`Stream`:`JSON`},String(e)))})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(v,{className:`text-[11px]`,children:`Message`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,E.jsx)(h,{ref:A,value:s,onChange:e=>l(e.target.value),placeholder:`Type a test message...`,className:`h-9 text-[11px] flex-1 min-w-0`,onKeyDown:e=>{e.key===`Enter`&&!m&&N()}}),(0,E.jsxs)(c,{size:`sm`,className:`h-9 px-3 cursor-pointer shrink-0`,onClick:N,disabled:m||!s.trim(),children:[m?(0,E.jsx)(a,{className:`size-3.5 animate-spin`}):(0,E.jsx)(r,{className:`size-3.5`}),(0,E.jsx)(`span`,{className:`ml-1 text-[11px]`,children:m?`...`:`Send`})]})]})]}),(_||b)&&(0,E.jsxs)(`div`,{className:`space-y-1 min-w-0`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`Raw Response`}),w!=null&&(0,E.jsxs)(`span`,{className:`text-[9px] font-mono text-muted-foreground`,children:[(w/1e3).toFixed(1),`s`]})]}),b?(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-error/10 text-error p-2 rounded overflow-auto max-h-52 whitespace-pre-wrap break-all`,children:b}):(0,E.jsx)(`pre`,{ref:j,className:`text-[9px] font-mono bg-muted p-2 rounded overflow-auto max-h-52 whitespace-pre-wrap break-all`,children:_})]})]})}function j(){let[e,t]=(0,S.useState)(``),[n,r]=(0,S.useState)([]);(0,S.useEffect)(()=>{y().then(e=>r(Object.keys(e.providers??{}).filter(e=>e!==`mock`&&e!==`claude`))).catch(()=>r([]))},[]);let[a,s]=(0,S.useState)(null),[l,u]=(0,S.useState)(!0),[d,f]=(0,S.useState)(!1),[p,m]=(0,S.useState)(null),[C,w]=(0,S.useState)(null);(0,S.useEffect)(()=>{u(!0),b().then(s).catch(e=>m(e.message)).finally(()=>u(!1))},[]);let D=async e=>{f(!0),m(null);try{s(await x(e))}catch(e){m(e.message)}finally{f(!1)}},O=(e,t)=>{g(e),w(t),setTimeout(()=>w(null),2e3)};if(l||!a)return(0,E.jsxs)(`div`,{className:`space-y-2`,children:[(0,E.jsx)(`h3`,{className:`text-xs font-medium text-text-secondary`,children:`API Proxy`}),(0,E.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:p?`Error: ${p}`:`Loading...`})]});let A=!!a.authKey,j=!!a.tunnelUrl,M=a.localEndpoint.replace(/\/proxy\/v1\/messages$/,``),N=T(j?a.tunnelUrl:M,e),P=N.anthropicMessages,F=N.openAiChatCompletions,I=`ANTHROPIC_BASE_URL=${N.anthropicBase}\nANTHROPIC_API_KEY=${a.authKey}`,L=`OPENAI_BASE_URL=${N.openAiBase}\nOPENAI_API_KEY=${a.authKey}`;return(0,E.jsxs)(`div`,{className:`space-y-4`,children:[(0,E.jsx)(`div`,{className:`space-y-1.5`,children:(0,E.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Expose your accounts as an API that speaks both the Anthropic and OpenAI formats, so most SDKs need only a new base URL. The default path answers from your Claude accounts; pick a provider below to run its agent instead, which also unlocks image generation.`})}),(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,E.jsx)(v,{className:`text-xs`,children:`Enable Proxy`}),(0,E.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Accept API requests under /proxy`})]}),(0,E.jsx)(_,{checked:a.enabled,onCheckedChange:e=>D({enabled:e}),disabled:d})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(v,{className:`text-[11px]`,children:`Auth Key`}),A?(0,E.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,E.jsx)(h,{readOnly:!0,value:a.authKey,className:`h-7 text-[11px] font-mono flex-1`}),(0,E.jsx)(c,{variant:`outline`,size:`sm`,className:`h-7 px-2 cursor-pointer shrink-0`,onClick:()=>O(a.authKey,`key`),children:C===`key`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})}),(0,E.jsx)(c,{variant:`outline`,size:`sm`,className:`h-7 px-2 cursor-pointer shrink-0`,onClick:()=>D({generateKey:!0}),disabled:d,children:(0,E.jsx)(i,{className:`size-3`})})]}):(0,E.jsx)(c,{variant:`outline`,size:`sm`,className:`h-7 text-xs cursor-pointer`,onClick:()=>D({generateKey:!0}),disabled:d,children:`Generate Auth Key`}),(0,E.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Use as Bearer token or x-api-key when calling the proxy.`})]}),a.enabled&&A&&(0,E.jsxs)(`div`,{className:`space-y-2 rounded-md border p-3 bg-muted/30`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(`h4`,{className:`text-[11px] font-medium`,children:`Connection Info`}),(0,E.jsx)(k,{authKey:a.authKey,baseUrl:window.location.origin,provider:e})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`Provider`}),(0,E.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:[{id:``,label:`Claude (default)`},...n.map(e=>({id:e,label:e}))].map(n=>(0,E.jsx)(`button`,{type:`button`,onClick:()=>t(n.id),className:`text-[10px] px-2.5 min-h-[36px] rounded-md border transition-colors cursor-pointer ${e===n.id?`border-primary bg-primary/15`:`border-border bg-muted/40 hover:bg-muted`}`,children:n.label},n.id||`default`))}),e&&(0,E.jsxs)(`p`,{className:`text-[10px] text-muted-foreground`,children:[`Runs the `,e,` agent per request (read-only sandbox, one turn). Slower than the default path.`]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`Anthropic Endpoint`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5 items-center`,children:[(0,E.jsx)(`code`,{className:`text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded flex-1 truncate`,children:P}),(0,E.jsx)(c,{variant:`ghost`,size:`sm`,className:`h-6 px-1.5 cursor-pointer shrink-0`,onClick:()=>O(P,`anthropic`),children:C===`anthropic`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`OpenAI-Compatible Endpoint`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5 items-center`,children:[(0,E.jsx)(`code`,{className:`text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded flex-1 truncate`,children:F}),(0,E.jsx)(c,{variant:`ghost`,size:`sm`,className:`h-6 px-1.5 cursor-pointer shrink-0`,onClick:()=>O(F,`openai`),children:C===`openai`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})})]})]}),N.imagesGenerations&&N.imagesEdits&&(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`Image Endpoints`}),(0,E.jsx)(`code`,{className:`block text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded truncate`,children:N.imagesGenerations}),(0,E.jsx)(`code`,{className:`block text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded truncate`,children:N.imagesEdits})]}),!j&&(0,E.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Start a Cloudflare tunnel (Share) to get a public URL.`}),(0,E.jsxs)(`div`,{className:`space-y-1 pt-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`Anthropic Format`}),(0,E.jsxs)(`div`,{className:`relative`,children:[(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-muted p-2 rounded overflow-x-auto whitespace-pre`,children:I}),(0,E.jsx)(c,{variant:`ghost`,size:`sm`,className:`absolute top-1 right-1 h-5 px-1 cursor-pointer`,onClick:()=>O(I,`anthropic-env`),children:C===`anthropic-env`?`Copied!`:(0,E.jsx)(o,{className:`size-2.5`})})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`OpenAI Format`}),(0,E.jsxs)(`div`,{className:`relative`,children:[(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-muted p-2 rounded overflow-x-auto whitespace-pre`,children:L}),(0,E.jsx)(c,{variant:`ghost`,size:`sm`,className:`absolute top-1 right-1 h-5 px-1 cursor-pointer`,onClick:()=>O(L,`openai-env`),children:C===`openai-env`?`Copied!`:(0,E.jsx)(o,{className:`size-2.5`})})]})]}),(0,E.jsx)(`div`,{className:`flex items-center gap-3 pt-1`,children:(0,E.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[`Requests served: `,(0,E.jsx)(`span`,{className:`font-mono`,children:a.requestCount})]})})]}),d&&(0,E.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Saving...`}),p&&(0,E.jsx)(`p`,{className:`text-[11px] text-error`,children:p})]})}export{j as ProxySettingsSection};
1
+ import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t,S as n}from"./vendor-markdown-CuWCHIVb.js";import"./vendor-ui-DmZ-Mb-H.js";import{Gn as r,Qn as i,ln as a,nt as o,xt as s}from"./icons-DQjqk0lJ.js";import"./api-client-C1ZwRL4Y.js";import"./portal-container-context-BarKmT4S.js";import{t as c}from"./button-B9CTrsEf.js";import{a as l,n as u,o as d,r as f,s as p,t as m}from"./dialog-B84_DJQ8.js";import{t as h}from"./input-C7Q8FxeL.js";import{$t as g,Y as _,rt as v}from"./index-CEZVxM4G.js";import{getAISettings as y,getProxySettings as b,updateProxySettings as x}from"./api-settings-_7Q-ULxp.js";var S=e(t(),1),C=[{value:`claude-opus-5`,label:`Claude Opus 5`,hint:`most powerful`},{value:`claude-fable-5-1`,label:`Claude Fable 5.1`,hint:`flagship`},{value:`claude-fable-5`,label:`Claude Fable 5`,hint:`flagship`},{value:`claude-opus-4-8`,label:`Claude Opus 4.8`,hint:`powerful`},{value:`claude-opus-4-7`,label:`Claude Opus 4.7`,hint:`powerful`},{value:`claude-opus-4-6`,label:`Claude Opus 4.6`,hint:`powerful`},{value:`claude-sonnet-5`,label:`Claude Sonnet 5`,hint:`fast`},{value:`claude-sonnet-4-6`,label:`Claude Sonnet 4.6`,hint:`fast`},{value:`claude-haiku-4-5`,label:`Claude Haiku 4.5`,hint:`cheap`}];C.map(e=>e.value);function w(e,t){return`${e}/proxy${t?`/${t}`:``}`}function T(e,t){let n=w(e,t);return{anthropicBase:n,openAiBase:`${n}/v1`,anthropicMessages:`${n}/v1/messages`,openAiChatCompletions:`${n}/v1/chat/completions`,models:`${n}/v1/models`,imagesGenerations:t?`${n}/v1/images/generations`:null,imagesEdits:t?`${n}/v1/images/edits`:null}}var E=n(),D=`Hello! Reply briefly.`,O=`claude-opus-5`;function k(e){let[t,n]=(0,S.useState)(!1);return(0,E.jsxs)(m,{open:t,onOpenChange:n,children:[(0,E.jsx)(p,{asChild:!0,children:(0,E.jsxs)(c,{variant:`outline`,size:`sm`,className:`h-7 text-[11px] gap-1.5 cursor-pointer`,children:[(0,E.jsx)(s,{className:`size-3`}),`Test`]})}),(0,E.jsxs)(u,{className:`sm:max-w-md max-h-[85vh] overflow-y-auto`,children:[(0,E.jsxs)(l,{children:[(0,E.jsx)(d,{className:`text-sm`,children:`Test Proxy`}),(0,E.jsx)(f,{className:`text-[11px]`,children:`Send a test request and inspect the raw response.`})]}),t&&(0,E.jsx)(A,{...e})]})]})}function A({authKey:e,baseUrl:t,provider:n}){let[i,o]=(0,S.useState)(`anthropic`),[s,l]=(0,S.useState)(D),[u,d]=(0,S.useState)(n?``:O),[f,p]=(0,S.useState)(!0),[m,g]=(0,S.useState)(!1),[_,y]=(0,S.useState)(null),[b,x]=(0,S.useState)(null),[w,k]=(0,S.useState)(null),A=(0,S.useRef)(null),j=(0,S.useRef)(null);(0,S.useEffect)(()=>{A.current?.select()},[]),(0,S.useEffect)(()=>{j.current&&(j.current.scrollTop=j.current.scrollHeight)},[_]);let M=e=>{o(e),y(null),x(null),k(null)},N=async()=>{g(!0),y(null),x(null),k(null);let r=Date.now(),a=i===`openai`,o=T(t,n),c=a?o.openAiChatCompletions:o.anthropicMessages,l=JSON.stringify({...u?{model:u}:{},max_tokens:256,stream:f,messages:[{role:`user`,content:s}]}),d={"Content-Type":`application/json`};a?d.Authorization=`Bearer ${e}`:(d[`x-api-key`]=e,d[`anthropic-version`]=`2023-06-01`);try{let e=await fetch(c,{method:`POST`,headers:d,body:l});if(!e.ok){let t=await e.text();x(`HTTP ${e.status}: ${t}`),g(!1),k(Date.now()-r);return}if(f){let t=e.body?.getReader();if(!t){x(`No response body`),g(!1);return}let n=new TextDecoder,i=``;for(;;){let{done:e,value:r}=await t.read();if(e)break;i+=n.decode(r,{stream:!0}),y(i)}k(Date.now()-r)}else{let t=await e.text();try{y(JSON.stringify(JSON.parse(t),null,2))}catch{y(t)}k(Date.now()-r)}}catch(e){x(e.message)}finally{g(!1),k(e=>e??Date.now()-r)}};return(0,E.jsxs)(`div`,{className:`space-y-3 min-w-0`,children:[(0,E.jsxs)(`div`,{className:`space-y-1.5 min-w-0`,children:[(0,E.jsx)(v,{className:`text-[11px]`,children:`Auth Style`}),(0,E.jsx)(`div`,{className:`flex gap-1`,children:[`anthropic`,`openai`].map(e=>(0,E.jsx)(`button`,{onClick:()=>M(e),className:`flex-1 h-8 rounded-md text-[11px] font-medium border transition-colors cursor-pointer ${i===e?`bg-primary text-primary-foreground border-primary`:`bg-muted text-muted-foreground border-transparent hover:bg-muted/80`}`,children:e===`anthropic`?`Anthropic`:`OpenAI`},e))}),(0,E.jsxs)(`p`,{className:`text-[9px] text-muted-foreground break-all`,children:[i===`anthropic`?`x-api-key header`:`Authorization: Bearer header`,` · `,(0,E.jsx)(`code`,{children:`/proxy${n?`/${n}`:``}/v1/${i===`anthropic`?`messages`:`chat/completions`}`})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(v,{className:`text-[11px]`,children:`Model`}),n?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(h,{value:u,onChange:e=>d(e.target.value),placeholder:`leave empty to let the provider choose`,className:`h-8 text-[11px] font-mono`}),(0,E.jsxs)(`p`,{className:`text-[9px] text-muted-foreground`,children:[`Names come from `,(0,E.jsxs)(`code`,{children:[`GET /proxy/`,n,`/v1/models`]}),`.`]})]}):(0,E.jsx)(`select`,{value:u,onChange:e=>d(e.target.value),className:`h-8 w-full rounded-md border bg-background px-2 text-[11px]`,children:C.map(e=>(0,E.jsx)(`option`,{value:e.value,children:e.value},e.value))})]}),(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(v,{className:`text-[11px]`,children:`Streaming`}),(0,E.jsx)(`div`,{className:`flex gap-1`,children:[!0,!1].map(e=>(0,E.jsx)(`button`,{onClick:()=>p(e),className:`h-7 px-3 rounded-md text-[11px] font-medium border transition-colors cursor-pointer ${f===e?`bg-primary text-primary-foreground border-primary`:`bg-muted text-muted-foreground border-transparent hover:bg-muted/80`}`,children:e?`Stream`:`JSON`},String(e)))})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(v,{className:`text-[11px]`,children:`Message`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,E.jsx)(h,{ref:A,value:s,onChange:e=>l(e.target.value),placeholder:`Type a test message...`,className:`h-9 text-[11px] flex-1 min-w-0`,onKeyDown:e=>{e.key===`Enter`&&!m&&N()}}),(0,E.jsxs)(c,{size:`sm`,className:`h-9 px-3 cursor-pointer shrink-0`,onClick:N,disabled:m||!s.trim(),children:[m?(0,E.jsx)(a,{className:`size-3.5 animate-spin`}):(0,E.jsx)(r,{className:`size-3.5`}),(0,E.jsx)(`span`,{className:`ml-1 text-[11px]`,children:m?`...`:`Send`})]})]})]}),(_||b)&&(0,E.jsxs)(`div`,{className:`space-y-1 min-w-0`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`Raw Response`}),w!=null&&(0,E.jsxs)(`span`,{className:`text-[9px] font-mono text-muted-foreground`,children:[(w/1e3).toFixed(1),`s`]})]}),b?(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-error/10 text-error p-2 rounded overflow-auto max-h-52 whitespace-pre-wrap break-all`,children:b}):(0,E.jsx)(`pre`,{ref:j,className:`text-[9px] font-mono bg-muted p-2 rounded overflow-auto max-h-52 whitespace-pre-wrap break-all`,children:_})]})]})}function j(){let[e,t]=(0,S.useState)(``),[n,r]=(0,S.useState)([]);(0,S.useEffect)(()=>{y().then(e=>r(Object.keys(e.providers??{}).filter(e=>e!==`mock`&&e!==`claude`))).catch(()=>r([]))},[]);let[a,s]=(0,S.useState)(null),[l,u]=(0,S.useState)(!0),[d,f]=(0,S.useState)(!1),[p,m]=(0,S.useState)(null),[C,w]=(0,S.useState)(null);(0,S.useEffect)(()=>{u(!0),b().then(s).catch(e=>m(e.message)).finally(()=>u(!1))},[]);let D=async e=>{f(!0),m(null);try{s(await x(e))}catch(e){m(e.message)}finally{f(!1)}},O=(e,t)=>{g(e),w(t),setTimeout(()=>w(null),2e3)};if(l||!a)return(0,E.jsxs)(`div`,{className:`space-y-2`,children:[(0,E.jsx)(`h3`,{className:`text-xs font-medium text-text-secondary`,children:`API Proxy`}),(0,E.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:p?`Error: ${p}`:`Loading...`})]});let A=!!a.authKey,j=!!a.tunnelUrl,M=a.localEndpoint.replace(/\/proxy\/v1\/messages$/,``),N=T(j?a.tunnelUrl:M,e),P=N.anthropicMessages,F=N.openAiChatCompletions,I=`ANTHROPIC_BASE_URL=${N.anthropicBase}\nANTHROPIC_API_KEY=${a.authKey}`,L=`OPENAI_BASE_URL=${N.openAiBase}\nOPENAI_API_KEY=${a.authKey}`;return(0,E.jsxs)(`div`,{className:`space-y-4`,children:[(0,E.jsx)(`div`,{className:`space-y-1.5`,children:(0,E.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Expose your accounts as an API that speaks both the Anthropic and OpenAI formats, so most SDKs need only a new base URL. The default path answers from your Claude accounts; pick a provider below to run its agent instead, which also unlocks image generation.`})}),(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,E.jsx)(v,{className:`text-xs`,children:`Enable Proxy`}),(0,E.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Accept API requests under /proxy`})]}),(0,E.jsx)(_,{checked:a.enabled,onCheckedChange:e=>D({enabled:e}),disabled:d})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(v,{className:`text-[11px]`,children:`Auth Key`}),A?(0,E.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,E.jsx)(h,{readOnly:!0,value:a.authKey,className:`h-7 text-[11px] font-mono flex-1`}),(0,E.jsx)(c,{variant:`outline`,size:`sm`,className:`h-7 px-2 cursor-pointer shrink-0`,onClick:()=>O(a.authKey,`key`),children:C===`key`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})}),(0,E.jsx)(c,{variant:`outline`,size:`sm`,className:`h-7 px-2 cursor-pointer shrink-0`,onClick:()=>D({generateKey:!0}),disabled:d,children:(0,E.jsx)(i,{className:`size-3`})})]}):(0,E.jsx)(c,{variant:`outline`,size:`sm`,className:`h-7 text-xs cursor-pointer`,onClick:()=>D({generateKey:!0}),disabled:d,children:`Generate Auth Key`}),(0,E.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Use as Bearer token or x-api-key when calling the proxy.`})]}),a.enabled&&A&&(0,E.jsxs)(`div`,{className:`space-y-2 rounded-md border p-3 bg-muted/30`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(`h4`,{className:`text-[11px] font-medium`,children:`Connection Info`}),(0,E.jsx)(k,{authKey:a.authKey,baseUrl:window.location.origin,provider:e})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`Provider`}),(0,E.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:[{id:``,label:`Claude (default)`},...n.map(e=>({id:e,label:e}))].map(n=>(0,E.jsx)(`button`,{type:`button`,onClick:()=>t(n.id),className:`text-[10px] px-2.5 min-h-[36px] rounded-md border transition-colors cursor-pointer ${e===n.id?`border-primary bg-primary/15`:`border-border bg-muted/40 hover:bg-muted`}`,children:n.label},n.id||`default`))}),e&&(0,E.jsxs)(`p`,{className:`text-[10px] text-muted-foreground`,children:[`Runs the `,e,` agent per request (read-only sandbox, one turn). Slower than the default path.`]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`Anthropic Endpoint`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5 items-center`,children:[(0,E.jsx)(`code`,{className:`text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded flex-1 truncate`,children:P}),(0,E.jsx)(c,{variant:`ghost`,size:`sm`,className:`h-6 px-1.5 cursor-pointer shrink-0`,onClick:()=>O(P,`anthropic`),children:C===`anthropic`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`OpenAI-Compatible Endpoint`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5 items-center`,children:[(0,E.jsx)(`code`,{className:`text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded flex-1 truncate`,children:F}),(0,E.jsx)(c,{variant:`ghost`,size:`sm`,className:`h-6 px-1.5 cursor-pointer shrink-0`,onClick:()=>O(F,`openai`),children:C===`openai`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})})]})]}),N.imagesGenerations&&N.imagesEdits&&(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`Image Endpoints`}),(0,E.jsx)(`code`,{className:`block text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded truncate`,children:N.imagesGenerations}),(0,E.jsx)(`code`,{className:`block text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded truncate`,children:N.imagesEdits})]}),!j&&(0,E.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Start a Cloudflare tunnel (Share) to get a public URL.`}),(0,E.jsxs)(`div`,{className:`space-y-1 pt-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`Anthropic Format`}),(0,E.jsxs)(`div`,{className:`relative`,children:[(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-muted p-2 rounded overflow-x-auto whitespace-pre`,children:I}),(0,E.jsx)(c,{variant:`ghost`,size:`sm`,className:`absolute top-1 right-1 h-5 px-1 cursor-pointer`,onClick:()=>O(I,`anthropic-env`),children:C===`anthropic-env`?`Copied!`:(0,E.jsx)(o,{className:`size-2.5`})})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`OpenAI Format`}),(0,E.jsxs)(`div`,{className:`relative`,children:[(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-muted p-2 rounded overflow-x-auto whitespace-pre`,children:L}),(0,E.jsx)(c,{variant:`ghost`,size:`sm`,className:`absolute top-1 right-1 h-5 px-1 cursor-pointer`,onClick:()=>O(L,`openai-env`),children:C===`openai-env`?`Copied!`:(0,E.jsx)(o,{className:`size-2.5`})})]})]}),(0,E.jsx)(`div`,{className:`flex items-center gap-3 pt-1`,children:(0,E.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[`Requests served: `,(0,E.jsx)(`span`,{className:`font-mono`,children:a.requestCount})]})})]}),d&&(0,E.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Saving...`}),p&&(0,E.jsx)(`p`,{className:`text-[11px] text-error`,children:p})]})}export{j as ProxySettingsSection};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t,S as n}from"./vendor-markdown-CuWCHIVb.js";import{Br as r,G as i,Sr as a,W as o}from"./icons-DQjqk0lJ.js";import{n as s}from"./api-client-C1ZwRL4Y.js";import{t as c,y as l}from"./settings-store-krC6bc79.js";import{n as u}from"./utils-Bmf_8h7Y.js";import{t as d}from"./ws-auth-CEYVQ8NH.js";import{T as f}from"./index-DU68xk06.js";import{r as p}from"./run-in-terminal-CdefEe_R.js";function m(e,t,n=`8081`){let r=d(`/ws/remote-desktop`),i=e.protocol===`https:`?`wss:`:`ws:`;return t&&e.protocol!==`https:`?`ws://${e.hostname}:${n}${r}`:`${i}//${e.host}${r}`}var h=30;function g(e,t=h){return Math.round(e*1e6/t)}var _=e(t(),1);function v(e,t){return t||e}function y(e){let[t,n]=(0,_.useState)(`idle`),[r,i]=(0,_.useState)(null),[a,o]=(0,_.useState)({width:0,height:0}),s=(0,_.useRef)(null),c=(0,_.useRef)(null),l=(0,_.useRef)(!1),u=(0,_.useRef)(0),d=(0,_.useRef)(0),f=(0,_.useRef)(null),p=(0,_.useRef)(!1),m=(0,_.useCallback)(e=>{n(`error`),i(e)},[]),h=(0,_.useCallback)(async t=>{if(f.current=t,typeof VideoDecoder>`u`){n(`unsupported`),i(`This browser has no WebCodecs VideoDecoder — try Chrome, Edge, or Safari 16.4+.`);return}let r={codec:t,optimizeForLatency:!0};try{if(!(await VideoDecoder.isConfigSupported(r)).supported){n(`unsupported`),i(`This browser's decoder does not support ${t}.`);return}}catch(e){m(e.message);return}s.current?.close(),l.current=!1,d.current=0;let a=new VideoDecoder({output:t=>{u.current+=1;let n=e.current;n&&((n.width!==t.displayWidth||n.height!==t.displayHeight)&&(n.width=t.displayWidth,n.height=t.displayHeight,o({width:t.displayWidth,height:t.displayHeight})),c.current||=n.getContext(`2d`),c.current?.drawImage(t,0,0,n.width,n.height)),t.close()},error:e=>y(e.message)});try{a.configure(r)}catch(e){m(e.message);return}s.current=a,p.current=!0,n(`ready`),i(null)},[e,m]),y=(0,_.useCallback)(e=>{if(!p.current)return;let t=f.current;if(!t){m(e);return}try{s.current?.close()}catch{}s.current=null,h(t)},[h,m]);return{status:t,errorMessage:r,configure:h,decodeAccessUnit:(0,_.useCallback)((e,t)=>{let n=s.current;if(!(!n||n.state!==`configured`)&&v(l.current,t)){t&&(l.current=!0);try{n.decode(new EncodedVideoChunk({type:t?`key`:`delta`,timestamp:g(d.current++),data:e}))}catch(e){y(e.message)}}},[y]),reset:(0,_.useCallback)(()=>{p.current=!1;try{s.current?.close()}catch{}s.current=null,l.current=!1,u.current=0,d.current=0,n(`idle`),i(null)},[]),getFrameCount:(0,_.useCallback)(()=>u.current,[]),frameSize:a}}function b(e){return e.code===`KeyV`&&(e.ctrlKey||e.metaKey)}function x(e){return(e.code===`KeyC`||e.code===`KeyX`)&&(e.ctrlKey||e.metaKey)}function S(e){let t=document.createElement(`textarea`);t.value=e,t.style.cssText=`position:fixed;top:0;left:-9999px;opacity:0`,t.setAttribute(`aria-hidden`,`true`),document.body.appendChild(t);let n=document.activeElement,r=!1;try{t.focus({preventScroll:!0}),t.setSelectionRange(0,e.length),t.select(),r=document.execCommand(`copy`)}catch{r=!1}t.remove();try{n?.focus({preventScroll:!0})}catch{}return r}async function C(e){try{return navigator.clipboard?.writeText?(await navigator.clipboard.writeText(e),!0):!1}catch{return!1}}var w=120,T=400;function ee(){let e=(0,_.useRef)(null),t=(0,_.useRef)(null),n=(0,_.useRef)(null),r=(0,_.useRef)(0),i=(0,_.useRef)(0),[a,o]=(0,_.useState)(`idle`),s=(0,_.useCallback)(()=>{try{t.current?.close()}catch{}t.current=null,n.current=null;let a=e.current;e.current=null,a&&a.close().catch(()=>{}),r.current=0,i.current=0,o(e=>e===`unsupported`?e:`idle`)},[]),c=(0,_.useCallback)(t=>{let i=e.current;if(!i){t.close();return}let a=t.numberOfFrames,o=t.numberOfChannels,s=i.createBuffer(o,a,t.sampleRate);for(let e=0;e<o;e++){let n=new Float32Array(a);t.copyTo(n,{planeIndex:e,format:`f32-planar`}),s.copyToChannel(n,e)}t.close();let c=i.currentTime,l=(r.current-c)*1e3;(l<0||l>T)&&(r.current=c+w/1e3);let u=i.createBufferSource();u.buffer=s,u.connect(i.destination),n.current&&u.connect(n.current),u.start(r.current),r.current+=s.duration},[]),l=(0,_.useCallback)(async(a,l)=>{if(typeof AudioDecoder>`u`||typeof AudioContext>`u`){o(`unsupported`);return}s();let u=new AudioContext({sampleRate:l,latencyHint:`interactive`});e.current=u,u.state===`suspended`&&await u.resume().catch(()=>{}),n.current=u.createMediaStreamDestination();let d=new AudioDecoder({output:c,error:()=>{try{t.current?.reset()}catch{}}});try{d.configure({codec:`opus`,sampleRate:l,numberOfChannels:a})}catch{o(`unsupported`);return}t.current=d,r.current=0,i.current=0,o(`playing`)},[c,s]),u=(0,_.useCallback)(e=>{let n=t.current;if(!n||n.state!==`configured`)return;let r=i.current;i.current+=2e4;try{n.decode(new EncodedAudioChunk({type:`key`,timestamp:r,data:e}))}catch{}},[]),d=(0,_.useCallback)(()=>n.current?n.current.stream.getAudioTracks():[],[]);return(0,_.useEffect)(()=>()=>s(),[s]),{status:a,configure:l,decodePacket:u,reset:s,getTracks:d}}var E=5e3,D=2;function O(e,{displayId:t}={}){let n=(0,_.useRef)(null),r=(0,_.useRef)(0),[i,a]=(0,_.useState)(`connecting`),[o,u]=(0,_.useState)(null),[d,f]=(0,_.useState)(0),[p,h]=(0,_.useState)(()=>({preset:l(c.getState().remoteDesktopQuality)??`balanced`,held:1})),g=(0,_.useRef)(l(c.getState().remoteDesktopQuality)),[v,b]=(0,_.useState)(null),x=(0,_.useRef)(null),S=c(e=>e.remoteDesktopShowCursor),w=c(e=>e.remoteDesktopClipboardSync),T=(0,_.useRef)(S),O=(0,_.useRef)(w);(0,_.useEffect)(()=>{T.current=S},[S]),(0,_.useEffect)(()=>{O.current=w},[w]);let k=(0,_.useRef)(c.getState().remoteDesktopCodec),[A,j]=(0,_.useState)(k.current),M=y(e),N=ee(),[P,F]=(0,_.useState)(!1),[I,L]=(0,_.useState)(!1),[R,z]=(0,_.useState)(null),[B,V]=(0,_.useState)(null),[H,U]=(0,_.useState)(null),[W,G]=(0,_.useState)(null),K=(0,_.useCallback)(e=>{let t=n.current;t?.readyState===WebSocket.OPEN&&t.send(JSON.stringify(e))},[]),q=(0,_.useCallback)(e=>{let t=l(e.preset);t&&h({preset:t,held:typeof e.held==`number`&&e.held>0&&e.held<1?e.held:1})},[]),J=(0,_.useCallback)(e=>{if(e!==`custom`)return{type:`quality`,preset:e};let t=c.getState();return{type:`quality`,preset:`custom`,percent:t.remoteDesktopCustomQualityPercent,fps:t.remoteDesktopCustomFps}},[]),Y=(0,_.useCallback)(e=>{g.current=e,c.getState().setRemoteDesktopQuality(e),K(J(e))},[J,K]),X=(0,_.useCallback)((e,t)=>{let n=c.getState();n.setRemoteDesktopCustomQuality(e,t),n.setRemoteDesktopQuality(`custom`),g.current=`custom`,K(J(`custom`))},[J,K]),Z=(0,_.useCallback)(e=>{z(null),K({type:`privacy`,enabled:e})},[K]),Q=(0,_.useCallback)(e=>{F(e),e||N.reset(),K({type:`audio`,enabled:e})},[N,K]),$=(0,_.useCallback)(e=>{k.current=e,c.getState().setRemoteDesktopCodec(e),j(e),e&&K({type:`codec`,encoder:e})},[K]),te=(0,_.useCallback)(e=>{G(null),K({type:`resolution`,modeId:e})},[K]),ne=(0,_.useCallback)(e=>{T.current=e,c.getState().setRemoteDesktopShowCursor(e),K({type:`cursor`,show:e})},[K]),re=(0,_.useCallback)((e,t,n=!1)=>{K({type:`clipboard`,text:e,paste:t,shift:n})},[K]),ie=(0,_.useCallback)(()=>{x.current&&clearTimeout(x.current),x.current=setTimeout(()=>{x.current=null,K({type:`clipboardRead`})},350)},[K]),ae=(0,_.useCallback)(()=>b(null),[]);(0,_.useEffect)(()=>()=>{x.current&&clearTimeout(x.current)},[]),(0,_.useEffect)(()=>{let e=!1,i=null;a(`connecting`),u(null),L(!1),z(null),r.current=0,M.reset(),(async()=>{let o;try{o=(await s.post(`/api/remote-desktop/session`)).nonce}catch(t){e||(a(`error`),u(t.message));return}if(e)return;let c=m(window.location,!1,void 0),l=new WebSocket(c);l.binaryType=`arraybuffer`,n.current=l,l.onopen=()=>{l.send(JSON.stringify({type:`auth`,nonce:o,...t?{displayId:t}:{},cursor:T.current,...k.current?{codec:k.current}:{}})),g.current&&l.send(JSON.stringify(J(g.current))),i=setInterval(()=>K({type:`ping`}),E)},l.onmessage=t=>{if(typeof t.data==`string`){let n;try{n=JSON.parse(t.data)}catch{return}if(n.type===`config`&&typeof n.codec==`string`)q(n),j(typeof n.encoder==`string`?n.encoder:null),M.configure(n.codec).then(()=>{e||a(`streaming`)});else if(n.type===`quality`)q(n);else if(n.type===`codec`)j(typeof n.encoder==`string`?n.encoder:null);else if(n.type===`resolution`)V(typeof n.modeId==`string`?n.modeId:null),U(typeof n.original==`string`?n.original:null),G(null);else if(n.type===`resolutionError`)G(typeof n.message==`string`?n.message:`The host refused the mode.`);else if(n.type===`privacy`)L(n.enabled===!0),z(typeof n.reason==`string`?n.reason:null);else if(n.type===`audio`){let e=n.enabled===!0;if(F(e),!e){N.reset();return}let t=typeof n.channels==`number`?n.channels:2,r=typeof n.sampleRate==`number`?n.sampleRate:48e3;N.configure(t,r)}else if(n.type===`clipboard`&&typeof n.text==`string`){if(!O.current)return;let t=n.text;C(t).then(n=>{!n&&!e&&b(t)})}else n.type===`error`&&(a(`error`),u(typeof n.message==`string`?n.message:`Server error`));return}let n=new Uint8Array(t.data);if(!(n.length<1)){if(r.current+=n.length,n[0]===D){N.decodePacket(n.subarray(1));return}M.decodeAccessUnit(n.subarray(1),n[0]===1)}},l.onerror=()=>{e||(a(`error`),u(`WebSocket error`))},l.onclose=()=>{e||a(e=>e===`error`?e:`closed`)}})();let o=()=>{if(document.hidden||e)return;let t=n.current;t&&t.readyState===WebSocket.OPEN?t.send(JSON.stringify({type:`ping`})):f(e=>e+1)};return document.addEventListener(`visibilitychange`,o),()=>{e=!0,document.removeEventListener(`visibilitychange`,o),i&&clearInterval(i);try{n.current?.close()}catch{}n.current=null;try{M.reset()}catch{}try{N.reset()}catch{}}},[d,t]);let oe=(0,_.useCallback)(()=>f(e=>e+1),[]),se=(0,_.useCallback)(()=>r.current,[]);return{connState:i,errorMessage:o,decoderStatus:M.status,decoderErrorMessage:M.errorMessage,sendMessage:K,reconnect:oe,getTotalBytes:se,getFrameCount:M.getFrameCount,frameSize:M.frameSize,quality:p,setQuality:Y,setCustomQuality:X,showCursor:S,setShowCursor:ne,codec:A,setCodec:$,audioOn:P,setAudioOn:Q,getAudioTracks:N.getTracks,privacyOn:I,privacyError:R,setPrivacyOn:Z,hostModeId:B,hostOriginalModeId:H,resolutionError:W,setHostMode:te,pendingHostClipboard:v,clearHostClipboard:ae,sendClipboard:re,requestHostClipboard:ie}}function k(e){return Math.min(Math.max(e,0),1)}function A(e,t,n){let r=n.width>0?(e-n.left)/n.width:0,i=n.height>0?(t-n.top)/n.height:0;return{xFrac:k(r),yFrac:k(i)}}function j(e,t,n,r){let i=r.scale||1,a=n.left+n.width/2,o=n.top+n.height/2;return A(a+(e-a-r.panX)/i,o+(t-o-r.panY)/i,n)}function M(e,t,n){if(t<=0||n<=0||e.width<=0||e.height<=0)return e;let r=e.width/e.height,i=t/n;if(i>r){let t=e.width/i;return{left:e.left,top:e.top+(e.height-t)/2,width:e.width,height:t}}let a=e.height*i;return{left:e.left+(e.width-a)/2,top:e.top,width:a,height:e.height}}function N(e){let t=new Map;for(let n of e){if(n.width<=0||n.height<=0)continue;let e=`${n.width}x${n.height}`,r=t.get(e);(!r||P(n,r))&&t.set(e,n)}return[...t.values()].sort((e,t)=>t.width*t.height-e.width*e.height||t.refresh-e.refresh).map(e=>({id:e.id,width:e.width,height:e.height,refresh:e.refresh,current:e.current,preferred:e.preferred}))}function P(e,t){return e.current===t.current?e.preferred===t.preferred?e.refresh>t.refresh:e.preferred:e.current}function F(e,t,n){if(!t||t.width<=0||t.height<=0)return null;let r=e.filter(e=>e.width===t.width&&e.height===t.height);if(r.length===0)return null;let i=e.find(e=>e.id===n)??e.find(e=>e.current)??null;return i&&i.width===t.width&&i.height===t.height?null:r.reduce((e,t)=>P(t,e)?t:e)}function I(){if(typeof window>`u`||!window.screen)return null;let e=Math.round(window.screen.width),t=Math.round(window.screen.height);return e>0&&t>0?{width:e,height:t}:null}function L(e){let t=`${e.width} × ${e.height}`;return e.refresh>0?`${t} · ${e.refresh} Hz`:t}var R=[`video/mp4;codecs=avc1.42E01E,mp4a.40.2`,`video/mp4`,`video/webm;codecs=vp9,opus`,`video/webm;codecs=vp8,opus`,`video/webm`];function z(e=e=>typeof MediaRecorder<`u`&&MediaRecorder.isTypeSupported(e)){return typeof MediaRecorder>`u`?null:R.find(e)??null}function B(e){return e.startsWith(`video/mp4`)?`mp4`:`webm`}function V(e,t=new Date){let n=e=>String(e).padStart(2,`0`);return`ppm-remote-${`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}_${n(t.getHours())}-${n(t.getMinutes())}-${n(t.getSeconds())}`}.${e}`}function H(e,t){let n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,r.rel=`noopener`,document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(n),1e4)}async function U(e){if(!e||e.width===0||e.height===0)return!1;let t=await new Promise(t=>e.toBlob(t,`image/png`));return t?(H(t,V(`png`)),!0):!1}function W(e,t){let n=(0,_.useRef)(null),r=(0,_.useRef)([]),[i,a]=(0,_.useState)(!1),[o,s]=(0,_.useState)(0),c=(0,_.useRef)(null);c.current===null&&(c.current=z());let l=(0,_.useCallback)(()=>{n.current?.stop()},[]),u=(0,_.useCallback)(()=>{let i=e.current,o=c.current;if(!i||!o||n.current)return;let l=i.captureStream();for(let e of t?.()??[])l.addTrack(e);let u;try{u=new MediaRecorder(l,{mimeType:o})}catch{return}r.current=[],u.ondataavailable=e=>{e.data.size>0&&r.current.push(e.data)},u.onstop=()=>{let e=new Blob(r.current,{type:o});r.current=[],n.current=null,a(!1),s(0),e.size>0&&H(e,V(B(o)))},u.start(1e3),n.current=u,a(!0),s(0)},[e,t]),d=(0,_.useCallback)(()=>{n.current?l():u()},[u,l]);return(0,_.useEffect)(()=>{if(!i)return;let e=Date.now(),t=setInterval(()=>{let t=Date.now()-e;s(Math.floor(t/1e3)),t>=72e5&&l()},1e3);return()=>clearInterval(t)},[i,l]),(0,_.useEffect)(()=>()=>{n.current?.stop()},[]),{recording:i,elapsedSec:o,supported:c.current!==null,toggle:d}}var G={fps:0,kbps:0};function K(e,t){let n=t.atMs-e.atMs;if(n<=0)return G;let r=n/1e3,i=Math.max(0,t.frameCount-e.frameCount),a=Math.max(0,t.totalBytes-e.totalBytes);return{fps:i/r,kbps:a/1024/r}}var q=n(),J=500;function Y({canvasRef:e,getFrameCount:t,getTotalBytes:n,positionClassName:r=`left-1 top-1`}){let i=c(e=>e.remoteDesktopStatsVisible),[a,o]=(0,_.useState)({fps:0,kbps:0,width:0,height:0}),s=(0,_.useRef)({frameCount:0,totalBytes:0,atMs:0});return(0,_.useEffect)(()=>{if(!i)return;s.current={frameCount:t(),totalBytes:n(),atMs:performance.now()};let r=setInterval(()=>{let r={frameCount:t(),totalBytes:n(),atMs:performance.now()},{fps:i,kbps:a}=K(s.current,r);s.current=r;let c=e.current;o({fps:i,kbps:a,width:c?.width??0,height:c?.height??0})},J);return()=>clearInterval(r)},[i,e,t,n]),i?(0,q.jsxs)(`div`,{className:`pointer-events-none absolute z-40 rounded bg-black/60 px-1.5 py-0.5 font-mono text-[10px] text-white/80 ${r}`,"data-testid":`remote-desktop-stats-overlay`,children:[Math.round(a.fps),` fps · `,Math.round(a.kbps),` KB/s · `,a.width,`×`,a.height]}):null}function X(){let{caps:e}=f(!1),t=e?.displays??[],[n,r]=(0,_.useState)(void 0),i=t.find(e=>e.id===n)??t.find(e=>e.primary)??t[0];return{displays:t,displayId:n,current:i,select:r,next:(0,_.useCallback)(()=>{t.length<2||r(t[(t.findIndex(e=>e.id===i?.id)+1)%t.length]?.id)},[t,i])}}function Z({pendingText:e,onDismiss:t,missingToolAction:n,onDismissMissingTool:r,positionClassName:s=`absolute bottom-2 left-1/2 max-w-[92%] -translate-x-1/2`}){let[c,l]=(0,_.useState)(!1);return e===null?n==null?null:(0,q.jsxs)(Q,{onDismiss:r??(()=>{}),testId:`remote-desktop-clipboard-missing-tool`,positionClassName:s,children:[(0,q.jsx)(o,{className:`size-4 shrink-0 text-amber-300`}),(0,q.jsx)(`span`,{className:`min-w-0 flex-1`,children:`The host has no clipboard tool installed.`}),n.kind===`terminal`&&(0,q.jsxs)(`button`,{type:`button`,onClick:()=>p(n.command),title:n.command,className:`inline-flex min-h-8 shrink-0 items-center gap-1.5 rounded bg-white/15 px-2.5 text-xs hover:bg-white/25`,children:[(0,q.jsx)(a,{className:`size-3.5`}),` `,n.label]})]}):(0,q.jsxs)(Q,{onDismiss:t,testId:`remote-desktop-clipboard-pending`,positionClassName:s,children:[(0,q.jsx)(i,{className:`size-4 shrink-0 text-emerald-400`}),(0,q.jsxs)(`span`,{className:`min-w-0 flex-1 truncate`,children:[c?`Could not copy — select the text manually:`:`Copied on the host:`,(0,q.jsx)(`span`,{className:`ml-1 text-white/60`,children:$(e)})]}),(0,q.jsx)(`button`,{type:`button`,onClick:()=>{S(e)?t():l(!0)},className:`min-h-8 shrink-0 rounded bg-white/15 px-2.5 text-xs hover:bg-white/25`,"data-testid":`remote-desktop-clipboard-copy`,children:`Copy here`})]})}function Q({children:e,onDismiss:t,testId:n,positionClassName:i}){return(0,q.jsxs)(`div`,{className:u(`z-50 flex items-center gap-2 rounded-lg border border-white/10 bg-black/85 px-3 py-2 text-xs text-white shadow-lg`,i),"data-testid":n,children:[e,(0,q.jsx)(`button`,{type:`button`,onClick:t,"aria-label":`Dismiss`,className:`flex size-8 shrink-0 items-center justify-center rounded text-white/60 hover:bg-white/10 hover:text-white`,children:(0,q.jsx)(r,{className:`size-3.5`})})]})}function $(e){let t=e.replace(/\s+/g,` `).trim();return t.length>60?`${t.slice(0,60)}…`:t}export{U as a,N as c,j as d,M as f,b as h,W as i,L as l,x as m,X as n,F as o,O as p,Y as r,I as s,Z as t,A as u};
1
+ import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t,S as n}from"./vendor-markdown-CuWCHIVb.js";import{Br as r,G as i,Sr as a,W as o}from"./icons-DQjqk0lJ.js";import{n as s}from"./api-client-C1ZwRL4Y.js";import{t as c,y as l}from"./settings-store-krC6bc79.js";import{n as u}from"./utils-Bmf_8h7Y.js";import{t as d}from"./ws-auth-CEYVQ8NH.js";import{T as f}from"./index-CEZVxM4G.js";import{r as p}from"./run-in-terminal-CdefEe_R.js";function m(e,t,n=`8081`){let r=d(`/ws/remote-desktop`),i=e.protocol===`https:`?`wss:`:`ws:`;return t&&e.protocol!==`https:`?`ws://${e.hostname}:${n}${r}`:`${i}//${e.host}${r}`}var h=30;function g(e,t=h){return Math.round(e*1e6/t)}var _=e(t(),1);function v(e,t){return t||e}function y(e){let[t,n]=(0,_.useState)(`idle`),[r,i]=(0,_.useState)(null),[a,o]=(0,_.useState)({width:0,height:0}),s=(0,_.useRef)(null),c=(0,_.useRef)(null),l=(0,_.useRef)(!1),u=(0,_.useRef)(0),d=(0,_.useRef)(0),f=(0,_.useRef)(null),p=(0,_.useRef)(!1),m=(0,_.useCallback)(e=>{n(`error`),i(e)},[]),h=(0,_.useCallback)(async t=>{if(f.current=t,typeof VideoDecoder>`u`){n(`unsupported`),i(`This browser has no WebCodecs VideoDecoder — try Chrome, Edge, or Safari 16.4+.`);return}let r={codec:t,optimizeForLatency:!0};try{if(!(await VideoDecoder.isConfigSupported(r)).supported){n(`unsupported`),i(`This browser's decoder does not support ${t}.`);return}}catch(e){m(e.message);return}s.current?.close(),l.current=!1,d.current=0;let a=new VideoDecoder({output:t=>{u.current+=1;let n=e.current;n&&((n.width!==t.displayWidth||n.height!==t.displayHeight)&&(n.width=t.displayWidth,n.height=t.displayHeight,o({width:t.displayWidth,height:t.displayHeight})),c.current||=n.getContext(`2d`),c.current?.drawImage(t,0,0,n.width,n.height)),t.close()},error:e=>y(e.message)});try{a.configure(r)}catch(e){m(e.message);return}s.current=a,p.current=!0,n(`ready`),i(null)},[e,m]),y=(0,_.useCallback)(e=>{if(!p.current)return;let t=f.current;if(!t){m(e);return}try{s.current?.close()}catch{}s.current=null,h(t)},[h,m]);return{status:t,errorMessage:r,configure:h,decodeAccessUnit:(0,_.useCallback)((e,t)=>{let n=s.current;if(!(!n||n.state!==`configured`)&&v(l.current,t)){t&&(l.current=!0);try{n.decode(new EncodedVideoChunk({type:t?`key`:`delta`,timestamp:g(d.current++),data:e}))}catch(e){y(e.message)}}},[y]),reset:(0,_.useCallback)(()=>{p.current=!1;try{s.current?.close()}catch{}s.current=null,l.current=!1,u.current=0,d.current=0,n(`idle`),i(null)},[]),getFrameCount:(0,_.useCallback)(()=>u.current,[]),frameSize:a}}function b(e){return e.code===`KeyV`&&(e.ctrlKey||e.metaKey)}function x(e){return(e.code===`KeyC`||e.code===`KeyX`)&&(e.ctrlKey||e.metaKey)}function S(e){let t=document.createElement(`textarea`);t.value=e,t.style.cssText=`position:fixed;top:0;left:-9999px;opacity:0`,t.setAttribute(`aria-hidden`,`true`),document.body.appendChild(t);let n=document.activeElement,r=!1;try{t.focus({preventScroll:!0}),t.setSelectionRange(0,e.length),t.select(),r=document.execCommand(`copy`)}catch{r=!1}t.remove();try{n?.focus({preventScroll:!0})}catch{}return r}async function C(e){try{return navigator.clipboard?.writeText?(await navigator.clipboard.writeText(e),!0):!1}catch{return!1}}var w=120,T=400;function ee(){let e=(0,_.useRef)(null),t=(0,_.useRef)(null),n=(0,_.useRef)(null),r=(0,_.useRef)(0),i=(0,_.useRef)(0),[a,o]=(0,_.useState)(`idle`),s=(0,_.useCallback)(()=>{try{t.current?.close()}catch{}t.current=null,n.current=null;let a=e.current;e.current=null,a&&a.close().catch(()=>{}),r.current=0,i.current=0,o(e=>e===`unsupported`?e:`idle`)},[]),c=(0,_.useCallback)(t=>{let i=e.current;if(!i){t.close();return}let a=t.numberOfFrames,o=t.numberOfChannels,s=i.createBuffer(o,a,t.sampleRate);for(let e=0;e<o;e++){let n=new Float32Array(a);t.copyTo(n,{planeIndex:e,format:`f32-planar`}),s.copyToChannel(n,e)}t.close();let c=i.currentTime,l=(r.current-c)*1e3;(l<0||l>T)&&(r.current=c+w/1e3);let u=i.createBufferSource();u.buffer=s,u.connect(i.destination),n.current&&u.connect(n.current),u.start(r.current),r.current+=s.duration},[]),l=(0,_.useCallback)(async(a,l)=>{if(typeof AudioDecoder>`u`||typeof AudioContext>`u`){o(`unsupported`);return}s();let u=new AudioContext({sampleRate:l,latencyHint:`interactive`});e.current=u,u.state===`suspended`&&await u.resume().catch(()=>{}),n.current=u.createMediaStreamDestination();let d=new AudioDecoder({output:c,error:()=>{try{t.current?.reset()}catch{}}});try{d.configure({codec:`opus`,sampleRate:l,numberOfChannels:a})}catch{o(`unsupported`);return}t.current=d,r.current=0,i.current=0,o(`playing`)},[c,s]),u=(0,_.useCallback)(e=>{let n=t.current;if(!n||n.state!==`configured`)return;let r=i.current;i.current+=2e4;try{n.decode(new EncodedAudioChunk({type:`key`,timestamp:r,data:e}))}catch{}},[]),d=(0,_.useCallback)(()=>n.current?n.current.stream.getAudioTracks():[],[]);return(0,_.useEffect)(()=>()=>s(),[s]),{status:a,configure:l,decodePacket:u,reset:s,getTracks:d}}var E=5e3,D=2;function O(e,{displayId:t}={}){let n=(0,_.useRef)(null),r=(0,_.useRef)(0),[i,a]=(0,_.useState)(`connecting`),[o,u]=(0,_.useState)(null),[d,f]=(0,_.useState)(0),[p,h]=(0,_.useState)(()=>({preset:l(c.getState().remoteDesktopQuality)??`balanced`,held:1})),g=(0,_.useRef)(l(c.getState().remoteDesktopQuality)),[v,b]=(0,_.useState)(null),x=(0,_.useRef)(null),S=c(e=>e.remoteDesktopShowCursor),w=c(e=>e.remoteDesktopClipboardSync),T=(0,_.useRef)(S),O=(0,_.useRef)(w);(0,_.useEffect)(()=>{T.current=S},[S]),(0,_.useEffect)(()=>{O.current=w},[w]);let k=(0,_.useRef)(c.getState().remoteDesktopCodec),[A,j]=(0,_.useState)(k.current),M=y(e),N=ee(),[P,F]=(0,_.useState)(!1),[I,L]=(0,_.useState)(!1),[R,z]=(0,_.useState)(null),[B,V]=(0,_.useState)(null),[H,U]=(0,_.useState)(null),[W,G]=(0,_.useState)(null),K=(0,_.useCallback)(e=>{let t=n.current;t?.readyState===WebSocket.OPEN&&t.send(JSON.stringify(e))},[]),q=(0,_.useCallback)(e=>{let t=l(e.preset);t&&h({preset:t,held:typeof e.held==`number`&&e.held>0&&e.held<1?e.held:1})},[]),J=(0,_.useCallback)(e=>{if(e!==`custom`)return{type:`quality`,preset:e};let t=c.getState();return{type:`quality`,preset:`custom`,percent:t.remoteDesktopCustomQualityPercent,fps:t.remoteDesktopCustomFps}},[]),Y=(0,_.useCallback)(e=>{g.current=e,c.getState().setRemoteDesktopQuality(e),K(J(e))},[J,K]),X=(0,_.useCallback)((e,t)=>{let n=c.getState();n.setRemoteDesktopCustomQuality(e,t),n.setRemoteDesktopQuality(`custom`),g.current=`custom`,K(J(`custom`))},[J,K]),Z=(0,_.useCallback)(e=>{z(null),K({type:`privacy`,enabled:e})},[K]),Q=(0,_.useCallback)(e=>{F(e),e||N.reset(),K({type:`audio`,enabled:e})},[N,K]),$=(0,_.useCallback)(e=>{k.current=e,c.getState().setRemoteDesktopCodec(e),j(e),e&&K({type:`codec`,encoder:e})},[K]),te=(0,_.useCallback)(e=>{G(null),K({type:`resolution`,modeId:e})},[K]),ne=(0,_.useCallback)(e=>{T.current=e,c.getState().setRemoteDesktopShowCursor(e),K({type:`cursor`,show:e})},[K]),re=(0,_.useCallback)((e,t,n=!1)=>{K({type:`clipboard`,text:e,paste:t,shift:n})},[K]),ie=(0,_.useCallback)(()=>{x.current&&clearTimeout(x.current),x.current=setTimeout(()=>{x.current=null,K({type:`clipboardRead`})},350)},[K]),ae=(0,_.useCallback)(()=>b(null),[]);(0,_.useEffect)(()=>()=>{x.current&&clearTimeout(x.current)},[]),(0,_.useEffect)(()=>{let e=!1,i=null;a(`connecting`),u(null),L(!1),z(null),r.current=0,M.reset(),(async()=>{let o;try{o=(await s.post(`/api/remote-desktop/session`)).nonce}catch(t){e||(a(`error`),u(t.message));return}if(e)return;let c=m(window.location,!1,void 0),l=new WebSocket(c);l.binaryType=`arraybuffer`,n.current=l,l.onopen=()=>{l.send(JSON.stringify({type:`auth`,nonce:o,...t?{displayId:t}:{},cursor:T.current,...k.current?{codec:k.current}:{}})),g.current&&l.send(JSON.stringify(J(g.current))),i=setInterval(()=>K({type:`ping`}),E)},l.onmessage=t=>{if(typeof t.data==`string`){let n;try{n=JSON.parse(t.data)}catch{return}if(n.type===`config`&&typeof n.codec==`string`)q(n),j(typeof n.encoder==`string`?n.encoder:null),M.configure(n.codec).then(()=>{e||a(`streaming`)});else if(n.type===`quality`)q(n);else if(n.type===`codec`)j(typeof n.encoder==`string`?n.encoder:null);else if(n.type===`resolution`)V(typeof n.modeId==`string`?n.modeId:null),U(typeof n.original==`string`?n.original:null),G(null);else if(n.type===`resolutionError`)G(typeof n.message==`string`?n.message:`The host refused the mode.`);else if(n.type===`privacy`)L(n.enabled===!0),z(typeof n.reason==`string`?n.reason:null);else if(n.type===`audio`){let e=n.enabled===!0;if(F(e),!e){N.reset();return}let t=typeof n.channels==`number`?n.channels:2,r=typeof n.sampleRate==`number`?n.sampleRate:48e3;N.configure(t,r)}else if(n.type===`clipboard`&&typeof n.text==`string`){if(!O.current)return;let t=n.text;C(t).then(n=>{!n&&!e&&b(t)})}else n.type===`error`&&(a(`error`),u(typeof n.message==`string`?n.message:`Server error`));return}let n=new Uint8Array(t.data);if(!(n.length<1)){if(r.current+=n.length,n[0]===D){N.decodePacket(n.subarray(1));return}M.decodeAccessUnit(n.subarray(1),n[0]===1)}},l.onerror=()=>{e||(a(`error`),u(`WebSocket error`))},l.onclose=()=>{e||a(e=>e===`error`?e:`closed`)}})();let o=()=>{if(document.hidden||e)return;let t=n.current;t&&t.readyState===WebSocket.OPEN?t.send(JSON.stringify({type:`ping`})):f(e=>e+1)};return document.addEventListener(`visibilitychange`,o),()=>{e=!0,document.removeEventListener(`visibilitychange`,o),i&&clearInterval(i);try{n.current?.close()}catch{}n.current=null;try{M.reset()}catch{}try{N.reset()}catch{}}},[d,t]);let oe=(0,_.useCallback)(()=>f(e=>e+1),[]),se=(0,_.useCallback)(()=>r.current,[]);return{connState:i,errorMessage:o,decoderStatus:M.status,decoderErrorMessage:M.errorMessage,sendMessage:K,reconnect:oe,getTotalBytes:se,getFrameCount:M.getFrameCount,frameSize:M.frameSize,quality:p,setQuality:Y,setCustomQuality:X,showCursor:S,setShowCursor:ne,codec:A,setCodec:$,audioOn:P,setAudioOn:Q,getAudioTracks:N.getTracks,privacyOn:I,privacyError:R,setPrivacyOn:Z,hostModeId:B,hostOriginalModeId:H,resolutionError:W,setHostMode:te,pendingHostClipboard:v,clearHostClipboard:ae,sendClipboard:re,requestHostClipboard:ie}}function k(e){return Math.min(Math.max(e,0),1)}function A(e,t,n){let r=n.width>0?(e-n.left)/n.width:0,i=n.height>0?(t-n.top)/n.height:0;return{xFrac:k(r),yFrac:k(i)}}function j(e,t,n,r){let i=r.scale||1,a=n.left+n.width/2,o=n.top+n.height/2;return A(a+(e-a-r.panX)/i,o+(t-o-r.panY)/i,n)}function M(e,t,n){if(t<=0||n<=0||e.width<=0||e.height<=0)return e;let r=e.width/e.height,i=t/n;if(i>r){let t=e.width/i;return{left:e.left,top:e.top+(e.height-t)/2,width:e.width,height:t}}let a=e.height*i;return{left:e.left+(e.width-a)/2,top:e.top,width:a,height:e.height}}function N(e){let t=new Map;for(let n of e){if(n.width<=0||n.height<=0)continue;let e=`${n.width}x${n.height}`,r=t.get(e);(!r||P(n,r))&&t.set(e,n)}return[...t.values()].sort((e,t)=>t.width*t.height-e.width*e.height||t.refresh-e.refresh).map(e=>({id:e.id,width:e.width,height:e.height,refresh:e.refresh,current:e.current,preferred:e.preferred}))}function P(e,t){return e.current===t.current?e.preferred===t.preferred?e.refresh>t.refresh:e.preferred:e.current}function F(e,t,n){if(!t||t.width<=0||t.height<=0)return null;let r=e.filter(e=>e.width===t.width&&e.height===t.height);if(r.length===0)return null;let i=e.find(e=>e.id===n)??e.find(e=>e.current)??null;return i&&i.width===t.width&&i.height===t.height?null:r.reduce((e,t)=>P(t,e)?t:e)}function I(){if(typeof window>`u`||!window.screen)return null;let e=Math.round(window.screen.width),t=Math.round(window.screen.height);return e>0&&t>0?{width:e,height:t}:null}function L(e){let t=`${e.width} × ${e.height}`;return e.refresh>0?`${t} · ${e.refresh} Hz`:t}var R=[`video/mp4;codecs=avc1.42E01E,mp4a.40.2`,`video/mp4`,`video/webm;codecs=vp9,opus`,`video/webm;codecs=vp8,opus`,`video/webm`];function z(e=e=>typeof MediaRecorder<`u`&&MediaRecorder.isTypeSupported(e)){return typeof MediaRecorder>`u`?null:R.find(e)??null}function B(e){return e.startsWith(`video/mp4`)?`mp4`:`webm`}function V(e,t=new Date){let n=e=>String(e).padStart(2,`0`);return`ppm-remote-${`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())}_${n(t.getHours())}-${n(t.getMinutes())}-${n(t.getSeconds())}`}.${e}`}function H(e,t){let n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,r.rel=`noopener`,document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(n),1e4)}async function U(e){if(!e||e.width===0||e.height===0)return!1;let t=await new Promise(t=>e.toBlob(t,`image/png`));return t?(H(t,V(`png`)),!0):!1}function W(e,t){let n=(0,_.useRef)(null),r=(0,_.useRef)([]),[i,a]=(0,_.useState)(!1),[o,s]=(0,_.useState)(0),c=(0,_.useRef)(null);c.current===null&&(c.current=z());let l=(0,_.useCallback)(()=>{n.current?.stop()},[]),u=(0,_.useCallback)(()=>{let i=e.current,o=c.current;if(!i||!o||n.current)return;let l=i.captureStream();for(let e of t?.()??[])l.addTrack(e);let u;try{u=new MediaRecorder(l,{mimeType:o})}catch{return}r.current=[],u.ondataavailable=e=>{e.data.size>0&&r.current.push(e.data)},u.onstop=()=>{let e=new Blob(r.current,{type:o});r.current=[],n.current=null,a(!1),s(0),e.size>0&&H(e,V(B(o)))},u.start(1e3),n.current=u,a(!0),s(0)},[e,t]),d=(0,_.useCallback)(()=>{n.current?l():u()},[u,l]);return(0,_.useEffect)(()=>{if(!i)return;let e=Date.now(),t=setInterval(()=>{let t=Date.now()-e;s(Math.floor(t/1e3)),t>=72e5&&l()},1e3);return()=>clearInterval(t)},[i,l]),(0,_.useEffect)(()=>()=>{n.current?.stop()},[]),{recording:i,elapsedSec:o,supported:c.current!==null,toggle:d}}var G={fps:0,kbps:0};function K(e,t){let n=t.atMs-e.atMs;if(n<=0)return G;let r=n/1e3,i=Math.max(0,t.frameCount-e.frameCount),a=Math.max(0,t.totalBytes-e.totalBytes);return{fps:i/r,kbps:a/1024/r}}var q=n(),J=500;function Y({canvasRef:e,getFrameCount:t,getTotalBytes:n,positionClassName:r=`left-1 top-1`}){let i=c(e=>e.remoteDesktopStatsVisible),[a,o]=(0,_.useState)({fps:0,kbps:0,width:0,height:0}),s=(0,_.useRef)({frameCount:0,totalBytes:0,atMs:0});return(0,_.useEffect)(()=>{if(!i)return;s.current={frameCount:t(),totalBytes:n(),atMs:performance.now()};let r=setInterval(()=>{let r={frameCount:t(),totalBytes:n(),atMs:performance.now()},{fps:i,kbps:a}=K(s.current,r);s.current=r;let c=e.current;o({fps:i,kbps:a,width:c?.width??0,height:c?.height??0})},J);return()=>clearInterval(r)},[i,e,t,n]),i?(0,q.jsxs)(`div`,{className:`pointer-events-none absolute z-40 rounded bg-black/60 px-1.5 py-0.5 font-mono text-[10px] text-white/80 ${r}`,"data-testid":`remote-desktop-stats-overlay`,children:[Math.round(a.fps),` fps · `,Math.round(a.kbps),` KB/s · `,a.width,`×`,a.height]}):null}function X(){let{caps:e}=f(!1),t=e?.displays??[],[n,r]=(0,_.useState)(void 0),i=t.find(e=>e.id===n)??t.find(e=>e.primary)??t[0];return{displays:t,displayId:n,current:i,select:r,next:(0,_.useCallback)(()=>{t.length<2||r(t[(t.findIndex(e=>e.id===i?.id)+1)%t.length]?.id)},[t,i])}}function Z({pendingText:e,onDismiss:t,missingToolAction:n,onDismissMissingTool:r,positionClassName:s=`absolute bottom-2 left-1/2 max-w-[92%] -translate-x-1/2`}){let[c,l]=(0,_.useState)(!1);return e===null?n==null?null:(0,q.jsxs)(Q,{onDismiss:r??(()=>{}),testId:`remote-desktop-clipboard-missing-tool`,positionClassName:s,children:[(0,q.jsx)(o,{className:`size-4 shrink-0 text-amber-300`}),(0,q.jsx)(`span`,{className:`min-w-0 flex-1`,children:`The host has no clipboard tool installed.`}),n.kind===`terminal`&&(0,q.jsxs)(`button`,{type:`button`,onClick:()=>p(n.command),title:n.command,className:`inline-flex min-h-8 shrink-0 items-center gap-1.5 rounded bg-white/15 px-2.5 text-xs hover:bg-white/25`,children:[(0,q.jsx)(a,{className:`size-3.5`}),` `,n.label]})]}):(0,q.jsxs)(Q,{onDismiss:t,testId:`remote-desktop-clipboard-pending`,positionClassName:s,children:[(0,q.jsx)(i,{className:`size-4 shrink-0 text-emerald-400`}),(0,q.jsxs)(`span`,{className:`min-w-0 flex-1 truncate`,children:[c?`Could not copy — select the text manually:`:`Copied on the host:`,(0,q.jsx)(`span`,{className:`ml-1 text-white/60`,children:$(e)})]}),(0,q.jsx)(`button`,{type:`button`,onClick:()=>{S(e)?t():l(!0)},className:`min-h-8 shrink-0 rounded bg-white/15 px-2.5 text-xs hover:bg-white/25`,"data-testid":`remote-desktop-clipboard-copy`,children:`Copy here`})]})}function Q({children:e,onDismiss:t,testId:n,positionClassName:i}){return(0,q.jsxs)(`div`,{className:u(`z-50 flex items-center gap-2 rounded-lg border border-white/10 bg-black/85 px-3 py-2 text-xs text-white shadow-lg`,i),"data-testid":n,children:[e,(0,q.jsx)(`button`,{type:`button`,onClick:t,"aria-label":`Dismiss`,className:`flex size-8 shrink-0 items-center justify-center rounded text-white/60 hover:bg-white/10 hover:text-white`,children:(0,q.jsx)(r,{className:`size-3.5`})})]})}function $(e){let t=e.replace(/\s+/g,` `).trim();return t.length>60?`${t.slice(0,60)}…`:t}export{U as a,N as c,j as d,M as f,b as h,W as i,L as l,x as m,X as n,F as o,O as p,Y as r,I as s,Z as t,A as u};
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/remote-desktop-mobile-view-2DqSuS2U.js","assets/rolldown-runtime-FhOqtrmT.js","assets/index-DU68xk06.js","assets/vendor-mermaid-BitiXJlL.js","assets/vendor-ui-DmZ-Mb-H.js","assets/vendor-markdown-CuWCHIVb.js","assets/button-B9CTrsEf.js","assets/utils-Bmf_8h7Y.js","assets/createLucideIcon-DoiEKeJ_.js","assets/api-client-C1ZwRL4Y.js","assets/react-Bghu0NUO.js","assets/settings-store-krC6bc79.js","assets/file-store-ojgMXgAw.js","assets/window-store-UC1jJeLM.js","assets/window-pip-registry-yD6esSju.js","assets/panel-store-CboGJAwh.js","assets/format-file-meta-C77h04cZ.js","assets/context-menu-C6pIsf83.js","assets/portal-container-context-BarKmT4S.js","assets/icons-DQjqk0lJ.js","assets/dialog-B84_DJQ8.js","assets/input-C7Q8FxeL.js","assets/mobile-bottom-sheet-C3TniEP-.js","assets/use-visual-viewport-Lp878uzs.js","assets/scroll-area-BzeiOd-B.js","assets/use-is-mobile-TkcwP1Gx.js","assets/file-icons-BXdvggK2.js","assets/project-framework-store-B70Q3dNM.js","assets/git-repo-store-88Z8v-pF.js","assets/project-store-B87hLRSk.js","assets/ws-auth-CEYVQ8NH.js","assets/streaming-store-BYukdB56.js","assets/tab-store-OJa1GPCq.js","assets/apply-theme-CbR31K6I.js","assets/resolve-theme-B_ukrg_8.js","assets/index-BH99TIE0.css","assets/remote-desktop-clipboard-notice-0WDYsyCA.js","assets/run-in-terminal-CdefEe_R.js"])))=>i.map(i=>d[i]);
2
- import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t,S as n}from"./vendor-markdown-CuWCHIVb.js";import{pt as r}from"./vendor-ui-DmZ-Mb-H.js";import"./icons-DQjqk0lJ.js";import"./api-client-C1ZwRL4Y.js";import"./settings-store-krC6bc79.js";import{q as i}from"./vendor-mermaid-BitiXJlL.js";import{n as a}from"./portal-container-context-BarKmT4S.js";import"./panel-store-CboGJAwh.js";import"./window-store-UC1jJeLM.js";import{E as o}from"./index-DU68xk06.js";import"./run-in-terminal-CdefEe_R.js";import{n as s,t as c}from"./remote-desktop-readiness-gate-Dm_qMJMH.js";var l=e(t(),1),u=e(r(),1),d=n(),f=(0,l.lazy)(()=>i(()=>import(`./remote-desktop-mobile-view-2DqSuS2U.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37])));function p(){let e=o(e=>e.isOpen),t=o(e=>e.close),n=a();return e?(0,u.createPortal)((0,d.jsx)(`div`,{className:`fixed inset-0 z-[45] bg-black`,"data-testid":`remote-desktop-mobile-sheet`,children:(0,d.jsx)(s,{onCancel:t,children:(0,d.jsx)(c,{onCancel:t,children:(0,d.jsx)(l.Suspense,{fallback:(0,d.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-text-2`,children:`Loading…`}),children:(0,d.jsx)(f,{onClose:t})})})})}),n??document.getElementById(`root`)??document.body):null}export{p as RemoteDesktopMobileSheet};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/remote-desktop-mobile-view-Dt8Akc3p.js","assets/rolldown-runtime-FhOqtrmT.js","assets/index-CEZVxM4G.js","assets/vendor-mermaid-BitiXJlL.js","assets/vendor-ui-DmZ-Mb-H.js","assets/vendor-markdown-CuWCHIVb.js","assets/button-B9CTrsEf.js","assets/utils-Bmf_8h7Y.js","assets/createLucideIcon-DoiEKeJ_.js","assets/api-client-C1ZwRL4Y.js","assets/react-Bghu0NUO.js","assets/settings-store-krC6bc79.js","assets/file-store-ojgMXgAw.js","assets/window-store-UC1jJeLM.js","assets/window-pip-registry-yD6esSju.js","assets/panel-store-CboGJAwh.js","assets/format-file-meta-C77h04cZ.js","assets/context-menu-C6pIsf83.js","assets/portal-container-context-BarKmT4S.js","assets/icons-DQjqk0lJ.js","assets/dialog-B84_DJQ8.js","assets/input-C7Q8FxeL.js","assets/mobile-bottom-sheet-C3TniEP-.js","assets/use-visual-viewport-Lp878uzs.js","assets/scroll-area-BzeiOd-B.js","assets/use-is-mobile-TkcwP1Gx.js","assets/file-icons-BXdvggK2.js","assets/project-framework-store-B70Q3dNM.js","assets/git-repo-store-88Z8v-pF.js","assets/project-store-B87hLRSk.js","assets/ws-auth-CEYVQ8NH.js","assets/streaming-store-BYukdB56.js","assets/tab-store-OJa1GPCq.js","assets/apply-theme-CbR31K6I.js","assets/resolve-theme-B_ukrg_8.js","assets/index-BH99TIE0.css","assets/remote-desktop-clipboard-notice-eXYvwgx7.js","assets/run-in-terminal-CdefEe_R.js"])))=>i.map(i=>d[i]);
2
+ import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t,S as n}from"./vendor-markdown-CuWCHIVb.js";import{pt as r}from"./vendor-ui-DmZ-Mb-H.js";import"./icons-DQjqk0lJ.js";import"./api-client-C1ZwRL4Y.js";import"./settings-store-krC6bc79.js";import{q as i}from"./vendor-mermaid-BitiXJlL.js";import{n as a}from"./portal-container-context-BarKmT4S.js";import"./panel-store-CboGJAwh.js";import"./window-store-UC1jJeLM.js";import{E as o}from"./index-CEZVxM4G.js";import"./run-in-terminal-CdefEe_R.js";import{n as s,t as c}from"./remote-desktop-readiness-gate-t83fqbID.js";var l=e(t(),1),u=e(r(),1),d=n(),f=(0,l.lazy)(()=>i(()=>import(`./remote-desktop-mobile-view-Dt8Akc3p.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37])));function p(){let e=o(e=>e.isOpen),t=o(e=>e.close),n=a();return e?(0,u.createPortal)((0,d.jsx)(`div`,{className:`fixed inset-0 z-[45] bg-black`,"data-testid":`remote-desktop-mobile-sheet`,children:(0,d.jsx)(s,{onCancel:t,children:(0,d.jsx)(c,{onCancel:t,children:(0,d.jsx)(l.Suspense,{fallback:(0,d.jsx)(`div`,{className:`flex h-full items-center justify-center text-sm text-text-2`,children:`Loading…`}),children:(0,d.jsx)(f,{onClose:t})})})})}),n??document.getElementById(`root`)??document.body):null}export{p as RemoteDesktopMobileSheet};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t,S as n}from"./vendor-markdown-CuWCHIVb.js";import"./vendor-ui-DmZ-Mb-H.js";import{An as r,Br as i,En as a,Fr as o,Lr as s,Mt as c,Rt as l,W as u,Wt as d,Zt as f,er as p,mr as m,qr as h,sr as g,ut as _,wn as v,z as ee}from"./icons-DQjqk0lJ.js";import"./api-client-C1ZwRL4Y.js";import{b as y,t as b,v as x}from"./settings-store-krC6bc79.js";import"./vendor-mermaid-BitiXJlL.js";import{n as S}from"./utils-Bmf_8h7Y.js";import"./panel-store-CboGJAwh.js";import"./window-store-UC1jJeLM.js";import{t as C}from"./use-visual-viewport-Lp878uzs.js";import"./ws-auth-CEYVQ8NH.js";import{T as te}from"./index-DU68xk06.js";import"./run-in-terminal-CdefEe_R.js";import{a as w,c as ne,d as T,f as E,i as re,n as ie,o as ae,p as D,r as O,s as oe,t as k}from"./remote-desktop-clipboard-notice-0WDYsyCA.js";var A=e(t(),1);function se(e,t,n=10,r=300){let i=Math.hypot(t.x-e.x,t.y-e.y),a=t.t-e.t;return i<=n&&a<=r}function j(e,t,n=15){return Math.abs(t-e)>n?`pinch`:`scroll`}function M(e,t){return Math.hypot(t.x-e.x,t.y-e.y)}function N(e,t){return{x:(e.x+t.x)/2,y:(e.y+t.y)/2}}function P(e,t,n){return Math.min(Math.max(e,t),n)}function F(e,t,n){return[{type:`pointer`,xFrac:e,yFrac:t,button:n,down:!0},{type:`pointer`,xFrac:e,yFrac:t,button:n,down:!1}]}function ce(e,t,n){return{start:{x:e,y:t,t:performance.now()},last:{x:e,y:t},moved:!1,rect:n}}function le(e,t,n,r,i,a){let o=Math.hypot(t-e.start.x,n-e.start.y);if(r===`touch`){if(!e.moved&&o>10){e.moved=!0;let r=T(e.start.x,e.start.y,e.rect,i);return e.last={x:t,y:n},{message:{type:`pointer`,xFrac:r.xFrac,yFrac:r.yFrac,button:`left`,down:!0}}}if(e.last={x:t,y:n},!e.moved)return{};let r=T(t,n,e.rect,i);return{message:{type:`pointer`,xFrac:r.xFrac,yFrac:r.yFrac,button:null,down:null}}}let s=(t-e.last.x)/i.scale,c=(n-e.last.y)/i.scale;return o>10&&(e.moved=!0),e.last={x:t,y:n},{cursor:{xFrac:P(a.xFrac+s/e.rect.width,0,1),yFrac:P(a.yFrac+c/e.rect.height,0,1)},sendCursorMove:!0}}function I(e,t,n,r,i,a){let o={x:t,y:n,t:performance.now()},s=se(e.start,o,10,300);if(r===`touch`){let r=T(t,n,e.rect,i);return!e.moved&&s?F(r.xFrac,r.yFrac,`left`):e.moved?[{type:`pointer`,xFrac:r.xFrac,yFrac:r.yFrac,button:`left`,down:!1}]:[]}return!e.moved&&s?F(a.xFrac,a.yFrac,`left`):[]}function L(e,t,n){let r=N(e,t);return{startDistance:M(e,t),startMid:r,lastMid:r,startScale:n,startTime:performance.now(),gesture:null}}function ue(e,t,n,r){let i=M(t,n),a=N(t,n);if(e.gesture===null){let t=Math.abs(i-e.startDistance),n=M(e.startMid,a);if(t>15)e.gesture=j(e.startDistance,i,15);else if(n>15)e.gesture=`scroll`;else return e.lastMid=a,{}}let o;if(e.gesture===`pinch`)o={transform:{scale:P(e.startScale*(i/e.startDistance),1,4),panX:r.panX,panY:r.panY}};else if(r.scale>1.01){let t=a.x-e.lastMid.x,n=a.y-e.lastMid.y;o={transform:{scale:r.scale,panX:r.panX+t,panY:r.panY+n}}}else o={wheelDeltaPx:a.y-e.lastMid.y};return e.lastMid=a,o}function R(e,t,n){if(e.gesture===null&&performance.now()-e.startTime<=300){let r=T(e.lastMid.x,e.lastMid.y,t,n);return F(r.xFrac,r.yFrac,`right`)}return[]}var z={scale:1,panX:0,panY:0},de=40,B=120;function fe({containerRef:e,canvasRef:t,mode:n,sendMessage:r,enabled:i}){let[a,o]=(0,A.useState)(z),[s,c]=(0,A.useState)({xFrac:.5,yFrac:.5}),l=(0,A.useRef)(a),u=(0,A.useRef)(s),d=(0,A.useRef)(n);d.current=n;let f=(0,A.useRef)({transform:null,cursor:null,sendCursorMove:!1,wheelPx:0}),p=(0,A.useRef)(0),m=(0,A.useCallback)(()=>{p.current=0;let e=f.current;e.transform&&=(l.current=e.transform,o(e.transform),null),e.cursor&&(u.current=e.cursor,c(e.cursor),e.sendCursorMove&&r({type:`pointer`,xFrac:e.cursor.xFrac,yFrac:e.cursor.yFrac,button:null,down:null}),e.cursor=null,e.sendCursorMove=!1),e.wheelPx!==0&&(r({type:`wheel`,dy:-(e.wheelPx/de)*B}),e.wheelPx=0)},[r]),h=(0,A.useCallback)(()=>{p.current||=requestAnimationFrame(m)},[m]),g=(0,A.useCallback)(()=>{l.current=z,o(z)},[]);return(0,A.useEffect)(()=>{let n=e.current;if(!n||!i)return;let a=null,o=null,s=e=>e.forEach(r),c=()=>{let e=n.getBoundingClientRect(),r=t.current;return!r||!r.width||!r.height?e:E(e,r.width,r.height)},m=e=>{e.preventDefault(),e.stopPropagation();let t=c();if(e.touches.length===1){o=null;let n=e.touches[0];a=ce(n.clientX,n.clientY,t)}else if(e.touches.length===2){a=null;let[t,n]=[e.touches[0],e.touches[1]];o=L({x:t.clientX,y:t.clientY},{x:n.clientX,y:n.clientY},l.current.scale)}else a=null,o=null},g=e=>{if(e.preventDefault(),e.stopPropagation(),a&&e.touches.length===1){let t=e.touches[0],n=le(a,t.clientX,t.clientY,d.current,l.current,u.current);n.message&&r(n.message),n.cursor&&(u.current=n.cursor,f.current.cursor=n.cursor,f.current.sendCursorMove=!!n.sendCursorMove,h());return}if(o&&e.touches.length===2){let[t,n]=[e.touches[0],e.touches[1]],r=ue(o,{x:t.clientX,y:t.clientY},{x:n.clientX,y:n.clientY},l.current);r.transform&&(l.current=r.transform,f.current.transform=r.transform,h()),r.wheelDeltaPx&&(f.current.wheelPx+=r.wheelDeltaPx,h())}},_=e=>{e.preventDefault(),e.stopPropagation();let t=e.changedTouches[0];if(a){let e=t?t.clientX:a.last.x,n=t?t.clientY:a.last.y;s(I(a,e,n,d.current,l.current,u.current)),a=null}o&&=(s(R(o,c(),l.current)),null)},v=e=>{e.stopPropagation(),a?.moved&&d.current===`touch`&&s(I(a,a.last.x,a.last.y,`touch`,l.current,u.current)),a=null,o=null};return n.addEventListener(`touchstart`,m,{passive:!1}),n.addEventListener(`touchmove`,g,{passive:!1}),n.addEventListener(`touchend`,_,{passive:!1}),n.addEventListener(`touchcancel`,v,{passive:!1}),()=>{p.current&&cancelAnimationFrame(p.current),n.removeEventListener(`touchstart`,m),n.removeEventListener(`touchmove`,g),n.removeEventListener(`touchend`,_),n.removeEventListener(`touchcancel`,v)}},[e,t,i,r,h]),{transform:a,virtualCursor:n===`mouse`?s:null,resetZoom:g}}function V(e,t,n){let r=e=>{n({type:`key`,code:e,down:!0}),n({type:`key`,code:e,down:!1})};switch(e){case`insertText`:return t&&n({type:`text`,text:t}),!0;case`insertLineBreak`:case`insertParagraph`:return r(`Enter`),!0;case`deleteContentBackward`:return r(`Backspace`),!0;case`deleteContentForward`:return r(`Delete`),!0;default:return!1}}function pe(e,t,n){let r=(0,A.useRef)(null);return(0,A.useEffect)(()=>{let i=r.current;if(!i||!t)return;let a=()=>e({type:`releaseAll`}),o=e=>e.code!==``&&e.key!==`Unidentified`,s=t=>{o(t)&&(t.preventDefault(),e({type:`key`,code:t.code,down:!0}))},c=t=>{o(t)&&(t.preventDefault(),e({type:`key`,code:t.code,down:!1}))},l=t=>{V(t.inputType,t.data,e)&&t.preventDefault()},u=t=>{t.data&&e({type:`text`,text:t.data}),i.value=``},d=e=>{let t=e.clipboardData?.getData(`text/plain`);!t||!n||(e.preventDefault(),n(t))},f=()=>a(),p=()=>{document.hidden&&a()};return i.addEventListener(`keydown`,s),i.addEventListener(`keyup`,c),i.addEventListener(`beforeinput`,l),i.addEventListener(`compositionend`,u),i.addEventListener(`paste`,d),i.addEventListener(`blur`,f),document.addEventListener(`visibilitychange`,p),()=>{i.removeEventListener(`keydown`,s),i.removeEventListener(`keyup`,c),i.removeEventListener(`beforeinput`,l),i.removeEventListener(`compositionend`,u),i.removeEventListener(`paste`,d),i.removeEventListener(`blur`,f),document.removeEventListener(`visibilitychange`,p),a()}},[t,e,n]),{inputRef:r,show:(0,A.useCallback)(()=>r.current?.focus(),[])}}var H=n();function U({onClick:e,label:t,active:n,children:r}){return(0,H.jsxs)(`button`,{type:`button`,onClick:e,"aria-label":t,className:S(`flex min-h-11 min-w-11 flex-1 flex-col items-center justify-center gap-0.5 rounded-lg py-1.5 text-[10px]`,`text-white/80 active:bg-white/10 transition-colors`,n&&`bg-white/15 text-white`),children:[r,(0,H.jsx)(`span`,{children:t})]})}function me({displayLabel:e,onNextDisplay:t,qualityLabel:n,onNextQuality:a,mode:o,onToggleMode:c,onOpenKeyboard:u,onResetZoom:d,settingsOpen:p,onToggleSettings:m,onClose:_}){return(0,H.jsxs)(`div`,{className:`flex shrink-0 items-stretch gap-1 border-t border-white/10 bg-black/90 px-2 pb-[max(0.375rem,env(safe-area-inset-bottom))] pt-1.5`,"data-testid":`remote-desktop-mobile-toolbar`,children:[(0,H.jsx)(U,{onClick:c,label:o===`mouse`?`Mouse`:`Touch`,active:!0,children:o===`mouse`?(0,H.jsx)(r,{className:`size-5`}):(0,H.jsx)(l,{className:`size-5`})}),(0,H.jsx)(U,{onClick:u,label:`Keyboard`,children:(0,H.jsx)(f,{className:`size-5`})}),(0,H.jsx)(U,{onClick:d,label:`Reset zoom`,children:(0,H.jsx)(h,{className:`size-5`})}),e!==null&&(0,H.jsx)(U,{onClick:t,label:e.length>10?`${e.slice(0,9)}…`:e,children:(0,H.jsx)(v,{className:`size-5`})}),(0,H.jsx)(U,{onClick:a,label:n,children:(0,H.jsx)(s,{className:`size-5`})}),(0,H.jsx)(U,{onClick:m,label:`More`,active:p,children:(0,H.jsx)(g,{className:`size-5`})}),(0,H.jsx)(U,{onClick:_,label:`Close`,children:(0,H.jsx)(i,{className:`size-5`})})]})}function W(e){return(e.includes(`ControlLeft`)||e.includes(`MetaLeft`))&&(e.includes(`KeyC`)||e.includes(`KeyX`))}var G=[{label:`Ctrl`,code:`ControlLeft`},{label:`Alt`,code:`AltLeft`},{label:`Shift`,code:`ShiftLeft`},{label:`Win`,code:`MetaLeft`}],K=[{label:`Esc`,code:`Escape`},{label:`Tab`,code:`Tab`},{label:`←`,code:`ArrowLeft`},{label:`↑`,code:`ArrowUp`},{label:`↓`,code:`ArrowDown`},{label:`→`,code:`ArrowRight`}],q=[{label:`Ctrl+C`,codes:[`ControlLeft`,`KeyC`]},{label:`Ctrl+V`,codes:[`ControlLeft`,`KeyV`]},{label:`Ctrl+Z`,codes:[`ControlLeft`,`KeyZ`]},{label:`Ctrl+A`,codes:[`ControlLeft`,`KeyA`]},{label:`Alt+Tab`,codes:[`AltLeft`,`Tab`]},{label:`Ctrl+Alt+Del`,codes:[`ControlLeft`,`AltLeft`,`Delete`]}];function J({onClick:e,active:t,className:n,children:r}){return(0,H.jsx)(`button`,{type:`button`,onClick:e,className:S(`min-h-11 min-w-11 shrink-0 whitespace-nowrap rounded-md px-2.5 text-xs font-medium text-white/80`,`active:bg-white/15 transition-colors`,t&&`bg-primary text-primary-foreground`,n),children:r})}function he({sendMessage:e,onCopyCombo:t}){let[n,r]=(0,A.useState)(new Set),i=(0,A.useRef)(n);i.current=n,(0,A.useEffect)(()=>()=>{i.current.forEach(t=>e({type:`key`,code:t,down:!1}))},[e]);let a=(0,A.useCallback)(t=>{r(n=>{let r=n.has(t);e({type:`key`,code:t,down:!r});let i=new Set(n);return r?i.delete(t):i.add(t),i})},[e]),o=(0,A.useCallback)(t=>{e({type:`key`,code:t,down:!0}),e({type:`key`,code:t,down:!1})},[e]),s=(0,A.useCallback)(n=>{n.forEach(t=>e({type:`key`,code:t,down:!0})),[...n].reverse().forEach(t=>e({type:`key`,code:t,down:!1})),W(n)&&t?.()},[e,t]);return(0,H.jsxs)(`div`,{className:`flex shrink-0 gap-1 overflow-x-auto border-t border-white/10 bg-black/90 px-2 py-1.5`,"data-testid":`remote-desktop-mobile-key-bar`,children:[G.map(e=>(0,H.jsx)(J,{onClick:()=>a(e.code),active:n.has(e.code),children:e.label},e.code)),(0,H.jsx)(`div`,{className:`mx-0.5 w-px shrink-0 bg-white/10`}),K.map(e=>(0,H.jsx)(J,{onClick:()=>o(e.code),children:e.label},e.code)),(0,H.jsx)(`div`,{className:`mx-0.5 w-px shrink-0 bg-white/10`}),q.map(e=>(0,H.jsx)(J,{onClick:()=>s(e.codes),children:e.label},e.label))]})}function Y({icon:e,label:t,hint:n,checked:r,onToggle:i,testId:a,disabled:o}){return(0,H.jsxs)(`button`,{type:`button`,role:`switch`,"aria-checked":r,disabled:o,onClick:i,"data-testid":a,className:`flex min-h-11 w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-white/80 active:bg-white/10 disabled:opacity-50`,children:[(0,H.jsx)(`span`,{className:`shrink-0 opacity-80`,children:e}),(0,H.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,H.jsx)(`span`,{className:`block truncate text-xs`,children:t}),n&&(0,H.jsx)(`span`,{className:`block truncate text-[10px] text-white/45`,children:n})]}),(0,H.jsx)(`span`,{className:S(`relative h-5 w-9 shrink-0 rounded-full transition-colors`,r?`bg-primary`:`bg-white/20`),children:(0,H.jsx)(`span`,{className:S(`absolute top-0.5 size-4 rounded-full bg-white transition-all`,r?`left-[1.125rem]`:`left-0.5`)})})]})}function ge({statsVisible:e,onToggleStats:t,showCursor:n,onSetShowCursor:i,clipboardEnabled:a,onSetClipboardEnabled:s,audioOn:l,audioReason:f,onSetAudioOn:p,privacyOn:h,privacyReason:g,onSetPrivacyOn:v,hostModes:y,hostModeId:b,hostOriginalModeId:x,onSetHostMode:C,canResizeHost:te,resolutionError:w,recording:T,recordingSupported:E,onToggleRecording:re,onScreenshot:ie}){let D=(0,A.useMemo)(()=>ne(y),[y]),O=(0,A.useMemo)(()=>oe(),[]),k=(0,A.useMemo)(()=>ae(y,O,b),[y,O,b]);return(0,H.jsxs)(`div`,{className:`mx-2 mb-1 space-y-0.5 rounded-xl border border-white/10 bg-black/90 p-1`,"data-testid":`remote-desktop-mobile-settings`,children:[(0,H.jsx)(Y,{icon:(0,H.jsx)(c,{className:`size-4`}),label:`Quality monitor`,checked:e,onToggle:t,testId:`remote-desktop-mobile-stats-toggle`}),(0,H.jsx)(Y,{icon:(0,H.jsx)(r,{className:`size-4`}),label:`Show remote cursor`,hint:`Restarts the stream`,checked:n,onToggle:()=>i(!n),testId:`remote-desktop-mobile-cursor-toggle`}),(0,H.jsx)(Y,{icon:(0,H.jsx)(u,{className:`size-4`}),label:`Sync clipboard`,hint:`Off: Ctrl+V pastes the host's own clipboard`,checked:a,onToggle:()=>s(!a),testId:`remote-desktop-mobile-clipboard-toggle`}),(0,H.jsx)(Y,{icon:(0,H.jsx)(o,{className:`size-4`}),label:`Play host audio`,hint:f??void 0,checked:l,disabled:f!==null,onToggle:()=>p(!l),testId:`remote-desktop-mobile-audio-toggle`}),(0,H.jsx)(Y,{icon:(0,H.jsx)(_,{className:`size-4`}),label:`Privacy mode`,hint:g??`Blocks the host's own keyboard and mouse`,checked:h,disabled:g!==null&&!h,onToggle:()=>v(!h),testId:`remote-desktop-mobile-privacy-toggle`}),te&&D.length>1&&(0,H.jsxs)(`div`,{className:`px-3 pt-1`,children:[(0,H.jsx)(`div`,{className:`pb-1.5 text-[10px] uppercase tracking-wide text-white/40`,children:`Resolution`}),(0,H.jsxs)(`div`,{className:`flex max-h-28 flex-wrap gap-1.5 overflow-y-auto`,children:[x&&x!==b&&(0,H.jsx)(`button`,{type:`button`,onClick:()=>C(x),"data-testid":`remote-desktop-mobile-resolution-original`,className:`min-h-9 rounded-md bg-white/10 px-2.5 py-1 text-[11px] text-white/70 active:bg-white/20`,children:`Original`}),k&&(0,H.jsx)(`button`,{type:`button`,onClick:()=>C(k.id),"data-testid":`remote-desktop-mobile-resolution-fit-local`,className:`min-h-9 rounded-md bg-white/10 px-2.5 py-1 text-[11px] text-white/70 active:bg-white/20`,children:`Fit local`}),D.map(e=>{let t=(b??D.find(e=>e.current)?.id)===e.id;return(0,H.jsxs)(`button`,{type:`button`,onClick:()=>C(e.id),"data-testid":`remote-desktop-mobile-resolution-${e.width}x${e.height}`,className:S(`min-h-9 rounded-md px-2.5 py-1 text-[11px] tabular-nums`,t?`bg-white/25 text-white`:`bg-white/10 text-white/70 active:bg-white/20`),children:[e.width,`×`,e.height]},e.id)})]}),w&&(0,H.jsx)(`div`,{className:`pt-1.5 text-[10px] leading-tight text-red-400`,children:w})]}),(0,H.jsxs)(`button`,{type:`button`,onClick:ie,"data-testid":`remote-desktop-mobile-screenshot`,className:`flex min-h-11 w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-xs text-white/80 active:bg-white/10`,children:[(0,H.jsx)(d,{className:`size-4 opacity-80`}),` Save screenshot`]}),E&&(0,H.jsx)(`button`,{type:`button`,onClick:re,"data-testid":`remote-desktop-mobile-record`,className:`flex min-h-11 w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-xs text-white/80 active:bg-white/10`,children:T?(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(m,{className:`size-4 text-red-500`}),` Stop recording`]}):(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(ee,{className:`size-4 opacity-80`}),` Start recording`]})})]})}function X({onClose:e}){let t=(0,A.useRef)(null),n=(0,A.useRef)(null),[r,i]=(0,A.useState)(`mouse`),[o,s]=(0,A.useState)(!1),[c,l]=(0,A.useState)(!1),u=ie(),{connState:d,errorMessage:f,decoderStatus:m,decoderErrorMessage:h,sendMessage:g,reconnect:_,getTotalBytes:v,getFrameCount:ee,quality:S,setQuality:ne,showCursor:T,setShowCursor:ae,audioOn:oe,setAudioOn:se,getAudioTracks:j,privacyOn:M,privacyError:N,setPrivacyOn:P,hostModeId:F,hostOriginalModeId:ce,resolutionError:le,setHostMode:I,pendingHostClipboard:L,clearHostClipboard:ue,sendClipboard:R,requestHostClipboard:z}=D(n,{displayId:u.displayId}),de=b(e=>e.remoteDesktopStatsVisible),B=b(e=>e.toggleRemoteDesktopStatsVisible),V=b(e=>e.remoteDesktopClipboardSync),U=b(e=>e.setRemoteDesktopClipboardSync),W=b(e=>e.remoteDesktopQuality),G=d===`streaming`,{transform:K,virtualCursor:q,resetZoom:J}=fe({containerRef:t,canvasRef:n,mode:r,sendMessage:g,enabled:G}),[Y,X]=(0,A.useState)(!1),_e=(0,A.useCallback)(e=>{X(!0),R(e,!0)},[R]),{caps:Z}=te(!1),Q=re(n,j),{inputRef:ve,show:ye}=pe(g,G,V?_e:void 0),$=C(!0)?.keyboardInset??0,be=(0,A.useCallback)(()=>i(e=>e===`mouse`?`touch`:`mouse`),[]),xe=(0,A.useCallback)(()=>{ye(),s(!0)},[ye]),Se=m===`unsupported`?h:d===`error`?f:d===`closed`?`Disconnected`:d===`connecting`?`Connecting…`:null,Ce={transform:`translate(${K.panX}px, ${K.panY}px) scale(${K.scale})`},we=`${(q?.xFrac??.5)*100}%`,Te=`${(q?.yFrac??.5)*100}%`;if(q&&t.current&&n.current?.width&&n.current.height){let e=t.current.getBoundingClientRect(),r=E({left:0,top:0,width:e.width,height:e.height},n.current.width,n.current.height);we=`${r.left+q.xFrac*r.width}px`,Te=`${r.top+q.yFrac*r.height}px`}return(0,H.jsxs)(`div`,{className:`relative h-full w-full bg-black`,"data-testid":`remote-desktop-mobile-view`,"data-conn-state":d,children:[(0,H.jsxs)(`div`,{ref:t,className:`absolute inset-x-0 top-0 flex items-center justify-center overflow-hidden`,style:{touchAction:`none`,bottom:$},"data-testid":`remote-desktop-mobile-stage-container`,children:[(0,H.jsxs)(`div`,{className:`relative flex h-full w-full items-center justify-center`,style:Ce,children:[(0,H.jsx)(`canvas`,{ref:n,"data-testid":`remote-desktop-canvas`,className:`block h-full w-full min-h-0 min-w-0 object-contain outline-none`}),r===`mouse`&&q&&G&&(0,H.jsx)(`div`,{className:`pointer-events-none absolute rounded-full border-2 border-white bg-primary shadow-[0_0_0_1px_rgba(0,0,0,0.6)]`,style:{left:we,top:Te,width:14,height:14,transform:`translate(-50%, -50%) scale(${1/K.scale})`},"data-testid":`remote-desktop-virtual-cursor`})]}),Se&&(0,H.jsxs)(`div`,{className:`absolute inset-0 flex flex-col items-center justify-center gap-3 bg-black/70 text-sm text-white`,children:[(0,H.jsx)(a,{className:`size-6 opacity-70`}),(0,H.jsx)(`span`,{className:`max-w-sm px-4 text-center`,children:Se}),(d===`error`||d===`closed`)&&m!==`unsupported`&&(0,H.jsxs)(`button`,{onClick:_,className:`flex items-center gap-1.5 rounded-md bg-white/10 px-3 py-1.5 hover:bg-white/20`,children:[(0,H.jsx)(p,{className:`size-3.5`}),` Reconnect`]})]}),(0,H.jsx)(`input`,{ref:ve,type:`text`,autoComplete:`off`,autoCapitalize:`off`,autoCorrect:`off`,spellCheck:!1,className:`absolute size-px opacity-0`,"aria-hidden":`true`,tabIndex:-1,onBlur:()=>s(!1),"data-testid":`remote-desktop-virtual-keyboard-input`})]}),(0,H.jsxs)(`div`,{className:`absolute inset-x-0 bottom-0`,style:$>0?{transform:`translateY(-${$}px)`}:void 0,"data-testid":`remote-desktop-mobile-bottom-bar`,children:[(0,H.jsx)(k,{pendingText:L,onDismiss:ue,missingToolAction:Y&&Z&&!Z.clipboard.available?Z.clipboard.action:null,onDismissMissingTool:()=>X(!1),positionClassName:`mx-2 mb-1 max-w-[calc(100%-1rem)]`}),c&&(0,H.jsx)(ge,{statsVisible:de,onToggleStats:B,showCursor:T,onSetShowCursor:ae,clipboardEnabled:V,onSetClipboardEnabled:U,audioOn:oe,audioReason:Z&&!Z.audio.available?Z.audio.reason:null,onSetAudioOn:se,privacyOn:M,privacyReason:N??(Z&&!Z.privacy.available?Z.privacy.reason:null),hostModes:Z?.resolutions?.modes??[],hostModeId:F,hostOriginalModeId:ce,onSetHostMode:I,canResizeHost:Z?.inputReady??!1,resolutionError:le,onSetPrivacyOn:P,recording:Q.recording,recordingSupported:Q.supported,onToggleRecording:Q.toggle,onScreenshot:()=>void w(n.current)}),o&&(0,H.jsx)(he,{sendMessage:g,onCopyCombo:V?z:void 0}),(0,H.jsx)(me,{displayLabel:u.displays.length>1?u.current?.label??null:null,onNextDisplay:u.next,qualityLabel:y(W),onNextQuality:()=>ne(x(W)),mode:r,onToggleMode:be,onOpenKeyboard:xe,onResetZoom:J,settingsOpen:c,onToggleSettings:()=>l(e=>!e),onClose:e})]}),(0,H.jsx)(O,{canvasRef:n,getFrameCount:ee,getTotalBytes:v,positionClassName:`left-1 top-[calc(env(safe-area-inset-top,0px)+2.75rem)]`})]})}export{X as default};
1
+ import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t,S as n}from"./vendor-markdown-CuWCHIVb.js";import"./vendor-ui-DmZ-Mb-H.js";import{An as r,Br as i,En as a,Fr as o,Lr as s,Mt as c,Rt as l,W as u,Wt as d,Zt as f,er as p,mr as m,qr as h,sr as g,ut as _,wn as v,z as ee}from"./icons-DQjqk0lJ.js";import"./api-client-C1ZwRL4Y.js";import{b as y,t as b,v as x}from"./settings-store-krC6bc79.js";import"./vendor-mermaid-BitiXJlL.js";import{n as S}from"./utils-Bmf_8h7Y.js";import"./panel-store-CboGJAwh.js";import"./window-store-UC1jJeLM.js";import{t as C}from"./use-visual-viewport-Lp878uzs.js";import"./ws-auth-CEYVQ8NH.js";import{T as te}from"./index-CEZVxM4G.js";import"./run-in-terminal-CdefEe_R.js";import{a as w,c as ne,d as T,f as E,i as re,n as ie,o as ae,p as D,r as O,s as oe,t as k}from"./remote-desktop-clipboard-notice-eXYvwgx7.js";var A=e(t(),1);function se(e,t,n=10,r=300){let i=Math.hypot(t.x-e.x,t.y-e.y),a=t.t-e.t;return i<=n&&a<=r}function j(e,t,n=15){return Math.abs(t-e)>n?`pinch`:`scroll`}function M(e,t){return Math.hypot(t.x-e.x,t.y-e.y)}function N(e,t){return{x:(e.x+t.x)/2,y:(e.y+t.y)/2}}function P(e,t,n){return Math.min(Math.max(e,t),n)}function F(e,t,n){return[{type:`pointer`,xFrac:e,yFrac:t,button:n,down:!0},{type:`pointer`,xFrac:e,yFrac:t,button:n,down:!1}]}function ce(e,t,n){return{start:{x:e,y:t,t:performance.now()},last:{x:e,y:t},moved:!1,rect:n}}function le(e,t,n,r,i,a){let o=Math.hypot(t-e.start.x,n-e.start.y);if(r===`touch`){if(!e.moved&&o>10){e.moved=!0;let r=T(e.start.x,e.start.y,e.rect,i);return e.last={x:t,y:n},{message:{type:`pointer`,xFrac:r.xFrac,yFrac:r.yFrac,button:`left`,down:!0}}}if(e.last={x:t,y:n},!e.moved)return{};let r=T(t,n,e.rect,i);return{message:{type:`pointer`,xFrac:r.xFrac,yFrac:r.yFrac,button:null,down:null}}}let s=(t-e.last.x)/i.scale,c=(n-e.last.y)/i.scale;return o>10&&(e.moved=!0),e.last={x:t,y:n},{cursor:{xFrac:P(a.xFrac+s/e.rect.width,0,1),yFrac:P(a.yFrac+c/e.rect.height,0,1)},sendCursorMove:!0}}function I(e,t,n,r,i,a){let o={x:t,y:n,t:performance.now()},s=se(e.start,o,10,300);if(r===`touch`){let r=T(t,n,e.rect,i);return!e.moved&&s?F(r.xFrac,r.yFrac,`left`):e.moved?[{type:`pointer`,xFrac:r.xFrac,yFrac:r.yFrac,button:`left`,down:!1}]:[]}return!e.moved&&s?F(a.xFrac,a.yFrac,`left`):[]}function L(e,t,n){let r=N(e,t);return{startDistance:M(e,t),startMid:r,lastMid:r,startScale:n,startTime:performance.now(),gesture:null}}function ue(e,t,n,r){let i=M(t,n),a=N(t,n);if(e.gesture===null){let t=Math.abs(i-e.startDistance),n=M(e.startMid,a);if(t>15)e.gesture=j(e.startDistance,i,15);else if(n>15)e.gesture=`scroll`;else return e.lastMid=a,{}}let o;if(e.gesture===`pinch`)o={transform:{scale:P(e.startScale*(i/e.startDistance),1,4),panX:r.panX,panY:r.panY}};else if(r.scale>1.01){let t=a.x-e.lastMid.x,n=a.y-e.lastMid.y;o={transform:{scale:r.scale,panX:r.panX+t,panY:r.panY+n}}}else o={wheelDeltaPx:a.y-e.lastMid.y};return e.lastMid=a,o}function R(e,t,n){if(e.gesture===null&&performance.now()-e.startTime<=300){let r=T(e.lastMid.x,e.lastMid.y,t,n);return F(r.xFrac,r.yFrac,`right`)}return[]}var z={scale:1,panX:0,panY:0},de=40,B=120;function fe({containerRef:e,canvasRef:t,mode:n,sendMessage:r,enabled:i}){let[a,o]=(0,A.useState)(z),[s,c]=(0,A.useState)({xFrac:.5,yFrac:.5}),l=(0,A.useRef)(a),u=(0,A.useRef)(s),d=(0,A.useRef)(n);d.current=n;let f=(0,A.useRef)({transform:null,cursor:null,sendCursorMove:!1,wheelPx:0}),p=(0,A.useRef)(0),m=(0,A.useCallback)(()=>{p.current=0;let e=f.current;e.transform&&=(l.current=e.transform,o(e.transform),null),e.cursor&&(u.current=e.cursor,c(e.cursor),e.sendCursorMove&&r({type:`pointer`,xFrac:e.cursor.xFrac,yFrac:e.cursor.yFrac,button:null,down:null}),e.cursor=null,e.sendCursorMove=!1),e.wheelPx!==0&&(r({type:`wheel`,dy:-(e.wheelPx/de)*B}),e.wheelPx=0)},[r]),h=(0,A.useCallback)(()=>{p.current||=requestAnimationFrame(m)},[m]),g=(0,A.useCallback)(()=>{l.current=z,o(z)},[]);return(0,A.useEffect)(()=>{let n=e.current;if(!n||!i)return;let a=null,o=null,s=e=>e.forEach(r),c=()=>{let e=n.getBoundingClientRect(),r=t.current;return!r||!r.width||!r.height?e:E(e,r.width,r.height)},m=e=>{e.preventDefault(),e.stopPropagation();let t=c();if(e.touches.length===1){o=null;let n=e.touches[0];a=ce(n.clientX,n.clientY,t)}else if(e.touches.length===2){a=null;let[t,n]=[e.touches[0],e.touches[1]];o=L({x:t.clientX,y:t.clientY},{x:n.clientX,y:n.clientY},l.current.scale)}else a=null,o=null},g=e=>{if(e.preventDefault(),e.stopPropagation(),a&&e.touches.length===1){let t=e.touches[0],n=le(a,t.clientX,t.clientY,d.current,l.current,u.current);n.message&&r(n.message),n.cursor&&(u.current=n.cursor,f.current.cursor=n.cursor,f.current.sendCursorMove=!!n.sendCursorMove,h());return}if(o&&e.touches.length===2){let[t,n]=[e.touches[0],e.touches[1]],r=ue(o,{x:t.clientX,y:t.clientY},{x:n.clientX,y:n.clientY},l.current);r.transform&&(l.current=r.transform,f.current.transform=r.transform,h()),r.wheelDeltaPx&&(f.current.wheelPx+=r.wheelDeltaPx,h())}},_=e=>{e.preventDefault(),e.stopPropagation();let t=e.changedTouches[0];if(a){let e=t?t.clientX:a.last.x,n=t?t.clientY:a.last.y;s(I(a,e,n,d.current,l.current,u.current)),a=null}o&&=(s(R(o,c(),l.current)),null)},v=e=>{e.stopPropagation(),a?.moved&&d.current===`touch`&&s(I(a,a.last.x,a.last.y,`touch`,l.current,u.current)),a=null,o=null};return n.addEventListener(`touchstart`,m,{passive:!1}),n.addEventListener(`touchmove`,g,{passive:!1}),n.addEventListener(`touchend`,_,{passive:!1}),n.addEventListener(`touchcancel`,v,{passive:!1}),()=>{p.current&&cancelAnimationFrame(p.current),n.removeEventListener(`touchstart`,m),n.removeEventListener(`touchmove`,g),n.removeEventListener(`touchend`,_),n.removeEventListener(`touchcancel`,v)}},[e,t,i,r,h]),{transform:a,virtualCursor:n===`mouse`?s:null,resetZoom:g}}function V(e,t,n){let r=e=>{n({type:`key`,code:e,down:!0}),n({type:`key`,code:e,down:!1})};switch(e){case`insertText`:return t&&n({type:`text`,text:t}),!0;case`insertLineBreak`:case`insertParagraph`:return r(`Enter`),!0;case`deleteContentBackward`:return r(`Backspace`),!0;case`deleteContentForward`:return r(`Delete`),!0;default:return!1}}function pe(e,t,n){let r=(0,A.useRef)(null);return(0,A.useEffect)(()=>{let i=r.current;if(!i||!t)return;let a=()=>e({type:`releaseAll`}),o=e=>e.code!==``&&e.key!==`Unidentified`,s=t=>{o(t)&&(t.preventDefault(),e({type:`key`,code:t.code,down:!0}))},c=t=>{o(t)&&(t.preventDefault(),e({type:`key`,code:t.code,down:!1}))},l=t=>{V(t.inputType,t.data,e)&&t.preventDefault()},u=t=>{t.data&&e({type:`text`,text:t.data}),i.value=``},d=e=>{let t=e.clipboardData?.getData(`text/plain`);!t||!n||(e.preventDefault(),n(t))},f=()=>a(),p=()=>{document.hidden&&a()};return i.addEventListener(`keydown`,s),i.addEventListener(`keyup`,c),i.addEventListener(`beforeinput`,l),i.addEventListener(`compositionend`,u),i.addEventListener(`paste`,d),i.addEventListener(`blur`,f),document.addEventListener(`visibilitychange`,p),()=>{i.removeEventListener(`keydown`,s),i.removeEventListener(`keyup`,c),i.removeEventListener(`beforeinput`,l),i.removeEventListener(`compositionend`,u),i.removeEventListener(`paste`,d),i.removeEventListener(`blur`,f),document.removeEventListener(`visibilitychange`,p),a()}},[t,e,n]),{inputRef:r,show:(0,A.useCallback)(()=>r.current?.focus(),[])}}var H=n();function U({onClick:e,label:t,active:n,children:r}){return(0,H.jsxs)(`button`,{type:`button`,onClick:e,"aria-label":t,className:S(`flex min-h-11 min-w-11 flex-1 flex-col items-center justify-center gap-0.5 rounded-lg py-1.5 text-[10px]`,`text-white/80 active:bg-white/10 transition-colors`,n&&`bg-white/15 text-white`),children:[r,(0,H.jsx)(`span`,{children:t})]})}function me({displayLabel:e,onNextDisplay:t,qualityLabel:n,onNextQuality:a,mode:o,onToggleMode:c,onOpenKeyboard:u,onResetZoom:d,settingsOpen:p,onToggleSettings:m,onClose:_}){return(0,H.jsxs)(`div`,{className:`flex shrink-0 items-stretch gap-1 border-t border-white/10 bg-black/90 px-2 pb-[max(0.375rem,env(safe-area-inset-bottom))] pt-1.5`,"data-testid":`remote-desktop-mobile-toolbar`,children:[(0,H.jsx)(U,{onClick:c,label:o===`mouse`?`Mouse`:`Touch`,active:!0,children:o===`mouse`?(0,H.jsx)(r,{className:`size-5`}):(0,H.jsx)(l,{className:`size-5`})}),(0,H.jsx)(U,{onClick:u,label:`Keyboard`,children:(0,H.jsx)(f,{className:`size-5`})}),(0,H.jsx)(U,{onClick:d,label:`Reset zoom`,children:(0,H.jsx)(h,{className:`size-5`})}),e!==null&&(0,H.jsx)(U,{onClick:t,label:e.length>10?`${e.slice(0,9)}…`:e,children:(0,H.jsx)(v,{className:`size-5`})}),(0,H.jsx)(U,{onClick:a,label:n,children:(0,H.jsx)(s,{className:`size-5`})}),(0,H.jsx)(U,{onClick:m,label:`More`,active:p,children:(0,H.jsx)(g,{className:`size-5`})}),(0,H.jsx)(U,{onClick:_,label:`Close`,children:(0,H.jsx)(i,{className:`size-5`})})]})}function W(e){return(e.includes(`ControlLeft`)||e.includes(`MetaLeft`))&&(e.includes(`KeyC`)||e.includes(`KeyX`))}var G=[{label:`Ctrl`,code:`ControlLeft`},{label:`Alt`,code:`AltLeft`},{label:`Shift`,code:`ShiftLeft`},{label:`Win`,code:`MetaLeft`}],K=[{label:`Esc`,code:`Escape`},{label:`Tab`,code:`Tab`},{label:`←`,code:`ArrowLeft`},{label:`↑`,code:`ArrowUp`},{label:`↓`,code:`ArrowDown`},{label:`→`,code:`ArrowRight`}],q=[{label:`Ctrl+C`,codes:[`ControlLeft`,`KeyC`]},{label:`Ctrl+V`,codes:[`ControlLeft`,`KeyV`]},{label:`Ctrl+Z`,codes:[`ControlLeft`,`KeyZ`]},{label:`Ctrl+A`,codes:[`ControlLeft`,`KeyA`]},{label:`Alt+Tab`,codes:[`AltLeft`,`Tab`]},{label:`Ctrl+Alt+Del`,codes:[`ControlLeft`,`AltLeft`,`Delete`]}];function J({onClick:e,active:t,className:n,children:r}){return(0,H.jsx)(`button`,{type:`button`,onClick:e,className:S(`min-h-11 min-w-11 shrink-0 whitespace-nowrap rounded-md px-2.5 text-xs font-medium text-white/80`,`active:bg-white/15 transition-colors`,t&&`bg-primary text-primary-foreground`,n),children:r})}function he({sendMessage:e,onCopyCombo:t}){let[n,r]=(0,A.useState)(new Set),i=(0,A.useRef)(n);i.current=n,(0,A.useEffect)(()=>()=>{i.current.forEach(t=>e({type:`key`,code:t,down:!1}))},[e]);let a=(0,A.useCallback)(t=>{r(n=>{let r=n.has(t);e({type:`key`,code:t,down:!r});let i=new Set(n);return r?i.delete(t):i.add(t),i})},[e]),o=(0,A.useCallback)(t=>{e({type:`key`,code:t,down:!0}),e({type:`key`,code:t,down:!1})},[e]),s=(0,A.useCallback)(n=>{n.forEach(t=>e({type:`key`,code:t,down:!0})),[...n].reverse().forEach(t=>e({type:`key`,code:t,down:!1})),W(n)&&t?.()},[e,t]);return(0,H.jsxs)(`div`,{className:`flex shrink-0 gap-1 overflow-x-auto border-t border-white/10 bg-black/90 px-2 py-1.5`,"data-testid":`remote-desktop-mobile-key-bar`,children:[G.map(e=>(0,H.jsx)(J,{onClick:()=>a(e.code),active:n.has(e.code),children:e.label},e.code)),(0,H.jsx)(`div`,{className:`mx-0.5 w-px shrink-0 bg-white/10`}),K.map(e=>(0,H.jsx)(J,{onClick:()=>o(e.code),children:e.label},e.code)),(0,H.jsx)(`div`,{className:`mx-0.5 w-px shrink-0 bg-white/10`}),q.map(e=>(0,H.jsx)(J,{onClick:()=>s(e.codes),children:e.label},e.label))]})}function Y({icon:e,label:t,hint:n,checked:r,onToggle:i,testId:a,disabled:o}){return(0,H.jsxs)(`button`,{type:`button`,role:`switch`,"aria-checked":r,disabled:o,onClick:i,"data-testid":a,className:`flex min-h-11 w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-white/80 active:bg-white/10 disabled:opacity-50`,children:[(0,H.jsx)(`span`,{className:`shrink-0 opacity-80`,children:e}),(0,H.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,H.jsx)(`span`,{className:`block truncate text-xs`,children:t}),n&&(0,H.jsx)(`span`,{className:`block truncate text-[10px] text-white/45`,children:n})]}),(0,H.jsx)(`span`,{className:S(`relative h-5 w-9 shrink-0 rounded-full transition-colors`,r?`bg-primary`:`bg-white/20`),children:(0,H.jsx)(`span`,{className:S(`absolute top-0.5 size-4 rounded-full bg-white transition-all`,r?`left-[1.125rem]`:`left-0.5`)})})]})}function ge({statsVisible:e,onToggleStats:t,showCursor:n,onSetShowCursor:i,clipboardEnabled:a,onSetClipboardEnabled:s,audioOn:l,audioReason:f,onSetAudioOn:p,privacyOn:h,privacyReason:g,onSetPrivacyOn:v,hostModes:y,hostModeId:b,hostOriginalModeId:x,onSetHostMode:C,canResizeHost:te,resolutionError:w,recording:T,recordingSupported:E,onToggleRecording:re,onScreenshot:ie}){let D=(0,A.useMemo)(()=>ne(y),[y]),O=(0,A.useMemo)(()=>oe(),[]),k=(0,A.useMemo)(()=>ae(y,O,b),[y,O,b]);return(0,H.jsxs)(`div`,{className:`mx-2 mb-1 space-y-0.5 rounded-xl border border-white/10 bg-black/90 p-1`,"data-testid":`remote-desktop-mobile-settings`,children:[(0,H.jsx)(Y,{icon:(0,H.jsx)(c,{className:`size-4`}),label:`Quality monitor`,checked:e,onToggle:t,testId:`remote-desktop-mobile-stats-toggle`}),(0,H.jsx)(Y,{icon:(0,H.jsx)(r,{className:`size-4`}),label:`Show remote cursor`,hint:`Restarts the stream`,checked:n,onToggle:()=>i(!n),testId:`remote-desktop-mobile-cursor-toggle`}),(0,H.jsx)(Y,{icon:(0,H.jsx)(u,{className:`size-4`}),label:`Sync clipboard`,hint:`Off: Ctrl+V pastes the host's own clipboard`,checked:a,onToggle:()=>s(!a),testId:`remote-desktop-mobile-clipboard-toggle`}),(0,H.jsx)(Y,{icon:(0,H.jsx)(o,{className:`size-4`}),label:`Play host audio`,hint:f??void 0,checked:l,disabled:f!==null,onToggle:()=>p(!l),testId:`remote-desktop-mobile-audio-toggle`}),(0,H.jsx)(Y,{icon:(0,H.jsx)(_,{className:`size-4`}),label:`Privacy mode`,hint:g??`Blocks the host's own keyboard and mouse`,checked:h,disabled:g!==null&&!h,onToggle:()=>v(!h),testId:`remote-desktop-mobile-privacy-toggle`}),te&&D.length>1&&(0,H.jsxs)(`div`,{className:`px-3 pt-1`,children:[(0,H.jsx)(`div`,{className:`pb-1.5 text-[10px] uppercase tracking-wide text-white/40`,children:`Resolution`}),(0,H.jsxs)(`div`,{className:`flex max-h-28 flex-wrap gap-1.5 overflow-y-auto`,children:[x&&x!==b&&(0,H.jsx)(`button`,{type:`button`,onClick:()=>C(x),"data-testid":`remote-desktop-mobile-resolution-original`,className:`min-h-9 rounded-md bg-white/10 px-2.5 py-1 text-[11px] text-white/70 active:bg-white/20`,children:`Original`}),k&&(0,H.jsx)(`button`,{type:`button`,onClick:()=>C(k.id),"data-testid":`remote-desktop-mobile-resolution-fit-local`,className:`min-h-9 rounded-md bg-white/10 px-2.5 py-1 text-[11px] text-white/70 active:bg-white/20`,children:`Fit local`}),D.map(e=>{let t=(b??D.find(e=>e.current)?.id)===e.id;return(0,H.jsxs)(`button`,{type:`button`,onClick:()=>C(e.id),"data-testid":`remote-desktop-mobile-resolution-${e.width}x${e.height}`,className:S(`min-h-9 rounded-md px-2.5 py-1 text-[11px] tabular-nums`,t?`bg-white/25 text-white`:`bg-white/10 text-white/70 active:bg-white/20`),children:[e.width,`×`,e.height]},e.id)})]}),w&&(0,H.jsx)(`div`,{className:`pt-1.5 text-[10px] leading-tight text-red-400`,children:w})]}),(0,H.jsxs)(`button`,{type:`button`,onClick:ie,"data-testid":`remote-desktop-mobile-screenshot`,className:`flex min-h-11 w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-xs text-white/80 active:bg-white/10`,children:[(0,H.jsx)(d,{className:`size-4 opacity-80`}),` Save screenshot`]}),E&&(0,H.jsx)(`button`,{type:`button`,onClick:re,"data-testid":`remote-desktop-mobile-record`,className:`flex min-h-11 w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-xs text-white/80 active:bg-white/10`,children:T?(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(m,{className:`size-4 text-red-500`}),` Stop recording`]}):(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(ee,{className:`size-4 opacity-80`}),` Start recording`]})})]})}function X({onClose:e}){let t=(0,A.useRef)(null),n=(0,A.useRef)(null),[r,i]=(0,A.useState)(`mouse`),[o,s]=(0,A.useState)(!1),[c,l]=(0,A.useState)(!1),u=ie(),{connState:d,errorMessage:f,decoderStatus:m,decoderErrorMessage:h,sendMessage:g,reconnect:_,getTotalBytes:v,getFrameCount:ee,quality:S,setQuality:ne,showCursor:T,setShowCursor:ae,audioOn:oe,setAudioOn:se,getAudioTracks:j,privacyOn:M,privacyError:N,setPrivacyOn:P,hostModeId:F,hostOriginalModeId:ce,resolutionError:le,setHostMode:I,pendingHostClipboard:L,clearHostClipboard:ue,sendClipboard:R,requestHostClipboard:z}=D(n,{displayId:u.displayId}),de=b(e=>e.remoteDesktopStatsVisible),B=b(e=>e.toggleRemoteDesktopStatsVisible),V=b(e=>e.remoteDesktopClipboardSync),U=b(e=>e.setRemoteDesktopClipboardSync),W=b(e=>e.remoteDesktopQuality),G=d===`streaming`,{transform:K,virtualCursor:q,resetZoom:J}=fe({containerRef:t,canvasRef:n,mode:r,sendMessage:g,enabled:G}),[Y,X]=(0,A.useState)(!1),_e=(0,A.useCallback)(e=>{X(!0),R(e,!0)},[R]),{caps:Z}=te(!1),Q=re(n,j),{inputRef:ve,show:ye}=pe(g,G,V?_e:void 0),$=C(!0)?.keyboardInset??0,be=(0,A.useCallback)(()=>i(e=>e===`mouse`?`touch`:`mouse`),[]),xe=(0,A.useCallback)(()=>{ye(),s(!0)},[ye]),Se=m===`unsupported`?h:d===`error`?f:d===`closed`?`Disconnected`:d===`connecting`?`Connecting…`:null,Ce={transform:`translate(${K.panX}px, ${K.panY}px) scale(${K.scale})`},we=`${(q?.xFrac??.5)*100}%`,Te=`${(q?.yFrac??.5)*100}%`;if(q&&t.current&&n.current?.width&&n.current.height){let e=t.current.getBoundingClientRect(),r=E({left:0,top:0,width:e.width,height:e.height},n.current.width,n.current.height);we=`${r.left+q.xFrac*r.width}px`,Te=`${r.top+q.yFrac*r.height}px`}return(0,H.jsxs)(`div`,{className:`relative h-full w-full bg-black`,"data-testid":`remote-desktop-mobile-view`,"data-conn-state":d,children:[(0,H.jsxs)(`div`,{ref:t,className:`absolute inset-x-0 top-0 flex items-center justify-center overflow-hidden`,style:{touchAction:`none`,bottom:$},"data-testid":`remote-desktop-mobile-stage-container`,children:[(0,H.jsxs)(`div`,{className:`relative flex h-full w-full items-center justify-center`,style:Ce,children:[(0,H.jsx)(`canvas`,{ref:n,"data-testid":`remote-desktop-canvas`,className:`block h-full w-full min-h-0 min-w-0 object-contain outline-none`}),r===`mouse`&&q&&G&&(0,H.jsx)(`div`,{className:`pointer-events-none absolute rounded-full border-2 border-white bg-primary shadow-[0_0_0_1px_rgba(0,0,0,0.6)]`,style:{left:we,top:Te,width:14,height:14,transform:`translate(-50%, -50%) scale(${1/K.scale})`},"data-testid":`remote-desktop-virtual-cursor`})]}),Se&&(0,H.jsxs)(`div`,{className:`absolute inset-0 flex flex-col items-center justify-center gap-3 bg-black/70 text-sm text-white`,children:[(0,H.jsx)(a,{className:`size-6 opacity-70`}),(0,H.jsx)(`span`,{className:`max-w-sm px-4 text-center`,children:Se}),(d===`error`||d===`closed`)&&m!==`unsupported`&&(0,H.jsxs)(`button`,{onClick:_,className:`flex items-center gap-1.5 rounded-md bg-white/10 px-3 py-1.5 hover:bg-white/20`,children:[(0,H.jsx)(p,{className:`size-3.5`}),` Reconnect`]})]}),(0,H.jsx)(`input`,{ref:ve,type:`text`,autoComplete:`off`,autoCapitalize:`off`,autoCorrect:`off`,spellCheck:!1,className:`absolute size-px opacity-0`,"aria-hidden":`true`,tabIndex:-1,onBlur:()=>s(!1),"data-testid":`remote-desktop-virtual-keyboard-input`})]}),(0,H.jsxs)(`div`,{className:`absolute inset-x-0 bottom-0`,style:$>0?{transform:`translateY(-${$}px)`}:void 0,"data-testid":`remote-desktop-mobile-bottom-bar`,children:[(0,H.jsx)(k,{pendingText:L,onDismiss:ue,missingToolAction:Y&&Z&&!Z.clipboard.available?Z.clipboard.action:null,onDismissMissingTool:()=>X(!1),positionClassName:`mx-2 mb-1 max-w-[calc(100%-1rem)]`}),c&&(0,H.jsx)(ge,{statsVisible:de,onToggleStats:B,showCursor:T,onSetShowCursor:ae,clipboardEnabled:V,onSetClipboardEnabled:U,audioOn:oe,audioReason:Z&&!Z.audio.available?Z.audio.reason:null,onSetAudioOn:se,privacyOn:M,privacyReason:N??(Z&&!Z.privacy.available?Z.privacy.reason:null),hostModes:Z?.resolutions?.modes??[],hostModeId:F,hostOriginalModeId:ce,onSetHostMode:I,canResizeHost:Z?.inputReady??!1,resolutionError:le,onSetPrivacyOn:P,recording:Q.recording,recordingSupported:Q.supported,onToggleRecording:Q.toggle,onScreenshot:()=>void w(n.current)}),o&&(0,H.jsx)(he,{sendMessage:g,onCopyCombo:V?z:void 0}),(0,H.jsx)(me,{displayLabel:u.displays.length>1?u.current?.label??null:null,onNextDisplay:u.next,qualityLabel:y(W),onNextQuality:()=>ne(x(W)),mode:r,onToggleMode:be,onOpenKeyboard:xe,onResetZoom:J,settingsOpen:c,onToggleSettings:()=>l(e=>!e),onClose:e})]}),(0,H.jsx)(O,{canvasRef:n,getFrameCount:ee,getTotalBytes:v,positionClassName:`left-1 top-[calc(env(safe-area-inset-top,0px)+2.75rem)]`})]})}export{X as default};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t,S as n}from"./vendor-markdown-CuWCHIVb.js";import{E as r,Sr as i,Tn as a,ct as o,ln as s,lr as c,z as l}from"./icons-DQjqk0lJ.js";import{t as u}from"./settings-store-krC6bc79.js";import{T as d}from"./index-DU68xk06.js";import{r as f}from"./run-in-terminal-CdefEe_R.js";var p=e(t(),1),m=n();function h({onCancel:e,children:t}){let n=u(e=>e.remoteDesktopWarningDismissed),r=u(e=>e.setRemoteDesktopWarningDismissed),[i,o]=(0,p.useState)(!1),[s,l]=(0,p.useState)(!1);if(n||i)return(0,m.jsx)(m.Fragment,{children:t});let d=()=>{s&&r(!0),o(!0)};return(0,m.jsx)(`div`,{className:`flex h-full w-full items-center justify-center overflow-y-auto bg-black p-4 text-white`,"data-testid":`remote-desktop-warning-gate`,children:(0,m.jsxs)(`div`,{className:`flex w-full max-w-sm flex-col gap-4 rounded-xl border border-white/10 bg-white/5 p-5`,children:[(0,m.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,m.jsx)(a,{className:`size-5 shrink-0 text-primary`}),(0,m.jsx)(`h2`,{className:`text-base font-semibold`,children:`Remote Desktop`}),(0,m.jsx)(`span`,{className:`ml-auto rounded-full bg-amber-500/20 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-amber-300`,children:`Beta`})]}),(0,m.jsxs)(`ul`,{className:`flex flex-col gap-2 text-sm text-white/80`,children:[(0,m.jsxs)(`li`,{className:`flex gap-2`,children:[(0,m.jsx)(c,{className:`mt-0.5 size-4 shrink-0 text-amber-300`}),(0,m.jsxs)(`span`,{children:[`This streams the host's `,(0,m.jsx)(`strong`,{children:`whole screen`}),` and lets you `,(0,m.jsx)(`strong`,{children:`move its mouse and type`}),` as if you were sitting at it. Anything you do here happens on the real desktop.`]})]}),(0,m.jsxs)(`li`,{className:`flex gap-2`,children:[(0,m.jsx)(c,{className:`mt-0.5 size-4 shrink-0 text-amber-300`}),(0,m.jsx)(`span`,{children:`Anyone signed in to this PPM can do the same. Avoid opening it over a public share link you don't fully trust; a private network (Tailscale, LAN) is safer.`})]}),(0,m.jsxs)(`li`,{className:`flex gap-2`,children:[(0,m.jsx)(c,{className:`mt-0.5 size-4 shrink-0 text-amber-300`}),(0,m.jsx)(`span`,{children:`Still beta: the host must be unlocked with an active session, UAC prompts stay hidden, and a person at the host will fight you for the cursor.`})]})]}),(0,m.jsxs)(`label`,{className:`flex min-h-11 cursor-pointer items-center gap-2 text-sm text-white/70`,children:[(0,m.jsx)(`input`,{type:`checkbox`,checked:s,onChange:e=>l(e.target.checked),className:`size-4 accent-primary`,"data-testid":`remote-desktop-warning-dont-show`}),`Don't show this again`]}),(0,m.jsxs)(`div`,{className:`flex gap-2`,children:[(0,m.jsx)(`button`,{type:`button`,onClick:e,className:`min-h-11 flex-1 rounded-md bg-white/10 px-3 text-sm hover:bg-white/20`,"data-testid":`remote-desktop-warning-cancel`,children:`Cancel`}),(0,m.jsx)(`button`,{type:`button`,onClick:d,className:`min-h-11 flex-1 rounded-md bg-primary px-3 text-sm font-medium text-primary-foreground hover:bg-primary/90`,"data-testid":`remote-desktop-warning-continue`,children:`Continue`})]})]})})}function g({onCancel:e,children:t}){let[n,r]=(0,p.useState)(!1),{caps:i,failed:o,runHostAction:c}=d(!n);if(n||i?.videoReady&&i.inputReady)return(0,m.jsx)(m.Fragment,{children:t});let l=i?.requirements.filter(e=>!e.ok)??[],u=!!i?.videoReady&&!i.inputReady,h=t=>{f(t),e()};return(0,m.jsx)(`div`,{className:`flex h-full w-full items-center justify-center overflow-y-auto bg-black p-4 text-white`,"data-testid":`remote-desktop-readiness-gate`,children:(0,m.jsxs)(`div`,{className:`flex w-full max-w-sm flex-col gap-4 rounded-xl border border-white/10 bg-white/5 p-5`,children:[(0,m.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,m.jsx)(a,{className:`size-5 shrink-0 text-primary`}),(0,m.jsx)(`h2`,{className:`text-base font-semibold`,children:`This host needs a few things`})]}),!i&&!o&&(0,m.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-white/70`,children:[(0,m.jsx)(s,{className:`size-4 animate-spin`}),` Checking the host…`]}),o&&(0,m.jsx)(`p`,{className:`text-sm text-red-300`,children:`Could not reach the host's remote-desktop service.`}),(0,m.jsx)(`ul`,{className:`flex flex-col gap-3`,children:i?.requirements.map(e=>(0,m.jsx)(_,{req:e,onHostAction:c,onTerminal:h},e.id))}),l.length>0&&(0,m.jsx)(`p`,{className:`text-xs text-white/50`,children:`Re-checking every few seconds — this updates by itself once fixed.`}),(0,m.jsxs)(`div`,{className:`flex gap-2`,children:[(0,m.jsx)(`button`,{type:`button`,onClick:e,className:`min-h-11 flex-1 rounded-md bg-white/10 px-3 text-sm hover:bg-white/20`,children:`Cancel`}),(0,m.jsx)(`button`,{type:`button`,disabled:!i?.videoReady,onClick:()=>r(!0),className:`min-h-11 flex-1 rounded-md bg-primary px-3 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-40`,"data-testid":`remote-desktop-readiness-continue`,children:u?`Continue (view only)`:`Continue`})]})]})})}function _({req:e,...t}){return(0,m.jsxs)(`li`,{className:`flex gap-2`,"data-testid":`remote-desktop-requirement-${e.id}`,"data-ok":e.ok,children:[e.ok?(0,m.jsx)(r,{className:`mt-0.5 size-4 shrink-0 text-emerald-400`}):(0,m.jsx)(l,{className:`mt-0.5 size-4 shrink-0 text-amber-300`}),(0,m.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col gap-2`,children:[(0,m.jsxs)(`div`,{className:`text-sm font-medium`,children:[e.title,!e.ok&&(0,m.jsx)(`span`,{className:`ml-2 text-xs font-normal text-white/50`,children:e.gates===`video`?`required`:`for mouse & keyboard`})]}),!e.ok&&(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`p`,{className:`text-sm text-white/70`,children:e.detail}),(0,m.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:e.actions.map(n=>(0,m.jsx)(v,{action:n,reqId:e.id,...t},n.label))})]})]})]})}function v({action:e,reqId:t,onHostAction:n,onTerminal:r}){let a=`inline-flex min-h-11 items-center gap-1.5 rounded-md bg-white/10 px-3 text-sm hover:bg-white/20`;return e.kind===`terminal`?(0,m.jsxs)(`button`,{type:`button`,className:a,onClick:()=>r(e.command),title:e.command,children:[(0,m.jsx)(i,{className:`size-4`}),` `,e.label]}):e.kind===`link`?(0,m.jsxs)(`a`,{className:a,href:e.url,target:`_blank`,rel:`noreferrer`,children:[(0,m.jsx)(o,{className:`size-4`}),` `,e.label]}):(0,m.jsx)(`button`,{type:`button`,className:a,onClick:()=>void n(t,e.action),children:e.label})}export{h as n,g as t};
1
+ import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t,S as n}from"./vendor-markdown-CuWCHIVb.js";import{E as r,Sr as i,Tn as a,ct as o,ln as s,lr as c,z as l}from"./icons-DQjqk0lJ.js";import{t as u}from"./settings-store-krC6bc79.js";import{T as d}from"./index-CEZVxM4G.js";import{r as f}from"./run-in-terminal-CdefEe_R.js";var p=e(t(),1),m=n();function h({onCancel:e,children:t}){let n=u(e=>e.remoteDesktopWarningDismissed),r=u(e=>e.setRemoteDesktopWarningDismissed),[i,o]=(0,p.useState)(!1),[s,l]=(0,p.useState)(!1);if(n||i)return(0,m.jsx)(m.Fragment,{children:t});let d=()=>{s&&r(!0),o(!0)};return(0,m.jsx)(`div`,{className:`flex h-full w-full items-center justify-center overflow-y-auto bg-black p-4 text-white`,"data-testid":`remote-desktop-warning-gate`,children:(0,m.jsxs)(`div`,{className:`flex w-full max-w-sm flex-col gap-4 rounded-xl border border-white/10 bg-white/5 p-5`,children:[(0,m.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,m.jsx)(a,{className:`size-5 shrink-0 text-primary`}),(0,m.jsx)(`h2`,{className:`text-base font-semibold`,children:`Remote Desktop`}),(0,m.jsx)(`span`,{className:`ml-auto rounded-full bg-amber-500/20 px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide text-amber-300`,children:`Beta`})]}),(0,m.jsxs)(`ul`,{className:`flex flex-col gap-2 text-sm text-white/80`,children:[(0,m.jsxs)(`li`,{className:`flex gap-2`,children:[(0,m.jsx)(c,{className:`mt-0.5 size-4 shrink-0 text-amber-300`}),(0,m.jsxs)(`span`,{children:[`This streams the host's `,(0,m.jsx)(`strong`,{children:`whole screen`}),` and lets you `,(0,m.jsx)(`strong`,{children:`move its mouse and type`}),` as if you were sitting at it. Anything you do here happens on the real desktop.`]})]}),(0,m.jsxs)(`li`,{className:`flex gap-2`,children:[(0,m.jsx)(c,{className:`mt-0.5 size-4 shrink-0 text-amber-300`}),(0,m.jsx)(`span`,{children:`Anyone signed in to this PPM can do the same. Avoid opening it over a public share link you don't fully trust; a private network (Tailscale, LAN) is safer.`})]}),(0,m.jsxs)(`li`,{className:`flex gap-2`,children:[(0,m.jsx)(c,{className:`mt-0.5 size-4 shrink-0 text-amber-300`}),(0,m.jsx)(`span`,{children:`Still beta: the host must be unlocked with an active session, UAC prompts stay hidden, and a person at the host will fight you for the cursor.`})]})]}),(0,m.jsxs)(`label`,{className:`flex min-h-11 cursor-pointer items-center gap-2 text-sm text-white/70`,children:[(0,m.jsx)(`input`,{type:`checkbox`,checked:s,onChange:e=>l(e.target.checked),className:`size-4 accent-primary`,"data-testid":`remote-desktop-warning-dont-show`}),`Don't show this again`]}),(0,m.jsxs)(`div`,{className:`flex gap-2`,children:[(0,m.jsx)(`button`,{type:`button`,onClick:e,className:`min-h-11 flex-1 rounded-md bg-white/10 px-3 text-sm hover:bg-white/20`,"data-testid":`remote-desktop-warning-cancel`,children:`Cancel`}),(0,m.jsx)(`button`,{type:`button`,onClick:d,className:`min-h-11 flex-1 rounded-md bg-primary px-3 text-sm font-medium text-primary-foreground hover:bg-primary/90`,"data-testid":`remote-desktop-warning-continue`,children:`Continue`})]})]})})}function g({onCancel:e,children:t}){let[n,r]=(0,p.useState)(!1),{caps:i,failed:o,runHostAction:c}=d(!n);if(n||i?.videoReady&&i.inputReady)return(0,m.jsx)(m.Fragment,{children:t});let l=i?.requirements.filter(e=>!e.ok)??[],u=!!i?.videoReady&&!i.inputReady,h=t=>{f(t),e()};return(0,m.jsx)(`div`,{className:`flex h-full w-full items-center justify-center overflow-y-auto bg-black p-4 text-white`,"data-testid":`remote-desktop-readiness-gate`,children:(0,m.jsxs)(`div`,{className:`flex w-full max-w-sm flex-col gap-4 rounded-xl border border-white/10 bg-white/5 p-5`,children:[(0,m.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,m.jsx)(a,{className:`size-5 shrink-0 text-primary`}),(0,m.jsx)(`h2`,{className:`text-base font-semibold`,children:`This host needs a few things`})]}),!i&&!o&&(0,m.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-white/70`,children:[(0,m.jsx)(s,{className:`size-4 animate-spin`}),` Checking the host…`]}),o&&(0,m.jsx)(`p`,{className:`text-sm text-red-300`,children:`Could not reach the host's remote-desktop service.`}),(0,m.jsx)(`ul`,{className:`flex flex-col gap-3`,children:i?.requirements.map(e=>(0,m.jsx)(_,{req:e,onHostAction:c,onTerminal:h},e.id))}),l.length>0&&(0,m.jsx)(`p`,{className:`text-xs text-white/50`,children:`Re-checking every few seconds — this updates by itself once fixed.`}),(0,m.jsxs)(`div`,{className:`flex gap-2`,children:[(0,m.jsx)(`button`,{type:`button`,onClick:e,className:`min-h-11 flex-1 rounded-md bg-white/10 px-3 text-sm hover:bg-white/20`,children:`Cancel`}),(0,m.jsx)(`button`,{type:`button`,disabled:!i?.videoReady,onClick:()=>r(!0),className:`min-h-11 flex-1 rounded-md bg-primary px-3 text-sm font-medium text-primary-foreground hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-40`,"data-testid":`remote-desktop-readiness-continue`,children:u?`Continue (view only)`:`Continue`})]})]})})}function _({req:e,...t}){return(0,m.jsxs)(`li`,{className:`flex gap-2`,"data-testid":`remote-desktop-requirement-${e.id}`,"data-ok":e.ok,children:[e.ok?(0,m.jsx)(r,{className:`mt-0.5 size-4 shrink-0 text-emerald-400`}):(0,m.jsx)(l,{className:`mt-0.5 size-4 shrink-0 text-amber-300`}),(0,m.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col gap-2`,children:[(0,m.jsxs)(`div`,{className:`text-sm font-medium`,children:[e.title,!e.ok&&(0,m.jsx)(`span`,{className:`ml-2 text-xs font-normal text-white/50`,children:e.gates===`video`?`required`:`for mouse & keyboard`})]}),!e.ok&&(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`p`,{className:`text-sm text-white/70`,children:e.detail}),(0,m.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:e.actions.map(n=>(0,m.jsx)(v,{action:n,reqId:e.id,...t},n.label))})]})]})]})}function v({action:e,reqId:t,onHostAction:n,onTerminal:r}){let a=`inline-flex min-h-11 items-center gap-1.5 rounded-md bg-white/10 px-3 text-sm hover:bg-white/20`;return e.kind===`terminal`?(0,m.jsxs)(`button`,{type:`button`,className:a,onClick:()=>r(e.command),title:e.command,children:[(0,m.jsx)(i,{className:`size-4`}),` `,e.label]}):e.kind===`link`?(0,m.jsxs)(`a`,{className:a,href:e.url,target:`_blank`,rel:`noreferrer`,children:[(0,m.jsx)(o,{className:`size-4`}),` `,e.label]}):(0,m.jsx)(`button`,{type:`button`,className:a,onClick:()=>void n(t,e.action),children:e.label})}export{h as n,g as t};
@@ -1 +1 @@
1
- import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t,S as n}from"./vendor-markdown-CuWCHIVb.js";import"./vendor-ui-DmZ-Mb-H.js";import{Cn as r,En as i,Mt as a,Wt as o,er as s,mr as c,qn as l,sr as u,ut as d,wn as f,z as p}from"./icons-DQjqk0lJ.js";import"./api-client-C1ZwRL4Y.js";import{_ as m,a as h,c as g,d as _,f as v,g as y,i as b,l as x,m as S,n as C,o as ee,p as w,r as te,s as T,t as E,u as D}from"./settings-store-krC6bc79.js";import"./vendor-mermaid-BitiXJlL.js";import{n as O}from"./utils-Bmf_8h7Y.js";import"./portal-container-context-BarKmT4S.js";import"./panel-store-CboGJAwh.js";import{t as k}from"./window-store-UC1jJeLM.js";import{t as ne}from"./button-B9CTrsEf.js";import{a as re,i as A,n as j,o as M,r as N,t as P}from"./dialog-B84_DJQ8.js";import"./ws-auth-CEYVQ8NH.js";import{Bt as F,Gt as I,Ht as L,Jt as R,Kt as z,T as ie,Ut as ae,Vt as oe,Wt as B,Xt as se,Yt as V,qt as H,zt as U}from"./index-DU68xk06.js";import"./run-in-terminal-CdefEe_R.js";import{n as W,t as G}from"./remote-desktop-readiness-gate-Dm_qMJMH.js";import{a as ce,c as le,h as K,i as ue,l as de,m as q,n as fe,o as J,p as pe,r as me,s as he,t as ge,u as Y}from"./remote-desktop-clipboard-notice-0WDYsyCA.js";var X=e(t(),1);function Z(e,t,n,r){let i=(0,X.useCallback)((n,r,i,a)=>{let o=e.current;if(!o)return;let{xFrac:s,yFrac:c}=Y(n,r,o.getBoundingClientRect());t({type:`pointer`,xFrac:s,yFrac:c,button:i,down:a})},[e,t]);(0,X.useEffect)(()=>{let a=e.current;if(!a||!n)return;let o=e=>e===0?`left`:e===2?`right`:null,s=()=>t({type:`releaseAll`}),c=null,l=0,u=()=>{l=0,c&&=(i(c.x,c.y,null,null),null)},d=()=>{l&&=(cancelAnimationFrame(l),0),c&&=(i(c.x,c.y,null,null),null)},f=e=>{e.preventDefault(),a.setPointerCapture(e.pointerId),a.focus(),d(),i(e.clientX,e.clientY,o(e.button),!0)},p=e=>{c={x:e.clientX,y:e.clientY},l||=requestAnimationFrame(u)},m=e=>{d(),i(e.clientX,e.clientY,o(e.button),!1)},h=e=>e.preventDefault(),g=!1,_=e=>{if(r&&K(e)){g=e.shiftKey;return}e.preventDefault(),t({type:`key`,code:e.code,down:!0}),r&&q(e)&&r.onCopyCombo()},v=e=>{r&&K(e)||(e.preventDefault(),t({type:`key`,code:e.code,down:!1}))},y=e=>{e.preventDefault();let t=e.clipboardData?.getData(`text/plain`);t&&r?.onPasteText(t,g),g=!1},b=()=>{document.hidden&&s()};return a.tabIndex=0,a.addEventListener(`pointerdown`,f),a.addEventListener(`pointermove`,p),a.addEventListener(`pointerup`,m),a.addEventListener(`contextmenu`,h),a.addEventListener(`keydown`,_),a.addEventListener(`keyup`,v),a.addEventListener(`paste`,y),a.addEventListener(`blur`,s),document.addEventListener(`visibilitychange`,b),()=>{l&&cancelAnimationFrame(l),a.removeEventListener(`pointerdown`,f),a.removeEventListener(`pointermove`,p),a.removeEventListener(`pointerup`,m),a.removeEventListener(`contextmenu`,h),a.removeEventListener(`keydown`,_),a.removeEventListener(`keyup`,v),a.removeEventListener(`blur`,s),document.removeEventListener(`visibilitychange`,b)}},[e,n,i,t,r])}var Q={h264_nvenc:`NVIDIA NVENC`,h264_qsv:`Intel QuickSync`,h264_vaapi:`VAAPI (GPU)`,h264_amf:`AMD AMF`,h264_videotoolbox:`Apple VideoToolbox`,libx264:`Software (x264)`};function _e(e){return Object.hasOwn(Q,e)?Q[e]:e}var $=n(),ve=`flex size-7 shrink-0 items-center justify-center rounded bg-black/40 text-white/70 outline-none hover:bg-black/60 hover:text-white data-[state=open]:bg-black/70 data-[state=open]:text-white`;function ye({displays:e,currentDisplayId:t,onSelectDisplay:n,quality:r,qualityChoice:i,onSetQuality:s,onOpenCustomQuality:l,codecs:h,codec:g,onSetCodec:_,hostModes:v,hostModeId:x,hostOriginalModeId:S,onSetHostMode:C,canResizeHost:ee,resolutionError:w,viewStyle:T,customScale:E,onSetViewStyle:D,onSetCustomScale:k,showCursor:ne,onSetShowCursor:re,audioOn:A,audioReason:j,onSetAudioOn:M,privacyOn:N,privacyReason:P,privacyCanBlank:ie,onSetPrivacyOn:W,recording:G,recordingElapsedSec:ce,recordingSupported:K,onToggleRecording:ue,onScreenshot:q,clipboardEnabled:fe,onSetClipboardEnabled:pe,statsVisible:me,onToggleStats:ge}){let Y=(0,X.useMemo)(()=>le(v),[v]),Z=(0,X.useMemo)(()=>he(),[]),Q=(0,X.useMemo)(()=>J(v,Z,x),[v,Z,x]),ye=!!(S&&S!==x),Se=t??e.find(e=>e.primary)?.id??e[0]?.id??``;return(0,$.jsxs)(`div`,{className:`absolute right-1 top-1 z-40 flex items-center gap-1`,"data-testid":`remote-desktop-toolbar`,children:[e.length>1&&(0,$.jsxs)(U,{children:[(0,$.jsx)(se,{className:ve,"aria-label":`Display`,title:`Display`,children:(0,$.jsx)(f,{className:`size-3.5`})}),(0,$.jsxs)(oe,{align:`end`,className:`w-64`,children:[(0,$.jsx)(ae,{children:`Display`}),(0,$.jsx)(B,{value:Se,onValueChange:n,children:e.map(e=>(0,$.jsxs)(I,{value:e.id,"data-testid":`remote-desktop-display-${e.id}`,children:[e.label,e.primary?` (main)`:``,` · `,e.width,`×`,e.height]},e.id))})]})]}),(0,$.jsxs)(U,{children:[(0,$.jsx)(se,{className:ve,"aria-label":`Display settings`,title:`Display settings`,"data-testid":`remote-desktop-settings-trigger`,children:(0,$.jsx)(u,{className:`size-3.5`})}),(0,$.jsxs)(oe,{align:`end`,className:`w-64`,children:[(0,$.jsx)(ae,{children:`Scale`}),(0,$.jsx)(B,{value:T,onValueChange:e=>D(e),children:b.map(e=>(0,$.jsx)(I,{value:e,"data-testid":`remote-desktop-view-style-${e}`,children:te[e]},e))}),T===`custom`&&(0,$.jsx)(xe,{scale:E,onSet:k}),(0,$.jsx)(z,{}),(0,$.jsxs)(H,{children:[(0,$.jsxs)(V,{"data-testid":`remote-desktop-quality-submenu`,children:[`Image quality`,r.held<1&&(0,$.jsxs)(`span`,{className:`ml-1.5 text-[10px] opacity-60`,"data-testid":`remote-desktop-quality-held`,children:[Math.round(r.held*100),`% — link limited`]})]}),(0,$.jsx)(R,{className:`w-56`,children:(0,$.jsxs)(B,{value:i,onValueChange:e=>e===`custom`?l():s(e),children:[m.map(e=>(0,$.jsx)(I,{value:e,"data-testid":`remote-desktop-quality-${e}`,children:y[e].label},e)),(0,$.jsx)(I,{value:`custom`,"data-testid":`remote-desktop-quality-custom`,children:`Custom…`})]})})]}),h.length>1&&(0,$.jsxs)(H,{children:[(0,$.jsx)(V,{"data-testid":`remote-desktop-codec-submenu`,children:`Codec`}),(0,$.jsx)(R,{className:`w-56`,children:(0,$.jsxs)(B,{value:g??`auto`,onValueChange:e=>_(e===`auto`?null:e),children:[(0,$.jsxs)(I,{value:`auto`,children:[`Auto · `,_e(h[0])]}),h.map(e=>(0,$.jsx)(I,{value:e,"data-testid":`remote-desktop-codec-${e}`,children:_e(e)},e))]})})]}),ee&&Y.length>1&&(0,$.jsxs)(H,{children:[(0,$.jsx)(V,{"data-testid":`remote-desktop-resolution-submenu`,children:`Resolution`}),(0,$.jsxs)(R,{className:`max-h-80 w-56 overflow-y-auto`,children:[ye&&S&&(0,$.jsx)(L,{onSelect:()=>C(S),"data-testid":`remote-desktop-resolution-original`,children:`Original`}),Q&&(0,$.jsxs)(L,{onSelect:()=>C(Q.id),"data-testid":`remote-desktop-resolution-fit-local`,children:[`Fit local `,Q.width,`×`,Q.height]}),(ye||Q)&&(0,$.jsx)(z,{}),(0,$.jsx)(B,{value:x??Y.find(e=>e.current)?.id??``,onValueChange:C,children:Y.map(e=>(0,$.jsxs)(I,{value:e.id,"data-testid":`remote-desktop-resolution-${e.width}x${e.height}`,children:[de(e),e.preferred&&(0,$.jsx)(`span`,{className:`ml-1.5 text-[10px] opacity-60`,children:`native`})]},e.id))}),w&&(0,$.jsx)(`div`,{className:`px-2 py-1.5 text-[10px] leading-tight text-destructive`,children:w})]})]}),(0,$.jsx)(z,{}),(0,$.jsx)(F,{checked:ne,onCheckedChange:re,"data-testid":`remote-desktop-show-cursor`,children:`Show remote cursor`}),(0,$.jsx)(F,{checked:fe,onCheckedChange:pe,"data-testid":`remote-desktop-clipboard-toggle`,children:`Sync clipboard`}),(0,$.jsx)(F,{checked:A,disabled:j!==null,onCheckedChange:M,"data-testid":`remote-desktop-audio-toggle`,children:(0,$.jsxs)(`span`,{className:`flex min-w-0 flex-col`,children:[(0,$.jsx)(`span`,{children:`Play host audio`}),j&&(0,$.jsx)(`span`,{className:`text-[10px] leading-tight text-muted-foreground`,children:j})]})}),(0,$.jsx)(z,{}),(0,$.jsx)(F,{checked:N,disabled:P!==null&&!N,onCheckedChange:W,"data-testid":`remote-desktop-privacy-toggle`,children:(0,$.jsxs)(`span`,{className:`flex min-w-0 flex-col`,children:[(0,$.jsx)(`span`,{children:`Privacy mode`}),(0,$.jsx)(`span`,{className:`text-[10px] leading-tight text-muted-foreground`,children:P??(ie?`Blocks the host's keyboard and mouse, and blanks its screen`:`Blocks the host's keyboard and mouse (its screen stays on)`)})]})}),(0,$.jsx)(z,{}),(0,$.jsxs)(L,{onSelect:q,"data-testid":`remote-desktop-screenshot`,children:[(0,$.jsx)(o,{className:`size-3.5`}),` Save screenshot`]}),K&&(0,$.jsx)(L,{onSelect:ue,"data-testid":`remote-desktop-record`,children:G?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(c,{className:`size-3.5 text-red-500`}),` Stop recording · `,be(ce)]}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(p,{className:`size-3.5`}),` Start recording`]})})]})]}),N&&(0,$.jsxs)(`button`,{type:`button`,onClick:()=>W(!1),title:`Privacy mode is on — click to release the host`,"aria-label":`Turn privacy mode off`,className:`flex h-7 shrink-0 items-center gap-1 rounded bg-amber-500/85 px-1.5 text-[10px] font-medium text-black hover:bg-amber-400`,"data-testid":`remote-desktop-privacy-indicator`,children:[(0,$.jsx)(d,{className:`size-3`}),` Host locked`]}),G&&(0,$.jsxs)(`button`,{type:`button`,onClick:ue,title:`Stop recording`,"aria-label":`Stop recording`,className:`flex h-7 shrink-0 items-center gap-1 rounded bg-red-600/80 px-1.5 text-[10px] font-medium tabular-nums text-white hover:bg-red-600`,"data-testid":`remote-desktop-recording-indicator`,children:[(0,$.jsx)(`span`,{className:`size-1.5 animate-pulse rounded-full bg-white`}),be(ce)]}),(0,$.jsx)(`button`,{type:`button`,onClick:ge,"aria-label":`Toggle stats overlay`,"aria-pressed":me,title:`Quality monitor`,className:O(ve,me&&`bg-primary/70 text-primary-foreground hover:bg-primary/80`),children:(0,$.jsx)(a,{className:`size-3.5`})})]})}function be(e){let t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=String(e%60).padStart(2,`0`);return t>0?`${t}:${String(n).padStart(2,`0`)}:${r}`:`${n}:${r}`}function xe({scale:e,onSet:t}){let[n,i]=(0,X.useState)(null),a=(0,X.useRef)(null),o=T(Math.round(ee(e)*100)),s=n??o,c=g(s);(0,X.useEffect)(()=>()=>{a.current&&clearTimeout(a.current)},[]);let u=e=>{i(e),a.current&&clearTimeout(a.current),a.current=setTimeout(()=>{i(null),t(e/100)},300)},d=e=>t=>{t.preventDefault(),u(T(s+e*1))},f=`flex size-6 shrink-0 items-center justify-center rounded hover:bg-accent disabled:opacity-40`;return(0,$.jsx)(`div`,{className:`px-2 py-1.5`,"data-testid":`remote-desktop-zoom-row`,children:(0,$.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,$.jsx)(`button`,{type:`button`,className:f,onClick:d(-1),disabled:s<=5,"aria-label":`Decrease`,children:(0,$.jsx)(r,{className:`size-3.5`})}),(0,$.jsxs)(`span`,{className:`relative flex-1 py-2.5`,children:[(0,$.jsx)(`input`,{type:`range`,min:0,max:1,step:1/(C-5),value:c,"aria-label":`Scale`,"aria-valuetext":`${s}%`,"data-testid":`remote-desktop-zoom-slider`,onKeyDown:e=>e.stopPropagation(),onChange:e=>u(x(D(Number(e.target.value)))),className:`h-1 w-full cursor-pointer appearance-none rounded bg-accent accent-primary`}),(0,$.jsxs)(`span`,{className:`pointer-events-none absolute top-0 -translate-x-1/2 rounded bg-primary px-1.5 text-[10px] leading-4 tabular-nums text-primary-foreground`,style:{left:`${c*100}%`},"data-testid":`remote-desktop-zoom-value`,children:[s,`%`]})]}),(0,$.jsx)(`button`,{type:`button`,className:f,onClick:d(1),disabled:s>=C,"aria-label":`Increase`,children:(0,$.jsx)(l,{className:`size-3.5`})})]})})}var Se=400;function Ce({open:e,onOpenChange:t,percent:n,fps:r,more:i,onSetMore:a,onCommit:o,frameSize:s}){let[c,l]=(0,X.useState)(n),[u,d]=(0,X.useState)(r),f=(0,X.useRef)(null);(0,X.useEffect)(()=>{e&&(l(n),d(r))},[e,n,r]),(0,X.useEffect)(()=>()=>{f.current&&clearTimeout(f.current)},[]);let p=i?_:100,m=(e,t)=>{f.current&&clearTimeout(f.current),f.current=setTimeout(()=>o(e,t),Se)},h=e=>{let t=w(e,i);l(t),m(t,u)},g=e=>{let t=v(e);d(t),m(c,t)},y=e=>{a(e);let t=w(c,e);t!==c&&(l(t),m(t,u))},b=S(c,s.width,s.height);return(0,$.jsx)(P,{open:e,onOpenChange:t,children:(0,$.jsxs)(j,{className:`sm:max-w-md`,"data-testid":`remote-desktop-custom-quality-dialog`,children:[(0,$.jsxs)(re,{children:[(0,$.jsx)(M,{children:`Custom image quality`}),(0,$.jsx)(N,{children:s.width>0?`${c}% of the base rate for ${s.width}×${s.height} — about ${(b/1e3).toFixed(1)} Mbit/s`:`Waiting for the first frame`})]}),(0,$.jsxs)(`div`,{className:`space-y-4 py-2`,children:[(0,$.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,$.jsx)(`input`,{type:`range`,min:10,max:p,step:1,value:Math.min(c,p),onChange:e=>h(Number(e.target.value)),"aria-label":`Bitrate`,"data-testid":`remote-desktop-custom-bitrate`,className:`h-1 min-w-0 flex-1 cursor-pointer appearance-none rounded bg-accent accent-primary`}),(0,$.jsxs)(`span`,{className:`w-14 text-right text-xs tabular-nums`,children:[c,`%`]}),(0,$.jsx)(`span`,{className:`w-14 text-xs text-muted-foreground`,children:`Bitrate`}),(0,$.jsxs)(`label`,{className:`flex shrink-0 items-center gap-1.5 text-xs`,children:[(0,$.jsx)(`input`,{type:`checkbox`,checked:i,onChange:e=>y(e.target.checked),"data-testid":`remote-desktop-custom-more`,className:`size-3.5 accent-primary`}),`More`]})]}),(0,$.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,$.jsx)(`input`,{type:`range`,min:5,max:120,step:1,value:u,onChange:e=>g(Number(e.target.value)),"aria-label":`FPS`,"data-testid":`remote-desktop-custom-fps`,className:`h-1 min-w-0 flex-1 cursor-pointer appearance-none rounded bg-accent accent-primary`}),(0,$.jsx)(`span`,{className:`w-14 text-right text-xs tabular-nums`,children:u}),(0,$.jsx)(`span`,{className:`w-14 text-xs text-muted-foreground`,children:`FPS`}),(0,$.jsx)(`span`,{className:`w-[4.25rem] shrink-0`,"aria-hidden":!0})]})]}),(0,$.jsx)(A,{children:(0,$.jsx)(ne,{onClick:()=>t(!1),children:`Close`})})]})})}function we({id:e}){let t=k(e=>e.close),n=(0,X.useCallback)(()=>t(e),[t,e]);return(0,$.jsx)(W,{onCancel:n,children:(0,$.jsx)(G,{onCancel:n,children:(0,$.jsx)(Te,{})})})}function Te(){let e=(0,X.useRef)(null),t=fe(),{connState:n,errorMessage:r,decoderStatus:a,decoderErrorMessage:o,sendMessage:c,reconnect:l,getFrameCount:u,getTotalBytes:d,frameSize:f,quality:p,setQuality:m,setCustomQuality:g,showCursor:_,setShowCursor:v,codec:y,setCodec:b,audioOn:x,setAudioOn:S,getAudioTracks:C,privacyOn:ee,privacyError:w,setPrivacyOn:te,hostModeId:T,hostOriginalModeId:D,resolutionError:k,setHostMode:ne,pendingHostClipboard:re,clearHostClipboard:A,sendClipboard:j,requestHostClipboard:M}=pe(e,{displayId:t.displayId}),N=E(e=>e.remoteDesktopStatsVisible),P=E(e=>e.toggleRemoteDesktopStatsVisible),F=E(e=>e.remoteDesktopViewStyle),I=E(e=>e.remoteDesktopCustomScale),L=E(e=>e.setRemoteDesktopViewStyle),R=E(e=>e.setRemoteDesktopCustomScale),z=E(e=>e.remoteDesktopClipboardSync),ae=E(e=>e.remoteDesktopQuality),oe=E(e=>e.remoteDesktopCustomQualityPercent),B=E(e=>e.remoteDesktopCustomFps),se=E(e=>e.remoteDesktopCustomQualityMore),V=E(e=>e.setRemoteDesktopCustomQualityMore),[H,U]=(0,X.useState)(!1),W=E(e=>e.setRemoteDesktopClipboardSync),{caps:G}=ie(!1),[le,K]=(0,X.useState)(!1),de=(0,X.useMemo)(()=>z?{onPasteText:(e,t)=>{K(!0),j(e,!0,t)},onCopyCombo:M}:void 0,[z,j,M]);Z(e,c,n===`streaming`,de);let q=ue(e,C),J=h(F,I,f),he=a===`unsupported`?o:n===`error`?r:n===`closed`?`Disconnected`:n===`connecting`?`Connecting…`:null;return(0,$.jsxs)(`div`,{className:`relative flex h-full w-full items-center justify-center bg-black`,"data-testid":`remote-desktop-window`,"data-conn-state":n,children:[(0,$.jsx)(`div`,{className:O(`flex h-full w-full`,J?`overflow-auto`:`overflow-hidden`),children:(0,$.jsx)(`canvas`,{ref:e,"data-testid":`remote-desktop-canvas`,"data-view-style":F,className:O(`m-auto outline-none`,!J&&`max-h-full max-w-full`),style:J?{width:J.width,height:J.height}:void 0})}),(0,$.jsx)(me,{canvasRef:e,getFrameCount:u,getTotalBytes:d}),(0,$.jsx)(ye,{displays:t.displays,currentDisplayId:t.current?.id,onSelectDisplay:t.select,quality:p,qualityChoice:ae,onSetQuality:m,onOpenCustomQuality:()=>U(!0),codecs:G?.encoders??[],codec:y,onSetCodec:b,hostModes:G?.resolutions?.modes??[],hostModeId:T,hostOriginalModeId:D,onSetHostMode:ne,canResizeHost:G?.inputReady??!1,resolutionError:k,viewStyle:F,customScale:I,onSetViewStyle:L,onSetCustomScale:R,showCursor:_,onSetShowCursor:v,audioOn:x,audioReason:G&&!G.audio.available?G.audio.reason:null,onSetAudioOn:S,privacyOn:ee,privacyReason:w??(G&&!G.privacy.available?G.privacy.reason:null),privacyCanBlank:G?.privacy?.canBlank??!1,onSetPrivacyOn:te,recording:q.recording,recordingElapsedSec:q.elapsedSec,recordingSupported:q.supported,onToggleRecording:q.toggle,onScreenshot:()=>void ce(e.current),clipboardEnabled:z,onSetClipboardEnabled:W,statsVisible:N,onToggleStats:P}),(0,$.jsx)(ge,{pendingText:re,onDismiss:A,missingToolAction:le&&G&&!G.clipboard.available?G.clipboard.action:null,onDismissMissingTool:()=>K(!1)}),(0,$.jsx)(Ce,{open:H,onOpenChange:U,percent:oe,fps:B,more:se,onSetMore:V,onCommit:g,frameSize:f}),he&&(0,$.jsxs)(`div`,{className:`absolute inset-0 flex flex-col items-center justify-center gap-3 bg-black/70 text-sm text-white`,children:[(0,$.jsx)(i,{className:`size-6 opacity-70`}),(0,$.jsx)(`span`,{className:`max-w-sm text-center px-4`,children:he}),(n===`error`||n===`closed`)&&a!==`unsupported`&&(0,$.jsxs)(`button`,{onClick:l,className:`flex items-center gap-1.5 rounded-md bg-white/10 px-3 py-1.5 hover:bg-white/20`,children:[(0,$.jsx)(s,{className:`size-3.5`}),` Reconnect`]})]})]})}export{we as default};
1
+ import{o as e}from"./rolldown-runtime-FhOqtrmT.js";import{C as t,S as n}from"./vendor-markdown-CuWCHIVb.js";import"./vendor-ui-DmZ-Mb-H.js";import{Cn as r,En as i,Mt as a,Wt as o,er as s,mr as c,qn as l,sr as u,ut as d,wn as f,z as p}from"./icons-DQjqk0lJ.js";import"./api-client-C1ZwRL4Y.js";import{_ as m,a as h,c as g,d as _,f as v,g as y,i as b,l as x,m as S,n as C,o as ee,p as w,r as te,s as T,t as E,u as D}from"./settings-store-krC6bc79.js";import"./vendor-mermaid-BitiXJlL.js";import{n as O}from"./utils-Bmf_8h7Y.js";import"./portal-container-context-BarKmT4S.js";import"./panel-store-CboGJAwh.js";import{t as k}from"./window-store-UC1jJeLM.js";import{t as ne}from"./button-B9CTrsEf.js";import{a as re,i as A,n as j,o as M,r as N,t as P}from"./dialog-B84_DJQ8.js";import"./ws-auth-CEYVQ8NH.js";import{Bt as F,Gt as I,Ht as L,Jt as R,Kt as z,T as ie,Ut as ae,Vt as oe,Wt as B,Xt as se,Yt as V,qt as H,zt as U}from"./index-CEZVxM4G.js";import"./run-in-terminal-CdefEe_R.js";import{n as W,t as G}from"./remote-desktop-readiness-gate-t83fqbID.js";import{a as ce,c as le,h as K,i as ue,l as de,m as q,n as fe,o as J,p as pe,r as me,s as he,t as ge,u as Y}from"./remote-desktop-clipboard-notice-eXYvwgx7.js";var X=e(t(),1);function Z(e,t,n,r){let i=(0,X.useCallback)((n,r,i,a)=>{let o=e.current;if(!o)return;let{xFrac:s,yFrac:c}=Y(n,r,o.getBoundingClientRect());t({type:`pointer`,xFrac:s,yFrac:c,button:i,down:a})},[e,t]);(0,X.useEffect)(()=>{let a=e.current;if(!a||!n)return;let o=e=>e===0?`left`:e===2?`right`:null,s=()=>t({type:`releaseAll`}),c=null,l=0,u=()=>{l=0,c&&=(i(c.x,c.y,null,null),null)},d=()=>{l&&=(cancelAnimationFrame(l),0),c&&=(i(c.x,c.y,null,null),null)},f=e=>{e.preventDefault(),a.setPointerCapture(e.pointerId),a.focus(),d(),i(e.clientX,e.clientY,o(e.button),!0)},p=e=>{c={x:e.clientX,y:e.clientY},l||=requestAnimationFrame(u)},m=e=>{d(),i(e.clientX,e.clientY,o(e.button),!1)},h=e=>e.preventDefault(),g=!1,_=e=>{if(r&&K(e)){g=e.shiftKey;return}e.preventDefault(),t({type:`key`,code:e.code,down:!0}),r&&q(e)&&r.onCopyCombo()},v=e=>{r&&K(e)||(e.preventDefault(),t({type:`key`,code:e.code,down:!1}))},y=e=>{e.preventDefault();let t=e.clipboardData?.getData(`text/plain`);t&&r?.onPasteText(t,g),g=!1},b=()=>{document.hidden&&s()};return a.tabIndex=0,a.addEventListener(`pointerdown`,f),a.addEventListener(`pointermove`,p),a.addEventListener(`pointerup`,m),a.addEventListener(`contextmenu`,h),a.addEventListener(`keydown`,_),a.addEventListener(`keyup`,v),a.addEventListener(`paste`,y),a.addEventListener(`blur`,s),document.addEventListener(`visibilitychange`,b),()=>{l&&cancelAnimationFrame(l),a.removeEventListener(`pointerdown`,f),a.removeEventListener(`pointermove`,p),a.removeEventListener(`pointerup`,m),a.removeEventListener(`contextmenu`,h),a.removeEventListener(`keydown`,_),a.removeEventListener(`keyup`,v),a.removeEventListener(`blur`,s),document.removeEventListener(`visibilitychange`,b)}},[e,n,i,t,r])}var Q={h264_nvenc:`NVIDIA NVENC`,h264_qsv:`Intel QuickSync`,h264_vaapi:`VAAPI (GPU)`,h264_amf:`AMD AMF`,h264_videotoolbox:`Apple VideoToolbox`,libx264:`Software (x264)`};function _e(e){return Object.hasOwn(Q,e)?Q[e]:e}var $=n(),ve=`flex size-7 shrink-0 items-center justify-center rounded bg-black/40 text-white/70 outline-none hover:bg-black/60 hover:text-white data-[state=open]:bg-black/70 data-[state=open]:text-white`;function ye({displays:e,currentDisplayId:t,onSelectDisplay:n,quality:r,qualityChoice:i,onSetQuality:s,onOpenCustomQuality:l,codecs:h,codec:g,onSetCodec:_,hostModes:v,hostModeId:x,hostOriginalModeId:S,onSetHostMode:C,canResizeHost:ee,resolutionError:w,viewStyle:T,customScale:E,onSetViewStyle:D,onSetCustomScale:k,showCursor:ne,onSetShowCursor:re,audioOn:A,audioReason:j,onSetAudioOn:M,privacyOn:N,privacyReason:P,privacyCanBlank:ie,onSetPrivacyOn:W,recording:G,recordingElapsedSec:ce,recordingSupported:K,onToggleRecording:ue,onScreenshot:q,clipboardEnabled:fe,onSetClipboardEnabled:pe,statsVisible:me,onToggleStats:ge}){let Y=(0,X.useMemo)(()=>le(v),[v]),Z=(0,X.useMemo)(()=>he(),[]),Q=(0,X.useMemo)(()=>J(v,Z,x),[v,Z,x]),ye=!!(S&&S!==x),Se=t??e.find(e=>e.primary)?.id??e[0]?.id??``;return(0,$.jsxs)(`div`,{className:`absolute right-1 top-1 z-40 flex items-center gap-1`,"data-testid":`remote-desktop-toolbar`,children:[e.length>1&&(0,$.jsxs)(U,{children:[(0,$.jsx)(se,{className:ve,"aria-label":`Display`,title:`Display`,children:(0,$.jsx)(f,{className:`size-3.5`})}),(0,$.jsxs)(oe,{align:`end`,className:`w-64`,children:[(0,$.jsx)(ae,{children:`Display`}),(0,$.jsx)(B,{value:Se,onValueChange:n,children:e.map(e=>(0,$.jsxs)(I,{value:e.id,"data-testid":`remote-desktop-display-${e.id}`,children:[e.label,e.primary?` (main)`:``,` · `,e.width,`×`,e.height]},e.id))})]})]}),(0,$.jsxs)(U,{children:[(0,$.jsx)(se,{className:ve,"aria-label":`Display settings`,title:`Display settings`,"data-testid":`remote-desktop-settings-trigger`,children:(0,$.jsx)(u,{className:`size-3.5`})}),(0,$.jsxs)(oe,{align:`end`,className:`w-64`,children:[(0,$.jsx)(ae,{children:`Scale`}),(0,$.jsx)(B,{value:T,onValueChange:e=>D(e),children:b.map(e=>(0,$.jsx)(I,{value:e,"data-testid":`remote-desktop-view-style-${e}`,children:te[e]},e))}),T===`custom`&&(0,$.jsx)(xe,{scale:E,onSet:k}),(0,$.jsx)(z,{}),(0,$.jsxs)(H,{children:[(0,$.jsxs)(V,{"data-testid":`remote-desktop-quality-submenu`,children:[`Image quality`,r.held<1&&(0,$.jsxs)(`span`,{className:`ml-1.5 text-[10px] opacity-60`,"data-testid":`remote-desktop-quality-held`,children:[Math.round(r.held*100),`% — link limited`]})]}),(0,$.jsx)(R,{className:`w-56`,children:(0,$.jsxs)(B,{value:i,onValueChange:e=>e===`custom`?l():s(e),children:[m.map(e=>(0,$.jsx)(I,{value:e,"data-testid":`remote-desktop-quality-${e}`,children:y[e].label},e)),(0,$.jsx)(I,{value:`custom`,"data-testid":`remote-desktop-quality-custom`,children:`Custom…`})]})})]}),h.length>1&&(0,$.jsxs)(H,{children:[(0,$.jsx)(V,{"data-testid":`remote-desktop-codec-submenu`,children:`Codec`}),(0,$.jsx)(R,{className:`w-56`,children:(0,$.jsxs)(B,{value:g??`auto`,onValueChange:e=>_(e===`auto`?null:e),children:[(0,$.jsxs)(I,{value:`auto`,children:[`Auto · `,_e(h[0])]}),h.map(e=>(0,$.jsx)(I,{value:e,"data-testid":`remote-desktop-codec-${e}`,children:_e(e)},e))]})})]}),ee&&Y.length>1&&(0,$.jsxs)(H,{children:[(0,$.jsx)(V,{"data-testid":`remote-desktop-resolution-submenu`,children:`Resolution`}),(0,$.jsxs)(R,{className:`max-h-80 w-56 overflow-y-auto`,children:[ye&&S&&(0,$.jsx)(L,{onSelect:()=>C(S),"data-testid":`remote-desktop-resolution-original`,children:`Original`}),Q&&(0,$.jsxs)(L,{onSelect:()=>C(Q.id),"data-testid":`remote-desktop-resolution-fit-local`,children:[`Fit local `,Q.width,`×`,Q.height]}),(ye||Q)&&(0,$.jsx)(z,{}),(0,$.jsx)(B,{value:x??Y.find(e=>e.current)?.id??``,onValueChange:C,children:Y.map(e=>(0,$.jsxs)(I,{value:e.id,"data-testid":`remote-desktop-resolution-${e.width}x${e.height}`,children:[de(e),e.preferred&&(0,$.jsx)(`span`,{className:`ml-1.5 text-[10px] opacity-60`,children:`native`})]},e.id))}),w&&(0,$.jsx)(`div`,{className:`px-2 py-1.5 text-[10px] leading-tight text-destructive`,children:w})]})]}),(0,$.jsx)(z,{}),(0,$.jsx)(F,{checked:ne,onCheckedChange:re,"data-testid":`remote-desktop-show-cursor`,children:`Show remote cursor`}),(0,$.jsx)(F,{checked:fe,onCheckedChange:pe,"data-testid":`remote-desktop-clipboard-toggle`,children:`Sync clipboard`}),(0,$.jsx)(F,{checked:A,disabled:j!==null,onCheckedChange:M,"data-testid":`remote-desktop-audio-toggle`,children:(0,$.jsxs)(`span`,{className:`flex min-w-0 flex-col`,children:[(0,$.jsx)(`span`,{children:`Play host audio`}),j&&(0,$.jsx)(`span`,{className:`text-[10px] leading-tight text-muted-foreground`,children:j})]})}),(0,$.jsx)(z,{}),(0,$.jsx)(F,{checked:N,disabled:P!==null&&!N,onCheckedChange:W,"data-testid":`remote-desktop-privacy-toggle`,children:(0,$.jsxs)(`span`,{className:`flex min-w-0 flex-col`,children:[(0,$.jsx)(`span`,{children:`Privacy mode`}),(0,$.jsx)(`span`,{className:`text-[10px] leading-tight text-muted-foreground`,children:P??(ie?`Blocks the host's keyboard and mouse, and blanks its screen`:`Blocks the host's keyboard and mouse (its screen stays on)`)})]})}),(0,$.jsx)(z,{}),(0,$.jsxs)(L,{onSelect:q,"data-testid":`remote-desktop-screenshot`,children:[(0,$.jsx)(o,{className:`size-3.5`}),` Save screenshot`]}),K&&(0,$.jsx)(L,{onSelect:ue,"data-testid":`remote-desktop-record`,children:G?(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(c,{className:`size-3.5 text-red-500`}),` Stop recording · `,be(ce)]}):(0,$.jsxs)($.Fragment,{children:[(0,$.jsx)(p,{className:`size-3.5`}),` Start recording`]})})]})]}),N&&(0,$.jsxs)(`button`,{type:`button`,onClick:()=>W(!1),title:`Privacy mode is on — click to release the host`,"aria-label":`Turn privacy mode off`,className:`flex h-7 shrink-0 items-center gap-1 rounded bg-amber-500/85 px-1.5 text-[10px] font-medium text-black hover:bg-amber-400`,"data-testid":`remote-desktop-privacy-indicator`,children:[(0,$.jsx)(d,{className:`size-3`}),` Host locked`]}),G&&(0,$.jsxs)(`button`,{type:`button`,onClick:ue,title:`Stop recording`,"aria-label":`Stop recording`,className:`flex h-7 shrink-0 items-center gap-1 rounded bg-red-600/80 px-1.5 text-[10px] font-medium tabular-nums text-white hover:bg-red-600`,"data-testid":`remote-desktop-recording-indicator`,children:[(0,$.jsx)(`span`,{className:`size-1.5 animate-pulse rounded-full bg-white`}),be(ce)]}),(0,$.jsx)(`button`,{type:`button`,onClick:ge,"aria-label":`Toggle stats overlay`,"aria-pressed":me,title:`Quality monitor`,className:O(ve,me&&`bg-primary/70 text-primary-foreground hover:bg-primary/80`),children:(0,$.jsx)(a,{className:`size-3.5`})})]})}function be(e){let t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=String(e%60).padStart(2,`0`);return t>0?`${t}:${String(n).padStart(2,`0`)}:${r}`:`${n}:${r}`}function xe({scale:e,onSet:t}){let[n,i]=(0,X.useState)(null),a=(0,X.useRef)(null),o=T(Math.round(ee(e)*100)),s=n??o,c=g(s);(0,X.useEffect)(()=>()=>{a.current&&clearTimeout(a.current)},[]);let u=e=>{i(e),a.current&&clearTimeout(a.current),a.current=setTimeout(()=>{i(null),t(e/100)},300)},d=e=>t=>{t.preventDefault(),u(T(s+e*1))},f=`flex size-6 shrink-0 items-center justify-center rounded hover:bg-accent disabled:opacity-40`;return(0,$.jsx)(`div`,{className:`px-2 py-1.5`,"data-testid":`remote-desktop-zoom-row`,children:(0,$.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,$.jsx)(`button`,{type:`button`,className:f,onClick:d(-1),disabled:s<=5,"aria-label":`Decrease`,children:(0,$.jsx)(r,{className:`size-3.5`})}),(0,$.jsxs)(`span`,{className:`relative flex-1 py-2.5`,children:[(0,$.jsx)(`input`,{type:`range`,min:0,max:1,step:1/(C-5),value:c,"aria-label":`Scale`,"aria-valuetext":`${s}%`,"data-testid":`remote-desktop-zoom-slider`,onKeyDown:e=>e.stopPropagation(),onChange:e=>u(x(D(Number(e.target.value)))),className:`h-1 w-full cursor-pointer appearance-none rounded bg-accent accent-primary`}),(0,$.jsxs)(`span`,{className:`pointer-events-none absolute top-0 -translate-x-1/2 rounded bg-primary px-1.5 text-[10px] leading-4 tabular-nums text-primary-foreground`,style:{left:`${c*100}%`},"data-testid":`remote-desktop-zoom-value`,children:[s,`%`]})]}),(0,$.jsx)(`button`,{type:`button`,className:f,onClick:d(1),disabled:s>=C,"aria-label":`Increase`,children:(0,$.jsx)(l,{className:`size-3.5`})})]})})}var Se=400;function Ce({open:e,onOpenChange:t,percent:n,fps:r,more:i,onSetMore:a,onCommit:o,frameSize:s}){let[c,l]=(0,X.useState)(n),[u,d]=(0,X.useState)(r),f=(0,X.useRef)(null);(0,X.useEffect)(()=>{e&&(l(n),d(r))},[e,n,r]),(0,X.useEffect)(()=>()=>{f.current&&clearTimeout(f.current)},[]);let p=i?_:100,m=(e,t)=>{f.current&&clearTimeout(f.current),f.current=setTimeout(()=>o(e,t),Se)},h=e=>{let t=w(e,i);l(t),m(t,u)},g=e=>{let t=v(e);d(t),m(c,t)},y=e=>{a(e);let t=w(c,e);t!==c&&(l(t),m(t,u))},b=S(c,s.width,s.height);return(0,$.jsx)(P,{open:e,onOpenChange:t,children:(0,$.jsxs)(j,{className:`sm:max-w-md`,"data-testid":`remote-desktop-custom-quality-dialog`,children:[(0,$.jsxs)(re,{children:[(0,$.jsx)(M,{children:`Custom image quality`}),(0,$.jsx)(N,{children:s.width>0?`${c}% of the base rate for ${s.width}×${s.height} — about ${(b/1e3).toFixed(1)} Mbit/s`:`Waiting for the first frame`})]}),(0,$.jsxs)(`div`,{className:`space-y-4 py-2`,children:[(0,$.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,$.jsx)(`input`,{type:`range`,min:10,max:p,step:1,value:Math.min(c,p),onChange:e=>h(Number(e.target.value)),"aria-label":`Bitrate`,"data-testid":`remote-desktop-custom-bitrate`,className:`h-1 min-w-0 flex-1 cursor-pointer appearance-none rounded bg-accent accent-primary`}),(0,$.jsxs)(`span`,{className:`w-14 text-right text-xs tabular-nums`,children:[c,`%`]}),(0,$.jsx)(`span`,{className:`w-14 text-xs text-muted-foreground`,children:`Bitrate`}),(0,$.jsxs)(`label`,{className:`flex shrink-0 items-center gap-1.5 text-xs`,children:[(0,$.jsx)(`input`,{type:`checkbox`,checked:i,onChange:e=>y(e.target.checked),"data-testid":`remote-desktop-custom-more`,className:`size-3.5 accent-primary`}),`More`]})]}),(0,$.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,$.jsx)(`input`,{type:`range`,min:5,max:120,step:1,value:u,onChange:e=>g(Number(e.target.value)),"aria-label":`FPS`,"data-testid":`remote-desktop-custom-fps`,className:`h-1 min-w-0 flex-1 cursor-pointer appearance-none rounded bg-accent accent-primary`}),(0,$.jsx)(`span`,{className:`w-14 text-right text-xs tabular-nums`,children:u}),(0,$.jsx)(`span`,{className:`w-14 text-xs text-muted-foreground`,children:`FPS`}),(0,$.jsx)(`span`,{className:`w-[4.25rem] shrink-0`,"aria-hidden":!0})]})]}),(0,$.jsx)(A,{children:(0,$.jsx)(ne,{onClick:()=>t(!1),children:`Close`})})]})})}function we({id:e}){let t=k(e=>e.close),n=(0,X.useCallback)(()=>t(e),[t,e]);return(0,$.jsx)(W,{onCancel:n,children:(0,$.jsx)(G,{onCancel:n,children:(0,$.jsx)(Te,{})})})}function Te(){let e=(0,X.useRef)(null),t=fe(),{connState:n,errorMessage:r,decoderStatus:a,decoderErrorMessage:o,sendMessage:c,reconnect:l,getFrameCount:u,getTotalBytes:d,frameSize:f,quality:p,setQuality:m,setCustomQuality:g,showCursor:_,setShowCursor:v,codec:y,setCodec:b,audioOn:x,setAudioOn:S,getAudioTracks:C,privacyOn:ee,privacyError:w,setPrivacyOn:te,hostModeId:T,hostOriginalModeId:D,resolutionError:k,setHostMode:ne,pendingHostClipboard:re,clearHostClipboard:A,sendClipboard:j,requestHostClipboard:M}=pe(e,{displayId:t.displayId}),N=E(e=>e.remoteDesktopStatsVisible),P=E(e=>e.toggleRemoteDesktopStatsVisible),F=E(e=>e.remoteDesktopViewStyle),I=E(e=>e.remoteDesktopCustomScale),L=E(e=>e.setRemoteDesktopViewStyle),R=E(e=>e.setRemoteDesktopCustomScale),z=E(e=>e.remoteDesktopClipboardSync),ae=E(e=>e.remoteDesktopQuality),oe=E(e=>e.remoteDesktopCustomQualityPercent),B=E(e=>e.remoteDesktopCustomFps),se=E(e=>e.remoteDesktopCustomQualityMore),V=E(e=>e.setRemoteDesktopCustomQualityMore),[H,U]=(0,X.useState)(!1),W=E(e=>e.setRemoteDesktopClipboardSync),{caps:G}=ie(!1),[le,K]=(0,X.useState)(!1),de=(0,X.useMemo)(()=>z?{onPasteText:(e,t)=>{K(!0),j(e,!0,t)},onCopyCombo:M}:void 0,[z,j,M]);Z(e,c,n===`streaming`,de);let q=ue(e,C),J=h(F,I,f),he=a===`unsupported`?o:n===`error`?r:n===`closed`?`Disconnected`:n===`connecting`?`Connecting…`:null;return(0,$.jsxs)(`div`,{className:`relative flex h-full w-full items-center justify-center bg-black`,"data-testid":`remote-desktop-window`,"data-conn-state":n,children:[(0,$.jsx)(`div`,{className:O(`flex h-full w-full`,J?`overflow-auto`:`overflow-hidden`),children:(0,$.jsx)(`canvas`,{ref:e,"data-testid":`remote-desktop-canvas`,"data-view-style":F,className:O(`m-auto outline-none`,!J&&`max-h-full max-w-full`),style:J?{width:J.width,height:J.height}:void 0})}),(0,$.jsx)(me,{canvasRef:e,getFrameCount:u,getTotalBytes:d}),(0,$.jsx)(ye,{displays:t.displays,currentDisplayId:t.current?.id,onSelectDisplay:t.select,quality:p,qualityChoice:ae,onSetQuality:m,onOpenCustomQuality:()=>U(!0),codecs:G?.encoders??[],codec:y,onSetCodec:b,hostModes:G?.resolutions?.modes??[],hostModeId:T,hostOriginalModeId:D,onSetHostMode:ne,canResizeHost:G?.inputReady??!1,resolutionError:k,viewStyle:F,customScale:I,onSetViewStyle:L,onSetCustomScale:R,showCursor:_,onSetShowCursor:v,audioOn:x,audioReason:G&&!G.audio.available?G.audio.reason:null,onSetAudioOn:S,privacyOn:ee,privacyReason:w??(G&&!G.privacy.available?G.privacy.reason:null),privacyCanBlank:G?.privacy?.canBlank??!1,onSetPrivacyOn:te,recording:q.recording,recordingElapsedSec:q.elapsedSec,recordingSupported:q.supported,onToggleRecording:q.toggle,onScreenshot:()=>void ce(e.current),clipboardEnabled:z,onSetClipboardEnabled:W,statsVisible:N,onToggleStats:P}),(0,$.jsx)(ge,{pendingText:re,onDismiss:A,missingToolAction:le&&G&&!G.clipboard.available?G.clipboard.action:null,onDismissMissingTool:()=>K(!1)}),(0,$.jsx)(Ce,{open:H,onOpenChange:U,percent:oe,fps:B,more:se,onSetMore:V,onCommit:g,frameSize:f}),he&&(0,$.jsxs)(`div`,{className:`absolute inset-0 flex flex-col items-center justify-center gap-3 bg-black/70 text-sm text-white`,children:[(0,$.jsx)(i,{className:`size-6 opacity-70`}),(0,$.jsx)(`span`,{className:`max-w-sm text-center px-4`,children:he}),(n===`error`||n===`closed`)&&a!==`unsupported`&&(0,$.jsxs)(`button`,{onClick:l,className:`flex items-center gap-1.5 rounded-md bg-white/10 px-3 py-1.5 hover:bg-white/20`,children:[(0,$.jsx)(s,{className:`size-3.5`}),` Reconnect`]})]})]})}export{we as default};