@hienlh/ppm 0.23.16 → 0.23.18
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 +13 -0
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/cli-reference.md +4 -4
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/dist/web/assets/{accounts-settings-section-DhzuFkDO.js → accounts-settings-section-BES4EFGQ.js} +1 -1
- package/dist/web/assets/accounts-settings-section-BES4EFGQ.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-BES4EFGQ.js.gz +0 -0
- package/dist/web/assets/{agent-session-sheet-CZAmOwSU.js → agent-session-sheet-BlZmcb40.js} +2 -2
- package/dist/web/assets/agent-session-sheet-BlZmcb40.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-BlZmcb40.js.gz +0 -0
- package/dist/web/assets/{agent-session-window-content-CwokWtJq.js → agent-session-window-content-zCzFZ0XT.js} +1 -1
- package/dist/web/assets/agent-session-window-content-zCzFZ0XT.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-zCzFZ0XT.js.gz +0 -0
- package/dist/web/assets/{ai-resource-editor-CT1JCaRQ.js → ai-resource-editor-Dh8sQhL2.js} +1 -1
- package/dist/web/assets/ai-resource-editor-Dh8sQhL2.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-Dh8sQhL2.js.gz +0 -0
- package/dist/web/assets/{ai-settings-section-Ct9-lNqA.js → ai-settings-section-C6NKrktb.js} +1 -1
- package/dist/web/assets/ai-settings-section-C6NKrktb.js.br +0 -0
- package/dist/web/assets/ai-settings-section-C6NKrktb.js.gz +0 -0
- package/dist/web/assets/{ai-settings-section-CBlS1FZK.js → ai-settings-section-Ck_0ArV1.js} +1 -1
- package/dist/web/assets/{android-tab-CUPQN2M4.js → android-tab-BLxZKtMP.js} +1 -1
- package/dist/web/assets/android-tab-BLxZKtMP.js.br +0 -0
- package/dist/web/assets/android-tab-BLxZKtMP.js.gz +0 -0
- package/dist/web/assets/{appearance-settings-section-DpYcNqXH.js → appearance-settings-section-DFJdBUZ8.js} +1 -1
- package/dist/web/assets/appearance-settings-section-DFJdBUZ8.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-DFJdBUZ8.js.gz +0 -0
- package/dist/web/assets/{apps-panel-BqF_CkKy.js → apps-panel-C2dyMFVy.js} +1 -1
- package/dist/web/assets/apps-panel-C2dyMFVy.js.br +0 -0
- package/dist/web/assets/apps-panel-C2dyMFVy.js.gz +0 -0
- package/dist/web/assets/{branch-review-tab-BEZqFSlw.js → branch-review-tab-BIpjOgOQ.js} +1 -1
- package/dist/web/assets/branch-review-tab-BIpjOgOQ.js.br +0 -0
- package/dist/web/assets/branch-review-tab-BIpjOgOQ.js.gz +0 -0
- package/dist/web/assets/{chat-tab-N1B-Yv0P.js → chat-tab-CADhIdsz.js} +1 -1
- package/dist/web/assets/chat-tab-CADhIdsz.js.br +2 -0
- package/dist/web/assets/chat-tab-CADhIdsz.js.gz +0 -0
- package/dist/web/assets/chat-tab-WbP7BIUp.js +19 -0
- package/dist/web/assets/chat-tab-WbP7BIUp.js.br +0 -0
- package/dist/web/assets/chat-tab-WbP7BIUp.js.gz +0 -0
- package/dist/web/assets/{code-editor-d1CXl2WL.js → code-editor-BEjBAz0q.js} +4 -4
- package/dist/web/assets/code-editor-BEjBAz0q.js.br +0 -0
- package/dist/web/assets/code-editor-BEjBAz0q.js.gz +0 -0
- package/dist/web/assets/{codex-reset-credit-button-CwSSBK6P.js → codex-reset-credit-button-Qths4oQl.js} +1 -1
- package/dist/web/assets/codex-reset-credit-button-Qths4oQl.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-Qths4oQl.js.gz +0 -0
- package/dist/web/assets/{conflict-editor-BucKz-uE.js → conflict-editor-DwFgcGGr.js} +1 -1
- package/dist/web/assets/conflict-editor-DwFgcGGr.js.br +0 -0
- package/dist/web/assets/conflict-editor-DwFgcGGr.js.gz +0 -0
- package/dist/web/assets/{connection-form-tab-DIc25Bko.js → connection-form-tab-DJ3Lxpzd.js} +1 -1
- package/dist/web/assets/connection-form-tab-DJ3Lxpzd.js.br +0 -0
- package/dist/web/assets/connection-form-tab-DJ3Lxpzd.js.gz +0 -0
- package/dist/web/assets/{csv-preview-CqDaGV5N.js → csv-preview-BMF0HuuN.js} +1 -1
- package/dist/web/assets/csv-preview-BMF0HuuN.js.br +0 -0
- package/dist/web/assets/csv-preview-BMF0HuuN.js.gz +0 -0
- package/dist/web/assets/{db-tab-parts-lp8ROGQB.js → db-tab-parts-BbNfuvwC.js} +1 -1
- package/dist/web/assets/db-tab-parts-BbNfuvwC.js.br +0 -0
- package/dist/web/assets/db-tab-parts-BbNfuvwC.js.gz +0 -0
- package/dist/web/assets/{design-settings-section-DxWEBH1L.js → design-settings-section-BVcBTBdz.js} +1 -1
- package/dist/web/assets/design-settings-section-BVcBTBdz.js.br +0 -0
- package/dist/web/assets/design-settings-section-BVcBTBdz.js.gz +0 -0
- package/dist/web/assets/{design-tab-Cl0CMAUx.js → design-tab-msL92Mgr.js} +1 -1
- package/dist/web/assets/design-tab-msL92Mgr.js.br +0 -0
- package/dist/web/assets/design-tab-msL92Mgr.js.gz +0 -0
- package/dist/web/assets/{designs-sidebar-panel-aCr-EGfj.js → designs-sidebar-panel-hLIuDsDd.js} +1 -1
- package/dist/web/assets/designs-sidebar-panel-hLIuDsDd.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-hLIuDsDd.js.gz +0 -0
- package/dist/web/assets/{diff-viewer-XyJgWKwe.js → diff-viewer-BLYGfIik.js} +1 -1
- package/dist/web/assets/diff-viewer-BLYGfIik.js.br +0 -0
- package/dist/web/assets/diff-viewer-BLYGfIik.js.gz +0 -0
- package/dist/web/assets/{docx-preview-KJaj2YGN.js → docx-preview-D0ORQkvI.js} +1 -1
- package/dist/web/assets/docx-preview-D0ORQkvI.js.br +0 -0
- package/dist/web/assets/docx-preview-D0ORQkvI.js.gz +0 -0
- package/dist/web/assets/{editor-dialog-9tW6c9mu.js → editor-dialog-BdkAgK-M.js} +1 -1
- package/dist/web/assets/editor-dialog-BdkAgK-M.js.br +0 -0
- package/dist/web/assets/editor-dialog-BdkAgK-M.js.gz +0 -0
- package/dist/web/assets/{editor-language-service-CkdO9ih8.js → editor-language-service-B2TYY2sw.js} +1 -1
- package/dist/web/assets/editor-language-service-B2TYY2sw.js.br +0 -0
- package/dist/web/assets/editor-language-service-B2TYY2sw.js.gz +0 -0
- package/dist/web/assets/{explorer-body-B8AkNO5o.js → explorer-body-B-67PDYd.js} +1 -1
- package/dist/web/assets/explorer-body-B-67PDYd.js.br +0 -0
- package/dist/web/assets/explorer-body-B-67PDYd.js.gz +0 -0
- package/dist/web/assets/{explorer-window-content-D174CXKz.js → explorer-window-content-ndGjHH-i.js} +1 -1
- package/dist/web/assets/explorer-window-content-ndGjHH-i.js.br +0 -0
- package/dist/web/assets/explorer-window-content-ndGjHH-i.js.gz +0 -0
- package/dist/web/assets/{extension-manager-section-CQsqXsPF.js → extension-manager-section-C3Z99hLd.js} +1 -1
- package/dist/web/assets/extension-manager-section-C3Z99hLd.js.br +0 -0
- package/dist/web/assets/extension-manager-section-C3Z99hLd.js.gz +0 -0
- package/dist/web/assets/{extension-webview-AfaxC7PL.js → extension-webview-oBN-quI3.js} +1 -1
- package/dist/web/assets/extension-webview-oBN-quI3.js.br +0 -0
- package/dist/web/assets/extension-webview-oBN-quI3.js.gz +0 -0
- package/dist/web/assets/{files-settings-section-CC0aJryq.js → files-settings-section-pzPZEYe2.js} +1 -1
- package/dist/web/assets/files-settings-section-pzPZEYe2.js.br +0 -0
- package/dist/web/assets/files-settings-section-pzPZEYe2.js.gz +0 -0
- package/dist/web/assets/{general-settings-section-DQTr20G_.js → general-settings-section-BxNNbh5b.js} +1 -1
- package/dist/web/assets/general-settings-section-BxNNbh5b.js.br +0 -0
- package/dist/web/assets/general-settings-section-BxNNbh5b.js.gz +0 -0
- package/dist/web/assets/{git-log-panel-CisEJPJz.js → git-log-panel-CEAF4ST-.js} +1 -1
- package/dist/web/assets/git-log-panel-CEAF4ST-.js.br +0 -0
- package/dist/web/assets/git-log-panel-CEAF4ST-.js.gz +0 -0
- package/dist/web/assets/{git-review-tab-DpWEy03w.js → git-review-tab-Cp5DYE5b.js} +1 -1
- package/dist/web/assets/git-review-tab-Cp5DYE5b.js.br +0 -0
- package/dist/web/assets/git-review-tab-Cp5DYE5b.js.gz +0 -0
- package/dist/web/assets/{glide-data-grid-hOML-uXP.js → glide-data-grid-BrwKKQhc.js} +1 -1
- package/dist/web/assets/glide-data-grid-BrwKKQhc.js.br +0 -0
- package/dist/web/assets/glide-data-grid-BrwKKQhc.js.gz +0 -0
- package/dist/web/assets/{grid-save-dialog-Bx61akzH.js → grid-save-dialog-inaY39lZ.js} +1 -1
- package/dist/web/assets/grid-save-dialog-inaY39lZ.js.br +0 -0
- package/dist/web/assets/grid-save-dialog-inaY39lZ.js.gz +0 -0
- package/dist/web/assets/{group-chat-tab-eQdJHa8d.js → group-chat-tab-DpvHkXCK.js} +1 -1
- package/dist/web/assets/group-chat-tab-DpvHkXCK.js.br +0 -0
- package/dist/web/assets/group-chat-tab-DpvHkXCK.js.gz +0 -0
- package/dist/web/assets/{impexp-tab-BjIDxYTj.js → impexp-tab-CDgODpaL.js} +1 -1
- package/dist/web/assets/impexp-tab-CDgODpaL.js.br +0 -0
- package/dist/web/assets/impexp-tab-CDgODpaL.js.gz +0 -0
- package/dist/web/assets/{index-COwBji1t.js → index-EznfgwH9.js} +5 -5
- package/dist/web/assets/index-EznfgwH9.js.br +0 -0
- package/dist/web/assets/index-EznfgwH9.js.gz +0 -0
- package/dist/web/assets/{jira-watcher-section-dzpmNZA2.js → jira-watcher-section-CvxfscZl.js} +1 -1
- package/dist/web/assets/{keybindings-store-DRjk8512.js → keybindings-store-BqXn-D3b.js} +1 -1
- package/dist/web/assets/{keyboard-shortcuts-section-BhyalK8A.js → keyboard-shortcuts-section-HaqDDilx.js} +1 -1
- package/dist/web/assets/keyboard-shortcuts-section-HaqDDilx.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-HaqDDilx.js.gz +0 -0
- package/dist/web/assets/{language-servers-section-BXLaicUY.js → language-servers-section-B2mGPtGX.js} +2 -2
- package/dist/web/assets/language-servers-section-B2mGPtGX.js.br +0 -0
- package/dist/web/assets/language-servers-section-B2mGPtGX.js.gz +0 -0
- package/dist/web/assets/{logs-app-BnjU6CRy.js → logs-app-Cv2fsZxf.js} +1 -1
- package/dist/web/assets/logs-app-Cv2fsZxf.js.br +0 -0
- package/dist/web/assets/logs-app-Cv2fsZxf.js.gz +0 -0
- package/dist/web/assets/{logs-tab-7uyD7gKW.js → logs-tab-D9orkAwZ.js} +1 -1
- package/dist/web/assets/{logs-window-content-B78a6oM2.js → logs-window-content-DygG8-n0.js} +1 -1
- package/dist/web/assets/{lsp-client-DOHnxEUE.js → lsp-client-DpKk7qms.js} +1 -1
- package/dist/web/assets/lsp-client-DpKk7qms.js.br +0 -0
- package/dist/web/assets/lsp-client-DpKk7qms.js.gz +0 -0
- package/dist/web/assets/{markdown-renderer-B_hL6lRL.js → markdown-renderer-YDuDxTPt.js} +1 -1
- package/dist/web/assets/{markdown-renderer-Dz0ZcxNo.js → markdown-renderer-zuzkV4A5.js} +1 -1
- package/dist/web/assets/markdown-renderer-zuzkV4A5.js.br +0 -0
- package/dist/web/assets/markdown-renderer-zuzkV4A5.js.gz +0 -0
- package/dist/web/assets/{mobile-explorer-sheet-C_3dq99D.js → mobile-explorer-sheet-DrQaPEZo.js} +1 -1
- package/dist/web/assets/mobile-explorer-sheet-DrQaPEZo.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-DrQaPEZo.js.gz +0 -0
- package/dist/web/assets/{new-design-dialog-CaubNbMT.js → new-design-dialog-C00L2Ei1.js} +1 -1
- package/dist/web/assets/new-design-dialog-C00L2Ei1.js.br +0 -0
- package/dist/web/assets/new-design-dialog-C00L2Ei1.js.gz +0 -0
- package/dist/web/assets/{notification-store-BTk3PZAj.js → notification-store-BHQjJkNC.js} +1 -1
- package/dist/web/assets/{notifications-settings-section-CJJ1l5cL.js → notifications-settings-section-DHx7YbrU.js} +1 -1
- package/dist/web/assets/notifications-settings-section-DHx7YbrU.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-DHx7YbrU.js.gz +0 -0
- package/dist/web/assets/{ppmbot-settings-section-BFniAm3D.js → ppmbot-settings-section-8OxZnTeE.js} +1 -1
- package/dist/web/assets/ppmbot-settings-section-8OxZnTeE.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-8OxZnTeE.js.gz +0 -0
- package/dist/web/assets/{problems-panel-CIxaCYJw.js → problems-panel-uCMYh7nY.js} +1 -1
- package/dist/web/assets/problems-panel-uCMYh7nY.js.br +0 -0
- package/dist/web/assets/problems-panel-uCMYh7nY.js.gz +0 -0
- package/dist/web/assets/{process-table-l1fVcESX.js → process-table-D6fDra-t.js} +1 -1
- package/dist/web/assets/process-table-D6fDra-t.js.br +0 -0
- package/dist/web/assets/process-table-D6fDra-t.js.gz +0 -0
- package/dist/web/assets/{proxy-settings-section-Di5nBuy6.js → proxy-settings-section-B8vjc9n-.js} +1 -1
- package/dist/web/assets/proxy-settings-section-B8vjc9n-.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-B8vjc9n-.js.gz +0 -0
- package/dist/web/assets/{query-tab-hyKnRZr3.js → query-tab-BaIWJrsN.js} +1 -1
- package/dist/web/assets/query-tab-BaIWJrsN.js.br +0 -0
- package/dist/web/assets/{query-tab-hyKnRZr3.js.gz → query-tab-BaIWJrsN.js.gz} +0 -0
- package/dist/web/assets/{remote-access-settings-section-HpZAP0Al.js → remote-access-settings-section-DIrFElKv.js} +1 -1
- package/dist/web/assets/remote-access-settings-section-DIrFElKv.js.br +0 -0
- package/dist/web/assets/remote-access-settings-section-DIrFElKv.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-clipboard-notice-DY7tWgjf.js → remote-desktop-clipboard-notice-Cg2Z-66K.js} +1 -1
- package/dist/web/assets/remote-desktop-clipboard-notice-Cg2Z-66K.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-Cg2Z-66K.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-mobile-sheet-CX9mDRle.js → remote-desktop-mobile-sheet-CPkPaOeS.js} +2 -2
- package/dist/web/assets/remote-desktop-mobile-sheet-CPkPaOeS.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-CPkPaOeS.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-mobile-view-DNg0EpbV.js → remote-desktop-mobile-view-CFyOCkms.js} +1 -1
- package/dist/web/assets/remote-desktop-mobile-view-CFyOCkms.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-CFyOCkms.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-readiness-gate-BTTLlVDc.js → remote-desktop-readiness-gate-CBAZK0-B.js} +1 -1
- package/dist/web/assets/remote-desktop-readiness-gate-CBAZK0-B.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-CBAZK0-B.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-window-content-CqxnhSu0.js → remote-desktop-window-content-CNk7SS-W.js} +1 -1
- package/dist/web/assets/remote-desktop-window-content-CNk7SS-W.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-CNk7SS-W.js.gz +0 -0
- package/dist/web/assets/{rename-object-dialog-CnhMsNbT.js → rename-object-dialog-MhvD2boE.js} +1 -1
- package/dist/web/assets/rename-object-dialog-MhvD2boE.js.br +0 -0
- package/dist/web/assets/rename-object-dialog-MhvD2boE.js.gz +0 -0
- package/dist/web/assets/{review-code-CunYhmcC.js → review-code-B9zXrfyG.js} +1 -1
- package/dist/web/assets/review-code-B9zXrfyG.js.br +0 -0
- package/dist/web/assets/review-code-B9zXrfyG.js.gz +0 -0
- package/dist/web/assets/{save-as-dialog-BtGSwTKZ.js → save-as-dialog-5yBgewV3.js} +1 -1
- package/dist/web/assets/save-as-dialog-5yBgewV3.js.br +0 -0
- package/dist/web/assets/save-as-dialog-5yBgewV3.js.gz +0 -0
- package/dist/web/assets/{schedules-settings-section-CvlcMyEz.js → schedules-settings-section-BD3-tlU-.js} +1 -1
- package/dist/web/assets/schedules-settings-section-BD3-tlU-.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-BD3-tlU-.js.gz +0 -0
- package/dist/web/assets/{session-review-tab-C3HuIPD2.js → session-review-tab-DYJFhsGk.js} +1 -1
- package/dist/web/assets/session-review-tab-DYJFhsGk.js.br +0 -0
- package/dist/web/assets/session-review-tab-DYJFhsGk.js.gz +0 -0
- package/dist/web/assets/{settings-body-DCHEAh2_.js → settings-body-CWBVeKKg.js} +1 -1
- package/dist/web/assets/settings-body-CWBVeKKg.js.br +4 -0
- package/dist/web/assets/settings-body-CWBVeKKg.js.gz +0 -0
- package/dist/web/assets/{settings-rows-D8Y9o1ZD.js → settings-rows-B7fyQuu_.js} +1 -1
- package/dist/web/assets/settings-rows-B7fyQuu_.js.br +0 -0
- package/dist/web/assets/settings-rows-B7fyQuu_.js.gz +0 -0
- package/dist/web/assets/settings-section-content-BPQN6KdN.js +1 -0
- package/dist/web/assets/{settings-section-content-Dluhkh-u.js → settings-section-content-CoJcm6JM.js} +2 -2
- package/dist/web/assets/settings-section-content-CoJcm6JM.js.br +0 -0
- package/dist/web/assets/settings-section-content-CoJcm6JM.js.gz +0 -0
- package/dist/web/assets/{settings-tab-Cj1GkYi3.js → settings-tab-DWzU1RkL.js} +1 -1
- package/dist/web/assets/{settings-window-content-1fweMynB.js → settings-window-content-CAThkpa8.js} +1 -1
- package/dist/web/assets/{slash-command-picker-BdKd_AiS.js → slash-command-picker-dDl9riKP.js} +1 -1
- package/dist/web/assets/slash-command-picker-dDl9riKP.js.br +0 -0
- package/dist/web/assets/slash-command-picker-dDl9riKP.js.gz +0 -0
- package/dist/web/assets/{sql-object-tab-DkdF_7Jz.js → sql-object-tab-DND9osIv.js} +1 -1
- package/dist/web/assets/sql-object-tab-DND9osIv.js.br +0 -0
- package/dist/web/assets/sql-object-tab-DND9osIv.js.gz +0 -0
- package/dist/web/assets/{sqlite-viewer-BoQMjJHj.js → sqlite-viewer-P7UpXmyZ.js} +1 -1
- package/dist/web/assets/sqlite-viewer-P7UpXmyZ.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-P7UpXmyZ.js.gz +0 -0
- package/dist/web/assets/{structure-save-dialog-DGHxHJ4T.js → structure-save-dialog-DX1H1Qy2.js} +1 -1
- package/dist/web/assets/structure-save-dialog-DX1H1Qy2.js.br +0 -0
- package/dist/web/assets/structure-save-dialog-DX1H1Qy2.js.gz +0 -0
- package/dist/web/assets/{structure-tab-DuuX1e9c.js → structure-tab-1QhNP2ob.js} +1 -1
- package/dist/web/assets/structure-tab-1QhNP2ob.js.br +0 -0
- package/dist/web/assets/structure-tab-1QhNP2ob.js.gz +0 -0
- package/dist/web/assets/{system-monitor-body-CZVoh652.js → system-monitor-body-CPAAjIdT.js} +2 -2
- package/dist/web/assets/system-monitor-body-CPAAjIdT.js.br +0 -0
- package/dist/web/assets/system-monitor-body-CPAAjIdT.js.gz +0 -0
- package/dist/web/assets/{system-monitor-tab-eGta1jpw.js → system-monitor-tab-D_1PBGwv.js} +1 -1
- package/dist/web/assets/{system-monitor-window-content-BUG72ffC.js → system-monitor-window-content-dVxWFqHP.js} +1 -1
- package/dist/web/assets/{tab-host-window-content-BTYuY43x.js → tab-host-window-content-BBsg5_fz.js} +1 -1
- package/dist/web/assets/tab-host-window-content-BBsg5_fz.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-BBsg5_fz.js.gz +0 -0
- package/dist/web/assets/{table-tab-BsfgtqFE.js → table-tab-BO-q-hSc.js} +1 -1
- package/dist/web/assets/table-tab-BO-q-hSc.js.br +0 -0
- package/dist/web/assets/table-tab-BO-q-hSc.js.gz +0 -0
- package/dist/web/assets/{telegram-bot-token-field-CA8DEKRL.js → telegram-bot-token-field-BVYWBpX_.js} +1 -1
- package/dist/web/assets/telegram-bot-token-field-BVYWBpX_.js.br +0 -0
- package/dist/web/assets/telegram-bot-token-field-BVYWBpX_.js.gz +0 -0
- package/dist/web/assets/{terminal-tab-CoT5KIfe.js → terminal-tab-DjPXnuO8.js} +1 -1
- package/dist/web/assets/terminal-tab-DjPXnuO8.js.br +0 -0
- package/dist/web/assets/terminal-tab-DjPXnuO8.js.gz +0 -0
- package/dist/web/assets/{tool-cards-oZ6cptRr.js → tool-cards-DXV9SEE8.js} +3 -3
- package/dist/web/assets/tool-cards-DXV9SEE8.js.br +0 -0
- package/dist/web/assets/tool-cards-DXV9SEE8.js.gz +0 -0
- package/dist/web/assets/{tools-settings-section-CtcD-iTk.js → tools-settings-section-Cc5YKOB6.js} +1 -1
- package/dist/web/assets/tools-settings-section-Cc5YKOB6.js.br +0 -0
- package/dist/web/assets/tools-settings-section-Cc5YKOB6.js.gz +0 -0
- package/dist/web/assets/{use-inline-blame-BUuJj1Ru.js → use-inline-blame-f6WMZkEv.js} +1 -1
- package/dist/web/assets/use-inline-blame-f6WMZkEv.js.br +0 -0
- package/dist/web/assets/use-inline-blame-f6WMZkEv.js.gz +0 -0
- package/dist/web/assets/{use-lsp-Bo4z4gLx.js → use-lsp-B_fmU9ja.js} +1 -1
- package/dist/web/assets/use-lsp-B_fmU9ja.js.br +0 -0
- package/dist/web/assets/use-lsp-B_fmU9ja.js.gz +0 -0
- package/dist/web/assets/{use-monaco-theme-1ANtPWqA.js → use-monaco-theme-nu5Fogu3.js} +1 -1
- package/dist/web/assets/{use-process-kill-CvlXPal4.js → use-process-kill-B8Mf4_Yy.js} +1 -1
- package/dist/web/assets/use-process-kill-B8Mf4_Yy.js.br +0 -0
- package/dist/web/assets/use-process-kill-B8Mf4_Yy.js.gz +0 -0
- package/dist/web/assets/{use-sql-schema-info-DQzUqb7q.js → use-sql-schema-info-Dp6TCir5.js} +1 -1
- package/dist/web/assets/use-sql-schema-info-Dp6TCir5.js.br +0 -0
- package/dist/web/assets/use-sql-schema-info-Dp6TCir5.js.gz +0 -0
- package/dist/web/assets/{use-websocket-QCAD3F5b.js → use-websocket-RuENPZ_x.js} +1 -1
- package/dist/web/assets/web-preview-tab-ClOiV3BO.js +1 -0
- package/dist/web/assets/web-preview-tab-ClOiV3BO.js.br +0 -0
- package/dist/web/assets/web-preview-tab-ClOiV3BO.js.gz +0 -0
- package/dist/web/index.html +1 -1
- package/dist/web/index.html.br +0 -0
- package/dist/web/index.html.gz +0 -0
- package/dist/web/sw.js +1 -1
- package/dist/web/sw.js.br +0 -0
- package/dist/web/sw.js.gz +0 -0
- package/docs/architecture/ai-chat-and-providers.md +22 -0
- package/docs/architecture/workspace-and-ui.md +11 -0
- package/package.json +1 -1
- package/src/providers/codex-app-server/codex-event-mapper.ts +3 -0
- package/src/providers/codex-app-server/codex-provider.ts +3 -21
- package/src/providers/codex-app-server/codex-rollout-items.ts +3 -0
- package/src/providers/codex-app-server/codex-thread-params.ts +1 -0
- package/src/providers/codex-app-server/codex-user-input.ts +41 -0
- package/src/services/port-forward/forward-hop.ts +20 -5
- package/src/services/port-forward/preview-navigation.ts +45 -0
- package/src/shared/chat-questions.ts +19 -0
- package/src/web/components/chat/async-question-card.tsx +24 -0
- package/src/web/components/chat/chat-tab.tsx +3 -2
- package/src/web/components/chat/message-events.tsx +6 -0
- package/src/web/components/chat/question-card.tsx +8 -10
- package/src/web/components/chat/tool-cards.tsx +4 -4
- package/src/web/components/web-preview/web-preview-tab.tsx +38 -5
- package/dist/web/assets/accounts-settings-section-DhzuFkDO.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-DhzuFkDO.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-CZAmOwSU.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-CZAmOwSU.js.gz +0 -0
- package/dist/web/assets/agent-session-window-content-CwokWtJq.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-CwokWtJq.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-CT1JCaRQ.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-CT1JCaRQ.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-Ct9-lNqA.js.br +0 -0
- package/dist/web/assets/ai-settings-section-Ct9-lNqA.js.gz +0 -0
- package/dist/web/assets/android-tab-CUPQN2M4.js.br +0 -0
- package/dist/web/assets/android-tab-CUPQN2M4.js.gz +0 -0
- package/dist/web/assets/appearance-settings-section-DpYcNqXH.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-DpYcNqXH.js.gz +0 -0
- package/dist/web/assets/apps-panel-BqF_CkKy.js.br +0 -0
- package/dist/web/assets/apps-panel-BqF_CkKy.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-BEZqFSlw.js.br +0 -0
- package/dist/web/assets/branch-review-tab-BEZqFSlw.js.gz +0 -0
- package/dist/web/assets/chat-tab-N1B-Yv0P.js.br +0 -0
- package/dist/web/assets/chat-tab-N1B-Yv0P.js.gz +0 -0
- package/dist/web/assets/chat-tab-kk-mAF05.js +0 -16
- package/dist/web/assets/chat-tab-kk-mAF05.js.br +0 -0
- package/dist/web/assets/chat-tab-kk-mAF05.js.gz +0 -0
- package/dist/web/assets/code-editor-d1CXl2WL.js.br +0 -0
- package/dist/web/assets/code-editor-d1CXl2WL.js.gz +0 -0
- package/dist/web/assets/codex-reset-credit-button-CwSSBK6P.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-CwSSBK6P.js.gz +0 -0
- package/dist/web/assets/conflict-editor-BucKz-uE.js.br +0 -0
- package/dist/web/assets/conflict-editor-BucKz-uE.js.gz +0 -0
- package/dist/web/assets/connection-form-tab-DIc25Bko.js.br +0 -0
- package/dist/web/assets/connection-form-tab-DIc25Bko.js.gz +0 -0
- package/dist/web/assets/csv-preview-CqDaGV5N.js.br +0 -0
- package/dist/web/assets/csv-preview-CqDaGV5N.js.gz +0 -0
- package/dist/web/assets/db-tab-parts-lp8ROGQB.js.br +0 -0
- package/dist/web/assets/db-tab-parts-lp8ROGQB.js.gz +0 -0
- package/dist/web/assets/design-settings-section-DxWEBH1L.js.br +0 -0
- package/dist/web/assets/design-settings-section-DxWEBH1L.js.gz +0 -0
- package/dist/web/assets/design-tab-Cl0CMAUx.js.br +0 -0
- package/dist/web/assets/design-tab-Cl0CMAUx.js.gz +0 -0
- package/dist/web/assets/designs-sidebar-panel-aCr-EGfj.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-aCr-EGfj.js.gz +0 -0
- package/dist/web/assets/diff-viewer-XyJgWKwe.js.br +0 -0
- package/dist/web/assets/diff-viewer-XyJgWKwe.js.gz +0 -0
- package/dist/web/assets/docx-preview-KJaj2YGN.js.br +0 -0
- package/dist/web/assets/docx-preview-KJaj2YGN.js.gz +0 -0
- package/dist/web/assets/editor-dialog-9tW6c9mu.js.br +0 -0
- package/dist/web/assets/editor-dialog-9tW6c9mu.js.gz +0 -0
- package/dist/web/assets/editor-language-service-CkdO9ih8.js.br +0 -0
- package/dist/web/assets/editor-language-service-CkdO9ih8.js.gz +0 -0
- package/dist/web/assets/explorer-body-B8AkNO5o.js.br +0 -0
- package/dist/web/assets/explorer-body-B8AkNO5o.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-D174CXKz.js.br +0 -0
- package/dist/web/assets/explorer-window-content-D174CXKz.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-CQsqXsPF.js.br +0 -0
- package/dist/web/assets/extension-manager-section-CQsqXsPF.js.gz +0 -0
- package/dist/web/assets/extension-webview-AfaxC7PL.js.br +0 -0
- package/dist/web/assets/extension-webview-AfaxC7PL.js.gz +0 -0
- package/dist/web/assets/files-settings-section-CC0aJryq.js.br +0 -0
- package/dist/web/assets/files-settings-section-CC0aJryq.js.gz +0 -0
- package/dist/web/assets/general-settings-section-DQTr20G_.js.br +0 -0
- package/dist/web/assets/general-settings-section-DQTr20G_.js.gz +0 -0
- package/dist/web/assets/git-log-panel-CisEJPJz.js.br +0 -0
- package/dist/web/assets/git-log-panel-CisEJPJz.js.gz +0 -0
- package/dist/web/assets/git-review-tab-DpWEy03w.js.br +0 -0
- package/dist/web/assets/git-review-tab-DpWEy03w.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-hOML-uXP.js.br +0 -0
- package/dist/web/assets/glide-data-grid-hOML-uXP.js.gz +0 -0
- package/dist/web/assets/grid-save-dialog-Bx61akzH.js.br +0 -0
- package/dist/web/assets/grid-save-dialog-Bx61akzH.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-eQdJHa8d.js.br +0 -0
- package/dist/web/assets/group-chat-tab-eQdJHa8d.js.gz +0 -0
- package/dist/web/assets/impexp-tab-BjIDxYTj.js.br +0 -0
- package/dist/web/assets/impexp-tab-BjIDxYTj.js.gz +0 -0
- package/dist/web/assets/index-COwBji1t.js.br +0 -0
- package/dist/web/assets/index-COwBji1t.js.gz +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-BhyalK8A.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-BhyalK8A.js.gz +0 -0
- package/dist/web/assets/language-servers-section-BXLaicUY.js.br +0 -0
- package/dist/web/assets/language-servers-section-BXLaicUY.js.gz +0 -0
- package/dist/web/assets/logs-app-BnjU6CRy.js.br +0 -0
- package/dist/web/assets/logs-app-BnjU6CRy.js.gz +0 -0
- package/dist/web/assets/lsp-client-DOHnxEUE.js.br +0 -0
- package/dist/web/assets/lsp-client-DOHnxEUE.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-Dz0ZcxNo.js.br +0 -0
- package/dist/web/assets/markdown-renderer-Dz0ZcxNo.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-C_3dq99D.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-C_3dq99D.js.gz +0 -0
- package/dist/web/assets/new-design-dialog-CaubNbMT.js.br +0 -0
- package/dist/web/assets/new-design-dialog-CaubNbMT.js.gz +0 -0
- package/dist/web/assets/notifications-settings-section-CJJ1l5cL.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-CJJ1l5cL.js.gz +0 -0
- package/dist/web/assets/ppmbot-settings-section-BFniAm3D.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-BFniAm3D.js.gz +0 -0
- package/dist/web/assets/problems-panel-CIxaCYJw.js.br +0 -0
- package/dist/web/assets/problems-panel-CIxaCYJw.js.gz +0 -0
- package/dist/web/assets/process-table-l1fVcESX.js.br +0 -0
- package/dist/web/assets/process-table-l1fVcESX.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-Di5nBuy6.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-Di5nBuy6.js.gz +0 -0
- package/dist/web/assets/query-tab-hyKnRZr3.js.br +0 -0
- package/dist/web/assets/remote-access-settings-section-HpZAP0Al.js.br +0 -0
- package/dist/web/assets/remote-access-settings-section-HpZAP0Al.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-DY7tWgjf.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-DY7tWgjf.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-CX9mDRle.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-CX9mDRle.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DNg0EpbV.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DNg0EpbV.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-BTTLlVDc.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-BTTLlVDc.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-CqxnhSu0.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-CqxnhSu0.js.gz +0 -0
- package/dist/web/assets/rename-object-dialog-CnhMsNbT.js.br +0 -0
- package/dist/web/assets/rename-object-dialog-CnhMsNbT.js.gz +0 -0
- package/dist/web/assets/review-code-CunYhmcC.js.br +0 -0
- package/dist/web/assets/review-code-CunYhmcC.js.gz +0 -0
- package/dist/web/assets/save-as-dialog-BtGSwTKZ.js.br +0 -0
- package/dist/web/assets/save-as-dialog-BtGSwTKZ.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-CvlcMyEz.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-CvlcMyEz.js.gz +0 -0
- package/dist/web/assets/session-review-tab-C3HuIPD2.js.br +0 -0
- package/dist/web/assets/session-review-tab-C3HuIPD2.js.gz +0 -0
- package/dist/web/assets/settings-body-DCHEAh2_.js.br +0 -0
- package/dist/web/assets/settings-body-DCHEAh2_.js.gz +0 -0
- package/dist/web/assets/settings-rows-D8Y9o1ZD.js.br +0 -0
- package/dist/web/assets/settings-rows-D8Y9o1ZD.js.gz +0 -0
- package/dist/web/assets/settings-section-content-BXPg2H0N.js +0 -1
- package/dist/web/assets/settings-section-content-Dluhkh-u.js.br +0 -0
- package/dist/web/assets/settings-section-content-Dluhkh-u.js.gz +0 -0
- package/dist/web/assets/slash-command-picker-BdKd_AiS.js.br +0 -0
- package/dist/web/assets/slash-command-picker-BdKd_AiS.js.gz +0 -0
- package/dist/web/assets/sql-object-tab-DkdF_7Jz.js.br +0 -0
- package/dist/web/assets/sql-object-tab-DkdF_7Jz.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-BoQMjJHj.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-BoQMjJHj.js.gz +0 -0
- package/dist/web/assets/structure-save-dialog-DGHxHJ4T.js.br +0 -0
- package/dist/web/assets/structure-save-dialog-DGHxHJ4T.js.gz +0 -0
- package/dist/web/assets/structure-tab-DuuX1e9c.js.br +0 -0
- package/dist/web/assets/structure-tab-DuuX1e9c.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-CZVoh652.js.br +0 -0
- package/dist/web/assets/system-monitor-body-CZVoh652.js.gz +0 -0
- package/dist/web/assets/tab-host-window-content-BTYuY43x.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-BTYuY43x.js.gz +0 -0
- package/dist/web/assets/table-tab-BsfgtqFE.js.br +0 -0
- package/dist/web/assets/table-tab-BsfgtqFE.js.gz +0 -0
- package/dist/web/assets/telegram-bot-token-field-CA8DEKRL.js.br +0 -0
- package/dist/web/assets/telegram-bot-token-field-CA8DEKRL.js.gz +0 -0
- package/dist/web/assets/terminal-tab-CoT5KIfe.js.br +0 -0
- package/dist/web/assets/terminal-tab-CoT5KIfe.js.gz +0 -0
- package/dist/web/assets/tool-cards-oZ6cptRr.js.br +0 -0
- package/dist/web/assets/tool-cards-oZ6cptRr.js.gz +0 -0
- package/dist/web/assets/tools-settings-section-CtcD-iTk.js.br +0 -0
- package/dist/web/assets/tools-settings-section-CtcD-iTk.js.gz +0 -0
- package/dist/web/assets/use-inline-blame-BUuJj1Ru.js.br +0 -0
- package/dist/web/assets/use-inline-blame-BUuJj1Ru.js.gz +0 -0
- package/dist/web/assets/use-lsp-Bo4z4gLx.js.br +0 -0
- package/dist/web/assets/use-lsp-Bo4z4gLx.js.gz +0 -0
- package/dist/web/assets/use-process-kill-CvlXPal4.js.br +0 -0
- package/dist/web/assets/use-process-kill-CvlXPal4.js.gz +0 -0
- package/dist/web/assets/use-sql-schema-info-DQzUqb7q.js.br +0 -0
- package/dist/web/assets/use-sql-schema-info-DQzUqb7q.js.gz +0 -0
- package/dist/web/assets/web-preview-tab-Cp0LuL0T.js +0 -1
- package/dist/web/assets/web-preview-tab-Cp0LuL0T.js.br +0 -0
- package/dist/web/assets/web-preview-tab-Cp0LuL0T.js.gz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{L as r,P as i,li as a,xr as o}from"./icons-BwyIKaTT.js";import{a as s,k as c,r as l}from"./api-client-xQDlhUTu.js";import{n as u}from"./utils-Bslrbb-G.js";import"./portal-container-context-NBi-KGK0.js";import"./context-menu-BCuZYfWC.js";import{n as d}from"./use-is-mobile-VRV9eZy1.js";import"./button-C9ZXWb3b.js";import{a as f,n as p,o as m,t as h}from"./dialog-Dn_2tuYa.js";import{t as g}from"./mobile-bottom-sheet-DArbIyrD.js";import"./use-visual-viewport-MmugpRg-.js";import{c as _,l as v,n as y,o as b,r as x,s as S,t as C,u as w}from"./adaptive-context-menu-C4jNSORA.js";import{ai as ee}from"./index-COwBji1t.js";import{r as T}from"./format-bytes-he3TR0bV.js";import{a as E,i as D,n as O,o as k,r as A,s as j,t as M}from"./process-row-format-CytRH7g2.js";import{r as te,t as N}from"./use-process-kill-CvlXPal4.js";import{n as P,r as ne,t as F}from"./sortable-header-DwzTFLkG.js";var I=e(t(),1),L=[`swap`,`disk`,`gpu`,`net`],R={cpu:64,ram:80,swap:80,disk:120,gpu:90,net:120},z=`minmax(0,1fr)`,B=`44px`;function V(e){return e===`swap`||e===`disk`||e===`gpu`||e===`net`}function H(e){return Math.round(Math.min(400,Math.max(48,e)))}function U(e,t){let n=t[e];return typeof n==`number`&&Number.isFinite(n)?H(n):R[e]}function re(e,t,n={}){let r=L.filter(t=>e[t]),i=V(t)&&e[t]?t:null,a=e=>`${U(e,n)}px`,o=[z,a(`cpu`),a(`ram`)];return{wideTemplate:[...o,...r.map(a),B].join(` `),narrowTemplate:[...o,...i?[a(i)]:[],B].join(` `),columns:e,narrowExtra:i}}var W=`grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]`;function ie(e){return{"--sysmon-grid-n":e.narrowTemplate,"--sysmon-grid-w":e.wideTemplate}}function G(e,t){return e.narrowExtra===t?`block`:`hidden @lg:block`}var K=n(),q=150;function J({mode:e,onModeChange:t,ppmOnly:n,onPpmOnlyChange:r,onQueryChange:i}){let[a,s]=(0,I.useState)(``),c=(0,I.useRef)(null);return(0,I.useEffect)(()=>(c.current&&clearTimeout(c.current),c.current=setTimeout(()=>i(a),q),()=>{c.current&&clearTimeout(c.current)}),[a]),(0,K.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 p-2 border-b border-border shrink-0`,children:[(0,K.jsxs)(`div`,{className:`relative flex-1 min-w-[140px]`,children:[(0,K.jsx)(o,{className:`absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-text-subtle`}),(0,K.jsx)(`input`,{type:`text`,value:a,onChange:e=>s(e.target.value),placeholder:`Search processes`,"aria-label":`Search processes`,"data-testid":`sysmon-process-search`,className:`w-full min-h-11 md:min-h-8 pl-7 pr-2 text-sm rounded-md border border-border bg-transparent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`})]}),(0,K.jsx)(`button`,{type:`button`,onClick:()=>t(e===`grouped`?`flat`:`grouped`),"aria-pressed":e===`flat`,"data-testid":`sysmon-toggle-flat`,className:`min-h-11 md:min-h-8 px-3 text-xs rounded-md border border-border hover:bg-surface-hover transition-colors`,children:e===`flat`?`Flat`:`Grouped`}),(0,K.jsx)(`button`,{type:`button`,onClick:()=>r(!n),"aria-pressed":n,"data-testid":`sysmon-filter-ppm`,className:u(`min-h-11 md:min-h-8 px-3 text-xs rounded-md border transition-colors`,n?`border-primary bg-primary/10 text-primary`:`border-border hover:bg-surface-hover`),children:`PPM only`})]})}function Y({sortKey:e,sortDir:t,grid:n,onSort:r,resize:i}){let a={activeKey:e,activeDir:t,onClick:r,resize:i};return(0,K.jsxs)(`div`,{role:`row`,className:u(`grid gap-1 px-3 py-1.5 text-[11px] text-text-subtle border-b border-border sticky top-0 bg-background z-10`,W),children:[(0,K.jsx)(F,{label:`Process`,field:`name`,...a,resize:void 0,align:`left`,testId:`sysmon-sort-name`}),(0,K.jsx)(F,{label:`CPU`,field:`cpu`,...a,resizeKey:`cpu`,testId:`sysmon-sort-cpu`}),(0,K.jsx)(F,{label:`RAM`,field:`ram`,...a,resizeKey:`ram`,testId:`sysmon-sort-ram`}),n.columns.swap&&(0,K.jsx)(F,{label:`Swap`,field:`swap`,...a,resizeKey:`swap`,testId:`sysmon-col-swap`,className:G(n,`swap`)}),n.columns.disk&&(0,K.jsx)(F,{label:`Disk`,field:`disk`,...a,resizeKey:`disk`,testId:`sysmon-col-disk`,className:G(n,`disk`)}),n.columns.gpu&&(0,K.jsx)(F,{label:`GPU`,field:`gpu`,...a,resizeKey:`gpu`,testId:`sysmon-col-gpu`,className:G(n,`gpu`)}),n.columns.net&&(0,K.jsx)(F,{label:`Net`,field:`net`,...a,resizeKey:`net`,testId:`sysmon-col-net`,className:G(n,`net`)}),(0,K.jsx)(`span`,{})]})}function ae({totals:e,grid:t,gpuUtilPercent:n}){return(0,K.jsxs)(`div`,{className:u(`grid gap-1 px-3 py-1.5 text-xs font-medium border-t border-border shrink-0`,W),"data-testid":`sysmon-total`,"data-process-count":e.count,children:[(0,K.jsxs)(`span`,{className:`truncate`,children:[`Total (`,e.count,` processes)`]}),(0,K.jsxs)(`span`,{className:u(`text-right`,M(e.cpu)),children:[e.cpu.toFixed(1),`%`]}),(0,K.jsx)(`span`,{className:`text-right text-text-secondary`,children:T(e.ramMB)}),t.columns.swap&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(t,`swap`)),children:k(e.swapMB)}),t.columns.disk&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(t,`disk`)),children:A(e.diskReadBps,e.diskWriteBps)}),t.columns.gpu&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(t,`gpu`)),children:D(n,e.gpuMemMB,t.columns.gpuMemory!==!1)}),t.columns.net&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(t,`net`)),children:E(e.netInBps,e.netOutBps)}),(0,K.jsx)(`span`,{})]})}var oe=`Protected: this app contains a PPM or OS-critical process — cannot be ended as a whole.`;function se({group:e,expanded:t,grid:n,killProtected:o,onToggle:s,onKillClick:c}){let l=t?i:r;return(0,K.jsxs)(`div`,{className:`grid items-center gap-1 min-h-11 md:min-h-7 px-3 text-xs cursor-pointer hover:bg-surface-hover transition-colors group/proc grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]`,onClick:()=>s(e.key),"data-testid":`sysmon-group-row`,"data-group-key":e.key,"data-count":e.count,"data-disk-bps":j(e.diskReadBps,e.diskWriteBps),"data-gpu-pct":e.gpuPct,"data-net-bps":j(e.netInBps,e.netOutBps),children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 min-w-0`,children:[(0,K.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),s(e.key)},"aria-expanded":t,"aria-label":`${t?`Collapse`:`Expand`} ${e.label}`,"data-testid":`sysmon-group-expand`,className:`flex items-center justify-center size-11 md:size-7 -ml-2 shrink-0`,children:(0,K.jsx)(l,{className:`size-3.5 text-text-subtle`})}),(0,K.jsx)(`span`,{className:`truncate font-medium`,children:e.label}),(0,K.jsxs)(`span`,{className:`text-text-subtle shrink-0`,children:[`(`,e.count,`)`]})]}),(0,K.jsxs)(`span`,{className:u(`text-right`,M(e.cpu)),children:[e.cpu.toFixed(1),`%`]}),(0,K.jsx)(`span`,{className:`text-right text-text-secondary`,children:T(e.ramMB)}),n.columns.swap&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`swap`)),children:k(e.swapMB)}),n.columns.disk&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`disk`)),children:A(e.diskReadBps,e.diskWriteBps)}),n.columns.gpu&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`gpu`)),children:D(e.gpuPct,e.gpuMemMB,n.columns.gpuMemory!==!1)}),n.columns.net&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`net`)),children:E(e.netInBps,e.netOutBps)}),(0,K.jsx)(`div`,{className:`flex justify-end`,children:(0,K.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),c(e)},disabled:o,"aria-label":`End ${e.label} and its ${e.count} processes`,title:o?oe:`End ${e.label} (${e.count} processes)`,"data-testid":`sysmon-group-kill-btn`,className:u(`flex items-center justify-center size-11 md:size-7 rounded transition-all`,`can-hover:opacity-0 can-hover:group-hover/proc:opacity-100`,o?`opacity-40 cursor-not-allowed`:`hover:bg-error/20 hover:text-error active:bg-error/30`),children:(0,K.jsx)(a,{className:`size-3.5`})})})]})}var ce=`Protected: PPM or OS-critical process — cannot be ended.`;function le({proc:e,indent:t,grid:n,onKillClick:r}){return(0,K.jsxs)(`div`,{className:`grid items-center gap-1 min-h-11 md:min-h-7 px-3 text-xs group/proc hover:bg-surface-hover transition-colors grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]`,"data-testid":`sysmon-process-row`,"data-pid":e.pid,"data-ppm":e.ppm,"data-protected":e.protected,"data-swap-mb":e.swapMB,"data-disk-bps":j(e.diskReadBps,e.diskWriteBps),"data-gpu-pct":e.gpuPct,"data-net-bps":j(e.netInBps,e.netOutBps),children:[(0,K.jsxs)(`div`,{className:u(`flex items-start gap-1.5 min-w-0`,t&&`pl-6`),children:[(0,K.jsx)(`span`,{className:`text-text-subtle shrink-0`,children:e.pid}),(0,K.jsx)(`span`,{className:`truncate text-text-secondary`,title:e.startedAt?`${e.command}\nRunning ${O(e.startedAt)}`:e.command,children:e.command})]}),(0,K.jsxs)(`span`,{className:u(`text-right`,M(e.cpu)),children:[e.cpu.toFixed(1),`%`]}),(0,K.jsx)(`span`,{className:`text-right text-text-secondary`,children:T(e.ramMB)}),n.columns.swap&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`swap`)),children:k(e.swapMB)}),n.columns.disk&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`disk`)),children:A(e.diskReadBps,e.diskWriteBps)}),n.columns.gpu&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`gpu`)),children:D(e.gpuPct,e.gpuMemMB,n.columns.gpuMemory!==!1)}),n.columns.net&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`net`)),children:E(e.netInBps,e.netOutBps)}),(0,K.jsx)(`div`,{className:`flex justify-end`,children:(0,K.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),r(e)},disabled:e.protected,"aria-label":`End process ${e.name} (${e.pid})`,title:e.protected?ce:`End process ${e.name}`,"data-testid":`sysmon-kill-btn`,className:u(`flex items-center justify-center size-11 md:size-7 rounded transition-all`,`can-hover:opacity-0 can-hover:group-hover/proc:opacity-100`,e.protected?`opacity-40 cursor-not-allowed`:`hover:bg-error/20 hover:text-error active:bg-error/30`),children:(0,K.jsx)(a,{className:`size-3.5`})})})]})}var ue={STOP:`Suspend (SIGSTOP)`,CONT:`Continue (SIGCONT)`,TERM:`Terminate (SIGTERM)`,KILL:`Kill (SIGKILL)`,HUP:`Hang up (SIGHUP)`,INT:`Interrupt (SIGINT)`,USR1:`User signal 1`,USR2:`User signal 2`},de=[`KILL`,`STOP`];async function fe(e){let t=s(),n={"Content-Type":`application/json`,"X-PPM-Request":`1`};t&&(n.Authorization=`Bearer ${t}`);let r=await fetch(`/api/system/resources/signal`,{method:`POST`,headers:n,body:JSON.stringify(e)}),i;try{i=await r.json()}catch{throw Error(r.ok?`Empty response from server`:`Server error (HTTP ${r.status})`)}if(i.ok===!1)throw Error(i.error??`HTTP ${r.status}`);return i.data}function pe(e,t,n){return{pid:e.pid,startedAt:e.startedAt,signal:t,tree:n}}function me(){let[e,t]=(0,I.useState)(null);return{send:(0,I.useCallback)(async(e,n,r=!1)=>{t(e.pid);try{let t=(await fe(pe(e,n,r))).signalled.length;c.success(t>1?`Sent SIG${n} to ${e.name} and ${t-1} child processes`:`Sent SIG${n} to ${e.name} (${e.pid})`)}catch(t){c.error(t instanceof Error?t.message:`Could not signal ${e.name}`)}finally{t(null)}},[]),pending:e}}function he({proc:e,signals:t,onDetails:n,onKill:r,onSignal:i,children:a}){return(0,K.jsxs)(C,{children:[(0,K.jsx)(w,{asChild:!0,children:(0,K.jsx)(`div`,{className:`select-none`,children:a})}),(0,K.jsxs)(y,{children:[(0,K.jsx)(x,{onSelect:()=>n(e),children:`Details…`}),t.length>0&&(0,K.jsxs)(S,{children:[(0,K.jsx)(v,{children:`Send signal`}),(0,K.jsx)(_,{children:t.map(t=>(0,K.jsx)(x,{variant:de.includes(t)?`destructive`:void 0,disabled:e.protected,onSelect:()=>{e.protected||i(e,t,!1)},children:ue[t]},t))})]}),(0,K.jsx)(b,{}),(0,K.jsx)(x,{variant:`destructive`,disabled:e.protected,onSelect:()=>{e.protected||r(e)},children:`End process`}),e.protected&&(0,K.jsx)(`p`,{className:`px-2 py-1.5 text-[11px] text-text-subtle max-w-64`,children:`PPM or OS-critical process — it cannot be ended or signalled.`})]})]})}function ge(e){return e>0?new Date(e).toLocaleString():`—`}function _e({pid:e,name:t,onClose:n}){let r=d(),[i,a]=(0,I.useState)(null),[o,s]=(0,I.useState)(null);if((0,I.useEffect)(()=>{if(e===null){a(null),s(null);return}let t=!0;return a(null),s(null),l.get(`/api/system/resources/process/${e}`).then(e=>{t&&a(e)}).catch(e=>{t&&s(e instanceof Error?e.message:`Could not read the process`)}),()=>{t=!1}},[e]),e===null)return null;let c=(0,K.jsxs)(`div`,{className:`space-y-3`,"data-testid":`sysmon-process-details`,"data-pid":e,children:[o&&(0,K.jsx)(`p`,{className:`text-sm text-error`,children:o}),!o&&i===null&&(0,K.jsx)(`p`,{className:`text-sm text-text-subtle`,children:`Reading /proc…`}),i&&(0,K.jsxs)(K.Fragment,{children:[(0,K.jsxs)(`dl`,{className:`grid grid-cols-2 gap-x-4 gap-y-2 text-xs`,children:[(0,K.jsx)(X,{label:`PID`,value:i.pid}),(0,K.jsx)(X,{label:`Parent PID`,value:i.ppid}),(0,K.jsx)(X,{label:`User`,value:i.user}),(0,K.jsx)(X,{label:`State`,value:i.state}),(0,K.jsx)(X,{label:`Threads`,value:i.threads}),(0,K.jsx)(X,{label:`Nice`,value:i.nice}),(0,K.jsx)(X,{label:`Started`,value:ge(i.startedAt)}),(0,K.jsx)(X,{label:`Control group`,value:i.cgroup})]}),(0,K.jsx)(Z,{label:`Executable`,value:i.exe}),(0,K.jsx)(Z,{label:`Working directory`,value:i.cwd}),(0,K.jsx)(Z,{label:`Command line`,value:i.command,mono:!0})]})]});return r?(0,K.jsx)(g,{open:!0,onClose:n,children:(0,K.jsxs)(`div`,{className:`px-4 pb-4 space-y-3`,children:[(0,K.jsx)(`h2`,{className:`text-base font-semibold break-all`,children:t}),c]})}):(0,K.jsx)(h,{open:!0,onOpenChange:e=>!e&&n(),children:(0,K.jsxs)(p,{className:`sm:max-w-xl`,children:[(0,K.jsx)(f,{children:(0,K.jsx)(m,{className:`break-all`,children:t})}),c]})})}function X({label:e,value:t}){let n=t===null||t===``?`—`:String(t);return(0,K.jsxs)(`div`,{className:`min-w-0`,children:[(0,K.jsx)(`dt`,{className:`text-text-subtle`,children:e}),(0,K.jsx)(`dd`,{className:`truncate`,title:n,children:n})]})}function Z({label:e,value:t,mono:n}){return(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:e}),(0,K.jsx)(`p`,{className:`text-xs break-all ${n?`font-mono`:``}`,children:t??`—`})]})}var Q=`ppm-sysmon-col-widths`;function ve(){try{let e=localStorage.getItem(Q);if(!e)return{};let t=JSON.parse(e),n={};for(let e of[`cpu`,`ram`,`disk`,`gpu`,`net`]){let r=t[e];typeof r==`number`&&Number.isFinite(r)&&(n[e]=H(r))}return n}catch{return{}}}function $(e){try{Object.keys(e).length===0?localStorage.removeItem(Q):localStorage.setItem(Q,JSON.stringify(e))}catch{}}function ye(){let[e,t]=(0,I.useState)(()=>typeof localStorage>`u`?{}:ve()),n=(0,I.useRef)(null);return(0,I.useEffect)(()=>{let e=e=>{let r=n.current;if(!r)return;let i=H(r.startWidth+(e.clientX-r.startX));t(e=>e[r.key]===i?e:{...e,[r.key]:i})},r=()=>{n.current&&(n.current=null,document.body.style.cursor=``,t(e=>($(e),e)))};return window.addEventListener(`pointermove`,e),window.addEventListener(`pointerup`,r),window.addEventListener(`pointercancel`,r),()=>{window.removeEventListener(`pointermove`,e),window.removeEventListener(`pointerup`,r),window.removeEventListener(`pointercancel`,r)}},[]),{widths:e,begin:(0,I.useCallback)((t,r)=>{r.preventDefault(),n.current={key:t,startX:r.clientX,startWidth:U(t,e)},document.body.style.cursor=`col-resize`},[e]),reset:(0,I.useCallback)(e=>{t(t=>{if(!(e in t))return t;let{[e]:n,...r}=t;return $(r),r})},[])}}var be={disk:!1,gpu:!1,net:!1};function xe({snapshot:e}){let t=d(),n=(0,I.useRef)(null),[r,i]=(0,I.useState)(`grouped`),[a,o]=(0,I.useState)(!1),[s,c]=(0,I.useState)(``),[l,u]=(0,I.useState)(null),[f,p]=(0,I.useState)(`desc`),[m,h]=(0,I.useState)(()=>new Set),{pendingKill:g,groupProtected:_,requestKillProcess:v,requestKillGroup:y,confirmKill:b,cancelKill:x}=N(e),{send:S}=me(),[C,w]=(0,I.useState)(null),T=e.signals??[],{widths:E,begin:D,reset:O}=ye(),{rows:k,totals:A}=(0,I.useMemo)(()=>P({processes:e.processes,groups:e.groups,mode:r,ppmOnly:a,query:s,sortKey:l,sortDir:f,expanded:m}),[e.processes,e.groups,r,a,s,l,f,m]),j=e.processColumns??be,M=(0,I.useMemo)(()=>re(j,l,E),[j,l,E]),F=e.system.gpus[0]?.utilPercent,L=ee({count:k.length,getScrollElement:()=>n.current,estimateSize:()=>t?44:28,overscan:12}),R=(0,I.useCallback)(e=>{let[t,n]=ne(l,f,e);u(t),p(n)},[l,f]),z=(0,I.useCallback)(e=>{h(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]);return(0,K.jsxs)(`div`,{className:`h-full flex flex-col min-h-0 @container`,style:ie(M),"data-testid":`sysmon-processes`,"data-row-count":k.length,children:[(0,K.jsx)(J,{mode:r,onModeChange:i,ppmOnly:a,onPpmOnlyChange:o,onQueryChange:c}),(0,K.jsx)(Y,{sortKey:l,sortDir:f,grid:M,onSort:R,resize:{onResizeStart:D,onResizeReset:O}}),(0,K.jsx)(`div`,{ref:n,className:`flex-1 min-h-0 overflow-y-auto`,children:(0,K.jsx)(`div`,{style:{height:L.getTotalSize(),position:`relative`},children:L.getVirtualItems().map(e=>{let t=k[e.index];return t?(0,K.jsx)(`div`,{style:{position:`absolute`,top:0,left:0,right:0,transform:`translateY(${e.start}px)`},children:t.kind===`group`?(0,K.jsx)(se,{group:t.group,expanded:t.expanded,grid:M,killProtected:_.get(t.group.key)??!0,onToggle:z,onKillClick:y}):(0,K.jsx)(he,{proc:t.proc,signals:T,onDetails:w,onKill:v,onSignal:(e,t,n)=>void S(e,t,n),children:(0,K.jsx)(le,{proc:t.proc,indent:t.indent,grid:M,onKillClick:v})})},t.kind===`group`?t.group.key:`p:${t.proc.pid}`):null})})}),(0,K.jsx)(ae,{totals:A,grid:M,gpuUtilPercent:F}),(0,K.jsx)(te,{target:g,onConfirm:b,onCancel:x}),(0,K.jsx)(_e,{pid:C?.pid??null,name:C?.name??``,onClose:()=>w(null)})]})}export{xe as ProcessTable};
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{L as r,P as i,li as a,xr as o}from"./icons-BwyIKaTT.js";import{a as s,k as c,r as l}from"./api-client-xQDlhUTu.js";import{n as u}from"./utils-Bslrbb-G.js";import"./portal-container-context-NBi-KGK0.js";import"./context-menu-BCuZYfWC.js";import{n as d}from"./use-is-mobile-VRV9eZy1.js";import"./button-C9ZXWb3b.js";import{a as f,n as p,o as m,t as h}from"./dialog-Dn_2tuYa.js";import{t as g}from"./mobile-bottom-sheet-DArbIyrD.js";import"./use-visual-viewport-MmugpRg-.js";import{c as _,l as v,n as y,o as b,r as x,s as S,t as C,u as w}from"./adaptive-context-menu-C4jNSORA.js";import{ai as ee}from"./index-EznfgwH9.js";import{r as T}from"./format-bytes-he3TR0bV.js";import{a as E,i as D,n as O,o as k,r as A,s as j,t as M}from"./process-row-format-CytRH7g2.js";import{r as te,t as N}from"./use-process-kill-B8Mf4_Yy.js";import{n as P,r as ne,t as F}from"./sortable-header-DwzTFLkG.js";var I=e(t(),1),L=[`swap`,`disk`,`gpu`,`net`],R={cpu:64,ram:80,swap:80,disk:120,gpu:90,net:120},z=`minmax(0,1fr)`,B=`44px`;function V(e){return e===`swap`||e===`disk`||e===`gpu`||e===`net`}function H(e){return Math.round(Math.min(400,Math.max(48,e)))}function U(e,t){let n=t[e];return typeof n==`number`&&Number.isFinite(n)?H(n):R[e]}function re(e,t,n={}){let r=L.filter(t=>e[t]),i=V(t)&&e[t]?t:null,a=e=>`${U(e,n)}px`,o=[z,a(`cpu`),a(`ram`)];return{wideTemplate:[...o,...r.map(a),B].join(` `),narrowTemplate:[...o,...i?[a(i)]:[],B].join(` `),columns:e,narrowExtra:i}}var W=`grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]`;function ie(e){return{"--sysmon-grid-n":e.narrowTemplate,"--sysmon-grid-w":e.wideTemplate}}function G(e,t){return e.narrowExtra===t?`block`:`hidden @lg:block`}var K=n(),q=150;function J({mode:e,onModeChange:t,ppmOnly:n,onPpmOnlyChange:r,onQueryChange:i}){let[a,s]=(0,I.useState)(``),c=(0,I.useRef)(null);return(0,I.useEffect)(()=>(c.current&&clearTimeout(c.current),c.current=setTimeout(()=>i(a),q),()=>{c.current&&clearTimeout(c.current)}),[a]),(0,K.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 p-2 border-b border-border shrink-0`,children:[(0,K.jsxs)(`div`,{className:`relative flex-1 min-w-[140px]`,children:[(0,K.jsx)(o,{className:`absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-text-subtle`}),(0,K.jsx)(`input`,{type:`text`,value:a,onChange:e=>s(e.target.value),placeholder:`Search processes`,"aria-label":`Search processes`,"data-testid":`sysmon-process-search`,className:`w-full min-h-11 md:min-h-8 pl-7 pr-2 text-sm rounded-md border border-border bg-transparent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`})]}),(0,K.jsx)(`button`,{type:`button`,onClick:()=>t(e===`grouped`?`flat`:`grouped`),"aria-pressed":e===`flat`,"data-testid":`sysmon-toggle-flat`,className:`min-h-11 md:min-h-8 px-3 text-xs rounded-md border border-border hover:bg-surface-hover transition-colors`,children:e===`flat`?`Flat`:`Grouped`}),(0,K.jsx)(`button`,{type:`button`,onClick:()=>r(!n),"aria-pressed":n,"data-testid":`sysmon-filter-ppm`,className:u(`min-h-11 md:min-h-8 px-3 text-xs rounded-md border transition-colors`,n?`border-primary bg-primary/10 text-primary`:`border-border hover:bg-surface-hover`),children:`PPM only`})]})}function Y({sortKey:e,sortDir:t,grid:n,onSort:r,resize:i}){let a={activeKey:e,activeDir:t,onClick:r,resize:i};return(0,K.jsxs)(`div`,{role:`row`,className:u(`grid gap-1 px-3 py-1.5 text-[11px] text-text-subtle border-b border-border sticky top-0 bg-background z-10`,W),children:[(0,K.jsx)(F,{label:`Process`,field:`name`,...a,resize:void 0,align:`left`,testId:`sysmon-sort-name`}),(0,K.jsx)(F,{label:`CPU`,field:`cpu`,...a,resizeKey:`cpu`,testId:`sysmon-sort-cpu`}),(0,K.jsx)(F,{label:`RAM`,field:`ram`,...a,resizeKey:`ram`,testId:`sysmon-sort-ram`}),n.columns.swap&&(0,K.jsx)(F,{label:`Swap`,field:`swap`,...a,resizeKey:`swap`,testId:`sysmon-col-swap`,className:G(n,`swap`)}),n.columns.disk&&(0,K.jsx)(F,{label:`Disk`,field:`disk`,...a,resizeKey:`disk`,testId:`sysmon-col-disk`,className:G(n,`disk`)}),n.columns.gpu&&(0,K.jsx)(F,{label:`GPU`,field:`gpu`,...a,resizeKey:`gpu`,testId:`sysmon-col-gpu`,className:G(n,`gpu`)}),n.columns.net&&(0,K.jsx)(F,{label:`Net`,field:`net`,...a,resizeKey:`net`,testId:`sysmon-col-net`,className:G(n,`net`)}),(0,K.jsx)(`span`,{})]})}function ae({totals:e,grid:t,gpuUtilPercent:n}){return(0,K.jsxs)(`div`,{className:u(`grid gap-1 px-3 py-1.5 text-xs font-medium border-t border-border shrink-0`,W),"data-testid":`sysmon-total`,"data-process-count":e.count,children:[(0,K.jsxs)(`span`,{className:`truncate`,children:[`Total (`,e.count,` processes)`]}),(0,K.jsxs)(`span`,{className:u(`text-right`,M(e.cpu)),children:[e.cpu.toFixed(1),`%`]}),(0,K.jsx)(`span`,{className:`text-right text-text-secondary`,children:T(e.ramMB)}),t.columns.swap&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(t,`swap`)),children:k(e.swapMB)}),t.columns.disk&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(t,`disk`)),children:A(e.diskReadBps,e.diskWriteBps)}),t.columns.gpu&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(t,`gpu`)),children:D(n,e.gpuMemMB,t.columns.gpuMemory!==!1)}),t.columns.net&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(t,`net`)),children:E(e.netInBps,e.netOutBps)}),(0,K.jsx)(`span`,{})]})}var oe=`Protected: this app contains a PPM or OS-critical process — cannot be ended as a whole.`;function se({group:e,expanded:t,grid:n,killProtected:o,onToggle:s,onKillClick:c}){let l=t?i:r;return(0,K.jsxs)(`div`,{className:`grid items-center gap-1 min-h-11 md:min-h-7 px-3 text-xs cursor-pointer hover:bg-surface-hover transition-colors group/proc grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]`,onClick:()=>s(e.key),"data-testid":`sysmon-group-row`,"data-group-key":e.key,"data-count":e.count,"data-disk-bps":j(e.diskReadBps,e.diskWriteBps),"data-gpu-pct":e.gpuPct,"data-net-bps":j(e.netInBps,e.netOutBps),children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 min-w-0`,children:[(0,K.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),s(e.key)},"aria-expanded":t,"aria-label":`${t?`Collapse`:`Expand`} ${e.label}`,"data-testid":`sysmon-group-expand`,className:`flex items-center justify-center size-11 md:size-7 -ml-2 shrink-0`,children:(0,K.jsx)(l,{className:`size-3.5 text-text-subtle`})}),(0,K.jsx)(`span`,{className:`truncate font-medium`,children:e.label}),(0,K.jsxs)(`span`,{className:`text-text-subtle shrink-0`,children:[`(`,e.count,`)`]})]}),(0,K.jsxs)(`span`,{className:u(`text-right`,M(e.cpu)),children:[e.cpu.toFixed(1),`%`]}),(0,K.jsx)(`span`,{className:`text-right text-text-secondary`,children:T(e.ramMB)}),n.columns.swap&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`swap`)),children:k(e.swapMB)}),n.columns.disk&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`disk`)),children:A(e.diskReadBps,e.diskWriteBps)}),n.columns.gpu&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`gpu`)),children:D(e.gpuPct,e.gpuMemMB,n.columns.gpuMemory!==!1)}),n.columns.net&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`net`)),children:E(e.netInBps,e.netOutBps)}),(0,K.jsx)(`div`,{className:`flex justify-end`,children:(0,K.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),c(e)},disabled:o,"aria-label":`End ${e.label} and its ${e.count} processes`,title:o?oe:`End ${e.label} (${e.count} processes)`,"data-testid":`sysmon-group-kill-btn`,className:u(`flex items-center justify-center size-11 md:size-7 rounded transition-all`,`can-hover:opacity-0 can-hover:group-hover/proc:opacity-100`,o?`opacity-40 cursor-not-allowed`:`hover:bg-error/20 hover:text-error active:bg-error/30`),children:(0,K.jsx)(a,{className:`size-3.5`})})})]})}var ce=`Protected: PPM or OS-critical process — cannot be ended.`;function le({proc:e,indent:t,grid:n,onKillClick:r}){return(0,K.jsxs)(`div`,{className:`grid items-center gap-1 min-h-11 md:min-h-7 px-3 text-xs group/proc hover:bg-surface-hover transition-colors grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]`,"data-testid":`sysmon-process-row`,"data-pid":e.pid,"data-ppm":e.ppm,"data-protected":e.protected,"data-swap-mb":e.swapMB,"data-disk-bps":j(e.diskReadBps,e.diskWriteBps),"data-gpu-pct":e.gpuPct,"data-net-bps":j(e.netInBps,e.netOutBps),children:[(0,K.jsxs)(`div`,{className:u(`flex items-start gap-1.5 min-w-0`,t&&`pl-6`),children:[(0,K.jsx)(`span`,{className:`text-text-subtle shrink-0`,children:e.pid}),(0,K.jsx)(`span`,{className:`truncate text-text-secondary`,title:e.startedAt?`${e.command}\nRunning ${O(e.startedAt)}`:e.command,children:e.command})]}),(0,K.jsxs)(`span`,{className:u(`text-right`,M(e.cpu)),children:[e.cpu.toFixed(1),`%`]}),(0,K.jsx)(`span`,{className:`text-right text-text-secondary`,children:T(e.ramMB)}),n.columns.swap&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`swap`)),children:k(e.swapMB)}),n.columns.disk&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`disk`)),children:A(e.diskReadBps,e.diskWriteBps)}),n.columns.gpu&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`gpu`)),children:D(e.gpuPct,e.gpuMemMB,n.columns.gpuMemory!==!1)}),n.columns.net&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`net`)),children:E(e.netInBps,e.netOutBps)}),(0,K.jsx)(`div`,{className:`flex justify-end`,children:(0,K.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),r(e)},disabled:e.protected,"aria-label":`End process ${e.name} (${e.pid})`,title:e.protected?ce:`End process ${e.name}`,"data-testid":`sysmon-kill-btn`,className:u(`flex items-center justify-center size-11 md:size-7 rounded transition-all`,`can-hover:opacity-0 can-hover:group-hover/proc:opacity-100`,e.protected?`opacity-40 cursor-not-allowed`:`hover:bg-error/20 hover:text-error active:bg-error/30`),children:(0,K.jsx)(a,{className:`size-3.5`})})})]})}var ue={STOP:`Suspend (SIGSTOP)`,CONT:`Continue (SIGCONT)`,TERM:`Terminate (SIGTERM)`,KILL:`Kill (SIGKILL)`,HUP:`Hang up (SIGHUP)`,INT:`Interrupt (SIGINT)`,USR1:`User signal 1`,USR2:`User signal 2`},de=[`KILL`,`STOP`];async function fe(e){let t=s(),n={"Content-Type":`application/json`,"X-PPM-Request":`1`};t&&(n.Authorization=`Bearer ${t}`);let r=await fetch(`/api/system/resources/signal`,{method:`POST`,headers:n,body:JSON.stringify(e)}),i;try{i=await r.json()}catch{throw Error(r.ok?`Empty response from server`:`Server error (HTTP ${r.status})`)}if(i.ok===!1)throw Error(i.error??`HTTP ${r.status}`);return i.data}function pe(e,t,n){return{pid:e.pid,startedAt:e.startedAt,signal:t,tree:n}}function me(){let[e,t]=(0,I.useState)(null);return{send:(0,I.useCallback)(async(e,n,r=!1)=>{t(e.pid);try{let t=(await fe(pe(e,n,r))).signalled.length;c.success(t>1?`Sent SIG${n} to ${e.name} and ${t-1} child processes`:`Sent SIG${n} to ${e.name} (${e.pid})`)}catch(t){c.error(t instanceof Error?t.message:`Could not signal ${e.name}`)}finally{t(null)}},[]),pending:e}}function he({proc:e,signals:t,onDetails:n,onKill:r,onSignal:i,children:a}){return(0,K.jsxs)(C,{children:[(0,K.jsx)(w,{asChild:!0,children:(0,K.jsx)(`div`,{className:`select-none`,children:a})}),(0,K.jsxs)(y,{children:[(0,K.jsx)(x,{onSelect:()=>n(e),children:`Details…`}),t.length>0&&(0,K.jsxs)(S,{children:[(0,K.jsx)(v,{children:`Send signal`}),(0,K.jsx)(_,{children:t.map(t=>(0,K.jsx)(x,{variant:de.includes(t)?`destructive`:void 0,disabled:e.protected,onSelect:()=>{e.protected||i(e,t,!1)},children:ue[t]},t))})]}),(0,K.jsx)(b,{}),(0,K.jsx)(x,{variant:`destructive`,disabled:e.protected,onSelect:()=>{e.protected||r(e)},children:`End process`}),e.protected&&(0,K.jsx)(`p`,{className:`px-2 py-1.5 text-[11px] text-text-subtle max-w-64`,children:`PPM or OS-critical process — it cannot be ended or signalled.`})]})]})}function ge(e){return e>0?new Date(e).toLocaleString():`—`}function _e({pid:e,name:t,onClose:n}){let r=d(),[i,a]=(0,I.useState)(null),[o,s]=(0,I.useState)(null);if((0,I.useEffect)(()=>{if(e===null){a(null),s(null);return}let t=!0;return a(null),s(null),l.get(`/api/system/resources/process/${e}`).then(e=>{t&&a(e)}).catch(e=>{t&&s(e instanceof Error?e.message:`Could not read the process`)}),()=>{t=!1}},[e]),e===null)return null;let c=(0,K.jsxs)(`div`,{className:`space-y-3`,"data-testid":`sysmon-process-details`,"data-pid":e,children:[o&&(0,K.jsx)(`p`,{className:`text-sm text-error`,children:o}),!o&&i===null&&(0,K.jsx)(`p`,{className:`text-sm text-text-subtle`,children:`Reading /proc…`}),i&&(0,K.jsxs)(K.Fragment,{children:[(0,K.jsxs)(`dl`,{className:`grid grid-cols-2 gap-x-4 gap-y-2 text-xs`,children:[(0,K.jsx)(X,{label:`PID`,value:i.pid}),(0,K.jsx)(X,{label:`Parent PID`,value:i.ppid}),(0,K.jsx)(X,{label:`User`,value:i.user}),(0,K.jsx)(X,{label:`State`,value:i.state}),(0,K.jsx)(X,{label:`Threads`,value:i.threads}),(0,K.jsx)(X,{label:`Nice`,value:i.nice}),(0,K.jsx)(X,{label:`Started`,value:ge(i.startedAt)}),(0,K.jsx)(X,{label:`Control group`,value:i.cgroup})]}),(0,K.jsx)(Z,{label:`Executable`,value:i.exe}),(0,K.jsx)(Z,{label:`Working directory`,value:i.cwd}),(0,K.jsx)(Z,{label:`Command line`,value:i.command,mono:!0})]})]});return r?(0,K.jsx)(g,{open:!0,onClose:n,children:(0,K.jsxs)(`div`,{className:`px-4 pb-4 space-y-3`,children:[(0,K.jsx)(`h2`,{className:`text-base font-semibold break-all`,children:t}),c]})}):(0,K.jsx)(h,{open:!0,onOpenChange:e=>!e&&n(),children:(0,K.jsxs)(p,{className:`sm:max-w-xl`,children:[(0,K.jsx)(f,{children:(0,K.jsx)(m,{className:`break-all`,children:t})}),c]})})}function X({label:e,value:t}){let n=t===null||t===``?`—`:String(t);return(0,K.jsxs)(`div`,{className:`min-w-0`,children:[(0,K.jsx)(`dt`,{className:`text-text-subtle`,children:e}),(0,K.jsx)(`dd`,{className:`truncate`,title:n,children:n})]})}function Z({label:e,value:t,mono:n}){return(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:e}),(0,K.jsx)(`p`,{className:`text-xs break-all ${n?`font-mono`:``}`,children:t??`—`})]})}var Q=`ppm-sysmon-col-widths`;function ve(){try{let e=localStorage.getItem(Q);if(!e)return{};let t=JSON.parse(e),n={};for(let e of[`cpu`,`ram`,`disk`,`gpu`,`net`]){let r=t[e];typeof r==`number`&&Number.isFinite(r)&&(n[e]=H(r))}return n}catch{return{}}}function $(e){try{Object.keys(e).length===0?localStorage.removeItem(Q):localStorage.setItem(Q,JSON.stringify(e))}catch{}}function ye(){let[e,t]=(0,I.useState)(()=>typeof localStorage>`u`?{}:ve()),n=(0,I.useRef)(null);return(0,I.useEffect)(()=>{let e=e=>{let r=n.current;if(!r)return;let i=H(r.startWidth+(e.clientX-r.startX));t(e=>e[r.key]===i?e:{...e,[r.key]:i})},r=()=>{n.current&&(n.current=null,document.body.style.cursor=``,t(e=>($(e),e)))};return window.addEventListener(`pointermove`,e),window.addEventListener(`pointerup`,r),window.addEventListener(`pointercancel`,r),()=>{window.removeEventListener(`pointermove`,e),window.removeEventListener(`pointerup`,r),window.removeEventListener(`pointercancel`,r)}},[]),{widths:e,begin:(0,I.useCallback)((t,r)=>{r.preventDefault(),n.current={key:t,startX:r.clientX,startWidth:U(t,e)},document.body.style.cursor=`col-resize`},[e]),reset:(0,I.useCallback)(e=>{t(t=>{if(!(e in t))return t;let{[e]:n,...r}=t;return $(r),r})},[])}}var be={disk:!1,gpu:!1,net:!1};function xe({snapshot:e}){let t=d(),n=(0,I.useRef)(null),[r,i]=(0,I.useState)(`grouped`),[a,o]=(0,I.useState)(!1),[s,c]=(0,I.useState)(``),[l,u]=(0,I.useState)(null),[f,p]=(0,I.useState)(`desc`),[m,h]=(0,I.useState)(()=>new Set),{pendingKill:g,groupProtected:_,requestKillProcess:v,requestKillGroup:y,confirmKill:b,cancelKill:x}=N(e),{send:S}=me(),[C,w]=(0,I.useState)(null),T=e.signals??[],{widths:E,begin:D,reset:O}=ye(),{rows:k,totals:A}=(0,I.useMemo)(()=>P({processes:e.processes,groups:e.groups,mode:r,ppmOnly:a,query:s,sortKey:l,sortDir:f,expanded:m}),[e.processes,e.groups,r,a,s,l,f,m]),j=e.processColumns??be,M=(0,I.useMemo)(()=>re(j,l,E),[j,l,E]),F=e.system.gpus[0]?.utilPercent,L=ee({count:k.length,getScrollElement:()=>n.current,estimateSize:()=>t?44:28,overscan:12}),R=(0,I.useCallback)(e=>{let[t,n]=ne(l,f,e);u(t),p(n)},[l,f]),z=(0,I.useCallback)(e=>{h(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]);return(0,K.jsxs)(`div`,{className:`h-full flex flex-col min-h-0 @container`,style:ie(M),"data-testid":`sysmon-processes`,"data-row-count":k.length,children:[(0,K.jsx)(J,{mode:r,onModeChange:i,ppmOnly:a,onPpmOnlyChange:o,onQueryChange:c}),(0,K.jsx)(Y,{sortKey:l,sortDir:f,grid:M,onSort:R,resize:{onResizeStart:D,onResizeReset:O}}),(0,K.jsx)(`div`,{ref:n,className:`flex-1 min-h-0 overflow-y-auto`,children:(0,K.jsx)(`div`,{style:{height:L.getTotalSize(),position:`relative`},children:L.getVirtualItems().map(e=>{let t=k[e.index];return t?(0,K.jsx)(`div`,{style:{position:`absolute`,top:0,left:0,right:0,transform:`translateY(${e.start}px)`},children:t.kind===`group`?(0,K.jsx)(se,{group:t.group,expanded:t.expanded,grid:M,killProtected:_.get(t.group.key)??!0,onToggle:z,onKillClick:y}):(0,K.jsx)(he,{proc:t.proc,signals:T,onDetails:w,onKill:v,onSignal:(e,t,n)=>void S(e,t,n),children:(0,K.jsx)(le,{proc:t.proc,indent:t.indent,grid:M,onKillClick:v})})},t.kind===`group`?t.group.key:`p:${t.proc.pid}`):null})})}),(0,K.jsx)(ae,{totals:A,grid:M,gpuUtilPercent:F}),(0,K.jsx)(te,{target:g,onConfirm:b,onCancel:x}),(0,K.jsx)(_e,{pid:C?.pid??null,name:C?.name??``,onClose:()=>w(null)})]})}export{xe as ProcessTable};
|
|
Binary file
|
|
Binary file
|
package/dist/web/assets/{proxy-settings-section-Di5nBuy6.js → proxy-settings-section-B8vjc9n-.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{At as r,hr as i,or as a,ut as o,xn as s}from"./icons-BwyIKaTT.js";import"./api-client-xQDlhUTu.js";import"./portal-container-context-NBi-KGK0.js";import"./chat-preparation-cache-190LLyy7.js";import{r as c}from"./clipboard-D-VCry-F.js";import{t as l}from"./button-C9ZXWb3b.js";import{a as u,n as d,o as f,r as p,s as m,t as h}from"./dialog-Dn_2tuYa.js";import{t as g}from"./input-C3oVNCMq.js";import{Er as _,Kn as v}from"./index-COwBji1t.js";import{C as y,a as b,d as x}from"./api-settings-vmIRFNwZ.js";var S=e(t(),1),C=[{value:`claude-opus-5-5`,label:`Claude Opus 5.5`,hint:`balanced, recommended`},{value:`claude-fable-5-1`,label:`Claude Fable 5.1`,hint:`flagship`},{value:`claude-opus-5`,label:`Claude Opus 5`,hint:`most powerful`},{value:`claude-fable-5`,label:`Claude Fable 5`,hint:`flagship`},{value:`claude-opus-4-8`,label:`Claude Opus 4.8`,hint:`powerful`},{value:`claude-opus-4-7`,label:`Claude Opus 4.7`,hint:`powerful`},{value:`claude-opus-4-6`,label:`Claude Opus 4.6`,hint:`powerful`},{value:`claude-sonnet-5`,label:`Claude Sonnet 5`,hint:`fast`},{value:`claude-sonnet-4-6`,label:`Claude Sonnet 4.6`,hint:`fast`},{value:`claude-haiku-4-5`,label:`Claude Haiku 4.5`,hint:`cheap`}];C.map(e=>e.value);function w(e,t){return`${e}/proxy${t?`/${t}`:``}`}function T(e,t){let n=w(e,t);return{anthropicBase:n,openAiBase:`${n}/v1`,anthropicMessages:`${n}/v1/messages`,openAiChatCompletions:`${n}/v1/chat/completions`,models:`${n}/v1/models`,imagesGenerations:t?`${n}/v1/images/generations`:null,imagesEdits:t?`${n}/v1/images/edits`:null}}var E=n(),D=`Hello! Reply briefly.`,O=`claude-opus-5-5`;function k(e){let[t,n]=(0,S.useState)(!1);return(0,E.jsxs)(h,{open:t,onOpenChange:n,children:[(0,E.jsx)(m,{asChild:!0,children:(0,E.jsxs)(l,{variant:`outline`,size:`sm`,className:`h-7 text-[11px] gap-1.5 cursor-pointer`,children:[(0,E.jsx)(r,{className:`size-3`}),`Test`]})}),(0,E.jsxs)(d,{className:`sm:max-w-md max-h-[85vh] overflow-y-auto`,children:[(0,E.jsxs)(u,{children:[(0,E.jsx)(f,{className:`text-sm`,children:`Test Proxy`}),(0,E.jsx)(p,{className:`text-[11px]`,children:`Send a test request and inspect the raw response.`})]}),t&&(0,E.jsx)(A,{...e})]})]})}function A({authKey:e,baseUrl:t,provider:n}){let[r,i]=(0,S.useState)(`anthropic`),[o,c]=(0,S.useState)(D),[u,d]=(0,S.useState)(n?``:O),[f,p]=(0,S.useState)(!0),[m,h]=(0,S.useState)(!1),[v,y]=(0,S.useState)(null),[b,x]=(0,S.useState)(null),[w,k]=(0,S.useState)(null),A=(0,S.useRef)(null),j=(0,S.useRef)(null);(0,S.useEffect)(()=>{A.current?.select()},[]),(0,S.useEffect)(()=>{j.current&&(j.current.scrollTop=j.current.scrollHeight)},[v]);let M=e=>{i(e),y(null),x(null),k(null)},N=async()=>{h(!0),y(null),x(null),k(null);let i=Date.now(),a=r===`openai`,s=T(t,n),c=a?s.openAiChatCompletions:s.anthropicMessages,l=JSON.stringify({...u?{model:u}:{},max_tokens:256,stream:f,messages:[{role:`user`,content:o}]}),d={"Content-Type":`application/json`};a?d.Authorization=`Bearer ${e}`:(d[`x-api-key`]=e,d[`anthropic-version`]=`2023-06-01`);try{let e=await fetch(c,{method:`POST`,headers:d,body:l});if(!e.ok){let t=await e.text();x(`HTTP ${e.status}: ${t}`),h(!1),k(Date.now()-i);return}if(f){let t=e.body?.getReader();if(!t){x(`No response body`),h(!1);return}let n=new TextDecoder,r=``;for(;;){let{done:e,value:i}=await t.read();if(e)break;r+=n.decode(i,{stream:!0}),y(r)}k(Date.now()-i)}else{let t=await e.text();try{y(JSON.stringify(JSON.parse(t),null,2))}catch{y(t)}k(Date.now()-i)}}catch(e){x(e.message)}finally{h(!1),k(e=>e??Date.now()-i)}};return(0,E.jsxs)(`div`,{className:`space-y-3 min-w-0`,children:[(0,E.jsxs)(`div`,{className:`space-y-1.5 min-w-0`,children:[(0,E.jsx)(_,{className:`text-[11px]`,children:`Auth Style`}),(0,E.jsx)(`div`,{className:`flex gap-1`,children:[`anthropic`,`openai`].map(e=>(0,E.jsx)(`button`,{onClick:()=>M(e),className:`flex-1 h-8 rounded-md text-[11px] font-medium border transition-colors cursor-pointer ${r===e?`bg-primary text-primary-foreground border-primary`:`bg-muted text-muted-foreground border-transparent hover:bg-muted/80`}`,children:e===`anthropic`?`Anthropic`:`OpenAI`},e))}),(0,E.jsxs)(`p`,{className:`text-[9px] text-muted-foreground break-all`,children:[r===`anthropic`?`x-api-key header`:`Authorization: Bearer header`,` · `,(0,E.jsx)(`code`,{children:`/proxy${n?`/${n}`:``}/v1/${r===`anthropic`?`messages`:`chat/completions`}`})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(_,{className:`text-[11px]`,children:`Model`}),n?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(g,{value:u,onChange:e=>d(e.target.value),placeholder:`leave empty to let the provider choose`,className:`h-8 text-[11px] font-mono`}),(0,E.jsxs)(`p`,{className:`text-[9px] text-muted-foreground`,children:[`Names come from `,(0,E.jsxs)(`code`,{children:[`GET /proxy/`,n,`/v1/models`]}),`.`]})]}):(0,E.jsx)(`select`,{value:u,onChange:e=>d(e.target.value),className:`h-8 w-full rounded-md border bg-background px-2 text-[11px]`,children:C.map(e=>(0,E.jsx)(`option`,{value:e.value,children:e.value},e.value))})]}),(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(_,{className:`text-[11px]`,children:`Streaming`}),(0,E.jsx)(`div`,{className:`flex gap-1`,children:[!0,!1].map(e=>(0,E.jsx)(`button`,{onClick:()=>p(e),className:`h-7 px-3 rounded-md text-[11px] font-medium border transition-colors cursor-pointer ${f===e?`bg-primary text-primary-foreground border-primary`:`bg-muted text-muted-foreground border-transparent hover:bg-muted/80`}`,children:e?`Stream`:`JSON`},String(e)))})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(_,{className:`text-[11px]`,children:`Message`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,E.jsx)(g,{ref:A,value:o,onChange:e=>c(e.target.value),placeholder:`Type a test message...`,className:`h-9 text-[11px] flex-1 min-w-0`,onKeyDown:e=>{e.key===`Enter`&&!m&&N()}}),(0,E.jsxs)(l,{size:`sm`,className:`h-9 px-3 cursor-pointer shrink-0`,onClick:N,disabled:m||!o.trim(),children:[m?(0,E.jsx)(s,{className:`size-3.5 animate-spin`}):(0,E.jsx)(a,{className:`size-3.5`}),(0,E.jsx)(`span`,{className:`ml-1 text-[11px]`,children:m?`...`:`Send`})]})]})]}),(v||b)&&(0,E.jsxs)(`div`,{className:`space-y-1 min-w-0`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(_,{className:`text-[10px] text-muted-foreground`,children:`Raw Response`}),w!=null&&(0,E.jsxs)(`span`,{className:`text-[9px] font-mono text-muted-foreground`,children:[(w/1e3).toFixed(1),`s`]})]}),b?(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-error/10 text-error p-2 rounded overflow-auto max-h-52 whitespace-pre-wrap break-all`,children:b}):(0,E.jsx)(`pre`,{ref:j,className:`text-[9px] font-mono bg-muted p-2 rounded overflow-auto max-h-52 whitespace-pre-wrap break-all`,children:v})]})]})}function j(){let[e,t]=(0,S.useState)(``),[n,r]=(0,S.useState)([]);(0,S.useEffect)(()=>{b().then(e=>r(Object.keys(e.providers??{}).filter(e=>e!==`mock`&&e!==`claude`))).catch(()=>r([]))},[]);let[a,s]=(0,S.useState)(null),[u,d]=(0,S.useState)(!0),[f,p]=(0,S.useState)(!1),[m,h]=(0,S.useState)(null),[C,w]=(0,S.useState)(null);(0,S.useEffect)(()=>{d(!0),x().then(s).catch(e=>h(e.message)).finally(()=>d(!1))},[]);let D=async e=>{p(!0),h(null);try{s(await y(e))}catch(e){h(e.message)}finally{p(!1)}},O=(e,t)=>{c(e),w(t),setTimeout(()=>w(null),2e3)};if(u||!a)return(0,E.jsxs)(`div`,{className:`space-y-2`,children:[(0,E.jsx)(`h3`,{className:`text-xs font-medium text-text-secondary`,children:`API Proxy`}),(0,E.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:m?`Error: ${m}`:`Loading...`})]});let A=!!a.authKey,j=!!a.tunnelUrl,M=a.localEndpoint.replace(/\/proxy\/v1\/messages$/,``),N=T(j?a.tunnelUrl:M,e),P=N.anthropicMessages,F=N.openAiChatCompletions,I=`ANTHROPIC_BASE_URL=${N.anthropicBase}\nANTHROPIC_API_KEY=${a.authKey}`,L=`OPENAI_BASE_URL=${N.openAiBase}\nOPENAI_API_KEY=${a.authKey}`;return(0,E.jsxs)(`div`,{className:`space-y-4`,children:[(0,E.jsx)(`div`,{className:`space-y-1.5`,children:(0,E.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Expose your accounts as an API that speaks both the Anthropic and OpenAI formats, so most SDKs need only a new base URL. The default path answers from your Claude accounts; pick a provider below to run its agent instead, which also unlocks image generation.`})}),(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,E.jsx)(_,{className:`text-xs`,children:`Enable Proxy`}),(0,E.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Accept API requests under /proxy`})]}),(0,E.jsx)(v,{checked:a.enabled,onCheckedChange:e=>D({enabled:e}),disabled:f})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(_,{className:`text-[11px]`,children:`Auth Key`}),A?(0,E.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,E.jsx)(g,{readOnly:!0,value:a.authKey,className:`h-7 text-[11px] font-mono flex-1`}),(0,E.jsx)(l,{variant:`outline`,size:`sm`,className:`h-7 px-2 cursor-pointer shrink-0`,onClick:()=>O(a.authKey,`key`),children:C===`key`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})}),(0,E.jsx)(l,{variant:`outline`,size:`sm`,className:`h-7 px-2 cursor-pointer shrink-0`,onClick:()=>D({generateKey:!0}),disabled:f,children:(0,E.jsx)(i,{className:`size-3`})})]}):(0,E.jsx)(l,{variant:`outline`,size:`sm`,className:`h-7 text-xs cursor-pointer`,onClick:()=>D({generateKey:!0}),disabled:f,children:`Generate Auth Key`}),(0,E.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Use as Bearer token or x-api-key when calling the proxy.`})]}),a.enabled&&A&&(0,E.jsxs)(`div`,{className:`space-y-2 rounded-md border p-3 bg-muted/30`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(`h4`,{className:`text-[11px] font-medium`,children:`Connection Info`}),(0,E.jsx)(k,{authKey:a.authKey,baseUrl:window.location.origin,provider:e})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(_,{className:`text-[10px] text-muted-foreground`,children:`Provider`}),(0,E.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:[{id:``,label:`Claude (default)`},...n.map(e=>({id:e,label:e}))].map(n=>(0,E.jsx)(`button`,{type:`button`,onClick:()=>t(n.id),className:`text-[10px] px-2.5 min-h-[36px] rounded-md border transition-colors cursor-pointer ${e===n.id?`border-primary bg-primary/15`:`border-border bg-muted/40 hover:bg-muted`}`,children:n.label},n.id||`default`))}),e&&(0,E.jsxs)(`p`,{className:`text-[10px] text-muted-foreground`,children:[`Runs the `,e,` agent per request (read-only sandbox, one turn). Slower than the default path.`]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(_,{className:`text-[10px] text-muted-foreground`,children:`Anthropic Endpoint`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5 items-center`,children:[(0,E.jsx)(`code`,{className:`text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded flex-1 truncate`,children:P}),(0,E.jsx)(l,{variant:`ghost`,size:`sm`,className:`h-6 px-1.5 cursor-pointer shrink-0`,onClick:()=>O(P,`anthropic`),children:C===`anthropic`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(_,{className:`text-[10px] text-muted-foreground`,children:`OpenAI-Compatible Endpoint`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5 items-center`,children:[(0,E.jsx)(`code`,{className:`text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded flex-1 truncate`,children:F}),(0,E.jsx)(l,{variant:`ghost`,size:`sm`,className:`h-6 px-1.5 cursor-pointer shrink-0`,onClick:()=>O(F,`openai`),children:C===`openai`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})})]})]}),N.imagesGenerations&&N.imagesEdits&&(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(_,{className:`text-[10px] text-muted-foreground`,children:`Image Endpoints`}),(0,E.jsx)(`code`,{className:`block text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded truncate`,children:N.imagesGenerations}),(0,E.jsx)(`code`,{className:`block text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded truncate`,children:N.imagesEdits})]}),!j&&(0,E.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Start a Cloudflare tunnel (Share) to get a public URL.`}),(0,E.jsxs)(`div`,{className:`space-y-1 pt-1`,children:[(0,E.jsx)(_,{className:`text-[10px] text-muted-foreground`,children:`Anthropic Format`}),(0,E.jsxs)(`div`,{className:`relative`,children:[(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-muted p-2 rounded overflow-x-auto whitespace-pre`,children:I}),(0,E.jsx)(l,{variant:`ghost`,size:`sm`,className:`absolute top-1 right-1 h-5 px-1 cursor-pointer`,onClick:()=>O(I,`anthropic-env`),children:C===`anthropic-env`?`Copied!`:(0,E.jsx)(o,{className:`size-2.5`})})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(_,{className:`text-[10px] text-muted-foreground`,children:`OpenAI Format`}),(0,E.jsxs)(`div`,{className:`relative`,children:[(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-muted p-2 rounded overflow-x-auto whitespace-pre`,children:L}),(0,E.jsx)(l,{variant:`ghost`,size:`sm`,className:`absolute top-1 right-1 h-5 px-1 cursor-pointer`,onClick:()=>O(L,`openai-env`),children:C===`openai-env`?`Copied!`:(0,E.jsx)(o,{className:`size-2.5`})})]})]}),(0,E.jsx)(`div`,{className:`flex items-center gap-3 pt-1`,children:(0,E.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[`Requests served: `,(0,E.jsx)(`span`,{className:`font-mono`,children:a.requestCount})]})})]}),f&&(0,E.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Saving...`}),m&&(0,E.jsx)(`p`,{className:`text-[11px] text-error`,children:m})]})}export{j as ProxySettingsSection};
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{At as r,hr as i,or as a,ut as o,xn as s}from"./icons-BwyIKaTT.js";import"./api-client-xQDlhUTu.js";import"./portal-container-context-NBi-KGK0.js";import"./chat-preparation-cache-190LLyy7.js";import{r as c}from"./clipboard-D-VCry-F.js";import{t as l}from"./button-C9ZXWb3b.js";import{a as u,n as d,o as f,r as p,s as m,t as h}from"./dialog-Dn_2tuYa.js";import{t as g}from"./input-C3oVNCMq.js";import{Er as _,Kn as v}from"./index-EznfgwH9.js";import{C as y,a as b,d as x}from"./api-settings-vmIRFNwZ.js";var S=e(t(),1),C=[{value:`claude-opus-5-5`,label:`Claude Opus 5.5`,hint:`balanced, recommended`},{value:`claude-fable-5-1`,label:`Claude Fable 5.1`,hint:`flagship`},{value:`claude-opus-5`,label:`Claude Opus 5`,hint:`most powerful`},{value:`claude-fable-5`,label:`Claude Fable 5`,hint:`flagship`},{value:`claude-opus-4-8`,label:`Claude Opus 4.8`,hint:`powerful`},{value:`claude-opus-4-7`,label:`Claude Opus 4.7`,hint:`powerful`},{value:`claude-opus-4-6`,label:`Claude Opus 4.6`,hint:`powerful`},{value:`claude-sonnet-5`,label:`Claude Sonnet 5`,hint:`fast`},{value:`claude-sonnet-4-6`,label:`Claude Sonnet 4.6`,hint:`fast`},{value:`claude-haiku-4-5`,label:`Claude Haiku 4.5`,hint:`cheap`}];C.map(e=>e.value);function w(e,t){return`${e}/proxy${t?`/${t}`:``}`}function T(e,t){let n=w(e,t);return{anthropicBase:n,openAiBase:`${n}/v1`,anthropicMessages:`${n}/v1/messages`,openAiChatCompletions:`${n}/v1/chat/completions`,models:`${n}/v1/models`,imagesGenerations:t?`${n}/v1/images/generations`:null,imagesEdits:t?`${n}/v1/images/edits`:null}}var E=n(),D=`Hello! Reply briefly.`,O=`claude-opus-5-5`;function k(e){let[t,n]=(0,S.useState)(!1);return(0,E.jsxs)(h,{open:t,onOpenChange:n,children:[(0,E.jsx)(m,{asChild:!0,children:(0,E.jsxs)(l,{variant:`outline`,size:`sm`,className:`h-7 text-[11px] gap-1.5 cursor-pointer`,children:[(0,E.jsx)(r,{className:`size-3`}),`Test`]})}),(0,E.jsxs)(d,{className:`sm:max-w-md max-h-[85vh] overflow-y-auto`,children:[(0,E.jsxs)(u,{children:[(0,E.jsx)(f,{className:`text-sm`,children:`Test Proxy`}),(0,E.jsx)(p,{className:`text-[11px]`,children:`Send a test request and inspect the raw response.`})]}),t&&(0,E.jsx)(A,{...e})]})]})}function A({authKey:e,baseUrl:t,provider:n}){let[r,i]=(0,S.useState)(`anthropic`),[o,c]=(0,S.useState)(D),[u,d]=(0,S.useState)(n?``:O),[f,p]=(0,S.useState)(!0),[m,h]=(0,S.useState)(!1),[v,y]=(0,S.useState)(null),[b,x]=(0,S.useState)(null),[w,k]=(0,S.useState)(null),A=(0,S.useRef)(null),j=(0,S.useRef)(null);(0,S.useEffect)(()=>{A.current?.select()},[]),(0,S.useEffect)(()=>{j.current&&(j.current.scrollTop=j.current.scrollHeight)},[v]);let M=e=>{i(e),y(null),x(null),k(null)},N=async()=>{h(!0),y(null),x(null),k(null);let i=Date.now(),a=r===`openai`,s=T(t,n),c=a?s.openAiChatCompletions:s.anthropicMessages,l=JSON.stringify({...u?{model:u}:{},max_tokens:256,stream:f,messages:[{role:`user`,content:o}]}),d={"Content-Type":`application/json`};a?d.Authorization=`Bearer ${e}`:(d[`x-api-key`]=e,d[`anthropic-version`]=`2023-06-01`);try{let e=await fetch(c,{method:`POST`,headers:d,body:l});if(!e.ok){let t=await e.text();x(`HTTP ${e.status}: ${t}`),h(!1),k(Date.now()-i);return}if(f){let t=e.body?.getReader();if(!t){x(`No response body`),h(!1);return}let n=new TextDecoder,r=``;for(;;){let{done:e,value:i}=await t.read();if(e)break;r+=n.decode(i,{stream:!0}),y(r)}k(Date.now()-i)}else{let t=await e.text();try{y(JSON.stringify(JSON.parse(t),null,2))}catch{y(t)}k(Date.now()-i)}}catch(e){x(e.message)}finally{h(!1),k(e=>e??Date.now()-i)}};return(0,E.jsxs)(`div`,{className:`space-y-3 min-w-0`,children:[(0,E.jsxs)(`div`,{className:`space-y-1.5 min-w-0`,children:[(0,E.jsx)(_,{className:`text-[11px]`,children:`Auth Style`}),(0,E.jsx)(`div`,{className:`flex gap-1`,children:[`anthropic`,`openai`].map(e=>(0,E.jsx)(`button`,{onClick:()=>M(e),className:`flex-1 h-8 rounded-md text-[11px] font-medium border transition-colors cursor-pointer ${r===e?`bg-primary text-primary-foreground border-primary`:`bg-muted text-muted-foreground border-transparent hover:bg-muted/80`}`,children:e===`anthropic`?`Anthropic`:`OpenAI`},e))}),(0,E.jsxs)(`p`,{className:`text-[9px] text-muted-foreground break-all`,children:[r===`anthropic`?`x-api-key header`:`Authorization: Bearer header`,` · `,(0,E.jsx)(`code`,{children:`/proxy${n?`/${n}`:``}/v1/${r===`anthropic`?`messages`:`chat/completions`}`})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(_,{className:`text-[11px]`,children:`Model`}),n?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(g,{value:u,onChange:e=>d(e.target.value),placeholder:`leave empty to let the provider choose`,className:`h-8 text-[11px] font-mono`}),(0,E.jsxs)(`p`,{className:`text-[9px] text-muted-foreground`,children:[`Names come from `,(0,E.jsxs)(`code`,{children:[`GET /proxy/`,n,`/v1/models`]}),`.`]})]}):(0,E.jsx)(`select`,{value:u,onChange:e=>d(e.target.value),className:`h-8 w-full rounded-md border bg-background px-2 text-[11px]`,children:C.map(e=>(0,E.jsx)(`option`,{value:e.value,children:e.value},e.value))})]}),(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(_,{className:`text-[11px]`,children:`Streaming`}),(0,E.jsx)(`div`,{className:`flex gap-1`,children:[!0,!1].map(e=>(0,E.jsx)(`button`,{onClick:()=>p(e),className:`h-7 px-3 rounded-md text-[11px] font-medium border transition-colors cursor-pointer ${f===e?`bg-primary text-primary-foreground border-primary`:`bg-muted text-muted-foreground border-transparent hover:bg-muted/80`}`,children:e?`Stream`:`JSON`},String(e)))})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(_,{className:`text-[11px]`,children:`Message`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,E.jsx)(g,{ref:A,value:o,onChange:e=>c(e.target.value),placeholder:`Type a test message...`,className:`h-9 text-[11px] flex-1 min-w-0`,onKeyDown:e=>{e.key===`Enter`&&!m&&N()}}),(0,E.jsxs)(l,{size:`sm`,className:`h-9 px-3 cursor-pointer shrink-0`,onClick:N,disabled:m||!o.trim(),children:[m?(0,E.jsx)(s,{className:`size-3.5 animate-spin`}):(0,E.jsx)(a,{className:`size-3.5`}),(0,E.jsx)(`span`,{className:`ml-1 text-[11px]`,children:m?`...`:`Send`})]})]})]}),(v||b)&&(0,E.jsxs)(`div`,{className:`space-y-1 min-w-0`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(_,{className:`text-[10px] text-muted-foreground`,children:`Raw Response`}),w!=null&&(0,E.jsxs)(`span`,{className:`text-[9px] font-mono text-muted-foreground`,children:[(w/1e3).toFixed(1),`s`]})]}),b?(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-error/10 text-error p-2 rounded overflow-auto max-h-52 whitespace-pre-wrap break-all`,children:b}):(0,E.jsx)(`pre`,{ref:j,className:`text-[9px] font-mono bg-muted p-2 rounded overflow-auto max-h-52 whitespace-pre-wrap break-all`,children:v})]})]})}function j(){let[e,t]=(0,S.useState)(``),[n,r]=(0,S.useState)([]);(0,S.useEffect)(()=>{b().then(e=>r(Object.keys(e.providers??{}).filter(e=>e!==`mock`&&e!==`claude`))).catch(()=>r([]))},[]);let[a,s]=(0,S.useState)(null),[u,d]=(0,S.useState)(!0),[f,p]=(0,S.useState)(!1),[m,h]=(0,S.useState)(null),[C,w]=(0,S.useState)(null);(0,S.useEffect)(()=>{d(!0),x().then(s).catch(e=>h(e.message)).finally(()=>d(!1))},[]);let D=async e=>{p(!0),h(null);try{s(await y(e))}catch(e){h(e.message)}finally{p(!1)}},O=(e,t)=>{c(e),w(t),setTimeout(()=>w(null),2e3)};if(u||!a)return(0,E.jsxs)(`div`,{className:`space-y-2`,children:[(0,E.jsx)(`h3`,{className:`text-xs font-medium text-text-secondary`,children:`API Proxy`}),(0,E.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:m?`Error: ${m}`:`Loading...`})]});let A=!!a.authKey,j=!!a.tunnelUrl,M=a.localEndpoint.replace(/\/proxy\/v1\/messages$/,``),N=T(j?a.tunnelUrl:M,e),P=N.anthropicMessages,F=N.openAiChatCompletions,I=`ANTHROPIC_BASE_URL=${N.anthropicBase}\nANTHROPIC_API_KEY=${a.authKey}`,L=`OPENAI_BASE_URL=${N.openAiBase}\nOPENAI_API_KEY=${a.authKey}`;return(0,E.jsxs)(`div`,{className:`space-y-4`,children:[(0,E.jsx)(`div`,{className:`space-y-1.5`,children:(0,E.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Expose your accounts as an API that speaks both the Anthropic and OpenAI formats, so most SDKs need only a new base URL. The default path answers from your Claude accounts; pick a provider below to run its agent instead, which also unlocks image generation.`})}),(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,E.jsx)(_,{className:`text-xs`,children:`Enable Proxy`}),(0,E.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Accept API requests under /proxy`})]}),(0,E.jsx)(v,{checked:a.enabled,onCheckedChange:e=>D({enabled:e}),disabled:f})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(_,{className:`text-[11px]`,children:`Auth Key`}),A?(0,E.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,E.jsx)(g,{readOnly:!0,value:a.authKey,className:`h-7 text-[11px] font-mono flex-1`}),(0,E.jsx)(l,{variant:`outline`,size:`sm`,className:`h-7 px-2 cursor-pointer shrink-0`,onClick:()=>O(a.authKey,`key`),children:C===`key`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})}),(0,E.jsx)(l,{variant:`outline`,size:`sm`,className:`h-7 px-2 cursor-pointer shrink-0`,onClick:()=>D({generateKey:!0}),disabled:f,children:(0,E.jsx)(i,{className:`size-3`})})]}):(0,E.jsx)(l,{variant:`outline`,size:`sm`,className:`h-7 text-xs cursor-pointer`,onClick:()=>D({generateKey:!0}),disabled:f,children:`Generate Auth Key`}),(0,E.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Use as Bearer token or x-api-key when calling the proxy.`})]}),a.enabled&&A&&(0,E.jsxs)(`div`,{className:`space-y-2 rounded-md border p-3 bg-muted/30`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(`h4`,{className:`text-[11px] font-medium`,children:`Connection Info`}),(0,E.jsx)(k,{authKey:a.authKey,baseUrl:window.location.origin,provider:e})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(_,{className:`text-[10px] text-muted-foreground`,children:`Provider`}),(0,E.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:[{id:``,label:`Claude (default)`},...n.map(e=>({id:e,label:e}))].map(n=>(0,E.jsx)(`button`,{type:`button`,onClick:()=>t(n.id),className:`text-[10px] px-2.5 min-h-[36px] rounded-md border transition-colors cursor-pointer ${e===n.id?`border-primary bg-primary/15`:`border-border bg-muted/40 hover:bg-muted`}`,children:n.label},n.id||`default`))}),e&&(0,E.jsxs)(`p`,{className:`text-[10px] text-muted-foreground`,children:[`Runs the `,e,` agent per request (read-only sandbox, one turn). Slower than the default path.`]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(_,{className:`text-[10px] text-muted-foreground`,children:`Anthropic Endpoint`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5 items-center`,children:[(0,E.jsx)(`code`,{className:`text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded flex-1 truncate`,children:P}),(0,E.jsx)(l,{variant:`ghost`,size:`sm`,className:`h-6 px-1.5 cursor-pointer shrink-0`,onClick:()=>O(P,`anthropic`),children:C===`anthropic`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(_,{className:`text-[10px] text-muted-foreground`,children:`OpenAI-Compatible Endpoint`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5 items-center`,children:[(0,E.jsx)(`code`,{className:`text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded flex-1 truncate`,children:F}),(0,E.jsx)(l,{variant:`ghost`,size:`sm`,className:`h-6 px-1.5 cursor-pointer shrink-0`,onClick:()=>O(F,`openai`),children:C===`openai`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})})]})]}),N.imagesGenerations&&N.imagesEdits&&(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(_,{className:`text-[10px] text-muted-foreground`,children:`Image Endpoints`}),(0,E.jsx)(`code`,{className:`block text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded truncate`,children:N.imagesGenerations}),(0,E.jsx)(`code`,{className:`block text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded truncate`,children:N.imagesEdits})]}),!j&&(0,E.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Start a Cloudflare tunnel (Share) to get a public URL.`}),(0,E.jsxs)(`div`,{className:`space-y-1 pt-1`,children:[(0,E.jsx)(_,{className:`text-[10px] text-muted-foreground`,children:`Anthropic Format`}),(0,E.jsxs)(`div`,{className:`relative`,children:[(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-muted p-2 rounded overflow-x-auto whitespace-pre`,children:I}),(0,E.jsx)(l,{variant:`ghost`,size:`sm`,className:`absolute top-1 right-1 h-5 px-1 cursor-pointer`,onClick:()=>O(I,`anthropic-env`),children:C===`anthropic-env`?`Copied!`:(0,E.jsx)(o,{className:`size-2.5`})})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(_,{className:`text-[10px] text-muted-foreground`,children:`OpenAI Format`}),(0,E.jsxs)(`div`,{className:`relative`,children:[(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-muted p-2 rounded overflow-x-auto whitespace-pre`,children:L}),(0,E.jsx)(l,{variant:`ghost`,size:`sm`,className:`absolute top-1 right-1 h-5 px-1 cursor-pointer`,onClick:()=>O(L,`openai-env`),children:C===`openai-env`?`Copied!`:(0,E.jsx)(o,{className:`size-2.5`})})]})]}),(0,E.jsx)(`div`,{className:`flex items-center gap-3 pt-1`,children:(0,E.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[`Requests served: `,(0,E.jsx)(`span`,{className:`font-mono`,children:a.requestCount})]})})]}),f&&(0,E.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Saving...`}),m&&(0,E.jsx)(`p`,{className:`text-[11px] text-error`,children:m})]})}export{j as ProxySettingsSection};
|
|
Binary file
|
|
Binary file
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{s as e,t}from"./rolldown-runtime-C5c2KzVm.js";import{D as n,E as r}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{Cn as i,Er as a,Ht as o,M as s,Mr as c,P as l,Rr as u,Vn as d,Wr as f,an as p,br as m,en as h,h as g,li as _,n as v,on as y,or as b,pt as x,qr as S,qt as ee,vr as te,xn as ne}from"./icons-BwyIKaTT.js";import{a as re,k as ie,r as C}from"./api-client-xQDlhUTu.js";import"./settings-store-B4mLp19V.js";import{n as w,r as ae}from"./utils-Bslrbb-G.js";import"./portal-container-context-NBi-KGK0.js";import{K as T,Q as oe,X as se,et as E}from"./window-store-DqX_qmkQ.js";import{t as ce}from"./panel-store-BJhazigC.js";import"./project-store-BLGl9IAO.js";import"./project-framework-store-DwLxaRan.js";import"./session-list-sync-triggers-DtJI5KF0.js";import{t as le}from"./tab-store-D5I52eLN.js";import"./context-menu-BCuZYfWC.js";import{n as ue}from"./use-is-mobile-VRV9eZy1.js";import"./settings-categories-Ajj4ui27.js";import"./open-settings-EXR4zoZG.js";import{t as D}from"./button-C9ZXWb3b.js";import{a as de,i as O,n as fe,o as pe,r as k,t as me}from"./dialog-Dn_2tuYa.js";import"./file-icons-JInFtBVl.js";import{n as he,t as ge}from"./patch-tab-metadata-C92YkrRX.js";import"./dropdown-menu-BQidk_OJ.js";import{t as _e}from"./mobile-bottom-sheet-DArbIyrD.js";import"./use-visual-viewport-MmugpRg-.js";import"./adaptive-context-menu-C4jNSORA.js";import"./fs-api-CFtQzsIJ.js";import"./format-file-meta-DdYtk07C.js";import{t as ve}from"./input-C3oVNCMq.js";import{i as ye,t as be}from"./use-db-driver-installed-anzWkGi5.js";import"./db-sidebar-reveal-_qw0CliT.js";import{r as xe}from"./db-types-CNhENouW.js";import{b as Se,g as Ce,k as we}from"./explorer-model-BtJN4MZ9.js";import{L as Te}from"./db-explorer-store-BmpvDHz6.js";import{I as Ee}from"./open-db-tabs-CtWIWHOa.js";import{S as De,m as Oe,p as ke}from"./impexp-state-BWKOuRGj.js";import"./scroll-area-DOlQJGZp.js";import{Oi as Ae,Qn as je,Si as A,Ti as Me,ar as Ne,rr as Pe,s as Fe,tr as j,yr as Ie}from"./index-
|
|
1
|
+
import{s as e,t}from"./rolldown-runtime-C5c2KzVm.js";import{D as n,E as r}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{Cn as i,Er as a,Ht as o,M as s,Mr as c,P as l,Rr as u,Vn as d,Wr as f,an as p,br as m,en as h,h as g,li as _,n as v,on as y,or as b,pt as x,qr as S,qt as ee,vr as te,xn as ne}from"./icons-BwyIKaTT.js";import{a as re,k as ie,r as C}from"./api-client-xQDlhUTu.js";import"./settings-store-B4mLp19V.js";import{n as w,r as ae}from"./utils-Bslrbb-G.js";import"./portal-container-context-NBi-KGK0.js";import{K as T,Q as oe,X as se,et as E}from"./window-store-DqX_qmkQ.js";import{t as ce}from"./panel-store-BJhazigC.js";import"./project-store-BLGl9IAO.js";import"./project-framework-store-DwLxaRan.js";import"./session-list-sync-triggers-DtJI5KF0.js";import{t as le}from"./tab-store-D5I52eLN.js";import"./context-menu-BCuZYfWC.js";import{n as ue}from"./use-is-mobile-VRV9eZy1.js";import"./settings-categories-Ajj4ui27.js";import"./open-settings-EXR4zoZG.js";import{t as D}from"./button-C9ZXWb3b.js";import{a as de,i as O,n as fe,o as pe,r as k,t as me}from"./dialog-Dn_2tuYa.js";import"./file-icons-JInFtBVl.js";import{n as he,t as ge}from"./patch-tab-metadata-C92YkrRX.js";import"./dropdown-menu-BQidk_OJ.js";import{t as _e}from"./mobile-bottom-sheet-DArbIyrD.js";import"./use-visual-viewport-MmugpRg-.js";import"./adaptive-context-menu-C4jNSORA.js";import"./fs-api-CFtQzsIJ.js";import"./format-file-meta-DdYtk07C.js";import{t as ve}from"./input-C3oVNCMq.js";import{i as ye,t as be}from"./use-db-driver-installed-anzWkGi5.js";import"./db-sidebar-reveal-_qw0CliT.js";import{r as xe}from"./db-types-CNhENouW.js";import{b as Se,g as Ce,k as we}from"./explorer-model-BtJN4MZ9.js";import{L as Te}from"./db-explorer-store-BmpvDHz6.js";import{I as Ee}from"./open-db-tabs-CtWIWHOa.js";import{S as De,m as Oe,p as ke}from"./impexp-state-BWKOuRGj.js";import"./scroll-area-DOlQJGZp.js";import{Oi as Ae,Qn as je,Si as A,Ti as Me,ar as Ne,rr as Pe,s as Fe,tr as j,yr as Ie}from"./index-EznfgwH9.js";import"./marked.esm-jqwIt-AK.js";import"./use-monaco-theme-nu5Fogu3.js";import{a as Le,s as Re,t as ze}from"./split-sql-statements-DcAeXbk_.js";import{t as Be}from"./use-db-tab-B8LjdDb7.js";import{a as Ve,i as He,n as Ue,r as We,t as Ge}from"./db-tab-parts-BbNfuvwC.js";import"./use-opener-focus-CDRKhHwX.js";import"./filter-dialog-frame-BkEbqBA4.js";import"./sql-completion-provider-CS-ElfgJ.js";import{n as Ke,t as qe}from"./use-sql-schema-info-Dp6TCir5.js";import{t as Je}from"./use-at-most-wide-BHsrzvv3.js";import{t as Ye}from"./glide-data-grid-BrwKKQhc.js";import{t as M}from"./save-as-dialog-5yBgewV3.js";var N=e(n(),1),Xe=[100,1e3,1e4,1e5],Ze=1e3;function Qe(e){return!!e&&e.startsWith(`Connection is readonly`)}var $e=/^\(*\s*(SELECT|WITH|VALUES|TABLE|EXPLAIN|SHOW|PRAGMA|DESCRIBE|DESC)\b/i,et=/\b(INSERT|UPDATE|DELETE|MERGE|DROP|CREATE|ALTER|TRUNCATE|INTO)\b/i,tt=/^\(*\s*SHOW\b/i;function nt(e){return e===`mysql`?[{backslashEscapes:!0},{backslashEscapes:!1}]:[{}]}function rt(e,t=`postgres`){return nt(t).every(n=>{let r=Le(e,t,n).map(e=>Re(e,t,n).trim()).filter(Boolean);return r.length===0?!1:r.every(e=>tt.test(e)||$e.test(e)&&!et.test(e))})}async function it(e,t){let n=e.getReader(),r=new TextDecoder,i=``,a=e=>{let n=0;for(let r=e.indexOf(`
|
|
2
2
|
`);r!==-1;r=e.indexOf(`
|
|
3
3
|
`,n)){let a=i+e.slice(n,r);i=``,n=r+1,a.trim()&&t(JSON.parse(a))}i+=e.slice(n)};try{for(;;){let{done:e,value:t}=await n.read();if(e)break;a(r.decode(t,{stream:!0}))}a(r.decode()),i.trim()&&t(JSON.parse(i))}finally{n.releaseLock()}}var at=`messages`;function ot(e,t){return{...e,startedAt:t,statements:[],running:null,results:[],tabs:[],messages:[{id:0,level:`info`,text:`Query execution started`,time:t}],errorLines:[],failed:!1,done:!1}}function st(e){return e===`sqlite`?`Stop before the next statement: SQLite cannot stop the one already running`:`Stop the statement running; the ones after it do not run`}function P(e,t){return`${e.toLocaleString(`en-US`)} ${t}${e===1?``:`s`}`}function ct(e){return e.columns.length>0}function lt(e,t){return t===0?e:{...e,startLine:e.startLine+t,endLine:e.endLine+t,...e.errorLine===void 0?{}:{errorLine:e.errorLine+t}}}function ut(e){let t={statement:e.index,line:e.startLine},n=(e.notices??[]).map(e=>({...t,level:`info`,text:e})),r=[];return e.resultSets.filter(ct).forEach((n,i)=>{let a=P(n.rows.length,`row`),o=i===0?` in ${e.durationMs.toLocaleString(`en-US`)} ms`:``;r.push(n.truncated?{...t,level:`warning`,text:`Query returned the first ${a}${o}; the rest were cut off by the row limit`}:{...t,level:`success`,text:`Query returned ${a}${o}`})}),e.rowsAffected!==void 0&&r.push({...t,level:`success`,text:`${P(e.rowsAffected,`row`)} affected`}),e.error===void 0?e.stopped&&r.push({...t,level:`warning`,text:e.stopped===`user`?`Stopped`:`Stopped: the connection's query timeout was reached`}):r.push({...t,level:`error`,line:e.errorLine??e.startLine,text:e.stopped===`user`?`Stopped: ${e.error}`:e.error}),r.length===0&&r.push({...t,level:`success`,text:`${e.command??`Statement`} executed`}),[...n,...r]}function dt(e,t){return e===`explain`?t===1?`Plan`:`Plan ${t}`:`Result ${t}`}function ft(e,t){if(t.length===0)return e;let n={...e,results:[...e.results],tabs:[...e.tabs],messages:[...e.messages],errorLines:[...e.errorLines]};for(let{event:r,at:i}of t){let t=e=>{n.messages.push({...e,id:n.messages.length,time:i})};switch(r.type){case`start`:n.statements=r.statements.map(t=>({startLine:t.startLine+e.lineOffset,endLine:t.endLine+e.lineOffset}));break;case`running`:n.running={index:r.index,since:i};break;case`statement`:{let i=lt(r.result,e.lineOffset);n.results.push(i),n.running?.index===i.index&&(n.running=null),i.resultSets.forEach((t,r)=>{ct(t)&&n.tabs.push({key:`${i.index}:${r}`,title:dt(e.kind,n.tabs.length+1),statement:i.index,set:r})});for(let e of ut(i))t(e);(i.error!==void 0||i.stopped)&&(n.failed=!0),i.error!==void 0&&n.errorLines.push(i.errorLine??i.startLine);break}case`message`:t({level:r.level,text:r.text}),r.level===`error`&&(n.failed=!0);break;case`done`:{n.running=null,r.error!==void 0&&(t({level:`error`,text:r.error}),n.failed=!0);let e=n.statements.length-n.results.length;e>0&&t({level:`info`,text:`${P(e,`statement`)} did not run`}),t({level:`info`,text:`Query execution finished`}),n.done=!0,n.durationMs=r.durationMs;break}}}return n}function pt(e,t,n){return e.done?e:{...e,running:null,failed:!0,done:!0,durationMs:Math.max(0,Math.round(n-e.startedAt)),messages:[...e.messages,{id:e.messages.length,level:`error`,text:t,time:n}]}}function mt(e){return e.done&&e.messages.some(e=>e.level===`error`&&(Qe(e.text)||e.text===`Wrong password`))}function ht(e,t,n){return{...e,messages:[...e.messages,{...t,id:e.messages.length,time:n}]}}function gt(e,t){let n=e.results.find(e=>e.index===t.statement),r=n?.resultSets[t.set];return n&&r?{result:n,set:r}:null}function _t(e,t,n){let r=e.tabs.find(e=>e.key===t);return r?{...e,results:e.results.map(e=>e.index===r.statement?{...e,resultSets:e.resultSets.map((e,t)=>t===r.set?n:e)}:e)}:e}function vt(e,t){return e?t===`messages`||t&&e.tabs.some(e=>e.key===t)?t:e.tabs[0]?.key??`messages`:at}function yt(e){if(e.readonly)return{editable:!1,reason:`read-only connection`};if(e.explain)return{editable:!1,reason:`read-only: a plan`};if(!e.table)return{editable:!1,reason:`read-only: not a single table`};if(e.tableColumns===void 0)return{editable:!1,reason:null};if(e.tableColumns===null)return{editable:!1,reason:`read-only: the table's columns could not be read`};if(e.tableColumns.length===0)return{editable:!1,reason:`read-only: not a single table`};let t=new Map(e.tableColumns.map(e=>[e.name,e]));if(new Set(e.columns).size!==e.columns.length)return{editable:!1,reason:`read-only: a column name repeats`};if(!e.columns.every(e=>t.has(e)))return{editable:!1,reason:`read-only: not every column is the table's`};let n=e.tableColumns.filter(e=>e.pk).map(e=>e.name);return n.length===0?{editable:!1,reason:`read-only: no primary key`}:n.every(t=>e.columns.includes(t))?{editable:!0,rowKey:n,schema:e.columns.map(e=>t.get(e))}:{editable:!1,reason:`read-only: the primary key is not in the result`}}var bt=50,xt=1e3;function St(){return`${ae()}${ae()}`}function Ct(e,t){let[n,r]=(0,N.useState)(null),[i,a]=(0,N.useState)(null),[o,s]=(0,N.useState)(!1),[c,l]=(0,N.useState)(null),[u,d]=(0,N.useState)(0),f=(0,N.useRef)(null),p=(0,N.useRef)(null),m=(0,N.useRef)(null),h=(0,N.useRef)(t);h.current=t;let g=(0,N.useRef)(!0),_=(0,N.useCallback)(e=>{f.current=e,r(e)},[]);(0,N.useEffect)(()=>(g.current=!0,()=>{g.current=!1,p.current?.abort.abort()}),[]);let v=(0,N.useCallback)(async t=>{if(!e||!t.sql.trim()||p.current)return;let{maxRows:n,continueOnError:r}=h.current,i={runId:St(),target:e,abort:new AbortController,stopping:!1};p.current=i,_(ot({runId:i.runId,kind:t.kind,sql:t.sql,lineOffset:t.lineOffset,maxRows:n},Date.now())),a(null),s(!1);let o=[],c=null,l=()=>{if(c&&clearTimeout(c),c=null,o.length===0||!g.current||!f.current)return;let e=o;o=[],_(ft(f.current,e))},u={sql:t.sql,runId:i.runId,maxRows:n,...r?{continueOnError:!0}:{},...t.kind===`explain`?{explain:!0}:{},...t.writeOnce?{writeOnce:t.writeOnce}:{}};try{await it((await C.postStream(E(e,`/query/script`),u,{signal:i.abort.signal})).body,e=>{o.push({event:e,at:Date.now()}),e.type===`done`?l():c??=setTimeout(l,bt)}),l(),g.current&&f.current&&!f.current.done&&_(pt(f.current,`The connection to the server was lost before the run ended`,Date.now()))}catch(e){if(l(),!g.current||!f.current)return;let n=ye(e);a(n),m.current=n?()=>{v(t)}:null;let r=i.stopping&&i.abort.signal.aborted?`Stopped: the server did not answer Stop, so the run was dropped`:e.message;_(pt(f.current,r,Date.now()))}finally{c&&clearTimeout(c),p.current===i&&(p.current=null),g.current&&(s(!1),d(e=>e+1))}},[e,_]),y=(0,N.useCallback)(async()=>{let e=p.current;if(!e||e.stopping)return;e.stopping=!0,s(!0);let t=null;try{t=(await C.post(E(e.target,`/query/cancel`),{runId:e.runId})).stopped}catch{}t||setTimeout(()=>{p.current===e&&e.abort.abort()},t===!1?xt:0)},[]);be(e=>{if(i?.id!==e)return;let t=m.current;m.current=null,t?.()});let b=(0,N.useCallback)(async t=>{let n=f.current,r=n?.tabs.find(e=>e.key===t),i=n&&r?gt(n,r):null;if(!e||!n||!r||!i)return;l(t);let a,o;try{await it((await C.postStream(E(e,`/query/script`),{sql:i.result.sql,runId:St(),maxRows:n.maxRows})).body,e=>{e.type===`statement`?a??=e.result:e.type===`done`&&e.error!==void 0&&(o=e.error)})}catch(e){o=e.message}if(!g.current)return;l(null);let s=f.current;if(!s||s.runId!==n.runId)return;let c=a?.resultSets[r.set],u=a?.error??o??(c?void 0:`the statement no longer returns that result`);_(u===void 0?_t(s,t,c):ht(s,{level:`warning`,text:`Saved, but reading the rows again failed: ${u}`,statement:r.statement},Date.now()))},[e,_]),x=(0,N.useCallback)(async(t,n,r,i,a)=>{e&&(await Fe({target:e,place:a,table:n,schema:r,changes:i}),b(t))},[e,b]);return{run:n,running:!!n&&!n.done,stopping:o,rereading:c,ended:u,driverMissing:i,start:v,stop:y,saveChangesIn:x}}var F=r(),wt=`h-[26px] w-full min-w-0 appearance-none rounded-[5px] border border-border bg-input pr-[26px] pl-2 text-xs text-foreground outline-none focus:border-primary max-md:h-11 max-md:text-sm`,Tt=[`connectionId`,`database`,`dbFile`,`connectionName`,`dbType`,`connectionColor`];function Et({target:e,conn:t,fileName:n,metadata:r,tabId:i}){let a=Te(e=>e.connections),o=Te(e=>t?e.databases[t.id]:void 0);if(e?.kind===`file`)return(0,F.jsxs)(`span`,{className:`flex min-w-0 shrink items-center gap-1.5 px-1 text-xs text-text-2 max-md:text-sm`,title:e.path,children:[(0,F.jsx)(x,{className:`size-4 shrink-0 text-text-subtle`}),(0,F.jsx)(`span`,{className:`truncate`,children:n})]});let s=(e,t)=>{if(!i)return;let n=Object.fromEntries(Object.entries(r??{}).filter(([e])=>!Tt.includes(e)));le.getState().updateTab(i,{metadata:{...n,...se(e),...t?{connectionName:t.name,dbType:t.type,...t.color?{connectionColor:t.color}:{}}:{}}})},c=t?Se(t):null,l=e?.kind===`connection`?e.database??c:null,u=t&&!Ce(t)&&o?.state===`ready`?we(t,o.data):null,d=u?l&&!u.includes(l)?[l,...u]:u:l?[l]:[];return(0,F.jsxs)(F.Fragment,{children:[(0,F.jsx)(Dt,{className:`w-[190px] max-md:w-auto max-md:flex-1`,color:t?.color,children:(0,F.jsxs)(`select`,{"aria-label":`Connection`,value:t?.id??``,className:w(wt,t?.color&&`pl-6`),onChange:e=>{let t=a.find(t=>t.id===Number(e.target.value));t&&s({kind:`connection`,connectionId:t.id},t)},children:[!t&&(0,F.jsx)(`option`,{value:``,children:`Connection…`}),a.map(e=>(0,F.jsx)(`option`,{value:e.id,children:e.name},e.id))]})}),t&&!Ce(t)&&d.length>0&&(0,F.jsx)(Dt,{className:`w-[150px] max-md:w-auto max-md:flex-1`,children:(0,F.jsx)(`select`,{"aria-label":`Database`,value:l??``,className:wt,onChange:e=>{let n=e.target.value;s({kind:`connection`,connectionId:t.id,...n&&n!==c?{database:n}:{}},t)},children:d.map(e=>(0,F.jsx)(`option`,{value:e,children:e},e))})})]})}function Dt({children:e,className:t,color:n}){return(0,F.jsxs)(`span`,{className:w(`relative mx-0.5 flex shrink-0`,t),children:[n&&(0,F.jsx)(`span`,{"aria-hidden":!0,className:`pointer-events-none absolute top-1/2 left-2 size-2 -translate-y-1/2 rounded-full`,style:{backgroundColor:n}}),e,(0,F.jsx)(l,{className:`pointer-events-none absolute top-1/2 right-1.5 size-3.5 -translate-y-1/2 text-text-subtle`})]})}var Ot=`grid grid-cols-[3rem_minmax(0,1fr)_4.5rem_4rem_4.5rem_3.5rem] max-md:grid-cols-[minmax(0,1fr)_4rem]`,I=`max-md:hidden`,kt={info:{Icon:y,className:`text-text-subtle`},success:{Icon:s,className:`text-success`},warning:{Icon:S,className:`text-warning`},error:{Icon:v,className:`text-destructive`}};function At({messages:e,onShowLine:t}){let n=e[0]?.time??0;return(0,F.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-auto text-xs`,role:`table`,"aria-label":`Messages`,children:[(0,F.jsxs)(`div`,{role:`row`,className:w(Ot,`sticky top-0 z-[1] h-6 items-center border-b border-border bg-panel-2 px-1 text-[11px] font-medium text-text-2`),children:[(0,F.jsx)(`span`,{role:`columnheader`,className:w(`px-1 text-right`,I),children:`Number`}),(0,F.jsx)(`span`,{role:`columnheader`,className:`px-1`,children:`Message`}),(0,F.jsx)(`span`,{role:`columnheader`,className:w(`px-1`,I),children:`Time`}),(0,F.jsx)(`span`,{role:`columnheader`,className:w(`px-1 text-right`,I),children:`Delta`}),(0,F.jsx)(`span`,{role:`columnheader`,className:w(`px-1 text-right`,I),children:`Duration`}),(0,F.jsx)(`span`,{role:`columnheader`,className:`px-1 text-right`,children:`Line`})]}),e.map((r,i)=>(0,F.jsx)(jt,{message:r,first:n,previous:i===0?null:e[i-1].time,onShowLine:t},r.id))]})}var jt=(0,N.memo)(function({message:e,first:t,previous:n,onShowLine:r}){let{Icon:i,className:a}=kt[e.level],o=e.line!==void 0&&r?()=>r(e.line):void 0;return(0,F.jsxs)(`div`,{role:`row`,className:w(Ot,`items-start border-b border-border-soft px-1 py-1`,`max-md:min-h-11 max-md:items-center max-md:text-sm`,o&&`cursor-pointer can-hover:hover:bg-surface-hover`),onClick:o,children:[(0,F.jsx)(`span`,{role:`cell`,className:w(`px-1 text-right text-text-subtle tabular-nums`,I),children:e.id+1}),(0,F.jsxs)(`span`,{role:`cell`,className:w(`flex min-w-0 gap-1.5 px-1 break-words whitespace-pre-wrap`,e.level===`error`?`text-destructive`:e.level===`warning`?`text-warning`:`text-text-primary`),children:[(0,F.jsx)(i,{"aria-hidden":!0,className:w(`mt-px size-3.5 shrink-0 max-md:mt-0.5`,a)}),(0,F.jsx)(`span`,{className:`min-w-0`,children:e.text})]}),(0,F.jsx)(`span`,{role:`cell`,className:w(`px-1 whitespace-nowrap text-text-2 tabular-nums`,I),children:De(e.time)}),(0,F.jsx)(`span`,{role:`cell`,className:w(`px-1 text-right whitespace-nowrap text-text-2 tabular-nums`,I),children:ke(e.time-t)}),(0,F.jsx)(`span`,{role:`cell`,className:w(`px-1 text-right whitespace-nowrap text-text-2 tabular-nums`,I),children:n===null?`n/a`:ke(e.time-n)}),(0,F.jsx)(`span`,{role:`cell`,className:`px-1 text-right tabular-nums`,children:e.line!==void 0&&(o?(0,F.jsx)(`button`,{type:`button`,onClick:e=>{e.stopPropagation(),o()},title:`Show line ${e.line} in the editor`,className:`text-primary underline-offset-2 can-hover:hover:underline max-md:min-h-11 max-md:px-2`,children:e.line}):(0,F.jsx)(`span`,{className:`text-text-2`,children:e.line}))})]})});function Mt({run:e,shown:t,onPick:n,onShowLine:r,onStop:i,stopping:a,renderResult:o}){let s=(0,N.useRef)({runId:``,keys:new Set});s.current.runId!==e.runId&&(s.current={runId:e.runId,keys:new Set}),t!==`messages`&&s.current.keys.add(t);let c=e.messages.filter(e=>e.level===`error`).length;return(0,F.jsxs)(`div`,{className:`relative flex h-full min-h-0 flex-col overflow-hidden`,children:[(0,F.jsxs)(`div`,{role:`tablist`,"aria-label":`Results`,className:`flex h-8 shrink-0 items-stretch overflow-x-auto border-b border-border bg-panel pl-1 max-md:h-auto`,children:[(0,F.jsxs)(Nt,{selected:t===at,onClick:()=>n(at),icon:(0,F.jsx)(m,{className:`size-3.5`}),children:[`Messages`,c>0&&(0,F.jsx)(`span`,{className:`rounded-full bg-destructive/15 px-1.5 font-mono text-[10.5px] text-destructive`,"aria-label":P(c,`error`),children:c})]}),e.tabs.map(r=>{let i=e.results.find(e=>e.index===r.statement)?.resultSets[r.set]?.rows.length??0;return(0,F.jsxs)(Nt,{selected:t===r.key,onClick:()=>n(r.key),icon:(0,F.jsx)(u,{className:`size-3.5`}),children:[r.title,(0,F.jsx)(`span`,{className:`font-mono text-[10.5px] text-text-subtle`,"aria-label":P(i,`row`),children:i.toLocaleString(`en-US`)})]},r.key)})]}),(0,F.jsx)(`div`,{role:`tabpanel`,className:w(`min-h-0 flex-1 flex-col overflow-hidden`,t===`messages`?`flex`:`hidden`),children:(0,F.jsx)(At,{messages:e.messages,onShowLine:r})}),e.tabs.filter(e=>s.current.keys.has(e.key)).map(e=>(0,F.jsx)(`div`,{role:`tabpanel`,"aria-label":e.title,className:w(`min-h-0 flex-1 flex-col overflow-hidden`,t===e.key?`flex`:`hidden`),children:o(e)},e.key)),!e.done&&(0,F.jsx)(Pt,{run:e,onStop:i,stopping:a})]})}function Nt({selected:e,onClick:t,icon:n,children:r}){return(0,F.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":e,onClick:t,className:w(`flex shrink-0 items-center gap-1.5 border-b-2 px-3 text-xs whitespace-nowrap max-md:min-h-11 max-md:px-3.5 max-md:text-[13px]`,e?`border-primary text-text-primary`:`border-transparent text-text-2 can-hover:hover:text-text-primary`),children:[n,r]})}function Pt({run:e,onStop:t,stopping:n}){let r=e.running?.since??e.startedAt,[i,a]=(0,N.useState)(()=>Date.now());(0,N.useEffect)(()=>{let e=setInterval(()=>a(Date.now()),100);return()=>clearInterval(e)},[]);let o=e.statements.length,s=Math.max(0,(i-r)/1e3).toFixed(1);return(0,F.jsx)(`div`,{className:`pointer-events-none absolute inset-x-0 bottom-3 z-10 flex justify-center px-3`,children:(0,F.jsxs)(`div`,{className:`pointer-events-auto flex items-center gap-2.5 rounded-[10px] border border-border bg-panel px-3.5 py-2 text-xs shadow-lg max-md:text-sm`,children:[(0,F.jsx)(ne,{"aria-hidden":!0,className:`size-4 animate-spin text-text-subtle`}),(0,F.jsx)(`span`,{role:`status`,children:e.running?`Running statement ${e.running.index+1}${o>1?`/${o}`:``}`:`Running…`}),(0,F.jsxs)(`span`,{"aria-hidden":!0,className:`font-mono text-text-subtle tabular-nums`,children:[s,` s`]}),(0,F.jsxs)(`button`,{type:`button`,onClick:t,disabled:n,className:`flex h-7 items-center gap-1.5 rounded-md bg-destructive px-2.5 font-medium text-destructive-foreground disabled:opacity-60 max-md:h-11 max-md:px-3.5`,children:[(0,F.jsx)(c,{"aria-hidden":!0,className:`size-3.5`}),n?`Stopping…`:`Stop`]})]})})}function Ft(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]??r[3],a=r[4]??r[5]??r[6];return a?{schema:i,table:a}:{table:i,schema:t}}function It({tab:e,result:t,set:n,target:r,readonly:a,explain:o,connectionName:s,dialect:c,tabId:l,rereading:u,onSave:d,exporter:f}){let{keys:p,records:m}=(0,N.useMemo)(()=>Ee(n.columns,n.rows),[n]),h=(0,N.useMemo)(()=>n.columns.map(e=>e.name),[n]),g=(0,N.useMemo)(()=>o?null:Ft(t.sql,``),[t.sql,o]),_=Lt(a||o?null:r,g),v=(0,N.useMemo)(()=>yt({readonly:a,explain:o,table:g,tableColumns:_,columns:h}),[a,o,g,_,h]),y=(0,N.useMemo)(()=>v.editable?v.schema:n.columns.map((e,t)=>({name:p[t],type:e.type,nullable:!0,pk:!1,defaultValue:null})),[v,n,p]),b=t.startLine===t.endLine?`line ${t.startLine}`:`lines ${t.startLine}–${t.endLine}`;return(0,F.jsxs)(`div`,{className:`flex min-h-0 flex-1 flex-col overflow-hidden`,children:[(0,F.jsx)(`div`,{className:`min-h-0 flex-1 overflow-hidden`,children:(0,F.jsx)(Ye,{columns:p,rows:m,schema:y,loading:u,rowKey:v.editable?v.rowKey:[],editOnly:!0,readOnly:!v.editable,onSaveChanges:v.editable&&g?e=>d(g,e):void 0,connectionName:s,dialect:c,tabId:l,tabSlot:e.key,exporter:f})}),(0,F.jsxs)(`div`,{className:w(`flex h-6 shrink-0 items-center gap-2 overflow-hidden border-t border-border px-3 text-[11px] whitespace-nowrap text-text-subtle`,`max-md:h-8 max-md:text-xs`),children:[(0,F.jsx)(`span`,{className:`text-text-2`,children:P(n.rows.length,`row`)}),(0,F.jsxs)(`span`,{className:`font-mono`,children:[t.durationMs.toLocaleString(`en-US`),` ms`]}),(0,F.jsxs)(`span`,{className:`truncate max-md:hidden`,children:[`· statement `,t.index+1,`, `,b]}),n.truncated&&(0,F.jsxs)(`span`,{className:`flex items-center gap-1 text-warning`,title:`Raise the row limit in the toolbar to read more`,children:[(0,F.jsx)(S,{"aria-hidden":!0,className:`size-3.5`}),`Cut off at `,n.rows.length.toLocaleString(`en-US`),` rows`]}),(0,F.jsx)(`span`,{className:`flex-1`}),!v.editable&&v.reason&&(0,F.jsxs)(`span`,{className:`flex shrink-0 items-center gap-1 rounded-full border border-border px-2 py-px`,title:`A result can be edited only when it holds one table's rows, its primary key among them`,children:[(0,F.jsx)(i,{"aria-hidden":!0,className:`size-3`}),v.reason]})]})]})}function Lt(e,t){let[n,r]=(0,N.useState)(null),i=e&&t?JSON.stringify([e,t]):null;return(0,N.useEffect)(()=>{if(!e||!t||!i)return;let n=!0,a=t.schema?`&schema=${encodeURIComponent(t.schema)}`:``;return C.get(E(e,`/schema?table=${encodeURIComponent(t.table)}${a}`)).then(e=>{n&&r({key:i,cols:e})}).catch(()=>{n&&r({key:i,cols:null})}),()=>{n=!1}},[i]),n&&n.key===i?n.cols:void 0}var Rt=`Discard unsaved changes?`,zt=`Rows were changed in the results and not saved. Running again replaces the results and discards the changes.`;function Bt({onCancel:e,onDiscard:t}){let n=ue(),r=(0,F.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,F.jsx)(D,{variant:`outline`,onClick:e,className:`min-h-11 md:min-h-9`,autoFocus:!0,children:`Cancel`}),(0,F.jsx)(D,{variant:`destructive`,onClick:t,className:`min-h-11 md:min-h-9`,children:`Discard and run`})]});return n?(0,F.jsx)(_e,{open:!0,onClose:e,children:(0,F.jsxs)(`div`,{className:`space-y-3 px-4 pb-4`,role:`alertdialog`,"aria-label":Rt,children:[(0,F.jsx)(`h2`,{className:`text-base font-semibold`,children:Rt}),(0,F.jsx)(`p`,{className:`text-sm text-text-secondary`,children:zt}),r]})}):(0,F.jsx)(me,{open:!0,onOpenChange:t=>{t||e()},children:(0,F.jsxs)(fe,{role:`alertdialog`,children:[(0,F.jsxs)(de,{children:[(0,F.jsx)(pe,{children:Rt}),(0,F.jsx)(k,{children:zt})]}),r]})})}var Vt=`Run with write access (once)?`;function Ht({connectionName:e,sql:t,passwordRequired:n,onCancel:r,onRun:i}){let a=ue(),[o,s]=(0,N.useState)(``),c=`${e} is readonly. This runs the script below once with write access; the connection stays readonly afterwards.`,l=(0,F.jsxs)(`form`,{className:`space-y-3`,onSubmit:e=>{e.preventDefault(),(!n||o)&&i(o)},children:[(0,F.jsx)(`pre`,{className:`max-h-40 overflow-auto whitespace-pre-wrap break-all rounded border border-border bg-background p-2 font-mono text-xs text-text-secondary`,children:t}),n&&(0,F.jsx)(ve,{type:`password`,autoComplete:`current-password`,placeholder:`PPM password`,"aria-label":`PPM password`,value:o,onChange:e=>s(e.target.value),autoFocus:!0,className:`h-11 md:h-9`}),(0,F.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-1 md:flex-row md:justify-end`,children:[(0,F.jsx)(D,{type:`button`,variant:`outline`,onClick:r,className:`min-h-11 md:min-h-9`,children:`Cancel`}),(0,F.jsx)(D,{type:`submit`,variant:`destructive`,disabled:n&&!o,className:`min-h-11 md:min-h-9`,children:`Run once`})]})]});return a?(0,F.jsx)(_e,{open:!0,onClose:r,children:(0,F.jsxs)(`div`,{className:`space-y-3 px-4 pb-4`,role:`dialog`,"aria-label":Vt,children:[(0,F.jsx)(`h2`,{className:`text-base font-semibold`,children:Vt}),(0,F.jsx)(`p`,{className:`text-sm text-text-secondary`,children:c}),l]})}):(0,F.jsx)(me,{open:!0,onOpenChange:e=>{e||r()},children:(0,F.jsxs)(fe,{children:[(0,F.jsxs)(de,{children:[(0,F.jsx)(pe,{children:Vt}),(0,F.jsx)(k,{children:c})]}),l]})})}function Ut(e,t,n){let r=E(e,`/history`),i=new URLSearchParams;t.trim()&&i.set(`search`,t.trim()),n>0&&i.set(`offset`,String(n));let a=i.toString();return a?`${r}${r.includes(`?`)?`&`:`?`}${a}`:r}function Wt(e,t,n){if(n===0)return[...t];let r=new Set(e.map(e=>e.id));return[...e,...t.filter(e=>!r.has(e.id))]}function Gt(e){return e.length>=50}function Kt(e,t){let n=[Ie(Date.parse(e.ranAt),t)];return e.database&&n.push(e.database),e.status===`ok`&&e.rowCount!==null&&n.push(P(e.rowCount,`row`)),e.durationMs!==null&&n.push(`${e.durationMs.toLocaleString(`en-US`)} ms`),n}var qt={ok:`Ran`,error:`Failed`,blocked:`Blocked`};function Jt(e,t){return`Read from the existing audit log. Kept as long as audit settings say (${P(e,`day`)} / ${t.toLocaleString(`en-US`)} MB).`}var Yt=290,Xt=300,Zt=6e4,Qt={ok:`bg-success`,error:`bg-error`,blocked:`bg-warning`};function $t({target:e,refreshKey:t,floating:n,onPick:r,onClose:i}){let[a,o]=(0,N.useState)(``),[s,c]=(0,N.useState)(``);(0,N.useEffect)(()=>{let e=setTimeout(()=>c(a),Xt);return()=>clearTimeout(e)},[a]);let[l,u]=(0,N.useState)({items:[],more:!1,retention:null,loading:!0,error:null}),[d,f]=(0,N.useState)(Date.now);(0,N.useEffect)(()=>{let e=setInterval(()=>f(Date.now()),Zt);return()=>clearInterval(e)},[]);let p=(0,N.useRef)(0),m=(0,N.useRef)([]),g=(0,N.useRef)(e);g.current=e;let v=(0,N.useCallback)(async e=>{let t=++p.current;u(e=>({...e,loading:!0,error:null}));try{let n=await C.get(Ut(g.current,s,e));if(t!==p.current)return;let r=Wt(m.current,n.items,e);m.current=r,f(Date.now()),u({items:r,more:Gt(n.items),retention:{days:n.retentionDays,maxSizeMb:n.maxSizeMb},loading:!1,error:null})}catch(n){if(t!==p.current)return;u(t=>({...t,loading:!1,error:{message:n.message,offset:e}}))}},[s]);(0,N.useEffect)(()=>{v(0)},[v,E(e),t]);let y=(0,N.useRef)(null),b=(0,N.useRef)(null);(0,N.useEffect)(()=>{n&&(b.current=document.activeElement instanceof HTMLElement?document.activeElement:null,y.current?.focus())},[]);let x=()=>{i(),b.current?.focus()},S=e=>{!n||e.key!==`Escape`||e.defaultPrevented||(e.preventDefault(),e.stopPropagation(),x())},{items:ee,more:te,retention:ne,loading:re,error:ie}=l;return(0,F.jsxs)(`aside`,{"aria-label":`Query history`,onKeyDown:S,style:{width:n?`min(${Yt}px, 86%)`:Yt},className:w(`flex shrink-0 flex-col overflow-hidden border-l border-border bg-panel`,n&&`absolute inset-y-0 right-0 z-30 shadow-[-14px_0_34px_-14px_rgb(0_0_0/0.45)]`),children:[(0,F.jsxs)(`div`,{className:`flex h-9 shrink-0 items-center gap-1.5 border-b border-border-soft pr-1 pl-2.5 text-xs font-semibold text-text-primary`,children:[(0,F.jsx)(h,{"aria-hidden":!0,className:`size-4 shrink-0 text-text-2`}),`History`,(0,F.jsx)(`span`,{className:`flex-1`}),(0,F.jsx)(`button`,{type:`button`,onClick:x,"aria-label":`Close history`,title:`Close history`,className:`grid size-7 place-items-center rounded text-text-2 can-hover:hover:bg-surface-hover can-hover:hover:text-text-primary`,children:(0,F.jsx)(_,{className:`size-3.5`})})]}),(0,F.jsx)(`div`,{className:`flex shrink-0 px-2.5 py-2`,children:(0,F.jsx)(Pe,{value:a,onChange:o,placeholder:`Search history`,inputRef:y})}),(0,F.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-2 pb-2`,"aria-busy":re,children:[ee.map(e=>(0,F.jsxs)(`button`,{type:`button`,onClick:()=>r(e.sql),title:e.sql,className:w(`mb-0.5 block w-full rounded-md border border-transparent px-2 py-1.5 text-left`,`can-hover:hover:border-border can-hover:hover:bg-surface-hover focus-visible:border-primary focus-visible:outline-none`),children:[(0,F.jsxs)(`span`,{className:`mb-0.5 flex min-w-0 items-center gap-1.5 text-[11px] text-text-subtle`,children:[(0,F.jsx)(`span`,{role:`img`,"aria-label":qt[e.status],className:w(`size-[7px] shrink-0 rounded-full`,Qt[e.status])}),(0,F.jsx)(`span`,{className:`truncate`,children:Kt(e,d).join(` · `)}),e.byAgent&&(0,F.jsx)(`span`,{title:`An AI agent ran it`,className:`ml-auto shrink-0 rounded border border-border px-1 text-[10px] leading-4`,children:`agent`})]}),(0,F.jsx)(`span`,{className:`line-clamp-2 font-mono text-[11.5px] leading-[1.45] break-all text-text-primary`,children:e.sql}),e.status===`error`&&e.error&&(0,F.jsx)(`span`,{className:`mt-0.5 line-clamp-2 text-[11px] text-error`,children:e.error}),e.status===`blocked`&&(0,F.jsxs)(`span`,{className:`mt-0.5 line-clamp-2 text-[11px] text-warning`,children:[`Blocked: `,e.error??`not allowed on this connection`]})]},e.id)),ie?(0,F.jsxs)(j,{children:[(0,F.jsxs)(`span`,{role:`alert`,className:`text-error`,children:[`Could not read the history: `,ie.message]}),(0,F.jsx)(`button`,{type:`button`,onClick:()=>void v(ie.offset),className:Ne,children:`Try again`})]}):re&&ee.length===0?(0,F.jsx)(j,{children:`Reading the history…`}):ee.length===0?(0,F.jsx)(j,{children:s.trim()?`No query run here matches.`:`Nothing has been run here yet.`}):te?(0,F.jsx)(`button`,{type:`button`,onClick:()=>void v(ee.length),disabled:re,className:`mt-1 h-7 w-full rounded-md border border-border text-xs text-text-2 can-hover:hover:bg-surface-hover disabled:opacity-50`,children:re?`Reading…`:`Load more`}):null]}),ne&&(0,F.jsx)(`div`,{className:`shrink-0 border-t border-border-soft px-3 py-2 text-[11px] leading-snug text-text-subtle`,children:Jt(ne.days,ne.maxSizeMb)})]})}function en(e){let t=e?.savedPath;return typeof t==`string`&&t!==``?t:null}function tn(e){return`${e.toLowerCase().replace(/[^\p{L}\p{N}]+/gu,`-`).replace(/^-+|-+$/g,``)||`query`}.sql`}function nn(e){return/\.[^./\\]+$/.test(e)?e:`${e}.sql`}function rn(e){let t=T(e);return t.replace(/\.sql$/i,``)||t}function an(e,t,n){return{title:rn(t),metadata:{...e,savedPath:t,openedSql:n}}}function on(e){let t=Math.max(e.lastIndexOf(`/`),e.lastIndexOf(`\\`));return t<0?{dir:``,name:e}:{dir:t===0||e[t-1]===`:`?e.slice(0,t+1):e.slice(0,t),name:e.slice(t+1)}}function sn(e,t){let n=t.toLowerCase();return e.some(e=>e.type!==`directory`&&e.name.toLowerCase()===n)}async function cn(e){let{dir:t,name:n}=on(e);if(!t)return!1;try{return sn((await C.get(`/api/fs/browse?path=${encodeURIComponent(t)}&showHidden=true`)).entries,n)}catch{return!1}}function ln(e){let t=ce.getState();return t.panels[t.focusedPanelId]?.activeTabId===e}function un({tabId:e,keys:t,title:n,savedPath:r,sql:i,onSaved:a}){let[o,s]=(0,N.useState)(!1),[c,l]=(0,N.useState)(null),u=(0,N.useCallback)(async e=>{let t=i();try{await C.put(`/api/fs/write`,{path:e,content:t})}catch(t){ie.error(`Could not save ${T(e)}: ${t.message}`);return}a(e,t)},[i,a]),d=(0,N.useCallback)(()=>{r?u(r):s(!0)},[r,u]),f=(0,N.useCallback)(async e=>{s(!1);let t=nn(e);await cn(t)?l(t):u(t)},[u]),p=(0,N.useRef)(d);return p.current=d,(0,N.useEffect)(()=>{if(!t||!e)return;let n=t=>{t.repeat||!Me.getState().matchesEvent(t,`save-prevent`)||!ln(e)||t.target?.closest?.(`[role="dialog"], [role="alertdialog"]`)||(t.preventDefault(),p.current())};return window.addEventListener(`keydown`,n),()=>window.removeEventListener(`keydown`,n)},[t,e]),{save:d,dialogs:(0,F.jsxs)(F.Fragment,{children:[o&&(0,F.jsx)(M,{open:!0,defaultName:tn(n),content:``,onSave:e=>void f(e),onCancel:()=>s(!1)}),c&&(0,F.jsx)(me,{open:!0,onOpenChange:e=>{e||l(null)},children:(0,F.jsxs)(fe,{role:`alertdialog`,className:`sm:max-w-md`,children:[(0,F.jsxs)(de,{children:[(0,F.jsx)(pe,{children:`Replace file?`}),(0,F.jsxs)(k,{children:[T(c),` is already in that folder. Replacing it writes this tab's SQL over what it holds.`]})]}),(0,F.jsxs)(O,{children:[(0,F.jsx)(D,{variant:`outline`,onClick:()=>l(null),autoFocus:!0,children:`Cancel`}),(0,F.jsx)(D,{variant:`destructive`,onClick:()=>{let e=c;l(null),u(e)},children:`Replace`})]})]})})]})}}var L=e=>e.flatMap(dn),dn=e=>yn(pn(e)).map(fn),fn=e=>e.replace(/ +/g,` `).trim(),pn=e=>({type:`mandatory_block`,items:mn(e,0)[0]}),mn=(e,t,n)=>{let r=[];for(;e[t];){let[i,a]=hn(e,t);if(r.push(i),t=a,e[t]===`|`)t++;else if(e[t]===`}`||e[t]===`]`){if(n!==e[t])throw Error(`Unbalanced parenthesis in: ${e}`);return t++,[r,t]}else if(t===e.length){if(n)throw Error(`Unbalanced parenthesis in: ${e}`);return[r,t]}else throw Error(`Unexpected "${e[t]}"`)}return[r,t]},hn=(e,t)=>{let n=[];for(;;){let[r,i]=gn(e,t);if(r)n.push(r),t=i;else break}return n.length===1?[n[0],t]:[{type:`concatenation`,items:n},t]},gn=(e,t)=>{if(e[t]===`{`)return _n(e,t+1);if(e[t]===`[`)return vn(e,t+1);{let n=``;for(;e[t]&&/[A-Za-z0-9_ ]/.test(e[t]);)n+=e[t],t++;return[n,t]}},_n=(e,t)=>{let[n,r]=mn(e,t,`}`);return[{type:`mandatory_block`,items:n},r]},vn=(e,t)=>{let[n,r]=mn(e,t,`]`);return[{type:`optional_block`,items:n},r]},yn=e=>{if(typeof e==`string`)return[e];if(e.type===`concatenation`)return e.items.map(yn).reduce(bn,[``]);if(e.type===`mandatory_block`)return e.items.flatMap(yn);if(e.type===`optional_block`)return[``,...e.items.flatMap(yn)];throw Error(`Unknown node type: ${e}`)},bn=(e,t)=>{let n=[];for(let r of e)for(let e of t)n.push(r+e);return n},R;(function(e){e.QUOTED_IDENTIFIER=`QUOTED_IDENTIFIER`,e.IDENTIFIER=`IDENTIFIER`,e.STRING=`STRING`,e.VARIABLE=`VARIABLE`,e.RESERVED_DATA_TYPE=`RESERVED_DATA_TYPE`,e.RESERVED_PARAMETERIZED_DATA_TYPE=`RESERVED_PARAMETERIZED_DATA_TYPE`,e.RESERVED_KEYWORD=`RESERVED_KEYWORD`,e.RESERVED_FUNCTION_NAME=`RESERVED_FUNCTION_NAME`,e.RESERVED_KEYWORD_PHRASE=`RESERVED_KEYWORD_PHRASE`,e.RESERVED_DATA_TYPE_PHRASE=`RESERVED_DATA_TYPE_PHRASE`,e.RESERVED_SET_OPERATION=`RESERVED_SET_OPERATION`,e.RESERVED_CLAUSE=`RESERVED_CLAUSE`,e.RESERVED_SELECT=`RESERVED_SELECT`,e.RESERVED_JOIN=`RESERVED_JOIN`,e.ARRAY_IDENTIFIER=`ARRAY_IDENTIFIER`,e.ARRAY_KEYWORD=`ARRAY_KEYWORD`,e.CASE=`CASE`,e.END=`END`,e.WHEN=`WHEN`,e.ELSE=`ELSE`,e.THEN=`THEN`,e.LIMIT=`LIMIT`,e.BETWEEN=`BETWEEN`,e.AND=`AND`,e.OR=`OR`,e.XOR=`XOR`,e.OPERATOR=`OPERATOR`,e.COMMA=`COMMA`,e.ASTERISK=`ASTERISK`,e.PROPERTY_ACCESS_OPERATOR=`PROPERTY_ACCESS_OPERATOR`,e.OPEN_PAREN=`OPEN_PAREN`,e.CLOSE_PAREN=`CLOSE_PAREN`,e.LINE_COMMENT=`LINE_COMMENT`,e.BLOCK_COMMENT=`BLOCK_COMMENT`,e.DISABLE_COMMENT=`DISABLE_COMMENT`,e.NUMBER=`NUMBER`,e.NAMED_PARAMETER=`NAMED_PARAMETER`,e.QUOTED_PARAMETER=`QUOTED_PARAMETER`,e.NUMBERED_PARAMETER=`NUMBERED_PARAMETER`,e.POSITIONAL_PARAMETER=`POSITIONAL_PARAMETER`,e.CUSTOM_PARAMETER=`CUSTOM_PARAMETER`,e.DELIMITER=`DELIMITER`,e.EOF=`EOF`})(R=R||={});var xn=e=>({type:R.EOF,raw:`«EOF»`,text:`«EOF»`,start:e}),Sn=xn(1/0),z=e=>t=>t.type===e.type&&t.text===e.text,Cn={ARRAY:z({text:`ARRAY`,type:R.RESERVED_DATA_TYPE}),BY:z({text:`BY`,type:R.RESERVED_KEYWORD}),SET:z({text:`SET`,type:R.RESERVED_CLAUSE}),STRUCT:z({text:`STRUCT`,type:R.RESERVED_DATA_TYPE}),WINDOW:z({text:`WINDOW`,type:R.RESERVED_CLAUSE}),VALUES:z({text:`VALUES`,type:R.RESERVED_CLAUSE})},wn=e=>e===R.RESERVED_DATA_TYPE||e===R.RESERVED_KEYWORD||e===R.RESERVED_FUNCTION_NAME||e===R.RESERVED_KEYWORD_PHRASE||e===R.RESERVED_DATA_TYPE_PHRASE||e===R.RESERVED_CLAUSE||e===R.RESERVED_SELECT||e===R.RESERVED_SET_OPERATION||e===R.RESERVED_JOIN||e===R.ARRAY_KEYWORD||e===R.CASE||e===R.END||e===R.WHEN||e===R.ELSE||e===R.THEN||e===R.LIMIT||e===R.BETWEEN||e===R.AND||e===R.OR||e===R.XOR,Tn=e=>e===R.AND||e===R.OR||e===R.XOR;function En(e){return e.map((t,n)=>{let r=e[n+1]||Sn;if(Cn.SET(t)&&r.text===`(`)return Object.assign(Object.assign({},t),{type:R.RESERVED_FUNCTION_NAME});let i=e[n-1]||Sn;return Cn.VALUES(t)&&i.text===`=`?Object.assign(Object.assign({},t),{type:R.RESERVED_FUNCTION_NAME}):t})}var Dn=`ACCESSIBLE.ADD.ALL.ALTER.ANALYZE.AND.AS.ASC.ASENSITIVE.BEFORE.BETWEEN.BOTH.BY.CALL.CASCADE.CASE.CHANGE.CHECK.COLLATE.COLUMN.CONDITION.CONSTRAINT.CONTINUE.CONVERT.CREATE.CROSS.CURRENT_DATE.CURRENT_ROLE.CURRENT_TIME.CURRENT_TIMESTAMP.CURRENT_USER.CURSOR.DATABASE.DATABASES.DAY_HOUR.DAY_MICROSECOND.DAY_MINUTE.DAY_SECOND.DECLARE.DEFAULT.DELAYED.DELETE.DELETE_DOMAIN_ID.DESC.DESCRIBE.DETERMINISTIC.DISTINCT.DISTINCTROW.DIV.DO_DOMAIN_IDS.DROP.DUAL.EACH.ELSE.ELSEIF.ENCLOSED.ESCAPED.EXCEPT.EXISTS.EXIT.EXPLAIN.FALSE.FETCH.FOR.FORCE.FOREIGN.FROM.FULLTEXT.GENERAL.GRANT.GROUP.HAVING.HIGH_PRIORITY.HOUR_MICROSECOND.HOUR_MINUTE.HOUR_SECOND.IF.IGNORE.IGNORE_DOMAIN_IDS.IGNORE_SERVER_IDS.IN.INDEX.INFILE.INNER.INOUT.INSENSITIVE.INSERT.INTERSECT.INTERVAL.INTO.IS.ITERATE.JOIN.KEY.KEYS.KILL.LEADING.LEAVE.LEFT.LIKE.LIMIT.LINEAR.LINES.LOAD.LOCALTIME.LOCALTIMESTAMP.LOCK.LOOP.LOW_PRIORITY.MASTER_HEARTBEAT_PERIOD.MASTER_SSL_VERIFY_SERVER_CERT.MATCH.MAXVALUE.MINUTE_MICROSECOND.MINUTE_SECOND.MOD.MODIFIES.NATURAL.NOT.NO_WRITE_TO_BINLOG.NULL.OFFSET.ON.OPTIMIZE.OPTION.OPTIONALLY.OR.ORDER.OUT.OUTER.OUTFILE.OVER.PAGE_CHECKSUM.PARSE_VCOL_EXPR.PARTITION.POSITION.PRIMARY.PROCEDURE.PURGE.RANGE.READ.READS.READ_WRITE.RECURSIVE.REF_SYSTEM_ID.REFERENCES.REGEXP.RELEASE.RENAME.REPEAT.REPLACE.REQUIRE.RESIGNAL.RESTRICT.RETURN.RETURNING.REVOKE.RIGHT.RLIKE.ROW_NUMBER.ROWS.SCHEMA.SCHEMAS.SECOND_MICROSECOND.SELECT.SENSITIVE.SEPARATOR.SET.SHOW.SIGNAL.SLOW.SPATIAL.SPECIFIC.SQL.SQLEXCEPTION.SQLSTATE.SQLWARNING.SQL_BIG_RESULT.SQL_CALC_FOUND_ROWS.SQL_SMALL_RESULT.SSL.STARTING.STATS_AUTO_RECALC.STATS_PERSISTENT.STATS_SAMPLE_PAGES.STRAIGHT_JOIN.TABLE.TERMINATED.THEN.TO.TRAILING.TRIGGER.TRUE.UNDO.UNION.UNIQUE.UNLOCK.UNSIGNED.UPDATE.USAGE.USE.USING.UTC_DATE.UTC_TIME.UTC_TIMESTAMP.VALUES.WHEN.WHERE.WHILE.WINDOW.WITH.WRITE.XOR.YEAR_MONTH.ZEROFILL`.split(`.`),On=`BIGINT.BINARY.BIT.BLOB.CHAR BYTE.CHAR.CHARACTER.DATETIME.DEC.DECIMAL.DOUBLE PRECISION.DOUBLE.ENUM.FIXED.FLOAT.FLOAT4.FLOAT8.INT.INT1.INT2.INT3.INT4.INT8.INTEGER.LONG.LONGBLOB.LONGTEXT.MEDIUMBLOB.MEDIUMINT.MEDIUMTEXT.MIDDLEINT.NATIONAL CHAR.NATIONAL VARCHAR.NUMERIC.PRECISION.REAL.SMALLINT.TEXT.TIMESTAMP.TINYBLOB.TINYINT.TINYTEXT.VARBINARY.VARCHAR.VARCHARACTER.VARYING.YEAR`.split(`.`),kn=`ADDDATE.ADD_MONTHS.BIT_AND.BIT_OR.BIT_XOR.CAST.COUNT.CUME_DIST.CURDATE.CURTIME.DATE_ADD.DATE_SUB.DATE_FORMAT.DECODE.DENSE_RANK.EXTRACT.FIRST_VALUE.GROUP_CONCAT.JSON_ARRAYAGG.JSON_OBJECTAGG.LAG.LEAD.MAX.MEDIAN.MID.MIN.NOW.NTH_VALUE.NTILE.POSITION.PERCENT_RANK.PERCENTILE_CONT.PERCENTILE_DISC.RANK.ROW_NUMBER.SESSION_USER.STD.STDDEV.STDDEV_POP.STDDEV_SAMP.SUBDATE.SUBSTR.SUBSTRING.SUM.SYSTEM_USER.TRIM.TRIM_ORACLE.VARIANCE.VAR_POP.VAR_SAMP.ABS.ACOS.ADDTIME.AES_DECRYPT.AES_ENCRYPT.ASIN.ATAN.ATAN2.BENCHMARK.BIN.BINLOG_GTID_POS.BIT_COUNT.BIT_LENGTH.CEIL.CEILING.CHARACTER_LENGTH.CHAR_LENGTH.CHR.COERCIBILITY.COLUMN_CHECK.COLUMN_EXISTS.COLUMN_LIST.COLUMN_JSON.COMPRESS.CONCAT.CONCAT_OPERATOR_ORACLE.CONCAT_WS.CONNECTION_ID.CONV.CONVERT_TZ.COS.COT.CRC32.DATEDIFF.DAYNAME.DAYOFMONTH.DAYOFWEEK.DAYOFYEAR.DEGREES.DECODE_HISTOGRAM.DECODE_ORACLE.DES_DECRYPT.DES_ENCRYPT.ELT.ENCODE.ENCRYPT.EXP.EXPORT_SET.EXTRACTVALUE.FIELD.FIND_IN_SET.FLOOR.FORMAT.FOUND_ROWS.FROM_BASE64.FROM_DAYS.FROM_UNIXTIME.GET_LOCK.GREATEST.HEX.IFNULL.INSTR.ISNULL.IS_FREE_LOCK.IS_USED_LOCK.JSON_ARRAY.JSON_ARRAY_APPEND.JSON_ARRAY_INSERT.JSON_COMPACT.JSON_CONTAINS.JSON_CONTAINS_PATH.JSON_DEPTH.JSON_DETAILED.JSON_EXISTS.JSON_EXTRACT.JSON_INSERT.JSON_KEYS.JSON_LENGTH.JSON_LOOSE.JSON_MERGE.JSON_MERGE_PATCH.JSON_MERGE_PRESERVE.JSON_QUERY.JSON_QUOTE.JSON_OBJECT.JSON_REMOVE.JSON_REPLACE.JSON_SET.JSON_SEARCH.JSON_TYPE.JSON_UNQUOTE.JSON_VALID.JSON_VALUE.LAST_DAY.LAST_INSERT_ID.LCASE.LEAST.LENGTH.LENGTHB.LN.LOAD_FILE.LOCATE.LOG.LOG10.LOG2.LOWER.LPAD.LPAD_ORACLE.LTRIM.LTRIM_ORACLE.MAKEDATE.MAKETIME.MAKE_SET.MASTER_GTID_WAIT.MASTER_POS_WAIT.MD5.MONTHNAME.NAME_CONST.NVL.NVL2.OCT.OCTET_LENGTH.ORD.PERIOD_ADD.PERIOD_DIFF.PI.POW.POWER.QUOTE.REGEXP_INSTR.REGEXP_REPLACE.REGEXP_SUBSTR.RADIANS.RAND.RELEASE_ALL_LOCKS.RELEASE_LOCK.REPLACE_ORACLE.REVERSE.ROUND.RPAD.RPAD_ORACLE.RTRIM.RTRIM_ORACLE.SEC_TO_TIME.SHA.SHA1.SHA2.SIGN.SIN.SLEEP.SOUNDEX.SPACE.SQRT.STRCMP.STR_TO_DATE.SUBSTR_ORACLE.SUBSTRING_INDEX.SUBTIME.SYS_GUID.TAN.TIMEDIFF.TIME_FORMAT.TIME_TO_SEC.TO_BASE64.TO_CHAR.TO_DAYS.TO_SECONDS.UCASE.UNCOMPRESS.UNCOMPRESSED_LENGTH.UNHEX.UNIX_TIMESTAMP.UPDATEXML.UPPER.UUID.UUID_SHORT.VERSION.WEEKDAY.WEEKOFYEAR.WSREP_LAST_WRITTEN_GTID.WSREP_LAST_SEEN_GTID.WSREP_SYNC_WAIT_UPTO_GTID.YEARWEEK.COALESCE.NULLIF`.split(`.`),An=L([`SELECT [ALL | DISTINCT | DISTINCTROW]`]),jn=L([`WITH [RECURSIVE]`,`FROM`,`WHERE`,`GROUP BY`,`HAVING`,`PARTITION BY`,`ORDER BY`,`LIMIT`,`OFFSET`,`FETCH {FIRST | NEXT}`,`INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO]`,`REPLACE [LOW_PRIORITY | DELAYED] [INTO]`,`VALUES`,`ON DUPLICATE KEY UPDATE`,`SET`,`RETURNING`]),Mn=L([`CREATE [OR REPLACE] [TEMPORARY] TABLE [IF NOT EXISTS]`]),Nn=L(`CREATE [OR REPLACE] [SQL SECURITY DEFINER | SQL SECURITY INVOKER] VIEW [IF NOT EXISTS].UPDATE [LOW_PRIORITY] [IGNORE].DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM.DROP [TEMPORARY] TABLE [IF EXISTS].ALTER [ONLINE] [IGNORE] TABLE [IF EXISTS].ADD [COLUMN] [IF NOT EXISTS].{CHANGE | MODIFY} [COLUMN] [IF EXISTS].DROP [COLUMN] [IF EXISTS].RENAME [TO].RENAME COLUMN.ALTER [COLUMN].{SET | DROP} DEFAULT.SET {VISIBLE | INVISIBLE}.TRUNCATE [TABLE].ALTER DATABASE.ALTER DATABASE COMMENT.ALTER EVENT.ALTER FUNCTION.ALTER PROCEDURE.ALTER SCHEMA.ALTER SCHEMA COMMENT.ALTER SEQUENCE.ALTER SERVER.ALTER USER.ALTER VIEW.ANALYZE.ANALYZE TABLE.BACKUP LOCK.BACKUP STAGE.BACKUP UNLOCK.BEGIN.BINLOG.CACHE INDEX.CALL.CHANGE MASTER TO.CHECK TABLE.CHECK VIEW.CHECKSUM TABLE.COMMIT.CREATE AGGREGATE FUNCTION.CREATE DATABASE.CREATE EVENT.CREATE FUNCTION.CREATE INDEX.CREATE PROCEDURE.CREATE ROLE.CREATE SEQUENCE.CREATE SERVER.CREATE SPATIAL INDEX.CREATE TRIGGER.CREATE UNIQUE INDEX.CREATE USER.DEALLOCATE PREPARE.DESCRIBE.DROP DATABASE.DROP EVENT.DROP FUNCTION.DROP INDEX.DROP PREPARE.DROP PROCEDURE.DROP ROLE.DROP SEQUENCE.DROP SERVER.DROP TRIGGER.DROP USER.DROP VIEW.EXECUTE.EXPLAIN.FLUSH.GET DIAGNOSTICS.GET DIAGNOSTICS CONDITION.GRANT.HANDLER.HELP.INSTALL PLUGIN.INSTALL SONAME.KILL.LOAD DATA INFILE.LOAD INDEX INTO CACHE.LOAD XML INFILE.LOCK TABLE.OPTIMIZE TABLE.PREPARE.PURGE BINARY LOGS.PURGE MASTER LOGS.RELEASE SAVEPOINT.RENAME TABLE.RENAME USER.REPAIR TABLE.REPAIR VIEW.RESET MASTER.RESET QUERY CACHE.RESET REPLICA.RESET SLAVE.RESIGNAL.REVOKE.ROLLBACK.SAVEPOINT.SET CHARACTER SET.SET DEFAULT ROLE.SET GLOBAL TRANSACTION.SET NAMES.SET PASSWORD.SET ROLE.SET STATEMENT.SET TRANSACTION.SHOW.SHOW ALL REPLICAS STATUS.SHOW ALL SLAVES STATUS.SHOW AUTHORS.SHOW BINARY LOGS.SHOW BINLOG EVENTS.SHOW BINLOG STATUS.SHOW CHARACTER SET.SHOW CLIENT_STATISTICS.SHOW COLLATION.SHOW COLUMNS.SHOW CONTRIBUTORS.SHOW CREATE DATABASE.SHOW CREATE EVENT.SHOW CREATE FUNCTION.SHOW CREATE PACKAGE.SHOW CREATE PACKAGE BODY.SHOW CREATE PROCEDURE.SHOW CREATE SEQUENCE.SHOW CREATE TABLE.SHOW CREATE TRIGGER.SHOW CREATE USER.SHOW CREATE VIEW.SHOW DATABASES.SHOW ENGINE.SHOW ENGINE INNODB STATUS.SHOW ENGINES.SHOW ERRORS.SHOW EVENTS.SHOW EXPLAIN.SHOW FUNCTION CODE.SHOW FUNCTION STATUS.SHOW GRANTS.SHOW INDEX.SHOW INDEXES.SHOW INDEX_STATISTICS.SHOW KEYS.SHOW LOCALES.SHOW MASTER LOGS.SHOW MASTER STATUS.SHOW OPEN TABLES.SHOW PACKAGE BODY CODE.SHOW PACKAGE BODY STATUS.SHOW PACKAGE STATUS.SHOW PLUGINS.SHOW PLUGINS SONAME.SHOW PRIVILEGES.SHOW PROCEDURE CODE.SHOW PROCEDURE STATUS.SHOW PROCESSLIST.SHOW PROFILE.SHOW PROFILES.SHOW QUERY_RESPONSE_TIME.SHOW RELAYLOG EVENTS.SHOW REPLICA.SHOW REPLICA HOSTS.SHOW REPLICA STATUS.SHOW SCHEMAS.SHOW SLAVE.SHOW SLAVE HOSTS.SHOW SLAVE STATUS.SHOW STATUS.SHOW STORAGE ENGINES.SHOW TABLE STATUS.SHOW TABLES.SHOW TRIGGERS.SHOW USER_STATISTICS.SHOW VARIABLES.SHOW WARNINGS.SHOW WSREP_MEMBERSHIP.SHOW WSREP_STATUS.SHUTDOWN.SIGNAL.START ALL REPLICAS.START ALL SLAVES.START REPLICA.START SLAVE.START TRANSACTION.STOP ALL REPLICAS.STOP ALL SLAVES.STOP REPLICA.STOP SLAVE.UNINSTALL PLUGIN.UNINSTALL SONAME.UNLOCK TABLE.USE.XA BEGIN.XA COMMIT.XA END.XA PREPARE.XA RECOVER.XA ROLLBACK.XA START`.split(`.`)),Pn=L([`UNION [ALL | DISTINCT]`,`EXCEPT [ALL | DISTINCT]`,`INTERSECT [ALL | DISTINCT]`,`MINUS [ALL | DISTINCT]`]),Fn=L([`JOIN`,`{LEFT | RIGHT} [OUTER] JOIN`,`{INNER | CROSS} JOIN`,`NATURAL JOIN`,`NATURAL {LEFT | RIGHT} [OUTER] JOIN`,`STRAIGHT_JOIN`]),In=L([`ON {UPDATE | DELETE} [SET NULL | SET DEFAULT]`,`CHARACTER SET`,`{ROWS | RANGE} BETWEEN`,`IDENTIFIED BY`]),Ln=L([]),Rn={name:`mariadb`,tokenizerOptions:{reservedSelect:An,reservedClauses:[...jn,...Mn,...Nn],reservedSetOperations:Pn,reservedJoins:Fn,reservedKeywordPhrases:In,reservedDataTypePhrases:Ln,supportsXor:!0,reservedKeywords:Dn,reservedDataTypes:On,reservedFunctionNames:kn,stringTypes:[`""-qq-bs`,`''-qq-bs`,{quote:`''-raw`,prefixes:[`B`,`X`],requirePrefix:!0}],identTypes:["``"],identChars:{first:`$`,rest:`$`,allowFirstCharNumber:!0},variableTypes:[{regex:`@@?[A-Za-z0-9_.$]+`},{quote:`""-qq-bs`,prefixes:[`@`],requirePrefix:!0},{quote:`''-qq-bs`,prefixes:[`@`],requirePrefix:!0},{quote:"``",prefixes:[`@`],requirePrefix:!0}],paramTypes:{positional:!0},lineCommentTypes:[`--`,`#`],operators:[`%`,`:=`,`&`,`|`,`^`,`~`,`<<`,`>>`,`<=>`,`&&`,`||`,`!`,`*.*`],postProcess:En},formatOptions:{onelineClauses:[...Mn,...Nn],tabularOnelineClauses:Nn}},zn=`ACCESSIBLE.ADD.ALL.ALTER.ANALYZE.AND.AS.ASC.ASENSITIVE.BEFORE.BETWEEN.BOTH.BY.CALL.CASCADE.CASE.CHANGE.CHECK.COLLATE.COLUMN.CONDITION.CONSTRAINT.CONTINUE.CONVERT.CREATE.CROSS.CUBE.CUME_DIST.CURRENT_DATE.CURRENT_TIME.CURRENT_TIMESTAMP.CURRENT_USER.CURSOR.DATABASE.DATABASES.DAY_HOUR.DAY_MICROSECOND.DAY_MINUTE.DAY_SECOND.DECLARE.DEFAULT.DELAYED.DELETE.DENSE_RANK.DESC.DESCRIBE.DETERMINISTIC.DISTINCT.DISTINCTROW.DIV.DROP.DUAL.EACH.ELSE.ELSEIF.EMPTY.ENCLOSED.ESCAPED.EXCEPT.EXISTS.EXIT.EXPLAIN.FALSE.FETCH.FIRST_VALUE.FOR.FORCE.FOREIGN.FROM.FULLTEXT.FUNCTION.GENERATED.GET.GRANT.GROUP.GROUPING.GROUPS.HAVING.HIGH_PRIORITY.HOUR_MICROSECOND.HOUR_MINUTE.HOUR_SECOND.IF.IGNORE.IN.INDEX.INFILE.INNER.INOUT.INSENSITIVE.INSERT.IN.INTERSECT.INTERVAL.INTO.IO_AFTER_GTIDS.IO_BEFORE_GTIDS.IS.ITERATE.JOIN.JSON_TABLE.KEY.KEYS.KILL.LAG.LAST_VALUE.LATERAL.LEAD.LEADING.LEAVE.LEFT.LIKE.LIMIT.LINEAR.LINES.LOAD.LOCALTIME.LOCALTIMESTAMP.LOCK.LONG.LOOP.LOW_PRIORITY.MASTER_BIND.MASTER_SSL_VERIFY_SERVER_CERT.MATCH.MAXVALUE.MINUTE_MICROSECOND.MINUTE_SECOND.MOD.MODIFIES.NATURAL.NOT.NO_WRITE_TO_BINLOG.NTH_VALUE.NTILE.NULL.OF.ON.OPTIMIZE.OPTIMIZER_COSTS.OPTION.OPTIONALLY.OR.ORDER.OUT.OUTER.OUTFILE.OVER.PARTITION.PERCENT_RANK.PRIMARY.PROCEDURE.PURGE.RANGE.RANK.READ.READS.READ_WRITE.RECURSIVE.REFERENCES.REGEXP.RELEASE.RENAME.REPEAT.REPLACE.REQUIRE.RESIGNAL.RESTRICT.RETURN.REVOKE.RIGHT.RLIKE.ROW.ROWS.ROW_NUMBER.SCHEMA.SCHEMAS.SECOND_MICROSECOND.SELECT.SENSITIVE.SEPARATOR.SET.SHOW.SIGNAL.SPATIAL.SPECIFIC.SQL.SQLEXCEPTION.SQLSTATE.SQLWARNING.SQL_BIG_RESULT.SQL_CALC_FOUND_ROWS.SQL_SMALL_RESULT.SSL.STARTING.STORED.STRAIGHT_JOIN.SYSTEM.TABLE.TERMINATED.THEN.TO.TRAILING.TRIGGER.TRUE.UNDO.UNION.UNIQUE.UNLOCK.UNSIGNED.UPDATE.USAGE.USE.USING.UTC_DATE.UTC_TIME.UTC_TIMESTAMP.VALUES.VIRTUAL.WHEN.WHERE.WHILE.WINDOW.WITH.WRITE.XOR.YEAR_MONTH.ZEROFILL`.split(`.`),Bn=`BIGINT.BINARY.BIT.BLOB.BOOL.BOOLEAN.CHAR.CHARACTER.DATE.DATETIME.DEC.DECIMAL.DOUBLE PRECISION.DOUBLE.ENUM.FIXED.FLOAT.FLOAT4.FLOAT8.INT.INT1.INT2.INT3.INT4.INT8.INTEGER.LONGBLOB.LONGTEXT.MEDIUMBLOB.MEDIUMINT.MEDIUMTEXT.MIDDLEINT.NATIONAL CHAR.NATIONAL VARCHAR.NUMERIC.PRECISION.REAL.SMALLINT.TEXT.TIME.TIMESTAMP.TINYBLOB.TINYINT.TINYTEXT.VARBINARY.VARCHAR.VARCHARACTER.VARYING.YEAR`.split(`.`),Vn=`ABS.ACOS.ADDDATE.ADDTIME.AES_DECRYPT.AES_ENCRYPT.ANY_VALUE.ASCII.ASIN.ATAN.ATAN2.AVG.BENCHMARK.BIN.BIN_TO_UUID.BINARY.BIT_AND.BIT_COUNT.BIT_LENGTH.BIT_OR.BIT_XOR.CAN_ACCESS_COLUMN.CAN_ACCESS_DATABASE.CAN_ACCESS_TABLE.CAN_ACCESS_USER.CAN_ACCESS_VIEW.CAST.CEIL.CEILING.CHAR.CHAR_LENGTH.CHARACTER_LENGTH.CHARSET.COALESCE.COERCIBILITY.COLLATION.COMPRESS.CONCAT.CONCAT_WS.CONNECTION_ID.CONV.CONVERT.CONVERT_TZ.COS.COT.COUNT.CRC32.CUME_DIST.CURDATE.CURRENT_DATE.CURRENT_ROLE.CURRENT_TIME.CURRENT_TIMESTAMP.CURRENT_USER.CURTIME.DATABASE.DATE.DATE_ADD.DATE_FORMAT.DATE_SUB.DATEDIFF.DAY.DAYNAME.DAYOFMONTH.DAYOFWEEK.DAYOFYEAR.DEFAULT.DEGREES.DENSE_RANK.DIV.ELT.EXP.EXPORT_SET.EXTRACT.EXTRACTVALUE.FIELD.FIND_IN_SET.FIRST_VALUE.FLOOR.FORMAT.FORMAT_BYTES.FORMAT_PICO_TIME.FOUND_ROWS.FROM_BASE64.FROM_DAYS.FROM_UNIXTIME.GEOMCOLLECTION.GEOMETRYCOLLECTION.GET_DD_COLUMN_PRIVILEGES.GET_DD_CREATE_OPTIONS.GET_DD_INDEX_SUB_PART_LENGTH.GET_FORMAT.GET_LOCK.GREATEST.GROUP_CONCAT.GROUPING.GTID_SUBSET.GTID_SUBTRACT.HEX.HOUR.ICU_VERSION.IF.IFNULL.INET_ATON.INET_NTOA.INET6_ATON.INET6_NTOA.INSERT.INSTR.INTERNAL_AUTO_INCREMENT.INTERNAL_AVG_ROW_LENGTH.INTERNAL_CHECK_TIME.INTERNAL_CHECKSUM.INTERNAL_DATA_FREE.INTERNAL_DATA_LENGTH.INTERNAL_DD_CHAR_LENGTH.INTERNAL_GET_COMMENT_OR_ERROR.INTERNAL_GET_ENABLED_ROLE_JSON.INTERNAL_GET_HOSTNAME.INTERNAL_GET_USERNAME.INTERNAL_GET_VIEW_WARNING_OR_ERROR.INTERNAL_INDEX_COLUMN_CARDINALITY.INTERNAL_INDEX_LENGTH.INTERNAL_IS_ENABLED_ROLE.INTERNAL_IS_MANDATORY_ROLE.INTERNAL_KEYS_DISABLED.INTERNAL_MAX_DATA_LENGTH.INTERNAL_TABLE_ROWS.INTERNAL_UPDATE_TIME.INTERVAL.IS.IS_FREE_LOCK.IS_IPV4.IS_IPV4_COMPAT.IS_IPV4_MAPPED.IS_IPV6.IS NOT.IS NOT NULL.IS NULL.IS_USED_LOCK.IS_UUID.ISNULL.JSON_ARRAY.JSON_ARRAY_APPEND.JSON_ARRAY_INSERT.JSON_ARRAYAGG.JSON_CONTAINS.JSON_CONTAINS_PATH.JSON_DEPTH.JSON_EXTRACT.JSON_INSERT.JSON_KEYS.JSON_LENGTH.JSON_MERGE.JSON_MERGE_PATCH.JSON_MERGE_PRESERVE.JSON_OBJECT.JSON_OBJECTAGG.JSON_OVERLAPS.JSON_PRETTY.JSON_QUOTE.JSON_REMOVE.JSON_REPLACE.JSON_SCHEMA_VALID.JSON_SCHEMA_VALIDATION_REPORT.JSON_SEARCH.JSON_SET.JSON_STORAGE_FREE.JSON_STORAGE_SIZE.JSON_TABLE.JSON_TYPE.JSON_UNQUOTE.JSON_VALID.JSON_VALUE.LAG.LAST_DAY.LAST_INSERT_ID.LAST_VALUE.LCASE.LEAD.LEAST.LEFT.LENGTH.LIKE.LINESTRING.LN.LOAD_FILE.LOCALTIME.LOCALTIMESTAMP.LOCATE.LOG.LOG10.LOG2.LOWER.LPAD.LTRIM.MAKE_SET.MAKEDATE.MAKETIME.MASTER_POS_WAIT.MATCH.MAX.MBRCONTAINS.MBRCOVEREDBY.MBRCOVERS.MBRDISJOINT.MBREQUALS.MBRINTERSECTS.MBROVERLAPS.MBRTOUCHES.MBRWITHIN.MD5.MICROSECOND.MID.MIN.MINUTE.MOD.MONTH.MONTHNAME.MULTILINESTRING.MULTIPOINT.MULTIPOLYGON.NAME_CONST.NOW.NTH_VALUE.NTILE.NULLIF.OCT.OCTET_LENGTH.ORD.PERCENT_RANK.PERIOD_ADD.PERIOD_DIFF.PI.POINT.POLYGON.POSITION.POW.POWER.PS_CURRENT_THREAD_ID.PS_THREAD_ID.QUARTER.QUOTE.RADIANS.RAND.RANDOM_BYTES.RANK.REGEXP.REGEXP_INSTR.REGEXP_LIKE.REGEXP_REPLACE.REGEXP_SUBSTR.RELEASE_ALL_LOCKS.RELEASE_LOCK.REPEAT.REPLACE.REVERSE.RIGHT.RLIKE.ROLES_GRAPHML.ROUND.ROW_COUNT.ROW_NUMBER.RPAD.RTRIM.SCHEMA.SEC_TO_TIME.SECOND.SESSION_USER.SHA1.SHA2.SIGN.SIN.SLEEP.SOUNDEX.SOUNDS LIKE.SOURCE_POS_WAIT.SPACE.SQRT.ST_AREA.ST_ASBINARY.ST_ASGEOJSON.ST_ASTEXT.ST_BUFFER.ST_BUFFER_STRATEGY.ST_CENTROID.ST_COLLECT.ST_CONTAINS.ST_CONVEXHULL.ST_CROSSES.ST_DIFFERENCE.ST_DIMENSION.ST_DISJOINT.ST_DISTANCE.ST_DISTANCE_SPHERE.ST_ENDPOINT.ST_ENVELOPE.ST_EQUALS.ST_EXTERIORRING.ST_FRECHETDISTANCE.ST_GEOHASH.ST_GEOMCOLLFROMTEXT.ST_GEOMCOLLFROMWKB.ST_GEOMETRYN.ST_GEOMETRYTYPE.ST_GEOMFROMGEOJSON.ST_GEOMFROMTEXT.ST_GEOMFROMWKB.ST_HAUSDORFFDISTANCE.ST_INTERIORRINGN.ST_INTERSECTION.ST_INTERSECTS.ST_ISCLOSED.ST_ISEMPTY.ST_ISSIMPLE.ST_ISVALID.ST_LATFROMGEOHASH.ST_LATITUDE.ST_LENGTH.ST_LINEFROMTEXT.ST_LINEFROMWKB.ST_LINEINTERPOLATEPOINT.ST_LINEINTERPOLATEPOINTS.ST_LONGFROMGEOHASH.ST_LONGITUDE.ST_MAKEENVELOPE.ST_MLINEFROMTEXT.ST_MLINEFROMWKB.ST_MPOINTFROMTEXT.ST_MPOINTFROMWKB.ST_MPOLYFROMTEXT.ST_MPOLYFROMWKB.ST_NUMGEOMETRIES.ST_NUMINTERIORRING.ST_NUMPOINTS.ST_OVERLAPS.ST_POINTATDISTANCE.ST_POINTFROMGEOHASH.ST_POINTFROMTEXT.ST_POINTFROMWKB.ST_POINTN.ST_POLYFROMTEXT.ST_POLYFROMWKB.ST_SIMPLIFY.ST_SRID.ST_STARTPOINT.ST_SWAPXY.ST_SYMDIFFERENCE.ST_TOUCHES.ST_TRANSFORM.ST_UNION.ST_VALIDATE.ST_WITHIN.ST_X.ST_Y.STATEMENT_DIGEST.STATEMENT_DIGEST_TEXT.STD.STDDEV.STDDEV_POP.STDDEV_SAMP.STR_TO_DATE.STRCMP.SUBDATE.SUBSTR.SUBSTRING.SUBSTRING_INDEX.SUBTIME.SUM.SYSDATE.SYSTEM_USER.TAN.TIME.TIME_FORMAT.TIME_TO_SEC.TIMEDIFF.TIMESTAMP.TIMESTAMPADD.TIMESTAMPDIFF.TO_BASE64.TO_DAYS.TO_SECONDS.TRIM.TRUNCATE.UCASE.UNCOMPRESS.UNCOMPRESSED_LENGTH.UNHEX.UNIX_TIMESTAMP.UPDATEXML.UPPER.UTC_DATE.UTC_TIME.UTC_TIMESTAMP.UUID.UUID_SHORT.UUID_TO_BIN.VALIDATE_PASSWORD_STRENGTH.VALUES.VAR_POP.VAR_SAMP.VARIANCE.VERSION.WAIT_FOR_EXECUTED_GTID_SET.WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS.WEEK.WEEKDAY.WEEKOFYEAR.WEIGHT_STRING.YEAR.YEARWEEK`.split(`.`),Hn=L([`SELECT [ALL | DISTINCT | DISTINCTROW]`]),Un=L([`WITH [RECURSIVE]`,`FROM`,`WHERE`,`GROUP BY`,`HAVING`,`WINDOW`,`PARTITION BY`,`ORDER BY`,`LIMIT`,`OFFSET`,`INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO]`,`REPLACE [LOW_PRIORITY | DELAYED] [INTO]`,`VALUES`,`ON DUPLICATE KEY UPDATE`,`SET`]),Wn=L([`CREATE [TEMPORARY] TABLE [IF NOT EXISTS]`]),Gn=L(`CREATE [OR REPLACE] [SQL SECURITY DEFINER | SQL SECURITY INVOKER] VIEW [IF NOT EXISTS].UPDATE [LOW_PRIORITY] [IGNORE].DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM.DROP [TEMPORARY] TABLE [IF EXISTS].ALTER TABLE.ADD [COLUMN].{CHANGE | MODIFY} [COLUMN].DROP [COLUMN].RENAME [TO | AS].RENAME COLUMN.ALTER [COLUMN].{SET | DROP} DEFAULT.TRUNCATE [TABLE].ALTER DATABASE.ALTER EVENT.ALTER FUNCTION.ALTER INSTANCE.ALTER LOGFILE GROUP.ALTER PROCEDURE.ALTER RESOURCE GROUP.ALTER SERVER.ALTER TABLESPACE.ALTER USER.ALTER VIEW.ANALYZE TABLE.BINLOG.CACHE INDEX.CALL.CHANGE MASTER TO.CHANGE REPLICATION FILTER.CHANGE REPLICATION SOURCE TO.CHECK TABLE.CHECKSUM TABLE.CLONE.COMMIT.CREATE DATABASE.CREATE EVENT.CREATE FUNCTION.CREATE FUNCTION.CREATE INDEX.CREATE LOGFILE GROUP.CREATE PROCEDURE.CREATE RESOURCE GROUP.CREATE ROLE.CREATE SERVER.CREATE SPATIAL REFERENCE SYSTEM.CREATE TABLESPACE.CREATE TRIGGER.CREATE USER.DEALLOCATE PREPARE.DESCRIBE.DROP DATABASE.DROP EVENT.DROP FUNCTION.DROP FUNCTION.DROP INDEX.DROP LOGFILE GROUP.DROP PROCEDURE.DROP RESOURCE GROUP.DROP ROLE.DROP SERVER.DROP SPATIAL REFERENCE SYSTEM.DROP TABLESPACE.DROP TRIGGER.DROP USER.DROP VIEW.EXECUTE.EXPLAIN.FLUSH.GRANT.HANDLER.HELP.IMPORT TABLE.INSTALL COMPONENT.INSTALL PLUGIN.KILL.LOAD DATA.LOAD INDEX INTO CACHE.LOAD XML.LOCK INSTANCE FOR BACKUP.LOCK TABLES.MASTER_POS_WAIT.OPTIMIZE TABLE.PREPARE.PURGE BINARY LOGS.RELEASE SAVEPOINT.RENAME TABLE.RENAME USER.REPAIR TABLE.RESET.RESET MASTER.RESET PERSIST.RESET REPLICA.RESET SLAVE.RESTART.REVOKE.ROLLBACK.ROLLBACK TO SAVEPOINT.SAVEPOINT.SET CHARACTER SET.SET DEFAULT ROLE.SET NAMES.SET PASSWORD.SET RESOURCE GROUP.SET ROLE.SET TRANSACTION.SHOW.SHOW BINARY LOGS.SHOW BINLOG EVENTS.SHOW CHARACTER SET.SHOW COLLATION.SHOW COLUMNS.SHOW CREATE DATABASE.SHOW CREATE EVENT.SHOW CREATE FUNCTION.SHOW CREATE PROCEDURE.SHOW CREATE TABLE.SHOW CREATE TRIGGER.SHOW CREATE USER.SHOW CREATE VIEW.SHOW DATABASES.SHOW ENGINE.SHOW ENGINES.SHOW ERRORS.SHOW EVENTS.SHOW FUNCTION CODE.SHOW FUNCTION STATUS.SHOW GRANTS.SHOW INDEX.SHOW MASTER STATUS.SHOW OPEN TABLES.SHOW PLUGINS.SHOW PRIVILEGES.SHOW PROCEDURE CODE.SHOW PROCEDURE STATUS.SHOW PROCESSLIST.SHOW PROFILE.SHOW PROFILES.SHOW RELAYLOG EVENTS.SHOW REPLICA STATUS.SHOW REPLICAS.SHOW SLAVE.SHOW SLAVE HOSTS.SHOW STATUS.SHOW TABLE STATUS.SHOW TABLES.SHOW TRIGGERS.SHOW VARIABLES.SHOW WARNINGS.SHUTDOWN.SOURCE_POS_WAIT.START GROUP_REPLICATION.START REPLICA.START SLAVE.START TRANSACTION.STOP GROUP_REPLICATION.STOP REPLICA.STOP SLAVE.TABLE.UNINSTALL COMPONENT.UNINSTALL PLUGIN.UNLOCK INSTANCE.UNLOCK TABLES.USE.XA.ITERATE.LEAVE.LOOP.REPEAT.RETURN.WHILE`.split(`.`)),Kn=L([`UNION [ALL | DISTINCT]`]),qn=L([`JOIN`,`{LEFT | RIGHT} [OUTER] JOIN`,`{INNER | CROSS} JOIN`,`NATURAL [INNER] JOIN`,`NATURAL {LEFT | RIGHT} [OUTER] JOIN`,`STRAIGHT_JOIN`]),Jn=L([`ON {UPDATE | DELETE} [SET NULL]`,`CHARACTER SET`,`{ROWS | RANGE} BETWEEN`,`IDENTIFIED BY`]),Yn=L([]),Xn={name:`mysql`,tokenizerOptions:{reservedSelect:Hn,reservedClauses:[...Un,...Wn,...Gn],reservedSetOperations:Kn,reservedJoins:qn,reservedKeywordPhrases:Jn,reservedDataTypePhrases:Yn,supportsXor:!0,reservedKeywords:zn,reservedDataTypes:Bn,reservedFunctionNames:Vn,stringTypes:[`""-qq-bs`,{quote:`''-qq-bs`,prefixes:[`N`]},{quote:`''-raw`,prefixes:[`B`,`X`],requirePrefix:!0}],identTypes:["``"],identChars:{first:`$`,rest:`$`,allowFirstCharNumber:!0},variableTypes:[{regex:`@@?[A-Za-z0-9_.$]+`},{quote:`""-qq-bs`,prefixes:[`@`],requirePrefix:!0},{quote:`''-qq-bs`,prefixes:[`@`],requirePrefix:!0},{quote:"``",prefixes:[`@`],requirePrefix:!0}],paramTypes:{positional:!0},lineCommentTypes:[`--`,`#`],operators:[`%`,`:=`,`&`,`|`,`^`,`~`,`<<`,`>>`,`<=>`,`->`,`->>`,`&&`,`||`,`!`,`*.*`],postProcess:En},formatOptions:{onelineClauses:[...Wn,...Gn],tabularOnelineClauses:Gn}},Zn=`ABS.ACOS.ACOSD.ACOSH.ASIN.ASIND.ASINH.ATAN.ATAN2.ATAN2D.ATAND.ATANH.CBRT.CEIL.CEILING.COS.COSD.COSH.COT.COTD.DEGREES.DIV.EXP.FACTORIAL.FLOOR.GCD.LCM.LN.LOG.LOG10.MIN_SCALE.MOD.PI.POWER.RADIANS.RANDOM.ROUND.SCALE.SETSEED.SIGN.SIN.SIND.SINH.SQRT.TAN.TAND.TANH.TRIM_SCALE.TRUNC.WIDTH_BUCKET.ABS.ASCII.BIT_LENGTH.BTRIM.CHARACTER_LENGTH.CHAR_LENGTH.CHR.CONCAT.CONCAT_WS.FORMAT.INITCAP.LEFT.LENGTH.LOWER.LPAD.LTRIM.MD5.NORMALIZE.OCTET_LENGTH.OVERLAY.PARSE_IDENT.PG_CLIENT_ENCODING.POSITION.QUOTE_IDENT.QUOTE_LITERAL.QUOTE_NULLABLE.REGEXP_MATCH.REGEXP_MATCHES.REGEXP_REPLACE.REGEXP_SPLIT_TO_ARRAY.REGEXP_SPLIT_TO_TABLE.REPEAT.REPLACE.REVERSE.RIGHT.RPAD.RTRIM.SPLIT_PART.SPRINTF.STARTS_WITH.STRING_AGG.STRING_TO_ARRAY.STRING_TO_TABLE.STRPOS.SUBSTR.SUBSTRING.TO_ASCII.TO_HEX.TRANSLATE.TRIM.UNISTR.UPPER.BIT_COUNT.BIT_LENGTH.BTRIM.CONVERT.CONVERT_FROM.CONVERT_TO.DECODE.ENCODE.GET_BIT.GET_BYTE.LENGTH.LTRIM.MD5.OCTET_LENGTH.OVERLAY.POSITION.RTRIM.SET_BIT.SET_BYTE.SHA224.SHA256.SHA384.SHA512.STRING_AGG.SUBSTR.SUBSTRING.TRIM.BIT_COUNT.BIT_LENGTH.GET_BIT.LENGTH.OCTET_LENGTH.OVERLAY.POSITION.SET_BIT.SUBSTRING.REGEXP_MATCH.REGEXP_MATCHES.REGEXP_REPLACE.REGEXP_SPLIT_TO_ARRAY.REGEXP_SPLIT_TO_TABLE.TO_CHAR.TO_DATE.TO_NUMBER.TO_TIMESTAMP.CLOCK_TIMESTAMP.CURRENT_DATE.CURRENT_TIME.CURRENT_TIMESTAMP.DATE_BIN.DATE_PART.DATE_TRUNC.EXTRACT.ISFINITE.JUSTIFY_DAYS.JUSTIFY_HOURS.JUSTIFY_INTERVAL.LOCALTIME.LOCALTIMESTAMP.MAKE_DATE.MAKE_INTERVAL.MAKE_TIME.MAKE_TIMESTAMP.MAKE_TIMESTAMPTZ.NOW.PG_SLEEP.PG_SLEEP_FOR.PG_SLEEP_UNTIL.STATEMENT_TIMESTAMP.TIMEOFDAY.TO_TIMESTAMP.TRANSACTION_TIMESTAMP.ENUM_FIRST.ENUM_LAST.ENUM_RANGE.AREA.BOUND_BOX.BOX.CENTER.CIRCLE.DIAGONAL.DIAMETER.HEIGHT.ISCLOSED.ISOPEN.LENGTH.LINE.LSEG.NPOINTS.PATH.PCLOSE.POINT.POLYGON.POPEN.RADIUS.SLOPE.WIDTH.ABBREV.BROADCAST.FAMILY.HOST.HOSTMASK.INET_MERGE.INET_SAME_FAMILY.MACADDR8_SET7BIT.MASKLEN.NETMASK.NETWORK.SET_MASKLEN.TRUNC.ARRAY_TO_TSVECTOR.GET_CURRENT_TS_CONFIG.JSONB_TO_TSVECTOR.JSON_TO_TSVECTOR.LENGTH.NUMNODE.PHRASETO_TSQUERY.PLAINTO_TSQUERY.QUERYTREE.SETWEIGHT.STRIP.TO_TSQUERY.TO_TSVECTOR.TSQUERY_PHRASE.TSVECTOR_TO_ARRAY.TS_DEBUG.TS_DELETE.TS_FILTER.TS_HEADLINE.TS_LEXIZE.TS_PARSE.TS_RANK.TS_RANK_CD.TS_REWRITE.TS_STAT.TS_TOKEN_TYPE.WEBSEARCH_TO_TSQUERY.GEN_RANDOM_UUID.UUIDV4.UUIDV7.UUID_EXTRACT_TIMESTAMP.UUID_EXTRACT_VERSION.CURSOR_TO_XML.CURSOR_TO_XMLSCHEMA.DATABASE_TO_XML.DATABASE_TO_XMLSCHEMA.DATABASE_TO_XML_AND_XMLSCHEMA.NEXTVAL.QUERY_TO_XML.QUERY_TO_XMLSCHEMA.QUERY_TO_XML_AND_XMLSCHEMA.SCHEMA_TO_XML.SCHEMA_TO_XMLSCHEMA.SCHEMA_TO_XML_AND_XMLSCHEMA.STRING.TABLE_TO_XML.TABLE_TO_XMLSCHEMA.TABLE_TO_XML_AND_XMLSCHEMA.XMLAGG.XMLCOMMENT.XMLCONCAT.XMLELEMENT.XMLEXISTS.XMLFOREST.XMLPARSE.XMLPI.XMLROOT.XMLSERIALIZE.XMLTABLE.XML_IS_WELL_FORMED.XML_IS_WELL_FORMED_CONTENT.XML_IS_WELL_FORMED_DOCUMENT.XPATH.XPATH_EXISTS.ARRAY_TO_JSON.JSONB_AGG.JSONB_ARRAY_ELEMENTS.JSONB_ARRAY_ELEMENTS_TEXT.JSONB_ARRAY_LENGTH.JSONB_BUILD_ARRAY.JSONB_BUILD_OBJECT.JSONB_EACH.JSONB_EACH_TEXT.JSONB_EXTRACT_PATH.JSONB_EXTRACT_PATH_TEXT.JSONB_INSERT.JSONB_OBJECT.JSONB_OBJECT_AGG.JSONB_OBJECT_KEYS.JSONB_PATH_EXISTS.JSONB_PATH_EXISTS_TZ.JSONB_PATH_MATCH.JSONB_PATH_MATCH_TZ.JSONB_PATH_QUERY.JSONB_PATH_QUERY_ARRAY.JSONB_PATH_QUERY_ARRAY_TZ.JSONB_PATH_QUERY_FIRST.JSONB_PATH_QUERY_FIRST_TZ.JSONB_PATH_QUERY_TZ.JSONB_POPULATE_RECORD.JSONB_POPULATE_RECORDSET.JSONB_PRETTY.JSONB_SET.JSONB_SET_LAX.JSONB_STRIP_NULLS.JSONB_TO_RECORD.JSONB_TO_RECORDSET.JSONB_TYPEOF.JSON_AGG.JSON_ARRAY_ELEMENTS.JSON_ARRAY_ELEMENTS_TEXT.JSON_ARRAY_LENGTH.JSON_BUILD_ARRAY.JSON_BUILD_OBJECT.JSON_EACH.JSON_EACH_TEXT.JSON_EXTRACT_PATH.JSON_EXTRACT_PATH_TEXT.JSON_OBJECT.JSON_OBJECT_AGG.JSON_OBJECT_KEYS.JSON_POPULATE_RECORD.JSON_POPULATE_RECORDSET.JSON_STRIP_NULLS.JSON_TO_RECORD.JSON_TO_RECORDSET.JSON_TYPEOF.ROW_TO_JSON.TO_JSON.TO_JSONB.TO_TIMESTAMP.CURRVAL.LASTVAL.NEXTVAL.SETVAL.COALESCE.GREATEST.LEAST.NULLIF.ARRAY_AGG.ARRAY_APPEND.ARRAY_CAT.ARRAY_DIMS.ARRAY_FILL.ARRAY_LENGTH.ARRAY_LOWER.ARRAY_NDIMS.ARRAY_POSITION.ARRAY_POSITIONS.ARRAY_PREPEND.ARRAY_REMOVE.ARRAY_REPLACE.ARRAY_TO_STRING.ARRAY_UPPER.CARDINALITY.STRING_TO_ARRAY.TRIM_ARRAY.UNNEST.ISEMPTY.LOWER.LOWER_INC.LOWER_INF.MULTIRANGE.RANGE_MERGE.UPPER.UPPER_INC.UPPER_INF.ARRAY_AGG.AVG.BIT_AND.BIT_OR.BIT_XOR.BOOL_AND.BOOL_OR.COALESCE.CORR.COUNT.COVAR_POP.COVAR_SAMP.CUME_DIST.DENSE_RANK.EVERY.GROUPING.JSONB_AGG.JSONB_OBJECT_AGG.JSON_AGG.JSON_OBJECT_AGG.MAX.MIN.MODE.PERCENTILE_CONT.PERCENTILE_DISC.PERCENT_RANK.RANGE_AGG.RANGE_INTERSECT_AGG.RANK.REGR_AVGX.REGR_AVGY.REGR_COUNT.REGR_INTERCEPT.REGR_R2.REGR_SLOPE.REGR_SXX.REGR_SXY.REGR_SYY.STDDEV.STDDEV_POP.STDDEV_SAMP.STRING_AGG.SUM.TO_JSON.TO_JSONB.VARIANCE.VAR_POP.VAR_SAMP.XMLAGG.CUME_DIST.DENSE_RANK.FIRST_VALUE.LAG.LAST_VALUE.LEAD.NTH_VALUE.NTILE.PERCENT_RANK.RANK.ROW_NUMBER.GENERATE_SERIES.GENERATE_SUBSCRIPTS.ACLDEFAULT.ACLEXPLODE.COL_DESCRIPTION.CURRENT_CATALOG.CURRENT_DATABASE.CURRENT_QUERY.CURRENT_ROLE.CURRENT_SCHEMA.CURRENT_SCHEMAS.CURRENT_USER.FORMAT_TYPE.HAS_ANY_COLUMN_PRIVILEGE.HAS_COLUMN_PRIVILEGE.HAS_DATABASE_PRIVILEGE.HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE.HAS_FUNCTION_PRIVILEGE.HAS_LANGUAGE_PRIVILEGE.HAS_SCHEMA_PRIVILEGE.HAS_SEQUENCE_PRIVILEGE.HAS_SERVER_PRIVILEGE.HAS_TABLESPACE_PRIVILEGE.HAS_TABLE_PRIVILEGE.HAS_TYPE_PRIVILEGE.INET_CLIENT_ADDR.INET_CLIENT_PORT.INET_SERVER_ADDR.INET_SERVER_PORT.MAKEACLITEM.OBJ_DESCRIPTION.PG_BACKEND_PID.PG_BLOCKING_PIDS.PG_COLLATION_IS_VISIBLE.PG_CONF_LOAD_TIME.PG_CONTROL_CHECKPOINT.PG_CONTROL_INIT.PG_CONTROL_SYSTEM.PG_CONVERSION_IS_VISIBLE.PG_CURRENT_LOGFILE.PG_CURRENT_SNAPSHOT.PG_CURRENT_XACT_ID.PG_CURRENT_XACT_ID_IF_ASSIGNED.PG_DESCRIBE_OBJECT.PG_FUNCTION_IS_VISIBLE.PG_GET_CATALOG_FOREIGN_KEYS.PG_GET_CONSTRAINTDEF.PG_GET_EXPR.PG_GET_FUNCTIONDEF.PG_GET_FUNCTION_ARGUMENTS.PG_GET_FUNCTION_IDENTITY_ARGUMENTS.PG_GET_FUNCTION_RESULT.PG_GET_INDEXDEF.PG_GET_KEYWORDS.PG_GET_OBJECT_ADDRESS.PG_GET_OWNED_SEQUENCE.PG_GET_RULEDEF.PG_GET_SERIAL_SEQUENCE.PG_GET_STATISTICSOBJDEF.PG_GET_TRIGGERDEF.PG_GET_USERBYID.PG_GET_VIEWDEF.PG_HAS_ROLE.PG_IDENTIFY_OBJECT.PG_IDENTIFY_OBJECT_AS_ADDRESS.PG_INDEXAM_HAS_PROPERTY.PG_INDEX_COLUMN_HAS_PROPERTY.PG_INDEX_HAS_PROPERTY.PG_IS_OTHER_TEMP_SCHEMA.PG_JIT_AVAILABLE.PG_LAST_COMMITTED_XACT.PG_LISTENING_CHANNELS.PG_MY_TEMP_SCHEMA.PG_NOTIFICATION_QUEUE_USAGE.PG_OPCLASS_IS_VISIBLE.PG_OPERATOR_IS_VISIBLE.PG_OPFAMILY_IS_VISIBLE.PG_OPTIONS_TO_TABLE.PG_POSTMASTER_START_TIME.PG_SAFE_SNAPSHOT_BLOCKING_PIDS.PG_SNAPSHOT_XIP.PG_SNAPSHOT_XMAX.PG_SNAPSHOT_XMIN.PG_STATISTICS_OBJ_IS_VISIBLE.PG_TABLESPACE_DATABASES.PG_TABLESPACE_LOCATION.PG_TABLE_IS_VISIBLE.PG_TRIGGER_DEPTH.PG_TS_CONFIG_IS_VISIBLE.PG_TS_DICT_IS_VISIBLE.PG_TS_PARSER_IS_VISIBLE.PG_TS_TEMPLATE_IS_VISIBLE.PG_TYPEOF.PG_TYPE_IS_VISIBLE.PG_VISIBLE_IN_SNAPSHOT.PG_XACT_COMMIT_TIMESTAMP.PG_XACT_COMMIT_TIMESTAMP_ORIGIN.PG_XACT_STATUS.PQSERVERVERSION.ROW_SECURITY_ACTIVE.SESSION_USER.SHOBJ_DESCRIPTION.TO_REGCLASS.TO_REGCOLLATION.TO_REGNAMESPACE.TO_REGOPER.TO_REGOPERATOR.TO_REGPROC.TO_REGPROCEDURE.TO_REGROLE.TO_REGTYPE.TXID_CURRENT.TXID_CURRENT_IF_ASSIGNED.TXID_CURRENT_SNAPSHOT.TXID_SNAPSHOT_XIP.TXID_SNAPSHOT_XMAX.TXID_SNAPSHOT_XMIN.TXID_STATUS.TXID_VISIBLE_IN_SNAPSHOT.USER.VERSION.BRIN_DESUMMARIZE_RANGE.BRIN_SUMMARIZE_NEW_VALUES.BRIN_SUMMARIZE_RANGE.CONVERT_FROM.CURRENT_SETTING.GIN_CLEAN_PENDING_LIST.PG_ADVISORY_LOCK.PG_ADVISORY_LOCK_SHARED.PG_ADVISORY_UNLOCK.PG_ADVISORY_UNLOCK_ALL.PG_ADVISORY_UNLOCK_SHARED.PG_ADVISORY_XACT_LOCK.PG_ADVISORY_XACT_LOCK_SHARED.PG_BACKUP_START_TIME.PG_CANCEL_BACKEND.PG_COLLATION_ACTUAL_VERSION.PG_COLUMN_COMPRESSION.PG_COLUMN_SIZE.PG_COPY_LOGICAL_REPLICATION_SLOT.PG_COPY_PHYSICAL_REPLICATION_SLOT.PG_CREATE_LOGICAL_REPLICATION_SLOT.PG_CREATE_PHYSICAL_REPLICATION_SLOT.PG_CREATE_RESTORE_POINT.PG_CURRENT_WAL_FLUSH_LSN.PG_CURRENT_WAL_INSERT_LSN.PG_CURRENT_WAL_LSN.PG_DATABASE_SIZE.PG_DROP_REPLICATION_SLOT.PG_EXPORT_SNAPSHOT.PG_FILENODE_RELATION.PG_GET_WAL_REPLAY_PAUSE_STATE.PG_IMPORT_SYSTEM_COLLATIONS.PG_INDEXES_SIZE.PG_IS_IN_BACKUP.PG_IS_IN_RECOVERY.PG_IS_WAL_REPLAY_PAUSED.PG_LAST_WAL_RECEIVE_LSN.PG_LAST_WAL_REPLAY_LSN.PG_LAST_XACT_REPLAY_TIMESTAMP.PG_LOGICAL_EMIT_MESSAGE.PG_LOGICAL_SLOT_GET_BINARY_CHANGES.PG_LOGICAL_SLOT_GET_CHANGES.PG_LOGICAL_SLOT_PEEK_BINARY_CHANGES.PG_LOGICAL_SLOT_PEEK_CHANGES.PG_LOG_BACKEND_MEMORY_CONTEXTS.PG_LS_ARCHIVE_STATUSDIR.PG_LS_DIR.PG_LS_LOGDIR.PG_LS_TMPDIR.PG_LS_WALDIR.PG_PARTITION_ANCESTORS.PG_PARTITION_ROOT.PG_PARTITION_TREE.PG_PROMOTE.PG_READ_BINARY_FILE.PG_READ_FILE.PG_RELATION_FILENODE.PG_RELATION_FILEPATH.PG_RELATION_SIZE.PG_RELOAD_CONF.PG_REPLICATION_ORIGIN_ADVANCE.PG_REPLICATION_ORIGIN_CREATE.PG_REPLICATION_ORIGIN_DROP.PG_REPLICATION_ORIGIN_OID.PG_REPLICATION_ORIGIN_PROGRESS.PG_REPLICATION_ORIGIN_SESSION_IS_SETUP.PG_REPLICATION_ORIGIN_SESSION_PROGRESS.PG_REPLICATION_ORIGIN_SESSION_RESET.PG_REPLICATION_ORIGIN_SESSION_SETUP.PG_REPLICATION_ORIGIN_XACT_RESET.PG_REPLICATION_ORIGIN_XACT_SETUP.PG_REPLICATION_SLOT_ADVANCE.PG_ROTATE_LOGFILE.PG_SIZE_BYTES.PG_SIZE_PRETTY.PG_START_BACKUP.PG_STAT_FILE.PG_STOP_BACKUP.PG_SWITCH_WAL.PG_TABLESPACE_SIZE.PG_TABLE_SIZE.PG_TERMINATE_BACKEND.PG_TOTAL_RELATION_SIZE.PG_TRY_ADVISORY_LOCK.PG_TRY_ADVISORY_LOCK_SHARED.PG_TRY_ADVISORY_XACT_LOCK.PG_TRY_ADVISORY_XACT_LOCK_SHARED.PG_WALFILE_NAME.PG_WALFILE_NAME_OFFSET.PG_WAL_LSN_DIFF.PG_WAL_REPLAY_PAUSE.PG_WAL_REPLAY_RESUME.SET_CONFIG.SUPPRESS_REDUNDANT_UPDATES_TRIGGER.TSVECTOR_UPDATE_TRIGGER.TSVECTOR_UPDATE_TRIGGER_COLUMN.PG_EVENT_TRIGGER_DDL_COMMANDS.PG_EVENT_TRIGGER_DROPPED_OBJECTS.PG_EVENT_TRIGGER_TABLE_REWRITE_OID.PG_EVENT_TRIGGER_TABLE_REWRITE_REASON.PG_GET_OBJECT_ADDRESS.PG_MCV_LIST_ITEMS.CAST`.split(`.`),Qn=`ALL.ANALYSE.ANALYZE.AND.ANY.AS.ASC.ASYMMETRIC.AUTHORIZATION.BETWEEN.BINARY.BOTH.CASE.CAST.CHECK.COLLATE.COLLATION.COLUMN.CONCURRENTLY.CONSTRAINT.CREATE.CROSS.CURRENT_CATALOG.CURRENT_DATE.CURRENT_ROLE.CURRENT_SCHEMA.CURRENT_TIME.CURRENT_TIMESTAMP.CURRENT_USER.DAY.DEFAULT.DEFERRABLE.DESC.DISTINCT.DO.ELSE.END.EXCEPT.EXISTS.FALSE.FETCH.FILTER.FOR.FOREIGN.FREEZE.FROM.FULL.GRANT.GROUP.HAVING.HOUR.ILIKE.IN.INITIALLY.INNER.INOUT.INTERSECT.INTO.IS.ISNULL.JOIN.LATERAL.LEADING.LEFT.LIKE.LIMIT.LOCALTIME.LOCALTIMESTAMP.MINUTE.MONTH.NATURAL.NOT.NOTNULL.NULL.NULLIF.OFFSET.ON.ONLY.OR.ORDER.OUT.OUTER.OVER.OVERLAPS.PLACING.PRIMARY.REFERENCES.RETURNING.RIGHT.ROW.SECOND.SELECT.SESSION_USER.SIMILAR.SOME.SYMMETRIC.TABLE.TABLESAMPLE.THEN.TO.TRAILING.TRUE.UNION.UNIQUE.USER.USING.VALUES.VARIADIC.VERBOSE.WHEN.WHERE.WINDOW.WITH.WITHIN.WITHOUT.YEAR`.split(`.`),$n=`ARRAY.BIGINT.BIT.BIT VARYING.BOOL.BOOLEAN.CHAR.CHARACTER.CHARACTER VARYING.DECIMAL.DEC.DOUBLE.ENUM.FLOAT.INT.INTEGER.INTERVAL.NCHAR.NUMERIC.JSON.JSONB.PRECISION.REAL.SMALLINT.TEXT.TIME.TIMESTAMP.TIMESTAMPTZ.UUID.VARCHAR.XML.ZONE`.split(`.`),er=L([`SELECT [ALL | DISTINCT]`]),tr=L([`WITH [RECURSIVE]`,`FROM`,`WHERE`,`GROUP BY [ALL | DISTINCT]`,`HAVING`,`WINDOW`,`PARTITION BY`,`ORDER BY`,`LIMIT`,`OFFSET`,`FETCH {FIRST | NEXT}`,`FOR {UPDATE | NO KEY UPDATE | SHARE | KEY SHARE} [OF]`,`INSERT INTO`,`VALUES`,`DEFAULT VALUES`,`SET`,`RETURNING`]),nr=L([`CREATE [GLOBAL | LOCAL] [TEMPORARY | TEMP | UNLOGGED] TABLE [IF NOT EXISTS]`]),rr=L(`CREATE [OR REPLACE] [TEMP | TEMPORARY] [RECURSIVE] VIEW.CREATE [MATERIALIZED] VIEW [IF NOT EXISTS].UPDATE [ONLY].WHERE CURRENT OF.ON CONFLICT.DELETE FROM [ONLY].DROP TABLE [IF EXISTS].ALTER TABLE [IF EXISTS] [ONLY].ALTER TABLE ALL IN TABLESPACE.RENAME [COLUMN].RENAME TO.ADD [COLUMN] [IF NOT EXISTS].DROP [COLUMN] [IF EXISTS].ALTER [COLUMN].SET DATA TYPE.{SET | DROP} DEFAULT.{SET | DROP} NOT NULL.TRUNCATE [TABLE] [ONLY].SET SCHEMA.{BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE [OF] | DELETE | TRUNCATE}.[NOT] DEFERRABLE.INITIALLY {DEFERRED | IMMEDIATE}.[NOT] DEFERRABLE INITIALLY {DEFERRED | IMMEDIATE}.ABORT.ALTER AGGREGATE.ALTER COLLATION.ALTER CONVERSION.ALTER DATABASE.ALTER DEFAULT PRIVILEGES.ALTER DOMAIN.ALTER EVENT TRIGGER.ALTER EXTENSION.ALTER FOREIGN DATA WRAPPER.ALTER FOREIGN TABLE.ALTER FUNCTION.ALTER GROUP.ALTER INDEX.ALTER LANGUAGE.ALTER LARGE OBJECT.ALTER MATERIALIZED VIEW.ALTER OPERATOR.ALTER OPERATOR CLASS.ALTER OPERATOR FAMILY.ALTER POLICY.ALTER PROCEDURE.ALTER PUBLICATION.ALTER ROLE.ALTER ROUTINE.ALTER RULE.ALTER SCHEMA.ALTER SEQUENCE.ALTER SERVER.ALTER STATISTICS.ALTER SUBSCRIPTION.ALTER SYSTEM.ALTER TABLESPACE.ALTER TEXT SEARCH CONFIGURATION.ALTER TEXT SEARCH DICTIONARY.ALTER TEXT SEARCH PARSER.ALTER TEXT SEARCH TEMPLATE.ALTER TRIGGER.ALTER TYPE.ALTER USER.ALTER USER MAPPING.ALTER VIEW.ANALYZE.BEGIN.CALL.CHECKPOINT.CLOSE.CLUSTER.COMMENT ON.COMMIT.COMMIT PREPARED.COPY.CREATE ACCESS METHOD.CREATE [OR REPLACE] AGGREGATE.CREATE CAST.CREATE COLLATION.CREATE [DEFAULT] CONVERSION.CREATE DATABASE.CREATE DOMAIN.CREATE EVENT TRIGGER.CREATE EXTENSION.CREATE FOREIGN DATA WRAPPER.CREATE FOREIGN TABLE.CREATE [OR REPLACE] FUNCTION.CREATE GROUP.CREATE [UNIQUE] INDEX.CREATE [OR REPLACE] [TRUSTED] [PROCEDURAL] LANGUAGE.CREATE OPERATOR.CREATE OPERATOR CLASS.CREATE OPERATOR FAMILY.CREATE POLICY.CREATE [OR REPLACE] PROCEDURE.CREATE PUBLICATION.CREATE ROLE.CREATE [OR REPLACE] RULE.CREATE SCHEMA [AUTHORIZATION].CREATE [TEMPORARY | TEMP | UNLOGGED] SEQUENCE.CREATE SERVER.CREATE STATISTICS.CREATE SUBSCRIPTION.CREATE TABLESPACE.CREATE TEXT SEARCH CONFIGURATION.CREATE TEXT SEARCH DICTIONARY.CREATE TEXT SEARCH PARSER.CREATE TEXT SEARCH TEMPLATE.CREATE [OR REPLACE] TRANSFORM.CREATE [OR REPLACE] [CONSTRAINT] TRIGGER.CREATE TYPE.CREATE USER.CREATE USER MAPPING.DEALLOCATE.DECLARE.DISCARD.DROP ACCESS METHOD.DROP AGGREGATE.DROP CAST.DROP COLLATION.DROP CONVERSION.DROP DATABASE.DROP DOMAIN.DROP EVENT TRIGGER.DROP EXTENSION.DROP FOREIGN DATA WRAPPER.DROP FOREIGN TABLE.DROP FUNCTION.DROP GROUP.DROP IDENTITY.DROP INDEX.DROP LANGUAGE.DROP MATERIALIZED VIEW [IF EXISTS].DROP OPERATOR.DROP OPERATOR CLASS.DROP OPERATOR FAMILY.DROP OWNED.DROP POLICY.DROP PROCEDURE.DROP PUBLICATION.DROP ROLE.DROP ROUTINE.DROP RULE.DROP SCHEMA.DROP SEQUENCE.DROP SERVER.DROP STATISTICS.DROP SUBSCRIPTION.DROP TABLESPACE.DROP TEXT SEARCH CONFIGURATION.DROP TEXT SEARCH DICTIONARY.DROP TEXT SEARCH PARSER.DROP TEXT SEARCH TEMPLATE.DROP TRANSFORM.DROP TRIGGER.DROP TYPE.DROP USER.DROP USER MAPPING.DROP VIEW.EXECUTE [FUNCTION | PROCEDURE].EXPLAIN.FETCH.GRANT.IMPORT FOREIGN SCHEMA.LISTEN.LOAD.LOCK.MOVE.NOTIFY.OVERRIDING SYSTEM VALUE.PREPARE.PREPARE TRANSACTION.REASSIGN OWNED.REFRESH MATERIALIZED VIEW.REINDEX.RELEASE SAVEPOINT.RESET [ALL|ROLE|SESSION AUTHORIZATION].REVOKE.ROLLBACK.ROLLBACK PREPARED.ROLLBACK TO SAVEPOINT.SAVEPOINT.SECURITY LABEL.SELECT INTO.SET CONSTRAINTS.SET ROLE.SET SESSION AUTHORIZATION.SET TRANSACTION.SHOW.START TRANSACTION.UNLISTEN.VACUUM`.split(`.`)),ir=L([`UNION [ALL | DISTINCT]`,`EXCEPT [ALL | DISTINCT]`,`INTERSECT [ALL | DISTINCT]`]),ar=L([`JOIN`,`{LEFT | RIGHT | FULL} [OUTER] JOIN`,`{INNER | CROSS} JOIN`,`NATURAL [INNER] JOIN`,`NATURAL {LEFT | RIGHT | FULL} [OUTER] JOIN`]),or=L([`PRIMARY KEY`,`GENERATED {ALWAYS | BY DEFAULT} AS IDENTITY`,`ON {UPDATE | DELETE} [NO ACTION | RESTRICT | CASCADE | SET NULL | SET DEFAULT]`,`DO {NOTHING | UPDATE}`,`AS MATERIALIZED`,`FOR EACH ROW`,`OR {INSERT | UPDATE [OF] | DELETE | TRUNCATE}`,`{ROWS | RANGE | GROUPS} BETWEEN`,`IS [NOT] DISTINCT FROM`,`NULLS {FIRST | LAST}`,`WITH ORDINALITY`]),sr=L([`[TIMESTAMP | TIME] {WITH | WITHOUT} TIME ZONE`]),cr={name:`postgresql`,tokenizerOptions:{reservedSelect:er,reservedClauses:[...tr,...nr,...rr],reservedSetOperations:ir,reservedJoins:ar,reservedKeywordPhrases:or,reservedDataTypePhrases:sr,reservedKeywords:Qn,reservedDataTypes:$n,reservedFunctionNames:Zn,nestedBlockComments:!0,lineCommentTypes:[`--`,`\\restrict `,`\\unrestrict `],extraParens:[`[]`],underscoresInNumbers:!0,stringTypes:[`$$`,{quote:`''-qq`,prefixes:[`U&`]},{quote:`''-qq-bs`,prefixes:[`E`],requirePrefix:!0},{quote:`''-raw`,prefixes:[`B`,`X`],requirePrefix:!0}],identTypes:[{quote:`""-qq`,prefixes:[`U&`]}],identChars:{rest:`$`},paramTypes:{numbered:[`$`]},operators:`%.^.|/.||/.@.:=.&.|.#.~.<<.>>.~>~.~<~.~>=~.~<=~.@-@.@@.##.<->.&&.&<.&>.<<|.&<|.|>>.|&>.<^.>^.?#.?-.?|.?-|.?||.@>.<@.<@>.~=.?.@?.?&.->.->>.#>.#>>.#-.=>.>>=.<<=.~~.~~*.!~~.!~~*.~.~*.!~.!~*.-|-.||.@@@.!!.^@.<%.%>.<<%.%>>.<<->.<->>.<<<->.<->>>.~>.#=.::.:.<#>.<=>.<+>.<~>.<%>.&&&.|=|`.split(`.`),operatorKeyword:!0},formatOptions:{alwaysDenseOperators:[`::`,`:`],onelineClauses:[...nr,...rr],tabularOnelineClauses:rr}},lr=`ABS.CHANGES.CHAR.COALESCE.FORMAT.GLOB.HEX.IFNULL.IIF.INSTR.LAST_INSERT_ROWID.LENGTH.LIKE.LIKELIHOOD.LIKELY.LOAD_EXTENSION.LOWER.LTRIM.NULLIF.PRINTF.QUOTE.RANDOM.RANDOMBLOB.REPLACE.ROUND.RTRIM.SIGN.SOUNDEX.SQLITE_COMPILEOPTION_GET.SQLITE_COMPILEOPTION_USED.SQLITE_OFFSET.SQLITE_SOURCE_ID.SQLITE_VERSION.SUBSTR.SUBSTRING.TOTAL_CHANGES.TRIM.TYPEOF.UNICODE.UNLIKELY.UPPER.ZEROBLOB.AVG.COUNT.GROUP_CONCAT.MAX.MIN.SUM.TOTAL.DATE.TIME.DATETIME.JULIANDAY.UNIXEPOCH.STRFTIME.row_number.rank.dense_rank.percent_rank.cume_dist.ntile.lag.lead.first_value.last_value.nth_value.ACOS.ACOSH.ASIN.ASINH.ATAN.ATAN2.ATANH.CEIL.CEILING.COS.COSH.DEGREES.EXP.FLOOR.LN.LOG.LOG.LOG10.LOG2.MOD.PI.POW.POWER.RADIANS.SIN.SINH.SQRT.TAN.TANH.TRUNC.JSON.JSON_ARRAY.JSON_ARRAY_LENGTH.JSON_ARRAY_LENGTH.JSON_EXTRACT.JSON_INSERT.JSON_OBJECT.JSON_PATCH.JSON_REMOVE.JSON_REPLACE.JSON_SET.JSON_TYPE.JSON_TYPE.JSON_VALID.JSON_QUOTE.JSON_GROUP_ARRAY.JSON_GROUP_OBJECT.JSON_EACH.JSON_TREE.CAST`.split(`.`),ur=`ABORT.ACTION.ADD.AFTER.ALL.ALTER.AND.ARE.ALWAYS.ANALYZE.AS.ASC.ATTACH.AUTOINCREMENT.BEFORE.BEGIN.BETWEEN.BY.CASCADE.CASE.CAST.CHECK.COLLATE.COLUMN.COMMIT.CONFLICT.CONSTRAINT.CREATE.CROSS.CURRENT.CURRENT_DATE.CURRENT_TIME.CURRENT_TIMESTAMP.DATABASE.DEFAULT.DEFERRABLE.DEFERRED.DELETE.DESC.DETACH.DISTINCT.DO.DROP.EACH.ELSE.END.ESCAPE.EXCEPT.EXCLUDE.EXCLUSIVE.EXISTS.EXPLAIN.FAIL.FILTER.FIRST.FOLLOWING.FOR.FOREIGN.FROM.FULL.GENERATED.GLOB.GROUP.HAVING.IF.IGNORE.IMMEDIATE.IN.INDEX.INDEXED.INITIALLY.INNER.INSERT.INSTEAD.INTERSECT.INTO.IS.ISNULL.JOIN.KEY.LAST.LEFT.LIKE.LIMIT.MATCH.MATERIALIZED.NATURAL.NO.NOT.NOTHING.NOTNULL.NULL.NULLS.OF.OFFSET.ON.ONLY.OPEN.OR.ORDER.OTHERS.OUTER.OVER.PARTITION.PLAN.PRAGMA.PRECEDING.PRIMARY.QUERY.RAISE.RANGE.RECURSIVE.REFERENCES.REGEXP.REINDEX.RELEASE.RENAME.REPLACE.RESTRICT.RETURNING.RIGHT.ROLLBACK.ROW.ROWS.SAVEPOINT.SELECT.SET.TABLE.TEMP.TEMPORARY.THEN.TIES.TO.TRANSACTION.TRIGGER.UNBOUNDED.UNION.UNIQUE.UPDATE.USING.VACUUM.VALUES.VIEW.VIRTUAL.WHEN.WHERE.WINDOW.WITH.WITHOUT`.split(`.`),dr=[`ANY`,`ARRAY`,`BLOB`,`CHARACTER`,`DECIMAL`,`INT`,`INTEGER`,`NATIVE CHARACTER`,`NCHAR`,`NUMERIC`,`NVARCHAR`,`REAL`,`TEXT`,`VARCHAR`,`VARYING CHARACTER`],fr=L([`SELECT [ALL | DISTINCT]`]),pr=L([`WITH [RECURSIVE]`,`FROM`,`WHERE`,`GROUP BY`,`HAVING`,`WINDOW`,`PARTITION BY`,`ORDER BY`,`LIMIT`,`OFFSET`,`INSERT [OR ABORT | OR FAIL | OR IGNORE | OR REPLACE | OR ROLLBACK] INTO`,`REPLACE INTO`,`VALUES`,`SET`,`RETURNING`]),mr=L([`CREATE [TEMPORARY | TEMP] TABLE [IF NOT EXISTS]`]),hr=L([`CREATE [TEMPORARY | TEMP] VIEW [IF NOT EXISTS]`,`UPDATE [OR ABORT | OR FAIL | OR IGNORE | OR REPLACE | OR ROLLBACK]`,`ON CONFLICT`,`DELETE FROM`,`DROP TABLE [IF EXISTS]`,`ALTER TABLE`,`ADD [COLUMN]`,`DROP [COLUMN]`,`RENAME [COLUMN]`,`RENAME TO`,`SET SCHEMA`]),gr=L([`UNION [ALL]`,`EXCEPT`,`INTERSECT`]),_r=L([`JOIN`,`{LEFT | RIGHT | FULL} [OUTER] JOIN`,`{INNER | CROSS} JOIN`,`NATURAL [INNER] JOIN`,`NATURAL {LEFT | RIGHT | FULL} [OUTER] JOIN`]),vr=L([`ON {UPDATE | DELETE} [SET NULL | SET DEFAULT]`,`{ROWS | RANGE | GROUPS} BETWEEN`,`DO UPDATE`]),yr=L([]),br={name:`sqlite`,tokenizerOptions:{reservedSelect:fr,reservedClauses:[...pr,...mr,...hr],reservedSetOperations:gr,reservedJoins:_r,reservedKeywordPhrases:vr,reservedDataTypePhrases:yr,reservedKeywords:ur,reservedDataTypes:dr,reservedFunctionNames:lr,stringTypes:[`''-qq`,{quote:`''-raw`,prefixes:[`X`],requirePrefix:!0}],identTypes:[`""-qq`,"``",`[]`],paramTypes:{positional:!0,numbered:[`?`],named:[`:`,`@`],custom:[{regex:String.raw`\$[a-zA-Z_][a-zA-Z0-9_]*(?:::[a-zA-Z_][a-zA-Z0-9_]*)*(?:\([^)]*\))?`,key:e=>e.slice(1)}]},operators:[`%`,`~`,`&`,`|`,`<<`,`>>`,`==`,`->`,`->>`,`||`]},formatOptions:{onelineClauses:[...mr,...hr],tabularOnelineClauses:hr}},B=e=>e[e.length-1],xr=e=>e.sort((e,t)=>t.length-e.length||e.localeCompare(t)),Sr=e=>e.replace(/\s+/gu,` `),Cr=e=>/\n/.test(e),V=e=>e.replace(/[.*+?^${}()|[\]\\]/gu,`\\$&`),wr=/\s+/uy,H=e=>RegExp(`(?:${e})`,`uy`),Tr=e=>e.split(``).map(e=>/ /gu.test(e)?`\\s+`:`[${e.toUpperCase()}${e.toLowerCase()}]`).join(``),Er=e=>e+`(?:-`+e+`)*`,Dr=({prefixes:e,requirePrefix:t})=>`(?:${e.map(Tr).join(`|`)}${t?``:`|`})`,Or=e=>RegExp(`(?:${e.map(V).join(`|`)}).*?(?=\r\n|\r|\n|$)`,`uy`),kr=(e,t=[])=>{let n=e===`open`?0:1;return H([`()`,...t].map(e=>e[n]).map(V).join(`|`))},Ar=e=>H(`${xr(e).map(V).join(`|`)}`),jr=({rest:e,dashes:t})=>e||t?`(?![${e||``}${t?`-`:``}])`:``,U=(e,t={})=>{if(e.length===0)return/^\b$/u;let n=jr(t),r=xr(e).map(V).join(`|`).replace(/ /gu,`\\s+`);return RegExp(`(?:${r})${n}\\b`,`iuy`)},Mr=(e,t)=>{if(e.length)return H(`(?:${e.map(V).join(`|`)})(?:${t})`)},Nr=()=>{let e={"<":`>`,"[":`]`,"(":`)`,"{":`}`},t=Object.entries(e).map(([e,t])=>`{left}(?:(?!{right}').)*?{right}`.replace(/{left}/g,V(e)).replace(/{right}/g,V(t))),n=V(Object.keys(e).join(``));return`[Qq]'(?:${String.raw`(?<tag>[^\s${n}])(?:(?!\k<tag>').)*?\k<tag>`}|${t.join(`|`)})'`},Pr={"``":"(?:`[^`]*`)+","[]":String.raw`(?:\[[^\]]*\])(?:\][^\]]*\])*`,'""-qq':String.raw`(?:"[^"]*")+`,'""-bs':String.raw`(?:"[^"\\]*(?:\\.[^"\\]*)*")`,'""-qq-bs':String.raw`(?:"[^"\\]*(?:\\.[^"\\]*)*")+`,'""-raw':String.raw`(?:"[^"]*")`,"''-qq":String.raw`(?:'[^']*')+`,"''-bs":String.raw`(?:'[^'\\]*(?:\\.[^'\\]*)*')`,"''-qq-bs":String.raw`(?:'[^'\\]*(?:\\.[^'\\]*)*')+`,"''-raw":String.raw`(?:'[^']*')`,$$:String.raw`(?<tag>\$\w*\$)[\s\S]*?\k<tag>`,"'''..'''":String.raw`'''[^\\]*?(?:\\.[^\\]*?)*?'''`,'""".."""':String.raw`"""[^\\]*?(?:\\.[^\\]*?)*?"""`,"{}":String.raw`(?:\{[^\}]*\})`,"q''":Nr()},Fr=e=>typeof e==`string`?Pr[e]:`regex`in e?e.regex:Dr(e)+Pr[e.quote],Ir=e=>H(e.map(e=>`regex`in e?e.regex:Fr(e)).join(`|`)),Lr=e=>e.map(Fr).join(`|`),Rr=e=>H(Lr(e)),zr=(e={})=>H(Br(e)),Br=({first:e,rest:t,dashes:n,allowFirstCharNumber:r}={})=>{let i=`\\p{Alphabetic}\\p{Mark}_`,a=`\\p{Decimal_Number}`,o=V(e??``),s=V(t??``),c=r?`[${i}${a}${o}][${i}${a}${s}]*`:`[${i}${o}][${i}${a}${s}]*`;return n?Er(c):c};function Vr(e,t){let n=e.slice(0,t).split(/\n/);return{line:n.length,col:n[n.length-1].length+1}}var Hr=class{constructor(e,t){this.rules=e,this.dialectName=t,this.input=``,this.index=0}tokenize(e){this.input=e,this.index=0;let t=[],n;for(;this.index<this.input.length;){let e=this.getWhitespace();if(this.index<this.input.length){if(n=this.getNextToken(),!n)throw this.createParseError();t.push(Object.assign(Object.assign({},n),{precedingWhitespace:e}))}}return t}createParseError(){let e=this.input.slice(this.index,this.index+10),{line:t,col:n}=Vr(this.input,this.index);return Error(`Parse error: Unexpected "${e}" at line ${t} column ${n}.\n${this.dialectInfo()}`)}dialectInfo(){return this.dialectName===`sql`?`This likely happens because you're using the default "sql" dialect.
|
|
4
4
|
If possible, please select a more specific dialect (like sqlite, postgresql, etc).`:`SQL dialect used: "${this.dialectName}".`}getWhitespace(){wr.lastIndex=this.index;let e=wr.exec(this.input);if(e)return this.index+=e[0].length,e[0]}getNextToken(){for(let e of this.rules){let t=this.match(e);if(t)return t}}match(e){e.regex.lastIndex=this.index;let t=e.regex.exec(this.input);if(t){let n=t[0],r={type:e.type,raw:n,text:e.text?e.text(n):n,start:this.index};return e.key&&(r.key=e.key(n)),this.index+=n.length,r}}},Ur=/\/\*/uy,Wr=/[\s\S]/uy,Gr=/\*\//uy,Kr=class{constructor(){this.lastIndex=0}exec(e){let t=``,n,r=0;if(n=this.matchSection(Ur,e))t+=n,r++;else return null;for(;r>0;)if(n=this.matchSection(Ur,e))t+=n,r++;else if(n=this.matchSection(Gr,e))t+=n,r--;else if(n=this.matchSection(Wr,e))t+=n;else return null;return[t]}matchSection(e,t){e.lastIndex=this.lastIndex;let n=e.exec(t);return n&&(this.lastIndex+=n[0].length),n?n[0]:null}},qr=class{constructor(e,t){this.cfg=e,this.dialectName=t,this.rulesBeforeParams=this.buildRulesBeforeParams(e),this.rulesAfterParams=this.buildRulesAfterParams(e)}tokenize(e,t){let n=new Hr([...this.rulesBeforeParams,...this.buildParamRules(this.cfg,t),...this.rulesAfterParams],this.dialectName).tokenize(e);return this.cfg.postProcess?this.cfg.postProcess(n):n}buildRulesBeforeParams(e){return this.validRules([{type:R.DISABLE_COMMENT,regex:/(\/\* *sql-formatter-disable *\*\/[\s\S]*?(?:\/\* *sql-formatter-enable *\*\/|$))/uy},{type:R.BLOCK_COMMENT,regex:e.nestedBlockComments?new Kr:/(\/\*[^]*?\*\/)/uy},{type:R.LINE_COMMENT,regex:Or(e.lineCommentTypes??[`--`])},{type:R.QUOTED_IDENTIFIER,regex:Rr(e.identTypes)},{type:R.NUMBER,regex:e.underscoresInNumbers?/(?:0x[0-9a-fA-F_]+|0b[01_]+|(?:-\s*)?(?:[0-9_]*\.[0-9_]+|[0-9_]+(?:\.[0-9_]*)?)(?:[eE][-+]?[0-9_]+(?:\.[0-9_]+)?)?)(?![\w\p{Alphabetic}])/uy:/(?:0x[0-9a-fA-F]+|0b[01]+|(?:-\s*)?(?:[0-9]*\.[0-9]+|[0-9]+(?:\.[0-9]*)?)(?:[eE][-+]?[0-9]+(?:\.[0-9]+)?)?)(?![\w\p{Alphabetic}])/uy},{type:R.RESERVED_KEYWORD_PHRASE,regex:U(e.reservedKeywordPhrases??[],e.identChars),text:W},{type:R.RESERVED_DATA_TYPE_PHRASE,regex:U(e.reservedDataTypePhrases??[],e.identChars),text:W},{type:R.CASE,regex:/CASE\b/iuy,text:W},{type:R.END,regex:/END\b/iuy,text:W},{type:R.BETWEEN,regex:/BETWEEN\b/iuy,text:W},{type:R.LIMIT,regex:e.reservedClauses.includes(`LIMIT`)?/LIMIT\b/iuy:void 0,text:W},{type:R.RESERVED_CLAUSE,regex:U(e.reservedClauses,e.identChars),text:W},{type:R.RESERVED_SELECT,regex:U(e.reservedSelect,e.identChars),text:W},{type:R.RESERVED_SET_OPERATION,regex:U(e.reservedSetOperations,e.identChars),text:W},{type:R.WHEN,regex:/WHEN\b/iuy,text:W},{type:R.ELSE,regex:/ELSE\b/iuy,text:W},{type:R.THEN,regex:/THEN\b/iuy,text:W},{type:R.RESERVED_JOIN,regex:U(e.reservedJoins,e.identChars),text:W},{type:R.AND,regex:/AND\b/iuy,text:W},{type:R.OR,regex:/OR\b/iuy,text:W},{type:R.XOR,regex:e.supportsXor?/XOR\b/iuy:void 0,text:W},...e.operatorKeyword?[{type:R.OPERATOR,regex:/OPERATOR *\([^)]+\)/iuy}]:[],{type:R.RESERVED_FUNCTION_NAME,regex:U(e.reservedFunctionNames,e.identChars),text:W},{type:R.RESERVED_DATA_TYPE,regex:U(e.reservedDataTypes,e.identChars),text:W},{type:R.RESERVED_KEYWORD,regex:U(e.reservedKeywords,e.identChars),text:W}])}buildRulesAfterParams(e){return this.validRules([{type:R.VARIABLE,regex:e.variableTypes?Ir(e.variableTypes):void 0},{type:R.STRING,regex:Rr(e.stringTypes)},{type:R.IDENTIFIER,regex:zr(e.identChars)},{type:R.DELIMITER,regex:/[;]/uy},{type:R.COMMA,regex:/[,]/y},{type:R.OPEN_PAREN,regex:kr(`open`,e.extraParens)},{type:R.CLOSE_PAREN,regex:kr(`close`,e.extraParens)},{type:R.OPERATOR,regex:Ar([`+`,`-`,`/`,`>`,`<`,`=`,`<>`,`<=`,`>=`,`!=`,...e.operators??[]])},{type:R.ASTERISK,regex:/[*]/uy},{type:R.PROPERTY_ACCESS_OPERATOR,regex:Ar([`.`,...e.propertyAccessOperators??[]])}])}buildParamRules(e,t){let n={named:t?.named||e.paramTypes?.named||[],quoted:t?.quoted||e.paramTypes?.quoted||[],numbered:t?.numbered||e.paramTypes?.numbered||[],positional:typeof t?.positional==`boolean`?t.positional:e.paramTypes?.positional,custom:t?.custom||e.paramTypes?.custom||[]};return this.validRules([{type:R.NAMED_PARAMETER,regex:Mr(n.named,Br(e.paramChars||e.identChars)),key:e=>e.slice(1)},{type:R.QUOTED_PARAMETER,regex:Mr(n.quoted,Lr(e.identTypes)),key:e=>(({tokenKey:e,quoteChar:t})=>e.replace(new RegExp(V(`\\`+t),`gu`),t))({tokenKey:e.slice(2,-1),quoteChar:e.slice(-1)})},{type:R.NUMBERED_PARAMETER,regex:Mr(n.numbered,`[0-9]+`),key:e=>e.slice(1)},{type:R.POSITIONAL_PARAMETER,regex:n.positional?/[?]/y:void 0},...n.custom.map(e=>({type:R.CUSTOM_PARAMETER,regex:H(e.regex),key:e.key??(e=>e)}))])}validRules(e){return e.filter(e=>!!e.regex)}},W=e=>Sr(e.toUpperCase()),Jr=new Map,Yr=e=>{let t=Jr.get(e);return t||(t=Xr(e),Jr.set(e,t)),t},Xr=e=>({tokenizer:new qr(e.tokenizerOptions,e.name),formatOptions:Zr(e)}),Zr=({tokenizerOptions:e,formatOptions:t})=>({alwaysDenseOperators:t.alwaysDenseOperators||[],onelineClauses:Object.fromEntries(t.onelineClauses.map(e=>[e,!0])),tabularOnelineClauses:Object.fromEntries((t.tabularOnelineClauses??t.onelineClauses).map(e=>[e,!0])),identifierDashes:!!e.identChars?.dashes});function Qr(e){return e.indentStyle===`tabularLeft`||e.indentStyle===`tabularRight`?` `.repeat(10):e.useTabs?` `:` `.repeat(e.tabWidth)}function G(e){return e.indentStyle===`tabularLeft`||e.indentStyle===`tabularRight`}var $r=class{constructor(e){this.params=e,this.index=0}get({key:e,text:t}){return this.params?e?this.params[e]:this.params[this.index++]:t}getPositionalParameterIndex(){return this.index}setPositionalParameterIndex(e){this.index=e}},ei=t(((e,t)=>{(function(e,n){typeof t==`object`&&t.exports?t.exports=n():e.nearley=n()})(e,function(){function e(t,n,r){return this.id=++e.highestId,this.name=t,this.symbols=n,this.postprocess=r,this}e.highestId=0,e.prototype.toString=function(e){var t=e===void 0?this.symbols.map(s).join(` `):this.symbols.slice(0,e).map(s).join(` `)+` ● `+this.symbols.slice(e).map(s).join(` `);return this.name+` → `+t};function t(e,t,n,r){this.rule=e,this.dot=t,this.reference=n,this.data=[],this.wantedBy=r,this.isComplete=this.dot===e.symbols.length}t.prototype.toString=function(){return`{`+this.rule.toString(this.dot)+`}, from: `+(this.reference||0)},t.prototype.nextState=function(e){var n=new t(this.rule,this.dot+1,this.reference,this.wantedBy);return n.left=this,n.right=e,n.isComplete&&(n.data=n.build(),n.right=void 0),n},t.prototype.build=function(){var e=[],t=this;do e.push(t.right.data),t=t.left;while(t.left);return e.reverse(),e},t.prototype.finish=function(){this.rule.postprocess&&(this.data=this.rule.postprocess(this.data,this.reference,a.fail))};function n(e,t){this.grammar=e,this.index=t,this.states=[],this.wants={},this.scannable=[],this.completed={}}n.prototype.process=function(e){for(var t=this.states,n=this.wants,r=this.completed,i=0;i<t.length;i++){var o=t[i];if(o.isComplete){if(o.finish(),o.data!==a.fail){for(var s=o.wantedBy,c=s.length;c--;){var l=s[c];this.complete(l,o)}if(o.reference===this.index){var u=o.rule.name;(this.completed[u]=this.completed[u]||[]).push(o)}}}else{var u=o.rule.symbols[o.dot];if(typeof u!=`string`){this.scannable.push(o);continue}if(n[u]){if(n[u].push(o),r.hasOwnProperty(u))for(var d=r[u],c=0;c<d.length;c++){var f=d[c];this.complete(o,f)}}else n[u]=[o],this.predict(u)}}},n.prototype.predict=function(e){for(var n=this.grammar.byName[e]||[],r=0;r<n.length;r++){var i=n[r],a=this.wants[e],o=new t(i,0,this.index,a);this.states.push(o)}},n.prototype.complete=function(e,t){var n=e.nextState(t);this.states.push(n)};function r(e,t){this.rules=e,this.start=t||this.rules[0].name;var n=this.byName={};this.rules.forEach(function(e){n.hasOwnProperty(e.name)||(n[e.name]=[]),n[e.name].push(e)})}r.fromCompiled=function(t,n){var i=t.Lexer;t.ParserStart&&(n=t.ParserStart,t=t.ParserRules);var t=t.map(function(t){return new e(t.name,t.symbols,t.postprocess)}),a=new r(t,n);return a.lexer=i,a};function i(){this.reset(``)}i.prototype.reset=function(e,t){this.buffer=e,this.index=0,this.line=t?t.line:1,this.lastLineBreak=t?-t.col:0},i.prototype.next=function(){if(this.index<this.buffer.length){var e=this.buffer[this.index++];return e===`
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{A as r,Cn as i,gt as a,hr as o,j as s,pr as c,qr as l,ut as u,wn as d,xn as f}from"./icons-BwyIKaTT.js";import{k as p,n as m,r as h}from"./api-client-xQDlhUTu.js";import{n as g}from"./utils-Bslrbb-G.js";import"./portal-container-context-NBi-KGK0.js";import"./window-store-DqX_qmkQ.js";import"./panel-store-BJhazigC.js";import"./project-store-BLGl9IAO.js";import"./project-framework-store-DwLxaRan.js";import"./session-list-sync-triggers-DtJI5KF0.js";import"./tab-store-D5I52eLN.js";import"./use-is-mobile-VRV9eZy1.js";import"./settings-categories-Ajj4ui27.js";import{t as _}from"./open-settings-EXR4zoZG.js";import{r as v}from"./clipboard-D-VCry-F.js";import{t as y}from"./button-C9ZXWb3b.js";import"./dialog-Dn_2tuYa.js";import"./mobile-bottom-sheet-DArbIyrD.js";import"./use-visual-viewport-MmugpRg-.js";import{An as b,Cn as x,Er as S,Kn as ee,Mn as C,Nn as w,On as T,Tn as E,a as D,i as O,jn as k,sn as A}from"./index-COwBji1t.js";import"./run-in-terminal-ujoc25vj.js";import{t as j}from"./run-in-terminal-button-m3i-Hcou.js";var M=e(t(),1),N={state:()=>h.get(`/api/tailscale/state`),login:()=>h.post(`/api/tailscale/login`),cancelLogin:()=>h.post(`/api/tailscale/login/cancel`),setService:e=>h.post(`/api/tailscale/service`,e)};function P(e){return e.installed?e.backendState===null?`start`:e.canManage===!1?`operator`:e.backendState===`Running`?!e.magicDns||!e.httpsCertificates?`dns`:e.device?.tags.length?e.service.defined?null:`service`:`tag`:`sign-in`:`install`}function F(e){let t=P(e);return t===`service`?null:t}var I=/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;function L(e){return e?e.length>63?`Use at most 63 characters.`:I.test(e)?null:`Use lowercase letters, digits and dashes, starting and ending with a letter or digit.`:`Enter a name.`}var R={dns:`https://login.tailscale.com/admin/dns`,accessControls:`https://login.tailscale.com/admin/acls/file`,machines:`https://login.tailscale.com/admin/machines`,services:`https://login.tailscale.com/admin/services`},z=n(),B=[`install`,`start`,`operator`,`sign-in`,`dns`,`tag`,`service`],V={install:`Install Tailscale`,start:`Start Tailscale`,operator:`Let PPM manage Tailscale`,"sign-in":`Sign in to Tailscale`,dns:`Turn on MagicDNS and HTTPS`,tag:`Tag this machine`,service:`Create the service`},H={darwin:`https://tailscale.com/download/mac`,win32:`https://tailscale.com/download/windows`},U=`curl -fsSL https://tailscale.com/install.sh | sh`,te=`sudo systemctl enable --now tailscaled`,W=e=>`sudo tailscale set --operator=${/^[\w.@-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}`,G=`tag:ppm`,ne=e=>`"tagOwners": {\n "${e}": ["autogroup:admin"]\n}`;function re({state:e,onRefresh:t,onSignIn:n,onShowSignIn:r}){let i=P(e),a=i?B.indexOf(i):B.length,s=B.filter(t=>t===`start`?i===`start`:t===`operator`?e.platform===`linux`:!0),c=e=>B.indexOf(e)<a?`done`:e===i?`current`:`todo`,l=(0,z.jsxs)(y,{variant:`outline`,onClick:t,className:`min-h-11 cursor-pointer md:min-h-9`,children:[(0,z.jsx)(o,{className:`size-3.5`}),`Check again`]}),u=e.device?.name||`this machine`,p=e.service.name,m=e.osUser&&e.osUser!==`root`?` && ${W(e.osUser)}`:``,h=`${U}${m}`,_=`${te}${m}`,v=`PPM types it into a terminal on this machine; press Enter there and give your password once.`,b={install:()=>e.platform===`linux`?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`This installs Tailscale, starts it`,m?` and lets PPM manage it`:``,`. `,v]}),(0,z.jsx)(C,{code:h}),(0,z.jsxs)(J,{children:[(0,z.jsx)(j,{command:h,label:`Install in terminal`}),l]})]}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(K,{children:`Install the Tailscale app on the machine PPM runs on and open it once.`}),(0,z.jsxs)(J,{children:[(0,z.jsx)(w,{href:H[e.platform]??`https://tailscale.com/download`,children:`Download Tailscale`}),l]})]}),start:()=>e.platform===`linux`?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`Tailscale is installed, but its service is not running. `,v]}),(0,z.jsx)(C,{code:_}),(0,z.jsxs)(J,{children:[(0,z.jsx)(j,{command:_,label:`Start in terminal`}),l]})]}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(K,{children:`Tailscale is installed, but not running. Open the Tailscale app on this machine.`}),(0,z.jsx)(J,{children:l})]}),operator:()=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`On Linux, Tailscale only takes changes from root and from one user it trusts. PPM runs as `,(0,z.jsx)(q,{children:e.osUser}),`, which has to be named once. `,v]}),(0,z.jsx)(C,{code:W(e.osUser)}),(0,z.jsxs)(J,{children:[(0,z.jsx)(j,{command:W(e.osUser),label:`Run in terminal`}),l]})]}),"sign-in":()=>{if(e.login.state===`starting`||e.login.state===`waiting`)return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(K,{children:`Waiting for you to finish signing in.`}),(0,z.jsx)(J,{children:(0,z.jsx)(y,{onClick:r,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Show sign-in link`})})]});if(e.backendState===`NeedsMachineAuth`)return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`Signed in. An admin has to approve `,u,` before it joins the tailnet.`]}),(0,z.jsxs)(J,{children:[(0,z.jsx)(w,{href:R.machines,children:`Open machines`}),l]})]});if(e.backendState===`Starting`)return(0,z.jsxs)(K,{children:[(0,z.jsx)(f,{className:`mr-2 inline size-4 animate-spin`}),`Connecting to Tailscale…`]});let t=e.backendState===`Stopped`;return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(K,{children:t?`Tailscale is turned off on this machine.`:`Sign this machine in with the account that owns your tailnet.`}),(0,z.jsx)(J,{children:(0,z.jsxs)(y,{onClick:n,className:`min-h-11 cursor-pointer md:min-h-9`,children:[(0,z.jsx)(d,{className:`size-4`}),t?`Turn on`:`Sign in`]})})]})},dns:()=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`In `,(0,z.jsx)(`b`,{children:`DNS`}),`, turn on `,(0,z.jsx)(`b`,{children:`MagicDNS`}),`, then choose `,(0,z.jsx)(`b`,{children:`Enable HTTPS`}),` under HTTPS Certificates. Every .ts.net address needs both.`]}),(0,z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`MagicDNS `,e.magicDns?`on`:`off`,` · HTTPS `,e.httpsCertificates?`on`:`off`]}),(0,z.jsxs)(J,{children:[(0,z.jsx)(w,{href:R.dns,children:`Open DNS settings`}),l]})]}),tag:()=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(K,{children:`Tailscale only lets a tagged machine host a service.`}),(0,z.jsxs)(`ol`,{className:`list-decimal space-y-3 pl-5 text-sm leading-relaxed text-muted-foreground`,children:[(0,z.jsxs)(`li`,{className:`space-y-2`,children:[(0,z.jsxs)(`p`,{children:[`In `,(0,z.jsx)(`b`,{children:`Access controls`}),`, let admins hand out the tag (once per tailnet):`]}),(0,z.jsx)(C,{code:ne(G)}),(0,z.jsx)(w,{href:R.accessControls,children:`Open access controls`})]}),(0,z.jsxs)(`li`,{className:`space-y-2`,children:[(0,z.jsxs)(`p`,{children:[`In `,(0,z.jsx)(`b`,{children:`Machines`}),`, open the menu of `,u,`, choose `,(0,z.jsx)(`b`,{children:`Edit tags`}),` and add `,(0,z.jsx)(q,{children:G}),`.`]}),(0,z.jsx)(w,{href:R.machines,children:`Open machines`})]})]}),(0,z.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`A tagged machine belongs to the tag rather than to your account.`}),(0,z.jsx)(J,{children:l})]}),service:()=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`In `,(0,z.jsx)(`b`,{children:`Services`}),`, choose `,(0,z.jsx)(`b`,{children:`Advertise`}),`, then `,(0,z.jsx)(`b`,{children:`Define a Service`}),`: name it `,(0,z.jsx)(q,{children:p}),` and give it the port `,(0,z.jsx)(q,{children:`tcp:443`}),`.`]}),(0,z.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`The address can be turned on before this; it then waits for the service and for an admin to approve this machine.`}),(0,z.jsxs)(J,{children:[(0,z.jsx)(w,{href:R.services,children:`Open services`}),l]})]})},x={operator:`PPM can change Tailscale's settings.`,"sign-in":e.device?.dnsName?`Signed in as ${e.device.dnsName}`:void 0,dns:`MagicDNS and HTTPS are on.`,tag:e.device?.tags.length?`Tagged ${e.device.tags.join(`, `)}`:void 0,service:`svc:${p} exists in your tailnet.`};return(0,z.jsx)(`ol`,{className:`space-y-1`,"data-testid":`tailscale-steps`,children:s.map((e,t)=>{let n=c(e);return(0,z.jsxs)(`li`,{className:`flex gap-3`,"data-step":e,"data-status":n,children:[(0,z.jsx)(ie,{n:t+1,status:n}),(0,z.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-2 pb-4`,children:[(0,z.jsx)(`div`,{className:g(`pt-0.5 text-sm`,n===`todo`?`text-muted-foreground`:`font-medium`),children:V[e]}),n===`done`&&x[e]&&(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:x[e]}),n===`current`&&b[e]()]})]},e)})})}function ie({n:e,status:t}){return t===`done`?(0,z.jsx)(s,{className:`mt-0.5 size-5 shrink-0 text-success`}):(0,z.jsx)(`span`,{className:g(`mt-0.5 flex size-5 shrink-0 items-center justify-center rounded-full border text-[11px] font-medium`,t===`current`?`border-primary text-primary`:`border-border text-muted-foreground`),children:e})}function K({children:e}){return(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:e})}function q({children:e}){return(0,z.jsx)(`code`,{className:`rounded bg-muted px-1 py-0.5 text-xs text-foreground`,children:e})}function J({children:e}){return(0,z.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:e})}var Y=`text-sm leading-relaxed text-muted-foreground`;function ae({open:e,login:t,osUser:n,onRetry:r,onCancel:i,onClose:a}){let o=(0,z.jsx)(y,{variant:`outline`,onClick:a,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Close`}),s=(0,z.jsx)(y,{onClick:r,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Try again`}),c,l;if(t.state===`waiting`&&t.url)c=(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(`p`,{className:Y,children:`Sign in with the account that owns your tailnet. This machine joins as soon as you finish.`}),(0,z.jsxs)(`div`,{className:`flex flex-col items-center gap-2`,children:[(0,z.jsx)(`div`,{className:`rounded-lg p-3`,style:{backgroundColor:`#ffffff`,colorScheme:`light`},children:(0,z.jsx)(A,{value:t.url,size:168,bgColor:`#ffffff`,fgColor:`#000000`,level:`L`,style:{display:`block`}})}),(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Or scan it with your phone`})]})]}),l=(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(y,{variant:`outline`,onClick:i,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel sign-in`}),(0,z.jsx)(w,{href:t.url,primary:!0,children:`Open sign-in page`})]});else if(t.state===`idle`||t.state===`starting`)c=(0,z.jsxs)(`p`,{className:`flex items-center gap-2 ${Y}`,children:[(0,z.jsx)(f,{className:`size-4 animate-spin`}),`Asking Tailscale for a sign-in link…`]}),l=(0,z.jsx)(y,{variant:`outline`,onClick:i,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`});else if(t.state===`success`)c=(0,z.jsx)(`p`,{className:Y,children:`Signed in.`}),l=o;else if(t.state===`needs-approval`)c=(0,z.jsx)(`p`,{className:Y,children:`Signed in. An admin has to approve this machine before it joins the tailnet.`}),l=(0,z.jsxs)(z.Fragment,{children:[o,(0,z.jsx)(w,{href:R.machines,primary:!0,children:`Open machines`})]});else if(t.state===`needs-operator`){let e=W(n);c=(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(`p`,{className:Y,children:`Tailscale on this machine only takes changes from root and from one user it trusts. This has to be run once, with your password. PPM types it into a terminal; press Enter there, then sign in again.`}),(0,z.jsx)(C,{code:e})]}),l=(0,z.jsxs)(z.Fragment,{children:[o,(0,z.jsx)(y,{variant:`outline`,onClick:r,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Try again`}),(0,z.jsx)(j,{command:e,label:`Run in terminal`,onRun:a})]})}else c=(0,z.jsx)(`p`,{className:Y,children:t.message??`The sign-in was cancelled.`}),l=(0,z.jsxs)(z.Fragment,{children:[o,s]});return(0,z.jsx)(k,{open:e,title:`Sign in to Tailscale`,onClose:a,children:(0,z.jsxs)(`div`,{className:`space-y-4`,"data-testid":`tailscale-sign-in`,children:[c,(0,z.jsx)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:l})]})})}var oe=4e3,X=e=>e instanceof Error?e.message:String(e);function se(e){return e.login.state===`starting`||e.login.state===`waiting`||P(e)!==null||e.enabled&&!e.service.approved}function ce(e){if(!e)return!1;try{return new URL(e).hostname===window.location.hostname}catch{return!1}}function le(e){return e.enabled?e.backendState===`Running`?e.service.pointsAtPpm?e.service.approved?`On. Open it from any device signed in to your tailnet.`:`On, waiting for an admin to approve this machine.`:`On, but Tailscale is not serving it right now.`:`On, but this machine is not connected to Tailscale.`:`Off.`}function ue(){let[e,t]=(0,M.useState)(null),[n,r]=(0,M.useState)(null),[a,o]=(0,M.useState)(!1),[s,c]=(0,M.useState)(!1),[u,d]=(0,M.useState)(!1),[f,h]=(0,M.useState)(!1),[v,b]=(0,M.useState)(``),x=(0,M.useRef)(0),C=(0,M.useRef)(null),w=(0,M.useCallback)(e=>{x.current++,t(e),r(null)},[]),T=(0,M.useCallback)(e=>{x.current++,t(t=>t&&{...t,login:e})},[]),E=(0,M.useCallback)(async()=>{let e=++x.current;try{let n=await N.state();e===x.current&&(t(n),r(null))}catch(t){e===x.current&&r(X(t))}},[]);(0,M.useEffect)(()=>{E()},[E]),(0,M.useEffect)(()=>{let e=()=>void E(),t=()=>{document.visibilityState===`visible`&&E()};return window.addEventListener(`tailscale:changed`,e),window.addEventListener(`focus`,e),document.addEventListener(`visibilitychange`,t),()=>{window.removeEventListener(`tailscale:changed`,e),window.removeEventListener(`focus`,e),document.removeEventListener(`visibilitychange`,t)}},[E]);let D=!!e&&se(e);(0,M.useEffect)(()=>{if(!D)return;let e=setInterval(()=>{document.visibilityState===`visible`&&E()},oe);return()=>clearInterval(e)},[D,E]);let O=e?.service.name??``;(0,M.useEffect)(()=>{b(O)},[O]);let A=e?.login.state;(0,M.useEffect)(()=>{s&&A===`success`&&(c(!1),p.success(`Signed in to Tailscale`))},[s,A]);let j=async()=>{T({state:`starting`,url:null,message:null}),c(!0);try{T(await N.login())}catch(e){T({state:`error`,url:null,message:X(e)})}},I=async()=>{c(!1);try{T(await N.cancelLogin())}catch{}},R=L(v),B=()=>{!e||v===e.service.name||R||(C.current=(async()=>{o(!0);try{w(await N.setService({name:v}))}catch(t){p.error(`Could not rename the address`,{description:X(t)}),b(e.service.name)}finally{o(!1)}})())},V=async(e,t=!1)=>{await C.current,o(!0);try{w(await N.setService(e?{enabled:!0,replace:t}:{enabled:!1}))}catch(t){let n=t instanceof m?t.body?.code:void 0;e&&n===`conflict`?d(!0):p.error(e?`Could not turn the address on`:`Could not turn the address off`,{description:X(t)})}finally{o(!1)}};if(!e)return(0,z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n?`Could not read Tailscale's state: ${n}`:`Reading Tailscale's state…`});let H=F(e)!==null,U=e.backendState===`Running`,te=e.authEnabled&&!H&&!R,W=P(e)===null,G=(0,z.jsx)(re,{state:e,onRefresh:()=>void E(),onSignIn:()=>void j(),onShowSignIn:()=>c(!0)});return(0,z.jsxs)(`div`,{className:`space-y-6`,"data-testid":`tailscale-settings`,children:[(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:`Reach PPM at a private https address from any device signed in to your tailnet. Nothing is opened to the internet, and PPM still asks for its password.`}),(0,z.jsxs)(`section`,{className:`space-y-4 rounded-lg border border-border p-4`,"data-testid":`tailscale-address`,children:[(0,z.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,z.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,z.jsx)(S,{htmlFor:`tailscale-address-switch`,className:`text-sm font-medium`,children:`Private address`}),(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,"data-testid":`tailscale-address-status`,children:le(e)})]}),(0,z.jsx)(`div`,{className:`flex min-h-11 shrink-0 items-center`,children:(0,z.jsx)(ee,{id:`tailscale-address-switch`,checked:e.enabled,disabled:a||!e.enabled&&!te,onCheckedChange:t=>{!t&&ce(e.service.url)?h(!0):V(t)}})})]}),e.enabled&&e.service.url?(0,z.jsx)(de,{url:e.service.url}):(0,z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,z.jsx)(S,{htmlFor:`tailscale-service-name`,className:`text-xs text-muted-foreground`,children:`Address`}),(0,z.jsxs)(`div`,{className:g(`flex min-h-11 items-center rounded-md border border-input bg-background focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50`,R&&`border-destructive`),children:[(0,z.jsx)(`input`,{id:`tailscale-service-name`,value:v,onChange:e=>b(e.target.value.toLowerCase()),onBlur:B,onKeyDown:e=>{e.key===`Enter`&&e.currentTarget.blur()},disabled:a||e.enabled,"aria-invalid":!!R,spellCheck:!1,autoCapitalize:`none`,autoComplete:`off`,className:`w-20 min-w-20 flex-1 bg-transparent py-2 pl-3 text-sm outline-none`}),(0,z.jsxs)(`span`,{className:`min-w-0 truncate pr-3 text-sm text-muted-foreground`,children:[`.`,e.dnsSuffix??`your-tailnet.ts.net`]})]}),(0,z.jsx)(`p`,{className:g(`text-xs`,R?`text-destructive`:`text-muted-foreground`),children:R??(e.enabled?`Turn the address off to rename it.`:`The address keeps this name when the machine is renamed.`)})]}),!e.enabled&&!e.authEnabled&&(0,z.jsxs)(Q,{icon:(0,z.jsx)(i,{className:`size-4`}),children:[(0,z.jsx)(`p`,{children:`PPM's password is off. Turn it on first: anyone in your tailnet could otherwise open PPM.`}),(0,z.jsx)(y,{variant:`outline`,onClick:()=>_(`general`),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Open General`})]}),!e.enabled&&e.authEnabled&&H&&(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Finish the setup below to turn it on.`}),e.enabled&&U&&!e.service.pointsAtPpm&&(0,z.jsxs)(Q,{icon:(0,z.jsx)(l,{className:`size-4 text-warning`}),children:[(0,z.jsx)(`p`,{children:`Tailscale is not serving this address right now.`}),(0,z.jsx)(y,{variant:`outline`,onClick:()=>void V(!0),disabled:a,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Apply again`})]}),e.enabled&&U&&e.service.pointsAtPpm&&!e.service.approved&&(0,z.jsx)(fe,{state:e})]}),W?(0,z.jsxs)(`details`,{className:`group`,children:[(0,z.jsx)(`summary`,{className:`flex min-h-11 cursor-pointer items-center text-sm font-medium`,children:`Setup: every step is done`}),(0,z.jsx)(`div`,{className:`pt-2`,children:G})]}):(0,z.jsxs)(`section`,{className:`space-y-3`,children:[(0,z.jsx)(`h3`,{className:`text-sm font-medium`,children:`Setup`}),G]}),(0,z.jsx)(ae,{open:s,login:e.login,osUser:e.osUser,onRetry:()=>void j(),onCancel:()=>void I(),onClose:()=>c(!1)}),(0,z.jsx)(k,{open:f,title:`Turn off the address you are using?`,onClose:()=>h(!1),children:(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`This page is open at `,e.service.url,`. Turning the address off disconnects it; reach PPM another way to turn it back on.`]}),(0,z.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,z.jsx)(y,{variant:`outline`,onClick:()=>h(!1),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`}),(0,z.jsx)(y,{variant:`destructive`,onClick:()=>{h(!1),V(!1)},className:`min-h-11 cursor-pointer md:min-h-9`,children:`Turn off`})]})]})}),(0,z.jsx)(k,{open:u,title:`Replace svc:${e.service.name}?`,onClose:()=>d(!1),children:(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`On this machine, svc:`,e.service.name,` already serves `,(0,z.jsx)(`code`,{className:`text-xs text-foreground`,children:e.service.target??`something else`}),`. Replacing it points the address at PPM, and what it served stops answering there.`]}),(0,z.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,z.jsx)(y,{variant:`outline`,onClick:()=>d(!1),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`}),(0,z.jsx)(y,{variant:`destructive`,onClick:()=>{d(!1),V(!0,!0)},className:`min-h-11 cursor-pointer md:min-h-9`,children:`Replace`})]})]})})]})}var Z=`flex size-11 shrink-0 cursor-pointer items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-surface-hover hover:text-foreground`;function de({url:e,qrHint:t=`Scan with a phone that is signed in to your tailnet`}){let[n,i]=(0,M.useState)(!1),[o,s]=(0,M.useState)(!1),l=async()=>{await v(e)&&(i(!0),setTimeout(()=>i(!1),1500))};return(0,z.jsxs)(`div`,{className:`space-y-3`,children:[(0,z.jsxs)(`div`,{className:`flex items-center rounded-md border border-border bg-muted pl-3`,"data-testid":`tailscale-address-url`,children:[(0,z.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-sm`,children:e}),(0,z.jsx)(`button`,{type:`button`,onClick:()=>void l(),"aria-label":`Copy address`,title:`Copy address`,className:Z,children:n?(0,z.jsx)(r,{className:`size-4 text-success`}):(0,z.jsx)(u,{className:`size-4`})}),(0,z.jsx)(`button`,{type:`button`,onClick:()=>s(e=>!e),"aria-label":`Show QR code`,"aria-pressed":o,title:`Show QR code`,className:g(Z,o&&`text-foreground`),children:(0,z.jsx)(c,{className:`size-4`})}),(0,z.jsx)(`a`,{href:e,target:`_blank`,rel:`noopener noreferrer`,"aria-label":`Open address`,title:`Open address`,className:Z,children:(0,z.jsx)(a,{className:`size-4`})})]}),o&&(0,z.jsxs)(`div`,{className:`flex flex-col items-center gap-2`,children:[(0,z.jsx)(`div`,{className:`rounded-lg p-3`,style:{backgroundColor:`#ffffff`,colorScheme:`light`},children:(0,z.jsx)(A,{value:e,size:168,bgColor:`#ffffff`,fgColor:`#000000`,level:`L`,style:{display:`block`}})}),(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:t})]})]})}function fe({state:e}){let t=`svc:${e.service.name}`,n=e.device?.name||`this machine`,r=`"autoApprovers": {\n "services": {\n "${t}": ["${e.device?.tags[0]??`tag:ppm`}"]\n }\n}`;return(0,z.jsxs)(Q,{icon:(0,z.jsx)(l,{className:`size-4 text-warning`}),children:[(0,z.jsx)(`p`,{children:e.service.defined?(0,z.jsxs)(z.Fragment,{children:[`Waiting for approval. In `,(0,z.jsx)(`b`,{children:`Services`}),`, open `,t,` and approve `,n,` under Service hosts.`]}):(0,z.jsxs)(z.Fragment,{children:[`Waiting for the service. Create `,t,` in `,(0,z.jsx)(`b`,{children:`Services`}),` (the last step below), then approve `,n,` as its host.`]})}),(0,z.jsx)(w,{href:R.services,children:`Open services`}),(0,z.jsx)(`p`,{className:`pt-1`,children:`To approve machines with this tag automatically, add this to your access controls:`}),(0,z.jsx)(C,{code:r})]})}function Q({icon:e,children:t}){return(0,z.jsxs)(`div`,{className:`flex gap-3 rounded-md border border-border bg-muted px-4 py-3`,children:[(0,z.jsx)(`span`,{className:`mt-0.5 shrink-0 text-muted-foreground`,children:e}),(0,z.jsx)(`div`,{className:`min-w-0 flex-1 space-y-2 text-sm leading-relaxed text-muted-foreground`,children:t})]})}var pe=1e4,me=2e3,$=e=>e instanceof Error?e.message:String(e);function he(e){if(!e)return!1;try{return new URL(e).hostname===window.location.hostname}catch{return!1}}function ge(){let[e,t]=(0,M.useState)(null),[n,r]=(0,M.useState)(null),[a,o]=(0,M.useState)(!1),[s,c]=(0,M.useState)(!1),[u,d]=(0,M.useState)(!1),[m,h]=(0,M.useState)(!1),g=D(),v=(0,M.useCallback)(async()=>{try{t(await x.status()),r(null)}catch(e){r($(e))}},[]),b=e?e.enabled??!0:!1,C=b&&!!e&&!e.active;(0,M.useEffect)(()=>{v()},[v]),(0,M.useEffect)(()=>{let e=setInterval(()=>{document.visibilityState===`visible`&&v()},C?me:pe);return()=>clearInterval(e)},[C,v]),(0,M.useEffect)(()=>{let e=()=>{v(),g.refreshStatus()};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[v,g.refreshStatus]);let w=async e=>{o(!0),t(t=>t&&{...t,enabled:e});try{await x.setEnabled(e),await v()}catch(n){t(t=>t&&{...t,enabled:!e}),p.error(e?`Could not turn the public link on`:`Could not turn the public link off`,{description:$(n)})}finally{o(!1)}},T=async()=>{d(!1),h(!0);try{await E.disable(),p.success(`Switched to a temporary address`),await Promise.all([g.refreshStatus(),v()])}catch(e){p.error(`Could not switch to a temporary address`,{description:$(e)})}finally{h(!1)}};if(!e)return(0,z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n?`Could not read the public link's state: ${n}`:`Reading the public link's state…`});let A=g.status,j=A?.authEnabled??!0,N=A?.mode??`quick`,P=N===`named`?A?.hostname??null:null,F=!!P&&window.location.hostname===P,I=g.step.k!==`hidden`&&g.step.k!==`ask-domain`,L=N===`named`&&A?.liveMode===`quick`;return(0,z.jsxs)(`div`,{className:`space-y-6`,"data-testid":`public-link-pane`,children:[(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:`Open PPM from anywhere through a public https link, served by Cloudflare. Anyone who has the link reaches PPM's sign-in page, so keep the password on. For a link only your own devices can open, use Tailscale instead.`}),(0,z.jsxs)(`section`,{className:`space-y-4 rounded-lg border border-border p-4`,"data-testid":`public-link-switch-card`,children:[(0,z.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,z.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,z.jsx)(S,{htmlFor:`public-link-switch`,className:`text-sm font-medium`,children:`Public link`}),(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,"data-testid":`public-link-status`,children:b?C?`On. Waiting for Cloudflare to hand out the link…`:`On. Anyone with the link reaches PPM's sign-in page.`:`Off.`})]}),(0,z.jsxs)(`div`,{className:`flex min-h-11 shrink-0 items-center gap-2`,children:[(a||C)&&(0,z.jsx)(f,{className:`size-4 animate-spin text-muted-foreground`}),(0,z.jsx)(ee,{id:`public-link-switch`,checked:b,disabled:a||!b&&!j,onCheckedChange:t=>{!t&&he(e.url)?c(!0):w(t)}})]})]}),b&&e.url&&(0,z.jsx)(de,{url:e.url,qrHint:`Scan to open PPM on a phone`}),!j&&(0,z.jsxs)(Q,{icon:(0,z.jsx)(i,{className:`size-4`}),children:[(0,z.jsx)(`p`,{children:b?`PPM's password is off while the link is on: anyone who has the link can open PPM. Turn the password on, or the link off.`:`PPM's password is off. Turn it on first: anyone with the link could otherwise open PPM.`}),(0,z.jsx)(y,{variant:`outline`,onClick:()=>_(`general`),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Open General`})]})]}),(0,z.jsxs)(`section`,{className:`space-y-3`,"data-testid":`public-link-address`,children:[(0,z.jsx)(`h3`,{className:`text-sm font-medium`,children:`Address`}),I?(0,z.jsx)(`div`,{className:`rounded-lg border border-border p-4`,children:(0,z.jsx)(O,{step:g.step,t:g})}):(0,z.jsxs)(`div`,{className:`divide-y divide-border rounded-lg border border-border`,children:[(0,z.jsx)(_e,{title:`Temporary address`,inUse:N===`quick`,description:`A random trycloudflare.com address. It changes every time PPM restarts.`,action:N===`named`&&(0,z.jsx)(y,{variant:`outline`,onClick:()=>d(!0),disabled:m||F,className:`min-h-11 cursor-pointer md:min-h-9`,children:m?(0,z.jsx)(f,{className:`size-4 animate-spin`}):`Switch`})}),(0,z.jsx)(_e,{title:`Your own domain`,inUse:N===`named`,description:P?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(`span`,{className:`break-all font-medium text-foreground`,children:[`https://`,P]}),`. It stays the same after a restart.`]}):`One fixed address on a domain you have on Cloudflare, like ppm.example.com.`,action:N===`quick`&&j&&(0,z.jsx)(y,{onClick:g.answerYes,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Set up`})})]}),!I&&N===`quick`&&!j&&(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Turn on PPM's password to use your own domain.`}),!I&&F&&(0,z.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`This page is open through your domain, so switching would cut it off before the new address could show. Open PPM another way first (Tailscale, or on this machine), then switch.`}),(L||A?.tunnelWarning)&&(0,z.jsxs)(Q,{icon:(0,z.jsx)(l,{className:`size-4 text-warning`}),children:[L&&(0,z.jsx)(`p`,{children:`PPM could not use your domain and is on a temporary address for now.`}),A?.tunnelWarning&&(0,z.jsx)(`p`,{children:A.tunnelWarning})]})]}),(0,z.jsx)(k,{open:s,title:`Turn off the link you are using?`,onClose:()=>c(!1),children:(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`This page is open at `,e.url,`. Turning the link off disconnects it; reach PPM another way to turn it back on.`]}),(0,z.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,z.jsx)(y,{variant:`outline`,onClick:()=>c(!1),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`}),(0,z.jsx)(y,{variant:`destructive`,onClick:()=>{c(!1),w(!1)},className:`min-h-11 cursor-pointer md:min-h-9`,children:`Turn off`})]})]})}),(0,z.jsx)(k,{open:u,title:`Switch to a temporary address?`,onClose:()=>d(!1),children:(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`PPM stops answering at https://`,P,` and gets a new random address instead. Links that use your domain stop working until you set it up again.`]}),(0,z.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,z.jsx)(y,{variant:`outline`,onClick:()=>d(!1),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`}),(0,z.jsx)(y,{variant:`destructive`,onClick:()=>void T(),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Switch`})]})]})})]})}function _e({title:e,description:t,inUse:n,action:r}){return(0,z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 p-3`,"data-in-use":n||void 0,children:[(0,z.jsxs)(`div`,{className:`min-w-0 flex-[1_1_14rem] space-y-0.5`,children:[(0,z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,z.jsx)(`span`,{className:`text-sm font-medium`,children:e}),n&&(0,z.jsx)(`span`,{className:`rounded bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-primary`,children:`In use`})]}),(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:t})]}),r&&(0,z.jsx)(`div`,{className:`shrink-0`,children:r})]})}function ve(){let e=b(e=>e.tab),t=b(e=>e.setTab);return(0,z.jsxs)(`div`,{className:`space-y-5`,"data-testid":`remote-access`,"data-tab":e,children:[(0,z.jsx)(`div`,{role:`tablist`,"aria-label":`Remote access`,className:`flex gap-1 overflow-x-auto border-b border-border/50`,children:T.map(n=>(0,z.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":e===n.id,"data-testid":`remote-access-tab-${n.id}`,onClick:()=>t(n.id),className:g(`flex min-h-11 shrink-0 cursor-pointer items-center whitespace-nowrap rounded-t px-3 text-sm transition-colors md:min-h-9 md:text-xs`,e===n.id?`border-b-2 border-primary font-medium text-primary`:`text-text-subtle hover:text-text-secondary`),children:n.label},n.id))}),(0,z.jsxs)(`div`,{role:`tabpanel`,children:[e===`tailscale`&&(0,z.jsx)(ue,{}),e===`public-link`&&(0,z.jsx)(ge,{})]})]})}export{ve as RemoteAccessSettingsSection};
|
|
1
|
+
import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{A as r,Cn as i,gt as a,hr as o,j as s,pr as c,qr as l,ut as u,wn as d,xn as f}from"./icons-BwyIKaTT.js";import{k as p,n as m,r as h}from"./api-client-xQDlhUTu.js";import{n as g}from"./utils-Bslrbb-G.js";import"./portal-container-context-NBi-KGK0.js";import"./window-store-DqX_qmkQ.js";import"./panel-store-BJhazigC.js";import"./project-store-BLGl9IAO.js";import"./project-framework-store-DwLxaRan.js";import"./session-list-sync-triggers-DtJI5KF0.js";import"./tab-store-D5I52eLN.js";import"./use-is-mobile-VRV9eZy1.js";import"./settings-categories-Ajj4ui27.js";import{t as _}from"./open-settings-EXR4zoZG.js";import{r as v}from"./clipboard-D-VCry-F.js";import{t as y}from"./button-C9ZXWb3b.js";import"./dialog-Dn_2tuYa.js";import"./mobile-bottom-sheet-DArbIyrD.js";import"./use-visual-viewport-MmugpRg-.js";import{An as b,Cn as x,Er as S,Kn as ee,Mn as C,Nn as w,On as T,Tn as E,a as D,i as O,jn as k,sn as A}from"./index-EznfgwH9.js";import"./run-in-terminal-ujoc25vj.js";import{t as j}from"./run-in-terminal-button-m3i-Hcou.js";var M=e(t(),1),N={state:()=>h.get(`/api/tailscale/state`),login:()=>h.post(`/api/tailscale/login`),cancelLogin:()=>h.post(`/api/tailscale/login/cancel`),setService:e=>h.post(`/api/tailscale/service`,e)};function P(e){return e.installed?e.backendState===null?`start`:e.canManage===!1?`operator`:e.backendState===`Running`?!e.magicDns||!e.httpsCertificates?`dns`:e.device?.tags.length?e.service.defined?null:`service`:`tag`:`sign-in`:`install`}function F(e){let t=P(e);return t===`service`?null:t}var I=/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;function L(e){return e?e.length>63?`Use at most 63 characters.`:I.test(e)?null:`Use lowercase letters, digits and dashes, starting and ending with a letter or digit.`:`Enter a name.`}var R={dns:`https://login.tailscale.com/admin/dns`,accessControls:`https://login.tailscale.com/admin/acls/file`,machines:`https://login.tailscale.com/admin/machines`,services:`https://login.tailscale.com/admin/services`},z=n(),B=[`install`,`start`,`operator`,`sign-in`,`dns`,`tag`,`service`],V={install:`Install Tailscale`,start:`Start Tailscale`,operator:`Let PPM manage Tailscale`,"sign-in":`Sign in to Tailscale`,dns:`Turn on MagicDNS and HTTPS`,tag:`Tag this machine`,service:`Create the service`},H={darwin:`https://tailscale.com/download/mac`,win32:`https://tailscale.com/download/windows`},U=`curl -fsSL https://tailscale.com/install.sh | sh`,te=`sudo systemctl enable --now tailscaled`,W=e=>`sudo tailscale set --operator=${/^[\w.@-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}`,G=`tag:ppm`,ne=e=>`"tagOwners": {\n "${e}": ["autogroup:admin"]\n}`;function re({state:e,onRefresh:t,onSignIn:n,onShowSignIn:r}){let i=P(e),a=i?B.indexOf(i):B.length,s=B.filter(t=>t===`start`?i===`start`:t===`operator`?e.platform===`linux`:!0),c=e=>B.indexOf(e)<a?`done`:e===i?`current`:`todo`,l=(0,z.jsxs)(y,{variant:`outline`,onClick:t,className:`min-h-11 cursor-pointer md:min-h-9`,children:[(0,z.jsx)(o,{className:`size-3.5`}),`Check again`]}),u=e.device?.name||`this machine`,p=e.service.name,m=e.osUser&&e.osUser!==`root`?` && ${W(e.osUser)}`:``,h=`${U}${m}`,_=`${te}${m}`,v=`PPM types it into a terminal on this machine; press Enter there and give your password once.`,b={install:()=>e.platform===`linux`?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`This installs Tailscale, starts it`,m?` and lets PPM manage it`:``,`. `,v]}),(0,z.jsx)(C,{code:h}),(0,z.jsxs)(J,{children:[(0,z.jsx)(j,{command:h,label:`Install in terminal`}),l]})]}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(K,{children:`Install the Tailscale app on the machine PPM runs on and open it once.`}),(0,z.jsxs)(J,{children:[(0,z.jsx)(w,{href:H[e.platform]??`https://tailscale.com/download`,children:`Download Tailscale`}),l]})]}),start:()=>e.platform===`linux`?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`Tailscale is installed, but its service is not running. `,v]}),(0,z.jsx)(C,{code:_}),(0,z.jsxs)(J,{children:[(0,z.jsx)(j,{command:_,label:`Start in terminal`}),l]})]}):(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(K,{children:`Tailscale is installed, but not running. Open the Tailscale app on this machine.`}),(0,z.jsx)(J,{children:l})]}),operator:()=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`On Linux, Tailscale only takes changes from root and from one user it trusts. PPM runs as `,(0,z.jsx)(q,{children:e.osUser}),`, which has to be named once. `,v]}),(0,z.jsx)(C,{code:W(e.osUser)}),(0,z.jsxs)(J,{children:[(0,z.jsx)(j,{command:W(e.osUser),label:`Run in terminal`}),l]})]}),"sign-in":()=>{if(e.login.state===`starting`||e.login.state===`waiting`)return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(K,{children:`Waiting for you to finish signing in.`}),(0,z.jsx)(J,{children:(0,z.jsx)(y,{onClick:r,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Show sign-in link`})})]});if(e.backendState===`NeedsMachineAuth`)return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`Signed in. An admin has to approve `,u,` before it joins the tailnet.`]}),(0,z.jsxs)(J,{children:[(0,z.jsx)(w,{href:R.machines,children:`Open machines`}),l]})]});if(e.backendState===`Starting`)return(0,z.jsxs)(K,{children:[(0,z.jsx)(f,{className:`mr-2 inline size-4 animate-spin`}),`Connecting to Tailscale…`]});let t=e.backendState===`Stopped`;return(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(K,{children:t?`Tailscale is turned off on this machine.`:`Sign this machine in with the account that owns your tailnet.`}),(0,z.jsx)(J,{children:(0,z.jsxs)(y,{onClick:n,className:`min-h-11 cursor-pointer md:min-h-9`,children:[(0,z.jsx)(d,{className:`size-4`}),t?`Turn on`:`Sign in`]})})]})},dns:()=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`In `,(0,z.jsx)(`b`,{children:`DNS`}),`, turn on `,(0,z.jsx)(`b`,{children:`MagicDNS`}),`, then choose `,(0,z.jsx)(`b`,{children:`Enable HTTPS`}),` under HTTPS Certificates. Every .ts.net address needs both.`]}),(0,z.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`MagicDNS `,e.magicDns?`on`:`off`,` · HTTPS `,e.httpsCertificates?`on`:`off`]}),(0,z.jsxs)(J,{children:[(0,z.jsx)(w,{href:R.dns,children:`Open DNS settings`}),l]})]}),tag:()=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(K,{children:`Tailscale only lets a tagged machine host a service.`}),(0,z.jsxs)(`ol`,{className:`list-decimal space-y-3 pl-5 text-sm leading-relaxed text-muted-foreground`,children:[(0,z.jsxs)(`li`,{className:`space-y-2`,children:[(0,z.jsxs)(`p`,{children:[`In `,(0,z.jsx)(`b`,{children:`Access controls`}),`, let admins hand out the tag (once per tailnet):`]}),(0,z.jsx)(C,{code:ne(G)}),(0,z.jsx)(w,{href:R.accessControls,children:`Open access controls`})]}),(0,z.jsxs)(`li`,{className:`space-y-2`,children:[(0,z.jsxs)(`p`,{children:[`In `,(0,z.jsx)(`b`,{children:`Machines`}),`, open the menu of `,u,`, choose `,(0,z.jsx)(`b`,{children:`Edit tags`}),` and add `,(0,z.jsx)(q,{children:G}),`.`]}),(0,z.jsx)(w,{href:R.machines,children:`Open machines`})]})]}),(0,z.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`A tagged machine belongs to the tag rather than to your account.`}),(0,z.jsx)(J,{children:l})]}),service:()=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(K,{children:[`In `,(0,z.jsx)(`b`,{children:`Services`}),`, choose `,(0,z.jsx)(`b`,{children:`Advertise`}),`, then `,(0,z.jsx)(`b`,{children:`Define a Service`}),`: name it `,(0,z.jsx)(q,{children:p}),` and give it the port `,(0,z.jsx)(q,{children:`tcp:443`}),`.`]}),(0,z.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`The address can be turned on before this; it then waits for the service and for an admin to approve this machine.`}),(0,z.jsxs)(J,{children:[(0,z.jsx)(w,{href:R.services,children:`Open services`}),l]})]})},x={operator:`PPM can change Tailscale's settings.`,"sign-in":e.device?.dnsName?`Signed in as ${e.device.dnsName}`:void 0,dns:`MagicDNS and HTTPS are on.`,tag:e.device?.tags.length?`Tagged ${e.device.tags.join(`, `)}`:void 0,service:`svc:${p} exists in your tailnet.`};return(0,z.jsx)(`ol`,{className:`space-y-1`,"data-testid":`tailscale-steps`,children:s.map((e,t)=>{let n=c(e);return(0,z.jsxs)(`li`,{className:`flex gap-3`,"data-step":e,"data-status":n,children:[(0,z.jsx)(ie,{n:t+1,status:n}),(0,z.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-2 pb-4`,children:[(0,z.jsx)(`div`,{className:g(`pt-0.5 text-sm`,n===`todo`?`text-muted-foreground`:`font-medium`),children:V[e]}),n===`done`&&x[e]&&(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:x[e]}),n===`current`&&b[e]()]})]},e)})})}function ie({n:e,status:t}){return t===`done`?(0,z.jsx)(s,{className:`mt-0.5 size-5 shrink-0 text-success`}):(0,z.jsx)(`span`,{className:g(`mt-0.5 flex size-5 shrink-0 items-center justify-center rounded-full border text-[11px] font-medium`,t===`current`?`border-primary text-primary`:`border-border text-muted-foreground`),children:e})}function K({children:e}){return(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:e})}function q({children:e}){return(0,z.jsx)(`code`,{className:`rounded bg-muted px-1 py-0.5 text-xs text-foreground`,children:e})}function J({children:e}){return(0,z.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:e})}var Y=`text-sm leading-relaxed text-muted-foreground`;function ae({open:e,login:t,osUser:n,onRetry:r,onCancel:i,onClose:a}){let o=(0,z.jsx)(y,{variant:`outline`,onClick:a,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Close`}),s=(0,z.jsx)(y,{onClick:r,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Try again`}),c,l;if(t.state===`waiting`&&t.url)c=(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(`p`,{className:Y,children:`Sign in with the account that owns your tailnet. This machine joins as soon as you finish.`}),(0,z.jsxs)(`div`,{className:`flex flex-col items-center gap-2`,children:[(0,z.jsx)(`div`,{className:`rounded-lg p-3`,style:{backgroundColor:`#ffffff`,colorScheme:`light`},children:(0,z.jsx)(A,{value:t.url,size:168,bgColor:`#ffffff`,fgColor:`#000000`,level:`L`,style:{display:`block`}})}),(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Or scan it with your phone`})]})]}),l=(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(y,{variant:`outline`,onClick:i,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel sign-in`}),(0,z.jsx)(w,{href:t.url,primary:!0,children:`Open sign-in page`})]});else if(t.state===`idle`||t.state===`starting`)c=(0,z.jsxs)(`p`,{className:`flex items-center gap-2 ${Y}`,children:[(0,z.jsx)(f,{className:`size-4 animate-spin`}),`Asking Tailscale for a sign-in link…`]}),l=(0,z.jsx)(y,{variant:`outline`,onClick:i,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`});else if(t.state===`success`)c=(0,z.jsx)(`p`,{className:Y,children:`Signed in.`}),l=o;else if(t.state===`needs-approval`)c=(0,z.jsx)(`p`,{className:Y,children:`Signed in. An admin has to approve this machine before it joins the tailnet.`}),l=(0,z.jsxs)(z.Fragment,{children:[o,(0,z.jsx)(w,{href:R.machines,primary:!0,children:`Open machines`})]});else if(t.state===`needs-operator`){let e=W(n);c=(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(`p`,{className:Y,children:`Tailscale on this machine only takes changes from root and from one user it trusts. This has to be run once, with your password. PPM types it into a terminal; press Enter there, then sign in again.`}),(0,z.jsx)(C,{code:e})]}),l=(0,z.jsxs)(z.Fragment,{children:[o,(0,z.jsx)(y,{variant:`outline`,onClick:r,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Try again`}),(0,z.jsx)(j,{command:e,label:`Run in terminal`,onRun:a})]})}else c=(0,z.jsx)(`p`,{className:Y,children:t.message??`The sign-in was cancelled.`}),l=(0,z.jsxs)(z.Fragment,{children:[o,s]});return(0,z.jsx)(k,{open:e,title:`Sign in to Tailscale`,onClose:a,children:(0,z.jsxs)(`div`,{className:`space-y-4`,"data-testid":`tailscale-sign-in`,children:[c,(0,z.jsx)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:l})]})})}var oe=4e3,X=e=>e instanceof Error?e.message:String(e);function se(e){return e.login.state===`starting`||e.login.state===`waiting`||P(e)!==null||e.enabled&&!e.service.approved}function ce(e){if(!e)return!1;try{return new URL(e).hostname===window.location.hostname}catch{return!1}}function le(e){return e.enabled?e.backendState===`Running`?e.service.pointsAtPpm?e.service.approved?`On. Open it from any device signed in to your tailnet.`:`On, waiting for an admin to approve this machine.`:`On, but Tailscale is not serving it right now.`:`On, but this machine is not connected to Tailscale.`:`Off.`}function ue(){let[e,t]=(0,M.useState)(null),[n,r]=(0,M.useState)(null),[a,o]=(0,M.useState)(!1),[s,c]=(0,M.useState)(!1),[u,d]=(0,M.useState)(!1),[f,h]=(0,M.useState)(!1),[v,b]=(0,M.useState)(``),x=(0,M.useRef)(0),C=(0,M.useRef)(null),w=(0,M.useCallback)(e=>{x.current++,t(e),r(null)},[]),T=(0,M.useCallback)(e=>{x.current++,t(t=>t&&{...t,login:e})},[]),E=(0,M.useCallback)(async()=>{let e=++x.current;try{let n=await N.state();e===x.current&&(t(n),r(null))}catch(t){e===x.current&&r(X(t))}},[]);(0,M.useEffect)(()=>{E()},[E]),(0,M.useEffect)(()=>{let e=()=>void E(),t=()=>{document.visibilityState===`visible`&&E()};return window.addEventListener(`tailscale:changed`,e),window.addEventListener(`focus`,e),document.addEventListener(`visibilitychange`,t),()=>{window.removeEventListener(`tailscale:changed`,e),window.removeEventListener(`focus`,e),document.removeEventListener(`visibilitychange`,t)}},[E]);let D=!!e&&se(e);(0,M.useEffect)(()=>{if(!D)return;let e=setInterval(()=>{document.visibilityState===`visible`&&E()},oe);return()=>clearInterval(e)},[D,E]);let O=e?.service.name??``;(0,M.useEffect)(()=>{b(O)},[O]);let A=e?.login.state;(0,M.useEffect)(()=>{s&&A===`success`&&(c(!1),p.success(`Signed in to Tailscale`))},[s,A]);let j=async()=>{T({state:`starting`,url:null,message:null}),c(!0);try{T(await N.login())}catch(e){T({state:`error`,url:null,message:X(e)})}},I=async()=>{c(!1);try{T(await N.cancelLogin())}catch{}},R=L(v),B=()=>{!e||v===e.service.name||R||(C.current=(async()=>{o(!0);try{w(await N.setService({name:v}))}catch(t){p.error(`Could not rename the address`,{description:X(t)}),b(e.service.name)}finally{o(!1)}})())},V=async(e,t=!1)=>{await C.current,o(!0);try{w(await N.setService(e?{enabled:!0,replace:t}:{enabled:!1}))}catch(t){let n=t instanceof m?t.body?.code:void 0;e&&n===`conflict`?d(!0):p.error(e?`Could not turn the address on`:`Could not turn the address off`,{description:X(t)})}finally{o(!1)}};if(!e)return(0,z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n?`Could not read Tailscale's state: ${n}`:`Reading Tailscale's state…`});let H=F(e)!==null,U=e.backendState===`Running`,te=e.authEnabled&&!H&&!R,W=P(e)===null,G=(0,z.jsx)(re,{state:e,onRefresh:()=>void E(),onSignIn:()=>void j(),onShowSignIn:()=>c(!0)});return(0,z.jsxs)(`div`,{className:`space-y-6`,"data-testid":`tailscale-settings`,children:[(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:`Reach PPM at a private https address from any device signed in to your tailnet. Nothing is opened to the internet, and PPM still asks for its password.`}),(0,z.jsxs)(`section`,{className:`space-y-4 rounded-lg border border-border p-4`,"data-testid":`tailscale-address`,children:[(0,z.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,z.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,z.jsx)(S,{htmlFor:`tailscale-address-switch`,className:`text-sm font-medium`,children:`Private address`}),(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,"data-testid":`tailscale-address-status`,children:le(e)})]}),(0,z.jsx)(`div`,{className:`flex min-h-11 shrink-0 items-center`,children:(0,z.jsx)(ee,{id:`tailscale-address-switch`,checked:e.enabled,disabled:a||!e.enabled&&!te,onCheckedChange:t=>{!t&&ce(e.service.url)?h(!0):V(t)}})})]}),e.enabled&&e.service.url?(0,z.jsx)(de,{url:e.service.url}):(0,z.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,z.jsx)(S,{htmlFor:`tailscale-service-name`,className:`text-xs text-muted-foreground`,children:`Address`}),(0,z.jsxs)(`div`,{className:g(`flex min-h-11 items-center rounded-md border border-input bg-background focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50`,R&&`border-destructive`),children:[(0,z.jsx)(`input`,{id:`tailscale-service-name`,value:v,onChange:e=>b(e.target.value.toLowerCase()),onBlur:B,onKeyDown:e=>{e.key===`Enter`&&e.currentTarget.blur()},disabled:a||e.enabled,"aria-invalid":!!R,spellCheck:!1,autoCapitalize:`none`,autoComplete:`off`,className:`w-20 min-w-20 flex-1 bg-transparent py-2 pl-3 text-sm outline-none`}),(0,z.jsxs)(`span`,{className:`min-w-0 truncate pr-3 text-sm text-muted-foreground`,children:[`.`,e.dnsSuffix??`your-tailnet.ts.net`]})]}),(0,z.jsx)(`p`,{className:g(`text-xs`,R?`text-destructive`:`text-muted-foreground`),children:R??(e.enabled?`Turn the address off to rename it.`:`The address keeps this name when the machine is renamed.`)})]}),!e.enabled&&!e.authEnabled&&(0,z.jsxs)(Q,{icon:(0,z.jsx)(i,{className:`size-4`}),children:[(0,z.jsx)(`p`,{children:`PPM's password is off. Turn it on first: anyone in your tailnet could otherwise open PPM.`}),(0,z.jsx)(y,{variant:`outline`,onClick:()=>_(`general`),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Open General`})]}),!e.enabled&&e.authEnabled&&H&&(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Finish the setup below to turn it on.`}),e.enabled&&U&&!e.service.pointsAtPpm&&(0,z.jsxs)(Q,{icon:(0,z.jsx)(l,{className:`size-4 text-warning`}),children:[(0,z.jsx)(`p`,{children:`Tailscale is not serving this address right now.`}),(0,z.jsx)(y,{variant:`outline`,onClick:()=>void V(!0),disabled:a,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Apply again`})]}),e.enabled&&U&&e.service.pointsAtPpm&&!e.service.approved&&(0,z.jsx)(fe,{state:e})]}),W?(0,z.jsxs)(`details`,{className:`group`,children:[(0,z.jsx)(`summary`,{className:`flex min-h-11 cursor-pointer items-center text-sm font-medium`,children:`Setup: every step is done`}),(0,z.jsx)(`div`,{className:`pt-2`,children:G})]}):(0,z.jsxs)(`section`,{className:`space-y-3`,children:[(0,z.jsx)(`h3`,{className:`text-sm font-medium`,children:`Setup`}),G]}),(0,z.jsx)(ae,{open:s,login:e.login,osUser:e.osUser,onRetry:()=>void j(),onCancel:()=>void I(),onClose:()=>c(!1)}),(0,z.jsx)(k,{open:f,title:`Turn off the address you are using?`,onClose:()=>h(!1),children:(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`This page is open at `,e.service.url,`. Turning the address off disconnects it; reach PPM another way to turn it back on.`]}),(0,z.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,z.jsx)(y,{variant:`outline`,onClick:()=>h(!1),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`}),(0,z.jsx)(y,{variant:`destructive`,onClick:()=>{h(!1),V(!1)},className:`min-h-11 cursor-pointer md:min-h-9`,children:`Turn off`})]})]})}),(0,z.jsx)(k,{open:u,title:`Replace svc:${e.service.name}?`,onClose:()=>d(!1),children:(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`On this machine, svc:`,e.service.name,` already serves `,(0,z.jsx)(`code`,{className:`text-xs text-foreground`,children:e.service.target??`something else`}),`. Replacing it points the address at PPM, and what it served stops answering there.`]}),(0,z.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,z.jsx)(y,{variant:`outline`,onClick:()=>d(!1),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`}),(0,z.jsx)(y,{variant:`destructive`,onClick:()=>{d(!1),V(!0,!0)},className:`min-h-11 cursor-pointer md:min-h-9`,children:`Replace`})]})]})})]})}var Z=`flex size-11 shrink-0 cursor-pointer items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-surface-hover hover:text-foreground`;function de({url:e,qrHint:t=`Scan with a phone that is signed in to your tailnet`}){let[n,i]=(0,M.useState)(!1),[o,s]=(0,M.useState)(!1),l=async()=>{await v(e)&&(i(!0),setTimeout(()=>i(!1),1500))};return(0,z.jsxs)(`div`,{className:`space-y-3`,children:[(0,z.jsxs)(`div`,{className:`flex items-center rounded-md border border-border bg-muted pl-3`,"data-testid":`tailscale-address-url`,children:[(0,z.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-sm`,children:e}),(0,z.jsx)(`button`,{type:`button`,onClick:()=>void l(),"aria-label":`Copy address`,title:`Copy address`,className:Z,children:n?(0,z.jsx)(r,{className:`size-4 text-success`}):(0,z.jsx)(u,{className:`size-4`})}),(0,z.jsx)(`button`,{type:`button`,onClick:()=>s(e=>!e),"aria-label":`Show QR code`,"aria-pressed":o,title:`Show QR code`,className:g(Z,o&&`text-foreground`),children:(0,z.jsx)(c,{className:`size-4`})}),(0,z.jsx)(`a`,{href:e,target:`_blank`,rel:`noopener noreferrer`,"aria-label":`Open address`,title:`Open address`,className:Z,children:(0,z.jsx)(a,{className:`size-4`})})]}),o&&(0,z.jsxs)(`div`,{className:`flex flex-col items-center gap-2`,children:[(0,z.jsx)(`div`,{className:`rounded-lg p-3`,style:{backgroundColor:`#ffffff`,colorScheme:`light`},children:(0,z.jsx)(A,{value:e,size:168,bgColor:`#ffffff`,fgColor:`#000000`,level:`L`,style:{display:`block`}})}),(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:t})]})]})}function fe({state:e}){let t=`svc:${e.service.name}`,n=e.device?.name||`this machine`,r=`"autoApprovers": {\n "services": {\n "${t}": ["${e.device?.tags[0]??`tag:ppm`}"]\n }\n}`;return(0,z.jsxs)(Q,{icon:(0,z.jsx)(l,{className:`size-4 text-warning`}),children:[(0,z.jsx)(`p`,{children:e.service.defined?(0,z.jsxs)(z.Fragment,{children:[`Waiting for approval. In `,(0,z.jsx)(`b`,{children:`Services`}),`, open `,t,` and approve `,n,` under Service hosts.`]}):(0,z.jsxs)(z.Fragment,{children:[`Waiting for the service. Create `,t,` in `,(0,z.jsx)(`b`,{children:`Services`}),` (the last step below), then approve `,n,` as its host.`]})}),(0,z.jsx)(w,{href:R.services,children:`Open services`}),(0,z.jsx)(`p`,{className:`pt-1`,children:`To approve machines with this tag automatically, add this to your access controls:`}),(0,z.jsx)(C,{code:r})]})}function Q({icon:e,children:t}){return(0,z.jsxs)(`div`,{className:`flex gap-3 rounded-md border border-border bg-muted px-4 py-3`,children:[(0,z.jsx)(`span`,{className:`mt-0.5 shrink-0 text-muted-foreground`,children:e}),(0,z.jsx)(`div`,{className:`min-w-0 flex-1 space-y-2 text-sm leading-relaxed text-muted-foreground`,children:t})]})}var pe=1e4,me=2e3,$=e=>e instanceof Error?e.message:String(e);function he(e){if(!e)return!1;try{return new URL(e).hostname===window.location.hostname}catch{return!1}}function ge(){let[e,t]=(0,M.useState)(null),[n,r]=(0,M.useState)(null),[a,o]=(0,M.useState)(!1),[s,c]=(0,M.useState)(!1),[u,d]=(0,M.useState)(!1),[m,h]=(0,M.useState)(!1),g=D(),v=(0,M.useCallback)(async()=>{try{t(await x.status()),r(null)}catch(e){r($(e))}},[]),b=e?e.enabled??!0:!1,C=b&&!!e&&!e.active;(0,M.useEffect)(()=>{v()},[v]),(0,M.useEffect)(()=>{let e=setInterval(()=>{document.visibilityState===`visible`&&v()},C?me:pe);return()=>clearInterval(e)},[C,v]),(0,M.useEffect)(()=>{let e=()=>{v(),g.refreshStatus()};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[v,g.refreshStatus]);let w=async e=>{o(!0),t(t=>t&&{...t,enabled:e});try{await x.setEnabled(e),await v()}catch(n){t(t=>t&&{...t,enabled:!e}),p.error(e?`Could not turn the public link on`:`Could not turn the public link off`,{description:$(n)})}finally{o(!1)}},T=async()=>{d(!1),h(!0);try{await E.disable(),p.success(`Switched to a temporary address`),await Promise.all([g.refreshStatus(),v()])}catch(e){p.error(`Could not switch to a temporary address`,{description:$(e)})}finally{h(!1)}};if(!e)return(0,z.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n?`Could not read the public link's state: ${n}`:`Reading the public link's state…`});let A=g.status,j=A?.authEnabled??!0,N=A?.mode??`quick`,P=N===`named`?A?.hostname??null:null,F=!!P&&window.location.hostname===P,I=g.step.k!==`hidden`&&g.step.k!==`ask-domain`,L=N===`named`&&A?.liveMode===`quick`;return(0,z.jsxs)(`div`,{className:`space-y-6`,"data-testid":`public-link-pane`,children:[(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:`Open PPM from anywhere through a public https link, served by Cloudflare. Anyone who has the link reaches PPM's sign-in page, so keep the password on. For a link only your own devices can open, use Tailscale instead.`}),(0,z.jsxs)(`section`,{className:`space-y-4 rounded-lg border border-border p-4`,"data-testid":`public-link-switch-card`,children:[(0,z.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,z.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,z.jsx)(S,{htmlFor:`public-link-switch`,className:`text-sm font-medium`,children:`Public link`}),(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,"data-testid":`public-link-status`,children:b?C?`On. Waiting for Cloudflare to hand out the link…`:`On. Anyone with the link reaches PPM's sign-in page.`:`Off.`})]}),(0,z.jsxs)(`div`,{className:`flex min-h-11 shrink-0 items-center gap-2`,children:[(a||C)&&(0,z.jsx)(f,{className:`size-4 animate-spin text-muted-foreground`}),(0,z.jsx)(ee,{id:`public-link-switch`,checked:b,disabled:a||!b&&!j,onCheckedChange:t=>{!t&&he(e.url)?c(!0):w(t)}})]})]}),b&&e.url&&(0,z.jsx)(de,{url:e.url,qrHint:`Scan to open PPM on a phone`}),!j&&(0,z.jsxs)(Q,{icon:(0,z.jsx)(i,{className:`size-4`}),children:[(0,z.jsx)(`p`,{children:b?`PPM's password is off while the link is on: anyone who has the link can open PPM. Turn the password on, or the link off.`:`PPM's password is off. Turn it on first: anyone with the link could otherwise open PPM.`}),(0,z.jsx)(y,{variant:`outline`,onClick:()=>_(`general`),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Open General`})]})]}),(0,z.jsxs)(`section`,{className:`space-y-3`,"data-testid":`public-link-address`,children:[(0,z.jsx)(`h3`,{className:`text-sm font-medium`,children:`Address`}),I?(0,z.jsx)(`div`,{className:`rounded-lg border border-border p-4`,children:(0,z.jsx)(O,{step:g.step,t:g})}):(0,z.jsxs)(`div`,{className:`divide-y divide-border rounded-lg border border-border`,children:[(0,z.jsx)(_e,{title:`Temporary address`,inUse:N===`quick`,description:`A random trycloudflare.com address. It changes every time PPM restarts.`,action:N===`named`&&(0,z.jsx)(y,{variant:`outline`,onClick:()=>d(!0),disabled:m||F,className:`min-h-11 cursor-pointer md:min-h-9`,children:m?(0,z.jsx)(f,{className:`size-4 animate-spin`}):`Switch`})}),(0,z.jsx)(_e,{title:`Your own domain`,inUse:N===`named`,description:P?(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(`span`,{className:`break-all font-medium text-foreground`,children:[`https://`,P]}),`. It stays the same after a restart.`]}):`One fixed address on a domain you have on Cloudflare, like ppm.example.com.`,action:N===`quick`&&j&&(0,z.jsx)(y,{onClick:g.answerYes,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Set up`})})]}),!I&&N===`quick`&&!j&&(0,z.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Turn on PPM's password to use your own domain.`}),!I&&F&&(0,z.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`This page is open through your domain, so switching would cut it off before the new address could show. Open PPM another way first (Tailscale, or on this machine), then switch.`}),(L||A?.tunnelWarning)&&(0,z.jsxs)(Q,{icon:(0,z.jsx)(l,{className:`size-4 text-warning`}),children:[L&&(0,z.jsx)(`p`,{children:`PPM could not use your domain and is on a temporary address for now.`}),A?.tunnelWarning&&(0,z.jsx)(`p`,{children:A.tunnelWarning})]})]}),(0,z.jsx)(k,{open:s,title:`Turn off the link you are using?`,onClose:()=>c(!1),children:(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`This page is open at `,e.url,`. Turning the link off disconnects it; reach PPM another way to turn it back on.`]}),(0,z.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,z.jsx)(y,{variant:`outline`,onClick:()=>c(!1),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`}),(0,z.jsx)(y,{variant:`destructive`,onClick:()=>{c(!1),w(!1)},className:`min-h-11 cursor-pointer md:min-h-9`,children:`Turn off`})]})]})}),(0,z.jsx)(k,{open:u,title:`Switch to a temporary address?`,onClose:()=>d(!1),children:(0,z.jsxs)(`div`,{className:`space-y-4`,children:[(0,z.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`PPM stops answering at https://`,P,` and gets a new random address instead. Links that use your domain stop working until you set it up again.`]}),(0,z.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,z.jsx)(y,{variant:`outline`,onClick:()=>d(!1),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`}),(0,z.jsx)(y,{variant:`destructive`,onClick:()=>void T(),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Switch`})]})]})})]})}function _e({title:e,description:t,inUse:n,action:r}){return(0,z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 p-3`,"data-in-use":n||void 0,children:[(0,z.jsxs)(`div`,{className:`min-w-0 flex-[1_1_14rem] space-y-0.5`,children:[(0,z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,z.jsx)(`span`,{className:`text-sm font-medium`,children:e}),n&&(0,z.jsx)(`span`,{className:`rounded bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-primary`,children:`In use`})]}),(0,z.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:t})]}),r&&(0,z.jsx)(`div`,{className:`shrink-0`,children:r})]})}function ve(){let e=b(e=>e.tab),t=b(e=>e.setTab);return(0,z.jsxs)(`div`,{className:`space-y-5`,"data-testid":`remote-access`,"data-tab":e,children:[(0,z.jsx)(`div`,{role:`tablist`,"aria-label":`Remote access`,className:`flex gap-1 overflow-x-auto border-b border-border/50`,children:T.map(n=>(0,z.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":e===n.id,"data-testid":`remote-access-tab-${n.id}`,onClick:()=>t(n.id),className:g(`flex min-h-11 shrink-0 cursor-pointer items-center whitespace-nowrap rounded-t px-3 text-sm transition-colors md:min-h-9 md:text-xs`,e===n.id?`border-b-2 border-primary font-medium text-primary`:`text-text-subtle hover:text-text-secondary`),children:n.label},n.id))}),(0,z.jsxs)(`div`,{role:`tabpanel`,children:[e===`tailscale`&&(0,z.jsx)(ue,{}),e===`public-link`&&(0,z.jsx)(ge,{})]})]})}export{ve as RemoteAccessSettingsSection};
|
|
Binary file
|
|
Binary file
|