@hienlh/ppm 0.23.5 → 0.23.7
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 +89 -0
- package/CLAUDE.md +21 -1
- package/Dockerfile.test +8 -1
- 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 +30 -1
- package/dist/web/assets/accounts-settings-section-BYWnY9hH.js +1 -0
- package/dist/web/assets/accounts-settings-section-BYWnY9hH.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-BYWnY9hH.js.gz +0 -0
- package/dist/web/assets/{ai-resource-editor-DKcsVDle.js → ai-resource-editor-CY4n_Ccv.js} +1 -1
- package/dist/web/assets/ai-resource-editor-CY4n_Ccv.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-CY4n_Ccv.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-Bs3iUW4j.js +1 -0
- package/dist/web/assets/ai-settings-section-Bs3iUW4j.js.br +0 -0
- package/dist/web/assets/ai-settings-section-Bs3iUW4j.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-DDs11XV4.js +1 -0
- package/dist/web/assets/api-client-CJPnCOG-.js +1 -0
- package/dist/web/assets/{api-client-c8YOpTlT.js → api-client-D-SMbdiH.js} +1 -1
- package/dist/web/assets/api-client-D-SMbdiH.js.br +0 -0
- package/dist/web/assets/api-client-D-SMbdiH.js.gz +0 -0
- package/dist/web/assets/api-settings-BDkkhFMq.js +1 -0
- package/dist/web/assets/{api-settings-BmvNoCbn.js → api-settings-Bv9mLCty.js} +1 -1
- package/dist/web/assets/api-settings-Bv9mLCty.js.br +0 -0
- package/dist/web/assets/api-settings-Bv9mLCty.js.gz +0 -0
- package/dist/web/assets/{api-themes-6fOQJgM9.js → api-themes-3wW-zLzU.js} +1 -1
- package/dist/web/assets/appearance-settings-section-C0BoIBmz.js +1 -0
- package/dist/web/assets/appearance-settings-section-C0BoIBmz.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-C0BoIBmz.js.gz +0 -0
- package/dist/web/assets/apps-panel-DXAFsveZ.js +1 -0
- package/dist/web/assets/apps-panel-DXAFsveZ.js.br +0 -0
- package/dist/web/assets/apps-panel-DXAFsveZ.js.gz +0 -0
- package/dist/web/assets/{audio-preview-vaG2cB-k.js → audio-preview-BfES4Cx5.js} +1 -1
- package/dist/web/assets/audio-preview-BfES4Cx5.js.br +0 -0
- package/dist/web/assets/audio-preview-BfES4Cx5.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-CA8hPSX9.js +1 -0
- package/dist/web/assets/branch-review-tab-CA8hPSX9.js.br +0 -0
- package/dist/web/assets/branch-review-tab-CA8hPSX9.js.gz +0 -0
- package/dist/web/assets/{button-Ci9EUgqd.js → button-DeAyLH9U.js} +1 -1
- package/dist/web/assets/button-DeAyLH9U.js.br +0 -0
- package/dist/web/assets/button-DeAyLH9U.js.gz +0 -0
- package/dist/web/assets/{chat-preparation-cache-BSIQGiWx.js → chat-preparation-cache-CcCd2g7A.js} +1 -1
- package/dist/web/assets/chat-preparation-cache-CcCd2g7A.js.br +0 -0
- package/dist/web/assets/chat-preparation-cache-CcCd2g7A.js.gz +0 -0
- package/dist/web/assets/chat-tab-BWi_bUzA.js +1 -0
- package/dist/web/assets/chat-tab-BWi_bUzA.js.br +0 -0
- package/dist/web/assets/chat-tab-BWi_bUzA.js.gz +0 -0
- package/dist/web/assets/chat-tab-BvJhIaVE.js +15 -0
- package/dist/web/assets/chat-tab-BvJhIaVE.js.br +0 -0
- package/dist/web/assets/chat-tab-BvJhIaVE.js.gz +0 -0
- package/dist/web/assets/code-editor-OJUdLVnn.js +7 -0
- package/dist/web/assets/code-editor-OJUdLVnn.js.br +0 -0
- package/dist/web/assets/code-editor-OJUdLVnn.js.gz +0 -0
- package/dist/web/assets/codex-reset-credit-button-Dgxy_VNp.js +1 -0
- package/dist/web/assets/codex-reset-credit-button-Dgxy_VNp.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-Dgxy_VNp.js.gz +0 -0
- package/dist/web/assets/{conflict-editor-qMGJH0Bx.js → conflict-editor-BpKW_vbL.js} +1 -1
- package/dist/web/assets/conflict-editor-BpKW_vbL.js.br +0 -0
- package/dist/web/assets/conflict-editor-BpKW_vbL.js.gz +0 -0
- package/dist/web/assets/context-menu-7OX80HDB.js +1 -0
- package/dist/web/assets/context-menu-7OX80HDB.js.br +0 -0
- package/dist/web/assets/context-menu-7OX80HDB.js.gz +0 -0
- package/dist/web/assets/{csv-preview-D2I742dl.js → csv-preview-COYdTABa.js} +1 -1
- package/dist/web/assets/csv-preview-COYdTABa.js.br +0 -0
- package/dist/web/assets/csv-preview-COYdTABa.js.gz +0 -0
- package/dist/web/assets/{data-grid-overlay-editor-CQRVKr7y.js → data-grid-overlay-editor-CeZoduke.js} +1 -1
- package/dist/web/assets/data-grid-overlay-editor-CeZoduke.js.br +0 -0
- package/dist/web/assets/data-grid-overlay-editor-CeZoduke.js.gz +0 -0
- package/dist/web/assets/{database-viewer-Bz4LjgIa.js → database-viewer-BQcBqCKm.js} +1 -1
- package/dist/web/assets/database-viewer-BQcBqCKm.js.br +0 -0
- package/dist/web/assets/database-viewer-BQcBqCKm.js.gz +0 -0
- package/dist/web/assets/{design-export-client-ChMcMoqW.js → design-export-client-OrnGCSwu.js} +1 -1
- package/dist/web/assets/design-export-client-OrnGCSwu.js.br +0 -0
- package/dist/web/assets/design-export-client-OrnGCSwu.js.gz +0 -0
- package/dist/web/assets/{design-responsive-dialog-DNBhJJLf.js → design-responsive-dialog-vJjQrC4n.js} +1 -1
- package/dist/web/assets/design-responsive-dialog-vJjQrC4n.js.br +0 -0
- package/dist/web/assets/design-responsive-dialog-vJjQrC4n.js.gz +0 -0
- package/dist/web/assets/design-tab-BbmFk38H.js +33 -0
- package/dist/web/assets/design-tab-BbmFk38H.js.br +0 -0
- package/dist/web/assets/design-tab-BbmFk38H.js.gz +0 -0
- package/dist/web/assets/{designs-sidebar-panel-CapP1yXq.js → designs-sidebar-panel-D2kXwB8B.js} +1 -1
- package/dist/web/assets/designs-sidebar-panel-D2kXwB8B.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-D2kXwB8B.js.gz +0 -0
- package/dist/web/assets/dialog-Bocc0Fgb.js +1 -0
- package/dist/web/assets/dialog-Bocc0Fgb.js.br +0 -0
- package/dist/web/assets/dialog-Bocc0Fgb.js.gz +0 -0
- package/dist/web/assets/{diff-viewer-CdXi7cZN.js → diff-viewer-Bj4DT6Mj.js} +1 -1
- package/dist/web/assets/diff-viewer-Bj4DT6Mj.js.br +0 -0
- package/dist/web/assets/diff-viewer-Bj4DT6Mj.js.gz +0 -0
- package/dist/web/assets/{docx-preview-C9XdKEj1.js → docx-preview-C2QqNGRE.js} +1 -1
- package/dist/web/assets/docx-preview-C2QqNGRE.js.br +0 -0
- package/dist/web/assets/docx-preview-C2QqNGRE.js.gz +0 -0
- package/dist/web/assets/editor-language-service-COqB2tuv.js +1 -0
- package/dist/web/assets/editor-language-service-COqB2tuv.js.br +3 -0
- package/dist/web/assets/editor-language-service-COqB2tuv.js.gz +0 -0
- package/dist/web/assets/explorer-body-DGrYajDN.js +2 -0
- package/dist/web/assets/explorer-body-DGrYajDN.js.br +0 -0
- package/dist/web/assets/explorer-body-DGrYajDN.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-DLzkODTP.js +1 -0
- package/dist/web/assets/explorer-window-content-DLzkODTP.js.br +0 -0
- package/dist/web/assets/explorer-window-content-DLzkODTP.js.gz +0 -0
- package/dist/web/assets/{extension-manager-section-B2nZzJ2b.js → extension-manager-section-Bu0qcB2i.js} +1 -1
- package/dist/web/assets/extension-manager-section-Bu0qcB2i.js.br +0 -0
- package/dist/web/assets/extension-manager-section-Bu0qcB2i.js.gz +0 -0
- package/dist/web/assets/{extension-webview-BGoDxkdF.js → extension-webview-G_WJ0N52.js} +1 -1
- package/dist/web/assets/extension-webview-G_WJ0N52.js.br +0 -0
- package/dist/web/assets/extension-webview-G_WJ0N52.js.gz +0 -0
- package/dist/web/assets/{file-icons-gx_FBOXY.js → file-icons-l7fNOmdS.js} +1 -1
- package/dist/web/assets/file-icons-l7fNOmdS.js.br +0 -0
- package/dist/web/assets/file-icons-l7fNOmdS.js.gz +0 -0
- package/dist/web/assets/{file-store-D9KE0kQC.js → file-store-B0e7sLag.js} +1 -1
- package/dist/web/assets/file-store-B0e7sLag.js.br +0 -0
- package/dist/web/assets/file-store-B0e7sLag.js.gz +0 -0
- package/dist/web/assets/{files-settings-section-DC3OzzOl.js → files-settings-section-ChZ_CynX.js} +1 -1
- package/dist/web/assets/files-settings-section-ChZ_CynX.js.br +0 -0
- package/dist/web/assets/files-settings-section-ChZ_CynX.js.gz +0 -0
- package/dist/web/assets/format-bytes-__396eCN.js +1 -0
- package/dist/web/assets/{format-file-meta-mQwA6SuY.js → format-file-meta-o1XBuoKS.js} +1 -1
- package/dist/web/assets/format-file-meta-o1XBuoKS.js.br +0 -0
- package/dist/web/assets/format-file-meta-o1XBuoKS.js.gz +0 -0
- package/dist/web/assets/{fs-api-DL36slbd.js → fs-api-CeHKwx95.js} +1 -1
- package/dist/web/assets/fs-api-CeHKwx95.js.br +0 -0
- package/dist/web/assets/fs-api-CeHKwx95.js.gz +0 -0
- package/dist/web/assets/{general-settings-section-i41W43ER.js → general-settings-section-MSvDEbFa.js} +1 -1
- package/dist/web/assets/general-settings-section-MSvDEbFa.js.br +0 -0
- package/dist/web/assets/general-settings-section-MSvDEbFa.js.gz +0 -0
- package/dist/web/assets/{git-log-panel-DHzPIkJg.js → git-log-panel-gw5_a6j3.js} +1 -1
- package/dist/web/assets/git-log-panel-gw5_a6j3.js.br +0 -0
- package/dist/web/assets/git-log-panel-gw5_a6j3.js.gz +0 -0
- package/dist/web/assets/{git-repo-store-DSypNj19.js → git-repo-store-BpPnah5l.js} +1 -1
- package/dist/web/assets/git-repo-store-BpPnah5l.js.br +0 -0
- package/dist/web/assets/git-repo-store-BpPnah5l.js.gz +0 -0
- package/dist/web/assets/{glide-data-grid-Dj4vrDvj.js → glide-data-grid-Db2Cl26B.js} +5 -5
- package/dist/web/assets/glide-data-grid-Db2Cl26B.js.br +0 -0
- package/dist/web/assets/glide-data-grid-Db2Cl26B.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-B4etmYTR.js +1 -0
- package/dist/web/assets/group-chat-tab-B4etmYTR.js.br +0 -0
- package/dist/web/assets/group-chat-tab-B4etmYTR.js.gz +0 -0
- package/dist/web/assets/{image-preview-CGdZrmLo.js → image-preview-CjNhpfWw.js} +1 -1
- package/dist/web/assets/index-CtAvmybi.js +52 -0
- package/dist/web/assets/index-CtAvmybi.js.br +0 -0
- package/dist/web/assets/index-CtAvmybi.js.gz +0 -0
- package/dist/web/assets/index-DeCJasyy.css +1 -0
- package/dist/web/assets/index-DeCJasyy.css.br +0 -0
- package/dist/web/assets/index-DeCJasyy.css.gz +0 -0
- package/dist/web/assets/{jira-watcher-section-BJ9edGEP.js → jira-watcher-section-CKSI1Alo.js} +1 -1
- package/dist/web/assets/keybindings-store-C4_yyU4u.js +1 -0
- package/dist/web/assets/{keyboard-shortcuts-section-CxdGSNGr.js → keyboard-shortcuts-section-CEaVUc9a.js} +1 -1
- package/dist/web/assets/keyboard-shortcuts-section-CEaVUc9a.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-CEaVUc9a.js.gz +0 -0
- package/dist/web/assets/language-servers-section-ePtEpnDc.js +2 -0
- package/dist/web/assets/language-servers-section-ePtEpnDc.js.br +0 -0
- package/dist/web/assets/language-servers-section-ePtEpnDc.js.gz +0 -0
- package/dist/web/assets/lsp-client-XzmR3Brr.js +1 -0
- package/dist/web/assets/lsp-client-XzmR3Brr.js.br +0 -0
- package/dist/web/assets/lsp-client-XzmR3Brr.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-CTtDap-l.js +1 -0
- package/dist/web/assets/{markdown-renderer-ok96IgnS.js → markdown-renderer-D05fAr57.js} +2 -2
- package/dist/web/assets/markdown-renderer-D05fAr57.js.br +0 -0
- package/dist/web/assets/markdown-renderer-D05fAr57.js.gz +0 -0
- package/dist/web/assets/{media-url-CzUJrREv.js → media-url-C6NumuN5.js} +1 -1
- package/dist/web/assets/metric-chart-canvas-DHJe0VER.js +1 -0
- package/dist/web/assets/metric-chart-canvas-DHJe0VER.js.br +0 -0
- package/dist/web/assets/metric-chart-canvas-DHJe0VER.js.gz +0 -0
- package/dist/web/assets/{mobile-bottom-sheet-CuNi2FRv.js → mobile-bottom-sheet-D4UyOatB.js} +1 -1
- package/dist/web/assets/mobile-bottom-sheet-D4UyOatB.js.br +0 -0
- package/dist/web/assets/mobile-bottom-sheet-D4UyOatB.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-CcfGdGL8.js +1 -0
- package/dist/web/assets/mobile-explorer-sheet-CcfGdGL8.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-CcfGdGL8.js.gz +0 -0
- package/dist/web/assets/{new-design-dialog-Drkjb_LI.js → new-design-dialog-BgmQopJM.js} +1 -1
- package/dist/web/assets/new-design-dialog-BgmQopJM.js.br +0 -0
- package/dist/web/assets/new-design-dialog-BgmQopJM.js.gz +0 -0
- package/dist/web/assets/notification-store-q5QBklKA.js +1 -0
- package/dist/web/assets/{notifications-settings-section-C05WYqcE.js → notifications-settings-section-BBJ0r9OS.js} +1 -1
- package/dist/web/assets/notifications-settings-section-BBJ0r9OS.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-BBJ0r9OS.js.gz +0 -0
- package/dist/web/assets/{onboarding-entry-CmUqv1kl.js → onboarding-entry-BYOYswsi.js} +1 -1
- package/dist/web/assets/onboarding-entry-BYOYswsi.js.br +0 -0
- package/dist/web/assets/onboarding-entry-BYOYswsi.js.gz +0 -0
- package/dist/web/assets/{onboarding-quick-orientation-DIhWv1CN.js → onboarding-quick-orientation-DPHYFMbA.js} +1 -1
- package/dist/web/assets/onboarding-quick-orientation-DPHYFMbA.js.br +0 -0
- package/dist/web/assets/onboarding-quick-orientation-DPHYFMbA.js.gz +0 -0
- package/dist/web/assets/overview-panel-pkPs44Tv.js +1 -0
- package/dist/web/assets/overview-panel-pkPs44Tv.js.br +0 -0
- package/dist/web/assets/overview-panel-pkPs44Tv.js.gz +0 -0
- package/dist/web/assets/{pdf-preview-qdXmMkOR.js → pdf-preview-c-L_kDAs.js} +1 -1
- package/dist/web/assets/pdf-preview-c-L_kDAs.js.br +0 -0
- package/dist/web/assets/pdf-preview-c-L_kDAs.js.gz +0 -0
- package/dist/web/assets/performance-panel-yPrq0DJV.js +3 -0
- package/dist/web/assets/performance-panel-yPrq0DJV.js.br +0 -0
- package/dist/web/assets/performance-panel-yPrq0DJV.js.gz +0 -0
- package/dist/web/assets/{postgres-viewer-Xvlun_n5.js → postgres-viewer-CnwDCMNd.js} +1 -1
- package/dist/web/assets/postgres-viewer-CnwDCMNd.js.br +0 -0
- package/dist/web/assets/postgres-viewer-CnwDCMNd.js.gz +0 -0
- package/dist/web/assets/{ppmbot-settings-section-C8PFlvaq.js → ppmbot-settings-section-BDXoSIDp.js} +1 -1
- package/dist/web/assets/ppmbot-settings-section-BDXoSIDp.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-BDXoSIDp.js.gz +0 -0
- package/dist/web/assets/{pptx-export-CG6MRNok.js → pptx-export-D0RDY48h.js} +4 -4
- package/dist/web/assets/pptx-export-D0RDY48h.js.br +0 -0
- package/dist/web/assets/pptx-export-D0RDY48h.js.gz +0 -0
- package/dist/web/assets/{problems-panel-CFYO0Ro3.js → problems-panel-BgY8oyo9.js} +1 -1
- package/dist/web/assets/problems-panel-BgY8oyo9.js.br +0 -0
- package/dist/web/assets/problems-panel-BgY8oyo9.js.gz +0 -0
- package/dist/web/assets/process-row-format-CaaMcHzn.js +1 -0
- package/dist/web/assets/process-table-BOwDtXuG.js +1 -0
- package/dist/web/assets/process-table-BOwDtXuG.js.br +0 -0
- package/dist/web/assets/process-table-BOwDtXuG.js.gz +0 -0
- package/dist/web/assets/{project-framework-store-XxFXcUpb.js → project-framework-store-UDEMu28U.js} +1 -1
- package/dist/web/assets/{project-store-C5gJXkvb.js → project-store-DGa31y5B.js} +1 -1
- package/dist/web/assets/project-store-DGa31y5B.js.br +0 -0
- package/dist/web/assets/project-store-DGa31y5B.js.gz +0 -0
- package/dist/web/assets/{proxy-settings-section-BcHIEANE.js → proxy-settings-section-Db6Kc6xG.js} +1 -1
- package/dist/web/assets/proxy-settings-section-Db6Kc6xG.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-Db6Kc6xG.js.gz +0 -0
- package/dist/web/assets/{query-audit-section-UKG_smyt.js → query-audit-section-C0PAXhfT.js} +1 -1
- package/dist/web/assets/query-audit-section-C0PAXhfT.js.br +0 -0
- package/dist/web/assets/query-audit-section-C0PAXhfT.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-clipboard-notice-BGsp0edA.js → remote-desktop-clipboard-notice-DOVtobj_.js} +1 -1
- package/dist/web/assets/remote-desktop-clipboard-notice-DOVtobj_.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-DOVtobj_.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-DXlU3msM.js +2 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-DXlU3msM.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-DXlU3msM.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-ClV4YTLU.js +1 -0
- package/dist/web/assets/remote-desktop-mobile-view-ClV4YTLU.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-ClV4YTLU.js.gz +0 -0
- package/dist/web/assets/{remote-desktop-readiness-gate-CsZCCRJI.js → remote-desktop-readiness-gate-BsfoJzdc.js} +1 -1
- package/dist/web/assets/remote-desktop-readiness-gate-BsfoJzdc.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-BsfoJzdc.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-kDaXl1_Q.js +1 -0
- package/dist/web/assets/remote-desktop-window-content-kDaXl1_Q.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-kDaXl1_Q.js.gz +0 -0
- package/dist/web/assets/{schedules-settings-section-Ci0O2Ng6.js → schedules-settings-section-CvbjQM8z.js} +1 -1
- package/dist/web/assets/schedules-settings-section-CvbjQM8z.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-CvbjQM8z.js.gz +0 -0
- package/dist/web/assets/{scroll-area-XonvWYn_.js → scroll-area-sjOeAfoD.js} +1 -1
- package/dist/web/assets/scroll-area-sjOeAfoD.js.br +0 -0
- package/dist/web/assets/scroll-area-sjOeAfoD.js.gz +0 -0
- package/dist/web/assets/{separator-sQj04Ari.js → separator-9A3PCG1t.js} +1 -1
- package/dist/web/assets/services-panel-CimW47P8.js +1 -0
- package/dist/web/assets/services-panel-CimW47P8.js.br +0 -0
- package/dist/web/assets/services-panel-CimW47P8.js.gz +0 -0
- package/dist/web/assets/settings-body-BTXNtpWL.js +2 -0
- package/dist/web/assets/settings-body-BTXNtpWL.js.br +0 -0
- package/dist/web/assets/settings-body-BTXNtpWL.js.gz +0 -0
- package/dist/web/assets/settings-store-DvftLqzy.js +2 -0
- package/dist/web/assets/settings-store-DvftLqzy.js.br +0 -0
- package/dist/web/assets/settings-store-DvftLqzy.js.gz +0 -0
- package/dist/web/assets/settings-tab-CGhaRXjs.js +1 -0
- package/dist/web/assets/settings-window-content--Uyg_Psr.js +1 -0
- package/dist/web/assets/sortable-header-DUW9T1Hz.js +1 -0
- package/dist/web/assets/sortable-header-DUW9T1Hz.js.br +0 -0
- package/dist/web/assets/sortable-header-DUW9T1Hz.js.gz +0 -0
- package/dist/web/assets/{sql-query-editor-4iCGE4h2.js → sql-query-editor-Dn-cgDrW.js} +1 -1
- package/dist/web/assets/sql-query-editor-Dn-cgDrW.js.br +0 -0
- package/dist/web/assets/sql-query-editor-Dn-cgDrW.js.gz +0 -0
- package/dist/web/assets/{sqlite-viewer-CK6DulYk.js → sqlite-viewer-B0NfaMjq.js} +1 -1
- package/dist/web/assets/sqlite-viewer-B0NfaMjq.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-B0NfaMjq.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-CxCfRQFb.js +2 -0
- package/dist/web/assets/system-monitor-body-CxCfRQFb.js.br +0 -0
- package/dist/web/assets/system-monitor-body-CxCfRQFb.js.gz +0 -0
- package/dist/web/assets/system-monitor-tab-Cb3EZUdp.js +1 -0
- package/dist/web/assets/system-monitor-window-content-51CA-2PH.js +1 -0
- package/dist/web/assets/{tab-host-window-content-CWBaWKjA.js → tab-host-window-content-CSrcmKNG.js} +1 -1
- package/dist/web/assets/tab-host-window-content-CSrcmKNG.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-CSrcmKNG.js.gz +0 -0
- package/dist/web/assets/{team-member-sheet-Br6mrxrw.js → team-member-sheet-D4X6nh-x.js} +2 -2
- package/dist/web/assets/team-member-sheet-D4X6nh-x.js.br +0 -0
- package/dist/web/assets/team-member-sheet-D4X6nh-x.js.gz +0 -0
- package/dist/web/assets/{team-member-window-content-CwCy7ZWf.js → team-member-window-content-BxkbGVIL.js} +1 -1
- package/dist/web/assets/team-member-window-content-BxkbGVIL.js.br +0 -0
- package/dist/web/assets/team-member-window-content-BxkbGVIL.js.gz +0 -0
- package/dist/web/assets/{terminal-tab-BW14RpCb.js → terminal-tab-BYo34IqU.js} +3 -3
- package/dist/web/assets/terminal-tab-BYo34IqU.js.br +0 -0
- package/dist/web/assets/terminal-tab-BYo34IqU.js.gz +0 -0
- package/dist/web/assets/{tool-cards-CgOBEUnb.js → tool-cards-DvXjOped.js} +4 -4
- package/dist/web/assets/tool-cards-DvXjOped.js.br +0 -0
- package/dist/web/assets/tool-cards-DvXjOped.js.gz +0 -0
- package/dist/web/assets/{use-blob-url-CmavyEP8.js → use-blob-url-CISBWKG5.js} +1 -1
- package/dist/web/assets/use-inline-blame-Br6mheS4.js +16 -0
- package/dist/web/assets/use-inline-blame-Br6mheS4.js.br +0 -0
- package/dist/web/assets/use-inline-blame-Br6mheS4.js.gz +0 -0
- package/dist/web/assets/use-lsp-BpJmvQ0n.js +6 -0
- package/dist/web/assets/use-lsp-BpJmvQ0n.js.br +0 -0
- package/dist/web/assets/use-lsp-BpJmvQ0n.js.gz +0 -0
- package/dist/web/assets/{use-monaco-theme-rH6epJYA.js → use-monaco-theme-UGOzyIhv.js} +1 -1
- package/dist/web/assets/use-process-kill-CyiiUD1E.js +1 -0
- package/dist/web/assets/use-process-kill-CyiiUD1E.js.br +0 -0
- package/dist/web/assets/use-process-kill-CyiiUD1E.js.gz +0 -0
- package/dist/web/assets/{use-websocket-QwURkjpV.js → use-websocket-Dpl21cHG.js} +1 -1
- package/dist/web/assets/{vendor-ui-BHh12_0v.js → vendor-ui-P9Ym7hCv.js} +1 -1
- package/dist/web/assets/vendor-ui-P9Ym7hCv.js.br +0 -0
- package/dist/web/assets/vendor-ui-P9Ym7hCv.js.gz +0 -0
- package/dist/web/assets/video-preview-D6Jw-IZK.js +1 -0
- package/dist/web/assets/video-preview-D6Jw-IZK.js.br +0 -0
- package/dist/web/assets/video-preview-D6Jw-IZK.js.gz +0 -0
- package/dist/web/assets/voice-settings-section-CcHQDYzN.js +1 -0
- package/dist/web/assets/voice-settings-section-CcHQDYzN.js.br +0 -0
- package/dist/web/assets/voice-settings-section-CcHQDYzN.js.gz +0 -0
- package/dist/web/assets/ws-auth-CqI8-aoA.js +1 -0
- package/dist/web/index.html +20 -20
- 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/deployment-guide.md +23 -0
- package/package.json +1 -1
- package/release-from-worktree.sh +224 -0
- package/src/cli/commands/config-cmd.ts +12 -0
- package/src/providers/claude-agent-sdk.ts +65 -2
- package/src/providers/codex-app-server/codex-jsonrpc-client.ts +16 -1
- package/src/providers/codex-app-server/codex-provider.ts +39 -7
- package/src/providers/codex-app-server/codex-reset-credit.ts +49 -0
- package/src/providers/provider-probe.ts +63 -0
- package/src/providers/registry.ts +109 -29
- package/src/server/index.ts +9 -0
- package/src/server/middleware/auth.ts +5 -1
- package/src/server/routes/codex-accounts.ts +14 -0
- package/src/server/routes/cross-origin-guard.ts +20 -0
- package/src/server/routes/git.ts +40 -4
- package/src/server/routes/lsp.ts +97 -4
- package/src/server/routes/resources.ts +72 -9
- package/src/server/routes/settings.ts +19 -1
- package/src/server/routes/speech.ts +66 -0
- package/src/server/routes/system-services.ts +76 -0
- package/src/server/routes/tunnel.ts +33 -1
- package/src/server/ws/chat.ts +74 -3
- package/src/services/codex-account-login.ts +26 -2
- package/src/services/codex-reset-credit.service.ts +83 -0
- package/src/services/compaction-savings.ts +127 -0
- package/src/services/db.service.ts +123 -8
- package/src/services/edge-forwarder.ts +191 -191
- package/src/services/fs-ops/fs-ops-trash.service.ts +22 -9
- package/src/services/git-refs/for-each-ref.ts +118 -0
- package/src/services/git.service.ts +25 -2
- package/src/services/host-info/spawn-runner.ts +48 -4
- package/src/services/jsonl-transcript-parser.ts +7 -42
- package/src/services/lsp/lsp-install.ts +289 -0
- package/src/services/lsp/lsp-manager.ts +160 -29
- package/src/services/lsp/server-registry.ts +120 -4
- package/src/services/named-tunnel/named-tunnel-config.ts +8 -2
- package/src/services/named-tunnel/named-tunnel-setup.service.ts +4 -0
- package/src/services/read-lines.ts +54 -0
- package/src/services/speech-to-text/whisper-catalog.ts +142 -0
- package/src/services/speech-to-text/whisper-download.ts +113 -0
- package/src/services/speech-to-text/whisper-hallucinations.ts +51 -0
- package/src/services/speech-to-text/whisper-install.service.ts +247 -0
- package/src/services/speech-to-text/whisper-paths.ts +62 -0
- package/src/services/speech-to-text/whisper-transcribe.service.ts +117 -0
- package/src/services/supervisor.ts +94 -11
- package/src/services/system-metrics/cpu-details-linux.ts +252 -0
- package/src/services/system-metrics/cpu-memory-collector.ts +140 -18
- package/src/services/system-metrics/device-collector-linux.ts +31 -0
- package/src/services/system-metrics/device-collector-types.ts +40 -0
- package/src/services/system-metrics/disk-devices-linux.ts +156 -0
- package/src/services/system-metrics/disk-inventory-linux.ts +150 -0
- package/src/services/system-metrics/fans-linux.ts +51 -0
- package/src/services/system-metrics/gpu-api-versions.ts +120 -0
- package/src/services/system-metrics/gpu-devices-linux.ts +370 -0
- package/src/services/system-metrics/gpu-fdinfo-linux.ts +253 -0
- package/src/services/system-metrics/hardware-inventory.ts +50 -0
- package/src/services/system-metrics/linux-fs.ts +43 -0
- package/src/services/system-metrics/memory-darwin.ts +91 -0
- package/src/services/system-metrics/memory-linux.ts +156 -0
- package/src/services/system-metrics/net-devices-linux.ts +114 -0
- package/src/services/system-metrics/net-inventory-linux.ts +100 -0
- package/src/services/system-metrics/partitions-linux.ts +158 -0
- package/src/services/system-metrics/process-collector-linux.ts +58 -6
- package/src/services/system-metrics/process-collector-types.ts +8 -1
- package/src/services/system-metrics/process-details-darwin.ts +166 -0
- package/src/services/system-metrics/process-details-linux.ts +150 -0
- package/src/services/system-metrics/process-grouping.ts +2 -1
- package/src/services/system-metrics/process-rows-builder.ts +2 -0
- package/src/services/system-metrics/process-swap-linux.ts +37 -0
- package/src/services/system-metrics/signal-executor.ts +84 -0
- package/src/services/system-metrics/signal-request-handler.ts +92 -0
- package/src/services/system-metrics/system-metrics-platform.ts +30 -4
- package/src/services/system-metrics/system-metrics-tick.ts +73 -4
- package/src/services/system-metrics/system-metrics.service.ts +87 -2
- package/src/services/system-metrics/udev-db.ts +40 -0
- package/src/services/system-services/app-cgroup-linux.ts +115 -0
- package/src/services/system-services/app-icon-service.ts +31 -0
- package/src/services/system-services/app-icons-linux.ts +124 -0
- package/src/services/system-services/apps-linux.ts +174 -0
- package/src/services/system-services/desktop-entry.ts +103 -0
- package/src/services/system-services/service-guard.ts +124 -0
- package/src/services/system-services/systemd-collector.ts +203 -0
- package/src/services/system-services/systemd-parse.ts +162 -0
- package/src/services/windows-process-tree.ts +351 -351
- package/src/shared/prompt-cache-idle.ts +197 -0
- package/src/shared/turn-usage.ts +85 -1
- package/src/shared/usage-extra.ts +19 -0
- package/src/types/chat.ts +29 -0
- package/src/types/config.ts +14 -0
- package/src/types/git.ts +41 -0
- package/src/types/system-hardware.ts +137 -0
- package/src/types/system-metrics.ts +231 -2
- package/src/types/system-services.ts +73 -0
- package/src/web/components/branch-review/branch-review-tab.tsx +20 -20
- package/src/web/components/branch-review/branch-review-tree-row.tsx +1 -13
- package/src/web/components/chat/chat-tab.tsx +3 -0
- package/src/web/components/chat/codex-usage-panel.tsx +4 -0
- package/src/web/components/chat/compaction-divider.tsx +48 -0
- package/src/web/components/chat/idle-cache-notice.tsx +67 -0
- package/src/web/components/chat/message-input.tsx +48 -13
- package/src/web/components/chat/message-list.tsx +15 -0
- package/src/web/components/chat/prompt-cache-chip.tsx +74 -0
- package/src/web/components/editor/code-editor.tsx +1 -0
- package/src/web/components/editor/editor-language-service.tsx +11 -3
- package/src/web/components/editor/lsp-status.tsx +115 -13
- package/src/web/components/git/branch-picker.tsx +419 -0
- package/src/web/components/git/branch-select.tsx +34 -0
- package/src/web/components/git/create-worktree-dialog.tsx +17 -16
- package/src/web/components/git/git-repo-picker.tsx +28 -40
- package/src/web/components/layout/status-bar.tsx +42 -19
- package/src/web/components/settings/accounts/account-card.tsx +10 -2
- package/src/web/components/settings/accounts/account-usage-extras.tsx +3 -2
- package/src/web/components/settings/accounts/codex-accounts-section.tsx +3 -1
- package/src/web/components/settings/accounts/codex-reset-credit-button.tsx +120 -0
- package/src/web/components/settings/ai-settings-section.tsx +67 -3
- package/src/web/components/settings/appearance-settings-section.tsx +2 -28
- package/src/web/components/settings/language-servers-section.tsx +362 -0
- package/src/web/components/settings/settings-categories.ts +8 -3
- package/src/web/components/settings/settings-section-content.tsx +2 -0
- package/src/web/components/settings/voice-settings-section.tsx +283 -0
- package/src/web/components/system/apps/app-row.tsx +110 -0
- package/src/web/components/system/apps/app-rows.ts +140 -0
- package/src/web/components/system/apps/apps-panel.tsx +129 -0
- package/src/web/components/system/metric-chart-canvas.tsx +79 -3
- package/src/web/components/system/overview-cards/card-shell.tsx +54 -0
- package/src/web/components/system/overview-cards/cpu-card.tsx +11 -6
- package/src/web/components/system/overview-cards/disk-card.tsx +11 -6
- package/src/web/components/system/overview-cards/gpu-card.tsx +16 -6
- package/src/web/components/system/overview-cards/mem-card.tsx +11 -6
- package/src/web/components/system/overview-cards/net-card.tsx +11 -6
- package/src/web/components/system/overview-device-target.ts +69 -0
- package/src/web/components/system/overview-panel.tsx +15 -1
- package/src/web/components/system/performance/cpu-core-grid.tsx +74 -0
- package/src/web/components/system/performance/cpu-detail.tsx +220 -0
- package/src/web/components/system/performance/detail-parts.tsx +149 -0
- package/src/web/components/system/performance/device-list.ts +139 -0
- package/src/web/components/system/performance/disk-detail.tsx +64 -0
- package/src/web/components/system/performance/fans-detail.tsx +35 -0
- package/src/web/components/system/performance/gpu-detail.tsx +116 -0
- package/src/web/components/system/performance/memory-detail.tsx +109 -0
- package/src/web/components/system/performance/nic-detail.tsx +55 -0
- package/src/web/components/system/performance/partition-list.tsx +79 -0
- package/src/web/components/system/performance/performance-panel.tsx +206 -0
- package/src/web/components/system/performance/use-hardware-inventory.ts +48 -0
- package/src/web/components/system/process-columns-grid.ts +5 -3
- package/src/web/components/system/process-details-dialog.tsx +116 -0
- package/src/web/components/system/process-group-row.tsx +6 -1
- package/src/web/components/system/process-row-format.ts +6 -0
- package/src/web/components/system/process-row-menu.tsx +72 -0
- package/src/web/components/system/process-row.tsx +7 -1
- package/src/web/components/system/process-table-model.ts +1 -1
- package/src/web/components/system/process-table-sort.ts +8 -4
- package/src/web/components/system/process-table-toolbar.tsx +10 -2
- package/src/web/components/system/process-table-totals.ts +3 -0
- package/src/web/components/system/process-table.tsx +25 -2
- package/src/web/components/system/services/service-action-confirm.tsx +100 -0
- package/src/web/components/system/services/service-columns.ts +103 -0
- package/src/web/components/system/services/service-details-sheet.tsx +97 -0
- package/src/web/components/system/services/service-resources.ts +105 -0
- package/src/web/components/system/services/service-row.tsx +146 -0
- package/src/web/components/system/services/service-rows.ts +92 -0
- package/src/web/components/system/services/service-sort.ts +90 -0
- package/src/web/components/system/services/services-header.tsx +51 -0
- package/src/web/components/system/services/services-panel.tsx +207 -0
- package/src/web/components/system/services/use-services.ts +92 -0
- package/src/web/components/system/sortable-header.tsx +13 -8
- package/src/web/components/system/sysmon-preferences.tsx +85 -0
- package/src/web/components/system/system-monitor-body.tsx +101 -43
- package/src/web/components/system/system-monitor-window-content.tsx +2 -3
- package/src/web/components/system/use-process-signal.ts +87 -0
- package/src/web/components/tunnels/public-tunnel-switch.tsx +82 -0
- package/src/web/components/tunnels/tunnel-manager-tab.tsx +4 -0
- package/src/web/components/ui/dialog.tsx +14 -1
- package/src/web/components/ui/search-select.tsx +279 -0
- package/src/web/components/ui/start-ellipsis.tsx +18 -0
- package/src/web/hooks/use-chat.ts +28 -0
- package/src/web/hooks/use-global-keybindings.ts +7 -5
- package/src/web/hooks/use-lsp.ts +23 -2
- package/src/web/hooks/use-minute-clock.ts +20 -0
- package/src/web/hooks/use-whisper-voice-input.ts +113 -0
- package/src/web/lib/api-tunnels.ts +19 -0
- package/src/web/lib/branch-select-items.ts +29 -0
- package/src/web/lib/cpu-graph-mode.ts +90 -0
- package/src/web/lib/format-bytes.ts +14 -0
- package/src/web/lib/git-ref-picker.ts +120 -0
- package/src/web/lib/lsp/lsp-client.ts +32 -0
- package/src/web/lib/search-select-rows.ts +55 -0
- package/src/web/lib/temperature.ts +27 -0
- package/src/web/lib/voice-wav.ts +69 -0
- package/src/web/stores/git-status-store.ts +31 -17
- package/src/web/stores/keybindings-store.ts +14 -1
- package/src/web/stores/settings-store.ts +65 -0
- package/src/web/styles/globals.css +11 -0
- package/dist/web/assets/accounts-settings-section-CgG5P3Jm.js +0 -1
- package/dist/web/assets/accounts-settings-section-CgG5P3Jm.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-CgG5P3Jm.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-DKcsVDle.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-DKcsVDle.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-D7zJ-hCO.js +0 -1
- package/dist/web/assets/ai-settings-section-D7zJ-hCO.js.br +0 -0
- package/dist/web/assets/ai-settings-section-D7zJ-hCO.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-OPqC2bYG.js +0 -1
- package/dist/web/assets/api-client-BgedDTvo.js +0 -1
- package/dist/web/assets/api-client-c8YOpTlT.js.br +0 -0
- package/dist/web/assets/api-client-c8YOpTlT.js.gz +0 -0
- package/dist/web/assets/api-settings-BmvNoCbn.js.br +0 -0
- package/dist/web/assets/api-settings-BmvNoCbn.js.gz +0 -0
- package/dist/web/assets/api-settings-Bti1-Zn3.js +0 -1
- package/dist/web/assets/appearance-settings-section-DL466x83.js +0 -1
- package/dist/web/assets/appearance-settings-section-DL466x83.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-DL466x83.js.gz +0 -0
- package/dist/web/assets/audio-preview-vaG2cB-k.js.br +0 -0
- package/dist/web/assets/audio-preview-vaG2cB-k.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-Dag86n_R.js +0 -1
- package/dist/web/assets/branch-review-tab-Dag86n_R.js.br +0 -0
- package/dist/web/assets/branch-review-tab-Dag86n_R.js.gz +0 -0
- package/dist/web/assets/button-Ci9EUgqd.js.br +0 -0
- package/dist/web/assets/button-Ci9EUgqd.js.gz +0 -0
- package/dist/web/assets/chat-preparation-cache-BSIQGiWx.js.br +0 -0
- package/dist/web/assets/chat-preparation-cache-BSIQGiWx.js.gz +0 -0
- package/dist/web/assets/chat-tab-CcYZLXls.js +0 -15
- package/dist/web/assets/chat-tab-CcYZLXls.js.br +0 -0
- package/dist/web/assets/chat-tab-CcYZLXls.js.gz +0 -0
- package/dist/web/assets/chat-tab-QFDhzzBZ.js +0 -1
- package/dist/web/assets/chat-tab-QFDhzzBZ.js.br +0 -0
- package/dist/web/assets/chat-tab-QFDhzzBZ.js.gz +0 -0
- package/dist/web/assets/code-editor-K-IN8VwJ.js +0 -7
- package/dist/web/assets/code-editor-K-IN8VwJ.js.br +0 -0
- package/dist/web/assets/code-editor-K-IN8VwJ.js.gz +0 -0
- package/dist/web/assets/codex-sign-in-again-dialog-C8JvblLG.js +0 -1
- package/dist/web/assets/codex-sign-in-again-dialog-C8JvblLG.js.br +0 -0
- package/dist/web/assets/codex-sign-in-again-dialog-C8JvblLG.js.gz +0 -0
- package/dist/web/assets/conflict-editor-qMGJH0Bx.js.br +0 -0
- package/dist/web/assets/conflict-editor-qMGJH0Bx.js.gz +0 -0
- package/dist/web/assets/context-menu-CjYTq8DI.js +0 -1
- package/dist/web/assets/context-menu-CjYTq8DI.js.br +0 -0
- package/dist/web/assets/context-menu-CjYTq8DI.js.gz +0 -0
- package/dist/web/assets/csv-preview-D2I742dl.js.br +0 -0
- package/dist/web/assets/csv-preview-D2I742dl.js.gz +0 -0
- package/dist/web/assets/data-grid-overlay-editor-CQRVKr7y.js.br +0 -0
- package/dist/web/assets/data-grid-overlay-editor-CQRVKr7y.js.gz +0 -0
- package/dist/web/assets/database-viewer-Bz4LjgIa.js.br +0 -0
- package/dist/web/assets/database-viewer-Bz4LjgIa.js.gz +0 -0
- package/dist/web/assets/design-export-client-ChMcMoqW.js.br +0 -0
- package/dist/web/assets/design-export-client-ChMcMoqW.js.gz +0 -0
- package/dist/web/assets/design-responsive-dialog-DNBhJJLf.js.br +0 -0
- package/dist/web/assets/design-responsive-dialog-DNBhJJLf.js.gz +0 -0
- package/dist/web/assets/design-tab-C987MtMR.js +0 -33
- package/dist/web/assets/design-tab-C987MtMR.js.br +0 -0
- package/dist/web/assets/design-tab-C987MtMR.js.gz +0 -0
- package/dist/web/assets/designs-sidebar-panel-CapP1yXq.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-CapP1yXq.js.gz +0 -0
- package/dist/web/assets/dialog-B8clVkyi.js +0 -1
- package/dist/web/assets/dialog-B8clVkyi.js.br +0 -0
- package/dist/web/assets/dialog-B8clVkyi.js.gz +0 -0
- package/dist/web/assets/diff-viewer-CdXi7cZN.js.br +0 -0
- package/dist/web/assets/diff-viewer-CdXi7cZN.js.gz +0 -0
- package/dist/web/assets/docx-preview-C9XdKEj1.js.br +0 -0
- package/dist/web/assets/docx-preview-C9XdKEj1.js.gz +0 -0
- package/dist/web/assets/editor-language-service-Zle_PZV8.js +0 -1
- package/dist/web/assets/editor-language-service-Zle_PZV8.js.br +0 -0
- package/dist/web/assets/editor-language-service-Zle_PZV8.js.gz +0 -0
- package/dist/web/assets/explorer-body-DHMQR1Rk.js +0 -2
- package/dist/web/assets/explorer-body-DHMQR1Rk.js.br +0 -0
- package/dist/web/assets/explorer-body-DHMQR1Rk.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-Df40nQBk.js +0 -1
- package/dist/web/assets/explorer-window-content-Df40nQBk.js.br +0 -0
- package/dist/web/assets/explorer-window-content-Df40nQBk.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-B2nZzJ2b.js.br +0 -0
- package/dist/web/assets/extension-manager-section-B2nZzJ2b.js.gz +0 -0
- package/dist/web/assets/extension-webview-BGoDxkdF.js.br +0 -0
- package/dist/web/assets/extension-webview-BGoDxkdF.js.gz +0 -0
- package/dist/web/assets/file-icons-gx_FBOXY.js.br +0 -0
- package/dist/web/assets/file-icons-gx_FBOXY.js.gz +0 -0
- package/dist/web/assets/file-store-D9KE0kQC.js.br +0 -0
- package/dist/web/assets/file-store-D9KE0kQC.js.gz +0 -0
- package/dist/web/assets/files-settings-section-DC3OzzOl.js.br +0 -0
- package/dist/web/assets/files-settings-section-DC3OzzOl.js.gz +0 -0
- package/dist/web/assets/format-bytes-DmSHAKFe.js +0 -1
- package/dist/web/assets/format-file-meta-mQwA6SuY.js.br +0 -0
- package/dist/web/assets/format-file-meta-mQwA6SuY.js.gz +0 -0
- package/dist/web/assets/fs-api-DL36slbd.js.br +0 -0
- package/dist/web/assets/fs-api-DL36slbd.js.gz +0 -0
- package/dist/web/assets/general-settings-section-i41W43ER.js.br +0 -0
- package/dist/web/assets/general-settings-section-i41W43ER.js.gz +0 -0
- package/dist/web/assets/git-log-panel-DHzPIkJg.js.br +0 -0
- package/dist/web/assets/git-log-panel-DHzPIkJg.js.gz +0 -0
- package/dist/web/assets/git-repo-store-DSypNj19.js.br +0 -0
- package/dist/web/assets/git-repo-store-DSypNj19.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-Dj4vrDvj.js.br +0 -0
- package/dist/web/assets/glide-data-grid-Dj4vrDvj.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-DfwZb-fI.js +0 -1
- package/dist/web/assets/group-chat-tab-DfwZb-fI.js.br +0 -0
- package/dist/web/assets/group-chat-tab-DfwZb-fI.js.gz +0 -0
- package/dist/web/assets/index-DMA-So69.css +0 -1
- package/dist/web/assets/index-DMA-So69.css.br +0 -0
- package/dist/web/assets/index-DMA-So69.css.gz +0 -0
- package/dist/web/assets/index-jG9mLs-J.js +0 -52
- package/dist/web/assets/index-jG9mLs-J.js.br +0 -0
- package/dist/web/assets/index-jG9mLs-J.js.gz +0 -0
- package/dist/web/assets/keybindings-store-BlapkC6O.js +0 -1
- package/dist/web/assets/keyboard-shortcuts-section-CxdGSNGr.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-CxdGSNGr.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-DJ9EVU1B.js +0 -1
- package/dist/web/assets/markdown-renderer-ok96IgnS.js.br +0 -0
- package/dist/web/assets/markdown-renderer-ok96IgnS.js.gz +0 -0
- package/dist/web/assets/mobile-bottom-sheet-CuNi2FRv.js.br +0 -0
- package/dist/web/assets/mobile-bottom-sheet-CuNi2FRv.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-Cc03LUKy.js +0 -1
- package/dist/web/assets/mobile-explorer-sheet-Cc03LUKy.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-Cc03LUKy.js.gz +0 -0
- package/dist/web/assets/new-design-dialog-Drkjb_LI.js.br +0 -0
- package/dist/web/assets/new-design-dialog-Drkjb_LI.js.gz +0 -0
- package/dist/web/assets/notification-store-DCyxho0O.js +0 -1
- package/dist/web/assets/notifications-settings-section-C05WYqcE.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-C05WYqcE.js.gz +0 -0
- package/dist/web/assets/onboarding-entry-CmUqv1kl.js.br +0 -0
- package/dist/web/assets/onboarding-entry-CmUqv1kl.js.gz +0 -0
- package/dist/web/assets/onboarding-quick-orientation-DIhWv1CN.js.br +0 -0
- package/dist/web/assets/onboarding-quick-orientation-DIhWv1CN.js.gz +0 -0
- package/dist/web/assets/overview-panel-BZAW_nag.js +0 -1
- package/dist/web/assets/overview-panel-BZAW_nag.js.br +0 -0
- package/dist/web/assets/overview-panel-BZAW_nag.js.gz +0 -0
- package/dist/web/assets/pdf-preview-qdXmMkOR.js.br +0 -0
- package/dist/web/assets/pdf-preview-qdXmMkOR.js.gz +0 -0
- package/dist/web/assets/postgres-viewer-Xvlun_n5.js.br +0 -0
- package/dist/web/assets/postgres-viewer-Xvlun_n5.js.gz +0 -0
- package/dist/web/assets/ppmbot-settings-section-C8PFlvaq.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-C8PFlvaq.js.gz +0 -0
- package/dist/web/assets/pptx-export-CG6MRNok.js.br +0 -0
- package/dist/web/assets/pptx-export-CG6MRNok.js.gz +0 -0
- package/dist/web/assets/problems-panel-CFYO0Ro3.js.br +0 -0
- package/dist/web/assets/problems-panel-CFYO0Ro3.js.gz +0 -0
- package/dist/web/assets/process-table-BVeRguFg.js +0 -1
- package/dist/web/assets/process-table-BVeRguFg.js.br +0 -0
- package/dist/web/assets/process-table-BVeRguFg.js.gz +0 -0
- package/dist/web/assets/project-store-C5gJXkvb.js.br +0 -0
- package/dist/web/assets/project-store-C5gJXkvb.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-BcHIEANE.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-BcHIEANE.js.gz +0 -0
- package/dist/web/assets/query-audit-section-UKG_smyt.js.br +0 -0
- package/dist/web/assets/query-audit-section-UKG_smyt.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-BGsp0edA.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-BGsp0edA.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-DxkmF8qb.js +0 -2
- package/dist/web/assets/remote-desktop-mobile-sheet-DxkmF8qb.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-DxkmF8qb.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DMD0M9Jh.js +0 -1
- package/dist/web/assets/remote-desktop-mobile-view-DMD0M9Jh.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-DMD0M9Jh.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-CsZCCRJI.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-CsZCCRJI.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-DrHw_vwY.js +0 -1
- package/dist/web/assets/remote-desktop-window-content-DrHw_vwY.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-DrHw_vwY.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-Ci0O2Ng6.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-Ci0O2Ng6.js.gz +0 -0
- package/dist/web/assets/scroll-area-XonvWYn_.js.br +0 -0
- package/dist/web/assets/scroll-area-XonvWYn_.js.gz +0 -0
- package/dist/web/assets/settings-body-B6JGOIYb.js +0 -2
- package/dist/web/assets/settings-body-B6JGOIYb.js.br +0 -0
- package/dist/web/assets/settings-body-B6JGOIYb.js.gz +0 -0
- package/dist/web/assets/settings-store-Br5c1efC.js +0 -2
- package/dist/web/assets/settings-store-Br5c1efC.js.br +0 -0
- package/dist/web/assets/settings-store-Br5c1efC.js.gz +0 -0
- package/dist/web/assets/settings-tab-CIQM4fNE.js +0 -1
- package/dist/web/assets/settings-window-content-BGNNz-E5.js +0 -1
- package/dist/web/assets/sql-query-editor-4iCGE4h2.js.br +0 -3
- package/dist/web/assets/sql-query-editor-4iCGE4h2.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-CK6DulYk.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-CK6DulYk.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-J9JtvAWV.js +0 -2
- package/dist/web/assets/system-monitor-body-J9JtvAWV.js.br +0 -0
- package/dist/web/assets/system-monitor-body-J9JtvAWV.js.gz +0 -0
- package/dist/web/assets/system-monitor-tab-DjBeRE81.js +0 -1
- package/dist/web/assets/system-monitor-window-content-BT7-ugFx.js +0 -1
- package/dist/web/assets/tab-host-window-content-CWBaWKjA.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-CWBaWKjA.js.gz +0 -0
- package/dist/web/assets/team-member-sheet-Br6mrxrw.js.br +0 -0
- package/dist/web/assets/team-member-sheet-Br6mrxrw.js.gz +0 -0
- package/dist/web/assets/team-member-window-content-CwCy7ZWf.js.br +0 -0
- package/dist/web/assets/team-member-window-content-CwCy7ZWf.js.gz +0 -0
- package/dist/web/assets/terminal-tab-BW14RpCb.js.br +0 -0
- package/dist/web/assets/terminal-tab-BW14RpCb.js.gz +0 -0
- package/dist/web/assets/tool-cards-CgOBEUnb.js.br +0 -0
- package/dist/web/assets/tool-cards-CgOBEUnb.js.gz +0 -0
- package/dist/web/assets/use-inline-blame-Bzjfru4n.js +0 -16
- package/dist/web/assets/use-inline-blame-Bzjfru4n.js.br +0 -0
- package/dist/web/assets/use-inline-blame-Bzjfru4n.js.gz +0 -0
- package/dist/web/assets/use-lsp-hGdjL2hV.js +0 -6
- package/dist/web/assets/use-lsp-hGdjL2hV.js.br +0 -0
- package/dist/web/assets/use-lsp-hGdjL2hV.js.gz +0 -0
- package/dist/web/assets/vendor-ui-BHh12_0v.js.br +0 -0
- package/dist/web/assets/vendor-ui-BHh12_0v.js.gz +0 -0
- package/dist/web/assets/video-preview-P9T-ZVdN.js +0 -1
- package/dist/web/assets/video-preview-P9T-ZVdN.js.br +0 -0
- package/dist/web/assets/video-preview-P9T-ZVdN.js.gz +0 -0
- package/dist/web/assets/ws-auth-kXgsX2Js.js +0 -1
- package/packages/vscode-compat/node_modules/.bin/tsc.bunx +0 -0
- package/packages/vscode-compat/node_modules/.bin/tsc.exe +0 -0
- package/packages/vscode-compat/node_modules/.bin/tsserver.bunx +0 -0
- package/packages/vscode-compat/node_modules/.bin/tsserver.exe +0 -0
- /package/dist/web/assets/{__vite-browser-external-BpSQWxcq.js → __vite-browser-external-BILfYaAs.js} +0 -0
- /package/dist/web/assets/{run-in-terminal-HIdNgYim.js → run-in-terminal-2pSiup8e.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-DLDtzLib.js → vendor-xterm-DF1JTfsy.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-DLDtzLib.js.br → vendor-xterm-DF1JTfsy.js.br} +0 -0
- /package/dist/web/assets/{vendor-xterm-DLDtzLib.js.gz → vendor-xterm-DF1JTfsy.js.gz} +0 -0
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VS Code's "Select a branch or tag to checkout" quick pick, opened from the
|
|
3
|
+
* branch name in the status bar.
|
|
4
|
+
*
|
|
5
|
+
* Three things are worth knowing before editing this. The list is `GET /refs`,
|
|
6
|
+
* not `/branches`: the rows carry an author, a hash, a subject and an
|
|
7
|
+
* ahead/behind pair per ref, and tags, none of which `/branches` returns. What
|
|
8
|
+
* a picked row *runs* is `checkoutTarget`, not `git checkout <name>` — see the
|
|
9
|
+
* note there about remote refs detaching HEAD. And it is reachable on desktop
|
|
10
|
+
* only, because the status bar it opens from is `hidden md:flex`; the shell is
|
|
11
|
+
* still written to survive a narrow viewport rather than assume one.
|
|
12
|
+
*/
|
|
13
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
14
|
+
import { toast } from "sonner";
|
|
15
|
+
import {
|
|
16
|
+
ArrowDown,
|
|
17
|
+
ArrowUp,
|
|
18
|
+
Check,
|
|
19
|
+
Cloud,
|
|
20
|
+
GitBranch,
|
|
21
|
+
Link2Off,
|
|
22
|
+
Loader2,
|
|
23
|
+
Plus,
|
|
24
|
+
Search,
|
|
25
|
+
Tag,
|
|
26
|
+
} from "@/lib/icons";
|
|
27
|
+
import { api } from "@/lib/api-client";
|
|
28
|
+
import { cn } from "@/lib/utils";
|
|
29
|
+
import { useGitRepo } from "@/hooks/use-git-repo";
|
|
30
|
+
import { refreshGitStatus } from "@/stores/git-status-store";
|
|
31
|
+
import {
|
|
32
|
+
buildRows,
|
|
33
|
+
checkoutTarget,
|
|
34
|
+
firstSelectable,
|
|
35
|
+
localNameFor,
|
|
36
|
+
moveSelection,
|
|
37
|
+
refDetail,
|
|
38
|
+
type PickerAction,
|
|
39
|
+
type PickerRow,
|
|
40
|
+
} from "@/lib/git-ref-picker";
|
|
41
|
+
import { formatRelativeTime } from "../../../shared/blame";
|
|
42
|
+
import type { GitRef } from "../../../types/git";
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Which question the picker is currently asking.
|
|
46
|
+
*
|
|
47
|
+
* "Create new branch from..." is two questions in VS Code's order — the name
|
|
48
|
+
* first, then the ref — so the pending name rides along on the second stage.
|
|
49
|
+
*/
|
|
50
|
+
type Stage =
|
|
51
|
+
| { kind: "pick" }
|
|
52
|
+
| { kind: "name"; then: "create" | "from" }
|
|
53
|
+
| { kind: "pick-ref"; purpose: "from" | "detach"; name?: string };
|
|
54
|
+
|
|
55
|
+
const PLACEHOLDER: Record<Stage["kind"], string> = {
|
|
56
|
+
pick: "Select a branch or tag to checkout",
|
|
57
|
+
name: "Branch name",
|
|
58
|
+
"pick-ref": "Select a ref",
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
function placeholderFor(stage: Stage): string {
|
|
62
|
+
if (stage.kind === "pick-ref") {
|
|
63
|
+
return stage.purpose === "from"
|
|
64
|
+
? "Select a ref to create the branch from"
|
|
65
|
+
: "Select a branch or tag to checkout in detached mode";
|
|
66
|
+
}
|
|
67
|
+
return PLACEHOLDER[stage.kind];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The selection tint, and why it is not `bg-accent/15` like the command palette
|
|
72
|
+
* and the extension quick pick beside it.
|
|
73
|
+
*
|
|
74
|
+
* shadcn's `accent` is deliberately a hover **surface** in this app — `globals.css`
|
|
75
|
+
* says so, and maps `--color-accent` to `--panel-2` while the brand blue lives in
|
|
76
|
+
* `--color-primary`. A surface at 15% over the panel it is nearly identical to
|
|
77
|
+
* changes almost nothing: measured in a real browser against the dialog's own
|
|
78
|
+
* background, `bg-accent/15` composites to a contrast ratio of **1.01** on a
|
|
79
|
+
* light panel (rgb(243,247,255) → rgb(245,248,255)) and **1.009** on a dark one,
|
|
80
|
+
* i.e. a keyboard selection nobody can see. `bg-primary/15` carries the brand
|
|
81
|
+
* hue and measures 1.21 on both.
|
|
82
|
+
*
|
|
83
|
+
* Same family as the `opacity`-is-not-dimming note in CLAUDE.md: the class reads
|
|
84
|
+
* perfectly well and paints nothing.
|
|
85
|
+
*/
|
|
86
|
+
const SELECTED_ROW = "bg-primary/15 text-text-primary";
|
|
87
|
+
const HOVER_ROW = "hover:bg-primary/10";
|
|
88
|
+
|
|
89
|
+
const REF_ICON: Record<GitRef["type"], typeof GitBranch> = {
|
|
90
|
+
branch: GitBranch,
|
|
91
|
+
remote: Cloud,
|
|
92
|
+
tag: Tag,
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const ACTION_ICON: Record<PickerAction, typeof GitBranch> = {
|
|
96
|
+
create: Plus,
|
|
97
|
+
"create-from": Plus,
|
|
98
|
+
detach: Link2Off,
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export function BranchPicker({
|
|
102
|
+
projectName,
|
|
103
|
+
onClose,
|
|
104
|
+
}: {
|
|
105
|
+
projectName: string;
|
|
106
|
+
onClose: () => void;
|
|
107
|
+
}) {
|
|
108
|
+
const { repo, gitUrl, rebaseStatus } = useGitRepo(projectName);
|
|
109
|
+
const [refs, setRefs] = useState<GitRef[] | null>(null);
|
|
110
|
+
const [loadError, setLoadError] = useState<string | null>(null);
|
|
111
|
+
const [stage, setStage] = useState<Stage>({ kind: "pick" });
|
|
112
|
+
const [query, setQuery] = useState("");
|
|
113
|
+
const [selected, setSelected] = useState(0);
|
|
114
|
+
const [busy, setBusy] = useState(false);
|
|
115
|
+
const inputRef = useRef<HTMLInputElement>(null);
|
|
116
|
+
const listRef = useRef<HTMLDivElement>(null);
|
|
117
|
+
|
|
118
|
+
useEffect(() => {
|
|
119
|
+
if (!repo) return;
|
|
120
|
+
let cancelled = false;
|
|
121
|
+
api
|
|
122
|
+
.get<GitRef[]>(gitUrl("/refs"))
|
|
123
|
+
.then((data) => !cancelled && setRefs(data))
|
|
124
|
+
.catch((e) => !cancelled && setLoadError(e instanceof Error ? e.message : "Could not list refs"));
|
|
125
|
+
return () => {
|
|
126
|
+
cancelled = true;
|
|
127
|
+
};
|
|
128
|
+
}, [repo, gitUrl]);
|
|
129
|
+
|
|
130
|
+
useEffect(() => {
|
|
131
|
+
requestAnimationFrame(() => inputRef.current?.focus());
|
|
132
|
+
}, []);
|
|
133
|
+
|
|
134
|
+
const rows = useMemo(
|
|
135
|
+
() => (stage.kind === "name" ? [] : buildRows(refs ?? [], query, { actions: stage.kind === "pick" })),
|
|
136
|
+
[refs, query, stage.kind],
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
// A new filter invalidates the old index outright: row 12 of the previous
|
|
140
|
+
// list is a different ref, so clamping it would move the highlight silently.
|
|
141
|
+
useEffect(() => {
|
|
142
|
+
setSelected(firstSelectable(rows));
|
|
143
|
+
}, [rows]);
|
|
144
|
+
|
|
145
|
+
useEffect(() => {
|
|
146
|
+
listRef.current?.children[selected]?.scrollIntoView({ block: "nearest" });
|
|
147
|
+
}, [selected]);
|
|
148
|
+
|
|
149
|
+
const commit = useCallback(
|
|
150
|
+
async (work: () => Promise<unknown>, done: string) => {
|
|
151
|
+
setBusy(true);
|
|
152
|
+
try {
|
|
153
|
+
await work();
|
|
154
|
+
} catch (e) {
|
|
155
|
+
setBusy(false);
|
|
156
|
+
toast.error(e instanceof Error ? e.message : "Git command failed");
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
onClose();
|
|
160
|
+
toast.success(done);
|
|
161
|
+
// The status bar still names the branch just left until this lands.
|
|
162
|
+
void refreshGitStatus(projectName, gitUrl, rebaseStatus);
|
|
163
|
+
},
|
|
164
|
+
[onClose, projectName, gitUrl, rebaseStatus],
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
const pickRef = useCallback(
|
|
168
|
+
(ref: GitRef) => {
|
|
169
|
+
if (busy) return;
|
|
170
|
+
if (stage.kind === "pick-ref" && stage.purpose === "detach") {
|
|
171
|
+
void commit(
|
|
172
|
+
() => api.post(gitUrl("/checkout"), { ref: ref.name, mode: "detach" }),
|
|
173
|
+
`Detached HEAD at ${ref.name}`,
|
|
174
|
+
);
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (stage.kind === "pick-ref" && stage.name) {
|
|
178
|
+
const name = stage.name;
|
|
179
|
+
void commit(
|
|
180
|
+
() => api.post(gitUrl("/branch/create"), { name, from: ref.name }),
|
|
181
|
+
`Created ${name} from ${ref.name}`,
|
|
182
|
+
);
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (ref.current) {
|
|
186
|
+
onClose();
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
const target = checkoutTarget(ref, refs ?? []);
|
|
190
|
+
// `track` lands on the LOCAL branch `-t` creates, not on the remote ref
|
|
191
|
+
// that was picked — naming the remote here would report a branch the user
|
|
192
|
+
// is not on.
|
|
193
|
+
const landedOn = target.mode === "track" ? localNameFor(target.ref) : target.ref;
|
|
194
|
+
void commit(() => api.post(gitUrl("/checkout"), target), `Switched to ${landedOn}`);
|
|
195
|
+
},
|
|
196
|
+
[busy, stage, commit, gitUrl, refs, onClose],
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
const pickAction = useCallback((action: PickerAction) => {
|
|
200
|
+
setQuery("");
|
|
201
|
+
setStage(
|
|
202
|
+
action === "detach"
|
|
203
|
+
? { kind: "pick-ref", purpose: "detach" }
|
|
204
|
+
: { kind: "name", then: action === "create" ? "create" : "from" },
|
|
205
|
+
);
|
|
206
|
+
inputRef.current?.focus();
|
|
207
|
+
}, []);
|
|
208
|
+
|
|
209
|
+
const submitName = useCallback(() => {
|
|
210
|
+
const name = query.trim();
|
|
211
|
+
if (!name || stage.kind !== "name" || busy) return;
|
|
212
|
+
if (stage.then === "from") {
|
|
213
|
+
setStage({ kind: "pick-ref", purpose: "from", name });
|
|
214
|
+
setQuery("");
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
void commit(() => api.post(gitUrl("/branch/create"), { name }), `Created ${name}`);
|
|
218
|
+
}, [query, stage, busy, commit, gitUrl]);
|
|
219
|
+
|
|
220
|
+
function activate(row: PickerRow | undefined) {
|
|
221
|
+
if (!row) return;
|
|
222
|
+
if (row.kind === "action") pickAction(row.action);
|
|
223
|
+
else if (row.kind === "ref") pickRef(row.ref);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function handleKeyDown(e: React.KeyboardEvent) {
|
|
227
|
+
switch (e.key) {
|
|
228
|
+
case "ArrowDown":
|
|
229
|
+
e.preventDefault();
|
|
230
|
+
setSelected((i) => moveSelection(rows, i, 1));
|
|
231
|
+
break;
|
|
232
|
+
case "ArrowUp":
|
|
233
|
+
e.preventDefault();
|
|
234
|
+
setSelected((i) => moveSelection(rows, i, -1));
|
|
235
|
+
break;
|
|
236
|
+
case "Enter":
|
|
237
|
+
e.preventDefault();
|
|
238
|
+
if (stage.kind === "name") submitName();
|
|
239
|
+
else activate(rows[selected]);
|
|
240
|
+
break;
|
|
241
|
+
case "Escape":
|
|
242
|
+
e.preventDefault();
|
|
243
|
+
// Back out one question at a time, the way a multi-step quick pick does.
|
|
244
|
+
if (stage.kind === "pick") onClose();
|
|
245
|
+
else {
|
|
246
|
+
setStage({ kind: "pick" });
|
|
247
|
+
setQuery("");
|
|
248
|
+
}
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return (
|
|
254
|
+
/*
|
|
255
|
+
* The desktop panel is bounded by the shell's PADDING, not by a `vh` cap of
|
|
256
|
+
* its own. `pt-[20vh]` beside `max-h-[80vh]` adds up to exactly 100vh, so
|
|
257
|
+
* the panel's bottom edge landed on the viewport's — measured at 620px tall:
|
|
258
|
+
* top 124, bottom 620, gap 0 — and the last row of the list was sliced by
|
|
259
|
+
* the window edge rather than by a visible container, which reads as a
|
|
260
|
+
* dialog overflowing the screen instead of a list that scrolls.
|
|
261
|
+
*
|
|
262
|
+
* `max-h-full` resolves against the flex container's CONTENT box, so the
|
|
263
|
+
* padding below is subtracted for free and the gap survives any window
|
|
264
|
+
* height. Below `md` the panel is a bottom sheet and *should* sit flush on
|
|
265
|
+
* the bottom edge, so the padding is desktop-only.
|
|
266
|
+
*/
|
|
267
|
+
<div
|
|
268
|
+
className="fixed inset-0 z-50 flex items-end justify-center md:items-start md:px-4 md:pt-[12vh] md:pb-[10vh]"
|
|
269
|
+
onClick={onClose}
|
|
270
|
+
>
|
|
271
|
+
<div className="fixed inset-0 bg-black/50" />
|
|
272
|
+
<div
|
|
273
|
+
role="dialog"
|
|
274
|
+
aria-label="Checkout a branch or tag"
|
|
275
|
+
className="relative z-10 w-full max-w-xl rounded-t-xl md:rounded-xl border border-border bg-background shadow-2xl overflow-hidden max-h-[80vh] md:max-h-full flex flex-col"
|
|
276
|
+
onClick={(e) => e.stopPropagation()}
|
|
277
|
+
onKeyDown={handleKeyDown}
|
|
278
|
+
>
|
|
279
|
+
<div className="flex items-center gap-2 border-b border-border px-3 py-2.5 shrink-0">
|
|
280
|
+
{busy ? (
|
|
281
|
+
<Loader2 className="size-4 text-text-subtle shrink-0 animate-spin" />
|
|
282
|
+
) : (
|
|
283
|
+
<Search className="size-4 text-text-subtle shrink-0" />
|
|
284
|
+
)}
|
|
285
|
+
<input
|
|
286
|
+
ref={inputRef}
|
|
287
|
+
type="text"
|
|
288
|
+
value={query}
|
|
289
|
+
disabled={busy}
|
|
290
|
+
onChange={(e) => setQuery(e.target.value)}
|
|
291
|
+
placeholder={placeholderFor(stage)}
|
|
292
|
+
className="flex-1 bg-transparent text-sm text-text-primary outline-none placeholder:text-text-subtle disabled:opacity-60"
|
|
293
|
+
/>
|
|
294
|
+
<kbd className="hidden sm:inline-flex items-center rounded border border-border bg-surface px-1.5 py-0.5 text-[10px] text-text-subtle font-mono">
|
|
295
|
+
ESC
|
|
296
|
+
</kbd>
|
|
297
|
+
</div>
|
|
298
|
+
|
|
299
|
+
{stage.kind === "name" ? (
|
|
300
|
+
<p className="px-3 py-4 text-xs text-text-3">
|
|
301
|
+
{stage.then === "from"
|
|
302
|
+
? "Press Enter, then choose the ref to branch from."
|
|
303
|
+
: "Press Enter to create the branch from HEAD and switch to it."}
|
|
304
|
+
</p>
|
|
305
|
+
) : (
|
|
306
|
+
<div ref={listRef} className="overflow-y-auto py-1">
|
|
307
|
+
{loadError ? (
|
|
308
|
+
<p className="px-3 py-4 text-sm text-error text-center">{loadError}</p>
|
|
309
|
+
) : !refs ? (
|
|
310
|
+
<p className="px-3 py-4 text-sm text-text-subtle text-center">Loading refs…</p>
|
|
311
|
+
) : rows.length === 0 ? (
|
|
312
|
+
<p className="px-3 py-4 text-sm text-text-subtle text-center">No matching branches or tags</p>
|
|
313
|
+
) : (
|
|
314
|
+
rows.map((row, i) =>
|
|
315
|
+
row.kind === "separator" ? (
|
|
316
|
+
<div
|
|
317
|
+
key={`sep-${row.label}`}
|
|
318
|
+
className="px-3 pt-2 pb-1 text-[10px] uppercase tracking-wide text-text-3 border-t border-border-soft first:border-t-0 first:pt-1"
|
|
319
|
+
>
|
|
320
|
+
{row.label}
|
|
321
|
+
</div>
|
|
322
|
+
) : row.kind === "action" ? (
|
|
323
|
+
<Row
|
|
324
|
+
key={`act-${row.action}`}
|
|
325
|
+
icon={ACTION_ICON[row.action]}
|
|
326
|
+
active={i === selected}
|
|
327
|
+
onSelect={() => pickAction(row.action)}
|
|
328
|
+
label={row.label}
|
|
329
|
+
/>
|
|
330
|
+
) : (
|
|
331
|
+
<RefRow
|
|
332
|
+
key={row.ref.refName}
|
|
333
|
+
refItem={row.ref}
|
|
334
|
+
active={i === selected}
|
|
335
|
+
onSelect={() => pickRef(row.ref)}
|
|
336
|
+
/>
|
|
337
|
+
),
|
|
338
|
+
)
|
|
339
|
+
)}
|
|
340
|
+
</div>
|
|
341
|
+
)}
|
|
342
|
+
</div>
|
|
343
|
+
</div>
|
|
344
|
+
);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
function Row({
|
|
348
|
+
icon: Icon,
|
|
349
|
+
label,
|
|
350
|
+
active,
|
|
351
|
+
onSelect,
|
|
352
|
+
}: {
|
|
353
|
+
icon: typeof GitBranch;
|
|
354
|
+
label: string;
|
|
355
|
+
active: boolean;
|
|
356
|
+
onSelect: () => void;
|
|
357
|
+
}) {
|
|
358
|
+
return (
|
|
359
|
+
<button
|
|
360
|
+
type="button"
|
|
361
|
+
onClick={onSelect}
|
|
362
|
+
className={cn(
|
|
363
|
+
"flex items-center gap-2.5 w-full px-3 py-2 text-sm text-left transition-colors",
|
|
364
|
+
active ? SELECTED_ROW : "text-text-secondary " + HOVER_ROW,
|
|
365
|
+
)}
|
|
366
|
+
>
|
|
367
|
+
<Icon className="size-4 shrink-0 text-text-3" />
|
|
368
|
+
<span className="truncate">{label}</span>
|
|
369
|
+
</button>
|
|
370
|
+
);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
function RefRow({
|
|
374
|
+
refItem,
|
|
375
|
+
active,
|
|
376
|
+
onSelect,
|
|
377
|
+
}: {
|
|
378
|
+
refItem: GitRef;
|
|
379
|
+
active: boolean;
|
|
380
|
+
onSelect: () => void;
|
|
381
|
+
}) {
|
|
382
|
+
const Icon = refItem.current ? Check : REF_ICON[refItem.type];
|
|
383
|
+
return (
|
|
384
|
+
<button
|
|
385
|
+
type="button"
|
|
386
|
+
onClick={onSelect}
|
|
387
|
+
className={cn(
|
|
388
|
+
"flex items-start gap-2.5 w-full px-3 py-1.5 text-sm text-left transition-colors",
|
|
389
|
+
active ? SELECTED_ROW : "text-text-secondary " + HOVER_ROW,
|
|
390
|
+
)}
|
|
391
|
+
>
|
|
392
|
+
<Icon className={cn("size-4 shrink-0 mt-0.5", refItem.current ? "text-primary" : "text-text-3")} />
|
|
393
|
+
<span className="flex-1 min-w-0">
|
|
394
|
+
<span className="flex items-baseline gap-2">
|
|
395
|
+
<span className="truncate">{refItem.name}</span>
|
|
396
|
+
<span className="ml-auto shrink-0 flex items-center gap-1.5 text-xs text-text-3">
|
|
397
|
+
{refItem.behind > 0 && (
|
|
398
|
+
<span className="flex items-center gap-0.5">
|
|
399
|
+
<ArrowDown className="size-3" />
|
|
400
|
+
{refItem.behind}
|
|
401
|
+
</span>
|
|
402
|
+
)}
|
|
403
|
+
{refItem.ahead > 0 && (
|
|
404
|
+
<span className="flex items-center gap-0.5">
|
|
405
|
+
<ArrowUp className="size-3" />
|
|
406
|
+
{refItem.ahead}
|
|
407
|
+
</span>
|
|
408
|
+
)}
|
|
409
|
+
{refItem.gone && <span className="text-warning">gone</span>}
|
|
410
|
+
{/* Without the dot, `↑1 1 hour ago` reads as one number twice. */}
|
|
411
|
+
{(refItem.ahead > 0 || refItem.behind > 0 || refItem.gone) && <span aria-hidden>·</span>}
|
|
412
|
+
<span>{formatRelativeTime(Date.parse(refItem.date))}</span>
|
|
413
|
+
</span>
|
|
414
|
+
</span>
|
|
415
|
+
<span className="block truncate text-xs text-text-3">{refDetail(refItem)}</span>
|
|
416
|
+
</span>
|
|
417
|
+
</button>
|
|
418
|
+
);
|
|
419
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The branch picker — Branch Review's two, and Add Worktree's.
|
|
3
|
+
*
|
|
4
|
+
* These were native `<select>`s, on the argument that the OS picker scrolls well
|
|
5
|
+
* and is a good touch target. What that missed is the list: a working repository
|
|
6
|
+
* here has a few dozen local branches and several hundred remote-tracking ones,
|
|
7
|
+
* all named `fix/NX-1234-…`, and a native picker cannot be searched. So it is a
|
|
8
|
+
* `SearchSelect` over the repository's branches; what a branch row says and the
|
|
9
|
+
* order the groups come in are `branchItems`.
|
|
10
|
+
*/
|
|
11
|
+
import { useMemo } from "react";
|
|
12
|
+
import { GitBranch as GitBranchIcon } from "@/lib/icons";
|
|
13
|
+
import { SearchSelect, type SearchSelectProps } from "@/components/ui/search-select";
|
|
14
|
+
import { branchItems } from "@/lib/branch-select-items";
|
|
15
|
+
import type { GitBranch } from "../../../types/git";
|
|
16
|
+
|
|
17
|
+
type BranchSelectProps = Omit<
|
|
18
|
+
SearchSelectProps,
|
|
19
|
+
"items" | "icon" | "placeholder" | "searchPlaceholder" | "emptyText"
|
|
20
|
+
> & { branches: GitBranch[] };
|
|
21
|
+
|
|
22
|
+
export function BranchSelect({ branches, ...rest }: BranchSelectProps) {
|
|
23
|
+
const items = useMemo(() => branchItems(branches), [branches]);
|
|
24
|
+
return (
|
|
25
|
+
<SearchSelect
|
|
26
|
+
{...rest}
|
|
27
|
+
items={items}
|
|
28
|
+
icon={GitBranchIcon}
|
|
29
|
+
placeholder="Select a branch"
|
|
30
|
+
searchPlaceholder="Search branches"
|
|
31
|
+
emptyText="No matching branches"
|
|
32
|
+
/>
|
|
33
|
+
);
|
|
34
|
+
}
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
} from "@/components/ui/dialog";
|
|
13
13
|
import { Input } from "@/components/ui/input";
|
|
14
14
|
import { Label } from "@/components/ui/label";
|
|
15
|
+
import { BranchSelect } from "@/components/git/branch-select";
|
|
15
16
|
import type { GitBranch } from "../../../types/git";
|
|
16
17
|
import { cn } from "@/lib/utils";
|
|
17
18
|
|
|
@@ -36,7 +37,7 @@ export function CreateWorktreeDialog({
|
|
|
36
37
|
const [branchMode, setBranchMode] = useState<BranchMode>("new");
|
|
37
38
|
const [newBranch, setNewBranch] = useState("");
|
|
38
39
|
const [existingBranch, setExistingBranch] = useState("");
|
|
39
|
-
const [branches, setBranches] = useState<
|
|
40
|
+
const [branches, setBranches] = useState<GitBranch[]>([]);
|
|
40
41
|
const [loading, setLoading] = useState(false);
|
|
41
42
|
const [error, setError] = useState<string | null>(null);
|
|
42
43
|
|
|
@@ -46,10 +47,10 @@ export function CreateWorktreeDialog({
|
|
|
46
47
|
api
|
|
47
48
|
.get<GitBranch[]>(gitUrl("/branches"))
|
|
48
49
|
.then((data) => {
|
|
49
|
-
const local = data.filter((b) => !b.remote)
|
|
50
|
+
const local = data.filter((b) => !b.remote);
|
|
50
51
|
setBranches(local);
|
|
51
52
|
if (local.length > 0 && !existingBranch) {
|
|
52
|
-
setExistingBranch(local[0]!);
|
|
53
|
+
setExistingBranch((local.find((b) => b.current) ?? local[0]!).name);
|
|
53
54
|
}
|
|
54
55
|
})
|
|
55
56
|
.catch(() => setBranches([]));
|
|
@@ -143,21 +144,21 @@ export function CreateWorktreeDialog({
|
|
|
143
144
|
onChange={(e) => setNewBranch(e.target.value)}
|
|
144
145
|
className="w-full"
|
|
145
146
|
/>
|
|
147
|
+
) : branches.length === 0 ? (
|
|
148
|
+
<p className="text-sm text-muted-foreground">No branches available</p>
|
|
146
149
|
) : (
|
|
147
|
-
|
|
150
|
+
/* `modal`: this is inside a Radix dialog — see the prop's note. */
|
|
151
|
+
<BranchSelect
|
|
148
152
|
value={existingBranch}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
</option>
|
|
159
|
-
))}
|
|
160
|
-
</select>
|
|
153
|
+
branches={branches}
|
|
154
|
+
onChange={setExistingBranch}
|
|
155
|
+
label="Existing branch"
|
|
156
|
+
testId="worktree-branch"
|
|
157
|
+
// h-9 on both, so it lines up with the Input it replaces in this form
|
|
158
|
+
// rather than with the compact panel row the picker was written for.
|
|
159
|
+
className="h-9 w-full md:h-9"
|
|
160
|
+
modal
|
|
161
|
+
/>
|
|
161
162
|
)}
|
|
162
163
|
</div>
|
|
163
164
|
</div>
|
|
@@ -15,16 +15,10 @@
|
|
|
15
15
|
* whole panel: a picker tucked into a header is a picker nobody finds, and
|
|
16
16
|
* until it is answered there is nothing else for the panel to show.
|
|
17
17
|
*/
|
|
18
|
-
import {
|
|
18
|
+
import { useMemo } from "react";
|
|
19
|
+
import { FolderGit2, GitBranch, RefreshCw } from "@/lib/icons";
|
|
19
20
|
import { Button } from "@/components/ui/button";
|
|
20
|
-
import {
|
|
21
|
-
DropdownMenu,
|
|
22
|
-
DropdownMenuContent,
|
|
23
|
-
DropdownMenuItem,
|
|
24
|
-
DropdownMenuLabel,
|
|
25
|
-
DropdownMenuSeparator,
|
|
26
|
-
DropdownMenuTrigger,
|
|
27
|
-
} from "@/components/ui/dropdown-menu";
|
|
21
|
+
import { SearchSelect } from "@/components/ui/search-select";
|
|
28
22
|
import type { GitRepoCandidate } from "@/lib/git-repo-scope";
|
|
29
23
|
import { usePrefersCoarsePointer } from "@/components/os-explorer/use-coarse-long-press";
|
|
30
24
|
import { cn } from "@/lib/utils";
|
|
@@ -40,6 +34,13 @@ export function GitRepoBar({ repo, repos, onChoose }: GitRepoBarProps) {
|
|
|
40
34
|
// a subfolder's history under the project's name, and that has to be visible.
|
|
41
35
|
const single = repos.length < 2;
|
|
42
36
|
const coarse = usePrefersCoarsePointer();
|
|
37
|
+
// Searchable, because a folder of checkouts is named the way this one is —
|
|
38
|
+
// `nxsys-backend-nx5833`, `…-nx5838`, `…-nx5838-ma` — and a plain menu of
|
|
39
|
+
// thirty of them is read top to bottom for the last few characters.
|
|
40
|
+
const items = useMemo(
|
|
41
|
+
() => repos.map((c) => ({ value: c.path, label: c.relative, title: c.path, icon: GitBranch })),
|
|
42
|
+
[repos],
|
|
43
|
+
);
|
|
43
44
|
return (
|
|
44
45
|
<div className="flex items-center gap-1.5 px-3 py-1.5 border-b border-border shrink-0 text-xs text-text-secondary">
|
|
45
46
|
<FolderGit2 className="size-3.5 shrink-0 text-text-subtle" />
|
|
@@ -48,37 +49,24 @@ export function GitRepoBar({ repo, repos, onChoose }: GitRepoBarProps) {
|
|
|
48
49
|
{repo.relative}
|
|
49
50
|
</span>
|
|
50
51
|
) : (
|
|
51
|
-
<
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
{repos.map((candidate) => (
|
|
70
|
-
<DropdownMenuItem
|
|
71
|
-
key={candidate.path}
|
|
72
|
-
onClick={() => onChoose(candidate.path)}
|
|
73
|
-
className="gap-2"
|
|
74
|
-
>
|
|
75
|
-
<GitBranch className="size-3.5 shrink-0" />
|
|
76
|
-
<span className="truncate">{candidate.relative}</span>
|
|
77
|
-
{candidate.path === repo.path && <span className="ml-auto text-text-subtle">✓</span>}
|
|
78
|
-
</DropdownMenuItem>
|
|
79
|
-
))}
|
|
80
|
-
</DropdownMenuContent>
|
|
81
|
-
</DropdownMenu>
|
|
52
|
+
<SearchSelect
|
|
53
|
+
value={repo.path}
|
|
54
|
+
items={items}
|
|
55
|
+
onChange={onChoose}
|
|
56
|
+
label="Repository"
|
|
57
|
+
searchPlaceholder="Search repositories"
|
|
58
|
+
emptyText="No matching repositories"
|
|
59
|
+
testId="git-repo-picker"
|
|
60
|
+
// Ghost, not a form field: this row says which repository, it does not
|
|
61
|
+
// ask. And it is the only way back to the other repository, so a full
|
|
62
|
+
// 44px target wherever the pointer is coarse — gated on the pointer
|
|
63
|
+
// rather than on a width, because a touch laptop is wide and has no
|
|
64
|
+
// mouse. Both heights are restated at `md:` to beat the field's own.
|
|
65
|
+
className={cn(
|
|
66
|
+
"border-transparent bg-transparent px-1.5 text-text-secondary hover:bg-accent",
|
|
67
|
+
coarse ? "h-11 md:h-11" : "h-8 md:h-8",
|
|
68
|
+
)}
|
|
69
|
+
/>
|
|
82
70
|
)}
|
|
83
71
|
</div>
|
|
84
72
|
);
|