@hienlh/ppm 0.23.21 → 0.23.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/CLAUDE.md +3 -2
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/cli-reference.md +4 -4
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/dist/web/assets/{accounts-settings-section-DD88DRdx.js → accounts-settings-section-CiNmIj02.js} +1 -1
- package/dist/web/assets/accounts-settings-section-CiNmIj02.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-CiNmIj02.js.gz +0 -0
- package/dist/web/assets/{agent-session-sheet-C0PhhLKR.js → agent-session-sheet-DRR36PDA.js} +2 -2
- package/dist/web/assets/agent-session-sheet-DRR36PDA.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-DRR36PDA.js.gz +0 -0
- package/dist/web/assets/{agent-session-window-content-D0XZgh4U.js → agent-session-window-content-DMhy16BM.js} +1 -1
- package/dist/web/assets/agent-session-window-content-DMhy16BM.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-DMhy16BM.js.gz +0 -0
- package/dist/web/assets/{ai-resource-editor-CpfQB6A7.js → ai-resource-editor-BG8boPw7.js} +1 -1
- package/dist/web/assets/ai-resource-editor-BG8boPw7.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-BG8boPw7.js.gz +0 -0
- package/dist/web/assets/{ai-settings-section-CQWBwWcM.js → ai-settings-section-DMGM1hYx.js} +1 -1
- package/dist/web/assets/ai-settings-section-DMGM1hYx.js.br +0 -0
- package/dist/web/assets/ai-settings-section-DMGM1hYx.js.gz +0 -0
- package/dist/web/assets/{ai-settings-section-DqE67XNC.js → ai-settings-section-De5dYWlC.js} +1 -1
- package/dist/web/assets/{android-tab-4Z4AgHz1.js → android-tab-lHDxD93G.js} +1 -1
- package/dist/web/assets/android-tab-lHDxD93G.js.br +0 -0
- package/dist/web/assets/android-tab-lHDxD93G.js.gz +0 -0
- package/dist/web/assets/{appearance-settings-section-DjQjiJF7.js → appearance-settings-section-DO-ZyoMj.js} +1 -1
- package/dist/web/assets/appearance-settings-section-DO-ZyoMj.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-DO-ZyoMj.js.gz +0 -0
- package/dist/web/assets/{apps-panel-_lxY9xbc.js → apps-panel-CH-0CHYY.js} +1 -1
- package/dist/web/assets/apps-panel-CH-0CHYY.js.br +0 -0
- package/dist/web/assets/apps-panel-CH-0CHYY.js.gz +0 -0
- package/dist/web/assets/{branch-review-tab-BzrhnFSs.js → branch-review-tab-CdGtvekz.js} +1 -1
- package/dist/web/assets/branch-review-tab-CdGtvekz.js.br +0 -0
- package/dist/web/assets/branch-review-tab-CdGtvekz.js.gz +0 -0
- package/dist/web/assets/{chat-tab-BKHepkYi.js → chat-tab-DMqWnFIo.js} +1 -1
- package/dist/web/assets/chat-tab-DMqWnFIo.js.br +0 -0
- package/dist/web/assets/chat-tab-DMqWnFIo.js.gz +0 -0
- package/dist/web/assets/{chat-tab-Cv8gYzcA.js → chat-tab-DzWpwPFb.js} +3 -3
- package/dist/web/assets/chat-tab-DzWpwPFb.js.br +0 -0
- package/dist/web/assets/chat-tab-DzWpwPFb.js.gz +0 -0
- package/dist/web/assets/{code-editor-COWmNXO4.js → code-editor-BCv8ONNS.js} +4 -4
- package/dist/web/assets/code-editor-BCv8ONNS.js.br +0 -0
- package/dist/web/assets/code-editor-BCv8ONNS.js.gz +0 -0
- package/dist/web/assets/{codex-reset-credit-button-BHt4yJet.js → codex-reset-credit-button-CGMbIHak.js} +1 -1
- package/dist/web/assets/codex-reset-credit-button-CGMbIHak.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-CGMbIHak.js.gz +0 -0
- package/dist/web/assets/{conflict-editor-tj-1gzKr.js → conflict-editor-3WmzqBlW.js} +1 -1
- package/dist/web/assets/conflict-editor-3WmzqBlW.js.br +0 -0
- package/dist/web/assets/conflict-editor-3WmzqBlW.js.gz +0 -0
- package/dist/web/assets/{connection-form-tab-BV2QX8Cf.js → connection-form-tab-BoWucvAe.js} +1 -1
- package/dist/web/assets/connection-form-tab-BoWucvAe.js.br +0 -0
- package/dist/web/assets/connection-form-tab-BoWucvAe.js.gz +0 -0
- package/dist/web/assets/{csv-preview-xhE2esgz.js → csv-preview-BCgGsy7F.js} +1 -1
- package/dist/web/assets/csv-preview-BCgGsy7F.js.br +0 -0
- package/dist/web/assets/csv-preview-BCgGsy7F.js.gz +0 -0
- package/dist/web/assets/{db-tab-parts-C3MsjOID.js → db-tab-parts-o6QMHBbA.js} +1 -1
- package/dist/web/assets/db-tab-parts-o6QMHBbA.js.br +0 -0
- package/dist/web/assets/db-tab-parts-o6QMHBbA.js.gz +0 -0
- package/dist/web/assets/{design-settings-section-C3LxYhIw.js → design-settings-section-seo6SdSk.js} +1 -1
- package/dist/web/assets/design-settings-section-seo6SdSk.js.br +0 -0
- package/dist/web/assets/design-settings-section-seo6SdSk.js.gz +0 -0
- package/dist/web/assets/{design-tab-DYcvjdfb.js → design-tab-B-f_b2LM.js} +1 -1
- package/dist/web/assets/design-tab-B-f_b2LM.js.br +0 -0
- package/dist/web/assets/design-tab-B-f_b2LM.js.gz +0 -0
- package/dist/web/assets/{designs-sidebar-panel-Dpr4PPFT.js → designs-sidebar-panel-CVT_TQP7.js} +1 -1
- package/dist/web/assets/designs-sidebar-panel-CVT_TQP7.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-CVT_TQP7.js.gz +0 -0
- package/dist/web/assets/{diff-viewer-Fl_4jqr6.js → diff-viewer-y9uBp_8u.js} +1 -1
- package/dist/web/assets/diff-viewer-y9uBp_8u.js.br +0 -0
- package/dist/web/assets/diff-viewer-y9uBp_8u.js.gz +0 -0
- package/dist/web/assets/{docx-preview-bVE9shPX.js → docx-preview-Dn_x3Inm.js} +1 -1
- package/dist/web/assets/docx-preview-Dn_x3Inm.js.br +0 -0
- package/dist/web/assets/docx-preview-Dn_x3Inm.js.gz +0 -0
- package/dist/web/assets/{editor-dialog-eEOYWdbr.js → editor-dialog-BwNXSajD.js} +1 -1
- package/dist/web/assets/editor-dialog-BwNXSajD.js.br +0 -0
- package/dist/web/assets/editor-dialog-BwNXSajD.js.gz +0 -0
- package/dist/web/assets/{editor-language-service-D1_Ggq4s.js → editor-language-service-XA_TnPLN.js} +1 -1
- package/dist/web/assets/editor-language-service-XA_TnPLN.js.br +0 -0
- package/dist/web/assets/editor-language-service-XA_TnPLN.js.gz +0 -0
- package/dist/web/assets/{explorer-body-C0UOcBPJ.js → explorer-body-DukR7zM9.js} +1 -1
- package/dist/web/assets/explorer-body-DukR7zM9.js.br +0 -0
- package/dist/web/assets/explorer-body-DukR7zM9.js.gz +0 -0
- package/dist/web/assets/{explorer-window-content-Dxee7SuJ.js → explorer-window-content-BjTZ44S3.js} +1 -1
- package/dist/web/assets/explorer-window-content-BjTZ44S3.js.br +0 -0
- package/dist/web/assets/explorer-window-content-BjTZ44S3.js.gz +0 -0
- package/dist/web/assets/{extension-manager-section-D8krnoj8.js → extension-manager-section-C4WD1BPQ.js} +1 -1
- package/dist/web/assets/extension-manager-section-C4WD1BPQ.js.br +0 -0
- package/dist/web/assets/extension-manager-section-C4WD1BPQ.js.gz +0 -0
- package/dist/web/assets/{extension-webview-CtIdV69T.js → extension-webview-CV2ujflc.js} +1 -1
- package/dist/web/assets/extension-webview-CV2ujflc.js.br +0 -0
- package/dist/web/assets/extension-webview-CV2ujflc.js.gz +0 -0
- package/dist/web/assets/{files-settings-section-C8vtarR8.js → files-settings-section-hS5ixQ8o.js} +1 -1
- package/dist/web/assets/files-settings-section-hS5ixQ8o.js.br +0 -0
- package/dist/web/assets/files-settings-section-hS5ixQ8o.js.gz +0 -0
- package/dist/web/assets/{general-settings-section-Chu8Ut8h.js → general-settings-section-BnKYY0AA.js} +1 -1
- package/dist/web/assets/general-settings-section-BnKYY0AA.js.br +0 -0
- package/dist/web/assets/general-settings-section-BnKYY0AA.js.gz +0 -0
- package/dist/web/assets/{git-log-panel-DG09p6k5.js → git-log-panel-JiWfR5xv.js} +1 -1
- package/dist/web/assets/git-log-panel-JiWfR5xv.js.br +0 -0
- package/dist/web/assets/git-log-panel-JiWfR5xv.js.gz +0 -0
- package/dist/web/assets/{git-review-tab-CSy8DjSC.js → git-review-tab-DgvcY__Q.js} +1 -1
- package/dist/web/assets/git-review-tab-DgvcY__Q.js.br +0 -0
- package/dist/web/assets/git-review-tab-DgvcY__Q.js.gz +0 -0
- package/dist/web/assets/{glide-data-grid-BN1y4BT0.js → glide-data-grid-r1MKxDjz.js} +1 -1
- package/dist/web/assets/glide-data-grid-r1MKxDjz.js.br +0 -0
- package/dist/web/assets/glide-data-grid-r1MKxDjz.js.gz +0 -0
- package/dist/web/assets/{grid-save-dialog-CfSuWw2t.js → grid-save-dialog-Fa0yA-Ep.js} +1 -1
- package/dist/web/assets/grid-save-dialog-Fa0yA-Ep.js.br +0 -0
- package/dist/web/assets/grid-save-dialog-Fa0yA-Ep.js.gz +0 -0
- package/dist/web/assets/{group-chat-tab-B04QMp7A.js → group-chat-tab-B2Q8yqSX.js} +1 -1
- package/dist/web/assets/group-chat-tab-B2Q8yqSX.js.br +0 -0
- package/dist/web/assets/group-chat-tab-B2Q8yqSX.js.gz +0 -0
- package/dist/web/assets/{impexp-tab-BRNouquR.js → impexp-tab-B8Ht4l32.js} +1 -1
- package/dist/web/assets/impexp-tab-B8Ht4l32.js.br +0 -0
- package/dist/web/assets/impexp-tab-B8Ht4l32.js.gz +0 -0
- package/dist/web/assets/{index-BpgSIM5B.js → index-BtAn_krv.js} +5 -5
- package/dist/web/assets/index-BtAn_krv.js.br +0 -0
- package/dist/web/assets/index-BtAn_krv.js.gz +0 -0
- package/dist/web/assets/{jira-watcher-section-CJeS5r6D.js → jira-watcher-section--ibKZfBs.js} +1 -1
- package/dist/web/assets/{keybindings-store-Dvxq-vZD.js → keybindings-store-Cwxl4tHv.js} +1 -1
- package/dist/web/assets/{keyboard-shortcuts-section-BKDyZHhK.js → keyboard-shortcuts-section-aoiLpWwf.js} +1 -1
- package/dist/web/assets/keyboard-shortcuts-section-aoiLpWwf.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-aoiLpWwf.js.gz +0 -0
- package/dist/web/assets/{language-servers-section-CbbkezhA.js → language-servers-section-BkGAezo6.js} +2 -2
- package/dist/web/assets/language-servers-section-BkGAezo6.js.br +0 -0
- package/dist/web/assets/language-servers-section-BkGAezo6.js.gz +0 -0
- package/dist/web/assets/{logs-app-Blr1-v4q.js → logs-app-DYgPtmjm.js} +1 -1
- package/dist/web/assets/logs-app-DYgPtmjm.js.br +0 -0
- package/dist/web/assets/logs-app-DYgPtmjm.js.gz +0 -0
- package/dist/web/assets/{logs-tab-CGPtn2tU.js → logs-tab-BbDosK63.js} +1 -1
- package/dist/web/assets/{logs-window-content-DAczcNmh.js → logs-window-content-CEXAyv-f.js} +1 -1
- package/dist/web/assets/{lsp-client-Ds3U2O52.js → lsp-client-CIcphNmU.js} +1 -1
- package/dist/web/assets/lsp-client-CIcphNmU.js.br +0 -0
- package/dist/web/assets/lsp-client-CIcphNmU.js.gz +0 -0
- package/dist/web/assets/{markdown-renderer-DbJVwfUH.js → markdown-renderer-BNzQeoAO.js} +1 -1
- package/dist/web/assets/{markdown-renderer-DzCPadpB.js → markdown-renderer-dk1w3goH.js} +1 -1
- package/dist/web/assets/markdown-renderer-dk1w3goH.js.br +0 -0
- package/dist/web/assets/markdown-renderer-dk1w3goH.js.gz +0 -0
- package/dist/web/assets/{mobile-explorer-sheet-BClCMXb8.js → mobile-explorer-sheet-D4lPZQZc.js} +1 -1
- package/dist/web/assets/mobile-explorer-sheet-D4lPZQZc.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-D4lPZQZc.js.gz +0 -0
- package/dist/web/assets/{new-design-dialog-HRP9H11v.js → new-design-dialog-CIq7xspW.js} +1 -1
- package/dist/web/assets/new-design-dialog-CIq7xspW.js.br +0 -0
- package/dist/web/assets/new-design-dialog-CIq7xspW.js.gz +0 -0
- package/dist/web/assets/{notification-store-BomzYNQj.js → notification-store-Rv36noYX.js} +1 -1
- package/dist/web/assets/notifications-settings-section-CoWMtXCC.js +1 -0
- package/dist/web/assets/notifications-settings-section-CoWMtXCC.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-CoWMtXCC.js.gz +0 -0
- package/dist/web/assets/{ppmbot-settings-section-BRowIIqc.js → ppmbot-settings-section-Ct0UwA6T.js} +1 -1
- package/dist/web/assets/ppmbot-settings-section-Ct0UwA6T.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-Ct0UwA6T.js.gz +0 -0
- package/dist/web/assets/{problems-panel-DdB10Ybd.js → problems-panel-D-HT-0PE.js} +1 -1
- package/dist/web/assets/problems-panel-D-HT-0PE.js.br +0 -0
- package/dist/web/assets/problems-panel-D-HT-0PE.js.gz +0 -0
- package/dist/web/assets/{process-table-CzLaWPe0.js → process-table-CXN0s4Pq.js} +1 -1
- package/dist/web/assets/process-table-CXN0s4Pq.js.br +0 -0
- package/dist/web/assets/process-table-CXN0s4Pq.js.gz +0 -0
- package/dist/web/assets/{proxy-settings-section-BCq7R5DA.js → proxy-settings-section-e6WWzP8n.js} +1 -1
- package/dist/web/assets/proxy-settings-section-e6WWzP8n.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-e6WWzP8n.js.gz +0 -0
- package/dist/web/assets/{query-tab-DGvj_h6l.js → query-tab-C7C67t8F.js} +1 -1
- package/dist/web/assets/query-tab-C7C67t8F.js.br +0 -0
- package/dist/web/assets/{query-tab-DGvj_h6l.js.gz → query-tab-C7C67t8F.js.gz} +0 -0
- package/dist/web/assets/{remote-access-settings-section-BrqOoOyk.js → remote-access-settings-section-gGoATCF9.js} +1 -1
- package/dist/web/assets/remote-access-settings-section-gGoATCF9.js.br +0 -0
- package/dist/web/assets/remote-access-settings-section-gGoATCF9.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-clipboard-notice-5r6UbdlN.js → remote-desktop-clipboard-notice-D5KjvMZx.js} +1 -1
- package/dist/web/assets/remote-desktop-clipboard-notice-D5KjvMZx.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-D5KjvMZx.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-mobile-sheet-B9Q4auqe.js → remote-desktop-mobile-sheet-CY_DsGXZ.js} +2 -2
- package/dist/web/assets/remote-desktop-mobile-sheet-CY_DsGXZ.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-CY_DsGXZ.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-mobile-view-CL-jrkA8.js → remote-desktop-mobile-view-DdpI-RF8.js} +1 -1
- package/dist/web/assets/remote-desktop-mobile-view-DdpI-RF8.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DdpI-RF8.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-readiness-gate-DXEf2Jnz.js → remote-desktop-readiness-gate-WIyCCAv5.js} +1 -1
- package/dist/web/assets/remote-desktop-readiness-gate-WIyCCAv5.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-WIyCCAv5.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-window-content-20P6-gKB.js → remote-desktop-window-content-BMORZLZt.js} +1 -1
- package/dist/web/assets/remote-desktop-window-content-BMORZLZt.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-BMORZLZt.js.gz +0 -0
- package/dist/web/assets/{rename-object-dialog-Bs7pUsUP.js → rename-object-dialog-pIgWe_AL.js} +1 -1
- package/dist/web/assets/rename-object-dialog-pIgWe_AL.js.br +0 -0
- package/dist/web/assets/rename-object-dialog-pIgWe_AL.js.gz +0 -0
- package/dist/web/assets/{review-code-Bjo4sHN9.js → review-code-oTNcTYlI.js} +1 -1
- package/dist/web/assets/review-code-oTNcTYlI.js.br +0 -0
- package/dist/web/assets/review-code-oTNcTYlI.js.gz +0 -0
- package/dist/web/assets/{save-as-dialog-BHx0Wp2B.js → save-as-dialog-CnPLGTaL.js} +1 -1
- package/dist/web/assets/save-as-dialog-CnPLGTaL.js.br +0 -0
- package/dist/web/assets/save-as-dialog-CnPLGTaL.js.gz +0 -0
- package/dist/web/assets/{schedules-settings-section-C6ATYDPK.js → schedules-settings-section-CREqHG_i.js} +1 -1
- package/dist/web/assets/schedules-settings-section-CREqHG_i.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-CREqHG_i.js.gz +0 -0
- package/dist/web/assets/{session-review-tab-BPMUyNTx.js → session-review-tab-nFVJYYJH.js} +1 -1
- package/dist/web/assets/session-review-tab-nFVJYYJH.js.br +0 -0
- package/dist/web/assets/session-review-tab-nFVJYYJH.js.gz +0 -0
- package/dist/web/assets/{settings-body-Dy5D6Vu7.js → settings-body-DNzH0wOQ.js} +1 -1
- package/dist/web/assets/settings-body-DNzH0wOQ.js.br +0 -0
- package/dist/web/assets/settings-body-DNzH0wOQ.js.gz +0 -0
- package/dist/web/assets/{settings-rows-BRoYE2To.js → settings-rows-D02_4sDY.js} +1 -1
- package/dist/web/assets/settings-rows-D02_4sDY.js.br +0 -0
- package/dist/web/assets/settings-rows-D02_4sDY.js.gz +0 -0
- package/dist/web/assets/settings-section-content-BYW_9mHv.js +1 -0
- package/dist/web/assets/{settings-section-content-essUViKu.js → settings-section-content-DWopMfmq.js} +2 -2
- package/dist/web/assets/settings-section-content-DWopMfmq.js.br +0 -0
- package/dist/web/assets/settings-section-content-DWopMfmq.js.gz +0 -0
- package/dist/web/assets/{settings-tab-Di1DUP1j.js → settings-tab-Cg0v5kO7.js} +1 -1
- package/dist/web/assets/{settings-window-content-DYvYFPWy.js → settings-window-content-CqhwxJJn.js} +1 -1
- package/dist/web/assets/{slash-command-picker-8da30mYP.js → slash-command-picker-Bcizxvbh.js} +1 -1
- package/dist/web/assets/slash-command-picker-Bcizxvbh.js.br +0 -0
- package/dist/web/assets/slash-command-picker-Bcizxvbh.js.gz +0 -0
- package/dist/web/assets/{sql-object-tab-DRIHVXuR.js → sql-object-tab-b1Z2zVBm.js} +1 -1
- package/dist/web/assets/sql-object-tab-b1Z2zVBm.js.br +0 -0
- package/dist/web/assets/sql-object-tab-b1Z2zVBm.js.gz +0 -0
- package/dist/web/assets/{sqlite-viewer-G-Jl2yEr.js → sqlite-viewer-DhPv28tq.js} +1 -1
- package/dist/web/assets/sqlite-viewer-DhPv28tq.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-DhPv28tq.js.gz +0 -0
- package/dist/web/assets/{structure-save-dialog-Cwikz0we.js → structure-save-dialog-sGUpqs8D.js} +1 -1
- package/dist/web/assets/structure-save-dialog-sGUpqs8D.js.br +0 -0
- package/dist/web/assets/structure-save-dialog-sGUpqs8D.js.gz +0 -0
- package/dist/web/assets/{structure-tab-CWEgdZPm.js → structure-tab-Bo2OmDOc.js} +1 -1
- package/dist/web/assets/structure-tab-Bo2OmDOc.js.br +0 -0
- package/dist/web/assets/structure-tab-Bo2OmDOc.js.gz +0 -0
- package/dist/web/assets/{system-monitor-body-BDQm9-wb.js → system-monitor-body-C475Et9u.js} +2 -2
- package/dist/web/assets/system-monitor-body-C475Et9u.js.br +0 -0
- package/dist/web/assets/{system-monitor-body-BDQm9-wb.js.gz → system-monitor-body-C475Et9u.js.gz} +0 -0
- package/dist/web/assets/{system-monitor-tab-BouN21Yh.js → system-monitor-tab-Cm52yoW8.js} +1 -1
- package/dist/web/assets/{system-monitor-window-content-BRyWBSOb.js → system-monitor-window-content-YYsGHxZF.js} +1 -1
- package/dist/web/assets/{tab-host-window-content-CZ55-bTz.js → tab-host-window-content-BKI6QoDa.js} +1 -1
- package/dist/web/assets/tab-host-window-content-BKI6QoDa.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-BKI6QoDa.js.gz +0 -0
- package/dist/web/assets/{table-tab-Bmn4UdBV.js → table-tab-D-nKWMJR.js} +1 -1
- package/dist/web/assets/table-tab-D-nKWMJR.js.br +0 -0
- package/dist/web/assets/table-tab-D-nKWMJR.js.gz +0 -0
- package/dist/web/assets/{telegram-bot-token-field-fdHwRf39.js → telegram-bot-token-field-BeNS2X2k.js} +1 -1
- package/dist/web/assets/telegram-bot-token-field-BeNS2X2k.js.br +0 -0
- package/dist/web/assets/telegram-bot-token-field-BeNS2X2k.js.gz +0 -0
- package/dist/web/assets/{terminal-tab-D-qlZXLK.js → terminal-tab-BbP753Ab.js} +1 -1
- package/dist/web/assets/terminal-tab-BbP753Ab.js.br +0 -0
- package/dist/web/assets/terminal-tab-BbP753Ab.js.gz +0 -0
- package/dist/web/assets/{tool-cards-BdXbQ9Fv.js → tool-cards-Dh8Ekn2W.js} +2 -2
- package/dist/web/assets/tool-cards-Dh8Ekn2W.js.br +0 -0
- package/dist/web/assets/tool-cards-Dh8Ekn2W.js.gz +0 -0
- package/dist/web/assets/{tools-settings-section-CcPaspbR.js → tools-settings-section-DGZRIULE.js} +1 -1
- package/dist/web/assets/tools-settings-section-DGZRIULE.js.br +0 -0
- package/dist/web/assets/tools-settings-section-DGZRIULE.js.gz +0 -0
- package/dist/web/assets/{use-inline-blame-Ck5XoSS3.js → use-inline-blame-BxwM-Wkj.js} +1 -1
- package/dist/web/assets/use-inline-blame-BxwM-Wkj.js.br +0 -0
- package/dist/web/assets/use-inline-blame-BxwM-Wkj.js.gz +0 -0
- package/dist/web/assets/{use-lsp-CGSqfFBk.js → use-lsp-BqvwRKmM.js} +1 -1
- package/dist/web/assets/use-lsp-BqvwRKmM.js.br +0 -0
- package/dist/web/assets/use-lsp-BqvwRKmM.js.gz +0 -0
- package/dist/web/assets/{use-monaco-theme-BW05eZS4.js → use-monaco-theme-DU0EpDHH.js} +1 -1
- package/dist/web/assets/{use-process-kill-DJ_f7rCO.js → use-process-kill-CVN_c4KF.js} +1 -1
- package/dist/web/assets/use-process-kill-CVN_c4KF.js.br +0 -0
- package/dist/web/assets/use-process-kill-CVN_c4KF.js.gz +0 -0
- package/dist/web/assets/{use-sql-schema-info-wt320fVR.js → use-sql-schema-info-C0wBmR6-.js} +1 -1
- package/dist/web/assets/use-sql-schema-info-C0wBmR6-.js.br +0 -0
- package/dist/web/assets/use-sql-schema-info-C0wBmR6-.js.gz +0 -0
- package/dist/web/assets/{use-websocket-CTwe74Cb.js → use-websocket-K0OUXbbY.js} +1 -1
- package/dist/web/assets/{web-preview-tab-D4XayUEK.js → web-preview-tab-DOgLv8Gt.js} +1 -1
- package/dist/web/assets/{web-preview-tab-D4XayUEK.js.br → web-preview-tab-DOgLv8Gt.js.br} +0 -0
- package/dist/web/assets/web-preview-tab-DOgLv8Gt.js.gz +0 -0
- package/dist/web/index.html +1 -1
- package/dist/web/index.html.br +0 -0
- package/dist/web/index.html.gz +0 -0
- package/dist/web/sw.js +1 -1
- package/dist/web/sw.js.br +0 -0
- package/dist/web/sw.js.gz +0 -0
- package/docs/deployment-guide.md +39 -0
- package/package.json +1 -1
- package/scripts/mem-diag-report.ts +31 -0
- package/src/providers/registry.ts +10 -1
- package/src/server/index.ts +7 -6
- package/src/server/middleware/access-log.ts +3 -0
- package/src/server/middleware/cors-headers.ts +44 -0
- package/src/server/routes/chat.ts +4 -1
- package/src/server/routes/database-impexp.ts +1 -1
- package/src/server/routes/design-preview.ts +2 -2
- package/src/server/ws/chat.ts +3 -0
- package/src/services/compact-segment.ts +14 -19
- package/src/services/database/grid-export-tickets.ts +6 -2
- package/src/services/database/impexp/readers/file-text.ts +6 -3
- package/src/services/edge-forwarder.ts +12 -0
- package/src/services/file-chunks.ts +39 -0
- package/src/services/file-lines.ts +10 -17
- package/src/services/lsp/lsp-manager.ts +3 -0
- package/src/services/memory-diagnostics-native.ts +110 -0
- package/src/services/memory-diagnostics-report.ts +200 -0
- package/src/services/memory-diagnostics-requests.ts +95 -0
- package/src/services/memory-diagnostics-spawns.ts +242 -0
- package/src/services/memory-diagnostics.ts +121 -23
- package/src/services/memory-watchdog.ts +185 -0
- package/src/services/nested-subagent-spy.ts +3 -0
- package/src/services/process-thread-snapshot.ts +12 -2
- package/src/services/process-tree-memory.ts +161 -0
- package/src/services/read-lines.ts +16 -27
- package/src/services/supervisor.ts +1 -0
- package/src/services/terminal.service.ts +8 -0
- package/src/services/transcript-images-file.ts +7 -11
- package/src/web/components/settings/notifications-settings-section.tsx +14 -1
- package/src/web/lib/web-push-client.ts +35 -5
- package/src/web/lib/web-push-support.ts +57 -4
- package/dist/web/assets/accounts-settings-section-DD88DRdx.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-DD88DRdx.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-C0PhhLKR.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-C0PhhLKR.js.gz +0 -0
- package/dist/web/assets/agent-session-window-content-D0XZgh4U.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-D0XZgh4U.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-CpfQB6A7.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-CpfQB6A7.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-CQWBwWcM.js.br +0 -0
- package/dist/web/assets/ai-settings-section-CQWBwWcM.js.gz +0 -0
- package/dist/web/assets/android-tab-4Z4AgHz1.js.br +0 -0
- package/dist/web/assets/android-tab-4Z4AgHz1.js.gz +0 -0
- package/dist/web/assets/appearance-settings-section-DjQjiJF7.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-DjQjiJF7.js.gz +0 -0
- package/dist/web/assets/apps-panel-_lxY9xbc.js.br +0 -0
- package/dist/web/assets/apps-panel-_lxY9xbc.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-BzrhnFSs.js.br +0 -0
- package/dist/web/assets/branch-review-tab-BzrhnFSs.js.gz +0 -0
- package/dist/web/assets/chat-tab-BKHepkYi.js.br +0 -0
- package/dist/web/assets/chat-tab-BKHepkYi.js.gz +0 -0
- package/dist/web/assets/chat-tab-Cv8gYzcA.js.br +0 -0
- package/dist/web/assets/chat-tab-Cv8gYzcA.js.gz +0 -0
- package/dist/web/assets/code-editor-COWmNXO4.js.br +0 -0
- package/dist/web/assets/code-editor-COWmNXO4.js.gz +0 -0
- package/dist/web/assets/codex-reset-credit-button-BHt4yJet.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-BHt4yJet.js.gz +0 -0
- package/dist/web/assets/conflict-editor-tj-1gzKr.js.br +0 -0
- package/dist/web/assets/conflict-editor-tj-1gzKr.js.gz +0 -0
- package/dist/web/assets/connection-form-tab-BV2QX8Cf.js.br +0 -0
- package/dist/web/assets/connection-form-tab-BV2QX8Cf.js.gz +0 -0
- package/dist/web/assets/csv-preview-xhE2esgz.js.br +0 -0
- package/dist/web/assets/csv-preview-xhE2esgz.js.gz +0 -0
- package/dist/web/assets/db-tab-parts-C3MsjOID.js.br +0 -0
- package/dist/web/assets/db-tab-parts-C3MsjOID.js.gz +0 -0
- package/dist/web/assets/design-settings-section-C3LxYhIw.js.br +0 -0
- package/dist/web/assets/design-settings-section-C3LxYhIw.js.gz +0 -0
- package/dist/web/assets/design-tab-DYcvjdfb.js.br +0 -0
- package/dist/web/assets/design-tab-DYcvjdfb.js.gz +0 -0
- package/dist/web/assets/designs-sidebar-panel-Dpr4PPFT.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-Dpr4PPFT.js.gz +0 -0
- package/dist/web/assets/diff-viewer-Fl_4jqr6.js.br +0 -0
- package/dist/web/assets/diff-viewer-Fl_4jqr6.js.gz +0 -0
- package/dist/web/assets/docx-preview-bVE9shPX.js.br +0 -0
- package/dist/web/assets/docx-preview-bVE9shPX.js.gz +0 -0
- package/dist/web/assets/editor-dialog-eEOYWdbr.js.br +0 -0
- package/dist/web/assets/editor-dialog-eEOYWdbr.js.gz +0 -0
- package/dist/web/assets/editor-language-service-D1_Ggq4s.js.br +0 -0
- package/dist/web/assets/editor-language-service-D1_Ggq4s.js.gz +0 -0
- package/dist/web/assets/explorer-body-C0UOcBPJ.js.br +0 -0
- package/dist/web/assets/explorer-body-C0UOcBPJ.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-Dxee7SuJ.js.br +0 -0
- package/dist/web/assets/explorer-window-content-Dxee7SuJ.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-D8krnoj8.js.br +0 -0
- package/dist/web/assets/extension-manager-section-D8krnoj8.js.gz +0 -0
- package/dist/web/assets/extension-webview-CtIdV69T.js.br +0 -0
- package/dist/web/assets/extension-webview-CtIdV69T.js.gz +0 -0
- package/dist/web/assets/files-settings-section-C8vtarR8.js.br +0 -0
- package/dist/web/assets/files-settings-section-C8vtarR8.js.gz +0 -0
- package/dist/web/assets/general-settings-section-Chu8Ut8h.js.br +0 -0
- package/dist/web/assets/general-settings-section-Chu8Ut8h.js.gz +0 -0
- package/dist/web/assets/git-log-panel-DG09p6k5.js.br +0 -0
- package/dist/web/assets/git-log-panel-DG09p6k5.js.gz +0 -0
- package/dist/web/assets/git-review-tab-CSy8DjSC.js.br +0 -0
- package/dist/web/assets/git-review-tab-CSy8DjSC.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-BN1y4BT0.js.br +0 -0
- package/dist/web/assets/glide-data-grid-BN1y4BT0.js.gz +0 -0
- package/dist/web/assets/grid-save-dialog-CfSuWw2t.js.br +0 -0
- package/dist/web/assets/grid-save-dialog-CfSuWw2t.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-B04QMp7A.js.br +0 -0
- package/dist/web/assets/group-chat-tab-B04QMp7A.js.gz +0 -0
- package/dist/web/assets/impexp-tab-BRNouquR.js.br +0 -0
- package/dist/web/assets/impexp-tab-BRNouquR.js.gz +0 -0
- package/dist/web/assets/index-BpgSIM5B.js.br +0 -0
- package/dist/web/assets/index-BpgSIM5B.js.gz +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-BKDyZHhK.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-BKDyZHhK.js.gz +0 -0
- package/dist/web/assets/language-servers-section-CbbkezhA.js.br +0 -0
- package/dist/web/assets/language-servers-section-CbbkezhA.js.gz +0 -0
- package/dist/web/assets/logs-app-Blr1-v4q.js.br +0 -0
- package/dist/web/assets/logs-app-Blr1-v4q.js.gz +0 -0
- package/dist/web/assets/lsp-client-Ds3U2O52.js.br +0 -0
- package/dist/web/assets/lsp-client-Ds3U2O52.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-DzCPadpB.js.br +0 -0
- package/dist/web/assets/markdown-renderer-DzCPadpB.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-BClCMXb8.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-BClCMXb8.js.gz +0 -0
- package/dist/web/assets/new-design-dialog-HRP9H11v.js.br +0 -0
- package/dist/web/assets/new-design-dialog-HRP9H11v.js.gz +0 -0
- package/dist/web/assets/notifications-settings-section-CYTTQaNr.js +0 -1
- package/dist/web/assets/notifications-settings-section-CYTTQaNr.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-CYTTQaNr.js.gz +0 -0
- package/dist/web/assets/ppmbot-settings-section-BRowIIqc.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-BRowIIqc.js.gz +0 -0
- package/dist/web/assets/problems-panel-DdB10Ybd.js.br +0 -0
- package/dist/web/assets/problems-panel-DdB10Ybd.js.gz +0 -0
- package/dist/web/assets/process-table-CzLaWPe0.js.br +0 -0
- package/dist/web/assets/process-table-CzLaWPe0.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-BCq7R5DA.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-BCq7R5DA.js.gz +0 -0
- package/dist/web/assets/query-tab-DGvj_h6l.js.br +0 -0
- package/dist/web/assets/remote-access-settings-section-BrqOoOyk.js.br +0 -0
- package/dist/web/assets/remote-access-settings-section-BrqOoOyk.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-5r6UbdlN.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-5r6UbdlN.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-B9Q4auqe.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-B9Q4auqe.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-CL-jrkA8.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-CL-jrkA8.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-DXEf2Jnz.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-DXEf2Jnz.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-20P6-gKB.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-20P6-gKB.js.gz +0 -0
- package/dist/web/assets/rename-object-dialog-Bs7pUsUP.js.br +0 -0
- package/dist/web/assets/rename-object-dialog-Bs7pUsUP.js.gz +0 -0
- package/dist/web/assets/review-code-Bjo4sHN9.js.br +0 -0
- package/dist/web/assets/review-code-Bjo4sHN9.js.gz +0 -0
- package/dist/web/assets/save-as-dialog-BHx0Wp2B.js.br +0 -0
- package/dist/web/assets/save-as-dialog-BHx0Wp2B.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-C6ATYDPK.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-C6ATYDPK.js.gz +0 -0
- package/dist/web/assets/session-review-tab-BPMUyNTx.js.br +0 -0
- package/dist/web/assets/session-review-tab-BPMUyNTx.js.gz +0 -0
- package/dist/web/assets/settings-body-Dy5D6Vu7.js.br +0 -0
- package/dist/web/assets/settings-body-Dy5D6Vu7.js.gz +0 -0
- package/dist/web/assets/settings-rows-BRoYE2To.js.br +0 -0
- package/dist/web/assets/settings-rows-BRoYE2To.js.gz +0 -0
- package/dist/web/assets/settings-section-content-C4DX7TYv.js +0 -1
- package/dist/web/assets/settings-section-content-essUViKu.js.br +0 -0
- package/dist/web/assets/settings-section-content-essUViKu.js.gz +0 -0
- package/dist/web/assets/slash-command-picker-8da30mYP.js.br +0 -0
- package/dist/web/assets/slash-command-picker-8da30mYP.js.gz +0 -0
- package/dist/web/assets/sql-object-tab-DRIHVXuR.js.br +0 -0
- package/dist/web/assets/sql-object-tab-DRIHVXuR.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-G-Jl2yEr.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-G-Jl2yEr.js.gz +0 -0
- package/dist/web/assets/structure-save-dialog-Cwikz0we.js.br +0 -0
- package/dist/web/assets/structure-save-dialog-Cwikz0we.js.gz +0 -0
- package/dist/web/assets/structure-tab-CWEgdZPm.js.br +0 -0
- package/dist/web/assets/structure-tab-CWEgdZPm.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-BDQm9-wb.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-CZ55-bTz.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-CZ55-bTz.js.gz +0 -0
- package/dist/web/assets/table-tab-Bmn4UdBV.js.br +0 -0
- package/dist/web/assets/table-tab-Bmn4UdBV.js.gz +0 -0
- package/dist/web/assets/telegram-bot-token-field-fdHwRf39.js.br +0 -0
- package/dist/web/assets/telegram-bot-token-field-fdHwRf39.js.gz +0 -0
- package/dist/web/assets/terminal-tab-D-qlZXLK.js.br +0 -0
- package/dist/web/assets/terminal-tab-D-qlZXLK.js.gz +0 -0
- package/dist/web/assets/tool-cards-BdXbQ9Fv.js.br +0 -0
- package/dist/web/assets/tool-cards-BdXbQ9Fv.js.gz +0 -0
- package/dist/web/assets/tools-settings-section-CcPaspbR.js.br +0 -0
- package/dist/web/assets/tools-settings-section-CcPaspbR.js.gz +0 -0
- package/dist/web/assets/use-inline-blame-Ck5XoSS3.js.br +0 -0
- package/dist/web/assets/use-inline-blame-Ck5XoSS3.js.gz +0 -0
- package/dist/web/assets/use-lsp-CGSqfFBk.js.br +0 -0
- package/dist/web/assets/use-lsp-CGSqfFBk.js.gz +0 -0
- package/dist/web/assets/use-process-kill-DJ_f7rCO.js.br +0 -0
- package/dist/web/assets/use-process-kill-DJ_f7rCO.js.gz +0 -0
- package/dist/web/assets/use-sql-schema-info-wt320fVR.js.br +0 -0
- package/dist/web/assets/use-sql-schema-info-wt320fVR.js.gz +0 -0
- package/dist/web/assets/web-preview-tab-D4XayUEK.js.gz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import{Q as r,Ur as i,Z as a,li as o}from"./icons-BwyIKaTT.js";import{a as s,r as c}from"./api-client-xQDlhUTu.js";import{k as l,t as u}from"./settings-store-B4mLp19V.js";import{n as d}from"./utils-Bslrbb-G.js";import{t as f}from"./ws-auth-CbF6GqxP.js";import{cn as p}from"./index-BpgSIM5B.js";import{n as m}from"./use-h264-canvas-decoder-_zqeiVx8.js";import{r as h}from"./run-in-terminal-ujoc25vj.js";function g(e,t,n=`8081`){let r=f(`/ws/remote-desktop`),i=e.protocol===`https:`?`wss:`:`ws:`;return t&&e.protocol!==`https:`?`ws://${e.hostname}:${n}${r}`:`${i}//${e.host}${r}`}var _=e(t(),1),v=400,y=25,b=6e3;function x(e,{onFailure:t}={}){let[n,r]=(0,_.useState)(`idle`),[i,a]=(0,_.useState)(null),[o,c]=(0,_.useState)({width:0,height:0}),l=(0,_.useRef)(null),u=(0,_.useRef)(null),d=(0,_.useRef)(null),f=(0,_.useRef)(0),p=(0,_.useRef)(0),m=(0,_.useRef)(null),h=(0,_.useRef)(null),g=(0,_.useRef)(0),v=(0,_.useRef)(t);v.current=t;let y=(0,_.useCallback)(()=>{g.current+=1,m.current&&=(clearInterval(m.current),null),h.current&&=(clearTimeout(h.current),null);try{l.current?.close()}catch{}l.current=null;let e=u.current;e&&(e.srcObject=null,e.remove(),u.current=null),d.current=null},[]),x=(0,_.useCallback)(()=>{y(),r(`idle`),a(null)},[y]);return{status:n,errorMessage:i,start:(0,_.useCallback)(t=>{y();let n=g.current,i=()=>n!==g.current,o=!1,_=(e,t=`error`)=>{i()||o||(o=!0,r(t),a(e),v.current?.())};if(typeof RTCPeerConnection>`u`){_(`This browser has no WebRTC support.`,`unsupported`);return}let x=document.createElement(`video`);x.autoplay=!0,x.muted=!0,x.playsInline=!0,x.setAttribute(`aria-hidden`,`true`),x.style.cssText=`position:fixed;top:0;left:0;width:1px;height:1px;opacity:0;pointer-events:none`,document.body.appendChild(x),u.current=x;let w=()=>{if(i())return;let t=e.current;t&&x.videoWidth>0&&((t.width!==x.videoWidth||t.height!==x.videoHeight)&&(t.width=x.videoWidth,t.height=x.videoHeight,c({width:x.videoWidth,height:x.videoHeight})),d.current||=t.getContext(`2d`),d.current?.drawImage(x,0,0,t.width,t.height),f.current+=1),T()},T=()=>typeof x.requestVideoFrameCallback==`function`?x.requestVideoFrameCallback(()=>w()):requestAnimationFrame(()=>w()),E=new RTCPeerConnection({iceServers:[]});l.current=E,E.addTransceiver(`video`,{direction:`recvonly`}),E.ontrack=e=>{let t=new MediaStream;t.addTrack(e.track),x.srcObject=t,x.play().catch(()=>{}),T()},E.onconnectionstatechange=()=>{i()||(E.connectionState===`connected`&&(h.current&&=(clearTimeout(h.current),null),r(`ready`),a(null)),E.connectionState===`failed`&&_(`The WebRTC connection failed.`))},m.current=setInterval(async()=>{if(!(i()||!l.current))try{(await l.current.getStats()).forEach(e=>{e.type===`inbound-rtp`&&e.kind===`video`&&(p.current=e.bytesReceived??0)})}catch{}},1e3),(async()=>{try{if(await E.setLocalDescription(await E.createOffer()),await S(E),i())return;let e=s(),n=await C(t,E.localDescription.sdp,e,i);if(i())return;if(!n){_(`The host's WebRTC relay never produced a stream.`);return}if(await E.setRemoteDescription({type:`answer`,sdp:n}),i()||E.connectionState===`connected`)return;h.current=setTimeout(()=>{h.current=null,E.connectionState!==`connected`&&_(`The WebRTC connection did not come up.`)},b)}catch(e){_(e.message)}})()},[e,y]),stop:x,getFrameCount:()=>f.current,getTotalBytes:()=>p.current,frameSize:o}}function S(e){return e.iceGatheringState===`complete`?Promise.resolve():new Promise(t=>{let n=()=>{e.iceGatheringState===`complete`&&(e.removeEventListener(`icegatheringstatechange`,n),t())};e.addEventListener(`icegatheringstatechange`,n),setTimeout(()=>{e.removeEventListener(`icegatheringstatechange`,n),t()},2e3)})}async function C(e,t,n,r){for(let i=0;i<y;i++){if(r())return null;let i=await fetch(e,{method:`POST`,headers:{"Content-Type":`application/sdp`,...n?{Authorization:`Bearer ${n}`}:{},"x-ppm-client":`web`},body:t});if(i.ok)return await i.text();if(i.status!==404&&i.status!==502)throw Error(`the host refused the WebRTC handshake (${i.status})`);await new Promise(e=>setTimeout(e,v))}return null}function w(e){return e.code===`KeyV`&&(e.ctrlKey||e.metaKey)}function T(e){return(e.code===`KeyC`||e.code===`KeyX`)&&(e.ctrlKey||e.metaKey)}function E(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 ee(e){try{return navigator.clipboard?.writeText?(await navigator.clipboard.writeText(e),!0):!1}catch{return!1}}var D=120,O=400;function te(){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>O)&&(r.current=c+D/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 ne=5e3,re=2,k=`ppm.remoteDesktop.webrtcUnusable`;function ie(){try{return sessionStorage.getItem(k)===`1`}catch{return!1}}function ae(){try{sessionStorage.setItem(k,`1`)}catch{}}function A(e,{displayId:t}={}){let n=(0,_.useRef)(null),r=(0,_.useRef)(0),[i,a]=(0,_.useState)(`connecting`),[o,s]=(0,_.useState)(null),[d,f]=(0,_.useState)(0),[p,h]=(0,_.useState)(()=>({preset:l(u.getState().remoteDesktopQuality)??`balanced`,held:1})),v=(0,_.useRef)(l(u.getState().remoteDesktopQuality)),[y,b]=(0,_.useState)(null),S=(0,_.useRef)(null),C=u(e=>e.remoteDesktopShowCursor),w=u(e=>e.remoteDesktopClipboardSync),T=(0,_.useRef)(C),E=(0,_.useRef)(w);(0,_.useEffect)(()=>{T.current=C},[C]),(0,_.useEffect)(()=>{E.current=w},[w]);let D=(0,_.useRef)(u.getState().remoteDesktopCodec),[O,k]=(0,_.useState)(D.current),A=m(e),j=(0,_.useRef)(!1),M=x(e,{onFailure:(0,_.useCallback)(()=>{typeof VideoDecoder>`u`||j.current||(j.current=!0,ae(),f(e=>e+1))},[])}),[N,P]=(0,_.useState)(`websocket`),F=te(),[I,L]=(0,_.useState)(!1),[R,z]=(0,_.useState)(!1),[oe,B]=(0,_.useState)(null),[V,H]=(0,_.useState)(null),[U,W]=(0,_.useState)(null),[G,K]=(0,_.useState)(null),q=(0,_.useCallback)(e=>{let t=n.current;t?.readyState===WebSocket.OPEN&&t.send(JSON.stringify(e))},[]),J=(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})},[]),Y=(0,_.useCallback)(e=>{if(e!==`custom`)return{type:`quality`,preset:e};let t=u.getState();return{type:`quality`,preset:`custom`,percent:t.remoteDesktopCustomQualityPercent,fps:t.remoteDesktopCustomFps}},[]),X=(0,_.useCallback)(e=>{v.current=e,u.getState().setRemoteDesktopQuality(e),q(Y(e))},[Y,q]),Z=(0,_.useCallback)((e,t)=>{let n=u.getState();n.setRemoteDesktopCustomQuality(e,t),n.setRemoteDesktopQuality(`custom`),v.current=`custom`,q(Y(`custom`))},[Y,q]),Q=(0,_.useCallback)(e=>{B(null),q({type:`privacy`,enabled:e})},[q]),$=(0,_.useCallback)(e=>{L(e),e||F.reset(),q({type:`audio`,enabled:e})},[F,q]),se=(0,_.useCallback)(e=>{D.current=e,u.getState().setRemoteDesktopCodec(e),k(e),e&&q({type:`codec`,encoder:e})},[q]),ce=(0,_.useCallback)(e=>{K(null),q({type:`resolution`,modeId:e})},[q]),le=(0,_.useCallback)(e=>{T.current=e,u.getState().setRemoteDesktopShowCursor(e),q({type:`cursor`,show:e})},[q]),ue=(0,_.useCallback)((e,t,n=!1)=>{q({type:`clipboard`,text:e,paste:t,shift:n})},[q]),de=(0,_.useCallback)(()=>{S.current&&clearTimeout(S.current),S.current=setTimeout(()=>{S.current=null,q({type:`clipboardRead`})},350)},[q]),fe=(0,_.useCallback)(()=>b(null),[]);(0,_.useEffect)(()=>()=>{S.current&&clearTimeout(S.current)},[]),(0,_.useEffect)(()=>{let e=!1,i=null;a(`connecting`),s(null),P(`websocket`),z(!1),B(null),r.current=0,A.reset(),(async()=>{let o;try{o=(await c.post(`/api/remote-desktop/session`)).nonce}catch(t){e||(a(`error`),s(t.message));return}if(e)return;let l=g(window.location,!1,void 0),u=new WebSocket(l);u.binaryType=`arraybuffer`,n.current=u,u.onopen=()=>{u.send(JSON.stringify({type:`auth`,nonce:o,...t?{displayId:t}:{},cursor:T.current,...D.current?{codec:D.current}:{},webrtc:!(j.current||ie())})),v.current&&u.send(JSON.stringify(Y(v.current))),i=setInterval(()=>q({type:`ping`}),ne)},u.onmessage=t=>{if(typeof t.data==`string`){let n;try{n=JSON.parse(t.data)}catch{return}if(n.type===`webrtc`&&typeof n.whepPath==`string`)P(`webrtc`),J(n),k(typeof n.encoder==`string`?n.encoder:null),M.start(n.whepPath),a(`streaming`);else if(n.type===`config`&&typeof n.codec==`string`)J(n),k(typeof n.encoder==`string`?n.encoder:null),A.configure(n.codec).then(()=>{e||a(`streaming`)});else if(n.type===`quality`)J(n);else if(n.type===`codec`)k(typeof n.encoder==`string`?n.encoder:null);else if(n.type===`resolution`)H(typeof n.modeId==`string`?n.modeId:null),W(typeof n.original==`string`?n.original:null),K(null);else if(n.type===`resolutionError`)K(typeof n.message==`string`?n.message:`The host refused the mode.`);else if(n.type===`privacy`)z(n.enabled===!0),B(typeof n.reason==`string`?n.reason:null);else if(n.type===`audio`){let e=n.enabled===!0;if(L(e),!e){F.reset();return}let t=typeof n.channels==`number`?n.channels:2,r=typeof n.sampleRate==`number`?n.sampleRate:48e3;F.configure(t,r)}else if(n.type===`clipboard`&&typeof n.text==`string`){if(!E.current)return;let t=n.text;ee(t).then(n=>{!n&&!e&&b(t)})}else n.type===`error`&&(a(`error`),s(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]===re){F.decodePacket(n.subarray(1));return}A.decodeAccessUnit(n.subarray(1),n[0]===1)}},u.onerror=()=>{e||(a(`error`),s(`WebSocket error`))},u.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{A.reset()}catch{}try{M.stop()}catch{}try{F.reset()}catch{}}},[d,t]);let pe=(0,_.useCallback)(()=>f(e=>e+1),[]),me=(0,_.useCallback)(()=>N===`webrtc`?M.getTotalBytes():r.current,[N,M]);return{connState:i,errorMessage:o,transport:N,decoderStatus:N===`webrtc`?M.status:A.status,decoderErrorMessage:N===`webrtc`?M.errorMessage:A.errorMessage,sendMessage:q,reconnect:pe,getTotalBytes:me,getFrameCount:N===`webrtc`?M.getFrameCount:A.getFrameCount,frameSize:N===`webrtc`?M.frameSize:A.frameSize,quality:p,setQuality:X,setCustomQuality:Z,showCursor:C,setShowCursor:le,codec:O,setCodec:se,audioOn:I,setAudioOn:$,getAudioTracks:F.getTracks,privacyOn:R,privacyError:oe,setPrivacyOn:Q,hostModeId:V,hostOriginalModeId:U,resolutionError:G,setHostMode:ce,pendingHostClipboard:y,clearHostClipboard:fe,sendClipboard:ue,requestHostClipboard:de}}function j(e){return Math.min(Math.max(e,0),1)}function M(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:j(r),yFrac:j(i)}}function N(e,t,n,r){let i=r.scale||1,a=n.left+n.width/2,o=n.top+n.height/2;return M(a+(e-a-r.panX)/i,o+(t-o-r.panY)/i,n)}function P(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 F(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||I(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 I(e,t){return e.current===t.current?e.preferred===t.preferred?e.refresh>t.refresh:e.preferred:e.current}function L(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)=>I(t,e)?t:e)}function R(){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 z(e){let t=`${e.width} × ${e.height}`;return e.refresh>0?`${t} · ${e.refresh} Hz`:t}var oe=[`video/mp4;codecs=avc1.42E01E,mp4a.40.2`,`video/mp4`,`video/webm;codecs=vp9,opus`,`video/webm;codecs=vp8,opus`,`video/webm`];function B(e=e=>typeof MediaRecorder<`u`&&MediaRecorder.isTypeSupported(e)){return typeof MediaRecorder>`u`?null:oe.find(e)??null}function V(e){return e.startsWith(`video/mp4`)?`mp4`:`webm`}function H(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 U(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 W(e){if(!e||e.width===0||e.height===0)return!1;let t=await new Promise(t=>e.toBlob(t,`image/png`));return t?(U(t,H(`png`)),!0):!1}function G(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=B());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&&U(e,H(V(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 K={fps:0,kbps:0};function q(e,t){let n=t.atMs-e.atMs;if(n<=0)return K;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 J=n(),Y=500;function X({canvasRef:e,getFrameCount:t,getTotalBytes:n,positionClassName:r=`left-1 top-1`}){let i=u(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}=q(s.current,r);s.current=r;let c=e.current;o({fps:i,kbps:a,width:c?.width??0,height:c?.height??0})},Y);return()=>clearInterval(r)},[i,e,t,n]),i?(0,J.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 Z(){let{caps:e}=p(!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 Q({pendingText:e,onDismiss:t,missingToolAction:n,onDismissMissingTool:o,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,J.jsxs)($,{onDismiss:o??(()=>{}),testId:`remote-desktop-clipboard-missing-tool`,positionClassName:s,children:[(0,J.jsx)(a,{className:`size-4 shrink-0 text-amber-300`}),(0,J.jsx)(`span`,{className:`min-w-0 flex-1`,children:`The host has no clipboard tool installed.`}),n.kind===`terminal`&&(0,J.jsxs)(`button`,{type:`button`,onClick:()=>h(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,J.jsx)(i,{className:`size-3.5`}),` `,n.label]})]}):(0,J.jsxs)($,{onDismiss:t,testId:`remote-desktop-clipboard-pending`,positionClassName:s,children:[(0,J.jsx)(r,{className:`size-4 shrink-0 text-emerald-400`}),(0,J.jsxs)(`span`,{className:`min-w-0 flex-1 truncate`,children:[c?`Could not copy — select the text manually:`:`Copied on the host:`,(0,J.jsx)(`span`,{className:`ml-1 text-white/60`,children:se(e)})]}),(0,J.jsx)(`button`,{type:`button`,onClick:()=>{E(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 $({children:e,onDismiss:t,testId:n,positionClassName:r}){return(0,J.jsxs)(`div`,{className:d(`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`,r),"data-testid":n,children:[e,(0,J.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,J.jsx)(o,{className:`size-3.5`})})]})}function se(e){let t=e.replace(/\s+/g,` `).trim();return t.length>60?`${t.slice(0,60)}…`:t}export{W as a,F as c,N as d,P as f,w as h,G as i,z as l,T as m,Z as n,L as o,A as p,X as r,R as s,Q as t,M as u};
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import{Q as r,Ur as i,Z as a,li as o}from"./icons-BwyIKaTT.js";import{a as s,r as c}from"./api-client-xQDlhUTu.js";import{k as l,t as u}from"./settings-store-B4mLp19V.js";import{n as d}from"./utils-Bslrbb-G.js";import{t as f}from"./ws-auth-CbF6GqxP.js";import{cn as p}from"./index-BtAn_krv.js";import{n as m}from"./use-h264-canvas-decoder-_zqeiVx8.js";import{r as h}from"./run-in-terminal-ujoc25vj.js";function g(e,t,n=`8081`){let r=f(`/ws/remote-desktop`),i=e.protocol===`https:`?`wss:`:`ws:`;return t&&e.protocol!==`https:`?`ws://${e.hostname}:${n}${r}`:`${i}//${e.host}${r}`}var _=e(t(),1),v=400,y=25,b=6e3;function x(e,{onFailure:t}={}){let[n,r]=(0,_.useState)(`idle`),[i,a]=(0,_.useState)(null),[o,c]=(0,_.useState)({width:0,height:0}),l=(0,_.useRef)(null),u=(0,_.useRef)(null),d=(0,_.useRef)(null),f=(0,_.useRef)(0),p=(0,_.useRef)(0),m=(0,_.useRef)(null),h=(0,_.useRef)(null),g=(0,_.useRef)(0),v=(0,_.useRef)(t);v.current=t;let y=(0,_.useCallback)(()=>{g.current+=1,m.current&&=(clearInterval(m.current),null),h.current&&=(clearTimeout(h.current),null);try{l.current?.close()}catch{}l.current=null;let e=u.current;e&&(e.srcObject=null,e.remove(),u.current=null),d.current=null},[]),x=(0,_.useCallback)(()=>{y(),r(`idle`),a(null)},[y]);return{status:n,errorMessage:i,start:(0,_.useCallback)(t=>{y();let n=g.current,i=()=>n!==g.current,o=!1,_=(e,t=`error`)=>{i()||o||(o=!0,r(t),a(e),v.current?.())};if(typeof RTCPeerConnection>`u`){_(`This browser has no WebRTC support.`,`unsupported`);return}let x=document.createElement(`video`);x.autoplay=!0,x.muted=!0,x.playsInline=!0,x.setAttribute(`aria-hidden`,`true`),x.style.cssText=`position:fixed;top:0;left:0;width:1px;height:1px;opacity:0;pointer-events:none`,document.body.appendChild(x),u.current=x;let w=()=>{if(i())return;let t=e.current;t&&x.videoWidth>0&&((t.width!==x.videoWidth||t.height!==x.videoHeight)&&(t.width=x.videoWidth,t.height=x.videoHeight,c({width:x.videoWidth,height:x.videoHeight})),d.current||=t.getContext(`2d`),d.current?.drawImage(x,0,0,t.width,t.height),f.current+=1),T()},T=()=>typeof x.requestVideoFrameCallback==`function`?x.requestVideoFrameCallback(()=>w()):requestAnimationFrame(()=>w()),E=new RTCPeerConnection({iceServers:[]});l.current=E,E.addTransceiver(`video`,{direction:`recvonly`}),E.ontrack=e=>{let t=new MediaStream;t.addTrack(e.track),x.srcObject=t,x.play().catch(()=>{}),T()},E.onconnectionstatechange=()=>{i()||(E.connectionState===`connected`&&(h.current&&=(clearTimeout(h.current),null),r(`ready`),a(null)),E.connectionState===`failed`&&_(`The WebRTC connection failed.`))},m.current=setInterval(async()=>{if(!(i()||!l.current))try{(await l.current.getStats()).forEach(e=>{e.type===`inbound-rtp`&&e.kind===`video`&&(p.current=e.bytesReceived??0)})}catch{}},1e3),(async()=>{try{if(await E.setLocalDescription(await E.createOffer()),await S(E),i())return;let e=s(),n=await C(t,E.localDescription.sdp,e,i);if(i())return;if(!n){_(`The host's WebRTC relay never produced a stream.`);return}if(await E.setRemoteDescription({type:`answer`,sdp:n}),i()||E.connectionState===`connected`)return;h.current=setTimeout(()=>{h.current=null,E.connectionState!==`connected`&&_(`The WebRTC connection did not come up.`)},b)}catch(e){_(e.message)}})()},[e,y]),stop:x,getFrameCount:()=>f.current,getTotalBytes:()=>p.current,frameSize:o}}function S(e){return e.iceGatheringState===`complete`?Promise.resolve():new Promise(t=>{let n=()=>{e.iceGatheringState===`complete`&&(e.removeEventListener(`icegatheringstatechange`,n),t())};e.addEventListener(`icegatheringstatechange`,n),setTimeout(()=>{e.removeEventListener(`icegatheringstatechange`,n),t()},2e3)})}async function C(e,t,n,r){for(let i=0;i<y;i++){if(r())return null;let i=await fetch(e,{method:`POST`,headers:{"Content-Type":`application/sdp`,...n?{Authorization:`Bearer ${n}`}:{},"x-ppm-client":`web`},body:t});if(i.ok)return await i.text();if(i.status!==404&&i.status!==502)throw Error(`the host refused the WebRTC handshake (${i.status})`);await new Promise(e=>setTimeout(e,v))}return null}function w(e){return e.code===`KeyV`&&(e.ctrlKey||e.metaKey)}function T(e){return(e.code===`KeyC`||e.code===`KeyX`)&&(e.ctrlKey||e.metaKey)}function E(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 ee(e){try{return navigator.clipboard?.writeText?(await navigator.clipboard.writeText(e),!0):!1}catch{return!1}}var D=120,O=400;function te(){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>O)&&(r.current=c+D/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 ne=5e3,re=2,k=`ppm.remoteDesktop.webrtcUnusable`;function ie(){try{return sessionStorage.getItem(k)===`1`}catch{return!1}}function ae(){try{sessionStorage.setItem(k,`1`)}catch{}}function A(e,{displayId:t}={}){let n=(0,_.useRef)(null),r=(0,_.useRef)(0),[i,a]=(0,_.useState)(`connecting`),[o,s]=(0,_.useState)(null),[d,f]=(0,_.useState)(0),[p,h]=(0,_.useState)(()=>({preset:l(u.getState().remoteDesktopQuality)??`balanced`,held:1})),v=(0,_.useRef)(l(u.getState().remoteDesktopQuality)),[y,b]=(0,_.useState)(null),S=(0,_.useRef)(null),C=u(e=>e.remoteDesktopShowCursor),w=u(e=>e.remoteDesktopClipboardSync),T=(0,_.useRef)(C),E=(0,_.useRef)(w);(0,_.useEffect)(()=>{T.current=C},[C]),(0,_.useEffect)(()=>{E.current=w},[w]);let D=(0,_.useRef)(u.getState().remoteDesktopCodec),[O,k]=(0,_.useState)(D.current),A=m(e),j=(0,_.useRef)(!1),M=x(e,{onFailure:(0,_.useCallback)(()=>{typeof VideoDecoder>`u`||j.current||(j.current=!0,ae(),f(e=>e+1))},[])}),[N,P]=(0,_.useState)(`websocket`),F=te(),[I,L]=(0,_.useState)(!1),[R,z]=(0,_.useState)(!1),[oe,B]=(0,_.useState)(null),[V,H]=(0,_.useState)(null),[U,W]=(0,_.useState)(null),[G,K]=(0,_.useState)(null),q=(0,_.useCallback)(e=>{let t=n.current;t?.readyState===WebSocket.OPEN&&t.send(JSON.stringify(e))},[]),J=(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})},[]),Y=(0,_.useCallback)(e=>{if(e!==`custom`)return{type:`quality`,preset:e};let t=u.getState();return{type:`quality`,preset:`custom`,percent:t.remoteDesktopCustomQualityPercent,fps:t.remoteDesktopCustomFps}},[]),X=(0,_.useCallback)(e=>{v.current=e,u.getState().setRemoteDesktopQuality(e),q(Y(e))},[Y,q]),Z=(0,_.useCallback)((e,t)=>{let n=u.getState();n.setRemoteDesktopCustomQuality(e,t),n.setRemoteDesktopQuality(`custom`),v.current=`custom`,q(Y(`custom`))},[Y,q]),Q=(0,_.useCallback)(e=>{B(null),q({type:`privacy`,enabled:e})},[q]),$=(0,_.useCallback)(e=>{L(e),e||F.reset(),q({type:`audio`,enabled:e})},[F,q]),se=(0,_.useCallback)(e=>{D.current=e,u.getState().setRemoteDesktopCodec(e),k(e),e&&q({type:`codec`,encoder:e})},[q]),ce=(0,_.useCallback)(e=>{K(null),q({type:`resolution`,modeId:e})},[q]),le=(0,_.useCallback)(e=>{T.current=e,u.getState().setRemoteDesktopShowCursor(e),q({type:`cursor`,show:e})},[q]),ue=(0,_.useCallback)((e,t,n=!1)=>{q({type:`clipboard`,text:e,paste:t,shift:n})},[q]),de=(0,_.useCallback)(()=>{S.current&&clearTimeout(S.current),S.current=setTimeout(()=>{S.current=null,q({type:`clipboardRead`})},350)},[q]),fe=(0,_.useCallback)(()=>b(null),[]);(0,_.useEffect)(()=>()=>{S.current&&clearTimeout(S.current)},[]),(0,_.useEffect)(()=>{let e=!1,i=null;a(`connecting`),s(null),P(`websocket`),z(!1),B(null),r.current=0,A.reset(),(async()=>{let o;try{o=(await c.post(`/api/remote-desktop/session`)).nonce}catch(t){e||(a(`error`),s(t.message));return}if(e)return;let l=g(window.location,!1,void 0),u=new WebSocket(l);u.binaryType=`arraybuffer`,n.current=u,u.onopen=()=>{u.send(JSON.stringify({type:`auth`,nonce:o,...t?{displayId:t}:{},cursor:T.current,...D.current?{codec:D.current}:{},webrtc:!(j.current||ie())})),v.current&&u.send(JSON.stringify(Y(v.current))),i=setInterval(()=>q({type:`ping`}),ne)},u.onmessage=t=>{if(typeof t.data==`string`){let n;try{n=JSON.parse(t.data)}catch{return}if(n.type===`webrtc`&&typeof n.whepPath==`string`)P(`webrtc`),J(n),k(typeof n.encoder==`string`?n.encoder:null),M.start(n.whepPath),a(`streaming`);else if(n.type===`config`&&typeof n.codec==`string`)J(n),k(typeof n.encoder==`string`?n.encoder:null),A.configure(n.codec).then(()=>{e||a(`streaming`)});else if(n.type===`quality`)J(n);else if(n.type===`codec`)k(typeof n.encoder==`string`?n.encoder:null);else if(n.type===`resolution`)H(typeof n.modeId==`string`?n.modeId:null),W(typeof n.original==`string`?n.original:null),K(null);else if(n.type===`resolutionError`)K(typeof n.message==`string`?n.message:`The host refused the mode.`);else if(n.type===`privacy`)z(n.enabled===!0),B(typeof n.reason==`string`?n.reason:null);else if(n.type===`audio`){let e=n.enabled===!0;if(L(e),!e){F.reset();return}let t=typeof n.channels==`number`?n.channels:2,r=typeof n.sampleRate==`number`?n.sampleRate:48e3;F.configure(t,r)}else if(n.type===`clipboard`&&typeof n.text==`string`){if(!E.current)return;let t=n.text;ee(t).then(n=>{!n&&!e&&b(t)})}else n.type===`error`&&(a(`error`),s(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]===re){F.decodePacket(n.subarray(1));return}A.decodeAccessUnit(n.subarray(1),n[0]===1)}},u.onerror=()=>{e||(a(`error`),s(`WebSocket error`))},u.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{A.reset()}catch{}try{M.stop()}catch{}try{F.reset()}catch{}}},[d,t]);let pe=(0,_.useCallback)(()=>f(e=>e+1),[]),me=(0,_.useCallback)(()=>N===`webrtc`?M.getTotalBytes():r.current,[N,M]);return{connState:i,errorMessage:o,transport:N,decoderStatus:N===`webrtc`?M.status:A.status,decoderErrorMessage:N===`webrtc`?M.errorMessage:A.errorMessage,sendMessage:q,reconnect:pe,getTotalBytes:me,getFrameCount:N===`webrtc`?M.getFrameCount:A.getFrameCount,frameSize:N===`webrtc`?M.frameSize:A.frameSize,quality:p,setQuality:X,setCustomQuality:Z,showCursor:C,setShowCursor:le,codec:O,setCodec:se,audioOn:I,setAudioOn:$,getAudioTracks:F.getTracks,privacyOn:R,privacyError:oe,setPrivacyOn:Q,hostModeId:V,hostOriginalModeId:U,resolutionError:G,setHostMode:ce,pendingHostClipboard:y,clearHostClipboard:fe,sendClipboard:ue,requestHostClipboard:de}}function j(e){return Math.min(Math.max(e,0),1)}function M(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:j(r),yFrac:j(i)}}function N(e,t,n,r){let i=r.scale||1,a=n.left+n.width/2,o=n.top+n.height/2;return M(a+(e-a-r.panX)/i,o+(t-o-r.panY)/i,n)}function P(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 F(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||I(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 I(e,t){return e.current===t.current?e.preferred===t.preferred?e.refresh>t.refresh:e.preferred:e.current}function L(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)=>I(t,e)?t:e)}function R(){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 z(e){let t=`${e.width} × ${e.height}`;return e.refresh>0?`${t} · ${e.refresh} Hz`:t}var oe=[`video/mp4;codecs=avc1.42E01E,mp4a.40.2`,`video/mp4`,`video/webm;codecs=vp9,opus`,`video/webm;codecs=vp8,opus`,`video/webm`];function B(e=e=>typeof MediaRecorder<`u`&&MediaRecorder.isTypeSupported(e)){return typeof MediaRecorder>`u`?null:oe.find(e)??null}function V(e){return e.startsWith(`video/mp4`)?`mp4`:`webm`}function H(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 U(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 W(e){if(!e||e.width===0||e.height===0)return!1;let t=await new Promise(t=>e.toBlob(t,`image/png`));return t?(U(t,H(`png`)),!0):!1}function G(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=B());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&&U(e,H(V(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 K={fps:0,kbps:0};function q(e,t){let n=t.atMs-e.atMs;if(n<=0)return K;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 J=n(),Y=500;function X({canvasRef:e,getFrameCount:t,getTotalBytes:n,positionClassName:r=`left-1 top-1`}){let i=u(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}=q(s.current,r);s.current=r;let c=e.current;o({fps:i,kbps:a,width:c?.width??0,height:c?.height??0})},Y);return()=>clearInterval(r)},[i,e,t,n]),i?(0,J.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 Z(){let{caps:e}=p(!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 Q({pendingText:e,onDismiss:t,missingToolAction:n,onDismissMissingTool:o,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,J.jsxs)($,{onDismiss:o??(()=>{}),testId:`remote-desktop-clipboard-missing-tool`,positionClassName:s,children:[(0,J.jsx)(a,{className:`size-4 shrink-0 text-amber-300`}),(0,J.jsx)(`span`,{className:`min-w-0 flex-1`,children:`The host has no clipboard tool installed.`}),n.kind===`terminal`&&(0,J.jsxs)(`button`,{type:`button`,onClick:()=>h(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,J.jsx)(i,{className:`size-3.5`}),` `,n.label]})]}):(0,J.jsxs)($,{onDismiss:t,testId:`remote-desktop-clipboard-pending`,positionClassName:s,children:[(0,J.jsx)(r,{className:`size-4 shrink-0 text-emerald-400`}),(0,J.jsxs)(`span`,{className:`min-w-0 flex-1 truncate`,children:[c?`Could not copy — select the text manually:`:`Copied on the host:`,(0,J.jsx)(`span`,{className:`ml-1 text-white/60`,children:se(e)})]}),(0,J.jsx)(`button`,{type:`button`,onClick:()=>{E(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 $({children:e,onDismiss:t,testId:n,positionClassName:r}){return(0,J.jsxs)(`div`,{className:d(`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`,r),"data-testid":n,children:[e,(0,J.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,J.jsx)(o,{className:`size-3.5`})})]})}function se(e){let t=e.replace(/\s+/g,` `).trim();return t.length>60?`${t.slice(0,60)}…`:t}export{W as a,F as c,N as d,P as f,w as h,G as i,z as l,T as m,Z as n,L as o,A as p,X as r,R as s,Q as t,M as u};
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/remote-desktop-mobile-view-
|
|
2
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import{vt as r}from"./vendor-ui-BTSIXzhZ.js";import"./icons-BwyIKaTT.js";import"./api-client-xQDlhUTu.js";import"./settings-store-B4mLp19V.js";import{t as i}from"./preload-helper-CM8YhcCa.js";import{n as a}from"./portal-container-context-NBi-KGK0.js";import"./window-store-DqX_qmkQ.js";import"./panel-store-BJhazigC.js";import"./project-store-BLGl9IAO.js";import"./project-framework-store-DwLxaRan.js";import"./session-list-sync-triggers-DtJI5KF0.js";import{ln as o}from"./index-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/remote-desktop-mobile-view-DdpI-RF8.js","assets/rolldown-runtime-C5c2KzVm.js","assets/index-BtAn_krv.js","assets/preload-helper-CM8YhcCa.js","assets/vendor-ui-BTSIXzhZ.js","assets/vendor-markdown-C-P1aR4p.js","assets/button-C9ZXWb3b.js","assets/utils-Bslrbb-G.js","assets/createLucideIcon-D9_fdOKS.js","assets/file-diff-CcDhJkXB.js","assets/git-commit-horizontal-BPdj2L1i.js","assets/api-client-xQDlhUTu.js","assets/react-BZ0kba1-.js","assets/open-db-tabs-CtWIWHOa.js","assets/window-store-DqX_qmkQ.js","assets/panel-store-BJhazigC.js","assets/session-list-sync-triggers-DtJI5KF0.js","assets/project-store-BLGl9IAO.js","assets/project-framework-store-DwLxaRan.js","assets/explorer-model-BtJN4MZ9.js","assets/db-sidebar-reveal-_qw0CliT.js","assets/settings-store-B4mLp19V.js","assets/use-is-mobile-VRV9eZy1.js","assets/db-types-CNhENouW.js","assets/tab-store-D5I52eLN.js","assets/use-db-driver-installed-anzWkGi5.js","assets/impexp-state-BWKOuRGj.js","assets/file-store-BQ41vIs5.js","assets/sql-identifiers-DDISwQor.js","assets/db-explorer-store-BmpvDHz6.js","assets/onboarding-quick-orientation-CTHtIRib.js","assets/dialog-Dn_2tuYa.js","assets/portal-container-context-NBi-KGK0.js","assets/icons-BwyIKaTT.js","assets/format-file-meta-DdYtk07C.js","assets/fs-api-CFtQzsIJ.js","assets/open-settings-EXR4zoZG.js","assets/settings-categories-Ajj4ui27.js","assets/adaptive-context-menu-C4jNSORA.js","assets/context-menu-BCuZYfWC.js","assets/mobile-bottom-sheet-DArbIyrD.js","assets/use-visual-viewport-MmugpRg-.js","assets/dropdown-menu-BQidk_OJ.js","assets/input-C3oVNCMq.js","assets/scroll-area-DOlQJGZp.js","assets/start-ellipsis-CU8GkxaV.js","assets/chat-preparation-cache-190LLyy7.js","assets/clipboard-D-VCry-F.js","assets/file-icons-JInFtBVl.js","assets/format-date-CSHaU2wN.js","assets/git-repo-store-CKB5fdNP.js","assets/patch-tab-metadata-C92YkrRX.js","assets/ws-auth-CbF6GqxP.js","assets/apply-theme-ORrEdHKT.js","assets/resolve-theme-BqoL27BW.js","assets/index-BACBJm4i.css","assets/remote-desktop-clipboard-notice-D5KjvMZx.js","assets/use-h264-canvas-decoder-_zqeiVx8.js","assets/run-in-terminal-ujoc25vj.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import{vt as r}from"./vendor-ui-BTSIXzhZ.js";import"./icons-BwyIKaTT.js";import"./api-client-xQDlhUTu.js";import"./settings-store-B4mLp19V.js";import{t as i}from"./preload-helper-CM8YhcCa.js";import{n as a}from"./portal-container-context-NBi-KGK0.js";import"./window-store-DqX_qmkQ.js";import"./panel-store-BJhazigC.js";import"./project-store-BLGl9IAO.js";import"./project-framework-store-DwLxaRan.js";import"./session-list-sync-triggers-DtJI5KF0.js";import{ln as o}from"./index-BtAn_krv.js";import"./run-in-terminal-ujoc25vj.js";import{n as s,t as c}from"./remote-desktop-readiness-gate-WIyCCAv5.js";var l=e(t(),1),u=e(r(),1),d=n(),f=(0,l.lazy)(()=>i(()=>import(`./remote-desktop-mobile-view-DdpI-RF8.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,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58])));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};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{Ht as r,K as i,Ln as a,Mr as o,Un as s,Yt as c,Z as l,_r as u,ai as d,gi as f,li as p,nn as m,ri as h,un as g,vt as _,wr as v,zn as ee}from"./icons-BwyIKaTT.js";import"./api-client-xQDlhUTu.js";import{A as y,O as b,t as x}from"./settings-store-B4mLp19V.js";import{n as S}from"./utils-Bslrbb-G.js";import"./window-store-DqX_qmkQ.js";import"./panel-store-BJhazigC.js";import"./project-store-BLGl9IAO.js";import"./project-framework-store-DwLxaRan.js";import"./session-list-sync-triggers-DtJI5KF0.js";import{t as C}from"./use-visual-viewport-MmugpRg-.js";import"./ws-auth-CbF6GqxP.js";import{cn as te}from"./index-BpgSIM5B.js";import"./use-h264-canvas-decoder-_zqeiVx8.js";import"./run-in-terminal-ujoc25vj.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-5r6UbdlN.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:r,mode:i,onToggleMode:o,onOpenKeyboard:l,onResetZoom:u,settingsOpen:m,onToggleSettings:h,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:o,label:i===`mouse`?`Mouse`:`Touch`,active:!0,children:i===`mouse`?(0,H.jsx)(s,{className:`size-5`}):(0,H.jsx)(c,{className:`size-5`})}),(0,H.jsx)(U,{onClick:l,label:`Keyboard`,children:(0,H.jsx)(g,{className:`size-5`})}),(0,H.jsx)(U,{onClick:u,label:`Reset zoom`,children:(0,H.jsx)(f,{className:`size-5`})}),e!==null&&(0,H.jsx)(U,{onClick:t,label:e.length>10?`${e.slice(0,9)}…`:e,children:(0,H.jsx)(a,{className:`size-5`})}),(0,H.jsx)(U,{onClick:r,label:n,children:(0,H.jsx)(d,{className:`size-5`})}),(0,H.jsx)(U,{onClick:h,label:`More`,active:m,children:(0,H.jsx)(v,{className:`size-5`})}),(0,H.jsx)(U,{onClick:_,label:`Close`,children:(0,H.jsx)(p,{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:a,clipboardEnabled:c,onSetClipboardEnabled:u,audioOn:d,audioReason:f,onSetAudioOn:p,privacyOn:g,privacyReason:v,onSetPrivacyOn:ee,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)(r,{className:`size-4`}),label:`Quality monitor`,checked:e,onToggle:t,testId:`remote-desktop-mobile-stats-toggle`}),(0,H.jsx)(Y,{icon:(0,H.jsx)(s,{className:`size-4`}),label:`Show remote cursor`,hint:`Restarts the stream`,checked:n,onToggle:()=>a(!n),testId:`remote-desktop-mobile-cursor-toggle`}),(0,H.jsx)(Y,{icon:(0,H.jsx)(l,{className:`size-4`}),label:`Sync clipboard`,hint:`Off: Ctrl+V pastes the host's own clipboard`,checked:c,onToggle:()=>u(!c),testId:`remote-desktop-mobile-clipboard-toggle`}),(0,H.jsx)(Y,{icon:(0,H.jsx)(h,{className:`size-4`}),label:`Play host audio`,hint:f??void 0,checked:d,disabled:f!==null,onToggle:()=>p(!d),testId:`remote-desktop-mobile-audio-toggle`}),(0,H.jsx)(Y,{icon:(0,H.jsx)(_,{className:`size-4`}),label:`Privacy mode`,hint:v??`Blocks the host's own keyboard and mouse`,checked:g,disabled:v!==null&&!g,onToggle:()=>ee(!g),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)(m,{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)(o,{className:`size-4 text-red-500`}),` Stop recording`]}):(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(i,{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`),[a,o]=(0,A.useState)(!1),[s,c]=(0,A.useState)(!1),l=ie(),{connState:d,errorMessage:f,decoderStatus:p,decoderErrorMessage:m,sendMessage:h,reconnect:g,getTotalBytes:_,getFrameCount:v,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:l.displayId}),de=x(e=>e.remoteDesktopStatsVisible),B=x(e=>e.toggleRemoteDesktopStatsVisible),V=x(e=>e.remoteDesktopClipboardSync),U=x(e=>e.setRemoteDesktopClipboardSync),W=x(e=>e.remoteDesktopQuality),G=d===`streaming`,{transform:K,virtualCursor:q,resetZoom:J}=fe({containerRef:t,canvasRef:n,mode:r,sendMessage:h,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(h,G,V?_e:void 0),$=C(!0)?.keyboardInset??0,be=(0,A.useCallback)(()=>i(e=>e===`mouse`?`touch`:`mouse`),[]),xe=(0,A.useCallback)(()=>{ye(),o(!0)},[ye]),Se=p===`unsupported`?m: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)(ee,{className:`size-6 opacity-70`}),(0,H.jsx)(`span`,{className:`max-w-sm px-4 text-center`,children:Se}),(d===`error`||d===`closed`)&&p!==`unsupported`&&(0,H.jsxs)(`button`,{onClick:g,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)(u,{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:()=>o(!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)]`}),s&&(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)}),a&&(0,H.jsx)(he,{sendMessage:h,onCopyCombo:V?z:void 0}),(0,H.jsx)(me,{displayLabel:l.displays.length>1?l.current?.label??null:null,onNextDisplay:l.next,qualityLabel:y(W),onNextQuality:()=>ne(b(W)),mode:r,onToggleMode:be,onOpenKeyboard:xe,onResetZoom:J,settingsOpen:s,onToggleSettings:()=>c(e=>!e),onClose:e})]}),(0,H.jsx)(O,{canvasRef:n,getFrameCount:v,getTotalBytes:_,positionClassName:`left-1 top-[calc(env(safe-area-inset-top,0px)+2.75rem)]`})]})}export{X as default};
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{Ht as r,K as i,Ln as a,Mr as o,Un as s,Yt as c,Z as l,_r as u,ai as d,gi as f,li as p,nn as m,ri as h,un as g,vt as _,wr as v,zn as ee}from"./icons-BwyIKaTT.js";import"./api-client-xQDlhUTu.js";import{A as y,O as b,t as x}from"./settings-store-B4mLp19V.js";import{n as S}from"./utils-Bslrbb-G.js";import"./window-store-DqX_qmkQ.js";import"./panel-store-BJhazigC.js";import"./project-store-BLGl9IAO.js";import"./project-framework-store-DwLxaRan.js";import"./session-list-sync-triggers-DtJI5KF0.js";import{t as C}from"./use-visual-viewport-MmugpRg-.js";import"./ws-auth-CbF6GqxP.js";import{cn as te}from"./index-BtAn_krv.js";import"./use-h264-canvas-decoder-_zqeiVx8.js";import"./run-in-terminal-ujoc25vj.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-D5KjvMZx.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:r,mode:i,onToggleMode:o,onOpenKeyboard:l,onResetZoom:u,settingsOpen:m,onToggleSettings:h,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:o,label:i===`mouse`?`Mouse`:`Touch`,active:!0,children:i===`mouse`?(0,H.jsx)(s,{className:`size-5`}):(0,H.jsx)(c,{className:`size-5`})}),(0,H.jsx)(U,{onClick:l,label:`Keyboard`,children:(0,H.jsx)(g,{className:`size-5`})}),(0,H.jsx)(U,{onClick:u,label:`Reset zoom`,children:(0,H.jsx)(f,{className:`size-5`})}),e!==null&&(0,H.jsx)(U,{onClick:t,label:e.length>10?`${e.slice(0,9)}…`:e,children:(0,H.jsx)(a,{className:`size-5`})}),(0,H.jsx)(U,{onClick:r,label:n,children:(0,H.jsx)(d,{className:`size-5`})}),(0,H.jsx)(U,{onClick:h,label:`More`,active:m,children:(0,H.jsx)(v,{className:`size-5`})}),(0,H.jsx)(U,{onClick:_,label:`Close`,children:(0,H.jsx)(p,{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:a,clipboardEnabled:c,onSetClipboardEnabled:u,audioOn:d,audioReason:f,onSetAudioOn:p,privacyOn:g,privacyReason:v,onSetPrivacyOn:ee,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)(r,{className:`size-4`}),label:`Quality monitor`,checked:e,onToggle:t,testId:`remote-desktop-mobile-stats-toggle`}),(0,H.jsx)(Y,{icon:(0,H.jsx)(s,{className:`size-4`}),label:`Show remote cursor`,hint:`Restarts the stream`,checked:n,onToggle:()=>a(!n),testId:`remote-desktop-mobile-cursor-toggle`}),(0,H.jsx)(Y,{icon:(0,H.jsx)(l,{className:`size-4`}),label:`Sync clipboard`,hint:`Off: Ctrl+V pastes the host's own clipboard`,checked:c,onToggle:()=>u(!c),testId:`remote-desktop-mobile-clipboard-toggle`}),(0,H.jsx)(Y,{icon:(0,H.jsx)(h,{className:`size-4`}),label:`Play host audio`,hint:f??void 0,checked:d,disabled:f!==null,onToggle:()=>p(!d),testId:`remote-desktop-mobile-audio-toggle`}),(0,H.jsx)(Y,{icon:(0,H.jsx)(_,{className:`size-4`}),label:`Privacy mode`,hint:v??`Blocks the host's own keyboard and mouse`,checked:g,disabled:v!==null&&!g,onToggle:()=>ee(!g),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)(m,{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)(o,{className:`size-4 text-red-500`}),` Stop recording`]}):(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(i,{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`),[a,o]=(0,A.useState)(!1),[s,c]=(0,A.useState)(!1),l=ie(),{connState:d,errorMessage:f,decoderStatus:p,decoderErrorMessage:m,sendMessage:h,reconnect:g,getTotalBytes:_,getFrameCount:v,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:l.displayId}),de=x(e=>e.remoteDesktopStatsVisible),B=x(e=>e.toggleRemoteDesktopStatsVisible),V=x(e=>e.remoteDesktopClipboardSync),U=x(e=>e.setRemoteDesktopClipboardSync),W=x(e=>e.remoteDesktopQuality),G=d===`streaming`,{transform:K,virtualCursor:q,resetZoom:J}=fe({containerRef:t,canvasRef:n,mode:r,sendMessage:h,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(h,G,V?_e:void 0),$=C(!0)?.keyboardInset??0,be=(0,A.useCallback)(()=>i(e=>e===`mouse`?`touch`:`mouse`),[]),xe=(0,A.useCallback)(()=>{ye(),o(!0)},[ye]),Se=p===`unsupported`?m: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)(ee,{className:`size-6 opacity-70`}),(0,H.jsx)(`span`,{className:`max-w-sm px-4 text-center`,children:Se}),(d===`error`||d===`closed`)&&p!==`unsupported`&&(0,H.jsxs)(`button`,{onClick:g,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)(u,{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:()=>o(!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)]`}),s&&(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)}),a&&(0,H.jsx)(he,{sendMessage:h,onCopyCombo:V?z:void 0}),(0,H.jsx)(me,{displayLabel:l.displays.length>1?l.current?.label??null:null,onNextDisplay:l.next,qualityLabel:y(W),onNextQuality:()=>ne(b(W)),mode:r,onToggleMode:be,onOpenKeyboard:xe,onResetZoom:J,settingsOpen:s,onToggleSettings:()=>c(e=>!e),onClose:e})]}),(0,H.jsx)(O,{canvasRef:n,getFrameCount:v,getTotalBytes:_,positionClassName:`left-1 top-[calc(env(safe-area-inset-top,0px)+2.75rem)]`})]})}export{X as default};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import{Er as r,K as i,M as a,Rn as o,Ur as s,gt as c,xn as l}from"./icons-BwyIKaTT.js";import{r as u}from"./api-client-xQDlhUTu.js";import{t as d}from"./settings-store-B4mLp19V.js";import{cn as f}from"./index-
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import{Er as r,K as i,M as a,Rn as o,Ur as s,gt as c,xn as l}from"./icons-BwyIKaTT.js";import{r as u}from"./api-client-xQDlhUTu.js";import{t as d}from"./settings-store-B4mLp19V.js";import{cn as f}from"./index-BtAn_krv.js";import{r as p}from"./run-in-terminal-ujoc25vj.js";var m=e(t(),1),h=n();function g({onCancel:e,children:t}){let n=d(e=>e.remoteDesktopWarningDismissed),i=d(e=>e.setRemoteDesktopWarningDismissed),[a,s]=(0,m.useState)(!1),[c,l]=(0,m.useState)(!1);if(n||a)return(0,h.jsx)(h.Fragment,{children:t});let u=()=>{c&&i(!0),s(!0)};return(0,h.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,h.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,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsx)(o,{className:`size-5 shrink-0 text-primary`}),(0,h.jsx)(`h2`,{className:`text-base font-semibold`,children:`Remote Desktop`}),(0,h.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,h.jsxs)(`ul`,{className:`flex flex-col gap-2 text-sm text-white/80`,children:[(0,h.jsxs)(`li`,{className:`flex gap-2`,children:[(0,h.jsx)(r,{className:`mt-0.5 size-4 shrink-0 text-amber-300`}),(0,h.jsxs)(`span`,{children:[`This streams the host's `,(0,h.jsx)(`strong`,{children:`whole screen`}),` and lets you `,(0,h.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,h.jsxs)(`li`,{className:`flex gap-2`,children:[(0,h.jsx)(r,{className:`mt-0.5 size-4 shrink-0 text-amber-300`}),(0,h.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,h.jsxs)(`li`,{className:`flex gap-2`,children:[(0,h.jsx)(r,{className:`mt-0.5 size-4 shrink-0 text-amber-300`}),(0,h.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,h.jsxs)(`label`,{className:`flex min-h-11 cursor-pointer items-center gap-2 text-sm text-white/70`,children:[(0,h.jsx)(`input`,{type:`checkbox`,checked:c,onChange:e=>l(e.target.checked),className:`size-4 accent-primary`,"data-testid":`remote-desktop-warning-dont-show`}),`Don't show this again`]}),(0,h.jsxs)(`div`,{className:`flex gap-2`,children:[(0,h.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,h.jsx)(`button`,{type:`button`,onClick:u,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 _({label:e}){let[t,n]=(0,m.useState)({state:`idle`}),r=(0,m.useRef)(0),[i,a]=(0,m.useState)(!1),[o,s]=(0,m.useState)(null);(0,m.useEffect)(()=>{let e=!1,t=!1,i=async()=>{if(t)return;t=!0;let i=r.current;try{let t=await u.get(`/api/remote-desktop/requirements/ffmpeg/install`);!e&&i===r.current&&(n(t),s(null))}catch(t){!e&&i===r.current&&s(t.message)}finally{t=!1}};i();let a=setInterval(i,2e3);return()=>{e=!0,clearInterval(a)}},[]);let c=async()=>{r.current++,a(!0),s(null);try{let e=await u.post(`/api/remote-desktop/requirements/ffmpeg/install`);r.current++,n(e)}catch(e){s(e.message)}finally{a(!1)}},d=i||t.state===`installing`;return(0,h.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[(0,h.jsxs)(`button`,{type:`button`,disabled:d||t.state===`installed`,onClick:()=>void c(),className:`inline-flex min-h-11 items-center gap-1.5 rounded-md bg-white/10 px-3 text-sm hover:bg-white/20 disabled:opacity-50`,children:[d&&(0,h.jsx)(l,{className:`size-4 animate-spin`}),d?`Installing ffmpeg…`:t.state===`installed`?`Installed — checking…`:e]}),d&&(0,h.jsx)(`p`,{role:`status`,className:`text-xs text-white/70`,children:`Installing on the host. You can close this panel and return later.`}),(o||t.error)&&(0,h.jsx)(`p`,{role:`alert`,className:`text-sm text-red-300`,children:o||t.error})]})}function v({onCancel:e,children:t}){let[n,r]=(0,m.useState)(!1),{caps:i,failed:a,runHostAction:s}=f(!n);if(n||i?.videoReady&&i.inputReady)return(0,h.jsx)(h.Fragment,{children:t});let c=i?.requirements.filter(e=>!e.ok)??[],u=!!i?.videoReady&&!i.inputReady,d=t=>{p(t),e()};return(0,h.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,h.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,h.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,h.jsx)(o,{className:`size-5 shrink-0 text-primary`}),(0,h.jsx)(`h2`,{className:`text-base font-semibold`,children:`This host needs a few things`})]}),!i&&!a&&(0,h.jsxs)(`div`,{className:`flex items-center gap-2 text-sm text-white/70`,children:[(0,h.jsx)(l,{className:`size-4 animate-spin`}),` Checking the host…`]}),a&&(0,h.jsx)(`p`,{className:`text-sm text-red-300`,children:`Could not reach the host's remote-desktop service.`}),(0,h.jsx)(`ul`,{className:`flex flex-col gap-3`,children:i?.requirements.map(e=>(0,h.jsx)(y,{req:e,onHostAction:s,onTerminal:d},e.id))}),c.length>0&&(0,h.jsx)(`p`,{className:`text-xs text-white/50`,children:`Re-checking every few seconds — this updates by itself once fixed.`}),(0,h.jsxs)(`div`,{className:`flex gap-2`,children:[(0,h.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,h.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 y({req:e,...t}){return(0,h.jsxs)(`li`,{className:`flex gap-2`,"data-testid":`remote-desktop-requirement-${e.id}`,"data-ok":e.ok,children:[e.ok?(0,h.jsx)(a,{className:`mt-0.5 size-4 shrink-0 text-emerald-400`}):(0,h.jsx)(i,{className:`mt-0.5 size-4 shrink-0 text-amber-300`}),(0,h.jsxs)(`div`,{className:`flex min-w-0 flex-1 flex-col gap-2`,children:[(0,h.jsxs)(`div`,{className:`text-sm font-medium`,children:[e.title,!e.ok&&(0,h.jsx)(`span`,{className:`ml-2 text-xs font-normal text-white/50`,children:e.gates===`video`?`required`:`for mouse & keyboard`})]}),!e.ok&&(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`p`,{className:`text-sm text-white/70`,children:e.detail}),(0,h.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:e.actions.map(n=>(0,h.jsx)(b,{action:n,reqId:e.id,...t},n.label))})]})]})]})}function b({action:e,reqId:t,onHostAction:n,onTerminal:r}){let i=`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===`install`?(0,h.jsx)(_,{label:e.label}):e.kind===`terminal`?(0,h.jsxs)(`button`,{type:`button`,className:i,onClick:()=>r(e.command),title:e.command,children:[(0,h.jsx)(s,{className:`size-4`}),` `,e.label]}):e.kind===`link`?(0,h.jsxs)(`a`,{className:i,href:e.url,target:`_blank`,rel:`noreferrer`,children:[(0,h.jsx)(c,{className:`size-4`}),` `,e.label]}):(0,h.jsx)(`button`,{type:`button`,className:i,onClick:()=>void n(t,e.action),children:e.label})}export{g as n,v as t};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{Ht as r,In as i,K as a,Ln as o,Mr as s,_r as c,cr as l,nn as u,vt as d,wr as f,zn as p}from"./icons-BwyIKaTT.js";import"./api-client-xQDlhUTu.js";import{D as m,E as h,a as g,c as _,d as v,f 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-B4mLp19V.js";import{n as O}from"./utils-Bslrbb-G.js";import"./portal-container-context-NBi-KGK0.js";import{n as ne}from"./window-store-DqX_qmkQ.js";import"./panel-store-BJhazigC.js";import"./project-store-BLGl9IAO.js";import"./project-framework-store-DwLxaRan.js";import"./session-list-sync-triggers-DtJI5KF0.js";import{t as re}from"./button-C9ZXWb3b.js";import{a as ie,i as ae,n as k,o as A,r as j,t as M}from"./dialog-Dn_2tuYa.js";import{a as N,c as P,d as F,f as I,i as L,l as R,m as oe,n as z,p as B,r as se,s as V,t as H}from"./dropdown-menu-BQidk_OJ.js";import"./ws-auth-CbF6GqxP.js";import{cn as ce}from"./index-BpgSIM5B.js";import"./use-h264-canvas-decoder-_zqeiVx8.js";import"./run-in-terminal-ujoc25vj.js";import{n as U,t as W}from"./remote-desktop-readiness-gate-DXEf2Jnz.js";import{a as G,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-5r6UbdlN.js";var X=e(t(),1);function _e(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 Z={h264_nvenc:`NVIDIA NVENC`,h264_qsv:`Intel QuickSync`,h264_vaapi:`VAAPI (GPU)`,h264_amf:`AMD AMF`,h264_videotoolbox:`Apple VideoToolbox`,libx264:`Software (x264)`};function ve(e){return Object.hasOwn(Z,e)?Z[e]:e}var Q=n(),ye=`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 $({displays:e,currentDisplayId:t,onSelectDisplay:n,quality:i,qualityChoice:c,onSetQuality:l,onOpenCustomQuality:p,codecs:g,codec:_,onSetCodec:v,hostModes:y,hostModeId:x,hostOriginalModeId:S,onSetHostMode:C,canResizeHost:ee,resolutionError:w,viewStyle:T,customScale:E,onSetViewStyle:D,onSetCustomScale:ne,showCursor:re,onSetShowCursor:ie,audioOn:ae,audioReason:k,onSetAudioOn:A,privacyOn:j,privacyReason:M,privacyCanBlank:ce,onSetPrivacyOn:U,recording:W,recordingElapsedSec:G,recordingSupported:K,onToggleRecording:ue,onScreenshot:q,clipboardEnabled:fe,onSetClipboardEnabled:pe,statsVisible:me,onToggleStats:ge}){let Y=(0,X.useMemo)(()=>le(y),[y]),_e=(0,X.useMemo)(()=>he(),[]),Z=(0,X.useMemo)(()=>J(y,_e,x),[y,_e,x]),$=!!(S&&S!==x),Se=t??e.find(e=>e.primary)?.id??e[0]?.id??``;return(0,Q.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,Q.jsxs)(H,{children:[(0,Q.jsx)(oe,{className:ye,"aria-label":`Display`,title:`Display`,children:(0,Q.jsx)(o,{className:`size-3.5`})}),(0,Q.jsxs)(se,{align:`end`,className:`w-64`,children:[(0,Q.jsx)(N,{children:`Display`}),(0,Q.jsx)(V,{value:Se,onValueChange:n,children:e.map(e=>(0,Q.jsxs)(P,{value:e.id,"data-testid":`remote-desktop-display-${e.id}`,children:[e.label,e.primary?` (main)`:``,` · `,e.width,`×`,e.height]},e.id))})]})]}),(0,Q.jsxs)(H,{children:[(0,Q.jsx)(oe,{className:ye,"aria-label":`Display settings`,title:`Display settings`,"data-testid":`remote-desktop-settings-trigger`,children:(0,Q.jsx)(f,{className:`size-3.5`})}),(0,Q.jsxs)(se,{align:`end`,className:`w-64`,children:[(0,Q.jsx)(N,{children:`Scale`}),(0,Q.jsx)(V,{value:T,onValueChange:e=>D(e),children:b.map(e=>(0,Q.jsx)(P,{value:e,"data-testid":`remote-desktop-view-style-${e}`,children:te[e]},e))}),T===`custom`&&(0,Q.jsx)(xe,{scale:E,onSet:ne}),(0,Q.jsx)(R,{}),(0,Q.jsxs)(F,{children:[(0,Q.jsxs)(B,{"data-testid":`remote-desktop-quality-submenu`,children:[`Image quality`,i.held<1&&(0,Q.jsxs)(`span`,{className:`ml-1.5 text-[10px] opacity-60`,"data-testid":`remote-desktop-quality-held`,children:[Math.round(i.held*100),`% — link limited`]})]}),(0,Q.jsx)(I,{className:`w-56`,children:(0,Q.jsxs)(V,{value:c,onValueChange:e=>e===`custom`?p():l(e),children:[m.map(e=>(0,Q.jsx)(P,{value:e,"data-testid":`remote-desktop-quality-${e}`,children:h[e].label},e)),(0,Q.jsx)(P,{value:`custom`,"data-testid":`remote-desktop-quality-custom`,children:`Custom…`})]})})]}),g.length>1&&(0,Q.jsxs)(F,{children:[(0,Q.jsx)(B,{"data-testid":`remote-desktop-codec-submenu`,children:`Codec`}),(0,Q.jsx)(I,{className:`w-56`,children:(0,Q.jsxs)(V,{value:_??`auto`,onValueChange:e=>v(e===`auto`?null:e),children:[(0,Q.jsxs)(P,{value:`auto`,children:[`Auto · `,ve(g[0])]}),g.map(e=>(0,Q.jsx)(P,{value:e,"data-testid":`remote-desktop-codec-${e}`,children:ve(e)},e))]})})]}),ee&&Y.length>1&&(0,Q.jsxs)(F,{children:[(0,Q.jsx)(B,{"data-testid":`remote-desktop-resolution-submenu`,children:`Resolution`}),(0,Q.jsxs)(I,{className:`max-h-80 w-56 overflow-y-auto`,children:[$&&S&&(0,Q.jsx)(L,{onSelect:()=>C(S),"data-testid":`remote-desktop-resolution-original`,children:`Original`}),Z&&(0,Q.jsxs)(L,{onSelect:()=>C(Z.id),"data-testid":`remote-desktop-resolution-fit-local`,children:[`Fit local `,Z.width,`×`,Z.height]}),($||Z)&&(0,Q.jsx)(R,{}),(0,Q.jsx)(V,{value:x??Y.find(e=>e.current)?.id??``,onValueChange:C,children:Y.map(e=>(0,Q.jsxs)(P,{value:e.id,"data-testid":`remote-desktop-resolution-${e.width}x${e.height}`,children:[de(e),e.preferred&&(0,Q.jsx)(`span`,{className:`ml-1.5 text-[10px] opacity-60`,children:`native`})]},e.id))}),w&&(0,Q.jsx)(`div`,{className:`px-2 py-1.5 text-[10px] leading-tight text-destructive`,children:w})]})]}),(0,Q.jsx)(R,{}),(0,Q.jsx)(z,{checked:re,onCheckedChange:ie,"data-testid":`remote-desktop-show-cursor`,children:`Show remote cursor`}),(0,Q.jsx)(z,{checked:fe,onCheckedChange:pe,"data-testid":`remote-desktop-clipboard-toggle`,children:`Sync clipboard`}),(0,Q.jsx)(z,{checked:ae,disabled:k!==null,onCheckedChange:A,"data-testid":`remote-desktop-audio-toggle`,children:(0,Q.jsxs)(`span`,{className:`flex min-w-0 flex-col`,children:[(0,Q.jsx)(`span`,{children:`Play host audio`}),k&&(0,Q.jsx)(`span`,{className:`text-[10px] leading-tight text-muted-foreground`,children:k})]})}),(0,Q.jsx)(R,{}),(0,Q.jsx)(z,{checked:j,disabled:M!==null&&!j,onCheckedChange:U,"data-testid":`remote-desktop-privacy-toggle`,children:(0,Q.jsxs)(`span`,{className:`flex min-w-0 flex-col`,children:[(0,Q.jsx)(`span`,{children:`Privacy mode`}),(0,Q.jsx)(`span`,{className:`text-[10px] leading-tight text-muted-foreground`,children:M??(ce?`Blocks the host's keyboard and mouse, and blanks its screen`:`Blocks the host's keyboard and mouse (its screen stays on)`)})]})}),(0,Q.jsx)(R,{}),(0,Q.jsxs)(L,{onSelect:q,"data-testid":`remote-desktop-screenshot`,children:[(0,Q.jsx)(u,{className:`size-3.5`}),` Save screenshot`]}),K&&(0,Q.jsx)(L,{onSelect:ue,"data-testid":`remote-desktop-record`,children:W?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(s,{className:`size-3.5 text-red-500`}),` Stop recording · `,be(G)]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(a,{className:`size-3.5`}),` Start recording`]})})]})]}),j&&(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>U(!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,Q.jsx)(d,{className:`size-3`}),` Host locked`]}),W&&(0,Q.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,Q.jsx)(`span`,{className:`size-1.5 animate-pulse rounded-full bg-white`}),be(G)]}),(0,Q.jsx)(`button`,{type:`button`,onClick:ge,"aria-label":`Toggle stats overlay`,"aria-pressed":me,title:`Quality monitor`,className:O(ye,me&&`bg-primary/70 text-primary-foreground hover:bg-primary/80`),children:(0,Q.jsx)(r,{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,r]=(0,X.useState)(null),a=(0,X.useRef)(null),o=T(Math.round(ee(e)*100)),s=n??o,c=_(s);(0,X.useEffect)(()=>()=>{a.current&&clearTimeout(a.current)},[]);let u=e=>{r(e),a.current&&clearTimeout(a.current),a.current=setTimeout(()=>{r(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,Q.jsx)(`div`,{className:`px-2 py-1.5`,"data-testid":`remote-desktop-zoom-row`,children:(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Q.jsx)(`button`,{type:`button`,className:f,onClick:d(-1),disabled:s<=5,"aria-label":`Decrease`,children:(0,Q.jsx)(i,{className:`size-3.5`})}),(0,Q.jsxs)(`span`,{className:`relative flex-1 py-2.5`,children:[(0,Q.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,Q.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,Q.jsx)(`button`,{type:`button`,className:f,onClick:d(1),disabled:s>=C,"aria-label":`Increase`,children:(0,Q.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?v: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=y(e);d(t),m(c,t)},_=e=>{a(e);let t=w(c,e);t!==c&&(l(t),m(t,u))},b=S(c,s.width,s.height);return(0,Q.jsx)(M,{open:e,onOpenChange:t,children:(0,Q.jsxs)(k,{className:`sm:max-w-md`,"data-testid":`remote-desktop-custom-quality-dialog`,children:[(0,Q.jsxs)(ie,{children:[(0,Q.jsx)(A,{children:`Custom image quality`}),(0,Q.jsx)(j,{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,Q.jsxs)(`div`,{className:`space-y-4 py-2`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,Q.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,Q.jsxs)(`span`,{className:`w-14 text-right text-xs tabular-nums`,children:[c,`%`]}),(0,Q.jsx)(`span`,{className:`w-14 text-xs text-muted-foreground`,children:`Bitrate`}),(0,Q.jsxs)(`label`,{className:`flex shrink-0 items-center gap-1.5 text-xs`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:i,onChange:e=>_(e.target.checked),"data-testid":`remote-desktop-custom-more`,className:`size-3.5 accent-primary`}),`More`]})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,Q.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,Q.jsx)(`span`,{className:`w-14 text-right text-xs tabular-nums`,children:u}),(0,Q.jsx)(`span`,{className:`w-14 text-xs text-muted-foreground`,children:`FPS`}),(0,Q.jsx)(`span`,{className:`w-[4.25rem] shrink-0`,"aria-hidden":!0})]})]}),(0,Q.jsx)(ae,{children:(0,Q.jsx)(re,{onClick:()=>t(!1),children:`Close`})})]})})}function we({id:e}){let t=ne(e=>e.close),n=(0,X.useCallback)(()=>t(e),[t,e]);return(0,Q.jsx)(U,{onCancel:n,children:(0,Q.jsx)(W,{onCancel:n,children:(0,Q.jsx)(Te,{})})})}function Te(){let e=(0,X.useRef)(null),t=fe(),{connState:n,errorMessage:r,decoderStatus:i,decoderErrorMessage:a,sendMessage:o,reconnect:s,getFrameCount:l,getTotalBytes:u,frameSize:d,quality:f,setQuality:m,setCustomQuality:h,showCursor:_,setShowCursor:v,codec:y,setCodec:b,audioOn:x,setAudioOn:S,getAudioTracks:C,privacyOn:ee,privacyError:w,setPrivacyOn:te,hostModeId:T,hostOriginalModeId:D,resolutionError:ne,setHostMode:re,pendingHostClipboard:ie,clearHostClipboard:ae,sendClipboard:k,requestHostClipboard:A}=pe(e,{displayId:t.displayId}),j=E(e=>e.remoteDesktopStatsVisible),M=E(e=>e.toggleRemoteDesktopStatsVisible),N=E(e=>e.remoteDesktopViewStyle),P=E(e=>e.remoteDesktopCustomScale),F=E(e=>e.setRemoteDesktopViewStyle),I=E(e=>e.setRemoteDesktopCustomScale),L=E(e=>e.remoteDesktopClipboardSync),R=E(e=>e.remoteDesktopQuality),oe=E(e=>e.remoteDesktopCustomQualityPercent),z=E(e=>e.remoteDesktopCustomFps),B=E(e=>e.remoteDesktopCustomQualityMore),se=E(e=>e.setRemoteDesktopCustomQualityMore),[V,H]=(0,X.useState)(!1),U=E(e=>e.setRemoteDesktopClipboardSync),{caps:W}=ce(!1),[le,K]=(0,X.useState)(!1),de=(0,X.useMemo)(()=>L?{onPasteText:(e,t)=>{K(!0),k(e,!0,t)},onCopyCombo:A}:void 0,[L,k,A]);_e(e,o,n===`streaming`,de);let q=ue(e,C),J=g(N,P,d),he=i===`unsupported`?a:n===`error`?r:n===`closed`?`Disconnected`:n===`connecting`?`Connecting…`:null;return(0,Q.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,Q.jsx)(`div`,{className:O(`flex h-full w-full`,J?`overflow-auto`:`overflow-hidden`),children:(0,Q.jsx)(`canvas`,{ref:e,"data-testid":`remote-desktop-canvas`,"data-view-style":N,className:O(`m-auto outline-none`,!J&&`max-h-full max-w-full`),style:J?{width:J.width,height:J.height}:void 0})}),(0,Q.jsx)(me,{canvasRef:e,getFrameCount:l,getTotalBytes:u}),(0,Q.jsx)($,{displays:t.displays,currentDisplayId:t.current?.id,onSelectDisplay:t.select,quality:f,qualityChoice:R,onSetQuality:m,onOpenCustomQuality:()=>H(!0),codecs:W?.encoders??[],codec:y,onSetCodec:b,hostModes:W?.resolutions?.modes??[],hostModeId:T,hostOriginalModeId:D,onSetHostMode:re,canResizeHost:W?.inputReady??!1,resolutionError:ne,viewStyle:N,customScale:P,onSetViewStyle:F,onSetCustomScale:I,showCursor:_,onSetShowCursor:v,audioOn:x,audioReason:W&&!W.audio.available?W.audio.reason:null,onSetAudioOn:S,privacyOn:ee,privacyReason:w??(W&&!W.privacy.available?W.privacy.reason:null),privacyCanBlank:W?.privacy?.canBlank??!1,onSetPrivacyOn:te,recording:q.recording,recordingElapsedSec:q.elapsedSec,recordingSupported:q.supported,onToggleRecording:q.toggle,onScreenshot:()=>void G(e.current),clipboardEnabled:L,onSetClipboardEnabled:U,statsVisible:j,onToggleStats:M}),(0,Q.jsx)(ge,{pendingText:ie,onDismiss:ae,missingToolAction:le&&W&&!W.clipboard.available?W.clipboard.action:null,onDismissMissingTool:()=>K(!1)}),(0,Q.jsx)(Ce,{open:V,onOpenChange:H,percent:oe,fps:z,more:B,onSetMore:se,onCommit:h,frameSize:d}),he&&(0,Q.jsxs)(`div`,{className:`absolute inset-0 flex flex-col items-center justify-center gap-3 bg-black/70 text-sm text-white`,children:[(0,Q.jsx)(p,{className:`size-6 opacity-70`}),(0,Q.jsx)(`span`,{className:`max-w-sm text-center px-4`,children:he}),(n===`error`||n===`closed`)&&i!==`unsupported`&&(0,Q.jsxs)(`button`,{onClick:s,className:`flex items-center gap-1.5 rounded-md bg-white/10 px-3 py-1.5 hover:bg-white/20`,children:[(0,Q.jsx)(c,{className:`size-3.5`}),` Reconnect`]})]})]})}export{we as default};
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{Ht as r,In as i,K as a,Ln as o,Mr as s,_r as c,cr as l,nn as u,vt as d,wr as f,zn as p}from"./icons-BwyIKaTT.js";import"./api-client-xQDlhUTu.js";import{D as m,E as h,a as g,c as _,d as v,f 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-B4mLp19V.js";import{n as O}from"./utils-Bslrbb-G.js";import"./portal-container-context-NBi-KGK0.js";import{n as ne}from"./window-store-DqX_qmkQ.js";import"./panel-store-BJhazigC.js";import"./project-store-BLGl9IAO.js";import"./project-framework-store-DwLxaRan.js";import"./session-list-sync-triggers-DtJI5KF0.js";import{t as re}from"./button-C9ZXWb3b.js";import{a as ie,i as ae,n as k,o as A,r as j,t as M}from"./dialog-Dn_2tuYa.js";import{a as N,c as P,d as F,f as I,i as L,l as R,m as oe,n as z,p as B,r as se,s as V,t as H}from"./dropdown-menu-BQidk_OJ.js";import"./ws-auth-CbF6GqxP.js";import{cn as ce}from"./index-BtAn_krv.js";import"./use-h264-canvas-decoder-_zqeiVx8.js";import"./run-in-terminal-ujoc25vj.js";import{n as U,t as W}from"./remote-desktop-readiness-gate-WIyCCAv5.js";import{a as G,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-D5KjvMZx.js";var X=e(t(),1);function _e(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 Z={h264_nvenc:`NVIDIA NVENC`,h264_qsv:`Intel QuickSync`,h264_vaapi:`VAAPI (GPU)`,h264_amf:`AMD AMF`,h264_videotoolbox:`Apple VideoToolbox`,libx264:`Software (x264)`};function ve(e){return Object.hasOwn(Z,e)?Z[e]:e}var Q=n(),ye=`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 $({displays:e,currentDisplayId:t,onSelectDisplay:n,quality:i,qualityChoice:c,onSetQuality:l,onOpenCustomQuality:p,codecs:g,codec:_,onSetCodec:v,hostModes:y,hostModeId:x,hostOriginalModeId:S,onSetHostMode:C,canResizeHost:ee,resolutionError:w,viewStyle:T,customScale:E,onSetViewStyle:D,onSetCustomScale:ne,showCursor:re,onSetShowCursor:ie,audioOn:ae,audioReason:k,onSetAudioOn:A,privacyOn:j,privacyReason:M,privacyCanBlank:ce,onSetPrivacyOn:U,recording:W,recordingElapsedSec:G,recordingSupported:K,onToggleRecording:ue,onScreenshot:q,clipboardEnabled:fe,onSetClipboardEnabled:pe,statsVisible:me,onToggleStats:ge}){let Y=(0,X.useMemo)(()=>le(y),[y]),_e=(0,X.useMemo)(()=>he(),[]),Z=(0,X.useMemo)(()=>J(y,_e,x),[y,_e,x]),$=!!(S&&S!==x),Se=t??e.find(e=>e.primary)?.id??e[0]?.id??``;return(0,Q.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,Q.jsxs)(H,{children:[(0,Q.jsx)(oe,{className:ye,"aria-label":`Display`,title:`Display`,children:(0,Q.jsx)(o,{className:`size-3.5`})}),(0,Q.jsxs)(se,{align:`end`,className:`w-64`,children:[(0,Q.jsx)(N,{children:`Display`}),(0,Q.jsx)(V,{value:Se,onValueChange:n,children:e.map(e=>(0,Q.jsxs)(P,{value:e.id,"data-testid":`remote-desktop-display-${e.id}`,children:[e.label,e.primary?` (main)`:``,` · `,e.width,`×`,e.height]},e.id))})]})]}),(0,Q.jsxs)(H,{children:[(0,Q.jsx)(oe,{className:ye,"aria-label":`Display settings`,title:`Display settings`,"data-testid":`remote-desktop-settings-trigger`,children:(0,Q.jsx)(f,{className:`size-3.5`})}),(0,Q.jsxs)(se,{align:`end`,className:`w-64`,children:[(0,Q.jsx)(N,{children:`Scale`}),(0,Q.jsx)(V,{value:T,onValueChange:e=>D(e),children:b.map(e=>(0,Q.jsx)(P,{value:e,"data-testid":`remote-desktop-view-style-${e}`,children:te[e]},e))}),T===`custom`&&(0,Q.jsx)(xe,{scale:E,onSet:ne}),(0,Q.jsx)(R,{}),(0,Q.jsxs)(F,{children:[(0,Q.jsxs)(B,{"data-testid":`remote-desktop-quality-submenu`,children:[`Image quality`,i.held<1&&(0,Q.jsxs)(`span`,{className:`ml-1.5 text-[10px] opacity-60`,"data-testid":`remote-desktop-quality-held`,children:[Math.round(i.held*100),`% — link limited`]})]}),(0,Q.jsx)(I,{className:`w-56`,children:(0,Q.jsxs)(V,{value:c,onValueChange:e=>e===`custom`?p():l(e),children:[m.map(e=>(0,Q.jsx)(P,{value:e,"data-testid":`remote-desktop-quality-${e}`,children:h[e].label},e)),(0,Q.jsx)(P,{value:`custom`,"data-testid":`remote-desktop-quality-custom`,children:`Custom…`})]})})]}),g.length>1&&(0,Q.jsxs)(F,{children:[(0,Q.jsx)(B,{"data-testid":`remote-desktop-codec-submenu`,children:`Codec`}),(0,Q.jsx)(I,{className:`w-56`,children:(0,Q.jsxs)(V,{value:_??`auto`,onValueChange:e=>v(e===`auto`?null:e),children:[(0,Q.jsxs)(P,{value:`auto`,children:[`Auto · `,ve(g[0])]}),g.map(e=>(0,Q.jsx)(P,{value:e,"data-testid":`remote-desktop-codec-${e}`,children:ve(e)},e))]})})]}),ee&&Y.length>1&&(0,Q.jsxs)(F,{children:[(0,Q.jsx)(B,{"data-testid":`remote-desktop-resolution-submenu`,children:`Resolution`}),(0,Q.jsxs)(I,{className:`max-h-80 w-56 overflow-y-auto`,children:[$&&S&&(0,Q.jsx)(L,{onSelect:()=>C(S),"data-testid":`remote-desktop-resolution-original`,children:`Original`}),Z&&(0,Q.jsxs)(L,{onSelect:()=>C(Z.id),"data-testid":`remote-desktop-resolution-fit-local`,children:[`Fit local `,Z.width,`×`,Z.height]}),($||Z)&&(0,Q.jsx)(R,{}),(0,Q.jsx)(V,{value:x??Y.find(e=>e.current)?.id??``,onValueChange:C,children:Y.map(e=>(0,Q.jsxs)(P,{value:e.id,"data-testid":`remote-desktop-resolution-${e.width}x${e.height}`,children:[de(e),e.preferred&&(0,Q.jsx)(`span`,{className:`ml-1.5 text-[10px] opacity-60`,children:`native`})]},e.id))}),w&&(0,Q.jsx)(`div`,{className:`px-2 py-1.5 text-[10px] leading-tight text-destructive`,children:w})]})]}),(0,Q.jsx)(R,{}),(0,Q.jsx)(z,{checked:re,onCheckedChange:ie,"data-testid":`remote-desktop-show-cursor`,children:`Show remote cursor`}),(0,Q.jsx)(z,{checked:fe,onCheckedChange:pe,"data-testid":`remote-desktop-clipboard-toggle`,children:`Sync clipboard`}),(0,Q.jsx)(z,{checked:ae,disabled:k!==null,onCheckedChange:A,"data-testid":`remote-desktop-audio-toggle`,children:(0,Q.jsxs)(`span`,{className:`flex min-w-0 flex-col`,children:[(0,Q.jsx)(`span`,{children:`Play host audio`}),k&&(0,Q.jsx)(`span`,{className:`text-[10px] leading-tight text-muted-foreground`,children:k})]})}),(0,Q.jsx)(R,{}),(0,Q.jsx)(z,{checked:j,disabled:M!==null&&!j,onCheckedChange:U,"data-testid":`remote-desktop-privacy-toggle`,children:(0,Q.jsxs)(`span`,{className:`flex min-w-0 flex-col`,children:[(0,Q.jsx)(`span`,{children:`Privacy mode`}),(0,Q.jsx)(`span`,{className:`text-[10px] leading-tight text-muted-foreground`,children:M??(ce?`Blocks the host's keyboard and mouse, and blanks its screen`:`Blocks the host's keyboard and mouse (its screen stays on)`)})]})}),(0,Q.jsx)(R,{}),(0,Q.jsxs)(L,{onSelect:q,"data-testid":`remote-desktop-screenshot`,children:[(0,Q.jsx)(u,{className:`size-3.5`}),` Save screenshot`]}),K&&(0,Q.jsx)(L,{onSelect:ue,"data-testid":`remote-desktop-record`,children:W?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(s,{className:`size-3.5 text-red-500`}),` Stop recording · `,be(G)]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(a,{className:`size-3.5`}),` Start recording`]})})]})]}),j&&(0,Q.jsxs)(`button`,{type:`button`,onClick:()=>U(!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,Q.jsx)(d,{className:`size-3`}),` Host locked`]}),W&&(0,Q.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,Q.jsx)(`span`,{className:`size-1.5 animate-pulse rounded-full bg-white`}),be(G)]}),(0,Q.jsx)(`button`,{type:`button`,onClick:ge,"aria-label":`Toggle stats overlay`,"aria-pressed":me,title:`Quality monitor`,className:O(ye,me&&`bg-primary/70 text-primary-foreground hover:bg-primary/80`),children:(0,Q.jsx)(r,{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,r]=(0,X.useState)(null),a=(0,X.useRef)(null),o=T(Math.round(ee(e)*100)),s=n??o,c=_(s);(0,X.useEffect)(()=>()=>{a.current&&clearTimeout(a.current)},[]);let u=e=>{r(e),a.current&&clearTimeout(a.current),a.current=setTimeout(()=>{r(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,Q.jsx)(`div`,{className:`px-2 py-1.5`,"data-testid":`remote-desktop-zoom-row`,children:(0,Q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,Q.jsx)(`button`,{type:`button`,className:f,onClick:d(-1),disabled:s<=5,"aria-label":`Decrease`,children:(0,Q.jsx)(i,{className:`size-3.5`})}),(0,Q.jsxs)(`span`,{className:`relative flex-1 py-2.5`,children:[(0,Q.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,Q.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,Q.jsx)(`button`,{type:`button`,className:f,onClick:d(1),disabled:s>=C,"aria-label":`Increase`,children:(0,Q.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?v: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=y(e);d(t),m(c,t)},_=e=>{a(e);let t=w(c,e);t!==c&&(l(t),m(t,u))},b=S(c,s.width,s.height);return(0,Q.jsx)(M,{open:e,onOpenChange:t,children:(0,Q.jsxs)(k,{className:`sm:max-w-md`,"data-testid":`remote-desktop-custom-quality-dialog`,children:[(0,Q.jsxs)(ie,{children:[(0,Q.jsx)(A,{children:`Custom image quality`}),(0,Q.jsx)(j,{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,Q.jsxs)(`div`,{className:`space-y-4 py-2`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,Q.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,Q.jsxs)(`span`,{className:`w-14 text-right text-xs tabular-nums`,children:[c,`%`]}),(0,Q.jsx)(`span`,{className:`w-14 text-xs text-muted-foreground`,children:`Bitrate`}),(0,Q.jsxs)(`label`,{className:`flex shrink-0 items-center gap-1.5 text-xs`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,checked:i,onChange:e=>_(e.target.checked),"data-testid":`remote-desktop-custom-more`,className:`size-3.5 accent-primary`}),`More`]})]}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,Q.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,Q.jsx)(`span`,{className:`w-14 text-right text-xs tabular-nums`,children:u}),(0,Q.jsx)(`span`,{className:`w-14 text-xs text-muted-foreground`,children:`FPS`}),(0,Q.jsx)(`span`,{className:`w-[4.25rem] shrink-0`,"aria-hidden":!0})]})]}),(0,Q.jsx)(ae,{children:(0,Q.jsx)(re,{onClick:()=>t(!1),children:`Close`})})]})})}function we({id:e}){let t=ne(e=>e.close),n=(0,X.useCallback)(()=>t(e),[t,e]);return(0,Q.jsx)(U,{onCancel:n,children:(0,Q.jsx)(W,{onCancel:n,children:(0,Q.jsx)(Te,{})})})}function Te(){let e=(0,X.useRef)(null),t=fe(),{connState:n,errorMessage:r,decoderStatus:i,decoderErrorMessage:a,sendMessage:o,reconnect:s,getFrameCount:l,getTotalBytes:u,frameSize:d,quality:f,setQuality:m,setCustomQuality:h,showCursor:_,setShowCursor:v,codec:y,setCodec:b,audioOn:x,setAudioOn:S,getAudioTracks:C,privacyOn:ee,privacyError:w,setPrivacyOn:te,hostModeId:T,hostOriginalModeId:D,resolutionError:ne,setHostMode:re,pendingHostClipboard:ie,clearHostClipboard:ae,sendClipboard:k,requestHostClipboard:A}=pe(e,{displayId:t.displayId}),j=E(e=>e.remoteDesktopStatsVisible),M=E(e=>e.toggleRemoteDesktopStatsVisible),N=E(e=>e.remoteDesktopViewStyle),P=E(e=>e.remoteDesktopCustomScale),F=E(e=>e.setRemoteDesktopViewStyle),I=E(e=>e.setRemoteDesktopCustomScale),L=E(e=>e.remoteDesktopClipboardSync),R=E(e=>e.remoteDesktopQuality),oe=E(e=>e.remoteDesktopCustomQualityPercent),z=E(e=>e.remoteDesktopCustomFps),B=E(e=>e.remoteDesktopCustomQualityMore),se=E(e=>e.setRemoteDesktopCustomQualityMore),[V,H]=(0,X.useState)(!1),U=E(e=>e.setRemoteDesktopClipboardSync),{caps:W}=ce(!1),[le,K]=(0,X.useState)(!1),de=(0,X.useMemo)(()=>L?{onPasteText:(e,t)=>{K(!0),k(e,!0,t)},onCopyCombo:A}:void 0,[L,k,A]);_e(e,o,n===`streaming`,de);let q=ue(e,C),J=g(N,P,d),he=i===`unsupported`?a:n===`error`?r:n===`closed`?`Disconnected`:n===`connecting`?`Connecting…`:null;return(0,Q.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,Q.jsx)(`div`,{className:O(`flex h-full w-full`,J?`overflow-auto`:`overflow-hidden`),children:(0,Q.jsx)(`canvas`,{ref:e,"data-testid":`remote-desktop-canvas`,"data-view-style":N,className:O(`m-auto outline-none`,!J&&`max-h-full max-w-full`),style:J?{width:J.width,height:J.height}:void 0})}),(0,Q.jsx)(me,{canvasRef:e,getFrameCount:l,getTotalBytes:u}),(0,Q.jsx)($,{displays:t.displays,currentDisplayId:t.current?.id,onSelectDisplay:t.select,quality:f,qualityChoice:R,onSetQuality:m,onOpenCustomQuality:()=>H(!0),codecs:W?.encoders??[],codec:y,onSetCodec:b,hostModes:W?.resolutions?.modes??[],hostModeId:T,hostOriginalModeId:D,onSetHostMode:re,canResizeHost:W?.inputReady??!1,resolutionError:ne,viewStyle:N,customScale:P,onSetViewStyle:F,onSetCustomScale:I,showCursor:_,onSetShowCursor:v,audioOn:x,audioReason:W&&!W.audio.available?W.audio.reason:null,onSetAudioOn:S,privacyOn:ee,privacyReason:w??(W&&!W.privacy.available?W.privacy.reason:null),privacyCanBlank:W?.privacy?.canBlank??!1,onSetPrivacyOn:te,recording:q.recording,recordingElapsedSec:q.elapsedSec,recordingSupported:q.supported,onToggleRecording:q.toggle,onScreenshot:()=>void G(e.current),clipboardEnabled:L,onSetClipboardEnabled:U,statsVisible:j,onToggleStats:M}),(0,Q.jsx)(ge,{pendingText:ie,onDismiss:ae,missingToolAction:le&&W&&!W.clipboard.available?W.clipboard.action:null,onDismissMissingTool:()=>K(!1)}),(0,Q.jsx)(Ce,{open:V,onOpenChange:H,percent:oe,fps:z,more:B,onSetMore:se,onCommit:h,frameSize:d}),he&&(0,Q.jsxs)(`div`,{className:`absolute inset-0 flex flex-col items-center justify-center gap-3 bg-black/70 text-sm text-white`,children:[(0,Q.jsx)(p,{className:`size-6 opacity-70`}),(0,Q.jsx)(`span`,{className:`max-w-sm text-center px-4`,children:he}),(n===`error`||n===`closed`)&&i!==`unsupported`&&(0,Q.jsxs)(`button`,{onClick:s,className:`flex items-center gap-1.5 rounded-md bg-white/10 px-3 py-1.5 hover:bg-white/20`,children:[(0,Q.jsx)(c,{className:`size-3.5`}),` Reconnect`]})]})]})}export{we as default};
|
|
Binary file
|
|
Binary file
|
package/dist/web/assets/{rename-object-dialog-Bs7pUsUP.js → rename-object-dialog-pIgWe_AL.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import"./icons-BwyIKaTT.js";import"./api-client-xQDlhUTu.js";import"./portal-container-context-NBi-KGK0.js";import"./project-framework-store-DwLxaRan.js";import"./button-C9ZXWb3b.js";import"./dialog-Dn_2tuYa.js";import"./file-icons-JInFtBVl.js";import"./dropdown-menu-BQidk_OJ.js";import"./fs-api-CFtQzsIJ.js";import"./format-file-meta-DdYtk07C.js";import"./input-C3oVNCMq.js";import"./scroll-area-DOlQJGZp.js";import{g as r,qn as i,u as a}from"./index-
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import"./icons-BwyIKaTT.js";import"./api-client-xQDlhUTu.js";import"./portal-container-context-NBi-KGK0.js";import"./project-framework-store-DwLxaRan.js";import"./button-C9ZXWb3b.js";import"./dialog-Dn_2tuYa.js";import"./file-icons-JInFtBVl.js";import"./dropdown-menu-BQidk_OJ.js";import"./fs-api-CFtQzsIJ.js";import"./format-file-meta-DdYtk07C.js";import"./input-C3oVNCMq.js";import"./scroll-area-DOlQJGZp.js";import{g as r,qn as i,u as a}from"./index-BtAn_krv.js";import{t as o}from"./editor-dialog-BwNXSajD.js";var s=e(t(),1),c=n();function l({request:e}){let[t,n]=(0,s.useState)(e.value),[l,u]=(0,s.useState)(!1),d=t.trim(),f=d===``?[`Type the new name`]:[],p=d===e.value,m=()=>{u(!0),!(f.length>0||p)&&(i(),e.onConfirm(d))};return(0,c.jsx)(o,{title:`Rename object`,description:`A new name for ${e.value}`,onClose:i,onSubmit:m,problems:l?f:[],buttons:[{label:`OK`,onClick:m,variant:`default`,disabled:p},{label:`Close`,onClick:i}],children:(0,c.jsx)(a,{label:`New name`,htmlFor:`rename-object-name`,children:(0,c.jsx)(r,{id:`rename-object-name`,value:t,mono:!0,autoFocus:!0,onFocus:e=>e.currentTarget.select(),onChange:e=>n(e.target.value)})})})}export{l as RenameObjectDialog};
|
|
Binary file
|
|
Binary file
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import{A as r,G as i,Ut as a,Yr as o,en as s,g as c,gr as l,kn as u,ut as d}from"./icons-BwyIKaTT.js";import{n as f}from"./utils-Bslrbb-G.js";import{r as p}from"./clipboard-D-VCry-F.js";import{t as m}from"./button-C9ZXWb3b.js";import{t as h}from"./mobile-bottom-sheet-DArbIyrD.js";import{et as g,tt as _}from"./index-
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import{A as r,G as i,Ut as a,Yr as o,en as s,g as c,gr as l,kn as u,ut as d}from"./icons-BwyIKaTT.js";import{n as f}from"./utils-Bslrbb-G.js";import{r as p}from"./clipboard-D-VCry-F.js";import{t as m}from"./button-C9ZXWb3b.js";import{t as h}from"./mobile-bottom-sheet-DArbIyrD.js";import{et as g,tt as _}from"./index-BtAn_krv.js";import{t as v}from"./libesm-B6LsX5wH.js";import{n as y,r as b}from"./session-turns-D3QpTtCq.js";var x=e(t(),1),S=n(),C=`ppm:shiki-theme-change`;function w(e){let t=e.slice(Math.max(e.lastIndexOf(`/`),e.lastIndexOf(`\\`))+1).toLowerCase();if(t===`dockerfile`||t.endsWith(`.dockerfile`))return`docker`;if(t===`makefile`)return`make`;let n=t.lastIndexOf(`.`);return n>0?t.slice(n+1):void 0}function T(e,t){let[n,r]=(0,x.useState)(0);(0,x.useEffect)(()=>{let e=()=>r(e=>e+1);return window.addEventListener(C,e),()=>window.removeEventListener(C,e)},[]);let i=(0,x.useMemo)(()=>e.map(e=>_(e,t)),[...e,t,n]),a=i.some(e=>e===null);return(0,x.useEffect)(()=>{if(!a)return;let n=!1;return Promise.all(e.map(e=>g(e,t).catch(()=>null))).then(()=>{n||r(e=>e+1)}),()=>{n=!0}},[a,...e,t]),i}function E({text:e,tokens:t,span:n,spanClass:r}){let i=t&&t.reduce((e,t)=>e+t.content.length,0)===e.length?t:[{content:e}],a=[],o=0;return i.forEach((e,t)=>{let i=o;o+=e.content.length;let s=e.color||e.fontStyle?{color:e.color,fontStyle:e.fontStyle&&e.fontStyle&1?`italic`:void 0}:void 0;if(!n||o<=n[0]||i>=n[1]){a.push((0,S.jsx)(`span`,{style:s,children:e.content},t));return}let c=Math.max(n[0],i)-i,l=Math.min(n[1],o)-i;c>0&&a.push((0,S.jsx)(`span`,{style:s,children:e.content.slice(0,c)},`${t}a`)),a.push((0,S.jsx)(`span`,{style:s,className:r,children:e.content.slice(c,l)},`${t}b`)),l<e.content.length&&a.push((0,S.jsx)(`span`,{style:s,children:e.content.slice(l)},`${t}c`))}),(0,S.jsx)(S.Fragment,{children:a})}function D(e){return e?e.match(/[^\n]*\n|[^\n]+$/g)??[]:[]}function O(e){return e.endsWith(`\r
|
|
2
2
|
`)?e.slice(0,-2):e.endsWith(`
|
|
3
3
|
`)?e.slice(0,-1):e}function k(e){let t=3735928559,n=1103547991;for(let r=0;r<e.length;r++){let i=e.charCodeAt(r);t=Math.imul(t^i,2654435761),n=Math.imul(n^i,1597334677)}return t=Math.imul(t^t>>>16,2246822507)^Math.imul(n^n>>>13,3266489909),n=Math.imul(n^n>>>16,2246822507)^Math.imul(t^t>>>13,3266489909),(4294967296*(2097151&n)+(t>>>0)).toString(36)}function ee(e,t,n={}){let r=n.context??3,i=v(e,t,{timeout:n.timeoutMs??200});if(!i)return null;let a=[],o=0,s=0,c=0,l=0;for(let e of i){let t=e.added?`+`:e.removed?`-`:` `;for(let n of D(e.value))a.push({k:t,line:n,o,n:s}),t!==`+`&&o++,t!==`-`&&s++,t===`+`&&c++,t===`-`&&l++}let u=[];a.forEach((e,t)=>{e.k!==` `&&u.push(t)});let d=[];for(let e=0;e<u.length;){let t=u[e],n=t,i=e+1;for(;i<u.length&&u[i]-n-1<=2*r;)n=u[i++];let o=Math.max(0,t-r),s=Math.min(a.length,n+r+1);d.push(A(a.slice(o,s))),e=i}return{blocks:d,additions:c,deletions:l,oldLines:o,newLines:s}}function A(e){let t=e[0],n=0,r=0,i=0,a=0,o=[];for(let t of e)t.k!==`+`&&n++,t.k!==`-`&&r++,t.k===`+`&&i++,t.k===`-`&&a++,o.push({k:t.k,text:O(t.line),o:t.k===`+`?null:t.o+1,n:t.k===`-`?null:t.n+1});return{key:`${t.o}.${k(e.map(e=>e.k+e.line).join(``))}`,oldFrom:t.o,oldTo:t.o+n,newFrom:t.n,newTo:t.n+r,rows:o,added:i,removed:a}}function j(e){let t=Number.parseInt(e,10);return Number.isFinite(t)?t:0}function M(e,t,n=200){let r=v(e,t,{timeout:n});if(!r)return null;let i=new Int32Array(D(e).length).fill(-1),a=0,o=0;for(let e of r){let t=D(e.value).length;if(e.added)o+=t;else if(e.removed)a+=t;else for(let e=0;e<t;e++)i[a++]=o++}return i}var N=(e,t)=>`${e}\0${t}`;function te(e){let t=new Map(e.files.map(e=>[e.path,e])),n=[];for(let r of e.order){let i=t.get(r),a=i?void 0:e.gone.get(r);if(!i&&!a)continue;let o=e.reverted.get(r)??[],s;if(i){s=i.blocks?i.blocks.map(e=>({key:e.key,state:e.kept?`kept`:`open`,at:j(e.key)})):[{key:`*`,state:i.reviewed?`kept`:`open`,at:0}];let e=new Map(s.map(e=>[e.key,e]));for(let t of o){if(t.base!==i.base)continue;let n=e.get(t.key);n?i.version===t.drawnVersion&&(n.state=`reverted`):s.push({key:t.key,state:`reverted`,at:t.oldFrom})}}else s=o.length?o.map(e=>({key:e.key,state:`reverted`,at:e.oldFrom})):[{key:`*`,state:`reverted`,at:0}];s.sort((e,t)=>e.at-t.at);let c=s.map(t=>({key:t.key,state:e.pending?.get(N(r,t.key))??t.state}));n.push({path:r,file:i??a.file,blocks:c,open:c.filter(e=>e.state===`open`).length,gone:!i})}return n}function ne(e){let t=0,n=0,r=0;for(let i of e)for(let e of i.blocks)e.state===`kept`?t++:e.state===`reverted`?n++:r++;return{total:t+n+r,kept:t,reverted:n,open:r}}function P(e){return[...e.filter(e=>e.open>0),...e.filter(e=>e.open===0)]}function re(e){let t=e.blocks.filter(e=>e.state===`kept`).length,n=e.blocks.length-t;return n?t?{tone:`mixed`,label:`${t} kept · ${n} reverted`}:{tone:`reverted`,label:`Reverted`}:{tone:`kept`,label:`Kept`}}function ie(e,t){if(e.length===0)return null;let n=t?Math.max(0,e.findIndex(e=>e.path===t.path)):0,r=e[n],i=t&&r.path===t.path?r.blocks.findIndex(e=>e.key===t.key):-1;for(let t=0;t<e.length;t++){let r=e[(n+t)%e.length],a=t===0?i+1:0;for(let e=a;e<r.blocks.length;e++)if(r.blocks[e].state===`open`)return{path:r.path,key:r.blocks[e].key}}for(let e=0;e<=i;e++)if(r.blocks[e].state===`open`)return{path:r.path,key:r.blocks[e].key};return null}function F(e,t,n){let r=P(e).flatMap(e=>e.blocks.map(t=>({path:e.path,key:t.key})));if(r.length===0)return null;let i=t?r.findIndex(e=>e.path===t.path&&e.key===t.key):-1;return i<0?r[n===1?0:r.length-1]:r[(i+n+r.length)%r.length]}function I(e){let t=e.blocks.find(e=>e.state===`open`)??e.blocks[0];return t?{path:e.path,key:t.key}:null}function L(e){let t=B(e.original,e.modified);if(!t)return null;let{diff:n,map:r}=t,i=[],a=[],o=new Map(e.reverted.map(e=>[e.key,e])),s=new Set;for(let t of n.blocks){s.add(t.key);let n=o.get(t.key),r=e.kept.has(t.key)?`kept`:`open`,c=e.calls?.get(t.key)??n?.calls;n&&(n.drawnVersion===e.version?r=`reverted`:a.push(n.key)),i.push({key:t.key,rows:t.rows,state:r,added:t.added,removed:t.removed,oldFrom:t.oldFrom,oldTo:t.oldTo,start:t.newFrom,end:t.newTo,...n?.drawnVersion===e.version&&n.undoId?{undoId:n.undoId}:{},...c?{calls:c}:{}})}for(let t of e.reverted){if(s.has(t.key))continue;let n=t.base===e.base?V(t,r,e.original):-1,o=n+(t.oldTo-t.oldFrom);if(n<0||i.some(e=>e.start<o&&n<e.end)){a.push(t.key);continue}i.push({key:t.key,rows:t.rows,state:`reverted`,added:t.added,removed:t.removed,oldFrom:t.oldFrom,oldTo:t.oldTo,start:n,end:o,...t.undoId?{undoId:t.undoId}:{},...t.calls?{calls:t.calls}:{}})}i.sort((e,t)=>e.start-t.start||e.end-t.end);let c=[],l=0;return i.forEach(({start:t,end:n,...r},i)=>{t>l&&c.push({kind:`gap`,from:l,to:t}),c.push({kind:`block`,...r,state:e.pending?.get(r.key)??r.state,index:i}),l=Math.max(l,n)}),l<n.newLines&&c.push({kind:`gap`,from:l,to:n.newLines}),{items:c,lines:t.lines,baseLine:t.baseLine,total:i.length,stale:a}}var R=[],z=4;function B(e,t){let n=R.find(n=>n.original===e&&n.modified===t);if(n)return n.cut;let r=ee(e,t),i=r&&M(e,t),a=null;if(r&&i){let n=new Int32Array(r.newLines);i.forEach((e,t)=>{e>=0&&(n[e]=t+1)}),a={original:e,modified:t,diff:r,map:i,lines:D(t).map(e=>e.replace(/\r?\n$/,``)),baseLine:n}}return R.unshift({original:e,modified:t,cut:a}),R.length=Math.min(R.length,z),a}function V(e,t,n){if(e.oldFrom===e.oldTo)return n===``?0:-1;let r=t[e.oldFrom]??-1;if(r<0)return-1;for(let n=e.oldFrom;n<e.oldTo;n++)if(t[n]!==r+n-e.oldFrom)return-1;return r}function H(e,t){return t===`kept`?e.filter(e=>e.k!==`-`):t===`reverted`?e.filter(e=>e.k!==`+`):[...e]}var U=/[\w$]/;function W(e){let t=e.map(()=>null),n=0;for(;n<e.length;){if(e[n].k!==`-`){n++;continue}let r=n;for(;n<e.length&&e[n].k===`-`;)n++;let i=n;for(;n<e.length&&e[n].k===`+`;)n++;for(let a=0;a<Math.min(i-r,n-i);a++){let n=e[r+a].text,o=e[i+a].text,s=0;for(;s<n.length&&s<o.length&&n[s]===o[s];)s++;for(;s>0&&U.test(n[s-1]);)s--;let c=0;for(;c<n.length-s&&c<o.length-s&&n[n.length-1-c]===o[o.length-1-c];)c++;for(;c>0&&U.test(n[n.length-c]);)c--;n.length-c>s&&(t[r+a]=[s,n.length-c]),o.length-c>s&&(t[i+a]=[s,o.length-c])}}return t}function G(e,t){let n=[];for(let r of e??[]){let e=t.get(r);e&&!n.some(t=>t.turn===e)&&n.push({turn:e,call:r})}return n.sort((e,t)=>Date.parse(e.turn.at)-Date.parse(t.turn.at))}var K=(e,t)=>e.length===t.length&&e.every((e,n)=>e.turn===t[n].turn&&e.call===t[n].call),q=200;function J({children:e,className:t}){return(0,S.jsx)(`kbd`,{className:f(`inline-grid h-4 min-w-4 place-items-center rounded border border-b-2 border-border bg-panel px-1 font-mono text-[10px] font-medium leading-none text-text-2`,t),children:e})}function ae({file:e,model:t,focusKey:n,compact:r,lang:i,turns:o,actions:c}){let l=(0,x.useRef)(null),u=(0,x.useRef)(c);u.current=c;let[d,p]=(0,x.useState)(new Map),m=e.path.slice(Math.max(e.path.lastIndexOf(`/`),e.path.lastIndexOf(`\\`))+1),[g,_]=(0,x.useState)(null),v=(0,x.useMemo)(()=>{let e=new Map;for(let n of t.items)n.kind===`block`&&e.set(n.key,G(n.calls,o));return e},[t.items,o]),y=(0,x.useCallback)((e,t)=>{_(n=>n?.key===e&&n.chip.turn.messageId===t.turn.messageId?null:{key:e,chip:t})},[]),b=(0,x.useCallback)(()=>_(null),[]);return(0,x.useEffect)(()=>{if(!g||r)return;let e=e=>{e.target.closest(`[data-turn-pop], [data-turn-chip]`)||_(null)},t=e=>{e.key===`Escape`&&(e.preventDefault(),_(null))};return document.addEventListener(`pointerdown`,e,!0),document.addEventListener(`keydown`,t,!0),()=>{document.removeEventListener(`pointerdown`,e,!0),document.removeEventListener(`keydown`,t,!0)}},[g,r]),(0,x.useLayoutEffect)(()=>{let e=l.current,t=n?e?.querySelector(`[data-block-key="${CSS.escape(n)}"]`):null;if(!e||!t)return;let r=t.offsetTop-12,i=t.offsetTop+Math.min(t.offsetHeight,e.clientHeight-40);(r<e.scrollTop||i>e.scrollTop+e.clientHeight)&&(e.scrollTop=r)},[n,t.total]),(0,S.jsxs)(`div`,{ref:l,"data-testid":`review-code`,className:f(`relative min-h-0 flex-1 overflow-auto bg-bg font-mono [tab-size:4]`,r?`pt-2 pb-3 text-[11px] leading-[1.65]`:`pt-2.5 pb-6 text-[12px] leading-[1.7]`),children:[e.sinceReview?(0,S.jsx)(Z,{icon:(0,S.jsx)(s,{className:`size-3.5 text-accent-2`}),tint:`var(--accent-2)`,compact:r,children:`You reviewed this file before; only what changed after that is open again.`}):e.baseline===`head`&&(0,S.jsxs)(Z,{icon:(0,S.jsx)(a,{className:`size-3.5 text-warning`}),tint:`var(--warning)`,compact:r,children:[`This chat kept no copy of `,(0,S.jsx)(`b`,{className:`font-semibold text-text`,children:m}),` from before it changed it, so these blocks compare with the last commit.`]}),t.items.map(e=>e.kind===`gap`?(0,S.jsx)(se,{from:e.from,to:e.to,model:t,shown:d.get(e.from)??0,compact:r,lang:i,onOpen:t=>p(n=>new Map(n).set(e.from,t))},`gap:${e.from}`):(0,S.jsx)(ce,{item:e,total:t.total,focused:e.key===n,compact:r,lang:i,chips:v.get(e.key)??Y,openTurn:!r&&g?.key===e.key?g.chip:null,onTurn:y,onCloseTurn:b,act:u},`block:${e.key}`)),r&&(0,S.jsx)(h,{open:!!g,onClose:b,children:g&&(0,S.jsx)(X,{chip:g.chip,compact:!0,onClose:b,act:u})})]})}var Y=[];function X({chip:e,compact:t,onClose:n,act:i}){let{turn:a,call:o}=e,[s,l]=(0,x.useState)(!1);(0,x.useEffect)(()=>{if(!s)return;let e=setTimeout(()=>l(!1),1500);return()=>clearTimeout(e)},[s]);let h=b(a.at);return(0,S.jsxs)(`div`,{"data-turn-pop":!0,onClick:e=>e.stopPropagation(),className:f(`font-sans text-text-2`,t?`px-4 pb-1 text-sm`:`text-[12.5px] leading-normal`),children:[(0,S.jsxs)(`h5`,{className:f(`m-0 mb-1.5 flex items-center gap-2 font-semibold text-text`,t?`text-[15px]`:`text-[13px]`),children:[(0,S.jsx)(u,{className:t?`size-5`:`size-4`}),y(a),h&&` · ${h}`]}),(0,S.jsx)(`blockquote`,{className:f(`m-0 mb-2.5 overflow-y-auto whitespace-pre-wrap rounded-r-md border-l-2 border-primary bg-[color-mix(in_srgb,var(--text)_5%,transparent)] px-2.5 py-2 leading-[1.45] text-text [overflow-wrap:anywhere]`,t?`max-h-[40vh] text-sm`:`max-h-48 text-[13px]`),children:a.prompt||(0,S.jsx)(`span`,{className:`text-text-subtle`,children:`No text — the prompt was only attachments.`})}),(0,S.jsxs)(`div`,{className:f(`flex justify-end gap-1.5`,t&&`gap-2`),children:[(0,S.jsxs)(m,{variant:t?`outline`:`ghost`,size:t?`lg`:`sm`,className:f(t&&`h-11 flex-1`),onClick:()=>void p(a.prompt).then(e=>e&&l(!0)),children:[s?(0,S.jsx)(r,{}):(0,S.jsx)(d,{}),s?`Copied`:`Copy prompt`]}),(0,S.jsxs)(m,{size:t?`lg`:`sm`,className:f(t&&`h-11 flex-1`),onClick:()=>{n(),i.current.showInChat(a,o)},children:[`Show in chat`,(0,S.jsx)(c,{})]})]})]})}function Z({icon:e,tint:t,compact:n,children:r}){return(0,S.jsxs)(`div`,{className:f(`mb-1.5 flex items-center gap-2 rounded-lg px-3 py-2 font-sans text-xs leading-[1.45] text-text-2`,n?`mx-2 ml-1.5`:`mx-3 ml-2`),style:{background:`color-mix(in srgb, ${t} 9%, transparent)`},children:[(0,S.jsx)(`span`,{className:`shrink-0`,children:e}),(0,S.jsx)(`span`,{children:r})]})}var oe=(e,t)=>`${e} ${t}${e===1?``:`s`}`;function se({from:e,to:t,model:n,shown:r,compact:a,lang:o,onOpen:s}){let c=(0,x.useMemo)(()=>{let i=[];for(let a=e;a<e+r&&a<t;a++)i.push({k:` `,text:n.lines[a]??``,o:n.baseLine[a]||null,n:a+1});return i},[e,t,r,n]),l=t-e-r,u=l<=q*1.5?l:q;return(0,S.jsxs)(S.Fragment,{children:[c.length>0&&(0,S.jsx)(`div`,{className:a?`pr-[9px] pl-[7px]`:`pr-[13px] pl-[9px]`,children:(0,S.jsx)($,{rows:c,state:`kept`,compact:a,lang:o,plain:!0})}),l>0&&(0,S.jsxs)(`div`,{className:f(`my-0.5 flex items-center gap-2 font-sans text-[11.5px] font-medium text-text-subtle`,a?`min-h-11 pl-[34px]`:`h-[26px] pl-[50px]`),children:[(0,S.jsx)(`span`,{className:`h-px w-3 bg-[repeating-linear-gradient(90deg,var(--border)_0_4px,transparent_4px_8px)]`}),(0,S.jsxs)(`button`,{type:`button`,title:u<l?`Show the next ${u}`:void 0,onClick:()=>s(r+u),className:f(`inline-flex items-center gap-1.5 whitespace-nowrap rounded-[5px] px-1.5 text-text-subtle hover:bg-surface-hover hover:text-text`,a?`h-11`:`h-[22px]`),children:[(0,S.jsx)(i,{className:`size-3.5`}),oe(l,r?`more unchanged line`:`unchanged line`)]}),(0,S.jsx)(`span`,{className:f(`h-px flex-1 bg-[repeating-linear-gradient(90deg,var(--border)_0_4px,transparent_4px_8px)]`,a?`mr-2.5`:`mr-3.5`)})]})]})}var Q=`inline-flex h-7 items-center gap-1.5 whitespace-nowrap rounded-[7px] border pl-2.5 text-[12.5px] font-medium transition-colors`,ce=(0,x.memo)(function({item:e,total:t,focused:n,compact:i,lang:a,chips:o,openTurn:s,onTurn:c,onCloseTurn:d,act:p}){let m=e.state===`open`,h=e.state===`kept`,g=`${e.index+1} of ${t}`,_=o.map(t=>{let n=s?.turn===t.turn,r=b(t.turn.at);return(0,S.jsxs)(`button`,{type:`button`,"data-turn-chip":!0,"aria-expanded":n,title:t.turn.prompt,onClick:()=>c(e.key,t),className:f(`relative inline-flex h-6 items-center gap-[5px] whitespace-nowrap rounded-md border px-[7px] text-[11.5px] text-text-2`,`pointer-coarse:before:absolute pointer-coarse:before:inset-x-0 pointer-coarse:before:-inset-y-[11px] pointer-coarse:before:content-['']`,n?`border-border bg-panel-2 text-text`:`border-border-soft bg-bg hover:border-border hover:bg-panel-2 hover:text-text`),children:[(0,S.jsx)(u,{className:`size-3`}),(0,S.jsx)(`b`,{className:`font-semibold text-text`,children:y(t.turn)}),r&&(0,S.jsxs)(`span`,{children:[`· `,r]})]},t.turn.messageId)});return(0,S.jsxs)(`div`,{"data-block-key":e.key,"data-state":e.state,"data-focused":n||void 0,onClick:t=>{!n&&!t.target.closest(`button`)&&p.current.focus(e.key)},className:f(`relative my-1.5 rounded-[10px] border border-border-soft bg-bg`,i?`mr-2 ml-1.5`:`mr-3 ml-2`,!m&&`border-dashed`,n?`border-primary/60 shadow-[0_0_0_3px_var(--accent-wash)]`:`cursor-pointer`),children:[(0,S.jsxs)(`div`,{className:f(`relative flex flex-wrap items-center gap-x-2 gap-y-1.5 rounded-t-[9px] py-1 pr-1.5 pl-2.5 font-sans text-xs leading-[1.3] text-text-subtle`,m?`min-h-9 border-b border-border-soft`:`min-h-[30px]`,m&&(n?`bg-[color-mix(in_srgb,var(--accent)_7%,var(--panel))]`:`bg-panel`)),children:[m?(0,S.jsxs)(`span`,{children:[(0,S.jsxs)(`b`,{className:`font-semibold text-text-2`,children:[`Block `,e.index+1]}),` of `,t]}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`span`,{className:f(`inline-flex items-center gap-1 font-semibold`,h?`text-primary`:`text-error`),children:[h?(0,S.jsx)(r,{className:`size-3.5`}):(0,S.jsx)(l,{className:`size-3.5`}),h?`Kept`:`Reverted`]}),(0,S.jsxs)(`span`,{children:[`· block `,g]})]}),_,(0,S.jsx)(`span`,{className:`flex-1`}),!i&&(m?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`button`,{type:`button`,title:`Put these lines back (N)`,onClick:()=>p.current.revert(e.key),className:f(Q,n?`pr-1.5`:`pr-2.5`,`border-border bg-bg text-text hover:border-error/50 hover:text-error`),children:[(0,S.jsx)(l,{className:`size-3.5`}),`Revert`,n&&(0,S.jsx)(J,{children:`N`})]}),(0,S.jsxs)(`button`,{type:`button`,title:`Keep this change (Y)`,onClick:()=>p.current.keep(e.key),className:f(Q,n?`pr-1.5`:`pr-2.5`,`border-transparent bg-primary text-primary-foreground hover:bg-primary/90`),children:[(0,S.jsx)(r,{className:`size-3.5`}),`Keep`,n&&(0,S.jsx)(J,{className:`border-white/30 bg-white/15 text-inherit`,children:`Y`})]})]}):(0,S.jsx)(le,{item:e,act:p})),s&&(0,S.jsx)(`div`,{className:`absolute top-full left-2 z-40 mt-1 w-[330px] max-w-[calc(100%-24px)] rounded-xl border border-border bg-panel-2 p-3.5 shadow-[0_18px_40px_-16px_rgba(0,0,0,.6)]`,children:(0,S.jsx)(X,{chip:s,compact:!1,onClose:d,act:p})})]}),(0,S.jsx)(`div`,{className:f(`overflow-hidden rounded-b-[9px]`,h&&`shadow-[inset_2px_0_0_color-mix(in_srgb,var(--accent)_75%,transparent)]`,e.state===`reverted`&&`shadow-[inset_2px_0_0_color-mix(in_srgb,var(--error)_60%,transparent)]`),children:(0,S.jsx)($,{rows:e.rows,state:e.state,compact:i,lang:a})})]})},(e,t)=>e.item.key===t.item.key&&e.item.state===t.item.state&&e.item.rows===t.item.rows&&e.item.index===t.item.index&&e.item.undoId===t.item.undoId&&e.total===t.total&&e.focused===t.focused&&e.compact===t.compact&&e.lang===t.lang&&K(e.chips,t.chips)&&e.openTurn===t.openTurn&&e.onTurn===t.onTurn);function le({item:e,act:t}){let n=e.state===`reverted`;return(0,S.jsxs)(`button`,{type:`button`,disabled:n&&!e.undoId,title:n?`Put back what the agent wrote here`:`Open this block again`,onClick:()=>n?e.undoId&&t.current.undo(e.undoId,e.key):t.current.reopen(e.key),className:`inline-flex h-6 items-center gap-1 whitespace-nowrap rounded-[5px] px-1.5 text-[11.5px] font-medium text-text-2 hover:bg-surface-hover hover:text-text disabled:opacity-50`,children:[(0,S.jsx)(o,{className:`size-3.5`}),`Change`]})}function $({rows:e,state:t,compact:n,lang:r,plain:i}){let[a,o]=T([(0,x.useMemo)(()=>e.filter(e=>e.k!==`+`).map(e=>e.text).join(`
|
|
4
4
|
`),[e]),(0,x.useMemo)(()=>e.filter(e=>e.k!==`-`).map(e=>e.text).join(`
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import{i as r}from"./project-store-BLGl9IAO.js";import{t as i}from"./button-C9ZXWb3b.js";import{a,i as o,n as s,o as c,t as l}from"./dialog-Dn_2tuYa.js";import{t as u}from"./input-C3oVNCMq.js";import{un as d}from"./index-
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import{i as r}from"./project-store-BLGl9IAO.js";import{t as i}from"./button-C9ZXWb3b.js";import{a,i as o,n as s,o as c,t as l}from"./dialog-Dn_2tuYa.js";import{t as u}from"./input-C3oVNCMq.js";import{un as d}from"./index-BtAn_krv.js";var f=e(t(),1),p=n();function m({open:e,defaultName:t,content:n,onSave:m,onCancel:h}){let[g,_]=(0,f.useState)(t),[v,y]=(0,f.useState)(!1),[b,x]=(0,f.useState)(``),S=r(e=>e.activeProject),C=(0,f.useCallback)(()=>{let e=g.trim();if(!e){x(`Filename cannot be empty`);return}if(/[/\\]/.test(e)){x(`Filename cannot contain / or \\`);return}x(``),y(!0)},[g]),w=(0,f.useCallback)(e=>{let t=e.includes(`\\`)?`\\`:`/`;m(e.endsWith(t)?`${e}${g.trim()}`:`${e}${t}${g.trim()}`,n)},[g,n,m]);return v?(0,p.jsx)(d,{open:!0,mode:`folder`,root:S?.path,title:`Save "${g.trim()}" to...`,onSelect:w,onCancel:()=>y(!1)}):(0,p.jsx)(l,{open:e,onOpenChange:e=>{e||h()},children:(0,p.jsxs)(s,{className:`sm:max-w-md`,children:[(0,p.jsx)(a,{children:(0,p.jsx)(c,{children:`Save As`})}),(0,p.jsxs)(`div`,{className:`flex flex-col gap-2 py-2`,children:[(0,p.jsx)(`label`,{className:`text-sm text-muted-foreground`,children:`Filename`}),(0,p.jsx)(u,{value:g,onChange:e=>{_(e.target.value),x(``)},onKeyDown:e=>{e.key===`Enter`&&C()},placeholder:`e.g. my-file.ts`,autoFocus:!0}),b&&(0,p.jsx)(`p`,{className:`text-xs text-destructive`,children:b})]}),(0,p.jsxs)(o,{children:[(0,p.jsx)(i,{variant:`outline`,onClick:h,children:`Cancel`}),(0,p.jsx)(i,{onClick:C,children:`Choose Folder...`})]})]})})}export{m as t};
|
|
Binary file
|
|
Binary file
|