@hienlh/ppm 0.23.8 → 0.23.9

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 (314) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/assets/skills/ppm/SKILL.md +1 -1
  3. package/assets/skills/ppm/references/cli-reference.md +4 -4
  4. package/assets/skills/ppm/references/http-api.md +1 -1
  5. package/dist/web/assets/{accounts-settings-section-BNcPvEq1.js → accounts-settings-section-hxemqOZw.js} +1 -1
  6. package/dist/web/assets/accounts-settings-section-hxemqOZw.js.br +0 -0
  7. package/dist/web/assets/accounts-settings-section-hxemqOZw.js.gz +0 -0
  8. package/dist/web/assets/{ai-resource-editor-DfVRMUHS.js → ai-resource-editor-uI76obDR.js} +1 -1
  9. package/dist/web/assets/ai-resource-editor-uI76obDR.js.br +0 -0
  10. package/dist/web/assets/ai-resource-editor-uI76obDR.js.gz +0 -0
  11. package/dist/web/assets/{ai-settings-section-Ezhw4Fef.js → ai-settings-section-Bmy9p9l-.js} +1 -1
  12. package/dist/web/assets/ai-settings-section-Bmy9p9l-.js.br +0 -0
  13. package/dist/web/assets/ai-settings-section-Bmy9p9l-.js.gz +0 -0
  14. package/dist/web/assets/{ai-settings-section-B_0-P8jx.js → ai-settings-section-CF39jnOD.js} +1 -1
  15. package/dist/web/assets/{appearance-settings-section-CPOAp0fY.js → appearance-settings-section-BCJK8_N6.js} +1 -1
  16. package/dist/web/assets/appearance-settings-section-BCJK8_N6.js.br +0 -0
  17. package/dist/web/assets/appearance-settings-section-BCJK8_N6.js.gz +0 -0
  18. package/dist/web/assets/{apps-panel-Cz7_o-M4.js → apps-panel-Dcu2wMIn.js} +1 -1
  19. package/dist/web/assets/apps-panel-Dcu2wMIn.js.br +0 -0
  20. package/dist/web/assets/apps-panel-Dcu2wMIn.js.gz +0 -0
  21. package/dist/web/assets/{branch-review-tab-BPx3kHrM.js → branch-review-tab-DEkdGqaE.js} +1 -1
  22. package/dist/web/assets/branch-review-tab-DEkdGqaE.js.br +0 -0
  23. package/dist/web/assets/branch-review-tab-DEkdGqaE.js.gz +0 -0
  24. package/dist/web/assets/{chat-tab-BadDM_j8.js → chat-tab-BVyBR3yR.js} +1 -1
  25. package/dist/web/assets/chat-tab-BVyBR3yR.js.br +5 -0
  26. package/dist/web/assets/chat-tab-BVyBR3yR.js.gz +0 -0
  27. package/dist/web/assets/{chat-tab-IqAY4c7p.js → chat-tab-Dj8kFoUi.js} +3 -3
  28. package/dist/web/assets/chat-tab-Dj8kFoUi.js.br +0 -0
  29. package/dist/web/assets/chat-tab-Dj8kFoUi.js.gz +0 -0
  30. package/dist/web/assets/{code-editor-Dmitw9QS.js → code-editor-BKpaBc8f.js} +3 -3
  31. package/dist/web/assets/code-editor-BKpaBc8f.js.br +0 -0
  32. package/dist/web/assets/code-editor-BKpaBc8f.js.gz +0 -0
  33. package/dist/web/assets/{codex-reset-credit-button-D2hal4bG.js → codex-reset-credit-button-Xt1ttURe.js} +1 -1
  34. package/dist/web/assets/codex-reset-credit-button-Xt1ttURe.js.br +0 -0
  35. package/dist/web/assets/codex-reset-credit-button-Xt1ttURe.js.gz +0 -0
  36. package/dist/web/assets/{conflict-editor-Cj_gUncw.js → conflict-editor-C9TZTGN2.js} +1 -1
  37. package/dist/web/assets/conflict-editor-C9TZTGN2.js.br +0 -0
  38. package/dist/web/assets/conflict-editor-C9TZTGN2.js.gz +0 -0
  39. package/dist/web/assets/{csv-preview-Be3ODNj0.js → csv-preview-BfX8PrGn.js} +1 -1
  40. package/dist/web/assets/csv-preview-BfX8PrGn.js.br +0 -0
  41. package/dist/web/assets/csv-preview-BfX8PrGn.js.gz +0 -0
  42. package/dist/web/assets/{database-viewer-B1b--4y8.js → database-viewer-DVHa4Mw7.js} +1 -1
  43. package/dist/web/assets/database-viewer-DVHa4Mw7.js.br +0 -0
  44. package/dist/web/assets/database-viewer-DVHa4Mw7.js.gz +0 -0
  45. package/dist/web/assets/{design-tab-8wi0IHss.js → design-tab-Dc8RIIMj.js} +1 -1
  46. package/dist/web/assets/design-tab-Dc8RIIMj.js.br +0 -0
  47. package/dist/web/assets/design-tab-Dc8RIIMj.js.gz +0 -0
  48. package/dist/web/assets/{designs-sidebar-panel-D5-1Q8zQ.js → designs-sidebar-panel-BDEgeNCO.js} +1 -1
  49. package/dist/web/assets/designs-sidebar-panel-BDEgeNCO.js.br +0 -0
  50. package/dist/web/assets/designs-sidebar-panel-BDEgeNCO.js.gz +0 -0
  51. package/dist/web/assets/{diff-viewer-Dcxk6UTG.js → diff-viewer-DYAwueSh.js} +1 -1
  52. package/dist/web/assets/diff-viewer-DYAwueSh.js.br +0 -0
  53. package/dist/web/assets/diff-viewer-DYAwueSh.js.gz +0 -0
  54. package/dist/web/assets/{editor-language-service-BVJQnTSV.js → editor-language-service-DufWCv_b.js} +1 -1
  55. package/dist/web/assets/editor-language-service-DufWCv_b.js.br +0 -0
  56. package/dist/web/assets/editor-language-service-DufWCv_b.js.gz +0 -0
  57. package/dist/web/assets/{explorer-body-CTkrlrI3.js → explorer-body-DW838S7p.js} +1 -1
  58. package/dist/web/assets/explorer-body-DW838S7p.js.br +0 -0
  59. package/dist/web/assets/explorer-body-DW838S7p.js.gz +0 -0
  60. package/dist/web/assets/{explorer-window-content-DH5AD3Ng.js → explorer-window-content-Cw4njYF9.js} +1 -1
  61. package/dist/web/assets/explorer-window-content-Cw4njYF9.js.br +0 -0
  62. package/dist/web/assets/explorer-window-content-Cw4njYF9.js.gz +0 -0
  63. package/dist/web/assets/{extension-manager-section-BJr6ccWw.js → extension-manager-section-CsudP-cF.js} +1 -1
  64. package/dist/web/assets/extension-manager-section-CsudP-cF.js.br +0 -0
  65. package/dist/web/assets/extension-manager-section-CsudP-cF.js.gz +0 -0
  66. package/dist/web/assets/{extension-webview-CYNXHd8D.js → extension-webview-BoeNtrL9.js} +1 -1
  67. package/dist/web/assets/extension-webview-BoeNtrL9.js.br +0 -0
  68. package/dist/web/assets/extension-webview-BoeNtrL9.js.gz +0 -0
  69. package/dist/web/assets/{files-settings-section-JX7o4lex.js → files-settings-section-C998uv6a.js} +1 -1
  70. package/dist/web/assets/files-settings-section-C998uv6a.js.br +0 -0
  71. package/dist/web/assets/files-settings-section-C998uv6a.js.gz +0 -0
  72. package/dist/web/assets/{general-settings-section-kF94Mz5q.js → general-settings-section-Dm0NPoo2.js} +1 -1
  73. package/dist/web/assets/general-settings-section-Dm0NPoo2.js.br +0 -0
  74. package/dist/web/assets/general-settings-section-Dm0NPoo2.js.gz +0 -0
  75. package/dist/web/assets/{git-log-panel-Crlp9ofM.js → git-log-panel-ZMLU_QWd.js} +1 -1
  76. package/dist/web/assets/git-log-panel-ZMLU_QWd.js.br +0 -0
  77. package/dist/web/assets/git-log-panel-ZMLU_QWd.js.gz +0 -0
  78. package/dist/web/assets/{glide-data-grid-O6MO5dKU.js → glide-data-grid-BuVHCdOY.js} +1 -1
  79. package/dist/web/assets/glide-data-grid-BuVHCdOY.js.br +0 -0
  80. package/dist/web/assets/glide-data-grid-BuVHCdOY.js.gz +0 -0
  81. package/dist/web/assets/{group-chat-tab-DGLSGf37.js → group-chat-tab-B2wk54Kb.js} +1 -1
  82. package/dist/web/assets/group-chat-tab-B2wk54Kb.js.br +0 -0
  83. package/dist/web/assets/group-chat-tab-B2wk54Kb.js.gz +0 -0
  84. package/dist/web/assets/{index-DQCw6d-2.js → index-D41mthBS.js} +5 -5
  85. package/dist/web/assets/index-D41mthBS.js.br +0 -0
  86. package/dist/web/assets/index-D41mthBS.js.gz +0 -0
  87. package/dist/web/assets/{jira-watcher-section-DwM7gqHT.js → jira-watcher-section-C1vWzVZJ.js} +1 -1
  88. package/dist/web/assets/{keybindings-store-CJtEHFIQ.js → keybindings-store-XUcWE5_j.js} +1 -1
  89. package/dist/web/assets/{keyboard-shortcuts-section-CewWGwiF.js → keyboard-shortcuts-section-CDYzFVbt.js} +1 -1
  90. package/dist/web/assets/keyboard-shortcuts-section-CDYzFVbt.js.br +0 -0
  91. package/dist/web/assets/keyboard-shortcuts-section-CDYzFVbt.js.gz +0 -0
  92. package/dist/web/assets/{language-servers-section-nricdxke.js → language-servers-section-DQH0qqem.js} +2 -2
  93. package/dist/web/assets/language-servers-section-DQH0qqem.js.br +0 -0
  94. package/dist/web/assets/language-servers-section-DQH0qqem.js.gz +0 -0
  95. package/dist/web/assets/{lsp-client-DRMEWb-z.js → lsp-client-Ce_E8lQ7.js} +1 -1
  96. package/dist/web/assets/lsp-client-Ce_E8lQ7.js.br +0 -0
  97. package/dist/web/assets/lsp-client-Ce_E8lQ7.js.gz +0 -0
  98. package/dist/web/assets/{markdown-renderer-Dab9Us6u.js → markdown-renderer-C9inQ_Z3.js} +1 -1
  99. package/dist/web/assets/markdown-renderer-C9inQ_Z3.js.br +0 -0
  100. package/dist/web/assets/markdown-renderer-C9inQ_Z3.js.gz +0 -0
  101. package/dist/web/assets/{markdown-renderer-D5-xliE9.js → markdown-renderer-CS193h6D.js} +1 -1
  102. package/dist/web/assets/{mobile-explorer-sheet-DtgdpvJ9.js → mobile-explorer-sheet-Dp5-b059.js} +1 -1
  103. package/dist/web/assets/mobile-explorer-sheet-Dp5-b059.js.br +0 -0
  104. package/dist/web/assets/mobile-explorer-sheet-Dp5-b059.js.gz +0 -0
  105. package/dist/web/assets/{new-design-dialog-Dd5KDB_p.js → new-design-dialog-Bw3xciYg.js} +1 -1
  106. package/dist/web/assets/new-design-dialog-Bw3xciYg.js.br +0 -0
  107. package/dist/web/assets/new-design-dialog-Bw3xciYg.js.gz +0 -0
  108. package/dist/web/assets/{notification-store-D2vTyp_Q.js → notification-store-3PN0fYtT.js} +1 -1
  109. package/dist/web/assets/{performance-panel-LMGefOQ2.js → performance-panel-Bl3RwJGZ.js} +1 -1
  110. package/dist/web/assets/performance-panel-Bl3RwJGZ.js.br +0 -0
  111. package/dist/web/assets/performance-panel-Bl3RwJGZ.js.gz +0 -0
  112. package/dist/web/assets/{ppmbot-settings-section-D67u6gPi.js → ppmbot-settings-section-BtKmsfqX.js} +1 -1
  113. package/dist/web/assets/ppmbot-settings-section-BtKmsfqX.js.br +0 -0
  114. package/dist/web/assets/ppmbot-settings-section-BtKmsfqX.js.gz +0 -0
  115. package/dist/web/assets/{problems-panel-DKgIw4uZ.js → problems-panel-dzNhRTnM.js} +1 -1
  116. package/dist/web/assets/problems-panel-dzNhRTnM.js.br +0 -0
  117. package/dist/web/assets/problems-panel-dzNhRTnM.js.gz +0 -0
  118. package/dist/web/assets/{process-table-BIAgC_jG.js → process-table-B9rXN1NM.js} +1 -1
  119. package/dist/web/assets/process-table-B9rXN1NM.js.br +0 -0
  120. package/dist/web/assets/process-table-B9rXN1NM.js.gz +0 -0
  121. package/dist/web/assets/{proxy-settings-section-CFiYcTBA.js → proxy-settings-section-BAFgwYyD.js} +1 -1
  122. package/dist/web/assets/proxy-settings-section-BAFgwYyD.js.br +0 -0
  123. package/dist/web/assets/proxy-settings-section-BAFgwYyD.js.gz +0 -0
  124. package/dist/web/assets/{remote-desktop-clipboard-notice-Bs3fZSRw.js → remote-desktop-clipboard-notice-C6tt5SDH.js} +1 -1
  125. package/dist/web/assets/remote-desktop-clipboard-notice-C6tt5SDH.js.br +0 -0
  126. package/dist/web/assets/remote-desktop-clipboard-notice-C6tt5SDH.js.gz +0 -0
  127. package/dist/web/assets/{remote-desktop-mobile-sheet-DgxTdWMh.js → remote-desktop-mobile-sheet-C6gFMzXV.js} +2 -2
  128. package/dist/web/assets/remote-desktop-mobile-sheet-C6gFMzXV.js.br +0 -0
  129. package/dist/web/assets/remote-desktop-mobile-sheet-C6gFMzXV.js.gz +0 -0
  130. package/dist/web/assets/{remote-desktop-mobile-view-DgGOfPVY.js → remote-desktop-mobile-view-kD5Q339l.js} +1 -1
  131. package/dist/web/assets/remote-desktop-mobile-view-kD5Q339l.js.br +0 -0
  132. package/dist/web/assets/remote-desktop-mobile-view-kD5Q339l.js.gz +0 -0
  133. package/dist/web/assets/{remote-desktop-readiness-gate-DOWryrQx.js → remote-desktop-readiness-gate-CqnG8BlK.js} +1 -1
  134. package/dist/web/assets/remote-desktop-readiness-gate-CqnG8BlK.js.br +0 -0
  135. package/dist/web/assets/remote-desktop-readiness-gate-CqnG8BlK.js.gz +0 -0
  136. package/dist/web/assets/{remote-desktop-window-content-7t0wQsHx.js → remote-desktop-window-content-BjZdvaQX.js} +1 -1
  137. package/dist/web/assets/remote-desktop-window-content-BjZdvaQX.js.br +0 -0
  138. package/dist/web/assets/remote-desktop-window-content-BjZdvaQX.js.gz +0 -0
  139. package/dist/web/assets/{schedules-settings-section-DGhG-b5O.js → schedules-settings-section-BrsGPl6j.js} +1 -1
  140. package/dist/web/assets/schedules-settings-section-BrsGPl6j.js.br +0 -0
  141. package/dist/web/assets/schedules-settings-section-BrsGPl6j.js.gz +0 -0
  142. package/dist/web/assets/{services-panel-0klE3O4g.js → services-panel-mDvWNRkg.js} +1 -1
  143. package/dist/web/assets/services-panel-mDvWNRkg.js.br +0 -0
  144. package/dist/web/assets/services-panel-mDvWNRkg.js.gz +0 -0
  145. package/dist/web/assets/{settings-body-CfqpqFfq.js → settings-body-DJKHimA7.js} +2 -2
  146. package/dist/web/assets/settings-body-DJKHimA7.js.br +0 -0
  147. package/dist/web/assets/settings-body-DJKHimA7.js.gz +0 -0
  148. package/dist/web/assets/{settings-tab-CHweH5Nh.js → settings-tab-DyLehsVr.js} +1 -1
  149. package/dist/web/assets/{settings-window-content-C6Od3qV7.js → settings-window-content-BMbDb3BQ.js} +1 -1
  150. package/dist/web/assets/{sql-query-editor-ALQ5_X0j.js → sql-query-editor-Ci0vTqmC.js} +1 -1
  151. package/dist/web/assets/sql-query-editor-Ci0vTqmC.js.br +0 -0
  152. package/dist/web/assets/sql-query-editor-Ci0vTqmC.js.gz +0 -0
  153. package/dist/web/assets/{sqlite-viewer-DKTty_jR.js → sqlite-viewer-kOyrMUsW.js} +1 -1
  154. package/dist/web/assets/sqlite-viewer-kOyrMUsW.js.br +0 -0
  155. package/dist/web/assets/sqlite-viewer-kOyrMUsW.js.gz +0 -0
  156. package/dist/web/assets/{system-monitor-body-D6J6lq7-.js → system-monitor-body-D1lzquYw.js} +2 -2
  157. package/dist/web/assets/system-monitor-body-D1lzquYw.js.br +0 -0
  158. package/dist/web/assets/system-monitor-body-D1lzquYw.js.gz +0 -0
  159. package/dist/web/assets/{system-monitor-tab-Di18zNNS.js → system-monitor-tab-anJ6hmrA.js} +1 -1
  160. package/dist/web/assets/{system-monitor-window-content-D1t30f32.js → system-monitor-window-content-BcV01XgX.js} +1 -1
  161. package/dist/web/assets/{tab-host-window-content-DTcx2D0O.js → tab-host-window-content-4kbVMd0b.js} +1 -1
  162. package/dist/web/assets/tab-host-window-content-4kbVMd0b.js.br +0 -0
  163. package/dist/web/assets/tab-host-window-content-4kbVMd0b.js.gz +0 -0
  164. package/dist/web/assets/{team-member-sheet-CFSbPG6n.js → team-member-sheet-K3MMar1L.js} +2 -2
  165. package/dist/web/assets/team-member-sheet-K3MMar1L.js.br +0 -0
  166. package/dist/web/assets/team-member-sheet-K3MMar1L.js.gz +0 -0
  167. package/dist/web/assets/{team-member-window-content-VeI6DGeM.js → team-member-window-content-DidC04eW.js} +1 -1
  168. package/dist/web/assets/team-member-window-content-DidC04eW.js.br +0 -0
  169. package/dist/web/assets/team-member-window-content-DidC04eW.js.gz +0 -0
  170. package/dist/web/assets/{terminal-tab-DgTfQKBI.js → terminal-tab-BlYiIu9A.js} +1 -1
  171. package/dist/web/assets/terminal-tab-BlYiIu9A.js.br +0 -0
  172. package/dist/web/assets/terminal-tab-BlYiIu9A.js.gz +0 -0
  173. package/dist/web/assets/{tool-cards-_fpYI1hB.js → tool-cards-BoW8_vQb.js} +2 -2
  174. package/dist/web/assets/tool-cards-BoW8_vQb.js.br +0 -0
  175. package/dist/web/assets/tool-cards-BoW8_vQb.js.gz +0 -0
  176. package/dist/web/assets/{use-inline-blame-Dv111BKY.js → use-inline-blame-I6_SHzP0.js} +1 -1
  177. package/dist/web/assets/use-inline-blame-I6_SHzP0.js.br +0 -0
  178. package/dist/web/assets/use-inline-blame-I6_SHzP0.js.gz +0 -0
  179. package/dist/web/assets/{use-lsp-CZTFJIXX.js → use-lsp-D6skvdIp.js} +1 -1
  180. package/dist/web/assets/use-lsp-D6skvdIp.js.br +0 -0
  181. package/dist/web/assets/use-lsp-D6skvdIp.js.gz +0 -0
  182. package/dist/web/assets/{use-monaco-theme-DL2dIG5L.js → use-monaco-theme-08OELBic.js} +1 -1
  183. package/dist/web/assets/{use-process-kill-D7D9QvJG.js → use-process-kill-4gRMygIV.js} +1 -1
  184. package/dist/web/assets/use-process-kill-4gRMygIV.js.br +0 -0
  185. package/dist/web/assets/use-process-kill-4gRMygIV.js.gz +0 -0
  186. package/dist/web/assets/{use-websocket-ziY-Gz_B.js → use-websocket-C1dxvoVt.js} +1 -1
  187. package/dist/web/assets/{video-preview-DzwY3q9W.js → video-preview-08dogvSP.js} +1 -1
  188. package/dist/web/assets/video-preview-08dogvSP.js.br +0 -0
  189. package/dist/web/assets/video-preview-08dogvSP.js.gz +0 -0
  190. package/dist/web/index.html +1 -1
  191. package/dist/web/index.html.br +0 -0
  192. package/dist/web/index.html.gz +0 -0
  193. package/dist/web/sw.js +1 -1
  194. package/dist/web/sw.js.br +0 -0
  195. package/dist/web/sw.js.gz +0 -0
  196. package/package.json +1 -1
  197. package/src/server/routes/chat.ts +12 -4
  198. package/src/web/components/chat/codex-usage-panel.tsx +26 -8
  199. package/dist/web/assets/accounts-settings-section-BNcPvEq1.js.br +0 -0
  200. package/dist/web/assets/accounts-settings-section-BNcPvEq1.js.gz +0 -0
  201. package/dist/web/assets/ai-resource-editor-DfVRMUHS.js.br +0 -0
  202. package/dist/web/assets/ai-resource-editor-DfVRMUHS.js.gz +0 -0
  203. package/dist/web/assets/ai-settings-section-Ezhw4Fef.js.br +0 -0
  204. package/dist/web/assets/ai-settings-section-Ezhw4Fef.js.gz +0 -0
  205. package/dist/web/assets/appearance-settings-section-CPOAp0fY.js.br +0 -0
  206. package/dist/web/assets/appearance-settings-section-CPOAp0fY.js.gz +0 -0
  207. package/dist/web/assets/apps-panel-Cz7_o-M4.js.br +0 -0
  208. package/dist/web/assets/apps-panel-Cz7_o-M4.js.gz +0 -0
  209. package/dist/web/assets/branch-review-tab-BPx3kHrM.js.br +0 -0
  210. package/dist/web/assets/branch-review-tab-BPx3kHrM.js.gz +0 -0
  211. package/dist/web/assets/chat-tab-BadDM_j8.js.br +0 -0
  212. package/dist/web/assets/chat-tab-BadDM_j8.js.gz +0 -0
  213. package/dist/web/assets/chat-tab-IqAY4c7p.js.br +0 -0
  214. package/dist/web/assets/chat-tab-IqAY4c7p.js.gz +0 -0
  215. package/dist/web/assets/code-editor-Dmitw9QS.js.br +0 -0
  216. package/dist/web/assets/code-editor-Dmitw9QS.js.gz +0 -0
  217. package/dist/web/assets/codex-reset-credit-button-D2hal4bG.js.br +0 -0
  218. package/dist/web/assets/codex-reset-credit-button-D2hal4bG.js.gz +0 -0
  219. package/dist/web/assets/conflict-editor-Cj_gUncw.js.br +0 -0
  220. package/dist/web/assets/conflict-editor-Cj_gUncw.js.gz +0 -0
  221. package/dist/web/assets/csv-preview-Be3ODNj0.js.br +0 -0
  222. package/dist/web/assets/csv-preview-Be3ODNj0.js.gz +0 -0
  223. package/dist/web/assets/database-viewer-B1b--4y8.js.br +0 -0
  224. package/dist/web/assets/database-viewer-B1b--4y8.js.gz +0 -0
  225. package/dist/web/assets/design-tab-8wi0IHss.js.br +0 -0
  226. package/dist/web/assets/design-tab-8wi0IHss.js.gz +0 -0
  227. package/dist/web/assets/designs-sidebar-panel-D5-1Q8zQ.js.br +0 -0
  228. package/dist/web/assets/designs-sidebar-panel-D5-1Q8zQ.js.gz +0 -0
  229. package/dist/web/assets/diff-viewer-Dcxk6UTG.js.br +0 -0
  230. package/dist/web/assets/diff-viewer-Dcxk6UTG.js.gz +0 -0
  231. package/dist/web/assets/editor-language-service-BVJQnTSV.js.br +0 -0
  232. package/dist/web/assets/editor-language-service-BVJQnTSV.js.gz +0 -0
  233. package/dist/web/assets/explorer-body-CTkrlrI3.js.br +0 -0
  234. package/dist/web/assets/explorer-body-CTkrlrI3.js.gz +0 -0
  235. package/dist/web/assets/explorer-window-content-DH5AD3Ng.js.br +0 -0
  236. package/dist/web/assets/explorer-window-content-DH5AD3Ng.js.gz +0 -0
  237. package/dist/web/assets/extension-manager-section-BJr6ccWw.js.br +0 -0
  238. package/dist/web/assets/extension-manager-section-BJr6ccWw.js.gz +0 -0
  239. package/dist/web/assets/extension-webview-CYNXHd8D.js.br +0 -0
  240. package/dist/web/assets/extension-webview-CYNXHd8D.js.gz +0 -0
  241. package/dist/web/assets/files-settings-section-JX7o4lex.js.br +0 -0
  242. package/dist/web/assets/files-settings-section-JX7o4lex.js.gz +0 -0
  243. package/dist/web/assets/general-settings-section-kF94Mz5q.js.br +0 -0
  244. package/dist/web/assets/general-settings-section-kF94Mz5q.js.gz +0 -0
  245. package/dist/web/assets/git-log-panel-Crlp9ofM.js.br +0 -0
  246. package/dist/web/assets/git-log-panel-Crlp9ofM.js.gz +0 -0
  247. package/dist/web/assets/glide-data-grid-O6MO5dKU.js.br +0 -0
  248. package/dist/web/assets/glide-data-grid-O6MO5dKU.js.gz +0 -0
  249. package/dist/web/assets/group-chat-tab-DGLSGf37.js.br +0 -0
  250. package/dist/web/assets/group-chat-tab-DGLSGf37.js.gz +0 -0
  251. package/dist/web/assets/index-DQCw6d-2.js.br +0 -0
  252. package/dist/web/assets/index-DQCw6d-2.js.gz +0 -0
  253. package/dist/web/assets/keyboard-shortcuts-section-CewWGwiF.js.br +0 -0
  254. package/dist/web/assets/keyboard-shortcuts-section-CewWGwiF.js.gz +0 -0
  255. package/dist/web/assets/language-servers-section-nricdxke.js.br +0 -0
  256. package/dist/web/assets/language-servers-section-nricdxke.js.gz +0 -0
  257. package/dist/web/assets/lsp-client-DRMEWb-z.js.br +0 -0
  258. package/dist/web/assets/lsp-client-DRMEWb-z.js.gz +0 -0
  259. package/dist/web/assets/markdown-renderer-Dab9Us6u.js.br +0 -0
  260. package/dist/web/assets/markdown-renderer-Dab9Us6u.js.gz +0 -0
  261. package/dist/web/assets/mobile-explorer-sheet-DtgdpvJ9.js.br +0 -0
  262. package/dist/web/assets/mobile-explorer-sheet-DtgdpvJ9.js.gz +0 -0
  263. package/dist/web/assets/new-design-dialog-Dd5KDB_p.js.br +0 -0
  264. package/dist/web/assets/new-design-dialog-Dd5KDB_p.js.gz +0 -0
  265. package/dist/web/assets/performance-panel-LMGefOQ2.js.br +0 -0
  266. package/dist/web/assets/performance-panel-LMGefOQ2.js.gz +0 -0
  267. package/dist/web/assets/ppmbot-settings-section-D67u6gPi.js.br +0 -0
  268. package/dist/web/assets/ppmbot-settings-section-D67u6gPi.js.gz +0 -0
  269. package/dist/web/assets/problems-panel-DKgIw4uZ.js.br +0 -0
  270. package/dist/web/assets/problems-panel-DKgIw4uZ.js.gz +0 -0
  271. package/dist/web/assets/process-table-BIAgC_jG.js.br +0 -0
  272. package/dist/web/assets/process-table-BIAgC_jG.js.gz +0 -0
  273. package/dist/web/assets/proxy-settings-section-CFiYcTBA.js.br +0 -0
  274. package/dist/web/assets/proxy-settings-section-CFiYcTBA.js.gz +0 -0
  275. package/dist/web/assets/remote-desktop-clipboard-notice-Bs3fZSRw.js.br +0 -0
  276. package/dist/web/assets/remote-desktop-clipboard-notice-Bs3fZSRw.js.gz +0 -0
  277. package/dist/web/assets/remote-desktop-mobile-sheet-DgxTdWMh.js.br +0 -0
  278. package/dist/web/assets/remote-desktop-mobile-sheet-DgxTdWMh.js.gz +0 -0
  279. package/dist/web/assets/remote-desktop-mobile-view-DgGOfPVY.js.br +0 -0
  280. package/dist/web/assets/remote-desktop-mobile-view-DgGOfPVY.js.gz +0 -0
  281. package/dist/web/assets/remote-desktop-readiness-gate-DOWryrQx.js.br +0 -0
  282. package/dist/web/assets/remote-desktop-readiness-gate-DOWryrQx.js.gz +0 -0
  283. package/dist/web/assets/remote-desktop-window-content-7t0wQsHx.js.br +0 -0
  284. package/dist/web/assets/remote-desktop-window-content-7t0wQsHx.js.gz +0 -0
  285. package/dist/web/assets/schedules-settings-section-DGhG-b5O.js.br +0 -0
  286. package/dist/web/assets/schedules-settings-section-DGhG-b5O.js.gz +0 -0
  287. package/dist/web/assets/services-panel-0klE3O4g.js.br +0 -0
  288. package/dist/web/assets/services-panel-0klE3O4g.js.gz +0 -0
  289. package/dist/web/assets/settings-body-CfqpqFfq.js.br +0 -0
  290. package/dist/web/assets/settings-body-CfqpqFfq.js.gz +0 -0
  291. package/dist/web/assets/sql-query-editor-ALQ5_X0j.js.br +0 -0
  292. package/dist/web/assets/sql-query-editor-ALQ5_X0j.js.gz +0 -0
  293. package/dist/web/assets/sqlite-viewer-DKTty_jR.js.br +0 -0
  294. package/dist/web/assets/sqlite-viewer-DKTty_jR.js.gz +0 -0
  295. package/dist/web/assets/system-monitor-body-D6J6lq7-.js.br +0 -0
  296. package/dist/web/assets/system-monitor-body-D6J6lq7-.js.gz +0 -0
  297. package/dist/web/assets/tab-host-window-content-DTcx2D0O.js.br +0 -0
  298. package/dist/web/assets/tab-host-window-content-DTcx2D0O.js.gz +0 -0
  299. package/dist/web/assets/team-member-sheet-CFSbPG6n.js.br +0 -0
  300. package/dist/web/assets/team-member-sheet-CFSbPG6n.js.gz +0 -0
  301. package/dist/web/assets/team-member-window-content-VeI6DGeM.js.br +0 -0
  302. package/dist/web/assets/team-member-window-content-VeI6DGeM.js.gz +0 -0
  303. package/dist/web/assets/terminal-tab-DgTfQKBI.js.br +0 -0
  304. package/dist/web/assets/terminal-tab-DgTfQKBI.js.gz +0 -0
  305. package/dist/web/assets/tool-cards-_fpYI1hB.js.br +0 -0
  306. package/dist/web/assets/tool-cards-_fpYI1hB.js.gz +0 -0
  307. package/dist/web/assets/use-inline-blame-Dv111BKY.js.br +0 -0
  308. package/dist/web/assets/use-inline-blame-Dv111BKY.js.gz +0 -0
  309. package/dist/web/assets/use-lsp-CZTFJIXX.js.br +0 -0
  310. package/dist/web/assets/use-lsp-CZTFJIXX.js.gz +0 -0
  311. package/dist/web/assets/use-process-kill-D7D9QvJG.js.br +0 -0
  312. package/dist/web/assets/use-process-kill-D7D9QvJG.js.gz +0 -0
  313. package/dist/web/assets/video-preview-DzwY3q9W.js.br +0 -0
  314. package/dist/web/assets/video-preview-DzwY3q9W.js.gz +0 -0
