@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
|
@@ -14,6 +14,24 @@ export interface CpuMetrics {
|
|
|
14
14
|
/** Index matches `os.cpus()` order. Core count is `cores.length`. */
|
|
15
15
|
cores: number[];
|
|
16
16
|
model: string;
|
|
17
|
+
/** Everything below is Mission Center's CPU page and is absent where this host
|
|
18
|
+
* cannot measure it — the UI hides the row rather than showing a 0.
|
|
19
|
+
*
|
|
20
|
+
* Kernel-mode share, drawn as a second line under the total. */
|
|
21
|
+
kernelPercent?: number;
|
|
22
|
+
coreKernel?: number[];
|
|
23
|
+
/** Mean current clock across the online cores, MHz. */
|
|
24
|
+
currentMHz?: number;
|
|
25
|
+
/** Package sensor, °C. */
|
|
26
|
+
tempC?: number;
|
|
27
|
+
/** Package draw over the tick, watts (RAPL energy delta / elapsed). */
|
|
28
|
+
powerW?: number;
|
|
29
|
+
/** Kernel-wide totals for the page's rows. Handles is open file descriptors,
|
|
30
|
+
* which is the closest Linux analogue of the Windows figure. */
|
|
31
|
+
threadCount?: number;
|
|
32
|
+
handleCount?: number;
|
|
33
|
+
/** Seconds since boot. */
|
|
34
|
+
uptimeSec?: number;
|
|
17
35
|
}
|
|
18
36
|
|
|
19
37
|
export interface MemoryMetrics {
|
|
@@ -22,6 +40,41 @@ export interface MemoryMetrics {
|
|
|
22
40
|
availableMB: number;
|
|
23
41
|
/** usedMB / totalMB × 100. */
|
|
24
42
|
percent: number;
|
|
43
|
+
/** Mission Center's composition bar, in BYTES. The four add up to the total, so
|
|
44
|
+
* the bar needs no normalisation. Absent on a host with no /proc/meminfo. */
|
|
45
|
+
inUseBytes?: number;
|
|
46
|
+
/** Written-to pages not yet on disk (Dirty + Writeback). */
|
|
47
|
+
modifiedBytes?: number;
|
|
48
|
+
/** Reclaimable: page cache, buffers and reclaimable slab. */
|
|
49
|
+
standbyBytes?: number;
|
|
50
|
+
freeBytes?: number;
|
|
51
|
+
cachedMB?: number;
|
|
52
|
+
/** Address space promised to processes, and the kernel's ceiling for it. */
|
|
53
|
+
committedMB?: number;
|
|
54
|
+
commitLimitMB?: number;
|
|
55
|
+
swapTotalMB?: number;
|
|
56
|
+
swapUsedMB?: number;
|
|
57
|
+
/** zram, summed across every device. `compressedMB` is what the compressed
|
|
58
|
+
* pages occupy; `savingsMB` is what they would have occupied uncompressed
|
|
59
|
+
* minus that, i.e. the RAM the compression bought back. Both absent on a host
|
|
60
|
+
* with no zram — which is not the same as a host whose zram is empty. */
|
|
61
|
+
zramCompressedMB?: number;
|
|
62
|
+
zramSavingsMB?: number;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** One fan, plus the temperature its chip reports beside it — Mission Center's
|
|
66
|
+
* Fan page. Small and few, so the labels ride the tick rather than the inventory. */
|
|
67
|
+
export interface FanMetrics {
|
|
68
|
+
/** Stable across ticks: "<hwmon name>/fan<N>", e.g. "it8689/fan1". */
|
|
69
|
+
id: string;
|
|
70
|
+
/** The chip's own label when it has one, else "Fan N". */
|
|
71
|
+
label: string;
|
|
72
|
+
rpm: number;
|
|
73
|
+
/** Duty cycle, 0-100, from the matching `pwmN` (raw 0-255). */
|
|
74
|
+
pwmPercent?: number;
|
|
75
|
+
/** The chip's temperature sensor with the same index, °C. */
|
|
76
|
+
tempC?: number;
|
|
77
|
+
tempName?: string;
|
|
25
78
|
}
|
|
26
79
|
|
|
27
80
|
/** Whole-machine throughput, bytes/second over the last tick. */
|
|
@@ -39,8 +92,52 @@ export interface GpuMetrics {
|
|
|
39
92
|
name: string;
|
|
40
93
|
/** 0-100. */
|
|
41
94
|
utilPercent: number;
|
|
95
|
+
/** Dedicated memory. `vramTotalMB` 0 = the device has none to report (an
|
|
96
|
+
* integrated GPU), so the UI shows no memory figure rather than "0 B / 0 B". */
|
|
42
97
|
vramUsedMB: number;
|
|
43
98
|
vramTotalMB: number;
|
|
99
|
+
/** Everything below is Mission Center's GPU page. Each field is absent when this
|
|
100
|
+
* driver/host cannot measure it, and the UI hides that row or graph mode.
|
|
101
|
+
*
|
|
102
|
+
* Stable device id matching `GpuInfo.id`: the PCI address ("0000:00:02.0"), or
|
|
103
|
+
* "<driver>-<n>" for a GPU with none. */
|
|
104
|
+
id?: string;
|
|
105
|
+
/** GTT / shared system memory (amdgpu), MB. */
|
|
106
|
+
sharedUsedMB?: number;
|
|
107
|
+
sharedTotalMB?: number;
|
|
108
|
+
/** Video engines, 0-100. When `GpuInfo.encodeDecodeShared`, the one combined
|
|
109
|
+
* counter is reported as `encodePercent` and `decodePercent` is absent. */
|
|
110
|
+
encodePercent?: number;
|
|
111
|
+
decodePercent?: number;
|
|
112
|
+
clockMHz?: number;
|
|
113
|
+
clockMaxMHz?: number;
|
|
114
|
+
memClockMHz?: number;
|
|
115
|
+
memClockMaxMHz?: number;
|
|
116
|
+
powerW?: number;
|
|
117
|
+
powerMaxW?: number;
|
|
118
|
+
tempC?: number;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** Static facts about one GPU — served by the hardware inventory, never per tick. */
|
|
122
|
+
export interface GpuInfo {
|
|
123
|
+
/** Same id as `GpuMetrics.id`. */
|
|
124
|
+
id: string;
|
|
125
|
+
name: string;
|
|
126
|
+
vendor?: string;
|
|
127
|
+
/** Kernel driver: "i915", "xe", "amdgpu", "nvidia". */
|
|
128
|
+
driver?: string;
|
|
129
|
+
driverVersion?: string;
|
|
130
|
+
/** Highest context the driver offers: "4.6", or "ES 3.2". Absent = unknown. */
|
|
131
|
+
openglVersion?: string;
|
|
132
|
+
/** Vulkan API version, "1.4.354". Absent = unsupported or unknown. */
|
|
133
|
+
vulkanVersion?: string;
|
|
134
|
+
pcieGen?: number;
|
|
135
|
+
pcieLanes?: number;
|
|
136
|
+
/** Only when different from the current link (Mission Center hides an equal one). */
|
|
137
|
+
pcieMaxGen?: number;
|
|
138
|
+
pcieMaxLanes?: number;
|
|
139
|
+
/** One combined video engine (Intel VCS): the UI shows "Video encode/decode". */
|
|
140
|
+
encodeDecodeShared?: boolean;
|
|
44
141
|
}
|
|
45
142
|
|
|
46
143
|
export interface SystemMetrics {
|
|
@@ -50,10 +147,63 @@ export interface SystemMetrics {
|
|
|
50
147
|
disk: RateMetrics;
|
|
51
148
|
/** light tier: available:false. */
|
|
52
149
|
net: RateMetrics;
|
|
53
|
-
/** light tier: []. Empty also when no
|
|
150
|
+
/** light tier: []. Empty also when no GPU is readable — the UI hides the card. */
|
|
54
151
|
gpus: GpuMetrics[];
|
|
55
152
|
/** light tier: 0. Processes the collector could see this tick. */
|
|
56
153
|
processCount: number;
|
|
154
|
+
/** Per-device figures for the Performance page's drive and network entries (full
|
|
155
|
+
* tier). Absent = not collected on this host; static facts about each device are
|
|
156
|
+
* in the hardware inventory (`src/types/system-hardware.ts`), keyed by `id`. */
|
|
157
|
+
disks?: DiskMetrics[];
|
|
158
|
+
nics?: NicMetrics[];
|
|
159
|
+
/** Absent where the host exposes no fan tachometer (most laptops, every VM). */
|
|
160
|
+
fans?: FanMetrics[];
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** One whole disk (a /sys/block entry), for Mission Center's per-drive page. */
|
|
164
|
+
export interface DiskMetrics {
|
|
165
|
+
/** Kernel name, the key into the inventory: "nvme0n1", "sda". */
|
|
166
|
+
id: string;
|
|
167
|
+
/** False on this device's first sample: the rates below need two of them, so the
|
|
168
|
+
* UI says "measuring…" rather than a confident 0. The two totals are absolutes
|
|
169
|
+
* and are always real. */
|
|
170
|
+
available: boolean;
|
|
171
|
+
/** "Active time": share of the tick with I/O in flight (iostat %util), 0-100. */
|
|
172
|
+
busyPercent: number;
|
|
173
|
+
/** "Avg. response time": ms per completed request (read + write + discard +
|
|
174
|
+
* flush) over the tick; 0 when none completed. */
|
|
175
|
+
responseMs: number;
|
|
176
|
+
readBps: number;
|
|
177
|
+
writeBps: number;
|
|
178
|
+
/** Bytes since boot ("Total Read" / "Total Written"). */
|
|
179
|
+
readTotal: number;
|
|
180
|
+
writeTotal: number;
|
|
181
|
+
/** Drive sensor, °C (NVMe composite, SATA via drivetemp); absent when none. */
|
|
182
|
+
tempC?: number;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export type NicState = "connected" | "connecting" | "disconnected" | "unavailable" | "unknown";
|
|
186
|
+
|
|
187
|
+
/** One network interface, for Mission Center's per-interface page. */
|
|
188
|
+
export interface NicMetrics {
|
|
189
|
+
/** Interface name, the key into the inventory: "enp3s0". */
|
|
190
|
+
id: string;
|
|
191
|
+
/** False on this interface's first sample (the rates need two). The totals are
|
|
192
|
+
* absolutes and are always real. */
|
|
193
|
+
available: boolean;
|
|
194
|
+
rxBps: number;
|
|
195
|
+
txBps: number;
|
|
196
|
+
/** Bytes since the interface came up ("Total Received" / "Total Sent"). */
|
|
197
|
+
rxTotal: number;
|
|
198
|
+
txTotal: number;
|
|
199
|
+
state: NicState;
|
|
200
|
+
/** Negotiated link speed, Mbit/s — Mission Center's "Maximum Bitrate", and the
|
|
201
|
+
* throughput axis ceiling when dynamic scaling is off. Absent when unknown. */
|
|
202
|
+
linkMbps?: number;
|
|
203
|
+
/** Wireless only. */
|
|
204
|
+
ssid?: string;
|
|
205
|
+
signalPercent?: number;
|
|
206
|
+
frequencyMHz?: number;
|
|
57
207
|
}
|
|
58
208
|
|
|
59
209
|
export interface ProcessInfo {
|
|
@@ -70,6 +220,16 @@ export interface ProcessInfo {
|
|
|
70
220
|
* Always 0 on a process's first observed tick. */
|
|
71
221
|
cpu: number;
|
|
72
222
|
ramMB: number;
|
|
223
|
+
/** Anonymous memory the kernel has pushed out to swap, MB — Mission Center's
|
|
224
|
+
* Swap column. `undefined` = this OS does not report it per process; a kernel
|
|
225
|
+
* thread, which has no address space at all, reports 0. */
|
|
226
|
+
swapMB?: number;
|
|
227
|
+
/** `"<scope>:<unit>"` — the Services row this pid belongs to, read from its
|
|
228
|
+
* cgroup ("system:sshd.service"). The scope is part of the key because
|
|
229
|
+
* `dbus-broker.service` exists in BOTH on an ordinary desktop. Absent on a
|
|
230
|
+
* host with no systemd, for a pid in no unit, and for another user's units.
|
|
231
|
+
* The Services page's live figures are summed over it. */
|
|
232
|
+
unitKey?: string;
|
|
73
233
|
/** Epoch ms UTC; 0 when unknown. Identity guard for CPU deltas, grouping and kill. */
|
|
74
234
|
startedAt: number;
|
|
75
235
|
/** PPM server, supervisor, edge forwarder, their descendants, PPM-managed
|
|
@@ -114,6 +274,7 @@ export interface ProcessGroup {
|
|
|
114
274
|
/** Roll-ups of the optional per-process columns, with the same optionality:
|
|
115
275
|
* the sum over the members that HAVE a value, and `undefined` when no member
|
|
116
276
|
* has one — so "nothing measurable" never renders as a hard 0. */
|
|
277
|
+
swapMB?: number;
|
|
117
278
|
diskReadBps?: number;
|
|
118
279
|
diskWriteBps?: number;
|
|
119
280
|
/** Summed engine busy across members, clamped 0-100. */
|
|
@@ -129,6 +290,8 @@ export interface ProcessColumnAvailability {
|
|
|
129
290
|
disk: boolean;
|
|
130
291
|
gpu: boolean;
|
|
131
292
|
net: boolean;
|
|
293
|
+
/** Linux only so far: `VmSwap` in `/proc/<pid>/status`. */
|
|
294
|
+
swap: boolean;
|
|
132
295
|
}
|
|
133
296
|
|
|
134
297
|
/** CLIENT-SIDE history element: aggregates only. There is no server ring. */
|
|
@@ -160,6 +323,10 @@ export interface MetricsSnapshot {
|
|
|
160
323
|
total: { cpu: number; ramMB: number; processCount: number };
|
|
161
324
|
/** Non-fatal collector failures, human readable. Rendered in the UI. */
|
|
162
325
|
warnings: string[];
|
|
326
|
+
/** Linux desktop apps (full tier). Absent on other hosts and from older servers. */
|
|
327
|
+
apps?: AppInfo[];
|
|
328
|
+
/** Signals this host can deliver. Absent = an older server (kill route only). */
|
|
329
|
+
signals?: ProcessSignal[];
|
|
163
330
|
}
|
|
164
331
|
|
|
165
332
|
export interface KillProcessRequest {
|
|
@@ -182,9 +349,71 @@ export interface KillProcessResult {
|
|
|
182
349
|
killed: number[];
|
|
183
350
|
}
|
|
184
351
|
|
|
352
|
+
/** Mission Center's process menu: "Stop" is TERM, "Force Stop" is KILL, and the
|
|
353
|
+
* "Send Signal" submenu offers all eight. Names without the `SIG` prefix. */
|
|
354
|
+
export type ProcessSignal = "TERM" | "KILL" | "STOP" | "CONT" | "HUP" | "INT" | "USR1" | "USR2";
|
|
355
|
+
|
|
356
|
+
export const PROCESS_SIGNALS: readonly ProcessSignal[] = ["TERM", "KILL", "STOP", "CONT", "HUP", "INT", "USR1", "USR2"];
|
|
357
|
+
|
|
358
|
+
export interface SignalProcessRequest {
|
|
359
|
+
pid: number;
|
|
360
|
+
/** Identity guard, exactly as for a kill: 409 when the live process started at
|
|
361
|
+
* another time, so a recycled pid is never signalled against a stale name. */
|
|
362
|
+
startedAt: number;
|
|
363
|
+
signal: ProcessSignal;
|
|
364
|
+
/** Deliver to the whole collected tree as well. Suspending an app means
|
|
365
|
+
* suspending its helpers, which signalling the root alone does not do. */
|
|
366
|
+
tree?: boolean;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
export interface SignalProcessResult {
|
|
370
|
+
pid: number;
|
|
371
|
+
signal: ProcessSignal;
|
|
372
|
+
tree: boolean;
|
|
373
|
+
method: "taskkill" | "signal";
|
|
374
|
+
/** Pids actually signalled (win32 + tree: `[pid]`, as for a kill). */
|
|
375
|
+
signalled: number[];
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/** On-demand facts for the Details dialog — fetched when it opens, never per tick.
|
|
379
|
+
* Live figures (CPU, memory, …) come from the snapshot row, not from here. Every
|
|
380
|
+
* field is null when this OS or this pid's permissions do not expose it. */
|
|
381
|
+
export interface ProcessDetails {
|
|
382
|
+
pid: number;
|
|
383
|
+
ppid: number;
|
|
384
|
+
name: string;
|
|
385
|
+
startedAt: number;
|
|
386
|
+
/** Full command line, secrets redacted but NOT truncated to the row's 160 chars. */
|
|
387
|
+
command: string | null;
|
|
388
|
+
exe: string | null;
|
|
389
|
+
cwd: string | null;
|
|
390
|
+
user: string | null;
|
|
391
|
+
/** Kernel state, e.g. "S (sleeping)", "T (stopped)". */
|
|
392
|
+
state: string | null;
|
|
393
|
+
threads: number | null;
|
|
394
|
+
nice: number | null;
|
|
395
|
+
/** Linux cgroup path — which systemd unit or app scope the process runs in. */
|
|
396
|
+
cgroup: string | null;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/** A running desktop application — Mission Center's "Apps" section. Linux only:
|
|
400
|
+
* identified from the user's app cgroups and `.desktop` Exec matching. */
|
|
401
|
+
export interface AppInfo {
|
|
402
|
+
/** Desktop file id without `.desktop`: "org.kde.konsole". Stable across ticks. */
|
|
403
|
+
id: string;
|
|
404
|
+
/** The entry's unlocalised `Name=`. */
|
|
405
|
+
name: string;
|
|
406
|
+
/** The entry's `Icon=`: a theme icon name or an absolute path; resolved to an
|
|
407
|
+
* image by `/api/system/app-icon`. Null when the entry has none. */
|
|
408
|
+
icon: string | null;
|
|
409
|
+
/** Primary pids: app pids whose parent is not also one of this app's pids. Each
|
|
410
|
+
* stands for its whole subtree, which is what an app row's figures sum over. */
|
|
411
|
+
pids: number[];
|
|
412
|
+
}
|
|
413
|
+
|
|
185
414
|
/** Sort columns offered by the process table. `disk` sorts by read + write,
|
|
186
415
|
* `net` by in + out; rows without a value sort last. */
|
|
187
|
-
export type SortKey = "cpu" | "ram" | "disk" | "gpu" | "gpuMem" | "net" | "name" | null;
|
|
416
|
+
export type SortKey = "cpu" | "ram" | "swap" | "disk" | "gpu" | "gpuMem" | "net" | "name" | null;
|
|
188
417
|
export type SortDir = "asc" | "desc";
|
|
189
418
|
|
|
190
419
|
/** Full-tier poll cadence. A Windows tick (one CIM round trip) costs ~175-200 ms,
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** Service-manager contract shared by the systemd collector, the routes and the web
|
|
2
|
+
* client — Mission Center's Services page. Types + constants only, no imports, so
|
|
3
|
+
* both bundles can take it. Import RELATIVELY — the "@" alias points at src/web. */
|
|
4
|
+
|
|
5
|
+
export type ServiceScope = "system" | "user";
|
|
6
|
+
|
|
7
|
+
/** Start/Stop/Restart are Mission Center's menu; Enable/Disable its details switch. */
|
|
8
|
+
export type ServiceAction = "start" | "stop" | "restart" | "enable" | "disable";
|
|
9
|
+
|
|
10
|
+
export const SERVICE_ACTIONS: readonly ServiceAction[] = ["start", "stop", "restart", "enable", "disable"];
|
|
11
|
+
|
|
12
|
+
/** One unit. Mission Center lists `.service`, `.socket` and `.mount` units and drops
|
|
13
|
+
* the ones systemd reports as `not-found`; masked units stay in the list. */
|
|
14
|
+
export interface ServiceInfo {
|
|
15
|
+
/** Full unit name, suffix included: "sshd.service", "docker.socket", "home.mount". */
|
|
16
|
+
unit: string;
|
|
17
|
+
scope: ServiceScope;
|
|
18
|
+
description: string;
|
|
19
|
+
/** systemd ActiveState verbatim: "active", "inactive", "failed", "activating", … */
|
|
20
|
+
activeState: string;
|
|
21
|
+
/** systemd SubState verbatim: "running", "exited", "dead", "listening", … */
|
|
22
|
+
subState: string;
|
|
23
|
+
/** Unit-file state verbatim ("enabled", "disabled", "static", "masked", "indirect", …);
|
|
24
|
+
* null for a unit with no unit file (transient, generated without one). */
|
|
25
|
+
unitFileState: string | null;
|
|
26
|
+
/** Mission Center's three booleans, derived exactly as it does: ActiveState "active",
|
|
27
|
+
* ActiveState "failed", and unit-file state exactly "enabled" (static/indirect/alias
|
|
28
|
+
* count as not enabled). `activating`/`reloading` are neither running nor failed. */
|
|
29
|
+
running: boolean;
|
|
30
|
+
failed: boolean;
|
|
31
|
+
enabled: boolean;
|
|
32
|
+
/** Main process, null when the unit has none (stopped, socket, mount, oneshot done). */
|
|
33
|
+
mainPid: number | null;
|
|
34
|
+
/** Actions the guard refuses for this unit, each with the reason shown to the user.
|
|
35
|
+
* Produced by the same function the action route enforces, so a disabled button
|
|
36
|
+
* and a 403 cannot disagree. Absent when every action is allowed. */
|
|
37
|
+
refused?: Partial<Record<ServiceAction, string>>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface ServicesSnapshot {
|
|
41
|
+
/** False when the host has no supported service manager (no systemd). The UI hides
|
|
42
|
+
* the Services page, as Mission Center does when both lists stay empty. */
|
|
43
|
+
supported: boolean;
|
|
44
|
+
services: ServiceInfo[];
|
|
45
|
+
/** Non-fatal failures, human readable (e.g. the user manager is unreachable). */
|
|
46
|
+
warnings: string[];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface ServiceLogLine {
|
|
50
|
+
/** Epoch ms UTC. */
|
|
51
|
+
ts: number;
|
|
52
|
+
message: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface ServiceDetails extends ServiceInfo {
|
|
56
|
+
/** Configured `User=` / `Group=`; null when unset (runs as the manager's user). */
|
|
57
|
+
user: string | null;
|
|
58
|
+
group: string | null;
|
|
59
|
+
/** Unit file location (`FragmentPath`), null when unknown. */
|
|
60
|
+
fragmentPath: string | null;
|
|
61
|
+
/** This boot's journal for the unit, oldest first, bounded. */
|
|
62
|
+
logs: ServiceLogLine[];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface ServiceActionResult {
|
|
66
|
+
unit: string;
|
|
67
|
+
scope: ServiceScope;
|
|
68
|
+
action: ServiceAction;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Client poll cadence while the Services page is visible. The list costs a handful of
|
|
72
|
+
* `systemctl` spawns, so it is fetched on demand rather than riding the metrics tick. */
|
|
73
|
+
export const SERVICES_POLL_INTERVAL_MS = 3000;
|
|
@@ -28,7 +28,9 @@ import { BottomSheet } from "@/components/ui/mobile-bottom-sheet";
|
|
|
28
28
|
import { GitRepoBar, GitRepoChoice, GitNoRepo } from "@/components/git/git-repo-picker";
|
|
29
29
|
import { FileIcon } from "@/lib/file-icons";
|
|
30
30
|
import { buildTree, compactTree } from "@/lib/git-file-tree";
|
|
31
|
-
import {
|
|
31
|
+
import { TreeRow } from "./branch-review-tree-row";
|
|
32
|
+
import { StartEllipsis } from "@/components/ui/start-ellipsis";
|
|
33
|
+
import { BranchSelect } from "@/components/git/branch-select";
|
|
32
34
|
import {
|
|
33
35
|
Check, ChevronDown, ChevronRight, FileText, Loader2, RefreshCw, ListChecks, ArrowRight,
|
|
34
36
|
} from "@/lib/icons";
|
|
@@ -246,30 +248,28 @@ export function BranchReviewTab({ metadata }: BranchReviewTabProps) {
|
|
|
246
248
|
)}
|
|
247
249
|
|
|
248
250
|
{/*
|
|
249
|
-
|
|
250
|
-
hundreds of branches,
|
|
251
|
-
|
|
251
|
+
A searchable picker rather than a native `<select>`: the list is the
|
|
252
|
+
whole problem here — hundreds of branches, all sharing a prefix — and a
|
|
253
|
+
native picker cannot be filtered. See `branch-select.tsx`.
|
|
252
254
|
*/}
|
|
253
255
|
<div className="flex items-center gap-2 px-2 py-1.5 border-b border-border shrink-0 flex-wrap">
|
|
254
|
-
<
|
|
256
|
+
<BranchSelect
|
|
255
257
|
value={base}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
</select>
|
|
258
|
+
branches={branches}
|
|
259
|
+
onChange={setBase}
|
|
260
|
+
label="Base branch"
|
|
261
|
+
testId="branch-review-base"
|
|
262
|
+
className="max-w-[38%]"
|
|
263
|
+
/>
|
|
263
264
|
<ArrowRight className="size-3.5 text-text-3 shrink-0" />
|
|
264
|
-
<
|
|
265
|
+
<BranchSelect
|
|
265
266
|
value={head}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
</select>
|
|
267
|
+
branches={branches}
|
|
268
|
+
onChange={setHead}
|
|
269
|
+
label="Branch to review"
|
|
270
|
+
testId="branch-review-head"
|
|
271
|
+
className="max-w-[38%]"
|
|
272
|
+
/>
|
|
273
273
|
|
|
274
274
|
<div className="ml-auto flex items-center gap-2">
|
|
275
275
|
<span className="text-xs text-text-2 tabular-nums" data-testid="branch-review-progress">
|
|
@@ -18,6 +18,7 @@ import { Check, ChevronDown, ChevronRight } from "@/lib/icons";
|
|
|
18
18
|
import { FileIcon } from "@/lib/file-icons";
|
|
19
19
|
import { isReviewed, type ReviewState } from "@/lib/branch-review-state";
|
|
20
20
|
import type { TreeNode } from "@/lib/git-file-tree";
|
|
21
|
+
import { StartEllipsis } from "@/components/ui/start-ellipsis";
|
|
21
22
|
import type { BranchDiffFile } from "../../../types/git";
|
|
22
23
|
|
|
23
24
|
export const STATUS_COLORS: Record<BranchDiffFile["status"], string> = {
|
|
@@ -32,19 +33,6 @@ export const STATUS_COLORS: Record<BranchDiffFile["status"], string> = {
|
|
|
32
33
|
/** Indent per nesting level, matching the Source Control tree. */
|
|
33
34
|
export const TREE_INDENT = 14;
|
|
34
35
|
|
|
35
|
-
/**
|
|
36
|
-
* Ellipsize from the start, so the end of a path — the part that differs —
|
|
37
|
-
* survives. Same trick as the Source Control panel: a right-to-left box cuts at
|
|
38
|
-
* its left edge, and `<bdi>` keeps the name itself reading left to right.
|
|
39
|
-
*/
|
|
40
|
-
export function StartEllipsis({ children }: { children: string }) {
|
|
41
|
-
return (
|
|
42
|
-
<span dir="rtl" className="truncate text-left min-w-0 flex-1">
|
|
43
|
-
<bdi>{children}</bdi>
|
|
44
|
-
</span>
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
36
|
export interface TreeRowProps {
|
|
49
37
|
node: TreeNode;
|
|
50
38
|
depth: number;
|
|
@@ -301,6 +301,7 @@ function ChatTabContent({ metadata, tabId, onNewSession, onFork, historyFilter }
|
|
|
301
301
|
pendingApproval,
|
|
302
302
|
contextWindowPct,
|
|
303
303
|
compactStatus,
|
|
304
|
+
promptCache,
|
|
304
305
|
mcpNeedsAuth,
|
|
305
306
|
statusMessage,
|
|
306
307
|
sessionTitle,
|
|
@@ -1027,6 +1028,7 @@ function ChatTabContent({ metadata, tabId, onNewSession, onFork, historyFilter }
|
|
|
1027
1028
|
connectingElapsed={connectingElapsed}
|
|
1028
1029
|
statusMessage={statusMessage}
|
|
1029
1030
|
compactStatus={compactStatus}
|
|
1031
|
+
promptCache={promptCache}
|
|
1030
1032
|
projectName={projectName}
|
|
1031
1033
|
onFork={!isStreaming ? handleFork : undefined}
|
|
1032
1034
|
onEdit={!isStreaming ? handleEdit : undefined}
|
|
@@ -1158,6 +1160,7 @@ function ChatTabContent({ metadata, tabId, onNewSession, onFork, historyFilter }
|
|
|
1158
1160
|
onEffortChange={setEffort}
|
|
1159
1161
|
thinking={thinking}
|
|
1160
1162
|
onThinkingChange={setThinking}
|
|
1163
|
+
promptCache={promptCache}
|
|
1161
1164
|
/>
|
|
1162
1165
|
)}
|
|
1163
1166
|
</div>
|
|
@@ -27,6 +27,7 @@ import { UsagePanelShell } from "./usage-panel-shell";
|
|
|
27
27
|
|
|
28
28
|
import { CODEX_SIGNED_OUT_HINT, type CodexAccount } from "@/components/settings/accounts/use-codex-accounts";
|
|
29
29
|
import { CodexSignInAgainDialog } from "@/components/settings/accounts/codex-sign-in-again-dialog";
|
|
30
|
+
import { CodexResetCreditButton } from "@/components/settings/accounts/codex-reset-credit-button";
|
|
30
31
|
type Usage = Pick<UsageInfo, "fiveHour" | "sevenDay" | "session" | "weekly" | "resetCredits">;
|
|
31
32
|
|
|
32
33
|
/** Matches the whole-percent figure the bars show, so a refusal agrees with the card. */
|
|
@@ -212,6 +213,9 @@ export function CodexUsagePanel({ onClose, usage, onReload, onSelectAccount, sel
|
|
|
212
213
|
dailyGuardToggling={togglingId === a.id}
|
|
213
214
|
reauthHint={a.signedOut ? CODEX_SIGNED_OUT_HINT : undefined}
|
|
214
215
|
resetCredits={u.resetCredits}
|
|
216
|
+
resetCreditAction={
|
|
217
|
+
<CodexResetCreditButton account={a} usage={u} onDone={(m) => { setPanelError(m); void reload(); }} />
|
|
218
|
+
}
|
|
215
219
|
// Only a ChatGPT sign-in can be renewed in place; a dead API key is replaced.
|
|
216
220
|
onReauth={a.type === "chatgpt" ? () => setSignInAgain(a) : undefined}
|
|
217
221
|
/>
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Layers } from "@/lib/icons";
|
|
2
|
+
import type { CompactionInfo } from "../../../types/chat";
|
|
3
|
+
import { fmtTokens } from "../../../shared/turn-usage";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The rule above a compact summary, saying what that compaction did.
|
|
7
|
+
*
|
|
8
|
+
* Compaction is the largest thing that happens to a chat and the only one with no
|
|
9
|
+
* visible cause: most of the history stops being sent, the next turn's prefix
|
|
10
|
+
* collapses, and all the transcript shows for it is a long summary message that
|
|
11
|
+
* reads like something the assistant chose to write. Naming it — and how much it
|
|
12
|
+
* dropped — is what makes the rest of the conversation legible.
|
|
13
|
+
*
|
|
14
|
+
* Deliberately not interactive. Loading the messages it replaced is already the job
|
|
15
|
+
* of the scroll-to-top expansion right above it, and a second control for the same
|
|
16
|
+
* thing would be two affordances competing over one gesture.
|
|
17
|
+
*/
|
|
18
|
+
export function CompactionDivider({ compaction }: { compaction: CompactionInfo }) {
|
|
19
|
+
const { trigger, preTokens, postTokens, savedTokens, durationMs } = compaction;
|
|
20
|
+
|
|
21
|
+
const detail = [
|
|
22
|
+
trigger === "manual" ? "Ran with /compact" : "Ran automatically on a full context window",
|
|
23
|
+
`${fmtTokens(preTokens)} → ${fmtTokens(postTokens)} tokens`,
|
|
24
|
+
...(durationMs != null ? [`took ${formatDuration(durationMs)}`] : []),
|
|
25
|
+
].join(" · ");
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<div className="flex items-center gap-2 pt-2 text-[11px] text-text-subtle" title={detail}>
|
|
29
|
+
<div className="h-px flex-1 bg-border" />
|
|
30
|
+
<span className="flex shrink-0 items-center gap-1.5">
|
|
31
|
+
<Layers className="size-3.5" />
|
|
32
|
+
{/* `tabular-nums` so the figure does not jitter when a re-read changes it. */}
|
|
33
|
+
<span className="tabular-nums">
|
|
34
|
+
Compacted session · saved {fmtTokens(savedTokens)} tokens
|
|
35
|
+
</span>
|
|
36
|
+
</span>
|
|
37
|
+
<div className="h-px flex-1 bg-border" />
|
|
38
|
+
</div>
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Coarse on purpose: this is a footnote, and a compaction is never sub-second. */
|
|
43
|
+
function formatDuration(ms: number): string {
|
|
44
|
+
const seconds = Math.round(ms / 1000);
|
|
45
|
+
if (seconds < 60) return `${seconds}s`;
|
|
46
|
+
const minutes = Math.floor(seconds / 60);
|
|
47
|
+
return `${minutes}m ${seconds % 60}s`;
|
|
48
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Clock } from "@/lib/icons";
|
|
2
|
+
import { useMinuteClock } from "@/hooks/use-minute-clock";
|
|
3
|
+
import type { PromptCacheState } from "../../../shared/prompt-cache-idle";
|
|
4
|
+
import { idleCacheNotice, formatIdleDuration, formatContextTokens } from "../../../shared/prompt-cache-idle";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* How long the session has been idle, when that has stopped being free.
|
|
8
|
+
*
|
|
9
|
+
* Sits above the composer rather than in the transcript: it describes what the *next*
|
|
10
|
+
* message will cost, not anything that has happened, and the transcript is a record of
|
|
11
|
+
* what did. It disappears on its own the moment a turn starts, because by then the
|
|
12
|
+
* decision it exists to inform has been made.
|
|
13
|
+
*
|
|
14
|
+
* Says one of two things. A compaction replaced the conversation, so the cache holds a prefix
|
|
15
|
+
* that will never be sent again — that is reported without a token figure, because the
|
|
16
|
+
* summary it produced has not been through an API call yet and nothing has measured it.
|
|
17
|
+
* Otherwise the cache simply lapsed, and the transcript still standing is what gets re-sent.
|
|
18
|
+
*
|
|
19
|
+
* Names a token figure only when one was measured. `modelUsage` cannot supply it — the SDK
|
|
20
|
+
* accumulates it across the session and across subagents, which is what once printed "1.0M
|
|
21
|
+
* tokens" against a window of the same size — so the number comes from the turn's last
|
|
22
|
+
* top-level assistant message instead (`TurnUsage.contextTokens`). Turns recorded before PPM
|
|
23
|
+
* measured that carry none, and the sentence has to stand without it.
|
|
24
|
+
*
|
|
25
|
+
* Owns its outer padding so that "no notice" costs no layout: the caller renders this
|
|
26
|
+
* unconditionally, and a wrapper with padding around nothing is a gap above the composer
|
|
27
|
+
* that appears for no reason.
|
|
28
|
+
*/
|
|
29
|
+
export function IdleCacheNotice({ promptCache }: { promptCache: PromptCacheState | null }) {
|
|
30
|
+
const notice = idleCacheNotice(promptCache, useMinuteClock());
|
|
31
|
+
if (!notice) return null;
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
// Same `px-4 pt-4 pb-4` as the approval/thinking block below, so the notice keeps the
|
|
35
|
+
// composer's breathing room instead of sitting on top of it.
|
|
36
|
+
<div className="px-4 pt-4 pb-4 select-none">
|
|
37
|
+
{/* `w-fit` rather than a full-width row: this is one sentence, and a thin bordered
|
|
38
|
+
box stretched across an ultrawide reads as a broken layout. It still falls back
|
|
39
|
+
to the available width — and wraps — on a phone. */}
|
|
40
|
+
<div className="flex w-fit items-start gap-2 rounded-md border border-border bg-surface px-2.5 py-2 text-[11px] text-text-secondary">
|
|
41
|
+
<Clock className="mt-px size-3.5 shrink-0 text-text-subtle" />
|
|
42
|
+
{notice.reason === "compacted" ? (
|
|
43
|
+
<span>
|
|
44
|
+
The conversation was compacted{" "}
|
|
45
|
+
<span className="tabular-nums">{formatIdleDuration(notice.idleMs)}</span> ago, so the
|
|
46
|
+
prompt cache no longer covers it and your next message will re-cache it.
|
|
47
|
+
</span>
|
|
48
|
+
) : (
|
|
49
|
+
<span>
|
|
50
|
+
Idle <span className="tabular-nums">{formatIdleDuration(notice.idleMs)}</span>. The
|
|
51
|
+
prompt cache has likely expired, so your next message re-sends{" "}
|
|
52
|
+
{notice.contextTokens != null ? (
|
|
53
|
+
<>
|
|
54
|
+
about{" "}
|
|
55
|
+
<span className="tabular-nums">{formatContextTokens(notice.contextTokens)}</span>{" "}
|
|
56
|
+
tokens
|
|
57
|
+
</>
|
|
58
|
+
) : (
|
|
59
|
+
"the whole transcript"
|
|
60
|
+
)}{" "}
|
|
61
|
+
at full price.
|
|
62
|
+
</span>
|
|
63
|
+
)}
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
);
|
|
67
|
+
}
|