@hienlh/ppm 0.23.26 → 0.23.27
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 +6 -0
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/dist/web/assets/accounts-settings-section-CZglHifc.js +1 -0
- package/dist/web/assets/accounts-settings-section-CZglHifc.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-CZglHifc.js.gz +0 -0
- package/dist/web/assets/{agent-session-sheet-DmbSfFGz.js → agent-session-sheet-B3VLD2H6.js} +2 -2
- package/dist/web/assets/agent-session-sheet-B3VLD2H6.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-B3VLD2H6.js.gz +0 -0
- package/dist/web/assets/{agent-session-window-content-Dk8x3ozF.js → agent-session-window-content-HEdIT_LQ.js} +1 -1
- package/dist/web/assets/agent-session-window-content-HEdIT_LQ.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-HEdIT_LQ.js.gz +0 -0
- package/dist/web/assets/{ai-resource-editor-MKwjYcDh.js → ai-resource-editor-CFbXgGMo.js} +1 -1
- package/dist/web/assets/ai-resource-editor-CFbXgGMo.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-CFbXgGMo.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-BNiVD9D3.js +1 -0
- package/dist/web/assets/ai-settings-section-BNiVD9D3.js.br +0 -0
- package/dist/web/assets/ai-settings-section-BNiVD9D3.js.gz +0 -0
- package/dist/web/assets/{ai-settings-section-OZOaLw5z.js → ai-settings-section-W0kfADRB.js} +1 -1
- package/dist/web/assets/{android-tab-CUkjbfyi.js → android-tab-CY3aa_vU.js} +1 -1
- package/dist/web/assets/android-tab-CY3aa_vU.js.br +0 -0
- package/dist/web/assets/android-tab-CY3aa_vU.js.gz +0 -0
- package/dist/web/assets/{appearance-settings-section-BZsM8HpZ.js → appearance-settings-section-lbtuzecW.js} +1 -1
- package/dist/web/assets/appearance-settings-section-lbtuzecW.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-lbtuzecW.js.gz +0 -0
- package/dist/web/assets/{apps-panel-Cs3utBlp.js → apps-panel-CF2mbvVq.js} +1 -1
- package/dist/web/assets/apps-panel-CF2mbvVq.js.br +0 -0
- package/dist/web/assets/apps-panel-CF2mbvVq.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-CR7JnS5x.js +1 -0
- package/dist/web/assets/branch-review-tab-CR7JnS5x.js.br +0 -0
- package/dist/web/assets/branch-review-tab-CR7JnS5x.js.gz +0 -0
- package/dist/web/assets/chat-tab-BCELq4nK.js +1 -0
- package/dist/web/assets/chat-tab-BCELq4nK.js.br +0 -0
- package/dist/web/assets/chat-tab-BCELq4nK.js.gz +0 -0
- package/dist/web/assets/{chat-tab-DtSHSfMU.js → chat-tab-C4aOYSea.js} +10 -10
- package/dist/web/assets/chat-tab-C4aOYSea.js.br +0 -0
- package/dist/web/assets/chat-tab-C4aOYSea.js.gz +0 -0
- package/dist/web/assets/{code-editor-DjDyhff1.js → code-editor-_axJbYkP.js} +5 -5
- package/dist/web/assets/code-editor-_axJbYkP.js.br +0 -0
- package/dist/web/assets/code-editor-_axJbYkP.js.gz +0 -0
- package/dist/web/assets/{codex-reset-credit-button-BKgiUi8E.js → codex-reset-credit-button-DJQD6NUF.js} +1 -1
- package/dist/web/assets/codex-reset-credit-button-DJQD6NUF.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-DJQD6NUF.js.gz +0 -0
- package/dist/web/assets/{conflict-editor-DgTv-8pb.js → conflict-editor-D0AYuLKI.js} +3 -3
- package/dist/web/assets/conflict-editor-D0AYuLKI.js.br +0 -0
- package/dist/web/assets/conflict-editor-D0AYuLKI.js.gz +0 -0
- package/dist/web/assets/connection-form-tab-C3QyUWnE.js +4 -0
- package/dist/web/assets/connection-form-tab-C3QyUWnE.js.br +0 -0
- package/dist/web/assets/connection-form-tab-C3QyUWnE.js.gz +0 -0
- package/dist/web/assets/{csv-preview-BTGpYs4p.js → csv-preview-CmKkcz4M.js} +1 -1
- package/dist/web/assets/csv-preview-CmKkcz4M.js.br +0 -0
- package/dist/web/assets/csv-preview-CmKkcz4M.js.gz +0 -0
- package/dist/web/assets/{db-explorer-store-DDePT3UI.js → db-explorer-store-DJNNIfN5.js} +1 -1
- package/dist/web/assets/db-explorer-store-DJNNIfN5.js.br +0 -0
- package/dist/web/assets/db-explorer-store-DJNNIfN5.js.gz +0 -0
- package/dist/web/assets/{db-sidebar-reveal-BeT8cp6P.js → db-sidebar-reveal-CGqWBYay.js} +1 -1
- package/dist/web/assets/db-sidebar-reveal-CGqWBYay.js.br +0 -0
- package/dist/web/assets/db-sidebar-reveal-CGqWBYay.js.gz +0 -0
- package/dist/web/assets/{db-tab-parts-BYzd4_sR.js → db-tab-parts-BXL34wrZ.js} +1 -1
- package/dist/web/assets/db-tab-parts-BXL34wrZ.js.br +0 -0
- package/dist/web/assets/db-tab-parts-BXL34wrZ.js.gz +0 -0
- package/dist/web/assets/{design-settings-section-B3KQBggK.js → design-settings-section-DukfVtwP.js} +2 -2
- package/dist/web/assets/design-settings-section-DukfVtwP.js.br +0 -0
- package/dist/web/assets/design-settings-section-DukfVtwP.js.gz +0 -0
- package/dist/web/assets/{design-tab-CPyj_nFg.js → design-tab-BoPiL2ge.js} +5 -5
- package/dist/web/assets/design-tab-BoPiL2ge.js.br +0 -0
- package/dist/web/assets/design-tab-BoPiL2ge.js.gz +0 -0
- package/dist/web/assets/{designs-sidebar-panel-DIGPFo2l.js → designs-sidebar-panel-BVTqPPzG.js} +1 -1
- package/dist/web/assets/designs-sidebar-panel-BVTqPPzG.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-BVTqPPzG.js.gz +0 -0
- package/dist/web/assets/diff-viewer-C86mR7vD.js +4 -0
- package/dist/web/assets/diff-viewer-C86mR7vD.js.br +0 -0
- package/dist/web/assets/diff-viewer-C86mR7vD.js.gz +0 -0
- package/dist/web/assets/{docx-preview-CowHGqML.js → docx-preview-B9EhDCMi.js} +1 -1
- package/dist/web/assets/docx-preview-B9EhDCMi.js.br +0 -0
- package/dist/web/assets/docx-preview-B9EhDCMi.js.gz +0 -0
- package/dist/web/assets/{editor-dialog-xPoehDYp.js → editor-dialog-DTDsbJd6.js} +1 -1
- package/dist/web/assets/editor-dialog-DTDsbJd6.js.br +0 -0
- package/dist/web/assets/editor-dialog-DTDsbJd6.js.gz +0 -0
- package/dist/web/assets/{editor-language-service-DdYqCDBU.js → editor-language-service-BtrrQAS2.js} +1 -1
- package/dist/web/assets/editor-language-service-BtrrQAS2.js.br +0 -0
- package/dist/web/assets/editor-language-service-BtrrQAS2.js.gz +0 -0
- package/dist/web/assets/explorer-body-DLaWmxri.js +2 -0
- package/dist/web/assets/explorer-body-DLaWmxri.js.br +0 -0
- package/dist/web/assets/explorer-body-DLaWmxri.js.gz +0 -0
- package/dist/web/assets/{explorer-model-tGyFETP_.js → explorer-model-f5q-50DN.js} +1 -1
- package/dist/web/assets/explorer-model-f5q-50DN.js.br +0 -0
- package/dist/web/assets/explorer-model-f5q-50DN.js.gz +0 -0
- package/dist/web/assets/{explorer-window-content-B1c4QTVL.js → explorer-window-content-CbUIbrzL.js} +1 -1
- package/dist/web/assets/explorer-window-content-CbUIbrzL.js.br +0 -0
- package/dist/web/assets/explorer-window-content-CbUIbrzL.js.gz +0 -0
- package/dist/web/assets/{extension-manager-section-BgL0Uyl3.js → extension-manager-section-BpKMyLwI.js} +1 -1
- package/dist/web/assets/extension-manager-section-BpKMyLwI.js.br +0 -0
- package/dist/web/assets/extension-manager-section-BpKMyLwI.js.gz +0 -0
- package/dist/web/assets/{extension-webview-BWB1Yd-t.js → extension-webview-BGfyaXMI.js} +1 -1
- package/dist/web/assets/extension-webview-BGfyaXMI.js.br +0 -0
- package/dist/web/assets/extension-webview-BGfyaXMI.js.gz +0 -0
- package/dist/web/assets/{files-settings-section-TmoewoO2.js → files-settings-section-CQT9_rX2.js} +1 -1
- package/dist/web/assets/files-settings-section-CQT9_rX2.js.br +0 -0
- package/dist/web/assets/files-settings-section-CQT9_rX2.js.gz +0 -0
- package/dist/web/assets/{general-settings-section-Bu7o8uUn.js → general-settings-section-BoQGeqBi.js} +1 -1
- package/dist/web/assets/general-settings-section-BoQGeqBi.js.br +0 -0
- package/dist/web/assets/general-settings-section-BoQGeqBi.js.gz +0 -0
- package/dist/web/assets/{git-log-panel-RjMZIaCk.js → git-log-panel-T8Fzn8-5.js} +1 -1
- package/dist/web/assets/git-log-panel-T8Fzn8-5.js.br +0 -0
- package/dist/web/assets/git-log-panel-T8Fzn8-5.js.gz +0 -0
- package/dist/web/assets/git-review-tab-WzuX4Ml9.js +3 -0
- package/dist/web/assets/git-review-tab-WzuX4Ml9.js.br +0 -0
- package/dist/web/assets/git-review-tab-WzuX4Ml9.js.gz +0 -0
- package/dist/web/assets/{glide-data-grid-DqlTFhhf.js → glide-data-grid-BBzGDYvj.js} +8 -8
- package/dist/web/assets/glide-data-grid-BBzGDYvj.js.br +0 -0
- package/dist/web/assets/glide-data-grid-BBzGDYvj.js.gz +0 -0
- package/dist/web/assets/{grid-save-dialog-BmF2Gy_E.js → grid-save-dialog-HiqlnSky.js} +1 -1
- package/dist/web/assets/grid-save-dialog-HiqlnSky.js.br +0 -0
- package/dist/web/assets/grid-save-dialog-HiqlnSky.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-URU3FCLs.js +1 -0
- package/dist/web/assets/group-chat-tab-URU3FCLs.js.br +0 -0
- package/dist/web/assets/group-chat-tab-URU3FCLs.js.gz +0 -0
- package/dist/web/assets/{impexp-tab-B8d4oBOB.js → impexp-tab-B0m1Q8ia.js} +1 -1
- package/dist/web/assets/impexp-tab-B0m1Q8ia.js.br +0 -0
- package/dist/web/assets/impexp-tab-B0m1Q8ia.js.gz +0 -0
- package/dist/web/assets/index-Cb3Z6wNy.css +1 -0
- package/dist/web/assets/index-Cb3Z6wNy.css.br +0 -0
- package/dist/web/assets/{index-2_Pz5MiI.css.gz → index-Cb3Z6wNy.css.gz} +0 -0
- package/dist/web/assets/{index-Cx9ZRibz.js → index-Vd9Xr54k.js} +19 -19
- package/dist/web/assets/index-Vd9Xr54k.js.br +0 -0
- package/dist/web/assets/index-Vd9Xr54k.js.gz +0 -0
- package/dist/web/assets/{jira-watcher-section-LGTWVN87.js → jira-watcher-section-CnSTbAF6.js} +1 -1
- package/dist/web/assets/keybindings-store-D_U8jECl.js +1 -0
- package/dist/web/assets/{keyboard-shortcuts-section-BSMgmbOR.js → keyboard-shortcuts-section-CU7JjDsU.js} +1 -1
- package/dist/web/assets/keyboard-shortcuts-section-CU7JjDsU.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-CU7JjDsU.js.gz +0 -0
- package/dist/web/assets/{language-servers-section-DO9wnwnG.js → language-servers-section-CzUG9H69.js} +2 -2
- package/dist/web/assets/language-servers-section-CzUG9H69.js.br +0 -0
- package/dist/web/assets/language-servers-section-CzUG9H69.js.gz +0 -0
- package/dist/web/assets/logs-app-CDSvyY1H.js +13 -0
- package/dist/web/assets/logs-app-CDSvyY1H.js.br +0 -0
- package/dist/web/assets/logs-app-CDSvyY1H.js.gz +0 -0
- package/dist/web/assets/logs-tab-CQw9vrNw.js +1 -0
- package/dist/web/assets/{logs-window-content-Cejko0VD.js → logs-window-content-CGvPnPrr.js} +1 -1
- package/dist/web/assets/{lsp-client-IsC8Ol0U.js → lsp-client-CpjPUUYJ.js} +1 -1
- package/dist/web/assets/lsp-client-CpjPUUYJ.js.br +0 -0
- package/dist/web/assets/lsp-client-CpjPUUYJ.js.gz +0 -0
- package/dist/web/assets/{markdown-renderer-D5vxN2fO.js → markdown-renderer-3ZR2x0CC.js} +1 -1
- package/dist/web/assets/{markdown-renderer-BfZiHaNy.js → markdown-renderer-DZNMRg6p.js} +2 -2
- package/dist/web/assets/markdown-renderer-DZNMRg6p.js.br +0 -0
- package/dist/web/assets/markdown-renderer-DZNMRg6p.js.gz +0 -0
- package/dist/web/assets/{mobile-explorer-sheet-Dz3eJdBl.js → mobile-explorer-sheet-D7e-MM6m.js} +1 -1
- package/dist/web/assets/mobile-explorer-sheet-D7e-MM6m.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-D7e-MM6m.js.gz +0 -0
- package/dist/web/assets/{new-design-dialog-B8zeJoJQ.js → new-design-dialog-BthM423i.js} +1 -1
- package/dist/web/assets/new-design-dialog-BthM423i.js.br +0 -0
- package/dist/web/assets/new-design-dialog-BthM423i.js.gz +0 -0
- package/dist/web/assets/notification-store-GKweleCQ.js +1 -0
- package/dist/web/assets/{notifications-settings-section-CMZXQw72.js → notifications-settings-section-TS3gNFcc.js} +1 -1
- package/dist/web/assets/notifications-settings-section-TS3gNFcc.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-TS3gNFcc.js.gz +0 -0
- package/dist/web/assets/{open-db-tabs-DYTZbguT.js → open-db-tabs-DBgV2hbA.js} +1 -1
- package/dist/web/assets/open-db-tabs-DBgV2hbA.js.br +0 -0
- package/dist/web/assets/open-db-tabs-DBgV2hbA.js.gz +0 -0
- package/dist/web/assets/{open-settings-BGtoVEAU.js → open-settings-DWbF5YsE.js} +1 -1
- package/dist/web/assets/{overview-panel-7_8b6pwr.js → overview-panel-C5EmTk1R.js} +1 -1
- package/dist/web/assets/overview-panel-C5EmTk1R.js.br +0 -0
- package/dist/web/assets/overview-panel-C5EmTk1R.js.gz +0 -0
- package/dist/web/assets/{panel-store-Dx2ziBLp.js → panel-store-H7e9XHZF.js} +1 -1
- package/dist/web/assets/panel-store-H7e9XHZF.js.br +0 -0
- package/dist/web/assets/panel-store-H7e9XHZF.js.gz +0 -0
- package/dist/web/assets/{patch-tab-metadata-DTbCkVvx.js → patch-tab-metadata-DqvfqUI4.js} +1 -1
- package/dist/web/assets/{performance-panel-COQNCyEU.js → performance-panel-Jwab-_Z2.js} +1 -1
- package/dist/web/assets/performance-panel-Jwab-_Z2.js.br +0 -0
- package/dist/web/assets/performance-panel-Jwab-_Z2.js.gz +0 -0
- package/dist/web/assets/{ppmbot-settings-section-CmhbbZVI.js → ppmbot-settings-section-D8jIlmp8.js} +1 -1
- package/dist/web/assets/ppmbot-settings-section-D8jIlmp8.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-D8jIlmp8.js.gz +0 -0
- package/dist/web/assets/{pptx-export-COeBmnFJ.js → pptx-export-gXOWUZXL.js} +3 -3
- package/dist/web/assets/pptx-export-gXOWUZXL.js.br +0 -0
- package/dist/web/assets/pptx-export-gXOWUZXL.js.gz +0 -0
- package/dist/web/assets/{problems-panel-I0EYfa1S.js → problems-panel-DjCHA1r5.js} +1 -1
- package/dist/web/assets/problems-panel-DjCHA1r5.js.br +0 -0
- package/dist/web/assets/problems-panel-DjCHA1r5.js.gz +0 -0
- package/dist/web/assets/{process-table-or-X8Lwh.js → process-table-BxXEh4tN.js} +1 -1
- package/dist/web/assets/process-table-BxXEh4tN.js.br +0 -0
- package/dist/web/assets/process-table-BxXEh4tN.js.gz +0 -0
- package/dist/web/assets/{proxy-settings-section-DpJ6ok4C.js → proxy-settings-section-B8igco2L.js} +1 -1
- package/dist/web/assets/proxy-settings-section-B8igco2L.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-B8igco2L.js.gz +0 -0
- package/dist/web/assets/{query-tab-DeNZMZHX.js → query-tab-DHU3ANHN.js} +3 -3
- package/dist/web/assets/query-tab-DHU3ANHN.js.br +0 -0
- package/dist/web/assets/query-tab-DHU3ANHN.js.gz +0 -0
- package/dist/web/assets/release-notes-window-content-B33RDfFY.js +1 -0
- package/dist/web/assets/remote-access-settings-section-CoYQTFKd.js +1 -0
- package/dist/web/assets/remote-access-settings-section-CoYQTFKd.js.br +0 -0
- package/dist/web/assets/remote-access-settings-section-CoYQTFKd.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-clipboard-notice-CGDBpXMf.js → remote-desktop-clipboard-notice-Dwn-iV4g.js} +1 -1
- package/dist/web/assets/remote-desktop-clipboard-notice-Dwn-iV4g.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-Dwn-iV4g.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-mobile-sheet-6nXirdqZ.js → remote-desktop-mobile-sheet-bfKiSG0C.js} +2 -2
- package/dist/web/assets/remote-desktop-mobile-sheet-bfKiSG0C.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-bfKiSG0C.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-mobile-view-BTaj9Flo.js → remote-desktop-mobile-view-CV8eHh4A.js} +1 -1
- package/dist/web/assets/remote-desktop-mobile-view-CV8eHh4A.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-CV8eHh4A.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-readiness-gate--gtmfqZh.js → remote-desktop-readiness-gate-DrSYb_9z.js} +1 -1
- package/dist/web/assets/remote-desktop-readiness-gate-DrSYb_9z.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-DrSYb_9z.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-settings-section-Bs5avYaS.js → remote-desktop-settings-section-DRO8n8t7.js} +1 -1
- package/dist/web/assets/remote-desktop-settings-section-DRO8n8t7.js.br +0 -0
- package/dist/web/assets/remote-desktop-settings-section-DRO8n8t7.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-window-content-D4CM-28B.js → remote-desktop-window-content-CAuxeGbK.js} +1 -1
- package/dist/web/assets/remote-desktop-window-content-CAuxeGbK.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-CAuxeGbK.js.gz +0 -0
- package/dist/web/assets/{rename-object-dialog-Dv4iLwnf.js → rename-object-dialog-BPuh3dAH.js} +1 -1
- package/dist/web/assets/rename-object-dialog-BPuh3dAH.js.br +0 -0
- package/dist/web/assets/rename-object-dialog-BPuh3dAH.js.gz +0 -0
- package/dist/web/assets/review-address-setup-CoI2BGdx.js +1 -0
- package/dist/web/assets/review-address-setup-CoI2BGdx.js.br +0 -0
- package/dist/web/assets/review-address-setup-CoI2BGdx.js.gz +0 -0
- package/dist/web/assets/{review-code-Bet53hHb.js → review-code-Dy8y4_17.js} +1 -1
- package/dist/web/assets/review-code-Dy8y4_17.js.br +0 -0
- package/dist/web/assets/review-code-Dy8y4_17.js.gz +0 -0
- package/dist/web/assets/{run-in-terminal-EVMb5TjW.js → run-in-terminal-DAdjH24K.js} +1 -1
- package/dist/web/assets/{run-in-terminal-button-CsYq6Xqo.js → run-in-terminal-button-Bu165IH-.js} +1 -1
- package/dist/web/assets/{save-as-dialog-DHkBsS-6.js → save-as-dialog-C9OpJz2x.js} +1 -1
- package/dist/web/assets/save-as-dialog-C9OpJz2x.js.br +0 -0
- package/dist/web/assets/save-as-dialog-C9OpJz2x.js.gz +0 -0
- package/dist/web/assets/{schedule-script-editor-CKUl2qxf.js → schedule-script-editor--roOsFbc.js} +1 -1
- package/dist/web/assets/schedule-script-editor--roOsFbc.js.br +0 -0
- package/dist/web/assets/schedule-script-editor--roOsFbc.js.gz +0 -0
- package/dist/web/assets/{schedules-settings-section-EoOXzqF3.js → schedules-settings-section-BTn_NSzU.js} +3 -3
- package/dist/web/assets/schedules-settings-section-BTn_NSzU.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-BTn_NSzU.js.gz +0 -0
- package/dist/web/assets/{send-to-chat-B7oUVcgh.js → send-to-chat-BUxj21hD.js} +1 -1
- package/dist/web/assets/send-to-chat-BUxj21hD.js.br +0 -0
- package/dist/web/assets/send-to-chat-BUxj21hD.js.gz +0 -0
- package/dist/web/assets/{services-panel-BceuL_SU.js → services-panel-BynENSs6.js} +1 -1
- package/dist/web/assets/services-panel-BynENSs6.js.br +0 -0
- package/dist/web/assets/services-panel-BynENSs6.js.gz +0 -0
- package/dist/web/assets/{session-changes-bar-CjSxBYOF.js → session-changes-bar-Dz3QitdJ.js} +1 -1
- package/dist/web/assets/session-changes-bar-Dz3QitdJ.js.br +0 -0
- package/dist/web/assets/session-changes-bar-Dz3QitdJ.js.gz +0 -0
- package/dist/web/assets/{session-review-tab-yIQFGJbG.js → session-review-tab-fRzyogNH.js} +1 -1
- package/dist/web/assets/session-review-tab-fRzyogNH.js.br +0 -0
- package/dist/web/assets/session-review-tab-fRzyogNH.js.gz +0 -0
- package/dist/web/assets/{settings-body-DXNcpoqY.js → settings-body-D5pmlFft.js} +1 -1
- package/dist/web/assets/settings-body-D5pmlFft.js.br +0 -0
- package/dist/web/assets/settings-body-D5pmlFft.js.gz +0 -0
- package/dist/web/assets/{settings-rows-DgL7oTg8.js → settings-rows-VtjChFlm.js} +1 -1
- package/dist/web/assets/settings-rows-VtjChFlm.js.br +0 -0
- package/dist/web/assets/settings-rows-VtjChFlm.js.gz +0 -0
- package/dist/web/assets/{settings-section-content-DFLjO2le.js → settings-section-content-BOwSlBkZ.js} +2 -2
- package/dist/web/assets/settings-section-content-BOwSlBkZ.js.br +0 -0
- package/dist/web/assets/settings-section-content-BOwSlBkZ.js.gz +0 -0
- package/dist/web/assets/{settings-section-content-B1eU_yR4.js → settings-section-content-Ck39TJA7.js} +1 -1
- package/dist/web/assets/{settings-store-CBJCnE5L.js → settings-store-CMpVMq3Y.js} +2 -2
- package/dist/web/assets/settings-store-CMpVMq3Y.js.br +0 -0
- package/dist/web/assets/settings-store-CMpVMq3Y.js.gz +0 -0
- package/dist/web/assets/settings-tab-A81xb81d.js +1 -0
- package/dist/web/assets/settings-window-content-BCDRi6xS.js +1 -0
- package/dist/web/assets/{slash-command-picker-qb3fZ7RP.js → slash-command-picker-BKeEykkF.js} +1 -1
- package/dist/web/assets/slash-command-picker-BKeEykkF.js.br +0 -0
- package/dist/web/assets/slash-command-picker-BKeEykkF.js.gz +0 -0
- package/dist/web/assets/{sql-object-tab-B6JtYu9P.js → sql-object-tab-I5bl3DVf.js} +1 -1
- package/dist/web/assets/sql-object-tab-I5bl3DVf.js.br +0 -0
- package/dist/web/assets/sql-object-tab-I5bl3DVf.js.gz +0 -0
- package/dist/web/assets/{sqlite-viewer-bdNkUymy.js → sqlite-viewer-ECCCjxdn.js} +1 -1
- package/dist/web/assets/sqlite-viewer-ECCCjxdn.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-ECCCjxdn.js.gz +0 -0
- package/dist/web/assets/{structure-save-dialog-5SfYdbAB.js → structure-save-dialog-DcQdamD3.js} +1 -1
- package/dist/web/assets/structure-save-dialog-DcQdamD3.js.br +0 -0
- package/dist/web/assets/structure-save-dialog-DcQdamD3.js.gz +0 -0
- package/dist/web/assets/{structure-tab-DYjjcLIU.js → structure-tab-DyQGhf9t.js} +2 -2
- package/dist/web/assets/structure-tab-DyQGhf9t.js.br +0 -0
- package/dist/web/assets/structure-tab-DyQGhf9t.js.gz +0 -0
- package/dist/web/assets/{system-monitor-body-DouL7ajt.js → system-monitor-body-B5AvRT5J.js} +2 -2
- package/dist/web/assets/system-monitor-body-B5AvRT5J.js.br +0 -0
- package/dist/web/assets/system-monitor-body-B5AvRT5J.js.gz +0 -0
- package/dist/web/assets/system-monitor-tab-CfwHKQ5k.js +1 -0
- package/dist/web/assets/{system-monitor-window-content-DUCaJME1.js → system-monitor-window-content-Cvx1V8Mf.js} +1 -1
- package/dist/web/assets/{tab-host-window-content-CQ5NiV6Y.js → tab-host-window-content-DqOUHxEL.js} +1 -1
- package/dist/web/assets/tab-host-window-content-DqOUHxEL.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-DqOUHxEL.js.gz +0 -0
- package/dist/web/assets/{tab-store-B4v2kAEY.js → tab-store-NUmgzMPf.js} +1 -1
- package/dist/web/assets/table-tab-dI8rBbCS.js +2 -0
- package/dist/web/assets/table-tab-dI8rBbCS.js.br +0 -0
- package/dist/web/assets/table-tab-dI8rBbCS.js.gz +0 -0
- package/dist/web/assets/{telegram-bot-token-field-CqVIuWP1.js → telegram-bot-token-field-DSLtG8vw.js} +1 -1
- package/dist/web/assets/telegram-bot-token-field-DSLtG8vw.js.br +0 -0
- package/dist/web/assets/telegram-bot-token-field-DSLtG8vw.js.gz +0 -0
- package/dist/web/assets/{terminal-tab-DT0MN_Qn.js → terminal-tab-CDg0AHBK.js} +2 -2
- package/dist/web/assets/terminal-tab-CDg0AHBK.js.br +0 -0
- package/dist/web/assets/terminal-tab-CDg0AHBK.js.gz +0 -0
- package/dist/web/assets/{tool-cards-C2YGSKRm.js → tool-cards-7E0jtwP0.js} +5 -5
- package/dist/web/assets/tool-cards-7E0jtwP0.js.br +0 -0
- package/dist/web/assets/tool-cards-7E0jtwP0.js.gz +0 -0
- package/dist/web/assets/{tools-settings-section-DQXIdF8O.js → tools-settings-section-AChVQJyU.js} +1 -1
- package/dist/web/assets/tools-settings-section-AChVQJyU.js.br +0 -0
- package/dist/web/assets/tools-settings-section-AChVQJyU.js.gz +0 -0
- package/dist/web/assets/{use-db-read-BByB906L.js → use-db-read-DgNa66Yo.js} +1 -1
- package/dist/web/assets/use-db-read-DgNa66Yo.js.br +0 -0
- package/dist/web/assets/use-db-read-DgNa66Yo.js.gz +0 -0
- package/dist/web/assets/{use-db-tab-Dc0QSFyM.js → use-db-tab-OGLoicCd.js} +1 -1
- package/dist/web/assets/use-db-tab-OGLoicCd.js.br +0 -0
- package/dist/web/assets/use-db-tab-OGLoicCd.js.gz +0 -0
- package/dist/web/assets/{use-inline-blame-B9M-hADX.js → use-inline-blame-BvlcOQd9.js} +3 -3
- package/dist/web/assets/use-inline-blame-BvlcOQd9.js.br +0 -0
- package/dist/web/assets/use-inline-blame-BvlcOQd9.js.gz +0 -0
- package/dist/web/assets/{use-lsp-DcGiCpl9.js → use-lsp-fLNwD0BI.js} +1 -1
- package/dist/web/assets/use-lsp-fLNwD0BI.js.br +0 -0
- package/dist/web/assets/use-lsp-fLNwD0BI.js.gz +0 -0
- package/dist/web/assets/{use-monaco-theme-CyoMsYaI.js → use-monaco-theme-CbNQ4HnC.js} +1 -1
- package/dist/web/assets/{use-process-kill-DsHyrg0-.js → use-process-kill-B4Srjl2m.js} +1 -1
- package/dist/web/assets/use-process-kill-B4Srjl2m.js.br +0 -0
- package/dist/web/assets/use-process-kill-B4Srjl2m.js.gz +0 -0
- package/dist/web/assets/{use-sql-schema-info-BqGN5N4O.js → use-sql-schema-info-CqISFaAW.js} +1 -1
- package/dist/web/assets/use-sql-schema-info-CqISFaAW.js.br +0 -0
- package/dist/web/assets/use-sql-schema-info-CqISFaAW.js.gz +0 -0
- package/dist/web/assets/{use-websocket-DqomrzN8.js → use-websocket-DVJuWhlA.js} +1 -1
- package/dist/web/assets/{voice-settings-section-D9KsOm8A.js → voice-settings-section-C1aEYF94.js} +1 -1
- package/dist/web/assets/voice-settings-section-C1aEYF94.js.br +0 -0
- package/dist/web/assets/voice-settings-section-C1aEYF94.js.gz +0 -0
- package/dist/web/assets/{web-preview-tab-CUp1n2jz.js → web-preview-tab-CZJAVoVU.js} +1 -1
- package/dist/web/assets/web-preview-tab-CZJAVoVU.js.br +0 -0
- package/dist/web/assets/web-preview-tab-CZJAVoVU.js.gz +0 -0
- package/dist/web/assets/{window-store-UcSFgNCI.js → window-store-D6EgLSfT.js} +1 -1
- package/dist/web/assets/window-store-D6EgLSfT.js.br +0 -0
- package/dist/web/assets/window-store-D6EgLSfT.js.gz +0 -0
- package/dist/web/index.html +12 -12
- 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/package.json +1 -1
- package/src/web/components/floating-window/use-window-meta.ts +2 -1
- package/src/web/components/floating-window/window-content-registry.ts +2 -0
- package/src/web/components/floating-window/window-store-types.ts +1 -1
- package/src/web/components/layout/upgrade-button.tsx +27 -46
- package/src/web/components/release-notes/open-release-notes.ts +22 -0
- package/src/web/components/release-notes/release-notes-entry.tsx +73 -0
- package/src/web/components/release-notes/release-notes-view.tsx +72 -0
- package/src/web/components/release-notes/release-notes-window-content.tsx +6 -0
- package/dist/web/assets/accounts-settings-section-Ctu-w8kt.js +0 -1
- package/dist/web/assets/accounts-settings-section-Ctu-w8kt.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-Ctu-w8kt.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-DmbSfFGz.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-DmbSfFGz.js.gz +0 -0
- package/dist/web/assets/agent-session-window-content-Dk8x3ozF.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-Dk8x3ozF.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-MKwjYcDh.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-MKwjYcDh.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-CODZY71V.js +0 -1
- package/dist/web/assets/ai-settings-section-CODZY71V.js.br +0 -0
- package/dist/web/assets/ai-settings-section-CODZY71V.js.gz +0 -0
- package/dist/web/assets/android-tab-CUkjbfyi.js.br +0 -0
- package/dist/web/assets/android-tab-CUkjbfyi.js.gz +0 -0
- package/dist/web/assets/appearance-settings-section-BZsM8HpZ.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-BZsM8HpZ.js.gz +0 -0
- package/dist/web/assets/apps-panel-Cs3utBlp.js.br +0 -0
- package/dist/web/assets/apps-panel-Cs3utBlp.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-C-aPuhXZ.js +0 -1
- package/dist/web/assets/branch-review-tab-C-aPuhXZ.js.br +0 -0
- package/dist/web/assets/branch-review-tab-C-aPuhXZ.js.gz +0 -0
- package/dist/web/assets/chat-tab-CGQu4uLR.js +0 -1
- package/dist/web/assets/chat-tab-CGQu4uLR.js.br +0 -0
- package/dist/web/assets/chat-tab-CGQu4uLR.js.gz +0 -0
- package/dist/web/assets/chat-tab-DtSHSfMU.js.br +0 -0
- package/dist/web/assets/chat-tab-DtSHSfMU.js.gz +0 -0
- package/dist/web/assets/code-editor-DjDyhff1.js.br +0 -0
- package/dist/web/assets/code-editor-DjDyhff1.js.gz +0 -0
- package/dist/web/assets/codex-reset-credit-button-BKgiUi8E.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-BKgiUi8E.js.gz +0 -0
- package/dist/web/assets/conflict-editor-DgTv-8pb.js.br +0 -0
- package/dist/web/assets/conflict-editor-DgTv-8pb.js.gz +0 -0
- package/dist/web/assets/connection-form-tab-CJ-6gH9g.js +0 -4
- package/dist/web/assets/connection-form-tab-CJ-6gH9g.js.br +0 -0
- package/dist/web/assets/connection-form-tab-CJ-6gH9g.js.gz +0 -0
- package/dist/web/assets/csv-preview-BTGpYs4p.js.br +0 -0
- package/dist/web/assets/csv-preview-BTGpYs4p.js.gz +0 -0
- package/dist/web/assets/db-explorer-store-DDePT3UI.js.br +0 -0
- package/dist/web/assets/db-explorer-store-DDePT3UI.js.gz +0 -0
- package/dist/web/assets/db-sidebar-reveal-BeT8cp6P.js.br +0 -0
- package/dist/web/assets/db-sidebar-reveal-BeT8cp6P.js.gz +0 -0
- package/dist/web/assets/db-tab-parts-BYzd4_sR.js.br +0 -0
- package/dist/web/assets/db-tab-parts-BYzd4_sR.js.gz +0 -0
- package/dist/web/assets/design-settings-section-B3KQBggK.js.br +0 -0
- package/dist/web/assets/design-settings-section-B3KQBggK.js.gz +0 -0
- package/dist/web/assets/design-tab-CPyj_nFg.js.br +0 -0
- package/dist/web/assets/design-tab-CPyj_nFg.js.gz +0 -0
- package/dist/web/assets/designs-sidebar-panel-DIGPFo2l.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-DIGPFo2l.js.gz +0 -0
- package/dist/web/assets/diff-viewer-nYz43A94.js +0 -4
- package/dist/web/assets/diff-viewer-nYz43A94.js.br +0 -0
- package/dist/web/assets/diff-viewer-nYz43A94.js.gz +0 -0
- package/dist/web/assets/docx-preview-CowHGqML.js.br +0 -0
- package/dist/web/assets/docx-preview-CowHGqML.js.gz +0 -0
- package/dist/web/assets/editor-dialog-xPoehDYp.js.br +0 -0
- package/dist/web/assets/editor-dialog-xPoehDYp.js.gz +0 -0
- package/dist/web/assets/editor-language-service-DdYqCDBU.js.br +0 -0
- package/dist/web/assets/editor-language-service-DdYqCDBU.js.gz +0 -0
- package/dist/web/assets/explorer-body-BHh5Qpvi.js +0 -2
- package/dist/web/assets/explorer-body-BHh5Qpvi.js.br +0 -0
- package/dist/web/assets/explorer-body-BHh5Qpvi.js.gz +0 -0
- package/dist/web/assets/explorer-model-tGyFETP_.js.br +0 -0
- package/dist/web/assets/explorer-model-tGyFETP_.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-B1c4QTVL.js.br +0 -0
- package/dist/web/assets/explorer-window-content-B1c4QTVL.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-BgL0Uyl3.js.br +0 -0
- package/dist/web/assets/extension-manager-section-BgL0Uyl3.js.gz +0 -0
- package/dist/web/assets/extension-webview-BWB1Yd-t.js.br +0 -0
- package/dist/web/assets/extension-webview-BWB1Yd-t.js.gz +0 -0
- package/dist/web/assets/files-settings-section-TmoewoO2.js.br +0 -0
- package/dist/web/assets/files-settings-section-TmoewoO2.js.gz +0 -0
- package/dist/web/assets/general-settings-section-Bu7o8uUn.js.br +0 -0
- package/dist/web/assets/general-settings-section-Bu7o8uUn.js.gz +0 -0
- package/dist/web/assets/git-log-panel-RjMZIaCk.js.br +0 -0
- package/dist/web/assets/git-log-panel-RjMZIaCk.js.gz +0 -0
- package/dist/web/assets/git-review-tab-BUW5LZk4.js +0 -3
- package/dist/web/assets/git-review-tab-BUW5LZk4.js.br +0 -0
- package/dist/web/assets/git-review-tab-BUW5LZk4.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-DqlTFhhf.js.br +0 -0
- package/dist/web/assets/glide-data-grid-DqlTFhhf.js.gz +0 -0
- package/dist/web/assets/grid-save-dialog-BmF2Gy_E.js.br +0 -0
- package/dist/web/assets/grid-save-dialog-BmF2Gy_E.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-nk3n5wE0.js +0 -1
- package/dist/web/assets/group-chat-tab-nk3n5wE0.js.br +0 -0
- package/dist/web/assets/group-chat-tab-nk3n5wE0.js.gz +0 -0
- package/dist/web/assets/impexp-tab-B8d4oBOB.js.br +0 -0
- package/dist/web/assets/impexp-tab-B8d4oBOB.js.gz +0 -0
- package/dist/web/assets/index-2_Pz5MiI.css +0 -1
- package/dist/web/assets/index-2_Pz5MiI.css.br +0 -0
- package/dist/web/assets/index-Cx9ZRibz.js.br +0 -0
- package/dist/web/assets/index-Cx9ZRibz.js.gz +0 -0
- package/dist/web/assets/keybindings-store-B2AkKQl7.js +0 -1
- package/dist/web/assets/keyboard-shortcuts-section-BSMgmbOR.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-BSMgmbOR.js.gz +0 -0
- package/dist/web/assets/language-servers-section-DO9wnwnG.js.br +0 -0
- package/dist/web/assets/language-servers-section-DO9wnwnG.js.gz +0 -0
- package/dist/web/assets/logs-app-xQ2UsN4G.js +0 -13
- package/dist/web/assets/logs-app-xQ2UsN4G.js.br +0 -0
- package/dist/web/assets/logs-app-xQ2UsN4G.js.gz +0 -0
- package/dist/web/assets/logs-tab-H3SmYGRX.js +0 -1
- package/dist/web/assets/lsp-client-IsC8Ol0U.js.br +0 -0
- package/dist/web/assets/lsp-client-IsC8Ol0U.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-BfZiHaNy.js.br +0 -0
- package/dist/web/assets/markdown-renderer-BfZiHaNy.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-Dz3eJdBl.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-Dz3eJdBl.js.gz +0 -0
- package/dist/web/assets/new-design-dialog-B8zeJoJQ.js.br +0 -0
- package/dist/web/assets/new-design-dialog-B8zeJoJQ.js.gz +0 -0
- package/dist/web/assets/notification-store-BkkcJE2G.js +0 -1
- package/dist/web/assets/notifications-settings-section-CMZXQw72.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-CMZXQw72.js.gz +0 -0
- package/dist/web/assets/open-db-tabs-DYTZbguT.js.br +0 -0
- package/dist/web/assets/open-db-tabs-DYTZbguT.js.gz +0 -0
- package/dist/web/assets/overview-panel-7_8b6pwr.js.br +0 -0
- package/dist/web/assets/overview-panel-7_8b6pwr.js.gz +0 -0
- package/dist/web/assets/panel-store-Dx2ziBLp.js.br +0 -0
- package/dist/web/assets/panel-store-Dx2ziBLp.js.gz +0 -0
- package/dist/web/assets/performance-panel-COQNCyEU.js.br +0 -0
- package/dist/web/assets/performance-panel-COQNCyEU.js.gz +0 -0
- package/dist/web/assets/ppmbot-settings-section-CmhbbZVI.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-CmhbbZVI.js.gz +0 -0
- package/dist/web/assets/pptx-export-COeBmnFJ.js.br +0 -0
- package/dist/web/assets/pptx-export-COeBmnFJ.js.gz +0 -0
- package/dist/web/assets/problems-panel-I0EYfa1S.js.br +0 -0
- package/dist/web/assets/problems-panel-I0EYfa1S.js.gz +0 -0
- package/dist/web/assets/process-table-or-X8Lwh.js.br +0 -0
- package/dist/web/assets/process-table-or-X8Lwh.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-DpJ6ok4C.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-DpJ6ok4C.js.gz +0 -0
- package/dist/web/assets/query-tab-DeNZMZHX.js.br +0 -0
- package/dist/web/assets/query-tab-DeNZMZHX.js.gz +0 -0
- package/dist/web/assets/remote-access-settings-section-QRP4Yh46.js +0 -1
- package/dist/web/assets/remote-access-settings-section-QRP4Yh46.js.br +0 -0
- package/dist/web/assets/remote-access-settings-section-QRP4Yh46.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-CGDBpXMf.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-CGDBpXMf.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-6nXirdqZ.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-6nXirdqZ.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-BTaj9Flo.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-BTaj9Flo.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate--gtmfqZh.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate--gtmfqZh.js.gz +0 -0
- package/dist/web/assets/remote-desktop-settings-section-Bs5avYaS.js.br +0 -0
- package/dist/web/assets/remote-desktop-settings-section-Bs5avYaS.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-D4CM-28B.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-D4CM-28B.js.gz +0 -0
- package/dist/web/assets/rename-object-dialog-Dv4iLwnf.js.br +0 -0
- package/dist/web/assets/rename-object-dialog-Dv4iLwnf.js.gz +0 -0
- package/dist/web/assets/review-address-setup-CU1A_NfZ.js +0 -1
- package/dist/web/assets/review-address-setup-CU1A_NfZ.js.br +0 -0
- package/dist/web/assets/review-address-setup-CU1A_NfZ.js.gz +0 -0
- package/dist/web/assets/review-code-Bet53hHb.js.br +0 -0
- package/dist/web/assets/review-code-Bet53hHb.js.gz +0 -0
- package/dist/web/assets/save-as-dialog-DHkBsS-6.js.br +0 -0
- package/dist/web/assets/save-as-dialog-DHkBsS-6.js.gz +0 -0
- package/dist/web/assets/schedule-script-editor-CKUl2qxf.js.br +0 -0
- package/dist/web/assets/schedule-script-editor-CKUl2qxf.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-EoOXzqF3.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-EoOXzqF3.js.gz +0 -0
- package/dist/web/assets/send-to-chat-B7oUVcgh.js.br +0 -0
- package/dist/web/assets/send-to-chat-B7oUVcgh.js.gz +0 -0
- package/dist/web/assets/services-panel-BceuL_SU.js.br +0 -0
- package/dist/web/assets/services-panel-BceuL_SU.js.gz +0 -0
- package/dist/web/assets/session-changes-bar-CjSxBYOF.js.br +0 -0
- package/dist/web/assets/session-changes-bar-CjSxBYOF.js.gz +0 -0
- package/dist/web/assets/session-review-tab-yIQFGJbG.js.br +0 -0
- package/dist/web/assets/session-review-tab-yIQFGJbG.js.gz +0 -0
- package/dist/web/assets/settings-body-DXNcpoqY.js.br +0 -0
- package/dist/web/assets/settings-body-DXNcpoqY.js.gz +0 -0
- package/dist/web/assets/settings-rows-DgL7oTg8.js.br +0 -0
- package/dist/web/assets/settings-rows-DgL7oTg8.js.gz +0 -0
- package/dist/web/assets/settings-section-content-DFLjO2le.js.br +0 -0
- package/dist/web/assets/settings-section-content-DFLjO2le.js.gz +0 -0
- package/dist/web/assets/settings-store-CBJCnE5L.js.br +0 -0
- package/dist/web/assets/settings-store-CBJCnE5L.js.gz +0 -0
- package/dist/web/assets/settings-tab-CrGoLKQT.js +0 -1
- package/dist/web/assets/settings-window-content-5opW9Wra.js +0 -1
- package/dist/web/assets/slash-command-picker-qb3fZ7RP.js.br +0 -0
- package/dist/web/assets/slash-command-picker-qb3fZ7RP.js.gz +0 -0
- package/dist/web/assets/sql-object-tab-B6JtYu9P.js.br +0 -0
- package/dist/web/assets/sql-object-tab-B6JtYu9P.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-bdNkUymy.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-bdNkUymy.js.gz +0 -0
- package/dist/web/assets/structure-save-dialog-5SfYdbAB.js.br +0 -0
- package/dist/web/assets/structure-save-dialog-5SfYdbAB.js.gz +0 -0
- package/dist/web/assets/structure-tab-DYjjcLIU.js.br +0 -0
- package/dist/web/assets/structure-tab-DYjjcLIU.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-DouL7ajt.js.br +0 -0
- package/dist/web/assets/system-monitor-body-DouL7ajt.js.gz +0 -0
- package/dist/web/assets/system-monitor-tab-qpa36tWB.js +0 -1
- package/dist/web/assets/tab-host-window-content-CQ5NiV6Y.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-CQ5NiV6Y.js.gz +0 -0
- package/dist/web/assets/table-tab-M850PntZ.js +0 -2
- package/dist/web/assets/table-tab-M850PntZ.js.br +0 -0
- package/dist/web/assets/table-tab-M850PntZ.js.gz +0 -0
- package/dist/web/assets/telegram-bot-token-field-CqVIuWP1.js.br +0 -0
- package/dist/web/assets/telegram-bot-token-field-CqVIuWP1.js.gz +0 -0
- package/dist/web/assets/terminal-tab-DT0MN_Qn.js.br +0 -0
- package/dist/web/assets/terminal-tab-DT0MN_Qn.js.gz +0 -0
- package/dist/web/assets/tool-cards-C2YGSKRm.js.br +0 -0
- package/dist/web/assets/tool-cards-C2YGSKRm.js.gz +0 -0
- package/dist/web/assets/tools-settings-section-DQXIdF8O.js.br +0 -0
- package/dist/web/assets/tools-settings-section-DQXIdF8O.js.gz +0 -0
- package/dist/web/assets/use-db-read-BByB906L.js.br +0 -0
- package/dist/web/assets/use-db-read-BByB906L.js.gz +0 -0
- package/dist/web/assets/use-db-tab-Dc0QSFyM.js.br +0 -0
- package/dist/web/assets/use-db-tab-Dc0QSFyM.js.gz +0 -0
- package/dist/web/assets/use-inline-blame-B9M-hADX.js.br +0 -0
- package/dist/web/assets/use-inline-blame-B9M-hADX.js.gz +0 -0
- package/dist/web/assets/use-lsp-DcGiCpl9.js.br +0 -0
- package/dist/web/assets/use-lsp-DcGiCpl9.js.gz +0 -0
- package/dist/web/assets/use-process-kill-DsHyrg0-.js.br +0 -0
- package/dist/web/assets/use-process-kill-DsHyrg0-.js.gz +0 -0
- package/dist/web/assets/use-sql-schema-info-BqGN5N4O.js.br +0 -0
- package/dist/web/assets/use-sql-schema-info-BqGN5N4O.js.gz +0 -0
- package/dist/web/assets/voice-settings-section-D9KsOm8A.js.br +0 -0
- package/dist/web/assets/voice-settings-section-D9KsOm8A.js.gz +0 -0
- package/dist/web/assets/web-preview-tab-CUp1n2jz.js.br +0 -0
- package/dist/web/assets/web-preview-tab-CUp1n2jz.js.gz +0 -0
- package/dist/web/assets/window-store-UcSFgNCI.js.br +0 -0
- package/dist/web/assets/window-store-UcSFgNCI.js.gz +0 -0
- /package/dist/web/assets/{__vite-browser-external-DLaiEgUM.js → __vite-browser-external-LVpeGV-g.js} +0 -0
- /package/dist/web/assets/{api-themes-B3-6zR6Q.js → api-themes-DUOEO3_X.js} +0 -0
- /package/dist/web/assets/{claude-models-yFre4eSK.js → claude-models-C9iHl8VB.js} +0 -0
- /package/dist/web/assets/{database-drivers-section-c2SuNQPB.js → database-drivers-section-BPXoNrWi.js} +0 -0
- /package/dist/web/assets/{database-drivers-section-c2SuNQPB.js.br → database-drivers-section-BPXoNrWi.js.br} +0 -0
- /package/dist/web/assets/{database-drivers-section-c2SuNQPB.js.gz → database-drivers-section-BPXoNrWi.js.gz} +0 -0
- /package/dist/web/assets/{metric-chart-canvas-Dnm9OOXU.js → metric-chart-canvas-HG8rPTMq.js} +0 -0
- /package/dist/web/assets/{metric-chart-canvas-Dnm9OOXU.js.br → metric-chart-canvas-HG8rPTMq.js.br} +0 -0
- /package/dist/web/assets/{metric-chart-canvas-Dnm9OOXU.js.gz → metric-chart-canvas-HG8rPTMq.js.gz} +0 -0
- /package/dist/web/assets/{notification-settings-CvplVsIo.js → notification-settings--li9wGTJ.js} +0 -0
- /package/dist/web/assets/{notification-settings-CvplVsIo.js.br → notification-settings--li9wGTJ.js.br} +0 -0
- /package/dist/web/assets/{notification-settings-CvplVsIo.js.gz → notification-settings--li9wGTJ.js.gz} +0 -0
- /package/dist/web/assets/{process-row-format-CM1XaqkS.js → process-row-format-CJg8VV-6.js} +0 -0
- /package/dist/web/assets/{query-audit-section-C-fT07Zz.js → query-audit-section-BiCUBamA.js} +0 -0
- /package/dist/web/assets/{query-audit-section-C-fT07Zz.js.br → query-audit-section-BiCUBamA.js.br} +0 -0
- /package/dist/web/assets/{query-audit-section-C-fT07Zz.js.gz → query-audit-section-BiCUBamA.js.gz} +0 -0
- /package/dist/web/assets/{remote-desktop-recording-D_fwMC2z.js → remote-desktop-recording-BcDx5c_k.js} +0 -0
- /package/dist/web/assets/{separator-CYw7bF1W.js → separator-DUdRLaL0.js} +0 -0
- /package/dist/web/assets/{sortable-header-CchrA_dg.js → sortable-header-Ds6nTnqB.js} +0 -0
- /package/dist/web/assets/{sortable-header-CchrA_dg.js.br → sortable-header-Ds6nTnqB.js.br} +0 -0
- /package/dist/web/assets/{sortable-header-CchrA_dg.js.gz → sortable-header-Ds6nTnqB.js.gz} +0 -0
- /package/dist/web/assets/{vendor-xterm-lhGdimFj.js → vendor-xterm-BxbwWHG_.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-lhGdimFj.js.br → vendor-xterm-BxbwWHG_.js.br} +0 -0
- /package/dist/web/assets/{vendor-xterm-lhGdimFj.js.gz → vendor-xterm-BxbwWHG_.js.gz} +0 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The release notes at a readable size: the recent CHANGELOG sections in a scrolling column,
|
|
3
|
+
* the installed version marked. Shared by the desktop window and the phone's bottom sheet.
|
|
4
|
+
*
|
|
5
|
+
* Fetched on mount rather than handed over by the status-bar popover, so the window still has
|
|
6
|
+
* its notes after a reload restores it with no popover in sight.
|
|
7
|
+
*/
|
|
8
|
+
import { useEffect, useState } from "react";
|
|
9
|
+
import { ExternalLink, Loader2 } from "@/lib/icons";
|
|
10
|
+
import { fetchRecentChangelog, type ChangelogSection } from "@/lib/changelog";
|
|
11
|
+
import { useSettingsStore } from "@/stores/settings-store";
|
|
12
|
+
import { ReleaseNotesEntry } from "./release-notes-entry";
|
|
13
|
+
|
|
14
|
+
export const RELEASES_URL = "https://github.com/hienlh/ppm/releases";
|
|
15
|
+
|
|
16
|
+
/** Enough history to see what changed since a machine was last updated, without paging. */
|
|
17
|
+
const SECTIONS_SHOWN = 30;
|
|
18
|
+
|
|
19
|
+
export function ReleaseNotesView() {
|
|
20
|
+
const installed = useSettingsStore((s) => s.version);
|
|
21
|
+
const [notes, setNotes] = useState<ChangelogSection[] | null>(null);
|
|
22
|
+
const [failed, setFailed] = useState(false);
|
|
23
|
+
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
let alive = true;
|
|
26
|
+
fetchRecentChangelog(SECTIONS_SHOWN)
|
|
27
|
+
.then((s) => { if (alive) setNotes(s); })
|
|
28
|
+
.catch(() => { if (alive) setFailed(true); });
|
|
29
|
+
return () => { alive = false; };
|
|
30
|
+
}, []);
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<div className="flex h-full min-h-0 flex-col bg-background font-sans" data-testid="release-notes-view">
|
|
34
|
+
<div className="flex shrink-0 items-center gap-3 border-b border-border-soft px-5 py-3">
|
|
35
|
+
<div className="min-w-0 flex-1">
|
|
36
|
+
<div className="text-sm font-semibold text-text">Release notes</div>
|
|
37
|
+
{installed && <div className="font-mono text-xs text-text-3">PPM v{installed} installed</div>}
|
|
38
|
+
</div>
|
|
39
|
+
<a
|
|
40
|
+
href={RELEASES_URL}
|
|
41
|
+
target="_blank"
|
|
42
|
+
rel="noopener noreferrer"
|
|
43
|
+
className="flex min-h-11 items-center gap-1.5 rounded-lg border border-border px-3 text-xs font-medium text-text-2 transition-colors hover:text-text md:min-h-8"
|
|
44
|
+
>
|
|
45
|
+
<ExternalLink className="size-3.5" /> GitHub
|
|
46
|
+
</a>
|
|
47
|
+
</div>
|
|
48
|
+
<div className="min-h-0 flex-1 overflow-y-auto overflow-x-hidden px-5 py-4 text-sm leading-relaxed">
|
|
49
|
+
{notes === null && !failed ? (
|
|
50
|
+
<span className="flex items-center gap-2 text-text-3">
|
|
51
|
+
<Loader2 className="size-4 animate-spin" /> Loading release notes…
|
|
52
|
+
</span>
|
|
53
|
+
) : failed || !notes?.length ? (
|
|
54
|
+
<span className="text-text-3">Release notes could not be loaded. Open them on GitHub instead.</span>
|
|
55
|
+
) : (
|
|
56
|
+
<div className="mx-auto max-w-3xl space-y-6">
|
|
57
|
+
{notes.map((s) => (
|
|
58
|
+
<ReleaseNotesEntry
|
|
59
|
+
key={s.version}
|
|
60
|
+
version={s.version}
|
|
61
|
+
date={s.date}
|
|
62
|
+
body={s.body}
|
|
63
|
+
size="comfortable"
|
|
64
|
+
installed={s.version === installed}
|
|
65
|
+
/>
|
|
66
|
+
))}
|
|
67
|
+
</div>
|
|
68
|
+
)}
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
);
|
|
72
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{At as r,Cn as i,Cr as a,J as o,Kr as s,Zr as c,cr as l,ht as u,li as d,ln as f,ut as p,xn as m}from"./icons-C1wDt09O.js";import{a as h}from"./api-client-BnYFnEfK.js";import{n as g}from"./utils-D3xTlJyU.js";import"./portal-container-context-Gepuvxdg.js";import"./chat-preparation-cache-Bzb-T1pm.js";import{n as _}from"./use-is-mobile-CL2I7hLf.js";import{r as v}from"./clipboard-D3XnL7CB.js";import{r as y,t as b}from"./button-BHGVTbam.js";import{a as x,i as S,n as C,o as w,r as T,t as E}from"./dialog-DnE192fh.js";import{t as D}from"./mobile-bottom-sheet-M9pZptfh.js";import"./use-visual-viewport-B_GFo6k2.js";import{t as O}from"./input-CReAuQTF.js";import{Fi as k,Ji as A,Jn as j,Kn as M,Xi as N,Xn as P,Yi as F,Yn as I,Zn as L,jr as R,qn as ee}from"./index-Cx9ZRibz.js";import{_ as te,a as ne,h as z,m as re,o as ie,p as ae,r as oe,v as se,x as B,y as ce}from"./api-settings-BPIlTiBi.js";import{_ as le,a as ue,b as de,c as fe,d as pe,g as V,h as H,l as me,m as he,n as ge,o as _e,p as U,r as ve,s as W,t as ye,u as be,x as G,y as K}from"./codex-reset-credit-button-BKgiUi8E.js";var q=e(t(),1),J=n(),Y=[`Mon`,`Tue`,`Wed`,`Thu`,`Fri`,`Sat`,`Sun`],X=Array.from({length:24},(e,t)=>t);function xe(e,t){let n=Array.from({length:7},()=>Array.from({length:24},()=>({sum:0,count:0,avg:0})));for(let r of e){let e=t===`5h`?r.five_hour_util:r.weekly_util;if(e==null)continue;let i=new Date(r.recorded_at+(r.recorded_at.endsWith(`Z`)?``:`Z`)),a=(i.getDay()+6)%7,o=i.getHours();n[a][o].sum+=e,n[a][o].count+=1}for(let e of n)for(let t of e)t.avg=t.count>0?t.sum/t.count:0;return n}function Se(e){return e.map(e=>{let t=e.reduce((e,t)=>e+t.sum,0),n=e.reduce((e,t)=>e+t.count,0);return n>0?t/n:0})}function Ce(e){return X.map(t=>{let n=0,r=0;for(let i of e)n+=i[t].sum,r+=i[t].count;return r>0?n/r:0})}function Z(e){return e===0?`bg-surface-elevated`:e<.3?`bg-success/30`:e<.5?`bg-success/60`:e<.7?`bg-warning/50`:e<.9?`bg-warning/80`:`bg-error/80`}function we(e){return e<.3?`bg-success`:e<.7?`bg-warning`:`bg-error`}function Te({accountId:e}){let[t,n]=(0,q.useState)(null),[r,i]=(0,q.useState)(!0),[a,o]=(0,q.useState)(`5h`);(0,q.useEffect)(()=>{i(!0),ae(e).then(n).catch(()=>n([])).finally(()=>i(!1))},[e]);let s=(0,q.useMemo)(()=>t?xe(t,a):null,[t,a]),c=(0,q.useMemo)(()=>s?Se(s):[],[s]),l=(0,q.useMemo)(()=>s?Ce(s):[],[s]),u=Math.max(...c,.01);if(Math.max(...l,.01),r)return(0,J.jsx)(`div`,{className:`flex items-center justify-center py-3`,children:(0,J.jsx)(m,{className:`size-3 animate-spin text-text-subtle`})});if(!t||t.length===0)return(0,J.jsx)(`div`,{className:`text-[10px] text-text-subtle py-2 text-center`,children:`No usage history yet`});let d=t.length,f=new Set(t.map(e=>new Date(e.recorded_at+(e.recorded_at.endsWith(`Z`)?``:`Z`)).toDateString())).size;return(0,J.jsxs)(`div`,{className:`mt-2 space-y-2`,children:[(0,J.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,J.jsx)(`span`,{className:`text-[10px] font-medium text-text-subtle`,children:`Usage Pattern (7d)`}),(0,J.jsxs)(`div`,{className:`flex gap-0.5 text-[9px]`,children:[(0,J.jsx)(`button`,{onClick:()=>o(`5h`),className:`px-1.5 py-0.5 rounded cursor-pointer transition-colors ${a===`5h`?`bg-primary/15 text-primary`:`text-text-subtle hover:text-text-secondary`}`,title:`5-hour rolling window limit — resets every 5 hours`,children:`5h`}),(0,J.jsx)(`button`,{onClick:()=>o(`weekly`),className:`px-1.5 py-0.5 rounded cursor-pointer transition-colors ${a===`weekly`?`bg-primary/15 text-primary`:`text-text-subtle hover:text-text-secondary`}`,title:`Weekly limit — resets every 7 days`,children:`Wk`})]})]}),(0,J.jsxs)(`p`,{className:`text-[9px] text-text-subtle leading-tight`,children:[`Avg `,a===`5h`?`5-hour`:`weekly`,` limit usage over `,f,`d (`,d,` samples). Higher % = closer to rate limit. Hover cells for details.`]}),(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`span`,{className:`text-[9px] text-text-subtle`,children:`Avg usage by day of week`}),(0,J.jsx)(`div`,{className:`flex flex-col gap-[2px] mt-0.5`,children:Y.map((e,t)=>{let n=c[t]??0;return(0,J.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,J.jsx)(`span`,{className:`text-[8px] text-text-subtle w-5 shrink-0 text-right tabular-nums`,children:e}),(0,J.jsx)(`div`,{className:`flex-1 h-2.5 bg-surface-elevated rounded-sm overflow-hidden`,children:(0,J.jsx)(`div`,{className:`h-full rounded-sm transition-all ${we(n)}`,style:{width:`${Math.round(n/u*100)}%`}})}),(0,J.jsxs)(`span`,{className:`text-[8px] text-text-subtle w-6 shrink-0 text-right tabular-nums`,children:[Math.round(n*100),`%`]})]},e)})})]}),(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`span`,{className:`text-[9px] text-text-subtle`,children:`Avg usage by hour (0h-23h)`}),(0,J.jsx)(`div`,{className:`flex gap-[1px] mt-0.5`,children:X.map(e=>{let t=l[e]??0;return(0,J.jsxs)(`div`,{className:`flex-1 flex flex-col items-center gap-[1px]`,children:[(0,J.jsx)(`div`,{className:`w-full aspect-square rounded-[2px] ${Z(t)}`,title:`${e}:00 — avg ${Math.round(t*100)}% usage`}),e%6==0&&(0,J.jsx)(`span`,{className:`text-[7px] text-text-subtle tabular-nums`,children:e})]},e)})})]}),s&&(0,J.jsxs)(`div`,{children:[(0,J.jsx)(`span`,{className:`text-[9px] text-text-subtle`,children:`Day x Hour heatmap`}),(0,J.jsxs)(`div`,{className:`flex flex-col gap-[1px] mt-0.5`,children:[Y.map((e,t)=>(0,J.jsxs)(`div`,{className:`flex items-center gap-[1px]`,children:[(0,J.jsx)(`span`,{className:`text-[7px] text-text-subtle w-4 shrink-0 text-right`,children:e.charAt(0)}),X.map(n=>{let r=s[t][n];return(0,J.jsx)(`div`,{className:`flex-1 aspect-square rounded-[1px] ${Z(r.avg)}`,title:`${e} ${n}:00 — ${r.count>0?`avg ${Math.round(r.avg*100)}% (${r.count} samples)`:`no data`}`},n)})]},e)),(0,J.jsxs)(`div`,{className:`flex items-center gap-[1px]`,children:[(0,J.jsx)(`span`,{className:`w-4 shrink-0`}),X.map(e=>(0,J.jsx)(`div`,{className:`flex-1 text-center`,children:e%6==0&&(0,J.jsx)(`span`,{className:`text-[7px] text-text-subtle tabular-nums`,children:e})},e))]})]})]}),(0,J.jsxs)(`div`,{className:`flex items-center gap-1.5 text-[8px] text-text-subtle`,children:[(0,J.jsx)(`span`,{children:`Low`}),(0,J.jsxs)(`div`,{className:`flex gap-[2px]`,children:[(0,J.jsx)(`div`,{className:`size-2 rounded-[1px] bg-success/30`}),(0,J.jsx)(`div`,{className:`size-2 rounded-[1px] bg-success/60`}),(0,J.jsx)(`div`,{className:`size-2 rounded-[1px] bg-warning/50`}),(0,J.jsx)(`div`,{className:`size-2 rounded-[1px] bg-warning/80`}),(0,J.jsx)(`div`,{className:`size-2 rounded-[1px] bg-error/80`})]}),(0,J.jsx)(`span`,{children:`High`}),(0,J.jsx)(`span`,{className:`ml-1`,children:`|`}),(0,J.jsx)(`div`,{className:`size-2 rounded-[1px] bg-surface-elevated border border-border/30`}),(0,J.jsx)(`span`,{children:`No data`})]})]})}function Ee({profile:e,accountId:t,onClose:n}){let r=[[`Name`,e.account?.display_name],[`Email`,e.account?.email],[`Org`,e.organization?.name],[`Type`,e.organization?.organization_type],[`Tier`,e.organization?.rate_limit_tier],[`Status`,e.organization?.subscription_status]];return(0,J.jsxs)(`section`,{className:`space-y-2 border-t border-border pt-3`,"data-testid":`account-profile-panel`,children:[(0,J.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,J.jsx)(`h3`,{className:`text-sm font-medium`,children:`Profile`}),(0,J.jsx)(`button`,{className:`p-2 text-muted-foreground hover:text-foreground cursor-pointer`,onClick:n,"aria-label":`Close profile`,children:(0,J.jsx)(d,{className:`size-4`})})]}),(0,J.jsx)(`div`,{className:`grid grid-cols-[80px_1fr] gap-x-3 gap-y-1 text-xs`,children:r.map(([e,t])=>t?(0,J.jsxs)(`span`,{className:`contents`,children:[(0,J.jsx)(`span`,{className:`text-muted-foreground`,children:e}),(0,J.jsx)(`span`,{className:`break-all`,children:t})]},e):null)}),(0,J.jsx)(Te,{accountId:t})]})}function De({display:e,onConfirm:t,onCancel:n}){let r=_(),i=(0,J.jsxs)(`div`,{className:`space-y-4`,"data-testid":`account-delete-confirm`,children:[(0,J.jsxs)(`p`,{className:`text-sm`,children:[`Remove `,(0,J.jsx)(`span`,{className:`font-medium`,children:e}),`?`]}),(0,J.jsx)(`p`,{className:`text-xs text-text-subtle`,children:`The stored token is deleted from this machine. Any export you already made keeps working.`}),(0,J.jsxs)(`div`,{className:`flex flex-col-reverse md:flex-row gap-2 md:justify-end pt-2`,children:[(0,J.jsx)(b,{variant:`outline`,onClick:n,className:`min-h-11`,children:`Cancel`}),(0,J.jsx)(b,{variant:`destructive`,autoFocus:!1,onClick:t,className:`min-h-11`,children:`Remove account`})]})]});return r?(0,J.jsx)(D,{open:!0,onClose:n,children:(0,J.jsxs)(`div`,{className:`px-4 pb-4`,children:[(0,J.jsx)(`h2`,{className:`text-base font-semibold mb-3`,children:`Remove account`}),i]})}):(0,J.jsx)(E,{open:!0,onOpenChange:e=>{e||n()},children:(0,J.jsxs)(C,{className:`sm:max-w-sm`,children:[(0,J.jsx)(x,{children:(0,J.jsx)(w,{className:`text-sm`,children:`Remove account`})}),i]})})}var Oe=80;function ke({current:e,onSave:t,onCancel:n}){let r=_(),[i,a]=(0,q.useState)(e),[o,s]=(0,q.useState)(!1),[c,l]=(0,q.useState)(null),u=i.trim(),d=!!u&&u!==e&&!o,f=async()=>{if(d){s(!0),l(null);try{await t(u)}catch(e){l(e.message||`Could not rename the account`),s(!1)}}},p=()=>{o||n()},h=(0,J.jsxs)(`form`,{className:`space-y-4`,"data-testid":`account-rename-dialog`,onSubmit:e=>{e.preventDefault(),f()},children:[(0,J.jsx)(O,{autoFocus:!0,value:i,maxLength:Oe,onChange:e=>a(e.target.value),placeholder:`e.g. Personal, Work`,"aria-label":`Account name`,className:`min-h-11 text-sm md:min-h-9`}),c&&(0,J.jsx)(`p`,{className:`text-xs text-error`,role:`alert`,children:c}),(0,J.jsxs)(`div`,{className:`flex flex-col-reverse md:flex-row gap-2 md:justify-end`,children:[(0,J.jsx)(b,{type:`button`,variant:`outline`,onClick:p,disabled:o,className:`min-h-11 md:min-h-9`,children:`Cancel`}),(0,J.jsxs)(b,{type:`submit`,disabled:!d,className:`min-h-11 md:min-h-9`,children:[o&&(0,J.jsx)(m,{className:`size-4 animate-spin`}),` Save`]})]})]});return r?(0,J.jsx)(D,{open:!0,onClose:p,children:(0,J.jsxs)(`div`,{className:`px-4 pb-4`,children:[(0,J.jsx)(`h2`,{className:`text-base font-semibold mb-3`,children:`Rename account`}),h]})}):(0,J.jsx)(E,{open:!0,onOpenChange:e=>{e||p()},children:(0,J.jsxs)(C,{className:`sm:max-w-sm`,children:[(0,J.jsx)(x,{children:(0,J.jsx)(w,{className:`text-sm`,children:`Rename account`})}),h]})})}function Ae(e){let t=new Blob([e],{type:`application/json`}),n=document.createElement(`a`);n.href=URL.createObjectURL(t),n.download=`ppm-accounts-backup.json`,n.click(),URL.revokeObjectURL(n.href)}function je({open:e,onOpenChange:t,accounts:n,preselectId:r,onMessage:a}){let o=n.filter(e=>e.hasRefreshToken),[s,c]=(0,q.useState)(new Set),[l,d]=(0,q.useState)(``),[f,g]=(0,q.useState)(!1),[_,y]=(0,q.useState)(!1),[D,k]=(0,q.useState)(!1),[A,j]=(0,q.useState)(!1);e&&!A&&(c(r?new Set([r]):new Set(o.map(e=>e.id))),j(!0)),!e&&A&&j(!1);function M(){t(!1),d(``),g(!1),y(!1)}async function N(e){if(s.size===0)return;k(!0);let t=l.trim()||`ppm-hienlh`;try{let n={"Content-Type":`application/json`},r=h();r&&(n.Authorization=`Bearer ${r}`);let i=await fetch(`/api/accounts/export`,{method:`POST`,headers:n,body:JSON.stringify({password:t,accountIds:[...s],includeRefreshToken:f,refreshBeforeExport:_})});if(!i.ok){let e=await i.json();throw Error(e.error??`Export failed: ${i.status}`)}let o=await i.text();e&&await v(o)?a?.(`Backup copied to clipboard!`):(Ae(o),a?.(`Backup downloaded.`)),M()}catch{}k(!1)}let P=s.size>0&&!D;return(0,J.jsx)(E,{open:e,onOpenChange:e=>{e||M()},children:(0,J.jsxs)(C,{className:`sm:max-w-md`,children:[(0,J.jsxs)(x,{children:[(0,J.jsxs)(w,{className:`text-sm flex items-center gap-1.5`,children:[(0,J.jsx)(i,{className:`size-3.5`}),` Export Accounts`]}),(0,J.jsx)(T,{className:`text-xs`,children:`Select accounts and set a password to protect the backup.`})]}),(0,J.jsxs)(`div`,{className:`space-y-3`,children:[(0,J.jsxs)(`div`,{className:`space-y-1`,children:[(0,J.jsxs)(`div`,{className:`flex items-center justify-between mb-1`,children:[(0,J.jsx)(`p`,{className:`text-[11px] font-medium text-muted-foreground`,children:`Accounts to export`}),(0,J.jsx)(`button`,{className:`text-[10px] text-primary hover:underline cursor-pointer`,onClick:()=>c(s.size===o.length?new Set:new Set(o.map(e=>e.id))),children:s.size===o.length?`Deselect all`:`Select all`})]}),o.length===0?(0,J.jsx)(`p`,{className:`text-[10px] text-muted-foreground p-2 border rounded`,children:`No exportable accounts.`}):(0,J.jsx)(`div`,{className:`max-h-36 overflow-y-auto space-y-1 border rounded p-2`,children:o.map(e=>(0,J.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,J.jsx)(`input`,{type:`checkbox`,id:`exp-${e.id}`,checked:s.has(e.id),onChange:t=>{let n=new Set(s);t.target.checked?n.add(e.id):n.delete(e.id),c(n)},className:`size-3.5 accent-primary cursor-pointer`}),(0,J.jsx)(`label`,{htmlFor:`exp-${e.id}`,className:`text-xs cursor-pointer truncate`,children:e.label??e.email??e.id.slice(0,8)})]},e.id))})]}),(0,J.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,J.jsxs)(R,{className:`text-xs`,children:[`Password `,(0,J.jsx)(`span`,{className:`text-muted-foreground font-normal`,children:`(optional)`})]}),(0,J.jsx)(O,{type:`password`,placeholder:`Leave empty for default`,value:l,onChange:e=>d(e.target.value),className:`text-xs h-8`,autoComplete:`new-password`})]}),(0,J.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,J.jsx)(`input`,{type:`checkbox`,id:`exp-full`,checked:f,onChange:e=>g(e.target.checked),className:`size-3.5 accent-primary cursor-pointer`}),(0,J.jsx)(`label`,{htmlFor:`exp-full`,className:`text-[11px] cursor-pointer`,children:`Include refresh tokens (full transfer)`})]}),(0,J.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,J.jsx)(`input`,{type:`checkbox`,id:`exp-refresh`,checked:_,onChange:e=>y(e.target.checked),className:`size-3.5 accent-primary cursor-pointer`}),(0,J.jsx)(`label`,{htmlFor:`exp-refresh`,className:`text-[11px] cursor-pointer`,children:`Refresh tokens before export`})]}),f?(0,J.jsxs)(`div`,{className:`rounded-md border border-error/30 bg-error/5 p-2.5`,children:[(0,J.jsx)(`p`,{className:`text-[10px] font-medium text-error`,children:`Full transfer — source accounts will expire`}),(0,J.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Refresh tokens included. Source machine expires in ~1h after target refreshes.`})]}):_?(0,J.jsx)(`div`,{className:`rounded-md border border-warning/30 bg-warning/5 p-2.5`,children:(0,J.jsx)(`p`,{className:`text-[10px] font-medium text-warning`,children:`Refresh before export — invalidates previous shares`})}):(0,J.jsx)(`div`,{className:`rounded-md border border-success/30 bg-success/5 p-2.5`,children:(0,J.jsx)(`p`,{className:`text-[10px] font-medium text-success`,children:`Share current token (safe)`})}),(0,J.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Encrypted with AES-256-GCM + scrypt.`})]}),(0,J.jsxs)(S,{className:`gap-1.5 flex-col sm:flex-row`,children:[(0,J.jsx)(b,{size:`sm`,variant:`outline`,className:`text-xs h-7 cursor-pointer`,onClick:M,children:`Cancel`}),(0,J.jsxs)(b,{size:`sm`,variant:`outline`,className:`text-xs h-7 cursor-pointer`,disabled:!P,onClick:()=>N(!0),children:[(0,J.jsx)(p,{className:`size-3 mr-1`}),` Copy`]}),(0,J.jsx)(b,{size:`sm`,className:`text-xs h-7 cursor-pointer`,disabled:!P,onClick:()=>N(!1),children:D?(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(m,{className:`size-3 animate-spin mr-1`}),` Exporting...`]}):(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(u,{className:`size-3 mr-1`}),` Download`]})})]})]})})}function Me({open:e,onOpenChange:t,onSuccess:n}){let[r,a]=(0,q.useState)(``),[o,s]=(0,q.useState)(``),[c,l]=(0,q.useState)(!1),[u,d]=(0,q.useState)(null);function f(){t(!1),a(``),s(``),d(null)}async function p(){if(r.trim()){l(!0),d(null);try{let e=await re({data:r.trim(),password:o.trim()||`ppm-hienlh`});f(),n(`Imported ${e.imported} account(s)`)}catch(e){d(e.message||`Import failed`)}l(!1)}}return(0,J.jsx)(E,{open:e,onOpenChange:e=>{e||f()},children:(0,J.jsxs)(C,{className:`sm:max-w-md`,children:[(0,J.jsxs)(x,{children:[(0,J.jsxs)(w,{className:`text-sm flex items-center gap-1.5`,children:[(0,J.jsx)(i,{className:`size-3.5`}),` Import Accounts`]}),(0,J.jsx)(T,{className:`text-xs`,children:`Paste backup data and enter the export password. Imported accounts are temporary (~1h).`})]}),(0,J.jsxs)(`div`,{className:`space-y-3`,children:[(0,J.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,J.jsx)(R,{className:`text-xs`,children:`Backup data`}),(0,J.jsx)(`textarea`,{value:r,onChange:e=>a(e.target.value),placeholder:`Paste backup JSON here...`,rows:4,className:`w-full text-xs p-2 rounded border border-border bg-background font-mono resize-none focus:outline-none focus:ring-1 focus:ring-primary`})]}),(0,J.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,J.jsxs)(R,{className:`text-xs`,children:[`Password `,(0,J.jsx)(`span`,{className:`text-muted-foreground font-normal`,children:`(optional)`})]}),(0,J.jsx)(O,{type:`password`,placeholder:`Leave empty for default`,value:o,onChange:e=>s(e.target.value),className:`text-xs h-8`,autoComplete:`current-password`})]})]}),u&&(0,J.jsx)(`div`,{className:`text-[11px] p-2 rounded bg-error/10 text-error`,children:u}),(0,J.jsxs)(S,{children:[(0,J.jsx)(b,{size:`sm`,variant:`outline`,className:`text-xs h-7 cursor-pointer`,onClick:f,children:`Cancel`}),(0,J.jsx)(b,{size:`sm`,className:`text-xs h-7 cursor-pointer`,disabled:!r.trim()||c,onClick:p,children:c?(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(m,{className:`size-3 animate-spin mr-1`}),` Importing...`]}):`Import`})]})]})})}var Q=typeof window<`u`?window.matchMedia(`(min-width: 768px)`):null;function Ne(e){return Q?.addEventListener(`change`,e),()=>Q?.removeEventListener(`change`,e)}function Pe(){return Q?.matches??!0}function $(){let[e,t]=(0,q.useState)(null),[n,r]=(0,q.useState)(!0);return(0,q.useEffect)(()=>{r(!0),ie().then(t).finally(()=>r(!1))},[]),n?(0,J.jsx)(`p`,{className:`text-xs text-text-subtle py-4 text-center`,children:`Loading...`}):e?(0,J.jsxs)(`div`,{className:`space-y-4`,children:[(0,J.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,J.jsx)(`label`,{className:`text-xs font-medium text-text-primary`,children:`Rotation Strategy`}),(0,J.jsxs)(M,{value:e.strategy,onValueChange:async e=>{t(await B({strategy:e}))},children:[(0,J.jsx)(I,{className:`w-full h-9 text-xs`,children:(0,J.jsx)(P,{})}),(0,J.jsxs)(ee,{children:[(0,J.jsx)(j,{value:`round-robin`,children:`Round-robin`}),(0,J.jsx)(j,{value:`fill-first`,children:`Fill-first`}),(0,J.jsx)(j,{value:`lowest-usage`,children:`Lowest usage`})]})]}),(0,J.jsxs)(`p`,{className:`text-[10px] text-text-subtle`,children:[e.strategy===`round-robin`&&`Cycles through accounts evenly`,e.strategy===`fill-first`&&`Uses one account until its limit, then moves on`,e.strategy===`lowest-usage`&&`Picks the account with the lowest current usage`]})]}),(0,J.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,J.jsx)(`label`,{className:`text-xs font-medium text-text-primary`,children:`Max Retry`}),(0,J.jsx)(`input`,{type:`number`,min:0,value:e.maxRetry,className:`w-full h-9 text-xs border rounded-md px-3 bg-background`,onChange:async e=>{let n=parseInt(e.target.value,10);!isNaN(n)&&n>=0&&t(await B({maxRetry:n}))}}),(0,J.jsx)(`p`,{className:`text-[10px] text-text-subtle`,children:`How many accounts to try on failure. 0 = try all available accounts.`})]}),(0,J.jsxs)(`div`,{className:`space-y-1.5 border-t border-border pt-3`,children:[(0,J.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,J.jsx)(`label`,{className:`text-xs font-medium text-text-primary`,children:`Cooldown parking`}),(0,J.jsx)(L,{checked:e.cooldownEnabled,onCheckedChange:async e=>{t(await B({cooldownEnabled:e}))}})]}),(0,J.jsx)(`p`,{className:`text-[10px] text-text-subtle`,children:`Park a failing account (rate limit / usage limit / auth error) until it recovers. Off: accounts stay selectable — rotation still skips accounts already ≥95% on the 5-hour limit.`})]}),(0,J.jsxs)(`div`,{className:`flex items-center justify-between text-xs border-t border-border pt-3`,children:[(0,J.jsx)(`span`,{className:`text-text-subtle`,children:`Active accounts`}),(0,J.jsx)(`span`,{className:`font-medium text-text-primary`,children:e.activeCount})]})]}):(0,J.jsx)(`p`,{className:`text-xs text-text-subtle py-4 text-center`,children:`Failed to load settings`})}function Fe({open:e,onOpenChange:t}){let n=(0,q.useSyncExternalStore)(Ne,Pe);return e?n?(0,J.jsx)(E,{open:e,onOpenChange:t,children:(0,J.jsxs)(C,{className:`sm:max-w-sm`,children:[(0,J.jsx)(x,{children:(0,J.jsxs)(w,{className:`text-sm flex items-center gap-2`,children:[(0,J.jsx)(a,{className:`size-4`}),` Rotation & Retry`]})}),(0,J.jsx)($,{})]})}):(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`div`,{className:`fixed inset-0 z-50 transition-opacity duration-200 opacity-100`,onClick:()=>t(!1),style:{backgroundColor:`rgba(0,0,0,0.5)`}}),(0,J.jsxs)(`div`,{className:g(`fixed bottom-0 left-0 right-0 z-50 bg-background rounded-t-2xl border-t border-border shadow-2xl`,`transition-transform duration-300 ease-out max-h-[85vh] overflow-y-auto`,`translate-y-0`),children:[(0,J.jsx)(`div`,{className:`flex justify-center pt-3 pb-1`,children:(0,J.jsx)(`div`,{className:`w-10 h-1 rounded-full bg-border`})}),(0,J.jsxs)(`div`,{className:`flex items-center justify-between px-4 py-2 border-b border-border`,children:[(0,J.jsxs)(`span`,{className:`text-sm font-semibold flex items-center gap-2`,children:[(0,J.jsx)(a,{className:`size-4`}),` Rotation & Retry`]}),(0,J.jsx)(`button`,{onClick:()=>t(!1),className:`flex items-center justify-center size-7 rounded-md hover:bg-surface-elevated transition-colors`,children:(0,J.jsx)(d,{className:`size-4`})})]}),(0,J.jsx)(`div`,{className:`px-4 py-4 pb-8`,children:(0,J.jsx)($,{})})]})]}):null}var Ie=y(`inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2`,{variants:{variant:{default:`border-transparent bg-primary text-primary-foreground shadow`,secondary:`border-transparent bg-secondary text-secondary-foreground`,destructive:`border-transparent bg-destructive text-destructive-foreground shadow`,outline:`text-foreground`}},defaultVariants:{variant:`default`}});function Le({className:e,variant:t,...n}){return(0,J.jsx)(`div`,{className:g(Ie({variant:t}),e),...n})}function Re(e){let t=Math.floor(Date.now()/1e3);return e>t?`${Math.floor((e-t)/60)}m`:`exp`}function ze({accounts:e}){let[t,n]=(0,q.useState)([]),[r,i]=(0,q.useState)(!1),[a,o]=(0,q.useState)(!1),[s,c]=(0,q.useState)(new Map),l=e.filter(e=>e.hasRefreshToken);async function u(){if(l.length!==0){i(!0);try{let e=await se(l.map(e=>e.id),a);n(t=>[...t,{round:t.length+1,time:new Date().toLocaleTimeString(),includeRefresh:a,items:e}])}catch{}i(!1)}}async function d(e,t){c(t=>new Map(t).set(e,{loading:!0}));try{let n=await ce(t);c(t=>new Map(t).set(e,{loading:!1,...n}))}catch(t){c(n=>new Map(n).set(e,{loading:!1,status:`error`,error:t.message}))}}function f(e,t){return[{key:`r${e.round}-pre-${t.id}`,label:`Pre-export`,token:t.preExportTokenFull,preview:t.preExportToken,expires:t.preExportExpires},{key:`r${e.round}-exp-${t.id}`,label:`Exported`,token:t.exportedTokenFull,preview:t.exportedToken,expires:t.exportedExpires},{key:`r${e.round}-post-${t.id}`,label:`Post-export`,token:t.postExportTokenFull,preview:t.postExportToken,expires:t.postExportExpires}]}function p(){for(let e of t)for(let t of e.items)for(let n of f(e,t))n.token&&d(n.key,n.token)}return(0,J.jsxs)(`section`,{className:`border-t pt-4 space-y-2`,children:[(0,J.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,J.jsx)(`p`,{className:`text-xs font-medium`,children:`Simulate export`}),t.length>0&&(0,J.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[t.length,` round(s)`]})]}),(0,J.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Every run appends a round. Earlier rounds are kept so tokens can be compared across runs.`}),l.length===0?(0,J.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No OAuth account with a refresh token to export.`}):(0,J.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,J.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,J.jsx)(L,{id:`sim-include-refresh`,checked:a,onCheckedChange:o,className:`cursor-pointer`}),(0,J.jsx)(R,{htmlFor:`sim-include-refresh`,className:`text-[11px] cursor-pointer`,children:`Include refresh tokens`})]}),(0,J.jsx)(b,{size:`sm`,className:`h-7 text-xs cursor-pointer`,disabled:r,onClick:()=>void u(),children:r?(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(m,{className:`size-3 animate-spin mr-1`}),` Exporting...`]}):`Run export #${t.length+1}`})]}),t.length>0&&(0,J.jsxs)(`div`,{className:`space-y-3`,children:[(0,J.jsxs)(b,{size:`sm`,variant:`outline`,className:`w-full h-7 text-[11px] cursor-pointer`,onClick:p,children:[`Test all tokens (`,t.reduce((e,t)=>e+t.items.length*3,0),`)`]}),t.map(e=>(0,J.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,J.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,J.jsxs)(`p`,{className:`text-xs font-medium text-primary`,children:[`Round #`,e.round]}),(0,J.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:e.time}),(0,J.jsx)(Le,{variant:e.includeRefresh?`destructive`:`secondary`,className:`text-[9px] px-1 py-0`,children:e.includeRefresh?`with refresh`:`access only`})]}),e.items.map(t=>(0,J.jsxs)(`div`,{className:`p-2 rounded-lg border bg-card space-y-1.5`,children:[(0,J.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,J.jsx)(`span`,{className:`text-[11px] font-medium`,children:t.label??t.email??t.id.slice(0,8)}),t.tokenChanged&&(0,J.jsx)(Le,{variant:`secondary`,className:`text-[9px] px-1 py-0`,children:`DB token changed`})]}),f(e,t).map(e=>{let t=s.get(e.key);return(0,J.jsxs)(`div`,{className:`flex items-center gap-1.5 text-[11px]`,children:[(0,J.jsx)(`span`,{className:`w-20 shrink-0 text-muted-foreground text-[10px]`,children:e.label}),(0,J.jsx)(`code`,{className:`flex-1 truncate font-mono text-[10px] bg-muted px-1 rounded`,children:e.preview??`N/A`}),e.expires&&(0,J.jsx)(`span`,{className:`text-[10px] text-muted-foreground shrink-0`,children:Re(e.expires)}),e.token?(0,J.jsx)(b,{size:`sm`,variant:`outline`,className:`h-6 text-[10px] px-1.5 cursor-pointer shrink-0`,disabled:t?.loading,onClick:()=>void d(e.key,e.token),children:t?.loading?(0,J.jsx)(m,{className:`size-3 animate-spin`}):`Test`}):(0,J.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`-`}),t&&!t.loading&&(0,J.jsx)(`span`,{className:`text-[10px] font-medium shrink-0 ${t.status?.startsWith(`valid`)?`text-success`:`text-error`}`,children:t.status})]},e.key)})]},`r${e.round}-${t.id}`))]},e.round))]})]})}function Be(e){let t=Math.floor(Date.now()/1e3),n=Math.floor(Math.abs(e-t)/60);return e>t?`${n}m left`:`expired ${n}m ago`}function Ve({open:e,onOpenChange:t,accounts:n}){let[i,a]=(0,q.useState)(new Map),[o,s]=(0,q.useState)(!1);async function c(e){a(t=>new Map(t).set(e,{loading:!0}));try{let t=await te(e,o);a(n=>new Map(n).set(e,{loading:!1,result:t}))}catch(t){a(n=>new Map(n).set(e,{loading:!1,error:t.message}))}}function l(){for(let e of n.filter(e=>e.expiresAt!==null))c(e.id)}return(0,J.jsx)(E,{open:e,onOpenChange:t,children:(0,J.jsxs)(C,{className:`sm:max-w-xl max-h-[85vh] flex flex-col`,children:[(0,J.jsxs)(x,{children:[(0,J.jsxs)(w,{className:`text-sm flex items-center gap-1.5`,children:[(0,J.jsx)(r,{className:`size-4`}),` Token Test`]}),(0,J.jsx)(T,{className:`text-xs`,children:`Probe stored tokens for validity. Nothing is modified.`})]}),(0,J.jsxs)(`div`,{className:`space-y-4 overflow-y-auto flex-1 pr-1`,children:[(0,J.jsxs)(`section`,{className:`space-y-2`,children:[(0,J.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,J.jsx)(`p`,{className:`text-xs font-medium`,children:`Current tokens`}),(0,J.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,J.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,J.jsx)(L,{id:`token-test-refresh`,checked:o,onCheckedChange:s,className:`cursor-pointer`}),(0,J.jsx)(R,{htmlFor:`token-test-refresh`,className:`text-[11px] cursor-pointer`,children:`Also test refresh`})]}),(0,J.jsx)(b,{size:`sm`,variant:`outline`,className:`h-7 text-xs cursor-pointer`,onClick:l,children:`Test all`})]})]}),n.length===0&&(0,J.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No accounts to test.`}),(0,J.jsx)(`div`,{className:`space-y-1.5`,children:n.map(e=>{let t=i.get(e.id),n=t?.result?.accessToken.status;return(0,J.jsxs)(`div`,{className:`p-2 rounded border bg-card space-y-1`,children:[(0,J.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,J.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,J.jsx)(`span`,{className:`text-xs font-medium truncate block`,children:e.label??e.email??e.id.slice(0,8)}),e.expiresAt&&(0,J.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:Be(e.expiresAt)})]}),(0,J.jsx)(b,{size:`sm`,variant:`outline`,className:`h-7 text-xs cursor-pointer shrink-0`,disabled:t?.loading,onClick:()=>void c(e.id),children:t?.loading?(0,J.jsx)(m,{className:`size-3 animate-spin`}):`Test`})]}),t&&!t.loading&&(0,J.jsxs)(`div`,{className:`text-[11px] pl-2 border-l-2 border-muted`,children:[t.error&&(0,J.jsx)(`p`,{className:`text-error`,children:t.error}),n&&(0,J.jsxs)(`span`,{className:n.startsWith(`valid`)?`text-success`:`text-error`,children:[n,t.result?.accessToken.code?` (${t.result.accessToken.code})`:``]})]})]},e.id)})})]}),(0,J.jsx)(ze,{accounts:n})]}),(0,J.jsx)(S,{children:(0,J.jsx)(b,{size:`sm`,variant:`outline`,className:`text-xs cursor-pointer`,onClick:()=>t(!1),children:`Close`})})]})})}function He(){let{usages:e,accounts:t,activeAccountId:n,initialLoading:i,refreshing:o,flashIds:s,reload:d}=me(),[p,h]=(0,q.useState)(null),[g,_]=(0,q.useState)(null),[v,y]=(0,q.useState)(null),[x,S]=(0,q.useState)(null),[C,w]=(0,q.useState)(null),[T,E]=(0,q.useState)(null),[D,O]=(0,q.useState)(null),[k,A]=(0,q.useState)(void 0);function j(e){d(),e&&h(e)}async function M(e,t){_(e);try{await z(e,{status:t===`disabled`?`active`:`disabled`})}catch(e){h(e.message)}_(null),d()}async function N(){if(v){try{await oe(v.id),h(`Account "${v.display}" removed.`),d()}catch(e){h(`Failed to remove: ${e.message}`)}y(null)}}async function P(e){x&&(await z(x.id,{label:e}),S(null),h(`Account renamed to "${e}".`),d())}let F=new Map(t.map(e=>[e.id,e])),I=e[0]?.usage.lastFetchedAt;return(0,J.jsxs)(`div`,{className:`space-y-4`,children:[(0,J.jsx)(H,{description:`Connect multiple Claude accounts. PPM rotates between them automatically to avoid rate limits.`,onRefresh:()=>void d(),refreshing:o,disabled:i,actions:(0,J.jsxs)(J.Fragment,{children:[(0,J.jsxs)(b,{size:`sm`,className:`cursor-pointer gap-1.5`,onClick:()=>{A(void 0),O(`add`)},children:[(0,J.jsx)(l,{className:`size-4`}),` Add account`]}),(0,J.jsxs)(b,{size:`sm`,variant:`outline`,className:`cursor-pointer gap-1.5`,onClick:()=>{E(null),O(`export`)},children:[(0,J.jsx)(u,{className:`size-4`}),` Export`]}),(0,J.jsxs)(b,{size:`sm`,variant:`outline`,className:`cursor-pointer gap-1.5`,onClick:()=>O(`import`),children:[(0,J.jsx)(c,{className:`size-4`}),` Import`]}),(0,J.jsxs)(b,{size:`sm`,variant:`outline`,className:`cursor-pointer gap-1.5`,onClick:()=>O(`rotation`),children:[(0,J.jsx)(a,{className:`size-4`}),` Rotation`]}),(0,J.jsxs)(b,{size:`sm`,variant:`outline`,className:`cursor-pointer gap-1.5`,onClick:()=>O(`token-test`),children:[(0,J.jsx)(r,{className:`size-4`}),` Token test`]})]})}),(0,J.jsx)(V,{message:p,onDismiss:()=>h(null)}),(0,J.jsxs)(`section`,{className:`space-y-2`,children:[(0,J.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,J.jsx)(`h3`,{className:`text-sm font-medium`,children:`Accounts`}),I&&(0,J.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[`usage `,de(new Date(I).getTime())]})]}),i?(0,J.jsxs)(`div`,{className:`flex items-center gap-2 py-6 text-xs text-muted-foreground`,children:[(0,J.jsx)(m,{className:`size-4 animate-spin`}),` Loading accounts...`]}):e.length===0?(0,J.jsxs)(`div`,{className:`flex flex-col items-center gap-2 py-8 text-center`,children:[(0,J.jsx)(f,{className:`size-5 text-muted-foreground`}),(0,J.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No accounts connected yet.`}),(0,J.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Add one to start using PPM.`})]}):(0,J.jsx)(U,{children:e.map(e=>(0,J.jsx)(be,{layout:`strip`,entry:e,isActive:e.accountId===n,accountInfo:F.get(e.accountId),onToggle:M,toggling:g===e.accountId,onDelete:(e,t)=>y({id:e,display:t}),onRename:(e,t)=>S({id:e,current:t}),onExport:e=>{E(e),O(`export`)},onViewProfile:(e,t)=>w({profile:e,accountId:t}),onReauth:()=>{A({id:e.accountId,label:e.accountLabel??e.accountId.slice(0,8)}),O(`add`)},flash:s.has(e.accountId)},e.accountId))})]}),C&&(0,J.jsx)(Ee,{profile:C.profile,accountId:C.accountId,onClose:()=>w(null)}),v&&(0,J.jsx)(De,{display:v.display,onConfirm:()=>void N(),onCancel:()=>y(null)}),x&&(0,J.jsx)(ke,{current:x.current,onSave:P,onCancel:()=>S(null)}),(0,J.jsx)(fe,{open:D===`add`,onOpenChange:e=>{O(e?`add`:null),e||A(void 0)},onSuccess:j,signInAgainFor:k}),(0,J.jsx)(je,{open:D===`export`,onOpenChange:e=>{O(e?`export`:null),e||E(null)},accounts:t,preselectId:T,onMessage:h}),(0,J.jsx)(Me,{open:D===`import`,onOpenChange:e=>O(e?`import`:null),onSuccess:j}),(0,J.jsx)(Fe,{open:D===`rotation`,onOpenChange:e=>O(e?`rotation`:null)}),(0,J.jsx)(Ve,{open:D===`token-test`,onOpenChange:e=>O(e?`token-test`:null),accounts:t})]})}function Ue({mode:e,onOpenChange:t,password:n,onPasswordChange:r,busy:a,onExport:o,onImport:s,error:l}){let d=(0,q.useRef)(null),f=e===`export`;return(0,J.jsx)(E,{open:e!==null,onOpenChange:t,children:(0,J.jsxs)(C,{className:`sm:max-w-md`,children:[(0,J.jsxs)(x,{children:[(0,J.jsxs)(w,{className:`text-sm flex items-center gap-1.5`,children:[(0,J.jsx)(i,{className:`size-4`}),` `,f?`Export Codex Accounts`:`Import Codex Accounts`]}),(0,J.jsx)(T,{className:`text-xs leading-relaxed`,children:f?`Writes a password-encrypted file containing each account's login.`:`Reads a backup file. The password must be the one it was exported with.`})]}),(0,J.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,J.jsx)(R,{htmlFor:`codex-backup-password`,className:`text-xs`,children:`Password`}),(0,J.jsx)(O,{id:`codex-backup-password`,type:`password`,placeholder:f?`Choose a password`:`Password used for the export`,value:n,onChange:e=>r(e.target.value),className:`text-xs`,autoComplete:f?`new-password`:`current-password`}),(0,J.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`A backup holds full logins — keep the file and its password together.`})]}),l&&(0,J.jsx)(`div`,{className:`text-[11px] p-2 rounded bg-error/10 text-error`,children:l}),(0,J.jsx)(`input`,{ref:d,type:`file`,accept:`application/json,.json`,className:`hidden`,onChange:e=>{let t=e.target.files?.[0];e.target.value=``,t&&s(t)}}),(0,J.jsxs)(S,{children:[(0,J.jsx)(b,{size:`sm`,variant:`outline`,className:`text-xs cursor-pointer`,onClick:()=>t(!1),children:`Cancel`}),(0,J.jsxs)(b,{size:`sm`,className:`text-xs cursor-pointer gap-1.5`,disabled:!n.trim()||a,onClick:()=>f?o():d.current?.click(),children:[a?(0,J.jsx)(m,{className:`size-3.5 animate-spin`}):f?(0,J.jsx)(u,{className:`size-3.5`}):(0,J.jsx)(c,{className:`size-3.5`}),f?`Download backup`:`Choose file`]})]})]})})}var We=[{value:`round-robin`,label:`Round-robin`,hint:`Take the next account each time.`},{value:`fill-first`,label:`Fill-first`,hint:`Stay on one account until it runs out.`},{value:`lowest-usage`,label:`Lowest usage`,hint:`Pick whichever has the most left.`}];function Ge({open:e,onOpenChange:t,strategy:n,onChange:r}){return(0,J.jsx)(E,{open:e,onOpenChange:t,children:(0,J.jsxs)(C,{className:`sm:max-w-md`,children:[(0,J.jsxs)(x,{children:[(0,J.jsx)(w,{className:`text-sm`,children:`Codex Rotation`}),(0,J.jsx)(T,{className:`text-xs leading-relaxed`,children:`How a new chat chooses among your Codex accounts.`})]}),(0,J.jsx)(`div`,{className:`space-y-2`,children:We.map(e=>(0,J.jsxs)(`button`,{type:`button`,onClick:()=>r(e.value),"aria-current":n===e.value?`true`:void 0,className:g(`w-full text-left rounded-md border px-3 py-2.5 min-h-11 cursor-pointer transition-colors`,n===e.value?`border-primary bg-primary/10`:`border-border hover:bg-accent/50 active:bg-accent`),children:[(0,J.jsx)(`p`,{className:`text-sm font-medium`,children:e.label}),(0,J.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.hint})]},e.value))}),(0,J.jsx)(S,{children:(0,J.jsx)(b,{size:`sm`,variant:`outline`,className:`text-xs cursor-pointer`,onClick:()=>t(!1),children:`Done`})})]})})}function Ke(e){return e==null?null:Math.round(e*100)}function qe({usage:e}){let t=e.session==null&&e.weekly==null;return(0,J.jsxs)(`div`,{className:`space-y-2`,children:[(t||e.session!=null)&&(0,J.jsx)(K,{label:`5-Hour Session`,pct:Ke(e.fiveHour),reset:G(e.session),resetsAt:e.session?.resetsAt}),(t||e.weekly!=null)&&(0,J.jsx)(K,{label:`Weekly`,pct:Ke(e.sevenDay),reset:G(e.weekly),resetsAt:e.weekly?.resetsAt})]})}function Je(){let[e,t]=(0,q.useState)(null),n=ue(()=>t(null)),[r,i]=(0,q.useState)(null);return(0,J.jsxs)(`div`,{className:`space-y-4`,children:[(0,J.jsx)(H,{description:(0,J.jsxs)(J.Fragment,{children:[`Each Codex account keeps its own login (`,(0,J.jsx)(`code`,{children:`CODEX_HOME`}),`). One is picked per chat by the rotation setting.`]}),onRefresh:()=>void n.load(),refreshing:n.loading,actions:(0,J.jsxs)(J.Fragment,{children:[(0,J.jsxs)(b,{size:`sm`,className:`cursor-pointer gap-1.5`,onClick:()=>t(`add`),children:[(0,J.jsx)(l,{className:`size-4`}),` Add account`]}),(0,J.jsxs)(b,{size:`sm`,variant:`outline`,className:`cursor-pointer gap-1.5`,onClick:()=>t(`export`),children:[(0,J.jsx)(u,{className:`size-4`}),` Export`]}),(0,J.jsxs)(b,{size:`sm`,variant:`outline`,className:`cursor-pointer gap-1.5`,onClick:()=>t(`import`),children:[(0,J.jsx)(c,{className:`size-4`}),` Import`]}),(0,J.jsxs)(b,{size:`sm`,variant:`outline`,className:`cursor-pointer gap-1.5`,onClick:()=>t(`rotation`),children:[(0,J.jsx)(a,{className:`size-4`}),` Rotation`]})]})}),(0,J.jsx)(V,{message:n.msg??n.err,onDismiss:()=>{n.setMsg(null),n.setErr(null)}}),(0,J.jsxs)(`section`,{className:`space-y-2`,children:[(0,J.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,J.jsx)(`h3`,{className:`text-sm font-medium`,children:`Codex Accounts`}),(0,J.jsx)(`span`,{className:`text-[10px] text-muted-foreground capitalize`,children:n.strategy.replace(`-`,` `)})]}),n.loading&&n.accounts.length===0?(0,J.jsxs)(`div`,{className:`flex items-center gap-2 py-6 text-xs text-muted-foreground`,children:[(0,J.jsx)(m,{className:`size-4 animate-spin`}),` Loading accounts...`]}):n.accounts.length===0?(0,J.jsxs)(`div`,{className:`flex flex-col items-center gap-2 py-8 text-center`,children:[(0,J.jsx)(f,{className:`size-5 text-muted-foreground`}),(0,J.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No Codex accounts yet.`}),(0,J.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Chats use your default `,(0,J.jsx)(`code`,{children:`~/.codex`}),` login until you add one.`]})]}):(0,J.jsx)(U,{children:n.accounts.map(e=>{let t=n.usages[e.id]??{};return(0,J.jsxs)(he,{dense:!0,className:`min-w-[300px] shrink-0 snap-start${e.signedOut?` opacity-60`:``}`,"data-testid":`account-card`,"data-account-id":e.id,children:[(0,J.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,J.jsx)(`span`,{className:`text-sm font-medium truncate flex-1 min-w-0`,children:e.label}),e.signedOut&&(0,J.jsx)(le,{className:`text-[10px] text-error shrink-0 font-medium`,hint:`Codex rejected this account's login (revoked or expired), so no turn can run on it and it is skipped. The usage shown is the last reading. Click to sign in again — the account keeps its settings and chats.`,onClick:e.type===`chatgpt`?()=>i(e):void 0,children:`Sign in again`}),(0,J.jsx)(`span`,{className:`text-[10px] uppercase tracking-wide text-text-subtle border border-border rounded px-1 shrink-0`,children:e.type}),W(e.planType)&&(0,J.jsx)(`span`,{className:`text-[10px] text-text-subtle shrink-0`,children:W(e.planType)}),(0,J.jsx)(L,{checked:e.status!==`disabled`,onCheckedChange:()=>void n.toggle(e.id,e.status??`active`),disabled:n.toggling.has(e.id),"aria-label":e.status===`disabled`?`Enable account`:`Disable account`,className:`cursor-pointer shrink-0`}),(0,J.jsxs)(A,{children:[(0,J.jsx)(N,{asChild:!0,children:(0,J.jsx)(`button`,{type:`button`,onClick:()=>void n.remove(e.id),"aria-label":`Remove account`,className:`p-2 rounded cursor-pointer text-text-subtle hover:text-error hover:bg-surface-elevated transition-colors shrink-0`,children:(0,J.jsx)(s,{className:`size-4`})})}),(0,J.jsx)(F,{side:`top`,children:`Remove account`})]})]}),(0,J.jsx)(qe,{usage:t}),t.resetCredits&&(0,J.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap text-[10px] text-text-subtle`,children:[(0,J.jsx)(pe,{credits:t.resetCredits}),(0,J.jsx)(ye,{account:e,usage:t,onDone:e=>{n.setMsg(e),n.load()}})]}),t.session==null&&(()=>{let r=_e(t.weekly);return r?(0,J.jsxs)(`div`,{className:`flex min-h-12 items-center justify-between gap-3 rounded-md border px-2.5 py-1.5 ${e.dailyGuardEnabled&&r.blocked?`border-error/40 bg-error/5`:`border-border/50 bg-surface/40`}`,children:[(0,J.jsxs)(`div`,{className:`min-w-0 space-y-0.5`,children:[(0,J.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-medium ${e.dailyGuardEnabled&&r.blocked?`text-error`:`text-text-secondary`}`,children:[(0,J.jsx)(`span`,{children:`Daily guard`}),(0,J.jsxs)(A,{children:[(0,J.jsx)(N,{asChild:!0,children:(0,J.jsx)(`button`,{type:`button`,"aria-label":`About Daily guard`,className:`text-text-subtle hover:text-text-primary cursor-help`,children:(0,J.jsx)(o,{className:`size-3.5`})})}),(0,J.jsx)(F,{side:`top`,className:`max-w-64 text-xs leading-relaxed`,children:`Spreads the weekly quota across five weekdays, adding 20% per weekday. Weekend slots keep the previous cap; unused allowance carries forward. Daily slots start at the reset time and use UTC weekdays. Turn it off any time to use the remaining quota freely.`})]})]}),(0,J.jsx)(`p`,{className:`text-[10px] tabular-nums ${e.dailyGuardEnabled&&r.blocked?`text-error`:`text-text-subtle`}`,children:e.dailyGuardEnabled&&r.blocked?`${Math.round(r.used*100)}% used / ${Math.round(r.cap*100)}% daily cap. New turns paused.`:`Weekday ${r.day}/5, ${Math.round(r.cap*100)}% daily cap`})]}),(0,J.jsxs)(`span`,{className:`hidden`,title:`Weekday ${r.day}/5: hold weekly usage at or below ${Math.round(r.cap*100)}% to last until reset.`,children:[`Daily guard `,e.dailyGuardEnabled?`· Weekday ${r.day}/5 cap ${Math.round(r.cap*100)}%`:``]}),(0,J.jsx)(L,{checked:!!e.dailyGuardEnabled,onCheckedChange:()=>void n.toggleDailyGuard(e.id,!!e.dailyGuardEnabled),disabled:n.toggling.has(e.id),"aria-label":e.dailyGuardEnabled?`Disable Daily guard`:`Enable Daily guard`,className:`cursor-pointer shrink-0`})]}):null})()]},e.id)})})]}),(0,J.jsx)(ve,{open:e===`add`,onOpenChange:e=>{e||n.cancelLogin(),t(e?`add`:null)},label:n.label,onLabelChange:n.setLabel,apiKey:n.apiKey,onApiKeyChange:n.setApiKey,adding:n.adding,onAddApiKey:()=>void n.addApiKey(),deviceWaiting:n.deviceWaiting,onStartDevice:()=>void n.startDevice(),device:n.device,browser:n.browser,onStartBrowser:()=>void n.startBrowser(),loginStarting:n.loginStarting,callbackUrl:n.callbackUrl,onCallbackUrlChange:n.setCallbackUrl,submittingCallback:n.submittingCallback,onSubmitCallback:()=>void n.submitCallback(),error:n.err}),(0,J.jsx)(Ue,{mode:e===`export`?`export`:e===`import`?`import`:null,onOpenChange:e=>{e||t(null)},password:n.backupPassword,onPasswordChange:n.setBackupPassword,busy:n.exporting||n.importing,onExport:()=>void n.doExport(),onImport:e=>void n.doImport(e),error:n.err}),r&&(0,J.jsx)(ge,{account:r,onClose:()=>i(null),onDone:()=>void n.load()}),(0,J.jsx)(Ge,{open:e===`rotation`,onOpenChange:e=>t(e?`rotation`:null),strategy:n.strategy,onChange:e=>void n.changeStrategy(e)})]})}var Ye=[{id:`claude`,label:`Claude`},{id:`codex`,label:`Codex`}];function Xe(){let[e,t]=(0,q.useState)(null),[n,r]=(0,q.useState)(`claude`);(0,q.useEffect)(()=>{let e=!1;return ne().then(n=>{e||t(new Set(Object.keys(n.providers??{})))}).catch(()=>{e||t(new Set([`claude`]))}),()=>{e=!0}},[]);let i=Ye.filter(t=>t.id===`claude`||e?.has(t.id)),a=i.length>1;return(0,J.jsxs)(`div`,{className:`space-y-4`,"data-testid":`accounts-pane`,"data-provider":n,children:[a&&(0,J.jsx)(`div`,{className:`flex gap-1 border-b border-border/50`,children:i.map(e=>(0,J.jsxs)(`button`,{onClick:()=>r(e.id),"data-testid":`accounts-tab-${e.id}`,"aria-current":n===e.id?`page`:void 0,className:`flex items-center gap-1.5 px-3 py-2 text-xs rounded-t transition-colors cursor-pointer ${n===e.id?`text-primary border-b-2 border-primary font-medium`:`text-text-subtle hover:text-text-secondary`}`,children:[(0,J.jsx)(k,{providerId:e.id}),e.label]},e.id))}),e===null&&!a&&(0,J.jsxs)(`div`,{className:`flex items-center gap-2 text-xs text-muted-foreground`,children:[(0,J.jsx)(m,{className:`size-3 animate-spin`}),` Checking configured providers...`]}),n===`claude`?(0,J.jsx)(He,{}):(0,J.jsx)(Je,{})]})}export{Xe as AccountsSettingsSection};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import{Kr as r,gt as i,hr as a,r as o}from"./icons-C1wDt09O.js";import{r as s}from"./api-client-BnYFnEfK.js";import{t as c}from"./open-settings-BGtoVEAU.js";import{t as l}from"./button-BHGVTbam.js";import{t as u}from"./input-CReAuQTF.js";import{Fi as d,Jn as f,Kn as p,Xn as m,Yn as h,Zn as g,jr as _,qn as v,zn as ee}from"./index-Cx9ZRibz.js";import{a as te,b as ne}from"./api-settings-BPIlTiBi.js";import{n as y,t as re}from"./leftover-processes-Bc3fIjkK.js";function b(e){let t=/^claude-([a-z]+)((?:-\d{1,2})+)(?:-\d{8})?$/i.exec(e);if(!t)return e;let n=t[1],r=t[2].slice(1).split(`-`).join(`.`);return`${n[0].toUpperCase()}${n.slice(1)} ${r}`}var x=[`low`,`medium`,`high`,`xhigh`,`max`];function S(e){return typeof e==`string`&&x.includes(e)}function C(e){return x.indexOf(e)}function w(e){if(!e)return null;let t=e.toLowerCase();if(t===`auto`||t===`unset`)return{kind:`auto`};let n=t===`med`?`medium`:t;return S(n)?{kind:`level`,level:n}:Number.isNaN(parseInt(t,10))?null:{kind:`budget`}}function T(e,t){if(!t)return{level:e,reason:null};let n=w(t.env?.value),{observed:r}=t;if(n)return r?{level:r.applied,reason:`env`}:{level:E(n,t),reason:`env`};let i=r&&r.requested===e?r.applied:D(e,t);return i===e?{level:i,reason:null}:{level:i,reason:t.cap&&C(e)>C(t.cap.value)?`cap`:`model`}}function E(e,t){return e.kind===`level`?D(e.level,t):t.cap?e.kind===`budget`?D(`high`,t):t.cap.value===`low`?D(`low`,t):null:null}function D(e,t){if(t.supported?.length===0)return null;let n=t.cap&&C(e)>C(t.cap.value)?t.cap.value:e;return t.supported&&!t.supported.includes(n)&&(n===`xhigh`||n===`max`)?`high`:n}function O(e){if(e.file)return e.file;switch(e.source){case`userSettings`:return`~/.claude/settings.json`;case`projectSettings`:return`.claude/settings.json`;case`localSettings`:return`.claude/settings.local.json`;case`policySettings`:return`managed settings`;case`flagSettings`:return`the settings PPM passes to Claude Code`;case`environment`:return`the environment PPM runs in`}}var k=[{label:`Low`,value:`low`},{label:`Medium`,value:`medium`},{label:`High`,value:`high`,default:!0},{label:`Extra`,value:`xhigh`},{label:`Max`,value:`max`}];function A(e){return e?k.find(t=>t.value===e)?.label??e:``}function j(e,t){let n=A(t);return n?`${e} · ${n}`:e}var M=k.find(e=>e.default).value;function N(e,t){let n=S(e)?e:M;return{pick:n,...T(n,t)}}function P(e){return e.map(e=>typeof e==`string`?e:e.code).join(``)}var F=`Remove it there to use the effort picked in PPM.`;function I(e,t,n){if(!e.reason||!t)return null;let r=t.observed?.model,i=r?b(r.replace(/\[[^\]]*\]$/,``)):n,a=e.level?A(e.level):null,o=w(t.env?.value);if(e.reason===`env`&&t.env&&o){let n=[{code:`CLAUDE_CODE_EFFORT_LEVEL=${t.env.value}`},` in `,{code:O(t.env)}];if(o.kind===`auto`){let e=t.cap?`Claude Code sends ${i}'s default effort, capped at ${A(t.cap.value)}.`:a?`Claude Code sends ${i}'s default, ${a}.`:`no effort is sent, so ${i}'s default applies.`;return{title:`Effort is left to the model`,detail:[...n,` overrides the effort picked here: ${e} `,F]}}if(o.kind===`budget`)return a?{title:`Effort is set to ${a} outside PPM`,detail:[...n,` overrides the effort picked here; with a maxEffortLevel set, Claude Code runs it as ${a}. `,F]}:{title:`A thinking budget replaces the effort`,detail:[...n,` sets a thinking budget instead of an effort level, so the effort picked here is not sent. `,F]};let r=e.level===o.level?``:a?` ${i} runs it as ${a}.`:` ${i} takes no effort level, so none is sent.`;return{title:`Effort is set to ${A(o.level)} outside PPM`,detail:[...n,` overrides the effort picked here.${r} `,F]}}if(e.reason===`cap`&&t.cap){let n=e.level===t.cap.value||!a?``:` ${i} runs it as ${a}.`;return{title:`Effort is capped at ${A(t.cap.value)}`,detail:[{code:`maxEffortLevel: "${t.cap.value}"`},` in `,{code:O(t.cap)},` lowers any effort picked above it.${n}`]}}return a?{title:`Runs at ${a}`,detail:[`${A(e.pick)} isn't available for ${i}, so Claude Code runs it at ${a}.`]}:{title:`${i} takes no effort level`,detail:[`Claude Code sends no effort with ${i}, so the effort picked here has no effect.`]}}var L=e(t(),1),R=n(),z=[128e3,272e3,4e5,512e3,872e3,1e6],B=[1e5,2e5,23e4,35e4,45e4,75e4,9e5];function V({id:e,label:t,value:n,presets:r,disabled:i,compact:a,onChange:o}){let[s,c]=(0,L.useState)(!!n&&!r.includes(Number(n))),l=a?`text-[11px]`:`text-sm`;return(0,R.jsxs)(`div`,{className:`space-y-1`,children:[(0,R.jsx)(_,{htmlFor:e,className:l,children:t}),(0,R.jsxs)(`select`,{id:e,value:s?`custom`:n||`default`,disabled:i,"aria-describedby":`codex-context-help`,className:`w-full min-h-11 sm:min-h-0 rounded-md border border-input bg-background px-3 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:opacity-50 ${a?`h-7`:`h-9`} ${l}`,onChange:e=>{let t=e.target.value;c(t===`custom`),t!==`custom`&&o(t===`default`?``:t)},children:[(0,R.jsx)(`option`,{value:`default`,children:`Codex default`}),r.map(e=>(0,R.jsxs)(`option`,{value:String(e),children:[e===1e6?`1M`:`${e/1e3}K`,` tokens`]},e)),(0,R.jsx)(`option`,{value:`custom`,children:`Custom...`})]}),s&&(0,R.jsx)(u,{id:`${e}-custom`,"aria-label":`Custom ${t.toLowerCase()}`,type:`number`,min:1,step:1,required:!0,value:n,disabled:i,placeholder:`Enter tokens`,"aria-describedby":`codex-context-help`,className:`min-h-11 sm:min-h-0 ${a?`h-7 text-[11px]`:``}`,onChange:e=>o(e.target.value)})]})}function ie({config:e,compact:t,saving:n,onSave:r}){let[i,a]=(0,L.useState)(String(e?.model_context_window??``)),[o,s]=(0,L.useState)(String(e?.model_auto_compact_token_limit??``)),[c,l]=(0,L.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,R.jsxs)(`form`,{onSubmit:f,className:`space-y-2 rounded-md border border-border p-3`,children:[(0,R.jsxs)(`div`,{className:`grid grid-cols-1 gap-3 sm:grid-cols-2`,children:[(0,R.jsx)(V,{id:`codex-context-window`,label:`Context window (tokens)`,value:i,presets:z,disabled:n,compact:t,onChange:e=>{a(e),l(null)}}),(0,R.jsx)(V,{id:`codex-compact-threshold`,label:`Auto-compact threshold (tokens)`,value:o,presets:B,disabled:n,compact:t,onChange:e=>{s(e),l(null)}})]}),(0,R.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,R.jsx)(`p`,{role:`alert`,className:`${u} text-error`,children:c}),(0,R.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,R.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,R.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 ae=[{value:`low`,label:`Low`},{value:`medium`,label:`Medium`},{value:`high`,label:`High`},{value:`xhigh`,label:`Extra`},{value:`max`,label:`Max`}],oe=[{value:`bypassPermissions`,label:`Bypass permissions (default)`},{value:`default`,label:`Ask before edits`},{value:`acceptEdits`,label:`Edit automatically`},{value:`plan`,label:`Plan mode`}],H={claude:`Claude`,cursor:`Cursor`,codex:`Codex`,gemini:`Gemini`};function U({compact:e}={}){let[t,n]=(0,L.useState)(null),[r,x]=(0,L.useState)(``),[S,C]=(0,L.useState)([]),[w,T]=(0,L.useState)(!1),[E,D]=(0,L.useState)(!1),[O,k]=(0,L.useState)(null),[A,j]=(0,L.useState)(0),[M,F]=(0,L.useState)([]),[z,B]=(0,L.useState)(!1);(0,L.useEffect)(()=>{te().then(e=>{n(e),x(e.default_provider??`claude`)}).catch(e=>k(e.message))},[]),(0,L.useEffect)(()=>{r&&s.get(`/api/settings/ai/providers/status`).then(F).catch(()=>F([]))},[r]);let V=M.find(e=>e.id===r&&!e.registered);(0,L.useEffect)(()=>{r&&(T(!0),s.get(`/api/settings/ai/providers/${r}/models`).then(C).catch(()=>C([])).finally(()=>T(!1)))},[r,!V]);let[U,W]=(0,L.useState)(null),G=t?.providers[r]?.model;(0,L.useEffect)(()=>{if(W(null),!r)return;let e=!0,t=G?`?model=${encodeURIComponent(G)}`:``;return s.get(`/api/settings/ai/providers/${r}/effort-status${t}`).then(({status:t})=>{e&&W(t)}).catch(()=>{}),()=>{e=!1}},[r,G]);let ce=async()=>{B(!0);try{let e=await s.post(`/api/settings/ai/providers/${r}/probe`);F(t=>t.map(t=>t.id===e.id?e:t))}catch(e){k(e.message)}finally{B(!1)}},K=t?Object.keys(t.providers).filter(e=>e!==`mock`).map(e=>({id:e,name:H[e]??e})):[],q=t?.providers[r],J=q?.type===`agent-sdk`||!q?.type&&r===`claude`,Y=I(N(q?.effort,U),U,q?.model?b(q.model):`the model`),X=async e=>{if(!t)return!1;D(!0),k(null);try{return n(await ne(e)),j(e=>e+1),!0}catch(e){return k(e.message),!1}finally{D(!1)}},Z=(e,t)=>X({providers:{[r]:{[e]:t}}}),Q=e?`text-[11px]`:`text-sm`,le=e?`text-xs`:`text-sm`,ue=e?`space-y-2`:`space-y-4`,de=e?`space-y-1.5`:`space-y-3`,$=e?`space-y-1`:`space-y-1.5`;if(!t)return(0,R.jsxs)(`div`,{className:de,children:[(0,R.jsx)(`h3`,{className:`${le} font-medium text-text-secondary`,children:`AI Settings`}),(0,R.jsx)(`p`,{className:`${Q} text-text-subtle`,children:O?`Error: ${O}`:`Loading...`})]});let fe=J?S:[{value:`__default__`,label:`Auto (default)`},...S];return(0,R.jsxs)(`div`,{className:ue,children:[(0,R.jsx)(`h3`,{className:`${le} font-medium text-text-secondary`,children:`AI Settings`}),(0,R.jsxs)(`div`,{className:$,children:[(0,R.jsx)(_,{htmlFor:`ai-new-chat-provider`,className:e?Q:void 0,children:`New chat provider`}),(0,R.jsxs)(p,{value:t.new_chat_provider_mode??`default`,disabled:E,onValueChange:e=>X({new_chat_provider_mode:e}),children:[(0,R.jsx)(h,{id:`ai-new-chat-provider`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,R.jsx)(m,{})}),(0,R.jsxs)(v,{children:[(0,R.jsx)(f,{value:`follow-focus`,children:`Follow last focused chat`}),(0,R.jsx)(f,{value:`default`,children:`Always use default provider`})]})]}),(0,R.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,R.jsxs)(`div`,{className:$,children:[(0,R.jsx)(_,{htmlFor:`ai-default-provider`,className:e?Q:void 0,children:`Default provider`}),(0,R.jsxs)(p,{value:t.default_provider,disabled:E,onValueChange:e=>X({default_provider:e}),children:[(0,R.jsx)(h,{id:`ai-default-provider`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,R.jsx)(m,{})}),(0,R.jsx)(v,{children:K.map(e=>(0,R.jsx)(f,{value:e.id,children:e.name},e.id))})]}),t.new_chat_provider_mode===`follow-focus`&&(0,R.jsx)(`p`,{className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:`Used when no chat has been focused in this project yet.`})]}),(0,R.jsxs)(`div`,{className:`flex items-start justify-between gap-3 rounded-md border border-border p-3`,children:[(0,R.jsxs)(`div`,{className:$,children:[(0,R.jsx)(_,{htmlFor:`ai-share-provider-context`,className:e?Q:void 0,children:`Share rules and memory between providers`}),(0,R.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,R.jsx)(g,{id:`ai-share-provider-context`,"aria-describedby":`ai-share-provider-context-description`,checked:t.share_provider_context??!0,disabled:E,onCheckedChange:e=>X({share_provider_context:e})})]}),(0,R.jsxs)(`div`,{className:$,children:[(0,R.jsx)(_,{htmlFor:`ai-leftover-idle`,className:e?Q:void 0,children:`Stop leftover processes after (idle minutes, 0 = log only)`}),(0,R.jsx)(u,{id:`ai-leftover-idle`,type:`number`,min:0,max:re,defaultValue:y(t),"aria-describedby":`ai-leftover-idle-description`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let n=parseInt(e.target.value),r=isNaN(n)?null:Math.min(Number(e.target.max),Math.max(Number(e.target.min),n));e.target.value=String(r??y(t)),r!==null&&X({leftover_processes_idle_minutes:r})}},`leftover-${A}`),(0,R.jsxs)(`p`,{id:`ai-leftover-idle-description`,className:`${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:[`Servers, emulators and other processes a chat's commands started and left running are stopped once the chat has been idle this long, and at once when the chat is deleted. At 0 nothing is stopped: the server log names what `,30,` idle minutes would have stopped. Linux with systemd only.`]})]}),K.length>1&&(0,R.jsx)(`div`,{className:`flex gap-0.5 border-b border-border/50 -mx-1 px-1`,children:K.map(e=>(0,R.jsxs)(`button`,{onClick:()=>x(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,R.jsx)(d,{providerId:e.id}),(0,R.jsx)(`span`,{className:`capitalize`,children:e.name})]},e.id))}),(0,R.jsxs)(`div`,{className:de,children:[V&&(0,R.jsxs)(`div`,{className:`flex items-start gap-2 rounded-md border border-warning/30 bg-warning/5 px-2.5 py-2`,children:[(0,R.jsx)(o,{className:`size-3.5 text-warning shrink-0 mt-0.5`}),(0,R.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1.5`,children:[(0,R.jsxs)(`p`,{className:`${Q} text-text-secondary`,children:[H[r]??r,` is not available in chat — PPM could not start it.`]}),(0,R.jsx)(`p`,{className:`text-[11px] text-muted-foreground break-words`,children:V.reason}),V.nextProbeAt&&(0,R.jsxs)(`p`,{className:`text-[11px] text-text-subtle`,children:[`Checking again at `,new Date(V.nextProbeAt).toLocaleTimeString()]}),(0,R.jsxs)(l,{variant:`outline`,size:`sm`,onClick:ce,disabled:z,className:`gap-1.5 cursor-pointer min-h-11 md:min-h-8`,children:[(0,R.jsx)(a,{className:`size-3.5 ${z?`animate-spin`:``}`}),z?`Checking...`:`Check again`]})]})]}),r===`codex`&&(0,R.jsxs)(`button`,{type:`button`,onClick:()=>c(`accounts`),className:`w-full flex items-center justify-between gap-2 rounded-md border border-border px-2.5 py-2 text-left cursor-pointer hover:bg-surface-elevated transition-colors`,children:[(0,R.jsx)(`span`,{className:`${Q} text-text-secondary`,children:`Codex accounts & login`}),(0,R.jsx)(i,{className:`size-3.5 text-text-subtle shrink-0`})]}),S.length>0&&(0,R.jsxs)(`div`,{className:$,children:[(0,R.jsx)(_,{htmlFor:`ai-model`,className:e?Q:void 0,children:`Model`}),(0,R.jsxs)(p,{value:J?q?.model??S[0]?.value:q?.model||`__default__`,onValueChange:e=>Z(`model`,e===`__default__`?void 0:e),disabled:w,children:[(0,R.jsx)(h,{id:`ai-model`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,R.jsx)(m,{placeholder:w?`Loading models...`:`Select model`})}),(0,R.jsx)(v,{className:`max-h-[300px]`,children:fe.map(e=>(0,R.jsx)(f,{value:e.value,children:e.label},e.value))})]})]}),r===`codex`&&(0,R.jsx)(ie,{config:q,compact:e,saving:E,onSave:e=>X({providers:{codex:e}})},JSON.stringify([q?.model_context_window,q?.model_auto_compact_token_limit])),J&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`div`,{className:$,children:[(0,R.jsx)(_,{htmlFor:`ai-base-url`,className:e?Q:void 0,children:`Base URL`}),(0,R.jsx)(u,{id:`ai-base-url`,type:`url`,defaultValue:q?.base_url??``,placeholder:`https://api.anthropic.com (default)`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{Z(`base_url`,e.target.value.trim()||void 0)}},`baseurl-${r}-${A}`)]}),(0,R.jsxs)(`div`,{className:$,children:[(0,R.jsx)(_,{htmlFor:`ai-api-key`,className:e?Q:void 0,children:`API Key / Token`}),(0,R.jsx)(u,{id:`ai-api-key`,type:`password`,defaultValue:q?.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(`••••`)||Z(`api_key`,t||void 0)}},`apikey-${r}-${A}`),(0,R.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,R.jsxs)(`div`,{className:$,children:[(0,R.jsx)(_,{htmlFor:`ai-effort`,className:e?Q:void 0,children:`Effort`}),(0,R.jsxs)(p,{value:q?.effort??`high`,onValueChange:e=>Z(`effort`,e),children:[(0,R.jsx)(h,{id:`ai-effort`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,R.jsx)(m,{})}),(0,R.jsx)(v,{children:ae.map(e=>(0,R.jsx)(f,{value:e.value,children:e.label},e.value))})]}),Y&&(0,R.jsxs)(`div`,{role:`note`,className:`flex items-start gap-2 rounded-md border border-warning/30 bg-warning/5 px-2.5 py-2`,children:[(0,R.jsx)(o,{className:`size-3.5 text-warning shrink-0 mt-0.5`}),(0,R.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-1`,children:[(0,R.jsx)(`p`,{className:`${Q} text-text-secondary`,children:Y.title}),(0,R.jsx)(`p`,{className:`text-[11px] text-muted-foreground break-words`,children:P(Y.detail)})]})]})]}),(0,R.jsxs)(`div`,{className:$,children:[(0,R.jsx)(_,{htmlFor:`ai-max-turns`,className:e?Q:void 0,children:`Max Turns (up to 1000, 0 = no limit)`}),(0,R.jsx)(u,{id:`ai-max-turns`,type:`number`,min:0,max:1e3,defaultValue:q?.max_turns??100,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseInt(e.target.value),n=isNaN(t)?null:Math.min(Number(e.target.max),Math.max(Number(e.target.min),t));e.target.value=String(n??q?.max_turns??100),n!==null&&Z(`max_turns`,n)}},`turns-${r}-${A}`),(q?.max_turns===0||(q?.max_turns??0)>500)&&(0,R.jsxs)(`p`,{className:`flex items-start gap-1.5 ${e?`text-[9px]`:`text-[11px]`} text-muted-foreground`,children:[(0,R.jsx)(o,{className:`size-3 text-warning shrink-0 mt-px`}),`Every step is a paid model call. With a limit this high, or none, a task left running unattended can go on for hours and run up a large bill.`]})]}),(0,R.jsxs)(`div`,{className:$,children:[(0,R.jsx)(_,{htmlFor:`ai-budget`,className:e?Q:void 0,children:`Max Budget (USD)`}),(0,R.jsx)(u,{id:`ai-budget`,type:`number`,step:.1,min:.01,max:50,defaultValue:q?.max_budget_usd??``,placeholder:`No limit`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseFloat(e.target.value);Z(`max_budget_usd`,isNaN(t)?void 0:t)}},`budget-${r}-${A}`)]}),(0,R.jsxs)(`div`,{className:$,children:[(0,R.jsx)(_,{htmlFor:`ai-thinking`,className:e?Q:void 0,children:`Thinking Budget (tokens)`}),(0,R.jsx)(u,{id:`ai-thinking`,type:`number`,min:0,defaultValue:q?.thinking_budget_tokens??``,placeholder:`Adaptive (model decides)`,className:e?`h-7 text-[11px]`:void 0,onBlur:e=>{let t=parseInt(e.target.value);Z(`thinking_budget_tokens`,isNaN(t)?void 0:t)}},`thinking-${r}-${A}`)]}),(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(_,{htmlFor:`ai-agent-teams`,className:e?Q:void 0,children:`Agent Teams`}),(0,R.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,R.jsx)(g,{id:`ai-agent-teams`,checked:q?.agent_teams??!1,onCheckedChange:e=>Z(`agent_teams`,e)})]}),q?.agent_teams&&(0,R.jsx)(se,{compact:e}),(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(_,{htmlFor:`ai-context-1m`,className:e?Q:void 0,children:`1M Context Window`}),(0,R.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,R.jsx)(g,{id:`ai-context-1m`,checked:q?.context_1m??!1,onCheckedChange:e=>Z(`context_1m`,e)})]}),(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(_,{htmlFor:`ai-inherit-mcp`,className:e?Q:void 0,children:`Inherit Claude Code MCP`}),(0,R.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,R.jsx)(g,{id:`ai-inherit-mcp`,checked:q?.inherit_claude_mcp??!0,onCheckedChange:e=>Z(`inherit_claude_mcp`,e)})]}),(0,R.jsxs)(`div`,{className:$,children:[(0,R.jsx)(_,{className:e?Q:void 0,children:`MCP sign-in`}),(0,R.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,R.jsx)(`div`,{className:`-mx-2`,children:(0,R.jsx)(ee,{showWhenEmpty:!0})})]})]}),(0,R.jsxs)(`div`,{className:$,children:[(0,R.jsx)(_,{htmlFor:`ai-permission-mode`,className:e?Q:void 0,children:`Default Permission Mode`}),(0,R.jsxs)(p,{value:q?.permission_mode??`bypassPermissions`,onValueChange:e=>Z(`permission_mode`,e),children:[(0,R.jsx)(h,{id:`ai-permission-mode`,className:`w-full ${e?`h-7 text-[11px]`:``}`,children:(0,R.jsx)(m,{})}),(0,R.jsx)(v,{children:oe.map(e=>(0,R.jsx)(f,{value:e.value,children:e.label},e.value))})]})]}),(0,R.jsxs)(`div`,{className:$,children:[(0,R.jsx)(_,{htmlFor:`ai-system-prompt`,className:e?Q:void 0,children:`Additional Instructions`}),(0,R.jsx)(`textarea`,{id:`ai-system-prompt`,rows:e?3:4,defaultValue:q?.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=>{Z(`system_prompt`,e.target.value.trim()||void 0)}},`sysprompt-${r}-${A}`)]})]}),E&&(0,R.jsx)(`p`,{className:`text-xs text-text-subtle`,children:`Saving...`}),O&&(0,R.jsx)(`p`,{className:`text-xs text-error`,children:O})]})}function se({compact:e}){let[t,n]=(0,L.useState)([]),[i,o]=(0,L.useState)(!1),[c,l]=(0,L.useState)(null),u=(0,L.useCallback)(async()=>{o(!0);try{n(await s.get(`/api/teams`)??[])}catch{}o(!1)},[]);(0,L.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,R.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,R.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,R.jsxs)(_,{className:e?`text-[11px]`:void 0,children:[`Teams (`,t.length,`)`]}),(0,R.jsx)(`button`,{onClick:u,className:`text-text-subtle hover:text-foreground p-1`,"aria-label":`Refresh teams`,children:(0,R.jsx)(a,{className:`size-3 ${i?`animate-spin`:``}`})})]}),t.map(e=>(0,R.jsxs)(`div`,{className:`flex items-center justify-between p-2 rounded bg-surface-elevated text-xs`,children:[(0,R.jsxs)(`div`,{className:`min-w-0`,children:[(0,R.jsx)(`div`,{className:`font-medium truncate`,children:e.name}),e.description&&(0,R.jsx)(`div`,{className:`text-text-subtle truncate`,children:e.description}),(0,R.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,R.jsxs)(`div`,{className:`flex gap-1 shrink-0 ml-2`,children:[(0,R.jsx)(`button`,{onClick:()=>d(e.name),className:`px-2 py-1 bg-error text-white rounded text-[10px]`,children:`Delete`}),(0,R.jsx)(`button`,{onClick:()=>l(null),className:`px-2 py-1 bg-panel-2 text-text rounded text-[10px]`,children:`Cancel`})]}):(0,R.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,R.jsx)(r,{className:`size-3.5`})})]},e.name))]})}export{I as a,b as c,A as i,k as n,P as o,j as r,N as s,U as t};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{A as r,Et as i,L as a,P as o,_n as s,hr as c,m as l,xn as u}from"./icons-C1wDt09O.js";import{r as d}from"./api-client-BnYFnEfK.js";import"./settings-store-CBJCnE5L.js";import"./portal-container-context-Gepuvxdg.js";import"./project-store-Bs-kiU8m.js";import"./project-framework-store-nuePqBBa.js";import{n as f}from"./use-is-mobile-CL2I7hLf.js";import"./git-repo-store-CESIqItW.js";import{t as p}from"./button-BHGVTbam.js";import{n as m}from"./file-icons-CB0RsVdl.js";import{t as h}from"./mobile-bottom-sheet-M9pZptfh.js";import"./use-visual-viewport-B_GFo6k2.js";import{t as g}from"./start-ellipsis-DfU-W_6j.js";import{t as _}from"./scroll-area-CSmNLlfl.js";import{Dr as ee,Er as te,Or as ne,gr as re,hr as ie,kr as v,li as ae}from"./index-Cx9ZRibz.js";import"./use-monaco-theme-CyoMsYaI.js";import"./use-inline-blame-B9M-hADX.js";import{DiffViewer as y}from"./diff-viewer-nYz43A94.js";var b=e(t(),1),x=`ppm:branch-review`,S=`${x}:recent`,C=20;function w(e,t,n){return`${x}:${e}:${t}:${n}`}function T(e,t){return e[t.path]===t.blob}function E(e,t){let n={...e};return T(e,t)?delete n[t.path]:n[t.path]=t.blob,n}function oe(e,t,n){if(!n)return{};let r={...e};for(let e of t)r[e.path]=e.blob;return r}function se(e,t){return t.reduce((t,n)=>t+(T(e,n)?1:0),0)}function D(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 ce(e){return e.find(e=>!e.binary)??e[0]??null}function le(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&&!T(e,i))return i}return null}function ue(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 O(e,t,n=C){let r=[t,...e.filter(e=>e!==t)];return{recent:r.slice(0,n),evicted:r.slice(n)}}function k(){try{let e=JSON.parse(localStorage.getItem(S)??`[]`);return Array.isArray(e)?e.filter(e=>typeof e==`string`):[]}catch{return[]}}function A(e,t){try{if(Object.keys(t).length===0){localStorage.removeItem(e);let t=k().filter(t=>t!==e);localStorage.setItem(S,JSON.stringify(t));return}localStorage.setItem(e,JSON.stringify(t));let{recent:n,evicted:r}=O(k(),e);for(let e of r)localStorage.removeItem(e);localStorage.setItem(S,JSON.stringify(n))}catch{}}var j=n(),M={M:`text-warning`,A:`text-success`,D:`text-error`,R:`text-primary`,C:`text-accent-2`,T:`text-text-3`};function N(e){let{node:t,depth:n,byPath:i,reviewed:s,selectedPath:c,collapsed:l,onToggleCollapse:u,onSelect:d,onToggleReviewed:f}=e,p=t.file?i.get(t.fullPath):void 0;if(!p){let r=l.has(t.fullPath);return(0,j.jsxs)(j.Fragment,{children:[(0,j.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:()=>u(t.fullPath),children:[r?(0,j.jsx)(a,{className:`size-3 shrink-0`}):(0,j.jsx)(o,{className:`size-3 shrink-0`}),(0,j.jsx)(`span`,{className:`truncate text-text-2`,children:t.name})]}),!r&&t.children.map(t=>(0,j.jsx)(N,{...e,node:t,depth:n+1},t.fullPath))]})}let h=T(s,p),_=c===p.path;return(0,j.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 ${_?`bg-primary/10 border-primary`:`border-transparent`}`,style:{paddingLeft:n*14+6},onClick:()=>d(p.path),"aria-current":_?`true`:void 0,"data-testid":`branch-review-file`,"data-path":p.path,"data-selected":_?`true`:`false`,"data-reviewed":h?`true`:`false`,children:[(0,j.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,j.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,j.jsx)(r,{className:`size-3`})})}),(0,j.jsx)(m,{name:t.name,className:`size-3.5 shrink-0`}),(0,j.jsx)(g,{children:t.name}),(0,j.jsx)(`span`,{className:`shrink-0 font-mono ${M[p.status]}`,children:p.status}),p.binary?(0,j.jsx)(`span`,{className:`shrink-0 text-text-3 italic`,children:`bin`}):(0,j.jsxs)(`span`,{className:`shrink-0 tabular-nums text-[10px]`,children:[(0,j.jsxs)(`span`,{className:`text-success`,children:[`+`,p.additions]}),` `,(0,j.jsxs)(`span`,{className:`text-error`,children:[`-`,p.deletions]})]})]})}function P(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=ae(t),r=f(),[a,o]=(0,b.useState)([]),[m,x]=(0,b.useState)(``),[S,C]=(0,b.useState)(``),[T,O]=(0,b.useState)(null),[k,M]=(0,b.useState)(null),[F,I]=(0,b.useState)({}),[de,L]=(0,b.useState)(new Set),[R,z]=(0,b.useState)(!1),[B,V]=(0,b.useState)(null),[fe,H]=(0,b.useState)(!1);(0,b.useEffect)(()=>{if(!t||!n.repo)return;let e=!1;return d.get(n.gitUrl(`/branches`)).then(t=>{if(e)return;o(t);let n=t.find(e=>e.current)?.name;C(e=>e||n||``),x(e=>e||P(t,n))}).catch(t=>!e&&V(t instanceof Error?t.message:`Could not list branches`)),()=>{e=!0}},[t,n]);let U=(0,b.useRef)(null),W=(0,b.useCallback)(async()=>{if(!t||!n.repo||!m||!S)return;U.current?.abort();let e=new AbortController;U.current=e,z(!0),V(null);try{let t=new URLSearchParams({base:m,head:S}),r=await d.get(n.gitUrl(`/branch-diff?${t}`),{signal:e.signal});if(e.signal.aborted)return;O(r),M(e=>e&&r.files.some(t=>t.path===e)?e:ce(r.files)?.path??null)}catch(t){if(e.signal.aborted)return;O(null),V(t instanceof Error?t.message:`Could not compare these branches`)}finally{e.signal.aborted||z(!1)}},[t,n,m,S]);(0,b.useEffect)(()=>(W(),()=>U.current?.abort()),[W]);let G=t&&m&&S?w(t,m,S):null;(0,b.useEffect)(()=>{L(new Set)},[G]),(0,b.useEffect)(()=>{I(G?ue(G):{})},[G]);let K=T&&T.base===m&&T.head===S?T:null;(0,b.useEffect)(()=>{!G||!K||I(e=>{let t=D(e,K.files);return Object.keys(t).length!==Object.keys(e).length&&A(G,t),t})},[G,K]);let q=(0,b.useCallback)(e=>{I(e),G&&A(G,e)},[G]),J=K?.files??[],Y=(0,b.useMemo)(()=>new Map(J.map(e=>[e.path,e])),[J]),X=(0,b.useMemo)(()=>se(F,J),[F,J]),pe=(0,b.useMemo)(()=>re(ie(J.map(e=>({path:e.path,status:e.status===`T`?`M`:e.status})))),[J]),Z=k?Y.get(k)??null:null,Q=(0,b.useCallback)(()=>{let e=le(F,J,k);e&&(M(e.path),H(!1))},[F,J,k]);if(n.noRepo)return(0,j.jsx)(te,{onReload:n.reload});if(n.needsPick)return(0,j.jsx)(ne,{repos:n.repos,onChoose:n.choose});let $=(0,j.jsx)(_,{className:`h-full`,children:(0,j.jsxs)(`div`,{className:`py-1`,children:[J.length===0&&!R&&(0,j.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,j.jsx)(N,{node:e,depth:0,byPath:Y,reviewed:F,selectedPath:k,collapsed:de,onToggleCollapse:e=>L(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n}),onSelect:e=>{M(e),H(!1)},onToggleReviewed:e=>q(E(F,e))},e.fullPath)),!!K?.omitted&&(0,j.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,j.jsxs)(`div`,{className:`flex flex-col h-full overflow-hidden bg-bg`,children:[n.isNested&&n.repo&&(0,j.jsx)(ee,{repo:n.repo,repos:n.repos,onChoose:n.choose}),(0,j.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1.5 border-b border-border shrink-0 flex-wrap`,children:[(0,j.jsx)(v,{value:m,branches:a,onChange:x,label:`Base branch`,testId:`branch-review-base`,className:`max-w-[38%]`}),(0,j.jsx)(l,{className:`size-3.5 text-text-3 shrink-0`}),(0,j.jsx)(v,{value:S,branches:a,onChange:C,label:`Branch to review`,testId:`branch-review-head`,className:`max-w-[38%]`}),(0,j.jsxs)(`div`,{className:`ml-auto flex items-center gap-2`,children:[(0,j.jsxs)(`span`,{className:`text-xs text-text-2 tabular-nums`,"data-testid":`branch-review-progress`,children:[X,`/`,J.length,` reviewed`]}),(0,j.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(oe(F,J,X!==J.length)),children:(0,j.jsx)(s,{className:`size-3.5`})}),(0,j.jsx)(p,{variant:`ghost`,size:`icon-xs`,title:`Reload`,onClick:()=>void W(),children:(0,j.jsx)(c,{className:R?`animate-spin`:``})})]})]}),B&&(0,j.jsx)(`div`,{className:`px-3 py-1.5 text-xs text-destructive bg-destructive/10 shrink-0`,children:B}),(0,j.jsxs)(`div`,{className:`flex-1 flex min-h-0`,children:[!r&&(0,j.jsx)(`div`,{className:`w-72 shrink-0 border-r border-border flex flex-col min-h-0`,children:$}),(0,j.jsx)(`div`,{className:`flex-1 min-w-0 flex flex-col`,children:Z?(0,j.jsx)(y,{metadata:{filePath:n.projectFile(Z.path),projectName:t,ref1:K?.mergeBase,ref2:K?.headCommit}},`${Z.path}:${K?.mergeBase}:${K?.headCommit}`):(0,j.jsx)(`div`,{className:`flex-1 flex items-center justify-center text-xs text-text-3`,children:R?(0,j.jsx)(u,{className:`size-4 animate-spin`}):`Nothing to review.`})})]}),r&&(0,j.jsxs)(`div`,{className:`flex items-center gap-2 border-t border-border p-2 shrink-0`,children:[(0,j.jsxs)(p,{variant:`secondary`,size:`sm`,className:`flex-1 min-h-11`,onClick:()=>H(!0),children:[(0,j.jsx)(i,{className:`size-4`}),J.length,` files`]}),(0,j.jsx)(p,{variant:`secondary`,size:`sm`,className:`flex-1 min-h-11`,onClick:Q,children:`Next unreviewed`})]}),r&&(0,j.jsx)(h,{open:fe,onClose:()=>H(!1),children:(0,j.jsx)(`div`,{className:`max-h-[70vh] overflow-hidden flex flex-col`,children:$})}),!r&&Z&&(0,j.jsxs)(`div`,{className:`flex items-center gap-2 border-t border-border px-2 py-1 shrink-0`,children:[(0,j.jsx)(g,{children:Z.path}),(0,j.jsx)(p,{variant:`ghost`,size:`xs`,onClick:Q,children:`Next unreviewed`})]})]})}export{F as BranchReviewTab};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import"./icons-C1wDt09O.js";import{t as e}from"./chat-tab-DtSHSfMU.js";import"./api-client-BnYFnEfK.js";import"./settings-store-CBJCnE5L.js";import"./portal-container-context-Gepuvxdg.js";import"./window-store-UcSFgNCI.js";import"./panel-store-Dx2ziBLp.js";import"./project-store-Bs-kiU8m.js";import"./project-framework-store-nuePqBBa.js";import"./session-list-sync-triggers-D9i1FxWd.js";import"./tab-store-B4v2kAEY.js";import"./context-menu-DhKbkI1X.js";import"./chat-preparation-cache-Bzb-T1pm.js";import"./file-store-Bn0vbkCx.js";import"./use-is-mobile-CL2I7hLf.js";import"./settings-categories-BY9n3BRr.js";import"./open-settings-BGtoVEAU.js";import"./onboarding-quick-orientation-DTMrcMf0.js";import"./button-BHGVTbam.js";import"./dialog-DnE192fh.js";import"./file-icons-CB0RsVdl.js";import"./patch-tab-metadata-DTbCkVvx.js";import"./dropdown-menu-CxZR_vuV.js";import"./mobile-bottom-sheet-M9pZptfh.js";import"./use-visual-viewport-B_GFo6k2.js";import"./fs-api-BVIVh_De.js";import"./input-CReAuQTF.js";import"./start-ellipsis-DfU-W_6j.js";import"./ws-auth-k7DWnL9T.js";import"./agent-session-sheet-store-BFUVxjab.js";import"./libesm-C9iw2_pm.js";import"./tool-cards-C2YGSKRm.js";import"./use-blob-url-CIHAdKoN.js";import"./design-canvas-check-DQB9dn_O.js";import"./db-ai-tools-BhRcsCRL.js";import"./use-websocket-DqomrzN8.js";import"./api-settings-BPIlTiBi.js";import"./session-changes-bar-CjSxBYOF.js";import"./onboarding-entry-Cn4k4SG7.js";import"./send-to-chat-B7oUVcgh.js";import"./ai-settings-section-CODZY71V.js";import"./slash-command-picker-qb3fZ7RP.js";import"./codex-reset-credit-button-BKgiUi8E.js";export{e as ChatTab};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import{M as r,N as i,P as a,j as o}from"./vendor-ui-BTSIXzhZ.js";import{A as s,M as c,P as l,li as u,n as d,pt as f,xn as p}from"./icons-C1wDt09O.js";import{k as m,n as h,r as g}from"./api-client-BnYFnEfK.js";import"./settings-store-CBJCnE5L.js";import{n as _}from"./utils-D3xTlJyU.js";import{n as v}from"./portal-container-context-Gepuvxdg.js";import"./window-store-UcSFgNCI.js";import"./panel-store-Dx2ziBLp.js";import"./project-store-Bs-kiU8m.js";import"./project-framework-store-nuePqBBa.js";import"./session-list-sync-triggers-D9i1FxWd.js";import{t as y}from"./tab-store-B4v2kAEY.js";import{n as b}from"./use-is-mobile-CL2I7hLf.js";import"./settings-categories-BY9n3BRr.js";import"./open-settings-BGtoVEAU.js";import"./button-BHGVTbam.js";import"./dialog-DnE192fh.js";import{t as x}from"./file-icons-CB0RsVdl.js";import{t as S}from"./mobile-bottom-sheet-M9pZptfh.js";import"./use-visual-viewport-B_GFo6k2.js";import"./fs-api-BVIVh_De.js";import"./format-file-meta-BOAh9mam.js";import"./input-CReAuQTF.js";import{i as C,r as ee,t as te}from"./use-db-driver-installed-BL1XW_bI.js";import{c as w,d as ne,f as T,h as re,i as ie,l as ae,m as oe,p as se,s as ce,u as le}from"./db-sidebar-reveal-BeT8cp6P.js";import{n as E,r as ue,t as D}from"./db-types-cHkNH-mN.js";import"./scroll-area-CSmNLlfl.js";import{S as de,_ as O,b as k,g as A,h as j,ir as fe,m as M,p as pe,v as N,x as P,y as F}from"./index-Cx9ZRibz.js";var I=e(t(),1),L={postgres:5432,mysql:3306,mariadb:3306},me={postgres:`postgres`,mysql:`root`,mariadb:`root`},he={postgres:`/var/run/postgresql`,mysql:`/run/mysqld/mysqld.sock`,mariadb:`/run/mysqld/mysqld.sock`},R={postgres:`postgres`,mysql:`mysql`,mariadb:`mariadb`},ge={postgres:`postgres`,postgresql:`postgres`,mysql:`mysql`,mariadb:`mariadb`},_e={postgres:[`sslmode`,`ssl`],mysql:[`ssl-mode`,`sslmode`,`sslMode`,`ssl`],mariadb:[`ssl-mode`,`sslmode`,`sslMode`,`ssl`]},ve=/^([A-Za-z][A-Za-z0-9+.-]*):\/\/(.*)$/s;function ye(e){return/^file:/i.test(e)?!0:e.includes(`://`)?!1:/^(~|\/|\.{1,2}[/\\]|[A-Za-z]:[\\/])/.test(e)||/\.(db|sqlite3?|db3)$/i.test(e)}function z(e){try{return decodeURIComponent(e)}catch{return e}}var B=(e=`PPM cannot read this as a URL.`)=>({kind:`error`,error:e});function V(e){let t=String(e??``).trim();if(!t)return{kind:`empty`};if(ye(t))return{kind:`file`,path:t.replace(/^file:(\/\/)?/i,``)};let n=ve.exec(t);if(!n)return B();let r=n[1],i=ge[r.toLowerCase()];if(!i)return B(`${r}:// is not a database PPM supports yet.`);let a=n[2],o=a.indexOf(`#`);o>=0&&(a=a.slice(0,o));let s=``,c=a.indexOf(`?`);c>=0&&(s=a.slice(c+1),a=a.slice(0,c));let l=a.indexOf(`/`),u=l>=0?a.slice(0,l):a,d=l>=0?a.slice(l+1):``,f=u.lastIndexOf(`@`),p=f>=0?u.slice(0,f):``,m=f>=0?u.slice(f+1):u,h=p.indexOf(`:`),g=z(h>=0?p.slice(0,h):p),_=h>=0?z(p.slice(h+1)):``,v=m,y=``;if(m.startsWith(`[`)){let e=m.indexOf(`]`);if(e<0)return B();v=m.slice(1,e);let t=m.slice(e+1);if(t&&!t.startsWith(`:`))return B();y=t.slice(1)}else if(!m.includes(`,`)){let e=m.lastIndexOf(`:`);if(e>=0&&(v=m.slice(0,e),y=m.slice(e+1)),v.includes(`:`))return B(`The server name has a colon in it. An IPv6 address goes in brackets, like [::1]:5432.`)}let b=null;if(y){let e=/^\d{1,5}$/.test(y)?Number(y):NaN;if(!(e>=1&&e<=65535))return B(`The port must be a number from 1 to 65535.`);b=e}v=z(v);let x=``;v.startsWith(`/`)&&(x=v,v=``);let S=_e[i],C=null,ee=[];for(let e of s.split(`&`)){if(!e)continue;let t=e.indexOf(`=`),n=z(t>=0?e.slice(0,t):e),r=t>=0?z(e.slice(t+1)):``,a=i===`postgres`?n===`host`&&r.startsWith(`/`):n===`socket`||n===`socketPath`;if(a&&!x)x=r;else if(a)continue;else !C&&S.includes(n)?C={name:n,value:r}:ee.push([n,r])}return x&&(v=``),{kind:`url`,parts:{type:i,scheme:r,host:v,port:b,socket:x,user:g,password:_,database:z(d.split(`/`)[0]??``),ssl:C,params:ee}}}function H(e){return!e.host&&!e.socket?`The URL has no server name.`:null}function be(e){return encodeURIComponent(e).replace(/%2F/gi,`/`).replace(/%3A/gi,`:`)}function xe(e){return e.includes(`:`)&&!e.includes(`,`)&&!e.startsWith(`[`)?`[${e}]`:e}function U(e,t={}){let n=t.password===!1?``:e.password,r=encodeURIComponent,i=e.user||n?`${r(e.user)}${n?`:${r(n)}`:``}@`:``,a=e.socket?``:`${xe(e.host)}${e.port==null?``:`:${e.port}`}`,o=[];e.socket&&o.push([e.type===`postgres`?`host`:`socket`,e.socket]),e.ssl&&o.push([e.ssl.name,e.ssl.value]),o.push(...e.params);let s=o.length?`?${o.map(([e,t])=>`${be(e)}=${be(t)}`).join(`&`)}`:``;return`${e.scheme}://${i}${a}/${r(e.database)}${s}`}var Se=/^(require|required|verify-ca|verify_ca|verify-full|verify-identity|verify_identity|no-verify|true|1)$/i;function W(e){let t=e.ssl?.value??``,n=Se.test(t);return{useSsl:n,rejectUnauthorized:n&&/^verify/i.test(t)}}function G(e,t,n){let r=W(e);if(r.useSsl===t&&r.rejectUnauthorized===(t&&n))return e;if(!t)return{...e,ssl:null};let i=e.type===`postgres`,a=i?n?`verify-full`:`require`:n?`VERIFY_IDENTITY`:`REQUIRED`;return{...e,ssl:{name:i?`sslmode`:`ssl-mode`,value:a}}}var Ce={postgres:`PostgreSQL`,mysql:`MySQL`,mariadb:`MariaDB`};function K(e){return e.socket?`socket ${e.socket}`:`${e.host||`localhost`}:${e.port??L[e.type]}`}function we(e){let{useSsl:t,rejectUnauthorized:n}=W(e);return[Ce[e.type],K(e),e.user?`user ${e.user}`:null,e.password?`password set`:null,e.database?`database ${e.database}`:`all databases`,t?`SSL${n?`, verified`:``}`:null].filter(Boolean).join(` · `)}var Te=[`general`,`ssh`,`ssl`,`advanced`],Ee={general:`General`,ssh:`SSH Tunnel`,ssl:`SSL`,advanced:`Advanced`};function De(e){return e===`sqlite`?[`general`]:Te}var Oe=[`sshEnabled`,`sshHost`,`sshPort`,`sshBastionHost`,`sshAuth`,`sshUser`,`sshPassword`,`sshKeyFile`,`sshPassphrase`],ke=[`sslCa`,`sslCert`,`sslKey`,`sslKeyPassword`],Ae=[`allowedDatabases`,`allowedDatabasesRegex`,`isolationLevel`,`queryTimeoutSec`];function je(e){return Oe.includes(e)?`ssh`:ke.includes(e)?`ssl`:Ae.includes(e)?`advanced`:`general`}var q=e=>e!==`sqlite`,Me=(e,t)=>e===`postgres`==(t===`postgres`);function J(e){return q(e.type)&&e.entry===`fields`?e.passwordMode:`save`}function Ne(e){return T(J(e))}function Pe(e=`postgres`){return{type:e,entry:`fields`,url:``,connMode:`host`,host:``,port:``,socket:``,user:``,password:``,passwordMode:`save`,database:``,singleDatabase:!0,path:``,readonly:!0,aiAccess:!0,name:``,folder:``,color:null,allowedDatabases:``,allowedDatabasesRegex:``,isolationLevel:``,queryTimeoutSec:``,urlExtras:null,sshEnabled:!1,sshHost:``,sshPort:``,sshBastionHost:``,sshAuth:`password`,sshUser:``,sshPassword:``,sshKeyFile:``,sshPassphrase:``,sslCa:``,sslCert:``,sslKey:``,sslKeyPassword:``}}function Fe(e,t){return{...e,connMode:t.socket?`socket`:`host`,host:t.host,port:t.port==null?``:String(t.port),socket:t.socket,user:t.user,password:t.password,database:t.database,urlExtras:{scheme:t.scheme,ssl:t.ssl,params:t.params}}}function Ie(e,t){let n={...Pe(e.type),name:e.name,folder:e.group_name??``,color:e.color,readonly:e.readonly===1,aiAccess:e.ai_access!==0},r={passwordSaved:!1,savedUrlUnreadable:!1,sshPasswordSaved:!1,sshPassphraseSaved:!1,sslKeyPasswordSaved:!1};if(t.type===`sqlite`)return{values:{...n,path:t.path},...r};let{ssh:i,ssl:a}=t,o={...n,passwordMode:t.passwordMode??`save`,singleDatabase:t.singleDatabase??!0,allowedDatabases:(t.allowedDatabases??[]).join(`
|
|
2
|
-
`),allowedDatabasesRegex:t.allowedDatabasesRegex??``,isolationLevel:t.isolationLevel??``,queryTimeoutSec:t.queryTimeoutSec===void 0?``:String(t.queryTimeoutSec),sshEnabled:i?.enabled??!1,sshHost:i?.host??``,sshPort:i?.port===void 0?``:String(i.port),sshBastionHost:i?.bastionHost??``,sshAuth:i?.auth??`password`,sshUser:i?.user??``,sshKeyFile:i?.keyFile??``,sslCa:a?.ca??``,sslCert:a?.cert??``,sslKey:a?.key??``},s={...r,sshPasswordSaved:!!i?.hasPassword,sshPassphraseSaved:!!i?.hasPassphrase,sslKeyPasswordSaved:!!a?.hasKeyPassword};if(t.connectionString===null)return{values:{...o,entry:`url`,url:``},...s,savedUrlUnreadable:!0};let c=T(t.passwordMode)?`fields`:t.entry??`url`,l={...o,entry:c,url:t.connectionString},u=V(t.connectionString);return{values:u.kind===`url`?Fe(l,u.parts):l,...s,passwordSaved:t.hasPassword}}function Le(e){let t=e.trim();if(!t)return null;let n=/^\d{1,5}$/.test(t)?Number(t):NaN;return n>=1&&n<=65535?null:`A number from 1 to 65535.`}function Re(e){let t=e.type,n=e.connMode===`socket`,r=e.port.trim();return{type:t,scheme:e.urlExtras?.scheme??R[t],host:n?``:e.host.trim()||`localhost`,port:n||!r||Le(r)?null:Number(r),socket:n?e.socket.trim():``,user:e.user.trim()||me[t],password:e.password,database:e.database.trim(),ssl:e.urlExtras?.ssl??null,params:e.urlExtras?.params??[]}}function ze(e){let t=Re(e),n=J(e);return T(n)&&(t.password=``),n===`askUser`&&(t.user=``),t}function Be(e,t,n){return q(e.type)?n.type===e.type||!!t.editing&&Me(n.type,e.type):!1}function Ve(e,t,n){let r=e.type,i=V(e.url),a=`Example: ${R[r]}://user@localhost:${L[r]}/shop`;switch(i.kind){case`empty`:return t.editing?.savedUrlUnreadable?{tone:`plain`,text:`PPM cannot read the saved URL, so it is not shown. It is kept until you enter a new one.`}:n?{tone:`bad`,text:`Enter the database URL.`}:{tone:`plain`,text:`Server, port, login, database and SSL are all read from the URL.`};case`file`:return{tone:`bad`,text:`That is a file path: pick SQLite above to open a file.`};case`error`:return{tone:`bad`,text:`${i.error} ${a}`};case`url`:{if(!Be(e,t,i.parts))return{tone:`bad`,text:`This connection is ${E[r]}; the URL is for ${E[i.parts.type]}.`};let n=H(i.parts);return n?{tone:`bad`,text:`${n} ${a}`}:{tone:`ok`,text:we(i.parts)}}}}function He(e,t,n){let r={...e,url:n};if(t.editing)return r;let i=V(n);return i.kind===`url`&&i.parts.type!==e.type?{...r,type:i.parts.type}:r}function Ue(e,t){if(t===e.type)return e;let n=V(e.url),r=n.kind===`url`&&n.parts.type!==t?``:e.url,i={...e,type:t,url:r,urlExtras:null},{useSsl:a,rejectUnauthorized:o}=W({ssl:e.urlExtras?.ssl??null});return e.entry===`fields`&&a&&q(t)?Ke(i,!0,o):i}var We=e=>e.trim()!==``;function Ge(e,t,n){if(n===e.entry||!q(e.type))return{values:{...e,entry:n}};if(n===`url`){let t=[e.host,e.port,e.socket,e.user,e.password,e.database].some(We)||!!e.urlExtras?.ssl||!!e.urlExtras?.params.length;return{values:{...e,entry:n,url:t?U(Re(e)):``}}}let r=V(e.url);if(r.kind===`empty`)return{values:{...e,entry:n}};let i=Ve(e,t,!0);return r.kind!==`url`||i.tone===`bad`?{problem:{field:`url`,message:i.text}}:{values:{...Fe(e,r.parts),entry:n}}}function Y(e,t){let n=V(e.url);return n.kind===`url`&&Be(e,t,n.parts)&&!H(n.parts)?n.parts:null}function Ke(e,t,n){let r=Re(e),i=G(r,t,n);return i===r?e:{...e,urlExtras:{scheme:r.scheme,ssl:i.ssl,params:r.params}}}function qe(e,t){if(!q(e.type))return null;if(e.entry===`fields`)return W({ssl:e.urlExtras?.ssl??null});let n=Y(e,t);return n?W(n):null}function Je(e,t,n,r){if(!q(e.type))return e;if(e.entry===`fields`)return Ke(e,n,r);let i=Y(e,t);if(!i)return e;let a=G(i,n,r);return a===i?e:{...e,url:U(a)}}function Ye(e,t){return q(e.type)?e.entry===`url`?Y(e,t)?.database??``:e.database.trim():``}function Xe(e,t){if(!q(e.type))return e.path.trim();if(e.entry===`url`){let n=Y(e,t);return n?K(n):``}return K(Re(e))}function Ze(e){return e.trim().split(/[\\/]/).filter(Boolean).pop()??``}function Qe(e,t){if(!q(e.type))return Ze(e.path)||`database.db`;let{host:n,user:r,database:i}={host:e.host.trim(),user:e.user.trim(),database:e.database.trim()},a=e.connMode===`socket`;if(e.entry===`url`){let o=Y(e,t);({host:n,user:r,database:i}=o??{host:``,user:``,database:``}),a=!!o?.socket}J(e)===`askUser`&&(r=``);let o=a?`localhost`:n||`localhost`;return`${i||r||me[e.type]}@${o}`}function $e(e,t){return e.name.trim()||Qe(e,t)}function et(e,t){return t.takenNames.has($e(e,t))}function tt(e){return!Ne(e)}function nt(e){return/^(\/|~$|~[\\/]|[A-Za-z]:[\\/]|\\\\)/.test(e)}function rt(e,t){if(!e.sshEnabled)return null;if(e.entry===`url`?Y(e,t)?.socket:e.connMode===`socket`)return e.entry===`url`?{field:`url`,message:`An SSH tunnel reaches the database by host and port. Put the host in the URL as the SSH server sees it (often localhost), or turn the tunnel off.`}:{field:`socket`,message:`An SSH tunnel reaches the database by host and port. Pick Host and port above, or turn the tunnel off.`};let n=e.sshHost.trim();if(!n)return{field:`sshHost`,message:`Enter the SSH host.`};if(/[\s/@]/.test(n))return{field:`sshHost`,message:`Enter the SSH host's name or address, like ssh.example.com. The login goes in its own field.`};let r=Le(e.sshPort);if(r)return{field:`sshPort`,message:r};let i=e.sshBastionHost.trim();if(i){let e=oe(i);if(`error`in e)return{field:`sshBastionHost`,message:e.error}}if(e.sshAuth===`keyFile`){let t=e.sshKeyFile.trim();if(!t)return{field:`sshKeyFile`,message:`Pick the private key file.`};if(!nt(t))return{field:`sshKeyFile`,message:`Give the key file as a full path on the PPM host, not ${t}.`}}return null}var it=[[`sslCa`,`CA certificate`],[`sslCert`,`certificate`],[`sslKey`,`key file`]];function at(e,t){if(!qe(e,t)?.useSsl)return null;for(let[t,n]of it){let r=e[t].trim();if(r&&!nt(r))return{field:t,message:`Give the ${n} as a full path on the PPM host, not ${r}.`}}return null}function ot(e,t,n){if(!q(e.type)){if(!We(e.path))return{field:`path`,message:`Enter the path of the database file.`}}else if(e.entry===`url`){let n=Ve(e,t,!0);if(n.tone===`bad`)return{field:`url`,message:n.text}}else if(e.connMode===`socket`){if(!We(e.socket))return{field:`socket`,message:`Enter the path of the socket.`}}else{let t=Le(e.port);if(t)return{field:`port`,message:t}}return(q(e.type)?rt(e,t)??at(e,t):null)||(q(e.type)&&ne(e.allowedDatabasesRegex.trim())?{field:`allowedDatabasesRegex`,message:`Not a valid regular expression.`}:q(e.type)&&re(e.queryTimeoutSec.trim())?{field:`queryTimeoutSec`,message:`A whole number of seconds, or empty for no limit.`}:n&&et(e,t)?{field:`name`,message:`Another connection already has this name.`}:null)}function st(e){return e.allowedDatabases.split(`
|
|
3
|
-
`).map(e=>e.trim()).filter(Boolean)}function ct(e){let t={enabled:e.sshEnabled,host:e.sshHost.trim(),port:e.sshPort.trim(),bastionHost:e.sshBastionHost.trim(),auth:e.sshAuth,user:e.sshUser.trim(),keyFile:e.sshKeyFile.trim()};return e.sshAuth===`password`&&e.sshPassword&&(t.password=e.sshPassword),e.sshAuth===`keyFile`&&e.sshPassphrase&&(t.passphrase=e.sshPassphrase),t}function lt(e){let t={ca:e.sslCa.trim(),cert:e.sslCert.trim(),key:e.sslKey.trim()};return e.sslKeyPassword&&(t.keyPassword=e.sslKeyPassword),t}function ut(e,t){if(!q(e.type))return{type:`sqlite`,path:e.path.trim()};let n={type:e.type,entry:e.entry,passwordMode:J(e),allowedDatabases:st(e),allowedDatabasesRegex:e.allowedDatabasesRegex.trim()};e.isolationLevel&&(n.isolationLevel=e.isolationLevel),e.queryTimeoutSec.trim()&&(n.queryTimeoutSec=Number(e.queryTimeoutSec.trim())),Ye(e,t)&&(n.singleDatabase=e.singleDatabase),n.ssh=ct(e),n.ssl=lt(e),e.entry===`url`?t.editing?.savedUrlUnreadable&&!We(e.url)||(n.connectionString=e.url.trim()):n.connectionString=U(ze(e));let r=t.editing;return r&&(r.passwordSaved||r.sshPasswordSaved||r.sshPassphraseSaved||r.sslKeyPasswordSaved)&&(n.keepPassword=!0),n}function dt(e,t){return{type:e.type,connectionConfig:ut(e,t),...t.editing?{connectionId:t.editing.id}:{}}}function ft(e,t){let n=e.folder.trim();return{type:e.type,name:$e(e,t),connectionConfig:ut(e,t),groupName:n||(t.editing?null:void 0),color:e.color??(t.editing?null:void 0),readonly:e.readonly,aiAccess:e.aiAccess&&tt(e)}}function X(e,t,n=!0){if(!q(e.type))return JSON.stringify([`sqlite`,e.path.trim()]);let r;if(e.entry===`url`){let i=Y(e,t);r=i?U(n?i:{...i,database:``}):e.url.trim()}else{let t=ze(e);r=U(n?t:{...t,database:``})}return JSON.stringify([e.type,J(e),r,pt(e),mt(e,t)])}function pt(e){if(!e.sshEnabled)return null;let t=e.sshAuth===`password`?e.sshPassword:e.sshAuth===`keyFile`?[e.sshKeyFile.trim(),e.sshPassphrase]:null;return[e.sshHost.trim(),e.sshPort.trim(),e.sshBastionHost.trim(),e.sshAuth,e.sshUser.trim(),t]}function mt(e,t){return qe(e,t)?.useSsl?[e.sslCa.trim(),e.sslCert.trim(),e.sslKey.trim(),e.sslKeyPassword]:null}function ht(e,t){return se(e,{allowedDatabases:st(t),allowedDatabasesRegex:t.allowedDatabasesRegex.trim()})}var gt=(e,t)=>`${e} ${t}${e===1?``:`s`}`;function _t(e,t,n){let r=`${e.elapsedMs} ms`;if(!q(t.type))return`${e.target} · ${r}`;let i=Ye(t,n),a=i?`database “${i}”`:gt(ht(e.databases,t).length,`database`),o=e.ssh??[],s=o[o.length-1],c=o.length>1?` via ${o.slice(0,-1).map(e=>e.host).join(`, `)}`:``;return`${a} · ${e.target}${s?` through SSH ${s.host}${c}`:``} · ${r}`}function vt(e,t){if(!q(e.type))return null;let n=e.entry===`url`?Y(e,t)?.ssl:e.urlExtras?.ssl;return n?`${n.name}=${n.value}`:null}function yt(e,t,n){if(!q(t.type))return``;let r=e.ssh??[],i=r.map((e,t)=>`${t<r.length-1?`Bastion`:`SSH server`} ${e.host}, host key ${e.fingerprint}${e.firstSeen?` (first connection: PPM trusts this key from now on)`:``}`),a=vt(t,n)??`not set in the URL`,o=e.tls===void 0?``:e.tls?`on (${e.tls}) · `:`off · `;if(i.push(`SSL: ${o}${a}`),qe(t,n)?.useSsl){let e=it.map(([e,n])=>[n,t[e].trim()]).filter(([,e])=>e);e.length&&i.push(`Certificate files: ${e.map(([e,t])=>`${e} ${t}`).join(`, `)}`)}return i.join(`
|
|
4
|
-
`)}function bt(e,t){switch(e){case`connectionString`:return t.entry===`url`?`url`:t.connMode===`socket`?`socket`:`host`;case`path`:case`name`:case`type`:case`passwordMode`:case`allowedDatabases`:case`allowedDatabasesRegex`:case`isolationLevel`:case`queryTimeoutSec`:return e;default:return Oe.includes(e)||ke.includes(e)?e:null}}function xt(e){return T(e)?`Not saved. PPM asks for ${e===`askUser`?`the login and password`:`the password`} when the connection opens, and keeps it in the server's memory until you disconnect or PPM restarts.`:`Encrypted on the PPM host and never sent back to the browser.`}var Z=`ssh`;function St(e){return!(e instanceof h)||e.code!==`DB_LOGIN_REQUIRED`?null:e.body.login??null}function Ct(e,t){let[n,r]=(0,I.useState)(e===null?{kind:`ready`}:{kind:`loading`}),[i,a]=(0,I.useState)(0),[o,s]=(0,I.useState)(()=>Pe()),[c,l]=(0,I.useState)(null),[u,d]=(0,I.useState)([]),[f,p]=(0,I.useState)(`general`),[_,v]=(0,I.useState)(null),[b,x]=(0,I.useState)(null),[S,w]=(0,I.useState)({kind:`idle`}),[ne,T]=(0,I.useState)(!1),[re,ae]=(0,I.useState)(null),[oe,se]=(0,I.useState)(!1),[ce,le]=(0,I.useState)(null),[E,ue]=(0,I.useState)(!1),[D,de]=(0,I.useState)(null),[O,k]=(0,I.useState)(null),A=(0,I.useRef)(null),j=(0,I.useRef)(null),fe=(0,I.useRef)({});(0,I.useEffect)(()=>{let t=!1;return g.get(`/api/db/connections`).then(e=>{t||d(e)}).catch(()=>{}),e!==null&&(r(e=>e.kind===`ready`?e:{kind:`loading`}),Promise.all([g.get(`/api/db/connections/${e}`),g.get(`/api/db/connections/${e}/config`)]).then(([e,n])=>{if(t)return;let{values:i,...a}=Ie(e,n);s(i),l({id:e.id,...a}),r({kind:`ready`}),w(e=>e.kind===`running`&&e.action===`save`?{kind:`idle`}:e)}).catch(e=>{t||r({kind:`failed`,message:e.message})})),()=>{t=!0}},[e,i]);let M=(0,I.useCallback)(()=>{ee().then(de).catch(()=>{})},[]);(0,I.useEffect)(M,[M]),(0,I.useEffect)(()=>()=>A.current?.abort(),[]);let N=(0,I.useMemo)(()=>({editing:c,takenNames:new Set(u.filter(t=>t.id!==e).map(e=>e.name))}),[c,u,e]),P=(0,I.useMemo)(()=>[...new Set(u.map(e=>e.group_name).filter(e=>!!e))].sort((e,t)=>e.localeCompare(t)),[u]),F=(0,I.useCallback)(e=>{s(t=>typeof e==`function`?e(t):{...t,...e}),v(null)},[]),L=X(o,N),he=X(o,N,!1);(0,I.useEffect)(()=>{w(e=>(e.kind===`ok`||e.kind===`failed`)&&e.key!==L?{kind:`idle`}:e)},[L]),(0,I.useEffect)(()=>{k(null)},[o.type,o.sshEnabled]),(0,I.useEffect)(()=>{De(o.type).includes(f)||p(`general`)},[o.type,f]);let R=(0,I.useCallback)(e=>{v(e),p(je(e.field)),x(t=>({field:e.field,n:(t?.n??0)+1}))},[]);(0,I.useEffect)(()=>{b&&fe.current[b.field]?.focus()},[b]);let ge=(0,I.useCallback)(e=>t=>{fe.current[e]=t},[]),_e=e=>{let t=Ge(o,N,e);`problem`in t?R(t.problem):F(t.values)},ve=e=>F(t=>He(t,N,e)),ye=e=>{c||F(t=>Ue(t,e))},z=async(e,t,n)=>{let r=dt(e,t),i=async n=>{let i=await pe({prompt:{...n,connectionId:null,name:$e(e,t)},submit:(e,t)=>g.post(`/api/db/test`,{...r,login:e},{signal:t,dbLogin:!1})});return i&&{result:i.result,login:i.login}};if(Ne(e)){let t=e.passwordMode===`askUser`,n=t?``:e.user.trim()||(e.type===`sqlite`?``:me[e.type]);return i({connectionId:null,name:``,type:e.type,user:n,askUser:t})}try{return{result:await g.post(`/api/db/test`,r,{signal:n,dbLogin:!1}),login:null}}catch(e){let t=St(e);if(!t)throw e;return i(t)}},B=(e,t,n,r)=>{let i=C(e);if(i){j.current=r===`save`?null:r,k(i),w({kind:`idle`}),p(i.id===Z?`ssh`:`general`);return}let a=e instanceof h?bt(e.body?.field,t):null;if(a){w({kind:`idle`}),R({field:a,message:e.message});return}let o=e.message||`The request failed`;w(r===`save`?{kind:`saveFailed`,message:o}:{kind:`failed`,result:{ok:!1,error:o,details:``,elapsedMs:0},key:n})},V=async(e,n,r,i,o=[])=>{let s=ft(e,n),c;try{c=n.editing?await g.put(`/api/db/connections/${n.editing.id}`,s):await g.post(`/api/db/connections`,s)}catch(t){B(t,e,X(e,n),`save`);return}r&&i&&await g.post(`/api/db/connections/${c.id}/login`,i).catch(e=>{m.error(`Saved “${c.name}”, but could not log in`,{description:e.message})});let l=!!n.editing;ie(c,{expand:r,refreshTables:r||!Ne(e)});let u=o.map(e=>`${e.host} (${e.fingerprint})`).join(`, `);if(m.success(r?`${l?`Updated`:`Saved`} and connected “${c.name}”`:`${l?`Updated`:`Saved`} “${c.name}”`,u?{description:`First connection through SSH: PPM now trusts the host key of ${u}.`}:void 0),!t){w({kind:`idle`});return}if(r){y.getState().closeTab(t);return}y.getState().updateTab(t,{title:`Edit ${c.name}`,metadata:{connectionId:c.id,connectionName:c.name,dbType:c.type}}),l&&a(e=>e+1)},H=async e=>{if(S.kind===`running`)return;let t=o,n=N,r=ot(t,n,e===`connect`);if(r){R(r);return}let i=new AbortController;A.current=i;let a=X(t,n),s=Xe(t,n);k(null),T(!1),w(Ne(t)?{kind:`idle`}:{kind:`running`,action:e,target:s});try{let r=await z(t,n,i.signal);if(i.signal.aborted)return;if(!r){w({kind:`idle`});return}let{result:o,login:c}=r;if(o.ok&&ae({key:X(t,n,!1),names:o.databases}),!o.ok){w({kind:`failed`,result:o,key:a});return}let l=(o.ssh??[]).filter(e=>e.firstSeen);if(e===`test`){w({kind:`ok`,result:o,key:a}),l.length&&T(!0);return}w({kind:`running`,action:`connect`,target:s}),await V(t,n,!0,c,l)}catch(n){i.signal.aborted||B(n,t,a,e)}finally{A.current===i&&(A.current=null)}},be=()=>{A.current?.abort(),A.current=null,w({kind:`idle`})},xe=async()=>{if(S.kind===`running`)return;let e=o,t=N,n=ot(e,t,!0);if(n){R(n);return}w({kind:`running`,action:`save`,target:Xe(e,t)}),await V(e,t,!1,null)},U=re?.key===he?ht(re.names,o):null,Se=async()=>{if(oe)return;if(U){ue(!0);return}let e=o,t=N,n=ot(e,t,!1);if(n){R(n);return}let r=X(e,t,!1);se(!0),le(null);let i=new AbortController;try{let n=await z(e,t,i.signal);if(!n)return;n.result.ok?(ae({key:r,names:n.result.databases}),ue(!0)):le({key:r,message:`Could not list the databases: ${n.result.error}`})}catch(e){let t=C(e);if(t){j.current=`list`,k(t),t.id===Z&&p(`ssh`);return}le({key:r,message:`Could not list the databases: ${e.message}`})}finally{se(!1)}},W=D?.find(e=>e.engines.includes(o.type)),G=D?.find(e=>e.id===Z),Ce=(O&&O.id!==Z?O:null)??(W?.state===`missing`?{id:W.id,displayName:W.displayName}:null),K=(O?.id===Z?O:null)??(o.type!==`sqlite`&&o.sshEnabled&&G?.state===`missing`?{id:G.id,displayName:G.displayName}:null),we=(0,I.useRef)({runTest:H,listDatabases:Se});return we.current={runTest:H,listDatabases:Se},te(e=>{if(Ce?.id!==e&&K?.id!==e)return;let t=O?.id===e,n=t?j.current:null;t&&(j.current=null,k(null)),de(t=>t?.map(t=>t.id===e?{...t,state:`installed`}:t)??t),M(),n===`list`?we.current.listDatabases():n&&we.current.runTest(n)}),{load:n,reload:()=>a(e=>e+1),values:o,update:F,ctx:N,editing:c,folders:P,tab:f,setTab:p,problem:_,register:ge,setEntry:_e,setUrl:ve,setType:ye,run:S,detailsOpen:ne,toggleDetails:()=>T(e=>!e),test:()=>S.kind===`running`&&S.action===`test`?be():void H(`test`),connect:()=>void H(`connect`),save:()=>void xe(),databases:U,dbBusy:oe,dbError:ce?.key===he?ce.message:null,dbMenuOpen:E,setDbMenuOpen:ue,listDatabases:()=>void Se(),missingDriver:Ce,missingSshDriver:K}}var Q=n(),wt=[`#ef4444`,`#f97316`,`#eab308`,`#22c55e`,`#06b6d4`,`#3b82f6`,`#8b5cf6`,`#ec4899`,`#6b7280`,`#000000`];function Tt({value:e,onChange:t,labelId:n}){let r=e&&!wt.includes(e)?[e]:[],i=[null,...wt,...r],a=e,o=(e,n)=>{let r=e.key===`ArrowRight`||e.key===`ArrowDown`?1:e.key===`ArrowLeft`||e.key===`ArrowUp`?-1:0;if(!r)return;e.preventDefault();let a=i[(i.indexOf(n)+r+i.length)%i.length];t(a),(e.currentTarget.parentElement?.querySelector(`[data-color="${a??``}"]`))?.focus()};return(0,Q.jsx)(`div`,{role:`radiogroup`,"aria-labelledby":n,className:`flex flex-wrap items-center gap-2 min-h-[30px]`,children:i.map(e=>{let n=e===a,r=e??`No color`;return(0,Q.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":n,"aria-label":r,title:r,tabIndex:n?0:-1,"data-color":e??``,onClick:()=>t(e),onKeyDown:t=>o(t,e),className:_(`grid place-items-center size-11 md:size-[22px] rounded-full`,e?`shadow-[inset_0_0_0_1px_color-mix(in_srgb,var(--color-text)_18%,transparent)]`:`border-[1.5px] border-dashed border-text-subtle text-text-subtle`,n&&`ring-2 ring-text-2 ring-offset-2 ring-offset-background`),style:e?{backgroundColor:e}:void 0,children:!e&&(0,Q.jsx)(u,{className:`size-4 md:size-3`})},r)})})}var Et={postgres:`Server · port ${L.postgres}`,mysql:`Server · port ${L.mysql}`,mariadb:`Server · port ${L.mariadb}`,sqlite:`A file, no server`};function Dt({value:e,locked:t,onPick:n,labelId:r}){let i=(0,I.useRef)({}),a=(e,r)=>{let a=e.key===`ArrowRight`||e.key===`ArrowDown`?1:e.key===`ArrowLeft`||e.key===`ArrowUp`?-1:0;if(!a||t)return;e.preventDefault();let o=D[(D.indexOf(r)+a+D.length)%D.length];n(o),i.current[o]?.focus()};return(0,Q.jsx)(`div`,{role:`radiogroup`,"aria-labelledby":r,className:`grid grid-cols-2 gap-2 @[700px]:grid-cols-4`,children:D.map(r=>{let o=r===e;return(0,Q.jsxs)(`button`,{ref:e=>{i.current[r]=e},type:`button`,role:`radio`,"aria-checked":o,"aria-disabled":t||void 0,tabIndex:o?0:-1,"data-engine":r,onClick:()=>{t||n(r)},onKeyDown:e=>a(e,r),className:_(`flex min-h-14 md:min-h-12 items-center gap-2 md:gap-2.5 rounded-lg border px-2.5 md:px-3 py-2 text-left transition-colors`,o?`border-primary bg-accent-wash shadow-[inset_0_0_0_1px_var(--color-primary)]`:`border-border bg-surface`,t?`cursor-default`:`can-hover:hover:border-primary/60`,t&&!o&&`opacity-45`),children:[(0,Q.jsx)(x,{type:r,className:`size-[26px]`}),(0,Q.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,Q.jsx)(`b`,{className:`block text-[13.5px] md:text-[12.5px] font-semibold text-text-primary`,children:E[r]}),(0,Q.jsx)(`small`,{className:`block truncate text-[11.5px] md:text-[11px] text-text-subtle`,children:Et[r]})]}),(0,Q.jsx)(c,{className:_(`hidden md:block size-3.5 shrink-0 text-primary`,!o&&`invisible`)})]},r)})})}var Ot=(0,I.forwardRef)(function({id:e,value:t,onChange:n,onKeyDown:s,invalid:c,databases:u,busy:d,open:m,onOpenChange:h,onRequestList:g,subtitle:y},x){let C=b(),ee=v(),te=e=>{n(e),h(!1)},w=(0,Q.jsxs)(`div`,{className:`flex min-w-0`,children:[(0,Q.jsx)(`input`,{ref:x,id:e,value:t,onChange:e=>n(e.target.value),onKeyDown:s,placeholder:`(not selected - optional)`,autoComplete:`off`,autoCapitalize:`off`,spellCheck:!1,"aria-invalid":c||void 0,className:_(de,`font-mono rounded-r-none`)}),(0,Q.jsx)(`button`,{type:`button`,onClick:g,disabled:d,"aria-label":`List the server's databases`,title:`List the server's databases`,"aria-haspopup":`listbox`,"aria-expanded":m,className:`grid place-items-center shrink-0 size-11 md:h-[30px] md:w-8 rounded-r-md border border-l-0 border-border bg-surface text-text-2 can-hover:hover:text-text-primary disabled:opacity-60`,children:d?(0,Q.jsx)(p,{className:`size-4 animate-spin`}):(0,Q.jsx)(l,{className:`size-4`})})]}),ne=u&&(0,Q.jsxs)(`div`,{role:`listbox`,"aria-label":`Default database`,className:`min-h-0 flex-1 overflow-y-auto py-1`,children:[(0,Q.jsx)(kt,{label:`(not selected)`,picked:!t.trim(),mobile:C,onPick:()=>te(``)}),u.map(e=>(0,Q.jsx)(kt,{label:e,mono:!0,picked:t.trim()===e,mobile:C,onPick:()=>te(e)},e))]}),T=(0,Q.jsxs)(`div`,{className:`flex items-center gap-2 border-b border-border-soft px-3 py-2 shrink-0`,children:[(0,Q.jsx)(f,{className:`size-4 shrink-0 text-text-subtle`}),(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`div`,{className:`text-[13px] md:text-xs font-medium text-text-primary`,children:`Default database`}),(0,Q.jsx)(`div`,{className:`truncate text-[12px] md:text-[11px] text-text-subtle`,children:y})]})]});return C?(0,Q.jsxs)(Q.Fragment,{children:[w,(0,Q.jsxs)(S,{open:m&&!!u,onClose:()=>h(!1),className:`popover-solid flex max-h-[80dvh] flex-col`,children:[T,ne]})]}):(0,Q.jsxs)(a,{open:m&&!!u,onOpenChange:h,children:[(0,Q.jsx)(o,{asChild:!0,children:w}),(0,Q.jsx)(i,{container:ee,children:(0,Q.jsxs)(r,{align:`start`,sideOffset:4,collisionPadding:8,onOpenAutoFocus:e=>e.preventDefault(),className:`popover-solid z-50 flex w-[var(--radix-popover-trigger-width)] min-w-64 flex-col overflow-hidden rounded-md border border-border text-popover-foreground shadow-lg max-h-[min(20rem,var(--radix-popover-content-available-height))]`,children:[T,ne]})})]})});function kt({label:e,mono:t,picked:n,mobile:r,onPick:i}){return(0,Q.jsxs)(`button`,{type:`button`,role:`option`,"aria-selected":n,onClick:i,className:_(`flex w-full items-center gap-2 px-3 text-left text-sm text-text-2 can-hover:hover:bg-surface-hover can-hover:hover:text-text-primary`,r?`min-h-11 py-2`:`py-1`,t&&`font-mono`),children:[(0,Q.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:e}),n&&(0,Q.jsx)(s,{className:`size-3.5 shrink-0 text-primary`})]})}var At={save:`Save and encrypt`,askPassword:`Don't save, ask for password`,askUser:`Don't save, ask for login and password`};function $(e){return t=>{t.key===`Enter`&&!t.nativeEvent.isComposing&&(t.preventDefault(),e.connect())}}function jt({form:e}){let{values:t,update:n,ctx:r,editing:i,problem:a,register:o}=e,s=$(e),c=e=>a?.field===e?a.message:null,l=t.type===`sqlite`?null:t.type,u=!!l&&t.entry===`url`,d=t.passwordMode,f=d!==`save`,p=Ye(t,r),m=et(t,r),h=tt(t),g=`grid grid-cols-1 gap-3 @[560px]:grid-cols-6`;return(0,Q.jsxs)(`div`,{className:`grid content-start gap-4 md:gap-[18px]`,children:[(0,Q.jsx)(j,{label:`Connection type`,labelId:`cf-type-label`,error:c(`type`),help:i?`A saved connection keeps its type.`:null,children:(0,Q.jsx)(Dt,{value:t.type,locked:!!i,onPick:e.setType,labelId:`cf-type-label`})}),e.missingDriver&&(0,Q.jsx)(fe,{driver:e.missingDriver}),l&&(0,Q.jsxs)(`div`,{role:`radiogroup`,"aria-label":`How to enter the connection`,className:`flex flex-col md:flex-row md:flex-wrap md:gap-x-[22px] md:gap-y-1.5`,children:[(0,Q.jsx)(F,{name:`cf-entry`,value:`fields`,checked:t.entry===`fields`,onChange:()=>e.setEntry(`fields`),children:`Fill database connection details`}),(0,Q.jsx)(F,{name:`cf-entry`,value:`url`,checked:t.entry===`url`,onChange:()=>e.setEntry(`url`),children:`Use database URL`})]}),l&&u&&(0,Q.jsx)(j,{label:`Database URL`,htmlFor:`cf-url`,help:c(`url`)?null:Ve(t,r,!1),error:c(`url`),children:(0,Q.jsx)(P,{id:`cf-url`,ref:o(`url`),mono:!0,value:t.url,invalid:!!c(`url`),onChange:t=>e.setUrl(t.target.value),onKeyDown:s,placeholder:`e.g. ${R[l]}://user:password@localhost:${L[l]}/shop`})}),l&&!u&&(0,Q.jsxs)(`div`,{className:g,children:[(0,Q.jsx)(j,{label:`Connection mode`,htmlFor:`cf-connmode`,className:`@[560px]:col-span-6`,children:(0,Q.jsxs)(k,{id:`cf-connmode`,value:t.connMode,onChange:e=>n({connMode:e.target.value}),children:[(0,Q.jsx)(`option`,{value:`host`,children:`Host and port`}),(0,Q.jsx)(`option`,{value:`socket`,children:`Socket`})]})}),t.connMode===`host`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(j,{label:`Server`,htmlFor:`cf-host`,className:`@[560px]:col-span-4`,error:c(`host`),help:t.sshEnabled?`As the SSH server sees it: often localhost.`:`Reached from the PPM host, not from this browser.`,children:(0,Q.jsx)(P,{id:`cf-host`,ref:o(`host`),mono:!0,value:t.host,invalid:!!c(`host`),placeholder:`localhost`,onChange:e=>n({host:e.target.value}),onKeyDown:s})}),(0,Q.jsx)(j,{label:`Port`,htmlFor:`cf-port`,className:`@[560px]:col-span-2`,error:c(`port`),children:(0,Q.jsx)(P,{id:`cf-port`,ref:o(`port`),mono:!0,inputMode:`numeric`,value:t.port,invalid:!!c(`port`),placeholder:String(L[l]),onChange:e=>n({port:e.target.value}),onKeyDown:s})})]}):(0,Q.jsx)(j,{label:`Socket path`,htmlFor:`cf-socket`,className:`@[560px]:col-span-6`,error:c(`socket`),help:`A Unix socket on the PPM host.`,children:(0,Q.jsx)(P,{id:`cf-socket`,ref:o(`socket`),mono:!0,value:t.socket,invalid:!!c(`socket`),placeholder:he[l],onChange:e=>n({socket:e.target.value}),onKeyDown:s})}),d!==`askUser`&&(0,Q.jsx)(j,{label:`User`,htmlFor:`cf-user`,className:d===`save`?`@[560px]:col-span-3`:`@[560px]:col-span-6`,children:(0,Q.jsx)(P,{id:`cf-user`,ref:o(`user`),mono:!0,value:t.user,placeholder:me[l],onChange:e=>n({user:e.target.value}),onKeyDown:s})}),!f&&(0,Q.jsx)(j,{label:`Password`,htmlFor:`cf-password`,className:`@[560px]:col-span-3`,children:(0,Q.jsx)(O,{id:`cf-password`,ref:o(`password`),value:t.password,placeholder:i?.passwordSaved?`Saved on the PPM host`:``,onChange:e=>n({password:e.target.value}),onKeyDown:s})}),(0,Q.jsx)(j,{label:`Password mode`,htmlFor:`cf-passmode`,className:`@[560px]:col-span-6`,error:c(`passwordMode`),help:xt(d),children:(0,Q.jsx)(k,{id:`cf-passmode`,ref:o(`passwordMode`),value:d,onChange:e=>n({passwordMode:e.target.value}),children:ae.map(e=>(0,Q.jsx)(`option`,{value:e,children:At[e]},e))})})]}),!l&&(0,Q.jsx)(j,{label:`Database file`,htmlFor:`cf-path`,error:c(`path`),help:`A path on the PPM host. The file is opened in place, never uploaded.`,children:(0,Q.jsx)(N,{id:`cf-path`,ref:o(`path`),value:t.path,invalid:!!c(`path`),placeholder:`~/data/app.db`,onChange:e=>n({path:e.target.value}),onKeyDown:s,accept:[`.db`,`.sqlite`,`.sqlite3`,`.db3`],pickerTitle:`Choose a SQLite database`,onPick:e=>n({path:e})})}),(0,Q.jsxs)(`div`,{className:`grid gap-1 md:gap-3`,children:[(0,Q.jsx)(M,{id:`cf-readonly`,checked:t.readonly,onChange:e=>n({readonly:e}),title:`Is read only`,help:(0,Q.jsxs)(Q.Fragment,{children:[`Blocks writes inside the database, including SQL the AI runs.`,ue(t.type)===`postgres`&&` For a hard guarantee — even pg_terminate_backend() — connect as a user with only SELECT rights.`]})}),(0,Q.jsx)(M,{id:`cf-ai`,checked:t.aiAccess&&h,disabled:!h,onChange:e=>n({aiAccess:e}),title:`Available to the AI chat`,help:h?`The AI can see this connection and run SQL on it.`:`Not while PPM asks for the password: the AI's commands run on their own, with nobody to ask.`})]}),l&&(0,Q.jsxs)(`div`,{className:g,children:[!u&&(0,Q.jsx)(j,{label:`Default database`,htmlFor:`cf-database`,className:`@[560px]:col-span-6`,help:e.dbError?{tone:`bad`,text:e.dbError}:p?`Opened when you connect.`:`Leave it empty to browse every database on the server.`,children:(0,Q.jsx)(Ot,{id:`cf-database`,ref:o(`database`),value:t.database,onChange:e=>n({database:e}),onKeyDown:s,databases:e.databases,busy:e.dbBusy,open:e.dbMenuOpen,onOpenChange:e.setDbMenuOpen,onRequestList:e.listDatabases,subtitle:`${e.databases?.length??0} database${e.databases?.length===1?``:`s`} on ${Xe(t,r)}`})}),p&&(0,Q.jsx)(M,{id:`cf-single`,className:`@[560px]:col-span-6`,checked:t.singleDatabase,onChange:e=>n({singleDatabase:e}),title:`Use only database “${p}”`,help:`The tree shows this database alone, not the server's list.`})]}),(0,Q.jsxs)(`div`,{className:g,children:[(0,Q.jsx)(j,{label:`Display name`,htmlFor:`cf-name`,className:`@[560px]:col-span-4`,error:m?`Another connection already has this name.`:c(`name`),children:(0,Q.jsx)(P,{id:`cf-name`,ref:o(`name`),value:t.name,invalid:m||!!c(`name`),placeholder:Qe(t,r),onChange:e=>n({name:e.target.value}),onKeyDown:s})}),(0,Q.jsxs)(j,{label:`Folder`,htmlFor:`cf-folder`,className:`@[560px]:col-span-2`,children:[(0,Q.jsx)(P,{id:`cf-folder`,list:`cf-folders`,value:t.folder,placeholder:`No folder`,onChange:e=>n({folder:e.target.value}),onKeyDown:s}),(0,Q.jsx)(`datalist`,{id:`cf-folders`,children:e.folders.map(e=>(0,Q.jsx)(`option`,{value:e},e))})]}),(0,Q.jsx)(j,{label:`Color`,labelId:`cf-color-label`,className:`@[560px]:col-span-6`,children:(0,Q.jsx)(Tt,{value:t.color,onChange:e=>n({color:e}),labelId:`cf-color-label`})})]})]})}var Mt={password:`Username & password`,agent:`SSH agent`,keyFile:`Key file`},Nt=`m-0 min-w-0 border-0 p-0 [&:disabled_label]:text-text-subtle`;function Pt({form:e}){let{values:t,update:n,editing:r,problem:i,register:a}=e,[o,s]=(0,I.useState)(null),l=$(e),u=e=>i?.field===e?i.message:null,f=t.sshEnabled,p=t.sshAuth;return(0,I.useEffect)(()=>{let e=!1;return g.get(`/api/db/ssh/agent`).then(t=>{e||s(t)}).catch(()=>{}),()=>{e=!0}},[p===`agent`]),(0,Q.jsxs)(`div`,{className:`grid content-start gap-4 md:gap-[18px]`,children:[(0,Q.jsx)(M,{id:`cf-ssh`,checked:f,onChange:e=>n({sshEnabled:e}),title:`Use SSH tunnel`,help:`PPM opens the tunnel from its host, then connects through it.`}),e.missingSshDriver&&(0,Q.jsx)(fe,{driver:e.missingSshDriver}),(0,Q.jsxs)(`fieldset`,{disabled:!f,className:_(Nt,`grid grid-cols-1 gap-3 @[560px]:grid-cols-6`),children:[(0,Q.jsx)(j,{label:`Host`,htmlFor:`cf-ssh-host`,className:`@[560px]:col-span-4`,error:u(`sshHost`),help:`The server on General is then as this host sees it: often localhost.`,children:(0,Q.jsx)(P,{id:`cf-ssh-host`,ref:a(`sshHost`),mono:!0,value:t.sshHost,invalid:!!u(`sshHost`),placeholder:`ssh.example.com`,onChange:e=>n({sshHost:e.target.value}),onKeyDown:l})}),(0,Q.jsx)(j,{label:`Port`,htmlFor:`cf-ssh-port`,className:`@[560px]:col-span-2`,error:u(`sshPort`),children:(0,Q.jsx)(P,{id:`cf-ssh-port`,ref:a(`sshPort`),mono:!0,inputMode:`numeric`,value:t.sshPort,invalid:!!u(`sshPort`),placeholder:`22`,onChange:e=>n({sshPort:e.target.value}),onKeyDown:l})}),(0,Q.jsx)(j,{label:`Bastion host (Jump host)`,htmlFor:`cf-ssh-jump`,optional:!0,className:`@[560px]:col-span-6`,error:u(`sshBastionHost`),help:`Reached first, with the same login, as ssh -J does.`,children:(0,Q.jsx)(P,{id:`cf-ssh-jump`,ref:a(`sshBastionHost`),mono:!0,value:t.sshBastionHost,invalid:!!u(`sshBastionHost`),placeholder:`user@jump.example.com`,onChange:e=>n({sshBastionHost:e.target.value}),onKeyDown:l})}),(0,Q.jsx)(j,{label:`SSH Authentication`,htmlFor:`cf-ssh-auth`,className:`@[560px]:col-span-6`,children:(0,Q.jsx)(k,{id:`cf-ssh-auth`,ref:a(`sshAuth`),value:p,onChange:e=>n({sshAuth:e.target.value}),children:le.map(e=>(0,Q.jsx)(`option`,{value:e,children:Mt[e]},e))})}),(0,Q.jsx)(j,{label:`Login`,htmlFor:`cf-ssh-login`,className:p===`password`?`@[560px]:col-span-3`:`@[560px]:col-span-6`,children:(0,Q.jsx)(P,{id:`cf-ssh-login`,ref:a(`sshUser`),mono:!0,value:t.sshUser,placeholder:o?.user??``,onChange:e=>n({sshUser:e.target.value}),onKeyDown:l})}),p===`password`&&(0,Q.jsx)(j,{label:`Password`,htmlFor:`cf-ssh-pass`,className:`@[560px]:col-span-3`,children:(0,Q.jsx)(O,{id:`cf-ssh-pass`,ref:a(`sshPassword`),value:t.sshPassword,placeholder:r?.sshPasswordSaved?`Saved on the PPM host`:``,onChange:e=>n({sshPassword:e.target.value}),onKeyDown:l})}),p===`keyFile`&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(j,{label:`Private key file`,htmlFor:`cf-ssh-key`,className:`@[560px]:col-span-3`,error:u(`sshKeyFile`),children:(0,Q.jsx)(N,{id:`cf-ssh-key`,ref:a(`sshKeyFile`),value:t.sshKeyFile,invalid:!!u(`sshKeyFile`),placeholder:`~/.ssh/id_ed25519`,onChange:e=>n({sshKeyFile:e.target.value}),onKeyDown:l,pickerTitle:`Choose the private key file`,pickerRoot:`~/.ssh`,onPick:e=>n({sshKeyFile:e})})}),(0,Q.jsx)(j,{label:`Key file passphrase`,htmlFor:`cf-ssh-keypass`,optional:!0,className:`@[560px]:col-span-3`,children:(0,Q.jsx)(O,{id:`cf-ssh-keypass`,ref:a(`sshPassphrase`),value:t.sshPassphrase,placeholder:r?.sshPassphraseSaved?`Saved on the PPM host`:``,onChange:e=>n({sshPassphrase:e.target.value}),onKeyDown:l})})]}),p===`agent`&&o&&(0,Q.jsxs)(`div`,{"data-testid":`db-ssh-agent`,"data-found":o.found,className:`@[560px]:col-span-6 flex items-start gap-2 text-[13px] md:text-[12.5px]`,children:[o.found?(0,Q.jsx)(c,{className:`mt-px size-4 shrink-0 text-success`}):(0,Q.jsx)(d,{className:`mt-px size-4 shrink-0 text-warning`}),(0,Q.jsxs)(`span`,{className:`min-w-0 break-words`,title:o.socket??void 0,children:[o.found?`SSH agent found on the PPM host`:`No SSH agent found on the PPM host.`,!o.found&&(0,Q.jsx)(`small`,{className:`block text-[12.5px] md:text-[11.5px] text-text-subtle`,children:`Start one there and add your key (ssh-add), or pick Key file.`})]})]})]})]})}function Ft({form:e}){let{values:t,update:n,ctx:r,editing:i,problem:a,register:o}=e,s=$(e),c=e=>a?.field===e?a.message:null,l=qe(t,r),u=!!l?.useSsl,d=vt(t,r),f=(e,t)=>n(n=>Je(n,r,e,t));return(0,Q.jsxs)(`div`,{className:`grid content-start gap-4 md:gap-[18px]`,children:[(0,Q.jsx)(M,{id:`cf-ssl`,checked:u,disabled:!l,onChange:e=>f(e,l?.rejectUnauthorized??!1),title:`Use SSL`,help:l?`The certificate files below are read on the PPM host.`:`Enter a URL PPM can read on General first: SSL is set in it.`}),(0,Q.jsxs)(`fieldset`,{disabled:!u,className:_(Nt,`grid grid-cols-1 gap-3`),children:[(0,Q.jsx)(j,{label:`CA Cert`,htmlFor:`cf-ssl-ca`,optional:!0,error:c(`sslCa`),children:(0,Q.jsx)(N,{id:`cf-ssl-ca`,ref:o(`sslCa`),value:t.sslCa,invalid:!!c(`sslCa`),placeholder:`~/certs/ca.pem`,onChange:e=>n({sslCa:e.target.value}),onKeyDown:s,pickerTitle:`Choose the CA certificate`,onPick:e=>n({sslCa:e})})}),(0,Q.jsx)(j,{label:`Certificate`,htmlFor:`cf-ssl-cert`,optional:!0,error:c(`sslCert`),children:(0,Q.jsx)(N,{id:`cf-ssl-cert`,ref:o(`sslCert`),value:t.sslCert,invalid:!!c(`sslCert`),placeholder:`~/certs/client.crt`,onChange:e=>n({sslCert:e.target.value}),onKeyDown:s,pickerTitle:`Choose the client certificate`,onPick:e=>n({sslCert:e})})}),(0,Q.jsx)(j,{label:`Certificate key file password`,htmlFor:`cf-ssl-certpass`,optional:!0,children:(0,Q.jsx)(O,{id:`cf-ssl-certpass`,ref:o(`sslKeyPassword`),value:t.sslKeyPassword,placeholder:i?.sslKeyPasswordSaved?`Saved on the PPM host`:``,onChange:e=>n({sslKeyPassword:e.target.value}),onKeyDown:s})}),(0,Q.jsx)(j,{label:`Key file`,htmlFor:`cf-ssl-key`,optional:!0,error:c(`sslKey`),children:(0,Q.jsx)(N,{id:`cf-ssl-key`,ref:o(`sslKey`),value:t.sslKey,invalid:!!c(`sslKey`),placeholder:`~/certs/client.key`,onChange:e=>n({sslKey:e.target.value}),onKeyDown:s,pickerTitle:`Choose the client key file`,onPick:e=>n({sslKey:e})})}),(0,Q.jsx)(M,{id:`cf-ssl-reject`,checked:u&&!!l?.rejectUnauthorized,disabled:!u,onChange:e=>f(!0,e),title:`Reject unauthorized`,help:`Refuse a certificate that no trusted CA signed or that names another server.`})]}),l&&(0,Q.jsx)(A,{line:{tone:`plain`,text:d?`In the URL: ${d}.`:`The URL sets no SSL parameter: the connection is not encrypted.`}})]})}function It({form:e}){let{values:t,update:n,problem:r,register:i}=e,a=t.type,o=e=>r?.field===e?r.message:null;return(0,Q.jsxs)(`div`,{className:`grid content-start gap-4 md:gap-[18px]`,children:[(0,Q.jsx)(j,{label:`Allowed databases`,htmlFor:`cf-allowed`,error:o(`allowedDatabases`),help:`The tree lists only these. Empty: every database the user can see.`,children:(0,Q.jsx)(`textarea`,{id:`cf-allowed`,ref:i(`allowedDatabases`),rows:4,value:t.allowedDatabases,onChange:e=>n({allowedDatabases:e.target.value}),placeholder:`One database per line`,spellCheck:!1,autoCapitalize:`off`,className:_(de,`h-auto md:h-auto py-2 font-mono resize-y leading-normal`)})}),(0,Q.jsx)(j,{label:`Allowed databases regular expression`,htmlFor:`cf-allowed-re`,error:o(`allowedDatabasesRegex`),children:(0,Q.jsx)(P,{id:`cf-allowed-re`,ref:i(`allowedDatabasesRegex`),mono:!0,value:t.allowedDatabasesRegex,invalid:!!o(`allowedDatabasesRegex`),onChange:e=>n({allowedDatabasesRegex:e.target.value}),onKeyDown:$(e),placeholder:`^shop`})}),(0,Q.jsx)(j,{label:`Default isolation level`,htmlFor:`cf-isolation`,error:o(`isolationLevel`),help:`The transaction Save runs your changes in.`,children:(0,Q.jsxs)(k,{id:`cf-isolation`,ref:i(`isolationLevel`),value:t.isolationLevel,onChange:e=>n({isolationLevel:e.target.value}),children:[(0,Q.jsxs)(`option`,{value:``,children:[`Server default (`,ce[a],`)`]}),w.map(e=>(0,Q.jsx)(`option`,{value:e,children:e},e))]})}),(0,Q.jsx)(j,{label:`Query timeout (seconds)`,htmlFor:`cf-query-timeout`,error:o(`queryTimeoutSec`),help:`A statement the Query tab runs is stopped after this long. Empty: no limit.`,children:(0,Q.jsx)(P,{id:`cf-query-timeout`,ref:i(`queryTimeoutSec`),inputMode:`numeric`,value:t.queryTimeoutSec,invalid:!!o(`queryTimeoutSec`),onChange:e=>n({queryTimeoutSec:e.target.value}),onKeyDown:$(e),placeholder:`No limit`})})]})}function Lt({run:e,successDetail:t,successDetails:n,detailsOpen:r,onToggleDetails:i}){let a=e.kind===`idle`,o=null,s=null,l=``;if(e.kind===`running`){let t=e.action===`test`?`Testing connection…`:e.action===`connect`?`Connecting…`:`Saving…`;o=(0,Q.jsx)(p,{className:`size-4 animate-spin text-text-2`}),s=(0,Q.jsxs)(Q.Fragment,{children:[t,e.target&&(0,Q.jsx)(Rt,{children:e.target})]}),l=`${t} ${e.target}`}else e.kind===`ok`?(o=(0,Q.jsx)(c,{className:`size-4 text-success`}),s=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`b`,{className:`font-semibold`,children:`Connected:`}),` `,e.result.version,(0,Q.jsx)(Rt,{children:t})]}),l=`Connected: ${e.result.version} · ${t}`):e.kind===`failed`?(o=(0,Q.jsx)(d,{className:`size-4 text-error`}),s=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`b`,{className:`font-semibold text-error`,children:`Connection failed:`}),` `,e.result.error]}),l=`Connection failed: ${e.result.error}`):e.kind===`saveFailed`&&(o=(0,Q.jsx)(d,{className:`size-4 text-error`}),s=(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`b`,{className:`font-semibold text-error`,children:`Could not save:`}),` `,e.message]}),l=`Could not save: ${e.message}`);let u=e.kind===`failed`?e.result.details:e.kind===`ok`?n:``;return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`div`,{role:`status`,"aria-live":`polite`,"data-testid":`db-connection-result`,"data-state":e.kind,className:_(`order-first basis-full grow md:order-none md:basis-0 min-w-0 flex items-start md:items-center gap-2 md:ml-1.5 text-[13.5px] md:text-[12.5px] text-text-primary`,a&&`hidden md:flex md:invisible`),children:[o&&(0,Q.jsx)(`span`,{className:`grid place-items-center shrink-0 pt-0.5 md:pt-0`,children:o}),(0,Q.jsx)(`span`,{title:l,className:`min-w-0 break-words md:truncate`,children:s}),u&&(0,Q.jsx)(`button`,{type:`button`,onClick:i,"aria-expanded":r,className:`shrink-0 min-h-11 min-w-11 md:min-h-0 md:min-w-0 text-[13px] md:text-[12px] text-primary underline-offset-2 hover:underline`,children:r?`Hide details`:`Details`})]}),u&&r&&(0,Q.jsx)(`pre`,{"data-testid":`db-connection-details`,className:`order-first md:order-none basis-full m-0 max-h-[30vh] md:max-h-60 overflow-auto rounded-md border border-border-soft bg-surface px-2.5 py-2 font-mono text-[11.5px] leading-normal text-text-2 whitespace-pre-wrap break-words`,children:u})]})}function Rt({children:e}){return(0,Q.jsx)(`small`,{className:`block md:inline md:ml-1.5 mt-0.5 md:mt-0 text-[12.5px] md:text-[12px] text-text-subtle`,children:e})}var zt=`inline-flex items-center justify-center gap-1.5 h-11 md:h-8 flex-1 md:flex-none rounded-[10px] md:rounded-md px-3.5 text-[14px] md:text-[12.5px] font-medium disabled:opacity-50 disabled:cursor-not-allowed`;function Bt({metadata:e,tabId:t}){let n=typeof e?.connectionId==`number`?e.connectionId:null,r=Ct(n,t),i=(0,I.useRef)(null),a=(0,I.useRef)({}),o=De(r.values.type),s=typeof e?.connectionName==`string`?e.connectionName:`connection`,c=n===null?`New connection`:`Edit ${s}`,l=()=>{t&&y.getState().closeTab(t)},d=e=>{r.setTab(e),i.current?.scrollTo({top:0})},f=(e,t)=>{let n=e.key===`ArrowRight`?1:e.key===`ArrowLeft`?-1:0;if(!n)return;e.preventDefault();let r=o[(o.indexOf(t)+n+o.length)%o.length];d(r),a.current[r]?.focus()},m=(0,Q.jsxs)(`header`,{className:`md:hidden flex h-[52px] shrink-0 items-center gap-1.5 border-b border-border-soft bg-panel-2 pl-1 pr-3`,children:[(0,Q.jsx)(`button`,{type:`button`,onClick:l,"aria-label":`Close`,className:`grid size-11 place-items-center rounded-md text-text-2`,children:(0,Q.jsx)(u,{className:`size-5`})}),(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsx)(`b`,{className:`block truncate text-[15px] text-text-primary`,children:c}),(0,Q.jsx)(`small`,{className:`block text-xs text-text-subtle`,children:E[r.values.type]})]})]});if(r.load.kind!==`ready`)return(0,Q.jsxs)(`div`,{className:`flex h-full flex-col bg-background`,children:[m,(0,Q.jsx)(`div`,{className:`flex flex-1 flex-col items-center justify-center gap-3 p-6 text-center text-sm text-text-2`,children:r.load.kind===`loading`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(p,{className:`size-5 animate-spin text-text-subtle`}),`Loading the connection…`]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`p`,{children:[`Could not open the connection: `,r.load.message]}),(0,Q.jsx)(`button`,{type:`button`,onClick:r.reload,className:_(zt,`flex-none border border-border bg-surface text-text-primary`),children:`Try again`})]})})]});let h=r.run,g=h.kind===`running`,v=g&&h.action===`test`,b=g&&h.action===`connect`;return(0,Q.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col bg-background`,"data-testid":`db-connection-tab`,children:[m,(0,Q.jsx)(`div`,{className:`shrink-0 border-b border-border bg-panel px-1 md:px-5`,children:(0,Q.jsx)(`div`,{role:`tablist`,"aria-label":`Connection settings`,className:`mx-auto flex w-full max-w-[760px] gap-0.5 overflow-x-auto`,children:o.map(e=>(0,Q.jsx)(`button`,{ref:t=>{a.current[e]=t},type:`button`,role:`tab`,id:`cft-${e}`,"aria-controls":`cfp-${e}`,"aria-selected":r.tab===e,tabIndex:r.tab===e?0:-1,onClick:()=>d(e),onKeyDown:t=>f(t,e),className:_(`h-11 md:h-[38px] shrink-0 whitespace-nowrap px-3.5 md:px-3 text-[13.5px] md:text-[12.5px]`,r.tab===e?`font-semibold text-text-primary shadow-[inset_0_-2px_0_var(--color-primary)]`:`text-text-2 can-hover:hover:text-text-primary`),children:Ee[e]},e))})}),(0,Q.jsx)(`div`,{ref:i,className:`@container min-h-0 flex-1 overflow-auto px-4 pb-5 pt-4 md:px-5 md:pb-7 md:pt-[18px] md:[scrollbar-gutter:stable_both-edges]`,children:(0,Q.jsxs)(`div`,{id:`cfp-${r.tab}`,role:`tabpanel`,"aria-labelledby":`cft-${r.tab}`,className:`mx-auto w-full max-w-[760px]`,children:[r.tab===`general`&&(0,Q.jsx)(jt,{form:r}),r.tab===`ssh`&&(0,Q.jsx)(Pt,{form:r}),r.tab===`ssl`&&(0,Q.jsx)(Ft,{form:r}),r.tab===`advanced`&&(0,Q.jsx)(It,{form:r})]})}),(0,Q.jsx)(`footer`,{className:`shrink-0 border-t border-border bg-panel px-3 pt-2.5 pb-[calc(10px+env(safe-area-inset-bottom))] md:px-5 md:py-2.5`,children:(0,Q.jsxs)(`div`,{className:`mx-auto flex w-full max-w-[760px] flex-wrap items-center gap-2`,children:[(0,Q.jsxs)(`button`,{type:`button`,onClick:r.connect,disabled:g,className:_(zt,`flex-[2] md:flex-none bg-primary text-primary-foreground can-hover:hover:bg-primary/90`),children:[b&&(0,Q.jsx)(p,{className:`size-4 animate-spin`}),b?`Connecting…`:`Connect`]}),(0,Q.jsx)(`button`,{type:`button`,onClick:r.test,disabled:g&&!v,className:_(zt,`border border-border bg-surface text-text-primary can-hover:hover:bg-surface-hover`),children:v?`Cancel test`:`Test`}),(0,Q.jsx)(`button`,{type:`button`,onClick:r.save,disabled:g,className:_(zt,`border border-border bg-surface text-text-primary can-hover:hover:bg-surface-hover`),children:`Save`}),(0,Q.jsx)(Lt,{run:h,successDetail:h.kind===`ok`?_t(h.result,r.values,r.ctx):``,successDetails:h.kind===`ok`?yt(h.result,r.values,r.ctx):``,detailsOpen:r.detailsOpen,onToggleDetails:r.toggleDetails})]})})]})}export{Bt as ConnectionFormTab};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{Ot as r,ei as i,r as a,si as ee,xn as o,xt as te}from"./icons-C1wDt09O.js";import{a as s,o as c,r as l}from"./api-client-BnYFnEfK.js";import{t as u}from"./settings-store-CBJCnE5L.js";import"./project-store-Bs-kiU8m.js";import"./project-framework-store-nuePqBBa.js";import"./git-repo-store-CESIqItW.js";import{t as d}from"./button-BHGVTbam.js";import{$ as ne,bi as re,di as f,li as ie,tt as p}from"./index-Cx9ZRibz.js";import{t as ae}from"./use-monaco-theme-CyoMsYaI.js";import{n as oe,t as se}from"./editor-font-UC3YDKcu.js";import{t as m}from"./use-inline-blame-B9M-hADX.js";import{n as h,r as ce}from"./monaco-dotenv-language-jKkZFsKj.js";import{n as g,o as _}from"./can-open-in-ppm-C_Ev8S2p.js";import{r as v}from"./image-preview-geometry-BX1a3Lfa.js";var y=e(t(),1),b=n();function x(e){return g.has(_(e))}function S(e){return/^[0-9a-f]{40}$/i.test(e)?e.slice(0,7):e}function C({mode:e,onChange:t}){return(0,b.jsxs)(`select`,{value:e,onChange:e=>t(e.target.value),title:`Show this file as an image or as text`,"aria-label":`Reopen editor with`,className:`h-11 rounded border border-border bg-transparent px-1 text-xs text-foreground outline-none md:h-6`,children:[(0,b.jsx)(`option`,{value:`preview`,children:`Image Preview`}),(0,b.jsx)(`option`,{value:`text`,children:`Text Editor`})]})}function le({filePath:e,mode:t,original:n,modified:r,onOpenAnyway:i}){if(t===`text`||!x(e))return(0,b.jsx)(w,{onOpenAnyway:i});let a=[n,r].filter(e=>e.url!==null);if(a.length<2){let e=a[0];return e?(0,b.jsx)(T,{side:e}):(0,b.jsx)(w,{onOpenAnyway:i})}return(0,b.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col md:flex-row`,children:[(0,b.jsx)(T,{side:a[0]}),(0,b.jsx)(`div`,{className:`shrink-0 border-b border-border md:border-b-0 md:border-r`}),(0,b.jsx)(T,{side:a[1]})]})}function w({onOpenAnyway:e}){return(0,b.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center gap-4 p-6 text-center`,children:[(0,b.jsx)(a,{className:`size-10 text-warning`}),(0,b.jsx)(`p`,{className:`max-w-md text-sm leading-relaxed text-text-secondary`,children:`The file is not displayed in the text editor because it is either binary or uses an unsupported text encoding.`}),(0,b.jsx)(d,{onClick:e,className:`mt-auto h-11 w-full max-w-xs md:mt-0 md:w-auto md:px-5`,children:`Open Anyway`})]})}function T({side:e}){return(0,b.jsxs)(`div`,{className:`flex min-h-0 min-w-0 flex-1 flex-col`,children:[(0,b.jsxs)(`div`,{className:`flex shrink-0 items-center justify-between gap-2 border-b border-border px-3 py-1.5`,children:[(0,b.jsx)(`span`,{className:`truncate text-xs font-medium text-text-secondary`,children:e.label}),e.size!==null&&(0,b.jsx)(`span`,{className:`shrink-0 text-xs text-text-subtle`,children:v(e.size)})]}),(0,b.jsx)(`div`,{className:`flex min-h-0 flex-1 items-center justify-center overflow-auto bg-surface p-4`,children:(0,b.jsx)(E,{url:e.url})})]})}function E({url:e}){let{blobUrl:t,failed:n}=D(e);return n?(0,b.jsxs)(`div`,{className:`flex flex-col items-center gap-2 text-text-subtle`,children:[(0,b.jsx)(r,{className:`size-8`}),(0,b.jsx)(`p`,{className:`text-xs`,children:`Failed to load.`})]}):t?(0,b.jsx)(`img`,{src:t,alt:``,className:`max-h-full max-w-full object-contain`}):(0,b.jsx)(o,{className:`size-5 animate-spin text-text-subtle`})}function D(e){let[t,n]=(0,y.useState)(null),[r,i]=(0,y.useState)(!1),a=(0,y.useRef)(null);return(0,y.useEffect)(()=>{let t=!1;i(!1);let r=s();return fetch(e,{headers:r?{Authorization:`Bearer ${r}`}:{}}).then(e=>{if(!e.ok)throw Error(String(e.status));return e.blob()}).then(e=>{if(t)return;let r=URL.createObjectURL(e);a.current&&URL.revokeObjectURL(a.current),a.current=r,n(r)}).catch(()=>{t||i(!0)}),()=>{t=!0}},[e]),(0,y.useEffect)(()=>()=>{a.current&&URL.revokeObjectURL(a.current)},[]),{blobUrl:t,failed:r}}function ue({onMount:e,...t}){let n=(0,y.useRef)(null);return(0,y.useLayoutEffect)(()=>()=>{let e=n.current;if(!e)return;let t=e.getModel();e.setModel(null),t?.original.dispose(),t?.modified.dispose()},[]),(0,b.jsx)(p,{...t,onMount:(t,r)=>{n.current=t,e?.(t,r)}})}function de(e){return{js:`javascript`,jsx:`javascript`,ts:`typescript`,tsx:`typescript`,py:`python`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,mdx:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,bash:`shell`}[e.split(`.`).pop()?.toLowerCase()??``]??(h(e)?`dotenv`:`plaintext`)}function O({metadata:e}){let t=e?.filePath,n=e?.projectName,r=e?.ref1,a=e?.ref2,s=e?.file1,d=e?.file2,p=e?.original,h=e?.modified,g=p!=null||h!=null,_=!!(s&&d),[v,w]=(0,y.useState)(null),[T,E]=(0,y.useState)(null),[D,O]=(0,y.useState)(null),[k,A]=(0,y.useState)(`preview`),[j,M]=(0,y.useState)(!1),N=e=>{A(e),e===`preview`&&M(!1)},[P,F]=(0,y.useState)(!g),[I,L]=(0,y.useState)(null),{wordWrap:pe,toggleWordWrap:R,mobileWordWrap:z,toggleMobileWordWrap:me}=u(f(e=>({wordWrap:e.wordWrap,toggleWordWrap:e.toggleWordWrap,mobileWordWrap:e.mobileWordWrap,toggleMobileWordWrap:e.toggleMobileWordWrap}))),he=ae(),B=ie(n),V=(0,y.useRef)(null),H=(0,y.useRef)(null),[ge,_e]=(0,y.useState)(!1),[U,ve]=(0,y.useState)(null),[W,G]=(0,y.useState)(`modified`),[K,ye]=(0,y.useState)();(0,y.useEffect)(()=>{let e=V.current;if(!e)return;let t=new ResizeObserver(([e])=>{e&&ye(Math.floor(e.contentRect.height))});return t.observe(e),()=>t.disconnect()},[P,I]),(0,y.useEffect)(()=>re(V.current,()=>H.current?.layout()),[P,I]),(0,y.useEffect)(()=>{if(g||!n)return;if(F(!0),L(null),O(null),E(null),w(null),s&&d){let e=new URLSearchParams({file1:s,file2:d});l.get(`${c(n)}/files/compare?${e}`).then(e=>{E(e),F(!1)}).catch(e=>{L(e instanceof Error?e.message:`Failed to compare files`),F(!1)});return}if(t){let e=B.fileScope(t);if(e===void 0)return;if(e===null){F(!1);return}let n=new URLSearchParams({file:e.path});r&&n.set(`ref`,r),a&&n.set(`ref2`,a),j&&n.set(`text`,`1`),l.get(B.fileGitUrl(`/file-full-diff?${n}`,e.repo)).then(e=>{O(e),F(!1)}).catch(e=>{L(e instanceof Error?e.message:`Failed to load diff`),F(!1)});return}let e;if(r||a){let t=new URLSearchParams;r&&t.set(`ref1`,r),a&&t.set(`ref2`,a),e=B.gitUrl(`/diff?${t}`)}else e=B.gitUrl(`/diff`);l.get(e).then(e=>{w(e.diff),F(!1)}).catch(e=>{L(e instanceof Error?e.message:`Failed to load diff`),F(!1)})},[t,n,r,a,s,d,g,B,j]),(0,y.useEffect)(()=>{M(!1),A(`preview`)},[t,r,a]);let{original:q,modified:J}=(0,y.useMemo)(()=>g?{original:p??``,modified:h??``}:_&&T?T:D||(v?fe(v):{original:``,modified:``}),[v,g,p,h,_,T,D]),be=(0,y.useMemo)(()=>{let e=t??d??s;return e?de(e):`plaintext`},[t,s,d]),Y=u(e=>e.inlineBlame),xe=u(e=>e.toggleInlineBlame),X=typeof window<`u`&&window.innerWidth<768,Z=X?z:pe,Se=X?me:R,Q=!!(n&&t&&D)&&!X;m({editor:U?.original??null,monaco:U?.monaco??null,projectName:n,filePath:Q?t:void 0,rev:r||`HEAD`,enabled:Y&&Q&&W===`original`,readOnly:!0}),m({editor:U?.modified??null,monaco:U?.monaco??null,projectName:n,filePath:Q?t:void 0,rev:a,enabled:Y&&Q&&W===`modified`,readOnly:!0});let $=!X;if((0,y.useEffect)(()=>{let e=H.current;if(!e)return;let t=Z?`on`:`off`;e.updateOptions({diffWordWrap:t}),e.getOriginalEditor().updateOptions({wordWrapOverride2:$?t:`off`}),e.getModifiedEditor().updateOptions({wordWrapOverride2:t})},[Z,ge,$]),!n&&!g)return(0,b.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground text-sm`,children:`No project selected.`});if(P)return(0,b.jsxs)(`div`,{className:`flex items-center justify-center h-full gap-2 text-muted-foreground`,children:[(0,b.jsx)(o,{className:`size-5 animate-spin`}),(0,b.jsx)(`span`,{className:`text-sm`,children:`Loading diff...`})]});if(I)return(0,b.jsx)(`div`,{className:`flex items-center justify-center h-full text-destructive text-sm`,children:I});if(D?.binary&&!j&&t&&n){let e=B.fileScope(t),i=t=>e==null?null:B.fileGitUrl(`/file-blob?file=${encodeURIComponent(e.path)}&ref=${encodeURIComponent(t)}`,e.repo);return(0,b.jsxs)(`div`,{className:`flex flex-col h-full`,children:[x(t)&&(0,b.jsx)(`div`,{className:`flex items-center justify-end gap-0.5 px-2 py-0.5 border-b border-border shrink-0`,children:(0,b.jsx)(C,{mode:k,onChange:N})}),(0,b.jsx)(`div`,{className:`flex-1 min-h-0`,children:(0,b.jsx)(le,{filePath:t,mode:k,original:{url:D.originalSize===null?null:i(r||`HEAD`),label:S(r||`HEAD`),size:D.originalSize},modified:{url:D.modifiedSize===null?null:a?i(a):`${c(n)}/files/raw?path=${encodeURIComponent(t)}`,label:a?S(a):`Working Tree`,size:D.modifiedSize},onOpenAnyway:()=>M(!0)})})]})}return!g&&!_&&!D&&!q&&!J?(0,b.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-2 text-muted-foreground`,children:[(0,b.jsx)(te,{className:`size-8`}),(0,b.jsx)(`p`,{className:`text-sm`,children:`No content changes`}),t&&(0,b.jsx)(`p`,{className:`text-xs font-mono`,children:t})]}):(0,b.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,b.jsxs)(`div`,{className:`flex items-center justify-end gap-0.5 px-2 py-0.5 border-b border-border shrink-0`,children:[D?.binary&&t&&x(t)&&(0,b.jsx)(C,{mode:`text`,onChange:N}),Q&&(0,b.jsx)(`button`,{type:`button`,onClick:xe,title:`Inline blame (Alt+B) — who last touched the cursor's line. Click a pane to annotate that side.`,className:`flex items-center justify-center rounded hover:bg-muted active:scale-95 transition-colors p-1 ${Y?`bg-muted text-foreground`:``}`,children:(0,b.jsx)(i,{className:`size-3.5`})}),(0,b.jsx)(`button`,{type:`button`,onClick:Se,title:Z?`Wrapping long lines — tap to scroll sideways instead`:`Toggle word wrap`,className:`flex items-center justify-center rounded hover:bg-muted active:scale-95 transition-colors ${X?`size-11`:`p-1`} ${Z?`bg-muted text-foreground`:``}`,children:(0,b.jsx)(ee,{className:`size-3.5`})})]}),(0,b.jsx)(`div`,{ref:V,className:`flex-1 overflow-hidden`,children:K&&K>0?(0,b.jsx)(ue,{height:K,language:be,beforeMount:e=>{ne(e),ce(e)},original:q,modified:J,theme:he,onMount:(e,t)=>{H.current=e,_e(!0);let n=e.getOriginalEditor(),r=e.getModifiedEditor();ve({monaco:t,original:n,modified:r}),n.onDidFocusEditorText(()=>G(`original`)),r.onDidFocusEditorText(()=>G(`modified`)),e.addCommand(t.KeyMod.Alt|t.KeyCode.KeyB,()=>u.getState().toggleInlineBlame())},options:{fontSize:X?11:14,fontFamily:se,fontLigatures:oe,diffWordWrap:Z?`on`:`off`,renderSideBySide:$,useInlineViewWhenSpaceIsLimited:!1,readOnly:!0,automaticLayout:!0,scrollBeyondLastLine:!1},loading:(0,b.jsx)(o,{className:`size-5 animate-spin text-muted-foreground`})}):(0,b.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,b.jsx)(o,{className:`size-5 animate-spin text-muted-foreground`})})})]})}function fe(e){let t=e.split(`
|
|
2
|
-
`),n=[],r=[],i=!1;for(let e of t)if(!(e.startsWith(`diff --git`)||e.startsWith(`diff --no-index`)||e.startsWith(`index `)||e.startsWith(`new file`)||e.startsWith(`deleted file`)||e.startsWith(`old mode`)||e.startsWith(`new mode`)||e.startsWith(`---`)||e.startsWith(`+++`)||e.startsWith(`Binary files`)||e.startsWith(`\\ No newline`))){if(e.startsWith(`@@`)){i=!0;continue}if(i)if(e.startsWith(`-`))n.push(e.slice(1));else if(e.startsWith(`+`))r.push(e.slice(1));else{let t=e.startsWith(` `)?e.slice(1):e;n.push(t),r.push(t)}}return{original:n.join(`
|
|
3
|
-
`),modified:r.join(`
|
|
4
|
-
`)}}export{O as DiffViewer};
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|