@hienlh/ppm 0.23.26 → 0.23.27

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.
Files changed (586) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/assets/skills/ppm/SKILL.md +1 -1
  3. package/assets/skills/ppm/references/http-api.md +1 -1
  4. package/dist/web/assets/accounts-settings-section-CZglHifc.js +1 -0
  5. package/dist/web/assets/accounts-settings-section-CZglHifc.js.br +0 -0
  6. package/dist/web/assets/accounts-settings-section-CZglHifc.js.gz +0 -0
  7. package/dist/web/assets/{agent-session-sheet-DmbSfFGz.js → agent-session-sheet-B3VLD2H6.js} +2 -2
  8. package/dist/web/assets/agent-session-sheet-B3VLD2H6.js.br +0 -0
  9. package/dist/web/assets/agent-session-sheet-B3VLD2H6.js.gz +0 -0
  10. package/dist/web/assets/{agent-session-window-content-Dk8x3ozF.js → agent-session-window-content-HEdIT_LQ.js} +1 -1
  11. package/dist/web/assets/agent-session-window-content-HEdIT_LQ.js.br +0 -0
  12. package/dist/web/assets/agent-session-window-content-HEdIT_LQ.js.gz +0 -0
  13. package/dist/web/assets/{ai-resource-editor-MKwjYcDh.js → ai-resource-editor-CFbXgGMo.js} +1 -1
  14. package/dist/web/assets/ai-resource-editor-CFbXgGMo.js.br +0 -0
  15. package/dist/web/assets/ai-resource-editor-CFbXgGMo.js.gz +0 -0
  16. package/dist/web/assets/ai-settings-section-BNiVD9D3.js +1 -0
  17. package/dist/web/assets/ai-settings-section-BNiVD9D3.js.br +0 -0
  18. package/dist/web/assets/ai-settings-section-BNiVD9D3.js.gz +0 -0
  19. package/dist/web/assets/{ai-settings-section-OZOaLw5z.js → ai-settings-section-W0kfADRB.js} +1 -1
  20. package/dist/web/assets/{android-tab-CUkjbfyi.js → android-tab-CY3aa_vU.js} +1 -1
  21. package/dist/web/assets/android-tab-CY3aa_vU.js.br +0 -0
  22. package/dist/web/assets/android-tab-CY3aa_vU.js.gz +0 -0
  23. package/dist/web/assets/{appearance-settings-section-BZsM8HpZ.js → appearance-settings-section-lbtuzecW.js} +1 -1
  24. package/dist/web/assets/appearance-settings-section-lbtuzecW.js.br +0 -0
  25. package/dist/web/assets/appearance-settings-section-lbtuzecW.js.gz +0 -0
  26. package/dist/web/assets/{apps-panel-Cs3utBlp.js → apps-panel-CF2mbvVq.js} +1 -1
  27. package/dist/web/assets/apps-panel-CF2mbvVq.js.br +0 -0
  28. package/dist/web/assets/apps-panel-CF2mbvVq.js.gz +0 -0
  29. package/dist/web/assets/branch-review-tab-CR7JnS5x.js +1 -0
  30. package/dist/web/assets/branch-review-tab-CR7JnS5x.js.br +0 -0
  31. package/dist/web/assets/branch-review-tab-CR7JnS5x.js.gz +0 -0
  32. package/dist/web/assets/chat-tab-BCELq4nK.js +1 -0
  33. package/dist/web/assets/chat-tab-BCELq4nK.js.br +0 -0
  34. package/dist/web/assets/chat-tab-BCELq4nK.js.gz +0 -0
  35. package/dist/web/assets/{chat-tab-DtSHSfMU.js → chat-tab-C4aOYSea.js} +10 -10
  36. package/dist/web/assets/chat-tab-C4aOYSea.js.br +0 -0
  37. package/dist/web/assets/chat-tab-C4aOYSea.js.gz +0 -0
  38. package/dist/web/assets/{code-editor-DjDyhff1.js → code-editor-_axJbYkP.js} +5 -5
  39. package/dist/web/assets/code-editor-_axJbYkP.js.br +0 -0
  40. package/dist/web/assets/code-editor-_axJbYkP.js.gz +0 -0
  41. package/dist/web/assets/{codex-reset-credit-button-BKgiUi8E.js → codex-reset-credit-button-DJQD6NUF.js} +1 -1
  42. package/dist/web/assets/codex-reset-credit-button-DJQD6NUF.js.br +0 -0
  43. package/dist/web/assets/codex-reset-credit-button-DJQD6NUF.js.gz +0 -0
  44. package/dist/web/assets/{conflict-editor-DgTv-8pb.js → conflict-editor-D0AYuLKI.js} +3 -3
  45. package/dist/web/assets/conflict-editor-D0AYuLKI.js.br +0 -0
  46. package/dist/web/assets/conflict-editor-D0AYuLKI.js.gz +0 -0
  47. package/dist/web/assets/connection-form-tab-C3QyUWnE.js +4 -0
  48. package/dist/web/assets/connection-form-tab-C3QyUWnE.js.br +0 -0
  49. package/dist/web/assets/connection-form-tab-C3QyUWnE.js.gz +0 -0
  50. package/dist/web/assets/{csv-preview-BTGpYs4p.js → csv-preview-CmKkcz4M.js} +1 -1
  51. package/dist/web/assets/csv-preview-CmKkcz4M.js.br +0 -0
  52. package/dist/web/assets/csv-preview-CmKkcz4M.js.gz +0 -0
  53. package/dist/web/assets/{db-explorer-store-DDePT3UI.js → db-explorer-store-DJNNIfN5.js} +1 -1
  54. package/dist/web/assets/db-explorer-store-DJNNIfN5.js.br +0 -0
  55. package/dist/web/assets/db-explorer-store-DJNNIfN5.js.gz +0 -0
  56. package/dist/web/assets/{db-sidebar-reveal-BeT8cp6P.js → db-sidebar-reveal-CGqWBYay.js} +1 -1
  57. package/dist/web/assets/db-sidebar-reveal-CGqWBYay.js.br +0 -0
  58. package/dist/web/assets/db-sidebar-reveal-CGqWBYay.js.gz +0 -0
  59. package/dist/web/assets/{db-tab-parts-BYzd4_sR.js → db-tab-parts-BXL34wrZ.js} +1 -1
  60. package/dist/web/assets/db-tab-parts-BXL34wrZ.js.br +0 -0
  61. package/dist/web/assets/db-tab-parts-BXL34wrZ.js.gz +0 -0
  62. package/dist/web/assets/{design-settings-section-B3KQBggK.js → design-settings-section-DukfVtwP.js} +2 -2
  63. package/dist/web/assets/design-settings-section-DukfVtwP.js.br +0 -0
  64. package/dist/web/assets/design-settings-section-DukfVtwP.js.gz +0 -0
  65. package/dist/web/assets/{design-tab-CPyj_nFg.js → design-tab-BoPiL2ge.js} +5 -5
  66. package/dist/web/assets/design-tab-BoPiL2ge.js.br +0 -0
  67. package/dist/web/assets/design-tab-BoPiL2ge.js.gz +0 -0
  68. package/dist/web/assets/{designs-sidebar-panel-DIGPFo2l.js → designs-sidebar-panel-BVTqPPzG.js} +1 -1
  69. package/dist/web/assets/designs-sidebar-panel-BVTqPPzG.js.br +0 -0
  70. package/dist/web/assets/designs-sidebar-panel-BVTqPPzG.js.gz +0 -0
  71. package/dist/web/assets/diff-viewer-C86mR7vD.js +4 -0
  72. package/dist/web/assets/diff-viewer-C86mR7vD.js.br +0 -0
  73. package/dist/web/assets/diff-viewer-C86mR7vD.js.gz +0 -0
  74. package/dist/web/assets/{docx-preview-CowHGqML.js → docx-preview-B9EhDCMi.js} +1 -1
  75. package/dist/web/assets/docx-preview-B9EhDCMi.js.br +0 -0
  76. package/dist/web/assets/docx-preview-B9EhDCMi.js.gz +0 -0
  77. package/dist/web/assets/{editor-dialog-xPoehDYp.js → editor-dialog-DTDsbJd6.js} +1 -1
  78. package/dist/web/assets/editor-dialog-DTDsbJd6.js.br +0 -0
  79. package/dist/web/assets/editor-dialog-DTDsbJd6.js.gz +0 -0
  80. package/dist/web/assets/{editor-language-service-DdYqCDBU.js → editor-language-service-BtrrQAS2.js} +1 -1
  81. package/dist/web/assets/editor-language-service-BtrrQAS2.js.br +0 -0
  82. package/dist/web/assets/editor-language-service-BtrrQAS2.js.gz +0 -0
  83. package/dist/web/assets/explorer-body-DLaWmxri.js +2 -0
  84. package/dist/web/assets/explorer-body-DLaWmxri.js.br +0 -0
  85. package/dist/web/assets/explorer-body-DLaWmxri.js.gz +0 -0
  86. package/dist/web/assets/{explorer-model-tGyFETP_.js → explorer-model-f5q-50DN.js} +1 -1
  87. package/dist/web/assets/explorer-model-f5q-50DN.js.br +0 -0
  88. package/dist/web/assets/explorer-model-f5q-50DN.js.gz +0 -0
  89. package/dist/web/assets/{explorer-window-content-B1c4QTVL.js → explorer-window-content-CbUIbrzL.js} +1 -1
  90. package/dist/web/assets/explorer-window-content-CbUIbrzL.js.br +0 -0
  91. package/dist/web/assets/explorer-window-content-CbUIbrzL.js.gz +0 -0
  92. package/dist/web/assets/{extension-manager-section-BgL0Uyl3.js → extension-manager-section-BpKMyLwI.js} +1 -1
  93. package/dist/web/assets/extension-manager-section-BpKMyLwI.js.br +0 -0
  94. package/dist/web/assets/extension-manager-section-BpKMyLwI.js.gz +0 -0
  95. package/dist/web/assets/{extension-webview-BWB1Yd-t.js → extension-webview-BGfyaXMI.js} +1 -1
  96. package/dist/web/assets/extension-webview-BGfyaXMI.js.br +0 -0
  97. package/dist/web/assets/extension-webview-BGfyaXMI.js.gz +0 -0
  98. package/dist/web/assets/{files-settings-section-TmoewoO2.js → files-settings-section-CQT9_rX2.js} +1 -1
  99. package/dist/web/assets/files-settings-section-CQT9_rX2.js.br +0 -0
  100. package/dist/web/assets/files-settings-section-CQT9_rX2.js.gz +0 -0
  101. package/dist/web/assets/{general-settings-section-Bu7o8uUn.js → general-settings-section-BoQGeqBi.js} +1 -1
  102. package/dist/web/assets/general-settings-section-BoQGeqBi.js.br +0 -0
  103. package/dist/web/assets/general-settings-section-BoQGeqBi.js.gz +0 -0
  104. package/dist/web/assets/{git-log-panel-RjMZIaCk.js → git-log-panel-T8Fzn8-5.js} +1 -1
  105. package/dist/web/assets/git-log-panel-T8Fzn8-5.js.br +0 -0
  106. package/dist/web/assets/git-log-panel-T8Fzn8-5.js.gz +0 -0
  107. package/dist/web/assets/git-review-tab-WzuX4Ml9.js +3 -0
  108. package/dist/web/assets/git-review-tab-WzuX4Ml9.js.br +0 -0
  109. package/dist/web/assets/git-review-tab-WzuX4Ml9.js.gz +0 -0
  110. package/dist/web/assets/{glide-data-grid-DqlTFhhf.js → glide-data-grid-BBzGDYvj.js} +8 -8
  111. package/dist/web/assets/glide-data-grid-BBzGDYvj.js.br +0 -0
  112. package/dist/web/assets/glide-data-grid-BBzGDYvj.js.gz +0 -0
  113. package/dist/web/assets/{grid-save-dialog-BmF2Gy_E.js → grid-save-dialog-HiqlnSky.js} +1 -1
  114. package/dist/web/assets/grid-save-dialog-HiqlnSky.js.br +0 -0
  115. package/dist/web/assets/grid-save-dialog-HiqlnSky.js.gz +0 -0
  116. package/dist/web/assets/group-chat-tab-URU3FCLs.js +1 -0
  117. package/dist/web/assets/group-chat-tab-URU3FCLs.js.br +0 -0
  118. package/dist/web/assets/group-chat-tab-URU3FCLs.js.gz +0 -0
  119. package/dist/web/assets/{impexp-tab-B8d4oBOB.js → impexp-tab-B0m1Q8ia.js} +1 -1
  120. package/dist/web/assets/impexp-tab-B0m1Q8ia.js.br +0 -0
  121. package/dist/web/assets/impexp-tab-B0m1Q8ia.js.gz +0 -0
  122. package/dist/web/assets/index-Cb3Z6wNy.css +1 -0
  123. package/dist/web/assets/index-Cb3Z6wNy.css.br +0 -0
  124. package/dist/web/assets/{index-2_Pz5MiI.css.gz → index-Cb3Z6wNy.css.gz} +0 -0
  125. package/dist/web/assets/{index-Cx9ZRibz.js → index-Vd9Xr54k.js} +19 -19
  126. package/dist/web/assets/index-Vd9Xr54k.js.br +0 -0
  127. package/dist/web/assets/index-Vd9Xr54k.js.gz +0 -0
  128. package/dist/web/assets/{jira-watcher-section-LGTWVN87.js → jira-watcher-section-CnSTbAF6.js} +1 -1
  129. package/dist/web/assets/keybindings-store-D_U8jECl.js +1 -0
  130. package/dist/web/assets/{keyboard-shortcuts-section-BSMgmbOR.js → keyboard-shortcuts-section-CU7JjDsU.js} +1 -1
  131. package/dist/web/assets/keyboard-shortcuts-section-CU7JjDsU.js.br +0 -0
  132. package/dist/web/assets/keyboard-shortcuts-section-CU7JjDsU.js.gz +0 -0
  133. package/dist/web/assets/{language-servers-section-DO9wnwnG.js → language-servers-section-CzUG9H69.js} +2 -2
  134. package/dist/web/assets/language-servers-section-CzUG9H69.js.br +0 -0
  135. package/dist/web/assets/language-servers-section-CzUG9H69.js.gz +0 -0
  136. package/dist/web/assets/logs-app-CDSvyY1H.js +13 -0
  137. package/dist/web/assets/logs-app-CDSvyY1H.js.br +0 -0
  138. package/dist/web/assets/logs-app-CDSvyY1H.js.gz +0 -0
  139. package/dist/web/assets/logs-tab-CQw9vrNw.js +1 -0
  140. package/dist/web/assets/{logs-window-content-Cejko0VD.js → logs-window-content-CGvPnPrr.js} +1 -1
  141. package/dist/web/assets/{lsp-client-IsC8Ol0U.js → lsp-client-CpjPUUYJ.js} +1 -1
  142. package/dist/web/assets/lsp-client-CpjPUUYJ.js.br +0 -0
  143. package/dist/web/assets/lsp-client-CpjPUUYJ.js.gz +0 -0
  144. package/dist/web/assets/{markdown-renderer-D5vxN2fO.js → markdown-renderer-3ZR2x0CC.js} +1 -1
  145. package/dist/web/assets/{markdown-renderer-BfZiHaNy.js → markdown-renderer-DZNMRg6p.js} +2 -2
  146. package/dist/web/assets/markdown-renderer-DZNMRg6p.js.br +0 -0
  147. package/dist/web/assets/markdown-renderer-DZNMRg6p.js.gz +0 -0
  148. package/dist/web/assets/{mobile-explorer-sheet-Dz3eJdBl.js → mobile-explorer-sheet-D7e-MM6m.js} +1 -1
  149. package/dist/web/assets/mobile-explorer-sheet-D7e-MM6m.js.br +0 -0
  150. package/dist/web/assets/mobile-explorer-sheet-D7e-MM6m.js.gz +0 -0
  151. package/dist/web/assets/{new-design-dialog-B8zeJoJQ.js → new-design-dialog-BthM423i.js} +1 -1
  152. package/dist/web/assets/new-design-dialog-BthM423i.js.br +0 -0
  153. package/dist/web/assets/new-design-dialog-BthM423i.js.gz +0 -0
  154. package/dist/web/assets/notification-store-GKweleCQ.js +1 -0
  155. package/dist/web/assets/{notifications-settings-section-CMZXQw72.js → notifications-settings-section-TS3gNFcc.js} +1 -1
  156. package/dist/web/assets/notifications-settings-section-TS3gNFcc.js.br +0 -0
  157. package/dist/web/assets/notifications-settings-section-TS3gNFcc.js.gz +0 -0
  158. package/dist/web/assets/{open-db-tabs-DYTZbguT.js → open-db-tabs-DBgV2hbA.js} +1 -1
  159. package/dist/web/assets/open-db-tabs-DBgV2hbA.js.br +0 -0
  160. package/dist/web/assets/open-db-tabs-DBgV2hbA.js.gz +0 -0
  161. package/dist/web/assets/{open-settings-BGtoVEAU.js → open-settings-DWbF5YsE.js} +1 -1
  162. package/dist/web/assets/{overview-panel-7_8b6pwr.js → overview-panel-C5EmTk1R.js} +1 -1
  163. package/dist/web/assets/overview-panel-C5EmTk1R.js.br +0 -0
  164. package/dist/web/assets/overview-panel-C5EmTk1R.js.gz +0 -0
  165. package/dist/web/assets/{panel-store-Dx2ziBLp.js → panel-store-H7e9XHZF.js} +1 -1
  166. package/dist/web/assets/panel-store-H7e9XHZF.js.br +0 -0
  167. package/dist/web/assets/panel-store-H7e9XHZF.js.gz +0 -0
  168. package/dist/web/assets/{patch-tab-metadata-DTbCkVvx.js → patch-tab-metadata-DqvfqUI4.js} +1 -1
  169. package/dist/web/assets/{performance-panel-COQNCyEU.js → performance-panel-Jwab-_Z2.js} +1 -1
  170. package/dist/web/assets/performance-panel-Jwab-_Z2.js.br +0 -0
  171. package/dist/web/assets/performance-panel-Jwab-_Z2.js.gz +0 -0
  172. package/dist/web/assets/{ppmbot-settings-section-CmhbbZVI.js → ppmbot-settings-section-D8jIlmp8.js} +1 -1
  173. package/dist/web/assets/ppmbot-settings-section-D8jIlmp8.js.br +0 -0
  174. package/dist/web/assets/ppmbot-settings-section-D8jIlmp8.js.gz +0 -0
  175. package/dist/web/assets/{pptx-export-COeBmnFJ.js → pptx-export-gXOWUZXL.js} +3 -3
  176. package/dist/web/assets/pptx-export-gXOWUZXL.js.br +0 -0
  177. package/dist/web/assets/pptx-export-gXOWUZXL.js.gz +0 -0
  178. package/dist/web/assets/{problems-panel-I0EYfa1S.js → problems-panel-DjCHA1r5.js} +1 -1
  179. package/dist/web/assets/problems-panel-DjCHA1r5.js.br +0 -0
  180. package/dist/web/assets/problems-panel-DjCHA1r5.js.gz +0 -0
  181. package/dist/web/assets/{process-table-or-X8Lwh.js → process-table-BxXEh4tN.js} +1 -1
  182. package/dist/web/assets/process-table-BxXEh4tN.js.br +0 -0
  183. package/dist/web/assets/process-table-BxXEh4tN.js.gz +0 -0
  184. package/dist/web/assets/{proxy-settings-section-DpJ6ok4C.js → proxy-settings-section-B8igco2L.js} +1 -1
  185. package/dist/web/assets/proxy-settings-section-B8igco2L.js.br +0 -0
  186. package/dist/web/assets/proxy-settings-section-B8igco2L.js.gz +0 -0
  187. package/dist/web/assets/{query-tab-DeNZMZHX.js → query-tab-DHU3ANHN.js} +3 -3
  188. package/dist/web/assets/query-tab-DHU3ANHN.js.br +0 -0
  189. package/dist/web/assets/query-tab-DHU3ANHN.js.gz +0 -0
  190. package/dist/web/assets/release-notes-window-content-B33RDfFY.js +1 -0
  191. package/dist/web/assets/remote-access-settings-section-CoYQTFKd.js +1 -0
  192. package/dist/web/assets/remote-access-settings-section-CoYQTFKd.js.br +0 -0
  193. package/dist/web/assets/remote-access-settings-section-CoYQTFKd.js.gz +0 -0
  194. package/dist/web/assets/{remote-desktop-clipboard-notice-CGDBpXMf.js → remote-desktop-clipboard-notice-Dwn-iV4g.js} +1 -1
  195. package/dist/web/assets/remote-desktop-clipboard-notice-Dwn-iV4g.js.br +0 -0
  196. package/dist/web/assets/remote-desktop-clipboard-notice-Dwn-iV4g.js.gz +0 -0
  197. package/dist/web/assets/{remote-desktop-mobile-sheet-6nXirdqZ.js → remote-desktop-mobile-sheet-bfKiSG0C.js} +2 -2
  198. package/dist/web/assets/remote-desktop-mobile-sheet-bfKiSG0C.js.br +0 -0
  199. package/dist/web/assets/remote-desktop-mobile-sheet-bfKiSG0C.js.gz +0 -0
  200. package/dist/web/assets/{remote-desktop-mobile-view-BTaj9Flo.js → remote-desktop-mobile-view-CV8eHh4A.js} +1 -1
  201. package/dist/web/assets/remote-desktop-mobile-view-CV8eHh4A.js.br +0 -0
  202. package/dist/web/assets/remote-desktop-mobile-view-CV8eHh4A.js.gz +0 -0
  203. package/dist/web/assets/{remote-desktop-readiness-gate--gtmfqZh.js → remote-desktop-readiness-gate-DrSYb_9z.js} +1 -1
  204. package/dist/web/assets/remote-desktop-readiness-gate-DrSYb_9z.js.br +0 -0
  205. package/dist/web/assets/remote-desktop-readiness-gate-DrSYb_9z.js.gz +0 -0
  206. package/dist/web/assets/{remote-desktop-settings-section-Bs5avYaS.js → remote-desktop-settings-section-DRO8n8t7.js} +1 -1
  207. package/dist/web/assets/remote-desktop-settings-section-DRO8n8t7.js.br +0 -0
  208. package/dist/web/assets/remote-desktop-settings-section-DRO8n8t7.js.gz +0 -0
  209. package/dist/web/assets/{remote-desktop-window-content-D4CM-28B.js → remote-desktop-window-content-CAuxeGbK.js} +1 -1
  210. package/dist/web/assets/remote-desktop-window-content-CAuxeGbK.js.br +0 -0
  211. package/dist/web/assets/remote-desktop-window-content-CAuxeGbK.js.gz +0 -0
  212. package/dist/web/assets/{rename-object-dialog-Dv4iLwnf.js → rename-object-dialog-BPuh3dAH.js} +1 -1
  213. package/dist/web/assets/rename-object-dialog-BPuh3dAH.js.br +0 -0
  214. package/dist/web/assets/rename-object-dialog-BPuh3dAH.js.gz +0 -0
  215. package/dist/web/assets/review-address-setup-CoI2BGdx.js +1 -0
  216. package/dist/web/assets/review-address-setup-CoI2BGdx.js.br +0 -0
  217. package/dist/web/assets/review-address-setup-CoI2BGdx.js.gz +0 -0
  218. package/dist/web/assets/{review-code-Bet53hHb.js → review-code-Dy8y4_17.js} +1 -1
  219. package/dist/web/assets/review-code-Dy8y4_17.js.br +0 -0
  220. package/dist/web/assets/review-code-Dy8y4_17.js.gz +0 -0
  221. package/dist/web/assets/{run-in-terminal-EVMb5TjW.js → run-in-terminal-DAdjH24K.js} +1 -1
  222. package/dist/web/assets/{run-in-terminal-button-CsYq6Xqo.js → run-in-terminal-button-Bu165IH-.js} +1 -1
  223. package/dist/web/assets/{save-as-dialog-DHkBsS-6.js → save-as-dialog-C9OpJz2x.js} +1 -1
  224. package/dist/web/assets/save-as-dialog-C9OpJz2x.js.br +0 -0
  225. package/dist/web/assets/save-as-dialog-C9OpJz2x.js.gz +0 -0
  226. package/dist/web/assets/{schedule-script-editor-CKUl2qxf.js → schedule-script-editor--roOsFbc.js} +1 -1
  227. package/dist/web/assets/schedule-script-editor--roOsFbc.js.br +0 -0
  228. package/dist/web/assets/schedule-script-editor--roOsFbc.js.gz +0 -0
  229. package/dist/web/assets/{schedules-settings-section-EoOXzqF3.js → schedules-settings-section-BTn_NSzU.js} +3 -3
  230. package/dist/web/assets/schedules-settings-section-BTn_NSzU.js.br +0 -0
  231. package/dist/web/assets/schedules-settings-section-BTn_NSzU.js.gz +0 -0
  232. package/dist/web/assets/{send-to-chat-B7oUVcgh.js → send-to-chat-BUxj21hD.js} +1 -1
  233. package/dist/web/assets/send-to-chat-BUxj21hD.js.br +0 -0
  234. package/dist/web/assets/send-to-chat-BUxj21hD.js.gz +0 -0
  235. package/dist/web/assets/{services-panel-BceuL_SU.js → services-panel-BynENSs6.js} +1 -1
  236. package/dist/web/assets/services-panel-BynENSs6.js.br +0 -0
  237. package/dist/web/assets/services-panel-BynENSs6.js.gz +0 -0
  238. package/dist/web/assets/{session-changes-bar-CjSxBYOF.js → session-changes-bar-Dz3QitdJ.js} +1 -1
  239. package/dist/web/assets/session-changes-bar-Dz3QitdJ.js.br +0 -0
  240. package/dist/web/assets/session-changes-bar-Dz3QitdJ.js.gz +0 -0
  241. package/dist/web/assets/{session-review-tab-yIQFGJbG.js → session-review-tab-fRzyogNH.js} +1 -1
  242. package/dist/web/assets/session-review-tab-fRzyogNH.js.br +0 -0
  243. package/dist/web/assets/session-review-tab-fRzyogNH.js.gz +0 -0
  244. package/dist/web/assets/{settings-body-DXNcpoqY.js → settings-body-D5pmlFft.js} +1 -1
  245. package/dist/web/assets/settings-body-D5pmlFft.js.br +0 -0
  246. package/dist/web/assets/settings-body-D5pmlFft.js.gz +0 -0
  247. package/dist/web/assets/{settings-rows-DgL7oTg8.js → settings-rows-VtjChFlm.js} +1 -1
  248. package/dist/web/assets/settings-rows-VtjChFlm.js.br +0 -0
  249. package/dist/web/assets/settings-rows-VtjChFlm.js.gz +0 -0
  250. package/dist/web/assets/{settings-section-content-DFLjO2le.js → settings-section-content-BOwSlBkZ.js} +2 -2
  251. package/dist/web/assets/settings-section-content-BOwSlBkZ.js.br +0 -0
  252. package/dist/web/assets/settings-section-content-BOwSlBkZ.js.gz +0 -0
  253. package/dist/web/assets/{settings-section-content-B1eU_yR4.js → settings-section-content-Ck39TJA7.js} +1 -1
  254. package/dist/web/assets/{settings-store-CBJCnE5L.js → settings-store-CMpVMq3Y.js} +2 -2
  255. package/dist/web/assets/settings-store-CMpVMq3Y.js.br +0 -0
  256. package/dist/web/assets/settings-store-CMpVMq3Y.js.gz +0 -0
  257. package/dist/web/assets/settings-tab-A81xb81d.js +1 -0
  258. package/dist/web/assets/settings-window-content-BCDRi6xS.js +1 -0
  259. package/dist/web/assets/{slash-command-picker-qb3fZ7RP.js → slash-command-picker-BKeEykkF.js} +1 -1
  260. package/dist/web/assets/slash-command-picker-BKeEykkF.js.br +0 -0
  261. package/dist/web/assets/slash-command-picker-BKeEykkF.js.gz +0 -0
  262. package/dist/web/assets/{sql-object-tab-B6JtYu9P.js → sql-object-tab-I5bl3DVf.js} +1 -1
  263. package/dist/web/assets/sql-object-tab-I5bl3DVf.js.br +0 -0
  264. package/dist/web/assets/sql-object-tab-I5bl3DVf.js.gz +0 -0
  265. package/dist/web/assets/{sqlite-viewer-bdNkUymy.js → sqlite-viewer-ECCCjxdn.js} +1 -1
  266. package/dist/web/assets/sqlite-viewer-ECCCjxdn.js.br +0 -0
  267. package/dist/web/assets/sqlite-viewer-ECCCjxdn.js.gz +0 -0
  268. package/dist/web/assets/{structure-save-dialog-5SfYdbAB.js → structure-save-dialog-DcQdamD3.js} +1 -1
  269. package/dist/web/assets/structure-save-dialog-DcQdamD3.js.br +0 -0
  270. package/dist/web/assets/structure-save-dialog-DcQdamD3.js.gz +0 -0
  271. package/dist/web/assets/{structure-tab-DYjjcLIU.js → structure-tab-DyQGhf9t.js} +2 -2
  272. package/dist/web/assets/structure-tab-DyQGhf9t.js.br +0 -0
  273. package/dist/web/assets/structure-tab-DyQGhf9t.js.gz +0 -0
  274. package/dist/web/assets/{system-monitor-body-DouL7ajt.js → system-monitor-body-B5AvRT5J.js} +2 -2
  275. package/dist/web/assets/system-monitor-body-B5AvRT5J.js.br +0 -0
  276. package/dist/web/assets/system-monitor-body-B5AvRT5J.js.gz +0 -0
  277. package/dist/web/assets/system-monitor-tab-CfwHKQ5k.js +1 -0
  278. package/dist/web/assets/{system-monitor-window-content-DUCaJME1.js → system-monitor-window-content-Cvx1V8Mf.js} +1 -1
  279. package/dist/web/assets/{tab-host-window-content-CQ5NiV6Y.js → tab-host-window-content-DqOUHxEL.js} +1 -1
  280. package/dist/web/assets/tab-host-window-content-DqOUHxEL.js.br +0 -0
  281. package/dist/web/assets/tab-host-window-content-DqOUHxEL.js.gz +0 -0
  282. package/dist/web/assets/{tab-store-B4v2kAEY.js → tab-store-NUmgzMPf.js} +1 -1
  283. package/dist/web/assets/table-tab-dI8rBbCS.js +2 -0
  284. package/dist/web/assets/table-tab-dI8rBbCS.js.br +0 -0
  285. package/dist/web/assets/table-tab-dI8rBbCS.js.gz +0 -0
  286. package/dist/web/assets/{telegram-bot-token-field-CqVIuWP1.js → telegram-bot-token-field-DSLtG8vw.js} +1 -1
  287. package/dist/web/assets/telegram-bot-token-field-DSLtG8vw.js.br +0 -0
  288. package/dist/web/assets/telegram-bot-token-field-DSLtG8vw.js.gz +0 -0
  289. package/dist/web/assets/{terminal-tab-DT0MN_Qn.js → terminal-tab-CDg0AHBK.js} +2 -2
  290. package/dist/web/assets/terminal-tab-CDg0AHBK.js.br +0 -0
  291. package/dist/web/assets/terminal-tab-CDg0AHBK.js.gz +0 -0
  292. package/dist/web/assets/{tool-cards-C2YGSKRm.js → tool-cards-7E0jtwP0.js} +5 -5
  293. package/dist/web/assets/tool-cards-7E0jtwP0.js.br +0 -0
  294. package/dist/web/assets/tool-cards-7E0jtwP0.js.gz +0 -0
  295. package/dist/web/assets/{tools-settings-section-DQXIdF8O.js → tools-settings-section-AChVQJyU.js} +1 -1
  296. package/dist/web/assets/tools-settings-section-AChVQJyU.js.br +0 -0
  297. package/dist/web/assets/tools-settings-section-AChVQJyU.js.gz +0 -0
  298. package/dist/web/assets/{use-db-read-BByB906L.js → use-db-read-DgNa66Yo.js} +1 -1
  299. package/dist/web/assets/use-db-read-DgNa66Yo.js.br +0 -0
  300. package/dist/web/assets/use-db-read-DgNa66Yo.js.gz +0 -0
  301. package/dist/web/assets/{use-db-tab-Dc0QSFyM.js → use-db-tab-OGLoicCd.js} +1 -1
  302. package/dist/web/assets/use-db-tab-OGLoicCd.js.br +0 -0
  303. package/dist/web/assets/use-db-tab-OGLoicCd.js.gz +0 -0
  304. package/dist/web/assets/{use-inline-blame-B9M-hADX.js → use-inline-blame-BvlcOQd9.js} +3 -3
  305. package/dist/web/assets/use-inline-blame-BvlcOQd9.js.br +0 -0
  306. package/dist/web/assets/use-inline-blame-BvlcOQd9.js.gz +0 -0
  307. package/dist/web/assets/{use-lsp-DcGiCpl9.js → use-lsp-fLNwD0BI.js} +1 -1
  308. package/dist/web/assets/use-lsp-fLNwD0BI.js.br +0 -0
  309. package/dist/web/assets/use-lsp-fLNwD0BI.js.gz +0 -0
  310. package/dist/web/assets/{use-monaco-theme-CyoMsYaI.js → use-monaco-theme-CbNQ4HnC.js} +1 -1
  311. package/dist/web/assets/{use-process-kill-DsHyrg0-.js → use-process-kill-B4Srjl2m.js} +1 -1
  312. package/dist/web/assets/use-process-kill-B4Srjl2m.js.br +0 -0
  313. package/dist/web/assets/use-process-kill-B4Srjl2m.js.gz +0 -0
  314. package/dist/web/assets/{use-sql-schema-info-BqGN5N4O.js → use-sql-schema-info-CqISFaAW.js} +1 -1
  315. package/dist/web/assets/use-sql-schema-info-CqISFaAW.js.br +0 -0
  316. package/dist/web/assets/use-sql-schema-info-CqISFaAW.js.gz +0 -0
  317. package/dist/web/assets/{use-websocket-DqomrzN8.js → use-websocket-DVJuWhlA.js} +1 -1
  318. package/dist/web/assets/{voice-settings-section-D9KsOm8A.js → voice-settings-section-C1aEYF94.js} +1 -1
  319. package/dist/web/assets/voice-settings-section-C1aEYF94.js.br +0 -0
  320. package/dist/web/assets/voice-settings-section-C1aEYF94.js.gz +0 -0
  321. package/dist/web/assets/{web-preview-tab-CUp1n2jz.js → web-preview-tab-CZJAVoVU.js} +1 -1
  322. package/dist/web/assets/web-preview-tab-CZJAVoVU.js.br +0 -0
  323. package/dist/web/assets/web-preview-tab-CZJAVoVU.js.gz +0 -0
  324. package/dist/web/assets/{window-store-UcSFgNCI.js → window-store-D6EgLSfT.js} +1 -1
  325. package/dist/web/assets/window-store-D6EgLSfT.js.br +0 -0
  326. package/dist/web/assets/window-store-D6EgLSfT.js.gz +0 -0
  327. package/dist/web/index.html +12 -12
  328. package/dist/web/index.html.br +0 -0
  329. package/dist/web/index.html.gz +0 -0
  330. package/dist/web/sw.js +1 -1
  331. package/dist/web/sw.js.br +0 -0
  332. package/dist/web/sw.js.gz +0 -0
  333. package/package.json +1 -1
  334. package/src/web/components/floating-window/use-window-meta.ts +2 -1
  335. package/src/web/components/floating-window/window-content-registry.ts +2 -0
  336. package/src/web/components/floating-window/window-store-types.ts +1 -1
  337. package/src/web/components/layout/upgrade-button.tsx +27 -46
  338. package/src/web/components/release-notes/open-release-notes.ts +22 -0
  339. package/src/web/components/release-notes/release-notes-entry.tsx +73 -0
  340. package/src/web/components/release-notes/release-notes-view.tsx +72 -0
  341. package/src/web/components/release-notes/release-notes-window-content.tsx +6 -0
  342. package/dist/web/assets/accounts-settings-section-Ctu-w8kt.js +0 -1
  343. package/dist/web/assets/accounts-settings-section-Ctu-w8kt.js.br +0 -0
  344. package/dist/web/assets/accounts-settings-section-Ctu-w8kt.js.gz +0 -0
  345. package/dist/web/assets/agent-session-sheet-DmbSfFGz.js.br +0 -0
  346. package/dist/web/assets/agent-session-sheet-DmbSfFGz.js.gz +0 -0
  347. package/dist/web/assets/agent-session-window-content-Dk8x3ozF.js.br +0 -0
  348. package/dist/web/assets/agent-session-window-content-Dk8x3ozF.js.gz +0 -0
  349. package/dist/web/assets/ai-resource-editor-MKwjYcDh.js.br +0 -0
  350. package/dist/web/assets/ai-resource-editor-MKwjYcDh.js.gz +0 -0
  351. package/dist/web/assets/ai-settings-section-CODZY71V.js +0 -1
  352. package/dist/web/assets/ai-settings-section-CODZY71V.js.br +0 -0
  353. package/dist/web/assets/ai-settings-section-CODZY71V.js.gz +0 -0
  354. package/dist/web/assets/android-tab-CUkjbfyi.js.br +0 -0
  355. package/dist/web/assets/android-tab-CUkjbfyi.js.gz +0 -0
  356. package/dist/web/assets/appearance-settings-section-BZsM8HpZ.js.br +0 -0
  357. package/dist/web/assets/appearance-settings-section-BZsM8HpZ.js.gz +0 -0
  358. package/dist/web/assets/apps-panel-Cs3utBlp.js.br +0 -0
  359. package/dist/web/assets/apps-panel-Cs3utBlp.js.gz +0 -0
  360. package/dist/web/assets/branch-review-tab-C-aPuhXZ.js +0 -1
  361. package/dist/web/assets/branch-review-tab-C-aPuhXZ.js.br +0 -0
  362. package/dist/web/assets/branch-review-tab-C-aPuhXZ.js.gz +0 -0
  363. package/dist/web/assets/chat-tab-CGQu4uLR.js +0 -1
  364. package/dist/web/assets/chat-tab-CGQu4uLR.js.br +0 -0
  365. package/dist/web/assets/chat-tab-CGQu4uLR.js.gz +0 -0
  366. package/dist/web/assets/chat-tab-DtSHSfMU.js.br +0 -0
  367. package/dist/web/assets/chat-tab-DtSHSfMU.js.gz +0 -0
  368. package/dist/web/assets/code-editor-DjDyhff1.js.br +0 -0
  369. package/dist/web/assets/code-editor-DjDyhff1.js.gz +0 -0
  370. package/dist/web/assets/codex-reset-credit-button-BKgiUi8E.js.br +0 -0
  371. package/dist/web/assets/codex-reset-credit-button-BKgiUi8E.js.gz +0 -0
  372. package/dist/web/assets/conflict-editor-DgTv-8pb.js.br +0 -0
  373. package/dist/web/assets/conflict-editor-DgTv-8pb.js.gz +0 -0
  374. package/dist/web/assets/connection-form-tab-CJ-6gH9g.js +0 -4
  375. package/dist/web/assets/connection-form-tab-CJ-6gH9g.js.br +0 -0
  376. package/dist/web/assets/connection-form-tab-CJ-6gH9g.js.gz +0 -0
  377. package/dist/web/assets/csv-preview-BTGpYs4p.js.br +0 -0
  378. package/dist/web/assets/csv-preview-BTGpYs4p.js.gz +0 -0
  379. package/dist/web/assets/db-explorer-store-DDePT3UI.js.br +0 -0
  380. package/dist/web/assets/db-explorer-store-DDePT3UI.js.gz +0 -0
  381. package/dist/web/assets/db-sidebar-reveal-BeT8cp6P.js.br +0 -0
  382. package/dist/web/assets/db-sidebar-reveal-BeT8cp6P.js.gz +0 -0
  383. package/dist/web/assets/db-tab-parts-BYzd4_sR.js.br +0 -0
  384. package/dist/web/assets/db-tab-parts-BYzd4_sR.js.gz +0 -0
  385. package/dist/web/assets/design-settings-section-B3KQBggK.js.br +0 -0
  386. package/dist/web/assets/design-settings-section-B3KQBggK.js.gz +0 -0
  387. package/dist/web/assets/design-tab-CPyj_nFg.js.br +0 -0
  388. package/dist/web/assets/design-tab-CPyj_nFg.js.gz +0 -0
  389. package/dist/web/assets/designs-sidebar-panel-DIGPFo2l.js.br +0 -0
  390. package/dist/web/assets/designs-sidebar-panel-DIGPFo2l.js.gz +0 -0
  391. package/dist/web/assets/diff-viewer-nYz43A94.js +0 -4
  392. package/dist/web/assets/diff-viewer-nYz43A94.js.br +0 -0
  393. package/dist/web/assets/diff-viewer-nYz43A94.js.gz +0 -0
  394. package/dist/web/assets/docx-preview-CowHGqML.js.br +0 -0
  395. package/dist/web/assets/docx-preview-CowHGqML.js.gz +0 -0
  396. package/dist/web/assets/editor-dialog-xPoehDYp.js.br +0 -0
  397. package/dist/web/assets/editor-dialog-xPoehDYp.js.gz +0 -0
  398. package/dist/web/assets/editor-language-service-DdYqCDBU.js.br +0 -0
  399. package/dist/web/assets/editor-language-service-DdYqCDBU.js.gz +0 -0
  400. package/dist/web/assets/explorer-body-BHh5Qpvi.js +0 -2
  401. package/dist/web/assets/explorer-body-BHh5Qpvi.js.br +0 -0
  402. package/dist/web/assets/explorer-body-BHh5Qpvi.js.gz +0 -0
  403. package/dist/web/assets/explorer-model-tGyFETP_.js.br +0 -0
  404. package/dist/web/assets/explorer-model-tGyFETP_.js.gz +0 -0
  405. package/dist/web/assets/explorer-window-content-B1c4QTVL.js.br +0 -0
  406. package/dist/web/assets/explorer-window-content-B1c4QTVL.js.gz +0 -0
  407. package/dist/web/assets/extension-manager-section-BgL0Uyl3.js.br +0 -0
  408. package/dist/web/assets/extension-manager-section-BgL0Uyl3.js.gz +0 -0
  409. package/dist/web/assets/extension-webview-BWB1Yd-t.js.br +0 -0
  410. package/dist/web/assets/extension-webview-BWB1Yd-t.js.gz +0 -0
  411. package/dist/web/assets/files-settings-section-TmoewoO2.js.br +0 -0
  412. package/dist/web/assets/files-settings-section-TmoewoO2.js.gz +0 -0
  413. package/dist/web/assets/general-settings-section-Bu7o8uUn.js.br +0 -0
  414. package/dist/web/assets/general-settings-section-Bu7o8uUn.js.gz +0 -0
  415. package/dist/web/assets/git-log-panel-RjMZIaCk.js.br +0 -0
  416. package/dist/web/assets/git-log-panel-RjMZIaCk.js.gz +0 -0
  417. package/dist/web/assets/git-review-tab-BUW5LZk4.js +0 -3
  418. package/dist/web/assets/git-review-tab-BUW5LZk4.js.br +0 -0
  419. package/dist/web/assets/git-review-tab-BUW5LZk4.js.gz +0 -0
  420. package/dist/web/assets/glide-data-grid-DqlTFhhf.js.br +0 -0
  421. package/dist/web/assets/glide-data-grid-DqlTFhhf.js.gz +0 -0
  422. package/dist/web/assets/grid-save-dialog-BmF2Gy_E.js.br +0 -0
  423. package/dist/web/assets/grid-save-dialog-BmF2Gy_E.js.gz +0 -0
  424. package/dist/web/assets/group-chat-tab-nk3n5wE0.js +0 -1
  425. package/dist/web/assets/group-chat-tab-nk3n5wE0.js.br +0 -0
  426. package/dist/web/assets/group-chat-tab-nk3n5wE0.js.gz +0 -0
  427. package/dist/web/assets/impexp-tab-B8d4oBOB.js.br +0 -0
  428. package/dist/web/assets/impexp-tab-B8d4oBOB.js.gz +0 -0
  429. package/dist/web/assets/index-2_Pz5MiI.css +0 -1
  430. package/dist/web/assets/index-2_Pz5MiI.css.br +0 -0
  431. package/dist/web/assets/index-Cx9ZRibz.js.br +0 -0
  432. package/dist/web/assets/index-Cx9ZRibz.js.gz +0 -0
  433. package/dist/web/assets/keybindings-store-B2AkKQl7.js +0 -1
  434. package/dist/web/assets/keyboard-shortcuts-section-BSMgmbOR.js.br +0 -0
  435. package/dist/web/assets/keyboard-shortcuts-section-BSMgmbOR.js.gz +0 -0
  436. package/dist/web/assets/language-servers-section-DO9wnwnG.js.br +0 -0
  437. package/dist/web/assets/language-servers-section-DO9wnwnG.js.gz +0 -0
  438. package/dist/web/assets/logs-app-xQ2UsN4G.js +0 -13
  439. package/dist/web/assets/logs-app-xQ2UsN4G.js.br +0 -0
  440. package/dist/web/assets/logs-app-xQ2UsN4G.js.gz +0 -0
  441. package/dist/web/assets/logs-tab-H3SmYGRX.js +0 -1
  442. package/dist/web/assets/lsp-client-IsC8Ol0U.js.br +0 -0
  443. package/dist/web/assets/lsp-client-IsC8Ol0U.js.gz +0 -0
  444. package/dist/web/assets/markdown-renderer-BfZiHaNy.js.br +0 -0
  445. package/dist/web/assets/markdown-renderer-BfZiHaNy.js.gz +0 -0
  446. package/dist/web/assets/mobile-explorer-sheet-Dz3eJdBl.js.br +0 -0
  447. package/dist/web/assets/mobile-explorer-sheet-Dz3eJdBl.js.gz +0 -0
  448. package/dist/web/assets/new-design-dialog-B8zeJoJQ.js.br +0 -0
  449. package/dist/web/assets/new-design-dialog-B8zeJoJQ.js.gz +0 -0
  450. package/dist/web/assets/notification-store-BkkcJE2G.js +0 -1
  451. package/dist/web/assets/notifications-settings-section-CMZXQw72.js.br +0 -0
  452. package/dist/web/assets/notifications-settings-section-CMZXQw72.js.gz +0 -0
  453. package/dist/web/assets/open-db-tabs-DYTZbguT.js.br +0 -0
  454. package/dist/web/assets/open-db-tabs-DYTZbguT.js.gz +0 -0
  455. package/dist/web/assets/overview-panel-7_8b6pwr.js.br +0 -0
  456. package/dist/web/assets/overview-panel-7_8b6pwr.js.gz +0 -0
  457. package/dist/web/assets/panel-store-Dx2ziBLp.js.br +0 -0
  458. package/dist/web/assets/panel-store-Dx2ziBLp.js.gz +0 -0
  459. package/dist/web/assets/performance-panel-COQNCyEU.js.br +0 -0
  460. package/dist/web/assets/performance-panel-COQNCyEU.js.gz +0 -0
  461. package/dist/web/assets/ppmbot-settings-section-CmhbbZVI.js.br +0 -0
  462. package/dist/web/assets/ppmbot-settings-section-CmhbbZVI.js.gz +0 -0
  463. package/dist/web/assets/pptx-export-COeBmnFJ.js.br +0 -0
  464. package/dist/web/assets/pptx-export-COeBmnFJ.js.gz +0 -0
  465. package/dist/web/assets/problems-panel-I0EYfa1S.js.br +0 -0
  466. package/dist/web/assets/problems-panel-I0EYfa1S.js.gz +0 -0
  467. package/dist/web/assets/process-table-or-X8Lwh.js.br +0 -0
  468. package/dist/web/assets/process-table-or-X8Lwh.js.gz +0 -0
  469. package/dist/web/assets/proxy-settings-section-DpJ6ok4C.js.br +0 -0
  470. package/dist/web/assets/proxy-settings-section-DpJ6ok4C.js.gz +0 -0
  471. package/dist/web/assets/query-tab-DeNZMZHX.js.br +0 -0
  472. package/dist/web/assets/query-tab-DeNZMZHX.js.gz +0 -0
  473. package/dist/web/assets/remote-access-settings-section-QRP4Yh46.js +0 -1
  474. package/dist/web/assets/remote-access-settings-section-QRP4Yh46.js.br +0 -0
  475. package/dist/web/assets/remote-access-settings-section-QRP4Yh46.js.gz +0 -0
  476. package/dist/web/assets/remote-desktop-clipboard-notice-CGDBpXMf.js.br +0 -0
  477. package/dist/web/assets/remote-desktop-clipboard-notice-CGDBpXMf.js.gz +0 -0
  478. package/dist/web/assets/remote-desktop-mobile-sheet-6nXirdqZ.js.br +0 -0
  479. package/dist/web/assets/remote-desktop-mobile-sheet-6nXirdqZ.js.gz +0 -0
  480. package/dist/web/assets/remote-desktop-mobile-view-BTaj9Flo.js.br +0 -0
  481. package/dist/web/assets/remote-desktop-mobile-view-BTaj9Flo.js.gz +0 -0
  482. package/dist/web/assets/remote-desktop-readiness-gate--gtmfqZh.js.br +0 -0
  483. package/dist/web/assets/remote-desktop-readiness-gate--gtmfqZh.js.gz +0 -0
  484. package/dist/web/assets/remote-desktop-settings-section-Bs5avYaS.js.br +0 -0
  485. package/dist/web/assets/remote-desktop-settings-section-Bs5avYaS.js.gz +0 -0
  486. package/dist/web/assets/remote-desktop-window-content-D4CM-28B.js.br +0 -0
  487. package/dist/web/assets/remote-desktop-window-content-D4CM-28B.js.gz +0 -0
  488. package/dist/web/assets/rename-object-dialog-Dv4iLwnf.js.br +0 -0
  489. package/dist/web/assets/rename-object-dialog-Dv4iLwnf.js.gz +0 -0
  490. package/dist/web/assets/review-address-setup-CU1A_NfZ.js +0 -1
  491. package/dist/web/assets/review-address-setup-CU1A_NfZ.js.br +0 -0
  492. package/dist/web/assets/review-address-setup-CU1A_NfZ.js.gz +0 -0
  493. package/dist/web/assets/review-code-Bet53hHb.js.br +0 -0
  494. package/dist/web/assets/review-code-Bet53hHb.js.gz +0 -0
  495. package/dist/web/assets/save-as-dialog-DHkBsS-6.js.br +0 -0
  496. package/dist/web/assets/save-as-dialog-DHkBsS-6.js.gz +0 -0
  497. package/dist/web/assets/schedule-script-editor-CKUl2qxf.js.br +0 -0
  498. package/dist/web/assets/schedule-script-editor-CKUl2qxf.js.gz +0 -0
  499. package/dist/web/assets/schedules-settings-section-EoOXzqF3.js.br +0 -0
  500. package/dist/web/assets/schedules-settings-section-EoOXzqF3.js.gz +0 -0
  501. package/dist/web/assets/send-to-chat-B7oUVcgh.js.br +0 -0
  502. package/dist/web/assets/send-to-chat-B7oUVcgh.js.gz +0 -0
  503. package/dist/web/assets/services-panel-BceuL_SU.js.br +0 -0
  504. package/dist/web/assets/services-panel-BceuL_SU.js.gz +0 -0
  505. package/dist/web/assets/session-changes-bar-CjSxBYOF.js.br +0 -0
  506. package/dist/web/assets/session-changes-bar-CjSxBYOF.js.gz +0 -0
  507. package/dist/web/assets/session-review-tab-yIQFGJbG.js.br +0 -0
  508. package/dist/web/assets/session-review-tab-yIQFGJbG.js.gz +0 -0
  509. package/dist/web/assets/settings-body-DXNcpoqY.js.br +0 -0
  510. package/dist/web/assets/settings-body-DXNcpoqY.js.gz +0 -0
  511. package/dist/web/assets/settings-rows-DgL7oTg8.js.br +0 -0
  512. package/dist/web/assets/settings-rows-DgL7oTg8.js.gz +0 -0
  513. package/dist/web/assets/settings-section-content-DFLjO2le.js.br +0 -0
  514. package/dist/web/assets/settings-section-content-DFLjO2le.js.gz +0 -0
  515. package/dist/web/assets/settings-store-CBJCnE5L.js.br +0 -0
  516. package/dist/web/assets/settings-store-CBJCnE5L.js.gz +0 -0
  517. package/dist/web/assets/settings-tab-CrGoLKQT.js +0 -1
  518. package/dist/web/assets/settings-window-content-5opW9Wra.js +0 -1
  519. package/dist/web/assets/slash-command-picker-qb3fZ7RP.js.br +0 -0
  520. package/dist/web/assets/slash-command-picker-qb3fZ7RP.js.gz +0 -0
  521. package/dist/web/assets/sql-object-tab-B6JtYu9P.js.br +0 -0
  522. package/dist/web/assets/sql-object-tab-B6JtYu9P.js.gz +0 -0
  523. package/dist/web/assets/sqlite-viewer-bdNkUymy.js.br +0 -0
  524. package/dist/web/assets/sqlite-viewer-bdNkUymy.js.gz +0 -0
  525. package/dist/web/assets/structure-save-dialog-5SfYdbAB.js.br +0 -0
  526. package/dist/web/assets/structure-save-dialog-5SfYdbAB.js.gz +0 -0
  527. package/dist/web/assets/structure-tab-DYjjcLIU.js.br +0 -0
  528. package/dist/web/assets/structure-tab-DYjjcLIU.js.gz +0 -0
  529. package/dist/web/assets/system-monitor-body-DouL7ajt.js.br +0 -0
  530. package/dist/web/assets/system-monitor-body-DouL7ajt.js.gz +0 -0
  531. package/dist/web/assets/system-monitor-tab-qpa36tWB.js +0 -1
  532. package/dist/web/assets/tab-host-window-content-CQ5NiV6Y.js.br +0 -0
  533. package/dist/web/assets/tab-host-window-content-CQ5NiV6Y.js.gz +0 -0
  534. package/dist/web/assets/table-tab-M850PntZ.js +0 -2
  535. package/dist/web/assets/table-tab-M850PntZ.js.br +0 -0
  536. package/dist/web/assets/table-tab-M850PntZ.js.gz +0 -0
  537. package/dist/web/assets/telegram-bot-token-field-CqVIuWP1.js.br +0 -0
  538. package/dist/web/assets/telegram-bot-token-field-CqVIuWP1.js.gz +0 -0
  539. package/dist/web/assets/terminal-tab-DT0MN_Qn.js.br +0 -0
  540. package/dist/web/assets/terminal-tab-DT0MN_Qn.js.gz +0 -0
  541. package/dist/web/assets/tool-cards-C2YGSKRm.js.br +0 -0
  542. package/dist/web/assets/tool-cards-C2YGSKRm.js.gz +0 -0
  543. package/dist/web/assets/tools-settings-section-DQXIdF8O.js.br +0 -0
  544. package/dist/web/assets/tools-settings-section-DQXIdF8O.js.gz +0 -0
  545. package/dist/web/assets/use-db-read-BByB906L.js.br +0 -0
  546. package/dist/web/assets/use-db-read-BByB906L.js.gz +0 -0
  547. package/dist/web/assets/use-db-tab-Dc0QSFyM.js.br +0 -0
  548. package/dist/web/assets/use-db-tab-Dc0QSFyM.js.gz +0 -0
  549. package/dist/web/assets/use-inline-blame-B9M-hADX.js.br +0 -0
  550. package/dist/web/assets/use-inline-blame-B9M-hADX.js.gz +0 -0
  551. package/dist/web/assets/use-lsp-DcGiCpl9.js.br +0 -0
  552. package/dist/web/assets/use-lsp-DcGiCpl9.js.gz +0 -0
  553. package/dist/web/assets/use-process-kill-DsHyrg0-.js.br +0 -0
  554. package/dist/web/assets/use-process-kill-DsHyrg0-.js.gz +0 -0
  555. package/dist/web/assets/use-sql-schema-info-BqGN5N4O.js.br +0 -0
  556. package/dist/web/assets/use-sql-schema-info-BqGN5N4O.js.gz +0 -0
  557. package/dist/web/assets/voice-settings-section-D9KsOm8A.js.br +0 -0
  558. package/dist/web/assets/voice-settings-section-D9KsOm8A.js.gz +0 -0
  559. package/dist/web/assets/web-preview-tab-CUp1n2jz.js.br +0 -0
  560. package/dist/web/assets/web-preview-tab-CUp1n2jz.js.gz +0 -0
  561. package/dist/web/assets/window-store-UcSFgNCI.js.br +0 -0
  562. package/dist/web/assets/window-store-UcSFgNCI.js.gz +0 -0
  563. /package/dist/web/assets/{__vite-browser-external-DLaiEgUM.js → __vite-browser-external-LVpeGV-g.js} +0 -0
  564. /package/dist/web/assets/{api-themes-B3-6zR6Q.js → api-themes-DUOEO3_X.js} +0 -0
  565. /package/dist/web/assets/{claude-models-yFre4eSK.js → claude-models-C9iHl8VB.js} +0 -0
  566. /package/dist/web/assets/{database-drivers-section-c2SuNQPB.js → database-drivers-section-BPXoNrWi.js} +0 -0
  567. /package/dist/web/assets/{database-drivers-section-c2SuNQPB.js.br → database-drivers-section-BPXoNrWi.js.br} +0 -0
  568. /package/dist/web/assets/{database-drivers-section-c2SuNQPB.js.gz → database-drivers-section-BPXoNrWi.js.gz} +0 -0
  569. /package/dist/web/assets/{metric-chart-canvas-Dnm9OOXU.js → metric-chart-canvas-HG8rPTMq.js} +0 -0
  570. /package/dist/web/assets/{metric-chart-canvas-Dnm9OOXU.js.br → metric-chart-canvas-HG8rPTMq.js.br} +0 -0
  571. /package/dist/web/assets/{metric-chart-canvas-Dnm9OOXU.js.gz → metric-chart-canvas-HG8rPTMq.js.gz} +0 -0
  572. /package/dist/web/assets/{notification-settings-CvplVsIo.js → notification-settings--li9wGTJ.js} +0 -0
  573. /package/dist/web/assets/{notification-settings-CvplVsIo.js.br → notification-settings--li9wGTJ.js.br} +0 -0
  574. /package/dist/web/assets/{notification-settings-CvplVsIo.js.gz → notification-settings--li9wGTJ.js.gz} +0 -0
  575. /package/dist/web/assets/{process-row-format-CM1XaqkS.js → process-row-format-CJg8VV-6.js} +0 -0
  576. /package/dist/web/assets/{query-audit-section-C-fT07Zz.js → query-audit-section-BiCUBamA.js} +0 -0
  577. /package/dist/web/assets/{query-audit-section-C-fT07Zz.js.br → query-audit-section-BiCUBamA.js.br} +0 -0
  578. /package/dist/web/assets/{query-audit-section-C-fT07Zz.js.gz → query-audit-section-BiCUBamA.js.gz} +0 -0
  579. /package/dist/web/assets/{remote-desktop-recording-D_fwMC2z.js → remote-desktop-recording-BcDx5c_k.js} +0 -0
  580. /package/dist/web/assets/{separator-CYw7bF1W.js → separator-DUdRLaL0.js} +0 -0
  581. /package/dist/web/assets/{sortable-header-CchrA_dg.js → sortable-header-Ds6nTnqB.js} +0 -0
  582. /package/dist/web/assets/{sortable-header-CchrA_dg.js.br → sortable-header-Ds6nTnqB.js.br} +0 -0
  583. /package/dist/web/assets/{sortable-header-CchrA_dg.js.gz → sortable-header-Ds6nTnqB.js.gz} +0 -0
  584. /package/dist/web/assets/{vendor-xterm-lhGdimFj.js → vendor-xterm-BxbwWHG_.js} +0 -0
  585. /package/dist/web/assets/{vendor-xterm-lhGdimFj.js.br → vendor-xterm-BxbwWHG_.js.br} +0 -0
  586. /package/dist/web/assets/{vendor-xterm-lhGdimFj.js.gz → vendor-xterm-BxbwWHG_.js.gz} +0 -0