@@ -1,7 +1,7 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/markdown-renderer-D5-xliE9.js","assets/vendor-ui-P9Ym7hCv.js","assets/rolldown-runtime-C5c2KzVm.js","assets/vendor-markdown-QKPNiWEd.js","assets/markdown-renderer-Dab9Us6u.js","assets/index-DQCw6d-2.js","assets/preload-helper-BEFjQwLd.js","assets/button-CsmGH5xa.js","assets/utils-btZ8C8-R.js","assets/createLucideIcon-DBXq3G0e.js","assets/api-client-F5Zi1sR0.js","assets/react-CzUPVyyG.js","assets/panel-store-DrSH3Nhp.js","assets/window-store-B4cbZ5rr.js","assets/project-store-CCimwgGF.js","assets/settings-store-3jIBB8gx.js","assets/file-store-DCU7_YyB.js","assets/window-pip-registry-dxrBFfkP.js","assets/onboarding-quick-orientation-WLKI95GY.js","assets/dialog-z8PLkL8n.js","assets/portal-container-context-NFSuymMu.js","assets/icons-CO_II6D-.js","assets/use-is-mobile-CkO33jqU.js","assets/format-file-meta-B0ZpqzSM.js","assets/fs-api-vF_bQoeL.js","assets/context-menu-CH1mvCwA.js","assets/input-CP31LZnN.js","assets/mobile-bottom-sheet-CLic9ovp.js","assets/use-visual-viewport-C307OVeV.js","assets/scroll-area-Dp-P38kg.js","assets/chat-preparation-cache-DoS7sdal.js","assets/file-icons-Ed_yLyef.js","assets/format-date-Fd9tpNaw.js","assets/git-repo-store-CdoOpvmf.js","assets/ws-auth-J3hw0Mhc.js","assets/tab-store-CUPgQIQz.js","assets/apply-theme-aVoqSG0I.js","assets/resolve-theme-B87m6l4i.js","assets/index-BmsPSBtF.css","assets/image-gallery-FN-9YT5_.js","assets/run-in-terminal-Cdn9PaAl.js","assets/editor-language-service-BVJQnTSV.js","assets/use-lsp-CZTFJIXX.js","assets/lsp-client-DRMEWb-z.js","assets/csv-preview-Be3ODNj0.js","assets/lib-g-qFlogj.js","assets/csv-parser-CoLcPhFa.js","assets/image-preview-DuODZoNO.js","assets/use-blob-url-B3R1DMZ0.js","assets/pdf-preview-PWDBbNwt.js","assets/video-preview-DzwY3q9W.js","assets/can-open-in-ppm-B9ZwTOGE.js","assets/media-url-mOPwQ_ey.js","assets/audio-preview-BrS2qNK0.js","assets/docx-preview-b-Ui9jDq.js"])))=>i.map(i=>d[i]);
2
- import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-P9Ym7hCv.js";import{$r as r,An as i,Br as a,Dt as o,Fr as s,Jr as c,Lt as l,Qr as u,Tr as d,Yn as f,Z as p,_r as ee,at as te,bt as ne,ct as m,dt as re,gr as ie,ir as ae,j as oe,lt as se,nt as ce,pt as h,q as g,qr as _,r as v,rr as y,st as b,un as x,vt as le,w as ue,yt as S}from"./icons-CO_II6D-.js";import{t as de}from"./createLucideIcon-DBXq3G0e.js";import{o as fe,r as C}from"./api-client-F5Zi1sR0.js";import{t as w}from"./settings-store-3jIBB8gx.js";import{t as T}from"./preload-helper-BEFjQwLd.js";import{t as E}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import{t as pe}from"./panel-store-DrSH3Nhp.js";import"./window-store-B4cbZ5rr.js";import{i as me}from"./project-store-CCimwgGF.js";import{t as D}from"./tab-store-CUPgQIQz.js";import{o as O}from"./file-store-DCU7_YyB.js";import{n as he,t as ge}from"./use-is-mobile-CkO33jqU.js";import"./git-repo-store-CdoOpvmf.js";import{t as _e}from"./button-CsmGH5xa.js";import{a as ve,i as ye,n as be,o as xe,t as Se}from"./dialog-z8PLkL8n.js";import"./file-icons-Ed_yLyef.js";import{t as Ce}from"./mobile-bottom-sheet-CLic9ovp.js";import"./use-visual-viewport-C307OVeV.js";import"./fs-api-vF_bQoeL.js";import"./format-file-meta-B0ZpqzSM.js";import{t as k}from"./input-CP31LZnN.js";import"./scroll-area-Dp-P38kg.js";import{A as we,Cn as Te,Ct as Ee,Dn as A,En as De,Ln as Oe,On as ke,Pt as Ae,Sn as je,Tn as j,Tt as M,_n as N,bn as P,gn as Me,k as Ne,v as Pe,vn as F,wn as Fe,wt as Ie,yn as I,zn as Le}from"./index-DQCw6d-2.js";import"./data-grid-types-DatI2Wee.js";import"./marked.esm-BHcxKPtl.js";import{t as Re}from"./use-monaco-theme-DL2dIG5L.js";import{n as ze,t as Be}from"./editor-font-BWW2uS94.js";import{t as Ve}from"./use-inline-blame-Dv111BKY.js";import{n as He,r as Ue}from"./monaco-dotenv-language-CQpgAhmX.js";import{i as We,n as Ge,r as Ke,t as qe}from"./can-open-in-ppm-B9ZwTOGE.js";import{a as Je,i as Ye,o as Xe,r as Ze,t as Qe}from"./glide-data-grid-O6MO5dKU.js";var $e=de(`file-braces`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1`,key:`1oajmo`}],[`path`,{d:`M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1`,key:`mpwhp6`}]]),L=e(t(),1),R=n();function et({projectName:e,filePath:t,tabId:n,ready:r,children:i}){let a=(0,L.useRef)(null),o=D(e=>e.activeTabId);return(0,L.useEffect)(()=>{let i=()=>{if(!r||!e||!t||!n||o!==n)return;let i=!!a.current?.checkVisibility({checkOpacity:!0,checkVisibilityCSS:!0});i&&Ae({type:`file-ready`,projectName:e,tabId:n,visible:i,isRunDocument:/^readme(?:\.[^/\\]+)?$/i.test(t.split(/[/\\]/).pop()??``)})};return i(),window.addEventListener(`ppm:onboarding-refresh`,i),()=>window.removeEventListener(`ppm:onboarding-refresh`,i)},[e,t,n,r,o]),(0,R.jsx)(`div`,{ref:a,className:`flex flex-1 min-h-0 flex-col`,children:i})}var tt=[`completionItems`,`hovers`,`documentSymbols`,`definitions`,`references`,`documentHighlights`,`rename`,`diagnostics`,`documentRangeFormattingEdits`,`signatureHelp`,`onTypeFormattingEdits`,`codeActions`,`inlayHints`];function nt(e){return Object.fromEntries(tt.map(t=>[t,e]))}var rt=nt(!1),it=nt(!0),z={noSemanticValidation:!0,noSyntaxValidation:!0,noSuggestionDiagnostics:!0},at=1;function ot(e,t){for(let n of[e,t])n.setModeConfiguration({...rt}),n.setDiagnosticsOptions({...z})}function B(e,t){for(let n of[e,t])n.setCompilerOptions({...n.getCompilerOptions(),jsx:at,allowJs:!0,allowNonTsExtensions:!0}),n.setModeConfiguration({...it}),n.setDiagnosticsOptions({...z})}function st(e,t,n){e?ot(t,n):B(t,n)}function ct({enabled:e,onToggle:t,status:n,diagnostics:i,onInstall:a}){let[o,s]=(0,L.useState)(!1),c=he();if(!e)return(0,R.jsxs)(`button`,{type:`button`,onClick:()=>t(!0),title:`Language server: off. Turn it on for completions, hover, go to definition, rename and quick fix from a real server. It runs as a process on the host.`,className:`flex items-center gap-1 rounded px-1.5 text-xs text-muted-foreground hover:bg-muted active:scale-95 transition-colors ${c?`min-h-11`:`py-0.5`}`,children:[(0,R.jsx)(r,{className:`size-3 shrink-0`}),(0,R.jsx)(`span`,{children:`LSP off`})]});if(!n)return null;let l=i.filter(e=>e.severity===1).length,d=i.filter(e=>e.severity===2).length,f=n.state===`ready`?n.server.displayName:n.state===`opening`?`Starting…`:n.server?.displayName??`No server`,p=n.state===`unavailable`&&n.reason===`not-installed`;return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`button`,{type:`button`,onClick:()=>s(!0),title:n.state===`ready`?`${n.server.displayName} — rooted at ${n.server.rootPath}`:n.state===`unavailable`?n.message:`Starting the language server`,className:`flex items-center gap-1 rounded px-1.5 hover:bg-muted active:scale-95 transition-colors text-xs ${c?`min-h-11`:`py-0.5`} ${p?`text-amber-500`:`text-muted-foreground`}`,children:[n.state===`opening`?(0,R.jsx)(x,{className:`size-3 animate-spin shrink-0`}):p?(0,R.jsx)(v,{className:`size-3 shrink-0`}):(0,R.jsx)(u,{className:`size-3 shrink-0`}),(0,R.jsx)(`span`,{className:`max-w-24 truncate`,children:f}),l>0&&(0,R.jsx)(`span`,{className:`text-red-500`,children:l}),l===0&&d>0&&(0,R.jsx)(`span`,{className:`text-amber-500`,children:d})]}),o&&(0,R.jsx)(V,{status:n,errors:l,warnings:d,isMobile:c,onToggle:t,onInstall:a,onClose:()=>s(!1)})]})}function V({status:e,errors:t,warnings:n,isMobile:r,onToggle:i,onInstall:a,onClose:o}){let s=(0,R.jsx)(lt,{status:e,errors:t,warnings:n,isMobile:r,onToggle:i,onInstall:a});return r?(0,R.jsx)(Ce,{open:!0,onClose:o,className:`popover-solid max-h-[85dvh] flex flex-col`,children:s}):(0,R.jsx)(Se,{open:!0,onOpenChange:e=>!e&&o(),children:(0,R.jsxs)(be,{className:`sm:max-w-lg`,children:[(0,R.jsx)(xe,{children:`Language server`}),s]})})}function lt({status:e,errors:t,warnings:n,isMobile:r,onToggle:i,onInstall:a}){return(0,R.jsxs)(`div`,{className:`p-4 space-y-4 overflow-y-auto text-sm leading-relaxed`,children:[e.state===`ready`&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(H,{label:`Server`,value:e.server.displayName}),(0,R.jsx)(H,{label:`Language`,value:e.languageId}),(0,R.jsx)(H,{label:`Project root`,value:e.server.rootPath,mono:!0}),(0,R.jsx)(H,{label:`Problems`,value:`${t} error${t===1?``:`s`}, ${n} warning${n===1?``:`s`}`}),(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Completions, hover, go to definition (F12), find references (Shift+F12), rename (F2), quick fix (Ctrl+.) and format (Shift+Alt+F) all come from this server.`})]}),e.state===`opening`&&(0,R.jsx)(`p`,{className:`text-muted-foreground`,children:`Starting the language server. A cold start reads the project's dependencies, so the first completion in a large project can take a few seconds.`}),e.state===`unavailable`&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`p`,{children:e.message}),e.server&&(0,R.jsxs)(`div`,{className:`space-y-2`,children:[e.reason===`not-installed`&&e.server.installable&&a?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:ut(e.server.installWith)}),(0,R.jsx)(ft,{server:e.server,isMobile:r,onInstall:a}),(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Or run it yourself:`})]}):(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:dt(e.server.installWith)}),(0,R.jsx)(pt,{command:e.server.installHint,isMobile:r})]}),e.reason===`no-language`&&(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No language server is registered for this file type.`})]}),(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-3 border-t border-border pt-3`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`p`,{className:`text-xs font-medium`,children:`Language server`}),(0,R.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`On for this device. Turning it off stops the process.`})]}),(0,R.jsx)(Ee,{checked:!0,onCheckedChange:e=>i(e)})]})]})}function ut(e){switch(e){case`go`:return`PPM builds it with the Go on this machine and keeps the binary in its own folder, leaving your GOBIN alone. A first build takes a minute or two.`;case`rustup`:return`PPM asks rustup to add the component to the toolchain this project uses — the same as running the command below yourself.`;default:return`PPM downloads it from npm into its own folder. Nothing you installed globally changes, and this file picks it up without being reopened.`}}function dt(e){switch(e){case`go`:return`Install it, then reopen this file. PPM installs language servers but never toolchains, and it cannot find a Go on this host.`;case`rustup`:return`Install it, then reopen this file. PPM installs language servers but never toolchains, and it cannot find rustup on this host.`;default:return`Install it, then reopen this file. This one comes from a system package manager, which PPM will not run on your behalf.`}}function ft({server:e,isMobile:t,onInstall:n}){let[r,i]=(0,L.useState)(!1),[a,o]=(0,L.useState)(null);return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(_e,{type:`button`,disabled:r,onClick:()=>{i(!0),o(null),n(e.id).catch(e=>o(e instanceof Error?e.message:String(e))).finally(()=>i(!1))},className:`w-full ${t?`min-h-11`:``}`,children:[r?(0,R.jsx)(x,{className:`size-4 animate-spin`}):(0,R.jsx)(b,{className:`size-4`}),r?`Installing ${e.displayName}…`:`Install ${e.displayName}`]}),a&&(0,R.jsx)(`p`,{className:`text-xs text-red-500 break-words`,children:a})]})}function H({label:e,value:t,mono:n}){return(0,R.jsxs)(`div`,{className:`flex gap-2 items-baseline`,children:[(0,R.jsx)(`span`,{className:`text-muted-foreground shrink-0 w-24 text-xs`,children:e}),(0,R.jsx)(`span`,{className:`min-w-0 break-all ${n?`font-mono text-xs`:``}`,children:t})]})}function pt({command:e,isMobile:t}){let[n,r]=(0,L.useState)(!1);return(0,R.jsxs)(`button`,{type:`button`,onClick:()=>{navigator.clipboard?.writeText(e).then(()=>{r(!0),setTimeout(()=>r(!1),1500)})},className:`w-full flex items-center gap-2 rounded border border-border bg-muted/40 px-3 text-left font-mono text-xs hover:bg-muted active:scale-[0.99] transition ${t?`min-h-11 py-3`:`py-2`}`,children:[(0,R.jsx)(`span`,{className:`flex-1 break-all`,children:e}),n?(0,R.jsx)(ue,{className:`size-3.5 shrink-0 text-green-500`}):(0,R.jsx)(ce,{className:`size-3.5 shrink-0 opacity-60`})]})}function mt(e){let t=e.startsWith(`/`),n=e.split(/[/\\]/).filter(Boolean),r=e=>{let r=(t?`/`:``)+n.slice(0,e+1).join(`/`);return/^[A-Za-z]:$/.test(r)?r+`/`:r},i=t?`/`:(n[0]??``)+`/`;return n.map((e,t)=>({name:e,absPath:r(t),parentDir:t>0?r(t-1):i}))}async function ht(e){return(await C.get(`/api/fs/browse?path=${encodeURIComponent(e)}`)).entries}function U({filePath:e,projectName:t,tabId:n,className:r}){let{updateTab:i,openTab:a}=D(Me(e=>({updateTab:e.updateTab,openTab:e.openTab}))),o=(0,L.useRef)(null),s=(0,L.useMemo)(()=>mt(e),[e]);(0,L.useEffect)(()=>{o.current&&(o.current.scrollLeft=o.current.scrollWidth)},[s]);let c=(0,L.useCallback)((e,r)=>{let o=E(e),s={filePath:e,projectName:t};r.metaKey||r.ctrlKey?a({type:`editor`,title:o,metadata:s,projectId:t,closable:!0}):i(n,{title:o,metadata:s})},[t,n,a,i]);return(0,R.jsx)(`div`,{ref:o,className:r,children:s.map((e,t)=>(0,R.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[t>0&&(0,R.jsx)(oe,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,R.jsx)(W,{segment:e,isLast:t===s.length-1,onFileClick:c})]},e.absPath))})}function W({segment:e,isLast:t,onFileClick:n}){let[r,i]=(0,L.useState)(null),[a,o]=(0,L.useState)(null);function s(t){t&&r===null&&ht(e.parentDir).then(i).catch(e=>{o(e.message||`Failed to browse`),i([])})}return(0,R.jsxs)(N,{onOpenChange:s,children:[(0,R.jsx)(ke,{asChild:!0,children:(0,R.jsx)(`button`,{type:`button`,className:`text-xs px-1 py-0.5 rounded hover:bg-muted transition-colors truncate max-w-[120px] ${t?`text-foreground font-medium`:`text-muted-foreground`}`,children:e.name})}),(0,R.jsx)(I,{align:`start`,className:`max-h-[300px] overflow-y-auto p-1`,children:r===null?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):a?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-destructive`,children:a}):r.length===0?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Empty`}):r.map(t=>(0,R.jsx)(gt,{entry:t,activePath:e.absPath,onFileClick:n},t.path))})]})}function gt({entry:e,activePath:t,onFileClick:n}){let r=G(e.name,e.type===`directory`),i=e.path===t,[a,o]=(0,L.useState)(null);if(e.type===`directory`){function s(t){t&&a===null&&ht(e.path).then(o).catch(()=>o([]))}return(0,R.jsxs)(j,{onOpenChange:s,children:[(0,R.jsxs)(A,{className:`text-xs gap-1.5 ${i?`bg-muted`:``}`,children:[(0,R.jsx)(r,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,R.jsx)(`span`,{className:`truncate`,children:e.name})]}),(0,R.jsx)(De,{className:`max-h-[300px] overflow-y-auto p-1`,children:a===null?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):a.length===0?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Empty`}):a.map(e=>(0,R.jsx)(gt,{entry:e,activePath:t,onFileClick:n},e.path))})]})}return(0,R.jsxs)(P,{className:`text-xs gap-1.5 cursor-pointer ${i?`bg-muted`:``}`,onClick:t=>n(e.path,t),children:[(0,R.jsx)(r,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,R.jsx)(`span`,{className:`truncate`,children:e.name})]})}var _t={ts:h,tsx:h,js:h,jsx:h,py:h,rs:h,go:h,html:h,css:h,scss:h,json:$e,md:le,txt:le,yaml:S,yml:S};function G(e,t){return t?o:_t[e.split(`.`).pop()?.toLowerCase()??``]??re}function K(e,t){let n=[],r=e,i=``;for(let e=0;e<t.length;e++){let a=t[e],o=t.slice(0,e+1).join(`/`),s=r.find(e=>e.name===a);if(n.push({name:a,fullPath:o,node:s??null,siblings:r,parentPath:i}),s?.children)i=s.path,r=s.children;else{for(let r=e+1;r<t.length;r++)n.push({name:t[r],fullPath:t.slice(0,r+1).join(`/`),node:null,siblings:[],parentPath:t.slice(0,r).join(`/`)});break}}return n}function vt(e){return[...e].sort((e,t)=>e.type===t.type?e.name.localeCompare(t.name):e.type===`directory`?-1:1)}function yt({filePath:e,projectName:t,tabId:n,className:r}){let i=O(e=>e.tree),{updateTab:a,openTab:o}=D(Me(e=>({updateTab:e.updateTab,openTab:e.openTab}))),s=me(e=>e.projects.find(e=>e.name===t)?.path??``),c=(0,L.useRef)(null),{prefixParts:l,relativePath:u,isExternal:d}=(0,L.useMemo)(()=>{let t=e.startsWith(`/`)?e.slice(1):e,n=s.startsWith(`/`)?s.slice(1):s;if(n&&t.startsWith(n+`/`)){let e=t.slice(n.length+1);return{prefixParts:n.split(`/`),relativePath:e,isExternal:!1}}return{prefixParts:[],relativePath:t,isExternal:/^(\/|[A-Za-z]:[/\\])/.test(e)}},[e,s]),f=(0,L.useMemo)(()=>K(i,u.split(`/`).filter(Boolean)),[i,u]);(0,L.useEffect)(()=>{c.current&&(c.current.scrollLeft=c.current.scrollWidth)},[f]);function p(e,r){let i=E(e);r.metaKey||r.ctrlKey?o({type:`editor`,title:i,metadata:{filePath:e,projectName:t},projectId:t,closable:!0}):a(n,{title:i,metadata:{filePath:e,projectName:t}})}return d?(0,R.jsx)(U,{filePath:e,projectName:t,tabId:n,className:r}):(0,R.jsxs)(`div`,{ref:c,className:r,children:[l.map((e,t)=>(0,R.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[t>0&&(0,R.jsx)(oe,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,R.jsx)(`span`,{className:`text-xs text-muted-foreground px-1 py-0.5`,children:e})]},`prefix-${t}`)),f.map((e,n)=>(0,R.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[(n>0||l.length>0)&&(0,R.jsx)(oe,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,R.jsx)(bt,{segment:e,isLast:n===f.length-1,projectName:t,onFileClick:p})]},e.fullPath))]})}function bt({segment:e,isLast:t,projectName:n,onFileClick:r}){let i=O(e=>e.loadChildren),a=O(e=>e.loadedPaths),o=(0,L.useMemo)(()=>vt(e.siblings),[e.siblings]),s=a.has(e.parentPath);function c(t){if(t&&!s){let t=e.parentPath.split(`/`).filter(Boolean);(async()=>{for(let e=0;e<=t.length;e++)await i(n,t.slice(0,e).join(`/`))})()}}return(0,R.jsxs)(N,{onOpenChange:c,children:[(0,R.jsx)(ke,{asChild:!0,children:(0,R.jsx)(`button`,{type:`button`,className:`text-xs px-1 py-0.5 rounded hover:bg-muted transition-colors truncate max-w-[120px] ${t?`text-foreground font-medium`:`text-muted-foreground`}`,children:e.name})}),(0,R.jsx)(I,{align:`start`,className:`max-h-[300px] p-1`,children:o.length===0?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):o.map(t=>(0,R.jsx)(xt,{node:t,projectName:n,activePath:e.fullPath,onFileClick:r},t.path))})]})}function xt({node:e,projectName:t,activePath:n,onFileClick:r}){let i=G(e.name,e.type===`directory`),a=e.path===n,o=O(e=>e.loadChildren),s=O(e=>e.loadedPaths);if(e.type===`directory`){let c=e.children??[],l=s.has(e.path);function u(n){n&&!l&&o(t,e.path)}return(0,R.jsxs)(j,{onOpenChange:u,children:[(0,R.jsxs)(A,{className:`text-xs gap-1.5 ${a?`bg-muted`:``}`,children:[(0,R.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,R.jsx)(`span`,{className:`truncate`,children:e.name})]}),(0,R.jsx)(De,{className:`max-h-[300px] overflow-y-auto p-1`,children:c.length===0?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):vt(c).map(e=>(0,R.jsx)(xt,{node:e,projectName:t,activePath:n,onFileClick:r},e.path))})]})}return(0,R.jsxs)(P,{className:`text-xs gap-1.5 cursor-pointer ${a?`bg-muted`:``}`,onSelect:e=>{},onClick:t=>{r(e.path,t)},children:[(0,R.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,R.jsx)(`span`,{className:`truncate`,children:e.name})]})}function q({active:e,onClick:t,icon:n,label:r,title:i}){return(0,R.jsxs)(`button`,{type:`button`,title:i,onClick:t,className:`flex items-center gap-1 px-2 py-1 rounded text-xs transition-colors ${e?`bg-muted text-foreground`:`text-muted-foreground hover:text-foreground`}`,children:[(0,R.jsx)(n,{className:`size-3`}),(0,R.jsx)(`span`,{className:`hidden sm:inline`,children:r})]})}function St({ext:e,mdMode:t,onMdModeChange:n,csvMode:r,onCsvModeChange:i,wordWrap:o,onToggleWordWrap:s,inlineBlame:c,onToggleInlineBlame:l,blameStale:u,onRefresh:f,refreshing:ee,filePath:te,projectName:ne,className:m}){return(0,R.jsxs)(`div`,{className:m,children:[(e===`md`||e===`mdx`)&&n&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(q,{active:t===`edit`,onClick:()=>n(`edit`),icon:p,label:`Edit`}),(0,R.jsx)(q,{active:t===`preview`,onClick:()=>n(`preview`),icon:se,label:`Preview`})]}),e===`csv`&&i&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(q,{active:r===`table`,onClick:()=>i(`table`),icon:d,label:`Table`}),(0,R.jsx)(q,{active:r===`raw`,onClick:()=>i(`raw`),icon:p,label:`Raw`})]}),(0,R.jsx)(q,{active:o,onClick:s,icon:_,label:`Wrap`}),l&&(0,R.jsx)(q,{active:c===!0,onClick:l,icon:a,label:`Blame`,title:c&&u?`Blame is hidden until this file is saved — the line numbers have moved`:`Inline blame (Alt+B)`}),f&&(0,R.jsxs)(`button`,{type:`button`,onClick:f,disabled:ee,title:`Reload file from disk`,className:`flex items-center gap-1 px-2 py-1 rounded text-xs text-muted-foreground hover:text-foreground transition-colors disabled:opacity-50`,children:[(0,R.jsx)(ae,{className:`size-3 ${ee?`animate-spin`:``}`}),(0,R.jsx)(`span`,{className:`hidden sm:inline`,children:`Refresh`})]}),te&&ne&&(0,R.jsx)(q,{active:!1,onClick:()=>Oe(ne,te),icon:b,label:`Download`})]})}function Ct({filePath:e,projectName:t,revision:n}){let[r,i]=(0,L.useState)(),[a,o]=(0,L.useState)();return(0,L.useEffect)(()=>{let n=new AbortController;i(void 0),o(void 0);let r=setTimeout(()=>n.abort(Error(`Preview request timed out. Try Refresh.`)),3e4),a=!0;return C.post(`/api/html-preview`,{filePath:e,projectName:t},{signal:n.signal}).then(e=>{a&&i(e.url)}).catch(e=>{a&&o(e instanceof Error?e.message:`Could not open HTML preview`)}).finally(()=>clearTimeout(r)),()=>{a=!1,clearTimeout(r),n.abort()}},[e,t,n]),a?(0,R.jsxs)(`div`,{role:`alert`,className:`p-4 text-sm text-destructive`,children:[a,`. Use Refresh to retry.`]}):r?(0,R.jsx)(`iframe`,{title:`HTML preview`,src:r,sandbox:`allow-scripts`,referrerPolicy:`no-referrer`,className:`flex-1 min-h-0 w-full border-0 bg-white`}):(0,R.jsxs)(`div`,{role:`status`,className:`flex flex-1 items-center justify-center gap-2 text-sm text-muted-foreground`,children:[(0,R.jsx)(x,{className:`size-5 animate-spin`}),`Loading preview…`]})}var wt=[{id:`plaintext`,label:`Plain Text`},{id:`javascript`,label:`JavaScript`},{id:`typescript`,label:`TypeScript`},{id:`sql`,label:`SQL`},{id:`json`,label:`JSON`},{id:`xml`,label:`XML`},{id:`html`,label:`HTML`},{id:`css`,label:`CSS`},{id:`python`,label:`Python`},{id:`markdown`,label:`Markdown`},{id:`yaml`,label:`YAML`},{id:`shell`,label:`Shell`},{id:`dotenv`,label:`Dotenv`}];function Tt({value:e,onChange:t}){return(0,R.jsxs)(`div`,{className:`shrink-0 flex items-center gap-1 px-2 border-l border-border`,children:[(0,R.jsx)(h,{className:`size-3 text-muted-foreground`}),(0,R.jsx)(`select`,{value:e,onChange:e=>t(e.target.value),className:`h-5 text-[10px] bg-transparent border border-border rounded px-1 text-foreground outline-none max-w-[120px]`,title:`Select editor language`,children:wt.map(e=>(0,R.jsx)(`option`,{value:e.id,children:e.label},e.id))})]})}var J=`flex items-center justify-center gap-1.5 rounded px-2 min-h-11 min-w-11 md:min-h-7 md:min-w-7 text-xs text-muted-foreground hover:text-foreground hover:bg-muted`,Y=`min-h-11 md:min-h-8 px-2`,Et=`${Y} pr-8 [&>span]:left-auto [&>span]:right-2`;function Dt(e){let{mode:t,onModeChange:n,onRefresh:r,unsaved:o,breadcrumb:s}=e;return(0,R.jsxs)(`div`,{className:`flex items-center gap-2 md:gap-1 border-b border-border bg-background px-2 shrink-0 h-12 md:h-8`,role:`toolbar`,"aria-label":`HTML preview`,children:[(0,R.jsx)(`div`,{className:`hidden md:flex flex-1 min-w-0 overflow-hidden`,children:s}),t===`preview`&&(0,R.jsx)(`button`,{type:`button`,onClick:r,title:`Reload the original HTML file`,"aria-label":`Refresh preview`,className:J,children:(0,R.jsx)(ae,{className:`size-4`})}),[[`edit`,`Code`,p],[`preview`,`Preview`,se]].map(([e,r,i])=>(0,R.jsxs)(`button`,{type:`button`,"aria-pressed":t===e,onClick:()=>n(e),className:`${J} ${t===e?`bg-muted text-foreground`:``}`,children:[(0,R.jsx)(i,{className:`size-3.5`}),r]},e)),o&&(0,R.jsx)(`span`,{role:`status`,title:`Preview uses the saved file`,"aria-label":`Preview uses the saved file`,className:`text-amber-500 text-xs`,children:`●`}),(0,R.jsxs)(N,{children:[(0,R.jsx)(ke,{asChild:!0,children:(0,R.jsx)(`button`,{type:`button`,title:`More HTML actions`,"aria-label":`More HTML actions`,className:`${J} ml-auto md:ml-0`,children:(0,R.jsx)(i,{className:`size-4`})})}),(0,R.jsxs)(I,{align:`end`,className:`w-52`,children:[t===`edit`&&(0,R.jsxs)(P,{className:Y,disabled:o||e.refreshing,onSelect:e.onReloadCode,children:[(0,R.jsx)(ae,{}),`Reload code from disk`]}),(0,R.jsxs)(P,{className:Y,onSelect:()=>void Oe(e.projectName??``,e.filePath),children:[(0,R.jsx)(b,{}),`Download`]}),(0,R.jsx)(Fe,{}),(0,R.jsxs)(F,{className:Et,checked:e.wordWrap,onCheckedChange:e.onToggleWordWrap,children:[(0,R.jsx)(_,{className:`size-4 text-muted-foreground`}),`Word wrap`]}),e.onToggleInlineBlame&&(0,R.jsxs)(F,{className:Et,checked:e.inlineBlame,onCheckedChange:e.onToggleInlineBlame,children:[(0,R.jsx)(a,{className:`size-4 text-muted-foreground`}),`Inline blame`]}),e.onToggleLsp&&(0,R.jsxs)(F,{className:Et,checked:e.lspEnabled,onCheckedChange:e.onToggleLsp,children:[(0,R.jsx)(u,{className:`size-4 text-muted-foreground`}),`Language server`]}),(0,R.jsxs)(j,{children:[(0,R.jsxs)(A,{className:`${Y} gap-2`,children:[(0,R.jsx)(h,{className:`size-4 text-muted-foreground`}),`Editor language`]}),(0,R.jsx)(De,{className:`max-h-80 overflow-y-auto`,children:(0,R.jsx)(je,{value:e.language,onValueChange:e.onLanguageChange,children:wt.map(e=>(0,R.jsx)(Te,{className:`min-h-11 md:min-h-8`,value:e.id,children:e.label},e.id))})})]})]})]})]})}function Ot({open:e,defaultName:t,content:n,onSave:r,onCancel:i}){let[a,o]=(0,L.useState)(t),[s,c]=(0,L.useState)(!1),[l,u]=(0,L.useState)(``),d=me(e=>e.activeProject),f=(0,L.useCallback)(()=>{let e=a.trim();if(!e){u(`Filename cannot be empty`);return}if(/[/\\]/.test(e)){u(`Filename cannot contain / or \\`);return}u(``),c(!0)},[a]),p=(0,L.useCallback)(e=>{let t=e.includes(`\\`)?`\\`:`/`;r(e.endsWith(t)?`${e}${a.trim()}`:`${e}${t}${a.trim()}`,n)},[a,n,r]);return s?(0,R.jsx)(M,{open:!0,mode:`folder`,root:d?.path,title:`Save "${a.trim()}" to...`,onSelect:p,onCancel:()=>c(!1)}):(0,R.jsx)(Se,{open:e,onOpenChange:e=>{e||i()},children:(0,R.jsxs)(be,{className:`sm:max-w-md`,children:[(0,R.jsx)(ve,{children:(0,R.jsx)(xe,{children:`Save As`})}),(0,R.jsxs)(`div`,{className:`flex flex-col gap-2 py-2`,children:[(0,R.jsx)(`label`,{className:`text-sm text-muted-foreground`,children:`Filename`}),(0,R.jsx)(k,{value:a,onChange:e=>{o(e.target.value),u(``)},onKeyDown:e=>{e.key===`Enter`&&f()},placeholder:`e.g. my-file.ts`,autoFocus:!0}),l&&(0,R.jsx)(`p`,{className:`text-xs text-destructive`,children:l})]}),(0,R.jsxs)(ye,{children:[(0,R.jsx)(_e,{variant:`outline`,onClick:i,children:`Cancel`}),(0,R.jsx)(_e,{onClick:f,children:`Choose Folder...`})]})]})})}var kt=typeof window<`u`&&window.isSecureContext,At=[`(`,`)`,`{`,`}`,`[`,`]`,`<`,`>`,`;`,`:`,`=`,`"`,`'`,"`",`/`,`\\`,`_`,`#`],X=`px-2 py-1.5 rounded text-xs min-w-[36px] min-h-[32px] bg-surface-elevated text-text-primary active:bg-primary active:text-primary-foreground transition-colors select-none`,jt=`px-3 py-1.5 rounded text-xs font-mono min-w-[36px] min-h-[32px] bg-surface-elevated text-text-primary active:bg-primary active:text-primary-foreground transition-colors select-none`,Mt=`w-px h-5 bg-border mx-0.5 shrink-0`;function Nt({editorRef:e,readOnly:t,wrapOn:n,onToggleWrap:r}){let i=(0,L.useCallback)(()=>e.current,[e]),a=(0,L.useCallback)(e=>{let t=i();if(!t)return;t.focus();let n=t.getSelection();n&&t.executeEdits(`mobile-toolbar`,[{range:n,text:e}])},[i]),[o,l]=(0,L.useState)(!1),u=(0,L.useRef)(null),d=(0,L.useCallback)(async()=>{try{let e=await navigator.clipboard.readText();e&&a(e)}catch{}},[a]),f=(0,L.useCallback)(()=>{l(!0),requestAnimationFrame(()=>u.current?.focus())},[]),p=(0,L.useCallback)(e=>{e.preventDefault();let t=e.clipboardData.getData(`text/plain`);t&&(l(!1),a(t))},[a]),ee=(0,L.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`undo`,null))},[i]),te=(0,L.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`redo`,null))},[i]),ne=(0,L.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`tab`,null))},[i]);return t?null:(0,R.jsxs)(`div`,{className:`shrink-0 border-t border-border bg-surface`,children:[!kt&&o&&(0,R.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1.5 border-b border-border bg-muted/50`,children:[(0,R.jsx)(`textarea`,{ref:u,onPaste:p,placeholder:`Long-press here → Paste`,className:`flex-1 h-8 rounded border border-border bg-background text-foreground text-xs px-2 py-1.5 resize-none focus:outline-none focus:ring-1 focus:ring-primary`}),(0,R.jsx)(`button`,{type:`button`,onClick:()=>l(!1),className:`p-1.5 rounded text-muted-foreground active:bg-muted transition-colors`,children:(0,R.jsx)(c,{size:14})})]}),(0,R.jsxs)(`div`,{className:`flex items-center gap-1 px-2 py-1.5 overflow-x-auto`,children:[(0,R.jsx)(`button`,{type:`button`,onClick:kt?d:f,className:X,title:`Paste`,children:(0,R.jsx)(g,{size:14})}),(0,R.jsx)(`button`,{type:`button`,onClick:ee,className:X,title:`Undo`,children:(0,R.jsx)(s,{size:14})}),(0,R.jsx)(`button`,{type:`button`,onClick:te,className:X,title:`Redo`,children:(0,R.jsx)(y,{size:14})}),(0,R.jsx)(`button`,{type:`button`,onClick:r,className:`${X} ${n?`text-primary`:``}`,title:n?`Wrapping long lines — tap to scroll sideways instead`:`Wrap long lines`,children:(0,R.jsx)(_,{size:14})}),(0,R.jsx)(`div`,{className:Mt}),(0,R.jsx)(`button`,{type:`button`,onClick:ne,className:jt,children:`Tab`}),(0,R.jsx)(`div`,{className:Mt}),At.map(e=>(0,R.jsx)(`button`,{type:`button`,onClick:()=>a(e),className:jt,children:e},e))]})]})}var Pt=(0,L.lazy)(()=>T(()=>import(`./markdown-renderer-D5-xliE9.js`).then(e=>({default:e.MarkdownRenderer})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]))),Ft=(0,L.lazy)(()=>T(()=>import(`./editor-language-service-BVJQnTSV.js`).then(e=>({default:e.EditorLanguageService})),__vite__mapDeps([41,2,1,3,10,42,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,43]))),It=(0,L.lazy)(()=>T(()=>import(`./csv-preview-Be3ODNj0.js`).then(e=>({default:e.CsvPreview})),__vite__mapDeps([44,2,5,6,1,3,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,45,46]))),Lt=(0,L.lazy)(()=>T(()=>import(`./image-preview-DuODZoNO.js`).then(e=>({default:e.ImagePreview})),__vite__mapDeps([47,1,2,3,10,48,21]))),Rt=(0,L.lazy)(()=>T(()=>import(`./pdf-preview-PWDBbNwt.js`).then(e=>({default:e.PdfPreview})),__vite__mapDeps([49,2,1,3,10,21]))),zt=(0,L.lazy)(()=>T(()=>import(`./video-preview-DzwY3q9W.js`).then(e=>({default:e.VideoPreview})),__vite__mapDeps([50,2,5,6,1,3,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,51,52]))),Bt=(0,L.lazy)(()=>T(()=>import(`./audio-preview-BrS2qNK0.js`).then(e=>({default:e.AudioPreview})),__vite__mapDeps([53,2,1,3,8,10,21,52]))),Vt=(0,L.lazy)(()=>T(()=>import(`./docx-preview-b-Ui9jDq.js`).then(e=>({default:e.DocxPreview})),__vite__mapDeps([54,2,1,3,10,21])));function Ht(e){return e.split(`.`).pop()?.toLowerCase()??``}function Ut(e){return{js:`javascript`,jsx:`javascript`,ts:`typescript`,tsx:`typescript`,py:`python`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,mdx:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,bash:`shell`,sql:`sql`}[Ht(e)]??(He(e)?`dotenv`:`plaintext`)}var Wt=(0,L.memo)(function({metadata:e,tabId:t}){let n=e?.filePath,r=e?.projectName,i=e?.inlineContent,a=e?.inlineLanguage,[o,s]=(0,L.useState)(i??null),[c,l]=(0,L.useState)(`utf-8`),[u,d]=(0,L.useState)(!0),[p,m]=(0,L.useState)(null),[re,ae]=(0,L.useState)(null),oe=D(e=>e.activeTabId),[se,ce]=(0,L.useState)(0);(0,L.useEffect)(()=>{let e=()=>ce(e=>e+1);return window.addEventListener(`ppm:onboarding-refresh`,e),()=>window.removeEventListener(`ppm:onboarding-refresh`,e)},[]);let[h,g]=(0,L.useState)(!1),_=(0,L.useRef)(null),v=(0,L.useRef)(``),y=(0,L.useRef)(null),[b,le]=(0,L.useState)(null),{tabs:ue,updateTab:S}=D(Me(e=>({tabs:e.tabs,updateTab:e.updateTab}))),{wordWrap:de,toggleWordWrap:me,mobileWordWrap:O,toggleMobileWordWrap:_e}=w(Me(e=>({wordWrap:e.wordWrap,toggleWordWrap:e.toggleWordWrap,mobileWordWrap:e.mobileWordWrap,toggleMobileWordWrap:e.toggleMobileWordWrap}))),ve=w(e=>e.inlineBlame),ye=w(e=>e.toggleInlineBlame),be=w(e=>e.lspEnabled),xe=w(e=>e.setLspEnabled),Se=he(),Ce=Pe(),k=Se?O:de,Te=Se?_e:me,Ee=Re(),A=e?.isUntitled===!0,De=e?.unsavedContent,[Oe,ke]=(0,L.useState)(!1),je=ue.find(e=>e.id===t),j=n?Ht(n):``,M=Ge.has(j),N=j===`pdf`,P=j===`docx`,F=We.has(j),Fe=qe.has(j),I=Ke.has(j),He=j===`md`||j===`mdx`,Qe=(j===`html`||j===`htm`)&&!A&&i==null,[$e,et]=(0,L.useState)(`preview`),[tt,nt]=(0,L.useState)(0),[rt,it]=(0,L.useState)(!1),z=Qe&&$e===`preview`,at=j===`csv`,ot=e?.language,B=a??ot??Ut(n??``),V=B===`sql`,[lt,ut]=(0,L.useState)(`preview`),[dt,ft]=(0,L.useState)(`table`),{connections:H,cachedTables:pt,refreshTables:mt,updateConnection:ht}=Ie(),U=n?`ppm:sql-conn:${n}`:t?`ppm:sql-conn:tab:${t}`:null,[W,gt]=(0,L.useState)(()=>{if(!U)return null;let e=localStorage.getItem(U);return e?Number(e):null}),_t=(0,L.useRef)(null),G=(0,L.useRef)(null),K=(0,L.useMemo)(()=>H.find(e=>e.id===W)??null,[H,W]),vt=i!=null&&(a===`json`||a===`xml`),[bt,xt]=(0,L.useState)(!1),q=(0,L.useCallback)(()=>{if(i)if(bt)s(i),xt(!1);else{let e=i.trimStart();if(a===`json`)try{s(JSON.stringify(JSON.parse(e),null,2)),xt(!0)}catch{}else if(a===`xml`){let t=0;s(e.replace(/(>)(<)(\/*)/g,`$1
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/markdown-renderer-CS193h6D.js","assets/vendor-ui-P9Ym7hCv.js","assets/rolldown-runtime-C5c2KzVm.js","assets/vendor-markdown-QKPNiWEd.js","assets/markdown-renderer-C9inQ_Z3.js","assets/index-D41mthBS.js","assets/preload-helper-BEFjQwLd.js","assets/button-CsmGH5xa.js","assets/utils-btZ8C8-R.js","assets/createLucideIcon-DBXq3G0e.js","assets/api-client-F5Zi1sR0.js","assets/react-CzUPVyyG.js","assets/panel-store-DrSH3Nhp.js","assets/window-store-B4cbZ5rr.js","assets/project-store-CCimwgGF.js","assets/settings-store-3jIBB8gx.js","assets/file-store-DCU7_YyB.js","assets/window-pip-registry-dxrBFfkP.js","assets/onboarding-quick-orientation-WLKI95GY.js","assets/dialog-z8PLkL8n.js","assets/portal-container-context-NFSuymMu.js","assets/icons-CO_II6D-.js","assets/use-is-mobile-CkO33jqU.js","assets/format-file-meta-B0ZpqzSM.js","assets/fs-api-vF_bQoeL.js","assets/context-menu-CH1mvCwA.js","assets/input-CP31LZnN.js","assets/mobile-bottom-sheet-CLic9ovp.js","assets/use-visual-viewport-C307OVeV.js","assets/scroll-area-Dp-P38kg.js","assets/chat-preparation-cache-DoS7sdal.js","assets/file-icons-Ed_yLyef.js","assets/format-date-Fd9tpNaw.js","assets/git-repo-store-CdoOpvmf.js","assets/ws-auth-J3hw0Mhc.js","assets/tab-store-CUPgQIQz.js","assets/apply-theme-aVoqSG0I.js","assets/resolve-theme-B87m6l4i.js","assets/index-BmsPSBtF.css","assets/image-gallery-FN-9YT5_.js","assets/run-in-terminal-Cdn9PaAl.js","assets/editor-language-service-DufWCv_b.js","assets/use-lsp-D6skvdIp.js","assets/lsp-client-Ce_E8lQ7.js","assets/csv-preview-BfX8PrGn.js","assets/lib-g-qFlogj.js","assets/csv-parser-CoLcPhFa.js","assets/image-preview-DuODZoNO.js","assets/use-blob-url-B3R1DMZ0.js","assets/pdf-preview-PWDBbNwt.js","assets/video-preview-08dogvSP.js","assets/can-open-in-ppm-B9ZwTOGE.js","assets/media-url-mOPwQ_ey.js","assets/audio-preview-BrS2qNK0.js","assets/docx-preview-b-Ui9jDq.js"])))=>i.map(i=>d[i]);
2
+ import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-P9Ym7hCv.js";import{$r as r,An as i,Br as a,Dt as o,Fr as s,Jr as c,Lt as l,Qr as u,Tr as d,Yn as f,Z as p,_r as ee,at as te,bt as ne,ct as m,dt as re,gr as ie,ir as ae,j as oe,lt as se,nt as ce,pt as h,q as g,qr as _,r as v,rr as y,st as b,un as x,vt as le,w as ue,yt as S}from"./icons-CO_II6D-.js";import{t as de}from"./createLucideIcon-DBXq3G0e.js";import{o as fe,r as C}from"./api-client-F5Zi1sR0.js";import{t as w}from"./settings-store-3jIBB8gx.js";import{t as T}from"./preload-helper-BEFjQwLd.js";import{t as E}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import{t as pe}from"./panel-store-DrSH3Nhp.js";import"./window-store-B4cbZ5rr.js";import{i as me}from"./project-store-CCimwgGF.js";import{t as D}from"./tab-store-CUPgQIQz.js";import{o as O}from"./file-store-DCU7_YyB.js";import{n as he,t as ge}from"./use-is-mobile-CkO33jqU.js";import"./git-repo-store-CdoOpvmf.js";import{t as _e}from"./button-CsmGH5xa.js";import{a as ve,i as ye,n as be,o as xe,t as Se}from"./dialog-z8PLkL8n.js";import"./file-icons-Ed_yLyef.js";import{t as Ce}from"./mobile-bottom-sheet-CLic9ovp.js";import"./use-visual-viewport-C307OVeV.js";import"./fs-api-vF_bQoeL.js";import"./format-file-meta-B0ZpqzSM.js";import{t as k}from"./input-CP31LZnN.js";import"./scroll-area-Dp-P38kg.js";import{A as we,Cn as Te,Ct as Ee,Dn as A,En as De,Ln as Oe,On as ke,Pt as Ae,Sn as je,Tn as j,Tt as M,_n as N,bn as P,gn as Me,k as Ne,v as Pe,vn as F,wn as Fe,wt as Ie,yn as I,zn as Le}from"./index-D41mthBS.js";import"./data-grid-types-DatI2Wee.js";import"./marked.esm-BHcxKPtl.js";import{t as Re}from"./use-monaco-theme-08OELBic.js";import{n as ze,t as Be}from"./editor-font-BWW2uS94.js";import{t as Ve}from"./use-inline-blame-I6_SHzP0.js";import{n as He,r as Ue}from"./monaco-dotenv-language-CQpgAhmX.js";import{i as We,n as Ge,r as Ke,t as qe}from"./can-open-in-ppm-B9ZwTOGE.js";import{a as Je,i as Ye,o as Xe,r as Ze,t as Qe}from"./glide-data-grid-BuVHCdOY.js";var $e=de(`file-braces`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 12a1 1 0 0 0-1 1v1a1 1 0 0 1-1 1 1 1 0 0 1 1 1v1a1 1 0 0 0 1 1`,key:`1oajmo`}],[`path`,{d:`M14 18a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1 1 1 0 0 1-1-1v-1a1 1 0 0 0-1-1`,key:`mpwhp6`}]]),L=e(t(),1),R=n();function et({projectName:e,filePath:t,tabId:n,ready:r,children:i}){let a=(0,L.useRef)(null),o=D(e=>e.activeTabId);return(0,L.useEffect)(()=>{let i=()=>{if(!r||!e||!t||!n||o!==n)return;let i=!!a.current?.checkVisibility({checkOpacity:!0,checkVisibilityCSS:!0});i&&Ae({type:`file-ready`,projectName:e,tabId:n,visible:i,isRunDocument:/^readme(?:\.[^/\\]+)?$/i.test(t.split(/[/\\]/).pop()??``)})};return i(),window.addEventListener(`ppm:onboarding-refresh`,i),()=>window.removeEventListener(`ppm:onboarding-refresh`,i)},[e,t,n,r,o]),(0,R.jsx)(`div`,{ref:a,className:`flex flex-1 min-h-0 flex-col`,children:i})}var tt=[`completionItems`,`hovers`,`documentSymbols`,`definitions`,`references`,`documentHighlights`,`rename`,`diagnostics`,`documentRangeFormattingEdits`,`signatureHelp`,`onTypeFormattingEdits`,`codeActions`,`inlayHints`];function nt(e){return Object.fromEntries(tt.map(t=>[t,e]))}var rt=nt(!1),it=nt(!0),z={noSemanticValidation:!0,noSyntaxValidation:!0,noSuggestionDiagnostics:!0},at=1;function ot(e,t){for(let n of[e,t])n.setModeConfiguration({...rt}),n.setDiagnosticsOptions({...z})}function B(e,t){for(let n of[e,t])n.setCompilerOptions({...n.getCompilerOptions(),jsx:at,allowJs:!0,allowNonTsExtensions:!0}),n.setModeConfiguration({...it}),n.setDiagnosticsOptions({...z})}function st(e,t,n){e?ot(t,n):B(t,n)}function ct({enabled:e,onToggle:t,status:n,diagnostics:i,onInstall:a}){let[o,s]=(0,L.useState)(!1),c=he();if(!e)return(0,R.jsxs)(`button`,{type:`button`,onClick:()=>t(!0),title:`Language server: off. Turn it on for completions, hover, go to definition, rename and quick fix from a real server. It runs as a process on the host.`,className:`flex items-center gap-1 rounded px-1.5 text-xs text-muted-foreground hover:bg-muted active:scale-95 transition-colors ${c?`min-h-11`:`py-0.5`}`,children:[(0,R.jsx)(r,{className:`size-3 shrink-0`}),(0,R.jsx)(`span`,{children:`LSP off`})]});if(!n)return null;let l=i.filter(e=>e.severity===1).length,d=i.filter(e=>e.severity===2).length,f=n.state===`ready`?n.server.displayName:n.state===`opening`?`Starting…`:n.server?.displayName??`No server`,p=n.state===`unavailable`&&n.reason===`not-installed`;return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(`button`,{type:`button`,onClick:()=>s(!0),title:n.state===`ready`?`${n.server.displayName} — rooted at ${n.server.rootPath}`:n.state===`unavailable`?n.message:`Starting the language server`,className:`flex items-center gap-1 rounded px-1.5 hover:bg-muted active:scale-95 transition-colors text-xs ${c?`min-h-11`:`py-0.5`} ${p?`text-amber-500`:`text-muted-foreground`}`,children:[n.state===`opening`?(0,R.jsx)(x,{className:`size-3 animate-spin shrink-0`}):p?(0,R.jsx)(v,{className:`size-3 shrink-0`}):(0,R.jsx)(u,{className:`size-3 shrink-0`}),(0,R.jsx)(`span`,{className:`max-w-24 truncate`,children:f}),l>0&&(0,R.jsx)(`span`,{className:`text-red-500`,children:l}),l===0&&d>0&&(0,R.jsx)(`span`,{className:`text-amber-500`,children:d})]}),o&&(0,R.jsx)(V,{status:n,errors:l,warnings:d,isMobile:c,onToggle:t,onInstall:a,onClose:()=>s(!1)})]})}function V({status:e,errors:t,warnings:n,isMobile:r,onToggle:i,onInstall:a,onClose:o}){let s=(0,R.jsx)(lt,{status:e,errors:t,warnings:n,isMobile:r,onToggle:i,onInstall:a});return r?(0,R.jsx)(Ce,{open:!0,onClose:o,className:`popover-solid max-h-[85dvh] flex flex-col`,children:s}):(0,R.jsx)(Se,{open:!0,onOpenChange:e=>!e&&o(),children:(0,R.jsxs)(be,{className:`sm:max-w-lg`,children:[(0,R.jsx)(xe,{children:`Language server`}),s]})})}function lt({status:e,errors:t,warnings:n,isMobile:r,onToggle:i,onInstall:a}){return(0,R.jsxs)(`div`,{className:`p-4 space-y-4 overflow-y-auto text-sm leading-relaxed`,children:[e.state===`ready`&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(H,{label:`Server`,value:e.server.displayName}),(0,R.jsx)(H,{label:`Language`,value:e.languageId}),(0,R.jsx)(H,{label:`Project root`,value:e.server.rootPath,mono:!0}),(0,R.jsx)(H,{label:`Problems`,value:`${t} error${t===1?``:`s`}, ${n} warning${n===1?``:`s`}`}),(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Completions, hover, go to definition (F12), find references (Shift+F12), rename (F2), quick fix (Ctrl+.) and format (Shift+Alt+F) all come from this server.`})]}),e.state===`opening`&&(0,R.jsx)(`p`,{className:`text-muted-foreground`,children:`Starting the language server. A cold start reads the project's dependencies, so the first completion in a large project can take a few seconds.`}),e.state===`unavailable`&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`p`,{children:e.message}),e.server&&(0,R.jsxs)(`div`,{className:`space-y-2`,children:[e.reason===`not-installed`&&e.server.installable&&a?(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:ut(e.server.installWith)}),(0,R.jsx)(ft,{server:e.server,isMobile:r,onInstall:a}),(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Or run it yourself:`})]}):(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:dt(e.server.installWith)}),(0,R.jsx)(pt,{command:e.server.installHint,isMobile:r})]}),e.reason===`no-language`&&(0,R.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`No language server is registered for this file type.`})]}),(0,R.jsxs)(`div`,{className:`flex items-center justify-between gap-3 border-t border-border pt-3`,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`p`,{className:`text-xs font-medium`,children:`Language server`}),(0,R.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`On for this device. Turning it off stops the process.`})]}),(0,R.jsx)(Ee,{checked:!0,onCheckedChange:e=>i(e)})]})]})}function ut(e){switch(e){case`go`:return`PPM builds it with the Go on this machine and keeps the binary in its own folder, leaving your GOBIN alone. A first build takes a minute or two.`;case`rustup`:return`PPM asks rustup to add the component to the toolchain this project uses — the same as running the command below yourself.`;default:return`PPM downloads it from npm into its own folder. Nothing you installed globally changes, and this file picks it up without being reopened.`}}function dt(e){switch(e){case`go`:return`Install it, then reopen this file. PPM installs language servers but never toolchains, and it cannot find a Go on this host.`;case`rustup`:return`Install it, then reopen this file. PPM installs language servers but never toolchains, and it cannot find rustup on this host.`;default:return`Install it, then reopen this file. This one comes from a system package manager, which PPM will not run on your behalf.`}}function ft({server:e,isMobile:t,onInstall:n}){let[r,i]=(0,L.useState)(!1),[a,o]=(0,L.useState)(null);return(0,R.jsxs)(R.Fragment,{children:[(0,R.jsxs)(_e,{type:`button`,disabled:r,onClick:()=>{i(!0),o(null),n(e.id).catch(e=>o(e instanceof Error?e.message:String(e))).finally(()=>i(!1))},className:`w-full ${t?`min-h-11`:``}`,children:[r?(0,R.jsx)(x,{className:`size-4 animate-spin`}):(0,R.jsx)(b,{className:`size-4`}),r?`Installing ${e.displayName}…`:`Install ${e.displayName}`]}),a&&(0,R.jsx)(`p`,{className:`text-xs text-red-500 break-words`,children:a})]})}function H({label:e,value:t,mono:n}){return(0,R.jsxs)(`div`,{className:`flex gap-2 items-baseline`,children:[(0,R.jsx)(`span`,{className:`text-muted-foreground shrink-0 w-24 text-xs`,children:e}),(0,R.jsx)(`span`,{className:`min-w-0 break-all ${n?`font-mono text-xs`:``}`,children:t})]})}function pt({command:e,isMobile:t}){let[n,r]=(0,L.useState)(!1);return(0,R.jsxs)(`button`,{type:`button`,onClick:()=>{navigator.clipboard?.writeText(e).then(()=>{r(!0),setTimeout(()=>r(!1),1500)})},className:`w-full flex items-center gap-2 rounded border border-border bg-muted/40 px-3 text-left font-mono text-xs hover:bg-muted active:scale-[0.99] transition ${t?`min-h-11 py-3`:`py-2`}`,children:[(0,R.jsx)(`span`,{className:`flex-1 break-all`,children:e}),n?(0,R.jsx)(ue,{className:`size-3.5 shrink-0 text-green-500`}):(0,R.jsx)(ce,{className:`size-3.5 shrink-0 opacity-60`})]})}function mt(e){let t=e.startsWith(`/`),n=e.split(/[/\\]/).filter(Boolean),r=e=>{let r=(t?`/`:``)+n.slice(0,e+1).join(`/`);return/^[A-Za-z]:$/.test(r)?r+`/`:r},i=t?`/`:(n[0]??``)+`/`;return n.map((e,t)=>({name:e,absPath:r(t),parentDir:t>0?r(t-1):i}))}async function ht(e){return(await C.get(`/api/fs/browse?path=${encodeURIComponent(e)}`)).entries}function U({filePath:e,projectName:t,tabId:n,className:r}){let{updateTab:i,openTab:a}=D(Me(e=>({updateTab:e.updateTab,openTab:e.openTab}))),o=(0,L.useRef)(null),s=(0,L.useMemo)(()=>mt(e),[e]);(0,L.useEffect)(()=>{o.current&&(o.current.scrollLeft=o.current.scrollWidth)},[s]);let c=(0,L.useCallback)((e,r)=>{let o=E(e),s={filePath:e,projectName:t};r.metaKey||r.ctrlKey?a({type:`editor`,title:o,metadata:s,projectId:t,closable:!0}):i(n,{title:o,metadata:s})},[t,n,a,i]);return(0,R.jsx)(`div`,{ref:o,className:r,children:s.map((e,t)=>(0,R.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[t>0&&(0,R.jsx)(oe,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,R.jsx)(W,{segment:e,isLast:t===s.length-1,onFileClick:c})]},e.absPath))})}function W({segment:e,isLast:t,onFileClick:n}){let[r,i]=(0,L.useState)(null),[a,o]=(0,L.useState)(null);function s(t){t&&r===null&&ht(e.parentDir).then(i).catch(e=>{o(e.message||`Failed to browse`),i([])})}return(0,R.jsxs)(N,{onOpenChange:s,children:[(0,R.jsx)(ke,{asChild:!0,children:(0,R.jsx)(`button`,{type:`button`,className:`text-xs px-1 py-0.5 rounded hover:bg-muted transition-colors truncate max-w-[120px] ${t?`text-foreground font-medium`:`text-muted-foreground`}`,children:e.name})}),(0,R.jsx)(I,{align:`start`,className:`max-h-[300px] overflow-y-auto p-1`,children:r===null?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):a?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-destructive`,children:a}):r.length===0?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Empty`}):r.map(t=>(0,R.jsx)(gt,{entry:t,activePath:e.absPath,onFileClick:n},t.path))})]})}function gt({entry:e,activePath:t,onFileClick:n}){let r=G(e.name,e.type===`directory`),i=e.path===t,[a,o]=(0,L.useState)(null);if(e.type===`directory`){function s(t){t&&a===null&&ht(e.path).then(o).catch(()=>o([]))}return(0,R.jsxs)(j,{onOpenChange:s,children:[(0,R.jsxs)(A,{className:`text-xs gap-1.5 ${i?`bg-muted`:``}`,children:[(0,R.jsx)(r,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,R.jsx)(`span`,{className:`truncate`,children:e.name})]}),(0,R.jsx)(De,{className:`max-h-[300px] overflow-y-auto p-1`,children:a===null?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):a.length===0?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Empty`}):a.map(e=>(0,R.jsx)(gt,{entry:e,activePath:t,onFileClick:n},e.path))})]})}return(0,R.jsxs)(P,{className:`text-xs gap-1.5 cursor-pointer ${i?`bg-muted`:``}`,onClick:t=>n(e.path,t),children:[(0,R.jsx)(r,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,R.jsx)(`span`,{className:`truncate`,children:e.name})]})}var _t={ts:h,tsx:h,js:h,jsx:h,py:h,rs:h,go:h,html:h,css:h,scss:h,json:$e,md:le,txt:le,yaml:S,yml:S};function G(e,t){return t?o:_t[e.split(`.`).pop()?.toLowerCase()??``]??re}function K(e,t){let n=[],r=e,i=``;for(let e=0;e<t.length;e++){let a=t[e],o=t.slice(0,e+1).join(`/`),s=r.find(e=>e.name===a);if(n.push({name:a,fullPath:o,node:s??null,siblings:r,parentPath:i}),s?.children)i=s.path,r=s.children;else{for(let r=e+1;r<t.length;r++)n.push({name:t[r],fullPath:t.slice(0,r+1).join(`/`),node:null,siblings:[],parentPath:t.slice(0,r).join(`/`)});break}}return n}function vt(e){return[...e].sort((e,t)=>e.type===t.type?e.name.localeCompare(t.name):e.type===`directory`?-1:1)}function yt({filePath:e,projectName:t,tabId:n,className:r}){let i=O(e=>e.tree),{updateTab:a,openTab:o}=D(Me(e=>({updateTab:e.updateTab,openTab:e.openTab}))),s=me(e=>e.projects.find(e=>e.name===t)?.path??``),c=(0,L.useRef)(null),{prefixParts:l,relativePath:u,isExternal:d}=(0,L.useMemo)(()=>{let t=e.startsWith(`/`)?e.slice(1):e,n=s.startsWith(`/`)?s.slice(1):s;if(n&&t.startsWith(n+`/`)){let e=t.slice(n.length+1);return{prefixParts:n.split(`/`),relativePath:e,isExternal:!1}}return{prefixParts:[],relativePath:t,isExternal:/^(\/|[A-Za-z]:[/\\])/.test(e)}},[e,s]),f=(0,L.useMemo)(()=>K(i,u.split(`/`).filter(Boolean)),[i,u]);(0,L.useEffect)(()=>{c.current&&(c.current.scrollLeft=c.current.scrollWidth)},[f]);function p(e,r){let i=E(e);r.metaKey||r.ctrlKey?o({type:`editor`,title:i,metadata:{filePath:e,projectName:t},projectId:t,closable:!0}):a(n,{title:i,metadata:{filePath:e,projectName:t}})}return d?(0,R.jsx)(U,{filePath:e,projectName:t,tabId:n,className:r}):(0,R.jsxs)(`div`,{ref:c,className:r,children:[l.map((e,t)=>(0,R.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[t>0&&(0,R.jsx)(oe,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,R.jsx)(`span`,{className:`text-xs text-muted-foreground px-1 py-0.5`,children:e})]},`prefix-${t}`)),f.map((e,n)=>(0,R.jsxs)(`div`,{className:`flex items-center shrink-0`,children:[(n>0||l.length>0)&&(0,R.jsx)(oe,{className:`size-3 text-muted-foreground shrink-0 mx-0.5`}),(0,R.jsx)(bt,{segment:e,isLast:n===f.length-1,projectName:t,onFileClick:p})]},e.fullPath))]})}function bt({segment:e,isLast:t,projectName:n,onFileClick:r}){let i=O(e=>e.loadChildren),a=O(e=>e.loadedPaths),o=(0,L.useMemo)(()=>vt(e.siblings),[e.siblings]),s=a.has(e.parentPath);function c(t){if(t&&!s){let t=e.parentPath.split(`/`).filter(Boolean);(async()=>{for(let e=0;e<=t.length;e++)await i(n,t.slice(0,e).join(`/`))})()}}return(0,R.jsxs)(N,{onOpenChange:c,children:[(0,R.jsx)(ke,{asChild:!0,children:(0,R.jsx)(`button`,{type:`button`,className:`text-xs px-1 py-0.5 rounded hover:bg-muted transition-colors truncate max-w-[120px] ${t?`text-foreground font-medium`:`text-muted-foreground`}`,children:e.name})}),(0,R.jsx)(I,{align:`start`,className:`max-h-[300px] p-1`,children:o.length===0?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):o.map(t=>(0,R.jsx)(xt,{node:t,projectName:n,activePath:e.fullPath,onFileClick:r},t.path))})]})}function xt({node:e,projectName:t,activePath:n,onFileClick:r}){let i=G(e.name,e.type===`directory`),a=e.path===n,o=O(e=>e.loadChildren),s=O(e=>e.loadedPaths);if(e.type===`directory`){let c=e.children??[],l=s.has(e.path);function u(n){n&&!l&&o(t,e.path)}return(0,R.jsxs)(j,{onOpenChange:u,children:[(0,R.jsxs)(A,{className:`text-xs gap-1.5 ${a?`bg-muted`:``}`,children:[(0,R.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,R.jsx)(`span`,{className:`truncate`,children:e.name})]}),(0,R.jsx)(De,{className:`max-h-[300px] overflow-y-auto p-1`,children:c.length===0?(0,R.jsx)(P,{disabled:!0,className:`text-xs text-muted-foreground`,children:`Loading…`}):vt(c).map(e=>(0,R.jsx)(xt,{node:e,projectName:t,activePath:n,onFileClick:r},e.path))})]})}return(0,R.jsxs)(P,{className:`text-xs gap-1.5 cursor-pointer ${a?`bg-muted`:``}`,onSelect:e=>{},onClick:t=>{r(e.path,t)},children:[(0,R.jsx)(i,{className:`size-3.5 shrink-0 text-muted-foreground`}),(0,R.jsx)(`span`,{className:`truncate`,children:e.name})]})}function q({active:e,onClick:t,icon:n,label:r,title:i}){return(0,R.jsxs)(`button`,{type:`button`,title:i,onClick:t,className:`flex items-center gap-1 px-2 py-1 rounded text-xs transition-colors ${e?`bg-muted text-foreground`:`text-muted-foreground hover:text-foreground`}`,children:[(0,R.jsx)(n,{className:`size-3`}),(0,R.jsx)(`span`,{className:`hidden sm:inline`,children:r})]})}function St({ext:e,mdMode:t,onMdModeChange:n,csvMode:r,onCsvModeChange:i,wordWrap:o,onToggleWordWrap:s,inlineBlame:c,onToggleInlineBlame:l,blameStale:u,onRefresh:f,refreshing:ee,filePath:te,projectName:ne,className:m}){return(0,R.jsxs)(`div`,{className:m,children:[(e===`md`||e===`mdx`)&&n&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(q,{active:t===`edit`,onClick:()=>n(`edit`),icon:p,label:`Edit`}),(0,R.jsx)(q,{active:t===`preview`,onClick:()=>n(`preview`),icon:se,label:`Preview`})]}),e===`csv`&&i&&(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(q,{active:r===`table`,onClick:()=>i(`table`),icon:d,label:`Table`}),(0,R.jsx)(q,{active:r===`raw`,onClick:()=>i(`raw`),icon:p,label:`Raw`})]}),(0,R.jsx)(q,{active:o,onClick:s,icon:_,label:`Wrap`}),l&&(0,R.jsx)(q,{active:c===!0,onClick:l,icon:a,label:`Blame`,title:c&&u?`Blame is hidden until this file is saved — the line numbers have moved`:`Inline blame (Alt+B)`}),f&&(0,R.jsxs)(`button`,{type:`button`,onClick:f,disabled:ee,title:`Reload file from disk`,className:`flex items-center gap-1 px-2 py-1 rounded text-xs text-muted-foreground hover:text-foreground transition-colors disabled:opacity-50`,children:[(0,R.jsx)(ae,{className:`size-3 ${ee?`animate-spin`:``}`}),(0,R.jsx)(`span`,{className:`hidden sm:inline`,children:`Refresh`})]}),te&&ne&&(0,R.jsx)(q,{active:!1,onClick:()=>Oe(ne,te),icon:b,label:`Download`})]})}function Ct({filePath:e,projectName:t,revision:n}){let[r,i]=(0,L.useState)(),[a,o]=(0,L.useState)();return(0,L.useEffect)(()=>{let n=new AbortController;i(void 0),o(void 0);let r=setTimeout(()=>n.abort(Error(`Preview request timed out. Try Refresh.`)),3e4),a=!0;return C.post(`/api/html-preview`,{filePath:e,projectName:t},{signal:n.signal}).then(e=>{a&&i(e.url)}).catch(e=>{a&&o(e instanceof Error?e.message:`Could not open HTML preview`)}).finally(()=>clearTimeout(r)),()=>{a=!1,clearTimeout(r),n.abort()}},[e,t,n]),a?(0,R.jsxs)(`div`,{role:`alert`,className:`p-4 text-sm text-destructive`,children:[a,`. Use Refresh to retry.`]}):r?(0,R.jsx)(`iframe`,{title:`HTML preview`,src:r,sandbox:`allow-scripts`,referrerPolicy:`no-referrer`,className:`flex-1 min-h-0 w-full border-0 bg-white`}):(0,R.jsxs)(`div`,{role:`status`,className:`flex flex-1 items-center justify-center gap-2 text-sm text-muted-foreground`,children:[(0,R.jsx)(x,{className:`size-5 animate-spin`}),`Loading preview…`]})}var wt=[{id:`plaintext`,label:`Plain Text`},{id:`javascript`,label:`JavaScript`},{id:`typescript`,label:`TypeScript`},{id:`sql`,label:`SQL`},{id:`json`,label:`JSON`},{id:`xml`,label:`XML`},{id:`html`,label:`HTML`},{id:`css`,label:`CSS`},{id:`python`,label:`Python`},{id:`markdown`,label:`Markdown`},{id:`yaml`,label:`YAML`},{id:`shell`,label:`Shell`},{id:`dotenv`,label:`Dotenv`}];function Tt({value:e,onChange:t}){return(0,R.jsxs)(`div`,{className:`shrink-0 flex items-center gap-1 px-2 border-l border-border`,children:[(0,R.jsx)(h,{className:`size-3 text-muted-foreground`}),(0,R.jsx)(`select`,{value:e,onChange:e=>t(e.target.value),className:`h-5 text-[10px] bg-transparent border border-border rounded px-1 text-foreground outline-none max-w-[120px]`,title:`Select editor language`,children:wt.map(e=>(0,R.jsx)(`option`,{value:e.id,children:e.label},e.id))})]})}var J=`flex items-center justify-center gap-1.5 rounded px-2 min-h-11 min-w-11 md:min-h-7 md:min-w-7 text-xs text-muted-foreground hover:text-foreground hover:bg-muted`,Y=`min-h-11 md:min-h-8 px-2`,Et=`${Y} pr-8 [&>span]:left-auto [&>span]:right-2`;function Dt(e){let{mode:t,onModeChange:n,onRefresh:r,unsaved:o,breadcrumb:s}=e;return(0,R.jsxs)(`div`,{className:`flex items-center gap-2 md:gap-1 border-b border-border bg-background px-2 shrink-0 h-12 md:h-8`,role:`toolbar`,"aria-label":`HTML preview`,children:[(0,R.jsx)(`div`,{className:`hidden md:flex flex-1 min-w-0 overflow-hidden`,children:s}),t===`preview`&&(0,R.jsx)(`button`,{type:`button`,onClick:r,title:`Reload the original HTML file`,"aria-label":`Refresh preview`,className:J,children:(0,R.jsx)(ae,{className:`size-4`})}),[[`edit`,`Code`,p],[`preview`,`Preview`,se]].map(([e,r,i])=>(0,R.jsxs)(`button`,{type:`button`,"aria-pressed":t===e,onClick:()=>n(e),className:`${J} ${t===e?`bg-muted text-foreground`:``}`,children:[(0,R.jsx)(i,{className:`size-3.5`}),r]},e)),o&&(0,R.jsx)(`span`,{role:`status`,title:`Preview uses the saved file`,"aria-label":`Preview uses the saved file`,className:`text-amber-500 text-xs`,children:`●`}),(0,R.jsxs)(N,{children:[(0,R.jsx)(ke,{asChild:!0,children:(0,R.jsx)(`button`,{type:`button`,title:`More HTML actions`,"aria-label":`More HTML actions`,className:`${J} ml-auto md:ml-0`,children:(0,R.jsx)(i,{className:`size-4`})})}),(0,R.jsxs)(I,{align:`end`,className:`w-52`,children:[t===`edit`&&(0,R.jsxs)(P,{className:Y,disabled:o||e.refreshing,onSelect:e.onReloadCode,children:[(0,R.jsx)(ae,{}),`Reload code from disk`]}),(0,R.jsxs)(P,{className:Y,onSelect:()=>void Oe(e.projectName??``,e.filePath),children:[(0,R.jsx)(b,{}),`Download`]}),(0,R.jsx)(Fe,{}),(0,R.jsxs)(F,{className:Et,checked:e.wordWrap,onCheckedChange:e.onToggleWordWrap,children:[(0,R.jsx)(_,{className:`size-4 text-muted-foreground`}),`Word wrap`]}),e.onToggleInlineBlame&&(0,R.jsxs)(F,{className:Et,checked:e.inlineBlame,onCheckedChange:e.onToggleInlineBlame,children:[(0,R.jsx)(a,{className:`size-4 text-muted-foreground`}),`Inline blame`]}),e.onToggleLsp&&(0,R.jsxs)(F,{className:Et,checked:e.lspEnabled,onCheckedChange:e.onToggleLsp,children:[(0,R.jsx)(u,{className:`size-4 text-muted-foreground`}),`Language server`]}),(0,R.jsxs)(j,{children:[(0,R.jsxs)(A,{className:`${Y} gap-2`,children:[(0,R.jsx)(h,{className:`size-4 text-muted-foreground`}),`Editor language`]}),(0,R.jsx)(De,{className:`max-h-80 overflow-y-auto`,children:(0,R.jsx)(je,{value:e.language,onValueChange:e.onLanguageChange,children:wt.map(e=>(0,R.jsx)(Te,{className:`min-h-11 md:min-h-8`,value:e.id,children:e.label},e.id))})})]})]})]})]})}function Ot({open:e,defaultName:t,content:n,onSave:r,onCancel:i}){let[a,o]=(0,L.useState)(t),[s,c]=(0,L.useState)(!1),[l,u]=(0,L.useState)(``),d=me(e=>e.activeProject),f=(0,L.useCallback)(()=>{let e=a.trim();if(!e){u(`Filename cannot be empty`);return}if(/[/\\]/.test(e)){u(`Filename cannot contain / or \\`);return}u(``),c(!0)},[a]),p=(0,L.useCallback)(e=>{let t=e.includes(`\\`)?`\\`:`/`;r(e.endsWith(t)?`${e}${a.trim()}`:`${e}${t}${a.trim()}`,n)},[a,n,r]);return s?(0,R.jsx)(M,{open:!0,mode:`folder`,root:d?.path,title:`Save "${a.trim()}" to...`,onSelect:p,onCancel:()=>c(!1)}):(0,R.jsx)(Se,{open:e,onOpenChange:e=>{e||i()},children:(0,R.jsxs)(be,{className:`sm:max-w-md`,children:[(0,R.jsx)(ve,{children:(0,R.jsx)(xe,{children:`Save As`})}),(0,R.jsxs)(`div`,{className:`flex flex-col gap-2 py-2`,children:[(0,R.jsx)(`label`,{className:`text-sm text-muted-foreground`,children:`Filename`}),(0,R.jsx)(k,{value:a,onChange:e=>{o(e.target.value),u(``)},onKeyDown:e=>{e.key===`Enter`&&f()},placeholder:`e.g. my-file.ts`,autoFocus:!0}),l&&(0,R.jsx)(`p`,{className:`text-xs text-destructive`,children:l})]}),(0,R.jsxs)(ye,{children:[(0,R.jsx)(_e,{variant:`outline`,onClick:i,children:`Cancel`}),(0,R.jsx)(_e,{onClick:f,children:`Choose Folder...`})]})]})})}var kt=typeof window<`u`&&window.isSecureContext,At=[`(`,`)`,`{`,`}`,`[`,`]`,`<`,`>`,`;`,`:`,`=`,`"`,`'`,"`",`/`,`\\`,`_`,`#`],X=`px-2 py-1.5 rounded text-xs min-w-[36px] min-h-[32px] bg-surface-elevated text-text-primary active:bg-primary active:text-primary-foreground transition-colors select-none`,jt=`px-3 py-1.5 rounded text-xs font-mono min-w-[36px] min-h-[32px] bg-surface-elevated text-text-primary active:bg-primary active:text-primary-foreground transition-colors select-none`,Mt=`w-px h-5 bg-border mx-0.5 shrink-0`;function Nt({editorRef:e,readOnly:t,wrapOn:n,onToggleWrap:r}){let i=(0,L.useCallback)(()=>e.current,[e]),a=(0,L.useCallback)(e=>{let t=i();if(!t)return;t.focus();let n=t.getSelection();n&&t.executeEdits(`mobile-toolbar`,[{range:n,text:e}])},[i]),[o,l]=(0,L.useState)(!1),u=(0,L.useRef)(null),d=(0,L.useCallback)(async()=>{try{let e=await navigator.clipboard.readText();e&&a(e)}catch{}},[a]),f=(0,L.useCallback)(()=>{l(!0),requestAnimationFrame(()=>u.current?.focus())},[]),p=(0,L.useCallback)(e=>{e.preventDefault();let t=e.clipboardData.getData(`text/plain`);t&&(l(!1),a(t))},[a]),ee=(0,L.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`undo`,null))},[i]),te=(0,L.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`redo`,null))},[i]),ne=(0,L.useCallback)(()=>{let e=i();e&&(e.focus(),e.trigger(`mobile-toolbar`,`tab`,null))},[i]);return t?null:(0,R.jsxs)(`div`,{className:`shrink-0 border-t border-border bg-surface`,children:[!kt&&o&&(0,R.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1.5 border-b border-border bg-muted/50`,children:[(0,R.jsx)(`textarea`,{ref:u,onPaste:p,placeholder:`Long-press here → Paste`,className:`flex-1 h-8 rounded border border-border bg-background text-foreground text-xs px-2 py-1.5 resize-none focus:outline-none focus:ring-1 focus:ring-primary`}),(0,R.jsx)(`button`,{type:`button`,onClick:()=>l(!1),className:`p-1.5 rounded text-muted-foreground active:bg-muted transition-colors`,children:(0,R.jsx)(c,{size:14})})]}),(0,R.jsxs)(`div`,{className:`flex items-center gap-1 px-2 py-1.5 overflow-x-auto`,children:[(0,R.jsx)(`button`,{type:`button`,onClick:kt?d:f,className:X,title:`Paste`,children:(0,R.jsx)(g,{size:14})}),(0,R.jsx)(`button`,{type:`button`,onClick:ee,className:X,title:`Undo`,children:(0,R.jsx)(s,{size:14})}),(0,R.jsx)(`button`,{type:`button`,onClick:te,className:X,title:`Redo`,children:(0,R.jsx)(y,{size:14})}),(0,R.jsx)(`button`,{type:`button`,onClick:r,className:`${X} ${n?`text-primary`:``}`,title:n?`Wrapping long lines — tap to scroll sideways instead`:`Wrap long lines`,children:(0,R.jsx)(_,{size:14})}),(0,R.jsx)(`div`,{className:Mt}),(0,R.jsx)(`button`,{type:`button`,onClick:ne,className:jt,children:`Tab`}),(0,R.jsx)(`div`,{className:Mt}),At.map(e=>(0,R.jsx)(`button`,{type:`button`,onClick:()=>a(e),className:jt,children:e},e))]})]})}var Pt=(0,L.lazy)(()=>T(()=>import(`./markdown-renderer-CS193h6D.js`).then(e=>({default:e.MarkdownRenderer})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40]))),Ft=(0,L.lazy)(()=>T(()=>import(`./editor-language-service-DufWCv_b.js`).then(e=>({default:e.EditorLanguageService})),__vite__mapDeps([41,2,1,3,10,42,5,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,43]))),It=(0,L.lazy)(()=>T(()=>import(`./csv-preview-BfX8PrGn.js`).then(e=>({default:e.CsvPreview})),__vite__mapDeps([44,2,5,6,1,3,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,45,46]))),Lt=(0,L.lazy)(()=>T(()=>import(`./image-preview-DuODZoNO.js`).then(e=>({default:e.ImagePreview})),__vite__mapDeps([47,1,2,3,10,48,21]))),Rt=(0,L.lazy)(()=>T(()=>import(`./pdf-preview-PWDBbNwt.js`).then(e=>({default:e.PdfPreview})),__vite__mapDeps([49,2,1,3,10,21]))),zt=(0,L.lazy)(()=>T(()=>import(`./video-preview-08dogvSP.js`).then(e=>({default:e.VideoPreview})),__vite__mapDeps([50,2,5,6,1,3,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,51,52]))),Bt=(0,L.lazy)(()=>T(()=>import(`./audio-preview-BrS2qNK0.js`).then(e=>({default:e.AudioPreview})),__vite__mapDeps([53,2,1,3,8,10,21,52]))),Vt=(0,L.lazy)(()=>T(()=>import(`./docx-preview-b-Ui9jDq.js`).then(e=>({default:e.DocxPreview})),__vite__mapDeps([54,2,1,3,10,21])));function Ht(e){return e.split(`.`).pop()?.toLowerCase()??``}function Ut(e){return{js:`javascript`,jsx:`javascript`,ts:`typescript`,tsx:`typescript`,py:`python`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,mdx:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,bash:`shell`,sql:`sql`}[Ht(e)]??(He(e)?`dotenv`:`plaintext`)}var Wt=(0,L.memo)(function({metadata:e,tabId:t}){let n=e?.filePath,r=e?.projectName,i=e?.inlineContent,a=e?.inlineLanguage,[o,s]=(0,L.useState)(i??null),[c,l]=(0,L.useState)(`utf-8`),[u,d]=(0,L.useState)(!0),[p,m]=(0,L.useState)(null),[re,ae]=(0,L.useState)(null),oe=D(e=>e.activeTabId),[se,ce]=(0,L.useState)(0);(0,L.useEffect)(()=>{let e=()=>ce(e=>e+1);return window.addEventListener(`ppm:onboarding-refresh`,e),()=>window.removeEventListener(`ppm:onboarding-refresh`,e)},[]);let[h,g]=(0,L.useState)(!1),_=(0,L.useRef)(null),v=(0,L.useRef)(``),y=(0,L.useRef)(null),[b,le]=(0,L.useState)(null),{tabs:ue,updateTab:S}=D(Me(e=>({tabs:e.tabs,updateTab:e.updateTab}))),{wordWrap:de,toggleWordWrap:me,mobileWordWrap:O,toggleMobileWordWrap:_e}=w(Me(e=>({wordWrap:e.wordWrap,toggleWordWrap:e.toggleWordWrap,mobileWordWrap:e.mobileWordWrap,toggleMobileWordWrap:e.toggleMobileWordWrap}))),ve=w(e=>e.inlineBlame),ye=w(e=>e.toggleInlineBlame),be=w(e=>e.lspEnabled),xe=w(e=>e.setLspEnabled),Se=he(),Ce=Pe(),k=Se?O:de,Te=Se?_e:me,Ee=Re(),A=e?.isUntitled===!0,De=e?.unsavedContent,[Oe,ke]=(0,L.useState)(!1),je=ue.find(e=>e.id===t),j=n?Ht(n):``,M=Ge.has(j),N=j===`pdf`,P=j===`docx`,F=We.has(j),Fe=qe.has(j),I=Ke.has(j),He=j===`md`||j===`mdx`,Qe=(j===`html`||j===`htm`)&&!A&&i==null,[$e,et]=(0,L.useState)(`preview`),[tt,nt]=(0,L.useState)(0),[rt,it]=(0,L.useState)(!1),z=Qe&&$e===`preview`,at=j===`csv`,ot=e?.language,B=a??ot??Ut(n??``),V=B===`sql`,[lt,ut]=(0,L.useState)(`preview`),[dt,ft]=(0,L.useState)(`table`),{connections:H,cachedTables:pt,refreshTables:mt,updateConnection:ht}=Ie(),U=n?`ppm:sql-conn:${n}`:t?`ppm:sql-conn:tab:${t}`:null,[W,gt]=(0,L.useState)(()=>{if(!U)return null;let e=localStorage.getItem(U);return e?Number(e):null}),_t=(0,L.useRef)(null),G=(0,L.useRef)(null),K=(0,L.useMemo)(()=>H.find(e=>e.id===W)??null,[H,W]),vt=i!=null&&(a===`json`||a===`xml`),[bt,xt]=(0,L.useState)(!1),q=(0,L.useCallback)(()=>{if(i)if(bt)s(i),xt(!1);else{let e=i.trimStart();if(a===`json`)try{s(JSON.stringify(JSON.parse(e),null,2)),xt(!0)}catch{}else if(a===`xml`){let t=0;s(e.replace(/(>)(<)(\/*)/g,`$1
3
3
  $2$3`).split(`
