@hienlh/ppm 0.23.8 → 0.23.10

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 (448) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/CLAUDE.md +4 -0
  3. package/assets/skills/ppm/SKILL.md +1 -1
  4. package/assets/skills/ppm/references/cli-reference.md +4 -4
  5. package/assets/skills/ppm/references/http-api.md +1 -1
  6. package/dist/web/assets/accounts-settings-section-BOBJbG7i.js +1 -0
  7. package/dist/web/assets/accounts-settings-section-BOBJbG7i.js.br +0 -0
  8. package/dist/web/assets/accounts-settings-section-BOBJbG7i.js.gz +0 -0
  9. package/dist/web/assets/agent-session-sheet-CjD4hBZV.js +2 -0
  10. package/dist/web/assets/agent-session-sheet-CjD4hBZV.js.br +0 -0
  11. package/dist/web/assets/agent-session-sheet-CjD4hBZV.js.gz +0 -0
  12. package/dist/web/assets/agent-session-sheet-store-BcQbnaV2.js +1 -0
  13. package/dist/web/assets/agent-session-window-content-Drm1HsSn.js +1 -0
  14. package/dist/web/assets/agent-session-window-content-Drm1HsSn.js.br +0 -0
  15. package/dist/web/assets/agent-session-window-content-Drm1HsSn.js.gz +0 -0
  16. package/dist/web/assets/{ai-resource-editor-DfVRMUHS.js → ai-resource-editor-M1Eax2Hc.js} +1 -1
  17. package/dist/web/assets/ai-resource-editor-M1Eax2Hc.js.br +0 -0
  18. package/dist/web/assets/ai-resource-editor-M1Eax2Hc.js.gz +0 -0
  19. package/dist/web/assets/ai-settings-section-B73t9SXm.js +1 -0
  20. package/dist/web/assets/{ai-settings-section-Ezhw4Fef.js → ai-settings-section-H173dm1k.js} +1 -1
  21. package/dist/web/assets/ai-settings-section-H173dm1k.js.br +0 -0
  22. package/dist/web/assets/ai-settings-section-H173dm1k.js.gz +0 -0
  23. package/dist/web/assets/{api-settings-tYKJ5Fqk.js → api-settings-BA_n8cPt.js} +1 -1
  24. package/dist/web/assets/{appearance-settings-section-CPOAp0fY.js → appearance-settings-section-Dqu20pt8.js} +1 -1
  25. package/dist/web/assets/appearance-settings-section-Dqu20pt8.js.br +0 -0
  26. package/dist/web/assets/appearance-settings-section-Dqu20pt8.js.gz +0 -0
  27. package/dist/web/assets/{apps-panel-Cz7_o-M4.js → apps-panel-mkrzY7K0.js} +1 -1
  28. package/dist/web/assets/apps-panel-mkrzY7K0.js.br +0 -0
  29. package/dist/web/assets/apps-panel-mkrzY7K0.js.gz +0 -0
  30. package/dist/web/assets/branch-review-tab-Dw3bNixU.js +1 -0
  31. package/dist/web/assets/branch-review-tab-Dw3bNixU.js.br +0 -0
  32. package/dist/web/assets/branch-review-tab-Dw3bNixU.js.gz +0 -0
  33. package/dist/web/assets/chat-tab-BAbcVFzD.js +15 -0
  34. package/dist/web/assets/chat-tab-BAbcVFzD.js.br +0 -0
  35. package/dist/web/assets/chat-tab-BAbcVFzD.js.gz +0 -0
  36. package/dist/web/assets/chat-tab-BaXGaBEC.js +1 -0
  37. package/dist/web/assets/chat-tab-BaXGaBEC.js.br +4 -0
  38. package/dist/web/assets/chat-tab-BaXGaBEC.js.gz +0 -0
  39. package/dist/web/assets/code-editor-CXLANXnI.js +7 -0
  40. package/dist/web/assets/code-editor-CXLANXnI.js.br +0 -0
  41. package/dist/web/assets/code-editor-CXLANXnI.js.gz +0 -0
  42. package/dist/web/assets/{codex-reset-credit-button-D2hal4bG.js → codex-reset-credit-button-CB8Dfhki.js} +1 -1
  43. package/dist/web/assets/codex-reset-credit-button-CB8Dfhki.js.br +0 -0
  44. package/dist/web/assets/codex-reset-credit-button-CB8Dfhki.js.gz +0 -0
  45. package/dist/web/assets/{conflict-editor-Cj_gUncw.js → conflict-editor-CKsxIw3v.js} +2 -2
  46. package/dist/web/assets/conflict-editor-CKsxIw3v.js.br +0 -0
  47. package/dist/web/assets/conflict-editor-CKsxIw3v.js.gz +0 -0
  48. package/dist/web/assets/{csv-preview-Be3ODNj0.js → csv-preview-U0v_r_-7.js} +1 -1
  49. package/dist/web/assets/csv-preview-U0v_r_-7.js.br +0 -0
  50. package/dist/web/assets/csv-preview-U0v_r_-7.js.gz +0 -0
  51. package/dist/web/assets/{database-viewer-B1b--4y8.js → database-viewer-xQyUcBoL.js} +1 -1
  52. package/dist/web/assets/database-viewer-xQyUcBoL.js.br +0 -0
  53. package/dist/web/assets/database-viewer-xQyUcBoL.js.gz +0 -0
  54. package/dist/web/assets/{design-tab-8wi0IHss.js → design-tab-aaAt2_QE.js} +4 -4
  55. package/dist/web/assets/design-tab-aaAt2_QE.js.br +0 -0
  56. package/dist/web/assets/design-tab-aaAt2_QE.js.gz +0 -0
  57. package/dist/web/assets/{designs-sidebar-panel-D5-1Q8zQ.js → designs-sidebar-panel-CTzO4Thu.js} +1 -1
  58. package/dist/web/assets/designs-sidebar-panel-CTzO4Thu.js.br +0 -0
  59. package/dist/web/assets/designs-sidebar-panel-CTzO4Thu.js.gz +0 -0
  60. package/dist/web/assets/{diff-viewer-Dcxk6UTG.js → diff-viewer-CSE2-OE7.js} +1 -1
  61. package/dist/web/assets/diff-viewer-CSE2-OE7.js.br +0 -0
  62. package/dist/web/assets/diff-viewer-CSE2-OE7.js.gz +0 -0
  63. package/dist/web/assets/{edit-diff-preview-DxDAtYhi.js → edit-diff-preview-gH6pRk4S.js} +1 -1
  64. package/dist/web/assets/edit-diff-preview-gH6pRk4S.js.br +0 -0
  65. package/dist/web/assets/{edit-diff-preview-DxDAtYhi.js.gz → edit-diff-preview-gH6pRk4S.js.gz} +0 -0
  66. package/dist/web/assets/{editor-language-service-BVJQnTSV.js → editor-language-service-CYl04pUy.js} +1 -1
  67. package/dist/web/assets/editor-language-service-CYl04pUy.js.br +0 -0
  68. package/dist/web/assets/editor-language-service-CYl04pUy.js.gz +0 -0
  69. package/dist/web/assets/explorer-body-BBOcvwmV.js +2 -0
  70. package/dist/web/assets/explorer-body-BBOcvwmV.js.br +0 -0
  71. package/dist/web/assets/explorer-body-BBOcvwmV.js.gz +0 -0
  72. package/dist/web/assets/{explorer-window-content-DH5AD3Ng.js → explorer-window-content-juCGcrkc.js} +1 -1
  73. package/dist/web/assets/explorer-window-content-juCGcrkc.js.br +0 -0
  74. package/dist/web/assets/explorer-window-content-juCGcrkc.js.gz +0 -0
  75. package/dist/web/assets/{extension-manager-section-BJr6ccWw.js → extension-manager-section-poMRmwvg.js} +1 -1
  76. package/dist/web/assets/extension-manager-section-poMRmwvg.js.br +0 -0
  77. package/dist/web/assets/extension-manager-section-poMRmwvg.js.gz +0 -0
  78. package/dist/web/assets/{extension-webview-CYNXHd8D.js → extension-webview-0QfzTI6s.js} +1 -1
  79. package/dist/web/assets/extension-webview-0QfzTI6s.js.br +0 -0
  80. package/dist/web/assets/extension-webview-0QfzTI6s.js.gz +0 -0
  81. package/dist/web/assets/{files-settings-section-JX7o4lex.js → files-settings-section-DJptxRgH.js} +1 -1
  82. package/dist/web/assets/files-settings-section-DJptxRgH.js.br +0 -0
  83. package/dist/web/assets/files-settings-section-DJptxRgH.js.gz +0 -0
  84. package/dist/web/assets/{general-settings-section-kF94Mz5q.js → general-settings-section-BFNbdDNv.js} +1 -1
  85. package/dist/web/assets/general-settings-section-BFNbdDNv.js.br +0 -0
  86. package/dist/web/assets/general-settings-section-BFNbdDNv.js.gz +0 -0
  87. package/dist/web/assets/{git-log-panel-Crlp9ofM.js → git-log-panel-SMMIbjSe.js} +1 -1
  88. package/dist/web/assets/git-log-panel-SMMIbjSe.js.br +0 -0
  89. package/dist/web/assets/git-log-panel-SMMIbjSe.js.gz +0 -0
  90. package/dist/web/assets/{glide-data-grid-O6MO5dKU.js → glide-data-grid-DZVmgu0T.js} +3 -3
  91. package/dist/web/assets/glide-data-grid-DZVmgu0T.js.br +0 -0
  92. package/dist/web/assets/glide-data-grid-DZVmgu0T.js.gz +0 -0
  93. package/dist/web/assets/group-chat-tab-d_aaYuK_.js +1 -0
  94. package/dist/web/assets/group-chat-tab-d_aaYuK_.js.br +0 -0
  95. package/dist/web/assets/group-chat-tab-d_aaYuK_.js.gz +0 -0
  96. package/dist/web/assets/{index-DQCw6d-2.js → index-CIscPw4g.js} +6 -6
  97. package/dist/web/assets/index-CIscPw4g.js.br +0 -0
  98. package/dist/web/assets/index-CIscPw4g.js.gz +0 -0
  99. package/dist/web/assets/{jira-watcher-section-DwM7gqHT.js → jira-watcher-section-CsbhnLLn.js} +1 -1
  100. package/dist/web/assets/keybindings-store-BPs0pM0r.js +1 -0
  101. package/dist/web/assets/{keyboard-shortcuts-section-CewWGwiF.js → keyboard-shortcuts-section-CXqc2OtM.js} +1 -1
  102. package/dist/web/assets/keyboard-shortcuts-section-CXqc2OtM.js.br +0 -0
  103. package/dist/web/assets/keyboard-shortcuts-section-CXqc2OtM.js.gz +0 -0
  104. package/dist/web/assets/{language-servers-section-nricdxke.js → language-servers-section-B4FsBVvZ.js} +2 -2
  105. package/dist/web/assets/language-servers-section-B4FsBVvZ.js.br +0 -0
  106. package/dist/web/assets/language-servers-section-B4FsBVvZ.js.gz +0 -0
  107. package/dist/web/assets/{lsp-client-DRMEWb-z.js → lsp-client-MQ4mjDfT.js} +1 -1
  108. package/dist/web/assets/lsp-client-MQ4mjDfT.js.br +0 -0
  109. package/dist/web/assets/lsp-client-MQ4mjDfT.js.gz +0 -0
  110. package/dist/web/assets/markdown-renderer-BvCZZlue.js +1 -0
  111. package/dist/web/assets/{markdown-renderer-Dab9Us6u.js → markdown-renderer-CjPb5pns.js} +3 -3
  112. package/dist/web/assets/markdown-renderer-CjPb5pns.js.br +0 -0
  113. package/dist/web/assets/markdown-renderer-CjPb5pns.js.gz +0 -0
  114. package/dist/web/assets/{mobile-explorer-sheet-DtgdpvJ9.js → mobile-explorer-sheet-0aGhVQtI.js} +1 -1
  115. package/dist/web/assets/mobile-explorer-sheet-0aGhVQtI.js.br +0 -0
  116. package/dist/web/assets/mobile-explorer-sheet-0aGhVQtI.js.gz +0 -0
  117. package/dist/web/assets/{new-design-dialog-Dd5KDB_p.js → new-design-dialog-2oT2oc_F.js} +1 -1
  118. package/dist/web/assets/new-design-dialog-2oT2oc_F.js.br +0 -0
  119. package/dist/web/assets/new-design-dialog-2oT2oc_F.js.gz +0 -0
  120. package/dist/web/assets/notification-store-Dd25PMPQ.js +1 -0
  121. package/dist/web/assets/{panel-store-DrSH3Nhp.js → panel-store-1X6yM3XZ.js} +1 -1
  122. package/dist/web/assets/panel-store-1X6yM3XZ.js.br +0 -0
  123. package/dist/web/assets/panel-store-1X6yM3XZ.js.gz +0 -0
  124. package/dist/web/assets/performance-panel-Ub96qrEH.js +3 -0
  125. package/dist/web/assets/performance-panel-Ub96qrEH.js.br +0 -0
  126. package/dist/web/assets/performance-panel-Ub96qrEH.js.gz +0 -0
  127. package/dist/web/assets/{ppmbot-settings-section-D67u6gPi.js → ppmbot-settings-section-CPMGP66g.js} +1 -1
  128. package/dist/web/assets/ppmbot-settings-section-CPMGP66g.js.br +0 -0
  129. package/dist/web/assets/ppmbot-settings-section-CPMGP66g.js.gz +0 -0
  130. package/dist/web/assets/{problems-panel-DKgIw4uZ.js → problems-panel-CWwzZIP3.js} +1 -1
  131. package/dist/web/assets/problems-panel-CWwzZIP3.js.br +0 -0
  132. package/dist/web/assets/problems-panel-CWwzZIP3.js.gz +0 -0
  133. package/dist/web/assets/process-table-BwPws3zS.js +1 -0
  134. package/dist/web/assets/process-table-BwPws3zS.js.br +0 -0
  135. package/dist/web/assets/process-table-BwPws3zS.js.gz +0 -0
  136. package/dist/web/assets/{proxy-settings-section-CFiYcTBA.js → proxy-settings-section-nS8VbxI_.js} +1 -1
  137. package/dist/web/assets/proxy-settings-section-nS8VbxI_.js.br +0 -0
  138. package/dist/web/assets/proxy-settings-section-nS8VbxI_.js.gz +0 -0
  139. package/dist/web/assets/{query-audit-section-BybgiPsc.js → query-audit-section-Dv5Pxn-w.js} +1 -1
  140. package/dist/web/assets/query-audit-section-Dv5Pxn-w.js.br +0 -0
  141. package/dist/web/assets/query-audit-section-Dv5Pxn-w.js.gz +0 -0
  142. package/dist/web/assets/{remote-desktop-clipboard-notice-Bs3fZSRw.js → remote-desktop-clipboard-notice-DEbdu0hC.js} +1 -1
  143. package/dist/web/assets/remote-desktop-clipboard-notice-DEbdu0hC.js.br +0 -0
  144. package/dist/web/assets/remote-desktop-clipboard-notice-DEbdu0hC.js.gz +0 -0
  145. package/dist/web/assets/remote-desktop-mobile-sheet-BJm-akVY.js +2 -0
  146. package/dist/web/assets/remote-desktop-mobile-sheet-BJm-akVY.js.br +0 -0
  147. package/dist/web/assets/remote-desktop-mobile-sheet-BJm-akVY.js.gz +0 -0
  148. package/dist/web/assets/{remote-desktop-mobile-view-DgGOfPVY.js → remote-desktop-mobile-view-DPdGFD6C.js} +1 -1
  149. package/dist/web/assets/remote-desktop-mobile-view-DPdGFD6C.js.br +0 -0
  150. package/dist/web/assets/remote-desktop-mobile-view-DPdGFD6C.js.gz +0 -0
  151. package/dist/web/assets/{remote-desktop-readiness-gate-DOWryrQx.js → remote-desktop-readiness-gate-DV7YgSpP.js} +1 -1
  152. package/dist/web/assets/remote-desktop-readiness-gate-DV7YgSpP.js.br +0 -0
  153. package/dist/web/assets/remote-desktop-readiness-gate-DV7YgSpP.js.gz +0 -0
  154. package/dist/web/assets/remote-desktop-window-content-BktcWMjD.js +1 -0
  155. package/dist/web/assets/remote-desktop-window-content-BktcWMjD.js.br +0 -0
  156. package/dist/web/assets/remote-desktop-window-content-BktcWMjD.js.gz +0 -0
  157. package/dist/web/assets/{run-in-terminal-Cdn9PaAl.js → run-in-terminal-B_PCeBqG.js} +1 -1
  158. package/dist/web/assets/{schedules-settings-section-DGhG-b5O.js → schedules-settings-section-B3HYKSVh.js} +1 -1
  159. package/dist/web/assets/schedules-settings-section-B3HYKSVh.js.br +0 -0
  160. package/dist/web/assets/schedules-settings-section-B3HYKSVh.js.gz +0 -0
  161. package/dist/web/assets/{send-to-chat-B09VjsB5.js → send-to-chat-Bjg6c8Ld.js} +1 -1
  162. package/dist/web/assets/send-to-chat-Bjg6c8Ld.js.br +0 -0
  163. package/dist/web/assets/send-to-chat-Bjg6c8Ld.js.gz +0 -0
  164. package/dist/web/assets/{services-panel-0klE3O4g.js → services-panel-D6k6AVS4.js} +1 -1
  165. package/dist/web/assets/services-panel-D6k6AVS4.js.br +0 -0
  166. package/dist/web/assets/services-panel-D6k6AVS4.js.gz +0 -0
  167. package/dist/web/assets/{settings-body-CfqpqFfq.js → settings-body-Cu0mNA5x.js} +2 -2
  168. package/dist/web/assets/settings-body-Cu0mNA5x.js.br +0 -0
  169. package/dist/web/assets/settings-body-Cu0mNA5x.js.gz +0 -0
  170. package/dist/web/assets/{settings-store-3jIBB8gx.js → settings-store-DIV25PM_.js} +2 -2
  171. package/dist/web/assets/settings-store-DIV25PM_.js.br +0 -0
  172. package/dist/web/assets/settings-store-DIV25PM_.js.gz +0 -0
  173. package/dist/web/assets/{settings-tab-CHweH5Nh.js → settings-tab-C-A6RNQ3.js} +1 -1
  174. package/dist/web/assets/{settings-window-content-C6Od3qV7.js → settings-window-content-48e5FJAq.js} +1 -1
  175. package/dist/web/assets/{sql-query-editor-ALQ5_X0j.js → sql-query-editor-CgGWYu9K.js} +1 -1
  176. package/dist/web/assets/sql-query-editor-CgGWYu9K.js.br +0 -0
  177. package/dist/web/assets/sql-query-editor-CgGWYu9K.js.gz +0 -0
  178. package/dist/web/assets/{sqlite-viewer-DKTty_jR.js → sqlite-viewer-Co1Oi3dv.js} +1 -1
  179. package/dist/web/assets/sqlite-viewer-Co1Oi3dv.js.br +0 -0
  180. package/dist/web/assets/sqlite-viewer-Co1Oi3dv.js.gz +0 -0
  181. package/dist/web/assets/{system-monitor-body-D6J6lq7-.js → system-monitor-body-DxPKVa-W.js} +2 -2
  182. package/dist/web/assets/system-monitor-body-DxPKVa-W.js.br +0 -0
  183. package/dist/web/assets/system-monitor-body-DxPKVa-W.js.gz +0 -0
  184. package/dist/web/assets/system-monitor-tab-4miOZuQQ.js +1 -0
  185. package/dist/web/assets/{system-monitor-window-content-D1t30f32.js → system-monitor-window-content-B-A7DdML.js} +1 -1
  186. package/dist/web/assets/{tab-host-window-content-DTcx2D0O.js → tab-host-window-content-CChcpg1v.js} +1 -1
  187. package/dist/web/assets/tab-host-window-content-CChcpg1v.js.br +0 -0
  188. package/dist/web/assets/tab-host-window-content-CChcpg1v.js.gz +0 -0
  189. package/dist/web/assets/{tab-store-CUPgQIQz.js → tab-store-D33icgdA.js} +1 -1
  190. package/dist/web/assets/{terminal-tab-DgTfQKBI.js → terminal-tab-BDqlyBLK.js} +2 -2
  191. package/dist/web/assets/terminal-tab-BDqlyBLK.js.br +0 -0
  192. package/dist/web/assets/terminal-tab-BDqlyBLK.js.gz +0 -0
  193. package/dist/web/assets/tool-cards-iJ8tyrLq.js +9 -0
  194. package/dist/web/assets/tool-cards-iJ8tyrLq.js.br +0 -0
  195. package/dist/web/assets/tool-cards-iJ8tyrLq.js.gz +0 -0
  196. package/dist/web/assets/{use-inline-blame-Dv111BKY.js → use-inline-blame-D9js570a.js} +4 -4
  197. package/dist/web/assets/use-inline-blame-D9js570a.js.br +0 -0
  198. package/dist/web/assets/use-inline-blame-D9js570a.js.gz +0 -0
  199. package/dist/web/assets/{use-lsp-CZTFJIXX.js → use-lsp-BYtylZId.js} +1 -1
  200. package/dist/web/assets/use-lsp-BYtylZId.js.br +0 -0
  201. package/dist/web/assets/use-lsp-BYtylZId.js.gz +0 -0
  202. package/dist/web/assets/{use-monaco-theme-DL2dIG5L.js → use-monaco-theme-DJ8y_7IZ.js} +1 -1
  203. package/dist/web/assets/{use-process-kill-D7D9QvJG.js → use-process-kill-BS84S-kD.js} +1 -1
  204. package/dist/web/assets/use-process-kill-BS84S-kD.js.br +0 -0
  205. package/dist/web/assets/use-process-kill-BS84S-kD.js.gz +0 -0
  206. package/dist/web/assets/{use-websocket-ziY-Gz_B.js → use-websocket-Mqj27umG.js} +1 -1
  207. package/dist/web/assets/{video-preview-DzwY3q9W.js → video-preview-BuzUAIma.js} +1 -1
  208. package/dist/web/assets/video-preview-BuzUAIma.js.br +0 -0
  209. package/dist/web/assets/video-preview-BuzUAIma.js.gz +0 -0
  210. package/dist/web/assets/{voice-settings-section-B7zMHsuz.js → voice-settings-section-DnwQjBbw.js} +1 -1
  211. package/dist/web/assets/voice-settings-section-DnwQjBbw.js.br +0 -0
  212. package/dist/web/assets/voice-settings-section-DnwQjBbw.js.gz +0 -0
  213. package/dist/web/assets/{window-pip-registry-dxrBFfkP.js → window-pip-registry-Bl--fK8-.js} +1 -1
  214. package/dist/web/assets/window-store-vo1N70nK.js +1 -0
  215. package/dist/web/assets/window-store-vo1N70nK.js.br +0 -0
  216. package/dist/web/assets/window-store-vo1N70nK.js.gz +0 -0
  217. package/dist/web/index.html +6 -6
  218. package/dist/web/index.html.br +0 -0
  219. package/dist/web/index.html.gz +0 -0
  220. package/dist/web/sw.js +1 -1
  221. package/dist/web/sw.js.br +0 -0
  222. package/dist/web/sw.js.gz +0 -0
  223. package/docs/architecture/ai-chat-and-providers.md +66 -0
  224. package/docs/architecture/workspace-and-ui.md +15 -3
  225. package/docs/design-guidelines.md +6 -1
  226. package/package.json +1 -1
  227. package/src/providers/codex-app-server/codex-history.ts +4 -4
  228. package/src/providers/codex-app-server/codex-provider.ts +1 -1
  229. package/src/providers/codex-app-server/codex-rollout-tail-parser.ts +203 -0
  230. package/src/providers/codex-app-server/codex-subagent-thread.ts +7 -1
  231. package/src/server/index.ts +7 -2
  232. package/src/server/routes/chat.ts +12 -4
  233. package/src/server/ws/global.ts +19 -3
  234. package/src/services/agent-transcript/agent-transcript-activity.ts +72 -0
  235. package/src/services/agent-transcript/agent-transcript-codex-activity.ts +161 -0
  236. package/src/services/agent-transcript/agent-transcript-codex-tail-cache.ts +85 -0
  237. package/src/services/agent-transcript/agent-transcript-envelope.ts +86 -0
  238. package/src/services/agent-transcript/agent-transcript-error-map.ts +33 -0
  239. package/src/services/agent-transcript/agent-transcript-file-tail-feed.ts +180 -0
  240. package/src/services/agent-transcript/agent-transcript-file-tail-state.ts +100 -0
  241. package/src/services/agent-transcript/agent-transcript-fs-io.ts +79 -0
  242. package/src/services/agent-transcript/agent-transcript-hub-clock.ts +37 -0
  243. package/src/services/agent-transcript/agent-transcript-hub-registry.ts +153 -0
  244. package/src/services/agent-transcript/agent-transcript-hub.ts +103 -0
  245. package/src/services/agent-transcript/agent-transcript-index-cache.ts +85 -0
  246. package/src/services/agent-transcript/agent-transcript-session-hub-activity.ts +103 -0
  247. package/src/services/agent-transcript/agent-transcript-session-hub-read.ts +194 -0
  248. package/src/services/agent-transcript/agent-transcript-session-hub-types.ts +81 -0
  249. package/src/services/agent-transcript/agent-transcript-session-hub.ts +196 -0
  250. package/src/services/agent-transcript/agent-transcript-sources.ts +199 -0
  251. package/src/services/agent-transcript/agent-transcript-ws-like.ts +19 -0
  252. package/src/services/agent-transcript/claude-projects-root.ts +21 -0
  253. package/src/services/agent-transcript/session-ownership.ts +152 -0
  254. package/src/services/nested-subagent-spy.ts +3 -3
  255. package/src/services/subagent-transcript-merger.ts +21 -7
  256. package/src/shared/agent-transcript-protocol.ts +158 -0
  257. package/src/types/chat.ts +27 -3
  258. package/src/web/app.tsx +5 -5
  259. package/src/web/components/chat/agent-card-summary.tsx +73 -0
  260. package/src/web/components/chat/agent-session-context.ts +34 -0
  261. package/src/web/components/chat/agent-session-fallback-store.ts +60 -0
  262. package/src/web/components/chat/agent-session-sheet-store.ts +23 -0
  263. package/src/web/components/chat/{team-member-sheet.tsx → agent-session-sheet.tsx} +12 -12
  264. package/src/web/components/chat/agent-session-window-content.tsx +133 -0
  265. package/src/web/components/chat/chat-history-bar.tsx +1 -0
  266. package/src/web/components/chat/chat-tab.tsx +21 -4
  267. package/src/web/components/chat/codex-usage-panel.tsx +26 -8
  268. package/src/web/components/chat/running-agents-bar.tsx +93 -0
  269. package/src/web/components/chat/team-activity-panel.tsx +19 -5
  270. package/src/web/components/chat/tool-cards.tsx +73 -4
  271. package/src/web/components/chat/use-open-agent-session.ts +83 -0
  272. package/src/web/components/floating-window/window-content-registry.ts +4 -5
  273. package/src/web/components/floating-window/window-geometry.ts +18 -0
  274. package/src/web/components/floating-window/window-persistence.ts +5 -4
  275. package/src/web/components/floating-window/window-store-types.ts +1 -1
  276. package/src/web/components/settings/resolve-open-settings-action.ts +1 -1
  277. package/src/web/components/system/resolve-open-system-monitor-action.ts +1 -1
  278. package/src/web/hooks/use-agent-activity.ts +65 -0
  279. package/src/web/hooks/use-agent-session-stream.ts +134 -0
  280. package/src/web/hooks/use-chat.ts +12 -18
  281. package/src/web/hooks/use-global-events.ts +35 -2
  282. package/src/web/lib/agent-session-stream-merge.ts +48 -0
  283. package/src/web/lib/agent-step-summary.ts +331 -0
  284. package/src/web/lib/global-ws-channel.ts +41 -0
  285. package/src/web/lib/running-agent-rows.ts +115 -0
  286. package/dist/web/assets/accounts-settings-section-BNcPvEq1.js +0 -1
  287. package/dist/web/assets/accounts-settings-section-BNcPvEq1.js.br +0 -0
  288. package/dist/web/assets/accounts-settings-section-BNcPvEq1.js.gz +0 -0
  289. package/dist/web/assets/ai-resource-editor-DfVRMUHS.js.br +0 -0
  290. package/dist/web/assets/ai-resource-editor-DfVRMUHS.js.gz +0 -0
  291. package/dist/web/assets/ai-settings-section-B_0-P8jx.js +0 -1
  292. package/dist/web/assets/ai-settings-section-Ezhw4Fef.js.br +0 -0
  293. package/dist/web/assets/ai-settings-section-Ezhw4Fef.js.gz +0 -0
  294. package/dist/web/assets/appearance-settings-section-CPOAp0fY.js.br +0 -0
  295. package/dist/web/assets/appearance-settings-section-CPOAp0fY.js.gz +0 -0
  296. package/dist/web/assets/apps-panel-Cz7_o-M4.js.br +0 -0
  297. package/dist/web/assets/apps-panel-Cz7_o-M4.js.gz +0 -0
  298. package/dist/web/assets/branch-review-tab-BPx3kHrM.js +0 -1
  299. package/dist/web/assets/branch-review-tab-BPx3kHrM.js.br +0 -0
  300. package/dist/web/assets/branch-review-tab-BPx3kHrM.js.gz +0 -0
  301. package/dist/web/assets/chat-tab-BadDM_j8.js +0 -1
  302. package/dist/web/assets/chat-tab-BadDM_j8.js.br +0 -0
  303. package/dist/web/assets/chat-tab-BadDM_j8.js.gz +0 -0
  304. package/dist/web/assets/chat-tab-IqAY4c7p.js +0 -15
  305. package/dist/web/assets/chat-tab-IqAY4c7p.js.br +0 -0
  306. package/dist/web/assets/chat-tab-IqAY4c7p.js.gz +0 -0
  307. package/dist/web/assets/code-editor-Dmitw9QS.js +0 -7
  308. package/dist/web/assets/code-editor-Dmitw9QS.js.br +0 -0
  309. package/dist/web/assets/code-editor-Dmitw9QS.js.gz +0 -0
  310. package/dist/web/assets/codex-reset-credit-button-D2hal4bG.js.br +0 -0
  311. package/dist/web/assets/codex-reset-credit-button-D2hal4bG.js.gz +0 -0
  312. package/dist/web/assets/conflict-editor-Cj_gUncw.js.br +0 -0
  313. package/dist/web/assets/conflict-editor-Cj_gUncw.js.gz +0 -0
  314. package/dist/web/assets/csv-preview-Be3ODNj0.js.br +0 -0
  315. package/dist/web/assets/csv-preview-Be3ODNj0.js.gz +0 -0
  316. package/dist/web/assets/database-viewer-B1b--4y8.js.br +0 -0
  317. package/dist/web/assets/database-viewer-B1b--4y8.js.gz +0 -0
  318. package/dist/web/assets/design-tab-8wi0IHss.js.br +0 -0
  319. package/dist/web/assets/design-tab-8wi0IHss.js.gz +0 -0
  320. package/dist/web/assets/designs-sidebar-panel-D5-1Q8zQ.js.br +0 -0
  321. package/dist/web/assets/designs-sidebar-panel-D5-1Q8zQ.js.gz +0 -0
  322. package/dist/web/assets/diff-viewer-Dcxk6UTG.js.br +0 -0
  323. package/dist/web/assets/diff-viewer-Dcxk6UTG.js.gz +0 -0
  324. package/dist/web/assets/edit-diff-preview-DxDAtYhi.js.br +0 -0
  325. package/dist/web/assets/editor-language-service-BVJQnTSV.js.br +0 -0
  326. package/dist/web/assets/editor-language-service-BVJQnTSV.js.gz +0 -0
  327. package/dist/web/assets/explorer-body-CTkrlrI3.js +0 -2
  328. package/dist/web/assets/explorer-body-CTkrlrI3.js.br +0 -0
  329. package/dist/web/assets/explorer-body-CTkrlrI3.js.gz +0 -0
  330. package/dist/web/assets/explorer-window-content-DH5AD3Ng.js.br +0 -0
  331. package/dist/web/assets/explorer-window-content-DH5AD3Ng.js.gz +0 -0
  332. package/dist/web/assets/extension-manager-section-BJr6ccWw.js.br +0 -0
  333. package/dist/web/assets/extension-manager-section-BJr6ccWw.js.gz +0 -0
  334. package/dist/web/assets/extension-webview-CYNXHd8D.js.br +0 -0
  335. package/dist/web/assets/extension-webview-CYNXHd8D.js.gz +0 -0
  336. package/dist/web/assets/files-settings-section-JX7o4lex.js.br +0 -0
  337. package/dist/web/assets/files-settings-section-JX7o4lex.js.gz +0 -0
  338. package/dist/web/assets/general-settings-section-kF94Mz5q.js.br +0 -0
  339. package/dist/web/assets/general-settings-section-kF94Mz5q.js.gz +0 -0
  340. package/dist/web/assets/git-log-panel-Crlp9ofM.js.br +0 -0
  341. package/dist/web/assets/git-log-panel-Crlp9ofM.js.gz +0 -0
  342. package/dist/web/assets/glide-data-grid-O6MO5dKU.js.br +0 -0
  343. package/dist/web/assets/glide-data-grid-O6MO5dKU.js.gz +0 -0
  344. package/dist/web/assets/group-chat-tab-DGLSGf37.js +0 -1
  345. package/dist/web/assets/group-chat-tab-DGLSGf37.js.br +0 -0
  346. package/dist/web/assets/group-chat-tab-DGLSGf37.js.gz +0 -0
  347. package/dist/web/assets/index-DQCw6d-2.js.br +0 -0
  348. package/dist/web/assets/index-DQCw6d-2.js.gz +0 -0
  349. package/dist/web/assets/keybindings-store-CJtEHFIQ.js +0 -1
  350. package/dist/web/assets/keyboard-shortcuts-section-CewWGwiF.js.br +0 -0
  351. package/dist/web/assets/keyboard-shortcuts-section-CewWGwiF.js.gz +0 -0
  352. package/dist/web/assets/language-servers-section-nricdxke.js.br +0 -0
  353. package/dist/web/assets/language-servers-section-nricdxke.js.gz +0 -0
  354. package/dist/web/assets/lsp-client-DRMEWb-z.js.br +0 -0
  355. package/dist/web/assets/lsp-client-DRMEWb-z.js.gz +0 -0
  356. package/dist/web/assets/markdown-renderer-D5-xliE9.js +0 -1
  357. package/dist/web/assets/markdown-renderer-Dab9Us6u.js.br +0 -0
  358. package/dist/web/assets/markdown-renderer-Dab9Us6u.js.gz +0 -0
  359. package/dist/web/assets/mobile-explorer-sheet-DtgdpvJ9.js.br +0 -0
  360. package/dist/web/assets/mobile-explorer-sheet-DtgdpvJ9.js.gz +0 -0
  361. package/dist/web/assets/new-design-dialog-Dd5KDB_p.js.br +0 -0
  362. package/dist/web/assets/new-design-dialog-Dd5KDB_p.js.gz +0 -0
  363. package/dist/web/assets/notification-store-D2vTyp_Q.js +0 -1
  364. package/dist/web/assets/panel-store-DrSH3Nhp.js.br +0 -0
  365. package/dist/web/assets/panel-store-DrSH3Nhp.js.gz +0 -0
  366. package/dist/web/assets/performance-panel-LMGefOQ2.js +0 -3
  367. package/dist/web/assets/performance-panel-LMGefOQ2.js.br +0 -0
  368. package/dist/web/assets/performance-panel-LMGefOQ2.js.gz +0 -0
  369. package/dist/web/assets/ppmbot-settings-section-D67u6gPi.js.br +0 -0
  370. package/dist/web/assets/ppmbot-settings-section-D67u6gPi.js.gz +0 -0
  371. package/dist/web/assets/problems-panel-DKgIw4uZ.js.br +0 -0
  372. package/dist/web/assets/problems-panel-DKgIw4uZ.js.gz +0 -0
  373. package/dist/web/assets/process-table-BIAgC_jG.js +0 -1
  374. package/dist/web/assets/process-table-BIAgC_jG.js.br +0 -0
  375. package/dist/web/assets/process-table-BIAgC_jG.js.gz +0 -0
  376. package/dist/web/assets/proxy-settings-section-CFiYcTBA.js.br +0 -0
  377. package/dist/web/assets/proxy-settings-section-CFiYcTBA.js.gz +0 -0
  378. package/dist/web/assets/query-audit-section-BybgiPsc.js.br +0 -0
  379. package/dist/web/assets/query-audit-section-BybgiPsc.js.gz +0 -0
  380. package/dist/web/assets/remote-desktop-clipboard-notice-Bs3fZSRw.js.br +0 -0
  381. package/dist/web/assets/remote-desktop-clipboard-notice-Bs3fZSRw.js.gz +0 -0
  382. package/dist/web/assets/remote-desktop-mobile-sheet-DgxTdWMh.js +0 -2
  383. package/dist/web/assets/remote-desktop-mobile-sheet-DgxTdWMh.js.br +0 -0
  384. package/dist/web/assets/remote-desktop-mobile-sheet-DgxTdWMh.js.gz +0 -0
  385. package/dist/web/assets/remote-desktop-mobile-view-DgGOfPVY.js.br +0 -0
  386. package/dist/web/assets/remote-desktop-mobile-view-DgGOfPVY.js.gz +0 -0
  387. package/dist/web/assets/remote-desktop-readiness-gate-DOWryrQx.js.br +0 -0
  388. package/dist/web/assets/remote-desktop-readiness-gate-DOWryrQx.js.gz +0 -0
  389. package/dist/web/assets/remote-desktop-window-content-7t0wQsHx.js +0 -1
  390. package/dist/web/assets/remote-desktop-window-content-7t0wQsHx.js.br +0 -0
  391. package/dist/web/assets/remote-desktop-window-content-7t0wQsHx.js.gz +0 -0
  392. package/dist/web/assets/schedules-settings-section-DGhG-b5O.js.br +0 -0
  393. package/dist/web/assets/schedules-settings-section-DGhG-b5O.js.gz +0 -0
  394. package/dist/web/assets/send-to-chat-B09VjsB5.js.br +0 -0
  395. package/dist/web/assets/send-to-chat-B09VjsB5.js.gz +0 -0
  396. package/dist/web/assets/services-panel-0klE3O4g.js.br +0 -0
  397. package/dist/web/assets/services-panel-0klE3O4g.js.gz +0 -0
  398. package/dist/web/assets/settings-body-CfqpqFfq.js.br +0 -0
  399. package/dist/web/assets/settings-body-CfqpqFfq.js.gz +0 -0
  400. package/dist/web/assets/settings-store-3jIBB8gx.js.br +0 -0
  401. package/dist/web/assets/settings-store-3jIBB8gx.js.gz +0 -0
  402. package/dist/web/assets/sql-query-editor-ALQ5_X0j.js.br +0 -0
  403. package/dist/web/assets/sql-query-editor-ALQ5_X0j.js.gz +0 -0
  404. package/dist/web/assets/sqlite-viewer-DKTty_jR.js.br +0 -0
  405. package/dist/web/assets/sqlite-viewer-DKTty_jR.js.gz +0 -0
  406. package/dist/web/assets/system-monitor-body-D6J6lq7-.js.br +0 -0
  407. package/dist/web/assets/system-monitor-body-D6J6lq7-.js.gz +0 -0
  408. package/dist/web/assets/system-monitor-tab-Di18zNNS.js +0 -1
  409. package/dist/web/assets/tab-host-window-content-DTcx2D0O.js.br +0 -0
  410. package/dist/web/assets/tab-host-window-content-DTcx2D0O.js.gz +0 -0
  411. package/dist/web/assets/team-member-sheet-CFSbPG6n.js +0 -2
  412. package/dist/web/assets/team-member-sheet-CFSbPG6n.js.br +0 -0
  413. package/dist/web/assets/team-member-sheet-CFSbPG6n.js.gz +0 -0
  414. package/dist/web/assets/team-member-window-content-VeI6DGeM.js +0 -1
  415. package/dist/web/assets/team-member-window-content-VeI6DGeM.js.br +0 -0
  416. package/dist/web/assets/team-member-window-content-VeI6DGeM.js.gz +0 -0
  417. package/dist/web/assets/terminal-tab-DgTfQKBI.js.br +0 -0
  418. package/dist/web/assets/terminal-tab-DgTfQKBI.js.gz +0 -0
  419. package/dist/web/assets/tool-cards-_fpYI1hB.js +0 -9
  420. package/dist/web/assets/tool-cards-_fpYI1hB.js.br +0 -0
  421. package/dist/web/assets/tool-cards-_fpYI1hB.js.gz +0 -0
  422. package/dist/web/assets/use-inline-blame-Dv111BKY.js.br +0 -0
  423. package/dist/web/assets/use-inline-blame-Dv111BKY.js.gz +0 -0
  424. package/dist/web/assets/use-lsp-CZTFJIXX.js.br +0 -0
  425. package/dist/web/assets/use-lsp-CZTFJIXX.js.gz +0 -0
  426. package/dist/web/assets/use-open-team-member-ElN3KmCI.js +0 -1
  427. package/dist/web/assets/use-process-kill-D7D9QvJG.js.br +0 -0
  428. package/dist/web/assets/use-process-kill-D7D9QvJG.js.gz +0 -0
  429. package/dist/web/assets/video-preview-DzwY3q9W.js.br +0 -0
  430. package/dist/web/assets/video-preview-DzwY3q9W.js.gz +0 -0
  431. package/dist/web/assets/voice-settings-section-B7zMHsuz.js.br +0 -0
  432. package/dist/web/assets/voice-settings-section-B7zMHsuz.js.gz +0 -0
  433. package/dist/web/assets/window-store-B4cbZ5rr.js +0 -1
  434. package/dist/web/assets/window-store-B4cbZ5rr.js.br +0 -0
  435. package/dist/web/assets/window-store-B4cbZ5rr.js.gz +0 -0
  436. package/src/web/components/chat/team-member-window-content.tsx +0 -66
  437. package/src/web/components/chat/team-working-bar.tsx +0 -62
  438. package/src/web/components/chat/use-open-team-member.ts +0 -41
  439. package/src/web/hooks/use-member-transcript-tail.ts +0 -95
  440. /package/dist/web/assets/{api-settings-BeINN5Dy.js → api-settings-BWgfXl7o.js} +0 -0
  441. /package/dist/web/assets/{api-settings-BeINN5Dy.js.br → api-settings-BWgfXl7o.js.br} +0 -0
  442. /package/dist/web/assets/{api-settings-BeINN5Dy.js.gz → api-settings-BWgfXl7o.js.gz} +0 -0
  443. /package/dist/web/assets/{libesm-CxeQSM3t.js → libesm-DAF5_F99.js} +0 -0
  444. /package/dist/web/assets/{libesm-CxeQSM3t.js.br → libesm-DAF5_F99.js.br} +0 -0
  445. /package/dist/web/assets/{libesm-CxeQSM3t.js.gz → libesm-DAF5_F99.js.gz} +0 -0
  446. /package/dist/web/assets/{onboarding-entry-DD3QSDiz.js → onboarding-entry-Bh-WE3vq.js} +0 -0
  447. /package/dist/web/assets/{onboarding-entry-DD3QSDiz.js.br → onboarding-entry-Bh-WE3vq.js.br} +0 -0
  448. /package/dist/web/assets/{onboarding-entry-DD3QSDiz.js.gz → onboarding-entry-Bh-WE3vq.js.gz} +0 -0
