@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,43 @@
|
|
|
1
|
+
import { defineConfig } from "vite";
|
|
2
|
+
import react from "@vitejs/plugin-react";
|
|
3
|
+
import tailwindcss from "@tailwindcss/vite";
|
|
4
|
+
import { resolve } from "path";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The reviewer's page of a design share link (`/s/<code>`), built on its own.
|
|
8
|
+
*
|
|
9
|
+
* A separate config rather than a second input of `vite.config.ts`, because that config
|
|
10
|
+
* carries the PWA plugin: it injects service worker registration and a manifest link into
|
|
11
|
+
* the HTML it processes, and a reviewer's page must do neither. Nothing here does.
|
|
12
|
+
*
|
|
13
|
+
* It writes into the same `dist/web` the app build has just emptied (`emptyOutDir: false`),
|
|
14
|
+
* the page to `design-share-page/index.html` (served only by the `/s` route, under its own
|
|
15
|
+
* CSP) and everything else under `assets/share-*`, so the assets get the immutable cache
|
|
16
|
+
* header and the compressed siblings but never enter the app's precache. No module preload
|
|
17
|
+
* polyfill: the page's CSP is `script-src 'self'`, and the polyfill is the one thing Vite
|
|
18
|
+
* might otherwise inline.
|
|
19
|
+
*/
|
|
20
|
+
export default defineConfig({
|
|
21
|
+
plugins: [react(), tailwindcss()],
|
|
22
|
+
root: "src/web",
|
|
23
|
+
publicDir: false,
|
|
24
|
+
resolve: {
|
|
25
|
+
alias: {
|
|
26
|
+
"@": resolve(__dirname, "src/web"),
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
build: {
|
|
30
|
+
outDir: "../../dist/web",
|
|
31
|
+
emptyOutDir: false,
|
|
32
|
+
sourcemap: false,
|
|
33
|
+
modulePreload: { polyfill: false },
|
|
34
|
+
rollupOptions: {
|
|
35
|
+
input: resolve(__dirname, "src/web/design-share-page/index.html"),
|
|
36
|
+
output: {
|
|
37
|
+
entryFileNames: "assets/share-[hash].js",
|
|
38
|
+
chunkFileNames: "assets/share-[hash].js",
|
|
39
|
+
assetFileNames: "assets/share-[hash][extname]",
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-CS1GvlOm.js";import{At as r,Cn as i,Cr as a,J as o,Kr as s,Zr as c,ci as l,cr as u,ht as d,ln as f,ut as p,xn as m}from"./icons-JMA45Ifw.js";import{a as h}from"./api-client-OiA8Ida1.js";import{n as g}from"./utils-Bslrbb-G.js";import"./portal-container-context-BXAsDqrB.js";import"./chat-preparation-cache-CRX9WAK5.js";import{n as _}from"./use-is-mobile-BXHbkfs9.js";import{r as v}from"./clipboard-D3XnL7CB.js";import{r as y,t as b}from"./button-Br60hGkw.js";import{a as x,i as S,n as C,o as w,r as T,t as E}from"./dialog-DOaEX6AK.js";import{t as D}from"./mobile-bottom-sheet-CGmmdp_5.js";import"./use-visual-viewport-CQ6-A0Dt.js";import{t as O}from"./input-CKGoVpYv.js";import{Bi as k,Bn as A,Ei as j,Hn as M,Ln as N,Rn as P,Sr as F,Vi as I,Vn as ee,zi as L,zn as R}from"./index-ItT-dTPV.js";import{_ as te,a as ne,h as re,m as ie,o as ae,p as oe,r as se,v as ce,x as z,y as le}from"./api-settings-D2H6gjen.js";import{_ as ue,a as de,b as fe,c as pe,d as me,g as B,h as V,l as he,m as ge,n as _e,o as ve,p as H,r as ye,s as U,t as be,u as xe,x as W,y as G}from"./codex-reset-credit-button-CxJsBnff.js";var K=e(t(),1),q=n(),J=[`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`,`Sun`],Y=Array.from({length:24},(e,t)=>t);function Se(e,t){let n=Array.from({length:7},()=>Array.from({length:24},()=>({sum:0,count:0,avg:0})));for(let r of e){let e=t===`5h`?r.five_hour_util:r.weekly_util;if(e==null)continue;let i=new Date(r.recorded_at+(r.recorded_at.endsWith(`Z`)?``:`Z`)),a=(i.getDay()+6)%7,o=i.getHours();n[a][o].sum+=e,n[a][o].count+=1}for(let e of n)for(let t of e)t.avg=t.count>0?t.sum/t.count:0;return n}function Ce(e){return e.map(e=>{let t=e.reduce((e,t)=>e+t.sum,0),n=e.reduce((e,t)=>e+t.count,0);return n>0?t/n:0})}function we(e){return Y.map(t=>{let n=0,r=0;for(let i of e)n+=i[t].sum,r+=i[t].count;return r>0?n/r:0})}function X(e){return e===0?`bg-surface-elevated`:e<.3?`bg-success/30`:e<.5?`bg-success/60`:e<.7?`bg-warning/50`:e<.9?`bg-warning/80`:`bg-error/80`}function Te(e){return e<.3?`bg-success`:e<.7?`bg-warning`:`bg-error`}function Ee({accountId:e}){let[t,n]=(0,K.useState)(null),[r,i]=(0,K.useState)(!0),[a,o]=(0,K.useState)(`5h`);(0,K.useEffect)(()=>{i(!0),oe(e).then(n).catch(()=>n([])).finally(()=>i(!1))},[e]);let s=(0,K.useMemo)(()=>t?Se(t,a):null,[t,a]),c=(0,K.useMemo)(()=>s?Ce(s):[],[s]),l=(0,K.useMemo)(()=>s?we(s):[],[s]),u=Math.max(...c,.01);if(Math.max(...l,.01),r)return(0,q.jsx)(`div`,{className:`flex items-center justify-center py-3`,children:(0,q.jsx)(m,{className:`size-3 animate-spin text-text-subtle`})});if(!t||t.length===0)return(0,q.jsx)(`div`,{className:`text-[10px] text-text-subtle py-2 text-center`,children:`No usage history yet`});let d=t.length,f=new Set(t.map(e=>new Date(e.recorded_at+(e.recorded_at.endsWith(`Z`)?``:`Z`)).toDateString())).size;return(0,q.jsxs)(`div`,{className:`mt-2 space-y-2`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,q.jsx)(`span`,{className:`text-[10px] font-medium text-text-subtle`,children:`Usage Pattern (7d)`}),(0,q.jsxs)(`div`,{className:`flex gap-0.5 text-[9px]`,children:[(0,q.jsx)(`button`,{onClick:()=>o(`5h`),className:`px-1.5 py-0.5 rounded cursor-pointer transition-colors ${a===`5h`?`bg-primary/15 text-primary`:`text-text-subtle hover:text-text-secondary`}`,title:`5-hour rolling window limit — resets every 5 hours`,children:`5h`}),(0,q.jsx)(`button`,{onClick:()=>o(`weekly`),className:`px-1.5 py-0.5 rounded cursor-pointer transition-colors ${a===`weekly`?`bg-primary/15 text-primary`:`text-text-subtle hover:text-text-secondary`}`,title:`Weekly limit — resets every 7 days`,children:`Wk`})]})]}),(0,q.jsxs)(`p`,{className:`text-[9px] text-text-subtle leading-tight`,children:[`Avg `,a===`5h`?`5-hour`:`weekly`,` limit usage over `,f,`d (`,d,` samples). Higher % = closer to rate limit. Hover cells for details.`]}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`span`,{className:`text-[9px] text-text-subtle`,children:`Avg usage by day of week`}),(0,q.jsx)(`div`,{className:`flex flex-col gap-[2px] mt-0.5`,children:J.map((e,t)=>{let n=c[t]??0;return(0,q.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,q.jsx)(`span`,{className:`text-[8px] text-text-subtle w-5 shrink-0 text-right tabular-nums`,children:e}),(0,q.jsx)(`div`,{className:`flex-1 h-2.5 bg-surface-elevated rounded-sm overflow-hidden`,children:(0,q.jsx)(`div`,{className:`h-full rounded-sm transition-all ${Te(n)}`,style:{width:`${Math.round(n/u*100)}%`}})}),(0,q.jsxs)(`span`,{className:`text-[8px] text-text-subtle w-6 shrink-0 text-right tabular-nums`,children:[Math.round(n*100),`%`]})]},e)})})]}),(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`span`,{className:`text-[9px] text-text-subtle`,children:`Avg usage by hour (0h-23h)`}),(0,q.jsx)(`div`,{className:`flex gap-[1px] mt-0.5`,children:Y.map(e=>{let t=l[e]??0;return(0,q.jsxs)(`div`,{className:`flex-1 flex flex-col items-center gap-[1px]`,children:[(0,q.jsx)(`div`,{className:`w-full aspect-square rounded-[2px] ${X(t)}`,title:`${e}:00 — avg ${Math.round(t*100)}% usage`}),e%6==0&&(0,q.jsx)(`span`,{className:`text-[7px] text-text-subtle tabular-nums`,children:e})]},e)})})]}),s&&(0,q.jsxs)(`div`,{children:[(0,q.jsx)(`span`,{className:`text-[9px] text-text-subtle`,children:`Day x Hour heatmap`}),(0,q.jsxs)(`div`,{className:`flex flex-col gap-[1px] mt-0.5`,children:[J.map((e,t)=>(0,q.jsxs)(`div`,{className:`flex items-center gap-[1px]`,children:[(0,q.jsx)(`span`,{className:`text-[7px] text-text-subtle w-4 shrink-0 text-right`,children:e.charAt(0)}),Y.map(n=>{let r=s[t][n];return(0,q.jsx)(`div`,{className:`flex-1 aspect-square rounded-[1px] ${X(r.avg)}`,title:`${e} ${n}:00 — ${r.count>0?`avg ${Math.round(r.avg*100)}% (${r.count} samples)`:`no data`}`},n)})]},e)),(0,q.jsxs)(`div`,{className:`flex items-center gap-[1px]`,children:[(0,q.jsx)(`span`,{className:`w-4 shrink-0`}),Y.map(e=>(0,q.jsx)(`div`,{className:`flex-1 text-center`,children:e%6==0&&(0,q.jsx)(`span`,{className:`text-[7px] text-text-subtle tabular-nums`,children:e})},e))]})]})]}),(0,q.jsxs)(`div`,{className:`flex items-center gap-1.5 text-[8px] text-text-subtle`,children:[(0,q.jsx)(`span`,{children:`Low`}),(0,q.jsxs)(`div`,{className:`flex gap-[2px]`,children:[(0,q.jsx)(`div`,{className:`size-2 rounded-[1px] bg-success/30`}),(0,q.jsx)(`div`,{className:`size-2 rounded-[1px] bg-success/60`}),(0,q.jsx)(`div`,{className:`size-2 rounded-[1px] bg-warning/50`}),(0,q.jsx)(`div`,{className:`size-2 rounded-[1px] bg-warning/80`}),(0,q.jsx)(`div`,{className:`size-2 rounded-[1px] bg-error/80`})]}),(0,q.jsx)(`span`,{children:`High`}),(0,q.jsx)(`span`,{className:`ml-1`,children:`|`}),(0,q.jsx)(`div`,{className:`size-2 rounded-[1px] bg-surface-elevated border border-border/30`}),(0,q.jsx)(`span`,{children:`No data`})]})]})}function De({profile:e,accountId:t,onClose:n}){let r=[[`Name`,e.account?.display_name],[`Email`,e.account?.email],[`Org`,e.organization?.name],[`Type`,e.organization?.organization_type],[`Tier`,e.organization?.rate_limit_tier],[`Status`,e.organization?.subscription_status]];return(0,q.jsxs)(`section`,{className:`space-y-2 border-t border-border pt-3`,"data-testid":`account-profile-panel`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,q.jsx)(`h3`,{className:`text-sm font-medium`,children:`Profile`}),(0,q.jsx)(`button`,{className:`p-2 text-muted-foreground hover:text-foreground cursor-pointer`,onClick:n,"aria-label":`Close profile`,children:(0,q.jsx)(l,{className:`size-4`})})]}),(0,q.jsx)(`div`,{className:`grid grid-cols-[80px_1fr] gap-x-3 gap-y-1 text-xs`,children:r.map(([e,t])=>t?(0,q.jsxs)(`span`,{className:`contents`,children:[(0,q.jsx)(`span`,{className:`text-muted-foreground`,children:e}),(0,q.jsx)(`span`,{className:`break-all`,children:t})]},e):null)}),(0,q.jsx)(Ee,{accountId:t})]})}function Oe({display:e,onConfirm:t,onCancel:n}){let r=_(),i=(0,q.jsxs)(`div`,{className:`space-y-4`,"data-testid":`account-delete-confirm`,children:[(0,q.jsxs)(`p`,{className:`text-sm`,children:[`Remove `,(0,q.jsx)(`span`,{className:`font-medium`,children:e}),`?`]}),(0,q.jsx)(`p`,{className:`text-xs text-text-subtle`,children:`The stored token is deleted from this machine. Any export you already made keeps working.`}),(0,q.jsxs)(`div`,{className:`flex flex-col-reverse md:flex-row gap-2 md:justify-end pt-2`,children:[(0,q.jsx)(b,{variant:`outline`,onClick:n,className:`min-h-11`,children:`Cancel`}),(0,q.jsx)(b,{variant:`destructive`,autoFocus:!1,onClick:t,className:`min-h-11`,children:`Remove account`})]})]});return r?(0,q.jsx)(D,{open:!0,onClose:n,children:(0,q.jsxs)(`div`,{className:`px-4 pb-4`,children:[(0,q.jsx)(`h2`,{className:`text-base font-semibold mb-3`,children:`Remove account`}),i]})}):(0,q.jsx)(E,{open:!0,onOpenChange:e=>{e||n()},children:(0,q.jsxs)(C,{className:`sm:max-w-sm`,children:[(0,q.jsx)(x,{children:(0,q.jsx)(w,{className:`text-sm`,children:`Remove account`})}),i]})})}function ke(e){let t=new Blob([e],{type:`application/json`}),n=document.createElement(`a`);n.href=URL.createObjectURL(t),n.download=`ppm-accounts-backup.json`,n.click(),URL.revokeObjectURL(n.href)}function Ae({open:e,onOpenChange:t,accounts:n,preselectId:r,onMessage:a}){let o=n.filter(e=>e.hasRefreshToken),[s,c]=(0,K.useState)(new Set),[l,u]=(0,K.useState)(``),[f,g]=(0,K.useState)(!1),[_,y]=(0,K.useState)(!1),[D,k]=(0,K.useState)(!1),[A,j]=(0,K.useState)(!1);e&&!A&&(c(r?new Set([r]):new Set(o.map(e=>e.id))),j(!0)),!e&&A&&j(!1);function M(){t(!1),u(``),g(!1),y(!1)}async function N(e){if(s.size===0)return;k(!0);let t=l.trim()||`ppm-hienlh`;try{let n={"Content-Type":`application/json`},r=h();r&&(n.Authorization=`Bearer ${r}`);let i=await fetch(`/api/accounts/export`,{method:`POST`,headers:n,body:JSON.stringify({password:t,accountIds:[...s],includeRefreshToken:f,refreshBeforeExport:_})});if(!i.ok){let e=await i.json();throw Error(e.error??`Export failed: ${i.status}`)}let o=await i.text();e&&await v(o)?a?.(`Backup copied to clipboard!`):(ke(o),a?.(`Backup downloaded.`)),M()}catch{}k(!1)}let P=s.size>0&&!D;return(0,q.jsx)(E,{open:e,onOpenChange:e=>{e||M()},children:(0,q.jsxs)(C,{className:`sm:max-w-md`,children:[(0,q.jsxs)(x,{children:[(0,q.jsxs)(w,{className:`text-sm flex items-center gap-1.5`,children:[(0,q.jsx)(i,{className:`size-3.5`}),` Export Accounts`]}),(0,q.jsx)(T,{className:`text-xs`,children:`Select accounts and set a password to protect the backup.`})]}),(0,q.jsxs)(`div`,{className:`space-y-3`,children:[(0,q.jsxs)(`div`,{className:`space-y-1`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between mb-1`,children:[(0,q.jsx)(`p`,{className:`text-[11px] font-medium text-muted-foreground`,children:`Accounts to export`}),(0,q.jsx)(`button`,{className:`text-[10px] text-primary hover:underline cursor-pointer`,onClick:()=>c(s.size===o.length?new Set:new Set(o.map(e=>e.id))),children:s.size===o.length?`Deselect all`:`Select all`})]}),o.length===0?(0,q.jsx)(`p`,{className:`text-[10px] text-muted-foreground p-2 border rounded`,children:`No exportable accounts.`}):(0,q.jsx)(`div`,{className:`max-h-36 overflow-y-auto space-y-1 border rounded p-2`,children:o.map(e=>(0,q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,q.jsx)(`input`,{type:`checkbox`,id:`exp-${e.id}`,checked:s.has(e.id),onChange:t=>{let n=new Set(s);t.target.checked?n.add(e.id):n.delete(e.id),c(n)},className:`size-3.5 accent-primary cursor-pointer`}),(0,q.jsx)(`label`,{htmlFor:`exp-${e.id}`,className:`text-xs cursor-pointer truncate`,children:e.label??e.email??e.id.slice(0,8)})]},e.id))})]}),(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsxs)(F,{className:`text-xs`,children:[`Password `,(0,q.jsx)(`span`,{className:`text-muted-foreground font-normal`,children:`(optional)`})]}),(0,q.jsx)(O,{type:`password`,placeholder:`Leave empty for default`,value:l,onChange:e=>u(e.target.value),className:`text-xs h-8`,autoComplete:`new-password`})]}),(0,q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,q.jsx)(`input`,{type:`checkbox`,id:`exp-full`,checked:f,onChange:e=>g(e.target.checked),className:`size-3.5 accent-primary cursor-pointer`}),(0,q.jsx)(`label`,{htmlFor:`exp-full`,className:`text-[11px] cursor-pointer`,children:`Include refresh tokens (full transfer)`})]}),(0,q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,q.jsx)(`input`,{type:`checkbox`,id:`exp-refresh`,checked:_,onChange:e=>y(e.target.checked),className:`size-3.5 accent-primary cursor-pointer`}),(0,q.jsx)(`label`,{htmlFor:`exp-refresh`,className:`text-[11px] cursor-pointer`,children:`Refresh tokens before export`})]}),f?(0,q.jsxs)(`div`,{className:`rounded-md border border-error/30 bg-error/5 p-2.5`,children:[(0,q.jsx)(`p`,{className:`text-[10px] font-medium text-error`,children:`Full transfer — source accounts will expire`}),(0,q.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Refresh tokens included. Source machine expires in ~1h after target refreshes.`})]}):_?(0,q.jsx)(`div`,{className:`rounded-md border border-warning/30 bg-warning/5 p-2.5`,children:(0,q.jsx)(`p`,{className:`text-[10px] font-medium text-warning`,children:`Refresh before export — invalidates previous shares`})}):(0,q.jsx)(`div`,{className:`rounded-md border border-success/30 bg-success/5 p-2.5`,children:(0,q.jsx)(`p`,{className:`text-[10px] font-medium text-success`,children:`Share current token (safe)`})}),(0,q.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Encrypted with AES-256-GCM + scrypt.`})]}),(0,q.jsxs)(S,{className:`gap-1.5 flex-col sm:flex-row`,children:[(0,q.jsx)(b,{size:`sm`,variant:`outline`,className:`text-xs h-7 cursor-pointer`,onClick:M,children:`Cancel`}),(0,q.jsxs)(b,{size:`sm`,variant:`outline`,className:`text-xs h-7 cursor-pointer`,disabled:!P,onClick:()=>N(!0),children:[(0,q.jsx)(p,{className:`size-3 mr-1`}),` Copy`]}),(0,q.jsx)(b,{size:`sm`,className:`text-xs h-7 cursor-pointer`,disabled:!P,onClick:()=>N(!1),children:D?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(m,{className:`size-3 animate-spin mr-1`}),` Exporting...`]}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(d,{className:`size-3 mr-1`}),` Download`]})})]})]})})}function je({open:e,onOpenChange:t,onSuccess:n}){let[r,a]=(0,K.useState)(``),[o,s]=(0,K.useState)(``),[c,l]=(0,K.useState)(!1),[u,d]=(0,K.useState)(null);function f(){t(!1),a(``),s(``),d(null)}async function p(){if(r.trim()){l(!0),d(null);try{let e=await ie({data:r.trim(),password:o.trim()||`ppm-hienlh`});f(),n(`Imported ${e.imported} account(s)`)}catch(e){d(e.message||`Import failed`)}l(!1)}}return(0,q.jsx)(E,{open:e,onOpenChange:e=>{e||f()},children:(0,q.jsxs)(C,{className:`sm:max-w-md`,children:[(0,q.jsxs)(x,{children:[(0,q.jsxs)(w,{className:`text-sm flex items-center gap-1.5`,children:[(0,q.jsx)(i,{className:`size-3.5`}),` Import Accounts`]}),(0,q.jsx)(T,{className:`text-xs`,children:`Paste backup data and enter the export password. Imported accounts are temporary (~1h).`})]}),(0,q.jsxs)(`div`,{className:`space-y-3`,children:[(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsx)(F,{className:`text-xs`,children:`Backup data`}),(0,q.jsx)(`textarea`,{value:r,onChange:e=>a(e.target.value),placeholder:`Paste backup JSON here...`,rows:4,className:`w-full text-xs p-2 rounded border border-border bg-background font-mono resize-none focus:outline-none focus:ring-1 focus:ring-primary`})]}),(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsxs)(F,{className:`text-xs`,children:[`Password `,(0,q.jsx)(`span`,{className:`text-muted-foreground font-normal`,children:`(optional)`})]}),(0,q.jsx)(O,{type:`password`,placeholder:`Leave empty for default`,value:o,onChange:e=>s(e.target.value),className:`text-xs h-8`,autoComplete:`current-password`})]})]}),u&&(0,q.jsx)(`div`,{className:`text-[11px] p-2 rounded bg-error/10 text-error`,children:u}),(0,q.jsxs)(S,{children:[(0,q.jsx)(b,{size:`sm`,variant:`outline`,className:`text-xs h-7 cursor-pointer`,onClick:f,children:`Cancel`}),(0,q.jsx)(b,{size:`sm`,className:`text-xs h-7 cursor-pointer`,disabled:!r.trim()||c,onClick:p,children:c?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(m,{className:`size-3 animate-spin mr-1`}),` Importing...`]}):`Import`})]})]})})}var Z=typeof window<`u`?window.matchMedia(`(min-width: 768px)`):null;function Me(e){return Z?.addEventListener(`change`,e),()=>Z?.removeEventListener(`change`,e)}function Ne(){return Z?.matches??!0}function Q(){let[e,t]=(0,K.useState)(null),[n,r]=(0,K.useState)(!0);return(0,K.useEffect)(()=>{r(!0),ae().then(t).finally(()=>r(!1))},[]),n?(0,q.jsx)(`p`,{className:`text-xs text-text-subtle py-4 text-center`,children:`Loading...`}):e?(0,q.jsxs)(`div`,{className:`space-y-4`,children:[(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsx)(`label`,{className:`text-xs font-medium text-text-primary`,children:`Rotation Strategy`}),(0,q.jsxs)(N,{value:e.strategy,onValueChange:async e=>{t(await z({strategy:e}))},children:[(0,q.jsx)(A,{className:`w-full h-9 text-xs`,children:(0,q.jsx)(ee,{})}),(0,q.jsxs)(P,{children:[(0,q.jsx)(R,{value:`round-robin`,children:`Round-robin`}),(0,q.jsx)(R,{value:`fill-first`,children:`Fill-first`}),(0,q.jsx)(R,{value:`lowest-usage`,children:`Lowest usage`})]})]}),(0,q.jsxs)(`p`,{className:`text-[10px] text-text-subtle`,children:[e.strategy===`round-robin`&&`Cycles through accounts evenly`,e.strategy===`fill-first`&&`Uses one account until its limit, then moves on`,e.strategy===`lowest-usage`&&`Picks the account with the lowest current usage`]})]}),(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsx)(`label`,{className:`text-xs font-medium text-text-primary`,children:`Max Retry`}),(0,q.jsx)(`input`,{type:`number`,min:0,value:e.maxRetry,className:`w-full h-9 text-xs border rounded-md px-3 bg-background`,onChange:async e=>{let n=parseInt(e.target.value,10);!isNaN(n)&&n>=0&&t(await z({maxRetry:n}))}}),(0,q.jsx)(`p`,{className:`text-[10px] text-text-subtle`,children:`How many accounts to try on failure. 0 = try all available accounts.`})]}),(0,q.jsxs)(`div`,{className:`space-y-1.5 border-t border-border pt-3`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,q.jsx)(`label`,{className:`text-xs font-medium text-text-primary`,children:`Cooldown parking`}),(0,q.jsx)(M,{checked:e.cooldownEnabled,onCheckedChange:async e=>{t(await z({cooldownEnabled:e}))}})]}),(0,q.jsx)(`p`,{className:`text-[10px] text-text-subtle`,children:`Park a failing account (rate limit / usage limit / auth error) until it recovers. Off: accounts stay selectable — rotation still skips accounts already ≥95% on the 5-hour limit.`})]}),(0,q.jsxs)(`div`,{className:`flex items-center justify-between text-xs border-t border-border pt-3`,children:[(0,q.jsx)(`span`,{className:`text-text-subtle`,children:`Active accounts`}),(0,q.jsx)(`span`,{className:`font-medium text-text-primary`,children:e.activeCount})]})]}):(0,q.jsx)(`p`,{className:`text-xs text-text-subtle py-4 text-center`,children:`Failed to load settings`})}function Pe({open:e,onOpenChange:t}){let n=(0,K.useSyncExternalStore)(Me,Ne);return e?n?(0,q.jsx)(E,{open:e,onOpenChange:t,children:(0,q.jsxs)(C,{className:`sm:max-w-sm`,children:[(0,q.jsx)(x,{children:(0,q.jsxs)(w,{className:`text-sm flex items-center gap-2`,children:[(0,q.jsx)(a,{className:`size-4`}),` Rotation & Retry`]})}),(0,q.jsx)(Q,{})]})}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(`div`,{className:`fixed inset-0 z-50 transition-opacity duration-200 opacity-100`,onClick:()=>t(!1),style:{backgroundColor:`rgba(0,0,0,0.5)`}}),(0,q.jsxs)(`div`,{className:g(`fixed bottom-0 left-0 right-0 z-50 bg-background rounded-t-2xl border-t border-border shadow-2xl`,`transition-transform duration-300 ease-out max-h-[85vh] overflow-y-auto`,`translate-y-0`),children:[(0,q.jsx)(`div`,{className:`flex justify-center pt-3 pb-1`,children:(0,q.jsx)(`div`,{className:`w-10 h-1 rounded-full bg-border`})}),(0,q.jsxs)(`div`,{className:`flex items-center justify-between px-4 py-2 border-b border-border`,children:[(0,q.jsxs)(`span`,{className:`text-sm font-semibold flex items-center gap-2`,children:[(0,q.jsx)(a,{className:`size-4`}),` Rotation & Retry`]}),(0,q.jsx)(`button`,{onClick:()=>t(!1),className:`flex items-center justify-center size-7 rounded-md hover:bg-surface-elevated transition-colors`,children:(0,q.jsx)(l,{className:`size-4`})})]}),(0,q.jsx)(`div`,{className:`px-4 py-4 pb-8`,children:(0,q.jsx)(Q,{})})]})]}):null}var Fe=y(`inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2`,{variants:{variant:{default:`border-transparent bg-primary text-primary-foreground shadow`,secondary:`border-transparent bg-secondary text-secondary-foreground`,destructive:`border-transparent bg-destructive text-destructive-foreground shadow`,outline:`text-foreground`}},defaultVariants:{variant:`default`}});function Ie({className:e,variant:t,...n}){return(0,q.jsx)(`div`,{className:g(Fe({variant:t}),e),...n})}function Le(e){let t=Math.floor(Date.now()/1e3);return e>t?`${Math.floor((e-t)/60)}m`:`exp`}function Re({accounts:e}){let[t,n]=(0,K.useState)([]),[r,i]=(0,K.useState)(!1),[a,o]=(0,K.useState)(!1),[s,c]=(0,K.useState)(new Map),l=e.filter(e=>e.hasRefreshToken);async function u(){if(l.length!==0){i(!0);try{let e=await ce(l.map(e=>e.id),a);n(t=>[...t,{round:t.length+1,time:new Date().toLocaleTimeString(),includeRefresh:a,items:e}])}catch{}i(!1)}}async function d(e,t){c(t=>new Map(t).set(e,{loading:!0}));try{let n=await le(t);c(t=>new Map(t).set(e,{loading:!1,...n}))}catch(t){c(n=>new Map(n).set(e,{loading:!1,status:`error`,error:t.message}))}}function f(e,t){return[{key:`r${e.round}-pre-${t.id}`,label:`Pre-export`,token:t.preExportTokenFull,preview:t.preExportToken,expires:t.preExportExpires},{key:`r${e.round}-exp-${t.id}`,label:`Exported`,token:t.exportedTokenFull,preview:t.exportedToken,expires:t.exportedExpires},{key:`r${e.round}-post-${t.id}`,label:`Post-export`,token:t.postExportTokenFull,preview:t.postExportToken,expires:t.postExportExpires}]}function p(){for(let e of t)for(let t of e.items)for(let n of f(e,t))n.token&&d(n.key,n.token)}return(0,q.jsxs)(`section`,{className:`border-t pt-4 space-y-2`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,q.jsx)(`p`,{className:`text-xs font-medium`,children:`Simulate export`}),t.length>0&&(0,q.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[t.length,` round(s)`]})]}),(0,q.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Every run appends a round. Earlier rounds are kept so tokens can be compared across runs.`}),l.length===0?(0,q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No OAuth account with a refresh token to export.`}):(0,q.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,q.jsx)(M,{id:`sim-include-refresh`,checked:a,onCheckedChange:o,className:`cursor-pointer`}),(0,q.jsx)(F,{htmlFor:`sim-include-refresh`,className:`text-[11px] cursor-pointer`,children:`Include refresh tokens`})]}),(0,q.jsx)(b,{size:`sm`,className:`h-7 text-xs cursor-pointer`,disabled:r,onClick:()=>void u(),children:r?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(m,{className:`size-3 animate-spin mr-1`}),` Exporting...`]}):`Run export #${t.length+1}`})]}),t.length>0&&(0,q.jsxs)(`div`,{className:`space-y-3`,children:[(0,q.jsxs)(b,{size:`sm`,variant:`outline`,className:`w-full h-7 text-[11px] cursor-pointer`,onClick:p,children:[`Test all tokens (`,t.reduce((e,t)=>e+t.items.length*3,0),`)`]}),t.map(e=>(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,q.jsxs)(`p`,{className:`text-xs font-medium text-primary`,children:[`Round #`,e.round]}),(0,q.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:e.time}),(0,q.jsx)(Ie,{variant:e.includeRefresh?`destructive`:`secondary`,className:`text-[9px] px-1 py-0`,children:e.includeRefresh?`with refresh`:`access only`})]}),e.items.map(t=>(0,q.jsxs)(`div`,{className:`p-2 rounded-lg border bg-card space-y-1.5`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,q.jsx)(`span`,{className:`text-[11px] font-medium`,children:t.label??t.email??t.id.slice(0,8)}),t.tokenChanged&&(0,q.jsx)(Ie,{variant:`secondary`,className:`text-[9px] px-1 py-0`,children:`DB token changed`})]}),f(e,t).map(e=>{let t=s.get(e.key);return(0,q.jsxs)(`div`,{className:`flex items-center gap-1.5 text-[11px]`,children:[(0,q.jsx)(`span`,{className:`w-20 shrink-0 text-muted-foreground text-[10px]`,children:e.label}),(0,q.jsx)(`code`,{className:`flex-1 truncate font-mono text-[10px] bg-muted px-1 rounded`,children:e.preview??`N/A`}),e.expires&&(0,q.jsx)(`span`,{className:`text-[10px] text-muted-foreground shrink-0`,children:Le(e.expires)}),e.token?(0,q.jsx)(b,{size:`sm`,variant:`outline`,className:`h-6 text-[10px] px-1.5 cursor-pointer shrink-0`,disabled:t?.loading,onClick:()=>void d(e.key,e.token),children:t?.loading?(0,q.jsx)(m,{className:`size-3 animate-spin`}):`Test`}):(0,q.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`-`}),t&&!t.loading&&(0,q.jsx)(`span`,{className:`text-[10px] font-medium shrink-0 ${t.status?.startsWith(`valid`)?`text-success`:`text-error`}`,children:t.status})]},e.key)})]},`r${e.round}-${t.id}`))]},e.round))]})]})}function ze(e){let t=Math.floor(Date.now()/1e3),n=Math.floor(Math.abs(e-t)/60);return e>t?`${n}m left`:`expired ${n}m ago`}function Be({open:e,onOpenChange:t,accounts:n}){let[i,a]=(0,K.useState)(new Map),[o,s]=(0,K.useState)(!1);async function c(e){a(t=>new Map(t).set(e,{loading:!0}));try{let t=await te(e,o);a(n=>new Map(n).set(e,{loading:!1,result:t}))}catch(t){a(n=>new Map(n).set(e,{loading:!1,error:t.message}))}}function l(){for(let e of n.filter(e=>e.expiresAt!==null))c(e.id)}return(0,q.jsx)(E,{open:e,onOpenChange:t,children:(0,q.jsxs)(C,{className:`sm:max-w-xl max-h-[85vh] flex flex-col`,children:[(0,q.jsxs)(x,{children:[(0,q.jsxs)(w,{className:`text-sm flex items-center gap-1.5`,children:[(0,q.jsx)(r,{className:`size-4`}),` Token Test`]}),(0,q.jsx)(T,{className:`text-xs`,children:`Probe stored tokens for validity. Nothing is modified.`})]}),(0,q.jsxs)(`div`,{className:`space-y-4 overflow-y-auto flex-1 pr-1`,children:[(0,q.jsxs)(`section`,{className:`space-y-2`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,q.jsx)(`p`,{className:`text-xs font-medium`,children:`Current tokens`}),(0,q.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,q.jsx)(M,{id:`token-test-refresh`,checked:o,onCheckedChange:s,className:`cursor-pointer`}),(0,q.jsx)(F,{htmlFor:`token-test-refresh`,className:`text-[11px] cursor-pointer`,children:`Also test refresh`})]}),(0,q.jsx)(b,{size:`sm`,variant:`outline`,className:`h-7 text-xs cursor-pointer`,onClick:l,children:`Test all`})]})]}),n.length===0&&(0,q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No accounts to test.`}),(0,q.jsx)(`div`,{className:`space-y-1.5`,children:n.map(e=>{let t=i.get(e.id),n=t?.result?.accessToken.status;return(0,q.jsxs)(`div`,{className:`p-2 rounded border bg-card space-y-1`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,q.jsx)(`span`,{className:`text-xs font-medium truncate block`,children:e.label??e.email??e.id.slice(0,8)}),e.expiresAt&&(0,q.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:ze(e.expiresAt)})]}),(0,q.jsx)(b,{size:`sm`,variant:`outline`,className:`h-7 text-xs cursor-pointer shrink-0`,disabled:t?.loading,onClick:()=>void c(e.id),children:t?.loading?(0,q.jsx)(m,{className:`size-3 animate-spin`}):`Test`})]}),t&&!t.loading&&(0,q.jsxs)(`div`,{className:`text-[11px] pl-2 border-l-2 border-muted`,children:[t.error&&(0,q.jsx)(`p`,{className:`text-error`,children:t.error}),n&&(0,q.jsxs)(`span`,{className:n.startsWith(`valid`)?`text-success`:`text-error`,children:[n,t.result?.accessToken.code?` (${t.result.accessToken.code})`:``]})]})]},e.id)})})]}),(0,q.jsx)(Re,{accounts:n})]}),(0,q.jsx)(S,{children:(0,q.jsx)(b,{size:`sm`,variant:`outline`,className:`text-xs cursor-pointer`,onClick:()=>t(!1),children:`Close`})})]})})}function Ve(){let{usages:e,accounts:t,activeAccountId:n,initialLoading:i,refreshing:o,flashIds:s,reload:l}=he(),[p,h]=(0,K.useState)(null),[g,_]=(0,K.useState)(null),[v,y]=(0,K.useState)(null),[x,S]=(0,K.useState)(null),[C,w]=(0,K.useState)(null),[T,E]=(0,K.useState)(null),[D,O]=(0,K.useState)(void 0);function k(e){l(),e&&h(e)}async function A(e,t){_(e);try{await re(e,{status:t===`disabled`?`active`:`disabled`})}catch(e){h(e.message)}_(null),l()}async function j(){if(v){try{await se(v.id),h(`Account "${v.display}" removed.`),l()}catch(e){h(`Failed to remove: ${e.message}`)}y(null)}}let M=new Map(t.map(e=>[e.id,e])),N=e[0]?.usage.lastFetchedAt;return(0,q.jsxs)(`div`,{className:`space-y-4`,children:[(0,q.jsx)(V,{description:`Connect multiple Claude accounts. PPM rotates between them automatically to avoid rate limits.`,onRefresh:()=>void l(),refreshing:o,disabled:i,actions:(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(b,{size:`sm`,className:`cursor-pointer gap-1.5`,onClick:()=>{O(void 0),E(`add`)},children:[(0,q.jsx)(u,{className:`size-4`}),` Add account`]}),(0,q.jsxs)(b,{size:`sm`,variant:`outline`,className:`cursor-pointer gap-1.5`,onClick:()=>{w(null),E(`export`)},children:[(0,q.jsx)(d,{className:`size-4`}),` Export`]}),(0,q.jsxs)(b,{size:`sm`,variant:`outline`,className:`cursor-pointer gap-1.5`,onClick:()=>E(`import`),children:[(0,q.jsx)(c,{className:`size-4`}),` Import`]}),(0,q.jsxs)(b,{size:`sm`,variant:`outline`,className:`cursor-pointer gap-1.5`,onClick:()=>E(`rotation`),children:[(0,q.jsx)(a,{className:`size-4`}),` Rotation`]}),(0,q.jsxs)(b,{size:`sm`,variant:`outline`,className:`cursor-pointer gap-1.5`,onClick:()=>E(`token-test`),children:[(0,q.jsx)(r,{className:`size-4`}),` Token test`]})]})}),(0,q.jsx)(B,{message:p,onDismiss:()=>h(null)}),(0,q.jsxs)(`section`,{className:`space-y-2`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,q.jsx)(`h3`,{className:`text-sm font-medium`,children:`Accounts`}),N&&(0,q.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[`usage `,fe(new Date(N).getTime())]})]}),i?(0,q.jsxs)(`div`,{className:`flex items-center gap-2 py-6 text-xs text-muted-foreground`,children:[(0,q.jsx)(m,{className:`size-4 animate-spin`}),` Loading accounts...`]}):e.length===0?(0,q.jsxs)(`div`,{className:`flex flex-col items-center gap-2 py-8 text-center`,children:[(0,q.jsx)(f,{className:`size-5 text-muted-foreground`}),(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No accounts connected yet.`}),(0,q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Add one to start using PPM.`})]}):(0,q.jsx)(H,{children:e.map(e=>(0,q.jsx)(xe,{layout:`strip`,entry:e,isActive:e.accountId===n,accountInfo:M.get(e.accountId),onToggle:A,toggling:g===e.accountId,onDelete:(e,t)=>y({id:e,display:t}),onExport:e=>{w(e),E(`export`)},onViewProfile:(e,t)=>S({profile:e,accountId:t}),onReauth:()=>{O(e.accountLabel??e.accountId.slice(0,8)),E(`add`)},flash:s.has(e.accountId)},e.accountId))})]}),x&&(0,q.jsx)(De,{profile:x.profile,accountId:x.accountId,onClose:()=>S(null)}),v&&(0,q.jsx)(Oe,{display:v.display,onConfirm:()=>void j(),onCancel:()=>y(null)}),(0,q.jsx)(pe,{open:T===`add`,onOpenChange:e=>{E(e?`add`:null),e||O(void 0)},onSuccess:k,signInAgainFor:D}),(0,q.jsx)(Ae,{open:T===`export`,onOpenChange:e=>{E(e?`export`:null),e||w(null)},accounts:t,preselectId:C,onMessage:h}),(0,q.jsx)(je,{open:T===`import`,onOpenChange:e=>E(e?`import`:null),onSuccess:k}),(0,q.jsx)(Pe,{open:T===`rotation`,onOpenChange:e=>E(e?`rotation`:null)}),(0,q.jsx)(Be,{open:T===`token-test`,onOpenChange:e=>E(e?`token-test`:null),accounts:t})]})}function He({mode:e,onOpenChange:t,password:n,onPasswordChange:r,busy:a,onExport:o,onImport:s,error:l}){let u=(0,K.useRef)(null),f=e===`export`;return(0,q.jsx)(E,{open:e!==null,onOpenChange:t,children:(0,q.jsxs)(C,{className:`sm:max-w-md`,children:[(0,q.jsxs)(x,{children:[(0,q.jsxs)(w,{className:`text-sm flex items-center gap-1.5`,children:[(0,q.jsx)(i,{className:`size-4`}),` `,f?`Export Codex Accounts`:`Import Codex Accounts`]}),(0,q.jsx)(T,{className:`text-xs leading-relaxed`,children:f?`Writes a password-encrypted file containing each account's login.`:`Reads a backup file. The password must be the one it was exported with.`})]}),(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsx)(F,{htmlFor:`codex-backup-password`,className:`text-xs`,children:`Password`}),(0,q.jsx)(O,{id:`codex-backup-password`,type:`password`,placeholder:f?`Choose a password`:`Password used for the export`,value:n,onChange:e=>r(e.target.value),className:`text-xs`,autoComplete:f?`new-password`:`current-password`}),(0,q.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`A backup holds full logins — keep the file and its password together.`})]}),l&&(0,q.jsx)(`div`,{className:`text-[11px] p-2 rounded bg-error/10 text-error`,children:l}),(0,q.jsx)(`input`,{ref:u,type:`file`,accept:`application/json,.json`,className:`hidden`,onChange:e=>{let t=e.target.files?.[0];e.target.value=``,t&&s(t)}}),(0,q.jsxs)(S,{children:[(0,q.jsx)(b,{size:`sm`,variant:`outline`,className:`text-xs cursor-pointer`,onClick:()=>t(!1),children:`Cancel`}),(0,q.jsxs)(b,{size:`sm`,className:`text-xs cursor-pointer gap-1.5`,disabled:!n.trim()||a,onClick:()=>f?o():u.current?.click(),children:[a?(0,q.jsx)(m,{className:`size-3.5 animate-spin`}):f?(0,q.jsx)(d,{className:`size-3.5`}):(0,q.jsx)(c,{className:`size-3.5`}),f?`Download backup`:`Choose file`]})]})]})})}var Ue=[{value:`round-robin`,label:`Round-robin`,hint:`Take the next account each time.`},{value:`fill-first`,label:`Fill-first`,hint:`Stay on one account until it runs out.`},{value:`lowest-usage`,label:`Lowest usage`,hint:`Pick whichever has the most left.`}];function We({open:e,onOpenChange:t,strategy:n,onChange:r}){return(0,q.jsx)(E,{open:e,onOpenChange:t,children:(0,q.jsxs)(C,{className:`sm:max-w-md`,children:[(0,q.jsxs)(x,{children:[(0,q.jsx)(w,{className:`text-sm`,children:`Codex Rotation`}),(0,q.jsx)(T,{className:`text-xs leading-relaxed`,children:`How a new chat chooses among your Codex accounts.`})]}),(0,q.jsx)(`div`,{className:`space-y-2`,children:Ue.map(e=>(0,q.jsxs)(`button`,{type:`button`,onClick:()=>r(e.value),"aria-current":n===e.value?`true`:void 0,className:g(`w-full text-left rounded-md border px-3 py-2.5 min-h-11 cursor-pointer transition-colors`,n===e.value?`border-primary bg-primary/10`:`border-border hover:bg-accent/50 active:bg-accent`),children:[(0,q.jsx)(`p`,{className:`text-sm font-medium`,children:e.label}),(0,q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.hint})]},e.value))}),(0,q.jsx)(S,{children:(0,q.jsx)(b,{size:`sm`,variant:`outline`,className:`text-xs cursor-pointer`,onClick:()=>t(!1),children:`Done`})})]})})}function $(e){return e==null?null:Math.round(e*100)}function Ge({usage:e}){let t=e.session==null&&e.weekly==null;return(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(t||e.session!=null)&&(0,q.jsx)(G,{label:`5-Hour Session`,pct:$(e.fiveHour),reset:W(e.session),resetsAt:e.session?.resetsAt}),(t||e.weekly!=null)&&(0,q.jsx)(G,{label:`Weekly`,pct:$(e.sevenDay),reset:W(e.weekly),resetsAt:e.weekly?.resetsAt})]})}function Ke(){let[e,t]=(0,K.useState)(null),n=de(()=>t(null)),[r,i]=(0,K.useState)(null);return(0,q.jsxs)(`div`,{className:`space-y-4`,children:[(0,q.jsx)(V,{description:(0,q.jsxs)(q.Fragment,{children:[`Each Codex account keeps its own login (`,(0,q.jsx)(`code`,{children:`CODEX_HOME`}),`). One is picked per chat by the rotation setting.`]}),onRefresh:()=>void n.load(),refreshing:n.loading,actions:(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(b,{size:`sm`,className:`cursor-pointer gap-1.5`,onClick:()=>t(`add`),children:[(0,q.jsx)(u,{className:`size-4`}),` Add account`]}),(0,q.jsxs)(b,{size:`sm`,variant:`outline`,className:`cursor-pointer gap-1.5`,onClick:()=>t(`export`),children:[(0,q.jsx)(d,{className:`size-4`}),` Export`]}),(0,q.jsxs)(b,{size:`sm`,variant:`outline`,className:`cursor-pointer gap-1.5`,onClick:()=>t(`import`),children:[(0,q.jsx)(c,{className:`size-4`}),` Import`]}),(0,q.jsxs)(b,{size:`sm`,variant:`outline`,className:`cursor-pointer gap-1.5`,onClick:()=>t(`rotation`),children:[(0,q.jsx)(a,{className:`size-4`}),` Rotation`]})]})}),(0,q.jsx)(B,{message:n.msg??n.err,onDismiss:()=>{n.setMsg(null),n.setErr(null)}}),(0,q.jsxs)(`section`,{className:`space-y-2`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,q.jsx)(`h3`,{className:`text-sm font-medium`,children:`Codex Accounts`}),(0,q.jsx)(`span`,{className:`text-[10px] text-muted-foreground capitalize`,children:n.strategy.replace(`-`,` `)})]}),n.loading&&n.accounts.length===0?(0,q.jsxs)(`div`,{className:`flex items-center gap-2 py-6 text-xs text-muted-foreground`,children:[(0,q.jsx)(m,{className:`size-4 animate-spin`}),` Loading accounts...`]}):n.accounts.length===0?(0,q.jsxs)(`div`,{className:`flex flex-col items-center gap-2 py-8 text-center`,children:[(0,q.jsx)(f,{className:`size-5 text-muted-foreground`}),(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No Codex accounts yet.`}),(0,q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Chats use your default `,(0,q.jsx)(`code`,{children:`~/.codex`}),` login until you add one.`]})]}):(0,q.jsx)(H,{children:n.accounts.map(e=>{let t=n.usages[e.id]??{};return(0,q.jsxs)(ge,{dense:!0,className:`min-w-[300px] shrink-0 snap-start${e.signedOut?` opacity-60`:``}`,"data-testid":`account-card`,"data-account-id":e.id,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,q.jsx)(`span`,{className:`text-sm font-medium truncate flex-1 min-w-0`,children:e.label}),e.signedOut&&(0,q.jsx)(ue,{className:`text-[10px] text-error shrink-0 font-medium`,hint:`Codex rejected this account's login (revoked or expired), so no turn can run on it and it is skipped. The usage shown is the last reading. Click to sign in again — the account keeps its settings and chats.`,onClick:e.type===`chatgpt`?()=>i(e):void 0,children:`Sign in again`}),(0,q.jsx)(`span`,{className:`text-[10px] uppercase tracking-wide text-text-subtle border border-border rounded px-1 shrink-0`,children:e.type}),U(e.planType)&&(0,q.jsx)(`span`,{className:`text-[10px] text-text-subtle shrink-0`,children:U(e.planType)}),(0,q.jsx)(M,{checked:e.status!==`disabled`,onCheckedChange:()=>void n.toggle(e.id,e.status??`active`),disabled:n.toggling.has(e.id),"aria-label":e.status===`disabled`?`Enable account`:`Disable account`,className:`cursor-pointer shrink-0`}),(0,q.jsxs)(L,{children:[(0,q.jsx)(I,{asChild:!0,children:(0,q.jsx)(`button`,{type:`button`,onClick:()=>void n.remove(e.id),"aria-label":`Remove account`,className:`p-2 rounded cursor-pointer text-text-subtle hover:text-error hover:bg-surface-elevated transition-colors shrink-0`,children:(0,q.jsx)(s,{className:`size-4`})})}),(0,q.jsx)(k,{side:`top`,children:`Remove account`})]})]}),(0,q.jsx)(Ge,{usage:t}),t.resetCredits&&(0,q.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap text-[10px] text-text-subtle`,children:[(0,q.jsx)(me,{credits:t.resetCredits}),(0,q.jsx)(be,{account:e,usage:t,onDone:e=>{n.setMsg(e),n.load()}})]}),t.session==null&&(()=>{let r=ve(t.weekly);return r?(0,q.jsxs)(`div`,{className:`flex min-h-12 items-center justify-between gap-3 rounded-md border px-2.5 py-1.5 ${e.dailyGuardEnabled&&r.blocked?`border-error/40 bg-error/5`:`border-border/50 bg-surface/40`}`,children:[(0,q.jsxs)(`div`,{className:`min-w-0 space-y-0.5`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-medium ${e.dailyGuardEnabled&&r.blocked?`text-error`:`text-text-secondary`}`,children:[(0,q.jsx)(`span`,{children:`Daily guard`}),(0,q.jsxs)(L,{children:[(0,q.jsx)(I,{asChild:!0,children:(0,q.jsx)(`button`,{type:`button`,"aria-label":`About Daily guard`,className:`text-text-subtle hover:text-text-primary cursor-help`,children:(0,q.jsx)(o,{className:`size-3.5`})})}),(0,q.jsx)(k,{side:`top`,className:`max-w-64 text-xs leading-relaxed`,children:`Spreads the weekly quota across five weekdays, adding 20% per weekday. Weekend slots keep the previous cap; unused allowance carries forward. Daily slots start at the reset time and use UTC weekdays. Turn it off any time to use the remaining quota freely.`})]})]}),(0,q.jsx)(`p`,{className:`text-[10px] tabular-nums ${e.dailyGuardEnabled&&r.blocked?`text-error`:`text-text-subtle`}`,children:e.dailyGuardEnabled&&r.blocked?`${Math.round(r.used*100)}% used / ${Math.round(r.cap*100)}% daily cap. New turns paused.`:`Weekday ${r.day}/5, ${Math.round(r.cap*100)}% daily cap`})]}),(0,q.jsxs)(`span`,{className:`hidden`,title:`Weekday ${r.day}/5: hold weekly usage at or below ${Math.round(r.cap*100)}% to last until reset.`,children:[`Daily guard `,e.dailyGuardEnabled?`· Weekday ${r.day}/5 cap ${Math.round(r.cap*100)}%`:``]}),(0,q.jsx)(M,{checked:!!e.dailyGuardEnabled,onCheckedChange:()=>void n.toggleDailyGuard(e.id,!!e.dailyGuardEnabled),disabled:n.toggling.has(e.id),"aria-label":e.dailyGuardEnabled?`Disable Daily guard`:`Enable Daily guard`,className:`cursor-pointer shrink-0`})]}):null})()]},e.id)})})]}),(0,q.jsx)(ye,{open:e===`add`,onOpenChange:e=>{e||n.cancelLogin(),t(e?`add`:null)},label:n.label,onLabelChange:n.setLabel,apiKey:n.apiKey,onApiKeyChange:n.setApiKey,adding:n.adding,onAddApiKey:()=>void n.addApiKey(),deviceWaiting:n.deviceWaiting,onStartDevice:()=>void n.startDevice(),device:n.device,browser:n.browser,onStartBrowser:()=>void n.startBrowser(),loginStarting:n.loginStarting,callbackUrl:n.callbackUrl,onCallbackUrlChange:n.setCallbackUrl,submittingCallback:n.submittingCallback,onSubmitCallback:()=>void n.submitCallback(),error:n.err}),(0,q.jsx)(He,{mode:e===`export`?`export`:e===`import`?`import`:null,onOpenChange:e=>{e||t(null)},password:n.backupPassword,onPasswordChange:n.setBackupPassword,busy:n.exporting||n.importing,onExport:()=>void n.doExport(),onImport:e=>void n.doImport(e),error:n.err}),r&&(0,q.jsx)(_e,{account:r,onClose:()=>i(null),onDone:()=>void n.load()}),(0,q.jsx)(We,{open:e===`rotation`,onOpenChange:e=>t(e?`rotation`:null),strategy:n.strategy,onChange:e=>void n.changeStrategy(e)})]})}var qe=[{id:`claude`,label:`Claude`},{id:`codex`,label:`Codex`}];function Je(){let[e,t]=(0,K.useState)(null),[n,r]=(0,K.useState)(`claude`);(0,K.useEffect)(()=>{let e=!1;return ne().then(n=>{e||t(new Set(Object.keys(n.providers??{})))}).catch(()=>{e||t(new Set([`claude`]))}),()=>{e=!0}},[]);let i=qe.filter(t=>t.id===`claude`||e?.has(t.id)),a=i.length>1;return(0,q.jsxs)(`div`,{className:`space-y-4`,"data-testid":`accounts-pane`,"data-provider":n,children:[a&&(0,q.jsx)(`div`,{className:`flex gap-1 border-b border-border/50`,children:i.map(e=>(0,q.jsxs)(`button`,{onClick:()=>r(e.id),"data-testid":`accounts-tab-${e.id}`,"aria-current":n===e.id?`page`:void 0,className:`flex items-center gap-1.5 px-3 py-2 text-xs rounded-t transition-colors cursor-pointer ${n===e.id?`text-primary border-b-2 border-primary font-medium`:`text-text-subtle hover:text-text-secondary`}`,children:[(0,q.jsx)(j,{providerId:e.id}),e.label]},e.id))}),e===null&&!a&&(0,q.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,q.jsx)(m,{className:`size-3 animate-spin`}),` Checking configured providers...`]}),n===`claude`?(0,q.jsx)(Ve,{}):(0,q.jsx)(Ke,{})]})}export{Je as AccountsSettingsSection};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import{Y as r}from"./icons-JMA45Ifw.js";import{n as i}from"./utils-Bslrbb-G.js";import{a,c as o,i as s,l as c,n as l,o as u,r as d,s as f,t as p,u as m}from"./context-menu-BoQ6lxte.js";import{n as h}from"./use-is-mobile-BXHbkfs9.js";import{a as g,i as _,n as v,o as y,r as b,t as x}from"./mobile-bottom-sheet-CGmmdp_5.js";var S=e(t(),1),C=n(),w=400,T=S.createContext(!1),E=S.createContext({});function D({children:e,...t}){let n=h(),[r,i]=(0,S.useState)(!1);return n?(0,C.jsx)(T.Provider,{value:!0,children:(0,C.jsx)(v.Provider,{value:{open:r,setOpen:i},children:e})}):(0,C.jsx)(p,{...t,children:e})}function O({children:e,asChild:t,...n}){let r=S.useContext(T),{setOpen:i}=S.useContext(v),a=(0,S.useRef)(void 0),o=(0,S.useRef)(!1);if(!r)return(0,C.jsx)(m,{asChild:t,...n,children:e});let s=(0,S.useCallback)(e=>{e.stopPropagation(),o.current=!1,a.current=setTimeout(()=>{i(!0),o.current=!0},w)},[i]),c=(0,S.useCallback)(()=>{clearTimeout(a.current)},[]),l=(0,S.useCallback)(e=>{clearTimeout(a.current),o.current&&e.cancelable&&e.preventDefault()},[]);return(0,S.useEffect)(()=>()=>clearTimeout(a.current),[]),(0,C.jsx)(`div`,{onTouchStart:s,onTouchMove:c,onTouchEnd:l,onTouchCancel:l,onClickCapture:(0,S.useCallback)(e=>{o.current&&=(e.preventDefault(),e.stopPropagation(),!1)},[]),onContextMenu:(0,S.useCallback)(e=>{e.preventDefault(),e.stopPropagation()},[]),className:`contents`,children:e})}function k(e){let t=document.activeElement;t&&t!==document.body&&e.preventDefault()}function A({children:e,className:t,onCloseAutoFocus:n,...r}){if(!S.useContext(T))return(0,C.jsx)(l,{className:t,onCloseAutoFocus:e=>{n?.(e),k(e)},...r,children:e});let{open:a,setOpen:o}=S.useContext(v);return(0,C.jsx)(x,{open:a,onClose:()=>o(!1),className:i(`p-2`,t),children:(0,C.jsx)(`div`,{className:`max-h-[60vh] overflow-y-auto overflow-x-hidden`,children:e})})}function j({children:e,className:t,variant:n,onClick:r,disabled:i,...a}){return S.useContext(T)?(0,C.jsx)(b,{className:t,variant:n,disabled:i,onClick:r,children:e}):(0,C.jsx)(d,{className:t,variant:n,disabled:i,onClick:r,...a,children:e})}function M({className:e,...t}){return S.useContext(T)?(0,C.jsx)(_,{className:e}):(0,C.jsx)(u,{className:e,...t})}function N({value:e,onValueChange:t,children:n,...r}){return S.useContext(T)?(0,C.jsx)(E.Provider,{value:{value:e,onValueChange:t},children:n}):(0,C.jsx)(s,{value:e,onValueChange:t,...r,children:n})}function P({value:e,children:t,className:n,...i}){let o=S.useContext(T),{value:s,onValueChange:c}=S.useContext(E);return o?(0,C.jsxs)(b,{className:n,onClick:()=>c?.(e),children:[(0,C.jsx)(`span`,{className:`flex size-4 shrink-0 items-center justify-center`,children:s===e&&(0,C.jsx)(r,{className:`size-2 fill-current`})}),t]}):(0,C.jsx)(a,{value:e,className:n,...i,children:t})}function F({children:e,...t}){return S.useContext(T)?(0,C.jsx)(C.Fragment,{children:e}):(0,C.jsx)(f,{...t,children:e})}function I({children:e,className:t,...n}){return S.useContext(T)?(0,C.jsx)(y,{className:t,children:e}):(0,C.jsx)(c,{className:t,...n,children:e})}function L({children:e,className:t,...n}){return S.useContext(T)?(0,C.jsx)(g,{className:t,children:e}):(0,C.jsx)(o,{className:t,...n,children:e})}export{P as a,L as c,N as i,I as l,A as n,M as o,j as r,F as s,D as t,O as u};
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/agent-session-window-content-CB_uvabH.js","assets/rolldown-runtime-C5c2KzVm.js","assets/index-ItT-dTPV.js","assets/preload-helper-CM8YhcCa.js","assets/vendor-ui-CS1GvlOm.js","assets/vendor-markdown-QKPNiWEd.js","assets/button-Br60hGkw.js","assets/utils-Bslrbb-G.js","assets/createLucideIcon-DBXq3G0e.js","assets/file-diff-lX1a7RLF.js","assets/git-commit-horizontal-BVihXafd.js","assets/api-client-OiA8Ida1.js","assets/react-PkBxFcos.js","assets/open-db-tabs-CkQe49j_.js","assets/panel-store-DmP16Fo0.js","assets/session-list-sync-triggers-DitiR5h1.js","assets/project-store-CEGoLMOl.js","assets/project-framework-store-Bi5dyHdx.js","assets/window-store-zJczRsv4.js","assets/explorer-model-BmgFEsj1.js","assets/db-types-9ac-eYxf.js","assets/settings-store-WeJyQVL8.js","assets/use-is-mobile-BXHbkfs9.js","assets/tab-store-nNzRNfVV.js","assets/use-db-driver-installed-BscdI-wS.js","assets/impexp-state-BWKOuRGj.js","assets/file-store-Bk1WYfdy.js","assets/sql-identifiers-DDISwQor.js","assets/db-explorer-store-BcLxq-X0.js","assets/window-pip-registry-DSoB7T3k.js","assets/onboarding-quick-orientation-DZYQekRt.js","assets/dialog-DOaEX6AK.js","assets/portal-container-context-BXAsDqrB.js","assets/icons-JMA45Ifw.js","assets/format-file-meta-C0LKHE3e.js","assets/fs-api-BQrIEcvo.js","assets/open-settings-DsGBn73g.js","assets/settings-categories-CcR9eL3x.js","assets/adaptive-context-menu-Cq7ynvIn.js","assets/context-menu-BoQ6lxte.js","assets/mobile-bottom-sheet-CGmmdp_5.js","assets/use-visual-viewport-CQ6-A0Dt.js","assets/dropdown-menu-DB3yyoVz.js","assets/input-CKGoVpYv.js","assets/scroll-area-6Am1KMiB.js","assets/start-ellipsis-rBh37k0n.js","assets/chat-preparation-cache-CRX9WAK5.js","assets/clipboard-D3XnL7CB.js","assets/file-icons-DpwcJLL4.js","assets/format-date-CSHaU2wN.js","assets/git-repo-store-BOYLnV67.js","assets/patch-tab-metadata-B-jH5svY.js","assets/ws-auth-cWeQ7_61.js","assets/apply-theme-ORrEdHKT.js","assets/resolve-theme-BqoL27BW.js","assets/index-DyYGWFVa.css","assets/libesm-B6LsX5wH.js","assets/tool-cards-DoDKxqN4.js","assets/design-canvas-check-Bo76Q6Qr.js","assets/agent-session-sheet-store-BoBrAw5i.js","assets/image-preview-geometry-CCq8rio7.js","assets/use-blob-url-D7ElNPnW.js","assets/image-gallery-BuxSgBug.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-CS1GvlOm.js";import{ci as r}from"./icons-JMA45Ifw.js";import{t as i}from"./preload-helper-CM8YhcCa.js";import"./portal-container-context-BXAsDqrB.js";import{t as a}from"./mobile-bottom-sheet-CGmmdp_5.js";import"./use-visual-viewport-CQ6-A0Dt.js";import{t as o}from"./agent-session-sheet-store-BoBrAw5i.js";var s=e(t(),1),c=n(),l=(0,s.lazy)(()=>i(()=>import(`./agent-session-window-content-CB_uvabH.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,59,60,61,62])));function u(){let e=o(e=>e.payload),t=o(e=>e.close);return e?(0,c.jsxs)(a,{open:!0,onClose:t,zIndex:45,className:`flex h-[var(--sheet-vh)] flex-col p-0`,children:[(0,c.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-border px-3 py-2 shrink-0`,children:[(0,c.jsx)(`span`,{className:`truncate text-sm font-medium text-text-primary`,children:e.title??`Agent session`}),(0,c.jsx)(`button`,{type:`button`,onClick:t,className:`ml-auto flex size-11 items-center justify-center rounded text-text-secondary hover:text-text-primary`,"aria-label":`Close`,children:(0,c.jsx)(r,{className:`size-5`})})]}),(0,c.jsx)(`div`,{className:`min-h-0 flex-1 overflow-auto`,children:(0,c.jsx)(s.Suspense,{fallback:(0,c.jsx)(`div`,{className:`p-4 text-sm text-text-2`,children:`Loading…`}),children:(0,c.jsx)(l,{id:`sheet-${e.sessionId}`,payload:e})})})]}):null}export{u as AgentSessionSheet};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./react-PkBxFcos.js";var t=e(e=>({payload:null,open:t=>e({payload:t}),close:()=>e({payload:null})}));export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-CS1GvlOm.js";import{L as r,P as i,xn as a}from"./icons-JMA45Ifw.js";import"./api-client-OiA8Ida1.js";import{n as o}from"./utils-Bslrbb-G.js";import"./panel-store-DmP16Fo0.js";import"./window-store-zJczRsv4.js";import"./project-store-CEGoLMOl.js";import"./project-framework-store-Bi5dyHdx.js";import"./session-list-sync-triggers-DitiR5h1.js";import"./tab-store-nNzRNfVV.js";import"./file-store-Bk1WYfdy.js";import"./use-is-mobile-BXHbkfs9.js";import"./fs-api-BQrIEcvo.js";import{F as s,Kr as c,P as l}from"./index-ItT-dTPV.js";import"./agent-session-sheet-store-BoBrAw5i.js";import"./libesm-B6LsX5wH.js";import{c as u,d,l as f,t as p}from"./tool-cards-DoDKxqN4.js";import"./use-blob-url-D7ElNPnW.js";import"./design-canvas-check-Bo76Q6Qr.js";var m=e(t(),1),h=2e3;function g(e,t){let n=t.reset?[]:e.slice();for(let{ev:e,ts:r,k:i,replace:a}of t.events){let t=n.findIndex(e=>e.k===i);if(t!==-1){a&&(n[t]={k:i,ts:r,ev:e});continue}let o=n.length;for(;o>0&&n[o-1].ts>r;)o--;n.splice(o,0,{k:i,ts:r,ev:e})}return n.length>2e3?n.slice(n.length-h):n}function _(){return`ats-${Math.random().toString(36).slice(2,10)}`}function v(e){let{projectName:t,providerId:n,sessionId:r,source:i,fallbackEvents:a}=e,[o,c]=(0,m.useState)([]),[u,d]=(0,m.useState)(!1),[f,p]=(0,m.useState)(!1),[h,v]=(0,m.useState)(!0),[y,b]=(0,m.useState)(null);(0,m.useEffect)(()=>{let e=_(),a=[],o;c([]),d(!1),p(!1),v(!0),b(null);let u=()=>{s(JSON.stringify({type:`agent-transcript:subscribe`,subId:e,projectName:t,providerId:n,sessionId:r,source:i,...o?{cursor:o}:{}}))},f=t=>{let n=t.detail;n.subId===e&&(a=g(a,n),o=n.cursor,c(a),d(n.available),p(n.running),v(!1),b(null))},m=t=>{let n=t.detail;n.subId===e&&(d(!1),v(!1),b(n.code))};window.addEventListener(`agent-transcript:events`,f),window.addEventListener(`agent-transcript:error`,m);let h=l(u);return u(),()=>{window.removeEventListener(`agent-transcript:events`,f),window.removeEventListener(`agent-transcript:error`,m),h(),s(JSON.stringify({type:`agent-transcript:unsubscribe`,subId:e}))}},[JSON.stringify([t,n,r,i])]);let x=(0,m.useMemo)(()=>o.map(e=>e.ev),[o]);return{events:u?x:a??[],available:u,running:f,loading:h,error:y}}var y=n();function b(e){return e.filter(e=>e.type===`tool_use`).length}function x({status:e}){return e===`loading`?null:e===`running`?(0,y.jsxs)(`span`,{className:`flex items-center gap-1 text-[10px] text-primary shrink-0`,children:[(0,y.jsx)(a,{className:`size-2.5 animate-spin`}),` running`]}):e===`failed`?(0,y.jsx)(`span`,{className:`text-[10px] text-error shrink-0`,children:`failed`}):(0,y.jsx)(`span`,{className:`text-[10px] text-success shrink-0`,children:`done`})}function S({payload:e}){let t=e??{},n=t.sessionId?u(t.sessionId,t.source):``,s=f(e=>n?e.entries[n]:void 0),{events:l,available:h,running:g,loading:_,error:S}=v({projectName:t.projectName,providerId:t.providerId,sessionId:t.sessionId,source:t.source,fallbackEvents:s}),[C,w]=(0,m.useState)(!1),T=c(),E=(0,m.useMemo)(()=>b(l),[l]),D=l[l.length-1],O=!g&&!!D&&D.type===`tool_result`&&!!D.isError,k=_?`loading`:g?`running`:O?`failed`:`done`;return(0,y.jsxs)(`div`,{className:`flex flex-col h-full min-h-0 bg-surface @container`,children:[(0,y.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5 border-b border-border/30 shrink-0`,children:[(0,y.jsx)(`span`,{className:`truncate text-xs font-medium`,children:t.title??`Agent session`}),l.length>0&&(0,y.jsx)(`span`,{className:`text-[10px] text-text-subtle shrink-0`,children:d(E)}),(0,y.jsx)(x,{status:k}),!h&&!_&&(0,y.jsx)(`span`,{className:`ml-auto text-[10px] text-text-subtle shrink-0`,title:`No live transcript for this session — showing steps already held in memory`,children:`offline`})]}),!!t.prompt&&(0,y.jsxs)(`div`,{className:`border-b border-border/30 shrink-0`,children:[(0,y.jsxs)(`button`,{type:`button`,onClick:()=>w(e=>!e),className:o(`flex w-full items-center gap-1.5 px-3 py-1.5 text-[11px] text-text-subtle hover:text-foreground`,T?`min-h-[44px]`:`min-h-[28px]`),children:[C?(0,y.jsx)(i,{className:`size-3`}):(0,y.jsx)(r,{className:`size-3`}),`Prompt`]}),C&&(0,y.jsx)(`div`,{className:`px-3 pb-2 text-[11px] text-text-secondary whitespace-pre-wrap select-text`,children:t.prompt})]}),_&&l.length===0?(0,y.jsxs)(`div`,{className:`flex-1 flex items-center justify-center gap-2 text-xs text-text-subtle`,children:[(0,y.jsx)(a,{className:`size-3 animate-spin`}),`Loading session…`]}):l.length===0?(0,y.jsx)(`div`,{className:`flex-1 flex items-center justify-center text-xs text-text-subtle px-4 text-center`,children:S?`Could not load this session`:`No recorded steps`}):(0,y.jsx)(p,{events:l,projectName:t.projectName,variant:`window`,className:`flex-1 min-h-0 overflow-y-auto px-3 py-2 space-y-1`})]})}export{S as default};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-CS1GvlOm.js";import{Cn as r,Yr as i,r as a,vr as o,xn as s}from"./icons-JMA45Ifw.js";import{k as c}from"./api-client-OiA8Ida1.js";import"./settings-store-WeJyQVL8.js";import{n as l}from"./utils-Bslrbb-G.js";import{Fn as u,In as d,J as f,Mn as p,Nn as m,Pn as h,q as g}from"./index-ItT-dTPV.js";import{t as _}from"./use-monaco-theme-DqnhExsm.js";var v=e(t(),1),y=n();function b({metadata:e}){let t=e?.filePath,n=e?.name,l=e?.resourceType??`skill`,b=e?.scope??`user`,S=e?.readOnly===!0,C=e?.shadowed===!0,w=e?.shadowedBy,T=e?.project??``,[E,D]=(0,v.useState)(``),[O,k]=(0,v.useState)(``),[A,j]=(0,v.useState)(!0),[M,N]=(0,v.useState)(null),[P,F]=(0,v.useState)(!1),I=_(),L=(0,v.useRef)(``),R=E!==O;(0,v.useEffect)(()=>{let e=!1;return j(!0),N(null),u(t,T).then(t=>{e||(D(t.content),k(t.content),L.current=t.content)}).catch(t=>{e||N(t.message)}).finally(()=>{e||j(!1)}),()=>{e=!0}},[t,T]);let z=(0,v.useCallback)(async()=>{if(S||P)return;let e=L.current;if(e!==O){F(!0);try{await d(t,e,T),k(e),D(e),c.success(`Saved`),h.getState().reload()}catch(e){c.error(e.message)}finally{F(!1)}}},[t,T,O,S,P]);(0,v.useEffect)(()=>{let e=e=>{(e.ctrlKey||e.metaKey)&&e.key.toLowerCase()===`s`&&(e.preventDefault(),z())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[z]);let B=m[l];return(0,y.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,y.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-border px-3 py-2 shrink-0`,children:[(0,y.jsx)(B,{className:`size-4 text-text-subtle`}),(0,y.jsx)(`span`,{className:`text-sm font-semibold`,children:n}),(0,y.jsx)(p,{scope:b}),R&&!S&&(0,y.jsx)(`span`,{className:`size-1.5 rounded-full bg-primary`,title:`Unsaved changes`}),(0,y.jsx)(`div`,{className:`flex-1`}),(0,y.jsxs)(`span`,{className:`hidden sm:block text-[11px] text-text-subtle`,children:[l,` · markdown`]}),!S&&(0,y.jsxs)(y.Fragment,{children:[(0,y.jsxs)(`button`,{onClick:()=>D(O),disabled:!R||P,className:`flex items-center gap-1 rounded px-2 py-1 text-xs text-text-secondary hover:bg-surface-elevated disabled:opacity-40`,children:[(0,y.jsx)(i,{className:`size-3.5`}),` Revert`]}),(0,y.jsxs)(`button`,{onClick:()=>void z(),disabled:!R||P,className:`flex items-center gap-1 rounded bg-primary px-2.5 py-1 text-xs font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-40`,children:[P?(0,y.jsx)(s,{className:`size-3.5 animate-spin`}):(0,y.jsx)(o,{className:`size-3.5`}),` Save`]})]})]}),S&&(0,y.jsx)(x,{icon:r,tone:`muted`,children:`Bundled resource — read-only. Duplicate it (from the AI Resources panel) to make an editable copy.`}),C&&w&&(0,y.jsxs)(x,{icon:a,tone:`warn`,children:[`This `,l,` is overridden by another “`,w.name,`” from a higher-priority source (`,w.source,`). It is currently inactive.`]}),(0,y.jsx)(`div`,{className:`min-h-0 flex-1`,children:A?(0,y.jsx)(`div`,{className:`flex h-full items-center justify-center`,children:(0,y.jsx)(s,{className:`size-5 animate-spin text-primary`})}):M?(0,y.jsx)(`div`,{className:`p-6 text-center text-sm text-destructive`,children:M}):(0,y.jsx)(f,{beforeMount:g,height:`100%`,language:`markdown`,theme:I,value:E,onChange:e=>{let t=e??``;L.current=t,D(t)},options:{readOnly:S,minimap:{enabled:!1},fontSize:13,wordWrap:`on`,scrollBeyondLastLine:!1,lineNumbers:`on`}})})]})}function x({icon:e,tone:t,children:n}){return(0,y.jsxs)(`div`,{className:l(`flex items-start gap-2 px-3 py-2 text-[12px] shrink-0 border-b border-border`,t===`warn`?`bg-amber-500/10 text-amber-300`:`bg-surface-elevated text-text-secondary`),children:[(0,y.jsx)(e,{className:`mt-0.5 size-3.5 shrink-0`}),(0,y.jsx)(`span`,{children:n})]})}export{b as AiResourceEditor};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-CS1GvlOm.js";import"./icons-JMA45Ifw.js";import"./api-client-OiA8Ida1.js";import"./settings-store-WeJyQVL8.js";import"./portal-container-context-BXAsDqrB.js";import"./panel-store-DmP16Fo0.js";import"./window-store-zJczRsv4.js";import"./project-store-CEGoLMOl.js";import"./project-framework-store-Bi5dyHdx.js";import"./session-list-sync-triggers-DitiR5h1.js";import"./tab-store-nNzRNfVV.js";import"./chat-preparation-cache-CRX9WAK5.js";import"./use-is-mobile-BXHbkfs9.js";import"./settings-categories-CcR9eL3x.js";import"./open-settings-DsGBn73g.js";import"./button-Br60hGkw.js";import"./dialog-DOaEX6AK.js";import"./mobile-bottom-sheet-CGmmdp_5.js";import"./use-visual-viewport-CQ6-A0Dt.js";import"./input-CKGoVpYv.js";import"./api-settings-D2H6gjen.js";import{t as e}from"./ai-settings-section-B_OFMlrt.js";export{e as AISettingsSection};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import{Kr as r,gt as i,hr as a,r as o}from"./icons-JMA45Ifw.js";import{r as s}from"./api-client-OiA8Ida1.js";import{t as c}from"./open-settings-DsGBn73g.js";import{t as l}from"./button-Br60hGkw.js";import{t as u}from"./input-CKGoVpYv.js";import{An as d,Bn as f,Ei as p,Hn as m,Ln as h,Rn as g,Sr as _,Vn as v,zn as y}from"./index-ItT-dTPV.js";import{a as b,b as x}from"./api-settings-D2H6gjen.js";var S=e(t(),1),C=n(),w=[128e3,272e3,4e5,512e3,872e3,1e6],T=[1e5,2e5,23e4,35e4,45e4,75e4,9e5];function E({id:e,label:t,value:n,presets:r,disabled:i,compact:a,onChange:o}){let[s,c]=(0,S.useState)(!!n&&!r.includes(Number(n))),l=a?`text-[11px]`:`text-sm`;return(0,C.jsxs)(`div`,{className:`space-y-1`,children:[(0,C.jsx)(_,{htmlFor:e,className:l,children:t}),(0,C.jsxs)(`select`,{id:e,value:s?`custom`:n||`default`,disabled:i,"aria-describedby":`codex-context-help`,className:`w-full min-h-11 sm:min-h-0 rounded-md border border-input bg-background px-3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50 ${a?`h-7`:`h-9`} ${l}`,onChange:e=>{let t=e.target.value;c(t===`custom`),t!==`custom`&&o(t===`default`?``:t)},children:[(0,C.jsx)(`option`,{value:`default`,children:`Codex default`}),r.map(e=>(0,C.jsxs)(`option`,{value:String(e),children:[e===1e6?`1M`:`${e/1e3}K`,` tokens`]},e)),(0,C.jsx)(`option`,{value:`custom`,children:`Custom...`})]}),s&&(0,C.jsx)(u,{id:`${e}-custom`,"aria-label":`Custom ${t.toLowerCase()}`,type:`number`,min:1,step:1,required:!0,value:n,disabled:i,placeholder:`Enter tokens`,"aria-describedby":`codex-context-help`,className:`min-h-11 sm:min-h-0 ${a?`h-7 text-[11px]`:``}`,onChange:e=>o(e.target.value)})]})}function D({config:e,compact:t,saving:n,onSave:r}){let[i,a]=(0,S.useState)(String(e?.model_context_window??``)),[o,s]=(0,S.useState)(String(e?.model_auto_compact_token_limit??``)),[c,l]=(0,S.useState)(null),u=t?`text-[11px]`:`text-sm`,d=t?`text-[9px]`:`text-[11px]`;async function f(e){e.preventDefault();let t=i.trim()?Number(i):null,n=o.trim()?Number(o):null;if([t,n].some(e=>e!==null&&(!Number.isSafeInteger(e)||e<=0))){l(`Enter positive whole numbers of tokens, or leave blank for Codex defaults.`);return}if(t!==null&&n!==null&&n>t){l(`Auto-compact threshold must not exceed the context window.`);return}l(null),await r({model_context_window:t,model_auto_compact_token_limit:n})}return(0,C.jsxs)(`form`,{onSubmit:f,className:`space-y-2 rounded-md border border-border p-3`,children:[(0,C.jsxs)(`div`,{className:`grid grid-cols-1 gap-3 sm:grid-cols-2`,children:[(0,C.jsx)(E,{id:`codex-context-window`,label:`Context window (tokens)`,value:i,presets:w,disabled:n,compact:t,onChange:e=>{a(e),l(null)}}),(0,C.jsx)(E,{id:`codex-compact-threshold`,label:`Auto-compact threshold (tokens)`,value:o,presets:T,disabled:n,compact:t,onChange:e=>{s(e),l(null)}})]}),(0,C.jsx)(`p`,{id:`codex-context-help`,className:`${d} text-muted-foreground`,children:`Choose Codex default to use Codex configuration and model defaults, or Custom to enter a value. Presets are shortcuts, not a list of limits supported by your model; increasing these values does not unlock a larger context window. Applies to new sessions and sessions resumed after a PPM restart.`}),c&&(0,C.jsx)(`p`,{role:`alert`,className:`${u} text-error`,children:c}),(0,C.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,C.jsx)(`a`,{href:`https://learn.chatgpt.com/docs/config-file/config-reference`,target:`_blank`,rel:`noreferrer`,className:`${d} text-primary underline`,children:`Codex context documentation`}),(0,C.jsx)(`button`,{type:`submit`,disabled:n,className:`min-h-11 sm:min-h-0 rounded-md border border-border px-3 py-1.5 hover:bg-surface-elevated disabled:opacity-50 ${u}`,children:n?`Saving...`:`Save context settings`})]})]})}var O=[{value:`low`,label:`Low`},{value:`medium`,label:`Medium`},{value:`high`,label:`High`},{value:`xhigh`,label:`Extra`},{value:`max`,label:`Max`}],ee=[{value:`bypassPermissions`,label:`Bypass permissions (default)`},{value:`default`,label:`Ask before edits`},{value:`acceptEdits`,label:`Edit automatically`},{value:`plan`,label:`Plan mode`}],k={claude:`Claude`,cursor:`Cursor`,codex:`Codex`,gemini:`Gemini`};function A({compact:e}={}){let[t,n]=(0,S.useState)(null),[r,w]=(0,S.useState)(``),[T,E]=(0,S.useState)([]),[A,M]=(0,S.useState)(!1),[N,P]=(0,S.useState)(!1),[F,I]=(0,S.useState)(null),[L,R]=(0,S.useState)(0),[z,B]=(0,S.useState)([]),[V,H]=(0,S.useState)(!1);(0,S.useEffect)(()=>{b().then(e=>{n(e),w(e.default_provider??`claude`)}).catch(e=>I(e.message))},[]),(0,S.useEffect)(()=>{r&&s.get(`/api/settings/ai/providers/status`).then(B).catch(()=>B([]))},[r]);let U=z.find(e=>e.id===r&&!e.registered);(0,S.useEffect)(()=>{r&&(M(!0),s.get(`/api/settings/ai/providers/${r}/models`).then(E).catch(()=>E([])).finally(()=>M(!1)))},[r,!U]);let W=async()=>{H(!0);try{let e=await s.post(`/api/settings/ai/providers/${r}/probe`);B(t=>t.map(t=>t.id===e.id?e:t))}catch(e){I(e.message)}finally{H(!1)}},G=t?Object.keys(t.providers).filter(e=>e!==`mock`).map(e=>({id:e,name:k[e]??e})):[],K=t?.providers[r],q=K?.type===`agent-sdk`||!K?.type&&r===`claude`,J=async e=>{if(!t)return!1;P(!0),I(null);try{return n(await x(e)),R(e=>e+1),!0}catch(e){return I(e.message),!1}finally{P(!1)}},Y=(e,t)=>J({providers:{[r]:{[e]:t}}}),X=e?`text-[11px]`:`text-sm`,Z=e?`text-xs`:`text-sm`,te=e?`space-y-2`:`space-y-4`,Q=e?`space-y-1.5`:`space-y-3`,$=e?`space-y-1`:`space-y-1.5`;if(!t)return(0,C.jsxs)(`div`,{className:Q,children:[(0,C.jsx)(`h3`,{className:`${Z} font-medium text-text-secondary`,children:`AI Settings`}),(0,C.jsx)(`p`,{className:`${X} text-text-subtle`,children:F?`Error: ${F}`:`Loading...`})]});let ne=q?T:[{value:`__default__`,label:`Auto (default)`},...T];return(0,C.jsxs)(`div`,{className:te,children:[(0,C.jsx)(`h3`,{className:`${Z} font-medium text-text-secondary`,children:`AI Settings`}),(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(_,{htmlFor:`ai-new-chat-provider`,className:e?X:void 0,children:`New chat provider`}),(0,C.jsxs)(h,{value:t.new_chat_provider_mode??`default`,disabled:N,onValueChange:e=>J({new_chat_provider_mode:e}),children:[(0,C.jsx)(f,{id:`ai-new-chat-provider`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,C.jsx)(v,{})}),(0,C.jsxs)(g,{children:[(0,C.jsx)(y,{value:`follow-focus`,children:`Follow last focused chat`}),(0,C.jsx)(y,{value:`default`,children:`Always use default provider`})]})]}),(0,C.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:t.new_chat_provider_mode===`follow-focus`?`New tabs follow the last chat you focused in this project, across panels. Existing tabs keep their provider.`:`New tabs always use the default provider. Existing tabs keep their provider.`})]}),(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(_,{htmlFor:`ai-default-provider`,className:e?X:void 0,children:`Default provider`}),(0,C.jsxs)(h,{value:t.default_provider,disabled:N,onValueChange:e=>J({default_provider:e}),children:[(0,C.jsx)(f,{id:`ai-default-provider`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,C.jsx)(v,{})}),(0,C.jsx)(g,{children:G.map(e=>(0,C.jsx)(y,{value:e.id,children:e.name},e.id))})]}),t.new_chat_provider_mode===`follow-focus`&&(0,C.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Used when no chat has been focused in this project yet.`})]}),(0,C.jsxs)(`div`,{className:`flex items-start justify-between gap-3 rounded-md border border-border p-3`,children:[(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(_,{htmlFor:`ai-share-provider-context`,className:e?X:void 0,children:`Share rules and memory between providers`}),(0,C.jsx)(`p`,{id:`ai-share-provider-context-description`,className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Share project rules and memory, plus global instruction files, across providers. Applies from the next project-chat message. Turning off keeps context already sent.`})]}),(0,C.jsx)(m,{id:`ai-share-provider-context`,"aria-describedby":`ai-share-provider-context-description`,checked:t.share_provider_context??!0,disabled:N,onCheckedChange:e=>J({share_provider_context:e})})]}),(0,C.jsxs)(`div`,{className:`flex items-start justify-between gap-3 rounded-md border border-border p-3`,children:[(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(_,{htmlFor:`ai-tab-tools`,className:e?X:void 0,children:`Let the AI open tabs in PPM`}),(0,C.jsx)(`p`,{id:`ai-tab-tools-description`,className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`The AI can open files in a PPM tab on your device, and show the pages, charts and reports it makes, seeing their errors and a screenshot. Turns off Claude's claude.ai Artifact tool. Applies to new chats.`})]}),(0,C.jsx)(m,{id:`ai-tab-tools`,"aria-describedby":`ai-tab-tools-description`,checked:t.tab_tools??!1,disabled:N,onCheckedChange:e=>J({tab_tools:e})})]}),G.length>1&&(0,C.jsx)(`div`,{className:`flex gap-0.5 border-b border-border/50 -mx-1 px-1`,children:G.map(e=>(0,C.jsxs)(`button`,{onClick:()=>w(e.id),className:`flex items-center gap-1 px-2 py-1 text-[11px] rounded-t transition-colors ${r===e.id?`text-primary border-b-2 border-primary font-medium`:`text-text-subtle hover:text-text-secondary`}`,children:[(0,C.jsx)(p,{providerId:e.id}),(0,C.jsx)(`span`,{className:`capitalize`,children:e.name})]},e.id))}),(0,C.jsxs)(`div`,{className:Q,children:[U&&(0,C.jsxs)(`div`,{className:`flex items-start gap-2 rounded-md border border-warning/30 bg-warning/5 px-2.5 py-2`,children:[(0,C.jsx)(o,{className:`size-3.5 text-warning shrink-0 mt-0.5`}),(0,C.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1.5`,children:[(0,C.jsxs)(`p`,{className:`${X} text-text-secondary`,children:[k[r]??r,` is not available in chat — PPM could not start it.`]}),(0,C.jsx)(`p`,{className:`text-[11px] text-muted-foreground break-words`,children:U.reason}),U.nextProbeAt&&(0,C.jsxs)(`p`,{className:`text-[11px] text-text-subtle`,children:[`Checking again at `,new Date(U.nextProbeAt).toLocaleTimeString()]}),(0,C.jsxs)(l,{variant:`outline`,size:`sm`,onClick:W,disabled:V,className:`gap-1.5 cursor-pointer min-h-11 md:min-h-8`,children:[(0,C.jsx)(a,{className:`size-3.5 ${V?`animate-spin`:``}`}),V?`Checking...`:`Check again`]})]})]}),r===`codex`&&(0,C.jsxs)(`button`,{type:`button`,onClick:()=>c(`accounts`),className:`w-full flex items-center justify-between gap-2 rounded-md border border-border px-2.5 py-2 text-left cursor-pointer hover:bg-surface-elevated transition-colors`,children:[(0,C.jsx)(`span`,{className:`${X} text-text-secondary`,children:`Codex accounts & login`}),(0,C.jsx)(i,{className:`size-3.5 text-text-subtle shrink-0`})]}),T.length>0&&(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(_,{htmlFor:`ai-model`,className:e?X:void 0,children:`Model`}),(0,C.jsxs)(h,{value:q?K?.model??T[0]?.value:K?.model||`__default__`,onValueChange:e=>Y(`model`,e===`__default__`?void 0:e),disabled:A,children:[(0,C.jsx)(f,{id:`ai-model`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,C.jsx)(v,{placeholder:A?`Loading models...`:`Select model`})}),(0,C.jsx)(g,{className:`max-h-[300px]`,children:ne.map(e=>(0,C.jsx)(y,{value:e.value,children:e.label},e.value))})]})]}),r===`codex`&&(0,C.jsx)(D,{config:K,compact:e,saving:N,onSave:e=>J({providers:{codex:e}})},JSON.stringify([K?.model_context_window,K?.model_auto_compact_token_limit])),q&&(0,C.jsxs)(C.Fragment,{children:[(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(_,{htmlFor:`ai-base-url`,className:e?X:void 0,children:`Base URL`}),(0,C.jsx)(u,{id:`ai-base-url`,type:`url`,defaultValue:K?.base_url??``,placeholder:`https://api.anthropic.com (default)`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{Y(`base_url`,e.target.value.trim()||void 0)}},`baseurl-${r}-${L}`)]}),(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(_,{htmlFor:`ai-api-key`,className:e?X:void 0,children:`API Key / Token`}),(0,C.jsx)(u,{id:`ai-api-key`,type:`password`,defaultValue:K?.api_key??``,placeholder:`sk-ant-... (optional, overrides accounts)`,className:e?`h-7 text-[11px] font-mono`:`font-mono`,onBlur:e=>{let t=e.target.value.trim();t.startsWith(`••••`)||Y(`api_key`,t||void 0)}},`apikey-${r}-${L}`),(0,C.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Direct API key or OAuth token. Leave empty to use connected accounts.`})]}),(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(_,{htmlFor:`ai-effort`,className:e?X:void 0,children:`Effort`}),(0,C.jsxs)(h,{value:K?.effort??`high`,onValueChange:e=>Y(`effort`,e),children:[(0,C.jsx)(f,{id:`ai-effort`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,C.jsx)(v,{})}),(0,C.jsx)(g,{children:O.map(e=>(0,C.jsx)(y,{value:e.value,children:e.label},e.value))})]})]}),(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(_,{htmlFor:`ai-max-turns`,className:e?X:void 0,children:`Max Turns (1-500)`}),(0,C.jsx)(u,{id:`ai-max-turns`,type:`number`,min:1,max:500,defaultValue:K?.max_turns??100,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseInt(e.target.value);isNaN(t)||Y(`max_turns`,t)}},`turns-${r}-${L}`)]}),(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(_,{htmlFor:`ai-budget`,className:e?X:void 0,children:`Max Budget (USD)`}),(0,C.jsx)(u,{id:`ai-budget`,type:`number`,step:.1,min:.01,max:50,defaultValue:K?.max_budget_usd??``,placeholder:`No limit`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseFloat(e.target.value);Y(`max_budget_usd`,isNaN(t)?void 0:t)}},`budget-${r}-${L}`)]}),(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(_,{htmlFor:`ai-thinking`,className:e?X:void 0,children:`Thinking Budget (tokens)`}),(0,C.jsx)(u,{id:`ai-thinking`,type:`number`,min:0,defaultValue:K?.thinking_budget_tokens??``,placeholder:`Adaptive (model decides)`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseInt(e.target.value);Y(`thinking_budget_tokens`,isNaN(t)?void 0:t)}},`thinking-${r}-${L}`)]}),(0,C.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,C.jsxs)(`div`,{children:[(0,C.jsx)(_,{htmlFor:`ai-agent-teams`,className:e?X:void 0,children:`Agent Teams`}),(0,C.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Experimental. Enables multi-agent collaboration with shared tasks and messaging. Uses ~7x more tokens.`})]}),(0,C.jsx)(m,{id:`ai-agent-teams`,checked:K?.agent_teams??!1,onCheckedChange:e=>Y(`agent_teams`,e)})]}),K?.agent_teams&&(0,C.jsx)(j,{compact:e}),(0,C.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,C.jsxs)(`div`,{children:[(0,C.jsx)(_,{htmlFor:`ai-context-1m`,className:e?X:void 0,children:`1M Context Window`}),(0,C.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Requires an entitled account (Max/Team/Enterprise) and an Opus 4 / Sonnet 4 model. Other accounts will error.`})]}),(0,C.jsx)(m,{id:`ai-context-1m`,checked:K?.context_1m??!1,onCheckedChange:e=>Y(`context_1m`,e)})]}),(0,C.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,C.jsxs)(`div`,{children:[(0,C.jsx)(_,{htmlFor:`ai-inherit-mcp`,className:e?X:void 0,children:`Inherit Claude Code MCP`}),(0,C.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Auto-load MCP servers from Claude Code's ~/.claude.json (global + per-project). Your own MCP servers override inherited ones.`})]}),(0,C.jsx)(m,{id:`ai-inherit-mcp`,checked:K?.inherit_claude_mcp??!0,onCheckedChange:e=>Y(`inherit_claude_mcp`,e)})]}),(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(_,{className:e?X:void 0,children:`MCP sign-in`}),(0,C.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Servers that use OAuth stay unavailable to Claude until someone signs in. Project-scoped servers are listed in the project's AI Resources panel.`}),(0,C.jsx)(`div`,{className:`-mx-2`,children:(0,C.jsx)(d,{showWhenEmpty:!0})})]})]}),(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(_,{htmlFor:`ai-permission-mode`,className:e?X:void 0,children:`Default Permission Mode`}),(0,C.jsxs)(h,{value:K?.permission_mode??`bypassPermissions`,onValueChange:e=>Y(`permission_mode`,e),children:[(0,C.jsx)(f,{id:`ai-permission-mode`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,C.jsx)(v,{})}),(0,C.jsx)(g,{children:ee.map(e=>(0,C.jsx)(y,{value:e.value,children:e.label},e.value))})]})]}),(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(_,{htmlFor:`ai-system-prompt`,className:e?X:void 0,children:`Additional Instructions`}),(0,C.jsx)(`textarea`,{id:`ai-system-prompt`,rows:e?3:4,defaultValue:K?.system_prompt??``,placeholder:`Enter additional instructions for ${r}...`,className:`w-full rounded-md border border-input bg-background px-3 py-2 ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 ${e?`text-[11px]`:`text-sm`}`,onBlur:e=>{Y(`system_prompt`,e.target.value.trim()||void 0)}},`sysprompt-${r}-${L}`)]})]}),N&&(0,C.jsx)(`p`,{className:`text-xs text-text-subtle`,children:`Saving...`}),F&&(0,C.jsx)(`p`,{className:`text-xs text-error`,children:F})]})}function j({compact:e}){let[t,n]=(0,S.useState)([]),[i,o]=(0,S.useState)(!1),[c,l]=(0,S.useState)(null),u=(0,S.useCallback)(async()=>{o(!0);try{n(await s.get(`/api/teams`)??[])}catch{}o(!1)},[]);(0,S.useEffect)(()=>{u()},[u]);let d=async e=>{try{await s.del(`/api/teams/${encodeURIComponent(e)}`),n(t=>t.filter(t=>t.name!==e)),l(null)}catch{}};return t.length===0&&!i?null:(0,C.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,C.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,C.jsxs)(_,{className:e?`text-[11px]`:void 0,children:[`Teams (`,t.length,`)`]}),(0,C.jsx)(`button`,{onClick:u,className:`text-text-subtle hover:text-foreground p-1`,"aria-label":`Refresh teams`,children:(0,C.jsx)(a,{className:`size-3 ${i?`animate-spin`:``}`})})]}),t.map(e=>(0,C.jsxs)(`div`,{className:`flex items-center justify-between p-2 rounded bg-surface-elevated text-xs`,children:[(0,C.jsxs)(`div`,{className:`min-w-0`,children:[(0,C.jsx)(`div`,{className:`font-medium truncate`,children:e.name}),e.description&&(0,C.jsx)(`div`,{className:`text-text-subtle truncate`,children:e.description}),(0,C.jsxs)(`div`,{className:`text-text-subtle`,children:[e.members?.length??e.memberCount??0,` members`,e.createdAt?` · ${new Date(e.createdAt).toLocaleDateString()}`:``]})]}),c===e.name?(0,C.jsxs)(`div`,{className:`flex gap-1 shrink-0 ml-2`,children:[(0,C.jsx)(`button`,{onClick:()=>d(e.name),className:`px-2 py-1 bg-error text-white rounded text-[10px]`,children:`Delete`}),(0,C.jsx)(`button`,{onClick:()=>l(null),className:`px-2 py-1 bg-panel-2 text-text rounded text-[10px]`,children:`Cancel`})]}):(0,C.jsx)(`button`,{onClick:()=>l(e.name),className:`shrink-0 text-text-subtle hover:text-error p-1 ml-2`,"aria-label":`Delete team ${e.name}`,children:(0,C.jsx)(r,{className:`size-3.5`})})]},e.name))]})}export{A as t};
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-CS1GvlOm.js";import{A as r,Ar as i,Hn as a,I as o,K as s,Kr as c,Mr as l,P as u,Vn as d,Xt as f,Yt as p,Z as m,Zr as h,_r as g,br as _,ci as v,cr as y,er as b,gr as x,hr as S,lr as C,ni as w,nn as T,o as E,or as D,qr as O,ri as k,u as A,un as j,ut as M,xn as N,xr as P}from"./icons-JMA45Ifw.js";import{a as F,k as I,r as L}from"./api-client-OiA8Ida1.js";import{n as R}from"./utils-Bslrbb-G.js";import"./portal-container-context-BXAsDqrB.js";import"./panel-store-DmP16Fo0.js";import"./window-store-zJczRsv4.js";import{i as z}from"./project-store-CEGoLMOl.js";import"./project-framework-store-Bi5dyHdx.js";import"./session-list-sync-triggers-DitiR5h1.js";import{t as B}from"./tab-store-nNzRNfVV.js";import{n as ee}from"./use-is-mobile-BXHbkfs9.js";import{t as V}from"./button-Br60hGkw.js";import{a as H,n as U,o as W,r as te,t as ne}from"./dialog-DOaEX6AK.js";import{i as G,m as re,r as ie,t as ae}from"./dropdown-menu-DB3yyoVz.js";import{t as K}from"./mobile-bottom-sheet-CGmmdp_5.js";import"./use-visual-viewport-CQ6-A0Dt.js";import{t as q}from"./input-CKGoVpYv.js";import"./start-ellipsis-rBh37k0n.js";import{t as oe}from"./ws-auth-cWeQ7_61.js";import{xr as J}from"./index-ItT-dTPV.js";import{n as se,t as ce}from"./use-h264-canvas-decoder-DAjp9oHe.js";var Y=e(t(),1),le=/^[A-Za-z0-9][A-Za-z0-9._-]{0,62}$/;function ue(e){return le.test(e)?null:`use 1–63 letters, digits, dots, dashes or underscores, starting with a letter or digit`}var X={ramMb:{min:512,max:16*1024,default:2048},storageMb:{min:1024,max:128*1024,default:6144},sdCardMb:{min:0,max:32*1024,default:512}},Z=n(),de=[`phone`,`tablet`,`tv`,`wear`,`automotive`,`desktop`,`other`],fe={phone:`Phones`,tablet:`Tablets`,tv:`TV`,wear:`Wear`,automotive:`Automotive`,desktop:`Desktop`,other:`Other`},pe=e=>`${(e/1024**3).toFixed(1)} GB`;function me({open:e,onClose:t,existingNames:n,onCreated:r}){let a=ee(),[o,s]=(0,Y.useState)(null),[c,l]=(0,Y.useState)(null),[u,d]=(0,Y.useState)(null),[p,m]=(0,Y.useState)(``),[h,g]=(0,Y.useState)(``),[_,v]=(0,Y.useState)(``),[y,b]=(0,Y.useState)(String(X.ramMb.default)),[x,S]=(0,Y.useState)(String(X.storageMb.default)),[C,w]=(0,Y.useState)(!1),[T,E]=(0,Y.useState)(null);(0,Y.useEffect)(()=>{if(!e)return;let t=!0;return d(null),(async()=>{try{let[e,n]=await Promise.all([L.get(`/api/android/system-images`),L.get(`/api/android/device-profiles`)]);if(!t)return;s(e.images),l(n.profiles);let r=e.images.filter(e=>e.hostCompatible).slice().sort((e,t)=>(t.apiLevel??0)-(e.apiLevel??0))[0];r&&g(e=>e||r.id),n.profiles.some(e=>e.id===`pixel_9`)&&v(e=>e||`pixel_9`)}catch(e){t&&d(e.message)}})(),()=>{t=!1}},[e]);let D=(0,Y.useMemo)(()=>(o??[]).map(e=>({value:e.hostCompatible?e.id:``,label:`API ${e.apiLevel??`?`} · ${e.tagDisplay} · ${e.abi}`,group:e.hostCompatible?`Runs on this host`:`Wrong CPU for this host`,hint:e.hostCompatible?pe(e.bytes):`needs ${e.abi}`,title:e.id})),[o]),k=(0,Y.useMemo)(()=>{let e=c??[];return de.flatMap(t=>e.filter(e=>e.kind===t).map(e=>({value:e.id,label:e.name,group:fe[t],hint:e.oem})))},[c]),A=p.length===0?null:n.some(e=>e.toLowerCase()===p.toLowerCase())?`an AVD with that name already exists`:ue(p),j=Number(y),M=Number(x),P=Number.isFinite(j)&&j>=X.ramMb.min&&j<=X.ramMb.max?null:`RAM must be between ${X.ramMb.min} and ${X.ramMb.max} MB`,F=Number.isFinite(M)&&M>=X.storageMb.min&&M<=X.storageMb.max?null:`Storage must be between ${X.storageMb.min} and ${X.storageMb.max} MB`,I=p.length>0&&!A&&!P&&!F&&h!==``&&_!==``&&!C,R=()=>{m(``),E(null),w(!1),b(String(X.ramMb.default)),S(String(X.storageMb.default))},z=async()=>{if(I){w(!0),E(null);try{await L.post(`/api/android/avds`,{name:p,systemImage:h,deviceProfile:_,ramMb:j,storageMb:M}),r(p),R(),t()}catch(e){E(e.message),w(!1)}}},B=!u&&(o===null||c===null),G=(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[u&&(0,Z.jsxs)(`p`,{className:`flex items-start gap-2 text-sm leading-relaxed text-destructive`,children:[(0,Z.jsx)(O,{className:`mt-0.5 size-4 shrink-0`}),(0,Z.jsx)(`span`,{className:`min-w-0 flex-1`,children:u})]}),B&&(0,Z.jsxs)(`p`,{className:`flex items-center gap-2 py-6 text-sm text-muted-foreground`,children:[(0,Z.jsx)(N,{className:`size-4 animate-spin`}),` Reading the SDK…`]}),!B&&!u&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(`label`,{htmlFor:`avd-name`,className:`text-sm font-medium`,children:`Name`}),(0,Z.jsx)(q,{id:`avd-name`,value:p,onChange:e=>m(e.target.value),placeholder:`Pixel_9_API_35`,autoComplete:`off`,spellCheck:!1,className:`h-11`}),A?(0,Z.jsx)(`p`,{className:`text-xs leading-relaxed text-destructive`,children:A}):(0,Z.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`This becomes a folder name, so no spaces.`})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(`span`,{className:`text-sm font-medium`,children:`System image`}),(0,Z.jsx)(J,{value:h,items:D,onChange:g,label:`System image`,searchPlaceholder:`Search images`,emptyText:`No system images are installed`,placeholder:`Pick an installed image`,icon:f,className:`h-11 w-full md:h-9`,modal:!a}),(0,Z.jsxs)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:[`Only images already downloaded on this host. PPM never downloads one for you — use Android Studio's SDK Manager, or`,` `,(0,Z.jsx)(`code`,{className:`rounded bg-muted px-1 text-[11px]`,children:`sdkmanager`}),`.`]})]}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsx)(`span`,{className:`text-sm font-medium`,children:`Device`}),(0,Z.jsx)(J,{value:_,items:k,onChange:v,label:`Device profile`,searchPlaceholder:`Search devices`,emptyText:`No device profiles`,placeholder:`Pick a device`,icon:i,className:`h-11 w-full md:h-9`,modal:!a}),(0,Z.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`Sets the screen. Without one the emulator is 320x640.`})]}),(0,Z.jsxs)(`div`,{className:`flex gap-3`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1.5`,children:[(0,Z.jsx)(`label`,{htmlFor:`avd-ram`,className:`text-sm font-medium`,children:`RAM (MB)`}),(0,Z.jsx)(q,{id:`avd-ram`,inputMode:`numeric`,value:y,className:`h-11`,onChange:e=>b(e.target.value)})]}),(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1.5`,children:[(0,Z.jsx)(`label`,{htmlFor:`avd-storage`,className:`text-sm font-medium`,children:`Storage (MB)`}),(0,Z.jsx)(q,{id:`avd-storage`,inputMode:`numeric`,value:x,className:`h-11`,onChange:e=>S(e.target.value)})]})]}),(P||F)&&(0,Z.jsx)(`p`,{className:`text-xs leading-relaxed text-destructive`,children:P??F}),(0,Z.jsxs)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:[`PPM writes `,(0,Z.jsx)(`code`,{className:`rounded bg-muted px-1 text-[11px]`,children:`hw.keyboard=yes`}),` `,`into every AVD it creates — without it the emulator accepts key presses and shows nothing.`]})]}),T&&(0,Z.jsxs)(`p`,{className:`flex items-start gap-2 text-sm leading-relaxed text-destructive`,children:[(0,Z.jsx)(O,{className:`mt-0.5 size-4 shrink-0`}),(0,Z.jsx)(`span`,{className:`min-w-0 flex-1`,children:T})]}),(0,Z.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,Z.jsx)(V,{variant:`outline`,className:`min-h-11`,onClick:()=>{R(),t()},children:`Cancel`}),(0,Z.jsx)(V,{className:`min-h-11`,disabled:!I,onClick:()=>void z(),children:C?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(N,{className:`animate-spin`}),` Creating…`]}):`Create device`})]})]});return e?a?(0,Z.jsx)(K,{open:!0,onClose:t,children:(0,Z.jsxs)(`div`,{className:`max-h-[80vh] overflow-y-auto px-4 pb-4`,children:[(0,Z.jsx)(`h2`,{className:`mb-3 text-base font-semibold`,children:`New Android device`}),G]})}):(0,Z.jsx)(ne,{open:!0,onOpenChange:e=>!e&&t(),children:(0,Z.jsxs)(U,{className:`sm:max-w-lg`,children:[(0,Z.jsxs)(H,{children:[(0,Z.jsx)(W,{children:`New Android device`}),(0,Z.jsx)(te,{children:`Built from a system image already installed on this host.`})]}),(0,Z.jsx)(`div`,{className:`max-h-[70vh] overflow-y-auto pr-1`,children:G})]})}):null}function he({action:e,avdId:t,deviceName:n,onCancel:r,onDone:i}){let a=ee(),[o,s]=(0,Y.useState)(``),[c,l]=(0,Y.useState)(!1),[u,d]=(0,Y.useState)(null);if((0,Y.useEffect)(()=>{s(``),d(null),l(!1)},[e,t]),!e)return null;let f=e===`delete`,p=f?`Delete this device`:`Wipe this device`,m=o===n&&!c,h=async()=>{if(m){l(!0),d(null);try{f?(await L.del(`/api/android/avds/${encodeURIComponent(t)}`,{confirmName:n}),i(`delete`,`Deleted ${n}`)):i(`wipe`,(await L.post(`/api/android/avds/${encodeURIComponent(t)}/wipe`,{confirmName:n})).message)}catch(e){d(e.message),l(!1)}}},g=(0,Z.jsxs)(`div`,{className:`space-y-4`,children:[(0,Z.jsx)(`p`,{className:`text-sm leading-relaxed`,children:f?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`span`,{className:`font-medium`,children:n}),` and everything in it will be removed from disk. The AVD, its settings and its installed apps are gone for good — this is not a recycle bin.`]}):(0,Z.jsxs)(Z.Fragment,{children:[`Everything inside `,(0,Z.jsx)(`span`,{className:`font-medium`,children:n}),` goes back to factory: installed apps, accounts, files and saved snapshots. The device itself and its settings stay, and the next start is a cold boot.`]})}),(0,Z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Z.jsxs)(`label`,{htmlFor:`avd-confirm`,className:`text-sm font-medium`,children:[`Type `,(0,Z.jsx)(`span`,{className:`font-mono`,children:n}),` to confirm`]}),(0,Z.jsx)(q,{id:`avd-confirm`,value:o,onChange:e=>s(e.target.value),autoComplete:`off`,spellCheck:!1,autoCapitalize:`off`,className:`h-11 font-mono`})]}),u&&(0,Z.jsxs)(`p`,{className:`flex items-start gap-2 text-sm leading-relaxed text-destructive`,children:[(0,Z.jsx)(O,{className:`mt-0.5 size-4 shrink-0`}),(0,Z.jsx)(`span`,{className:`min-w-0 flex-1`,children:u})]}),(0,Z.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,Z.jsx)(V,{variant:`outline`,className:`min-h-11`,onClick:r,children:`Cancel`}),(0,Z.jsx)(V,{variant:`destructive`,className:`min-h-11`,autoFocus:!1,disabled:!m,onClick:()=>void h(),children:c?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(N,{className:`animate-spin`}),` `,f?`Deleting…`:`Wiping…`]}):f?`Delete device`:`Wipe data`})]})]});return a?(0,Z.jsx)(K,{open:!0,onClose:r,children:(0,Z.jsxs)(`div`,{className:`px-4 pb-4`,children:[(0,Z.jsx)(`h2`,{className:`mb-3 text-base font-semibold`,children:p}),g]})}):(0,Z.jsx)(ne,{open:!0,onOpenChange:e=>!e&&r(),children:(0,Z.jsxs)(U,{className:`sm:max-w-md`,children:[(0,Z.jsxs)(H,{children:[(0,Z.jsx)(W,{children:p}),(0,Z.jsx)(te,{children:f?`This cannot be undone.`:`A factory reset — the device itself stays.`})]}),g]})})}var ge=1500;function _e({onOpen:e}){let[t,n]=(0,Y.useState)(null),[o,s]=(0,Y.useState)([]),[u,d]=(0,Y.useState)(null),[f,p]=(0,Y.useState)({}),[m,h]=(0,Y.useState)(!1),[g,_]=(0,Y.useState)(null),v=(0,Y.useRef)(!0),b=(0,Y.useCallback)(async()=>{try{let e=await L.get(`/api/android/capabilities`);if(!v.current||(n(e),!e.enabled))return;let t=await L.get(`/api/android/devices`);if(!v.current)return;s(t.devices),d(null)}catch(e){v.current&&d(e.message)}},[]);(0,Y.useEffect)(()=>{v.current=!0,b();let e=setInterval(()=>void b(),ge*4);return()=>{v.current=!1,clearInterval(e)}},[b]);let C=(0,Y.useCallback)(async e=>{p(t=>({...t,[e.avdId]:`Starting…`}));try{let{operationId:t}=await L.post(`/api/android/avds/${encodeURIComponent(e.avdId)}/start`,{});for(;;){if(await new Promise(e=>setTimeout(e,ge)),!v.current)return;let n=await L.get(`/api/android/operations/${t}`);if(p(t=>({...t,[e.avdId]:n.detail??`Starting…`})),n.state===`succeeded`)break;if(n.state===`failed`||n.state===`cancelled`){d(n.error??`the emulator failed to start`);break}}}catch(e){v.current&&d(e.message)}finally{v.current&&(p(t=>{let n={...t};return delete n[e.avdId],n}),b())}},[b]),w=(0,Y.useCallback)(async e=>{if(e.runtime){p(t=>({...t,[e.avdId]:`Stopping…`}));try{await L.post(`/api/android/devices/${encodeURIComponent(e.runtime.deviceId)}/stop?generation=${e.runtime.generation}`,{})}catch(e){v.current&&d(e.message)}finally{v.current&&(p(t=>{let n={...t};return delete n[e.avdId],n}),b())}}},[b]);if(!t)return(0,Z.jsxs)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:[(0,Z.jsx)(N,{className:`mr-2 size-4 animate-spin`}),` Checking this host…`]});let T=t.requirements.filter(e=>!e.met);return(0,Z.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 border-b px-4 py-3`,children:[(0,Z.jsx)(i,{className:`size-4 shrink-0 text-muted-foreground`}),(0,Z.jsx)(`h2`,{className:`min-w-0 flex-1 truncate text-sm font-medium`,children:`Android devices`}),t.canCreateAvd&&(0,Z.jsxs)(V,{size:`sm`,className:`h-10`,onClick:()=>h(!0),children:[(0,Z.jsx)(y,{}),` New device`]}),(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:`size-10`,onClick:()=>void b(),title:`Refresh`,"aria-label":`Refresh`,children:(0,Z.jsx)(S,{})})]}),(0,Z.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-4`,children:[u&&(0,Z.jsxs)(`div`,{className:`mb-4 flex items-start gap-2 rounded-md border border-destructive/40 bg-destructive/10 p-3 text-sm`,children:[(0,Z.jsx)(O,{className:`mt-0.5 size-4 shrink-0 text-destructive`}),(0,Z.jsx)(`span`,{className:`min-w-0 flex-1 leading-relaxed`,children:u})]}),T.length>0&&(0,Z.jsxs)(`div`,{className:`mb-4 rounded-md border p-4`,children:[(0,Z.jsx)(`p`,{className:`text-sm font-medium`,children:`This host is not ready yet`}),(0,Z.jsx)(`ul`,{className:`mt-3 space-y-3`,children:t.requirements.map(e=>(0,Z.jsxs)(`li`,{className:`flex items-start gap-2 text-sm leading-relaxed`,children:[e.met?(0,Z.jsx)(r,{className:`mt-0.5 size-4 shrink-0 text-muted-foreground`}):(0,Z.jsx)(O,{className:`mt-0.5 size-4 shrink-0 text-destructive`}),(0,Z.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`span`,{className:R(!e.met&&`font-medium`),children:e.label}),(0,Z.jsx)(`span`,{className:`block text-muted-foreground`,children:e.detail}),!e.met&&e.fix&&(0,Z.jsx)(`code`,{className:`mt-1 block overflow-x-auto rounded bg-muted px-2 py-1 text-xs`,children:e.fix})]})]},e.id))})]}),o.length===0&&T.length===0&&(0,Z.jsxs)(`div`,{className:`py-8 text-center`,children:[(0,Z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:`No AVDs on this host yet.`}),t.canCreateAvd?(0,Z.jsxs)(V,{className:`mt-4 min-h-11`,onClick:()=>h(!0),children:[(0,Z.jsx)(y,{}),` New device`]}):(0,Z.jsxs)(`p`,{className:`mt-2 text-sm leading-relaxed text-muted-foreground`,children:[`Create one in Android Studio, or with`,` `,(0,Z.jsx)(`code`,{className:`rounded bg-muted px-1 py-0.5 text-xs`,children:`avdmanager create avd`}),`.`]})]}),(0,Z.jsx)(`ul`,{className:`space-y-2`,children:o.map(n=>{let r=n.runtime!==null,i=f[n.avdId];return(0,Z.jsxs)(`li`,{className:`flex flex-col gap-3 rounded-md border p-4 sm:flex-row sm:items-center`,children:[(0,Z.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`p`,{className:`truncate text-sm font-medium`,children:n.name}),(0,Z.jsx)(`p`,{className:`mt-0.5 text-xs leading-relaxed text-muted-foreground`,children:[n.apiLevel?`API ${n.apiLevel}`:null,n.abi,n.displayWidth&&n.displayHeight?`${n.displayWidth}x${n.displayHeight}`:null,r?n.runtime.ownedByPpm?`running (PPM)`:`running (external)`:null].filter(Boolean).join(` · `)}),n.lockedByAnotherProcess&&(0,Z.jsx)(`p`,{className:`mt-1 text-xs leading-relaxed text-destructive`,children:`Locked by another process — it is probably open in Android Studio.`}),!n.hardwareKeyboard&&(0,Z.jsxs)(`p`,{className:`mt-1 text-xs leading-relaxed text-muted-foreground`,children:[`This AVD has no hardware keyboard, so typing will not reach it. Set`,` `,(0,Z.jsx)(`code`,{className:`rounded bg-muted px-1 text-[11px]`,children:`hw.keyboard=yes`}),` in its config.ini.`]})]}),(0,Z.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[i&&(0,Z.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,Z.jsx)(N,{className:`size-3.5 animate-spin`}),` `,i]}),r?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(V,{size:`sm`,className:`h-10`,onClick:()=>e(n),children:`View`}),n.runtime.ownedByPpm&&(0,Z.jsxs)(V,{size:`sm`,variant:`outline`,className:`h-10`,disabled:!!i,onClick:()=>void w(n),children:[(0,Z.jsx)(l,{}),` Stop`]})]}):(0,Z.jsxs)(V,{size:`sm`,className:`h-10`,disabled:!!i||n.lockedByAnotherProcess||!t.ready,onClick:()=>void C(n),children:[(0,Z.jsx)(D,{}),` Start`]}),(0,Z.jsxs)(ae,{children:[(0,Z.jsx)(re,{asChild:!0,children:(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:`size-11 md:size-10`,title:`More for ${n.name}`,"aria-label":`More for ${n.name}`,children:(0,Z.jsx)(a,{})})}),(0,Z.jsxs)(ie,{align:`end`,children:[(0,Z.jsxs)(G,{className:`min-h-11 md:min-h-0`,disabled:r||n.lockedByAnotherProcess||!!i,onSelect:()=>_({action:`wipe`,device:n}),children:[(0,Z.jsx)(x,{}),` Wipe data`]}),(0,Z.jsxs)(G,{variant:`destructive`,className:`min-h-11 md:min-h-0`,disabled:r||n.lockedByAnotherProcess||!!i||!t.canCreateAvd,onSelect:()=>_({action:`delete`,device:n}),children:[(0,Z.jsx)(c,{}),` Delete device`]})]})]})]})]},n.avdId)})})]}),(0,Z.jsx)(me,{open:m,onClose:()=>h(!1),existingNames:o.map(e=>e.name),onCreated:e=>{I.success(`Created ${e}`),b()}}),(0,Z.jsx)(he,{action:g?.action??null,avdId:g?.device.avdId??``,deviceName:g?.device.name??``,onCancel:()=>_(null),onDone:(e,t)=>{_(null),I.success(t),b()}})]})}var ve={low:`Low`,balanced:`Balanced`,high:`High`};function ye(e){let{send:t,controller:n,rotation:r,quality:i,onQualityChange:a,onKeyboard:o,layout:c}=e,[u,f]=(0,Y.useState)(!1),p=c===`bar`,m=p?`size-11`:`size-9`,h=e=>()=>t({type:`hardware`,key:e});return(0,Z.jsxs)(`div`,{className:R(`flex items-center gap-2`,be(p)),children:[(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:m,disabled:!n,onClick:h(`back`),title:`Back`,"aria-label":`Back`,children:(0,Z.jsx)(A,{})}),(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:m,disabled:!n,onClick:h(`home`),title:`Home`,"aria-label":`Home`,children:(0,Z.jsx)(s,{})}),(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:m,disabled:!n,onClick:h(`recent`),title:`Recent apps`,"aria-label":`Recent apps`,children:(0,Z.jsx)(l,{})}),(0,Z.jsx)(`span`,{className:`mx-1 h-6 w-px shrink-0 bg-border`,"aria-hidden":!0}),(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:m,disabled:!n,onClick:o,title:`Keyboard`,"aria-label":`Keyboard`,children:(0,Z.jsx)(j,{})}),(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:m,disabled:!n,onClick:()=>t({type:`rotate`,rotation:xe(r)}),title:`Rotate (now ${r}°)`,"aria-label":`Rotate`,children:(0,Z.jsx)(g,{})}),(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:m,disabled:!n,onClick:()=>f(e=>!e),title:`More keys`,"aria-label":`More keys`,"aria-expanded":u,children:(0,Z.jsx)(d,{})}),u&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:m,disabled:!n,onClick:h(`volume-up`),title:`Volume up`,"aria-label":`Volume up`,children:(0,Z.jsx)(k,{})}),(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:m,disabled:!n,onClick:h(`volume-down`),title:`Volume down`,"aria-label":`Volume down`,children:(0,Z.jsx)(w,{})}),(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:m,disabled:!n,onClick:h(`power`),title:`Power`,"aria-label":`Power`,children:(0,Z.jsx)(C,{})})]}),(0,Z.jsx)(`span`,{className:`flex-1`}),(0,Z.jsx)(`label`,{className:`sr-only`,htmlFor:`android-quality`,children:`Quality`}),(0,Z.jsx)(`select`,{id:`android-quality`,className:R(`rounded-md border bg-background px-2 text-sm`,p?`h-11`:`h-9`),value:i,disabled:!n,onChange:e=>a(e.target.value),children:Object.keys(ve).map(e=>(0,Z.jsx)(`option`,{value:e,children:ve[e]},e))})]})}function be(e){return e?`w-full justify-center border-t bg-background/95 px-3 py-2 backdrop-blur`:`px-2 py-1`}function xe(e){return(e+90)%360}function Se({deviceId:e}){let[t,n]=(0,Y.useState)(null),[i,a]=(0,Y.useState)(``),[o,s]=(0,Y.useState)(null),[c,l]=(0,Y.useState)(!1),[u,d]=(0,Y.useState)(null),f=(0,Y.useCallback)(async()=>{s(`read`),d(null);try{n((await L.get(`/api/android/devices/${encodeURIComponent(e)}/clipboard`)).text)}catch(e){d(e.message)}finally{s(null)}},[e]),p=(0,Y.useCallback)(async()=>{s(`write`),d(null);try{await L.post(`/api/android/devices/${encodeURIComponent(e)}/clipboard`,{text:i}),l(!0),setTimeout(()=>l(!1),1500)}catch(e){d(e.message)}finally{s(null)}},[e,i]);return(0,Z.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col gap-4 overflow-auto p-3`,children:[(0,Z.jsxs)(`section`,{className:`flex flex-col gap-2`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`h3`,{className:`flex-1 text-sm font-medium`,children:`From the device`}),(0,Z.jsxs)(V,{variant:`secondary`,className:`h-11 md:h-9`,onClick:()=>void f(),disabled:o!==null,children:[o===`read`?(0,Z.jsx)(N,{className:`animate-spin`}):(0,Z.jsx)(m,{}),` Read`]})]}),t!==null&&(0,Z.jsx)(`textarea`,{readOnly:!0,value:t,rows:3,placeholder:`(the device's clipboard is empty)`,className:`w-full resize-y rounded-md border bg-muted/40 p-2 font-mono text-xs`})]}),(0,Z.jsxs)(`section`,{className:`flex flex-col gap-2 border-t pt-3`,children:[(0,Z.jsx)(`h3`,{className:`text-sm font-medium`,children:`To the device`}),(0,Z.jsx)(`textarea`,{value:i,onChange:e=>a(e.target.value),rows:3,placeholder:`Text to put on the device's clipboard`,className:`w-full resize-y rounded-md border bg-background p-2 font-mono text-xs`}),(0,Z.jsxs)(V,{className:`h-11 self-start md:h-9`,onClick:()=>void p(),disabled:o!==null||i.length===0,children:[c?(0,Z.jsx)(r,{}):o===`write`?(0,Z.jsx)(N,{className:`animate-spin`}):(0,Z.jsx)(h,{}),c?`Sent`:`Send to device`]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Paste it in the guest with a long press, or with the keyboard's paste key.`})]}),u&&(0,Z.jsx)(`p`,{className:`text-sm text-destructive`,children:u})]})}function Ce(e,t,n){let r=new URLSearchParams({filename:t});return n&&r.set(`downgrade`,`1`),`/api/android/devices/${encodeURIComponent(e)}/apk?${r.toString()}`}function we(e,t){let n=null;try{n=JSON.parse(t)}catch{}let r=n;if(e>=200&&e<300&&r?.ok&&r.data?.operationId)return{operationId:r.data.operationId};throw Error(r?.error??(t.trim()||`the upload failed with HTTP ${e}`))}function Te(e){let t=new XMLHttpRequest,n=!1;return{done:new Promise((n,r)=>{t.open(`POST`,Ce(e.deviceId,e.file.name,e.allowDowngrade===!0)),e.token&&t.setRequestHeader(`Authorization`,`Bearer ${e.token}`),t.setRequestHeader(`Content-Type`,`application/vnd.android.package-archive`),t.setRequestHeader(`x-ppm-client`,`web`),t.upload.onprogress=t=>{t.lengthComputable&&e.onProgress&&e.onProgress(t.loaded/t.total)},t.onload=()=>{try{n(we(t.status,t.responseText).operationId)}catch(e){r(e)}},t.onerror=()=>r(Error(`the upload could not reach the server`)),t.onabort=()=>r(Error(`cancelled`)),t.send(e.file)}),cancel(){n||(n=!0,t.abort())}}}var Ee=800;function De({deviceId:e,deviceName:t}){let n=z(e=>e.projects),[r,i]=(0,Y.useState)(``),[a,o]=(0,Y.useState)(null),[s,c]=(0,Y.useState)(!1),[l,u]=(0,Y.useState)(!1),[d,f]=(0,Y.useState)({kind:`idle`}),p=(0,Y.useRef)(null),m=(0,Y.useRef)(null),g=(0,Y.useRef)(d);g.current=d;let _=d.kind===`uploading`||d.kind===`installing`,v=(0,Y.useCallback)(async(e,t)=>{for(;;){await new Promise(e=>setTimeout(e,Ee));let n=g.current;if(n.kind!==`installing`||n.operationId!==e)return;let r;try{r=await L.get(`/api/android/operations/${encodeURIComponent(e)}`)}catch(e){f({kind:`failed`,message:e.message});return}if(r.state===`succeeded`){f({kind:`done`,filename:t});return}if(r.state===`failed`){f({kind:`failed`,message:r.error??`the install failed`});return}if(r.state===`cancelled`){f({kind:`idle`});return}f({kind:`installing`,operationId:e,detail:r.detail,filename:t})}},[]),y=(0,Y.useCallback)(t=>{f({kind:`uploading`,fraction:0,filename:t.name});let n=Te({deviceId:e,file:t,allowDowngrade:l,token:F(),onProgress:e=>f({kind:`uploading`,fraction:e,filename:t.name})});m.current=n,n.done.then(e=>{m.current=null,f({kind:`installing`,operationId:e,detail:`installing…`,filename:t.name}),v(e,t.name)}).catch(e=>{m.current=null,f(e.message===`cancelled`?{kind:`idle`}:{kind:`failed`,message:e.message})})},[e,l,v]),b=(0,Y.useCallback)(async t=>{let n=t.split(`/`).pop()??t;f({kind:`installing`,operationId:``,detail:`starting…`,filename:n});try{let{operationId:i}=await L.post(`/api/android/devices/${encodeURIComponent(e)}/apk/project`,{project:r,path:t,downgrade:l});f({kind:`installing`,operationId:i,detail:`installing…`,filename:n}),v(i,n)}catch(e){f({kind:`failed`,message:e.message})}},[e,r,l,v]),x=(0,Y.useCallback)(()=>{if(d.kind===`uploading`){m.current?.cancel();return}d.kind===`installing`&&d.operationId&&(L.post(`/api/android/operations/${encodeURIComponent(d.operationId)}/cancel`,{}).catch(()=>{}),f({kind:`idle`}))},[d]),C=(0,Y.useCallback)(async e=>{if(!e){o(null);return}c(!0);try{o((await L.get(`/api/android/projects/${encodeURIComponent(e)}/apks`)).apks)}catch{o([])}finally{c(!1)}},[]);return(0,Y.useEffect)(()=>{C(r)},[r,C]),(0,Y.useEffect)(()=>()=>m.current?.cancel(),[]),(0,Z.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col gap-3 overflow-auto p-3`,children:[(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Installing on `,t,`.`]}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(`input`,{ref:p,type:`file`,accept:`.apk,application/vnd.android.package-archive`,className:`hidden`,onChange:e=>{let t=e.target.files?.[0];e.target.value=``,t&&y(t)}}),(0,Z.jsxs)(V,{className:`h-11 md:h-9`,disabled:_,onClick:()=>p.current?.click(),children:[(0,Z.jsx)(h,{}),` Choose an APK`]}),(0,Z.jsxs)(`label`,{className:`flex min-h-11 cursor-pointer items-center gap-2 text-sm md:min-h-9`,children:[(0,Z.jsx)(`input`,{type:`checkbox`,className:`size-4`,checked:l,disabled:_,onChange:e=>u(e.target.checked)}),`Allow downgrade`]})]}),(0,Z.jsx)(Oe,{phase:d,onCancel:x,onDismiss:()=>f({kind:`idle`})}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 border-t pt-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`label`,{className:`text-sm`,htmlFor:`android-apk-project`,children:`From a project`}),(0,Z.jsxs)(`select`,{id:`android-apk-project`,className:`h-11 min-w-0 flex-1 rounded-md border bg-background px-2 text-sm md:h-9`,value:r,onChange:e=>i(e.target.value),children:[(0,Z.jsx)(`option`,{value:``,children:`Choose a project…`}),n.map(e=>(0,Z.jsx)(`option`,{value:e.name,children:e.name},e.name))]}),r&&(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:`size-11 md:size-9`,disabled:s,onClick:()=>void C(r),title:`Rescan`,"aria-label":`Rescan`,children:s?(0,Z.jsx)(N,{className:`animate-spin`}):(0,Z.jsx)(S,{})})]}),s&&(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Looking for APKs…`}),!s&&a?.length===0&&(0,Z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No .apk files in that project yet — build one and press rescan.`}),!s&&a&&a.length>0&&(0,Z.jsx)(`ul`,{className:`flex flex-col gap-1`,children:a.map(e=>(0,Z.jsx)(`li`,{children:(0,Z.jsxs)(`button`,{type:`button`,disabled:_,onClick:()=>void b(e.path),className:R(`flex min-h-11 w-full flex-col items-start rounded-md border px-3 py-2 text-left text-sm md:min-h-9`,_?`opacity-50`:`hover:bg-accent`),children:[(0,Z.jsx)(`span`,{dir:`rtl`,className:`w-full truncate`,children:(0,Z.jsx)(`bdi`,{children:e.path})}),(0,Z.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[ke(e.bytes),` · `,new Date(e.modifiedAt).toLocaleString()]})]})},e.path))})]})]})}function Oe({phase:e,onCancel:t,onDismiss:n}){if(e.kind===`idle`)return null;if(e.kind===`uploading`||e.kind===`installing`){let n=e.kind===`uploading`?Math.round(e.fraction*100):null,r=e.kind===`installing`?e.detail:``;return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 rounded-md border p-3`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 text-sm`,children:[(0,Z.jsx)(N,{className:`size-4 shrink-0 animate-spin`}),(0,Z.jsx)(`span`,{dir:`rtl`,className:`min-w-0 flex-1 truncate`,children:(0,Z.jsx)(`bdi`,{children:e.filename})}),(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:`size-9`,onClick:t,title:`Cancel`,"aria-label":`Cancel`,children:(0,Z.jsx)(v,{})})]}),n===null?(0,Z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:r}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`div`,{className:`h-1.5 overflow-hidden rounded-full bg-muted`,children:(0,Z.jsx)(`div`,{className:`h-full bg-primary transition-[width]`,style:{width:`${n}%`}})}),(0,Z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Uploading — `,n,`%`]})]})]})}return e.kind===`done`?(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border border-emerald-600/40 bg-emerald-600/10 p-3 text-sm`,children:[(0,Z.jsx)(r,{className:`size-4 shrink-0 text-emerald-600 dark:text-emerald-400`}),(0,Z.jsx)(`span`,{dir:`rtl`,className:`min-w-0 flex-1 truncate`,children:(0,Z.jsx)(`bdi`,{children:e.filename})}),(0,Z.jsx)(`span`,{className:`shrink-0 text-muted-foreground`,children:`installed`}),(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:`size-9`,onClick:n,"aria-label":`Dismiss`,children:(0,Z.jsx)(v,{})})]}):(0,Z.jsxs)(`div`,{className:`flex items-start gap-2 rounded-md border border-destructive/40 bg-destructive/10 p-3 text-sm`,children:[(0,Z.jsx)(O,{className:`mt-0.5 size-4 shrink-0 text-destructive`}),(0,Z.jsx)(`span`,{className:`min-w-0 flex-1`,children:e.message}),(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:`size-9`,onClick:n,"aria-label":`Dismiss`,children:(0,Z.jsx)(v,{})})]})}function ke(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(0)} KB`:`${(e/1024/1024).toFixed(1)} MB`}var Ae=[`verbose`,`debug`,`info`,`warn`,`error`,`fatal`],je=new Map(Ae.map((e,t)=>[e,t]));function Me(e,t){return(je.get(e)??0)>=(je.get(t)??0)}var Ne={minimum:`verbose`,text:``,pid:0};function Pe(e,t){if(!Me(e.level,t.minimum)||t.pid!==0&&e.pid!==t.pid)return!1;let n=t.text.trim().toLowerCase();return n.length===0?!0:e.tag.toLowerCase().includes(n)||e.message.toLowerCase().includes(n)}function Fe(e,t,n){if(t.length===0)return e;let r=e.length>0?e[e.length-1].id:0,i=t[0].id>r?t:t.filter(e=>e.id>r);if(i.length===0)return e;let a=e.concat(i);return a.length>n?a.slice(a.length-n):a}function Ie(e){let t=new Date(e),n=(e,t=2)=>String(e).padStart(t,`0`);return`${n(t.getHours())}:${n(t.getMinutes())}:${n(t.getSeconds())}.${n(t.getMilliseconds(),3)}`}function Le(e){let t={verbose:`V`,debug:`D`,info:`I`,warn:`W`,error:`E`,fatal:`F`};return e.map(e=>`${Ie(e.timestamp)} ${String(e.pid).padStart(5)} ${String(e.tid).padStart(5)} ${t[e.level]} ${e.tag}: ${e.message}`).join(`
|
|
2
|
-
`)}var Re=1e3,ze=400,Q={verbose:`text-muted-foreground`,debug:`text-muted-foreground`,info:`text-foreground`,warn:`text-amber-600 dark:text-amber-400`,error:`text-destructive`,fatal:`text-destructive font-semibold`},Be={verbose:`V`,debug:`D`,info:`I`,warn:`W`,error:`E`,fatal:`F`};function Ve({setLogcat:e,onLog:t}){let[n,i]=(0,Y.useState)([]),[a,o]=(0,Y.useState)(Ne),[s,l]=(0,Y.useState)(!1),[u,d]=(0,Y.useState)(!1),[f,p]=(0,Y.useState)(!0),m=(0,Y.useRef)(null),h=(0,Y.useRef)(!1);h.current=s,(0,Y.useEffect)(()=>(e(!0),()=>e(!1)),[e]),(0,Y.useEffect)(()=>t(e=>{h.current||i(t=>Fe(t,e,Re))}),[t]);let g=(0,Y.useMemo)(()=>{let e=n.filter(e=>Pe(e,a));return e.length>ze?e.slice(e.length-ze):e},[n,a]);(0,Y.useEffect)(()=>{if(!f)return;let e=m.current;e&&(e.scrollTop=e.scrollHeight)},[g,f]);let _=(0,Y.useCallback)(()=>{let e=m.current;e&&p(e.scrollHeight-e.scrollTop-e.clientHeight<24)},[]),v=(0,Y.useCallback)(async()=>{let e=Le(g);try{navigator.clipboard?.writeText?await navigator.clipboard.writeText(e):He(e),d(!0),setTimeout(()=>d(!1),1500)}catch{He(e)}},[g]);return(0,Z.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col bg-background`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 border-b p-2`,children:[(0,Z.jsxs)(`div`,{className:`relative min-w-40 flex-1`,children:[(0,Z.jsx)(P,{className:`pointer-events-none absolute left-2 top-1/2 size-4 -translate-y-1/2 text-muted-foreground`}),(0,Z.jsx)(q,{className:`h-11 pl-8 md:h-9`,placeholder:`Filter tag or message`,value:a.text,onChange:e=>o(t=>({...t,text:e.target.value}))})]}),(0,Z.jsx)(`label`,{className:`sr-only`,htmlFor:`android-log-level`,children:`Minimum level`}),(0,Z.jsx)(`select`,{id:`android-log-level`,className:`h-11 rounded-md border bg-background px-2 text-sm md:h-9`,value:a.minimum,onChange:e=>o(t=>({...t,minimum:e.target.value})),children:Ae.map(e=>(0,Z.jsx)(`option`,{value:e,children:e[0].toUpperCase()+e.slice(1)},e))}),(0,Z.jsx)(V,{variant:s?`default`:`ghost`,size:`icon`,className:`size-11 md:size-9`,onClick:()=>l(e=>!e),title:s?`Resume`:`Pause the view`,"aria-label":s?`Resume`:`Pause the view`,"aria-pressed":s,children:s?(0,Z.jsx)(D,{}):(0,Z.jsx)(b,{})}),(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:`size-11 md:size-9`,onClick:()=>i([]),title:`Clear the view`,"aria-label":`Clear the view`,children:(0,Z.jsx)(c,{})}),(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:`size-11 md:size-9`,onClick:()=>void v(),title:`Copy what is shown`,"aria-label":`Copy what is shown`,children:u?(0,Z.jsx)(r,{}):(0,Z.jsx)(M,{})})]}),(0,Z.jsx)(`div`,{ref:m,onScroll:_,className:`min-h-0 flex-1 overflow-auto px-2 py-1 font-mono text-[11px] leading-[1.45]`,children:g.length===0?(0,Z.jsx)(`p`,{className:`px-2 py-6 text-center text-sm text-muted-foreground`,children:n.length===0?`Waiting for the device to log something…`:`Nothing matches that filter.`}):g.map(e=>(0,Z.jsxs)(`div`,{className:`flex gap-2 whitespace-pre-wrap break-words`,children:[(0,Z.jsx)(`span`,{className:`shrink-0 tabular-nums text-muted-foreground`,children:Ie(e.timestamp)}),(0,Z.jsx)(`span`,{className:R(`w-3 shrink-0 text-center font-semibold`,Q[e.level]),children:Be[e.level]}),e.tag&&(0,Z.jsx)(`button`,{type:`button`,className:`shrink-0 max-w-40 truncate text-left text-muted-foreground hover:underline`,title:`Filter by ${e.tag}`,onClick:()=>o(t=>({...t,text:e.tag})),children:e.tag}),(0,Z.jsx)(`span`,{className:R(`min-w-0`,Q[e.level]),children:e.message})]},e.id))}),(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 border-t px-2 py-1 text-xs text-muted-foreground`,children:[(0,Z.jsx)(`span`,{children:g.length===n.length?`${n.length} lines`:`${g.length} of ${n.length} lines`}),s&&(0,Z.jsx)(`span`,{className:`text-amber-600 dark:text-amber-400`,children:`paused`}),(0,Z.jsx)(`span`,{className:`flex-1`}),!f&&(0,Z.jsxs)(V,{variant:`ghost`,size:`sm`,className:`h-8`,onClick:()=>p(!0),children:[(0,Z.jsx)(E,{}),` Follow`]})]})]})}function He(e){let t=document.createElement(`textarea`);t.value=e,t.style.position=`fixed`,t.style.left=`-9999px`,t.setAttribute(`readonly`,``),document.body.appendChild(t);try{t.select(),document.execCommand(`copy`)}finally{t.remove()}}var Ue=[{id:`install`,label:`Install`,Icon:i},{id:`logs`,label:`Logs`,Icon:_},{id:`clipboard`,label:`Clipboard`,Icon:m}];function We(e){let{tool:t,onToolChange:n,onClose:r,deviceId:i,deviceName:a,setLogcat:o,onLog:s}=e;return(0,Z.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col border-t bg-background`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-1 border-b px-1`,children:[Ue.map(({id:e,label:r,Icon:i})=>(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>n(e),"aria-current":t===e,className:R(`flex min-h-11 items-center gap-1.5 border-b-2 px-3 text-sm md:min-h-9`,t===e?`border-primary font-medium text-foreground`:`border-transparent text-muted-foreground hover:text-foreground`),children:[(0,Z.jsx)(i,{className:`size-4`}),r]},e)),(0,Z.jsx)(`span`,{className:`flex-1`}),(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:`size-11 md:size-9`,onClick:r,title:`Hide the tools`,"aria-label":`Hide the tools`,children:(0,Z.jsx)(u,{})})]}),(0,Z.jsxs)(`div`,{className:`min-h-0 flex-1`,children:[t===`install`&&(0,Z.jsx)(De,{deviceId:i,deviceName:a}),t===`logs`&&(0,Z.jsx)(Ve,{setLogcat:o,onLog:s}),t===`clipboard`&&(0,Z.jsx)(Se,{deviceId:i})]})]})}function Ge(e,t){if(!e)return t;let n=e.match(/filename\*\s*=\s*UTF-8''([^;]+)/i);if(n?.[1])try{return decodeURIComponent(n[1].trim())||t}catch{}let r=(e.match(/filename\s*=\s*"([^"]*)"/i)??e.match(/filename\s*=\s*([^;]+)/i))?.[1]?.trim();return r&&r.length>0?r:t}function Ke(e){return`/api/android/devices/${encodeURIComponent(e)}/screenshot`}function qe(e,t){let n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(n),1e4)}async function Je(e,t,n){let r=await fetch(Ke(e),{headers:t?{Authorization:`Bearer ${t}`,"x-ppm-client":`web`}:{"x-ppm-client":`web`}});if(!r.ok){let e=`the screenshot failed with HTTP ${r.status}`;try{let t=await r.json();t?.error&&(e=t.error)}catch{}throw Error(e)}qe(await r.blob(),Ge(r.headers.get(`content-disposition`),n))}var Ye={deleteContentBackward:`Backspace`,deleteContentForward:`Delete`,insertLineBreak:`Enter`,insertParagraph:`Enter`},Xe=new Set([`Enter`,`Backspace`,`Delete`,`Tab`,`Escape`,`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`,`Home`,`End`,`PageUp`,`PageDown`]);function Ze(e){let{geometry:t,enabled:n,send:r}=e,i=(0,Y.useRef)(null),a=(0,Y.useRef)(t);a.current=t;let o=(0,Y.useRef)(n);return o.current=n,(0,Y.useEffect)(()=>{let e=i.current;if(!e)return;let t=e=>{let t=e;if(!o.current)return;t.preventDefault();let n=Ye[t.inputType];if(n){let e=a.current;e&&r({type:`key`,geometryGeneration:e.generation,key:n,action:`press`});return}let i=t.data??t.dataTransfer?.getData(`text/plain`)??``;i&&r(t.inputType===`insertFromPaste`?{type:`paste`,text:i}:{type:`text`,text:i})},n=e=>{if(!o.current||!Xe.has(e.key))return;e.preventDefault();let t=a.current;t&&r({type:`key`,geometryGeneration:t.generation,key:e.key,action:`press`})};return e.addEventListener(`beforeinput`,t),e.addEventListener(`keydown`,n),()=>{e.removeEventListener(`beforeinput`,t),e.removeEventListener(`keydown`,n)}},[r]),{inputRef:i,focus:(0,Y.useCallback)(()=>i.current?.focus(),[]),blur:(0,Y.useCallback)(()=>i.current?.blur(),[])}}function Qe(e,t,n=`8081`){let r=oe(`/ws/android`),i=e.protocol===`https:`?`wss:`:`ws:`;return t&&e.protocol!==`https:`?`ws://${e.hostname}:${n}${r}`:`${i}//${e.host}${r}`}function $e(e){let t=e instanceof Uint8Array?e:new Uint8Array(e);if(t.length<22)return null;let n=new DataView(t.buffer,t.byteOffset,t.byteLength),r=n.getUint8(1),i=n.getUint32(18,!0);return t.length-22===i?{header:{version:n.getUint8(0),keyframe:(r&1)!=0,codecConfig:(r&2)!=0,sessionGeneration:n.getUint16(2,!0),geometryGeneration:n.getUint16(4,!0),sequence:n.getUint32(6,!0),ptsMs:n.getFloat64(10,!0),payloadLength:i},payload:t.subarray(22)}:null}var et=5e3,$=[500,1e3,2e3,4e3,8e3];function tt(e){let{deviceId:t,quality:n,canvasRef:r,paused:i=!1}=e,[a,o]=(0,Y.useState)(`connecting`),[s,c]=(0,Y.useState)(null),[l,u]=(0,Y.useState)(null),[d,f]=(0,Y.useState)(!1),[p,m]=(0,Y.useState)(null),[h,g]=(0,Y.useState)(null),[_,v]=(0,Y.useState)(!1),y=se(r),b=(0,Y.useRef)(null),x=(0,Y.useRef)(0),S=(0,Y.useRef)(0),C=(0,Y.useRef)(null),w=(0,Y.useRef)(null),T=(0,Y.useRef)(n);T.current=n;let E=(0,Y.useRef)(!1),D=(0,Y.useRef)(new Set),O=(0,Y.useRef)(!1),k=(0,Y.useCallback)(e=>{let t=b.current;t?.readyState===WebSocket.OPEN&&t.send(JSON.stringify(e))},[]),A=(0,Y.useCallback)(()=>k({type:`take-control`}),[k]),j=(0,Y.useCallback)(e=>{switch(e.type){case`ready`:x.current=0,o(`live`),c(null),u(e.geometry),f(e.controller),m(null),g(e.encoder),e.codec&&(w.current=e.codec,y.configure(e.codec)),O.current&&k({type:`logcat`,subscribe:!0});return;case`log`:for(let t of D.current)t(e.entries);return;case`codec`:if(e.codec===w.current)return;w.current=e.codec,y.configure(e.codec);return;case`geometry`:u(e.geometry),y.reset(),v(!1);return;case`controller`:f(e.controller),m(e.reason??null);return;case`error`:c(e.message);return;default:return}},[y,k]),M=(0,Y.useCallback)(()=>{S.current+=1,C.current&&clearTimeout(C.current),C.current=null,b.current?.close(),b.current=null},[]),N=(0,Y.useCallback)(async()=>{M();let e=S.current,n=()=>S.current===e;c(null);let r;try{r=(await L.post(`/api/android/devices/${encodeURIComponent(t)}/sessions`,{})).nonce}catch(e){if(!n())return;c(e.message),o(`failed`);return}if(!n())return;let i=new WebSocket(Qe(window.location,!1));i.binaryType=`arraybuffer`,b.current=i,i.onopen=()=>{i.send(JSON.stringify({type:`auth`,nonce:r,quality:T.current}))},i.onmessage=e=>{if(!n())return;if(typeof e.data==`string`){try{j(JSON.parse(e.data))}catch{}return}let t=$e(e.data);!t||t.header.version!==1||ce(E.current,t.header.keyframe)&&(E.current=!0,v(!0),y.decodeAccessUnit(t.payload,t.header.keyframe))},i.onclose=()=>{if(!n())return;b.current=null;let e=$[Math.min(x.current,$.length-1)];x.current+=1,o(x.current>$.length?`failed`:`reconnecting`),E.current=!1,v(!1),y.reset(),w.current=null,C.current=setTimeout(()=>{N()},e)},i.onerror=()=>{}},[t,y,j,M]);(0,Y.useEffect)(()=>(N(),()=>{M(),y.reset()}),[t]),(0,Y.useEffect)(()=>{let e=setInterval(()=>k({type:`heartbeat`}),et);return()=>clearInterval(e)},[k]),(0,Y.useEffect)(()=>{k({type:`visibility`,visible:!i})},[i,k]),(0,Y.useEffect)(()=>{a===`live`&&k({type:`quality`,quality:n})},[n,a,k]);let P=(0,Y.useCallback)(e=>{O.current=e,k({type:`logcat`,subscribe:e})},[k]),F=(0,Y.useCallback)(e=>{let t=D.current;return t.add(e),()=>{t.delete(e)}},[]),I=(0,Y.useCallback)(()=>{x.current=0,o(`connecting`),N()},[N]);return{state:a,errorMessage:s??y.errorMessage,geometry:l,controller:d,controllerReason:p,encoder:h,hasPicture:_,send:k,takeControl:A,reconnect:I,setLogcat:P,onLog:F}}function nt(e,t,n){if(t<=0||n<=0||e.width<=0||e.height<=0)return{left:0,top:0,width:0,height:0,scale:0};let r=Math.min(e.width/t,e.height/n),i=t*r,a=n*r;return{left:(e.width-i)/2,top:(e.height-a)/2,width:i,height:a,scale:r}}function rt(e,t,n,r,i){let a=nt(e,t,n);if(a.scale<=0)return null;let o=(r-a.left)/a.scale,s=(i-a.top)/a.scale;return o<0||s<0||o>t||s>n?null:{x:Math.min(o,t-1),y:Math.min(s,n-1)}}function it(e,t){let{width:n,height:r,deviceWidth:i,deviceHeight:a,rotation:o}=t;if(n<=0||r<=0)return{x:0,y:0};let s=e.x/n,c=e.y/r,l,u;switch(o){case 90:l=1-c,u=s;break;case 180:l=1-s,u=1-c;break;case 270:l=c,u=1-s;break;default:l=s,u=c;break}return{x:Math.round(l*i),y:Math.round(u*a)}}function at(e,t,n,r){let i=rt(e,t.width,t.height,n,r);return i?it(i,t):null}var ot=1,st=10;function ct(e){let{canvasRef:t,geometry:n,enabled:r,send:i}=e,a=(0,Y.useRef)(new Map),o=(0,Y.useRef)(n);o.current=n;let s=(0,Y.useRef)(r);s.current=r;let c=(0,Y.useCallback)(e=>{let t=o.current;if(!t)return;let n=[...a.current.values()].map(e=>({x:e.x,y:e.y,id:e.slot,pressure:ot}));e&&n.push({x:e.x,y:e.y,id:e.slot,pressure:0}),n.length!==0&&i({type:`touch`,geometryGeneration:t.generation,touches:n})},[i]),l=(0,Y.useCallback)(e=>{let n=t.current,r=o.current;if(!n||!r)return null;let i=n.getBoundingClientRect();return at(i,r,e.clientX-i.left,e.clientY-i.top)},[t]),u=(0,Y.useCallback)(e=>{if(!s.current)return;let t=l(e);if(!t||a.current.size>=st)return;let n=new Set([...a.current.values()].map(e=>e.slot)),r=0;for(;n.has(r);)r++;a.current.set(e.pointerId,{slot:r,x:t.x,y:t.y});try{e.currentTarget.setPointerCapture(e.pointerId)}catch{}c()},[l,c]),d=(0,Y.useCallback)(e=>{let t=a.current.get(e.pointerId);if(!t||!s.current)return;let n=l(e);n&&(t.x=n.x,t.y=n.y),c()},[l,c]),f=(0,Y.useCallback)(e=>{let t=a.current.get(e.pointerId);if(t){a.current.delete(e.pointerId);try{e.currentTarget.releasePointerCapture(e.pointerId)}catch{}c(t)}},[c]);return(0,Y.useEffect)(()=>{let e=()=>{a.current.size!==0&&(a.current.clear(),i({type:`input-reset`}))};return window.addEventListener(`blur`,e),document.addEventListener(`visibilitychange`,e),()=>{window.removeEventListener(`blur`,e),document.removeEventListener(`visibilitychange`,e),e()}},[i]),{onPointerDown:u,onPointerMove:d,onPointerUp:f,onPointerCancel:f}}function lt({deviceId:e,deviceName:t,hidden:n=!1,onBack:r}){let i=(0,Y.useRef)(null),[a,s]=(0,Y.useState)(`balanced`),[c,l]=(0,Y.useState)(null),[u,d]=(0,Y.useState)(!1),[f,m]=(0,Y.useState)(null),h=tt({deviceId:e,quality:a,canvasRef:i,paused:n}),g=ct({canvasRef:i,geometry:h.geometry,enabled:h.controller,send:h.send}),_=Ze({geometry:h.geometry,enabled:h.controller,send:h.send});(0,Y.useEffect)(()=>{h.controller||_.blur()},[h.controller,_]);let v=h.geometry?.rotation??0,y=h.state===`connecting`||h.state===`reconnecting`,b=(0,Y.useCallback)(async()=>{d(!0),m(null);try{await Je(e,F(),`${t}.png`)}catch(e){m(e.message)}finally{d(!1)}},[e,t]);return(0,Z.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col bg-black`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-1 border-b bg-background px-1 py-1`,children:[r&&(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:`size-11 md:size-9`,onClick:r,title:`All devices`,"aria-label":`All devices`,children:(0,Z.jsx)(o,{})}),(0,Z.jsx)(`span`,{className:`min-w-0 flex-1 truncate px-1 text-sm font-medium`,children:t}),(0,Z.jsx)(V,{variant:`ghost`,size:`icon`,className:`size-11 md:size-9`,disabled:u,onClick:()=>void b(),title:`Save a screenshot`,"aria-label":`Save a screenshot`,children:u?(0,Z.jsx)(N,{className:`animate-spin`}):(0,Z.jsx)(T,{})}),Ue.map(({id:e,label:t,Icon:n})=>(0,Z.jsx)(V,{variant:c===e?`secondary`:`ghost`,size:`icon`,className:`size-11 md:size-9`,"aria-pressed":c===e,onClick:()=>l(t=>t===e?null:e),title:t,"aria-label":t,children:(0,Z.jsx)(n,{})},e))]}),f&&(0,Z.jsx)(`div`,{className:`bg-destructive/90 px-4 py-2 text-center text-sm text-white`,children:f}),!h.controller&&h.state===`live`&&(0,Z.jsxs)(`div`,{className:`flex items-center gap-2 border-b bg-background px-4 py-2 text-sm`,children:[(0,Z.jsx)(p,{className:`size-4 shrink-0 text-muted-foreground`}),(0,Z.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-muted-foreground`,children:h.controllerReason??`Someone else is controlling this device.`}),(0,Z.jsx)(V,{size:`sm`,onClick:h.takeControl,children:`Take control`})]}),(0,Z.jsxs)(`div`,{className:`relative flex min-h-0 flex-1 items-center justify-center overflow-hidden`,children:[(0,Z.jsx)(`canvas`,{ref:i,className:R(`max-h-full max-w-full touch-none select-none object-contain`,h.controller?`cursor-crosshair`:`cursor-default`),onPointerDown:e=>{g.onPointerDown(e),_.focus()},onPointerMove:g.onPointerMove,onPointerUp:g.onPointerUp,onPointerCancel:g.onPointerCancel}),!h.hasPicture&&(0,Z.jsx)(`div`,{className:`absolute inset-0 flex flex-col items-center justify-center gap-3 text-sm text-white/70`,children:h.state===`failed`?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(O,{className:`size-6`}),(0,Z.jsx)(`p`,{className:`max-w-xs px-6 text-center`,children:h.errorMessage??`Could not connect.`}),(0,Z.jsxs)(V,{size:`sm`,variant:`secondary`,onClick:h.reconnect,children:[(0,Z.jsx)(S,{}),` Try again`]})]}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(N,{className:`size-6 animate-spin`}),(0,Z.jsx)(`p`,{children:y?`Connecting to ${t}…`:`Waiting for the first frame…`})]})}),h.hasPicture&&h.errorMessage&&(0,Z.jsx)(`div`,{className:`absolute inset-x-0 top-0 bg-destructive/90 px-4 py-2 text-center text-sm text-white`,children:h.errorMessage})]}),(0,Z.jsx)(`textarea`,{ref:_.inputRef,className:`pointer-events-none absolute size-px opacity-0`,"aria-hidden":!0,tabIndex:-1,autoCapitalize:`off`,autoCorrect:`off`,autoComplete:`off`,spellCheck:!1,value:``,onChange:()=>{}}),c&&(0,Z.jsx)(`div`,{className:`h-[45%] min-h-0 shrink-0`,children:(0,Z.jsx)(We,{tool:c,onToolChange:l,onClose:()=>l(null),deviceId:e,deviceName:t,setLogcat:h.setLogcat,onLog:h.onLog})}),(0,Z.jsx)(ye,{layout:`bar`,send:h.send,controller:h.controller,rotation:v,quality:a,onQualityChange:s,onKeyboard:_.focus})]})}function ut({metadata:e,tabId:t}){let n=B(e=>e.updateTab),r=typeof e?.avdId==`string`?e.avdId:null,[i,a]=(0,Y.useState)(null),[o,s]=(0,Y.useState)(r!==null);(0,Y.useEffect)(()=>{if(!r){s(!1);return}let e=!1;return(async()=>{try{let{devices:t}=await L.get(`/api/android/devices`);if(e)return;a(t.find(e=>e.avdId===r&&e.runtime!==null)??null)}catch{e||a(null)}finally{e||s(!1)}})(),()=>{e=!0}},[r]);let c=(0,Y.useCallback)(r=>{a(r),t&&n(t,{title:r.name,metadata:{...e,avdId:r.avdId}})},[t,n,e]),l=(0,Y.useCallback)(()=>{a(null),t&&n(t,{title:`Android`,metadata:{...e,avdId:void 0}})},[t,n,e]);return o?(0,Z.jsx)(`div`,{className:`h-full`}):i?.runtime?(0,Z.jsx)(lt,{deviceId:i.runtime.deviceId,deviceName:i.name,onBack:l}):(0,Z.jsx)(_e,{onOpen:c})}export{ut as AndroidTab};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-CS1GvlOm.js";import{o as e,r as t}from"./api-client-OiA8Ida1.js";export{t as api,e as projectUrl};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t}from"./vendor-markdown-QKPNiWEd.js";import{vt as n}from"./vendor-ui-CS1GvlOm.js";var r=e(t(),1),i=e(n(),1);function a(e){if(!e||typeof document>`u`)return;let t=document.head||document.getElementsByTagName(`head`)[0],n=document.createElement(`style`);n.type=`text/css`,t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e))}var o=e=>{switch(e){case`success`:return ee;case`info`:return u;case`warning`:return l;case`error`:return te;default:return null}},s=Array(12).fill(0),c=({visible:e,className:t})=>r.createElement(`div`,{className:[`sonner-loading-wrapper`,t].filter(Boolean).join(` `),"data-visible":e},r.createElement(`div`,{className:`sonner-spinner`},s.map((e,t)=>r.createElement(`div`,{className:`sonner-loading-bar`,key:`spinner-bar-${t}`})))),ee=r.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`},r.createElement(`path`,{fillRule:`evenodd`,d:`M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z`,clipRule:`evenodd`})),l=r.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`currentColor`,height:`20`,width:`20`},r.createElement(`path`,{fillRule:`evenodd`,d:`M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z`,clipRule:`evenodd`})),u=r.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`},r.createElement(`path`,{fillRule:`evenodd`,d:`M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z`,clipRule:`evenodd`})),te=r.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`},r.createElement(`path`,{fillRule:`evenodd`,d:`M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z`,clipRule:`evenodd`})),d=r.createElement(`svg`,{xmlns:`http://www.w3.org/2000/svg`,width:`12`,height:`12`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,strokeLinejoin:`round`},r.createElement(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`}),r.createElement(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`})),ne=()=>{let[e,t]=r.useState(document.hidden);return r.useEffect(()=>{let e=()=>{t(document.hidden)};return document.addEventListener(`visibilitychange`,e),()=>window.removeEventListener(`visibilitychange`,e)},[]),e},f=1,p=new class{constructor(){this.subscribe=e=>(this.subscribers.push(e),()=>{let t=this.subscribers.indexOf(e);this.subscribers.splice(t,1)}),this.publish=e=>{this.subscribers.forEach(t=>t(e))},this.addToast=e=>{this.publish(e),this.toasts=[...this.toasts,e]},this.create=e=>{let{message:t,...n}=e,r=typeof e?.id==`number`||e.id?.length>0?e.id:f++,i=this.toasts.find(e=>e.id===r),a=e.dismissible===void 0?!0:e.dismissible;return this.dismissedToasts.has(r)&&this.dismissedToasts.delete(r),i?this.toasts=this.toasts.map(n=>n.id===r?(this.publish({...n,...e,id:r,title:t}),{...n,...e,id:r,dismissible:a,title:t}):n):this.addToast({title:t,...n,dismissible:a,id:r}),r},this.dismiss=e=>(e?(this.dismissedToasts.add(e),requestAnimationFrame(()=>this.subscribers.forEach(t=>t({id:e,dismiss:!0})))):this.toasts.forEach(e=>{this.subscribers.forEach(t=>t({id:e.id,dismiss:!0}))}),e),this.message=(e,t)=>this.create({...t,message:e}),this.error=(e,t)=>this.create({...t,message:e,type:`error`}),this.success=(e,t)=>this.create({...t,type:`success`,message:e}),this.info=(e,t)=>this.create({...t,type:`info`,message:e}),this.warning=(e,t)=>this.create({...t,type:`warning`,message:e}),this.loading=(e,t)=>this.create({...t,type:`loading`,message:e}),this.promise=(e,t)=>{if(!t)return;let n;t.loading!==void 0&&(n=this.create({...t,promise:e,type:`loading`,message:t.loading,description:typeof t.description==`function`?void 0:t.description}));let i=Promise.resolve(e instanceof Function?e():e),a=n!==void 0,o,s=i.then(async e=>{if(o=[`resolve`,e],r.isValidElement(e))a=!1,this.create({id:n,type:`default`,message:e});else if(m(e)&&!e.ok){a=!1;let i=typeof t.error==`function`?await t.error(`HTTP error! status: ${e.status}`):t.error,o=typeof t.description==`function`?await t.description(`HTTP error! status: ${e.status}`):t.description,s=typeof i==`object`&&!r.isValidElement(i)?i:{message:i};this.create({id:n,type:`error`,description:o,...s})}else if(e instanceof Error){a=!1;let i=typeof t.error==`function`?await t.error(e):t.error,o=typeof t.description==`function`?await t.description(e):t.description,s=typeof i==`object`&&!r.isValidElement(i)?i:{message:i};this.create({id:n,type:`error`,description:o,...s})}else if(t.success!==void 0){a=!1;let i=typeof t.success==`function`?await t.success(e):t.success,o=typeof t.description==`function`?await t.description(e):t.description,s=typeof i==`object`&&!r.isValidElement(i)?i:{message:i};this.create({id:n,type:`success`,description:o,...s})}}).catch(async e=>{if(o=[`reject`,e],t.error!==void 0){a=!1;let i=typeof t.error==`function`?await t.error(e):t.error,o=typeof t.description==`function`?await t.description(e):t.description,s=typeof i==`object`&&!r.isValidElement(i)?i:{message:i};this.create({id:n,type:`error`,description:o,...s})}}).finally(()=>{a&&(this.dismiss(n),n=void 0),t.finally==null||t.finally.call(t)}),c=()=>new Promise((e,t)=>s.then(()=>o[0]===`reject`?t(o[1]):e(o[1])).catch(t));return typeof n!=`string`&&typeof n!=`number`?{unwrap:c}:Object.assign(n,{unwrap:c})},this.custom=(e,t)=>{let n=t?.id||f++;return this.create({jsx:e(n),id:n,...t}),n},this.getActiveToasts=()=>this.toasts.filter(e=>!this.dismissedToasts.has(e.id)),this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}},re=(e,t)=>{let n=t?.id||f++;return p.addToast({title:e,...t,id:n}),n},m=e=>e&&typeof e==`object`&&`ok`in e&&typeof e.ok==`boolean`&&`status`in e&&typeof e.status==`number`,h=re,g=Object.assign(h,{success:p.success,info:p.info,warning:p.warning,error:p.error,custom:p.custom,message:p.message,promise:p.promise,dismiss:p.dismiss,loading:p.loading},{getHistory:()=>p.toasts,getToasts:()=>p.getActiveToasts()});a(`[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}`);function _(e){return e.label!==void 0}var ie=3,ae=`24px`,oe=`16px`,v=4e3,y=356,se=14,b=45,x=200;function S(...e){return e.filter(Boolean).join(` `)}function ce(e){let[t,n]=e.split(`-`),r=[];return t&&r.push(t),n&&r.push(n),r}var le=e=>{let{invert:t,toast:n,unstyled:i,interacting:a,setHeights:s,visibleToasts:ee,heights:l,index:u,toasts:te,expanded:f,removeToast:p,defaultRichColors:re,closeButton:m,style:h,cancelButtonStyle:g,actionButtonStyle:ie,className:ae=``,descriptionClassName:oe=``,duration:y,position:se,gap:le,expandByDefault:C,classNames:w,icons:T,closeButtonAriaLabel:ue=`Close toast`}=e,[E,D]=r.useState(null),[O,de]=r.useState(null),[k,A]=r.useState(!1),[j,M]=r.useState(!1),[N,P]=r.useState(!1),[fe,pe]=r.useState(!1),[me,he]=r.useState(!1),[F,I]=r.useState(0),[ge,L]=r.useState(0),R=r.useRef(n.duration||y||v),z=r.useRef(null),B=r.useRef(null),V=u===0,_e=u+1<=ee,H=n.type,U=n.dismissible!==!1,ve=n.className||``,ye=n.descriptionClassName||``,W=r.useMemo(()=>l.findIndex(e=>e.toastId===n.id)||0,[l,n.id]),be=r.useMemo(()=>n.closeButton??m,[n.closeButton,m]),xe=r.useMemo(()=>n.duration||y||v,[n.duration,y]),G=r.useRef(0),K=r.useRef(0),q=r.useRef(0),J=r.useRef(null),[Se,Ce]=se.split(`-`),we=r.useMemo(()=>l.reduce((e,t,n)=>n>=W?e:e+t.height,0),[l,W]),Te=ne(),Ee=n.invert||t,Y=H===`loading`;K.current=r.useMemo(()=>W*le+we,[W,we]),r.useEffect(()=>{R.current=xe},[xe]),r.useEffect(()=>{A(!0)},[]),r.useEffect(()=>{let e=B.current;if(e){let t=e.getBoundingClientRect().height;return L(t),s(e=>[{toastId:n.id,height:t,position:n.position},...e]),()=>s(e=>e.filter(e=>e.toastId!==n.id))}},[s,n.id]),r.useLayoutEffect(()=>{if(!k)return;let e=B.current,t=e.style.height;e.style.height=`auto`;let r=e.getBoundingClientRect().height;e.style.height=t,L(r),s(e=>e.find(e=>e.toastId===n.id)?e.map(e=>e.toastId===n.id?{...e,height:r}:e):[{toastId:n.id,height:r,position:n.position},...e])},[k,n.title,n.description,s,n.id,n.jsx,n.action,n.cancel]);let X=r.useCallback(()=>{M(!0),I(K.current),s(e=>e.filter(e=>e.toastId!==n.id)),setTimeout(()=>{p(n)},x)},[n,p,s,K]);r.useEffect(()=>{if(n.promise&&H===`loading`||n.duration===1/0||n.type===`loading`)return;let e;return f||a||Te?(()=>{if(q.current<G.current){let e=new Date().getTime()-G.current;R.current-=e}q.current=new Date().getTime()})():R.current!==1/0&&(G.current=new Date().getTime(),e=setTimeout(()=>{n.onAutoClose==null||n.onAutoClose.call(n,n),X()},R.current)),()=>clearTimeout(e)},[f,a,n,H,Te,X]),r.useEffect(()=>{n.delete&&(X(),n.onDismiss==null||n.onDismiss.call(n,n))},[X,n.delete]);function De(){return T?.loading?r.createElement(`div`,{className:S(w?.loader,n?.classNames?.loader,`sonner-loader`),"data-visible":H===`loading`},T.loading):r.createElement(c,{className:S(w?.loader,n?.classNames?.loader),visible:H===`loading`})}let Z=n.icon||T?.[H]||o(H);return r.createElement(`li`,{tabIndex:0,ref:B,className:S(ae,ve,w?.toast,n?.classNames?.toast,w?.default,w?.[H],n?.classNames?.[H]),"data-sonner-toast":``,"data-rich-colors":n.richColors??re,"data-styled":!(n.jsx||n.unstyled||i),"data-mounted":k,"data-promise":!!n.promise,"data-swiped":me,"data-removed":j,"data-visible":_e,"data-y-position":Se,"data-x-position":Ce,"data-index":u,"data-front":V,"data-swiping":N,"data-dismissible":U,"data-type":H,"data-invert":Ee,"data-swipe-out":fe,"data-swipe-direction":O,"data-expanded":!!(f||C&&k),"data-testid":n.testId,style:{"--index":u,"--toasts-before":u,"--z-index":te.length-u,"--offset":`${j?F:K.current}px`,"--initial-height":C?`auto`:`${ge}px`,...h,...n.style},onDragEnd:()=>{P(!1),D(null),J.current=null},onPointerDown:e=>{e.button!==2&&(Y||!U||(z.current=new Date,I(K.current),e.target.setPointerCapture(e.pointerId),e.target.tagName!==`BUTTON`&&(P(!0),J.current={x:e.clientX,y:e.clientY})))},onPointerUp:()=>{if(fe||!U)return;J.current=null;let e=Number(B.current?.style.getPropertyValue(`--swipe-amount-x`).replace(`px`,``)||0),t=Number(B.current?.style.getPropertyValue(`--swipe-amount-y`).replace(`px`,``)||0),r=new Date().getTime()-z.current?.getTime(),i=E===`x`?e:t,a=Math.abs(i)/r;if(Math.abs(i)>=b||a>.11){I(K.current),n.onDismiss==null||n.onDismiss.call(n,n),de(E===`x`?e>0?`right`:`left`:t>0?`down`:`up`),X(),pe(!0);return}else{var o,s;(o=B.current)==null||o.style.setProperty(`--swipe-amount-x`,`0px`),(s=B.current)==null||s.style.setProperty(`--swipe-amount-y`,`0px`)}he(!1),P(!1),D(null)},onPointerMove:t=>{var n,r;if(!J.current||!U||window.getSelection()?.toString().length>0)return;let i=t.clientY-J.current.y,a=t.clientX-J.current.x,o=e.swipeDirections??ce(se);!E&&(Math.abs(a)>1||Math.abs(i)>1)&&D(Math.abs(a)>Math.abs(i)?`x`:`y`);let s={x:0,y:0},c=e=>1/(1.5+Math.abs(e)/20);if(E===`y`){if(o.includes(`top`)||o.includes(`bottom`))if(o.includes(`top`)&&i<0||o.includes(`bottom`)&&i>0)s.y=i;else{let e=i*c(i);s.y=Math.abs(e)<Math.abs(i)?e:i}}else if(E===`x`&&(o.includes(`left`)||o.includes(`right`)))if(o.includes(`left`)&&a<0||o.includes(`right`)&&a>0)s.x=a;else{let e=a*c(a);s.x=Math.abs(e)<Math.abs(a)?e:a}(Math.abs(s.x)>0||Math.abs(s.y)>0)&&he(!0),(n=B.current)==null||n.style.setProperty(`--swipe-amount-x`,`${s.x}px`),(r=B.current)==null||r.style.setProperty(`--swipe-amount-y`,`${s.y}px`)}},be&&!n.jsx&&H!==`loading`?r.createElement(`button`,{"aria-label":ue,"data-disabled":Y,"data-close-button":!0,onClick:Y||!U?()=>{}:()=>{X(),n.onDismiss==null||n.onDismiss.call(n,n)},className:S(w?.closeButton,n?.classNames?.closeButton)},T?.close??d):null,(H||n.icon||n.promise)&&n.icon!==null&&(T?.[H]!==null||n.icon)?r.createElement(`div`,{"data-icon":``,className:S(w?.icon,n?.classNames?.icon)},n.promise||n.type===`loading`&&!n.icon?n.icon||De():null,n.type===`loading`?null:Z):null,r.createElement(`div`,{"data-content":``,className:S(w?.content,n?.classNames?.content)},r.createElement(`div`,{"data-title":``,className:S(w?.title,n?.classNames?.title)},n.jsx?n.jsx:typeof n.title==`function`?n.title():n.title),n.description?r.createElement(`div`,{"data-description":``,className:S(oe,ye,w?.description,n?.classNames?.description)},typeof n.description==`function`?n.description():n.description):null),r.isValidElement(n.cancel)?n.cancel:n.cancel&&_(n.cancel)?r.createElement(`button`,{"data-button":!0,"data-cancel":!0,style:n.cancelButtonStyle||g,onClick:e=>{_(n.cancel)&&U&&(n.cancel.onClick==null||n.cancel.onClick.call(n.cancel,e),X())},className:S(w?.cancelButton,n?.classNames?.cancelButton)},n.cancel.label):null,r.isValidElement(n.action)?n.action:n.action&&_(n.action)?r.createElement(`button`,{"data-button":!0,"data-action":!0,style:n.actionButtonStyle||ie,onClick:e=>{_(n.action)&&(n.action.onClick==null||n.action.onClick.call(n.action,e),!e.defaultPrevented&&X())},className:S(w?.actionButton,n?.classNames?.actionButton)},n.action.label):null)};function C(){if(typeof window>`u`||typeof document>`u`)return`ltr`;let e=document.documentElement.getAttribute(`dir`);return e===`auto`||!e?window.getComputedStyle(document.documentElement).direction:e}function w(e,t){let n={};return[e,t].forEach((e,t)=>{let r=t===1,i=r?`--mobile-offset`:`--offset`,a=r?oe:ae;function o(e){[`top`,`right`,`bottom`,`left`].forEach(t=>{n[`${i}-${t}`]=typeof e==`number`?`${e}px`:e})}typeof e==`number`||typeof e==`string`?o(e):typeof e==`object`?[`top`,`right`,`bottom`,`left`].forEach(t=>{e[t]===void 0?n[`${i}-${t}`]=a:n[`${i}-${t}`]=typeof e[t]==`number`?`${e[t]}px`:e[t]}):o(a)}),n}var T=r.forwardRef(function(e,t){let{id:n,invert:a,position:o=`bottom-right`,hotkey:s=[`altKey`,`KeyT`],expand:c,closeButton:ee,className:l,offset:u,mobileOffset:te,theme:d=`light`,richColors:ne,duration:f,style:re,visibleToasts:m=ie,toastOptions:h,dir:g=C(),gap:_=se,icons:ae,containerAriaLabel:oe=`Notifications`}=e,[v,b]=r.useState([]),x=r.useMemo(()=>n?v.filter(e=>e.toasterId===n):v.filter(e=>!e.toasterId),[v,n]),S=r.useMemo(()=>Array.from(new Set([o].concat(x.filter(e=>e.position).map(e=>e.position)))),[x,o]),[ce,T]=r.useState([]),[ue,E]=r.useState(!1),[D,O]=r.useState(!1),[de,k]=r.useState(d===`system`?typeof window<`u`&&window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:d),A=r.useRef(null),j=s.join(`+`).replace(/Key/g,``).replace(/Digit/g,``),M=r.useRef(null),N=r.useRef(!1),P=r.useCallback(e=>{b(t=>(t.find(t=>t.id===e.id)?.delete||p.dismiss(e.id),t.filter(({id:t})=>t!==e.id)))},[]);return r.useEffect(()=>p.subscribe(e=>{if(e.dismiss){requestAnimationFrame(()=>{b(t=>t.map(t=>t.id===e.id?{...t,delete:!0}:t))});return}setTimeout(()=>{i.flushSync(()=>{b(t=>{let n=t.findIndex(t=>t.id===e.id);return n===-1?[e,...t]:[...t.slice(0,n),{...t[n],...e},...t.slice(n+1)]})})})}),[v]),r.useEffect(()=>{if(d!==`system`){k(d);return}if(d===`system`&&(window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?k(`dark`):k(`light`)),typeof window>`u`)return;let e=window.matchMedia(`(prefers-color-scheme: dark)`);try{e.addEventListener(`change`,({matches:e})=>{k(e?`dark`:`light`)})}catch{e.addListener(({matches:e})=>{try{k(e?`dark`:`light`)}catch(e){console.error(e)}})}},[d]),r.useEffect(()=>{v.length<=1&&E(!1)},[v]),r.useEffect(()=>{let e=e=>{if(s.every(t=>e[t]||e.code===t)){var t;E(!0),(t=A.current)==null||t.focus()}e.code===`Escape`&&(document.activeElement===A.current||A.current?.contains(document.activeElement))&&E(!1)};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[s]),r.useEffect(()=>{if(A.current)return()=>{M.current&&(M.current.focus({preventScroll:!0}),M.current=null,N.current=!1)}},[A.current]),r.createElement(`section`,{ref:t,"aria-label":`${oe} ${j}`,tabIndex:-1,"aria-live":`polite`,"aria-relevant":`additions text`,"aria-atomic":`false`,suppressHydrationWarning:!0},S.map((t,n)=>{let[i,o]=t.split(`-`);return x.length?r.createElement(`ol`,{key:t,dir:g===`auto`?C():g,tabIndex:-1,ref:A,className:l,"data-sonner-toaster":!0,"data-sonner-theme":de,"data-y-position":i,"data-x-position":o,style:{"--front-toast-height":`${ce[0]?.height||0}px`,"--width":`${y}px`,"--gap":`${_}px`,...re,...w(u,te)},onBlur:e=>{N.current&&!e.currentTarget.contains(e.relatedTarget)&&(N.current=!1,M.current&&=(M.current.focus({preventScroll:!0}),null))},onFocus:e=>{e.target instanceof HTMLElement&&e.target.dataset.dismissible===`false`||N.current||(N.current=!0,M.current=e.relatedTarget)},onMouseEnter:()=>E(!0),onMouseMove:()=>E(!0),onMouseLeave:()=>{D||E(!1)},onDragEnd:()=>E(!1),onPointerDown:e=>{e.target instanceof HTMLElement&&e.target.dataset.dismissible===`false`||O(!0)},onPointerUp:()=>O(!1)},x.filter(e=>!e.position&&n===0||e.position===t).map((n,i)=>r.createElement(le,{key:n.id,icons:ae,index:i,toast:n,defaultRichColors:ne,duration:h?.duration??f,className:h?.className,descriptionClassName:h?.descriptionClassName,invert:a,visibleToasts:m,closeButton:h?.closeButton??ee,interacting:D,position:t,style:h?.style,unstyled:h?.unstyled,classNames:h?.classNames,cancelButtonStyle:h?.cancelButtonStyle,actionButtonStyle:h?.actionButtonStyle,closeButtonAriaLabel:h?.closeButtonAriaLabel,removeToast:P,toasts:x.filter(e=>e.position==n.position),heights:ce.filter(e=>e.position==n.position),setHeights:T,expandByDefault:c,gap:_,expanded:ue,swipeDirections:e.swipeDirections}))):null}))}),ue=`ppm-cache`,E=`kv`,D=1,O=new Map,de=1500,k=null;function A(){if(k)return k;let e=new Promise(t=>{let n=!1,r=e=>{if(n){e?.close();return}n=!0,clearTimeout(i),t(e)},i=setTimeout(()=>r(null),de);try{if(typeof indexedDB>`u`||!indexedDB){r(null);return}let t=indexedDB.open(ue,D);t.onupgradeneeded=()=>{try{t.result.objectStoreNames.contains(E)||t.result.createObjectStore(E)}catch{r(null)}},t.onsuccess=()=>{let n=t.result,i=()=>{k===e&&(k=null)};n.onversionchange=()=>{n.close(),i()},n.onclose=i,r(n)},t.onerror=()=>r(null),t.onblocked=()=>r(null)}catch{r(null)}});return k=e,e}function j(e){if(!(!e||e.v!==1))return{data:e.data,at:typeof e.at==`number`?e.at:0}}async function M(e){let t=await A();if(!t)return j(O.get(e));try{return j(await new Promise(n=>{let r=t.transaction(E,`readonly`).objectStore(E).get(e);r.onsuccess=()=>n(r.result),r.onerror=()=>n(void 0)}))}catch{return}}async function N(e){return(await M(e))?.data}async function P(e,t){let n={v:1,at:Date.now(),data:t},r=await A();if(!r){O.set(e,n);return}try{await new Promise(t=>{let i=r.transaction(E,`readwrite`);i.objectStore(E).put(n,e),i.oncomplete=()=>t(),i.onerror=()=>t(),i.onabort=()=>t()})}catch{}}async function fe(e){let t=await A();if(!t){O.delete(e);return}try{await new Promise(n=>{let r=t.transaction(E,`readwrite`);r.objectStore(E).delete(e),r.oncomplete=()=>n(),r.onerror=()=>n(),r.onabort=()=>n()})}catch{}}async function pe(e){let t=await A();if(!t){for(let t of[...O.keys()])t.startsWith(e)&&O.delete(t);return}try{await new Promise(n=>{let r=t.transaction(E,`readwrite`),i=r.objectStore(E),a=IDBKeyRange.bound(e,e+``),o=i.openCursor(a);o.onsuccess=()=>{let e=o.result;e&&(e.delete(),e.continue())},o.onerror=()=>n(),r.oncomplete=()=>n(),r.onabort=()=>n()})}catch{}}async function me(){O.clear();let e=await A();if(e)try{await new Promise(t=>{let n=e.transaction(E,`readwrite`);n.objectStore(E).clear(),n.oncomplete=()=>t(),n.onerror=()=>t(),n.onabort=()=>t()})}catch{}}function he(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,`0`)}function F(e){return he(`${e.name}\0${e.path}`)}function I(e,t){return`${e}:slash:${t}`}function ge(e){return`${e}:sessions`}function L(e){return`${e}:tags`}var R=`ppm-chat-providers:`;function z(e){return`${R}${e}`}var B=new Set,V=new Map;function _e(e,t){return e(t).catch(e=>{console.warn(`[browser-cache] project hydrator failed`,e)})}function H(e){if(!B.has(e)){B.add(e);for(let t of V.values())_e(e,t)}}function U(e){be(e);let t=F(e);return V.has(t)?Promise.resolve():(V.set(t,e),Promise.all([...B].map(t=>_e(t,e))).then(()=>void 0))}function ve(){V.clear()}function ye(e){V.delete(e)}var W=`ppm-last-project-ref`;function be(e){try{localStorage.setItem(W,JSON.stringify(e))}catch{}}function xe(){try{let e=localStorage.getItem(W);if(!e)return null;let t=JSON.parse(e);return typeof t.name==`string`&&typeof t.path==`string`?{name:t.name,path:t.path}:null}catch{return null}}var G=`ppm-chat-pref`;function K(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function q(e){if(!K(e)||typeof e.default_provider!=`string`)return null;let t=e.new_chat_provider_mode;if(t!==void 0&&t!==`default`&&t!==`follow-focus`)return null;let n={};if(K(e.providers))for(let[t,r]of Object.entries(e.providers))K(r)&&(n[t]=typeof r.permission_mode==`string`?{permission_mode:r.permission_mode}:{});return{default_provider:e.default_provider,new_chat_provider_mode:t,providers:n}}function J(){try{let e=localStorage.getItem(G);return e?q(JSON.parse(e)):null}catch{return null}}function Se(e){let t=q(e);if(t)try{localStorage.setItem(G,JSON.stringify(t))}catch{}}function Ce(e){if(!Array.isArray(e))return null;let t=[];for(let n of e)K(n)&&typeof n.id==`string`&&typeof n.name==`string`&&t.push({id:n.id,name:n.name});return t}function we(e){try{let t=localStorage.getItem(z(e));return t?Ce(JSON.parse(t)):null}catch{return null}}function Te(e,t){let n=Ce(t);if(n)try{localStorage.setItem(z(e),JSON.stringify(n))}catch{}}var Ee=new Set;function Y(e){Ee.add(e)}function X(){try{let e=[];for(let t=0;t<localStorage.length;t++){let n=localStorage.key(t);(n===`ppm-chat-pref`||n===`ppm-last-project-ref`||n?.startsWith(`ppm-chat-providers:`))&&e.push(n)}for(let t of e)localStorage.removeItem(t)}catch{}}async function De(){X(),ve();for(let e of Ee)try{e()}catch{}try{await me()}catch{}}var Z=`ppm-auth-token`,Oe=`ppm-auth-reload-ts`,ke=!1;function Ae(e){let t=e.headers.get(`x-ppm-audit-error`);!t||ke||(ke=!0,g.error(`Query audit log is not recording`,{description:t}))}var Q=new Map,je=3e4,Me=class extends Error{status;body;constructor(e,t,n){super(e),this.name=`ApiError`,this.status=t,this.body=n}get code(){let e=this.body?.code;return typeof e==`string`?e:void 0}},$=null;function Ne(e){$=e}function Pe(e){return e.reason??new DOMException(`Aborted`,`AbortError`)}var Fe=class{baseUrl;responseTimeoutMs;constructor(e=``,t=je){this.baseUrl=e,this.responseTimeoutMs=t}getToken(){return localStorage.getItem(Z)}headers(){let e={"Content-Type":`application/json`},t=this.getToken();return t&&(e.Authorization=`Bearer ${t}`),e[`x-ppm-client`]=`web`,e}get(e,t){if(t?.signal)return this.rawGet(e,t.signal);let n=`${this.baseUrl}${e}`,r=Q.get(n);if(r&&Date.now()-r.startedAt<this.responseTimeoutMs)return r.promise;let i=this.rawGet(e).finally(()=>{Q.get(n)?.promise===i&&Q.delete(n)});return Q.set(n,{promise:i,startedAt:Date.now()}),i}async rawGet(e,t){if(t?.aborted)throw Pe(t);let n=new AbortController,r=()=>n.abort(Pe(t));t?.addEventListener(`abort`,r,{once:!0});let i=async()=>{let t=setTimeout(()=>n.abort(new DOMException(`No response after ${this.responseTimeoutMs}ms: ${e}`,`TimeoutError`)),this.responseTimeoutMs);try{return await fetch(`${this.baseUrl}${e}`,{headers:this.headers(),signal:n.signal})}finally{clearTimeout(t)}};try{return await this.settle(await i(),i)}finally{t?.removeEventListener(`abort`,r)}}async post(e,t,n){return this.send(`POST`,e,t,n)}async put(e,t){return this.send(`PUT`,e,t)}async patch(e,t){return this.send(`PATCH`,e,t)}async del(e,t){await this.send(`DELETE`,e,t)}async postStream(e,t,n){let r=()=>fetch(`${this.baseUrl}${e}`,{method:`POST`,headers:this.headers(),body:JSON.stringify(t),signal:n?.signal}),i=await this.withDbLogin(await r(),r,n);if(i.ok&&i.body)return Ae(i),i;throw await this.handleResponse(i),Error(i.ok?`Empty response from server`:`Server error (HTTP ${i.status})`)}async send(e,t,n,r){let i=()=>fetch(`${this.baseUrl}${t}`,{method:e,headers:this.headers(),body:n==null?void 0:JSON.stringify(n),signal:r?.signal});return this.settle(await i(),i,r)}async settle(e,t,n){return this.handleResponse(await this.withDbLogin(e,t,n))}async withDbLogin(e,t,n){if(e.status===428&&n?.dbLogin!==!1&&$){let n=await e.clone().json().catch(()=>null);if(n?.code===`DB_LOGIN_REQUIRED`&&await $(n))return t()}return e}async handleResponse(e){if(Ae(e),e.status===401){ze();let e=Number(sessionStorage.getItem(Oe)||`0`);throw Date.now()-e>3e3&&(sessionStorage.setItem(Oe,String(Date.now())),window.location.reload()),Error(`Unauthorized`)}let t;try{t=await e.json()}catch{throw new Me(e.ok?`Empty response from server`:`Server error (HTTP ${e.status})`,e.status,null)}if(t.ok===!1)throw new Me(t.error??`HTTP ${e.status}`,e.status,t);return t.data}},Ie=new Fe;function Le(e){return`/api/project/${encodeURIComponent(e)}`}function Re(e){localStorage.setItem(Z,e)}function ze(){localStorage.removeItem(Z),De()}function Be(){return localStorage.getItem(Z)}export{fe as C,P as D,M as E,T as O,L as S,N as T,H as _,Be as a,ge as b,Ne as c,we as d,Se as f,xe as g,U as h,ze as i,g as k,Y as l,ye as m,Me as n,Le as o,Te as p,Ie as r,Re as s,Fe as t,J as u,F as v,pe as w,I as x,z as y};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{f as e,r as t}from"./api-client-OiA8Ida1.js";import{r as n}from"./chat-preparation-cache-CRX9WAK5.js";function r(){return t.get(`/api/accounts`)}function i(){return t.get(`/api/accounts/active`)}function a(e,n){if(e!==`claude`&&e!==`codex`)return Promise.resolve(null);let r=e===`codex`?`/api/codex-accounts/pick`:`/api/accounts/pick`;return t.post(r,void 0,{signal:n})}function o(e){return t.post(`/api/accounts`,e)}function s(e){return t.del(`/api/accounts/${e}`)}function c(e,n){return t.patch(`/api/accounts/${e}`,n)}function l(){return t.get(`/api/accounts/settings`)}function u(e){return t.put(`/api/accounts/settings`,e)}function d(){return t.get(`/api/accounts/oauth/url`)}function f(e,n){return t.post(`/api/accounts/oauth/exchange`,{code:e,state:n})}function p(){return t.get(`/api/accounts/usage`)}function m(e){return t.get(`/api/accounts/${e}/usage-history`)}function h(e){return t.post(`/api/accounts/import`,e)}function g(e,n=!1){return t.post(`/api/accounts/${e}/test-token`,{testRefresh:n})}function _(e,n=!1){return t.post(`/api/accounts/test-export`,{accountIds:e,includeRefreshToken:n})}function v(e){return t.post(`/api/accounts/test-raw-token`,{token:e})}function y(e){return t.put(`/api/settings/device-name`,{device_name:e})}function b(){return t.get(`/api/settings/ai`)}function x(r){return t.put(`/api/settings/ai`,r).then(t=>(n(),e(t),t))}function S(){return t.get(`/api/settings/proxy`)}function C(e){return t.put(`/api/settings/proxy`,e)}function w(){return t.get(`/api/settings/query-audit`)}function T(e){return t.put(`/api/settings/query-audit`,e)}function E(){return t.del(`/api/settings/query-audit/logs`)}export{C,y as S,g as _,b as a,x as b,i as c,S as d,w as f,a as g,c as h,f as i,p as l,h as m,E as n,l as o,m as p,s as r,r as s,o as t,d as u,_ as v,T as w,u as x,v as y};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-CS1GvlOm.js";import"./api-client-OiA8Ida1.js";import"./chat-preparation-cache-CRX9WAK5.js";import{S as e}from"./api-settings-D2H6gjen.js";export{e as updateDeviceName};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-CS1GvlOm.js";import{a as e}from"./api-client-OiA8Ida1.js";function t(t=!1){let n=e();return{...t?{"Content-Type":`application/json`}:{},...n?{Authorization:`Bearer ${n}`}:{}}}async function n(e){let t=await e.json();if(!t.ok)throw Error(t.error||`Request failed (${e.status})`);return t.data}async function r(){return n(await fetch(`/api/settings/themes`,{headers:t()}))}async function i(e){return(await n(await fetch(`/api/settings/themes`,{method:`POST`,headers:t(!0),body:JSON.stringify(e)}))).themes}async function a(e){await n(await fetch(`/api/settings/themes/${encodeURIComponent(e)}`,{method:`DELETE`,headers:t()}))}export{a as deleteImportedTheme,r as fetchImportedThemes,i as importTheme};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import{c as r,l as i,s as a,u as o}from"./vendor-ui-CS1GvlOm.js";import{A as s,Kr as c,cr as l,si as u}from"./icons-JMA45Ifw.js";import{k as d}from"./api-client-OiA8Ida1.js";import{t as f}from"./settings-store-WeJyQVL8.js";import{n as p}from"./utils-Bslrbb-G.js";import"./portal-container-context-BXAsDqrB.js";import{n as m}from"./use-is-mobile-BXHbkfs9.js";import{r as h,t as g}from"./button-Br60hGkw.js";import{a as _,i as v,n as y,o as b,r as x,t as S}from"./dialog-DOaEX6AK.js";import{t as C}from"./input-CKGoVpYv.js";import{n as w,r as T,t as E}from"./resolve-theme-BqoL27BW.js";import{Hn as D,it as O,ni as k,st as A}from"./index-ItT-dTPV.js";import{t as j}from"./separator-BOYUIPkH.js";var M=n();function N(){let e=f(e=>e.themeStyle),t=f(e=>e.themeMode),n=f(e=>e.customThemeId),r=f(e=>e.customThemes),i=f(e=>e.setThemeStyle),a=f(e=>e.setThemeMode),o=E(e,t,r,n);return(0,M.jsx)(`div`,{className:`grid grid-cols-2 gap-2`,children:w.map(e=>{let t=T[e];if(!t)return null;let n=o.id===e;return(0,M.jsxs)(`button`,{onClick:()=>{i(t.style),a(t.mode)},className:p(`relative flex items-center gap-2 rounded-lg border p-2 text-left transition-colors min-h-11`,n?`border-primary ring-[3px] ring-accent-wash`:`border-border hover:bg-accent/40`),children:[(0,M.jsx)(A,{swatch:t.swatch}),(0,M.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,M.jsx)(`span`,{className:`block truncate text-xs font-medium text-text`,children:t.name.replace(/ (Dark|Light)$/,``)}),(0,M.jsx)(`span`,{className:`block text-[10px] text-text-3 capitalize`,children:t.mode})]}),n&&(0,M.jsx)(s,{className:`absolute top-1 right-1 size-3.5 text-primary`})]},e)})})}var P=e(t(),1);function F({className:e,orientation:t=`horizontal`,...n}){return(0,M.jsx)(i,{"data-slot":`tabs`,"data-orientation":t,orientation:t,className:p(`group/tabs flex gap-2 data-[orientation=horizontal]:flex-col`,e),...n})}var I=h(`group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none`,{variants:{variant:{default:`bg-muted`,line:`gap-1 bg-transparent`}},defaultVariants:{variant:`default`}});function L({className:e,variant:t=`default`,...n}){return(0,M.jsx)(r,{"data-slot":`tabs-list`,"data-variant":t,className:p(I({variant:t}),e),...n})}function R({className:e,...t}){return(0,M.jsx)(o,{"data-slot":`tabs-trigger`,className:p(`relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap text-foreground/60 transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,`group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent`,`data-[state=active]:bg-background data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 dark:data-[state=active]:text-foreground`,`after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100`,e),...t})}function z({className:e,...t}){return(0,M.jsx)(a,{"data-slot":`tabs-content`,className:p(`flex-1 outline-none`,e),...t})}function B({open:e,onOpenChange:t}){let n=f(e=>e.importThemeFrom),r=f(e=>e.setCustomTheme),[i,a]=(0,P.useState)(`url`),[o,s]=(0,P.useState)(``),[c,l]=(0,P.useState)(``),[u,p]=(0,P.useState)(``),[m,h]=(0,P.useState)(!1),w=()=>{s(``),l(``),p(``),a(`url`)},T=async()=>{let e=i===`url`?o.trim():c.trim();if(!e){d.error(`Nothing to import`);return}h(!0);try{let a=await n({source:i===`url`?`url`:i===`upload`?`upload`:`json`,value:e,name:u.trim()||void 0});d.success(a.length>1?`Imported ${a.length} themes`:`Imported "${a[0]?.name}"`),a[0]&&r(a[0].id),w(),t(!1)}catch(e){d.error(e.message||`Import failed`)}finally{h(!1)}},E=async e=>{if(e)try{l(await e.text()),p(e.name.replace(/\.json$/i,``))}catch{d.error(`Could not read file`)}};return(0,M.jsx)(S,{open:e,onOpenChange:t,children:(0,M.jsxs)(y,{className:`max-w-md`,children:[(0,M.jsxs)(_,{children:[(0,M.jsx)(b,{children:`Import theme`}),(0,M.jsx)(x,{className:`text-text-3`,children:`Import a VSCode color theme. Single-mode themes apply to both dark and light.`})]}),(0,M.jsxs)(F,{value:i,onValueChange:e=>a(e),children:[(0,M.jsxs)(L,{className:`w-full`,children:[(0,M.jsx)(R,{value:`url`,className:`flex-1`,children:`URL`}),(0,M.jsx)(R,{value:`json`,className:`flex-1`,children:`Paste JSON`}),(0,M.jsx)(R,{value:`upload`,className:`flex-1`,children:`Upload`})]}),(0,M.jsxs)(z,{value:`url`,className:`space-y-2 pt-2`,children:[(0,M.jsx)(C,{placeholder:`https://…/theme.json or Marketplace .vsix URL`,value:o,onChange:e=>s(e.target.value)}),(0,M.jsx)(`p`,{className:`text-[11px] text-text-3`,children:`Only https URLs; private/internal addresses are blocked.`})]}),(0,M.jsx)(z,{value:`json`,className:`pt-2`,children:(0,M.jsx)(`textarea`,{className:`w-full h-40 rounded-md border border-border bg-surface p-2 text-xs font-mono text-text focus:outline-none focus:border-ring`,placeholder:`{ "name": "My Theme", "type": "dark", "colors": { … }, "tokenColors": [ … ] }`,value:c,onChange:e=>l(e.target.value)})}),(0,M.jsxs)(z,{value:`upload`,className:`space-y-2 pt-2`,children:[(0,M.jsx)(`input`,{type:`file`,accept:`.json,application/json`,onChange:e=>E(e.target.files?.[0]),className:`block w-full text-xs text-text-2 file:mr-3 file:rounded file:border file:border-border file:bg-panel-2 file:px-2 file:py-1 file:text-text`}),c&&(0,M.jsxs)(`p`,{className:`text-[11px] text-success`,children:[`File loaded (`,c.length,` chars)`]})]})]}),(0,M.jsx)(C,{placeholder:`Optional name`,value:u,onChange:e=>p(e.target.value)}),(0,M.jsxs)(v,{children:[(0,M.jsx)(g,{variant:`outline`,onClick:()=>t(!1),disabled:m,children:`Cancel`}),(0,M.jsx)(g,{onClick:T,disabled:m,children:m?`Importing…`:`Import`})]})]})})}function V(){let e=f(e=>e.customThemes),t=f(e=>e.themeStyle),n=f(e=>e.customThemeId),r=f(e=>e.setCustomTheme),i=f(e=>e.deleteCustomTheme),[a,o]=(0,P.useState)(!1);return(0,M.jsxs)(`section`,{className:`space-y-2`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,M.jsx)(`h3`,{className:`text-xs font-medium text-muted-foreground`,children:`Imported themes`}),(0,M.jsxs)(g,{size:`sm`,variant:`outline`,className:`h-7 gap-1 text-xs`,onClick:()=>o(!0),children:[(0,M.jsx)(l,{className:`size-3.5`}),` Import`]})]}),e.length===0?(0,M.jsx)(`p`,{className:`text-[11px] text-text-3`,children:`No imported themes yet. Import a VSCode theme from a URL, .vsix, or JSON.`}):(0,M.jsx)(`ul`,{className:`space-y-1`,children:e.map(e=>{let a=t===`custom`&&n===e.id;return(0,M.jsxs)(`li`,{className:p(`flex items-center gap-2 rounded-md border px-2 py-1.5`,a?`border-primary bg-primary/10`:`border-border`),children:[(0,M.jsx)(A,{swatch:e.swatch}),(0,M.jsxs)(`button`,{className:`flex-1 min-w-0 text-left`,onClick:()=>r(e.id),children:[(0,M.jsx)(`span`,{className:`block truncate text-xs text-text`,children:e.name}),(0,M.jsx)(`span`,{className:`block text-[10px] text-text-3`,children:e.mode})]}),a&&(0,M.jsx)(s,{className:`size-4 text-primary shrink-0`}),(0,M.jsx)(`button`,{className:`text-text-3 hover:text-error transition-colors shrink-0`,title:`Delete`,onClick:()=>void i(e.id),children:(0,M.jsx)(c,{className:`size-3.5`})})]},e.id)})}),(0,M.jsx)(B,{open:a,onOpenChange:o})]})}var H=[{value:`default`,label:`Default`},{value:`boxed`,label:`Boxed`},{value:`pill`,label:`Pill`}],U=[{value:`auto`,label:`Auto`},{value:`windows`,label:`Windows`},{value:`macos`,label:`macOS`}];function W({options:e,value:t,onChange:n}){return(0,M.jsx)(`div`,{className:`flex gap-2`,children:e.map(e=>(0,M.jsx)(g,{variant:t===e.value?`default`:`outline`,onClick:()=>n(e.value),className:p(`flex-1 cursor-pointer`,t===e.value&&`ring-2 ring-primary`),children:e.label},e.value))})}function G(){let{theme:e,setTheme:t,tabWrap:n,toggleTabWrap:r,editorTabStyle:i,setEditorTabStyle:a,explorerSkin:o,setExplorerSkin:s}=f(k(e=>({theme:e.themeMode,setTheme:e.setThemeMode,tabWrap:e.tabWrap,toggleTabWrap:e.toggleTabWrap,editorTabStyle:e.editorTabStyle,setEditorTabStyle:e.setEditorTabStyle,explorerSkin:e.explorerSkin,setExplorerSkin:e.setExplorerSkin}))),{wordWrap:c,toggleWordWrap:l,mobileWordWrap:d,toggleMobileWordWrap:h}=f(k(e=>({wordWrap:e.wordWrap,toggleWordWrap:e.toggleWordWrap,mobileWordWrap:e.mobileWordWrap,toggleMobileWordWrap:e.toggleMobileWordWrap}))),_=m();return(0,M.jsxs)(`div`,{className:`space-y-6`,children:[(0,M.jsxs)(`section`,{className:`space-y-3`,children:[(0,M.jsx)(`h3`,{className:`text-sm font-medium`,children:`Theme`}),(0,M.jsx)(N,{}),(0,M.jsx)(`div`,{className:`flex gap-2`,children:O.map(n=>{let r=n.icon;return(0,M.jsxs)(g,{variant:e===n.value?`default`:`outline`,onClick:()=>t(n.value),className:p(`flex-1 gap-2 cursor-pointer`,e===n.value&&`ring-2 ring-primary`),children:[(0,M.jsx)(r,{className:`size-4`}),n.label]},n.value)})})]}),(0,M.jsx)(j,{}),(0,M.jsx)(V,{}),(0,M.jsx)(j,{}),(0,M.jsxs)(`section`,{className:`flex items-center justify-between gap-4`,children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-3 min-w-0`,children:[(0,M.jsx)(u,{className:`size-4 text-muted-foreground shrink-0`}),(0,M.jsxs)(`div`,{className:`min-w-0`,children:[(0,M.jsx)(`p`,{className:`text-sm font-medium`,children:`Wrap Tabs`}),(0,M.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Stack tabs in rows instead of scrolling`})]})]}),(0,M.jsx)(D,{checked:n,onCheckedChange:r})]}),(0,M.jsxs)(`section`,{className:`flex items-center justify-between gap-4`,children:[(0,M.jsxs)(`div`,{className:`flex items-center gap-3 min-w-0`,children:[(0,M.jsx)(u,{className:`size-4 text-muted-foreground shrink-0`}),(0,M.jsxs)(`div`,{className:`min-w-0`,children:[(0,M.jsx)(`p`,{className:`text-sm font-medium`,children:`Word Wrap`}),(0,M.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:_?`Wrap long lines instead of scrolling sideways (this device)`:`Wrap long lines in the editor (Alt+Z)`})]})]}),(0,M.jsx)(D,{checked:_?d:c,onCheckedChange:()=>_?h():l()})]}),(0,M.jsxs)(`section`,{className:`space-y-2`,children:[(0,M.jsx)(`h3`,{className:`text-sm font-medium`,children:`Tab Style`}),(0,M.jsx)(W,{options:H,value:i,onChange:a})]}),(0,M.jsxs)(`section`,{className:`space-y-2`,children:[(0,M.jsx)(`h3`,{className:`text-sm font-medium`,children:`Explorer Skin`}),(0,M.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Chrome the OS File Explorer window wears. Auto follows the host platform.`}),(0,M.jsx)(W,{options:U,value:o,onChange:s})]})]})}export{G as AppearanceSettingsSection};
|
|
Binary file
|
|
Binary file
|