@hienlh/ppm 0.23.13 → 0.23.15
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 +58 -0
- package/CLAUDE.md +19 -4
- package/THIRD-PARTY-NOTICES.md +1 -1
- package/assets/skills/ppm/SKILL.md +3 -2
- package/assets/skills/ppm/references/cli-reference.md +4 -4
- package/assets/skills/ppm/references/common-tasks.md +6 -0
- package/assets/skills/ppm/references/http-api.md +13 -1
- package/bun.lock +15 -0
- package/dist/web/assets/accounts-settings-section-B5YXy0vd.js +1 -0
- package/dist/web/assets/accounts-settings-section-B5YXy0vd.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-B5YXy0vd.js.gz +0 -0
- package/dist/web/assets/adaptive-context-menu-C4jNSORA.js +1 -0
- package/dist/web/assets/adaptive-context-menu-C4jNSORA.js.br +0 -0
- package/dist/web/assets/adaptive-context-menu-C4jNSORA.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-Bj42PwCK.js +2 -0
- package/dist/web/assets/agent-session-sheet-Bj42PwCK.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-Bj42PwCK.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-store-BAfLnsLX.js +1 -0
- package/dist/web/assets/agent-session-window-content-LqL6fVPU.js +1 -0
- package/dist/web/assets/agent-session-window-content-LqL6fVPU.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-LqL6fVPU.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-jVv2nvAG.js +1 -0
- package/dist/web/assets/ai-resource-editor-jVv2nvAG.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-jVv2nvAG.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-C9Q-v8fY.js +1 -0
- package/dist/web/assets/ai-settings-section-C9Q-v8fY.js.br +0 -0
- package/dist/web/assets/ai-settings-section-C9Q-v8fY.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-CN5BR1ZZ.js +1 -0
- package/dist/web/assets/android-tab-CwqiuEZP.js +2 -0
- package/dist/web/assets/android-tab-CwqiuEZP.js.br +0 -0
- package/dist/web/assets/android-tab-CwqiuEZP.js.gz +0 -0
- package/dist/web/assets/api-client-xQDlhUTu.js +1 -0
- package/dist/web/assets/api-client-xQDlhUTu.js.br +0 -0
- package/dist/web/assets/api-client-xQDlhUTu.js.gz +0 -0
- package/dist/web/assets/api-client-xR05zj6r.js +1 -0
- package/dist/web/assets/api-settings-VAi0LpIJ.js +1 -0
- package/dist/web/assets/api-settings-vmIRFNwZ.js +1 -0
- package/dist/web/assets/api-settings-vmIRFNwZ.js.br +0 -0
- package/dist/web/assets/api-settings-vmIRFNwZ.js.gz +0 -0
- package/dist/web/assets/api-themes-CaXofG7d.js +1 -0
- package/dist/web/assets/appearance-settings-section-D0JIfiRx.js +1 -0
- package/dist/web/assets/appearance-settings-section-D0JIfiRx.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-D0JIfiRx.js.gz +0 -0
- package/dist/web/assets/apps-panel-Cz_KJ37M.js +1 -0
- package/dist/web/assets/apps-panel-Cz_KJ37M.js.br +0 -0
- package/dist/web/assets/apps-panel-Cz_KJ37M.js.gz +0 -0
- package/dist/web/assets/audio-preview-Dq7qZ_6i.js +1 -0
- package/dist/web/assets/audio-preview-Dq7qZ_6i.js.br +0 -0
- package/dist/web/assets/audio-preview-Dq7qZ_6i.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-C3QNpsm7.js +1 -0
- package/dist/web/assets/branch-review-tab-C3QNpsm7.js.br +0 -0
- package/dist/web/assets/branch-review-tab-C3QNpsm7.js.gz +0 -0
- package/dist/web/assets/button-C9ZXWb3b.js +1 -0
- package/dist/web/assets/button-C9ZXWb3b.js.br +0 -0
- package/dist/web/assets/button-C9ZXWb3b.js.gz +0 -0
- package/dist/web/assets/chat-preparation-cache-190LLyy7.js +1 -0
- package/dist/web/assets/chat-preparation-cache-190LLyy7.js.br +0 -0
- package/dist/web/assets/chat-preparation-cache-190LLyy7.js.gz +0 -0
- package/dist/web/assets/chat-tab-D14CUl0J.js +1 -0
- package/dist/web/assets/chat-tab-D14CUl0J.js.br +0 -0
- package/dist/web/assets/chat-tab-D14CUl0J.js.gz +0 -0
- package/dist/web/assets/chat-tab-D8iAVZKV.js +16 -0
- package/dist/web/assets/chat-tab-D8iAVZKV.js.br +0 -0
- package/dist/web/assets/chat-tab-D8iAVZKV.js.gz +0 -0
- package/dist/web/assets/code-editor-B7gbH4-x.js +10 -0
- package/dist/web/assets/code-editor-B7gbH4-x.js.br +0 -0
- package/dist/web/assets/code-editor-B7gbH4-x.js.gz +0 -0
- package/dist/web/assets/codex-reset-credit-button-DQDtyvnd.js +1 -0
- package/dist/web/assets/codex-reset-credit-button-DQDtyvnd.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-DQDtyvnd.js.gz +0 -0
- package/dist/web/assets/conflict-editor-ktOkrODA.js +19 -0
- package/dist/web/assets/conflict-editor-ktOkrODA.js.br +0 -0
- package/dist/web/assets/conflict-editor-ktOkrODA.js.gz +0 -0
- package/dist/web/assets/connection-form-tab-CxvExR7T.js +4 -0
- package/dist/web/assets/connection-form-tab-CxvExR7T.js.br +0 -0
- package/dist/web/assets/connection-form-tab-CxvExR7T.js.gz +0 -0
- package/dist/web/assets/context-menu-BCuZYfWC.js +1 -0
- package/dist/web/assets/context-menu-BCuZYfWC.js.br +0 -0
- package/dist/web/assets/context-menu-BCuZYfWC.js.gz +0 -0
- package/dist/web/assets/createLucideIcon-D9_fdOKS.js +1 -0
- package/dist/web/assets/createLucideIcon-D9_fdOKS.js.br +0 -0
- package/dist/web/assets/createLucideIcon-D9_fdOKS.js.gz +0 -0
- package/dist/web/assets/csv-preview-CBDMTEsF.js +10 -0
- package/dist/web/assets/csv-preview-CBDMTEsF.js.br +0 -0
- package/dist/web/assets/csv-preview-CBDMTEsF.js.gz +0 -0
- package/dist/web/assets/database-drivers-section-DJvU6bf5.js +1 -0
- package/dist/web/assets/database-drivers-section-DJvU6bf5.js.br +0 -0
- package/dist/web/assets/database-drivers-section-DJvU6bf5.js.gz +0 -0
- package/dist/web/assets/db-ai-tools-CVbbW_MZ.js +1 -0
- package/dist/web/assets/db-ai-tools-CVbbW_MZ.js.br +0 -0
- package/dist/web/assets/db-ai-tools-CVbbW_MZ.js.gz +0 -0
- package/dist/web/assets/db-explorer-store-BmpvDHz6.js +1 -0
- package/dist/web/assets/db-explorer-store-BmpvDHz6.js.br +0 -0
- package/dist/web/assets/db-explorer-store-BmpvDHz6.js.gz +0 -0
- package/dist/web/assets/db-sidebar-reveal-_qw0CliT.js +1 -0
- package/dist/web/assets/db-sidebar-reveal-_qw0CliT.js.br +0 -0
- package/dist/web/assets/db-sidebar-reveal-_qw0CliT.js.gz +0 -0
- package/dist/web/assets/db-tab-parts-BgVpKbi6.js +1 -0
- package/dist/web/assets/db-tab-parts-BgVpKbi6.js.br +0 -0
- package/dist/web/assets/db-tab-parts-BgVpKbi6.js.gz +0 -0
- package/dist/web/assets/db-types-CNhENouW.js +1 -0
- package/dist/web/assets/design-canvas-check-BIHc2d_k.js +1 -0
- package/dist/web/assets/design-canvas-check-BIHc2d_k.js.br +0 -0
- package/dist/web/assets/design-canvas-check-BIHc2d_k.js.gz +0 -0
- package/dist/web/assets/design-export-client-CJ3w7Zrk.js +1 -0
- package/dist/web/assets/design-export-client-CJ3w7Zrk.js.br +0 -0
- package/dist/web/assets/design-export-client-CJ3w7Zrk.js.gz +0 -0
- package/dist/web/assets/design-responsive-dialog-MAFgVOmv.js +1 -0
- package/dist/web/assets/design-responsive-dialog-MAFgVOmv.js.br +0 -0
- package/dist/web/assets/design-responsive-dialog-MAFgVOmv.js.gz +0 -0
- package/dist/web/assets/design-settings-section-DPGw61pY.js +2 -0
- package/dist/web/assets/design-settings-section-DPGw61pY.js.br +0 -0
- package/dist/web/assets/design-settings-section-DPGw61pY.js.gz +0 -0
- package/dist/web/assets/design-skill-suggestion-Dmmg_ap5.js +3 -0
- package/dist/web/assets/design-skill-suggestion-Dmmg_ap5.js.br +0 -0
- package/dist/web/assets/design-skill-suggestion-Dmmg_ap5.js.gz +0 -0
- package/dist/web/assets/design-tab-BiCqHNl3.js +57 -0
- package/dist/web/assets/design-tab-BiCqHNl3.js.br +0 -0
- package/dist/web/assets/design-tab-BiCqHNl3.js.gz +0 -0
- package/dist/web/assets/designs-sidebar-panel-pcJ2Rx5G.js +1 -0
- package/dist/web/assets/designs-sidebar-panel-pcJ2Rx5G.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-pcJ2Rx5G.js.gz +0 -0
- package/dist/web/assets/dialog-Dn_2tuYa.js +1 -0
- package/dist/web/assets/dialog-Dn_2tuYa.js.br +0 -0
- package/dist/web/assets/dialog-Dn_2tuYa.js.gz +0 -0
- package/dist/web/assets/diff-viewer-CLAvyqVG.js +4 -0
- package/dist/web/assets/diff-viewer-CLAvyqVG.js.br +0 -0
- package/dist/web/assets/diff-viewer-CLAvyqVG.js.gz +0 -0
- package/dist/web/assets/docx-preview-XSkD2IL6.js +12 -0
- package/dist/web/assets/docx-preview-XSkD2IL6.js.br +0 -0
- package/dist/web/assets/docx-preview-XSkD2IL6.js.gz +0 -0
- package/dist/web/assets/dropdown-menu-BQidk_OJ.js +1 -0
- package/dist/web/assets/dropdown-menu-BQidk_OJ.js.br +0 -0
- package/dist/web/assets/dropdown-menu-BQidk_OJ.js.gz +0 -0
- package/dist/web/assets/edit-diff-preview-DyWUMlkI.js +7 -0
- package/dist/web/assets/edit-diff-preview-DyWUMlkI.js.br +0 -0
- package/dist/web/assets/edit-diff-preview-DyWUMlkI.js.gz +0 -0
- package/dist/web/assets/editor-dialog-cQvqVZAR.js +1 -0
- package/dist/web/assets/editor-dialog-cQvqVZAR.js.br +0 -0
- package/dist/web/assets/editor-dialog-cQvqVZAR.js.gz +0 -0
- package/dist/web/assets/editor-language-service-6-7mS6_9.js +1 -0
- package/dist/web/assets/editor-language-service-6-7mS6_9.js.br +0 -0
- package/dist/web/assets/editor-language-service-6-7mS6_9.js.gz +0 -0
- package/dist/web/assets/explorer-body-BlGDPmNa.js +2 -0
- package/dist/web/assets/explorer-body-BlGDPmNa.js.br +0 -0
- package/dist/web/assets/explorer-body-BlGDPmNa.js.gz +0 -0
- package/dist/web/assets/explorer-model-BtJN4MZ9.js +1 -0
- package/dist/web/assets/explorer-model-BtJN4MZ9.js.br +0 -0
- package/dist/web/assets/explorer-model-BtJN4MZ9.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-BLWY8GJ_.js +1 -0
- package/dist/web/assets/explorer-window-content-BLWY8GJ_.js.br +0 -0
- package/dist/web/assets/explorer-window-content-BLWY8GJ_.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-NSEt5f4z.js +1 -0
- package/dist/web/assets/extension-manager-section-NSEt5f4z.js.br +0 -0
- package/dist/web/assets/extension-manager-section-NSEt5f4z.js.gz +0 -0
- package/dist/web/assets/extension-webview-BkAEBWin.js +12 -0
- package/dist/web/assets/extension-webview-BkAEBWin.js.br +0 -0
- package/dist/web/assets/extension-webview-BkAEBWin.js.gz +0 -0
- package/dist/web/assets/file-diff-CcDhJkXB.js +1 -0
- package/dist/web/assets/file-icons-JInFtBVl.js +1 -0
- package/dist/web/assets/file-icons-JInFtBVl.js.br +0 -0
- package/dist/web/assets/file-icons-JInFtBVl.js.gz +0 -0
- package/dist/web/assets/file-store-BQ41vIs5.js +1 -0
- package/dist/web/assets/file-store-BQ41vIs5.js.br +0 -0
- package/dist/web/assets/file-store-BQ41vIs5.js.gz +0 -0
- package/dist/web/assets/files-settings-section-Bq7liJ_r.js +1 -0
- package/dist/web/assets/files-settings-section-Bq7liJ_r.js.br +0 -0
- package/dist/web/assets/files-settings-section-Bq7liJ_r.js.gz +0 -0
- package/dist/web/assets/filter-dialog-frame-BkEbqBA4.js +1 -0
- package/dist/web/assets/filter-dialog-frame-BkEbqBA4.js.br +0 -0
- package/dist/web/assets/filter-dialog-frame-BkEbqBA4.js.gz +0 -0
- package/dist/web/assets/format-file-meta-DdYtk07C.js +1 -0
- package/dist/web/assets/format-file-meta-DdYtk07C.js.br +0 -0
- package/dist/web/assets/format-file-meta-DdYtk07C.js.gz +0 -0
- package/dist/web/assets/fs-api-CFtQzsIJ.js +1 -0
- package/dist/web/assets/fs-api-CFtQzsIJ.js.br +0 -0
- package/dist/web/assets/fs-api-CFtQzsIJ.js.gz +0 -0
- package/dist/web/assets/general-settings-section-DvHROAMa.js +1 -0
- package/dist/web/assets/general-settings-section-DvHROAMa.js.br +0 -0
- package/dist/web/assets/general-settings-section-DvHROAMa.js.gz +0 -0
- package/dist/web/assets/git-commit-horizontal-BPdj2L1i.js +1 -0
- package/dist/web/assets/git-log-panel-Cu9kK48H.js +1 -0
- package/dist/web/assets/git-log-panel-Cu9kK48H.js.br +0 -0
- package/dist/web/assets/git-log-panel-Cu9kK48H.js.gz +0 -0
- package/dist/web/assets/git-repo-store-CKB5fdNP.js +1 -0
- package/dist/web/assets/git-repo-store-CKB5fdNP.js.br +0 -0
- package/dist/web/assets/git-repo-store-CKB5fdNP.js.gz +0 -0
- package/dist/web/assets/git-review-tab-B_JT649W.js +3 -0
- package/dist/web/assets/git-review-tab-B_JT649W.js.br +0 -0
- package/dist/web/assets/git-review-tab-B_JT649W.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-BlposOph.js +177 -0
- package/dist/web/assets/glide-data-grid-BlposOph.js.br +0 -0
- package/dist/web/assets/glide-data-grid-BlposOph.js.gz +0 -0
- package/dist/web/assets/grid-save-dialog-B0d0qhnN.js +2 -0
- package/dist/web/assets/grid-save-dialog-B0d0qhnN.js.br +0 -0
- package/dist/web/assets/grid-save-dialog-B0d0qhnN.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-jirUsGm-.js +1 -0
- package/dist/web/assets/group-chat-tab-jirUsGm-.js.br +0 -0
- package/dist/web/assets/group-chat-tab-jirUsGm-.js.gz +0 -0
- package/dist/web/assets/html-preview-loads-CMWBC-iv.js +1 -0
- package/dist/web/assets/icons-BwyIKaTT.js +1 -0
- package/dist/web/assets/icons-BwyIKaTT.js.br +0 -0
- package/dist/web/assets/icons-BwyIKaTT.js.gz +0 -0
- package/dist/web/assets/image-preview-gOBK9zED.js +1 -0
- package/dist/web/assets/impexp-tab-HJVcOTYJ.js +1 -0
- package/dist/web/assets/impexp-tab-HJVcOTYJ.js.br +0 -0
- package/dist/web/assets/impexp-tab-HJVcOTYJ.js.gz +0 -0
- package/dist/web/assets/index-DLB3j_P0.js +59 -0
- package/dist/web/assets/index-DLB3j_P0.js.br +0 -0
- package/dist/web/assets/index-DLB3j_P0.js.gz +0 -0
- package/dist/web/assets/index-M3DUzop8.css +1 -0
- package/dist/web/assets/index-M3DUzop8.css.br +0 -0
- package/dist/web/assets/index-M3DUzop8.css.gz +0 -0
- package/dist/web/assets/input-C3oVNCMq.js +1 -0
- package/dist/web/assets/jira-watcher-section-EQvdnETB.js +1 -0
- package/dist/web/assets/keybindings-store-CEy-Sdcc.js +1 -0
- package/dist/web/assets/keyboard-shortcuts-section-DN21gB-T.js +1 -0
- package/dist/web/assets/keyboard-shortcuts-section-DN21gB-T.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-DN21gB-T.js.gz +0 -0
- package/dist/web/assets/language-servers-section-DOcZ72FJ.js +2 -0
- package/dist/web/assets/language-servers-section-DOcZ72FJ.js.br +0 -0
- package/dist/web/assets/language-servers-section-DOcZ72FJ.js.gz +0 -0
- package/dist/web/assets/lib-5Chotbwm.js +2 -0
- package/dist/web/assets/lib-5Chotbwm.js.br +0 -0
- package/dist/web/assets/lib-5Chotbwm.js.gz +0 -0
- package/dist/web/assets/logs-app-C7n9GSCn.js +13 -0
- package/dist/web/assets/logs-app-C7n9GSCn.js.br +0 -0
- package/dist/web/assets/logs-app-C7n9GSCn.js.gz +0 -0
- package/dist/web/assets/logs-tab-CSOiexvx.js +1 -0
- package/dist/web/assets/logs-window-content-C4Qs6-0q.js +1 -0
- package/dist/web/assets/lsp-client-DpYmPhXX.js +1 -0
- package/dist/web/assets/lsp-client-DpYmPhXX.js.br +0 -0
- package/dist/web/assets/lsp-client-DpYmPhXX.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-CtEl6qAt.js +4 -0
- package/dist/web/assets/markdown-renderer-CtEl6qAt.js.br +0 -0
- package/dist/web/assets/markdown-renderer-CtEl6qAt.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-Df3r-CCb.js +1 -0
- package/dist/web/assets/media-url-Cn2yRAxP.js +1 -0
- package/dist/web/assets/metric-chart-canvas-DEW16Su8.js +1 -0
- package/dist/web/assets/metric-chart-canvas-DEW16Su8.js.br +0 -0
- package/dist/web/assets/metric-chart-canvas-DEW16Su8.js.gz +0 -0
- package/dist/web/assets/mobile-bottom-sheet-DArbIyrD.js +1 -0
- package/dist/web/assets/mobile-bottom-sheet-DArbIyrD.js.br +0 -0
- package/dist/web/assets/mobile-bottom-sheet-DArbIyrD.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-B-rcKEL9.js +1 -0
- package/dist/web/assets/mobile-explorer-sheet-B-rcKEL9.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-B-rcKEL9.js.gz +0 -0
- package/dist/web/assets/new-design-dialog-DgztQK5R.js +1 -0
- package/dist/web/assets/new-design-dialog-DgztQK5R.js.br +0 -0
- package/dist/web/assets/new-design-dialog-DgztQK5R.js.gz +0 -0
- package/dist/web/assets/notification-store-B92dvP_u.js +1 -0
- package/dist/web/assets/notifications-settings-section-JiGvaCFx.js +1 -0
- package/dist/web/assets/notifications-settings-section-JiGvaCFx.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-JiGvaCFx.js.gz +0 -0
- package/dist/web/assets/onboarding-entry-eehqBvyM.js +1 -0
- package/dist/web/assets/onboarding-entry-eehqBvyM.js.br +0 -0
- package/dist/web/assets/onboarding-entry-eehqBvyM.js.gz +0 -0
- package/dist/web/assets/onboarding-quick-orientation-CTHtIRib.js +1 -0
- package/dist/web/assets/onboarding-quick-orientation-CTHtIRib.js.br +0 -0
- package/dist/web/assets/onboarding-quick-orientation-CTHtIRib.js.gz +0 -0
- package/dist/web/assets/open-db-tabs-CtWIWHOa.js +1 -0
- package/dist/web/assets/open-db-tabs-CtWIWHOa.js.br +0 -0
- package/dist/web/assets/open-db-tabs-CtWIWHOa.js.gz +0 -0
- package/dist/web/assets/open-settings-EXR4zoZG.js +1 -0
- package/dist/web/assets/overview-panel-DEGF2DmZ.js +1 -0
- package/dist/web/assets/overview-panel-DEGF2DmZ.js.br +0 -0
- package/dist/web/assets/overview-panel-DEGF2DmZ.js.gz +0 -0
- package/dist/web/assets/panel-store-BJhazigC.js +1 -0
- package/dist/web/assets/panel-store-BJhazigC.js.br +0 -0
- package/dist/web/assets/panel-store-BJhazigC.js.gz +0 -0
- package/dist/web/assets/patch-tab-metadata-C92YkrRX.js +1 -0
- package/dist/web/assets/pdf-preview-C9gMtv2a.js +1 -0
- package/dist/web/assets/pdf-preview-C9gMtv2a.js.br +0 -0
- package/dist/web/assets/pdf-preview-C9gMtv2a.js.gz +0 -0
- package/dist/web/assets/performance-panel-TkwfKIZa.js +3 -0
- package/dist/web/assets/performance-panel-TkwfKIZa.js.br +0 -0
- package/dist/web/assets/performance-panel-TkwfKIZa.js.gz +0 -0
- package/dist/web/assets/portal-container-context-NBi-KGK0.js +1 -0
- package/dist/web/assets/ppmbot-settings-section-XfrZ8VoC.js +1 -0
- package/dist/web/assets/ppmbot-settings-section-XfrZ8VoC.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-XfrZ8VoC.js.gz +0 -0
- package/dist/web/assets/pptx-export-B2wCBWlV.js +111 -0
- package/dist/web/assets/pptx-export-B2wCBWlV.js.br +0 -0
- package/dist/web/assets/pptx-export-B2wCBWlV.js.gz +0 -0
- package/dist/web/assets/problems-panel-CDzwSJn6.js +1 -0
- package/dist/web/assets/problems-panel-CDzwSJn6.js.br +0 -0
- package/dist/web/assets/problems-panel-CDzwSJn6.js.gz +0 -0
- package/dist/web/assets/process-row-format-CytRH7g2.js +1 -0
- package/dist/web/assets/process-table-C_B39GHm.js +1 -0
- package/dist/web/assets/process-table-C_B39GHm.js.br +0 -0
- package/dist/web/assets/process-table-C_B39GHm.js.gz +0 -0
- package/dist/web/assets/project-framework-store-DwLxaRan.js +1 -0
- package/dist/web/assets/project-store-BLGl9IAO.js +1 -0
- package/dist/web/assets/project-store-BLGl9IAO.js.br +0 -0
- package/dist/web/assets/project-store-BLGl9IAO.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-CvaOvYIv.js +1 -0
- package/dist/web/assets/proxy-settings-section-CvaOvYIv.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-CvaOvYIv.js.gz +0 -0
- package/dist/web/assets/query-audit-section-D_WDp1m-.js +1 -0
- package/dist/web/assets/query-audit-section-D_WDp1m-.js.br +0 -0
- package/dist/web/assets/query-audit-section-D_WDp1m-.js.gz +0 -0
- package/dist/web/assets/query-tab-B8aMpAbI.js +22 -0
- package/dist/web/assets/query-tab-B8aMpAbI.js.br +0 -0
- package/dist/web/assets/query-tab-B8aMpAbI.js.gz +0 -0
- package/dist/web/assets/react-BZ0kba1-.js +1 -0
- package/dist/web/assets/remote-access-settings-section-Bv0eawR4.js +1 -0
- package/dist/web/assets/remote-access-settings-section-Bv0eawR4.js.br +0 -0
- package/dist/web/assets/remote-access-settings-section-Bv0eawR4.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-BpDakRY0.js +1 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-BpDakRY0.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-BpDakRY0.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-C5GQ3kzY.js +2 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-C5GQ3kzY.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-C5GQ3kzY.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-CZb5EMEK.js +1 -0
- package/dist/web/assets/remote-desktop-mobile-view-CZb5EMEK.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-CZb5EMEK.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-CipNtLX5.js +1 -0
- package/dist/web/assets/remote-desktop-readiness-gate-CipNtLX5.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-CipNtLX5.js.gz +0 -0
- package/dist/web/assets/remote-desktop-settings-section-ZAsBRwjq.js +1 -0
- package/dist/web/assets/remote-desktop-settings-section-ZAsBRwjq.js.br +0 -0
- package/dist/web/assets/remote-desktop-settings-section-ZAsBRwjq.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-B7OXXvAM.js +1 -0
- package/dist/web/assets/remote-desktop-window-content-B7OXXvAM.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-B7OXXvAM.js.gz +0 -0
- package/dist/web/assets/rename-object-dialog-B4W6S7Xg.js +1 -0
- package/dist/web/assets/rename-object-dialog-B4W6S7Xg.js.br +0 -0
- package/dist/web/assets/rename-object-dialog-B4W6S7Xg.js.gz +0 -0
- package/dist/web/assets/review-code-B4osj0k1.js +5 -0
- package/dist/web/assets/review-code-B4osj0k1.js.br +0 -0
- package/dist/web/assets/review-code-B4osj0k1.js.gz +0 -0
- package/dist/web/assets/run-in-terminal-button-m3i-Hcou.js +1 -0
- package/dist/web/assets/run-in-terminal-ujoc25vj.js +1 -0
- package/dist/web/assets/save-as-dialog-DpXv_f1d.js +1 -0
- package/dist/web/assets/save-as-dialog-DpXv_f1d.js.br +5 -0
- package/dist/web/assets/save-as-dialog-DpXv_f1d.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-BbaPbc28.js +1 -0
- package/dist/web/assets/schedules-settings-section-BbaPbc28.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-BbaPbc28.js.gz +0 -0
- package/dist/web/assets/scroll-area-DOlQJGZp.js +1 -0
- package/dist/web/assets/scroll-area-DOlQJGZp.js.br +0 -0
- package/dist/web/assets/scroll-area-DOlQJGZp.js.gz +0 -0
- package/dist/web/assets/send-to-chat-CWV1qd3c.js +1 -0
- package/dist/web/assets/send-to-chat-CWV1qd3c.js.br +0 -0
- package/dist/web/assets/send-to-chat-CWV1qd3c.js.gz +0 -0
- package/dist/web/assets/separator-DmU9aJwq.js +1 -0
- package/dist/web/assets/services-panel-CZQOrvth.js +1 -0
- package/dist/web/assets/services-panel-CZQOrvth.js.br +0 -0
- package/dist/web/assets/services-panel-CZQOrvth.js.gz +0 -0
- package/dist/web/assets/session-changes-bar-VfS2sHuH.js +1 -0
- package/dist/web/assets/session-changes-bar-VfS2sHuH.js.br +0 -0
- package/dist/web/assets/session-changes-bar-VfS2sHuH.js.gz +0 -0
- package/dist/web/assets/session-list-sync-triggers-DtJI5KF0.js +1 -0
- package/dist/web/assets/session-list-sync-triggers-DtJI5KF0.js.br +0 -0
- package/dist/web/assets/session-list-sync-triggers-DtJI5KF0.js.gz +0 -0
- package/dist/web/assets/session-review-tab-Aq3FEooH.js +6 -0
- package/dist/web/assets/session-review-tab-Aq3FEooH.js.br +0 -0
- package/dist/web/assets/session-review-tab-Aq3FEooH.js.gz +0 -0
- package/dist/web/assets/settings-body-vXbOWchN.js +1 -0
- package/dist/web/assets/settings-body-vXbOWchN.js.br +0 -0
- package/dist/web/assets/settings-body-vXbOWchN.js.gz +0 -0
- package/dist/web/assets/settings-categories-Ajj4ui27.js +1 -0
- package/dist/web/assets/settings-categories-Ajj4ui27.js.br +0 -0
- package/dist/web/assets/settings-categories-Ajj4ui27.js.gz +0 -0
- package/dist/web/assets/settings-rows-DD7Gxmst.js +1 -0
- package/dist/web/assets/settings-rows-DD7Gxmst.js.br +0 -0
- package/dist/web/assets/settings-rows-DD7Gxmst.js.gz +0 -0
- package/dist/web/assets/settings-section-content-CVtvJ6ze.js +1 -0
- package/dist/web/assets/settings-section-content-DkUJFop6.js +2 -0
- package/dist/web/assets/settings-section-content-DkUJFop6.js.br +0 -0
- package/dist/web/assets/settings-section-content-DkUJFop6.js.gz +0 -0
- package/dist/web/assets/settings-store-B4mLp19V.js +2 -0
- package/dist/web/assets/settings-store-B4mLp19V.js.br +0 -0
- package/dist/web/assets/settings-store-B4mLp19V.js.gz +0 -0
- package/dist/web/assets/settings-tab-Cdv9_OIe.js +1 -0
- package/dist/web/assets/settings-window-content-DLa6Ph4u.js +1 -0
- package/dist/web/assets/share-BV49OI6q.css +2 -0
- package/dist/web/assets/share-BV49OI6q.css.br +0 -0
- package/dist/web/assets/share-BV49OI6q.css.gz +0 -0
- package/dist/web/assets/share-D5ufGmNI.js +9 -0
- package/dist/web/assets/share-D5ufGmNI.js.br +0 -0
- package/dist/web/assets/share-D5ufGmNI.js.gz +0 -0
- package/dist/web/assets/slash-command-picker-lILYDfK3.js +1 -0
- package/dist/web/assets/slash-command-picker-lILYDfK3.js.br +0 -0
- package/dist/web/assets/slash-command-picker-lILYDfK3.js.gz +0 -0
- package/dist/web/assets/sortable-header-DwzTFLkG.js +1 -0
- package/dist/web/assets/sortable-header-DwzTFLkG.js.br +0 -0
- package/dist/web/assets/sortable-header-DwzTFLkG.js.gz +0 -0
- package/dist/web/assets/split-sql-statements-DcAeXbk_.js +5 -0
- package/dist/web/assets/split-sql-statements-DcAeXbk_.js.br +0 -0
- package/dist/web/assets/split-sql-statements-DcAeXbk_.js.gz +0 -0
- package/dist/web/assets/sql-completion-provider-CS-ElfgJ.js +1 -0
- package/dist/web/assets/sql-completion-provider-CS-ElfgJ.js.br +0 -0
- package/dist/web/assets/sql-completion-provider-CS-ElfgJ.js.gz +0 -0
- package/dist/web/assets/sql-object-tab-Da42SMK5.js +1 -0
- package/dist/web/assets/sql-object-tab-Da42SMK5.js.br +0 -0
- package/dist/web/assets/sql-object-tab-Da42SMK5.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-V3SKNukY.js +1 -0
- package/dist/web/assets/sqlite-viewer-V3SKNukY.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-V3SKNukY.js.gz +0 -0
- package/dist/web/assets/start-ellipsis-CU8GkxaV.js +1 -0
- package/dist/web/assets/structure-save-dialog-B635iyPI.js +1 -0
- package/dist/web/assets/structure-save-dialog-B635iyPI.js.br +0 -0
- package/dist/web/assets/structure-save-dialog-B635iyPI.js.gz +0 -0
- package/dist/web/assets/structure-tab-Co9d8ktU.js +3 -0
- package/dist/web/assets/structure-tab-Co9d8ktU.js.br +0 -0
- package/dist/web/assets/structure-tab-Co9d8ktU.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-DC0j8RqP.js +2 -0
- package/dist/web/assets/system-monitor-body-DC0j8RqP.js.br +0 -0
- package/dist/web/assets/system-monitor-body-DC0j8RqP.js.gz +0 -0
- package/dist/web/assets/system-monitor-tab-DA8BcdXo.js +1 -0
- package/dist/web/assets/system-monitor-window-content-BiuLo8XW.js +1 -0
- package/dist/web/assets/tab-host-window-content-Crvt1r5F.js +1 -0
- package/dist/web/assets/tab-host-window-content-Crvt1r5F.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-Crvt1r5F.js.gz +0 -0
- package/dist/web/assets/tab-store-D5I52eLN.js +1 -0
- package/dist/web/assets/table-tab-C2cYw7a0.js +2 -0
- package/dist/web/assets/table-tab-C2cYw7a0.js.br +0 -0
- package/dist/web/assets/table-tab-C2cYw7a0.js.gz +0 -0
- package/dist/web/assets/telegram-bot-token-field-BqNtOo5n.js +1 -0
- package/dist/web/assets/telegram-bot-token-field-BqNtOo5n.js.br +0 -0
- package/dist/web/assets/telegram-bot-token-field-BqNtOo5n.js.gz +0 -0
- package/dist/web/assets/terminal-tab-CrKxibGC.js +3 -0
- package/dist/web/assets/terminal-tab-CrKxibGC.js.br +0 -0
- package/dist/web/assets/terminal-tab-CrKxibGC.js.gz +0 -0
- package/dist/web/assets/tool-cards-BRto67jM.js +15 -0
- package/dist/web/assets/tool-cards-BRto67jM.js.br +0 -0
- package/dist/web/assets/tool-cards-BRto67jM.js.gz +0 -0
- package/dist/web/assets/tools-settings-section-DEvZsrxq.js +1 -0
- package/dist/web/assets/tools-settings-section-DEvZsrxq.js.br +0 -0
- package/dist/web/assets/tools-settings-section-DEvZsrxq.js.gz +0 -0
- package/dist/web/assets/use-at-most-wide-BHsrzvv3.js +1 -0
- package/dist/web/assets/use-blob-url-Clm7wbB_.js +1 -0
- package/dist/web/assets/use-db-driver-installed-anzWkGi5.js +1 -0
- package/dist/web/assets/use-db-read-BCYhIrJM.js +1 -0
- package/dist/web/assets/use-db-read-BCYhIrJM.js.br +0 -0
- package/dist/web/assets/use-db-read-BCYhIrJM.js.gz +0 -0
- package/dist/web/assets/use-db-tab-B8LjdDb7.js +1 -0
- package/dist/web/assets/use-db-tab-B8LjdDb7.js.br +0 -0
- package/dist/web/assets/use-db-tab-B8LjdDb7.js.gz +0 -0
- package/dist/web/assets/use-design-canvas-check-DBsLf1At.js +1 -0
- package/dist/web/assets/use-design-canvas-check-DBsLf1At.js.br +0 -0
- package/dist/web/assets/use-design-canvas-check-DBsLf1At.js.gz +0 -0
- package/dist/web/assets/use-h264-canvas-decoder-_zqeiVx8.js +1 -0
- package/dist/web/assets/use-h264-canvas-decoder-_zqeiVx8.js.br +0 -0
- package/dist/web/assets/use-h264-canvas-decoder-_zqeiVx8.js.gz +0 -0
- package/dist/web/assets/use-inline-blame-CRWJU6Rq.js +16 -0
- package/dist/web/assets/use-inline-blame-CRWJU6Rq.js.br +0 -0
- package/dist/web/assets/use-inline-blame-CRWJU6Rq.js.gz +0 -0
- package/dist/web/assets/use-is-mobile-VRV9eZy1.js +1 -0
- package/dist/web/assets/use-lsp-B-otjr-6.js +6 -0
- package/dist/web/assets/use-lsp-B-otjr-6.js.br +0 -0
- package/dist/web/assets/use-lsp-B-otjr-6.js.gz +0 -0
- package/dist/web/assets/use-monaco-theme-BiDXRJ4e.js +1 -0
- package/dist/web/assets/use-opener-focus-CDRKhHwX.js +1 -0
- package/dist/web/assets/use-process-kill-BW2UW0mZ.js +1 -0
- package/dist/web/assets/use-process-kill-BW2UW0mZ.js.br +0 -0
- package/dist/web/assets/use-process-kill-BW2UW0mZ.js.gz +0 -0
- package/dist/web/assets/use-sql-schema-info-D_Kc2FI7.js +4 -0
- package/dist/web/assets/use-sql-schema-info-D_Kc2FI7.js.br +0 -0
- package/dist/web/assets/use-sql-schema-info-D_Kc2FI7.js.gz +0 -0
- package/dist/web/assets/use-visual-viewport-MmugpRg-.js +1 -0
- package/dist/web/assets/use-websocket-n3Ud9vEA.js +1 -0
- package/dist/web/assets/vendor-markdown-C-P1aR4p.js +291 -0
- package/dist/web/assets/vendor-markdown-C-P1aR4p.js.br +0 -0
- package/dist/web/assets/vendor-markdown-C-P1aR4p.js.gz +0 -0
- package/dist/web/assets/vendor-ui-BTSIXzhZ.js +45 -0
- package/dist/web/assets/vendor-ui-BTSIXzhZ.js.br +0 -0
- package/dist/web/assets/vendor-ui-BTSIXzhZ.js.gz +0 -0
- package/dist/web/assets/video-preview-CjB6wesi.js +1 -0
- package/dist/web/assets/video-preview-CjB6wesi.js.br +0 -0
- package/dist/web/assets/video-preview-CjB6wesi.js.gz +0 -0
- package/dist/web/assets/voice-settings-section-C6Wb6q5o.js +1 -0
- package/dist/web/assets/voice-settings-section-C6Wb6q5o.js.br +0 -0
- package/dist/web/assets/voice-settings-section-C6Wb6q5o.js.gz +0 -0
- package/dist/web/assets/web-preview-tab-doNpegW3.js +1 -0
- package/dist/web/assets/web-preview-tab-doNpegW3.js.br +0 -0
- package/dist/web/assets/web-preview-tab-doNpegW3.js.gz +0 -0
- package/dist/web/assets/window-store-DqX_qmkQ.js +1 -0
- package/dist/web/assets/window-store-DqX_qmkQ.js.br +0 -0
- package/dist/web/assets/window-store-DqX_qmkQ.js.gz +0 -0
- package/dist/web/assets/ws-auth-CbF6GqxP.js +1 -0
- package/dist/web/design-share-page/index.html +18 -0
- package/dist/web/index.html +47 -47
- 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/architecture/ai-chat-and-providers.md +258 -26
- package/docs/architecture/data-and-storage.md +9 -3
- package/docs/architecture/workspace-and-ui.md +42 -5
- package/docs/project-roadmap.md +5 -0
- package/package.json +6 -2
- package/scripts/gen-product-icons.ts +1 -0
- package/src/cli/commands/db-cmd.ts +79 -1
- package/src/providers/claude-agent-sdk-query-options.ts +42 -10
- package/src/providers/claude-agent-sdk.ts +19 -6
- package/src/providers/codex-app-server/codex-provider.ts +9 -3
- package/src/providers/codex-app-server/codex-thread-params.ts +34 -4
- package/src/server/index.ts +17 -5
- package/src/server/middleware/access-log.ts +6 -3
- package/src/server/routes/accounts.ts +3 -2
- package/src/server/routes/chat-file-changes.ts +15 -1
- package/src/server/routes/chat.ts +92 -18
- package/src/server/routes/database-query.ts +14 -5
- package/src/server/routes/database.ts +14 -0
- package/src/server/routes/debug-crash.ts +30 -0
- package/src/server/routes/design-comments.ts +56 -7
- package/src/server/routes/design-share-address.ts +20 -0
- package/src/server/routes/design-share-guest-comments.ts +120 -0
- package/src/server/routes/design-share-guest-files.ts +99 -0
- package/src/server/routes/design-share-guest-shared.ts +95 -0
- package/src/server/routes/design-share-guest.ts +77 -0
- package/src/server/routes/design-shares.ts +90 -0
- package/src/server/routes/designs.ts +2 -0
- package/src/server/routes/settings.ts +12 -0
- package/src/server/routes/static.ts +10 -2
- package/src/server/ws/chat.ts +113 -39
- package/src/server/ws/global.ts +10 -8
- package/src/services/account.service.ts +57 -18
- package/src/services/chat.service.ts +16 -6
- package/src/services/db-ai-tools/db-ai-connections.ts +48 -0
- package/src/services/db-ai-tools/db-ai-format.ts +107 -0
- package/src/services/db-ai-tools/db-ai-run.ts +199 -0
- package/src/services/db-ai-tools/db-ai-target.ts +59 -0
- package/src/services/db-ai-tools/db-ai-tools-endpoint.ts +225 -0
- package/src/services/db-ai-tools/db-ai-tools-tokens.ts +33 -0
- package/src/services/db-ai-tools/db-ai-tools-tool.ts +131 -0
- package/src/services/db-ai-tools/db-approval-broker.ts +157 -0
- package/src/services/db.service.ts +25 -1
- package/src/services/design/bridge/bridge-picker.ts +15 -5
- package/src/services/design/bridge/guest-bridge.ts +19 -0
- package/src/services/design/comments/design-comment-element-context.ts +28 -6
- package/src/services/design/comments/design-comment-input.ts +47 -0
- package/src/services/design/comments/design-comment-views.ts +146 -0
- package/src/services/design/comments/design-comments-revision.ts +19 -0
- package/src/services/design/comments/design-comments-store.ts +82 -9
- package/src/services/design/design-comment-replies.service.ts +126 -0
- package/src/services/design/design-comments.service.ts +77 -34
- package/src/services/design/design-restore.service.ts +6 -2
- package/src/services/design/design-snapshots.service.ts +8 -2
- package/src/services/design/design-store.service.ts +7 -1
- package/src/services/design/design-write-rate-limit.ts +11 -17
- package/src/services/design/preview/design-guest-alias.ts +64 -0
- package/src/services/design/preview/design-preview-html.ts +16 -3
- package/src/services/design/preview/design-preview-scope.ts +29 -5
- package/src/services/design/share/design-share-address.ts +81 -0
- package/src/services/design/share/design-share-changed-files.ts +74 -0
- package/src/services/design/share/design-share-client-key.ts +72 -0
- package/src/services/design/share/design-share-code.ts +116 -0
- package/src/services/design/share/design-share-comments.service.ts +162 -0
- package/src/services/design/share/design-share-guest-link.ts +109 -0
- package/src/services/design/share/design-share-guest-page.ts +86 -0
- package/src/services/design/share/design-share-link-rules.ts +83 -0
- package/src/services/design/share/design-share-links-store.ts +157 -0
- package/src/services/design/share/design-share-links.service.ts +174 -0
- package/src/services/design/share/design-share-notifier.ts +192 -0
- package/src/services/design/share/design-share-rate-limit.ts +71 -0
- package/src/services/design/share/design-share-resolve.ts +31 -0
- package/src/services/mcp-http-endpoint.ts +23 -10
- package/src/services/mysql.service.ts +6 -2
- package/src/services/notification-format.ts +10 -2
- package/src/services/notification-link.ts +1 -1
- package/src/services/notification.service.ts +47 -15
- package/src/services/ppm-password.ts +26 -0
- package/src/services/project-name-for-path.ts +18 -0
- package/src/services/query-audit/query-audit.service.ts +7 -4
- package/src/services/remote-desktop/access-unit-assembler.ts +11 -7
- package/src/services/remote-desktop/nal-splitter.ts +14 -1
- package/src/services/remote-desktop/remote-desktop-capture-wayland.ts +47 -21
- package/src/services/remote-desktop/remote-desktop-encoder-args.ts +5 -3
- package/src/services/session-file-baselines/session-file-baselines.service.ts +48 -0
- package/src/services/session-file-baselines/session-file-blame.ts +57 -24
- package/src/services/session-file-baselines/session-file-changes.service.ts +220 -22
- package/src/services/session-file-baselines/session-file-history.ts +5 -1
- package/src/services/session-file-baselines/session-file-writes.ts +28 -0
- package/src/services/sliding-window-limiter.ts +106 -0
- package/src/services/tab-tools-mcp/open-url-tool.ts +149 -0
- package/src/services/tab-tools-mcp/tab-open-broker.ts +12 -4
- package/src/services/tab-tools-mcp/tab-tools-mcp-endpoint.ts +66 -22
- package/src/services/tab-tools-mcp/tab-tools-mcp-tokens.ts +3 -1
- package/src/services/tab-tools-mcp/tab-tools-mcp-tool.ts +78 -6
- package/src/services/tab-tools-mcp/terminal-text.ts +45 -0
- package/src/services/tab-tools-mcp/terminal-tools.ts +297 -0
- package/src/services/terminal.service.ts +39 -4
- package/src/shared/db-ai-tools.ts +118 -0
- package/src/shared/db-query-script.ts +16 -0
- package/src/shared/design-comment-thread-types.ts +80 -0
- package/src/shared/design-comment-types.ts +53 -4
- package/src/shared/design-share-guest-types.ts +59 -0
- package/src/shared/design-share-types.ts +100 -0
- package/src/shared/notification-settings.ts +4 -3
- package/src/shared/ppm-tools.ts +39 -0
- package/src/shared/session-file-changes.ts +16 -0
- package/src/shared/tab-open-protocol.ts +50 -6
- package/src/shared/untrusted-text.ts +15 -1
- package/src/types/chat.ts +7 -1
- package/src/types/config.ts +5 -2
- package/src/types/database.ts +6 -0
- package/src/web/components/chat/chat-history-bar.tsx +10 -6
- package/src/web/components/chat/chat-tab.tsx +7 -1
- package/src/web/components/chat/db-execute-approval-card.tsx +100 -0
- package/src/web/components/chat/db-tool-card.tsx +42 -0
- package/src/web/components/chat/device-tool-card.tsx +45 -0
- package/src/web/components/chat/message-input.tsx +9 -6
- package/src/web/components/chat/message-list.tsx +6 -1
- package/src/web/components/chat/message-markdown.tsx +6 -3
- package/src/web/components/chat/message-user-bubble.tsx +2 -1
- package/src/web/components/chat/model-thinking-selector.tsx +6 -4
- package/src/web/components/chat/prompt-cache-chip.tsx +1 -1
- package/src/web/components/chat/running-agents-bar.tsx +164 -76
- package/src/web/components/chat/session-changes-bar.tsx +46 -13
- package/src/web/components/chat/tool-cards.tsx +29 -1
- package/src/web/components/chat/turn-change-rollup.tsx +8 -1
- package/src/web/components/chat/usage-badge.tsx +3 -3
- package/src/web/components/database/query/query-run-state.ts +11 -1
- package/src/web/components/database/query/query-tab.tsx +33 -7
- package/src/web/components/database/query/use-query-runner.ts +3 -0
- package/src/web/components/database/query/write-once-dialog.tsx +70 -0
- package/src/web/components/design/canvas/design-canvas-pane.tsx +5 -2
- package/src/web/components/design/comments/comment-author-label.tsx +23 -0
- package/src/web/components/design/comments/comment-composer.tsx +6 -14
- package/src/web/components/design/comments/comment-pins-overlay.tsx +8 -3
- package/src/web/components/design/comments/comment-thread-replies.tsx +82 -0
- package/src/web/components/design/comments/comment-thread-text-box.tsx +69 -0
- package/src/web/components/design/comments/comment-thread-view.tsx +115 -0
- package/src/web/components/design/comments/comments-panel.tsx +33 -10
- package/src/web/components/design/comments/comments-send-preview.tsx +20 -8
- package/src/web/components/design/comments/design-comments-layer.tsx +3 -1
- package/src/web/components/design/comments/use-comment-pins.ts +3 -0
- package/src/web/components/design/comments/use-design-comments-feature.ts +40 -25
- package/src/web/components/design/comments/use-design-comments.ts +44 -12
- package/src/web/components/design/design-split-layout.tsx +106 -10
- package/src/web/components/design/design-tab-context.ts +2 -0
- package/src/web/components/design/design-tab.tsx +5 -1
- package/src/web/components/design/design-toolbar.tsx +24 -4
- package/src/web/components/design/share/design-share-dialog.tsx +81 -0
- package/src/web/components/design/share/new-share-link-form.tsx +85 -0
- package/src/web/components/design/share/share-address-block.tsx +101 -0
- package/src/web/components/design/share/share-changed-files.tsx +30 -0
- package/src/web/components/design/share/share-expiry-picker.tsx +44 -0
- package/src/web/components/design/share/share-repin-panel.tsx +64 -0
- package/src/web/components/design/share/share-row-panel.tsx +35 -0
- package/src/web/components/design/share/share-version-picker.tsx +67 -0
- package/src/web/components/design/share/shared-link-action-panels.tsx +120 -0
- package/src/web/components/design/share/shared-link-row.tsx +131 -0
- package/src/web/components/design/share/shared-links-list.tsx +33 -0
- package/src/web/components/design/share/use-share-address.ts +74 -0
- package/src/web/components/design/share/use-share-links.ts +93 -0
- package/src/web/components/design/use-design-layout.ts +7 -4
- package/src/web/components/editor/diff-viewer.tsx +16 -12
- package/src/web/components/editor/docx-preview.tsx +7 -2
- package/src/web/components/floating-window/close-window.ts +32 -0
- package/src/web/components/floating-window/floating-window.tsx +65 -24
- package/src/web/components/floating-window/open-tab-in-pip.ts +3 -0
- package/src/web/components/floating-window/use-window-drag.ts +33 -7
- package/src/web/components/floating-window/use-window-meta.ts +138 -0
- package/src/web/components/floating-window/window-chrome-contract.ts +19 -2
- package/src/web/components/floating-window/window-dock-layout.ts +72 -0
- package/src/web/components/floating-window/window-dock-list.tsx +156 -0
- package/src/web/components/floating-window/window-dock.tsx +192 -0
- package/src/web/components/floating-window/window-geometry.ts +39 -1
- package/src/web/components/floating-window/window-layer.tsx +59 -23
- package/src/web/components/floating-window/window-persistence.ts +16 -3
- package/src/web/components/floating-window/window-store-types.ts +13 -2
- package/src/web/components/floating-window/window-store.ts +75 -8
- package/src/web/components/floating-window/window-title-identity.tsx +86 -0
- package/src/web/components/layout/status-bar.tsx +3 -0
- package/src/web/components/layout/tab-pop-out-menu-item.tsx +2 -2
- package/src/web/components/logs/open-logs.ts +0 -1
- package/src/web/components/os-explorer/actions/explorer-actions-upload.ts +2 -1
- package/src/web/components/os-explorer/skins/macos-window-chrome.tsx +17 -11
- package/src/web/components/os-explorer/skins/windows-window-chrome.tsx +14 -5
- package/src/web/components/remote-desktop/use-remote-desktop-readiness.ts +8 -3
- package/src/web/components/settings/accounts/account-add-dialog.tsx +25 -13
- package/src/web/components/settings/accounts/claude-accounts-section.tsx +3 -3
- package/src/web/components/settings/ai-settings-section.tsx +0 -20
- package/src/web/components/settings/design-settings-section.tsx +3 -0
- package/src/web/components/settings/design-window-setting.tsx +28 -0
- package/src/web/components/settings/settings-categories.ts +3 -0
- package/src/web/components/settings/settings-section-content.tsx +1 -0
- package/src/web/components/settings/tools-settings-section.tsx +120 -0
- package/src/web/components/shared/docx-html-sanitize.ts +59 -0
- package/src/web/components/shared/markdown-code-block.tsx +3 -1
- package/src/web/components/shared/markdown-renderer.tsx +15 -3
- package/src/web/components/shared/markdown-sanitize.ts +65 -0
- package/src/web/components/web-preview/web-preview-tab.tsx +6 -3
- package/src/web/design-share-page/index.html +17 -0
- package/src/web/design-share-page/main.tsx +11 -0
- package/src/web/design-share-page/share-api.ts +131 -0
- package/src/web/design-share-page/share-app.tsx +14 -0
- package/src/web/design-share-page/share-bottom-sheet.tsx +61 -0
- package/src/web/design-share-page/share-canvas.tsx +92 -0
- package/src/web/design-share-page/share-composer.tsx +104 -0
- package/src/web/design-share-page/share-entry.tsx +92 -0
- package/src/web/design-share-page/share-identity.ts +81 -0
- package/src/web/design-share-page/share-name-prompt.tsx +59 -0
- package/src/web/design-share-page/share-panel-content.tsx +57 -0
- package/src/web/design-share-page/share-pins-overlay.tsx +50 -0
- package/src/web/design-share-page/share-review.tsx +123 -0
- package/src/web/design-share-page/share-states.tsx +78 -0
- package/src/web/design-share-page/share-thread-model.ts +83 -0
- package/src/web/design-share-page/share-thread-view.tsx +61 -0
- package/src/web/design-share-page/share-threads-panel.tsx +103 -0
- package/src/web/design-share-page/share-toolbar.tsx +105 -0
- package/src/web/design-share-page/share-ui.ts +30 -0
- package/src/web/design-share-page/share.css +63 -0
- package/src/web/design-share-page/use-share-canvas.ts +51 -0
- package/src/web/design-share-page/use-share-info.ts +34 -0
- package/src/web/design-share-page/use-share-session.ts +75 -0
- package/src/web/design-share-page/use-share-threads.ts +139 -0
- package/src/web/hooks/use-chat.ts +5 -2
- package/src/web/hooks/use-design-session-redirect.ts +3 -2
- package/src/web/hooks/use-git-repo.ts +36 -16
- package/src/web/hooks/use-global-events.ts +4 -0
- package/src/web/hooks/use-inline-blame.ts +17 -11
- package/src/web/hooks/use-notification-clicks.ts +23 -5
- package/src/web/hooks/use-session-file-changes.ts +118 -41
- package/src/web/hooks/use-url-sync.ts +5 -4
- package/src/web/lib/api-settings.ts +2 -0
- package/src/web/lib/chat-attempt-lifecycle.ts +3 -1
- package/src/web/lib/db-tool-call.ts +57 -0
- package/src/web/lib/design/api-design-comments.ts +39 -9
- package/src/web/lib/design/api-design-shares.ts +47 -0
- package/src/web/lib/design/design-comments-prompt.ts +108 -23
- package/src/web/lib/design/design-layout-mode.ts +16 -1
- package/src/web/lib/design/design-share-address-state.ts +88 -0
- package/src/web/lib/design/design-share-expiry.ts +96 -0
- package/src/web/lib/design/design-share-link-status.ts +66 -0
- package/src/web/lib/design/design-view-prefs.ts +20 -1
- package/src/web/lib/design/open-design-tab.ts +54 -1
- package/src/web/lib/git-repo-scope.ts +60 -0
- package/src/web/lib/icons.generated.tsx +3 -1
- package/src/web/lib/model-display-name.ts +16 -0
- package/src/web/lib/open-ai-tab.ts +129 -19
- package/src/web/lib/running-agent-rows.ts +52 -0
- package/src/web/lib/session-file-changes-client.ts +6 -0
- package/src/web/lib/session-file-changes.ts +13 -0
- package/src/web/lib/tab-tool-call.ts +37 -1
- package/src/web/lib/utils.ts +4 -1
- package/src/web/stores/panel-store.ts +13 -1
- package/src/web/stores/panel-utils.ts +9 -4
- package/src/web/stores/settings-store.ts +14 -0
- package/src/web/stores/window-panel-actions.ts +21 -3
- package/src/web/stores/window-panel-persistence.ts +2 -1
- package/src/web/sw-notification-click.ts +12 -1
- package/templates/skill/SKILL.md.tmpl +2 -1
- package/templates/skill/common-tasks.md +6 -0
- package/vite.config.ts +10 -0
- package/vite.share.config.ts +43 -0
- package/dist/web/assets/accounts-settings-section-DU-lTifs.js +0 -1
- package/dist/web/assets/accounts-settings-section-DU-lTifs.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-DU-lTifs.js.gz +0 -0
- package/dist/web/assets/adaptive-context-menu-Cq7ynvIn.js +0 -1
- package/dist/web/assets/adaptive-context-menu-Cq7ynvIn.js.br +0 -0
- package/dist/web/assets/adaptive-context-menu-Cq7ynvIn.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-At6Rt-Yf.js +0 -2
- package/dist/web/assets/agent-session-sheet-At6Rt-Yf.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-At6Rt-Yf.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-store-BoBrAw5i.js +0 -1
- package/dist/web/assets/agent-session-window-content-CB_uvabH.js +0 -1
- package/dist/web/assets/agent-session-window-content-CB_uvabH.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-CB_uvabH.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-Czearm3I.js +0 -1
- package/dist/web/assets/ai-resource-editor-Czearm3I.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-Czearm3I.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-AOgAUCgH.js +0 -1
- package/dist/web/assets/ai-settings-section-B_OFMlrt.js +0 -1
- package/dist/web/assets/ai-settings-section-B_OFMlrt.js.br +0 -0
- package/dist/web/assets/ai-settings-section-B_OFMlrt.js.gz +0 -0
- package/dist/web/assets/android-tab-L7DmLfHG.js +0 -2
- package/dist/web/assets/android-tab-L7DmLfHG.js.br +0 -0
- package/dist/web/assets/android-tab-L7DmLfHG.js.gz +0 -0
- package/dist/web/assets/api-client-DAQfiXg0.js +0 -1
- package/dist/web/assets/api-client-OiA8Ida1.js +0 -1
- package/dist/web/assets/api-client-OiA8Ida1.js.br +0 -0
- package/dist/web/assets/api-client-OiA8Ida1.js.gz +0 -0
- package/dist/web/assets/api-settings-D2H6gjen.js +0 -1
- package/dist/web/assets/api-settings-D2H6gjen.js.br +0 -0
- package/dist/web/assets/api-settings-D2H6gjen.js.gz +0 -0
- package/dist/web/assets/api-settings-DHhcUHtx.js +0 -1
- package/dist/web/assets/api-themes-CE8gPZ3X.js +0 -1
- package/dist/web/assets/appearance-settings-section-s3KWKTBm.js +0 -1
- package/dist/web/assets/appearance-settings-section-s3KWKTBm.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-s3KWKTBm.js.gz +0 -0
- package/dist/web/assets/apps-panel-DaojtUvh.js +0 -1
- package/dist/web/assets/apps-panel-DaojtUvh.js.br +0 -0
- package/dist/web/assets/apps-panel-DaojtUvh.js.gz +0 -0
- package/dist/web/assets/audio-preview-CWcPZqTA.js +0 -1
- package/dist/web/assets/audio-preview-CWcPZqTA.js.br +0 -4
- package/dist/web/assets/audio-preview-CWcPZqTA.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-9UB4ccpF.js +0 -1
- package/dist/web/assets/branch-review-tab-9UB4ccpF.js.br +0 -0
- package/dist/web/assets/branch-review-tab-9UB4ccpF.js.gz +0 -0
- package/dist/web/assets/button-Br60hGkw.js +0 -1
- package/dist/web/assets/button-Br60hGkw.js.br +0 -0
- package/dist/web/assets/button-Br60hGkw.js.gz +0 -0
- package/dist/web/assets/chat-preparation-cache-CRX9WAK5.js +0 -1
- package/dist/web/assets/chat-preparation-cache-CRX9WAK5.js.br +0 -0
- package/dist/web/assets/chat-preparation-cache-CRX9WAK5.js.gz +0 -0
- package/dist/web/assets/chat-tab-DMVb_mgx.js +0 -1
- package/dist/web/assets/chat-tab-DMVb_mgx.js.br +0 -0
- package/dist/web/assets/chat-tab-DMVb_mgx.js.gz +0 -0
- package/dist/web/assets/chat-tab-s7uAnh-h.js +0 -17
- package/dist/web/assets/chat-tab-s7uAnh-h.js.br +0 -0
- package/dist/web/assets/chat-tab-s7uAnh-h.js.gz +0 -0
- package/dist/web/assets/code-editor-JK49X9EX.js +0 -10
- package/dist/web/assets/code-editor-JK49X9EX.js.br +0 -0
- package/dist/web/assets/code-editor-JK49X9EX.js.gz +0 -0
- package/dist/web/assets/codex-reset-credit-button-CxJsBnff.js +0 -1
- package/dist/web/assets/codex-reset-credit-button-CxJsBnff.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-CxJsBnff.js.gz +0 -0
- package/dist/web/assets/conflict-editor-rOpVkK9P.js +0 -19
- package/dist/web/assets/conflict-editor-rOpVkK9P.js.br +0 -0
- package/dist/web/assets/conflict-editor-rOpVkK9P.js.gz +0 -0
- package/dist/web/assets/connection-form-tab-BGmb918E.js +0 -4
- package/dist/web/assets/connection-form-tab-BGmb918E.js.br +0 -0
- package/dist/web/assets/connection-form-tab-BGmb918E.js.gz +0 -0
- package/dist/web/assets/context-menu-BoQ6lxte.js +0 -1
- package/dist/web/assets/context-menu-BoQ6lxte.js.br +0 -0
- package/dist/web/assets/context-menu-BoQ6lxte.js.gz +0 -0
- package/dist/web/assets/createLucideIcon-DBXq3G0e.js +0 -1
- package/dist/web/assets/createLucideIcon-DBXq3G0e.js.br +0 -0
- package/dist/web/assets/createLucideIcon-DBXq3G0e.js.gz +0 -0
- package/dist/web/assets/csv-preview-CM7su92m.js +0 -10
- package/dist/web/assets/csv-preview-CM7su92m.js.br +0 -0
- package/dist/web/assets/csv-preview-CM7su92m.js.gz +0 -0
- package/dist/web/assets/database-drivers-section-C6ZKPWaE.js +0 -1
- package/dist/web/assets/database-drivers-section-C6ZKPWaE.js.br +0 -0
- package/dist/web/assets/database-drivers-section-C6ZKPWaE.js.gz +0 -0
- package/dist/web/assets/db-explorer-store-BcLxq-X0.js +0 -1
- package/dist/web/assets/db-explorer-store-BcLxq-X0.js.br +0 -0
- package/dist/web/assets/db-explorer-store-BcLxq-X0.js.gz +0 -0
- package/dist/web/assets/db-tab-parts-DvmnlA6V.js +0 -1
- package/dist/web/assets/db-tab-parts-DvmnlA6V.js.br +0 -0
- package/dist/web/assets/db-tab-parts-DvmnlA6V.js.gz +0 -0
- package/dist/web/assets/db-types-9ac-eYxf.js +0 -1
- package/dist/web/assets/db-types-9ac-eYxf.js.br +0 -0
- package/dist/web/assets/db-types-9ac-eYxf.js.gz +0 -0
- package/dist/web/assets/design-canvas-check-Bo76Q6Qr.js +0 -1
- package/dist/web/assets/design-canvas-check-Bo76Q6Qr.js.br +0 -0
- package/dist/web/assets/design-canvas-check-Bo76Q6Qr.js.gz +0 -0
- package/dist/web/assets/design-export-client-ClwRg798.js +0 -1
- package/dist/web/assets/design-export-client-ClwRg798.js.br +0 -0
- package/dist/web/assets/design-export-client-ClwRg798.js.gz +0 -0
- package/dist/web/assets/design-responsive-dialog-Cdccv3Nw.js +0 -1
- package/dist/web/assets/design-responsive-dialog-Cdccv3Nw.js.br +0 -0
- package/dist/web/assets/design-responsive-dialog-Cdccv3Nw.js.gz +0 -0
- package/dist/web/assets/design-settings-section-CuxZSLAr.js +0 -2
- package/dist/web/assets/design-settings-section-CuxZSLAr.js.br +0 -0
- package/dist/web/assets/design-settings-section-CuxZSLAr.js.gz +0 -0
- package/dist/web/assets/design-skill-suggestion-DZQjG8FV.js +0 -3
- package/dist/web/assets/design-skill-suggestion-DZQjG8FV.js.br +0 -0
- package/dist/web/assets/design-skill-suggestion-DZQjG8FV.js.gz +0 -0
- package/dist/web/assets/design-tab-JlKmHVkd.js +0 -57
- package/dist/web/assets/design-tab-JlKmHVkd.js.br +0 -0
- package/dist/web/assets/design-tab-JlKmHVkd.js.gz +0 -0
- package/dist/web/assets/designs-sidebar-panel-C1EwWf4Z.js +0 -1
- package/dist/web/assets/designs-sidebar-panel-C1EwWf4Z.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-C1EwWf4Z.js.gz +0 -0
- package/dist/web/assets/dialog-DOaEX6AK.js +0 -1
- package/dist/web/assets/dialog-DOaEX6AK.js.br +0 -0
- package/dist/web/assets/dialog-DOaEX6AK.js.gz +0 -0
- package/dist/web/assets/diff-viewer-FidH7Nsq.js +0 -4
- package/dist/web/assets/diff-viewer-FidH7Nsq.js.br +0 -0
- package/dist/web/assets/diff-viewer-FidH7Nsq.js.gz +0 -0
- package/dist/web/assets/docx-preview-ENiLGqzy.js +0 -12
- package/dist/web/assets/docx-preview-ENiLGqzy.js.br +0 -0
- package/dist/web/assets/docx-preview-ENiLGqzy.js.gz +0 -0
- package/dist/web/assets/dropdown-menu-DB3yyoVz.js +0 -1
- package/dist/web/assets/dropdown-menu-DB3yyoVz.js.br +0 -0
- package/dist/web/assets/dropdown-menu-DB3yyoVz.js.gz +0 -0
- package/dist/web/assets/edit-diff-preview-D4EqC86X.js +0 -7
- package/dist/web/assets/edit-diff-preview-D4EqC86X.js.br +0 -0
- package/dist/web/assets/edit-diff-preview-D4EqC86X.js.gz +0 -0
- package/dist/web/assets/editor-dialog-DC7dUWAX.js +0 -1
- package/dist/web/assets/editor-dialog-DC7dUWAX.js.br +0 -0
- package/dist/web/assets/editor-dialog-DC7dUWAX.js.gz +0 -0
- package/dist/web/assets/editor-language-service-0pN0TxYN.js +0 -1
- package/dist/web/assets/editor-language-service-0pN0TxYN.js.br +0 -0
- package/dist/web/assets/editor-language-service-0pN0TxYN.js.gz +0 -0
- package/dist/web/assets/explorer-body-tFaUp9_Q.js +0 -2
- package/dist/web/assets/explorer-body-tFaUp9_Q.js.br +0 -0
- package/dist/web/assets/explorer-body-tFaUp9_Q.js.gz +0 -0
- package/dist/web/assets/explorer-model-BmgFEsj1.js +0 -1
- package/dist/web/assets/explorer-model-BmgFEsj1.js.br +0 -0
- package/dist/web/assets/explorer-model-BmgFEsj1.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-XnRTZT_X.js +0 -1
- package/dist/web/assets/explorer-window-content-XnRTZT_X.js.br +0 -0
- package/dist/web/assets/explorer-window-content-XnRTZT_X.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-DEbwRPf1.js +0 -1
- package/dist/web/assets/extension-manager-section-DEbwRPf1.js.br +0 -0
- package/dist/web/assets/extension-manager-section-DEbwRPf1.js.gz +0 -0
- package/dist/web/assets/extension-webview-C9ApceLU.js +0 -12
- package/dist/web/assets/extension-webview-C9ApceLU.js.br +0 -0
- package/dist/web/assets/extension-webview-C9ApceLU.js.gz +0 -0
- package/dist/web/assets/file-diff-lX1a7RLF.js +0 -1
- package/dist/web/assets/file-icons-DpwcJLL4.js +0 -1
- package/dist/web/assets/file-icons-DpwcJLL4.js.br +0 -0
- package/dist/web/assets/file-icons-DpwcJLL4.js.gz +0 -0
- package/dist/web/assets/file-store-Bk1WYfdy.js +0 -1
- package/dist/web/assets/file-store-Bk1WYfdy.js.br +0 -0
- package/dist/web/assets/file-store-Bk1WYfdy.js.gz +0 -0
- package/dist/web/assets/files-settings-section-C8MacVFQ.js +0 -1
- package/dist/web/assets/files-settings-section-C8MacVFQ.js.br +0 -0
- package/dist/web/assets/files-settings-section-C8MacVFQ.js.gz +0 -0
- package/dist/web/assets/filter-dialog-frame-CoWlaNRy.js +0 -1
- package/dist/web/assets/filter-dialog-frame-CoWlaNRy.js.br +0 -0
- package/dist/web/assets/filter-dialog-frame-CoWlaNRy.js.gz +0 -0
- package/dist/web/assets/format-file-meta-C0LKHE3e.js +0 -1
- package/dist/web/assets/format-file-meta-C0LKHE3e.js.br +0 -0
- package/dist/web/assets/format-file-meta-C0LKHE3e.js.gz +0 -0
- package/dist/web/assets/fs-api-BQrIEcvo.js +0 -1
- package/dist/web/assets/fs-api-BQrIEcvo.js.br +0 -0
- package/dist/web/assets/fs-api-BQrIEcvo.js.gz +0 -0
- package/dist/web/assets/general-settings-section-DZRRGdlQ.js +0 -1
- package/dist/web/assets/general-settings-section-DZRRGdlQ.js.br +0 -0
- package/dist/web/assets/general-settings-section-DZRRGdlQ.js.gz +0 -0
- package/dist/web/assets/git-commit-horizontal-BVihXafd.js +0 -1
- package/dist/web/assets/git-log-panel-g2pBnu6r.js +0 -1
- package/dist/web/assets/git-log-panel-g2pBnu6r.js.br +0 -0
- package/dist/web/assets/git-log-panel-g2pBnu6r.js.gz +0 -0
- package/dist/web/assets/git-repo-store-BOYLnV67.js +0 -1
- package/dist/web/assets/git-repo-store-BOYLnV67.js.br +0 -0
- package/dist/web/assets/git-repo-store-BOYLnV67.js.gz +0 -0
- package/dist/web/assets/git-review-tab-BzI5mxWd.js +0 -3
- package/dist/web/assets/git-review-tab-BzI5mxWd.js.br +0 -0
- package/dist/web/assets/git-review-tab-BzI5mxWd.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-BxvI3ehr.js +0 -177
- package/dist/web/assets/glide-data-grid-BxvI3ehr.js.br +0 -0
- package/dist/web/assets/glide-data-grid-BxvI3ehr.js.gz +0 -0
- package/dist/web/assets/grid-save-dialog-D55Po6Vu.js +0 -2
- package/dist/web/assets/grid-save-dialog-D55Po6Vu.js.br +0 -0
- package/dist/web/assets/grid-save-dialog-D55Po6Vu.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-CoMC-Fx1.js +0 -1
- package/dist/web/assets/group-chat-tab-CoMC-Fx1.js.br +0 -0
- package/dist/web/assets/group-chat-tab-CoMC-Fx1.js.gz +0 -0
- package/dist/web/assets/icons-JMA45Ifw.js +0 -1
- package/dist/web/assets/icons-JMA45Ifw.js.br +0 -0
- package/dist/web/assets/icons-JMA45Ifw.js.gz +0 -0
- package/dist/web/assets/image-preview-D7KR11Xo.js +0 -1
- package/dist/web/assets/impexp-tab-JF6JF8eO.js +0 -1
- package/dist/web/assets/impexp-tab-JF6JF8eO.js.br +0 -0
- package/dist/web/assets/impexp-tab-JF6JF8eO.js.gz +0 -0
- package/dist/web/assets/index-DyYGWFVa.css +0 -1
- package/dist/web/assets/index-DyYGWFVa.css.br +0 -0
- package/dist/web/assets/index-DyYGWFVa.css.gz +0 -0
- package/dist/web/assets/index-ItT-dTPV.js +0 -59
- package/dist/web/assets/index-ItT-dTPV.js.br +0 -0
- package/dist/web/assets/index-ItT-dTPV.js.gz +0 -0
- package/dist/web/assets/input-CKGoVpYv.js +0 -1
- package/dist/web/assets/jira-watcher-section-CvyXLyjO.js +0 -1
- package/dist/web/assets/keybindings-store-CeEtx6js.js +0 -1
- package/dist/web/assets/keyboard-shortcuts-section-MUIE0Rvf.js +0 -1
- package/dist/web/assets/keyboard-shortcuts-section-MUIE0Rvf.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-MUIE0Rvf.js.gz +0 -0
- package/dist/web/assets/language-servers-section-DiYURB24.js +0 -2
- package/dist/web/assets/language-servers-section-DiYURB24.js.br +0 -0
- package/dist/web/assets/language-servers-section-DiYURB24.js.gz +0 -0
- package/dist/web/assets/logs-app-CJlNqOdc.js +0 -13
- package/dist/web/assets/logs-app-CJlNqOdc.js.br +0 -0
- package/dist/web/assets/logs-app-CJlNqOdc.js.gz +0 -0
- package/dist/web/assets/logs-tab-BoAlm_8H.js +0 -1
- package/dist/web/assets/logs-window-content-nNm4jl1s.js +0 -1
- package/dist/web/assets/lsp-client-LnKiMWeG.js +0 -1
- package/dist/web/assets/lsp-client-LnKiMWeG.js.br +0 -0
- package/dist/web/assets/lsp-client-LnKiMWeG.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-8Hef5MLx.js +0 -1
- package/dist/web/assets/markdown-renderer-BH_CFPJw.js +0 -5
- package/dist/web/assets/markdown-renderer-BH_CFPJw.js.br +0 -0
- package/dist/web/assets/markdown-renderer-BH_CFPJw.js.gz +0 -0
- package/dist/web/assets/media-url-CsdZ6q_T.js +0 -1
- package/dist/web/assets/metric-chart-canvas-LAMaVJTu.js +0 -1
- package/dist/web/assets/metric-chart-canvas-LAMaVJTu.js.br +0 -0
- package/dist/web/assets/metric-chart-canvas-LAMaVJTu.js.gz +0 -0
- package/dist/web/assets/mobile-bottom-sheet-CGmmdp_5.js +0 -1
- package/dist/web/assets/mobile-bottom-sheet-CGmmdp_5.js.br +0 -0
- package/dist/web/assets/mobile-bottom-sheet-CGmmdp_5.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-Dh2ZECzL.js +0 -1
- package/dist/web/assets/mobile-explorer-sheet-Dh2ZECzL.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-Dh2ZECzL.js.gz +0 -0
- package/dist/web/assets/new-design-dialog-CgBUrVFx.js +0 -1
- package/dist/web/assets/new-design-dialog-CgBUrVFx.js.br +0 -0
- package/dist/web/assets/new-design-dialog-CgBUrVFx.js.gz +0 -0
- package/dist/web/assets/notification-store-CXC7u6MW.js +0 -1
- package/dist/web/assets/notifications-settings-section-CPbx23nU.js +0 -1
- package/dist/web/assets/notifications-settings-section-CPbx23nU.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-CPbx23nU.js.gz +0 -0
- package/dist/web/assets/onboarding-entry--MWe4amV.js +0 -1
- package/dist/web/assets/onboarding-entry--MWe4amV.js.br +0 -0
- package/dist/web/assets/onboarding-entry--MWe4amV.js.gz +0 -0
- package/dist/web/assets/onboarding-quick-orientation-DZYQekRt.js +0 -1
- package/dist/web/assets/onboarding-quick-orientation-DZYQekRt.js.br +0 -0
- package/dist/web/assets/onboarding-quick-orientation-DZYQekRt.js.gz +0 -0
- package/dist/web/assets/open-db-tabs-CkQe49j_.js +0 -1
- package/dist/web/assets/open-db-tabs-CkQe49j_.js.br +0 -0
- package/dist/web/assets/open-db-tabs-CkQe49j_.js.gz +0 -0
- package/dist/web/assets/open-settings-DsGBn73g.js +0 -1
- package/dist/web/assets/overview-panel-CcUGDvnt.js +0 -1
- package/dist/web/assets/overview-panel-CcUGDvnt.js.br +0 -0
- package/dist/web/assets/overview-panel-CcUGDvnt.js.gz +0 -0
- package/dist/web/assets/panel-store-DmP16Fo0.js +0 -1
- package/dist/web/assets/panel-store-DmP16Fo0.js.br +0 -0
- package/dist/web/assets/panel-store-DmP16Fo0.js.gz +0 -0
- package/dist/web/assets/patch-tab-metadata-B-jH5svY.js +0 -1
- package/dist/web/assets/pdf-preview-DMUIWb9B.js +0 -1
- package/dist/web/assets/pdf-preview-DMUIWb9B.js.br +0 -0
- package/dist/web/assets/pdf-preview-DMUIWb9B.js.gz +0 -0
- package/dist/web/assets/performance-panel-CJDLUwrs.js +0 -3
- package/dist/web/assets/performance-panel-CJDLUwrs.js.br +0 -0
- package/dist/web/assets/performance-panel-CJDLUwrs.js.gz +0 -0
- package/dist/web/assets/portal-container-context-BXAsDqrB.js +0 -1
- package/dist/web/assets/ppmbot-settings-section-DTCTPQ-R.js +0 -1
- package/dist/web/assets/ppmbot-settings-section-DTCTPQ-R.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-DTCTPQ-R.js.gz +0 -0
- package/dist/web/assets/pptx-export-BxmgltJ4.js +0 -111
- package/dist/web/assets/pptx-export-BxmgltJ4.js.br +0 -0
- package/dist/web/assets/pptx-export-BxmgltJ4.js.gz +0 -0
- package/dist/web/assets/problems-panel-DX32QDH_.js +0 -1
- package/dist/web/assets/problems-panel-DX32QDH_.js.br +0 -0
- package/dist/web/assets/problems-panel-DX32QDH_.js.gz +0 -0
- package/dist/web/assets/process-row-format-CBw-CQCx.js +0 -1
- package/dist/web/assets/process-table-CX-NhOg6.js +0 -1
- package/dist/web/assets/process-table-CX-NhOg6.js.br +0 -0
- package/dist/web/assets/process-table-CX-NhOg6.js.gz +0 -0
- package/dist/web/assets/project-framework-store-Bi5dyHdx.js +0 -1
- package/dist/web/assets/project-store-CEGoLMOl.js +0 -1
- package/dist/web/assets/project-store-CEGoLMOl.js.br +0 -0
- package/dist/web/assets/project-store-CEGoLMOl.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-BGNvFe7e.js +0 -1
- package/dist/web/assets/proxy-settings-section-BGNvFe7e.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-BGNvFe7e.js.gz +0 -0
- package/dist/web/assets/query-audit-section-DTHI5GP7.js +0 -1
- package/dist/web/assets/query-audit-section-DTHI5GP7.js.br +0 -0
- package/dist/web/assets/query-audit-section-DTHI5GP7.js.gz +0 -0
- package/dist/web/assets/query-tab-qMlIkHRk.js +0 -22
- package/dist/web/assets/query-tab-qMlIkHRk.js.br +0 -0
- package/dist/web/assets/query-tab-qMlIkHRk.js.gz +0 -0
- package/dist/web/assets/react-PkBxFcos.js +0 -1
- package/dist/web/assets/remote-access-settings-section-t2BYAA9g.js +0 -1
- package/dist/web/assets/remote-access-settings-section-t2BYAA9g.js.br +0 -0
- package/dist/web/assets/remote-access-settings-section-t2BYAA9g.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-ChUU6Jts.js +0 -1
- package/dist/web/assets/remote-desktop-clipboard-notice-ChUU6Jts.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-ChUU6Jts.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-_bopEtCa.js +0 -2
- package/dist/web/assets/remote-desktop-mobile-sheet-_bopEtCa.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-_bopEtCa.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-D9G4kDfa.js +0 -1
- package/dist/web/assets/remote-desktop-mobile-view-D9G4kDfa.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-D9G4kDfa.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-Yz9eVB3-.js +0 -1
- package/dist/web/assets/remote-desktop-readiness-gate-Yz9eVB3-.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-Yz9eVB3-.js.gz +0 -0
- package/dist/web/assets/remote-desktop-settings-section-BTGGSjZY.js +0 -1
- package/dist/web/assets/remote-desktop-settings-section-BTGGSjZY.js.br +0 -0
- package/dist/web/assets/remote-desktop-settings-section-BTGGSjZY.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-B8ZaG2bL.js +0 -1
- package/dist/web/assets/remote-desktop-window-content-B8ZaG2bL.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-B8ZaG2bL.js.gz +0 -0
- package/dist/web/assets/rename-object-dialog-FSlcdUoB.js +0 -1
- package/dist/web/assets/rename-object-dialog-FSlcdUoB.js.br +0 -0
- package/dist/web/assets/rename-object-dialog-FSlcdUoB.js.gz +0 -0
- package/dist/web/assets/review-code-CfuJeLYd.js +0 -5
- package/dist/web/assets/review-code-CfuJeLYd.js.br +0 -0
- package/dist/web/assets/review-code-CfuJeLYd.js.gz +0 -0
- package/dist/web/assets/run-in-terminal-Bk9Bw7G1.js +0 -1
- package/dist/web/assets/run-in-terminal-button-DFPQUlZs.js +0 -1
- package/dist/web/assets/save-as-dialog-Bj9VpGYf.js +0 -1
- package/dist/web/assets/save-as-dialog-Bj9VpGYf.js.br +0 -0
- package/dist/web/assets/save-as-dialog-Bj9VpGYf.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-DNJ4K7zS.js +0 -1
- package/dist/web/assets/schedules-settings-section-DNJ4K7zS.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-DNJ4K7zS.js.gz +0 -0
- package/dist/web/assets/scroll-area-6Am1KMiB.js +0 -1
- package/dist/web/assets/scroll-area-6Am1KMiB.js.br +0 -0
- package/dist/web/assets/scroll-area-6Am1KMiB.js.gz +0 -0
- package/dist/web/assets/send-to-chat-Bcm_Lcog.js +0 -1
- package/dist/web/assets/send-to-chat-Bcm_Lcog.js.br +0 -0
- package/dist/web/assets/send-to-chat-Bcm_Lcog.js.gz +0 -0
- package/dist/web/assets/separator-BOYUIPkH.js +0 -1
- package/dist/web/assets/services-panel-CBRTsROB.js +0 -1
- package/dist/web/assets/services-panel-CBRTsROB.js.br +0 -0
- package/dist/web/assets/services-panel-CBRTsROB.js.gz +0 -0
- package/dist/web/assets/session-changes-bar-BRopa3Dh.js +0 -1
- package/dist/web/assets/session-changes-bar-BRopa3Dh.js.br +0 -0
- package/dist/web/assets/session-changes-bar-BRopa3Dh.js.gz +0 -0
- package/dist/web/assets/session-list-sync-triggers-DitiR5h1.js +0 -1
- package/dist/web/assets/session-list-sync-triggers-DitiR5h1.js.br +0 -0
- package/dist/web/assets/session-list-sync-triggers-DitiR5h1.js.gz +0 -0
- package/dist/web/assets/session-review-tab--kNB_FKQ.js +0 -6
- package/dist/web/assets/session-review-tab--kNB_FKQ.js.br +0 -0
- package/dist/web/assets/session-review-tab--kNB_FKQ.js.gz +0 -0
- package/dist/web/assets/settings-body-B-s0fEjc.js +0 -1
- package/dist/web/assets/settings-body-B-s0fEjc.js.br +0 -0
- package/dist/web/assets/settings-body-B-s0fEjc.js.gz +0 -0
- package/dist/web/assets/settings-categories-CcR9eL3x.js +0 -1
- package/dist/web/assets/settings-categories-CcR9eL3x.js.br +0 -0
- package/dist/web/assets/settings-categories-CcR9eL3x.js.gz +0 -0
- package/dist/web/assets/settings-section-content-BJ35dy5r.js +0 -1
- package/dist/web/assets/settings-section-content-DckksvTg.js +0 -2
- package/dist/web/assets/settings-section-content-DckksvTg.js.br +0 -0
- package/dist/web/assets/settings-section-content-DckksvTg.js.gz +0 -0
- package/dist/web/assets/settings-store-WeJyQVL8.js +0 -2
- package/dist/web/assets/settings-store-WeJyQVL8.js.br +0 -0
- package/dist/web/assets/settings-store-WeJyQVL8.js.gz +0 -0
- package/dist/web/assets/settings-tab-BlX33GEN.js +0 -1
- package/dist/web/assets/settings-window-content-B-7yV1_q.js +0 -1
- package/dist/web/assets/slash-command-picker-BBcy6w6m.js +0 -1
- package/dist/web/assets/slash-command-picker-BBcy6w6m.js.br +0 -0
- package/dist/web/assets/slash-command-picker-BBcy6w6m.js.gz +0 -0
- package/dist/web/assets/sortable-header-B9gfWik4.js +0 -1
- package/dist/web/assets/sortable-header-B9gfWik4.js.br +0 -0
- package/dist/web/assets/sortable-header-B9gfWik4.js.gz +0 -0
- package/dist/web/assets/sql-completion-provider-CaTHVr1l.js +0 -5
- package/dist/web/assets/sql-completion-provider-CaTHVr1l.js.br +0 -0
- package/dist/web/assets/sql-completion-provider-CaTHVr1l.js.gz +0 -0
- package/dist/web/assets/sql-object-tab-DVo4bxRI.js +0 -1
- package/dist/web/assets/sql-object-tab-DVo4bxRI.js.br +0 -0
- package/dist/web/assets/sql-object-tab-DVo4bxRI.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-BGfIpl5x.js +0 -1
- package/dist/web/assets/sqlite-viewer-BGfIpl5x.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-BGfIpl5x.js.gz +0 -0
- package/dist/web/assets/start-ellipsis-rBh37k0n.js +0 -1
- package/dist/web/assets/structure-save-dialog-STK_RFCK.js +0 -1
- package/dist/web/assets/structure-save-dialog-STK_RFCK.js.br +0 -0
- package/dist/web/assets/structure-save-dialog-STK_RFCK.js.gz +0 -0
- package/dist/web/assets/structure-tab-DuLnsTC4.js +0 -3
- package/dist/web/assets/structure-tab-DuLnsTC4.js.br +0 -0
- package/dist/web/assets/structure-tab-DuLnsTC4.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-BIjW16Pb.js +0 -2
- package/dist/web/assets/system-monitor-body-BIjW16Pb.js.br +0 -0
- package/dist/web/assets/system-monitor-body-BIjW16Pb.js.gz +0 -0
- package/dist/web/assets/system-monitor-tab-B6_tC9LO.js +0 -1
- package/dist/web/assets/system-monitor-window-content-CwBzqMUe.js +0 -1
- package/dist/web/assets/tab-host-window-content-CpdEjkZd.js +0 -1
- package/dist/web/assets/tab-host-window-content-CpdEjkZd.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-CpdEjkZd.js.gz +0 -0
- package/dist/web/assets/tab-store-nNzRNfVV.js +0 -1
- package/dist/web/assets/table-tab-B5asfTBP.js +0 -2
- package/dist/web/assets/table-tab-B5asfTBP.js.br +0 -0
- package/dist/web/assets/table-tab-B5asfTBP.js.gz +0 -0
- package/dist/web/assets/telegram-bot-token-field-BiqKbXwE.js +0 -1
- package/dist/web/assets/telegram-bot-token-field-BiqKbXwE.js.br +0 -0
- package/dist/web/assets/telegram-bot-token-field-BiqKbXwE.js.gz +0 -0
- package/dist/web/assets/terminal-tab-DpMONMVB.js +0 -3
- package/dist/web/assets/terminal-tab-DpMONMVB.js.br +0 -0
- package/dist/web/assets/terminal-tab-DpMONMVB.js.gz +0 -0
- package/dist/web/assets/tool-cards-DoDKxqN4.js +0 -14
- package/dist/web/assets/tool-cards-DoDKxqN4.js.br +0 -0
- package/dist/web/assets/tool-cards-DoDKxqN4.js.gz +0 -0
- package/dist/web/assets/use-at-most-wide-BQFi1Sjv.js +0 -1
- package/dist/web/assets/use-blob-url-D7ElNPnW.js +0 -1
- package/dist/web/assets/use-db-driver-installed-BscdI-wS.js +0 -1
- package/dist/web/assets/use-db-read-DYuyNA5i.js +0 -1
- package/dist/web/assets/use-db-read-DYuyNA5i.js.br +0 -0
- package/dist/web/assets/use-db-read-DYuyNA5i.js.gz +0 -0
- package/dist/web/assets/use-db-tab-Cr4lXxwF.js +0 -1
- package/dist/web/assets/use-db-tab-Cr4lXxwF.js.br +0 -0
- package/dist/web/assets/use-db-tab-Cr4lXxwF.js.gz +0 -0
- package/dist/web/assets/use-design-canvas-check-DKlyMp-S.js +0 -1
- package/dist/web/assets/use-design-canvas-check-DKlyMp-S.js.br +0 -0
- package/dist/web/assets/use-design-canvas-check-DKlyMp-S.js.gz +0 -0
- package/dist/web/assets/use-h264-canvas-decoder-DAjp9oHe.js +0 -1
- package/dist/web/assets/use-h264-canvas-decoder-DAjp9oHe.js.br +0 -0
- package/dist/web/assets/use-h264-canvas-decoder-DAjp9oHe.js.gz +0 -0
- package/dist/web/assets/use-inline-blame-DS0HrHJ3.js +0 -16
- package/dist/web/assets/use-inline-blame-DS0HrHJ3.js.br +0 -0
- package/dist/web/assets/use-inline-blame-DS0HrHJ3.js.gz +0 -0
- package/dist/web/assets/use-is-mobile-BXHbkfs9.js +0 -1
- package/dist/web/assets/use-lsp-BTVDYrt6.js +0 -6
- package/dist/web/assets/use-lsp-BTVDYrt6.js.br +0 -0
- package/dist/web/assets/use-lsp-BTVDYrt6.js.gz +0 -0
- package/dist/web/assets/use-monaco-theme-DqnhExsm.js +0 -1
- package/dist/web/assets/use-opener-focus-C5L5UUJs.js +0 -1
- package/dist/web/assets/use-process-kill-D-SGQxDn.js +0 -1
- package/dist/web/assets/use-process-kill-D-SGQxDn.js.br +0 -0
- package/dist/web/assets/use-process-kill-D-SGQxDn.js.gz +0 -0
- package/dist/web/assets/use-sql-schema-info-DRb9dAKi.js +0 -4
- package/dist/web/assets/use-sql-schema-info-DRb9dAKi.js.br +0 -0
- package/dist/web/assets/use-sql-schema-info-DRb9dAKi.js.gz +0 -0
- package/dist/web/assets/use-visual-viewport-CQ6-A0Dt.js +0 -1
- package/dist/web/assets/use-websocket-C6RnlNVJ.js +0 -1
- package/dist/web/assets/vendor-markdown-QKPNiWEd.js +0 -291
- package/dist/web/assets/vendor-markdown-QKPNiWEd.js.br +0 -0
- package/dist/web/assets/vendor-markdown-QKPNiWEd.js.gz +0 -0
- package/dist/web/assets/vendor-ui-CS1GvlOm.js +0 -45
- package/dist/web/assets/vendor-ui-CS1GvlOm.js.br +0 -0
- package/dist/web/assets/vendor-ui-CS1GvlOm.js.gz +0 -0
- package/dist/web/assets/video-preview-CYzeUPfH.js +0 -1
- package/dist/web/assets/video-preview-CYzeUPfH.js.br +0 -0
- package/dist/web/assets/video-preview-CYzeUPfH.js.gz +0 -0
- package/dist/web/assets/voice-settings-section-C01d-toF.js +0 -1
- package/dist/web/assets/voice-settings-section-C01d-toF.js.br +0 -0
- package/dist/web/assets/voice-settings-section-C01d-toF.js.gz +0 -0
- package/dist/web/assets/web-preview-tab-F5C3quQs.js +0 -1
- package/dist/web/assets/web-preview-tab-F5C3quQs.js.br +0 -0
- package/dist/web/assets/web-preview-tab-F5C3quQs.js.gz +0 -0
- package/dist/web/assets/window-pip-registry-DSoB7T3k.js +0 -1
- package/dist/web/assets/window-store-zJczRsv4.js +0 -1
- package/dist/web/assets/window-store-zJczRsv4.js.br +0 -0
- package/dist/web/assets/window-store-zJczRsv4.js.gz +0 -0
- package/dist/web/assets/ws-auth-cWeQ7_61.js +0 -1
- /package/dist/web/assets/{__vite-browser-external-B4VNaaaA.js → __vite-browser-external-DL4jXWNt.js} +0 -0
- /package/dist/web/assets/{clipboard-D3XnL7CB.js → clipboard-D-VCry-F.js} +0 -0
- /package/dist/web/assets/{clipboard-D3XnL7CB.js.br → clipboard-D-VCry-F.js.br} +0 -0
- /package/dist/web/assets/{clipboard-D3XnL7CB.js.gz → clipboard-D-VCry-F.js.gz} +0 -0
- /package/dist/web/assets/{code-fence-vHZyBehL.js → code-fence-BK57HRhJ.js} +0 -0
- /package/dist/web/assets/{design-system-status-label-Cus6e2Df.js → design-system-status-label-KA4ESjWe.js} +0 -0
- /package/dist/web/assets/{format-bytes-B2kC4sbB.js → format-bytes-he3TR0bV.js} +0 -0
- /package/dist/web/assets/{session-turns-gmrmXzeg.js → session-turns-D3QpTtCq.js} +0 -0
- /package/dist/web/assets/{session-turns-gmrmXzeg.js.br → session-turns-D3QpTtCq.js.br} +0 -0
- /package/dist/web/assets/{session-turns-gmrmXzeg.js.gz → session-turns-D3QpTtCq.js.gz} +0 -0
- /package/dist/web/assets/{vendor-xterm-sFX94k3w.js → vendor-xterm-DRhOk3kW.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-sFX94k3w.js.br → vendor-xterm-DRhOk3kW.js.br} +0 -0
- /package/dist/web/assets/{vendor-xterm-sFX94k3w.js.gz → vendor-xterm-DRhOk3kW.js.gz} +0 -0
|
@@ -0,0 +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{A as r,Cn as i,gt as a,hr as o,j as s,pr as c,qr as l,ut as u,wn as d,xn as f}from"./icons-BwyIKaTT.js";import{k as p,n as m,r as h}from"./api-client-xQDlhUTu.js";import{n as g}from"./utils-Bslrbb-G.js";import"./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"./tab-store-D5I52eLN.js";import"./use-is-mobile-VRV9eZy1.js";import"./settings-categories-Ajj4ui27.js";import{t as _}from"./open-settings-EXR4zoZG.js";import{r as v}from"./clipboard-D-VCry-F.js";import{t as y}from"./button-C9ZXWb3b.js";import"./dialog-Dn_2tuYa.js";import"./mobile-bottom-sheet-DArbIyrD.js";import"./use-visual-viewport-MmugpRg-.js";import{An as b,Cn as x,Er as S,Kn as ee,Mn as C,Nn as w,On as T,Tn as E,a as D,i as O,jn as k,sn as A}from"./index-DLB3j_P0.js";import"./run-in-terminal-ujoc25vj.js";import{t as j}from"./run-in-terminal-button-m3i-Hcou.js";var M=e(t(),1),N={state:()=>h.get(`/api/tailscale/state`),login:()=>h.post(`/api/tailscale/login`),cancelLogin:()=>h.post(`/api/tailscale/login/cancel`),setService:e=>h.post(`/api/tailscale/service`,e)};function P(e){return e.installed?e.backendState===null?`start`:e.canManage===!1?`operator`:e.backendState===`Running`?!e.magicDns||!e.httpsCertificates?`dns`:e.device?.tags.length?e.service.defined?null:`service`:`tag`:`sign-in`:`install`}function F(e){let t=P(e);return t===`service`?null:t}var I=/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;function L(e){return e?e.length>63?`Use at most 63 characters.`:I.test(e)?null:`Use lowercase letters, digits and dashes, starting and ending with a letter or digit.`:`Enter a name.`}var R={dns:`https://login.tailscale.com/admin/dns`,accessControls:`https://login.tailscale.com/admin/acls/file`,machines:`https://login.tailscale.com/admin/machines`,services:`https://login.tailscale.com/admin/services`},z=n(),B=[`install`,`start`,`operator`,`sign-in`,`dns`,`tag`,`service`],V={install:`Install Tailscale`,start:`Start Tailscale`,operator:`Let PPM manage Tailscale`,"sign-in":`Sign in to Tailscale`,dns:`Turn on MagicDNS and HTTPS`,tag:`Tag this machine`,service:`Create the service`},H={darwin:`https://tailscale.com/download/mac`,win32:`https://tailscale.com/download/windows`},U=`curl -fsSL https://tailscale.com/install.sh | sh`,te=`sudo systemctl enable --now tailscaled`,W=e=>`sudo tailscale set --operator=${/^[\w.@-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}`,G=`tag:ppm`,ne=e=>`"tagOwners": {\n "${e}": ["autogroup:admin"]\n}`;function re({state:e,onRefresh:t,onSignIn:n,onShowSignIn:r}){let i=P(e),a=i?B.indexOf(i):B.length,s=B.filter(t=>t===`start`?i===`start`:t===`operator`?e.platform===`linux`:!0),c=e=>B.indexOf(e)<a?`done`:e===i?`current`:`todo`,l=(0,z.jsxs)(y,{variant:`outline`,onClick:t,className:`min-h-11 cursor-pointer md:min-h-9`,children:[(0,z.jsx)(o,{className:`size-3.5`}),`Check again`]}),u=e.device?.name||`this machine`,p=e.service.name,m=e.osUser&&e.osUser!==`root`?` && ${W(e.osUser)}`:``,h=`${U}${m}`,_=`${te}${m}`,v=`PPM types it into a terminal on this machine; press Enter there and give your password once.`,b={install:()=>e.platform===`linux`?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`This installs Tailscale, starts it`,m?` and lets PPM manage it`:``,`. `,v]}),(0,z.jsx)(C,{code:h}),(0,z.jsxs)(J,{children:[(0,z.jsx)(j,{command:h,label:`Install in terminal`}),l]})]}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(K,{children:`Install the Tailscale app on the machine PPM runs on and open it once.`}),(0,z.jsxs)(J,{children:[(0,z.jsx)(w,{href:H[e.platform]??`https://tailscale.com/download`,children:`Download Tailscale`}),l]})]}),start:()=>e.platform===`linux`?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`Tailscale is installed, but its service is not running. `,v]}),(0,z.jsx)(C,{code:_}),(0,z.jsxs)(J,{children:[(0,z.jsx)(j,{command:_,label:`Start in terminal`}),l]})]}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(K,{children:`Tailscale is installed, but not running. Open the Tailscale app on this machine.`}),(0,z.jsx)(J,{children:l})]}),operator:()=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`On Linux, Tailscale only takes changes from root and from one user it trusts. PPM runs as `,(0,z.jsx)(q,{children:e.osUser}),`, which has to be named once. `,v]}),(0,z.jsx)(C,{code:W(e.osUser)}),(0,z.jsxs)(J,{children:[(0,z.jsx)(j,{command:W(e.osUser),label:`Run in terminal`}),l]})]}),"sign-in":()=>{if(e.login.state===`starting`||e.login.state===`waiting`)return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(K,{children:`Waiting for you to finish signing in.`}),(0,z.jsx)(J,{children:(0,z.jsx)(y,{onClick:r,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Show sign-in link`})})]});if(e.backendState===`NeedsMachineAuth`)return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`Signed in. An admin has to approve `,u,` before it joins the tailnet.`]}),(0,z.jsxs)(J,{children:[(0,z.jsx)(w,{href:R.machines,children:`Open machines`}),l]})]});if(e.backendState===`Starting`)return(0,z.jsxs)(K,{children:[(0,z.jsx)(f,{className:`mr-2 inline size-4 animate-spin`}),`Connecting to Tailscale…`]});let t=e.backendState===`Stopped`;return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(K,{children:t?`Tailscale is turned off on this machine.`:`Sign this machine in with the account that owns your tailnet.`}),(0,z.jsx)(J,{children:(0,z.jsxs)(y,{onClick:n,className:`min-h-11 cursor-pointer md:min-h-9`,children:[(0,z.jsx)(d,{className:`size-4`}),t?`Turn on`:`Sign in`]})})]})},dns:()=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`In `,(0,z.jsx)(`b`,{children:`DNS`}),`, turn on `,(0,z.jsx)(`b`,{children:`MagicDNS`}),`, then choose `,(0,z.jsx)(`b`,{children:`Enable HTTPS`}),` under HTTPS Certificates. Every .ts.net address needs both.`]}),(0,z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`MagicDNS `,e.magicDns?`on`:`off`,` · HTTPS `,e.httpsCertificates?`on`:`off`]}),(0,z.jsxs)(J,{children:[(0,z.jsx)(w,{href:R.dns,children:`Open DNS settings`}),l]})]}),tag:()=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(K,{children:`Tailscale only lets a tagged machine host a service.`}),(0,z.jsxs)(`ol`,{className:`list-decimal space-y-3 pl-5 text-sm leading-relaxed text-muted-foreground`,children:[(0,z.jsxs)(`li`,{className:`space-y-2`,children:[(0,z.jsxs)(`p`,{children:[`In `,(0,z.jsx)(`b`,{children:`Access controls`}),`, let admins hand out the tag (once per tailnet):`]}),(0,z.jsx)(C,{code:ne(G)}),(0,z.jsx)(w,{href:R.accessControls,children:`Open access controls`})]}),(0,z.jsxs)(`li`,{className:`space-y-2`,children:[(0,z.jsxs)(`p`,{children:[`In `,(0,z.jsx)(`b`,{children:`Machines`}),`, open the menu of `,u,`, choose `,(0,z.jsx)(`b`,{children:`Edit tags`}),` and add `,(0,z.jsx)(q,{children:G}),`.`]}),(0,z.jsx)(w,{href:R.machines,children:`Open machines`})]})]}),(0,z.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`A tagged machine belongs to the tag rather than to your account.`}),(0,z.jsx)(J,{children:l})]}),service:()=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`In `,(0,z.jsx)(`b`,{children:`Services`}),`, choose `,(0,z.jsx)(`b`,{children:`Advertise`}),`, then `,(0,z.jsx)(`b`,{children:`Define a Service`}),`: name it `,(0,z.jsx)(q,{children:p}),` and give it the port `,(0,z.jsx)(q,{children:`tcp:443`}),`.`]}),(0,z.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`The address can be turned on before this; it then waits for the service and for an admin to approve this machine.`}),(0,z.jsxs)(J,{children:[(0,z.jsx)(w,{href:R.services,children:`Open services`}),l]})]})},x={operator:`PPM can change Tailscale's settings.`,"sign-in":e.device?.dnsName?`Signed in as ${e.device.dnsName}`:void 0,dns:`MagicDNS and HTTPS are on.`,tag:e.device?.tags.length?`Tagged ${e.device.tags.join(`, `)}`:void 0,service:`svc:${p} exists in your tailnet.`};return(0,z.jsx)(`ol`,{className:`space-y-1`,"data-testid":`tailscale-steps`,children:s.map((e,t)=>{let n=c(e);return(0,z.jsxs)(`li`,{className:`flex gap-3`,"data-step":e,"data-status":n,children:[(0,z.jsx)(ie,{n:t+1,status:n}),(0,z.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-2 pb-4`,children:[(0,z.jsx)(`div`,{className:g(`pt-0.5 text-sm`,n===`todo`?`text-muted-foreground`:`font-medium`),children:V[e]}),n===`done`&&x[e]&&(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:x[e]}),n===`current`&&b[e]()]})]},e)})})}function ie({n:e,status:t}){return t===`done`?(0,z.jsx)(s,{className:`mt-0.5 size-5 shrink-0 text-success`}):(0,z.jsx)(`span`,{className:g(`mt-0.5 flex size-5 shrink-0 items-center justify-center rounded-full border text-[11px] font-medium`,t===`current`?`border-primary text-primary`:`border-border text-muted-foreground`),children:e})}function K({children:e}){return(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:e})}function q({children:e}){return(0,z.jsx)(`code`,{className:`rounded bg-muted px-1 py-0.5 text-xs text-foreground`,children:e})}function J({children:e}){return(0,z.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:e})}var Y=`text-sm leading-relaxed text-muted-foreground`;function ae({open:e,login:t,osUser:n,onRetry:r,onCancel:i,onClose:a}){let o=(0,z.jsx)(y,{variant:`outline`,onClick:a,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Close`}),s=(0,z.jsx)(y,{onClick:r,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Try again`}),c,l;if(t.state===`waiting`&&t.url)c=(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(`p`,{className:Y,children:`Sign in with the account that owns your tailnet. This machine joins as soon as you finish.`}),(0,z.jsxs)(`div`,{className:`flex flex-col items-center gap-2`,children:[(0,z.jsx)(`div`,{className:`rounded-lg p-3`,style:{backgroundColor:`#ffffff`,colorScheme:`light`},children:(0,z.jsx)(A,{value:t.url,size:168,bgColor:`#ffffff`,fgColor:`#000000`,level:`L`,style:{display:`block`}})}),(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Or scan it with your phone`})]})]}),l=(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(y,{variant:`outline`,onClick:i,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel sign-in`}),(0,z.jsx)(w,{href:t.url,primary:!0,children:`Open sign-in page`})]});else if(t.state===`idle`||t.state===`starting`)c=(0,z.jsxs)(`p`,{className:`flex items-center gap-2 ${Y}`,children:[(0,z.jsx)(f,{className:`size-4 animate-spin`}),`Asking Tailscale for a sign-in link…`]}),l=(0,z.jsx)(y,{variant:`outline`,onClick:i,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`});else if(t.state===`success`)c=(0,z.jsx)(`p`,{className:Y,children:`Signed in.`}),l=o;else if(t.state===`needs-approval`)c=(0,z.jsx)(`p`,{className:Y,children:`Signed in. An admin has to approve this machine before it joins the tailnet.`}),l=(0,z.jsxs)(z.Fragment,{children:[o,(0,z.jsx)(w,{href:R.machines,primary:!0,children:`Open machines`})]});else if(t.state===`needs-operator`){let e=W(n);c=(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(`p`,{className:Y,children:`Tailscale on this machine only takes changes from root and from one user it trusts. This has to be run once, with your password. PPM types it into a terminal; press Enter there, then sign in again.`}),(0,z.jsx)(C,{code:e})]}),l=(0,z.jsxs)(z.Fragment,{children:[o,(0,z.jsx)(y,{variant:`outline`,onClick:r,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Try again`}),(0,z.jsx)(j,{command:e,label:`Run in terminal`,onRun:a})]})}else c=(0,z.jsx)(`p`,{className:Y,children:t.message??`The sign-in was cancelled.`}),l=(0,z.jsxs)(z.Fragment,{children:[o,s]});return(0,z.jsx)(k,{open:e,title:`Sign in to Tailscale`,onClose:a,children:(0,z.jsxs)(`div`,{className:`space-y-4`,"data-testid":`tailscale-sign-in`,children:[c,(0,z.jsx)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:l})]})})}var oe=4e3,X=e=>e instanceof Error?e.message:String(e);function se(e){return e.login.state===`starting`||e.login.state===`waiting`||P(e)!==null||e.enabled&&!e.service.approved}function ce(e){if(!e)return!1;try{return new URL(e).hostname===window.location.hostname}catch{return!1}}function le(e){return e.enabled?e.backendState===`Running`?e.service.pointsAtPpm?e.service.approved?`On. Open it from any device signed in to your tailnet.`:`On, waiting for an admin to approve this machine.`:`On, but Tailscale is not serving it right now.`:`On, but this machine is not connected to Tailscale.`:`Off.`}function ue(){let[e,t]=(0,M.useState)(null),[n,r]=(0,M.useState)(null),[a,o]=(0,M.useState)(!1),[s,c]=(0,M.useState)(!1),[u,d]=(0,M.useState)(!1),[f,h]=(0,M.useState)(!1),[v,b]=(0,M.useState)(``),x=(0,M.useRef)(0),C=(0,M.useRef)(null),w=(0,M.useCallback)(e=>{x.current++,t(e),r(null)},[]),T=(0,M.useCallback)(e=>{x.current++,t(t=>t&&{...t,login:e})},[]),E=(0,M.useCallback)(async()=>{let e=++x.current;try{let n=await N.state();e===x.current&&(t(n),r(null))}catch(t){e===x.current&&r(X(t))}},[]);(0,M.useEffect)(()=>{E()},[E]),(0,M.useEffect)(()=>{let e=()=>void E(),t=()=>{document.visibilityState===`visible`&&E()};return window.addEventListener(`tailscale:changed`,e),window.addEventListener(`focus`,e),document.addEventListener(`visibilitychange`,t),()=>{window.removeEventListener(`tailscale:changed`,e),window.removeEventListener(`focus`,e),document.removeEventListener(`visibilitychange`,t)}},[E]);let D=!!e&&se(e);(0,M.useEffect)(()=>{if(!D)return;let e=setInterval(()=>{document.visibilityState===`visible`&&E()},oe);return()=>clearInterval(e)},[D,E]);let O=e?.service.name??``;(0,M.useEffect)(()=>{b(O)},[O]);let A=e?.login.state;(0,M.useEffect)(()=>{s&&A===`success`&&(c(!1),p.success(`Signed in to Tailscale`))},[s,A]);let j=async()=>{T({state:`starting`,url:null,message:null}),c(!0);try{T(await N.login())}catch(e){T({state:`error`,url:null,message:X(e)})}},I=async()=>{c(!1);try{T(await N.cancelLogin())}catch{}},R=L(v),B=()=>{!e||v===e.service.name||R||(C.current=(async()=>{o(!0);try{w(await N.setService({name:v}))}catch(t){p.error(`Could not rename the address`,{description:X(t)}),b(e.service.name)}finally{o(!1)}})())},V=async(e,t=!1)=>{await C.current,o(!0);try{w(await N.setService(e?{enabled:!0,replace:t}:{enabled:!1}))}catch(t){let n=t instanceof m?t.body?.code:void 0;e&&n===`conflict`?d(!0):p.error(e?`Could not turn the address on`:`Could not turn the address off`,{description:X(t)})}finally{o(!1)}};if(!e)return(0,z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n?`Could not read Tailscale's state: ${n}`:`Reading Tailscale's state…`});let H=F(e)!==null,U=e.backendState===`Running`,te=e.authEnabled&&!H&&!R,W=P(e)===null,G=(0,z.jsx)(re,{state:e,onRefresh:()=>void E(),onSignIn:()=>void j(),onShowSignIn:()=>c(!0)});return(0,z.jsxs)(`div`,{className:`space-y-6`,"data-testid":`tailscale-settings`,children:[(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:`Reach PPM at a private https address from any device signed in to your tailnet. Nothing is opened to the internet, and PPM still asks for its password.`}),(0,z.jsxs)(`section`,{className:`space-y-4 rounded-lg border border-border p-4`,"data-testid":`tailscale-address`,children:[(0,z.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,z.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,z.jsx)(S,{htmlFor:`tailscale-address-switch`,className:`text-sm font-medium`,children:`Private address`}),(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,"data-testid":`tailscale-address-status`,children:le(e)})]}),(0,z.jsx)(`div`,{className:`flex min-h-11 shrink-0 items-center`,children:(0,z.jsx)(ee,{id:`tailscale-address-switch`,checked:e.enabled,disabled:a||!e.enabled&&!te,onCheckedChange:t=>{!t&&ce(e.service.url)?h(!0):V(t)}})})]}),e.enabled&&e.service.url?(0,z.jsx)(de,{url:e.service.url}):(0,z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,z.jsx)(S,{htmlFor:`tailscale-service-name`,className:`text-xs text-muted-foreground`,children:`Address`}),(0,z.jsxs)(`div`,{className:g(`flex min-h-11 items-center rounded-md border border-input bg-background focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50`,R&&`border-destructive`),children:[(0,z.jsx)(`input`,{id:`tailscale-service-name`,value:v,onChange:e=>b(e.target.value.toLowerCase()),onBlur:B,onKeyDown:e=>{e.key===`Enter`&&e.currentTarget.blur()},disabled:a||e.enabled,"aria-invalid":!!R,spellCheck:!1,autoCapitalize:`none`,autoComplete:`off`,className:`w-20 min-w-20 flex-1 bg-transparent py-2 pl-3 text-sm outline-none`}),(0,z.jsxs)(`span`,{className:`min-w-0 truncate pr-3 text-sm text-muted-foreground`,children:[`.`,e.dnsSuffix??`your-tailnet.ts.net`]})]}),(0,z.jsx)(`p`,{className:g(`text-xs`,R?`text-destructive`:`text-muted-foreground`),children:R??(e.enabled?`Turn the address off to rename it.`:`The address keeps this name when the machine is renamed.`)})]}),!e.enabled&&!e.authEnabled&&(0,z.jsxs)(Q,{icon:(0,z.jsx)(i,{className:`size-4`}),children:[(0,z.jsx)(`p`,{children:`PPM's password is off. Turn it on first: anyone in your tailnet could otherwise open PPM.`}),(0,z.jsx)(y,{variant:`outline`,onClick:()=>_(`general`),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Open General`})]}),!e.enabled&&e.authEnabled&&H&&(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Finish the setup below to turn it on.`}),e.enabled&&U&&!e.service.pointsAtPpm&&(0,z.jsxs)(Q,{icon:(0,z.jsx)(l,{className:`size-4 text-warning`}),children:[(0,z.jsx)(`p`,{children:`Tailscale is not serving this address right now.`}),(0,z.jsx)(y,{variant:`outline`,onClick:()=>void V(!0),disabled:a,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Apply again`})]}),e.enabled&&U&&e.service.pointsAtPpm&&!e.service.approved&&(0,z.jsx)(fe,{state:e})]}),W?(0,z.jsxs)(`details`,{className:`group`,children:[(0,z.jsx)(`summary`,{className:`flex min-h-11 cursor-pointer items-center text-sm font-medium`,children:`Setup: every step is done`}),(0,z.jsx)(`div`,{className:`pt-2`,children:G})]}):(0,z.jsxs)(`section`,{className:`space-y-3`,children:[(0,z.jsx)(`h3`,{className:`text-sm font-medium`,children:`Setup`}),G]}),(0,z.jsx)(ae,{open:s,login:e.login,osUser:e.osUser,onRetry:()=>void j(),onCancel:()=>void I(),onClose:()=>c(!1)}),(0,z.jsx)(k,{open:f,title:`Turn off the address you are using?`,onClose:()=>h(!1),children:(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`This page is open at `,e.service.url,`. Turning the address off disconnects it; reach PPM another way to turn it back on.`]}),(0,z.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,z.jsx)(y,{variant:`outline`,onClick:()=>h(!1),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`}),(0,z.jsx)(y,{variant:`destructive`,onClick:()=>{h(!1),V(!1)},className:`min-h-11 cursor-pointer md:min-h-9`,children:`Turn off`})]})]})}),(0,z.jsx)(k,{open:u,title:`Replace svc:${e.service.name}?`,onClose:()=>d(!1),children:(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`On this machine, svc:`,e.service.name,` already serves `,(0,z.jsx)(`code`,{className:`text-xs text-foreground`,children:e.service.target??`something else`}),`. Replacing it points the address at PPM, and what it served stops answering there.`]}),(0,z.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,z.jsx)(y,{variant:`outline`,onClick:()=>d(!1),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`}),(0,z.jsx)(y,{variant:`destructive`,onClick:()=>{d(!1),V(!0,!0)},className:`min-h-11 cursor-pointer md:min-h-9`,children:`Replace`})]})]})})]})}var Z=`flex size-11 shrink-0 cursor-pointer items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-surface-hover hover:text-foreground`;function de({url:e,qrHint:t=`Scan with a phone that is signed in to your tailnet`}){let[n,i]=(0,M.useState)(!1),[o,s]=(0,M.useState)(!1),l=async()=>{await v(e)&&(i(!0),setTimeout(()=>i(!1),1500))};return(0,z.jsxs)(`div`,{className:`space-y-3`,children:[(0,z.jsxs)(`div`,{className:`flex items-center rounded-md border border-border bg-muted pl-3`,"data-testid":`tailscale-address-url`,children:[(0,z.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-sm`,children:e}),(0,z.jsx)(`button`,{type:`button`,onClick:()=>void l(),"aria-label":`Copy address`,title:`Copy address`,className:Z,children:n?(0,z.jsx)(r,{className:`size-4 text-success`}):(0,z.jsx)(u,{className:`size-4`})}),(0,z.jsx)(`button`,{type:`button`,onClick:()=>s(e=>!e),"aria-label":`Show QR code`,"aria-pressed":o,title:`Show QR code`,className:g(Z,o&&`text-foreground`),children:(0,z.jsx)(c,{className:`size-4`})}),(0,z.jsx)(`a`,{href:e,target:`_blank`,rel:`noopener noreferrer`,"aria-label":`Open address`,title:`Open address`,className:Z,children:(0,z.jsx)(a,{className:`size-4`})})]}),o&&(0,z.jsxs)(`div`,{className:`flex flex-col items-center gap-2`,children:[(0,z.jsx)(`div`,{className:`rounded-lg p-3`,style:{backgroundColor:`#ffffff`,colorScheme:`light`},children:(0,z.jsx)(A,{value:e,size:168,bgColor:`#ffffff`,fgColor:`#000000`,level:`L`,style:{display:`block`}})}),(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:t})]})]})}function fe({state:e}){let t=`svc:${e.service.name}`,n=e.device?.name||`this machine`,r=`"autoApprovers": {\n "services": {\n "${t}": ["${e.device?.tags[0]??`tag:ppm`}"]\n }\n}`;return(0,z.jsxs)(Q,{icon:(0,z.jsx)(l,{className:`size-4 text-warning`}),children:[(0,z.jsx)(`p`,{children:e.service.defined?(0,z.jsxs)(z.Fragment,{children:[`Waiting for approval. In `,(0,z.jsx)(`b`,{children:`Services`}),`, open `,t,` and approve `,n,` under Service hosts.`]}):(0,z.jsxs)(z.Fragment,{children:[`Waiting for the service. Create `,t,` in `,(0,z.jsx)(`b`,{children:`Services`}),` (the last step below), then approve `,n,` as its host.`]})}),(0,z.jsx)(w,{href:R.services,children:`Open services`}),(0,z.jsx)(`p`,{className:`pt-1`,children:`To approve machines with this tag automatically, add this to your access controls:`}),(0,z.jsx)(C,{code:r})]})}function Q({icon:e,children:t}){return(0,z.jsxs)(`div`,{className:`flex gap-3 rounded-md border border-border bg-muted px-4 py-3`,children:[(0,z.jsx)(`span`,{className:`mt-0.5 shrink-0 text-muted-foreground`,children:e}),(0,z.jsx)(`div`,{className:`min-w-0 flex-1 space-y-2 text-sm leading-relaxed text-muted-foreground`,children:t})]})}var pe=1e4,me=2e3,$=e=>e instanceof Error?e.message:String(e);function he(e){if(!e)return!1;try{return new URL(e).hostname===window.location.hostname}catch{return!1}}function ge(){let[e,t]=(0,M.useState)(null),[n,r]=(0,M.useState)(null),[a,o]=(0,M.useState)(!1),[s,c]=(0,M.useState)(!1),[u,d]=(0,M.useState)(!1),[m,h]=(0,M.useState)(!1),g=D(),v=(0,M.useCallback)(async()=>{try{t(await x.status()),r(null)}catch(e){r($(e))}},[]),b=e?e.enabled??!0:!1,C=b&&!!e&&!e.active;(0,M.useEffect)(()=>{v()},[v]),(0,M.useEffect)(()=>{let e=setInterval(()=>{document.visibilityState===`visible`&&v()},C?me:pe);return()=>clearInterval(e)},[C,v]),(0,M.useEffect)(()=>{let e=()=>{v(),g.refreshStatus()};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[v,g.refreshStatus]);let w=async e=>{o(!0),t(t=>t&&{...t,enabled:e});try{await x.setEnabled(e),await v()}catch(n){t(t=>t&&{...t,enabled:!e}),p.error(e?`Could not turn the public link on`:`Could not turn the public link off`,{description:$(n)})}finally{o(!1)}},T=async()=>{d(!1),h(!0);try{await E.disable(),p.success(`Switched to a temporary address`),await Promise.all([g.refreshStatus(),v()])}catch(e){p.error(`Could not switch to a temporary address`,{description:$(e)})}finally{h(!1)}};if(!e)return(0,z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n?`Could not read the public link's state: ${n}`:`Reading the public link's state…`});let A=g.status,j=A?.authEnabled??!0,N=A?.mode??`quick`,P=N===`named`?A?.hostname??null:null,F=!!P&&window.location.hostname===P,I=g.step.k!==`hidden`&&g.step.k!==`ask-domain`,L=N===`named`&&A?.liveMode===`quick`;return(0,z.jsxs)(`div`,{className:`space-y-6`,"data-testid":`public-link-pane`,children:[(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:`Open PPM from anywhere through a public https link, served by Cloudflare. Anyone who has the link reaches PPM's sign-in page, so keep the password on. For a link only your own devices can open, use Tailscale instead.`}),(0,z.jsxs)(`section`,{className:`space-y-4 rounded-lg border border-border p-4`,"data-testid":`public-link-switch-card`,children:[(0,z.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,z.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,z.jsx)(S,{htmlFor:`public-link-switch`,className:`text-sm font-medium`,children:`Public link`}),(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,"data-testid":`public-link-status`,children:b?C?`On. Waiting for Cloudflare to hand out the link…`:`On. Anyone with the link reaches PPM's sign-in page.`:`Off.`})]}),(0,z.jsxs)(`div`,{className:`flex min-h-11 shrink-0 items-center gap-2`,children:[(a||C)&&(0,z.jsx)(f,{className:`size-4 animate-spin text-muted-foreground`}),(0,z.jsx)(ee,{id:`public-link-switch`,checked:b,disabled:a||!b&&!j,onCheckedChange:t=>{!t&&he(e.url)?c(!0):w(t)}})]})]}),b&&e.url&&(0,z.jsx)(de,{url:e.url,qrHint:`Scan to open PPM on a phone`}),!j&&(0,z.jsxs)(Q,{icon:(0,z.jsx)(i,{className:`size-4`}),children:[(0,z.jsx)(`p`,{children:b?`PPM's password is off while the link is on: anyone who has the link can open PPM. Turn the password on, or the link off.`:`PPM's password is off. Turn it on first: anyone with the link could otherwise open PPM.`}),(0,z.jsx)(y,{variant:`outline`,onClick:()=>_(`general`),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Open General`})]})]}),(0,z.jsxs)(`section`,{className:`space-y-3`,"data-testid":`public-link-address`,children:[(0,z.jsx)(`h3`,{className:`text-sm font-medium`,children:`Address`}),I?(0,z.jsx)(`div`,{className:`rounded-lg border border-border p-4`,children:(0,z.jsx)(O,{step:g.step,t:g})}):(0,z.jsxs)(`div`,{className:`divide-y divide-border rounded-lg border border-border`,children:[(0,z.jsx)(_e,{title:`Temporary address`,inUse:N===`quick`,description:`A random trycloudflare.com address. It changes every time PPM restarts.`,action:N===`named`&&(0,z.jsx)(y,{variant:`outline`,onClick:()=>d(!0),disabled:m||F,className:`min-h-11 cursor-pointer md:min-h-9`,children:m?(0,z.jsx)(f,{className:`size-4 animate-spin`}):`Switch`})}),(0,z.jsx)(_e,{title:`Your own domain`,inUse:N===`named`,description:P?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(`span`,{className:`break-all font-medium text-foreground`,children:[`https://`,P]}),`. It stays the same after a restart.`]}):`One fixed address on a domain you have on Cloudflare, like ppm.example.com.`,action:N===`quick`&&j&&(0,z.jsx)(y,{onClick:g.answerYes,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Set up`})})]}),!I&&N===`quick`&&!j&&(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Turn on PPM's password to use your own domain.`}),!I&&F&&(0,z.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`This page is open through your domain, so switching would cut it off before the new address could show. Open PPM another way first (Tailscale, or on this machine), then switch.`}),(L||A?.tunnelWarning)&&(0,z.jsxs)(Q,{icon:(0,z.jsx)(l,{className:`size-4 text-warning`}),children:[L&&(0,z.jsx)(`p`,{children:`PPM could not use your domain and is on a temporary address for now.`}),A?.tunnelWarning&&(0,z.jsx)(`p`,{children:A.tunnelWarning})]})]}),(0,z.jsx)(k,{open:s,title:`Turn off the link you are using?`,onClose:()=>c(!1),children:(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`This page is open at `,e.url,`. Turning the link off disconnects it; reach PPM another way to turn it back on.`]}),(0,z.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,z.jsx)(y,{variant:`outline`,onClick:()=>c(!1),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`}),(0,z.jsx)(y,{variant:`destructive`,onClick:()=>{c(!1),w(!1)},className:`min-h-11 cursor-pointer md:min-h-9`,children:`Turn off`})]})]})}),(0,z.jsx)(k,{open:u,title:`Switch to a temporary address?`,onClose:()=>d(!1),children:(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`PPM stops answering at https://`,P,` and gets a new random address instead. Links that use your domain stop working until you set it up again.`]}),(0,z.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,z.jsx)(y,{variant:`outline`,onClick:()=>d(!1),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`}),(0,z.jsx)(y,{variant:`destructive`,onClick:()=>void T(),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Switch`})]})]})})]})}function _e({title:e,description:t,inUse:n,action:r}){return(0,z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 p-3`,"data-in-use":n||void 0,children:[(0,z.jsxs)(`div`,{className:`min-w-0 flex-[1_1_14rem] space-y-0.5`,children:[(0,z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,z.jsx)(`span`,{className:`text-sm font-medium`,children:e}),n&&(0,z.jsx)(`span`,{className:`rounded bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-primary`,children:`In use`})]}),(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:t})]}),r&&(0,z.jsx)(`div`,{className:`shrink-0`,children:r})]})}function ve(){let e=b(e=>e.tab),t=b(e=>e.setTab);return(0,z.jsxs)(`div`,{className:`space-y-5`,"data-testid":`remote-access`,"data-tab":e,children:[(0,z.jsx)(`div`,{role:`tablist`,"aria-label":`Remote access`,className:`flex gap-1 overflow-x-auto border-b border-border/50`,children:T.map(n=>(0,z.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":e===n.id,"data-testid":`remote-access-tab-${n.id}`,onClick:()=>t(n.id),className:g(`flex min-h-11 shrink-0 cursor-pointer items-center whitespace-nowrap rounded-t px-3 text-sm transition-colors md:min-h-9 md:text-xs`,e===n.id?`border-b-2 border-primary font-medium text-primary`:`text-text-subtle hover:text-text-secondary`),children:n.label},n.id))}),(0,z.jsxs)(`div`,{role:`tabpanel`,children:[e===`tailscale`&&(0,z.jsx)(ue,{}),e===`public-link`&&(0,z.jsx)(ge,{})]})]})}export{ve as RemoteAccessSettingsSection};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +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-DLB3j_P0.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
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/remote-desktop-mobile-view-CZb5EMEK.js","assets/rolldown-runtime-C5c2KzVm.js","assets/index-DLB3j_P0.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-M3DUzop8.css","assets/remote-desktop-clipboard-notice-BpDakRY0.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-DLB3j_P0.js";import"./run-in-terminal-ujoc25vj.js";import{n as s,t as c}from"./remote-desktop-readiness-gate-CipNtLX5.js";var l=e(t(),1),u=e(r(),1),d=n(),f=(0,l.lazy)(()=>i(()=>import(`./remote-desktop-mobile-view-CZb5EMEK.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
|
|
@@ -0,0 +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-DLB3j_P0.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-BpDakRY0.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
|
|
@@ -0,0 +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-DLB3j_P0.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
|
|
@@ -0,0 +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{A as r,Kr as i,Ln as a,ht as o,xn as s}from"./icons-BwyIKaTT.js";import{k as c,r as l}from"./api-client-xQDlhUTu.js";import{t as u}from"./button-C9ZXWb3b.js";import{t as d}from"./separator-DmU9aJwq.js";var f=e(t(),1),p=n(),m=e=>`${Math.round(e/1e6)} MB`;function h(){let[e,t]=(0,f.useState)(null),[n,h]=(0,f.useState)(!1),g=(0,f.useRef)(null),_=(0,f.useCallback)(async()=>{try{t(await l.get(`/api/remote-desktop/relay`))}catch{}},[]);(0,f.useEffect)(()=>{_()},[_]);let v=!!e?.job&&!e.job.done;(0,f.useEffect)(()=>{if(v)return g.current=setTimeout(()=>void _(),700),()=>{g.current&&clearTimeout(g.current)}},[v,e,_]);let y=async()=>{h(!0);try{await l.post(`/api/remote-desktop/relay/install`),await _()}catch(e){c.error(`Could not start the download`,{description:e instanceof Error?e.message:String(e)})}finally{h(!1)}},b=async()=>{h(!0);try{await l.post(`/api/remote-desktop/relay/uninstall`),await _()}catch(e){c.error(`Could not remove the relay`,{description:e instanceof Error?e.message:String(e)})}finally{h(!1)}},x=e?.job??null,S=x&&x.totalBytes>0?Math.round(x.receivedBytes/x.totalBytes*100):null,C=typeof window<`u`&&!window.isSecureContext;return(0,p.jsxs)(`div`,{className:`space-y-6`,children:[(0,p.jsxs)(`section`,{className:`space-y-3`,children:[(0,p.jsxs)(`div`,{children:[(0,p.jsx)(`h3`,{className:`text-sm font-medium`,children:`WebRTC relay`}),(0,p.jsx)(`p`,{className:`text-xs text-muted-foreground leading-relaxed`,children:`Streams the desktop over WebRTC instead of a WebSocket. It repackages the video this host already encoded — it never re-encodes, so the picture and the CPU cost are unchanged.`})]}),C&&(0,p.jsxs)(`p`,{className:`rounded-md bg-muted px-4 py-3 text-xs leading-relaxed`,children:[`You are reading this over plain HTTP. Browsers only expose the WebCodecs video decoder on HTTPS or localhost, so `,(0,p.jsx)(`strong`,{children:`Remote Desktop cannot show a picture on this address`}),` without the relay. Installing it fixes that; so does reaching PPM through its HTTPS tunnel.`]}),!e?.available&&!e?.installed&&(0,p.jsxs)(`p`,{className:`text-xs text-muted-foreground leading-relaxed`,children:[`MediaMTX publishes no build for this platform. You can install it yourself and put`,(0,p.jsx)(`code`,{className:`mx-1 rounded bg-muted px-1 py-0.5`,children:`mediamtx`}),`on this host's PATH — PPM generates its own configuration either way.`]}),(0,p.jsxs)(`div`,{className:`flex flex-col gap-3 sm:flex-row sm:items-center`,children:[(0,p.jsxs)(`div`,{className:`flex items-center gap-2 text-sm`,children:[e?.installed?(0,p.jsx)(r,{className:`size-4 text-emerald-500`}):(0,p.jsx)(a,{className:`size-4 text-muted-foreground`}),(0,p.jsx)(`span`,{children:e?.installed?e.source===`system`?`Installed on this host (not by PPM)`:`Installed — MediaMTX ${e.pinnedVersion}`:`Not installed`})]}),(0,p.jsxs)(`div`,{className:`flex flex-wrap gap-2 sm:ml-auto`,children:[!e?.installed&&e?.available&&(0,p.jsx)(u,{onClick:y,disabled:n||v,className:`min-h-11 px-4`,children:v?(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(s,{className:`size-4 animate-spin`}),`Downloading`,S===null?``:` ${S}%`]}):(0,p.jsxs)(p.Fragment,{children:[(0,p.jsx)(o,{className:`size-4`}),`Install`]})}),e?.installed&&e.source===`bundled`&&(0,p.jsxs)(u,{variant:`outline`,onClick:b,disabled:n||v,className:`min-h-11 px-4`,children:[(0,p.jsx)(i,{className:`size-4`}),`Remove`]})]})]}),v&&x&&(0,p.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[m(x.receivedBytes),x.totalBytes>0?` of ${m(x.totalBytes)}`:``]}),x?.error&&(0,p.jsx)(`p`,{className:`text-xs text-destructive`,children:x.error}),e?.path&&(0,p.jsx)(`p`,{className:`text-xs text-muted-foreground break-all`,children:e.path})]}),(0,p.jsx)(d,{}),(0,p.jsxs)(`section`,{className:`space-y-2`,children:[(0,p.jsx)(`h3`,{className:`text-sm font-medium`,children:`What changes when it is on`}),(0,p.jsxs)(`ul`,{className:`list-disc space-y-1 pl-5 text-xs text-muted-foreground leading-relaxed`,children:[(0,p.jsx)(`li`,{children:`The picture works on a plain-HTTP LAN address, not only over HTTPS or localhost.`}),(0,p.jsx)(`li`,{children:`A lost packet costs one retransmission instead of stalling the whole stream.`}),(0,p.jsx)(`li`,{children:`Keyboard, mouse, clipboard and host audio keep using the same WebSocket.`}),(0,p.jsx)(`li`,{children:`Video leaves this host on its own UDP port, protected by per-session credentials.`})]})]})]})}export{h as RemoteDesktopSettingsSection};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +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-DLB3j_P0.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-CipNtLX5.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-BpDakRY0.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
|
|
@@ -0,0 +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-DLB3j_P0.js";import{t as o}from"./editor-dialog-cQvqVZAR.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
|
|
@@ -0,0 +1,5 @@
|
|
|
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-DLB3j_P0.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
|
+
`)?e.slice(0,-2):e.endsWith(`
|
|
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
|
+
`),[e]),(0,x.useMemo)(()=>e.filter(e=>e.k!==`-`).map(e=>e.text).join(`
|
|
5
|
+
`),[e])],r),s=(0,x.useMemo)(()=>t===`open`?W(e):null,[e,t]),c=(0,x.useMemo)(()=>{let n=0,r=0,i=[];e.forEach((e,t)=>{let s=e.k===`-`?a?.[n]:o?.[r];e.k!==`+`&&n++,e.k!==`-`&&r++,i.push({row:e,at:t,tokens:s})});let s=new Set(H(e,t));return i.filter(e=>s.has(e.row))},[e,t,a,o]),l=n?`grid-cols-[28px_28px_14px_minmax(0,1fr)]`:`grid-cols-[40px_40px_18px_minmax(0,1fr)]`;if(c.length===0)return(0,S.jsxs)(`div`,{className:f(`grid`,l),children:[(0,S.jsx)(`span`,{}),(0,S.jsx)(`span`,{}),(0,S.jsx)(`span`,{}),(0,S.jsx)(`span`,{className:`py-0.5 font-sans text-text-subtle`,children:t===`kept`?`The file is deleted — nothing of it stays.`:`The file is gone again — it did not exist before this chat.`})]});let u=t!==`open`&&!i;return(0,S.jsx)(S.Fragment,{children:c.map(({row:e,at:r,tokens:a})=>{let o=t===`open`&&e.k===`+`,c=t===`open`&&e.k===`-`;return(0,S.jsxs)(`div`,{className:f(`grid`,l,o&&`bg-diff-added`,c&&`bg-diff-removed`),children:[(0,S.jsx)(`span`,{className:f(`select-none text-right text-[0.92em] text-text-subtle`,n?`pr-[5px]`:`pr-2`),children:t===`kept`&&!i?``:e.o??``}),(0,S.jsx)(`span`,{className:f(`select-none text-right text-[0.92em] text-text-subtle`,n?`pr-[5px]`:`pr-2`),children:t===`reverted`?``:e.n??``}),(0,S.jsx)(`span`,{className:f(`select-none text-center`,o?`text-success`:c?`text-error`:`text-text-subtle`),children:o?`+`:c?`−`:``}),(0,S.jsx)(`span`,{className:f(`min-w-0 whitespace-pre-wrap [overflow-wrap:anywhere]`,n?`pr-2.5`:`pr-3.5`,u&&`opacity-[.78]`),children:(0,S.jsx)(E,{text:e.text,tokens:a,span:s?.[r]??null,spanClass:f(`rounded-[2px]`,e.k===`+`?`bg-diff-added-word`:`bg-diff-removed-word`)})})]},r)})})}export{re as a,ie as c,ne as d,F as f,T as h,W as i,L as l,w as m,ae as n,te as o,E as p,N as r,I as s,J as t,P as u};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{E as e}from"./vendor-markdown-C-P1aR4p.js";import{Ur as t}from"./icons-BwyIKaTT.js";import{t as n}from"./button-C9ZXWb3b.js";import{r}from"./run-in-terminal-ujoc25vj.js";var i=e();function a({command:e,label:a,onRun:o,variant:s=`default`}){return(0,i.jsxs)(n,{variant:s,title:e,onClick:()=>{o?.(),r(e)},className:`min-h-11 cursor-pointer md:min-h-9`,children:[(0,i.jsx)(t,{className:`size-4`}),a]})}export{a as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./panel-store-BJhazigC.js";var t=`ppm:run-in-terminal`,n=`ppm:run-in-terminal:ack`;function r(e){return e.replace(/^[ \t]*\$[ \t]+/gm,``).replace(/\s+$/,``)}function i(i,a){let o=r(i);if(!o)return;let s=!1,c=()=>{s=!0};window.addEventListener(n,c),window.dispatchEvent(new CustomEvent(t,{detail:{command:o,projectName:a}})),window.removeEventListener(n,c),!s&&e.getState().openInDock({type:`terminal`,title:`Terminal`,projectId:a??null,closable:!0,metadata:{...a?{projectName:a}:{},pendingCommand:o}})}export{t as n,i as r,n as t};
|
|
@@ -0,0 +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-DLB3j_P0.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};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
U �~אָ_�=��V����D�N�K�]�����Di4��)��x��$1�����'Sw��V�m�}�����m�T��K9\_S-��I}"�7����OFM�f�r�px6E�(�m��� ؗ7����bG��$�jzi"�wq<�=\�(�1��!���o/���k���/�h�K!�����$pt�/��5��z���b!o=~�ڿ���X�BX�Iyp��>��Y�1���C�r�����+|��^j��jN����{9i�}/
|
|
2
|
+
h��N�s��#�����,��]�n��P�dm�.e�P���; �N�T�(S;,`^�-"8�P���h���B��A�.9�|�����C�c��Ѻs�������r�r���#ff�� ;��ЗB�_�+����S@!��!ۡ1�CR�ޝf���2�T��qh���E~��*ł����;D�K���װ��W ���!x��X���㰰�!r�ᄃ�WYi����|�ţ&��R
|
|
3
|
+
!�
|
|
4
|
+
�=]8�_W���'}�%Xؤo:m�.��s� �Ո�tIJ��3L�6^)iBĘ{gD�ԯ�-����A�N8�>b8ɑan8����a�f#o!�آ���!D`��awI�Y
|
|
5
|
+
�0N������y+/x� �Al��7'UH��]@�i�f�h�JjFU���֠1��g���CVԌ�F��J�l̦u覛�'���G�Uye:�]�s��߉OK�Cm���ԩ����=i~l,g�Џ�����M��G����-��SY8�M�`s-
|
|
Binary file
|
|
@@ -0,0 +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{Kr as r,L as i,O as a,P as o,cr as s,lr as c,or as l,tr as u}from"./icons-BwyIKaTT.js";import{k as d,r as f}from"./api-client-xQDlhUTu.js";import{n as p}from"./utils-Bslrbb-G.js";import"./portal-container-context-NBi-KGK0.js";import"./context-menu-BCuZYfWC.js";import{n as m}from"./use-is-mobile-VRV9eZy1.js";import{t as h}from"./button-C9ZXWb3b.js";import{a as ee,n as g,o as _,t as v}from"./dialog-Dn_2tuYa.js";import{t as y}from"./mobile-bottom-sheet-DArbIyrD.js";import"./use-visual-viewport-MmugpRg-.js";import{n as b,o as x,r as S,t as C,u as w}from"./adaptive-context-menu-C4jNSORA.js";import{t as T}from"./input-C3oVNCMq.js";import{t as te}from"./scroll-area-DOlQJGZp.js";import{Gn as E,Hn as D,Kn as O,Un as k,Vn as A,Wn as j}from"./index-DLB3j_P0.js";var M=e(t(),1),N=1e4;function P(){let[e,t]=(0,M.useState)([]),[n,r]=(0,M.useState)(!0),i=(0,M.useCallback)(async()=>{try{t(await f.get(`/api/schedules`))}catch{}finally{r(!1)}},[]);return(0,M.useEffect)(()=>{i();let e=setInterval(()=>{document.visibilityState===`visible`&&i()},N);return()=>clearInterval(e)},[i]),{schedules:e,loading:n,refetch:i}}function F(e){let[t,n]=(0,M.useState)([]),[r,i]=(0,M.useState)(!1),a=(0,M.useCallback)(async()=>{if(e!=null){i(!0);try{n(await f.get(`/api/schedules/${e}/runs?limit=20`))}catch{n([])}finally{i(!1)}}},[e]);return(0,M.useEffect)(()=>{a()},[a]),{runs:t,loading:r,refetch:a}}var I=n(),ne={done:`bg-success/10 text-success`,error:`bg-error/10 text-error`,running:`bg-warning/10 text-warning`,skipped:`bg-muted text-muted-foreground`};function re({scheduleId:e}){let{runs:t,loading:n}=F(e);return n&&t.length===0?(0,I.jsx)(`p`,{className:`text-[11px] text-muted-foreground py-1`,children:`Loading runs…`}):t.length===0?(0,I.jsx)(`p`,{className:`text-[11px] text-muted-foreground py-1`,children:`No runs yet.`}):(0,I.jsx)(`div`,{className:`space-y-1`,children:t.map(e=>(0,I.jsx)(ie,{run:e},e.id))})}function L(e){return new Date(e.includes(`T`)?e:e.replace(` `,`T`)+`Z`)}function ie({run:e}){let[t,n]=(0,M.useState)(!1),r=!!(e.output_truncated||e.error),i=e.ended_at?`${Math.round((L(e.ended_at).getTime()-L(e.started_at).getTime())/1e3)}s`:`…`;return(0,I.jsxs)(`div`,{className:`rounded border border-border text-[11px]`,children:[(0,I.jsxs)(`button`,{type:`button`,onClick:()=>r&&n(!t),className:p(`w-full flex items-center gap-2 px-2 py-2 min-h-11 text-left`,r&&`cursor-pointer hover:bg-accent/30`),children:[(0,I.jsx)(`span`,{className:p(`rounded px-1.5 py-0.5 font-medium shrink-0`,ne[e.status]),children:e.status}),(0,I.jsxs)(`span`,{className:`text-muted-foreground truncate flex-1`,children:[L(e.started_at).toLocaleString(),` · `,i,e.cost_usd!=null&&` · $${e.cost_usd.toFixed(4)}`,e.context_window_pct!=null&&` · ctx ${e.context_window_pct}%`]})]}),t&&(0,I.jsxs)(`div`,{className:`px-2 pb-2 space-y-1`,children:[e.error&&(0,I.jsx)(`p`,{className:`text-error break-all`,children:e.error}),e.output_truncated&&(0,I.jsx)(`pre`,{className:`overflow-auto max-h-96 whitespace-pre-wrap break-all text-muted-foreground font-mono text-[10px]`,children:e.output_truncated})]})]})}function ae({schedule:e,onEdit:t,onChanged:n}){let[a,s]=(0,M.useState)(!1),[m,h]=(0,M.useState)(0);return(0,I.jsxs)(`div`,{className:`rounded-lg border border-border`,children:[(0,I.jsxs)(C,{children:[(0,I.jsx)(w,{asChild:!0,children:(0,I.jsxs)(`button`,{type:`button`,onClick:()=>s(!a),className:`w-full flex items-center gap-2 px-2.5 py-2.5 min-h-11 text-left cursor-pointer hover:bg-accent/30`,children:[a?(0,I.jsx)(o,{className:`size-3.5 shrink-0 text-muted-foreground`}):(0,I.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,I.jsxs)(`div`,{className:`flex-1 min-w-0`,children:[(0,I.jsx)(`p`,{className:`text-xs font-medium truncate`,children:e.name}),(0,I.jsxs)(`p`,{className:`text-[11px] text-muted-foreground truncate`,children:[(0,I.jsx)(`span`,{className:`font-mono`,children:e.cron_expr}),` · `,e.next_fire_at&&e.enabled?`next ${new Date(e.next_fire_at).toLocaleString()}`:`—`]})]}),(0,I.jsx)(`span`,{className:p(`rounded px-1.5 py-0.5 text-[10px] font-medium shrink-0`,e.enabled?`bg-success/10 text-success`:`bg-muted text-muted-foreground`),children:e.enabled?`Enabled`:`Disabled`})]})}),(0,I.jsxs)(b,{children:[(0,I.jsxs)(S,{onClick:async()=>{try{let t=await f.post(`/api/schedules/${e.id}/run-now`);d.success(`Run #${t.runId} started${t.wasRunning?` (previous run still active)`:``}`),s(!0),h(e=>e+1)}catch(e){d.error(e instanceof Error?e.message:`Run failed`)}},children:[(0,I.jsx)(l,{className:`size-3.5`}),` Run now`]}),(0,I.jsxs)(S,{onClick:async()=>{try{await f.patch(`/api/schedules/${e.id}`,{enabled:!e.enabled}),n()}catch(e){d.error(e instanceof Error?e.message:`Update failed`)}},children:[(0,I.jsx)(c,{className:`size-3.5`}),` `,e.enabled?`Disable`:`Enable`]}),(0,I.jsxs)(S,{onClick:t,children:[(0,I.jsx)(u,{className:`size-3.5`}),` Edit`]}),(0,I.jsx)(x,{}),(0,I.jsxs)(S,{variant:`destructive`,onClick:async()=>{try{await f.del(`/api/schedules/${e.id}`),d.success(`Schedule deleted`),n()}catch(e){d.error(e instanceof Error?e.message:`Delete failed`)}},children:[(0,I.jsx)(r,{className:`size-3.5`}),` Delete`]})]})]}),a&&(0,I.jsxs)(`div`,{className:`px-2.5 pb-2.5 space-y-1.5`,children:[(0,I.jsx)(`p`,{className:`text-[11px] text-muted-foreground break-all line-clamp-3`,children:e.prompt}),(0,I.jsx)(re,{scheduleId:e.id},m)]})]})}function R(e,t,n,r,i,a,o,s){return R.fromTZ(R.tp(e,t,n,r,i,a,o),s)}R.fromTZISO=(e,t,n)=>R.fromTZ(B(e,t),n),R.fromTZ=function(e,t){let n=new Date(Date.UTC(e.y,e.m-1,e.d,e.h,e.i,e.s)),r=z(e.tz,n),i=new Date(n.getTime()-r),a=z(e.tz,i);if(a-r===0)return i;{let r=new Date(n.getTime()-a),o=z(e.tz,r);if(o-a===0||!t&&o-a>0)return r;if(t)throw Error(`Invalid date passed to fromTZ()`);return i}},R.toTZ=function(e,t){let n=e.toLocaleString(`en-US`,{timeZone:t}).replace(/[\u202f]/,` `),r=new Date(n);return{y:r.getFullYear(),m:r.getMonth()+1,d:r.getDate(),h:r.getHours(),i:r.getMinutes(),s:r.getSeconds(),tz:t}},R.tp=(e,t,n,r,i,a,o)=>({y:e,m:t,d:n,h:r,i,s:a,tz:o});function z(e,t=new Date){let n=t.toLocaleString(`en-US`,{timeZone:e,timeZoneName:`shortOffset`}).split(` `).slice(-1)[0],r=t.toLocaleString(`en-US`).replace(/[\u202f]/,` `);return Date.parse(`${r} GMT`)-Date.parse(`${r} ${n}`)}function B(e,t){let n=new Date(Date.parse(e));if(isNaN(n))throw Error(`minitz: Invalid ISO8601 passed to parser.`);let r=e.substring(9);return e.includes(`Z`)||r.includes(`-`)||r.includes(`+`)?R.tp(n.getUTCFullYear(),n.getUTCMonth()+1,n.getUTCDate(),n.getUTCHours(),n.getUTCMinutes(),n.getUTCSeconds(),`Etc/UTC`):R.tp(n.getFullYear(),n.getMonth()+1,n.getDate(),n.getHours(),n.getMinutes(),n.getSeconds(),t)}R.minitz=R;var V=32,H=31|V,U=[1,2,4,8,16],W=class{pattern;timezone;second;minute;hour;day;month;dayOfWeek;lastDayOfMonth;starDOM;starDOW;constructor(e,t){this.pattern=e,this.timezone=t,this.second=Array(60).fill(0),this.minute=Array(60).fill(0),this.hour=Array(24).fill(0),this.day=Array(31).fill(0),this.month=Array(12).fill(0),this.dayOfWeek=Array(7).fill(0),this.lastDayOfMonth=!1,this.starDOM=!1,this.starDOW=!1,this.parse()}parse(){if(!(typeof this.pattern==`string`||this.pattern instanceof String))throw TypeError(`CronPattern: Pattern has to be of type string.`);this.pattern.indexOf(`@`)>=0&&(this.pattern=this.handleNicknames(this.pattern).trim());let e=this.pattern.replace(/\s+/g,` `).split(` `);if(e.length<5||e.length>6)throw TypeError(`CronPattern: invalid configuration format ('`+this.pattern+`'), exactly five or six space separated parts are required.`);if(e.length===5&&e.unshift(`0`),e[3].indexOf(`L`)>=0&&(e[3]=e[3].replace(`L`,``),this.lastDayOfMonth=!0),e[3]==`*`&&(this.starDOM=!0),e[4].length>=3&&(e[4]=this.replaceAlphaMonths(e[4])),e[5].length>=3&&(e[5]=this.replaceAlphaDays(e[5])),e[5]==`*`&&(this.starDOW=!0),this.pattern.indexOf(`?`)>=0){let t=new q(new Date,this.timezone).getDate(!0);e[0]=e[0].replace(`?`,t.getSeconds().toString()),e[1]=e[1].replace(`?`,t.getMinutes().toString()),e[2]=e[2].replace(`?`,t.getHours().toString()),this.starDOM||(e[3]=e[3].replace(`?`,t.getDate().toString())),e[4]=e[4].replace(`?`,(t.getMonth()+1).toString()),this.starDOW||(e[5]=e[5].replace(`?`,t.getDay().toString()))}this.throwAtIllegalCharacters(e),this.partToArray(`second`,e[0],0,1),this.partToArray(`minute`,e[1],0,1),this.partToArray(`hour`,e[2],0,1),this.partToArray(`day`,e[3],-1,1),this.partToArray(`month`,e[4],-1,1),this.partToArray(`dayOfWeek`,e[5],0,H),this.dayOfWeek[7]&&(this.dayOfWeek[0]=this.dayOfWeek[7])}partToArray(e,t,n,r){let i=this[e],a=e===`day`&&this.lastDayOfMonth;if(t===``&&!a)throw TypeError(`CronPattern: configuration entry `+e+` (`+t+`) is empty, check for trailing spaces.`);if(t===`*`)return i.fill(r);let o=t.split(`,`);if(o.length>1)for(let t=0;t<o.length;t++)this.partToArray(e,o[t],n,r);else t.indexOf(`-`)!==-1&&t.indexOf(`/`)!==-1?this.handleRangeWithStepping(t,e,n,r):t.indexOf(`-`)===-1?t.indexOf(`/`)===-1?t!==``&&this.handleNumber(t,e,n,r):this.handleStepping(t,e,n,r):this.handleRange(t,e,n,r)}throwAtIllegalCharacters(e){for(let t=0;t<e.length;t++)if((t===5?/[^/*0-9,\-#L]+/:/[^/*0-9,-]+/).test(e[t]))throw TypeError(`CronPattern: configuration entry `+t+` (`+e[t]+`) contains illegal characters.`)}handleNumber(e,t,n,r){let i=this.extractNth(e,t),a=parseInt(i[0],10)+n;if(isNaN(a))throw TypeError(`CronPattern: `+t+` is not a number: '`+e+`'`);this.setPart(t,a,i[1]||r)}setPart(e,t,n){if(!Object.prototype.hasOwnProperty.call(this,e))throw TypeError(`CronPattern: Invalid part specified: `+e);if(e===`dayOfWeek`){if(t===7&&(t=0),t<0||t>6)throw RangeError(`CronPattern: Invalid value for dayOfWeek: `+t);this.setNthWeekdayOfMonth(t,n);return}if(e===`second`||e===`minute`){if(t<0||t>=60)throw RangeError(`CronPattern: Invalid value for `+e+`: `+t)}else if(e===`hour`){if(t<0||t>=24)throw RangeError(`CronPattern: Invalid value for `+e+`: `+t)}else if(e===`day`){if(t<0||t>=31)throw RangeError(`CronPattern: Invalid value for `+e+`: `+t)}else if(e===`month`&&(t<0||t>=12))throw RangeError(`CronPattern: Invalid value for `+e+`: `+t);this[e][t]=n}handleRangeWithStepping(e,t,n,r){let i=this.extractNth(e,t),a=i[0].match(/^(\d+)-(\d+)\/(\d+)$/);if(a===null)throw TypeError(`CronPattern: Syntax error, illegal range with stepping: '`+e+`'`);let[,o,s,c]=a,l=parseInt(o,10)+n,u=parseInt(s,10)+n,d=parseInt(c,10);if(isNaN(l))throw TypeError(`CronPattern: Syntax error, illegal lower range (NaN)`);if(isNaN(u))throw TypeError(`CronPattern: Syntax error, illegal upper range (NaN)`);if(isNaN(d))throw TypeError(`CronPattern: Syntax error, illegal stepping: (NaN)`);if(d===0)throw TypeError(`CronPattern: Syntax error, illegal stepping: 0`);if(d>this[t].length)throw TypeError(`CronPattern: Syntax error, steps cannot be greater than maximum value of part (`+this[t].length+`)`);if(l>u)throw TypeError(`CronPattern: From value is larger than to value: '`+e+`'`);for(let e=l;e<=u;e+=d)this.setPart(t,e,i[1]||r)}extractNth(e,t){let n=e,r;if(n.includes(`#`)){if(t!==`dayOfWeek`)throw Error(`CronPattern: nth (#) only allowed in day-of-week field`);r=n.split(`#`)[1],n=n.split(`#`)[0]}return[n,r]}handleRange(e,t,n,r){let i=this.extractNth(e,t),a=i[0].split(`-`);if(a.length!==2)throw TypeError(`CronPattern: Syntax error, illegal range: '`+e+`'`);let o=parseInt(a[0],10)+n,s=parseInt(a[1],10)+n;if(isNaN(o))throw TypeError(`CronPattern: Syntax error, illegal lower range (NaN)`);if(isNaN(s))throw TypeError(`CronPattern: Syntax error, illegal upper range (NaN)`);if(o>s)throw TypeError(`CronPattern: From value is larger than to value: '`+e+`'`);for(let e=o;e<=s;e++)this.setPart(t,e,i[1]||r)}handleStepping(e,t,n,r){let i=this.extractNth(e,t),a=i[0].split(`/`);if(a.length!==2)throw TypeError(`CronPattern: Syntax error, illegal stepping: '`+e+`'`);a[0]===``&&(a[0]=`*`);let o=0;a[0]!==`*`&&(o=parseInt(a[0],10)+n);let s=parseInt(a[1],10);if(isNaN(s))throw TypeError(`CronPattern: Syntax error, illegal stepping: (NaN)`);if(s===0)throw TypeError(`CronPattern: Syntax error, illegal stepping: 0`);if(s>this[t].length)throw TypeError(`CronPattern: Syntax error, max steps for part is (`+this[t].length+`)`);for(let e=o;e<this[t].length;e+=s)this.setPart(t,e,i[1]||r)}replaceAlphaDays(e){return e.replace(/-sun/gi,`-7`).replace(/sun/gi,`0`).replace(/mon/gi,`1`).replace(/tue/gi,`2`).replace(/wed/gi,`3`).replace(/thu/gi,`4`).replace(/fri/gi,`5`).replace(/sat/gi,`6`)}replaceAlphaMonths(e){return e.replace(/jan/gi,`1`).replace(/feb/gi,`2`).replace(/mar/gi,`3`).replace(/apr/gi,`4`).replace(/may/gi,`5`).replace(/jun/gi,`6`).replace(/jul/gi,`7`).replace(/aug/gi,`8`).replace(/sep/gi,`9`).replace(/oct/gi,`10`).replace(/nov/gi,`11`).replace(/dec/gi,`12`)}handleNicknames(e){let t=e.trim().toLowerCase();return t===`@yearly`||t===`@annually`?`0 0 1 1 *`:t===`@monthly`?`0 0 1 * *`:t===`@weekly`?`0 0 * * 0`:t===`@daily`?`0 0 * * *`:t===`@hourly`?`0 * * * *`:e}setNthWeekdayOfMonth(e,t){if(typeof t!=`number`&&t===`L`)this.dayOfWeek[e]=this.dayOfWeek[e]|V;else if(t===H)this.dayOfWeek[e]=H;else if(t<6&&t>0)this.dayOfWeek[e]=this.dayOfWeek[e]|U[t-1];else throw TypeError(`CronPattern: nth weekday out of range, should be 1-5 or L. Value: ${t}, Type: ${typeof t}`)}},G=[31,28,31,30,31,30,31,31,30,31,30,31],K=[[`month`,`year`,0],[`day`,`month`,-1],[`hour`,`day`,0],[`minute`,`hour`,0],[`second`,`minute`,0]],q=class e{tz;ms;second;minute;hour;day;month;year;constructor(t,n){if(this.tz=n,t&&t instanceof Date)if(!isNaN(t))this.fromDate(t);else throw TypeError(`CronDate: Invalid date passed to CronDate constructor`);else if(t===void 0)this.fromDate(new Date);else if(t&&typeof t==`string`)this.fromString(t);else if(t instanceof e)this.fromCronDate(t);else throw TypeError(`CronDate: Invalid type (`+typeof t+`) passed to CronDate constructor`)}isNthWeekdayOfMonth(e,t,n,r){let i=new Date(Date.UTC(e,t,n)).getUTCDay(),a=0;for(let r=1;r<=n;r++)new Date(Date.UTC(e,t,r)).getUTCDay()===i&&a++;if(r&H&&U[a-1]&r)return!0;if(r&V){let r=new Date(Date.UTC(e,t+1,0)).getUTCDate();for(let a=n+1;a<=r;a++)if(new Date(Date.UTC(e,t,a)).getUTCDay()===i)return!1;return!0}return!1}fromDate(e){if(this.tz!==void 0)if(typeof this.tz==`number`)this.ms=e.getUTCMilliseconds(),this.second=e.getUTCSeconds(),this.minute=e.getUTCMinutes()+this.tz,this.hour=e.getUTCHours(),this.day=e.getUTCDate(),this.month=e.getUTCMonth(),this.year=e.getUTCFullYear(),this.apply();else{let t=R.toTZ(e,this.tz);this.ms=e.getMilliseconds(),this.second=t.s,this.minute=t.i,this.hour=t.h,this.day=t.d,this.month=t.m-1,this.year=t.y}else this.ms=e.getMilliseconds(),this.second=e.getSeconds(),this.minute=e.getMinutes(),this.hour=e.getHours(),this.day=e.getDate(),this.month=e.getMonth(),this.year=e.getFullYear()}fromCronDate(e){this.tz=e.tz,this.year=e.year,this.month=e.month,this.day=e.day,this.hour=e.hour,this.minute=e.minute,this.second=e.second,this.ms=e.ms}apply(){if(this.month>11||this.day>G[this.month]||this.hour>59||this.minute>59||this.second>59||this.hour<0||this.minute<0||this.second<0){let e=new Date(Date.UTC(this.year,this.month,this.day,this.hour,this.minute,this.second,this.ms));return this.ms=e.getUTCMilliseconds(),this.second=e.getUTCSeconds(),this.minute=e.getUTCMinutes(),this.hour=e.getUTCHours(),this.day=e.getUTCDate(),this.month=e.getUTCMonth(),this.year=e.getUTCFullYear(),!0}else return!1}fromString(e){if(typeof this.tz==`number`){let t=R.fromTZISO(e);this.ms=t.getUTCMilliseconds(),this.second=t.getUTCSeconds(),this.minute=t.getUTCMinutes(),this.hour=t.getUTCHours(),this.day=t.getUTCDate(),this.month=t.getUTCMonth(),this.year=t.getUTCFullYear(),this.apply()}else return this.fromDate(R.fromTZISO(e,this.tz))}findNext(e,t,n,r){let i=this[t],a;n.lastDayOfMonth&&(a=this.month===1?new Date(Date.UTC(this.year,this.month+1,0,0,0,0,0)).getUTCDate():G[this.month]);let o=!n.starDOW&&t==`day`?new Date(Date.UTC(this.year,this.month,1,0,0,0,0)).getUTCDay():void 0;for(let s=this[t]+r;s<n[t].length;s++){let c=n[t][s];if(t===`day`&&n.lastDayOfMonth&&s-r==a&&(c=1),t===`day`&&!n.starDOW){let t=n.dayOfWeek[(o+(s-r-1))%7];if(t&&t&H)t=this.isNthWeekdayOfMonth(this.year,this.month,s-r,t)?1:0;else if(t)throw Error(`CronDate: Invalid value for dayOfWeek encountered. ${t}`);e.legacyMode&&!n.starDOM?c||=t:c&&=t}if(c)return this[t]=s-r,i===this[t]?1:2}return 3}recurse(e,t,n){let r=this.findNext(t,K[n][0],e,K[n][2]);if(r>1){let i=n+1;for(;i<K.length;)this[K[i][0]]=-K[i][2],i++;if(r===3)return this[K[n][1]]++,this[K[n][0]]=-K[n][2],this.apply(),this.recurse(e,t,0);if(this.apply())return this.recurse(e,t,n-1)}return n+=1,n>=K.length?this:this.year>=3e3?null:this.recurse(e,t,n)}increment(e,t,n){return this.second+=t.interval!==void 0&&t.interval>1&&n?t.interval:1,this.ms=0,this.apply(),this.recurse(e,t,0)}getDate(e){return e||this.tz===void 0?new Date(this.year,this.month,this.day,this.hour,this.minute,this.second,this.ms):typeof this.tz==`number`?new Date(Date.UTC(this.year,this.month,this.day,this.hour,this.minute-this.tz,this.second,this.ms)):R.fromTZ(R.tp(this.year,this.month+1,this.day,this.hour,this.minute,this.second,this.tz),!1)}getTime(){return this.getDate(!1).getTime()}};function oe(e){if(e===void 0&&(e={}),delete e.name,e.legacyMode=e.legacyMode===void 0?!0:e.legacyMode,e.paused=e.paused===void 0?!1:e.paused,e.maxRuns=e.maxRuns===void 0?1/0:e.maxRuns,e.catch=e.catch===void 0?!1:e.catch,e.interval=e.interval===void 0?0:parseInt(e.interval.toString(),10),e.utcOffset=e.utcOffset===void 0?void 0:parseInt(e.utcOffset.toString(),10),e.unref=e.unref===void 0?!1:e.unref,e.startAt&&=new q(e.startAt,e.timezone),e.stopAt&&=new q(e.stopAt,e.timezone),e.interval!==null){if(isNaN(e.interval))throw Error(`CronOptions: Supplied value for interval is not a number`);if(e.interval<0)throw Error(`CronOptions: Supplied value for interval can not be negative`)}if(e.utcOffset!==void 0){if(isNaN(e.utcOffset))throw Error(`CronOptions: Invalid value passed for utcOffset, should be number representing minutes offset from UTC.`);if(e.utcOffset<-870||e.utcOffset>870)throw Error(`CronOptions: utcOffset out of bounds.`);if(e.utcOffset!==void 0&&e.timezone)throw Error(`CronOptions: Combining 'utcOffset' with 'timezone' is not allowed.`)}if(e.unref!==!0&&e.unref!==!1)throw Error(`CronOptions: Unref should be either true, false or undefined(false).`);return e}function J(e){return Object.prototype.toString.call(e)===`[object Function]`||typeof e==`function`||e instanceof Function}function se(e){return J(e)}function ce(e){typeof Deno<`u`&&typeof Deno.unrefTimer<`u`?Deno.unrefTimer(e):e&&typeof e.unref<`u`&&e.unref()}var Y=30*1e3,X=[],Z=class{name;options;_states;fn;constructor(e,t,n){let r,i;if(J(t))i=t;else if(typeof t==`object`)r=t;else if(t!==void 0)throw Error(`Cron: Invalid argument passed for optionsIn. Should be one of function, or object (options).`);if(J(n))i=n;else if(typeof n==`object`)r=n;else if(n!==void 0)throw Error(`Cron: Invalid argument passed for funcIn. Should be one of function, or object (options).`);if(this.name=r?.name,this.options=oe(r),this._states={kill:!1,blocking:!1,previousRun:void 0,currentRun:void 0,once:void 0,currentTimeout:void 0,maxRuns:r?r.maxRuns:void 0,paused:r?r.paused:!1,pattern:new W(`* * * * *`)},e&&(e instanceof Date||typeof e==`string`&&e.indexOf(`:`)>0)?this._states.once=new q(e,this.options.timezone||this.options.utcOffset):this._states.pattern=new W(e,this.options.timezone),this.name){if(X.find(e=>e.name===this.name))throw Error(`Cron: Tried to initialize new named job '`+this.name+`', but name already taken.`);X.push(this)}return i!==void 0&&se(i)&&(this.fn=i,this.schedule()),this}nextRun(e){let t=this._next(e);return t?t.getDate(!1):null}nextRuns(e,t){this._states.maxRuns!==void 0&&e>this._states.maxRuns&&(e=this._states.maxRuns);let n=[],r=t||this._states.currentRun||void 0;for(;e--&&(r=this.nextRun(r));)n.push(r);return n}getPattern(){return this._states.pattern?this._states.pattern.pattern:void 0}isRunning(){let e=this.nextRun(this._states.currentRun),t=!this._states.paused,n=this.fn!==void 0,r=!this._states.kill;return t&&n&&r&&e!==null}isStopped(){return this._states.kill}isBusy(){return this._states.blocking}currentRun(){return this._states.currentRun?this._states.currentRun.getDate():null}previousRun(){return this._states.previousRun?this._states.previousRun.getDate():null}msToNext(e){let t=this._next(e);return t?e instanceof q||e instanceof Date?t.getTime()-e.getTime():t.getTime()-new q(e).getTime():null}stop(){this._states.kill=!0,this._states.currentTimeout&&clearTimeout(this._states.currentTimeout);let e=X.indexOf(this);e>=0&&X.splice(e,1)}pause(){return this._states.paused=!0,!this._states.kill}resume(){return this._states.paused=!1,!this._states.kill}schedule(e){if(e&&this.fn)throw Error(`Cron: It is not allowed to schedule two functions using the same Croner instance.`);e&&(this.fn=e);let t=this.msToNext(),n=this.nextRun(this._states.currentRun);return t==null||isNaN(t)||n===null?this:(t>Y&&(t=Y),this._states.currentTimeout=setTimeout(()=>this._checkTrigger(n),t),this._states.currentTimeout&&this.options.unref&&ce(this._states.currentTimeout),this)}async _trigger(e){if(this._states.blocking=!0,this._states.currentRun=new q(void 0,this.options.timezone||this.options.utcOffset),this.options.catch)try{this.fn!==void 0&&await this.fn(this,this.options.context)}catch(e){J(this.options.catch)&&this.options.catch(e,this)}else this.fn!==void 0&&await this.fn(this,this.options.context);this._states.previousRun=new q(e,this.options.timezone||this.options.utcOffset),this._states.blocking=!1}async trigger(){await this._trigger()}runsLeft(){return this._states.maxRuns}_checkTrigger(e){let t=new Date,n=!this._states.paused&&t.getTime()>=e.getTime(),r=this._states.blocking&&this.options.protect;n&&!r?(this._states.maxRuns!==void 0&&this._states.maxRuns--,this._trigger()):n&&r&&J(this.options.protect)&&setTimeout(()=>this.options.protect(this),0),this.schedule()}_next(e){let t=!!(e||this._states.currentRun),n=!1;!e&&this.options.startAt&&this.options.interval&&([e,t]=this._calculatePreviousRun(e,t),n=!e),e=new q(e,this.options.timezone||this.options.utcOffset),this.options.startAt&&e&&e.getTime()<this.options.startAt.getTime()&&(e=this.options.startAt);let r=this._states.once||new q(e,this.options.timezone||this.options.utcOffset);return!n&&r!==this._states.once&&(r=r.increment(this._states.pattern,this.options,t)),this._states.once&&this._states.once.getTime()<=e.getTime()||r===null||this._states.maxRuns!==void 0&&this._states.maxRuns<=0||this._states.kill||this.options.stopAt&&r.getTime()>=this.options.stopAt.getTime()?null:r}_calculatePreviousRun(e,t){let n=new q(void 0,this.options.timezone||this.options.utcOffset),r=e;if(this.options.startAt.getTime()<=n.getTime()){r=this.options.startAt;let e=r.getTime()+this.options.interval*1e3;for(;e<=n.getTime();)r=new q(r,this.options.timezone||this.options.utcOffset).increment(this._states.pattern,this.options,!0),e=r.getTime()+this.options.interval*1e3;t=!0}return r===null&&(r=void 0),[r,t]}},le=[`bypassPermissions`,`acceptEdits`,`default`,`plan`];function ue({open:e,schedule:t,onClose:n,onSaved:r}){let i=m(),[a,o]=(0,M.useState)(()=>$(t)),[s,c]=(0,M.useState)([]),[l,u]=(0,M.useState)(!1),[d,p]=(0,M.useState)(null);(0,M.useEffect)(()=>{e&&(o($(t)),p(null),f.get(`/api/projects`).then(c).catch(()=>c([])))},[e,t]);let b=(0,M.useMemo)(()=>{try{return new Z(a.cron_expr).nextRuns(3).map(e=>e.toLocaleString())}catch{return null}},[a.cron_expr]),x=(e,t)=>o(n=>({...n,[e]:t})),S=(0,I.jsxs)(`div`,{className:`space-y-3 px-1`,children:[(0,I.jsx)(Q,{label:`Name`,children:(0,I.jsx)(T,{value:a.name,onChange:e=>x(`name`,e.target.value),placeholder:`Morning PR review`,className:`h-11 md:h-9 text-xs`})}),(0,I.jsxs)(Q,{label:`Cron expression (local timezone)`,children:[(0,I.jsx)(T,{value:a.cron_expr,onChange:e=>x(`cron_expr`,e.target.value),placeholder:`0 7 * * *`,className:`h-11 md:h-9 text-xs font-mono`}),(0,I.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:b?`Next: ${b.join(` · `)}`:`—`})]}),(0,I.jsx)(Q,{label:`Project`,children:(0,I.jsxs)(A,{value:a.project_path,onValueChange:e=>x(`project_path`,e),children:[(0,I.jsx)(j,{className:`w-full min-h-11 md:min-h-9 text-xs`,children:(0,I.jsx)(E,{placeholder:`Select project`})}),(0,I.jsx)(D,{children:s.map(e=>(0,I.jsx)(k,{value:e.path,children:e.name},e.path))})]})}),(0,I.jsx)(Q,{label:`Prompt (do not embed secrets)`,children:(0,I.jsx)(`textarea`,{value:a.prompt,onChange:e=>x(`prompt`,e.target.value),placeholder:`Check open PRs and summarize. If nothing to do, finish immediately.`,rows:4,className:`w-full rounded-md border border-input bg-transparent px-3 py-2 text-xs outline-none focus-visible:ring-2 focus-visible:ring-ring/50 resize-y`})}),(0,I.jsxs)(Q,{label:`Permission mode`,children:[(0,I.jsxs)(A,{value:a.permission_mode,onValueChange:e=>x(`permission_mode`,e),children:[(0,I.jsx)(j,{className:`w-full min-h-11 md:min-h-9 text-xs`,children:(0,I.jsx)(E,{})}),(0,I.jsx)(D,{children:le.map(e=>(0,I.jsx)(k,{value:e,children:e},e))})]}),a.permission_mode===`bypassPermissions`&&(0,I.jsx)(`p`,{className:`text-[11px] text-warning`,children:`⚠ Unattended writes — agent can modify code and run commands`})]}),(0,I.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,I.jsx)(Q,{label:`Max turns (optional)`,children:(0,I.jsx)(T,{type:`number`,min:1,value:a.max_turns,onChange:e=>x(`max_turns`,e.target.value),placeholder:`∞`,className:`h-11 md:h-9 text-xs`})}),(0,I.jsx)(Q,{label:`Timeout (ms)`,children:(0,I.jsx)(T,{type:`number`,min:1e4,value:a.timeout_ms,onChange:e=>x(`timeout_ms`,e.target.value),className:`h-11 md:h-9 text-xs`})})]}),(0,I.jsxs)(`div`,{className:`flex items-center justify-between min-h-11`,children:[(0,I.jsx)(`span`,{className:`text-xs font-medium`,children:`Enabled`}),(0,I.jsx)(O,{checked:a.enabled,onCheckedChange:e=>x(`enabled`,e)})]}),d&&(0,I.jsx)(`p`,{className:`text-[11px] text-error`,children:d}),(0,I.jsx)(h,{onClick:async()=>{if(!a.name.trim()||!a.project_path||!a.prompt.trim()){p(`Name, project, and prompt are required`);return}if(!b){p(`Invalid cron expression`);return}u(!0),p(null);try{let e={name:a.name.trim(),cron_expr:a.cron_expr,project_path:a.project_path,prompt:a.prompt,permission_mode:a.permission_mode,max_turns:a.max_turns===``?null:Number(a.max_turns),timeout_ms:Number(a.timeout_ms)||18e5,enabled:a.enabled};t?await f.patch(`/api/schedules/${t.id}`,e):await f.post(`/api/schedules`,e),r(),n()}catch(e){p(e instanceof Error?e.message:String(e))}finally{u(!1)}},disabled:l,className:`w-full min-h-11 cursor-pointer`,children:l?`Saving…`:t?`Save changes`:`Create schedule`})]}),C=t?`Edit: ${t.name}`:`New schedule`;return i?(0,I.jsxs)(y,{open:e,onClose:n,className:`max-h-[85vh] flex flex-col`,children:[(0,I.jsx)(`p`,{className:`text-sm font-semibold text-center pb-2`,children:C}),(0,I.jsx)(te,{className:`flex-1 min-h-0 px-3 pb-3`,children:S})]}):(0,I.jsx)(v,{open:e,onOpenChange:e=>!e&&n(),children:(0,I.jsxs)(g,{className:`max-w-md max-h-[85vh] overflow-y-auto`,children:[(0,I.jsx)(ee,{children:(0,I.jsx)(_,{className:`text-sm`,children:C})}),S]})})}function Q({label:e,children:t}){return(0,I.jsxs)(`div`,{className:`space-y-1`,children:[(0,I.jsx)(`p`,{className:`text-xs font-medium text-muted-foreground`,children:e}),t]})}function $(e){return{name:e?.name??``,cron_expr:e?.cron_expr??`0 7 * * *`,project_path:e?.project_path??``,prompt:e?.prompt??``,permission_mode:e?.permission_mode??`bypassPermissions`,max_turns:e?.max_turns==null?``:String(e.max_turns),timeout_ms:String(e?.timeout_ms??18e5),enabled:e?!!e.enabled:!0}}function de(){let{schedules:e,loading:t,refetch:n}=P(),[r,i]=(0,M.useState)(!1),[o,c]=(0,M.useState)(null),l=()=>{c(null),i(!0)},u=e=>{c(e),i(!0)};return(0,I.jsxs)(`div`,{className:`space-y-3`,children:[(0,I.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,I.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Periodically wake Claude to work on a project unattended.`}),(0,I.jsxs)(h,{size:`sm`,onClick:l,className:`min-h-11 md:min-h-8 text-xs gap-1 cursor-pointer shrink-0`,children:[(0,I.jsx)(s,{className:`size-3.5`}),` Add`]})]}),t&&e.length===0?(0,I.jsx)(`p`,{className:`text-xs text-muted-foreground py-4 text-center`,children:`Loading…`}):e.length===0?(0,I.jsxs)(`div`,{className:`flex flex-col items-center gap-2 py-8 text-center`,children:[(0,I.jsx)(a,{className:`size-8 text-muted-foreground/50`}),(0,I.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No schedules yet. Add one to run Claude periodically.`}),(0,I.jsxs)(h,{size:`sm`,onClick:l,className:`min-h-11 text-xs gap-1 cursor-pointer`,children:[(0,I.jsx)(s,{className:`size-3.5`}),` Add schedule`]})]}):(0,I.jsx)(`div`,{className:`space-y-2`,children:e.map(e=>(0,I.jsx)(ae,{schedule:e,onEdit:()=>u(e),onChanged:n},e.id))}),(0,I.jsx)(ue,{open:r,schedule:o,onClose:()=>i(!1),onSaved:n})]})}export{de as SchedulesSettingsSection};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +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{A as r,D as i,E as a,O as o,k as s}from"./vendor-ui-BTSIXzhZ.js";import{n as c}from"./utils-Bslrbb-G.js";e(t(),1);var l=n();function u({className:e,children:t,...n}){return(0,l.jsxs)(i,{"data-slot":`scroll-area`,className:c(`relative`,e),...n,children:[(0,l.jsx)(r,{"data-slot":`scroll-area-viewport`,className:`size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 [&>div]:!block`,children:t}),(0,l.jsx)(d,{}),(0,l.jsx)(a,{})]})}function d({className:e,orientation:t=`vertical`,...n}){return(0,l.jsx)(o,{"data-slot":`scroll-area-scrollbar`,orientation:t,className:c(`flex touch-none p-px transition-colors select-none`,t===`vertical`&&`h-full w-1.5 border-l border-l-transparent`,t===`horizontal`&&`h-1.5 flex-col border-t border-t-transparent`,e),...n,children:(0,l.jsx)(s,{"data-slot":`scroll-area-thumb`,className:`relative flex-1 rounded-full bg-border`})})}export{u as t};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./panel-store-BJhazigC.js";var t=`ppm:send-to-chat`,n=`ppm:send-to-chat:ack`;function r(e){return typeof e.metadata?.lastActiveAt==`number`?e.metadata.lastActiveAt:-1}function i(t){let{panels:n,focusedPanelId:i}=e.getState(),a=Object.values(n).flatMap(e=>e.tabs.filter(e=>e.type===`chat`).map(t=>({tab:t,selected:e.activeTabId===t.id,focusedPanel:e.id===i}))),o=t?a.filter(e=>e.tab.projectId===t||e.tab.metadata?.projectName===t):a;if(o.length===0)return null;let s=e=>[e.selected?e.focusedPanel?2:1:0,r(e.tab)];return o.reduce((e,t)=>{let[n,r]=[s(e),s(t)];for(let i=0;i<n.length;i++)if(n[i]!==r[i])return n[i]>r[i]?e:t;return e}).tab.id}function a(r){let{text:a,label:o,projectName:s}=r;if(!a.trim())return;let l=r.newTab?null:i(s),u=e.getState();if(l){u.setActiveTab(l);let e=!1,i=()=>{e=!0};if(window.addEventListener(n,i),window.dispatchEvent(new CustomEvent(t,{detail:{text:a,label:o,projectName:s,targetTabId:l}})),window.removeEventListener(n,i),e)return;let c=Object.values(u.panels).flatMap(e=>e.tabs).find(e=>e.id===l);u.updateTab(l,{metadata:{...c?.metadata,...r.asContext?{pendingContexts:[...c?.metadata?.pendingContexts??[],{text:a,label:o}]}:{pendingMessage:a}}});return}if(r.newTab&&r.autoSend){c(u.openTab({type:`chat`,title:`Chat`,projectId:null,metadata:s?{projectName:s}:{},closable:!0}),a,o);return}u.openTab({type:`chat`,title:`Chat`,projectId:null,metadata:{...s?{projectName:s}:{},...r.asContext?{pendingContexts:[{text:a,label:o}]}:{pendingMessage:a},...r.imageDataUrl?{pendingAttachmentDataUrl:r.imageDataUrl,pendingAttachmentName:r.imageName}:{}},closable:!0})}var o=1e4,s=50;async function c(r,i,a){let c=Date.now()+o;do{let e=!1,o=()=>{e=!0};if(window.addEventListener(n,o),window.dispatchEvent(new CustomEvent(t,{detail:{text:i,label:a,targetTabId:r,autoSend:!0}})),window.removeEventListener(n,o),e)return;await new Promise(e=>setTimeout(e,s))}while(Date.now()<c);let l=e.getState(),u=Object.values(l.panels).flatMap(e=>e.tabs).find(e=>e.id===r);u&&l.updateTab(r,{metadata:{...u.metadata,pendingMessage:i}})}export{a as i,t as n,i as r,n as t};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +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{p as r}from"./vendor-ui-BTSIXzhZ.js";import{n as i}from"./utils-Bslrbb-G.js";e(t(),1);var a=n();function o({className:e,orientation:t=`horizontal`,decorative:n=!0,...o}){return(0,a.jsx)(r,{"data-slot":`separator`,decorative:n,orientation:t,className:i(`shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px`,e),...o})}export{o as t};
|
|
@@ -0,0 +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{xr as r}from"./icons-BwyIKaTT.js";import{a as i,k as a,r as o}from"./api-client-xQDlhUTu.js";import{n as s}from"./utils-Bslrbb-G.js";import"./portal-container-context-NBi-KGK0.js";import"./context-menu-BCuZYfWC.js";import{n as c}from"./use-is-mobile-VRV9eZy1.js";import{t as l}from"./button-C9ZXWb3b.js";import{a as u,n as d,o as f,t as p}from"./dialog-Dn_2tuYa.js";import{t as m}from"./mobile-bottom-sheet-DArbIyrD.js";import"./use-visual-viewport-MmugpRg-.js";import{n as h,o as g,r as _,t as v,u as y}from"./adaptive-context-menu-C4jNSORA.js";import{r as b}from"./format-bytes-he3TR0bV.js";import{r as x}from"./process-row-format-CytRH7g2.js";import{r as ee,t as S}from"./sortable-header-DwzTFLkG.js";var C=e(t(),1),w=[`start`,`stop`,`restart`,`enable`,`disable`],T=3e3;async function te(e,t,n){let r=i(),a={"Content-Type":`application/json`,"X-PPM-Request":`1`};r&&(a.Authorization=`Bearer ${r}`);let o=await fetch(`/api/system/services/${e}/${encodeURIComponent(t)}/${n}`,{method:`POST`,headers:a,body:`{}`}),s;try{s=await o.json()}catch{throw Error(o.ok?`Empty response from server`:`Server error (HTTP ${o.status})`)}if(s.ok===!1)throw Error(s.error??`HTTP ${o.status}`);return s.data}function E(e,t){return o.get(`/api/system/services/${e}/${encodeURIComponent(t)}`)}function ne(e){let[t,n]=(0,C.useState)(null),[r,i]=(0,C.useState)(null),a=(0,C.useRef)(!1),s=(0,C.useRef)(!0),c=(0,C.useCallback)(async()=>{if(!a.current){a.current=!0;try{let e=await o.get(`/api/system/services`);if(!s.current)return;n(e),i(null)}catch(e){s.current&&i(e instanceof Error?e.message:`Could not list services`)}finally{a.current=!1}}},[]);return(0,C.useEffect)(()=>(s.current=!0,()=>{s.current=!1}),[]),(0,C.useEffect)(()=>{if(!e)return;c();let t=setInterval(()=>void c(),T);return()=>clearInterval(t)},[e,c]),{snapshot:t,error:r,loading:t===null&&r===null,refresh:c}}var re=[`all`,`running`,`failed`,`enabled`];function D(e,t){switch(t){case`running`:return e.running;case`failed`:return e.failed;case`enabled`:return e.enabled;default:return!0}}function O(e,t){let n=t.trim().toLowerCase();return n?e.unit.toLowerCase().includes(n)||e.description.toLowerCase().includes(n):!0}function k(e,t){let n=e=>e.failed?0:e.running?1:2,r=n(e)-n(t);return r===0?e.unit.localeCompare(t.unit):r}function ie(e,t,n,r){return e.filter(e=>e.scope===t&&D(e,n)&&O(e,r)).sort(k)}function A(e,t){let n=t?e.filter(e=>e.scope===t):e;return{total:n.length,running:n.filter(e=>e.running).length,failed:n.filter(e=>e.failed).length}}function j(e){return e.failed?`failed`:e.running?`running`:e.activeState===`activating`||e.activeState===`deactivating`||e.activeState===`reloading`?`busy`:`idle`}function M(e){let t=e.subState?`${e.activeState} (${e.subState})`:e.activeState;return e.unitFileState?`${t} · ${e.unitFileState}`:t}function N(e,t){return t===`launchd`?e.enabled?null:`disabled`:e.enabled?`enabled`:null}var P=[{key:`name`,label:`Name`,width:null,from:`base`,align:`left`},{key:`pid`,label:`PID`,width:56,from:`@3xl`,align:`right`},{key:`cpu`,label:`CPU`,width:56,from:`@2xl`,align:`right`},{key:`ram`,label:`Memory`,width:72,from:`@2xl`,align:`right`},{key:`swap`,label:`Swap`,width:72,from:`@3xl`,align:`right`},{key:`disk`,label:`Drive`,width:112,from:`@4xl`,align:`right`},{key:`gpu`,label:`GPU`,width:56,from:`@4xl`,align:`right`},{key:`gpuMem`,label:`GPU Memory`,width:80,from:`@4xl`,align:`right`}],F=[`base`,`@2xl`,`@3xl`,`@4xl`],I={base:``,"@2xl":`hidden @2xl:block`,"@3xl":`hidden @3xl:block`,"@4xl":`hidden @4xl:block`};function L(e){return I[e.from]}function ae(e){let t=F.indexOf(e);return P.filter(e=>F.indexOf(e.from)<=t)}function R(e){return ae(e).map(e=>e.width===null?`minmax(0,1fr)`:`${e.width}px`).join(` `)}var z=[`grid gap-2 grid-cols-[var(--svc-cols-base)]`,`@2xl:grid-cols-[var(--svc-cols-2xl)]`,`@3xl:grid-cols-[var(--svc-cols-3xl)]`,`@4xl:grid-cols-[var(--svc-cols-4xl)]`].join(` `);function oe(){return{"--svc-cols-base":R(`base`),"--svc-cols-2xl":R(`@2xl`),"--svc-cols-3xl":R(`@3xl`),"--svc-cols-4xl":R(`@4xl`)}}var B=n(),se={failed:`bg-error`,running:`bg-success`,busy:`bg-warning animate-pulse`,idle:`bg-text-subtle/40`},V={start:`Start`,stop:`Stop`,restart:`Restart`,enable:`Enable at boot`,disable:`Disable at boot`};function H(e,t,n){let r=V[e];return n===`launchd`&&t.scope===`user`?r.replace(` at boot`,` at login`):r}var U=[`stop`,`disable`],W=Object.fromEntries(P.map(e=>[e.key,L(e)])),G=e=>e===void 0?`—`:b(e),K=(e,t)=>e===void 0?`—`:`${e.toFixed(t)}%`;function q({column:e,children:t}){return(0,B.jsx)(`span`,{className:s(`text-right text-[11px] tabular-nums text-text-subtle truncate`,W[e]),children:t})}function ce({service:e,manager:t,resources:n,onOpen:r,onAction:i}){let a=j(e),o=N(e,t),c=w.filter(t=>e.refused?.[t]===void 0),l=w.map(t=>e.refused?.[t]).find(Boolean);return(0,B.jsxs)(v,{children:[(0,B.jsx)(y,{asChild:!0,children:(0,B.jsx)(`div`,{className:`select-none`,children:(0,B.jsxs)(`button`,{type:`button`,onClick:()=>r(e),"data-testid":`sysmon-service-row`,"data-unit":e.unit,"data-tone":a,"data-cpu":n?.cpu,"data-ram-mb":n?.ramMB,className:s(`w-full min-h-11 px-3 py-2 items-center text-left hover:bg-surface-hover transition-colors`,z),children:[(0,B.jsxs)(`span`,{className:`flex items-center gap-2 min-w-0`,children:[(0,B.jsx)(`span`,{className:s(`size-2 rounded-full shrink-0`,se[a]),"aria-hidden":!0}),(0,B.jsxs)(`span`,{className:`flex-1 min-w-0`,children:[(0,B.jsxs)(`span`,{className:`flex items-center gap-1.5 min-w-0`,children:[(0,B.jsx)(`span`,{className:`text-sm truncate`,children:e.unit}),o&&(0,B.jsx)(`span`,{className:`shrink-0 text-[10px] px-1 py-px rounded bg-surface-hover text-text-subtle`,children:o})]}),(0,B.jsx)(`span`,{className:`block text-[11px] text-text-subtle truncate`,children:e.description||M(e)})]})]}),(0,B.jsx)(q,{column:`pid`,children:e.mainPid??`—`}),(0,B.jsx)(q,{column:`cpu`,children:K(n?.cpu,1)}),(0,B.jsx)(q,{column:`ram`,children:G(n?.ramMB)}),(0,B.jsx)(q,{column:`swap`,children:G(n?.swapMB)}),(0,B.jsx)(q,{column:`disk`,children:x(n?.diskReadBps,n?.diskWriteBps)}),(0,B.jsx)(q,{column:`gpu`,children:K(n?.gpuPct,0)}),(0,B.jsx)(q,{column:`gpuMem`,children:G(n?.gpuMemMB)})]})})}),(0,B.jsxs)(h,{children:[c.map(n=>(0,B.jsx)(_,{variant:U.includes(n)?`destructive`:void 0,onSelect:()=>i(e,n),children:H(n,e,t)},n)),c.length>0&&(0,B.jsx)(g,{}),(0,B.jsx)(_,{onSelect:()=>r(e),children:`Details and log`}),l&&(0,B.jsx)(`p`,{className:`px-2 py-1.5 text-[11px] text-text-subtle max-w-64`,children:l})]})]})}function le({sortKey:e,sortDir:t,onSort:n}){return(0,B.jsx)(`div`,{role:`row`,"data-testid":`sysmon-services-header`,className:s(`sticky top-0 z-10 px-3 bg-background border-b border-border text-[11px] text-text-subtle`,z),children:P.map(r=>(0,B.jsx)(S,{label:r.label,field:r.key,activeKey:e,activeDir:t,onClick:n,align:r.align,testId:`sysmon-services-sort-${r.key}`,className:s(`px-0`,L(r))},r.key))})}function ue(e,t){if(!(e===void 0&&t===void 0))return(e??0)+(t??0)}function J(e,t){let n=e.resources;switch(t){case`pid`:return e.service.mainPid??void 0;case`cpu`:return n?.cpu;case`ram`:return n?.ramMB;case`swap`:return n?.swapMB;case`disk`:return ue(n?.diskReadBps,n?.diskWriteBps);case`gpu`:return n?.gpuPct;case`gpuMem`:return n?.gpuMemMB}}function de(e,t,n){return t===null?[...e].sort((e,t)=>k(e.service,t.service)):t===`name`?[...e].sort((e,t)=>{let r=e.service.unit.localeCompare(t.service.unit);return n===`asc`?r:-r}):[...e].sort((e,r)=>{let i=J(e,t),a=J(r,t);return i===void 0&&a===void 0?e.service.unit.localeCompare(r.service.unit):i===void 0?1:a===void 0?-1:i===a?e.service.unit.localeCompare(r.service.unit):n===`asc`?i-a:a-i})}function Y(e,t){return t===void 0?e:(e??0)+t}function fe(e){let t=new Map;for(let n of e){if(!n.unitKey)continue;let e=t.get(n.unitKey)??{count:0,cpu:0,ramMB:0};e.count+=1,e.cpu+=n.cpu,e.ramMB+=n.ramMB,e.swapMB=Y(e.swapMB,n.swapMB),e.diskReadBps=Y(e.diskReadBps,n.diskReadBps),e.diskWriteBps=Y(e.diskWriteBps,n.diskWriteBps),e.gpuPct=Y(e.gpuPct,n.gpuPct),e.gpuMemMB=Y(e.gpuMemMB,n.gpuMemMB),t.set(n.unitKey,e)}for(let e of t.values())e.cpu=Math.round(e.cpu*10)/10,e.ramMB=Math.round(e.ramMB*10)/10,e.gpuPct!==void 0&&(e.gpuPct=Math.min(100,Math.round(e.gpuPct*10)/10));return t}function pe(e){return`${e.scope}:${e.unit}`}var me=Object.freeze({count:0,cpu:0,ramMB:0,swapMB:0,diskReadBps:0,diskWriteBps:0,gpuPct:0,gpuMemMB:0}),he=[`.service`,`.scope`];function ge(e,t,n=`systemd`){return t?t.get(pe(e))||((n===`launchd`?e.running:e.subState===`running`&&he.some(t=>e.unit.endsWith(t)))?void 0:me):void 0}var _e=e=>e.slice(e.lastIndexOf(`/`)+1)||e;function ve(e,t){return e===`systemd`?`Log (this boot)`:e===`scm`?`Event log (this boot)`:t?t.kind===`files`?`Log (${t.paths.map(_e).join(`, `)})`:`since`in t?t.since===`boot`?`Log (this boot)`:`Log (since the job started)`:`Log (last ${t.minutes} minutes)`:`Log`}function ye(e){return e===`scm`?`Reading the event log…`:e===`systemd`?`Reading the journal…`:`Reading the log…`}function be(e,t){return e===`scm`?`No events this boot.`:e===`systemd`||!t?`No entries this boot.`:t.kind===`files`?t.paths.length>1?`The log files are empty.`:`The log file is empty.`:`since`in t?t.since===`boot`?`No entries this boot.`:`No entries since the job started.`:`No entries in the last ${t.minutes} minutes.`}function xe(e){let t=(e??[]).slice(1).map(e=>e===``||/\s/.test(e)?JSON.stringify(e):e);return t.length>0?t.join(` `):`—`}function Se(e){let t=e?.stdoutPath??null,n=e?.stderrPath??null;return!t&&!n?`—`:t===n?t:[t&&`stdout ${t}`,n&&`stderr ${n}`].filter(Boolean).join(` · `)}function X({target:e,manager:t,onClose:n}){let r=c(),[i,a]=(0,C.useState)(null),[o,s]=(0,C.useState)(null);if((0,C.useEffect)(()=>{if(!e){a(null),s(null);return}let t=!0;return a(null),s(null),E(e.scope,e.unit).then(e=>{t&&a(e)}).catch(e=>{t&&s(e instanceof Error?e.message:`Could not read the unit`)}),()=>{t=!1}},[e]),!e)return null;let l=t===`launchd`,h=t===`scm`,g=i?.logSource,_=(0,B.jsxs)(`div`,{className:`space-y-3`,"data-testid":`sysmon-service-details`,"data-unit":e.unit,children:[(0,B.jsx)(`p`,{className:`text-xs text-text-subtle`,children:i?.description||e.description||M(e)}),(0,B.jsxs)(`dl`,{className:`grid grid-cols-2 gap-x-4 gap-y-2 text-xs`,children:[(0,B.jsx)(Z,{label:`State`,value:M(i??e)}),(0,B.jsx)(Z,{label:`Main PID`,value:(i??e).mainPid??`—`}),(0,B.jsx)(Z,{label:h?`Log on as`:`User`,value:i?.user??`—`}),h?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(Z,{label:`Startup type`,value:(i??e).unitFileState??`—`}),(0,B.jsx)(Z,{wide:!0,label:`Command`,value:i?.fragmentPath??`—`})]}):(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(Z,{label:`Group`,value:i?.group??`—`}),(0,B.jsx)(Z,{label:`Scope`,value:e.scope})]}),!l&&!h&&(0,B.jsx)(Z,{label:`Unit file`,value:i?.fragmentPath??`—`}),l&&(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(Z,{label:`Last exit`,value:i?.lastExit??`—`}),(0,B.jsx)(Z,{label:`Keep alive`,value:i?.keepAlive===void 0?`—`:i.keepAlive?`yes`:`no`}),(0,B.jsx)(Z,{wide:!0,label:`Property list`,value:i?.fragmentPath??`—`}),(0,B.jsx)(Z,{wide:!0,label:`Program`,value:i?.program??`—`}),(0,B.jsx)(Z,{wide:!0,label:`Arguments`,value:xe(i?.arguments)}),(0,B.jsx)(Z,{wide:!0,label:`Output`,value:Se(i)})]})]}),(0,B.jsxs)(`div`,{className:`space-y-1`,children:[(0,B.jsx)(`h4`,{className:`text-xs font-medium text-text-secondary`,children:ve(t,g)}),(0,B.jsxs)(`div`,{className:`rounded-md border border-border bg-surface-hover/40 max-h-64 overflow-y-auto p-2`,children:[o&&(0,B.jsx)(`p`,{className:`text-xs text-error`,children:o}),!o&&i===null&&(0,B.jsx)(`p`,{className:`text-xs text-text-subtle`,children:ye(t)}),i?.logs.length===0&&(0,B.jsx)(`p`,{className:`text-xs text-text-subtle`,children:be(t,g)}),i?.logs.map((e,t)=>(0,B.jsxs)(`p`,{className:`text-[11px] font-mono whitespace-pre-wrap break-words`,children:[e.ts!==null&&(0,B.jsxs)(`span`,{className:`text-text-subtle`,children:[new Date(e.ts).toLocaleTimeString(),` `]}),e.message]},`${e.ts}-${t}`))]})]})]});return r?(0,B.jsx)(m,{open:!0,onClose:n,children:(0,B.jsxs)(`div`,{className:`px-4 pb-4 space-y-3`,children:[(0,B.jsx)(`h2`,{className:`text-base font-semibold break-all`,children:e.unit}),_]})}):(0,B.jsx)(p,{open:!0,onOpenChange:e=>!e&&n(),children:(0,B.jsxs)(d,{className:`sm:max-w-2xl`,children:[(0,B.jsx)(u,{children:(0,B.jsx)(f,{className:`break-all`,children:e.unit})}),_]})})}function Z({label:e,value:t,wide:n=!1}){return(0,B.jsxs)(`div`,{className:s(`min-w-0`,n&&`col-span-2`),children:[(0,B.jsx)(`dt`,{className:`text-text-subtle`,children:e}),(0,B.jsx)(`dd`,{className:n?`font-mono text-[11px] break-all`:`truncate`,title:String(t),children:t})]})}var Ce=[`stop`,`restart`,`disable`];function we(e){return Ce.includes(e)}var Q={stop:{title:`Stop service`,body:e=>`Stop ${e}? Anything depending on it stops too.`,cta:`Stop`},restart:{title:`Restart service`,body:e=>`Restart ${e}? It will be briefly unavailable.`,cta:`Restart`},disable:{title:`Disable at boot`,body:e=>`${e} will no longer start at boot. It keeps running now.`,cta:`Disable`}},$={...Q,stop:{title:`Stop job`,body:e=>`Stop ${e}? launchd starts it again when something needs it, or by itself if it keeps it alive.`,cta:`Stop`},restart:{title:`Restart job`,body:e=>`Restart ${e}? It will be briefly unavailable.`,cta:`Restart`},disable:{title:`Disable at login`,body:e=>`${e} will no longer load at login. It keeps running now.`,cta:`Disable`}},Te={...Q,stop:{title:`Stop service`,body:e=>`Stop ${e}? Windows refuses if other running services depend on it.`,cta:`Stop`},disable:{title:`Disable at boot`,body:e=>`${e} will no longer start automatically (startup type Manual). It keeps running now.`,cta:`Disable`}};function Ee(e,t){return e===`scm`?Te:e===`launchd`?t.scope===`user`?$:{...$,disable:Q.disable}:Q}function De({pending:e,manager:t,onConfirm:n,onCancel:r}){let i=c();if(!e)return null;let a=t===`launchd`,o=Ee(t,e.service)[e.action];if(!o)return null;let s=(0,B.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-service-confirm`,"data-action":e.action,children:[(0,B.jsx)(`p`,{className:`text-sm break-words`,children:o.body(e.service.unit)}),(0,B.jsxs)(`p`,{className:`text-xs text-text-subtle`,children:[t===`scm`?`Windows`:e.service.scope===`system`?`System`:`User`,` `,a?`job`:`service`,e.service.mainPid!==null&&` · pid ${e.service.mainPid}`]}),(0,B.jsxs)(`div`,{className:`flex flex-col-reverse md:flex-row gap-2 md:justify-end pt-2`,children:[(0,B.jsx)(l,{variant:`outline`,onClick:r,className:`min-h-11`,children:`Cancel`}),(0,B.jsx)(l,{variant:`destructive`,autoFocus:!1,onClick:()=>n(e),"data-testid":`sysmon-service-confirm-ok`,className:`min-h-11`,children:o.cta})]})]});return i?(0,B.jsx)(m,{open:!0,onClose:r,children:(0,B.jsxs)(`div`,{className:`px-4 pb-4`,children:[(0,B.jsx)(`h2`,{className:`text-base font-semibold mb-3`,children:o.title}),s]})}):(0,B.jsx)(p,{open:!0,onOpenChange:e=>!e&&r(),children:(0,B.jsxs)(d,{children:[(0,B.jsx)(u,{children:(0,B.jsx)(f,{children:o.title})}),s]})})}var Oe=[`system`,`user`],ke={system:`System`,user:`User`},Ae={all:`All`,running:`Running`,failed:`Failed`,enabled:`Enabled`};function je({active:e,metrics:t}){let{snapshot:n,error:i,loading:o,refresh:c}=ne(e),l=n?.manager??(t?.platform===`darwin`?`launchd`:t?.platform===`win32`?`scm`:`systemd`),u=l===`launchd`?`jobs`:l===`scm`?`services`:`units`,[d,f]=(0,C.useState)(`system`),[p,m]=(0,C.useState)(`all`),[h,g]=(0,C.useState)(``),[_,v]=(0,C.useState)(null),[y,b]=(0,C.useState)(`desc`),[x,S]=(0,C.useState)(null),[w,T]=(0,C.useState)(null),E=n?.services??[],D=(0,C.useMemo)(()=>ie(E,d,p,h),[E,d,p,h]),O=(0,C.useMemo)(()=>A(E,d),[E,d]),k=(0,C.useMemo)(()=>t?.processes.length?fe(t.processes):null,[t]),j=(0,C.useMemo)(()=>de(D.map(e=>({service:e,resources:ge(e,k,l)})),_,y),[D,k,l,_,y]),M=(0,C.useCallback)(e=>{let[t,n]=ee(_,y,e);v(t),b(n)},[_,y]),N=(0,C.useCallback)(async({service:e,action:t})=>{T(null);try{let n=await te(e.scope,e.unit,t);a.success(`${e.unit}: ${t} done`,n.note?{description:n.note}:void 0),await c()}catch(n){a.error(n instanceof Error?n.message:`Could not ${t} ${e.unit}`)}},[c]),P=(0,C.useCallback)((e,t)=>{we(t)?T({service:e,action:t}):N({service:e,action:t})},[N]);return n&&!n.supported?(0,B.jsxs)(`div`,{className:`p-4 text-sm text-text-subtle`,"data-testid":`sysmon-services`,children:[`This host has no service manager PPM can read.`,n.warnings.map((e,t)=>(0,B.jsx)(`p`,{className:`mt-1 text-xs`,children:e},t))]}):(0,B.jsxs)(`div`,{className:`h-full flex flex-col min-h-0 @container`,style:oe(),"data-testid":`sysmon-services`,"data-row-count":j.length,"data-sort-key":_??`default`,"data-sort-dir":y,children:[(0,B.jsxs)(`div`,{className:`shrink-0 border-b border-border`,children:[l!==`scm`&&(0,B.jsx)(`div`,{className:`flex items-center`,role:`tablist`,children:Oe.map(e=>(0,B.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":d===e,onClick:()=>f(e),"data-testid":`sysmon-services-scope-${e}`,className:s(`flex-1 md:flex-none min-h-11 px-4 text-sm font-medium transition-colors`,d===e?`text-text-primary border-b-2 border-primary -mb-px`:`text-text-subtle hover:text-text-secondary`),children:ke[e]},e))}),(0,B.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 p-2`,children:[(0,B.jsxs)(`div`,{className:`relative flex-1 min-w-[140px]`,children:[(0,B.jsx)(r,{className:`absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-text-subtle`}),(0,B.jsx)(`input`,{type:`text`,value:h,onChange:e=>g(e.target.value),placeholder:`Search services`,"aria-label":`Search services`,"data-testid":`sysmon-service-search`,className:`w-full min-h-11 md:min-h-8 pl-7 pr-2 text-sm rounded-md border border-border bg-transparent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`})]}),re.map(e=>(0,B.jsx)(`button`,{type:`button`,onClick:()=>m(e),"aria-pressed":p===e,"data-testid":`sysmon-service-filter-${e}`,className:s(`min-h-11 md:min-h-8 px-3 text-xs rounded-md border transition-colors`,p===e?`border-primary bg-primary/10 text-primary`:`border-border hover:bg-surface-hover`),children:Ae[e]},e))]}),(0,B.jsxs)(`p`,{className:`px-3 pb-2 text-[11px] text-text-subtle`,children:[O.total,` `,u,` · `,O.running,` running`,O.failed>0&&(0,B.jsxs)(`span`,{className:`text-error`,children:[` · `,O.failed,` failed`]})]})]}),n&&n.warnings.length>0&&(0,B.jsx)(`div`,{className:`px-3 py-1.5 text-[11px] text-warning bg-warning/10 border-b border-border shrink-0`,children:n.warnings.map((e,t)=>(0,B.jsx)(`div`,{children:e},t))}),(0,B.jsxs)(`div`,{className:`flex-1 min-h-0 overflow-y-auto`,children:[(0,B.jsx)(le,{sortKey:_,sortDir:y,onSort:M}),(0,B.jsxs)(`div`,{className:`divide-y divide-border`,children:[o&&(0,B.jsxs)(`p`,{className:`p-4 text-sm text-text-subtle`,children:[`Listing `,u,`…`]}),i&&(0,B.jsx)(`p`,{className:`p-4 text-sm text-error`,children:i}),!o&&!i&&j.length===0&&(0,B.jsxs)(`p`,{className:`p-4 text-sm text-text-subtle`,children:[`No `,u,` match.`]}),j.map(({service:e,resources:t})=>(0,B.jsx)(ce,{service:e,manager:l,resources:t,onOpen:S,onAction:P},`${e.scope}:${e.unit}`))]})]}),(0,B.jsx)(X,{target:x,manager:l,onClose:()=>S(null)}),(0,B.jsx)(De,{pending:w,manager:l,onConfirm:e=>void N(e),onCancel:()=>T(null)})]})}export{je as ServicesPanel};
|
|
Binary file
|
|
Binary file
|