4
4
  `).map(e=>{let n=e.trim();n.startsWith(`</`)&&(t=Math.max(0,t-1));let r=` `.repeat(t)+n;return n.startsWith(`<`)&&!n.startsWith(`</`)&&!n.endsWith(`/>`)&&!n.includes(`</`)&&t++,r}).join(`
5
- `)),xt(!0)}}},[i,a,bt]),wt=(0,L.useCallback)(e=>{gt(e),U&&localStorage.setItem(U,String(e)),mt(e).catch(()=>{})},[U,mt]),J=(0,L.useCallback)(n=>{t&&S(t,{metadata:{...e,language:n}})},[t,e,S]),Y=(0,L.useMemo)(()=>{if(!V||!W)return;let e=(pt.get(W)??[]).map(e=>({name:e.tableName,schema:e.schemaName}));if(e.length!==0)return{tables:e,getColumns:async(e,t)=>C.get(`/api/db/connections/${W}/schema?table=${encodeURIComponent(e)}${t?`&schema=${encodeURIComponent(t)}`:``}`)}},[V,W,pt]);(0,L.useEffect)(()=>{if(!(!_t.current||!Y))return G.current?.dispose(),Ze(),G.current=_t.current.languages.registerCompletionItemProvider(`sql`,Ye(_t.current,Y)),()=>{G.current?.dispose()}},[Y]);let Et=D(e=>e.openTab),[kt,At]=(0,L.useState)(null),[X,jt]=(0,L.useState)(null),[Mt,Pt]=(0,L.useState)(!1),[Wt,Gt]=(0,L.useState)(``),Yt=(0,L.useCallback)(async e=>{if(K){Pt(!0),jt(null),Gt(e);try{At(await C.post(`/api/db/connections/${K.id}/query`,{sql:e}))}catch(e){jt(e.message),At(null)}finally{Pt(!1)}}},[K]),Xt=(0,L.useCallback)(()=>{!K||!Wt||Et({type:`database`,title:`${K.name} · Query`,projectId:null,closable:!0,metadata:{connectionId:K.id,connectionName:K.name,dbType:K.type,initialSql:Wt}})},[K,Et,Wt]),Zt=(0,L.useCallback)(()=>{if(!y.current||!K)return;let e=y.current,t=e.getSelection();Yt(t&&!t.isEmpty()?e.getModel()?.getValueInRange(t)??e.getValue():e.getValue())},[K,Yt]),Qt=typeof window<`u`&&`ontouchstart`in window,$t=(0,L.useRef)(null),[en,tn]=(0,L.useState)(null);(0,L.useEffect)(()=>{if(!Qt)return;let e=window.visualViewport;if(!e)return;let t=()=>{let t=$t.current;if(!t)return;let n=t.getBoundingClientRect().top;tn(e.height-Math.max(0,n))};return e.addEventListener(`resize`,t),e.addEventListener(`scroll`,t),()=>{e.removeEventListener(`resize`,t),e.removeEventListener(`scroll`,t)}},[Qt]),(0,L.useEffect)(()=>Le($t.current,()=>y.current?.layout()),[u,p]);let Z=(0,L.useRef)([]),nn=(0,L.useRef)(Yt);nn.current=Yt,(0,L.useEffect)(()=>()=>{Z.current.forEach(e=>e.dispose()),Z.current=[]},[]),(0,L.useEffect)(()=>{I&&t&&S(t,{type:`sqlite`})},[I,t,S]);let Q=n?/^(\/|[A-Za-z]:[/\\])/.test(n):!1;(0,L.useEffect)(()=>{if(!r||!n||!t||oe!==t||u||p||!b||re!==`${r}:${n}`||i!=null||A||I||c===`base64`||z||M||N||P||F||Fe||He&&lt===`preview`||at&&dt===`table`)return;let e=b.editor.getDomNode(),a=!!e?.isConnected&&!!e.checkVisibility({checkOpacity:!0,checkVisibilityCSS:!0});a&&Ae({type:`file-ready`,projectName:r,tabId:t,visible:a,isRunDocument:/^(readme(?:\..*)?|package\.json)$/i.test(E(n))})},[se,r,n,t,oe,u,p,b,re,i,A,I,c,M,N,P,F,Fe,He,lt,at,dt,z]),(0,L.useEffect)(()=>{if(i!=null){d(!1);return}if(A){s(De??``),v.current=De??``,d(!1),De&&g(!0);return}if(!n||!Q&&!r)return;if(M||N||P||F||Fe){d(!1);return}d(!0),m(null),ae(null);let e=!1,t=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${fe(r)}/files/read?path=${encodeURIComponent(n)}`;return C.get(t).then(t=>{e||(s(t.content),l(t.encoding??`utf-8`),ae(`${r}:${n}`),v.current=t.content,d(!1))}).catch(t=>{e||(m(t instanceof Error?t.message:`Failed to load file`),d(!1))}),()=>{e=!0,_.current&&clearTimeout(_.current)}},[n,r,M,N,P,Q,A]);let[rn,an]=(0,L.useState)(!1),on=(0,L.useCallback)(()=>{if(!n||i!=null||A||!Q&&!r)return;let e=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${fe(r)}/files/read?path=${encodeURIComponent(n)}`;an(!0),C.get(e).then(e=>{s(e.content),v.current=e.content,e.encoding&&l(e.encoding),g(!1),m(null)}).catch(e=>m(e instanceof Error?e.message:`Failed to reload file`)).finally(()=>an(!1))},[n,r,Q,i,A]),sn=(0,L.useRef)(h);sn.current=h,(0,L.useEffect)(()=>{if(!n||!r||i!=null||A)return;let e=e=>{let t=e.detail;if(t.projectName!==r||t.path!==n||sn.current)return;let i=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${fe(r)}/files/read?path=${encodeURIComponent(n)}`;C.get(i).then(e=>{e.content!==v.current&&(s(e.content),v.current=e.content,e.encoding&&l(e.encoding))}).catch(()=>{})};return window.addEventListener(`file:changed`,e),()=>window.removeEventListener(`file:changed`,e)},[n,r,Q,i,A]),(0,L.useEffect)(()=>{if(!je||i!=null)return;let t=A?`Untitled-${e?.untitledNumber??1}`:n?E(n):`Untitled`,r=h?`${t} \u25CF`:t;je.title!==r&&S(je.id,{title:r})},[h]);let cn=!A&&i==null&&!!n&&!!r&&!Se,ln=Ve({editor:b?.editor??null,monaco:b?.monaco??null,projectName:r,filePath:cn?n:void 0,enabled:ve&&cn}),un=!A&&!Q&&i==null&&!!n&&!!r,dn=be&&!Ce,fn=dn&&un&&!z,[pn,mn]=(0,L.useState)({status:null,diagnostics:[]}),hn=(0,L.useCallback)(e=>mn(e),[]),gn=(0,L.useCallback)(async e=>{if(n&&!(!Q&&!r))try{Q?await C.put(`/api/fs/write`,{path:n,content:e}):await C.put(`${fe(r)}/files/write`,{path:n,content:e}),g(!1),ln.refresh(),fn&&r&&n&&T(()=>import(`./use-lsp-CZTFJIXX.js`).then(t=>t.notifyLspSave(r,n,e)),__vite__mapDeps([42,2,5,6,1,3,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,43]))}catch{}},[n,r,Q,fn,ln.refresh]);function _n(n){let r=n??``;s(r),v.current=r,g(!0),_.current&&clearTimeout(_.current),A?_.current=setTimeout(()=>{t&&S(t,{metadata:{...e,unsavedContent:v.current}})},2e3):_.current=setTimeout(()=>gn(v.current),1e3)}let vn=(0,L.useCallback)(async(e,n)=>{try{if(_.current&&clearTimeout(_.current),await C.put(`/api/fs/write`,{path:e,content:n}),t){let{closeTab:n,openTab:r}=pe.getState();n(t),r({type:`editor`,title:E(e),projectId:null,metadata:{filePath:e},closable:!0})}g(!1),ke(!1)}catch{}},[t]),$=e?.lineNumber,yn=e?.endLine,bn=e?.revealAt,xn=(0,L.useCallback)(()=>{let e=y.current;if(!(!e||!$||$<=0)){if(e.revealLineInCenter($),e.setPosition({lineNumber:$,column:1}),yn&&yn>=$){let t=e.getModel(),n=t?.getLineCount()??$,r=Math.min(yn,n),i=t?.getLineMaxColumn(r)??1;e.setSelection({startLineNumber:$,startColumn:1,endLineNumber:r,endColumn:i})}e.focus()}},[$,yn]);(0,L.useEffect)(()=>{bn!=null&&xn()},[bn,xn]),(0,L.useEffect)(()=>{let e=b?.monaco;e&&st(dn,e.languages.typescript.typescriptDefaults,e.languages.typescript.javascriptDefaults)},[b,dn]);let Sn=(0,L.useCallback)((e,t)=>{if(y.current=e,_t.current=t,le({editor:e,monaco:t}),$&&$>0&&setTimeout(()=>xn(),100),A&&e.addCommand(t.KeyMod.CtrlCmd|t.KeyCode.KeyS,()=>ke(!0)),e.addCommand(t.KeyMod.Alt|t.KeyCode.KeyZ,()=>{let e=w.getState();ge()?e.toggleMobileWordWrap():e.toggleWordWrap()}),e.addCommand(t.KeyMod.Alt|t.KeyCode.KeyB,()=>w.getState().toggleInlineBlame()),Y&&(G.current?.dispose(),G.current=t.languages.registerCompletionItemProvider(`sql`,Ye(t,Y))),V){e.addAction({id:`run-sql-at-cursor`,label:`Run Statement at Cursor`,keybindings:[t.KeyMod.CtrlCmd|t.KeyCode.Enter],run:e=>{let t=e.getPosition();if(!t)return;let n=Je(e.getValue(),t.lineNumber);n&&nn.current(n)}}),Z.current.forEach(e=>e.dispose()),Z.current=[];let n=e.getModel(),r=e.addCommand(0,(e,t)=>{t&&nn.current(t)});if(r&&n){let e=t.languages.registerCodeLensProvider(`sql`,{provideCodeLenses:e=>{if(e!==n)return{lenses:[],dispose:()=>{}};let t=[],i=(e,n,i=`▷ Run`)=>{let a=n.trim();a&&t.push({range:{startLineNumber:e,startColumn:1,endLineNumber:e,endColumn:1},command:{id:r,title:i,arguments:[a]}})},a=/^(BEGIN|COMMIT|ROLLBACK|END)(;|\s|$)/i,o=-1,s=[];for(let{sql:t,startLine:n}of Xe(e.getValue())){let e=/^BEGIN(;|\s|$)/i.test(t),r=/^(COMMIT|ROLLBACK|END)(;|\s|$)/i.test(t);o===-1&&e?(o=n,s=[t]):o>-1?(s.push(t),!r&&!a.test(t)&&i(n,t),r&&(i(o,s.join(`
5
+ `)),xt(!0)}}},[i,a,bt]),wt=(0,L.useCallback)(e=>{gt(e),U&&localStorage.setItem(U,String(e)),mt(e).catch(()=>{})},[U,mt]),J=(0,L.useCallback)(n=>{t&&S(t,{metadata:{...e,language:n}})},[t,e,S]),Y=(0,L.useMemo)(()=>{if(!V||!W)return;let e=(pt.get(W)??[]).map(e=>({name:e.tableName,schema:e.schemaName}));if(e.length!==0)return{tables:e,getColumns:async(e,t)=>C.get(`/api/db/connections/${W}/schema?table=${encodeURIComponent(e)}${t?`&schema=${encodeURIComponent(t)}`:``}`)}},[V,W,pt]);(0,L.useEffect)(()=>{if(!(!_t.current||!Y))return G.current?.dispose(),Ze(),G.current=_t.current.languages.registerCompletionItemProvider(`sql`,Ye(_t.current,Y)),()=>{G.current?.dispose()}},[Y]);let Et=D(e=>e.openTab),[kt,At]=(0,L.useState)(null),[X,jt]=(0,L.useState)(null),[Mt,Pt]=(0,L.useState)(!1),[Wt,Gt]=(0,L.useState)(``),Yt=(0,L.useCallback)(async e=>{if(K){Pt(!0),jt(null),Gt(e);try{At(await C.post(`/api/db/connections/${K.id}/query`,{sql:e}))}catch(e){jt(e.message),At(null)}finally{Pt(!1)}}},[K]),Xt=(0,L.useCallback)(()=>{!K||!Wt||Et({type:`database`,title:`${K.name} · Query`,projectId:null,closable:!0,metadata:{connectionId:K.id,connectionName:K.name,dbType:K.type,initialSql:Wt}})},[K,Et,Wt]),Zt=(0,L.useCallback)(()=>{if(!y.current||!K)return;let e=y.current,t=e.getSelection();Yt(t&&!t.isEmpty()?e.getModel()?.getValueInRange(t)??e.getValue():e.getValue())},[K,Yt]),Qt=typeof window<`u`&&`ontouchstart`in window,$t=(0,L.useRef)(null),[en,tn]=(0,L.useState)(null);(0,L.useEffect)(()=>{if(!Qt)return;let e=window.visualViewport;if(!e)return;let t=()=>{let t=$t.current;if(!t)return;let n=t.getBoundingClientRect().top;tn(e.height-Math.max(0,n))};return e.addEventListener(`resize`,t),e.addEventListener(`scroll`,t),()=>{e.removeEventListener(`resize`,t),e.removeEventListener(`scroll`,t)}},[Qt]),(0,L.useEffect)(()=>Le($t.current,()=>y.current?.layout()),[u,p]);let Z=(0,L.useRef)([]),nn=(0,L.useRef)(Yt);nn.current=Yt,(0,L.useEffect)(()=>()=>{Z.current.forEach(e=>e.dispose()),Z.current=[]},[]),(0,L.useEffect)(()=>{I&&t&&S(t,{type:`sqlite`})},[I,t,S]);let Q=n?/^(\/|[A-Za-z]:[/\\])/.test(n):!1;(0,L.useEffect)(()=>{if(!r||!n||!t||oe!==t||u||p||!b||re!==`${r}:${n}`||i!=null||A||I||c===`base64`||z||M||N||P||F||Fe||He&&lt===`preview`||at&&dt===`table`)return;let e=b.editor.getDomNode(),a=!!e?.isConnected&&!!e.checkVisibility({checkOpacity:!0,checkVisibilityCSS:!0});a&&Ae({type:`file-ready`,projectName:r,tabId:t,visible:a,isRunDocument:/^(readme(?:\..*)?|package\.json)$/i.test(E(n))})},[se,r,n,t,oe,u,p,b,re,i,A,I,c,M,N,P,F,Fe,He,lt,at,dt,z]),(0,L.useEffect)(()=>{if(i!=null){d(!1);return}if(A){s(De??``),v.current=De??``,d(!1),De&&g(!0);return}if(!n||!Q&&!r)return;if(M||N||P||F||Fe){d(!1);return}d(!0),m(null),ae(null);let e=!1,t=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${fe(r)}/files/read?path=${encodeURIComponent(n)}`;return C.get(t).then(t=>{e||(s(t.content),l(t.encoding??`utf-8`),ae(`${r}:${n}`),v.current=t.content,d(!1))}).catch(t=>{e||(m(t instanceof Error?t.message:`Failed to load file`),d(!1))}),()=>{e=!0,_.current&&clearTimeout(_.current)}},[n,r,M,N,P,Q,A]);let[rn,an]=(0,L.useState)(!1),on=(0,L.useCallback)(()=>{if(!n||i!=null||A||!Q&&!r)return;let e=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${fe(r)}/files/read?path=${encodeURIComponent(n)}`;an(!0),C.get(e).then(e=>{s(e.content),v.current=e.content,e.encoding&&l(e.encoding),g(!1),m(null)}).catch(e=>m(e instanceof Error?e.message:`Failed to reload file`)).finally(()=>an(!1))},[n,r,Q,i,A]),sn=(0,L.useRef)(h);sn.current=h,(0,L.useEffect)(()=>{if(!n||!r||i!=null||A)return;let e=e=>{let t=e.detail;if(t.projectName!==r||t.path!==n||sn.current)return;let i=Q?`/api/fs/read?path=${encodeURIComponent(n)}`:`${fe(r)}/files/read?path=${encodeURIComponent(n)}`;C.get(i).then(e=>{e.content!==v.current&&(s(e.content),v.current=e.content,e.encoding&&l(e.encoding))}).catch(()=>{})};return window.addEventListener(`file:changed`,e),()=>window.removeEventListener(`file:changed`,e)},[n,r,Q,i,A]),(0,L.useEffect)(()=>{if(!je||i!=null)return;let t=A?`Untitled-${e?.untitledNumber??1}`:n?E(n):`Untitled`,r=h?`${t} \u25CF`:t;je.title!==r&&S(je.id,{title:r})},[h]);let cn=!A&&i==null&&!!n&&!!r&&!Se,ln=Ve({editor:b?.editor??null,monaco:b?.monaco??null,projectName:r,filePath:cn?n:void 0,enabled:ve&&cn}),un=!A&&!Q&&i==null&&!!n&&!!r,dn=be&&!Ce,fn=dn&&un&&!z,[pn,mn]=(0,L.useState)({status:null,diagnostics:[]}),hn=(0,L.useCallback)(e=>mn(e),[]),gn=(0,L.useCallback)(async e=>{if(n&&!(!Q&&!r))try{Q?await C.put(`/api/fs/write`,{path:n,content:e}):await C.put(`${fe(r)}/files/write`,{path:n,content:e}),g(!1),ln.refresh(),fn&&r&&n&&T(()=>import(`./use-lsp-D6skvdIp.js`).then(t=>t.notifyLspSave(r,n,e)),__vite__mapDeps([42,2,5,6,1,3,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,43]))}catch{}},[n,r,Q,fn,ln.refresh]);function _n(n){let r=n??``;s(r),v.current=r,g(!0),_.current&&clearTimeout(_.current),A?_.current=setTimeout(()=>{t&&S(t,{metadata:{...e,unsavedContent:v.current}})},2e3):_.current=setTimeout(()=>gn(v.current),1e3)}let vn=(0,L.useCallback)(async(e,n)=>{try{if(_.current&&clearTimeout(_.current),await C.put(`/api/fs/write`,{path:e,content:n}),t){let{closeTab:n,openTab:r}=pe.getState();n(t),r({type:`editor`,title:E(e),projectId:null,metadata:{filePath:e},closable:!0})}g(!1),ke(!1)}catch{}},[t]),$=e?.lineNumber,yn=e?.endLine,bn=e?.revealAt,xn=(0,L.useCallback)(()=>{let e=y.current;if(!(!e||!$||$<=0)){if(e.revealLineInCenter($),e.setPosition({lineNumber:$,column:1}),yn&&yn>=$){let t=e.getModel(),n=t?.getLineCount()??$,r=Math.min(yn,n),i=t?.getLineMaxColumn(r)??1;e.setSelection({startLineNumber:$,startColumn:1,endLineNumber:r,endColumn:i})}e.focus()}},[$,yn]);(0,L.useEffect)(()=>{bn!=null&&xn()},[bn,xn]),(0,L.useEffect)(()=>{let e=b?.monaco;e&&st(dn,e.languages.typescript.typescriptDefaults,e.languages.typescript.javascriptDefaults)},[b,dn]);let Sn=(0,L.useCallback)((e,t)=>{if(y.current=e,_t.current=t,le({editor:e,monaco:t}),$&&$>0&&setTimeout(()=>xn(),100),A&&e.addCommand(t.KeyMod.CtrlCmd|t.KeyCode.KeyS,()=>ke(!0)),e.addCommand(t.KeyMod.Alt|t.KeyCode.KeyZ,()=>{let e=w.getState();ge()?e.toggleMobileWordWrap():e.toggleWordWrap()}),e.addCommand(t.KeyMod.Alt|t.KeyCode.KeyB,()=>w.getState().toggleInlineBlame()),Y&&(G.current?.dispose(),G.current=t.languages.registerCompletionItemProvider(`sql`,Ye(t,Y))),V){e.addAction({id:`run-sql-at-cursor`,label:`Run Statement at Cursor`,keybindings:[t.KeyMod.CtrlCmd|t.KeyCode.Enter],run:e=>{let t=e.getPosition();if(!t)return;let n=Je(e.getValue(),t.lineNumber);n&&nn.current(n)}}),Z.current.forEach(e=>e.dispose()),Z.current=[];let n=e.getModel(),r=e.addCommand(0,(e,t)=>{t&&nn.current(t)});if(r&&n){let e=t.languages.registerCodeLensProvider(`sql`,{provideCodeLenses:e=>{if(e!==n)return{lenses:[],dispose:()=>{}};let t=[],i=(e,n,i=`▷ Run`)=>{let a=n.trim();a&&t.push({range:{startLineNumber:e,startColumn:1,endLineNumber:e,endColumn:1},command:{id:r,title:i,arguments:[a]}})},a=/^(BEGIN|COMMIT|ROLLBACK|END)(;|\s|$)/i,o=-1,s=[];for(let{sql:t,startLine:n}of Xe(e.getValue())){let e=/^BEGIN(;|\s|$)/i.test(t),r=/^(COMMIT|ROLLBACK|END)(;|\s|$)/i.test(t);o===-1&&e?(o=n,s=[t]):o>-1?(s.push(t),!r&&!a.test(t)&&i(n,t),r&&(i(o,s.join(`
6
6
  `),`▷ Run Transaction`),o=-1,s=[])):i(n,t)}return o>-1&&s.length>1&&i(o,s.join(`
7
7
  `),`▷ Run Transaction`),{lenses:t,dispose:()=>{}}}});Z.current.push(e);let i=t.languages.registerFoldingRangeProvider(`sql`,{provideFoldingRanges:e=>{if(e!==n)return[];let r=[],i=e.getLineCount(),a=[];for(let n=1;n<=i;n++){let i=e.getLineContent(n).trim();if(/^BEGIN(;|\s|$)/i.test(i))a.push(n);else if(/^(COMMIT|ROLLBACK|END)(;|\s|$)/i.test(i)&&a.length>0){let e=a.pop();r.push({start:e,end:n,kind:t.languages.FoldingRangeKind.Region})}}return r}});Z.current.push(i)}}},[Y,V]);if(!i&&!A&&(!n||!Q&&!r))return(0,R.jsx)(`div`,{className:`flex items-center justify-center h-full text-text-secondary text-sm`,children:`No file selected.`});if(u)return(0,R.jsxs)(`div`,{className:`flex items-center justify-center h-full gap-2 text-text-secondary`,children:[(0,R.jsx)(x,{className:`size-5 animate-spin`}),(0,R.jsx)(`span`,{className:`text-sm`,children:`Loading file...`})]});if(p)return(0,R.jsx)(`div`,{className:`flex items-center justify-center h-full text-error text-sm`,children:p});if(M)return(0,R.jsx)(L.Suspense,{fallback:(0,R.jsx)(qt,{}),children:(0,R.jsx)(Lt,{filePath:n,projectName:r})});if(N)return(0,R.jsx)(L.Suspense,{fallback:(0,R.jsx)(qt,{}),children:(0,R.jsx)(Rt,{filePath:n,projectName:r})});if(P)return(0,R.jsx)(L.Suspense,{fallback:(0,R.jsx)(qt,{}),children:(0,R.jsx)(Vt,{filePath:n,projectName:r})});if(F)return(0,R.jsx)(L.Suspense,{fallback:(0,R.jsx)(qt,{}),children:(0,R.jsx)(zt,{filePath:n,projectName:r})});if(Fe)return(0,R.jsx)(L.Suspense,{fallback:(0,R.jsx)(qt,{}),children:(0,R.jsx)(Bt,{filePath:n,projectName:r})});if(c===`base64`)return(0,R.jsxs)(`div`,{className:`flex flex-col items-center justify-center h-full gap-3 text-text-secondary`,children:[(0,R.jsx)(ne,{className:`size-10 text-text-subtle`}),(0,R.jsx)(`p`,{className:`text-sm`,children:`This file is a binary format and cannot be displayed.`}),(0,R.jsx)(`p`,{className:`text-xs text-text-subtle`,children:n})]});let Cn=V?(0,R.jsxs)(`div`,{className:`shrink-0 flex items-center gap-1 px-2 border-l border-border`,children:[(0,R.jsx)(te,{className:`size-3 text-muted-foreground`}),(0,R.jsxs)(`select`,{value:W??``,onChange:e=>{let t=Number(e.target.value);t&&wt(t)},className:`h-5 text-[10px] bg-transparent border border-border rounded px-1 text-foreground outline-none max-w-[140px]`,title:`Select connection for autocomplete`,children:[(0,R.jsx)(`option`,{value:``,children:`Connection…`}),H.map(e=>(0,R.jsx)(`option`,{value:e.id,children:e.name},e.id))]}),(0,R.jsx)(`button`,{type:`button`,onClick:Zt,disabled:!K,className:`p-0.5 rounded text-muted-foreground hover:text-primary disabled:opacity-30 transition-colors`,title:`Run SQL`,children:(0,R.jsx)(f,{className:`size-3.5`})}),K&&(0,R.jsx)(`button`,{type:`button`,onClick:()=>ht(K.id,{readonly:K.readonly?0:1}),className:`flex items-center gap-0.5 px-1 py-0.5 rounded text-[10px] transition-colors ${K.readonly?`text-muted-foreground hover:text-foreground`:`bg-destructive/15 text-destructive`}`,title:K.readonly?`Readonly — click to allow writes`:`WRITE mode — click to enable readonly`,children:K.readonly?(0,R.jsx)(ie,{className:`size-3`}):(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(ee,{className:`size-3`}),(0,R.jsx)(`span`,{className:`font-medium`,children:`WRITE`})]})})]}):null;return(0,R.jsxs)(`div`,{ref:$t,"data-onboarding":`file`,className:`flex flex-col h-full w-full overflow-hidden`,style:en?{height:`${en}px`,maxHeight:`${en}px`}:void 0,children:[fn&&b&&n&&r&&(0,R.jsx)(L.Suspense,{fallback:null,children:(0,R.jsx)(Ft,{editor:b.editor,monaco:b.monaco,projectName:r,filePath:n,onState:hn})}),i!=null&&vt&&(0,R.jsx)(`div`,{className:`flex items-center h-7 border-b border-border bg-background shrink-0 px-2 gap-2`,children:(0,R.jsx)(`button`,{type:`button`,onClick:q,className:`text-[10px] px-2 py-0.5 rounded border border-border hover:bg-muted transition-colors text-foreground`,children:bt?`Raw`:`Beautify`})}),!Qe&&n&&r&&t&&(0,R.jsxs)(`div`,{className:`hidden md:flex items-center h-7 border-b border-border bg-background shrink-0`,children:[(0,R.jsx)(yt,{filePath:n,projectName:r,tabId:t,className:`flex items-center flex-1 min-w-0 overflow-x-auto scrollbar-none px-2 gap-0.5`}),un&&!Ce&&(0,R.jsx)(ct,{enabled:dn,onToggle:xe,status:pn.status,diagnostics:pn.diagnostics,onInstall:pn.install}),(0,R.jsx)(Tt,{value:B,onChange:J}),Cn,(0,R.jsx)(St,{ext:j,mdMode:lt,onMdModeChange:ut,csvMode:dt,onCsvModeChange:ft,wordWrap:k,onToggleWordWrap:Te,inlineBlame:ve,onToggleInlineBlame:cn?ye:void 0,blameStale:ln.stale,onRefresh:on,refreshing:rn,filePath:n,projectName:r,className:`shrink-0 flex items-center gap-1 px-2`})]}),!Qe&&i==null&&t&&(A||n&&!r)&&(0,R.jsxs)(`div`,{className:`hidden md:flex items-center h-7 border-b border-border bg-background shrink-0 px-2`,children:[(0,R.jsx)(`span`,{className:`text-xs text-muted-foreground truncate flex-1`,children:A?`Untitled-${e?.untitledNumber??1}`:n?E(n):`Untitled`}),(0,R.jsx)(Tt,{value:B,onChange:J}),Cn]}),Qe&&n&&(0,R.jsx)(Dt,{mode:$e,onModeChange:e=>{e===`edit`&&it(!0),et(e)},onRefresh:()=>{et(`preview`),nt(e=>e+1)},unsaved:h,onReloadCode:on,refreshing:rn,breadcrumb:r&&t?(0,R.jsx)(yt,{filePath:n,projectName:r,tabId:t,className:`flex items-center min-w-0 overflow-x-auto scrollbar-none gap-0.5`}):(0,R.jsx)(`span`,{className:`truncate text-xs text-muted-foreground`,children:E(n)}),filePath:n,projectName:r,wordWrap:k,onToggleWordWrap:Te,inlineBlame:ve,onToggleInlineBlame:cn?ye:void 0,language:B,onLanguageChange:J,lspEnabled:dn,onToggleLsp:un&&!Ce?xe:void 0}),z&&n&&(0,R.jsx)(Ct,{filePath:n,projectName:r,revision:tt}),z&&!rt?null:at&&dt===`table`?(0,R.jsx)(L.Suspense,{fallback:(0,R.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,R.jsx)(x,{className:`size-5 animate-spin text-text-subtle`})}),children:(0,R.jsx)(It,{content:o??``,onContentChange:_n,wordWrap:k})}):He&&lt===`preview`?(0,R.jsx)(Jt,{content:o??``,projectName:r,filePath:n,tabId:t,ready:!u&&!p&&re===`${r}:${n}`&&i==null&&!A}):(0,R.jsx)(`div`,{className:z?`hidden`:`flex-1 overflow-hidden min-h-0`,children:(0,R.jsx)(we,{height:`100%`,language:B,beforeMount:e=>{Ne(e),Ue(e)},value:o??``,onChange:i==null?_n:void 0,onMount:Sn,theme:Ee,options:{fontSize:14,fontFamily:Be,fontLigatures:ze,wordWrap:k?`on`:`off`,minimap:{enabled:!1},scrollBeyondLastLine:!1,automaticLayout:!0,lineNumbers:`on`,folding:!0,bracketPairColorization:{enabled:!0},readOnly:i!=null,quickSuggestions:{other:!0,comments:!1,strings:!1},suggestOnTriggerCharacters:!0,acceptSuggestionOnEnter:`on`,suggestSelection:`first`,parameterHints:{enabled:!0},inlayHints:{enabled:`on`},"semanticHighlighting.enabled":!0,stickyScroll:{enabled:!Qt},peekWidgetDefaultFocus:`editor`},loading:(0,R.jsx)(x,{className:`size-5 animate-spin text-text-subtle`})},B)}),V&&(kt||X||Mt)&&(0,R.jsx)(Kt,{result:kt,error:X,loading:Mt,connName:K?.name,onClose:()=>{At(null),jt(null),Pt(!1)},onOpenInTab:Xt}),Qt&&!z&&(0,R.jsx)(Nt,{editorRef:y,readOnly:i!=null,wrapOn:k,onToggleWrap:Te}),Oe&&(0,R.jsx)(Ot,{open:Oe,defaultName:`Untitled-${e?.untitledNumber??1}`,content:v.current,onSave:vn,onCancel:()=>ke(!1)})]})}),Gt=()=>{};function Kt({result:e,error:t,loading:n,connName:r,onClose:i,onOpenInTab:a}){let o=(0,L.useMemo)(()=>e?.changeType===`select`&&e.rows.length>0?{columns:e.columns,rows:e.rows,total:e.rows.length,limit:e.rows.length}:null,[e]),s=(0,L.useMemo)(()=>(e?.columns??[]).map(e=>({name:e,type:`text`,nullable:!0,pk:!1,defaultValue:null})),[e?.columns]),[u,d]=(0,L.useState)(250),f=(0,L.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=u,r=e.currentTarget.ownerDocument,i=e=>d(Math.max(80,n+(t-e.clientY))),a=()=>{r.removeEventListener(`mousemove`,i),r.removeEventListener(`mouseup`,a)};r.addEventListener(`mousemove`,i),r.addEventListener(`mouseup`,a)},[u]);return(0,R.jsxs)(`div`,{className:`shrink-0 border-t border-border flex flex-col`,style:{height:u},children:[(0,R.jsx)(`div`,{onMouseDown:f,className:`shrink-0 h-1.5 cursor-row-resize bg-border/50 hover:bg-primary/30 flex items-center justify-center transition-colors`,children:(0,R.jsx)(l,{className:`size-3 text-muted-foreground/50`})}),(0,R.jsxs)(`div`,{className:`flex items-center gap-2 px-2 py-1 bg-muted/50 border-b border-border shrink-0`,children:[(0,R.jsx)(te,{className:`size-3 text-muted-foreground`}),(0,R.jsxs)(`span`,{className:`text-xs font-medium text-foreground truncate flex-1`,children:[r?`${r} · Results`:`Query Results`,e?.executionTimeMs!=null&&(0,R.jsxs)(`span`,{className:`text-muted-foreground ml-1.5 font-normal`,children:[e.executionTimeMs,`ms`]})]}),(0,R.jsxs)(`button`,{type:`button`,onClick:a,title:`Open in DB Viewer tab`,className:`flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] text-muted-foreground hover:text-foreground hover:bg-muted transition-colors`,children:[(0,R.jsx)(m,{className:`size-3`}),(0,R.jsx)(`span`,{className:`hidden sm:inline`,children:`Open in Tab`})]}),(0,R.jsx)(`button`,{type:`button`,onClick:i,title:`Close results`,className:`p-0.5 rounded text-muted-foreground hover:text-foreground transition-colors`,children:(0,R.jsx)(c,{className:`size-3`})})]}),(0,R.jsxs)(`div`,{className:`flex-1 overflow-hidden min-h-0`,children:[n&&(0,R.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,R.jsx)(x,{className:`size-4 animate-spin text-muted-foreground`})}),t&&(0,R.jsx)(`div`,{className:`px-3 py-2 text-xs text-destructive bg-destructive/5`,children:t}),e?.changeType===`modify`&&(0,R.jsxs)(`div`,{className:`px-3 py-2 text-xs text-success`,children:[e.rowsAffected,` row(s) affected`]}),o&&(0,R.jsx)(Qe,{columns:o.columns,rows:o.rows,total:o.total,limit:o.limit,schema:s,loading:!1,page:1,onPageChange:Gt,onCellUpdate:Gt,readOnly:!0,orderBy:null,orderDir:`ASC`,onToggleSort:Gt,connectionName:r}),e?.changeType===`select`&&e.rows.length===0&&(0,R.jsx)(`div`,{className:`px-3 py-2 text-xs text-muted-foreground`,children:`No results`})]})]})}function qt(){return(0,R.jsx)(`div`,{className:`flex items-center justify-center h-full`,children:(0,R.jsx)(x,{className:`size-5 animate-spin text-text-subtle`})})}function Jt({content:e,...t}){return(0,R.jsx)(L.Suspense,{fallback:(0,R.jsx)(`div`,{className:`animate-pulse h-4 bg-muted rounded m-4`}),children:(0,R.jsx)(et,{...t,children:(0,R.jsx)(Pt,{content:e,className:`flex-1 overflow-auto p-4`})})})}export{Wt as CodeEditor};
