@hienlh/ppm 0.23.5 → 0.23.6
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 +5 -0
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/cli-reference.md +4 -4
- package/assets/skills/ppm/references/http-api.md +2 -1
- package/dist/web/assets/accounts-settings-section-DUVO32SQ.js +1 -0
- package/dist/web/assets/accounts-settings-section-DUVO32SQ.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-DUVO32SQ.js.gz +0 -0
- package/dist/web/assets/{ai-resource-editor-DKcsVDle.js → ai-resource-editor-Dn_wB-o5.js} +1 -1
- package/dist/web/assets/ai-resource-editor-Dn_wB-o5.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-Dn_wB-o5.js.gz +0 -0
- package/dist/web/assets/{ai-settings-section-D7zJ-hCO.js → ai-settings-section-CEbW8jRy.js} +1 -1
- package/dist/web/assets/ai-settings-section-CEbW8jRy.js.br +0 -0
- package/dist/web/assets/ai-settings-section-CEbW8jRy.js.gz +0 -0
- package/dist/web/assets/{ai-settings-section-OPqC2bYG.js → ai-settings-section-D-mwEYFZ.js} +1 -1
- package/dist/web/assets/{appearance-settings-section-DL466x83.js → appearance-settings-section-tw6TpFb6.js} +1 -1
- package/dist/web/assets/appearance-settings-section-tw6TpFb6.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-tw6TpFb6.js.gz +0 -0
- package/dist/web/assets/{branch-review-tab-Dag86n_R.js → branch-review-tab-MBuMWp_i.js} +1 -1
- package/dist/web/assets/branch-review-tab-MBuMWp_i.js.br +0 -0
- package/dist/web/assets/branch-review-tab-MBuMWp_i.js.gz +0 -0
- package/dist/web/assets/{chat-tab-QFDhzzBZ.js → chat-tab-DVvnqhw6.js} +1 -1
- package/dist/web/assets/chat-tab-DVvnqhw6.js.br +0 -0
- package/dist/web/assets/chat-tab-DVvnqhw6.js.gz +0 -0
- package/dist/web/assets/chat-tab-DaEHva22.js +15 -0
- package/dist/web/assets/chat-tab-DaEHva22.js.br +0 -0
- package/dist/web/assets/chat-tab-DaEHva22.js.gz +0 -0
- package/dist/web/assets/{code-editor-K-IN8VwJ.js → code-editor-Bu9lhTVp.js} +3 -3
- package/dist/web/assets/code-editor-Bu9lhTVp.js.br +0 -0
- package/dist/web/assets/code-editor-Bu9lhTVp.js.gz +0 -0
- package/dist/web/assets/codex-reset-credit-button-CbmE5mRX.js +1 -0
- package/dist/web/assets/codex-reset-credit-button-CbmE5mRX.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-CbmE5mRX.js.gz +0 -0
- package/dist/web/assets/{conflict-editor-qMGJH0Bx.js → conflict-editor-BA3y-qSH.js} +1 -1
- package/dist/web/assets/conflict-editor-BA3y-qSH.js.br +0 -0
- package/dist/web/assets/conflict-editor-BA3y-qSH.js.gz +0 -0
- package/dist/web/assets/{csv-preview-D2I742dl.js → csv-preview-BioxkrQF.js} +1 -1
- package/dist/web/assets/csv-preview-BioxkrQF.js.br +0 -0
- package/dist/web/assets/csv-preview-BioxkrQF.js.gz +0 -0
- package/dist/web/assets/{database-viewer-Bz4LjgIa.js → database-viewer-BSoJ0E6p.js} +1 -1
- package/dist/web/assets/database-viewer-BSoJ0E6p.js.br +0 -0
- package/dist/web/assets/database-viewer-BSoJ0E6p.js.gz +0 -0
- package/dist/web/assets/{design-tab-C987MtMR.js → design-tab-iU2CviE3.js} +1 -1
- package/dist/web/assets/design-tab-iU2CviE3.js.br +0 -0
- package/dist/web/assets/design-tab-iU2CviE3.js.gz +0 -0
- package/dist/web/assets/{designs-sidebar-panel-CapP1yXq.js → designs-sidebar-panel-DHh5QsH9.js} +1 -1
- package/dist/web/assets/designs-sidebar-panel-DHh5QsH9.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-DHh5QsH9.js.gz +0 -0
- package/dist/web/assets/{diff-viewer-CdXi7cZN.js → diff-viewer-lctWoSmG.js} +1 -1
- package/dist/web/assets/diff-viewer-lctWoSmG.js.br +0 -0
- package/dist/web/assets/diff-viewer-lctWoSmG.js.gz +0 -0
- package/dist/web/assets/{editor-language-service-Zle_PZV8.js → editor-language-service-fPG56hQO.js} +1 -1
- package/dist/web/assets/editor-language-service-fPG56hQO.js.br +0 -0
- package/dist/web/assets/editor-language-service-fPG56hQO.js.gz +0 -0
- package/dist/web/assets/{explorer-body-DHMQR1Rk.js → explorer-body-BgF7FsxI.js} +1 -1
- package/dist/web/assets/explorer-body-BgF7FsxI.js.br +0 -0
- package/dist/web/assets/explorer-body-BgF7FsxI.js.gz +0 -0
- package/dist/web/assets/{explorer-window-content-Df40nQBk.js → explorer-window-content-C21w_7lf.js} +1 -1
- package/dist/web/assets/explorer-window-content-C21w_7lf.js.br +0 -0
- package/dist/web/assets/explorer-window-content-C21w_7lf.js.gz +0 -0
- package/dist/web/assets/{extension-manager-section-B2nZzJ2b.js → extension-manager-section-rbkXsZVR.js} +1 -1
- package/dist/web/assets/extension-manager-section-rbkXsZVR.js.br +0 -0
- package/dist/web/assets/extension-manager-section-rbkXsZVR.js.gz +0 -0
- package/dist/web/assets/{extension-webview-BGoDxkdF.js → extension-webview-uPO0WgCq.js} +1 -1
- package/dist/web/assets/extension-webview-uPO0WgCq.js.br +0 -0
- package/dist/web/assets/extension-webview-uPO0WgCq.js.gz +0 -0
- package/dist/web/assets/{files-settings-section-DC3OzzOl.js → files-settings-section-CT7mDb0L.js} +1 -1
- package/dist/web/assets/files-settings-section-CT7mDb0L.js.br +0 -0
- package/dist/web/assets/files-settings-section-CT7mDb0L.js.gz +0 -0
- package/dist/web/assets/{general-settings-section-i41W43ER.js → general-settings-section-DANPfMRN.js} +1 -1
- package/dist/web/assets/general-settings-section-DANPfMRN.js.br +0 -0
- package/dist/web/assets/general-settings-section-DANPfMRN.js.gz +0 -0
- package/dist/web/assets/{git-log-panel-DHzPIkJg.js → git-log-panel-BJPkLiEw.js} +1 -1
- package/dist/web/assets/git-log-panel-BJPkLiEw.js.br +0 -0
- package/dist/web/assets/git-log-panel-BJPkLiEw.js.gz +0 -0
- package/dist/web/assets/{glide-data-grid-Dj4vrDvj.js → glide-data-grid-R4PcAntf.js} +1 -1
- package/dist/web/assets/glide-data-grid-R4PcAntf.js.br +0 -0
- package/dist/web/assets/glide-data-grid-R4PcAntf.js.gz +0 -0
- package/dist/web/assets/{group-chat-tab-DfwZb-fI.js → group-chat-tab-BXMdo8w9.js} +1 -1
- package/dist/web/assets/group-chat-tab-BXMdo8w9.js.br +0 -0
- package/dist/web/assets/group-chat-tab-BXMdo8w9.js.gz +0 -0
- package/dist/web/assets/{index-jG9mLs-J.js → index-C8nGqkKN.js} +5 -5
- package/dist/web/assets/index-C8nGqkKN.js.br +0 -0
- package/dist/web/assets/index-C8nGqkKN.js.gz +0 -0
- package/dist/web/assets/{index-DMA-So69.css → index-DvClbTQx.css} +1 -1
- package/dist/web/assets/index-DvClbTQx.css.br +0 -0
- package/dist/web/assets/{index-DMA-So69.css.gz → index-DvClbTQx.css.gz} +0 -0
- package/dist/web/assets/{jira-watcher-section-BJ9edGEP.js → jira-watcher-section-DHRoyWcG.js} +1 -1
- package/dist/web/assets/{keybindings-store-BlapkC6O.js → keybindings-store-BGKlQQAv.js} +1 -1
- package/dist/web/assets/{keyboard-shortcuts-section-CxdGSNGr.js → keyboard-shortcuts-section-BKej4mUf.js} +1 -1
- package/dist/web/assets/keyboard-shortcuts-section-BKej4mUf.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-BKej4mUf.js.gz +0 -0
- package/dist/web/assets/{markdown-renderer-ok96IgnS.js → markdown-renderer-BHtYqkYZ.js} +1 -1
- package/dist/web/assets/markdown-renderer-BHtYqkYZ.js.br +0 -0
- package/dist/web/assets/markdown-renderer-BHtYqkYZ.js.gz +0 -0
- package/dist/web/assets/{markdown-renderer-DJ9EVU1B.js → markdown-renderer-vDNuKjel.js} +1 -1
- package/dist/web/assets/{mobile-explorer-sheet-Cc03LUKy.js → mobile-explorer-sheet-DtvxS7-r.js} +1 -1
- package/dist/web/assets/mobile-explorer-sheet-DtvxS7-r.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-DtvxS7-r.js.gz +0 -0
- package/dist/web/assets/{new-design-dialog-Drkjb_LI.js → new-design-dialog-DS_XrpTG.js} +1 -1
- package/dist/web/assets/new-design-dialog-DS_XrpTG.js.br +0 -0
- package/dist/web/assets/new-design-dialog-DS_XrpTG.js.gz +0 -0
- package/dist/web/assets/{notification-store-DCyxho0O.js → notification-store-Dnnj20Ky.js} +1 -1
- package/dist/web/assets/{ppmbot-settings-section-C8PFlvaq.js → ppmbot-settings-section-D8AES1BA.js} +1 -1
- package/dist/web/assets/ppmbot-settings-section-D8AES1BA.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-D8AES1BA.js.gz +0 -0
- package/dist/web/assets/{problems-panel-CFYO0Ro3.js → problems-panel-DTBG4beI.js} +1 -1
- package/dist/web/assets/problems-panel-DTBG4beI.js.br +0 -0
- package/dist/web/assets/problems-panel-DTBG4beI.js.gz +0 -0
- package/dist/web/assets/{process-table-BVeRguFg.js → process-table-D_gR2XA6.js} +1 -1
- package/dist/web/assets/process-table-D_gR2XA6.js.br +0 -0
- package/dist/web/assets/process-table-D_gR2XA6.js.gz +0 -0
- package/dist/web/assets/{proxy-settings-section-BcHIEANE.js → proxy-settings-section-CqtmbeRj.js} +1 -1
- package/dist/web/assets/proxy-settings-section-CqtmbeRj.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-CqtmbeRj.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-clipboard-notice-BGsp0edA.js → remote-desktop-clipboard-notice-Djt6cpNL.js} +1 -1
- package/dist/web/assets/remote-desktop-clipboard-notice-Djt6cpNL.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-Djt6cpNL.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-mobile-sheet-DxkmF8qb.js → remote-desktop-mobile-sheet-BQxhJUkm.js} +2 -2
- package/dist/web/assets/remote-desktop-mobile-sheet-BQxhJUkm.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-BQxhJUkm.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-mobile-view-DMD0M9Jh.js → remote-desktop-mobile-view-DGnT8RY7.js} +1 -1
- package/dist/web/assets/remote-desktop-mobile-view-DGnT8RY7.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DGnT8RY7.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-readiness-gate-CsZCCRJI.js → remote-desktop-readiness-gate-DNJF8TcF.js} +1 -1
- package/dist/web/assets/remote-desktop-readiness-gate-DNJF8TcF.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-DNJF8TcF.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-window-content-DrHw_vwY.js → remote-desktop-window-content-Ds0DKmM0.js} +1 -1
- package/dist/web/assets/remote-desktop-window-content-Ds0DKmM0.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-Ds0DKmM0.js.gz +0 -0
- package/dist/web/assets/{schedules-settings-section-Ci0O2Ng6.js → schedules-settings-section-BKoPovy2.js} +1 -1
- package/dist/web/assets/schedules-settings-section-BKoPovy2.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-BKoPovy2.js.gz +0 -0
- package/dist/web/assets/{settings-body-B6JGOIYb.js → settings-body-k2qPgRFe.js} +2 -2
- package/dist/web/assets/settings-body-k2qPgRFe.js.br +0 -0
- package/dist/web/assets/settings-body-k2qPgRFe.js.gz +0 -0
- package/dist/web/assets/{settings-tab-CIQM4fNE.js → settings-tab-Bb23VdBu.js} +1 -1
- package/dist/web/assets/{settings-window-content-BGNNz-E5.js → settings-window-content-ClarWusz.js} +1 -1
- package/dist/web/assets/{sql-query-editor-4iCGE4h2.js → sql-query-editor-BjIMi9Wk.js} +1 -1
- package/dist/web/assets/sql-query-editor-BjIMi9Wk.js.br +0 -0
- package/dist/web/assets/sql-query-editor-BjIMi9Wk.js.gz +0 -0
- package/dist/web/assets/{sqlite-viewer-CK6DulYk.js → sqlite-viewer-BNcA6Irq.js} +1 -1
- package/dist/web/assets/sqlite-viewer-BNcA6Irq.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-BNcA6Irq.js.gz +0 -0
- package/dist/web/assets/{system-monitor-body-J9JtvAWV.js → system-monitor-body-D0T3ggt2.js} +2 -2
- package/dist/web/assets/system-monitor-body-D0T3ggt2.js.br +0 -0
- package/dist/web/assets/system-monitor-body-D0T3ggt2.js.gz +0 -0
- package/dist/web/assets/{system-monitor-tab-DjBeRE81.js → system-monitor-tab-I1Igmoey.js} +1 -1
- package/dist/web/assets/{system-monitor-window-content-BT7-ugFx.js → system-monitor-window-content-C5SeUv1H.js} +1 -1
- package/dist/web/assets/{tab-host-window-content-CWBaWKjA.js → tab-host-window-content-CIRGNCvi.js} +1 -1
- package/dist/web/assets/tab-host-window-content-CIRGNCvi.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-CIRGNCvi.js.gz +0 -0
- package/dist/web/assets/{team-member-sheet-Br6mrxrw.js → team-member-sheet-CwXpLi3X.js} +2 -2
- package/dist/web/assets/team-member-sheet-CwXpLi3X.js.br +0 -0
- package/dist/web/assets/team-member-sheet-CwXpLi3X.js.gz +0 -0
- package/dist/web/assets/{team-member-window-content-CwCy7ZWf.js → team-member-window-content-4swiiDz7.js} +1 -1
- package/dist/web/assets/team-member-window-content-4swiiDz7.js.br +0 -0
- package/dist/web/assets/team-member-window-content-4swiiDz7.js.gz +0 -0
- package/dist/web/assets/{terminal-tab-BW14RpCb.js → terminal-tab-BGcdtMMT.js} +1 -1
- package/dist/web/assets/terminal-tab-BGcdtMMT.js.br +0 -0
- package/dist/web/assets/terminal-tab-BGcdtMMT.js.gz +0 -0
- package/dist/web/assets/{tool-cards-CgOBEUnb.js → tool-cards-D0-krtA2.js} +2 -2
- package/dist/web/assets/tool-cards-D0-krtA2.js.br +0 -0
- package/dist/web/assets/tool-cards-D0-krtA2.js.gz +0 -0
- package/dist/web/assets/{use-inline-blame-Bzjfru4n.js → use-inline-blame-pKaXyGU-.js} +1 -1
- package/dist/web/assets/use-inline-blame-pKaXyGU-.js.br +0 -0
- package/dist/web/assets/use-inline-blame-pKaXyGU-.js.gz +0 -0
- package/dist/web/assets/{use-lsp-hGdjL2hV.js → use-lsp-71azTXQz.js} +1 -1
- package/dist/web/assets/use-lsp-71azTXQz.js.br +0 -0
- package/dist/web/assets/use-lsp-71azTXQz.js.gz +0 -0
- package/dist/web/assets/{use-monaco-theme-rH6epJYA.js → use-monaco-theme-C88KphGx.js} +1 -1
- package/dist/web/assets/{use-websocket-QwURkjpV.js → use-websocket-Chk9guIU.js} +1 -1
- package/dist/web/assets/{video-preview-P9T-ZVdN.js → video-preview-DxEX-uGo.js} +1 -1
- package/dist/web/assets/video-preview-DxEX-uGo.js.br +0 -0
- package/dist/web/assets/video-preview-DxEX-uGo.js.gz +0 -0
- package/dist/web/index.html +2 -2
- 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/providers/codex-app-server/codex-reset-credit.ts +49 -0
- package/src/server/routes/codex-accounts.ts +14 -0
- package/src/services/codex-reset-credit.service.ts +70 -0
- package/src/services/edge-forwarder.ts +191 -191
- package/src/services/windows-process-tree.ts +351 -351
- package/src/shared/usage-extra.ts +19 -0
- package/src/types/chat.ts +2 -0
- package/src/web/components/chat/codex-usage-panel.tsx +4 -0
- package/src/web/components/settings/accounts/account-card.tsx +5 -1
- package/src/web/components/settings/accounts/account-usage-extras.tsx +3 -2
- package/src/web/components/settings/accounts/codex-accounts-section.tsx +3 -1
- package/src/web/components/settings/accounts/codex-reset-credit-button.tsx +120 -0
- package/dist/web/assets/accounts-settings-section-CgG5P3Jm.js +0 -1
- package/dist/web/assets/accounts-settings-section-CgG5P3Jm.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-CgG5P3Jm.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-DKcsVDle.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-DKcsVDle.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-D7zJ-hCO.js.br +0 -0
- package/dist/web/assets/ai-settings-section-D7zJ-hCO.js.gz +0 -0
- package/dist/web/assets/appearance-settings-section-DL466x83.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-DL466x83.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-Dag86n_R.js.br +0 -0
- package/dist/web/assets/branch-review-tab-Dag86n_R.js.gz +0 -0
- package/dist/web/assets/chat-tab-CcYZLXls.js +0 -15
- package/dist/web/assets/chat-tab-CcYZLXls.js.br +0 -0
- package/dist/web/assets/chat-tab-CcYZLXls.js.gz +0 -0
- package/dist/web/assets/chat-tab-QFDhzzBZ.js.br +0 -0
- package/dist/web/assets/chat-tab-QFDhzzBZ.js.gz +0 -0
- package/dist/web/assets/code-editor-K-IN8VwJ.js.br +0 -0
- package/dist/web/assets/code-editor-K-IN8VwJ.js.gz +0 -0
- package/dist/web/assets/codex-sign-in-again-dialog-C8JvblLG.js +0 -1
- package/dist/web/assets/codex-sign-in-again-dialog-C8JvblLG.js.br +0 -0
- package/dist/web/assets/codex-sign-in-again-dialog-C8JvblLG.js.gz +0 -0
- package/dist/web/assets/conflict-editor-qMGJH0Bx.js.br +0 -0
- package/dist/web/assets/conflict-editor-qMGJH0Bx.js.gz +0 -0
- package/dist/web/assets/csv-preview-D2I742dl.js.br +0 -0
- package/dist/web/assets/csv-preview-D2I742dl.js.gz +0 -0
- package/dist/web/assets/database-viewer-Bz4LjgIa.js.br +0 -0
- package/dist/web/assets/database-viewer-Bz4LjgIa.js.gz +0 -0
- package/dist/web/assets/design-tab-C987MtMR.js.br +0 -0
- package/dist/web/assets/design-tab-C987MtMR.js.gz +0 -0
- package/dist/web/assets/designs-sidebar-panel-CapP1yXq.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-CapP1yXq.js.gz +0 -0
- package/dist/web/assets/diff-viewer-CdXi7cZN.js.br +0 -0
- package/dist/web/assets/diff-viewer-CdXi7cZN.js.gz +0 -0
- package/dist/web/assets/editor-language-service-Zle_PZV8.js.br +0 -0
- package/dist/web/assets/editor-language-service-Zle_PZV8.js.gz +0 -0
- package/dist/web/assets/explorer-body-DHMQR1Rk.js.br +0 -0
- package/dist/web/assets/explorer-body-DHMQR1Rk.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-Df40nQBk.js.br +0 -0
- package/dist/web/assets/explorer-window-content-Df40nQBk.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-B2nZzJ2b.js.br +0 -0
- package/dist/web/assets/extension-manager-section-B2nZzJ2b.js.gz +0 -0
- package/dist/web/assets/extension-webview-BGoDxkdF.js.br +0 -0
- package/dist/web/assets/extension-webview-BGoDxkdF.js.gz +0 -0
- package/dist/web/assets/files-settings-section-DC3OzzOl.js.br +0 -0
- package/dist/web/assets/files-settings-section-DC3OzzOl.js.gz +0 -0
- package/dist/web/assets/general-settings-section-i41W43ER.js.br +0 -0
- package/dist/web/assets/general-settings-section-i41W43ER.js.gz +0 -0
- package/dist/web/assets/git-log-panel-DHzPIkJg.js.br +0 -0
- package/dist/web/assets/git-log-panel-DHzPIkJg.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-Dj4vrDvj.js.br +0 -0
- package/dist/web/assets/glide-data-grid-Dj4vrDvj.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-DfwZb-fI.js.br +0 -0
- package/dist/web/assets/group-chat-tab-DfwZb-fI.js.gz +0 -0
- package/dist/web/assets/index-DMA-So69.css.br +0 -0
- package/dist/web/assets/index-jG9mLs-J.js.br +0 -0
- package/dist/web/assets/index-jG9mLs-J.js.gz +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-CxdGSNGr.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-CxdGSNGr.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-ok96IgnS.js.br +0 -0
- package/dist/web/assets/markdown-renderer-ok96IgnS.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-Cc03LUKy.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-Cc03LUKy.js.gz +0 -0
- package/dist/web/assets/new-design-dialog-Drkjb_LI.js.br +0 -0
- package/dist/web/assets/new-design-dialog-Drkjb_LI.js.gz +0 -0
- package/dist/web/assets/ppmbot-settings-section-C8PFlvaq.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-C8PFlvaq.js.gz +0 -0
- package/dist/web/assets/problems-panel-CFYO0Ro3.js.br +0 -0
- package/dist/web/assets/problems-panel-CFYO0Ro3.js.gz +0 -0
- package/dist/web/assets/process-table-BVeRguFg.js.br +0 -0
- package/dist/web/assets/process-table-BVeRguFg.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-BcHIEANE.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-BcHIEANE.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-BGsp0edA.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-BGsp0edA.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-DxkmF8qb.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-DxkmF8qb.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DMD0M9Jh.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DMD0M9Jh.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-CsZCCRJI.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-CsZCCRJI.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-DrHw_vwY.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-DrHw_vwY.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-Ci0O2Ng6.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-Ci0O2Ng6.js.gz +0 -0
- package/dist/web/assets/settings-body-B6JGOIYb.js.br +0 -0
- package/dist/web/assets/settings-body-B6JGOIYb.js.gz +0 -0
- package/dist/web/assets/sql-query-editor-4iCGE4h2.js.br +0 -3
- package/dist/web/assets/sql-query-editor-4iCGE4h2.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-CK6DulYk.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-CK6DulYk.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-J9JtvAWV.js.br +0 -0
- package/dist/web/assets/system-monitor-body-J9JtvAWV.js.gz +0 -0
- package/dist/web/assets/tab-host-window-content-CWBaWKjA.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-CWBaWKjA.js.gz +0 -0
- package/dist/web/assets/team-member-sheet-Br6mrxrw.js.br +0 -0
- package/dist/web/assets/team-member-sheet-Br6mrxrw.js.gz +0 -0
- package/dist/web/assets/team-member-window-content-CwCy7ZWf.js.br +0 -0
- package/dist/web/assets/team-member-window-content-CwCy7ZWf.js.gz +0 -0
- package/dist/web/assets/terminal-tab-BW14RpCb.js.br +0 -0
- package/dist/web/assets/terminal-tab-BW14RpCb.js.gz +0 -0
- package/dist/web/assets/tool-cards-CgOBEUnb.js.br +0 -0
- package/dist/web/assets/tool-cards-CgOBEUnb.js.gz +0 -0
- package/dist/web/assets/use-inline-blame-Bzjfru4n.js.br +0 -0
- package/dist/web/assets/use-inline-blame-Bzjfru4n.js.gz +0 -0
- package/dist/web/assets/use-lsp-hGdjL2hV.js.br +0 -0
- package/dist/web/assets/use-lsp-hGdjL2hV.js.gz +0 -0
- package/dist/web/assets/video-preview-P9T-ZVdN.js.br +0 -0
- package/dist/web/assets/video-preview-P9T-ZVdN.js.gz +0 -0
- package/packages/vscode-compat/node_modules/.bin/tsc.bunx +0 -0
- package/packages/vscode-compat/node_modules/.bin/tsc.exe +0 -0
- package/packages/vscode-compat/node_modules/.bin/tsserver.bunx +0 -0
- package/packages/vscode-compat/node_modules/.bin/tsserver.exe +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/markdown-renderer-
|
|
2
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-BHh12_0v.js";import{$r as r,An as i,Br as a,Dt as o,Fr as s,Jr as c,Lt as l,Qr as u,Tr as d,Yn as f,Z as p,_r as ee,at as te,bt as ne,ct as m,dt as re,gr as ie,ir as ae,j as oe,lt as se,nt as ce,pt as h,q as g,qr as _,r as v,rr as y,st as b,un as x,vt as le,w as ue,yt as S}from"./icons-CO_II6D-.js";import{t as de}from"./createLucideIcon-DBXq3G0e.js";import{i as fe,n as C}from"./api-client-c8YOpTlT.js";import{t as w}from"./settings-store-Br5c1efC.js";import{t as T}from"./preload-helper-BEFjQwLd.js";import{t as E}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import{t as pe}from"./panel-store-BUQ-CPsd.js";import"./window-store-B4cbZ5rr.js";import{i as me}from"./project-store-C5gJXkvb.js";import"./project-framework-store-XxFXcUpb.js";import{t as he}from"./tab-store-DqeaGhhE.js";import{o as ge}from"./file-store-D9KE0kQC.js";import{n as _e,t as ve}from"./use-is-mobile-BClDZJP5.js";import"./git-repo-store-DSypNj19.js";import{t as ye}from"./button-Ci9EUgqd.js";import{a as be,i as xe,n as Se,o as Ce,t as we}from"./dialog-B8clVkyi.js";import"./file-icons-gx_FBOXY.js";import{t as Te}from"./mobile-bottom-sheet-CuNi2FRv.js";import"./use-visual-viewport-BGpcMnIx.js";import"./fs-api-DL36slbd.js";import"./format-file-meta-mQwA6SuY.js";import{t as D}from"./input-CG8PS8mS.js";import"./scroll-area-XonvWYn_.js";import{C as Ee,Cn as De,S as Oe,Tn as ke,an as Ae,dn as O,fn as k,ft as je,hn as A,in as j,ln as M,mn as N,mt as P,on as F,pn as I,pt as Me,rn as Ne,sn as L,un as Pe,v as Fe,xt as Ie}from"./index-jG9mLs-J.js";import"./data-grid-types-CHD9-pon.js";import"./marked.esm-DDb9MclE.js";import{t as Le}from"./use-monaco-theme-rH6epJYA.js";import{n as Re,t as ze}from"./editor-font-BNwo7zo5.js";import{t as Be}from"./use-inline-blame-Bzjfru4n.js";import{n as Ve,r as He}from"./monaco-dotenv-language-Bwq3gQsi.js";import{i as Ue,n as We,r as Ge,t as Ke}from"./can-open-in-ppm-Bw_xiOXX.js";import{a as qe,i as Je,o as Ye,r as Xe,t as Ze}from"./glide-data-grid-Dj4vrDvj.js";var Qe=de(`file-braces`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1`,key:`1oajmo`}],[`path`,{d:`M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1`,key:`mpwhp6`}]]),R=e(t(),1),z=n();function $e({projectName:e,filePath:t,tabId:n,ready:r,children:i}){let a=(0,R.useRef)(null),o=he(e=>e.activeTabId);return(0,R.useEffect)(()=>{let i=()=>{if(!r||!e||!t||!n||o!==n)return;let i=!!a.current?.checkVisibility({checkOpacity:!0,checkVisibilityCSS:!0});i&&Ie({type:`file-ready`,projectName:e,tabId:n,visible:i,isRunDocument:/^readme(?:\.[^/\\]+)?$/i.test(t.split(/[/\\]/).pop()??``)})};return i(),window.addEventListener(`ppm:onboarding-refresh`,i),()=>window.removeEventListener(`ppm:onboarding-refresh`,i)},[e,t,n,r,o]),(0,z.jsx)(`div`,{ref:a,className:`flex flex-1 min-h-0 flex-col`,children:i})}var et=[`completionItems`,`hovers`,`documentSymbols`,`definitions`,`references`,`documentHighlights`,`rename`,`diagnostics`,`documentRangeFormattingEdits`,`signatureHelp`,`onTypeFormattingEdits`,`codeActions`,`inlayHints`];function tt(e){return Object.fromEntries(et.map(t=>[t,e]))}var nt=tt(!1),rt=tt(!0),B={noSemanticValidation:!0,noSyntaxValidation:!0,noSuggestionDiagnostics:!0},it=1;function at(e,t){for(let n of[e,t])n.setModeConfiguration({...nt}),n.setDiagnosticsOptions({...B})}function V(e,t){for(let n of[e,t])n.setCompilerOptions({...n.getCompilerOptions(),jsx:it,allowJs:!0,allowNonTsExtensions:!0}),n.setModeConfiguration({...rt}),n.setDiagnosticsOptions({...B})}function ot(e,t,n){e?at(t,n):V(t,n)}function st({enabled:e,onToggle:t,status:n,diagnostics:i}){let[a,o]=(0,R.useState)(!1),s=_e();if(!e)return(0,z.jsxs)(`button`,{type:`button`,onClick:()=>t(!0),title:`Language server: off. Turn it on for completions, hover, go to definition, rename and quick fix from a real server. It runs as a process on the host.`,className:`flex items-center gap-1 rounded px-1.5 text-xs text-muted-foreground hover:bg-muted active:scale-95 transition-colors ${s?`min-h-11`:`py-0.5`}`,children:[(0,z.jsx)(r,{className:`size-3 shrink-0`}),(0,z.jsx)(`span`,{children:`LSP off`})]});if(!n)return null;let c=i.filter(e=>e.severity===1).length,l=i.filter(e=>e.severity===2).length,d=n.state===`ready`?n.server.displayName:n.state===`opening`?`Starting…`:n.server?.displayName??`No server`,f=n.state===`unavailable`&&n.reason===`not-installed`;return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(`button`,{type:`button`,onClick:()=>o(!0),title:n.state===`ready`?`${n.server.displayName} — rooted at ${n.server.rootPath}`:n.state===`unavailable`?n.message:`Starting the language server`,className:`flex items-center gap-1 rounded px-1.5 hover:bg-muted active:scale-95 transition-colors text-xs ${s?`min-h-11`:`py-0.5`} ${f?`text-amber-500`:`text-muted-foreground`}`,children:[n.state===`opening`?(0,z.jsx)(x,{className:`size-3 animate-spin shrink-0`}):f?(0,z.jsx)(v,{className:`size-3 shrink-0`}):(0,z.jsx)(u,{className:`size-3 shrink-0`}),(0,z.jsx)(`span`,{className:`max-w-24 truncate`,children:d}),c>0&&(0,z.jsx)(`span`,{className:`text-red-500`,children:c}),c===0&&l>0&&(0,z.jsx)(`span`,{className:`text-amber-500`,children:l})]}),a&&(0,z.jsx)(H,{status:n,errors:c,warnings:l,isMobile:s,onToggle:t,onClose:()=>o(!1)})]})}function H({status:e,errors:t,warnings:n,isMobile:r,onToggle:i,onClose:a}){let o=(0,z.jsx)(ct,{status:e,errors:t,warnings:n,isMobile:r,onToggle:i});return r?(0,z.jsx)(Te,{open:!0,onClose:a,className:`popover-solid max-h-[85dvh] flex flex-col`,children:o}):(0,z.jsx)(we,{open:!0,onOpenChange:e=>!e&&a(),children:(0,z.jsxs)(Se,{className:`sm:max-w-lg`,children:[(0,z.jsx)(Ce,{children:`Language server`}),o]})})}function ct({status:e,errors:t,warnings:n,isMobile:r,onToggle:i}){return(0,z.jsxs)(`div`,{className:`p-4 space-y-4 overflow-y-auto text-sm leading-relaxed`,children:[e.state===`ready`&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(lt,{label:`Server`,value:e.server.displayName}),(0,z.jsx)(lt,{label:`Language`,value:e.languageId}),(0,z.jsx)(lt,{label:`Project root`,value:e.server.rootPath,mono:!0}),(0,z.jsx)(lt,{label:`Problems`,value:`${t} error${t===1?``:`s`}, ${n} warning${n===1?``:`s`}`}),(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Completions, hover, go to definition (F12), find references (Shift+F12), rename (F2), quick fix (Ctrl+.) and format (Shift+Alt+F) all come from this server.`})]}),e.state===`opening`&&(0,z.jsx)(`p`,{className:`text-muted-foreground`,children:`Starting the language server. A cold start reads the project's dependencies, so the first completion in a large project can take a few seconds.`}),e.state===`unavailable`&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(`p`,{children:e.message}),e.server&&(0,z.jsxs)(`div`,{className:`space-y-2`,children:[(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Install it, then reopen this file. PPM does not install it for you — that would mean fetching and running a binary because you opened a file.`}),(0,z.jsx)(ut,{command:e.server.installHint,isMobile:r})]}),e.reason===`no-language`&&(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No language server is registered for this file type.`})]}),(0,z.jsxs)(`div`,{className:`flex items-center justify-between gap-3 border-t border-border pt-3`,children:[(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`p`,{className:`text-xs font-medium`,children:`Language server`}),(0,z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`On for this device. Turning it off stops the process.`})]}),(0,z.jsx)(je,{checked:!0,onCheckedChange:e=>i(e)})]})]})}function lt({label:e,value:t,mono:n}){return(0,z.jsxs)(`div`,{className:`flex gap-2 items-baseline`,children:[(0,z.jsx)(`span`,{className:`text-muted-foreground shrink-0 w-24 text-xs`,children:e}),(0,z.jsx)(`span`,{className:`min-w-0 break-all ${n?`font-mono text-xs`:``}`,children:t})]})}function ut({command:e,isMobile:t}){let[n,r]=(0,R.useState)(!1);return(0,z.jsxs)(`button`,{type:`button`,onClick:()=>{navigator.clipboard?.writeText(e).then(()=>{r(!0),setTimeout(()=>r(!1),1500)})},className:`w-full flex items-center gap-2 rounded border border-border bg-muted/40 px-3 text-left font-mono text-xs hover:bg-muted active:scale-[0.99] transition ${t?`min-h-11 py-3`:`py-2`}`,children:[(0,z.jsx)(`span`,{className:`flex-1 break-all`,children:e}),n?(0,z.jsx)(ue,{className:`size-3.5 shrink-0 text-green-500`}):(0,z.jsx)(ce,{className:`size-3.5 shrink-0 opacity-60`})]})}function dt(e){let t=e.startsWith(`/`),n=e.split(/[/\\]/).filter(Boolean),r=e=>{let r=(t?`/`:``)+n.slice(0,e+1).join(`/`);return/^[A-Za-z]:$/.test(r)?r+`/`:r},i=t?`/`:(n[0]??``)+`/`;return n.map((e,t)=>({name:e,absPath:r(t),parentDir:t>0?r(t-1):i}))}async function ft(e){return(await C.get(`/api/fs/browse?path=${encodeURIComponent(e)}`)).entries}function pt({filePath:e,projectName:t,tabId:n,className:r}){let{updateTab:i,openTab:a}=he(Ne(e=>({updateTab:e.updateTab,openTab:e.openTab}))),o=(0,R.useRef)(null),s=(0,R.useMemo)(()=>dt(e),[e]);(0,R.useEffect)(()=>{o.current&&(o.current.scrollLeft=o.current.scrollWidth)},[s]);let c=(0,R.useCallback)((e,r)=>{let o=E(e),s={filePath:e,projectName:t};r.metaKey||r.ctrlKey?a({type:`editor`,title:o,metadata:s,projectId:t,closable:!0}):i(n,{title:o,metadata:s})},[t,n,a,i]);return(0,z.jsx)(`div`,{ref:o,className:r,children:s.map((e,t)=>(0,z.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[t>0&&(0,z.jsx)(oe,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,z.jsx)(mt,{segment:e,isLast:t===s.length-1,onFileClick:c})]},e.absPath))})}function mt({segment:e,isLast:t,onFileClick:n}){let[r,i]=(0,R.useState)(null),[a,o]=(0,R.useState)(null);function s(t){t&&r===null&&ft(e.parentDir).then(i).catch(e=>{o(e.message||`Failed to browse`),i([])})}return(0,z.jsxs)(j,{onOpenChange:s,children:[(0,z.jsx)(A,{asChild:!0,children:(0,z.jsx)(`button`,{type:`button`,className:`text-xs px-1 py-0.5 rounded hover:bg-muted transition-colors truncate max-w-[120px] ${t?`text-foreground font-medium`:`text-muted-foreground`}`,children:e.name})}),(0,z.jsx)(F,{align:`start`,className:`max-h-[300px] overflow-y-auto p-1`,children:r===null?(0,z.jsx)(L,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):a?(0,z.jsx)(L,{disabled:!0,className:`text-xs text-destructive`,children:a}):r.length===0?(0,z.jsx)(L,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Empty`}):r.map(t=>(0,z.jsx)(ht,{entry:t,activePath:e.absPath,onFileClick:n},t.path))})]})}function ht({entry:e,activePath:t,onFileClick:n}){let r=W(e.name,e.type===`directory`),i=e.path===t,[a,o]=(0,R.useState)(null);if(e.type===`directory`){function s(t){t&&a===null&&ft(e.path).then(o).catch(()=>o([]))}return(0,z.jsxs)(k,{onOpenChange:s,children:[(0,z.jsxs)(N,{className:`text-xs gap-1.5 ${i?`bg-muted`:``}`,children:[(0,z.jsx)(r,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,z.jsx)(`span`,{className:`truncate`,children:e.name})]}),(0,z.jsx)(I,{className:`max-h-[300px] overflow-y-auto p-1`,children:a===null?(0,z.jsx)(L,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):a.length===0?(0,z.jsx)(L,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Empty`}):a.map(e=>(0,z.jsx)(ht,{entry:e,activePath:t,onFileClick:n},e.path))})]})}return(0,z.jsxs)(L,{className:`text-xs gap-1.5 cursor-pointer ${i?`bg-muted`:``}`,onClick:t=>n(e.path,t),children:[(0,z.jsx)(r,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,z.jsx)(`span`,{className:`truncate`,children:e.name})]})}var U={ts:h,tsx:h,js:h,jsx:h,py:h,rs:h,go:h,html:h,css:h,scss:h,json:Qe,md:le,txt:le,yaml:S,yml:S};function W(e,t){return t?o:U[e.split(`.`).pop()?.toLowerCase()??``]??re}function gt(e,t){let n=[],r=e,i=``;for(let e=0;e<t.length;e++){let a=t[e],o=t.slice(0,e+1).join(`/`),s=r.find(e=>e.name===a);if(n.push({name:a,fullPath:o,node:s??null,siblings:r,parentPath:i}),s?.children)i=s.path,r=s.children;else{for(let r=e+1;r<t.length;r++)n.push({name:t[r],fullPath:t.slice(0,r+1).join(`/`),node:null,siblings:[],parentPath:t.slice(0,r).join(`/`)});break}}return n}function G(e){return[...e].sort((e,t)=>e.type===t.type?e.name.localeCompare(t.name):e.type===`directory`?-1:1)}function _t({filePath:e,projectName:t,tabId:n,className:r}){let i=ge(e=>e.tree),{updateTab:a,openTab:o}=he(Ne(e=>({updateTab:e.updateTab,openTab:e.openTab}))),s=me(e=>e.projects.find(e=>e.name===t)?.path??``),c=(0,R.useRef)(null),{prefixParts:l,relativePath:u,isExternal:d}=(0,R.useMemo)(()=>{let t=e.startsWith(`/`)?e.slice(1):e,n=s.startsWith(`/`)?s.slice(1):s;if(n&&t.startsWith(n+`/`)){let e=t.slice(n.length+1);return{prefixParts:n.split(`/`),relativePath:e,isExternal:!1}}return{prefixParts:[],relativePath:t,isExternal:/^(\/|[A-Za-z]:[/\\])/.test(e)}},[e,s]),f=(0,R.useMemo)(()=>gt(i,u.split(`/`).filter(Boolean)),[i,u]);(0,R.useEffect)(()=>{c.current&&(c.current.scrollLeft=c.current.scrollWidth)},[f]);function p(e,r){let i=E(e);r.metaKey||r.ctrlKey?o({type:`editor`,title:i,metadata:{filePath:e,projectName:t},projectId:t,closable:!0}):a(n,{title:i,metadata:{filePath:e,projectName:t}})}return d?(0,z.jsx)(pt,{filePath:e,projectName:t,tabId:n,className:r}):(0,z.jsxs)(`div`,{ref:c,className:r,children:[l.map((e,t)=>(0,z.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[t>0&&(0,z.jsx)(oe,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,z.jsx)(`span`,{className:`text-xs text-muted-foreground px-1 py-0.5`,children:e})]},`prefix-${t}`)),f.map((e,n)=>(0,z.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[(n>0||l.length>0)&&(0,z.jsx)(oe,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,z.jsx)(K,{segment:e,isLast:n===f.length-1,projectName:t,onFileClick:p})]},e.fullPath))]})}function K({segment:e,isLast:t,projectName:n,onFileClick:r}){let i=ge(e=>e.loadChildren),a=ge(e=>e.loadedPaths),o=(0,R.useMemo)(()=>G(e.siblings),[e.siblings]),s=a.has(e.parentPath);function c(t){if(t&&!s){let t=e.parentPath.split(`/`).filter(Boolean);(async()=>{for(let e=0;e<=t.length;e++)await i(n,t.slice(0,e).join(`/`))})()}}return(0,z.jsxs)(j,{onOpenChange:c,children:[(0,z.jsx)(A,{asChild:!0,children:(0,z.jsx)(`button`,{type:`button`,className:`text-xs px-1 py-0.5 rounded hover:bg-muted transition-colors truncate max-w-[120px] ${t?`text-foreground font-medium`:`text-muted-foreground`}`,children:e.name})}),(0,z.jsx)(F,{align:`start`,className:`max-h-[300px] p-1`,children:o.length===0?(0,z.jsx)(L,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):o.map(t=>(0,z.jsx)(q,{node:t,projectName:n,activePath:e.fullPath,onFileClick:r},t.path))})]})}function q({node:e,projectName:t,activePath:n,onFileClick:r}){let i=W(e.name,e.type===`directory`),a=e.path===n,o=ge(e=>e.loadChildren),s=ge(e=>e.loadedPaths);if(e.type===`directory`){let c=e.children??[],l=s.has(e.path);function u(n){n&&!l&&o(t,e.path)}return(0,z.jsxs)(k,{onOpenChange:u,children:[(0,z.jsxs)(N,{className:`text-xs gap-1.5 ${a?`bg-muted`:``}`,children:[(0,z.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,z.jsx)(`span`,{className:`truncate`,children:e.name})]}),(0,z.jsx)(I,{className:`max-h-[300px] overflow-y-auto p-1`,children:c.length===0?(0,z.jsx)(L,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):G(c).map(e=>(0,z.jsx)(q,{node:e,projectName:t,activePath:n,onFileClick:r},e.path))})]})}return(0,z.jsxs)(L,{className:`text-xs gap-1.5 cursor-pointer ${a?`bg-muted`:``}`,onSelect:e=>{},onClick:t=>{r(e.path,t)},children:[(0,z.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,z.jsx)(`span`,{className:`truncate`,children:e.name})]})}function J({active:e,onClick:t,icon:n,label:r,title:i}){return(0,z.jsxs)(`button`,{type:`button`,title:i,onClick:t,className:`flex items-center gap-1 px-2 py-1 rounded text-xs transition-colors ${e?`bg-muted text-foreground`:`text-muted-foreground hover:text-foreground`}`,children:[(0,z.jsx)(n,{className:`size-3`}),(0,z.jsx)(`span`,{className:`hidden sm:inline`,children:r})]})}function vt({ext:e,mdMode:t,onMdModeChange:n,csvMode:r,onCsvModeChange:i,wordWrap:o,onToggleWordWrap:s,inlineBlame:c,onToggleInlineBlame:l,blameStale:u,onRefresh:f,refreshing:ee,filePath:te,projectName:ne,className:m}){return(0,z.jsxs)(`div`,{className:m,children:[(e===`md`||e===`mdx`)&&n&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(J,{active:t===`edit`,onClick:()=>n(`edit`),icon:p,label:`Edit`}),(0,z.jsx)(J,{active:t===`preview`,onClick:()=>n(`preview`),icon:se,label:`Preview`})]}),e===`csv`&&i&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(J,{active:r===`table`,onClick:()=>i(`table`),icon:d,label:`Table`}),(0,z.jsx)(J,{active:r===`raw`,onClick:()=>i(`raw`),icon:p,label:`Raw`})]}),(0,z.jsx)(J,{active:o,onClick:s,icon:_,label:`Wrap`}),l&&(0,z.jsx)(J,{active:c===!0,onClick:l,icon:a,label:`Blame`,title:c&&u?`Blame is hidden until this file is saved — the line numbers have moved`:`Inline blame (Alt+B)`}),f&&(0,z.jsxs)(`button`,{type:`button`,onClick:f,disabled:ee,title:`Reload file from disk`,className:`flex items-center gap-1 px-2 py-1 rounded text-xs text-muted-foreground hover:text-foreground transition-colors disabled:opacity-50`,children:[(0,z.jsx)(ae,{className:`size-3 ${ee?`animate-spin`:``}`}),(0,z.jsx)(`span`,{className:`hidden sm:inline`,children:`Refresh`})]}),te&&ne&&(0,z.jsx)(J,{active:!1,onClick:()=>De(ne,te),icon:b,label:`Download`})]})}function yt({filePath:e,projectName:t,revision:n}){let[r,i]=(0,R.useState)(),[a,o]=(0,R.useState)();return(0,R.useEffect)(()=>{let n=new AbortController;i(void 0),o(void 0);let r=setTimeout(()=>n.abort(Error(`Preview request timed out. Try Refresh.`)),3e4),a=!0;return C.post(`/api/html-preview`,{filePath:e,projectName:t},{signal:n.signal}).then(e=>{a&&i(e.url)}).catch(e=>{a&&o(e instanceof Error?e.message:`Could not open HTML preview`)}).finally(()=>clearTimeout(r)),()=>{a=!1,clearTimeout(r),n.abort()}},[e,t,n]),a?(0,z.jsxs)(`div`,{role:`alert`,className:`p-4 text-sm text-destructive`,children:[a,`. Use Refresh to retry.`]}):r?(0,z.jsx)(`iframe`,{title:`HTML preview`,src:r,sandbox:`allow-scripts`,referrerPolicy:`no-referrer`,className:`flex-1 min-h-0 w-full border-0 bg-white`}):(0,z.jsxs)(`div`,{role:`status`,className:`flex flex-1 items-center justify-center gap-2 text-sm text-muted-foreground`,children:[(0,z.jsx)(x,{className:`size-5 animate-spin`}),`Loading preview…`]})}var bt=[{id:`plaintext`,label:`Plain Text`},{id:`javascript`,label:`JavaScript`},{id:`typescript`,label:`TypeScript`},{id:`sql`,label:`SQL`},{id:`json`,label:`JSON`},{id:`xml`,label:`XML`},{id:`html`,label:`HTML`},{id:`css`,label:`CSS`},{id:`python`,label:`Python`},{id:`markdown`,label:`Markdown`},{id:`yaml`,label:`YAML`},{id:`shell`,label:`Shell`},{id:`dotenv`,label:`Dotenv`}];function xt({value:e,onChange:t}){return(0,z.jsxs)(`div`,{className:`shrink-0 flex items-center gap-1 px-2 border-l border-border`,children:[(0,z.jsx)(h,{className:`size-3 text-muted-foreground`}),(0,z.jsx)(`select`,{value:e,onChange:e=>t(e.target.value),className:`h-5 text-[10px] bg-transparent border border-border rounded px-1 text-foreground outline-none max-w-[120px]`,title:`Select editor language`,children:bt.map(e=>(0,z.jsx)(`option`,{value:e.id,children:e.label},e.id))})]})}var Y=`flex items-center justify-center gap-1.5 rounded px-2 min-h-11 min-w-11 md:min-h-7 md:min-w-7 text-xs text-muted-foreground hover:text-foreground hover:bg-muted`,St=`min-h-11 md:min-h-8 px-2`,Ct=`${St} pr-8 [&>span]:left-auto [&>span]:right-2`;function wt(e){let{mode:t,onModeChange:n,onRefresh:r,unsaved:o,breadcrumb:s}=e;return(0,z.jsxs)(`div`,{className:`flex items-center gap-2 md:gap-1 border-b border-border bg-background px-2 shrink-0 h-12 md:h-8`,role:`toolbar`,"aria-label":`HTML preview`,children:[(0,z.jsx)(`div`,{className:`hidden md:flex flex-1 min-w-0 overflow-hidden`,children:s}),t===`preview`&&(0,z.jsx)(`button`,{type:`button`,onClick:r,title:`Reload the original HTML file`,"aria-label":`Refresh preview`,className:Y,children:(0,z.jsx)(ae,{className:`size-4`})}),[[`edit`,`Code`,p],[`preview`,`Preview`,se]].map(([e,r,i])=>(0,z.jsxs)(`button`,{type:`button`,"aria-pressed":t===e,onClick:()=>n(e),className:`${Y} ${t===e?`bg-muted text-foreground`:``}`,children:[(0,z.jsx)(i,{className:`size-3.5`}),r]},e)),o&&(0,z.jsx)(`span`,{role:`status`,title:`Preview uses the saved file`,"aria-label":`Preview uses the saved file`,className:`text-amber-500 text-xs`,children:`●`}),(0,z.jsxs)(j,{children:[(0,z.jsx)(A,{asChild:!0,children:(0,z.jsx)(`button`,{type:`button`,title:`More HTML actions`,"aria-label":`More HTML actions`,className:`${Y} ml-auto md:ml-0`,children:(0,z.jsx)(i,{className:`size-4`})})}),(0,z.jsxs)(F,{align:`end`,className:`w-52`,children:[t===`edit`&&(0,z.jsxs)(L,{className:St,disabled:o||e.refreshing,onSelect:e.onReloadCode,children:[(0,z.jsx)(ae,{}),`Reload code from disk`]}),(0,z.jsxs)(L,{className:St,onSelect:()=>void De(e.projectName??``,e.filePath),children:[(0,z.jsx)(b,{}),`Download`]}),(0,z.jsx)(O,{}),(0,z.jsxs)(Ae,{className:Ct,checked:e.wordWrap,onCheckedChange:e.onToggleWordWrap,children:[(0,z.jsx)(_,{className:`size-4 text-muted-foreground`}),`Word wrap`]}),e.onToggleInlineBlame&&(0,z.jsxs)(Ae,{className:Ct,checked:e.inlineBlame,onCheckedChange:e.onToggleInlineBlame,children:[(0,z.jsx)(a,{className:`size-4 text-muted-foreground`}),`Inline blame`]}),e.onToggleLsp&&(0,z.jsxs)(Ae,{className:Ct,checked:e.lspEnabled,onCheckedChange:e.onToggleLsp,children:[(0,z.jsx)(u,{className:`size-4 text-muted-foreground`}),`Language server`]}),(0,z.jsxs)(k,{children:[(0,z.jsxs)(N,{className:`${St} gap-2`,children:[(0,z.jsx)(h,{className:`size-4 text-muted-foreground`}),`Editor language`]}),(0,z.jsx)(I,{className:`max-h-80 overflow-y-auto`,children:(0,z.jsx)(M,{value:e.language,onValueChange:e.onLanguageChange,children:bt.map(e=>(0,z.jsx)(Pe,{className:`min-h-11 md:min-h-8`,value:e.id,children:e.label},e.id))})})]})]})]})]})}function Tt({open:e,defaultName:t,content:n,onSave:r,onCancel:i}){let[a,o]=(0,R.useState)(t),[s,c]=(0,R.useState)(!1),[l,u]=(0,R.useState)(``),d=me(e=>e.activeProject),f=(0,R.useCallback)(()=>{let e=a.trim();if(!e){u(`Filename cannot be empty`);return}if(/[/\\]/.test(e)){u(`Filename cannot contain / or \\`);return}u(``),c(!0)},[a]),p=(0,R.useCallback)(e=>{let t=e.includes(`\\`)?`\\`:`/`;r(e.endsWith(t)?`${e}${a.trim()}`:`${e}${t}${a.trim()}`,n)},[a,n,r]);return s?(0,z.jsx)(P,{open:!0,mode:`folder`,root:d?.path,title:`Save "${a.trim()}" to...`,onSelect:p,onCancel:()=>c(!1)}):(0,z.jsx)(we,{open:e,onOpenChange:e=>{e||i()},children:(0,z.jsxs)(Se,{className:`sm:max-w-md`,children:[(0,z.jsx)(be,{children:(0,z.jsx)(Ce,{children:`Save As`})}),(0,z.jsxs)(`div`,{className:`flex flex-col gap-2 py-2`,children:[(0,z.jsx)(`label`,{className:`text-sm text-muted-foreground`,children:`Filename`}),(0,z.jsx)(D,{value:a,onChange:e=>{o(e.target.value),u(``)},onKeyDown:e=>{e.key===`Enter`&&f()},placeholder:`e.g. my-file.ts`,autoFocus:!0}),l&&(0,z.jsx)(`p`,{className:`text-xs text-destructive`,children:l})]}),(0,z.jsxs)(xe,{children:[(0,z.jsx)(ye,{variant:`outline`,onClick:i,children:`Cancel`}),(0,z.jsx)(ye,{onClick:f,children:`Choose Folder...`})]})]})})}var Et=typeof window<`u`&&window.isSecureContext,X=[`(`,`)`,`{`,`}`,`[`,`]`,`<`,`>`,`;`,`:`,`=`,`"`,`'`,"`",`/`,`\\`,`_`,`#`],Z=`px-2 py-1.5 rounded text-xs min-w-[36px] min-h-[32px] bg-surface-elevated text-text-primary active:bg-primary active:text-primary-foreground transition-colors select-none`,Dt=`px-3 py-1.5 rounded text-xs font-mono min-w-[36px] min-h-[32px] bg-surface-elevated text-text-primary active:bg-primary active:text-primary-foreground transition-colors select-none`,Ot=`w-px h-5 bg-border mx-0.5 shrink-0`;function kt({editorRef:e,readOnly:t,wrapOn:n,onToggleWrap:r}){let i=(0,R.useCallback)(()=>e.current,[e]),a=(0,R.useCallback)(e=>{let t=i();if(!t)return;t.focus();let n=t.getSelection();n&&t.executeEdits(`mobile-toolbar`,[{range:n,text:e}])},[i]),[o,l]=(0,R.useState)(!1),u=(0,R.useRef)(null),d=(0,R.useCallback)(async()=>{try{let e=await navigator.clipboard.readText();e&&a(e)}catch{}},[a]),f=(0,R.useCallback)(()=>{l(!0),requestAnimationFrame(()=>u.current?.focus())},[]),p=(0,R.useCallback)(e=>{e.preventDefault();let t=e.clipboardData.getData(`text/plain`);t&&(l(!1),a(t))},[a]),ee=(0,R.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`undo`,null))},[i]),te=(0,R.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`redo`,null))},[i]),ne=(0,R.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`tab`,null))},[i]);return t?null:(0,z.jsxs)(`div`,{className:`shrink-0 border-t border-border bg-surface`,children:[!Et&&o&&(0,z.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1.5 border-b border-border bg-muted/50`,children:[(0,z.jsx)(`textarea`,{ref:u,onPaste:p,placeholder:`Long-press here → Paste`,className:`flex-1 h-8 rounded border border-border bg-background text-foreground text-xs px-2 py-1.5 resize-none focus:outline-none focus:ring-1 focus:ring-primary`}),(0,z.jsx)(`button`,{type:`button`,onClick:()=>l(!1),className:`p-1.5 rounded text-muted-foreground active:bg-muted transition-colors`,children:(0,z.jsx)(c,{size:14})})]}),(0,z.jsxs)(`div`,{className:`flex items-center gap-1 px-2 py-1.5 overflow-x-auto`,children:[(0,z.jsx)(`button`,{type:`button`,onClick:Et?d:f,className:Z,title:`Paste`,children:(0,z.jsx)(g,{size:14})}),(0,z.jsx)(`button`,{type:`button`,onClick:ee,className:Z,title:`Undo`,children:(0,z.jsx)(s,{size:14})}),(0,z.jsx)(`button`,{type:`button`,onClick:te,className:Z,title:`Redo`,children:(0,z.jsx)(y,{size:14})}),(0,z.jsx)(`button`,{type:`button`,onClick:r,className:`${Z} ${n?`text-primary`:``}`,title:n?`Wrapping long lines — tap to scroll sideways instead`:`Wrap long lines`,children:(0,z.jsx)(_,{size:14})}),(0,z.jsx)(`div`,{className:Ot}),(0,z.jsx)(`button`,{type:`button`,onClick:ne,className:Dt,children:`Tab`}),(0,z.jsx)(`div`,{className:Ot}),X.map(e=>(0,z.jsx)(`button`,{type:`button`,onClick:()=>a(e),className:Dt,children:e},e))]})]})}var At=(0,R.lazy)(()=>T(()=>import(`./markdown-renderer-DJ9EVU1B.js`).then(e=>({default:e.MarkdownRenderer})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41]))),jt=(0,R.lazy)(()=>T(()=>import(`./editor-language-service-Zle_PZV8.js`).then(e=>({default:e.EditorLanguageService})),__vite__mapDeps([42,2,1,3,10,43,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39]))),Mt=(0,R.lazy)(()=>T(()=>import(`./csv-preview-D2I742dl.js`).then(e=>({default:e.CsvPreview})),__vite__mapDeps([44,2,5,6,1,3,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,45,46]))),Nt=(0,R.lazy)(()=>T(()=>import(`./image-preview-CGdZrmLo.js`).then(e=>({default:e.ImagePreview})),__vite__mapDeps([47,1,2,3,10,48,20]))),Pt=(0,R.lazy)(()=>T(()=>import(`./pdf-preview-qdXmMkOR.js`).then(e=>({default:e.PdfPreview})),__vite__mapDeps([49,2,1,3,10,20]))),Ft=(0,R.lazy)(()=>T(()=>import(`./video-preview-P9T-ZVdN.js`).then(e=>({default:e.VideoPreview})),__vite__mapDeps([50,2,5,6,1,3,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,51,52]))),It=(0,R.lazy)(()=>T(()=>import(`./audio-preview-vaG2cB-k.js`).then(e=>({default:e.AudioPreview})),__vite__mapDeps([53,2,1,3,8,10,20,52]))),Lt=(0,R.lazy)(()=>T(()=>import(`./docx-preview-C9XdKEj1.js`).then(e=>({default:e.DocxPreview})),__vite__mapDeps([54,2,1,3,10,20])));function Rt(e){return e.split(`.`).pop()?.toLowerCase()??``}function zt(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`,sql:`sql`}[Rt(e)]??(Ve(e)?`dotenv`:`plaintext`)}var Bt=(0,R.memo)(function({metadata:e,tabId:t}){let n=e?.filePath,r=e?.projectName,i=e?.inlineContent,a=e?.inlineLanguage,[o,s]=(0,R.useState)(i??null),[c,l]=(0,R.useState)(`utf-8`),[u,d]=(0,R.useState)(!0),[p,m]=(0,R.useState)(null),[re,ae]=(0,R.useState)(null),oe=he(e=>e.activeTabId),[se,ce]=(0,R.useState)(0);(0,R.useEffect)(()=>{let e=()=>ce(e=>e+1);return window.addEventListener(`ppm:onboarding-refresh`,e),()=>window.removeEventListener(`ppm:onboarding-refresh`,e)},[]);let[h,g]=(0,R.useState)(!1),_=(0,R.useRef)(null),v=(0,R.useRef)(``),y=(0,R.useRef)(null),[b,le]=(0,R.useState)(null),{tabs:ue,updateTab:S}=he(Ne(e=>({tabs:e.tabs,updateTab:e.updateTab}))),{wordWrap:de,toggleWordWrap:me,mobileWordWrap:ge,toggleMobileWordWrap:ye}=w(Ne(e=>({wordWrap:e.wordWrap,toggleWordWrap:e.toggleWordWrap,mobileWordWrap:e.mobileWordWrap,toggleMobileWordWrap:e.toggleMobileWordWrap}))),be=w(e=>e.inlineBlame),xe=w(e=>e.toggleInlineBlame),Se=w(e=>e.lspEnabled),Ce=w(e=>e.setLspEnabled),we=_e(),Te=Fe(),D=we?ge:de,De=we?ye:me,Ae=Le(),O=e?.isUntitled===!0,k=e?.unsavedContent,[je,A]=(0,R.useState)(!1),j=ue.find(e=>e.id===t),M=n?Rt(n):``,N=We.has(M),P=M===`pdf`,F=M===`docx`,I=Ue.has(M),L=Ke.has(M),Pe=Ge.has(M),Ve=M===`md`||M===`mdx`,Ze=(M===`html`||M===`htm`)&&!O&&i==null,[Qe,$e]=(0,R.useState)(`preview`),[et,tt]=(0,R.useState)(0),[nt,rt]=(0,R.useState)(!1),B=Ze&&Qe===`preview`,it=M===`csv`,at=e?.language,V=a??at??zt(n??``),H=V===`sql`,[ct,lt]=(0,R.useState)(`preview`),[ut,dt]=(0,R.useState)(`table`),{connections:ft,cachedTables:pt,refreshTables:mt,updateConnection:ht}=Me(),U=n?`ppm:sql-conn:${n}`:t?`ppm:sql-conn:tab:${t}`:null,[W,gt]=(0,R.useState)(()=>{if(!U)return null;let e=localStorage.getItem(U);return e?Number(e):null}),G=(0,R.useRef)(null),K=(0,R.useRef)(null),q=(0,R.useMemo)(()=>ft.find(e=>e.id===W)??null,[ft,W]),J=i!=null&&(a===`json`||a===`xml`),[bt,Y]=(0,R.useState)(!1),St=(0,R.useCallback)(()=>{if(i)if(bt)s(i),Y(!1);else{let e=i.trimStart();if(a===`json`)try{s(JSON.stringify(JSON.parse(e),null,2)),Y(!0)}catch{}else if(a===`xml`){let t=0;s(e.replace(/(>)(<)(\/*)/g,`$1
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/markdown-renderer-vDNuKjel.js","assets/vendor-ui-BHh12_0v.js","assets/rolldown-runtime-C5c2KzVm.js","assets/vendor-markdown-QKPNiWEd.js","assets/markdown-renderer-BHtYqkYZ.js","assets/index-C8nGqkKN.js","assets/preload-helper-BEFjQwLd.js","assets/button-Ci9EUgqd.js","assets/utils-btZ8C8-R.js","assets/createLucideIcon-DBXq3G0e.js","assets/api-client-c8YOpTlT.js","assets/react-CzUPVyyG.js","assets/settings-store-Br5c1efC.js","assets/file-store-D9KE0kQC.js","assets/window-store-B4cbZ5rr.js","assets/window-pip-registry-BQ6LSr6d.js","assets/panel-store-BUQ-CPsd.js","assets/onboarding-quick-orientation-DIhWv1CN.js","assets/dialog-B8clVkyi.js","assets/portal-container-context-NFSuymMu.js","assets/icons-CO_II6D-.js","assets/use-is-mobile-BClDZJP5.js","assets/format-file-meta-mQwA6SuY.js","assets/fs-api-DL36slbd.js","assets/context-menu-CjYTq8DI.js","assets/input-CG8PS8mS.js","assets/mobile-bottom-sheet-CuNi2FRv.js","assets/use-visual-viewport-BGpcMnIx.js","assets/scroll-area-XonvWYn_.js","assets/chat-preparation-cache-BSIQGiWx.js","assets/file-icons-gx_FBOXY.js","assets/project-framework-store-XxFXcUpb.js","assets/format-date-BMtvCeb9.js","assets/git-repo-store-DSypNj19.js","assets/project-store-C5gJXkvb.js","assets/ws-auth-kXgsX2Js.js","assets/tab-store-DqeaGhhE.js","assets/apply-theme-Cc_cmrD5.js","assets/resolve-theme-STMsK2vc.js","assets/index-DvClbTQx.css","assets/image-gallery-DC3gRAqk.js","assets/run-in-terminal-HIdNgYim.js","assets/editor-language-service-fPG56hQO.js","assets/use-lsp-71azTXQz.js","assets/csv-preview-BioxkrQF.js","assets/lib-BY5fb-Cz.js","assets/csv-parser-DcRWxcNV.js","assets/image-preview-CGdZrmLo.js","assets/use-blob-url-CmavyEP8.js","assets/pdf-preview-qdXmMkOR.js","assets/video-preview-DxEX-uGo.js","assets/can-open-in-ppm-Bw_xiOXX.js","assets/media-url-CzUJrREv.js","assets/audio-preview-vaG2cB-k.js","assets/docx-preview-C9XdKEj1.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-BHh12_0v.js";import{$r as r,An as i,Br as a,Dt as o,Fr as s,Jr as c,Lt as l,Qr as u,Tr as d,Yn as f,Z as p,_r as ee,at as te,bt as ne,ct as m,dt as re,gr as ie,ir as ae,j as oe,lt as se,nt as ce,pt as h,q as g,qr as _,r as v,rr as y,st as b,un as x,vt as le,w as ue,yt as S}from"./icons-CO_II6D-.js";import{t as de}from"./createLucideIcon-DBXq3G0e.js";import{i as fe,n as C}from"./api-client-c8YOpTlT.js";import{t as w}from"./settings-store-Br5c1efC.js";import{t as T}from"./preload-helper-BEFjQwLd.js";import{t as E}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import{t as pe}from"./panel-store-BUQ-CPsd.js";import"./window-store-B4cbZ5rr.js";import{i as me}from"./project-store-C5gJXkvb.js";import"./project-framework-store-XxFXcUpb.js";import{t as he}from"./tab-store-DqeaGhhE.js";import{o as ge}from"./file-store-D9KE0kQC.js";import{n as _e,t as ve}from"./use-is-mobile-BClDZJP5.js";import"./git-repo-store-DSypNj19.js";import{t as ye}from"./button-Ci9EUgqd.js";import{a as be,i as xe,n as Se,o as Ce,t as we}from"./dialog-B8clVkyi.js";import"./file-icons-gx_FBOXY.js";import{t as Te}from"./mobile-bottom-sheet-CuNi2FRv.js";import"./use-visual-viewport-BGpcMnIx.js";import"./fs-api-DL36slbd.js";import"./format-file-meta-mQwA6SuY.js";import{t as D}from"./input-CG8PS8mS.js";import"./scroll-area-XonvWYn_.js";import{C as Ee,Cn as De,S as Oe,Tn as ke,an as Ae,dn as O,fn as k,ft as je,hn as A,in as j,ln as M,mn as N,mt as P,on as F,pn as I,pt as Me,rn as Ne,sn as L,un as Pe,v as Fe,xt as Ie}from"./index-C8nGqkKN.js";import"./data-grid-types-CHD9-pon.js";import"./marked.esm-DDb9MclE.js";import{t as Le}from"./use-monaco-theme-C88KphGx.js";import{n as Re,t as ze}from"./editor-font-BNwo7zo5.js";import{t as Be}from"./use-inline-blame-pKaXyGU-.js";import{n as Ve,r as He}from"./monaco-dotenv-language-Bwq3gQsi.js";import{i as Ue,n as We,r as Ge,t as Ke}from"./can-open-in-ppm-Bw_xiOXX.js";import{a as qe,i as Je,o as Ye,r as Xe,t as Ze}from"./glide-data-grid-R4PcAntf.js";var Qe=de(`file-braces`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1`,key:`1oajmo`}],[`path`,{d:`M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1`,key:`mpwhp6`}]]),R=e(t(),1),z=n();function $e({projectName:e,filePath:t,tabId:n,ready:r,children:i}){let a=(0,R.useRef)(null),o=he(e=>e.activeTabId);return(0,R.useEffect)(()=>{let i=()=>{if(!r||!e||!t||!n||o!==n)return;let i=!!a.current?.checkVisibility({checkOpacity:!0,checkVisibilityCSS:!0});i&&Ie({type:`file-ready`,projectName:e,tabId:n,visible:i,isRunDocument:/^readme(?:\.[^/\\]+)?$/i.test(t.split(/[/\\]/).pop()??``)})};return i(),window.addEventListener(`ppm:onboarding-refresh`,i),()=>window.removeEventListener(`ppm:onboarding-refresh`,i)},[e,t,n,r,o]),(0,z.jsx)(`div`,{ref:a,className:`flex flex-1 min-h-0 flex-col`,children:i})}var et=[`completionItems`,`hovers`,`documentSymbols`,`definitions`,`references`,`documentHighlights`,`rename`,`diagnostics`,`documentRangeFormattingEdits`,`signatureHelp`,`onTypeFormattingEdits`,`codeActions`,`inlayHints`];function tt(e){return Object.fromEntries(et.map(t=>[t,e]))}var nt=tt(!1),rt=tt(!0),B={noSemanticValidation:!0,noSyntaxValidation:!0,noSuggestionDiagnostics:!0},it=1;function at(e,t){for(let n of[e,t])n.setModeConfiguration({...nt}),n.setDiagnosticsOptions({...B})}function V(e,t){for(let n of[e,t])n.setCompilerOptions({...n.getCompilerOptions(),jsx:it,allowJs:!0,allowNonTsExtensions:!0}),n.setModeConfiguration({...rt}),n.setDiagnosticsOptions({...B})}function ot(e,t,n){e?at(t,n):V(t,n)}function st({enabled:e,onToggle:t,status:n,diagnostics:i}){let[a,o]=(0,R.useState)(!1),s=_e();if(!e)return(0,z.jsxs)(`button`,{type:`button`,onClick:()=>t(!0),title:`Language server: off. Turn it on for completions, hover, go to definition, rename and quick fix from a real server. It runs as a process on the host.`,className:`flex items-center gap-1 rounded px-1.5 text-xs text-muted-foreground hover:bg-muted active:scale-95 transition-colors ${s?`min-h-11`:`py-0.5`}`,children:[(0,z.jsx)(r,{className:`size-3 shrink-0`}),(0,z.jsx)(`span`,{children:`LSP off`})]});if(!n)return null;let c=i.filter(e=>e.severity===1).length,l=i.filter(e=>e.severity===2).length,d=n.state===`ready`?n.server.displayName:n.state===`opening`?`Starting…`:n.server?.displayName??`No server`,f=n.state===`unavailable`&&n.reason===`not-installed`;return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(`button`,{type:`button`,onClick:()=>o(!0),title:n.state===`ready`?`${n.server.displayName} — rooted at ${n.server.rootPath}`:n.state===`unavailable`?n.message:`Starting the language server`,className:`flex items-center gap-1 rounded px-1.5 hover:bg-muted active:scale-95 transition-colors text-xs ${s?`min-h-11`:`py-0.5`} ${f?`text-amber-500`:`text-muted-foreground`}`,children:[n.state===`opening`?(0,z.jsx)(x,{className:`size-3 animate-spin shrink-0`}):f?(0,z.jsx)(v,{className:`size-3 shrink-0`}):(0,z.jsx)(u,{className:`size-3 shrink-0`}),(0,z.jsx)(`span`,{className:`max-w-24 truncate`,children:d}),c>0&&(0,z.jsx)(`span`,{className:`text-red-500`,children:c}),c===0&&l>0&&(0,z.jsx)(`span`,{className:`text-amber-500`,children:l})]}),a&&(0,z.jsx)(H,{status:n,errors:c,warnings:l,isMobile:s,onToggle:t,onClose:()=>o(!1)})]})}function H({status:e,errors:t,warnings:n,isMobile:r,onToggle:i,onClose:a}){let o=(0,z.jsx)(ct,{status:e,errors:t,warnings:n,isMobile:r,onToggle:i});return r?(0,z.jsx)(Te,{open:!0,onClose:a,className:`popover-solid max-h-[85dvh] flex flex-col`,children:o}):(0,z.jsx)(we,{open:!0,onOpenChange:e=>!e&&a(),children:(0,z.jsxs)(Se,{className:`sm:max-w-lg`,children:[(0,z.jsx)(Ce,{children:`Language server`}),o]})})}function ct({status:e,errors:t,warnings:n,isMobile:r,onToggle:i}){return(0,z.jsxs)(`div`,{className:`p-4 space-y-4 overflow-y-auto text-sm leading-relaxed`,children:[e.state===`ready`&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(lt,{label:`Server`,value:e.server.displayName}),(0,z.jsx)(lt,{label:`Language`,value:e.languageId}),(0,z.jsx)(lt,{label:`Project root`,value:e.server.rootPath,mono:!0}),(0,z.jsx)(lt,{label:`Problems`,value:`${t} error${t===1?``:`s`}, ${n} warning${n===1?``:`s`}`}),(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Completions, hover, go to definition (F12), find references (Shift+F12), rename (F2), quick fix (Ctrl+.) and format (Shift+Alt+F) all come from this server.`})]}),e.state===`opening`&&(0,z.jsx)(`p`,{className:`text-muted-foreground`,children:`Starting the language server. A cold start reads the project's dependencies, so the first completion in a large project can take a few seconds.`}),e.state===`unavailable`&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(`p`,{children:e.message}),e.server&&(0,z.jsxs)(`div`,{className:`space-y-2`,children:[(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Install it, then reopen this file. PPM does not install it for you — that would mean fetching and running a binary because you opened a file.`}),(0,z.jsx)(ut,{command:e.server.installHint,isMobile:r})]}),e.reason===`no-language`&&(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No language server is registered for this file type.`})]}),(0,z.jsxs)(`div`,{className:`flex items-center justify-between gap-3 border-t border-border pt-3`,children:[(0,z.jsxs)(`div`,{children:[(0,z.jsx)(`p`,{className:`text-xs font-medium`,children:`Language server`}),(0,z.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`On for this device. Turning it off stops the process.`})]}),(0,z.jsx)(je,{checked:!0,onCheckedChange:e=>i(e)})]})]})}function lt({label:e,value:t,mono:n}){return(0,z.jsxs)(`div`,{className:`flex gap-2 items-baseline`,children:[(0,z.jsx)(`span`,{className:`text-muted-foreground shrink-0 w-24 text-xs`,children:e}),(0,z.jsx)(`span`,{className:`min-w-0 break-all ${n?`font-mono text-xs`:``}`,children:t})]})}function ut({command:e,isMobile:t}){let[n,r]=(0,R.useState)(!1);return(0,z.jsxs)(`button`,{type:`button`,onClick:()=>{navigator.clipboard?.writeText(e).then(()=>{r(!0),setTimeout(()=>r(!1),1500)})},className:`w-full flex items-center gap-2 rounded border border-border bg-muted/40 px-3 text-left font-mono text-xs hover:bg-muted active:scale-[0.99] transition ${t?`min-h-11 py-3`:`py-2`}`,children:[(0,z.jsx)(`span`,{className:`flex-1 break-all`,children:e}),n?(0,z.jsx)(ue,{className:`size-3.5 shrink-0 text-green-500`}):(0,z.jsx)(ce,{className:`size-3.5 shrink-0 opacity-60`})]})}function dt(e){let t=e.startsWith(`/`),n=e.split(/[/\\]/).filter(Boolean),r=e=>{let r=(t?`/`:``)+n.slice(0,e+1).join(`/`);return/^[A-Za-z]:$/.test(r)?r+`/`:r},i=t?`/`:(n[0]??``)+`/`;return n.map((e,t)=>({name:e,absPath:r(t),parentDir:t>0?r(t-1):i}))}async function ft(e){return(await C.get(`/api/fs/browse?path=${encodeURIComponent(e)}`)).entries}function pt({filePath:e,projectName:t,tabId:n,className:r}){let{updateTab:i,openTab:a}=he(Ne(e=>({updateTab:e.updateTab,openTab:e.openTab}))),o=(0,R.useRef)(null),s=(0,R.useMemo)(()=>dt(e),[e]);(0,R.useEffect)(()=>{o.current&&(o.current.scrollLeft=o.current.scrollWidth)},[s]);let c=(0,R.useCallback)((e,r)=>{let o=E(e),s={filePath:e,projectName:t};r.metaKey||r.ctrlKey?a({type:`editor`,title:o,metadata:s,projectId:t,closable:!0}):i(n,{title:o,metadata:s})},[t,n,a,i]);return(0,z.jsx)(`div`,{ref:o,className:r,children:s.map((e,t)=>(0,z.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[t>0&&(0,z.jsx)(oe,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,z.jsx)(mt,{segment:e,isLast:t===s.length-1,onFileClick:c})]},e.absPath))})}function mt({segment:e,isLast:t,onFileClick:n}){let[r,i]=(0,R.useState)(null),[a,o]=(0,R.useState)(null);function s(t){t&&r===null&&ft(e.parentDir).then(i).catch(e=>{o(e.message||`Failed to browse`),i([])})}return(0,z.jsxs)(j,{onOpenChange:s,children:[(0,z.jsx)(A,{asChild:!0,children:(0,z.jsx)(`button`,{type:`button`,className:`text-xs px-1 py-0.5 rounded hover:bg-muted transition-colors truncate max-w-[120px] ${t?`text-foreground font-medium`:`text-muted-foreground`}`,children:e.name})}),(0,z.jsx)(F,{align:`start`,className:`max-h-[300px] overflow-y-auto p-1`,children:r===null?(0,z.jsx)(L,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):a?(0,z.jsx)(L,{disabled:!0,className:`text-xs text-destructive`,children:a}):r.length===0?(0,z.jsx)(L,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Empty`}):r.map(t=>(0,z.jsx)(ht,{entry:t,activePath:e.absPath,onFileClick:n},t.path))})]})}function ht({entry:e,activePath:t,onFileClick:n}){let r=W(e.name,e.type===`directory`),i=e.path===t,[a,o]=(0,R.useState)(null);if(e.type===`directory`){function s(t){t&&a===null&&ft(e.path).then(o).catch(()=>o([]))}return(0,z.jsxs)(k,{onOpenChange:s,children:[(0,z.jsxs)(N,{className:`text-xs gap-1.5 ${i?`bg-muted`:``}`,children:[(0,z.jsx)(r,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,z.jsx)(`span`,{className:`truncate`,children:e.name})]}),(0,z.jsx)(I,{className:`max-h-[300px] overflow-y-auto p-1`,children:a===null?(0,z.jsx)(L,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):a.length===0?(0,z.jsx)(L,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Empty`}):a.map(e=>(0,z.jsx)(ht,{entry:e,activePath:t,onFileClick:n},e.path))})]})}return(0,z.jsxs)(L,{className:`text-xs gap-1.5 cursor-pointer ${i?`bg-muted`:``}`,onClick:t=>n(e.path,t),children:[(0,z.jsx)(r,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,z.jsx)(`span`,{className:`truncate`,children:e.name})]})}var U={ts:h,tsx:h,js:h,jsx:h,py:h,rs:h,go:h,html:h,css:h,scss:h,json:Qe,md:le,txt:le,yaml:S,yml:S};function W(e,t){return t?o:U[e.split(`.`).pop()?.toLowerCase()??``]??re}function gt(e,t){let n=[],r=e,i=``;for(let e=0;e<t.length;e++){let a=t[e],o=t.slice(0,e+1).join(`/`),s=r.find(e=>e.name===a);if(n.push({name:a,fullPath:o,node:s??null,siblings:r,parentPath:i}),s?.children)i=s.path,r=s.children;else{for(let r=e+1;r<t.length;r++)n.push({name:t[r],fullPath:t.slice(0,r+1).join(`/`),node:null,siblings:[],parentPath:t.slice(0,r).join(`/`)});break}}return n}function G(e){return[...e].sort((e,t)=>e.type===t.type?e.name.localeCompare(t.name):e.type===`directory`?-1:1)}function _t({filePath:e,projectName:t,tabId:n,className:r}){let i=ge(e=>e.tree),{updateTab:a,openTab:o}=he(Ne(e=>({updateTab:e.updateTab,openTab:e.openTab}))),s=me(e=>e.projects.find(e=>e.name===t)?.path??``),c=(0,R.useRef)(null),{prefixParts:l,relativePath:u,isExternal:d}=(0,R.useMemo)(()=>{let t=e.startsWith(`/`)?e.slice(1):e,n=s.startsWith(`/`)?s.slice(1):s;if(n&&t.startsWith(n+`/`)){let e=t.slice(n.length+1);return{prefixParts:n.split(`/`),relativePath:e,isExternal:!1}}return{prefixParts:[],relativePath:t,isExternal:/^(\/|[A-Za-z]:[/\\])/.test(e)}},[e,s]),f=(0,R.useMemo)(()=>gt(i,u.split(`/`).filter(Boolean)),[i,u]);(0,R.useEffect)(()=>{c.current&&(c.current.scrollLeft=c.current.scrollWidth)},[f]);function p(e,r){let i=E(e);r.metaKey||r.ctrlKey?o({type:`editor`,title:i,metadata:{filePath:e,projectName:t},projectId:t,closable:!0}):a(n,{title:i,metadata:{filePath:e,projectName:t}})}return d?(0,z.jsx)(pt,{filePath:e,projectName:t,tabId:n,className:r}):(0,z.jsxs)(`div`,{ref:c,className:r,children:[l.map((e,t)=>(0,z.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[t>0&&(0,z.jsx)(oe,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,z.jsx)(`span`,{className:`text-xs text-muted-foreground px-1 py-0.5`,children:e})]},`prefix-${t}`)),f.map((e,n)=>(0,z.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[(n>0||l.length>0)&&(0,z.jsx)(oe,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,z.jsx)(K,{segment:e,isLast:n===f.length-1,projectName:t,onFileClick:p})]},e.fullPath))]})}function K({segment:e,isLast:t,projectName:n,onFileClick:r}){let i=ge(e=>e.loadChildren),a=ge(e=>e.loadedPaths),o=(0,R.useMemo)(()=>G(e.siblings),[e.siblings]),s=a.has(e.parentPath);function c(t){if(t&&!s){let t=e.parentPath.split(`/`).filter(Boolean);(async()=>{for(let e=0;e<=t.length;e++)await i(n,t.slice(0,e).join(`/`))})()}}return(0,z.jsxs)(j,{onOpenChange:c,children:[(0,z.jsx)(A,{asChild:!0,children:(0,z.jsx)(`button`,{type:`button`,className:`text-xs px-1 py-0.5 rounded hover:bg-muted transition-colors truncate max-w-[120px] ${t?`text-foreground font-medium`:`text-muted-foreground`}`,children:e.name})}),(0,z.jsx)(F,{align:`start`,className:`max-h-[300px] p-1`,children:o.length===0?(0,z.jsx)(L,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):o.map(t=>(0,z.jsx)(q,{node:t,projectName:n,activePath:e.fullPath,onFileClick:r},t.path))})]})}function q({node:e,projectName:t,activePath:n,onFileClick:r}){let i=W(e.name,e.type===`directory`),a=e.path===n,o=ge(e=>e.loadChildren),s=ge(e=>e.loadedPaths);if(e.type===`directory`){let c=e.children??[],l=s.has(e.path);function u(n){n&&!l&&o(t,e.path)}return(0,z.jsxs)(k,{onOpenChange:u,children:[(0,z.jsxs)(N,{className:`text-xs gap-1.5 ${a?`bg-muted`:``}`,children:[(0,z.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,z.jsx)(`span`,{className:`truncate`,children:e.name})]}),(0,z.jsx)(I,{className:`max-h-[300px] overflow-y-auto p-1`,children:c.length===0?(0,z.jsx)(L,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):G(c).map(e=>(0,z.jsx)(q,{node:e,projectName:t,activePath:n,onFileClick:r},e.path))})]})}return(0,z.jsxs)(L,{className:`text-xs gap-1.5 cursor-pointer ${a?`bg-muted`:``}`,onSelect:e=>{},onClick:t=>{r(e.path,t)},children:[(0,z.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,z.jsx)(`span`,{className:`truncate`,children:e.name})]})}function J({active:e,onClick:t,icon:n,label:r,title:i}){return(0,z.jsxs)(`button`,{type:`button`,title:i,onClick:t,className:`flex items-center gap-1 px-2 py-1 rounded text-xs transition-colors ${e?`bg-muted text-foreground`:`text-muted-foreground hover:text-foreground`}`,children:[(0,z.jsx)(n,{className:`size-3`}),(0,z.jsx)(`span`,{className:`hidden sm:inline`,children:r})]})}function vt({ext:e,mdMode:t,onMdModeChange:n,csvMode:r,onCsvModeChange:i,wordWrap:o,onToggleWordWrap:s,inlineBlame:c,onToggleInlineBlame:l,blameStale:u,onRefresh:f,refreshing:ee,filePath:te,projectName:ne,className:m}){return(0,z.jsxs)(`div`,{className:m,children:[(e===`md`||e===`mdx`)&&n&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(J,{active:t===`edit`,onClick:()=>n(`edit`),icon:p,label:`Edit`}),(0,z.jsx)(J,{active:t===`preview`,onClick:()=>n(`preview`),icon:se,label:`Preview`})]}),e===`csv`&&i&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(J,{active:r===`table`,onClick:()=>i(`table`),icon:d,label:`Table`}),(0,z.jsx)(J,{active:r===`raw`,onClick:()=>i(`raw`),icon:p,label:`Raw`})]}),(0,z.jsx)(J,{active:o,onClick:s,icon:_,label:`Wrap`}),l&&(0,z.jsx)(J,{active:c===!0,onClick:l,icon:a,label:`Blame`,title:c&&u?`Blame is hidden until this file is saved — the line numbers have moved`:`Inline blame (Alt+B)`}),f&&(0,z.jsxs)(`button`,{type:`button`,onClick:f,disabled:ee,title:`Reload file from disk`,className:`flex items-center gap-1 px-2 py-1 rounded text-xs text-muted-foreground hover:text-foreground transition-colors disabled:opacity-50`,children:[(0,z.jsx)(ae,{className:`size-3 ${ee?`animate-spin`:``}`}),(0,z.jsx)(`span`,{className:`hidden sm:inline`,children:`Refresh`})]}),te&&ne&&(0,z.jsx)(J,{active:!1,onClick:()=>De(ne,te),icon:b,label:`Download`})]})}function yt({filePath:e,projectName:t,revision:n}){let[r,i]=(0,R.useState)(),[a,o]=(0,R.useState)();return(0,R.useEffect)(()=>{let n=new AbortController;i(void 0),o(void 0);let r=setTimeout(()=>n.abort(Error(`Preview request timed out. Try Refresh.`)),3e4),a=!0;return C.post(`/api/html-preview`,{filePath:e,projectName:t},{signal:n.signal}).then(e=>{a&&i(e.url)}).catch(e=>{a&&o(e instanceof Error?e.message:`Could not open HTML preview`)}).finally(()=>clearTimeout(r)),()=>{a=!1,clearTimeout(r),n.abort()}},[e,t,n]),a?(0,z.jsxs)(`div`,{role:`alert`,className:`p-4 text-sm text-destructive`,children:[a,`. Use Refresh to retry.`]}):r?(0,z.jsx)(`iframe`,{title:`HTML preview`,src:r,sandbox:`allow-scripts`,referrerPolicy:`no-referrer`,className:`flex-1 min-h-0 w-full border-0 bg-white`}):(0,z.jsxs)(`div`,{role:`status`,className:`flex flex-1 items-center justify-center gap-2 text-sm text-muted-foreground`,children:[(0,z.jsx)(x,{className:`size-5 animate-spin`}),`Loading preview…`]})}var bt=[{id:`plaintext`,label:`Plain Text`},{id:`javascript`,label:`JavaScript`},{id:`typescript`,label:`TypeScript`},{id:`sql`,label:`SQL`},{id:`json`,label:`JSON`},{id:`xml`,label:`XML`},{id:`html`,label:`HTML`},{id:`css`,label:`CSS`},{id:`python`,label:`Python`},{id:`markdown`,label:`Markdown`},{id:`yaml`,label:`YAML`},{id:`shell`,label:`Shell`},{id:`dotenv`,label:`Dotenv`}];function xt({value:e,onChange:t}){return(0,z.jsxs)(`div`,{className:`shrink-0 flex items-center gap-1 px-2 border-l border-border`,children:[(0,z.jsx)(h,{className:`size-3 text-muted-foreground`}),(0,z.jsx)(`select`,{value:e,onChange:e=>t(e.target.value),className:`h-5 text-[10px] bg-transparent border border-border rounded px-1 text-foreground outline-none max-w-[120px]`,title:`Select editor language`,children:bt.map(e=>(0,z.jsx)(`option`,{value:e.id,children:e.label},e.id))})]})}var Y=`flex items-center justify-center gap-1.5 rounded px-2 min-h-11 min-w-11 md:min-h-7 md:min-w-7 text-xs text-muted-foreground hover:text-foreground hover:bg-muted`,St=`min-h-11 md:min-h-8 px-2`,Ct=`${St} pr-8 [&>span]:left-auto [&>span]:right-2`;function wt(e){let{mode:t,onModeChange:n,onRefresh:r,unsaved:o,breadcrumb:s}=e;return(0,z.jsxs)(`div`,{className:`flex items-center gap-2 md:gap-1 border-b border-border bg-background px-2 shrink-0 h-12 md:h-8`,role:`toolbar`,"aria-label":`HTML preview`,children:[(0,z.jsx)(`div`,{className:`hidden md:flex flex-1 min-w-0 overflow-hidden`,children:s}),t===`preview`&&(0,z.jsx)(`button`,{type:`button`,onClick:r,title:`Reload the original HTML file`,"aria-label":`Refresh preview`,className:Y,children:(0,z.jsx)(ae,{className:`size-4`})}),[[`edit`,`Code`,p],[`preview`,`Preview`,se]].map(([e,r,i])=>(0,z.jsxs)(`button`,{type:`button`,"aria-pressed":t===e,onClick:()=>n(e),className:`${Y} ${t===e?`bg-muted text-foreground`:``}`,children:[(0,z.jsx)(i,{className:`size-3.5`}),r]},e)),o&&(0,z.jsx)(`span`,{role:`status`,title:`Preview uses the saved file`,"aria-label":`Preview uses the saved file`,className:`text-amber-500 text-xs`,children:`●`}),(0,z.jsxs)(j,{children:[(0,z.jsx)(A,{asChild:!0,children:(0,z.jsx)(`button`,{type:`button`,title:`More HTML actions`,"aria-label":`More HTML actions`,className:`${Y} ml-auto md:ml-0`,children:(0,z.jsx)(i,{className:`size-4`})})}),(0,z.jsxs)(F,{align:`end`,className:`w-52`,children:[t===`edit`&&(0,z.jsxs)(L,{className:St,disabled:o||e.refreshing,onSelect:e.onReloadCode,children:[(0,z.jsx)(ae,{}),`Reload code from disk`]}),(0,z.jsxs)(L,{className:St,onSelect:()=>void De(e.projectName??``,e.filePath),children:[(0,z.jsx)(b,{}),`Download`]}),(0,z.jsx)(O,{}),(0,z.jsxs)(Ae,{className:Ct,checked:e.wordWrap,onCheckedChange:e.onToggleWordWrap,children:[(0,z.jsx)(_,{className:`size-4 text-muted-foreground`}),`Word wrap`]}),e.onToggleInlineBlame&&(0,z.jsxs)(Ae,{className:Ct,checked:e.inlineBlame,onCheckedChange:e.onToggleInlineBlame,children:[(0,z.jsx)(a,{className:`size-4 text-muted-foreground`}),`Inline blame`]}),e.onToggleLsp&&(0,z.jsxs)(Ae,{className:Ct,checked:e.lspEnabled,onCheckedChange:e.onToggleLsp,children:[(0,z.jsx)(u,{className:`size-4 text-muted-foreground`}),`Language server`]}),(0,z.jsxs)(k,{children:[(0,z.jsxs)(N,{className:`${St} gap-2`,children:[(0,z.jsx)(h,{className:`size-4 text-muted-foreground`}),`Editor language`]}),(0,z.jsx)(I,{className:`max-h-80 overflow-y-auto`,children:(0,z.jsx)(M,{value:e.language,onValueChange:e.onLanguageChange,children:bt.map(e=>(0,z.jsx)(Pe,{className:`min-h-11 md:min-h-8`,value:e.id,children:e.label},e.id))})})]})]})]})]})}function Tt({open:e,defaultName:t,content:n,onSave:r,onCancel:i}){let[a,o]=(0,R.useState)(t),[s,c]=(0,R.useState)(!1),[l,u]=(0,R.useState)(``),d=me(e=>e.activeProject),f=(0,R.useCallback)(()=>{let e=a.trim();if(!e){u(`Filename cannot be empty`);return}if(/[/\\]/.test(e)){u(`Filename cannot contain / or \\`);return}u(``),c(!0)},[a]),p=(0,R.useCallback)(e=>{let t=e.includes(`\\`)?`\\`:`/`;r(e.endsWith(t)?`${e}${a.trim()}`:`${e}${t}${a.trim()}`,n)},[a,n,r]);return s?(0,z.jsx)(P,{open:!0,mode:`folder`,root:d?.path,title:`Save "${a.trim()}" to...`,onSelect:p,onCancel:()=>c(!1)}):(0,z.jsx)(we,{open:e,onOpenChange:e=>{e||i()},children:(0,z.jsxs)(Se,{className:`sm:max-w-md`,children:[(0,z.jsx)(be,{children:(0,z.jsx)(Ce,{children:`Save As`})}),(0,z.jsxs)(`div`,{className:`flex flex-col gap-2 py-2`,children:[(0,z.jsx)(`label`,{className:`text-sm text-muted-foreground`,children:`Filename`}),(0,z.jsx)(D,{value:a,onChange:e=>{o(e.target.value),u(``)},onKeyDown:e=>{e.key===`Enter`&&f()},placeholder:`e.g. my-file.ts`,autoFocus:!0}),l&&(0,z.jsx)(`p`,{className:`text-xs text-destructive`,children:l})]}),(0,z.jsxs)(xe,{children:[(0,z.jsx)(ye,{variant:`outline`,onClick:i,children:`Cancel`}),(0,z.jsx)(ye,{onClick:f,children:`Choose Folder...`})]})]})})}var Et=typeof window<`u`&&window.isSecureContext,X=[`(`,`)`,`{`,`}`,`[`,`]`,`<`,`>`,`;`,`:`,`=`,`"`,`'`,"`",`/`,`\\`,`_`,`#`],Z=`px-2 py-1.5 rounded text-xs min-w-[36px] min-h-[32px] bg-surface-elevated text-text-primary active:bg-primary active:text-primary-foreground transition-colors select-none`,Dt=`px-3 py-1.5 rounded text-xs font-mono min-w-[36px] min-h-[32px] bg-surface-elevated text-text-primary active:bg-primary active:text-primary-foreground transition-colors select-none`,Ot=`w-px h-5 bg-border mx-0.5 shrink-0`;function kt({editorRef:e,readOnly:t,wrapOn:n,onToggleWrap:r}){let i=(0,R.useCallback)(()=>e.current,[e]),a=(0,R.useCallback)(e=>{let t=i();if(!t)return;t.focus();let n=t.getSelection();n&&t.executeEdits(`mobile-toolbar`,[{range:n,text:e}])},[i]),[o,l]=(0,R.useState)(!1),u=(0,R.useRef)(null),d=(0,R.useCallback)(async()=>{try{let e=await navigator.clipboard.readText();e&&a(e)}catch{}},[a]),f=(0,R.useCallback)(()=>{l(!0),requestAnimationFrame(()=>u.current?.focus())},[]),p=(0,R.useCallback)(e=>{e.preventDefault();let t=e.clipboardData.getData(`text/plain`);t&&(l(!1),a(t))},[a]),ee=(0,R.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`undo`,null))},[i]),te=(0,R.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`redo`,null))},[i]),ne=(0,R.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`tab`,null))},[i]);return t?null:(0,z.jsxs)(`div`,{className:`shrink-0 border-t border-border bg-surface`,children:[!Et&&o&&(0,z.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1.5 border-b border-border bg-muted/50`,children:[(0,z.jsx)(`textarea`,{ref:u,onPaste:p,placeholder:`Long-press here → Paste`,className:`flex-1 h-8 rounded border border-border bg-background text-foreground text-xs px-2 py-1.5 resize-none focus:outline-none focus:ring-1 focus:ring-primary`}),(0,z.jsx)(`button`,{type:`button`,onClick:()=>l(!1),className:`p-1.5 rounded text-muted-foreground active:bg-muted transition-colors`,children:(0,z.jsx)(c,{size:14})})]}),(0,z.jsxs)(`div`,{className:`flex items-center gap-1 px-2 py-1.5 overflow-x-auto`,children:[(0,z.jsx)(`button`,{type:`button`,onClick:Et?d:f,className:Z,title:`Paste`,children:(0,z.jsx)(g,{size:14})}),(0,z.jsx)(`button`,{type:`button`,onClick:ee,className:Z,title:`Undo`,children:(0,z.jsx)(s,{size:14})}),(0,z.jsx)(`button`,{type:`button`,onClick:te,className:Z,title:`Redo`,children:(0,z.jsx)(y,{size:14})}),(0,z.jsx)(`button`,{type:`button`,onClick:r,className:`${Z} ${n?`text-primary`:``}`,title:n?`Wrapping long lines — tap to scroll sideways instead`:`Wrap long lines`,children:(0,z.jsx)(_,{size:14})}),(0,z.jsx)(`div`,{className:Ot}),(0,z.jsx)(`button`,{type:`button`,onClick:ne,className:Dt,children:`Tab`}),(0,z.jsx)(`div`,{className:Ot}),X.map(e=>(0,z.jsx)(`button`,{type:`button`,onClick:()=>a(e),className:Dt,children:e},e))]})]})}var At=(0,R.lazy)(()=>T(()=>import(`./markdown-renderer-vDNuKjel.js`).then(e=>({default:e.MarkdownRenderer})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41]))),jt=(0,R.lazy)(()=>T(()=>import(`./editor-language-service-fPG56hQO.js`).then(e=>({default:e.EditorLanguageService})),__vite__mapDeps([42,2,1,3,10,43,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39]))),Mt=(0,R.lazy)(()=>T(()=>import(`./csv-preview-BioxkrQF.js`).then(e=>({default:e.CsvPreview})),__vite__mapDeps([44,2,5,6,1,3,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,45,46]))),Nt=(0,R.lazy)(()=>T(()=>import(`./image-preview-CGdZrmLo.js`).then(e=>({default:e.ImagePreview})),__vite__mapDeps([47,1,2,3,10,48,20]))),Pt=(0,R.lazy)(()=>T(()=>import(`./pdf-preview-qdXmMkOR.js`).then(e=>({default:e.PdfPreview})),__vite__mapDeps([49,2,1,3,10,20]))),Ft=(0,R.lazy)(()=>T(()=>import(`./video-preview-DxEX-uGo.js`).then(e=>({default:e.VideoPreview})),__vite__mapDeps([50,2,5,6,1,3,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,51,52]))),It=(0,R.lazy)(()=>T(()=>import(`./audio-preview-vaG2cB-k.js`).then(e=>({default:e.AudioPreview})),__vite__mapDeps([53,2,1,3,8,10,20,52]))),Lt=(0,R.lazy)(()=>T(()=>import(`./docx-preview-C9XdKEj1.js`).then(e=>({default:e.DocxPreview})),__vite__mapDeps([54,2,1,3,10,20])));function Rt(e){return e.split(`.`).pop()?.toLowerCase()??``}function zt(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`,sql:`sql`}[Rt(e)]??(Ve(e)?`dotenv`:`plaintext`)}var Bt=(0,R.memo)(function({metadata:e,tabId:t}){let n=e?.filePath,r=e?.projectName,i=e?.inlineContent,a=e?.inlineLanguage,[o,s]=(0,R.useState)(i??null),[c,l]=(0,R.useState)(`utf-8`),[u,d]=(0,R.useState)(!0),[p,m]=(0,R.useState)(null),[re,ae]=(0,R.useState)(null),oe=he(e=>e.activeTabId),[se,ce]=(0,R.useState)(0);(0,R.useEffect)(()=>{let e=()=>ce(e=>e+1);return window.addEventListener(`ppm:onboarding-refresh`,e),()=>window.removeEventListener(`ppm:onboarding-refresh`,e)},[]);let[h,g]=(0,R.useState)(!1),_=(0,R.useRef)(null),v=(0,R.useRef)(``),y=(0,R.useRef)(null),[b,le]=(0,R.useState)(null),{tabs:ue,updateTab:S}=he(Ne(e=>({tabs:e.tabs,updateTab:e.updateTab}))),{wordWrap:de,toggleWordWrap:me,mobileWordWrap:ge,toggleMobileWordWrap:ye}=w(Ne(e=>({wordWrap:e.wordWrap,toggleWordWrap:e.toggleWordWrap,mobileWordWrap:e.mobileWordWrap,toggleMobileWordWrap:e.toggleMobileWordWrap}))),be=w(e=>e.inlineBlame),xe=w(e=>e.toggleInlineBlame),Se=w(e=>e.lspEnabled),Ce=w(e=>e.setLspEnabled),we=_e(),Te=Fe(),D=we?ge:de,De=we?ye:me,Ae=Le(),O=e?.isUntitled===!0,k=e?.unsavedContent,[je,A]=(0,R.useState)(!1),j=ue.find(e=>e.id===t),M=n?Rt(n):``,N=We.has(M),P=M===`pdf`,F=M===`docx`,I=Ue.has(M),L=Ke.has(M),Pe=Ge.has(M),Ve=M===`md`||M===`mdx`,Ze=(M===`html`||M===`htm`)&&!O&&i==null,[Qe,$e]=(0,R.useState)(`preview`),[et,tt]=(0,R.useState)(0),[nt,rt]=(0,R.useState)(!1),B=Ze&&Qe===`preview`,it=M===`csv`,at=e?.language,V=a??at??zt(n??``),H=V===`sql`,[ct,lt]=(0,R.useState)(`preview`),[ut,dt]=(0,R.useState)(`table`),{connections:ft,cachedTables:pt,refreshTables:mt,updateConnection:ht}=Me(),U=n?`ppm:sql-conn:${n}`:t?`ppm:sql-conn:tab:${t}`:null,[W,gt]=(0,R.useState)(()=>{if(!U)return null;let e=localStorage.getItem(U);return e?Number(e):null}),G=(0,R.useRef)(null),K=(0,R.useRef)(null),q=(0,R.useMemo)(()=>ft.find(e=>e.id===W)??null,[ft,W]),J=i!=null&&(a===`json`||a===`xml`),[bt,Y]=(0,R.useState)(!1),St=(0,R.useCallback)(()=>{if(i)if(bt)s(i),Y(!1);else{let e=i.trimStart();if(a===`json`)try{s(JSON.stringify(JSON.parse(e),null,2)),Y(!0)}catch{}else if(a===`xml`){let t=0;s(e.replace(/(>)(<)(\/*)/g,`$1
|
|
3
3
|
$2$3`).split(`
|
|
4
4
|
`).map(e=>{let n=e.trim();n.startsWith(`</`)&&(t=Math.max(0,t-1));let r=` `.repeat(t)+n;return n.startsWith(`<`)&&!n.startsWith(`</`)&&!n.endsWith(`/>`)&&!n.includes(`</`)&&t++,r}).join(`
|
|
5
|
-
`)),Y(!0)}}},[i,a,bt]),Ct=(0,R.useCallback)(e=>{gt(e),U&&localStorage.setItem(U,String(e)),mt(e).catch(()=>{})},[U,mt]),Et=(0,R.useCallback)(n=>{t&&S(t,{metadata:{...e,language:n}})},[t,e,S]),X=(0,R.useMemo)(()=>{if(!H||!W)return;let e=(pt.get(W)??[]).map(e=>({name:e.tableName,schema:e.schemaName}));if(e.length!==0)return{tables:e,getColumns:async(e,t)=>C.get(`/api/db/connections/${W}/schema?table=${encodeURIComponent(e)}${t?`&schema=${encodeURIComponent(t)}`:``}`)}},[H,W,pt]);(0,R.useEffect)(()=>{if(!(!G.current||!X))return K.current?.dispose(),Xe(),K.current=G.current.languages.registerCompletionItemProvider(`sql`,Je(G.current,X)),()=>{K.current?.dispose()}},[X]);let Z=he(e=>e.openTab),[Dt,Ot]=(0,R.useState)(null),[At,Bt]=(0,R.useState)(null),[Vt,Gt]=(0,R.useState)(!1),[Kt,qt]=(0,R.useState)(``),Jt=(0,R.useCallback)(async e=>{if(q){Gt(!0),Bt(null),qt(e);try{Ot(await C.post(`/api/db/connections/${q.id}/query`,{sql:e}))}catch(e){Bt(e.message),Ot(null)}finally{Gt(!1)}}},[q]),Yt=(0,R.useCallback)(()=>{!q||!Kt||Z({type:`database`,title:`${q.name} · Query`,projectId:null,closable:!0,metadata:{connectionId:q.id,connectionName:q.name,dbType:q.type,initialSql:Kt}})},[q,Z,Kt]),Xt=(0,R.useCallback)(()=>{if(!y.current||!q)return;let e=y.current,t=e.getSelection();Jt(t&&!t.isEmpty()?e.getModel()?.getValueInRange(t)??e.getValue():e.getValue())},[q,Jt]),Zt=typeof window<`u`&&`ontouchstart`in window,Qt=(0,R.useRef)(null),[$t,en]=(0,R.useState)(null);(0,R.useEffect)(()=>{if(!Zt)return;let e=window.visualViewport;if(!e)return;let t=()=>{let t=Qt.current;if(!t)return;let n=t.getBoundingClientRect().top;en(e.height-Math.max(0,n))};return e.addEventListener(`resize`,t),e.addEventListener(`scroll`,t),()=>{e.removeEventListener(`resize`,t),e.removeEventListener(`scroll`,t)}},[Zt]),(0,R.useEffect)(()=>ke(Qt.current,()=>y.current?.layout()),[u,p]);let tn=(0,R.useRef)([]),nn=(0,R.useRef)(Jt);nn.current=Jt,(0,R.useEffect)(()=>()=>{tn.current.forEach(e=>e.dispose()),tn.current=[]},[]),(0,R.useEffect)(()=>{Pe&&t&&S(t,{type:`sqlite`})},[Pe,t,S]);let Q=n?/^(\/|[A-Za-z]:[/\\])/.test(n):!1;(0,R.useEffect)(()=>{if(!r||!n||!t||oe!==t||u||p||!b||re!==`${r}:${n}`||i!=null||O||Pe||c===`base64`||B||N||P||F||I||L||Ve&&ct===`preview`||it&&ut===`table`)return;let e=b.editor.getDomNode(),a=!!e?.isConnected&&!!e.checkVisibility({checkOpacity:!0,checkVisibilityCSS:!0});a&&Ie({type:`file-ready`,projectName:r,tabId:t,visible:a,isRunDocument:/^(readme(?:\..*)?|package\.json)$/i.test(E(n))})},[se,r,n,t,oe,u,p,b,re,i,O,Pe,c,N,P,F,I,L,Ve,ct,it,ut,B]),(0,R.useEffect)(()=>{if(i!=null){d(!1);return}if(O){s(k??``),v.current=k??``,d(!1),k&&g(!0);return}if(!n||!Q&&!r)return;if(N||P||F||I||L){d(!1);return}d(!0),m(null),ae(null);let e=!1,t=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${fe(r)}/files/read?path=${encodeURIComponent(n)}`;return C.get(t).then(t=>{e||(s(t.content),l(t.encoding??`utf-8`),ae(`${r}:${n}`),v.current=t.content,d(!1))}).catch(t=>{e||(m(t instanceof Error?t.message:`Failed to load file`),d(!1))}),()=>{e=!0,_.current&&clearTimeout(_.current)}},[n,r,N,P,F,Q,O]);let[rn,an]=(0,R.useState)(!1),on=(0,R.useCallback)(()=>{if(!n||i!=null||O||!Q&&!r)return;let e=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${fe(r)}/files/read?path=${encodeURIComponent(n)}`;an(!0),C.get(e).then(e=>{s(e.content),v.current=e.content,e.encoding&&l(e.encoding),g(!1),m(null)}).catch(e=>m(e instanceof Error?e.message:`Failed to reload file`)).finally(()=>an(!1))},[n,r,Q,i,O]),sn=(0,R.useRef)(h);sn.current=h,(0,R.useEffect)(()=>{if(!n||!r||i!=null||O)return;let e=e=>{let t=e.detail;if(t.projectName!==r||t.path!==n||sn.current)return;let i=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${fe(r)}/files/read?path=${encodeURIComponent(n)}`;C.get(i).then(e=>{e.content!==v.current&&(s(e.content),v.current=e.content,e.encoding&&l(e.encoding))}).catch(()=>{})};return window.addEventListener(`file:changed`,e),()=>window.removeEventListener(`file:changed`,e)},[n,r,Q,i,O]),(0,R.useEffect)(()=>{if(!j||i!=null)return;let t=O?`Untitled-${e?.untitledNumber??1}`:n?E(n):`Untitled`,r=h?`${t} \u25CF`:t;j.title!==r&&S(j.id,{title:r})},[h]);let cn=!O&&i==null&&!!n&&!!r&&!we,ln=Be({editor:b?.editor??null,monaco:b?.monaco??null,projectName:r,filePath:cn?n:void 0,enabled:be&&cn}),un=!O&&!Q&&i==null&&!!n&&!!r,dn=Se&&!Te,fn=dn&&un&&!B,[pn,mn]=(0,R.useState)({status:null,diagnostics:[]}),hn=(0,R.useCallback)(e=>mn(e),[]),gn=(0,R.useCallback)(async e=>{if(n&&!(!Q&&!r))try{Q?await C.put(`/api/fs/write`,{path:n,content:e}):await C.put(`${fe(r)}/files/write`,{path:n,content:e}),g(!1),ln.refresh(),fn&&r&&n&&T(()=>import(`./use-lsp-
|
|
5
|
+
`)),Y(!0)}}},[i,a,bt]),Ct=(0,R.useCallback)(e=>{gt(e),U&&localStorage.setItem(U,String(e)),mt(e).catch(()=>{})},[U,mt]),Et=(0,R.useCallback)(n=>{t&&S(t,{metadata:{...e,language:n}})},[t,e,S]),X=(0,R.useMemo)(()=>{if(!H||!W)return;let e=(pt.get(W)??[]).map(e=>({name:e.tableName,schema:e.schemaName}));if(e.length!==0)return{tables:e,getColumns:async(e,t)=>C.get(`/api/db/connections/${W}/schema?table=${encodeURIComponent(e)}${t?`&schema=${encodeURIComponent(t)}`:``}`)}},[H,W,pt]);(0,R.useEffect)(()=>{if(!(!G.current||!X))return K.current?.dispose(),Xe(),K.current=G.current.languages.registerCompletionItemProvider(`sql`,Je(G.current,X)),()=>{K.current?.dispose()}},[X]);let Z=he(e=>e.openTab),[Dt,Ot]=(0,R.useState)(null),[At,Bt]=(0,R.useState)(null),[Vt,Gt]=(0,R.useState)(!1),[Kt,qt]=(0,R.useState)(``),Jt=(0,R.useCallback)(async e=>{if(q){Gt(!0),Bt(null),qt(e);try{Ot(await C.post(`/api/db/connections/${q.id}/query`,{sql:e}))}catch(e){Bt(e.message),Ot(null)}finally{Gt(!1)}}},[q]),Yt=(0,R.useCallback)(()=>{!q||!Kt||Z({type:`database`,title:`${q.name} · Query`,projectId:null,closable:!0,metadata:{connectionId:q.id,connectionName:q.name,dbType:q.type,initialSql:Kt}})},[q,Z,Kt]),Xt=(0,R.useCallback)(()=>{if(!y.current||!q)return;let e=y.current,t=e.getSelection();Jt(t&&!t.isEmpty()?e.getModel()?.getValueInRange(t)??e.getValue():e.getValue())},[q,Jt]),Zt=typeof window<`u`&&`ontouchstart`in window,Qt=(0,R.useRef)(null),[$t,en]=(0,R.useState)(null);(0,R.useEffect)(()=>{if(!Zt)return;let e=window.visualViewport;if(!e)return;let t=()=>{let t=Qt.current;if(!t)return;let n=t.getBoundingClientRect().top;en(e.height-Math.max(0,n))};return e.addEventListener(`resize`,t),e.addEventListener(`scroll`,t),()=>{e.removeEventListener(`resize`,t),e.removeEventListener(`scroll`,t)}},[Zt]),(0,R.useEffect)(()=>ke(Qt.current,()=>y.current?.layout()),[u,p]);let tn=(0,R.useRef)([]),nn=(0,R.useRef)(Jt);nn.current=Jt,(0,R.useEffect)(()=>()=>{tn.current.forEach(e=>e.dispose()),tn.current=[]},[]),(0,R.useEffect)(()=>{Pe&&t&&S(t,{type:`sqlite`})},[Pe,t,S]);let Q=n?/^(\/|[A-Za-z]:[/\\])/.test(n):!1;(0,R.useEffect)(()=>{if(!r||!n||!t||oe!==t||u||p||!b||re!==`${r}:${n}`||i!=null||O||Pe||c===`base64`||B||N||P||F||I||L||Ve&&ct===`preview`||it&&ut===`table`)return;let e=b.editor.getDomNode(),a=!!e?.isConnected&&!!e.checkVisibility({checkOpacity:!0,checkVisibilityCSS:!0});a&&Ie({type:`file-ready`,projectName:r,tabId:t,visible:a,isRunDocument:/^(readme(?:\..*)?|package\.json)$/i.test(E(n))})},[se,r,n,t,oe,u,p,b,re,i,O,Pe,c,N,P,F,I,L,Ve,ct,it,ut,B]),(0,R.useEffect)(()=>{if(i!=null){d(!1);return}if(O){s(k??``),v.current=k??``,d(!1),k&&g(!0);return}if(!n||!Q&&!r)return;if(N||P||F||I||L){d(!1);return}d(!0),m(null),ae(null);let e=!1,t=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${fe(r)}/files/read?path=${encodeURIComponent(n)}`;return C.get(t).then(t=>{e||(s(t.content),l(t.encoding??`utf-8`),ae(`${r}:${n}`),v.current=t.content,d(!1))}).catch(t=>{e||(m(t instanceof Error?t.message:`Failed to load file`),d(!1))}),()=>{e=!0,_.current&&clearTimeout(_.current)}},[n,r,N,P,F,Q,O]);let[rn,an]=(0,R.useState)(!1),on=(0,R.useCallback)(()=>{if(!n||i!=null||O||!Q&&!r)return;let e=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${fe(r)}/files/read?path=${encodeURIComponent(n)}`;an(!0),C.get(e).then(e=>{s(e.content),v.current=e.content,e.encoding&&l(e.encoding),g(!1),m(null)}).catch(e=>m(e instanceof Error?e.message:`Failed to reload file`)).finally(()=>an(!1))},[n,r,Q,i,O]),sn=(0,R.useRef)(h);sn.current=h,(0,R.useEffect)(()=>{if(!n||!r||i!=null||O)return;let e=e=>{let t=e.detail;if(t.projectName!==r||t.path!==n||sn.current)return;let i=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${fe(r)}/files/read?path=${encodeURIComponent(n)}`;C.get(i).then(e=>{e.content!==v.current&&(s(e.content),v.current=e.content,e.encoding&&l(e.encoding))}).catch(()=>{})};return window.addEventListener(`file:changed`,e),()=>window.removeEventListener(`file:changed`,e)},[n,r,Q,i,O]),(0,R.useEffect)(()=>{if(!j||i!=null)return;let t=O?`Untitled-${e?.untitledNumber??1}`:n?E(n):`Untitled`,r=h?`${t} \u25CF`:t;j.title!==r&&S(j.id,{title:r})},[h]);let cn=!O&&i==null&&!!n&&!!r&&!we,ln=Be({editor:b?.editor??null,monaco:b?.monaco??null,projectName:r,filePath:cn?n:void 0,enabled:be&&cn}),un=!O&&!Q&&i==null&&!!n&&!!r,dn=Se&&!Te,fn=dn&&un&&!B,[pn,mn]=(0,R.useState)({status:null,diagnostics:[]}),hn=(0,R.useCallback)(e=>mn(e),[]),gn=(0,R.useCallback)(async e=>{if(n&&!(!Q&&!r))try{Q?await C.put(`/api/fs/write`,{path:n,content:e}):await C.put(`${fe(r)}/files/write`,{path:n,content:e}),g(!1),ln.refresh(),fn&&r&&n&&T(()=>import(`./use-lsp-71azTXQz.js`).then(t=>t.notifyLspSave(r,n,e)),__vite__mapDeps([43,2,5,6,1,3,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39]))}catch{}},[n,r,Q,fn,ln.refresh]);function _n(n){let r=n??``;s(r),v.current=r,g(!0),_.current&&clearTimeout(_.current),O?_.current=setTimeout(()=>{t&&S(t,{metadata:{...e,unsavedContent:v.current}})},2e3):_.current=setTimeout(()=>gn(v.current),1e3)}let vn=(0,R.useCallback)(async(e,n)=>{try{if(_.current&&clearTimeout(_.current),await C.put(`/api/fs/write`,{path:e,content:n}),t){let{closeTab:n,openTab:r}=pe.getState();n(t),r({type:`editor`,title:E(e),projectId:null,metadata:{filePath:e},closable:!0})}g(!1),A(!1)}catch{}},[t]),$=e?.lineNumber,yn=e?.endLine,bn=e?.revealAt,xn=(0,R.useCallback)(()=>{let e=y.current;if(!(!e||!$||$<=0)){if(e.revealLineInCenter($),e.setPosition({lineNumber:$,column:1}),yn&&yn>=$){let t=e.getModel(),n=t?.getLineCount()??$,r=Math.min(yn,n),i=t?.getLineMaxColumn(r)??1;e.setSelection({startLineNumber:$,startColumn:1,endLineNumber:r,endColumn:i})}e.focus()}},[$,yn]);(0,R.useEffect)(()=>{bn!=null&&xn()},[bn,xn]),(0,R.useEffect)(()=>{let e=b?.monaco;e&&ot(dn,e.languages.typescript.typescriptDefaults,e.languages.typescript.javascriptDefaults)},[b,dn]);let Sn=(0,R.useCallback)((e,t)=>{if(y.current=e,G.current=t,le({editor:e,monaco:t}),$&&$>0&&setTimeout(()=>xn(),100),O&&e.addCommand(t.KeyMod.CtrlCmd|t.KeyCode.KeyS,()=>A(!0)),e.addCommand(t.KeyMod.Alt|t.KeyCode.KeyZ,()=>{let e=w.getState();ve()?e.toggleMobileWordWrap():e.toggleWordWrap()}),e.addCommand(t.KeyMod.Alt|t.KeyCode.KeyB,()=>w.getState().toggleInlineBlame()),X&&(K.current?.dispose(),K.current=t.languages.registerCompletionItemProvider(`sql`,Je(t,X))),H){e.addAction({id:`run-sql-at-cursor`,label:`Run Statement at Cursor`,keybindings:[t.KeyMod.CtrlCmd|t.KeyCode.Enter],run:e=>{let t=e.getPosition();if(!t)return;let n=qe(e.getValue(),t.lineNumber);n&&nn.current(n)}}),tn.current.forEach(e=>e.dispose()),tn.current=[];let n=e.getModel(),r=e.addCommand(0,(e,t)=>{t&&nn.current(t)});if(r&&n){let e=t.languages.registerCodeLensProvider(`sql`,{provideCodeLenses:e=>{if(e!==n)return{lenses:[],dispose:()=>{}};let t=[],i=(e,n,i=`▷ Run`)=>{let a=n.trim();a&&t.push({range:{startLineNumber:e,startColumn:1,endLineNumber:e,endColumn:1},command:{id:r,title:i,arguments:[a]}})},a=/^(BEGIN|COMMIT|ROLLBACK|END)(;|\s|$)/i,o=-1,s=[];for(let{sql:t,startLine:n}of Ye(e.getValue())){let e=/^BEGIN(;|\s|$)/i.test(t),r=/^(COMMIT|ROLLBACK|END)(;|\s|$)/i.test(t);o===-1&&e?(o=n,s=[t]):o>-1?(s.push(t),!r&&!a.test(t)&&i(n,t),r&&(i(o,s.join(`
|
|
6
6
|
`),`▷ Run Transaction`),o=-1,s=[])):i(n,t)}return o>-1&&s.length>1&&i(o,s.join(`
|
|
7
7
|
`),`▷ Run Transaction`),{lenses:t,dispose:()=>{}}}});tn.current.push(e);let i=t.languages.registerFoldingRangeProvider(`sql`,{provideFoldingRanges:e=>{if(e!==n)return[];let r=[],i=e.getLineCount(),a=[];for(let n=1;n<=i;n++){let i=e.getLineContent(n).trim();if(/^BEGIN(;|\s|$)/i.test(i))a.push(n);else if(/^(COMMIT|ROLLBACK|END)(;|\s|$)/i.test(i)&&a.length>0){let e=a.pop();r.push({start:e,end:n,kind:t.languages.FoldingRangeKind.Region})}}return r}});tn.current.push(i)}}},[X,H]);if(!i&&!O&&(!n||!Q&&!r))return(0,z.jsx)(`div`,{className:`flex items-center justify-center h-full text-text-secondary text-sm`,children:`No file selected.`});if(u)return(0,z.jsxs)(`div`,{className:`flex items-center justify-center h-full gap-2 text-text-secondary`,children:[(0,z.jsx)(x,{className:`size-5 animate-spin`}),(0,z.jsx)(`span`,{className:`text-sm`,children:`Loading file...`})]});if(p)return(0,z.jsx)(`div`,{className:`flex items-center justify-center h-full text-error text-sm`,children:p});if(N)return(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(Ut,{}),children:(0,z.jsx)(Nt,{filePath:n,projectName:r})});if(P)return(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(Ut,{}),children:(0,z.jsx)(Pt,{filePath:n,projectName:r})});if(F)return(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(Ut,{}),children:(0,z.jsx)(Lt,{filePath:n,projectName:r})});if(I)return(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(Ut,{}),children:(0,z.jsx)(Ft,{filePath:n,projectName:r})});if(L)return(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(Ut,{}),children:(0,z.jsx)(It,{filePath:n,projectName:r})});if(c===`base64`)return(0,z.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-text-secondary`,children:[(0,z.jsx)(ne,{className:`size-10 text-text-subtle`}),(0,z.jsx)(`p`,{className:`text-sm`,children:`This file is a binary format and cannot be displayed.`}),(0,z.jsx)(`p`,{className:`text-xs text-text-subtle`,children:n})]});let Cn=H?(0,z.jsxs)(`div`,{className:`shrink-0 flex items-center gap-1 px-2 border-l border-border`,children:[(0,z.jsx)(te,{className:`size-3 text-muted-foreground`}),(0,z.jsxs)(`select`,{value:W??``,onChange:e=>{let t=Number(e.target.value);t&&Ct(t)},className:`h-5 text-[10px] bg-transparent border border-border rounded px-1 text-foreground outline-none max-w-[140px]`,title:`Select connection for autocomplete`,children:[(0,z.jsx)(`option`,{value:``,children:`Connection…`}),ft.map(e=>(0,z.jsx)(`option`,{value:e.id,children:e.name},e.id))]}),(0,z.jsx)(`button`,{type:`button`,onClick:Xt,disabled:!q,className:`p-0.5 rounded text-muted-foreground hover:text-primary disabled:opacity-30 transition-colors`,title:`Run SQL`,children:(0,z.jsx)(f,{className:`size-3.5`})}),q&&(0,z.jsx)(`button`,{type:`button`,onClick:()=>ht(q.id,{readonly:q.readonly?0:1}),className:`flex items-center gap-0.5 px-1 py-0.5 rounded text-[10px] transition-colors ${q.readonly?`text-muted-foreground hover:text-foreground`:`bg-destructive/15 text-destructive`}`,title:q.readonly?`Readonly — click to allow writes`:`WRITE mode — click to enable readonly`,children:q.readonly?(0,z.jsx)(ie,{className:`size-3`}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(ee,{className:`size-3`}),(0,z.jsx)(`span`,{className:`font-medium`,children:`WRITE`})]})})]}):null;return(0,z.jsxs)(`div`,{ref:Qt,"data-onboarding":`file`,className:`flex flex-col h-full w-full overflow-hidden`,style:$t?{height:`${$t}px`,maxHeight:`${$t}px`}:void 0,children:[fn&&b&&n&&r&&(0,z.jsx)(R.Suspense,{fallback:null,children:(0,z.jsx)(jt,{editor:b.editor,monaco:b.monaco,projectName:r,filePath:n,onState:hn})}),i!=null&&J&&(0,z.jsx)(`div`,{className:`flex items-center h-7 border-b border-border bg-background shrink-0 px-2 gap-2`,children:(0,z.jsx)(`button`,{type:`button`,onClick:St,className:`text-[10px] px-2 py-0.5 rounded border border-border hover:bg-muted transition-colors text-foreground`,children:bt?`Raw`:`Beautify`})}),!Ze&&n&&r&&t&&(0,z.jsxs)(`div`,{className:`hidden md:flex items-center h-7 border-b border-border bg-background shrink-0`,children:[(0,z.jsx)(_t,{filePath:n,projectName:r,tabId:t,className:`flex items-center flex-1 min-w-0 overflow-x-auto scrollbar-none px-2 gap-0.5`}),un&&!Te&&(0,z.jsx)(st,{enabled:dn,onToggle:Ce,status:pn.status,diagnostics:pn.diagnostics}),(0,z.jsx)(xt,{value:V,onChange:Et}),Cn,(0,z.jsx)(vt,{ext:M,mdMode:ct,onMdModeChange:lt,csvMode:ut,onCsvModeChange:dt,wordWrap:D,onToggleWordWrap:De,inlineBlame:be,onToggleInlineBlame:cn?xe:void 0,blameStale:ln.stale,onRefresh:on,refreshing:rn,filePath:n,projectName:r,className:`shrink-0 flex items-center gap-1 px-2`})]}),!Ze&&i==null&&t&&(O||n&&!r)&&(0,z.jsxs)(`div`,{className:`hidden md:flex items-center h-7 border-b border-border bg-background shrink-0 px-2`,children:[(0,z.jsx)(`span`,{className:`text-xs text-muted-foreground truncate flex-1`,children:O?`Untitled-${e?.untitledNumber??1}`:n?E(n):`Untitled`}),(0,z.jsx)(xt,{value:V,onChange:Et}),Cn]}),Ze&&n&&(0,z.jsx)(wt,{mode:Qe,onModeChange:e=>{e===`edit`&&rt(!0),$e(e)},onRefresh:()=>{$e(`preview`),tt(e=>e+1)},unsaved:h,onReloadCode:on,refreshing:rn,breadcrumb:r&&t?(0,z.jsx)(_t,{filePath:n,projectName:r,tabId:t,className:`flex items-center min-w-0 overflow-x-auto scrollbar-none gap-0.5`}):(0,z.jsx)(`span`,{className:`truncate text-xs text-muted-foreground`,children:E(n)}),filePath:n,projectName:r,wordWrap:D,onToggleWordWrap:De,inlineBlame:be,onToggleInlineBlame:cn?xe:void 0,language:V,onLanguageChange:Et,lspEnabled:dn,onToggleLsp:un&&!Te?Ce:void 0}),B&&n&&(0,z.jsx)(yt,{filePath:n,projectName:r,revision:et}),B&&!nt?null:it&&ut===`table`?(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,z.jsx)(x,{className:`size-5 animate-spin text-text-subtle`})}),children:(0,z.jsx)(Mt,{content:o??``,onContentChange:_n,wordWrap:D})}):Ve&&ct===`preview`?(0,z.jsx)(Wt,{content:o??``,projectName:r,filePath:n,tabId:t,ready:!u&&!p&&re===`${r}:${n}`&&i==null&&!O}):(0,z.jsx)(`div`,{className:B?`hidden`:`flex-1 overflow-hidden min-h-0`,children:(0,z.jsx)(Ee,{height:`100%`,language:V,beforeMount:e=>{Oe(e),He(e)},value:o??``,onChange:i==null?_n:void 0,onMount:Sn,theme:Ae,options:{fontSize:14,fontFamily:ze,fontLigatures:Re,wordWrap:D?`on`:`off`,minimap:{enabled:!1},scrollBeyondLastLine:!1,automaticLayout:!0,lineNumbers:`on`,folding:!0,bracketPairColorization:{enabled:!0},readOnly:i!=null,quickSuggestions:{other:!0,comments:!1,strings:!1},suggestOnTriggerCharacters:!0,acceptSuggestionOnEnter:`on`,suggestSelection:`first`,parameterHints:{enabled:!0},inlayHints:{enabled:`on`},"semanticHighlighting.enabled":!0,stickyScroll:{enabled:!Zt},peekWidgetDefaultFocus:`editor`},loading:(0,z.jsx)(x,{className:`size-5 animate-spin text-text-subtle`})},V)}),H&&(Dt||At||Vt)&&(0,z.jsx)(Ht,{result:Dt,error:At,loading:Vt,connName:q?.name,onClose:()=>{Ot(null),Bt(null),Gt(!1)},onOpenInTab:Yt}),Zt&&!B&&(0,z.jsx)(kt,{editorRef:y,readOnly:i!=null,wrapOn:D,onToggleWrap:De}),je&&(0,z.jsx)(Tt,{open:je,defaultName:`Untitled-${e?.untitledNumber??1}`,content:v.current,onSave:vn,onCancel:()=>A(!1)})]})}),Vt=()=>{};function Ht({result:e,error:t,loading:n,connName:r,onClose:i,onOpenInTab:a}){let o=(0,R.useMemo)(()=>e?.changeType===`select`&&e.rows.length>0?{columns:e.columns,rows:e.rows,total:e.rows.length,limit:e.rows.length}:null,[e]),s=(0,R.useMemo)(()=>(e?.columns??[]).map(e=>({name:e,type:`text`,nullable:!0,pk:!1,defaultValue:null})),[e?.columns]),[u,d]=(0,R.useState)(250),f=(0,R.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=u,r=e.currentTarget.ownerDocument,i=e=>d(Math.max(80,n+(t-e.clientY))),a=()=>{r.removeEventListener(`mousemove`,i),r.removeEventListener(`mouseup`,a)};r.addEventListener(`mousemove`,i),r.addEventListener(`mouseup`,a)},[u]);return(0,z.jsxs)(`div`,{className:`shrink-0 border-t border-border flex flex-col`,style:{height:u},children:[(0,z.jsx)(`div`,{onMouseDown:f,className:`shrink-0 h-1.5 cursor-row-resize bg-border/50 hover:bg-primary/30 flex items-center justify-center transition-colors`,children:(0,z.jsx)(l,{className:`size-3 text-muted-foreground/50`})}),(0,z.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1 bg-muted/50 border-b border-border shrink-0`,children:[(0,z.jsx)(te,{className:`size-3 text-muted-foreground`}),(0,z.jsxs)(`span`,{className:`text-xs font-medium text-foreground truncate flex-1`,children:[r?`${r} · Results`:`Query Results`,e?.executionTimeMs!=null&&(0,z.jsxs)(`span`,{className:`text-muted-foreground ml-1.5 font-normal`,children:[e.executionTimeMs,`ms`]})]}),(0,z.jsxs)(`button`,{type:`button`,onClick:a,title:`Open in DB Viewer tab`,className:`flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] text-muted-foreground hover:text-foreground hover:bg-muted transition-colors`,children:[(0,z.jsx)(m,{className:`size-3`}),(0,z.jsx)(`span`,{className:`hidden sm:inline`,children:`Open in Tab`})]}),(0,z.jsx)(`button`,{type:`button`,onClick:i,title:`Close results`,className:`p-0.5 rounded text-muted-foreground hover:text-foreground transition-colors`,children:(0,z.jsx)(c,{className:`size-3`})})]}),(0,z.jsxs)(`div`,{className:`flex-1 overflow-hidden min-h-0`,children:[n&&(0,z.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,z.jsx)(x,{className:`size-4 animate-spin text-muted-foreground`})}),t&&(0,z.jsx)(`div`,{className:`px-3 py-2 text-xs text-destructive bg-destructive/5`,children:t}),e?.changeType===`modify`&&(0,z.jsxs)(`div`,{className:`px-3 py-2 text-xs text-success`,children:[e.rowsAffected,` row(s) affected`]}),o&&(0,z.jsx)(Ze,{columns:o.columns,rows:o.rows,total:o.total,limit:o.limit,schema:s,loading:!1,page:1,onPageChange:Vt,onCellUpdate:Vt,readOnly:!0,orderBy:null,orderDir:`ASC`,onToggleSort:Vt,connectionName:r}),e?.changeType===`select`&&e.rows.length===0&&(0,z.jsx)(`div`,{className:`px-3 py-2 text-xs text-muted-foreground`,children:`No results`})]})]})}function Ut(){return(0,z.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,z.jsx)(x,{className:`size-5 animate-spin text-text-subtle`})})}function Wt({content:e,...t}){return(0,z.jsx)(R.Suspense,{fallback:(0,z.jsx)(`div`,{className:`animate-pulse h-4 bg-muted rounded m-4`}),children:(0,z.jsx)($e,{...t,children:(0,z.jsx)(At,{content:e,className:`flex-1 overflow-auto p-4`})})})}export{Bt as CodeEditor};
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import{Dn as r,Jr as i,Mr as a,V as o,Zt as s,ar as c,ct as l,ir as u,lt as d,st as f,un as p}from"./icons-CO_II6D-.js";import{n as m,r as h}from"./api-client-c8YOpTlT.js";import{n as g}from"./use-is-mobile-BClDZJP5.js";import{t as _}from"./button-Ci9EUgqd.js";import{a as v,i as y,n as b,o as x,r as S,t as C}from"./dialog-B8clVkyi.js";import{t as w}from"./mobile-bottom-sheet-CuNi2FRv.js";import{t as T}from"./input-CG8PS8mS.js";import{$n as E,Qn as D,Zn as O,bt as k,ft as A}from"./index-C8nGqkKN.js";import{c as j,h as M,i as N,l as P,s as F,t as I,u as L}from"./api-settings-BmvNoCbn.js";function R(e){return e>=90?`text-error`:e>=70?`text-warning`:`text-success`}function z(e){return e>=90?`bg-error`:e>=70?`bg-warning`:`bg-success`}function B(e){if(!e)return null;let t=null;if(e.resetsInMinutes!=null)t=e.resetsInMinutes;else if(e.resetsInHours!=null)t=Math.round(e.resetsInHours*60);else if(e.resetsAt){let n=new Date(e.resetsAt).getTime()-Date.now();t=n>0?Math.ceil(n/6e4):0}if(t==null)return null;if(t<=0)return`now`;let n=Math.floor(t/1440),r=Math.floor(t%1440/60),i=t%60;return n>0?i>0?`${n}d ${r}h ${i}m`:r>0?`${n}d ${r}h`:`${n}d`:r>0?i>0?`${r}h ${i}m`:`${r}h`:`${i}m`}function V(e){if(!e)return null;let t=new Date(e).getTime();return Number.isFinite(t)?new Date(t).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):null}function H(e){let t=e-Date.now();if(t<=0)return`expired`;let n=Math.ceil(t/6e4),r=Math.floor(n/60),i=Math.floor(r/24);return i>0?`${i}d ${r%24}h`:r>0?`${r}h ${n%60}m`:`${n}m`}function U(e){if(!e)return{label:`unknown`,tip:`No account info available`,color:`text-text-subtle`};if(!e.expiresAt)return{label:`key`,tip:`API key (no expiry)`,color:`text-text-subtle`};if(e.reauthRequired)return{label:`sign in again`,tip:`Anthropic rejected this account's refresh token. Sign in again to restore it.`,color:`text-error`};let t=e.expiresAt*1e3<Date.now();return t&&e.hasRefreshToken?{label:`expired`,tip:`Token expired but has refresh token — will auto-renew`,color:`text-warning`}:t?{label:`expired`,tip:`Token expired, no refresh token`,color:`text-error`}:e.hasRefreshToken?{label:`long-lived`,tip:`OAuth token with refresh — long-lived`,color:`text-success`}:{label:`temp`,tip:`Temporary token without refresh — will expire`,color:`text-warning`}}function W(e){if(!e)return null;let t=Math.round((Date.now()-e)/1e3);if(t<5)return`just now`;if(t<60)return`${t}s ago`;let n=Math.floor(t/60);if(n<60)return`${n}m ago`;let r=Math.floor(n/60),i=n%60;return r<24?i>0?`${r}h ${i}m ago`:`${r}h ago`:`${Math.floor(r/24)}d ago`}var G=n();function K({label:e,pct:t,reset:n,resetsAt:r}){let i=V(r);return(0,G.jsxs)(`div`,{className:`space-y-1`,"data-testid":`account-usage-bar`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsx)(`span`,{className:`text-xs font-medium text-text-primary`,children:e}),n&&(0,G.jsxs)(O,{children:[(0,G.jsx)(E,{asChild:!0,children:(0,G.jsxs)(`span`,{className:`text-[10px] text-text-subtle cursor-default`,children:[`↻ `,n]})}),(0,G.jsx)(D,{side:`top`,children:i?`Resets ${i}`:`Resets in`})]})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`div`,{className:`flex-1 h-2 rounded-full bg-border overflow-hidden`,children:t!=null&&(0,G.jsx)(`div`,{className:`h-full rounded-full transition-all ${z(t)}`,style:{width:`${Math.min(t,100)}%`}})}),(0,G.jsx)(`span`,{className:`text-xs font-medium tabular-nums w-10 text-right ${t==null?`text-text-subtle`:R(t)}`,children:t==null?`—`:`${t}%`})]})]})}function q({label:e,bucket:t}){return t?(0,G.jsx)(K,{label:e,pct:Math.round(t.utilization*100),reset:B(t),resetsAt:t.resetsAt}):null}function J({hint:e,className:t,children:n,onClick:r}){return(0,G.jsxs)(O,{children:[(0,G.jsx)(E,{asChild:!0,children:(0,G.jsx)(`button`,{type:`button`,onClick:r,className:[r?`relative cursor-pointer rounded px-1 -mx-1 underline decoration-dotted underline-offset-2 hover:bg-error/10 after:absolute after:-inset-x-2 after:-inset-y-3 after:content-['']`:`cursor-help`,`text-left`,t].filter(Boolean).join(` `),children:n})}),(0,G.jsx)(D,{side:`top`,className:`max-w-[260px] text-xs leading-relaxed`,children:e})]})}function Y({description:e,onRefresh:t,refreshing:n,disabled:r,actions:i}){return(0,G.jsxs)(`section`,{className:`space-y-2`,children:[(0,G.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e}),(0,G.jsx)(_,{variant:`ghost`,size:`icon`,className:`size-8 shrink-0 cursor-pointer`,onClick:t,disabled:r||n,title:`Refresh`,"aria-label":`Refresh accounts`,children:(0,G.jsx)(u,{className:`size-4 ${n?`animate-spin`:``}`})})]}),(0,G.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:i})]})}function X({message:e,onDismiss:t}){return e?(0,G.jsxs)(`div`,{className:`flex items-start gap-2 text-xs p-2 rounded bg-muted`,role:`status`,children:[(0,G.jsx)(`span`,{className:`flex-1`,children:e}),(0,G.jsx)(`button`,{onClick:t,className:`shrink-0 text-muted-foreground hover:text-foreground cursor-pointer`,"aria-label":`Dismiss message`,children:(0,G.jsx)(i,{className:`size-3.5`})})]}):null}function Z({children:e}){return(0,G.jsx)(`div`,{className:`flex gap-2 overflow-x-auto pb-1 -mx-1 px-1 snap-x snap-mandatory scrollbar-thin`,children:e})}function ee({active:e,flash:t,dense:n,children:r,...i}){return(0,G.jsx)(`div`,{...i,className:[`rounded-md border transition-colors duration-500`,n?`p-2.5 space-y-1.5`:`p-3 space-y-2`,t?`bg-primary/10 border-primary/40`:``,e?`border-primary/30 bg-primary/5`:`border-border/50`,i.className??``].filter(Boolean).join(` `),children:r})}function Q({buckets:e}){return e?.length?(0,G.jsx)(G.Fragment,{children:e.map(e=>(0,G.jsx)(q,{label:`Weekly (${e.label})`,bucket:e},e.label))}):null}function te(e){return new Date(e).toLocaleDateString(void 0,{day:`numeric`,month:`short`})}function ne({credits:e}){if(!e)return null;let t=e.available,n=t===0?`No free resets`:`${t} free reset${t===1?``:`s`}`,r=t===0?`Codex has no free rate-limit resets left for this account.`:`Codex has granted this account ${t} free rate-limit reset${t===1?``:`s`}${e.title?` (${e.title})`:``}.${e.nextExpiresAt?` The next one expires on ${new Date(e.nextExpiresAt).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})}.`:``} A "Use reset" button appears here once a limit is reached; a reset moves the weekly reset date, so spending one earlier wastes it.`;return(0,G.jsxs)(J,{className:`inline-flex items-center gap-1 ${t>0?`text-primary`:``}`,hint:r,children:[(0,G.jsx)(c,{className:`size-3 shrink-0`,"aria-hidden":!0}),n,t>0&&e.nextExpiresAt&&(0,G.jsxs)(`span`,{className:`text-text-subtle`,children:[`· until `,te(e.nextExpiresAt)]})]})}var re={readOnly:`min-w-[220px]`,withActions:`min-w-[300px]`};function ie({entry:e,isActive:t,accountInfo:n,onToggle:r,toggling:i,onDelete:c,onExport:l,onViewProfile:p,flash:m,onSelect:h,unselectableReason:g,selecting:_,planLabel:v,dailyGuard:y,onDailyGuardToggle:b,dailyGuardToggling:x,reauthHint:S,onReauth:C,resetCredits:w,resetCreditAction:T,layout:k=`list`}){let{usage:j}=e,M=j.session||j.weekly||j.weeklyOpus||j.weeklySonnet||j.weeklyScoped?.length,N=n?.status??e.accountStatus,P=!!(n&&!n.hasRefreshToken&&n.expiresAt&&n.expiresAt<Math.floor(Date.now()/1e3)),F=U(n),I=!!n?.reauthRequired||!!S,L=n?.grantExpiresAt?n.grantExpiresAt*1e3:null,R=!!L&&L-Date.now()<5*864e5,z=!!n&&(F.label===`temp`||F.label===`unknown`||F.label===`expired`&&!P&&!I),B=L?new Date(L).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):null,V=!!(r||c||l||p),K=P?`Token expired — sign in again`:I?`Sign in again to use this account`:g??null,Y=k===`list`?``:k===`grid`?`flex flex-col justify-evenly overflow-hidden min-h-0`:`shrink-0 snap-start ${V?re.withActions:re.readOnly}`;return(0,G.jsxs)(ee,{active:t,flash:m,dense:k!==`list`,className:[Y,P||I?`opacity-50`:``].filter(Boolean).join(` `)||void 0,"data-testid":`account-card`,"data-account-id":e.accountId,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`span`,{className:`text-sm font-medium truncate flex-1 min-w-0`,children:e.accountLabel??e.accountId.slice(0,8)}),t&&(0,G.jsx)(J,{className:`text-[10px] text-primary shrink-0 font-medium`,hint:`The next turn will run on this account.`,children:`Active`}),h&&!t&&(0,G.jsxs)(O,{children:[(0,G.jsx)(E,{asChild:!0,children:(0,G.jsx)(`button`,{type:`button`,onClick:()=>h(e.accountId),disabled:_,className:[`shrink-0 rounded px-1.5 py-0.5 text-[10px] font-medium transition-colors cursor-pointer disabled:cursor-wait`,K?`text-text-subtle hover:text-error hover:bg-error/10`:`text-text-secondary hover:text-foreground hover:bg-surface-elevated`].join(` `),children:_?`Switching…`:`Use`})}),(0,G.jsx)(D,{side:`top`,children:K??`Use this account for this chat`})]}),P&&(0,G.jsx)(J,{className:`text-[10px] text-error shrink-0 font-medium`,hint:`This token has expired and carries no refresh token, so nothing can renew it. Sign in again to replace it.`,onClick:C?()=>C(e.accountId):void 0,children:`Expired`}),I&&!P&&(0,G.jsx)(J,{className:`text-[10px] text-error shrink-0 font-medium`,hint:S??`Anthropic rejected this account's refresh token, so no turn can run on it. Signing in again is the only thing that restores it.`,onClick:C?()=>C(e.accountId):void 0,children:`Sign in again`}),!e.isOAuth&&!P&&(0,G.jsx)(J,{className:`text-[10px] text-text-subtle shrink-0`,hint:`A static API key rather than a sign-in: nothing to expire and nothing to renew.`,children:`API key`}),v&&(0,G.jsx)(J,{className:`text-[10px] uppercase tracking-wide text-text-subtle shrink-0`,hint:`The subscription this account is on. It decides which quota windows the account has — some plans have a weekly limit and no shorter one.`,children:v}),(0,G.jsxs)(`div`,{className:`flex items-center gap-0.5 shrink-0`,children:[!P&&p&&n?.profileData&&(0,G.jsxs)(O,{children:[(0,G.jsx)(E,{asChild:!0,children:(0,G.jsx)(`button`,{className:`p-2 rounded cursor-pointer text-text-subtle hover:text-foreground hover:bg-surface-elevated transition-colors`,onClick:()=>p(n.profileData,e.accountId),"aria-label":`View profile`,children:(0,G.jsx)(d,{className:`size-4`})})}),(0,G.jsx)(D,{side:`top`,children:`View profile`})]}),!P&&l&&e.isOAuth&&(0,G.jsxs)(O,{children:[(0,G.jsx)(E,{asChild:!0,children:(0,G.jsx)(`button`,{className:`p-2 rounded cursor-pointer text-text-subtle hover:text-primary hover:bg-surface-elevated transition-colors`,onClick:()=>l(e.accountId),"aria-label":`Export this account`,children:(0,G.jsx)(f,{className:`size-4`})})}),(0,G.jsx)(D,{side:`top`,children:`Export this account`})]}),!P&&r&&(0,G.jsx)(A,{checked:N!==`disabled`,onCheckedChange:()=>r(e.accountId,N),disabled:i||N===`cooldown`,"aria-label":N===`disabled`?`Enable account`:`Disable account`,className:`cursor-pointer`}),c&&(0,G.jsxs)(O,{children:[(0,G.jsx)(E,{asChild:!0,children:(0,G.jsx)(`button`,{className:`p-2 rounded cursor-pointer text-text-subtle hover:text-error hover:bg-surface-elevated transition-colors`,onClick:()=>c(e.accountId,e.accountLabel??e.accountId.slice(0,8)),"aria-label":`Remove account`,children:(0,G.jsx)(a,{className:`size-4`})})}),(0,G.jsx)(D,{side:`top`,children:`Remove account`})]})]})]}),M?(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(q,{label:`5-Hour Session`,bucket:j.session}),(0,G.jsx)(q,{label:`Weekly`,bucket:j.weekly}),(0,G.jsx)(q,{label:`Weekly (Opus)`,bucket:j.weeklyOpus}),(0,G.jsx)(q,{label:`Weekly (Sonnet)`,bucket:j.weeklySonnet}),(0,G.jsx)(Q,{buckets:j.weeklyScoped})]}):(0,G.jsx)(`p`,{className:`text-xs text-text-subtle`,children:e.isOAuth?`No usage data yet`:`Usage tracking not available for API keys`}),y&&(0,G.jsxs)(`div`,{className:`flex min-h-12 items-center justify-between gap-3 rounded-md border px-2.5 py-1.5 ${y.enabled&&y.state.blocked?`border-error/40 bg-error/5`:`border-border/50 bg-surface/40`}`,children:[(0,G.jsxs)(`div`,{className:`min-w-0 space-y-0.5`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-medium ${y.enabled&&y.state.blocked?`text-error`:`text-text-secondary`}`,children:[(0,G.jsx)(`span`,{children:`Daily guard`}),(0,G.jsxs)(O,{children:[(0,G.jsx)(E,{asChild:!0,children:(0,G.jsx)(`button`,{type:`button`,"aria-label":`About Daily guard`,className:`text-text-subtle hover:text-text-primary cursor-help`,children:(0,G.jsx)(o,{className:`size-3.5`})})}),(0,G.jsx)(D,{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.`})]})]}),(0,G.jsx)(`p`,{className:`text-[10px] tabular-nums ${y.enabled&&y.state.blocked?`text-error`:`text-text-subtle`}`,children:y.enabled&&y.state.blocked?`${Math.round(y.state.used*100)}% used / ${Math.round(y.state.cap*100)}% daily cap. New turns paused.`:`Weekday ${y.state.day}/5, ${Math.round(y.state.cap*100)}% daily cap`})]}),b&&(0,G.jsx)(A,{checked:y.enabled,onCheckedChange:b,disabled:x,"aria-label":y.enabled?`Disable Daily guard`:`Enable Daily guard`,className:`cursor-pointer shrink-0`})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2 text-[10px] text-text-subtle flex-wrap`,children:[(0,G.jsx)(ne,{credits:w}),T,j.lastFetchedAt&&(0,G.jsxs)(J,{className:`inline-flex items-center gap-1`,hint:`Usage last read from Anthropic on ${new Date(j.lastFetchedAt).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})}. The bars above are only as current as this.`,children:[(0,G.jsx)(u,{className:`size-3 shrink-0`,"aria-hidden":!0}),W(new Date(j.lastFetchedAt).getTime())]}),L&&!I&&(0,G.jsxs)(J,{className:[`inline-flex items-center gap-1`,R?`text-warning`:``].filter(Boolean).join(` `),hint:`Sign-in stops working on ${B}. Anthropic ends every sign-in on a fixed schedule from the day it was made, whether or not the account gets used — refreshing does not extend it. After that the account fails until you sign in again.`,children:[(0,G.jsx)(s,{className:`size-3 shrink-0`,"aria-hidden":!0}),`sign-in `,H(L)]}),z&&(0,G.jsxs)(J,{className:F.color,hint:F.tip,children:[`© `,F.label]})]})]})}var $=e(t(),1);function ae(e){let t=e.usage;return[t.session?.utilization,t.weekly?.utilization,t.weeklyOpus?.utilization,t.weeklySonnet?.utilization,...(t.weeklyScoped??[]).map(e=>`${e.label}:${e.utilization}`)].join(`|`)}function oe(e=!0){let[t,n]=(0,$.useState)([]),[r,i]=(0,$.useState)([]),[a,o]=(0,$.useState)(null),[s,c]=(0,$.useState)(!0),[l,u]=(0,$.useState)(!1),[d,f]=(0,$.useState)(new Set),[p,m]=(0,$.useState)(null),h=(0,$.useRef)([]),g=(0,$.useRef)(void 0),_=(0,$.useCallback)(async()=>{let e=h.current.length>0;e?u(!0):c(!0);let[t,r,a]=await Promise.allSettled([P(),F(),j()]);if(t.status===`fulfilled`){let r=t.value;if(e){let e=new Map(h.current.map(e=>[e.accountId,ae(e)])),t=new Set(r.filter(t=>e.get(t.accountId)!==ae(t)).map(e=>e.accountId));t.size>0&&(f(t),clearTimeout(g.current),g.current=setTimeout(()=>f(new Set),1500))}h.current=r,n(r)}r.status===`fulfilled`&&i(r.value),a.status===`fulfilled`&&o(a.value?.id??null),c(!1),u(!1)},[]),v=(0,$.useCallback)(async(e,t)=>{m(e);let n=null;try{await M(e,{status:t===`disabled`?`active`:`disabled`})}catch(e){n=e.message}return m(null),await _(),n},[_]);return(0,$.useEffect)(()=>(e&&_(),()=>clearTimeout(g.current)),[e,_]),{usages:t,accounts:r,activeAccountId:a,initialLoading:s,refreshing:l,flashIds:d,reload:_,toggle:v,togglingId:p}}function se({open:e,onOpenChange:t,onSuccess:n,signInAgainFor:r}){let[i,a]=(0,$.useState)(``),[o,s]=(0,$.useState)(``),[c,l]=(0,$.useState)(!1),[u,d]=(0,$.useState)(null),[f,m]=(0,$.useState)(null),[h,g]=(0,$.useState)(``),[w,E]=(0,$.useState)(!1),[D,O]=(0,$.useState)(`idle`);function A(){m(null),g(``),O(`idle`),d(null)}function j(){t(!1),A(),a(``),s(``),d(null)}async function M(){E(!0),d(null);try{let{url:e,state:t}=await L();m(t),O(`waiting`),window.open(e,`_blank`)}catch(e){d(e.message)}E(!1)}async function P(){if(!(!h.trim()||!f)){E(!0),d(null);try{let e=h.trim();e.includes(`#`)&&(e=e.split(`#`)[0]??e);let t=await N(e,f);j(),n(t?.status===`disabled`?`Signed in. This account is still disabled — enable it to use it.`:`Account connected via OAuth!`)}catch(e){d(e.message)}E(!1)}}async function F(){if(i.trim()){l(!0),d(null);try{let e=await I({apiKey:i.trim(),label:o.trim()||void 0});j(),n(e?.status===`disabled`?`Token updated. This account is still disabled — enable it to use it.`:`Account added!`)}catch(e){d(e.message)}l(!1)}}let R=i.trim()?i.trim().startsWith(`sk-ant-oat`)?`OAuth token (Claude Max/Pro)`:i.trim().startsWith(`sk-ant-api`)?`API key`:`Unknown format`:``;return(0,G.jsx)(C,{open:e,onOpenChange:e=>{e||j()},children:(0,G.jsxs)(b,{className:`sm:max-w-md`,children:[(0,G.jsxs)(v,{children:[(0,G.jsx)(x,{className:`text-sm`,children:r?`Sign in again — ${r}`:`Add Claude Account`}),(0,G.jsx)(S,{className:`text-xs leading-relaxed`,children:r?`Log in with the same Claude account. PPM matches it by email and renews the existing card instead of adding a new one.`:`Connect via OAuth (recommended) or paste a token manually.`})]}),(0,G.jsxs)(`div`,{className:`space-y-3`,children:[(0,G.jsxs)(`div`,{className:`rounded-md border p-3 space-y-2`,children:[(0,G.jsx)(`p`,{className:`text-[11px] font-medium`,children:`Recommended: Login with Claude`}),D===`idle`?(0,G.jsx)(_,{size:`sm`,className:`w-full h-8 text-xs`,onClick:M,disabled:w,children:w?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(p,{className:`size-3 animate-spin mr-1`}),` Opening...`]}):`Login with Claude`}):(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Authorize in the opened tab, then paste the code:`}),(0,G.jsx)(T,{placeholder:`Paste code here...`,value:h,onChange:e=>g(e.target.value),className:`text-xs h-8 font-mono`,autoFocus:!0}),(0,G.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,G.jsx)(_,{size:`sm`,className:`flex-1 h-7 text-xs`,onClick:P,disabled:!h.trim()||w,children:w?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(p,{className:`size-3 animate-spin mr-1`}),` Connecting...`]}):`Connect`}),(0,G.jsx)(_,{size:`sm`,variant:`ghost`,className:`h-7 text-xs`,onClick:A,children:`Cancel`})]})]})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`div`,{className:`flex-1 border-t`}),(0,G.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`or paste token`}),(0,G.jsx)(`div`,{className:`flex-1 border-t`})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(k,{htmlFor:`add-token`,className:`text-xs`,children:`Token`}),(0,G.jsx)(T,{id:`add-token`,type:`password`,placeholder:`sk-ant-...`,value:i,onChange:e=>a(e.target.value),className:`text-xs h-8 font-mono`}),R&&(0,G.jsxs)(`p`,{className:`text-[10px] text-muted-foreground`,children:[`Detected: `,R]})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(k,{htmlFor:`add-label`,className:`text-xs`,children:`Label (optional)`}),(0,G.jsx)(T,{id:`add-label`,placeholder:`e.g. Personal, Work`,value:o,onChange:e=>s(e.target.value),className:`text-xs h-8`})]})]}),u&&(0,G.jsx)(`div`,{className:`text-[11px] p-2 rounded bg-error/10 text-error`,children:u}),(0,G.jsxs)(y,{children:[(0,G.jsx)(_,{size:`sm`,variant:`outline`,className:`text-xs h-7`,onClick:j,children:`Cancel`}),(0,G.jsx)(_,{size:`sm`,className:`text-xs h-7`,onClick:F,disabled:!i.trim()||c,children:c?`Adding...`:`Add Token`})]})]})})}function ce(e){return e?.trim()?{free:`ChatGPT Free`,go:`ChatGPT Go`,plus:`ChatGPT Plus`,pro:`ChatGPT Pro`,team:`ChatGPT Team`,business:`ChatGPT Business`,self_serve_business_prolite:`ChatGPT Business`,enterprise:`ChatGPT Enterprise`,edu:`ChatGPT Edu`}[e.trim().toLowerCase()]??e:null}var le=1440*60*1e3,ue=7,de=5;function fe(e,t=Date.now()){if(!e||e.windowHours!==168)return null;let n=new Date(e.resetsAt).getTime();if(!Number.isFinite(t)||!Number.isFinite(n)||n<=t)return null;let r=n-ue*le;if(t<r)return null;let i=Math.min(ue-1,Math.floor((t-r)/le)),a=0;for(let e=0;e<=i;e++){let t=new Date(r+e*le).getUTCDay();t!==0&&t!==6&&a++}let o=a/de;return{day:a,cap:o,used:e.utilization,blocked:e.utilization>=o}}var pe=`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.`,me=2e3,he=21e4;function ge(e){let[t,n]=(0,$.useState)([]),[r,i]=(0,$.useState)(`round-robin`),[a,o]=(0,$.useState)({}),[s,c]=(0,$.useState)(!1),[l,u]=(0,$.useState)(new Set),[d,f]=(0,$.useState)(``),[p,g]=(0,$.useState)(``),[_,v]=(0,$.useState)(!1),[y,b]=(0,$.useState)(null),[x,S]=(0,$.useState)(null),[C,w]=(0,$.useState)(!1),[T,E]=(0,$.useState)(null),[D,O]=(0,$.useState)(!1),[k,A]=(0,$.useState)(``),[j,M]=(0,$.useState)(!1),[N,P]=(0,$.useState)(``),[F,I]=(0,$.useState)(!1),[L,R]=(0,$.useState)(!1),[z,B]=(0,$.useState)(null),V=(0,$.useRef)(null),H=(0,$.useRef)(null),U=(0,$.useRef)(0),W=(0,$.useRef)(!1),G=(0,$.useRef)(!1),K=(0,$.useRef)(!1),q=(0,$.useRef)(e);q.current=e;let J=(0,$.useCallback)(async()=>{c(!0);try{let e=await m.get(`/api/codex-accounts`);n(e.accounts),i(e.strategy),m.get(`/api/codex-accounts/usage`).then(o).catch(()=>{})}finally{c(!1)}},[]);(0,$.useEffect)(()=>{J()},[J]);let Y=async()=>{if(!(!d.trim()||G.current||W.current||H.current)){G.current=!0,v(!0),b(null);try{await m.post(`/api/codex-accounts/api-key`,{apiKey:d.trim(),label:p.trim()||void 0}),f(``),g(``),e(),await J()}catch(e){b(e.message)}finally{G.current=!1,v(!1)}}},X=(0,$.useCallback)(()=>{U.current+=1,W.current=!1,K.current=!1,V.current?.(),V.current=null;let e=H.current;H.current=null,e&&m.del(`/api/codex-accounts/${e.method}-login/${e.id}`).catch(()=>{})},[]),Z=(0,$.useCallback)(()=>{X(),S(null),w(!1),E(null),O(!1),A(``),M(!1)},[X]),ee=(0,$.useCallback)((e,t)=>{let n=Date.now()+(t===`browser`?61e4:he),r=!1,i;V.current=()=>{r=!0,clearTimeout(i)};let a=async()=>{if(r)return;let o=null;try{o=await m.get(`/api/codex-accounts/${t}-login/${e}/status`)}catch{}if(!r){if(o?.state===`done`){Z(),g(``),q.current(),await J();return}if(o?.state===`error`||Date.now()>n){Z(),b(o?.state===`error`?o.error:`${t===`browser`?`Browser`:`Device`} login timed out.`);return}i=setTimeout(a,me)}};a()},[Z,J]);(0,$.useEffect)(()=>X,[X]);let Q=async(e,t)=>{if(W.current||H.current||G.current)return;W.current=!0;let n=++U.current;O(!0),b(null);try{let r=await m.post(`/api/codex-accounts/${e}-login`,{label:p.trim()||void 0,...t?{accountId:t}:{}});if(n!==U.current){m.del(`/api/codex-accounts/${e}-login/${r.id}`).catch(()=>{});return}H.current={id:r.id,method:e},e===`device`?(S(r),w(!0)):E(r),ee(r.id,e)}catch(e){n===U.current&&b(e.message)}finally{n===U.current&&(W.current=!1,O(!1))}};return{accounts:t,strategy:r,usages:a,loading:s,apiKey:d,setApiKey:f,label:p,setLabel:g,adding:_,err:y,setErr:b,device:x,deviceWaiting:C,backupPassword:N,setBackupPassword:P,exporting:F,importing:L,msg:z,setMsg:B,toggling:l,load:J,addApiKey:Y,startDevice:e=>Q(`device`,e),startBrowser:e=>Q(`browser`,e),browser:T,loginStarting:D,callbackUrl:k,setCallbackUrl:A,submittingCallback:j,submitCallback:async()=>{let e=H.current;if(e?.method!==`browser`||!k.trim()||K.current)return;let t=U.current;K.current=!0,M(!0),b(null);let n=k.trim();A(``);try{await m.post(`/api/codex-accounts/browser-login/${e.id}/callback`,{callbackUrl:n})}catch(e){t===U.current&&b(e.message)}finally{t===U.current&&(K.current=!1,M(!1))}},cancelLogin:Z,remove:async e=>{await m.del(`/api/codex-accounts/${e}`),await J()},toggle:async(e,t)=>{let n=t===`disabled`?`active`:`disabled`;u(t=>new Set(t).add(e)),b(null);try{await m.patch(`/api/codex-accounts/${e}`,{status:n}),await J()}catch(e){b(e.message||`Could not change the account`)}finally{u(t=>{let n=new Set(t);return n.delete(e),n})}},toggleDailyGuard:async(e,t)=>{u(t=>new Set(t).add(e)),b(null);try{await m.patch(`/api/codex-accounts/${e}`,{dailyGuardEnabled:!t}),await J()}catch(e){b(e.message||`Could not change Daily guard`)}finally{u(t=>{let n=new Set(t);return n.delete(e),n})}},changeStrategy:async e=>{i(e);try{await m.put(`/api/codex-accounts/strategy`,{strategy:e})}catch{}},doExport:async()=>{if(!N.trim()){b(`Set a backup password first.`);return}I(!0),b(null),B(null);try{let t={"Content-Type":`application/json`},n=h();n&&(t.Authorization=`Bearer ${n}`);let r=await fetch(`/api/codex-accounts/export`,{method:`POST`,headers:t,body:JSON.stringify({password:N})});if(!r.ok){let e=await r.json().catch(()=>({}));throw Error(e.error??`Export failed: ${r.status}`)}let i=await r.text(),a=new Blob([i],{type:`application/json`}),o=document.createElement(`a`);o.href=URL.createObjectURL(a),o.download=`ppm-codex-accounts-backup.json`,o.click(),URL.revokeObjectURL(o.href),B(`Backup downloaded.`),e()}catch(e){b(e.message)}finally{I(!1)}},doImport:async t=>{if(!N.trim()){b(`Enter the backup password first.`);return}R(!0),b(null),B(null);try{let n=await t.text(),r=await m.post(`/api/codex-accounts/import`,{data:n,password:N});B(`Imported ${r.imported}${r.skipped?`, skipped ${r.skipped}`:``}.`),e(),await J()}catch(e){b(e.message)}finally{R(!1)}}}}function _e({open:e,onOpenChange:t,label:n,onLabelChange:i,apiKey:a,onApiKeyChange:o,adding:c,onAddApiKey:u,deviceWaiting:d,onStartDevice:f,device:m,error:h,browser:g,onStartBrowser:w,loginStarting:E,callbackUrl:D,onCallbackUrlChange:O,submittingCallback:A,onSubmitCallback:j,reloginLabel:M}){let N=E||d||!!g||c;return(0,G.jsx)(C,{open:e,onOpenChange:t,children:(0,G.jsxs)(b,{className:`sm:max-w-md max-h-[90dvh] overflow-y-auto`,children:[(0,G.jsxs)(v,{children:[(0,G.jsx)(x,{className:`text-sm`,children:M?`Sign in again — ${M}`:`Add Codex Account`}),(0,G.jsx)(S,{className:`text-xs leading-relaxed`,children:M?`Sign in with ChatGPT to renew this account. It keeps its name, its settings and the chats bound to it.`:`Choose browser login, a device code, or an OpenAI API key.`})]}),(0,G.jsxs)(`div`,{className:`space-y-3`,children:[!M&&(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(k,{htmlFor:`codex-label`,className:`text-xs`,children:`Label (optional)`}),(0,G.jsx)(T,{id:`codex-label`,placeholder:`e.g. Personal, Work`,value:n,onChange:e=>i(e.target.value),disabled:N,className:`text-xs`})]}),(0,G.jsxs)(`div`,{className:`rounded-md border p-3 space-y-2`,children:[(0,G.jsx)(`p`,{className:`text-[11px] font-medium`,children:`Browser login`}),(0,G.jsxs)(_,{size:`sm`,className:`w-full cursor-pointer gap-1.5`,onClick:w,disabled:N,children:[(0,G.jsx)(l,{className:`size-4`}),` Sign in with browser`]}),g&&(0,G.jsxs)(`div`,{className:`space-y-2 text-xs`,children:[(0,G.jsxs)(`a`,{href:g.authUrl,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1 text-primary hover:underline`,children:[(0,G.jsx)(l,{className:`size-3`}),` Open ChatGPT sign-in`]}),(0,G.jsx)(`p`,{children:`Sign in, then copy the full localhost callback URL from the address bar and paste it below. On a phone, copy it even if the page fails to load.`}),(0,G.jsx)(k,{htmlFor:`codex-callback-url`,children:`Callback URL`}),(0,G.jsx)(T,{id:`codex-callback-url`,type:`password`,autoComplete:`off`,spellCheck:!1,placeholder:`http://localhost:.../auth/callback?...`,value:D,onChange:e=>O(e.target.value),disabled:A}),(0,G.jsxs)(_,{size:`sm`,onClick:j,disabled:!D.trim()||A,children:[A&&(0,G.jsx)(p,{className:`size-3 animate-spin`}),` Submit callback URL`]}),(0,G.jsxs)(`p`,{role:`status`,className:`flex items-center gap-1.5 text-muted-foreground`,children:[(0,G.jsx)(p,{className:`size-3 animate-spin`}),` Waiting for authorization. This may complete automatically on this computer.`]})]})]}),(0,G.jsxs)(`div`,{className:`rounded-md border p-3 space-y-2`,children:[(0,G.jsx)(`p`,{className:`text-[11px] font-medium`,children:`Device code`}),(0,G.jsx)(_,{size:`sm`,className:`w-full cursor-pointer gap-1.5`,onClick:f,disabled:N,children:d?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(p,{className:`size-4 animate-spin`}),` Waiting for authorization...`]}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(r,{className:`size-4`}),` Sign in with device code`]})}),m&&(0,G.jsxs)(`div`,{className:`rounded-md border border-primary/40 bg-primary/10 p-2.5 space-y-1.5`,children:[(0,G.jsx)(`p`,{className:`text-[11px]`,children:`Enter this code to authorize:`}),(0,G.jsx)(`div`,{className:`font-mono text-lg tracking-widest`,children:m.userCode}),(0,G.jsxs)(`a`,{href:m.verificationUrl,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1 text-primary hover:underline text-[11px]`,children:[(0,G.jsx)(l,{className:`size-3`}),` `,m.verificationUrl]})]})]}),!M&&(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`div`,{className:`flex-1 border-t`}),(0,G.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`or paste an API key`}),(0,G.jsx)(`div`,{className:`flex-1 border-t`})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(k,{htmlFor:`codex-api-key`,className:`text-xs`,children:`OpenAI API key`}),(0,G.jsx)(T,{id:`codex-api-key`,type:`password`,placeholder:`sk-...`,value:a,onChange:e=>o(e.target.value),className:`text-xs font-mono`})]})]})]}),E&&(0,G.jsx)(`p`,{role:`status`,className:`text-xs`,children:`Starting login...`}),h&&(0,G.jsx)(`div`,{role:`alert`,className:`text-[11px] p-2 rounded bg-error/10 text-error`,children:h}),(0,G.jsxs)(y,{children:[(0,G.jsx)(_,{size:`sm`,variant:`outline`,className:`text-xs cursor-pointer`,onClick:()=>t(!1),children:`Cancel`}),!M&&(0,G.jsxs)(_,{size:`sm`,className:`text-xs cursor-pointer gap-1.5`,onClick:u,disabled:!a.trim()||N,children:[c?(0,G.jsx)(p,{className:`size-3.5 animate-spin`}):(0,G.jsx)(s,{className:`size-3.5`}),`Add key`]})]})]})})}function ve({account:e,onClose:t,onDone:n}){let r=ge(()=>{n(),t()});return(0,G.jsx)(_e,{open:!0,onOpenChange:e=>{e||(r.cancelLogin(),t())},reloginLabel:e.label,label:r.label,onLabelChange:r.setLabel,apiKey:``,onApiKeyChange:()=>{},adding:!1,onAddApiKey:()=>{},deviceWaiting:r.deviceWaiting,onStartDevice:()=>void r.startDevice(e.id),device:r.device,browser:r.browser,onStartBrowser:()=>void r.startBrowser(e.id),loginStarting:r.loginStarting,callbackUrl:r.callbackUrl,onCallbackUrlChange:r.setCallbackUrl,submittingCallback:r.submittingCallback,onSubmitCallback:()=>void r.submitCallback(),error:r.err})}function ye(e){let t=e=>Math.round((e??0)*100)>=100;return t(e.session?.utilization)||t(e.weekly?.utilization)}function be(e){return ye(e)&&(e.resetCredits?.available??0)>0}var xe={reset:e=>`${e}: limits reset to 0%. The weekly reset date now counts from your next use.`,nothingToReset:e=>`${e}: nothing needed resetting, so the reset was kept.`,noCredit:e=>`${e} has no free reset left.`,alreadyRedeemed:e=>`${e}: that reset had already been used.`};function Se(e){return e?new Date(e).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):null}function Ce({account:e,usage:t,onDone:n}){let r=g(),[i,a]=(0,$.useState)(!1),[o,s]=(0,$.useState)(!1);if(!be(t))return null;let l=t.resetCredits;async function u(){s(!0);try{let t=await m.post(`/api/codex-accounts/${e.id}/reset-credit`);n(xe[t.outcome]?.(e.label)??`${e.label}: ${t.outcome}`)}catch(e){n(e.message||`Could not use the reset`)}finally{s(!1),a(!1)}}let d=Se(t.weekly?.resetsAt),f=Se(l.nextExpiresAt),h=(0,G.jsxs)(`div`,{className:`space-y-3`,"data-testid":`codex-reset-credit-confirm`,children:[(0,G.jsxs)(`p`,{className:`text-sm`,children:[`Use 1 of `,(0,G.jsx)(`span`,{className:`font-medium`,children:e.label}),`'s `,l.available,` free reset`,l.available===1?``:`s`,`?`]}),(0,G.jsxs)(`ul`,{className:`text-xs text-text-secondary space-y-1.5 list-disc pl-4`,children:[(0,G.jsxs)(`li`,{children:[l.title??`Full reset`,`: the 5-hour and weekly usage go back to 0% now.`]}),(0,G.jsxs)(`li`,{children:[`The weekly reset date moves: the next one is about 7 days after you continue using Codex`,d?`, not ${d} as now`:``,`. You do not also get that one.`]}),f&&(0,G.jsxs)(`li`,{children:[`This spends the reset that expires first (`,f,`).`]})]}),(0,G.jsxs)(`div`,{className:`flex flex-col-reverse md:flex-row gap-2 md:justify-end pt-1`,children:[(0,G.jsx)(_,{variant:`outline`,onClick:()=>a(!1),disabled:o,className:`min-h-11`,children:`Keep it`}),(0,G.jsxs)(_,{onClick:()=>void u(),disabled:o,className:`min-h-11 gap-1.5`,children:[o?(0,G.jsx)(p,{className:`size-4 animate-spin`}):(0,G.jsx)(c,{className:`size-4`}),`Use reset`]})]})]});return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(_,{size:`sm`,variant:`outline`,className:`min-h-11 md:min-h-0 md:h-7 gap-1 px-2 text-[11px] cursor-pointer border-primary/40 text-primary`,onClick:()=>a(!0),disabled:o,children:[(0,G.jsx)(c,{className:`size-3.5`}),` Use reset`]}),i&&(r?(0,G.jsx)(w,{open:!0,onClose:()=>{o||a(!1)},children:(0,G.jsxs)(`div`,{className:`px-4 pb-4`,children:[(0,G.jsx)(`h2`,{className:`text-base font-semibold mb-3`,children:`Use a free reset`}),h]})}):(0,G.jsx)(C,{open:!0,onOpenChange:e=>{!e&&!o&&a(!1)},children:(0,G.jsxs)(b,{className:`sm:max-w-sm`,children:[(0,G.jsx)(v,{children:(0,G.jsx)(x,{className:`text-sm`,children:`Use a free reset`})}),h]})}))]})}export{J as _,ge as a,W as b,se as c,ne as d,Q as f,X as g,Y as h,pe as i,oe as l,ee as m,ve as n,fe as o,Z as p,_e as r,ce as s,Ce as t,ie as u,q as v,B as x,K as y};
|
|
Binary file
|
|
Binary file
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-BHh12_0v.js";import{un as r}from"./icons-CO_II6D-.js";import{i,n as a}from"./api-client-c8YOpTlT.js";import{t as o}from"./settings-store-Br5c1efC.js";import{n as s}from"./use-is-mobile-BClDZJP5.js";import{C as c,S as l,Tn as u,rn as d}from"./index-
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-BHh12_0v.js";import{un as r}from"./icons-CO_II6D-.js";import{i,n as a}from"./api-client-c8YOpTlT.js";import{t as o}from"./settings-store-Br5c1efC.js";import{n as s}from"./use-is-mobile-BClDZJP5.js";import{C as c,S as l,Tn as u,rn as d}from"./index-C8nGqkKN.js";import{t as f}from"./use-monaco-theme-C88KphGx.js";import"./editor-font-BNwo7zo5.js";import{n as p,r as m}from"./monaco-dotenv-language-Bwq3gQsi.js";var h=e(t(),1),g=n();function _(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`,go:`go`,rs:`rust`,java:`java`,rb:`ruby`,php:`php`,swift:`swift`,sql:`sql`,xml:`xml`,toml:`toml`}[e.split(`.`).pop()?.toLowerCase()??``]??(p(e)?`dotenv`:`plaintext`)}function v(e){let t=e.split(`
|
|
2
2
|
`),n=[],r=0,i=0;for(;r<t.length;){let e=t[r];if(e.startsWith(`<<<<<<<`)){let a=r,o=e.substring(7).trim(),s=[];for(r++;r<t.length&&!t[r].startsWith(`=======`);)s.push(t[r]),r++;if(r>=t.length)break;let c=r,l=[];for(r++;r<t.length&&!t[r].startsWith(`>>>>>>>`);)l.push(t[r]),r++;if(r>=t.length)break;let u=t[r].substring(7).trim();n.push({id:i++,startLine:a+1,separatorLine:c+1,endLine:r+1,currentContent:s.join(`
|
|
3
3
|
`),incomingContent:l.join(`
|
|
4
4
|
`),currentLabel:o,incomingLabel:u})}r++}return n}function y({metadata:e}){let t=e?.filePath,n=e?.projectName,[p,y]=(0,h.useState)(null),[x,S]=(0,h.useState)(!0),[C,w]=(0,h.useState)(null),[T,E]=(0,h.useState)(0),D=(0,h.useRef)(null),O=(0,h.useRef)(null),k=(0,h.useRef)([]),A=(0,h.useRef)(null),{wordWrap:j,mobileWordWrap:M}=o(d(e=>({wordWrap:e.wordWrap,mobileWordWrap:e.mobileWordWrap}))),N=s()?M:j,P=f(),F=(0,h.useRef)(null),[I,L]=(0,h.useState)();(0,h.useEffect)(()=>{let e=F.current;if(!e)return;let t=new ResizeObserver(([e])=>{e&&L(Math.floor(e.contentRect.height))});return t.observe(e),()=>t.disconnect()},[]),(0,h.useEffect)(()=>u(F.current,()=>D.current?.layout()),[x,C]),(0,h.useEffect)(()=>{!t||!n||(S(!0),a.get(`${i(n)}/files/read?path=${encodeURIComponent(t)}`).then(e=>{y(e.content),S(!1)}).catch(e=>{w(e.message||`Failed to load file`),S(!1)}))},[t,n]);let R=(0,h.useCallback)(()=>{let e=D.current,t=O.current;if(!e||!t)return;let n=v(e.getModel()?.getValue()||``);E(n.length);for(let t of k.current)e.removeContentWidget(t);if(k.current=[],A.current&&A.current.clear(),n.length===0)return;let r=[];for(let e of n)r.push({range:new t.Range(e.startLine,1,e.startLine,1),options:{isWholeLine:!0,className:`conflict-marker-line`,glyphMarginClassName:`conflict-glyph-current`}}),r.push({range:new t.Range(e.separatorLine,1,e.separatorLine,1),options:{isWholeLine:!0,className:`conflict-marker-line`}}),r.push({range:new t.Range(e.endLine,1,e.endLine,1),options:{isWholeLine:!0,className:`conflict-marker-line`,glyphMarginClassName:`conflict-glyph-incoming`}}),e.separatorLine-e.startLine>1&&r.push({range:new t.Range(e.startLine+1,1,e.separatorLine-1,1),options:{isWholeLine:!0,className:`conflict-current-content`}}),e.endLine-e.separatorLine>1&&r.push({range:new t.Range(e.separatorLine+1,1,e.endLine-1,1),options:{isWholeLine:!0,className:`conflict-incoming-content`}});A.current=e.createDecorationsCollection(r);for(let r of n){let n=`conflict-widget-${r.id}`,i=document.createElement(`div`);i.className=`conflict-actions`,i.innerHTML=`<span class="conflict-label">Current Change (${b(r.currentLabel||`HEAD`)})</span><button class="conflict-btn conflict-btn-current" data-action="current">Accept Current</button><button class="conflict-btn conflict-btn-incoming" data-action="incoming">Accept Incoming</button><button class="conflict-btn conflict-btn-both" data-action="both">Accept Both</button>`,i.addEventListener(`click`,e=>{let t=e.target.closest(`[data-action]`);if(!t)return;let n=t.getAttribute(`data-action`);z(r.id,n)});let a={getId:()=>n,getDomNode:()=>i,getPosition:()=>({position:{lineNumber:r.startLine,column:1},preference:[t.editor.ContentWidgetPositionPreference.ABOVE]})};e.addContentWidget(a),k.current.push(a)}},[]),z=(0,h.useCallback)((e,t)=>{let n=D.current,r=O.current;if(!n||!r)return;let i=n.getModel();if(!i)return;let a=v(i.getValue()).find(t=>t.id===e);if(!a)return;let o;switch(t){case`current`:o=a.currentContent;break;case`incoming`:o=a.incomingContent;break;case`both`:o=a.currentContent+`
|
|
Binary file
|
|
Binary file
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-BHh12_0v.js";import{a as r,d as i}from"./icons-CO_II6D-.js";import{nn as a}from"./index-
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-BHh12_0v.js";import{a as r,d as i}from"./icons-CO_II6D-.js";import{nn as a}from"./index-C8nGqkKN.js";import{n as o,t as s}from"./csv-parser-DcRWxcNV.js";import{i as c,n as l,r as u,t as d}from"./lib-BY5fb-Cz.js";var f=e(t(),1),p=n();function m({content:e,onContentChange:t,wordWrap:n}){let m=(0,f.useMemo)(()=>s(e),[e]),[g,_]=(0,f.useState)(()=>m.rows),[v,y]=(0,f.useState)([]),b=(0,f.useRef)(null),x=(0,f.useRef)(!1);(0,f.useEffect)(()=>{if(x.current){x.current=!1;return}_(m.rows)},[m.rows]);let S=m.headers,C=(0,f.useCallback)((e,n,r)=>{_(i=>{let a=i.map((t,n)=>n===e?[...t]:t);return a[e][n]=r,x.current=!0,t(o(S,a)),a})},[S,t]),w=l({data:g,columns:(0,f.useMemo)(()=>S.map((e,t)=>({id:`col-${t}`,header:e||`Column ${t+1}`,accessorFn:e=>e[t]??``,cell:({row:e,getValue:r})=>(0,p.jsx)(h,{value:r(),onSave:n=>C(e.index,t,n),wordWrap:n}),size:150,minSize:80})),[S,C,n]),state:{sorting:v},onSortingChange:y,getCoreRowModel:u(),getSortedRowModel:c(),enableColumnResizing:!0,columnResizeMode:`onChange`}),{rows:T}=w.getRowModel(),E=a({count:T.length,getScrollElement:()=>b.current,estimateSize:()=>32,overscan:20});return S.length===0?(0,p.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground text-sm`,children:`Empty CSV file`}):(0,p.jsx)(`div`,{ref:b,className:`flex-1 overflow-auto`,children:(0,p.jsxs)(`table`,{className:`w-full text-xs font-mono border-collapse`,children:[(0,p.jsx)(`thead`,{className:`sticky top-0 bg-background z-10 border-b border-border block`,children:w.getHeaderGroups().map(e=>(0,p.jsx)(`tr`,{className:`flex w-full`,children:e.headers.map(e=>(0,p.jsxs)(`th`,{className:`relative text-left px-2 py-1.5 font-medium text-muted-foreground select-none cursor-pointer hover:bg-muted/50 border-r border-border last:border-r-0`,style:{width:e.getSize(),minWidth:e.getSize()},onClick:e.column.getToggleSortingHandler(),children:[(0,p.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,p.jsx)(`span`,{className:`truncate`,children:d(e.column.columnDef.header,e.getContext())}),e.column.getIsSorted()===`asc`&&(0,p.jsx)(i,{className:`size-3 shrink-0`}),e.column.getIsSorted()===`desc`&&(0,p.jsx)(r,{className:`size-3 shrink-0`})]}),(0,p.jsx)(`div`,{onMouseDown:e.getResizeHandler(),onTouchStart:e.getResizeHandler(),onClick:e=>e.stopPropagation(),className:`absolute right-0 top-0 h-full w-1 cursor-col-resize hover:bg-primary/50 active:bg-primary`})]},e.id))},e.id))}),(0,p.jsx)(`tbody`,{style:{height:E.getTotalSize(),position:`relative`,display:`block`},children:E.getVirtualItems().map(e=>{let t=T[e.index];return(0,p.jsx)(`tr`,{"data-index":e.index,ref:e=>E.measureElement(e),style:{position:`absolute`,top:0,left:0,width:`100%`,transform:`translateY(${e.start}px)`,display:`flex`},children:t.getVisibleCells().map(e=>(0,p.jsx)(`td`,{className:`px-2 py-1 border-b border-border/50 border-r border-r-border/30 last:border-r-0 ${n?`whitespace-pre-wrap break-words`:`truncate`}`,style:{width:e.column.getSize(),minWidth:e.column.getSize()},children:d(e.column.columnDef.cell,e.getContext())},e.id))},t.id)})})]})})}function h({value:e,onSave:t,wordWrap:n}){let[r,i]=(0,f.useState)(!1),[a,o]=(0,f.useState)(e),s=(0,f.useRef)(null),c=(0,f.useCallback)(e=>{e&&(e.style.height=`auto`,e.style.height=`${e.scrollHeight}px`)},[]);return(0,f.useEffect)(()=>{r&&s.current&&(s.current.focus(),c(s.current))},[r,c]),r?(0,p.jsx)(`textarea`,{ref:s,className:`w-full bg-transparent outline-none border border-primary/50 rounded text-xs font-mono resize-none p-0.5`,style:{minHeight:a.includes(`
|
|
2
2
|
`)?48:20},rows:1,value:a,onChange:e=>{o(e.target.value),c(e.target)},onBlur:()=>{i(!1),a!==e&&t(a)},onKeyDown:n=>{n.key===`Enter`&&!n.shiftKey?(n.preventDefault(),i(!1),a!==e&&t(a)):n.key===`Escape`&&(i(!1),o(e))}}):(0,p.jsx)(`span`,{className:`block cursor-text ${n?`whitespace-pre-wrap break-words`:`truncate`}`,onClick:()=>{o(e),i(!0)},children:e||`\xA0`})}export{m as CsvPreview};
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-BHh12_0v.js";import{Lt as r,_r as i,at as a,gr as o,ir as s,un as c}from"./icons-CO_II6D-.js";import{n as l,s as u}from"./api-client-c8YOpTlT.js";import"./settings-store-Br5c1efC.js";import"./panel-store-BUQ-CPsd.js";import"./window-store-B4cbZ5rr.js";import{t as d}from"./tab-store-DqeaGhhE.js";import{pt as f}from"./index-jG9mLs-J.js";import"./data-grid-types-CHD9-pon.js";import"./marked.esm-DDb9MclE.js";import"./use-monaco-theme-rH6epJYA.js";import{n as p,t as m}from"./glide-data-grid-Dj4vrDvj.js";import{t as h}from"./sql-query-editor-4iCGE4h2.js";var g=e(t(),1);function _(e,t,n,r){return`ppm-db-${e}-${n}.${t}-p${r}`}function v(e,t,n,r){try{let i=sessionStorage.getItem(_(e,t,n,r));return i?JSON.parse(i):null}catch{return null}}function y(e,t,n,r,i,a){try{sessionStorage.setItem(_(e,t,n,r),JSON.stringify({data:i,cols:a}))}catch{}}function b(e){let t=`/api/db/connections/${e}`,[n,r]=(0,g.useState)(null),[i,a]=(0,g.useState)(`public`),[o,s]=(0,g.useState)(null),[c,d]=(0,g.useState)([]),[f,p]=(0,g.useState)(!1),[m,h]=(0,g.useState)(null),[_,b]=(0,g.useState)(1),[x,S]=(0,g.useState)(null),[C,w]=(0,g.useState)(null),[T,E]=(0,g.useState)(!1),[D,O]=(0,g.useState)(null),[k,A]=(0,g.useState)(`ASC`),j=(0,g.useRef)(null),M=(0,g.useCallback)(async(r,a,o,c,u)=>{let f=r??n,m=a??i;if(!f)return;j.current=null,p(!0);let g=c===void 0?D:c,v=u??k;try{let n=g?`&orderBy=${encodeURIComponent(g)}&orderDir=${v}`:``,[r,i]=await Promise.all([l.get(`${t}/data?table=${encodeURIComponent(f)}&schema=${m}&page=${o??_}&limit=100${n}`),l.get(`${t}/schema?table=${encodeURIComponent(f)}&schema=${m}`)]);s(r),d(i),y(e,f,m,o??_,r,i)}catch(e){h(e.message)}finally{p(!1)}},[t,e,n,i,_,D,k]),N=(0,g.useCallback)((t,n=`public`)=>{r(t),a(n),b(1),S(null);let i=v(e,t,n,1);i?(s(i.data),d(i.cols),p(!1),M(t,n,1)):M(t,n,1)},[e,M]),P=(0,g.useCallback)(e=>{b(e),M(void 0,void 0,e)},[M]),F=(0,g.useCallback)(async e=>{j.current={sql:e,mode:`table`},p(!0);try{let n=await l.post(`${t}/query`,{sql:e,source:`filter`});n.changeType===`select`&&s({columns:n.columns,rows:n.rows,total:n.rows.length,page:1,limit:n.rows.length})}catch(e){h(e.message)}finally{p(!1)}},[t]),I=(0,g.useCallback)(async e=>{E(!0),w(null);try{let r=await l.post(`${t}/query`,{sql:e});S(r),r.changeType===`modify`?(j.current=null,M(n??void 0,i)):j.current={sql:e,mode:`query`}}catch(e){w(e.message)}finally{E(!1)}},[t,n,i,M]),L=(0,g.useCallback)((e,t)=>{let n=j.current;if(n?.mode===`table`){F(n.sql);return}M(e,t)},[F,M]),R=(0,g.useCallback)((e,t)=>{let n=t.message;h(n),u.error(`${e} failed`,{description:n})},[]),z=(0,g.useCallback)(async(e,r,a,o)=>{if(!n)return;let s=n,c=i;try{await l.put(`${t}/cell`,{table:s,schema:c,pkColumn:e,pkValue:r,column:a,value:o}),L(s,c)}catch(e){R(`Update cell`,e)}},[t,n,i,L,R]),B=(0,g.useCallback)(async(e,r)=>{if(!n)return;let a=n,o=i;try{await l.del(`${t}/row`,{table:a,schema:o,pkColumn:e,pkValue:r}),L(a,o)}catch(e){R(`Delete row`,e)}},[t,n,i,L,R]),V=(0,g.useCallback)(e=>{let t,n=`ASC`;D===e?k===`ASC`?(t=e,n=`DESC`):(t=null,n=`ASC`):(t=e,n=`ASC`),O(t),A(n),b(1),M(void 0,void 0,1,t,n)},[D,k,M]),H=(0,g.useCallback)(()=>{O(null),A(`ASC`),b(1),M(void 0,void 0,1,null,`ASC`)},[M]),U=(0,g.useCallback)(async(e,r)=>{if(!n)return;let a=n,o=i;try{await l.post(`${t}/rows/delete`,{table:a,schema:o,pkColumn:e,pkValues:r}),L(a,o)}catch(e){R(`Delete rows`,e)}},[t,n,i,L,R]),W=(0,g.useCallback)(async e=>{if(!n)return;let r=n,a=i;try{await l.post(`${t}/row`,{table:r,schema:a,values:e}),L(r,a)}catch(e){throw R(`Insert row`,e),e}},[t,n,i,L,R]),G=(0,g.useCallback)(()=>{let e=j.current;if(e?.mode===`query`){I(e.sql);return}if(e?.mode===`table`){F(e.sql);return}M()},[I,F,M]);return{selectedTable:n,selectedSchema:i,selectTable:N,tableData:o,schema:c,loading:f,error:m,page:_,setPage:P,orderBy:D,orderDir:k,toggleSort:V,clearSort:H,queryResult:x,queryError:C,queryLoading:T,executeQuery:I,updateCell:z,updateCellIn:(0,g.useCallback)(async(e,n,r,i,a,o)=>{try{await l.put(`${t}/cell`,{table:e,schema:n,pkColumn:r,pkValue:i,column:a,value:o}),G()}catch(e){R(`Update cell`,e)}},[t,G,R]),deleteRow:B,bulkDelete:U,insertRow:W,refreshData:M,queryAsTable:F,reload:G}}function x(e,t){let n=e.replace(/--[^\r\n]*/g,` `).replace(/\/\*[\s\S]*?\*\//g,` `).trim().replace(/;\s*$/,``);if(!/^select\s/i.test(n)||/\b(join|union|intersect|except|group\s+by|distinct)\b/i.test(n)||(n.match(/\bfrom\b/gi)??[]).length!==1)return null;let r=/\bfrom\s+(?:"([^"]+)"|(\w+))\s*(?:\.\s*(?:"([^"]+)"|(\w+)))?/i.exec(n);if(!r)return null;let i=r[1]??r[2],a=r[3]??r[4];return a?{schema:i,table:a}:{table:i,schema:t}}var S=n();function C(e){let t={},n=/"(\w+)"\s+ILIKE\s+'%([^']*?)%'/gi,r;for(;(r=n.exec(e))!==null;)t[r[1]]=r[2].replace(/''/g,`'`);return t}function w({metadata:e,tabId:t}){let n=e?.connectionId,u=e?.connectionName,_=e?.tableName,v=e?.schemaName??`public`,y=e?.initialSql,w=e?.currentSql,T=d(e=>e.updateTab),D=(0,g.useRef)(e);D.current=e;let O=(0,g.useCallback)(e=>{t&&T(t,{metadata:{...D.current,currentSql:e}})},[t,T]),k=b(n),{connections:A,updateConnection:j}=f(),M=(0,g.useMemo)(()=>A.find(e=>e.id===n),[A,n]),[N,P]=(0,g.useState)([]),[F,I]=(0,g.useState)(180),L=(0,g.useRef)(null),[R,z]=(0,g.useState)({}),B=(0,g.useMemo)(()=>{if(y&&!k.selectedTable)return y;if(k.selectedTable){let e=`SELECT * FROM "${k.selectedTable}"`,t=Object.entries(R).filter(([,e])=>e.trim()).map(([e,t])=>`"${e}" ILIKE '%${t.replace(/'/g,`''`)}%'`);t.length>0&&(e+=` WHERE ${t.join(` AND `)}`),k.orderBy&&(e+=` ORDER BY "${k.orderBy}" ${k.orderDir}`);let n=(k.page-1)*100;return e+=` LIMIT 100`,n>0&&(e+=` OFFSET ${n}`),e}return`SELECT * FROM `},[y,k.selectedTable,k.orderBy,k.orderDir,k.page,R]),V=(0,g.useCallback)(e=>{z(e)},[]),H=(0,g.useRef)(void 0),U=(0,g.useRef)(!1);(0,g.useEffect)(()=>{if(!k.selectedTable)return;let e=Object.values(R).some(e=>e.trim());if(!(!e&&!U.current))return U.current=e,clearTimeout(H.current),H.current=setTimeout(()=>{e?k.queryAsTable(B):k.refreshData()},500),()=>clearTimeout(H.current)},[R]);let W=(0,g.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=F,r=e=>{let r=e.clientY-t;I(Math.max(80,Math.min(n+r,(L.current?.clientHeight??600)-100)))},i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[F]);(0,g.useEffect)(()=>{l.get(`/api/db/connections/${n}/tables?cached=1`).then(e=>P(e.map(e=>({name:e.name,schema:e.schema})))).catch(()=>{})},[n]);let G=(0,g.useMemo)(()=>{if(N.length!==0)return{tables:N,getColumns:async(e,t)=>await l.get(`/api/db/connections/${n}/schema?table=${encodeURIComponent(e)}${t?`&schema=${encodeURIComponent(t)}`:``}`)}},[n,N]),K=(0,g.useRef)(!1);(0,g.useEffect)(()=>{K.current||(K.current=!0,y?k.executeQuery(y):_&&k.selectTable(_,v))},[_,v,y]);let[q,J]=(0,g.useState)(!!y),[Y,ee]=(0,g.useState)(y??null),te=(0,g.useCallback)(e=>{let t=e.trim();if(k.selectedTable&&RegExp(`^SELECT\\s+\\*\\s+FROM\\s+"?${k.selectedTable.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}"?\\b`,`i`).test(t)){z(C(t)),k.queryAsTable(t);return}J(!0),ee(t),k.executeQuery(e)},[k.executeQuery,k.queryAsTable,k.selectedTable]),ne=(0,g.useCallback)(e=>{J(!1),k.toggleSort(e)},[k.toggleSort]),re=(0,g.useCallback)(()=>{J(!1),k.clearSort()},[k.clearSort]),ie=(0,g.useCallback)(e=>{J(!1),k.setPage(e)},[k.setPage]),X=(0,g.useMemo)(()=>M&&!M.readonly&&Y?x(Y,k.selectedSchema):null,[M,Y,k.selectedSchema]),ae=(0,g.useCallback)((e,t,n,r)=>{X&&k.updateCellIn(X.table,X.schema,e,t,n,r)},[X,k.updateCellIn]),Z=k.queryResult,Q=q&&!!(Z||k.queryError),$=k.selectedTable&&!Q,oe=!($&&k.tableData)&&!Q&&(k.loading||k.queryLoading);return(0,S.jsx)(`div`,{ref:L,className:`flex h-full w-full overflow-hidden`,children:(0,S.jsxs)(`div`,{className:`flex-1 flex flex-col overflow-hidden`,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5 border-b border-border bg-background shrink-0`,children:[(0,S.jsx)(a,{className:`size-3.5 text-muted-foreground`}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground truncate`,children:u??`Database`}),k.selectedTable&&(0,S.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`/ `,k.selectedTable]}),(0,S.jsxs)(`div`,{className:`ml-auto flex items-center gap-1`,children:[k.tableData&&(0,S.jsx)(p,{columns:k.tableData.columns,rows:k.tableData.rows,filename:u?`${u}-${k.selectedTable??`data`}`:k.selectedTable??`data`,exportAllUrl:k.selectedTable?`/api/db/connections/${n}/export?table=${encodeURIComponent(k.selectedTable)}&schema=${k.selectedSchema}`:void 0}),M&&(0,S.jsx)(`button`,{type:`button`,onClick:()=>j(M.id,{readonly:M.readonly?0:1}),className:`flex items-center gap-0.5 px-1 py-0.5 rounded text-[10px] transition-colors ${M.readonly?`text-muted-foreground hover:text-foreground`:`bg-destructive/15 text-destructive`}`,title:M.readonly?`Readonly — click to allow writes`:`WRITE mode — click to enable readonly`,children:M.readonly?(0,S.jsx)(o,{className:`size-3`}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(i,{className:`size-3`}),(0,S.jsx)(`span`,{className:`font-medium`,children:`WRITE`})]})}),(0,S.jsx)(`button`,{type:`button`,onClick:()=>k.reload(),title:`Reload data`,className:`p-1 rounded text-muted-foreground hover:text-foreground transition-colors`,children:(0,S.jsx)(s,{className:`size-3 ${k.loading||k.queryLoading?`animate-spin`:``}`})})]})]}),(0,S.jsx)(`div`,{className:`shrink-0 border-b border-border`,style:{height:F},children:(0,S.jsx)(h,{onExecute:te,loading:k.queryLoading,defaultValue:B,schemaInfo:G,onSqlChange:O,persistedSql:w})}),(0,S.jsx)(`div`,{onMouseDown:W,className:`shrink-0 h-1.5 cursor-row-resize bg-border/50 hover:bg-primary/30 flex items-center justify-center transition-colors`,children:(0,S.jsx)(r,{className:`size-3 text-muted-foreground/50`})}),(0,S.jsxs)(`div`,{className:`flex-1 overflow-hidden`,children:[$&&k.tableData&&(0,S.jsx)(m,{columns:k.tableData.columns,rows:k.tableData.rows,total:k.tableData.total,limit:k.tableData.limit,schema:k.schema,loading:k.loading,page:k.page,onPageChange:ie,onCellUpdate:k.updateCell,onRowDelete:k.deleteRow,orderBy:k.orderBy,orderDir:k.orderDir,onToggleSort:ne,onClearSort:re,onBulkDelete:k.bulkDelete,onInsertRow:k.insertRow,connectionId:n,selectedTable:k.selectedTable,selectedSchema:k.selectedSchema,connectionName:u,columnFilters:R,onColumnFilter:V}),Q&&(0,S.jsx)(E,{result:Z,error:k.queryError,loading:k.queryLoading,schema:k.schema,connectionName:u,onCellUpdate:X?ae:void 0}),oe&&(0,S.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground`,children:(0,S.jsx)(c,{className:`size-4 animate-spin`})})]})]})})}var T=()=>{};function E({result:e,error:t,loading:n,schema:r,connectionName:i,onCellUpdate:a}){let o=(0,g.useMemo)(()=>e?.changeType===`select`&&e.rows.length>0?{columns:e.columns,rows:e.rows,total:e.rows.length,limit:e.rows.length}:null,[e]),s=(0,g.useMemo)(()=>{let t=e?.columns??[],n=new Set((r??[]).map(e=>e.name));return r?.length&&t.every(e=>n.has(e))?r:t.map(e=>({name:e,type:`text`,nullable:!0,pk:!1,defaultValue:null}))},[r,e?.columns]);return(0,S.jsxs)(`div`,{className:`flex flex-col h-full overflow-hidden text-xs`,children:[t&&(0,S.jsx)(`div`,{className:`px-3 py-2 text-destructive bg-destructive/5 shrink-0`,children:t}),e?.changeType===`modify`&&(0,S.jsxs)(`div`,{className:`px-3 py-2 text-success shrink-0`,children:[e.rowsAffected,` row(s) affected`,e.executionTimeMs!=null&&(0,S.jsxs)(`span`,{className:`text-muted-foreground ml-2`,children:[e.executionTimeMs,`ms`]})]}),o&&(0,S.jsxs)(`div`,{className:`flex-1 overflow-hidden`,children:[(0,S.jsx)(m,{columns:o.columns,rows:o.rows,total:o.total,limit:o.limit,schema:s,loading:!!n,page:1,onPageChange:T,onCellUpdate:a??T,readOnly:!a,orderBy:null,orderDir:`ASC`,onToggleSort:T,connectionName:i}),e?.executionTimeMs!=null&&(0,S.jsxs)(`div`,{className:`px-3 py-0.5 border-t border-border text-[10px] text-muted-foreground shrink-0`,children:[e.rows.length,` rows · `,e.executionTimeMs,`ms`]})]}),e?.changeType===`select`&&e.rows.length===0&&(0,S.jsxs)(`div`,{className:`px-3 py-2 text-muted-foreground shrink-0`,children:[`No results`,e.executionTimeMs!=null&&(0,S.jsxs)(`span`,{className:`ml-2 text-muted-foreground/60`,children:[e.executionTimeMs,`ms`]})]}),!e&&!t&&(0,S.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground`,children:n?(0,S.jsx)(c,{className:`size-4 animate-spin`}):`Run a query to see results`})]})}export{w as DatabaseViewer};
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-BHh12_0v.js";import{Lt as r,_r as i,at as a,gr as o,ir as s,un as c}from"./icons-CO_II6D-.js";import{n as l,s as u}from"./api-client-c8YOpTlT.js";import"./settings-store-Br5c1efC.js";import"./panel-store-BUQ-CPsd.js";import"./window-store-B4cbZ5rr.js";import{t as d}from"./tab-store-DqeaGhhE.js";import{pt as f}from"./index-C8nGqkKN.js";import"./data-grid-types-CHD9-pon.js";import"./marked.esm-DDb9MclE.js";import"./use-monaco-theme-C88KphGx.js";import{n as p,t as m}from"./glide-data-grid-R4PcAntf.js";import{t as h}from"./sql-query-editor-BjIMi9Wk.js";var g=e(t(),1);function _(e,t,n,r){return`ppm-db-${e}-${n}.${t}-p${r}`}function v(e,t,n,r){try{let i=sessionStorage.getItem(_(e,t,n,r));return i?JSON.parse(i):null}catch{return null}}function y(e,t,n,r,i,a){try{sessionStorage.setItem(_(e,t,n,r),JSON.stringify({data:i,cols:a}))}catch{}}function b(e){let t=`/api/db/connections/${e}`,[n,r]=(0,g.useState)(null),[i,a]=(0,g.useState)(`public`),[o,s]=(0,g.useState)(null),[c,d]=(0,g.useState)([]),[f,p]=(0,g.useState)(!1),[m,h]=(0,g.useState)(null),[_,b]=(0,g.useState)(1),[x,S]=(0,g.useState)(null),[C,w]=(0,g.useState)(null),[T,E]=(0,g.useState)(!1),[D,O]=(0,g.useState)(null),[k,A]=(0,g.useState)(`ASC`),j=(0,g.useRef)(null),M=(0,g.useCallback)(async(r,a,o,c,u)=>{let f=r??n,m=a??i;if(!f)return;j.current=null,p(!0);let g=c===void 0?D:c,v=u??k;try{let n=g?`&orderBy=${encodeURIComponent(g)}&orderDir=${v}`:``,[r,i]=await Promise.all([l.get(`${t}/data?table=${encodeURIComponent(f)}&schema=${m}&page=${o??_}&limit=100${n}`),l.get(`${t}/schema?table=${encodeURIComponent(f)}&schema=${m}`)]);s(r),d(i),y(e,f,m,o??_,r,i)}catch(e){h(e.message)}finally{p(!1)}},[t,e,n,i,_,D,k]),N=(0,g.useCallback)((t,n=`public`)=>{r(t),a(n),b(1),S(null);let i=v(e,t,n,1);i?(s(i.data),d(i.cols),p(!1),M(t,n,1)):M(t,n,1)},[e,M]),P=(0,g.useCallback)(e=>{b(e),M(void 0,void 0,e)},[M]),F=(0,g.useCallback)(async e=>{j.current={sql:e,mode:`table`},p(!0);try{let n=await l.post(`${t}/query`,{sql:e,source:`filter`});n.changeType===`select`&&s({columns:n.columns,rows:n.rows,total:n.rows.length,page:1,limit:n.rows.length})}catch(e){h(e.message)}finally{p(!1)}},[t]),I=(0,g.useCallback)(async e=>{E(!0),w(null);try{let r=await l.post(`${t}/query`,{sql:e});S(r),r.changeType===`modify`?(j.current=null,M(n??void 0,i)):j.current={sql:e,mode:`query`}}catch(e){w(e.message)}finally{E(!1)}},[t,n,i,M]),L=(0,g.useCallback)((e,t)=>{let n=j.current;if(n?.mode===`table`){F(n.sql);return}M(e,t)},[F,M]),R=(0,g.useCallback)((e,t)=>{let n=t.message;h(n),u.error(`${e} failed`,{description:n})},[]),z=(0,g.useCallback)(async(e,r,a,o)=>{if(!n)return;let s=n,c=i;try{await l.put(`${t}/cell`,{table:s,schema:c,pkColumn:e,pkValue:r,column:a,value:o}),L(s,c)}catch(e){R(`Update cell`,e)}},[t,n,i,L,R]),B=(0,g.useCallback)(async(e,r)=>{if(!n)return;let a=n,o=i;try{await l.del(`${t}/row`,{table:a,schema:o,pkColumn:e,pkValue:r}),L(a,o)}catch(e){R(`Delete row`,e)}},[t,n,i,L,R]),V=(0,g.useCallback)(e=>{let t,n=`ASC`;D===e?k===`ASC`?(t=e,n=`DESC`):(t=null,n=`ASC`):(t=e,n=`ASC`),O(t),A(n),b(1),M(void 0,void 0,1,t,n)},[D,k,M]),H=(0,g.useCallback)(()=>{O(null),A(`ASC`),b(1),M(void 0,void 0,1,null,`ASC`)},[M]),U=(0,g.useCallback)(async(e,r)=>{if(!n)return;let a=n,o=i;try{await l.post(`${t}/rows/delete`,{table:a,schema:o,pkColumn:e,pkValues:r}),L(a,o)}catch(e){R(`Delete rows`,e)}},[t,n,i,L,R]),W=(0,g.useCallback)(async e=>{if(!n)return;let r=n,a=i;try{await l.post(`${t}/row`,{table:r,schema:a,values:e}),L(r,a)}catch(e){throw R(`Insert row`,e),e}},[t,n,i,L,R]),G=(0,g.useCallback)(()=>{let e=j.current;if(e?.mode===`query`){I(e.sql);return}if(e?.mode===`table`){F(e.sql);return}M()},[I,F,M]);return{selectedTable:n,selectedSchema:i,selectTable:N,tableData:o,schema:c,loading:f,error:m,page:_,setPage:P,orderBy:D,orderDir:k,toggleSort:V,clearSort:H,queryResult:x,queryError:C,queryLoading:T,executeQuery:I,updateCell:z,updateCellIn:(0,g.useCallback)(async(e,n,r,i,a,o)=>{try{await l.put(`${t}/cell`,{table:e,schema:n,pkColumn:r,pkValue:i,column:a,value:o}),G()}catch(e){R(`Update cell`,e)}},[t,G,R]),deleteRow:B,bulkDelete:U,insertRow:W,refreshData:M,queryAsTable:F,reload:G}}function x(e,t){let n=e.replace(/--[^\r\n]*/g,` `).replace(/\/\*[\s\S]*?\*\//g,` `).trim().replace(/;\s*$/,``);if(!/^select\s/i.test(n)||/\b(join|union|intersect|except|group\s+by|distinct)\b/i.test(n)||(n.match(/\bfrom\b/gi)??[]).length!==1)return null;let r=/\bfrom\s+(?:"([^"]+)"|(\w+))\s*(?:\.\s*(?:"([^"]+)"|(\w+)))?/i.exec(n);if(!r)return null;let i=r[1]??r[2],a=r[3]??r[4];return a?{schema:i,table:a}:{table:i,schema:t}}var S=n();function C(e){let t={},n=/"(\w+)"\s+ILIKE\s+'%([^']*?)%'/gi,r;for(;(r=n.exec(e))!==null;)t[r[1]]=r[2].replace(/''/g,`'`);return t}function w({metadata:e,tabId:t}){let n=e?.connectionId,u=e?.connectionName,_=e?.tableName,v=e?.schemaName??`public`,y=e?.initialSql,w=e?.currentSql,T=d(e=>e.updateTab),D=(0,g.useRef)(e);D.current=e;let O=(0,g.useCallback)(e=>{t&&T(t,{metadata:{...D.current,currentSql:e}})},[t,T]),k=b(n),{connections:A,updateConnection:j}=f(),M=(0,g.useMemo)(()=>A.find(e=>e.id===n),[A,n]),[N,P]=(0,g.useState)([]),[F,I]=(0,g.useState)(180),L=(0,g.useRef)(null),[R,z]=(0,g.useState)({}),B=(0,g.useMemo)(()=>{if(y&&!k.selectedTable)return y;if(k.selectedTable){let e=`SELECT * FROM "${k.selectedTable}"`,t=Object.entries(R).filter(([,e])=>e.trim()).map(([e,t])=>`"${e}" ILIKE '%${t.replace(/'/g,`''`)}%'`);t.length>0&&(e+=` WHERE ${t.join(` AND `)}`),k.orderBy&&(e+=` ORDER BY "${k.orderBy}" ${k.orderDir}`);let n=(k.page-1)*100;return e+=` LIMIT 100`,n>0&&(e+=` OFFSET ${n}`),e}return`SELECT * FROM `},[y,k.selectedTable,k.orderBy,k.orderDir,k.page,R]),V=(0,g.useCallback)(e=>{z(e)},[]),H=(0,g.useRef)(void 0),U=(0,g.useRef)(!1);(0,g.useEffect)(()=>{if(!k.selectedTable)return;let e=Object.values(R).some(e=>e.trim());if(!(!e&&!U.current))return U.current=e,clearTimeout(H.current),H.current=setTimeout(()=>{e?k.queryAsTable(B):k.refreshData()},500),()=>clearTimeout(H.current)},[R]);let W=(0,g.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=F,r=e=>{let r=e.clientY-t;I(Math.max(80,Math.min(n+r,(L.current?.clientHeight??600)-100)))},i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[F]);(0,g.useEffect)(()=>{l.get(`/api/db/connections/${n}/tables?cached=1`).then(e=>P(e.map(e=>({name:e.name,schema:e.schema})))).catch(()=>{})},[n]);let G=(0,g.useMemo)(()=>{if(N.length!==0)return{tables:N,getColumns:async(e,t)=>await l.get(`/api/db/connections/${n}/schema?table=${encodeURIComponent(e)}${t?`&schema=${encodeURIComponent(t)}`:``}`)}},[n,N]),K=(0,g.useRef)(!1);(0,g.useEffect)(()=>{K.current||(K.current=!0,y?k.executeQuery(y):_&&k.selectTable(_,v))},[_,v,y]);let[q,J]=(0,g.useState)(!!y),[Y,ee]=(0,g.useState)(y??null),te=(0,g.useCallback)(e=>{let t=e.trim();if(k.selectedTable&&RegExp(`^SELECT\\s+\\*\\s+FROM\\s+"?${k.selectedTable.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}"?\\b`,`i`).test(t)){z(C(t)),k.queryAsTable(t);return}J(!0),ee(t),k.executeQuery(e)},[k.executeQuery,k.queryAsTable,k.selectedTable]),ne=(0,g.useCallback)(e=>{J(!1),k.toggleSort(e)},[k.toggleSort]),re=(0,g.useCallback)(()=>{J(!1),k.clearSort()},[k.clearSort]),ie=(0,g.useCallback)(e=>{J(!1),k.setPage(e)},[k.setPage]),X=(0,g.useMemo)(()=>M&&!M.readonly&&Y?x(Y,k.selectedSchema):null,[M,Y,k.selectedSchema]),ae=(0,g.useCallback)((e,t,n,r)=>{X&&k.updateCellIn(X.table,X.schema,e,t,n,r)},[X,k.updateCellIn]),Z=k.queryResult,Q=q&&!!(Z||k.queryError),$=k.selectedTable&&!Q,oe=!($&&k.tableData)&&!Q&&(k.loading||k.queryLoading);return(0,S.jsx)(`div`,{ref:L,className:`flex h-full w-full overflow-hidden`,children:(0,S.jsxs)(`div`,{className:`flex-1 flex flex-col overflow-hidden`,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5 border-b border-border bg-background shrink-0`,children:[(0,S.jsx)(a,{className:`size-3.5 text-muted-foreground`}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground truncate`,children:u??`Database`}),k.selectedTable&&(0,S.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`/ `,k.selectedTable]}),(0,S.jsxs)(`div`,{className:`ml-auto flex items-center gap-1`,children:[k.tableData&&(0,S.jsx)(p,{columns:k.tableData.columns,rows:k.tableData.rows,filename:u?`${u}-${k.selectedTable??`data`}`:k.selectedTable??`data`,exportAllUrl:k.selectedTable?`/api/db/connections/${n}/export?table=${encodeURIComponent(k.selectedTable)}&schema=${k.selectedSchema}`:void 0}),M&&(0,S.jsx)(`button`,{type:`button`,onClick:()=>j(M.id,{readonly:M.readonly?0:1}),className:`flex items-center gap-0.5 px-1 py-0.5 rounded text-[10px] transition-colors ${M.readonly?`text-muted-foreground hover:text-foreground`:`bg-destructive/15 text-destructive`}`,title:M.readonly?`Readonly — click to allow writes`:`WRITE mode — click to enable readonly`,children:M.readonly?(0,S.jsx)(o,{className:`size-3`}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(i,{className:`size-3`}),(0,S.jsx)(`span`,{className:`font-medium`,children:`WRITE`})]})}),(0,S.jsx)(`button`,{type:`button`,onClick:()=>k.reload(),title:`Reload data`,className:`p-1 rounded text-muted-foreground hover:text-foreground transition-colors`,children:(0,S.jsx)(s,{className:`size-3 ${k.loading||k.queryLoading?`animate-spin`:``}`})})]})]}),(0,S.jsx)(`div`,{className:`shrink-0 border-b border-border`,style:{height:F},children:(0,S.jsx)(h,{onExecute:te,loading:k.queryLoading,defaultValue:B,schemaInfo:G,onSqlChange:O,persistedSql:w})}),(0,S.jsx)(`div`,{onMouseDown:W,className:`shrink-0 h-1.5 cursor-row-resize bg-border/50 hover:bg-primary/30 flex items-center justify-center transition-colors`,children:(0,S.jsx)(r,{className:`size-3 text-muted-foreground/50`})}),(0,S.jsxs)(`div`,{className:`flex-1 overflow-hidden`,children:[$&&k.tableData&&(0,S.jsx)(m,{columns:k.tableData.columns,rows:k.tableData.rows,total:k.tableData.total,limit:k.tableData.limit,schema:k.schema,loading:k.loading,page:k.page,onPageChange:ie,onCellUpdate:k.updateCell,onRowDelete:k.deleteRow,orderBy:k.orderBy,orderDir:k.orderDir,onToggleSort:ne,onClearSort:re,onBulkDelete:k.bulkDelete,onInsertRow:k.insertRow,connectionId:n,selectedTable:k.selectedTable,selectedSchema:k.selectedSchema,connectionName:u,columnFilters:R,onColumnFilter:V}),Q&&(0,S.jsx)(E,{result:Z,error:k.queryError,loading:k.queryLoading,schema:k.schema,connectionName:u,onCellUpdate:X?ae:void 0}),oe&&(0,S.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground`,children:(0,S.jsx)(c,{className:`size-4 animate-spin`})})]})]})})}var T=()=>{};function E({result:e,error:t,loading:n,schema:r,connectionName:i,onCellUpdate:a}){let o=(0,g.useMemo)(()=>e?.changeType===`select`&&e.rows.length>0?{columns:e.columns,rows:e.rows,total:e.rows.length,limit:e.rows.length}:null,[e]),s=(0,g.useMemo)(()=>{let t=e?.columns??[],n=new Set((r??[]).map(e=>e.name));return r?.length&&t.every(e=>n.has(e))?r:t.map(e=>({name:e,type:`text`,nullable:!0,pk:!1,defaultValue:null}))},[r,e?.columns]);return(0,S.jsxs)(`div`,{className:`flex flex-col h-full overflow-hidden text-xs`,children:[t&&(0,S.jsx)(`div`,{className:`px-3 py-2 text-destructive bg-destructive/5 shrink-0`,children:t}),e?.changeType===`modify`&&(0,S.jsxs)(`div`,{className:`px-3 py-2 text-success shrink-0`,children:[e.rowsAffected,` row(s) affected`,e.executionTimeMs!=null&&(0,S.jsxs)(`span`,{className:`text-muted-foreground ml-2`,children:[e.executionTimeMs,`ms`]})]}),o&&(0,S.jsxs)(`div`,{className:`flex-1 overflow-hidden`,children:[(0,S.jsx)(m,{columns:o.columns,rows:o.rows,total:o.total,limit:o.limit,schema:s,loading:!!n,page:1,onPageChange:T,onCellUpdate:a??T,readOnly:!a,orderBy:null,orderDir:`ASC`,onToggleSort:T,connectionName:i}),e?.executionTimeMs!=null&&(0,S.jsxs)(`div`,{className:`px-3 py-0.5 border-t border-border text-[10px] text-muted-foreground shrink-0`,children:[e.rows.length,` rows · `,e.executionTimeMs,`ms`]})]}),e?.changeType===`select`&&e.rows.length===0&&(0,S.jsxs)(`div`,{className:`px-3 py-2 text-muted-foreground shrink-0`,children:[`No results`,e.executionTimeMs!=null&&(0,S.jsxs)(`span`,{className:`ml-2 text-muted-foreground/60`,children:[e.executionTimeMs,`ms`]})]}),!e&&!t&&(0,S.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground`,children:n?(0,S.jsx)(c,{className:`size-4 animate-spin`}):`Run a query to see results`})]})}export{w as DatabaseViewer};
|
|
Binary file
|
|
Binary file
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pptx-export-CG6MRNok.js","assets/rolldown-runtime-C5c2KzVm.js","assets/preload-helper-BEFjQwLd.js","assets/vendor-ui-BHh12_0v.js","assets/vendor-markdown-QKPNiWEd.js","assets/api-client-c8YOpTlT.js","assets/design-export-client-ChMcMoqW.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-BHh12_0v.js";import{$n as r,An as i,En as a,Er as o,Fr as s,Jr as c,Ln as l,Mr as u,Nn as d,Nr as f,O as p,Pn as m,T as h,Ut as g,Z as _,ar as v,bn as y,br as b,ct as x,d as S,dr as C,er as w,et as T,ft as E,gn as D,ir as O,j as k,pt as A,r as j,st as M,un as N,vr as ee,wn as te,yn as ne,yr as re}from"./icons-CO_II6D-.js";import{t as ie}from"./chat-tab-
|
|
2
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-BHh12_0v.js";import{$n as r,An as i,En as a,Er as o,Fr as s,Jr as c,Ln as l,Mr as u,Nn as d,Nr as f,O as p,Pn as m,T as h,Ut as g,Z as _,ar as v,bn as y,br as b,ct as x,d as S,dr as C,er as w,et as T,ft as E,gn as D,ir as O,j as k,pt as A,r as j,st as M,un as N,vr as ee,wn as te,yn as ne,yr as re}from"./icons-CO_II6D-.js";import{t as ie}from"./chat-tab-DaEHva22.js";import{i as P,n as F,r as ae,s as I}from"./api-client-c8YOpTlT.js";import{t as oe}from"./settings-store-Br5c1efC.js";import{t as se}from"./preload-helper-BEFjQwLd.js";import{n as L}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import{t as ce}from"./panel-store-BUQ-CPsd.js";import"./window-store-B4cbZ5rr.js";import"./project-store-C5gJXkvb.js";import"./project-framework-store-XxFXcUpb.js";import"./tab-store-DqeaGhhE.js";import{t as le}from"./format-date-BMtvCeb9.js";import"./context-menu-CjYTq8DI.js";import"./chat-preparation-cache-BSIQGiWx.js";import"./file-store-D9KE0kQC.js";import{n as ue}from"./use-is-mobile-BClDZJP5.js";import{u as de}from"./onboarding-quick-orientation-DIhWv1CN.js";import{t as R}from"./button-Ci9EUgqd.js";import"./dialog-B8clVkyi.js";import{t as fe}from"./mobile-bottom-sheet-CuNi2FRv.js";import"./use-visual-viewport-BGpcMnIx.js";import"./fs-api-DL36slbd.js";import{o as pe}from"./format-file-meta-mQwA6SuY.js";import{t as me}from"./input-CG8PS8mS.js";import"./ws-auth-kXgsX2Js.js";import{Jn as he,Jt as z,Kt as ge,Xn as _e,Yn as ve,Zt as ye,cn as be,d as xe,dn as Se,gn as Ce,h as we,hn as Te,i as Ee,in as De,l as Oe,ln as ke,m as Ae,on as je,qt as Me,sn as Ne,tn as Pe,u as Fe,un as Ie,yn as B}from"./index-C8nGqkKN.js";import"./use-websocket-Chk9guIU.js";import{a as Le}from"./api-settings-BmvNoCbn.js";import"./tool-cards-D0-krtA2.js";import"./use-blob-url-CmavyEP8.js";import"./libesm-DVoOUgb7.js";import"./onboarding-entry-CmUqv1kl.js";import"./use-open-team-member-B0eUOKKj.js";import{n as Re,r as ze,t as Be}from"./send-to-chat-CyZ37y5J.js";import"./ai-settings-section-CEbW8jRy.js";import"./codex-reset-credit-button-CbmE5mRX.js";import{t as Ve}from"./new-chat-provider-Cp7JsC5q.js";import{a as He,i as Ue,n as We,r as Ge}from"./design-export-client-ChMcMoqW.js";import{t as Ke}from"./design-responsive-dialog-DNBhJJLf.js";var V=e(t(),1),qe=200;function Je(e,t){let[n,r]=(0,V.useState)(`resolving`),[i,a]=(0,V.useState)(0),o=String(t.projectName??``),s=String(t.designSlug??``),c=typeof t.sessionId==`string`?t.sessionId:void 0,l=t.designSessionChecked===!0,u=t.providerPending===!0||typeof t.providerId!=`string`,d=typeof t.designChatEpoch==`number`?t.designChatEpoch:0;(0,V.useEffect)(()=>{if(!o||!s)return;let t=!1;return r(e=>e===`ready`&&!u&&(c||l)?e:`resolving`),(async()=>{if(!c&&!l){let n=new URLSearchParams({limit:String(qe),offset:`0`}),r=await F.get(`${P(o)}/chat/sessions?${n}`);if(t)return;let i=r.sessions.find(e=>e.designSlug===s);B(e,{designSessionChecked:!0,...i?{sessionId:i.id,providerId:i.providerId,providerPending:void 0,designChatEpoch:d+1}:{}});return}if(u){let[n,i]=await Promise.all([Le(),xe(o)]);if(t)return;let a=Ve(n),s=i.find(e=>e.id===a)??i[0];if(!s){r(`no-provider`);return}B(e,{providerId:s.id,providerPending:void 0});return}r(`ready`)})().catch(e=>{console.warn(`[design] could not prepare the chat for ${s}: ${e.message}`),t||r(`error`)}),()=>{t=!0}},[e,o,s,c,l,u,i]);let f=(0,V.useCallback)(()=>a(e=>e+1),[]),p=(0,V.useCallback)(t=>{B(e,{sessionId:void 0,pendingMessage:void 0,clearedFrom:t,designSessionChecked:!0,designChatEpoch:Ce({designChatEpoch:d})})},[e,d]),m=(0,V.useCallback)(t=>{B(e,{sessionId:t.sessionId,providerId:t.providerId,pendingMessage:t.pendingMessage,designChatEpoch:Ce({designChatEpoch:d})})},[e,d]);return{status:n,retry:f,epoch:d,sessionId:c??null,startNewSession:p,adoptFork:m}}var Ye=`ppm:design-show-chat`;function Xe(e,t,n){if(!e||!t.trim())return;let r=!1,i=()=>{r=!0};window.addEventListener(Be,i);try{window.dispatchEvent(new CustomEvent(Re,{detail:{text:t,label:n,targetTabId:e}}))}finally{window.removeEventListener(Be,i)}r||B(e,{pendingMessage:t}),Qe(e)}function Ze(e,t,n){if(!e||!t.trim())return`none`;let r=`none`,i=e=>{r=e.detail?.sent?`sent`:`chip`};window.addEventListener(Be,i);try{window.dispatchEvent(new CustomEvent(Re,{detail:{text:t,label:n,targetTabId:e,autoSend:!0}}))}finally{window.removeEventListener(Be,i)}return r}function Qe(e){window.dispatchEvent(new CustomEvent(Ye,{detail:{tabId:e}}))}var $e=(0,V.createContext)(null);function et(){let e=(0,V.useContext)($e);if(!e)throw Error(`useDesignTab() used outside a design tab`);return e}var H=n();function tt({tabId:e,metadata:t,session:n}){return n.status===`no-provider`?(0,H.jsx)(`div`,{className:`flex h-full items-center justify-center p-4 text-center text-sm text-text-subtle`,role:`status`,children:`No configured AI provider can run design sessions. Enable Claude or Codex in Settings → AI Provider.`}):n.status===`error`?(0,H.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center gap-2 p-4 text-sm text-text-subtle`,role:`status`,children:[`Could not prepare this design's chat.`,(0,H.jsx)(`button`,{type:`button`,onClick:n.retry,className:`min-h-11 px-3 text-primary underline`,children:`Retry`})]}):n.status===`ready`?(0,H.jsx)(ie,{tabId:e,metadata:t,onNewSession:n.startNewSession,onFork:n.adoptFork,historyFilter:String(t.designSlug)},n.epoch):(0,H.jsxs)(`div`,{className:`flex h-full items-center justify-center gap-2 text-sm text-text-subtle`,role:`status`,children:[(0,H.jsx)(N,{className:`size-4 animate-spin`}),` Preparing chat…`]})}var nt=[`desktop`,`tablet`,`phone`,`slide`],rt=[{id:`desktop`,label:`Desktop`,size:null},{id:`tablet`,label:`Tablet`,size:{width:820,height:1180}},{id:`phone`,label:`Phone`,size:{width:390,height:844}},{id:`slide`,label:`Slide`,size:{width:1280,height:720}}];function it(e){return typeof e==`string`&&nt.includes(e)}function at(e){return rt.find(t=>t.id===e)??rt[0]}function ot(e){return e===`slides`?`slide`:`desktop`}var st=[`auto`,`split`,`canvas`,`chat`];function ct(e){return typeof e==`string`&&st.includes(e)}function lt(e,t){return!Number.isFinite(e)||e<=0?t:e>=940?!0:e<860?!1:t}function ut(e){return e===`chat`?`chat`:`canvas`}function dt(e){let{override:t,isPhone:n,autoSplit:r,expanded:i}=e,a=i?`canvas`:e.pane,o=!n&&(t===`split`||t===`auto`&&r);return{split:o,pane:a,switcher:i||o?null:n?`phone`:`toolbar`,menuValue:t===`canvas`||t===`chat`?a:t,expanded:i}}var ft=`ppm-design-view-prefs`;function pt(){return{layout:`auto`,chatPercent:38,frames:{}}}function mt(e){return typeof e!=`number`||!Number.isFinite(e)?38:Math.min(70,Math.max(20,Math.round(e)))}function ht(e){if(!e)return pt();let t;try{t=JSON.parse(e)}catch{return pt()}if(!t||typeof t!=`object`||Array.isArray(t))return pt();let n=t,r={};if(n.frames&&typeof n.frames==`object`&&!Array.isArray(n.frames)){let e=Object.entries(n.frames).filter(e=>e[0].length<=300&&it(e[1]));for(let[t,n]of e.slice(-50))r[t]=n}return{layout:ct(n.layout)?n.layout:`auto`,chatPercent:mt(n.chatPercent),frames:r}}function gt(e,t){return`${e}/${t}`}function _t(e,t,n){let r=Object.entries(e.frames).filter(([e])=>e!==t);return r.push([t,n]),{...e,frames:Object.fromEntries(r.slice(-50))}}function vt(e,t){return{...e,chatPercent:mt(t)}}function yt(e,t){return{...e,layout:t}}function U(){try{return ht(localStorage.getItem(ft))}catch{return pt()}}function bt(e){try{localStorage.setItem(ft,JSON.stringify(e))}catch{}}function xt(){return`Set up this project's design system so every design here matches the product.
|
|
3
3
|
|
|
4
4
|
1. Read the codebase once to learn its visual language: global stylesheets, theme and token
|
|
5
5
|
files (CSS custom properties, Tailwind config, theme objects), the font setup, and a few
|
|
Binary file
|
|
Binary file
|
package/dist/web/assets/{designs-sidebar-panel-CapP1yXq.js → designs-sidebar-panel-DHh5QsH9.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-BHh12_0v.js";import{$n as r,Ln as i,Mr as a,Wn as o,Zn as s,pt as c,un as l}from"./icons-CO_II6D-.js";import"./api-client-c8YOpTlT.js";import"./portal-container-context-NFSuymMu.js";import{t as u}from"./panel-store-BUQ-CPsd.js";import"./window-store-B4cbZ5rr.js";import{i as d}from"./project-store-C5gJXkvb.js";import"./project-framework-store-XxFXcUpb.js";import{t as f}from"./format-date-BMtvCeb9.js";import"./context-menu-CjYTq8DI.js";import"./use-is-mobile-BClDZJP5.js";import{t as p}from"./button-Ci9EUgqd.js";import"./dialog-B8clVkyi.js";import"./mobile-bottom-sheet-CuNi2FRv.js";import"./use-visual-viewport-BGpcMnIx.js";import{Jt as m,Kt as h,Zt as g,_n as _,a as v,c as y,f as b,i as x,o as S,p as C,qt as w,tn as T}from"./index-
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-BHh12_0v.js";import{$n as r,Ln as i,Mr as a,Wn as o,Zn as s,pt as c,un as l}from"./icons-CO_II6D-.js";import"./api-client-c8YOpTlT.js";import"./portal-container-context-NFSuymMu.js";import{t as u}from"./panel-store-BUQ-CPsd.js";import"./window-store-B4cbZ5rr.js";import{i as d}from"./project-store-C5gJXkvb.js";import"./project-framework-store-XxFXcUpb.js";import{t as f}from"./format-date-BMtvCeb9.js";import"./context-menu-CjYTq8DI.js";import"./use-is-mobile-BClDZJP5.js";import{t as p}from"./button-Ci9EUgqd.js";import"./dialog-B8clVkyi.js";import"./mobile-bottom-sheet-CuNi2FRv.js";import"./use-visual-viewport-BGpcMnIx.js";import{Jt as m,Kt as h,Zt as g,_n as _,a as v,c as y,f as b,i as x,o as S,p as C,qt as w,tn as T}from"./index-C8nGqkKN.js";import{t as E}from"./design-responsive-dialog-DNBhJJLf.js";var D=e(t(),1),O=n();function k({projectName:e,design:t,onClose:n}){let[r,i]=(0,D.useState)(t.title),[a,o]=(0,D.useState)(!1),[s,c]=(0,D.useState)(null),u=r.trim(),d=!!u&&u!==t.title&&!a,f=async()=>{if(d){o(!0),c(null);try{await C(e,t.slug,u),v(e),n()}catch(e){c(e.message||`Could not rename the design`),o(!1)}}};return(0,O.jsx)(E,{open:!0,onClose:()=>{a||n()},title:`Rename design`,description:`The folder stays designs/${t.slug}/.`,footer:(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(p,{variant:`outline`,onClick:n,disabled:a,children:`Cancel`}),(0,O.jsxs)(p,{onClick:f,disabled:!d,children:[a&&(0,O.jsx)(l,{className:`size-4 animate-spin`}),` Rename`]})]}),children:(0,O.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),f()},className:`flex flex-col gap-2`,children:[(0,O.jsx)(`input`,{autoFocus:!0,value:r,maxLength:120,onChange:e=>i(e.target.value),"aria-label":`Title`,className:`min-h-11 w-full rounded-md border border-border bg-background px-3 text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-primary md:min-h-9`}),s&&(0,O.jsx)(`p`,{className:`text-xs text-destructive`,role:`alert`,children:s})]})})}function A({projectName:e,design:t,onClose:n}){let[r,i]=(0,D.useState)(``),[a,o]=(0,D.useState)(!1),[s,c]=(0,D.useState)(null),d=r.trim()===t.slug,f=async()=>{if(!(!d||a)){o(!0),c(null);try{await y(e,t.slug);let r=u.getState();for(let n of Object.values(r.panels))for(let i of n.tabs)i.type===`design`&&i.metadata?.designSlug===t.slug&&(i.projectId??i.metadata?.projectName)===e&&r.closeTab(i.id,n.id);v(e),n()}catch(e){c(e.message||`Could not delete the design`),o(!1)}}};return(0,O.jsx)(E,{open:!0,onClose:()=>{a||n()},title:`Delete “${t.title}”?`,description:`This deletes designs/${t.slug}/ and its version history. It cannot be undone.`,footer:(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(p,{variant:`outline`,onClick:n,disabled:a,children:`Cancel`}),(0,O.jsxs)(p,{variant:`destructive`,onClick:f,disabled:!d||a,children:[a&&(0,O.jsx)(l,{className:`size-4 animate-spin`}),` Delete`]})]}),children:(0,O.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),f()},className:`flex flex-col gap-2`,children:[(0,O.jsxs)(`label`,{className:`text-xs text-text-secondary`,children:[`Type `,(0,O.jsx)(`span`,{className:`font-mono font-semibold`,children:t.slug}),` to confirm`,(0,O.jsx)(`input`,{value:r,onChange:e=>i(e.target.value),autoComplete:`off`,spellCheck:!1,className:`mt-1 min-h-11 w-full rounded-md border border-border bg-background px-3 font-mono text-sm text-foreground focus:outline-none focus:ring-1 focus:ring-destructive md:min-h-9`})]}),s&&(0,O.jsx)(`p`,{className:`text-xs text-destructive`,role:`alert`,children:s})]})})}function j({onNavigate:e}){let t=d(e=>e.activeProject?.name??``),[n,u]=(0,D.useState)(null),[p,v]=(0,D.useState)(null),[y,C]=(0,D.useState)(null),[E,j]=(0,D.useState)(null),M=(0,D.useCallback)(()=>{t&&b(t).then(e=>{u(e),v(null)}).catch(e=>v(e.message||`Could not load designs`))},[t]);(0,D.useEffect)(()=>{u(null),M();let e=null,n=()=>{e&&clearTimeout(e),e=setTimeout(M,500)},r=e=>{let r=e.detail;r?.projectName===t&&/^designs\/[^/]+(\/(design\.json|index\.html))?$/.test(r.path??``)&&n()},i=e=>{e.detail?.projectName===t&&M()};return window.addEventListener(`file:changed`,r),window.addEventListener(x,i),()=>{e&&clearTimeout(e),window.removeEventListener(`file:changed`,r),window.removeEventListener(x,i)}},[t,M]);let N=n=>{_({projectName:t,slug:n.slug,title:n.title}),e?.()};return t?(0,O.jsxs)(`div`,{className:`flex h-full flex-col`,children:[(0,O.jsxs)(`div`,{className:`flex h-9 shrink-0 items-center justify-between border-b border-border px-2`,children:[(0,O.jsx)(`span`,{className:`text-xs font-semibold uppercase tracking-wide text-text-secondary`,children:`Designs`}),(0,O.jsx)(`button`,{type:`button`,onClick:()=>{S(t),e?.()},"aria-label":`New design`,className:`flex size-11 items-center justify-center rounded-md text-text-subtle hover:bg-surface-elevated hover:text-foreground md:size-7`,children:(0,O.jsx)(s,{className:`size-4`})})]}),(0,O.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto p-1`,children:[p?(0,O.jsx)(`p`,{className:`px-2 py-3 text-xs text-destructive`,children:p}):n===null?(0,O.jsx)(`div`,{className:`flex justify-center py-6`,children:(0,O.jsx)(l,{className:`size-4 animate-spin text-primary`})}):n.designs.length===0?(0,O.jsxs)(`div`,{className:`flex flex-col items-center gap-2 px-3 py-6 text-center text-xs text-text-subtle`,children:[(0,O.jsx)(i,{className:`size-6`}),`No designs yet. Start one and describe what you want; the AI builds it beside a live preview.`,(0,O.jsx)(`button`,{type:`button`,onClick:()=>S(t),className:`min-h-11 px-3 text-sm text-primary underline`,children:`New design`})]}):n.designs.map(e=>(0,O.jsxs)(h,{children:[(0,O.jsx)(T,{asChild:!0,children:(0,O.jsxs)(`button`,{type:`button`,onClick:()=>N(e),className:`flex w-full min-h-11 select-none items-center gap-2 rounded-md px-2 py-1.5 text-left hover:bg-surface-elevated md:min-h-9`,children:[(0,O.jsx)(e.kind===`slides`?r:c,{className:`size-4 shrink-0 text-text-subtle`}),(0,O.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,O.jsx)(`span`,{className:`block truncate text-sm text-text-secondary`,children:e.title}),(0,O.jsx)(`span`,{className:`block truncate text-xs text-text-subtle`,children:f(e.updatedAt)})]})]})}),(0,O.jsxs)(w,{children:[(0,O.jsxs)(m,{onClick:()=>N(e),children:[(0,O.jsx)(i,{className:`size-4`}),` Open`]}),(0,O.jsxs)(m,{onClick:()=>C(e),children:[(0,O.jsx)(o,{className:`size-4`}),` Rename`]}),(0,O.jsx)(g,{}),(0,O.jsxs)(m,{variant:`destructive`,onClick:()=>j(e),children:[(0,O.jsx)(a,{className:`size-4`}),` Delete`]})]})]},e.slug)),n&&!n.system.designMd&&n.designs.length>0&&(0,O.jsx)(`p`,{className:`px-2 py-3 text-xs text-text-subtle`,children:`No design system yet. Open a design and choose “Set up design system” to learn this project's look.`})]}),y&&(0,O.jsx)(k,{projectName:t,design:y,onClose:()=>C(null)}),E&&(0,O.jsx)(A,{projectName:t,design:E,onClose:()=>j(null)})]}):(0,O.jsx)(`p`,{className:`p-4 text-center text-xs text-text-subtle`,children:`Select a project to see its designs`})}export{j as DesignsSidebarPanel};
|
|
Binary file
|
|
Binary file
|