@@ -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"./icons-CO_II6D-.js";import{t as r}from"./explorer-body-CTkrlrI3.js";import"./api-client-F5Zi1sR0.js";import"./settings-store-3jIBB8gx.js";import"./portal-container-context-NFSuymMu.js";import"./panel-store-DrSH3Nhp.js";import"./window-store-B4cbZ5rr.js";import"./project-store-CCimwgGF.js";import"./tab-store-CUPgQIQz.js";import"./context-menu-CH1mvCwA.js";import"./file-store-DCU7_YyB.js";import"./use-is-mobile-CkO33jqU.js";import"./window-pip-registry-dxrBFfkP.js";import"./button-CsmGH5xa.js";import"./dialog-z8PLkL8n.js";import"./file-icons-Ed_yLyef.js";import{t as i}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{Gt as a,Wt as o,nn as s}from"./index-DQCw6d-2.js";var c=e(t(),1),l=n();function u(){let e=a(e=>e.isOpen),t=a(e=>e.close),n=a(e=>e.setSelectMode),u=s(e=>e.slices[o]?.path),d=s(e=>e.slices[o]?.inlineEdit?.kind===`rename`);(0,c.useEffect)(()=>{n(!1)},[u,n]);let f=e=>{d&&e.stopPropagation()};return e?(0,l.jsx)(i,{open:e,onClose:t,zIndex:45,className:`flex h-[var(--sheet-vh)] flex-col p-0`,children:(0,l.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col`,onTouchStart:f,onTouchMove:f,children:u?(0,l.jsx)(r,{windowId:o,initialPath:u,variant:`sheet`}):(0,l.jsx)(`div`,{className:`flex flex-1 items-center justify-center text-sm text-text-2`,children:`Loading…`})})}):null}export{u as MobileExplorerSheet};
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"./icons-CO_II6D-.js";import{t as r}from"./explorer-body-BBOcvwmV.js";import"./api-client-F5Zi1sR0.js";import"./settings-store-DIV25PM_.js";import"./portal-container-context-NFSuymMu.js";import"./panel-store-1X6yM3XZ.js";import"./window-store-vo1N70nK.js";import"./project-store-CCimwgGF.js";import"./tab-store-D33icgdA.js";import"./context-menu-CH1mvCwA.js";import"./file-store-DCU7_YyB.js";import"./use-is-mobile-CkO33jqU.js";import"./window-pip-registry-Bl--fK8-.js";import"./button-CsmGH5xa.js";import"./dialog-z8PLkL8n.js";import"./file-icons-Ed_yLyef.js";import{t as i}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{Kt as a,in as o,qt as s}from"./index-CIscPw4g.js";var c=e(t(),1),l=n();function u(){let e=s(e=>e.isOpen),t=s(e=>e.close),n=s(e=>e.setSelectMode),u=o(e=>e.slices[a]?.path),d=o(e=>e.slices[a]?.inlineEdit?.kind===`rename`);(0,c.useEffect)(()=>{n(!1)},[u,n]);let f=e=>{d&&e.stopPropagation()};return e?(0,l.jsx)(i,{open:e,onClose:t,zIndex:45,className:`flex h-[var(--sheet-vh)] flex-col p-0`,children:(0,l.jsx)(`div`,{className:`flex min-h-0 flex-1 flex-col`,onTouchStart:f,onTouchMove:f,children:u?(0,l.jsx)(r,{windowId:a,initialPath:u,variant:`sheet`}):(0,l.jsx)(`div`,{className:`flex flex-1 items-center justify-center text-sm text-text-2`,children:`Loading…`})})}):null}export{u as MobileExplorerSheet};
@@ -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{$n as r,pt as i,un as a}from"./icons-CO_II6D-.js";import"./api-client-F5Zi1sR0.js";import{n as o}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import{p as s}from"./panel-store-DrSH3Nhp.js";import"./window-store-B4cbZ5rr.js";import"./project-store-CCimwgGF.js";import"./chat-preparation-cache-DoS7sdal.js";import"./use-is-mobile-CkO33jqU.js";import{t as c}from"./button-CsmGH5xa.js";import"./dialog-z8PLkL8n.js";import"./mobile-bottom-sheet-CLic9ovp.js";import"./use-visual-viewport-C307OVeV.js";import{An as l,a as u,d,s as f}from"./index-DQCw6d-2.js";import{a as p}from"./api-settings-BeINN5Dy.js";import{t as m}from"./design-responsive-dialog-BhyR-zhE.js";var h=e(t(),1),g=n(),_=120,v=[{id:`page`,label:`Page`,hint:`A page, screen or prototype`,icon:i},{id:`slides`,label:`Slides`,hint:`A 1280×720 slide deck`,icon:r}];function y({projectName:e,onClose:t}){let[n,r]=(0,h.useState)(``),[i,y]=(0,h.useState)(`page`),[b,x]=(0,h.useState)(null),[S,C]=(0,h.useState)(``),[w,T]=(0,h.useState)(null),[E,D]=(0,h.useState)(!1);(0,h.useEffect)(()=>{let t=!1;return Promise.all([d(e),p().catch(()=>null)]).then(([e,n])=>{if(t)return;x(e);let r=n?s(n):void 0;C((e.find(e=>e.id===r)??e[0])?.id??``)}).catch(e=>{t||(x([]),T(e.message||`Could not load providers`))}),()=>{t=!0}},[e]);let O=n.trim(),k=!!O&&!!S&&!E,A=async()=>{if(k){D(!0),T(null);try{let n=await f(e,{title:O,kind:i});u(e),l({projectName:e,slug:n.slug,title:n.title,providerId:S,fresh:!0}),t()}catch(e){T(e.message||`Could not create the design`),D(!1)}}};return(0,g.jsx)(m,{open:!0,onClose:()=>{E||t()},title:`New design`,description:`The AI builds it in designs/ in this project, with a live preview beside the chat.`,footer:(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(c,{variant:`outline`,onClick:t,disabled:E,children:`Cancel`}),(0,g.jsxs)(c,{onClick:A,disabled:!k,children:[E&&(0,g.jsx)(a,{className:`size-4 animate-spin`}),` Create`]})]}),children:(0,g.jsxs)(`form`,{className:`flex flex-col gap-4`,onSubmit:e=>{e.preventDefault(),A()},children:[(0,g.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs font-medium text-text-secondary`,children:[`Title`,(0,g.jsx)(`input`,{autoFocus:!0,value:n,maxLength:_,onChange:e=>r(e.target.value),placeholder:`e.g. Pricing page`,className:`min-h-11 w-full rounded-md border border-border bg-background px-3 text-sm text-foreground placeholder:text-text-subtle focus:outline-none focus:ring-1 focus:ring-primary md:min-h-9`})]}),(0,g.jsx)(`div`,{role:`radiogroup`,"aria-label":`Kind`,className:`grid grid-cols-2 gap-2`,children:v.map(e=>(0,g.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":i===e.id,onClick:()=>y(e.id),className:o(`flex min-h-14 flex-col items-start gap-0.5 rounded-md border p-2 text-left`,i===e.id?`border-primary`:`border-border`),children:[(0,g.jsxs)(`span`,{className:`flex items-center gap-1.5 text-sm font-medium`,children:[(0,g.jsx)(e.icon,{className:`size-4`}),` `,e.label]}),(0,g.jsx)(`span`,{className:`text-xs text-text-subtle`,children:e.hint})]},e.id))}),(0,g.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs font-medium text-text-secondary`,children:[`AI provider`,b===null?(0,g.jsxs)(`span`,{className:`flex min-h-11 items-center gap-2 text-sm text-text-subtle`,children:[(0,g.jsx)(a,{className:`size-4 animate-spin`}),` Loading…`]}):b.length===0?(0,g.jsx)(`span`,{className:`text-sm text-text-subtle`,children:`No configured provider can run design sessions. Enable Claude or Codex in Settings.`}):(0,g.jsx)(`select`,{value:S,onChange:e=>C(e.target.value),className:`min-h-11 w-full rounded-md border border-border bg-background px-2 text-sm text-foreground md:min-h-9`,children:b.map(e=>(0,g.jsx)(`option`,{value:e.id,children:e.name},e.id))})]}),w&&(0,g.jsx)(`p`,{className:`text-xs text-destructive`,role:`alert`,children:w})]})})}export{y as NewDesignDialog};
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{$n as r,pt as i,un as a}from"./icons-CO_II6D-.js";import"./api-client-F5Zi1sR0.js";import{n as o}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import{p as s}from"./panel-store-1X6yM3XZ.js";import"./window-store-vo1N70nK.js";import"./project-store-CCimwgGF.js";import"./chat-preparation-cache-DoS7sdal.js";import"./use-is-mobile-CkO33jqU.js";import{t as c}from"./button-CsmGH5xa.js";import"./dialog-z8PLkL8n.js";import"./mobile-bottom-sheet-CLic9ovp.js";import"./use-visual-viewport-C307OVeV.js";import{Mn as l,a as u,d,s as f}from"./index-CIscPw4g.js";import{a as p}from"./api-settings-BWgfXl7o.js";import{t as m}from"./design-responsive-dialog-BhyR-zhE.js";var h=e(t(),1),g=n(),_=120,v=[{id:`page`,label:`Page`,hint:`A page, screen or prototype`,icon:i},{id:`slides`,label:`Slides`,hint:`A 1280×720 slide deck`,icon:r}];function y({projectName:e,onClose:t}){let[n,r]=(0,h.useState)(``),[i,y]=(0,h.useState)(`page`),[b,x]=(0,h.useState)(null),[S,C]=(0,h.useState)(``),[w,T]=(0,h.useState)(null),[E,D]=(0,h.useState)(!1);(0,h.useEffect)(()=>{let t=!1;return Promise.all([d(e),p().catch(()=>null)]).then(([e,n])=>{if(t)return;x(e);let r=n?s(n):void 0;C((e.find(e=>e.id===r)??e[0])?.id??``)}).catch(e=>{t||(x([]),T(e.message||`Could not load providers`))}),()=>{t=!0}},[e]);let O=n.trim(),k=!!O&&!!S&&!E,A=async()=>{if(k){D(!0),T(null);try{let n=await f(e,{title:O,kind:i});u(e),l({projectName:e,slug:n.slug,title:n.title,providerId:S,fresh:!0}),t()}catch(e){T(e.message||`Could not create the design`),D(!1)}}};return(0,g.jsx)(m,{open:!0,onClose:()=>{E||t()},title:`New design`,description:`The AI builds it in designs/ in this project, with a live preview beside the chat.`,footer:(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(c,{variant:`outline`,onClick:t,disabled:E,children:`Cancel`}),(0,g.jsxs)(c,{onClick:A,disabled:!k,children:[E&&(0,g.jsx)(a,{className:`size-4 animate-spin`}),` Create`]})]}),children:(0,g.jsxs)(`form`,{className:`flex flex-col gap-4`,onSubmit:e=>{e.preventDefault(),A()},children:[(0,g.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs font-medium text-text-secondary`,children:[`Title`,(0,g.jsx)(`input`,{autoFocus:!0,value:n,maxLength:_,onChange:e=>r(e.target.value),placeholder:`e.g. Pricing page`,className:`min-h-11 w-full rounded-md border border-border bg-background px-3 text-sm text-foreground placeholder:text-text-subtle focus:outline-none focus:ring-1 focus:ring-primary md:min-h-9`})]}),(0,g.jsx)(`div`,{role:`radiogroup`,"aria-label":`Kind`,className:`grid grid-cols-2 gap-2`,children:v.map(e=>(0,g.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":i===e.id,onClick:()=>y(e.id),className:o(`flex min-h-14 flex-col items-start gap-0.5 rounded-md border p-2 text-left`,i===e.id?`border-primary`:`border-border`),children:[(0,g.jsxs)(`span`,{className:`flex items-center gap-1.5 text-sm font-medium`,children:[(0,g.jsx)(e.icon,{className:`size-4`}),` `,e.label]}),(0,g.jsx)(`span`,{className:`text-xs text-text-subtle`,children:e.hint})]},e.id))}),(0,g.jsxs)(`label`,{className:`flex flex-col gap-1 text-xs font-medium text-text-secondary`,children:[`AI provider`,b===null?(0,g.jsxs)(`span`,{className:`flex min-h-11 items-center gap-2 text-sm text-text-subtle`,children:[(0,g.jsx)(a,{className:`size-4 animate-spin`}),` Loading…`]}):b.length===0?(0,g.jsx)(`span`,{className:`text-sm text-text-subtle`,children:`No configured provider can run design sessions. Enable Claude or Codex in Settings.`}):(0,g.jsx)(`select`,{value:S,onChange:e=>C(e.target.value),className:`min-h-11 w-full rounded-md border border-border bg-background px-2 text-sm text-foreground md:min-h-9`,children:b.map(e=>(0,g.jsx)(`option`,{value:e.id,children:e.name},e.id))})]}),w&&(0,g.jsx)(`p`,{className:`text-xs text-destructive`,role:`alert`,children:w})]})})}export{y as NewDesignDialog};
@@ -0,0 +1 @@
1
+ import"./vendor-markdown-QKPNiWEd.js";import"./vendor-ui-P9Ym7hCv.js";import"./api-client-F5Zi1sR0.js";import{cr as e}from"./index-CIscPw4g.js";export{e as useNotificationStore};
@@ -1 +1 @@
1
- import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t}from"./vendor-markdown-QKPNiWEd.js";import{E as n,_ as r,c as i,g as a,l as o,m as s,o as c,r as l,u,w as d,x as f,y as p}from"./api-client-F5Zi1sR0.js";import{t as m}from"./react-CzUPVyyG.js";import{r as h}from"./utils-btZ8C8-R.js";import{t as g}from"./window-store-B4cbZ5rr.js";import{i as _}from"./project-store-CCimwgGF.js";var v=`__dock__`,y=new Set([`terminal`,`system-monitor`,`problems`]),ee=new Set([`system-monitor`,`settings`,`problems`,`design`]),b=`__win__:`;function x(e){return`${b}${e}`}function S(e){return e.startsWith(b)}function C(e){return S(e)&&e.slice(8)||null}function te(e){return{id:x(e),tabs:[],activeTabId:null,tabHistory:[]}}function w(){return{id:v,tabs:[],activeTabId:null,tabHistory:[]}}function ne(){return`panel-${h()}`}function T(e=[],t=null){return{id:ne(),tabs:e,activeTabId:t,tabHistory:t?[t]:[]}}function re(e){return e?1:3}function E(e,t){return e.map(e=>e.filter(e=>e!==t)).filter(e=>e.length>0)}function ie(e,t){return!t||t===`__global__`?e:e.filter(e=>!e.projectId||e.projectId===t)}function D(e,t){for(let n=0;n<e.length;n++){let r=e[n].indexOf(t);if(r!==-1)return{row:n,col:r}}return null}function ae(e){let t=0;for(let n of Object.values(e))for(let e of n.tabs){let n=e.id.match(/^editor:untitled-(\d+)$/);n&&(t=Math.max(t,Number(n[1])))}return t+1}function O(e,t){switch(e){case`editor`:return t?.viewerKey?`editor:viewer:${t.viewerKey}`:t?.isUntitled?`editor:untitled-${t.untitledNumber??1}`:`editor:${t?.filePath??`untitled`}`;case`chat`:return`chat:${t?.providerId??`default`}/${t?.sessionId??h()}`;case`terminal`:return`terminal:${t?.terminalIndex??1}`;case`database`:return`database:${t?.connectionId??`default`}:${t?.tableName??``}`;case`sqlite`:return`sqlite:${t?.filePath??`default`}`;case`postgres`:return`postgres:${t?.connectionId??`default`}:${t?.tableName??``}`;case`extension`:return`extension:${String(t?.viewType??`unknown`).replace(/\.view$/,``)}`;case`git-diff`:return`git-diff:${t?.filePath??`unknown`}`;case`branch-review`:return`branch-review:${t?.projectName??`unknown`}`;case`conflict-editor`:return`conflict-editor:${t?.filePath??`unknown`}`;case`settings`:return`settings`;case`problems`:return`problems`;case`group`:return`group:${t?.groupId??`unknown`}`;case`design`:return`design:${t?.designSlug??`unknown`}`;default:return`${e}:${h()}`}}var oe=new Set([`ports`,`tunnels`]);function se(e){if(!e.tabs.some(e=>oe.has(e.type)))return e;let t=new Set(e.tabs.filter(e=>oe.has(e.type)).map(e=>e.id)),n=e.tabs.filter(e=>!t.has(e.id)),r=e.tabHistory.filter(e=>!t.has(e)),i=e.activeTabId&&!t.has(e.activeTabId)?e.activeTabId:r[r.length-1]??n[n.length-1]?.id??null;return{...e,tabs:n,tabHistory:r,activeTabId:i}}function k(e){let t={};for(let[n,r]of Object.entries(e.panels))t[n]=se(r);let n=e.dockPanel?se(e.dockPanel):e.dockPanel;return{...e,panels:t,dockPanel:n}}function ce(e){let t={...e,panels:{...e.panels}};for(let[e,n]of Object.entries(t.panels)){let r=n.tabs.map(e=>{if(e.id.startsWith(`tab-`)){let t=O(e.type,e.metadata);return{...e,id:t}}return e}),i=new Map;n.tabs.forEach((e,t)=>{e.id!==r[t].id&&i.set(e.id,r[t].id)});let a=i.get(n.activeTabId??``)??n.activeTabId,o=n.tabHistory.map(e=>i.get(e)??e);t.panels[e]={...n,tabs:r,activeTabId:a,tabHistory:o}}return t}var A=`ppm-panels-`,j=`ppm-tabs-`;function M(e){return`${A}${e}`}function N(e,t){try{let n={...t,updatedAt:new Date().toISOString()};localStorage.setItem(M(e),JSON.stringify(n)),e!==`__global__`&&fe(e,t)}catch{}}function le(e){try{let t=localStorage.getItem(M(e));if(t)return ue(ce(k(JSON.parse(t))))}catch{}let t=he(e);return t?ue(k(t)):null}function ue(e){let t=e.dock??{visible:!1,height:30},n;if(!e.dockPanel)n=w();else{let t=e.dockPanel.tabs.filter(e=>y.has(e.type)),r=new Set(t.map(e=>e.id)),i=e.dockPanel.tabHistory.filter(e=>r.has(e)),a=e.dockPanel.activeTabId&&r.has(e.dockPanel.activeTabId)?e.dockPanel.activeTabId:i[i.length-1]??t[t.length-1]?.id??null;n={...e.dockPanel,tabs:t,tabHistory:i,activeTabId:a}}return{...e,dock:t,dockPanel:n}}async function de(e){if(e===`__global__`)return null;try{let t={},n=localStorage.getItem(`ppm-auth-token`);n&&(t.Authorization=`Bearer ${n}`);let r=await fetch(`/api/project/${encodeURIComponent(e)}/workspace`,{headers:t});if(!r.ok)return null;let i=await r.json();return!i.ok||!i.data?null:{...i.data.layout,updatedAt:i.data.updatedAt}}catch{return null}}var P=new Map;function fe(e,t){let n=P.get(e);n&&clearTimeout(n),P.set(e,setTimeout(async()=>{P.delete(e);try{let n={"Content-Type":`application/json`},r=localStorage.getItem(`ppm-auth-token`);r&&(n.Authorization=`Bearer ${r}`);let i=await fetch(`/api/project/${encodeURIComponent(e)}/workspace`,{method:`PUT`,headers:n,body:JSON.stringify({layout:t})});if(i.ok){let t=await i.json();if(t.data?.updatedAt){let n=`${A}${e}`,r=localStorage.getItem(n);if(r){let e=JSON.parse(r);e.updatedAt=t.data.updatedAt,localStorage.setItem(n,JSON.stringify(e))}}}}catch{}},1500))}function pe(e,t){if(!e&&!t)return null;if(!e)return t;if(!t)return e;let n=new Date(e.updatedAt).getTime();return new Date(t.updatedAt).getTime()>=n?t:e}async function me(e){if(e===`__global__`)return!1;let t=await de(e);if(!t)return!1;let n=`${A}${e}`,r=null;try{let e=localStorage.getItem(n);r=e?JSON.parse(e):null}catch{}if(pe(r,t)!==t)return!1;try{let e={...k(t),updatedAt:t.updatedAt};return localStorage.setItem(n,JSON.stringify(e)),!0}catch{return!1}}function he(e){try{let t=localStorage.getItem(`${j}${e}`);if(!t)return null;let n=JSON.parse(t);if(!n.tabs?.length)return null;let r=T(n.tabs,n.activeTabId),i={panels:{[r.id]:r},grid:[[r.id]],focusedPanelId:r.id};return N(e,i),localStorage.removeItem(`${j}${e}`),i}catch{return null}}var ge=15,_e=85;function ve(e){return Math.min(_e,Math.max(ge,e))}function ye(e,t){let n=e.filter(e=>e!==t);return n.push(t),n.length>50&&n.shift(),n}function be(e){let t=e().panels[v];if(!t)return 0;let n=e().currentProject;return t.tabs.filter(e=>!e.projectId||!n||e.projectId===n).length}function xe(e){let t=e().currentProject;e().openInDock({type:`terminal`,title:`Terminal`,projectId:t??null,closable:!0,metadata:t?{projectName:t}:void 0})}function Se(e,t){return function(){let{dock:n}=t(),r=!n.visible;e({dock:{...n,visible:r}}),F(t),r&&be(t)===0&&xe(t)}}function Ce(e,t){return function(n){let{dock:r}=t();e({dock:{...r,visible:n}}),F(t)}}function we(e,t){return function(n){let{dock:r}=t();e({dock:{...r,height:ve(n)}}),F(t)}}function Te(e,t){return function(n){let{panels:r,dock:i}=t(),a=r.__dock__??w(),o=n;if(n.type===`terminal`&&!n.metadata?.terminalIndex){let e=Object.values(r).flatMap(e=>e.tabs).filter(e=>e.type===`terminal`).map(e=>{let t=e.id.match(/^terminal:(\d+)/);return t?parseInt(t[1],10):0}),t=e.length>0?Math.max(...e)+1:1;o={...n,metadata:{...n.metadata,terminalIndex:t}}}let s=O(o.type,o.metadata);if(a.tabs.find(e=>e.id===s))return e(e=>({dock:{...e.dock,visible:!0},panels:{...e.panels,[v]:{...a,activeTabId:s,tabHistory:ye(a.tabHistory,s)}}})),F(t),s;let c={...o,id:s},l=[...a.tabs,c],u=ye(a.tabHistory,s);return e(e=>({dock:{...e.dock,visible:!0},panels:{...e.panels,[v]:{...a,tabs:l,activeTabId:s,tabHistory:u}}})),F(t),s}}function Ee(e,t){return function(n,r){t().moveTab(n,r,v);let{dock:i}=t();e({dock:{...i,visible:!0}}),F(t)}}function F(e){let{currentProject:t,panels:n,grid:r,focusedPanelId:i,dock:a}=e();if(!t)return;let o=new Set(r.flat()),s={};for(let[e,t]of Object.entries(n))o.has(e)&&(s[e]=t);N(t,{panels:s,grid:r,focusedPanelId:i,dock:a,dockPanel:n.__dock__??w()})}function De(e,t,n){return{...n,[e]:t}}function I(e,t){return t[e]??{visible:!1,height:30}}function Oe(e,t){return t&&e.visible?{...e,visible:!1}:e}var L=`ppm-window-panels`,ke={terminal:!0,chat:!0,editor:!0,database:!0,sqlite:!0,postgres:!0,"git-diff":!0,"branch-review":!0,settings:!1,extension:!0,"extension-webview":!0,"conflict-editor":!0,"system-monitor":!1,"git-log":!0,"ai-resource":!0,group:!0,problems:!1,design:!1};function Ae(e){return typeof e==`string`&&ke[e]===!0}function je(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.id==`string`&&!!t.id&&typeof t.title==`string`&&Ae(t.type)}function Me(e){let t={};for(let[n,r]of Object.entries(e))!S(n)||r.tabs.length===0||(t[n]=r);return t}function R(e){try{let t=Me(e);Object.keys(t).length===0?localStorage.removeItem(L):localStorage.setItem(L,JSON.stringify(t))}catch{}}function Ne(){let e=null;try{e=localStorage.getItem(L)}catch{return{}}if(!e)return{};let t;try{t=JSON.parse(e)}catch{return{}}if(!t||typeof t!=`object`||Array.isArray(t))return{};let n={};for(let[e,r]of Object.entries(t)){if(!S(e)||!r||typeof r!=`object`)continue;let t=r;if(!Array.isArray(t.tabs))continue;let i=t.tabs.filter(je);if(i.length===0)continue;let a=new Set(i.map(e=>e.id)),o=Array.isArray(t.tabHistory)?t.tabHistory.filter(e=>typeof e==`string`&&a.has(e)):[];n[e]={id:e,tabs:i,activeTabId:typeof t.activeTabId==`string`&&a.has(t.activeTabId)?t.activeTabId:o[o.length-1]??i[i.length-1].id,tabHistory:o}}return n}function z(e,t){let n=e.flat();return t&&n.includes(t)?t:n[0]??null}function B(e){R(e().panels),F(e)}function V(e,t,n){if(t().panels[n]?.tabs.length){R(t().panels);return}e(e=>{let{[n]:t,...r}=e.panels;return{panels:r}}),R(t().panels);let r=C(n);r&&g.getState().close(r)}var H=!1;function Pe(e,t){if(H)return;H=!0;let n=Ne();Object.keys(n).length!==0&&e({panels:{...n,...t().panels}})}function Fe(e,t){return function(n,r){if(t().isMobile())return null;let i=t().panels[r]?.tabs.find(e=>e.id===n);if(!i||ee.has(i.type))return null;let a=g.getState();if(Object.keys(a.windows).length>=8)return null;let o=a.open(`tab-host`,{originPanelId:r,title:i.title}),s=x(o);e(e=>({panels:{...e.panels,[s]:te(o)}})),t().moveTab(n,r,s);let c=z(t().grid,r);return c&&e({focusedPanelId:c}),B(t),o}}function Ie(e,t){return function(n,r){let i=x(n),a=t().panels[i];if(!a)return;let o=Le(t(),r);if(o)for(let e of[...a.tabs])t().moveTab(e.id,i,o);e(e=>{let{[i]:t,...n}=e.panels,r=z(e.grid,o??e.focusedPanelId);return r?{panels:n,focusedPanelId:r}:{panels:n}}),B(t),g.getState().close(n)}}function Le(e,t){return t&&e.panels[t]&&!S(t)?t:z(e.grid,e.focusedPanelId)}function Re(e,t){let n={...e},r=[];for(let[i,a]of Object.entries(e)){if(!S(i))continue;let e=a.tabs.filter(e=>e.projectId!==t);if(e.length===a.tabs.length)continue;let o=C(i);if(e.length===0){delete n[i],o&&r.push(o);continue}let s=new Set(e.map(e=>e.id)),c=a.tabHistory.filter(e=>s.has(e));n[i]={...a,tabs:e,tabHistory:c,activeTabId:a.activeTabId&&s.has(a.activeTabId)?a.activeTabId:c[c.length-1]??e[e.length-1].id}}return{panels:n,windowIdsToClose:r}}var ze=new Set([`chat`,`design`]);function U(e){if(!e||!ze.has(e.type))return;let t=e.metadata?.sessionId;return typeof t==`string`&&t?t:void 0}function W(e,t){return e.new_chat_provider_mode===`follow-focus`&&t&&t!==`default`?t:e.default_provider||`claude`}function Be(e,t){return e.pinned&&!t.pinned?-1:!e.pinned&&t.pinned?1:G(t)-G(e)}function G(e){let t=e.updatedAt?Date.parse(e.updatedAt):NaN;if(Number.isFinite(t))return t;let n=Date.parse(e.createdAt);return Number.isFinite(n)?n:0}function K(e){return[...e].sort(Be)}function Ve(e,t){let n=e.findIndex(e=>e.id===t.id);return K(n===-1?[...e,t]:e.map((e,r)=>r===n?{...e,...t}:e))}function He(e,t){return e.filter(e=>e.id!==t)}function Ue(e,t,n){return e.map(e=>e.id===t?{...e,title:n}:e)}function We(e,t,n){return t===n?e:(e.some(e=>e.id===n)?e.filter(e=>e.id!==t):e).map(e=>e.id===t?{...e,id:n}:e)}function Ge(e,t,n){return K(e.map(e=>e.id===t?{...e,pinned:n}:e))}function Ke(e,t,n){return e.map(e=>e.id===t?{...e,tag:n}:e)}function qe(e,t){return e.map(e=>e.tag?.id===t?{...e,tag:null}:e)}function Je(e){let t=e.updatedAt?Date.parse(e.updatedAt):NaN;if(Number.isFinite(t))return t;let n=Date.parse(e.createdAt);return Number.isFinite(n)?n:0}function Ye(e,t,n=Date.now()){let r=n-t*24*60*60*1e3;return e.filter(e=>e.pinned||Je(e)>=r)}var Xe=50,Ze=3e4,Qe=[];function q(){return{project:null,sessions:Qe,hasMore:!1,tags:null,isSyncing:!1,lastSyncError:null,lastSyncedAt:null,hydrated:!1,tagsSeededAt:null}}var J=new Map;async function $e(e){return l.get(`${c(e.name)}/tags`)}var Y=m((e,t)=>{function i(n,i){let a=r(n),o=i({...t().byProject[a]??q(),project:n});return e({byProject:{...t().byProject,[a]:o}}),o}function a(e,t){let a=r(e),o=i(e,e=>({...e,sessions:t(e.sessions)}));n(p(a),{sessions:o.sessions,hasMore:o.hasMore})}function o(e,t){let a=r(e);i(e,e=>({...e,tags:t,tagsSeededAt:Date.now()})),n(f(a),t)}return{byProject:{},ensure:async e=>{let n=r(e);await s(e);let i=t().byProject[n];(!i||i.lastSyncedAt===null||Date.now()-i.lastSyncedAt>15e3)&&await t().sync(e)},sync:e=>{let a=r(e),o=J.get(a);if(o)return o;let s=(async()=>{i(e,e=>({...e,isSyncing:!0}));try{let r=new URLSearchParams({limit:String(Xe),offset:`0`}),o=await l.get(`${c(e.name)}/chat/sessions?${r}`),s=t().byProject[a]??q(),u=s.tagsSeededAt!==null&&Date.now()-s.tagsSeededAt<Ze,d=s.tags,m=s.tagsSeededAt;if(!u)try{d=await $e(e),m=Date.now()}catch{}let h=K(o.sessions);i(e,()=>({project:e,sessions:h,hasMore:o.hasMore,tags:d,tagsSeededAt:m,isSyncing:!1,lastSyncError:null,lastSyncedAt:Date.now(),hydrated:!0})),n(p(a),{sessions:h,hasMore:o.hasMore}),d&&n(f(a),d)}catch(t){i(e,e=>({...e,isSyncing:!1,lastSyncError:t instanceof Error?t.message:`Sync failed`}))}finally{J.delete(a)}})();return J.set(a,s),s},upsertSession:(e,t)=>a(e,e=>Ve(e,t)),removeSession:(e,t)=>a(e,e=>He(e,t)),renameSession:(e,t,n)=>a(e,e=>Ue(e,t,n)),replaceSessionId:(e,t,n)=>a(e,e=>We(e,t,n)),setPinned:(e,t,n)=>a(e,e=>Ge(e,t,n)),setSessionTag:(e,t,n)=>a(e,e=>Ke(e,t,n)),removeOlderThan:(e,t)=>a(e,e=>Ye(e,t)),onTagDeleted:(e,t)=>a(e,e=>qe(e,t)),seedTags:(e,t)=>o(e,t),refreshTags:async e=>{try{o(e,await $e(e))}catch{}}}});async function et(e,t){try{return await t(),!0}catch{return Y.getState().sync(e),!1}}a(async e=>{let t=r(e),[n,i]=await Promise.all([d(p(t)),d(f(t))]);Y.setState(r=>{let a=r.byProject[t]??q();return a.hydrated?r:{byProject:{...r.byProject,[t]:{...a,project:e,sessions:n?.sessions??a.sessions,hasMore:n?.hasMore??a.hasMore,tags:i??a.tags,hydrated:!0}}}})}),i(()=>{Y.setState({byProject:{}})});var tt=e(t(),1);function nt(e){return{name:e,path:_.getState().projects.find(t=>t.name===e)?.path??e}}function rt(e){let t=_(t=>e?t.projects.find(t=>t.name===e)?.path:void 0);return(0,tt.useMemo)(()=>e?{name:e,path:t??e}:null,[e,t])}function it(){let e=Y.getState();for(let t of Object.values(e.byProject))t.project&&e.sync(t.project)}typeof document<`u`&&document.addEventListener(`visibilitychange`,()=>{if(document.hidden)return;let e=Y.getState(),t=Date.now();for(let n of Object.values(e.byProject))n.project&&(n.lastSyncedAt===null||t-n.lastSyncedAt>15e3)&&e.sync(n.project)});var at=new Set([`settings`,`git-log`]),ot=new Set([`projects`,`git-status`,`git-graph`]);function st(e,t){if(!e)return null;let n=e.tabs.filter(e=>!e.projectId||e.projectId===t);if(n.length===0)return null;for(let t=e.tabHistory.length-1;t>=0;t--){let r=e.tabHistory[t];if(n.some(e=>e.id===r))return r}return n[n.length-1].id}function ct(e,t){let n=o(),i=e?u(r(nt(e))):null,a=n?W(n,t):null;return n&&a&&i?.some(e=>e.id===a)?{providerId:a,permissionMode:n.providers[a]?.permission_mode??`bypassPermissions`,permissionModeSource:`cache`}:{providerPending:!0,focusedProviderOnOpen:t}}function lt(e,t){if(e.permissionMode&&e.permissionModeSource!==`cache`)return{};let n=o()?.providers[t]?.permission_mode;return n?{permissionMode:n,permissionModeSource:`cache`}:{}}function X(e,t){let n=e.filter(e=>e!==t);return n.push(t),n.length>50&&n.shift(),n}function Z(e,t){let n=Date.now();return e.map(e=>e.id===t?{...e,metadata:{...e.metadata,lastActiveAt:n}}:e)}function ut(){let e=T(),t=w();return{panels:{[e.id]:e,[v]:t},grid:[[e.id]],focusedPanelId:e.id}}var Q=m()((e,t)=>{function n(){let{currentProject:e,panels:n,grid:r,focusedPanelId:i,dock:a}=t();if(!e)return;let o=new Set(r.flat()),s={};for(let[e,t]of Object.entries(n))o.has(e)&&(s[e]=t);N(e,{panels:s,grid:r,focusedPanelId:i,dock:a,dockPanel:n[v]})}function r(e){return Object.values(t().panels).find(t=>t.tabs.some(t=>t.id===e))}function i(e){return e??t().focusedPanelId}function a(e){return S(e)?t().focusedPanelId:e}return{...ut(),currentProject:null,lastFocusedChatProviders:{},projectGrids:{},projectFocused:{},dock:{visible:!1,height:30},projectDock:{},dockExpanded:!1,toggleDock:Se(e,t),setDockVisible:Ce(e,t),setDockHeight:we(e,t),toggleDockExpanded:()=>e(e=>({dockExpanded:!e.dockExpanded})),openInDock:Te(e,t),redockTab:Ee(e,t),popOutTab:Fe(e,t),redockFromWindow:Ie(e,t),switchProject:n=>{if(n!==`__global__`){let e=_.getState().projects.find(e=>e.name===n);e&&s(e)}Pe(e,t);let{currentProject:r,panels:i,grid:a,focusedPanelId:o,projectGrids:c,projectFocused:l,dock:u,projectDock:d}=t();if(r===n)return;let f={...c},p={...l},m=r?De(r,u,d):{...d};if(r){f[r]=a,p[r]=o;let e=new Set(a.flat()),t={};for(let[n,r]of Object.entries(i))e.has(n)&&(t[n]=r);N(r,{panels:t,grid:a,focusedPanelId:o,dock:u,dockPanel:i[v]})}if(f[n]){let t=f[n],r=p[n]??t[0]?.[0]??``,a=I(n,m),o=i[v];e({currentProject:n,panels:o?{...i,[v]:{...o,activeTabId:st(o,n)}}:i,grid:t,focusedPanelId:r,projectGrids:f,projectFocused:p,dock:a,projectDock:m});return}let h=le(n);if(h&&Object.keys(h.panels).length>0){let r=!1,a={};for(let[e,t]of Object.entries(h.panels)){let i=ie(t.tabs,n).filter(e=>!ot.has(e.type));i.length!==t.tabs.length&&(r=!0);let o=t.tabHistory.filter(e=>i.some(t=>t.id===e)),s=t.activeTabId&&i.some(e=>e.id===t.activeTabId)?t.activeTabId:o[o.length-1]??i[0]?.id??null;a[e]={...t,tabs:i,tabHistory:o,activeTabId:s}}let o=h.grid;for(let e of o.flat())if(!((a[e]?.tabs.length??0)>0)){if(o.flat().length<=1)break;o=E(o,e),delete a[e],r=!0}let s=o.flat().includes(h.focusedPanelId)?h.focusedPanelId:o.flat()[0]??h.focusedPanelId,c=i.__dock__??w(),l=h.dockPanel??w(),u=[...c.tabs];for(let e of l.tabs)u.some(t=>t.id===e.id)||u.push(e);let d={...c,tabs:u,tabHistory:[...new Set([...c.tabHistory,...l.tabHistory])].filter(e=>u.some(t=>t.id===e)),activeTabId:null};d.activeTabId=st(d,n);let g={...i,...a,[v]:d};f[n]=o,p[n]=s;let _=Oe(h.dock??I(n,m),t().isMobile());e({currentProject:n,panels:g,grid:o,focusedPanelId:s,projectGrids:f,projectFocused:p,dock:_,projectDock:m}),r&&N(n,{panels:a,grid:o,focusedPanelId:s,dock:_,dockPanel:d})}else{let t=T(),r=[[t.id]],a={...i,[t.id]:t};f[n]=r,p[n]=t.id;let o=I(n,m);N(n,{panels:{[t.id]:t},grid:r,focusedPanelId:t.id,dock:o,dockPanel:i[v]}),e({currentProject:n,panels:a,grid:r,focusedPanelId:t.id,projectGrids:f,projectFocused:p,dock:o,projectDock:m})}},reloadProject:n=>{let{projectGrids:r,projectFocused:i,projectDock:a,panels:o}=t(),s={...r},c={...i},l={...a};delete s[n],delete c[n],delete l[n];let u=r[n],d=u?new Set(u.flat()):new Set,f={...o};for(let e of d)e!==`__dock__`&&delete f[e];let p=f[v];if(p){let e=p.tabs.filter(e=>e.projectId!==n),t=new Set(e.map(e=>e.id));f[v]={...p,tabs:e,tabHistory:p.tabHistory.filter(e=>t.has(e)),activeTabId:p.activeTabId&&t.has(p.activeTabId)?p.activeTabId:e[e.length-1]?.id??null}}let m=Re(f,n);e({projectGrids:s,projectFocused:c,projectDock:l,panels:m.panels,currentProject:null}),R(m.panels);for(let e of m.windowIdsToClose)g.getState().close(e);t().switchProject(n)},setFocusedPanel:(n,r=!0)=>{if(S(n))return;let i=t().panels[n];i&&(e({focusedPanelId:n}),r&&$(i.tabs.find(e=>e.id===i.activeTabId)))},openTab:(r,o)=>{let s=t().isMobile(),c=s?t().grid[0]?.[0]??i(o):i(o);if(!t().panels[c])return``;if(r.type===`chat`&&!r.metadata?.sessionId&&!r.metadata?.providerId){let e=r.projectId??r.metadata?.projectName??t().currentProject??void 0,n=e?t().lastFocusedChatProviders[e]:void 0;r={...r,metadata:{...r.metadata,...ct(e,n)}}}else r.type===`chat`&&r.metadata&&!r.metadata.sessionId&&typeof r.metadata.providerId==`string`&&(r={...r,metadata:{...r.metadata,...lt(r.metadata,r.metadata.providerId)}});if(r.type===`terminal`&&!r.metadata?.terminalIndex){let e=Object.values(t().panels).flatMap(e=>e.tabs).filter(e=>e.type===`terminal`).map(e=>{let t=e.id.match(/^terminal:(\d+)/);return t?parseInt(t[1],10):0}),n=e.length>0?Math.max(...e)+1:1;r={...r,metadata:{...r.metadata,terminalIndex:n}}}let l=O(r.type,r.metadata);if(r.type===`chat`&&r.metadata?.sessionId){let i=r.metadata.sessionId;for(let r of Object.values(t().panels)){let t=r.tabs.find(e=>U(e)===i);if(t)return $(t),e(e=>({focusedPanelId:a(r.id),panels:{...e.panels,[r.id]:{...r,tabs:Z(r.tabs,t.id),activeTabId:t.id,tabHistory:X(r.tabHistory,t.id)}}})),n(),t.id}}if(r.type===`design`){let i=r.metadata?.designSlug,o=r.projectId??r.metadata?.projectName;for(let r of Object.values(t().panels)){let t=r.tabs.find(e=>e.type===`design`&&e.metadata?.designSlug===i&&(e.projectId??e.metadata?.projectName)===o);if(t)return e(e=>({focusedPanelId:a(r.id),panels:{...e.panels,[r.id]:{...r,tabs:Z(r.tabs,t.id),activeTabId:t.id,tabHistory:X(r.tabHistory,t.id)}}})),n(),t.id}}if(at.has(r.type))for(let r of Object.values(t().panels)){let t=r.tabs.find(e=>e.id===l);if(t)return e(e=>({focusedPanelId:a(r.id),panels:{...e.panels,[r.id]:{...r,tabs:Z(r.tabs,t.id),activeTabId:t.id,tabHistory:X(r.tabHistory,t.id)}}})),n(),t.id}if(s)for(let r of t().grid.flat()){let i=t().panels[r];if(!i)continue;let a=i.tabs.find(e=>e.id===l||e.id.startsWith(`${l}@`));if(a)return e(e=>({focusedPanelId:i.id,panels:{...e.panels,[i.id]:{...i,tabs:Z(i.tabs,a.id),activeTabId:a.id,tabHistory:X(i.tabHistory,a.id)}}})),n(),a.id}let u=t().panels[c],d=u.tabs.find(e=>e.id===l);if(d)return e(e=>({panels:{...e.panels,[c]:{...u,tabs:Z(u.tabs,d.id),activeTabId:d.id,tabHistory:X(u.tabHistory,d.id)}}})),n(),d.id;let f=Object.values(t().panels).some(e=>e.id!==c&&e.tabs.some(e=>e.id===l))?`${l}@${c}`:l,p={...r,id:f,metadata:{...r.metadata,lastActiveAt:Date.now()}};return e(e=>{let t=e.panels[c];return{focusedPanelId:c,panels:{...e.panels,[c]:{...t,tabs:[...t.tabs,p],activeTabId:f,tabHistory:X(t.tabHistory,f)}}}}),n(),f},closeTab:(i,a)=>{let o=a?t().panels[a]:r(i);if(!o)return;let s=o.id;if(i.startsWith(`terminal:`))try{localStorage.removeItem(`ppm:terminal-session:${i}`)}catch{}e(e=>{let t=e.panels[s],n=t.tabs.filter(e=>e.id!==i),r=t.tabHistory.filter(e=>e!==i),a=t.activeTabId;if(t.activeTabId===i){let e=r.length>0?r[r.length-1]:null;a=e&&n.some(t=>t.id===e)?e:n[n.length-1]?.id??null}let o=e.grid.flat().length,c=S(s)||o>1&&s!==`__dock__`;if(n.length===0&&c){let{[s]:t,...n}=e.panels,r=E(e.grid,s);return{panels:n,grid:r,focusedPanelId:e.focusedPanelId===s?r.flat()[0]??Object.keys(n)[0]:e.focusedPanelId}}return{panels:{...e.panels,[s]:{...t,tabs:n,activeTabId:a,tabHistory:r}}}}),n(),s===`__dock__`&&be(t)===0&&t().setDockVisible(!1),S(s)&&V(e,t,s)},setActiveTab:(i,o)=>{let s=o?t().panels[o]:r(i);if(!s)return;$(s.tabs.find(e=>e.id===i));let c=s.id;e(e=>{let t=e.panels[c];return{focusedPanelId:a(c),panels:{...e.panels,[c]:{...t,tabs:Z(t.tabs,i),activeTabId:i,tabHistory:X(t.tabHistory,i)}}}}),n()},updateTab:(t,i)=>{let a=r(t);a&&(e(e=>({panels:{...e.panels,[a.id]:{...a,tabs:a.tabs.map(e=>e.id===t?{...e,...i}:e)}}})),n())},reorderTab:(r,i,a)=>{let o=t().panels[i];if(!o)return;let s=o.tabs.findIndex(e=>e.id===r);if(s===-1||s===a)return;let c=[...o.tabs],[l]=c.splice(s,1);c.splice(a,0,l),e(e=>({panels:{...e.panels,[i]:{...o,tabs:c}}})),n()},moveTab:(r,i,a,o)=>{if(i===a)return;let s=t().panels[i],c=t().panels[a];if(!s||!c)return;let l=s.tabs.find(e=>e.id===r);if(!l)return;let u=s.tabs.filter(e=>e.id!==r),d=s.tabHistory.filter(e=>e!==r),f=s.activeTabId===r?d[d.length-1]??u[u.length-1]?.id??null:s.activeTabId,p=[...c.tabs];o===void 0?p.push(l):p.splice(o,0,l),e(e=>{let t=e.grid.flat().length,n=i===`__dock__`||S(i);if(u.length===0&&t>1&&!n){let{[i]:t,...n}=e.panels;return{panels:{...n,[a]:{...c,tabs:p,activeTabId:r,tabHistory:X(c.tabHistory,r)}},grid:E(e.grid,i),focusedPanelId:a}}return{focusedPanelId:a,panels:{...e.panels,[i]:{...s,tabs:u,activeTabId:f,tabHistory:d},[a]:{...c,tabs:p,activeTabId:r,tabHistory:X(c.tabHistory,r)}}}}),n(),S(i)&&V(e,t,i)},splitPanel:(r,i,a,o)=>{let{grid:s,panels:c}=t(),l=t().isMobile(),u=c[a];if(!u)return!1;let d=u.tabs.find(e=>e.id===i);if(!d)return!1;let f=D(s,o??a);if(!f)return!1;let p=r===`left`||r===`right`,m=r===`up`||r===`down`;if(p&&(s[f.row]?.length??0)>=re(l)||m&&s.length>=3)return!1;let h=T([d],d.id);h.tabHistory=[d.id];let g=u.tabs.filter(e=>e.id!==i),_=u.tabHistory.filter(e=>e!==i),v=u.activeTabId===i?_[_.length-1]??g[g.length-1]?.id??null:u.activeTabId,y;if(p)y=s.map((e,t)=>{if(t!==f.row)return e;let n=[...e],i=r===`right`?f.col+1:f.col;return n.splice(i,0,h.id),n});else{y=[...s];let e=r===`down`?f.row+1:f.row;y.splice(e,0,[h.id])}return e(e=>{let t=e.grid.flat().length,n={...e.panels,[h.id]:h};if(g.length===0&&t>1){let{[a]:e,...t}=n;n=t,y=E(y,a)}else n[a]={...u,tabs:g,activeTabId:v,tabHistory:_};return{panels:n,grid:y,focusedPanelId:h.id}}),n(),!0},closePanel:r=>{let{panels:i,grid:a}=t();if(a.flat().length<=1)return;let o=i[r];if(!o)return;D(a,r);let s=a.flat(),c=s.indexOf(r),l=c>0?s[c-1]:s[1],u=i[l];u&&(e(e=>{let{[r]:t,...n}=e.panels,i=[...u.tabs,...o.tabs],a=u.activeTabId??o.activeTabId;return{panels:{...n,[l]:{...u,tabs:i,activeTabId:a,tabHistory:[...u.tabHistory,...o.tabHistory]}},grid:E(e.grid,r),focusedPanelId:l}}),n())},getPanelForTab:e=>r(e),isMobile:()=>typeof window<`u`&&window.innerWidth<768}});function $(e){let t=Q.getState();if(e?.type!==`chat`||e.metadata?.providerPending)return;let n=e.projectId??e.metadata?.projectName??t.currentProject,r=e.metadata?.providerId??`claude`;r!==`default`&&(!n||t.lastFocusedChatProviders[n]===r||Q.setState({lastFocusedChatProviders:{...t.lastFocusedChatProviders,[n]:r}}))}Q.subscribe((e,t)=>{let n=e.panels[e.focusedPanelId],r=n?.tabs.find(e=>e.id===n.activeTabId),i=t.panels[e.focusedPanelId],a=i?.tabs.find(e=>e.id===i.activeTabId);r?.id===a?.id&&r?.metadata?.providerId===a?.metadata?.providerId&&e.currentProject===t.currentProject||$(r)});export{re as C,x as E,S,C as T,ee as _,Qe as a,ae as b,He as c,Ke as d,K as f,v as g,B as h,rt as i,Ue as l,U as m,nt as n,et as o,W as p,it as r,Y as s,Q as t,Ge as u,T as v,ie as w,me as x,D as y};
1
+ import{s as e}from"./rolldown-runtime-C5c2KzVm.js";import{C as t}from"./vendor-markdown-QKPNiWEd.js";import{E as n,_ as r,c as i,g as a,l as o,m as s,o as c,r as l,u,w as d,x as f,y as p}from"./api-client-F5Zi1sR0.js";import{t as m}from"./react-CzUPVyyG.js";import{r as h}from"./utils-btZ8C8-R.js";import{t as g}from"./window-store-vo1N70nK.js";import{i as _}from"./project-store-CCimwgGF.js";var v=`__dock__`,y=new Set([`terminal`,`system-monitor`,`problems`]),ee=new Set([`system-monitor`,`settings`,`problems`,`design`]),b=`__win__:`;function x(e){return`${b}${e}`}function S(e){return e.startsWith(b)}function C(e){return S(e)&&e.slice(8)||null}function te(e){return{id:x(e),tabs:[],activeTabId:null,tabHistory:[]}}function w(){return{id:v,tabs:[],activeTabId:null,tabHistory:[]}}function ne(){return`panel-${h()}`}function T(e=[],t=null){return{id:ne(),tabs:e,activeTabId:t,tabHistory:t?[t]:[]}}function re(e){return e?1:3}function E(e,t){return e.map(e=>e.filter(e=>e!==t)).filter(e=>e.length>0)}function ie(e,t){return!t||t===`__global__`?e:e.filter(e=>!e.projectId||e.projectId===t)}function D(e,t){for(let n=0;n<e.length;n++){let r=e[n].indexOf(t);if(r!==-1)return{row:n,col:r}}return null}function ae(e){let t=0;for(let n of Object.values(e))for(let e of n.tabs){let n=e.id.match(/^editor:untitled-(\d+)$/);n&&(t=Math.max(t,Number(n[1])))}return t+1}function O(e,t){switch(e){case`editor`:return t?.viewerKey?`editor:viewer:${t.viewerKey}`:t?.isUntitled?`editor:untitled-${t.untitledNumber??1}`:`editor:${t?.filePath??`untitled`}`;case`chat`:return`chat:${t?.providerId??`default`}/${t?.sessionId??h()}`;case`terminal`:return`terminal:${t?.terminalIndex??1}`;case`database`:return`database:${t?.connectionId??`default`}:${t?.tableName??``}`;case`sqlite`:return`sqlite:${t?.filePath??`default`}`;case`postgres`:return`postgres:${t?.connectionId??`default`}:${t?.tableName??``}`;case`extension`:return`extension:${String(t?.viewType??`unknown`).replace(/\.view$/,``)}`;case`git-diff`:return`git-diff:${t?.filePath??`unknown`}`;case`branch-review`:return`branch-review:${t?.projectName??`unknown`}`;case`conflict-editor`:return`conflict-editor:${t?.filePath??`unknown`}`;case`settings`:return`settings`;case`problems`:return`problems`;case`group`:return`group:${t?.groupId??`unknown`}`;case`design`:return`design:${t?.designSlug??`unknown`}`;default:return`${e}:${h()}`}}var oe=new Set([`ports`,`tunnels`]);function se(e){if(!e.tabs.some(e=>oe.has(e.type)))return e;let t=new Set(e.tabs.filter(e=>oe.has(e.type)).map(e=>e.id)),n=e.tabs.filter(e=>!t.has(e.id)),r=e.tabHistory.filter(e=>!t.has(e)),i=e.activeTabId&&!t.has(e.activeTabId)?e.activeTabId:r[r.length-1]??n[n.length-1]?.id??null;return{...e,tabs:n,tabHistory:r,activeTabId:i}}function k(e){let t={};for(let[n,r]of Object.entries(e.panels))t[n]=se(r);let n=e.dockPanel?se(e.dockPanel):e.dockPanel;return{...e,panels:t,dockPanel:n}}function ce(e){let t={...e,panels:{...e.panels}};for(let[e,n]of Object.entries(t.panels)){let r=n.tabs.map(e=>{if(e.id.startsWith(`tab-`)){let t=O(e.type,e.metadata);return{...e,id:t}}return e}),i=new Map;n.tabs.forEach((e,t)=>{e.id!==r[t].id&&i.set(e.id,r[t].id)});let a=i.get(n.activeTabId??``)??n.activeTabId,o=n.tabHistory.map(e=>i.get(e)??e);t.panels[e]={...n,tabs:r,activeTabId:a,tabHistory:o}}return t}var A=`ppm-panels-`,j=`ppm-tabs-`;function M(e){return`${A}${e}`}function N(e,t){try{let n={...t,updatedAt:new Date().toISOString()};localStorage.setItem(M(e),JSON.stringify(n)),e!==`__global__`&&fe(e,t)}catch{}}function le(e){try{let t=localStorage.getItem(M(e));if(t)return ue(ce(k(JSON.parse(t))))}catch{}let t=he(e);return t?ue(k(t)):null}function ue(e){let t=e.dock??{visible:!1,height:30},n;if(!e.dockPanel)n=w();else{let t=e.dockPanel.tabs.filter(e=>y.has(e.type)),r=new Set(t.map(e=>e.id)),i=e.dockPanel.tabHistory.filter(e=>r.has(e)),a=e.dockPanel.activeTabId&&r.has(e.dockPanel.activeTabId)?e.dockPanel.activeTabId:i[i.length-1]??t[t.length-1]?.id??null;n={...e.dockPanel,tabs:t,tabHistory:i,activeTabId:a}}return{...e,dock:t,dockPanel:n}}async function de(e){if(e===`__global__`)return null;try{let t={},n=localStorage.getItem(`ppm-auth-token`);n&&(t.Authorization=`Bearer ${n}`);let r=await fetch(`/api/project/${encodeURIComponent(e)}/workspace`,{headers:t});if(!r.ok)return null;let i=await r.json();return!i.ok||!i.data?null:{...i.data.layout,updatedAt:i.data.updatedAt}}catch{return null}}var P=new Map;function fe(e,t){let n=P.get(e);n&&clearTimeout(n),P.set(e,setTimeout(async()=>{P.delete(e);try{let n={"Content-Type":`application/json`},r=localStorage.getItem(`ppm-auth-token`);r&&(n.Authorization=`Bearer ${r}`);let i=await fetch(`/api/project/${encodeURIComponent(e)}/workspace`,{method:`PUT`,headers:n,body:JSON.stringify({layout:t})});if(i.ok){let t=await i.json();if(t.data?.updatedAt){let n=`${A}${e}`,r=localStorage.getItem(n);if(r){let e=JSON.parse(r);e.updatedAt=t.data.updatedAt,localStorage.setItem(n,JSON.stringify(e))}}}}catch{}},1500))}function pe(e,t){if(!e&&!t)return null;if(!e)return t;if(!t)return e;let n=new Date(e.updatedAt).getTime();return new Date(t.updatedAt).getTime()>=n?t:e}async function me(e){if(e===`__global__`)return!1;let t=await de(e);if(!t)return!1;let n=`${A}${e}`,r=null;try{let e=localStorage.getItem(n);r=e?JSON.parse(e):null}catch{}if(pe(r,t)!==t)return!1;try{let e={...k(t),updatedAt:t.updatedAt};return localStorage.setItem(n,JSON.stringify(e)),!0}catch{return!1}}function he(e){try{let t=localStorage.getItem(`${j}${e}`);if(!t)return null;let n=JSON.parse(t);if(!n.tabs?.length)return null;let r=T(n.tabs,n.activeTabId),i={panels:{[r.id]:r},grid:[[r.id]],focusedPanelId:r.id};return N(e,i),localStorage.removeItem(`${j}${e}`),i}catch{return null}}var ge=15,_e=85;function ve(e){return Math.min(_e,Math.max(ge,e))}function ye(e,t){let n=e.filter(e=>e!==t);return n.push(t),n.length>50&&n.shift(),n}function be(e){let t=e().panels[v];if(!t)return 0;let n=e().currentProject;return t.tabs.filter(e=>!e.projectId||!n||e.projectId===n).length}function xe(e){let t=e().currentProject;e().openInDock({type:`terminal`,title:`Terminal`,projectId:t??null,closable:!0,metadata:t?{projectName:t}:void 0})}function Se(e,t){return function(){let{dock:n}=t(),r=!n.visible;e({dock:{...n,visible:r}}),F(t),r&&be(t)===0&&xe(t)}}function Ce(e,t){return function(n){let{dock:r}=t();e({dock:{...r,visible:n}}),F(t)}}function we(e,t){return function(n){let{dock:r}=t();e({dock:{...r,height:ve(n)}}),F(t)}}function Te(e,t){return function(n){let{panels:r,dock:i}=t(),a=r.__dock__??w(),o=n;if(n.type===`terminal`&&!n.metadata?.terminalIndex){let e=Object.values(r).flatMap(e=>e.tabs).filter(e=>e.type===`terminal`).map(e=>{let t=e.id.match(/^terminal:(\d+)/);return t?parseInt(t[1],10):0}),t=e.length>0?Math.max(...e)+1:1;o={...n,metadata:{...n.metadata,terminalIndex:t}}}let s=O(o.type,o.metadata);if(a.tabs.find(e=>e.id===s))return e(e=>({dock:{...e.dock,visible:!0},panels:{...e.panels,[v]:{...a,activeTabId:s,tabHistory:ye(a.tabHistory,s)}}})),F(t),s;let c={...o,id:s},l=[...a.tabs,c],u=ye(a.tabHistory,s);return e(e=>({dock:{...e.dock,visible:!0},panels:{...e.panels,[v]:{...a,tabs:l,activeTabId:s,tabHistory:u}}})),F(t),s}}function Ee(e,t){return function(n,r){t().moveTab(n,r,v);let{dock:i}=t();e({dock:{...i,visible:!0}}),F(t)}}function F(e){let{currentProject:t,panels:n,grid:r,focusedPanelId:i,dock:a}=e();if(!t)return;let o=new Set(r.flat()),s={};for(let[e,t]of Object.entries(n))o.has(e)&&(s[e]=t);N(t,{panels:s,grid:r,focusedPanelId:i,dock:a,dockPanel:n.__dock__??w()})}function De(e,t,n){return{...n,[e]:t}}function I(e,t){return t[e]??{visible:!1,height:30}}function Oe(e,t){return t&&e.visible?{...e,visible:!1}:e}var L=`ppm-window-panels`,ke={terminal:!0,chat:!0,editor:!0,database:!0,sqlite:!0,postgres:!0,"git-diff":!0,"branch-review":!0,settings:!1,extension:!0,"extension-webview":!0,"conflict-editor":!0,"system-monitor":!1,"git-log":!0,"ai-resource":!0,group:!0,problems:!1,design:!1};function Ae(e){return typeof e==`string`&&ke[e]===!0}function je(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.id==`string`&&!!t.id&&typeof t.title==`string`&&Ae(t.type)}function Me(e){let t={};for(let[n,r]of Object.entries(e))!S(n)||r.tabs.length===0||(t[n]=r);return t}function R(e){try{let t=Me(e);Object.keys(t).length===0?localStorage.removeItem(L):localStorage.setItem(L,JSON.stringify(t))}catch{}}function Ne(){let e=null;try{e=localStorage.getItem(L)}catch{return{}}if(!e)return{};let t;try{t=JSON.parse(e)}catch{return{}}if(!t||typeof t!=`object`||Array.isArray(t))return{};let n={};for(let[e,r]of Object.entries(t)){if(!S(e)||!r||typeof r!=`object`)continue;let t=r;if(!Array.isArray(t.tabs))continue;let i=t.tabs.filter(je);if(i.length===0)continue;let a=new Set(i.map(e=>e.id)),o=Array.isArray(t.tabHistory)?t.tabHistory.filter(e=>typeof e==`string`&&a.has(e)):[];n[e]={id:e,tabs:i,activeTabId:typeof t.activeTabId==`string`&&a.has(t.activeTabId)?t.activeTabId:o[o.length-1]??i[i.length-1].id,tabHistory:o}}return n}function z(e,t){let n=e.flat();return t&&n.includes(t)?t:n[0]??null}function B(e){R(e().panels),F(e)}function V(e,t,n){if(t().panels[n]?.tabs.length){R(t().panels);return}e(e=>{let{[n]:t,...r}=e.panels;return{panels:r}}),R(t().panels);let r=C(n);r&&g.getState().close(r)}var H=!1;function Pe(e,t){if(H)return;H=!0;let n=Ne();Object.keys(n).length!==0&&e({panels:{...n,...t().panels}})}function Fe(e,t){return function(n,r){if(t().isMobile())return null;let i=t().panels[r]?.tabs.find(e=>e.id===n);if(!i||ee.has(i.type))return null;let a=g.getState();if(Object.keys(a.windows).length>=8)return null;let o=a.open(`tab-host`,{originPanelId:r,title:i.title}),s=x(o);e(e=>({panels:{...e.panels,[s]:te(o)}})),t().moveTab(n,r,s);let c=z(t().grid,r);return c&&e({focusedPanelId:c}),B(t),o}}function Ie(e,t){return function(n,r){let i=x(n),a=t().panels[i];if(!a)return;let o=Le(t(),r);if(o)for(let e of[...a.tabs])t().moveTab(e.id,i,o);e(e=>{let{[i]:t,...n}=e.panels,r=z(e.grid,o??e.focusedPanelId);return r?{panels:n,focusedPanelId:r}:{panels:n}}),B(t),g.getState().close(n)}}function Le(e,t){return t&&e.panels[t]&&!S(t)?t:z(e.grid,e.focusedPanelId)}function Re(e,t){let n={...e},r=[];for(let[i,a]of Object.entries(e)){if(!S(i))continue;let e=a.tabs.filter(e=>e.projectId!==t);if(e.length===a.tabs.length)continue;let o=C(i);if(e.length===0){delete n[i],o&&r.push(o);continue}let s=new Set(e.map(e=>e.id)),c=a.tabHistory.filter(e=>s.has(e));n[i]={...a,tabs:e,tabHistory:c,activeTabId:a.activeTabId&&s.has(a.activeTabId)?a.activeTabId:c[c.length-1]??e[e.length-1].id}}return{panels:n,windowIdsToClose:r}}var ze=new Set([`chat`,`design`]);function U(e){if(!e||!ze.has(e.type))return;let t=e.metadata?.sessionId;return typeof t==`string`&&t?t:void 0}function W(e,t){return e.new_chat_provider_mode===`follow-focus`&&t&&t!==`default`?t:e.default_provider||`claude`}function Be(e,t){return e.pinned&&!t.pinned?-1:!e.pinned&&t.pinned?1:G(t)-G(e)}function G(e){let t=e.updatedAt?Date.parse(e.updatedAt):NaN;if(Number.isFinite(t))return t;let n=Date.parse(e.createdAt);return Number.isFinite(n)?n:0}function K(e){return[...e].sort(Be)}function Ve(e,t){let n=e.findIndex(e=>e.id===t.id);return K(n===-1?[...e,t]:e.map((e,r)=>r===n?{...e,...t}:e))}function He(e,t){return e.filter(e=>e.id!==t)}function Ue(e,t,n){return e.map(e=>e.id===t?{...e,title:n}:e)}function We(e,t,n){return t===n?e:(e.some(e=>e.id===n)?e.filter(e=>e.id!==t):e).map(e=>e.id===t?{...e,id:n}:e)}function Ge(e,t,n){return K(e.map(e=>e.id===t?{...e,pinned:n}:e))}function Ke(e,t,n){return e.map(e=>e.id===t?{...e,tag:n}:e)}function qe(e,t){return e.map(e=>e.tag?.id===t?{...e,tag:null}:e)}function Je(e){let t=e.updatedAt?Date.parse(e.updatedAt):NaN;if(Number.isFinite(t))return t;let n=Date.parse(e.createdAt);return Number.isFinite(n)?n:0}function Ye(e,t,n=Date.now()){let r=n-t*24*60*60*1e3;return e.filter(e=>e.pinned||Je(e)>=r)}var Xe=50,Ze=3e4,Qe=[];function q(){return{project:null,sessions:Qe,hasMore:!1,tags:null,isSyncing:!1,lastSyncError:null,lastSyncedAt:null,hydrated:!1,tagsSeededAt:null}}var J=new Map;async function $e(e){return l.get(`${c(e.name)}/tags`)}var Y=m((e,t)=>{function i(n,i){let a=r(n),o=i({...t().byProject[a]??q(),project:n});return e({byProject:{...t().byProject,[a]:o}}),o}function a(e,t){let a=r(e),o=i(e,e=>({...e,sessions:t(e.sessions)}));n(p(a),{sessions:o.sessions,hasMore:o.hasMore})}function o(e,t){let a=r(e);i(e,e=>({...e,tags:t,tagsSeededAt:Date.now()})),n(f(a),t)}return{byProject:{},ensure:async e=>{let n=r(e);await s(e);let i=t().byProject[n];(!i||i.lastSyncedAt===null||Date.now()-i.lastSyncedAt>15e3)&&await t().sync(e)},sync:e=>{let a=r(e),o=J.get(a);if(o)return o;let s=(async()=>{i(e,e=>({...e,isSyncing:!0}));try{let r=new URLSearchParams({limit:String(Xe),offset:`0`}),o=await l.get(`${c(e.name)}/chat/sessions?${r}`),s=t().byProject[a]??q(),u=s.tagsSeededAt!==null&&Date.now()-s.tagsSeededAt<Ze,d=s.tags,m=s.tagsSeededAt;if(!u)try{d=await $e(e),m=Date.now()}catch{}let h=K(o.sessions);i(e,()=>({project:e,sessions:h,hasMore:o.hasMore,tags:d,tagsSeededAt:m,isSyncing:!1,lastSyncError:null,lastSyncedAt:Date.now(),hydrated:!0})),n(p(a),{sessions:h,hasMore:o.hasMore}),d&&n(f(a),d)}catch(t){i(e,e=>({...e,isSyncing:!1,lastSyncError:t instanceof Error?t.message:`Sync failed`}))}finally{J.delete(a)}})();return J.set(a,s),s},upsertSession:(e,t)=>a(e,e=>Ve(e,t)),removeSession:(e,t)=>a(e,e=>He(e,t)),renameSession:(e,t,n)=>a(e,e=>Ue(e,t,n)),replaceSessionId:(e,t,n)=>a(e,e=>We(e,t,n)),setPinned:(e,t,n)=>a(e,e=>Ge(e,t,n)),setSessionTag:(e,t,n)=>a(e,e=>Ke(e,t,n)),removeOlderThan:(e,t)=>a(e,e=>Ye(e,t)),onTagDeleted:(e,t)=>a(e,e=>qe(e,t)),seedTags:(e,t)=>o(e,t),refreshTags:async e=>{try{o(e,await $e(e))}catch{}}}});async function et(e,t){try{return await t(),!0}catch{return Y.getState().sync(e),!1}}a(async e=>{let t=r(e),[n,i]=await Promise.all([d(p(t)),d(f(t))]);Y.setState(r=>{let a=r.byProject[t]??q();return a.hydrated?r:{byProject:{...r.byProject,[t]:{...a,project:e,sessions:n?.sessions??a.sessions,hasMore:n?.hasMore??a.hasMore,tags:i??a.tags,hydrated:!0}}}})}),i(()=>{Y.setState({byProject:{}})});var tt=e(t(),1);function nt(e){return{name:e,path:_.getState().projects.find(t=>t.name===e)?.path??e}}function rt(e){let t=_(t=>e?t.projects.find(t=>t.name===e)?.path:void 0);return(0,tt.useMemo)(()=>e?{name:e,path:t??e}:null,[e,t])}function it(){let e=Y.getState();for(let t of Object.values(e.byProject))t.project&&e.sync(t.project)}typeof document<`u`&&document.addEventListener(`visibilitychange`,()=>{if(document.hidden)return;let e=Y.getState(),t=Date.now();for(let n of Object.values(e.byProject))n.project&&(n.lastSyncedAt===null||t-n.lastSyncedAt>15e3)&&e.sync(n.project)});var at=new Set([`settings`,`git-log`]),ot=new Set([`projects`,`git-status`,`git-graph`]);function st(e,t){if(!e)return null;let n=e.tabs.filter(e=>!e.projectId||e.projectId===t);if(n.length===0)return null;for(let t=e.tabHistory.length-1;t>=0;t--){let r=e.tabHistory[t];if(n.some(e=>e.id===r))return r}return n[n.length-1].id}function ct(e,t){let n=o(),i=e?u(r(nt(e))):null,a=n?W(n,t):null;return n&&a&&i?.some(e=>e.id===a)?{providerId:a,permissionMode:n.providers[a]?.permission_mode??`bypassPermissions`,permissionModeSource:`cache`}:{providerPending:!0,focusedProviderOnOpen:t}}function lt(e,t){if(e.permissionMode&&e.permissionModeSource!==`cache`)return{};let n=o()?.providers[t]?.permission_mode;return n?{permissionMode:n,permissionModeSource:`cache`}:{}}function X(e,t){let n=e.filter(e=>e!==t);return n.push(t),n.length>50&&n.shift(),n}function Z(e,t){let n=Date.now();return e.map(e=>e.id===t?{...e,metadata:{...e.metadata,lastActiveAt:n}}:e)}function ut(){let e=T(),t=w();return{panels:{[e.id]:e,[v]:t},grid:[[e.id]],focusedPanelId:e.id}}var Q=m()((e,t)=>{function n(){let{currentProject:e,panels:n,grid:r,focusedPanelId:i,dock:a}=t();if(!e)return;let o=new Set(r.flat()),s={};for(let[e,t]of Object.entries(n))o.has(e)&&(s[e]=t);N(e,{panels:s,grid:r,focusedPanelId:i,dock:a,dockPanel:n[v]})}function r(e){return Object.values(t().panels).find(t=>t.tabs.some(t=>t.id===e))}function i(e){return e??t().focusedPanelId}function a(e){return S(e)?t().focusedPanelId:e}return{...ut(),currentProject:null,lastFocusedChatProviders:{},projectGrids:{},projectFocused:{},dock:{visible:!1,height:30},projectDock:{},dockExpanded:!1,toggleDock:Se(e,t),setDockVisible:Ce(e,t),setDockHeight:we(e,t),toggleDockExpanded:()=>e(e=>({dockExpanded:!e.dockExpanded})),openInDock:Te(e,t),redockTab:Ee(e,t),popOutTab:Fe(e,t),redockFromWindow:Ie(e,t),switchProject:n=>{if(n!==`__global__`){let e=_.getState().projects.find(e=>e.name===n);e&&s(e)}Pe(e,t);let{currentProject:r,panels:i,grid:a,focusedPanelId:o,projectGrids:c,projectFocused:l,dock:u,projectDock:d}=t();if(r===n)return;let f={...c},p={...l},m=r?De(r,u,d):{...d};if(r){f[r]=a,p[r]=o;let e=new Set(a.flat()),t={};for(let[n,r]of Object.entries(i))e.has(n)&&(t[n]=r);N(r,{panels:t,grid:a,focusedPanelId:o,dock:u,dockPanel:i[v]})}if(f[n]){let t=f[n],r=p[n]??t[0]?.[0]??``,a=I(n,m),o=i[v];e({currentProject:n,panels:o?{...i,[v]:{...o,activeTabId:st(o,n)}}:i,grid:t,focusedPanelId:r,projectGrids:f,projectFocused:p,dock:a,projectDock:m});return}let h=le(n);if(h&&Object.keys(h.panels).length>0){let r=!1,a={};for(let[e,t]of Object.entries(h.panels)){let i=ie(t.tabs,n).filter(e=>!ot.has(e.type));i.length!==t.tabs.length&&(r=!0);let o=t.tabHistory.filter(e=>i.some(t=>t.id===e)),s=t.activeTabId&&i.some(e=>e.id===t.activeTabId)?t.activeTabId:o[o.length-1]??i[0]?.id??null;a[e]={...t,tabs:i,tabHistory:o,activeTabId:s}}let o=h.grid;for(let e of o.flat())if(!((a[e]?.tabs.length??0)>0)){if(o.flat().length<=1)break;o=E(o,e),delete a[e],r=!0}let s=o.flat().includes(h.focusedPanelId)?h.focusedPanelId:o.flat()[0]??h.focusedPanelId,c=i.__dock__??w(),l=h.dockPanel??w(),u=[...c.tabs];for(let e of l.tabs)u.some(t=>t.id===e.id)||u.push(e);let d={...c,tabs:u,tabHistory:[...new Set([...c.tabHistory,...l.tabHistory])].filter(e=>u.some(t=>t.id===e)),activeTabId:null};d.activeTabId=st(d,n);let g={...i,...a,[v]:d};f[n]=o,p[n]=s;let _=Oe(h.dock??I(n,m),t().isMobile());e({currentProject:n,panels:g,grid:o,focusedPanelId:s,projectGrids:f,projectFocused:p,dock:_,projectDock:m}),r&&N(n,{panels:a,grid:o,focusedPanelId:s,dock:_,dockPanel:d})}else{let t=T(),r=[[t.id]],a={...i,[t.id]:t};f[n]=r,p[n]=t.id;let o=I(n,m);N(n,{panels:{[t.id]:t},grid:r,focusedPanelId:t.id,dock:o,dockPanel:i[v]}),e({currentProject:n,panels:a,grid:r,focusedPanelId:t.id,projectGrids:f,projectFocused:p,dock:o,projectDock:m})}},reloadProject:n=>{let{projectGrids:r,projectFocused:i,projectDock:a,panels:o}=t(),s={...r},c={...i},l={...a};delete s[n],delete c[n],delete l[n];let u=r[n],d=u?new Set(u.flat()):new Set,f={...o};for(let e of d)e!==`__dock__`&&delete f[e];let p=f[v];if(p){let e=p.tabs.filter(e=>e.projectId!==n),t=new Set(e.map(e=>e.id));f[v]={...p,tabs:e,tabHistory:p.tabHistory.filter(e=>t.has(e)),activeTabId:p.activeTabId&&t.has(p.activeTabId)?p.activeTabId:e[e.length-1]?.id??null}}let m=Re(f,n);e({projectGrids:s,projectFocused:c,projectDock:l,panels:m.panels,currentProject:null}),R(m.panels);for(let e of m.windowIdsToClose)g.getState().close(e);t().switchProject(n)},setFocusedPanel:(n,r=!0)=>{if(S(n))return;let i=t().panels[n];i&&(e({focusedPanelId:n}),r&&$(i.tabs.find(e=>e.id===i.activeTabId)))},openTab:(r,o)=>{let s=t().isMobile(),c=s?t().grid[0]?.[0]??i(o):i(o);if(!t().panels[c])return``;if(r.type===`chat`&&!r.metadata?.sessionId&&!r.metadata?.providerId){let e=r.projectId??r.metadata?.projectName??t().currentProject??void 0,n=e?t().lastFocusedChatProviders[e]:void 0;r={...r,metadata:{...r.metadata,...ct(e,n)}}}else r.type===`chat`&&r.metadata&&!r.metadata.sessionId&&typeof r.metadata.providerId==`string`&&(r={...r,metadata:{...r.metadata,...lt(r.metadata,r.metadata.providerId)}});if(r.type===`terminal`&&!r.metadata?.terminalIndex){let e=Object.values(t().panels).flatMap(e=>e.tabs).filter(e=>e.type===`terminal`).map(e=>{let t=e.id.match(/^terminal:(\d+)/);return t?parseInt(t[1],10):0}),n=e.length>0?Math.max(...e)+1:1;r={...r,metadata:{...r.metadata,terminalIndex:n}}}let l=O(r.type,r.metadata);if(r.type===`chat`&&r.metadata?.sessionId){let i=r.metadata.sessionId;for(let r of Object.values(t().panels)){let t=r.tabs.find(e=>U(e)===i);if(t)return $(t),e(e=>({focusedPanelId:a(r.id),panels:{...e.panels,[r.id]:{...r,tabs:Z(r.tabs,t.id),activeTabId:t.id,tabHistory:X(r.tabHistory,t.id)}}})),n(),t.id}}if(r.type===`design`){let i=r.metadata?.designSlug,o=r.projectId??r.metadata?.projectName;for(let r of Object.values(t().panels)){let t=r.tabs.find(e=>e.type===`design`&&e.metadata?.designSlug===i&&(e.projectId??e.metadata?.projectName)===o);if(t)return e(e=>({focusedPanelId:a(r.id),panels:{...e.panels,[r.id]:{...r,tabs:Z(r.tabs,t.id),activeTabId:t.id,tabHistory:X(r.tabHistory,t.id)}}})),n(),t.id}}if(at.has(r.type))for(let r of Object.values(t().panels)){let t=r.tabs.find(e=>e.id===l);if(t)return e(e=>({focusedPanelId:a(r.id),panels:{...e.panels,[r.id]:{...r,tabs:Z(r.tabs,t.id),activeTabId:t.id,tabHistory:X(r.tabHistory,t.id)}}})),n(),t.id}if(s)for(let r of t().grid.flat()){let i=t().panels[r];if(!i)continue;let a=i.tabs.find(e=>e.id===l||e.id.startsWith(`${l}@`));if(a)return e(e=>({focusedPanelId:i.id,panels:{...e.panels,[i.id]:{...i,tabs:Z(i.tabs,a.id),activeTabId:a.id,tabHistory:X(i.tabHistory,a.id)}}})),n(),a.id}let u=t().panels[c],d=u.tabs.find(e=>e.id===l);if(d)return e(e=>({panels:{...e.panels,[c]:{...u,tabs:Z(u.tabs,d.id),activeTabId:d.id,tabHistory:X(u.tabHistory,d.id)}}})),n(),d.id;let f=Object.values(t().panels).some(e=>e.id!==c&&e.tabs.some(e=>e.id===l))?`${l}@${c}`:l,p={...r,id:f,metadata:{...r.metadata,lastActiveAt:Date.now()}};return e(e=>{let t=e.panels[c];return{focusedPanelId:c,panels:{...e.panels,[c]:{...t,tabs:[...t.tabs,p],activeTabId:f,tabHistory:X(t.tabHistory,f)}}}}),n(),f},closeTab:(i,a)=>{let o=a?t().panels[a]:r(i);if(!o)return;let s=o.id;if(i.startsWith(`terminal:`))try{localStorage.removeItem(`ppm:terminal-session:${i}`)}catch{}e(e=>{let t=e.panels[s],n=t.tabs.filter(e=>e.id!==i),r=t.tabHistory.filter(e=>e!==i),a=t.activeTabId;if(t.activeTabId===i){let e=r.length>0?r[r.length-1]:null;a=e&&n.some(t=>t.id===e)?e:n[n.length-1]?.id??null}let o=e.grid.flat().length,c=S(s)||o>1&&s!==`__dock__`;if(n.length===0&&c){let{[s]:t,...n}=e.panels,r=E(e.grid,s);return{panels:n,grid:r,focusedPanelId:e.focusedPanelId===s?r.flat()[0]??Object.keys(n)[0]:e.focusedPanelId}}return{panels:{...e.panels,[s]:{...t,tabs:n,activeTabId:a,tabHistory:r}}}}),n(),s===`__dock__`&&be(t)===0&&t().setDockVisible(!1),S(s)&&V(e,t,s)},setActiveTab:(i,o)=>{let s=o?t().panels[o]:r(i);if(!s)return;$(s.tabs.find(e=>e.id===i));let c=s.id;e(e=>{let t=e.panels[c];return{focusedPanelId:a(c),panels:{...e.panels,[c]:{...t,tabs:Z(t.tabs,i),activeTabId:i,tabHistory:X(t.tabHistory,i)}}}}),n()},updateTab:(t,i)=>{let a=r(t);a&&(e(e=>({panels:{...e.panels,[a.id]:{...a,tabs:a.tabs.map(e=>e.id===t?{...e,...i}:e)}}})),n())},reorderTab:(r,i,a)=>{let o=t().panels[i];if(!o)return;let s=o.tabs.findIndex(e=>e.id===r);if(s===-1||s===a)return;let c=[...o.tabs],[l]=c.splice(s,1);c.splice(a,0,l),e(e=>({panels:{...e.panels,[i]:{...o,tabs:c}}})),n()},moveTab:(r,i,a,o)=>{if(i===a)return;let s=t().panels[i],c=t().panels[a];if(!s||!c)return;let l=s.tabs.find(e=>e.id===r);if(!l)return;let u=s.tabs.filter(e=>e.id!==r),d=s.tabHistory.filter(e=>e!==r),f=s.activeTabId===r?d[d.length-1]??u[u.length-1]?.id??null:s.activeTabId,p=[...c.tabs];o===void 0?p.push(l):p.splice(o,0,l),e(e=>{let t=e.grid.flat().length,n=i===`__dock__`||S(i);if(u.length===0&&t>1&&!n){let{[i]:t,...n}=e.panels;return{panels:{...n,[a]:{...c,tabs:p,activeTabId:r,tabHistory:X(c.tabHistory,r)}},grid:E(e.grid,i),focusedPanelId:a}}return{focusedPanelId:a,panels:{...e.panels,[i]:{...s,tabs:u,activeTabId:f,tabHistory:d},[a]:{...c,tabs:p,activeTabId:r,tabHistory:X(c.tabHistory,r)}}}}),n(),S(i)&&V(e,t,i)},splitPanel:(r,i,a,o)=>{let{grid:s,panels:c}=t(),l=t().isMobile(),u=c[a];if(!u)return!1;let d=u.tabs.find(e=>e.id===i);if(!d)return!1;let f=D(s,o??a);if(!f)return!1;let p=r===`left`||r===`right`,m=r===`up`||r===`down`;if(p&&(s[f.row]?.length??0)>=re(l)||m&&s.length>=3)return!1;let h=T([d],d.id);h.tabHistory=[d.id];let g=u.tabs.filter(e=>e.id!==i),_=u.tabHistory.filter(e=>e!==i),v=u.activeTabId===i?_[_.length-1]??g[g.length-1]?.id??null:u.activeTabId,y;if(p)y=s.map((e,t)=>{if(t!==f.row)return e;let n=[...e],i=r===`right`?f.col+1:f.col;return n.splice(i,0,h.id),n});else{y=[...s];let e=r===`down`?f.row+1:f.row;y.splice(e,0,[h.id])}return e(e=>{let t=e.grid.flat().length,n={...e.panels,[h.id]:h};if(g.length===0&&t>1){let{[a]:e,...t}=n;n=t,y=E(y,a)}else n[a]={...u,tabs:g,activeTabId:v,tabHistory:_};return{panels:n,grid:y,focusedPanelId:h.id}}),n(),!0},closePanel:r=>{let{panels:i,grid:a}=t();if(a.flat().length<=1)return;let o=i[r];if(!o)return;D(a,r);let s=a.flat(),c=s.indexOf(r),l=c>0?s[c-1]:s[1],u=i[l];u&&(e(e=>{let{[r]:t,...n}=e.panels,i=[...u.tabs,...o.tabs],a=u.activeTabId??o.activeTabId;return{panels:{...n,[l]:{...u,tabs:i,activeTabId:a,tabHistory:[...u.tabHistory,...o.tabHistory]}},grid:E(e.grid,r),focusedPanelId:l}}),n())},getPanelForTab:e=>r(e),isMobile:()=>typeof window<`u`&&window.innerWidth<768}});function $(e){let t=Q.getState();if(e?.type!==`chat`||e.metadata?.providerPending)return;let n=e.projectId??e.metadata?.projectName??t.currentProject,r=e.metadata?.providerId??`claude`;r!==`default`&&(!n||t.lastFocusedChatProviders[n]===r||Q.setState({lastFocusedChatProviders:{...t.lastFocusedChatProviders,[n]:r}}))}Q.subscribe((e,t)=>{let n=e.panels[e.focusedPanelId],r=n?.tabs.find(e=>e.id===n.activeTabId),i=t.panels[e.focusedPanelId],a=i?.tabs.find(e=>e.id===i.activeTabId);r?.id===a?.id&&r?.metadata?.providerId===a?.metadata?.providerId&&e.currentProject===t.currentProject||$(r)});export{re as C,x as E,S,C as T,ee as _,Qe as a,ae as b,He as c,Ke as d,K as f,v as g,B as h,rt as i,Ue as l,U as m,nt as n,et as o,W as p,it as r,Y as s,Q as t,Ge as u,T as v,ie as w,me as x,D as y};
@@ -0,0 +1,3 @@
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{$t as r,A as i,Bt as a,En as o,Gr as s,j as c,rt as l,t as u}from"./icons-CO_II6D-.js";import{r as d}from"./api-client-F5Zi1sR0.js";import{_ as f,b as p,g as m,h,t as g,v as _,x as v,y}from"./settings-store-DIV25PM_.js";import{n as b}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import"./context-menu-CH1mvCwA.js";import{n as x}from"./use-is-mobile-CkO33jqU.js";import"./mobile-bottom-sheet-CLic9ovp.js";import"./use-visual-viewport-C307OVeV.js";import{cn as S,dn as C,fn as w,gn as ee,hn as T,ln as E,mn as D,pn as O,sn as te,un as k}from"./index-CIscPw4g.js";import{n as A,r as j,t as M}from"./format-bytes-DZ8bW_uF.js";import{n as N,t as P}from"./metric-chart-canvas-CVd7LO3m.js";var F=e(t(),1),I={wired:`Ethernet`,wireless:`Wi-Fi`,bluetooth:`Bluetooth`,bridge:`Bridge`,docker:`Docker`,infiniband:`InfiniBand`,multipass:`Multipass`,virtual:`Virtual`,vpn:`VPN`,other:`Other`},L=1024,R=e=>Math.round(e);function z(e){return I[e?.kind??`other`]}function ne(e,t,n){if(!n||n<=0)return null;let r=(e+t)*8/1e6;return Math.min(100,Math.max(0,r/n*100))}function B(e,t){return`${(e/L).toFixed(1)}/${(t/L).toFixed(1)} GB`}function V(e,t){let n=new Map((t?.disks??[]).map(e=>[e.id,e])),r=new Map((t?.nics??[]).map(e=>[e.id,e])),i=[{key:`cpu`,kind:`cpu`,label:`CPU`,sublabel:e.cpu.model,id:null,detail:`${R(e.cpu.total)}%`,percent:e.cpu.total},{key:`memory`,kind:`memory`,label:`Memory`,sublabel:B(e.mem.usedMB,e.mem.totalMB),id:null,detail:`${R(e.mem.percent)}%`,percent:e.mem.percent}];(e.disks??[]).forEach((e,t)=>{i.push({key:`disk:${e.id}`,kind:`disk`,label:`Disk ${t}`,sublabel:n.get(e.id)?.model??e.id,id:e.id,detail:e.available?`${R(e.busyPercent)}%`:`—`,percent:e.available?e.busyPercent:null})}),(e.nics??[]).forEach(e=>{let t=r.get(e.id);i.push({key:`nic:${e.id}`,kind:`nic`,label:z(t),sublabel:e.id,id:e.id,detail:e.available?M(e.rxBps+e.txBps):`—`,percent:e.available?ne(e.rxBps,e.txBps,e.linkMbps):null})}),e.gpus.forEach((e,t)=>{i.push({key:`gpu:${e.id??t}`,kind:`gpu`,label:`GPU ${t}`,sublabel:e.name,id:e.id??null,detail:`${R(e.utilPercent)}%`,percent:e.utilPercent})});let a=e.fans??[];if(a.length>0){let e=Math.max(...a.map(e=>e.rpm));i.push({key:`fans`,kind:`fans`,label:`Fans`,sublabel:`${a.length} sensor${a.length===1?``:`s`}`,id:null,detail:`${e} RPM`,percent:null})}return i}function re(e,t){return t&&e.some(e=>e.key===t)?t:e[0]?.key??`cpu`}function ie(e){let[t,n]=(0,F.useState)(null),r=(0,F.useRef)(!1),i=(0,F.useCallback)(async()=>{if(!r.current){r.current=!0;try{n(await d.get(`/api/system/hardware`))}catch{}finally{r.current=!1}}},[]);return(0,F.useEffect)(()=>{i()},[i]),(0,F.useEffect)(()=>{if(!t)return;let n=new Set([...t.disks.map(e=>e.id),...t.nics.map(e=>e.id),...t.gpus.map(e=>e.id)]);e.split(`,`).filter(Boolean).some(e=>!n.has(e))&&i()},[t,e,i]),t}var H=n();function U({title:e,subtitle:t,value:n,valueClassName:r}){return(0,H.jsxs)(`div`,{className:`flex items-baseline justify-between gap-3`,children:[(0,H.jsxs)(`div`,{className:`min-w-0`,children:[(0,H.jsx)(`h3`,{className:`text-base font-semibold truncate`,children:e}),t&&(0,H.jsx)(`p`,{className:`text-xs text-text-subtle truncate`,title:t,children:t})]}),n!==void 0&&(0,H.jsx)(`span`,{className:b(`text-2xl font-semibold tabular-nums shrink-0`,r),children:n})]})}function W({children:e}){return(0,H.jsx)(`dl`,{className:`grid grid-cols-2 @2xl:grid-cols-4 gap-x-4 gap-y-3`,children:e})}function G({label:e,value:t,title:n}){let r=t==null||t===``?`—`:String(t);return(0,H.jsxs)(`div`,{className:`min-w-0`,children:[(0,H.jsx)(`dt`,{className:`text-[11px] text-text-subtle truncate`,children:e}),(0,H.jsx)(`dd`,{className:`text-sm tabular-nums truncate`,title:n??r,children:r})]})}function K({series:e,maxValue:t,height:n=120,legend:r,caption:i,ceiling:a,grid:o,stacked:s}){return(0,H.jsxs)(`div`,{className:`space-y-1`,children:[(i||a)&&(0,H.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2 text-[11px] text-text-subtle`,children:[(0,H.jsx)(`span`,{className:`truncate`,children:i}),(0,H.jsx)(`span`,{className:`shrink-0 tabular-nums`,children:a})]}),(0,H.jsx)(P,{series:e,height:n,maxValue:t,grid:o,stacked:s}),r&&r.length>0&&(0,H.jsx)(`div`,{className:`flex flex-wrap gap-x-4 gap-y-1`,children:r.map((t,n)=>(0,H.jsxs)(`span`,{className:`flex items-center gap-1.5 text-[11px] text-text-subtle`,children:[(0,H.jsx)(`span`,{className:`size-2 rounded-full`,style:{background:e[n]?.color}}),t]},t))})]})}function q(e,t,n=200){return(0,F.useMemo)(()=>e.slice(-n).map(e=>t(e)??0),[e,n])}function J({segments:e}){let t=e.reduce((e,t)=>e+Math.max(0,t.value),0);return t<=0?null:(0,H.jsx)(`div`,{className:`flex h-3 w-full overflow-hidden rounded-sm bg-surface-hover`,role:`img`,"aria-label":e.map(e=>e.label).join(`, `),children:e.map(e=>(0,H.jsx)(`div`,{className:`h-full`,style:{width:`${Math.max(0,e.value)/t*100}%`,background:e.color},title:e.label},e.label))})}var Y={primary:`var(--color-primary)`,secondary:`var(--color-warning)`,success:`var(--color-success)`,error:`var(--color-error)`};function ae({cores:e,history:t,points:n=200,height:r=260}){let i=(0,F.useRef)(null),a=N(i),{cols:o,rows:s}=y(e.length,a),c=(0,F.useMemo)(()=>{let r=t.slice(-n),i=Array.from({length:e.length},()=>[]);for(let e of r){let t=e.system.cpu.cores;for(let e=0;e<i.length;e++)i[e].push(t[e]??0)}return i},[t,n,e.length]);if(e.length===0)return null;let l=Math.max(28,Math.floor(r/Math.max(1,s))-6);return(0,H.jsx)(`div`,{ref:i,className:`grid gap-1.5`,style:{gridTemplateColumns:`repeat(${Math.max(1,o)}, minmax(0, 1fr))`},"data-testid":`sysmon-core-grid`,"data-core-count":e.length,"data-cols":o,children:c.map((t,n)=>(0,H.jsx)(`div`,{className:`rounded-sm border border-border/70 overflow-hidden px-0.5`,title:`CPU ${n}: ${(e[n]??0).toFixed(0)}%`,children:(0,H.jsx)(P,{series:[{data:t,color:Y.primary}],height:l,maxValue:100})},n))})}function oe(e){if(e===void 0)return;let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),r=Math.floor(e%3600/60);return t>0?`${t}d ${n}h ${r}m`:`${n}h ${r}m`}var X=e=>e===void 0?void 0:`${(e/1e3).toFixed(2)} GHz`;function se({cpu:e,info:t,history:n,processCount:r}){let i=g(e=>e.sysmonTempUnit),a=g(e=>e.sysmonKernelTimes),o=g(e=>e.setSysmonKernelTimes),s=g(e=>e.sysmonCpuGraph),c=g(e=>e.setSysmonCpuGraph),l=g(e=>e.sysmonCpuBottomGraph),u=g(e=>e.setSysmonCpuBottomGraph),d=q(n,e=>e.system.cpu.total),y=q(n,e=>e.system.cpu.kernelPercent),b=q(n,e=>e.system.cpu.tempC),x=q(n,e=>e.system.cpu.powerW),j=q(n,e=>e.system.cpu.currentMHz),M=a&&e.kernelPercent!==void 0,N=p(n.map(e=>e.ts)),P=e=>N?`${e} ${N}`:e,I=(0,F.useMemo)(()=>{let t=n.slice(-200),r=e.cores.length,i=Array.from({length:r},()=>[]);for(let e of t){let t=e.system.cpu.cores;for(let e=0;e<r;e++)i[e].push(t[e]??0)}return i},[n,e.cores.length]),L=I.map(e=>({data:e,color:Y.primary})),R=I.map(e=>({data:e.map(e=>e/Math.max(1,I.length)),color:Y.primary})),z=()=>l===`none`?null:l===`temperature`?e.tempC===void 0?null:(0,H.jsx)(K,{grid:!0,height:100,caption:P(`Temperature`),ceiling:v(Math.max(...b,1),i),series:[{data:b,color:Y.error}]}):l===`power`?e.powerW===void 0?null:(0,H.jsx)(K,{grid:!0,height:100,caption:P(`Power draw`),ceiling:`${Math.max(...x,1).toFixed(1)} W`,series:[{data:x,color:Y.secondary}]}):e.currentMHz===void 0?null:(0,H.jsx)(K,{grid:!0,height:100,caption:P(`Clock speed`),ceiling:X(t?.maxMHz??Math.max(...j,1)),maxValue:t?.maxMHz,series:[{data:j,color:Y.success}]});return(0,H.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-detail-cpu`,children:[(0,H.jsx)(U,{title:`CPU`,subtitle:t?.name??e.model,value:`${e.total.toFixed(1)}%`}),(0,H.jsxs)(te,{children:[(0,H.jsx)(ee,{children:(0,H.jsxs)(`div`,{className:`space-y-3 select-none`,"data-testid":`sysmon-cpu-graphs`,children:[s===`logical`?(0,H.jsxs)(`div`,{className:`space-y-1`,children:[(0,H.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2 text-[11px] text-text-subtle`,children:[(0,H.jsx)(`span`,{className:`truncate`,children:P(`Utilisation`)}),(0,H.jsx)(`span`,{className:`shrink-0 tabular-nums`,children:`100%`})]}),(0,H.jsx)(ae,{cores:e.cores,history:n})]}):(0,H.jsx)(K,{grid:!0,maxValue:100,caption:P(`Utilisation`),ceiling:`100%`,stacked:s===`threads-stacked`,legend:s===`overall`&&M?[`Utilisation`,`Kernel`]:void 0,series:s===`threads`?L:s===`threads-stacked`?R:M?[{data:d,color:Y.primary},{data:y,color:Y.secondary}]:[{data:d,color:Y.primary}]}),z()]})}),(0,H.jsxs)(S,{children:[(0,H.jsxs)(O,{children:[(0,H.jsx)(T,{children:`Change top graph to`}),(0,H.jsx)(D,{children:(0,H.jsx)(k,{value:s,onValueChange:e=>c(e),children:_.map(e=>(0,H.jsx)(C,{value:e,"data-testid":`sysmon-cpu-graph-${e}`,children:f[e]},e))})})]}),(0,H.jsxs)(O,{children:[(0,H.jsx)(T,{children:`Change bottom graph to`}),(0,H.jsx)(D,{children:(0,H.jsx)(k,{value:l,onValueChange:e=>u(e),children:h.map(e=>(0,H.jsx)(C,{value:e,"data-testid":`sysmon-cpu-bottom-${e}`,children:m[e]},e))})})]}),(0,H.jsx)(w,{}),(0,H.jsx)(E,{onSelect:()=>o(!a),"data-testid":`sysmon-cpu-kernel-toggle`,children:a?`Hide kernel times`:`Show kernel times`})]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{label:`Speed`,value:X(e.currentMHz)}),(0,H.jsx)(G,{label:`Base speed`,value:X(t?.baseMHz)}),(0,H.jsx)(G,{label:`Max speed`,value:X(t?.maxMHz)}),(0,H.jsx)(G,{label:`Temperature`,value:v(e.tempC,i)}),(0,H.jsx)(G,{label:`Power`,value:e.powerW===void 0?void 0:`${e.powerW.toFixed(1)} W`}),(0,H.jsx)(G,{label:`Processes`,value:r}),(0,H.jsx)(G,{label:`Threads running`,value:e.threadCount}),(0,H.jsx)(G,{label:`Open handles`,value:e.handleCount}),(0,H.jsx)(G,{label:`Up time`,value:oe(e.uptimeSec)}),(0,H.jsx)(G,{label:`Sockets`,value:t?.sockets}),(0,H.jsx)(G,{label:`Cores`,value:t?.physicalCores}),(0,H.jsx)(G,{label:`Logical processors`,value:t?.logicalCores??e.cores.length}),(0,H.jsx)(G,{label:`Virtualisation`,value:t?.isVirtualMachine?`Running in a VM`:t?.virtualization}),(0,H.jsx)(G,{label:`L1 cache`,value:t?.l1CacheBytes===void 0?void 0:A(t.l1CacheBytes)}),(0,H.jsx)(G,{label:`L2 cache`,value:t?.l2CacheBytes===void 0?void 0:A(t.l2CacheBytes)}),(0,H.jsx)(G,{label:`L3 cache`,value:t?.l3CacheBytes===void 0?void 0:A(t.l3CacheBytes)}),(0,H.jsx)(G,{label:`Cpufreq driver`,value:t?.freqDriver}),(0,H.jsx)(G,{label:`Governor`,value:t?.freqGovernor}),(0,H.jsx)(G,{label:`Power preference`,value:t?.powerPreference})]})]})}function ce({mem:e,info:t,history:n}){let r=q(n,e=>e.system.mem.percent),i=q(n,e=>{let t=e.system.mem.swapTotalMB??0;return t>0?(e.system.mem.swapUsedMB??0)/t*100:0}),a=e.inUseBytes!==void 0,o=p(n.map(e=>e.ts)),s=e=>o?`${e} ${o}`:e,c=(e.swapTotalMB??0)>0;return(0,H.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-detail-memory`,children:[(0,H.jsx)(U,{title:`Memory`,subtitle:`${j(e.usedMB)} of ${j(e.totalMB)} in use`,value:`${e.percent.toFixed(1)}%`}),(0,H.jsx)(K,{grid:!0,maxValue:100,caption:s(`Memory usage`),ceiling:j(e.totalMB),series:[{data:r,color:Y.primary}]}),c&&(0,H.jsx)(K,{grid:!0,height:90,maxValue:100,caption:s(`Swap usage`),ceiling:j(e.swapTotalMB??0),series:[{data:i,color:Y.success}]}),a&&(0,H.jsxs)(`div`,{className:`space-y-2`,children:[(0,H.jsx)(J,{segments:[{label:`In use`,value:e.inUseBytes??0,color:`var(--color-primary)`},{label:`Modified`,value:e.modifiedBytes??0,color:`var(--color-warning)`},{label:`Standby`,value:e.standbyBytes??0,color:`var(--color-success)`},{label:`Free`,value:e.freeBytes??0,color:`var(--color-border)`}]}),(0,H.jsxs)(`div`,{className:`flex flex-wrap gap-x-4 gap-y-1 text-[11px] text-text-subtle`,children:[(0,H.jsxs)(`span`,{children:[`In use `,A(e.inUseBytes??0)]}),(0,H.jsxs)(`span`,{children:[`Modified `,A(e.modifiedBytes??0)]}),(0,H.jsxs)(`span`,{children:[`Standby `,A(e.standbyBytes??0)]}),(0,H.jsxs)(`span`,{children:[`Free `,A(e.freeBytes??0)]})]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{label:`Available`,value:j(e.availableMB)}),(0,H.jsx)(G,{label:`Cached`,value:e.cachedMB===void 0?void 0:j(e.cachedMB)}),(0,H.jsx)(G,{label:`Committed`,value:e.committedMB===void 0?void 0:`${j(e.committedMB)} / ${e.commitLimitMB===void 0?`?`:j(e.commitLimitMB)}`}),(0,H.jsx)(G,{label:`Swap`,value:e.swapTotalMB===void 0?void 0:`${j(e.swapUsedMB??0)} / ${j(e.swapTotalMB)}`}),(0,H.jsx)(G,{label:`Compressed (zram)`,value:e.zramCompressedMB===void 0?void 0:j(e.zramCompressedMB)}),(0,H.jsx)(G,{label:`Savings (zram)`,value:e.zramSavingsMB===void 0?void 0:j(e.zramSavingsMB)}),(0,H.jsx)(G,{label:`Slots used`,value:t===void 0?void 0:`${t.devices.length}${t.slotsTotal?` of ${t.slotsTotal}`:``}`}),(0,H.jsx)(G,{label:`Maximum capacity`,value:t?.maxCapacityBytes===void 0?void 0:A(t.maxCapacityBytes)})]}),t&&t.devices.length>0&&(0,H.jsxs)(`div`,{className:`space-y-1`,children:[(0,H.jsx)(`h4`,{className:`text-xs font-medium text-text-secondary`,children:`Slots`}),(0,H.jsx)(`div`,{className:`rounded-md border border-border divide-y divide-border`,children:t.devices.map(e=>(0,H.jsxs)(`div`,{className:`flex items-center justify-between gap-3 px-3 py-2 text-xs`,children:[(0,H.jsx)(`span`,{className:`font-medium shrink-0`,children:e.locator}),(0,H.jsx)(`span`,{className:`text-text-subtle truncate`,children:[e.manufacturer,e.ramType,e.formFactor,e.speedMts?`${e.speedMts} MT/s`:null].filter(Boolean).join(` · `)}),(0,H.jsx)(`span`,{className:`tabular-nums shrink-0`,children:A(e.sizeBytes)})]},e.locator))})]})]})}var le=90,ue=75;function de(e){return e>=le?`bg-error`:e>=ue?`bg-warning`:`bg-primary`}function fe({partitions:e}){return e.length===0?null:(0,H.jsxs)(`section`,{className:`space-y-2`,"data-testid":`sysmon-partitions`,children:[(0,H.jsx)(`h4`,{className:`text-sm font-medium`,children:`Partitions`}),(0,H.jsx)(`ul`,{className:`space-y-2`,children:e.map(e=>(0,H.jsx)(pe,{part:e},e.id))})]})}function pe({part:e}){let t=e.mounts.find(e=>e.usedBytes!==void 0&&e.totalBytes),n=t?Math.min(100,t.usedBytes/t.totalBytes*100):void 0;return(0,H.jsxs)(`li`,{className:`rounded-md border border-border px-3 py-2 space-y-1.5`,"data-testid":`sysmon-partition`,children:[(0,H.jsxs)(`div`,{className:`flex items-baseline justify-between gap-3`,children:[(0,H.jsx)(`span`,{className:`text-sm font-medium truncate`,title:e.devicePath,children:e.devicePath}),(0,H.jsxs)(`span`,{className:`text-[11px] text-text-subtle shrink-0 tabular-nums`,children:[e.filesystem??`—`,` · `,A(e.sizeBytes)]})]}),e.mounts.length===0?(0,H.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Not mounted`}):(0,H.jsxs)(H.Fragment,{children:[(0,H.jsx)(`p`,{className:`text-[11px] text-text-subtle truncate`,title:e.mounts.map(e=>e.mountPoint).join(`, `),children:e.mounts.map(e=>e.mountPoint).join(`, `)}),n===void 0?(0,H.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Usage unavailable`}):(0,H.jsxs)(`div`,{className:`space-y-1`,children:[(0,H.jsx)(`div`,{className:`h-1.5 w-full rounded-full bg-surface-hover overflow-hidden`,children:(0,H.jsx)(`div`,{className:b(`h-full rounded-full`,de(n)),style:{width:`${n}%`}})}),(0,H.jsxs)(`div`,{className:`flex items-baseline justify-between gap-2 text-[11px] text-text-subtle tabular-nums`,children:[(0,H.jsxs)(`span`,{children:[A(t.usedBytes),` of `,A(t.totalBytes)]}),(0,H.jsxs)(`span`,{children:[n.toFixed(0),`%`]})]})]})]})]})}var me={hdd:`Hard disk`,ssd:`SSD`,nvme:`NVMe`,emmc:`eMMC`,sd:`SD card`,optical:`Optical`,thumb:`Removable`,unknown:`Unknown`};function he({disk:e,info:t,index:n,history:r}){let i=g(e=>e.sysmonTempUnit),a=t=>t.system.disks?.find(t=>t.id===e.id),o=q(r,e=>a(e)?.busyPercent),s=q(r,e=>a(e)?.readBps),c=q(r,e=>a(e)?.writeBps);return(0,H.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-detail-disk`,"data-disk-id":e.id,children:[(0,H.jsx)(U,{title:`Disk ${n}`,subtitle:t?.model??e.id,value:e.available?`${e.busyPercent.toFixed(0)}%`:`—`}),(0,H.jsxs)(`div`,{className:`space-y-1`,children:[(0,H.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Active time`}),(0,H.jsx)(K,{maxValue:100,series:[{data:o,color:Y.primary}],height:90})]}),(0,H.jsxs)(`div`,{className:`space-y-1`,children:[(0,H.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Transfer rate`}),(0,H.jsx)(K,{height:90,legend:[`Read`,`Write`],series:[{data:s,color:Y.success},{data:c,color:Y.secondary}]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{label:`Read speed`,value:e.available?M(e.readBps):void 0}),(0,H.jsx)(G,{label:`Write speed`,value:e.available?M(e.writeBps):void 0}),(0,H.jsx)(G,{label:`Avg. response time`,value:e.available?`${e.responseMs.toFixed(2)} ms`:void 0}),(0,H.jsx)(G,{label:`Temperature`,value:v(e.tempC,i)}),(0,H.jsx)(G,{label:`Total read`,value:A(e.readTotal)}),(0,H.jsx)(G,{label:`Total written`,value:A(e.writeTotal)}),(0,H.jsx)(G,{label:`Capacity`,value:t===void 0?void 0:A(t.capacityBytes)}),(0,H.jsx)(G,{label:`Type`,value:t===void 0?void 0:me[t.kind]??t.kind}),(0,H.jsx)(G,{label:`System disk`,value:t===void 0?void 0:t.systemDisk?`Yes`:`No`}),(0,H.jsx)(G,{label:`Removable`,value:t===void 0?void 0:t.removable?`Yes`:`No`}),(0,H.jsx)(G,{label:`Rotation`,value:t?.rotationRpm===void 0?void 0:`${t.rotationRpm} RPM`}),(0,H.jsx)(G,{label:`Serial`,value:t?.serial})]}),(0,H.jsx)(fe,{partitions:t?.partitions??[]})]})}var ge={connected:`Connected`,connecting:`Connecting`,disconnected:`Disconnected`,unavailable:`Unavailable`,unknown:`Unknown`};function Z({nic:e,info:t,history:n}){let r=t=>t.system.nics?.find(t=>t.id===e.id),i=q(n,e=>r(e)?.rxBps),a=q(n,e=>r(e)?.txBps);return(0,H.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-detail-nic`,"data-nic-id":e.id,children:[(0,H.jsx)(U,{title:I[t?.kind??`other`],subtitle:[e.id,t?.deviceName].filter(Boolean).join(` · `),value:e.available?M(e.rxBps+e.txBps):`—`}),(0,H.jsx)(K,{legend:[`Receive`,`Send`],series:[{data:i,color:Y.primary},{data:a,color:Y.secondary}]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{label:`State`,value:ge[e.state]}),(0,H.jsx)(G,{label:`Receive`,value:e.available?M(e.rxBps):void 0}),(0,H.jsx)(G,{label:`Send`,value:e.available?M(e.txBps):void 0}),(0,H.jsx)(G,{label:`Maximum bitrate`,value:e.linkMbps===void 0?void 0:`${e.linkMbps} Mbps`}),(0,H.jsx)(G,{label:`Total received`,value:A(e.rxTotal)}),(0,H.jsx)(G,{label:`Total sent`,value:A(e.txTotal)}),(0,H.jsx)(G,{label:`Network name`,value:e.ssid}),(0,H.jsx)(G,{label:`Signal`,value:e.signalPercent===void 0?void 0:`${e.signalPercent}%`}),(0,H.jsx)(G,{label:`Frequency`,value:e.frequencyMHz===void 0?void 0:`${(e.frequencyMHz/1e3).toFixed(1)} GHz`}),(0,H.jsx)(G,{label:`Driver`,value:t?.driver}),(0,H.jsx)(G,{label:`Hardware address`,value:t?.mac}),(0,H.jsx)(G,{label:`IPv4`,value:t?.ipv4.join(`, `),title:t?.ipv4.join(`
2
+ `)}),(0,H.jsx)(G,{label:`IPv6`,value:t?.ipv6.join(`, `),title:t?.ipv6.join(`
3
+ `)})]})]})}function Q(e,t){if(!(e===void 0&&t===void 0))return`${e===void 0?`?`:`Gen ${e}`} x${t??`?`}`}function _e({gpu:e,info:t,index:n,history:r}){let i=g(e=>e.sysmonTempUnit),a=t=>t.system.gpus.find(t=>e.id?t.id===e.id:t.name===e.name),o=q(r,e=>a(e)?.utilPercent),s=q(r,e=>a(e)?.encodePercent),c=q(r,e=>a(e)?.decodePercent),l=e.vramTotalMB>0,u=!l&&e.sharedTotalMB!==void 0,d=q(r,e=>{let t=a(e);return l?t?.vramUsedMB:t?.sharedUsedMB}),f=l?e.vramTotalMB:e.sharedTotalMB??0,m=e.encodePercent!==void 0||e.decodePercent!==void 0,h=t?.encodeDecodeShared===!0,_=p(r.map(e=>e.ts)),y=e=>_?`${e} ${_}`:e;return(0,H.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-detail-gpu`,"data-gpu-id":e.id??n,children:[(0,H.jsx)(U,{title:`GPU ${n}`,subtitle:e.name,value:`${e.utilPercent.toFixed(0)}%`}),(0,H.jsx)(K,{grid:!0,maxValue:100,caption:y(`Utilisation`),ceiling:`100%`,series:[{data:o,color:Y.primary}]}),m&&(0,H.jsx)(K,{grid:!0,height:90,maxValue:100,caption:y(h?`Video encode/decode utilisation`:`Video encode and decode utilisation`),ceiling:`100%`,legend:h?void 0:[`Encode`,`Decode`],series:h?[{data:s,color:Y.secondary}]:[{data:s,color:Y.secondary},{data:c,color:Y.error}]}),(l||u)&&(0,H.jsx)(K,{grid:!0,height:90,maxValue:f,caption:y(l?`Video memory usage`:`Memory usage`),ceiling:j(f),series:[{data:d,color:Y.success}]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{label:`Video memory`,value:l?`${j(e.vramUsedMB)} / ${j(e.vramTotalMB)}`:void 0}),(0,H.jsx)(G,{label:l?`Shared memory`:`Memory usage`,value:e.sharedTotalMB===void 0?void 0:`${j(e.sharedUsedMB??0)} / ${j(e.sharedTotalMB)}`}),(0,H.jsx)(G,{label:h?`Video encode/decode`:`Video encode`,value:e.encodePercent===void 0?void 0:`${e.encodePercent.toFixed(0)}%`}),!h&&(0,H.jsx)(G,{label:`Video decode`,value:e.decodePercent===void 0?void 0:`${e.decodePercent.toFixed(0)}%`}),(0,H.jsx)(G,{label:`Clock`,value:e.clockMHz===void 0?void 0:`${e.clockMHz} MHz${e.clockMaxMHz?` / ${e.clockMaxMHz}`:``}`}),(0,H.jsx)(G,{label:`Memory clock`,value:e.memClockMHz===void 0?void 0:`${e.memClockMHz} MHz${e.memClockMaxMHz?` / ${e.memClockMaxMHz}`:``}`}),(0,H.jsx)(G,{label:`Power`,value:e.powerW===void 0?void 0:`${e.powerW.toFixed(1)} W${e.powerMaxW?` / ${e.powerMaxW}`:``}`}),(0,H.jsx)(G,{label:`Temperature`,value:v(e.tempC,i)}),(0,H.jsx)(G,{label:`Vendor`,value:t?.vendor}),(0,H.jsx)(G,{label:`Driver`,value:t?.driver===void 0?void 0:[t.driver,t.driverVersion].filter(Boolean).join(` `)}),(0,H.jsx)(G,{label:`OpenGL`,value:t?.openglVersion}),(0,H.jsx)(G,{label:`Vulkan`,value:t?.vulkanVersion}),(0,H.jsx)(G,{label:`PCI bus address`,value:e.id}),(0,H.jsx)(G,{label:`PCIe link`,value:Q(t?.pcieGen,t?.pcieLanes)}),(0,H.jsx)(G,{label:`PCIe maximum`,value:Q(t?.pcieMaxGen,t?.pcieMaxLanes)})]})]})}function ve({fans:e}){let t=g(e=>e.sysmonTempUnit),n=e.length>0?Math.max(...e.map(e=>e.rpm)):0;return(0,H.jsxs)(`div`,{className:`space-y-4`,"data-testid":`sysmon-detail-fans`,"data-fan-count":e.length,children:[(0,H.jsx)(U,{title:`Fans`,subtitle:`${e.length} sensor${e.length===1?``:`s`}`,value:`${n} RPM`}),(0,H.jsx)(`div`,{className:`rounded-md border border-border divide-y divide-border`,children:e.map(e=>(0,H.jsxs)(`div`,{className:`px-3 py-2 space-y-2`,"data-testid":`sysmon-fan-row`,children:[(0,H.jsxs)(`div`,{className:`flex items-baseline justify-between gap-3`,children:[(0,H.jsx)(`span`,{className:`text-sm font-medium truncate`,title:e.id,children:e.label}),(0,H.jsxs)(`span`,{className:`text-sm tabular-nums shrink-0`,children:[e.rpm,` RPM`]})]}),(0,H.jsxs)(W,{children:[(0,H.jsx)(G,{label:`Duty cycle`,value:e.pwmPercent===void 0?void 0:`${e.pwmPercent.toFixed(0)}%`}),(0,H.jsx)(G,{label:e.tempName??`Temperature`,value:v(e.tempC,t)})]})]},e.id))})]})}var ye={cpu:l,memory:r,disk:a,nic:s,gpu:o,fans:u};function be(e){return e>80?`bg-error`:e>50?`bg-warning`:`bg-primary`}function xe({entry:e,selected:t,showChevron:n,onSelect:r}){let i=ye[e.kind];return(0,H.jsxs)(`button`,{type:`button`,onClick:()=>r(e.key),"aria-current":t,"data-testid":`sysmon-device-row`,"data-device-key":e.key,className:b(`w-full min-h-11 px-3 py-2 flex items-center gap-3 text-left transition-colors`,t?`bg-primary/10 text-text-primary`:`hover:bg-surface-hover`),children:[(0,H.jsx)(i,{className:`size-4 shrink-0 text-text-subtle`}),(0,H.jsxs)(`span`,{className:`flex-1 min-w-0`,children:[(0,H.jsx)(`span`,{className:`block text-sm truncate`,children:e.label}),(0,H.jsx)(`span`,{className:`block text-[11px] text-text-subtle truncate`,title:e.sublabel,children:e.sublabel}),e.percent!==null&&(0,H.jsx)(`span`,{className:`mt-1 block h-1 w-full rounded-full bg-surface-hover overflow-hidden`,children:(0,H.jsx)(`span`,{className:b(`block h-full transition-[width]`,be(e.percent)),style:{width:`${Math.max(1,Math.min(100,e.percent))}%`}})})]}),(0,H.jsx)(`span`,{className:`text-xs tabular-nums text-text-secondary shrink-0`,children:e.detail}),n&&(0,H.jsx)(c,{className:`size-4 shrink-0 text-text-subtle`})]})}function $({entry:e,system:t,inventory:n,history:r}){switch(e.kind){case`cpu`:return(0,H.jsx)(se,{cpu:t.cpu,info:n?.cpu,history:r,processCount:t.processCount});case`memory`:return(0,H.jsx)(ce,{mem:t.mem,info:n?.memory,history:r});case`disk`:{let i=(t.disks??[]).findIndex(t=>t.id===e.id),a=i>=0?t.disks?.[i]:void 0;return a?(0,H.jsx)(he,{disk:a,index:i,info:n?.disks.find(e=>e.id===a.id),history:r}):null}case`nic`:{let i=(t.nics??[]).find(t=>t.id===e.id);return i?(0,H.jsx)(Z,{nic:i,info:n?.nics.find(e=>e.id===i.id),history:r}):null}case`gpu`:{let i=t.gpus.findIndex(t=>e.id?t.id===e.id:!0),a=i>=0?t.gpus[i]:void 0;return a?(0,H.jsx)(_e,{gpu:a,index:i,info:n?.gpus.find(e=>e.id===a.id),history:r}):null}case`fans`:return(0,H.jsx)(ve,{fans:t.fans??[]});default:return null}}function Se({system:e,history:t,device:n,onDeviceChange:r}){let a=x(),o=ie((0,F.useMemo)(()=>[...(e.disks??[]).map(e=>e.id),...(e.nics??[]).map(e=>e.id),...e.gpus.map(e=>e.id).filter(e=>!!e)].join(`,`),[e.disks,e.nics,e.gpus])),s=(0,F.useMemo)(()=>V(e,o),[e,o]),c=re(s,n),l=s.find(e=>e.key===c),u=(0,H.jsx)(`div`,{className:`divide-y divide-border`,role:`list`,"data-testid":`sysmon-device-list`,children:s.map(e=>(0,H.jsx)(xe,{entry:e,selected:!a&&e.key===c,showChevron:a,onSelect:r},e.key))});return a?n===null||!l||c!==n?(0,H.jsx)(`div`,{className:`h-full overflow-y-auto`,"data-testid":`sysmon-performance`,children:u}):(0,H.jsxs)(`div`,{className:`h-full flex flex-col`,"data-testid":`sysmon-performance`,children:[(0,H.jsxs)(`button`,{type:`button`,onClick:()=>r(null),className:`shrink-0 min-h-11 px-3 flex items-center gap-2 text-sm border-b border-border`,children:[(0,H.jsx)(i,{className:`size-4`}),`Devices`]}),(0,H.jsx)(`div`,{className:`flex-1 min-h-0 overflow-y-auto p-4 @container`,children:(0,H.jsx)($,{entry:l,system:e,inventory:o,history:t})})]}):(0,H.jsxs)(`div`,{className:`h-full flex min-h-0`,"data-testid":`sysmon-performance`,children:[(0,H.jsx)(`div`,{className:`w-56 shrink-0 border-r border-border overflow-y-auto`,children:u}),(0,H.jsx)(`div`,{className:`flex-1 min-w-0 overflow-y-auto p-4 @container`,children:l&&(0,H.jsx)($,{entry:l,system:e,inventory:o,history:t})})]})}export{Se as PerformancePanel};
@@ -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{J as r,Mr as i,T as a,b as o,dr as s,ir as c}from"./icons-CO_II6D-.js";import{r as l}from"./api-client-F5Zi1sR0.js";import{t as u}from"./button-CsmGH5xa.js";import{t as d}from"./input-CP31LZnN.js";import{Ct as f}from"./index-DQCw6d-2.js";import{t as p}from"./separator-B0xYRplF.js";var m=e(t(),1),h=n();function g(){let[e,t]=(0,m.useState)(null),[n,g]=(0,m.useState)(!1),[_,v]=(0,m.useState)(null),[y,b]=(0,m.useState)(``),[x,S]=(0,m.useState)(!1),[C,w]=(0,m.useState)(!1),[T,E]=(0,m.useState)(!1),[D,O]=(0,m.useState)(``),[k,A]=(0,m.useState)(!0),[j,M]=(0,m.useState)(!1),[N,P]=(0,m.useState)(2e3),[F,I]=(0,m.useState)([]),[L,R]=(0,m.useState)(``),[z,B]=(0,m.useState)(!1),[V,H]=(0,m.useState)(!1),[U,W]=(0,m.useState)([]),[G,ee]=(0,m.useState)(`_global`),[K,q]=(0,m.useState)([]),J=(0,m.useRef)(void 0),Y=(0,m.useCallback)(async()=>{try{I(await l.get(`/api/settings/clawbot/paired`))}catch{}},[]),X=(0,m.useCallback)(async(e=G)=>{try{W(await l.get(`/api/settings/clawbot/memories?project=${encodeURIComponent(e)}`))}catch{}},[G]),Z=(0,m.useCallback)(async()=>{try{q(await l.get(`/api/settings/clawbot/tasks?limit=20`))}catch{}},[]),Q=async e=>{try{await l.del(`/api/settings/clawbot/memories/${e}`),W(t=>t.filter(t=>t.id!==e))}catch{}};(0,m.useEffect)(()=>(l.get(`/api/settings/clawbot`).then(e=>{t(e),E(e.enabled),O(e.system_prompt),A(e.show_tool_calls),M(e.show_thinking),P(e.debounce_ms)}).catch(()=>{}),l.get(`/api/settings/telegram`).then(e=>{S(!!e.bot_token)}).catch(()=>{}),Y(),X(`_global`),Z(),J.current=setInterval(Z,1e4),()=>{J.current&&clearInterval(J.current)}),[Y,X,Z]);let $=async()=>{if(y.trim()){w(!0),v(null);try{await l.put(`/api/settings/telegram`,{bot_token:y}),S(!0),b(``),v({type:`ok`,msg:`Bot token saved`})}catch(e){v({type:`err`,msg:e.message})}finally{w(!1)}}},te=async()=>{g(!0),v(null);try{let e={enabled:T,system_prompt:D,show_tool_calls:k,show_thinking:j,debounce_ms:N};t(await l.put(`/api/settings/clawbot`,e)),v({type:`ok`,msg:T?`Saved — bot started`:`Saved — bot stopped`})}catch(e){v({type:`err`,msg:e.message})}finally{g(!1)}},ne=async()=>{if(L.trim()){B(!0);try{await l.post(`/api/settings/clawbot/paired/approve`,{code:L.trim().toUpperCase()}),R(``),await Y(),v({type:`ok`,msg:`Device approved`})}catch(e){v({type:`err`,msg:e.message})}finally{B(!1)}}},re=async e=>{try{await l.del(`/api/settings/clawbot/paired/${e}`),await Y(),v({type:`ok`,msg:`Device revoked`})}catch(e){v({type:`err`,msg:e.message})}},ie=async()=>{H(!0),v(null);try{await l.post(`/api/settings/telegram/test`,{}),v({type:`ok`,msg:`Test notification sent to all paired devices!`})}catch(e){v({type:`err`,msg:e.message})}finally{H(!1)}};if(!e)return(0,h.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading...`});let ae=F.filter(e=>e.status===`approved`).length,oe={pending:`⏳`,running:`🔄`,completed:`✅`,failed:`❌`,timeout:`⏱`},se={running:`text-primary`,completed:`text-success`,failed:`text-destructive`,timeout:`text-warning`};return(0,h.jsxs)(`div`,{className:`space-y-4`,children:[(0,h.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,h.jsx)(`label`,{className:`text-[11px] text-muted-foreground`,children:`Telegram Bot Token`}),(0,h.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,h.jsx)(d,{type:`password`,placeholder:x?`•••••• (saved)`:`123456:ABC-DEF...`,value:y,onChange:e=>b(e.target.value),className:`h-7 text-xs flex-1`}),(0,h.jsx)(u,{variant:`outline`,size:`sm`,className:`h-7 text-xs shrink-0 cursor-pointer`,disabled:C||!y.trim(),onClick:$,children:C?`...`:`Save`})]}),(0,h.jsxs)(`p`,{className:`text-[10px] text-muted-foreground`,children:[`Create a bot via `,(0,h.jsx)(`b`,{children:`@BotFather`}),` on Telegram. Used for both chat and notifications.`]})]}),(0,h.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`p`,{className:`text-xs font-medium`,children:`Enable PPMBot`}),(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`AI coordinator on Telegram — delegates tasks to your projects`})]}),(0,h.jsx)(f,{checked:T,onCheckedChange:E})]}),(0,h.jsxs)(`div`,{className:`space-y-2`,children:[(0,h.jsx)(`p`,{className:`text-xs font-medium`,children:`Paired Devices`}),(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Send any message to the bot on Telegram to get a pairing code. Enter it below to approve. Notifications are sent to all approved devices.`}),(0,h.jsxs)(`div`,{className:`flex gap-2`,children:[(0,h.jsx)(d,{placeholder:`Enter pairing code (e.g. A3K7WR)`,value:L,onChange:e=>R(e.target.value.toUpperCase()),className:`h-8 text-xs font-mono tracking-wider uppercase`,maxLength:6}),(0,h.jsx)(u,{variant:`outline`,size:`sm`,className:`h-8 text-xs shrink-0 cursor-pointer`,disabled:z||L.length<6,onClick:ne,children:z?`...`:`Approve`})]}),F.length===0?(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground italic`,children:`No paired devices yet.`}):(0,h.jsx)(`div`,{className:`space-y-1`,children:F.map(e=>(0,h.jsxs)(`div`,{className:`flex items-center justify-between rounded-md border p-2`,children:[(0,h.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[e.status===`approved`?(0,h.jsx)(a,{className:`size-3.5 text-success shrink-0`}):(0,h.jsx)(r,{className:`size-3.5 text-warning shrink-0`}),(0,h.jsxs)(`div`,{className:`min-w-0`,children:[(0,h.jsx)(`p`,{className:`text-xs truncate`,children:e.display_name||`Chat ${e.telegram_chat_id}`}),(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:e.status===`pending`&&e.pairing_code?`Code: ${e.pairing_code}`:e.status})]})]}),(0,h.jsx)(u,{variant:`ghost`,size:`sm`,className:`h-7 w-7 p-0 text-destructive hover:text-destructive cursor-pointer`,onClick:()=>re(e.telegram_chat_id),children:(0,h.jsx)(i,{className:`size-3.5`})})]},e.id))}),x&&ae>0&&(0,h.jsxs)(u,{variant:`outline`,size:`sm`,className:`h-7 text-xs gap-1 w-full cursor-pointer`,disabled:V,onClick:ie,children:[(0,h.jsx)(s,{className:`size-3`}),V?`Sending...`:`Test Notification`]})]}),(0,h.jsx)(p,{}),(0,h.jsxs)(`div`,{className:`space-y-2`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,h.jsx)(`p`,{className:`text-xs font-medium`,children:`Delegated Tasks`}),(0,h.jsx)(u,{variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0 cursor-pointer`,onClick:Z,children:(0,h.jsx)(c,{className:`size-3`})})]}),K.length===0?(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground italic`,children:`No delegated tasks yet. The coordinator will create tasks when you ask it to work on a project.`}):(0,h.jsx)(`div`,{className:`space-y-1 max-h-[200px] overflow-y-auto`,children:K.map(e=>{let t=e.completed_at?`${Math.round((e.completed_at-e.created_at)/60)}m`:`${Math.round((Date.now()/1e3-e.created_at)/60)}m`;return(0,h.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border p-2 text-[11px]`,children:[(0,h.jsx)(`span`,{className:se[e.status]??``,children:oe[e.status]??`?`}),(0,h.jsx)(`span`,{className:`font-medium shrink-0`,children:e.project_name}),(0,h.jsx)(`span`,{className:`truncate text-muted-foreground flex-1`,children:e.prompt.slice(0,60)}),(0,h.jsx)(`span`,{className:`text-[10px] text-muted-foreground shrink-0`,children:t})]},e.id)})})]}),(0,h.jsx)(p,{}),(0,h.jsxs)(`div`,{className:`space-y-2`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,h.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,h.jsx)(o,{className:`size-3.5 text-muted-foreground`}),(0,h.jsx)(`p`,{className:`text-xs font-medium`,children:`Memory & Identity`})]}),(0,h.jsx)(u,{variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0 cursor-pointer`,onClick:()=>X(G),children:(0,h.jsx)(c,{className:`size-3`})})]}),(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Facts the bot remembers across sessions. Use /remember on Telegram to add, or delete here.`}),U.length===0?(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground italic`,children:`No memories stored yet. Send /start on Telegram and introduce yourself.`}):(0,h.jsx)(`div`,{className:`space-y-1 max-h-[200px] overflow-y-auto`,children:U.map(e=>(0,h.jsxs)(`div`,{className:`flex items-start justify-between rounded-md border p-2 gap-1`,children:[(0,h.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,h.jsx)(`p`,{className:`text-[11px] break-words`,children:e.content}),(0,h.jsxs)(`p`,{className:`text-[10px] text-muted-foreground`,children:[e.category,` · `,e.project]})]}),(0,h.jsx)(u,{variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0 text-destructive hover:text-destructive cursor-pointer shrink-0`,onClick:()=>Q(e.id),children:(0,h.jsx)(i,{className:`size-3`})})]},e.id))})]}),(0,h.jsx)(p,{}),(0,h.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,h.jsx)(`label`,{className:`text-[11px] text-muted-foreground`,children:`Custom Instructions`}),(0,h.jsx)(`textarea`,{placeholder:`Additional instructions for the coordinator (optional)...`,value:D,onChange:e=>O(e.target.value),className:`flex w-full rounded-md border border-input bg-background px-3 py-2 text-xs min-h-[60px] resize-y ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,rows:3}),(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Extra instructions added to the coordinator identity. Leave empty to use defaults from coordinator.md.`})]}),(0,h.jsxs)(`div`,{className:`space-y-2`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,h.jsx)(`p`,{className:`text-xs`,children:`Show tool calls`}),(0,h.jsx)(f,{checked:k,onCheckedChange:A})]}),(0,h.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,h.jsx)(`p`,{className:`text-xs`,children:`Show thinking`}),(0,h.jsx)(f,{checked:j,onCheckedChange:M})]})]}),(0,h.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,h.jsx)(`label`,{className:`text-[11px] text-muted-foreground`,children:`Debounce (ms)`}),(0,h.jsx)(d,{type:`number`,min:0,max:3e4,step:500,value:N,onChange:e=>P(Number(e.target.value)),className:`h-7 text-xs w-24`}),(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Merge rapid messages within this window. 0 = no debounce.`})]}),(0,h.jsx)(u,{variant:`default`,size:`sm`,className:`h-8 text-xs w-full cursor-pointer`,disabled:n,onClick:te,children:n?`Saving...`:`Save`}),_&&(0,h.jsx)(`p`,{className:`text-[11px] ${_.type===`ok`?`text-success`:`text-destructive`}`,children:_.msg})]})}export{g as PPMBotSettingsSection};
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{J as r,Mr as i,T as a,b as o,dr as s,ir as c}from"./icons-CO_II6D-.js";import{r as l}from"./api-client-F5Zi1sR0.js";import{t as u}from"./button-CsmGH5xa.js";import{t as d}from"./input-CP31LZnN.js";import{Tt as f}from"./index-CIscPw4g.js";import{t as p}from"./separator-B0xYRplF.js";var m=e(t(),1),h=n();function g(){let[e,t]=(0,m.useState)(null),[n,g]=(0,m.useState)(!1),[_,v]=(0,m.useState)(null),[y,b]=(0,m.useState)(``),[x,S]=(0,m.useState)(!1),[C,w]=(0,m.useState)(!1),[T,E]=(0,m.useState)(!1),[D,O]=(0,m.useState)(``),[k,A]=(0,m.useState)(!0),[j,M]=(0,m.useState)(!1),[N,P]=(0,m.useState)(2e3),[F,I]=(0,m.useState)([]),[L,R]=(0,m.useState)(``),[z,B]=(0,m.useState)(!1),[V,H]=(0,m.useState)(!1),[U,W]=(0,m.useState)([]),[G,ee]=(0,m.useState)(`_global`),[K,q]=(0,m.useState)([]),J=(0,m.useRef)(void 0),Y=(0,m.useCallback)(async()=>{try{I(await l.get(`/api/settings/clawbot/paired`))}catch{}},[]),X=(0,m.useCallback)(async(e=G)=>{try{W(await l.get(`/api/settings/clawbot/memories?project=${encodeURIComponent(e)}`))}catch{}},[G]),Z=(0,m.useCallback)(async()=>{try{q(await l.get(`/api/settings/clawbot/tasks?limit=20`))}catch{}},[]),Q=async e=>{try{await l.del(`/api/settings/clawbot/memories/${e}`),W(t=>t.filter(t=>t.id!==e))}catch{}};(0,m.useEffect)(()=>(l.get(`/api/settings/clawbot`).then(e=>{t(e),E(e.enabled),O(e.system_prompt),A(e.show_tool_calls),M(e.show_thinking),P(e.debounce_ms)}).catch(()=>{}),l.get(`/api/settings/telegram`).then(e=>{S(!!e.bot_token)}).catch(()=>{}),Y(),X(`_global`),Z(),J.current=setInterval(Z,1e4),()=>{J.current&&clearInterval(J.current)}),[Y,X,Z]);let $=async()=>{if(y.trim()){w(!0),v(null);try{await l.put(`/api/settings/telegram`,{bot_token:y}),S(!0),b(``),v({type:`ok`,msg:`Bot token saved`})}catch(e){v({type:`err`,msg:e.message})}finally{w(!1)}}},te=async()=>{g(!0),v(null);try{let e={enabled:T,system_prompt:D,show_tool_calls:k,show_thinking:j,debounce_ms:N};t(await l.put(`/api/settings/clawbot`,e)),v({type:`ok`,msg:T?`Saved — bot started`:`Saved — bot stopped`})}catch(e){v({type:`err`,msg:e.message})}finally{g(!1)}},ne=async()=>{if(L.trim()){B(!0);try{await l.post(`/api/settings/clawbot/paired/approve`,{code:L.trim().toUpperCase()}),R(``),await Y(),v({type:`ok`,msg:`Device approved`})}catch(e){v({type:`err`,msg:e.message})}finally{B(!1)}}},re=async e=>{try{await l.del(`/api/settings/clawbot/paired/${e}`),await Y(),v({type:`ok`,msg:`Device revoked`})}catch(e){v({type:`err`,msg:e.message})}},ie=async()=>{H(!0),v(null);try{await l.post(`/api/settings/telegram/test`,{}),v({type:`ok`,msg:`Test notification sent to all paired devices!`})}catch(e){v({type:`err`,msg:e.message})}finally{H(!1)}};if(!e)return(0,h.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Loading...`});let ae=F.filter(e=>e.status===`approved`).length,oe={pending:`⏳`,running:`🔄`,completed:`✅`,failed:`❌`,timeout:`⏱`},se={running:`text-primary`,completed:`text-success`,failed:`text-destructive`,timeout:`text-warning`};return(0,h.jsxs)(`div`,{className:`space-y-4`,children:[(0,h.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,h.jsx)(`label`,{className:`text-[11px] text-muted-foreground`,children:`Telegram Bot Token`}),(0,h.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,h.jsx)(d,{type:`password`,placeholder:x?`•••••• (saved)`:`123456:ABC-DEF...`,value:y,onChange:e=>b(e.target.value),className:`h-7 text-xs flex-1`}),(0,h.jsx)(u,{variant:`outline`,size:`sm`,className:`h-7 text-xs shrink-0 cursor-pointer`,disabled:C||!y.trim(),onClick:$,children:C?`...`:`Save`})]}),(0,h.jsxs)(`p`,{className:`text-[10px] text-muted-foreground`,children:[`Create a bot via `,(0,h.jsx)(`b`,{children:`@BotFather`}),` on Telegram. Used for both chat and notifications.`]})]}),(0,h.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,h.jsxs)(`div`,{children:[(0,h.jsx)(`p`,{className:`text-xs font-medium`,children:`Enable PPMBot`}),(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`AI coordinator on Telegram — delegates tasks to your projects`})]}),(0,h.jsx)(f,{checked:T,onCheckedChange:E})]}),(0,h.jsxs)(`div`,{className:`space-y-2`,children:[(0,h.jsx)(`p`,{className:`text-xs font-medium`,children:`Paired Devices`}),(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Send any message to the bot on Telegram to get a pairing code. Enter it below to approve. Notifications are sent to all approved devices.`}),(0,h.jsxs)(`div`,{className:`flex gap-2`,children:[(0,h.jsx)(d,{placeholder:`Enter pairing code (e.g. A3K7WR)`,value:L,onChange:e=>R(e.target.value.toUpperCase()),className:`h-8 text-xs font-mono tracking-wider uppercase`,maxLength:6}),(0,h.jsx)(u,{variant:`outline`,size:`sm`,className:`h-8 text-xs shrink-0 cursor-pointer`,disabled:z||L.length<6,onClick:ne,children:z?`...`:`Approve`})]}),F.length===0?(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground italic`,children:`No paired devices yet.`}):(0,h.jsx)(`div`,{className:`space-y-1`,children:F.map(e=>(0,h.jsxs)(`div`,{className:`flex items-center justify-between rounded-md border p-2`,children:[(0,h.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[e.status===`approved`?(0,h.jsx)(a,{className:`size-3.5 text-success shrink-0`}):(0,h.jsx)(r,{className:`size-3.5 text-warning shrink-0`}),(0,h.jsxs)(`div`,{className:`min-w-0`,children:[(0,h.jsx)(`p`,{className:`text-xs truncate`,children:e.display_name||`Chat ${e.telegram_chat_id}`}),(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:e.status===`pending`&&e.pairing_code?`Code: ${e.pairing_code}`:e.status})]})]}),(0,h.jsx)(u,{variant:`ghost`,size:`sm`,className:`h-7 w-7 p-0 text-destructive hover:text-destructive cursor-pointer`,onClick:()=>re(e.telegram_chat_id),children:(0,h.jsx)(i,{className:`size-3.5`})})]},e.id))}),x&&ae>0&&(0,h.jsxs)(u,{variant:`outline`,size:`sm`,className:`h-7 text-xs gap-1 w-full cursor-pointer`,disabled:V,onClick:ie,children:[(0,h.jsx)(s,{className:`size-3`}),V?`Sending...`:`Test Notification`]})]}),(0,h.jsx)(p,{}),(0,h.jsxs)(`div`,{className:`space-y-2`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,h.jsx)(`p`,{className:`text-xs font-medium`,children:`Delegated Tasks`}),(0,h.jsx)(u,{variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0 cursor-pointer`,onClick:Z,children:(0,h.jsx)(c,{className:`size-3`})})]}),K.length===0?(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground italic`,children:`No delegated tasks yet. The coordinator will create tasks when you ask it to work on a project.`}):(0,h.jsx)(`div`,{className:`space-y-1 max-h-[200px] overflow-y-auto`,children:K.map(e=>{let t=e.completed_at?`${Math.round((e.completed_at-e.created_at)/60)}m`:`${Math.round((Date.now()/1e3-e.created_at)/60)}m`;return(0,h.jsxs)(`div`,{className:`flex items-center gap-2 rounded-md border p-2 text-[11px]`,children:[(0,h.jsx)(`span`,{className:se[e.status]??``,children:oe[e.status]??`?`}),(0,h.jsx)(`span`,{className:`font-medium shrink-0`,children:e.project_name}),(0,h.jsx)(`span`,{className:`truncate text-muted-foreground flex-1`,children:e.prompt.slice(0,60)}),(0,h.jsx)(`span`,{className:`text-[10px] text-muted-foreground shrink-0`,children:t})]},e.id)})})]}),(0,h.jsx)(p,{}),(0,h.jsxs)(`div`,{className:`space-y-2`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,h.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,h.jsx)(o,{className:`size-3.5 text-muted-foreground`}),(0,h.jsx)(`p`,{className:`text-xs font-medium`,children:`Memory & Identity`})]}),(0,h.jsx)(u,{variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0 cursor-pointer`,onClick:()=>X(G),children:(0,h.jsx)(c,{className:`size-3`})})]}),(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Facts the bot remembers across sessions. Use /remember on Telegram to add, or delete here.`}),U.length===0?(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground italic`,children:`No memories stored yet. Send /start on Telegram and introduce yourself.`}):(0,h.jsx)(`div`,{className:`space-y-1 max-h-[200px] overflow-y-auto`,children:U.map(e=>(0,h.jsxs)(`div`,{className:`flex items-start justify-between rounded-md border p-2 gap-1`,children:[(0,h.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,h.jsx)(`p`,{className:`text-[11px] break-words`,children:e.content}),(0,h.jsxs)(`p`,{className:`text-[10px] text-muted-foreground`,children:[e.category,` · `,e.project]})]}),(0,h.jsx)(u,{variant:`ghost`,size:`sm`,className:`h-6 w-6 p-0 text-destructive hover:text-destructive cursor-pointer shrink-0`,onClick:()=>Q(e.id),children:(0,h.jsx)(i,{className:`size-3`})})]},e.id))})]}),(0,h.jsx)(p,{}),(0,h.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,h.jsx)(`label`,{className:`text-[11px] text-muted-foreground`,children:`Custom Instructions`}),(0,h.jsx)(`textarea`,{placeholder:`Additional instructions for the coordinator (optional)...`,value:D,onChange:e=>O(e.target.value),className:`flex w-full rounded-md border border-input bg-background px-3 py-2 text-xs min-h-[60px] resize-y ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2`,rows:3}),(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Extra instructions added to the coordinator identity. Leave empty to use defaults from coordinator.md.`})]}),(0,h.jsxs)(`div`,{className:`space-y-2`,children:[(0,h.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,h.jsx)(`p`,{className:`text-xs`,children:`Show tool calls`}),(0,h.jsx)(f,{checked:k,onCheckedChange:A})]}),(0,h.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,h.jsx)(`p`,{className:`text-xs`,children:`Show thinking`}),(0,h.jsx)(f,{checked:j,onCheckedChange:M})]})]}),(0,h.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,h.jsx)(`label`,{className:`text-[11px] text-muted-foreground`,children:`Debounce (ms)`}),(0,h.jsx)(d,{type:`number`,min:0,max:3e4,step:500,value:N,onChange:e=>P(Number(e.target.value)),className:`h-7 text-xs w-24`}),(0,h.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Merge rapid messages within this window. 0 = no debounce.`})]}),(0,h.jsx)(u,{variant:`default`,size:`sm`,className:`h-8 text-xs w-full cursor-pointer`,disabled:n,onClick:te,children:n?`Saving...`:`Save`}),_&&(0,h.jsx)(`p`,{className:`text-[11px] ${_.type===`ok`?`text-success`:`text-destructive`}`,children:_.msg})]})}export{g as PPMBotSettingsSection};
@@ -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{Jt as r,O as i,U as a,j as o,r as s,tn as c}from"./icons-CO_II6D-.js";import"./api-client-F5Zi1sR0.js";import{n as l}from"./utils-btZ8C8-R.js";import{t as u}from"./panel-store-DrSH3Nhp.js";import"./window-store-B4cbZ5rr.js";import{i as d}from"./project-store-CCimwgGF.js";import{n as f}from"./use-is-mobile-CkO33jqU.js";import{t as p}from"./file-icons-Ed_yLyef.js";import{G as m,J as h,K as g,W as _,gn as v,q as y}from"./index-DQCw6d-2.js";var b=e(t(),1),x=n();function S(){let e=h(v(e=>e.files)),t=d(e=>e.activeProject?.name??null),n=f(),[r,c]=(0,b.useState)(new Set),[S,D]=(0,b.useState)(``),O=(0,b.useMemo)(()=>_(e,t),[e,t]),k=(0,b.useMemo)(()=>{let e=y(O),t=S.trim().toLowerCase();return t?e.map(e=>({...e,diagnostics:e.filePath.toLowerCase().includes(t)?e.diagnostics:e.diagnostics.filter(e=>C(e,t))})).filter(e=>e.diagnostics.length>0):e},[O,S]),A=(0,b.useMemo)(()=>m(O),[O]),j=k.reduce((e,t)=>e+t.diagnostics.length,0);function M(e,t){let{grid:n,focusedPanelId:r,openTab:i}=u.getState(),a=n.flat(),o=a.includes(r)?r:a[0];i({type:`editor`,title:e.filePath.split(`/`).pop()??e.filePath,metadata:{filePath:e.filePath,projectName:e.projectName,lineNumber:t.range.start.line+1},projectId:e.projectName,closable:!0},o)}function N(e){c(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}return Object.keys(O).length===0?(0,x.jsxs)(`div`,{className:`p-4 space-y-2`,children:[(0,x.jsx)(`p`,{className:`text-xs text-text-subtle`,children:`No problems have been detected in the open files.`}),(0,x.jsx)(`p`,{className:`text-[11px] text-text-subtle/70 leading-relaxed`,children:`Diagnostics come from the language server for each file you open, so a file that has never been opened is not checked.`})]}):(0,x.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,x.jsxs)(`div`,{className:`shrink-0 p-2 space-y-2 border-b border-border-soft`,children:[(0,x.jsxs)(`div`,{className:`flex items-center gap-3 text-[11px] text-text-3`,children:[(0,x.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,x.jsx)(a,{className:`size-3 text-error`}),A.errors]}),(0,x.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,x.jsx)(s,{className:`size-3 text-warning`}),A.warnings]}),(0,x.jsxs)(`span`,{className:`ml-auto text-text-subtle`,children:[k.length,` file`,k.length===1?``:`s`]})]}),(0,x.jsx)(`input`,{value:S,onChange:e=>D(e.target.value),placeholder:`Filter problems`,className:l(`w-full rounded border border-border bg-surface px-2 text-xs outline-none focus:border-primary`,n?`min-h-11`:`py-1`)})]}),(0,x.jsxs)(`div`,{className:`flex-1 overflow-y-auto min-h-0`,children:[j===0&&(0,x.jsxs)(`p`,{className:`p-4 text-xs text-text-subtle`,children:[`No problems match “`,S.trim(),`”.`]}),k.map(e=>{let t=g(e.projectName,e.filePath),a=r.has(t);return(0,x.jsxs)(`div`,{children:[(0,x.jsxs)(`button`,{type:`button`,onClick:()=>N(t),className:l(`w-full flex items-center gap-1 px-2 text-left hover:bg-surface-elevated transition-colors`,n?`min-h-11`:`py-1`),children:[a?(0,x.jsx)(o,{className:`size-3 shrink-0 text-text-subtle`}):(0,x.jsx)(i,{className:`size-3 shrink-0 text-text-subtle`}),(0,x.jsx)(p,{name:e.filePath,className:`size-3.5`}),(0,x.jsx)(`span`,{className:`text-xs truncate`,children:e.filePath.split(`/`).pop()}),(0,x.jsx)(`span`,{className:`text-[10px] text-text-subtle truncate min-w-0`,children:E(e.filePath)}),(0,x.jsx)(`span`,{className:`ml-auto shrink-0 rounded-full bg-surface-elevated px-1.5 text-[10px] text-text-3`,children:e.diagnostics.length})]}),!a&&e.diagnostics.map((t,r)=>(0,x.jsxs)(`button`,{type:`button`,onClick:()=>M(e,t),title:t.message,className:l(`w-full flex items-start gap-1.5 pl-6 pr-2 text-left hover:bg-surface-elevated transition-colors`,n?`min-h-11 py-2`:`py-0.5`),children:[(0,x.jsx)(w,{severity:t.severity}),(0,x.jsx)(`span`,{className:l(`flex-1 min-w-0 text-xs text-text-2`,n?`break-words`:`truncate`),children:t.message}),(0,x.jsxs)(`span`,{className:`shrink-0 text-[10px] text-text-subtle font-mono pt-px`,children:[T(t),t.range.start.line+1,`:`,t.range.start.character+1]})]},`${t.range.start.line}:${t.range.start.character}:${r}`))]},t)})]})]})}function C(e,t){return e.message.toLowerCase().includes(t)||(e.source?.toLowerCase().includes(t)??!1)||String(e.code??``).toLowerCase().includes(t)}function w({severity:e}){return e===2?(0,x.jsx)(s,{className:`size-3 shrink-0 text-warning mt-px`}):e===3?(0,x.jsx)(r,{className:`size-3 shrink-0 text-info mt-px`}):e===4?(0,x.jsx)(c,{className:`size-3 shrink-0 text-text-subtle mt-px`}):(0,x.jsx)(a,{className:`size-3 shrink-0 text-error mt-px`})}function T(e){return e.source?e.code===void 0?`${e.source} `:`${e.source}(${e.code}) `:``}function E(e){let t=e.lastIndexOf(`/`);return t<0?``:e.slice(0,t)}export{S as ProblemsPanel};
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{Jt as r,O as i,U as a,j as o,r as s,tn as c}from"./icons-CO_II6D-.js";import"./api-client-F5Zi1sR0.js";import{n as l}from"./utils-btZ8C8-R.js";import{t as u}from"./panel-store-1X6yM3XZ.js";import"./window-store-vo1N70nK.js";import{i as d}from"./project-store-CCimwgGF.js";import{n as f}from"./use-is-mobile-CkO33jqU.js";import{t as p}from"./file-icons-Ed_yLyef.js";import{J as m,K as h,X as g,Y as _,q as v,vn as y}from"./index-CIscPw4g.js";var b=e(t(),1),x=n();function S(){let e=g(y(e=>e.files)),t=d(e=>e.activeProject?.name??null),n=f(),[r,c]=(0,b.useState)(new Set),[S,D]=(0,b.useState)(``),O=(0,b.useMemo)(()=>h(e,t),[e,t]),k=(0,b.useMemo)(()=>{let e=_(O),t=S.trim().toLowerCase();return t?e.map(e=>({...e,diagnostics:e.filePath.toLowerCase().includes(t)?e.diagnostics:e.diagnostics.filter(e=>C(e,t))})).filter(e=>e.diagnostics.length>0):e},[O,S]),A=(0,b.useMemo)(()=>v(O),[O]),j=k.reduce((e,t)=>e+t.diagnostics.length,0);function M(e,t){let{grid:n,focusedPanelId:r,openTab:i}=u.getState(),a=n.flat(),o=a.includes(r)?r:a[0];i({type:`editor`,title:e.filePath.split(`/`).pop()??e.filePath,metadata:{filePath:e.filePath,projectName:e.projectName,lineNumber:t.range.start.line+1},projectId:e.projectName,closable:!0},o)}function N(e){c(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})}return Object.keys(O).length===0?(0,x.jsxs)(`div`,{className:`p-4 space-y-2`,children:[(0,x.jsx)(`p`,{className:`text-xs text-text-subtle`,children:`No problems have been detected in the open files.`}),(0,x.jsx)(`p`,{className:`text-[11px] text-text-subtle/70 leading-relaxed`,children:`Diagnostics come from the language server for each file you open, so a file that has never been opened is not checked.`})]}):(0,x.jsxs)(`div`,{className:`flex flex-col h-full`,children:[(0,x.jsxs)(`div`,{className:`shrink-0 p-2 space-y-2 border-b border-border-soft`,children:[(0,x.jsxs)(`div`,{className:`flex items-center gap-3 text-[11px] text-text-3`,children:[(0,x.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,x.jsx)(a,{className:`size-3 text-error`}),A.errors]}),(0,x.jsxs)(`span`,{className:`flex items-center gap-1`,children:[(0,x.jsx)(s,{className:`size-3 text-warning`}),A.warnings]}),(0,x.jsxs)(`span`,{className:`ml-auto text-text-subtle`,children:[k.length,` file`,k.length===1?``:`s`]})]}),(0,x.jsx)(`input`,{value:S,onChange:e=>D(e.target.value),placeholder:`Filter problems`,className:l(`w-full rounded border border-border bg-surface px-2 text-xs outline-none focus:border-primary`,n?`min-h-11`:`py-1`)})]}),(0,x.jsxs)(`div`,{className:`flex-1 overflow-y-auto min-h-0`,children:[j===0&&(0,x.jsxs)(`p`,{className:`p-4 text-xs text-text-subtle`,children:[`No problems match “`,S.trim(),`”.`]}),k.map(e=>{let t=m(e.projectName,e.filePath),a=r.has(t);return(0,x.jsxs)(`div`,{children:[(0,x.jsxs)(`button`,{type:`button`,onClick:()=>N(t),className:l(`w-full flex items-center gap-1 px-2 text-left hover:bg-surface-elevated transition-colors`,n?`min-h-11`:`py-1`),children:[a?(0,x.jsx)(o,{className:`size-3 shrink-0 text-text-subtle`}):(0,x.jsx)(i,{className:`size-3 shrink-0 text-text-subtle`}),(0,x.jsx)(p,{name:e.filePath,className:`size-3.5`}),(0,x.jsx)(`span`,{className:`text-xs truncate`,children:e.filePath.split(`/`).pop()}),(0,x.jsx)(`span`,{className:`text-[10px] text-text-subtle truncate min-w-0`,children:E(e.filePath)}),(0,x.jsx)(`span`,{className:`ml-auto shrink-0 rounded-full bg-surface-elevated px-1.5 text-[10px] text-text-3`,children:e.diagnostics.length})]}),!a&&e.diagnostics.map((t,r)=>(0,x.jsxs)(`button`,{type:`button`,onClick:()=>M(e,t),title:t.message,className:l(`w-full flex items-start gap-1.5 pl-6 pr-2 text-left hover:bg-surface-elevated transition-colors`,n?`min-h-11 py-2`:`py-0.5`),children:[(0,x.jsx)(w,{severity:t.severity}),(0,x.jsx)(`span`,{className:l(`flex-1 min-w-0 text-xs text-text-2`,n?`break-words`:`truncate`),children:t.message}),(0,x.jsxs)(`span`,{className:`shrink-0 text-[10px] text-text-subtle font-mono pt-px`,children:[T(t),t.range.start.line+1,`:`,t.range.start.character+1]})]},`${t.range.start.line}:${t.range.start.character}:${r}`))]},t)})]})]})}function C(e,t){return e.message.toLowerCase().includes(t)||(e.source?.toLowerCase().includes(t)??!1)||String(e.code??``).toLowerCase().includes(t)}function w({severity:e}){return e===2?(0,x.jsx)(s,{className:`size-3 shrink-0 text-warning mt-px`}):e===3?(0,x.jsx)(r,{className:`size-3 shrink-0 text-info mt-px`}):e===4?(0,x.jsx)(c,{className:`size-3 shrink-0 text-text-subtle mt-px`}):(0,x.jsx)(a,{className:`size-3 shrink-0 text-error mt-px`})}function T(e){return e.source?e.code===void 0?`${e.source} `:`${e.source}(${e.code}) `:``}function E(e){let t=e.lastIndexOf(`/`);return t<0?``:e.slice(0,t)}export{S as ProblemsPanel};
@@ -0,0 +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{Jr as r,O as i,j as a,ur as o}from"./icons-CO_II6D-.js";import{O as s,a as c,r as l}from"./api-client-F5Zi1sR0.js";import{n as u}from"./utils-btZ8C8-R.js";import"./portal-container-context-NFSuymMu.js";import"./context-menu-CH1mvCwA.js";import{n as d}from"./use-is-mobile-CkO33jqU.js";import"./button-CsmGH5xa.js";import{a as f,n as p,o as m,t as h}from"./dialog-z8PLkL8n.js";import{t as g}from"./mobile-bottom-sheet-CLic9ovp.js";import"./use-visual-viewport-C307OVeV.js";import{_n as ee,cn as _,fn as v,gn as y,hn as b,ln as x,mn as S,pn as C,sn as w}from"./index-CIscPw4g.js";import{r as T}from"./format-bytes-DZ8bW_uF.js";import{a as E,i as D,n as O,o as k,r as A,s as j,t as M}from"./process-row-format-Dbs_tAZ2.js";import{r as te,t as N}from"./use-process-kill-BS84S-kD.js";import{n as P,r as ne,t as F}from"./sortable-header-IH47XuRI.js";var I=e(t(),1),L=[`swap`,`disk`,`gpu`,`net`],R={cpu:64,ram:80,swap:80,disk:120,gpu:90,net:120},z=`minmax(0,1fr)`,B=`44px`;function V(e){return e===`swap`||e===`disk`||e===`gpu`||e===`net`}function H(e){return Math.round(Math.min(400,Math.max(48,e)))}function U(e,t){let n=t[e];return typeof n==`number`&&Number.isFinite(n)?H(n):R[e]}function re(e,t,n={}){let r=L.filter(t=>e[t]),i=V(t)&&e[t]?t:null,a=e=>`${U(e,n)}px`,o=[z,a(`cpu`),a(`ram`)];return{wideTemplate:[...o,...r.map(a),B].join(` `),narrowTemplate:[...o,...i?[a(i)]:[],B].join(` `),columns:e,narrowExtra:i}}var W=`grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]`;function ie(e){return{"--sysmon-grid-n":e.narrowTemplate,"--sysmon-grid-w":e.wideTemplate}}function G(e,t){return e.narrowExtra===t?`block`:`hidden @lg:block`}var K=n(),q=150;function J({mode:e,onModeChange:t,ppmOnly:n,onPpmOnlyChange:r,onQueryChange:i}){let[a,s]=(0,I.useState)(``),c=(0,I.useRef)(null);return(0,I.useEffect)(()=>(c.current&&clearTimeout(c.current),c.current=setTimeout(()=>i(a),q),()=>{c.current&&clearTimeout(c.current)}),[a]),(0,K.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2 p-2 border-b border-border shrink-0`,children:[(0,K.jsxs)(`div`,{className:`relative flex-1 min-w-[140px]`,children:[(0,K.jsx)(o,{className:`absolute left-2 top-1/2 -translate-y-1/2 size-3.5 text-text-subtle`}),(0,K.jsx)(`input`,{type:`text`,value:a,onChange:e=>s(e.target.value),placeholder:`Search processes`,"aria-label":`Search processes`,"data-testid":`sysmon-process-search`,className:`w-full min-h-11 md:min-h-8 pl-7 pr-2 text-sm rounded-md border border-border bg-transparent focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`})]}),(0,K.jsx)(`button`,{type:`button`,onClick:()=>t(e===`grouped`?`flat`:`grouped`),"aria-pressed":e===`flat`,"data-testid":`sysmon-toggle-flat`,className:`min-h-11 md:min-h-8 px-3 text-xs rounded-md border border-border hover:bg-surface-hover transition-colors`,children:e===`flat`?`Flat`:`Grouped`}),(0,K.jsx)(`button`,{type:`button`,onClick:()=>r(!n),"aria-pressed":n,"data-testid":`sysmon-filter-ppm`,className:u(`min-h-11 md:min-h-8 px-3 text-xs rounded-md border transition-colors`,n?`border-primary bg-primary/10 text-primary`:`border-border hover:bg-surface-hover`),children:`PPM only`})]})}function Y({sortKey:e,sortDir:t,grid:n,onSort:r,resize:i}){let a={activeKey:e,activeDir:t,onClick:r,resize:i};return(0,K.jsxs)(`div`,{role:`row`,className:u(`grid gap-1 px-3 py-1.5 text-[11px] text-text-subtle border-b border-border sticky top-0 bg-background z-10`,W),children:[(0,K.jsx)(F,{label:`Process`,field:`name`,...a,resize:void 0,align:`left`,testId:`sysmon-sort-name`}),(0,K.jsx)(F,{label:`CPU`,field:`cpu`,...a,resizeKey:`cpu`,testId:`sysmon-sort-cpu`}),(0,K.jsx)(F,{label:`RAM`,field:`ram`,...a,resizeKey:`ram`,testId:`sysmon-sort-ram`}),n.columns.swap&&(0,K.jsx)(F,{label:`Swap`,field:`swap`,...a,resizeKey:`swap`,testId:`sysmon-col-swap`,className:G(n,`swap`)}),n.columns.disk&&(0,K.jsx)(F,{label:`Disk`,field:`disk`,...a,resizeKey:`disk`,testId:`sysmon-col-disk`,className:G(n,`disk`)}),n.columns.gpu&&(0,K.jsx)(F,{label:`GPU`,field:`gpu`,...a,resizeKey:`gpu`,testId:`sysmon-col-gpu`,className:G(n,`gpu`)}),n.columns.net&&(0,K.jsx)(F,{label:`Net`,field:`net`,...a,resizeKey:`net`,testId:`sysmon-col-net`,className:G(n,`net`)}),(0,K.jsx)(`span`,{})]})}function ae({totals:e,grid:t,gpuUtilPercent:n}){return(0,K.jsxs)(`div`,{className:u(`grid gap-1 px-3 py-1.5 text-xs font-medium border-t border-border shrink-0`,W),"data-testid":`sysmon-total`,"data-process-count":e.count,children:[(0,K.jsxs)(`span`,{className:`truncate`,children:[`Total (`,e.count,` processes)`]}),(0,K.jsxs)(`span`,{className:u(`text-right`,M(e.cpu)),children:[e.cpu.toFixed(1),`%`]}),(0,K.jsx)(`span`,{className:`text-right text-text-secondary`,children:T(e.ramMB)}),t.columns.swap&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(t,`swap`)),children:k(e.swapMB)}),t.columns.disk&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(t,`disk`)),children:A(e.diskReadBps,e.diskWriteBps)}),t.columns.gpu&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(t,`gpu`)),children:D(n,e.gpuMemMB)}),t.columns.net&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(t,`net`)),children:E(e.netInBps,e.netOutBps)}),(0,K.jsx)(`span`,{})]})}var oe=`Protected: this app contains a PPM or OS-critical process — cannot be ended as a whole.`;function se({group:e,expanded:t,grid:n,killProtected:o,onToggle:s,onKillClick:c}){let l=t?i:a;return(0,K.jsxs)(`div`,{className:`grid items-center gap-1 min-h-11 md:min-h-7 px-3 text-xs cursor-pointer hover:bg-surface-hover transition-colors group/proc grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]`,onClick:()=>s(e.key),"data-testid":`sysmon-group-row`,"data-group-key":e.key,"data-count":e.count,"data-disk-bps":j(e.diskReadBps,e.diskWriteBps),"data-gpu-pct":e.gpuPct,"data-net-bps":j(e.netInBps,e.netOutBps),children:[(0,K.jsxs)(`div`,{className:`flex items-center gap-1.5 min-w-0`,children:[(0,K.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),s(e.key)},"aria-expanded":t,"aria-label":`${t?`Collapse`:`Expand`} ${e.label}`,"data-testid":`sysmon-group-expand`,className:`flex items-center justify-center size-11 md:size-7 -ml-2 shrink-0`,children:(0,K.jsx)(l,{className:`size-3.5 text-text-subtle`})}),(0,K.jsx)(`span`,{className:`truncate font-medium`,children:e.label}),(0,K.jsxs)(`span`,{className:`text-text-subtle shrink-0`,children:[`(`,e.count,`)`]})]}),(0,K.jsxs)(`span`,{className:u(`text-right`,M(e.cpu)),children:[e.cpu.toFixed(1),`%`]}),(0,K.jsx)(`span`,{className:`text-right text-text-secondary`,children:T(e.ramMB)}),n.columns.swap&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`swap`)),children:k(e.swapMB)}),n.columns.disk&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`disk`)),children:A(e.diskReadBps,e.diskWriteBps)}),n.columns.gpu&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`gpu`)),children:D(e.gpuPct,e.gpuMemMB)}),n.columns.net&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`net`)),children:E(e.netInBps,e.netOutBps)}),(0,K.jsx)(`div`,{className:`flex justify-end`,children:(0,K.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),c(e)},disabled:o,"aria-label":`End ${e.label} and its ${e.count} processes`,title:o?oe:`End ${e.label} (${e.count} processes)`,"data-testid":`sysmon-group-kill-btn`,className:u(`flex items-center justify-center size-11 md:size-7 rounded transition-all`,`can-hover:opacity-0 can-hover:group-hover/proc:opacity-100`,o?`opacity-40 cursor-not-allowed`:`hover:bg-error/20 hover:text-error active:bg-error/30`),children:(0,K.jsx)(r,{className:`size-3.5`})})})]})}var ce=`Protected: PPM or OS-critical process — cannot be ended.`;function le({proc:e,indent:t,grid:n,onKillClick:i}){return(0,K.jsxs)(`div`,{className:`grid items-center gap-1 min-h-11 md:min-h-7 px-3 text-xs group/proc hover:bg-surface-hover transition-colors grid-cols-[var(--sysmon-grid-n)] @lg:grid-cols-[var(--sysmon-grid-w)]`,"data-testid":`sysmon-process-row`,"data-pid":e.pid,"data-ppm":e.ppm,"data-protected":e.protected,"data-swap-mb":e.swapMB,"data-disk-bps":j(e.diskReadBps,e.diskWriteBps),"data-gpu-pct":e.gpuPct,"data-net-bps":j(e.netInBps,e.netOutBps),children:[(0,K.jsxs)(`div`,{className:u(`flex items-start gap-1.5 min-w-0`,t&&`pl-6`),children:[(0,K.jsx)(`span`,{className:`text-text-subtle shrink-0`,children:e.pid}),(0,K.jsx)(`span`,{className:`truncate text-text-secondary`,title:e.startedAt?`${e.command}\nRunning ${O(e.startedAt)}`:e.command,children:e.command})]}),(0,K.jsxs)(`span`,{className:u(`text-right`,M(e.cpu)),children:[e.cpu.toFixed(1),`%`]}),(0,K.jsx)(`span`,{className:`text-right text-text-secondary`,children:T(e.ramMB)}),n.columns.swap&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`swap`)),children:k(e.swapMB)}),n.columns.disk&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`disk`)),children:A(e.diskReadBps,e.diskWriteBps)}),n.columns.gpu&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`gpu`)),children:D(e.gpuPct,e.gpuMemMB)}),n.columns.net&&(0,K.jsx)(`span`,{className:u(`text-right text-text-secondary tabular-nums truncate`,G(n,`net`)),children:E(e.netInBps,e.netOutBps)}),(0,K.jsx)(`div`,{className:`flex justify-end`,children:(0,K.jsx)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),i(e)},disabled:e.protected,"aria-label":`End process ${e.name} (${e.pid})`,title:e.protected?ce:`End process ${e.name}`,"data-testid":`sysmon-kill-btn`,className:u(`flex items-center justify-center size-11 md:size-7 rounded transition-all`,`can-hover:opacity-0 can-hover:group-hover/proc:opacity-100`,e.protected?`opacity-40 cursor-not-allowed`:`hover:bg-error/20 hover:text-error active:bg-error/30`),children:(0,K.jsx)(r,{className:`size-3.5`})})})]})}var ue={STOP:`Suspend (SIGSTOP)`,CONT:`Continue (SIGCONT)`,TERM:`Terminate (SIGTERM)`,KILL:`Kill (SIGKILL)`,HUP:`Hang up (SIGHUP)`,INT:`Interrupt (SIGINT)`,USR1:`User signal 1`,USR2:`User signal 2`},de=[`KILL`,`STOP`];async function fe(e){let t=c(),n={"Content-Type":`application/json`,"X-PPM-Request":`1`};t&&(n.Authorization=`Bearer ${t}`);let r=await fetch(`/api/system/resources/signal`,{method:`POST`,headers:n,body:JSON.stringify(e)}),i;try{i=await r.json()}catch{throw Error(r.ok?`Empty response from server`:`Server error (HTTP ${r.status})`)}if(i.ok===!1)throw Error(i.error??`HTTP ${r.status}`);return i.data}function pe(e,t,n){return{pid:e.pid,startedAt:e.startedAt,signal:t,tree:n}}function me(){let[e,t]=(0,I.useState)(null);return{send:(0,I.useCallback)(async(e,n,r=!1)=>{t(e.pid);try{let t=(await fe(pe(e,n,r))).signalled.length;s.success(t>1?`Sent SIG${n} to ${e.name} and ${t-1} child processes`:`Sent SIG${n} to ${e.name} (${e.pid})`)}catch(t){s.error(t instanceof Error?t.message:`Could not signal ${e.name}`)}finally{t(null)}},[]),pending:e}}function he({proc:e,signals:t,onDetails:n,onKill:r,onSignal:i,children:a}){return(0,K.jsxs)(w,{children:[(0,K.jsx)(y,{asChild:!0,children:(0,K.jsx)(`div`,{className:`select-none`,children:a})}),(0,K.jsxs)(_,{children:[(0,K.jsx)(x,{onSelect:()=>n(e),children:`Details…`}),t.length>0&&(0,K.jsxs)(C,{children:[(0,K.jsx)(b,{children:`Send signal`}),(0,K.jsx)(S,{children:t.map(t=>(0,K.jsx)(x,{variant:de.includes(t)?`destructive`:void 0,disabled:e.protected,onSelect:()=>{e.protected||i(e,t,!1)},children:ue[t]},t))})]}),(0,K.jsx)(v,{}),(0,K.jsx)(x,{variant:`destructive`,disabled:e.protected,onSelect:()=>{e.protected||r(e)},children:`End process`}),e.protected&&(0,K.jsx)(`p`,{className:`px-2 py-1.5 text-[11px] text-text-subtle max-w-64`,children:`PPM or OS-critical process — it cannot be ended or signalled.`})]})]})}function ge(e){return e>0?new Date(e).toLocaleString():`—`}function _e({pid:e,name:t,onClose:n}){let r=d(),[i,a]=(0,I.useState)(null),[o,s]=(0,I.useState)(null);if((0,I.useEffect)(()=>{if(e===null){a(null),s(null);return}let t=!0;return a(null),s(null),l.get(`/api/system/resources/process/${e}`).then(e=>{t&&a(e)}).catch(e=>{t&&s(e instanceof Error?e.message:`Could not read the process`)}),()=>{t=!1}},[e]),e===null)return null;let c=(0,K.jsxs)(`div`,{className:`space-y-3`,"data-testid":`sysmon-process-details`,"data-pid":e,children:[o&&(0,K.jsx)(`p`,{className:`text-sm text-error`,children:o}),!o&&i===null&&(0,K.jsx)(`p`,{className:`text-sm text-text-subtle`,children:`Reading /proc…`}),i&&(0,K.jsxs)(K.Fragment,{children:[(0,K.jsxs)(`dl`,{className:`grid grid-cols-2 gap-x-4 gap-y-2 text-xs`,children:[(0,K.jsx)(X,{label:`PID`,value:i.pid}),(0,K.jsx)(X,{label:`Parent PID`,value:i.ppid}),(0,K.jsx)(X,{label:`User`,value:i.user}),(0,K.jsx)(X,{label:`State`,value:i.state}),(0,K.jsx)(X,{label:`Threads`,value:i.threads}),(0,K.jsx)(X,{label:`Nice`,value:i.nice}),(0,K.jsx)(X,{label:`Started`,value:ge(i.startedAt)}),(0,K.jsx)(X,{label:`Control group`,value:i.cgroup})]}),(0,K.jsx)(Z,{label:`Executable`,value:i.exe}),(0,K.jsx)(Z,{label:`Working directory`,value:i.cwd}),(0,K.jsx)(Z,{label:`Command line`,value:i.command,mono:!0})]})]});return r?(0,K.jsx)(g,{open:!0,onClose:n,children:(0,K.jsxs)(`div`,{className:`px-4 pb-4 space-y-3`,children:[(0,K.jsx)(`h2`,{className:`text-base font-semibold break-all`,children:t}),c]})}):(0,K.jsx)(h,{open:!0,onOpenChange:e=>!e&&n(),children:(0,K.jsxs)(p,{className:`sm:max-w-xl`,children:[(0,K.jsx)(f,{children:(0,K.jsx)(m,{className:`break-all`,children:t})}),c]})})}function X({label:e,value:t}){let n=t===null||t===``?`—`:String(t);return(0,K.jsxs)(`div`,{className:`min-w-0`,children:[(0,K.jsx)(`dt`,{className:`text-text-subtle`,children:e}),(0,K.jsx)(`dd`,{className:`truncate`,title:n,children:n})]})}function Z({label:e,value:t,mono:n}){return(0,K.jsxs)(`div`,{className:`space-y-1`,children:[(0,K.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:e}),(0,K.jsx)(`p`,{className:`text-xs break-all ${n?`font-mono`:``}`,children:t??`—`})]})}var Q=`ppm-sysmon-col-widths`;function ve(){try{let e=localStorage.getItem(Q);if(!e)return{};let t=JSON.parse(e),n={};for(let e of[`cpu`,`ram`,`disk`,`gpu`,`net`]){let r=t[e];typeof r==`number`&&Number.isFinite(r)&&(n[e]=H(r))}return n}catch{return{}}}function $(e){try{Object.keys(e).length===0?localStorage.removeItem(Q):localStorage.setItem(Q,JSON.stringify(e))}catch{}}function ye(){let[e,t]=(0,I.useState)(()=>typeof localStorage>`u`?{}:ve()),n=(0,I.useRef)(null);return(0,I.useEffect)(()=>{let e=e=>{let r=n.current;if(!r)return;let i=H(r.startWidth+(e.clientX-r.startX));t(e=>e[r.key]===i?e:{...e,[r.key]:i})},r=()=>{n.current&&(n.current=null,document.body.style.cursor=``,t(e=>($(e),e)))};return window.addEventListener(`pointermove`,e),window.addEventListener(`pointerup`,r),window.addEventListener(`pointercancel`,r),()=>{window.removeEventListener(`pointermove`,e),window.removeEventListener(`pointerup`,r),window.removeEventListener(`pointercancel`,r)}},[]),{widths:e,begin:(0,I.useCallback)((t,r)=>{r.preventDefault(),n.current={key:t,startX:r.clientX,startWidth:U(t,e)},document.body.style.cursor=`col-resize`},[e]),reset:(0,I.useCallback)(e=>{t(t=>{if(!(e in t))return t;let{[e]:n,...r}=t;return $(r),r})},[])}}var be={disk:!1,gpu:!1,net:!1};function xe({snapshot:e}){let t=d(),n=(0,I.useRef)(null),[r,i]=(0,I.useState)(`grouped`),[a,o]=(0,I.useState)(!1),[s,c]=(0,I.useState)(``),[l,u]=(0,I.useState)(null),[f,p]=(0,I.useState)(`desc`),[m,h]=(0,I.useState)(()=>new Set),{pendingKill:g,groupProtected:_,requestKillProcess:v,requestKillGroup:y,confirmKill:b,cancelKill:x}=N(e),{send:S}=me(),[C,w]=(0,I.useState)(null),T=e.signals??[],{widths:E,begin:D,reset:O}=ye(),{rows:k,totals:A}=(0,I.useMemo)(()=>P({processes:e.processes,groups:e.groups,mode:r,ppmOnly:a,query:s,sortKey:l,sortDir:f,expanded:m}),[e.processes,e.groups,r,a,s,l,f,m]),j=e.processColumns??be,M=(0,I.useMemo)(()=>re(j,l,E),[j,l,E]),F=e.system.gpus[0]?.utilPercent,L=ee({count:k.length,getScrollElement:()=>n.current,estimateSize:()=>t?44:28,overscan:12}),R=(0,I.useCallback)(e=>{let[t,n]=ne(l,f,e);u(t),p(n)},[l,f]),z=(0,I.useCallback)(e=>{h(t=>{let n=new Set(t);return n.has(e)?n.delete(e):n.add(e),n})},[]);return(0,K.jsxs)(`div`,{className:`h-full flex flex-col min-h-0 @container`,style:ie(M),"data-testid":`sysmon-processes`,"data-row-count":k.length,children:[(0,K.jsx)(J,{mode:r,onModeChange:i,ppmOnly:a,onPpmOnlyChange:o,onQueryChange:c}),(0,K.jsx)(Y,{sortKey:l,sortDir:f,grid:M,onSort:R,resize:{onResizeStart:D,onResizeReset:O}}),(0,K.jsx)(`div`,{ref:n,className:`flex-1 min-h-0 overflow-y-auto`,children:(0,K.jsx)(`div`,{style:{height:L.getTotalSize(),position:`relative`},children:L.getVirtualItems().map(e=>{let t=k[e.index];return t?(0,K.jsx)(`div`,{style:{position:`absolute`,top:0,left:0,right:0,transform:`translateY(${e.start}px)`},children:t.kind===`group`?(0,K.jsx)(se,{group:t.group,expanded:t.expanded,grid:M,killProtected:_.get(t.group.key)??!0,onToggle:z,onKillClick:y}):(0,K.jsx)(he,{proc:t.proc,signals:T,onDetails:w,onKill:v,onSignal:(e,t,n)=>void S(e,t,n),children:(0,K.jsx)(le,{proc:t.proc,indent:t.indent,grid:M,onKillClick:v})})},t.kind===`group`?t.group.key:`p:${t.proc.pid}`):null})})}),(0,K.jsx)(ae,{totals:A,grid:M,gpuUtilPercent:F}),(0,K.jsx)(te,{target:g,onConfirm:b,onCancel:x}),(0,K.jsx)(_e,{pid:C?.pid??null,name:C?.name??``,onClose:()=>w(null)})]})}export{xe as ProcessTable};
@@ -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{St as r,Yn as i,ir as a,nt as o,un as s}from"./icons-CO_II6D-.js";import"./api-client-F5Zi1sR0.js";import"./portal-container-context-NFSuymMu.js";import"./chat-preparation-cache-DoS7sdal.js";import{t as c}from"./button-CsmGH5xa.js";import{a as l,n as u,o as d,r as f,s as p,t as m}from"./dialog-z8PLkL8n.js";import{t as h}from"./input-CP31LZnN.js";import{Ct as g,In as _,Nt as v}from"./index-DQCw6d-2.js";import{C as y,a as b,d as x}from"./api-settings-BeINN5Dy.js";var S=e(t(),1),C=[{value:`claude-opus-5-5`,label:`Claude Opus 5.5`,hint:`balanced, recommended`},{value:`claude-fable-5-1`,label:`Claude Fable 5.1`,hint:`flagship`},{value:`claude-opus-5`,label:`Claude Opus 5`,hint:`most powerful`},{value:`claude-fable-5`,label:`Claude Fable 5`,hint:`flagship`},{value:`claude-opus-4-8`,label:`Claude Opus 4.8`,hint:`powerful`},{value:`claude-opus-4-7`,label:`Claude Opus 4.7`,hint:`powerful`},{value:`claude-opus-4-6`,label:`Claude Opus 4.6`,hint:`powerful`},{value:`claude-sonnet-5`,label:`Claude Sonnet 5`,hint:`fast`},{value:`claude-sonnet-4-6`,label:`Claude Sonnet 4.6`,hint:`fast`},{value:`claude-haiku-4-5`,label:`Claude Haiku 4.5`,hint:`cheap`}];C.map(e=>e.value);function w(e,t){return`${e}/proxy${t?`/${t}`:``}`}function T(e,t){let n=w(e,t);return{anthropicBase:n,openAiBase:`${n}/v1`,anthropicMessages:`${n}/v1/messages`,openAiChatCompletions:`${n}/v1/chat/completions`,models:`${n}/v1/models`,imagesGenerations:t?`${n}/v1/images/generations`:null,imagesEdits:t?`${n}/v1/images/edits`:null}}var E=n(),D=`Hello! Reply briefly.`,O=`claude-opus-5-5`;function k(e){let[t,n]=(0,S.useState)(!1);return(0,E.jsxs)(m,{open:t,onOpenChange:n,children:[(0,E.jsx)(p,{asChild:!0,children:(0,E.jsxs)(c,{variant:`outline`,size:`sm`,className:`h-7 text-[11px] gap-1.5 cursor-pointer`,children:[(0,E.jsx)(r,{className:`size-3`}),`Test`]})}),(0,E.jsxs)(u,{className:`sm:max-w-md max-h-[85vh] overflow-y-auto`,children:[(0,E.jsxs)(l,{children:[(0,E.jsx)(d,{className:`text-sm`,children:`Test Proxy`}),(0,E.jsx)(f,{className:`text-[11px]`,children:`Send a test request and inspect the raw response.`})]}),t&&(0,E.jsx)(A,{...e})]})]})}function A({authKey:e,baseUrl:t,provider:n}){let[r,a]=(0,S.useState)(`anthropic`),[o,l]=(0,S.useState)(D),[u,d]=(0,S.useState)(n?``:O),[f,p]=(0,S.useState)(!0),[m,g]=(0,S.useState)(!1),[_,y]=(0,S.useState)(null),[b,x]=(0,S.useState)(null),[w,k]=(0,S.useState)(null),A=(0,S.useRef)(null),j=(0,S.useRef)(null);(0,S.useEffect)(()=>{A.current?.select()},[]),(0,S.useEffect)(()=>{j.current&&(j.current.scrollTop=j.current.scrollHeight)},[_]);let M=e=>{a(e),y(null),x(null),k(null)},N=async()=>{g(!0),y(null),x(null),k(null);let i=Date.now(),a=r===`openai`,s=T(t,n),c=a?s.openAiChatCompletions:s.anthropicMessages,l=JSON.stringify({...u?{model:u}:{},max_tokens:256,stream:f,messages:[{role:`user`,content:o}]}),d={"Content-Type":`application/json`};a?d.Authorization=`Bearer ${e}`:(d[`x-api-key`]=e,d[`anthropic-version`]=`2023-06-01`);try{let e=await fetch(c,{method:`POST`,headers:d,body:l});if(!e.ok){let t=await e.text();x(`HTTP ${e.status}: ${t}`),g(!1),k(Date.now()-i);return}if(f){let t=e.body?.getReader();if(!t){x(`No response body`),g(!1);return}let n=new TextDecoder,r=``;for(;;){let{done:e,value:i}=await t.read();if(e)break;r+=n.decode(i,{stream:!0}),y(r)}k(Date.now()-i)}else{let t=await e.text();try{y(JSON.stringify(JSON.parse(t),null,2))}catch{y(t)}k(Date.now()-i)}}catch(e){x(e.message)}finally{g(!1),k(e=>e??Date.now()-i)}};return(0,E.jsxs)(`div`,{className:`space-y-3 min-w-0`,children:[(0,E.jsxs)(`div`,{className:`space-y-1.5 min-w-0`,children:[(0,E.jsx)(v,{className:`text-[11px]`,children:`Auth Style`}),(0,E.jsx)(`div`,{className:`flex gap-1`,children:[`anthropic`,`openai`].map(e=>(0,E.jsx)(`button`,{onClick:()=>M(e),className:`flex-1 h-8 rounded-md text-[11px] font-medium border transition-colors cursor-pointer ${r===e?`bg-primary text-primary-foreground border-primary`:`bg-muted text-muted-foreground border-transparent hover:bg-muted/80`}`,children:e===`anthropic`?`Anthropic`:`OpenAI`},e))}),(0,E.jsxs)(`p`,{className:`text-[9px] text-muted-foreground break-all`,children:[r===`anthropic`?`x-api-key header`:`Authorization: Bearer header`,` · `,(0,E.jsx)(`code`,{children:`/proxy${n?`/${n}`:``}/v1/${r===`anthropic`?`messages`:`chat/completions`}`})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(v,{className:`text-[11px]`,children:`Model`}),n?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(h,{value:u,onChange:e=>d(e.target.value),placeholder:`leave empty to let the provider choose`,className:`h-8 text-[11px] font-mono`}),(0,E.jsxs)(`p`,{className:`text-[9px] text-muted-foreground`,children:[`Names come from `,(0,E.jsxs)(`code`,{children:[`GET /proxy/`,n,`/v1/models`]}),`.`]})]}):(0,E.jsx)(`select`,{value:u,onChange:e=>d(e.target.value),className:`h-8 w-full rounded-md border bg-background px-2 text-[11px]`,children:C.map(e=>(0,E.jsx)(`option`,{value:e.value,children:e.value},e.value))})]}),(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(v,{className:`text-[11px]`,children:`Streaming`}),(0,E.jsx)(`div`,{className:`flex gap-1`,children:[!0,!1].map(e=>(0,E.jsx)(`button`,{onClick:()=>p(e),className:`h-7 px-3 rounded-md text-[11px] font-medium border transition-colors cursor-pointer ${f===e?`bg-primary text-primary-foreground border-primary`:`bg-muted text-muted-foreground border-transparent hover:bg-muted/80`}`,children:e?`Stream`:`JSON`},String(e)))})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(v,{className:`text-[11px]`,children:`Message`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,E.jsx)(h,{ref:A,value:o,onChange:e=>l(e.target.value),placeholder:`Type a test message...`,className:`h-9 text-[11px] flex-1 min-w-0`,onKeyDown:e=>{e.key===`Enter`&&!m&&N()}}),(0,E.jsxs)(c,{size:`sm`,className:`h-9 px-3 cursor-pointer shrink-0`,onClick:N,disabled:m||!o.trim(),children:[m?(0,E.jsx)(s,{className:`size-3.5 animate-spin`}):(0,E.jsx)(i,{className:`size-3.5`}),(0,E.jsx)(`span`,{className:`ml-1 text-[11px]`,children:m?`...`:`Send`})]})]})]}),(_||b)&&(0,E.jsxs)(`div`,{className:`space-y-1 min-w-0`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`Raw Response`}),w!=null&&(0,E.jsxs)(`span`,{className:`text-[9px] font-mono text-muted-foreground`,children:[(w/1e3).toFixed(1),`s`]})]}),b?(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-error/10 text-error p-2 rounded overflow-auto max-h-52 whitespace-pre-wrap break-all`,children:b}):(0,E.jsx)(`pre`,{ref:j,className:`text-[9px] font-mono bg-muted p-2 rounded overflow-auto max-h-52 whitespace-pre-wrap break-all`,children:_})]})]})}function j(){let[e,t]=(0,S.useState)(``),[n,r]=(0,S.useState)([]);(0,S.useEffect)(()=>{b().then(e=>r(Object.keys(e.providers??{}).filter(e=>e!==`mock`&&e!==`claude`))).catch(()=>r([]))},[]);let[i,s]=(0,S.useState)(null),[l,u]=(0,S.useState)(!0),[d,f]=(0,S.useState)(!1),[p,m]=(0,S.useState)(null),[C,w]=(0,S.useState)(null);(0,S.useEffect)(()=>{u(!0),x().then(s).catch(e=>m(e.message)).finally(()=>u(!1))},[]);let D=async e=>{f(!0),m(null);try{s(await y(e))}catch(e){m(e.message)}finally{f(!1)}},O=(e,t)=>{_(e),w(t),setTimeout(()=>w(null),2e3)};if(l||!i)return(0,E.jsxs)(`div`,{className:`space-y-2`,children:[(0,E.jsx)(`h3`,{className:`text-xs font-medium text-text-secondary`,children:`API Proxy`}),(0,E.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:p?`Error: ${p}`:`Loading...`})]});let A=!!i.authKey,j=!!i.tunnelUrl,M=i.localEndpoint.replace(/\/proxy\/v1\/messages$/,``),N=T(j?i.tunnelUrl:M,e),P=N.anthropicMessages,F=N.openAiChatCompletions,I=`ANTHROPIC_BASE_URL=${N.anthropicBase}\nANTHROPIC_API_KEY=${i.authKey}`,L=`OPENAI_BASE_URL=${N.openAiBase}\nOPENAI_API_KEY=${i.authKey}`;return(0,E.jsxs)(`div`,{className:`space-y-4`,children:[(0,E.jsx)(`div`,{className:`space-y-1.5`,children:(0,E.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Expose your accounts as an API that speaks both the Anthropic and OpenAI formats, so most SDKs need only a new base URL. The default path answers from your Claude accounts; pick a provider below to run its agent instead, which also unlocks image generation.`})}),(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,E.jsx)(v,{className:`text-xs`,children:`Enable Proxy`}),(0,E.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Accept API requests under /proxy`})]}),(0,E.jsx)(g,{checked:i.enabled,onCheckedChange:e=>D({enabled:e}),disabled:d})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(v,{className:`text-[11px]`,children:`Auth Key`}),A?(0,E.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,E.jsx)(h,{readOnly:!0,value:i.authKey,className:`h-7 text-[11px] font-mono flex-1`}),(0,E.jsx)(c,{variant:`outline`,size:`sm`,className:`h-7 px-2 cursor-pointer shrink-0`,onClick:()=>O(i.authKey,`key`),children:C===`key`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})}),(0,E.jsx)(c,{variant:`outline`,size:`sm`,className:`h-7 px-2 cursor-pointer shrink-0`,onClick:()=>D({generateKey:!0}),disabled:d,children:(0,E.jsx)(a,{className:`size-3`})})]}):(0,E.jsx)(c,{variant:`outline`,size:`sm`,className:`h-7 text-xs cursor-pointer`,onClick:()=>D({generateKey:!0}),disabled:d,children:`Generate Auth Key`}),(0,E.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Use as Bearer token or x-api-key when calling the proxy.`})]}),i.enabled&&A&&(0,E.jsxs)(`div`,{className:`space-y-2 rounded-md border p-3 bg-muted/30`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(`h4`,{className:`text-[11px] font-medium`,children:`Connection Info`}),(0,E.jsx)(k,{authKey:i.authKey,baseUrl:window.location.origin,provider:e})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`Provider`}),(0,E.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:[{id:``,label:`Claude (default)`},...n.map(e=>({id:e,label:e}))].map(n=>(0,E.jsx)(`button`,{type:`button`,onClick:()=>t(n.id),className:`text-[10px] px-2.5 min-h-[36px] rounded-md border transition-colors cursor-pointer ${e===n.id?`border-primary bg-primary/15`:`border-border bg-muted/40 hover:bg-muted`}`,children:n.label},n.id||`default`))}),e&&(0,E.jsxs)(`p`,{className:`text-[10px] text-muted-foreground`,children:[`Runs the `,e,` agent per request (read-only sandbox, one turn). Slower than the default path.`]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`Anthropic Endpoint`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5 items-center`,children:[(0,E.jsx)(`code`,{className:`text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded flex-1 truncate`,children:P}),(0,E.jsx)(c,{variant:`ghost`,size:`sm`,className:`h-6 px-1.5 cursor-pointer shrink-0`,onClick:()=>O(P,`anthropic`),children:C===`anthropic`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`OpenAI-Compatible Endpoint`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5 items-center`,children:[(0,E.jsx)(`code`,{className:`text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded flex-1 truncate`,children:F}),(0,E.jsx)(c,{variant:`ghost`,size:`sm`,className:`h-6 px-1.5 cursor-pointer shrink-0`,onClick:()=>O(F,`openai`),children:C===`openai`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})})]})]}),N.imagesGenerations&&N.imagesEdits&&(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`Image Endpoints`}),(0,E.jsx)(`code`,{className:`block text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded truncate`,children:N.imagesGenerations}),(0,E.jsx)(`code`,{className:`block text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded truncate`,children:N.imagesEdits})]}),!j&&(0,E.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Start a Cloudflare tunnel (Share) to get a public URL.`}),(0,E.jsxs)(`div`,{className:`space-y-1 pt-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`Anthropic Format`}),(0,E.jsxs)(`div`,{className:`relative`,children:[(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-muted p-2 rounded overflow-x-auto whitespace-pre`,children:I}),(0,E.jsx)(c,{variant:`ghost`,size:`sm`,className:`absolute top-1 right-1 h-5 px-1 cursor-pointer`,onClick:()=>O(I,`anthropic-env`),children:C===`anthropic-env`?`Copied!`:(0,E.jsx)(o,{className:`size-2.5`})})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(v,{className:`text-[10px] text-muted-foreground`,children:`OpenAI Format`}),(0,E.jsxs)(`div`,{className:`relative`,children:[(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-muted p-2 rounded overflow-x-auto whitespace-pre`,children:L}),(0,E.jsx)(c,{variant:`ghost`,size:`sm`,className:`absolute top-1 right-1 h-5 px-1 cursor-pointer`,onClick:()=>O(L,`openai-env`),children:C===`openai-env`?`Copied!`:(0,E.jsx)(o,{className:`size-2.5`})})]})]}),(0,E.jsx)(`div`,{className:`flex items-center gap-3 pt-1`,children:(0,E.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[`Requests served: `,(0,E.jsx)(`span`,{className:`font-mono`,children:i.requestCount})]})})]}),d&&(0,E.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Saving...`}),p&&(0,E.jsx)(`p`,{className:`text-[11px] text-error`,children:p})]})}export{j as ProxySettingsSection};
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{St as r,Yn as i,ir as a,nt as o,un as s}from"./icons-CO_II6D-.js";import"./api-client-F5Zi1sR0.js";import"./portal-container-context-NFSuymMu.js";import"./chat-preparation-cache-DoS7sdal.js";import{t as c}from"./button-CsmGH5xa.js";import{a as l,n as u,o as d,r as f,s as p,t as m}from"./dialog-z8PLkL8n.js";import{t as h}from"./input-CP31LZnN.js";import{Ft as g,Rn as _,Tt as v}from"./index-CIscPw4g.js";import{C as y,a as b,d as x}from"./api-settings-BWgfXl7o.js";var S=e(t(),1),C=[{value:`claude-opus-5-5`,label:`Claude Opus 5.5`,hint:`balanced, recommended`},{value:`claude-fable-5-1`,label:`Claude Fable 5.1`,hint:`flagship`},{value:`claude-opus-5`,label:`Claude Opus 5`,hint:`most powerful`},{value:`claude-fable-5`,label:`Claude Fable 5`,hint:`flagship`},{value:`claude-opus-4-8`,label:`Claude Opus 4.8`,hint:`powerful`},{value:`claude-opus-4-7`,label:`Claude Opus 4.7`,hint:`powerful`},{value:`claude-opus-4-6`,label:`Claude Opus 4.6`,hint:`powerful`},{value:`claude-sonnet-5`,label:`Claude Sonnet 5`,hint:`fast`},{value:`claude-sonnet-4-6`,label:`Claude Sonnet 4.6`,hint:`fast`},{value:`claude-haiku-4-5`,label:`Claude Haiku 4.5`,hint:`cheap`}];C.map(e=>e.value);function w(e,t){return`${e}/proxy${t?`/${t}`:``}`}function T(e,t){let n=w(e,t);return{anthropicBase:n,openAiBase:`${n}/v1`,anthropicMessages:`${n}/v1/messages`,openAiChatCompletions:`${n}/v1/chat/completions`,models:`${n}/v1/models`,imagesGenerations:t?`${n}/v1/images/generations`:null,imagesEdits:t?`${n}/v1/images/edits`:null}}var E=n(),D=`Hello! Reply briefly.`,O=`claude-opus-5-5`;function k(e){let[t,n]=(0,S.useState)(!1);return(0,E.jsxs)(m,{open:t,onOpenChange:n,children:[(0,E.jsx)(p,{asChild:!0,children:(0,E.jsxs)(c,{variant:`outline`,size:`sm`,className:`h-7 text-[11px] gap-1.5 cursor-pointer`,children:[(0,E.jsx)(r,{className:`size-3`}),`Test`]})}),(0,E.jsxs)(u,{className:`sm:max-w-md max-h-[85vh] overflow-y-auto`,children:[(0,E.jsxs)(l,{children:[(0,E.jsx)(d,{className:`text-sm`,children:`Test Proxy`}),(0,E.jsx)(f,{className:`text-[11px]`,children:`Send a test request and inspect the raw response.`})]}),t&&(0,E.jsx)(A,{...e})]})]})}function A({authKey:e,baseUrl:t,provider:n}){let[r,a]=(0,S.useState)(`anthropic`),[o,l]=(0,S.useState)(D),[u,d]=(0,S.useState)(n?``:O),[f,p]=(0,S.useState)(!0),[m,_]=(0,S.useState)(!1),[v,y]=(0,S.useState)(null),[b,x]=(0,S.useState)(null),[w,k]=(0,S.useState)(null),A=(0,S.useRef)(null),j=(0,S.useRef)(null);(0,S.useEffect)(()=>{A.current?.select()},[]),(0,S.useEffect)(()=>{j.current&&(j.current.scrollTop=j.current.scrollHeight)},[v]);let M=e=>{a(e),y(null),x(null),k(null)},N=async()=>{_(!0),y(null),x(null),k(null);let i=Date.now(),a=r===`openai`,s=T(t,n),c=a?s.openAiChatCompletions:s.anthropicMessages,l=JSON.stringify({...u?{model:u}:{},max_tokens:256,stream:f,messages:[{role:`user`,content:o}]}),d={"Content-Type":`application/json`};a?d.Authorization=`Bearer ${e}`:(d[`x-api-key`]=e,d[`anthropic-version`]=`2023-06-01`);try{let e=await fetch(c,{method:`POST`,headers:d,body:l});if(!e.ok){let t=await e.text();x(`HTTP ${e.status}: ${t}`),_(!1),k(Date.now()-i);return}if(f){let t=e.body?.getReader();if(!t){x(`No response body`),_(!1);return}let n=new TextDecoder,r=``;for(;;){let{done:e,value:i}=await t.read();if(e)break;r+=n.decode(i,{stream:!0}),y(r)}k(Date.now()-i)}else{let t=await e.text();try{y(JSON.stringify(JSON.parse(t),null,2))}catch{y(t)}k(Date.now()-i)}}catch(e){x(e.message)}finally{_(!1),k(e=>e??Date.now()-i)}};return(0,E.jsxs)(`div`,{className:`space-y-3 min-w-0`,children:[(0,E.jsxs)(`div`,{className:`space-y-1.5 min-w-0`,children:[(0,E.jsx)(g,{className:`text-[11px]`,children:`Auth Style`}),(0,E.jsx)(`div`,{className:`flex gap-1`,children:[`anthropic`,`openai`].map(e=>(0,E.jsx)(`button`,{onClick:()=>M(e),className:`flex-1 h-8 rounded-md text-[11px] font-medium border transition-colors cursor-pointer ${r===e?`bg-primary text-primary-foreground border-primary`:`bg-muted text-muted-foreground border-transparent hover:bg-muted/80`}`,children:e===`anthropic`?`Anthropic`:`OpenAI`},e))}),(0,E.jsxs)(`p`,{className:`text-[9px] text-muted-foreground break-all`,children:[r===`anthropic`?`x-api-key header`:`Authorization: Bearer header`,` · `,(0,E.jsx)(`code`,{children:`/proxy${n?`/${n}`:``}/v1/${r===`anthropic`?`messages`:`chat/completions`}`})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(g,{className:`text-[11px]`,children:`Model`}),n?(0,E.jsxs)(E.Fragment,{children:[(0,E.jsx)(h,{value:u,onChange:e=>d(e.target.value),placeholder:`leave empty to let the provider choose`,className:`h-8 text-[11px] font-mono`}),(0,E.jsxs)(`p`,{className:`text-[9px] text-muted-foreground`,children:[`Names come from `,(0,E.jsxs)(`code`,{children:[`GET /proxy/`,n,`/v1/models`]}),`.`]})]}):(0,E.jsx)(`select`,{value:u,onChange:e=>d(e.target.value),className:`h-8 w-full rounded-md border bg-background px-2 text-[11px]`,children:C.map(e=>(0,E.jsx)(`option`,{value:e.value,children:e.value},e.value))})]}),(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(g,{className:`text-[11px]`,children:`Streaming`}),(0,E.jsx)(`div`,{className:`flex gap-1`,children:[!0,!1].map(e=>(0,E.jsx)(`button`,{onClick:()=>p(e),className:`h-7 px-3 rounded-md text-[11px] font-medium border transition-colors cursor-pointer ${f===e?`bg-primary text-primary-foreground border-primary`:`bg-muted text-muted-foreground border-transparent hover:bg-muted/80`}`,children:e?`Stream`:`JSON`},String(e)))})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(g,{className:`text-[11px]`,children:`Message`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,E.jsx)(h,{ref:A,value:o,onChange:e=>l(e.target.value),placeholder:`Type a test message...`,className:`h-9 text-[11px] flex-1 min-w-0`,onKeyDown:e=>{e.key===`Enter`&&!m&&N()}}),(0,E.jsxs)(c,{size:`sm`,className:`h-9 px-3 cursor-pointer shrink-0`,onClick:N,disabled:m||!o.trim(),children:[m?(0,E.jsx)(s,{className:`size-3.5 animate-spin`}):(0,E.jsx)(i,{className:`size-3.5`}),(0,E.jsx)(`span`,{className:`ml-1 text-[11px]`,children:m?`...`:`Send`})]})]})]}),(v||b)&&(0,E.jsxs)(`div`,{className:`space-y-1 min-w-0`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(g,{className:`text-[10px] text-muted-foreground`,children:`Raw Response`}),w!=null&&(0,E.jsxs)(`span`,{className:`text-[9px] font-mono text-muted-foreground`,children:[(w/1e3).toFixed(1),`s`]})]}),b?(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-error/10 text-error p-2 rounded overflow-auto max-h-52 whitespace-pre-wrap break-all`,children:b}):(0,E.jsx)(`pre`,{ref:j,className:`text-[9px] font-mono bg-muted p-2 rounded overflow-auto max-h-52 whitespace-pre-wrap break-all`,children:v})]})]})}function j(){let[e,t]=(0,S.useState)(``),[n,r]=(0,S.useState)([]);(0,S.useEffect)(()=>{b().then(e=>r(Object.keys(e.providers??{}).filter(e=>e!==`mock`&&e!==`claude`))).catch(()=>r([]))},[]);let[i,s]=(0,S.useState)(null),[l,u]=(0,S.useState)(!0),[d,f]=(0,S.useState)(!1),[p,m]=(0,S.useState)(null),[C,w]=(0,S.useState)(null);(0,S.useEffect)(()=>{u(!0),x().then(s).catch(e=>m(e.message)).finally(()=>u(!1))},[]);let D=async e=>{f(!0),m(null);try{s(await y(e))}catch(e){m(e.message)}finally{f(!1)}},O=(e,t)=>{_(e),w(t),setTimeout(()=>w(null),2e3)};if(l||!i)return(0,E.jsxs)(`div`,{className:`space-y-2`,children:[(0,E.jsx)(`h3`,{className:`text-xs font-medium text-text-secondary`,children:`API Proxy`}),(0,E.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:p?`Error: ${p}`:`Loading...`})]});let A=!!i.authKey,j=!!i.tunnelUrl,M=i.localEndpoint.replace(/\/proxy\/v1\/messages$/,``),N=T(j?i.tunnelUrl:M,e),P=N.anthropicMessages,F=N.openAiChatCompletions,I=`ANTHROPIC_BASE_URL=${N.anthropicBase}\nANTHROPIC_API_KEY=${i.authKey}`,L=`OPENAI_BASE_URL=${N.openAiBase}\nOPENAI_API_KEY=${i.authKey}`;return(0,E.jsxs)(`div`,{className:`space-y-4`,children:[(0,E.jsx)(`div`,{className:`space-y-1.5`,children:(0,E.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Expose your accounts as an API that speaks both the Anthropic and OpenAI formats, so most SDKs need only a new base URL. The default path answers from your Claude accounts; pick a provider below to run its agent instead, which also unlocks image generation.`})}),(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,E.jsx)(g,{className:`text-xs`,children:`Enable Proxy`}),(0,E.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Accept API requests under /proxy`})]}),(0,E.jsx)(v,{checked:i.enabled,onCheckedChange:e=>D({enabled:e}),disabled:d})]}),(0,E.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,E.jsx)(g,{className:`text-[11px]`,children:`Auth Key`}),A?(0,E.jsxs)(`div`,{className:`flex gap-1.5`,children:[(0,E.jsx)(h,{readOnly:!0,value:i.authKey,className:`h-7 text-[11px] font-mono flex-1`}),(0,E.jsx)(c,{variant:`outline`,size:`sm`,className:`h-7 px-2 cursor-pointer shrink-0`,onClick:()=>O(i.authKey,`key`),children:C===`key`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})}),(0,E.jsx)(c,{variant:`outline`,size:`sm`,className:`h-7 px-2 cursor-pointer shrink-0`,onClick:()=>D({generateKey:!0}),disabled:d,children:(0,E.jsx)(a,{className:`size-3`})})]}):(0,E.jsx)(c,{variant:`outline`,size:`sm`,className:`h-7 text-xs cursor-pointer`,onClick:()=>D({generateKey:!0}),disabled:d,children:`Generate Auth Key`}),(0,E.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Use as Bearer token or x-api-key when calling the proxy.`})]}),i.enabled&&A&&(0,E.jsxs)(`div`,{className:`space-y-2 rounded-md border p-3 bg-muted/30`,children:[(0,E.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,E.jsx)(`h4`,{className:`text-[11px] font-medium`,children:`Connection Info`}),(0,E.jsx)(k,{authKey:i.authKey,baseUrl:window.location.origin,provider:e})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(g,{className:`text-[10px] text-muted-foreground`,children:`Provider`}),(0,E.jsx)(`div`,{className:`flex flex-wrap gap-1.5`,children:[{id:``,label:`Claude (default)`},...n.map(e=>({id:e,label:e}))].map(n=>(0,E.jsx)(`button`,{type:`button`,onClick:()=>t(n.id),className:`text-[10px] px-2.5 min-h-[36px] rounded-md border transition-colors cursor-pointer ${e===n.id?`border-primary bg-primary/15`:`border-border bg-muted/40 hover:bg-muted`}`,children:n.label},n.id||`default`))}),e&&(0,E.jsxs)(`p`,{className:`text-[10px] text-muted-foreground`,children:[`Runs the `,e,` agent per request (read-only sandbox, one turn). Slower than the default path.`]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(g,{className:`text-[10px] text-muted-foreground`,children:`Anthropic Endpoint`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5 items-center`,children:[(0,E.jsx)(`code`,{className:`text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded flex-1 truncate`,children:P}),(0,E.jsx)(c,{variant:`ghost`,size:`sm`,className:`h-6 px-1.5 cursor-pointer shrink-0`,onClick:()=>O(P,`anthropic`),children:C===`anthropic`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(g,{className:`text-[10px] text-muted-foreground`,children:`OpenAI-Compatible Endpoint`}),(0,E.jsxs)(`div`,{className:`flex gap-1.5 items-center`,children:[(0,E.jsx)(`code`,{className:`text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded flex-1 truncate`,children:F}),(0,E.jsx)(c,{variant:`ghost`,size:`sm`,className:`h-6 px-1.5 cursor-pointer shrink-0`,onClick:()=>O(F,`openai`),children:C===`openai`?`Copied!`:(0,E.jsx)(o,{className:`size-3`})})]})]}),N.imagesGenerations&&N.imagesEdits&&(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(g,{className:`text-[10px] text-muted-foreground`,children:`Image Endpoints`}),(0,E.jsx)(`code`,{className:`block text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded truncate`,children:N.imagesGenerations}),(0,E.jsx)(`code`,{className:`block text-[10px] font-mono bg-muted px-1.5 py-0.5 rounded truncate`,children:N.imagesEdits})]}),!j&&(0,E.jsx)(`p`,{className:`text-[10px] text-muted-foreground`,children:`Start a Cloudflare tunnel (Share) to get a public URL.`}),(0,E.jsxs)(`div`,{className:`space-y-1 pt-1`,children:[(0,E.jsx)(g,{className:`text-[10px] text-muted-foreground`,children:`Anthropic Format`}),(0,E.jsxs)(`div`,{className:`relative`,children:[(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-muted p-2 rounded overflow-x-auto whitespace-pre`,children:I}),(0,E.jsx)(c,{variant:`ghost`,size:`sm`,className:`absolute top-1 right-1 h-5 px-1 cursor-pointer`,onClick:()=>O(I,`anthropic-env`),children:C===`anthropic-env`?`Copied!`:(0,E.jsx)(o,{className:`size-2.5`})})]})]}),(0,E.jsxs)(`div`,{className:`space-y-1`,children:[(0,E.jsx)(g,{className:`text-[10px] text-muted-foreground`,children:`OpenAI Format`}),(0,E.jsxs)(`div`,{className:`relative`,children:[(0,E.jsx)(`pre`,{className:`text-[9px] font-mono bg-muted p-2 rounded overflow-x-auto whitespace-pre`,children:L}),(0,E.jsx)(c,{variant:`ghost`,size:`sm`,className:`absolute top-1 right-1 h-5 px-1 cursor-pointer`,onClick:()=>O(L,`openai-env`),children:C===`openai-env`?`Copied!`:(0,E.jsx)(o,{className:`size-2.5`})})]})]}),(0,E.jsx)(`div`,{className:`flex items-center gap-3 pt-1`,children:(0,E.jsxs)(`span`,{className:`text-[10px] text-muted-foreground`,children:[`Requests served: `,(0,E.jsx)(`span`,{className:`font-mono`,children:i.requestCount})]})})]}),d&&(0,E.jsx)(`p`,{className:`text-[11px] text-text-subtle`,children:`Saving...`}),p&&(0,E.jsx)(`p`,{className:`text-[11px] text-error`,children:p})]})}export{j as ProxySettingsSection};
@@ -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{Mr as r,un as i}from"./icons-CO_II6D-.js";import{O as a}from"./api-client-F5Zi1sR0.js";import"./chat-preparation-cache-DoS7sdal.js";import{t as o}from"./button-CsmGH5xa.js";import{t as s}from"./input-CP31LZnN.js";import{f as c,n as l,w as u}from"./api-settings-BeINN5Dy.js";var d=e(t(),1),f=n();function p(e){return e<1024*1024?`${(e/1024).toFixed(0)} KB`:`${(e/1024/1024).toFixed(1)} MB`}function m(){let[e,t]=(0,d.useState)(null),[n,m]=(0,d.useState)(``),[h,g]=(0,d.useState)(``),[_,v]=(0,d.useState)(!1),[y,b]=(0,d.useState)(!1);function x(e){t(e),m(String(e.retention_days)),g(String(e.max_size_mb))}(0,d.useEffect)(()=>{c().then(x).catch(e=>a.error(`Could not load audit settings`,{description:e.message}))},[]);async function S(){v(!0);try{x(await u({retention_days:Number(n),max_size_mb:Number(h)})),a.success(`Audit retention updated`)}catch(e){a.error(`Could not save`,{description:e.message})}finally{v(!1)}}async function C(){if(confirm(`Delete every recorded query? This cannot be undone.`)){b(!0);try{await l(),x(await c()),a.success(`Query audit log cleared`)}catch(e){a.error(`Could not clear the log`,{description:e.message})}finally{b(!1)}}}if(!e)return(0,f.jsx)(`div`,{className:`flex items-center justify-center py-8 text-muted-foreground`,children:(0,f.jsx)(i,{className:`size-4 animate-spin`})});let w=n!==String(e.retention_days)||h!==String(e.max_size_mb);return(0,f.jsxs)(`div`,{className:`space-y-4`,children:[(0,f.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[`Every statement run from the SQL editor, the data grid and the `,(0,f.jsx)(`code`,{children:`ppm db`}),` CLI is recorded, together with a sample of the result. Entries are pruned once they pass either limit below — whichever comes first.`]}),(0,f.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,f.jsxs)(`label`,{className:`space-y-1`,children:[(0,f.jsx)(`span`,{className:`text-xs font-medium`,children:`Keep for (days)`}),(0,f.jsx)(s,{type:`number`,min:1,value:n,onChange:e=>m(e.target.value),className:`h-8 text-xs`})]}),(0,f.jsxs)(`label`,{className:`space-y-1`,children:[(0,f.jsx)(`span`,{className:`text-xs font-medium`,children:`Max size (MB)`}),(0,f.jsx)(s,{type:`number`,min:10,value:h,onChange:e=>g(e.target.value),className:`h-8 text-xs`})]})]}),(0,f.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,f.jsxs)(`span`,{className:`text-[11px] text-muted-foreground`,children:[e.entry_count.toLocaleString(),` entries · `,p(e.size_bytes),` on disk`]}),(0,f.jsx)(o,{size:`sm`,className:`h-8 text-xs`,disabled:!w||_,onClick:S,children:_?(0,f.jsx)(i,{className:`size-3.5 animate-spin`}):`Save`})]}),(0,f.jsxs)(o,{variant:`outline`,size:`sm`,className:`h-8 w-full gap-1.5 text-xs text-destructive`,disabled:y||e.entry_count===0,onClick:C,children:[y?(0,f.jsx)(i,{className:`size-3.5 animate-spin`}):(0,f.jsx)(r,{className:`size-3.5`}),`Clear all recorded queries`]})]})}export{m as QueryAuditSection};
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{Mr as r,un as i}from"./icons-CO_II6D-.js";import{O as a}from"./api-client-F5Zi1sR0.js";import"./chat-preparation-cache-DoS7sdal.js";import{t as o}from"./button-CsmGH5xa.js";import{t as s}from"./input-CP31LZnN.js";import{f as c,n as l,w as u}from"./api-settings-BWgfXl7o.js";var d=e(t(),1),f=n();function p(e){return e<1024*1024?`${(e/1024).toFixed(0)} KB`:`${(e/1024/1024).toFixed(1)} MB`}function m(){let[e,t]=(0,d.useState)(null),[n,m]=(0,d.useState)(``),[h,g]=(0,d.useState)(``),[_,v]=(0,d.useState)(!1),[y,b]=(0,d.useState)(!1);function x(e){t(e),m(String(e.retention_days)),g(String(e.max_size_mb))}(0,d.useEffect)(()=>{c().then(x).catch(e=>a.error(`Could not load audit settings`,{description:e.message}))},[]);async function S(){v(!0);try{x(await u({retention_days:Number(n),max_size_mb:Number(h)})),a.success(`Audit retention updated`)}catch(e){a.error(`Could not save`,{description:e.message})}finally{v(!1)}}async function C(){if(confirm(`Delete every recorded query? This cannot be undone.`)){b(!0);try{await l(),x(await c()),a.success(`Query audit log cleared`)}catch(e){a.error(`Could not clear the log`,{description:e.message})}finally{b(!1)}}}if(!e)return(0,f.jsx)(`div`,{className:`flex items-center justify-center py-8 text-muted-foreground`,children:(0,f.jsx)(i,{className:`size-4 animate-spin`})});let w=n!==String(e.retention_days)||h!==String(e.max_size_mb);return(0,f.jsxs)(`div`,{className:`space-y-4`,children:[(0,f.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[`Every statement run from the SQL editor, the data grid and the `,(0,f.jsx)(`code`,{children:`ppm db`}),` CLI is recorded, together with a sample of the result. Entries are pruned once they pass either limit below — whichever comes first.`]}),(0,f.jsxs)(`div`,{className:`grid grid-cols-2 gap-3`,children:[(0,f.jsxs)(`label`,{className:`space-y-1`,children:[(0,f.jsx)(`span`,{className:`text-xs font-medium`,children:`Keep for (days)`}),(0,f.jsx)(s,{type:`number`,min:1,value:n,onChange:e=>m(e.target.value),className:`h-8 text-xs`})]}),(0,f.jsxs)(`label`,{className:`space-y-1`,children:[(0,f.jsx)(`span`,{className:`text-xs font-medium`,children:`Max size (MB)`}),(0,f.jsx)(s,{type:`number`,min:10,value:h,onChange:e=>g(e.target.value),className:`h-8 text-xs`})]})]}),(0,f.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,f.jsxs)(`span`,{className:`text-[11px] text-muted-foreground`,children:[e.entry_count.toLocaleString(),` entries · `,p(e.size_bytes),` on disk`]}),(0,f.jsx)(o,{size:`sm`,className:`h-8 text-xs`,disabled:!w||_,onClick:S,children:_?(0,f.jsx)(i,{className:`size-3.5 animate-spin`}):`Save`})]}),(0,f.jsxs)(o,{variant:`outline`,size:`sm`,className:`h-8 w-full gap-1.5 text-xs text-destructive`,disabled:y||e.entry_count===0,onClick:C,children:[y?(0,f.jsx)(i,{className:`size-3.5 animate-spin`}):(0,f.jsx)(r,{className:`size-3.5`}),`Clear all recorded queries`]})]})}export{m as QueryAuditSection};