@@ -1 +1 @@
1
- import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import{Dn as r,Jr as i,Mr as a,V as o,Zt as s,ar as c,ct as l,ir as u,lt as d,st as f,un as p}from"./icons-CO_II6D-.js";import{a as m,r as h}from"./api-client-F5Zi1sR0.js";import{n as g}from"./use-is-mobile-CkO33jqU.js";import{t as _}from"./button-CsmGH5xa.js";import{a as v,i as y,n as b,o as x,r as S,t as C}from"./dialog-z8PLkL8n.js";import{t as w}from"./mobile-bottom-sheet-CLic9ovp.js";import{t as T}from"./input-CP31LZnN.js";import{Ct as E,Nt as D,dr as O,fr as k,pr as A}from"./index-DQCw6d-2.js";import{c as j,h as M,i as N,l as P,s as F,t as I,u as L}from"./api-settings-BeINN5Dy.js";function R(e){return e>=90?`text-error`:e>=70?`text-warning`:`text-success`}function z(e){return e>=90?`bg-error`:e>=70?`bg-warning`:`bg-success`}function B(e){if(!e)return null;let t=null;if(e.resetsInMinutes!=null)t=e.resetsInMinutes;else if(e.resetsInHours!=null)t=Math.round(e.resetsInHours*60);else if(e.resetsAt){let n=new Date(e.resetsAt).getTime()-Date.now();t=n>0?Math.ceil(n/6e4):0}if(t==null)return null;if(t<=0)return`now`;let n=Math.floor(t/1440),r=Math.floor(t%1440/60),i=t%60;return n>0?i>0?`${n}d ${r}h ${i}m`:r>0?`${n}d ${r}h`:`${n}d`:r>0?i>0?`${r}h ${i}m`:`${r}h`:`${i}m`}function V(e){if(!e)return null;let t=new Date(e).getTime();return Number.isFinite(t)?new Date(t).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):null}function H(e){let t=e-Date.now();if(t<=0)return`expired`;let n=Math.ceil(t/6e4),r=Math.floor(n/60),i=Math.floor(r/24);return i>0?`${i}d ${r%24}h`:r>0?`${r}h ${n%60}m`:`${n}m`}function U(e){if(!e)return{label:`unknown`,tip:`No account info available`,color:`text-text-subtle`};if(!e.expiresAt)return{label:`key`,tip:`API key (no expiry)`,color:`text-text-subtle`};if(e.reauthRequired)return{label:`sign in again`,tip:`Anthropic rejected this account's refresh token. Sign in again to restore it.`,color:`text-error`};let t=e.expiresAt*1e3<Date.now();return t&&e.hasRefreshToken?{label:`expired`,tip:`Token expired but has refresh token — will auto-renew`,color:`text-warning`}:t?{label:`expired`,tip:`Token expired, no refresh token`,color:`text-error`}:e.hasRefreshToken?{label:`long-lived`,tip:`OAuth token with refresh — long-lived`,color:`text-success`}:{label:`temp`,tip:`Temporary token without refresh — will expire`,color:`text-warning`}}function W(e){if(!e)return null;let t=Math.round((Date.now()-e)/1e3);if(t<5)return`just now`;if(t<60)return`${t}s ago`;let n=Math.floor(t/60);if(n<60)return`${n}m ago`;let r=Math.floor(n/60),i=n%60;return r<24?i>0?`${r}h ${i}m ago`:`${r}h ago`:`${Math.floor(r/24)}d ago`}var G=n();function K({label:e,pct:t,reset:n,resetsAt:r}){let i=V(r);return(0,G.jsxs)(`div`,{className:`space-y-1`,"data-testid":`account-usage-bar`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsx)(`span`,{className:`text-xs font-medium text-text-primary`,children:e}),n&&(0,G.jsxs)(O,{children:[(0,G.jsx)(A,{asChild:!0,children:(0,G.jsxs)(`span`,{className:`text-[10px] text-text-subtle cursor-default`,children:[`↻ `,n]})}),(0,G.jsx)(k,{side:`top`,children:i?`Resets ${i}`:`Resets in`})]})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`div`,{className:`flex-1 h-2 rounded-full bg-border overflow-hidden`,children:t!=null&&(0,G.jsx)(`div`,{className:`h-full rounded-full transition-all ${z(t)}`,style:{width:`${Math.min(t,100)}%`}})}),(0,G.jsx)(`span`,{className:`text-xs font-medium tabular-nums w-10 text-right ${t==null?`text-text-subtle`:R(t)}`,children:t==null?`—`:`${t}%`})]})]})}function q({label:e,bucket:t}){return t?(0,G.jsx)(K,{label:e,pct:Math.round(t.utilization*100),reset:B(t),resetsAt:t.resetsAt}):null}function J({hint:e,className:t,children:n,onClick:r}){return(0,G.jsxs)(O,{children:[(0,G.jsx)(A,{asChild:!0,children:(0,G.jsx)(`button`,{type:`button`,onClick:r,className:[r?`relative cursor-pointer rounded px-1 -mx-1 underline decoration-dotted underline-offset-2 hover:bg-error/10 after:absolute after:-inset-x-2 after:-inset-y-3 after:content-['']`:`cursor-help`,`text-left`,t].filter(Boolean).join(` `),children:n})}),(0,G.jsx)(k,{side:`top`,className:`max-w-[260px] text-xs leading-relaxed`,children:e})]})}function Y({description:e,onRefresh:t,refreshing:n,disabled:r,actions:i}){return(0,G.jsxs)(`section`,{className:`space-y-2`,children:[(0,G.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e}),(0,G.jsx)(_,{variant:`ghost`,size:`icon`,className:`size-8 shrink-0 cursor-pointer`,onClick:t,disabled:r||n,title:`Refresh`,"aria-label":`Refresh accounts`,children:(0,G.jsx)(u,{className:`size-4 ${n?`animate-spin`:``}`})})]}),(0,G.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:i})]})}function X({message:e,onDismiss:t}){return e?(0,G.jsxs)(`div`,{className:`flex items-start gap-2 text-xs p-2 rounded bg-muted`,role:`status`,children:[(0,G.jsx)(`span`,{className:`flex-1`,children:e}),(0,G.jsx)(`button`,{onClick:t,className:`shrink-0 text-muted-foreground hover:text-foreground cursor-pointer`,"aria-label":`Dismiss message`,children:(0,G.jsx)(i,{className:`size-3.5`})})]}):null}function Z({children:e}){return(0,G.jsx)(`div`,{className:`flex gap-2 overflow-x-auto pb-1 -mx-1 px-1 snap-x snap-mandatory scrollbar-thin`,children:e})}function ee({active:e,flash:t,dense:n,children:r,...i}){return(0,G.jsx)(`div`,{...i,className:[`rounded-md border transition-colors duration-500`,n?`p-2.5 space-y-1.5`:`p-3 space-y-2`,t?`bg-primary/10 border-primary/40`:``,e?`border-primary/30 bg-primary/5`:`border-border/50`,i.className??``].filter(Boolean).join(` `),children:r})}function Q({buckets:e}){return e?.length?(0,G.jsx)(G.Fragment,{children:e.map(e=>(0,G.jsx)(q,{label:`Weekly (${e.label})`,bucket:e},e.label))}):null}function te(e){return new Date(e).toLocaleDateString(void 0,{day:`numeric`,month:`short`})}function ne({credits:e}){if(!e)return null;let t=e.available,n=t===0?`No free resets`:`${t} free reset${t===1?``:`s`}`,r=t===0?`Codex has no free rate-limit resets left for this account.`:`Codex has granted this account ${t} free rate-limit reset${t===1?``:`s`}${e.title?` (${e.title})`:``}.${e.nextExpiresAt?` The next one expires on ${new Date(e.nextExpiresAt).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})}.`:``} A "Use reset" button appears here once a limit is reached; a reset moves the weekly reset date, so spending one earlier wastes it.`;return(0,G.jsxs)(J,{className:`inline-flex items-center gap-1 ${t>0?`text-primary`:``}`,hint:r,children:[(0,G.jsx)(c,{className:`size-3 shrink-0`,"aria-hidden":!0}),n,t>0&&e.nextExpiresAt&&(0,G.jsxs)(`span`,{className:`text-text-subtle`,children:[`· until `,te(e.nextExpiresAt)]})]})}var re={readOnly:`min-w-[220px]`,withActions:`min-w-[300px]`};function ie({entry:e,isActive:t,accountInfo:n,onToggle:r,toggling:i,onDelete:c,onExport:l,onViewProfile:p,flash:m,onSelect:h,unselectableReason:g,selecting:_,planLabel:v,dailyGuard:y,onDailyGuardToggle:b,dailyGuardToggling:x,reauthHint:S,onReauth:C,resetCredits:w,resetCreditAction:T,layout:D=`list`}){let{usage:j}=e,M=j.session||j.weekly||j.weeklyOpus||j.weeklySonnet||j.weeklyScoped?.length,N=n?.status??e.accountStatus,P=!!(n&&!n.hasRefreshToken&&n.expiresAt&&n.expiresAt<Math.floor(Date.now()/1e3)),F=U(n),I=!!n?.reauthRequired||!!S,L=n?.grantExpiresAt?n.grantExpiresAt*1e3:null,R=!!L&&L-Date.now()<5*864e5,z=!!n&&(F.label===`temp`||F.label===`unknown`||F.label===`expired`&&!P&&!I),B=L?new Date(L).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):null,V=!!(r||c||l||p),K=P?`Token expired — sign in again`:I?`Sign in again to use this account`:g??null,Y=D===`list`?``:D===`grid`?`flex flex-col justify-evenly overflow-hidden min-h-0`:`shrink-0 snap-start ${V?re.withActions:re.readOnly}`;return(0,G.jsxs)(ee,{active:t,flash:m,dense:D!==`list`,className:[Y,P||I?`opacity-50`:``].filter(Boolean).join(` `)||void 0,"data-testid":`account-card`,"data-account-id":e.accountId,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`span`,{className:`text-sm font-medium truncate flex-1 min-w-0`,children:e.accountLabel??e.accountId.slice(0,8)}),t&&(0,G.jsx)(J,{className:`text-[10px] text-primary shrink-0 font-medium`,hint:`The next turn will run on this account.`,children:`Active`}),h&&!t&&(0,G.jsxs)(O,{children:[(0,G.jsx)(A,{asChild:!0,children:(0,G.jsx)(`button`,{type:`button`,onClick:()=>h(e.accountId),disabled:_,className:[`shrink-0 rounded px-1.5 py-0.5 text-[10px] font-medium transition-colors cursor-pointer disabled:cursor-wait`,K?`text-text-subtle hover:text-error hover:bg-error/10`:`text-text-secondary hover:text-foreground hover:bg-surface-elevated`].join(` `),children:_?`Switching…`:`Use`})}),(0,G.jsx)(k,{side:`top`,children:K??`Use this account for this chat`})]}),P&&(0,G.jsx)(J,{className:`text-[10px] text-error shrink-0 font-medium`,hint:`This token has expired and carries no refresh token, so nothing can renew it. Sign in again to replace it.`,onClick:C?()=>C(e.accountId):void 0,children:`Expired`}),I&&!P&&(0,G.jsx)(J,{className:`text-[10px] text-error shrink-0 font-medium`,hint:S??`Anthropic rejected this account's refresh token, so no turn can run on it. Signing in again is the only thing that restores it.`,onClick:C?()=>C(e.accountId):void 0,children:`Sign in again`}),!e.isOAuth&&!P&&(0,G.jsx)(J,{className:`text-[10px] text-text-subtle shrink-0`,hint:`A static API key rather than a sign-in: nothing to expire and nothing to renew.`,children:`API key`}),v&&(0,G.jsx)(J,{className:`text-[10px] uppercase tracking-wide text-text-subtle shrink-0`,hint:`The subscription this account is on. It decides which quota windows the account has — some plans have a weekly limit and no shorter one.`,children:v}),(0,G.jsxs)(`div`,{className:`flex items-center gap-0.5 shrink-0`,children:[!P&&p&&n?.profileData&&(0,G.jsxs)(O,{children:[(0,G.jsx)(A,{asChild:!0,children:(0,G.jsx)(`button`,{className:`p-2 rounded cursor-pointer text-text-subtle hover:text-foreground hover:bg-surface-elevated transition-colors`,onClick:()=>p(n.profileData,e.accountId),"aria-label":`View profile`,children:(0,G.jsx)(d,{className:`size-4`})})}),(0,G.jsx)(k,{side:`top`,children:`View profile`})]}),!P&&l&&e.isOAuth&&(0,G.jsxs)(O,{children:[(0,G.jsx)(A,{asChild:!0,children:(0,G.jsx)(`button`,{className:`p-2 rounded cursor-pointer text-text-subtle hover:text-primary hover:bg-surface-elevated transition-colors`,onClick:()=>l(e.accountId),"aria-label":`Export this account`,children:(0,G.jsx)(f,{className:`size-4`})})}),(0,G.jsx)(k,{side:`top`,children:`Export this account`})]}),!P&&r&&(0,G.jsx)(E,{checked:N!==`disabled`,onCheckedChange:()=>r(e.accountId,N),disabled:i||N===`cooldown`,"aria-label":N===`disabled`?`Enable account`:`Disable account`,className:`cursor-pointer relative before:absolute before:content-[''] before:-inset-y-3 before:-inset-x-0.5`}),c&&(0,G.jsxs)(O,{children:[(0,G.jsx)(A,{asChild:!0,children:(0,G.jsx)(`button`,{className:`p-2 rounded cursor-pointer text-text-subtle hover:text-error hover:bg-surface-elevated transition-colors`,onClick:()=>c(e.accountId,e.accountLabel??e.accountId.slice(0,8)),"aria-label":`Remove account`,children:(0,G.jsx)(a,{className:`size-4`})})}),(0,G.jsx)(k,{side:`top`,children:`Remove account`})]})]})]}),M?(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(q,{label:`5-Hour Session`,bucket:j.session}),(0,G.jsx)(q,{label:`Weekly`,bucket:j.weekly}),(0,G.jsx)(q,{label:`Weekly (Opus)`,bucket:j.weeklyOpus}),(0,G.jsx)(q,{label:`Weekly (Sonnet)`,bucket:j.weeklySonnet}),(0,G.jsx)(Q,{buckets:j.weeklyScoped})]}):(0,G.jsx)(`p`,{className:`text-xs text-text-subtle`,children:e.isOAuth?`No usage data yet`:`Usage tracking not available for API keys`}),y&&(0,G.jsxs)(`div`,{className:`flex min-h-12 items-center justify-between gap-3 rounded-md border px-2.5 py-1.5 ${y.enabled&&y.state.blocked?`border-error/40 bg-error/5`:`border-border/50 bg-surface/40`}`,children:[(0,G.jsxs)(`div`,{className:`min-w-0 space-y-0.5`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-medium ${y.enabled&&y.state.blocked?`text-error`:`text-text-secondary`}`,children:[(0,G.jsx)(`span`,{children:`Daily guard`}),(0,G.jsxs)(O,{children:[(0,G.jsx)(A,{asChild:!0,children:(0,G.jsx)(`button`,{type:`button`,"aria-label":`About Daily guard`,className:`text-text-subtle hover:text-text-primary cursor-help`,children:(0,G.jsx)(o,{className:`size-3.5`})})}),(0,G.jsx)(k,{side:`top`,className:`max-w-64 text-xs leading-relaxed`,children:`Spreads the weekly quota across five weekdays, adding 20% per weekday. Weekend slots keep the previous cap; unused allowance carries forward. Daily slots start at the reset time and use UTC weekdays.`})]})]}),(0,G.jsx)(`p`,{className:`text-[10px] tabular-nums ${y.enabled&&y.state.blocked?`text-error`:`text-text-subtle`}`,children:y.enabled&&y.state.blocked?`${Math.round(y.state.used*100)}% used / ${Math.round(y.state.cap*100)}% daily cap. New turns paused.`:`Weekday ${y.state.day}/5, ${Math.round(y.state.cap*100)}% daily cap`})]}),b&&(0,G.jsx)(E,{checked:y.enabled,onCheckedChange:b,disabled:x,"aria-label":y.enabled?`Disable Daily guard`:`Enable Daily guard`,className:`cursor-pointer shrink-0`})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2 text-[10px] text-text-subtle flex-wrap`,children:[(0,G.jsx)(ne,{credits:w}),T,j.lastFetchedAt&&(0,G.jsxs)(J,{className:`inline-flex items-center gap-1`,hint:`Usage last read from Anthropic on ${new Date(j.lastFetchedAt).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})}. The bars above are only as current as this.`,children:[(0,G.jsx)(u,{className:`size-3 shrink-0`,"aria-hidden":!0}),W(new Date(j.lastFetchedAt).getTime())]}),L&&!I&&(0,G.jsxs)(J,{className:[`inline-flex items-center gap-1`,R?`text-warning`:``].filter(Boolean).join(` `),hint:`Sign-in stops working on ${B}. Anthropic ends every sign-in on a fixed schedule from the day it was made, whether or not the account gets used — refreshing does not extend it. After that the account fails until you sign in again.`,children:[(0,G.jsx)(s,{className:`size-3 shrink-0`,"aria-hidden":!0}),`sign-in `,H(L)]}),z&&(0,G.jsxs)(J,{className:F.color,hint:F.tip,children:[`© `,F.label]})]})]})}var $=e(t(),1);function ae(e){let t=e.usage;return[t.session?.utilization,t.weekly?.utilization,t.weeklyOpus?.utilization,t.weeklySonnet?.utilization,...(t.weeklyScoped??[]).map(e=>`${e.label}:${e.utilization}`)].join(`|`)}function oe(e=!0){let[t,n]=(0,$.useState)([]),[r,i]=(0,$.useState)([]),[a,o]=(0,$.useState)(null),[s,c]=(0,$.useState)(!0),[l,u]=(0,$.useState)(!1),[d,f]=(0,$.useState)(new Set),[p,m]=(0,$.useState)(null),h=(0,$.useRef)([]),g=(0,$.useRef)(void 0),_=(0,$.useCallback)(async()=>{let e=h.current.length>0;e?u(!0):c(!0);let[t,r,a]=await Promise.allSettled([P(),F(),j()]);if(t.status===`fulfilled`){let r=t.value;if(e){let e=new Map(h.current.map(e=>[e.accountId,ae(e)])),t=new Set(r.filter(t=>e.get(t.accountId)!==ae(t)).map(e=>e.accountId));t.size>0&&(f(t),clearTimeout(g.current),g.current=setTimeout(()=>f(new Set),1500))}h.current=r,n(r)}r.status===`fulfilled`&&i(r.value),a.status===`fulfilled`&&o(a.value?.id??null),c(!1),u(!1)},[]),v=(0,$.useCallback)(async(e,t)=>{m(e);let n=null;try{await M(e,{status:t===`disabled`?`active`:`disabled`})}catch(e){n=e.message}return m(null),await _(),n},[_]);return(0,$.useEffect)(()=>(e&&_(),()=>clearTimeout(g.current)),[e,_]),{usages:t,accounts:r,activeAccountId:a,initialLoading:s,refreshing:l,flashIds:d,reload:_,toggle:v,togglingId:p}}function se({open:e,onOpenChange:t,onSuccess:n,signInAgainFor:r}){let[i,a]=(0,$.useState)(``),[o,s]=(0,$.useState)(``),[c,l]=(0,$.useState)(!1),[u,d]=(0,$.useState)(null),[f,m]=(0,$.useState)(null),[h,g]=(0,$.useState)(``),[w,E]=(0,$.useState)(!1),[O,k]=(0,$.useState)(`idle`);function A(){m(null),g(``),k(`idle`),d(null)}function j(){t(!1),A(),a(``),s(``),d(null)}async function M(){E(!0),d(null);try{let{url:e,state:t}=await L();m(t),k(`waiting`),window.open(e,`_blank`)}catch(e){d(e.message)}E(!1)}async function P(){if(!(!h.trim()||!f)){E(!0),d(null);try{let e=h.trim();e.includes(`#`)&&(e=e.split(`#`)[0]??e);let t=await N(e,f);j(),n(t?.status===`disabled`?`Signed in. This account is still disabled — enable it to use it.`:`Account connected via OAuth!`)}catch(e){d(e.message)}E(!1)}}async function F(){if(i.trim()){l(!0),d(null);try{let e=await I({apiKey:i.trim(),label:o.trim()||void 0});j(),n(e?.status===`disabled`?`Token updated. This account is still disabled — enable it to use it.`:`Account added!`)}catch(e){d(e.message)}l(!1)}}let R=i.trim()?i.trim().startsWith(`sk-ant-oat`)?`OAuth token (Claude Max/Pro)`:i.trim().startsWith(`sk-ant-api`)?`API key`:`Unknown format`:``;return(0,G.jsx)(C,{open:e,onOpenChange:e=>{e||j()},children:(0,G.jsxs)(b,{className:`sm:max-w-md`,children:[(0,G.jsxs)(v,{children:[(0,G.jsx)(x,{className:`text-sm`,children:r?`Sign in again — ${r}`:`Add Claude Account`}),(0,G.jsx)(S,{className:`text-xs leading-relaxed`,children:r?`Log in with the same Claude account. PPM matches it by email and renews the existing card instead of adding a new one.`:`Connect via OAuth (recommended) or paste a token manually.`})]}),(0,G.jsxs)(`div`,{className:`space-y-3`,children:[(0,G.jsxs)(`div`,{className:`rounded-md border p-3 space-y-2`,children:[(0,G.jsx)(`p`,{className:`text-[11px] font-medium`,children:`Recommended: Login with Claude`}),O===`idle`?(0,G.jsx)(_,{size:`sm`,className:`w-full h-8 text-xs`,onClick:M,disabled:w,children:w?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(p,{className:`size-3 animate-spin mr-1`}),` Opening...`]}):`Login with Claude`}):(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Authorize in the opened tab, then paste the code:`}),(0,G.jsx)(T,{placeholder:`Paste code here...`,value:h,onChange:e=>g(e.target.value),className:`text-xs h-8 font-mono`,autoFocus:!0}),(0,G.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,G.jsx)(_,{size:`sm`,className:`flex-1 h-7 text-xs`,onClick:P,disabled:!h.trim()||w,children:w?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(p,{className:`size-3 animate-spin mr-1`}),` Connecting...`]}):`Connect`}),(0,G.jsx)(_,{size:`sm`,variant:`ghost`,className:`h-7 text-xs`,onClick:A,children:`Cancel`})]})]})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`div`,{className:`flex-1 border-t`}),(0,G.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`or paste token`}),(0,G.jsx)(`div`,{className:`flex-1 border-t`})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(D,{htmlFor:`add-token`,className:`text-xs`,children:`Token`}),(0,G.jsx)(T,{id:`add-token`,type:`password`,placeholder:`sk-ant-...`,value:i,onChange:e=>a(e.target.value),className:`text-xs h-8 font-mono`}),R&&(0,G.jsxs)(`p`,{className:`text-[10px] text-muted-foreground`,children:[`Detected: `,R]})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(D,{htmlFor:`add-label`,className:`text-xs`,children:`Label (optional)`}),(0,G.jsx)(T,{id:`add-label`,placeholder:`e.g. Personal, Work`,value:o,onChange:e=>s(e.target.value),className:`text-xs h-8`})]})]}),u&&(0,G.jsx)(`div`,{className:`text-[11px] p-2 rounded bg-error/10 text-error`,children:u}),(0,G.jsxs)(y,{children:[(0,G.jsx)(_,{size:`sm`,variant:`outline`,className:`text-xs h-7`,onClick:j,children:`Cancel`}),(0,G.jsx)(_,{size:`sm`,className:`text-xs h-7`,onClick:F,disabled:!i.trim()||c,children:c?`Adding...`:`Add Token`})]})]})})}function ce(e){return e?.trim()?{free:`ChatGPT Free`,go:`ChatGPT Go`,plus:`ChatGPT Plus`,pro:`ChatGPT Pro`,team:`ChatGPT Team`,business:`ChatGPT Business`,self_serve_business_prolite:`ChatGPT Business`,enterprise:`ChatGPT Enterprise`,edu:`ChatGPT Edu`}[e.trim().toLowerCase()]??e:null}var le=1440*60*1e3,ue=7,de=5;function fe(e,t=Date.now()){if(!e||e.windowHours!==168)return null;let n=new Date(e.resetsAt).getTime();if(!Number.isFinite(t)||!Number.isFinite(n)||n<=t)return null;let r=n-ue*le;if(t<r)return null;let i=Math.min(ue-1,Math.floor((t-r)/le)),a=0;for(let e=0;e<=i;e++){let t=new Date(r+e*le).getUTCDay();t!==0&&t!==6&&a++}let o=a/de;return{day:a,cap:o,used:e.utilization,blocked:e.utilization>=o}}var pe=`Codex rejected this account's login (revoked or expired), so no turn can run on it and it is skipped. The usage shown is the last reading. Click to sign in again — the account keeps its settings and chats.`,me=2e3,he=21e4;function ge(e){let[t,n]=(0,$.useState)([]),[r,i]=(0,$.useState)(`round-robin`),[a,o]=(0,$.useState)({}),[s,c]=(0,$.useState)(!1),[l,u]=(0,$.useState)(new Set),[d,f]=(0,$.useState)(``),[p,g]=(0,$.useState)(``),[_,v]=(0,$.useState)(!1),[y,b]=(0,$.useState)(null),[x,S]=(0,$.useState)(null),[C,w]=(0,$.useState)(!1),[T,E]=(0,$.useState)(null),[D,O]=(0,$.useState)(!1),[k,A]=(0,$.useState)(``),[j,M]=(0,$.useState)(!1),[N,P]=(0,$.useState)(``),[F,I]=(0,$.useState)(!1),[L,R]=(0,$.useState)(!1),[z,B]=(0,$.useState)(null),V=(0,$.useRef)(null),H=(0,$.useRef)(null),U=(0,$.useRef)(0),W=(0,$.useRef)(!1),G=(0,$.useRef)(!1),K=(0,$.useRef)(!1),q=(0,$.useRef)(e);q.current=e;let J=(0,$.useCallback)(async()=>{c(!0);try{let e=await h.get(`/api/codex-accounts`);n(e.accounts),i(e.strategy),h.get(`/api/codex-accounts/usage`).then(o).catch(()=>{})}finally{c(!1)}},[]);(0,$.useEffect)(()=>{J()},[J]);let Y=async()=>{if(!(!d.trim()||G.current||W.current||H.current)){G.current=!0,v(!0),b(null);try{await h.post(`/api/codex-accounts/api-key`,{apiKey:d.trim(),label:p.trim()||void 0}),f(``),g(``),e(),await J()}catch(e){b(e.message)}finally{G.current=!1,v(!1)}}},X=(0,$.useCallback)(()=>{U.current+=1,W.current=!1,K.current=!1,V.current?.(),V.current=null;let e=H.current;H.current=null,e&&h.del(`/api/codex-accounts/${e.method}-login/${e.id}`).catch(()=>{})},[]),Z=(0,$.useCallback)(()=>{X(),S(null),w(!1),E(null),O(!1),A(``),M(!1)},[X]),ee=(0,$.useCallback)((e,t)=>{let n=Date.now()+(t===`browser`?61e4:he),r=!1,i;V.current=()=>{r=!0,clearTimeout(i)};let a=async()=>{if(r)return;let o=null;try{o=await h.get(`/api/codex-accounts/${t}-login/${e}/status`)}catch{}if(!r){if(o?.state===`done`){Z(),g(``),q.current(),await J();return}if(o?.state===`error`||Date.now()>n){Z(),b(o?.state===`error`?o.error:`${t===`browser`?`Browser`:`Device`} login timed out.`);return}i=setTimeout(a,me)}};a()},[Z,J]);(0,$.useEffect)(()=>X,[X]);let Q=async(e,t)=>{if(W.current||H.current||G.current)return;W.current=!0;let n=++U.current;O(!0),b(null);try{let r=await h.post(`/api/codex-accounts/${e}-login`,{label:p.trim()||void 0,...t?{accountId:t}:{}});if(n!==U.current){h.del(`/api/codex-accounts/${e}-login/${r.id}`).catch(()=>{});return}H.current={id:r.id,method:e},e===`device`?(S(r),w(!0)):E(r),ee(r.id,e)}catch(e){n===U.current&&b(e.message)}finally{n===U.current&&(W.current=!1,O(!1))}};return{accounts:t,strategy:r,usages:a,loading:s,apiKey:d,setApiKey:f,label:p,setLabel:g,adding:_,err:y,setErr:b,device:x,deviceWaiting:C,backupPassword:N,setBackupPassword:P,exporting:F,importing:L,msg:z,setMsg:B,toggling:l,load:J,addApiKey:Y,startDevice:e=>Q(`device`,e),startBrowser:e=>Q(`browser`,e),browser:T,loginStarting:D,callbackUrl:k,setCallbackUrl:A,submittingCallback:j,submitCallback:async()=>{let e=H.current;if(e?.method!==`browser`||!k.trim()||K.current)return;let t=U.current;K.current=!0,M(!0),b(null);let n=k.trim();A(``);try{await h.post(`/api/codex-accounts/browser-login/${e.id}/callback`,{callbackUrl:n})}catch(e){t===U.current&&b(e.message)}finally{t===U.current&&(K.current=!1,M(!1))}},cancelLogin:Z,remove:async e=>{await h.del(`/api/codex-accounts/${e}`),await J()},toggle:async(e,t)=>{let n=t===`disabled`?`active`:`disabled`;u(t=>new Set(t).add(e)),b(null);try{await h.patch(`/api/codex-accounts/${e}`,{status:n}),await J()}catch(e){b(e.message||`Could not change the account`)}finally{u(t=>{let n=new Set(t);return n.delete(e),n})}},toggleDailyGuard:async(e,t)=>{u(t=>new Set(t).add(e)),b(null);try{await h.patch(`/api/codex-accounts/${e}`,{dailyGuardEnabled:!t}),await J()}catch(e){b(e.message||`Could not change Daily guard`)}finally{u(t=>{let n=new Set(t);return n.delete(e),n})}},changeStrategy:async e=>{i(e);try{await h.put(`/api/codex-accounts/strategy`,{strategy:e})}catch{}},doExport:async()=>{if(!N.trim()){b(`Set a backup password first.`);return}I(!0),b(null),B(null);try{let t={"Content-Type":`application/json`},n=m();n&&(t.Authorization=`Bearer ${n}`);let r=await fetch(`/api/codex-accounts/export`,{method:`POST`,headers:t,body:JSON.stringify({password:N})});if(!r.ok){let e=await r.json().catch(()=>({}));throw Error(e.error??`Export failed: ${r.status}`)}let i=await r.text(),a=new Blob([i],{type:`application/json`}),o=document.createElement(`a`);o.href=URL.createObjectURL(a),o.download=`ppm-codex-accounts-backup.json`,o.click(),URL.revokeObjectURL(o.href),B(`Backup downloaded.`),e()}catch(e){b(e.message)}finally{I(!1)}},doImport:async t=>{if(!N.trim()){b(`Enter the backup password first.`);return}R(!0),b(null),B(null);try{let n=await t.text(),r=await h.post(`/api/codex-accounts/import`,{data:n,password:N});B(`Imported ${r.imported}${r.skipped?`, skipped ${r.skipped}`:``}.`),e(),await J()}catch(e){b(e.message)}finally{R(!1)}}}}function _e({open:e,onOpenChange:t,label:n,onLabelChange:i,apiKey:a,onApiKeyChange:o,adding:c,onAddApiKey:u,deviceWaiting:d,onStartDevice:f,device:m,error:h,browser:g,onStartBrowser:w,loginStarting:E,callbackUrl:O,onCallbackUrlChange:k,submittingCallback:A,onSubmitCallback:j,reloginLabel:M}){let N=E||d||!!g||c;return(0,G.jsx)(C,{open:e,onOpenChange:t,children:(0,G.jsxs)(b,{className:`sm:max-w-md max-h-[90dvh] overflow-y-auto`,children:[(0,G.jsxs)(v,{children:[(0,G.jsx)(x,{className:`text-sm`,children:M?`Sign in again — ${M}`:`Add Codex Account`}),(0,G.jsx)(S,{className:`text-xs leading-relaxed`,children:M?`Sign in with ChatGPT to renew this account. It keeps its name, its settings and the chats bound to it.`:`Choose browser login, a device code, or an OpenAI API key.`})]}),(0,G.jsxs)(`div`,{className:`space-y-3`,children:[!M&&(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(D,{htmlFor:`codex-label`,className:`text-xs`,children:`Label (optional)`}),(0,G.jsx)(T,{id:`codex-label`,placeholder:`e.g. Personal, Work`,value:n,onChange:e=>i(e.target.value),disabled:N,className:`text-xs`})]}),(0,G.jsxs)(`div`,{className:`rounded-md border p-3 space-y-2`,children:[(0,G.jsx)(`p`,{className:`text-[11px] font-medium`,children:`Browser login`}),(0,G.jsxs)(_,{size:`sm`,className:`w-full cursor-pointer gap-1.5`,onClick:w,disabled:N,children:[(0,G.jsx)(l,{className:`size-4`}),` Sign in with browser`]}),g&&(0,G.jsxs)(`div`,{className:`space-y-2 text-xs`,children:[(0,G.jsxs)(`a`,{href:g.authUrl,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1 text-primary hover:underline`,children:[(0,G.jsx)(l,{className:`size-3`}),` Open ChatGPT sign-in`]}),(0,G.jsx)(`p`,{children:`Sign in, then copy the full localhost callback URL from the address bar and paste it below. On a phone, copy it even if the page fails to load.`}),(0,G.jsx)(D,{htmlFor:`codex-callback-url`,children:`Callback URL`}),(0,G.jsx)(T,{id:`codex-callback-url`,type:`password`,autoComplete:`off`,spellCheck:!1,placeholder:`http://localhost:.../auth/callback?...`,value:O,onChange:e=>k(e.target.value),disabled:A}),(0,G.jsxs)(_,{size:`sm`,onClick:j,disabled:!O.trim()||A,children:[A&&(0,G.jsx)(p,{className:`size-3 animate-spin`}),` Submit callback URL`]}),(0,G.jsxs)(`p`,{role:`status`,className:`flex items-center gap-1.5 text-muted-foreground`,children:[(0,G.jsx)(p,{className:`size-3 animate-spin`}),` Waiting for authorization. This may complete automatically on this computer.`]})]})]}),(0,G.jsxs)(`div`,{className:`rounded-md border p-3 space-y-2`,children:[(0,G.jsx)(`p`,{className:`text-[11px] font-medium`,children:`Device code`}),(0,G.jsx)(_,{size:`sm`,className:`w-full cursor-pointer gap-1.5`,onClick:f,disabled:N,children:d?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(p,{className:`size-4 animate-spin`}),` Waiting for authorization...`]}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(r,{className:`size-4`}),` Sign in with device code`]})}),m&&(0,G.jsxs)(`div`,{className:`rounded-md border border-primary/40 bg-primary/10 p-2.5 space-y-1.5`,children:[(0,G.jsx)(`p`,{className:`text-[11px]`,children:`Enter this code to authorize:`}),(0,G.jsx)(`div`,{className:`font-mono text-lg tracking-widest`,children:m.userCode}),(0,G.jsxs)(`a`,{href:m.verificationUrl,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1 text-primary hover:underline text-[11px]`,children:[(0,G.jsx)(l,{className:`size-3`}),` `,m.verificationUrl]})]})]}),!M&&(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`div`,{className:`flex-1 border-t`}),(0,G.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`or paste an API key`}),(0,G.jsx)(`div`,{className:`flex-1 border-t`})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(D,{htmlFor:`codex-api-key`,className:`text-xs`,children:`OpenAI API key`}),(0,G.jsx)(T,{id:`codex-api-key`,type:`password`,placeholder:`sk-...`,value:a,onChange:e=>o(e.target.value),className:`text-xs font-mono`})]})]})]}),E&&(0,G.jsx)(`p`,{role:`status`,className:`text-xs`,children:`Starting login...`}),h&&(0,G.jsx)(`div`,{role:`alert`,className:`text-[11px] p-2 rounded bg-error/10 text-error`,children:h}),(0,G.jsxs)(y,{children:[(0,G.jsx)(_,{size:`sm`,variant:`outline`,className:`text-xs cursor-pointer`,onClick:()=>t(!1),children:`Cancel`}),!M&&(0,G.jsxs)(_,{size:`sm`,className:`text-xs cursor-pointer gap-1.5`,onClick:u,disabled:!a.trim()||N,children:[c?(0,G.jsx)(p,{className:`size-3.5 animate-spin`}):(0,G.jsx)(s,{className:`size-3.5`}),`Add key`]})]})]})})}function ve({account:e,onClose:t,onDone:n}){let r=ge(()=>{n(),t()});return(0,G.jsx)(_e,{open:!0,onOpenChange:e=>{e||(r.cancelLogin(),t())},reloginLabel:e.label,label:r.label,onLabelChange:r.setLabel,apiKey:``,onApiKeyChange:()=>{},adding:!1,onAddApiKey:()=>{},deviceWaiting:r.deviceWaiting,onStartDevice:()=>void r.startDevice(e.id),device:r.device,browser:r.browser,onStartBrowser:()=>void r.startBrowser(e.id),loginStarting:r.loginStarting,callbackUrl:r.callbackUrl,onCallbackUrlChange:r.setCallbackUrl,submittingCallback:r.submittingCallback,onSubmitCallback:()=>void r.submitCallback(),error:r.err})}function ye(e){let t=e=>Math.round((e??0)*100)>=100;return t(e.session?.utilization)||t(e.weekly?.utilization)}function be(e){return ye(e)&&(e.resetCredits?.available??0)>0}var xe={reset:e=>`${e}: limits reset to 0%. The weekly reset date now counts from your next use.`,nothingToReset:e=>`${e}: nothing needed resetting, so the reset was kept.`,noCredit:e=>`${e} has no free reset left.`,alreadyRedeemed:e=>`${e}: that reset had already been used.`};function Se(e){return e?new Date(e).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):null}function Ce({account:e,usage:t,onDone:n}){let r=g(),[i,a]=(0,$.useState)(!1),[o,s]=(0,$.useState)(!1);if(!be(t))return null;let l=t.resetCredits;async function u(){s(!0);try{let t=await h.post(`/api/codex-accounts/${e.id}/reset-credit`);n(xe[t.outcome]?.(e.label)??`${e.label}: ${t.outcome}`)}catch(e){n(e.message||`Could not use the reset`)}finally{s(!1),a(!1)}}let d=Se(t.weekly?.resetsAt),f=Se(l.nextExpiresAt),m=(0,G.jsxs)(`div`,{className:`space-y-3`,"data-testid":`codex-reset-credit-confirm`,children:[(0,G.jsxs)(`p`,{className:`text-sm`,children:[`Use 1 of `,(0,G.jsx)(`span`,{className:`font-medium`,children:e.label}),`'s `,l.available,` free reset`,l.available===1?``:`s`,`?`]}),(0,G.jsxs)(`ul`,{className:`text-xs text-text-secondary space-y-1.5 list-disc pl-4`,children:[(0,G.jsxs)(`li`,{children:[l.title??`Full reset`,`: the 5-hour and weekly usage go back to 0% now.`]}),(0,G.jsxs)(`li`,{children:[`The weekly reset date moves: the next one is about 7 days after you continue using Codex`,d?`, not ${d} as now`:``,`. You do not also get that one.`]}),f&&(0,G.jsxs)(`li`,{children:[`This spends the reset that expires first (`,f,`).`]})]}),(0,G.jsxs)(`div`,{className:`flex flex-col-reverse md:flex-row gap-2 md:justify-end pt-1`,children:[(0,G.jsx)(_,{variant:`outline`,onClick:()=>a(!1),disabled:o,className:`min-h-11`,children:`Keep it`}),(0,G.jsxs)(_,{onClick:()=>void u(),disabled:o,className:`min-h-11 gap-1.5`,children:[o?(0,G.jsx)(p,{className:`size-4 animate-spin`}):(0,G.jsx)(c,{className:`size-4`}),`Use reset`]})]})]});return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(_,{size:`sm`,variant:`outline`,className:`min-h-11 md:min-h-0 md:h-7 gap-1 px-2 text-[11px] cursor-pointer border-primary/40 text-primary`,onClick:()=>a(!0),disabled:o,children:[(0,G.jsx)(c,{className:`size-3.5`}),` Use reset`]}),i&&(r?(0,G.jsx)(w,{open:!0,onClose:()=>{o||a(!1)},children:(0,G.jsxs)(`div`,{className:`px-4 pb-4`,children:[(0,G.jsx)(`h2`,{className:`text-base font-semibold mb-3`,children:`Use a free reset`}),m]})}):(0,G.jsx)(C,{open:!0,onOpenChange:e=>{!e&&!o&&a(!1)},children:(0,G.jsxs)(b,{className:`sm:max-w-sm`,children:[(0,G.jsx)(v,{children:(0,G.jsx)(x,{className:`text-sm`,children:`Use a free reset`})}),m]})}))]})}export{J as _,ge as a,W as b,se as c,ne as d,Q as f,X as g,Y as h,pe as i,oe as l,ee as m,ve as n,fe as o,Z as p,_e as r,ce as s,Ce as t,ie as u,q as v,B as x,K as y};
1
+ import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import{Dn as r,Jr as i,Mr as a,V as o,Zt as s,ar as c,ct as l,ir as u,lt as d,st as f,un as p}from"./icons-CO_II6D-.js";import{a as m,r as h}from"./api-client-F5Zi1sR0.js";import{n as g}from"./use-is-mobile-CkO33jqU.js";import{t as _}from"./button-CsmGH5xa.js";import{a as v,i as y,n as b,o as x,r as S,t as C}from"./dialog-z8PLkL8n.js";import{t as w}from"./mobile-bottom-sheet-CLic9ovp.js";import{t as T}from"./input-CP31LZnN.js";import{Ct as E,Nt as D,dr as O,fr as k,pr as A}from"./index-D41mthBS.js";import{c as j,h as M,i as N,l as P,s as F,t as I,u as L}from"./api-settings-BeINN5Dy.js";function R(e){return e>=90?`text-error`:e>=70?`text-warning`:`text-success`}function z(e){return e>=90?`bg-error`:e>=70?`bg-warning`:`bg-success`}function B(e){if(!e)return null;let t=null;if(e.resetsInMinutes!=null)t=e.resetsInMinutes;else if(e.resetsInHours!=null)t=Math.round(e.resetsInHours*60);else if(e.resetsAt){let n=new Date(e.resetsAt).getTime()-Date.now();t=n>0?Math.ceil(n/6e4):0}if(t==null)return null;if(t<=0)return`now`;let n=Math.floor(t/1440),r=Math.floor(t%1440/60),i=t%60;return n>0?i>0?`${n}d ${r}h ${i}m`:r>0?`${n}d ${r}h`:`${n}d`:r>0?i>0?`${r}h ${i}m`:`${r}h`:`${i}m`}function V(e){if(!e)return null;let t=new Date(e).getTime();return Number.isFinite(t)?new Date(t).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):null}function H(e){let t=e-Date.now();if(t<=0)return`expired`;let n=Math.ceil(t/6e4),r=Math.floor(n/60),i=Math.floor(r/24);return i>0?`${i}d ${r%24}h`:r>0?`${r}h ${n%60}m`:`${n}m`}function U(e){if(!e)return{label:`unknown`,tip:`No account info available`,color:`text-text-subtle`};if(!e.expiresAt)return{label:`key`,tip:`API key (no expiry)`,color:`text-text-subtle`};if(e.reauthRequired)return{label:`sign in again`,tip:`Anthropic rejected this account's refresh token. Sign in again to restore it.`,color:`text-error`};let t=e.expiresAt*1e3<Date.now();return t&&e.hasRefreshToken?{label:`expired`,tip:`Token expired but has refresh token — will auto-renew`,color:`text-warning`}:t?{label:`expired`,tip:`Token expired, no refresh token`,color:`text-error`}:e.hasRefreshToken?{label:`long-lived`,tip:`OAuth token with refresh — long-lived`,color:`text-success`}:{label:`temp`,tip:`Temporary token without refresh — will expire`,color:`text-warning`}}function W(e){if(!e)return null;let t=Math.round((Date.now()-e)/1e3);if(t<5)return`just now`;if(t<60)return`${t}s ago`;let n=Math.floor(t/60);if(n<60)return`${n}m ago`;let r=Math.floor(n/60),i=n%60;return r<24?i>0?`${r}h ${i}m ago`:`${r}h ago`:`${Math.floor(r/24)}d ago`}var G=n();function K({label:e,pct:t,reset:n,resetsAt:r}){let i=V(r);return(0,G.jsxs)(`div`,{className:`space-y-1`,"data-testid":`account-usage-bar`,children:[(0,G.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,G.jsx)(`span`,{className:`text-xs font-medium text-text-primary`,children:e}),n&&(0,G.jsxs)(O,{children:[(0,G.jsx)(A,{asChild:!0,children:(0,G.jsxs)(`span`,{className:`text-[10px] text-text-subtle cursor-default`,children:[`↻ `,n]})}),(0,G.jsx)(k,{side:`top`,children:i?`Resets ${i}`:`Resets in`})]})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`div`,{className:`flex-1 h-2 rounded-full bg-border overflow-hidden`,children:t!=null&&(0,G.jsx)(`div`,{className:`h-full rounded-full transition-all ${z(t)}`,style:{width:`${Math.min(t,100)}%`}})}),(0,G.jsx)(`span`,{className:`text-xs font-medium tabular-nums w-10 text-right ${t==null?`text-text-subtle`:R(t)}`,children:t==null?`—`:`${t}%`})]})]})}function q({label:e,bucket:t}){return t?(0,G.jsx)(K,{label:e,pct:Math.round(t.utilization*100),reset:B(t),resetsAt:t.resetsAt}):null}function J({hint:e,className:t,children:n,onClick:r}){return(0,G.jsxs)(O,{children:[(0,G.jsx)(A,{asChild:!0,children:(0,G.jsx)(`button`,{type:`button`,onClick:r,className:[r?`relative cursor-pointer rounded px-1 -mx-1 underline decoration-dotted underline-offset-2 hover:bg-error/10 after:absolute after:-inset-x-2 after:-inset-y-3 after:content-['']`:`cursor-help`,`text-left`,t].filter(Boolean).join(` `),children:n})}),(0,G.jsx)(k,{side:`top`,className:`max-w-[260px] text-xs leading-relaxed`,children:e})]})}function Y({description:e,onRefresh:t,refreshing:n,disabled:r,actions:i}){return(0,G.jsxs)(`section`,{className:`space-y-2`,children:[(0,G.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,G.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e}),(0,G.jsx)(_,{variant:`ghost`,size:`icon`,className:`size-8 shrink-0 cursor-pointer`,onClick:t,disabled:r||n,title:`Refresh`,"aria-label":`Refresh accounts`,children:(0,G.jsx)(u,{className:`size-4 ${n?`animate-spin`:``}`})})]}),(0,G.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:i})]})}function X({message:e,onDismiss:t}){return e?(0,G.jsxs)(`div`,{className:`flex items-start gap-2 text-xs p-2 rounded bg-muted`,role:`status`,children:[(0,G.jsx)(`span`,{className:`flex-1`,children:e}),(0,G.jsx)(`button`,{onClick:t,className:`shrink-0 text-muted-foreground hover:text-foreground cursor-pointer`,"aria-label":`Dismiss message`,children:(0,G.jsx)(i,{className:`size-3.5`})})]}):null}function Z({children:e}){return(0,G.jsx)(`div`,{className:`flex gap-2 overflow-x-auto pb-1 -mx-1 px-1 snap-x snap-mandatory scrollbar-thin`,children:e})}function ee({active:e,flash:t,dense:n,children:r,...i}){return(0,G.jsx)(`div`,{...i,className:[`rounded-md border transition-colors duration-500`,n?`p-2.5 space-y-1.5`:`p-3 space-y-2`,t?`bg-primary/10 border-primary/40`:``,e?`border-primary/30 bg-primary/5`:`border-border/50`,i.className??``].filter(Boolean).join(` `),children:r})}function Q({buckets:e}){return e?.length?(0,G.jsx)(G.Fragment,{children:e.map(e=>(0,G.jsx)(q,{label:`Weekly (${e.label})`,bucket:e},e.label))}):null}function te(e){return new Date(e).toLocaleDateString(void 0,{day:`numeric`,month:`short`})}function ne({credits:e}){if(!e)return null;let t=e.available,n=t===0?`No free resets`:`${t} free reset${t===1?``:`s`}`,r=t===0?`Codex has no free rate-limit resets left for this account.`:`Codex has granted this account ${t} free rate-limit reset${t===1?``:`s`}${e.title?` (${e.title})`:``}.${e.nextExpiresAt?` The next one expires on ${new Date(e.nextExpiresAt).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})}.`:``} A "Use reset" button appears here once a limit is reached; a reset moves the weekly reset date, so spending one earlier wastes it.`;return(0,G.jsxs)(J,{className:`inline-flex items-center gap-1 ${t>0?`text-primary`:``}`,hint:r,children:[(0,G.jsx)(c,{className:`size-3 shrink-0`,"aria-hidden":!0}),n,t>0&&e.nextExpiresAt&&(0,G.jsxs)(`span`,{className:`text-text-subtle`,children:[`· until `,te(e.nextExpiresAt)]})]})}var re={readOnly:`min-w-[220px]`,withActions:`min-w-[300px]`};function ie({entry:e,isActive:t,accountInfo:n,onToggle:r,toggling:i,onDelete:c,onExport:l,onViewProfile:p,flash:m,onSelect:h,unselectableReason:g,selecting:_,planLabel:v,dailyGuard:y,onDailyGuardToggle:b,dailyGuardToggling:x,reauthHint:S,onReauth:C,resetCredits:w,resetCreditAction:T,layout:D=`list`}){let{usage:j}=e,M=j.session||j.weekly||j.weeklyOpus||j.weeklySonnet||j.weeklyScoped?.length,N=n?.status??e.accountStatus,P=!!(n&&!n.hasRefreshToken&&n.expiresAt&&n.expiresAt<Math.floor(Date.now()/1e3)),F=U(n),I=!!n?.reauthRequired||!!S,L=n?.grantExpiresAt?n.grantExpiresAt*1e3:null,R=!!L&&L-Date.now()<5*864e5,z=!!n&&(F.label===`temp`||F.label===`unknown`||F.label===`expired`&&!P&&!I),B=L?new Date(L).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):null,V=!!(r||c||l||p),K=P?`Token expired — sign in again`:I?`Sign in again to use this account`:g??null,Y=D===`list`?``:D===`grid`?`flex flex-col justify-evenly overflow-hidden min-h-0`:`shrink-0 snap-start ${V?re.withActions:re.readOnly}`;return(0,G.jsxs)(ee,{active:t,flash:m,dense:D!==`list`,className:[Y,P||I?`opacity-50`:``].filter(Boolean).join(` `)||void 0,"data-testid":`account-card`,"data-account-id":e.accountId,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`span`,{className:`text-sm font-medium truncate flex-1 min-w-0`,children:e.accountLabel??e.accountId.slice(0,8)}),t&&(0,G.jsx)(J,{className:`text-[10px] text-primary shrink-0 font-medium`,hint:`The next turn will run on this account.`,children:`Active`}),h&&!t&&(0,G.jsxs)(O,{children:[(0,G.jsx)(A,{asChild:!0,children:(0,G.jsx)(`button`,{type:`button`,onClick:()=>h(e.accountId),disabled:_,className:[`shrink-0 rounded px-1.5 py-0.5 text-[10px] font-medium transition-colors cursor-pointer disabled:cursor-wait`,K?`text-text-subtle hover:text-error hover:bg-error/10`:`text-text-secondary hover:text-foreground hover:bg-surface-elevated`].join(` `),children:_?`Switching…`:`Use`})}),(0,G.jsx)(k,{side:`top`,children:K??`Use this account for this chat`})]}),P&&(0,G.jsx)(J,{className:`text-[10px] text-error shrink-0 font-medium`,hint:`This token has expired and carries no refresh token, so nothing can renew it. Sign in again to replace it.`,onClick:C?()=>C(e.accountId):void 0,children:`Expired`}),I&&!P&&(0,G.jsx)(J,{className:`text-[10px] text-error shrink-0 font-medium`,hint:S??`Anthropic rejected this account's refresh token, so no turn can run on it. Signing in again is the only thing that restores it.`,onClick:C?()=>C(e.accountId):void 0,children:`Sign in again`}),!e.isOAuth&&!P&&(0,G.jsx)(J,{className:`text-[10px] text-text-subtle shrink-0`,hint:`A static API key rather than a sign-in: nothing to expire and nothing to renew.`,children:`API key`}),v&&(0,G.jsx)(J,{className:`text-[10px] uppercase tracking-wide text-text-subtle shrink-0`,hint:`The subscription this account is on. It decides which quota windows the account has — some plans have a weekly limit and no shorter one.`,children:v}),(0,G.jsxs)(`div`,{className:`flex items-center gap-0.5 shrink-0`,children:[!P&&p&&n?.profileData&&(0,G.jsxs)(O,{children:[(0,G.jsx)(A,{asChild:!0,children:(0,G.jsx)(`button`,{className:`p-2 rounded cursor-pointer text-text-subtle hover:text-foreground hover:bg-surface-elevated transition-colors`,onClick:()=>p(n.profileData,e.accountId),"aria-label":`View profile`,children:(0,G.jsx)(d,{className:`size-4`})})}),(0,G.jsx)(k,{side:`top`,children:`View profile`})]}),!P&&l&&e.isOAuth&&(0,G.jsxs)(O,{children:[(0,G.jsx)(A,{asChild:!0,children:(0,G.jsx)(`button`,{className:`p-2 rounded cursor-pointer text-text-subtle hover:text-primary hover:bg-surface-elevated transition-colors`,onClick:()=>l(e.accountId),"aria-label":`Export this account`,children:(0,G.jsx)(f,{className:`size-4`})})}),(0,G.jsx)(k,{side:`top`,children:`Export this account`})]}),!P&&r&&(0,G.jsx)(E,{checked:N!==`disabled`,onCheckedChange:()=>r(e.accountId,N),disabled:i||N===`cooldown`,"aria-label":N===`disabled`?`Enable account`:`Disable account`,className:`cursor-pointer relative before:absolute before:content-[''] before:-inset-y-3 before:-inset-x-0.5`}),c&&(0,G.jsxs)(O,{children:[(0,G.jsx)(A,{asChild:!0,children:(0,G.jsx)(`button`,{className:`p-2 rounded cursor-pointer text-text-subtle hover:text-error hover:bg-surface-elevated transition-colors`,onClick:()=>c(e.accountId,e.accountLabel??e.accountId.slice(0,8)),"aria-label":`Remove account`,children:(0,G.jsx)(a,{className:`size-4`})})}),(0,G.jsx)(k,{side:`top`,children:`Remove account`})]})]})]}),M?(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(q,{label:`5-Hour Session`,bucket:j.session}),(0,G.jsx)(q,{label:`Weekly`,bucket:j.weekly}),(0,G.jsx)(q,{label:`Weekly (Opus)`,bucket:j.weeklyOpus}),(0,G.jsx)(q,{label:`Weekly (Sonnet)`,bucket:j.weeklySonnet}),(0,G.jsx)(Q,{buckets:j.weeklyScoped})]}):(0,G.jsx)(`p`,{className:`text-xs text-text-subtle`,children:e.isOAuth?`No usage data yet`:`Usage tracking not available for API keys`}),y&&(0,G.jsxs)(`div`,{className:`flex min-h-12 items-center justify-between gap-3 rounded-md border px-2.5 py-1.5 ${y.enabled&&y.state.blocked?`border-error/40 bg-error/5`:`border-border/50 bg-surface/40`}`,children:[(0,G.jsxs)(`div`,{className:`min-w-0 space-y-0.5`,children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-1.5 text-xs font-medium ${y.enabled&&y.state.blocked?`text-error`:`text-text-secondary`}`,children:[(0,G.jsx)(`span`,{children:`Daily guard`}),(0,G.jsxs)(O,{children:[(0,G.jsx)(A,{asChild:!0,children:(0,G.jsx)(`button`,{type:`button`,"aria-label":`About Daily guard`,className:`text-text-subtle hover:text-text-primary cursor-help`,children:(0,G.jsx)(o,{className:`size-3.5`})})}),(0,G.jsx)(k,{side:`top`,className:`max-w-64 text-xs leading-relaxed`,children:`Spreads the weekly quota across five weekdays, adding 20% per weekday. Weekend slots keep the previous cap; unused allowance carries forward. Daily slots start at the reset time and use UTC weekdays.`})]})]}),(0,G.jsx)(`p`,{className:`text-[10px] tabular-nums ${y.enabled&&y.state.blocked?`text-error`:`text-text-subtle`}`,children:y.enabled&&y.state.blocked?`${Math.round(y.state.used*100)}% used / ${Math.round(y.state.cap*100)}% daily cap. New turns paused.`:`Weekday ${y.state.day}/5, ${Math.round(y.state.cap*100)}% daily cap`})]}),b&&(0,G.jsx)(E,{checked:y.enabled,onCheckedChange:b,disabled:x,"aria-label":y.enabled?`Disable Daily guard`:`Enable Daily guard`,className:`cursor-pointer shrink-0`})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2 text-[10px] text-text-subtle flex-wrap`,children:[(0,G.jsx)(ne,{credits:w}),T,j.lastFetchedAt&&(0,G.jsxs)(J,{className:`inline-flex items-center gap-1`,hint:`Usage last read from Anthropic on ${new Date(j.lastFetchedAt).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`})}. The bars above are only as current as this.`,children:[(0,G.jsx)(u,{className:`size-3 shrink-0`,"aria-hidden":!0}),W(new Date(j.lastFetchedAt).getTime())]}),L&&!I&&(0,G.jsxs)(J,{className:[`inline-flex items-center gap-1`,R?`text-warning`:``].filter(Boolean).join(` `),hint:`Sign-in stops working on ${B}. Anthropic ends every sign-in on a fixed schedule from the day it was made, whether or not the account gets used — refreshing does not extend it. After that the account fails until you sign in again.`,children:[(0,G.jsx)(s,{className:`size-3 shrink-0`,"aria-hidden":!0}),`sign-in `,H(L)]}),z&&(0,G.jsxs)(J,{className:F.color,hint:F.tip,children:[`© `,F.label]})]})]})}var $=e(t(),1);function ae(e){let t=e.usage;return[t.session?.utilization,t.weekly?.utilization,t.weeklyOpus?.utilization,t.weeklySonnet?.utilization,...(t.weeklyScoped??[]).map(e=>`${e.label}:${e.utilization}`)].join(`|`)}function oe(e=!0){let[t,n]=(0,$.useState)([]),[r,i]=(0,$.useState)([]),[a,o]=(0,$.useState)(null),[s,c]=(0,$.useState)(!0),[l,u]=(0,$.useState)(!1),[d,f]=(0,$.useState)(new Set),[p,m]=(0,$.useState)(null),h=(0,$.useRef)([]),g=(0,$.useRef)(void 0),_=(0,$.useCallback)(async()=>{let e=h.current.length>0;e?u(!0):c(!0);let[t,r,a]=await Promise.allSettled([P(),F(),j()]);if(t.status===`fulfilled`){let r=t.value;if(e){let e=new Map(h.current.map(e=>[e.accountId,ae(e)])),t=new Set(r.filter(t=>e.get(t.accountId)!==ae(t)).map(e=>e.accountId));t.size>0&&(f(t),clearTimeout(g.current),g.current=setTimeout(()=>f(new Set),1500))}h.current=r,n(r)}r.status===`fulfilled`&&i(r.value),a.status===`fulfilled`&&o(a.value?.id??null),c(!1),u(!1)},[]),v=(0,$.useCallback)(async(e,t)=>{m(e);let n=null;try{await M(e,{status:t===`disabled`?`active`:`disabled`})}catch(e){n=e.message}return m(null),await _(),n},[_]);return(0,$.useEffect)(()=>(e&&_(),()=>clearTimeout(g.current)),[e,_]),{usages:t,accounts:r,activeAccountId:a,initialLoading:s,refreshing:l,flashIds:d,reload:_,toggle:v,togglingId:p}}function se({open:e,onOpenChange:t,onSuccess:n,signInAgainFor:r}){let[i,a]=(0,$.useState)(``),[o,s]=(0,$.useState)(``),[c,l]=(0,$.useState)(!1),[u,d]=(0,$.useState)(null),[f,m]=(0,$.useState)(null),[h,g]=(0,$.useState)(``),[w,E]=(0,$.useState)(!1),[O,k]=(0,$.useState)(`idle`);function A(){m(null),g(``),k(`idle`),d(null)}function j(){t(!1),A(),a(``),s(``),d(null)}async function M(){E(!0),d(null);try{let{url:e,state:t}=await L();m(t),k(`waiting`),window.open(e,`_blank`)}catch(e){d(e.message)}E(!1)}async function P(){if(!(!h.trim()||!f)){E(!0),d(null);try{let e=h.trim();e.includes(`#`)&&(e=e.split(`#`)[0]??e);let t=await N(e,f);j(),n(t?.status===`disabled`?`Signed in. This account is still disabled — enable it to use it.`:`Account connected via OAuth!`)}catch(e){d(e.message)}E(!1)}}async function F(){if(i.trim()){l(!0),d(null);try{let e=await I({apiKey:i.trim(),label:o.trim()||void 0});j(),n(e?.status===`disabled`?`Token updated. This account is still disabled — enable it to use it.`:`Account added!`)}catch(e){d(e.message)}l(!1)}}let R=i.trim()?i.trim().startsWith(`sk-ant-oat`)?`OAuth token (Claude Max/Pro)`:i.trim().startsWith(`sk-ant-api`)?`API key`:`Unknown format`:``;return(0,G.jsx)(C,{open:e,onOpenChange:e=>{e||j()},children:(0,G.jsxs)(b,{className:`sm:max-w-md`,children:[(0,G.jsxs)(v,{children:[(0,G.jsx)(x,{className:`text-sm`,children:r?`Sign in again — ${r}`:`Add Claude Account`}),(0,G.jsx)(S,{className:`text-xs leading-relaxed`,children:r?`Log in with the same Claude account. PPM matches it by email and renews the existing card instead of adding a new one.`:`Connect via OAuth (recommended) or paste a token manually.`})]}),(0,G.jsxs)(`div`,{className:`space-y-3`,children:[(0,G.jsxs)(`div`,{className:`rounded-md border p-3 space-y-2`,children:[(0,G.jsx)(`p`,{className:`text-[11px] font-medium`,children:`Recommended: Login with Claude`}),O===`idle`?(0,G.jsx)(_,{size:`sm`,className:`w-full h-8 text-xs`,onClick:M,disabled:w,children:w?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(p,{className:`size-3 animate-spin mr-1`}),` Opening...`]}):`Login with Claude`}):(0,G.jsxs)(`div`,{className:`space-y-2`,children:[(0,G.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Authorize in the opened tab, then paste the code:`}),(0,G.jsx)(T,{placeholder:`Paste code here...`,value:h,onChange:e=>g(e.target.value),className:`text-xs h-8 font-mono`,autoFocus:!0}),(0,G.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,G.jsx)(_,{size:`sm`,className:`flex-1 h-7 text-xs`,onClick:P,disabled:!h.trim()||w,children:w?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(p,{className:`size-3 animate-spin mr-1`}),` Connecting...`]}):`Connect`}),(0,G.jsx)(_,{size:`sm`,variant:`ghost`,className:`h-7 text-xs`,onClick:A,children:`Cancel`})]})]})]}),(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`div`,{className:`flex-1 border-t`}),(0,G.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`or paste token`}),(0,G.jsx)(`div`,{className:`flex-1 border-t`})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(D,{htmlFor:`add-token`,className:`text-xs`,children:`Token`}),(0,G.jsx)(T,{id:`add-token`,type:`password`,placeholder:`sk-ant-...`,value:i,onChange:e=>a(e.target.value),className:`text-xs h-8 font-mono`}),R&&(0,G.jsxs)(`p`,{className:`text-[10px] text-muted-foreground`,children:[`Detected: `,R]})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(D,{htmlFor:`add-label`,className:`text-xs`,children:`Label (optional)`}),(0,G.jsx)(T,{id:`add-label`,placeholder:`e.g. Personal, Work`,value:o,onChange:e=>s(e.target.value),className:`text-xs h-8`})]})]}),u&&(0,G.jsx)(`div`,{className:`text-[11px] p-2 rounded bg-error/10 text-error`,children:u}),(0,G.jsxs)(y,{children:[(0,G.jsx)(_,{size:`sm`,variant:`outline`,className:`text-xs h-7`,onClick:j,children:`Cancel`}),(0,G.jsx)(_,{size:`sm`,className:`text-xs h-7`,onClick:F,disabled:!i.trim()||c,children:c?`Adding...`:`Add Token`})]})]})})}function ce(e){return e?.trim()?{free:`ChatGPT Free`,go:`ChatGPT Go`,plus:`ChatGPT Plus`,pro:`ChatGPT Pro`,team:`ChatGPT Team`,business:`ChatGPT Business`,self_serve_business_prolite:`ChatGPT Business`,enterprise:`ChatGPT Enterprise`,edu:`ChatGPT Edu`}[e.trim().toLowerCase()]??e:null}var le=1440*60*1e3,ue=7,de=5;function fe(e,t=Date.now()){if(!e||e.windowHours!==168)return null;let n=new Date(e.resetsAt).getTime();if(!Number.isFinite(t)||!Number.isFinite(n)||n<=t)return null;let r=n-ue*le;if(t<r)return null;let i=Math.min(ue-1,Math.floor((t-r)/le)),a=0;for(let e=0;e<=i;e++){let t=new Date(r+e*le).getUTCDay();t!==0&&t!==6&&a++}let o=a/de;return{day:a,cap:o,used:e.utilization,blocked:e.utilization>=o}}var pe=`Codex rejected this account's login (revoked or expired), so no turn can run on it and it is skipped. The usage shown is the last reading. Click to sign in again — the account keeps its settings and chats.`,me=2e3,he=21e4;function ge(e){let[t,n]=(0,$.useState)([]),[r,i]=(0,$.useState)(`round-robin`),[a,o]=(0,$.useState)({}),[s,c]=(0,$.useState)(!1),[l,u]=(0,$.useState)(new Set),[d,f]=(0,$.useState)(``),[p,g]=(0,$.useState)(``),[_,v]=(0,$.useState)(!1),[y,b]=(0,$.useState)(null),[x,S]=(0,$.useState)(null),[C,w]=(0,$.useState)(!1),[T,E]=(0,$.useState)(null),[D,O]=(0,$.useState)(!1),[k,A]=(0,$.useState)(``),[j,M]=(0,$.useState)(!1),[N,P]=(0,$.useState)(``),[F,I]=(0,$.useState)(!1),[L,R]=(0,$.useState)(!1),[z,B]=(0,$.useState)(null),V=(0,$.useRef)(null),H=(0,$.useRef)(null),U=(0,$.useRef)(0),W=(0,$.useRef)(!1),G=(0,$.useRef)(!1),K=(0,$.useRef)(!1),q=(0,$.useRef)(e);q.current=e;let J=(0,$.useCallback)(async()=>{c(!0);try{let e=await h.get(`/api/codex-accounts`);n(e.accounts),i(e.strategy),h.get(`/api/codex-accounts/usage`).then(o).catch(()=>{})}finally{c(!1)}},[]);(0,$.useEffect)(()=>{J()},[J]);let Y=async()=>{if(!(!d.trim()||G.current||W.current||H.current)){G.current=!0,v(!0),b(null);try{await h.post(`/api/codex-accounts/api-key`,{apiKey:d.trim(),label:p.trim()||void 0}),f(``),g(``),e(),await J()}catch(e){b(e.message)}finally{G.current=!1,v(!1)}}},X=(0,$.useCallback)(()=>{U.current+=1,W.current=!1,K.current=!1,V.current?.(),V.current=null;let e=H.current;H.current=null,e&&h.del(`/api/codex-accounts/${e.method}-login/${e.id}`).catch(()=>{})},[]),Z=(0,$.useCallback)(()=>{X(),S(null),w(!1),E(null),O(!1),A(``),M(!1)},[X]),ee=(0,$.useCallback)((e,t)=>{let n=Date.now()+(t===`browser`?61e4:he),r=!1,i;V.current=()=>{r=!0,clearTimeout(i)};let a=async()=>{if(r)return;let o=null;try{o=await h.get(`/api/codex-accounts/${t}-login/${e}/status`)}catch{}if(!r){if(o?.state===`done`){Z(),g(``),q.current(),await J();return}if(o?.state===`error`||Date.now()>n){Z(),b(o?.state===`error`?o.error:`${t===`browser`?`Browser`:`Device`} login timed out.`);return}i=setTimeout(a,me)}};a()},[Z,J]);(0,$.useEffect)(()=>X,[X]);let Q=async(e,t)=>{if(W.current||H.current||G.current)return;W.current=!0;let n=++U.current;O(!0),b(null);try{let r=await h.post(`/api/codex-accounts/${e}-login`,{label:p.trim()||void 0,...t?{accountId:t}:{}});if(n!==U.current){h.del(`/api/codex-accounts/${e}-login/${r.id}`).catch(()=>{});return}H.current={id:r.id,method:e},e===`device`?(S(r),w(!0)):E(r),ee(r.id,e)}catch(e){n===U.current&&b(e.message)}finally{n===U.current&&(W.current=!1,O(!1))}};return{accounts:t,strategy:r,usages:a,loading:s,apiKey:d,setApiKey:f,label:p,setLabel:g,adding:_,err:y,setErr:b,device:x,deviceWaiting:C,backupPassword:N,setBackupPassword:P,exporting:F,importing:L,msg:z,setMsg:B,toggling:l,load:J,addApiKey:Y,startDevice:e=>Q(`device`,e),startBrowser:e=>Q(`browser`,e),browser:T,loginStarting:D,callbackUrl:k,setCallbackUrl:A,submittingCallback:j,submitCallback:async()=>{let e=H.current;if(e?.method!==`browser`||!k.trim()||K.current)return;let t=U.current;K.current=!0,M(!0),b(null);let n=k.trim();A(``);try{await h.post(`/api/codex-accounts/browser-login/${e.id}/callback`,{callbackUrl:n})}catch(e){t===U.current&&b(e.message)}finally{t===U.current&&(K.current=!1,M(!1))}},cancelLogin:Z,remove:async e=>{await h.del(`/api/codex-accounts/${e}`),await J()},toggle:async(e,t)=>{let n=t===`disabled`?`active`:`disabled`;u(t=>new Set(t).add(e)),b(null);try{await h.patch(`/api/codex-accounts/${e}`,{status:n}),await J()}catch(e){b(e.message||`Could not change the account`)}finally{u(t=>{let n=new Set(t);return n.delete(e),n})}},toggleDailyGuard:async(e,t)=>{u(t=>new Set(t).add(e)),b(null);try{await h.patch(`/api/codex-accounts/${e}`,{dailyGuardEnabled:!t}),await J()}catch(e){b(e.message||`Could not change Daily guard`)}finally{u(t=>{let n=new Set(t);return n.delete(e),n})}},changeStrategy:async e=>{i(e);try{await h.put(`/api/codex-accounts/strategy`,{strategy:e})}catch{}},doExport:async()=>{if(!N.trim()){b(`Set a backup password first.`);return}I(!0),b(null),B(null);try{let t={"Content-Type":`application/json`},n=m();n&&(t.Authorization=`Bearer ${n}`);let r=await fetch(`/api/codex-accounts/export`,{method:`POST`,headers:t,body:JSON.stringify({password:N})});if(!r.ok){let e=await r.json().catch(()=>({}));throw Error(e.error??`Export failed: ${r.status}`)}let i=await r.text(),a=new Blob([i],{type:`application/json`}),o=document.createElement(`a`);o.href=URL.createObjectURL(a),o.download=`ppm-codex-accounts-backup.json`,o.click(),URL.revokeObjectURL(o.href),B(`Backup downloaded.`),e()}catch(e){b(e.message)}finally{I(!1)}},doImport:async t=>{if(!N.trim()){b(`Enter the backup password first.`);return}R(!0),b(null),B(null);try{let n=await t.text(),r=await h.post(`/api/codex-accounts/import`,{data:n,password:N});B(`Imported ${r.imported}${r.skipped?`, skipped ${r.skipped}`:``}.`),e(),await J()}catch(e){b(e.message)}finally{R(!1)}}}}function _e({open:e,onOpenChange:t,label:n,onLabelChange:i,apiKey:a,onApiKeyChange:o,adding:c,onAddApiKey:u,deviceWaiting:d,onStartDevice:f,device:m,error:h,browser:g,onStartBrowser:w,loginStarting:E,callbackUrl:O,onCallbackUrlChange:k,submittingCallback:A,onSubmitCallback:j,reloginLabel:M}){let N=E||d||!!g||c;return(0,G.jsx)(C,{open:e,onOpenChange:t,children:(0,G.jsxs)(b,{className:`sm:max-w-md max-h-[90dvh] overflow-y-auto`,children:[(0,G.jsxs)(v,{children:[(0,G.jsx)(x,{className:`text-sm`,children:M?`Sign in again — ${M}`:`Add Codex Account`}),(0,G.jsx)(S,{className:`text-xs leading-relaxed`,children:M?`Sign in with ChatGPT to renew this account. It keeps its name, its settings and the chats bound to it.`:`Choose browser login, a device code, or an OpenAI API key.`})]}),(0,G.jsxs)(`div`,{className:`space-y-3`,children:[!M&&(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(D,{htmlFor:`codex-label`,className:`text-xs`,children:`Label (optional)`}),(0,G.jsx)(T,{id:`codex-label`,placeholder:`e.g. Personal, Work`,value:n,onChange:e=>i(e.target.value),disabled:N,className:`text-xs`})]}),(0,G.jsxs)(`div`,{className:`rounded-md border p-3 space-y-2`,children:[(0,G.jsx)(`p`,{className:`text-[11px] font-medium`,children:`Browser login`}),(0,G.jsxs)(_,{size:`sm`,className:`w-full cursor-pointer gap-1.5`,onClick:w,disabled:N,children:[(0,G.jsx)(l,{className:`size-4`}),` Sign in with browser`]}),g&&(0,G.jsxs)(`div`,{className:`space-y-2 text-xs`,children:[(0,G.jsxs)(`a`,{href:g.authUrl,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1 text-primary hover:underline`,children:[(0,G.jsx)(l,{className:`size-3`}),` Open ChatGPT sign-in`]}),(0,G.jsx)(`p`,{children:`Sign in, then copy the full localhost callback URL from the address bar and paste it below. On a phone, copy it even if the page fails to load.`}),(0,G.jsx)(D,{htmlFor:`codex-callback-url`,children:`Callback URL`}),(0,G.jsx)(T,{id:`codex-callback-url`,type:`password`,autoComplete:`off`,spellCheck:!1,placeholder:`http://localhost:.../auth/callback?...`,value:O,onChange:e=>k(e.target.value),disabled:A}),(0,G.jsxs)(_,{size:`sm`,onClick:j,disabled:!O.trim()||A,children:[A&&(0,G.jsx)(p,{className:`size-3 animate-spin`}),` Submit callback URL`]}),(0,G.jsxs)(`p`,{role:`status`,className:`flex items-center gap-1.5 text-muted-foreground`,children:[(0,G.jsx)(p,{className:`size-3 animate-spin`}),` Waiting for authorization. This may complete automatically on this computer.`]})]})]}),(0,G.jsxs)(`div`,{className:`rounded-md border p-3 space-y-2`,children:[(0,G.jsx)(`p`,{className:`text-[11px] font-medium`,children:`Device code`}),(0,G.jsx)(_,{size:`sm`,className:`w-full cursor-pointer gap-1.5`,onClick:f,disabled:N,children:d?(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(p,{className:`size-4 animate-spin`}),` Waiting for authorization...`]}):(0,G.jsxs)(G.Fragment,{children:[(0,G.jsx)(r,{className:`size-4`}),` Sign in with device code`]})}),m&&(0,G.jsxs)(`div`,{className:`rounded-md border border-primary/40 bg-primary/10 p-2.5 space-y-1.5`,children:[(0,G.jsx)(`p`,{className:`text-[11px]`,children:`Enter this code to authorize:`}),(0,G.jsx)(`div`,{className:`font-mono text-lg tracking-widest`,children:m.userCode}),(0,G.jsxs)(`a`,{href:m.verificationUrl,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1 text-primary hover:underline text-[11px]`,children:[(0,G.jsx)(l,{className:`size-3`}),` `,m.verificationUrl]})]})]}),!M&&(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,G.jsx)(`div`,{className:`flex-1 border-t`}),(0,G.jsx)(`span`,{className:`text-[10px] text-muted-foreground`,children:`or paste an API key`}),(0,G.jsx)(`div`,{className:`flex-1 border-t`})]}),(0,G.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,G.jsx)(D,{htmlFor:`codex-api-key`,className:`text-xs`,children:`OpenAI API key`}),(0,G.jsx)(T,{id:`codex-api-key`,type:`password`,placeholder:`sk-...`,value:a,onChange:e=>o(e.target.value),className:`text-xs font-mono`})]})]})]}),E&&(0,G.jsx)(`p`,{role:`status`,className:`text-xs`,children:`Starting login...`}),h&&(0,G.jsx)(`div`,{role:`alert`,className:`text-[11px] p-2 rounded bg-error/10 text-error`,children:h}),(0,G.jsxs)(y,{children:[(0,G.jsx)(_,{size:`sm`,variant:`outline`,className:`text-xs cursor-pointer`,onClick:()=>t(!1),children:`Cancel`}),!M&&(0,G.jsxs)(_,{size:`sm`,className:`text-xs cursor-pointer gap-1.5`,onClick:u,disabled:!a.trim()||N,children:[c?(0,G.jsx)(p,{className:`size-3.5 animate-spin`}):(0,G.jsx)(s,{className:`size-3.5`}),`Add key`]})]})]})})}function ve({account:e,onClose:t,onDone:n}){let r=ge(()=>{n(),t()});return(0,G.jsx)(_e,{open:!0,onOpenChange:e=>{e||(r.cancelLogin(),t())},reloginLabel:e.label,label:r.label,onLabelChange:r.setLabel,apiKey:``,onApiKeyChange:()=>{},adding:!1,onAddApiKey:()=>{},deviceWaiting:r.deviceWaiting,onStartDevice:()=>void r.startDevice(e.id),device:r.device,browser:r.browser,onStartBrowser:()=>void r.startBrowser(e.id),loginStarting:r.loginStarting,callbackUrl:r.callbackUrl,onCallbackUrlChange:r.setCallbackUrl,submittingCallback:r.submittingCallback,onSubmitCallback:()=>void r.submitCallback(),error:r.err})}function ye(e){let t=e=>Math.round((e??0)*100)>=100;return t(e.session?.utilization)||t(e.weekly?.utilization)}function be(e){return ye(e)&&(e.resetCredits?.available??0)>0}var xe={reset:e=>`${e}: limits reset to 0%. The weekly reset date now counts from your next use.`,nothingToReset:e=>`${e}: nothing needed resetting, so the reset was kept.`,noCredit:e=>`${e} has no free reset left.`,alreadyRedeemed:e=>`${e}: that reset had already been used.`};function Se(e){return e?new Date(e).toLocaleString(void 0,{dateStyle:`medium`,timeStyle:`short`}):null}function Ce({account:e,usage:t,onDone:n}){let r=g(),[i,a]=(0,$.useState)(!1),[o,s]=(0,$.useState)(!1);if(!be(t))return null;let l=t.resetCredits;async function u(){s(!0);try{let t=await h.post(`/api/codex-accounts/${e.id}/reset-credit`);n(xe[t.outcome]?.(e.label)??`${e.label}: ${t.outcome}`)}catch(e){n(e.message||`Could not use the reset`)}finally{s(!1),a(!1)}}let d=Se(t.weekly?.resetsAt),f=Se(l.nextExpiresAt),m=(0,G.jsxs)(`div`,{className:`space-y-3`,"data-testid":`codex-reset-credit-confirm`,children:[(0,G.jsxs)(`p`,{className:`text-sm`,children:[`Use 1 of `,(0,G.jsx)(`span`,{className:`font-medium`,children:e.label}),`'s `,l.available,` free reset`,l.available===1?``:`s`,`?`]}),(0,G.jsxs)(`ul`,{className:`text-xs text-text-secondary space-y-1.5 list-disc pl-4`,children:[(0,G.jsxs)(`li`,{children:[l.title??`Full reset`,`: the 5-hour and weekly usage go back to 0% now.`]}),(0,G.jsxs)(`li`,{children:[`The weekly reset date moves: the next one is about 7 days after you continue using Codex`,d?`, not ${d} as now`:``,`. You do not also get that one.`]}),f&&(0,G.jsxs)(`li`,{children:[`This spends the reset that expires first (`,f,`).`]})]}),(0,G.jsxs)(`div`,{className:`flex flex-col-reverse md:flex-row gap-2 md:justify-end pt-1`,children:[(0,G.jsx)(_,{variant:`outline`,onClick:()=>a(!1),disabled:o,className:`min-h-11`,children:`Keep it`}),(0,G.jsxs)(_,{onClick:()=>void u(),disabled:o,className:`min-h-11 gap-1.5`,children:[o?(0,G.jsx)(p,{className:`size-4 animate-spin`}):(0,G.jsx)(c,{className:`size-4`}),`Use reset`]})]})]});return(0,G.jsxs)(G.Fragment,{children:[(0,G.jsxs)(_,{size:`sm`,variant:`outline`,className:`min-h-11 md:min-h-0 md:h-7 gap-1 px-2 text-[11px] cursor-pointer border-primary/40 text-primary`,onClick:()=>a(!0),disabled:o,children:[(0,G.jsx)(c,{className:`size-3.5`}),` Use reset`]}),i&&(r?(0,G.jsx)(w,{open:!0,onClose:()=>{o||a(!1)},children:(0,G.jsxs)(`div`,{className:`px-4 pb-4`,children:[(0,G.jsx)(`h2`,{className:`text-base font-semibold mb-3`,children:`Use a free reset`}),m]})}):(0,G.jsx)(C,{open:!0,onOpenChange:e=>{!e&&!o&&a(!1)},children:(0,G.jsxs)(b,{className:`sm:max-w-sm`,children:[(0,G.jsx)(v,{children:(0,G.jsx)(x,{className:`text-sm`,children:`Use a free reset`})}),m]})}))]})}export{J as _,ge as a,W as b,se as c,ne as d,Q as f,X as g,Y as h,pe as i,oe as l,ee as m,ve as n,fe as o,Z as p,_e as r,ce as s,Ce as t,ie as u,q as v,B as x,K as y};
@@ -1,4 +1,4 @@
1
- import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-P9Ym7hCv.js";import{un as r}from"./icons-CO_II6D-.js";import{o as i,r as a}from"./api-client-F5Zi1sR0.js";import{t as o}from"./settings-store-3jIBB8gx.js";import{n as s}from"./use-is-mobile-CkO33jqU.js";import{A as c,gn as l,k as u,zn as d}from"./index-DQCw6d-2.js";import{t as f}from"./use-monaco-theme-DL2dIG5L.js";import"./editor-font-BWW2uS94.js";import{n as p,r as m}from"./monaco-dotenv-language-CQpgAhmX.js";var h=e(t(),1),g=n();function _(e){return{js:`javascript`,jsx:`javascript`,ts:`typescript`,tsx:`typescript`,py:`python`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,mdx:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,bash:`shell`,go:`go`,rs:`rust`,java:`java`,rb:`ruby`,php:`php`,swift:`swift`,sql:`sql`,xml:`xml`,toml:`toml`}[e.split(`.`).pop()?.toLowerCase()??``]??(p(e)?`dotenv`:`plaintext`)}function v(e){let t=e.split(`
1
+ import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-P9Ym7hCv.js";import{un as r}from"./icons-CO_II6D-.js";import{o as i,r as a}from"./api-client-F5Zi1sR0.js";import{t as o}from"./settings-store-3jIBB8gx.js";import{n as s}from"./use-is-mobile-CkO33jqU.js";import{A as c,gn as l,k as u,zn as d}from"./index-D41mthBS.js";import{t as f}from"./use-monaco-theme-08OELBic.js";import"./editor-font-BWW2uS94.js";import{n as p,r as m}from"./monaco-dotenv-language-CQpgAhmX.js";var h=e(t(),1),g=n();function _(e){return{js:`javascript`,jsx:`javascript`,ts:`typescript`,tsx:`typescript`,py:`python`,html:`html`,css:`css`,scss:`scss`,json:`json`,md:`markdown`,mdx:`markdown`,yaml:`yaml`,yml:`yaml`,sh:`shell`,bash:`shell`,go:`go`,rs:`rust`,java:`java`,rb:`ruby`,php:`php`,swift:`swift`,sql:`sql`,xml:`xml`,toml:`toml`}[e.split(`.`).pop()?.toLowerCase()??``]??(p(e)?`dotenv`:`plaintext`)}function v(e){let t=e.split(`
2
2
  `),n=[],r=0,i=0;for(;r<t.length;){let e=t[r];if(e.startsWith(`<<<<<<<`)){let a=r,o=e.substring(7).trim(),s=[];for(r++;r<t.length&&!t[r].startsWith(`=======`);)s.push(t[r]),r++;if(r>=t.length)break;let c=r,l=[];for(r++;r<t.length&&!t[r].startsWith(`>>>>>>>`);)l.push(t[r]),r++;if(r>=t.length)break;let u=t[r].substring(7).trim();n.push({id:i++,startLine:a+1,separatorLine:c+1,endLine:r+1,currentContent:s.join(`
3
3
  `),incomingContent:l.join(`
4
4
  `),currentLabel:o,incomingLabel:u})}r++}return n}function y({metadata:e}){let t=e?.filePath,n=e?.projectName,[p,y]=(0,h.useState)(null),[x,S]=(0,h.useState)(!0),[C,w]=(0,h.useState)(null),[T,E]=(0,h.useState)(0),D=(0,h.useRef)(null),O=(0,h.useRef)(null),k=(0,h.useRef)([]),A=(0,h.useRef)(null),{wordWrap:j,mobileWordWrap:M}=o(l(e=>({wordWrap:e.wordWrap,mobileWordWrap:e.mobileWordWrap}))),N=s()?M:j,P=f(),F=(0,h.useRef)(null),[I,L]=(0,h.useState)();(0,h.useEffect)(()=>{let e=F.current;if(!e)return;let t=new ResizeObserver(([e])=>{e&&L(Math.floor(e.contentRect.height))});return t.observe(e),()=>t.disconnect()},[]),(0,h.useEffect)(()=>d(F.current,()=>D.current?.layout()),[x,C]),(0,h.useEffect)(()=>{!t||!n||(S(!0),a.get(`${i(n)}/files/read?path=${encodeURIComponent(t)}`).then(e=>{y(e.content),S(!1)}).catch(e=>{w(e.message||`Failed to load file`),S(!1)}))},[t,n]);let R=(0,h.useCallback)(()=>{let e=D.current,t=O.current;if(!e||!t)return;let n=v(e.getModel()?.getValue()||``);E(n.length);for(let t of k.current)e.removeContentWidget(t);if(k.current=[],A.current&&A.current.clear(),n.length===0)return;let r=[];for(let e of n)r.push({range:new t.Range(e.startLine,1,e.startLine,1),options:{isWholeLine:!0,className:`conflict-marker-line`,glyphMarginClassName:`conflict-glyph-current`}}),r.push({range:new t.Range(e.separatorLine,1,e.separatorLine,1),options:{isWholeLine:!0,className:`conflict-marker-line`}}),r.push({range:new t.Range(e.endLine,1,e.endLine,1),options:{isWholeLine:!0,className:`conflict-marker-line`,glyphMarginClassName:`conflict-glyph-incoming`}}),e.separatorLine-e.startLine>1&&r.push({range:new t.Range(e.startLine+1,1,e.separatorLine-1,1),options:{isWholeLine:!0,className:`conflict-current-content`}}),e.endLine-e.separatorLine>1&&r.push({range:new t.Range(e.separatorLine+1,1,e.endLine-1,1),options:{isWholeLine:!0,className:`conflict-incoming-content`}});A.current=e.createDecorationsCollection(r);for(let r of n){let n=`conflict-widget-${r.id}`,i=document.createElement(`div`);i.className=`conflict-actions`,i.innerHTML=`<span class="conflict-label">Current Change (${b(r.currentLabel||`HEAD`)})</span><button class="conflict-btn conflict-btn-current" data-action="current">Accept Current</button><button class="conflict-btn conflict-btn-incoming" data-action="incoming">Accept Incoming</button><button class="conflict-btn conflict-btn-both" data-action="both">Accept Both</button>`,i.addEventListener(`click`,e=>{let t=e.target.closest(`[data-action]`);if(!t)return;let n=t.getAttribute(`data-action`);z(r.id,n)});let a={getId:()=>n,getDomNode:()=>i,getPosition:()=>({position:{lineNumber:r.startLine,column:1},preference:[t.editor.ContentWidgetPositionPreference.ABOVE]})};e.addContentWidget(a),k.current.push(a)}},[]),z=(0,h.useCallback)((e,t)=>{let n=D.current,r=O.current;if(!n||!r)return;let i=n.getModel();if(!i)return;let a=v(i.getValue()).find(t=>t.id===e);if(!a)return;let o;switch(t){case`current`:o=a.currentContent;break;case`incoming`:o=a.incomingContent;break;case`both`:o=a.currentContent+`
@@ -1,2 +1,2 @@
1
- import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-P9Ym7hCv.js";import{a as r,d as i}from"./icons-CO_II6D-.js";import{hn as a}from"./index-DQCw6d-2.js";import{n as o,t as s}from"./csv-parser-CoLcPhFa.js";import{i as c,n as l,r as u,t as d}from"./lib-g-qFlogj.js";var f=e(t(),1),p=n();function m({content:e,onContentChange:t,wordWrap:n}){let m=(0,f.useMemo)(()=>s(e),[e]),[g,_]=(0,f.useState)(()=>m.rows),[v,y]=(0,f.useState)([]),b=(0,f.useRef)(null),x=(0,f.useRef)(!1);(0,f.useEffect)(()=>{if(x.current){x.current=!1;return}_(m.rows)},[m.rows]);let S=m.headers,C=(0,f.useCallback)((e,n,r)=>{_(i=>{let a=i.map((t,n)=>n===e?[...t]:t);return a[e][n]=r,x.current=!0,t(o(S,a)),a})},[S,t]),w=l({data:g,columns:(0,f.useMemo)(()=>S.map((e,t)=>({id:`col-${t}`,header:e||`Column ${t+1}`,accessorFn:e=>e[t]??``,cell:({row:e,getValue:r})=>(0,p.jsx)(h,{value:r(),onSave:n=>C(e.index,t,n),wordWrap:n}),size:150,minSize:80})),[S,C,n]),state:{sorting:v},onSortingChange:y,getCoreRowModel:u(),getSortedRowModel:c(),enableColumnResizing:!0,columnResizeMode:`onChange`}),{rows:T}=w.getRowModel(),E=a({count:T.length,getScrollElement:()=>b.current,estimateSize:()=>32,overscan:20});return S.length===0?(0,p.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground text-sm`,children:`Empty CSV file`}):(0,p.jsx)(`div`,{ref:b,className:`flex-1 overflow-auto`,children:(0,p.jsxs)(`table`,{className:`w-full text-xs font-mono border-collapse`,children:[(0,p.jsx)(`thead`,{className:`sticky top-0 bg-background z-10 border-b border-border block`,children:w.getHeaderGroups().map(e=>(0,p.jsx)(`tr`,{className:`flex w-full`,children:e.headers.map(e=>(0,p.jsxs)(`th`,{className:`relative text-left px-2 py-1.5 font-medium text-muted-foreground select-none cursor-pointer hover:bg-muted/50 border-r border-border last:border-r-0`,style:{width:e.getSize(),minWidth:e.getSize()},onClick:e.column.getToggleSortingHandler(),children:[(0,p.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,p.jsx)(`span`,{className:`truncate`,children:d(e.column.columnDef.header,e.getContext())}),e.column.getIsSorted()===`asc`&&(0,p.jsx)(i,{className:`size-3 shrink-0`}),e.column.getIsSorted()===`desc`&&(0,p.jsx)(r,{className:`size-3 shrink-0`})]}),(0,p.jsx)(`div`,{onMouseDown:e.getResizeHandler(),onTouchStart:e.getResizeHandler(),onClick:e=>e.stopPropagation(),className:`absolute right-0 top-0 h-full w-1 cursor-col-resize hover:bg-primary/50 active:bg-primary`})]},e.id))},e.id))}),(0,p.jsx)(`tbody`,{style:{height:E.getTotalSize(),position:`relative`,display:`block`},children:E.getVirtualItems().map(e=>{let t=T[e.index];return(0,p.jsx)(`tr`,{"data-index":e.index,ref:e=>E.measureElement(e),style:{position:`absolute`,top:0,left:0,width:`100%`,transform:`translateY(${e.start}px)`,display:`flex`},children:t.getVisibleCells().map(e=>(0,p.jsx)(`td`,{className:`px-2 py-1 border-b border-border/50 border-r border-r-border/30 last:border-r-0 ${n?`whitespace-pre-wrap break-words`:`truncate`}`,style:{width:e.column.getSize(),minWidth:e.column.getSize()},children:d(e.column.columnDef.cell,e.getContext())},e.id))},t.id)})})]})})}function h({value:e,onSave:t,wordWrap:n}){let[r,i]=(0,f.useState)(!1),[a,o]=(0,f.useState)(e),s=(0,f.useRef)(null),c=(0,f.useCallback)(e=>{e&&(e.style.height=`auto`,e.style.height=`${e.scrollHeight}px`)},[]);return(0,f.useEffect)(()=>{r&&s.current&&(s.current.focus(),c(s.current))},[r,c]),r?(0,p.jsx)(`textarea`,{ref:s,className:`w-full bg-transparent outline-none border border-primary/50 rounded text-xs font-mono resize-none p-0.5`,style:{minHeight:a.includes(`
1
+ import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-P9Ym7hCv.js";import{a as r,d as i}from"./icons-CO_II6D-.js";import{hn as a}from"./index-D41mthBS.js";import{n as o,t as s}from"./csv-parser-CoLcPhFa.js";import{i as c,n as l,r as u,t as d}from"./lib-g-qFlogj.js";var f=e(t(),1),p=n();function m({content:e,onContentChange:t,wordWrap:n}){let m=(0,f.useMemo)(()=>s(e),[e]),[g,_]=(0,f.useState)(()=>m.rows),[v,y]=(0,f.useState)([]),b=(0,f.useRef)(null),x=(0,f.useRef)(!1);(0,f.useEffect)(()=>{if(x.current){x.current=!1;return}_(m.rows)},[m.rows]);let S=m.headers,C=(0,f.useCallback)((e,n,r)=>{_(i=>{let a=i.map((t,n)=>n===e?[...t]:t);return a[e][n]=r,x.current=!0,t(o(S,a)),a})},[S,t]),w=l({data:g,columns:(0,f.useMemo)(()=>S.map((e,t)=>({id:`col-${t}`,header:e||`Column ${t+1}`,accessorFn:e=>e[t]??``,cell:({row:e,getValue:r})=>(0,p.jsx)(h,{value:r(),onSave:n=>C(e.index,t,n),wordWrap:n}),size:150,minSize:80})),[S,C,n]),state:{sorting:v},onSortingChange:y,getCoreRowModel:u(),getSortedRowModel:c(),enableColumnResizing:!0,columnResizeMode:`onChange`}),{rows:T}=w.getRowModel(),E=a({count:T.length,getScrollElement:()=>b.current,estimateSize:()=>32,overscan:20});return S.length===0?(0,p.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground text-sm`,children:`Empty CSV file`}):(0,p.jsx)(`div`,{ref:b,className:`flex-1 overflow-auto`,children:(0,p.jsxs)(`table`,{className:`w-full text-xs font-mono border-collapse`,children:[(0,p.jsx)(`thead`,{className:`sticky top-0 bg-background z-10 border-b border-border block`,children:w.getHeaderGroups().map(e=>(0,p.jsx)(`tr`,{className:`flex w-full`,children:e.headers.map(e=>(0,p.jsxs)(`th`,{className:`relative text-left px-2 py-1.5 font-medium text-muted-foreground select-none cursor-pointer hover:bg-muted/50 border-r border-border last:border-r-0`,style:{width:e.getSize(),minWidth:e.getSize()},onClick:e.column.getToggleSortingHandler(),children:[(0,p.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,p.jsx)(`span`,{className:`truncate`,children:d(e.column.columnDef.header,e.getContext())}),e.column.getIsSorted()===`asc`&&(0,p.jsx)(i,{className:`size-3 shrink-0`}),e.column.getIsSorted()===`desc`&&(0,p.jsx)(r,{className:`size-3 shrink-0`})]}),(0,p.jsx)(`div`,{onMouseDown:e.getResizeHandler(),onTouchStart:e.getResizeHandler(),onClick:e=>e.stopPropagation(),className:`absolute right-0 top-0 h-full w-1 cursor-col-resize hover:bg-primary/50 active:bg-primary`})]},e.id))},e.id))}),(0,p.jsx)(`tbody`,{style:{height:E.getTotalSize(),position:`relative`,display:`block`},children:E.getVirtualItems().map(e=>{let t=T[e.index];return(0,p.jsx)(`tr`,{"data-index":e.index,ref:e=>E.measureElement(e),style:{position:`absolute`,top:0,left:0,width:`100%`,transform:`translateY(${e.start}px)`,display:`flex`},children:t.getVisibleCells().map(e=>(0,p.jsx)(`td`,{className:`px-2 py-1 border-b border-border/50 border-r border-r-border/30 last:border-r-0 ${n?`whitespace-pre-wrap break-words`:`truncate`}`,style:{width:e.column.getSize(),minWidth:e.column.getSize()},children:d(e.column.columnDef.cell,e.getContext())},e.id))},t.id)})})]})})}function h({value:e,onSave:t,wordWrap:n}){let[r,i]=(0,f.useState)(!1),[a,o]=(0,f.useState)(e),s=(0,f.useRef)(null),c=(0,f.useCallback)(e=>{e&&(e.style.height=`auto`,e.style.height=`${e.scrollHeight}px`)},[]);return(0,f.useEffect)(()=>{r&&s.current&&(s.current.focus(),c(s.current))},[r,c]),r?(0,p.jsx)(`textarea`,{ref:s,className:`w-full bg-transparent outline-none border border-primary/50 rounded text-xs font-mono resize-none p-0.5`,style:{minHeight:a.includes(`
2
2
  `)?48:20},rows:1,value:a,onChange:e=>{o(e.target.value),c(e.target)},onBlur:()=>{i(!1),a!==e&&t(a)},onKeyDown:n=>{n.key===`Enter`&&!n.shiftKey?(n.preventDefault(),i(!1),a!==e&&t(a)):n.key===`Escape`&&(i(!1),o(e))}}):(0,p.jsx)(`span`,{className:`block cursor-text ${n?`whitespace-pre-wrap break-words`:`truncate`}`,onClick:()=>{o(e),i(!0)},children:e||`\xA0`})}export{m as CsvPreview};
@@ -1 +1 @@
1
- import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-P9Ym7hCv.js";import{Lt as r,_r as i,at as a,gr as o,ir as s,un as c}from"./icons-CO_II6D-.js";import{O as l,r as u}from"./api-client-F5Zi1sR0.js";import"./settings-store-3jIBB8gx.js";import"./panel-store-DrSH3Nhp.js";import"./window-store-B4cbZ5rr.js";import"./project-store-CCimwgGF.js";import{t as d}from"./tab-store-CUPgQIQz.js";import{wt as f}from"./index-DQCw6d-2.js";import"./data-grid-types-DatI2Wee.js";import"./marked.esm-BHcxKPtl.js";import"./use-monaco-theme-DL2dIG5L.js";import{n as p,t as m}from"./glide-data-grid-O6MO5dKU.js";import{t as h}from"./sql-query-editor-ALQ5_X0j.js";var g=e(t(),1);function _(e,t,n,r){return`ppm-db-${e}-${n}.${t}-p${r}`}function v(e,t,n,r){try{let i=sessionStorage.getItem(_(e,t,n,r));return i?JSON.parse(i):null}catch{return null}}function y(e,t,n,r,i,a){try{sessionStorage.setItem(_(e,t,n,r),JSON.stringify({data:i,cols:a}))}catch{}}function b(e){let t=`/api/db/connections/${e}`,[n,r]=(0,g.useState)(null),[i,a]=(0,g.useState)(`public`),[o,s]=(0,g.useState)(null),[c,d]=(0,g.useState)([]),[f,p]=(0,g.useState)(!1),[m,h]=(0,g.useState)(null),[_,b]=(0,g.useState)(1),[x,S]=(0,g.useState)(null),[C,w]=(0,g.useState)(null),[T,E]=(0,g.useState)(!1),[D,O]=(0,g.useState)(null),[k,A]=(0,g.useState)(`ASC`),j=(0,g.useRef)(null),M=(0,g.useCallback)(async(r,a,o,c,l)=>{let f=r??n,m=a??i;if(!f)return;j.current=null,p(!0);let g=c===void 0?D:c,v=l??k;try{let n=g?`&orderBy=${encodeURIComponent(g)}&orderDir=${v}`:``,[r,i]=await Promise.all([u.get(`${t}/data?table=${encodeURIComponent(f)}&schema=${m}&page=${o??_}&limit=100${n}`),u.get(`${t}/schema?table=${encodeURIComponent(f)}&schema=${m}`)]);s(r),d(i),y(e,f,m,o??_,r,i)}catch(e){h(e.message)}finally{p(!1)}},[t,e,n,i,_,D,k]),N=(0,g.useCallback)((t,n=`public`)=>{r(t),a(n),b(1),S(null);let i=v(e,t,n,1);i?(s(i.data),d(i.cols),p(!1),M(t,n,1)):M(t,n,1)},[e,M]),P=(0,g.useCallback)(e=>{b(e),M(void 0,void 0,e)},[M]),F=(0,g.useCallback)(async e=>{j.current={sql:e,mode:`table`},p(!0);try{let n=await u.post(`${t}/query`,{sql:e,source:`filter`});n.changeType===`select`&&s({columns:n.columns,rows:n.rows,total:n.rows.length,page:1,limit:n.rows.length})}catch(e){h(e.message)}finally{p(!1)}},[t]),I=(0,g.useCallback)(async e=>{E(!0),w(null);try{let r=await u.post(`${t}/query`,{sql:e});S(r),r.changeType===`modify`?(j.current=null,M(n??void 0,i)):j.current={sql:e,mode:`query`}}catch(e){w(e.message)}finally{E(!1)}},[t,n,i,M]),L=(0,g.useCallback)((e,t)=>{let n=j.current;if(n?.mode===`table`){F(n.sql);return}M(e,t)},[F,M]),R=(0,g.useCallback)((e,t)=>{let n=t.message;h(n),l.error(`${e} failed`,{description:n})},[]),z=(0,g.useCallback)(async(e,r,a,o)=>{if(!n)return;let s=n,c=i;try{await u.put(`${t}/cell`,{table:s,schema:c,pkColumn:e,pkValue:r,column:a,value:o}),L(s,c)}catch(e){R(`Update cell`,e)}},[t,n,i,L,R]),B=(0,g.useCallback)(async(e,r)=>{if(!n)return;let a=n,o=i;try{await u.del(`${t}/row`,{table:a,schema:o,pkColumn:e,pkValue:r}),L(a,o)}catch(e){R(`Delete row`,e)}},[t,n,i,L,R]),V=(0,g.useCallback)(e=>{let t,n=`ASC`;D===e?k===`ASC`?(t=e,n=`DESC`):(t=null,n=`ASC`):(t=e,n=`ASC`),O(t),A(n),b(1),M(void 0,void 0,1,t,n)},[D,k,M]),H=(0,g.useCallback)(()=>{O(null),A(`ASC`),b(1),M(void 0,void 0,1,null,`ASC`)},[M]),U=(0,g.useCallback)(async(e,r)=>{if(!n)return;let a=n,o=i;try{await u.post(`${t}/rows/delete`,{table:a,schema:o,pkColumn:e,pkValues:r}),L(a,o)}catch(e){R(`Delete rows`,e)}},[t,n,i,L,R]),W=(0,g.useCallback)(async e=>{if(!n)return;let r=n,a=i;try{await u.post(`${t}/row`,{table:r,schema:a,values:e}),L(r,a)}catch(e){throw R(`Insert row`,e),e}},[t,n,i,L,R]),G=(0,g.useCallback)(()=>{let e=j.current;if(e?.mode===`query`){I(e.sql);return}if(e?.mode===`table`){F(e.sql);return}M()},[I,F,M]);return{selectedTable:n,selectedSchema:i,selectTable:N,tableData:o,schema:c,loading:f,error:m,page:_,setPage:P,orderBy:D,orderDir:k,toggleSort:V,clearSort:H,queryResult:x,queryError:C,queryLoading:T,executeQuery:I,updateCell:z,updateCellIn:(0,g.useCallback)(async(e,n,r,i,a,o)=>{try{await u.put(`${t}/cell`,{table:e,schema:n,pkColumn:r,pkValue:i,column:a,value:o}),G()}catch(e){R(`Update cell`,e)}},[t,G,R]),deleteRow:B,bulkDelete:U,insertRow:W,refreshData:M,queryAsTable:F,reload:G}}function x(e,t){let n=e.replace(/--[^\r\n]*/g,` `).replace(/\/\*[\s\S]*?\*\//g,` `).trim().replace(/;\s*$/,``);if(!/^select\s/i.test(n)||/\b(join|union|intersect|except|group\s+by|distinct)\b/i.test(n)||(n.match(/\bfrom\b/gi)??[]).length!==1)return null;let r=/\bfrom\s+(?:"([^"]+)"|(\w+))\s*(?:\.\s*(?:"([^"]+)"|(\w+)))?/i.exec(n);if(!r)return null;let i=r[1]??r[2],a=r[3]??r[4];return a?{schema:i,table:a}:{table:i,schema:t}}var S=n();function C(e){let t={},n=/"(\w+)"\s+ILIKE\s+'%([^']*?)%'/gi,r;for(;(r=n.exec(e))!==null;)t[r[1]]=r[2].replace(/''/g,`'`);return t}function w({metadata:e,tabId:t}){let n=e?.connectionId,l=e?.connectionName,_=e?.tableName,v=e?.schemaName??`public`,y=e?.initialSql,w=e?.currentSql,T=d(e=>e.updateTab),D=(0,g.useRef)(e);D.current=e;let O=(0,g.useCallback)(e=>{t&&T(t,{metadata:{...D.current,currentSql:e}})},[t,T]),k=b(n),{connections:A,updateConnection:j}=f(),M=(0,g.useMemo)(()=>A.find(e=>e.id===n),[A,n]),[N,P]=(0,g.useState)([]),[F,I]=(0,g.useState)(180),L=(0,g.useRef)(null),[R,z]=(0,g.useState)({}),B=(0,g.useMemo)(()=>{if(y&&!k.selectedTable)return y;if(k.selectedTable){let e=`SELECT * FROM "${k.selectedTable}"`,t=Object.entries(R).filter(([,e])=>e.trim()).map(([e,t])=>`"${e}" ILIKE '%${t.replace(/'/g,`''`)}%'`);t.length>0&&(e+=` WHERE ${t.join(` AND `)}`),k.orderBy&&(e+=` ORDER BY "${k.orderBy}" ${k.orderDir}`);let n=(k.page-1)*100;return e+=` LIMIT 100`,n>0&&(e+=` OFFSET ${n}`),e}return`SELECT * FROM `},[y,k.selectedTable,k.orderBy,k.orderDir,k.page,R]),V=(0,g.useCallback)(e=>{z(e)},[]),H=(0,g.useRef)(void 0),U=(0,g.useRef)(!1);(0,g.useEffect)(()=>{if(!k.selectedTable)return;let e=Object.values(R).some(e=>e.trim());if(!(!e&&!U.current))return U.current=e,clearTimeout(H.current),H.current=setTimeout(()=>{e?k.queryAsTable(B):k.refreshData()},500),()=>clearTimeout(H.current)},[R]);let W=(0,g.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=F,r=e=>{let r=e.clientY-t;I(Math.max(80,Math.min(n+r,(L.current?.clientHeight??600)-100)))},i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[F]);(0,g.useEffect)(()=>{u.get(`/api/db/connections/${n}/tables?cached=1`).then(e=>P(e.map(e=>({name:e.name,schema:e.schema})))).catch(()=>{})},[n]);let G=(0,g.useMemo)(()=>{if(N.length!==0)return{tables:N,getColumns:async(e,t)=>await u.get(`/api/db/connections/${n}/schema?table=${encodeURIComponent(e)}${t?`&schema=${encodeURIComponent(t)}`:``}`)}},[n,N]),K=(0,g.useRef)(!1);(0,g.useEffect)(()=>{K.current||(K.current=!0,y?k.executeQuery(y):_&&k.selectTable(_,v))},[_,v,y]);let[q,J]=(0,g.useState)(!!y),[Y,ee]=(0,g.useState)(y??null),te=(0,g.useCallback)(e=>{let t=e.trim();if(k.selectedTable&&RegExp(`^SELECT\\s+\\*\\s+FROM\\s+"?${k.selectedTable.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}"?\\b`,`i`).test(t)){z(C(t)),k.queryAsTable(t);return}J(!0),ee(t),k.executeQuery(e)},[k.executeQuery,k.queryAsTable,k.selectedTable]),ne=(0,g.useCallback)(e=>{J(!1),k.toggleSort(e)},[k.toggleSort]),re=(0,g.useCallback)(()=>{J(!1),k.clearSort()},[k.clearSort]),ie=(0,g.useCallback)(e=>{J(!1),k.setPage(e)},[k.setPage]),X=(0,g.useMemo)(()=>M&&!M.readonly&&Y?x(Y,k.selectedSchema):null,[M,Y,k.selectedSchema]),ae=(0,g.useCallback)((e,t,n,r)=>{X&&k.updateCellIn(X.table,X.schema,e,t,n,r)},[X,k.updateCellIn]),Z=k.queryResult,Q=q&&!!(Z||k.queryError),$=k.selectedTable&&!Q,oe=!($&&k.tableData)&&!Q&&(k.loading||k.queryLoading);return(0,S.jsx)(`div`,{ref:L,className:`flex h-full w-full overflow-hidden`,children:(0,S.jsxs)(`div`,{className:`flex-1 flex flex-col overflow-hidden`,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5 border-b border-border bg-background shrink-0`,children:[(0,S.jsx)(a,{className:`size-3.5 text-muted-foreground`}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground truncate`,children:l??`Database`}),k.selectedTable&&(0,S.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`/ `,k.selectedTable]}),(0,S.jsxs)(`div`,{className:`ml-auto flex items-center gap-1`,children:[k.tableData&&(0,S.jsx)(p,{columns:k.tableData.columns,rows:k.tableData.rows,filename:l?`${l}-${k.selectedTable??`data`}`:k.selectedTable??`data`,exportAllUrl:k.selectedTable?`/api/db/connections/${n}/export?table=${encodeURIComponent(k.selectedTable)}&schema=${k.selectedSchema}`:void 0}),M&&(0,S.jsx)(`button`,{type:`button`,onClick:()=>j(M.id,{readonly:M.readonly?0:1}),className:`flex items-center gap-0.5 px-1 py-0.5 rounded text-[10px] transition-colors ${M.readonly?`text-muted-foreground hover:text-foreground`:`bg-destructive/15 text-destructive`}`,title:M.readonly?`Readonly — click to allow writes`:`WRITE mode — click to enable readonly`,children:M.readonly?(0,S.jsx)(o,{className:`size-3`}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(i,{className:`size-3`}),(0,S.jsx)(`span`,{className:`font-medium`,children:`WRITE`})]})}),(0,S.jsx)(`button`,{type:`button`,onClick:()=>k.reload(),title:`Reload data`,className:`p-1 rounded text-muted-foreground hover:text-foreground transition-colors`,children:(0,S.jsx)(s,{className:`size-3 ${k.loading||k.queryLoading?`animate-spin`:``}`})})]})]}),(0,S.jsx)(`div`,{className:`shrink-0 border-b border-border`,style:{height:F},children:(0,S.jsx)(h,{onExecute:te,loading:k.queryLoading,defaultValue:B,schemaInfo:G,onSqlChange:O,persistedSql:w})}),(0,S.jsx)(`div`,{onMouseDown:W,className:`shrink-0 h-1.5 cursor-row-resize bg-border/50 hover:bg-primary/30 flex items-center justify-center transition-colors`,children:(0,S.jsx)(r,{className:`size-3 text-muted-foreground/50`})}),(0,S.jsxs)(`div`,{className:`flex-1 overflow-hidden`,children:[$&&k.tableData&&(0,S.jsx)(m,{columns:k.tableData.columns,rows:k.tableData.rows,total:k.tableData.total,limit:k.tableData.limit,schema:k.schema,loading:k.loading,page:k.page,onPageChange:ie,onCellUpdate:k.updateCell,onRowDelete:k.deleteRow,orderBy:k.orderBy,orderDir:k.orderDir,onToggleSort:ne,onClearSort:re,onBulkDelete:k.bulkDelete,onInsertRow:k.insertRow,connectionId:n,selectedTable:k.selectedTable,selectedSchema:k.selectedSchema,connectionName:l,columnFilters:R,onColumnFilter:V}),Q&&(0,S.jsx)(E,{result:Z,error:k.queryError,loading:k.queryLoading,schema:k.schema,connectionName:l,onCellUpdate:X?ae:void 0}),oe&&(0,S.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground`,children:(0,S.jsx)(c,{className:`size-4 animate-spin`})})]})]})})}var T=()=>{};function E({result:e,error:t,loading:n,schema:r,connectionName:i,onCellUpdate:a}){let o=(0,g.useMemo)(()=>e?.changeType===`select`&&e.rows.length>0?{columns:e.columns,rows:e.rows,total:e.rows.length,limit:e.rows.length}:null,[e]),s=(0,g.useMemo)(()=>{let t=e?.columns??[],n=new Set((r??[]).map(e=>e.name));return r?.length&&t.every(e=>n.has(e))?r:t.map(e=>({name:e,type:`text`,nullable:!0,pk:!1,defaultValue:null}))},[r,e?.columns]);return(0,S.jsxs)(`div`,{className:`flex flex-col h-full overflow-hidden text-xs`,children:[t&&(0,S.jsx)(`div`,{className:`px-3 py-2 text-destructive bg-destructive/5 shrink-0`,children:t}),e?.changeType===`modify`&&(0,S.jsxs)(`div`,{className:`px-3 py-2 text-success shrink-0`,children:[e.rowsAffected,` row(s) affected`,e.executionTimeMs!=null&&(0,S.jsxs)(`span`,{className:`text-muted-foreground ml-2`,children:[e.executionTimeMs,`ms`]})]}),o&&(0,S.jsxs)(`div`,{className:`flex-1 overflow-hidden`,children:[(0,S.jsx)(m,{columns:o.columns,rows:o.rows,total:o.total,limit:o.limit,schema:s,loading:!!n,page:1,onPageChange:T,onCellUpdate:a??T,readOnly:!a,orderBy:null,orderDir:`ASC`,onToggleSort:T,connectionName:i}),e?.executionTimeMs!=null&&(0,S.jsxs)(`div`,{className:`px-3 py-0.5 border-t border-border text-[10px] text-muted-foreground shrink-0`,children:[e.rows.length,` rows · `,e.executionTimeMs,`ms`]})]}),e?.changeType===`select`&&e.rows.length===0&&(0,S.jsxs)(`div`,{className:`px-3 py-2 text-muted-foreground shrink-0`,children:[`No results`,e.executionTimeMs!=null&&(0,S.jsxs)(`span`,{className:`ml-2 text-muted-foreground/60`,children:[e.executionTimeMs,`ms`]})]}),!e&&!t&&(0,S.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground`,children:n?(0,S.jsx)(c,{className:`size-4 animate-spin`}):`Run a query to see results`})]})}export{w as DatabaseViewer};
1
+ import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-P9Ym7hCv.js";import{Lt as r,_r as i,at as a,gr as o,ir as s,un as c}from"./icons-CO_II6D-.js";import{O as l,r as u}from"./api-client-F5Zi1sR0.js";import"./settings-store-3jIBB8gx.js";import"./panel-store-DrSH3Nhp.js";import"./window-store-B4cbZ5rr.js";import"./project-store-CCimwgGF.js";import{t as d}from"./tab-store-CUPgQIQz.js";import{wt as f}from"./index-D41mthBS.js";import"./data-grid-types-DatI2Wee.js";import"./marked.esm-BHcxKPtl.js";import"./use-monaco-theme-08OELBic.js";import{n as p,t as m}from"./glide-data-grid-BuVHCdOY.js";import{t as h}from"./sql-query-editor-Ci0vTqmC.js";var g=e(t(),1);function _(e,t,n,r){return`ppm-db-${e}-${n}.${t}-p${r}`}function v(e,t,n,r){try{let i=sessionStorage.getItem(_(e,t,n,r));return i?JSON.parse(i):null}catch{return null}}function y(e,t,n,r,i,a){try{sessionStorage.setItem(_(e,t,n,r),JSON.stringify({data:i,cols:a}))}catch{}}function b(e){let t=`/api/db/connections/${e}`,[n,r]=(0,g.useState)(null),[i,a]=(0,g.useState)(`public`),[o,s]=(0,g.useState)(null),[c,d]=(0,g.useState)([]),[f,p]=(0,g.useState)(!1),[m,h]=(0,g.useState)(null),[_,b]=(0,g.useState)(1),[x,S]=(0,g.useState)(null),[C,w]=(0,g.useState)(null),[T,E]=(0,g.useState)(!1),[D,O]=(0,g.useState)(null),[k,A]=(0,g.useState)(`ASC`),j=(0,g.useRef)(null),M=(0,g.useCallback)(async(r,a,o,c,l)=>{let f=r??n,m=a??i;if(!f)return;j.current=null,p(!0);let g=c===void 0?D:c,v=l??k;try{let n=g?`&orderBy=${encodeURIComponent(g)}&orderDir=${v}`:``,[r,i]=await Promise.all([u.get(`${t}/data?table=${encodeURIComponent(f)}&schema=${m}&page=${o??_}&limit=100${n}`),u.get(`${t}/schema?table=${encodeURIComponent(f)}&schema=${m}`)]);s(r),d(i),y(e,f,m,o??_,r,i)}catch(e){h(e.message)}finally{p(!1)}},[t,e,n,i,_,D,k]),N=(0,g.useCallback)((t,n=`public`)=>{r(t),a(n),b(1),S(null);let i=v(e,t,n,1);i?(s(i.data),d(i.cols),p(!1),M(t,n,1)):M(t,n,1)},[e,M]),P=(0,g.useCallback)(e=>{b(e),M(void 0,void 0,e)},[M]),F=(0,g.useCallback)(async e=>{j.current={sql:e,mode:`table`},p(!0);try{let n=await u.post(`${t}/query`,{sql:e,source:`filter`});n.changeType===`select`&&s({columns:n.columns,rows:n.rows,total:n.rows.length,page:1,limit:n.rows.length})}catch(e){h(e.message)}finally{p(!1)}},[t]),I=(0,g.useCallback)(async e=>{E(!0),w(null);try{let r=await u.post(`${t}/query`,{sql:e});S(r),r.changeType===`modify`?(j.current=null,M(n??void 0,i)):j.current={sql:e,mode:`query`}}catch(e){w(e.message)}finally{E(!1)}},[t,n,i,M]),L=(0,g.useCallback)((e,t)=>{let n=j.current;if(n?.mode===`table`){F(n.sql);return}M(e,t)},[F,M]),R=(0,g.useCallback)((e,t)=>{let n=t.message;h(n),l.error(`${e} failed`,{description:n})},[]),z=(0,g.useCallback)(async(e,r,a,o)=>{if(!n)return;let s=n,c=i;try{await u.put(`${t}/cell`,{table:s,schema:c,pkColumn:e,pkValue:r,column:a,value:o}),L(s,c)}catch(e){R(`Update cell`,e)}},[t,n,i,L,R]),B=(0,g.useCallback)(async(e,r)=>{if(!n)return;let a=n,o=i;try{await u.del(`${t}/row`,{table:a,schema:o,pkColumn:e,pkValue:r}),L(a,o)}catch(e){R(`Delete row`,e)}},[t,n,i,L,R]),V=(0,g.useCallback)(e=>{let t,n=`ASC`;D===e?k===`ASC`?(t=e,n=`DESC`):(t=null,n=`ASC`):(t=e,n=`ASC`),O(t),A(n),b(1),M(void 0,void 0,1,t,n)},[D,k,M]),H=(0,g.useCallback)(()=>{O(null),A(`ASC`),b(1),M(void 0,void 0,1,null,`ASC`)},[M]),U=(0,g.useCallback)(async(e,r)=>{if(!n)return;let a=n,o=i;try{await u.post(`${t}/rows/delete`,{table:a,schema:o,pkColumn:e,pkValues:r}),L(a,o)}catch(e){R(`Delete rows`,e)}},[t,n,i,L,R]),W=(0,g.useCallback)(async e=>{if(!n)return;let r=n,a=i;try{await u.post(`${t}/row`,{table:r,schema:a,values:e}),L(r,a)}catch(e){throw R(`Insert row`,e),e}},[t,n,i,L,R]),G=(0,g.useCallback)(()=>{let e=j.current;if(e?.mode===`query`){I(e.sql);return}if(e?.mode===`table`){F(e.sql);return}M()},[I,F,M]);return{selectedTable:n,selectedSchema:i,selectTable:N,tableData:o,schema:c,loading:f,error:m,page:_,setPage:P,orderBy:D,orderDir:k,toggleSort:V,clearSort:H,queryResult:x,queryError:C,queryLoading:T,executeQuery:I,updateCell:z,updateCellIn:(0,g.useCallback)(async(e,n,r,i,a,o)=>{try{await u.put(`${t}/cell`,{table:e,schema:n,pkColumn:r,pkValue:i,column:a,value:o}),G()}catch(e){R(`Update cell`,e)}},[t,G,R]),deleteRow:B,bulkDelete:U,insertRow:W,refreshData:M,queryAsTable:F,reload:G}}function x(e,t){let n=e.replace(/--[^\r\n]*/g,` `).replace(/\/\*[\s\S]*?\*\//g,` `).trim().replace(/;\s*$/,``);if(!/^select\s/i.test(n)||/\b(join|union|intersect|except|group\s+by|distinct)\b/i.test(n)||(n.match(/\bfrom\b/gi)??[]).length!==1)return null;let r=/\bfrom\s+(?:"([^"]+)"|(\w+))\s*(?:\.\s*(?:"([^"]+)"|(\w+)))?/i.exec(n);if(!r)return null;let i=r[1]??r[2],a=r[3]??r[4];return a?{schema:i,table:a}:{table:i,schema:t}}var S=n();function C(e){let t={},n=/"(\w+)"\s+ILIKE\s+'%([^']*?)%'/gi,r;for(;(r=n.exec(e))!==null;)t[r[1]]=r[2].replace(/''/g,`'`);return t}function w({metadata:e,tabId:t}){let n=e?.connectionId,l=e?.connectionName,_=e?.tableName,v=e?.schemaName??`public`,y=e?.initialSql,w=e?.currentSql,T=d(e=>e.updateTab),D=(0,g.useRef)(e);D.current=e;let O=(0,g.useCallback)(e=>{t&&T(t,{metadata:{...D.current,currentSql:e}})},[t,T]),k=b(n),{connections:A,updateConnection:j}=f(),M=(0,g.useMemo)(()=>A.find(e=>e.id===n),[A,n]),[N,P]=(0,g.useState)([]),[F,I]=(0,g.useState)(180),L=(0,g.useRef)(null),[R,z]=(0,g.useState)({}),B=(0,g.useMemo)(()=>{if(y&&!k.selectedTable)return y;if(k.selectedTable){let e=`SELECT * FROM "${k.selectedTable}"`,t=Object.entries(R).filter(([,e])=>e.trim()).map(([e,t])=>`"${e}" ILIKE '%${t.replace(/'/g,`''`)}%'`);t.length>0&&(e+=` WHERE ${t.join(` AND `)}`),k.orderBy&&(e+=` ORDER BY "${k.orderBy}" ${k.orderDir}`);let n=(k.page-1)*100;return e+=` LIMIT 100`,n>0&&(e+=` OFFSET ${n}`),e}return`SELECT * FROM `},[y,k.selectedTable,k.orderBy,k.orderDir,k.page,R]),V=(0,g.useCallback)(e=>{z(e)},[]),H=(0,g.useRef)(void 0),U=(0,g.useRef)(!1);(0,g.useEffect)(()=>{if(!k.selectedTable)return;let e=Object.values(R).some(e=>e.trim());if(!(!e&&!U.current))return U.current=e,clearTimeout(H.current),H.current=setTimeout(()=>{e?k.queryAsTable(B):k.refreshData()},500),()=>clearTimeout(H.current)},[R]);let W=(0,g.useCallback)(e=>{e.preventDefault();let t=e.clientY,n=F,r=e=>{let r=e.clientY-t;I(Math.max(80,Math.min(n+r,(L.current?.clientHeight??600)-100)))},i=()=>{document.removeEventListener(`mousemove`,r),document.removeEventListener(`mouseup`,i)};document.addEventListener(`mousemove`,r),document.addEventListener(`mouseup`,i)},[F]);(0,g.useEffect)(()=>{u.get(`/api/db/connections/${n}/tables?cached=1`).then(e=>P(e.map(e=>({name:e.name,schema:e.schema})))).catch(()=>{})},[n]);let G=(0,g.useMemo)(()=>{if(N.length!==0)return{tables:N,getColumns:async(e,t)=>await u.get(`/api/db/connections/${n}/schema?table=${encodeURIComponent(e)}${t?`&schema=${encodeURIComponent(t)}`:``}`)}},[n,N]),K=(0,g.useRef)(!1);(0,g.useEffect)(()=>{K.current||(K.current=!0,y?k.executeQuery(y):_&&k.selectTable(_,v))},[_,v,y]);let[q,J]=(0,g.useState)(!!y),[Y,ee]=(0,g.useState)(y??null),te=(0,g.useCallback)(e=>{let t=e.trim();if(k.selectedTable&&RegExp(`^SELECT\\s+\\*\\s+FROM\\s+"?${k.selectedTable.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`)}"?\\b`,`i`).test(t)){z(C(t)),k.queryAsTable(t);return}J(!0),ee(t),k.executeQuery(e)},[k.executeQuery,k.queryAsTable,k.selectedTable]),ne=(0,g.useCallback)(e=>{J(!1),k.toggleSort(e)},[k.toggleSort]),re=(0,g.useCallback)(()=>{J(!1),k.clearSort()},[k.clearSort]),ie=(0,g.useCallback)(e=>{J(!1),k.setPage(e)},[k.setPage]),X=(0,g.useMemo)(()=>M&&!M.readonly&&Y?x(Y,k.selectedSchema):null,[M,Y,k.selectedSchema]),ae=(0,g.useCallback)((e,t,n,r)=>{X&&k.updateCellIn(X.table,X.schema,e,t,n,r)},[X,k.updateCellIn]),Z=k.queryResult,Q=q&&!!(Z||k.queryError),$=k.selectedTable&&!Q,oe=!($&&k.tableData)&&!Q&&(k.loading||k.queryLoading);return(0,S.jsx)(`div`,{ref:L,className:`flex h-full w-full overflow-hidden`,children:(0,S.jsxs)(`div`,{className:`flex-1 flex flex-col overflow-hidden`,children:[(0,S.jsxs)(`div`,{className:`flex items-center gap-2 px-3 py-1.5 border-b border-border bg-background shrink-0`,children:[(0,S.jsx)(a,{className:`size-3.5 text-muted-foreground`}),(0,S.jsx)(`span`,{className:`text-xs text-muted-foreground truncate`,children:l??`Database`}),k.selectedTable&&(0,S.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`/ `,k.selectedTable]}),(0,S.jsxs)(`div`,{className:`ml-auto flex items-center gap-1`,children:[k.tableData&&(0,S.jsx)(p,{columns:k.tableData.columns,rows:k.tableData.rows,filename:l?`${l}-${k.selectedTable??`data`}`:k.selectedTable??`data`,exportAllUrl:k.selectedTable?`/api/db/connections/${n}/export?table=${encodeURIComponent(k.selectedTable)}&schema=${k.selectedSchema}`:void 0}),M&&(0,S.jsx)(`button`,{type:`button`,onClick:()=>j(M.id,{readonly:M.readonly?0:1}),className:`flex items-center gap-0.5 px-1 py-0.5 rounded text-[10px] transition-colors ${M.readonly?`text-muted-foreground hover:text-foreground`:`bg-destructive/15 text-destructive`}`,title:M.readonly?`Readonly — click to allow writes`:`WRITE mode — click to enable readonly`,children:M.readonly?(0,S.jsx)(o,{className:`size-3`}):(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(i,{className:`size-3`}),(0,S.jsx)(`span`,{className:`font-medium`,children:`WRITE`})]})}),(0,S.jsx)(`button`,{type:`button`,onClick:()=>k.reload(),title:`Reload data`,className:`p-1 rounded text-muted-foreground hover:text-foreground transition-colors`,children:(0,S.jsx)(s,{className:`size-3 ${k.loading||k.queryLoading?`animate-spin`:``}`})})]})]}),(0,S.jsx)(`div`,{className:`shrink-0 border-b border-border`,style:{height:F},children:(0,S.jsx)(h,{onExecute:te,loading:k.queryLoading,defaultValue:B,schemaInfo:G,onSqlChange:O,persistedSql:w})}),(0,S.jsx)(`div`,{onMouseDown:W,className:`shrink-0 h-1.5 cursor-row-resize bg-border/50 hover:bg-primary/30 flex items-center justify-center transition-colors`,children:(0,S.jsx)(r,{className:`size-3 text-muted-foreground/50`})}),(0,S.jsxs)(`div`,{className:`flex-1 overflow-hidden`,children:[$&&k.tableData&&(0,S.jsx)(m,{columns:k.tableData.columns,rows:k.tableData.rows,total:k.tableData.total,limit:k.tableData.limit,schema:k.schema,loading:k.loading,page:k.page,onPageChange:ie,onCellUpdate:k.updateCell,onRowDelete:k.deleteRow,orderBy:k.orderBy,orderDir:k.orderDir,onToggleSort:ne,onClearSort:re,onBulkDelete:k.bulkDelete,onInsertRow:k.insertRow,connectionId:n,selectedTable:k.selectedTable,selectedSchema:k.selectedSchema,connectionName:l,columnFilters:R,onColumnFilter:V}),Q&&(0,S.jsx)(E,{result:Z,error:k.queryError,loading:k.queryLoading,schema:k.schema,connectionName:l,onCellUpdate:X?ae:void 0}),oe&&(0,S.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground`,children:(0,S.jsx)(c,{className:`size-4 animate-spin`})})]})]})})}var T=()=>{};function E({result:e,error:t,loading:n,schema:r,connectionName:i,onCellUpdate:a}){let o=(0,g.useMemo)(()=>e?.changeType===`select`&&e.rows.length>0?{columns:e.columns,rows:e.rows,total:e.rows.length,limit:e.rows.length}:null,[e]),s=(0,g.useMemo)(()=>{let t=e?.columns??[],n=new Set((r??[]).map(e=>e.name));return r?.length&&t.every(e=>n.has(e))?r:t.map(e=>({name:e,type:`text`,nullable:!0,pk:!1,defaultValue:null}))},[r,e?.columns]);return(0,S.jsxs)(`div`,{className:`flex flex-col h-full overflow-hidden text-xs`,children:[t&&(0,S.jsx)(`div`,{className:`px-3 py-2 text-destructive bg-destructive/5 shrink-0`,children:t}),e?.changeType===`modify`&&(0,S.jsxs)(`div`,{className:`px-3 py-2 text-success shrink-0`,children:[e.rowsAffected,` row(s) affected`,e.executionTimeMs!=null&&(0,S.jsxs)(`span`,{className:`text-muted-foreground ml-2`,children:[e.executionTimeMs,`ms`]})]}),o&&(0,S.jsxs)(`div`,{className:`flex-1 overflow-hidden`,children:[(0,S.jsx)(m,{columns:o.columns,rows:o.rows,total:o.total,limit:o.limit,schema:s,loading:!!n,page:1,onPageChange:T,onCellUpdate:a??T,readOnly:!a,orderBy:null,orderDir:`ASC`,onToggleSort:T,connectionName:i}),e?.executionTimeMs!=null&&(0,S.jsxs)(`div`,{className:`px-3 py-0.5 border-t border-border text-[10px] text-muted-foreground shrink-0`,children:[e.rows.length,` rows · `,e.executionTimeMs,`ms`]})]}),e?.changeType===`select`&&e.rows.length===0&&(0,S.jsxs)(`div`,{className:`px-3 py-2 text-muted-foreground shrink-0`,children:[`No results`,e.executionTimeMs!=null&&(0,S.jsxs)(`span`,{className:`ml-2 text-muted-foreground/60`,children:[e.executionTimeMs,`ms`]})]}),!e&&!t&&(0,S.jsx)(`div`,{className:`flex items-center justify-center h-full text-muted-foreground`,children:n?(0,S.jsx)(c,{className:`size-4 animate-spin`}):`Run a query to see results`})]})}export{w as DatabaseViewer};
@@ -1,5 +1,5 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pptx-export-D378qi81.js","assets/rolldown-runtime-C5c2KzVm.js","assets/preload-helper-BEFjQwLd.js","assets/vendor-ui-P9Ym7hCv.js","assets/vendor-markdown-QKPNiWEd.js","assets/api-client-F5Zi1sR0.js","assets/design-export-client-D9h9wJ3e.js"])))=>i.map(i=>d[i]);
2
- import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-P9Ym7hCv.js";import{$n as r,An as i,En as a,Er as o,Fr as s,Jr as c,Ln as l,Mr as u,Nn as d,Nr as f,O as p,Pn as m,T as h,Ut as g,Z as _,ar as v,bn as y,br as b,ct as x,d as S,dr as C,er as w,et as T,ft as E,gn as D,ir as O,j as k,pt as A,r as j,st as M,un as N,vr as ee,wn as P,yn as te,yr as ne}from"./icons-CO_II6D-.js";import{t as re}from"./chat-tab-IqAY4c7p.js";import{O as F,a as ie,o as I,r as L}from"./api-client-F5Zi1sR0.js";import{t as ae}from"./settings-store-3jIBB8gx.js";import{t as oe}from"./preload-helper-BEFjQwLd.js";import{n as R}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import{p as se,t as ce}from"./panel-store-DrSH3Nhp.js";import"./window-store-B4cbZ5rr.js";import"./project-store-CCimwgGF.js";import"./tab-store-CUPgQIQz.js";import{t as le}from"./format-date-Fd9tpNaw.js";import"./context-menu-CH1mvCwA.js";import"./chat-preparation-cache-DoS7sdal.js";import"./file-store-DCU7_YyB.js";import{n as ue}from"./use-is-mobile-CkO33jqU.js";import{u as de}from"./onboarding-quick-orientation-WLKI95GY.js";import{t as z}from"./button-CsmGH5xa.js";import"./dialog-z8PLkL8n.js";import{t as fe}from"./mobile-bottom-sheet-CLic9ovp.js";import"./use-visual-viewport-C307OVeV.js";import"./fs-api-vF_bQoeL.js";import{o as pe}from"./format-file-meta-B0ZpqzSM.js";import{t as me}from"./input-CP31LZnN.js";import"./ws-auth-J3hw0Mhc.js";import{Cn as he,Nn as ge,On as _e,Sn as ve,_n as ye,an as be,bn as xe,cr as Se,d as Ce,h as we,i as Te,kn as Ee,l as De,lr as Oe,m as ke,mn as Ae,on as je,sn as B,u as Me,un as Ne,ur as Pe,wn as Fe,xn as Ie,yn as Le}from"./index-DQCw6d-2.js";import"./use-websocket-ziY-Gz_B.js";import{a as Re}from"./api-settings-BeINN5Dy.js";import"./tool-cards-_fpYI1hB.js";import"./use-blob-url-B3R1DMZ0.js";import"./libesm-CxeQSM3t.js";import"./onboarding-entry-DD3QSDiz.js";import"./use-open-team-member-ElN3KmCI.js";import{n as ze,r as Be,t as Ve}from"./send-to-chat-B09VjsB5.js";import"./ai-settings-section-Ezhw4Fef.js";import"./codex-reset-credit-button-D2hal4bG.js";import{a as He,i as Ue,n as We,r as Ge}from"./design-export-client-D9h9wJ3e.js";import{t as Ke}from"./design-responsive-dialog-BhyR-zhE.js";var V=e(t(),1),qe=200;function Je(e,t){let[n,r]=(0,V.useState)(`resolving`),[i,a]=(0,V.useState)(0),o=String(t.projectName??``),s=String(t.designSlug??``),c=typeof t.sessionId==`string`?t.sessionId:void 0,l=t.designSessionChecked===!0,u=t.providerPending===!0||typeof t.providerId!=`string`,d=typeof t.designChatEpoch==`number`?t.designChatEpoch:0;(0,V.useEffect)(()=>{if(!o||!s)return;let t=!1;return r(e=>e===`ready`&&!u&&(c||l)?e:`resolving`),(async()=>{if(!c&&!l){let n=new URLSearchParams({limit:String(qe),offset:`0`}),r=await L.get(`${I(o)}/chat/sessions?${n}`);if(t)return;let i=r.sessions.find(e=>e.designSlug===s);ge(e,{designSessionChecked:!0,...i?{sessionId:i.id,providerId:i.providerId,providerPending:void 0,designChatEpoch:d+1}:{}});return}if(u){let[n,i]=await Promise.all([Re(),Ce(o)]);if(t)return;let a=se(n),s=i.find(e=>e.id===a)??i[0];if(!s){r(`no-provider`);return}ge(e,{providerId:s.id,providerPending:void 0});return}r(`ready`)})().catch(e=>{console.warn(`[design] could not prepare the chat for ${s}: ${e.message}`),t||r(`error`)}),()=>{t=!0}},[e,o,s,c,l,u,i]);let f=(0,V.useCallback)(()=>a(e=>e+1),[]),p=(0,V.useCallback)(t=>{ge(e,{sessionId:void 0,pendingMessage:void 0,clearedFrom:t,designSessionChecked:!0,designChatEpoch:Ee({designChatEpoch:d})})},[e,d]),m=(0,V.useCallback)(t=>{ge(e,{sessionId:t.sessionId,providerId:t.providerId,pendingMessage:t.pendingMessage,designChatEpoch:Ee({designChatEpoch:d})})},[e,d]);return{status:n,retry:f,epoch:d,sessionId:c??null,startNewSession:p,adoptFork:m}}var Ye=`ppm:design-show-chat`;function Xe(e,t,n){if(!e||!t.trim())return;let r=!1,i=()=>{r=!0};window.addEventListener(Ve,i);try{window.dispatchEvent(new CustomEvent(ze,{detail:{text:t,label:n,targetTabId:e}}))}finally{window.removeEventListener(Ve,i)}r||ge(e,{pendingMessage:t}),Qe(e)}function Ze(e,t,n){if(!e||!t.trim())return`none`;let r=`none`,i=e=>{r=e.detail?.sent?`sent`:`chip`};window.addEventListener(Ve,i);try{window.dispatchEvent(new CustomEvent(ze,{detail:{text:t,label:n,targetTabId:e,autoSend:!0}}))}finally{window.removeEventListener(Ve,i)}return r}function Qe(e){window.dispatchEvent(new CustomEvent(Ye,{detail:{tabId:e}}))}var $e=(0,V.createContext)(null);function et(){let e=(0,V.useContext)($e);if(!e)throw Error(`useDesignTab() used outside a design tab`);return e}var H=n();function tt({tabId:e,metadata:t,session:n}){return n.status===`no-provider`?(0,H.jsx)(`div`,{className:`flex h-full items-center justify-center p-4 text-center text-sm text-text-subtle`,role:`status`,children:`No configured AI provider can run design sessions. Enable Claude or Codex in Settings → AI Provider.`}):n.status===`error`?(0,H.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center gap-2 p-4 text-sm text-text-subtle`,role:`status`,children:[`Could not prepare this design's chat.`,(0,H.jsx)(`button`,{type:`button`,onClick:n.retry,className:`min-h-11 px-3 text-primary underline`,children:`Retry`})]}):n.status===`ready`?(0,H.jsx)(re,{tabId:e,metadata:t,onNewSession:n.startNewSession,onFork:n.adoptFork,historyFilter:String(t.designSlug)},n.epoch):(0,H.jsxs)(`div`,{className:`flex h-full items-center justify-center gap-2 text-sm text-text-subtle`,role:`status`,children:[(0,H.jsx)(N,{className:`size-4 animate-spin`}),` Preparing chat…`]})}var nt=[`desktop`,`tablet`,`phone`,`slide`],rt=[{id:`desktop`,label:`Desktop`,size:null},{id:`tablet`,label:`Tablet`,size:{width:820,height:1180}},{id:`phone`,label:`Phone`,size:{width:390,height:844}},{id:`slide`,label:`Slide`,size:{width:1280,height:720}}];function it(e){return typeof e==`string`&&nt.includes(e)}function at(e){return rt.find(t=>t.id===e)??rt[0]}function ot(e){return e===`slides`?`slide`:`desktop`}var st=[`auto`,`split`,`canvas`,`chat`];function ct(e){return typeof e==`string`&&st.includes(e)}function lt(e,t){return!Number.isFinite(e)||e<=0?t:e>=940?!0:e<860?!1:t}function ut(e){return e===`chat`?`chat`:`canvas`}function dt(e){let{override:t,isPhone:n,autoSplit:r,expanded:i}=e,a=i?`canvas`:e.pane,o=!n&&(t===`split`||t===`auto`&&r);return{split:o,pane:a,switcher:i||o?null:n?`phone`:`toolbar`,menuValue:t===`canvas`||t===`chat`?a:t,expanded:i}}var ft=`ppm-design-view-prefs`;function pt(){return{layout:`auto`,chatPercent:38,frames:{}}}function mt(e){return typeof e!=`number`||!Number.isFinite(e)?38:Math.min(70,Math.max(20,Math.round(e)))}function ht(e){if(!e)return pt();let t;try{t=JSON.parse(e)}catch{return pt()}if(!t||typeof t!=`object`||Array.isArray(t))return pt();let n=t,r={};if(n.frames&&typeof n.frames==`object`&&!Array.isArray(n.frames)){let e=Object.entries(n.frames).filter(e=>e[0].length<=300&&it(e[1]));for(let[t,n]of e.slice(-50))r[t]=n}return{layout:ct(n.layout)?n.layout:`auto`,chatPercent:mt(n.chatPercent),frames:r}}function gt(e,t){return`${e}/${t}`}function _t(e,t,n){let r=Object.entries(e.frames).filter(([e])=>e!==t);return r.push([t,n]),{...e,frames:Object.fromEntries(r.slice(-50))}}function vt(e,t){return{...e,chatPercent:mt(t)}}function yt(e,t){return{...e,layout:t}}function U(){try{return ht(localStorage.getItem(ft))}catch{return pt()}}function bt(e){try{localStorage.setItem(ft,JSON.stringify(e))}catch{}}function xt(){return`Set up this project's design system so every design here matches the product.
2
+ import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t,S as n}from"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-P9Ym7hCv.js";import{$n as r,An as i,En as a,Er as o,Fr as s,Jr as c,Ln as l,Mr as u,Nn as d,Nr as f,O as p,Pn as m,T as h,Ut as g,Z as _,ar as v,bn as y,br as b,ct as x,d as S,dr as C,er as w,et as T,ft as E,gn as D,ir as O,j as k,pt as A,r as j,st as M,un as N,vr as ee,wn as P,yn as te,yr as ne}from"./icons-CO_II6D-.js";import{t as re}from"./chat-tab-Dj8kFoUi.js";import{O as F,a as ie,o as I,r as L}from"./api-client-F5Zi1sR0.js";import{t as ae}from"./settings-store-3jIBB8gx.js";import{t as oe}from"./preload-helper-BEFjQwLd.js";import{n as R}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import{p as se,t as ce}from"./panel-store-DrSH3Nhp.js";import"./window-store-B4cbZ5rr.js";import"./project-store-CCimwgGF.js";import"./tab-store-CUPgQIQz.js";import{t as le}from"./format-date-Fd9tpNaw.js";import"./context-menu-CH1mvCwA.js";import"./chat-preparation-cache-DoS7sdal.js";import"./file-store-DCU7_YyB.js";import{n as ue}from"./use-is-mobile-CkO33jqU.js";import{u as de}from"./onboarding-quick-orientation-WLKI95GY.js";import{t as z}from"./button-CsmGH5xa.js";import"./dialog-z8PLkL8n.js";import{t as fe}from"./mobile-bottom-sheet-CLic9ovp.js";import"./use-visual-viewport-C307OVeV.js";import"./fs-api-vF_bQoeL.js";import{o as pe}from"./format-file-meta-B0ZpqzSM.js";import{t as me}from"./input-CP31LZnN.js";import"./ws-auth-J3hw0Mhc.js";import{Cn as he,Nn as ge,On as _e,Sn as ve,_n as ye,an as be,bn as xe,cr as Se,d as Ce,h as we,i as Te,kn as Ee,l as De,lr as Oe,m as ke,mn as Ae,on as je,sn as B,u as Me,un as Ne,ur as Pe,wn as Fe,xn as Ie,yn as Le}from"./index-D41mthBS.js";import"./use-websocket-C1dxvoVt.js";import{a as Re}from"./api-settings-BeINN5Dy.js";import"./tool-cards-BoW8_vQb.js";import"./use-blob-url-B3R1DMZ0.js";import"./libesm-CxeQSM3t.js";import"./onboarding-entry-DD3QSDiz.js";import"./use-open-team-member-ElN3KmCI.js";import{n as ze,r as Be,t as Ve}from"./send-to-chat-B09VjsB5.js";import"./ai-settings-section-Bmy9p9l-.js";import"./codex-reset-credit-button-Xt1ttURe.js";import{a as He,i as Ue,n as We,r as Ge}from"./design-export-client-D9h9wJ3e.js";import{t as Ke}from"./design-responsive-dialog-BhyR-zhE.js";var V=e(t(),1),qe=200;function Je(e,t){let[n,r]=(0,V.useState)(`resolving`),[i,a]=(0,V.useState)(0),o=String(t.projectName??``),s=String(t.designSlug??``),c=typeof t.sessionId==`string`?t.sessionId:void 0,l=t.designSessionChecked===!0,u=t.providerPending===!0||typeof t.providerId!=`string`,d=typeof t.designChatEpoch==`number`?t.designChatEpoch:0;(0,V.useEffect)(()=>{if(!o||!s)return;let t=!1;return r(e=>e===`ready`&&!u&&(c||l)?e:`resolving`),(async()=>{if(!c&&!l){let n=new URLSearchParams({limit:String(qe),offset:`0`}),r=await L.get(`${I(o)}/chat/sessions?${n}`);if(t)return;let i=r.sessions.find(e=>e.designSlug===s);ge(e,{designSessionChecked:!0,...i?{sessionId:i.id,providerId:i.providerId,providerPending:void 0,designChatEpoch:d+1}:{}});return}if(u){let[n,i]=await Promise.all([Re(),Ce(o)]);if(t)return;let a=se(n),s=i.find(e=>e.id===a)??i[0];if(!s){r(`no-provider`);return}ge(e,{providerId:s.id,providerPending:void 0});return}r(`ready`)})().catch(e=>{console.warn(`[design] could not prepare the chat for ${s}: ${e.message}`),t||r(`error`)}),()=>{t=!0}},[e,o,s,c,l,u,i]);let f=(0,V.useCallback)(()=>a(e=>e+1),[]),p=(0,V.useCallback)(t=>{ge(e,{sessionId:void 0,pendingMessage:void 0,clearedFrom:t,designSessionChecked:!0,designChatEpoch:Ee({designChatEpoch:d})})},[e,d]),m=(0,V.useCallback)(t=>{ge(e,{sessionId:t.sessionId,providerId:t.providerId,pendingMessage:t.pendingMessage,designChatEpoch:Ee({designChatEpoch:d})})},[e,d]);return{status:n,retry:f,epoch:d,sessionId:c??null,startNewSession:p,adoptFork:m}}var Ye=`ppm:design-show-chat`;function Xe(e,t,n){if(!e||!t.trim())return;let r=!1,i=()=>{r=!0};window.addEventListener(Ve,i);try{window.dispatchEvent(new CustomEvent(ze,{detail:{text:t,label:n,targetTabId:e}}))}finally{window.removeEventListener(Ve,i)}r||ge(e,{pendingMessage:t}),Qe(e)}function Ze(e,t,n){if(!e||!t.trim())return`none`;let r=`none`,i=e=>{r=e.detail?.sent?`sent`:`chip`};window.addEventListener(Ve,i);try{window.dispatchEvent(new CustomEvent(ze,{detail:{text:t,label:n,targetTabId:e,autoSend:!0}}))}finally{window.removeEventListener(Ve,i)}return r}function Qe(e){window.dispatchEvent(new CustomEvent(Ye,{detail:{tabId:e}}))}var $e=(0,V.createContext)(null);function et(){let e=(0,V.useContext)($e);if(!e)throw Error(`useDesignTab() used outside a design tab`);return e}var H=n();function tt({tabId:e,metadata:t,session:n}){return n.status===`no-provider`?(0,H.jsx)(`div`,{className:`flex h-full items-center justify-center p-4 text-center text-sm text-text-subtle`,role:`status`,children:`No configured AI provider can run design sessions. Enable Claude or Codex in Settings → AI Provider.`}):n.status===`error`?(0,H.jsxs)(`div`,{className:`flex h-full flex-col items-center justify-center gap-2 p-4 text-sm text-text-subtle`,role:`status`,children:[`Could not prepare this design's chat.`,(0,H.jsx)(`button`,{type:`button`,onClick:n.retry,className:`min-h-11 px-3 text-primary underline`,children:`Retry`})]}):n.status===`ready`?(0,H.jsx)(re,{tabId:e,metadata:t,onNewSession:n.startNewSession,onFork:n.adoptFork,historyFilter:String(t.designSlug)},n.epoch):(0,H.jsxs)(`div`,{className:`flex h-full items-center justify-center gap-2 text-sm text-text-subtle`,role:`status`,children:[(0,H.jsx)(N,{className:`size-4 animate-spin`}),` Preparing chat…`]})}var nt=[`desktop`,`tablet`,`phone`,`slide`],rt=[{id:`desktop`,label:`Desktop`,size:null},{id:`tablet`,label:`Tablet`,size:{width:820,height:1180}},{id:`phone`,label:`Phone`,size:{width:390,height:844}},{id:`slide`,label:`Slide`,size:{width:1280,height:720}}];function it(e){return typeof e==`string`&&nt.includes(e)}function at(e){return rt.find(t=>t.id===e)??rt[0]}function ot(e){return e===`slides`?`slide`:`desktop`}var st=[`auto`,`split`,`canvas`,`chat`];function ct(e){return typeof e==`string`&&st.includes(e)}function lt(e,t){return!Number.isFinite(e)||e<=0?t:e>=940?!0:e<860?!1:t}function ut(e){return e===`chat`?`chat`:`canvas`}function dt(e){let{override:t,isPhone:n,autoSplit:r,expanded:i}=e,a=i?`canvas`:e.pane,o=!n&&(t===`split`||t===`auto`&&r);return{split:o,pane:a,switcher:i||o?null:n?`phone`:`toolbar`,menuValue:t===`canvas`||t===`chat`?a:t,expanded:i}}var ft=`ppm-design-view-prefs`;function pt(){return{layout:`auto`,chatPercent:38,frames:{}}}function mt(e){return typeof e!=`number`||!Number.isFinite(e)?38:Math.min(70,Math.max(20,Math.round(e)))}function ht(e){if(!e)return pt();let t;try{t=JSON.parse(e)}catch{return pt()}if(!t||typeof t!=`object`||Array.isArray(t))return pt();let n=t,r={};if(n.frames&&typeof n.frames==`object`&&!Array.isArray(n.frames)){let e=Object.entries(n.frames).filter(e=>e[0].length<=300&&it(e[1]));for(let[t,n]of e.slice(-50))r[t]=n}return{layout:ct(n.layout)?n.layout:`auto`,chatPercent:mt(n.chatPercent),frames:r}}function gt(e,t){return`${e}/${t}`}function _t(e,t,n){let r=Object.entries(e.frames).filter(([e])=>e!==t);return r.push([t,n]),{...e,frames:Object.fromEntries(r.slice(-50))}}function vt(e,t){return{...e,chatPercent:mt(t)}}function yt(e,t){return{...e,layout:t}}function U(){try{return ht(localStorage.getItem(ft))}catch{return pt()}}function bt(e){try{localStorage.setItem(ft,JSON.stringify(e))}catch{}}function xt(){return`Set up this project's design system so every design here matches the product.
3
3
 
4
4
  1. Read the codebase once to learn its visual language: global stylesheets, theme and token
5
5
  files (CSS custom properties, Tailwind config, theme objects), the font setup, and a few