@hienlh/ppm 0.23.11 → 0.23.12
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 +18 -0
- package/CLAUDE.md +13 -2
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/cli-reference.md +4 -4
- package/assets/skills/ppm/references/http-api.md +37 -1
- package/bun.lock +34 -0
- package/dist/web/assets/accounts-settings-section-CGe5ikvs.js +1 -0
- package/dist/web/assets/accounts-settings-section-CGe5ikvs.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-CGe5ikvs.js.gz +0 -0
- package/dist/web/assets/{agent-session-sheet-CBMsnl_p.js → agent-session-sheet-vBhfHYrC.js} +2 -2
- package/dist/web/assets/agent-session-sheet-vBhfHYrC.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-vBhfHYrC.js.gz +0 -0
- package/dist/web/assets/{agent-session-window-content-D9C9FA7E.js → agent-session-window-content-BxIxDN5i.js} +1 -1
- package/dist/web/assets/agent-session-window-content-BxIxDN5i.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-BxIxDN5i.js.gz +0 -0
- package/dist/web/assets/{ai-resource-editor-DhUVgDEG.js → ai-resource-editor-Y8clBPRv.js} +1 -1
- package/dist/web/assets/ai-resource-editor-Y8clBPRv.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-Y8clBPRv.js.gz +0 -0
- package/dist/web/assets/{ai-settings-section-DOckWvp4.js → ai-settings-section-BB8vscte.js} +1 -1
- package/dist/web/assets/{ai-settings-section-CETpSpYd.js → ai-settings-section-Ck8uN_Bw.js} +1 -1
- package/dist/web/assets/ai-settings-section-Ck8uN_Bw.js.br +0 -0
- package/dist/web/assets/ai-settings-section-Ck8uN_Bw.js.gz +0 -0
- package/dist/web/assets/android-tab-BIOUVVoW.js +2 -0
- package/dist/web/assets/android-tab-BIOUVVoW.js.br +0 -0
- package/dist/web/assets/android-tab-BIOUVVoW.js.gz +0 -0
- package/dist/web/assets/{api-settings-JIgKfcCx.js → api-settings-D1axn9vm.js} +1 -1
- package/dist/web/assets/{appearance-settings-section-BJUiLUb7.js → appearance-settings-section-Bv5_n9lH.js} +1 -1
- package/dist/web/assets/appearance-settings-section-Bv5_n9lH.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-Bv5_n9lH.js.gz +0 -0
- package/dist/web/assets/{apps-panel-1VElRgV3.js → apps-panel-DXHF0QEv.js} +1 -1
- package/dist/web/assets/apps-panel-DXHF0QEv.js.br +0 -0
- package/dist/web/assets/apps-panel-DXHF0QEv.js.gz +0 -0
- package/dist/web/assets/{audio-preview-DYkyHu5X.js → audio-preview-DpjOKEm4.js} +1 -1
- package/dist/web/assets/audio-preview-DpjOKEm4.js.br +0 -0
- package/dist/web/assets/audio-preview-DpjOKEm4.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-4dgMNadQ.js +1 -0
- package/dist/web/assets/branch-review-tab-4dgMNadQ.js.br +0 -0
- package/dist/web/assets/branch-review-tab-4dgMNadQ.js.gz +0 -0
- package/dist/web/assets/chat-tab-Bbe_77oJ.js +15 -0
- package/dist/web/assets/chat-tab-Bbe_77oJ.js.br +0 -0
- package/dist/web/assets/chat-tab-Bbe_77oJ.js.gz +0 -0
- package/dist/web/assets/chat-tab-D3i5O3dO.js +1 -0
- package/dist/web/assets/chat-tab-D3i5O3dO.js.br +0 -0
- package/dist/web/assets/chat-tab-D3i5O3dO.js.gz +0 -0
- package/dist/web/assets/code-editor-DXsIWoQ1.js +7 -0
- package/dist/web/assets/code-editor-DXsIWoQ1.js.br +0 -0
- package/dist/web/assets/code-editor-DXsIWoQ1.js.gz +0 -0
- package/dist/web/assets/{codex-reset-credit-button-Fr45FUxi.js → codex-reset-credit-button-DRhievFQ.js} +1 -1
- package/dist/web/assets/codex-reset-credit-button-DRhievFQ.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-DRhievFQ.js.gz +0 -0
- package/dist/web/assets/{conflict-editor-B-wdjSXI.js → conflict-editor-D_RImo_V.js} +3 -3
- package/dist/web/assets/conflict-editor-D_RImo_V.js.br +0 -0
- package/dist/web/assets/conflict-editor-D_RImo_V.js.gz +0 -0
- package/dist/web/assets/{csv-preview-B6RodObB.js → csv-preview-BuFdfLo3.js} +1 -1
- package/dist/web/assets/csv-preview-BuFdfLo3.js.br +0 -0
- package/dist/web/assets/csv-preview-BuFdfLo3.js.gz +0 -0
- package/dist/web/assets/{database-viewer-CdPBUQPY.js → database-viewer-ChcbYn9E.js} +1 -1
- package/dist/web/assets/database-viewer-ChcbYn9E.js.br +0 -0
- package/dist/web/assets/database-viewer-ChcbYn9E.js.gz +0 -0
- package/dist/web/assets/{design-settings-section-BpCpaBwL.js → design-settings-section-B_xOf51h.js} +1 -1
- package/dist/web/assets/design-settings-section-B_xOf51h.js.br +0 -0
- package/dist/web/assets/design-settings-section-B_xOf51h.js.gz +0 -0
- package/dist/web/assets/{design-skill-suggestion-DkT2E2IV.js → design-skill-suggestion-BbEDg15Z.js} +1 -1
- package/dist/web/assets/design-skill-suggestion-BbEDg15Z.js.br +0 -0
- package/dist/web/assets/design-skill-suggestion-BbEDg15Z.js.gz +0 -0
- package/dist/web/assets/{design-tab-BZb9eemI.js → design-tab-BQSYJ4cS.js} +6 -6
- package/dist/web/assets/design-tab-BQSYJ4cS.js.br +0 -0
- package/dist/web/assets/design-tab-BQSYJ4cS.js.gz +0 -0
- package/dist/web/assets/{designs-sidebar-panel-CF4tp6j-.js → designs-sidebar-panel-AiPaYfSU.js} +1 -1
- package/dist/web/assets/designs-sidebar-panel-AiPaYfSU.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-AiPaYfSU.js.gz +0 -0
- package/dist/web/assets/{diff-viewer-BqEqwSw6.js → diff-viewer-BZ6glGK-.js} +1 -1
- package/dist/web/assets/diff-viewer-BZ6glGK-.js.br +0 -0
- package/dist/web/assets/diff-viewer-BZ6glGK-.js.gz +0 -0
- package/dist/web/assets/{edit-diff-preview-DD4HayXY.js → edit-diff-preview-D-FNLOU2.js} +1 -1
- package/dist/web/assets/edit-diff-preview-D-FNLOU2.js.br +0 -0
- package/dist/web/assets/edit-diff-preview-D-FNLOU2.js.gz +0 -0
- package/dist/web/assets/{editor-language-service-CkA5sEdV.js → editor-language-service-4sbsdqBV.js} +1 -1
- package/dist/web/assets/editor-language-service-4sbsdqBV.js.br +0 -0
- package/dist/web/assets/editor-language-service-4sbsdqBV.js.gz +0 -0
- package/dist/web/assets/explorer-body-DbgrG1fe.js +2 -0
- package/dist/web/assets/explorer-body-DbgrG1fe.js.br +0 -0
- package/dist/web/assets/explorer-body-DbgrG1fe.js.gz +0 -0
- package/dist/web/assets/{explorer-window-content-CRJ2eMZ4.js → explorer-window-content-BCjWvHpp.js} +1 -1
- package/dist/web/assets/explorer-window-content-BCjWvHpp.js.br +0 -0
- package/dist/web/assets/explorer-window-content-BCjWvHpp.js.gz +0 -0
- package/dist/web/assets/{extension-manager-section-DwQTdCII.js → extension-manager-section-DiMF4RnT.js} +1 -1
- package/dist/web/assets/extension-manager-section-DiMF4RnT.js.br +0 -0
- package/dist/web/assets/extension-manager-section-DiMF4RnT.js.gz +0 -0
- package/dist/web/assets/{extension-webview-CMq-VTLu.js → extension-webview-Coti6Vfw.js} +1 -1
- package/dist/web/assets/extension-webview-Coti6Vfw.js.br +0 -0
- package/dist/web/assets/extension-webview-Coti6Vfw.js.gz +0 -0
- package/dist/web/assets/file-store-Cm7-pHux.js +1 -0
- package/dist/web/assets/file-store-Cm7-pHux.js.br +0 -0
- package/dist/web/assets/file-store-Cm7-pHux.js.gz +0 -0
- package/dist/web/assets/{files-settings-section-B2lcyh-6.js → files-settings-section-ZTVwOwx0.js} +1 -1
- package/dist/web/assets/files-settings-section-ZTVwOwx0.js.br +0 -0
- package/dist/web/assets/files-settings-section-ZTVwOwx0.js.gz +0 -0
- package/dist/web/assets/{general-settings-section-Doepm2sH.js → general-settings-section-B7Hjx_fb.js} +1 -1
- package/dist/web/assets/general-settings-section-B7Hjx_fb.js.br +0 -0
- package/dist/web/assets/general-settings-section-B7Hjx_fb.js.gz +0 -0
- package/dist/web/assets/{git-log-panel-CJakNMDc.js → git-log-panel-CbcJ_YEH.js} +1 -1
- package/dist/web/assets/git-log-panel-CbcJ_YEH.js.br +0 -0
- package/dist/web/assets/git-log-panel-CbcJ_YEH.js.gz +0 -0
- package/dist/web/assets/{glide-data-grid-C_SeOhSq.js → glide-data-grid-BfByGSf1.js} +3 -3
- package/dist/web/assets/glide-data-grid-BfByGSf1.js.br +0 -0
- package/dist/web/assets/glide-data-grid-BfByGSf1.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-DCo9OP3D.js +1 -0
- package/dist/web/assets/group-chat-tab-DCo9OP3D.js.br +0 -0
- package/dist/web/assets/group-chat-tab-DCo9OP3D.js.gz +0 -0
- package/dist/web/assets/{image-preview-C1Frlx22.js → image-preview-Cjlps7Pt.js} +1 -1
- package/dist/web/assets/index-CyDLBddf.js +52 -0
- package/dist/web/assets/index-CyDLBddf.js.br +0 -0
- package/dist/web/assets/index-CyDLBddf.js.gz +0 -0
- package/dist/web/assets/index-Dh5apC3I.css +1 -0
- package/dist/web/assets/index-Dh5apC3I.css.br +0 -0
- package/dist/web/assets/index-Dh5apC3I.css.gz +0 -0
- package/dist/web/assets/{jira-watcher-section-BmkIGQFV.js → jira-watcher-section-Dz_-sUC2.js} +1 -1
- package/dist/web/assets/keybindings-store-BTq5Z7XP.js +1 -0
- package/dist/web/assets/{keyboard-shortcuts-section-BgZe3QDr.js → keyboard-shortcuts-section-Ba5NYwlG.js} +1 -1
- package/dist/web/assets/keyboard-shortcuts-section-Ba5NYwlG.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-Ba5NYwlG.js.gz +0 -0
- package/dist/web/assets/{language-servers-section-CCMzgOaE.js → language-servers-section-DJJ7SFXo.js} +2 -2
- package/dist/web/assets/language-servers-section-DJJ7SFXo.js.br +0 -0
- package/dist/web/assets/language-servers-section-DJJ7SFXo.js.gz +0 -0
- package/dist/web/assets/{lsp-client-B10suuaZ.js → lsp-client-Dr3vQ1bb.js} +1 -1
- package/dist/web/assets/lsp-client-Dr3vQ1bb.js.br +0 -0
- package/dist/web/assets/lsp-client-Dr3vQ1bb.js.gz +0 -0
- package/dist/web/assets/{markdown-renderer-AHHFS3jc.js → markdown-renderer-CmnqFfTU.js} +3 -3
- package/dist/web/assets/markdown-renderer-CmnqFfTU.js.br +0 -0
- package/dist/web/assets/markdown-renderer-CmnqFfTU.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-LJdVMbGl.js +1 -0
- package/dist/web/assets/{mobile-explorer-sheet-CqCsLWSr.js → mobile-explorer-sheet-BiIhZtJ2.js} +1 -1
- package/dist/web/assets/mobile-explorer-sheet-BiIhZtJ2.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-BiIhZtJ2.js.gz +0 -0
- package/dist/web/assets/new-design-dialog-DI_hxvFV.js +1 -0
- package/dist/web/assets/new-design-dialog-DI_hxvFV.js.br +0 -0
- package/dist/web/assets/new-design-dialog-DI_hxvFV.js.gz +0 -0
- package/dist/web/assets/notification-store-9lBSplOV.js +1 -0
- package/dist/web/assets/{notifications-settings-section-CXgzH_bK.js → notifications-settings-section-0s-2OKRv.js} +1 -1
- package/dist/web/assets/notifications-settings-section-0s-2OKRv.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-0s-2OKRv.js.gz +0 -0
- package/dist/web/assets/{overview-panel-BYB8mgRE.js → overview-panel-3htxfZS2.js} +1 -1
- package/dist/web/assets/overview-panel-3htxfZS2.js.br +0 -0
- package/dist/web/assets/overview-panel-3htxfZS2.js.gz +0 -0
- package/dist/web/assets/panel-store-B6PoCwBA.js +1 -0
- package/dist/web/assets/panel-store-B6PoCwBA.js.br +0 -0
- package/dist/web/assets/panel-store-B6PoCwBA.js.gz +0 -0
- package/dist/web/assets/{performance-panel-Dpuq3g0W.js → performance-panel-V8gpnnf7.js} +2 -2
- package/dist/web/assets/performance-panel-V8gpnnf7.js.br +0 -0
- package/dist/web/assets/performance-panel-V8gpnnf7.js.gz +0 -0
- package/dist/web/assets/{postgres-viewer-DW0Gkmow.js → postgres-viewer-sWS-ogTC.js} +1 -1
- package/dist/web/assets/postgres-viewer-sWS-ogTC.js.br +0 -0
- package/dist/web/assets/postgres-viewer-sWS-ogTC.js.gz +0 -0
- package/dist/web/assets/{ppmbot-settings-section-DFtlGoW6.js → ppmbot-settings-section-CT8vvlzk.js} +1 -1
- package/dist/web/assets/ppmbot-settings-section-CT8vvlzk.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-CT8vvlzk.js.gz +0 -0
- package/dist/web/assets/{pptx-export-CNyG32Xr.js → pptx-export-Ugjv0hso.js} +4 -4
- package/dist/web/assets/pptx-export-Ugjv0hso.js.br +0 -0
- package/dist/web/assets/pptx-export-Ugjv0hso.js.gz +0 -0
- package/dist/web/assets/{problems-panel-V5zqpuXq.js → problems-panel-Gcy79pSS.js} +1 -1
- package/dist/web/assets/problems-panel-Gcy79pSS.js.br +0 -0
- package/dist/web/assets/problems-panel-Gcy79pSS.js.gz +0 -0
- package/dist/web/assets/{process-row-format-CiJJSf_V.js → process-row-format-u6y7lOee.js} +1 -1
- package/dist/web/assets/process-table-BUTIp9Oy.js +1 -0
- package/dist/web/assets/process-table-BUTIp9Oy.js.br +0 -0
- package/dist/web/assets/process-table-BUTIp9Oy.js.gz +0 -0
- package/dist/web/assets/{proxy-settings-section-B7AVlTfY.js → proxy-settings-section-Buv_8y54.js} +1 -1
- package/dist/web/assets/proxy-settings-section-Buv_8y54.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-Buv_8y54.js.gz +0 -0
- package/dist/web/assets/{query-audit-section-gHmRfWKr.js → query-audit-section-N2DQtgJx.js} +1 -1
- package/dist/web/assets/query-audit-section-N2DQtgJx.js.br +0 -0
- package/dist/web/assets/query-audit-section-N2DQtgJx.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-CRvJqmaz.js +1 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-CRvJqmaz.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-CRvJqmaz.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-BoYINLbJ.js +2 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-BoYINLbJ.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-BoYINLbJ.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DPdP0yYu.js +1 -0
- package/dist/web/assets/remote-desktop-mobile-view-DPdP0yYu.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DPdP0yYu.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-BeQ_Jrp7.js +1 -0
- package/dist/web/assets/remote-desktop-readiness-gate-BeQ_Jrp7.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-BeQ_Jrp7.js.gz +0 -0
- package/dist/web/assets/remote-desktop-settings-section-Bs4sHS3l.js +1 -0
- package/dist/web/assets/remote-desktop-settings-section-Bs4sHS3l.js.br +0 -0
- package/dist/web/assets/remote-desktop-settings-section-Bs4sHS3l.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-DDr__JxQ.js +1 -0
- package/dist/web/assets/remote-desktop-window-content-DDr__JxQ.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-DDr__JxQ.js.gz +0 -0
- package/dist/web/assets/{run-in-terminal-DKBcEGVu.js → run-in-terminal-DCBNtYHQ.js} +1 -1
- package/dist/web/assets/{schedules-settings-section-sYDAsBMO.js → schedules-settings-section-_cHX2qOa.js} +1 -1
- package/dist/web/assets/schedules-settings-section-_cHX2qOa.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-_cHX2qOa.js.gz +0 -0
- package/dist/web/assets/{send-to-chat-CCdOrKc7.js → send-to-chat-dNqNV7Y4.js} +1 -1
- package/dist/web/assets/send-to-chat-dNqNV7Y4.js.br +0 -0
- package/dist/web/assets/send-to-chat-dNqNV7Y4.js.gz +0 -0
- package/dist/web/assets/{services-panel-CKa2aP1d.js → services-panel-Dm54cnW3.js} +1 -1
- package/dist/web/assets/services-panel-Dm54cnW3.js.br +0 -0
- package/dist/web/assets/services-panel-Dm54cnW3.js.gz +0 -0
- package/dist/web/assets/settings-body-DRRQNaDA.js +1 -0
- package/dist/web/assets/settings-body-DRRQNaDA.js.br +0 -0
- package/dist/web/assets/settings-body-DRRQNaDA.js.gz +0 -0
- package/dist/web/assets/settings-section-content-DRaHfvm8.js +1 -0
- package/dist/web/assets/settings-section-content-U3mIx6hF.js +2 -0
- package/dist/web/assets/settings-section-content-U3mIx6hF.js.br +0 -0
- package/dist/web/assets/settings-section-content-U3mIx6hF.js.gz +0 -0
- package/dist/web/assets/{settings-store-DfuiLq_9.js → settings-store-Cyuo8ceh.js} +2 -2
- package/dist/web/assets/settings-store-Cyuo8ceh.js.br +0 -0
- package/dist/web/assets/settings-store-Cyuo8ceh.js.gz +0 -0
- package/dist/web/assets/settings-tab-CB_BhHTK.js +1 -0
- package/dist/web/assets/settings-window-content-CgZIMNX8.js +1 -0
- package/dist/web/assets/{slash-command-picker-CLevA_Gf.js → slash-command-picker-CQlIqMW0.js} +1 -1
- package/dist/web/assets/slash-command-picker-CQlIqMW0.js.br +0 -0
- package/dist/web/assets/slash-command-picker-CQlIqMW0.js.gz +0 -0
- package/dist/web/assets/{sql-query-editor-Db8b0jEr.js → sql-query-editor--Z4bcqd8.js} +1 -1
- package/dist/web/assets/sql-query-editor--Z4bcqd8.js.br +0 -0
- package/dist/web/assets/sql-query-editor--Z4bcqd8.js.gz +0 -0
- package/dist/web/assets/{sqlite-viewer-VzYLMqkD.js → sqlite-viewer-CSmX3qaj.js} +1 -1
- package/dist/web/assets/sqlite-viewer-CSmX3qaj.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-CSmX3qaj.js.gz +0 -0
- package/dist/web/assets/{system-monitor-body-BR60W_mG.js → system-monitor-body-LannpU6H.js} +2 -2
- package/dist/web/assets/system-monitor-body-LannpU6H.js.br +0 -0
- package/dist/web/assets/system-monitor-body-LannpU6H.js.gz +0 -0
- package/dist/web/assets/system-monitor-tab-BfVucwEF.js +1 -0
- package/dist/web/assets/{system-monitor-window-content-BLw1QBXo.js → system-monitor-window-content-kLNW9Ln3.js} +1 -1
- package/dist/web/assets/{tab-host-window-content-BL61SB5m.js → tab-host-window-content-II_FtOYM.js} +1 -1
- package/dist/web/assets/tab-host-window-content-II_FtOYM.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-II_FtOYM.js.gz +0 -0
- package/dist/web/assets/{tab-store-CbPh8CAX.js → tab-store-DCpc0g0Q.js} +1 -1
- package/dist/web/assets/{terminal-tab-B4y6at4h.js → terminal-tab-CTe2polt.js} +1 -1
- package/dist/web/assets/terminal-tab-CTe2polt.js.br +0 -0
- package/dist/web/assets/terminal-tab-CTe2polt.js.gz +0 -0
- package/dist/web/assets/{tool-cards-K0r_yxI0.js → tool-cards-rxLXbBSm.js} +5 -5
- package/dist/web/assets/tool-cards-rxLXbBSm.js.br +0 -0
- package/dist/web/assets/tool-cards-rxLXbBSm.js.gz +0 -0
- package/dist/web/assets/use-h264-canvas-decoder-BfO9QrlH.js +1 -0
- package/dist/web/assets/use-h264-canvas-decoder-BfO9QrlH.js.br +0 -0
- package/dist/web/assets/use-h264-canvas-decoder-BfO9QrlH.js.gz +0 -0
- package/dist/web/assets/{use-inline-blame-BK23icsE.js → use-inline-blame-CxZ_QWzS.js} +3 -3
- package/dist/web/assets/use-inline-blame-CxZ_QWzS.js.br +0 -0
- package/dist/web/assets/use-inline-blame-CxZ_QWzS.js.gz +0 -0
- package/dist/web/assets/{use-lsp-CRdCPCKW.js → use-lsp-gCNE5A9K.js} +1 -1
- package/dist/web/assets/use-lsp-gCNE5A9K.js.br +0 -0
- package/dist/web/assets/use-lsp-gCNE5A9K.js.gz +0 -0
- package/dist/web/assets/{use-monaco-theme-CpXT2uh3.js → use-monaco-theme-DvNGcCvz.js} +1 -1
- package/dist/web/assets/{use-process-kill-BWYX03KF.js → use-process-kill-Cbiu1mbY.js} +1 -1
- package/dist/web/assets/use-process-kill-Cbiu1mbY.js.br +0 -0
- package/dist/web/assets/use-process-kill-Cbiu1mbY.js.gz +0 -0
- package/dist/web/assets/{use-websocket-CiWQKhHr.js → use-websocket-AC7EG1LK.js} +1 -1
- package/dist/web/assets/video-preview-C2Y61WUE.js +1 -0
- package/dist/web/assets/video-preview-C2Y61WUE.js.br +0 -0
- package/dist/web/assets/video-preview-C2Y61WUE.js.gz +0 -0
- package/dist/web/assets/{voice-settings-section-Ceihggqf.js → voice-settings-section-DCXZeLYI.js} +1 -1
- package/dist/web/assets/voice-settings-section-DCXZeLYI.js.br +0 -0
- package/dist/web/assets/voice-settings-section-DCXZeLYI.js.gz +0 -0
- package/dist/web/assets/{window-pip-registry-mDgwpAwP.js → window-pip-registry-9Y9LQQYS.js} +1 -1
- package/dist/web/index.html +50 -7
- 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/android-emulator-phase0-report-260921.md +310 -0
- package/docs/architecture/android-emulator-phase2-report-260921.md +163 -0
- package/docs/architecture/android-emulator-phase3-report-260921.md +203 -0
- package/docs/architecture/android-emulator-phase4-report-260921.md +191 -0
- package/docs/architecture/android-emulator-plan-260920.md +376 -0
- package/docs/architecture/plugins-and-tracing.md +48 -7
- package/package.json +4 -2
- package/scripts/gen-android-proto.ts +37 -0
- package/scripts/release.sh +3 -1
- package/src/cli/commands/chat-cmd.ts +2 -2
- package/src/providers/claude-agent-sdk-query-options.ts +28 -0
- package/src/providers/claude-agent-sdk.ts +153 -71
- package/src/providers/claude-warm-spare.ts +176 -0
- package/src/providers/provider.interface.ts +1 -0
- package/src/server/index.ts +53 -0
- package/src/server/middleware/gzip-json.ts +13 -1
- package/src/server/routes/android.ts +616 -0
- package/src/server/routes/chat.ts +31 -0
- package/src/server/routes/files.ts +52 -5
- package/src/server/routes/remote-desktop.ts +95 -2
- package/src/server/routes/trace.ts +66 -0
- package/src/server/ws/android.ts +101 -0
- package/src/server/ws/chat.ts +12 -17
- package/src/server/ws/global.ts +13 -1
- package/src/server/ws/remote-desktop.ts +6 -1
- package/src/services/android/android-apk.ts +387 -0
- package/src/services/android/android-capabilities.ts +154 -0
- package/src/services/android/android-flag.ts +12 -0
- package/src/services/android/android-grpc.ts +124 -0
- package/src/services/android/android-input.ts +129 -0
- package/src/services/android/android-logcat.ts +169 -0
- package/src/services/android/android-nonce.ts +50 -0
- package/src/services/android/android-operations.ts +124 -0
- package/src/services/android/android-screenshot.ts +53 -0
- package/src/services/android/android-session.ts +510 -0
- package/src/services/android/android-video.ts +495 -0
- package/src/services/android/avd-list.ts +131 -0
- package/src/services/android/avd-manager.ts +397 -0
- package/src/services/android/device-registry.ts +223 -0
- package/src/services/android/emulator-discovery.ts +160 -0
- package/src/services/android/emulator-launcher.ts +290 -0
- package/src/services/android/proto/emulator-controller-descriptor.ts +10 -0
- package/src/services/android/proto/emulator_controller.proto +1791 -0
- package/src/services/android/sdk-discovery.ts +178 -0
- package/src/services/android/system-images.ts +124 -0
- package/src/services/chat.service.ts +81 -4
- package/src/services/config.service.ts +1 -1
- package/src/services/file-filter.service.ts +2 -61
- package/src/services/file-glob.ts +67 -0
- package/src/services/file-index/file-index-runner.ts +169 -0
- package/src/services/file-index/file-index-worker.ts +73 -0
- package/src/services/file-index/index-search.ts +152 -0
- package/src/services/file-index/index-walk.ts +109 -0
- package/src/services/file-list-index.service.ts +189 -70
- package/src/services/file-watcher/linux-inotify.ts +238 -0
- package/src/services/file-watcher/watch-tree.ts +37 -6
- package/src/services/file-watcher.service.ts +40 -8
- package/src/services/file.service.ts +17 -6
- package/src/services/group-chat/group-chat.service.ts +1 -1
- package/src/services/jira-debug-session.service.ts +1 -1
- package/src/services/ppmbot/ppmbot-delegation.ts +1 -1
- package/src/services/ppmbot/ppmbot-service.ts +1 -1
- package/src/services/project-content-search.service.ts +45 -11
- package/src/services/proxy-agent-turn.ts +7 -3
- package/src/services/remote-desktop/mediamtx-catalog.ts +89 -0
- package/src/services/remote-desktop/mediamtx-config.ts +91 -0
- package/src/services/remote-desktop/mediamtx-install.service.ts +191 -0
- package/src/services/remote-desktop/mediamtx-paths.ts +51 -0
- package/src/services/remote-desktop/mediamtx-process.ts +152 -0
- package/src/services/remote-desktop/remote-desktop-capture-wayland.ts +312 -0
- package/src/services/remote-desktop/remote-desktop-capture.ts +60 -4
- package/src/services/remote-desktop/remote-desktop-portal.ts +529 -0
- package/src/services/remote-desktop/remote-desktop-requirements.ts +56 -20
- package/src/services/remote-desktop/remote-desktop-session.ts +77 -3
- package/src/services/remote-desktop/remote-desktop-whep-registry.ts +36 -0
- package/src/services/scheduler-runner.ts +2 -3
- package/src/services/session-trace/browser-trace-ingest.ts +131 -0
- package/src/services/session-trace/session-trace-cleanup.ts +65 -0
- package/src/services/session-trace/session-trace-db.ts +89 -0
- package/src/services/session-trace/session-trace-store.ts +132 -0
- package/src/services/session-trace/trace-coalescer.ts +86 -0
- package/src/services/session-trace/trace-recorder.ts +304 -0
- package/src/services/session-trace/trace-writer.ts +83 -0
- package/src/shared/android-avd.ts +53 -0
- package/src/shared/android-protocol.ts +184 -0
- package/src/shared/file-index-limits.ts +17 -0
- package/src/shared/session-trace.ts +61 -0
- package/src/types/chat.ts +17 -0
- package/src/types/config.ts +27 -0
- package/src/types/project.ts +9 -0
- package/src/web/app.tsx +5 -0
- package/src/web/components/android/android-apk-upload.ts +75 -0
- package/src/web/components/android/android-avd-create-dialog.tsx +305 -0
- package/src/web/components/android/android-avd-destroy-dialog.tsx +151 -0
- package/src/web/components/android/android-clipboard-panel.tsx +94 -0
- package/src/web/components/android/android-controls.tsx +128 -0
- package/src/web/components/android/android-coords.ts +99 -0
- package/src/web/components/android/android-device-list.tsx +329 -0
- package/src/web/components/android/android-install-panel.tsx +280 -0
- package/src/web/components/android/android-log-filter.ts +75 -0
- package/src/web/components/android/android-logcat-panel.tsx +214 -0
- package/src/web/components/android/android-screenshot-download.ts +56 -0
- package/src/web/components/android/android-tab.tsx +66 -0
- package/src/web/components/android/android-tools-drawer.tsx +76 -0
- package/src/web/components/android/android-viewer.tsx +200 -0
- package/src/web/components/android/android-ws-url.ts +21 -0
- package/src/web/components/android/open-android.ts +21 -0
- package/src/web/components/android/use-android-available.ts +29 -0
- package/src/web/components/android/use-android-keyboard.ts +111 -0
- package/src/web/components/android/use-android-session.ts +277 -0
- package/src/web/components/android/use-android-touch.ts +123 -0
- package/src/web/components/chat/chat-tab.tsx +28 -2
- package/src/web/components/chat/message-input.tsx +3 -5
- package/src/web/components/editor/compare-picker.tsx +12 -2
- package/src/web/components/explorer/file-tree.tsx +6 -7
- package/src/web/components/explorer/use-tree-row-dnd.ts +0 -2
- package/src/web/components/floating-window/window-content-registry.ts +8 -8
- package/src/web/components/layout/command-palette.tsx +31 -9
- package/src/web/components/layout/mobile-drawer.tsx +8 -1
- package/src/web/components/layout/nav-section-rail.tsx +8 -1
- package/src/web/components/layout/reparenting-tab.tsx +2 -2
- package/src/web/components/layout/tab-content.tsx +5 -0
- package/src/web/components/layout/tab-pool.tsx +31 -20
- package/src/web/components/remote-desktop/use-h264-canvas-decoder.ts +23 -1
- package/src/web/components/remote-desktop/use-remote-desktop-connection.ts +64 -6
- package/src/web/components/remote-desktop/use-webrtc-canvas-video.ts +255 -0
- package/src/web/components/root-error-boundary.tsx +5 -0
- package/src/web/components/settings/remote-desktop-settings-section.tsx +176 -0
- package/src/web/components/settings/settings-categories.ts +3 -0
- package/src/web/components/settings/settings-section-content.tsx +25 -18
- package/src/web/hooks/use-chat-prewarm.ts +53 -0
- package/src/web/hooks/use-chat.ts +18 -4
- package/src/web/hooks/use-file-index-invalidation.ts +7 -5
- package/src/web/hooks/use-global-events.ts +12 -1
- package/src/web/hooks/use-remote-file-search.ts +39 -0
- package/src/web/hooks/use-ui-preload.ts +38 -0
- package/src/web/index.html +43 -0
- package/src/web/lib/chunk-recovery.ts +5 -1
- package/src/web/lib/device-id.ts +39 -0
- package/src/web/lib/feature-badges.ts +2 -0
- package/src/web/lib/lazy-with-preload.tsx +43 -0
- package/src/web/lib/preload-ui.ts +60 -0
- package/src/web/lib/score-file-search.ts +27 -14
- package/src/web/lib/tab-type-icons.ts +2 -1
- package/src/web/lib/trace-boot.ts +8 -0
- package/src/web/lib/trace-client.ts +516 -0
- package/src/web/main.tsx +12 -0
- package/src/web/stores/file-store.ts +124 -18
- package/src/web/stores/panel-utils.ts +3 -0
- package/src/web/stores/tab-store.ts +2 -1
- package/src/web/stores/window-panel-persistence.ts +3 -0
- package/vite.config.ts +3 -0
- package/dist/web/assets/accounts-settings-section-DEIm-W-D.js +0 -1
- package/dist/web/assets/accounts-settings-section-DEIm-W-D.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-DEIm-W-D.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-CBMsnl_p.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-CBMsnl_p.js.gz +0 -0
- package/dist/web/assets/agent-session-window-content-D9C9FA7E.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-D9C9FA7E.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-DhUVgDEG.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-DhUVgDEG.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-CETpSpYd.js.br +0 -0
- package/dist/web/assets/ai-settings-section-CETpSpYd.js.gz +0 -0
- package/dist/web/assets/appearance-settings-section-BJUiLUb7.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-BJUiLUb7.js.gz +0 -0
- package/dist/web/assets/apps-panel-1VElRgV3.js.br +0 -0
- package/dist/web/assets/apps-panel-1VElRgV3.js.gz +0 -0
- package/dist/web/assets/audio-preview-DYkyHu5X.js.br +0 -0
- package/dist/web/assets/audio-preview-DYkyHu5X.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-DhTMSpSU.js +0 -1
- package/dist/web/assets/branch-review-tab-DhTMSpSU.js.br +0 -0
- package/dist/web/assets/branch-review-tab-DhTMSpSU.js.gz +0 -0
- package/dist/web/assets/chat-tab-Cg3BKugo.js +0 -15
- package/dist/web/assets/chat-tab-Cg3BKugo.js.br +0 -0
- package/dist/web/assets/chat-tab-Cg3BKugo.js.gz +0 -0
- package/dist/web/assets/chat-tab-tbUDK__Y.js +0 -1
- package/dist/web/assets/chat-tab-tbUDK__Y.js.br +0 -0
- package/dist/web/assets/chat-tab-tbUDK__Y.js.gz +0 -0
- package/dist/web/assets/code-editor-6ZiQehbr.js +0 -7
- package/dist/web/assets/code-editor-6ZiQehbr.js.br +0 -0
- package/dist/web/assets/code-editor-6ZiQehbr.js.gz +0 -0
- package/dist/web/assets/codex-reset-credit-button-Fr45FUxi.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-Fr45FUxi.js.gz +0 -0
- package/dist/web/assets/conflict-editor-B-wdjSXI.js.br +0 -0
- package/dist/web/assets/conflict-editor-B-wdjSXI.js.gz +0 -0
- package/dist/web/assets/csv-preview-B6RodObB.js.br +0 -0
- package/dist/web/assets/csv-preview-B6RodObB.js.gz +0 -0
- package/dist/web/assets/database-viewer-CdPBUQPY.js.br +0 -0
- package/dist/web/assets/database-viewer-CdPBUQPY.js.gz +0 -0
- package/dist/web/assets/design-settings-section-BpCpaBwL.js.br +0 -0
- package/dist/web/assets/design-settings-section-BpCpaBwL.js.gz +0 -0
- package/dist/web/assets/design-skill-suggestion-DkT2E2IV.js.br +0 -0
- package/dist/web/assets/design-skill-suggestion-DkT2E2IV.js.gz +0 -0
- package/dist/web/assets/design-tab-BZb9eemI.js.br +0 -0
- package/dist/web/assets/design-tab-BZb9eemI.js.gz +0 -0
- package/dist/web/assets/designs-sidebar-panel-CF4tp6j-.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-CF4tp6j-.js.gz +0 -0
- package/dist/web/assets/diff-viewer-BqEqwSw6.js.br +0 -0
- package/dist/web/assets/diff-viewer-BqEqwSw6.js.gz +0 -0
- package/dist/web/assets/edit-diff-preview-DD4HayXY.js.br +0 -0
- package/dist/web/assets/edit-diff-preview-DD4HayXY.js.gz +0 -0
- package/dist/web/assets/editor-language-service-CkA5sEdV.js.br +0 -0
- package/dist/web/assets/editor-language-service-CkA5sEdV.js.gz +0 -0
- package/dist/web/assets/explorer-body-Ds7oKuz7.js +0 -2
- package/dist/web/assets/explorer-body-Ds7oKuz7.js.br +0 -0
- package/dist/web/assets/explorer-body-Ds7oKuz7.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-CRJ2eMZ4.js.br +0 -0
- package/dist/web/assets/explorer-window-content-CRJ2eMZ4.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-DwQTdCII.js.br +0 -0
- package/dist/web/assets/extension-manager-section-DwQTdCII.js.gz +0 -0
- package/dist/web/assets/extension-webview-CMq-VTLu.js.br +0 -0
- package/dist/web/assets/extension-webview-CMq-VTLu.js.gz +0 -0
- package/dist/web/assets/file-store-DY1_0nzY.js +0 -1
- package/dist/web/assets/file-store-DY1_0nzY.js.br +0 -0
- package/dist/web/assets/file-store-DY1_0nzY.js.gz +0 -0
- package/dist/web/assets/files-settings-section-B2lcyh-6.js.br +0 -0
- package/dist/web/assets/files-settings-section-B2lcyh-6.js.gz +0 -0
- package/dist/web/assets/general-settings-section-Doepm2sH.js.br +0 -0
- package/dist/web/assets/general-settings-section-Doepm2sH.js.gz +0 -0
- package/dist/web/assets/git-log-panel-CJakNMDc.js.br +0 -0
- package/dist/web/assets/git-log-panel-CJakNMDc.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-C_SeOhSq.js.br +0 -0
- package/dist/web/assets/glide-data-grid-C_SeOhSq.js.gz +0 -0
- package/dist/web/assets/group-chat-tab--by1xCQW.js +0 -1
- package/dist/web/assets/group-chat-tab--by1xCQW.js.br +0 -0
- package/dist/web/assets/group-chat-tab--by1xCQW.js.gz +0 -0
- package/dist/web/assets/index-DhWjx5iR.js +0 -52
- package/dist/web/assets/index-DhWjx5iR.js.br +0 -0
- package/dist/web/assets/index-DhWjx5iR.js.gz +0 -0
- package/dist/web/assets/index-oIvYSKTT.css +0 -1
- package/dist/web/assets/index-oIvYSKTT.css.br +0 -0
- package/dist/web/assets/index-oIvYSKTT.css.gz +0 -0
- package/dist/web/assets/keybindings-store-30LYZU0l.js +0 -1
- package/dist/web/assets/keyboard-shortcuts-section-BgZe3QDr.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-BgZe3QDr.js.gz +0 -0
- package/dist/web/assets/language-servers-section-CCMzgOaE.js.br +0 -0
- package/dist/web/assets/language-servers-section-CCMzgOaE.js.gz +0 -0
- package/dist/web/assets/lsp-client-B10suuaZ.js.br +0 -0
- package/dist/web/assets/lsp-client-B10suuaZ.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-AHHFS3jc.js.br +0 -0
- package/dist/web/assets/markdown-renderer-AHHFS3jc.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-DxnXtBoj.js +0 -1
- package/dist/web/assets/mobile-explorer-sheet-CqCsLWSr.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-CqCsLWSr.js.gz +0 -0
- package/dist/web/assets/new-design-dialog-B9tgnQXq.js +0 -1
- package/dist/web/assets/new-design-dialog-B9tgnQXq.js.br +0 -0
- package/dist/web/assets/new-design-dialog-B9tgnQXq.js.gz +0 -0
- package/dist/web/assets/notification-store-HUVzO_bp.js +0 -1
- package/dist/web/assets/notifications-settings-section-CXgzH_bK.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-CXgzH_bK.js.gz +0 -0
- package/dist/web/assets/overview-panel-BYB8mgRE.js.br +0 -0
- package/dist/web/assets/overview-panel-BYB8mgRE.js.gz +0 -0
- package/dist/web/assets/panel-store-CWHPmHwj.js +0 -1
- package/dist/web/assets/panel-store-CWHPmHwj.js.br +0 -0
- package/dist/web/assets/panel-store-CWHPmHwj.js.gz +0 -0
- package/dist/web/assets/performance-panel-Dpuq3g0W.js.br +0 -0
- package/dist/web/assets/performance-panel-Dpuq3g0W.js.gz +0 -0
- package/dist/web/assets/postgres-viewer-DW0Gkmow.js.br +0 -0
- package/dist/web/assets/postgres-viewer-DW0Gkmow.js.gz +0 -0
- package/dist/web/assets/ppmbot-settings-section-DFtlGoW6.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-DFtlGoW6.js.gz +0 -0
- package/dist/web/assets/pptx-export-CNyG32Xr.js.br +0 -0
- package/dist/web/assets/pptx-export-CNyG32Xr.js.gz +0 -0
- package/dist/web/assets/problems-panel-V5zqpuXq.js.br +0 -0
- package/dist/web/assets/problems-panel-V5zqpuXq.js.gz +0 -0
- package/dist/web/assets/process-table-DAj46HIl.js +0 -1
- package/dist/web/assets/process-table-DAj46HIl.js.br +0 -0
- package/dist/web/assets/process-table-DAj46HIl.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-B7AVlTfY.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-B7AVlTfY.js.gz +0 -0
- package/dist/web/assets/query-audit-section-gHmRfWKr.js.br +0 -0
- package/dist/web/assets/query-audit-section-gHmRfWKr.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-Cgoznh8L.js +0 -1
- package/dist/web/assets/remote-desktop-clipboard-notice-Cgoznh8L.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-Cgoznh8L.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-X12QbPhO.js +0 -2
- package/dist/web/assets/remote-desktop-mobile-sheet-X12QbPhO.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-X12QbPhO.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DsSHawSK.js +0 -1
- package/dist/web/assets/remote-desktop-mobile-view-DsSHawSK.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DsSHawSK.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-CHiQEd9Q.js +0 -1
- package/dist/web/assets/remote-desktop-readiness-gate-CHiQEd9Q.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-CHiQEd9Q.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-BnznIby3.js +0 -1
- package/dist/web/assets/remote-desktop-window-content-BnznIby3.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-BnznIby3.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-sYDAsBMO.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-sYDAsBMO.js.gz +0 -0
- package/dist/web/assets/send-to-chat-CCdOrKc7.js.br +0 -0
- package/dist/web/assets/send-to-chat-CCdOrKc7.js.gz +0 -0
- package/dist/web/assets/services-panel-CKa2aP1d.js.br +0 -0
- package/dist/web/assets/services-panel-CKa2aP1d.js.gz +0 -0
- package/dist/web/assets/settings-body-CEIF8lkl.js +0 -2
- package/dist/web/assets/settings-body-CEIF8lkl.js.br +0 -0
- package/dist/web/assets/settings-body-CEIF8lkl.js.gz +0 -0
- package/dist/web/assets/settings-store-DfuiLq_9.js.br +0 -0
- package/dist/web/assets/settings-store-DfuiLq_9.js.gz +0 -0
- package/dist/web/assets/settings-tab-Du5AUPni.js +0 -1
- package/dist/web/assets/settings-window-content-BTflfLez.js +0 -1
- package/dist/web/assets/slash-command-picker-CLevA_Gf.js.br +0 -0
- package/dist/web/assets/slash-command-picker-CLevA_Gf.js.gz +0 -0
- package/dist/web/assets/sql-query-editor-Db8b0jEr.js.br +0 -0
- package/dist/web/assets/sql-query-editor-Db8b0jEr.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-VzYLMqkD.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-VzYLMqkD.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-BR60W_mG.js.br +0 -0
- package/dist/web/assets/system-monitor-body-BR60W_mG.js.gz +0 -0
- package/dist/web/assets/system-monitor-tab-BYpantE2.js +0 -1
- package/dist/web/assets/tab-host-window-content-BL61SB5m.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-BL61SB5m.js.gz +0 -0
- package/dist/web/assets/terminal-tab-B4y6at4h.js.br +0 -0
- package/dist/web/assets/terminal-tab-B4y6at4h.js.gz +0 -0
- package/dist/web/assets/tool-cards-K0r_yxI0.js.br +0 -0
- package/dist/web/assets/tool-cards-K0r_yxI0.js.gz +0 -0
- package/dist/web/assets/use-inline-blame-BK23icsE.js.br +0 -0
- package/dist/web/assets/use-inline-blame-BK23icsE.js.gz +0 -0
- package/dist/web/assets/use-lsp-CRdCPCKW.js.br +0 -0
- package/dist/web/assets/use-lsp-CRdCPCKW.js.gz +0 -0
- package/dist/web/assets/use-process-kill-BWYX03KF.js.br +0 -0
- package/dist/web/assets/use-process-kill-BWYX03KF.js.gz +0 -0
- package/dist/web/assets/video-preview-DugVkMB7.js +0 -1
- package/dist/web/assets/video-preview-DugVkMB7.js.br +0 -0
- package/dist/web/assets/video-preview-DugVkMB7.js.gz +0 -0
- package/dist/web/assets/voice-settings-section-Ceihggqf.js.br +0 -0
- package/dist/web/assets/voice-settings-section-Ceihggqf.js.gz +0 -0
- /package/dist/web/assets/{__vite-browser-external-B_XMEguz.js → __vite-browser-external-C5mXParC.js} +0 -0
- /package/dist/web/assets/{agent-session-sheet-store-DO682WSg.js → agent-session-sheet-store-_OeezCXB.js} +0 -0
- /package/dist/web/assets/{api-settings-CpO8SPk9.js → api-settings-Cc_CpfmC.js} +0 -0
- /package/dist/web/assets/{api-settings-CpO8SPk9.js.br → api-settings-Cc_CpfmC.js.br} +0 -0
- /package/dist/web/assets/{api-settings-CpO8SPk9.js.gz → api-settings-Cc_CpfmC.js.gz} +0 -0
- /package/dist/web/assets/{api-themes-CJipDH_l.js → api-themes-BtMBSjuM.js} +0 -0
- /package/dist/web/assets/{can-open-in-ppm-Bw_xiOXX.js → can-open-in-ppm-DeE2-kd5.js} +0 -0
- /package/dist/web/assets/{can-open-in-ppm-Bw_xiOXX.js.br → can-open-in-ppm-DeE2-kd5.js.br} +0 -0
- /package/dist/web/assets/{can-open-in-ppm-Bw_xiOXX.js.gz → can-open-in-ppm-DeE2-kd5.js.gz} +0 -0
- /package/dist/web/assets/{csv-parser-DcRWxcNV.js → csv-parser-CoxPdyLw.js} +0 -0
- /package/dist/web/assets/{csv-parser-DcRWxcNV.js.br → csv-parser-CoxPdyLw.js.br} +0 -0
- /package/dist/web/assets/{csv-parser-DcRWxcNV.js.gz → csv-parser-CoxPdyLw.js.gz} +0 -0
- /package/dist/web/assets/{design-export-client-CHffN3DM.js → design-export-client-BfdZB7xK.js} +0 -0
- /package/dist/web/assets/{design-export-client-CHffN3DM.js.br → design-export-client-BfdZB7xK.js.br} +0 -0
- /package/dist/web/assets/{design-export-client-CHffN3DM.js.gz → design-export-client-BfdZB7xK.js.gz} +0 -0
- /package/dist/web/assets/{design-responsive-dialog-DSCpv6O1.js → design-responsive-dialog-BiYy3ibS.js} +0 -0
- /package/dist/web/assets/{design-responsive-dialog-DSCpv6O1.js.br → design-responsive-dialog-BiYy3ibS.js.br} +0 -0
- /package/dist/web/assets/{design-responsive-dialog-DSCpv6O1.js.gz → design-responsive-dialog-BiYy3ibS.js.gz} +0 -0
- /package/dist/web/assets/{design-system-status-label-B_0I_3a8.js → design-system-status-label-ekiLyjKn.js} +0 -0
- /package/dist/web/assets/{docx-preview-B3eJyY2y.js → docx-preview-Dt6RQpfA.js} +0 -0
- /package/dist/web/assets/{docx-preview-B3eJyY2y.js.br → docx-preview-Dt6RQpfA.js.br} +0 -0
- /package/dist/web/assets/{docx-preview-B3eJyY2y.js.gz → docx-preview-Dt6RQpfA.js.gz} +0 -0
- /package/dist/web/assets/{editor-font-BNwo7zo5.js → editor-font-CBszn6vt.js} +0 -0
- /package/dist/web/assets/{format-bytes-CRZfxO2J.js → format-bytes-FQmpZ25A.js} +0 -0
- /package/dist/web/assets/{image-gallery-DC3gRAqk.js → image-gallery-B16hO6Ab.js} +0 -0
- /package/dist/web/assets/{image-preview-geometry-DN3DZQp0.js → image-preview-geometry-D4Ihz4UV.js} +0 -0
- /package/dist/web/assets/{lib-B9k5tn9s.js → lib-6APiJkU3.js} +0 -0
- /package/dist/web/assets/{lib-B9k5tn9s.js.br → lib-6APiJkU3.js.br} +0 -0
- /package/dist/web/assets/{lib-B9k5tn9s.js.gz → lib-6APiJkU3.js.gz} +0 -0
- /package/dist/web/assets/{libesm-5f7T4AHA.js → libesm-5wREk7JN.js} +0 -0
- /package/dist/web/assets/{libesm-5f7T4AHA.js.br → libesm-5wREk7JN.js.br} +0 -0
- /package/dist/web/assets/{libesm-5f7T4AHA.js.gz → libesm-5wREk7JN.js.gz} +0 -0
- /package/dist/web/assets/{media-url-CCGOIxzS.js → media-url-CrT-qulZ.js} +0 -0
- /package/dist/web/assets/{metric-chart-canvas-CjFbZuhk.js → metric-chart-canvas-D7f-LQ8x.js} +0 -0
- /package/dist/web/assets/{metric-chart-canvas-CjFbZuhk.js.br → metric-chart-canvas-D7f-LQ8x.js.br} +0 -0
- /package/dist/web/assets/{metric-chart-canvas-CjFbZuhk.js.gz → metric-chart-canvas-D7f-LQ8x.js.gz} +0 -0
- /package/dist/web/assets/{monaco-dotenv-language-Bwq3gQsi.js → monaco-dotenv-language-DbSss7YR.js} +0 -0
- /package/dist/web/assets/{onboarding-entry-CuH1Kqwu.js → onboarding-entry-CGFdGLLP.js} +0 -0
- /package/dist/web/assets/{onboarding-entry-CuH1Kqwu.js.br → onboarding-entry-CGFdGLLP.js.br} +0 -0
- /package/dist/web/assets/{onboarding-entry-CuH1Kqwu.js.gz → onboarding-entry-CGFdGLLP.js.gz} +0 -0
- /package/dist/web/assets/{pdf-preview-X8bdpfE9.js → pdf-preview-B8A4T-ES.js} +0 -0
- /package/dist/web/assets/{pdf-preview-X8bdpfE9.js.br → pdf-preview-B8A4T-ES.js.br} +0 -0
- /package/dist/web/assets/{pdf-preview-X8bdpfE9.js.gz → pdf-preview-B8A4T-ES.js.gz} +0 -0
- /package/dist/web/assets/{separator-DMu7VFQa.js → separator-dHj3Km--.js} +0 -0
- /package/dist/web/assets/{sortable-header-CipIP7aH.js → sortable-header-BOa8o7NJ.js} +0 -0
- /package/dist/web/assets/{sortable-header-CipIP7aH.js.br → sortable-header-BOa8o7NJ.js.br} +0 -0
- /package/dist/web/assets/{sortable-header-CipIP7aH.js.gz → sortable-header-BOa8o7NJ.js.gz} +0 -0
- /package/dist/web/assets/{use-blob-url-DjuRQWnR.js → use-blob-url-BC69n15x.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-Be4L1NHd.js → vendor-xterm-CfasyE0m.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-Be4L1NHd.js.br → vendor-xterm-CfasyE0m.js.br} +0 -0
- /package/dist/web/assets/{vendor-xterm-Be4L1NHd.js.gz → vendor-xterm-CfasyE0m.js.gz} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import{Mr as r,ct as i,ir as a,r as o}from"./icons-CO_II6D-.js";import{r as s}from"./api-client-F5Zi1sR0.js";import{t as c}from"./button-DeAyLH9U.js";import{t as l}from"./input-CG8PS8mS.js";import{Ct as u,Ft as d,St as f,Tt as p,Wn as m,bt as h,er as g,pt as _,wt as v,xt as y}from"./index-DhWjx5iR.js";import{a as b,b as x}from"./api-settings-CpO8SPk9.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))),u=a?`text-[11px]`:`text-sm`;return(0,C.jsxs)(`div`,{className:`space-y-1`,children:[(0,C.jsx)(d,{htmlFor:e,className:u,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`} ${u}`,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)(l,{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`}],k=[{value:`bypassPermissions`,label:`Bypass permissions (default)`},{value:`default`,label:`Ask before edits`},{value:`acceptEdits`,label:`Edit automatically`},{value:`plan`,label:`Plan mode`}],A={claude:`Claude`,cursor:`Cursor`,codex:`Codex`,gemini:`Gemini`};function j({compact:e}={}){let[t,n]=(0,S.useState)(null),[r,w]=(0,S.useState)(``),[T,E]=(0,S.useState)([]),[j,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:A[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)(d,{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)(u,{id:`ai-new-chat-provider`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,C.jsx)(v,{})}),(0,C.jsxs)(y,{children:[(0,C.jsx)(f,{value:`follow-focus`,children:`Follow last focused chat`}),(0,C.jsx)(f,{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)(d,{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)(u,{id:`ai-default-provider`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,C.jsx)(v,{})}),(0,C.jsx)(y,{children:G.map(e=>(0,C.jsx)(f,{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)(d,{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)(p,{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})})]}),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)(g,{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:[A[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)(c,{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:()=>m(`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)(d,{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:j,children:[(0,C.jsx)(u,{id:`ai-model`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,C.jsx)(v,{placeholder:j?`Loading models...`:`Select model`})}),(0,C.jsx)(y,{className:`max-h-[300px]`,children:ne.map(e=>(0,C.jsx)(f,{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)(d,{htmlFor:`ai-base-url`,className:e?X:void 0,children:`Base URL`}),(0,C.jsx)(l,{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)(d,{htmlFor:`ai-api-key`,className:e?X:void 0,children:`API Key / Token`}),(0,C.jsx)(l,{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)(d,{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)(u,{id:`ai-effort`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,C.jsx)(v,{})}),(0,C.jsx)(y,{children:O.map(e=>(0,C.jsx)(f,{value:e.value,children:e.label},e.value))})]})]}),(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(d,{htmlFor:`ai-max-turns`,className:e?X:void 0,children:`Max Turns (1-500)`}),(0,C.jsx)(l,{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)(d,{htmlFor:`ai-budget`,className:e?X:void 0,children:`Max Budget (USD)`}),(0,C.jsx)(l,{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)(d,{htmlFor:`ai-thinking`,className:e?X:void 0,children:`Thinking Budget (tokens)`}),(0,C.jsx)(l,{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)(d,{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)(p,{id:`ai-agent-teams`,checked:K?.agent_teams??!1,onCheckedChange:e=>Y(`agent_teams`,e)})]}),K?.agent_teams&&(0,C.jsx)(ee,{compact:e}),(0,C.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,C.jsxs)(`div`,{children:[(0,C.jsx)(d,{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)(p,{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)(d,{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)(p,{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)(d,{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)(_,{showWhenEmpty:!0})})]})]}),(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(d,{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)(u,{id:`ai-permission-mode`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,C.jsx)(v,{})}),(0,C.jsx)(y,{children:k.map(e=>(0,C.jsx)(f,{value:e.value,children:e.label},e.value))})]})]}),(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(d,{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 ee({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 f=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)(d,{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:()=>f(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{j as t};
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import{Mr as r,ct as i,ir as a,r as o}from"./icons-CO_II6D-.js";import{r as s}from"./api-client-F5Zi1sR0.js";import{t as c}from"./button-DeAyLH9U.js";import{t as l}from"./input-CG8PS8mS.js";import{Ct as u,Et as d,Lt as f,St as p,Tt as m,mt as h,qn as g,rr as _,wt as v,xt as y}from"./index-CyDLBddf.js";import{a as b,b as x}from"./api-settings-Cc_CpfmC.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))),u=a?`text-[11px]`:`text-sm`;return(0,C.jsxs)(`div`,{className:`space-y-1`,children:[(0,C.jsx)(f,{htmlFor:e,className:u,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`} ${u}`,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)(l,{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`}],k=[{value:`bypassPermissions`,label:`Bypass permissions (default)`},{value:`default`,label:`Ask before edits`},{value:`acceptEdits`,label:`Edit automatically`},{value:`plan`,label:`Plan mode`}],A={claude:`Claude`,cursor:`Cursor`,codex:`Codex`,gemini:`Gemini`};function j({compact:e}={}){let[t,n]=(0,S.useState)(null),[r,w]=(0,S.useState)(``),[T,E]=(0,S.useState)([]),[j,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:A[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)(f,{htmlFor:`ai-new-chat-provider`,className:e?X:void 0,children:`New chat provider`}),(0,C.jsxs)(y,{value:t.new_chat_provider_mode??`default`,disabled:N,onValueChange:e=>J({new_chat_provider_mode:e}),children:[(0,C.jsx)(v,{id:`ai-new-chat-provider`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,C.jsx)(m,{})}),(0,C.jsxs)(p,{children:[(0,C.jsx)(u,{value:`follow-focus`,children:`Follow last focused chat`}),(0,C.jsx)(u,{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)(f,{htmlFor:`ai-default-provider`,className:e?X:void 0,children:`Default provider`}),(0,C.jsxs)(y,{value:t.default_provider,disabled:N,onValueChange:e=>J({default_provider:e}),children:[(0,C.jsx)(v,{id:`ai-default-provider`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,C.jsx)(m,{})}),(0,C.jsx)(p,{children:G.map(e=>(0,C.jsx)(u,{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)(f,{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)(d,{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})})]}),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)(_,{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:[A[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)(c,{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:()=>g(`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)(f,{htmlFor:`ai-model`,className:e?X:void 0,children:`Model`}),(0,C.jsxs)(y,{value:q?K?.model??T[0]?.value:K?.model||`__default__`,onValueChange:e=>Y(`model`,e===`__default__`?void 0:e),disabled:j,children:[(0,C.jsx)(v,{id:`ai-model`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,C.jsx)(m,{placeholder:j?`Loading models...`:`Select model`})}),(0,C.jsx)(p,{className:`max-h-[300px]`,children:ne.map(e=>(0,C.jsx)(u,{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)(f,{htmlFor:`ai-base-url`,className:e?X:void 0,children:`Base URL`}),(0,C.jsx)(l,{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)(f,{htmlFor:`ai-api-key`,className:e?X:void 0,children:`API Key / Token`}),(0,C.jsx)(l,{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)(f,{htmlFor:`ai-effort`,className:e?X:void 0,children:`Effort`}),(0,C.jsxs)(y,{value:K?.effort??`high`,onValueChange:e=>Y(`effort`,e),children:[(0,C.jsx)(v,{id:`ai-effort`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,C.jsx)(m,{})}),(0,C.jsx)(p,{children:O.map(e=>(0,C.jsx)(u,{value:e.value,children:e.label},e.value))})]})]}),(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(f,{htmlFor:`ai-max-turns`,className:e?X:void 0,children:`Max Turns (1-500)`}),(0,C.jsx)(l,{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)(f,{htmlFor:`ai-budget`,className:e?X:void 0,children:`Max Budget (USD)`}),(0,C.jsx)(l,{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)(f,{htmlFor:`ai-thinking`,className:e?X:void 0,children:`Thinking Budget (tokens)`}),(0,C.jsx)(l,{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)(f,{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)(d,{id:`ai-agent-teams`,checked:K?.agent_teams??!1,onCheckedChange:e=>Y(`agent_teams`,e)})]}),K?.agent_teams&&(0,C.jsx)(ee,{compact:e}),(0,C.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,C.jsxs)(`div`,{children:[(0,C.jsx)(f,{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)(d,{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)(f,{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)(d,{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)(f,{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)(h,{showWhenEmpty:!0})})]})]}),(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(f,{htmlFor:`ai-permission-mode`,className:e?X:void 0,children:`Default Permission Mode`}),(0,C.jsxs)(y,{value:K?.permission_mode??`bypassPermissions`,onValueChange:e=>Y(`permission_mode`,e),children:[(0,C.jsx)(v,{id:`ai-permission-mode`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,C.jsx)(m,{})}),(0,C.jsx)(p,{children:k.map(e=>(0,C.jsx)(u,{value:e.value,children:e.label},e.value))})]})]}),(0,C.jsxs)(`div`,{className:$,children:[(0,C.jsx)(f,{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 ee({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)(f,{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{j as t};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,2 @@
|
|
|
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-P9Ym7hCv.js";import{A as r,An as i,Bt as a,Gt as o,Hr as s,Jr as c,Lr as l,Mr as u,Nr as d,O as f,Qn as p,Qt as m,Un as h,Ur as g,W as _,Yn as v,Zn as y,a as b,ar as x,ir as S,jn as C,l as w,lr as T,nt as E,or as D,un as O,ur as k,w as A,xr as j,yr as M,z as N,zt as P}from"./icons-CO_II6D-.js";import{O as F,a as I,r as L}from"./api-client-F5Zi1sR0.js";import{n as R}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import"./panel-store-B6PoCwBA.js";import"./window-store-vo1N70nK.js";import{i as z}from"./project-store-CCimwgGF.js";import"./session-list-sync-triggers-ATvz-1g3.js";import{t as B}from"./tab-store-DCpc0g0Q.js";import{n as V}from"./use-is-mobile-BClDZJP5.js";import{t as H}from"./button-DeAyLH9U.js";import{a as ee,n as te,o as ne,r as U,t as W}from"./dialog-Bocc0Fgb.js";import{t as G}from"./mobile-bottom-sheet-D4UyOatB.js";import"./use-visual-viewport-BGpcMnIx.js";import{t as K}from"./input-CG8PS8mS.js";import{t as q}from"./ws-auth-Ytui7dXP.js";import{Cn as re,Ft as J,Mn as ie,wn as Y,xn as ae}from"./index-CyDLBddf.js";import{n as oe,t as se}from"./use-h264-canvas-decoder-BfO9QrlH.js";var X=e(t(),1),ce=/^[A-Za-z0-9][A-Za-z0-9._-]{0,62}$/;function le(e){return ce.test(e)?null:`use 1–63 letters, digits, dots, dashes or underscores, starting with a letter or digit`}var Z={ramMb:{min:512,max:16*1024,default:2048},storageMb:{min:1024,max:128*1024,default:6144},sdCardMb:{min:0,max:32*1024,default:512}},Q=n(),ue=[`phone`,`tablet`,`tv`,`wear`,`automotive`,`desktop`,`other`],de={phone:`Phones`,tablet:`Tablets`,tv:`TV`,wear:`Wear`,automotive:`Automotive`,desktop:`Desktop`,other:`Other`},fe=e=>`${(e/1024**3).toFixed(1)} GB`;function pe({open:e,onClose:t,existingNames:n,onCreated:r}){let i=V(),[o,s]=(0,X.useState)(null),[c,l]=(0,X.useState)(null),[u,f]=(0,X.useState)(null),[p,m]=(0,X.useState)(``),[h,g]=(0,X.useState)(``),[_,v]=(0,X.useState)(``),[y,b]=(0,X.useState)(String(Z.ramMb.default)),[x,S]=(0,X.useState)(String(Z.storageMb.default)),[C,w]=(0,X.useState)(!1),[T,E]=(0,X.useState)(null);(0,X.useEffect)(()=>{if(!e)return;let t=!0;return f(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&&f(e.message)}})(),()=>{t=!1}},[e]);let D=(0,X.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?fe(e.bytes):`needs ${e.abi}`,title:e.id})),[o]),k=(0,X.useMemo)(()=>{let e=c??[];return ue.flatMap(t=>e.filter(e=>e.kind===t).map(e=>({value:e.id,label:e.name,group:de[t],hint:e.oem})))},[c]),A=p.length===0?null:n.some(e=>e.toLowerCase()===p.toLowerCase())?`an AVD with that name already exists`:le(p),j=Number(y),N=Number(x),P=Number.isFinite(j)&&j>=Z.ramMb.min&&j<=Z.ramMb.max?null:`RAM must be between ${Z.ramMb.min} and ${Z.ramMb.max} MB`,F=Number.isFinite(N)&&N>=Z.storageMb.min&&N<=Z.storageMb.max?null:`Storage must be between ${Z.storageMb.min} and ${Z.storageMb.max} MB`,I=p.length>0&&!A&&!P&&!F&&h!==``&&_!==``&&!C,R=()=>{m(``),E(null),w(!1),b(String(Z.ramMb.default)),S(String(Z.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:N}),r(p),R(),t()}catch(e){E(e.message),w(!1)}}},B=!u&&(o===null||c===null),q=(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[u&&(0,Q.jsxs)(`p`,{className:`flex items-start gap-2 text-sm leading-relaxed text-destructive`,children:[(0,Q.jsx)(d,{className:`mt-0.5 size-4 shrink-0`}),(0,Q.jsx)(`span`,{className:`min-w-0 flex-1`,children:u})]}),B&&(0,Q.jsxs)(`p`,{className:`flex items-center gap-2 py-6 text-sm text-muted-foreground`,children:[(0,Q.jsx)(O,{className:`size-4 animate-spin`}),` Reading the SDK…`]}),!B&&!u&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)(`label`,{htmlFor:`avd-name`,className:`text-sm font-medium`,children:`Name`}),(0,Q.jsx)(K,{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,Q.jsx)(`p`,{className:`text-xs leading-relaxed text-destructive`,children:A}):(0,Q.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`This becomes a folder name, so no spaces.`})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)(`span`,{className:`text-sm font-medium`,children:`System image`}),(0,Q.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:a,className:`h-11 w-full md:h-9`,modal:!i}),(0,Q.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,Q.jsx)(`code`,{className:`rounded bg-muted px-1 text-[11px]`,children:`sdkmanager`}),`.`]})]}),(0,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsx)(`span`,{className:`text-sm font-medium`,children:`Device`}),(0,Q.jsx)(J,{value:_,items:k,onChange:v,label:`Device profile`,searchPlaceholder:`Search devices`,emptyText:`No device profiles`,placeholder:`Pick a device`,icon:M,className:`h-11 w-full md:h-9`,modal:!i}),(0,Q.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`Sets the screen. Without one the emulator is 320x640.`})]}),(0,Q.jsxs)(`div`,{className:`flex gap-3`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1.5`,children:[(0,Q.jsx)(`label`,{htmlFor:`avd-ram`,className:`text-sm font-medium`,children:`RAM (MB)`}),(0,Q.jsx)(K,{id:`avd-ram`,inputMode:`numeric`,value:y,className:`h-11`,onChange:e=>b(e.target.value)})]}),(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1.5`,children:[(0,Q.jsx)(`label`,{htmlFor:`avd-storage`,className:`text-sm font-medium`,children:`Storage (MB)`}),(0,Q.jsx)(K,{id:`avd-storage`,inputMode:`numeric`,value:x,className:`h-11`,onChange:e=>S(e.target.value)})]})]}),(P||F)&&(0,Q.jsx)(`p`,{className:`text-xs leading-relaxed text-destructive`,children:P??F}),(0,Q.jsxs)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:[`PPM writes `,(0,Q.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,Q.jsxs)(`p`,{className:`flex items-start gap-2 text-sm leading-relaxed text-destructive`,children:[(0,Q.jsx)(d,{className:`mt-0.5 size-4 shrink-0`}),(0,Q.jsx)(`span`,{className:`min-w-0 flex-1`,children:T})]}),(0,Q.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,Q.jsx)(H,{variant:`outline`,className:`min-h-11`,onClick:()=>{R(),t()},children:`Cancel`}),(0,Q.jsx)(H,{className:`min-h-11`,disabled:!I,onClick:()=>void z(),children:C?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(O,{className:`animate-spin`}),` Creating…`]}):`Create device`})]})]});return e?i?(0,Q.jsx)(G,{open:!0,onClose:t,children:(0,Q.jsxs)(`div`,{className:`max-h-[80vh] overflow-y-auto px-4 pb-4`,children:[(0,Q.jsx)(`h2`,{className:`mb-3 text-base font-semibold`,children:`New Android device`}),q]})}):(0,Q.jsx)(W,{open:!0,onOpenChange:e=>!e&&t(),children:(0,Q.jsxs)(te,{className:`sm:max-w-lg`,children:[(0,Q.jsxs)(ee,{children:[(0,Q.jsx)(ne,{children:`New Android device`}),(0,Q.jsx)(U,{children:`Built from a system image already installed on this host.`})]}),(0,Q.jsx)(`div`,{className:`max-h-[70vh] overflow-y-auto pr-1`,children:q})]})}):null}function me({action:e,avdId:t,deviceName:n,onCancel:r,onDone:i}){let a=V(),[o,s]=(0,X.useState)(``),[c,l]=(0,X.useState)(!1),[u,f]=(0,X.useState)(null);if((0,X.useEffect)(()=>{s(``),f(null),l(!1)},[e,t]),!e)return null;let p=e===`delete`,m=p?`Delete this device`:`Wipe this device`,h=o===n&&!c,g=async()=>{if(h){l(!0),f(null);try{p?(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){f(e.message),l(!1)}}},_=(0,Q.jsxs)(`div`,{className:`space-y-4`,children:[(0,Q.jsx)(`p`,{className:`text-sm leading-relaxed`,children:p?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.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,Q.jsxs)(Q.Fragment,{children:[`Everything inside `,(0,Q.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,Q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,Q.jsxs)(`label`,{htmlFor:`avd-confirm`,className:`text-sm font-medium`,children:[`Type `,(0,Q.jsx)(`span`,{className:`font-mono`,children:n}),` to confirm`]}),(0,Q.jsx)(K,{id:`avd-confirm`,value:o,onChange:e=>s(e.target.value),autoComplete:`off`,spellCheck:!1,autoCapitalize:`off`,className:`h-11 font-mono`})]}),u&&(0,Q.jsxs)(`p`,{className:`flex items-start gap-2 text-sm leading-relaxed text-destructive`,children:[(0,Q.jsx)(d,{className:`mt-0.5 size-4 shrink-0`}),(0,Q.jsx)(`span`,{className:`min-w-0 flex-1`,children:u})]}),(0,Q.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,Q.jsx)(H,{variant:`outline`,className:`min-h-11`,onClick:r,children:`Cancel`}),(0,Q.jsx)(H,{variant:`destructive`,className:`min-h-11`,autoFocus:!1,disabled:!h,onClick:()=>void g(),children:c?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(O,{className:`animate-spin`}),` `,p?`Deleting…`:`Wiping…`]}):p?`Delete device`:`Wipe data`})]})]});return a?(0,Q.jsx)(G,{open:!0,onClose:r,children:(0,Q.jsxs)(`div`,{className:`px-4 pb-4`,children:[(0,Q.jsx)(`h2`,{className:`mb-3 text-base font-semibold`,children:m}),_]})}):(0,Q.jsx)(W,{open:!0,onOpenChange:e=>!e&&r(),children:(0,Q.jsxs)(te,{className:`sm:max-w-md`,children:[(0,Q.jsxs)(ee,{children:[(0,Q.jsx)(ne,{children:m}),(0,Q.jsx)(U,{children:p?`This cannot be undone.`:`A factory reset — the device itself stays.`})]}),_]})})}var he=1500;function ge({onOpen:e}){let[t,n]=(0,X.useState)(null),[r,i]=(0,X.useState)([]),[a,o]=(0,X.useState)(null),[s,c]=(0,X.useState)({}),[l,f]=(0,X.useState)(!1),[p,m]=(0,X.useState)(null),h=(0,X.useRef)(!0),g=(0,X.useCallback)(async()=>{try{let e=await L.get(`/api/android/capabilities`);if(!h.current||(n(e),!e.enabled))return;let t=await L.get(`/api/android/devices`);if(!h.current)return;i(t.devices),o(null)}catch(e){h.current&&o(e.message)}},[]);(0,X.useEffect)(()=>{h.current=!0,g();let e=setInterval(()=>void g(),he*4);return()=>{h.current=!1,clearInterval(e)}},[g]);let _=(0,X.useCallback)(async e=>{c(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,he)),!h.current)return;let n=await L.get(`/api/android/operations/${t}`);if(c(t=>({...t,[e.avdId]:n.detail??`Starting…`})),n.state===`succeeded`)break;if(n.state===`failed`||n.state===`cancelled`){o(n.error??`the emulator failed to start`);break}}}catch(e){h.current&&o(e.message)}finally{h.current&&(c(t=>{let n={...t};return delete n[e.avdId],n}),g())}},[g]),b=(0,X.useCallback)(async e=>{if(e.runtime){c(t=>({...t,[e.avdId]:`Stopping…`}));try{await L.post(`/api/android/devices/${encodeURIComponent(e.runtime.deviceId)}/stop?generation=${e.runtime.generation}`,{})}catch(e){h.current&&o(e.message)}finally{h.current&&(c(t=>{let n={...t};return delete n[e.avdId],n}),g())}}},[g]);if(!t)return(0,Q.jsxs)(`div`,{className:`flex h-full items-center justify-center text-sm text-muted-foreground`,children:[(0,Q.jsx)(O,{className:`mr-2 size-4 animate-spin`}),` Checking this host…`]});let w=t.requirements.filter(e=>!e.met);return(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 border-b px-4 py-3`,children:[(0,Q.jsx)(M,{className:`size-4 shrink-0 text-muted-foreground`}),(0,Q.jsx)(`h2`,{className:`min-w-0 flex-1 truncate text-sm font-medium`,children:`Android devices`}),t.canCreateAvd&&(0,Q.jsxs)(H,{size:`sm`,className:`h-10`,onClick:()=>f(!0),children:[(0,Q.jsx)(y,{}),` New device`]}),(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:`size-10`,onClick:()=>void g(),title:`Refresh`,"aria-label":`Refresh`,children:(0,Q.jsx)(S,{})})]}),(0,Q.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-4`,children:[a&&(0,Q.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,Q.jsx)(d,{className:`mt-0.5 size-4 shrink-0 text-destructive`}),(0,Q.jsx)(`span`,{className:`min-w-0 flex-1 leading-relaxed`,children:a})]}),w.length>0&&(0,Q.jsxs)(`div`,{className:`mb-4 rounded-md border p-4`,children:[(0,Q.jsx)(`p`,{className:`text-sm font-medium`,children:`This host is not ready yet`}),(0,Q.jsx)(`ul`,{className:`mt-3 space-y-3`,children:t.requirements.map(e=>(0,Q.jsxs)(`li`,{className:`flex items-start gap-2 text-sm leading-relaxed`,children:[e.met?(0,Q.jsx)(A,{className:`mt-0.5 size-4 shrink-0 text-muted-foreground`}):(0,Q.jsx)(d,{className:`mt-0.5 size-4 shrink-0 text-destructive`}),(0,Q.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(`span`,{className:R(!e.met&&`font-medium`),children:e.label}),(0,Q.jsx)(`span`,{className:`block text-muted-foreground`,children:e.detail}),!e.met&&e.fix&&(0,Q.jsx)(`code`,{className:`mt-1 block overflow-x-auto rounded bg-muted px-2 py-1 text-xs`,children:e.fix})]})]},e.id))})]}),r.length===0&&w.length===0&&(0,Q.jsxs)(`div`,{className:`py-8 text-center`,children:[(0,Q.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:`No AVDs on this host yet.`}),t.canCreateAvd?(0,Q.jsxs)(H,{className:`mt-4 min-h-11`,onClick:()=>f(!0),children:[(0,Q.jsx)(y,{}),` New device`]}):(0,Q.jsxs)(`p`,{className:`mt-2 text-sm leading-relaxed text-muted-foreground`,children:[`Create one in Android Studio, or with`,` `,(0,Q.jsx)(`code`,{className:`rounded bg-muted px-1 py-0.5 text-xs`,children:`avdmanager create avd`}),`.`]})]}),(0,Q.jsx)(`ul`,{className:`space-y-2`,children:r.map(n=>{let r=n.runtime!==null,i=s[n.avdId];return(0,Q.jsxs)(`li`,{className:`flex flex-col gap-3 rounded-md border p-4 sm:flex-row sm:items-center`,children:[(0,Q.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(`p`,{className:`truncate text-sm font-medium`,children:n.name}),(0,Q.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,Q.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,Q.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,Q.jsx)(`code`,{className:`rounded bg-muted px-1 text-[11px]`,children:`hw.keyboard=yes`}),` in its config.ini.`]})]}),(0,Q.jsxs)(`div`,{className:`flex shrink-0 items-center gap-2`,children:[i&&(0,Q.jsxs)(`span`,{className:`flex items-center gap-1.5 text-xs text-muted-foreground`,children:[(0,Q.jsx)(O,{className:`size-3.5 animate-spin`}),` `,i]}),r?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(H,{size:`sm`,className:`h-10`,onClick:()=>e(n),children:`View`}),n.runtime.ownedByPpm&&(0,Q.jsxs)(H,{size:`sm`,variant:`outline`,className:`h-10`,disabled:!!i,onClick:()=>void b(n),children:[(0,Q.jsx)(j,{}),` Stop`]})]}):(0,Q.jsxs)(H,{size:`sm`,className:`h-10`,disabled:!!i||n.lockedByAnotherProcess||!t.ready,onClick:()=>void _(n),children:[(0,Q.jsx)(v,{}),` Start`]}),(0,Q.jsxs)(ae,{children:[(0,Q.jsx)(ie,{asChild:!0,children:(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:`size-11 md:size-10`,title:`More for ${n.name}`,"aria-label":`More for ${n.name}`,children:(0,Q.jsx)(C,{})})}),(0,Q.jsxs)(re,{align:`end`,children:[(0,Q.jsxs)(Y,{className:`min-h-11 md:min-h-0`,disabled:r||n.lockedByAnotherProcess||!!i,onSelect:()=>m({action:`wipe`,device:n}),children:[(0,Q.jsx)(x,{}),` Wipe data`]}),(0,Q.jsxs)(Y,{variant:`destructive`,className:`min-h-11 md:min-h-0`,disabled:r||n.lockedByAnotherProcess||!!i||!t.canCreateAvd,onSelect:()=>m({action:`delete`,device:n}),children:[(0,Q.jsx)(u,{}),` Delete device`]})]})]})]})]},n.avdId)})})]}),(0,Q.jsx)(pe,{open:l,onClose:()=>f(!1),existingNames:r.map(e=>e.name),onCreated:e=>{F.success(`Created ${e}`),g()}}),(0,Q.jsx)(me,{action:p?.action??null,avdId:p?.device.avdId??``,deviceName:p?.device.name??``,onCancel:()=>m(null),onDone:(e,t)=>{m(null),F.success(t),g()}})]})}var _e={low:`Low`,balanced:`Balanced`,high:`High`};function ve(e){let{send:t,controller:n,rotation:r,quality:a,onQualityChange:o,onKeyboard:c,layout:l}=e,[u,d]=(0,X.useState)(!1),f=l===`bar`,h=f?`size-11`:`size-9`,_=e=>()=>t({type:`hardware`,key:e});return(0,Q.jsxs)(`div`,{className:R(`flex items-center gap-2`,ye(f)),children:[(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:h,disabled:!n,onClick:_(`back`),title:`Back`,"aria-label":`Back`,children:(0,Q.jsx)(w,{})}),(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:h,disabled:!n,onClick:_(`home`),title:`Home`,"aria-label":`Home`,children:(0,Q.jsx)(N,{})}),(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:h,disabled:!n,onClick:_(`recent`),title:`Recent apps`,"aria-label":`Recent apps`,children:(0,Q.jsx)(j,{})}),(0,Q.jsx)(`span`,{className:`mx-1 h-6 w-px shrink-0 bg-border`,"aria-hidden":!0}),(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:h,disabled:!n,onClick:c,title:`Keyboard`,"aria-label":`Keyboard`,children:(0,Q.jsx)(m,{})}),(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:h,disabled:!n,onClick:()=>t({type:`rotate`,rotation:be(r)}),title:`Rotate (now ${r}°)`,"aria-label":`Rotate`,children:(0,Q.jsx)(D,{})}),(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:h,disabled:!n,onClick:()=>d(e=>!e),title:`More keys`,"aria-label":`More keys`,"aria-expanded":u,children:(0,Q.jsx)(i,{})}),u&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:h,disabled:!n,onClick:_(`volume-up`),title:`Volume up`,"aria-label":`Volume up`,children:(0,Q.jsx)(g,{})}),(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:h,disabled:!n,onClick:_(`volume-down`),title:`Volume down`,"aria-label":`Volume down`,children:(0,Q.jsx)(s,{})}),(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:h,disabled:!n,onClick:_(`power`),title:`Power`,"aria-label":`Power`,children:(0,Q.jsx)(p,{})})]}),(0,Q.jsx)(`span`,{className:`flex-1`}),(0,Q.jsx)(`label`,{className:`sr-only`,htmlFor:`android-quality`,children:`Quality`}),(0,Q.jsx)(`select`,{id:`android-quality`,className:R(`rounded-md border bg-background px-2 text-sm`,f?`h-11`:`h-9`),value:a,disabled:!n,onChange:e=>o(e.target.value),children:Object.keys(_e).map(e=>(0,Q.jsx)(`option`,{value:e,children:_e[e]},e))})]})}function ye(e){return e?`w-full justify-center border-t bg-background/95 px-3 py-2 backdrop-blur`:`px-2 py-1`}function be(e){return(e+90)%360}function xe({deviceId:e}){let[t,n]=(0,X.useState)(null),[r,i]=(0,X.useState)(``),[a,o]=(0,X.useState)(null),[s,c]=(0,X.useState)(!1),[u,d]=(0,X.useState)(null),f=(0,X.useCallback)(async()=>{o(`read`),d(null);try{n((await L.get(`/api/android/devices/${encodeURIComponent(e)}/clipboard`)).text)}catch(e){d(e.message)}finally{o(null)}},[e]),p=(0,X.useCallback)(async()=>{o(`write`),d(null);try{await L.post(`/api/android/devices/${encodeURIComponent(e)}/clipboard`,{text:r}),c(!0),setTimeout(()=>c(!1),1500)}catch(e){d(e.message)}finally{o(null)}},[e,r]);return(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col gap-4 overflow-auto p-3`,children:[(0,Q.jsxs)(`section`,{className:`flex flex-col gap-2`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`h3`,{className:`flex-1 text-sm font-medium`,children:`From the device`}),(0,Q.jsxs)(H,{variant:`secondary`,className:`h-11 md:h-9`,onClick:()=>void f(),disabled:a!==null,children:[a===`read`?(0,Q.jsx)(O,{className:`animate-spin`}):(0,Q.jsx)(_,{}),` Read`]})]}),t!==null&&(0,Q.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,Q.jsxs)(`section`,{className:`flex flex-col gap-2 border-t pt-3`,children:[(0,Q.jsx)(`h3`,{className:`text-sm font-medium`,children:`To the device`}),(0,Q.jsx)(`textarea`,{value:r,onChange:e=>i(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,Q.jsxs)(H,{className:`h-11 self-start md:h-9`,onClick:()=>void p(),disabled:a!==null||r.length===0,children:[s?(0,Q.jsx)(A,{}):a===`write`?(0,Q.jsx)(O,{className:`animate-spin`}):(0,Q.jsx)(l,{}),s?`Sent`:`Send to device`]}),(0,Q.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,Q.jsx)(`p`,{className:`text-sm text-destructive`,children:u})]})}function Se(e,t,n){let r=new URLSearchParams({filename:t});return n&&r.set(`downgrade`,`1`),`/api/android/devices/${encodeURIComponent(e)}/apk?${r.toString()}`}function Ce(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 we(e){let t=new XMLHttpRequest,n=!1;return{done:new Promise((n,r)=>{t.open(`POST`,Se(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(Ce(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 Te=800;function Ee({deviceId:e,deviceName:t}){let n=z(e=>e.projects),[r,i]=(0,X.useState)(``),[a,o]=(0,X.useState)(null),[s,c]=(0,X.useState)(!1),[u,d]=(0,X.useState)(!1),[f,p]=(0,X.useState)({kind:`idle`}),m=(0,X.useRef)(null),h=(0,X.useRef)(null),g=(0,X.useRef)(f);g.current=f;let _=f.kind===`uploading`||f.kind===`installing`,v=(0,X.useCallback)(async(e,t)=>{for(;;){await new Promise(e=>setTimeout(e,Te));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){p({kind:`failed`,message:e.message});return}if(r.state===`succeeded`){p({kind:`done`,filename:t});return}if(r.state===`failed`){p({kind:`failed`,message:r.error??`the install failed`});return}if(r.state===`cancelled`){p({kind:`idle`});return}p({kind:`installing`,operationId:e,detail:r.detail,filename:t})}},[]),y=(0,X.useCallback)(t=>{p({kind:`uploading`,fraction:0,filename:t.name});let n=we({deviceId:e,file:t,allowDowngrade:u,token:I(),onProgress:e=>p({kind:`uploading`,fraction:e,filename:t.name})});h.current=n,n.done.then(e=>{h.current=null,p({kind:`installing`,operationId:e,detail:`installing…`,filename:t.name}),v(e,t.name)}).catch(e=>{h.current=null,p(e.message===`cancelled`?{kind:`idle`}:{kind:`failed`,message:e.message})})},[e,u,v]),b=(0,X.useCallback)(async t=>{let n=t.split(`/`).pop()??t;p({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:u});p({kind:`installing`,operationId:i,detail:`installing…`,filename:n}),v(i,n)}catch(e){p({kind:`failed`,message:e.message})}},[e,r,u,v]),x=(0,X.useCallback)(()=>{if(f.kind===`uploading`){h.current?.cancel();return}f.kind===`installing`&&f.operationId&&(L.post(`/api/android/operations/${encodeURIComponent(f.operationId)}/cancel`,{}).catch(()=>{}),p({kind:`idle`}))},[f]),C=(0,X.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,X.useEffect)(()=>{C(r)},[r,C]),(0,X.useEffect)(()=>()=>h.current?.cancel(),[]),(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col gap-3 overflow-auto p-3`,children:[(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Installing on `,t,`.`]}),(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Q.jsx)(`input`,{ref:m,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,Q.jsxs)(H,{className:`h-11 md:h-9`,disabled:_,onClick:()=>m.current?.click(),children:[(0,Q.jsx)(l,{}),` Choose an APK`]}),(0,Q.jsxs)(`label`,{className:`flex min-h-11 cursor-pointer items-center gap-2 text-sm md:min-h-9`,children:[(0,Q.jsx)(`input`,{type:`checkbox`,className:`size-4`,checked:u,disabled:_,onChange:e=>d(e.target.checked)}),`Allow downgrade`]})]}),(0,Q.jsx)(De,{phase:f,onCancel:x,onDismiss:()=>p({kind:`idle`})}),(0,Q.jsxs)(`div`,{className:`flex flex-col gap-2 border-t pt-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Q.jsx)(`label`,{className:`text-sm`,htmlFor:`android-apk-project`,children:`From a project`}),(0,Q.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,Q.jsx)(`option`,{value:``,children:`Choose a project…`}),n.map(e=>(0,Q.jsx)(`option`,{value:e.name,children:e.name},e.name))]}),r&&(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:`size-11 md:size-9`,disabled:s,onClick:()=>void C(r),title:`Rescan`,"aria-label":`Rescan`,children:s?(0,Q.jsx)(O,{className:`animate-spin`}):(0,Q.jsx)(S,{})})]}),s&&(0,Q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Looking for APKs…`}),!s&&a?.length===0&&(0,Q.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,Q.jsx)(`ul`,{className:`flex flex-col gap-1`,children:a.map(e=>(0,Q.jsx)(`li`,{children:(0,Q.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,Q.jsx)(`span`,{dir:`rtl`,className:`w-full truncate`,children:(0,Q.jsx)(`bdi`,{children:e.path})}),(0,Q.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[Oe(e.bytes),` · `,new Date(e.modifiedAt).toLocaleString()]})]})},e.path))})]})]})}function De({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,Q.jsxs)(`div`,{className:`flex flex-col gap-2 rounded-md border p-3`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 text-sm`,children:[(0,Q.jsx)(O,{className:`size-4 shrink-0 animate-spin`}),(0,Q.jsx)(`span`,{dir:`rtl`,className:`min-w-0 flex-1 truncate`,children:(0,Q.jsx)(`bdi`,{children:e.filename})}),(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:`size-9`,onClick:t,title:`Cancel`,"aria-label":`Cancel`,children:(0,Q.jsx)(c,{})})]}),n===null?(0,Q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:r}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`h-1.5 overflow-hidden rounded-full bg-muted`,children:(0,Q.jsx)(`div`,{className:`h-full bg-primary transition-[width]`,style:{width:`${n}%`}})}),(0,Q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Uploading — `,n,`%`]})]})]})}return e.kind===`done`?(0,Q.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,Q.jsx)(A,{className:`size-4 shrink-0 text-emerald-600 dark:text-emerald-400`}),(0,Q.jsx)(`span`,{dir:`rtl`,className:`min-w-0 flex-1 truncate`,children:(0,Q.jsx)(`bdi`,{children:e.filename})}),(0,Q.jsx)(`span`,{className:`shrink-0 text-muted-foreground`,children:`installed`}),(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:`size-9`,onClick:n,"aria-label":`Dismiss`,children:(0,Q.jsx)(c,{})})]}):(0,Q.jsxs)(`div`,{className:`flex items-start gap-2 rounded-md border border-destructive/40 bg-destructive/10 p-3 text-sm`,children:[(0,Q.jsx)(d,{className:`mt-0.5 size-4 shrink-0 text-destructive`}),(0,Q.jsx)(`span`,{className:`min-w-0 flex-1`,children:e.message}),(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:`size-9`,onClick:n,"aria-label":`Dismiss`,children:(0,Q.jsx)(c,{})})]})}function Oe(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(0)} KB`:`${(e/1024/1024).toFixed(1)} MB`}var ke=[`verbose`,`debug`,`info`,`warn`,`error`,`fatal`],Ae=new Map(ke.map((e,t)=>[e,t]));function je(e,t){return(Ae.get(e)??0)>=(Ae.get(t)??0)}var Me={minimum:`verbose`,text:``,pid:0};function Ne(e,t){if(!je(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 Pe(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 Fe(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 Ie(e){let t={verbose:`V`,debug:`D`,info:`I`,warn:`W`,error:`E`,fatal:`F`};return e.map(e=>`${Fe(e.timestamp)} ${String(e.pid).padStart(5)} ${String(e.tid).padStart(5)} ${t[e.level]} ${e.tag}: ${e.message}`).join(`
|
|
2
|
+
`)}var Le=1e3,Re=400,ze={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,r]=(0,X.useState)([]),[i,a]=(0,X.useState)(Me),[o,s]=(0,X.useState)(!1),[c,l]=(0,X.useState)(!1),[d,f]=(0,X.useState)(!0),p=(0,X.useRef)(null),m=(0,X.useRef)(!1);m.current=o,(0,X.useEffect)(()=>(e(!0),()=>e(!1)),[e]),(0,X.useEffect)(()=>t(e=>{m.current||r(t=>Pe(t,e,Le))}),[t]);let g=(0,X.useMemo)(()=>{let e=n.filter(e=>Ne(e,i));return e.length>Re?e.slice(e.length-Re):e},[n,i]);(0,X.useEffect)(()=>{if(!d)return;let e=p.current;e&&(e.scrollTop=e.scrollHeight)},[g,d]);let _=(0,X.useCallback)(()=>{let e=p.current;e&&f(e.scrollHeight-e.scrollTop-e.clientHeight<24)},[]),y=(0,X.useCallback)(async()=>{let e=Ie(g);try{navigator.clipboard?.writeText?await navigator.clipboard.writeText(e):He(e),l(!0),setTimeout(()=>l(!1),1500)}catch{He(e)}},[g]);return(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col bg-background`,children:[(0,Q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 border-b p-2`,children:[(0,Q.jsxs)(`div`,{className:`relative min-w-40 flex-1`,children:[(0,Q.jsx)(k,{className:`pointer-events-none absolute left-2 top-1/2 size-4 -translate-y-1/2 text-muted-foreground`}),(0,Q.jsx)(K,{className:`h-11 pl-8 md:h-9`,placeholder:`Filter tag or message`,value:i.text,onChange:e=>a(t=>({...t,text:e.target.value}))})]}),(0,Q.jsx)(`label`,{className:`sr-only`,htmlFor:`android-log-level`,children:`Minimum level`}),(0,Q.jsx)(`select`,{id:`android-log-level`,className:`h-11 rounded-md border bg-background px-2 text-sm md:h-9`,value:i.minimum,onChange:e=>a(t=>({...t,minimum:e.target.value})),children:ke.map(e=>(0,Q.jsx)(`option`,{value:e,children:e[0].toUpperCase()+e.slice(1)},e))}),(0,Q.jsx)(H,{variant:o?`default`:`ghost`,size:`icon`,className:`size-11 md:size-9`,onClick:()=>s(e=>!e),title:o?`Resume`:`Pause the view`,"aria-label":o?`Resume`:`Pause the view`,"aria-pressed":o,children:o?(0,Q.jsx)(v,{}):(0,Q.jsx)(h,{})}),(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:`size-11 md:size-9`,onClick:()=>r([]),title:`Clear the view`,"aria-label":`Clear the view`,children:(0,Q.jsx)(u,{})}),(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:`size-11 md:size-9`,onClick:()=>void y(),title:`Copy what is shown`,"aria-label":`Copy what is shown`,children:c?(0,Q.jsx)(A,{}):(0,Q.jsx)(E,{})})]}),(0,Q.jsx)(`div`,{ref:p,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,Q.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,Q.jsxs)(`div`,{className:`flex gap-2 whitespace-pre-wrap break-words`,children:[(0,Q.jsx)(`span`,{className:`shrink-0 tabular-nums text-muted-foreground`,children:Fe(e.timestamp)}),(0,Q.jsx)(`span`,{className:R(`w-3 shrink-0 text-center font-semibold`,ze[e.level]),children:Be[e.level]}),e.tag&&(0,Q.jsx)(`button`,{type:`button`,className:`shrink-0 max-w-40 truncate text-left text-muted-foreground hover:underline`,title:`Filter by ${e.tag}`,onClick:()=>a(t=>({...t,text:e.tag})),children:e.tag}),(0,Q.jsx)(`span`,{className:R(`min-w-0`,ze[e.level]),children:e.message})]},e.id))}),(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 border-t px-2 py-1 text-xs text-muted-foreground`,children:[(0,Q.jsx)(`span`,{children:g.length===n.length?`${n.length} lines`:`${g.length} of ${n.length} lines`}),o&&(0,Q.jsx)(`span`,{className:`text-amber-600 dark:text-amber-400`,children:`paused`}),(0,Q.jsx)(`span`,{className:`flex-1`}),!d&&(0,Q.jsxs)(H,{variant:`ghost`,size:`sm`,className:`h-8`,onClick:()=>f(!0),children:[(0,Q.jsx)(b,{}),` 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:M},{id:`logs`,label:`Logs`,Icon:T},{id:`clipboard`,label:`Clipboard`,Icon:_}];function We(e){let{tool:t,onToolChange:n,onClose:r,deviceId:i,deviceName:a,setLogcat:o,onLog:s}=e;return(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col border-t bg-background`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-1 border-b px-1`,children:[Ue.map(({id:e,label:r,Icon:i})=>(0,Q.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,Q.jsx)(i,{className:`size-4`}),r]},e)),(0,Q.jsx)(`span`,{className:`flex-1`}),(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:`size-11 md:size-9`,onClick:r,title:`Hide the tools`,"aria-label":`Hide the tools`,children:(0,Q.jsx)(f,{})})]}),(0,Q.jsxs)(`div`,{className:`min-h-0 flex-1`,children:[t===`install`&&(0,Q.jsx)(Ee,{deviceId:i,deviceName:a}),t===`logs`&&(0,Q.jsx)(Ve,{setLogcat:o,onLog:s}),t===`clipboard`&&(0,Q.jsx)(xe,{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,X.useRef)(null),a=(0,X.useRef)(t);a.current=t;let o=(0,X.useRef)(n);return o.current=n,(0,X.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,X.useCallback)(()=>i.current?.focus(),[]),blur:(0,X.useCallback)(()=>i.current?.blur(),[])}}function Qe(e,t,n=`8081`){let r=q(`/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,X.useState)(`connecting`),[s,c]=(0,X.useState)(null),[l,u]=(0,X.useState)(null),[d,f]=(0,X.useState)(!1),[p,m]=(0,X.useState)(null),[h,g]=(0,X.useState)(null),[_,v]=(0,X.useState)(!1),y=oe(r),b=(0,X.useRef)(null),x=(0,X.useRef)(0),S=(0,X.useRef)(0),C=(0,X.useRef)(null),w=(0,X.useRef)(null),T=(0,X.useRef)(n);T.current=n;let E=(0,X.useRef)(!1),D=(0,X.useRef)(new Set),O=(0,X.useRef)(!1),k=(0,X.useCallback)(e=>{let t=b.current;t?.readyState===WebSocket.OPEN&&t.send(JSON.stringify(e))},[]),A=(0,X.useCallback)(()=>k({type:`take-control`}),[k]),j=(0,X.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,X.useCallback)(()=>{S.current+=1,C.current&&clearTimeout(C.current),C.current=null,b.current?.close(),b.current=null},[]),N=(0,X.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||se(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,X.useEffect)(()=>(N(),()=>{M(),y.reset()}),[t]),(0,X.useEffect)(()=>{let e=setInterval(()=>k({type:`heartbeat`}),et);return()=>clearInterval(e)},[k]),(0,X.useEffect)(()=>{k({type:`visibility`,visible:!i})},[i,k]),(0,X.useEffect)(()=>{a===`live`&&k({type:`quality`,quality:n})},[n,a,k]);let P=(0,X.useCallback)(e=>{O.current=e,k({type:`logcat`,subscribe:e})},[k]),F=(0,X.useCallback)(e=>{let t=D.current;return t.add(e),()=>{t.delete(e)}},[]),I=(0,X.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,X.useRef)(new Map),o=(0,X.useRef)(n);o.current=n;let s=(0,X.useRef)(r);s.current=r;let c=(0,X.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,X.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,X.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,X.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,X.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,X.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:i}){let a=(0,X.useRef)(null),[s,c]=(0,X.useState)(`balanced`),[l,u]=(0,X.useState)(null),[f,p]=(0,X.useState)(!1),[m,h]=(0,X.useState)(null),g=tt({deviceId:e,quality:s,canvasRef:a,paused:n}),_=ct({canvasRef:a,geometry:g.geometry,enabled:g.controller,send:g.send}),v=Ze({geometry:g.geometry,enabled:g.controller,send:g.send});(0,X.useEffect)(()=>{g.controller||v.blur()},[g.controller,v]);let y=g.geometry?.rotation??0,b=g.state===`connecting`||g.state===`reconnecting`,x=(0,X.useCallback)(async()=>{p(!0),h(null);try{await Je(e,I(),`${t}.png`)}catch(e){h(e.message)}finally{p(!1)}},[e,t]);return(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col bg-black`,children:[(0,Q.jsxs)(`div`,{className:`flex items-center gap-1 border-b bg-background px-1 py-1`,children:[i&&(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:`size-11 md:size-9`,onClick:i,title:`All devices`,"aria-label":`All devices`,children:(0,Q.jsx)(r,{})}),(0,Q.jsx)(`span`,{className:`min-w-0 flex-1 truncate px-1 text-sm font-medium`,children:t}),(0,Q.jsx)(H,{variant:`ghost`,size:`icon`,className:`size-11 md:size-9`,disabled:f,onClick:()=>void x(),title:`Save a screenshot`,"aria-label":`Save a screenshot`,children:f?(0,Q.jsx)(O,{className:`animate-spin`}):(0,Q.jsx)(o,{})}),Ue.map(({id:e,label:t,Icon:n})=>(0,Q.jsx)(H,{variant:l===e?`secondary`:`ghost`,size:`icon`,className:`size-11 md:size-9`,"aria-pressed":l===e,onClick:()=>u(t=>t===e?null:e),title:t,"aria-label":t,children:(0,Q.jsx)(n,{})},e))]}),m&&(0,Q.jsx)(`div`,{className:`bg-destructive/90 px-4 py-2 text-center text-sm text-white`,children:m}),!g.controller&&g.state===`live`&&(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 border-b bg-background px-4 py-2 text-sm`,children:[(0,Q.jsx)(P,{className:`size-4 shrink-0 text-muted-foreground`}),(0,Q.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-muted-foreground`,children:g.controllerReason??`Someone else is controlling this device.`}),(0,Q.jsx)(H,{size:`sm`,onClick:g.takeControl,children:`Take control`})]}),(0,Q.jsxs)(`div`,{className:`relative flex min-h-0 flex-1 items-center justify-center overflow-hidden`,children:[(0,Q.jsx)(`canvas`,{ref:a,className:R(`max-h-full max-w-full touch-none select-none object-contain`,g.controller?`cursor-crosshair`:`cursor-default`),onPointerDown:e=>{_.onPointerDown(e),v.focus()},onPointerMove:_.onPointerMove,onPointerUp:_.onPointerUp,onPointerCancel:_.onPointerCancel}),!g.hasPicture&&(0,Q.jsx)(`div`,{className:`absolute inset-0 flex flex-col items-center justify-center gap-3 text-sm text-white/70`,children:g.state===`failed`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(d,{className:`size-6`}),(0,Q.jsx)(`p`,{className:`max-w-xs px-6 text-center`,children:g.errorMessage??`Could not connect.`}),(0,Q.jsxs)(H,{size:`sm`,variant:`secondary`,onClick:g.reconnect,children:[(0,Q.jsx)(S,{}),` Try again`]})]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(O,{className:`size-6 animate-spin`}),(0,Q.jsx)(`p`,{children:b?`Connecting to ${t}…`:`Waiting for the first frame…`})]})}),g.hasPicture&&g.errorMessage&&(0,Q.jsx)(`div`,{className:`absolute inset-x-0 top-0 bg-destructive/90 px-4 py-2 text-center text-sm text-white`,children:g.errorMessage})]}),(0,Q.jsx)(`textarea`,{ref:v.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:()=>{}}),l&&(0,Q.jsx)(`div`,{className:`h-[45%] min-h-0 shrink-0`,children:(0,Q.jsx)(We,{tool:l,onToolChange:u,onClose:()=>u(null),deviceId:e,deviceName:t,setLogcat:g.setLogcat,onLog:g.onLog})}),(0,Q.jsx)(ve,{layout:`bar`,send:g.send,controller:g.controller,rotation:y,quality:s,onQualityChange:c,onKeyboard:v.focus})]})}function ut({metadata:e,tabId:t}){let n=B(e=>e.updateTab),r=typeof e?.avdId==`string`?e.avdId:null,[i,a]=(0,X.useState)(null),[o,s]=(0,X.useState)(r!==null);(0,X.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,X.useCallback)(r=>{a(r),t&&n(t,{title:r.name,metadata:{...e,avdId:r.avdId}})},[t,n,e]),l=(0,X.useCallback)(()=>{a(null),t&&n(t,{title:`Android`,metadata:{...e,avdId:void 0}})},[t,n,e]);return o?(0,Q.jsx)(`div`,{className:`h-full`}):i?.runtime?(0,Q.jsx)(lt,{deviceId:i.runtime.deviceId,deviceName:i.name,onBack:l}):(0,Q.jsx)(ge,{onOpen:c})}export{ut as AndroidTab};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-P9Ym7hCv.js";import"./api-client-F5Zi1sR0.js";import"./chat-preparation-cache-BUCR58h4.js";import{S as e}from"./api-settings-
|
|
1
|
+
import"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-P9Ym7hCv.js";import"./api-client-F5Zi1sR0.js";import"./chat-preparation-cache-BUCR58h4.js";import{S as e}from"./api-settings-Cc_CpfmC.js";export{e as updateDeviceName};
|
|
@@ -1 +1 @@
|
|
|
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-P9Ym7hCv.js";import{Mr as s,Zn as c,qr as l,w as u}from"./icons-CO_II6D-.js";import{O as d}from"./api-client-F5Zi1sR0.js";import{t as f}from"./settings-store-DfuiLq_9.js";import{n as p}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import{n as m}from"./use-is-mobile-BClDZJP5.js";import{n as h,t as g}from"./button-DeAyLH9U.js";import{a as _,i as v,n as y,o as b,r as x,t as S}from"./dialog-Bocc0Fgb.js";import{t as C}from"./input-CG8PS8mS.js";import{n as w,r as T,t as E}from"./resolve-theme-STMsK2vc.js";import{G as D,Tt as O,vn as k,z as A}from"./index-DhWjx5iR.js";import{t as j}from"./separator-DMu7VFQa.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)(D,{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)(u,{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)(c,{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)(D,{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)(u,{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)(s,{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:u,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:A.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)(l,{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)(O,{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)(l,{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)(O,{checked:_?d:c,onCheckedChange:()=>_?h():u()})]}),(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};
|
|
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-P9Ym7hCv.js";import{Mr as s,Zn as c,qr as l,w as u}from"./icons-CO_II6D-.js";import{O as d}from"./api-client-F5Zi1sR0.js";import{t as f}from"./settings-store-Cyuo8ceh.js";import{n as p}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import{n as m}from"./use-is-mobile-BClDZJP5.js";import{n as h,t as g}from"./button-DeAyLH9U.js";import{a as _,i as v,n as y,o as b,r as x,t as S}from"./dialog-Bocc0Fgb.js";import{t as C}from"./input-CG8PS8mS.js";import{n as w,r as T,t as E}from"./resolve-theme-STMsK2vc.js";import{B as D,Et as O,K as k,bn as A}from"./index-CyDLBddf.js";import{t as j}from"./separator-dHj3Km--.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)(k,{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)(u,{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)(c,{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)(k,{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)(u,{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)(s,{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(A(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:u,mobileWordWrap:d,toggleMobileWordWrap:h}=f(A(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:D.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)(l,{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)(O,{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)(l,{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)(O,{checked:_?d:c,onCheckedChange:()=>_?h():u()})]}),(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
|
|
@@ -1 +1 @@
|
|
|
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-P9Ym7hCv.js";import{ur as r}from"./icons-CO_II6D-.js";import{a as i}from"./api-client-F5Zi1sR0.js";import{n as a}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import"./context-menu-7OX80HDB.js";import"./use-is-mobile-BClDZJP5.js";import"./button-DeAyLH9U.js";import"./dialog-Bocc0Fgb.js";import"./mobile-bottom-sheet-D4UyOatB.js";import"./use-visual-viewport-BGpcMnIx.js";import{
|
|
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-P9Ym7hCv.js";import{ur as r}from"./icons-CO_II6D-.js";import{a as i}from"./api-client-F5Zi1sR0.js";import{n as a}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import"./context-menu-7OX80HDB.js";import"./use-is-mobile-BClDZJP5.js";import"./button-DeAyLH9U.js";import"./dialog-Bocc0Fgb.js";import"./mobile-bottom-sheet-D4UyOatB.js";import"./use-visual-viewport-BGpcMnIx.js";import{dn as o,ln as s,mn as c,un as l,vn as u}from"./index-CyDLBddf.js";import{r as d}from"./format-bytes-FQmpZ25A.js";import{o as f}from"./process-row-format-u6y7lOee.js";import{n as p,r as m,t as h}from"./use-process-kill-Cbiu1mbY.js";var g=e(t(),1);function _(e){let t=new Map;for(let n of e){let e=t.get(n.ppid);e?e.push(n.pid):t.set(n.ppid,[n.pid])}return t}function v(e,t){let n=new Set,r=[...e];for(;r.length>0;){let e=r.pop();if(!n.has(e)){n.add(e);for(let n of t.get(e)??[])r.push(n)}}return[...n]}function y(e){let t=0,n=!1;for(let r of e)r!==void 0&&(n=!0,t+=r);return n?t:void 0}var b=e=>Math.round(e*10)/10;function x(e,t){let n=new Map(t.map(e=>[e.pid,e])),r=_(t),i=[];for(let t of e){let e=v(t.pids,r).map(e=>n.get(e)).filter(e=>e!==void 0);e.length!==0&&i.push({id:t.id,name:t.name,icon:t.icon,pids:t.pids,memberPids:e.map(e=>e.pid),processCount:e.length,cpu:b(e.reduce((e,t)=>e+t.cpu,0)),ramMB:b(e.reduce((e,t)=>e+t.ramMB,0)),swapMB:y(e.map(e=>e.swapMB)),diskReadBps:y(e.map(e=>e.diskReadBps)),diskWriteBps:y(e.map(e=>e.diskWriteBps)),gpuPct:S(y(e.map(e=>e.gpuPct))),gpuMemMB:y(e.map(e=>e.gpuMemMB))})}return i}function S(e){return e===void 0?void 0:b(Math.min(100,Math.max(0,e)))}function C(e,t,n){let r=n===`asc`?1:-1;return[...e].sort((e,n)=>{if(t===`name`)return r*e.name.localeCompare(n.name);let i=t===`cpu`?e.cpu-n.cpu:e.ramMB-n.ramMB;return i===0?e.name.localeCompare(n.name):r*i})}function w(e,t){let n=t.trim().toLowerCase();return n?e.filter(e=>e.name.toLowerCase().includes(n)):[...e]}var T=n();function E(e){let t=i(),n=t?`?token=${encodeURIComponent(t)}`:``;return`/api/system/app-icon/${encodeURIComponent(e)}${n}`}function D(e){return e>80?`text-error`:e>50?`text-warning`:`text-text-secondary`}function O({app:e,endProtected:t,onEnd:n}){let[r,i]=(0,g.useState)(!1);return(0,T.jsxs)(s,{children:[(0,T.jsx)(u,{asChild:!0,children:(0,T.jsx)(`div`,{className:`select-none`,children:(0,T.jsxs)(`div`,{className:`w-full min-h-11 px-3 py-2 flex items-center gap-3 hover:bg-surface-hover transition-colors`,"data-testid":`sysmon-app-row`,"data-app-id":e.id,"data-cpu":e.cpu,children:[e.icon&&!r?(0,T.jsx)(`img`,{src:E(e.id),alt:``,width:24,height:24,className:`size-6 shrink-0 object-contain`,onError:()=>i(!0)}):(0,T.jsx)(`span`,{"aria-hidden":!0,className:`size-6 shrink-0 rounded bg-surface-hover grid place-items-center text-[11px] text-text-subtle`,children:e.name.slice(0,1).toUpperCase()}),(0,T.jsxs)(`span`,{className:`flex-1 min-w-0`,children:[(0,T.jsx)(`span`,{className:`block text-sm truncate`,children:e.name}),(0,T.jsxs)(`span`,{className:`block text-[11px] text-text-subtle`,children:[e.processCount,` process`,e.processCount===1?``:`es`]})]}),(0,T.jsxs)(`span`,{className:a(`w-14 text-right text-xs tabular-nums`,D(e.cpu)),children:[e.cpu.toFixed(1),`%`]}),(0,T.jsx)(`span`,{className:`w-16 text-right text-xs tabular-nums text-text-secondary`,children:d(e.ramMB)}),e.swapMB!==void 0&&(0,T.jsx)(`span`,{className:`hidden @xs:block w-16 text-right text-xs tabular-nums text-text-subtle`,children:f(e.swapMB)})]})})}),(0,T.jsxs)(l,{children:[(0,T.jsx)(o,{variant:`destructive`,disabled:t,onSelect:()=>{t||n(e)},children:`End application`}),t&&(0,T.jsxs)(T.Fragment,{children:[(0,T.jsx)(c,{}),(0,T.jsx)(`p`,{className:`px-2 py-1.5 text-[11px] text-text-subtle max-w-64`,children:`One of this app's processes is protected, so PPM will not end it.`})]})]})]})}var k=[{key:`cpu`,label:`CPU`},{key:`ram`,label:`Memory`},{key:`name`,label:`Name`}];function A(e){return{key:`app:${e.id}`,label:e.name,rootPid:null,cpu:e.cpu,ramMB:e.ramMB,count:e.processCount,ppm:!1,pids:e.memberPids}}function j({snapshot:e}){let[t,n]=(0,g.useState)(``),[i,o]=(0,g.useState)(`cpu`),{pendingKill:s,requestKillGroup:c,confirmKill:l,cancelKill:u}=h(e),d=(0,g.useMemo)(()=>new Map(e.processes.map(e=>[e.pid,e])),[e.processes]),f=(0,g.useMemo)(()=>x(e.apps??[],e.processes),[e.apps,e.processes]),_=(0,g.useMemo)(()=>C(w(f,t),i,i===`name`?`asc`:`desc`),[f,t,i]),v=(0,g.useCallback)(e=>p(e.memberPids.map(e=>d.get(e)).filter(e=>e!==void 0)),[d]);return e.apps===void 0?(0,T.jsx)(`div`,{className:`p-4 text-sm text-text-subtle`,"data-testid":`sysmon-apps`,children:`This host does not list desktop applications.`}):(0,T.jsxs)(`div`,{className:`h-full flex flex-col min-h-0 @container`,"data-testid":`sysmon-apps`,"data-app-count":_.length,children:[(0,T.jsxs)(`div`,{className:`shrink-0 flex flex-wrap items-center gap-2 p-2 border-b border-border`,children:[(0,T.jsxs)(`div`,{className:`relative flex-1 min-w-[140px]`,children:[(0,T.jsx)(r,{className:`absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-text-subtle`}),(0,T.jsx)(`input`,{type:`text`,value:t,onChange:e=>n(e.target.value),placeholder:`Search applications`,"aria-label":`Search applications`,"data-testid":`sysmon-app-search`,className:`w-full min-h-11 md:min-h-8 pl-7 pr-2 text-sm rounded-md border border-border bg-transparent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`})]}),k.map(e=>(0,T.jsx)(`button`,{type:`button`,onClick:()=>o(e.key),"aria-pressed":i===e.key,"data-testid":`sysmon-app-sort-${e.key}`,className:a(`min-h-11 md:min-h-8 px-3 text-xs rounded-md border transition-colors`,i===e.key?`border-primary bg-primary/10 text-primary`:`border-border hover:bg-surface-hover`),children:e.label},e.key))]}),(0,T.jsxs)(`div`,{className:`flex-1 min-h-0 overflow-y-auto divide-y divide-border`,children:[_.length===0&&(0,T.jsx)(`p`,{className:`p-4 text-sm text-text-subtle`,children:f.length===0?`No desktop applications are running.`:`No applications match.`}),_.map(e=>(0,T.jsx)(O,{app:e,endProtected:v(e),onEnd:e=>c(A(e))},e.id))]}),(0,T.jsx)(m,{target:s,onConfirm:l,onCancel:u})]})}export{j as AppsPanel};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
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-P9Ym7hCv.js";import{Fn as r,bt as i}from"./icons-CO_II6D-.js";import"./api-client-F5Zi1sR0.js";import{t as a}from"./utils-btZ8C8-R.js";import{r as o}from"./media-url-
|
|
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-P9Ym7hCv.js";import{Fn as r,bt as i}from"./icons-CO_II6D-.js";import"./api-client-F5Zi1sR0.js";import{t as a}from"./utils-btZ8C8-R.js";import{r as o}from"./media-url-CrT-qulZ.js";var s=e(t(),1),c=n();function l({filePath:e,projectName:t}){let[n,l]=(0,s.useState)(!1);return n?(0,c.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-text-secondary`,children:[(0,c.jsx)(i,{className:`size-10 text-text-subtle`}),(0,c.jsx)(`p`,{className:`text-sm`,children:`Failed to load audio.`})]}):(0,c.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-4 p-4 bg-surface`,children:[(0,c.jsx)(r,{className:`size-16 text-text-subtle`}),(0,c.jsx)(`p`,{className:`text-sm text-text-secondary truncate max-w-xs`,children:a(e)}),(0,c.jsx)(`audio`,{src:o(e,t),controls:!0,preload:`metadata`,className:`w-full max-w-md`,onError:()=>l(!0)},e)]})}export{l as AudioPreview};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
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-P9Ym7hCv.js";import{O as r,ir as i,j as a,on as o,u as s,un as c,vt as l,w as u}from"./icons-CO_II6D-.js";import{r as d}from"./api-client-F5Zi1sR0.js";import"./settings-store-Cyuo8ceh.js";import"./portal-container-context-NFSuymMu.js";import"./project-store-CCimwgGF.js";import{n as f}from"./use-is-mobile-BClDZJP5.js";import"./git-repo-store-B_u5RzIM.js";import{t as p}from"./button-DeAyLH9U.js";import{t as m}from"./file-icons-CK0J4QSy.js";import{t as h}from"./mobile-bottom-sheet-D4UyOatB.js";import"./use-visual-viewport-BGpcMnIx.js";import{t as g}from"./scroll-area-sjOeAfoD.js";import{At as ee,It as _,Mt as v,Nt as te,Pt as y,cn as ne,jt as re,kt as b}from"./index-CyDLBddf.js";import"./use-monaco-theme-DvNGcCvz.js";import"./use-inline-blame-CxZ_QWzS.js";import{DiffViewer as x}from"./diff-viewer-BZ6glGK-.js";var S=e(t(),1),C=`ppm:branch-review`,w=`${C}:recent`,T=20;function ie(e,t,n){return`${C}:${e}:${t}:${n}`}function E(e,t){return e[t.path]===t.blob}function D(e,t){let n={...e};return E(e,t)?delete n[t.path]:n[t.path]=t.blob,n}function O(e,t,n){if(!n)return{};let r={...e};for(let e of t)r[e.path]=e.blob;return r}function ae(e,t){return t.reduce((t,n)=>t+(E(e,n)?1:0),0)}function oe(e,t){let n=new Set(t.map(e=>e.path)),r={};for(let[t,i]of Object.entries(e))n.has(t)&&(r[t]=i);return r}function se(e){return e.find(e=>!e.binary)??e[0]??null}function ce(e,t,n){if(t.length===0)return null;let r=n?t.findIndex(e=>e.path===n)+1:0;for(let n=0;n<t.length;n++){let i=t[(r+n)%t.length];if(i&&!E(e,i))return i}return null}function le(e){try{let t=localStorage.getItem(e);if(!t)return{};let n=JSON.parse(t);if(!n||typeof n!=`object`||Array.isArray(n))return{};let r={};for(let[e,t]of Object.entries(n))typeof t==`string`&&(r[e]=t);return r}catch{return{}}}function k(e,t,n=T){let r=[t,...e.filter(e=>e!==t)];return{recent:r.slice(0,n),evicted:r.slice(n)}}function A(){try{let e=JSON.parse(localStorage.getItem(w)??`[]`);return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}catch{return[]}}function j(e,t){try{if(Object.keys(t).length===0){localStorage.removeItem(e);let t=A().filter(t=>t!==e);localStorage.setItem(w,JSON.stringify(t));return}localStorage.setItem(e,JSON.stringify(t));let{recent:n,evicted:r}=k(A(),e);for(let e of r)localStorage.removeItem(e);localStorage.setItem(w,JSON.stringify(n))}catch{}}var M=n(),N={M:`text-warning`,A:`text-success`,D:`text-error`,R:`text-primary`,C:`text-accent-2`,T:`text-text-3`};function P(e){let{node:t,depth:n,byPath:i,reviewed:o,selectedPath:s,collapsed:c,onToggleCollapse:l,onSelect:d,onToggleReviewed:f}=e,p=t.file?i.get(t.fullPath):void 0;if(!p){let i=c.has(t.fullPath);return(0,M.jsxs)(M.Fragment,{children:[(0,M.jsxs)(`button`,{type:`button`,"data-testid":`branch-review-folder`,className:`w-full flex items-center gap-1 px-2 py-1 text-xs min-h-11 md:min-h-0 hover:bg-surface-hover text-left`,style:{paddingLeft:n*14+8},onClick:()=>l(t.fullPath),children:[i?(0,M.jsx)(a,{className:`size-3 shrink-0`}):(0,M.jsx)(r,{className:`size-3 shrink-0`}),(0,M.jsx)(`span`,{className:`truncate text-text-2`,children:t.name})]}),!i&&t.children.map(t=>(0,M.jsx)(P,{...e,node:t,depth:n+1},t.fullPath))]})}let h=E(o,p),g=s===p.path;return(0,M.jsxs)(`div`,{className:`flex items-center gap-1.5 pr-2 py-1 text-xs cursor-pointer border-l-2 min-h-11 md:min-h-0 hover:bg-surface-hover ${g?`bg-primary/10 border-primary`:`border-transparent`}`,style:{paddingLeft:n*14+6},onClick:()=>d(p.path),"aria-current":g?`true`:void 0,"data-testid":`branch-review-file`,"data-path":p.path,"data-selected":g?`true`:`false`,"data-reviewed":h?`true`:`false`,children:[(0,M.jsx)(`button`,{type:`button`,"aria-label":h?`Mark ${p.path} unreviewed`:`Mark ${p.path} reviewed`,"data-testid":`branch-review-check`,className:`size-11 md:size-4 shrink-0 flex items-center justify-center`,onClick:e=>{e.stopPropagation(),f(p)},children:(0,M.jsx)(`span`,{"data-testid":`branch-review-check-box`,className:`size-4 rounded border flex items-center justify-center ${h?`bg-primary border-primary text-primary-foreground`:`border-border`}`,children:h&&(0,M.jsx)(u,{className:`size-3`})})}),(0,M.jsx)(m,{name:t.name,className:`size-3.5 shrink-0`}),(0,M.jsx)(_,{children:t.name}),(0,M.jsx)(`span`,{className:`shrink-0 font-mono ${N[p.status]}`,children:p.status}),p.binary?(0,M.jsx)(`span`,{className:`shrink-0 text-text-3 italic`,children:`bin`}):(0,M.jsxs)(`span`,{className:`shrink-0 tabular-nums text-[10px]`,children:[(0,M.jsxs)(`span`,{className:`text-success`,children:[`+`,p.additions]}),` `,(0,M.jsxs)(`span`,{className:`text-error`,children:[`-`,p.deletions]})]})]})}function ue(e,t){let n=e.filter(e=>!e.remote&&e.name!==t);return n.find(e=>e.name===`main`)?.name??n.find(e=>e.name===`master`)?.name??n[0]?.name??``}function F({metadata:e}){let t=e?.projectName,n=ne(t),r=f(),[a,u]=(0,S.useState)([]),[m,C]=(0,S.useState)(``),[w,T]=(0,S.useState)(``),[E,k]=(0,S.useState)(null),[A,N]=(0,S.useState)(null),[F,I]=(0,S.useState)({}),[de,L]=(0,S.useState)(new Set),[R,z]=(0,S.useState)(!1),[B,V]=(0,S.useState)(null),[fe,H]=(0,S.useState)(!1);(0,S.useEffect)(()=>{if(!t||!n.repo)return;let e=!1;return d.get(n.gitUrl(`/branches`)).then(t=>{if(e)return;u(t);let n=t.find(e=>e.current)?.name;T(e=>e||n||``),C(e=>e||ue(t,n))}).catch(t=>!e&&V(t instanceof Error?t.message:`Could not list branches`)),()=>{e=!0}},[t,n]);let U=(0,S.useRef)(null),W=(0,S.useCallback)(async()=>{if(!t||!n.repo||!m||!w)return;U.current?.abort();let e=new AbortController;U.current=e,z(!0),V(null);try{let t=new URLSearchParams({base:m,head:w}),r=await d.get(n.gitUrl(`/branch-diff?${t}`),{signal:e.signal});if(e.signal.aborted)return;k(r),N(e=>e&&r.files.some(t=>t.path===e)?e:se(r.files)?.path??null)}catch(t){if(e.signal.aborted)return;k(null),V(t instanceof Error?t.message:`Could not compare these branches`)}finally{e.signal.aborted||z(!1)}},[t,n,m,w]);(0,S.useEffect)(()=>(W(),()=>U.current?.abort()),[W]);let G=t&&m&&w?ie(t,m,w):null;(0,S.useEffect)(()=>{L(new Set)},[G]),(0,S.useEffect)(()=>{I(G?le(G):{})},[G]);let K=E&&E.base===m&&E.head===w?E:null;(0,S.useEffect)(()=>{!G||!K||I(e=>{let t=oe(e,K.files);return Object.keys(t).length!==Object.keys(e).length&&j(G,t),t})},[G,K]);let q=(0,S.useCallback)(e=>{I(e),G&&j(G,e)},[G]),J=K?.files??[],Y=(0,S.useMemo)(()=>new Map(J.map(e=>[e.path,e])),[J]),X=(0,S.useMemo)(()=>ae(F,J),[F,J]),pe=(0,S.useMemo)(()=>ee(b(J.map(e=>({path:e.path,status:e.status===`T`?`M`:e.status})))),[J]),Z=A?Y.get(A)??null:null,Q=(0,S.useCallback)(()=>{let e=ce(F,J,A);e&&(N(e.path),H(!1))},[F,J,A]);if(n.noRepo)return(0,M.jsx)(re,{onReload:n.reload});if(n.needsPick)return(0,M.jsx)(te,{repos:n.repos,onChoose:n.choose});let $=(0,M.jsx)(g,{className:`h-full`,children:(0,M.jsxs)(`div`,{className:`py-1`,children:[J.length===0&&!R&&(0,M.jsx)(`div`,{className:`px-3 py-6 text-center text-xs text-text-3`,children:B?`—`:`These branches have identical trees.`}),pe.map(e=>(0,M.jsx)(P,{node:e,depth:0,byPath:Y,reviewed:F,selectedPath:A,collapsed:de,onToggleCollapse:e=>L(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),onSelect:e=>{N(e),H(!1)},onToggleReviewed:e=>q(D(F,e))},e.fullPath)),!!K?.omitted&&(0,M.jsxs)(`div`,{className:`px-3 py-3 text-center text-xs text-text-3`,children:[K.omitted.toLocaleString(),` more `,K.omitted===1?`file`:`files`,` not listed.`]})]})});return(0,M.jsxs)(`div`,{className:`flex flex-col h-full overflow-hidden bg-bg`,children:[n.isNested&&n.repo&&(0,M.jsx)(v,{repo:n.repo,repos:n.repos,onChoose:n.choose}),(0,M.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1.5 border-b border-border shrink-0 flex-wrap`,children:[(0,M.jsx)(y,{value:m,branches:a,onChange:C,label:`Base branch`,testId:`branch-review-base`,className:`max-w-[38%]`}),(0,M.jsx)(s,{className:`size-3.5 text-text-3 shrink-0`}),(0,M.jsx)(y,{value:w,branches:a,onChange:T,label:`Branch to review`,testId:`branch-review-head`,className:`max-w-[38%]`}),(0,M.jsxs)(`div`,{className:`ml-auto flex items-center gap-2`,children:[(0,M.jsxs)(`span`,{className:`text-xs text-text-2 tabular-nums`,"data-testid":`branch-review-progress`,children:[X,`/`,J.length,` reviewed`]}),(0,M.jsx)(p,{variant:`ghost`,size:`icon-xs`,title:X===J.length&&J.length>0?`Clear all`:`Mark all reviewed`,disabled:J.length===0,onClick:()=>q(O(F,J,X!==J.length)),children:(0,M.jsx)(o,{className:`size-3.5`})}),(0,M.jsx)(p,{variant:`ghost`,size:`icon-xs`,title:`Reload`,onClick:()=>void W(),children:(0,M.jsx)(i,{className:R?`animate-spin`:``})})]})]}),B&&(0,M.jsx)(`div`,{className:`px-3 py-1.5 text-xs text-destructive bg-destructive/10 shrink-0`,children:B}),(0,M.jsxs)(`div`,{className:`flex-1 flex min-h-0`,children:[!r&&(0,M.jsx)(`div`,{className:`w-72 shrink-0 border-r border-border flex flex-col min-h-0`,children:$}),(0,M.jsx)(`div`,{className:`flex-1 min-w-0 flex flex-col`,children:Z?(0,M.jsx)(x,{metadata:{filePath:n.projectFile(Z.path),projectName:t,ref1:K?.mergeBase,ref2:K?.headCommit}},`${Z.path}:${K?.mergeBase}:${K?.headCommit}`):(0,M.jsx)(`div`,{className:`flex-1 flex items-center justify-center text-xs text-text-3`,children:R?(0,M.jsx)(c,{className:`size-4 animate-spin`}):`Nothing to review.`})})]}),r&&(0,M.jsxs)(`div`,{className:`flex items-center gap-2 border-t border-border p-2 shrink-0`,children:[(0,M.jsxs)(p,{variant:`secondary`,size:`sm`,className:`flex-1 min-h-11`,onClick:()=>H(!0),children:[(0,M.jsx)(l,{className:`size-4`}),J.length,` files`]}),(0,M.jsx)(p,{variant:`secondary`,size:`sm`,className:`flex-1 min-h-11`,onClick:Q,children:`Next unreviewed`})]}),r&&(0,M.jsx)(h,{open:fe,onClose:()=>H(!1),children:(0,M.jsx)(`div`,{className:`max-h-[70vh] overflow-hidden flex flex-col`,children:$})}),!r&&Z&&(0,M.jsxs)(`div`,{className:`flex items-center gap-2 border-t border-border px-2 py-1 shrink-0`,children:[(0,M.jsx)(_,{children:Z.path}),(0,M.jsx)(p,{variant:`ghost`,size:`xs`,onClick:Q,children:`Next unreviewed`})]})]})}export{F as BranchReviewTab};
|
|
Binary file
|
|
Binary file
|