@hienlh/ppm 0.23.0 → 0.23.2
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 +15 -0
- package/CLAUDE.md +1 -0
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/dist/web/assets/accounts-settings-section-Cs7BC5O1.js +1 -0
- package/dist/web/assets/accounts-settings-section-Cs7BC5O1.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-Cs7BC5O1.js.gz +0 -0
- package/dist/web/assets/{ai-resource-editor-DoCiQDKY.js → ai-resource-editor-TCREp5Ml.js} +1 -1
- package/dist/web/assets/ai-resource-editor-TCREp5Ml.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-TCREp5Ml.js.gz +0 -0
- package/dist/web/assets/{ai-settings-section-0x6GFJ56.js → ai-settings-section-B7Un4KiW.js} +1 -1
- package/dist/web/assets/ai-settings-section-B7Un4KiW.js.br +0 -0
- package/dist/web/assets/ai-settings-section-B7Un4KiW.js.gz +0 -0
- package/dist/web/assets/{ai-settings-section-Cp6jcnTn.js → ai-settings-section-BlKlcihJ.js} +1 -1
- package/dist/web/assets/{appearance-settings-section-mRiGj3_g.js → appearance-settings-section-DACtiDor.js} +1 -1
- package/dist/web/assets/appearance-settings-section-DACtiDor.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-DACtiDor.js.gz +0 -0
- package/dist/web/assets/{audio-preview-CO7Ia2N5.js → audio-preview-DXtE1Lpz.js} +1 -1
- package/dist/web/assets/audio-preview-DXtE1Lpz.js.br +0 -0
- package/dist/web/assets/audio-preview-DXtE1Lpz.js.gz +0 -0
- package/dist/web/assets/{branch-review-tab-F3CALiEa.js → branch-review-tab-vHJuFXtB.js} +1 -1
- package/dist/web/assets/branch-review-tab-vHJuFXtB.js.br +0 -0
- package/dist/web/assets/branch-review-tab-vHJuFXtB.js.gz +0 -0
- package/dist/web/assets/chat-tab-Ba3NvUgt.js +1 -0
- package/dist/web/assets/chat-tab-Ba3NvUgt.js.br +0 -0
- package/dist/web/assets/chat-tab-Ba3NvUgt.js.gz +0 -0
- package/dist/web/assets/chat-tab-DeISufm0.js +15 -0
- package/dist/web/assets/chat-tab-DeISufm0.js.br +0 -0
- package/dist/web/assets/chat-tab-DeISufm0.js.gz +0 -0
- package/dist/web/assets/{code-editor-FsR6KpZa.js → code-editor-BCwiLVyc.js} +3 -3
- package/dist/web/assets/code-editor-BCwiLVyc.js.br +0 -0
- package/dist/web/assets/code-editor-BCwiLVyc.js.gz +0 -0
- package/dist/web/assets/codex-sign-in-again-dialog-DcIOYhAe.js +1 -0
- package/dist/web/assets/codex-sign-in-again-dialog-DcIOYhAe.js.br +0 -0
- package/dist/web/assets/codex-sign-in-again-dialog-DcIOYhAe.js.gz +0 -0
- package/dist/web/assets/{conflict-editor-GGqIz6tt.js → conflict-editor-0YEDQ--c.js} +1 -1
- package/dist/web/assets/conflict-editor-0YEDQ--c.js.br +0 -0
- package/dist/web/assets/conflict-editor-0YEDQ--c.js.gz +0 -0
- package/dist/web/assets/{context-menu-CVO3HtIt.js → context-menu-CjYTq8DI.js} +1 -1
- package/dist/web/assets/context-menu-CjYTq8DI.js.br +0 -0
- package/dist/web/assets/context-menu-CjYTq8DI.js.gz +0 -0
- package/dist/web/assets/{csv-preview-ycnxJ_6J.js → csv-preview-CYxznB1I.js} +1 -1
- package/dist/web/assets/csv-preview-CYxznB1I.js.br +0 -0
- package/dist/web/assets/csv-preview-CYxznB1I.js.gz +0 -0
- package/dist/web/assets/{database-viewer-y6URJv8N.js → database-viewer-eP3gCxGb.js} +1 -1
- package/dist/web/assets/database-viewer-eP3gCxGb.js.br +0 -0
- package/dist/web/assets/database-viewer-eP3gCxGb.js.gz +0 -0
- package/dist/web/assets/{design-responsive-dialog-D0QYfX7v.js → design-responsive-dialog-CcJETHO2.js} +1 -1
- package/dist/web/assets/design-responsive-dialog-CcJETHO2.js.br +0 -0
- package/dist/web/assets/design-responsive-dialog-CcJETHO2.js.gz +0 -0
- package/dist/web/assets/{design-tab-DgCTcwot.js → design-tab-B7aVMMfj.js} +1 -1
- package/dist/web/assets/design-tab-B7aVMMfj.js.br +0 -0
- package/dist/web/assets/design-tab-B7aVMMfj.js.gz +0 -0
- package/dist/web/assets/{designs-sidebar-panel-Dtuph5jh.js → designs-sidebar-panel-8KI79o1u.js} +1 -1
- package/dist/web/assets/designs-sidebar-panel-8KI79o1u.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-8KI79o1u.js.gz +0 -0
- package/dist/web/assets/{dialog-CaShS4f5.js → dialog-tzBRkGeW.js} +1 -1
- package/dist/web/assets/dialog-tzBRkGeW.js.br +0 -0
- package/dist/web/assets/dialog-tzBRkGeW.js.gz +0 -0
- package/dist/web/assets/{diff-viewer-ciBkExM7.js → diff-viewer-B_K7VQup.js} +1 -1
- package/dist/web/assets/diff-viewer-B_K7VQup.js.br +0 -0
- package/dist/web/assets/diff-viewer-B_K7VQup.js.gz +0 -0
- package/dist/web/assets/{docx-preview-C8K6QzOW.js → docx-preview-C-UKGMXR.js} +1 -1
- package/dist/web/assets/docx-preview-C-UKGMXR.js.br +0 -0
- package/dist/web/assets/docx-preview-C-UKGMXR.js.gz +0 -0
- package/dist/web/assets/{editor-language-service-CkoaAHjF.js → editor-language-service-DYBxZX66.js} +1 -1
- package/dist/web/assets/editor-language-service-DYBxZX66.js.br +0 -0
- package/dist/web/assets/editor-language-service-DYBxZX66.js.gz +0 -0
- package/dist/web/assets/{explorer-body-C5gXPGOl.js → explorer-body-C0syNltJ.js} +1 -1
- package/dist/web/assets/explorer-body-C0syNltJ.js.br +0 -0
- package/dist/web/assets/explorer-body-C0syNltJ.js.gz +0 -0
- package/dist/web/assets/{explorer-window-content-8EBl9Vkx.js → explorer-window-content-CfIomwTq.js} +1 -1
- package/dist/web/assets/explorer-window-content-CfIomwTq.js.br +0 -0
- package/dist/web/assets/explorer-window-content-CfIomwTq.js.gz +0 -0
- package/dist/web/assets/{extension-manager-section-DOwZYx8O.js → extension-manager-section-CL7pl3re.js} +1 -1
- package/dist/web/assets/extension-manager-section-CL7pl3re.js.br +0 -0
- package/dist/web/assets/extension-manager-section-CL7pl3re.js.gz +0 -0
- package/dist/web/assets/{extension-webview-CdEva8pD.js → extension-webview-FHTB0jh1.js} +1 -1
- package/dist/web/assets/extension-webview-FHTB0jh1.js.br +0 -0
- package/dist/web/assets/extension-webview-FHTB0jh1.js.gz +0 -0
- package/dist/web/assets/{files-settings-section-DVemQIZ2.js → files-settings-section-C574RfCl.js} +1 -1
- package/dist/web/assets/files-settings-section-C574RfCl.js.br +0 -0
- package/dist/web/assets/files-settings-section-C574RfCl.js.gz +0 -0
- package/dist/web/assets/{general-settings-section-DiY_5C93.js → general-settings-section--DSUTrEP.js} +1 -1
- package/dist/web/assets/general-settings-section--DSUTrEP.js.br +0 -0
- package/dist/web/assets/general-settings-section--DSUTrEP.js.gz +0 -0
- package/dist/web/assets/{git-log-panel-Cq0WohOO.js → git-log-panel-BzwEbRwN.js} +1 -1
- package/dist/web/assets/git-log-panel-BzwEbRwN.js.br +0 -0
- package/dist/web/assets/git-log-panel-BzwEbRwN.js.gz +0 -0
- package/dist/web/assets/{glide-data-grid-DG9AnCmP.js → glide-data-grid-CUNWBFfN.js} +1 -1
- package/dist/web/assets/glide-data-grid-CUNWBFfN.js.br +0 -0
- package/dist/web/assets/glide-data-grid-CUNWBFfN.js.gz +0 -0
- package/dist/web/assets/{group-chat-tab-DxbDrFJl.js → group-chat-tab-Dp1p4Jdu.js} +1 -1
- package/dist/web/assets/group-chat-tab-Dp1p4Jdu.js.br +0 -0
- package/dist/web/assets/group-chat-tab-Dp1p4Jdu.js.gz +0 -0
- package/dist/web/assets/icons-CO_II6D-.js +1 -0
- package/dist/web/assets/icons-CO_II6D-.js.br +0 -0
- package/dist/web/assets/icons-CO_II6D-.js.gz +0 -0
- package/dist/web/assets/{image-preview-eAv91-an.js → image-preview-78Fguk1f.js} +1 -1
- package/dist/web/assets/{index-BVKT5UCu.js → index-CvUGUp7d.js} +6 -6
- package/dist/web/assets/index-CvUGUp7d.js.br +0 -0
- package/dist/web/assets/index-CvUGUp7d.js.gz +0 -0
- package/dist/web/assets/index-DMA-So69.css +1 -0
- package/dist/web/assets/index-DMA-So69.css.br +0 -0
- package/dist/web/assets/index-DMA-So69.css.gz +0 -0
- package/dist/web/assets/{jira-watcher-section-Cr8gSVGY.js → jira-watcher-section-DoXl0GAq.js} +1 -1
- package/dist/web/assets/jira-watcher-section-DoXl0GAq.js.br +0 -0
- package/dist/web/assets/jira-watcher-section-DoXl0GAq.js.gz +0 -0
- package/dist/web/assets/{keybindings-store-Ch1mWz0q.js → keybindings-store-BqGm9AgI.js} +1 -1
- package/dist/web/assets/{keyboard-shortcuts-section-BvC6m_C2.js → keyboard-shortcuts-section-BogwnAdr.js} +1 -1
- package/dist/web/assets/keyboard-shortcuts-section-BogwnAdr.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-BogwnAdr.js.gz +0 -0
- package/dist/web/assets/{markdown-renderer-56wMzGkr.js → markdown-renderer-C33dsNJ_.js} +1 -1
- package/dist/web/assets/{markdown-renderer-8JlfrfnD.js → markdown-renderer-CZiECUJp.js} +1 -1
- package/dist/web/assets/markdown-renderer-CZiECUJp.js.br +0 -0
- package/dist/web/assets/markdown-renderer-CZiECUJp.js.gz +0 -0
- package/dist/web/assets/{mobile-explorer-sheet-cJfocgE7.js → mobile-explorer-sheet-BOgo9tbK.js} +1 -1
- package/dist/web/assets/mobile-explorer-sheet-BOgo9tbK.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-BOgo9tbK.js.gz +0 -0
- package/dist/web/assets/{new-design-dialog-BO_D3nex.js → new-design-dialog-DcoejI1s.js} +1 -1
- package/dist/web/assets/new-design-dialog-DcoejI1s.js.br +0 -0
- package/dist/web/assets/new-design-dialog-DcoejI1s.js.gz +0 -0
- package/dist/web/assets/{notification-store-DNWazI7j.js → notification-store-D88Y9kF_.js} +1 -1
- package/dist/web/assets/{notifications-settings-section-DaMh3khs.js → notifications-settings-section-Bfxqz65i.js} +1 -1
- package/dist/web/assets/notifications-settings-section-Bfxqz65i.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-Bfxqz65i.js.gz +0 -0
- package/dist/web/assets/{onboarding-entry-CwkNJ69U.js → onboarding-entry-CcvySZ_l.js} +1 -1
- package/dist/web/assets/onboarding-entry-CcvySZ_l.js.br +0 -0
- package/dist/web/assets/onboarding-entry-CcvySZ_l.js.gz +0 -0
- package/dist/web/assets/{onboarding-quick-orientation-u7yM68d3.js → onboarding-quick-orientation-CT4PylG0.js} +1 -1
- package/dist/web/assets/onboarding-quick-orientation-CT4PylG0.js.br +0 -0
- package/dist/web/assets/onboarding-quick-orientation-CT4PylG0.js.gz +0 -0
- package/dist/web/assets/{pdf-preview-CaxTidh0.js → pdf-preview-BWim6mu1.js} +1 -1
- package/dist/web/assets/pdf-preview-BWim6mu1.js.br +0 -0
- package/dist/web/assets/pdf-preview-BWim6mu1.js.gz +0 -0
- package/dist/web/assets/{postgres-viewer-CJOOLdgO.js → postgres-viewer-HwlL1UTJ.js} +1 -1
- package/dist/web/assets/postgres-viewer-HwlL1UTJ.js.br +0 -0
- package/dist/web/assets/postgres-viewer-HwlL1UTJ.js.gz +0 -0
- package/dist/web/assets/{ppmbot-settings-section-rNBdWG7F.js → ppmbot-settings-section-DF0kqdyO.js} +1 -1
- package/dist/web/assets/ppmbot-settings-section-DF0kqdyO.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-DF0kqdyO.js.gz +0 -0
- package/dist/web/assets/{problems-panel-BTmOGMcL.js → problems-panel-DRcq5ChN.js} +1 -1
- package/dist/web/assets/problems-panel-DRcq5ChN.js.br +0 -0
- package/dist/web/assets/problems-panel-DRcq5ChN.js.gz +0 -0
- package/dist/web/assets/{process-table-Bc9WEBsS.js → process-table-Ds0S_YK-.js} +1 -1
- package/dist/web/assets/process-table-Ds0S_YK-.js.br +0 -0
- package/dist/web/assets/process-table-Ds0S_YK-.js.gz +0 -0
- package/dist/web/assets/{proxy-settings-section-Bo-FPk6Y.js → proxy-settings-section-Q-ttqVOa.js} +1 -1
- package/dist/web/assets/proxy-settings-section-Q-ttqVOa.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-Q-ttqVOa.js.gz +0 -0
- package/dist/web/assets/{query-audit-section-CQfzKAf9.js → query-audit-section-Cn11xqgz.js} +1 -1
- package/dist/web/assets/query-audit-section-Cn11xqgz.js.br +0 -0
- package/dist/web/assets/query-audit-section-Cn11xqgz.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-clipboard-notice-DgeuoZ4n.js → remote-desktop-clipboard-notice-CvPPtrRq.js} +1 -1
- package/dist/web/assets/remote-desktop-clipboard-notice-CvPPtrRq.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-CvPPtrRq.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-mobile-sheet-BpP7jI0p.js → remote-desktop-mobile-sheet-B-TT9Fdt.js} +2 -2
- package/dist/web/assets/remote-desktop-mobile-sheet-B-TT9Fdt.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-B-TT9Fdt.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-mobile-view-Byn0lFCF.js → remote-desktop-mobile-view-hUnYxXDk.js} +1 -1
- package/dist/web/assets/remote-desktop-mobile-view-hUnYxXDk.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-hUnYxXDk.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-readiness-gate-B2mXZ9vo.js → remote-desktop-readiness-gate-CUmaeiX9.js} +1 -1
- package/dist/web/assets/remote-desktop-readiness-gate-CUmaeiX9.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-CUmaeiX9.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-window-content-CWt3VVjm.js → remote-desktop-window-content-DEPUOOGw.js} +1 -1
- package/dist/web/assets/remote-desktop-window-content-DEPUOOGw.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-DEPUOOGw.js.gz +0 -0
- package/dist/web/assets/{schedules-settings-section-Bx9Rm-NB.js → schedules-settings-section-Bv_wrzDp.js} +1 -1
- package/dist/web/assets/schedules-settings-section-Bv_wrzDp.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-Bv_wrzDp.js.gz +0 -0
- package/dist/web/assets/{settings-body-DU3LZkOy.js → settings-body-C5_chEpq.js} +2 -2
- package/dist/web/assets/settings-body-C5_chEpq.js.br +0 -0
- package/dist/web/assets/settings-body-C5_chEpq.js.gz +0 -0
- package/dist/web/assets/{settings-tab-Q5Ai_XB7.js → settings-tab-CogpEbq5.js} +1 -1
- package/dist/web/assets/{settings-window-content-DNg-jjm4.js → settings-window-content-BNRirQDZ.js} +1 -1
- package/dist/web/assets/{sql-query-editor-BMNsmnfi.js → sql-query-editor-Bg3lOrmt.js} +1 -1
- package/dist/web/assets/sql-query-editor-Bg3lOrmt.js.br +0 -0
- package/dist/web/assets/sql-query-editor-Bg3lOrmt.js.gz +0 -0
- package/dist/web/assets/{sqlite-viewer-DBdxQgCD.js → sqlite-viewer-DMKtDkI6.js} +1 -1
- package/dist/web/assets/sqlite-viewer-DMKtDkI6.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-DMKtDkI6.js.gz +0 -0
- package/dist/web/assets/{system-monitor-body-BEuqhoiF.js → system-monitor-body-Dst39LA7.js} +2 -2
- package/dist/web/assets/system-monitor-body-Dst39LA7.js.br +0 -0
- package/dist/web/assets/system-monitor-body-Dst39LA7.js.gz +0 -0
- package/dist/web/assets/system-monitor-tab-CEwME1_C.js +1 -0
- package/dist/web/assets/{system-monitor-window-content-Dr6EgqpJ.js → system-monitor-window-content-DQRBjn9z.js} +1 -1
- package/dist/web/assets/{tab-host-window-content-BhS39QWy.js → tab-host-window-content-Dlunzrfh.js} +1 -1
- package/dist/web/assets/tab-host-window-content-Dlunzrfh.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-Dlunzrfh.js.gz +0 -0
- package/dist/web/assets/{team-member-sheet-C5-PeHDb.js → team-member-sheet-CPZGU9j5.js} +2 -2
- package/dist/web/assets/team-member-sheet-CPZGU9j5.js.br +0 -0
- package/dist/web/assets/team-member-sheet-CPZGU9j5.js.gz +0 -0
- package/dist/web/assets/{team-member-window-content-CZjHuvdw.js → team-member-window-content-CwI9JD_H.js} +1 -1
- package/dist/web/assets/{team-member-window-content-CZjHuvdw.js.br → team-member-window-content-CwI9JD_H.js.br} +0 -0
- package/dist/web/assets/team-member-window-content-CwI9JD_H.js.gz +0 -0
- package/dist/web/assets/{terminal-tab-B0w7Jsbs.js → terminal-tab-BcQXleSa.js} +1 -1
- package/dist/web/assets/terminal-tab-BcQXleSa.js.br +0 -0
- package/dist/web/assets/terminal-tab-BcQXleSa.js.gz +0 -0
- package/dist/web/assets/{tool-cards-CmdjXi2c.js → tool-cards-DsQdMorI.js} +2 -2
- package/dist/web/assets/tool-cards-DsQdMorI.js.br +0 -0
- package/dist/web/assets/tool-cards-DsQdMorI.js.gz +0 -0
- package/dist/web/assets/{use-inline-blame-BSb807l9.js → use-inline-blame--fS-pzzX.js} +1 -1
- package/dist/web/assets/use-inline-blame--fS-pzzX.js.br +0 -0
- package/dist/web/assets/use-inline-blame--fS-pzzX.js.gz +0 -0
- package/dist/web/assets/{use-lsp-DhBjkGWr.js → use-lsp-DK26Eter.js} +1 -1
- package/dist/web/assets/use-lsp-DK26Eter.js.br +0 -0
- package/dist/web/assets/use-lsp-DK26Eter.js.gz +0 -0
- package/dist/web/assets/{use-monaco-theme-CNEk66US.js → use-monaco-theme-BVatH9yZ.js} +1 -1
- package/dist/web/assets/{use-websocket-Bki-B4fj.js → use-websocket-C1mloX0R.js} +1 -1
- package/dist/web/assets/{video-preview-T1SMFp03.js → video-preview-C48Go7JZ.js} +1 -1
- package/dist/web/assets/video-preview-C48Go7JZ.js.br +0 -0
- package/dist/web/assets/video-preview-C48Go7JZ.js.gz +0 -0
- package/dist/web/index.html +6 -6
- 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-auth-failure.ts +51 -0
- package/src/providers/codex-app-server/codex-event-mapper.ts +8 -0
- package/src/providers/codex-app-server/codex-provider.ts +97 -19
- package/src/providers/codex-app-server/codex-usage-source.ts +14 -1
- package/src/server/routes/codex-accounts.ts +18 -6
- package/src/services/codex-account-auth-state.ts +58 -0
- package/src/services/codex-account-login.ts +42 -9
- package/src/services/codex-account.service.ts +42 -7
- package/src/services/proxy-agent-anthropic-bridge.ts +2 -2
- package/src/services/proxy-agent-bridge.ts +2 -2
- package/src/services/proxy-agent-turn.ts +80 -20
- package/src/services/proxy-image-bridge.ts +3 -3
- package/src/services/proxy.service.ts +1 -1
- package/src/web/components/chat/codex-usage-panel.tsx +13 -1
- package/src/web/components/chat/usage-badge.tsx +14 -0
- package/src/web/components/settings/accounts/account-add-dialog.tsx +10 -3
- package/src/web/components/settings/accounts/account-card.tsx +15 -4
- package/src/web/components/settings/accounts/account-hint.tsx +19 -2
- package/src/web/components/settings/accounts/claude-accounts-section.tsx +10 -2
- package/src/web/components/settings/accounts/codex-accounts-section.tsx +18 -2
- package/src/web/components/settings/accounts/codex-add-account-dialog.tsx +50 -33
- package/src/web/components/settings/accounts/codex-sign-in-again-dialog.tsx +47 -0
- package/src/web/components/settings/accounts/use-codex-accounts.ts +18 -4
- package/src/web/lib/fluent-icon.tsx +38 -2
- package/dist/web/assets/accounts-settings-section-CVJ7hQom.js +0 -1
- package/dist/web/assets/accounts-settings-section-CVJ7hQom.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-CVJ7hQom.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-DoCiQDKY.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-DoCiQDKY.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-0x6GFJ56.js.br +0 -0
- package/dist/web/assets/ai-settings-section-0x6GFJ56.js.gz +0 -0
- package/dist/web/assets/appearance-settings-section-mRiGj3_g.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-mRiGj3_g.js.gz +0 -0
- package/dist/web/assets/audio-preview-CO7Ia2N5.js.br +0 -0
- package/dist/web/assets/audio-preview-CO7Ia2N5.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-F3CALiEa.js.br +0 -0
- package/dist/web/assets/branch-review-tab-F3CALiEa.js.gz +0 -0
- package/dist/web/assets/chat-tab-D6BFnkCj.js +0 -1
- package/dist/web/assets/chat-tab-D6BFnkCj.js.br +0 -0
- package/dist/web/assets/chat-tab-D6BFnkCj.js.gz +0 -0
- package/dist/web/assets/chat-tab-IXHMUKMW.js +0 -15
- package/dist/web/assets/chat-tab-IXHMUKMW.js.br +0 -0
- package/dist/web/assets/chat-tab-IXHMUKMW.js.gz +0 -0
- package/dist/web/assets/code-editor-FsR6KpZa.js.br +0 -0
- package/dist/web/assets/code-editor-FsR6KpZa.js.gz +0 -0
- package/dist/web/assets/codex-daily-guard-Bn8jfcei.js +0 -1
- package/dist/web/assets/codex-daily-guard-Bn8jfcei.js.br +0 -0
- package/dist/web/assets/codex-daily-guard-Bn8jfcei.js.gz +0 -0
- package/dist/web/assets/conflict-editor-GGqIz6tt.js.br +0 -0
- package/dist/web/assets/conflict-editor-GGqIz6tt.js.gz +0 -0
- package/dist/web/assets/context-menu-CVO3HtIt.js.br +0 -0
- package/dist/web/assets/context-menu-CVO3HtIt.js.gz +0 -0
- package/dist/web/assets/csv-preview-ycnxJ_6J.js.br +0 -0
- package/dist/web/assets/csv-preview-ycnxJ_6J.js.gz +0 -0
- package/dist/web/assets/database-viewer-y6URJv8N.js.br +0 -0
- package/dist/web/assets/database-viewer-y6URJv8N.js.gz +0 -0
- package/dist/web/assets/design-responsive-dialog-D0QYfX7v.js.br +0 -0
- package/dist/web/assets/design-responsive-dialog-D0QYfX7v.js.gz +0 -0
- package/dist/web/assets/design-tab-DgCTcwot.js.br +0 -0
- package/dist/web/assets/design-tab-DgCTcwot.js.gz +0 -0
- package/dist/web/assets/designs-sidebar-panel-Dtuph5jh.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-Dtuph5jh.js.gz +0 -0
- package/dist/web/assets/dialog-CaShS4f5.js.br +0 -0
- package/dist/web/assets/dialog-CaShS4f5.js.gz +0 -0
- package/dist/web/assets/diff-viewer-ciBkExM7.js.br +0 -0
- package/dist/web/assets/diff-viewer-ciBkExM7.js.gz +0 -0
- package/dist/web/assets/docx-preview-C8K6QzOW.js.br +0 -0
- package/dist/web/assets/docx-preview-C8K6QzOW.js.gz +0 -0
- package/dist/web/assets/editor-language-service-CkoaAHjF.js.br +0 -0
- package/dist/web/assets/editor-language-service-CkoaAHjF.js.gz +0 -0
- package/dist/web/assets/explorer-body-C5gXPGOl.js.br +0 -0
- package/dist/web/assets/explorer-body-C5gXPGOl.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-8EBl9Vkx.js.br +0 -0
- package/dist/web/assets/explorer-window-content-8EBl9Vkx.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-DOwZYx8O.js.br +0 -0
- package/dist/web/assets/extension-manager-section-DOwZYx8O.js.gz +0 -0
- package/dist/web/assets/extension-webview-CdEva8pD.js.br +0 -0
- package/dist/web/assets/extension-webview-CdEva8pD.js.gz +0 -0
- package/dist/web/assets/files-settings-section-DVemQIZ2.js.br +0 -0
- package/dist/web/assets/files-settings-section-DVemQIZ2.js.gz +0 -0
- package/dist/web/assets/general-settings-section-DiY_5C93.js.br +0 -0
- package/dist/web/assets/general-settings-section-DiY_5C93.js.gz +0 -0
- package/dist/web/assets/git-log-panel-Cq0WohOO.js.br +0 -0
- package/dist/web/assets/git-log-panel-Cq0WohOO.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-DG9AnCmP.js.br +0 -0
- package/dist/web/assets/glide-data-grid-DG9AnCmP.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-DxbDrFJl.js.br +0 -0
- package/dist/web/assets/group-chat-tab-DxbDrFJl.js.gz +0 -0
- package/dist/web/assets/icons-C9ZwXgel.js +0 -1
- package/dist/web/assets/icons-C9ZwXgel.js.br +0 -0
- package/dist/web/assets/icons-C9ZwXgel.js.gz +0 -0
- package/dist/web/assets/index-BVKT5UCu.js.br +0 -0
- package/dist/web/assets/index-BVKT5UCu.js.gz +0 -0
- package/dist/web/assets/index-CzYrKDUF.css +0 -1
- package/dist/web/assets/index-CzYrKDUF.css.br +0 -0
- package/dist/web/assets/index-CzYrKDUF.css.gz +0 -0
- package/dist/web/assets/jira-watcher-section-Cr8gSVGY.js.br +0 -0
- package/dist/web/assets/jira-watcher-section-Cr8gSVGY.js.gz +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-BvC6m_C2.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-BvC6m_C2.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-8JlfrfnD.js.br +0 -0
- package/dist/web/assets/markdown-renderer-8JlfrfnD.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-cJfocgE7.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-cJfocgE7.js.gz +0 -0
- package/dist/web/assets/new-design-dialog-BO_D3nex.js.br +0 -0
- package/dist/web/assets/new-design-dialog-BO_D3nex.js.gz +0 -0
- package/dist/web/assets/notifications-settings-section-DaMh3khs.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-DaMh3khs.js.gz +0 -0
- package/dist/web/assets/onboarding-entry-CwkNJ69U.js.br +0 -0
- package/dist/web/assets/onboarding-entry-CwkNJ69U.js.gz +0 -0
- package/dist/web/assets/onboarding-quick-orientation-u7yM68d3.js.br +0 -0
- package/dist/web/assets/onboarding-quick-orientation-u7yM68d3.js.gz +0 -0
- package/dist/web/assets/pdf-preview-CaxTidh0.js.br +0 -0
- package/dist/web/assets/pdf-preview-CaxTidh0.js.gz +0 -0
- package/dist/web/assets/postgres-viewer-CJOOLdgO.js.br +0 -0
- package/dist/web/assets/postgres-viewer-CJOOLdgO.js.gz +0 -0
- package/dist/web/assets/ppmbot-settings-section-rNBdWG7F.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-rNBdWG7F.js.gz +0 -0
- package/dist/web/assets/problems-panel-BTmOGMcL.js.br +0 -0
- package/dist/web/assets/problems-panel-BTmOGMcL.js.gz +0 -0
- package/dist/web/assets/process-table-Bc9WEBsS.js.br +0 -0
- package/dist/web/assets/process-table-Bc9WEBsS.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-Bo-FPk6Y.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-Bo-FPk6Y.js.gz +0 -0
- package/dist/web/assets/query-audit-section-CQfzKAf9.js.br +0 -0
- package/dist/web/assets/query-audit-section-CQfzKAf9.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-DgeuoZ4n.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-DgeuoZ4n.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-BpP7jI0p.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-BpP7jI0p.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-Byn0lFCF.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-Byn0lFCF.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-B2mXZ9vo.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-B2mXZ9vo.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-CWt3VVjm.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-CWt3VVjm.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-Bx9Rm-NB.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-Bx9Rm-NB.js.gz +0 -0
- package/dist/web/assets/settings-body-DU3LZkOy.js.br +0 -0
- package/dist/web/assets/settings-body-DU3LZkOy.js.gz +0 -0
- package/dist/web/assets/sql-query-editor-BMNsmnfi.js.br +0 -0
- package/dist/web/assets/sql-query-editor-BMNsmnfi.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-DBdxQgCD.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-DBdxQgCD.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-BEuqhoiF.js.br +0 -0
- package/dist/web/assets/system-monitor-body-BEuqhoiF.js.gz +0 -0
- package/dist/web/assets/system-monitor-tab-BAU1kzbY.js +0 -1
- package/dist/web/assets/tab-host-window-content-BhS39QWy.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-BhS39QWy.js.gz +0 -0
- package/dist/web/assets/team-member-sheet-C5-PeHDb.js.br +0 -0
- package/dist/web/assets/team-member-sheet-C5-PeHDb.js.gz +0 -0
- package/dist/web/assets/team-member-window-content-CZjHuvdw.js.gz +0 -0
- package/dist/web/assets/terminal-tab-B0w7Jsbs.js.br +0 -0
- package/dist/web/assets/terminal-tab-B0w7Jsbs.js.gz +0 -0
- package/dist/web/assets/tool-cards-CmdjXi2c.js.br +0 -0
- package/dist/web/assets/tool-cards-CmdjXi2c.js.gz +0 -0
- package/dist/web/assets/use-inline-blame-BSb807l9.js.br +0 -0
- package/dist/web/assets/use-inline-blame-BSb807l9.js.gz +0 -0
- package/dist/web/assets/use-lsp-DhBjkGWr.js.br +0 -0
- package/dist/web/assets/use-lsp-DhBjkGWr.js.gz +0 -0
- package/dist/web/assets/video-preview-T1SMFp03.js.br +0 -0
- package/dist/web/assets/video-preview-T1SMFp03.js.gz +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 re,dt as ie,gr as ae,ir as oe,j as se,lt as ce,nt as le,pt as m,q as h,qr as g,r as _,rr as v,st as y,un as b,vt as ue,w as de,yt as x}from"./icons-C9ZwXgel.js";import{t as fe}from"./createLucideIcon-DBXq3G0e.js";import{i as pe,n as S}from"./api-client-c8YOpTlT.js";import{t as C}from"./settings-store-DXmQug0m.js";import{q as w}from"./vendor-mermaid-eg2XWIjK.js";import{t as T}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import{t as me}from"./panel-store-BUQ-CPsd.js";import"./window-store-B4cbZ5rr.js";import{i as he}from"./project-store-C5gJXkvb.js";import"./project-framework-store-XxFXcUpb.js";import{t as E}from"./tab-store-DqeaGhhE.js";import{o as D}from"./file-store-CTlJqj2m.js";import{n as ge,t as _e}from"./use-is-mobile-CkO33jqU.js";import"./git-repo-store-DFTJ5ngK.js";import{t as ve}from"./button-CBehaXpV.js";import{a as ye,i as be,n as xe,o as Se,t as Ce}from"./dialog-CaShS4f5.js";import"./file-icons-BlOxPo3P.js";import{t as we}from"./mobile-bottom-sheet-Cf4kV1hS.js";import"./use-visual-viewport-C307OVeV.js";import"./fs-api-RVc5RtTA.js";import"./format-file-meta-DLaHgkdx.js";import{t as O}from"./input-CP31LZnN.js";import"./scroll-area-xAtds1T-.js";import{S as Te,Sn as Ee,an as De,bt as Oe,cn as k,dn as ke,dt as Ae,fn as A,ft as je,in as j,ln as M,mn as N,nn as Me,on as P,pn as F,pt as Ne,rn as I,un as Pe,v as Fe,wn as Ie}from"./index-BVKT5UCu.js";import"./data-grid-types-DatI2Wee.js";import{t as Le}from"./use-monaco-theme-CNEk66US.js";import{n as Re,t as ze}from"./editor-font-BOjGgYeg.js";import{t as Be}from"./use-inline-blame-BSb807l9.js";import{n as Ve,r as He}from"./monaco-dotenv-language-COsgiuQg.js";import{i as Ue,n as We,r as Ge,t as Ke}from"./can-open-in-ppm-D8T6Xca-.js";import{a as qe,i as Je,o as Ye,r as Xe,t as Ze}from"./glide-data-grid-DG9AnCmP.js";var Qe=fe(`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`}]]),L=e(t(),1),R=n();function $e({projectName:e,filePath:t,tabId:n,ready:r,children:i}){let a=(0,L.useRef)(null),o=E(e=>e.activeTabId);return(0,L.useEffect)(()=>{let i=()=>{if(!r||!e||!t||!n||o!==n)return;let i=!!a.current?.checkVisibility({checkOpacity:!0,checkVisibilityCSS:!0});i&&Oe({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,R.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),z={noSemanticValidation:!0,noSyntaxValidation:!0,noSuggestionDiagnostics:!0},it=1;function at(e,t){for(let n of[e,t])n.setModeConfiguration({...nt}),n.setDiagnosticsOptions({...z})}function B(e,t){for(let n of[e,t])n.setCompilerOptions({...n.getCompilerOptions(),jsx:it,allowJs:!0,allowNonTsExtensions:!0}),n.setModeConfiguration({...rt}),n.setDiagnosticsOptions({...z})}function ot(e,t,n){e?at(t,n):B(t,n)}function st({enabled:e,onToggle:t,status:n,diagnostics:i}){let[a,o]=(0,L.useState)(!1),s=ge();if(!e)return(0,R.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,R.jsx)(r,{className:`size-3 shrink-0`}),(0,R.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,R.jsxs)(R.Fragment,{children:[(0,R.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,R.jsx)(b,{className:`size-3 animate-spin shrink-0`}):f?(0,R.jsx)(_,{className:`size-3 shrink-0`}):(0,R.jsx)(u,{className:`size-3 shrink-0`}),(0,R.jsx)(`span`,{className:`max-w-24 truncate`,children:d}),c>0&&(0,R.jsx)(`span`,{className:`text-red-500`,children:c}),c===0&&l>0&&(0,R.jsx)(`span`,{className:`text-amber-500`,children:l})]}),a&&(0,R.jsx)(V,{status:n,errors:c,warnings:l,isMobile:s,onToggle:t,onClose:()=>o(!1)})]})}function V({status:e,errors:t,warnings:n,isMobile:r,onToggle:i,onClose:a}){let o=(0,R.jsx)(ct,{status:e,errors:t,warnings:n,isMobile:r,onToggle:i});return r?(0,R.jsx)(we,{open:!0,onClose:a,className:`popover-solid max-h-[85dvh] flex flex-col`,children:o}):(0,R.jsx)(Ce,{open:!0,onOpenChange:e=>!e&&a(),children:(0,R.jsxs)(xe,{className:`sm:max-w-lg`,children:[(0,R.jsx)(Se,{children:`Language server`}),o]})})}function ct({status:e,errors:t,warnings:n,isMobile:r,onToggle:i}){return(0,R.jsxs)(`div`,{className:`p-4 space-y-4 overflow-y-auto text-sm leading-relaxed`,children:[e.state===`ready`&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(lt,{label:`Server`,value:e.server.displayName}),(0,R.jsx)(lt,{label:`Language`,value:e.languageId}),(0,R.jsx)(lt,{label:`Project root`,value:e.server.rootPath,mono:!0}),(0,R.jsx)(lt,{label:`Problems`,value:`${t} error${t===1?``:`s`}, ${n} warning${n===1?``:`s`}`}),(0,R.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,R.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,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`p`,{children:e.message}),e.server&&(0,R.jsxs)(`div`,{className:`space-y-2`,children:[(0,R.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,R.jsx)(ut,{command:e.server.installHint,isMobile:r})]}),e.reason===`no-language`&&(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No language server is registered for this file type.`})]}),(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-3 border-t border-border pt-3`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`p`,{className:`text-xs font-medium`,children:`Language server`}),(0,R.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`On for this device. Turning it off stops the process.`})]}),(0,R.jsx)(Ae,{checked:!0,onCheckedChange:e=>i(e)})]})]})}function lt({label:e,value:t,mono:n}){return(0,R.jsxs)(`div`,{className:`flex gap-2 items-baseline`,children:[(0,R.jsx)(`span`,{className:`text-muted-foreground shrink-0 w-24 text-xs`,children:e}),(0,R.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,L.useState)(!1);return(0,R.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,R.jsx)(`span`,{className:`flex-1 break-all`,children:e}),n?(0,R.jsx)(de,{className:`size-3.5 shrink-0 text-green-500`}):(0,R.jsx)(le,{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 S.get(`/api/fs/browse?path=${encodeURIComponent(e)}`)).entries}function pt({filePath:e,projectName:t,tabId:n,className:r}){let{updateTab:i,openTab:a}=E(Me(e=>({updateTab:e.updateTab,openTab:e.openTab}))),o=(0,L.useRef)(null),s=(0,L.useMemo)(()=>dt(e),[e]);(0,L.useEffect)(()=>{o.current&&(o.current.scrollLeft=o.current.scrollWidth)},[s]);let c=(0,L.useCallback)((e,r)=>{let o=T(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,R.jsx)(`div`,{ref:o,className:r,children:s.map((e,t)=>(0,R.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[t>0&&(0,R.jsx)(se,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,R.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,L.useState)(null),[a,o]=(0,L.useState)(null);function s(t){t&&r===null&&ft(e.parentDir).then(i).catch(e=>{o(e.message||`Failed to browse`),i([])})}return(0,R.jsxs)(I,{onOpenChange:s,children:[(0,R.jsx)(N,{asChild:!0,children:(0,R.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,R.jsx)(De,{align:`start`,className:`max-h-[300px] overflow-y-auto p-1`,children:r===null?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):a?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-destructive`,children:a}):r.length===0?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Empty`}):r.map(t=>(0,R.jsx)(ht,{entry:t,activePath:e.absPath,onFileClick:n},t.path))})]})}function ht({entry:e,activePath:t,onFileClick:n}){let r=U(e.name,e.type===`directory`),i=e.path===t,[a,o]=(0,L.useState)(null);if(e.type===`directory`){function s(t){t&&a===null&&ft(e.path).then(o).catch(()=>o([]))}return(0,R.jsxs)(ke,{onOpenChange:s,children:[(0,R.jsxs)(F,{className:`text-xs gap-1.5 ${i?`bg-muted`:``}`,children:[(0,R.jsx)(r,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,R.jsx)(`span`,{className:`truncate`,children:e.name})]}),(0,R.jsx)(A,{className:`max-h-[300px] overflow-y-auto p-1`,children:a===null?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):a.length===0?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Empty`}):a.map(e=>(0,R.jsx)(ht,{entry:e,activePath:t,onFileClick:n},e.path))})]})}return(0,R.jsxs)(P,{className:`text-xs gap-1.5 cursor-pointer ${i?`bg-muted`:``}`,onClick:t=>n(e.path,t),children:[(0,R.jsx)(r,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,R.jsx)(`span`,{className:`truncate`,children:e.name})]})}var H={ts:m,tsx:m,js:m,jsx:m,py:m,rs:m,go:m,html:m,css:m,scss:m,json:Qe,md:ue,txt:ue,yaml:x,yml:x};function U(e,t){return t?o:H[e.split(`.`).pop()?.toLowerCase()??``]??ie}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 W(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=D(e=>e.tree),{updateTab:a,openTab:o}=E(Me(e=>({updateTab:e.updateTab,openTab:e.openTab}))),s=he(e=>e.projects.find(e=>e.name===t)?.path??``),c=(0,L.useRef)(null),{prefixParts:l,relativePath:u,isExternal:d}=(0,L.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,L.useMemo)(()=>gt(i,u.split(`/`).filter(Boolean)),[i,u]);(0,L.useEffect)(()=>{c.current&&(c.current.scrollLeft=c.current.scrollWidth)},[f]);function p(e,r){let i=T(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,R.jsx)(pt,{filePath:e,projectName:t,tabId:n,className:r}):(0,R.jsxs)(`div`,{ref:c,className:r,children:[l.map((e,t)=>(0,R.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[t>0&&(0,R.jsx)(se,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,R.jsx)(`span`,{className:`text-xs text-muted-foreground px-1 py-0.5`,children:e})]},`prefix-${t}`)),f.map((e,n)=>(0,R.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[(n>0||l.length>0)&&(0,R.jsx)(se,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,R.jsx)(G,{segment:e,isLast:n===f.length-1,projectName:t,onFileClick:p})]},e.fullPath))]})}function G({segment:e,isLast:t,projectName:n,onFileClick:r}){let i=D(e=>e.loadChildren),a=D(e=>e.loadedPaths),o=(0,L.useMemo)(()=>W(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,R.jsxs)(I,{onOpenChange:c,children:[(0,R.jsx)(N,{asChild:!0,children:(0,R.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,R.jsx)(De,{align:`start`,className:`max-h-[300px] p-1`,children:o.length===0?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):o.map(t=>(0,R.jsx)(K,{node:t,projectName:n,activePath:e.fullPath,onFileClick:r},t.path))})]})}function K({node:e,projectName:t,activePath:n,onFileClick:r}){let i=U(e.name,e.type===`directory`),a=e.path===n,o=D(e=>e.loadChildren),s=D(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,R.jsxs)(ke,{onOpenChange:u,children:[(0,R.jsxs)(F,{className:`text-xs gap-1.5 ${a?`bg-muted`:``}`,children:[(0,R.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,R.jsx)(`span`,{className:`truncate`,children:e.name})]}),(0,R.jsx)(A,{className:`max-h-[300px] overflow-y-auto p-1`,children:c.length===0?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):W(c).map(e=>(0,R.jsx)(K,{node:e,projectName:t,activePath:n,onFileClick:r},e.path))})]})}return(0,R.jsxs)(P,{className:`text-xs gap-1.5 cursor-pointer ${a?`bg-muted`:``}`,onSelect:e=>{},onClick:t=>{r(e.path,t)},children:[(0,R.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,R.jsx)(`span`,{className:`truncate`,children:e.name})]})}function q({active:e,onClick:t,icon:n,label:r,title:i}){return(0,R.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,R.jsx)(n,{className:`size-3`}),(0,R.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:re}){return(0,R.jsxs)(`div`,{className:re,children:[(e===`md`||e===`mdx`)&&n&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(q,{active:t===`edit`,onClick:()=>n(`edit`),icon:p,label:`Edit`}),(0,R.jsx)(q,{active:t===`preview`,onClick:()=>n(`preview`),icon:ce,label:`Preview`})]}),e===`csv`&&i&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(q,{active:r===`table`,onClick:()=>i(`table`),icon:d,label:`Table`}),(0,R.jsx)(q,{active:r===`raw`,onClick:()=>i(`raw`),icon:p,label:`Raw`})]}),(0,R.jsx)(q,{active:o,onClick:s,icon:g,label:`Wrap`}),l&&(0,R.jsx)(q,{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,R.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,R.jsx)(oe,{className:`size-3 ${ee?`animate-spin`:``}`}),(0,R.jsx)(`span`,{className:`hidden sm:inline`,children:`Refresh`})]}),te&&ne&&(0,R.jsx)(q,{active:!1,onClick:()=>Ee(ne,te),icon:y,label:`Download`})]})}function yt({filePath:e,projectName:t,revision:n}){let[r,i]=(0,L.useState)(),[a,o]=(0,L.useState)();return(0,L.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 S.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,R.jsxs)(`div`,{role:`alert`,className:`p-4 text-sm text-destructive`,children:[a,`. Use Refresh to retry.`]}):r?(0,R.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,R.jsxs)(`div`,{role:`status`,className:`flex flex-1 items-center justify-center gap-2 text-sm text-muted-foreground`,children:[(0,R.jsx)(b,{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,R.jsxs)(`div`,{className:`shrink-0 flex items-center gap-1 px-2 border-l border-border`,children:[(0,R.jsx)(m,{className:`size-3 text-muted-foreground`}),(0,R.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,R.jsx)(`option`,{value:e.id,children:e.label},e.id))})]})}var J=`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,R.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,R.jsx)(`div`,{className:`hidden md:flex flex-1 min-w-0 overflow-hidden`,children:s}),t===`preview`&&(0,R.jsx)(`button`,{type:`button`,onClick:r,title:`Reload the original HTML file`,"aria-label":`Refresh preview`,className:J,children:(0,R.jsx)(oe,{className:`size-4`})}),[[`edit`,`Code`,p],[`preview`,`Preview`,ce]].map(([e,r,i])=>(0,R.jsxs)(`button`,{type:`button`,"aria-pressed":t===e,onClick:()=>n(e),className:`${J} ${t===e?`bg-muted text-foreground`:``}`,children:[(0,R.jsx)(i,{className:`size-3.5`}),r]},e)),o&&(0,R.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,R.jsxs)(I,{children:[(0,R.jsx)(N,{asChild:!0,children:(0,R.jsx)(`button`,{type:`button`,title:`More HTML actions`,"aria-label":`More HTML actions`,className:`${J} ml-auto md:ml-0`,children:(0,R.jsx)(i,{className:`size-4`})})}),(0,R.jsxs)(De,{align:`end`,className:`w-52`,children:[t===`edit`&&(0,R.jsxs)(P,{className:St,disabled:o||e.refreshing,onSelect:e.onReloadCode,children:[(0,R.jsx)(oe,{}),`Reload code from disk`]}),(0,R.jsxs)(P,{className:St,onSelect:()=>void Ee(e.projectName??``,e.filePath),children:[(0,R.jsx)(y,{}),`Download`]}),(0,R.jsx)(Pe,{}),(0,R.jsxs)(j,{className:Ct,checked:e.wordWrap,onCheckedChange:e.onToggleWordWrap,children:[(0,R.jsx)(g,{className:`size-4 text-muted-foreground`}),`Word wrap`]}),e.onToggleInlineBlame&&(0,R.jsxs)(j,{className:Ct,checked:e.inlineBlame,onCheckedChange:e.onToggleInlineBlame,children:[(0,R.jsx)(a,{className:`size-4 text-muted-foreground`}),`Inline blame`]}),e.onToggleLsp&&(0,R.jsxs)(j,{className:Ct,checked:e.lspEnabled,onCheckedChange:e.onToggleLsp,children:[(0,R.jsx)(u,{className:`size-4 text-muted-foreground`}),`Language server`]}),(0,R.jsxs)(ke,{children:[(0,R.jsxs)(F,{className:`${St} gap-2`,children:[(0,R.jsx)(m,{className:`size-4 text-muted-foreground`}),`Editor language`]}),(0,R.jsx)(A,{className:`max-h-80 overflow-y-auto`,children:(0,R.jsx)(k,{value:e.language,onValueChange:e.onLanguageChange,children:bt.map(e=>(0,R.jsx)(M,{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,L.useState)(t),[s,c]=(0,L.useState)(!1),[l,u]=(0,L.useState)(``),d=he(e=>e.activeProject),f=(0,L.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,L.useCallback)(e=>{let t=e.includes(`\\`)?`\\`:`/`;r(e.endsWith(t)?`${e}${a.trim()}`:`${e}${t}${a.trim()}`,n)},[a,n,r]);return s?(0,R.jsx)(Ne,{open:!0,mode:`folder`,root:d?.path,title:`Save "${a.trim()}" to...`,onSelect:p,onCancel:()=>c(!1)}):(0,R.jsx)(Ce,{open:e,onOpenChange:e=>{e||i()},children:(0,R.jsxs)(xe,{className:`sm:max-w-md`,children:[(0,R.jsx)(ye,{children:(0,R.jsx)(Se,{children:`Save As`})}),(0,R.jsxs)(`div`,{className:`flex flex-col gap-2 py-2`,children:[(0,R.jsx)(`label`,{className:`text-sm text-muted-foreground`,children:`Filename`}),(0,R.jsx)(O,{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,R.jsx)(`p`,{className:`text-xs text-destructive`,children:l})]}),(0,R.jsxs)(be,{children:[(0,R.jsx)(ve,{variant:`outline`,onClick:i,children:`Cancel`}),(0,R.jsx)(ve,{onClick:f,children:`Choose Folder...`})]})]})})}var Et=typeof window<`u`&&window.isSecureContext,Y=[`(`,`)`,`{`,`}`,`[`,`]`,`<`,`>`,`;`,`:`,`=`,`"`,`'`,"`",`/`,`\\`,`_`,`#`],X=`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,L.useCallback)(()=>e.current,[e]),a=(0,L.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,L.useState)(!1),u=(0,L.useRef)(null),d=(0,L.useCallback)(async()=>{try{let e=await navigator.clipboard.readText();e&&a(e)}catch{}},[a]),f=(0,L.useCallback)(()=>{l(!0),requestAnimationFrame(()=>u.current?.focus())},[]),p=(0,L.useCallback)(e=>{e.preventDefault();let t=e.clipboardData.getData(`text/plain`);t&&(l(!1),a(t))},[a]),ee=(0,L.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`undo`,null))},[i]),te=(0,L.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`redo`,null))},[i]),ne=(0,L.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`tab`,null))},[i]);return t?null:(0,R.jsxs)(`div`,{className:`shrink-0 border-t border-border bg-surface`,children:[!Et&&o&&(0,R.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1.5 border-b border-border bg-muted/50`,children:[(0,R.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,R.jsx)(`button`,{type:`button`,onClick:()=>l(!1),className:`p-1.5 rounded text-muted-foreground active:bg-muted transition-colors`,children:(0,R.jsx)(c,{size:14})})]}),(0,R.jsxs)(`div`,{className:`flex items-center gap-1 px-2 py-1.5 overflow-x-auto`,children:[(0,R.jsx)(`button`,{type:`button`,onClick:Et?d:f,className:X,title:`Paste`,children:(0,R.jsx)(h,{size:14})}),(0,R.jsx)(`button`,{type:`button`,onClick:ee,className:X,title:`Undo`,children:(0,R.jsx)(s,{size:14})}),(0,R.jsx)(`button`,{type:`button`,onClick:te,className:X,title:`Redo`,children:(0,R.jsx)(v,{size:14})}),(0,R.jsx)(`button`,{type:`button`,onClick:r,className:`${X} ${n?`text-primary`:``}`,title:n?`Wrapping long lines — tap to scroll sideways instead`:`Wrap long lines`,children:(0,R.jsx)(g,{size:14})}),(0,R.jsx)(`div`,{className:Ot}),(0,R.jsx)(`button`,{type:`button`,onClick:ne,className:Dt,children:`Tab`}),(0,R.jsx)(`div`,{className:Ot}),Y.map(e=>(0,R.jsx)(`button`,{type:`button`,onClick:()=>a(e),className:Dt,children:e},e))]})]})}var At=(0,L.lazy)(()=>w(()=>import(`./markdown-renderer-56wMzGkr.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]))),jt=(0,L.lazy)(()=>w(()=>import(`./editor-language-service-CkoaAHjF.js`).then(e=>({default:e.EditorLanguageService})),__vite__mapDeps([41,2,3,4,10,42,6,1,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]))),Mt=(0,L.lazy)(()=>w(()=>import(`./csv-preview-ycnxJ_6J.js`).then(e=>({default:e.CsvPreview})),__vite__mapDeps([43,2,6,1,3,4,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,44,45]))),Nt=(0,L.lazy)(()=>w(()=>import(`./image-preview-eAv91-an.js`).then(e=>({default:e.ImagePreview})),__vite__mapDeps([46,3,2,4,10,47,20]))),Pt=(0,L.lazy)(()=>w(()=>import(`./pdf-preview-CaxTidh0.js`).then(e=>({default:e.PdfPreview})),__vite__mapDeps([48,2,3,4,10,20]))),Ft=(0,L.lazy)(()=>w(()=>import(`./video-preview-T1SMFp03.js`).then(e=>({default:e.VideoPreview})),__vite__mapDeps([49,2,6,1,3,4,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,50,51]))),It=(0,L.lazy)(()=>w(()=>import(`./audio-preview-CO7Ia2N5.js`).then(e=>({default:e.AudioPreview})),__vite__mapDeps([52,2,3,4,8,10,20,51]))),Lt=(0,L.lazy)(()=>w(()=>import(`./docx-preview-C8K6QzOW.js`).then(e=>({default:e.DocxPreview})),__vite__mapDeps([53,2,3,4,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,L.memo)(function({metadata:e,tabId:t}){let n=e?.filePath,r=e?.projectName,i=e?.inlineContent,a=e?.inlineLanguage,[o,s]=(0,L.useState)(i??null),[c,l]=(0,L.useState)(`utf-8`),[u,d]=(0,L.useState)(!0),[p,re]=(0,L.useState)(null),[ie,oe]=(0,L.useState)(null),se=E(e=>e.activeTabId),[ce,le]=(0,L.useState)(0);(0,L.useEffect)(()=>{let e=()=>le(e=>e+1);return window.addEventListener(`ppm:onboarding-refresh`,e),()=>window.removeEventListener(`ppm:onboarding-refresh`,e)},[]);let[m,h]=(0,L.useState)(!1),g=(0,L.useRef)(null),_=(0,L.useRef)(``),v=(0,L.useRef)(null),[y,ue]=(0,L.useState)(null),{tabs:de,updateTab:x}=E(Me(e=>({tabs:e.tabs,updateTab:e.updateTab}))),{wordWrap:fe,toggleWordWrap:he,mobileWordWrap:D,toggleMobileWordWrap:ve}=C(Me(e=>({wordWrap:e.wordWrap,toggleWordWrap:e.toggleWordWrap,mobileWordWrap:e.mobileWordWrap,toggleMobileWordWrap:e.toggleMobileWordWrap}))),ye=C(e=>e.inlineBlame),be=C(e=>e.toggleInlineBlame),xe=C(e=>e.lspEnabled),Se=C(e=>e.setLspEnabled),Ce=ge(),we=Fe(),O=Ce?D:fe,Ee=Ce?ve:he,De=Le(),k=e?.isUntitled===!0,ke=e?.unsavedContent,[Ae,A]=(0,L.useState)(!1),j=de.find(e=>e.id===t),M=n?Rt(n):``,N=We.has(M),P=M===`pdf`,F=M===`docx`,Ne=Ue.has(M),I=Ke.has(M),Pe=Ge.has(M),Ve=M===`md`||M===`mdx`,Ze=(M===`html`||M===`htm`)&&!k&&i==null,[Qe,$e]=(0,L.useState)(`preview`),[et,tt]=(0,L.useState)(0),[nt,rt]=(0,L.useState)(!1),z=Ze&&Qe===`preview`,it=M===`csv`,at=e?.language,B=a??at??zt(n??``),V=B===`sql`,[ct,lt]=(0,L.useState)(`preview`),[ut,dt]=(0,L.useState)(`table`),{connections:ft,cachedTables:pt,refreshTables:mt,updateConnection:ht}=je(),H=n?`ppm:sql-conn:${n}`:t?`ppm:sql-conn:tab:${t}`:null,[U,gt]=(0,L.useState)(()=>{if(!H)return null;let e=localStorage.getItem(H);return e?Number(e):null}),W=(0,L.useRef)(null),G=(0,L.useRef)(null),K=(0,L.useMemo)(()=>ft.find(e=>e.id===U)??null,[ft,U]),q=i!=null&&(a===`json`||a===`xml`),[bt,J]=(0,L.useState)(!1),St=(0,L.useCallback)(()=>{if(i)if(bt)s(i),J(!1);else{let e=i.trimStart();if(a===`json`)try{s(JSON.stringify(JSON.parse(e),null,2)),J(!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-C33dsNJ_.js","assets/vendor-mermaid-eg2XWIjK.js","assets/rolldown-runtime-C5c2KzVm.js","assets/vendor-ui-BHh12_0v.js","assets/vendor-markdown-QKPNiWEd.js","assets/markdown-renderer-CZiECUJp.js","assets/index-CvUGUp7d.js","assets/button-CBehaXpV.js","assets/utils-btZ8C8-R.js","assets/createLucideIcon-DBXq3G0e.js","assets/api-client-c8YOpTlT.js","assets/react-CzUPVyyG.js","assets/settings-store-DXmQug0m.js","assets/file-store-CTlJqj2m.js","assets/window-store-B4cbZ5rr.js","assets/window-pip-registry-DH07f_8k.js","assets/panel-store-BUQ-CPsd.js","assets/onboarding-quick-orientation-CT4PylG0.js","assets/dialog-tzBRkGeW.js","assets/portal-container-context-NFSuymMu.js","assets/icons-CO_II6D-.js","assets/use-is-mobile-CkO33jqU.js","assets/format-file-meta-DLaHgkdx.js","assets/fs-api-RVc5RtTA.js","assets/context-menu-CjYTq8DI.js","assets/input-CP31LZnN.js","assets/mobile-bottom-sheet-Cf4kV1hS.js","assets/use-visual-viewport-C307OVeV.js","assets/scroll-area-xAtds1T-.js","assets/file-icons-BlOxPo3P.js","assets/project-framework-store-XxFXcUpb.js","assets/format-date-BMtvCeb9.js","assets/git-repo-store-DFTJ5ngK.js","assets/project-store-C5gJXkvb.js","assets/ws-auth-B_y5rMfZ.js","assets/tab-store-DqeaGhhE.js","assets/apply-theme-aVoqSG0I.js","assets/resolve-theme-B87m6l4i.js","assets/index-DMA-So69.css","assets/image-gallery-DvAgPQ3L.js","assets/run-in-terminal-SU9cwoZ4.js","assets/editor-language-service-DYBxZX66.js","assets/use-lsp-DK26Eter.js","assets/csv-preview-CYxznB1I.js","assets/lib-KePrAxj7.js","assets/csv-parser-BXeH-yzY.js","assets/image-preview-78Fguk1f.js","assets/use-blob-url-mZfScQdx.js","assets/pdf-preview-BWim6mu1.js","assets/video-preview-C48Go7JZ.js","assets/can-open-in-ppm-D8T6Xca-.js","assets/media-url-GqzhazJS.js","assets/audio-preview-DXtE1Lpz.js","assets/docx-preview-C-UKGMXR.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 re,dt as ie,gr as ae,ir as oe,j as se,lt as ce,nt as le,pt as m,q as h,qr as g,r as _,rr as v,st as y,un as b,vt as ue,w as de,yt as x}from"./icons-CO_II6D-.js";import{t as fe}from"./createLucideIcon-DBXq3G0e.js";import{i as pe,n as S}from"./api-client-c8YOpTlT.js";import{t as C}from"./settings-store-DXmQug0m.js";import{q as w}from"./vendor-mermaid-eg2XWIjK.js";import{t as T}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import{t as me}from"./panel-store-BUQ-CPsd.js";import"./window-store-B4cbZ5rr.js";import{i as he}from"./project-store-C5gJXkvb.js";import"./project-framework-store-XxFXcUpb.js";import{t as E}from"./tab-store-DqeaGhhE.js";import{o as D}from"./file-store-CTlJqj2m.js";import{n as ge,t as _e}from"./use-is-mobile-CkO33jqU.js";import"./git-repo-store-DFTJ5ngK.js";import{t as ve}from"./button-CBehaXpV.js";import{a as ye,i as be,n as xe,o as Se,t as Ce}from"./dialog-tzBRkGeW.js";import"./file-icons-BlOxPo3P.js";import{t as we}from"./mobile-bottom-sheet-Cf4kV1hS.js";import"./use-visual-viewport-C307OVeV.js";import"./fs-api-RVc5RtTA.js";import"./format-file-meta-DLaHgkdx.js";import{t as O}from"./input-CP31LZnN.js";import"./scroll-area-xAtds1T-.js";import{S as Te,Sn as Ee,an as De,bt as Oe,cn as k,dn as ke,dt as Ae,fn as A,ft as je,in as j,ln as M,mn as N,nn as Me,on as P,pn as F,pt as Ne,rn as I,un as Pe,v as Fe,wn as Ie}from"./index-CvUGUp7d.js";import"./data-grid-types-DatI2Wee.js";import{t as Le}from"./use-monaco-theme-BVatH9yZ.js";import{n as Re,t as ze}from"./editor-font-BOjGgYeg.js";import{t as Be}from"./use-inline-blame--fS-pzzX.js";import{n as Ve,r as He}from"./monaco-dotenv-language-COsgiuQg.js";import{i as Ue,n as We,r as Ge,t as Ke}from"./can-open-in-ppm-D8T6Xca-.js";import{a as qe,i as Je,o as Ye,r as Xe,t as Ze}from"./glide-data-grid-CUNWBFfN.js";var Qe=fe(`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`}]]),L=e(t(),1),R=n();function $e({projectName:e,filePath:t,tabId:n,ready:r,children:i}){let a=(0,L.useRef)(null),o=E(e=>e.activeTabId);return(0,L.useEffect)(()=>{let i=()=>{if(!r||!e||!t||!n||o!==n)return;let i=!!a.current?.checkVisibility({checkOpacity:!0,checkVisibilityCSS:!0});i&&Oe({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,R.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),z={noSemanticValidation:!0,noSyntaxValidation:!0,noSuggestionDiagnostics:!0},it=1;function at(e,t){for(let n of[e,t])n.setModeConfiguration({...nt}),n.setDiagnosticsOptions({...z})}function B(e,t){for(let n of[e,t])n.setCompilerOptions({...n.getCompilerOptions(),jsx:it,allowJs:!0,allowNonTsExtensions:!0}),n.setModeConfiguration({...rt}),n.setDiagnosticsOptions({...z})}function ot(e,t,n){e?at(t,n):B(t,n)}function st({enabled:e,onToggle:t,status:n,diagnostics:i}){let[a,o]=(0,L.useState)(!1),s=ge();if(!e)return(0,R.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,R.jsx)(r,{className:`size-3 shrink-0`}),(0,R.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,R.jsxs)(R.Fragment,{children:[(0,R.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,R.jsx)(b,{className:`size-3 animate-spin shrink-0`}):f?(0,R.jsx)(_,{className:`size-3 shrink-0`}):(0,R.jsx)(u,{className:`size-3 shrink-0`}),(0,R.jsx)(`span`,{className:`max-w-24 truncate`,children:d}),c>0&&(0,R.jsx)(`span`,{className:`text-red-500`,children:c}),c===0&&l>0&&(0,R.jsx)(`span`,{className:`text-amber-500`,children:l})]}),a&&(0,R.jsx)(V,{status:n,errors:c,warnings:l,isMobile:s,onToggle:t,onClose:()=>o(!1)})]})}function V({status:e,errors:t,warnings:n,isMobile:r,onToggle:i,onClose:a}){let o=(0,R.jsx)(ct,{status:e,errors:t,warnings:n,isMobile:r,onToggle:i});return r?(0,R.jsx)(we,{open:!0,onClose:a,className:`popover-solid max-h-[85dvh] flex flex-col`,children:o}):(0,R.jsx)(Ce,{open:!0,onOpenChange:e=>!e&&a(),children:(0,R.jsxs)(xe,{className:`sm:max-w-lg`,children:[(0,R.jsx)(Se,{children:`Language server`}),o]})})}function ct({status:e,errors:t,warnings:n,isMobile:r,onToggle:i}){return(0,R.jsxs)(`div`,{className:`p-4 space-y-4 overflow-y-auto text-sm leading-relaxed`,children:[e.state===`ready`&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(lt,{label:`Server`,value:e.server.displayName}),(0,R.jsx)(lt,{label:`Language`,value:e.languageId}),(0,R.jsx)(lt,{label:`Project root`,value:e.server.rootPath,mono:!0}),(0,R.jsx)(lt,{label:`Problems`,value:`${t} error${t===1?``:`s`}, ${n} warning${n===1?``:`s`}`}),(0,R.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,R.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,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`p`,{children:e.message}),e.server&&(0,R.jsxs)(`div`,{className:`space-y-2`,children:[(0,R.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,R.jsx)(ut,{command:e.server.installHint,isMobile:r})]}),e.reason===`no-language`&&(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No language server is registered for this file type.`})]}),(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-3 border-t border-border pt-3`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`p`,{className:`text-xs font-medium`,children:`Language server`}),(0,R.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`On for this device. Turning it off stops the process.`})]}),(0,R.jsx)(Ae,{checked:!0,onCheckedChange:e=>i(e)})]})]})}function lt({label:e,value:t,mono:n}){return(0,R.jsxs)(`div`,{className:`flex gap-2 items-baseline`,children:[(0,R.jsx)(`span`,{className:`text-muted-foreground shrink-0 w-24 text-xs`,children:e}),(0,R.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,L.useState)(!1);return(0,R.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,R.jsx)(`span`,{className:`flex-1 break-all`,children:e}),n?(0,R.jsx)(de,{className:`size-3.5 shrink-0 text-green-500`}):(0,R.jsx)(le,{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 S.get(`/api/fs/browse?path=${encodeURIComponent(e)}`)).entries}function pt({filePath:e,projectName:t,tabId:n,className:r}){let{updateTab:i,openTab:a}=E(Me(e=>({updateTab:e.updateTab,openTab:e.openTab}))),o=(0,L.useRef)(null),s=(0,L.useMemo)(()=>dt(e),[e]);(0,L.useEffect)(()=>{o.current&&(o.current.scrollLeft=o.current.scrollWidth)},[s]);let c=(0,L.useCallback)((e,r)=>{let o=T(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,R.jsx)(`div`,{ref:o,className:r,children:s.map((e,t)=>(0,R.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[t>0&&(0,R.jsx)(se,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,R.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,L.useState)(null),[a,o]=(0,L.useState)(null);function s(t){t&&r===null&&ft(e.parentDir).then(i).catch(e=>{o(e.message||`Failed to browse`),i([])})}return(0,R.jsxs)(I,{onOpenChange:s,children:[(0,R.jsx)(N,{asChild:!0,children:(0,R.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,R.jsx)(De,{align:`start`,className:`max-h-[300px] overflow-y-auto p-1`,children:r===null?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):a?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-destructive`,children:a}):r.length===0?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Empty`}):r.map(t=>(0,R.jsx)(ht,{entry:t,activePath:e.absPath,onFileClick:n},t.path))})]})}function ht({entry:e,activePath:t,onFileClick:n}){let r=U(e.name,e.type===`directory`),i=e.path===t,[a,o]=(0,L.useState)(null);if(e.type===`directory`){function s(t){t&&a===null&&ft(e.path).then(o).catch(()=>o([]))}return(0,R.jsxs)(ke,{onOpenChange:s,children:[(0,R.jsxs)(F,{className:`text-xs gap-1.5 ${i?`bg-muted`:``}`,children:[(0,R.jsx)(r,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,R.jsx)(`span`,{className:`truncate`,children:e.name})]}),(0,R.jsx)(A,{className:`max-h-[300px] overflow-y-auto p-1`,children:a===null?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):a.length===0?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Empty`}):a.map(e=>(0,R.jsx)(ht,{entry:e,activePath:t,onFileClick:n},e.path))})]})}return(0,R.jsxs)(P,{className:`text-xs gap-1.5 cursor-pointer ${i?`bg-muted`:``}`,onClick:t=>n(e.path,t),children:[(0,R.jsx)(r,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,R.jsx)(`span`,{className:`truncate`,children:e.name})]})}var H={ts:m,tsx:m,js:m,jsx:m,py:m,rs:m,go:m,html:m,css:m,scss:m,json:Qe,md:ue,txt:ue,yaml:x,yml:x};function U(e,t){return t?o:H[e.split(`.`).pop()?.toLowerCase()??``]??ie}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 W(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=D(e=>e.tree),{updateTab:a,openTab:o}=E(Me(e=>({updateTab:e.updateTab,openTab:e.openTab}))),s=he(e=>e.projects.find(e=>e.name===t)?.path??``),c=(0,L.useRef)(null),{prefixParts:l,relativePath:u,isExternal:d}=(0,L.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,L.useMemo)(()=>gt(i,u.split(`/`).filter(Boolean)),[i,u]);(0,L.useEffect)(()=>{c.current&&(c.current.scrollLeft=c.current.scrollWidth)},[f]);function p(e,r){let i=T(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,R.jsx)(pt,{filePath:e,projectName:t,tabId:n,className:r}):(0,R.jsxs)(`div`,{ref:c,className:r,children:[l.map((e,t)=>(0,R.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[t>0&&(0,R.jsx)(se,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,R.jsx)(`span`,{className:`text-xs text-muted-foreground px-1 py-0.5`,children:e})]},`prefix-${t}`)),f.map((e,n)=>(0,R.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[(n>0||l.length>0)&&(0,R.jsx)(se,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,R.jsx)(G,{segment:e,isLast:n===f.length-1,projectName:t,onFileClick:p})]},e.fullPath))]})}function G({segment:e,isLast:t,projectName:n,onFileClick:r}){let i=D(e=>e.loadChildren),a=D(e=>e.loadedPaths),o=(0,L.useMemo)(()=>W(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,R.jsxs)(I,{onOpenChange:c,children:[(0,R.jsx)(N,{asChild:!0,children:(0,R.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,R.jsx)(De,{align:`start`,className:`max-h-[300px] p-1`,children:o.length===0?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):o.map(t=>(0,R.jsx)(K,{node:t,projectName:n,activePath:e.fullPath,onFileClick:r},t.path))})]})}function K({node:e,projectName:t,activePath:n,onFileClick:r}){let i=U(e.name,e.type===`directory`),a=e.path===n,o=D(e=>e.loadChildren),s=D(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,R.jsxs)(ke,{onOpenChange:u,children:[(0,R.jsxs)(F,{className:`text-xs gap-1.5 ${a?`bg-muted`:``}`,children:[(0,R.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,R.jsx)(`span`,{className:`truncate`,children:e.name})]}),(0,R.jsx)(A,{className:`max-h-[300px] overflow-y-auto p-1`,children:c.length===0?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):W(c).map(e=>(0,R.jsx)(K,{node:e,projectName:t,activePath:n,onFileClick:r},e.path))})]})}return(0,R.jsxs)(P,{className:`text-xs gap-1.5 cursor-pointer ${a?`bg-muted`:``}`,onSelect:e=>{},onClick:t=>{r(e.path,t)},children:[(0,R.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,R.jsx)(`span`,{className:`truncate`,children:e.name})]})}function q({active:e,onClick:t,icon:n,label:r,title:i}){return(0,R.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,R.jsx)(n,{className:`size-3`}),(0,R.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:re}){return(0,R.jsxs)(`div`,{className:re,children:[(e===`md`||e===`mdx`)&&n&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(q,{active:t===`edit`,onClick:()=>n(`edit`),icon:p,label:`Edit`}),(0,R.jsx)(q,{active:t===`preview`,onClick:()=>n(`preview`),icon:ce,label:`Preview`})]}),e===`csv`&&i&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(q,{active:r===`table`,onClick:()=>i(`table`),icon:d,label:`Table`}),(0,R.jsx)(q,{active:r===`raw`,onClick:()=>i(`raw`),icon:p,label:`Raw`})]}),(0,R.jsx)(q,{active:o,onClick:s,icon:g,label:`Wrap`}),l&&(0,R.jsx)(q,{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,R.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,R.jsx)(oe,{className:`size-3 ${ee?`animate-spin`:``}`}),(0,R.jsx)(`span`,{className:`hidden sm:inline`,children:`Refresh`})]}),te&&ne&&(0,R.jsx)(q,{active:!1,onClick:()=>Ee(ne,te),icon:y,label:`Download`})]})}function yt({filePath:e,projectName:t,revision:n}){let[r,i]=(0,L.useState)(),[a,o]=(0,L.useState)();return(0,L.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 S.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,R.jsxs)(`div`,{role:`alert`,className:`p-4 text-sm text-destructive`,children:[a,`. Use Refresh to retry.`]}):r?(0,R.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,R.jsxs)(`div`,{role:`status`,className:`flex flex-1 items-center justify-center gap-2 text-sm text-muted-foreground`,children:[(0,R.jsx)(b,{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,R.jsxs)(`div`,{className:`shrink-0 flex items-center gap-1 px-2 border-l border-border`,children:[(0,R.jsx)(m,{className:`size-3 text-muted-foreground`}),(0,R.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,R.jsx)(`option`,{value:e.id,children:e.label},e.id))})]})}var J=`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,R.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,R.jsx)(`div`,{className:`hidden md:flex flex-1 min-w-0 overflow-hidden`,children:s}),t===`preview`&&(0,R.jsx)(`button`,{type:`button`,onClick:r,title:`Reload the original HTML file`,"aria-label":`Refresh preview`,className:J,children:(0,R.jsx)(oe,{className:`size-4`})}),[[`edit`,`Code`,p],[`preview`,`Preview`,ce]].map(([e,r,i])=>(0,R.jsxs)(`button`,{type:`button`,"aria-pressed":t===e,onClick:()=>n(e),className:`${J} ${t===e?`bg-muted text-foreground`:``}`,children:[(0,R.jsx)(i,{className:`size-3.5`}),r]},e)),o&&(0,R.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,R.jsxs)(I,{children:[(0,R.jsx)(N,{asChild:!0,children:(0,R.jsx)(`button`,{type:`button`,title:`More HTML actions`,"aria-label":`More HTML actions`,className:`${J} ml-auto md:ml-0`,children:(0,R.jsx)(i,{className:`size-4`})})}),(0,R.jsxs)(De,{align:`end`,className:`w-52`,children:[t===`edit`&&(0,R.jsxs)(P,{className:St,disabled:o||e.refreshing,onSelect:e.onReloadCode,children:[(0,R.jsx)(oe,{}),`Reload code from disk`]}),(0,R.jsxs)(P,{className:St,onSelect:()=>void Ee(e.projectName??``,e.filePath),children:[(0,R.jsx)(y,{}),`Download`]}),(0,R.jsx)(Pe,{}),(0,R.jsxs)(j,{className:Ct,checked:e.wordWrap,onCheckedChange:e.onToggleWordWrap,children:[(0,R.jsx)(g,{className:`size-4 text-muted-foreground`}),`Word wrap`]}),e.onToggleInlineBlame&&(0,R.jsxs)(j,{className:Ct,checked:e.inlineBlame,onCheckedChange:e.onToggleInlineBlame,children:[(0,R.jsx)(a,{className:`size-4 text-muted-foreground`}),`Inline blame`]}),e.onToggleLsp&&(0,R.jsxs)(j,{className:Ct,checked:e.lspEnabled,onCheckedChange:e.onToggleLsp,children:[(0,R.jsx)(u,{className:`size-4 text-muted-foreground`}),`Language server`]}),(0,R.jsxs)(ke,{children:[(0,R.jsxs)(F,{className:`${St} gap-2`,children:[(0,R.jsx)(m,{className:`size-4 text-muted-foreground`}),`Editor language`]}),(0,R.jsx)(A,{className:`max-h-80 overflow-y-auto`,children:(0,R.jsx)(k,{value:e.language,onValueChange:e.onLanguageChange,children:bt.map(e=>(0,R.jsx)(M,{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,L.useState)(t),[s,c]=(0,L.useState)(!1),[l,u]=(0,L.useState)(``),d=he(e=>e.activeProject),f=(0,L.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,L.useCallback)(e=>{let t=e.includes(`\\`)?`\\`:`/`;r(e.endsWith(t)?`${e}${a.trim()}`:`${e}${t}${a.trim()}`,n)},[a,n,r]);return s?(0,R.jsx)(Ne,{open:!0,mode:`folder`,root:d?.path,title:`Save "${a.trim()}" to...`,onSelect:p,onCancel:()=>c(!1)}):(0,R.jsx)(Ce,{open:e,onOpenChange:e=>{e||i()},children:(0,R.jsxs)(xe,{className:`sm:max-w-md`,children:[(0,R.jsx)(ye,{children:(0,R.jsx)(Se,{children:`Save As`})}),(0,R.jsxs)(`div`,{className:`flex flex-col gap-2 py-2`,children:[(0,R.jsx)(`label`,{className:`text-sm text-muted-foreground`,children:`Filename`}),(0,R.jsx)(O,{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,R.jsx)(`p`,{className:`text-xs text-destructive`,children:l})]}),(0,R.jsxs)(be,{children:[(0,R.jsx)(ve,{variant:`outline`,onClick:i,children:`Cancel`}),(0,R.jsx)(ve,{onClick:f,children:`Choose Folder...`})]})]})})}var Et=typeof window<`u`&&window.isSecureContext,Y=[`(`,`)`,`{`,`}`,`[`,`]`,`<`,`>`,`;`,`:`,`=`,`"`,`'`,"`",`/`,`\\`,`_`,`#`],X=`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,L.useCallback)(()=>e.current,[e]),a=(0,L.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,L.useState)(!1),u=(0,L.useRef)(null),d=(0,L.useCallback)(async()=>{try{let e=await navigator.clipboard.readText();e&&a(e)}catch{}},[a]),f=(0,L.useCallback)(()=>{l(!0),requestAnimationFrame(()=>u.current?.focus())},[]),p=(0,L.useCallback)(e=>{e.preventDefault();let t=e.clipboardData.getData(`text/plain`);t&&(l(!1),a(t))},[a]),ee=(0,L.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`undo`,null))},[i]),te=(0,L.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`redo`,null))},[i]),ne=(0,L.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`tab`,null))},[i]);return t?null:(0,R.jsxs)(`div`,{className:`shrink-0 border-t border-border bg-surface`,children:[!Et&&o&&(0,R.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1.5 border-b border-border bg-muted/50`,children:[(0,R.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,R.jsx)(`button`,{type:`button`,onClick:()=>l(!1),className:`p-1.5 rounded text-muted-foreground active:bg-muted transition-colors`,children:(0,R.jsx)(c,{size:14})})]}),(0,R.jsxs)(`div`,{className:`flex items-center gap-1 px-2 py-1.5 overflow-x-auto`,children:[(0,R.jsx)(`button`,{type:`button`,onClick:Et?d:f,className:X,title:`Paste`,children:(0,R.jsx)(h,{size:14})}),(0,R.jsx)(`button`,{type:`button`,onClick:ee,className:X,title:`Undo`,children:(0,R.jsx)(s,{size:14})}),(0,R.jsx)(`button`,{type:`button`,onClick:te,className:X,title:`Redo`,children:(0,R.jsx)(v,{size:14})}),(0,R.jsx)(`button`,{type:`button`,onClick:r,className:`${X} ${n?`text-primary`:``}`,title:n?`Wrapping long lines — tap to scroll sideways instead`:`Wrap long lines`,children:(0,R.jsx)(g,{size:14})}),(0,R.jsx)(`div`,{className:Ot}),(0,R.jsx)(`button`,{type:`button`,onClick:ne,className:Dt,children:`Tab`}),(0,R.jsx)(`div`,{className:Ot}),Y.map(e=>(0,R.jsx)(`button`,{type:`button`,onClick:()=>a(e),className:Dt,children:e},e))]})]})}var At=(0,L.lazy)(()=>w(()=>import(`./markdown-renderer-C33dsNJ_.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]))),jt=(0,L.lazy)(()=>w(()=>import(`./editor-language-service-DYBxZX66.js`).then(e=>({default:e.EditorLanguageService})),__vite__mapDeps([41,2,3,4,10,42,6,1,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]))),Mt=(0,L.lazy)(()=>w(()=>import(`./csv-preview-CYxznB1I.js`).then(e=>({default:e.CsvPreview})),__vite__mapDeps([43,2,6,1,3,4,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,44,45]))),Nt=(0,L.lazy)(()=>w(()=>import(`./image-preview-78Fguk1f.js`).then(e=>({default:e.ImagePreview})),__vite__mapDeps([46,3,2,4,10,47,20]))),Pt=(0,L.lazy)(()=>w(()=>import(`./pdf-preview-BWim6mu1.js`).then(e=>({default:e.PdfPreview})),__vite__mapDeps([48,2,3,4,10,20]))),Ft=(0,L.lazy)(()=>w(()=>import(`./video-preview-C48Go7JZ.js`).then(e=>({default:e.VideoPreview})),__vite__mapDeps([49,2,6,1,3,4,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,50,51]))),It=(0,L.lazy)(()=>w(()=>import(`./audio-preview-DXtE1Lpz.js`).then(e=>({default:e.AudioPreview})),__vite__mapDeps([52,2,3,4,8,10,20,51]))),Lt=(0,L.lazy)(()=>w(()=>import(`./docx-preview-C-UKGMXR.js`).then(e=>({default:e.DocxPreview})),__vite__mapDeps([53,2,3,4,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,L.memo)(function({metadata:e,tabId:t}){let n=e?.filePath,r=e?.projectName,i=e?.inlineContent,a=e?.inlineLanguage,[o,s]=(0,L.useState)(i??null),[c,l]=(0,L.useState)(`utf-8`),[u,d]=(0,L.useState)(!0),[p,re]=(0,L.useState)(null),[ie,oe]=(0,L.useState)(null),se=E(e=>e.activeTabId),[ce,le]=(0,L.useState)(0);(0,L.useEffect)(()=>{let e=()=>le(e=>e+1);return window.addEventListener(`ppm:onboarding-refresh`,e),()=>window.removeEventListener(`ppm:onboarding-refresh`,e)},[]);let[m,h]=(0,L.useState)(!1),g=(0,L.useRef)(null),_=(0,L.useRef)(``),v=(0,L.useRef)(null),[y,ue]=(0,L.useState)(null),{tabs:de,updateTab:x}=E(Me(e=>({tabs:e.tabs,updateTab:e.updateTab}))),{wordWrap:fe,toggleWordWrap:he,mobileWordWrap:D,toggleMobileWordWrap:ve}=C(Me(e=>({wordWrap:e.wordWrap,toggleWordWrap:e.toggleWordWrap,mobileWordWrap:e.mobileWordWrap,toggleMobileWordWrap:e.toggleMobileWordWrap}))),ye=C(e=>e.inlineBlame),be=C(e=>e.toggleInlineBlame),xe=C(e=>e.lspEnabled),Se=C(e=>e.setLspEnabled),Ce=ge(),we=Fe(),O=Ce?D:fe,Ee=Ce?ve:he,De=Le(),k=e?.isUntitled===!0,ke=e?.unsavedContent,[Ae,A]=(0,L.useState)(!1),j=de.find(e=>e.id===t),M=n?Rt(n):``,N=We.has(M),P=M===`pdf`,F=M===`docx`,Ne=Ue.has(M),I=Ke.has(M),Pe=Ge.has(M),Ve=M===`md`||M===`mdx`,Ze=(M===`html`||M===`htm`)&&!k&&i==null,[Qe,$e]=(0,L.useState)(`preview`),[et,tt]=(0,L.useState)(0),[nt,rt]=(0,L.useState)(!1),z=Ze&&Qe===`preview`,it=M===`csv`,at=e?.language,B=a??at??zt(n??``),V=B===`sql`,[ct,lt]=(0,L.useState)(`preview`),[ut,dt]=(0,L.useState)(`table`),{connections:ft,cachedTables:pt,refreshTables:mt,updateConnection:ht}=je(),H=n?`ppm:sql-conn:${n}`:t?`ppm:sql-conn:tab:${t}`:null,[U,gt]=(0,L.useState)(()=>{if(!H)return null;let e=localStorage.getItem(H);return e?Number(e):null}),W=(0,L.useRef)(null),G=(0,L.useRef)(null),K=(0,L.useMemo)(()=>ft.find(e=>e.id===U)??null,[ft,U]),q=i!=null&&(a===`json`||a===`xml`),[bt,J]=(0,L.useState)(!1),St=(0,L.useCallback)(()=>{if(i)if(bt)s(i),J(!1);else{let e=i.trimStart();if(a===`json`)try{s(JSON.stringify(JSON.parse(e),null,2)),J(!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
|
-
`)),J(!0)}}},[i,a,bt]),Ct=(0,L.useCallback)(e=>{gt(e),H&&localStorage.setItem(H,String(e)),mt(e).catch(()=>{})},[H,mt]),Et=(0,L.useCallback)(n=>{t&&x(t,{metadata:{...e,language:n}})},[t,e,x]),Y=(0,L.useMemo)(()=>{if(!V||!U)return;let e=(pt.get(U)??[]).map(e=>({name:e.tableName,schema:e.schemaName}));if(e.length!==0)return{tables:e,getColumns:async(e,t)=>S.get(`/api/db/connections/${U}/schema?table=${encodeURIComponent(e)}${t?`&schema=${encodeURIComponent(t)}`:``}`)}},[V,U,pt]);(0,L.useEffect)(()=>{if(!(!W.current||!Y))return G.current?.dispose(),Xe(),G.current=W.current.languages.registerCompletionItemProvider(`sql`,Je(W.current,Y)),()=>{G.current?.dispose()}},[Y]);let X=E(e=>e.openTab),[Dt,Ot]=(0,L.useState)(null),[At,Bt]=(0,L.useState)(null),[Vt,Gt]=(0,L.useState)(!1),[Kt,qt]=(0,L.useState)(``),Jt=(0,L.useCallback)(async e=>{if(K){Gt(!0),Bt(null),qt(e);try{Ot(await S.post(`/api/db/connections/${K.id}/query`,{sql:e}))}catch(e){Bt(e.message),Ot(null)}finally{Gt(!1)}}},[K]),Yt=(0,L.useCallback)(()=>{!K||!Kt||X({type:`database`,title:`${K.name} · Query`,projectId:null,closable:!0,metadata:{connectionId:K.id,connectionName:K.name,dbType:K.type,initialSql:Kt}})},[K,X,Kt]),Xt=(0,L.useCallback)(()=>{if(!v.current||!K)return;let e=v.current,t=e.getSelection();Jt(t&&!t.isEmpty()?e.getModel()?.getValueInRange(t)??e.getValue():e.getValue())},[K,Jt]),Zt=typeof window<`u`&&`ontouchstart`in window,Qt=(0,L.useRef)(null),[$t,en]=(0,L.useState)(null);(0,L.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,L.useEffect)(()=>Ie(Qt.current,()=>v.current?.layout()),[u,p]);let Z=(0,L.useRef)([]),tn=(0,L.useRef)(Jt);tn.current=Jt,(0,L.useEffect)(()=>()=>{Z.current.forEach(e=>e.dispose()),Z.current=[]},[]),(0,L.useEffect)(()=>{Pe&&t&&x(t,{type:`sqlite`})},[Pe,t,x]);let Q=n?/^(\/|[A-Za-z]:[/\\])/.test(n):!1;(0,L.useEffect)(()=>{if(!r||!n||!t||se!==t||u||p||!y||ie!==`${r}:${n}`||i!=null||k||Pe||c===`base64`||z||N||P||F||Ne||I||Ve&&ct===`preview`||it&&ut===`table`)return;let e=y.editor.getDomNode(),a=!!e?.isConnected&&!!e.checkVisibility({checkOpacity:!0,checkVisibilityCSS:!0});a&&Oe({type:`file-ready`,projectName:r,tabId:t,visible:a,isRunDocument:/^(readme(?:\..*)?|package\.json)$/i.test(T(n))})},[ce,r,n,t,se,u,p,y,ie,i,k,Pe,c,N,P,F,Ne,I,Ve,ct,it,ut,z]),(0,L.useEffect)(()=>{if(i!=null){d(!1);return}if(k){s(ke??``),_.current=ke??``,d(!1),ke&&h(!0);return}if(!n||!Q&&!r)return;if(N||P||F||Ne||I){d(!1);return}d(!0),re(null),oe(null);let e=!1,t=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${pe(r)}/files/read?path=${encodeURIComponent(n)}`;return S.get(t).then(t=>{e||(s(t.content),l(t.encoding??`utf-8`),oe(`${r}:${n}`),_.current=t.content,d(!1))}).catch(t=>{e||(re(t instanceof Error?t.message:`Failed to load file`),d(!1))}),()=>{e=!0,g.current&&clearTimeout(g.current)}},[n,r,N,P,F,Q,k]);let[nn,rn]=(0,L.useState)(!1),an=(0,L.useCallback)(()=>{if(!n||i!=null||k||!Q&&!r)return;let e=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${pe(r)}/files/read?path=${encodeURIComponent(n)}`;rn(!0),S.get(e).then(e=>{s(e.content),_.current=e.content,e.encoding&&l(e.encoding),h(!1),re(null)}).catch(e=>re(e instanceof Error?e.message:`Failed to reload file`)).finally(()=>rn(!1))},[n,r,Q,i,k]),on=(0,L.useRef)(m);on.current=m,(0,L.useEffect)(()=>{if(!n||!r||i!=null||k)return;let e=e=>{let t=e.detail;if(t.projectName!==r||t.path!==n||on.current)return;let i=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${pe(r)}/files/read?path=${encodeURIComponent(n)}`;S.get(i).then(e=>{e.content!==_.current&&(s(e.content),_.current=e.content,e.encoding&&l(e.encoding))}).catch(()=>{})};return window.addEventListener(`file:changed`,e),()=>window.removeEventListener(`file:changed`,e)},[n,r,Q,i,k]),(0,L.useEffect)(()=>{if(!j||i!=null)return;let t=k?`Untitled-${e?.untitledNumber??1}`:n?T(n):`Untitled`,r=m?`${t} \u25CF`:t;j.title!==r&&x(j.id,{title:r})},[m]);let sn=!k&&i==null&&!!n&&!!r&&!Ce,cn=Be({editor:y?.editor??null,monaco:y?.monaco??null,projectName:r,filePath:sn?n:void 0,enabled:ye&&sn}),ln=!k&&!Q&&i==null&&!!n&&!!r,un=xe&&!we,dn=un&&ln&&!z,[fn,pn]=(0,L.useState)({status:null,diagnostics:[]}),mn=(0,L.useCallback)(e=>pn(e),[]),hn=(0,L.useCallback)(async e=>{if(n&&!(!Q&&!r))try{Q?await S.put(`/api/fs/write`,{path:n,content:e}):await S.put(`${pe(r)}/files/write`,{path:n,content:e}),h(!1),cn.refresh(),dn&&r&&n&&w(()=>import(`./use-lsp-
|
|
5
|
+
`)),J(!0)}}},[i,a,bt]),Ct=(0,L.useCallback)(e=>{gt(e),H&&localStorage.setItem(H,String(e)),mt(e).catch(()=>{})},[H,mt]),Et=(0,L.useCallback)(n=>{t&&x(t,{metadata:{...e,language:n}})},[t,e,x]),Y=(0,L.useMemo)(()=>{if(!V||!U)return;let e=(pt.get(U)??[]).map(e=>({name:e.tableName,schema:e.schemaName}));if(e.length!==0)return{tables:e,getColumns:async(e,t)=>S.get(`/api/db/connections/${U}/schema?table=${encodeURIComponent(e)}${t?`&schema=${encodeURIComponent(t)}`:``}`)}},[V,U,pt]);(0,L.useEffect)(()=>{if(!(!W.current||!Y))return G.current?.dispose(),Xe(),G.current=W.current.languages.registerCompletionItemProvider(`sql`,Je(W.current,Y)),()=>{G.current?.dispose()}},[Y]);let X=E(e=>e.openTab),[Dt,Ot]=(0,L.useState)(null),[At,Bt]=(0,L.useState)(null),[Vt,Gt]=(0,L.useState)(!1),[Kt,qt]=(0,L.useState)(``),Jt=(0,L.useCallback)(async e=>{if(K){Gt(!0),Bt(null),qt(e);try{Ot(await S.post(`/api/db/connections/${K.id}/query`,{sql:e}))}catch(e){Bt(e.message),Ot(null)}finally{Gt(!1)}}},[K]),Yt=(0,L.useCallback)(()=>{!K||!Kt||X({type:`database`,title:`${K.name} · Query`,projectId:null,closable:!0,metadata:{connectionId:K.id,connectionName:K.name,dbType:K.type,initialSql:Kt}})},[K,X,Kt]),Xt=(0,L.useCallback)(()=>{if(!v.current||!K)return;let e=v.current,t=e.getSelection();Jt(t&&!t.isEmpty()?e.getModel()?.getValueInRange(t)??e.getValue():e.getValue())},[K,Jt]),Zt=typeof window<`u`&&`ontouchstart`in window,Qt=(0,L.useRef)(null),[$t,en]=(0,L.useState)(null);(0,L.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,L.useEffect)(()=>Ie(Qt.current,()=>v.current?.layout()),[u,p]);let Z=(0,L.useRef)([]),tn=(0,L.useRef)(Jt);tn.current=Jt,(0,L.useEffect)(()=>()=>{Z.current.forEach(e=>e.dispose()),Z.current=[]},[]),(0,L.useEffect)(()=>{Pe&&t&&x(t,{type:`sqlite`})},[Pe,t,x]);let Q=n?/^(\/|[A-Za-z]:[/\\])/.test(n):!1;(0,L.useEffect)(()=>{if(!r||!n||!t||se!==t||u||p||!y||ie!==`${r}:${n}`||i!=null||k||Pe||c===`base64`||z||N||P||F||Ne||I||Ve&&ct===`preview`||it&&ut===`table`)return;let e=y.editor.getDomNode(),a=!!e?.isConnected&&!!e.checkVisibility({checkOpacity:!0,checkVisibilityCSS:!0});a&&Oe({type:`file-ready`,projectName:r,tabId:t,visible:a,isRunDocument:/^(readme(?:\..*)?|package\.json)$/i.test(T(n))})},[ce,r,n,t,se,u,p,y,ie,i,k,Pe,c,N,P,F,Ne,I,Ve,ct,it,ut,z]),(0,L.useEffect)(()=>{if(i!=null){d(!1);return}if(k){s(ke??``),_.current=ke??``,d(!1),ke&&h(!0);return}if(!n||!Q&&!r)return;if(N||P||F||Ne||I){d(!1);return}d(!0),re(null),oe(null);let e=!1,t=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${pe(r)}/files/read?path=${encodeURIComponent(n)}`;return S.get(t).then(t=>{e||(s(t.content),l(t.encoding??`utf-8`),oe(`${r}:${n}`),_.current=t.content,d(!1))}).catch(t=>{e||(re(t instanceof Error?t.message:`Failed to load file`),d(!1))}),()=>{e=!0,g.current&&clearTimeout(g.current)}},[n,r,N,P,F,Q,k]);let[nn,rn]=(0,L.useState)(!1),an=(0,L.useCallback)(()=>{if(!n||i!=null||k||!Q&&!r)return;let e=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${pe(r)}/files/read?path=${encodeURIComponent(n)}`;rn(!0),S.get(e).then(e=>{s(e.content),_.current=e.content,e.encoding&&l(e.encoding),h(!1),re(null)}).catch(e=>re(e instanceof Error?e.message:`Failed to reload file`)).finally(()=>rn(!1))},[n,r,Q,i,k]),on=(0,L.useRef)(m);on.current=m,(0,L.useEffect)(()=>{if(!n||!r||i!=null||k)return;let e=e=>{let t=e.detail;if(t.projectName!==r||t.path!==n||on.current)return;let i=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${pe(r)}/files/read?path=${encodeURIComponent(n)}`;S.get(i).then(e=>{e.content!==_.current&&(s(e.content),_.current=e.content,e.encoding&&l(e.encoding))}).catch(()=>{})};return window.addEventListener(`file:changed`,e),()=>window.removeEventListener(`file:changed`,e)},[n,r,Q,i,k]),(0,L.useEffect)(()=>{if(!j||i!=null)return;let t=k?`Untitled-${e?.untitledNumber??1}`:n?T(n):`Untitled`,r=m?`${t} \u25CF`:t;j.title!==r&&x(j.id,{title:r})},[m]);let sn=!k&&i==null&&!!n&&!!r&&!Ce,cn=Be({editor:y?.editor??null,monaco:y?.monaco??null,projectName:r,filePath:sn?n:void 0,enabled:ye&&sn}),ln=!k&&!Q&&i==null&&!!n&&!!r,un=xe&&!we,dn=un&&ln&&!z,[fn,pn]=(0,L.useState)({status:null,diagnostics:[]}),mn=(0,L.useCallback)(e=>pn(e),[]),hn=(0,L.useCallback)(async e=>{if(n&&!(!Q&&!r))try{Q?await S.put(`/api/fs/write`,{path:n,content:e}):await S.put(`${pe(r)}/files/write`,{path:n,content:e}),h(!1),cn.refresh(),dn&&r&&n&&w(()=>import(`./use-lsp-DK26Eter.js`).then(t=>t.notifyLspSave(r,n,e)),__vite__mapDeps([42,2,6,1,3,4,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]))}catch{}},[n,r,Q,dn,cn.refresh]);function gn(n){let r=n??``;s(r),_.current=r,h(!0),g.current&&clearTimeout(g.current),k?g.current=setTimeout(()=>{t&&x(t,{metadata:{...e,unsavedContent:_.current}})},2e3):g.current=setTimeout(()=>hn(_.current),1e3)}let _n=(0,L.useCallback)(async(e,n)=>{try{if(g.current&&clearTimeout(g.current),await S.put(`/api/fs/write`,{path:e,content:n}),t){let{closeTab:n,openTab:r}=me.getState();n(t),r({type:`editor`,title:T(e),projectId:null,metadata:{filePath:e},closable:!0})}h(!1),A(!1)}catch{}},[t]),$=e?.lineNumber,vn=e?.endLine,yn=e?.revealAt,bn=(0,L.useCallback)(()=>{let e=v.current;if(!(!e||!$||$<=0)){if(e.revealLineInCenter($),e.setPosition({lineNumber:$,column:1}),vn&&vn>=$){let t=e.getModel(),n=t?.getLineCount()??$,r=Math.min(vn,n),i=t?.getLineMaxColumn(r)??1;e.setSelection({startLineNumber:$,startColumn:1,endLineNumber:r,endColumn:i})}e.focus()}},[$,vn]);(0,L.useEffect)(()=>{yn!=null&&bn()},[yn,bn]),(0,L.useEffect)(()=>{let e=y?.monaco;e&&ot(un,e.languages.typescript.typescriptDefaults,e.languages.typescript.javascriptDefaults)},[y,un]);let xn=(0,L.useCallback)((e,t)=>{if(v.current=e,W.current=t,ue({editor:e,monaco:t}),$&&$>0&&setTimeout(()=>bn(),100),k&&e.addCommand(t.KeyMod.CtrlCmd|t.KeyCode.KeyS,()=>A(!0)),e.addCommand(t.KeyMod.Alt|t.KeyCode.KeyZ,()=>{let e=C.getState();_e()?e.toggleMobileWordWrap():e.toggleWordWrap()}),e.addCommand(t.KeyMod.Alt|t.KeyCode.KeyB,()=>C.getState().toggleInlineBlame()),Y&&(G.current?.dispose(),G.current=t.languages.registerCompletionItemProvider(`sql`,Je(t,Y))),V){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&&tn.current(n)}}),Z.current.forEach(e=>e.dispose()),Z.current=[];let n=e.getModel(),r=e.addCommand(0,(e,t)=>{t&&tn.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:()=>{}}}});Z.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}});Z.current.push(i)}}},[Y,V]);if(!i&&!k&&(!n||!Q&&!r))return(0,R.jsx)(`div`,{className:`flex items-center justify-center h-full text-text-secondary text-sm`,children:`No file selected.`});if(u)return(0,R.jsxs)(`div`,{className:`flex items-center justify-center h-full gap-2 text-text-secondary`,children:[(0,R.jsx)(b,{className:`size-5 animate-spin`}),(0,R.jsx)(`span`,{className:`text-sm`,children:`Loading file...`})]});if(p)return(0,R.jsx)(`div`,{className:`flex items-center justify-center h-full text-error text-sm`,children:p});if(N)return(0,R.jsx)(L.Suspense,{fallback:(0,R.jsx)(Ut,{}),children:(0,R.jsx)(Nt,{filePath:n,projectName:r})});if(P)return(0,R.jsx)(L.Suspense,{fallback:(0,R.jsx)(Ut,{}),children:(0,R.jsx)(Pt,{filePath:n,projectName:r})});if(F)return(0,R.jsx)(L.Suspense,{fallback:(0,R.jsx)(Ut,{}),children:(0,R.jsx)(Lt,{filePath:n,projectName:r})});if(Ne)return(0,R.jsx)(L.Suspense,{fallback:(0,R.jsx)(Ut,{}),children:(0,R.jsx)(Ft,{filePath:n,projectName:r})});if(I)return(0,R.jsx)(L.Suspense,{fallback:(0,R.jsx)(Ut,{}),children:(0,R.jsx)(It,{filePath:n,projectName:r})});if(c===`base64`)return(0,R.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-text-secondary`,children:[(0,R.jsx)(ne,{className:`size-10 text-text-subtle`}),(0,R.jsx)(`p`,{className:`text-sm`,children:`This file is a binary format and cannot be displayed.`}),(0,R.jsx)(`p`,{className:`text-xs text-text-subtle`,children:n})]});let Sn=V?(0,R.jsxs)(`div`,{className:`shrink-0 flex items-center gap-1 px-2 border-l border-border`,children:[(0,R.jsx)(te,{className:`size-3 text-muted-foreground`}),(0,R.jsxs)(`select`,{value:U??``,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,R.jsx)(`option`,{value:``,children:`Connection…`}),ft.map(e=>(0,R.jsx)(`option`,{value:e.id,children:e.name},e.id))]}),(0,R.jsx)(`button`,{type:`button`,onClick:Xt,disabled:!K,className:`p-0.5 rounded text-muted-foreground hover:text-primary disabled:opacity-30 transition-colors`,title:`Run SQL`,children:(0,R.jsx)(f,{className:`size-3.5`})}),K&&(0,R.jsx)(`button`,{type:`button`,onClick:()=>ht(K.id,{readonly:K.readonly?0:1}),className:`flex items-center gap-0.5 px-1 py-0.5 rounded text-[10px] transition-colors ${K.readonly?`text-muted-foreground hover:text-foreground`:`bg-destructive/15 text-destructive`}`,title:K.readonly?`Readonly — click to allow writes`:`WRITE mode — click to enable readonly`,children:K.readonly?(0,R.jsx)(ae,{className:`size-3`}):(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(ee,{className:`size-3`}),(0,R.jsx)(`span`,{className:`font-medium`,children:`WRITE`})]})})]}):null;return(0,R.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:[dn&&y&&n&&r&&(0,R.jsx)(L.Suspense,{fallback:null,children:(0,R.jsx)(jt,{editor:y.editor,monaco:y.monaco,projectName:r,filePath:n,onState:mn})}),i!=null&&q&&(0,R.jsx)(`div`,{className:`flex items-center h-7 border-b border-border bg-background shrink-0 px-2 gap-2`,children:(0,R.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,R.jsxs)(`div`,{className:`hidden md:flex items-center h-7 border-b border-border bg-background shrink-0`,children:[(0,R.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`}),ln&&!we&&(0,R.jsx)(st,{enabled:un,onToggle:Se,status:fn.status,diagnostics:fn.diagnostics}),(0,R.jsx)(xt,{value:B,onChange:Et}),Sn,(0,R.jsx)(vt,{ext:M,mdMode:ct,onMdModeChange:lt,csvMode:ut,onCsvModeChange:dt,wordWrap:O,onToggleWordWrap:Ee,inlineBlame:ye,onToggleInlineBlame:sn?be:void 0,blameStale:cn.stale,onRefresh:an,refreshing:nn,filePath:n,projectName:r,className:`shrink-0 flex items-center gap-1 px-2`})]}),!Ze&&i==null&&t&&(k||n&&!r)&&(0,R.jsxs)(`div`,{className:`hidden md:flex items-center h-7 border-b border-border bg-background shrink-0 px-2`,children:[(0,R.jsx)(`span`,{className:`text-xs text-muted-foreground truncate flex-1`,children:k?`Untitled-${e?.untitledNumber??1}`:n?T(n):`Untitled`}),(0,R.jsx)(xt,{value:B,onChange:Et}),Sn]}),Ze&&n&&(0,R.jsx)(wt,{mode:Qe,onModeChange:e=>{e===`edit`&&rt(!0),$e(e)},onRefresh:()=>{$e(`preview`),tt(e=>e+1)},unsaved:m,onReloadCode:an,refreshing:nn,breadcrumb:r&&t?(0,R.jsx)(_t,{filePath:n,projectName:r,tabId:t,className:`flex items-center min-w-0 overflow-x-auto scrollbar-none gap-0.5`}):(0,R.jsx)(`span`,{className:`truncate text-xs text-muted-foreground`,children:T(n)}),filePath:n,projectName:r,wordWrap:O,onToggleWordWrap:Ee,inlineBlame:ye,onToggleInlineBlame:sn?be:void 0,language:B,onLanguageChange:Et,lspEnabled:un,onToggleLsp:ln&&!we?Se:void 0}),z&&n&&(0,R.jsx)(yt,{filePath:n,projectName:r,revision:et}),z&&!nt?null:it&&ut===`table`?(0,R.jsx)(L.Suspense,{fallback:(0,R.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,R.jsx)(b,{className:`size-5 animate-spin text-text-subtle`})}),children:(0,R.jsx)(Mt,{content:o??``,onContentChange:gn,wordWrap:O})}):Ve&&ct===`preview`?(0,R.jsx)(Wt,{content:o??``,projectName:r,filePath:n,tabId:t,ready:!u&&!p&&ie===`${r}:${n}`&&i==null&&!k}):(0,R.jsx)(`div`,{className:z?`hidden`:`flex-1 overflow-hidden min-h-0`,children:(0,R.jsx)(Te,{height:`100%`,language:B,beforeMount:He,value:o??``,onChange:i==null?gn:void 0,onMount:xn,theme:De,options:{fontSize:14,fontFamily:ze,fontLigatures:Re,wordWrap:O?`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,R.jsx)(b,{className:`size-5 animate-spin text-text-subtle`})},B)}),V&&(Dt||At||Vt)&&(0,R.jsx)(Ht,{result:Dt,error:At,loading:Vt,connName:K?.name,onClose:()=>{Ot(null),Bt(null),Gt(!1)},onOpenInTab:Yt}),Zt&&!z&&(0,R.jsx)(kt,{editorRef:v,readOnly:i!=null,wrapOn:O,onToggleWrap:Ee}),Ae&&(0,R.jsx)(Tt,{open:Ae,defaultName:`Untitled-${e?.untitledNumber??1}`,content:_.current,onSave:_n,onCancel:()=>A(!1)})]})}),Vt=()=>{};function Ht({result:e,error:t,loading:n,connName:r,onClose:i,onOpenInTab:a}){let o=(0,L.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,L.useMemo)(()=>(e?.columns??[]).map(e=>({name:e,type:`text`,nullable:!0,pk:!1,defaultValue:null})),[e?.columns]),[u,d]=(0,L.useState)(250),f=(0,L.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,R.jsxs)(`div`,{className:`shrink-0 border-t border-border flex flex-col`,style:{height:u},children:[(0,R.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,R.jsx)(l,{className:`size-3 text-muted-foreground/50`})}),(0,R.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1 bg-muted/50 border-b border-border shrink-0`,children:[(0,R.jsx)(te,{className:`size-3 text-muted-foreground`}),(0,R.jsxs)(`span`,{className:`text-xs font-medium text-foreground truncate flex-1`,children:[r?`${r} · Results`:`Query Results`,e?.executionTimeMs!=null&&(0,R.jsxs)(`span`,{className:`text-muted-foreground ml-1.5 font-normal`,children:[e.executionTimeMs,`ms`]})]}),(0,R.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,R.jsx)(re,{className:`size-3`}),(0,R.jsx)(`span`,{className:`hidden sm:inline`,children:`Open in Tab`})]}),(0,R.jsx)(`button`,{type:`button`,onClick:i,title:`Close results`,className:`p-0.5 rounded text-muted-foreground hover:text-foreground transition-colors`,children:(0,R.jsx)(c,{className:`size-3`})})]}),(0,R.jsxs)(`div`,{className:`flex-1 overflow-hidden min-h-0`,children:[n&&(0,R.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,R.jsx)(b,{className:`size-4 animate-spin text-muted-foreground`})}),t&&(0,R.jsx)(`div`,{className:`px-3 py-2 text-xs text-destructive bg-destructive/5`,children:t}),e?.changeType===`modify`&&(0,R.jsxs)(`div`,{className:`px-3 py-2 text-xs text-success`,children:[e.rowsAffected,` row(s) affected`]}),o&&(0,R.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,R.jsx)(`div`,{className:`px-3 py-2 text-xs text-muted-foreground`,children:`No results`})]})]})}function Ut(){return(0,R.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,R.jsx)(b,{className:`size-5 animate-spin text-text-subtle`})})}function Wt({content:e,...t}){return(0,R.jsx)(L.Suspense,{fallback:(0,R.jsx)(`div`,{className:`animate-pulse h-4 bg-muted rounded m-4`}),children:(0,R.jsx)($e,{...t,children:(0,R.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,ct as c,ir as l,lt as u,st as d,un as f}from"./icons-CO_II6D-.js";import{n as p,r as m}from"./api-client-c8YOpTlT.js";import{t as h}from"./button-CBehaXpV.js";import{a as g,i as _,n as v,o as y,r as b,t as x}from"./dialog-tzBRkGeW.js";import{t as S}from"./input-CP31LZnN.js";import{Qn as C,Xn as w,Zn as T,dt as E,yt as D}from"./index-CvUGUp7d.js";import{c as O,h as k,i as A,l as j,s as M,t as N,u as P}from"./api-settings-0s1Rfgcu.js";function F(e){return e>=90?`text-error`:e>=70?`text-warning`:`text-success`}function I(e){return e>=90?`bg-error`:e>=70?`bg-warning`:`bg-success`}function L(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 R(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 ee(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 z(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 B(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 V=n();function H({label:e,pct:t,reset:n,resetsAt:r}){let i=R(r);return(0,V.jsxs)(`div`,{className:`space-y-1`,"data-testid":`account-usage-bar`,children:[(0,V.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,V.jsx)(`span`,{className:`text-xs font-medium text-text-primary`,children:e}),n&&(0,V.jsxs)(w,{children:[(0,V.jsx)(C,{asChild:!0,children:(0,V.jsxs)(`span`,{className:`text-[10px] text-text-subtle cursor-default`,children:[`↻ `,n]})}),(0,V.jsx)(T,{side:`top`,children:i?`Resets ${i}`:`Resets in`})]})]}),(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)(`div`,{className:`flex-1 h-2 rounded-full bg-border overflow-hidden`,children:t!=null&&(0,V.jsx)(`div`,{className:`h-full rounded-full transition-all ${I(t)}`,style:{width:`${Math.min(t,100)}%`}})}),(0,V.jsx)(`span`,{className:`text-xs font-medium tabular-nums w-10 text-right ${t==null?`text-text-subtle`:F(t)}`,children:t==null?`—`:`${t}%`})]})]})}function U({label:e,bucket:t}){return t?(0,V.jsx)(H,{label:e,pct:Math.round(t.utilization*100),reset:L(t),resetsAt:t.resetsAt}):null}function W({hint:e,className:t,children:n,onClick:r}){return(0,V.jsxs)(w,{children:[(0,V.jsx)(C,{asChild:!0,children:(0,V.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,V.jsx)(T,{side:`top`,className:`max-w-[260px] text-xs leading-relaxed`,children:e})]})}function G({description:e,onRefresh:t,refreshing:n,disabled:r,actions:i}){return(0,V.jsxs)(`section`,{className:`space-y-2`,children:[(0,V.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,V.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e}),(0,V.jsx)(h,{variant:`ghost`,size:`icon`,className:`size-8 shrink-0 cursor-pointer`,onClick:t,disabled:r||n,title:`Refresh`,"aria-label":`Refresh accounts`,children:(0,V.jsx)(l,{className:`size-4 ${n?`animate-spin`:``}`})})]}),(0,V.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:i})]})}function K({message:e,onDismiss:t}){return e?(0,V.jsxs)(`div`,{className:`flex items-start gap-2 text-xs p-2 rounded bg-muted`,role:`status`,children:[(0,V.jsx)(`span`,{className:`flex-1`,children:e}),(0,V.jsx)(`button`,{onClick:t,className:`shrink-0 text-muted-foreground hover:text-foreground cursor-pointer`,"aria-label":`Dismiss message`,children:(0,V.jsx)(i,{className:`size-3.5`})})]}):null}function q({children:e}){return(0,V.jsx)(`div`,{className:`flex gap-2 overflow-x-auto pb-1 -mx-1 px-1 snap-x snap-mandatory scrollbar-thin`,children:e})}function J({active:e,flash:t,dense:n,children:r,...i}){return(0,V.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})}var Y={readOnly:`min-w-[220px]`,withActions:`min-w-[300px]`};function X({entry:e,isActive:t,accountInfo:n,onToggle:r,toggling:i,onDelete:c,onExport:f,onViewProfile:p,flash:m,onSelect:h,unselectableReason:g,selecting:_,planLabel:v,dailyGuard:y,onDailyGuardToggle:b,dailyGuardToggling:x,reauthHint:S,onReauth:D,layout:O=`list`}){let{usage:k}=e,A=k.session||k.weekly||k.weeklyOpus||k.weeklySonnet,j=n?.status??e.accountStatus,M=!!(n&&!n.hasRefreshToken&&n.expiresAt&&n.expiresAt<Math.floor(Date.now()/1e3)),N=z(n),P=!!n?.reauthRequired||!!S,F=n?.grantExpiresAt?n.grantExpiresAt*1e3:null,I=!!F&&F-Date.now()<5*864e5,L=!!n&&(N.label===`temp`||N.label===`unknown`||N.label===`expired`&&!M&&!P),R=F?new Date(F).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):null,H=!!(r||c||f||p),G=M?`Token expired — sign in again`:P?`Sign in again to use this account`:g??null,K=O===`list`?``:O===`grid`?`flex flex-col justify-evenly overflow-hidden min-h-0`:`shrink-0 snap-start ${H?Y.withActions:Y.readOnly}`;return(0,V.jsxs)(J,{active:t,flash:m,dense:O!==`list`,className:[K,M||P?`opacity-50`:``].filter(Boolean).join(` `)||void 0,"data-testid":`account-card`,"data-account-id":e.accountId,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)(`span`,{className:`text-sm font-medium truncate flex-1 min-w-0`,children:e.accountLabel??e.accountId.slice(0,8)}),t&&(0,V.jsx)(W,{className:`text-[10px] text-primary shrink-0 font-medium`,hint:`The next turn will run on this account.`,children:`Active`}),h&&!t&&(0,V.jsxs)(w,{children:[(0,V.jsx)(C,{asChild:!0,children:(0,V.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`,G?`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,V.jsx)(T,{side:`top`,children:G??`Use this account for this chat`})]}),M&&(0,V.jsx)(W,{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:D?()=>D(e.accountId):void 0,children:`Expired`}),P&&!M&&(0,V.jsx)(W,{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:D?()=>D(e.accountId):void 0,children:`Sign in again`}),!e.isOAuth&&!M&&(0,V.jsx)(W,{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,V.jsx)(W,{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,V.jsxs)(`div`,{className:`flex items-center gap-0.5 shrink-0`,children:[!M&&p&&n?.profileData&&(0,V.jsxs)(w,{children:[(0,V.jsx)(C,{asChild:!0,children:(0,V.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,V.jsx)(u,{className:`size-4`})})}),(0,V.jsx)(T,{side:`top`,children:`View profile`})]}),!M&&f&&e.isOAuth&&(0,V.jsxs)(w,{children:[(0,V.jsx)(C,{asChild:!0,children:(0,V.jsx)(`button`,{className:`p-2 rounded cursor-pointer text-text-subtle hover:text-primary hover:bg-surface-elevated transition-colors`,onClick:()=>f(e.accountId),"aria-label":`Export this account`,children:(0,V.jsx)(d,{className:`size-4`})})}),(0,V.jsx)(T,{side:`top`,children:`Export this account`})]}),!M&&r&&(0,V.jsx)(E,{checked:j!==`disabled`,onCheckedChange:()=>r(e.accountId,j),disabled:i||j===`cooldown`,"aria-label":j===`disabled`?`Enable account`:`Disable account`,className:`cursor-pointer`}),c&&(0,V.jsxs)(w,{children:[(0,V.jsx)(C,{asChild:!0,children:(0,V.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,V.jsx)(a,{className:`size-4`})})}),(0,V.jsx)(T,{side:`top`,children:`Remove account`})]})]})]}),A?(0,V.jsxs)(`div`,{className:`space-y-2`,children:[(0,V.jsx)(U,{label:`5-Hour Session`,bucket:k.session}),(0,V.jsx)(U,{label:`Weekly`,bucket:k.weekly}),(0,V.jsx)(U,{label:`Weekly (Opus)`,bucket:k.weeklyOpus}),(0,V.jsx)(U,{label:`Weekly (Sonnet)`,bucket:k.weeklySonnet})]}):(0,V.jsx)(`p`,{className:`text-xs text-text-subtle`,children:e.isOAuth?`No usage data yet`:`Usage tracking not available for API keys`}),y&&(0,V.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,V.jsxs)(`div`,{className:`min-w-0 space-y-0.5`,children:[(0,V.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,V.jsx)(`span`,{children:`Daily guard`}),(0,V.jsxs)(w,{children:[(0,V.jsx)(C,{asChild:!0,children:(0,V.jsx)(`button`,{type:`button`,"aria-label":`About Daily guard`,className:`text-text-subtle hover:text-text-primary cursor-help`,children:(0,V.jsx)(o,{className:`size-3.5`})})}),(0,V.jsx)(T,{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,V.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,V.jsx)(E,{checked:y.enabled,onCheckedChange:b,disabled:x,"aria-label":y.enabled?`Disable Daily guard`:`Enable Daily guard`,className:`cursor-pointer shrink-0`})]}),(0,V.jsxs)(`div`,{className:`flex items-center gap-2 text-[10px] text-text-subtle flex-wrap`,children:[k.lastFetchedAt&&(0,V.jsxs)(W,{className:`inline-flex items-center gap-1`,hint:`Usage last read from Anthropic on ${new Date(k.lastFetchedAt).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})}. The bars above are only as current as this.`,children:[(0,V.jsx)(l,{className:`size-3 shrink-0`,"aria-hidden":!0}),B(new Date(k.lastFetchedAt).getTime())]}),F&&!P&&(0,V.jsxs)(W,{className:[`inline-flex items-center gap-1`,I?`text-warning`:``].filter(Boolean).join(` `),hint:`Sign-in stops working on ${R}. 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,V.jsx)(s,{className:`size-3 shrink-0`,"aria-hidden":!0}),`sign-in `,ee(F)]}),L&&(0,V.jsxs)(W,{className:N.color,hint:N.tip,children:[`© `,N.label]})]})]})}var Z=e(t(),1);function Q(e){let t=e.usage;return[t.session?.utilization,t.weekly?.utilization,t.weeklyOpus?.utilization,t.weeklySonnet?.utilization].join(`|`)}function $(e=!0){let[t,n]=(0,Z.useState)([]),[r,i]=(0,Z.useState)([]),[a,o]=(0,Z.useState)(null),[s,c]=(0,Z.useState)(!0),[l,u]=(0,Z.useState)(!1),[d,f]=(0,Z.useState)(new Set),[p,m]=(0,Z.useState)(null),h=(0,Z.useRef)([]),g=(0,Z.useRef)(void 0),_=(0,Z.useCallback)(async()=>{let e=h.current.length>0;e?u(!0):c(!0);let[t,r,a]=await Promise.allSettled([j(),M(),O()]);if(t.status===`fulfilled`){let r=t.value;if(e){let e=new Map(h.current.map(e=>[e.accountId,Q(e)])),t=new Set(r.filter(t=>e.get(t.accountId)!==Q(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,Z.useCallback)(async(e,t)=>{m(e);let n=null;try{await k(e,{status:t===`disabled`?`active`:`disabled`})}catch(e){n=e.message}return m(null),await _(),n},[_]);return(0,Z.useEffect)(()=>(e&&_(),()=>clearTimeout(g.current)),[e,_]),{usages:t,accounts:r,activeAccountId:a,initialLoading:s,refreshing:l,flashIds:d,reload:_,toggle:v,togglingId:p}}function te({open:e,onOpenChange:t,onSuccess:n,signInAgainFor:r}){let[i,a]=(0,Z.useState)(``),[o,s]=(0,Z.useState)(``),[c,l]=(0,Z.useState)(!1),[u,d]=(0,Z.useState)(null),[p,m]=(0,Z.useState)(null),[C,w]=(0,Z.useState)(``),[T,E]=(0,Z.useState)(!1),[O,k]=(0,Z.useState)(`idle`);function j(){m(null),w(``),k(`idle`),d(null)}function M(){t(!1),j(),a(``),s(``),d(null)}async function F(){E(!0),d(null);try{let{url:e,state:t}=await P();m(t),k(`waiting`),window.open(e,`_blank`)}catch(e){d(e.message)}E(!1)}async function I(){if(!(!C.trim()||!p)){E(!0),d(null);try{let e=C.trim();e.includes(`#`)&&(e=e.split(`#`)[0]??e);let t=await A(e,p);M(),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 L(){if(i.trim()){l(!0),d(null);try{let e=await N({apiKey:i.trim(),label:o.trim()||void 0});M(),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,V.jsx)(x,{open:e,onOpenChange:e=>{e||M()},children:(0,V.jsxs)(v,{className:`sm:max-w-md`,children:[(0,V.jsxs)(g,{children:[(0,V.jsx)(y,{className:`text-sm`,children:r?`Sign in again — ${r}`:`Add Claude Account`}),(0,V.jsx)(b,{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,V.jsxs)(`div`,{className:`space-y-3`,children:[(0,V.jsxs)(`div`,{className:`rounded-md border p-3 space-y-2`,children:[(0,V.jsx)(`p`,{className:`text-[11px] font-medium`,children:`Recommended: Login with Claude`}),O===`idle`?(0,V.jsx)(h,{size:`sm`,className:`w-full h-8 text-xs`,onClick:F,disabled:T,children:T?(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(f,{className:`size-3 animate-spin mr-1`}),` Opening...`]}):`Login with Claude`}):(0,V.jsxs)(`div`,{className:`space-y-2`,children:[(0,V.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Authorize in the opened tab, then paste the code:`}),(0,V.jsx)(S,{placeholder:`Paste code here...`,value:C,onChange:e=>w(e.target.value),className:`text-xs h-8 font-mono`,autoFocus:!0}),(0,V.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,V.jsx)(h,{size:`sm`,className:`flex-1 h-7 text-xs`,onClick:I,disabled:!C.trim()||T,children:T?(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(f,{className:`size-3 animate-spin mr-1`}),` Connecting...`]}):`Connect`}),(0,V.jsx)(h,{size:`sm`,variant:`ghost`,className:`h-7 text-xs`,onClick:j,children:`Cancel`})]})]})]}),(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)(`div`,{className:`flex-1 border-t`}),(0,V.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`or paste token`}),(0,V.jsx)(`div`,{className:`flex-1 border-t`})]}),(0,V.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,V.jsx)(D,{htmlFor:`add-token`,className:`text-xs`,children:`Token`}),(0,V.jsx)(S,{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,V.jsxs)(`p`,{className:`text-[10px] text-muted-foreground`,children:[`Detected: `,R]})]}),(0,V.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,V.jsx)(D,{htmlFor:`add-label`,className:`text-xs`,children:`Label (optional)`}),(0,V.jsx)(S,{id:`add-label`,placeholder:`e.g. Personal, Work`,value:o,onChange:e=>s(e.target.value),className:`text-xs h-8`})]})]}),u&&(0,V.jsx)(`div`,{className:`text-[11px] p-2 rounded bg-error/10 text-error`,children:u}),(0,V.jsxs)(_,{children:[(0,V.jsx)(h,{size:`sm`,variant:`outline`,className:`text-xs h-7`,onClick:M,children:`Cancel`}),(0,V.jsx)(h,{size:`sm`,className:`text-xs h-7`,onClick:L,disabled:!i.trim()||c,children:c?`Adding...`:`Add Token`})]})]})})}function ne(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 re=1440*60*1e3,ie=7,ae=5;function oe(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-ie*re;if(t<r)return null;let i=Math.min(ie-1,Math.floor((t-r)/re)),a=0;for(let e=0;e<=i;e++){let t=new Date(r+e*re).getUTCDay();t!==0&&t!==6&&a++}let o=a/ae;return{day:a,cap:o,used:e.utilization,blocked:e.utilization>=o}}var se=`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.`,ce=2e3,le=21e4;function ue(e){let[t,n]=(0,Z.useState)([]),[r,i]=(0,Z.useState)(`round-robin`),[a,o]=(0,Z.useState)({}),[s,c]=(0,Z.useState)(!1),[l,u]=(0,Z.useState)(new Set),[d,f]=(0,Z.useState)(``),[h,g]=(0,Z.useState)(``),[_,v]=(0,Z.useState)(!1),[y,b]=(0,Z.useState)(null),[x,S]=(0,Z.useState)(null),[C,w]=(0,Z.useState)(!1),[T,E]=(0,Z.useState)(null),[D,O]=(0,Z.useState)(!1),[k,A]=(0,Z.useState)(``),[j,M]=(0,Z.useState)(!1),[N,P]=(0,Z.useState)(``),[F,I]=(0,Z.useState)(!1),[L,R]=(0,Z.useState)(!1),[ee,z]=(0,Z.useState)(null),B=(0,Z.useRef)(null),V=(0,Z.useRef)(null),H=(0,Z.useRef)(0),U=(0,Z.useRef)(!1),W=(0,Z.useRef)(!1),G=(0,Z.useRef)(!1),K=(0,Z.useRef)(e);K.current=e;let q=(0,Z.useCallback)(async()=>{c(!0);try{let e=await p.get(`/api/codex-accounts`);n(e.accounts),i(e.strategy),p.get(`/api/codex-accounts/usage`).then(o).catch(()=>{})}finally{c(!1)}},[]);(0,Z.useEffect)(()=>{q()},[q]);let J=async()=>{if(!(!d.trim()||W.current||U.current||V.current)){W.current=!0,v(!0),b(null);try{await p.post(`/api/codex-accounts/api-key`,{apiKey:d.trim(),label:h.trim()||void 0}),f(``),g(``),e(),await q()}catch(e){b(e.message)}finally{W.current=!1,v(!1)}}},Y=(0,Z.useCallback)(()=>{H.current+=1,U.current=!1,G.current=!1,B.current?.(),B.current=null;let e=V.current;V.current=null,e&&p.del(`/api/codex-accounts/${e.method}-login/${e.id}`).catch(()=>{})},[]),X=(0,Z.useCallback)(()=>{Y(),S(null),w(!1),E(null),O(!1),A(``),M(!1)},[Y]),Q=(0,Z.useCallback)((e,t)=>{let n=Date.now()+(t===`browser`?61e4:le),r=!1,i;B.current=()=>{r=!0,clearTimeout(i)};let a=async()=>{if(r)return;let o=null;try{o=await p.get(`/api/codex-accounts/${t}-login/${e}/status`)}catch{}if(!r){if(o?.state===`done`){X(),g(``),K.current(),await q();return}if(o?.state===`error`||Date.now()>n){X(),b(o?.state===`error`?o.error:`${t===`browser`?`Browser`:`Device`} login timed out.`);return}i=setTimeout(a,ce)}};a()},[X,q]);(0,Z.useEffect)(()=>Y,[Y]);let $=async(e,t)=>{if(U.current||V.current||W.current)return;U.current=!0;let n=++H.current;O(!0),b(null);try{let r=await p.post(`/api/codex-accounts/${e}-login`,{label:h.trim()||void 0,...t?{accountId:t}:{}});if(n!==H.current){p.del(`/api/codex-accounts/${e}-login/${r.id}`).catch(()=>{});return}V.current={id:r.id,method:e},e===`device`?(S(r),w(!0)):E(r),Q(r.id,e)}catch(e){n===H.current&&b(e.message)}finally{n===H.current&&(U.current=!1,O(!1))}};return{accounts:t,strategy:r,usages:a,loading:s,apiKey:d,setApiKey:f,label:h,setLabel:g,adding:_,err:y,setErr:b,device:x,deviceWaiting:C,backupPassword:N,setBackupPassword:P,exporting:F,importing:L,msg:ee,setMsg:z,toggling:l,load:q,addApiKey:J,startDevice:e=>$(`device`,e),startBrowser:e=>$(`browser`,e),browser:T,loginStarting:D,callbackUrl:k,setCallbackUrl:A,submittingCallback:j,submitCallback:async()=>{let e=V.current;if(e?.method!==`browser`||!k.trim()||G.current)return;let t=H.current;G.current=!0,M(!0),b(null);let n=k.trim();A(``);try{await p.post(`/api/codex-accounts/browser-login/${e.id}/callback`,{callbackUrl:n})}catch(e){t===H.current&&b(e.message)}finally{t===H.current&&(G.current=!1,M(!1))}},cancelLogin:X,remove:async e=>{await p.del(`/api/codex-accounts/${e}`),await q()},toggle:async(e,t)=>{let n=t===`disabled`?`active`:`disabled`;u(t=>new Set(t).add(e)),b(null);try{await p.patch(`/api/codex-accounts/${e}`,{status:n}),await q()}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 p.patch(`/api/codex-accounts/${e}`,{dailyGuardEnabled:!t}),await q()}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 p.put(`/api/codex-accounts/strategy`,{strategy:e})}catch{}},doExport:async()=>{if(!N.trim()){b(`Set a backup password first.`);return}I(!0),b(null),z(null);try{let t={"Content-Type":`application/json`},n=m();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),z(`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),z(null);try{let n=await t.text(),r=await p.post(`/api/codex-accounts/import`,{data:n,password:N});z(`Imported ${r.imported}${r.skipped?`, skipped ${r.skipped}`:``}.`),e(),await q()}catch(e){b(e.message)}finally{R(!1)}}}}function de({open:e,onOpenChange:t,label:n,onLabelChange:i,apiKey:a,onApiKeyChange:o,adding:l,onAddApiKey:u,deviceWaiting:d,onStartDevice:p,device:m,error:C,browser:w,onStartBrowser:T,loginStarting:E,callbackUrl:O,onCallbackUrlChange:k,submittingCallback:A,onSubmitCallback:j,reloginLabel:M}){let N=E||d||!!w||l;return(0,V.jsx)(x,{open:e,onOpenChange:t,children:(0,V.jsxs)(v,{className:`sm:max-w-md max-h-[90dvh] overflow-y-auto`,children:[(0,V.jsxs)(g,{children:[(0,V.jsx)(y,{className:`text-sm`,children:M?`Sign in again — ${M}`:`Add Codex Account`}),(0,V.jsx)(b,{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,V.jsxs)(`div`,{className:`space-y-3`,children:[!M&&(0,V.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,V.jsx)(D,{htmlFor:`codex-label`,className:`text-xs`,children:`Label (optional)`}),(0,V.jsx)(S,{id:`codex-label`,placeholder:`e.g. Personal, Work`,value:n,onChange:e=>i(e.target.value),disabled:N,className:`text-xs`})]}),(0,V.jsxs)(`div`,{className:`rounded-md border p-3 space-y-2`,children:[(0,V.jsx)(`p`,{className:`text-[11px] font-medium`,children:`Browser login`}),(0,V.jsxs)(h,{size:`sm`,className:`w-full cursor-pointer gap-1.5`,onClick:T,disabled:N,children:[(0,V.jsx)(c,{className:`size-4`}),` Sign in with browser`]}),w&&(0,V.jsxs)(`div`,{className:`space-y-2 text-xs`,children:[(0,V.jsxs)(`a`,{href:w.authUrl,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1 text-primary hover:underline`,children:[(0,V.jsx)(c,{className:`size-3`}),` Open ChatGPT sign-in`]}),(0,V.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,V.jsx)(D,{htmlFor:`codex-callback-url`,children:`Callback URL`}),(0,V.jsx)(S,{id:`codex-callback-url`,type:`password`,autoComplete:`off`,spellCheck:!1,placeholder:`http://localhost:.../auth/callback?...`,value:O,onChange:e=>k(e.target.value),disabled:A}),(0,V.jsxs)(h,{size:`sm`,onClick:j,disabled:!O.trim()||A,children:[A&&(0,V.jsx)(f,{className:`size-3 animate-spin`}),` Submit callback URL`]}),(0,V.jsxs)(`p`,{role:`status`,className:`flex items-center gap-1.5 text-muted-foreground`,children:[(0,V.jsx)(f,{className:`size-3 animate-spin`}),` Waiting for authorization. This may complete automatically on this computer.`]})]})]}),(0,V.jsxs)(`div`,{className:`rounded-md border p-3 space-y-2`,children:[(0,V.jsx)(`p`,{className:`text-[11px] font-medium`,children:`Device code`}),(0,V.jsx)(h,{size:`sm`,className:`w-full cursor-pointer gap-1.5`,onClick:p,disabled:N,children:d?(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(f,{className:`size-4 animate-spin`}),` Waiting for authorization...`]}):(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(r,{className:`size-4`}),` Sign in with device code`]})}),m&&(0,V.jsxs)(`div`,{className:`rounded-md border border-primary/40 bg-primary/10 p-2.5 space-y-1.5`,children:[(0,V.jsx)(`p`,{className:`text-[11px]`,children:`Enter this code to authorize:`}),(0,V.jsx)(`div`,{className:`font-mono text-lg tracking-widest`,children:m.userCode}),(0,V.jsxs)(`a`,{href:m.verificationUrl,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1 text-primary hover:underline text-[11px]`,children:[(0,V.jsx)(c,{className:`size-3`}),` `,m.verificationUrl]})]})]}),!M&&(0,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)(`div`,{className:`flex-1 border-t`}),(0,V.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`or paste an API key`}),(0,V.jsx)(`div`,{className:`flex-1 border-t`})]}),(0,V.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,V.jsx)(D,{htmlFor:`codex-api-key`,className:`text-xs`,children:`OpenAI API key`}),(0,V.jsx)(S,{id:`codex-api-key`,type:`password`,placeholder:`sk-...`,value:a,onChange:e=>o(e.target.value),className:`text-xs font-mono`})]})]})]}),E&&(0,V.jsx)(`p`,{role:`status`,className:`text-xs`,children:`Starting login...`}),C&&(0,V.jsx)(`div`,{role:`alert`,className:`text-[11px] p-2 rounded bg-error/10 text-error`,children:C}),(0,V.jsxs)(_,{children:[(0,V.jsx)(h,{size:`sm`,variant:`outline`,className:`text-xs cursor-pointer`,onClick:()=>t(!1),children:`Cancel`}),!M&&(0,V.jsxs)(h,{size:`sm`,className:`text-xs cursor-pointer gap-1.5`,onClick:u,disabled:!a.trim()||N,children:[l?(0,V.jsx)(f,{className:`size-3.5 animate-spin`}):(0,V.jsx)(s,{className:`size-3.5`}),`Add key`]})]})]})})}function fe({account:e,onClose:t,onDone:n}){let r=ue(()=>{n(),t()});return(0,V.jsx)(de,{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})}export{B as _,oe as a,$ as c,J as d,G as f,H as g,U as h,ue as i,X as l,W as m,de as n,ne as o,K as p,se as r,te as s,fe as t,q as u,L as v};
|
|
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-
|
|
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-DXmQug0m.js";import"./vendor-mermaid-eg2XWIjK.js";import{n as s}from"./use-is-mobile-CkO33jqU.js";import{S as c,nn as l,wn as u}from"./index-CvUGUp7d.js";import{t as d}from"./use-monaco-theme-BVatH9yZ.js";import"./editor-font-BOjGgYeg.js";import{n as f,r as p}from"./monaco-dotenv-language-COsgiuQg.js";var m=e(t(),1),h=n();function g(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()??``]??(f(e)?`dotenv`:`plaintext`)}function _(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 v({metadata:e}){let t=e?.filePath,n=e?.projectName,[f,v]=(0,m.useState)(null),[b,x]=(0,m.useState)(!0),[S,C]=(0,m.useState)(null),[w,T]=(0,m.useState)(0),E=(0,m.useRef)(null),D=(0,m.useRef)(null),O=(0,m.useRef)([]),k=(0,m.useRef)(null),{wordWrap:A,mobileWordWrap:j}=o(l(e=>({wordWrap:e.wordWrap,mobileWordWrap:e.mobileWordWrap}))),M=s()?j:A,N=d(),P=(0,m.useRef)(null),[F,I]=(0,m.useState)();(0,m.useEffect)(()=>{let e=P.current;if(!e)return;let t=new ResizeObserver(([e])=>{e&&I(Math.floor(e.contentRect.height))});return t.observe(e),()=>t.disconnect()},[]),(0,m.useEffect)(()=>u(P.current,()=>E.current?.layout()),[b,S]),(0,m.useEffect)(()=>{!t||!n||(x(!0),a.get(`${i(n)}/files/read?path=${encodeURIComponent(t)}`).then(e=>{v(e.content),x(!1)}).catch(e=>{C(e.message||`Failed to load file`),x(!1)}))},[t,n]);let L=(0,m.useCallback)(()=>{let e=E.current,t=D.current;if(!e||!t)return;let n=_(e.getModel()?.getValue()||``);T(n.length);for(let t of O.current)e.removeContentWidget(t);if(O.current=[],k.current&&k.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`}});k.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 (${y(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`);R(r.id,n)});let a={getId:()=>n,getDomNode:()=>i,getPosition:()=>({position:{lineNumber:r.startLine,column:1},preference:[t.editor.ContentWidgetPositionPreference.ABOVE]})};e.addContentWidget(a),O.current.push(a)}},[]),R=(0,m.useCallback)((e,t)=>{let n=E.current,r=D.current;if(!n||!r)return;let i=n.getModel();if(!i)return;let a=_(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 +1 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import{$ as r,J as i,K as a,Q as o,X as s,Y as c,Z as l,et as u,nt as d,q as f,rt as p,tt as m}from"./vendor-ui-BHh12_0v.js";import{H as h,M as g}from"./icons-
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import{$ as r,J as i,K as a,Q as o,X as s,Y as c,Z as l,et as u,nt as d,q as f,rt as p,tt as m}from"./vendor-ui-BHh12_0v.js";import{H as h,M as g}from"./icons-CO_II6D-.js";import{n as _}from"./utils-btZ8C8-R.js";import{n as v}from"./portal-container-context-NFSuymMu.js";e(t(),1);var y=n();function b({...e}){return(0,y.jsx)(o,{"data-slot":`context-menu`,...e})}function x({...e}){return(0,y.jsx)(p,{"data-slot":`context-menu-trigger`,...e})}function S({container:e,...t}){let n=v();return(0,y.jsx)(c,{"data-slot":`context-menu-portal`,container:e??n,...t})}function C({...e}){return(0,y.jsx)(u,{"data-slot":`context-menu-sub`,...e})}function w({...e}){return(0,y.jsx)(s,{"data-slot":`context-menu-radio-group`,...e})}function T({className:e,inset:t,children:n,...r}){return(0,y.jsxs)(d,{"data-slot":`context-menu-sub-trigger`,"data-inset":t,className:_(`flex cursor-default items-center rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[inset]:pl-8 data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground`,e),...r,children:[n,(0,y.jsx)(g,{className:`ml-auto`})]})}function E({className:e,...t}){return(0,y.jsx)(m,{"data-slot":`context-menu-sub-content`,className:_(`z-50 min-w-[8rem] origin-(--radix-context-menu-content-transform-origin) overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95`,e),...t})}function D({className:e,...t}){return(0,y.jsx)(S,{children:(0,y.jsx)(a,{"data-slot":`context-menu-content`,className:_(`z-50 max-h-(--radix-context-menu-content-available-height) min-w-[8rem] origin-(--radix-context-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95`,e),...t})})}function O({className:e,inset:t,variant:n=`default`,...r}){return(0,y.jsx)(f,{"data-slot":`context-menu-item`,"data-inset":t,"data-variant":n,className:_(`relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 data-[variant=destructive]:focus:text-destructive dark:data-[variant=destructive]:focus:bg-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground data-[variant=destructive]:*:[svg]:text-destructive!`,e),...r})}function k({className:e,children:t,...n}){return(0,y.jsxs)(l,{"data-slot":`context-menu-radio-item`,className:_(`relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,e),...n,children:[(0,y.jsx)(`span`,{className:`pointer-events-none absolute left-2 flex size-3.5 items-center justify-center`,children:(0,y.jsx)(i,{children:(0,y.jsx)(h,{className:`size-2 fill-current`})})}),t]})}function A({className:e,...t}){return(0,y.jsx)(r,{"data-slot":`context-menu-separator`,className:_(`-mx-1 my-1 h-px bg-border`,e),...t})}export{k as a,E as c,w as i,T as l,D as n,A as o,O as r,C as s,b as t,x as u};
|
|
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-
|
|
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{tn as a}from"./index-CvUGUp7d.js";import{n as o,t as s}from"./csv-parser-BXeH-yzY.js";import{i as c,n as l,r as u,t as d}from"./lib-KePrAxj7.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-C9ZwXgel.js";import{n as l,s as u}from"./api-client-c8YOpTlT.js";import"./settings-store-DXmQug0m.js";import"./vendor-mermaid-eg2XWIjK.js";import"./panel-store-BUQ-CPsd.js";import"./window-store-B4cbZ5rr.js";import{t as d}from"./tab-store-DqeaGhhE.js";import{ft as f}from"./index-BVKT5UCu.js";import"./data-grid-types-DatI2Wee.js";import"./use-monaco-theme-CNEk66US.js";import{n as p,t as m}from"./glide-data-grid-DG9AnCmP.js";import{t as h}from"./sql-query-editor-BMNsmnfi.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-DXmQug0m.js";import"./vendor-mermaid-eg2XWIjK.js";import"./panel-store-BUQ-CPsd.js";import"./window-store-B4cbZ5rr.js";import{t as d}from"./tab-store-DqeaGhhE.js";import{ft as f}from"./index-CvUGUp7d.js";import"./data-grid-types-DatI2Wee.js";import"./use-monaco-theme-BVatH9yZ.js";import{n as p,t as m}from"./glide-data-grid-CUNWBFfN.js";import{t as h}from"./sql-query-editor-Bg3lOrmt.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 +1 @@
|
|
|
1
|
-
import{S as e}from"./vendor-markdown-QKPNiWEd.js";import{n as t}from"./utils-btZ8C8-R.js";import{n}from"./use-is-mobile-CkO33jqU.js";import{a as r,n as i,o as a,r as o,t as s}from"./dialog-
|
|
1
|
+
import{S as e}from"./vendor-markdown-QKPNiWEd.js";import{n as t}from"./utils-btZ8C8-R.js";import{n}from"./use-is-mobile-CkO33jqU.js";import{a as r,n as i,o as a,r as o,t as s}from"./dialog-tzBRkGeW.js";import{t as c}from"./mobile-bottom-sheet-Cf4kV1hS.js";var l=e();function u({open:e,onClose:u,title:d,description:f,children:p,footer:m,className:h}){return n()?(0,l.jsx)(c,{open:e,onClose:u,className:`max-h-[85vh] p-4`,children:(0,l.jsxs)(`div`,{className:t(`flex flex-col gap-3`,h),children:[(0,l.jsxs)(`div`,{children:[(0,l.jsx)(`h2`,{className:`text-base font-semibold text-text`,children:d}),f&&(0,l.jsx)(`p`,{className:`mt-1 text-sm text-text-2`,children:f})]}),p&&(0,l.jsx)(`div`,{className:`max-h-[55vh] overflow-y-auto`,children:p}),m&&(0,l.jsx)(`div`,{className:`flex flex-col gap-2 pt-1 [&>*]:min-h-11`,children:m})]})}):(0,l.jsx)(s,{open:e,onOpenChange:e=>{e||u()},children:(0,l.jsxs)(i,{className:t(`sm:max-w-md`,h),children:[(0,l.jsxs)(r,{children:[(0,l.jsx)(a,{children:d}),f&&(0,l.jsx)(o,{children:f})]}),p&&(0,l.jsx)(`div`,{className:`max-h-[60vh] overflow-y-auto`,children:p}),m&&(0,l.jsx)(`div`,{className:`flex justify-end gap-2 pt-2`,children:m})]})})}export{u as t};
|
|
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-D6DOknBD.js","assets/rolldown-runtime-C5c2KzVm.js","assets/vendor-mermaid-eg2XWIjK.js","assets/vendor-ui-BHh12_0v.js","assets/vendor-markdown-QKPNiWEd.js","assets/api-client-c8YOpTlT.js","assets/design-export-client-SWCbGwwU.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-
|
|
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-DeISufm0.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-DXmQug0m.js";import{q as se}from"./vendor-mermaid-eg2XWIjK.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"./file-store-CTlJqj2m.js";import{n as ue}from"./use-is-mobile-CkO33jqU.js";import{u as de}from"./onboarding-quick-orientation-CT4PylG0.js";import{t as R}from"./button-CBehaXpV.js";import"./dialog-tzBRkGeW.js";import{t as fe}from"./mobile-bottom-sheet-Cf4kV1hS.js";import"./use-visual-viewport-C307OVeV.js";import"./fs-api-RVc5RtTA.js";import{o as pe}from"./format-file-meta-DLaHgkdx.js";import{t as me}from"./input-CP31LZnN.js";import"./ws-auth-B_y5rMfZ.js";import{Gt as he,Jn as ge,Kt as _e,Xt as ve,Yn as ye,an as be,cn as xe,d as Se,en as Ce,h as we,hn as Te,i as Ee,l as De,ln as Oe,m as ke,mn as Ae,on as je,qn as Me,qt as z,rn as Ne,sn as Pe,u as Fe,un as Ie,vn as Le}from"./index-CvUGUp7d.js";import"./use-websocket-C1mloX0R.js";import{a as Re}from"./api-settings-0s1Rfgcu.js";import"./tool-cards-DsQdMorI.js";import"./use-blob-url-mZfScQdx.js";import"./libesm-DMnQ3WlF.js";import"./onboarding-entry-CcvySZ_l.js";import"./use-open-team-member-DHzZiJZw.js";import{n as ze,r as Be,t as Ve}from"./send-to-chat-TSKk3fI9.js";import"./ai-settings-section-B7Un4KiW.js";import"./codex-sign-in-again-dialog-DcIOYhAe.js";import{t as He}from"./new-chat-provider-CJx_waY3.js";import{a as Ue,i as We,n as Ge,r as Ke}from"./design-export-client-SWCbGwwU.js";import{t as qe}from"./design-responsive-dialog-CcJETHO2.js";var B=e(t(),1),Je=200;function Ye(e,t){let[n,r]=(0,B.useState)(`resolving`),[i,a]=(0,B.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,B.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(Je),offset:`0`}),r=await F.get(`${P(o)}/chat/sessions?${n}`);if(t)return;let i=r.sessions.find(e=>e.designSlug===s);Le(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([Re(),Se(o)]);if(t)return;let a=He(n),s=i.find(e=>e.id===a)??i[0];if(!s){r(`no-provider`);return}Le(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,B.useCallback)(()=>a(e=>e+1),[]),p=(0,B.useCallback)(t=>{Le(e,{sessionId:void 0,pendingMessage:void 0,clearedFrom:t,designSessionChecked:!0,designChatEpoch:Te({designChatEpoch:d})})},[e,d]),m=(0,B.useCallback)(t=>{Le(e,{sessionId:t.sessionId,providerId:t.providerId,pendingMessage:t.pendingMessage,designChatEpoch:Te({designChatEpoch:d})})},[e,d]);return{status:n,retry:f,epoch:d,sessionId:c??null,startNewSession:p,adoptFork:m}}var Xe=`ppm:design-show-chat`;function Ze(e,t,n){if(!e||!t.trim())return;let r=!1,i=()=>{r=!0};window.addEventListener(Ve,i);try{window.dispatchEvent(new CustomEvent(ze,{detail:{text:t,label:n,targetTabId:e}}))}finally{window.removeEventListener(Ve,i)}r||Le(e,{pendingMessage:t}),$e(e)}function Qe(e,t,n){if(!e||!t.trim())return`none`;let r=`none`,i=e=>{r=e.detail?.sent?`sent`:`chip`};window.addEventListener(Ve,i);try{window.dispatchEvent(new CustomEvent(ze,{detail:{text:t,label:n,targetTabId:e,autoSend:!0}}))}finally{window.removeEventListener(Ve,i)}return r}function $e(e){window.dispatchEvent(new CustomEvent(Xe,{detail:{tabId:e}}))}var et=(0,B.createContext)(null);function tt(){let e=(0,B.useContext)(et);if(!e)throw Error(`useDesignTab() used outside a design tab`);return e}var V=n();function nt({tabId:e,metadata:t,session:n}){return n.status===`no-provider`?(0,V.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,V.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,V.jsx)(`button`,{type:`button`,onClick:n.retry,className:`min-h-11 px-3 text-primary underline`,children:`Retry`})]}):n.status===`ready`?(0,V.jsx)(ie,{tabId:e,metadata:t,onNewSession:n.startNewSession,onFork:n.adoptFork,historyFilter:String(t.designSlug)},n.epoch):(0,V.jsxs)(`div`,{className:`flex h-full items-center justify-center gap-2 text-sm text-text-subtle`,role:`status`,children:[(0,V.jsx)(N,{className:`size-4 animate-spin`}),` Preparing chat…`]})}var rt=[`desktop`,`tablet`,`phone`,`slide`],it=[{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 at(e){return typeof e==`string`&&rt.includes(e)}function ot(e){return it.find(t=>t.id===e)??it[0]}function st(e){return e===`slides`?`slide`:`desktop`}var ct=[`auto`,`split`,`canvas`,`chat`];function lt(e){return typeof e==`string`&&ct.includes(e)}function ut(e,t){return!Number.isFinite(e)||e<=0?t:e>=940?!0:e<860?!1:t}function dt(e){return e===`chat`?`chat`:`canvas`}function ft(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 pt=`ppm-design-view-prefs`;function mt(){return{layout:`auto`,chatPercent:38,frames:{}}}function ht(e){return typeof e!=`number`||!Number.isFinite(e)?38:Math.min(70,Math.max(20,Math.round(e)))}function gt(e){if(!e)return mt();let t;try{t=JSON.parse(e)}catch{return mt()}if(!t||typeof t!=`object`||Array.isArray(t))return mt();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&&at(e[1]));for(let[t,n]of e.slice(-50))r[t]=n}return{layout:lt(n.layout)?n.layout:`auto`,chatPercent:ht(n.chatPercent),frames:r}}function _t(e,t){return`${e}/${t}`}function vt(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 yt(e,t){return{...e,chatPercent:ht(t)}}function bt(e,t){return{...e,layout:t}}function H(){try{return gt(localStorage.getItem(pt))}catch{return mt()}}function xt(e){try{localStorage.setItem(pt,JSON.stringify(e))}catch{}}function St(){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-Dtuph5jh.js → designs-sidebar-panel-8KI79o1u.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-
|
|
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-CkO33jqU.js";import{t as p}from"./button-CBehaXpV.js";import"./dialog-tzBRkGeW.js";import"./mobile-bottom-sheet-Cf4kV1hS.js";import"./use-visual-viewport-C307OVeV.js";import{Gt as m,Kt as h,Xt as g,a as _,c as v,en as y,f as b,gn as x,i as S,o as C,p as w,qt as T}from"./index-CvUGUp7d.js";import{t as E}from"./design-responsive-dialog-CcJETHO2.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 w(e,t.slug,u),_(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 v(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);_(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,_]=(0,D.useState)(null),[v,w]=(0,D.useState)(null),[E,j]=(0,D.useState)(null),M=(0,D.useCallback)(()=>{t&&b(t).then(e=>{u(e),_(null)}).catch(e=>_(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(S,i),()=>{e&&clearTimeout(e),window.removeEventListener(`file:changed`,r),window.removeEventListener(S,i)}},[t,M]);let N=n=>{x({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:()=>{C(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:()=>C(t),className:`min-h-11 px-3 text-sm text-primary underline`,children:`New design`})]}):n.designs.map(e=>(0,O.jsxs)(m,{children:[(0,O.jsx)(y,{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)(h,{children:[(0,O.jsxs)(T,{onClick:()=>N(e),children:[(0,O.jsx)(i,{className:`size-4`}),` Open`]}),(0,O.jsxs)(T,{onClick:()=>w(e),children:[(0,O.jsx)(o,{className:`size-4`}),` Rename`]}),(0,O.jsx)(g,{}),(0,O.jsxs)(T,{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.`})]}),v&&(0,O.jsx)(k,{projectName:t,design:v,onClose:()=>w(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
|