@@ -1 +1 @@
1
- import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{Ar as r,Kr as i,Ln as a,P as o,Sr as s,gt as c,xn as l}from"./icons-C1wDt09O.js";import{k as u,r as d}from"./api-client-BnYFnEfK.js";import{n as f}from"./utils-D3xTlJyU.js";import{t as p}from"./format-date-SZ6qU2sD.js";import{n as m,t as h}from"./button-BHGVTbam.js";import{t as g}from"./input-CReAuQTF.js";import{t as _}from"./separator-CYw7bF1W.js";import{a as v,i as y,n as b,o as x,r as S}from"./notification-settings-CvplVsIo.js";import{n as C,r as w,t as T}from"./settings-rows-DgL7oTg8.js";import{i as E,n as D,r as O,t as k}from"./telegram-bot-token-field-CqVIuWP1.js";var A=e(t(),1),j=`Notifications are blocked for this site. Allow them in the browser's site settings, then turn this on again.`;function M(e){return e.secure?e.ios&&!e.standalone?{state:`unavailable`,message:`On iPhone and iPad, push works only in PPM added to the Home Screen: tap Share → Add to Home Screen, open PPM from there, then turn this on.`}:!e.serviceWorker||!e.pushManager||!e.notification?e.browser===`Firefox`&&e.serviceWorker&&e.notification?{state:`unavailable`,message:`Push is turned off in this browser. Open about:config, set dom.push.enabled to true, then restart the browser.`}:{state:`unavailable`,message:`This browser cannot receive push notifications.`}:e.permission===`denied`?{state:`blocked`,message:j}:{state:`available`}:{state:`unavailable`,message:`Push needs PPM on HTTPS or localhost. Browsers turn it off on a plain HTTP address like this one.`}}var ee=6e4;function te(e,t){let n,r=new Promise((e,r)=>{n=setTimeout(()=>r(new DOMException(`The push service did not answer.`,`TimeoutError`)),t)});return Promise.race([e,r]).finally(()=>clearTimeout(n))}var N={Brave:`Google`,Chrome:`Google`,Firefox:`Mozilla`,Safari:`Apple`};function P(e,t){let{name:n,message:r}=t??{};if(n!==`AbortError`&&n!==`TimeoutError`)return null;if(e===`Brave`&&n===`AbortError`)return`Brave keeps push off until you allow it: open brave://settings/privacy, turn on “Use Google services for push messaging”, restart Brave, then turn this on again.`;let i=N[e],a=i?`${i}'s push service`:`its push service`,o=n===`TimeoutError`?`got no answer from ${a} within a minute`:`could not register with ${a}`,s=n===`AbortError`&&typeof r==`string`&&r?` (${r})`:``;return`${e===`Browser`?`This browser`:e} ${o}${s}. A firewall, VPN, DNS filter or ad blocker may be blocking it${i?``:`, or push is turned off in this browser`}. Telegram and ntfy below work without it.`}function F(e,t,n){return/iPhone|iPad|iPod/.test(e)||t===`MacIntel`&&n>1}function I(e){return/Edg(A|iOS)?\//.test(e)?`Edge`:/OPR\//.test(e)?`Opera`:/SamsungBrowser\//.test(e)?`Samsung Internet`:/Firefox\/|FxiOS\//.test(e)?`Firefox`:/Chrome\/|CriOS\//.test(e)?`Chrome`:/Safari\//.test(e)?`Safari`:`Browser`}function L(e,t=!1,n=I(e)){let r=/Android/.test(e)?`Android`:/iPhone|iPod/.test(e)?`iPhone`:/iPad/.test(e)||t?`iPad`:/Mac OS X/.test(e)?`macOS`:/Windows/.test(e)?`Windows`:/CrOS/.test(e)?`ChromeOS`:/Linux/.test(e)?`Linux`:``;return r?`${n} on ${r}`:n}function ne(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`).padEnd(Math.ceil(e.length/4)*4,`=`),n=atob(t),r=new Uint8Array(n.length);for(let e=0;e<n.length;e++)r[e]=n.charCodeAt(e);return r}function re(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function ie(){return navigator.platform===`MacIntel`&&navigator.maxTouchPoints>1}function R(){if(`brave`in navigator)return`Brave`;let e=I(navigator.userAgent),t=navigator.userAgentData?.brands;return e===`Chrome`&&t&&!t.some(e=>e.brand===`Google Chrome`)?`Browser`:e}function z(){return M({secure:window.isSecureContext,serviceWorker:`serviceWorker`in navigator,pushManager:`PushManager`in window,notification:`Notification`in window,ios:F(navigator.userAgent,navigator.platform,navigator.maxTouchPoints),standalone:window.matchMedia?.(`(display-mode: standalone)`).matches||navigator.standalone===!0,permission:`Notification`in window?Notification.permission:null,browser:R()})}function B(){return L(navigator.userAgent,ie(),`brave`in navigator?`Brave`:void 0)}async function V(){return z().state===`unavailable`?null:await(await navigator.serviceWorker.getRegistration())?.pushManager.getSubscription()??null}function H(e,t){let n=e.options.applicationServerKey;return!!n&&re(new Uint8Array(n))===t}async function U(e){let t=await Notification.requestPermission();if(t!==`granted`)throw Error(t===`denied`?j:`Notifications were not allowed.`);if(!await navigator.serviceWorker.getRegistration())throw Error(`PPM's service worker is not running on this page, so it cannot receive push.`);let n=await navigator.serviceWorker.ready,r=await n.pushManager.getSubscription();r&&!H(r,e)&&(await d.post(`/api/notifications/push/unsubscribe`,{endpoint:r.endpoint}).catch(()=>{}),await r.unsubscribe(),r=null);try{r??=await te(n.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:ne(e)}),ee)}catch(e){let t=P(R(),e);throw t?Error(t):e}return d.post(`/api/notifications/push/subscribe`,{subscription:r.toJSON(),label:B(),origin:window.location.origin})}async function W(){let e=await V();if(e)try{await d.post(`/api/notifications/push/unsubscribe`,{endpoint:e.endpoint})}finally{await e.unsubscribe()}}var G=n(),K=`https://ntfy.sh`;function q(){let e=crypto.getRandomValues(new Uint8Array(12));return`ppm-${Array.from(e,e=>`abcdefghijklmnopqrstuvwxyz0123456789`[e%36]).join(``)}`}function J(e){try{return new URL(e).host}catch{return e}}function ae({status:e,onSaved:t,onRemove:n}){let r=(0,A.useId)(),i=(0,A.useId)(),a=(0,A.useId)(),[s,l]=(0,A.useState)(e.server||K),[u,p]=(0,A.useState)(()=>e.topic||q()),[_,v]=(0,A.useState)(``),[y,b]=(0,A.useState)(!1),[S,C]=(0,A.useState)(null),[w,T]=(0,A.useState)(!e.configured),E=x(s),D=e.tokenSet&&E===e.server,O=!e.configured||E!==e.server||u.trim()!==e.topic||_.trim()!==``,k=e=>t=>{e(t.target.value),C(null)},j=async()=>{b(!0),C(null);try{let e=await d.put(`/api/notifications/ntfy`,{server:s,topic:u,..._.trim()?{token:_.trim()}:{}});v(``),T(!1),t(e)}catch(e){C(e instanceof Error?e.message:String(e))}finally{b(!1)}};return(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsxs)(`form`,{className:`space-y-3`,onSubmit:e=>{e.preventDefault(),j()},children:[(0,G.jsx)(Y,{id:r,label:`Server`,children:(0,G.jsx)(g,{id:r,inputMode:`url`,autoCapitalize:`none`,autoCorrect:`off`,autoComplete:`off`,spellCheck:!1,placeholder:K,value:s,onChange:k(l),className:`h-11 w-full text-sm md:h-9`})}),(0,G.jsx)(Y,{id:i,label:`Topic`,children:(0,G.jsx)(g,{id:i,autoCapitalize:`none`,autoCorrect:`off`,autoComplete:`off`,spellCheck:!1,value:u,onChange:k(p),className:`h-11 w-full font-mono text-sm md:h-9`})}),(0,G.jsx)(Y,{id:a,label:`Access token — only if the server requires sign-in`,children:(0,G.jsx)(g,{id:a,type:`password`,autoComplete:`off`,spellCheck:!1,placeholder:D?`•••••• (saved)`:`tk_…`,value:_,onChange:k(v),className:`h-11 w-full font-mono text-sm md:h-9`})}),e.tokenSet&&!D&&!_.trim()&&(0,G.jsxs)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:[`The saved token is for `,J(e.server),` and is not sent to another server.`]}),S&&(0,G.jsx)(`p`,{className:`text-xs text-error`,children:S}),(0,G.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row`,children:[(0,G.jsx)(h,{type:`submit`,disabled:y||!O,className:`min-h-11 cursor-pointer md:min-h-9`,children:y?`Checking…`:`Save`}),e.configured&&(0,G.jsx)(h,{type:`button`,variant:`ghost`,onClick:n,className:`min-h-11 cursor-pointer text-error hover:text-error md:min-h-9`,children:`Remove ntfy`})]})]}),(0,G.jsxs)(`button`,{type:`button`,onClick:()=>T(e=>!e),"aria-expanded":w,className:`flex min-h-11 cursor-pointer items-center gap-1 text-xs text-primary md:min-h-8`,children:[(0,G.jsx)(o,{className:f(`size-3.5 transition-transform`,!w&&`-rotate-90`)}),`How to set up ntfy`]}),w&&(0,G.jsxs)(`div`,{className:`space-y-3 rounded-lg border border-border px-4 py-3`,children:[(0,G.jsxs)(`ol`,{className:`list-decimal space-y-1.5 pl-4 text-sm leading-relaxed`,children:[(0,G.jsx)(`li`,{children:`Install the ntfy app on your phone, or open the server in a browser.`}),(0,G.jsxs)(`li`,{children:[`Subscribe to the topic above. For a server other than ntfy.sh, turn on `,(0,G.jsx)(`b`,{children:`Use another server`}),` and enter its address.`]}),(0,G.jsxs)(`li`,{children:[`If the server asks you to sign in, create a token in its web app under `,(0,G.jsx)(`b`,{children:`Account → Access tokens`}),` and paste it above. Its user needs permission to publish to the topic.`]}),(0,G.jsx)(`li`,{children:`Save, then send a test.`})]}),(0,G.jsxs)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:[`On ntfy.sh anyone who knows a topic's name can read it, so keep the name hard to guess. An iPhone gets instant alerts from a server of your own only when that server sets`,` `,(0,G.jsx)(`code`,{className:`rounded bg-muted px-1 py-0.5`,children:`upstream-base-url: "https://ntfy.sh"`}),`.`]}),(0,G.jsxs)(`a`,{href:`https://docs.ntfy.sh/subscribe/phone/`,target:`_blank`,rel:`noopener noreferrer`,className:f(m({variant:`outline`}),`min-h-11 w-full gap-2 md:min-h-9 sm:w-auto`),children:[`The ntfy app guide`,(0,G.jsx)(c,{className:`size-3.5`})]})]})]})}function Y({id:e,label:t,children:n}){return(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(`label`,{htmlFor:e,className:`text-xs text-muted-foreground`,children:t}),n]})}var X=e=>e instanceof Error?e.message:String(e),Z=e=>p(new Date(e).toISOString());function oe(){let[e,t]=(0,A.useState)(null),[n,r]=(0,A.useState)(null),i=(0,A.useCallback)(async()=>{try{t(await d.get(`/api/notifications/settings`)),r(null)}catch(e){r(X(e))}},[]);(0,A.useEffect)(()=>{i()},[i]);let a=(0,A.useCallback)(async e=>{t(t=>t&&v(t,e));try{await d.put(`/api/notifications/settings`,e)}catch(e){u.error(`Could not save`,{description:X(e)}),await i()}},[i]);return e?(0,G.jsxs)(`div`,{className:`space-y-6`,children:[(0,G.jsx)(se,{settings:e,update:a}),(0,G.jsx)(_,{}),(0,G.jsx)(ce,{}),(0,G.jsx)(_,{}),(0,G.jsx)(le,{settings:e,update:a}),(0,G.jsx)(_,{}),(0,G.jsx)($,{settings:e,update:a})]}):(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:n??`Loading…`})}function se({settings:e,update:t}){let n=(0,A.useId)(),r=b.some(t=>t.seconds===e.delay_seconds)?b:[...b,{seconds:e.delay_seconds,label:`After ${e.delay_seconds} seconds`}];return(0,G.jsxs)(`section`,{className:`space-y-3`,children:[(0,G.jsx)(C,{title:`When to notify`,children:`For every channel below, on every device.`}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(`label`,{htmlFor:n,className:`text-xs text-muted-foreground`,children:`Send a notification`}),(0,G.jsx)(`select`,{id:n,value:e.delay_seconds,onChange:e=>void t({delay_seconds:Number(e.target.value)}),className:`h-11 w-full rounded-md border border-input bg-background px-3 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring md:h-9`,children:r.map(e=>(0,G.jsx)(`option`,{value:e.seconds,children:e.label},e.seconds))}),(0,G.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:e.delay_seconds===0?`Sent the moment it happens, even while you are looking at the chat.`:`Sent only if the chat is still unread by then. Opening it in PPM on any device cancels the notification, and so does answering an approval.`})]}),(0,G.jsx)(`div`,{className:`divide-y divide-border rounded-lg border border-border`,children:S.map(n=>(0,G.jsx)(w,{label:y[n].label,note:y[n].note,checked:e.events[n],onChange:e=>void t({events:{[n]:e}})},n))})]})}function ce(){let[e,t]=(0,A.useState)(null),[n,o]=(0,A.useState)(null),[c,f]=(0,A.useState)(null),[p,m]=(0,A.useState)(!1),[h,g]=(0,A.useState)(!1),[_,v]=(0,A.useState)(null),[y,b]=(0,A.useState)(null),x=z(),S=(0,A.useCallback)(async()=>{try{let[e,n]=await Promise.all([d.get(`/api/notifications/push`),V().catch(()=>null)]);t(e),o(n),f(null)}catch(e){f(X(e))}},[]);(0,A.useEffect)(()=>{S()},[S]);let E=n&&e&&H(n,e.publicKey)?e.devices.find(e=>e.endpoint===n.endpoint)??null:null,D=async t=>{if(e){m(!0),g(t),v(null);try{t?(await U(e.publicKey),u.success(`Push is on for this device`)):await W()}catch(e){t?v(X(e)):u.error(`Could not turn push off`,{description:X(e)})}finally{m(!1),g(!1),await S()}}},O=async e=>{b(e.id);try{await d.post(`/api/notifications/push/test`,{id:e.id}),u.success(`Test sent to ${e.label}`)}catch(e){u.error(`Test not delivered`,{description:X(e)})}finally{b(null),await S()}},k=async e=>{if(e.id===E?.id)return D(!1);try{await d.post(`/api/notifications/push/unsubscribe`,{id:e.id})}catch(e){u.error(`Could not remove it`,{description:X(e)})}finally{await S()}},j=x.state===`unavailable`||x.state===`blocked`&&!E;return(0,G.jsxs)(`section`,{className:`space-y-3`,children:[(0,G.jsx)(C,{title:`Push notifications`,children:`Alerts on this phone or computer, even with PPM closed. Turn it on in each browser that should get them.`}),(0,G.jsx)(`div`,{className:`rounded-lg border border-border`,children:(0,G.jsx)(w,{label:`This device`,note:B(),checked:!!E,disabled:p||!e||j,onChange:e=>void D(e)})}),x.state!==`available`&&(0,G.jsx)(`p`,{className:`text-xs leading-relaxed text-warning`,children:x.message}),h&&(0,G.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`Waiting for the browser's push service. Just after the browser starts, this can take up to a minute.`}),_&&(0,G.jsx)(`p`,{className:`break-words text-xs leading-relaxed text-error`,children:_}),c&&(0,G.jsx)(`p`,{className:`text-xs text-error`,children:c}),e&&e.devices.length>0&&(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Receiving push`}),(0,G.jsx)(`ul`,{className:`divide-y divide-border rounded-lg border border-border`,children:e.devices.map(e=>(0,G.jsxs)(`li`,{className:`flex items-center gap-3 py-1.5 pl-4 pr-1`,children:[(0,G.jsx)(/Android|iPhone|iPad/.test(e.label)?r:a,{className:`size-4 shrink-0 text-muted-foreground`}),(0,G.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,G.jsxs)(`p`,{className:`flex min-w-0 items-center gap-1.5 text-sm`,children:[(0,G.jsx)(`span`,{className:`truncate`,children:e.label}),e.id===E?.id&&(0,G.jsx)(`span`,{className:`shrink-0 rounded bg-primary/10 px-1.5 py-0.5 text-[10px] text-primary`,children:`This device`})]}),(0,G.jsxs)(`p`,{className:`truncate text-xs text-muted-foreground`,children:[Q(e.origin),` · `,e.lastSuccessAt?`delivered ${Z(e.lastSuccessAt)}`:`added ${Z(e.createdAt)}`]}),e.lastError&&(0,G.jsx)(`p`,{className:`break-words text-xs text-error`,children:e.lastError})]}),(0,G.jsx)(T,{label:`Send a test to ${e.label}`,disabled:y!==null,onClick:()=>void O(e),children:y===e.id?(0,G.jsx)(l,{className:`size-4 animate-spin`}):(0,G.jsx)(s,{className:`size-4`})}),(0,G.jsx)(T,{label:`Stop push to ${e.label}`,danger:!0,disabled:p,onClick:()=>void k(e),children:(0,G.jsx)(i,{className:`size-4`})})]},e.id))})]})]})}function Q(e){try{return new URL(e).host}catch{return e}}function le({settings:e,update:t}){let[n,r]=(0,A.useState)(null),[i,a]=(0,A.useState)(null),[o,c]=(0,A.useState)(!1),f=(0,A.useCallback)(async()=>{try{let e=await d.get(`/api/notifications/telegram`);return r(e),a(null),e}catch(e){return a(X(e)),null}},[]);(0,A.useEffect)(()=>{f()},[f]);let{link:p,starting:m,connect:g,cancel:_}=E(`/api/notifications/telegram/connect`,n,f),v=async e=>{try{await d.del(`/api/notifications/telegram/chats/${encodeURIComponent(e.chatId)}`),u.success(`Disconnected ${e.name}`,{description:`It no longer gets alerts.`})}catch(e){u.error(`Could not disconnect`,{description:X(e)})}finally{await f()}},y=async()=>{c(!0);try{await d.post(`/api/settings/telegram/test`,{}),u.success(`Test sent to Telegram`)}catch(e){u.error(`Test not delivered`,{description:X(e)})}finally{c(!1)}},b=n?.chats??[];return(0,G.jsxs)(`section`,{className:`space-y-3`,children:[(0,G.jsx)(C,{title:`Telegram`,children:`Alerts in a chat with your own Telegram bot. A chat connected here gets alerts and nothing else — PPMBot has its own bot and chats.`}),i&&(0,G.jsx)(`p`,{className:`text-xs text-error`,children:i}),n?.configured&&(0,G.jsxs)(G.Fragment,{children:[n.sharedWithPPMBot&&(0,G.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`PPMBot answers through this bot too, so alerts arrive in your PPMBot chats. Give PPMBot a bot of its own in Settings → PPMBot to keep them apart.`}),(0,G.jsx)(`div`,{className:`rounded-lg border border-border`,children:(0,G.jsx)(w,{label:`Send notifications to Telegram`,note:b.length===0?`No chat connected yet`:b.length===1?`1 chat connected`:`${b.length} chats connected`,checked:e.telegram,onChange:e=>void t({telegram:e})})}),(0,G.jsx)(O,{chats:b,onDisconnect:e=>void v(e)}),p?(0,G.jsx)(D,{link:p,botUsername:n.botUsername,error:n.connect.error,onCancel:()=>void _()}):(0,G.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row`,children:[(0,G.jsxs)(h,{onClick:()=>void g(),disabled:m,className:`min-h-11 cursor-pointer gap-2 md:min-h-9`,children:[m?(0,G.jsx)(l,{className:`size-4 animate-spin`}):(0,G.jsx)(s,{className:`size-4`}),b.length===0?`Connect Telegram`:`Connect another chat`]}),b.length>0&&(0,G.jsx)(h,{variant:`outline`,onClick:()=>void y(),disabled:o,className:`min-h-11 cursor-pointer md:min-h-9`,children:o?`Sending…`:`Send a test`})]})]}),n&&(0,G.jsx)(k,{configured:n.configured,botUsername:n.botUsername,onSaved:()=>void f()})]})}function $({settings:e,update:t}){let[n,r]=(0,A.useState)(null),[i,a]=(0,A.useState)(null),[o,s]=(0,A.useState)(!1),l=(0,A.useCallback)(async()=>{try{r(await d.get(`/api/notifications/ntfy`)),a(null)}catch(e){a(X(e))}},[]);(0,A.useEffect)(()=>{l()},[l]);let p=async()=>{s(!0);try{await d.post(`/api/notifications/ntfy/test`,{}),u.success(`Test sent to ntfy`)}catch(e){u.error(`Test not delivered`,{description:X(e)})}finally{s(!1)}},g=async()=>{try{await d.del(`/api/notifications/ntfy`),u.success(`ntfy removed`)}catch(e){u.error(`Could not remove ntfy`,{description:X(e)})}finally{await l()}};return(0,G.jsxs)(`section`,{className:`space-y-3`,children:[(0,G.jsx)(C,{title:`ntfy`,children:`Alerts through an ntfy server — ntfy.sh or one of your own — on every phone and computer subscribed to your topic.`}),i&&(0,G.jsx)(`p`,{className:`text-xs text-error`,children:i}),n?.configured&&(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`div`,{className:`rounded-lg border border-border`,children:(0,G.jsx)(w,{label:`Send notifications to ntfy`,note:(0,G.jsxs)(G.Fragment,{children:[`Topic `,(0,G.jsx)(`span`,{className:`font-mono`,children:n.topic}),` on `,Q(n.server)]}),checked:e.ntfy,onChange:e=>void t({ntfy:e})})}),(0,G.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row`,children:[(0,G.jsx)(h,{variant:`outline`,onClick:()=>void p(),disabled:o,className:`min-h-11 cursor-pointer md:min-h-9`,children:o?`Sending…`:`Send a test`}),(0,G.jsxs)(`a`,{href:`${n.server}/${n.topic}`,target:`_blank`,rel:`noopener noreferrer`,className:f(m({variant:`outline`}),`min-h-11 gap-2 md:min-h-9`),children:[`Open the topic`,(0,G.jsx)(c,{className:`size-3.5`})]})]})]}),n&&(0,G.jsx)(ae,{status:n,onSaved:r,onRemove:()=>void g()},`${n.server}/${n.topic}`)]})}export{oe as NotificationsSettingsSection};
1
+ import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{Ar as r,Kr as i,Ln as a,P as o,Sr as s,gt as c,xn as l}from"./icons-C1wDt09O.js";import{k as u,r as d}from"./api-client-BnYFnEfK.js";import{n as f}from"./utils-D3xTlJyU.js";import{t as p}from"./format-date-SZ6qU2sD.js";import{n as m,t as h}from"./button-BHGVTbam.js";import{t as g}from"./input-CReAuQTF.js";import{t as _}from"./separator-DUdRLaL0.js";import{a as v,i as y,n as b,o as x,r as S}from"./notification-settings--li9wGTJ.js";import{n as C,r as w,t as T}from"./settings-rows-VtjChFlm.js";import{i as E,n as D,r as O,t as k}from"./telegram-bot-token-field-DSLtG8vw.js";var A=e(t(),1),j=`Notifications are blocked for this site. Allow them in the browser's site settings, then turn this on again.`;function M(e){return e.secure?e.ios&&!e.standalone?{state:`unavailable`,message:`On iPhone and iPad, push works only in PPM added to the Home Screen: tap Share → Add to Home Screen, open PPM from there, then turn this on.`}:!e.serviceWorker||!e.pushManager||!e.notification?e.browser===`Firefox`&&e.serviceWorker&&e.notification?{state:`unavailable`,message:`Push is turned off in this browser. Open about:config, set dom.push.enabled to true, then restart the browser.`}:{state:`unavailable`,message:`This browser cannot receive push notifications.`}:e.permission===`denied`?{state:`blocked`,message:j}:{state:`available`}:{state:`unavailable`,message:`Push needs PPM on HTTPS or localhost. Browsers turn it off on a plain HTTP address like this one.`}}var ee=6e4;function te(e,t){let n,r=new Promise((e,r)=>{n=setTimeout(()=>r(new DOMException(`The push service did not answer.`,`TimeoutError`)),t)});return Promise.race([e,r]).finally(()=>clearTimeout(n))}var N={Brave:`Google`,Chrome:`Google`,Firefox:`Mozilla`,Safari:`Apple`};function P(e,t){let{name:n,message:r}=t??{};if(n!==`AbortError`&&n!==`TimeoutError`)return null;if(e===`Brave`&&n===`AbortError`)return`Brave keeps push off until you allow it: open brave://settings/privacy, turn on “Use Google services for push messaging”, restart Brave, then turn this on again.`;let i=N[e],a=i?`${i}'s push service`:`its push service`,o=n===`TimeoutError`?`got no answer from ${a} within a minute`:`could not register with ${a}`,s=n===`AbortError`&&typeof r==`string`&&r?` (${r})`:``;return`${e===`Browser`?`This browser`:e} ${o}${s}. A firewall, VPN, DNS filter or ad blocker may be blocking it${i?``:`, or push is turned off in this browser`}. Telegram and ntfy below work without it.`}function F(e,t,n){return/iPhone|iPad|iPod/.test(e)||t===`MacIntel`&&n>1}function I(e){return/Edg(A|iOS)?\//.test(e)?`Edge`:/OPR\//.test(e)?`Opera`:/SamsungBrowser\//.test(e)?`Samsung Internet`:/Firefox\/|FxiOS\//.test(e)?`Firefox`:/Chrome\/|CriOS\//.test(e)?`Chrome`:/Safari\//.test(e)?`Safari`:`Browser`}function L(e,t=!1,n=I(e)){let r=/Android/.test(e)?`Android`:/iPhone|iPod/.test(e)?`iPhone`:/iPad/.test(e)||t?`iPad`:/Mac OS X/.test(e)?`macOS`:/Windows/.test(e)?`Windows`:/CrOS/.test(e)?`ChromeOS`:/Linux/.test(e)?`Linux`:``;return r?`${n} on ${r}`:n}function ne(e){let t=e.replace(/-/g,`+`).replace(/_/g,`/`).padEnd(Math.ceil(e.length/4)*4,`=`),n=atob(t),r=new Uint8Array(n.length);for(let e=0;e<n.length;e++)r[e]=n.charCodeAt(e);return r}function re(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function ie(){return navigator.platform===`MacIntel`&&navigator.maxTouchPoints>1}function R(){if(`brave`in navigator)return`Brave`;let e=I(navigator.userAgent),t=navigator.userAgentData?.brands;return e===`Chrome`&&t&&!t.some(e=>e.brand===`Google Chrome`)?`Browser`:e}function z(){return M({secure:window.isSecureContext,serviceWorker:`serviceWorker`in navigator,pushManager:`PushManager`in window,notification:`Notification`in window,ios:F(navigator.userAgent,navigator.platform,navigator.maxTouchPoints),standalone:window.matchMedia?.(`(display-mode: standalone)`).matches||navigator.standalone===!0,permission:`Notification`in window?Notification.permission:null,browser:R()})}function B(){return L(navigator.userAgent,ie(),`brave`in navigator?`Brave`:void 0)}async function V(){return z().state===`unavailable`?null:await(await navigator.serviceWorker.getRegistration())?.pushManager.getSubscription()??null}function H(e,t){let n=e.options.applicationServerKey;return!!n&&re(new Uint8Array(n))===t}async function U(e){let t=await Notification.requestPermission();if(t!==`granted`)throw Error(t===`denied`?j:`Notifications were not allowed.`);if(!await navigator.serviceWorker.getRegistration())throw Error(`PPM's service worker is not running on this page, so it cannot receive push.`);let n=await navigator.serviceWorker.ready,r=await n.pushManager.getSubscription();r&&!H(r,e)&&(await d.post(`/api/notifications/push/unsubscribe`,{endpoint:r.endpoint}).catch(()=>{}),await r.unsubscribe(),r=null);try{r??=await te(n.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:ne(e)}),ee)}catch(e){let t=P(R(),e);throw t?Error(t):e}return d.post(`/api/notifications/push/subscribe`,{subscription:r.toJSON(),label:B(),origin:window.location.origin})}async function W(){let e=await V();if(e)try{await d.post(`/api/notifications/push/unsubscribe`,{endpoint:e.endpoint})}finally{await e.unsubscribe()}}var G=n(),K=`https://ntfy.sh`;function q(){let e=crypto.getRandomValues(new Uint8Array(12));return`ppm-${Array.from(e,e=>`abcdefghijklmnopqrstuvwxyz0123456789`[e%36]).join(``)}`}function J(e){try{return new URL(e).host}catch{return e}}function ae({status:e,onSaved:t,onRemove:n}){let r=(0,A.useId)(),i=(0,A.useId)(),a=(0,A.useId)(),[s,l]=(0,A.useState)(e.server||K),[u,p]=(0,A.useState)(()=>e.topic||q()),[_,v]=(0,A.useState)(``),[y,b]=(0,A.useState)(!1),[S,C]=(0,A.useState)(null),[w,T]=(0,A.useState)(!e.configured),E=x(s),D=e.tokenSet&&E===e.server,O=!e.configured||E!==e.server||u.trim()!==e.topic||_.trim()!==``,k=e=>t=>{e(t.target.value),C(null)},j=async()=>{b(!0),C(null);try{let e=await d.put(`/api/notifications/ntfy`,{server:s,topic:u,..._.trim()?{token:_.trim()}:{}});v(``),T(!1),t(e)}catch(e){C(e instanceof Error?e.message:String(e))}finally{b(!1)}};return(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsxs)(`form`,{className:`space-y-3`,onSubmit:e=>{e.preventDefault(),j()},children:[(0,G.jsx)(Y,{id:r,label:`Server`,children:(0,G.jsx)(g,{id:r,inputMode:`url`,autoCapitalize:`none`,autoCorrect:`off`,autoComplete:`off`,spellCheck:!1,placeholder:K,value:s,onChange:k(l),className:`h-11 w-full text-sm md:h-9`})}),(0,G.jsx)(Y,{id:i,label:`Topic`,children:(0,G.jsx)(g,{id:i,autoCapitalize:`none`,autoCorrect:`off`,autoComplete:`off`,spellCheck:!1,value:u,onChange:k(p),className:`h-11 w-full font-mono text-sm md:h-9`})}),(0,G.jsx)(Y,{id:a,label:`Access token — only if the server requires sign-in`,children:(0,G.jsx)(g,{id:a,type:`password`,autoComplete:`off`,spellCheck:!1,placeholder:D?`•••••• (saved)`:`tk_…`,value:_,onChange:k(v),className:`h-11 w-full font-mono text-sm md:h-9`})}),e.tokenSet&&!D&&!_.trim()&&(0,G.jsxs)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:[`The saved token is for `,J(e.server),` and is not sent to another server.`]}),S&&(0,G.jsx)(`p`,{className:`text-xs text-error`,children:S}),(0,G.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row`,children:[(0,G.jsx)(h,{type:`submit`,disabled:y||!O,className:`min-h-11 cursor-pointer md:min-h-9`,children:y?`Checking…`:`Save`}),e.configured&&(0,G.jsx)(h,{type:`button`,variant:`ghost`,onClick:n,className:`min-h-11 cursor-pointer text-error hover:text-error md:min-h-9`,children:`Remove ntfy`})]})]}),(0,G.jsxs)(`button`,{type:`button`,onClick:()=>T(e=>!e),"aria-expanded":w,className:`flex min-h-11 cursor-pointer items-center gap-1 text-xs text-primary md:min-h-8`,children:[(0,G.jsx)(o,{className:f(`size-3.5 transition-transform`,!w&&`-rotate-90`)}),`How to set up ntfy`]}),w&&(0,G.jsxs)(`div`,{className:`space-y-3 rounded-lg border border-border px-4 py-3`,children:[(0,G.jsxs)(`ol`,{className:`list-decimal space-y-1.5 pl-4 text-sm leading-relaxed`,children:[(0,G.jsx)(`li`,{children:`Install the ntfy app on your phone, or open the server in a browser.`}),(0,G.jsxs)(`li`,{children:[`Subscribe to the topic above. For a server other than ntfy.sh, turn on `,(0,G.jsx)(`b`,{children:`Use another server`}),` and enter its address.`]}),(0,G.jsxs)(`li`,{children:[`If the server asks you to sign in, create a token in its web app under `,(0,G.jsx)(`b`,{children:`Account → Access tokens`}),` and paste it above. Its user needs permission to publish to the topic.`]}),(0,G.jsx)(`li`,{children:`Save, then send a test.`})]}),(0,G.jsxs)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:[`On ntfy.sh anyone who knows a topic's name can read it, so keep the name hard to guess. An iPhone gets instant alerts from a server of your own only when that server sets`,` `,(0,G.jsx)(`code`,{className:`rounded bg-muted px-1 py-0.5`,children:`upstream-base-url: "https://ntfy.sh"`}),`.`]}),(0,G.jsxs)(`a`,{href:`https://docs.ntfy.sh/subscribe/phone/`,target:`_blank`,rel:`noopener noreferrer`,className:f(m({variant:`outline`}),`min-h-11 w-full gap-2 md:min-h-9 sm:w-auto`),children:[`The ntfy app guide`,(0,G.jsx)(c,{className:`size-3.5`})]})]})]})}function Y({id:e,label:t,children:n}){return(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(`label`,{htmlFor:e,className:`text-xs text-muted-foreground`,children:t}),n]})}var X=e=>e instanceof Error?e.message:String(e),Z=e=>p(new Date(e).toISOString());function oe(){let[e,t]=(0,A.useState)(null),[n,r]=(0,A.useState)(null),i=(0,A.useCallback)(async()=>{try{t(await d.get(`/api/notifications/settings`)),r(null)}catch(e){r(X(e))}},[]);(0,A.useEffect)(()=>{i()},[i]);let a=(0,A.useCallback)(async e=>{t(t=>t&&v(t,e));try{await d.put(`/api/notifications/settings`,e)}catch(e){u.error(`Could not save`,{description:X(e)}),await i()}},[i]);return e?(0,G.jsxs)(`div`,{className:`space-y-6`,children:[(0,G.jsx)(se,{settings:e,update:a}),(0,G.jsx)(_,{}),(0,G.jsx)(ce,{}),(0,G.jsx)(_,{}),(0,G.jsx)(le,{settings:e,update:a}),(0,G.jsx)(_,{}),(0,G.jsx)($,{settings:e,update:a})]}):(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:n??`Loading…`})}function se({settings:e,update:t}){let n=(0,A.useId)(),r=b.some(t=>t.seconds===e.delay_seconds)?b:[...b,{seconds:e.delay_seconds,label:`After ${e.delay_seconds} seconds`}];return(0,G.jsxs)(`section`,{className:`space-y-3`,children:[(0,G.jsx)(C,{title:`When to notify`,children:`For every channel below, on every device.`}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(`label`,{htmlFor:n,className:`text-xs text-muted-foreground`,children:`Send a notification`}),(0,G.jsx)(`select`,{id:n,value:e.delay_seconds,onChange:e=>void t({delay_seconds:Number(e.target.value)}),className:`h-11 w-full rounded-md border border-input bg-background px-3 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring md:h-9`,children:r.map(e=>(0,G.jsx)(`option`,{value:e.seconds,children:e.label},e.seconds))}),(0,G.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:e.delay_seconds===0?`Sent the moment it happens, even while you are looking at the chat.`:`Sent only if the chat is still unread by then. Opening it in PPM on any device cancels the notification, and so does answering an approval.`})]}),(0,G.jsx)(`div`,{className:`divide-y divide-border rounded-lg border border-border`,children:S.map(n=>(0,G.jsx)(w,{label:y[n].label,note:y[n].note,checked:e.events[n],onChange:e=>void t({events:{[n]:e}})},n))})]})}function ce(){let[e,t]=(0,A.useState)(null),[n,o]=(0,A.useState)(null),[c,f]=(0,A.useState)(null),[p,m]=(0,A.useState)(!1),[h,g]=(0,A.useState)(!1),[_,v]=(0,A.useState)(null),[y,b]=(0,A.useState)(null),x=z(),S=(0,A.useCallback)(async()=>{try{let[e,n]=await Promise.all([d.get(`/api/notifications/push`),V().catch(()=>null)]);t(e),o(n),f(null)}catch(e){f(X(e))}},[]);(0,A.useEffect)(()=>{S()},[S]);let E=n&&e&&H(n,e.publicKey)?e.devices.find(e=>e.endpoint===n.endpoint)??null:null,D=async t=>{if(e){m(!0),g(t),v(null);try{t?(await U(e.publicKey),u.success(`Push is on for this device`)):await W()}catch(e){t?v(X(e)):u.error(`Could not turn push off`,{description:X(e)})}finally{m(!1),g(!1),await S()}}},O=async e=>{b(e.id);try{await d.post(`/api/notifications/push/test`,{id:e.id}),u.success(`Test sent to ${e.label}`)}catch(e){u.error(`Test not delivered`,{description:X(e)})}finally{b(null),await S()}},k=async e=>{if(e.id===E?.id)return D(!1);try{await d.post(`/api/notifications/push/unsubscribe`,{id:e.id})}catch(e){u.error(`Could not remove it`,{description:X(e)})}finally{await S()}},j=x.state===`unavailable`||x.state===`blocked`&&!E;return(0,G.jsxs)(`section`,{className:`space-y-3`,children:[(0,G.jsx)(C,{title:`Push notifications`,children:`Alerts on this phone or computer, even with PPM closed. Turn it on in each browser that should get them.`}),(0,G.jsx)(`div`,{className:`rounded-lg border border-border`,children:(0,G.jsx)(w,{label:`This device`,note:B(),checked:!!E,disabled:p||!e||j,onChange:e=>void D(e)})}),x.state!==`available`&&(0,G.jsx)(`p`,{className:`text-xs leading-relaxed text-warning`,children:x.message}),h&&(0,G.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`Waiting for the browser's push service. Just after the browser starts, this can take up to a minute.`}),_&&(0,G.jsx)(`p`,{className:`break-words text-xs leading-relaxed text-error`,children:_}),c&&(0,G.jsx)(`p`,{className:`text-xs text-error`,children:c}),e&&e.devices.length>0&&(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Receiving push`}),(0,G.jsx)(`ul`,{className:`divide-y divide-border rounded-lg border border-border`,children:e.devices.map(e=>(0,G.jsxs)(`li`,{className:`flex items-center gap-3 py-1.5 pl-4 pr-1`,children:[(0,G.jsx)(/Android|iPhone|iPad/.test(e.label)?r:a,{className:`size-4 shrink-0 text-muted-foreground`}),(0,G.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,G.jsxs)(`p`,{className:`flex min-w-0 items-center gap-1.5 text-sm`,children:[(0,G.jsx)(`span`,{className:`truncate`,children:e.label}),e.id===E?.id&&(0,G.jsx)(`span`,{className:`shrink-0 rounded bg-primary/10 px-1.5 py-0.5 text-[10px] text-primary`,children:`This device`})]}),(0,G.jsxs)(`p`,{className:`truncate text-xs text-muted-foreground`,children:[Q(e.origin),` · `,e.lastSuccessAt?`delivered ${Z(e.lastSuccessAt)}`:`added ${Z(e.createdAt)}`]}),e.lastError&&(0,G.jsx)(`p`,{className:`break-words text-xs text-error`,children:e.lastError})]}),(0,G.jsx)(T,{label:`Send a test to ${e.label}`,disabled:y!==null,onClick:()=>void O(e),children:y===e.id?(0,G.jsx)(l,{className:`size-4 animate-spin`}):(0,G.jsx)(s,{className:`size-4`})}),(0,G.jsx)(T,{label:`Stop push to ${e.label}`,danger:!0,disabled:p,onClick:()=>void k(e),children:(0,G.jsx)(i,{className:`size-4`})})]},e.id))})]})]})}function Q(e){try{return new URL(e).host}catch{return e}}function le({settings:e,update:t}){let[n,r]=(0,A.useState)(null),[i,a]=(0,A.useState)(null),[o,c]=(0,A.useState)(!1),f=(0,A.useCallback)(async()=>{try{let e=await d.get(`/api/notifications/telegram`);return r(e),a(null),e}catch(e){return a(X(e)),null}},[]);(0,A.useEffect)(()=>{f()},[f]);let{link:p,starting:m,connect:g,cancel:_}=E(`/api/notifications/telegram/connect`,n,f),v=async e=>{try{await d.del(`/api/notifications/telegram/chats/${encodeURIComponent(e.chatId)}`),u.success(`Disconnected ${e.name}`,{description:`It no longer gets alerts.`})}catch(e){u.error(`Could not disconnect`,{description:X(e)})}finally{await f()}},y=async()=>{c(!0);try{await d.post(`/api/settings/telegram/test`,{}),u.success(`Test sent to Telegram`)}catch(e){u.error(`Test not delivered`,{description:X(e)})}finally{c(!1)}},b=n?.chats??[];return(0,G.jsxs)(`section`,{className:`space-y-3`,children:[(0,G.jsx)(C,{title:`Telegram`,children:`Alerts in a chat with your own Telegram bot. A chat connected here gets alerts and nothing else — PPMBot has its own bot and chats.`}),i&&(0,G.jsx)(`p`,{className:`text-xs text-error`,children:i}),n?.configured&&(0,G.jsxs)(G.Fragment,{children:[n.sharedWithPPMBot&&(0,G.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`PPMBot answers through this bot too, so alerts arrive in your PPMBot chats. Give PPMBot a bot of its own in Settings → PPMBot to keep them apart.`}),(0,G.jsx)(`div`,{className:`rounded-lg border border-border`,children:(0,G.jsx)(w,{label:`Send notifications to Telegram`,note:b.length===0?`No chat connected yet`:b.length===1?`1 chat connected`:`${b.length} chats connected`,checked:e.telegram,onChange:e=>void t({telegram:e})})}),(0,G.jsx)(O,{chats:b,onDisconnect:e=>void v(e)}),p?(0,G.jsx)(D,{link:p,botUsername:n.botUsername,error:n.connect.error,onCancel:()=>void _()}):(0,G.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row`,children:[(0,G.jsxs)(h,{onClick:()=>void g(),disabled:m,className:`min-h-11 cursor-pointer gap-2 md:min-h-9`,children:[m?(0,G.jsx)(l,{className:`size-4 animate-spin`}):(0,G.jsx)(s,{className:`size-4`}),b.length===0?`Connect Telegram`:`Connect another chat`]}),b.length>0&&(0,G.jsx)(h,{variant:`outline`,onClick:()=>void y(),disabled:o,className:`min-h-11 cursor-pointer md:min-h-9`,children:o?`Sending…`:`Send a test`})]})]}),n&&(0,G.jsx)(k,{configured:n.configured,botUsername:n.botUsername,onSaved:()=>void f()})]})}function $({settings:e,update:t}){let[n,r]=(0,A.useState)(null),[i,a]=(0,A.useState)(null),[o,s]=(0,A.useState)(!1),l=(0,A.useCallback)(async()=>{try{r(await d.get(`/api/notifications/ntfy`)),a(null)}catch(e){a(X(e))}},[]);(0,A.useEffect)(()=>{l()},[l]);let p=async()=>{s(!0);try{await d.post(`/api/notifications/ntfy/test`,{}),u.success(`Test sent to ntfy`)}catch(e){u.error(`Test not delivered`,{description:X(e)})}finally{s(!1)}},g=async()=>{try{await d.del(`/api/notifications/ntfy`),u.success(`ntfy removed`)}catch(e){u.error(`Could not remove ntfy`,{description:X(e)})}finally{await l()}};return(0,G.jsxs)(`section`,{className:`space-y-3`,children:[(0,G.jsx)(C,{title:`ntfy`,children:`Alerts through an ntfy server — ntfy.sh or one of your own — on every phone and computer subscribed to your topic.`}),i&&(0,G.jsx)(`p`,{className:`text-xs text-error`,children:i}),n?.configured&&(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(`div`,{className:`rounded-lg border border-border`,children:(0,G.jsx)(w,{label:`Send notifications to ntfy`,note:(0,G.jsxs)(G.Fragment,{children:[`Topic `,(0,G.jsx)(`span`,{className:`font-mono`,children:n.topic}),` on `,Q(n.server)]}),checked:e.ntfy,onChange:e=>void t({ntfy:e})})}),(0,G.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row`,children:[(0,G.jsx)(h,{variant:`outline`,onClick:()=>void p(),disabled:o,className:`min-h-11 cursor-pointer md:min-h-9`,children:o?`Sending…`:`Send a test`}),(0,G.jsxs)(`a`,{href:`${n.server}/${n.topic}`,target:`_blank`,rel:`noopener noreferrer`,className:f(m({variant:`outline`}),`min-h-11 gap-2 md:min-h-9`),children:[`Open the topic`,(0,G.jsx)(c,{className:`size-3.5`})]})]})]}),n&&(0,G.jsx)(ae,{status:n,onSaved:r,onRemove:()=>void g()},`${n.server}/${n.topic}`)]})}export{oe as NotificationsSettingsSection};
@@ -1 +1 @@
1
- import{r as e}from"./utils-D3xTlJyU.js";import{J as t,W as n,X as r,Y as i,it as a,nt as o,xt as s}from"./window-store-UcSFgNCI.js";import{t as c}from"./panel-store-Dx2ziBLp.js";import{t as l}from"./tab-store-B4v2kAEY.js";import{E as u}from"./explorer-model-tGyFETP_.js";function d(e){let t=e.toLowerCase();return t.endsWith(`[]`)?`other`:/^(character varying|varchar|character|char|bpchar|text|name|citext)\b/.test(t)?`text`:/^(smallint|integer|bigint|int[248]?|numeric|decimal|real|double precision|float[48]?|money|oid|smallserial|serial|bigserial)\b/.test(t)?`number`:t===`boolean`||t===`bool`?`boolean`:t===`date`?`date`:/^timestamp(\(\d+\))? with time zone$/.test(t)||t===`timestamptz`?`datetimetz`:/^timestamp/.test(t)?`datetime`:/^time/.test(t)?`time`:t===`bytea`?`binary`:t===`json`||t===`jsonb`?`json`:`other`}function f(e){let t=e.toUpperCase();return/BOOL/.test(t)?`boolean`:/^DATE$/.test(t)?`date`:/DATETIME|TIMESTAMP/.test(t)?`datetime`:/^TIME$/.test(t)?`time`:/JSON/.test(t)?`json`:/INT/.test(t)?`number`:/CHAR|CLOB|TEXT/.test(t)?`text`:t===``?`other`:/BLOB/.test(t)?`binary`:/REAL|FLOA|DOUB|NUM|DEC/.test(t)?`number`:`other`}function p(e){let t=e.toLowerCase().trim();return/^(tinyint\(1\)|bool|boolean|bit\(1\))(\s|$)/.test(t)?`boolean`:/^(tinyint|smallint|mediumint|int|integer|bigint|decimal|numeric|dec|fixed|float|double|real|bit|year)\b/.test(t)?`number`:/^(char|varchar|tinytext|text|mediumtext|longtext|enum|set|national)\b/.test(t)?`text`:t===`date`?`date`:/^(datetime|timestamp)\b/.test(t)?`datetime`:/^time\b/.test(t)?`time`:/^(binary|varbinary|tinyblob|blob|mediumblob|longblob)\b/.test(t)?`binary`:t===`json`?`json`:`other`}var ee={postgres:d,sqlite:f,mysql:p,mariadb:p};function m(e,t){return(ee[e]??(()=>`other`))(t)}var te=1e4,ne=5e3,re=4e3;function ie(e){let t=new Set(e),n=new Set;return e.map(e=>{if(!n.has(e))return n.add(e),e;let r=2;for(;n.has(`${e} (${r})`)||t.has(`${e} (${r})`);)r++;let i=`${e} (${r})`;return n.add(i),i})}function h(e,t){let n=ie(e.map(e=>e.name));return{keys:n,records:t.map(e=>{let t={};return n.forEach((n,r)=>{t[n]=e[r]}),t})}}function ae(e){let{keys:t,records:n}=h(e.columns,e.rows);return{...e,columns:t,rows:n}}var oe=[`!=`,`<>`,`<=`,`>=`,`!^`,`!$`,`=`,`<`,`>`,`+`,`~`,`^`,`$`],g=new Set([`+`,`~`,`^`,`!^`,`$`,`!$`]),se=64,_=/\s/,ce=/^-?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?$/i,le=/^(\d{4})(?:-(\d{2})(?:-(\d{2})(?:[T ](\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{1,6}))?)?(Z|[+-]\d{2}(?::?\d{2})?)?)?)?)?$/i,ue=/^\d{4}-\d{2}-\d{2}$/,de=/^\d{2}:\d{2}(?::\d{2}(?:\.\d{1,6})?)?(?:Z|[+-]\d{2}(?::?\d{2})?)?$/i,fe=`use 2021, 2021-02, 2021-02-15 or 2021-02-15 23:15`,v=class extends Error{constructor(e,t,n){super(e),this.start=t,this.end=n}};function y(e,t,n){throw new v(e,t,n)}function b(e,t){for(;t<e.length&&_.test(e[t]);)t++;return t}function pe(e,t){let n=e[t],r=``;for(let i=t+1;i<e.length;i++)if(e[i]!==n)r+=e[i];else if(e[i+1]===n)r+=n,i++;else return{value:r,end:i+1};y(`Missing closing ${n}`,t,e.length)}function me(e,t){let n=0,r=null,i=-1;for(let a=t;a<e.length;a++){let o=e[a];if(r)o===r&&(r=null);else if(o===`'`||o===`"`||o==="`")r=o;else if(o===`;`)i<0&&(i=a);else if(o===`{`)n++;else if(o===`}`&&--n===0){let n=e.slice(t+1,a).trim();return n||y(`The SQL condition is empty`,t,a+1),n.length>4e3&&y(`An SQL condition may hold at most ${re} characters`,t,a+1),i>=0&&y(`An SQL condition may not contain ";"`,i,i+1),{sql:n,end:a+1}}}y(`Missing closing }`,t,e.length)}function he(e,t){let n=oe.find(n=>e.startsWith(n,t))??null,r=t;n&&(r=b(e,t+n.length),(r===e.length||e[r]===`,`)&&y(`Expected a value after "${n}"`,t,t+n.length));let i=e[r];if(i===`'`||i===`"`){let{value:i,end:a}=pe(e,r);return{op:n,text:i,quoted:!0,sql:!1,start:t,valueStart:r,end:a}}if(i===`{`&&!n){let{sql:n,end:i}=me(e,r);return{op:null,text:n,quoted:!1,sql:!0,start:t,valueStart:r,end:i}}let a=r;for(;a<e.length&&!_.test(e[a])&&e[a]!==`,`;)a++;return{op:n,text:e.slice(r,a),quoted:!1,sql:!1,start:t,valueStart:r,end:a}}function x(e){let t=b(e,0);if(t===e.length)return[];let n=[[]];for(;;){e[t]===`,`&&y(`Expected a value before ","`,t,t+1);let r=he(e,t);n[n.length-1].push(r);let i=b(e,r.end);if(i===e.length)return n;e[i]===`,`?(t=b(e,i+1),t===e.length&&y(`Expected a value after ","`,i,i+1),n.push([])):i===r.end?y(`Expected a space or a comma`,i,i+1):t=i}}function S(e){return e&&e.op===null&&!e.quoted&&!e.sql?e.text.toUpperCase():null}function C(e){switch(e){case`number`:case`boolean`:case`binary`:return e;case`date`:case`datetime`:case`datetimetz`:return`date`;default:return`text`}}var w=(e,t=1)=>({alt:[[e]],used:t});function T(e,t){y(`"${e.op}" does not work on ${t} columns`,e.start,e.start+e.op.length)}function ge(e,t){let n=e[t],r=S(n);if(r===`EMPTY`)return w({op:`isEmpty`});if(r===`NOT`&&S(e[t+1])===`EMPTY`)return w({op:`notEmpty`},2);let i=n.text;switch(n.op){case null:case`+`:return w({op:`contains`,value:i});case`~`:return w({op:`notContains`,value:i});case`^`:return w({op:`startsWith`,value:i});case`!^`:return w({op:`notStartsWith`,value:i});case`$`:return w({op:`endsWith`,value:i});case`!$`:return w({op:`notEndsWith`,value:i});case`=`:return w({op:`eq`,value:i});case`!=`:case`<>`:return w({op:`ne`,value:i});case`<`:return w({op:`lt`,value:i});case`>`:return w({op:`gt`,value:i});case`<=`:return w({op:`le`,value:i});case`>=`:return w({op:`ge`,value:i})}}function _e(e){let t=Number(e);if(!Number.isFinite(t))return e;if(/^-?\d+$/.test(e))return Number.isSafeInteger(t)?t:e;let n=e.replace(/^-/,``).replace(/e.*$/i,``).replace(`.`,``).replace(/^0+/,``).replace(/0+$/,``);return n.length<=15&&!(t===0&&n!==``)?t:e}function ve(e){e.op&&g.has(e.op)&&T(e,`number`),ce.test(e.text)||y(`"${e.text}" is not a number`,e.valueStart,e.end);let t=_e(e.text);switch(e.op){case`!=`:case`<>`:return w({op:`ne`,value:t});case`<`:return w({op:`lt`,value:t});case`>`:return w({op:`gt`,value:t});case`<=`:return w({op:`le`,value:t});case`>=`:return w({op:`ge`,value:t});default:return w({op:`eq`,value:t})}}function ye(e){e.op&&e.op!==`=`&&T(e,`boolean`);let t=e.text.toUpperCase();if(t===`TRUE`||t===`1`)return w({op:`isTrue`});if(t===`FALSE`||t===`0`)return w({op:`isFalse`});y(`"${e.text}" is not TRUE or FALSE`,e.valueStart,e.end)}function E(e,t=1,n=1,r=0,i=0,a=0,o=``){return{y:e,mo:t,d:n,h:r,mi:i,s:a,frac:o}}function D(e,t,n){let r=new Date(0);return r.setUTCFullYear(e.y,e.mo-1,e.d),r.setUTCHours(e.h,e.mi,e.s,0),t===`year`?r.setUTCFullYear(r.getUTCFullYear()+n):t===`month`?r.setUTCMonth(r.getUTCMonth()+n):t===`day`?r.setUTCDate(r.getUTCDate()+n):t===`minute`?r.setUTCMinutes(r.getUTCMinutes()+n):r.setUTCSeconds(r.getUTCSeconds()+n),E(r.getUTCFullYear(),r.getUTCMonth()+1,r.getUTCDate(),r.getUTCHours(),r.getUTCMinutes(),r.getUTCSeconds(),e.frac)}function O(e,t){if(t!==`fraction`)return D(e,t,1);let n=e.frac.length,r=Number(e.frac)+1;return r<10**n?{...e,frac:String(r).padStart(n,`0`)}:{...D(e,`second`,1),frac:`0`.repeat(n)}}function be(e,t){let n=new Date(0);return n.setUTCFullYear(e,t,0),n.getUTCDate()}var k=(e,t=2)=>String(e).padStart(t,`0`);function xe(e){return`${k(e.y,4)}-${k(e.mo)}-${k(e.d)} ${k(e.h)}:${k(e.mi)}:${k(e.s)}${e.frac?`.${e.frac}`:``}`}function Se(e){let t=Math.abs(e);return`${e<0?`-`:`+`}${k(Math.floor(t/60))}:${k(t%60)}`}function Ce(e){let t=new Date(2e3,0,1);return t.setFullYear(e.y,e.mo-1,e.d),t.setHours(e.h,e.mi,e.s,0),Se(-Math.round(t.getTimezoneOffset()))}function we(e){let t=le.exec(e);if(!t)return null;let[,n,r,i,a,o,s,c,l]=t,u=E(Number(n),r?Number(r):1,i?Number(i):1,a?Number(a):0,o?Number(o):0,s?Number(s):0,c??``);if(u.mo<1||u.mo>12||u.d<1||u.d>be(u.y,u.mo)||u.h>23||u.mi>59||u.s>59)return null;let d=c?`fraction`:s?`second`:o?`minute`:i?`day`:r?`month`:`year`,f=null;if(l)if(l.toUpperCase()===`Z`)f=0;else{let e=Number(l.slice(1,3)),t=Number(l.slice(3).replace(`:`,``)||`0`);if(e>23||t>59)return null;f=(l[0]===`-`?-1:1)*(e*60+t)}return{start:u,precision:d,zone:f}}function A(e,t,n,r){let i=e=>({at:xe(e),offset:r??Ce(e)}),a=i(t),o=n.y<=9999?i(n):null,s=e=>({op:`dateRange`,from:e.at,offset:e.offset}),c=e=>({op:`dateRange`,to:e.at,offset:e.offset});switch(e.op){case`!=`:case`<>`:return o?[[c(a)],[s(o)]]:[[c(a)]];case`>`:return o||y(`Nothing comes after the year 9999`,e.start,e.end),[[s(o)]];case`>=`:return[[s(a)]];case`<`:return[[c(a)]];case`<=`:return o?[[c(o)]]:[[{op:`notNull`}]];default:return o?a.offset===o.offset?[[{op:`dateRange`,from:a.at,to:o.at,offset:a.offset}]]:[[s(a),c(o)]]:[[s(a)]]}}var Te={YESTERDAY:-1,TODAY:0,TOMORROW:1},Ee={LAST:-1,THIS:0,NEXT:1};function De(e,t,n){let r=E(e.getFullYear(),e.getMonth()+1,e.getDate());if(n===`WEEK`){let n=D(r,`day`,7*t-(e.getDay()+6)%7);return[n,D(n,`day`,7)]}if(n===`MONTH`){let e=D(E(r.y,r.mo),`month`,t);return[e,D(e,`month`,1)]}let i=E(r.y+t);return[i,D(i,`year`,1)]}function Oe(e,t,n){let r=e[t],i=e[t+1];if(r.op&&g.has(r.op)&&T(r,`date`),!r.quoted){let e=r.text.toUpperCase(),t=Te[e];if(t!==void 0){let e=D(E(n.getFullYear(),n.getMonth()+1,n.getDate()),`day`,t);return{alt:A(r,e,D(e,`day`,1),null),used:1}}let a=Ee[e];if(a!==void 0){let t=S(i);t!==`WEEK`&&t!==`MONTH`&&t!==`YEAR`&&y(`Expected WEEK, MONTH or YEAR after ${e}`,r.valueStart,r.end);let[o,s]=De(n,a,t);return{alt:A({...r,end:i.end},o,s,null),used:2}}}let a=!r.quoted&&ue.test(r.text)&&S(i)!==null&&de.test(i.text),o=a?{...r,text:`${r.text} ${i.text}`,end:i.end}:r,s=we(o.text)??y(`"${o.text}" is not a date — ${fe}`,o.valueStart,o.end),c=a?2:1;if(s.zone===null)return{alt:A(o,s.start,O(s.start,s.precision),null),used:c};let l=D(s.start,`minute`,-s.zone);return{alt:A(o,l,O(l,s.precision),`+00:00`),used:c}}function ke(e,t,n,r){let i=e[t];if(i.sql)return w({op:`rawSql`,sql:i.text});let a=S(i);if(a===`NULL`)return w({op:`isNull`});if(a===`NOT`&&S(e[t+1])===`NULL`)return w({op:`notNull`},2);switch(n){case`text`:return ge(e,t);case`number`:return ve(i);case`boolean`:return ye(i);case`date`:return Oe(e,t,r);case`binary`:y(`A binary column can only be filtered with NULL, NOT NULL or an SQL condition in braces`,i.start,i.end)}}function Ae(e,t,n){let r=[[]];for(let i=0;i<e.length;){let{alt:a,used:o}=ke(e,i,t,n);r.length*a.length>se&&y(`Too many conditions joined with spaces`,e[i].start,e[i+o-1].end),r=r.flatMap(e=>a.map(t=>[...e,...t])),i+=o}return r}function je(e,t){let n=e=>e.length===1&&e[0].op===`eq`,r=e.filter(n).map(e=>e[0].value);if(r.length<2)return e;r.length>5e3&&y(`More than ${ne} values`,0,t.length);let i=e.findIndex(n),a=e.filter(e=>!n(e));return[...a.slice(0,i),[{op:`in`,values:r}],...a.slice(i)]}function j(e){if(!(e instanceof v))throw e;return{ok:!1,error:{message:e.message,start:e.start,end:e.end}}}function M(e,t,n=new Date){try{let r=C(t);return{ok:!0,anyOf:je(x(e).flatMap(e=>Ae(e,r,n)),e)}}catch(e){return j(e)}}function N(e,t,n=new Date){try{let t=x(e).flat().find(e=>e.sql);t&&y(`An SQL condition only works in one column's own filter`,t.start,t.end)}catch(e){return j(e)}let r=t.flatMap(t=>{let r=M(e,t.kind,n);return r.ok&&r.anyOf.length>0?[{column:t.name,anyOf:r.anyOf}]:[]});return r.length===0&&e.trim()?{ok:!1,error:{message:`No column can read this filter`,start:0,end:e.length}}:{ok:!0,groups:r}}var P={columns:{}},Me={state:`empty`};function Ne(e,t){return e.map(e=>({name:e.name,kind:t?m(t,e.type):`other`}))}function F(e,t){if(!e||!e.text.trim())return Me;let n=t(e.text);return n.ok?{state:e.off?`off`:`ok`}:{state:`bad`,error:n.error}}function Pe(e,t,n=new Date){return F(e,e=>M(e,t,n))}function Fe(e,t,n=new Date){return F(e,e=>N(e,t,n))}function Ie(e,t,n=new Date){let r=t.flatMap(t=>{let r=e.columns[t.name];if(!r||r.off)return[];let i=M(r.text,t.kind,n);return i.ok&&i.anyOf.length>0?[{column:t.name,anyOf:i.anyOf}]:[]}),i=e.multi,a=i&&!i.off?N(i.text,t,n):null;return{filters:r,anyColumn:a?.ok?a.groups:[]}}function Le(e,t,n){let r={...e.columns};return n.trim()?r[t]={text:n}:delete r[t],{...e,columns:r}}function Re(e,t){let{multi:n,...r}=e;return t.trim()?{...r,multi:{text:t}}:r}var I=(e,t)=>t?{text:e.text,off:!0}:{text:e.text};function ze(e,t,n){if(t===null)return e.multi?{...e,multi:I(e.multi,n)}:e;let r=e.columns[t];return r?{...e,columns:{...e.columns,[t]:I(r,n)}}:e}function L(e){return Object.keys(e.columns).length>0||!!e.multi?.text.trim()}function Be(e,t){let n=new Set(t.map(e=>e.name)),r=Object.entries(e.columns).filter(([e])=>n.has(e));return r.length===Object.keys(e.columns).length?e:{...e,columns:Object.fromEntries(r)}}var R=`filters`,z={columns:1e3,name:1e3,text:1e4},B=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function V(e){return!B(e)||typeof e.text!=`string`||!e.text.trim()||e.text.length>z.text?null:I({text:e.text},e.off===!0)}function Ve(e){let t=e?.[R];if(!B(t))return P;let n=B(t.columns)?Object.entries(t.columns).slice(0,z.columns).flatMap(([e,t])=>{let n=V(t);return n&&e&&e.length<=z.name?[[e,n]]:[]}):[],r=V(t.multi);return r?{columns:Object.fromEntries(n),multi:r}:{columns:Object.fromEntries(n)}}function H(e,t){let{[R]:n,...r}=e??{};return L(t)?{...r,[R]:t}:r}var He={is:`=`,isNot:`<>`,contains:``,begins:`^`,ends:`$`};function Ue(e,t){return t.split(/\r?\n/).map(e=>e.trim()).filter(Boolean).map(t=>`${He[e]}'${t.replaceAll(`'`,`''`)}'`).join(e===`isNot`?` `:`,`)}var U=`gridView`,W={min:170,max:420,initial:300},G={columns:1e3,name:1e3},K={min:40,max:2e3},q={hidden:[],panelWidth:W.initial,columnWidths:{},form:!1},J=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Y=e=>typeof e==`string`&&e.length>0&&e.length<=G.name;function X(e){return Number.isFinite(e)?Math.round(Math.min(W.max,Math.max(W.min,e))):W.initial}function We(e){let t=e?.[U];if(!J(t))return q;let n=Array.isArray(t.hidden)?[...new Set(t.hidden.slice(0,G.columns).filter(Y))]:[],r=typeof t.panelWidth==`number`?X(t.panelWidth):W.initial,i=J(t.columnWidths)?Object.entries(t.columnWidths).slice(0,G.columns).flatMap(([e,t])=>Y(e)&&typeof t==`number`&&Number.isFinite(t)&&t>=K.min&&t<=K.max?[[e,Math.round(t)]]:[]):[];return{hidden:n,panelWidth:r,columnWidths:Object.fromEntries(i),form:t.form===!0}}function Z(e,t){let{[U]:n,...r}=e??{},i={};return t.hidden.length&&(i.hidden=t.hidden),t.panelWidth!==W.initial&&(i.panelWidth=t.panelWidth),Object.keys(t.columnWidths).length&&(i.columnWidths=t.columnWidths),t.form&&(i.form=!0),Object.keys(i).length?{...r,[U]:i}:r}function Ge(e,t){let n=u(t,e);return{target:{kind:`connection`,connectionId:e.id,...n?{database:n}:{}},connectionName:e.name,dbType:e.type,connectionColor:e.color}}function Ke(e,t){let n=t?.connectionName,r=t?.connectionColor;return{target:e,...typeof n==`string`?{connectionName:n}:{},...typeof t?.dbType==`string`?{dbType:t.dbType}:{},...typeof r==`string`?{connectionColor:r}:{}}}function Q(e){return{...r(e.target),...e.connectionName?{connectionName:e.connectionName}:{},...e.dbType?{dbType:e.dbType}:{},...e.connectionColor?{connectionColor:e.connectionColor}:{}}}function $(e){return e.target.kind===`file`?e.target.projectName??null:null}function qe(e,t,r,i){return c.getState().openTab({type:e,title:n(t.target,t.connectionName,r.name),projectId:$(t),closable:!0,metadata:{...Q(t),schemaName:r.schema??``,tableName:r.name,...r.kind?{objectKind:r.kind}:{}}},i)}function Je(e,t){return qe(`database`,e,t)}function Ye(t,r,i){let a={...Q(t),schemaName:r.schema??``,tableName:r.name,instance:e()};return c.getState().openTab({type:`database`,title:n(t.target,t.connectionName,r.name),projectId:$(t),closable:!0,metadata:Z(H(a,i),{...q,form:!0})})}function Xe(e,t,n){return qe(`db-structure`,e,t,n)}function Ze(e,t,n){let r=c.getState().getPanelForTab(e),i=r?r.tabs.findIndex(t=>t.id===e):-1,a=Xe(t,n,r?.id);return r?(c.getState().closeTab(e,r.id),i>=0&&c.getState().reorderTab(a,r.id,i),a):a}function Qe(t,n){let r=a(Object.values(c.getState().panels).flatMap(e=>e.tabs));return l.getState().openTab({type:`db-structure`,title:`Table #${r}`,projectId:$(t),closable:!0,metadata:{...Q(t),...o(s(n),r,e())}})}function $e(e,t){return l.getState().openTab({type:`db-sql`,title:n(e.target,e.connectionName,t.name),projectId:$(e),closable:!0,metadata:{...Q(e),schemaName:t.schema??``,objectKind:t.kind,objectName:t.name,...t.args===void 0?{}:{objectArgs:t.args},...t.table?{objectTable:t.table}:{}}})}function et(e,n,r={}){let a=t(Object.values(c.getState().panels).flatMap(e=>e.tabs));return l.getState().openTab({type:`db-query`,title:`Query ${a}`,projectId:$(e),closable:!0,metadata:{...Q(e),...i(n,a,r)}})}export{H as A,L as C,Le as D,Ve as E,ae as F,h as I,m as L,N as M,M as N,ze as O,te as P,Be as S,Fe as T,R as _,Xe as a,Ie as b,Ke as c,W as d,U as f,P as g,Z as h,$e as i,C as j,Re as k,Ge as l,We as m,et as n,Ze as o,X as p,Ye as r,Je as s,Qe as t,q as u,z as v,Ue as w,Ne as x,Pe as y};
1
+ import{r as e}from"./utils-D3xTlJyU.js";import{J as t,W as n,X as r,Y as i,it as a,nt as o,xt as s}from"./window-store-D6EgLSfT.js";import{t as c}from"./panel-store-H7e9XHZF.js";import{t as l}from"./tab-store-NUmgzMPf.js";import{E as u}from"./explorer-model-f5q-50DN.js";function d(e){let t=e.toLowerCase();return t.endsWith(`[]`)?`other`:/^(character varying|varchar|character|char|bpchar|text|name|citext)\b/.test(t)?`text`:/^(smallint|integer|bigint|int[248]?|numeric|decimal|real|double precision|float[48]?|money|oid|smallserial|serial|bigserial)\b/.test(t)?`number`:t===`boolean`||t===`bool`?`boolean`:t===`date`?`date`:/^timestamp(\(\d+\))? with time zone$/.test(t)||t===`timestamptz`?`datetimetz`:/^timestamp/.test(t)?`datetime`:/^time/.test(t)?`time`:t===`bytea`?`binary`:t===`json`||t===`jsonb`?`json`:`other`}function f(e){let t=e.toUpperCase();return/BOOL/.test(t)?`boolean`:/^DATE$/.test(t)?`date`:/DATETIME|TIMESTAMP/.test(t)?`datetime`:/^TIME$/.test(t)?`time`:/JSON/.test(t)?`json`:/INT/.test(t)?`number`:/CHAR|CLOB|TEXT/.test(t)?`text`:t===``?`other`:/BLOB/.test(t)?`binary`:/REAL|FLOA|DOUB|NUM|DEC/.test(t)?`number`:`other`}function p(e){let t=e.toLowerCase().trim();return/^(tinyint\(1\)|bool|boolean|bit\(1\))(\s|$)/.test(t)?`boolean`:/^(tinyint|smallint|mediumint|int|integer|bigint|decimal|numeric|dec|fixed|float|double|real|bit|year)\b/.test(t)?`number`:/^(char|varchar|tinytext|text|mediumtext|longtext|enum|set|national)\b/.test(t)?`text`:t===`date`?`date`:/^(datetime|timestamp)\b/.test(t)?`datetime`:/^time\b/.test(t)?`time`:/^(binary|varbinary|tinyblob|blob|mediumblob|longblob)\b/.test(t)?`binary`:t===`json`?`json`:`other`}var ee={postgres:d,sqlite:f,mysql:p,mariadb:p};function m(e,t){return(ee[e]??(()=>`other`))(t)}var te=1e4,ne=5e3,re=4e3;function ie(e){let t=new Set(e),n=new Set;return e.map(e=>{if(!n.has(e))return n.add(e),e;let r=2;for(;n.has(`${e} (${r})`)||t.has(`${e} (${r})`);)r++;let i=`${e} (${r})`;return n.add(i),i})}function h(e,t){let n=ie(e.map(e=>e.name));return{keys:n,records:t.map(e=>{let t={};return n.forEach((n,r)=>{t[n]=e[r]}),t})}}function ae(e){let{keys:t,records:n}=h(e.columns,e.rows);return{...e,columns:t,rows:n}}var oe=[`!=`,`<>`,`<=`,`>=`,`!^`,`!$`,`=`,`<`,`>`,`+`,`~`,`^`,`$`],g=new Set([`+`,`~`,`^`,`!^`,`$`,`!$`]),se=64,_=/\s/,ce=/^-?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?$/i,le=/^(\d{4})(?:-(\d{2})(?:-(\d{2})(?:[T ](\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{1,6}))?)?(Z|[+-]\d{2}(?::?\d{2})?)?)?)?)?$/i,ue=/^\d{4}-\d{2}-\d{2}$/,de=/^\d{2}:\d{2}(?::\d{2}(?:\.\d{1,6})?)?(?:Z|[+-]\d{2}(?::?\d{2})?)?$/i,fe=`use 2021, 2021-02, 2021-02-15 or 2021-02-15 23:15`,v=class extends Error{constructor(e,t,n){super(e),this.start=t,this.end=n}};function y(e,t,n){throw new v(e,t,n)}function b(e,t){for(;t<e.length&&_.test(e[t]);)t++;return t}function pe(e,t){let n=e[t],r=``;for(let i=t+1;i<e.length;i++)if(e[i]!==n)r+=e[i];else if(e[i+1]===n)r+=n,i++;else return{value:r,end:i+1};y(`Missing closing ${n}`,t,e.length)}function me(e,t){let n=0,r=null,i=-1;for(let a=t;a<e.length;a++){let o=e[a];if(r)o===r&&(r=null);else if(o===`'`||o===`"`||o==="`")r=o;else if(o===`;`)i<0&&(i=a);else if(o===`{`)n++;else if(o===`}`&&--n===0){let n=e.slice(t+1,a).trim();return n||y(`The SQL condition is empty`,t,a+1),n.length>4e3&&y(`An SQL condition may hold at most ${re} characters`,t,a+1),i>=0&&y(`An SQL condition may not contain ";"`,i,i+1),{sql:n,end:a+1}}}y(`Missing closing }`,t,e.length)}function he(e,t){let n=oe.find(n=>e.startsWith(n,t))??null,r=t;n&&(r=b(e,t+n.length),(r===e.length||e[r]===`,`)&&y(`Expected a value after "${n}"`,t,t+n.length));let i=e[r];if(i===`'`||i===`"`){let{value:i,end:a}=pe(e,r);return{op:n,text:i,quoted:!0,sql:!1,start:t,valueStart:r,end:a}}if(i===`{`&&!n){let{sql:n,end:i}=me(e,r);return{op:null,text:n,quoted:!1,sql:!0,start:t,valueStart:r,end:i}}let a=r;for(;a<e.length&&!_.test(e[a])&&e[a]!==`,`;)a++;return{op:n,text:e.slice(r,a),quoted:!1,sql:!1,start:t,valueStart:r,end:a}}function x(e){let t=b(e,0);if(t===e.length)return[];let n=[[]];for(;;){e[t]===`,`&&y(`Expected a value before ","`,t,t+1);let r=he(e,t);n[n.length-1].push(r);let i=b(e,r.end);if(i===e.length)return n;e[i]===`,`?(t=b(e,i+1),t===e.length&&y(`Expected a value after ","`,i,i+1),n.push([])):i===r.end?y(`Expected a space or a comma`,i,i+1):t=i}}function S(e){return e&&e.op===null&&!e.quoted&&!e.sql?e.text.toUpperCase():null}function C(e){switch(e){case`number`:case`boolean`:case`binary`:return e;case`date`:case`datetime`:case`datetimetz`:return`date`;default:return`text`}}var w=(e,t=1)=>({alt:[[e]],used:t});function T(e,t){y(`"${e.op}" does not work on ${t} columns`,e.start,e.start+e.op.length)}function ge(e,t){let n=e[t],r=S(n);if(r===`EMPTY`)return w({op:`isEmpty`});if(r===`NOT`&&S(e[t+1])===`EMPTY`)return w({op:`notEmpty`},2);let i=n.text;switch(n.op){case null:case`+`:return w({op:`contains`,value:i});case`~`:return w({op:`notContains`,value:i});case`^`:return w({op:`startsWith`,value:i});case`!^`:return w({op:`notStartsWith`,value:i});case`$`:return w({op:`endsWith`,value:i});case`!$`:return w({op:`notEndsWith`,value:i});case`=`:return w({op:`eq`,value:i});case`!=`:case`<>`:return w({op:`ne`,value:i});case`<`:return w({op:`lt`,value:i});case`>`:return w({op:`gt`,value:i});case`<=`:return w({op:`le`,value:i});case`>=`:return w({op:`ge`,value:i})}}function _e(e){let t=Number(e);if(!Number.isFinite(t))return e;if(/^-?\d+$/.test(e))return Number.isSafeInteger(t)?t:e;let n=e.replace(/^-/,``).replace(/e.*$/i,``).replace(`.`,``).replace(/^0+/,``).replace(/0+$/,``);return n.length<=15&&!(t===0&&n!==``)?t:e}function ve(e){e.op&&g.has(e.op)&&T(e,`number`),ce.test(e.text)||y(`"${e.text}" is not a number`,e.valueStart,e.end);let t=_e(e.text);switch(e.op){case`!=`:case`<>`:return w({op:`ne`,value:t});case`<`:return w({op:`lt`,value:t});case`>`:return w({op:`gt`,value:t});case`<=`:return w({op:`le`,value:t});case`>=`:return w({op:`ge`,value:t});default:return w({op:`eq`,value:t})}}function ye(e){e.op&&e.op!==`=`&&T(e,`boolean`);let t=e.text.toUpperCase();if(t===`TRUE`||t===`1`)return w({op:`isTrue`});if(t===`FALSE`||t===`0`)return w({op:`isFalse`});y(`"${e.text}" is not TRUE or FALSE`,e.valueStart,e.end)}function E(e,t=1,n=1,r=0,i=0,a=0,o=``){return{y:e,mo:t,d:n,h:r,mi:i,s:a,frac:o}}function D(e,t,n){let r=new Date(0);return r.setUTCFullYear(e.y,e.mo-1,e.d),r.setUTCHours(e.h,e.mi,e.s,0),t===`year`?r.setUTCFullYear(r.getUTCFullYear()+n):t===`month`?r.setUTCMonth(r.getUTCMonth()+n):t===`day`?r.setUTCDate(r.getUTCDate()+n):t===`minute`?r.setUTCMinutes(r.getUTCMinutes()+n):r.setUTCSeconds(r.getUTCSeconds()+n),E(r.getUTCFullYear(),r.getUTCMonth()+1,r.getUTCDate(),r.getUTCHours(),r.getUTCMinutes(),r.getUTCSeconds(),e.frac)}function O(e,t){if(t!==`fraction`)return D(e,t,1);let n=e.frac.length,r=Number(e.frac)+1;return r<10**n?{...e,frac:String(r).padStart(n,`0`)}:{...D(e,`second`,1),frac:`0`.repeat(n)}}function be(e,t){let n=new Date(0);return n.setUTCFullYear(e,t,0),n.getUTCDate()}var k=(e,t=2)=>String(e).padStart(t,`0`);function xe(e){return`${k(e.y,4)}-${k(e.mo)}-${k(e.d)} ${k(e.h)}:${k(e.mi)}:${k(e.s)}${e.frac?`.${e.frac}`:``}`}function Se(e){let t=Math.abs(e);return`${e<0?`-`:`+`}${k(Math.floor(t/60))}:${k(t%60)}`}function Ce(e){let t=new Date(2e3,0,1);return t.setFullYear(e.y,e.mo-1,e.d),t.setHours(e.h,e.mi,e.s,0),Se(-Math.round(t.getTimezoneOffset()))}function we(e){let t=le.exec(e);if(!t)return null;let[,n,r,i,a,o,s,c,l]=t,u=E(Number(n),r?Number(r):1,i?Number(i):1,a?Number(a):0,o?Number(o):0,s?Number(s):0,c??``);if(u.mo<1||u.mo>12||u.d<1||u.d>be(u.y,u.mo)||u.h>23||u.mi>59||u.s>59)return null;let d=c?`fraction`:s?`second`:o?`minute`:i?`day`:r?`month`:`year`,f=null;if(l)if(l.toUpperCase()===`Z`)f=0;else{let e=Number(l.slice(1,3)),t=Number(l.slice(3).replace(`:`,``)||`0`);if(e>23||t>59)return null;f=(l[0]===`-`?-1:1)*(e*60+t)}return{start:u,precision:d,zone:f}}function A(e,t,n,r){let i=e=>({at:xe(e),offset:r??Ce(e)}),a=i(t),o=n.y<=9999?i(n):null,s=e=>({op:`dateRange`,from:e.at,offset:e.offset}),c=e=>({op:`dateRange`,to:e.at,offset:e.offset});switch(e.op){case`!=`:case`<>`:return o?[[c(a)],[s(o)]]:[[c(a)]];case`>`:return o||y(`Nothing comes after the year 9999`,e.start,e.end),[[s(o)]];case`>=`:return[[s(a)]];case`<`:return[[c(a)]];case`<=`:return o?[[c(o)]]:[[{op:`notNull`}]];default:return o?a.offset===o.offset?[[{op:`dateRange`,from:a.at,to:o.at,offset:a.offset}]]:[[s(a),c(o)]]:[[s(a)]]}}var Te={YESTERDAY:-1,TODAY:0,TOMORROW:1},Ee={LAST:-1,THIS:0,NEXT:1};function De(e,t,n){let r=E(e.getFullYear(),e.getMonth()+1,e.getDate());if(n===`WEEK`){let n=D(r,`day`,7*t-(e.getDay()+6)%7);return[n,D(n,`day`,7)]}if(n===`MONTH`){let e=D(E(r.y,r.mo),`month`,t);return[e,D(e,`month`,1)]}let i=E(r.y+t);return[i,D(i,`year`,1)]}function Oe(e,t,n){let r=e[t],i=e[t+1];if(r.op&&g.has(r.op)&&T(r,`date`),!r.quoted){let e=r.text.toUpperCase(),t=Te[e];if(t!==void 0){let e=D(E(n.getFullYear(),n.getMonth()+1,n.getDate()),`day`,t);return{alt:A(r,e,D(e,`day`,1),null),used:1}}let a=Ee[e];if(a!==void 0){let t=S(i);t!==`WEEK`&&t!==`MONTH`&&t!==`YEAR`&&y(`Expected WEEK, MONTH or YEAR after ${e}`,r.valueStart,r.end);let[o,s]=De(n,a,t);return{alt:A({...r,end:i.end},o,s,null),used:2}}}let a=!r.quoted&&ue.test(r.text)&&S(i)!==null&&de.test(i.text),o=a?{...r,text:`${r.text} ${i.text}`,end:i.end}:r,s=we(o.text)??y(`"${o.text}" is not a date — ${fe}`,o.valueStart,o.end),c=a?2:1;if(s.zone===null)return{alt:A(o,s.start,O(s.start,s.precision),null),used:c};let l=D(s.start,`minute`,-s.zone);return{alt:A(o,l,O(l,s.precision),`+00:00`),used:c}}function ke(e,t,n,r){let i=e[t];if(i.sql)return w({op:`rawSql`,sql:i.text});let a=S(i);if(a===`NULL`)return w({op:`isNull`});if(a===`NOT`&&S(e[t+1])===`NULL`)return w({op:`notNull`},2);switch(n){case`text`:return ge(e,t);case`number`:return ve(i);case`boolean`:return ye(i);case`date`:return Oe(e,t,r);case`binary`:y(`A binary column can only be filtered with NULL, NOT NULL or an SQL condition in braces`,i.start,i.end)}}function Ae(e,t,n){let r=[[]];for(let i=0;i<e.length;){let{alt:a,used:o}=ke(e,i,t,n);r.length*a.length>se&&y(`Too many conditions joined with spaces`,e[i].start,e[i+o-1].end),r=r.flatMap(e=>a.map(t=>[...e,...t])),i+=o}return r}function je(e,t){let n=e=>e.length===1&&e[0].op===`eq`,r=e.filter(n).map(e=>e[0].value);if(r.length<2)return e;r.length>5e3&&y(`More than ${ne} values`,0,t.length);let i=e.findIndex(n),a=e.filter(e=>!n(e));return[...a.slice(0,i),[{op:`in`,values:r}],...a.slice(i)]}function j(e){if(!(e instanceof v))throw e;return{ok:!1,error:{message:e.message,start:e.start,end:e.end}}}function M(e,t,n=new Date){try{let r=C(t);return{ok:!0,anyOf:je(x(e).flatMap(e=>Ae(e,r,n)),e)}}catch(e){return j(e)}}function N(e,t,n=new Date){try{let t=x(e).flat().find(e=>e.sql);t&&y(`An SQL condition only works in one column's own filter`,t.start,t.end)}catch(e){return j(e)}let r=t.flatMap(t=>{let r=M(e,t.kind,n);return r.ok&&r.anyOf.length>0?[{column:t.name,anyOf:r.anyOf}]:[]});return r.length===0&&e.trim()?{ok:!1,error:{message:`No column can read this filter`,start:0,end:e.length}}:{ok:!0,groups:r}}var P={columns:{}},Me={state:`empty`};function Ne(e,t){return e.map(e=>({name:e.name,kind:t?m(t,e.type):`other`}))}function F(e,t){if(!e||!e.text.trim())return Me;let n=t(e.text);return n.ok?{state:e.off?`off`:`ok`}:{state:`bad`,error:n.error}}function Pe(e,t,n=new Date){return F(e,e=>M(e,t,n))}function Fe(e,t,n=new Date){return F(e,e=>N(e,t,n))}function Ie(e,t,n=new Date){let r=t.flatMap(t=>{let r=e.columns[t.name];if(!r||r.off)return[];let i=M(r.text,t.kind,n);return i.ok&&i.anyOf.length>0?[{column:t.name,anyOf:i.anyOf}]:[]}),i=e.multi,a=i&&!i.off?N(i.text,t,n):null;return{filters:r,anyColumn:a?.ok?a.groups:[]}}function Le(e,t,n){let r={...e.columns};return n.trim()?r[t]={text:n}:delete r[t],{...e,columns:r}}function Re(e,t){let{multi:n,...r}=e;return t.trim()?{...r,multi:{text:t}}:r}var I=(e,t)=>t?{text:e.text,off:!0}:{text:e.text};function ze(e,t,n){if(t===null)return e.multi?{...e,multi:I(e.multi,n)}:e;let r=e.columns[t];return r?{...e,columns:{...e.columns,[t]:I(r,n)}}:e}function L(e){return Object.keys(e.columns).length>0||!!e.multi?.text.trim()}function Be(e,t){let n=new Set(t.map(e=>e.name)),r=Object.entries(e.columns).filter(([e])=>n.has(e));return r.length===Object.keys(e.columns).length?e:{...e,columns:Object.fromEntries(r)}}var R=`filters`,z={columns:1e3,name:1e3,text:1e4},B=e=>typeof e==`object`&&!!e&&!Array.isArray(e);function V(e){return!B(e)||typeof e.text!=`string`||!e.text.trim()||e.text.length>z.text?null:I({text:e.text},e.off===!0)}function Ve(e){let t=e?.[R];if(!B(t))return P;let n=B(t.columns)?Object.entries(t.columns).slice(0,z.columns).flatMap(([e,t])=>{let n=V(t);return n&&e&&e.length<=z.name?[[e,n]]:[]}):[],r=V(t.multi);return r?{columns:Object.fromEntries(n),multi:r}:{columns:Object.fromEntries(n)}}function H(e,t){let{[R]:n,...r}=e??{};return L(t)?{...r,[R]:t}:r}var He={is:`=`,isNot:`<>`,contains:``,begins:`^`,ends:`$`};function Ue(e,t){return t.split(/\r?\n/).map(e=>e.trim()).filter(Boolean).map(t=>`${He[e]}'${t.replaceAll(`'`,`''`)}'`).join(e===`isNot`?` `:`,`)}var U=`gridView`,W={min:170,max:420,initial:300},G={columns:1e3,name:1e3},K={min:40,max:2e3},q={hidden:[],panelWidth:W.initial,columnWidths:{},form:!1},J=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Y=e=>typeof e==`string`&&e.length>0&&e.length<=G.name;function X(e){return Number.isFinite(e)?Math.round(Math.min(W.max,Math.max(W.min,e))):W.initial}function We(e){let t=e?.[U];if(!J(t))return q;let n=Array.isArray(t.hidden)?[...new Set(t.hidden.slice(0,G.columns).filter(Y))]:[],r=typeof t.panelWidth==`number`?X(t.panelWidth):W.initial,i=J(t.columnWidths)?Object.entries(t.columnWidths).slice(0,G.columns).flatMap(([e,t])=>Y(e)&&typeof t==`number`&&Number.isFinite(t)&&t>=K.min&&t<=K.max?[[e,Math.round(t)]]:[]):[];return{hidden:n,panelWidth:r,columnWidths:Object.fromEntries(i),form:t.form===!0}}function Z(e,t){let{[U]:n,...r}=e??{},i={};return t.hidden.length&&(i.hidden=t.hidden),t.panelWidth!==W.initial&&(i.panelWidth=t.panelWidth),Object.keys(t.columnWidths).length&&(i.columnWidths=t.columnWidths),t.form&&(i.form=!0),Object.keys(i).length?{...r,[U]:i}:r}function Ge(e,t){let n=u(t,e);return{target:{kind:`connection`,connectionId:e.id,...n?{database:n}:{}},connectionName:e.name,dbType:e.type,connectionColor:e.color}}function Ke(e,t){let n=t?.connectionName,r=t?.connectionColor;return{target:e,...typeof n==`string`?{connectionName:n}:{},...typeof t?.dbType==`string`?{dbType:t.dbType}:{},...typeof r==`string`?{connectionColor:r}:{}}}function Q(e){return{...r(e.target),...e.connectionName?{connectionName:e.connectionName}:{},...e.dbType?{dbType:e.dbType}:{},...e.connectionColor?{connectionColor:e.connectionColor}:{}}}function $(e){return e.target.kind===`file`?e.target.projectName??null:null}function qe(e,t,r,i){return c.getState().openTab({type:e,title:n(t.target,t.connectionName,r.name),projectId:$(t),closable:!0,metadata:{...Q(t),schemaName:r.schema??``,tableName:r.name,...r.kind?{objectKind:r.kind}:{}}},i)}function Je(e,t){return qe(`database`,e,t)}function Ye(t,r,i){let a={...Q(t),schemaName:r.schema??``,tableName:r.name,instance:e()};return c.getState().openTab({type:`database`,title:n(t.target,t.connectionName,r.name),projectId:$(t),closable:!0,metadata:Z(H(a,i),{...q,form:!0})})}function Xe(e,t,n){return qe(`db-structure`,e,t,n)}function Ze(e,t,n){let r=c.getState().getPanelForTab(e),i=r?r.tabs.findIndex(t=>t.id===e):-1,a=Xe(t,n,r?.id);return r?(c.getState().closeTab(e,r.id),i>=0&&c.getState().reorderTab(a,r.id,i),a):a}function Qe(t,n){let r=a(Object.values(c.getState().panels).flatMap(e=>e.tabs));return l.getState().openTab({type:`db-structure`,title:`Table #${r}`,projectId:$(t),closable:!0,metadata:{...Q(t),...o(s(n),r,e())}})}function $e(e,t){return l.getState().openTab({type:`db-sql`,title:n(e.target,e.connectionName,t.name),projectId:$(e),closable:!0,metadata:{...Q(e),schemaName:t.schema??``,objectKind:t.kind,objectName:t.name,...t.args===void 0?{}:{objectArgs:t.args},...t.table?{objectTable:t.table}:{}}})}function et(e,n,r={}){let a=t(Object.values(c.getState().panels).flatMap(e=>e.tabs));return l.getState().openTab({type:`db-query`,title:`Query ${a}`,projectId:$(e),closable:!0,metadata:{...Q(e),...i(n,a,r)}})}export{H as A,L as C,Le as D,Ve as E,ae as F,h as I,m as L,N as M,M as N,ze as O,te as P,Be as S,Fe as T,R as _,Xe as a,Ie as b,Ke as c,W as d,U as f,P as g,Z as h,$e as i,C as j,Re as k,Ge as l,We as m,et as n,Ze as o,X as p,Ye as r,Je as s,Qe as t,q as u,z as v,Ue as w,Ne as x,Pe as y};
@@ -1 +1 @@
1
- import{n as e}from"./window-store-UcSFgNCI.js";import{t}from"./tab-store-B4v2kAEY.js";import{t as n}from"./use-is-mobile-CL2I7hLf.js";import{r}from"./settings-categories-BY9n3BRr.js";function i(e,t,n){return e?{kind:`tab`,tab:{type:`settings`,title:`Settings`,projectId:null,closable:!0,...n&&{metadata:{category:n}}}}:t?{kind:`focus`,id:t,...n&&{category:n}}:{kind:`window`,...n&&{category:n}}}function a(a){let o=e.getState(),s=Object.values(o.windows).find(e=>e.kind===`settings`),c=i(n(),s?.id??null,a);if(c.kind===`tab`){let e=t.getState(),n=e.openTab(c.tab);a&&n&&e.updateTab(n,{metadata:{category:a}})}else c.kind===`focus`?(c.category&&o.setPayload(c.id,{category:c.category}),o.focus(c.id)):o.open(`settings`,c.category?{category:c.category}:void 0);a&&window.dispatchEvent(new CustomEvent(r,{detail:a}))}export{a as t};
1
+ import{n as e}from"./window-store-D6EgLSfT.js";import{t}from"./tab-store-NUmgzMPf.js";import{t as n}from"./use-is-mobile-CL2I7hLf.js";import{r}from"./settings-categories-BY9n3BRr.js";function i(e,t,n){return e?{kind:`tab`,tab:{type:`settings`,title:`Settings`,projectId:null,closable:!0,...n&&{metadata:{category:n}}}}:t?{kind:`focus`,id:t,...n&&{category:n}}:{kind:`window`,...n&&{category:n}}}function a(a){let o=e.getState(),s=Object.values(o.windows).find(e=>e.kind===`settings`),c=i(n(),s?.id??null,a);if(c.kind===`tab`){let e=t.getState(),n=e.openTab(c.tab);a&&n&&e.updateTab(n,{metadata:{category:a}})}else c.kind===`focus`?(c.category&&o.setPayload(c.id,{category:c.category}),o.focus(c.id)):o.open(`settings`,c.category?{category:c.category}:void 0);a&&window.dispatchEvent(new CustomEvent(r,{detail:a}))}export{a as t};
@@ -1 +1 @@
1
- import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import{n as r}from"./utils-D3xTlJyU.js";import{r as i,t as a}from"./format-bytes-Xp9emfaR.js";import{t as o}from"./metric-chart-canvas-Dnm9OOXU.js";var s=e(t(),1),c=n();function l(e){return e>80?`bg-error`:e>50?`bg-warning`:`bg-success`}function u({cores:e}){return(0,c.jsx)(`div`,{className:`flex items-end gap-0.5 min-h-11 w-full`,"data-testid":`sysmon-core-bars`,"data-core-count":e.length,children:e.map((e,t)=>(0,c.jsx)(`div`,{className:`flex-1 h-11 flex items-end rounded-sm overflow-hidden bg-surface-hover`,title:`Core ${t}: ${e.toFixed(0)}%`,children:(0,c.jsx)(`div`,{className:r(`w-full transition-[height]`,l(e)),style:{height:`${Math.max(2,Math.min(100,e))}%`}})},t))})}function d({testId:e,data:t,onOpen:n,openLabel:i,children:a}){let o=`rounded-lg border border-border p-4 space-y-2`,s={"data-testid":e,...t};return n?(0,c.jsx)(`button`,{type:`button`,onClick:n,"aria-label":i,...s,className:r(o,`w-full text-left cursor-pointer transition-colors`,`hover:bg-surface-hover hover:border-primary/40`,`focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary`),children:a}):(0,c.jsx)(`div`,{className:o,...s,children:a})}function f(e){return e>80?`text-error`:e>50?`text-warning`:`text-success`}function p({total:e,cores:t,model:n,series:r,onOpen:i}){return(0,c.jsxs)(d,{testId:`sysmon-card-cpu`,data:{"data-cpu-total":e},onOpen:i,openLabel:`CPU details`,children:[(0,c.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,c.jsx)(`h3`,{className:`text-sm font-medium`,children:`CPU`}),(0,c.jsxs)(`span`,{className:`text-2xl font-semibold ${f(e)}`,children:[e.toFixed(1),`%`]})]}),(0,c.jsx)(o,{series:[{data:r,color:`var(--color-primary)`}],height:56,maxValue:100,grid:!0}),(0,c.jsx)(u,{cores:t}),(0,c.jsx)(`p`,{className:`text-[11px] text-text-subtle truncate`,title:n,children:n})]})}function m({usedMB:e,totalMB:t,percent:n,series:r,onOpen:a}){return(0,c.jsxs)(d,{testId:`sysmon-card-mem`,data:{"data-mem-percent":n},onOpen:a,openLabel:`Memory details`,children:[(0,c.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,c.jsx)(`h3`,{className:`text-sm font-medium`,children:`Memory`}),(0,c.jsxs)(`span`,{className:`text-2xl font-semibold`,children:[n.toFixed(1),`%`]})]}),(0,c.jsx)(o,{series:[{data:r,color:`var(--color-primary)`}],height:56,maxValue:100,grid:!0}),(0,c.jsxs)(`p`,{className:`text-[11px] text-text-subtle`,children:[i(e),` / `,i(t)]})]})}function h({available:e,inBps:t,outBps:n,readSeries:r,writeSeries:i,measuring:s,onOpen:l}){return(0,c.jsxs)(d,{testId:`sysmon-card-disk`,data:{"data-available":e},onOpen:l,openLabel:`Disk details`,children:[(0,c.jsx)(`h3`,{className:`text-sm font-medium`,children:`Disk`}),e?(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(o,{series:[{data:r,color:`var(--color-primary)`},{data:i,color:`var(--color-warning)`}],height:56,grid:!0}),(0,c.jsxs)(`p`,{className:`text-[11px] text-text-subtle`,children:[`Read `,a(t),` · Write `,a(n)]})]}):(0,c.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:s?`measuring…`:`n/a`})]})}function g({available:e,inBps:t,outBps:n,downSeries:r,upSeries:i,measuring:s,onOpen:l}){return(0,c.jsxs)(d,{testId:`sysmon-card-net`,data:{"data-available":e},onOpen:l,openLabel:`Network details`,children:[(0,c.jsx)(`h3`,{className:`text-sm font-medium`,children:`Network`}),e?(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(o,{series:[{data:r,color:`var(--color-primary)`},{data:i,color:`var(--color-warning)`}],height:56,grid:!0}),(0,c.jsxs)(`p`,{className:`text-[11px] text-text-subtle`,children:[`Down `,a(t),` · Up `,a(n)]})]}):(0,c.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:s?`measuring…`:`n/a`})]})}function _({name:e,utilPercent:t,vramUsedMB:n,vramTotalMB:r,series:a,onOpen:s}){return(0,c.jsxs)(d,{testId:`sysmon-card-gpu`,onOpen:s,openLabel:`${e} details`,children:[(0,c.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2`,children:[(0,c.jsx)(`h3`,{className:`text-sm font-medium truncate`,title:e,children:e}),(0,c.jsxs)(`span`,{className:`text-2xl font-semibold shrink-0`,children:[t.toFixed(0),`%`]})]}),(0,c.jsx)(o,{series:[{data:a,color:`var(--color-primary)`}],height:56,maxValue:100,grid:!0}),r>0&&(0,c.jsxs)(`p`,{className:`text-[11px] text-text-subtle`,children:[`VRAM `,i(n),` / `,i(r)]})]})}function v(e,t){let n=null,r=-1/0;for(let i of e){let e=t(i);e!==null&&e>r&&(n=i,r=e)}return n??e[0]??null}function y(e){let t=v(e.disks??[],e=>e.available?e.busyPercent:null);return t?`disk:${t.id}`:null}function b(e){let t=v(e.nics??[],e=>e.available?e.rxBps+e.txBps:null);return t?`nic:${t.id}`:null}function x(e,t){return`gpu:${e??t}`}var S=200;function C(e){return(0,s.useMemo)(()=>{let t=e.slice(-S),n=[],r=[],i=[],a=[],o=[],s=[],c=[];for(let e of t)n.push(e.system.cpu.total),r.push(e.system.mem.percent),i.push(e.system.disk.available?e.system.disk.inBps:0),a.push(e.system.disk.available?e.system.disk.outBps:0),o.push(e.system.net.available?e.system.net.inBps:0),s.push(e.system.net.available?e.system.net.outBps:0),e.system.gpus.forEach((e,t)=>{(c[t]??=[]).push(e.utilPercent)});return{cpu:n,mem:r,diskRead:i,diskWrite:a,netDown:o,netUp:s,gpuUtil:c}},[e])}function w({system:e,history:t,onOpenDevice:n}){let r=C(t),i=t.length<=1,a=e=>n&&e?()=>n(e):void 0;return(0,c.jsxs)(`div`,{className:`p-4 grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4`,"data-testid":`sysmon-overview`,children:[(0,c.jsx)(p,{total:e.cpu.total,cores:e.cpu.cores,model:e.cpu.model,series:r.cpu,onOpen:a(`cpu`)}),(0,c.jsx)(m,{usedMB:e.mem.usedMB,totalMB:e.mem.totalMB,percent:e.mem.percent,series:r.mem,onOpen:a(`memory`)}),(0,c.jsx)(h,{available:e.disk.available,inBps:e.disk.inBps,outBps:e.disk.outBps,readSeries:r.diskRead,writeSeries:r.diskWrite,measuring:i,onOpen:a(y(e))}),(0,c.jsx)(g,{available:e.net.available,inBps:e.net.inBps,outBps:e.net.outBps,downSeries:r.netDown,upSeries:r.netUp,measuring:i,onOpen:a(b(e))}),e.gpus.map((e,t)=>(0,c.jsx)(_,{name:e.name,utilPercent:e.utilPercent,vramUsedMB:e.vramUsedMB,vramTotalMB:e.vramTotalMB,series:r.gpuUtil[t]??[],onOpen:a(x(e.id,t))},`${e.name}-${t}`))]})}export{w as OverviewPanel};
1
+ import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import{n as r}from"./utils-D3xTlJyU.js";import{r as i,t as a}from"./format-bytes-Xp9emfaR.js";import{t as o}from"./metric-chart-canvas-HG8rPTMq.js";var s=e(t(),1),c=n();function l(e){return e>80?`bg-error`:e>50?`bg-warning`:`bg-success`}function u({cores:e}){return(0,c.jsx)(`div`,{className:`flex items-end gap-0.5 min-h-11 w-full`,"data-testid":`sysmon-core-bars`,"data-core-count":e.length,children:e.map((e,t)=>(0,c.jsx)(`div`,{className:`flex-1 h-11 flex items-end rounded-sm overflow-hidden bg-surface-hover`,title:`Core ${t}: ${e.toFixed(0)}%`,children:(0,c.jsx)(`div`,{className:r(`w-full transition-[height]`,l(e)),style:{height:`${Math.max(2,Math.min(100,e))}%`}})},t))})}function d({testId:e,data:t,onOpen:n,openLabel:i,children:a}){let o=`rounded-lg border border-border p-4 space-y-2`,s={"data-testid":e,...t};return n?(0,c.jsx)(`button`,{type:`button`,onClick:n,"aria-label":i,...s,className:r(o,`w-full text-left cursor-pointer transition-colors`,`hover:bg-surface-hover hover:border-primary/40`,`focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary`),children:a}):(0,c.jsx)(`div`,{className:o,...s,children:a})}function f(e){return e>80?`text-error`:e>50?`text-warning`:`text-success`}function p({total:e,cores:t,model:n,series:r,onOpen:i}){return(0,c.jsxs)(d,{testId:`sysmon-card-cpu`,data:{"data-cpu-total":e},onOpen:i,openLabel:`CPU details`,children:[(0,c.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,c.jsx)(`h3`,{className:`text-sm font-medium`,children:`CPU`}),(0,c.jsxs)(`span`,{className:`text-2xl font-semibold ${f(e)}`,children:[e.toFixed(1),`%`]})]}),(0,c.jsx)(o,{series:[{data:r,color:`var(--color-primary)`}],height:56,maxValue:100,grid:!0}),(0,c.jsx)(u,{cores:t}),(0,c.jsx)(`p`,{className:`text-[11px] text-text-subtle truncate`,title:n,children:n})]})}function m({usedMB:e,totalMB:t,percent:n,series:r,onOpen:a}){return(0,c.jsxs)(d,{testId:`sysmon-card-mem`,data:{"data-mem-percent":n},onOpen:a,openLabel:`Memory details`,children:[(0,c.jsxs)(`div`,{className:`flex items-baseline justify-between`,children:[(0,c.jsx)(`h3`,{className:`text-sm font-medium`,children:`Memory`}),(0,c.jsxs)(`span`,{className:`text-2xl font-semibold`,children:[n.toFixed(1),`%`]})]}),(0,c.jsx)(o,{series:[{data:r,color:`var(--color-primary)`}],height:56,maxValue:100,grid:!0}),(0,c.jsxs)(`p`,{className:`text-[11px] text-text-subtle`,children:[i(e),` / `,i(t)]})]})}function h({available:e,inBps:t,outBps:n,readSeries:r,writeSeries:i,measuring:s,onOpen:l}){return(0,c.jsxs)(d,{testId:`sysmon-card-disk`,data:{"data-available":e},onOpen:l,openLabel:`Disk details`,children:[(0,c.jsx)(`h3`,{className:`text-sm font-medium`,children:`Disk`}),e?(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(o,{series:[{data:r,color:`var(--color-primary)`},{data:i,color:`var(--color-warning)`}],height:56,grid:!0}),(0,c.jsxs)(`p`,{className:`text-[11px] text-text-subtle`,children:[`Read `,a(t),` · Write `,a(n)]})]}):(0,c.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:s?`measuring…`:`n/a`})]})}function g({available:e,inBps:t,outBps:n,downSeries:r,upSeries:i,measuring:s,onOpen:l}){return(0,c.jsxs)(d,{testId:`sysmon-card-net`,data:{"data-available":e},onOpen:l,openLabel:`Network details`,children:[(0,c.jsx)(`h3`,{className:`text-sm font-medium`,children:`Network`}),e?(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(o,{series:[{data:r,color:`var(--color-primary)`},{data:i,color:`var(--color-warning)`}],height:56,grid:!0}),(0,c.jsxs)(`p`,{className:`text-[11px] text-text-subtle`,children:[`Down `,a(t),` · Up `,a(n)]})]}):(0,c.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:s?`measuring…`:`n/a`})]})}function _({name:e,utilPercent:t,vramUsedMB:n,vramTotalMB:r,series:a,onOpen:s}){return(0,c.jsxs)(d,{testId:`sysmon-card-gpu`,onOpen:s,openLabel:`${e} details`,children:[(0,c.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2`,children:[(0,c.jsx)(`h3`,{className:`text-sm font-medium truncate`,title:e,children:e}),(0,c.jsxs)(`span`,{className:`text-2xl font-semibold shrink-0`,children:[t.toFixed(0),`%`]})]}),(0,c.jsx)(o,{series:[{data:a,color:`var(--color-primary)`}],height:56,maxValue:100,grid:!0}),r>0&&(0,c.jsxs)(`p`,{className:`text-[11px] text-text-subtle`,children:[`VRAM `,i(n),` / `,i(r)]})]})}function v(e,t){let n=null,r=-1/0;for(let i of e){let e=t(i);e!==null&&e>r&&(n=i,r=e)}return n??e[0]??null}function y(e){let t=v(e.disks??[],e=>e.available?e.busyPercent:null);return t?`disk:${t.id}`:null}function b(e){let t=v(e.nics??[],e=>e.available?e.rxBps+e.txBps:null);return t?`nic:${t.id}`:null}function x(e,t){return`gpu:${e??t}`}var S=200;function C(e){return(0,s.useMemo)(()=>{let t=e.slice(-S),n=[],r=[],i=[],a=[],o=[],s=[],c=[];for(let e of t)n.push(e.system.cpu.total),r.push(e.system.mem.percent),i.push(e.system.disk.available?e.system.disk.inBps:0),a.push(e.system.disk.available?e.system.disk.outBps:0),o.push(e.system.net.available?e.system.net.inBps:0),s.push(e.system.net.available?e.system.net.outBps:0),e.system.gpus.forEach((e,t)=>{(c[t]??=[]).push(e.utilPercent)});return{cpu:n,mem:r,diskRead:i,diskWrite:a,netDown:o,netUp:s,gpuUtil:c}},[e])}function w({system:e,history:t,onOpenDevice:n}){let r=C(t),i=t.length<=1,a=e=>n&&e?()=>n(e):void 0;return(0,c.jsxs)(`div`,{className:`p-4 grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4`,"data-testid":`sysmon-overview`,children:[(0,c.jsx)(p,{total:e.cpu.total,cores:e.cpu.cores,model:e.cpu.model,series:r.cpu,onOpen:a(`cpu`)}),(0,c.jsx)(m,{usedMB:e.mem.usedMB,totalMB:e.mem.totalMB,percent:e.mem.percent,series:r.mem,onOpen:a(`memory`)}),(0,c.jsx)(h,{available:e.disk.available,inBps:e.disk.inBps,outBps:e.disk.outBps,readSeries:r.diskRead,writeSeries:r.diskWrite,measuring:i,onOpen:a(y(e))}),(0,c.jsx)(g,{available:e.net.available,inBps:e.net.inBps,outBps:e.net.outBps,downSeries:r.netDown,upSeries:r.netUp,measuring:i,onOpen:a(b(e))}),e.gpus.map((e,t)=>(0,c.jsx)(_,{name:e.name,utilPercent:e.utilPercent,vramUsedMB:e.vramUsedMB,vramTotalMB:e.vramTotalMB,series:r.gpuUtil[t]??[],onOpen:a(x(e.id,t))},`${e.name}-${t}`))]})}export{w as OverviewPanel};
@@ -1 +1 @@
1
- import{n as e}from"./minimal-mode-rLZOjciW.js";import{d as t,h as n,k as r,u as i,v as a}from"./api-client-BnYFnEfK.js";import{t as o}from"./react-B9hau9ra.js";import{t as s}from"./settings-store-CBJCnE5L.js";import{A as c,B as l,D as u,H as d,I as f,L as p,M as m,O as h,P as g,R as _,T as v,U as y,V as b,j as x,k as S,n as C,z as w}from"./window-store-UcSFgNCI.js";import{i as T}from"./project-store-Bs-kiU8m.js";import{t as E}from"./session-list-sync-triggers-D9i1FxWd.js";var ee=15,te=85;function ne(e){return Math.min(te,Math.max(ee,e))}function D(e,t){let n=e.filter(e=>e!==t);return n.push(t),n.length>50&&n.shift(),n}function O(e){let t=e().panels[v];if(!t)return 0;let n=e().currentProject;return t.tabs.filter(e=>!e.projectId||!n||e.projectId===n).length}function k(e){let t=e().currentProject;e().openInDock({type:`terminal`,title:`Terminal`,projectId:t??null,closable:!0,metadata:t?{projectName:t}:void 0})}function A(e,t){return function(){let{dock:n}=t(),r=!n.visible;e({dock:{...n,visible:r}}),M(t),r&&O(t)===0&&k(t)}}function j(e,t){return function(n){let{dock:r}=t();e({dock:{...r,visible:n}}),M(t)}}function re(e,t){return function(n){let{dock:r}=t();e({dock:{...r,height:ne(n)}}),M(t)}}function ie(e,t){return function(n){let{panels:r,dock:i}=t(),a=r.__dock__??h(),o=n;if(n.type===`terminal`&&!n.metadata?.terminalIndex){let e=Object.values(r).flatMap(e=>e.tabs).filter(e=>e.type===`terminal`).map(e=>{let t=e.id.match(/^terminal:(\d+)/);return t?parseInt(t[1],10):0}),t=e.length>0?Math.max(...e)+1:1;o={...n,metadata:{...n.metadata,terminalIndex:t}}}let s=x(o.type,o.metadata);if(a.tabs.find(e=>e.id===s))return e(e=>({dock:{...e.dock,visible:!0},panels:{...e.panels,[v]:{...a,activeTabId:s,tabHistory:D(a.tabHistory,s)}}})),M(t),s;let c={...o,id:s},l=[...a.tabs,c],u=D(a.tabHistory,s);return e(e=>({dock:{...e.dock,visible:!0},panels:{...e.panels,[v]:{...a,tabs:l,activeTabId:s,tabHistory:u}}})),M(t),s}}function ae(e,t){return function(n,r){t().moveTab(n,r,v);let{dock:i}=t();e({dock:{...i,visible:!0}}),M(t)}}function M(e){let{currentProject:t,panels:n,grid:r,focusedPanelId:i,dock:a}=e();if(!t)return;let o=new Set(r.flat()),s={};for(let[e,t]of Object.entries(n))o.has(e)&&(s[e]=t);w(t,{panels:s,grid:r,focusedPanelId:i,dock:a,dockPanel:n.__dock__??h()})}function oe(e,t,n){return{...n,[e]:t}}function N(e,t){return t[e]??{visible:!1,height:30}}function se(e,t){return t&&e.visible?{...e,visible:!1}:e}var P=`ppm-window-panels`,ce={terminal:!0,chat:!0,editor:!0,database:!0,"db-structure":!0,"db-sql":!0,"db-query":!0,"db-impexp":!0,"db-connection":!0,sqlite:!0,"git-diff":!0,"branch-review":!0,"session-review":!0,"git-review":!0,settings:!1,extension:!0,"extension-webview":!0,"conflict-editor":!0,"system-monitor":!1,"git-log":!0,"ai-resource":!0,group:!0,problems:!1,design:!0,android:!0,"web-preview":!0,logs:!1};function F(e){return typeof e==`string`&&ce[e]===!0}function I(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.id==`string`&&!!t.id&&typeof t.title==`string`&&F(t.type)}function L(e){let t={};for(let[n,r]of Object.entries(e))!f(n)||r.tabs.length===0||(t[n]=r);return t}function R(e){try{let t=L(e);Object.keys(t).length===0?localStorage.removeItem(P):localStorage.setItem(P,JSON.stringify(t))}catch{}}function z(){let e=null;try{e=localStorage.getItem(P)}catch{return{}}if(!e)return{};let t;try{t=JSON.parse(e)}catch{return{}}if(!t||typeof t!=`object`||Array.isArray(t))return{};let n={};for(let[e,r]of Object.entries(t)){if(!f(e)||!r||typeof r!=`object`)continue;let t=r;if(!Array.isArray(t.tabs))continue;let i=l({id:e,tabs:t.tabs.filter(e=>!!e&&typeof e==`object`&&typeof e.id==`string`),activeTabId:typeof t.activeTabId==`string`?t.activeTabId:null,tabHistory:Array.isArray(t.tabHistory)?t.tabHistory.filter(e=>typeof e==`string`):[]}),a=i.tabs.filter(I);if(a.length===0)continue;let o=new Set(a.map(e=>e.id)),s=i.tabHistory.filter(e=>o.has(e));n[e]={id:e,tabs:a,activeTabId:i.activeTabId&&o.has(i.activeTabId)?i.activeTabId:s[s.length-1]??a[a.length-1].id,tabHistory:s}}return n}function B(e,t){let n=e.flat();return t&&n.includes(t)?t:n[0]??null}function V(e){R(e().panels),M(e)}function H(e,t,n){if(t().panels[n]?.tabs.length){R(t().panels);return}e(e=>{let{[n]:t,...r}=e.panels;return{panels:r}}),R(t().panels);let r=d(n);r&&C.getState().close(r)}var U=!1;function W(e,t){if(U)return;U=!0;let n=z();Object.keys(n).length!==0&&e({panels:{...n,...t().panels}})}function le(e,t){return function(n,r,i={}){if(t().isMobile())return null;let a=t().panels[r]?.tabs.find(e=>e.id===n);if(!a||u.has(a.type))return null;let o=C.getState();if(Object.keys(o.windows).length>=8)return null;let s=o.open(`tab-host`,{originPanelId:r,title:a.title,...i.closeTabsOnClose?{closeTabsOnClose:!0}:{}},i.rect),l=y(s);e(e=>({panels:{...e.panels,[l]:c(s)}})),t().moveTab(n,r,l);let d=B(t().grid,r);return d&&e({focusedPanelId:d}),V(t),s}}function ue(e,t){return function(n,r){let i=y(n),a=t().panels[i];if(!a)return;let o=de(t(),r);if(o)for(let e of[...a.tabs])t().moveTab(e.id,i,o);e(e=>{let{[i]:t,...n}=e.panels,r=B(e.grid,o??e.focusedPanelId);return r?{panels:n,focusedPanelId:r}:{panels:n}}),V(t),C.getState().close(n)}}function de(e,t){return t&&e.panels[t]&&!f(t)?t:B(e.grid,e.focusedPanelId)}function fe(e,t){let n={...e},r=[];for(let[i,a]of Object.entries(e)){if(!f(i))continue;let e=a.tabs.filter(e=>e.projectId!==t);if(e.length===a.tabs.length)continue;let o=d(i);if(e.length===0){delete n[i],o&&r.push(o);continue}let s=new Set(e.map(e=>e.id)),c=a.tabHistory.filter(e=>s.has(e));n[i]={...a,tabs:e,tabHistory:c,activeTabId:a.activeTabId&&s.has(a.activeTabId)?a.activeTabId:c[c.length-1]??e[e.length-1].id}}return{panels:n,windowIdsToClose:r}}var pe=new Set([`chat`,`design`]);function G(e){if(!e||!pe.has(e.type))return;let t=e.metadata?.sessionId;return typeof t==`string`&&t?t:void 0}function K(e,t){return e.new_chat_provider_mode===`follow-focus`&&t&&t!==`default`?t:e.default_provider||`claude`}var me=new Set([`settings`,`git-log`]),he=new Set([`database`,`db-structure`,`db-sql`]),ge=new Set([`projects`,`git-status`,`git-graph`]);function q(e,t){if(!e)return null;let n=e.tabs.filter(e=>!e.projectId||e.projectId===t);if(n.length===0)return null;for(let t=e.tabHistory.length-1;t>=0;t--){let r=e.tabHistory[t];if(n.some(e=>e.id===r))return r}return n[n.length-1].id}function _e(e,n){let r=i(),o=e?t(a(E(e))):null,s=r?K(r,n):null;return r&&s&&o?.some(e=>e.id===s)?{providerId:s,permissionMode:r.providers[s]?.permission_mode??`bypassPermissions`,permissionModeSource:`cache`}:{providerPending:!0,focusedProviderOnOpen:n}}function ve(e,t){if(e.permissionMode&&e.permissionModeSource!==`cache`)return{};let n=i()?.providers[t]?.permission_mode;return n?{permissionMode:n,permissionModeSource:`cache`}:{}}function J(e,t){let n=e.filter(e=>e!==t);return n.push(t),n.length>50&&n.shift(),n}function Y(e,t){let n=Date.now();return e.map(e=>e.id===t?{...e,metadata:{...e.metadata,lastActiveAt:n}}:e)}function X(e){let t=d(e);t&&C.getState().focus(t)}function Z(){let e=S(),t=h();return{panels:{[e.id]:e,[v]:t},grid:[[e.id]],focusedPanelId:e.id}}var Q=o()((t,i)=>{function a(){let{currentProject:e,panels:t,grid:n,focusedPanelId:r,dock:a}=i();if(!e)return;let o=new Set(n.flat()),s={};for(let[e,n]of Object.entries(t))o.has(e)&&(s[e]=n);w(e,{panels:s,grid:n,focusedPanelId:r,dock:a,dockPanel:t[v]})}function o(e){return Object.values(i().panels).find(t=>t.tabs.some(t=>t.id===e))}function c(e){return e??i().focusedPanelId}function l(e){return f(e)?i().focusedPanelId:e}return{...Z(),currentProject:null,lastFocusedChatProviders:{},projectGrids:{},projectFocused:{},dock:{visible:!1,height:30},projectDock:{},dockExpanded:!1,toggleDock:A(t,i),setDockVisible:j(t,i),setDockHeight:re(t,i),toggleDockExpanded:()=>t(e=>({dockExpanded:!e.dockExpanded})),openInDock:ie(t,i),redockTab:ae(t,i),popOutTab:le(t,i),redockFromWindow:ue(t,i),switchProject:e=>{if(e!==`__global__`){let t=T.getState().projects.find(t=>t.name===e);t&&n(t)}W(t,i);let{currentProject:r,panels:a,grid:o,focusedPanelId:s,projectGrids:c,projectFocused:l,dock:u,projectDock:d}=i();if(r===e)return;let f={...c},m={...l},_=r?oe(r,u,d):{...d};if(r){f[r]=o,m[r]=s;let e=new Set(o.flat()),t={};for(let[n,r]of Object.entries(a))e.has(n)&&(t[n]=r);w(r,{panels:t,grid:o,focusedPanelId:s,dock:u,dockPanel:a[v]})}if(f[e]){let n=f[e],r=m[e]??n[0]?.[0]??``,i=N(e,_),o=a[v];t({currentProject:e,panels:o?{...a,[v]:{...o,activeTabId:q(o,e)}}:a,grid:n,focusedPanelId:r,projectGrids:f,projectFocused:m,dock:i,projectDock:_});return}let y=p(e);if(y&&Object.keys(y.panels).length>0){let n=!1,r={};for(let[t,i]of Object.entries(y.panels)){let a=b(i.tabs,e).filter(e=>!ge.has(e.type));a.length!==i.tabs.length&&(n=!0);let o=i.tabHistory.filter(e=>a.some(t=>t.id===e)),s=i.activeTabId&&a.some(e=>e.id===i.activeTabId)?i.activeTabId:o[o.length-1]??a[0]?.id??null;r[t]={...i,tabs:a,tabHistory:o,activeTabId:s}}let o=y.grid;for(let e of o.flat())if(!((r[e]?.tabs.length??0)>0)){if(o.flat().length<=1)break;o=g(o,e),delete r[e],n=!0}let s=o.flat().includes(y.focusedPanelId)?y.focusedPanelId:o.flat()[0]??y.focusedPanelId,c=a.__dock__??h(),l=y.dockPanel??h(),u=[...c.tabs];for(let e of l.tabs)u.some(t=>t.id===e.id)||u.push(e);let d={...c,tabs:u,tabHistory:[...new Set([...c.tabHistory,...l.tabHistory])].filter(e=>u.some(t=>t.id===e)),activeTabId:null};d.activeTabId=q(d,e);let p={...a,...r,[v]:d};f[e]=o,m[e]=s;let x=se(y.dock??N(e,_),i().isMobile());t({currentProject:e,panels:p,grid:o,focusedPanelId:s,projectGrids:f,projectFocused:m,dock:x,projectDock:_}),n&&w(e,{panels:r,grid:o,focusedPanelId:s,dock:x,dockPanel:d})}else{let n=S(),r=[[n.id]],i={...a,[n.id]:n};f[e]=r,m[e]=n.id;let o=N(e,_);w(e,{panels:{[n.id]:n},grid:r,focusedPanelId:n.id,dock:o,dockPanel:a[v]}),t({currentProject:e,panels:i,grid:r,focusedPanelId:n.id,projectGrids:f,projectFocused:m,dock:o,projectDock:_})}},reloadProject:e=>{let{projectGrids:n,projectFocused:r,projectDock:a,panels:o}=i(),s={...n},c={...r},l={...a};delete s[e],delete c[e],delete l[e];let u=n[e],d=u?new Set(u.flat()):new Set,f={...o};for(let e of d)e!==`__dock__`&&delete f[e];let p=f[v];if(p){let t=p.tabs.filter(t=>t.projectId!==e),n=new Set(t.map(e=>e.id));f[v]={...p,tabs:t,tabHistory:p.tabHistory.filter(e=>n.has(e)),activeTabId:p.activeTabId&&n.has(p.activeTabId)?p.activeTabId:t[t.length-1]?.id??null}}let m=fe(f,e);t({projectGrids:s,projectFocused:c,projectDock:l,panels:m.panels,currentProject:null}),R(m.panels);for(let e of m.windowIdsToClose)C.getState().close(e);i().switchProject(e)},setFocusedPanel:(e,n=!0)=>{if(f(e))return;let r=i().panels[e];r&&(t({focusedPanelId:e}),n&&$(r.tabs.find(e=>e.id===r.activeTabId)))},openTab:(n,o)=>{if(s.getState().minimalMode&&!e(n.type))return r.info(`This feature needs full mode. Restart PPM without --minimal.`),``;let u=i().isMobile(),p=u?i().grid[0]?.[0]??c(o):c(o);if(!i().panels[p])return``;if(n.type===`chat`&&!n.metadata?.sessionId&&!n.metadata?.providerId){let e=n.projectId??n.metadata?.projectName??i().currentProject??void 0,t=e?i().lastFocusedChatProviders[e]:void 0;n={...n,metadata:{...n.metadata,..._e(e,t)}}}else n.type===`chat`&&n.metadata&&!n.metadata.sessionId&&typeof n.metadata.providerId==`string`&&(n={...n,metadata:{...n.metadata,...ve(n.metadata,n.metadata.providerId)}});if(n.type===`terminal`&&!n.metadata?.terminalIndex){let e=Object.values(i().panels).flatMap(e=>e.tabs).filter(e=>e.type===`terminal`).map(e=>{let t=e.id.match(/^terminal:(\d+)/);return t?parseInt(t[1],10):0}),t=e.length>0?Math.max(...e)+1:1;n={...n,metadata:{...n.metadata,terminalIndex:t}}}let m=x(n.type,n.metadata);if(n.type===`chat`&&n.metadata?.sessionId){let e=n.metadata.sessionId;for(let n of Object.values(i().panels)){let r=n.tabs.find(t=>G(t)===e&&(!s.getState().minimalMode||t.type===`chat`));if(r)return $(r),t(e=>({focusedPanelId:l(n.id),panels:{...e.panels,[n.id]:{...n,tabs:Y(n.tabs,r.id),activeTabId:r.id,tabHistory:J(n.tabHistory,r.id)}}})),X(n.id),a(),r.id}}if(n.type===`design`){let e=n.metadata?.designSlug,r=n.projectId??n.metadata?.projectName;for(let n of Object.values(i().panels)){let i=n.tabs.find(t=>t.type===`design`&&t.metadata?.designSlug===e&&(t.projectId??t.metadata?.projectName)===r);if(i)return t(e=>({focusedPanelId:l(n.id),panels:{...e.panels,[n.id]:{...n,tabs:Y(n.tabs,i.id),activeTabId:i.id,tabHistory:J(n.tabHistory,i.id)}}})),X(n.id),a(),i.id}}if(he.has(n.type)){let e=u?[]:Object.keys(i().panels).filter(f),n=[...i().grid.flat(),...e];for(let e of n){let n=i().panels[e],r=n?.tabs.find(e=>e.id===m||e.id.startsWith(`${m}@`));if(!n||!r)continue;t(e=>({focusedPanelId:l(n.id),panels:{...e.panels,[n.id]:{...n,tabs:Y(n.tabs,r.id),activeTabId:r.id,tabHistory:J(n.tabHistory,r.id)}}}));let o=d(n.id);return o&&(C.getState().focus(o),R(i().panels)),a(),r.id}}if(me.has(n.type))for(let e of Object.values(i().panels)){let n=e.tabs.find(e=>e.id===m);if(n)return t(t=>({focusedPanelId:l(e.id),panels:{...t.panels,[e.id]:{...e,tabs:Y(e.tabs,n.id),activeTabId:n.id,tabHistory:J(e.tabHistory,n.id)}}})),a(),n.id}if(u)for(let e of i().grid.flat()){let n=i().panels[e];if(!n)continue;let r=n.tabs.find(e=>e.id===m||e.id.startsWith(`${m}@`));if(r)return t(e=>({focusedPanelId:n.id,panels:{...e.panels,[n.id]:{...n,tabs:Y(n.tabs,r.id),activeTabId:r.id,tabHistory:J(n.tabHistory,r.id)}}})),a(),r.id}let h=i().panels[p],g=h.tabs.find(e=>e.id===m);if(g)return t(e=>({panels:{...e.panels,[p]:{...h,tabs:Y(h.tabs,g.id),activeTabId:g.id,tabHistory:J(h.tabHistory,g.id)}}})),a(),g.id;let _=Object.values(i().panels).some(e=>e.id!==p&&e.tabs.some(e=>e.id===m))?`${m}@${p}`:m,v={...n,id:_,metadata:{...n.metadata,lastActiveAt:Date.now()}};return t(e=>{let t=e.panels[p];return{focusedPanelId:p,panels:{...e.panels,[p]:{...t,tabs:[...t.tabs,v],activeTabId:_,tabHistory:J(t.tabHistory,_)}}}}),a(),_},closeTab:(e,n)=>{let r=n?i().panels[n]:o(e);if(!r)return;let s=r.id;if(e.startsWith(`terminal:`))try{localStorage.removeItem(`ppm:terminal-session:${e}`)}catch{}t(t=>{let n=t.panels[s],r=n.tabs.filter(t=>t.id!==e),i=n.tabHistory.filter(t=>t!==e),a=n.activeTabId;if(n.activeTabId===e){let e=i.length>0?i[i.length-1]:null;a=e&&r.some(t=>t.id===e)?e:r[r.length-1]?.id??null}let o=t.grid.flat().length,c=f(s)||o>1&&s!==`__dock__`;if(r.length===0&&c){let{[s]:e,...n}=t.panels,r=g(t.grid,s);return{panels:n,grid:r,focusedPanelId:t.focusedPanelId===s?r.flat()[0]??Object.keys(n)[0]:t.focusedPanelId}}return{panels:{...t.panels,[s]:{...n,tabs:r,activeTabId:a,tabHistory:i}}}}),a(),s===`__dock__`&&O(i)===0&&i().setDockVisible(!1),f(s)&&H(t,i,s)},setActiveTab:(e,n)=>{let r=n?i().panels[n]:o(e);if(!r)return;$(r.tabs.find(t=>t.id===e));let s=r.id;t(t=>{let n=t.panels[s];return{focusedPanelId:l(s),panels:{...t.panels,[s]:{...n,tabs:Y(n.tabs,e),activeTabId:e,tabHistory:J(n.tabHistory,e)}}}}),a()},updateTab:(e,n)=>{let r=o(e);r&&(t(t=>({panels:{...t.panels,[r.id]:{...r,tabs:r.tabs.map(t=>t.id===e?{...t,...n}:t)}}})),a())},reorderTab:(e,n,r)=>{let o=i().panels[n];if(!o)return;let s=o.tabs.findIndex(t=>t.id===e);if(s===-1||s===r)return;let c=[...o.tabs],[l]=c.splice(s,1);c.splice(r,0,l),t(e=>({panels:{...e.panels,[n]:{...o,tabs:c}}})),a()},moveTab:(e,n,r,o)=>{if(n===r)return;let s=i().panels[n],c=i().panels[r];if(!s||!c)return;let l=s.tabs.find(t=>t.id===e);if(!l)return;let u=s.tabs.filter(t=>t.id!==e),d=s.tabHistory.filter(t=>t!==e),p=s.activeTabId===e?d[d.length-1]??u[u.length-1]?.id??null:s.activeTabId,m=[...c.tabs];o===void 0?m.push(l):m.splice(o,0,l),t(t=>{let i=t.grid.flat().length,a=n===`__dock__`||f(n);if(u.length===0&&i>1&&!a){let{[n]:i,...a}=t.panels;return{panels:{...a,[r]:{...c,tabs:m,activeTabId:e,tabHistory:J(c.tabHistory,e)}},grid:g(t.grid,n),focusedPanelId:r}}return{focusedPanelId:r,panels:{...t.panels,[n]:{...s,tabs:u,activeTabId:p,tabHistory:d},[r]:{...c,tabs:m,activeTabId:e,tabHistory:J(c.tabHistory,e)}}}}),a(),f(n)&&H(t,i,n)},splitPanel:(e,n,r,o)=>{let{grid:s,panels:c}=i(),l=i().isMobile(),u=c[r];if(!u)return!1;let d=u.tabs.find(e=>e.id===n);if(!d)return!1;let f=m(s,o??r);if(!f)return!1;let p=e===`left`||e===`right`,h=e===`up`||e===`down`;if(p&&(s[f.row]?.length??0)>=_(l)||h&&s.length>=3)return!1;let v=S([d],d.id);v.tabHistory=[d.id];let y=u.tabs.filter(e=>e.id!==n),b=u.tabHistory.filter(e=>e!==n),x=u.activeTabId===n?b[b.length-1]??y[y.length-1]?.id??null:u.activeTabId,C;if(p)C=s.map((t,n)=>{if(n!==f.row)return t;let r=[...t],i=e===`right`?f.col+1:f.col;return r.splice(i,0,v.id),r});else{C=[...s];let t=e===`down`?f.row+1:f.row;C.splice(t,0,[v.id])}return t(e=>{let t=e.grid.flat().length,n={...e.panels,[v.id]:v};if(y.length===0&&t>1){let{[r]:e,...t}=n;n=t,C=g(C,r)}else n[r]={...u,tabs:y,activeTabId:x,tabHistory:b};return{panels:n,grid:C,focusedPanelId:v.id}}),a(),!0},closePanel:e=>{let{panels:n,grid:r}=i();if(r.flat().length<=1)return;let o=n[e];if(!o)return;m(r,e);let s=r.flat(),c=s.indexOf(e),l=c>0?s[c-1]:s[1],u=n[l];u&&(t(t=>{let{[e]:n,...r}=t.panels,i=[...u.tabs,...o.tabs],a=u.activeTabId??o.activeTabId;return{panels:{...r,[l]:{...u,tabs:i,activeTabId:a,tabHistory:[...u.tabHistory,...o.tabHistory]}},grid:g(t.grid,e),focusedPanelId:l}}),a())},getPanelForTab:e=>o(e),isMobile:()=>typeof window<`u`&&window.innerWidth<768}});function $(e){let t=Q.getState();if(e?.type!==`chat`||e.metadata?.providerPending)return;let n=e.projectId??e.metadata?.projectName??t.currentProject,r=e.metadata?.providerId??`claude`;r!==`default`&&(!n||t.lastFocusedChatProviders[n]===r||Q.setState({lastFocusedChatProviders:{...t.lastFocusedChatProviders,[n]:r}}))}Q.subscribe((e,t)=>{let n=e.panels[e.focusedPanelId],r=n?.tabs.find(e=>e.id===n.activeTabId),i=t.panels[e.focusedPanelId],a=i?.tabs.find(e=>e.id===i.activeTabId);r?.id===a?.id&&r?.metadata?.providerId===a?.metadata?.providerId&&e.currentProject===t.currentProject||$(r)});export{V as i,K as n,G as r,Q as t};
1
+ import{n as e}from"./minimal-mode-rLZOjciW.js";import{d as t,h as n,k as r,u as i,v as a}from"./api-client-BnYFnEfK.js";import{t as o}from"./react-B9hau9ra.js";import{t as s}from"./settings-store-CMpVMq3Y.js";import{A as c,B as l,D as u,H as d,I as f,L as p,M as m,O as h,P as g,R as _,T as v,U as y,V as b,j as x,k as S,n as C,z as w}from"./window-store-D6EgLSfT.js";import{i as T}from"./project-store-Bs-kiU8m.js";import{t as E}from"./session-list-sync-triggers-D9i1FxWd.js";var ee=15,te=85;function ne(e){return Math.min(te,Math.max(ee,e))}function D(e,t){let n=e.filter(e=>e!==t);return n.push(t),n.length>50&&n.shift(),n}function O(e){let t=e().panels[v];if(!t)return 0;let n=e().currentProject;return t.tabs.filter(e=>!e.projectId||!n||e.projectId===n).length}function k(e){let t=e().currentProject;e().openInDock({type:`terminal`,title:`Terminal`,projectId:t??null,closable:!0,metadata:t?{projectName:t}:void 0})}function A(e,t){return function(){let{dock:n}=t(),r=!n.visible;e({dock:{...n,visible:r}}),M(t),r&&O(t)===0&&k(t)}}function j(e,t){return function(n){let{dock:r}=t();e({dock:{...r,visible:n}}),M(t)}}function re(e,t){return function(n){let{dock:r}=t();e({dock:{...r,height:ne(n)}}),M(t)}}function ie(e,t){return function(n){let{panels:r,dock:i}=t(),a=r.__dock__??h(),o=n;if(n.type===`terminal`&&!n.metadata?.terminalIndex){let e=Object.values(r).flatMap(e=>e.tabs).filter(e=>e.type===`terminal`).map(e=>{let t=e.id.match(/^terminal:(\d+)/);return t?parseInt(t[1],10):0}),t=e.length>0?Math.max(...e)+1:1;o={...n,metadata:{...n.metadata,terminalIndex:t}}}let s=x(o.type,o.metadata);if(a.tabs.find(e=>e.id===s))return e(e=>({dock:{...e.dock,visible:!0},panels:{...e.panels,[v]:{...a,activeTabId:s,tabHistory:D(a.tabHistory,s)}}})),M(t),s;let c={...o,id:s},l=[...a.tabs,c],u=D(a.tabHistory,s);return e(e=>({dock:{...e.dock,visible:!0},panels:{...e.panels,[v]:{...a,tabs:l,activeTabId:s,tabHistory:u}}})),M(t),s}}function ae(e,t){return function(n,r){t().moveTab(n,r,v);let{dock:i}=t();e({dock:{...i,visible:!0}}),M(t)}}function M(e){let{currentProject:t,panels:n,grid:r,focusedPanelId:i,dock:a}=e();if(!t)return;let o=new Set(r.flat()),s={};for(let[e,t]of Object.entries(n))o.has(e)&&(s[e]=t);w(t,{panels:s,grid:r,focusedPanelId:i,dock:a,dockPanel:n.__dock__??h()})}function oe(e,t,n){return{...n,[e]:t}}function N(e,t){return t[e]??{visible:!1,height:30}}function se(e,t){return t&&e.visible?{...e,visible:!1}:e}var P=`ppm-window-panels`,ce={terminal:!0,chat:!0,editor:!0,database:!0,"db-structure":!0,"db-sql":!0,"db-query":!0,"db-impexp":!0,"db-connection":!0,sqlite:!0,"git-diff":!0,"branch-review":!0,"session-review":!0,"git-review":!0,settings:!1,extension:!0,"extension-webview":!0,"conflict-editor":!0,"system-monitor":!1,"git-log":!0,"ai-resource":!0,group:!0,problems:!1,design:!0,android:!0,"web-preview":!0,logs:!1};function F(e){return typeof e==`string`&&ce[e]===!0}function I(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.id==`string`&&!!t.id&&typeof t.title==`string`&&F(t.type)}function L(e){let t={};for(let[n,r]of Object.entries(e))!f(n)||r.tabs.length===0||(t[n]=r);return t}function R(e){try{let t=L(e);Object.keys(t).length===0?localStorage.removeItem(P):localStorage.setItem(P,JSON.stringify(t))}catch{}}function z(){let e=null;try{e=localStorage.getItem(P)}catch{return{}}if(!e)return{};let t;try{t=JSON.parse(e)}catch{return{}}if(!t||typeof t!=`object`||Array.isArray(t))return{};let n={};for(let[e,r]of Object.entries(t)){if(!f(e)||!r||typeof r!=`object`)continue;let t=r;if(!Array.isArray(t.tabs))continue;let i=l({id:e,tabs:t.tabs.filter(e=>!!e&&typeof e==`object`&&typeof e.id==`string`),activeTabId:typeof t.activeTabId==`string`?t.activeTabId:null,tabHistory:Array.isArray(t.tabHistory)?t.tabHistory.filter(e=>typeof e==`string`):[]}),a=i.tabs.filter(I);if(a.length===0)continue;let o=new Set(a.map(e=>e.id)),s=i.tabHistory.filter(e=>o.has(e));n[e]={id:e,tabs:a,activeTabId:i.activeTabId&&o.has(i.activeTabId)?i.activeTabId:s[s.length-1]??a[a.length-1].id,tabHistory:s}}return n}function B(e,t){let n=e.flat();return t&&n.includes(t)?t:n[0]??null}function V(e){R(e().panels),M(e)}function H(e,t,n){if(t().panels[n]?.tabs.length){R(t().panels);return}e(e=>{let{[n]:t,...r}=e.panels;return{panels:r}}),R(t().panels);let r=d(n);r&&C.getState().close(r)}var U=!1;function W(e,t){if(U)return;U=!0;let n=z();Object.keys(n).length!==0&&e({panels:{...n,...t().panels}})}function le(e,t){return function(n,r,i={}){if(t().isMobile())return null;let a=t().panels[r]?.tabs.find(e=>e.id===n);if(!a||u.has(a.type))return null;let o=C.getState();if(Object.keys(o.windows).length>=8)return null;let s=o.open(`tab-host`,{originPanelId:r,title:a.title,...i.closeTabsOnClose?{closeTabsOnClose:!0}:{}},i.rect),l=y(s);e(e=>({panels:{...e.panels,[l]:c(s)}})),t().moveTab(n,r,l);let d=B(t().grid,r);return d&&e({focusedPanelId:d}),V(t),s}}function ue(e,t){return function(n,r){let i=y(n),a=t().panels[i];if(!a)return;let o=de(t(),r);if(o)for(let e of[...a.tabs])t().moveTab(e.id,i,o);e(e=>{let{[i]:t,...n}=e.panels,r=B(e.grid,o??e.focusedPanelId);return r?{panels:n,focusedPanelId:r}:{panels:n}}),V(t),C.getState().close(n)}}function de(e,t){return t&&e.panels[t]&&!f(t)?t:B(e.grid,e.focusedPanelId)}function fe(e,t){let n={...e},r=[];for(let[i,a]of Object.entries(e)){if(!f(i))continue;let e=a.tabs.filter(e=>e.projectId!==t);if(e.length===a.tabs.length)continue;let o=d(i);if(e.length===0){delete n[i],o&&r.push(o);continue}let s=new Set(e.map(e=>e.id)),c=a.tabHistory.filter(e=>s.has(e));n[i]={...a,tabs:e,tabHistory:c,activeTabId:a.activeTabId&&s.has(a.activeTabId)?a.activeTabId:c[c.length-1]??e[e.length-1].id}}return{panels:n,windowIdsToClose:r}}var pe=new Set([`chat`,`design`]);function G(e){if(!e||!pe.has(e.type))return;let t=e.metadata?.sessionId;return typeof t==`string`&&t?t:void 0}function K(e,t){return e.new_chat_provider_mode===`follow-focus`&&t&&t!==`default`?t:e.default_provider||`claude`}var me=new Set([`settings`,`git-log`]),he=new Set([`database`,`db-structure`,`db-sql`]),ge=new Set([`projects`,`git-status`,`git-graph`]);function q(e,t){if(!e)return null;let n=e.tabs.filter(e=>!e.projectId||e.projectId===t);if(n.length===0)return null;for(let t=e.tabHistory.length-1;t>=0;t--){let r=e.tabHistory[t];if(n.some(e=>e.id===r))return r}return n[n.length-1].id}function _e(e,n){let r=i(),o=e?t(a(E(e))):null,s=r?K(r,n):null;return r&&s&&o?.some(e=>e.id===s)?{providerId:s,permissionMode:r.providers[s]?.permission_mode??`bypassPermissions`,permissionModeSource:`cache`}:{providerPending:!0,focusedProviderOnOpen:n}}function ve(e,t){if(e.permissionMode&&e.permissionModeSource!==`cache`)return{};let n=i()?.providers[t]?.permission_mode;return n?{permissionMode:n,permissionModeSource:`cache`}:{}}function J(e,t){let n=e.filter(e=>e!==t);return n.push(t),n.length>50&&n.shift(),n}function Y(e,t){let n=Date.now();return e.map(e=>e.id===t?{...e,metadata:{...e.metadata,lastActiveAt:n}}:e)}function X(e){let t=d(e);t&&C.getState().focus(t)}function Z(){let e=S(),t=h();return{panels:{[e.id]:e,[v]:t},grid:[[e.id]],focusedPanelId:e.id}}var Q=o()((t,i)=>{function a(){let{currentProject:e,panels:t,grid:n,focusedPanelId:r,dock:a}=i();if(!e)return;let o=new Set(n.flat()),s={};for(let[e,n]of Object.entries(t))o.has(e)&&(s[e]=n);w(e,{panels:s,grid:n,focusedPanelId:r,dock:a,dockPanel:t[v]})}function o(e){return Object.values(i().panels).find(t=>t.tabs.some(t=>t.id===e))}function c(e){return e??i().focusedPanelId}function l(e){return f(e)?i().focusedPanelId:e}return{...Z(),currentProject:null,lastFocusedChatProviders:{},projectGrids:{},projectFocused:{},dock:{visible:!1,height:30},projectDock:{},dockExpanded:!1,toggleDock:A(t,i),setDockVisible:j(t,i),setDockHeight:re(t,i),toggleDockExpanded:()=>t(e=>({dockExpanded:!e.dockExpanded})),openInDock:ie(t,i),redockTab:ae(t,i),popOutTab:le(t,i),redockFromWindow:ue(t,i),switchProject:e=>{if(e!==`__global__`){let t=T.getState().projects.find(t=>t.name===e);t&&n(t)}W(t,i);let{currentProject:r,panels:a,grid:o,focusedPanelId:s,projectGrids:c,projectFocused:l,dock:u,projectDock:d}=i();if(r===e)return;let f={...c},m={...l},_=r?oe(r,u,d):{...d};if(r){f[r]=o,m[r]=s;let e=new Set(o.flat()),t={};for(let[n,r]of Object.entries(a))e.has(n)&&(t[n]=r);w(r,{panels:t,grid:o,focusedPanelId:s,dock:u,dockPanel:a[v]})}if(f[e]){let n=f[e],r=m[e]??n[0]?.[0]??``,i=N(e,_),o=a[v];t({currentProject:e,panels:o?{...a,[v]:{...o,activeTabId:q(o,e)}}:a,grid:n,focusedPanelId:r,projectGrids:f,projectFocused:m,dock:i,projectDock:_});return}let y=p(e);if(y&&Object.keys(y.panels).length>0){let n=!1,r={};for(let[t,i]of Object.entries(y.panels)){let a=b(i.tabs,e).filter(e=>!ge.has(e.type));a.length!==i.tabs.length&&(n=!0);let o=i.tabHistory.filter(e=>a.some(t=>t.id===e)),s=i.activeTabId&&a.some(e=>e.id===i.activeTabId)?i.activeTabId:o[o.length-1]??a[0]?.id??null;r[t]={...i,tabs:a,tabHistory:o,activeTabId:s}}let o=y.grid;for(let e of o.flat())if(!((r[e]?.tabs.length??0)>0)){if(o.flat().length<=1)break;o=g(o,e),delete r[e],n=!0}let s=o.flat().includes(y.focusedPanelId)?y.focusedPanelId:o.flat()[0]??y.focusedPanelId,c=a.__dock__??h(),l=y.dockPanel??h(),u=[...c.tabs];for(let e of l.tabs)u.some(t=>t.id===e.id)||u.push(e);let d={...c,tabs:u,tabHistory:[...new Set([...c.tabHistory,...l.tabHistory])].filter(e=>u.some(t=>t.id===e)),activeTabId:null};d.activeTabId=q(d,e);let p={...a,...r,[v]:d};f[e]=o,m[e]=s;let x=se(y.dock??N(e,_),i().isMobile());t({currentProject:e,panels:p,grid:o,focusedPanelId:s,projectGrids:f,projectFocused:m,dock:x,projectDock:_}),n&&w(e,{panels:r,grid:o,focusedPanelId:s,dock:x,dockPanel:d})}else{let n=S(),r=[[n.id]],i={...a,[n.id]:n};f[e]=r,m[e]=n.id;let o=N(e,_);w(e,{panels:{[n.id]:n},grid:r,focusedPanelId:n.id,dock:o,dockPanel:a[v]}),t({currentProject:e,panels:i,grid:r,focusedPanelId:n.id,projectGrids:f,projectFocused:m,dock:o,projectDock:_})}},reloadProject:e=>{let{projectGrids:n,projectFocused:r,projectDock:a,panels:o}=i(),s={...n},c={...r},l={...a};delete s[e],delete c[e],delete l[e];let u=n[e],d=u?new Set(u.flat()):new Set,f={...o};for(let e of d)e!==`__dock__`&&delete f[e];let p=f[v];if(p){let t=p.tabs.filter(t=>t.projectId!==e),n=new Set(t.map(e=>e.id));f[v]={...p,tabs:t,tabHistory:p.tabHistory.filter(e=>n.has(e)),activeTabId:p.activeTabId&&n.has(p.activeTabId)?p.activeTabId:t[t.length-1]?.id??null}}let m=fe(f,e);t({projectGrids:s,projectFocused:c,projectDock:l,panels:m.panels,currentProject:null}),R(m.panels);for(let e of m.windowIdsToClose)C.getState().close(e);i().switchProject(e)},setFocusedPanel:(e,n=!0)=>{if(f(e))return;let r=i().panels[e];r&&(t({focusedPanelId:e}),n&&$(r.tabs.find(e=>e.id===r.activeTabId)))},openTab:(n,o)=>{if(s.getState().minimalMode&&!e(n.type))return r.info(`This feature needs full mode. Restart PPM without --minimal.`),``;let u=i().isMobile(),p=u?i().grid[0]?.[0]??c(o):c(o);if(!i().panels[p])return``;if(n.type===`chat`&&!n.metadata?.sessionId&&!n.metadata?.providerId){let e=n.projectId??n.metadata?.projectName??i().currentProject??void 0,t=e?i().lastFocusedChatProviders[e]:void 0;n={...n,metadata:{...n.metadata,..._e(e,t)}}}else n.type===`chat`&&n.metadata&&!n.metadata.sessionId&&typeof n.metadata.providerId==`string`&&(n={...n,metadata:{...n.metadata,...ve(n.metadata,n.metadata.providerId)}});if(n.type===`terminal`&&!n.metadata?.terminalIndex){let e=Object.values(i().panels).flatMap(e=>e.tabs).filter(e=>e.type===`terminal`).map(e=>{let t=e.id.match(/^terminal:(\d+)/);return t?parseInt(t[1],10):0}),t=e.length>0?Math.max(...e)+1:1;n={...n,metadata:{...n.metadata,terminalIndex:t}}}let m=x(n.type,n.metadata);if(n.type===`chat`&&n.metadata?.sessionId){let e=n.metadata.sessionId;for(let n of Object.values(i().panels)){let r=n.tabs.find(t=>G(t)===e&&(!s.getState().minimalMode||t.type===`chat`));if(r)return $(r),t(e=>({focusedPanelId:l(n.id),panels:{...e.panels,[n.id]:{...n,tabs:Y(n.tabs,r.id),activeTabId:r.id,tabHistory:J(n.tabHistory,r.id)}}})),X(n.id),a(),r.id}}if(n.type===`design`){let e=n.metadata?.designSlug,r=n.projectId??n.metadata?.projectName;for(let n of Object.values(i().panels)){let i=n.tabs.find(t=>t.type===`design`&&t.metadata?.designSlug===e&&(t.projectId??t.metadata?.projectName)===r);if(i)return t(e=>({focusedPanelId:l(n.id),panels:{...e.panels,[n.id]:{...n,tabs:Y(n.tabs,i.id),activeTabId:i.id,tabHistory:J(n.tabHistory,i.id)}}})),X(n.id),a(),i.id}}if(he.has(n.type)){let e=u?[]:Object.keys(i().panels).filter(f),n=[...i().grid.flat(),...e];for(let e of n){let n=i().panels[e],r=n?.tabs.find(e=>e.id===m||e.id.startsWith(`${m}@`));if(!n||!r)continue;t(e=>({focusedPanelId:l(n.id),panels:{...e.panels,[n.id]:{...n,tabs:Y(n.tabs,r.id),activeTabId:r.id,tabHistory:J(n.tabHistory,r.id)}}}));let o=d(n.id);return o&&(C.getState().focus(o),R(i().panels)),a(),r.id}}if(me.has(n.type))for(let e of Object.values(i().panels)){let n=e.tabs.find(e=>e.id===m);if(n)return t(t=>({focusedPanelId:l(e.id),panels:{...t.panels,[e.id]:{...e,tabs:Y(e.tabs,n.id),activeTabId:n.id,tabHistory:J(e.tabHistory,n.id)}}})),a(),n.id}if(u)for(let e of i().grid.flat()){let n=i().panels[e];if(!n)continue;let r=n.tabs.find(e=>e.id===m||e.id.startsWith(`${m}@`));if(r)return t(e=>({focusedPanelId:n.id,panels:{...e.panels,[n.id]:{...n,tabs:Y(n.tabs,r.id),activeTabId:r.id,tabHistory:J(n.tabHistory,r.id)}}})),a(),r.id}let h=i().panels[p],g=h.tabs.find(e=>e.id===m);if(g)return t(e=>({panels:{...e.panels,[p]:{...h,tabs:Y(h.tabs,g.id),activeTabId:g.id,tabHistory:J(h.tabHistory,g.id)}}})),a(),g.id;let _=Object.values(i().panels).some(e=>e.id!==p&&e.tabs.some(e=>e.id===m))?`${m}@${p}`:m,v={...n,id:_,metadata:{...n.metadata,lastActiveAt:Date.now()}};return t(e=>{let t=e.panels[p];return{focusedPanelId:p,panels:{...e.panels,[p]:{...t,tabs:[...t.tabs,v],activeTabId:_,tabHistory:J(t.tabHistory,_)}}}}),a(),_},closeTab:(e,n)=>{let r=n?i().panels[n]:o(e);if(!r)return;let s=r.id;if(e.startsWith(`terminal:`))try{localStorage.removeItem(`ppm:terminal-session:${e}`)}catch{}t(t=>{let n=t.panels[s],r=n.tabs.filter(t=>t.id!==e),i=n.tabHistory.filter(t=>t!==e),a=n.activeTabId;if(n.activeTabId===e){let e=i.length>0?i[i.length-1]:null;a=e&&r.some(t=>t.id===e)?e:r[r.length-1]?.id??null}let o=t.grid.flat().length,c=f(s)||o>1&&s!==`__dock__`;if(r.length===0&&c){let{[s]:e,...n}=t.panels,r=g(t.grid,s);return{panels:n,grid:r,focusedPanelId:t.focusedPanelId===s?r.flat()[0]??Object.keys(n)[0]:t.focusedPanelId}}return{panels:{...t.panels,[s]:{...n,tabs:r,activeTabId:a,tabHistory:i}}}}),a(),s===`__dock__`&&O(i)===0&&i().setDockVisible(!1),f(s)&&H(t,i,s)},setActiveTab:(e,n)=>{let r=n?i().panels[n]:o(e);if(!r)return;$(r.tabs.find(t=>t.id===e));let s=r.id;t(t=>{let n=t.panels[s];return{focusedPanelId:l(s),panels:{...t.panels,[s]:{...n,tabs:Y(n.tabs,e),activeTabId:e,tabHistory:J(n.tabHistory,e)}}}}),a()},updateTab:(e,n)=>{let r=o(e);r&&(t(t=>({panels:{...t.panels,[r.id]:{...r,tabs:r.tabs.map(t=>t.id===e?{...t,...n}:t)}}})),a())},reorderTab:(e,n,r)=>{let o=i().panels[n];if(!o)return;let s=o.tabs.findIndex(t=>t.id===e);if(s===-1||s===r)return;let c=[...o.tabs],[l]=c.splice(s,1);c.splice(r,0,l),t(e=>({panels:{...e.panels,[n]:{...o,tabs:c}}})),a()},moveTab:(e,n,r,o)=>{if(n===r)return;let s=i().panels[n],c=i().panels[r];if(!s||!c)return;let l=s.tabs.find(t=>t.id===e);if(!l)return;let u=s.tabs.filter(t=>t.id!==e),d=s.tabHistory.filter(t=>t!==e),p=s.activeTabId===e?d[d.length-1]??u[u.length-1]?.id??null:s.activeTabId,m=[...c.tabs];o===void 0?m.push(l):m.splice(o,0,l),t(t=>{let i=t.grid.flat().length,a=n===`__dock__`||f(n);if(u.length===0&&i>1&&!a){let{[n]:i,...a}=t.panels;return{panels:{...a,[r]:{...c,tabs:m,activeTabId:e,tabHistory:J(c.tabHistory,e)}},grid:g(t.grid,n),focusedPanelId:r}}return{focusedPanelId:r,panels:{...t.panels,[n]:{...s,tabs:u,activeTabId:p,tabHistory:d},[r]:{...c,tabs:m,activeTabId:e,tabHistory:J(c.tabHistory,e)}}}}),a(),f(n)&&H(t,i,n)},splitPanel:(e,n,r,o)=>{let{grid:s,panels:c}=i(),l=i().isMobile(),u=c[r];if(!u)return!1;let d=u.tabs.find(e=>e.id===n);if(!d)return!1;let f=m(s,o??r);if(!f)return!1;let p=e===`left`||e===`right`,h=e===`up`||e===`down`;if(p&&(s[f.row]?.length??0)>=_(l)||h&&s.length>=3)return!1;let v=S([d],d.id);v.tabHistory=[d.id];let y=u.tabs.filter(e=>e.id!==n),b=u.tabHistory.filter(e=>e!==n),x=u.activeTabId===n?b[b.length-1]??y[y.length-1]?.id??null:u.activeTabId,C;if(p)C=s.map((t,n)=>{if(n!==f.row)return t;let r=[...t],i=e===`right`?f.col+1:f.col;return r.splice(i,0,v.id),r});else{C=[...s];let t=e===`down`?f.row+1:f.row;C.splice(t,0,[v.id])}return t(e=>{let t=e.grid.flat().length,n={...e.panels,[v.id]:v};if(y.length===0&&t>1){let{[r]:e,...t}=n;n=t,C=g(C,r)}else n[r]={...u,tabs:y,activeTabId:x,tabHistory:b};return{panels:n,grid:C,focusedPanelId:v.id}}),a(),!0},closePanel:e=>{let{panels:n,grid:r}=i();if(r.flat().length<=1)return;let o=n[e];if(!o)return;m(r,e);let s=r.flat(),c=s.indexOf(e),l=c>0?s[c-1]:s[1],u=n[l];u&&(t(t=>{let{[e]:n,...r}=t.panels,i=[...u.tabs,...o.tabs],a=u.activeTabId??o.activeTabId;return{panels:{...r,[l]:{...u,tabs:i,activeTabId:a,tabHistory:[...u.tabHistory,...o.tabHistory]}},grid:g(t.grid,e),focusedPanelId:l}}),a())},getPanelForTab:e=>o(e),isMobile:()=>typeof window<`u`&&window.innerWidth<768}});function $(e){let t=Q.getState();if(e?.type!==`chat`||e.metadata?.providerPending)return;let n=e.projectId??e.metadata?.projectName??t.currentProject,r=e.metadata?.providerId??`claude`;r!==`default`&&(!n||t.lastFocusedChatProviders[n]===r||Q.setState({lastFocusedChatProviders:{...t.lastFocusedChatProviders,[n]:r}}))}Q.subscribe((e,t)=>{let n=e.panels[e.focusedPanelId],r=n?.tabs.find(e=>e.id===n.activeTabId),i=t.panels[e.focusedPanelId],a=i?.tabs.find(e=>e.id===i.activeTabId);r?.id===a?.id&&r?.metadata?.providerId===a?.metadata?.providerId&&e.currentProject===t.currentProject||$(r)});export{V as i,K as n,G as r,Q as t};
@@ -1 +1 @@
1
- import{t as e}from"./panel-store-Dx2ziBLp.js";function t(t,r){let i=e.getState(),a=i.getPanelForTab(t)?.tabs.find(e=>e.id===t)?.metadata;i.updateTab(t,{metadata:n(a,r)})}function n(e,t){return{...e,...t}}function r(t){return e.getState().getPanelForTab(t)?.tabs.find(e=>e.id===t)?.metadata}export{t as n,r as t};
1
+ import{t as e}from"./panel-store-H7e9XHZF.js";function t(t,r){let i=e.getState(),a=i.getPanelForTab(t)?.tabs.find(e=>e.id===t)?.metadata;i.updateTab(t,{metadata:n(a,r)})}function n(e,t){return{...e,...t}}function r(t){return e.getState().getPanelForTab(t)?.tabs.find(e=>e.id===t)?.metadata}export{t as n,r as t};
@@ -1,3 +1,3 @@
1
- import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{I as r,L as i,Ln as a,Xt as o,ai as s,dn as c,dt as l,t as u}from"./icons-C1wDt09O.js";import{r as d}from"./api-client-BnYFnEfK.js";import{_ as f,b as p,g as m,h,t as g,v as _,x as v,y}from"./settings-store-CBJCnE5L.js";import{n as b}from"./utils-D3xTlJyU.js";import"./portal-container-context-Gepuvxdg.js";import"./context-menu-DhKbkI1X.js";import{n as x}from"./use-is-mobile-CL2I7hLf.js";import"./mobile-bottom-sheet-M9pZptfh.js";import"./use-visual-viewport-B_GFo6k2.js";import{a as S,c as C,i as w,l as T,n as E,o as ee,r as te,s as D,t as ne,u as re}from"./adaptive-context-menu-CxHkI7dL.js";import{n as O,r as k,t as A}from"./format-bytes-Xp9emfaR.js";import{n as j,t as M}from"./metric-chart-canvas-Dnm9OOXU.js";var N=e(t(),1),P={wired:`Ethernet`,wireless:`Wi-Fi`,bluetooth:`Bluetooth`,bridge:`Bridge`,docker:`Docker`,infiniband:`InfiniBand`,multipass:`Multipass`,virtual:`Virtual`,vpn:`VPN`,other:`Other`},F=1024,I=e=>Math.round(e);function L(e){return P[e?.kind??`other`]}function R(e,t,n){if(!n||n<=0)return null;let r=(e+t)*8/1e6;return Math.min(100,Math.max(0,r/n*100))}function z(e,t){return`${(e/F).toFixed(1)}/${(t/F).toFixed(1)} GB`}function B(e,t){let n=new Map((t?.disks??[]).map(e=>[e.id,e])),r=new Map((t?.nics??[]).map(e=>[e.id,e])),i=[{key:`cpu`,kind:`cpu`,label:`CPU`,sublabel:e.cpu.model,id:null,detail:`${I(e.cpu.total)}%`,percent:e.cpu.total},{key:`memory`,kind:`memory`,label:`Memory`,sublabel:z(e.mem.usedMB,e.mem.totalMB),id:null,detail:`${I(e.mem.percent)}%`,percent:e.mem.percent}];(e.disks??[]).forEach((e,t)=>{i.push({key:`disk:${e.id}`,kind:`disk`,label:`Disk ${t}`,sublabel:n.get(e.id)?.model??e.id,id:e.id,detail:e.available?`${I(e.busyPercent)}%`:`—`,percent:e.available?e.busyPercent:null})}),(e.nics??[]).forEach(e=>{let t=r.get(e.id);i.push({key:`nic:${e.id}`,kind:`nic`,label:L(t),sublabel:e.id,id:e.id,detail:e.available?A(e.rxBps+e.txBps):`—`,percent:e.available?R(e.rxBps,e.txBps,e.linkMbps):null})}),e.gpus.forEach((e,t)=>{i.push({key:`gpu:${e.id??t}`,kind:`gpu`,label:`GPU ${t}`,sublabel:e.name,id:e.id??null,detail:`${I(e.utilPercent)}%`,percent:e.utilPercent})});let a=e.fans??[];if(a.length>0){let e=Math.max(...a.map(e=>e.rpm));i.push({key:`fans`,kind:`fans`,label:`Fans`,sublabel:`${a.length} sensor${a.length===1?``:`s`}`,id:null,detail:`${e} RPM`,percent:null})}return i}function V(e,t){return t&&e.some(e=>e.key===t)?t:e[0]?.key??`cpu`}var H=3e4;function ie(e){let[t,n]=(0,N.useState)(null),r=(0,N.useRef)(!1),i=(0,N.useRef)(``),a=(0,N.useCallback)(async()=>{if(!r.current){r.current=!0;try{n(await d.get(`/api/system/hardware`))}catch{}finally{r.current=!1}}},[]);return(0,N.useEffect)(()=>{a()},[a]),(0,N.useEffect)(()=>{if(!t)return;let n=new Set([...t.disks.map(e=>e.id),...t.nics.map(e=>e.id),...t.gpus.map(e=>e.id)]),r=e.split(`,`).filter(e=>e&&!n.has(e)).join(`,`);if(!r){i.current=``;return}if(r!==i.current){i.current=r,a();return}let o=setTimeout(()=>void a(),H);return()=>clearTimeout(o)},[t,e,a]),t}var U=n();function W({title:e,subtitle:t,value:n,valueClassName:r}){return(0,U.jsxs)(`div`,{className:`flex items-baseline justify-between gap-3`,children:[(0,U.jsxs)(`div`,{className:`min-w-0`,children:[(0,U.jsx)(`h3`,{className:`text-base font-semibold truncate`,children:e}),t&&(0,U.jsx)(`p`,{className:`text-xs text-text-subtle truncate`,title:t,children:t})]}),n!==void 0&&(0,U.jsx)(`span`,{className:b(`text-2xl font-semibold tabular-nums shrink-0`,r),children:n})]})}function G({children:e}){return(0,U.jsx)(`dl`,{className:`grid grid-cols-2 @2xl:grid-cols-4 gap-x-4 gap-y-3`,children:e})}function K({label:e,value:t,title:n}){let r=t==null||t===``?`—`:String(t);return(0,U.jsxs)(`div`,{className:`min-w-0`,children:[(0,U.jsx)(`dt`,{className:`text-[11px] text-text-subtle truncate`,children:e}),(0,U.jsx)(`dd`,{className:`text-sm tabular-nums truncate`,title:n??r,children:r})]})}function q({series:e,maxValue:t,height:n=120,legend:r,caption:i,ceiling:a,grid:o,stacked:s}){return(0,U.jsxs)(`div`,{className:`space-y-1`,children:[(i||a)&&(0,U.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2 text-[11px] text-text-subtle`,children:[(0,U.jsx)(`span`,{className:`truncate`,children:i}),(0,U.jsx)(`span`,{className:`shrink-0 tabular-nums`,children:a})]}),(0,U.jsx)(M,{series:e,height:n,maxValue:t,grid:o,stacked:s}),r&&r.length>0&&(0,U.jsx)(`div`,{className:`flex flex-wrap gap-x-4 gap-y-1`,children:r.map((t,n)=>(0,U.jsxs)(`span`,{className:`flex items-center gap-1.5 text-[11px] text-text-subtle`,children:[(0,U.jsx)(`span`,{className:`size-2 rounded-full`,style:{background:e[n]?.color}}),t]},t))})]})}function J(e,t,n=200){return(0,N.useMemo)(()=>e.slice(-n).map(e=>t(e)??0),[e,n])}function ae({segments:e}){let t=e.reduce((e,t)=>e+Math.max(0,t.value),0);return t<=0?null:(0,U.jsx)(`div`,{className:`flex h-3 w-full overflow-hidden rounded-sm bg-surface-hover`,role:`img`,"aria-label":e.map(e=>e.label).join(`, `),children:e.map(e=>(0,U.jsx)(`div`,{className:`h-full`,style:{width:`${Math.max(0,e.value)/t*100}%`,background:e.color},title:e.label},e.label))})}var Y={primary:`var(--color-primary)`,secondary:`var(--color-warning)`,success:`var(--color-success)`,error:`var(--color-error)`};function oe({cores:e,history:t,points:n=200,height:r=260}){let i=(0,N.useRef)(null),a=j(i),{cols:o,rows:s}=y(e.length,a),c=(0,N.useMemo)(()=>{let r=t.slice(-n),i=Array.from({length:e.length},()=>[]);for(let e of r){let t=e.system.cpu.cores;for(let e=0;e<i.length;e++)i[e].push(t[e]??0)}return i},[t,n,e.length]);if(e.length===0)return null;let l=Math.max(28,Math.floor(r/Math.max(1,s))-6);return(0,U.jsx)(`div`,{ref:i,className:`grid gap-1.5`,style:{gridTemplateColumns:`repeat(${Math.max(1,o)}, minmax(0, 1fr))`},"data-testid":`sysmon-core-grid`,"data-core-count":e.length,"data-cols":o,children:c.map((t,n)=>(0,U.jsx)(`div`,{className:`rounded-sm border border-border/70 overflow-hidden px-0.5`,title:`CPU ${n}: ${(e[n]??0).toFixed(0)}%`,children:(0,U.jsx)(M,{series:[{data:t,color:Y.primary}],height:l,maxValue:100})},n))})}function se(e){if(e===void 0)return;let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}d ${n}h ${r}m`:`${n}h ${r}m`}var X=e=>e===void 0?void 0:`${(e/1e3).toFixed(2)} GHz`;function ce(e){if(e===void 0)return;let{physicalCores:t,performanceCores:n,efficiencyCores:r}=e;return n!==void 0&&r!==void 0?`${t} (${n}P + ${r}E)`:String(t)}function le({cpu:e,info:t,history:n,processCount:r,platform:i}){let a=g(e=>e.sysmonTempUnit),o=g(e=>e.sysmonKernelTimes),s=g(e=>e.setSysmonKernelTimes),c=g(e=>e.sysmonCpuGraph),l=g(e=>e.setSysmonCpuGraph),u=g(e=>e.sysmonCpuBottomGraph),d=g(e=>e.setSysmonCpuBottomGraph),y=J(n,e=>e.system.cpu.total),b=J(n,e=>e.system.cpu.kernelPercent),x=J(n,e=>e.system.cpu.tempC),k=J(n,e=>e.system.cpu.powerW),A=J(n,e=>e.system.cpu.currentMHz),j=o&&e.kernelPercent!==void 0,M=p(n.map(e=>e.ts)),P=e=>M?`${e} ${M}`:e,F=i===`darwin`,I=e=>!F||e!==void 0,L=(0,N.useMemo)(()=>{let t=n.slice(-200),r=e.cores.length,i=Array.from({length:r},()=>[]);for(let e of t){let t=e.system.cpu.cores;for(let e=0;e<r;e++)i[e].push(t[e]??0)}return i},[n,e.cores.length]),R=L.map(e=>({data:e,color:Y.primary})),z=L.map(e=>({data:e.map(e=>e/Math.max(1,L.length)),color:Y.primary})),B=()=>u===`none`?null:u===`temperature`?e.tempC===void 0?null:(0,U.jsx)(q,{grid:!0,height:100,caption:P(`Temperature`),ceiling:v(Math.max(...x,1),a),series:[{data:x,color:Y.error}]}):u===`power`?e.powerW===void 0?null:(0,U.jsx)(q,{grid:!0,height:100,caption:P(`Power draw`),ceiling:`${Math.max(...k,1).toFixed(1)} W`,series:[{data:k,color:Y.secondary}]}):e.currentMHz===void 0?null:(0,U.jsx)(q,{grid:!0,height:100,caption:P(`Clock speed`),ceiling:X(t?.maxMHz??Math.max(...A,1)),maxValue:t?.maxMHz,series:[{data:A,color:Y.success}]});return(0,U.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-detail-cpu`,children:[(0,U.jsx)(W,{title:`CPU`,subtitle:t?.name??e.model,value:`${e.total.toFixed(1)}%`}),(0,U.jsxs)(ne,{children:[(0,U.jsx)(re,{children:(0,U.jsxs)(`div`,{className:`space-y-3 select-none`,"data-testid":`sysmon-cpu-graphs`,children:[c===`logical`?(0,U.jsxs)(`div`,{className:`space-y-1`,children:[(0,U.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2 text-[11px] text-text-subtle`,children:[(0,U.jsx)(`span`,{className:`truncate`,children:P(`Utilisation`)}),(0,U.jsx)(`span`,{className:`shrink-0 tabular-nums`,children:`100%`})]}),(0,U.jsx)(oe,{cores:e.cores,history:n})]}):(0,U.jsx)(q,{grid:!0,maxValue:100,caption:P(`Utilisation`),ceiling:`100%`,stacked:c===`threads-stacked`,legend:c===`overall`&&j?[`Utilisation`,`Kernel`]:void 0,series:c===`threads`?R:c===`threads-stacked`?z:j?[{data:y,color:Y.primary},{data:b,color:Y.secondary}]:[{data:y,color:Y.primary}]}),B()]})}),(0,U.jsxs)(E,{children:[(0,U.jsxs)(D,{children:[(0,U.jsx)(T,{children:`Change top graph to`}),(0,U.jsx)(C,{children:(0,U.jsx)(w,{value:c,onValueChange:e=>l(e),children:_.map(e=>(0,U.jsx)(S,{value:e,"data-testid":`sysmon-cpu-graph-${e}`,children:f[e]},e))})})]}),(0,U.jsxs)(D,{children:[(0,U.jsx)(T,{children:`Change bottom graph to`}),(0,U.jsx)(C,{children:(0,U.jsx)(w,{value:u,onValueChange:e=>d(e),children:h.map(e=>(0,U.jsx)(S,{value:e,"data-testid":`sysmon-cpu-bottom-${e}`,children:m[e]},e))})})]}),(0,U.jsx)(ee,{}),(0,U.jsx)(te,{onSelect:()=>s(!o),"data-testid":`sysmon-cpu-kernel-toggle`,children:o?`Hide kernel times`:`Show kernel times`})]})]}),(0,U.jsxs)(G,{children:[(0,U.jsx)(K,{label:`Speed`,value:X(e.currentMHz)}),I(t?.baseMHz)&&(0,U.jsx)(K,{label:`Base speed`,value:X(t?.baseMHz)}),(0,U.jsx)(K,{label:`Max speed`,value:X(t?.maxMHz)}),(0,U.jsx)(K,{label:`Temperature`,value:v(e.tempC,a)}),(0,U.jsx)(K,{label:`Power`,value:e.powerW===void 0?void 0:`${e.powerW.toFixed(1)} W`}),(0,U.jsx)(K,{label:`Processes`,value:r}),(0,U.jsx)(K,{label:`Threads running`,value:e.threadCount}),(0,U.jsx)(K,{label:`Open handles`,value:e.handleCount}),(0,U.jsx)(K,{label:`Up time`,value:se(e.uptimeSec)}),(0,U.jsx)(K,{label:`Sockets`,value:t?.sockets}),(0,U.jsx)(K,{label:`Cores`,value:ce(t)}),(0,U.jsx)(K,{label:`Logical processors`,value:t?.logicalCores??e.cores.length}),(0,U.jsx)(K,{label:`Virtualisation`,value:t?.isVirtualMachine?`Running in a VM`:t?.virtualization}),(0,U.jsx)(K,{label:`L1 cache`,value:t?.l1CacheBytes===void 0?void 0:O(t.l1CacheBytes)}),(0,U.jsx)(K,{label:`L2 cache`,value:t?.l2CacheBytes===void 0?void 0:O(t.l2CacheBytes)}),I(t?.l3CacheBytes)&&(0,U.jsx)(K,{label:`L3 cache`,value:t?.l3CacheBytes===void 0?void 0:O(t.l3CacheBytes)}),!F&&(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(K,{label:`Cpufreq driver`,value:t?.freqDriver}),(0,U.jsx)(K,{label:`Governor`,value:t?.freqGovernor}),(0,U.jsx)(K,{label:`Power preference`,value:t?.powerPreference})]})]})]})}function ue({mem:e,info:t,history:n,platform:r}){let i=r===`darwin`,a=J(n,e=>e.system.mem.percent),o=J(n,e=>{let t=e.system.mem.swapTotalMB??0;return t>0?(e.system.mem.swapUsedMB??0)/t*100:0}),s=e.inUseBytes!==void 0,c=[{label:`In use`,value:e.inUseBytes,color:`var(--color-primary)`},{label:`Modified`,value:e.modifiedBytes,color:`var(--color-warning)`},{label:i?`Cached`:`Standby`,value:e.standbyBytes,color:`var(--color-success)`},{label:`Free`,value:e.freeBytes,color:`var(--color-border)`}].filter(e=>e.value!==void 0),l=p(n.map(e=>e.ts)),u=e=>l?`${e} ${l}`:e,d=(e.swapTotalMB??0)>0;return(0,U.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-detail-memory`,children:[(0,U.jsx)(W,{title:`Memory`,subtitle:`${k(e.usedMB)} of ${k(e.totalMB)} in use`,value:`${e.percent.toFixed(1)}%`}),(0,U.jsx)(q,{grid:!0,maxValue:100,caption:u(`Memory usage`),ceiling:k(e.totalMB),series:[{data:a,color:Y.primary}]}),d&&(0,U.jsx)(q,{grid:!0,height:90,maxValue:100,caption:u(`Swap usage`),ceiling:k(e.swapTotalMB??0),series:[{data:o,color:Y.success}]}),s&&(0,U.jsxs)(`div`,{className:`space-y-2`,children:[(0,U.jsx)(ae,{segments:c}),(0,U.jsx)(`div`,{className:`flex flex-wrap gap-x-4 gap-y-1 text-[11px] text-text-subtle`,children:c.map(e=>(0,U.jsxs)(`span`,{children:[e.label,` `,O(e.value)]},e.label))})]}),(0,U.jsxs)(G,{children:[(0,U.jsx)(K,{label:`Available`,value:k(e.availableMB)}),(0,U.jsx)(K,{label:`Cached`,value:e.cachedMB===void 0?void 0:k(e.cachedMB)}),!i&&(0,U.jsx)(K,{label:`Committed`,value:e.committedMB===void 0?void 0:`${k(e.committedMB)} / ${e.commitLimitMB===void 0?`?`:k(e.commitLimitMB)}`}),(0,U.jsx)(K,{label:`Swap`,value:e.swapTotalMB===void 0?void 0:`${k(e.swapUsedMB??0)} / ${k(e.swapTotalMB)}`}),(0,U.jsx)(K,{label:i?`Compressed`:`Compressed (zram)`,value:e.zramCompressedMB===void 0?void 0:k(e.zramCompressedMB)}),(0,U.jsx)(K,{label:i?`Compression savings`:`Savings (zram)`,value:e.zramSavingsMB===void 0?void 0:k(e.zramSavingsMB)}),!t?.unified&&(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(K,{label:`Slots used`,value:t===void 0?void 0:`${t.devices.length}${t.slotsTotal?` of ${t.slotsTotal}`:``}`}),(0,U.jsx)(K,{label:`Maximum capacity`,value:t?.maxCapacityBytes===void 0?void 0:O(t.maxCapacityBytes)})]})]}),t&&t.devices.length>0&&(0,U.jsxs)(`div`,{className:`space-y-1`,children:[!t.unified&&(0,U.jsx)(`h4`,{className:`text-xs font-medium text-text-secondary`,children:`Slots`}),(0,U.jsx)(`div`,{className:`rounded-md border border-border divide-y divide-border`,children:t.devices.map(e=>(0,U.jsxs)(`div`,{className:`flex items-center justify-between gap-3 px-3 py-2 text-xs`,children:[(0,U.jsx)(`span`,{className:`font-medium shrink-0`,children:e.locator}),(0,U.jsx)(`span`,{className:`text-text-subtle truncate`,children:[e.manufacturer,e.ramType,e.formFactor,e.speedMts?`${e.speedMts} MT/s`:null].filter(Boolean).join(` · `)}),(0,U.jsx)(`span`,{className:`tabular-nums shrink-0`,children:O(e.sizeBytes)})]},e.locator))})]})]})}var de=90,fe=75;function pe(e){return e>=de?`bg-error`:e>=fe?`bg-warning`:`bg-primary`}function me({partitions:e}){return e.length===0?null:(0,U.jsxs)(`section`,{className:`space-y-2`,"data-testid":`sysmon-partitions`,children:[(0,U.jsx)(`h4`,{className:`text-sm font-medium`,children:`Partitions`}),(0,U.jsx)(`ul`,{className:`space-y-2`,children:e.map(e=>(0,U.jsx)(he,{part:e},e.id))})]})}function he({part:e}){let t=e.mounts.find(e=>e.usedBytes!==void 0&&e.totalBytes),n=t?Math.min(100,t.usedBytes/t.totalBytes*100):void 0;return(0,U.jsxs)(`li`,{className:`rounded-md border border-border px-3 py-2 space-y-1.5`,"data-testid":`sysmon-partition`,children:[(0,U.jsxs)(`div`,{className:`flex items-baseline justify-between gap-3`,children:[(0,U.jsx)(`span`,{className:`text-sm font-medium truncate`,title:e.devicePath,children:e.devicePath}),(0,U.jsxs)(`span`,{className:`text-[11px] text-text-subtle shrink-0 tabular-nums`,children:[e.filesystem??`—`,` · `,O(e.sizeBytes)]})]}),e.mounts.length===0?(0,U.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Not mounted`}):(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`p`,{className:`text-[11px] text-text-subtle truncate`,title:e.mounts.map(e=>e.mountPoint).join(`, `),children:e.mounts.map(e=>e.mountPoint).join(`, `)}),n===void 0?(0,U.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Usage unavailable`}):(0,U.jsxs)(`div`,{className:`space-y-1`,children:[(0,U.jsx)(`div`,{className:`h-1.5 w-full rounded-full bg-surface-hover overflow-hidden`,children:(0,U.jsx)(`div`,{className:b(`h-full rounded-full`,pe(n)),style:{width:`${n}%`}})}),(0,U.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2 text-[11px] text-text-subtle tabular-nums`,children:[(0,U.jsxs)(`span`,{children:[O(t.usedBytes),` of `,O(t.totalBytes)]}),(0,U.jsxs)(`span`,{children:[n.toFixed(0),`%`]})]})]})]})]})}var ge={hdd:`Hard disk`,ssd:`SSD`,nvme:`NVMe`,emmc:`eMMC`,sd:`SD card`,optical:`Optical`,thumb:`Removable`,unknown:`Unknown`};function _e({disk:e,info:t,index:n,history:r}){let i=g(e=>e.sysmonTempUnit),a=t=>t.system.disks?.find(t=>t.id===e.id),o=J(r,e=>a(e)?.busyPercent),s=J(r,e=>a(e)?.readBps),c=J(r,e=>a(e)?.writeBps);return(0,U.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-detail-disk`,"data-disk-id":e.id,children:[(0,U.jsx)(W,{title:`Disk ${n}`,subtitle:t?.model??e.id,value:e.available?`${e.busyPercent.toFixed(0)}%`:`—`}),(0,U.jsxs)(`div`,{className:`space-y-1`,children:[(0,U.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Active time`}),(0,U.jsx)(q,{maxValue:100,series:[{data:o,color:Y.primary}],height:90})]}),(0,U.jsxs)(`div`,{className:`space-y-1`,children:[(0,U.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Transfer rate`}),(0,U.jsx)(q,{height:90,legend:[`Read`,`Write`],series:[{data:s,color:Y.success},{data:c,color:Y.secondary}]})]}),(0,U.jsxs)(G,{children:[(0,U.jsx)(K,{label:`Read speed`,value:e.available?A(e.readBps):void 0}),(0,U.jsx)(K,{label:`Write speed`,value:e.available?A(e.writeBps):void 0}),(0,U.jsx)(K,{label:`Avg. response time`,value:e.available?`${e.responseMs.toFixed(2)} ms`:void 0}),(0,U.jsx)(K,{label:`Temperature`,value:v(e.tempC,i)}),(0,U.jsx)(K,{label:`Total read`,value:O(e.readTotal)}),(0,U.jsx)(K,{label:`Total written`,value:O(e.writeTotal)}),(0,U.jsx)(K,{label:`Capacity`,value:t===void 0?void 0:O(t.capacityBytes)}),(0,U.jsx)(K,{label:`Type`,value:t===void 0?void 0:ge[t.kind]??t.kind}),(0,U.jsx)(K,{label:`System disk`,value:t===void 0?void 0:t.systemDisk?`Yes`:`No`}),(0,U.jsx)(K,{label:`Removable`,value:t===void 0?void 0:t.removable?`Yes`:`No`}),(0,U.jsx)(K,{label:`Rotation`,value:t?.rotationRpm===void 0?void 0:`${t.rotationRpm} RPM`}),(0,U.jsx)(K,{label:`Serial`,value:t?.serial})]}),(0,U.jsx)(me,{partitions:t?.partitions??[]})]})}var ve={connected:`Connected`,connecting:`Connecting`,disconnected:`Disconnected`,unavailable:`Unavailable`,unknown:`Unknown`};function ye({nic:e,info:t,history:n,platform:r}){let i=t=>t.system.nics?.find(t=>t.id===e.id),a=J(n,e=>i(e)?.rxBps),o=J(n,e=>i(e)?.txBps);return(0,U.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-detail-nic`,"data-nic-id":e.id,children:[(0,U.jsx)(W,{title:P[t?.kind??`other`],subtitle:[e.id,t?.deviceName].filter(Boolean).join(` · `),value:e.available?A(e.rxBps+e.txBps):`—`}),(0,U.jsx)(q,{legend:[`Receive`,`Send`],series:[{data:a,color:Y.primary},{data:o,color:Y.secondary}]}),(0,U.jsxs)(G,{children:[(0,U.jsx)(K,{label:`State`,value:ve[e.state]}),(0,U.jsx)(K,{label:`Receive`,value:e.available?A(e.rxBps):void 0}),(0,U.jsx)(K,{label:`Send`,value:e.available?A(e.txBps):void 0}),(0,U.jsx)(K,{label:`Maximum bitrate`,value:e.linkMbps===void 0?void 0:`${e.linkMbps} Mbps`}),(0,U.jsx)(K,{label:`Total received`,value:O(e.rxTotal)}),(0,U.jsx)(K,{label:`Total sent`,value:O(e.txTotal)}),(0,U.jsx)(K,{label:`Network name`,value:e.ssid}),(0,U.jsx)(K,{label:`Signal`,value:e.signalPercent===void 0?void 0:`${e.signalPercent}%`}),(0,U.jsx)(K,{label:`Frequency`,value:e.frequencyMHz===void 0?void 0:`${(e.frequencyMHz/1e3).toFixed(1)} GHz`}),r!==`darwin`&&(0,U.jsx)(K,{label:`Driver`,value:t?.driver}),(0,U.jsx)(K,{label:`Hardware address`,value:t?.mac}),(0,U.jsx)(K,{label:`IPv4`,value:t?.ipv4.join(`, `),title:t?.ipv4.join(`
1
+ import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{I as r,L as i,Ln as a,Xt as o,ai as s,dn as c,dt as l,t as u}from"./icons-C1wDt09O.js";import{r as d}from"./api-client-BnYFnEfK.js";import{_ as f,b as p,g as m,h,t as g,v as _,x as v,y}from"./settings-store-CMpVMq3Y.js";import{n as b}from"./utils-D3xTlJyU.js";import"./portal-container-context-Gepuvxdg.js";import"./context-menu-DhKbkI1X.js";import{n as x}from"./use-is-mobile-CL2I7hLf.js";import"./mobile-bottom-sheet-M9pZptfh.js";import"./use-visual-viewport-B_GFo6k2.js";import{a as S,c as C,i as w,l as T,n as E,o as ee,r as te,s as D,t as ne,u as re}from"./adaptive-context-menu-CxHkI7dL.js";import{n as O,r as k,t as A}from"./format-bytes-Xp9emfaR.js";import{n as j,t as M}from"./metric-chart-canvas-HG8rPTMq.js";var N=e(t(),1),P={wired:`Ethernet`,wireless:`Wi-Fi`,bluetooth:`Bluetooth`,bridge:`Bridge`,docker:`Docker`,infiniband:`InfiniBand`,multipass:`Multipass`,virtual:`Virtual`,vpn:`VPN`,other:`Other`},F=1024,I=e=>Math.round(e);function L(e){return P[e?.kind??`other`]}function R(e,t,n){if(!n||n<=0)return null;let r=(e+t)*8/1e6;return Math.min(100,Math.max(0,r/n*100))}function z(e,t){return`${(e/F).toFixed(1)}/${(t/F).toFixed(1)} GB`}function B(e,t){let n=new Map((t?.disks??[]).map(e=>[e.id,e])),r=new Map((t?.nics??[]).map(e=>[e.id,e])),i=[{key:`cpu`,kind:`cpu`,label:`CPU`,sublabel:e.cpu.model,id:null,detail:`${I(e.cpu.total)}%`,percent:e.cpu.total},{key:`memory`,kind:`memory`,label:`Memory`,sublabel:z(e.mem.usedMB,e.mem.totalMB),id:null,detail:`${I(e.mem.percent)}%`,percent:e.mem.percent}];(e.disks??[]).forEach((e,t)=>{i.push({key:`disk:${e.id}`,kind:`disk`,label:`Disk ${t}`,sublabel:n.get(e.id)?.model??e.id,id:e.id,detail:e.available?`${I(e.busyPercent)}%`:`—`,percent:e.available?e.busyPercent:null})}),(e.nics??[]).forEach(e=>{let t=r.get(e.id);i.push({key:`nic:${e.id}`,kind:`nic`,label:L(t),sublabel:e.id,id:e.id,detail:e.available?A(e.rxBps+e.txBps):`—`,percent:e.available?R(e.rxBps,e.txBps,e.linkMbps):null})}),e.gpus.forEach((e,t)=>{i.push({key:`gpu:${e.id??t}`,kind:`gpu`,label:`GPU ${t}`,sublabel:e.name,id:e.id??null,detail:`${I(e.utilPercent)}%`,percent:e.utilPercent})});let a=e.fans??[];if(a.length>0){let e=Math.max(...a.map(e=>e.rpm));i.push({key:`fans`,kind:`fans`,label:`Fans`,sublabel:`${a.length} sensor${a.length===1?``:`s`}`,id:null,detail:`${e} RPM`,percent:null})}return i}function V(e,t){return t&&e.some(e=>e.key===t)?t:e[0]?.key??`cpu`}var H=3e4;function ie(e){let[t,n]=(0,N.useState)(null),r=(0,N.useRef)(!1),i=(0,N.useRef)(``),a=(0,N.useCallback)(async()=>{if(!r.current){r.current=!0;try{n(await d.get(`/api/system/hardware`))}catch{}finally{r.current=!1}}},[]);return(0,N.useEffect)(()=>{a()},[a]),(0,N.useEffect)(()=>{if(!t)return;let n=new Set([...t.disks.map(e=>e.id),...t.nics.map(e=>e.id),...t.gpus.map(e=>e.id)]),r=e.split(`,`).filter(e=>e&&!n.has(e)).join(`,`);if(!r){i.current=``;return}if(r!==i.current){i.current=r,a();return}let o=setTimeout(()=>void a(),H);return()=>clearTimeout(o)},[t,e,a]),t}var U=n();function W({title:e,subtitle:t,value:n,valueClassName:r}){return(0,U.jsxs)(`div`,{className:`flex items-baseline justify-between gap-3`,children:[(0,U.jsxs)(`div`,{className:`min-w-0`,children:[(0,U.jsx)(`h3`,{className:`text-base font-semibold truncate`,children:e}),t&&(0,U.jsx)(`p`,{className:`text-xs text-text-subtle truncate`,title:t,children:t})]}),n!==void 0&&(0,U.jsx)(`span`,{className:b(`text-2xl font-semibold tabular-nums shrink-0`,r),children:n})]})}function G({children:e}){return(0,U.jsx)(`dl`,{className:`grid grid-cols-2 @2xl:grid-cols-4 gap-x-4 gap-y-3`,children:e})}function K({label:e,value:t,title:n}){let r=t==null||t===``?`—`:String(t);return(0,U.jsxs)(`div`,{className:`min-w-0`,children:[(0,U.jsx)(`dt`,{className:`text-[11px] text-text-subtle truncate`,children:e}),(0,U.jsx)(`dd`,{className:`text-sm tabular-nums truncate`,title:n??r,children:r})]})}function q({series:e,maxValue:t,height:n=120,legend:r,caption:i,ceiling:a,grid:o,stacked:s}){return(0,U.jsxs)(`div`,{className:`space-y-1`,children:[(i||a)&&(0,U.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2 text-[11px] text-text-subtle`,children:[(0,U.jsx)(`span`,{className:`truncate`,children:i}),(0,U.jsx)(`span`,{className:`shrink-0 tabular-nums`,children:a})]}),(0,U.jsx)(M,{series:e,height:n,maxValue:t,grid:o,stacked:s}),r&&r.length>0&&(0,U.jsx)(`div`,{className:`flex flex-wrap gap-x-4 gap-y-1`,children:r.map((t,n)=>(0,U.jsxs)(`span`,{className:`flex items-center gap-1.5 text-[11px] text-text-subtle`,children:[(0,U.jsx)(`span`,{className:`size-2 rounded-full`,style:{background:e[n]?.color}}),t]},t))})]})}function J(e,t,n=200){return(0,N.useMemo)(()=>e.slice(-n).map(e=>t(e)??0),[e,n])}function ae({segments:e}){let t=e.reduce((e,t)=>e+Math.max(0,t.value),0);return t<=0?null:(0,U.jsx)(`div`,{className:`flex h-3 w-full overflow-hidden rounded-sm bg-surface-hover`,role:`img`,"aria-label":e.map(e=>e.label).join(`, `),children:e.map(e=>(0,U.jsx)(`div`,{className:`h-full`,style:{width:`${Math.max(0,e.value)/t*100}%`,background:e.color},title:e.label},e.label))})}var Y={primary:`var(--color-primary)`,secondary:`var(--color-warning)`,success:`var(--color-success)`,error:`var(--color-error)`};function oe({cores:e,history:t,points:n=200,height:r=260}){let i=(0,N.useRef)(null),a=j(i),{cols:o,rows:s}=y(e.length,a),c=(0,N.useMemo)(()=>{let r=t.slice(-n),i=Array.from({length:e.length},()=>[]);for(let e of r){let t=e.system.cpu.cores;for(let e=0;e<i.length;e++)i[e].push(t[e]??0)}return i},[t,n,e.length]);if(e.length===0)return null;let l=Math.max(28,Math.floor(r/Math.max(1,s))-6);return(0,U.jsx)(`div`,{ref:i,className:`grid gap-1.5`,style:{gridTemplateColumns:`repeat(${Math.max(1,o)}, minmax(0, 1fr))`},"data-testid":`sysmon-core-grid`,"data-core-count":e.length,"data-cols":o,children:c.map((t,n)=>(0,U.jsx)(`div`,{className:`rounded-sm border border-border/70 overflow-hidden px-0.5`,title:`CPU ${n}: ${(e[n]??0).toFixed(0)}%`,children:(0,U.jsx)(M,{series:[{data:t,color:Y.primary}],height:l,maxValue:100})},n))})}function se(e){if(e===void 0)return;let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}d ${n}h ${r}m`:`${n}h ${r}m`}var X=e=>e===void 0?void 0:`${(e/1e3).toFixed(2)} GHz`;function ce(e){if(e===void 0)return;let{physicalCores:t,performanceCores:n,efficiencyCores:r}=e;return n!==void 0&&r!==void 0?`${t} (${n}P + ${r}E)`:String(t)}function le({cpu:e,info:t,history:n,processCount:r,platform:i}){let a=g(e=>e.sysmonTempUnit),o=g(e=>e.sysmonKernelTimes),s=g(e=>e.setSysmonKernelTimes),c=g(e=>e.sysmonCpuGraph),l=g(e=>e.setSysmonCpuGraph),u=g(e=>e.sysmonCpuBottomGraph),d=g(e=>e.setSysmonCpuBottomGraph),y=J(n,e=>e.system.cpu.total),b=J(n,e=>e.system.cpu.kernelPercent),x=J(n,e=>e.system.cpu.tempC),k=J(n,e=>e.system.cpu.powerW),A=J(n,e=>e.system.cpu.currentMHz),j=o&&e.kernelPercent!==void 0,M=p(n.map(e=>e.ts)),P=e=>M?`${e} ${M}`:e,F=i===`darwin`,I=e=>!F||e!==void 0,L=(0,N.useMemo)(()=>{let t=n.slice(-200),r=e.cores.length,i=Array.from({length:r},()=>[]);for(let e of t){let t=e.system.cpu.cores;for(let e=0;e<r;e++)i[e].push(t[e]??0)}return i},[n,e.cores.length]),R=L.map(e=>({data:e,color:Y.primary})),z=L.map(e=>({data:e.map(e=>e/Math.max(1,L.length)),color:Y.primary})),B=()=>u===`none`?null:u===`temperature`?e.tempC===void 0?null:(0,U.jsx)(q,{grid:!0,height:100,caption:P(`Temperature`),ceiling:v(Math.max(...x,1),a),series:[{data:x,color:Y.error}]}):u===`power`?e.powerW===void 0?null:(0,U.jsx)(q,{grid:!0,height:100,caption:P(`Power draw`),ceiling:`${Math.max(...k,1).toFixed(1)} W`,series:[{data:k,color:Y.secondary}]}):e.currentMHz===void 0?null:(0,U.jsx)(q,{grid:!0,height:100,caption:P(`Clock speed`),ceiling:X(t?.maxMHz??Math.max(...A,1)),maxValue:t?.maxMHz,series:[{data:A,color:Y.success}]});return(0,U.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-detail-cpu`,children:[(0,U.jsx)(W,{title:`CPU`,subtitle:t?.name??e.model,value:`${e.total.toFixed(1)}%`}),(0,U.jsxs)(ne,{children:[(0,U.jsx)(re,{children:(0,U.jsxs)(`div`,{className:`space-y-3 select-none`,"data-testid":`sysmon-cpu-graphs`,children:[c===`logical`?(0,U.jsxs)(`div`,{className:`space-y-1`,children:[(0,U.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2 text-[11px] text-text-subtle`,children:[(0,U.jsx)(`span`,{className:`truncate`,children:P(`Utilisation`)}),(0,U.jsx)(`span`,{className:`shrink-0 tabular-nums`,children:`100%`})]}),(0,U.jsx)(oe,{cores:e.cores,history:n})]}):(0,U.jsx)(q,{grid:!0,maxValue:100,caption:P(`Utilisation`),ceiling:`100%`,stacked:c===`threads-stacked`,legend:c===`overall`&&j?[`Utilisation`,`Kernel`]:void 0,series:c===`threads`?R:c===`threads-stacked`?z:j?[{data:y,color:Y.primary},{data:b,color:Y.secondary}]:[{data:y,color:Y.primary}]}),B()]})}),(0,U.jsxs)(E,{children:[(0,U.jsxs)(D,{children:[(0,U.jsx)(T,{children:`Change top graph to`}),(0,U.jsx)(C,{children:(0,U.jsx)(w,{value:c,onValueChange:e=>l(e),children:_.map(e=>(0,U.jsx)(S,{value:e,"data-testid":`sysmon-cpu-graph-${e}`,children:f[e]},e))})})]}),(0,U.jsxs)(D,{children:[(0,U.jsx)(T,{children:`Change bottom graph to`}),(0,U.jsx)(C,{children:(0,U.jsx)(w,{value:u,onValueChange:e=>d(e),children:h.map(e=>(0,U.jsx)(S,{value:e,"data-testid":`sysmon-cpu-bottom-${e}`,children:m[e]},e))})})]}),(0,U.jsx)(ee,{}),(0,U.jsx)(te,{onSelect:()=>s(!o),"data-testid":`sysmon-cpu-kernel-toggle`,children:o?`Hide kernel times`:`Show kernel times`})]})]}),(0,U.jsxs)(G,{children:[(0,U.jsx)(K,{label:`Speed`,value:X(e.currentMHz)}),I(t?.baseMHz)&&(0,U.jsx)(K,{label:`Base speed`,value:X(t?.baseMHz)}),(0,U.jsx)(K,{label:`Max speed`,value:X(t?.maxMHz)}),(0,U.jsx)(K,{label:`Temperature`,value:v(e.tempC,a)}),(0,U.jsx)(K,{label:`Power`,value:e.powerW===void 0?void 0:`${e.powerW.toFixed(1)} W`}),(0,U.jsx)(K,{label:`Processes`,value:r}),(0,U.jsx)(K,{label:`Threads running`,value:e.threadCount}),(0,U.jsx)(K,{label:`Open handles`,value:e.handleCount}),(0,U.jsx)(K,{label:`Up time`,value:se(e.uptimeSec)}),(0,U.jsx)(K,{label:`Sockets`,value:t?.sockets}),(0,U.jsx)(K,{label:`Cores`,value:ce(t)}),(0,U.jsx)(K,{label:`Logical processors`,value:t?.logicalCores??e.cores.length}),(0,U.jsx)(K,{label:`Virtualisation`,value:t?.isVirtualMachine?`Running in a VM`:t?.virtualization}),(0,U.jsx)(K,{label:`L1 cache`,value:t?.l1CacheBytes===void 0?void 0:O(t.l1CacheBytes)}),(0,U.jsx)(K,{label:`L2 cache`,value:t?.l2CacheBytes===void 0?void 0:O(t.l2CacheBytes)}),I(t?.l3CacheBytes)&&(0,U.jsx)(K,{label:`L3 cache`,value:t?.l3CacheBytes===void 0?void 0:O(t.l3CacheBytes)}),!F&&(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(K,{label:`Cpufreq driver`,value:t?.freqDriver}),(0,U.jsx)(K,{label:`Governor`,value:t?.freqGovernor}),(0,U.jsx)(K,{label:`Power preference`,value:t?.powerPreference})]})]})]})}function ue({mem:e,info:t,history:n,platform:r}){let i=r===`darwin`,a=J(n,e=>e.system.mem.percent),o=J(n,e=>{let t=e.system.mem.swapTotalMB??0;return t>0?(e.system.mem.swapUsedMB??0)/t*100:0}),s=e.inUseBytes!==void 0,c=[{label:`In use`,value:e.inUseBytes,color:`var(--color-primary)`},{label:`Modified`,value:e.modifiedBytes,color:`var(--color-warning)`},{label:i?`Cached`:`Standby`,value:e.standbyBytes,color:`var(--color-success)`},{label:`Free`,value:e.freeBytes,color:`var(--color-border)`}].filter(e=>e.value!==void 0),l=p(n.map(e=>e.ts)),u=e=>l?`${e} ${l}`:e,d=(e.swapTotalMB??0)>0;return(0,U.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-detail-memory`,children:[(0,U.jsx)(W,{title:`Memory`,subtitle:`${k(e.usedMB)} of ${k(e.totalMB)} in use`,value:`${e.percent.toFixed(1)}%`}),(0,U.jsx)(q,{grid:!0,maxValue:100,caption:u(`Memory usage`),ceiling:k(e.totalMB),series:[{data:a,color:Y.primary}]}),d&&(0,U.jsx)(q,{grid:!0,height:90,maxValue:100,caption:u(`Swap usage`),ceiling:k(e.swapTotalMB??0),series:[{data:o,color:Y.success}]}),s&&(0,U.jsxs)(`div`,{className:`space-y-2`,children:[(0,U.jsx)(ae,{segments:c}),(0,U.jsx)(`div`,{className:`flex flex-wrap gap-x-4 gap-y-1 text-[11px] text-text-subtle`,children:c.map(e=>(0,U.jsxs)(`span`,{children:[e.label,` `,O(e.value)]},e.label))})]}),(0,U.jsxs)(G,{children:[(0,U.jsx)(K,{label:`Available`,value:k(e.availableMB)}),(0,U.jsx)(K,{label:`Cached`,value:e.cachedMB===void 0?void 0:k(e.cachedMB)}),!i&&(0,U.jsx)(K,{label:`Committed`,value:e.committedMB===void 0?void 0:`${k(e.committedMB)} / ${e.commitLimitMB===void 0?`?`:k(e.commitLimitMB)}`}),(0,U.jsx)(K,{label:`Swap`,value:e.swapTotalMB===void 0?void 0:`${k(e.swapUsedMB??0)} / ${k(e.swapTotalMB)}`}),(0,U.jsx)(K,{label:i?`Compressed`:`Compressed (zram)`,value:e.zramCompressedMB===void 0?void 0:k(e.zramCompressedMB)}),(0,U.jsx)(K,{label:i?`Compression savings`:`Savings (zram)`,value:e.zramSavingsMB===void 0?void 0:k(e.zramSavingsMB)}),!t?.unified&&(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(K,{label:`Slots used`,value:t===void 0?void 0:`${t.devices.length}${t.slotsTotal?` of ${t.slotsTotal}`:``}`}),(0,U.jsx)(K,{label:`Maximum capacity`,value:t?.maxCapacityBytes===void 0?void 0:O(t.maxCapacityBytes)})]})]}),t&&t.devices.length>0&&(0,U.jsxs)(`div`,{className:`space-y-1`,children:[!t.unified&&(0,U.jsx)(`h4`,{className:`text-xs font-medium text-text-secondary`,children:`Slots`}),(0,U.jsx)(`div`,{className:`rounded-md border border-border divide-y divide-border`,children:t.devices.map(e=>(0,U.jsxs)(`div`,{className:`flex items-center justify-between gap-3 px-3 py-2 text-xs`,children:[(0,U.jsx)(`span`,{className:`font-medium shrink-0`,children:e.locator}),(0,U.jsx)(`span`,{className:`text-text-subtle truncate`,children:[e.manufacturer,e.ramType,e.formFactor,e.speedMts?`${e.speedMts} MT/s`:null].filter(Boolean).join(` · `)}),(0,U.jsx)(`span`,{className:`tabular-nums shrink-0`,children:O(e.sizeBytes)})]},e.locator))})]})]})}var de=90,fe=75;function pe(e){return e>=de?`bg-error`:e>=fe?`bg-warning`:`bg-primary`}function me({partitions:e}){return e.length===0?null:(0,U.jsxs)(`section`,{className:`space-y-2`,"data-testid":`sysmon-partitions`,children:[(0,U.jsx)(`h4`,{className:`text-sm font-medium`,children:`Partitions`}),(0,U.jsx)(`ul`,{className:`space-y-2`,children:e.map(e=>(0,U.jsx)(he,{part:e},e.id))})]})}function he({part:e}){let t=e.mounts.find(e=>e.usedBytes!==void 0&&e.totalBytes),n=t?Math.min(100,t.usedBytes/t.totalBytes*100):void 0;return(0,U.jsxs)(`li`,{className:`rounded-md border border-border px-3 py-2 space-y-1.5`,"data-testid":`sysmon-partition`,children:[(0,U.jsxs)(`div`,{className:`flex items-baseline justify-between gap-3`,children:[(0,U.jsx)(`span`,{className:`text-sm font-medium truncate`,title:e.devicePath,children:e.devicePath}),(0,U.jsxs)(`span`,{className:`text-[11px] text-text-subtle shrink-0 tabular-nums`,children:[e.filesystem??`—`,` · `,O(e.sizeBytes)]})]}),e.mounts.length===0?(0,U.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Not mounted`}):(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`p`,{className:`text-[11px] text-text-subtle truncate`,title:e.mounts.map(e=>e.mountPoint).join(`, `),children:e.mounts.map(e=>e.mountPoint).join(`, `)}),n===void 0?(0,U.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Usage unavailable`}):(0,U.jsxs)(`div`,{className:`space-y-1`,children:[(0,U.jsx)(`div`,{className:`h-1.5 w-full rounded-full bg-surface-hover overflow-hidden`,children:(0,U.jsx)(`div`,{className:b(`h-full rounded-full`,pe(n)),style:{width:`${n}%`}})}),(0,U.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2 text-[11px] text-text-subtle tabular-nums`,children:[(0,U.jsxs)(`span`,{children:[O(t.usedBytes),` of `,O(t.totalBytes)]}),(0,U.jsxs)(`span`,{children:[n.toFixed(0),`%`]})]})]})]})]})}var ge={hdd:`Hard disk`,ssd:`SSD`,nvme:`NVMe`,emmc:`eMMC`,sd:`SD card`,optical:`Optical`,thumb:`Removable`,unknown:`Unknown`};function _e({disk:e,info:t,index:n,history:r}){let i=g(e=>e.sysmonTempUnit),a=t=>t.system.disks?.find(t=>t.id===e.id),o=J(r,e=>a(e)?.busyPercent),s=J(r,e=>a(e)?.readBps),c=J(r,e=>a(e)?.writeBps);return(0,U.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-detail-disk`,"data-disk-id":e.id,children:[(0,U.jsx)(W,{title:`Disk ${n}`,subtitle:t?.model??e.id,value:e.available?`${e.busyPercent.toFixed(0)}%`:`—`}),(0,U.jsxs)(`div`,{className:`space-y-1`,children:[(0,U.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Active time`}),(0,U.jsx)(q,{maxValue:100,series:[{data:o,color:Y.primary}],height:90})]}),(0,U.jsxs)(`div`,{className:`space-y-1`,children:[(0,U.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Transfer rate`}),(0,U.jsx)(q,{height:90,legend:[`Read`,`Write`],series:[{data:s,color:Y.success},{data:c,color:Y.secondary}]})]}),(0,U.jsxs)(G,{children:[(0,U.jsx)(K,{label:`Read speed`,value:e.available?A(e.readBps):void 0}),(0,U.jsx)(K,{label:`Write speed`,value:e.available?A(e.writeBps):void 0}),(0,U.jsx)(K,{label:`Avg. response time`,value:e.available?`${e.responseMs.toFixed(2)} ms`:void 0}),(0,U.jsx)(K,{label:`Temperature`,value:v(e.tempC,i)}),(0,U.jsx)(K,{label:`Total read`,value:O(e.readTotal)}),(0,U.jsx)(K,{label:`Total written`,value:O(e.writeTotal)}),(0,U.jsx)(K,{label:`Capacity`,value:t===void 0?void 0:O(t.capacityBytes)}),(0,U.jsx)(K,{label:`Type`,value:t===void 0?void 0:ge[t.kind]??t.kind}),(0,U.jsx)(K,{label:`System disk`,value:t===void 0?void 0:t.systemDisk?`Yes`:`No`}),(0,U.jsx)(K,{label:`Removable`,value:t===void 0?void 0:t.removable?`Yes`:`No`}),(0,U.jsx)(K,{label:`Rotation`,value:t?.rotationRpm===void 0?void 0:`${t.rotationRpm} RPM`}),(0,U.jsx)(K,{label:`Serial`,value:t?.serial})]}),(0,U.jsx)(me,{partitions:t?.partitions??[]})]})}var ve={connected:`Connected`,connecting:`Connecting`,disconnected:`Disconnected`,unavailable:`Unavailable`,unknown:`Unknown`};function ye({nic:e,info:t,history:n,platform:r}){let i=t=>t.system.nics?.find(t=>t.id===e.id),a=J(n,e=>i(e)?.rxBps),o=J(n,e=>i(e)?.txBps);return(0,U.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-detail-nic`,"data-nic-id":e.id,children:[(0,U.jsx)(W,{title:P[t?.kind??`other`],subtitle:[e.id,t?.deviceName].filter(Boolean).join(` · `),value:e.available?A(e.rxBps+e.txBps):`—`}),(0,U.jsx)(q,{legend:[`Receive`,`Send`],series:[{data:a,color:Y.primary},{data:o,color:Y.secondary}]}),(0,U.jsxs)(G,{children:[(0,U.jsx)(K,{label:`State`,value:ve[e.state]}),(0,U.jsx)(K,{label:`Receive`,value:e.available?A(e.rxBps):void 0}),(0,U.jsx)(K,{label:`Send`,value:e.available?A(e.txBps):void 0}),(0,U.jsx)(K,{label:`Maximum bitrate`,value:e.linkMbps===void 0?void 0:`${e.linkMbps} Mbps`}),(0,U.jsx)(K,{label:`Total received`,value:O(e.rxTotal)}),(0,U.jsx)(K,{label:`Total sent`,value:O(e.txTotal)}),(0,U.jsx)(K,{label:`Network name`,value:e.ssid}),(0,U.jsx)(K,{label:`Signal`,value:e.signalPercent===void 0?void 0:`${e.signalPercent}%`}),(0,U.jsx)(K,{label:`Frequency`,value:e.frequencyMHz===void 0?void 0:`${(e.frequencyMHz/1e3).toFixed(1)} GHz`}),r!==`darwin`&&(0,U.jsx)(K,{label:`Driver`,value:t?.driver}),(0,U.jsx)(K,{label:`Hardware address`,value:t?.mac}),(0,U.jsx)(K,{label:`IPv4`,value:t?.ipv4.join(`, `),title:t?.ipv4.join(`
2
2
  `)}),(0,U.jsx)(K,{label:`IPv6`,value:t?.ipv6.join(`, `),title:t?.ipv6.join(`
3
3
  `)})]})]})}function Z(e,t){if(!(e===void 0&&t===void 0))return`${e===void 0?`?`:`Gen ${e}`} x${t??`?`}`}function be({gpu:e,info:t,index:n,history:r,platform:i}){let a=g(e=>e.sysmonTempUnit),o=i===`darwin`,s=t=>t.system.gpus.find(t=>e.id?t.id===e.id:t.name===e.name),c=J(r,e=>s(e)?.utilPercent),l=J(r,e=>s(e)?.encodePercent),u=J(r,e=>s(e)?.decodePercent),d=e.vramTotalMB>0,f=!d&&e.sharedTotalMB!==void 0,m=J(r,e=>{let t=s(e);return d?t?.vramUsedMB:t?.sharedUsedMB}),h=d?e.vramTotalMB:e.sharedTotalMB??0,_=e.encodePercent!==void 0||e.decodePercent!==void 0,y=t?.encodeDecodeShared===!0,b=p(r.map(e=>e.ts)),x=e=>b?`${e} ${b}`:e;return(0,U.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-detail-gpu`,"data-gpu-id":e.id??n,children:[(0,U.jsx)(W,{title:`GPU ${n}`,subtitle:e.name,value:`${e.utilPercent.toFixed(0)}%`}),(0,U.jsx)(q,{grid:!0,maxValue:100,caption:x(`Utilisation`),ceiling:`100%`,series:[{data:c,color:Y.primary}]}),_&&(0,U.jsx)(q,{grid:!0,height:90,maxValue:100,caption:x(y?`Video encode/decode utilisation`:`Video encode and decode utilisation`),ceiling:`100%`,legend:y?void 0:[`Encode`,`Decode`],series:y?[{data:l,color:Y.secondary}]:[{data:l,color:Y.secondary},{data:u,color:Y.error}]}),(d||f)&&(0,U.jsx)(q,{grid:!0,height:90,maxValue:h,caption:x(d?`Video memory usage`:`Memory usage`),ceiling:k(h),series:[{data:m,color:Y.success}]}),(0,U.jsxs)(G,{children:[(!o||d)&&(0,U.jsx)(K,{label:`Video memory`,value:d?`${k(e.vramUsedMB)} / ${k(e.vramTotalMB)}`:void 0}),(0,U.jsx)(K,{label:d?`Shared memory`:`Memory usage`,value:e.sharedTotalMB===void 0?void 0:`${k(e.sharedUsedMB??0)} / ${k(e.sharedTotalMB)}`}),!o&&(0,U.jsx)(K,{label:y?`Video encode/decode`:`Video encode`,value:e.encodePercent===void 0?void 0:`${e.encodePercent.toFixed(0)}%`}),!o&&!y&&(0,U.jsx)(K,{label:`Video decode`,value:e.decodePercent===void 0?void 0:`${e.decodePercent.toFixed(0)}%`}),(0,U.jsx)(K,{label:`Clock`,value:e.clockMHz===void 0?void 0:`${e.clockMHz} MHz${e.clockMaxMHz?` / ${e.clockMaxMHz}`:``}`}),!o&&(0,U.jsx)(K,{label:`Memory clock`,value:e.memClockMHz===void 0?void 0:`${e.memClockMHz} MHz${e.memClockMaxMHz?` / ${e.memClockMaxMHz}`:``}`}),(0,U.jsx)(K,{label:`Power`,value:e.powerW===void 0?void 0:`${e.powerW.toFixed(1)} W${e.powerMaxW?` / ${e.powerMaxW}`:``}`}),(0,U.jsx)(K,{label:`Temperature`,value:v(e.tempC,a)}),o&&(0,U.jsx)(K,{label:`GPU cores`,value:t?.coreCount?.toString()}),(0,U.jsx)(K,{label:`Vendor`,value:t?.vendor}),(0,U.jsx)(K,{label:`Driver`,value:t?.driver===void 0?void 0:[t.driver,t.driverVersion].filter(Boolean).join(` `)}),o&&(0,U.jsx)(K,{label:`Metal`,value:t?.metalVersion}),!o&&(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(K,{label:`OpenGL`,value:t?.openglVersion}),(0,U.jsx)(K,{label:`Vulkan`,value:t?.vulkanVersion}),(0,U.jsx)(K,{label:`PCI bus address`,value:e.id}),(0,U.jsx)(K,{label:`PCIe link`,value:Z(t?.pcieGen,t?.pcieLanes)}),(0,U.jsx)(K,{label:`PCIe maximum`,value:Z(t?.pcieMaxGen,t?.pcieMaxLanes)})]})]})]})}var Q=e=>e===void 0?void 0:`${e} RPM`;function xe({fans:e,platform:t}){let n=g(e=>e.sysmonTempUnit),r=t===`darwin`,i=e.length>0?Math.max(...e.map(e=>e.rpm)):0;return(0,U.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-detail-fans`,"data-fan-count":e.length,children:[(0,U.jsx)(W,{title:`Fans`,subtitle:`${e.length} sensor${e.length===1?``:`s`}`,value:`${i} RPM`}),(0,U.jsx)(`div`,{className:`rounded-md border border-border divide-y divide-border`,children:e.map(e=>(0,U.jsxs)(`div`,{className:`px-3 py-2 space-y-2`,"data-testid":`sysmon-fan-row`,children:[(0,U.jsxs)(`div`,{className:`flex items-baseline justify-between gap-3`,children:[(0,U.jsx)(`span`,{className:`text-sm font-medium truncate`,title:e.id,children:e.label}),(0,U.jsxs)(`span`,{className:`text-sm tabular-nums shrink-0`,children:[e.rpm,` RPM`]})]}),(0,U.jsx)(G,{children:r?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(K,{label:`Minimum`,value:Q(e.minRpm)}),(0,U.jsx)(K,{label:`Maximum`,value:Q(e.maxRpm)})]}):(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(K,{label:`Duty cycle`,value:e.pwmPercent===void 0?void 0:`${e.pwmPercent.toFixed(0)}%`}),(0,U.jsx)(K,{label:e.tempName??`Temperature`,value:v(e.tempC,n)})]})})]},e.id))})]})}var Se={cpu:l,memory:c,disk:o,nic:s,gpu:a,fans:u};function Ce(e){return e>80?`bg-error`:e>50?`bg-warning`:`bg-primary`}function we({entry:e,selected:t,showChevron:n,onSelect:r}){let a=Se[e.kind];return(0,U.jsxs)(`button`,{type:`button`,onClick:()=>r(e.key),"aria-current":t,"data-testid":`sysmon-device-row`,"data-device-key":e.key,className:b(`w-full min-h-11 px-3 py-2 flex items-center gap-3 text-left transition-colors`,t?`bg-primary/10 text-text-primary`:`hover:bg-surface-hover`),children:[(0,U.jsx)(a,{className:`size-4 shrink-0 text-text-subtle`}),(0,U.jsxs)(`span`,{className:`flex-1 min-w-0`,children:[(0,U.jsx)(`span`,{className:`block text-sm truncate`,children:e.label}),(0,U.jsx)(`span`,{className:`block text-[11px] text-text-subtle truncate`,title:e.sublabel,children:e.sublabel}),e.percent!==null&&(0,U.jsx)(`span`,{className:`mt-1 block h-1 w-full rounded-full bg-surface-hover overflow-hidden`,children:(0,U.jsx)(`span`,{className:b(`block h-full transition-[width]`,Ce(e.percent)),style:{width:`${Math.max(1,Math.min(100,e.percent))}%`}})})]}),(0,U.jsx)(`span`,{className:`text-xs tabular-nums text-text-secondary shrink-0`,children:e.detail}),n&&(0,U.jsx)(i,{className:`size-4 shrink-0 text-text-subtle`})]})}function $({entry:e,system:t,inventory:n,history:r,platform:i}){switch(e.kind){case`cpu`:return(0,U.jsx)(le,{cpu:t.cpu,info:n?.cpu,history:r,processCount:t.processCount,platform:i});case`memory`:return(0,U.jsx)(ue,{mem:t.mem,info:n?.memory,history:r,platform:i});case`disk`:{let i=(t.disks??[]).findIndex(t=>t.id===e.id),a=i>=0?t.disks?.[i]:void 0;return a?(0,U.jsx)(_e,{disk:a,index:i,info:n?.disks.find(e=>e.id===a.id),history:r}):null}case`nic`:{let a=(t.nics??[]).find(t=>t.id===e.id);return a?(0,U.jsx)(ye,{nic:a,info:n?.nics.find(e=>e.id===a.id),history:r,platform:i}):null}case`gpu`:{let a=t.gpus.findIndex(t=>e.id?t.id===e.id:!0),o=a>=0?t.gpus[a]:void 0;return o?(0,U.jsx)(be,{gpu:o,index:a,info:n?.gpus.find(e=>e.id===o.id),history:r,platform:i}):null}case`fans`:return(0,U.jsx)(xe,{fans:t.fans??[],platform:i});default:return null}}function Te({system:e,history:t,device:n,onDeviceChange:i,platform:a}){let o=x(),s=ie((0,N.useMemo)(()=>[...(e.disks??[]).map(e=>e.id),...(e.nics??[]).map(e=>e.id),...e.gpus.map(e=>e.id).filter(e=>!!e)].join(`,`),[e.disks,e.nics,e.gpus])),c=(0,N.useMemo)(()=>B(e,s),[e,s]),l=V(c,n),u=c.find(e=>e.key===l),d=(0,U.jsx)(`div`,{className:`divide-y divide-border`,role:`list`,"data-testid":`sysmon-device-list`,children:c.map(e=>(0,U.jsx)(we,{entry:e,selected:!o&&e.key===l,showChevron:o,onSelect:i},e.key))});return o?n===null||!u||l!==n?(0,U.jsx)(`div`,{className:`h-full overflow-y-auto`,"data-testid":`sysmon-performance`,children:d}):(0,U.jsxs)(`div`,{className:`h-full flex flex-col`,"data-testid":`sysmon-performance`,children:[(0,U.jsxs)(`button`,{type:`button`,onClick:()=>i(null),className:`shrink-0 min-h-11 px-3 flex items-center gap-2 text-sm border-b border-border`,children:[(0,U.jsx)(r,{className:`size-4`}),`Devices`]}),(0,U.jsx)(`div`,{className:`flex-1 min-h-0 overflow-y-auto p-4 @container`,children:(0,U.jsx)($,{entry:u,system:e,inventory:s,history:t,platform:a})})]}):(0,U.jsxs)(`div`,{className:`h-full flex min-h-0`,"data-testid":`sysmon-performance`,children:[(0,U.jsx)(`div`,{className:`w-56 shrink-0 border-r border-border overflow-y-auto`,children:d}),(0,U.jsx)(`div`,{className:`flex-1 min-w-0 overflow-y-auto p-4 @container`,children:u&&(0,U.jsx)($,{entry:u,system:e,inventory:s,history:t,platform:a})})]})}export{Te as PerformancePanel};
@@ -1 +1 @@
1
- import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{E as r,Kr as i,Sr as a,hr as o,qr as s,xn as c}from"./icons-C1wDt09O.js";import{k as l,r as u}from"./api-client-BnYFnEfK.js";import{t as d}from"./button-BHGVTbam.js";import{t as f}from"./input-CReAuQTF.js";import{Zn as p}from"./index-Cx9ZRibz.js";import{t as m}from"./separator-CYw7bF1W.js";import{n as h,r as g}from"./settings-rows-DgL7oTg8.js";import{i as _,n as v,r as y,t as b}from"./telegram-bot-token-field-CqVIuWP1.js";var x=e(t(),1),S=n(),C=e=>e instanceof Error?e.message:String(e);function w(e){return e.running?e.botUsername?`Answering as @${e.botUsername}`:`Running`:e.enabled?`Turned on, but not running — check the bot token`:`Off`}function T(){let[e,t]=(0,x.useState)(null),[n,r]=(0,x.useState)(null),[i,o]=(0,x.useState)(!1),f=(0,x.useCallback)(async()=>{try{let e=await u.get(`/api/settings/clawbot/telegram`);return t(e),r(null),e}catch(e){return r(C(e)),null}},[]);(0,x.useEffect)(()=>{f()},[f]);let{link:p,starting:m,connect:T,cancel:E}=_(`/api/settings/clawbot/telegram/connect`,e,f),D=async e=>{o(!0),t(t=>t&&{...t,enabled:e});try{await u.put(`/api/settings/clawbot`,{enabled:e})}catch(t){l.error(e?`Could not turn PPMBot on`:`Could not turn PPMBot off`,{description:C(t)})}finally{o(!1),await f()}},O=async e=>{try{await u.del(`/api/settings/clawbot/paired/${encodeURIComponent(e.chatId)}`),l.success(`Disconnected ${e.name}`,{description:`It can no longer use PPMBot.`})}catch(e){l.error(`Could not disconnect`,{description:C(e)})}finally{await f()}},k=e?.chats??[];return(0,S.jsxs)(`section`,{className:`space-y-3`,children:[(0,S.jsx)(h,{title:`Telegram`,children:`Chat with PPMBot through a Telegram bot of its own. A chat connected here can run tasks on this machine, so connect only your own.`}),n&&(0,S.jsx)(`p`,{className:`text-xs text-error`,children:n}),e?.configured&&(0,S.jsxs)(S.Fragment,{children:[e.sharedWithNotifications&&(0,S.jsxs)(`p`,{className:`flex gap-2 rounded-lg border border-warning/40 px-3 py-2 text-xs leading-relaxed`,children:[(0,S.jsx)(s,{className:`mt-0.5 size-3.5 shrink-0 text-warning`}),(0,S.jsx)(`span`,{children:`Notifications use this bot too, so alerts arrive in your PPMBot chats. Paste a new bot's token below to give PPMBot its own.`})]}),(0,S.jsx)(`div`,{className:`rounded-lg border border-border`,children:(0,S.jsx)(g,{label:`Turn on PPMBot`,note:w(e),checked:e.enabled,disabled:i,onChange:e=>void D(e)})}),k.length>0&&(0,S.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,S.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Chats that can use PPMBot`}),(0,S.jsx)(y,{chats:k,onDisconnect:e=>void O(e)})]}),p?(0,S.jsx)(v,{link:p,botUsername:e.botUsername,error:e.connect.error,onCancel:()=>void E()}):(0,S.jsxs)(d,{onClick:()=>void T(),disabled:m,className:`min-h-11 w-full cursor-pointer gap-2 sm:w-auto md:min-h-9`,children:[m?(0,S.jsx)(c,{className:`size-4 animate-spin`}):(0,S.jsx)(a,{className:`size-4`}),k.length===0?`Connect Telegram`:`Connect another chat`]})]}),e&&!e.configured&&(0,S.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`Create a new bot for PPMBot rather than reusing the one in Settings → Notifications, so alerts stay out of your PPMBot chats.`}),e&&(0,S.jsx)(b,{endpoint:`/api/settings/clawbot/telegram`,usernameExample:`my_ppm_assistant_bot`,configured:e.configured,botUsername:e.botUsername,onSaved:()=>void f()})]})}function E(){let[e,t]=(0,x.useState)(null),[n,a]=(0,x.useState)(!1),[s,c]=(0,x.useState)(null),[l,h]=(0,x.useState)(``),[g,_]=(0,x.useState)(!0),[v,y]=(0,x.useState)(!1),[b,C]=(0,x.useState)(2e3),[w,E]=(0,x.useState)([]),[D,O]=(0,x.useState)(`_global`),[k,A]=(0,x.useState)([]),j=(0,x.useRef)(void 0),M=(0,x.useCallback)(async(e=D)=>{try{E(await u.get(`/api/settings/clawbot/memories?project=${encodeURIComponent(e)}`))}catch{}},[D]),N=(0,x.useCallback)(async()=>{try{A(await u.get(`/api/settings/clawbot/tasks?limit=20`))}catch{}},[]),P=async e=>{try{await u.del(`/api/settings/clawbot/memories/${e}`),E(t=>t.filter(t=>t.id!==e))}catch{}};(0,x.useEffect)(()=>(u.get(`/api/settings/clawbot`).then(e=>{t(e),h(e.system_prompt),_(e.show_tool_calls),y(e.show_thinking),C(e.debounce_ms)}).catch(()=>{}),M(`_global`),N(),j.current=setInterval(N,1e4),()=>{j.current&&clearInterval(j.current)}),[M,N]);let F=async()=>{a(!0),c(null);try{let e={system_prompt:l,show_tool_calls:g,show_thinking:v,debounce_ms:b};t(await u.put(`/api/settings/clawbot`,e)),c({type:`ok`,msg:`Saved`})}catch(e){c({type:`err`,msg:e.message})}finally{a(!1)}};if(!e)return(0,S.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading...`});let I={pending:`⏳`,running:`🔄`,completed:`✅`,failed:`❌`,timeout:`⏱`},L={running:`text-primary`,completed:`text-success`,failed:`text-destructive`,timeout:`text-warning`};return(0,S.jsxs)(`div`,{className:`space-y-4`,children:[(0,S.jsx)(T,{}),(0,S.jsx)(m,{}),(0,S.jsxs)(`div`,{className:`space-y-2`,children:[(0,S.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,S.jsx)(`p`,{className:`text-xs font-medium`,children:`Delegated Tasks`}),(0,S.jsx)(d,{variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0 cursor-pointer`,onClick:N,children:(0,S.jsx)(o,{className:`size-3`})})]}),k.length===0?(0,S.jsx)(`p`,{className:`text-[10px] text-muted-foreground italic`,children:`No delegated tasks yet. The coordinator will create tasks when you ask it to work on a project.`}):(0,S.jsx)(`div`,{className:`space-y-1 max-h-[200px] overflow-y-auto`,children:k.map(e=>{let t=e.completed_at?`${Math.round((e.completed_at-e.created_at)/60)}m`:`${Math.round((Date.now()/1e3-e.created_at)/60)}m`;return(0,S.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border p-2 text-[11px]`,children:[(0,S.jsx)(`span`,{className:L[e.status]??``,children:I[e.status]??`?`}),(0,S.jsx)(`span`,{className:`font-medium shrink-0`,children:e.project_name}),(0,S.jsx)(`span`,{className:`truncate text-muted-foreground flex-1`,children:e.prompt.slice(0,60)}),(0,S.jsx)(`span`,{className:`text-[10px] text-muted-foreground shrink-0`,children:t})]},e.id)})})]}),(0,S.jsx)(m,{}),(0,S.jsxs)(`div`,{className:`space-y-2`,children:[(0,S.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,S.jsx)(r,{className:`size-3.5 text-muted-foreground`}),(0,S.jsx)(`p`,{className:`text-xs font-medium`,children:`Memory & Identity`})]}),(0,S.jsx)(d,{variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0 cursor-pointer`,onClick:()=>M(D),children:(0,S.jsx)(o,{className:`size-3`})})]}),(0,S.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Facts the bot remembers across sessions. Use /remember on Telegram to add, or delete here.`}),w.length===0?(0,S.jsx)(`p`,{className:`text-[10px] text-muted-foreground italic`,children:`No memories stored yet. Send /start on Telegram and introduce yourself.`}):(0,S.jsx)(`div`,{className:`space-y-1 max-h-[200px] overflow-y-auto`,children:w.map(e=>(0,S.jsxs)(`div`,{className:`flex items-start justify-between rounded-md border p-2 gap-1`,children:[(0,S.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,S.jsx)(`p`,{className:`text-[11px] break-words`,children:e.content}),(0,S.jsxs)(`p`,{className:`text-[10px] text-muted-foreground`,children:[e.category,` · `,e.project]})]}),(0,S.jsx)(d,{variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0 text-destructive hover:text-destructive cursor-pointer shrink-0`,onClick:()=>P(e.id),children:(0,S.jsx)(i,{className:`size-3`})})]},e.id))})]}),(0,S.jsx)(m,{}),(0,S.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,S.jsx)(`label`,{className:`text-[11px] text-muted-foreground`,children:`Custom Instructions`}),(0,S.jsx)(`textarea`,{placeholder:`Additional instructions for the coordinator (optional)...`,value:l,onChange:e=>h(e.target.value),className:`flex w-full rounded-md border border-input bg-background px-3 py-2 text-xs min-h-[60px] resize-y ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,rows:3}),(0,S.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Extra instructions added to the coordinator identity. Leave empty to use defaults from coordinator.md.`})]}),(0,S.jsxs)(`div`,{className:`space-y-2`,children:[(0,S.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,S.jsx)(`p`,{className:`text-xs`,children:`Show tool calls`}),(0,S.jsx)(p,{checked:g,onCheckedChange:_})]}),(0,S.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,S.jsx)(`p`,{className:`text-xs`,children:`Show thinking`}),(0,S.jsx)(p,{checked:v,onCheckedChange:y})]})]}),(0,S.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,S.jsx)(`label`,{className:`text-[11px] text-muted-foreground`,children:`Debounce (ms)`}),(0,S.jsx)(f,{type:`number`,min:0,max:3e4,step:500,value:b,onChange:e=>C(Number(e.target.value)),className:`h-7 text-xs w-24`}),(0,S.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Merge rapid messages within this window. 0 = no debounce.`})]}),(0,S.jsx)(d,{variant:`default`,size:`sm`,className:`h-8 text-xs w-full cursor-pointer`,disabled:n,onClick:F,children:n?`Saving...`:`Save`}),s&&(0,S.jsx)(`p`,{className:`text-[11px] ${s.type===`ok`?`text-success`:`text-destructive`}`,children:s.msg})]})}export{E as PPMBotSettingsSection};
1
+ import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{E as r,Kr as i,Sr as a,hr as o,qr as s,xn as c}from"./icons-C1wDt09O.js";import{k as l,r as u}from"./api-client-BnYFnEfK.js";import{t as d}from"./button-BHGVTbam.js";import{t as f}from"./input-CReAuQTF.js";import{Qn as p}from"./index-Vd9Xr54k.js";import{t as m}from"./separator-DUdRLaL0.js";import{n as h,r as g}from"./settings-rows-VtjChFlm.js";import{i as _,n as v,r as y,t as b}from"./telegram-bot-token-field-DSLtG8vw.js";var x=e(t(),1),S=n(),C=e=>e instanceof Error?e.message:String(e);function w(e){return e.running?e.botUsername?`Answering as @${e.botUsername}`:`Running`:e.enabled?`Turned on, but not running — check the bot token`:`Off`}function T(){let[e,t]=(0,x.useState)(null),[n,r]=(0,x.useState)(null),[i,o]=(0,x.useState)(!1),f=(0,x.useCallback)(async()=>{try{let e=await u.get(`/api/settings/clawbot/telegram`);return t(e),r(null),e}catch(e){return r(C(e)),null}},[]);(0,x.useEffect)(()=>{f()},[f]);let{link:p,starting:m,connect:T,cancel:E}=_(`/api/settings/clawbot/telegram/connect`,e,f),D=async e=>{o(!0),t(t=>t&&{...t,enabled:e});try{await u.put(`/api/settings/clawbot`,{enabled:e})}catch(t){l.error(e?`Could not turn PPMBot on`:`Could not turn PPMBot off`,{description:C(t)})}finally{o(!1),await f()}},O=async e=>{try{await u.del(`/api/settings/clawbot/paired/${encodeURIComponent(e.chatId)}`),l.success(`Disconnected ${e.name}`,{description:`It can no longer use PPMBot.`})}catch(e){l.error(`Could not disconnect`,{description:C(e)})}finally{await f()}},k=e?.chats??[];return(0,S.jsxs)(`section`,{className:`space-y-3`,children:[(0,S.jsx)(h,{title:`Telegram`,children:`Chat with PPMBot through a Telegram bot of its own. A chat connected here can run tasks on this machine, so connect only your own.`}),n&&(0,S.jsx)(`p`,{className:`text-xs text-error`,children:n}),e?.configured&&(0,S.jsxs)(S.Fragment,{children:[e.sharedWithNotifications&&(0,S.jsxs)(`p`,{className:`flex gap-2 rounded-lg border border-warning/40 px-3 py-2 text-xs leading-relaxed`,children:[(0,S.jsx)(s,{className:`mt-0.5 size-3.5 shrink-0 text-warning`}),(0,S.jsx)(`span`,{children:`Notifications use this bot too, so alerts arrive in your PPMBot chats. Paste a new bot's token below to give PPMBot its own.`})]}),(0,S.jsx)(`div`,{className:`rounded-lg border border-border`,children:(0,S.jsx)(g,{label:`Turn on PPMBot`,note:w(e),checked:e.enabled,disabled:i,onChange:e=>void D(e)})}),k.length>0&&(0,S.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,S.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Chats that can use PPMBot`}),(0,S.jsx)(y,{chats:k,onDisconnect:e=>void O(e)})]}),p?(0,S.jsx)(v,{link:p,botUsername:e.botUsername,error:e.connect.error,onCancel:()=>void E()}):(0,S.jsxs)(d,{onClick:()=>void T(),disabled:m,className:`min-h-11 w-full cursor-pointer gap-2 sm:w-auto md:min-h-9`,children:[m?(0,S.jsx)(c,{className:`size-4 animate-spin`}):(0,S.jsx)(a,{className:`size-4`}),k.length===0?`Connect Telegram`:`Connect another chat`]})]}),e&&!e.configured&&(0,S.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`Create a new bot for PPMBot rather than reusing the one in Settings → Notifications, so alerts stay out of your PPMBot chats.`}),e&&(0,S.jsx)(b,{endpoint:`/api/settings/clawbot/telegram`,usernameExample:`my_ppm_assistant_bot`,configured:e.configured,botUsername:e.botUsername,onSaved:()=>void f()})]})}function E(){let[e,t]=(0,x.useState)(null),[n,a]=(0,x.useState)(!1),[s,c]=(0,x.useState)(null),[l,h]=(0,x.useState)(``),[g,_]=(0,x.useState)(!0),[v,y]=(0,x.useState)(!1),[b,C]=(0,x.useState)(2e3),[w,E]=(0,x.useState)([]),[D,O]=(0,x.useState)(`_global`),[k,A]=(0,x.useState)([]),j=(0,x.useRef)(void 0),M=(0,x.useCallback)(async(e=D)=>{try{E(await u.get(`/api/settings/clawbot/memories?project=${encodeURIComponent(e)}`))}catch{}},[D]),N=(0,x.useCallback)(async()=>{try{A(await u.get(`/api/settings/clawbot/tasks?limit=20`))}catch{}},[]),P=async e=>{try{await u.del(`/api/settings/clawbot/memories/${e}`),E(t=>t.filter(t=>t.id!==e))}catch{}};(0,x.useEffect)(()=>(u.get(`/api/settings/clawbot`).then(e=>{t(e),h(e.system_prompt),_(e.show_tool_calls),y(e.show_thinking),C(e.debounce_ms)}).catch(()=>{}),M(`_global`),N(),j.current=setInterval(N,1e4),()=>{j.current&&clearInterval(j.current)}),[M,N]);let F=async()=>{a(!0),c(null);try{let e={system_prompt:l,show_tool_calls:g,show_thinking:v,debounce_ms:b};t(await u.put(`/api/settings/clawbot`,e)),c({type:`ok`,msg:`Saved`})}catch(e){c({type:`err`,msg:e.message})}finally{a(!1)}};if(!e)return(0,S.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading...`});let I={pending:`⏳`,running:`🔄`,completed:`✅`,failed:`❌`,timeout:`⏱`},L={running:`text-primary`,completed:`text-success`,failed:`text-destructive`,timeout:`text-warning`};return(0,S.jsxs)(`div`,{className:`space-y-4`,children:[(0,S.jsx)(T,{}),(0,S.jsx)(m,{}),(0,S.jsxs)(`div`,{className:`space-y-2`,children:[(0,S.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,S.jsx)(`p`,{className:`text-xs font-medium`,children:`Delegated Tasks`}),(0,S.jsx)(d,{variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0 cursor-pointer`,onClick:N,children:(0,S.jsx)(o,{className:`size-3`})})]}),k.length===0?(0,S.jsx)(`p`,{className:`text-[10px] text-muted-foreground italic`,children:`No delegated tasks yet. The coordinator will create tasks when you ask it to work on a project.`}):(0,S.jsx)(`div`,{className:`space-y-1 max-h-[200px] overflow-y-auto`,children:k.map(e=>{let t=e.completed_at?`${Math.round((e.completed_at-e.created_at)/60)}m`:`${Math.round((Date.now()/1e3-e.created_at)/60)}m`;return(0,S.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border p-2 text-[11px]`,children:[(0,S.jsx)(`span`,{className:L[e.status]??``,children:I[e.status]??`?`}),(0,S.jsx)(`span`,{className:`font-medium shrink-0`,children:e.project_name}),(0,S.jsx)(`span`,{className:`truncate text-muted-foreground flex-1`,children:e.prompt.slice(0,60)}),(0,S.jsx)(`span`,{className:`text-[10px] text-muted-foreground shrink-0`,children:t})]},e.id)})})]}),(0,S.jsx)(m,{}),(0,S.jsxs)(`div`,{className:`space-y-2`,children:[(0,S.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,S.jsx)(r,{className:`size-3.5 text-muted-foreground`}),(0,S.jsx)(`p`,{className:`text-xs font-medium`,children:`Memory & Identity`})]}),(0,S.jsx)(d,{variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0 cursor-pointer`,onClick:()=>M(D),children:(0,S.jsx)(o,{className:`size-3`})})]}),(0,S.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Facts the bot remembers across sessions. Use /remember on Telegram to add, or delete here.`}),w.length===0?(0,S.jsx)(`p`,{className:`text-[10px] text-muted-foreground italic`,children:`No memories stored yet. Send /start on Telegram and introduce yourself.`}):(0,S.jsx)(`div`,{className:`space-y-1 max-h-[200px] overflow-y-auto`,children:w.map(e=>(0,S.jsxs)(`div`,{className:`flex items-start justify-between rounded-md border p-2 gap-1`,children:[(0,S.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,S.jsx)(`p`,{className:`text-[11px] break-words`,children:e.content}),(0,S.jsxs)(`p`,{className:`text-[10px] text-muted-foreground`,children:[e.category,` · `,e.project]})]}),(0,S.jsx)(d,{variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0 text-destructive hover:text-destructive cursor-pointer shrink-0`,onClick:()=>P(e.id),children:(0,S.jsx)(i,{className:`size-3`})})]},e.id))})]}),(0,S.jsx)(m,{}),(0,S.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,S.jsx)(`label`,{className:`text-[11px] text-muted-foreground`,children:`Custom Instructions`}),(0,S.jsx)(`textarea`,{placeholder:`Additional instructions for the coordinator (optional)...`,value:l,onChange:e=>h(e.target.value),className:`flex w-full rounded-md border border-input bg-background px-3 py-2 text-xs min-h-[60px] resize-y ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,rows:3}),(0,S.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Extra instructions added to the coordinator identity. Leave empty to use defaults from coordinator.md.`})]}),(0,S.jsxs)(`div`,{className:`space-y-2`,children:[(0,S.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,S.jsx)(`p`,{className:`text-xs`,children:`Show tool calls`}),(0,S.jsx)(p,{checked:g,onCheckedChange:_})]}),(0,S.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,S.jsx)(`p`,{className:`text-xs`,children:`Show thinking`}),(0,S.jsx)(p,{checked:v,onCheckedChange:y})]})]}),(0,S.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,S.jsx)(`label`,{className:`text-[11px] text-muted-foreground`,children:`Debounce (ms)`}),(0,S.jsx)(f,{type:`number`,min:0,max:3e4,step:500,value:b,onChange:e=>C(Number(e.target.value)),className:`h-7 text-xs w-24`}),(0,S.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Merge rapid messages within this window. 0 = no debounce.`})]}),(0,S.jsx)(d,{variant:`default`,size:`sm`,className:`h-8 text-xs w-full cursor-pointer`,disabled:n,onClick:F,children:n?`Saving...`:`Save`}),s&&(0,S.jsx)(`p`,{className:`text-[11px] ${s.type===`ok`?`text-success`:`text-destructive`}`,children:s.msg})]})}export{E as PPMBotSettingsSection};