@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,13 +0,0 @@
1
- import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import{$ as r,A as i,An as a,Cn as o,Cr as s,D as c,Dr as l,Ft as u,Gt as d,Hr as f,M as p,O as m,P as h,Vn as g,ai as _,br as v,c as ee,cr as y,dn as b,er as x,fr as S,gt as C,hr as te,ht as w,jn as T,jr as E,kr as D,li as O,m as k,nt as A,o as j,on as M,or as ne,qr as N,si as P,t as F,tt as I,ut as re,vt as L,w as ie,xn as ae,xr as oe}from"./icons-C1wDt09O.js";import{k as R}from"./api-client-BnYFnEfK.js";import{t as z}from"./react-B9hau9ra.js";import{t as B}from"./settings-store-CBJCnE5L.js";import{n as V}from"./utils-D3xTlJyU.js";import{r as se,t as ce}from"./panel-store-Dx2ziBLp.js";import{i as H}from"./project-store-Bs-kiU8m.js";import{r as U}from"./clipboard-D3XnL7CB.js";import{t as W}from"./button-BHGVTbam.js";import{a as G,i as K,l as le,m as ue,r as de,t as fe}from"./dropdown-menu-CxZR_vuV.js";import{t as q}from"./mobile-bottom-sheet-M9pZptfh.js";import{$i as pe,$t as J,At as me,B as he,Bt as ge,Ct as _e,Dt as ve,Et as ye,Ft as be,Gt as xe,Ht as Se,It as Ce,Jt as we,Kt as Y,Lt as Te,Mt as Ee,Nt as De,Ot as Oe,Pt as ke,Qi as Ae,Qt as je,Rt as Me,St as Ne,Tt as Pe,Ut as Fe,V as Ie,Vt as Le,Wt as Re,Xt as ze,Yt as Be,Zi as Ve,Zn as He,Zt as Ue,an as We,cn as Ge,dn as Ke,en as qe,in as Je,jt as Ye,kt as Xe,nn as Ze,on as Qe,qt as $e,rn as et,sn as tt,tn as nt,ui as rt,ut as it,wt as at,xt as ot,zt as X}from"./index-Cx9ZRibz.js";import{i as st,r as ct}from"./send-to-chat-B7oUVcgh.js";import{t as lt}from"./code-fence-BH0dNR07.js";var ut=/\b[a-z0-9]+(?:-[a-z0-9]+)+\.trycloudflare\.com\b/gi,dt=[/()\b(?:sk-[\w-]{20,}|gh[pousr]_[A-Za-z0-9]{30,}|github_pat_\w{30,}|eyJ[\w-]{8,}\.eyJ[\w-]{8,}\.[\w-]*)/g,/(\d{6,}:)[\w-]{30,}/g,/(:\/\/[^/\s:@]*:)[^@\s/\u0001]+(?=@)/g,/([?&#][\w.-]*(?:token|key|secret|passw|auth|code|state|ticket|sig|credential)[\w.-]*=)[^&#\s"'<>[\]\u0001]+/gi,/(\b(?:proxy-)?authorization["']?\s*[:=]\s*["']?)(?:(?:basic|bearer|digest|token)\s+)?[^\s"',;\u0001]+/gi,/(\b(?:set-)?cookie["']?\s*[:=]\s*["']?)(?=[^\s=;"']+=)[^\r\n"'\u0001]+/gi,/(\bbearer\s+)[^\s"',;[\]\u0001]+/gi,/((?:token|secret|passw(?:or)?d|api[_-]?key|access[_-]?key|private[_-]?key)["']?\s*[:=]\s*["']?)[^\s"'&,;)}[\]\u0001]+/gi],ft=/(?:\/home\/|\/Users\/)[^/\s"'`]+|[A-Za-z]:(?:\\{1,2}|\/)Users(?:\\{1,2}|\/)[^\\/\s"'`]+/gi,pt=/[\w.+-]+@[\w-]+(?:\.[\w-]+)+/g,mt=/\b([0-9a-f]{8})-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi;function ht(e){return e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}function gt(e,t,n=!1){let r=e=>n?`\u0001${e}\u0002`:e,i=e.replace(ut,()=>r(`<tunnel>.trycloudflare.com`));for(let e of dt)i=i.replace(e,(e,t)=>`${t}${r(`[REDACTED]`)}`);t.home&&(i=i.replace(ft,()=>r(`~`))),t.email&&(i=i.replace(pt,()=>r(`<email>`))),t.chats&&(i=i.replace(mt,(e,t)=>r(t)));let a=(t.projects??[]).filter(e=>e.trim().length>=3);if(a.length){let e=RegExp(`(?<![\\w-])(?:${a.map(ht).sort((e,t)=>t.length-e.length).join(`|`)})(?![\\w-])`,`gi`);i=i.replace(e,()=>r(`<project>`))}return i}function _t(e){return[`secrets`,e.home&&`home paths`,e.email&&`emails`,e.chats&&`chat ids`,e.projects?.length&&`project names`].filter(e=>!!e)}var vt=8192,yt=[0,5,20];function bt(e){let t=e.ctx&&e.around?ke(e.around.before.slice(-e.ctx)):[],n=e.ctx&&e.around?ke(e.around.after.slice(0,e.ctx)):[];return[...t.map(e=>({row:e,ctx:!0})),...e.rows.map(e=>({row:e,ctx:!1})),...n.map(e=>({row:e,ctx:!0}))]}function xt(e){return e.rows.reduce((e,t)=>e+t.count,0)}function St(e){let t=new Set(e.map(e=>e.src));return t.size===1?[...t][0]:`all`}var Ct=e=>new Date(e).toISOString().slice(11,19);function wt(e){let t=e.rows[0],n=e.rows[e.rows.length-1],r=t&&n?` · ${Ct(t.entry.ts)}–${Ct(n.lastTs)} UTC`:``;return`${J(e.src)}${r}`}function Tt(e){return bt(e).map(e=>nt(e.row.entry,e.row.count))}function Et({fields:e,snippets:t,environment:n,redact:r,mark:i=!1}){let a=e=>gt(e,r,i),o=[`### What happened`,a(e.what.trim())||`_Not filled in_`,``,`### Steps to reproduce`,a(e.steps.trim())||`_Not filled in_`,``];if(e.expected.trim()&&o.push(`### Expected`,a(e.expected.trim()),``),t.length){o.push(`### Log lines`);for(let e of t){let t=Tt(e).map(a),n=lt(t.join(`
2
- `)),r=xt(e);o.push(``,`<details><summary>${wt(e)} · ${X(r,`line`)}${e.ctx?` and ${e.ctx} around`:``}</summary>`,``,n,...t,n,`</details>`)}o.push(``)}return n.length&&o.push(`### Environment`,...n.map(([e,t])=>`- ${e}: ${a(t)}`),``),o.push(`<sub>Sent from PPM → Logs. Removed before sending: ${_t(r).join(`, `)}.</sub>`),o.join(`
3
- `)}function Dt(e,t,n){let r=[`title=${encodeURIComponent(e)}`];return t.length&&r.push(`labels=${encodeURIComponent(t.join(`,`))}`),n!==null&&r.push(`body=${encodeURIComponent(n)}`),`https://github.com/${Je}/issues/new?${r.join(`&`)}`}function Ot(e,t){return`# ${e.trim()||`Bug report`}\n\n${t}`}var Z=e(t(),1),kt=500,At=2e4,jt=4e3,Mt=0,Nt=null,Pt=()=>Ie(JSON.stringify({type:We}));function Ft(){return Mt++===0&&(Pt(),Nt=he(Pt)),()=>{--Mt>0||(Nt?.(),Nt=null,Ie(JSON.stringify({type:Qe})))}}function It(e,t){return JSON.stringify([e.src,e.levels,e.tagsOff,e.q,e.regex,e.caseSensitive,e.chat,t])}function Lt(e){let t={};for(let[n,r]of Object.entries(e))t[n]={...r,tags:r.tags.map(e=>[e[0],e[1]])};return t}function Rt(e,t,n,r){let i=e.meta;if(!i||!t.length)return e;let a={...i.titles,...n},o=new Set(e.entries.slice(-jt).map(e=>e.id)),s=t.filter(e=>e.ts>=i.fromTs&&!o.has(e.id));if(!s.length)return e;let c=Lt(i.stats);ze(c,s);let l=Ue(r),u=s.filter(e=>qe(e,r,l,a)),d=i.chats.map(e=>({...e}));for(let e of s){if(!e.sid)continue;let t=d.find(t=>t.sid===e.sid);t?(t.count++,t.last=e.ts):d.unshift({sid:e.sid,title:a[e.sid]??null,count:1,last:e.ts})}let f=u.length?e.entries.concat(u):e.entries,p=i.hasMore;return f.length>At&&(f=f.slice(-At),p=!0),{...e,entries:f,meta:{...i,stats:c,chats:d,titles:a,matched:i.matched+u.length,inRange:i.inRange+s.filter(e=>r.src===`all`||e.src===r.src).length,hasMore:p},batch:u.length?{seq:(e.batch?.seq??0)+1,count:u.length}:e.batch}}function zt(e,t,n){let r=It(e,t),[i,a]=(0,Z.useState)({key:r,entries:[],meta:null,loading:!0,loadingEarlier:!1,error:null,batch:null}),[o,s]=(0,Z.useState)(0),[c,l]=(0,Z.useState)(0),u=(0,Z.useRef)(e);u.current=e;let d=(0,Z.useRef)(i);d.current=i;let f=(0,Z.useRef)(n);f.current=n;let p=(0,Z.useRef)(e.q),m=(0,Z.useRef)(null),h=(0,Z.useRef)({entries:[],titles:{}});(0,Z.useEffect)(()=>Ft(),[]),(0,Z.useEffect)(()=>he(()=>s(e=>e+1)),[]),(0,Z.useEffect)(()=>{let n=new AbortController;m.current={entries:[],titles:{}},h.current={entries:[],titles:{}},l(0),a(e=>({...e,key:r,loading:!0,error:null}));let i=e.q===p.current?0:250;p.current=e.q;let o=setTimeout(()=>{ve({...e,range:t,from:Le(t,Date.now()),limit:kt},n.signal).then(t=>{if(n.signal.aborted)return;let{entries:i,...o}=t,s=m.current??{entries:[],titles:{}};m.current=null,a(Rt({key:r,entries:i,meta:o,loading:!1,loadingEarlier:!1,error:null,batch:null},s.entries,s.titles,e))}).catch(e=>{n.signal.aborted||(m.current=null,a(t=>({...t,key:r,loading:!1,error:e instanceof Error?e.message:String(e)})))})},i);return()=>{clearTimeout(o),n.abort()}},[r,o]),(0,Z.useEffect)(()=>{let e=e=>{let t=e.detail;if(t?.entries?.length){if(m.current){m.current.entries.push(...t.entries),Object.assign(m.current.titles,t.titles);return}if(f.current){h.current.entries.push(...t.entries),Object.assign(h.current.titles,t.titles);let e=u.current,n=Ue(e),r={...d.current.meta?.titles,...h.current.titles};l(i=>i+t.entries.filter(t=>qe(t,e,n,r)).length);return}a(e=>Rt(e,t.entries,t.titles??{},u.current))}};return window.addEventListener(`logs:lines`,e),()=>window.removeEventListener(`logs:lines`,e)},[]),(0,Z.useEffect)(()=>{if(n)return;let{entries:e,titles:t}=h.current;h.current={entries:[],titles:{}},l(0),e.length&&a(n=>Rt(n,e,t,u.current))},[n]);let g=(0,Z.useCallback)(async e=>{let n=d.current;if(!n.meta?.hasMore||n.loadingEarlier||n.loading||!n.entries.length)return!1;let r=n.key;a(e=>({...e,loadingEarlier:!0}));try{let i=await ve({...u.current,range:t,from:n.meta.fromTs,before:n.entries[0].id,limit:kt,...e?{reach:e}:{}}),o=d.current;if(o.key!==r||!o.meta)return a(e=>({...e,loadingEarlier:!1})),!1;let s=new Set(o.entries.slice(0,jt).map(e=>e.id)),c=i.entries.filter(e=>!s.has(e.id));return a(e=>e.key!==r||!e.meta?{...e,loadingEarlier:!1}:{...e,entries:c.concat(e.entries),meta:{...e.meta,hasMore:i.hasMore,titles:{...i.titles,...e.meta.titles},reachMissed:i.reachMissed},loadingEarlier:!1}),c.length>0}catch{return a(e=>({...e,loadingEarlier:!1})),!1}},[t]),_=(0,Z.useCallback)(()=>s(e=>e+1),[]);return(0,Z.useMemo)(()=>({...i,pausedCount:c,loadEarlier:g,reload:_}),[i,c,g,_])}function Bt(){let[e,t]=(0,Z.useState)(null),[n,r]=(0,Z.useState)(null),i=(0,Z.useCallback)(async()=>{try{t(await ye()),r(null)}catch(e){r(e instanceof Error?e.message:String(e))}},[]);return(0,Z.useEffect)(()=>{i();let e=()=>void i();return window.addEventListener(et,e),()=>window.removeEventListener(et,e)},[i]),{data:e,error:n,analyze:(0,Z.useCallback)(async e=>{t(e=>e&&{...e,running:!0,error:null}),await ot(e)},[]),setAuto:(0,Z.useCallback)(async e=>{t(t=>t&&{...t,auto:e}),await me(e),await i()},[i]),setDismissed:(0,Z.useCallback)(async(e,n)=>{t(t=>t&&{...t,issues:t.issues.map(t=>t.id===e?{...t,dismissed:n}:t)}),await Ne(e,n)},[]),undismissAll:(0,Z.useCallback)(async()=>{t(e=>e&&{...e,issues:e.issues.map(e=>({...e,dismissed:!1}))}),await Ye()},[])}}var Vt=null;function Ht(){return Vt??=Pe().then(e=>[...e,[`Browser`,it(navigator.userAgent)]]).catch(e=>{throw Vt=null,e}),Vt}var Ut=0,Wt={title:``,labels:[],what:``,steps:``,expected:``},Gt=(e,t)=>e.length===t.length&&e.every((e,n)=>e.key===t[n].key&&e.count===t[n].count),Kt=z((e,t)=>({snippets:[],fields:Wt,status:`none`,stale:!1,fresh:!1,error:null,model:null,basis:0,view:`write`,envOff:[],priv:{home:!0,email:!0,chats:!0,projects:!1},add:n=>{if(!n.length||t().snippets.some(e=>Gt(e.rows,n)))return!1;let r=n.map(e=>e.entry),i={id:`s${++Ut}`,src:St(r),rows:n,ctx:0,around:null};return e(e=>({snippets:[...e.snippets,i],stale:e.status===`done`})),!0},remove:n=>{let r=t().snippets.findIndex(e=>e.id===n);if(r<0)return null;let i=t().snippets[r];return e(e=>({snippets:e.snippets.filter(e=>e.id!==n),stale:e.status===`done`})),{snippet:i,index:r}},restore:(t,n)=>{e(e=>{let r=e.snippets.slice();return r.splice(Math.min(n,r.length),0,t),{snippets:r}})},setContext:async(n,r)=>{e(e=>({snippets:e.snippets.map(e=>e.id===n?{...e,ctx:r}:e)}));let i=t().snippets.find(e=>e.id===n);if(!r||!i||i.around)return;let a=i.rows.flatMap(e=>e.ids);try{let t=await at([a[0],a[a.length-1]],20,i.src);e(e=>({snippets:e.snippets.map(e=>e.id===n?{...e,around:t}:e)}))}catch{}},setFields:t=>e(e=>({fields:{...e.fields,...t}})),setView:t=>e({view:t}),toggleEnv:t=>e(e=>({envOff:e.envOff.includes(t)?e.envOff.filter(e=>e!==t):[...e.envOff,t]})),togglePriv:t=>e(e=>({priv:{...e.priv,[t]:!e.priv[t]}})),draft:async()=>{let{snippets:n,status:r}=t();if(!(!n.length||r===`drafting`)){e({status:`drafting`,view:`write`,error:null});try{let r=(await Ht().catch(()=>[])).filter(([e])=>!t().envOff.includes(e)),i=await _e({snippets:n.map(e=>({label:wt(e),lines:Tt(e)})),environment:r});e({status:`done`,fields:{title:i.title,labels:i.labels,what:i.what,steps:i.steps,expected:i.expected},model:i.model,basis:n.reduce((e,t)=>e+xt(t),0),stale:!1,fresh:!0}),setTimeout(()=>e({fresh:!1}),900)}catch(t){e(e=>({status:e.model?`done`:`none`,error:t instanceof Error?t.message:String(t)}))}}}})),Q=n(),qt={all:b,ai:ie,shell:f,server:F,ext:S,files:u,auto:m,tunnel:A,browser:d},Jt={debug:`DEBUG`,info:`INFO`,warn:`WARN`,error:`ERROR`,fatal:`FATAL`};function Yt({text:e,re:t}){return t?(0,Q.jsx)(Q.Fragment,{children:Re(e,t).map((e,t)=>e.hit?(0,Q.jsx)(`mark`,{className:`lg-hit`,children:e.text},t):(0,Q.jsx)(Z.Fragment,{children:e.text},t))}):(0,Q.jsx)(Q.Fragment,{children:e})}function Xt({msg:e,re:t,titles:n,onChat:r}){return(0,Q.jsx)(Q.Fragment,{children:Me(e).map((e,i)=>{if(e.kind===`chat`){let t=n[e.sid]??e.sid.slice(0,8);return r?(0,Q.jsx)(`button`,{type:`button`,className:`lg-sess`,title:`Show only this chat · ${e.sid}`,onClick:()=>r(e.sid),children:t},i):(0,Q.jsx)(`span`,{className:`lg-sess`,children:t},i)}return e.kind===`quote`?(0,Q.jsx)(`span`,{className:`q`,children:(0,Q.jsx)(Yt,{text:e.text,re:t})},i):e.kind===`key`?(0,Q.jsx)(`span`,{className:`k`,children:(0,Q.jsx)(Yt,{text:e.text,re:t})},i):(0,Q.jsx)(Yt,{text:e.text,re:t},i)})})}var Zt=/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/g;function Qt({row:e,utc:t,ctx:n,trim:r}){let i=e.entry,a=i.msg.replace(Zt,e=>e.slice(0,8)),o=r&&a.length>150?`${a.slice(0,149)}…`:a;return(0,Q.jsxs)(`div`,{className:n?`r ctx`:`r`,children:[(0,Q.jsx)(`span`,{className:`t`,children:De(i.ts,t)}),` `,(0,Q.jsx)(`span`,{className:i.lv,children:Jt[i.lv].padEnd(5,` `)}),` `,(0,Q.jsx)(`span`,{className:`g`,children:i.tag}),` `,o,e.count>1&&(0,Q.jsx)(`span`,{className:`t`,children:` ×${e.count}`}),!!i.more?.length&&(0,Q.jsx)(`span`,{className:`t`,children:` +${i.more.length} lines`})]})}function $t({paused:e,pending:t}){return(0,Q.jsxs)(`span`,{className:`flex items-center gap-1.5 whitespace-nowrap text-[10px] text-text-subtle`,"data-testid":`logs-live`,children:[e?(0,Q.jsx)(x,{className:`size-3 text-warning`}):(0,Q.jsx)(_,{className:`size-3 text-success`}),(0,Q.jsx)(`span`,{children:e?`Paused${t?` · ${t.toLocaleString(`en-US`)} new`:``}`:`Live`})]})}function en({title:e,children:t}){return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`lg-sheet-sec`,children:e}),(0,Q.jsx)(`div`,{className:`lg-sheet-chips`,children:t})]})}var $={keys:new Set,anchor:null,cursor:null};function tn(e){return{keys:new Set([e]),anchor:e,cursor:e}}function nn(e,t,n,r=!1){let i=e.anchor??n,a=Ce(t,i,n);return{keys:new Set(r?[...e.keys,...a]:a),anchor:i,cursor:n}}function rn(e,t){let n=new Set(e.keys);return n.has(t)?n.delete(t):n.add(t),{keys:n,anchor:t,cursor:t}}function an(e,t){return t.keys.size?e.filter(e=>t.keys.has(e.key)):[]}function on(e,t){let n=e.levels;return!n.error||!n.warn||!n.info||n.debug||!!e.chat||!!e.q||e.tagsOff.length>0||t!==`1h`}var sn=e=>e.reduce((e,t)=>e+t.count,0),cn=e=>e.map(e=>nt(e.entry,e.count)).join(`
4
- `);async function ln(e){e.length&&(await U(cn(e))?R.success(`Copied ${X(sn(e),`line`)}`):R.error(`Could not copy the lines`))}function un(){let e=ct();if(e)return Object.values(ce.getState().panels).flatMap(e=>e.tabs).find(t=>t.id===e)}function dn(e,t){if(!e.length)return;let n=[...new Set(e.map(e=>J(e.entry.src)))].join(`, `),r=cn(e),i=lt(r);st({text:`Selected lines from the PPM logs (${n})\n${i}\n${r}\n${i}`,label:`Log selection`,newTab:t,asContext:!0})}function fn(e,t,n=!1){return e.length?Kt.getState().add([...e])?(n||R.success(`Added ${X(sn(e),`line`)} to the report`,t?{action:{label:`Open`,onClick:t}}:void 0),!0):(n||R(`These lines are already in the report`),!1):!1}var pn=e=>String(e).padStart(2,`0`);function mn(e){if(!e.length)return;let t=new Date,n=`ppm-logs-${t.getFullYear()}${pn(t.getMonth()+1)}${pn(t.getDate())}-${pn(t.getHours())}${pn(t.getMinutes())}.log`,r=URL.createObjectURL(new Blob([`${cn(e)}\n`],{type:`application/octet-stream`})),i=document.createElement(`a`);i.href=r,i.download=n,i.rel=`noopener`,i.style.display=`none`,document.body.appendChild(i),i.click(),i.remove(),setTimeout(()=>URL.revokeObjectURL(r),1e4),R.success(`Saved ${n} with ${X(sn(e),`line`)}`)}var hn=24,gn=200;function _n(e,{follow:t,setFollow:n,feed:r,size:i,virtualizer:a,keep:o}){let s=(0,Z.useRef)(0),[c,l]=(0,Z.useState)(0),u=(0,Z.useCallback)((e=gn)=>{s.current=performance.now()+e},[]),d=(0,Z.useCallback)(()=>{let t=e.current;t&&(u(),t.scrollTop=t.scrollHeight)},[e,u]);(0,Z.useLayoutEffect)(()=>{let e=o.current;if(e!=null&&!t){let{count:t,getItemKey:n}=a.options;for(let r=0;r<t;r++)if(n(r)===e){u(),a.scrollToIndex(r,{align:`start`});break}}return()=>{let e=a.getVirtualItemForOffset(a.scrollOffset??0);o.current=e?String(e.key):null}},[]),(0,Z.useLayoutEffect)(()=>{t&&d()},[t,i,d]),(0,Z.useEffect)(()=>l(0),[r.key]),(0,Z.useEffect)(()=>{t&&l(0)},[t]);let f=r.batch;return(0,Z.useEffect)(()=>{f&&!t&&l(e=>e+f.count)},[f?.seq]),{newCount:c,onScroll:(0,Z.useCallback)(()=>{let r=e.current;if(!r||performance.now()<s.current)return;let i=r.scrollHeight-r.scrollTop-r.clientHeight<hn;i!==t&&n(i)},[e,t,n]),ownScroll:u}}var vn=`flex items-center gap-1 whitespace-nowrap rounded bg-surface-elevated text-text-primary transition-colors hover:bg-primary hover:text-primary-foreground active:bg-primary active:text-primary-foreground px-2 py-0.5 text-xs`,yn=5,bn={ai:`sdk, chat, usage, accounts`,shell:`bash-spy, bg-shell, terminal`,server:`supervisor, startup, stderr`,ext:`extensions, language servers`,files:`file-watcher, file-index, git`,auto:`scheduler, ppmbot, jira`,tunnel:`cloudflared.log`,browser:`Console`};function xn(e,t){return e?t===`all`?Object.values(e).reduce((e,t)=>({total:e.total+t.total,err:e.err+t.err,warn:e.warn+t.warn}),{total:0,err:0,warn:0}):e[t]:{total:0,err:0,warn:0}}function Sn(e,t,n){if(e===`tunnel`)return`cloudflared.log`;if(e===`browser`)return n?`Console · ${X(n.browserDevices,`device`)}`:bn.browser;let r=t?.[e]?.tags.slice(0,3).map(e=>e[0]);return r?.length?r.join(`, `):bn[e]}function Cn(e,t){return t?e===`all`?`ppm.log, cloudflared.log, ${X(t.browserDevices,`browser`)}`:e===`tunnel`?t.cloudflaredPath?`cloudflared.log · ${Ee(t.cloudflaredBytes)}`:`no cloudflared.log yet`:e===`browser`?`browser consoles · ${X(t.browserDevices,`device`)}`:`ppm.log · ${Ee(t.ppmLogBytes)}`:``}function wn({src:e,files:t}){return e===`tunnel`?t.cloudflaredPath?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`b`,{children:t.cloudflaredPath}),(0,Q.jsx)(`br`,{}),`Written by cloudflared itself, to the second.`]}):(0,Q.jsx)(Q.Fragment,{children:`No cloudflared.log yet. It appears once a tunnel has run.`}):e===`browser`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`b`,{children:`Browser consoles`}),(0,Q.jsx)(`br`,{}),`Sent by every open PPM tab and kept `,X(t.browserRetentionDays,`day`),`.`]}):e===`all`?(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`b`,{children:t.ppmLogPath}),` and its `,X(t.rotatedFiles,`older file`),`, `,(0,Q.jsx)(`b`,{children:`cloudflared.log`}),` and `,X(t.browserDevices,`browser`),`, merged by time.`]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`b`,{children:t.ppmLogPath}),(0,Q.jsx)(`br`,{}),Ee(t.ppmLogBytes),` of `,Ee(t.capBytes),`. When full it becomes ppm.log.1; `,t.generations,` files are kept.`]})}var Tn=(0,Z.memo)(function({row:e,index:t,selected:n,cursor:r,flash:i,open:a,utc:o,re:s,titles:c,onChat:l,onToggleMore:u,measure:d}){let f=e.entry,p=f.more?.length??0;return(0,Q.jsxs)(`div`,{ref:d,"data-index":t,"data-key":e.key,role:`option`,"aria-selected":n,className:V(`lg-row`,je(f.lv)===`error`&&`err`,n&&`sel`,r&&`cur`,i&&`flash`),children:[(0,Q.jsx)(`span`,{className:`lg-mark`}),(0,Q.jsx)(`span`,{className:`lg-t`,children:De(f.ts,o)}),(0,Q.jsx)(`span`,{className:`lg-lv ${f.lv}`,children:Jt[f.lv]}),(0,Q.jsx)(`span`,{className:`lg-tg`,title:f.tag,children:f.tag}),(0,Q.jsxs)(`span`,{className:`lg-m`,children:[(0,Q.jsx)(Xt,{msg:f.msg,re:s,titles:c,onChat:l}),e.count>1&&(0,Q.jsxs)(`span`,{className:`lg-x`,title:`The same line ${e.count} times in a row`,children:[`×`,e.count.toLocaleString(`en-US`)]}),p>0&&(0,Q.jsx)(`button`,{type:`button`,className:`lg-pchip`,onClick:()=>u(e.key),children:a?`Hide lines`:`+${X(p,`line`)}`})]}),a&&p>0&&(0,Q.jsx)(`div`,{className:`lg-more`,children:(0,Q.jsx)(Yt,{text:f.more.join(`
5
- `),re:s})})]})});function En({lv:e,cls:t,label:n,n:r,filter:i,setFilter:a}){return(0,Q.jsxs)(`button`,{type:`button`,className:V(`lg-chip`,t),"aria-pressed":i.levels[e],onClick:()=>a({levels:{...i.levels,[e]:!i.levels[e]}}),children:[(0,Q.jsx)(`span`,{className:`dot`}),n,r!=null&&(0,Q.jsx)(`span`,{className:`n`,children:Fe(r)})]})}function Dn(e){let{feed:t,rows:n,filter:o,setFilter:c,range:l,setRange:u,sel:d,setSel:f,follow:p,setFollow:m,paused:_,setPaused:v,utc:y,wrap:b}=e,S=t.meta,C=B(e=>e.setLogsWrap),E=(0,Z.useRef)(null),D=(0,Z.useRef)(null),O=(0,Z.useRef)(null),k=(0,Z.useRef)(null),[A,M]=(0,Z.useState)(()=>new Set),[N,F]=(0,Z.useState)(!1),[L,ie]=(0,Z.useState)(()=>new Set),R=(0,Z.useMemo)(()=>Ue(o),[o]),z=(0,Z.useMemo)(()=>be(R),[R]),se=(0,Z.useMemo)(()=>S?.titles??{},[S?.titles]),ce=S?.restarts,H=(0,Z.useMemo)(()=>{let e=Se(n,ce??[]),t=[];for(let r of n){let n=e.get(r.key);n!=null&&t.push({kind:`div`,key:`restart-${n}`,at:n}),t.push({kind:`row`,key:r.key,row:r})}return t},[n,ce]),U=(0,Z.useMemo)(()=>new Map(H.map((e,t)=>[e.key,t])),[H]),W=(0,Z.useMemo)(()=>n.map(e=>e.key),[n]),G=(0,Z.useMemo)(()=>an(n,d),[n,d]),q=rt({count:H.length,getScrollElement:()=>E.current,estimateSize:e=>H[e]?.kind===`div`?32:20,getItemKey:e=>H[e]?.key??e,overscan:24,paddingStart:4,paddingEnd:64}),me=q.getVirtualItems(),he=q.getTotalSize(),{newCount:ge,onScroll:_e,ownScroll:ve}=_n(E,{follow:p,setFollow:m,feed:t,size:he+H.length,virtualizer:q,keep:e.listTop});(0,Z.useEffect)(()=>M(new Set),[t.key]);let ye=t.batch;(0,Z.useEffect)(()=>{if(!ye||ye.count>yn)return;let e=new Set(t.entries.slice(-ye.count).map(e=>e.id)),r=new Set;for(let t=n.length-1;t>=0&&r.size<ye.count;t--)if(n[t].ids.some(t=>e.has(t)))r.add(n[t].key);else if(r.size)break;ie(r);let i=setTimeout(()=>ie(new Set),1200);return()=>clearTimeout(i)},[ye?.seq]);let xe=e.reveal;(0,Z.useLayoutEffect)(()=>{if(!xe)return;let e=U.get(xe.key);e!=null&&(ve(600),q.scrollToIndex(e,{align:`center`}),E.current?.focus({preventScroll:!0}))},[xe?.seq]),(0,Z.useLayoutEffect)(()=>{let e=k.current;if(!e)return;let t=U.get(e);t==null||t===0||(k.current=null,ve(),q.scrollToIndex(t,{align:`start`}))},[U,q,ve]);let Ce=(0,Z.useCallback)(async()=>{m(!1),k.current=W[0]??null,await t.loadEarlier()||(k.current=null)},[t,W,m]),Y=(0,Z.useCallback)(()=>{let e=O.current,t=E.current,n=D.current;if(!e||!t||!n||!G.length)return;let r=U.get(G[0].key),i=U.get(G[G.length-1].key),a=q.measurementsCache,o=r==null?void 0:a[r],s=i==null?void 0:a[i];if(!o||!s)return;let c=e.offsetHeight,l=e.offsetWidth,u=s.end+4;u+c>t.scrollTop+t.clientHeight&&o.start-c-4>=t.scrollTop&&(u=o.start-c-4);let d=n.querySelector(`.lg-m`),f=d?d.getBoundingClientRect().left-n.getBoundingClientRect().left:0,p=Math.max(t.scrollLeft+6,Math.min(f,t.scrollLeft+t.clientWidth-l-6));e.style.transform=`translate(${Math.round(Math.max(0,p))}px, ${Math.round(u)}px)`},[G,U,q]);(0,Z.useLayoutEffect)(()=>{Y()}),(0,Z.useEffect)(()=>{let e=E.current;if(!e)return;let t=new ResizeObserver(()=>Y());return t.observe(e),()=>t.disconnect()},[Y]);let Ee=()=>{Y(),_e()},Oe=e=>{if(e.button!==0)return;let t=e.target,n=t.closest(`.lg-row`);if(!n||t.closest(`button, a`))return;let r=n.dataset.key;r&&(e.preventDefault(),E.current?.focus({preventScroll:!0}),e.shiftKey&&d.anchor?f(nn(d,W,r,e.ctrlKey||e.metaKey)):e.ctrlKey||e.metaKey?f(rn(d,r)):d.keys.size===1&&d.keys.has(r)?f({keys:new Set,anchor:r,cursor:r}):(f(tn(r)),F(!0)))},ke=e=>{if(!N)return;let t=e.target.closest(`.lg-row`)?.dataset.key;t&&t!==d.cursor&&f(nn(d,W,t))};(0,Z.useEffect)(()=>{if(!N)return;let e=E.current?.ownerDocument??document,t=()=>F(!1);return e.addEventListener(`mouseup`,t),()=>e.removeEventListener(`mouseup`,t)},[N]);let Ae=(0,Z.useCallback)(e=>{M(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]),je=(0,Z.useCallback)(e=>c({chat:e}),[c]),Me=e=>{if(e.key===`Escape`){d.keys.size&&(e.stopPropagation(),f($));return}if(!W.length)return;let t=e.ctrlKey||e.metaKey;if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=d.cursor?W.indexOf(d.cursor):-1;t=t<0?e.key===`ArrowDown`?0:W.length-1:Math.max(0,Math.min(W.length-1,t+(e.key===`ArrowDown`?1:-1)));let n=W[t];e.shiftKey?f(nn(d.anchor?d:{...d,anchor:d.cursor??n},W,n)):f({keys:d.keys,anchor:d.keys.size?d.anchor:n,cursor:n});let r=U.get(n);r!=null&&q.scrollToIndex(r,{align:`auto`})}else if(e.key===` `&&d.cursor)e.preventDefault(),f(rn(d,d.cursor));else if(t&&e.key.toLowerCase()===`a`)e.preventDefault(),f({keys:new Set(W),anchor:W[0],cursor:W[W.length-1]});else if(t&&e.key.toLowerCase()===`c`&&G.length)e.preventDefault(),ln(G);else if(e.key===`Enter`&&d.cursor){let e=n.find(e=>e.key===d.cursor);e?.entry.more?.length&&Ae(e.key)}},Ne=()=>f($),Pe=xn(S?.stats,o.src),Ie=me[0],Le=G.length>0&&!N,Re=R===void 0||!!S?.badRegex,ze=o.chat?se[o.chat]??o.chat.slice(0,8):`All chats`,He=o.src===`all`?[]:S?.stats[o.src].tags??[],We=new Set(o.tagsOff),Ge=l===`restart`?S?.fromTs:S?.restarts.at(-1);return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`nav`,{className:`lg-side`,"aria-label":`Log sources`,children:[(0,Q.jsx)(On,{id:`all`,label:`All sources`,sub:`ppm.log, cloudflared.log, browsers`,stats:xn(S?.stats,`all`),current:o.src===`all`,onPick:()=>c({src:`all`,tagsOff:[]})}),(0,Q.jsx)(`div`,{className:`lg-group`,children:`Server · ppm.log`}),Be.filter(e=>e.group===`ppm`).map(e=>(0,Q.jsx)(On,{id:e.id,label:e.label,sub:Sn(e.id,S?.stats,S?.files),stats:S?.stats[e.id],current:o.src===e.id,onPick:()=>c({src:e.id,tagsOff:[]})},e.id)),(0,Q.jsx)(`div`,{className:`lg-group`,children:`Elsewhere`}),Be.filter(e=>e.group===`elsewhere`).map(e=>(0,Q.jsx)(On,{id:e.id,label:e.label,sub:Sn(e.id,S?.stats,S?.files),stats:S?.stats[e.id],current:o.src===e.id,onPick:()=>c({src:e.id,tagsOff:[]})},e.id)),S&&(0,Q.jsx)(`div`,{className:`lg-side-file`,children:(0,Q.jsx)(wn,{src:o.src,files:S.files})})]}),(0,Q.jsxs)(`section`,{className:`lg-view`,"aria-label":J(o.src),children:[(0,Q.jsxs)(`div`,{className:`lg-tools`,children:[(0,Q.jsxs)(`div`,{className:`lg-search`,children:[(0,Q.jsx)(oe,{}),(0,Q.jsx)(`input`,{type:`search`,value:o.q,onChange:e=>c({q:e.target.value}),placeholder:o.src===`all`?`Search all logs`:`Search ${J(o.src)}`,"aria-label":`Search logs`,"aria-invalid":!!o.q&&Re,title:o.q&&Re?`This regular expression does not compile`:void 0}),(0,Q.jsxs)(`span`,{className:`lg-inl`,children:[(0,Q.jsx)(`button`,{type:`button`,title:`Match case`,"aria-pressed":o.caseSensitive,onClick:()=>c({caseSensitive:!o.caseSensitive}),children:(0,Q.jsx)(pe,{})}),(0,Q.jsx)(`button`,{type:`button`,title:`Regular expression`,"aria-pressed":o.regex,onClick:()=>c({regex:!o.regex}),children:(0,Q.jsx)(Ve,{})})]})]}),(0,Q.jsx)(`span`,{className:`lg-sep`}),(0,Q.jsx)(En,{lv:`error`,cls:`e`,label:`Errors`,n:Pe.err,filter:o,setFilter:c}),(0,Q.jsx)(En,{lv:`warn`,cls:`w`,label:`Warnings`,n:Pe.warn,filter:o,setFilter:c}),(0,Q.jsx)(En,{lv:`info`,label:`Info`,filter:o,setFilter:c}),(0,Q.jsx)(En,{lv:`debug`,label:`Debug`,filter:o,setFilter:c}),(0,Q.jsx)(`span`,{className:`lg-sep lg-hide-narrow`}),(0,Q.jsxs)(fe,{children:[(0,Q.jsx)(ue,{asChild:!0,children:(0,Q.jsxs)(`button`,{type:`button`,className:V(`lg-ghost`,o.chat&&`on`),title:o.chat?`Only lines naming ${ze}`:`Lines from every chat`,children:[(0,Q.jsx)(a,{}),(0,Q.jsx)(`span`,{className:`max-w-[140px] truncate`,children:ze}),(0,Q.jsx)(h,{className:`chev`})]})}),(0,Q.jsx)(kn,{filter:o,setFilter:c,chats:S?.chats??[],titles:se})]}),(0,Q.jsxs)(fe,{children:[(0,Q.jsx)(ue,{asChild:!0,children:(0,Q.jsxs)(`button`,{type:`button`,className:`lg-ghost`,children:[(0,Q.jsx)(I,{}),we[l],(0,Q.jsx)(h,{className:`chev`})]})}),(0,Q.jsx)(de,{align:`start`,className:`min-w-52`,children:$e.map(e=>(0,Q.jsxs)(K,{onSelect:()=>u(e),children:[(0,Q.jsx)(`span`,{children:we[e]}),l===e?(0,Q.jsx)(i,{className:`ml-auto`}):e===`restart`&&Ge?(0,Q.jsx)(`span`,{className:`lg-mi-sub`,children:De(Ge,y).slice(0,5)}):e===`all`&&S?(0,Q.jsx)(`span`,{className:`lg-mi-sub`,children:X(1+S.files.rotatedFiles,`file`)}):null]},e))})]}),(0,Q.jsx)(`span`,{className:`lg-fill`}),(t.loading||t.loadingEarlier)&&(0,Q.jsx)(`span`,{className:`lg-busy`,"aria-label":`Reading the logs`,children:(0,Q.jsx)(ae,{className:`animate-spin`})}),(0,Q.jsx)(`button`,{type:`button`,className:`lg-ibtn`,title:`Wrap long lines`,"aria-pressed":b,onClick:()=>C(!b),children:(0,Q.jsx)(P,{})}),(0,Q.jsx)(`button`,{type:`button`,className:`lg-ibtn`,title:`Follow new lines`,"aria-pressed":p,onClick:()=>m(!p),children:(0,Q.jsx)(ee,{})}),(0,Q.jsx)(`button`,{type:`button`,className:`lg-ibtn`,title:_?`Resume live lines`:`Pause live lines`,"aria-pressed":_,onClick:()=>v(!_),children:_?(0,Q.jsx)(ne,{}):(0,Q.jsx)(x,{})}),(0,Q.jsx)(`button`,{type:`button`,className:`lg-ibtn lg-hide-narrow`,title:`Download these lines`,onClick:()=>mn(n),disabled:!n.length,children:(0,Q.jsx)(w,{})}),(0,Q.jsxs)(fe,{children:[(0,Q.jsx)(ue,{asChild:!0,children:(0,Q.jsx)(`button`,{type:`button`,className:`lg-ibtn`,title:`More`,"aria-label":`More`,children:(0,Q.jsx)(g,{})})}),(0,Q.jsxs)(de,{align:`end`,className:`min-w-52`,children:[(0,Q.jsxs)(K,{disabled:!n.length,onSelect:()=>void ln(n),children:[(0,Q.jsx)(re,{}),`Copy visible lines`,(0,Q.jsx)(`span`,{className:`lg-mi-sub`,children:sn(n).toLocaleString(`en-US`)})]}),(0,Q.jsxs)(K,{disabled:!n.length,onSelect:()=>mn(n),children:[(0,Q.jsx)(w,{}),`Download as .log`]}),(0,Q.jsxs)(K,{onSelect:()=>t.reload(),children:[(0,Q.jsx)(te,{}),`Read again`]}),(0,Q.jsx)(le,{}),(0,Q.jsxs)(K,{onSelect:e.togglePrefs,children:[(0,Q.jsx)(s,{}),`Preferences`]})]})]})]}),He.length>0&&(0,Q.jsxs)(`div`,{className:`lg-tagbar`,children:[(0,Q.jsx)(`span`,{className:`lg-tagbar-lbl`,children:`Tags`}),He.map(([e,t])=>{let n=`${o.src}:${e}`;return(0,Q.jsxs)(`button`,{type:`button`,className:`lg-tag`,"aria-pressed":!We.has(n),onClick:()=>c({tagsOff:We.has(n)?o.tagsOff.filter(e=>e!==n):[...o.tagsOff,n]}),children:[e,(0,Q.jsx)(`span`,{className:`n`,children:Fe(t)})]},e)})]}),(0,Q.jsx)(`div`,{ref:E,className:V(`lg-list`,b&&`wrap`),tabIndex:0,role:`listbox`,"aria-multiselectable":`true`,"aria-label":`Log lines`,"aria-busy":t.loading,onScroll:Ee,onMouseDown:Oe,onMouseOver:ke,onKeyDown:Me,"data-testid":`logs-list`,children:n.length>0?(0,Q.jsxs)(`div`,{ref:D,className:`lg-rows`,style:{height:he,padding:0},children:[(0,Q.jsx)(`div`,{style:{transform:`translateY(${Ie?.start??0}px)`},children:me.map(e=>{let t=H[e.index];return t.kind===`div`?(0,Q.jsxs)(`div`,{ref:q.measureElement,"data-index":e.index,className:`lg-div`,children:[(0,Q.jsx)(te,{}),`PPM restarted at `,De(t.at,y).slice(0,8)]},t.key):(0,Q.jsx)(Tn,{row:t.row,index:e.index,selected:d.keys.has(t.key),cursor:d.cursor===t.key,flash:L.has(t.key),open:A.has(t.key),utc:y,re:z,titles:se,onChat:je,onToggleMore:Ae,measure:q.measureElement},t.key)})}),Le&&(0,Q.jsxs)(`div`,{ref:O,className:`lg-selbar absolute left-0 top-0 z-10 flex max-w-full flex-wrap gap-1 rounded-md border border-border bg-surface p-0.5 shadow-md`,role:`group`,"aria-label":`Selected lines`,"data-testid":`logs-selbar`,children:[(0,Q.jsx)(`span`,{className:`lg-selcount`,children:X(sn(G),`line`)}),(0,Q.jsxs)(`button`,{type:`button`,className:vn,onClick:()=>{dn(G,!1),Ne()},children:[(0,Q.jsx)(a,{}),`Add to current chat`]}),(0,Q.jsxs)(`button`,{type:`button`,className:vn,onClick:()=>{dn(G,!0),Ne()},children:[(0,Q.jsx)(T,{}),`Add to new chat`]}),(0,Q.jsxs)(`button`,{type:`button`,className:vn,onClick:()=>{fn(G,()=>e.goTo(`report`)),Ne()},children:[(0,Q.jsx)(r,{}),`Add to report`]}),(0,Q.jsxs)(`button`,{type:`button`,className:vn,onClick:()=>void ln(G),children:[(0,Q.jsx)(re,{}),`Copy`]})]})]}):(0,Q.jsx)(An,{...e})}),ge>0&&!p&&(0,Q.jsxs)(`button`,{type:`button`,className:`lg-newpill`,onClick:()=>m(!0),children:[(0,Q.jsx)(j,{}),X(ge,`new line`)]}),(0,Q.jsxs)(`div`,{className:`lg-foot`,children:[(0,Q.jsx)(`span`,{className:`src`,children:Cn(o.src,S?.files)}),S&&(0,Q.jsx)(`span`,{children:S.hasMore?`${sn(n).toLocaleString(`en-US`)} of ${X(S.matched,`line`)}`:X(S.matched,`line`)}),(0,Q.jsx)(`button`,{type:`button`,disabled:!S?.hasMore||t.loadingEarlier||t.loading,onClick:()=>void Ce(),children:t.loadingEarlier?`Loading…`:`Load earlier`}),(0,Q.jsx)(`span`,{className:`sp`}),(0,Q.jsx)(`span`,{className:`tz`,children:y?`UTC`:`Local time (${Te()})`})]})]})]})}function On({id:e,label:t,sub:n,stats:r,current:i,onPick:a}){let o=qt[e],s=r?.err??0,c=r?.warn??0;return(0,Q.jsxs)(`button`,{type:`button`,"aria-current":i,title:t,onClick:a,className:V(`lg-src flex min-h-11 w-full items-center gap-3 px-3 py-2 text-left transition-colors`,s?`has-e`:c?`has-w`:``,i?`bg-primary/10 text-text-primary`:`hover:bg-surface-hover`),children:[(0,Q.jsx)(o,{className:`lg-src-ic size-4 shrink-0`}),(0,Q.jsxs)(`span`,{className:`lg-src-txt`,children:[(0,Q.jsx)(`b`,{children:t}),(0,Q.jsx)(`small`,{children:n})]}),(0,Q.jsxs)(`span`,{className:`lg-cnts`,children:[(s>0||c>0)&&(0,Q.jsxs)(`span`,{className:`flex gap-1`,children:[s>0&&(0,Q.jsx)(`span`,{className:`lg-pill e`,title:X(s,`error`),children:Fe(s)}),c>0&&(0,Q.jsx)(`span`,{className:`lg-pill w`,title:X(c,`warning`),children:Fe(c)})]}),(0,Q.jsx)(`span`,{className:`lg-total`,title:`Lines in this range`,children:Fe(r?.total??0)})]})]})}function kn({filter:e,setFilter:t,chats:n,titles:r}){let o=se(un());return(0,Q.jsxs)(de,{align:`start`,className:`max-h-80 min-w-60 max-w-80`,children:[(0,Q.jsx)(G,{className:`text-xs font-normal text-text-subtle`,children:`Show lines from`}),(0,Q.jsxs)(K,{onSelect:()=>t({chat:null}),children:[(0,Q.jsx)(b,{}),`All chats`,!e.chat&&(0,Q.jsx)(i,{className:`ml-auto`})]}),(0,Q.jsx)(le,{}),n.length===0&&(0,Q.jsx)(G,{className:`text-xs font-normal text-text-subtle`,children:`No chat named in this range`}),n.slice(0,40).map(n=>(0,Q.jsxs)(K,{onSelect:()=>t({chat:n.sid}),children:[(0,Q.jsx)(a,{}),(0,Q.jsx)(`span`,{className:`min-w-0 truncate`,children:n.title??r[n.sid]??n.sid.slice(0,8)}),e.chat===n.sid?(0,Q.jsx)(i,{className:`ml-auto`}):(0,Q.jsx)(`span`,{className:`lg-mi-sub`,children:n.sid===o?`this tab`:n.sid.slice(0,8)})]},n.sid))]})}function An(e){let{feed:t,filter:n,range:r}=e;return t.error&&!t.loading?(0,Q.jsxs)(`div`,{className:`lg-empty`,children:[`Could not read the logs: `,t.error,`. `,(0,Q.jsx)(`button`,{type:`button`,onClick:()=>t.reload(),children:`Try again`})]}):t.loading||!t.meta?(0,Q.jsx)(`div`,{className:`lg-empty`,children:`Reading the logs…`}):on(n,r)?(0,Q.jsxs)(`div`,{className:`lg-empty`,children:[`No lines match these filters. `,(0,Q.jsx)(`button`,{type:`button`,onClick:e.clearFilters,children:`Clear filters`})]}):(0,Q.jsxs)(`div`,{className:`lg-empty`,children:[`Nothing in `,we[r].toLowerCase(),`. `,(0,Q.jsx)(`button`,{type:`button`,onClick:()=>e.setRange(`all`),children:`Show everything kept`})]})}var jn=450,Mn=8,Nn=[[`error`,`e`,`Errors`],[`warn`,`w`,`Warnings`],[`info`,``,`Info`],[`debug`,``,`Debug`]];function Pn(e){let{feed:t,rows:n,filter:i,setFilter:o,range:s,setRange:c,sel:l,setSel:u,follow:d,setFollow:f,utc:p}=e,m=t.meta,h=(0,Z.useRef)(null),g=(0,Z.useRef)(null),[_,v]=(0,Z.useState)(!1),[ee,y]=(0,Z.useState)(()=>new Set),[b,x]=(0,Z.useState)(null),S=B(e=>e.setLogsUtc),C=(0,Z.useMemo)(()=>Ue(i),[i]),te=(0,Z.useMemo)(()=>be(C),[C]),w=(0,Z.useMemo)(()=>m?.titles??{},[m?.titles]),E=(0,Z.useMemo)(()=>n.map(e=>e.key),[n]),k=(0,Z.useMemo)(()=>an(n,l),[n,l]),A=_||l.keys.size>0,M=rt({count:n.length,getScrollElement:()=>h.current,estimateSize:()=>64,getItemKey:e=>n[e]?.key??e,overscan:10}),ne=M.getTotalSize(),{newCount:N,onScroll:P}=_n(h,{follow:d,setFollow:f,feed:t,size:ne+n.length,virtualizer:M,keep:e.listTop}),F=(0,Z.useCallback)(()=>{v(!1),u($)},[u]),I=e=>{if(A){l.anchor===e&&l.keys.size===1?u({keys:new Set,anchor:null,cursor:null}):l.anchor?u(nn(l,E,e)):u(tn(e));return}y(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},L=()=>{g.current&&clearTimeout(g.current.timer),g.current=null},ie=e=>{if(e.pointerType===`mouse`&&e.button!==0)return;let t=e.target,n=t.closest(`.lg-prow`)?.dataset.key;if(!n||t.closest(`button, a`))return;L();let r=setTimeout(()=>{g.current&&(g.current.fired=!0,v(!0),u(tn(n)),navigator.vibrate?.(10))},jn);g.current={key:n,x:e.clientX,y:e.clientY,timer:r,fired:!1}},ae=e=>{let t=g.current;t&&Math.hypot(e.clientX-t.x,e.clientY-t.y)>Mn&&L()},R=()=>{let e=g.current;e&&(clearTimeout(e.timer),g.current=null,e.fired||I(e.key))},z=sn(k),se=k[0],ce=k[k.length-1],H=se&&ce?xe(se.entry.ts,ce.lastTs,p):``,U=b===`chat`?un():void 0,G=m?Object.values(m.stats):[],K=e=>{dn(k,e),x(null),F()};return(0,Q.jsxs)(`div`,{className:`lg-view`,children:[(0,Q.jsxs)(`div`,{className:`lg-pchips`,"aria-label":`Sources`,children:[(0,Q.jsx)(Fn,{id:`all`,label:`All`,err:G.reduce((e,t)=>e+t.err,0),warn:G.reduce((e,t)=>e+t.warn,0),current:i.src===`all`,onPick:()=>o({src:`all`,tagsOff:[]})}),Be.map(e=>(0,Q.jsx)(Fn,{id:e.id,label:e.label,err:m?.stats[e.id].err??0,warn:m?.stats[e.id].warn??0,current:i.src===e.id,onPick:()=>o({src:e.id,tagsOff:[]})},e.id))]}),(0,Q.jsxs)(`div`,{className:`lg-psearch`,children:[(0,Q.jsxs)(`div`,{className:`lg-search`,children:[(0,Q.jsx)(oe,{}),(0,Q.jsx)(`input`,{type:`search`,value:i.q,onChange:e=>o({q:e.target.value}),placeholder:`Search logs`,"aria-label":`Search logs`,"aria-invalid":!!i.q&&(C===void 0||!!m?.badRegex),enterKeyHint:`search`})]}),(0,Q.jsxs)(`button`,{type:`button`,className:`lg-pfilter`,"aria-label":`Filters`,onClick:()=>x(`filter`),children:[(0,Q.jsx)(D,{}),on(i,s)&&(0,Q.jsx)(`span`,{className:`dotn`})]})]}),!A&&n.length>0&&(0,Q.jsx)(`div`,{className:`lg-phint`,children:`Long-press a line to select it, then tap the last line you need.`}),(0,Q.jsxs)(`div`,{className:`relative flex min-h-0 flex-1 flex-col`,children:[(0,Q.jsx)(`div`,{ref:h,className:`lg-plist`,onScroll:P,onPointerDown:ie,onPointerMove:ae,onPointerUp:R,onPointerCancel:L,onPointerLeave:L,onContextMenu:e=>{e.target.closest(`.lg-prow`)&&e.preventDefault()},"data-testid":`logs-plist`,children:n.length>0?(0,Q.jsx)(`div`,{style:{height:ne,position:`relative`},children:(0,Q.jsx)(`div`,{style:{transform:`translateY(${M.getVirtualItems()[0]?.start??0}px)`},children:M.getVirtualItems().map(e=>{let t=n[e.index];return(0,Q.jsx)(In,{row:t,index:e.index,selecting:A,selected:l.keys.has(t.key),open:ee.has(t.key),utc:p,re:te,titles:w,onChat:e=>o({chat:e}),measure:M.measureElement},t.key)})})}):(0,Q.jsx)(An,{...e})}),N>0&&!d&&(0,Q.jsxs)(`button`,{type:`button`,className:`lg-newpill`,style:{bottom:12},onClick:()=>f(!0),children:[(0,Q.jsx)(j,{}),X(N,`new line`)]})]}),A&&(0,Q.jsxs)(`div`,{className:`lg-pbar`,"data-testid":`logs-pbar`,children:[(0,Q.jsx)(W,{variant:`ghost`,size:`icon`,className:`size-11`,"aria-label":`Stop selecting`,onClick:F,children:(0,Q.jsx)(O,{className:`size-5`})}),(0,Q.jsxs)(`span`,{className:`cnt`,children:[z?`${X(z,`line`)} selected`:`Nothing selected`,(0,Q.jsx)(`small`,{children:z?H:`Tap lines to select them`})]}),(0,Q.jsxs)(W,{variant:`outline`,className:`min-h-11 px-3`,disabled:!z,onClick:()=>x(`chat`),children:[(0,Q.jsx)(a,{className:`size-4`}),`Ask AI`]}),(0,Q.jsxs)(W,{className:`min-h-11 px-3`,disabled:!z,onClick:()=>{fn(k,()=>e.goTo(`report`)),F()},children:[(0,Q.jsx)(r,{className:`size-4`}),`Report`]})]}),(0,Q.jsxs)(q,{open:b===`chat`,onClose:()=>x(null),children:[(0,Q.jsxs)(`div`,{className:`lg-sheet-title`,children:[`Ask AI about `,X(z,`line`),(0,Q.jsx)(`small`,{children:H})]}),(0,Q.jsxs)(`div`,{className:`lg-sheet-list`,children:[(0,Q.jsxs)(`button`,{type:`button`,className:`lg-sheet-row`,onClick:()=>K(!1),children:[(0,Q.jsx)(a,{}),(0,Q.jsxs)(`span`,{children:[`Add to current chat`,(0,Q.jsx)(`small`,{children:U?U.title:`Opens a new chat`})]})]}),(0,Q.jsxs)(`button`,{type:`button`,className:`lg-sheet-row`,onClick:()=>K(!0),children:[(0,Q.jsx)(T,{}),(0,Q.jsxs)(`span`,{children:[`Add to new chat`,(0,Q.jsx)(`small`,{children:`Starts a chat with these lines attached`})]})]}),(0,Q.jsxs)(`button`,{type:`button`,className:`lg-sheet-row`,onClick:()=>{ln(k),x(null)},children:[(0,Q.jsx)(re,{}),(0,Q.jsx)(`span`,{children:`Copy lines`})]})]})]}),(0,Q.jsxs)(q,{open:b===`filter`,onClose:()=>x(null),className:`flex max-h-[calc(var(--sheet-vh,100dvh)*0.85)] flex-col`,children:[(0,Q.jsx)(`div`,{className:`lg-sheet-title`,children:`Filters`}),(0,Q.jsxs)(`div`,{className:`min-h-0 flex-1 overflow-y-auto`,children:[(0,Q.jsx)(en,{title:`Levels`,children:Nn.map(([e,t,n])=>(0,Q.jsxs)(`button`,{type:`button`,className:V(`lg-chip`,t),"aria-pressed":i.levels[e],onClick:()=>o({levels:{...i.levels,[e]:!i.levels[e]}}),children:[(0,Q.jsx)(`span`,{className:`dot`}),n]},e))}),(0,Q.jsxs)(en,{title:`Chat`,children:[(0,Q.jsx)(`button`,{type:`button`,className:`lg-chip`,"aria-pressed":!i.chat,onClick:()=>o({chat:null}),children:`All chats`}),i.chat&&!m?.chats.slice(0,4).some(e=>e.sid===i.chat)&&(0,Q.jsx)(`button`,{type:`button`,className:`lg-chip`,"aria-pressed":!0,children:(0,Q.jsx)(`span`,{className:`t`,children:w[i.chat]??i.chat.slice(0,8)})}),(m?.chats??[]).slice(0,4).map(e=>(0,Q.jsx)(`button`,{type:`button`,className:`lg-chip`,"aria-pressed":i.chat===e.sid,onClick:()=>o({chat:e.sid}),children:(0,Q.jsx)(`span`,{className:`t`,children:e.title??w[e.sid]??e.sid.slice(0,8)})},e.sid))]}),(0,Q.jsx)(en,{title:`Time`,children:$e.map(e=>(0,Q.jsx)(`button`,{type:`button`,className:`lg-chip`,"aria-pressed":s===e,onClick:()=>c(e),children:we[e]},e))}),(0,Q.jsx)(`div`,{className:`lg-sheet-list`,children:(0,Q.jsxs)(`label`,{className:`lg-sheet-row`,children:[(0,Q.jsx)(He,{checked:p,onCheckedChange:S}),(0,Q.jsx)(`span`,{children:`Show times in UTC`})]})})]}),(0,Q.jsxs)(`div`,{className:`lg-sheet-foot`,children:[(0,Q.jsx)(W,{variant:`outline`,className:`min-h-11 flex-1`,onClick:e.clearFilters,children:`Reset`}),(0,Q.jsx)(W,{className:`min-h-11 flex-1`,onClick:()=>x(null),children:t.loading?`Reading…`:`Show ${X(m?.matched??0,`line`)}`})]})]})]})}function Fn({id:e,label:t,err:n,warn:r,current:i,onPick:a}){let o=qt[e];return(0,Q.jsxs)(`button`,{type:`button`,className:`lg-chip`,"aria-pressed":i,onClick:a,children:[(0,Q.jsx)(o,{}),t,n>0?(0,Q.jsx)(`span`,{className:`lg-pill e`,children:n}):r>0?(0,Q.jsx)(`span`,{className:`lg-pill w`,children:r}):null]})}function In({row:e,index:t,selecting:n,selected:r,open:a,utc:o,re:s,titles:c,onChat:l,measure:u}){let d=e.entry,f=d.more?.length??0;return(0,Q.jsxs)(`div`,{ref:u,"data-index":t,"data-key":e.key,"aria-selected":n?r:void 0,className:V(`lg-prow`,je(d.lv)===`error`&&`err`,r&&`sel`,a&&`open`),children:[(0,Q.jsx)(`div`,{className:`lg-prow-g`,children:n?(0,Q.jsx)(`span`,{className:`lg-pcheck`,children:r&&(0,Q.jsx)(i,{})}):(0,Q.jsx)(`span`,{className:`lv ${d.lv}`})}),(0,Q.jsxs)(`div`,{className:`min-w-0`,children:[(0,Q.jsxs)(`div`,{className:`lg-prow-meta`,children:[(0,Q.jsx)(`span`,{children:De(d.ts,o)}),(0,Q.jsx)(`span`,{className:`lv ${d.lv}`,children:Jt[d.lv]}),(0,Q.jsx)(`span`,{className:`tg`,children:d.tag}),e.count>1&&(0,Q.jsxs)(`span`,{children:[`×`,e.count]}),f>0&&(0,Q.jsxs)(`span`,{children:[`+`,X(f,`line`)]})]}),(0,Q.jsxs)(`div`,{className:`lg-prow-msg`,children:[(0,Q.jsx)(Xt,{msg:d.msg,re:s,titles:c,onChat:l}),a&&f>0&&(0,Q.jsxs)(Q.Fragment,{children:[`
6
- `,(0,Q.jsx)(Yt,{text:d.more.join(`
7
- `),re:s})]})]})]})]})}var Ln={bug:{label:`Likely PPM bug`,icon:c,chip:`e`},setup:{label:`Your setup`,icon:s,chip:`w`},upstream:{label:`Upstream`,icon:C},expected:{label:`Expected`,icon:i}},Rn=3;function zn(e){let t=[e.errors>0&&X(e.errors,`error`),e.warnings>0&&X(e.warnings,`warning`)].filter(Boolean);return t.length?t.join(` · `):X(e.count,`time`)}function Bn({utc:e,phone:t,issues:n,goTo:r,showInLogs:i}){let{data:a,error:s}=n,[c,l]=(0,Z.useState)(`all`);if(!a)return(0,Q.jsx)(`div`,{className:`lg-pane`,children:(0,Q.jsx)(`div`,{className:`lg-pane-in`,children:(0,Q.jsx)(`div`,{className:`lg-empty`,children:s?(0,Q.jsxs)(Q.Fragment,{children:[`Could not read what AI found: `,s]}):`Reading what AI found…`})})});let u=a.issues.filter(e=>!e.dismissed),d=e=>u.filter(t=>t.cls===e).length,f=d(`bug`),p=d(`setup`)+d(`upstream`),m=d(`expected`),h=a.issues.length-u.length,g=u.filter(e=>c===`all`||e.cls===c).sort((e,t)=>Ze.indexOf(e.cls)-Ze.indexOf(t.cls)||t.last-e.last),_=Math.max(1,Math.round((Date.now()-a.windowFrom)/36e5)),v=a.analyzedAt===null,ee=v?`Not sorted yet`:[f&&X(f,`likely bug`),p&&`${p} to check`,m&&`${m} expected`].filter(Boolean).join(`, `)||`Nothing left to look at`,y=e=>{fn(ke(e.lines),void 0,!0),r(`report`),Kt.getState().draft()},b=e=>{n.setDismissed(e.id,!0),R(e.cls===`expected`?`Hidden. The lines stay in Logs.`:`Dismissed`,{action:{label:`Undo`,onClick:()=>void n.setDismissed(e.id,!1)}})};return(0,Q.jsx)(`div`,{className:`lg-pane`,"data-testid":`logs-issues`,children:(0,Q.jsxs)(`div`,{className:`lg-pane-in`,children:[(0,Q.jsxs)(`div`,{className:`lg-ai-head`,children:[(0,Q.jsx)(`span`,{className:`lg-ai-ic`,children:(0,Q.jsx)(E,{})}),(0,Q.jsxs)(`div`,{className:`lg-ai-txt`,children:[a.running?(0,Q.jsxs)(`h3`,{className:`lg-analyzing`,children:[(0,Q.jsx)(ae,{className:`animate-spin`}),a.unsorted?`Reading ${X(a.unsorted,`error and warning`,`errors and warnings`)}…`:`Reading the errors and warnings…`]}):(0,Q.jsx)(`h3`,{children:ee}),(0,Q.jsxs)(`p`,{children:[v?`Claude can group`:`Claude grouped`,` the last `,X(_,`hour`),` of errors and warnings by cause. Info lines are not sent.`]}),a.error&&!a.running&&(0,Q.jsxs)(`p`,{className:`err`,children:[`The last run failed: `,a.error]}),(0,Q.jsxs)(`div`,{className:`lg-ai-meta`,children:[(0,Q.jsxs)(`span`,{children:[(0,Q.jsx)(E,{}),a.model]}),a.analyzedAt&&(0,Q.jsxs)(`span`,{children:[(0,Q.jsx)(I,{}),`Updated `,De(a.analyzedAt,e).slice(0,5)]}),a.lastRun&&(0,Q.jsxs)(`span`,{children:[X(a.lastRun.lines,`line`),` → `,X(a.lastRun.patterns,`pattern`),` · `,Fe(a.lastRun.tokens),` tokens`]}),!v&&a.unsorted>0&&!a.running&&(0,Q.jsxs)(`span`,{children:[X(a.unsorted,`new line`),` not sorted yet`]}),(0,Q.jsxs)(`span`,{children:[(0,Q.jsx)(o,{}),`Secrets removed first`]})]})]}),(0,Q.jsxs)(`div`,{className:`lg-ai-act`,children:[(0,Q.jsxs)(W,{variant:`outline`,size:`sm`,disabled:a.running,onClick:()=>void n.analyze(!v),className:t?`min-h-11`:void 0,children:[(0,Q.jsx)(te,{}),v?`Analyze`:`Re-analyze`]}),(0,Q.jsxs)(`label`,{className:`lg-autoline`,children:[(0,Q.jsx)(He,{checked:a.auto,onCheckedChange:e=>void n.setAuto(e)}),`Auto`]})]})]}),(0,Q.jsxs)(`div`,{className:`lg-filters`,children:[(0,Q.jsx)(Vn,{id:`all`,label:`All`,n:u.length,cur:c,set:l}),Ze.map(e=>(0,Q.jsx)(Vn,{id:e,label:Ln[e].label,chip:Ln[e].chip,n:d(e),cur:c,set:l},e))]}),g.map(t=>(0,Q.jsx)(Hn,{it:t,utc:e,onDraft:()=>y(t),onChat:()=>dn(ke(t.lines),!1),onShow:()=>i(t.lines),onDismiss:()=>b(t)},t.id)),!g.length&&(0,Q.jsx)(`div`,{className:`lg-empty`,children:v?`Press Analyze to sort the errors and warnings.`:u.length?`Nothing in this group.`:`No errors or warnings worth a look in the last ${X(_,`hour`)}.`}),(0,Q.jsxs)(`div`,{className:`lg-muted`,children:[(0,Q.jsx)(M,{}),(0,Q.jsx)(`span`,{children:`Nothing goes to GitHub from here: a report opens for you to read first.`}),h>0&&(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`span`,{children:[X(h,`issue`),` hidden`]}),(0,Q.jsx)(`button`,{type:`button`,onClick:()=>void n.undismissAll(),children:`Show again`})]})]})]})})}function Vn({id:e,label:t,chip:n,n:r,cur:i,set:a}){return(0,Q.jsxs)(`button`,{type:`button`,className:V(`lg-chip`,n),"aria-pressed":i===e,onClick:()=>a(e),children:[t,` `,(0,Q.jsx)(`span`,{className:`n`,children:r})]})}function Hn({it:e,utc:t,onDraft:n,onChat:r,onShow:i,onDismiss:o}){let s=Ln[e.cls],c=s.icon,l=qt[e.src],u=ke(e.lines);return(0,Q.jsxs)(`article`,{className:V(`lg-issue`,e.cls===`bug`&&`bug`),"data-testid":`logs-issue`,children:[(0,Q.jsxs)(`div`,{className:`lg-issue-top`,children:[(0,Q.jsxs)(`span`,{className:`lg-cls ${e.cls}`,children:[(0,Q.jsx)(c,{}),s.label]}),(0,Q.jsxs)(`span`,{className:`lg-area`,children:[(0,Q.jsx)(l,{}),e.area]}),(0,Q.jsxs)(`span`,{className:`lg-occ`,children:[zn(e),` · last `,De(e.last,t).slice(0,5)]})]}),(0,Q.jsx)(`h4`,{children:e.title}),(0,Q.jsx)(`p`,{className:`lg-why`,children:e.why}),e.fix&&(0,Q.jsxs)(`div`,{className:`lg-fix`,children:[(0,Q.jsx)(M,{}),(0,Q.jsx)(`span`,{children:e.fix})]}),u.length>0&&(0,Q.jsxs)(`div`,{className:`lg-evid`,children:[u.slice(0,Rn).map(e=>(0,Q.jsx)(Qt,{row:e,utc:t,trim:!0},e.key)),u.length>Rn&&(0,Q.jsx)(`div`,{className:`r`,children:(0,Q.jsxs)(`span`,{className:`t`,children:[`+ `,X(u.length-Rn,`more line`)]})})]}),(0,Q.jsxs)(`div`,{className:`lg-issue-act`,children:[e.cls===`bug`&&(0,Q.jsxs)(W,{size:`sm`,onClick:n,children:[(0,Q.jsx)(Ae,{}),`Draft report`]}),(0,Q.jsxs)(W,{variant:`outline`,size:`sm`,onClick:r,children:[(0,Q.jsx)(a,{}),`Ask in chat`]}),(0,Q.jsxs)(W,{variant:`ghost`,size:`sm`,onClick:i,disabled:!e.lines.length,children:[(0,Q.jsx)(k,{}),`Show in Logs`]}),e.cls!==`bug`&&(0,Q.jsxs)(W,{variant:`ghost`,size:`sm`,onClick:n,children:[(0,Q.jsx)(Ae,{}),`Report anyway`]}),(0,Q.jsxs)(W,{variant:`ghost`,size:`sm`,className:`ml-auto`,onClick:o,children:[(0,Q.jsx)(L,{}),e.cls===`expected`?`Hide`:`Dismiss`]})]})]})}var Un=[[`home`,`Home folder`,`/home/you → ~`],[`email`,`Email addresses`,`you@example.com → <email>`],[`chats`,`Chat ids`,`53952680-0b07-… → 53952680`],[`projects`,`Project names`,`my-app → <project>`]],Wn=700,Gn=null;function Kn(){return Gn??=Oe().catch(()=>(Gn=null,[])),Gn}var qn=e=>e.replace(/^Claude\s+/i,``);function Jn(e){return e.split(/(\u0001[^\u0002]*\u0002)/).map((e,t)=>e.startsWith(``)?(0,Q.jsx)(`mark`,{children:e.slice(1,-1)},t):(0,Q.jsx)(Z.Fragment,{children:e},t))}function Yn(e){return e.startsWith(`### `)?(0,Q.jsx)(`span`,{className:`h`,children:Jn(e)}):/^(<\/?(details|summary|sub)\b|`{3,}|~{3,})/.test(e)?(0,Q.jsx)(`span`,{className:`c`,children:Jn(e)}):Jn(e)}function Xn({utc:e,phone:t,issues:n,goTo:r,showInLogs:a}){let s=Kt(),{snippets:c,fields:u,status:d,stale:f,fresh:m,error:h,model:g,basis:_,view:ee,envOff:b,priv:x}=s,S=H(e=>e.projects).map(e=>e.name),[C,w]=(0,Z.useState)(null),[T,D]=(0,Z.useState)(null),[k,A]=(0,Z.useState)(null);(0,Z.useEffect)(()=>{let e=!0;return Ht().then(t=>{e&&w(t)},()=>{e&&w([])}),Kn().then(t=>{e&&D(t)}),()=>{e=!1}},[]);let j=(0,Z.useMemo)(()=>({home:x.home,email:x.email,chats:x.chats,projects:x.projects?S:[]}),[x.home,x.email,x.chats,x.projects,S.join(`
8
- `)]),ne=(0,Z.useMemo)(()=>(C??[]).filter(([e])=>!b.includes(e)),[C,b]),P=gt(u.title.trim(),j),F=(0,Z.useMemo)(()=>Et({fields:u,snippets:c,environment:ne,redact:j}),[u,c,ne,j]),I=Dt(P,u.labels,F),L=I.length>vt,ie=L?Dt(P,u.labels,null):I,oe=c.reduce((e,t)=>e+xt(t),0),z=d===`drafting`,B=u.title.trim();if((0,Z.useEffect)(()=>{if(A(null),B.length<8)return;let e=!0,t=setTimeout(()=>{Xe(gt(B,j)).then(t=>{e&&A(t)},()=>{})},Wn);return()=>{e=!1,clearTimeout(t)}},[B,j]),!c.length&&d===`none`)return(0,Q.jsx)(`div`,{className:`lg-pane`,children:(0,Q.jsxs)(`div`,{className:`lg-rep-empty`,"data-testid":`logs-report-empty`,children:[(0,Q.jsx)(`div`,{className:`lg-ai-ic`,children:(0,Q.jsx)(Ae,{})}),(0,Q.jsx)(`h3`,{children:`Nothing in the report yet`}),(0,Q.jsxs)(`p`,{children:[`Select lines in Logs and choose `,(0,Q.jsx)(`b`,{children:`Add to report`}),`. Or open Issues: AI may already have found something worth reporting.`]}),(0,Q.jsxs)(`div`,{className:`row`,children:[(0,Q.jsxs)(W,{variant:`outline`,size:`sm`,className:V(t&&`min-h-11`),onClick:()=>r(`logs`),children:[(0,Q.jsx)(v,{}),`Go to Logs`]}),(0,Q.jsxs)(W,{size:`sm`,className:V(t&&`min-h-11`),onClick:()=>r(`issues`),children:[(0,Q.jsx)(E,{}),`See what AI found`]})]})]})});let se=()=>{L?U(F).then(e=>{e?R.success(`Body copied. Paste it into the issue that just opened.`):R.error(`Could not copy the body. Use Copy as Markdown, then paste it into the issue.`)}):R.success(`Opened the new issue on GitHub. Check it there, then press Submit.`)},ce=async()=>{await U(Ot(P,F))?R.success(`Copied the issue as Markdown`):R.error(`Could not copy the issue`)},le=e=>{let t=s.remove(e.id);t&&R(`Removed ${X(xt(e),`line`)} from the report`,{action:{label:`Undo`,onClick:()=>Kt.getState().restore(t.snippet,t.index)}})},q=()=>void s.draft(),pe=g??n.data?.model??`Claude Haiku 4.5`,J=d===`done`?(0,Q.jsx)(E,{className:`ai`}):null,me=Math.min(100,I.length/vt*100),he=(e,t)=>(0,Q.jsx)(W,{asChild:!0,className:t,children:(0,Q.jsxs)(`a`,{href:ie,target:`_blank`,rel:`noopener noreferrer`,onClick:se,children:[(0,Q.jsx)(Ae,{}),e]})});return(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsx)(`div`,{className:`lg-pane`,"data-testid":`logs-report`,children:(0,Q.jsxs)(`div`,{className:`lg-rep`,children:[(0,Q.jsxs)(`div`,{className:`lg-rep-main`,children:[(0,Q.jsxs)(`div`,{className:`lg-rep-top`,children:[(0,Q.jsxs)(`h3`,{children:[(0,Q.jsx)(Ae,{}),`New issue for `,Je]}),(0,Q.jsxs)(`div`,{className:`lg-seg`,role:`tablist`,"aria-label":`Write or preview`,children:[(0,Q.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":ee===`write`,onClick:()=>s.setView(`write`),children:`Write`}),(0,Q.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":ee===`preview`,onClick:()=>s.setView(`preview`),children:`Preview`})]}),(0,Q.jsx)(`p`,{children:`Nothing is sent from here. GitHub opens with this filled in, and you submit it there.`})]}),ee===`preview`?(0,Q.jsxs)(`pre`,{className:`lg-md`,"data-testid":`logs-report-preview`,children:[(0,Q.jsx)(`span`,{className:`c`,children:`Title: `}),u.title.trim()?Jn(gt(u.title.trim(),j,!0)):(0,Q.jsx)(`span`,{className:`c`,children:`(no title yet)`}),`
9
- `,(0,Q.jsxs)(`span`,{className:`c`,children:[`Labels: `,u.labels.join(`, `)||`none`]}),`
10
-
11
- `,Et({fields:u,snippets:c,environment:ne,redact:j,mark:!0}).split(`
12
- `).map((e,t)=>(0,Q.jsxs)(Z.Fragment,{children:[Yn(e),`
13
- `]},t))]}):(0,Q.jsxs)(Q.Fragment,{children:[d===`done`?(0,Q.jsxs)(`div`,{className:`lg-aidone`,children:[(0,Q.jsx)(p,{}),(0,Q.jsx)(`span`,{children:h?(0,Q.jsxs)(`span`,{className:`text-error`,children:[`Could not write it again: `,h]}):f?`You changed the lines after Claude wrote this.`:(0,Q.jsxs)(Q.Fragment,{children:[`Drafted by `,(0,Q.jsx)(`b`,{children:pe}),` from `,X(_,`line`),`. Read it over before sending.`]})}),(0,Q.jsxs)(W,{variant:`ghost`,size:`xs`,className:`ml-auto`,onClick:q,children:[(0,Q.jsx)(te,{}),f?`Write again`:`Redo`]})]}):(0,Q.jsxs)(`div`,{className:`lg-aibox`,children:[(0,Q.jsx)(`span`,{className:`lg-ai-ic`,children:(0,Q.jsx)(E,{})}),(0,Q.jsxs)(`div`,{className:`lg-aibox-txt`,children:[(0,Q.jsx)(`b`,{children:z?`Writing the report…`:`Let AI write it up`}),(0,Q.jsx)(`span`,{children:z?`Reading ${X(oe,`line`)} and the environment.`:`Claude reads the ${X(oe,`line`)} below and fills in the title, what happened, the steps and what you expected.`}),h&&!z&&(0,Q.jsxs)(`span`,{className:`err`,children:[`Could not write it: `,h]})]}),(0,Q.jsx)(`div`,{className:`lg-aibox-act`,children:z?(0,Q.jsxs)(`span`,{className:`lg-analyzing`,children:[(0,Q.jsx)(ae,{className:`animate-spin`}),`Drafting`]}):(0,Q.jsxs)(Q.Fragment,{children:[(0,Q.jsxs)(`span`,{className:`lg-modelchip`,children:[(0,Q.jsx)(E,{}),qn(pe)]}),(0,Q.jsxs)(W,{size:`sm`,className:V(t&&`min-h-11`),disabled:!oe,onClick:q,children:[(0,Q.jsx)(E,{}),`Draft with AI`]})]})})]}),(0,Q.jsxs)(`div`,{className:`lg-field`,children:[(0,Q.jsxs)(`label`,{htmlFor:`lg-rep-title`,children:[`Title`,J]}),z?(0,Q.jsx)(`div`,{className:`lg-skel`}):(0,Q.jsx)(`input`,{id:`lg-rep-title`,className:V(`lg-input`,m&&`lg-filled`),value:u.title,onChange:e=>s.setFields({title:e.target.value}),placeholder:`What went wrong, in one line`})]}),(0,Q.jsxs)(`div`,{className:`lg-field`,children:[(0,Q.jsx)(`span`,{className:`lbl`,children:`Labels`}),(0,Q.jsxs)(`div`,{className:`lg-labels`,children:[u.labels.map(e=>(0,Q.jsxs)(`span`,{className:`lg-label`,children:[e,(0,Q.jsx)(`button`,{type:`button`,className:`x`,"aria-label":`Remove ${e}`,onClick:()=>s.setFields({labels:u.labels.filter(t=>t!==e)}),children:(0,Q.jsx)(O,{})})]},e)),(0,Q.jsxs)(fe,{children:[(0,Q.jsx)(ue,{asChild:!0,children:(0,Q.jsxs)(`button`,{type:`button`,className:`lg-label add`,children:[(0,Q.jsx)(y,{}),`Add label`]})}),(0,Q.jsxs)(de,{align:`start`,className:`max-h-72 min-w-48`,children:[(0,Q.jsx)(G,{className:`text-xs font-normal text-text-subtle`,children:`Add a label`}),T===null&&(0,Q.jsx)(G,{className:`text-xs font-normal`,children:`Reading the labels…`}),T?.filter(e=>!u.labels.includes(e)).map(e=>(0,Q.jsx)(K,{onSelect:()=>s.setFields({labels:[...u.labels,e]}),children:e},e)),T&&!T.some(e=>!u.labels.includes(e))&&(0,Q.jsx)(G,{className:`text-xs font-normal`,children:T.length?`No more labels`:`Could not read the labels`})]})]})]})]}),(0,Q.jsx)(Zn,{id:`lg-rep-what`,label:`What happened`,mark:J,busy:z,fresh:m,rows:3,value:u.what,placeholder:`What you were doing and what went wrong`,onChange:e=>s.setFields({what:e})}),(0,Q.jsxs)(`div`,{className:`lg-grid2`,children:[(0,Q.jsx)(Zn,{id:`lg-rep-steps`,label:`Steps to reproduce`,mark:J,busy:z,fresh:m,rows:4,value:u.steps,placeholder:`1. …`,onChange:e=>s.setFields({steps:e})}),(0,Q.jsx)(Zn,{id:`lg-rep-expected`,label:`Expected`,mark:J,busy:z,fresh:m,rows:4,value:u.expected,placeholder:`What should have happened`,onChange:e=>s.setFields({expected:e})})]}),(0,Q.jsxs)(`div`,{className:`lg-field`,children:[(0,Q.jsxs)(`span`,{className:`lbl`,children:[`Log lines `,(0,Q.jsxs)(`span`,{className:`font-normal text-text-subtle`,children:[X(oe,`line`),` from `,X(c.length,`place`)]})]}),(0,Q.jsx)(`div`,{className:`lg-snips`,children:c.map(t=>(0,Q.jsx)(Qn,{s:t,utc:e,onContext:e=>void s.setContext(t.id,e),onShow:()=>a(t.rows.map(e=>e.entry)),onRemove:()=>le(t)},t.id))}),(0,Q.jsxs)(`button`,{type:`button`,className:`lg-addmore`,onClick:()=>{r(`logs`),R(`Select lines, then choose Add to report`)},children:[(0,Q.jsx)(y,{}),`Add lines from Logs`]})]})]})]}),(0,Q.jsxs)(`aside`,{className:`lg-rep-side`,children:[(0,Q.jsx)(`div`,{className:`lg-card`,children:(0,Q.jsxs)(`div`,{className:`lg-send`,children:[(0,Q.jsxs)(`div`,{children:[(0,Q.jsxs)(`div`,{className:`lg-meter-l`,children:[(0,Q.jsx)(`span`,{children:L?`Too long for a link`:`Fits in a GitHub link`}),(0,Q.jsxs)(`span`,{children:[(I.length/1024).toFixed(1),` / `,vt/1024,` KB`]})]}),(0,Q.jsx)(`div`,{className:V(`lg-meter`,me>85&&`warn`),children:(0,Q.jsx)(`i`,{style:{width:`${me.toFixed(1)}%`}})})]}),!t&&(0,Q.jsxs)(Q.Fragment,{children:[he(L?`Copy body and open GitHub`:`Open GitHub issue`,`w-full`),(0,Q.jsxs)(W,{variant:`outline`,size:`sm`,className:`w-full`,onClick:()=>void ce(),children:[(0,Q.jsx)(re,{}),`Copy as Markdown`]})]}),(0,Q.jsx)(`div`,{className:`lg-send-note`,children:L?`The body is copied for you to paste. The title and labels still go in the link.`:`Opens github.com/${Je}/issues/new in your browser, signed in as you. Labels stick only if you can triage that repository.`}),k&&(0,Q.jsxs)(`div`,{className:V(`lg-dupe`,k.issues.length>0&&`found`),children:[k.issues.length?(0,Q.jsx)(N,{}):(0,Q.jsx)(p,{}),(0,Q.jsx)(`span`,{children:k.issues.length?(0,Q.jsxs)(Q.Fragment,{children:[`Open issues that look like this one:`,(0,Q.jsx)(`ul`,{children:k.issues.slice(0,3).map(e=>(0,Q.jsx)(`li`,{children:(0,Q.jsxs)(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,children:[`#`,e.number,` `,e.title]})},e.number))})]}):(0,Q.jsxs)(Q.Fragment,{children:[`No open issue looks like this one. Searched `,`hienlh/ppm`,` for “`,k.query,`”.`]})})]})]})}),(0,Q.jsxs)(`div`,{className:`lg-card`,children:[(0,Q.jsxs)(`div`,{className:`lg-card-h`,children:[(0,Q.jsx)(l,{}),`Removed before sending`,(0,Q.jsx)(`span`,{className:`sub`,children:`see Preview`})]}),(0,Q.jsxs)(`div`,{className:`lg-priv`,children:[(0,Q.jsxs)(`div`,{className:`lg-priv-row`,children:[(0,Q.jsxs)(`span`,{className:`t`,children:[(0,Q.jsx)(`b`,{children:`Secrets and tokens`}),(0,Q.jsx)(`small`,{children:`API keys, OAuth tokens, tunnel addresses`})]}),(0,Q.jsx)(`span`,{className:`inline-flex`,title:`Always removed`,children:(0,Q.jsx)(o,{className:`lock`})})]}),Un.map(([e,t,n])=>(0,Q.jsxs)(`label`,{className:`lg-priv-row`,children:[(0,Q.jsxs)(`span`,{className:`t`,children:[(0,Q.jsx)(`b`,{children:t}),(0,Q.jsx)(`small`,{children:n})]}),(0,Q.jsx)(He,{checked:x[e],onCheckedChange:()=>s.togglePriv(e)})]},e))]})]}),(0,Q.jsxs)(`div`,{className:`lg-card`,children:[(0,Q.jsxs)(`div`,{className:`lg-card-h`,children:[(0,Q.jsx)(M,{}),`Environment`,(0,Q.jsx)(`span`,{className:`sub`,children:`untick to leave out`})]}),(0,Q.jsxs)(`div`,{className:`lg-card-b lg-env`,children:[C===null&&(0,Q.jsx)(`span`,{className:`text-xs text-text-subtle`,children:`Reading…`}),C?.map(([e,t])=>{let n=!b.includes(e);return(0,Q.jsxs)(`label`,{children:[(0,Q.jsx)(`input`,{type:`checkbox`,className:`sr-only`,checked:n,onChange:()=>s.toggleEnv(e)}),(0,Q.jsx)(`span`,{className:`lg-check`,"aria-hidden":`true`,"data-on":n,children:n&&(0,Q.jsx)(i,{})}),(0,Q.jsx)(`b`,{children:e}),(0,Q.jsx)(`span`,{className:`v`,children:t})]},e)})]})]})]})]})}),t&&(0,Q.jsxs)(`div`,{className:`lg-pfoot`,children:[(0,Q.jsxs)(W,{variant:`outline`,className:`min-h-11 flex-1`,onClick:()=>void ce(),children:[(0,Q.jsx)(re,{}),`Copy`]}),he(`Open on GitHub`,`min-h-11 flex-1`)]})]})}function Zn({id:e,label:t,mark:n,busy:r,fresh:i,rows:a,value:o,placeholder:s,onChange:c}){return(0,Q.jsxs)(`div`,{className:`lg-field`,children:[(0,Q.jsxs)(`label`,{htmlFor:e,children:[t,n]}),r?(0,Q.jsx)(`div`,{className:`lg-skel tall`}):(0,Q.jsx)(`textarea`,{id:e,className:V(`lg-textarea`,i&&`lg-filled`),rows:a,value:o,placeholder:s,onChange:e=>c(e.target.value)})]})}function Qn({s:e,utc:t,onContext:n,onShow:r,onRemove:i}){let a=qt[e.src],o=e.rows[0],s=e.rows[e.rows.length-1];return(0,Q.jsxs)(`div`,{className:`lg-snip`,children:[(0,Q.jsxs)(`div`,{className:`lg-snip-h`,children:[(0,Q.jsxs)(`span`,{className:`src`,children:[(0,Q.jsx)(a,{}),J(e.src)]}),(0,Q.jsxs)(`span`,{className:`rng`,children:[o&&s?xe(o.entry.ts,s.lastTs,t):``,` · `,X(xt(e),`line`)]}),(0,Q.jsxs)(`span`,{className:`lg-ctxsel`,children:[`Context`,yt.map(t=>(0,Q.jsx)(`button`,{type:`button`,"aria-pressed":e.ctx===t,onClick:()=>n(t),children:t?`±${t}`:`none`},t))]}),(0,Q.jsxs)(`span`,{className:`end`,children:[(0,Q.jsx)(W,{variant:`ghost`,size:`icon-xs`,title:`Show in Logs`,"aria-label":`Show in Logs`,onClick:r,children:(0,Q.jsx)(k,{})}),(0,Q.jsx)(W,{variant:`ghost`,size:`icon-xs`,title:`Take out of the report`,"aria-label":`Take out of the report`,onClick:i,children:(0,Q.jsx)(O,{})})]})]}),(0,Q.jsx)(`div`,{className:`lg-snip-b`,children:bt(e).map((e,n)=>(0,Q.jsx)(Qt,{row:e.row,utc:t,ctx:e.ctx},n))})]})}var $n={logs:`Logs`,issues:`Issues`,report:`Report`};function er({mode:e,initialView:t=`logs`,onViewChange:n}){let r=e===`phone`,[i,a]=(0,Z.useState)(t),[o,c]=(0,Z.useState)(Y),[l,u]=(0,Z.useState)(`1h`),[d,f]=(0,Z.useState)(!1),[p,m]=(0,Z.useState)(!0),[h,g]=(0,Z.useState)($),[_,v]=(0,Z.useState)(!1),[ee,y]=(0,Z.useState)(null),[b,x]=(0,Z.useState)(null),S=(0,Z.useRef)(null),C=B(e=>e.logsUtc),te=B(e=>e.logsWrap),w=zt(o,l,d),T=(0,Z.useMemo)(()=>ke(w.entries),[w.entries]),D=Bt(),O=Kt(e=>e.snippets.reduce((e,t)=>e+xt(t),0)),k=(0,Z.useRef)(n);k.current=n;let A=(0,Z.useCallback)(e=>{a(e),k.current?.(e)},[]),j=(0,Z.useCallback)(e=>{c(t=>({...t,...e})),g($)},[]),M=(0,Z.useCallback)(e=>{u(e),g($)},[]),ne=(0,Z.useCallback)(()=>{c(e=>({...Y,src:e.src})),u(`1h`),g($)},[]),N=(0,Z.useCallback)(e=>{g(e),e.keys.size&&m(!1)},[]),P=(0,Z.useCallback)(e=>{e&&((e.chat||e.src)&&(c({...Y,src:e.src??`all`,chat:e.chat??null}),e.chat&&u(`all`),g($),m(!0)),e.view?A(e.view):(e.chat||e.src)&&A(`logs`))},[A]);(0,Z.useEffect)(()=>{P(Ke());let e=()=>P(Ke());return window.addEventListener(tt,e),()=>window.removeEventListener(tt,e)},[P]);let F=(0,Z.useCallback)(e=>{if(!e.length)return;let t=e.reduce((e,t)=>t.ts<e.ts?t:e),n={...Y,src:St(e),levels:{...Y.levels,debug:e.some(e=>e.lv===`debug`)}},r=ge(t.ts,Date.now());c(n),u(r),g($),m(!1),x({ids:e.map(e=>e.id),key:It(n,r),reach:t.id,reached:!1}),A(`logs`)},[A]);(0,Z.useEffect)(()=>{if(!b||w.key!==b.key||w.loading||w.loadingEarlier||!w.meta)return;let e=new Set(b.ids),t=T.filter(t=>t.ids.some(t=>e.has(t)));if(t.reduce((t,n)=>t+n.ids.filter(t=>e.has(t)).length,0)<e.size&&w.meta.hasMore&&!b.reached){x({...b,reached:!0}),w.loadEarlier(b.reach);return}if(x(null),!t.length){R(w.meta.reachMissed===`far`?`Those lines are too far back to show here`:`Those lines are no longer kept`);return}g({keys:new Set(t.map(e=>e.key)),anchor:t[0].key,cursor:t[t.length-1].key}),y({key:t[0].key,seq:Date.now()})},[b,w,T]);let[I,re]=(0,Z.useState)(!1),L=(0,Z.useRef)(O);(0,Z.useEffect)(()=>{let e=O>L.current;if(L.current=O,!e)return;re(!0);let t=setTimeout(()=>re(!1),1200);return()=>clearTimeout(t)},[O]);let ie=D.data?.issues.filter(e=>e.cls!==`expected`&&!e.dismissed).length??0,ae={feed:w,rows:T,filter:o,setFilter:j,clearFilters:ne,range:l,setRange:M,paused:d,setPaused:f,follow:p,setFollow:m,sel:h,setSel:N,utc:C,wrap:r||te,reveal:ee,listTop:S,goTo:A,togglePrefs:()=>v(e=>!e)},oe={utc:C,phone:r,issues:D,goTo:A,showInLogs:F};return(0,Q.jsxs)(`div`,{className:`lg-app`,"data-mode":r?`phone`:`window`,"data-testid":`logs-app`,children:[r&&(0,Q.jsxs)(`div`,{className:`lg-head`,children:[(0,Q.jsx)(`h2`,{children:`Logs`}),(0,Q.jsx)($t,{paused:d,pending:w.pausedCount})]}),(0,Q.jsxs)(`div`,{className:`lg-tabs`,role:`tablist`,"aria-label":`Logs`,children:[Ge.map(e=>(0,Q.jsxs)(`button`,{type:`button`,role:`tab`,"aria-selected":i===e,onClick:()=>A(e),"data-testid":`logs-tab-${e}`,className:V(`inline-flex min-h-11 shrink-0 items-center px-4 text-sm font-medium transition-colors`,i===e?`-mb-px border-b-2 border-primary text-text-primary`:`text-text-subtle hover:text-text-secondary`),children:[e===`issues`&&(0,Q.jsx)(E,{className:`lg-tab-ai`}),$n[e],e===`issues`&&ie>0&&(0,Q.jsx)(`span`,{className:`lg-tabn`,children:ie}),e===`report`&&O>0&&(0,Q.jsx)(`span`,{className:V(`lg-tabn acc`,I&&`pulse`),children:O.toLocaleString(`en-US`)})]},e)),!r&&(0,Q.jsxs)(`div`,{className:`ml-auto flex shrink-0 items-center gap-2 pl-3 pr-1`,children:[(0,Q.jsx)($t,{paused:d,pending:w.pausedCount}),(0,Q.jsx)(`button`,{type:`button`,"aria-label":`Logs preferences`,"aria-expanded":_,onClick:()=>v(e=>!e),className:V(`flex size-11 items-center justify-center rounded transition-colors md:size-8`,_?`bg-primary/10 text-primary`:`text-text-subtle hover:bg-surface-hover hover:text-text-secondary`),children:(0,Q.jsx)(s,{className:`size-4`})})]})]}),_&&!r&&(0,Q.jsx)(tr,{auto:D.data?.auto,setAuto:D.setAuto,files:w.meta?.files}),(0,Q.jsx)(`div`,{className:`lg-body`,children:i===`logs`?r?(0,Q.jsx)(Pn,{...ae}):(0,Q.jsx)(Dn,{...ae}):i===`issues`?(0,Q.jsx)(Bn,{...oe}):(0,Q.jsx)(Xn,{...oe})})]})}function tr({auto:e,setAuto:t,files:n}){let r=B(e=>e.logsUtc),i=B(e=>e.setLogsUtc),a=B(e=>e.logsBadge),o=B(e=>e.setLogsBadge);return(0,Q.jsxs)(`div`,{className:`lg-prefs`,"data-testid":`logs-prefs`,children:[(0,Q.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[`Times`,(0,Q.jsxs)(`button`,{type:`button`,className:`lg-chip`,"aria-pressed":!r,onClick:()=>i(!1),children:[`Local (`,Te(),`)`]}),(0,Q.jsx)(`button`,{type:`button`,className:`lg-chip`,"aria-pressed":r,onClick:()=>i(!0),children:`UTC`})]}),(0,Q.jsxs)(`label`,{children:[(0,Q.jsx)(He,{checked:a,onCheckedChange:o}),`Red dot on the Logs button for a likely bug`]}),(0,Q.jsxs)(`label`,{children:[(0,Q.jsx)(He,{checked:!!e,disabled:e===void 0,onCheckedChange:e=>void t(e)}),`Let AI sort new errors and warnings`]}),n&&(0,Q.jsxs)(`span`,{children:[`Keeps `,(0,Q.jsxs)(`b`,{children:[n.generations,` × `,Ee(n.capBytes)]}),` of ppm.log and `,(0,Q.jsx)(`b`,{children:X(n.browserRetentionDays,`day`)}),` of browser logs`]})]})}export{er as t};
@@ -1 +0,0 @@
1
- import{E as e}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import"./icons-C1wDt09O.js";import"./api-client-BnYFnEfK.js";import"./settings-store-CBJCnE5L.js";import"./portal-container-context-Gepuvxdg.js";import"./window-store-UcSFgNCI.js";import"./panel-store-Dx2ziBLp.js";import"./project-store-Bs-kiU8m.js";import"./project-framework-store-nuePqBBa.js";import"./session-list-sync-triggers-D9i1FxWd.js";import"./tab-store-B4v2kAEY.js";import"./use-is-mobile-CL2I7hLf.js";import"./button-BHGVTbam.js";import"./dropdown-menu-CxZR_vuV.js";import"./mobile-bottom-sheet-M9pZptfh.js";import"./use-visual-viewport-B_GFo6k2.js";import"./send-to-chat-B7oUVcgh.js";import{t}from"./logs-app-xQ2UsN4G.js";var n=e(),r=()=>(0,n.jsx)(t,{mode:`phone`});export{r as LogsTab};
@@ -1 +0,0 @@
1
- import"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import"./api-client-BnYFnEfK.js";import{Ui as e}from"./index-Cx9ZRibz.js";export{e as useNotificationStore};
@@ -1 +0,0 @@
1
- import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import{A as r,Cn as i,gt as a,hr as o,j as s,pr as c,qr as l,ut as u,wn as d,xn as f}from"./icons-C1wDt09O.js";import{k as p,n as m,r as h}from"./api-client-BnYFnEfK.js";import"./settings-store-CBJCnE5L.js";import{n as g}from"./utils-D3xTlJyU.js";import"./portal-container-context-Gepuvxdg.js";import"./window-store-UcSFgNCI.js";import"./panel-store-Dx2ziBLp.js";import"./project-store-Bs-kiU8m.js";import"./project-framework-store-nuePqBBa.js";import"./session-list-sync-triggers-D9i1FxWd.js";import"./tab-store-B4v2kAEY.js";import"./use-is-mobile-CL2I7hLf.js";import"./settings-categories-BY9n3BRr.js";import{t as _}from"./open-settings-BGtoVEAU.js";import{r as v}from"./clipboard-D3XnL7CB.js";import{t as y}from"./button-BHGVTbam.js";import"./dialog-DnE192fh.js";import"./mobile-bottom-sheet-M9pZptfh.js";import"./use-visual-viewport-B_GFo6k2.js";import{An as b,Fn as x,In as S,Ln as C,Nn as w,On as T,Rn as E,Zn as D,fn as O,i as ee,jr as k,s as te}from"./index-Cx9ZRibz.js";import{a as A,i as j,n as M,r as N,t as P}from"./review-address-setup-CU1A_NfZ.js";import"./run-in-terminal-EVMb5TjW.js";import{t as F}from"./run-in-terminal-button-CsYq6Xqo.js";var I=e(t(),1),L={state:()=>h.get(`/api/tailscale/state`),login:()=>h.post(`/api/tailscale/login`),cancelLogin:()=>h.post(`/api/tailscale/login/cancel`),setService:e=>h.post(`/api/tailscale/service`,e)};function R(e){return e.installed?e.backendState===null?`start`:e.canManage===!1?`operator`:e.backendState===`Running`?!e.magicDns||!e.httpsCertificates?`dns`:e.device?.tags.length?e.service.defined?null:`service`:`tag`:`sign-in`:`install`}function ne(e){let t=R(e);return t===`service`?null:t}var z=/^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;function re(e){return e?e.length>63?`Use at most 63 characters.`:z.test(e)?null:`Use lowercase letters, digits and dashes, starting and ending with a letter or digit.`:`Enter a name.`}var B={dns:`https://login.tailscale.com/admin/dns`,accessControls:`https://login.tailscale.com/admin/acls/file`,machines:`https://login.tailscale.com/admin/machines`,services:`https://login.tailscale.com/admin/services`},V=n(),H=[`install`,`start`,`operator`,`sign-in`,`dns`,`tag`,`service`],U={install:`Install Tailscale`,start:`Start Tailscale`,operator:`Let PPM manage Tailscale`,"sign-in":`Sign in to Tailscale`,dns:`Turn on MagicDNS and HTTPS`,tag:`Tag this machine`,service:`Create the service`},ie={darwin:`https://tailscale.com/download/mac`,win32:`https://tailscale.com/download/windows`},ae=`curl -fsSL https://tailscale.com/install.sh | sh`,oe=`sudo systemctl enable --now tailscaled`,W=e=>`sudo tailscale set --operator=${/^[\w.@-]+$/.test(e)?e:`'${e.replace(/'/g,`'\\''`)}'`}`,se=`tag:ppm`,ce=e=>`"tagOwners": {\n "${e}": ["autogroup:admin"]\n}`;function le({state:e,onRefresh:t,onSignIn:n,onShowSignIn:r}){let i=R(e),a=i?H.indexOf(i):H.length,s=H.filter(t=>t===`start`?i===`start`:t===`operator`?e.platform===`linux`:!0),c=e=>H.indexOf(e)<a?`done`:e===i?`current`:`todo`,l=(0,V.jsxs)(y,{variant:`outline`,onClick:t,className:`min-h-11 cursor-pointer md:min-h-9`,children:[(0,V.jsx)(o,{className:`size-3.5`}),`Check again`]}),u=e.device?.name||`this machine`,p=e.service.name,m=e.osUser&&e.osUser!==`root`?` && ${W(e.osUser)}`:``,h=`${ae}${m}`,_=`${oe}${m}`,v=`PPM types it into a terminal on this machine; press Enter there and give your password once.`,b={install:()=>e.platform===`linux`?(0,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)(G,{children:[`This installs Tailscale, starts it`,m?` and lets PPM manage it`:``,`. `,v]}),(0,V.jsx)(C,{code:h}),(0,V.jsxs)(q,{children:[(0,V.jsx)(F,{command:h,label:`Install in terminal`}),l]})]}):(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(G,{children:`Install the Tailscale app on the machine PPM runs on and open it once.`}),(0,V.jsxs)(q,{children:[(0,V.jsx)(E,{href:ie[e.platform]??`https://tailscale.com/download`,children:`Download Tailscale`}),l]})]}),start:()=>e.platform===`linux`?(0,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)(G,{children:[`Tailscale is installed, but its service is not running. `,v]}),(0,V.jsx)(C,{code:_}),(0,V.jsxs)(q,{children:[(0,V.jsx)(F,{command:_,label:`Start in terminal`}),l]})]}):(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(G,{children:`Tailscale is installed, but not running. Open the Tailscale app on this machine.`}),(0,V.jsx)(q,{children:l})]}),operator:()=>(0,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)(G,{children:[`On Linux, Tailscale only takes changes from root and from one user it trusts. PPM runs as `,(0,V.jsx)(K,{children:e.osUser}),`, which has to be named once. `,v]}),(0,V.jsx)(C,{code:W(e.osUser)}),(0,V.jsxs)(q,{children:[(0,V.jsx)(F,{command:W(e.osUser),label:`Run in terminal`}),l]})]}),"sign-in":()=>{if(e.login.state===`starting`||e.login.state===`waiting`)return(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(G,{children:`Waiting for you to finish signing in.`}),(0,V.jsx)(q,{children:(0,V.jsx)(y,{onClick:r,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Show sign-in link`})})]});if(e.backendState===`NeedsMachineAuth`)return(0,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)(G,{children:[`Signed in. An admin has to approve `,u,` before it joins the tailnet.`]}),(0,V.jsxs)(q,{children:[(0,V.jsx)(E,{href:B.machines,children:`Open machines`}),l]})]});if(e.backendState===`Starting`)return(0,V.jsxs)(G,{children:[(0,V.jsx)(f,{className:`mr-2 inline size-4 animate-spin`}),`Connecting to Tailscale…`]});let t=e.backendState===`Stopped`;return(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(G,{children:t?`Tailscale is turned off on this machine.`:`Sign this machine in with the account that owns your tailnet.`}),(0,V.jsx)(q,{children:(0,V.jsxs)(y,{onClick:n,className:`min-h-11 cursor-pointer md:min-h-9`,children:[(0,V.jsx)(d,{className:`size-4`}),t?`Turn on`:`Sign in`]})})]})},dns:()=>(0,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)(G,{children:[`In `,(0,V.jsx)(`b`,{children:`DNS`}),`, turn on `,(0,V.jsx)(`b`,{children:`MagicDNS`}),`, then choose `,(0,V.jsx)(`b`,{children:`Enable HTTPS`}),` under HTTPS Certificates. Every .ts.net address needs both.`]}),(0,V.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`MagicDNS `,e.magicDns?`on`:`off`,` · HTTPS `,e.httpsCertificates?`on`:`off`]}),(0,V.jsxs)(q,{children:[(0,V.jsx)(E,{href:B.dns,children:`Open DNS settings`}),l]})]}),tag:()=>(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(G,{children:`Tailscale only lets a tagged machine host a service.`}),(0,V.jsxs)(`ol`,{className:`list-decimal space-y-3 pl-5 text-sm leading-relaxed text-muted-foreground`,children:[(0,V.jsxs)(`li`,{className:`space-y-2`,children:[(0,V.jsxs)(`p`,{children:[`In `,(0,V.jsx)(`b`,{children:`Access controls`}),`, let admins hand out the tag (once per tailnet):`]}),(0,V.jsx)(C,{code:ce(se)}),(0,V.jsx)(E,{href:B.accessControls,children:`Open access controls`})]}),(0,V.jsxs)(`li`,{className:`space-y-2`,children:[(0,V.jsxs)(`p`,{children:[`In `,(0,V.jsx)(`b`,{children:`Machines`}),`, open the menu of `,u,`, choose `,(0,V.jsx)(`b`,{children:`Edit tags`}),` and add `,(0,V.jsx)(K,{children:se}),`.`]}),(0,V.jsx)(E,{href:B.machines,children:`Open machines`})]})]}),(0,V.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`A tagged machine belongs to the tag rather than to your account.`}),(0,V.jsx)(q,{children:l})]}),service:()=>(0,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)(G,{children:[`In `,(0,V.jsx)(`b`,{children:`Services`}),`, choose `,(0,V.jsx)(`b`,{children:`Advertise`}),`, then `,(0,V.jsx)(`b`,{children:`Define a Service`}),`: name it `,(0,V.jsx)(K,{children:p}),` and give it the port `,(0,V.jsx)(K,{children:`tcp:443`}),`.`]}),(0,V.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`The address can be turned on before this; it then waits for the service and for an admin to approve this machine.`}),(0,V.jsxs)(q,{children:[(0,V.jsx)(E,{href:B.services,children:`Open services`}),l]})]})},x={operator:`PPM can change Tailscale's settings.`,"sign-in":e.device?.dnsName?`Signed in as ${e.device.dnsName}`:void 0,dns:`MagicDNS and HTTPS are on.`,tag:e.device?.tags.length?`Tagged ${e.device.tags.join(`, `)}`:void 0,service:`svc:${p} exists in your tailnet.`};return(0,V.jsx)(`ol`,{className:`space-y-1`,"data-testid":`tailscale-steps`,children:s.map((e,t)=>{let n=c(e);return(0,V.jsxs)(`li`,{className:`flex gap-3`,"data-step":e,"data-status":n,children:[(0,V.jsx)(ue,{n:t+1,status:n}),(0,V.jsxs)(`div`,{className:`min-w-0 flex-1 space-y-2 pb-4`,children:[(0,V.jsx)(`div`,{className:g(`pt-0.5 text-sm`,n===`todo`?`text-muted-foreground`:`font-medium`),children:U[e]}),n===`done`&&x[e]&&(0,V.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:x[e]}),n===`current`&&b[e]()]})]},e)})})}function ue({n:e,status:t}){return t===`done`?(0,V.jsx)(s,{className:`mt-0.5 size-5 shrink-0 text-success`}):(0,V.jsx)(`span`,{className:g(`mt-0.5 flex size-5 shrink-0 items-center justify-center rounded-full border text-[11px] font-medium`,t===`current`?`border-primary text-primary`:`border-border text-muted-foreground`),children:e})}function G({children:e}){return(0,V.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:e})}function K({children:e}){return(0,V.jsx)(`code`,{className:`rounded bg-muted px-1 py-0.5 text-xs text-foreground`,children:e})}function q({children:e}){return(0,V.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:e})}var J=`text-sm leading-relaxed text-muted-foreground`;function de({open:e,login:t,osUser:n,onRetry:r,onCancel:i,onClose:a}){let o=(0,V.jsx)(y,{variant:`outline`,onClick:a,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Close`}),s=(0,V.jsx)(y,{onClick:r,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Try again`}),c,l;if(t.state===`waiting`&&t.url)c=(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`p`,{className:J,children:`Sign in with the account that owns your tailnet. This machine joins as soon as you finish.`}),(0,V.jsxs)(`div`,{className:`flex flex-col items-center gap-2`,children:[(0,V.jsx)(`div`,{className:`rounded-lg p-3`,style:{backgroundColor:`#ffffff`,colorScheme:`light`},children:(0,V.jsx)(O,{value:t.url,size:168,bgColor:`#ffffff`,fgColor:`#000000`,level:`L`,style:{display:`block`}})}),(0,V.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Or scan it with your phone`})]})]}),l=(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(y,{variant:`outline`,onClick:i,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel sign-in`}),(0,V.jsx)(E,{href:t.url,primary:!0,children:`Open sign-in page`})]});else if(t.state===`idle`||t.state===`starting`)c=(0,V.jsxs)(`p`,{className:`flex items-center gap-2 ${J}`,children:[(0,V.jsx)(f,{className:`size-4 animate-spin`}),`Asking Tailscale for a sign-in link…`]}),l=(0,V.jsx)(y,{variant:`outline`,onClick:i,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`});else if(t.state===`success`)c=(0,V.jsx)(`p`,{className:J,children:`Signed in.`}),l=o;else if(t.state===`needs-approval`)c=(0,V.jsx)(`p`,{className:J,children:`Signed in. An admin has to approve this machine before it joins the tailnet.`}),l=(0,V.jsxs)(V.Fragment,{children:[o,(0,V.jsx)(E,{href:B.machines,primary:!0,children:`Open machines`})]});else if(t.state===`needs-operator`){let e=W(n);c=(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`p`,{className:J,children:`Tailscale on this machine only takes changes from root and from one user it trusts. This has to be run once, with your password. PPM types it into a terminal; press Enter there, then sign in again.`}),(0,V.jsx)(C,{code:e})]}),l=(0,V.jsxs)(V.Fragment,{children:[o,(0,V.jsx)(y,{variant:`outline`,onClick:r,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Try again`}),(0,V.jsx)(F,{command:e,label:`Run in terminal`,onRun:a})]})}else c=(0,V.jsx)(`p`,{className:J,children:t.message??`The sign-in was cancelled.`}),l=(0,V.jsxs)(V.Fragment,{children:[o,s]});return(0,V.jsx)(S,{open:e,title:`Sign in to Tailscale`,onClose:a,children:(0,V.jsxs)(`div`,{className:`space-y-4`,"data-testid":`tailscale-sign-in`,children:[c,(0,V.jsx)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:l})]})})}var fe=4e3,Y=e=>e instanceof Error?e.message:String(e);function pe(e){return e.login.state===`starting`||e.login.state===`waiting`||R(e)!==null||e.enabled&&!e.service.approved}function me(e){if(!e)return!1;try{return new URL(e).hostname===window.location.hostname}catch{return!1}}function he(e){return e.enabled?e.backendState===`Running`?e.service.pointsAtPpm?e.service.approved?`On. Open it from any device signed in to your tailnet.`:`On, waiting for an admin to approve this machine.`:`On, but Tailscale is not serving it right now.`:`On, but this machine is not connected to Tailscale.`:`Off.`}function ge(){let[e,t]=(0,I.useState)(null),[n,r]=(0,I.useState)(null),[a,o]=(0,I.useState)(!1),[s,c]=(0,I.useState)(!1),[u,d]=(0,I.useState)(!1),[f,h]=(0,I.useState)(!1),[v,b]=(0,I.useState)(``),x=(0,I.useRef)(0),C=(0,I.useRef)(null),w=(0,I.useCallback)(e=>{x.current++,t(e),r(null)},[]),T=(0,I.useCallback)(e=>{x.current++,t(t=>t&&{...t,login:e})},[]),E=(0,I.useCallback)(async()=>{let e=++x.current;try{let n=await L.state();e===x.current&&(t(n),r(null))}catch(t){e===x.current&&r(Y(t))}},[]);(0,I.useEffect)(()=>{E()},[E]),(0,I.useEffect)(()=>{let e=()=>void E(),t=()=>{document.visibilityState===`visible`&&E()};return window.addEventListener(`tailscale:changed`,e),window.addEventListener(`focus`,e),document.addEventListener(`visibilitychange`,t),()=>{window.removeEventListener(`tailscale:changed`,e),window.removeEventListener(`focus`,e),document.removeEventListener(`visibilitychange`,t)}},[E]);let O=!!e&&pe(e);(0,I.useEffect)(()=>{if(!O)return;let e=setInterval(()=>{document.visibilityState===`visible`&&E()},fe);return()=>clearInterval(e)},[O,E]);let ee=e?.service.name??``;(0,I.useEffect)(()=>{b(ee)},[ee]);let te=e?.login.state;(0,I.useEffect)(()=>{s&&te===`success`&&(c(!1),p.success(`Signed in to Tailscale`))},[s,te]);let A=async()=>{T({state:`starting`,url:null,message:null}),c(!0);try{T(await L.login())}catch(e){T({state:`error`,url:null,message:Y(e)})}},j=async()=>{c(!1);try{T(await L.cancelLogin())}catch{}},M=re(v),N=()=>{!e||v===e.service.name||M||(C.current=(async()=>{o(!0);try{w(await L.setService({name:v}))}catch(t){p.error(`Could not rename the address`,{description:Y(t)}),b(e.service.name)}finally{o(!1)}})())},P=async(e,t=!1)=>{await C.current,o(!0);try{w(await L.setService(e?{enabled:!0,replace:t}:{enabled:!1}))}catch(t){let n=t instanceof m?t.body?.code:void 0;e&&n===`conflict`?d(!0):p.error(e?`Could not turn the address on`:`Could not turn the address off`,{description:Y(t)})}finally{o(!1)}};if(!e)return(0,V.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n?`Could not read Tailscale's state: ${n}`:`Reading Tailscale's state…`});let F=ne(e)!==null,z=e.backendState===`Running`,B=e.authEnabled&&!F&&!M,H=R(e)===null,U=(0,V.jsx)(le,{state:e,onRefresh:()=>void E(),onSignIn:()=>void A(),onShowSignIn:()=>c(!0)});return(0,V.jsxs)(`div`,{className:`space-y-6`,"data-testid":`tailscale-settings`,children:[(0,V.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:`Reach PPM at a private https address from any device signed in to your tailnet. Nothing is opened to the internet, and PPM still asks for its password.`}),(0,V.jsxs)(`section`,{className:`space-y-4 rounded-lg border border-border p-4`,"data-testid":`tailscale-address`,children:[(0,V.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,V.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,V.jsx)(k,{htmlFor:`tailscale-address-switch`,className:`text-sm font-medium`,children:`Private address`}),(0,V.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,"data-testid":`tailscale-address-status`,children:he(e)})]}),(0,V.jsx)(`div`,{className:`flex min-h-11 shrink-0 items-center`,children:(0,V.jsx)(D,{id:`tailscale-address-switch`,checked:e.enabled,disabled:a||!e.enabled&&!B,onCheckedChange:t=>{!t&&me(e.service.url)?h(!0):P(t)}})})]}),e.enabled&&e.service.url?(0,V.jsx)(ve,{url:e.service.url}):(0,V.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,V.jsx)(k,{htmlFor:`tailscale-service-name`,className:`text-xs text-muted-foreground`,children:`Address`}),(0,V.jsxs)(`div`,{className:g(`flex min-h-11 items-center rounded-md border border-input bg-background focus-within:border-ring focus-within:ring-[3px] focus-within:ring-ring/50`,M&&`border-destructive`),children:[(0,V.jsx)(`input`,{id:`tailscale-service-name`,value:v,onChange:e=>b(e.target.value.toLowerCase()),onBlur:N,onKeyDown:e=>{e.key===`Enter`&&e.currentTarget.blur()},disabled:a||e.enabled,"aria-invalid":!!M,spellCheck:!1,autoCapitalize:`none`,autoComplete:`off`,className:`w-20 min-w-20 flex-1 bg-transparent py-2 pl-3 text-sm outline-none`}),(0,V.jsxs)(`span`,{className:`min-w-0 truncate pr-3 text-sm text-muted-foreground`,children:[`.`,e.dnsSuffix??`your-tailnet.ts.net`]})]}),(0,V.jsx)(`p`,{className:g(`text-xs`,M?`text-destructive`:`text-muted-foreground`),children:M??(e.enabled?`Turn the address off to rename it.`:`The address keeps this name when the machine is renamed.`)})]}),!e.enabled&&!e.authEnabled&&(0,V.jsxs)(X,{icon:(0,V.jsx)(i,{className:`size-4`}),children:[(0,V.jsx)(`p`,{children:`PPM's password is off. Turn it on first: anyone in your tailnet could otherwise open PPM.`}),(0,V.jsx)(y,{variant:`outline`,onClick:()=>_(`general`),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Open General`})]}),!e.enabled&&e.authEnabled&&F&&(0,V.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Finish the setup below to turn it on.`}),e.enabled&&z&&!e.service.pointsAtPpm&&(0,V.jsxs)(X,{icon:(0,V.jsx)(l,{className:`size-4 text-warning`}),children:[(0,V.jsx)(`p`,{children:`Tailscale is not serving this address right now.`}),(0,V.jsx)(y,{variant:`outline`,onClick:()=>void P(!0),disabled:a,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Apply again`})]}),e.enabled&&z&&e.service.pointsAtPpm&&!e.service.approved&&(0,V.jsx)(ye,{state:e})]}),H?(0,V.jsxs)(`details`,{className:`group`,children:[(0,V.jsx)(`summary`,{className:`flex min-h-11 cursor-pointer items-center text-sm font-medium`,children:`Setup: every step is done`}),(0,V.jsx)(`div`,{className:`pt-2`,children:U})]}):(0,V.jsxs)(`section`,{className:`space-y-3`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium`,children:`Setup`}),U]}),(0,V.jsx)(de,{open:s,login:e.login,osUser:e.osUser,onRetry:()=>void A(),onCancel:()=>void j(),onClose:()=>c(!1)}),(0,V.jsx)(S,{open:f,title:`Turn off the address you are using?`,onClose:()=>h(!1),children:(0,V.jsxs)(`div`,{className:`space-y-4`,children:[(0,V.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`This page is open at `,e.service.url,`. Turning the address off disconnects it; reach PPM another way to turn it back on.`]}),(0,V.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,V.jsx)(y,{variant:`outline`,onClick:()=>h(!1),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`}),(0,V.jsx)(y,{variant:`destructive`,onClick:()=>{h(!1),P(!1)},className:`min-h-11 cursor-pointer md:min-h-9`,children:`Turn off`})]})]})}),(0,V.jsx)(S,{open:u,title:`Replace svc:${e.service.name}?`,onClose:()=>d(!1),children:(0,V.jsxs)(`div`,{className:`space-y-4`,children:[(0,V.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`On this machine, svc:`,e.service.name,` already serves `,(0,V.jsx)(`code`,{className:`text-xs text-foreground`,children:e.service.target??`something else`}),`. Replacing it points the address at PPM, and what it served stops answering there.`]}),(0,V.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,V.jsx)(y,{variant:`outline`,onClick:()=>d(!1),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`}),(0,V.jsx)(y,{variant:`destructive`,onClick:()=>{d(!1),P(!0,!0)},className:`min-h-11 cursor-pointer md:min-h-9`,children:`Replace`})]})]})})]})}var _e=`flex size-11 shrink-0 cursor-pointer items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-surface-hover hover:text-foreground`;function ve({url:e,qrHint:t=`Scan with a phone that is signed in to your tailnet`}){let[n,i]=(0,I.useState)(!1),[o,s]=(0,I.useState)(!1),l=async()=>{await v(e)&&(i(!0),setTimeout(()=>i(!1),1500))};return(0,V.jsxs)(`div`,{className:`space-y-3`,children:[(0,V.jsxs)(`div`,{className:`flex items-center rounded-md border border-border bg-muted pl-3`,"data-testid":`tailscale-address-url`,children:[(0,V.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-sm`,children:e}),(0,V.jsx)(`button`,{type:`button`,onClick:()=>void l(),"aria-label":`Copy address`,title:`Copy address`,className:_e,children:n?(0,V.jsx)(r,{className:`size-4 text-success`}):(0,V.jsx)(u,{className:`size-4`})}),(0,V.jsx)(`button`,{type:`button`,onClick:()=>s(e=>!e),"aria-label":`Show QR code`,"aria-pressed":o,title:`Show QR code`,className:g(_e,o&&`text-foreground`),children:(0,V.jsx)(c,{className:`size-4`})}),(0,V.jsx)(`a`,{href:e,target:`_blank`,rel:`noopener noreferrer`,"aria-label":`Open address`,title:`Open address`,className:_e,children:(0,V.jsx)(a,{className:`size-4`})})]}),o&&(0,V.jsxs)(`div`,{className:`flex flex-col items-center gap-2`,children:[(0,V.jsx)(`div`,{className:`rounded-lg p-3`,style:{backgroundColor:`#ffffff`,colorScheme:`light`},children:(0,V.jsx)(O,{value:e,size:168,bgColor:`#ffffff`,fgColor:`#000000`,level:`L`,style:{display:`block`}})}),(0,V.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:t})]})]})}function ye({state:e}){let t=`svc:${e.service.name}`,n=e.device?.name||`this machine`,r=`"autoApprovers": {\n "services": {\n "${t}": ["${e.device?.tags[0]??`tag:ppm`}"]\n }\n}`;return(0,V.jsxs)(X,{icon:(0,V.jsx)(l,{className:`size-4 text-warning`}),children:[(0,V.jsx)(`p`,{children:e.service.defined?(0,V.jsxs)(V.Fragment,{children:[`Waiting for approval. In `,(0,V.jsx)(`b`,{children:`Services`}),`, open `,t,` and approve `,n,` under Service hosts.`]}):(0,V.jsxs)(V.Fragment,{children:[`Waiting for the service. Create `,t,` in `,(0,V.jsx)(`b`,{children:`Services`}),` (the last step below), then approve `,n,` as its host.`]})}),(0,V.jsx)(E,{href:B.services,children:`Open services`}),(0,V.jsx)(`p`,{className:`pt-1`,children:`To approve machines with this tag automatically, add this to your access controls:`}),(0,V.jsx)(C,{code:r})]})}function X({icon:e,children:t}){return(0,V.jsxs)(`div`,{className:`flex gap-3 rounded-md border border-border bg-muted px-4 py-3`,children:[(0,V.jsx)(`span`,{className:`mt-0.5 shrink-0 text-muted-foreground`,children:e}),(0,V.jsx)(`div`,{className:`min-w-0 flex-1 space-y-2 text-sm leading-relaxed text-muted-foreground`,children:t})]})}var be=1e4,xe=2e3,Z=e=>e instanceof Error?e.message:String(e);function Se(e){if(!e)return!1;try{return new URL(e).hostname===window.location.hostname}catch{return!1}}function Ce(){let[e,t]=(0,I.useState)(null),[n,r]=(0,I.useState)(null),[a,o]=(0,I.useState)(!1),[s,c]=(0,I.useState)(!1),[u,d]=(0,I.useState)(!1),[m,h]=(0,I.useState)(!1),g=te(),v=(0,I.useCallback)(async()=>{try{t(await T.status()),r(null)}catch(e){r(Z(e))}},[]),x=e?e.enabled??!0:!1,C=x&&!!e&&!e.active;(0,I.useEffect)(()=>{v()},[v]),(0,I.useEffect)(()=>{let e=setInterval(()=>{document.visibilityState===`visible`&&v()},C?xe:be);return()=>clearInterval(e)},[C,v]),(0,I.useEffect)(()=>{let e=()=>{v(),g.refreshStatus()};return window.addEventListener(`focus`,e),()=>window.removeEventListener(`focus`,e)},[v,g.refreshStatus]);let w=async e=>{o(!0),t(t=>t&&{...t,enabled:e});try{await T.setEnabled(e),await v()}catch(n){t(t=>t&&{...t,enabled:!e}),p.error(e?`Could not turn the public link on`:`Could not turn the public link off`,{description:Z(n)})}finally{o(!1)}},E=async()=>{d(!1),h(!0);try{await b.disable(),p.success(`Switched to a temporary address`),await Promise.all([g.refreshStatus(),v()])}catch(e){p.error(`Could not switch to a temporary address`,{description:Z(e)})}finally{h(!1)}};if(!e)return(0,V.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n?`Could not read the public link's state: ${n}`:`Reading the public link's state…`});let O=g.status,A=O?.authEnabled??!0,j=O?.mode??`quick`,M=j===`named`?O?.hostname??null:null,N=!!M&&window.location.hostname===M,P=g.step.k!==`hidden`&&g.step.k!==`ask-domain`,F=j===`named`&&O?.liveMode===`quick`;return(0,V.jsxs)(`div`,{className:`space-y-6`,"data-testid":`public-link-pane`,children:[(0,V.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:`Open PPM from anywhere through a public https link, served by Cloudflare. Anyone who has the link reaches PPM's sign-in page, so keep the password on. For a link only your own devices can open, use Tailscale instead.`}),(0,V.jsxs)(`section`,{className:`space-y-4 rounded-lg border border-border p-4`,"data-testid":`public-link-switch-card`,children:[(0,V.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,V.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,V.jsx)(k,{htmlFor:`public-link-switch`,className:`text-sm font-medium`,children:`Public link`}),(0,V.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,"data-testid":`public-link-status`,children:x?C?`On. Waiting for Cloudflare to hand out the link…`:`On. Anyone with the link reaches PPM's sign-in page.`:`Off.`})]}),(0,V.jsxs)(`div`,{className:`flex min-h-11 shrink-0 items-center gap-2`,children:[(a||C)&&(0,V.jsx)(f,{className:`size-4 animate-spin text-muted-foreground`}),(0,V.jsx)(D,{id:`public-link-switch`,checked:x,disabled:a||!x&&!A,onCheckedChange:t=>{!t&&Se(e.url)?c(!0):w(t)}})]})]}),x&&e.url&&(0,V.jsx)(ve,{url:e.url,qrHint:`Scan to open PPM on a phone`}),!A&&(0,V.jsxs)(X,{icon:(0,V.jsx)(i,{className:`size-4`}),children:[(0,V.jsx)(`p`,{children:x?`PPM's password is off while the link is on: anyone who has the link can open PPM. Turn the password on, or the link off.`:`PPM's password is off. Turn it on first: anyone with the link could otherwise open PPM.`}),(0,V.jsx)(y,{variant:`outline`,onClick:()=>_(`general`),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Open General`})]})]}),(0,V.jsxs)(`section`,{className:`space-y-3`,"data-testid":`public-link-address`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium`,children:`Address`}),P?(0,V.jsx)(`div`,{className:`rounded-lg border border-border p-4`,children:(0,V.jsx)(ee,{step:g.step,t:g})}):(0,V.jsxs)(`div`,{className:`divide-y divide-border rounded-lg border border-border`,children:[(0,V.jsx)(Q,{title:`Temporary address`,inUse:j===`quick`,description:`A random trycloudflare.com address. It changes every time PPM restarts.`,action:j===`named`&&(0,V.jsx)(y,{variant:`outline`,onClick:()=>d(!0),disabled:m||N,className:`min-h-11 cursor-pointer md:min-h-9`,children:m?(0,V.jsx)(f,{className:`size-4 animate-spin`}):`Switch`})}),(0,V.jsx)(Q,{title:`Your own domain`,inUse:j===`named`,description:M?(0,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)(`span`,{className:`break-all font-medium text-foreground`,children:[`https://`,M]}),`. It stays the same after a restart.`]}):`One fixed address on a domain you have on Cloudflare, like ppm.example.com.`,action:j===`quick`&&A&&(0,V.jsx)(y,{onClick:g.answerYes,className:`min-h-11 cursor-pointer md:min-h-9`,children:`Set up`})})]}),!P&&j===`quick`&&!A&&(0,V.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Turn on PPM's password to use your own domain.`}),!P&&N&&(0,V.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`This page is open through your domain, so switching would cut it off before the new address could show. Open PPM another way first (Tailscale, or on this machine), then switch.`}),(F||O?.tunnelWarning)&&(0,V.jsxs)(X,{icon:(0,V.jsx)(l,{className:`size-4 text-warning`}),children:[F&&(0,V.jsx)(`p`,{children:`PPM could not use your domain and is on a temporary address for now.`}),O?.tunnelWarning&&(0,V.jsx)(`p`,{children:O.tunnelWarning})]})]}),(0,V.jsx)(S,{open:s,title:`Turn off the link you are using?`,onClose:()=>c(!1),children:(0,V.jsxs)(`div`,{className:`space-y-4`,children:[(0,V.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`This page is open at `,e.url,`. Turning the link off disconnects it; reach PPM another way to turn it back on.`]}),(0,V.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,V.jsx)(y,{variant:`outline`,onClick:()=>c(!1),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`}),(0,V.jsx)(y,{variant:`destructive`,onClick:()=>{c(!1),w(!1)},className:`min-h-11 cursor-pointer md:min-h-9`,children:`Turn off`})]})]})}),(0,V.jsx)(S,{open:u,title:`Switch to a temporary address?`,onClose:()=>d(!1),children:(0,V.jsxs)(`div`,{className:`space-y-4`,children:[(0,V.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`PPM stops answering at https://`,M,` and gets a new random address instead. Links that use your domain stop working until you set it up again.`]}),(0,V.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,V.jsx)(y,{variant:`outline`,onClick:()=>d(!1),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Cancel`}),(0,V.jsx)(y,{variant:`destructive`,onClick:()=>void E(),className:`min-h-11 cursor-pointer md:min-h-9`,children:`Switch`})]})]})})]})}function Q({title:e,description:t,inUse:n,action:r}){return(0,V.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3 p-3`,"data-in-use":n||void 0,children:[(0,V.jsxs)(`div`,{className:`min-w-0 flex-[1_1_14rem] space-y-0.5`,children:[(0,V.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,V.jsx)(`span`,{className:`text-sm font-medium`,children:e}),n&&(0,V.jsx)(`span`,{className:`rounded bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-primary`,children:`In use`})]}),(0,V.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:t})]}),r&&(0,V.jsx)(`div`,{className:`shrink-0`,children:r})]})}var $=`min-h-11 cursor-pointer md:min-h-9`,we=e=>e instanceof Error?e.message:String(e);function Te(){let{status:e,setStatus:t,loadError:n,refresh:r,connecting:a}=j(),o=N(e,r),[s,c]=(0,I.useState)(!1),[u,d]=(0,I.useState)(!1),[m,h]=(0,I.useState)(!1),g=async e=>{c(!0),t(t=>t&&{...t,enabled:e});try{let t=await A.setEnabled(e);t.applied||M(t,e?`Review address turned on`:`Review address turned off`),await r()}catch(n){t(t=>t&&{...t,enabled:!e}),p.error(e?`Could not turn the review address on`:`Could not turn the review address off`,{description:we(n)})}finally{c(!1)}},v=async()=>{h(!1),d(!0);try{M(await A.useTemporary(),`Switched to a temporary address`),await r()}catch(e){p.error(`Could not switch to a temporary address`,{description:we(e)})}finally{d(!1)}};if(!e)return(0,V.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:n?`Could not read the review address's state: ${n}`:`Reading the review address's state…`});let{enabled:b,mode:x,authEnabled:C}=e,w=x===`quick`?null:e.hostname,T=e.ppmTunnel.named?e.ppmTunnel.hostname:null;return(0,V.jsxs)(`div`,{className:`space-y-6`,"data-testid":`review-links-pane`,children:[(0,V.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:`Share design review links without making PPM public. Reviewers get an address of its own that opens the review pages and nothing else: no editor, chats, files or sign-in page answer there.`}),(0,V.jsxs)(`section`,{className:`space-y-4 rounded-lg border border-border p-4`,"data-testid":`review-links-switch-card`,children:[(0,V.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,V.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,V.jsx)(k,{htmlFor:`review-links-switch`,className:`text-sm font-medium`,children:`Review address`}),(0,V.jsx)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,"data-testid":`review-links-status`,children:b?e.connected?(0,V.jsxs)(V.Fragment,{children:[`On. Review links open at `,(0,V.jsx)(`span`,{className:`break-all font-medium text-foreground`,children:e.url})]}):e.running?`On. Connecting to Cloudflare…`:`On. Starting…`:`Off.`})]}),(0,V.jsxs)(`div`,{className:`flex min-h-11 shrink-0 items-center gap-2`,children:[(s||a&&e.canApply)&&(0,V.jsx)(f,{className:`size-4 animate-spin text-muted-foreground`}),(0,V.jsx)(D,{id:`review-links-switch`,checked:b,disabled:s||!b&&!C,onCheckedChange:e=>void g(e)})]})]}),!C&&(0,V.jsxs)(X,{icon:(0,V.jsx)(i,{className:`size-4`}),children:[(0,V.jsx)(`p`,{children:`PPM's password is off, and share links do not open while it is. Turn it on first.`}),(0,V.jsx)(y,{variant:`outline`,onClick:()=>_(`general`),className:$,children:`Open General`})]}),b&&!e.canApply&&(0,V.jsx)(X,{icon:(0,V.jsx)(l,{className:`size-4 text-warning`}),children:(0,V.jsx)(`p`,{children:e.supervised?"This PPM was started before review addresses existed. Run `ppm restart` to apply these settings.":"Review addresses run under `ppm start`. This PPM was started without it, so nothing serves the address."})})]}),(0,V.jsxs)(`section`,{className:`space-y-3`,"data-testid":`review-links-address`,children:[(0,V.jsx)(`h3`,{className:`text-sm font-medium`,children:`Address`}),o.flow?(0,V.jsx)(`div`,{className:`rounded-lg border border-border p-4`,"data-testid":`review-links-setup`,children:(0,V.jsx)(P,{setup:o,ppmHostname:T})}):(0,V.jsxs)(`div`,{className:`divide-y divide-border rounded-lg border border-border`,children:[(0,V.jsx)(Q,{title:`Temporary address`,inUse:x===`quick`,description:`A random trycloudflare.com address of its own. It changes every time PPM restarts, and links already sent stop working then.`,action:x!==`quick`&&(0,V.jsx)(y,{variant:`outline`,onClick:()=>h(!0),disabled:u,className:$,children:u?(0,V.jsx)(f,{className:`size-4 animate-spin`}):`Switch`})}),(0,V.jsx)(Q,{title:`Your domain, its own tunnel`,inUse:x===`named`,description:x===`named`&&w?(0,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)(`span`,{className:`break-all font-medium text-foreground`,children:[`https://`,w]}),`, on a Cloudflare tunnel of its own.`]}):`A fixed address like share.example.com, on a Cloudflare tunnel of its own. PPM's public link is not involved.`,action:C&&(0,V.jsx)(y,{variant:x===`named`?`outline`:`default`,onClick:()=>o.begin(`named`),className:$,"data-testid":`review-links-setup-named`,children:x===`named`?`Change`:`Set up`})}),(0,V.jsx)(Q,{title:`Your domain, on PPM's tunnel`,inUse:x===`shared`,description:x===`shared`&&w?(0,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)(`span`,{className:`break-all font-medium text-foreground`,children:[`https://`,w]}),`, on the tunnel of PPM's public link. PPM's own address answers only while that link is on.`]}):`A fixed address like share.example.com, added to the tunnel PPM's public link uses. PPM's own address answers only while that link is on.`,action:C&&e.ppmTunnel.named&&(0,V.jsx)(y,{variant:x===`shared`?`outline`:`default`,onClick:()=>o.begin(`shared`),className:$,"data-testid":`review-links-setup-shared`,children:x===`shared`?`Change`:`Set up`})})]}),!o.flow&&!C&&(0,V.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Turn on PPM's password to use your own domain.`}),!o.flow&&C&&!e.ppmTunnel.named&&(0,V.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`To use PPM's tunnel, set your domain up under Public link first. Its link can stay off.`}),b&&e.warning&&(0,V.jsx)(X,{icon:(0,V.jsx)(l,{className:`size-4 text-warning`}),children:(0,V.jsx)(`p`,{children:e.warning})})]}),(0,V.jsx)(S,{open:m,title:`Switch to a temporary address?`,onClose:()=>h(!1),children:(0,V.jsxs)(`div`,{className:`space-y-4`,children:[(0,V.jsxs)(`p`,{className:`text-sm leading-relaxed text-muted-foreground`,children:[`Review links stop opening at https://`,w,` and get a new random address instead. Links already sent with your domain stop working until you set it up again.`]}),(0,V.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 md:flex-row md:justify-end`,children:[(0,V.jsx)(y,{variant:`outline`,onClick:()=>h(!1),className:$,children:`Cancel`}),(0,V.jsx)(y,{variant:`destructive`,onClick:()=>void v(),className:$,children:`Switch`})]})]})})]})}function Ee(){let e=x(e=>e.tab),t=x(e=>e.setTab);return(0,V.jsxs)(`div`,{className:`space-y-5`,"data-testid":`remote-access`,"data-tab":e,children:[(0,V.jsx)(`div`,{role:`tablist`,"aria-label":`Remote access`,className:`flex gap-1 overflow-x-auto border-b border-border/50`,children:w.map(n=>(0,V.jsx)(`button`,{type:`button`,role:`tab`,"aria-selected":e===n.id,"data-testid":`remote-access-tab-${n.id}`,onClick:()=>t(n.id),className:g(`flex min-h-11 shrink-0 cursor-pointer items-center whitespace-nowrap rounded-t px-3 text-sm transition-colors md:min-h-9 md:text-xs`,e===n.id?`border-b-2 border-primary font-medium text-primary`:`text-text-subtle hover:text-text-secondary`),children:n.label},n.id))}),(0,V.jsxs)(`div`,{role:`tabpanel`,children:[e===`tailscale`&&(0,V.jsx)(ge,{}),e===`public-link`&&(0,V.jsx)(Ce,{}),e===`review-links`&&(0,V.jsx)(Te,{})]})]})}export{Ee as RemoteAccessSettingsSection};
@@ -1 +0,0 @@
1
- import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{D as t,E as n}from"./vendor-markdown-C-P1aR4p.js";import{xn as r}from"./icons-C1wDt09O.js";import{k as i,r as a}from"./api-client-BnYFnEfK.js";import{t as o}from"./button-BHGVTbam.js";import{An as s,a as c,c as l,l as u,o as d,u as f}from"./index-Cx9ZRibz.js";var p={status:()=>a.get(`/api/share-host/status`),zone:()=>a.get(`/api/share-host/zone`),setEnabled:e=>a.post(`/api/share-host/enabled`,{enabled:e}),useTemporary:()=>a.post(`/api/share-host/quick`),setup:(e,t)=>a.post(`/api/share-host/setup`,{mode:e,hostname:t})},m=e(t(),1),h=1e4,g=2e3,_=e=>e instanceof Error?e.message:String(e);function v(e=!0){let[t,n]=(0,m.useState)(null),[r,i]=(0,m.useState)(null),a=(0,m.useCallback)(async()=>{try{n(await p.status()),i(null)}catch(e){i(_(e))}},[]),o=!!t?.enabled&&!t.connected;return(0,m.useEffect)(()=>{if(!e)return;a();let t=()=>{a()};return window.addEventListener(`focus`,t),()=>window.removeEventListener(`focus`,t)},[e,a]),(0,m.useEffect)(()=>{if(!e)return;let t=setInterval(()=>{document.visibilityState===`visible`&&a()},o?g:h);return()=>clearInterval(t)},[e,o,a]),{status:t,setStatus:n,loadError:r,refresh:a,connecting:o}}var y=n(),b=`share`,x=`min-h-11 cursor-pointer md:min-h-9`,S=e=>e instanceof Error?e.message:String(e);function C(e,t){e.applied?i.success(t):i.warning(`${t} — not applied yet`,{description:e.message})}function w(e,t,n){let[r,a]=(0,m.useState)(null),o=(0,m.useRef)(r);o.current=r;let c=(0,m.useCallback)((t,n)=>{let r=u(t,n);if(!r.ok)return r.reason;if(t===e?.ppmTunnel.hostname)return`That is PPM's own address — pick another prefix`},[e?.ppmTunnel.hostname]),d=(0,m.useCallback)(t=>{a({k:`zone`,mode:t}),p.zone().then(({zone:n})=>{let r=e?.hostname,i=r?.endsWith(`.${n}`)?r.slice(0,-(n.length+1)):b;a(e=>e?.k===`zone`?{k:`hostname`,mode:t,zone:n,prefix:i}:e)}).catch(e=>{a(null),i.error(`Could not read your Cloudflare domain`,{description:S(e)})})},[e?.hostname]),f=(0,m.useCallback)((e,n,r)=>{n===`slow`&&a(e=>e?.k===`login`?{...e,slow:!0}:e),n===`success`&&(t(),d(e)),(n===`timeout`||n===`error`)&&(a(null),i.error(n===`timeout`?`The Cloudflare sign-in link expired`:`Cloudflare sign-in failed`,{description:r??void 0})),n===`cancelled`&&a(null)},[d,t]),h=r?.k===`login`?r.mode:null;(0,m.useEffect)(()=>{if(!h)return;let e=e=>{let t=e.detail?.url;typeof t==`string`&&a(e=>e?.k===`login`?{...e,url:t}:e)},t=e=>{let t=e.detail;t?.state&&f(h,t.state,t.message??null)};return window.addEventListener(`tunnel:login_url`,e),window.addEventListener(`tunnel:login_state`,t),()=>{window.removeEventListener(`tunnel:login_url`,e),window.removeEventListener(`tunnel:login_state`,t)}},[h,f]);let g=(e,t)=>{a({k:`login`,mode:e,url:null,slow:!1}),s.login(t).then(t=>{t.url&&a(e=>e?.k===`login`?{...e,url:t.url}:e),f(e,t.state,t.message)}).catch(e=>{a(null),i.error(`Could not start the Cloudflare sign-in`,{description:S(e)})})};return{flow:r,begin:t=>{if(e){if(e.certState===`ok`){d(t);return}if(e.certState===`invalid`||e.certState===`mismatch`){a({k:`relogin`,mode:t,reason:e.certState});return}g(t,!1)}},cancel:()=>a(null),cancelLogin:()=>{a(null),s.cancelLogin().catch(()=>{})},relogin:e=>g(e,!0),setPrefix:e=>{a(t=>t?.k===`hostname`?{...t,prefix:e,error:c(l(e,t.zone),t.zone)}:t)},submit:async()=>{let e=o.current;if(e?.k!==`hostname`)return;let r=l(e.prefix,e.zone),i=c(r,e.zone);if(i){a({...e,error:i});return}a({k:`submitting`,mode:e.mode,hostname:r});try{let i=await p.setup(e.mode,r);a(null),C(i.applied,`Review address set to https://${i.hostname}`),await t(),n?.()}catch(t){a({...e,error:S(t)})}}}}function T({setup:e,ppmHostname:t}){let{flow:n}=e;if(!n)return null;switch(n.k){case`relogin`:return(0,y.jsxs)(`div`,{className:`space-y-4`,children:[(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`h4`,{className:`text-sm font-medium`,children:f.needsRelogin.title}),(0,y.jsx)(`p`,{className:`mt-1 text-sm leading-relaxed text-muted-foreground`,children:n.reason===`mismatch`?f.needsRelogin.certMismatch:f.needsRelogin.certInvalid})]}),(0,y.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 md:flex-row md:justify-end`,children:[(0,y.jsx)(o,{variant:`outline`,onClick:e.cancel,className:x,children:`Cancel`}),(0,y.jsx)(o,{onClick:()=>e.relogin(n.mode),className:x,children:f.needsRelogin.action})]})]});case`login`:return(0,y.jsx)(d,{url:n.url,slow:n.slow,onCancel:e.cancelLogin});case`zone`:return(0,y.jsxs)(`p`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,y.jsx)(r,{className:`size-4 animate-spin`}),` Reading your Cloudflare domain…`]});case`submitting`:return(0,y.jsxs)(`p`,{className:`flex items-center gap-2 text-sm text-muted-foreground`,children:[(0,y.jsx)(r,{className:`size-4 shrink-0 animate-spin`}),(0,y.jsxs)(`span`,{children:[`Setting up `,(0,y.jsxs)(`span`,{className:`break-all`,children:[`https://`,n.hostname]}),`… This takes a few seconds.`]})]});case`hostname`:return(0,y.jsxs)(`form`,{className:`space-y-4`,onSubmit:t=>{t.preventDefault(),e.submit()},children:[(0,y.jsxs)(`div`,{children:[(0,y.jsx)(`h4`,{className:`text-sm font-medium`,children:n.mode===`named`?`Review address on its own tunnel`:`Review address on PPM's tunnel`}),(0,y.jsx)(`p`,{className:`mt-1 text-sm leading-relaxed text-muted-foreground`,children:n.mode===`named`?`PPM creates a Cloudflare tunnel for review links and points this name at it.`:`PPM adds this name to its tunnel, next to ${t?`https://${t}`:`its public link`}.`})]}),(0,y.jsx)(c,{zone:n.zone,prefix:n.prefix,error:n.error,onChange:e.setPrefix}),(0,y.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 md:flex-row md:justify-end`,children:[(0,y.jsx)(o,{type:`button`,variant:`outline`,onClick:e.cancel,className:x,children:`Cancel`}),(0,y.jsx)(o,{type:`submit`,className:x,"data-testid":`review-links-submit`,children:`Set up`})]})]})}}export{p as a,v as i,C as n,w as r,T as t};
@@ -1 +0,0 @@
1
- import{E as e}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import"./icons-C1wDt09O.js";import"./api-client-BnYFnEfK.js";import"./settings-store-CBJCnE5L.js";import{i as t}from"./settings-categories-BY9n3BRr.js";import"./button-BHGVTbam.js";import"./scroll-area-CSmNLlfl.js";import"./separator-CYw7bF1W.js";import"./settings-section-content-DFLjO2le.js";import{t as n}from"./settings-body-DXNcpoqY.js";var r=e(),i=({metadata:e})=>(0,r.jsx)(n,{initialCategory:t(e?.category)?e.category:void 0});export{i as SettingsTab};
@@ -1 +0,0 @@
1
- import{E as e}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import"./icons-C1wDt09O.js";import"./api-client-BnYFnEfK.js";import"./settings-store-CBJCnE5L.js";import{n as t}from"./window-store-UcSFgNCI.js";import{i as n}from"./settings-categories-BY9n3BRr.js";import"./button-BHGVTbam.js";import"./scroll-area-CSmNLlfl.js";import"./separator-CYw7bF1W.js";import"./settings-section-content-DFLjO2le.js";import{t as r}from"./settings-body-DXNcpoqY.js";var i=e();function a({id:e,payload:a}){let o=t(e=>e.setPayload);return(0,i.jsx)(r,{initialCategory:n(a?.category)?a.category:void 0,onCategoryChange:t=>o(e,{category:t})})}export{a as default};
@@ -1 +0,0 @@
1
- import{E as e}from"./vendor-markdown-C-P1aR4p.js";import"./vendor-ui-BTSIXzhZ.js";import"./icons-C1wDt09O.js";import"./api-client-BnYFnEfK.js";import"./settings-store-CBJCnE5L.js";import{t}from"./system-monitor-body-DouL7ajt.js";var n=e(),r=()=>(0,n.jsx)(t,{});export{r as SystemMonitorTab};