@lunora/studio 1.0.0-alpha.7 → 1.0.0-alpha.71

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 (295) hide show
  1. package/LICENSE.md +6 -0
  2. package/dist/index.d.ts +762 -779
  3. package/dist/index.js +1 -41
  4. package/dist/mount.d.ts +10 -10
  5. package/dist/mount.js +1 -26
  6. package/dist/packem_chunks/ApiTab.js +1 -0
  7. package/dist/packem_chunks/AuditPanel.js +1 -0
  8. package/dist/packem_chunks/DeploymentHealthPanel.js +1 -0
  9. package/dist/packem_chunks/ExportImportPanel.js +3 -0
  10. package/dist/packem_chunks/FileBrowser.js +4 -0
  11. package/dist/packem_chunks/FunctionRunner.js +1 -0
  12. package/dist/packem_chunks/FunctionStatsPanel.js +1 -0
  13. package/dist/packem_chunks/HealthPanel.js +1 -0
  14. package/dist/packem_chunks/InsightsPanel.js +1 -0
  15. package/dist/packem_chunks/LogsPanel.js +1 -0
  16. package/dist/packem_chunks/MailPanel.js +2 -0
  17. package/dist/packem_chunks/MetricsPanel.js +1 -0
  18. package/dist/packem_chunks/MigrationsPanel.js +1 -0
  19. package/dist/packem_chunks/NotificationsPanel.js +1 -0
  20. package/dist/packem_chunks/PitrPanel.js +1 -0
  21. package/dist/packem_chunks/SchemaViewer.js +2 -0
  22. package/dist/packem_chunks/SecurityAdvisorPanel.js +1 -0
  23. package/dist/packem_chunks/SettingsPanel.js +1 -0
  24. package/dist/packem_chunks/SqlEditorPanel.js +4 -0
  25. package/dist/packem_chunks/TableEditor.js +1 -0
  26. package/dist/packem_chunks/agents-panel.js +1 -0
  27. package/dist/packem_chunks/analytics-panel.js +1 -0
  28. package/dist/packem_chunks/auth-audit-panel.js +1 -0
  29. package/dist/packem_chunks/auth-config-panel.js +1 -0
  30. package/dist/packem_chunks/auth-sessions-panel.js +1 -0
  31. package/dist/packem_chunks/containers-panel.js +1 -0
  32. package/dist/packem_chunks/dashboards-panel.js +1 -0
  33. package/dist/packem_chunks/fanout-panel.js +1 -0
  34. package/dist/packem_chunks/flags-panel.js +1 -0
  35. package/dist/packem_chunks/issues-panel.js +1 -0
  36. package/dist/packem_chunks/kv-browser.js +1 -0
  37. package/dist/packem_chunks/log-drains-panel.js +4 -0
  38. package/dist/packem_chunks/organizations-panel.js +1 -0
  39. package/dist/packem_chunks/payments-panel.js +1 -0
  40. package/dist/packem_chunks/permissions-panel.js +1 -0
  41. package/dist/packem_chunks/queues-panel.js +1 -0
  42. package/dist/packem_chunks/rls-panel.js +1 -0
  43. package/dist/packem_chunks/schedule-panel.js +1 -0
  44. package/dist/packem_chunks/sparkline.js +1 -0
  45. package/dist/packem_chunks/storage-rules-panel.js +1 -0
  46. package/dist/packem_chunks/subscriptions-panel.js +1 -0
  47. package/dist/packem_chunks/sync-client-panel.js +1 -0
  48. package/dist/packem_chunks/traces-panel.js +1 -0
  49. package/dist/packem_chunks/users-panel.js +1 -0
  50. package/dist/packem_chunks/vector-browser.js +1 -0
  51. package/dist/packem_chunks/workflows-panel.js +1 -0
  52. package/dist/packem_shared/ADMIN_FUNCTIONS-BYNSbBVE.js +1 -0
  53. package/dist/packem_shared/ApiDocsPanel-eJYZlylw.js +2 -0
  54. package/dist/packem_shared/ApiReferencePanel-C42v1jr6.js +1 -0
  55. package/dist/packem_shared/CommandPalette-CVIaY3j8.js +1 -0
  56. package/dist/packem_shared/ConfirmButton-CTL3f3kr.js +1 -0
  57. package/dist/packem_shared/ConnectionBadge-DOk0CQWo.js +1 -0
  58. package/dist/packem_shared/DEFAULT_AUTO_REFRESH_MS-BCC8_4BQ.js +1 -0
  59. package/dist/packem_shared/DEFAULT_INSIGHT_THRESHOLDS-B-hcFVoi.js +1 -0
  60. package/dist/packem_shared/DEFAULT_LOCALE-BZ4NojpD.js +1 -0
  61. package/dist/packem_shared/DataBrowser-B8J5lHjP.js +1 -0
  62. package/dist/packem_shared/DataFilters-Csb30F0C.js +1 -0
  63. package/dist/packem_shared/ErrorBoundary-DvzYskH7.js +1 -0
  64. package/dist/packem_shared/GlobalDataBrowser-RLJ6NvOs.js +1 -0
  65. package/dist/packem_shared/HomePanel-DL1HupAN.js +1 -0
  66. package/dist/packem_shared/OpenRpcReferencePanel-sGsIgYWj.js +1 -0
  67. package/dist/packem_shared/STUDIO_ROOT_CLASS-C6MccdVk.js +1 -0
  68. package/dist/packem_shared/ScheduledJobs-DUbo6epc.js +1 -0
  69. package/dist/packem_shared/ShardInput-BVn2iCU0.js +1 -0
  70. package/dist/packem_shared/Studio-BWBclm_C.js +1 -0
  71. package/dist/packem_shared/StudioApp-BFm73yVr.js +1 -0
  72. package/dist/packem_shared/StudioI18nProvider-CZ5h4nrV.js +1 -0
  73. package/dist/packem_shared/advisor-view-DaCX9Jy5.js +1 -0
  74. package/dist/packem_shared/aggregateMetrics-BNfajLa2.js +1 -0
  75. package/dist/packem_shared/alert-CVcOFuDR.js +1 -0
  76. package/dist/packem_shared/app.d-bRPJhby-.d.ts +254 -0
  77. package/dist/packem_shared/badge-BbuuAio7.js +1 -0
  78. package/dist/packem_shared/bar-chart-AryFCeoa.js +9 -0
  79. package/dist/packem_shared/browser-storage-xjTyMKY0.js +1 -0
  80. package/dist/packem_shared/button-BkCrNcAs.js +1 -0
  81. package/dist/packem_shared/card-CIDGUN6K.js +1 -0
  82. package/dist/packem_shared/cf-links-gbDy51nR.js +1 -0
  83. package/dist/packem_shared/checkbox-StT4Gob6.js +1 -0
  84. package/dist/packem_shared/data-grid-BMBKzMEJ.js +1 -0
  85. package/dist/packem_shared/data-view-params-C8T3bW1z.js +1 -0
  86. package/dist/packem_shared/dropdown-menu-C3RQ_HlW.js +2 -0
  87. package/dist/packem_shared/empty-state-Cg7t_8qu.js +1 -0
  88. package/dist/packem_shared/error-alert-B59DnrDI.js +1 -0
  89. package/dist/packem_shared/grid-features-uZCUj955.js +6 -0
  90. package/dist/packem_shared/home-panel-B-8BCffw.js +3 -0
  91. package/dist/packem_shared/input-JHu63lTv.js +1 -0
  92. package/dist/packem_shared/internal-AtZ4bTal.js +2 -0
  93. package/dist/packem_shared/label-6uP1obNF.js +1 -0
  94. package/dist/packem_shared/live-status-CGW2JHf_.js +1 -0
  95. package/dist/packem_shared/log-fields-CoL3hsIQ.js +1 -0
  96. package/dist/packem_shared/modal-shell-CUwwWC2o.js +1 -0
  97. package/dist/packem_shared/reference-view-KvhektwF.js +12 -0
  98. package/dist/packem_shared/result-chart-CwKhhKM0.js +1 -0
  99. package/dist/packem_shared/scroll-area-DTEq6Jec.js +2 -0
  100. package/dist/packem_shared/select-Bul-DeII.js +2 -0
  101. package/dist/packem_shared/shard-history-DMEW5VBE.js +1 -0
  102. package/dist/packem_shared/skeleton-C1wQ9M5t.js +1 -0
  103. package/dist/packem_shared/sparkline-DtcZoU48.js +1 -0
  104. package/dist/packem_shared/storage-tier-DznqOf-q.js +1 -0
  105. package/dist/packem_shared/studio-BHA7hnI3.js +2 -0
  106. package/dist/packem_shared/table-DdJBrClo.js +2 -0
  107. package/dist/packem_shared/table-list-sidebar-CMCcNALK.js +1 -0
  108. package/dist/packem_shared/textarea-Bu2-jKAs.js +1 -0
  109. package/dist/packem_shared/trace-handoff-Dw7mwjxu.js +1 -0
  110. package/dist/packem_shared/use-admin-query-Di3fLE8H.js +1 -0
  111. package/dist/packem_shared/use-async-submit-H68GHPz8.js +1 -0
  112. package/dist/packem_shared/useDebounced-Ihdiid_k.js +1 -0
  113. package/dist/packem_shared/utils-bhneXptQ.js +1 -0
  114. package/dist/packem_shared/virtual-rect-1o1veP7R.js +1 -0
  115. package/dist/standalone/chunk-2F7G7IWQ.js +1 -0
  116. package/dist/standalone/chunk-2OUPA2WJ.js +1 -0
  117. package/dist/standalone/chunk-2PJNAWB3.js +1 -0
  118. package/dist/standalone/chunk-2Y36BVVM.js +4 -0
  119. package/dist/standalone/chunk-34UVAASH.js +1 -0
  120. package/dist/standalone/chunk-35II7U25.js +11 -0
  121. package/dist/standalone/chunk-3FUFEZ65.js +1 -0
  122. package/dist/standalone/chunk-3QRTYSSX.js +1 -0
  123. package/dist/standalone/chunk-3RTTXLMU.js +1 -0
  124. package/dist/standalone/chunk-3XIESWL4.js +1 -0
  125. package/dist/standalone/chunk-4CGALXS3.js +19 -0
  126. package/dist/standalone/chunk-4UOFSGUS.js +1 -0
  127. package/dist/standalone/chunk-4WLYA3XE.js +1 -0
  128. package/dist/standalone/chunk-54MMVNPT.js +1 -0
  129. package/dist/standalone/chunk-5L2MD6F6.js +1 -0
  130. package/dist/standalone/chunk-5OWIOACV.js +13 -0
  131. package/dist/standalone/chunk-5RF4QDDA.js +6 -0
  132. package/dist/standalone/chunk-5U2THBI7.js +1 -0
  133. package/dist/standalone/chunk-5Y3QLNWX.js +1 -0
  134. package/dist/standalone/chunk-65OTWFS3.js +1 -0
  135. package/dist/standalone/chunk-6DWCIIHE.js +1 -0
  136. package/dist/standalone/chunk-6ST5ECQA.js +1 -0
  137. package/dist/standalone/chunk-7J5N6DGQ.js +1 -0
  138. package/dist/standalone/chunk-7LQWFOEU.js +1 -0
  139. package/dist/standalone/chunk-7QIFDWQV.js +1 -0
  140. package/dist/standalone/chunk-7RXOPYR5.js +1 -0
  141. package/dist/standalone/chunk-7T7UOTYK.js +1 -0
  142. package/dist/standalone/chunk-7YEFOSPH.js +1 -0
  143. package/dist/standalone/chunk-AVAC26HJ.js +1 -0
  144. package/dist/standalone/chunk-B43FTQJ7.js +1 -0
  145. package/dist/standalone/chunk-BEH5N5ZA.js +1 -0
  146. package/dist/standalone/chunk-BGBLQ563.js +1 -0
  147. package/dist/standalone/chunk-BNUJ7QMG.js +3 -0
  148. package/dist/standalone/chunk-C43X4M5U.js +1 -0
  149. package/dist/standalone/chunk-CFPZYHPY.js +2 -0
  150. package/dist/standalone/chunk-D7XXWV4E.js +1 -0
  151. package/dist/standalone/chunk-DVOBKIUX.js +1 -0
  152. package/dist/standalone/chunk-EKRN4ZQM.js +1 -0
  153. package/dist/standalone/chunk-ESVP44Y3.js +1 -0
  154. package/dist/standalone/chunk-EVN46TVV.js +1 -0
  155. package/dist/standalone/chunk-EXFBIISG.js +2 -0
  156. package/dist/standalone/chunk-F5QWLENA.js +1 -0
  157. package/dist/standalone/chunk-F6GOKFMU.js +3 -0
  158. package/dist/standalone/chunk-FGTK44LR.js +1 -0
  159. package/dist/standalone/chunk-FXCBF4XT.js +1 -0
  160. package/dist/standalone/chunk-GMR677FL.js +1 -0
  161. package/dist/standalone/chunk-GRL5MG3Z.js +1 -0
  162. package/dist/standalone/chunk-GSPTEMYN.js +1 -0
  163. package/dist/standalone/chunk-GXZAXNZI.js +1 -0
  164. package/dist/standalone/chunk-H7NIIBHH.js +1 -0
  165. package/dist/standalone/chunk-HP2UCWND.js +1 -0
  166. package/dist/standalone/chunk-HPFLBYRI.js +1 -0
  167. package/dist/standalone/chunk-IC4L6G56.js +1 -0
  168. package/dist/standalone/chunk-IDNNI63H.js +1 -0
  169. package/dist/standalone/chunk-ILNELDFC.js +1 -0
  170. package/dist/standalone/chunk-IVFHIQOT.js +1 -0
  171. package/dist/standalone/chunk-JN2Y24PY.js +1 -0
  172. package/dist/standalone/chunk-KDOC2DP5.js +1 -0
  173. package/dist/standalone/chunk-KUVMORDQ.js +1 -0
  174. package/dist/standalone/chunk-KYF2E5CJ.js +1 -0
  175. package/dist/standalone/chunk-L7N7F3DA.js +1 -0
  176. package/dist/standalone/chunk-LE56LPNH.js +13 -0
  177. package/dist/standalone/chunk-LEDWUPXM.js +1 -0
  178. package/dist/standalone/chunk-LFKCLLPT.js +1 -0
  179. package/dist/standalone/chunk-LFXFP4IF.js +1 -0
  180. package/dist/standalone/chunk-LJDP7NRB.js +1 -0
  181. package/dist/standalone/chunk-LLXFYRGQ.js +1 -0
  182. package/dist/standalone/chunk-M536Y2KX.js +1 -0
  183. package/dist/standalone/chunk-MIQTKZAR.js +1 -0
  184. package/dist/standalone/chunk-OHKRN65U.js +1 -0
  185. package/dist/standalone/chunk-P24JBHEZ.js +4 -0
  186. package/dist/standalone/chunk-PF7V3G2Z.js +62 -0
  187. package/dist/standalone/chunk-PWWHP76O.js +1 -0
  188. package/dist/standalone/chunk-QBWRC5YX.js +1 -0
  189. package/dist/standalone/chunk-QGKAJTQQ.js +1 -0
  190. package/dist/standalone/chunk-QLJJ5YYZ.js +1 -0
  191. package/dist/standalone/chunk-QVEHPYA5.js +1 -0
  192. package/dist/standalone/chunk-QWGT25SE.js +1 -0
  193. package/dist/standalone/chunk-QWJ3NPE3.js +1 -0
  194. package/dist/standalone/chunk-RAA2RGG6.js +1 -0
  195. package/dist/standalone/chunk-RBU52M5T.js +1 -0
  196. package/dist/standalone/chunk-SA3MDZC3.js +1 -0
  197. package/dist/standalone/chunk-SD4BERSA.js +1 -0
  198. package/dist/standalone/chunk-SFDOII3B.js +1 -0
  199. package/dist/standalone/chunk-SKHEGARW.js +1 -0
  200. package/dist/standalone/chunk-SMIESS7P.js +1 -0
  201. package/dist/standalone/chunk-T2JIUFOD.js +4 -0
  202. package/dist/standalone/chunk-T6VMSOBB.js +1 -0
  203. package/dist/standalone/chunk-THIXMMZD.js +1 -0
  204. package/dist/standalone/chunk-TJ2WZ5OP.js +1 -0
  205. package/dist/standalone/chunk-TLHJRWNK.js +1 -0
  206. package/dist/standalone/chunk-UIS34ZPB.js +8 -0
  207. package/dist/standalone/chunk-UNUU7CJJ.js +1 -0
  208. package/dist/standalone/chunk-UZERI5YC.js +1 -0
  209. package/dist/standalone/chunk-V53KNYRN.js +1 -0
  210. package/dist/standalone/chunk-VPAXCQ2Y.js +4 -0
  211. package/dist/standalone/chunk-X2FQ6B5V.js +1 -0
  212. package/dist/standalone/chunk-XBDKZZ67.js +1 -0
  213. package/dist/standalone/chunk-XEDU5FO4.js +1 -0
  214. package/dist/standalone/chunk-XQBTNJUQ.js +1 -0
  215. package/dist/standalone/chunk-XQCVZAGU.js +1 -0
  216. package/dist/standalone/chunk-XQGANNLS.js +1 -0
  217. package/dist/standalone/chunk-XSD4Y6SQ.js +1 -0
  218. package/dist/standalone/chunk-XXQUMVWH.js +1 -0
  219. package/dist/standalone/chunk-YD5NF6UT.js +1 -0
  220. package/dist/standalone/chunk-YI3WYUXK.js +1 -0
  221. package/dist/standalone/chunk-ZJGP6EKR.js +1 -0
  222. package/dist/standalone/chunk-ZNNAGR6N.js +1 -0
  223. package/dist/standalone/studio.js +9 -356
  224. package/dist/styles.css +2 -2
  225. package/package.json +17 -15
  226. package/dist/packem_shared/ADMIN_FUNCTIONS-DmBqMZ-z.js +0 -45
  227. package/dist/packem_shared/ApiDocsPanel-C5-yJ1p7.js +0 -842
  228. package/dist/packem_shared/ApiReferencePanel-1vubqG5s.js +0 -229
  229. package/dist/packem_shared/ApiTab-W3no0KOj.js +0 -251
  230. package/dist/packem_shared/AuditPanel-Bq4o_IqT.js +0 -212
  231. package/dist/packem_shared/CommandPalette-BtgkBzZI.js +0 -373
  232. package/dist/packem_shared/ConfirmButton-C2eVi2Qv.js +0 -59
  233. package/dist/packem_shared/ConnectionBadge-B2DDM2Tn.js +0 -111
  234. package/dist/packem_shared/DEFAULT_AUTO_REFRESH_MS-Vxwaxx51.js +0 -50
  235. package/dist/packem_shared/DEFAULT_INSIGHT_THRESHOLDS-DjF0h-gA.js +0 -89
  236. package/dist/packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js +0 -27
  237. package/dist/packem_shared/DataBrowser-CtBe1So9.js +0 -4542
  238. package/dist/packem_shared/DataFilters-FNquMaiu.js +0 -249
  239. package/dist/packem_shared/ErrorBoundary-BzAApI7J.js +0 -66
  240. package/dist/packem_shared/ExportImportPanel-dxY56TDF.js +0 -193
  241. package/dist/packem_shared/FileBrowser-Dhy4zES8.js +0 -2932
  242. package/dist/packem_shared/FunctionRunner--fQJRPAD.js +0 -343
  243. package/dist/packem_shared/FunctionStatsPanel-BjRUA_G3.js +0 -432
  244. package/dist/packem_shared/GlobalDataBrowser-BTEmGrph.js +0 -318
  245. package/dist/packem_shared/HealthPanel-PxclMWmA.js +0 -640
  246. package/dist/packem_shared/HomePanel-Cw16stjq.js +0 -1273
  247. package/dist/packem_shared/InsightsPanel-CWS_C-xW.js +0 -423
  248. package/dist/packem_shared/LogsPanel-CTW8CFcM.js +0 -839
  249. package/dist/packem_shared/MailPanel-BwkvfIHF.js +0 -447
  250. package/dist/packem_shared/MetricsPanel-BLuOhZQ4.js +0 -1625
  251. package/dist/packem_shared/MigrationsPanel-DT3lnwHF.js +0 -246
  252. package/dist/packem_shared/OpenRpcReferencePanel-vbcYbv3V.js +0 -191
  253. package/dist/packem_shared/PitrPanel-CdErL7EJ.js +0 -252
  254. package/dist/packem_shared/STUDIO_ROOT_CLASS-D12gX2dV.js +0 -3
  255. package/dist/packem_shared/ScheduledJobs-CabfKbyM.js +0 -159
  256. package/dist/packem_shared/SchemaViewer-LJDcmNIO.js +0 -2512
  257. package/dist/packem_shared/SecurityAdvisorPanel-C_ETsPih.js +0 -79
  258. package/dist/packem_shared/SettingsPanel-C0uLRf5P.js +0 -176
  259. package/dist/packem_shared/ShardInput-gx_DZXXn.js +0 -107
  260. package/dist/packem_shared/SqlEditorPanel-CguV7otm.js +0 -13
  261. package/dist/packem_shared/Studio-BmSGSIuY.js +0 -33
  262. package/dist/packem_shared/StudioApp-D4azxYBu.js +0 -657
  263. package/dist/packem_shared/StudioI18nProvider-B-tDCZIi.js +0 -48
  264. package/dist/packem_shared/TableEditor-ChfUOZec.js +0 -371
  265. package/dist/packem_shared/advisor-view-CGcfMiPq.js +0 -159
  266. package/dist/packem_shared/aggregateMetrics-D4nUHEKU.js +0 -108
  267. package/dist/packem_shared/app.d-CCmwDEVs.d.ts +0 -300
  268. package/dist/packem_shared/badge-B2PKA1-5.js +0 -49
  269. package/dist/packem_shared/bar-chart-CzJAgqkp.js +0 -3245
  270. package/dist/packem_shared/button-BhsN2uZH.js +0 -49
  271. package/dist/packem_shared/card-DURq3ElK.js +0 -175
  272. package/dist/packem_shared/cf-links-2cktDedA.js +0 -8
  273. package/dist/packem_shared/checkbox-UNkzAxl-.js +0 -63
  274. package/dist/packem_shared/data-grid-B5CaV3wS.js +0 -183
  275. package/dist/packem_shared/dropdown-menu-WY4B_eJO.js +0 -280
  276. package/dist/packem_shared/empty-state-DY_oe0k6.js +0 -98
  277. package/dist/packem_shared/grid-features-CzUfqgsM.js +0 -840
  278. package/dist/packem_shared/input-XH4r1Pt1.js +0 -53
  279. package/dist/packem_shared/internal-rXJEAhXS.js +0 -68
  280. package/dist/packem_shared/label-D8ykjn5J.js +0 -46
  281. package/dist/packem_shared/live-status-FZ0psC1z.js +0 -44
  282. package/dist/packem_shared/reference-view-B4E49Lip.js +0 -2180
  283. package/dist/packem_shared/shard-history-DyebH1R5.js +0 -38
  284. package/dist/packem_shared/sparkline-10dG-_f0.js +0 -93
  285. package/dist/packem_shared/sql-editor-panel-BFRpzj6r.js +0 -2562
  286. package/dist/packem_shared/storage-tier-CL98eOvn.js +0 -85
  287. package/dist/packem_shared/studio-H9fuQgSj.js +0 -10303
  288. package/dist/packem_shared/table-_RzNvy3R.js +0 -246
  289. package/dist/packem_shared/table-list-sidebar-Bg7uzbvC.js +0 -832
  290. package/dist/packem_shared/textarea-D3gaCU_-.js +0 -46
  291. package/dist/packem_shared/use-live-admin-Dq6g3daN.js +0 -73
  292. package/dist/packem_shared/use-live-shard-seed-Cuk3dnH0.js +0 -76
  293. package/dist/packem_shared/useDebounced-Dxncpg6z.js +0 -32
  294. package/dist/packem_shared/utils-B05Dmz_H.js +0 -8
  295. package/dist/packem_shared/virtual-rect-CVMUskSm.js +0 -10
package/dist/index.js CHANGED
@@ -1,41 +1 @@
1
- export { StudioApp } from './packem_shared/StudioApp-D4azxYBu.js';
2
- export { CommandPalette, openCommandPalette } from './packem_shared/CommandPalette-BtgkBzZI.js';
3
- export { S as Studio } from './packem_shared/studio-H9fuQgSj.js';
4
- export { ConfirmButton } from './packem_shared/ConfirmButton-C2eVi2Qv.js';
5
- export { default as ConnectionBadge } from './packem_shared/ConnectionBadge-B2DDM2Tn.js';
6
- export { ErrorBoundary } from './packem_shared/ErrorBoundary-BzAApI7J.js';
7
- export { ShardInput } from './packem_shared/ShardInput-gx_DZXXn.js';
8
- export { DEFAULT_INSIGHT_THRESHOLDS, deriveInsights } from './packem_shared/DEFAULT_INSIGHT_THRESHOLDS-DjF0h-gA.js';
9
- export { InsightsPanel } from './packem_shared/InsightsPanel-CWS_C-xW.js';
10
- export { default as SecurityAdvisorPanel } from './packem_shared/SecurityAdvisorPanel-C_ETsPih.js';
11
- export { default as ApiDocsPanel } from './packem_shared/ApiDocsPanel-C5-yJ1p7.js';
12
- export { default as ApiReferencePanel } from './packem_shared/ApiReferencePanel-1vubqG5s.js';
13
- export { default as ApiTab } from './packem_shared/ApiTab-W3no0KOj.js';
14
- export { default as OpenRpcReferencePanel } from './packem_shared/OpenRpcReferencePanel-vbcYbv3V.js';
15
- export { DataBrowser } from './packem_shared/DataBrowser-CtBe1So9.js';
16
- export { DataFilters, toFilterClauses } from './packem_shared/DataFilters-FNquMaiu.js';
17
- export { GlobalDataBrowser } from './packem_shared/GlobalDataBrowser-BTEmGrph.js';
18
- export { TableEditor } from './packem_shared/TableEditor-ChfUOZec.js';
19
- export { ExportImportPanel } from './packem_shared/ExportImportPanel-dxY56TDF.js';
20
- export { MigrationsPanel } from './packem_shared/MigrationsPanel-DT3lnwHF.js';
21
- export { PitrPanel } from './packem_shared/PitrPanel-CdErL7EJ.js';
22
- export { FunctionRunner } from './packem_shared/FunctionRunner--fQJRPAD.js';
23
- export { FunctionStatsPanel } from './packem_shared/FunctionStatsPanel-BjRUA_G3.js';
24
- export { HomePanel } from './packem_shared/HomePanel-Cw16stjq.js';
25
- export { AuditPanel } from './packem_shared/AuditPanel-Bq4o_IqT.js';
26
- export { LogsPanel } from './packem_shared/LogsPanel-CTW8CFcM.js';
27
- export { MailPanel } from './packem_shared/MailPanel-BwkvfIHF.js';
28
- export { ScheduledJobs } from './packem_shared/ScheduledJobs-CabfKbyM.js';
29
- export { HealthPanel } from './packem_shared/HealthPanel-PxclMWmA.js';
30
- export { aggregateMetrics, shardsToAggregate } from './packem_shared/aggregateMetrics-D4nUHEKU.js';
31
- export { MetricsPanel } from './packem_shared/MetricsPanel-BLuOhZQ4.js';
32
- export { SchemaViewer } from './packem_shared/SchemaViewer-LJDcmNIO.js';
33
- export { SettingsPanel } from './packem_shared/SettingsPanel-C0uLRf5P.js';
34
- export { S as SqlEditorPanel } from './packem_shared/sql-editor-panel-BFRpzj6r.js';
35
- export { FileBrowser } from './packem_shared/FileBrowser-Dhy4zES8.js';
36
- export { DEFAULT_AUTO_REFRESH_MS, useAutoRefresh } from './packem_shared/DEFAULT_AUTO_REFRESH_MS-Vxwaxx51.js';
37
- export { default as useDebounced } from './packem_shared/useDebounced-Dxncpg6z.js';
38
- export { DEFAULT_LOCALE, createStudioI18n, studioI18n, useT } from './packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js';
39
- export { StudioI18nProvider } from './packem_shared/StudioI18nProvider-B-tDCZIi.js';
40
- export { ADMIN_FUNCTIONS, ADMIN_FUNCTION_PREFIX } from './packem_shared/ADMIN_FUNCTIONS-DmBqMZ-z.js';
41
- export { default as STUDIO_ROOT_CLASS } from './packem_shared/STUDIO_ROOT_CLASS-D12gX2dV.js';
1
+ import{StudioApp as r}from"./packem_shared/StudioApp-BFm73yVr.js";import{CommandPalette as a,openCommandPalette as f}from"./packem_shared/CommandPalette-CVIaY3j8.js";import{S as m}from"./packem_shared/studio-BHA7hnI3.js";import{ConfirmButton as x}from"./packem_shared/ConfirmButton-CTL3f3kr.js";import{default as s}from"./packem_shared/ConnectionBadge-DOk0CQWo.js";import{ErrorBoundary as d}from"./packem_shared/ErrorBoundary-DvzYskH7.js";import{ShardInput as P}from"./packem_shared/ShardInput-BVn2iCU0.js";import{DEFAULT_INSIGHT_THRESHOLDS as A,deriveInsights as c}from"./packem_shared/DEFAULT_INSIGHT_THRESHOLDS-B-hcFVoi.js";import{InsightsPanel as T}from"./packem_chunks/InsightsPanel.js";import{default as g}from"./packem_chunks/SecurityAdvisorPanel.js";import{default as F}from"./packem_shared/ApiDocsPanel-eJYZlylw.js";import{default as R}from"./packem_shared/ApiReferencePanel-C42v1jr6.js";import{default as C}from"./packem_chunks/ApiTab.js";import{default as H}from"./packem_shared/OpenRpcReferencePanel-sGsIgYWj.js";import{DataBrowser as N}from"./packem_shared/DataBrowser-B8J5lHjP.js";import{DataFilters as U,toFilterClauses as B}from"./packem_shared/DataFilters-Csb30F0C.js";import{GlobalDataBrowser as w}from"./packem_shared/GlobalDataBrowser-RLJ6NvOs.js";import{TableEditor as y}from"./packem_chunks/TableEditor.js";import{ExportImportPanel as q}from"./packem_chunks/ExportImportPanel.js";import{MigrationsPanel as V}from"./packem_chunks/MigrationsPanel.js";import{PitrPanel as j}from"./packem_chunks/PitrPanel.js";import{FunctionRunner as z}from"./packem_chunks/FunctionRunner.js";import{FunctionStatsPanel as Q}from"./packem_chunks/FunctionStatsPanel.js";import{DeploymentHealthPanel as Y}from"./packem_chunks/DeploymentHealthPanel.js";import{H as $}from"./packem_shared/home-panel-B-8BCffw.js";import{AuditPanel as oe}from"./packem_chunks/AuditPanel.js";import{LogsPanel as te}from"./packem_chunks/LogsPanel.js";import{MailPanel as fe}from"./packem_chunks/MailPanel.js";import{ScheduledJobs as me}from"./packem_shared/ScheduledJobs-DUbo6epc.js";import{NotificationsPanel as xe}from"./packem_chunks/NotificationsPanel.js";import{HealthPanel as se}from"./packem_chunks/HealthPanel.js";import{aggregateMetrics as de,shardsToAggregate as ue}from"./packem_shared/aggregateMetrics-BNfajLa2.js";import{MetricsPanel as Se}from"./packem_chunks/MetricsPanel.js";import{SchemaViewer as ce}from"./packem_chunks/SchemaViewer.js";import{SettingsPanel as Te}from"./packem_chunks/SettingsPanel.js";import{SqlEditorPanel as ge}from"./packem_chunks/SqlEditorPanel.js";import{FileBrowser as Fe}from"./packem_chunks/FileBrowser.js";import{DEFAULT_AUTO_REFRESH_MS as Re,useAutoRefresh as he}from"./packem_shared/DEFAULT_AUTO_REFRESH_MS-BCC8_4BQ.js";import{default as Oe}from"./packem_shared/useDebounced-Ihdiid_k.js";import{DEFAULT_LOCALE as Le,createStudioI18n as Ne,studioI18n as Me,useT as Ue}from"./packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{StudioI18nProvider as be}from"./packem_shared/StudioI18nProvider-CZ5h4nrV.js";import{ADMIN_FUNCTIONS as ve,ADMIN_FUNCTION_PREFIX as ye}from"./packem_shared/ADMIN_FUNCTIONS-BYNSbBVE.js";import{default as qe}from"./packem_shared/STUDIO_ROOT_CLASS-C6MccdVk.js";export{ve as ADMIN_FUNCTIONS,ye as ADMIN_FUNCTION_PREFIX,F as ApiDocsPanel,R as ApiReferencePanel,C as ApiTab,oe as AuditPanel,a as CommandPalette,x as ConfirmButton,s as ConnectionBadge,Re as DEFAULT_AUTO_REFRESH_MS,A as DEFAULT_INSIGHT_THRESHOLDS,Le as DEFAULT_LOCALE,N as DataBrowser,U as DataFilters,Y as DeploymentHealthPanel,d as ErrorBoundary,q as ExportImportPanel,Fe as FileBrowser,z as FunctionRunner,Q as FunctionStatsPanel,w as GlobalDataBrowser,se as HealthPanel,$ as HomePanel,T as InsightsPanel,te as LogsPanel,fe as MailPanel,Se as MetricsPanel,V as MigrationsPanel,xe as NotificationsPanel,H as OpenRpcReferencePanel,j as PitrPanel,qe as STUDIO_ROOT_CLASS,me as ScheduledJobs,ce as SchemaViewer,g as SecurityAdvisorPanel,Te as SettingsPanel,P as ShardInput,ge as SqlEditorPanel,m as Studio,r as StudioApp,be as StudioI18nProvider,y as TableEditor,de as aggregateMetrics,Ne as createStudioI18n,c as deriveInsights,f as openCommandPalette,ue as shardsToAggregate,Me as studioI18n,B as toFilterClauses,he as useAutoRefresh,Oe as useDebounced,Ue as useT};
package/dist/mount.d.ts CHANGED
@@ -1,21 +1,21 @@
1
1
  import { Root } from 'react-dom/client';
2
- import { S as StudioAppProps } from "./packem_shared/app.d-CCmwDEVs.js";
2
+ import { S as StudioAppProps } from "./packem_shared/app.d-bRPJhby-.js";
3
3
  import '@lunora/client';
4
4
  import 'react';
5
5
  import '@lingui/core';
6
6
  interface MountStudioOptions extends StudioAppProps {
7
7
  /**
8
- * The container to mount into. Accepts an element or a selector; defaults to
9
- * `#root`. Throws if the selector matches nothing so misconfiguration fails
10
- * loudly rather than silently rendering nowhere.
11
- */
8
+ * The container to mount into. Accepts an element or a selector; defaults to
9
+ * `#root`. Throws if the selector matches nothing so misconfiguration fails
10
+ * loudly rather than silently rendering nowhere.
11
+ */
12
12
  readonly container?: Element | string;
13
13
  }
14
14
  /**
15
- * Mount the batteries-included {@link StudioApp} into the DOM and return the
16
- * React root (call `.unmount()` to tear it down). This is the entry the
17
- * standalone app's `main.tsx` and the `@lunora/vite` dev route both call — it
18
- * keeps the host HTML to a single `<div id="root">` plus one script.
19
- */
15
+ * Mount the batteries-included {@link StudioApp} into the DOM and return the
16
+ * React root (call `.unmount()` to tear it down). This is the entry the
17
+ * standalone app's `main.tsx` and the `@lunora/vite` dev route both call — it
18
+ * keeps the host HTML to a single `<div id="root">` plus one script.
19
+ */
20
20
  declare const mountStudio: (options?: MountStudioOptions) => Root;
21
21
  export { MountStudioOptions, mountStudio };
package/dist/mount.js CHANGED
@@ -1,26 +1 @@
1
- import { createRoot } from 'react-dom/client';
2
- import { StudioApp } from './packem_shared/StudioApp-D4azxYBu.js';
3
- import { jsxDEV } from 'react/jsx-dev-runtime';
4
-
5
- const mountStudio = (options = {}) => {
6
- const {
7
- container = "#root",
8
- ...appProps
9
- } = options;
10
- const element = typeof container === "string" ? document.querySelector(container) : container;
11
- if (element === null) {
12
- throw new Error(`mountStudio: container ${typeof container === "string" ? container : "element"} not found`);
13
- }
14
- const root = createRoot(element);
15
- root.render(/* @__PURE__ */ jsxDEV(StudioApp, {
16
- adminToken: appProps.adminToken,
17
- basePath: appProps.basePath,
18
- baseUrl: appProps.baseUrl,
19
- locale: appProps.locale,
20
- rulesInstalled: appProps.rulesInstalled,
21
- studio: appProps.studio
22
- }, void 0, false));
23
- return root;
24
- };
25
-
26
- export { mountStudio };
1
+ import{LunoraError as a}from"@lunora/errors";import{createRoot as s}from"react-dom/client";import{StudioApp as i}from"./packem_shared/StudioApp-BFm73yVr.js";import{jsx as l}from"react/jsx-runtime";const p=(n={})=>{const{container:t="#root",...o}=n,e=typeof t=="string"?document.querySelector(t):t;if(e===null)throw new a("INTERNAL",`mountStudio: container ${typeof t=="string"?t:"element"} not found`);const r=s(e);return r.render(l(i,{adminToken:o.adminToken,basePath:o.basePath,baseUrl:o.baseUrl,locale:o.locale,rulesInstalled:o.rulesInstalled,studio:o.studio})),r};export{p as mountStudio};
@@ -0,0 +1 @@
1
+ import{c as q}from"react/compiler-runtime";import{useState as j}from"react";import{u as k}from"../packem_shared/button-BkCrNcAs.js";import{useT as F}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import M from"../packem_shared/ApiDocsPanel-eJYZlylw.js";import V from"../packem_shared/ApiReferencePanel-C42v1jr6.js";import W from"../packem_shared/OpenRpcReferencePanel-sGsIgYWj.js";import{jsx as o,jsxs as T}from"react/jsx-runtime";const B=["reference","snippets"],E=["openapi","openrpc"],Z=I=>{const e=q(51),{functions:$,initialShardKey:A,openApiSpec:P,openRpcSpec:_}=I,t=F(),[r,O]=j("reference"),[l,z]=j("openapi");let i;e[0]!==t?(i=t("Reference"),e[0]=t,e[1]=i):i=e[1];let n;e[2]!==t?(n=t("Snippets"),e[2]=t,e[3]=n):n=e[3];let g;e[4]!==i||e[5]!==n?(g={reference:i,snippets:n},e[4]=i,e[5]=n,e[6]=g):g=e[6];const C=g;let p;e[7]!==t?(p=t("OpenAPI"),e[7]=t,e[8]=p):p=e[8];let s;e[9]!==t?(s=t("OpenRPC"),e[9]=t,e[10]=s):s=e[10];let w;e[11]!==p||e[12]!==s?(w={openapi:p,openrpc:s},e[11]=p,e[12]=s,e[13]=w):w=e[13];const R=w;let y;e[14]===Symbol.for("react.memo_cache_sentinel")?(y=a=>{O(a.currentTarget.dataset.view)},e[14]=y):y=e[14];const D=y;let S;e[15]===Symbol.for("react.memo_cache_sentinel")?(S=a=>{z(a.currentTarget.dataset.format)},e[15]=S):S=e[15];const K=S;let c;e[16]!==t?(c=t("API view"),e[16]=t,e[17]=c):c=e[17];let f;e[18]!==r||e[19]!==C?(f=B.map(a=>o(k,{"aria-selected":r===a,"data-testid":`api-view-${a}`,"data-view":a,onClick:D,role:"tab",size:"sm",type:"button",variant:r===a?"default":"outline",children:C[a]},a)),e[18]=r,e[19]=C,e[20]=f):f=e[20];let m;e[21]!==f||e[22]!==c?(m=o("div",{"aria-label":c,className:"flex gap-1.5","data-testid":"api-view-toggle",role:"tablist",children:f}),e[21]=f,e[22]=c,e[23]=m):m=e[23];let d;e[24]!==l||e[25]!==R||e[26]!==t||e[27]!==r?(d=r==="reference"&&o("div",{"aria-label":t("API spec format"),className:"flex gap-1.5","data-testid":"api-format-toggle",role:"tablist",children:E.map(a=>o(k,{"aria-selected":l===a,"data-format":a,"data-testid":`api-format-${a}`,onClick:K,role:"tab",size:"sm",type:"button",variant:l===a?"default":"outline",children:R[a]},a))}),e[24]=l,e[25]=R,e[26]=t,e[27]=r,e[28]=d):d=e[28];let h;e[29]!==m||e[30]!==d?(h=T("div",{className:"flex shrink-0 flex-wrap items-center gap-3 border-b border-border px-6 py-3",children:[m,d]}),e[29]=m,e[30]=d,e[31]=h):h=e[31];let u;e[32]!==$||e[33]!==A||e[34]!==r?(u=r==="snippets"&&o("div",{className:"min-h-0 flex-1 overflow-y-auto p-6",children:o(M,{functions:$,initialShardKey:A})}),e[32]=$,e[33]=A,e[34]=r,e[35]=u):u=e[35];let b;e[36]!==l||e[37]!==P||e[38]!==r?(b=r==="reference"&&l==="openapi"&&o(V,{spec:P}),e[36]=l,e[37]=P,e[38]=r,e[39]=b):b=e[39];let v;e[40]!==l||e[41]!==_||e[42]!==r?(v=r==="reference"&&l==="openrpc"&&o(W,{spec:_}),e[40]=l,e[41]=_,e[42]=r,e[43]=v):v=e[43];let x;e[44]!==u||e[45]!==b||e[46]!==v?(x=T("div",{className:"flex min-h-0 flex-1 flex-col overflow-hidden",children:[u,b,v]}),e[44]=u,e[45]=b,e[46]=v,e[47]=x):x=e[47];let N;return e[48]!==h||e[49]!==x?(N=T("div",{className:"flex min-h-0 flex-1 flex-col","data-testid":"lunora-api-tab",children:[h,x]}),e[48]=h,e[49]=x,e[50]=N):N=e[50],N};export{Z as default};
@@ -0,0 +1 @@
1
+ import{useVirtualizer as j,observeElementRect as K}from"@tanstack/react-virtual";import{useState as w,useMemo as S,useRef as F}from"react";import{E as H}from"../packem_shared/error-alert-B59DnrDI.js";import{L as O}from"../packem_shared/live-status-CGW2JHf_.js";import{ShardInput as P}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as _}from"../packem_shared/badge-BbuuAio7.js";import{c as q,u as B}from"../packem_shared/card-CIDGUN6K.js";import{E as D}from"../packem_shared/empty-state-Cg7t_8qu.js";import{u as J}from"../packem_shared/input-JHu63lTv.js";import{n as U,d as W,m as L,p as l,f as Z,u as d}from"../packem_shared/table-DdJBrClo.js";import{K as G}from"../packem_shared/use-admin-query-Di3fLE8H.js";import Q from"../packem_shared/useDebounced-Ihdiid_k.js";import{useT as X}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as Y}from"../packem_shared/ADMIN_FUNCTIONS-BYNSbBVE.js";import{i as ee}from"../packem_shared/internal-AtZ4bTal.js";import{jsxs as n,jsx as e}from"react/jsx-runtime";const b=80,te=i=>{if(i===void 0)return"";const t=JSON.stringify(i);return t.length>b?`${t.slice(0,b)}…`:t},re=41,$=480,y=5,ae=(i,t)=>K(i,o=>{t(o.height>0?o:{height:$,width:o.width})}),we=({initialShardKey:i})=>{const t=X(),[o,C]=w(i??""),[m,E]=w(""),I=Q(o.trim(),400),{data:u,error:p,errorSource:A,isLoading:M,liveError:R}=G(Y.getAuditLog,{},{live:!0,shardKey:I}),c=S(()=>u?.entries??[],[u]),s=S(()=>{const a=m.trim().toLowerCase();return a===""?c:c.filter(r=>r.op.toLowerCase().includes(a)||(r.table??"").toLowerCase().includes(a)||(r.id??"").toLowerCase().includes(a))},[c,m]),f=F(null),g=j({count:s.length,estimateSize:()=>re,getScrollElement:()=>f.current,initialRect:{height:$,width:800},observeElementRect:ae,overscan:8}),h=g.getVirtualItems(),T=g.getTotalSize(),x=h[0]?.start??0,v=T-(h.at(-1)?.end??0),k={height:x},z={height:v},V=a=>{E(a.target.value)};return n("div",{className:"flex flex-col gap-4","data-testid":"lunora-audit",children:[n("div",{className:"flex flex-wrap items-center gap-2",children:[e(P,{onChange:C,testId:"au-shard-input",value:o}),e(O,{message:R,prefix:"au"}),e(J,{"aria-label":t("Filter audit log"),className:"h-8 w-48","data-testid":"au-search",onChange:V,placeholder:t("filter op, table, id"),value:m})]}),p!==null&&e(H,{error:A,testId:"au-error"}),p===null&&!M&&s.length===0&&e(D,{description:t("State-changing admin operations are recorded here."),icon:e("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:e("path",{d:"M8 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2h-2M9 3a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1V3Zm-1 9h8m-8 4h5"})}),testId:"au-empty",title:t("No audit entries.")}),s.length>0&&e(q,{className:"overflow-hidden py-0",children:e(B,{className:"max-h-[30rem] overflow-auto px-0",ref:f,children:n(U,{"data-testid":"au-table",children:[e(W,{children:n(L,{children:[e(l,{children:t("time")}),e(l,{children:t("op")}),e(l,{children:t("table")}),e(l,{children:t("id")}),e(l,{children:t("detail")})]})}),n(Z,{children:[x>0&&e("tr",{"aria-hidden":"true",children:e("td",{colSpan:y,style:k})}),h.map(a=>{const r=s[a.index],N=te(r.detail);return n(L,{"data-testid":"au-row",children:[e(d,{className:"text-muted-foreground tabular-nums",children:ee(r.ts,"—")}),e(d,{children:e(_,{variant:"secondary",children:r.op})}),e(d,{className:"font-medium",children:r.table??e("span",{className:"text-muted-foreground",children:"—"})}),e(d,{className:"max-w-[20ch] truncate font-mono text-xs",children:r.id??e("span",{className:"text-muted-foreground",children:"—"})}),e(d,{className:"max-w-[32ch] truncate font-mono text-xs text-muted-foreground",title:N||void 0,children:N||e("span",{className:"text-muted-foreground",children:"—"})})]},r.seq)}),v>0&&e("tr",{"aria-hidden":"true",children:e("td",{colSpan:y,style:z})})]})]})})})]})};export{we as AuditPanel};
@@ -0,0 +1 @@
1
+ import{c as ie}from"react/compiler-runtime";import{useLunora as ce}from"@lunora/react";import{useQuery as me}from"@tanstack/react-query";import{g as le}from"../packem_shared/badge-BbuuAio7.js";import{c as se}from"../packem_shared/card-CIDGUN6K.js";import{E as pe}from"../packem_shared/empty-state-Cg7t_8qu.js";import{n as re}from"../packem_shared/skeleton-C1wQ9M5t.js";import{useT as he}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{i as ue}from"../packem_shared/internal-AtZ4bTal.js";import{c as te}from"../packem_shared/utils-bhneXptQ.js";import{jsxs as o,jsx as l}from"react/jsx-runtime";const fe="/_lunora/health",ge="/_lunora/health/ready",xe=(n,e)=>(n.endsWith("/")?n.slice(0,-1):n)+e,Ne=()=>{const n=ce();return async e=>{const w=e==="ready"?ge:fe,t=n.getAuthToken(),$=xe(n.url,w);try{const r=await fetch($,{headers:t===null?{}:{authorization:`Bearer ${t}`}});let d=null;try{d=await r.json()}catch{d=null}return{body:d,ok:r.ok,status:r.status}}catch(r){return{body:null,error:r instanceof Error?r.message:String(r),ok:!1,status:0}}}},de={crit:"bg-destructive",ok:"bg-success",warn:"bg-warning"},ve={crit:"bg-destructive/10 text-destructive",ok:"bg-success/10 text-success",warn:"bg-warning/10 text-warning"},ye=n=>n==="unhealthy"?"crit":n==="degraded"?"warn":"ok",ne=n=>{const e=ie(13),{label:w,level:t,testId:$,value:r}=n,d=de[t];let c;e[0]!==d?(c=te("size-1.5 shrink-0 rounded-full",d),e[0]=d,e[1]=c):c=e[1];let m;e[2]!==c?(m=l("span",{"aria-hidden":"true",className:c}),e[2]=c,e[3]=m):m=e[3];let x;e[4]!==w||e[5]!==m?(x=o("span",{className:"flex items-center gap-1.5 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:[m,w]}),e[4]=w,e[5]=m,e[6]=x):x=e[6];let N;e[7]!==$||e[8]!==r?(N=l("span",{className:"text-lg font-semibold text-foreground","data-testid":$,children:r}),e[7]=$,e[8]=r,e[9]=N):N=e[9];let u;return e[10]!==x||e[11]!==N?(u=l(se,{className:"gap-0 py-0",children:o("div",{className:"flex flex-col gap-2.5 p-4",children:[x,N]})}),e[10]=x,e[11]=N,e[12]=u):u=e[12],u},Ie=n=>{const e=ie(115),{probe:w}=n,t=he(),$=Ne(),r=w??$;let d;e[0]!==r?(d=async()=>{const[a,i]=await Promise.all([r("live"),r("ready")]);return{live:a,ready:i}},e[0]=r,e[1]=d):d=e[1];let c;e[2]===Symbol.for("react.memo_cache_sentinel")?(c=["deployment-health"],e[2]=c):c=e[2];let m;e[3]!==d?(m={queryFn:d,queryKey:c},e[3]=d,e[4]=m):m=e[4];const{data:x,isPending:N}=me(m),u=x?.live??null,oe=x?.ready??null;if(N){let a;return e[5]===Symbol.for("react.memo_cache_sentinel")?(a=o("div",{className:"flex flex-col gap-4","data-testid":"deployment-health-loading",children:[l(re,{className:"h-16 w-full"}),l(re,{className:"h-40 w-full"})]}),e[5]=a):a=e[5],a}const s=u?.body??null;if(s===null){const a=u?.status===403;let i;e[6]!==a||e[7]!==u?.error||e[8]!==t?(i=a?t("The health endpoint is in the admin posture. Paste a valid admin token in the connect popover, or set its auth to public."):t("Couldn't reach the health endpoint: {message}",{message:u?.error??t("no response")}),e[6]=a,e[7]=u?.error,e[8]=t,e[9]=i):i=e[9];let f;e[10]!==t?(f=t("Health endpoint unavailable"),e[10]=t,e[11]=f):f=e[11];let h;return e[12]!==i||e[13]!==f?(h=l(pe,{description:i,testId:"deployment-health-error",title:f}),e[12]=i,e[13]=f,e[14]=h):h=e[14],h}let Z;e[15]!==s.status?(Z=ye(s.status),e[15]=s.status,e[16]=Z):Z=e[16];const _=Z;let p;if(s.status==="unhealthy"){let a;e[17]!==t?(a=t("Unhealthy"),e[17]=t,e[18]=a):a=e[18],p=a}else if(s.status==="degraded"){let a;e[19]!==t?(a=t("Degraded"),e[19]=t,e[20]=a):a=e[20],p=a}else{let a;e[21]!==t?(a=t("Healthy"),e[21]=t,e[22]=a):a=e[22],p=a}const j=oe?.ok??!1,Y=j?"ok":"crit";let C,P,v,y,b,S,z,k,V,H;if(e[23]!==s.appName||e[24]!==s.appVersion||e[25]!==s.checks||e[26]!==s.timestamp||e[27]!==_||e[28]!==Y||e[29]!==j||e[30]!==p||e[31]!==t){const a=[...s.checks].toSorted(be);H="flex flex-col gap-6",P="deployment-health";let i;e[42]!==t?(i=t("Live liveness, readiness, and per-binding health from the deployment's /_lunora/health endpoint — wire an uptime monitor or a Cloudflare Health Check at it."),e[42]=t,e[43]=i):i=e[43],e[44]!==i?(v=l("p",{className:"text-sm text-muted-foreground",children:i}),e[44]=i,e[45]=v):v=e[45];const f=ve[_];let h;e[46]!==f?(h=te("flex size-10 shrink-0 items-center justify-center rounded-full",f),e[46]=f,e[47]=h):h=e[47];const ae=de[_];let T;e[48]!==ae?(T=te("size-3 rounded-full",ae),e[48]=ae,e[49]=T):T=e[49];let D;e[50]!==T?(D=l("span",{className:T}),e[50]=T,e[51]=D):D=e[51];let E;e[52]!==h||e[53]!==D?(E=l("span",{"aria-hidden":"true",className:h,children:D}),e[52]=h,e[53]=D,e[54]=E):E=e[54];let L;e[55]!==p?(L=l("span",{className:"text-sm font-semibold text-foreground","data-testid":"dh-status",children:p}),e[55]=p,e[56]=L):L=e[56];let q;e[57]!==s.appName||e[58]!==s.appVersion?(q=o("span",{className:"font-mono text-[13px] text-muted-foreground","data-testid":"dh-app",children:[s.appName," · ",s.appVersion]}),e[57]=s.appName,e[58]=s.appVersion,e[59]=q):q=e[59];let R;e[60]!==L||e[61]!==q?(R=o("div",{className:"grid leading-tight",children:[L,q]}),e[60]=L,e[61]=q,e[62]=R):R=e[62];let U;e[63]!==E||e[64]!==R?(U=o("div",{className:"flex items-center gap-3",children:[E,R]}),e[63]=E,e[64]=R,e[65]=U):U=e[65];let A;e[66]!==t?(A=t("Checked"),e[66]=t,e[67]=A):A=e[67];let B;e[68]!==A?(B=l("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:A}),e[68]=A,e[69]=B):B=e[69];let F;e[70]!==s.timestamp?(F=ue(s.timestamp),e[70]=s.timestamp,e[71]=F):F=e[71];let K;e[72]!==F?(K=l("time",{className:"text-[13px] text-muted-foreground","data-testid":"dh-timestamp",children:F}),e[72]=F,e[73]=K):K=e[73];let Q;e[74]!==B||e[75]!==K?(Q=o("div",{className:"text-end",children:[B,K]}),e[74]=B,e[75]=K,e[76]=Q):Q=e[76],e[77]!==U||e[78]!==Q?(y=l(se,{className:"gap-0 py-0",children:o("div",{className:"flex flex-wrap items-center justify-between gap-4 p-4",children:[U,Q]})}),e[77]=U,e[78]=Q,e[79]=y):y=e[79];let W;e[80]!==t?(W=t("Liveness"),e[80]=t,e[81]=W):W=e[81];let G;e[82]!==_||e[83]!==p||e[84]!==W?(G=l(ne,{label:W,level:_,testId:"dh-liveness",value:p}),e[82]=_,e[83]=p,e[84]=W,e[85]=G):G=e[85];let J;e[86]!==t?(J=t("Readiness"),e[86]=t,e[87]=J):J=e[87];let M;e[88]!==j||e[89]!==t?(M=t(j?"Ready":"Not ready"),e[88]=j,e[89]=t,e[90]=M):M=e[90];let O;e[91]!==Y||e[92]!==J||e[93]!==M?(O=l(ne,{label:J,level:Y,testId:"dh-readiness",value:M}),e[91]=Y,e[92]=J,e[93]=M,e[94]=O):O=e[94],e[95]!==G||e[96]!==O?(b=o("div",{className:"grid gap-3 sm:grid-cols-2","data-testid":"dh-probes",children:[G,O]}),e[95]=G,e[96]=O,e[97]=b):b=e[97],C=se,S="gap-0 py-0",z="dh-checks";let X;e[98]!==t?(X=t("Subsystem checks"),e[98]=t,e[99]=X):X=e[99],e[100]!==X?(k=l("header",{className:"border-b border-border px-4 py-3",children:l("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:X})}),e[100]=X,e[101]=k):k=e[101],V=a.length===0?l("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"dh-checks-empty",children:t("No checks reported.")}):l("ul",{className:"divide-y divide-border",children:a.map(g=>o("li",{className:"flex flex-wrap items-center justify-between gap-2 px-4 py-2.5 text-xs","data-testid":`dh-check-${g.name}`,children:[o("span",{className:"flex items-center gap-2",children:[l("span",{"aria-hidden":"true",className:te("size-1.5 shrink-0 rounded-full",g.status==="up"?"bg-success":"bg-destructive")}),l("span",{className:"font-mono text-foreground",children:g.name}),g.critical&&l(le,{variant:"outline",children:t("Critical")})]}),o("span",{className:"flex shrink-0 items-center gap-2",children:[g.message!==void 0&&l("span",{className:"text-muted-foreground",children:g.message}),l(le,{"data-testid":`dh-check-status-${g.name}`,variant:g.status==="up"?"secondary":"destructive",children:g.status==="up"?t("Up"):t("Down")})]})]},g.name))}),e[23]=s.appName,e[24]=s.appVersion,e[25]=s.checks,e[26]=s.timestamp,e[27]=_,e[28]=Y,e[29]=j,e[30]=p,e[31]=t,e[32]=C,e[33]=P,e[34]=v,e[35]=y,e[36]=b,e[37]=S,e[38]=z,e[39]=k,e[40]=V,e[41]=H}else C=e[32],P=e[33],v=e[34],y=e[35],b=e[36],S=e[37],z=e[38],k=e[39],V=e[40],H=e[41];let I;e[102]!==C||e[103]!==S||e[104]!==z||e[105]!==k||e[106]!==V?(I=o(C,{className:S,"data-testid":z,children:[k,V]}),e[102]=C,e[103]=S,e[104]=z,e[105]=k,e[106]=V,e[107]=I):I=e[107];let ee;return e[108]!==P||e[109]!==v||e[110]!==y||e[111]!==b||e[112]!==I||e[113]!==H?(ee=o("div",{className:H,"data-testid":P,children:[v,y,b,I]}),e[108]=P,e[109]=v,e[110]=y,e[111]=b,e[112]=I,e[113]=H,e[114]=ee):ee=e[114],ee};function be(n,e){return n.name.localeCompare(e.name)}export{Ie as DeploymentHealthPanel};
@@ -0,0 +1,3 @@
1
+ import{LunoraError as S}from"@lunora/errors";import{useLunora as D}from"@lunora/react";import{useState as c}from"react";import{ConfirmButton as F}from"../packem_shared/ConfirmButton-CTL3f3kr.js";import{ShardInput as R}from"../packem_shared/ShardInput-BVn2iCU0.js";import{u as _}from"../packem_shared/button-BkCrNcAs.js";import{c as v,u as j}from"../packem_shared/card-CIDGUN6K.js";import{l as M}from"../packem_shared/textarea-Bu2-jKAs.js";import{_ as P}from"../packem_shared/use-admin-query-Di3fLE8H.js";import{useT as U}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as h}from"../packem_shared/ADMIN_FUNCTIONS-BYNSbBVE.js";import{f as $,c as O,e as g,a as E}from"../packem_shared/internal-AtZ4bTal.js";import{r as A}from"../packem_shared/shard-history-DMEW5VBE.js";import{jsxs as d,jsx as r}from"react/jsx-runtime";const B=E(h.exportShard),K=E(h.importShard),X=m=>m.map(a=>JSON.stringify(a)).join(`
2
+ `),z=m=>{const a=[],u=m.split(`
3
+ `);for(const[t,l]of u.entries()){const x=l.trim();if(x==="")continue;const s=JSON.parse(x);if(typeof s!="object"||s===null)throw new S("INTERNAL",`line ${(t+1).toString()}: expected a { table, doc } object`);const o=s;if(typeof o.table!="string"||typeof o.doc!="object"||o.doc===null||Array.isArray(o.doc))throw new S("INTERNAL",`line ${(t+1).toString()}: expected a { table, doc } object`);a.push(o)}return a},ne=({initialShardKey:m})=>{const a=D(),u=P(),t=U(),[l,x]=c(m??""),[s,o]=c(""),[N,p]=c(!1),[y,f]=c(null),[n,b]=c(null),[w,I]=c(null),T=async()=>{p(!0),f(null),b(null);try{const e=await a.query(B,{},O(l));A(l),o(X(e.rows)),I(e.rows.length)}catch(e){f(g(e))}finally{p(!1)}},C=async()=>{p(!0),f(null),b(null),I(null);let e;try{e=z(s)}catch(i){f(t("Invalid NDJSON: {message}",{message:g(i)})),p(!1);return}try{const i=await a.query(K,{rows:e},O(l));A(l),b(i),u(h.readTablePage),u(h.listTables)}catch(i){f(g(i))}finally{p(!1)}},L=n===null?0:Object.values(n.inserted).reduce((e,i)=>e+i,0),k=()=>{$(T())},J=()=>{$(C())},q=e=>{o(e.target.value)};return d("div",{className:"flex flex-col gap-4","data-testid":"lunora-export-import",children:[d(v,{className:"rounded-xl border border-border bg-card shadow-xs",children:[r("header",{className:"border-b border-border px-4 py-3",children:r("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:t("Export")})}),d(j,{className:"flex flex-col gap-3 p-4",children:[d("div",{className:"flex flex-wrap items-center gap-2",children:[r(R,{onChange:x,testId:"ei-shard-input",value:l}),r(_,{"data-testid":"ei-export",disabled:N,onClick:k,type:"button",children:t("Export")})]}),w!==null&&r("p",{className:"text-sm text-muted-foreground","data-testid":"ei-export-result",children:t("Exported {count} rows.",{count:w})})]})]}),d(v,{className:"rounded-xl border border-border bg-card shadow-xs",children:[r("header",{className:"border-b border-border px-4 py-3",children:r("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:t("Import")})}),d(j,{className:"flex flex-col gap-3 p-4",children:[r(M,{"aria-label":"NDJSON",className:"font-mono text-xs min-h-40 rounded-md","data-testid":"ei-ndjson",onChange:q,placeholder:'{"table":"messages","doc":{…}}',value:s}),r("div",{className:"flex flex-wrap items-center gap-2",children:r(F,{confirmLabel:t("Import (writes rows)?"),disabled:N||s.trim()==="",onConfirm:J,testId:"ei-import",children:t("Import")})}),n!==null&&d("div",{className:"flex flex-col gap-2","data-testid":"ei-import-result",children:[r("p",{className:"text-sm text-muted-foreground",children:t("Inserted {inserted}, {conflicts} conflicts, {errors} errors.",{conflicts:n.conflicts,errors:n.errors.length,inserted:L})}),n.errors.length>0&&r("ul",{className:"flex flex-col gap-1","data-testid":"ei-import-errors",children:n.errors.map(e=>r("li",{className:"text-xs text-destructive",children:t("line {line} ({table}): {message}",{line:e.line,message:e.message,table:e.table})},`${e.table}-${e.line.toString()}`))})]})]})]}),y!==null&&r("p",{className:"text-sm text-destructive","data-testid":"ei-error",role:"alert",children:y})]})};export{ne as ExportImportPanel};
@@ -0,0 +1,4 @@
1
+ import{c as B}from"react/compiler-runtime";import{useState as O,useEffect as oe,useRef as he,useMemo as fe,useCallback as lt}from"react";import{ShardInput as ot}from"../packem_shared/ShardInput-BVn2iCU0.js";import{u as se}from"../packem_shared/button-BkCrNcAs.js";import{E as Se}from"../packem_shared/empty-state-Cg7t_8qu.js";import{useT as st}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{F as at}from"../packem_shared/grid-features-uZCUj955.js";import{c as it,u as ct}from"../packem_shared/card-CIDGUN6K.js";import{f as Ne}from"../packem_shared/checkbox-StT4Gob6.js";import{p as le,d as dt,m as me,f as ut,n as ft,u as te}from"../packem_shared/table-DdJBrClo.js";import{k as Ce,f as G,e as ee,c as xe,a as $e,g as ht}from"../packem_shared/internal-AtZ4bTal.js";import{ConfirmButton as mt}from"../packem_shared/ConfirmButton-CTL3f3kr.js";import{g as ce}from"../packem_shared/badge-BbuuAio7.js";import{jsx as a,jsxs as T,Fragment as je}from"react/jsx-runtime";import{u as pt}from"../packem_shared/input-JHu63lTv.js";import{d as gt}from"../packem_shared/cf-links-gbDy51nR.js";import{useLunora as bt}from"@lunora/react";import{useAutoRefresh as yt}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-BCC8_4BQ.js";import{ADMIN_FUNCTIONS as ze}from"../packem_shared/ADMIN_FUNCTIONS-BYNSbBVE.js";const Ke=(c,e,r)=>{const t=B(21),{onCopy:o,onDelete:n,onDownload:u,onToggleSelect:i}=r;let l;t[0]!==c.key||t[1]!==o?(l=()=>{o(c.key)},t[0]=c.key,t[1]=o,t[2]=l):l=t[2];const f=l;let h;t[3]!==c.key||t[4]!==u?(h=()=>{u(c.key)},t[3]=c.key,t[4]=u,t[5]=h):h=t[5];const d=h;let m;t[6]!==c.key||t[7]!==n?(m=()=>{n(c.key)},t[6]=c.key,t[7]=n,t[8]=m):m=t[8];const v=m;let s;t[9]!==c.key||t[10]!==i?(s=()=>{i(c.key)},t[9]=c.key,t[10]=i,t[11]=s):s=t[11];const x=s;let y;t[12]!==c.key||t[13]!==e.length?(y=c.key.slice(e.length),t[12]=c.key,t[13]=e.length,t[14]=y):y=t[14];let g;return t[15]!==f||t[16]!==d||t[17]!==v||t[18]!==y||t[19]!==x?(g={copy:f,download:d,name:y,remove:v,toggle:x},t[15]=f,t[16]=d,t[17]=v,t[18]=y,t[19]=x,t[20]=g):g=t[20],g},De=c=>{const e=B(31),{busy:r,buttonClassName:t,copied:o,objectKey:n,onCopy:u,onDelete:i,onDownload:l,t:f}=c,h=`storage-copy-${n}`;let d;e[0]!==o||e[1]!==f?(d=f(o?"Copied":"Copy URL"),e[0]=o,e[1]=f,e[2]=d):d=e[2];let m;e[3]!==r||e[4]!==t||e[5]!==u||e[6]!==h||e[7]!==d?(m=a(se,{className:t,"data-testid":h,disabled:r,onClick:u,size:"sm",type:"button",variant:"ghost",children:d}),e[3]=r,e[4]=t,e[5]=u,e[6]=h,e[7]=d,e[8]=m):m=e[8];const v=`storage-download-${n}`;let s;e[9]!==f?(s=f("Download"),e[9]=f,e[10]=s):s=e[10];let x;e[11]!==r||e[12]!==t||e[13]!==l||e[14]!==v||e[15]!==s?(x=a(se,{className:t,"data-testid":v,disabled:r,onClick:l,size:"sm",type:"button",variant:"ghost",children:s}),e[11]=r,e[12]=t,e[13]=l,e[14]=v,e[15]=s,e[16]=x):x=e[16];let y;e[17]!==f?(y=f("Delete object?"),e[17]=f,e[18]=y):y=e[18];const g=`storage-delete-${n}`;let b;e[19]!==f?(b=f("Delete"),e[19]=f,e[20]=b):b=e[20];let k;e[21]!==r||e[22]!==i||e[23]!==y||e[24]!==g||e[25]!==b?(k=a(mt,{confirmLabel:y,disabled:r,onConfirm:i,testId:g,children:b}),e[21]=r,e[22]=i,e[23]=y,e[24]=g,e[25]=b,e[26]=k):k=e[26];let w;return e[27]!==k||e[28]!==m||e[29]!==x?(w=T(je,{children:[m,x,k]}),e[27]=k,e[28]=m,e[29]=x,e[30]=w):w=e[30],w},Te=c=>{const e=B(14),{objectKey:r,references:t,t:o}=c;if(t===void 0)return null;if(t.length===0){const h=`storage-orphan-${r}`;let d;e[0]!==o?(d=o("Orphan"),e[0]=o,e[1]=d):d=e[1];let m;return e[2]!==h||e[3]!==d?(m=a(ce,{"data-testid":h,variant:"warning",children:d}),e[2]=h,e[3]=d,e[4]=m):m=e[4],m}let n;e[5]!==t?(n=t.map(xt).join(`
2
+ `),e[5]=t,e[6]=n):n=e[6];const u=n,i=`storage-refs-${r}`;let l;e[7]!==t.length||e[8]!==o?(l=t.length===1?o("1 record"):o("{count} records",{count:t.length}),e[7]=t.length,e[8]=o,e[9]=l):l=e[9];let f;return e[10]!==u||e[11]!==i||e[12]!==l?(f=a(ce,{"data-testid":i,title:u,variant:"secondary",children:l}),e[10]=u,e[11]=i,e[12]=l,e[13]=f):f=e[13],f},Fe=c=>{const e=B(7),{objectKey:r,onToggle:t,selected:o,t:n}=c;let u;e[0]!==n?(u=n("Select row"),e[0]=n,e[1]=u):u=e[1];const i=`storage-select-${r}`;let l;return e[2]!==t||e[3]!==o||e[4]!==u||e[5]!==i?(l=a(Ne,{"aria-label":u,checked:o,"data-testid":i,onCheckedChange:t}),e[2]=t,e[3]=o,e[4]=u,e[5]=i,e[6]=l):l=e[6],l};function xt(c){return`${c.table}·${c.id}`}const kt=c=>{const e=B(10),{colSpan:r,name:t,onEnter:o}=c;let n;e[0]!==t||e[1]!==o?(n=()=>{o(t)},e[0]=t,e[1]=o,e[2]=n):n=e[2];const u=n;let i;e[3]===Symbol.for("react.memo_cache_sentinel")?(i=a("svg",{"aria-hidden":"true",className:"size-4 text-muted-foreground",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:a("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Z"})}),e[3]=i):i=e[3];let l;e[4]!==u||e[5]!==t?(l=T("button",{className:"inline-flex items-center gap-2 font-mono text-xs outline-none hover:text-foreground focus-visible:text-foreground","data-testid":"fb-folder",onClick:u,type:"button",children:[i,t]}),e[4]=u,e[5]=t,e[6]=l):l=e[6];let f;return e[7]!==r||e[8]!==l?(f=a(me,{children:a(te,{colSpan:r,children:l})}),e[7]=r,e[8]=l,e[9]=f):f=e[9],f},vt=c=>{const e=B(33),{busy:r,copiedKey:t,handlers:o,object:n,prefix:u,references:i,selected:l,showReferences:f,t:h}=c,{copy:d,download:m,name:v,remove:s,toggle:x}=Ke(n,u,o);let y;e[0]!==n.key||e[1]!==l||e[2]!==h||e[3]!==x?(y=a(te,{className:"w-8",children:a(Fe,{objectKey:n.key,onToggle:x,selected:l,t:h})}),e[0]=n.key,e[1]=l,e[2]=h,e[3]=x,e[4]=y):y=e[4];let g;e[5]!==v?(g=a(te,{className:"font-mono text-xs",children:v}),e[5]=v,e[6]=g):g=e[6];let b;e[7]!==n.size?(b=Ce(n.size),e[7]=n.size,e[8]=b):b=e[8];let k;e[9]!==b?(k=a(te,{className:"tabular-nums text-muted-foreground",children:b}),e[9]=b,e[10]=k):k=e[10];const w=n.httpMetadata?.contentType??"";let C;e[11]!==w?(C=a(te,{children:w}),e[11]=w,e[12]=C):C=e[12];let S;e[13]!==n.key||e[14]!==i||e[15]!==f||e[16]!==h?(S=f&&a(te,{children:a(Te,{objectKey:n.key,references:i,t:h})}),e[13]=n.key,e[14]=i,e[15]=f,e[16]=h,e[17]=S):S=e[17];const N=t===n.key;let $;e[18]!==r||e[19]!==d||e[20]!==m||e[21]!==n.key||e[22]!==s||e[23]!==h||e[24]!==N?($=a(te,{className:"text-right",children:a("span",{className:"inline-flex items-center gap-1",children:a(De,{busy:r,copied:N,objectKey:n.key,onCopy:d,onDelete:s,onDownload:m,t:h})})}),e[18]=r,e[19]=d,e[20]=m,e[21]=n.key,e[22]=s,e[23]=h,e[24]=N,e[25]=$):$=e[25];let z;return e[26]!==y||e[27]!==g||e[28]!==k||e[29]!==C||e[30]!==S||e[31]!==$?(z=T(me,{"data-testid":"fb-row",children:[y,g,k,C,S,$]}),e[26]=y,e[27]=g,e[28]=k,e[29]=C,e[30]=S,e[31]=$,e[32]=z):z=e[32],z},wt=c=>{const e=B(65),{allSelected:r,busy:t,copiedKey:o,files:n,folders:u,handlers:i,onEnterFolder:l,prefix:f,references:h,selected:d,showReferences:m,someSelected:v,t:s,toggleSelectAll:x}=c;let y;e[0]!==s?(y=s("Select all rows"),e[0]=s,e[1]=y):y=e[1];let g;e[2]!==r||e[3]!==v||e[4]!==y||e[5]!==x?(g=a(le,{className:"w-8",children:a(Ne,{"aria-label":y,checked:r,"data-testid":"storage-select-all",indeterminate:v,onCheckedChange:x})}),e[2]=r,e[3]=v,e[4]=y,e[5]=x,e[6]=g):g=e[6];let b;e[7]!==s?(b=s("key"),e[7]=s,e[8]=b):b=e[8];let k;e[9]!==b?(k=a(le,{children:b}),e[9]=b,e[10]=k):k=e[10];let w;e[11]!==s?(w=s("size"),e[11]=s,e[12]=w):w=e[12];let C;e[13]!==w?(C=a(le,{children:w}),e[13]=w,e[14]=C):C=e[14];let S;e[15]!==s?(S=s("content-type"),e[15]=s,e[16]=S):S=e[16];let N;e[17]!==S?(N=a(le,{children:S}),e[17]=S,e[18]=N):N=e[18];let $;e[19]!==m||e[20]!==s?($=m&&a(le,{children:s("used by")}),e[19]=m,e[20]=s,e[21]=$):$=e[21];let z;e[22]!==s?(z=s("Actions"),e[22]=s,e[23]=z):z=e[23];let D;e[24]!==z?(D=a(le,{"aria-label":z}),e[24]=z,e[25]=D):D=e[25];let K;e[26]!==D||e[27]!==g||e[28]!==k||e[29]!==C||e[30]!==N||e[31]!==$?(K=a(dt,{children:T(me,{children:[g,k,C,N,$,D]})}),e[26]=D,e[27]=g,e[28]=k,e[29]=C,e[30]=N,e[31]=$,e[32]=K):K=e[32];let E;if(e[33]!==u||e[34]!==l||e[35]!==m){let F;e[37]!==l||e[38]!==m?(F=L=>a(kt,{colSpan:m?6:5,name:L,onEnter:l},L),e[37]=l,e[38]=m,e[39]=F):F=e[39],E=u.map(F),e[33]=u,e[34]=l,e[35]=m,e[36]=E}else E=e[36];let U;if(e[40]!==t||e[41]!==o||e[42]!==n||e[43]!==i||e[44]!==f||e[45]!==h||e[46]!==d||e[47]!==m||e[48]!==s){let F;e[50]!==t||e[51]!==o||e[52]!==i||e[53]!==f||e[54]!==h||e[55]!==d||e[56]!==m||e[57]!==s?(F=L=>a(vt,{busy:t,copiedKey:o,handlers:i,object:L,prefix:f,references:h[L.key],selected:d.has(L.key),showReferences:m,t:s},L.key),e[50]=t,e[51]=o,e[52]=i,e[53]=f,e[54]=h,e[55]=d,e[56]=m,e[57]=s,e[58]=F):F=e[58],U=n.map(F),e[40]=t,e[41]=o,e[42]=n,e[43]=i,e[44]=f,e[45]=h,e[46]=d,e[47]=m,e[48]=s,e[49]=U}else U=e[49];let R;e[59]!==E||e[60]!==U?(R=T(ut,{children:[E,U]}),e[59]=E,e[60]=U,e[61]=R):R=e[61];let I;return e[62]!==K||e[63]!==R?(I=a(it,{className:"overflow-hidden py-0",children:a(ct,{className:"px-0",children:T(ft,{"data-testid":"fb-table",children:[K,R]})})}),e[62]=K,e[63]=R,e[64]=I):I=e[64],I},St=[{label:"15m",seconds:900},{label:"1h",seconds:3600},{label:"24h",seconds:86400},{label:"7d",seconds:604800}],Nt=3600,ke=(c,e)=>{if(e==="size")return c.size;if(e==="type")return c.httpMetadata?.contentType??"";if(e==="date"){if(c.uploaded===void 0)return 0;const r=new Date(c.uploaded).getTime();return Number.isNaN(r)?0:r}return e.startsWith("tag:")?c.customMetadata?.[e.slice(4)]??"":c.key},Ct=(c,e,r)=>{const t=r==="desc"?-1:1;return c.toSorted((o,n)=>{const u=ke(o,e),i=ke(n,e);return(typeof u=="number"&&typeof i=="number"?u-i:String(u).localeCompare(String(i)))*t})},$t=(c,e)=>{const r=new Set,t=[];for(const o of c){const n=o.key.slice(e.length),u=n.indexOf("/");u===-1?t.push(o):r.add(n.slice(0,u+1))}return{files:t,folders:[...r].toSorted((o,n)=>o.localeCompare(n))}},jt=c=>{const e=B(59),{bucket:r,buckets:t,busy:o,draftPrefix:n,expiry:u,fileInputRef:i,onBucketChange:l,onExpiryChange:f,onFileChange:h,onList:d,onPrefixChange:m,onUploadClick:v,t:s}=c;let x;e[0]!==m?(x=P=>{m(P.target.value)},e[0]=m,e[1]=x):x=e[1];const y=x;let g;e[2]!==l?(g=P=>{l(P.target.value)},e[2]=l,e[3]=g):g=e[3];const b=g;let k;e[4]!==f?(k=P=>{f(Number.parseInt(P.target.value,10))},e[4]=f,e[5]=k):k=e[5];const w=k;let C;e[6]!==r||e[7]!==t||e[8]!==b||e[9]!==s?(C=t.length>0&&a("select",{"aria-label":s("Bucket"),className:"h-8 rounded-md border border-border bg-background px-1 outline-none focus-visible:border-ring","data-testid":"fb-bucket",onChange:b,value:r,children:t.map(Kt)}),e[6]=r,e[7]=t,e[8]=b,e[9]=s,e[10]=C):C=e[10];let S;e[11]!==s?(S=s("Key prefix"),e[11]=s,e[12]=S):S=e[12];let N;e[13]!==s?(N=s("key prefix (optional)"),e[13]=s,e[14]=N):N=e[14];let $;e[15]!==n||e[16]!==y||e[17]!==S||e[18]!==N?($=a(pt,{"aria-label":S,className:"h-8 w-64 max-w-full","data-testid":"fb-prefix-input",onChange:y,placeholder:N,value:n}),e[15]=n,e[16]=y,e[17]=S,e[18]=N,e[19]=$):$=e[19];let z;e[20]!==s?(z=s("List"),e[20]=s,e[21]=z):z=e[21];let D;e[22]!==o||e[23]!==d||e[24]!==z?(D=a(se,{"data-testid":"fb-list",disabled:o,onClick:d,size:"sm",type:"button",children:z}),e[22]=o,e[23]=d,e[24]=z,e[25]=D):D=e[25];let K;e[26]!==o||e[27]!==s?(K=s(o?"Uploading…":"Upload"),e[26]=o,e[27]=s,e[28]=K):K=e[28];let E;e[29]!==o||e[30]!==v||e[31]!==K?(E=a(se,{"data-testid":"storage-upload",disabled:o,onClick:v,size:"sm",type:"button",variant:"outline",children:K}),e[29]=o,e[30]=v,e[31]=K,e[32]=E):E=e[32];let U;e[33]!==i||e[34]!==h?(U=a("input",{className:"hidden","data-testid":"storage-file-input",onChange:h,ref:i,type:"file"}),e[33]=i,e[34]=h,e[35]=U):U=e[35];let R;e[36]!==s?(R=s("Link expiry"),e[36]=s,e[37]=R):R=e[37];let I;e[38]!==s?(I=St.map(P=>a("option",{value:P.seconds,children:s(P.label)},P.seconds)),e[38]=s,e[39]=I):I=e[39];let F;e[40]!==u||e[41]!==w||e[42]!==I?(F=a("select",{className:"h-8 rounded-md border border-border bg-background px-1 tabular-nums outline-none focus-visible:border-ring","data-testid":"storage-expiry",id:"storage-expiry",onChange:w,value:u,children:I}),e[40]=u,e[41]=w,e[42]=I,e[43]=F):F=e[43];let L;e[44]!==R||e[45]!==F?(L=T("label",{className:"ml-auto flex items-center gap-1.5 text-xs text-muted-foreground",htmlFor:"storage-expiry",children:[R,F]}),e[44]=R,e[45]=F,e[46]=L):L=e[46];let M;e[47]!==s?(M=s("Open in Cloudflare"),e[47]=s,e[48]=M):M=e[48];let A;e[49]!==M?(A=a("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"fb-cf-link",href:gt,rel:"noreferrer",target:"_blank",children:M}),e[49]=M,e[50]=A):A=e[50];let W;return e[51]!==E||e[52]!==U||e[53]!==L||e[54]!==A||e[55]!==C||e[56]!==$||e[57]!==D?(W=T("div",{className:"flex flex-wrap items-center gap-2",children:[C,$,D,E,U,L,A]}),e[51]=E,e[52]=U,e[53]=L,e[54]=A,e[55]=C,e[56]=$,e[57]=D,e[58]=W):W=e[58],W},zt=c=>{const e=B(66),{onSortKeyChange:r,onThumbSizeChange:t,showGrid:o,showList:n,sortDirection:u,sortKey:i,t:l,tagKeys:f,thumbSize:h,toggleSortDirection:d,view:m}=c;let v;e[0]!==r?(v=q=>{r(q.target.value)},e[0]=r,e[1]=v):v=e[1];const s=v;let x;e[2]!==t?(x=q=>{t(Number.parseInt(q.target.value,10))},e[2]=t,e[3]=x):x=e[3];const y=x,g=m==="list";let b;e[4]!==l?(b=l("List"),e[4]=l,e[5]=b):b=e[5];let k;e[6]!==n||e[7]!==g||e[8]!==b?(k=a("button",{"aria-pressed":g,className:"px-2 py-1 outline-none transition-colors hover:bg-accent aria-pressed:bg-accent aria-pressed:text-accent-foreground","data-testid":"fb-view-list",onClick:n,type:"button",children:b}),e[6]=n,e[7]=g,e[8]=b,e[9]=k):k=e[9];const w=m==="grid";let C;e[10]!==l?(C=l("Grid"),e[10]=l,e[11]=C):C=e[11];let S;e[12]!==o||e[13]!==w||e[14]!==C?(S=a("button",{"aria-pressed":w,className:"border-s border-border px-2 py-1 outline-none transition-colors hover:bg-accent aria-pressed:bg-accent aria-pressed:text-accent-foreground","data-testid":"fb-view-grid",onClick:o,type:"button",children:C}),e[12]=o,e[13]=w,e[14]=C,e[15]=S):S=e[15];let N;e[16]!==k||e[17]!==S?(N=T("div",{className:"inline-flex overflow-hidden rounded-md border border-border",children:[k,S]}),e[16]=k,e[17]=S,e[18]=N):N=e[18];let $;e[19]!==l?($=l("Sort"),e[19]=l,e[20]=$):$=e[20];let z;e[21]!==l?(z=l("Name"),e[21]=l,e[22]=z):z=e[22];let D;e[23]!==z?(D=a("option",{value:"name",children:z}),e[23]=z,e[24]=D):D=e[24];let K;e[25]!==l?(K=l("size"),e[25]=l,e[26]=K):K=e[26];let E;e[27]!==K?(E=a("option",{value:"size",children:K}),e[27]=K,e[28]=E):E=e[28];let U;e[29]!==l?(U=l("Type"),e[29]=l,e[30]=U):U=e[30];let R;e[31]!==U?(R=a("option",{value:"type",children:U}),e[31]=U,e[32]=R):R=e[32];let I;e[33]!==l?(I=l("Modified"),e[33]=l,e[34]=I):I=e[34];let F;e[35]!==I?(F=a("option",{value:"date",children:I}),e[35]=I,e[36]=F):F=e[36];let L;e[37]!==f?(L=f.map(Dt),e[37]=f,e[38]=L):L=e[38];let M;e[39]!==s||e[40]!==i||e[41]!==D||e[42]!==E||e[43]!==R||e[44]!==F||e[45]!==L?(M=T("select",{className:"h-8 rounded-md border border-border bg-background px-1 outline-none focus-visible:border-ring","data-testid":"fb-sort",id:"fb-sort",onChange:s,value:i,children:[D,E,R,F,L]}),e[39]=s,e[40]=i,e[41]=D,e[42]=E,e[43]=R,e[44]=F,e[45]=L,e[46]=M):M=e[46];let A;e[47]!==$||e[48]!==M?(A=T("label",{className:"flex items-center gap-1.5 text-muted-foreground",htmlFor:"fb-sort",children:[$,M]}),e[47]=$,e[48]=M,e[49]=A):A=e[49];let W;e[50]!==l?(W=l("Toggle sort direction"),e[50]=l,e[51]=W):W=e[51];const P=u==="asc"?"↑":"↓";let H;e[52]!==W||e[53]!==P||e[54]!==d?(H=a("button",{"aria-label":W,className:"flex size-8 items-center justify-center rounded-md border border-border tabular-nums outline-none transition-colors hover:bg-accent focus-visible:bg-accent","data-testid":"fb-sort-dir",onClick:d,type:"button",children:P}),e[52]=W,e[53]=P,e[54]=d,e[55]=H):H=e[55];let Q;e[56]!==y||e[57]!==l||e[58]!==h||e[59]!==m?(Q=m==="grid"&&T("label",{className:"ml-auto flex items-center gap-1.5 text-muted-foreground",htmlFor:"fb-thumb-size",children:[l("Thumbnail size"),a("input",{className:"accent-primary","data-testid":"fb-thumb-size",id:"fb-thumb-size",max:240,min:80,onChange:y,step:8,type:"range",value:h})]}),e[56]=y,e[57]=l,e[58]=h,e[59]=m,e[60]=Q):Q=e[60];let re;return e[61]!==A||e[62]!==H||e[63]!==Q||e[64]!==N?(re=T("div",{className:"flex flex-wrap items-center gap-2 text-xs","data-testid":"fb-controls",children:[N,A,H,Q]}),e[61]=A,e[62]=H,e[63]=Q,e[64]=N,e[65]=re):re=e[65],re};function Kt(c){return a("option",{value:c,children:c},c)}function Dt(c){return a("option",{value:`tag:${c}`,children:c},c)}const Tt=/\.(?:avif|bmp|gif|ico|jpe?g|png|svg|webp)$/iu,Ft=c=>(c.httpMetadata?.contentType??"").startsWith("image/")||Tt.test(c.key),Rt=()=>{const c=B(1);let e;return c[0]===Symbol.for("react.memo_cache_sentinel")?(e=a("svg",{"aria-hidden":"true",className:"size-8 text-muted-foreground/60",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.4,viewBox:"0 0 24 24",children:a("path",{d:"M7 3h7l5 5v13a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm7 0v5h5"})}),c[0]=e):e=c[0],e},Lt=c=>{const e=B(13),{object:r,resolveUrl:t}=c,[o,n]=O(null),[u,i]=O(!1);let l;e[0]!==r?(l=Ft(r),e[0]=r,e[1]=l):l=e[1];const f=l;let h,d;e[2]!==f||e[3]!==r.key||e[4]!==t?(h=()=>{if(!f)return;const x={cancelled:!1};return G((async()=>{try{const y=await t(r.key);x.cancelled||n(y)}catch{x.cancelled||i(!0)}})()),()=>{x.cancelled=!0}},d=[f,r.key,t],e[2]=f,e[3]=r.key,e[4]=t,e[5]=h,e[6]=d):(h=e[5],d=e[6]),oe(h,d);let m;e[7]===Symbol.for("react.memo_cache_sentinel")?(m=()=>{i(!0)},e[7]=m):m=e[7];const v=m;let s;return e[8]!==u||e[9]!==f||e[10]!==r.key||e[11]!==o?(s=a("div",{className:"flex aspect-square w-full items-center justify-center overflow-hidden rounded-md border border-border bg-muted/30",children:f&&o!==null&&!u?a("img",{alt:r.key,className:"size-full object-cover",loading:"lazy",onError:v,src:o}):a(Rt,{})}),e[8]=u,e[9]=f,e[10]=r.key,e[11]=o,e[12]=s):s=e[12],s},Ot=c=>{const e=B(38),{busy:r,copiedKey:t,handlers:o,object:n,prefix:u,references:i,resolveUrl:l,selected:f,showReferences:h,t:d}=c,{copy:m,download:v,name:s,remove:x,toggle:y}=Ke(n,u,o);let g;e[0]!==n||e[1]!==l?(g=a(Lt,{object:n,resolveUrl:l}),e[0]=n,e[1]=l,e[2]=g):g=e[2];let b;e[3]!==n.key||e[4]!==f||e[5]!==d||e[6]!==y?(b=a("span",{className:"absolute left-1.5 top-1.5 rounded bg-background/80 p-0.5",children:a(Fe,{objectKey:n.key,onToggle:y,selected:f,t:d})}),e[3]=n.key,e[4]=f,e[5]=d,e[6]=y,e[7]=b):b=e[7];let k;e[8]!==g||e[9]!==b?(k=T("div",{className:"relative",children:[g,b]}),e[8]=g,e[9]=b,e[10]=k):k=e[10];let w;e[11]!==s?(w=a("p",{className:"truncate font-mono text-xs",title:s,children:s}),e[11]=s,e[12]=w):w=e[12];let C;e[13]!==n.size?(C=Ce(n.size),e[13]=n.size,e[14]=C):C=e[14];let S;e[15]!==C?(S=a("p",{className:"text-[11px] tabular-nums text-muted-foreground",children:C}),e[15]=C,e[16]=S):S=e[16];let N;e[17]!==n.key||e[18]!==i||e[19]!==h||e[20]!==d?(N=h&&a("div",{className:"mt-1",children:a(Te,{objectKey:n.key,references:i,t:d})}),e[17]=n.key,e[18]=i,e[19]=h,e[20]=d,e[21]=N):N=e[21];let $;e[22]!==w||e[23]!==S||e[24]!==N?($=T("div",{className:"min-w-0",children:[w,S,N]}),e[22]=w,e[23]=S,e[24]=N,e[25]=$):$=e[25];const z=t===n.key;let D;e[26]!==r||e[27]!==m||e[28]!==v||e[29]!==n.key||e[30]!==x||e[31]!==d||e[32]!==z?(D=a("div",{className:"flex items-center gap-1",children:a(De,{busy:r,buttonClassName:"h-7 px-2 text-xs",copied:z,objectKey:n.key,onCopy:m,onDelete:x,onDownload:v,t:d})}),e[26]=r,e[27]=m,e[28]=v,e[29]=n.key,e[30]=x,e[31]=d,e[32]=z,e[33]=D):D=e[33];let K;return e[34]!==D||e[35]!==k||e[36]!==$?(K=T("div",{className:"flex flex-col gap-1.5","data-testid":"fb-tile",children:[k,$,D]}),e[34]=D,e[35]=k,e[36]=$,e[37]=K):K=e[37],K},Et=c=>{const e=B(9),{name:r,onEnter:t}=c;let o;e[0]!==r||e[1]!==t?(o=()=>{t(r)},e[0]=r,e[1]=t,e[2]=o):o=e[2];const n=o;let u;e[3]===Symbol.for("react.memo_cache_sentinel")?(u=a("span",{className:"flex aspect-square w-full items-center justify-center rounded-md border border-border bg-muted/30 transition-colors hover:bg-accent",children:a("svg",{"aria-hidden":"true",className:"size-10 text-muted-foreground",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.4,viewBox:"0 0 24 24",children:a("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Z"})})}),e[3]=u):u=e[3];let i;e[4]!==r?(i=a("span",{className:"truncate font-mono text-xs",title:r,children:r}),e[4]=r,e[5]=i):i=e[5];let l;return e[6]!==n||e[7]!==i?(l=T("button",{className:"flex flex-col gap-1.5 text-left outline-none","data-testid":"fb-folder",onClick:n,type:"button",children:[u,i]}),e[6]=n,e[7]=i,e[8]=l):l=e[8],l},Ut=c=>{const e=B(34),{busy:r,copiedKey:t,files:o,folders:n,handlers:u,onEnterFolder:i,prefix:l,references:f,resolveUrl:h,selected:d,showReferences:m,size:v,t:s}=c;let x;e[0]!==v?(x=v.toString(),e[0]=v,e[1]=x):x=e[1];const y=`repeat(auto-fill, minmax(${x}px, 1fr))`;let g;e[2]!==y?(g={gridTemplateColumns:y},e[2]=y,e[3]=g):g=e[3];const b=g;let k;if(e[4]!==n||e[5]!==i){let S;e[7]!==i?(S=N=>a(Et,{name:N,onEnter:i},N),e[7]=i,e[8]=S):S=e[8],k=n.map(S),e[4]=n,e[5]=i,e[6]=k}else k=e[6];let w;if(e[9]!==r||e[10]!==t||e[11]!==o||e[12]!==u||e[13]!==l||e[14]!==f||e[15]!==h||e[16]!==d||e[17]!==m||e[18]!==s){let S;e[20]!==r||e[21]!==t||e[22]!==u||e[23]!==l||e[24]!==f||e[25]!==h||e[26]!==d||e[27]!==m||e[28]!==s?(S=N=>a(Ot,{busy:r,copiedKey:t,handlers:u,object:N,prefix:l,references:f[N.key],resolveUrl:h,selected:d.has(N.key),showReferences:m,t:s},N.key),e[20]=r,e[21]=t,e[22]=u,e[23]=l,e[24]=f,e[25]=h,e[26]=d,e[27]=m,e[28]=s,e[29]=S):S=e[29],w=o.map(S),e[9]=r,e[10]=t,e[11]=o,e[12]=u,e[13]=l,e[14]=f,e[15]=h,e[16]=d,e[17]=m,e[18]=s,e[19]=w}else w=e[19];let C;return e[30]!==b||e[31]!==k||e[32]!==w?(C=T("div",{className:"grid gap-4","data-testid":"fb-gallery",style:b,children:[k,w]}),e[30]=b,e[31]=k,e[32]=w,e[33]=C):C=e[33],C},_t=c=>{const e=B(23),{reference:r,t}=c,o=`fb-dangling-${r.table}-${r.id}-${r.column}`,n=`${r.table}·${r.id}`;let u;e[0]!==n?(u=a(ce,{variant:"secondary",children:n}),e[0]=n,e[1]=u):u=e[1];let i;e[2]!==r.column?(i=a("span",{className:"text-muted-foreground",children:r.column}),e[2]=r.column,e[3]=i):i=e[3];let l;e[4]!==t?(l=t("→"),e[4]=t,e[5]=l):l=e[5];let f;e[6]!==l?(f=a("span",{className:"text-muted-foreground/60",children:l}),e[6]=l,e[7]=f):f=e[7];let h;e[8]!==r.key?(h=a("code",{className:"rounded bg-muted px-1 py-0.5 font-mono text-foreground",children:r.key}),e[8]=r.key,e[9]=h):h=e[9];let d;e[10]!==u||e[11]!==i||e[12]!==f||e[13]!==h?(d=T("span",{className:"flex flex-wrap items-center gap-1.5",children:[u,i,f,h]}),e[10]=u,e[11]=i,e[12]=f,e[13]=h,e[14]=d):d=e[14];let m;e[15]!==t?(m=t("Missing object"),e[15]=t,e[16]=m):m=e[16];let v;e[17]!==m?(v=a(ce,{className:"border-destructive/40 text-destructive",variant:"outline",children:m}),e[17]=m,e[18]=v):v=e[18];let s;return e[19]!==o||e[20]!==v||e[21]!==d?(s=T("li",{className:"flex flex-wrap items-center justify-between gap-2 rounded-md border border-border/60 px-3 py-2 text-xs","data-testid":o,children:[d,v]}),e[19]=o,e[20]=v,e[21]=d,e[22]=s):s=e[22],s},It=c=>{const e=B(37),{busy:r,onCheck:t,references:o,t:n,truncated:u}=c;let i;e[0]!==n?(i=n("Integrity"),e[0]=n,e[1]=i):i=e[1];let l;e[2]!==i?(l=a("span",{className:"font-mono text-[11px] uppercase tracking-wide text-muted-foreground",children:i}),e[2]=i,e[3]=l):l=e[3];let f;e[4]!==n?(f=n("Orphaned objects"),e[4]=n,e[5]=f):f=e[5];let h;e[6]!==f?(h=a("span",{className:"text-sm font-medium text-foreground",children:f}),e[6]=f,e[7]=h):h=e[7];let d;e[8]!==n?(d=n("Find records whose file reference points at an object the bucket no longer has."),e[8]=n,e[9]=d):d=e[9];let m;e[10]!==d?(m=a("span",{className:"text-xs text-muted-foreground",children:d}),e[10]=d,e[11]=m):m=e[11];let v;e[12]!==l||e[13]!==h||e[14]!==m?(v=T("div",{className:"flex flex-col gap-1",children:[l,h,m]}),e[12]=l,e[13]=h,e[14]=m,e[15]=v):v=e[15];let s;e[16]!==r||e[17]!==n?(s=n(r?"Checking…":"Check for orphans"),e[16]=r,e[17]=n,e[18]=s):s=e[18];let x;e[19]!==r||e[20]!==t||e[21]!==s?(x=a(se,{"data-testid":"fb-orphans-check",disabled:r,onClick:t,size:"sm",type:"button",variant:"outline",children:s}),e[19]=r,e[20]=t,e[21]=s,e[22]=x):x=e[22];let y;e[23]!==v||e[24]!==x?(y=T("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[v,x]}),e[23]=v,e[24]=x,e[25]=y):y=e[25];let g;e[26]!==o?.length||e[27]!==n?(g=o?.length===0&&a(Se,{description:n("Every record's file reference points at an object that exists in the bucket."),testId:"fb-orphans-empty",title:n("No dangling references.")}),e[26]=o?.length,e[27]=n,e[28]=g):g=e[28];let b;e[29]!==o||e[30]!==n||e[31]!==u?(b=o!==void 0&&o.length>0&&T(je,{children:[u&&a("p",{className:"text-xs text-warning","data-testid":"fb-orphans-truncated",children:n("Showing the first {count} dangling references — the scan was truncated.",{count:o.length})}),a("ul",{className:"flex flex-col gap-1.5","data-testid":"fb-orphans-list",children:o.map(w=>a(_t,{reference:w,t:n},`${w.table}·${w.id}·${w.column}`))})]}),e[29]=o,e[30]=n,e[31]=u,e[32]=b):b=e[32];let k;return e[33]!==y||e[34]!==g||e[35]!==b?(k=T("section",{className:"flex flex-col gap-2 rounded-lg border border-border/60 p-3","data-testid":"fb-orphans",children:[y,g,b]}),e[33]=y,e[34]=g,e[35]=b,e[36]=k):k=e[36],k},Mt=function(c,e){const r=B(18);let t;r[0]===Symbol.for("react.memo_cache_sentinel")?(t=new Set,r[0]=t):t=r[0];const[o,n]=O(t);let u;r[1]===Symbol.for("react.memo_cache_sentinel")?(u=g=>{n(b=>{const k=new Set(b);return k.has(g)?k.delete(g):k.add(g),k})},r[1]=u):u=r[1];const i=u;let l;r[2]===Symbol.for("react.memo_cache_sentinel")?(l=()=>{n(new Set)},r[2]=l):l=r[2];const f=l;let h,d,m;if(r[3]!==c||r[4]!==e||r[5]!==o){let g;r[9]!==e?(g=b=>e(b),r[9]=e,r[10]=g):g=r[10],d=c.map(g),h=d.length>0&&d.every(b=>o.has(b)),m=!h&&d.some(b=>o.has(b)),r[3]=c,r[4]=e,r[5]=o,r[6]=h,r[7]=d,r[8]=m}else h=r[6],d=r[7],m=r[8];const v=m;let s;r[11]!==d?(s=()=>{n(g=>d.every(b=>g.has(b))?new Set:new Set(d))},r[11]=d,r[12]=s):s=r[12];const x=s;let y;return r[13]!==h||r[14]!==o||r[15]!==v||r[16]!==x?(y={allSelected:h,clear:f,selected:o,someSelected:v,toggle:i,toggleAll:x},r[13]=h,r[14]=o,r[15]=v,r[16]=x,r[17]=y):y=r[17],y},Bt=$e(ze.storageReferences),At=$e(ze.storageOrphans),ve=1e4,Pt=1e3,Wt=3600,Gt=(c,e)=>{if(!("document"in globalThis))return;const r=globalThis.document.createElement("a");r.href=c,r.download=e,r.rel="noopener",globalThis.document.body.append(r),r.click(),r.remove()},Ht=({initialPrefix:c,pageSize:e})=>{const r=bt(),[t,o]=O(c??""),[n,u]=O(c??""),[i,l]=O(Nt),[f,h]=O("list"),[d,m]=O(128),[v,s]=O("name"),[x,y]=O("asc"),[g,b]=O(void 0),[k,w]=O(void 0),[C,S]=O(!1),[N,$]=O(void 0),[z,D]=O(void 0),[K,E]=O(""),[U,R]=O({}),[I,F]=O(!1),[L,M]=O(void 0),[A,W]=O(!1),[P,H]=O(!1),[Q,re]=O([]),[q,pe]=O(""),ne=he(0),Y=he(0);oe(()=>{const p={cancelled:!1};return G((async()=>{try{const j=await r.listStorageBuckets();if(!p.cancelled){re(j);const[_]=j;_!==void 0&&pe(Z=>Z===""?_:Z)}}catch{}})()),()=>{p.cancelled=!0}},[r]);const V=fe(()=>({list:p=>r.listStorageObjects({...p,bucket:q}),remove:p=>r.deleteStorageObject(p,{bucket:q}),signedUrl:(p,j)=>r.signedStorageUrl(p,{...j,bucket:q}),upload:p=>r.uploadStorageObject({...p,bucket:q})}),[q,r]),X=lt(async(p,j,_)=>{ne.current+=1;const Z=ne.current;w(void 0),S(!0);try{const J=await V.list({cursor:j,limit:e,prefix:p});if(Z!==ne.current)return;b(ye=>_&&ye!==void 0?[...ye,...J.objects]:J.objects),D(J.cursor)}catch(J){if(Z!==ne.current)return;_||b(void 0),w(ee(J))}finally{Z===ne.current&&S(!1)}},[e,V]);oe(()=>{G(X(c??"",void 0,!1))},[X,c]);const Re=(g?.length??0)<=e;yt(()=>{G(X(t,void 0,!1))},Re);const{files:de,folders:Le}=$t(g??[],t),Oe=fe(()=>{const p=new Set;for(const j of de)for(const _ of Object.keys(j.customMetadata??{}))p.add(_);return[...p].toSorted((j,_)=>j.localeCompare(_))},[de]),ie=Ct(de,v,x),ue=fe(()=>[...new Set(ie.map(p=>p.key))].toSorted((p,j)=>p.localeCompare(j)).join(`
3
+ `),[ie]);oe(()=>{const p=ue===""?[]:ue.split(`
4
+ `);if(p.length===0){R({});return}const j={current:!0};return G((async()=>{try{const _=await r.query(Bt,{keys:p},xe(K));j.current&&(R(_.references??{}),F(Object.keys(_.storageColumns??{}).length>0))}catch{j.current&&(R({}),F(!1))}})()),()=>{j.current=!1}},[r,ue,K]);const Ee=p=>p.key,{allSelected:Ue,clear:ae,selected:ge,someSelected:_e,toggle:Ie,toggleAll:Me}=Mt(ie,Ee),Be=()=>{o(n),ae(),G(X(n,void 0,!1))},Ae=()=>{G(X(t,z,!0))},be=p=>{o(p),u(p),ae(),G(X(p,void 0,!1))},Pe=p=>{be(`${t}${p}`)},We=p=>V.signedUrl(p,{expiresInSeconds:Wt}),Ge=()=>{h("list")},He=()=>{h("grid")},Ze=p=>{s(p)},qe=()=>{y(p=>p==="asc"?"desc":"asc")},Ve=p=>{m(p)},Xe=p=>{l(p)},Qe=()=>{w(void 0),S(!0),G((async()=>{try{for(const p of ge)await V.remove(p);await X(t,void 0,!1),ae()}catch(p){w(ee(p))}finally{S(!1)}})())},Ye=p=>{w(void 0),G((async()=>{try{const j=await V.signedUrl(p,{expiresInSeconds:i});ht(j)&&$(p)}catch(j){w(ee(j))}})())},Je=p=>{w(void 0),G((async()=>{try{const j=await V.signedUrl(p,{expiresInSeconds:i}),_=p.slice(p.lastIndexOf("/")+1)||p;Gt(j,_)}catch(j){w(ee(j))}})())};oe(()=>{if(N===void 0)return;const p=globalThis.setTimeout(()=>{$(void 0)},2e3);return()=>{globalThis.clearTimeout(p)}},[N]);const et=p=>{w(void 0),S(!0),G((async()=>{try{await V.remove(p),await X(t,void 0,!1)}catch(j){w(ee(j))}finally{S(!1)}})())},tt=p=>{const j=`${t}${p.name}`;w(void 0),S(!0),G((async()=>{try{const _=await p.arrayBuffer();await V.upload({body:_,contentType:p.type===""?void 0:p.type,key:j}),await X(t,void 0,!1)}catch(_){w(ee(_))}finally{S(!1)}})())};oe(()=>{Y.current+=1,M(void 0),H(!1)},[K]);const rt=()=>{Y.current+=1;const p=Y.current;w(void 0),W(!0),G((async()=>{try{const j=[];let _;do{const Z=await V.list({cursor:_,limit:Pt});for(const J of Z.objects)j.push(J.key);_=j.length>=ve?void 0:Z.cursor}while(_!==void 0);if(j.length>=ve)p===Y.current&&(M([]),H(!0));else{const Z=await r.query(At,{liveKeys:j},xe(K));p===Y.current&&(M(Z.references??[]),H(Z.truncated===!0))}}catch(j){p===Y.current&&(M([]),H(!1),w(ee(j)))}finally{p===Y.current&&W(!1)}})())},nt=p=>{ne.current+=1,Y.current+=1,pe(p),o(c??""),u(c??""),b(void 0),M(void 0),H(!1),ae()};return{allSelected:Ue,bucket:q,buckets:Q,bulkDelete:Qe,busy:C,checkOrphans:rt,clearSelection:ae,copiedKey:N,danglingBusy:A,danglingReferences:L,danglingTruncated:P,draftPrefix:n,enterFolder:Pe,error:k,expiry:i,files:ie,folders:Le,hasObjects:g!==void 0&&g.length>0,hasStorageColumns:I,listFirst:Be,loaded:g!==void 0,loadMore:Ae,navigate:be,nextCursor:z,onCopy:Ye,onDelete:et,onDownload:Je,onExpiryChange:Xe,onFile:tt,onSortKeyChange:Ze,onThumbSizeChange:Ve,prefix:t,referenceShard:K,references:U,resolveUrl:We,selectBucket:nt,selected:ge,setDraftPrefix:u,setReferenceShard:E,showGrid:He,showList:Ge,someSelected:_e,sortDirection:x,sortKey:v,tagKeys:Oe,thumbSize:d,toggleSelect:Ie,toggleSelectAll:Me,toggleSortDirection:qe,view:f}},Zt=100,we=c=>{const e=B(6),{label:r,onNavigate:t,target:o}=c;let n;e[0]!==t||e[1]!==o?(n=()=>{t(o)},e[0]=t,e[1]=o,e[2]=n):n=e[2];const u=n;let i;return e[3]!==u||e[4]!==r?(i=a("button",{className:"rounded px-1 text-muted-foreground outline-none hover:text-foreground focus-visible:text-foreground",onClick:u,type:"button",children:r}),e[3]=u,e[4]=r,e[5]=i):i=e[5],i},qt=c=>{const e=B(11),{onNavigate:r,prefix:t,t:o}=c;let n;if(e[0]!==r||e[1]!==t||e[2]!==o){const u=t.split("/").filter(Vt);let i;e[4]!==o?(i=o("Folder path"),e[4]=o,e[5]=i):i=e[5];let l;e[6]!==o?(l=o("root"),e[6]=o,e[7]=l):l=e[7];let f;e[8]!==r||e[9]!==l?(f=a(we,{label:l,onNavigate:r,target:""}),e[8]=r,e[9]=l,e[10]=f):f=e[10],n=T("nav",{"aria-label":i,className:"flex flex-wrap items-center gap-0.5 text-xs","data-testid":"fb-breadcrumbs",children:[f,u.map((h,d)=>T("span",{className:"flex items-center gap-0.5",children:[a("span",{className:"text-muted-foreground/50",children:"/"}),a(we,{label:h,onNavigate:r,target:`${u.slice(0,d+1).join("/")}/`})]},`${h}-${d.toString()}`))]}),e[0]=r,e[1]=t,e[2]=o,e[3]=n}else n=e[3];return n},pr=({initialPrefix:c,pageSize:e=Zt})=>{const r=st(),t=Ht({initialPrefix:c,pageSize:e}),o=he(null),{onCopy:n,onDelete:u,onDownload:i,onFile:l,toggleSelect:f}=t,h={onCopy:n,onDelete:u,onDownload:i,onToggleSelect:f},d=()=>{o.current?.click()},m=s=>{const x=s.target,y=x.files?.[0];x.value="",y&&l(y)},v=t.loaded&&!t.hasObjects;return T("div",{className:"flex flex-col gap-3","data-testid":"lunora-file-browser",children:[a(jt,{bucket:t.bucket,buckets:t.buckets,busy:t.busy,draftPrefix:t.draftPrefix,expiry:t.expiry,fileInputRef:o,onBucketChange:t.selectBucket,onExpiryChange:t.onExpiryChange,onFileChange:m,onList:t.listFirst,onPrefixChange:t.setDraftPrefix,onUploadClick:d,t:r}),t.loaded&&a(qt,{onNavigate:t.navigate,prefix:t.prefix,t:r}),t.hasObjects&&a(zt,{onSortKeyChange:t.onSortKeyChange,onThumbSizeChange:t.onThumbSizeChange,showGrid:t.showGrid,showList:t.showList,sortDirection:t.sortDirection,sortKey:t.sortKey,t:r,tagKeys:t.tagKeys,thumbSize:t.thumbSize,toggleSortDirection:t.toggleSortDirection,view:t.view}),t.hasStorageColumns&&T("div",{className:"flex flex-wrap items-center gap-2","data-testid":"fb-references-shard",children:[a("label",{className:"text-xs text-muted-foreground",htmlFor:"fb-reference-shard-input",children:r("References shard")}),a(ot,{id:"fb-reference-shard-input",onChange:t.setReferenceShard,testId:"fb-reference-shard-input",value:t.referenceShard}),a("span",{className:"text-xs text-muted-foreground",children:r("Which shard's records are checked for references to these files. Empty = root shard.")})]}),t.hasStorageColumns&&a(It,{busy:t.danglingBusy,onCheck:t.checkOrphans,references:t.danglingReferences,t:r,truncated:t.danglingTruncated}),t.selected.size>0&&a(at,{count:t.selected.size,editable:!0,onClear:t.clearSelection,onDelete:t.bulkDelete}),t.error!==void 0&&a("p",{className:"text-sm text-destructive","data-testid":"storage-error",role:"alert",children:t.error}),v&&a(Se,{description:r("Objects you upload to your R2 buckets will appear here."),icon:T("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[a("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Z"}),a("path",{d:"M12 11v5m-2.5-2.5h5"})]}),testId:"fb-empty",title:r("No objects.")}),t.hasObjects&&t.view==="list"&&a(wt,{allSelected:t.allSelected,busy:t.busy,copiedKey:t.copiedKey,files:t.files,folders:t.folders,handlers:h,onEnterFolder:t.enterFolder,prefix:t.prefix,references:t.references,selected:t.selected,showReferences:t.hasStorageColumns,someSelected:t.someSelected,t:r,toggleSelectAll:t.toggleSelectAll}),t.hasObjects&&t.view==="grid"&&a(Ut,{busy:t.busy,copiedKey:t.copiedKey,files:t.files,folders:t.folders,handlers:h,onEnterFolder:t.enterFolder,prefix:t.prefix,references:t.references,resolveUrl:t.resolveUrl,selected:t.selected,showReferences:t.hasStorageColumns,size:t.thumbSize,t:r}),t.nextCursor!==void 0&&a("div",{children:a(se,{"data-testid":"fb-next",disabled:t.busy,onClick:t.loadMore,size:"sm",type:"button",variant:"outline",children:r("Load more")})})]})};function Vt(c){return c!==""}export{pr as FileBrowser};
@@ -0,0 +1 @@
1
+ import{useLunora as G}from"@lunora/react";import{useState as o,useEffect as H}from"react";import{ShardInput as Q}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as T}from"../packem_shared/badge-BbuuAio7.js";import{u as y}from"../packem_shared/button-BkCrNcAs.js";import{u as V}from"../packem_shared/input-JHu63lTv.js";import{p as N}from"../packem_shared/label-6uP1obNF.js";import{l as W}from"../packem_shared/textarea-Bu2-jKAs.js";import{useT as Y}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as Z}from"../packem_shared/ADMIN_FUNCTIONS-BYNSbBVE.js";import{e as ee,i as te,f as re,j as ae,a as se}from"../packem_shared/internal-AtZ4bTal.js";import{r as ne}from"../packem_shared/shard-history-DMEW5VBE.js";import{jsxs as n,jsx as r}from"react/jsx-runtime";const ie=t=>t.kind==="id"?t.table===void 0?"id":`id<${t.table}>`:t.kind==="array"?t.element===void 0?"array":`${t.element}[]`:t.kind,oe=t=>t===void 0||t.length===0?"()":`(${t.map(i=>`${i.name}${i.optional?"?":""}: ${ie(i)}`).join(", ")})`,de=t=>{switch(t){case"array":return[];case"bigint":case"number":return 0;case"boolean":return!1;case"object":case"record":return{};default:return""}},le=t=>{const i={};for(const a of t??[])a.optional||(i[a.name]=de(a.kind));return JSON.stringify(i,void 0,2)},ce=se(Z.runAs),ue=10,me=t=>t===void 0?"undefined":JSON.stringify(t,null,2),Ie=({functions:t,runAsIdentity:i=!1}={})=>{const a=Y(),u=G(),[J,K]=o(null),[w,L]=o(null),p=t??J??[],[k,S]=o(""),[m,g]=o("{}"),[c,$]=o(""),[f,z]=o(""),[x,h]=o("idle"),[M,b]=o(void 0),[I,v]=o(null),[F,P]=o([]);H(()=>{if(t!==void 0)return;let e=!1;return u.listFunctions().then(d=>(e||K(d),d)).catch(d=>{e||L(ee(d))}),()=>{e=!0}},[u,t]);const C=k===""?p[0]?.path??"":k,s=p.find(e=>e.path===C),_=async()=>{if(!s)return;let e;try{e=m.trim()===""?{}:JSON.parse(m)}catch(l){h("error"),b(void 0),v(a("Invalid JSON args: {message}",{message:l.message}));return}const d={__lunoraRef:s.path},R=c.trim()===""?{}:{shardKey:c.trim()},j=i?f.trim():"",A=l=>{P(O=>[{argsText:m,at:Date.now(),id:(O[0]?.id??0)+1,kind:s.kind,path:s.path,shardKey:c,status:l},...O].slice(0,ue))};h("running"),v(null);try{const l=j===""?await ae(u,s.kind,d,e,R):await u.query(ce,{args:e,functionPath:s.path,userId:j},R);ne(c),b(l),h("success"),A("success")}catch(l){b(void 0),v(l.message),h("error"),A("error")}},q=e=>{S(e.path),g(e.argsText),$(e.shardKey)},B=e=>{S(e.target.value)},D=e=>{g(e.target.value)},E=e=>{z(e.target.value)},U=()=>{re(_())},X=()=>{g(le(s?.args))};return n("div",{className:"flex flex-col gap-4","data-testid":"lunora-function-runner",children:[w!==null&&r("p",{className:"text-sm text-destructive","data-testid":"function-discover-error",role:"alert",children:w}),n("div",{className:"flex flex-col gap-4 rounded-xl border border-border bg-card p-4",children:[n("div",{className:"flex flex-col gap-1.5",children:[r(N,{htmlFor:"function-select",children:a("Function")}),r("select",{"aria-label":a("Function"),className:"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50","data-testid":"function-select",id:"function-select",onChange:B,value:C,children:p.map(e=>n("option",{value:e.path,children:[e.path," (",e.kind,")"]},e.path))}),s!==void 0&&n("p",{className:"text-xs text-muted-foreground",children:[r("span",{className:"mr-1.5 font-medium",children:a("Signature")}),r("code",{className:"font-mono","data-testid":"function-signature",children:oe(s.args)})]})]}),n("div",{className:"flex flex-col gap-1.5",children:[n("div",{className:"flex items-center justify-between gap-2",children:[r(N,{htmlFor:"args-input",children:a("Arguments")}),r(y,{"data-testid":"prefill-button",disabled:s===void 0,onClick:X,size:"xs",type:"button",variant:"ghost",children:a("Prefill")})]}),r(W,{"aria-label":a("Arguments"),className:"font-mono text-xs","data-testid":"args-input",id:"args-input",onChange:D,value:m})]}),r(Q,{onChange:$,testId:"shard-input",value:c}),i&&n("div",{className:"flex flex-col gap-1.5","data-testid":"run-as-field",children:[r(N,{htmlFor:"run-as-input",children:a("Run as identity (userId)")}),r(V,{"aria-label":a("Run as identity (userId)"),className:"font-mono text-xs","data-testid":"run-as-input",id:"run-as-input",onChange:E,placeholder:a("Leave empty to run as admin"),value:f}),r("p",{className:"text-[11px] text-muted-foreground",children:a("Dev only: runs the function as this user so you can test auth and RLS. Forged over the admin gate.")})]}),n("div",{className:"flex flex-wrap items-center gap-2",children:[r(y,{"data-testid":"run-button",disabled:x==="running"||s===void 0,onClick:U,type:"button",children:a("Run")}),s!==void 0&&r(T,{variant:"outline",children:s.kind}),i&&f.trim()!==""&&r(T,{"data-testid":"run-as-badge",variant:"secondary",children:a("as {userId}",{userId:f.trim()})})]})]}),x==="error"&&I!==null&&r("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs text-destructive","data-testid":"error",role:"alert",children:I}),x==="success"&&r("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs","data-testid":"result",children:me(M)}),F.length>0&&r("ul",{className:"flex flex-col overflow-hidden rounded-xl border border-border","data-testid":"fn-history",children:F.map((e,d)=>n("li",{className:"flex flex-wrap items-center gap-2 border-b border-border px-3 py-2 text-sm last:border-b-0","data-testid":"fn-history-row",children:[r("span",{className:e.status==="success"?"text-success":"text-destructive","data-testid":`fn-history-status-${d.toString()}`,children:e.status==="success"?"✓":"✗"})," ",n("span",{className:"font-mono text-xs",children:[e.path," (",e.kind,")"]})," ",r("time",{className:"text-xs text-muted-foreground",children:te(e.at)})," ",r(y,{className:"ml-auto","data-testid":`fn-history-load-${d.toString()}`,onClick:()=>{q(e)},size:"xs",type:"button",variant:"ghost",children:a("Load")})]},e.id))})]})};export{Ie as FunctionRunner};
@@ -0,0 +1 @@
1
+ import{c as W}from"react/compiler-runtime";import{useState as q}from"react";import{E as G}from"../packem_shared/error-alert-B59DnrDI.js";import{L as J}from"../packem_shared/live-status-CGW2JHf_.js";import{ShardInput as V}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as X}from"../packem_shared/badge-BbuuAio7.js";import{u as Y}from"../packem_shared/button-BkCrNcAs.js";import{c as Z,u as tt}from"../packem_shared/card-CIDGUN6K.js";import{E as et}from"../packem_shared/empty-state-Cg7t_8qu.js";import{n as rt,d as at,m as P,p as l,f as st,u as n}from"../packem_shared/table-DdJBrClo.js";import{K as lt}from"../packem_shared/use-admin-query-Di3fLE8H.js";import nt from"../packem_shared/useDebounced-Ihdiid_k.js";import{useT as ot}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as it}from"../packem_shared/ADMIN_FUNCTIONS-BYNSbBVE.js";import{i as ct}from"../packem_shared/internal-AtZ4bTal.js";import{c as z}from"../packem_shared/utils-bhneXptQ.js";import{jsx as e,jsxs as y}from"react/jsx-runtime";const dt={action:"outline",mutation:"default",query:"secondary"},O=r=>r<1e3?`${r<10?r.toFixed(1):Math.round(r).toString()}ms`:`${(r/1e3).toFixed(2)}s`,mt=r=>r.calls===0?"—":r.errors===0?"0":`${r.errors.toString()} (${(r.errors/r.calls*100).toFixed(1)}%)`,ut=r=>{const t=r.conflicts??0;return r.calls===0?"—":t===0?"0":`${t.toString()} (${(t/r.calls*100).toFixed(1)}%)`},ht={calls:(r,t)=>t.calls-r.calls,recent:(r,t)=>t.lastCalledAt-r.lastCalledAt,slowest:(r,t)=>t.maxDurationMs-r.maxDurationMs},Dt=r=>{const t=W(47),{functions:_,initialShardKey:R}=r,s=ot(),[o,U]=q(R??""),[i,B]=q("recent");let S;t[0]!==o?(S=o.trim(),t[0]=o,t[1]=S):S=t[1];const T=nt(S,400);let M;t[2]===Symbol.for("react.memo_cache_sentinel")?(M={},t[2]=M):M=t[2];let w;t[3]!==T?(w={live:!0,shardKey:T},t[3]=T,t[4]=w):w=t[4];const{data:H,error:c,errorSource:$,liveError:v}=lt(it.getFunctionStats,M,w),b=H?.functions??null;let E;t[5]!==_?(E=new Map((_??[]).map(ft)),t[5]=_,t[6]=E):E=t[6];const K=E;let C;t[7]===Symbol.for("react.memo_cache_sentinel")?(C=k=>{B(k.currentTarget.dataset.sort)},t[7]=C):C=t[7];const Q=C;let F;if(t[8]!==c||t[9]!==$||t[10]!==K||t[11]!==v||t[12]!==o||t[13]!==i||t[14]!==b||t[15]!==s){const k=b===null?[]:b.toSorted(ht[i]);let d;t[17]!==s?(d=s("Recent"),t[17]=s,t[18]=d):d=t[18];let m;t[19]!==d?(m={key:"recent",label:d},t[19]=d,t[20]=m):m=t[20];let u;t[21]!==s?(u=s("Most called"),t[21]=s,t[22]=u):u=t[22];let h;t[23]!==u?(h={key:"calls",label:u},t[23]=u,t[24]=h):h=t[24];let f;t[25]!==s?(f=s("Slowest"),t[25]=s,t[26]=f):f=t[26];let p;t[27]!==f?(p={key:"slowest",label:f},t[27]=f,t[28]=p):p=t[28];let I;t[29]!==h||t[30]!==p||t[31]!==m?(I=[m,h,p],t[29]=h,t[30]=p,t[31]=m,t[32]=I):I=t[32];const L=I;let x;t[33]!==o?(x=e(V,{onChange:U,testId:"fs-shard-input",value:o}),t[33]=o,t[34]=x):x=t[34];let g;t[35]!==v?(g=e(J,{message:v,prefix:"fs"}),t[35]=v,t[36]=g):g=t[36];let N;t[37]!==L||t[38]!==i?(N=e("div",{className:"ml-auto flex items-center gap-1",role:"group",children:L.map(a=>e(Y,{"data-sort":a.key,"data-testid":`fs-sort-${a.key}`,onClick:Q,size:"sm",type:"button",variant:i===a.key?"secondary":"ghost",children:a.label},a.key))}),t[37]=L,t[38]=i,t[39]=N):N=t[39];let A;t[40]!==x||t[41]!==g||t[42]!==N?(A=y("div",{className:"flex flex-wrap items-center gap-2",children:[x,g,N]}),t[40]=x,t[41]=g,t[42]=N,t[43]=A):A=t[43];let D;t[44]!==c||t[45]!==$?(D=c!==null&&e(G,{error:$,testId:"fs-error"}),t[44]=c,t[45]=$,t[46]=D):D=t[46],F=y("div",{className:"flex flex-col gap-4","data-testid":"lunora-function-stats",children:[A,D,b!==null&&k.length===0&&c===null&&e(et,{description:s("Per-function call counts, error rates, and latency land here after your first request."),icon:y("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[e("path",{d:"M3 3v18h18"}),e("path",{d:"M7 14l4-4 3 3 5-6"})]}),testId:"fs-empty",title:s("No functions have run on this shard yet.")}),k.length>0&&e(Z,{className:"overflow-hidden py-0",children:e(tt,{className:"px-0",children:y(rt,{"data-testid":"fs-table",children:[e(at,{children:y(P,{children:[e(l,{children:s("function")}),e(l,{children:s("kind")}),e(l,{className:"text-right",children:s("calls")}),e(l,{className:"text-right",children:s("errors")}),e(l,{className:"text-right",children:s("conflicts")}),e(l,{className:"text-right",children:s("avg")}),e(l,{className:"text-right",children:s("max")}),e(l,{children:s("last run")}),e(l,{children:s("last error")})]})}),e(st,{children:k.map(a=>{const j=K.get(a.path);return y(P,{"data-testid":`fs-row-${a.path}`,children:[e(n,{className:"font-medium",children:a.path}),e(n,{children:j===void 0?e("span",{className:"text-muted-foreground",children:"—"}):e(X,{variant:dt[j],children:j})}),e(n,{className:"text-right tabular-nums",children:a.calls}),e(n,{className:z("text-right tabular-nums",a.errors>0&&"text-destructive"),children:mt(a)}),e(n,{className:z("text-right tabular-nums",(a.conflicts??0)>0&&"text-warning"),children:ut(a)}),e(n,{className:"text-right tabular-nums",children:a.calls===0?"—":O(a.totalDurationMs/a.calls)}),e(n,{className:"text-right tabular-nums",children:a.calls===0?"—":O(a.maxDurationMs)}),e(n,{className:"text-muted-foreground",children:ct(a.lastCalledAt,"—")}),e(n,{className:"max-w-[24ch] truncate text-destructive",title:a.lastErrorMessage??void 0,children:a.lastErrorMessage??e("span",{className:"text-muted-foreground",children:"—"})})]},a.path)})})]})})})]}),t[8]=c,t[9]=$,t[10]=K,t[11]=v,t[12]=o,t[13]=i,t[14]=b,t[15]=s,t[16]=F}else F=t[16];return F};function ft(r){return[r.path,r.kind]}export{Dt as FunctionStatsPanel};
@@ -0,0 +1 @@
1
+ import{c as fe}from"react/compiler-runtime";import{useLunora as pe}from"@lunora/react";import{useState as b,useRef as P,useEffect as T,useCallback as he,useMemo as ge}from"react";import xe from"../packem_shared/ConnectionBadge-DOk0CQWo.js";import{L as ve}from"../packem_shared/live-status-CGW2JHf_.js";import{g as C}from"../packem_shared/badge-BbuuAio7.js";import{c as k}from"../packem_shared/card-CIDGUN6K.js";import{K as be}from"../packem_shared/use-admin-query-Di3fLE8H.js";import{useT as Ne}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as y}from"../packem_shared/ADMIN_FUNCTIONS-BYNSbBVE.js";import{f as B,i as ye,c as Z,e as ee,a as M}from"../packem_shared/internal-AtZ4bTal.js";import{l as we}from"../packem_shared/shard-history-DMEW5VBE.js";import{c as S}from"../packem_shared/utils-bhneXptQ.js";import{shardsToAggregate as ke}from"../packem_shared/aggregateMetrics-BNfajLa2.js";import{S as G}from"../packem_shared/sparkline-DtcZoU48.js";import{jsxs as i,jsx as s}from"react/jsx-runtime";const te={completed:0,failed:2,in_progress:1},Se=l=>{let e=0,r=0,t=0,n=0;const u=[];for(const{metrics:m}of l){if(m===null){n+=1;continue}t+=1,e+=m.requests,r+=m.errors,u.push(...m.history??[])}return{errors:r,failed:n,history:u,reachable:t,requests:e}},Me=l=>{const e=new Map;for(const r of l)for(const t of r){const n=e.get(t.path);if(n===void 0){e.set(t.path,{...t});continue}n.calls+=t.calls,n.errors+=t.errors,n.totalDurationMs+=t.totalDurationMs,n.scans=(n.scans??0)+(t.scans??0),n.maxDurationMs=Math.max(n.maxDurationMs,t.maxDurationMs),n.lastCalledAt=Math.max(n.lastCalledAt,t.lastCalledAt),(t.lastErrorAt??0)>(n.lastErrorAt??0)&&(n.lastErrorAt=t.lastErrorAt,n.lastErrorMessage=t.lastErrorMessage)}return[...e.values()]},qe=l=>{const e=new Map;for(const r of l)for(const t of r){const n=e.get(t.id);if(n===void 0){e.set(t.id,t);continue}const u=te[t.status]-te[n.status];(u>0||u===0&&(t.updatedAt??0)>(n.updatedAt??0))&&e.set(t.id,t)}return[...e.values()]},Ae=M(y.getAuthMetrics),Ee=M(y.getFunctionStats),je=M(y.getLogs),De=M(y.getMetrics),Ie=M(y.migrationStatus),Le=5,re=2e3,$e=5,se=.01,ae=.05,Pe=.1,Te=.3,Ce=1,Fe=50,V=(l,e,r)=>l>=r?"crit":l>=e?"warn":"ok",Re=(l,e,r)=>l>=r?"crit":l>=e?"warn":"ok",Oe={crit:"destructive",ok:"secondary",warn:"default"},F=(l,e)=>e===0?"—":`${(l/e*100).toFixed(1)}%`,_e=l=>{const e=new Map;for(const t of l??[]){const n=e.get(t.bucketMs)??{calls:0,errors:0};n.calls+=t.calls,n.errors+=t.errors,e.set(t.bucketMs,n)}const r=[...e.entries()].toSorted((t,n)=>t[0]-n[0]);return{errors:r.map(([,t])=>t.errors),requests:r.map(([,t])=>t.calls)}},ze=l=>{let e=0,r=0;for(const n of l)n.status==="failed"?e+=1:n.status==="in_progress"&&(r+=1);let t="ok";return e>0?t="crit":r>0&&(t="warn"),{failed:e,level:t,running:r}},Ke=(l,e)=>l.failed>0?e("{count} failed",{count:l.failed.toString()}):l.running>0?e("{count} running",{count:l.running.toString()}):e("OK"),le={crit:"bg-destructive",ok:"bg-success",warn:"bg-warning"},ne={crit:"text-destructive",ok:"text-foreground",warn:"text-warning"},He={crit:"bg-destructive/10 text-destructive",ok:"bg-success/10 text-success",warn:"bg-warning/10 text-warning"},Ue=l=>l.includes("crit")?"crit":l.includes("warn")?"warn":"ok",R=l=>{const e=fe(19),{chart:r,label:t,level:n,testId:u,value:m}=l,c=le[n];let p;e[0]!==c?(p=S("size-1.5 shrink-0 rounded-full",c),e[0]=c,e[1]=p):p=e[1];let f;e[2]!==p?(f=s("span",{"aria-hidden":"true",className:p}),e[2]=p,e[3]=f):f=e[3];let h;e[4]!==t||e[5]!==f?(h=i("span",{className:"flex items-center gap-1.5 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:[f,t]}),e[4]=t,e[5]=f,e[6]=h):h=e[6];const N=ne[n];let d;e[7]!==N?(d=S("truncate text-2xl font-semibold tabular-nums",N),e[7]=N,e[8]=d):d=e[8];let o;e[9]!==d||e[10]!==u||e[11]!==m?(o=s("span",{className:d,"data-testid":u,children:m}),e[9]=d,e[10]=u,e[11]=m,e[12]=o):o=e[12];let g;e[13]!==r||e[14]!==o?(g=i("div",{className:"flex items-center justify-between gap-3",children:[o,r]}),e[13]=r,e[14]=o,e[15]=g):g=e[15];let x;return e[16]!==h||e[17]!==g?(x=s(k,{className:"gap-0 py-0",children:i("div",{className:"flex flex-col gap-2.5 p-4",children:[h,g]})}),e[16]=h,e[17]=g,e[18]=x):x=e[18],x},Be=async(l,e,r)=>{const t=await Promise.all(r.map(d=>{const o=Z(d);return Promise.allSettled([l.query(De,{},o),l.query(Ee,{},o),l.query(Ie,{},o)])})),n=Z(e),u=typeof l.schedulerStatus=="function"?l.schedulerStatus():Promise.reject(new Error("scheduler status unavailable")),[m,c,p]=await Promise.allSettled([l.query(je,{},n),l.query(Ae,{},n),u]),f=t.map(([d,o,g])=>({functions:o.status==="fulfilled"?o.value.functions:[],metrics:d.status==="fulfilled"?d.value:null,migrations:g.status==="fulfilled"?g.value.migrations:[]})),h=Se(f),N=t[0]?.[0];return{auth:c.status==="fulfilled"?c.value:null,entries:m.status==="fulfilled"?m.value.entries:[],functions:Me(f.map(d=>d.functions)),logsError:m.status==="rejected"?ee(m.reason):null,metricsError:h.reachable===0&&N?.status==="rejected"?ee(N.reason):null,migrations:qe(f.map(d=>d.migrations)),scheduler:p.status==="fulfilled"?p.value:null,totals:h}},ot=({initialShardKey:l})=>{const e=pe(),r=Ne(),[t,n]=b([]),[u,m]=b(null),[c,p]=b(null),[f,h]=b(null),[N,d]=b([]),[o,g]=b(null),[x,ie]=b(null),[oe,ce]=b([]),[w]=b(we),q=P(!1),O=P(!0);T(()=>(O.current=!0,()=>{O.current=!1}),[]);const A=l??"",E=he(async()=>{if(q.current)return;q.current=!0;const a=await Be(e,A,ke(A,w));if(!O.current){q.current=!1;return}p(a.totals),h(a.metricsError),d(a.functions),ce(a.migrations),n(a.entries),m(a.logsError),g(a.auth),ie(a.scheduler),q.current=!1},[e,w,A]);T(()=>{B(E())},[E]);const _=P(0),j=P(null),de=()=>{const a=Date.now()-_.current;if(a>=re){_.current=Date.now(),B(E());return}j.current??=setTimeout(()=>{j.current=null,_.current=Date.now(),B(E())},re-a)};T(()=>()=>{j.current!==null&&clearTimeout(j.current)},[]);const{data:J,liveError:ue}=be(y.getMetrics,{},{live:!0,shardKey:A});T(()=>{J!==void 0&&de()},[J]);const z=t.filter(a=>a.level==="error"),K=z.slice(0,Le),D=_e(c?.history),Q=ge(()=>{const a=o?.history??[];return{attempts:a.map(v=>v.attempts),failures:a.map(v=>v.failures)}},[o?.history]),W=N.filter(a=>a.calls>0).toSorted((a,v)=>v.errors/v.calls-a.errors/a.calls||v.calls-a.calls).slice(0,$e),H=ze(oe),me=c===null||c.requests===0?0:c.errors/c.requests,U=V(me,se,ae),X=o===null?"ok":V(o.failureRate,Pe,Te),Y=x===null?"ok":Re(x.backlog,Ce,Fe),I=Ue([U,X,Y,H.level]);let L,$;return I==="crit"?(L=r("Critical"),$=r("One or more service levels are breached.")):I==="warn"?(L=r("Degraded"),$=r("Some service levels need attention.")):(L=r("All systems healthy"),$=r("All service levels are within target.")),i("div",{className:"flex flex-col gap-6","data-testid":"lunora-health",children:[i(k,{className:"gap-0 py-0",children:[i("div",{className:"flex flex-wrap items-center justify-between gap-4 p-4",children:[i("div",{className:"flex items-center gap-3",children:[s("span",{"aria-hidden":"true",className:S("flex size-10 shrink-0 items-center justify-center rounded-full",He[I]),children:s("span",{className:S("size-3 rounded-full",le[I])})}),i("div",{className:"grid leading-tight",children:[s("span",{className:"text-sm font-semibold text-foreground","data-testid":"hl-status",children:L}),s("span",{className:"text-[13px] text-muted-foreground",children:$})]})]}),i("div",{className:"flex flex-wrap items-center gap-4",children:[i("div",{className:"text-end",children:[s("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:r("Requests")}),i("div",{className:"flex items-center justify-end gap-2",children:[D.requests.length>=2&&s(G,{ariaLabel:r("Requests over time"),className:"h-6 w-20 text-foreground",series:D.requests,testId:"hl-spark-requests"}),s("span",{className:"text-lg font-semibold tabular-nums text-foreground","data-testid":"hl-requests",children:(c?.requests??0).toString()})]})]}),s("span",{"aria-hidden":"true",className:"h-9 w-px bg-border"}),i("div",{className:"text-end",children:[s("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:r("Error rate")}),s("div",{className:S("text-lg font-semibold tabular-nums",ne[U]),"data-testid":"hl-error-rate",children:c===null?"—":F(c.errors,c.requests)})]}),s("span",{"aria-hidden":"true",className:"h-9 w-px bg-border"}),i("div",{className:"flex items-center gap-2",children:[s(xe,{}),s(ve,{message:ue,prefix:"hl"})]})]})]}),f!==null&&s("div",{className:"border-t border-border bg-destructive/5 px-4 py-2 text-sm text-destructive","data-testid":"hl-metrics-error",role:"alert",children:f})]}),i("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-4","data-testid":"hl-slo",children:[s(R,{chart:D.errors.length>=2?s(G,{ariaLabel:r("Errors over time"),className:"h-7 w-20 text-destructive",series:D.errors,testId:"hl-spark-errors"}):void 0,label:r("Error rate"),level:U,testId:"hl-slo-errorrate",value:c===null?"—":F(c.errors,c.requests)}),s(R,{chart:Q.failures.length>=2?s(G,{ariaLabel:r("Auth failures over time"),className:"h-7 w-20 text-destructive",series:Q.failures,testId:"hl-spark-auth"}):void 0,label:r("Auth failures"),level:X,testId:"hl-slo-auth",value:o===null?"—":F(o.failures,o.attempts)}),s(R,{label:r("Scheduler backlog"),level:Y,testId:"hl-slo-backlog",value:x===null?"—":x.backlog.toString()}),s(R,{label:r("Migrations"),level:H.level,testId:"hl-slo-migrations",value:Ke(H,r)})]}),i("div",{className:"grid gap-3 lg:grid-cols-2",children:[i(k,{className:"gap-0 py-0","data-testid":"hl-functions",children:[s("header",{className:"border-b border-border px-4 py-3",children:s("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Functions by error rate")})}),W.length===0?s("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"hl-functions-empty",children:r("No function activity yet.")}):s("ul",{className:"divide-y divide-border",children:W.map(a=>i("li",{className:"flex flex-wrap items-center justify-between gap-2 px-4 py-2 text-xs","data-testid":"hl-fn-row",children:[s("span",{className:"truncate font-mono text-foreground",children:a.path}),i("span",{className:"flex shrink-0 items-center gap-2",children:[s("span",{className:"tabular-nums text-muted-foreground",children:r("{count} calls",{count:a.calls.toString()})}),s(C,{variant:Oe[V(a.errors/a.calls,se,ae)],children:F(a.errors,a.calls)})]})]},a.path))})]}),i(k,{className:"gap-0 py-0",children:[i("header",{className:"flex items-center justify-between gap-2 border-b border-border px-4 py-3",children:[s("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Recent errors")}),s(C,{"data-testid":"hl-error-count",variant:z.length>0?"destructive":"outline",children:z.length})]}),u!==null&&s("p",{className:"px-4 py-8 text-center text-sm text-destructive","data-testid":"hl-logs-error",role:"alert",children:u}),u===null&&K.length===0&&s("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"hl-errors-empty",children:r("No recent errors.")}),K.length>0&&s("ul",{className:"divide-y divide-border",children:K.map((a,v)=>i("li",{className:"flex flex-col gap-0.5 px-4 py-2 text-xs","data-testid":"hl-error-row",children:[i("span",{className:"flex items-center gap-2",children:[s("time",{className:"shrink-0 text-muted-foreground",children:ye(a.timestamp)}),a.functionPath!==void 0&&s("span",{className:"truncate font-mono text-foreground",children:a.functionPath})]}),s("span",{className:"text-destructive",children:a.message})]},`${a.timestamp.toString()}-${v.toString()}`))})]})]}),i(k,{className:"gap-0 py-0",children:[i("header",{className:"flex items-center justify-between gap-2 border-b border-border px-4 py-3",children:[s("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Shards seen")}),s(C,{"data-testid":"hl-shard-count",variant:"outline",children:w.length})]}),w.length>0&&s("ul",{className:"flex flex-wrap gap-1.5 p-4",children:w.map(a=>s("li",{"data-testid":"hl-shard",children:s(C,{variant:"secondary",children:a})},a))})]})]})};export{ot as HealthPanel};
@@ -0,0 +1 @@
1
+ import{c as B}from"react/compiler-runtime";import{useLunora as Z}from"@lunora/react";import{useNavigate as ee}from"@tanstack/react-router";import{useState as A,useRef as te,useCallback as R,useEffect as j,useMemo as ne}from"react";import{ShardInput as ae}from"../packem_shared/ShardInput-BVn2iCU0.js";import{u as re}from"../packem_shared/button-BkCrNcAs.js";import{K as H}from"../packem_shared/use-admin-query-Di3fLE8H.js";import ie from"../packem_shared/useDebounced-Ihdiid_k.js";import{useT as M}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as T}from"../packem_shared/ADMIN_FUNCTIONS-BYNSbBVE.js";import{f as N,c as q,a as J}from"../packem_shared/internal-AtZ4bTal.js";import{r as se}from"../packem_shared/shard-history-DMEW5VBE.js";import{O as U,A as oe}from"../packem_shared/advisor-view-DaCX9Jy5.js";import{ConfirmButton as le}from"../packem_shared/ConfirmButton-CTL3f3kr.js";import{jsx as w}from"react/jsx-runtime";import{deriveInsights as ce}from"../packem_shared/DEFAULT_INSIGHT_THRESHOLDS-B-hcFVoi.js";import{runAdvisor as de,RUNTIME_LINTS as ue}from"@lunora/advisor";const fe=t=>{const{suggestedIndex:e,table:r}=t;return!(typeof r!="string"||r.length===0||typeof e!="object"||e===null||!Array.isArray(e.fields)||e.fields.length===0)},me=(t,e,r)=>{const n=`"${t}"`,a=`"${e}"`,l=r.map(o=>`"${o}"`).join(", ");return`CREATE INDEX IF NOT EXISTS ${a} ON ${n} (${l});`},he=t=>{const e=B(19),{fields:r,indexName:n,table:a,testId:l}=t,o=M(),[x,d]=A(!1);let u;e[0]!==r||e[1]!==n||e[2]!==a?(u=()=>{const v="navigator"in globalThis?globalThis.navigator.clipboard:void 0;if(v===void 0)return;const g=me(a,n,r);N(v.writeText(g)),d(!0)},e[0]=r,e[1]=n,e[2]=a,e[3]=u):u=e[3];const h=u;if(x){const v=`${l}-applied`;let g;e[4]!==o?(g=o("CREATE INDEX SQL copied to clipboard."),e[4]=o,e[5]=g):g=e[5];let S;return e[6]!==v||e[7]!==g?(S=w("span",{className:"text-xs text-muted-foreground","data-testid":v,children:g}),e[6]=v,e[7]=g,e[8]=S):S=e[8],S}let f;e[9]!==o?(f=o("Apply?"),e[9]=o,e[10]=f):f=e[10];let m;e[11]!==o||e[12]!==a?(m=o("Apply index on {table}",{table:a}),e[11]=o,e[12]=a,e[13]=m):m=e[13];let p;return e[14]!==h||e[15]!==f||e[16]!==m||e[17]!==l?(p=w(le,{confirmLabel:f,onConfirm:h,testId:l,children:m}),e[14]=h,e[15]=f,e[16]=m,e[17]=l,e[18]=p):p=e[18],p},pe=(t,e)=>{const r=new Map;for(const n of e){const a=`${n.table} ${n.index}`;r.set(a,(r.get(a)??0)+n.reads)}return t.map(n=>({index:n.index,reads:r.get(`${n.table} ${n.index}`)??0,table:n.table}))},ge=t=>{const e=new Map;for(const r of t)for(const n of r.scannedTables??[])e.set(n.table,(e.get(n.table)??0)+n.scans);return[...e].map(([r,n])=>({scans:n,table:r}))},be=(t,e)=>e.map(r=>({index:r.name,table:t})),ve=t=>{const e=pe(t.declaredIndexes??[],t.indexHits??[]),r=ge(t.functions??[]),n=t.shardTraffic??[],a=t.analyticsMetrics,l=a&&a.indexHits.length>0?a.indexHits:e,o=a&&a.tableScans.length>0?a.tableScans:r,x=a&&a.shardTraffic.length>0?a.shardTraffic:n,d=de({indexHits:l,schema:{tables:[]},shardTraffic:x,tableScans:o},{lints:ue,source:"runtime"}),u=t.suppressHotScanTables;return(u===void 0?d:d.filter(h=>!(h.metadata.kind==="hot_scan"&&typeof h.metadata.table=="string"&&u.has(h.metadata.table)))).map(h=>U(h))},xe=J(T.listTables),ye=J(T.listTableIndexes),K=t=>`${(t*100).toFixed(1)}%`,D=t=>`${(t/1e3).toFixed(2)}s`,$e=t=>{if(t.length<=1)return t[0]??"";const e=t[t.length-1]??"";return`${t.slice(0,-1).join(", ")} and ${e}`},we=(t,e)=>({"high-error-rate":t("High error rate"),"high-evictions":t("High cache eviction rate"),"high-write-contention":t("High write contention"),"low-cache-hit-rate":t("Low cache hit rate"),"missing-index":t("Missing index"),"slow-function":t("Slow function")})[e.kind],X=(t,e)=>({"high-error-rate":t("{rate} of calls failed.",{rate:K(e.value)}),"high-evictions":t("{count} entries evicted recently.",{count:e.value}),"high-write-contention":t("{rate} of calls hit a write conflict — consider sharding to cut contention.",{rate:K(e.value)}),"low-cache-hit-rate":t("{rate} hit rate over recent traffic.",{rate:K(e.value)}),"missing-index":t("Slowest call took {duration} — it full-scanned {tables} with no index.",{duration:D(e.value),tables:$e(e.tables??[])}),"slow-function":t("Slowest call took {duration}.",{duration:D(e.value)})})[e.kind],Se=t=>{const e=B(10),{onJump:r,table:n}=t,a=M();let l;e[0]!==r||e[1]!==n?(l=()=>{r(n)},e[0]=r,e[1]=n,e[2]=l):l=e[2];const o=l,x=`in-add-index-${n}`;let d;e[3]!==a||e[4]!==n?(d=a("Add index on {table}",{table:n}),e[3]=a,e[4]=n,e[5]=d):d=e[5];let u;return e[6]!==o||e[7]!==x||e[8]!==d?(u=w(re,{"data-testid":x,onClick:o,size:"sm",type:"button",variant:"outline",children:d}),e[6]=o,e[7]=x,e[8]=d,e[9]=u):u=e[9],u},De=({initialShardKey:t,loadShardTraffic:e})=>{const r=Z(),n=ee(),a=M(),[l,o]=A(t??""),[x,d]=A(null),[u,h]=A(null),f=ie(l.trim(),400),m=te(""),p=H(T.getMetrics,{},{live:!0,shardKey:f}),v=H(T.getFunctionStats,{},{live:!0,shardKey:f}),g=H(T.getAdvisories,{},{live:!0,shardKey:f}),S=p.data??null,C=v.data?.functions??null,F=g.data?.advisories??null,z=p.data?.indexHits??null,L=p.error!==null&&v.error!==null?p.error:null,P=e??(i=>r.shardTraffic(i)),V=async(i,$)=>{const s=i[0];if(s===void 0||s===""){m.current===$&&h(null);return}try{const y=await P(s);if(m.current!==$)return;const b=new Map;for(const c of y.shards)b.has(c.shardKey)||b.set(c.shardKey,{requests:c.requests,shardKey:c.shardKey});h([...b.values()])}catch{m.current===$&&h(null)}},I=R(async i=>{m.current=i;let $=[];try{const s=await r.query(xe,{},q(i));if(m.current!==i)return;se(i),$=s.map(c=>c.name);const y=await Promise.allSettled(s.map(async c=>[c.name,await r.query(ye,{table:c.name},q(i))]));if(m.current!==i)return;const b=[];for(const c of y)if(c.status==="fulfilled"){const[E,Y]=c.value;b.push(...be(E,Y.indexes))}d(b)}catch{m.current===i&&d(null)}await V($,i)},[r]);j(()=>{N(I(f))},[f,I]),j(()=>{const i=()=>{document.visibilityState==="visible"&&(p.refetch(),v.refetch(),g.refetch(),N(I(f)))};return document.addEventListener("visibilitychange",i),()=>{document.removeEventListener("visibilitychange",i)}},[g,f,I,v,p]);const _=R(i=>{N(n({search:{table:i},to:"/schema"}))},[n]),k=ce(S,C),G=new Set(k.filter(i=>i.kind==="missing-index").flatMap(i=>i.tables??[])),O=ve({declaredIndexes:x??[],functions:C,indexHits:z,shardTraffic:u,suppressHotScanTables:G}),Q=ne(()=>{const i=k.map(s=>{const y=s.kind==="missing-index"?s.tables??[]:[];return{action:y.length>0?y.map(b=>w(Se,{onJump:_,table:b},b)):void 0,description:s.message===void 0?X(a,s):`${X(a,s)} — ${s.message}`,entity:s.fn,issueType:we(a,s),key:`${s.kind}:${s.fn??""}`,level:s.severity}}),$=new Set(["unindexed_foreign_key","unindexed_relation_target"]);return[...(F??[]).map(s=>{const y=U(s);if($.has(s.name)&&fe(s.metadata)){const{table:b,suggestedIndex:c}=s.metadata,E=`in-apply-index-${b}-${c.name}`;return{...y,action:w(he,{fields:c.fields,indexName:c.name,table:b,testId:E})}}return y}),...O,...i]},[F,k,_,O,a]),W=w(ae,{onChange:o,testId:"in-shard-input",value:l});return w(oe,{error:L,errorSource:L===null?void 0:p.errorSource,rows:Q,testId:"lunora-insights",toolbar:W})};export{De as InsightsPanel};
@@ -0,0 +1 @@
1
+ import{c as M}from"react/compiler-runtime";import{useVirtualizer as qe}from"@tanstack/react-virtual";import{useState as $,useReducer as Me,useRef as ie,useEffect as de,useMemo as Ae}from"react";import{f as Q}from"../packem_shared/log-fields-CoL3hsIQ.js";import{E as Oe}from"../packem_shared/error-alert-B59DnrDI.js";import{L as Fe}from"../packem_shared/live-status-CGW2JHf_.js";import{ShardInput as De}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as Y}from"../packem_shared/badge-BbuuAio7.js";import{E as B}from"../packem_shared/empty-state-Cg7t_8qu.js";import{u as _}from"../packem_shared/input-JHu63lTv.js";import{K as re}from"../packem_shared/use-admin-query-Di3fLE8H.js";import G from"../packem_shared/useDebounced-Ihdiid_k.js";import{useT as ce}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as te}from"../packem_shared/ADMIN_FUNCTIONS-BYNSbBVE.js";import{b as ue}from"../packem_shared/cf-links-gbDy51nR.js";import{r as Ke}from"../packem_shared/shard-history-DMEW5VBE.js";import{c as q}from"../packem_shared/utils-bhneXptQ.js";import{l as Ue}from"../packem_shared/virtual-rect-1o1veP7R.js";import{useLunora as Ve}from"@lunora/react";import{u as ze}from"../packem_shared/button-BkCrNcAs.js";import{n as je,d as Be,m as me,p as P,f as Ge,u as T}from"../packem_shared/table-DdJBrClo.js";import{f as ae,l as We,e as le}from"../packem_shared/internal-AtZ4bTal.js";import{jsx as t,jsxs as w,Fragment as Qe}from"react/jsx-runtime";const he=["trace","debug","log","info","warn","error","fatal"],Ye="LOG_ARCHIVE_NOT_CONFIGURED",ge={debug:"secondary",error:"destructive",fatal:"destructive",info:"outline",log:"outline",trace:"outline",warn:"secondary"},He={cursor:void 0,error:null,loading:!1,notConfigured:!1,rows:null},Je=(l,e)=>{switch(e.type){case"append":return{...l,cursor:e.cursor,error:null,loading:!1,rows:[...l.rows??[],...e.rows]};case"failed":return{cursor:void 0,error:e.message,loading:!1,notConfigured:!1,rows:null};case"loaded":return{cursor:e.cursor,error:null,loading:!1,notConfigured:!1,rows:e.rows};case"loading":return{...l,error:null,loading:!0,notConfigured:!1};case"notConfigured":return{cursor:void 0,error:null,loading:!1,notConfigured:!0,rows:null};case"pageFailed":return{...l,error:e.message,loading:!1};default:return l}},Xe=l=>{const e=M(33),{row:r}=l;let s;e[0]!==r.fields?(s=Q(r.fields),e[0]=r.fields,e[1]=s):s=e[1];const n=s,a=`lg-archive-row-${String(r.ts)}`;let i;e[2]!==r.ts?(i=new Date(r.ts).toLocaleString(),e[2]=r.ts,e[3]=i):i=e[3];let u;e[4]!==i?(u=t(T,{className:"tabular-nums whitespace-nowrap text-xs text-muted-foreground",children:i}),e[4]=i,e[5]=u):u=e[5];const v=ge[r.level];let c;e[6]!==r.level||e[7]!==v?(c=t(T,{children:t(Y,{variant:v,children:r.level})}),e[6]=r.level,e[7]=v,e[8]=c):c=e[8];let d;e[9]!==r.functionPath?(d=t(T,{className:"font-mono text-xs",children:r.functionPath}),e[9]=r.functionPath,e[10]=d):d=e[10];let b;e[11]!==r.message?(b=t("div",{className:"truncate",title:r.message,children:r.message}),e[11]=r.message,e[12]=b):b=e[12];let f;e[13]!==n?(f=n!==""&&t("div",{className:"truncate font-mono text-[11px] text-muted-foreground",title:n,children:n}),e[13]=n,e[14]=f):f=e[14];let m;e[15]!==b||e[16]!==f?(m=w(T,{className:"max-w-md",children:[b,f]}),e[15]=b,e[16]=f,e[17]=m):m=e[17];const h=r.traceId??"—";let p;e[18]!==h?(p=t(T,{className:"font-mono text-[11px] text-muted-foreground",children:h}),e[18]=h,e[19]=p):p=e[19];const L=r.shardKey??"—";let g;e[20]!==L?(g=t(T,{className:"font-mono text-[11px] text-muted-foreground",children:L}),e[20]=L,e[21]=g):g=e[21];const x=r.userId??"—";let y;e[22]!==x?(y=t(T,{className:"font-mono text-[11px] text-muted-foreground",children:x}),e[22]=x,e[23]=y):y=e[23];let C;return e[24]!==m||e[25]!==p||e[26]!==g||e[27]!==y||e[28]!==a||e[29]!==u||e[30]!==c||e[31]!==d?(C=w(me,{"data-testid":a,children:[u,c,d,m,p,g,y]}),e[24]=m,e[25]=p,e[26]=g,e[27]=y,e[28]=a,e[29]=u,e[30]=c,e[31]=d,e[32]=C):C=e[32],C},Ze=({shardKey:l})=>{const e=Ve(),r=ce(),[s,n]=$(""),[a,i]=$(""),[u,v]=$(""),[{cursor:c,error:d,loading:b,notConfigured:f,rows:m},h]=Me(Je,He),p=G(s.trim(),400),L=G(a.trim(),400),g={...p===""?{}:{functionPathPrefix:p},...u===""?{}:{minLevel:u},...l===""?{}:{shardKey:l},...L===""?{}:{userId:L}},x=JSON.stringify(g),y=ie(x);de(()=>{const N={cancelled:!1};return y.current=x,ae((async()=>{h({type:"loading"});try{const k=await e.queryLogArchive(g);N.cancelled||h({cursor:k.nextCursor,rows:k.rows,type:"loaded"})}catch(k){N.cancelled||h(We(k)===Ye?{type:"notConfigured"}:{message:le(k),type:"failed"})}})()),()=>{N.cancelled=!0}},[e,x]);const C=async()=>{if(c===void 0)return;const N=x;h({type:"loading"});try{const k=await e.queryLogArchive({...g,cursor:c});y.current===N&&h({cursor:k.nextCursor,rows:k.rows,type:"append"})}catch(k){y.current===N&&h({message:le(k),type:"pageFailed"})}},R=N=>{n(N.target.value)},S=N=>{i(N.target.value)},I=N=>{v(N.target.value)},E=()=>{ae(C())};return f?t(B,{action:t("a",{className:"text-sm text-primary underline-offset-4 hover:underline",href:ue,rel:"noreferrer",target:"_blank",children:r("Open in Cloudflare")}),description:r("Wire pipelineLogSink to a Cloudflare Pipeline → R2 Data Catalog table and set R2_SQL_ACCOUNT_ID, R2_SQL_TOKEN, R2_SQL_BUCKET to browse the durable log archive here."),testId:"lg-archive-not-configured",title:r("Log archive not configured")}):w("div",{className:"flex flex-col gap-4","data-testid":"lg-archive",children:[w("div",{className:"flex flex-wrap items-center gap-2",children:[t(_,{"aria-label":r("Function path prefix"),className:"h-8 w-48","data-testid":"lg-archive-path",onChange:R,placeholder:r("function path…"),value:s}),t(_,{"aria-label":r("User id"),className:"h-8 w-40","data-testid":"lg-archive-user",onChange:S,placeholder:r("user id…"),value:a}),w("select",{"aria-label":r("Minimum level"),className:"h-8 rounded-md border border-border bg-background px-2 text-sm","data-testid":"lg-archive-min-level",onChange:I,value:u,children:[t("option",{value:"",children:r("min level")}),he.map(N=>t("option",{value:N,children:N},N))]})]}),d!==null&&t("p",{className:"text-sm text-destructive","data-testid":"lg-archive-error",role:"alert",children:d}),b&&m===null&&d===null&&t("p",{className:"text-sm text-muted-foreground","data-testid":"lg-archive-loading",children:r("Loading…")}),m!==null&&m.length===0&&t(B,{description:r("No archived logs match these filters. The durable archive fills as pipelineLogSink flushes records to R2."),testId:"lg-archive-empty",title:r("No archived logs.")}),m!==null&&m.length>0&&t("div",{className:"overflow-hidden rounded-xl border border-border shadow-xs",children:w(je,{"data-testid":"lg-archive-table",children:[t(Be,{children:w(me,{children:[t(P,{children:r("Time")}),t(P,{children:r("Level")}),t(P,{children:r("Function")}),t(P,{children:r("Message")}),t(P,{children:r("Trace")}),t(P,{children:r("Shard")}),t(P,{children:r("User")})]})}),t(Ge,{children:m.map((N,k)=>t(Xe,{row:N},`${String(N.ts)}-${String(k)}`))})]})}),c!==void 0&&t("div",{children:t(ze,{"data-testid":"lg-archive-more",disabled:b,onClick:E,size:"sm",variant:"outline",children:r(b?"Loading…":"Load more")})})]})},W=400,er=36,rr={height:W,overflow:"auto"},fe={left:0,position:"absolute",top:0,width:"100%"},tr={error:"destructive",ok:"secondary"},ar=l=>{const e=M(26),{entry:r,index:s,measureRef:n,start:a}=l,i=`translateY(${String(a)}px)`;let u;e[0]!==i?(u={...fe,transform:i},e[0]=i,e[1]=u):u=e[1];const v=u;let c;e[2]!==r.fields?(c=Q(r.fields),e[2]=r.fields,e[3]=c):c=e[3];const d=c;let b;e[4]!==r.timestamp?(b=new Date(r.timestamp).toLocaleString(),e[4]=r.timestamp,e[5]=b):b=e[5];let f;e[6]!==b?(f=t("span",{className:"w-44 shrink-0 tabular-nums text-muted-foreground",role:"gridcell",children:b}),e[6]=b,e[7]=f):f=e[7];const m=ge[r.level];let h;e[8]!==r.level||e[9]!==m?(h=t("span",{className:"w-20 shrink-0",role:"gridcell",children:t(Y,{variant:m,children:r.level})}),e[8]=r.level,e[9]=m,e[10]=h):h=e[10];const p=r.functionPath??"—";let L;e[11]!==p?(L=t("span",{className:"w-48 shrink-0 truncate text-muted-foreground",role:"gridcell",children:p}),e[11]=p,e[12]=L):L=e[12];let g;e[13]!==d?(g=d===""?null:t("span",{className:"ml-2 text-muted-foreground","data-testid":"lg-fields",children:d}),e[13]=d,e[14]=g):g=e[14];let x;e[15]!==r.message||e[16]!==g?(x=w("span",{className:"flex-1 truncate",role:"gridcell",children:[r.message,g]}),e[15]=r.message,e[16]=g,e[17]=x):x=e[17];let y;return e[18]!==s||e[19]!==n||e[20]!==v||e[21]!==x||e[22]!==f||e[23]!==h||e[24]!==L?(y=w("div",{className:"flex items-center border-b border-border px-3 py-1.5 font-mono text-xs hover:bg-muted/50","data-index":s,"data-testid":"lg-row",ref:n,role:"row",style:v,children:[f,h,L,x]}),e[18]=s,e[19]=n,e[20]=v,e[21]=x,e[22]=f,e[23]=h,e[24]=L,e[25]=y):y=e[25],y},oe=l=>l.length===0?"—":l.join(", "),lr=l=>{const e=M(37),{entry:r,index:s,measureRef:n,start:a}=l,i=`translateY(${String(a)}px)`;let u;e[0]!==i?(u={...fe,transform:i},e[0]=i,e[1]=u):u=e[1];const v=u;let c;e[2]!==r.ts?(c=new Date(r.ts).toLocaleString(),e[2]=r.ts,e[3]=c):c=e[3];let d;e[4]!==c?(d=t("span",{className:"w-40 shrink-0 tabular-nums text-muted-foreground",role:"gridcell",children:c}),e[4]=c,e[5]=d):d=e[5];const b=tr[r.outcome];let f;e[6]!==r.outcome||e[7]!==b?(f=t("span",{className:"w-16 shrink-0",role:"gridcell",children:t(Y,{variant:b,children:r.outcome})}),e[6]=r.outcome,e[7]=b,e[8]=f):f=e[8];let m;e[9]!==r.functionPath?(m=t("span",{className:"w-44 shrink-0 truncate",role:"gridcell",title:r.functionPath,children:r.functionPath}),e[9]=r.functionPath,e[10]=m):m=e[10];const h=r.shardKey??"—";let p;e[11]!==h?(p=t("span",{className:"w-24 shrink-0 truncate text-muted-foreground",role:"gridcell",children:h}),e[11]=h,e[12]=p):p=e[12];const L=r.userId??"—";let g;e[13]!==L?(g=t("span",{className:"w-24 shrink-0 truncate text-muted-foreground",role:"gridcell",children:L}),e[13]=L,e[14]=g):g=e[14];let x;e[15]!==r.durationMs?(x=Math.round(r.durationMs),e[15]=r.durationMs,e[16]=x):x=e[16];const y=`${String(x)}ms`;let C;e[17]!==y?(C=t("span",{className:"w-16 shrink-0 tabular-nums text-muted-foreground",role:"gridcell",children:y}),e[17]=y,e[18]=C):C=e[18];let R;e[19]!==r.errorMessage||e[20]!==r.outcome||e[21]!==r.tablesRead||e[22]!==r.tablesWritten?(R=r.outcome==="error"&&r.errorMessage!==void 0?r.errorMessage:`r:${oe(r.tablesRead)} · w:${oe(r.tablesWritten)}`,e[19]=r.errorMessage,e[20]=r.outcome,e[21]=r.tablesRead,e[22]=r.tablesWritten,e[23]=R):R=e[23];let S;e[24]!==R?(S=t("span",{className:"flex-1 truncate text-muted-foreground",role:"gridcell",children:R}),e[24]=R,e[25]=S):S=e[25];let I;return e[26]!==s||e[27]!==n||e[28]!==v||e[29]!==g||e[30]!==C||e[31]!==S||e[32]!==d||e[33]!==f||e[34]!==m||e[35]!==p?(I=w("div",{className:"flex items-center border-b border-border px-3 py-1.5 font-mono text-xs hover:bg-muted/50","data-index":s,"data-testid":"lg-req-row",ref:n,role:"row",style:v,children:[d,f,m,p,g,C,S]}),e[26]=s,e[27]=n,e[28]=v,e[29]=g,e[30]=C,e[31]=S,e[32]=d,e[33]=f,e[34]=m,e[35]=p,e[36]=I):I=e[36],I},se=l=>{const{entries:e}=l??{};return Array.isArray(e)?e:[]},or=l=>{const e={};return l.functionPathPrefix.trim()!==""&&(e.functionPathPrefix=l.functionPathPrefix.trim()),l.userId.trim()!==""&&(e.userId=l.userId.trim()),l.tableTouched.trim()!==""&&(e.tableTouched=l.tableTouched.trim()),(l.outcome==="ok"||l.outcome==="error")&&(e.outcome=l.outcome),e},pe=he,sr={"5m":300*1e3,"15m":900*1e3,"1h":3600*1e3},nr=(l,e)=>{const r=e.search.trim().toLowerCase(),s=e.path.trim().toLowerCase(),n=e.range==="all"?Number.NEGATIVE_INFINITY:e.now-sr[e.range];return l.filter(a=>e.levels.size>0&&!e.levels.has(a.level)||a.timestamp<n||s!==""&&!(a.functionPath??"").toLowerCase().includes(s)?!1:r===""||a.message.toLowerCase().includes(r)||Q(a.fields).toLowerCase().includes(r))},ir="—",dr=l=>{const e=new Map,r=new Map;for(const a of l){e.set(a.level,(e.get(a.level)??0)+1);const i=a.functionPath??ir;r.set(i,(r.get(i)??0)+1)}const s=pe.filter(a=>e.has(a)).map(a=>({count:e.get(a)??0,key:a})),n=[...r.entries()].map(([a,i])=>({count:i,key:a})).toSorted((a,i)=>i.count===a.count?a.key.localeCompare(i.key):i.count-a.count);return{byLevel:s,byPath:n,total:l.length}},cr=l=>{const e=M(11),{level:r,onToggle:s,selected:n}=l;let a;e[0]!==r||e[1]!==s?(a=()=>{s(r)},e[0]=r,e[1]=s,e[2]=a):a=e[2];const i=a,u=n?"border-border bg-muted font-medium":"border-input text-muted-foreground";let v;e[3]!==u?(v=q("rounded-md border px-2 py-1 text-xs",u),e[3]=u,e[4]=v):v=e[4];const c=`logs-level-${r}`;let d;return e[5]!==r||e[6]!==i||e[7]!==n||e[8]!==v||e[9]!==c?(d=t("button",{"aria-pressed":n,className:v,"data-testid":c,onClick:i,type:"button",children:r}),e[5]=r,e[6]=i,e[7]=n,e[8]=v,e[9]=c,e[10]=d):d=e[10],d},ne=l=>{const e=M(7),{bucket:r}=l;let s;e[0]!==r.key?(s=t("span",{className:"truncate text-muted-foreground",role:"gridcell",children:r.key}),e[0]=r.key,e[1]=s):s=e[1];let n;e[2]!==r.count?(n=t("span",{className:"shrink-0 tabular-nums",role:"gridcell",children:r.count}),e[2]=r.count,e[3]=n):n=e[3];let a;return e[4]!==s||e[5]!==n?(a=w("div",{className:"flex items-center justify-between gap-4 px-3 py-1 font-mono text-xs","data-testid":"logs-summary-row",role:"row",children:[s,n]}),e[4]=s,e[5]=n,e[6]=a):a=e[6],a},qr=({initialShardKey:l})=>{const e=ce(),[r,s]=$("requests"),[n,a]=$(l??""),[i,u]=$(""),[v,c]=$(()=>new Set),[d,b]=$(""),[f,m]=$("all"),[h,p]=$(!1),[L,g]=$(""),[x,y]=$(""),[C,R]=$(""),[S,I]=$("all"),E=G(n.trim(),400),N=or({functionPathPrefix:L,outcome:S,tableTouched:C,userId:x}),k=re(te.getRequestLog,N,{enabled:r==="requests",live:!0,shardKey:E}),H=re(te.getLogs,{},{enabled:r==="errors",live:!0,shardKey:E}),D=r==="requests"?k:H,{error:J,errorSource:ve,isLoading:X,liveError:be}=D,xe=se(H.data),Z=se(k.data);de(()=>{D.data!==void 0&&Ke(E)},[D.data,E]);const K=nr(xe,{levels:v,now:Date.now(),path:d,range:f,search:i}),U=dr(K),V=r==="requests"?Z.length:K.length,z=r==="errors"&&h,A=Ae(()=>J!==null?"error":V===0?X?z?"summary":"list":"empty":z?"summary":"list",[V,X,J,z]),ee=ie(null),O=qe({count:V,estimateSize:()=>er,getScrollElement:()=>ee.current,initialRect:{height:W,width:800},observeElementRect:(o,j)=>Ue(o,j,W),overscan:8}),we=O.getVirtualItems(),ye={height:O.getTotalSize(),position:"relative",width:"100%"},Ne=o=>{u(o.target.value)},Le=o=>{c(j=>{const F=new Set(j);return F.has(o)?F.delete(o):F.add(o),F})},Ce=o=>{b(o.target.value)},ke=o=>{m(o.target.value)},$e=()=>{p(o=>!o)},Se=o=>{g(o.target.value)},Re=o=>{y(o.target.value)},Ie=o=>{R(o.target.value)},Ee=o=>{I(o.target.value)},Pe=()=>{s("requests"),p(!1)},Te=()=>{s("errors"),p(!1)},_e=()=>{s("archive"),p(!1)};return w("div",{className:"flex flex-col gap-4","data-testid":"lunora-logs",children:[w("div",{className:"flex flex-wrap items-center gap-2",children:[w("div",{className:"inline-flex overflow-hidden rounded-lg border border-border",role:"tablist",children:[t("button",{"aria-selected":r==="requests",className:q("px-3 py-1 text-sm",r==="requests"?"bg-muted font-medium":"text-muted-foreground"),"data-testid":"lg-view-requests",onClick:Pe,role:"tab",type:"button",children:e("Requests")}),t("button",{"aria-selected":r==="errors",className:q("px-3 py-1 text-sm",r==="errors"?"bg-muted font-medium":"text-muted-foreground"),"data-testid":"lg-view-errors",onClick:Te,role:"tab",type:"button",children:e("Errors")}),t("button",{"aria-selected":r==="archive",className:q("px-3 py-1 text-sm",r==="archive"?"bg-muted font-medium":"text-muted-foreground"),"data-testid":"lg-view-archive",onClick:_e,role:"tab",type:"button",children:e("Archive")})]}),t(De,{onChange:a,testId:"lg-shard-input",value:n}),r!=="archive"&&t(Fe,{message:be,prefix:"lg"}),t("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"lg-cf-link",href:ue,rel:"noreferrer",target:"_blank",children:e("Open in Cloudflare")})]}),r==="errors"&&w("div",{className:"flex flex-wrap items-center gap-2",children:[t(_,{"aria-label":e("Search messages"),className:"h-8 w-48","data-testid":"lg-search",onChange:Ne,placeholder:e("search message"),value:i}),t(_,{"aria-label":e("Function path"),className:"h-8 w-40","data-testid":"logs-path-filter",onChange:Ce,placeholder:e("filter path"),value:d}),t("div",{"aria-label":e("Level filter"),className:"inline-flex items-center gap-1","data-testid":"logs-level-filter",role:"group",children:pe.map(o=>t(cr,{level:o,onToggle:Le,selected:v.has(o)},o))}),w("select",{"aria-label":e("Time range"),className:"h-8 rounded-md border border-input bg-transparent px-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-none","data-testid":"logs-time-range",onChange:ke,value:f,children:[t("option",{value:"all",children:e("All time")}),t("option",{value:"5m",children:e("Last 5m")}),t("option",{value:"15m",children:e("Last 15m")}),t("option",{value:"1h",children:e("Last hour")})]}),t("button",{"aria-pressed":h,className:q("h-8 rounded-md border px-3 text-sm",h?"border-border bg-muted font-medium":"border-input text-muted-foreground"),"data-testid":"logs-summary-toggle",onClick:$e,type:"button",children:e(h?"List":"Summary")})]}),r==="requests"&&w("div",{className:"flex flex-wrap items-center gap-2",children:[t(_,{"aria-label":e("Function path"),className:"h-8 w-44","data-testid":"lg-req-path",onChange:Se,placeholder:e("file:function"),value:L}),t(_,{"aria-label":e("User id"),className:"h-8 w-32","data-testid":"lg-req-user",onChange:Re,placeholder:e("userId"),value:x}),t(_,{"aria-label":e("Table touched"),className:"h-8 w-32","data-testid":"lg-req-table",onChange:Ie,placeholder:e("table"),value:C}),w("select",{"aria-label":e("Outcome filter"),className:"h-8 rounded-md border border-input bg-transparent px-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-none","data-testid":"lg-req-outcome",onChange:Ee,value:S,children:[t("option",{value:"all",children:e("all")}),t("option",{value:"ok",children:e("ok")}),t("option",{value:"error",children:e("error")})]})]}),r==="archive"?t(Ze,{shardKey:E}):w(Qe,{children:[A==="error"&&t(Oe,{error:ve,testId:"lg-error"}),A==="empty"&&t(B,{description:e("Function and request logs for this shard show up here as your app handles traffic."),icon:t("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:t("path",{d:"M4 5h16M4 12h16M4 19h10"})}),testId:"lg-empty",title:e("No logs.")}),A==="summary"&&w("div",{className:"flex flex-col gap-4 rounded-xl border border-border bg-card p-4 shadow-xs","data-testid":"logs-summary",children:[t("p",{className:"text-xs text-muted-foreground","data-testid":"logs-summary-total",children:e("{count} entries",{count:U.total})}),w("div",{children:[t("h4",{className:"mb-1 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:e("By level")}),t("div",{className:"overflow-hidden rounded-lg border border-border","data-testid":"logs-summary-levels",role:"grid",children:U.byLevel.map(o=>t(ne,{bucket:o},o.key))})]}),w("div",{children:[t("h4",{className:"mb-1 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:e("By function")}),t("div",{className:"overflow-hidden rounded-lg border border-border","data-testid":"logs-summary-paths",role:"grid",children:U.byPath.map(o=>t(ne,{bucket:o},o.key))})]})]}),A==="list"&&t("div",{className:"rounded-xl border border-border shadow-xs","data-testid":"lg-scroll",ref:ee,style:rr,children:t("div",{"aria-label":e("Recent logs"),"data-testid":"lg-table",role:"grid",style:ye,children:we.map(o=>r==="requests"?t(lr,{entry:Z[o.index],index:o.index,measureRef:O.measureElement,start:o.start},o.key):t(ar,{entry:K[o.index],index:o.index,measureRef:O.measureElement,start:o.start},o.key))})})]})]})};export{qr as LogsPanel,nr as filterLogs,dr as summarizeLogs};
@@ -0,0 +1,2 @@
1
+ import{useLunora as G}from"@lunora/react";import{useState as p,useMemo as b}from"react";import{E as J}from"../packem_shared/error-alert-B59DnrDI.js";import{g as Q}from"../packem_shared/badge-BbuuAio7.js";import{u as m}from"../packem_shared/button-BkCrNcAs.js";import{E as V}from"../packem_shared/empty-state-Cg7t_8qu.js";import{u as X}from"../packem_shared/input-JHu63lTv.js";import{p as Y}from"../packem_shared/scroll-area-DTEq6Jec.js";import{Separator as Z}from"@base-ui/react/separator";import{c as ee}from"../packem_shared/utils-bhneXptQ.js";import{jsx as e,jsxs as d,Fragment as te}from"react/jsx-runtime";import{K as ae}from"../packem_shared/use-admin-query-Di3fLE8H.js";import{useAutoRefresh as re}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-BCC8_4BQ.js";import{useT as ie}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as v}from"../packem_shared/ADMIN_FUNCTIONS-BYNSbBVE.js";import{i as j,f as T,g as le,c as M,e as z,a as A}from"../packem_shared/internal-AtZ4bTal.js";function de({className:r,orientation:u="horizontal",...a}){return e(Z,{"data-slot":"separator",orientation:u,className:ee("shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",r),...a})}const se=A(v.clearCapturedMail),oe=A(v.sendTestMail),ne=/https?:\/\/[^\s"'<>)]+/i,S=r=>r===void 0?void 0:ne.exec(r)?.[0],ce=r=>{if(r!==void 0)return S(r.html)??S(r.text)},me=`<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src data:; style-src 'unsafe-inline'; font-src data:">`,ue=r=>`${me}${r}`,f=r=>r===void 0?"":Array.isArray(r)?r.join(", "):r,ze=({limit:r=100})=>{const u=G(),a=ie(),{data:N,error:w,errorSource:L,isLoading:E,refetch:x}=ae(v.getCapturedMail,{limit:r}),[y,h]=p(null),[C,k]=p(null),[n,F]=p("html"),[g,O]=p(""),s=b(()=>N?.entries??[],[N]),$=w??y,H=w===null?y:L,I=async()=>{h(null);try{await u.query(se,{},M("")),k(null),x()}catch(t){h(z(t))}},_=async()=>{h(null);try{await u.query(oe,{},M("")),x()}catch(t){h(z(t))}};re(()=>{x()},!0);const q=()=>{T(I())},P=()=>{T(_())},D=t=>{O(t.currentTarget.value)},R=t=>{const{id:l}=t.currentTarget.dataset;l!==void 0&&k(l)},B=t=>{const l=t.currentTarget.dataset.tab;(l==="headers"||l==="html"||l==="text")&&F(l)},K=t=>a(t==="html"?"HTML":t==="text"?"Plain text":"Headers"),c=b(()=>{const t=g.trim().toLowerCase();return t===""?s:s.filter(l=>`${l.subject} ${f(l.to)}`.toLowerCase().includes(t))},[s,g]),i=b(()=>{if(c.length!==0)return c.find(t=>t.id===C)??c[0]},[c,C]),o=ce(i),U=()=>{o!==void 0&&le(o)},W=()=>{o!==void 0&&"window"in globalThis&&globalThis.window.open(o,"_blank","noopener")};return d("div",{className:"flex flex-col gap-4","data-testid":"mail-panel",children:[d("div",{className:"flex flex-wrap items-center gap-2",children:[e(m,{"data-testid":"mail-send-test",onClick:P,size:"sm",type:"button",variant:"outline",children:a("Send test")}),e(m,{"data-testid":"mail-clear",disabled:s.length===0,onClick:q,size:"sm",type:"button",variant:"outline",children:a("Clear inbox")}),s.length>0&&e(Q,{className:"ml-auto","data-testid":"mail-count",variant:"secondary",children:a("{count} messages",{count:s.length})})]}),$!==null&&e(J,{error:H,testId:"mail-error"}),$===null&&!E&&s.length===0&&e(V,{description:a("Email your app sends in dev is captured here — nothing is delivered."),icon:d("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[e("path",{d:"M4 5h16v14H4z"}),e("path",{d:"m4 6 8 6 8-6"})]}),testId:"mail-empty",title:a("No captured email.")}),s.length>0&&d("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-[minmax(0,22rem)_1fr]","data-testid":"mail-reader",children:[d("div",{className:"flex flex-col gap-2",children:[e(X,{"aria-label":a("Search messages"),"data-testid":"mail-search",onChange:D,placeholder:a("Filter messages"),type:"search",value:g}),e(Y,{className:"max-h-[32rem] rounded-xl border border-border bg-card shadow-xs","data-testid":"mail-list",children:e("ul",{className:"divide-y",children:c.map(t=>{const l=t.id===i?.id;return e("li",{children:d("button",{className:`flex w-full flex-col items-start gap-0.5 px-3 py-2 text-left text-sm hover:bg-muted/60 ${l?"bg-muted":""}`,"data-active":l,"data-id":t.id,"data-testid":"mail-list-item",onClick:R,type:"button",children:[e("span",{className:"w-full truncate font-medium",children:t.subject||a("(no subject)")}),e("span",{className:"w-full truncate text-xs text-muted-foreground",children:f(t.to)}),e("span",{className:"text-xs text-muted-foreground tabular-nums",children:j(t.capturedAt,"—")})]})},t.id)})})})]}),i!==void 0&&d("div",{className:"flex min-w-0 flex-col gap-3 rounded-xl border border-border bg-card p-4 shadow-xs","data-testid":"mail-detail",children:[d("div",{className:"flex flex-col gap-1",children:[e("h2",{className:"truncate text-base font-semibold","data-testid":"mail-subject",children:i.subject||a("(no subject)")}),d("dl",{className:"grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 text-xs text-muted-foreground",children:[e("dt",{children:a("From")}),e("dd",{className:"truncate font-mono",children:i.from??"—"}),e("dt",{children:a("To")}),e("dd",{className:"truncate font-mono",children:f(i.to)}),i.cc!==void 0&&i.cc.length>0&&d(te,{children:[e("dt",{children:a("Cc")}),e("dd",{className:"truncate font-mono",children:f(i.cc)})]}),e("dt",{children:a("Sent")}),e("dd",{className:"tabular-nums",children:j(i.capturedAt,"—")})]})]}),d("div",{className:"flex flex-wrap items-center gap-2","data-testid":"mail-actions",children:[e(m,{"data-testid":"mail-copy-link",disabled:o===void 0,onClick:U,size:"sm",type:"button",variant:"outline",children:a("Copy link")}),e(m,{"data-testid":"mail-open-link",disabled:o===void 0,onClick:W,size:"sm",type:"button",variant:"outline",children:a("Open in new tab")})]}),e(de,{}),e("div",{className:"flex items-center gap-1","data-testid":"mail-tabs",role:"tablist",children:["html","text","headers"].map(t=>e(m,{"aria-selected":n===t,"data-tab":t,"data-testid":`mail-tab-${t}`,onClick:B,role:"tab",size:"sm",type:"button",variant:n===t?"secondary":"ghost",children:K(t)},t))}),d("div",{className:"min-h-[12rem]",children:[n==="html"&&(i.html===void 0?e("p",{className:"text-sm text-muted-foreground",children:a("No HTML body.")}):e("iframe",{className:"h-[24rem] w-full rounded-md border bg-white","data-testid":"mail-preview-html",sandbox:"",srcDoc:ue(i.html),title:a("Email preview")})),n==="text"&&(i.text===void 0?e("p",{className:"text-sm text-muted-foreground",children:a("No text body.")}):e("pre",{className:"overflow-auto whitespace-pre-wrap rounded-md border bg-muted/30 p-3 text-xs","data-testid":"mail-preview-text",children:i.text})),n==="headers"&&(i.headers===void 0||Object.keys(i.headers).length===0?e("p",{className:"text-sm text-muted-foreground",children:a("No headers.")}):e("pre",{className:"overflow-auto whitespace-pre-wrap rounded-md border bg-muted/30 p-3 text-xs","data-testid":"mail-preview-headers",children:Object.entries(i.headers).map(([t,l])=>`${t}: ${l}`).join(`
2
+ `)}))]})]})]})]})};export{ze as MailPanel};
@@ -0,0 +1 @@
1
+ import{c as Fe}from"react/compiler-runtime";import{useLunora as lt}from"@lunora/react";import{useNavigate as st}from"@tanstack/react-router";import{useState as ge,useRef as Ke,useEffect as Be,useMemo as nt}from"react";import{L as it}from"../packem_shared/live-status-CGW2JHf_.js";import{ShardInput as ot}from"../packem_shared/ShardInput-BVn2iCU0.js";import{u as Ve}from"../packem_shared/button-BkCrNcAs.js";import{c as he,u as fe,n as Te,f as Re,m as ct}from"../packem_shared/card-CIDGUN6K.js";import{p as ie,d as Xe,m as Ae,u as ae,n as Ye,f as Ze}from"../packem_shared/table-DdJBrClo.js";import{K as He}from"../packem_shared/use-admin-query-Di3fLE8H.js";import dt from"../packem_shared/useDebounced-Ihdiid_k.js";import{useT as Ee}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as ze}from"../packem_shared/ADMIN_FUNCTIONS-BYNSbBVE.js";import{c as mt}from"../packem_shared/cf-links-gbDy51nR.js";import{l as ut,k as Pe,f as Ge,c as ht,e as gt,a as ft}from"../packem_shared/internal-AtZ4bTal.js";import{r as xt,l as pt}from"../packem_shared/shard-history-DMEW5VBE.js";import{w as bt}from"../packem_shared/trace-handoff-Dw7mwjxu.js";import{f as vt}from"../packem_shared/log-fields-CoL3hsIQ.js";import{g as et}from"../packem_shared/badge-BbuuAio7.js";import{S as tt}from"../packem_shared/sparkline-DtcZoU48.js";import{jsx as t,jsxs as n,Fragment as Ue}from"react/jsx-runtime";import{aggregateMetrics as Nt,computeLatencyPercentiles as yt,enrichQueryStats as $t,shardsToAggregate as wt}from"../packem_shared/aggregateMetrics-BNfajLa2.js";import{N as St,y as qt,k as De,_ as kt,w as _t}from"../packem_shared/select-Bul-DeII.js";const Mt=(s,e)=>s<e?-1:s>e?1:0,We=s=>{if(s===void 0)return"null";if(typeof s=="bigint")throw new TypeError("stableStringify: cannot use a bigint in a stable JSON cache key — pass it as a string, or use stableWireKey");if(s===null||typeof s!="object")return JSON.stringify(s);if(Array.isArray(s))return`[${s.map(p=>We(p)).join(",")}]`;const e=Object.getPrototypeOf(s);if(e!==null&&e!==Object.prototype){const p=s.constructor?.name??"value";throw new TypeError(`stableStringify: cannot use a ${p} in a stable JSON cache key — only plain objects, arrays, and JSON primitives are supported (wire-typed values key via stableWireKey)`)}const l=s,r=Object.keys(l).toSorted(Mt),a=[];for(const p of r){const b=l[p];b!==void 0&&a.push(`${JSON.stringify(p)}:${We(b)}`)}return`{${a.join(",")}}`},rt=(s,e,l)=>`${s}:${e}:${We(l??{})}`,at=(s,e)=>s==="gauge"?e.last:s==="histogram"?e.sum/Math.max(1,e.count):e.sum,It=(s,e)=>at(s,e),Ft=s=>at(s.kind,s),Je=s=>Number.isInteger(s)?s.toLocaleString():s.toLocaleString(void 0,{maximumFractionDigits:2}),Ct=s=>Array.isArray(s?.series)?s.series:[],Ot="FUNCTION_NOT_FOUND",Tt=s=>{const e=new Map;if(!Array.isArray(s?.series))return e;for(const l of s.series)e.set(rt(l.kind,l.name,l.attributes),l.points);return e},Rt={counter:"secondary",gauge:"default",histogram:"outline"},Dt=s=>{const e=Fe(18),{name:l,onOpenTrace:r,traceId:a}=s,p=Ee();if(a===void 0){let m;return e[0]===Symbol.for("react.memo_cache_sentinel")?(m=t("span",{className:"text-muted-foreground",children:"—"}),e[0]=m):m=e[0],m}let b;e[1]!==a?(b=a.slice(0,8),e[1]=a,e[2]=b):b=e[2];const f=b;if(r===void 0){const m=`mt-instrument-trace-${l}`;let N;return e[3]!==f||e[4]!==m||e[5]!==a?(N=t("span",{className:"text-muted-foreground","data-testid":m,title:a,children:f}),e[3]=f,e[4]=m,e[5]=a,e[6]=N):N=e[6],N}const h=`mt-instrument-trace-${l}`;let g;e[7]!==r||e[8]!==a?(g=()=>{r(a)},e[7]=r,e[8]=a,e[9]=g):g=e[9];let v;e[10]!==p||e[11]!==a?(v=p("Open the exemplar trace {trace}",{trace:a}),e[10]=p,e[11]=a,e[12]=v):v=e[12];let u;return e[13]!==f||e[14]!==h||e[15]!==g||e[16]!==v?(u=t("button",{className:"text-primary underline-offset-4 hover:underline","data-testid":h,onClick:g,title:v,type:"button",children:f}),e[13]=f,e[14]=h,e[15]=g,e[16]=v,e[17]=u):u=e[17],u},Lt=s=>{const e=Fe(105),{onOpenTrace:l,shardKey:r}=s,a=Ee();let p;e[0]===Symbol.for("react.memo_cache_sentinel")?(p={},e[0]=p):p=e[0];let b;e[1]!==r?(b={live:!0,shardKey:r},e[1]=r,e[2]=b):b=e[2];const{data:f,error:h,errorSource:g}=He(ze.getMetricSeries,p,b);let v;e[3]===Symbol.for("react.memo_cache_sentinel")?(v={},e[3]=v):v=e[3];let u;e[4]!==r?(u={live:!0,shardKey:r},e[4]=r,e[5]=u):u=e[5];const{data:m}=He(ze.getMetricHistory,v,u);let N,le,O,j,K,c,S,se,T,R,I,x,D;if(e[6]!==f||e[7]!==h||e[8]!==g||e[9]!==m||e[10]!==l||e[11]!==a){se=Symbol.for("react.early_return_sentinel");e:{const oe=Ct(f),de=ut(g)===Ot;if(h!==null&&!de){let o;e[25]!==a?(o=a("Instruments"),e[25]=a,e[26]=o):o=e[26];let F;e[27]!==o?(F=t("h3",{className:"text-sm font-semibold text-foreground",children:o}),e[27]=o,e[28]=F):F=e[28];let A;e[29]!==h||e[30]!==a?(A=a("Instruments unavailable: {error}",{error:h}),e[29]=h,e[30]=a,e[31]=A):A=e[31];let z;e[32]!==A?(z=t("span",{className:"text-xs text-muted-foreground","data-testid":"mt-instruments-error",role:"status",children:A}),e[32]=A,e[33]=z):z=e[33];let re;e[34]!==F||e[35]!==z?(re=n("section",{className:"flex flex-col gap-2","data-testid":"mt-instruments",children:[F,z]}),e[34]=F,e[35]=z,e[36]=re):re=e[36],se=re;break e}if(oe.length===0){se=null;break e}const me=Tt(m);let P;e[37]!==a?(P=o=>a(o==="counter"?"Counter":o==="gauge"?"Gauge":"Histogram"),e[37]=a,e[38]=P):P=e[38];const i=P;K="flex flex-col gap-2",c="mt-instruments";let k;e[39]!==a?(k=a("Instruments"),e[39]=a,e[40]=k):k=e[40],e[41]!==k?(S=t("h3",{className:"text-sm font-semibold text-foreground",children:k}),e[41]=k,e[42]=S):S=e[42],j=he,D="overflow-hidden py-0",O=fe,x="px-0",le=Ye,R="mt-instruments-table";let y;e[43]!==a?(y=a("name"),e[43]=a,e[44]=y):y=e[44];let w;e[45]!==y?(w=t(ie,{children:y}),e[45]=y,e[46]=w):w=e[46];let U;e[47]!==a?(U=a("kind"),e[47]=a,e[48]=U):U=e[48];let J;e[49]!==U?(J=t(ie,{children:U}),e[49]=U,e[50]=J):J=e[50];let Q;e[51]!==a?(Q=a("value"),e[51]=a,e[52]=Q):Q=e[52];let H;e[53]!==Q?(H=t(ie,{className:"text-right",children:Q}),e[53]=Q,e[54]=H):H=e[54];let W;e[55]!==a?(W=a("count"),e[55]=a,e[56]=W):W=e[56];let B;e[57]!==W?(B=t(ie,{className:"text-right",children:W}),e[57]=W,e[58]=B):B=e[58];let V;e[59]!==a?(V=a("range"),e[59]=a,e[60]=V):V=e[60];let G;e[61]!==V?(G=t(ie,{className:"text-right",children:V}),e[61]=V,e[62]=G):G=e[62];let X;e[63]!==a?(X=a("trend"),e[63]=a,e[64]=X):X=e[64];let Y;e[65]!==X?(Y=t(ie,{children:X}),e[65]=X,e[66]=Y):Y=e[66];let Z;e[67]!==a?(Z=a("trace"),e[67]=a,e[68]=Z):Z=e[68];let ee;e[69]!==Z?(ee=t(ie,{children:Z}),e[69]=Z,e[70]=ee):ee=e[70];let ce;e[71]!==a?(ce=a("dimensions"),e[71]=a,e[72]=ce):ce=e[72];let te;e[73]!==ce?(te=t(ie,{children:ce}),e[73]=ce,e[74]=te):te=e[74],e[75]!==w||e[76]!==J||e[77]!==H||e[78]!==B||e[79]!==G||e[80]!==Y||e[81]!==ee||e[82]!==te?(I=t(Xe,{children:n(Ae,{children:[w,J,H,B,G,Y,ee,te]})}),e[75]=w,e[76]=J,e[77]=H,e[78]=B,e[79]=G,e[80]=Y,e[81]=ee,e[82]=te,e[83]=I):I=e[83],N=Ze,T=oe.map(o=>{const F=vt(o.attributes),A=rt(o.kind,o.name,o.attributes),z=(me.get(A)??[]).map(re=>It(o.kind,re));return n(Ae,{"data-testid":`mt-instrument-${o.name}`,children:[t(ae,{className:"font-mono text-xs",title:o.functionPath,children:o.name}),t(ae,{children:t(et,{variant:Rt[o.kind],children:i(o.kind)})}),t(ae,{className:"text-right font-mono tabular-nums","data-testid":`mt-instrument-value-${o.name}`,children:Je(Ft(o))}),t(ae,{className:"text-right tabular-nums text-muted-foreground",children:o.count.toLocaleString()}),t(ae,{className:"text-right font-mono text-xs tabular-nums text-muted-foreground",children:o.min===o.max?"—":`${Je(o.min)}–${Je(o.max)}`}),t(ae,{children:z.length>=2?t(tt,{ariaLabel:a("{name} trend",{name:o.name}),className:"h-6 w-24 text-foreground",series:z,testId:`mt-instrument-trend-${o.name}`}):t("span",{className:"text-xs text-muted-foreground",children:"—"})}),t(ae,{className:"font-mono text-xs",children:t(Dt,{name:o.name,onOpenTrace:l,traceId:o.exemplarTraceId})}),t(ae,{className:"max-w-64 truncate font-mono text-xs text-muted-foreground",title:F,children:F===""?"—":F})]},A)})}e[6]=f,e[7]=h,e[8]=g,e[9]=m,e[10]=l,e[11]=a,e[12]=N,e[13]=le,e[14]=O,e[15]=j,e[16]=K,e[17]=c,e[18]=S,e[19]=se,e[20]=T,e[21]=R,e[22]=I,e[23]=x,e[24]=D}else N=e[12],le=e[13],O=e[14],j=e[15],K=e[16],c=e[17],S=e[18],se=e[19],T=e[20],R=e[21],I=e[22],x=e[23],D=e[24];if(se!==Symbol.for("react.early_return_sentinel"))return se;let E;e[84]!==N||e[85]!==T?(E=t(N,{children:T}),e[84]=N,e[85]=T,e[86]=E):E=e[86];let M;e[87]!==le||e[88]!==E||e[89]!==R||e[90]!==I?(M=n(le,{"data-testid":R,children:[I,E]}),e[87]=le,e[88]=E,e[89]=R,e[90]=I,e[91]=M):M=e[91];let L;e[92]!==O||e[93]!==M||e[94]!==x?(L=t(O,{className:x,children:M}),e[92]=O,e[93]=M,e[94]=x,e[95]=L):L=e[95];let $;e[96]!==j||e[97]!==L||e[98]!==D?($=t(j,{className:D,children:L}),e[96]=j,e[97]=L,e[98]=D,e[99]=$):$=e[99];let q;return e[100]!==K||e[101]!==c||e[102]!==S||e[103]!==$?(q=n("section",{className:K,"data-testid":c,children:[S,$]}),e[100]=K,e[101]=c,e[102]=S,e[103]=$,e[104]=q):q=e[104],q},je=s=>s>=100?"critical":s>=50?"warning":"good",Qe=s=>s<1?`${(s*1e3).toFixed(0)}μs`:s<1e3?`${s.toFixed(1)}ms`:`${(s/1e3).toFixed(2)}s`,Le=s=>s>=1e9?`${(s/1e9).toFixed(1)}B`:s>=1e6?`${(s/1e6).toFixed(1)}M`:s>=1e3?`${(s/1e3).toFixed(1)}K`:s.toLocaleString(),At=s=>{const e=Fe(3),{level:l}=s;if(l==="critical"){let a;return e[0]===Symbol.for("react.memo_cache_sentinel")?(a=t(et,{variant:"destructive",children:"Slow"}),e[0]=a):a=e[0],a}if(l==="warning"){let a;return e[1]===Symbol.for("react.memo_cache_sentinel")?(a=t("span",{className:"inline-flex items-center gap-1 rounded-md border border-transparent bg-warning/10 px-2 py-0.5 text-xs font-medium text-warning",children:"Moderate"}),e[1]=a):a=e[1],a}let r;return e[2]===Symbol.for("react.memo_cache_sentinel")?(r=t("span",{className:"inline-flex items-center gap-1 rounded-md border border-transparent bg-success/10 px-2 py-0.5 text-xs font-medium text-success",children:"Fast"}),e[2]=r):r=e[2],r},zt=s=>{const e=Fe(152),{queryStats:l}=s,r=Ee(),[a,p]=ge("totalTime");let b;e[0]===Symbol.for("react.memo_cache_sentinel")?(b=new Set,e[0]=b):b=e[0];const[f,h]=ge(b);let g;e[1]===Symbol.for("react.memo_cache_sentinel")?(g=d=>{d!==null&&p(d)},e[1]=g):g=e[1];const v=g;let u;if(e[2]!==l||e[3]!==a){u=[...l];let d;e[5]!==a?(d=(C,_)=>{switch(a){case"avgTime":return _.avgDurationMs-C.avgDurationMs;case"execCount":return _.execCount-C.execCount;case"rowsRead":return _.rowsRead-C.rowsRead;default:return _.totalDurationMs-C.totalDurationMs}},e[5]=a,e[6]=d):d=e[6],u.sort(d),e[2]=l,e[3]=a,e[4]=u}else u=e[4];const m=u;let N;e[7]!==l?(N=l.filter(Et),e[7]=l,e[8]=N):N=e[8];const le=N.length;let O;e[9]!==l?(O=l.filter(jt),e[9]=l,e[10]=O):O=e[10];const j=O.length;let K;e[11]!==l?(K=l.filter(Kt),e[11]=l,e[12]=K):K=e[12];const c=K.length;let S;e[13]===Symbol.for("react.memo_cache_sentinel")?(S=d=>{h(C=>{const _=new Set(C);return _.has(d)?_.delete(d):_.add(d),_})},e[13]=S):S=e[13];const se=S;if(l.length===0){let d;e[14]!==r?(d=r("No query insights yet"),e[14]=r,e[15]=d):d=e[15];let C;e[16]!==d?(C=t("p",{className:"text-lg font-medium","data-testid":"qi-empty",children:d}),e[16]=d,e[17]=C):C=e[17];let _;e[18]!==r?(_=r("Query insights appear once statements are executed against this shard."),e[18]=r,e[19]=_):_=e[19];let ue;e[20]!==_?(ue=t("p",{className:"mt-1 text-sm",children:_}),e[20]=_,e[21]=ue):ue=e[21];let Oe;return e[22]!==ue||e[23]!==C?(Oe=t(he,{children:t(fe,{className:"py-12",children:n("div",{className:"text-center text-muted-foreground",children:[C,ue]})})}),e[22]=ue,e[23]=C,e[24]=Oe):Oe=e[24],Oe}let T;e[25]!==r?(T=r("Critical queries"),e[25]=r,e[26]=T):T=e[26];let R;e[27]!==T?(R=t(Te,{className:"pb-2",children:t(Re,{className:"text-sm font-medium",children:T})}),e[27]=T,e[28]=R):R=e[28];let I;e[29]!==le?(I=t("div",{className:"text-2xl font-bold text-destructive","data-testid":"qi-critical",children:le}),e[29]=le,e[30]=I):I=e[30];let x;e[31]!==r?(x=r(">100ms avg execution"),e[31]=r,e[32]=x):x=e[32];let D;e[33]!==x?(D=t("p",{className:"text-xs text-muted-foreground",children:x}),e[33]=x,e[34]=D):D=e[34];let E;e[35]!==D||e[36]!==I?(E=n(fe,{children:[I,D]}),e[35]=D,e[36]=I,e[37]=E):E=e[37];let M;e[38]!==E||e[39]!==R?(M=n(he,{children:[R,E]}),e[38]=E,e[39]=R,e[40]=M):M=e[40];let L;e[41]!==r?(L=r("Moderate queries"),e[41]=r,e[42]=L):L=e[42];let $;e[43]!==L?($=t(Te,{className:"pb-2",children:t(Re,{className:"text-sm font-medium",children:L})}),e[43]=L,e[44]=$):$=e[44];let q;e[45]!==j?(q=t("div",{className:"text-2xl font-bold text-warning","data-testid":"qi-moderate",children:j}),e[45]=j,e[46]=q):q=e[46];let oe;e[47]!==r?(oe=r("50–100ms avg execution"),e[47]=r,e[48]=oe):oe=e[48];let de;e[49]!==oe?(de=t("p",{className:"text-xs text-muted-foreground",children:oe}),e[49]=oe,e[50]=de):de=e[50];let me;e[51]!==q||e[52]!==de?(me=n(fe,{children:[q,de]}),e[51]=q,e[52]=de,e[53]=me):me=e[53];let P;e[54]!==$||e[55]!==me?(P=n(he,{children:[$,me]}),e[54]=$,e[55]=me,e[56]=P):P=e[56];let i;e[57]!==r?(i=r("Fast queries"),e[57]=r,e[58]=i):i=e[58];let k;e[59]!==i?(k=t(Te,{className:"pb-2",children:t(Re,{className:"text-sm font-medium",children:i})}),e[59]=i,e[60]=k):k=e[60];let y;e[61]!==c?(y=t("div",{className:"text-2xl font-bold text-success","data-testid":"qi-fast",children:c}),e[61]=c,e[62]=y):y=e[62];let w;e[63]!==r?(w=r("<50ms avg execution"),e[63]=r,e[64]=w):w=e[64];let U;e[65]!==w?(U=t("p",{className:"text-xs text-muted-foreground",children:w}),e[65]=w,e[66]=U):U=e[66];let J;e[67]!==y||e[68]!==U?(J=n(fe,{children:[y,U]}),e[67]=y,e[68]=U,e[69]=J):J=e[69];let Q;e[70]!==k||e[71]!==J?(Q=n(he,{children:[k,J]}),e[70]=k,e[71]=J,e[72]=Q):Q=e[72];let H;e[73]!==M||e[74]!==P||e[75]!==Q?(H=n("div",{className:"grid gap-4 md:grid-cols-3",children:[M,P,Q]}),e[73]=M,e[74]=P,e[75]=Q,e[76]=H):H=e[76];let W;e[77]!==r?(W=r("Query leaderboard"),e[77]=r,e[78]=W):W=e[78];let B;e[79]!==W?(B=t("h3",{className:"text-lg font-semibold",children:W}),e[79]=W,e[80]=B):B=e[80];let V;e[81]!==a||e[82]!==r?(V=r("Slow queries sorted by {sortField}",{sortField:r(a)}),e[81]=a,e[82]=r,e[83]=V):V=e[83];let G;e[84]!==V?(G=t("p",{className:"text-sm text-muted-foreground",children:V}),e[84]=V,e[85]=G):G=e[85];let X;e[86]!==B||e[87]!==G?(X=n("div",{children:[B,G]}),e[86]=B,e[87]=G,e[88]=X):X=e[88];let Y;e[89]!==r?(Y=r("Sort by"),e[89]=r,e[90]=Y):Y=e[90];let Z;e[91]!==Y?(Z=t("span",{className:"text-sm text-muted-foreground",children:Y}),e[91]=Y,e[92]=Z):Z=e[92];let ee;e[93]!==r?(ee=r("Sort queries by"),e[93]=r,e[94]=ee):ee=e[94];let ce;e[95]===Symbol.for("react.memo_cache_sentinel")?(ce=t(St,{}),e[95]=ce):ce=e[95];let te;e[96]!==ee?(te=t(qt,{"aria-label":ee,className:"w-[140px]","data-testid":"qi-sort",children:ce}),e[96]=ee,e[97]=te):te=e[97];let o;e[98]!==r?(o=r("Total time"),e[98]=r,e[99]=o):o=e[99];let F;e[100]!==o?(F=t(De,{value:"totalTime",children:o}),e[100]=o,e[101]=F):F=e[101];let A;e[102]!==r?(A=r("Avg time"),e[102]=r,e[103]=A):A=e[103];let z;e[104]!==A?(z=t(De,{value:"avgTime",children:A}),e[104]=A,e[105]=z):z=e[105];let re;e[106]!==r?(re=r("Execution count"),e[106]=r,e[107]=re):re=e[107];let xe;e[108]!==re?(xe=t(De,{value:"execCount",children:re}),e[108]=re,e[109]=xe):xe=e[109];let pe;e[110]!==r?(pe=r("Rows read"),e[110]=r,e[111]=pe):pe=e[111];let be;e[112]!==pe?(be=t(De,{value:"rowsRead",children:pe}),e[112]=pe,e[113]=be):be=e[113];let ve;e[114]!==F||e[115]!==z||e[116]!==xe||e[117]!==be?(ve=n(kt,{children:[F,z,xe,be]}),e[114]=F,e[115]=z,e[116]=xe,e[117]=be,e[118]=ve):ve=e[118];let Ne;e[119]!==a||e[120]!==te||e[121]!==ve?(Ne=n(_t,{onValueChange:v,value:a,children:[te,ve]}),e[119]=a,e[120]=te,e[121]=ve,e[122]=Ne):Ne=e[122];let ye;e[123]!==Z||e[124]!==Ne?(ye=n("div",{className:"flex items-center gap-2",children:[Z,Ne]}),e[123]=Z,e[124]=Ne,e[125]=ye):ye=e[125];let $e;e[126]!==X||e[127]!==ye?($e=n("div",{className:"flex items-center justify-between",children:[X,ye]}),e[126]=X,e[127]=ye,e[128]=$e):$e=e[128];let we;e[129]!==r?(we=r("Statements"),e[129]=r,e[130]=we):we=e[130];let Se;e[131]!==we?(Se=t(Re,{children:we}),e[131]=we,e[132]=Se):Se=e[132];let qe;e[133]!==m.length||e[134]!==r?(qe=r("{count} tracked statements",{count:m.length}),e[133]=m.length,e[134]=r,e[135]=qe):qe=e[135];let ke;e[136]!==qe?(ke=t(ct,{children:qe}),e[136]=qe,e[137]=ke):ke=e[137];let _e;e[138]!==Se||e[139]!==ke?(_e=n(Te,{children:[Se,ke]}),e[138]=Se,e[139]=ke,e[140]=_e):_e=e[140];let Me;e[141]!==f||e[142]!==m||e[143]!==r?(Me=t(fe,{children:t("div",{className:"space-y-2",children:m.map(d=>{const C=d.normalizedSql,_=f.has(C),ue=je(d.avgDurationMs);return n("div",{className:"overflow-hidden rounded-lg border","data-testid":"qi-row",children:[n("button",{"aria-expanded":_,className:"flex w-full items-center justify-between p-3 text-left transition-colors hover:bg-muted/50",onClick:()=>{se(C)},type:"button",children:[n("div",{className:"flex min-w-0 flex-1 items-center gap-3",children:[t(At,{level:ue}),t("span",{className:"max-w-[300px] truncate font-mono text-sm lg:max-w-[500px]",children:d.normalizedSql})]}),n("div",{className:"flex shrink-0 items-center gap-4",children:[n("div",{className:"text-right",children:[t("div",{className:"text-sm font-medium",children:Qe(d.totalDurationMs)}),t("div",{className:"text-xs text-muted-foreground",children:r("total")})]}),n("div",{className:"text-right",children:[t("div",{className:"text-sm font-medium",children:Qe(d.avgDurationMs)}),t("div",{className:"text-xs text-muted-foreground",children:r("avg")})]}),n("div",{className:"text-right",children:[t("div",{className:"text-sm font-medium",children:Le(d.execCount)}),t("div",{className:"text-xs text-muted-foreground",children:r("calls")})]})]})]}),_&&n("div",{className:"space-y-3 border-t bg-muted/30 p-4",children:[n("div",{children:[t("p",{className:"mb-2 text-sm font-medium",children:r("Full statement")}),t("pre",{className:"overflow-x-auto rounded-md bg-muted p-3 font-mono text-sm whitespace-pre-wrap break-all",children:d.normalizedSql})]}),n("div",{className:"grid grid-cols-2 gap-4 text-sm md:grid-cols-4",children:[n("div",{children:[t("span",{className:"text-muted-foreground",children:r("Exec count")}),t("span",{className:"block font-medium tabular-nums",children:Le(d.execCount)})]}),n("div",{children:[t("span",{className:"text-muted-foreground",children:r("Total time")}),t("span",{className:"block font-medium tabular-nums",children:Qe(d.totalDurationMs)})]}),n("div",{children:[t("span",{className:"text-muted-foreground",children:r("Rows read")}),t("span",{className:"block font-medium tabular-nums",children:Le(d.rowsRead)})]}),n("div",{children:[t("span",{className:"text-muted-foreground",children:r("Rows written")}),t("span",{className:"block font-medium tabular-nums",children:Le(d.rowsWritten)})]})]})]})]},C)})})}),e[141]=f,e[142]=m,e[143]=r,e[144]=Me):Me=e[144];let Ie;e[145]!==_e||e[146]!==Me?(Ie=n(he,{children:[_e,Me]}),e[145]=_e,e[146]=Me,e[147]=Ie):Ie=e[147];let Ce;return e[148]!==H||e[149]!==$e||e[150]!==Ie?(Ce=n("div",{className:"space-y-4","data-testid":"qi-root",children:[H,$e,Ie]}),e[148]=H,e[149]=$e,e[150]=Ie,e[151]=Ce):Ce=e[151],Ce};function Et(s){return je(s.avgDurationMs)==="critical"}function jt(s){return je(s.avgDurationMs)==="warning"}function Kt(s){return je(s.avgDurationMs)==="good"}const Pt=ft(ze.getMetrics),Ut=s=>{const e=Math.floor(s/1e3),l=Math.floor(e/3600),r=Math.floor(e%3600/60),a=e%60;return l>0?`${l.toString()}h ${r.toString()}m`:r>0?`${r.toString()}m ${a.toString()}s`:`${a.toString()}s`},Jt=(s,e)=>s?e:"overview",Qt=(s,e)=>{const l=s+e;return l===0?"—":`${(s/l*100).toFixed(1)}%`},ne=s=>{const e=Fe(16),{chart:l,footer:r,label:a,testId:p,value:b}=s;let f;e[0]!==a?(f=t("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:a}),e[0]=a,e[1]=f):f=e[1];let h;e[2]!==p||e[3]!==b?(h=t("span",{className:"truncate text-2xl font-semibold tabular-nums text-foreground","data-testid":p,children:b}),e[2]=p,e[3]=b,e[4]=h):h=e[4];let g;e[5]!==l||e[6]!==h?(g=n("div",{className:"flex items-center justify-between gap-3",children:[h,l]}),e[5]=l,e[6]=h,e[7]=g):g=e[7];let v;e[8]!==f||e[9]!==g?(v=n("div",{className:"flex flex-col gap-2.5 p-4",children:[f,g]}),e[8]=f,e[9]=g,e[10]=v):v=e[10];let u;e[11]!==r?(u=r!=null&&t("div",{className:"border-t border-border bg-muted/50 px-4 py-2.5 text-[11px] text-muted-foreground",children:r}),e[11]=r,e[12]=u):u=e[12];let m;return e[13]!==v||e[14]!==u?(m=n(he,{className:"justify-between gap-0 py-0",children:[v,u]}),e[13]=v,e[14]=u,e[15]=m):m=e[15],m},fr=({initialShardKey:s})=>{const e=lt(),l=Ee(),r=st(),[a,p]=ge(s??""),[b,f]=ge("overview"),[h,g]=ge([]),v=Ke(null),u=Ke(null),m=Ke(!0);Be(()=>(m.current=!0,()=>{m.current=!1}),[]);const N=dt(a.trim(),400),le=i=>{bt({shardKey:N,traceId:i}),Ge(r({to:"/traces"}))},{data:O,error:j,liveError:K}=He(ze.getMetrics,{},{live:!0,shardKey:N}),c=O??null;Be(()=>{if(O===void 0)return;xt(N);const i=O,k=v.current,y=u.current!==null&&u.current!==i.shard;if(u.current=i.shard,v.current=i.requests,y){g([]);return}k!==null&&i.requests>=k&&g(w=>[...w,i.requests-k].slice(-30))},[O,N]);const[S,se]=ge(null),[T,R]=ge(!1),I=async()=>{R(!0);const i=wt(a,pt());try{const k=await Promise.all(i.map(async y=>{try{const w=await e.query(Pt,{},ht(y));return{error:null,metrics:w,shard:y===""?w.shard:y}}catch(w){return{error:gt(w),metrics:null,shard:y===""?"__root__":y}}}));m.current&&se(k)}finally{m.current&&R(!1)}},x=S===null?null:Nt(S),D=c===null||c.requests===0?"—":`${(c.errors/c.requests*100).toFixed(1)}%`,E=h.length>0?h.at(-1):0,M=c?yt(c):{p90:0,p95:0},L=i=>i<=0?"—":i<1?`${(i*1e3).toFixed(0)}μs`:i<1e3?`${i.toFixed(1)}ms`:`${(i/1e3).toFixed(2)}s`,$=nt(()=>{if(!c||!("queryStats"in c))return;const i=c.queryStats;if(!(!i||!Array.isArray(i)))return $t(i)},[c]),q=Jt($!==void 0,b),oe=()=>{Ge(I())},de=()=>{se(null)},me=()=>{f("overview")},P=()=>{f("query-insights")};return n("div",{className:"flex flex-col gap-4","data-testid":"lunora-metrics",children:[n("div",{className:"flex flex-wrap items-center gap-2",children:[t(ot,{onChange:p,testId:"mt-shard-input",value:a}),t(it,{message:K,prefix:"mt"}),t(Ve,{"data-testid":"mt-aggregate",disabled:T,onClick:oe,size:"sm",type:"button",variant:"secondary",children:l(T?"Aggregating…":"All shards")}),S!==null&&t(Ve,{"data-testid":"mt-aggregate-clear",onClick:de,size:"sm",type:"button",variant:"ghost",children:l("Hide")}),t("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"mt-cf-link",href:mt,rel:"noreferrer",target:"_blank",children:l("Open in Cloudflare")})]}),j!==null&&t("p",{className:"text-sm text-destructive","data-testid":"mt-error",role:"alert",children:j}),$!==void 0&&n("div",{className:"flex gap-2 border-b","data-testid":"mt-tabs",children:[t("button",{className:`pb-2 text-sm font-medium transition-colors ${q==="overview"?"border-b-2 border-primary text-foreground":"text-muted-foreground hover:text-foreground"}`,"data-testid":"mt-tab-overview",onClick:me,type:"button",children:l("Overview")}),n("button",{className:`pb-2 text-sm font-medium transition-colors ${q==="query-insights"?"border-b-2 border-primary text-foreground":"text-muted-foreground hover:text-foreground"}`,"data-testid":"mt-tab-query-insights",onClick:P,type:"button",children:[l("Query insights"),$.length>0&&t("span",{className:"ml-1.5 rounded-full bg-primary/10 px-1.5 py-0.5 text-xs text-primary",children:$.length})]})]}),q==="query-insights"&&$!==void 0&&t(zt,{queryStats:$}),q==="overview"&&c!==null&&n("dl",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4","data-testid":"mt-stats",children:[t(ne,{chart:h.length>=2?t(tt,{ariaLabel:l("Requests per interval over time"),className:"h-7 w-24 text-foreground",series:h,testId:"mt-sparkline"}):void 0,footer:h.length>=2?n(Ue,{children:[t("span",{className:"font-semibold text-foreground",children:`+${E.toLocaleString()}`})," ",l("last interval")]}):t("span",{"data-testid":"mt-sparkline-empty",children:l("collecting samples…")}),label:l("Requests"),testId:"mt-requests",value:c.requests}),t(ne,{footer:l("{rate} error rate",{rate:D}),label:l("Errors"),testId:"mt-errors",value:n(Ue,{children:[c.errors," (",D,")"]})}),t(ne,{footer:M.p90>0?`P90 ${L(M.p90)}`:void 0,label:l("P95 latency"),testId:"mt-p95",value:M.p95>0?L(M.p95):"—"}),t(ne,{footer:c.cache===null?void 0:`${c.cache.entries.toLocaleString()} ${l("cache entries")}`,label:l("Database size"),testId:"mt-db-size",value:Pe(c.databaseSize)}),t(ne,{label:l("Shard"),testId:"mt-shard",value:c.shard}),t(ne,{label:l("Uptime"),testId:"mt-uptime",value:Ut(c.uptimeMs)}),t(ne,{label:l("Cache hit rate"),testId:"mt-cache",value:c.cache===null?l("no cache configured"):l("{rate} ({count} entries)",{count:c.cache.entries,rate:Qt(c.cache.hits,c.cache.misses)})})]}),q==="overview"&&c===null&&null,q==="overview"&&t(Lt,{onOpenTrace:le,shardKey:N}),q==="overview"&&x!==null&&S!==null&&n("div",{className:"flex flex-col gap-4","data-testid":"mt-aggregate-view",children:[n("dl",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3","data-testid":"mt-aggregate-stats",children:[t(ne,{label:l("Shards"),testId:"mt-agg-shards",value:x.failed>0?l("{reachable} reachable, {failed} unreachable",{failed:x.failed,reachable:x.reachable}):l("{reachable} reachable",{reachable:x.reachable})}),t(ne,{label:l("Total requests"),testId:"mt-agg-requests",value:x.totalRequests}),t(ne,{label:l("Total errors"),testId:"mt-agg-errors",value:x.totalErrors}),t(ne,{label:l("Total database size"),testId:"mt-agg-db-size",value:Pe(x.totalDatabaseSize)}),t(ne,{label:l("Combined cache hit rate"),testId:"mt-agg-cache",value:x.hitRate===null?l("no cache configured"):`${(x.hitRate*100).toFixed(1)}%`})]}),t(he,{className:"overflow-hidden py-0",children:t(fe,{className:"px-0",children:n(Ye,{"data-testid":"mt-agg-table",children:[t(Xe,{children:n(Ae,{children:[t(ie,{children:l("shard")}),t(ie,{children:l("requests")}),t(ie,{children:l("errors")}),t(ie,{children:l("db size")})]})}),t(Ze,{children:S.map(i=>n(Ae,{"data-testid":`mt-agg-row-${i.shard}`,children:[t(ae,{children:i.shard}),i.metrics===null?t(ae,{className:"text-destructive",colSpan:3,children:i.error??l("unreachable")}):n(Ue,{children:[t(ae,{className:"tabular-nums",children:i.metrics.requests}),t(ae,{className:"tabular-nums",children:i.metrics.errors}),t(ae,{className:"tabular-nums",children:Pe(i.metrics.databaseSize)})]})]},i.shard))})]})})})]})]})};export{fr as MetricsPanel};
@@ -0,0 +1 @@
1
+ import{useLunora as z}from"@lunora/react";import{useState as a,useEffect as O}from"react";import{ConfirmButton as P}from"../packem_shared/ConfirmButton-CTL3f3kr.js";import{E as q}from"../packem_shared/error-alert-B59DnrDI.js";import{L as H}from"../packem_shared/live-status-CGW2JHf_.js";import{ShardInput as U}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as W}from"../packem_shared/badge-BbuuAio7.js";import{u as _}from"../packem_shared/button-BkCrNcAs.js";import{c as G,u as J}from"../packem_shared/card-CIDGUN6K.js";import{E as Q}from"../packem_shared/empty-state-Cg7t_8qu.js";import{u as V}from"../packem_shared/input-JHu63lTv.js";import{p as $}from"../packem_shared/label-6uP1obNF.js";import{n as X,d as Y,m as k,p as n,f as Z,u as o}from"../packem_shared/table-DdJBrClo.js";import{K as rr}from"../packem_shared/use-admin-query-Di3fLE8H.js";import er from"../packem_shared/useDebounced-Ihdiid_k.js";import{useT as tr}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as R}from"../packem_shared/ADMIN_FUNCTIONS-BYNSbBVE.js";import{i as ir,f as ar,c as nr,e as or,a as dr}from"../packem_shared/internal-AtZ4bTal.js";import{r as sr}from"../packem_shared/shard-history-DMEW5VBE.js";import{jsxs as i,jsx as r}from"react/jsx-runtime";const lr=dr(R.runMigration),Er=({initialShardKey:C})=>{const L=z(),e=tr(),[c,M]=a(C??""),[v,S]=a(""),[x,E]=a("up"),[h,I]=a(!0),[m,y]=a(!1),[s,p]=a(null),[b,g]=a(null),u=er(c.trim(),400),w=c.trim()===u,d=rr(R.migrationStatus,{},{live:!0,shardKey:u}),l=d.data?.migrations??null,D=d.error,{errorSource:A,liveError:j}=d;O(()=>{d.data!==void 0&&sr(u)},[d.data,u]);const K=async()=>{const t=v.trim();if(t===""){g(e("Enter a migration id")),p(null);return}y(!0),g(null);try{const f=await L.query(lr,{direction:x,dryRun:h,id:t},nr(c));p(f),d.refetch()}catch(f){p(null),g(or(f))}finally{y(!1)}},N=()=>{ar(K())},T=t=>{S(t.target.value)},B=t=>{E(t.target.value==="down"?"down":"up")},F=t=>{I(t.target.checked)};return i("div",{className:"flex flex-col gap-3","data-testid":"lunora-migrations",children:[i("div",{className:"flex flex-wrap items-center gap-2",children:[r(U,{onChange:M,testId:"mg-shard-input",value:c}),r(H,{message:j,prefix:"mg"})]}),D!==null&&r(q,{error:A,testId:"mg-status-error"}),l!==null&&l.length===0&&r(Q,{description:e("Data migrations you run against this shard will be tracked here."),icon:r("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:r("path",{d:"M4 12a8 8 0 0 1 13.7-5.6L20 8M20 4v4h-4M20 12a8 8 0 0 1-13.7 5.6L4 16m0 4v-4h4"})}),testId:"mg-empty",title:e("No migrations have run on this shard.")}),l!==null&&l.length>0&&r(G,{className:"overflow-hidden py-0",children:r(J,{className:"px-0",children:i(X,{"data-testid":"mg-table",children:[r(Y,{children:i(k,{children:[r(n,{children:e("id")}),r(n,{children:e("direction")}),r(n,{children:e("status")}),r(n,{children:e("processed")}),r(n,{children:e("changed")}),r(n,{children:e("updated")}),r(n,{children:e("error")})]})}),r(Z,{children:l.map(t=>i(k,{"data-testid":`mg-row-${t.id}`,children:[r(o,{children:t.id}),r(o,{children:t.direction}),r(o,{children:r(W,{variant:"secondary",children:t.status})}),r(o,{children:t.processed}),r(o,{children:t.changed}),r(o,{children:ir(t.updatedAt)}),r(o,{children:t.error??""})]},t.id))})]})})}),i("div",{className:"flex flex-col gap-2 rounded-xl border border-border bg-card p-3 shadow-xs",children:[r($,{children:e("Run migration")}),i("div",{className:"flex flex-wrap items-center gap-2",children:[r(V,{"aria-label":e("Migration id"),className:"w-auto","data-testid":"mg-id-input",onChange:T,placeholder:e("migration id"),value:v}),i("select",{"aria-label":e("Direction"),className:"flex h-9 rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring","data-testid":"mg-direction",onChange:B,value:x,children:[r("option",{value:"up",children:e("up")}),r("option",{value:"down",children:e("down")})]}),i($,{className:"flex items-center gap-1.5",htmlFor:"mg-dry-run",children:[r("input",{checked:h,className:"size-4 accent-primary","data-testid":"mg-dry-run",id:"mg-dry-run",onChange:F,type:"checkbox"}),e("Dry run")]}),h?r(_,{"data-testid":"mg-run",disabled:m||!w,onClick:N,size:"sm",type:"button",children:e(m?"Running…":"Run")}):r(P,{confirmLabel:e(m?"Running…":"Run migration?"),disabled:m||!w,onConfirm:N,testId:"mg-run",children:e("Run")})]})]}),b!==null&&r("pre",{className:"text-sm text-destructive whitespace-pre-wrap","data-testid":"mg-run-error",role:"alert",children:b}),s!==null&&i("p",{className:"text-sm text-muted-foreground","data-testid":"mg-run-result",children:[s.dryRun?e("Dry run: "):"",e("{status} — processed",{status:s.status}),s.processed,e(", changed"),s.changed]})]})};export{Er as MigrationsPanel};
@@ -0,0 +1 @@
1
+ import{c as W}from"react/compiler-runtime";import{useState as T}from"react";import{E as B}from"../packem_shared/error-alert-B59DnrDI.js";import{g as _}from"../packem_shared/badge-BbuuAio7.js";import{u as z}from"../packem_shared/button-BkCrNcAs.js";import{c as K,u as O}from"../packem_shared/card-CIDGUN6K.js";import{E as U}from"../packem_shared/empty-state-Cg7t_8qu.js";import{u as q}from"../packem_shared/input-JHu63lTv.js";import{n as G,d as J,m as F,p as h,f as Q,u as f}from"../packem_shared/table-DdJBrClo.js";import{K as X}from"../packem_shared/use-admin-query-Di3fLE8H.js";import{useT as Y}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as Z}from"../packem_shared/ADMIN_FUNCTIONS-BYNSbBVE.js";import{i as ee}from"../packem_shared/internal-AtZ4bTal.js";import{jsx as t,jsxs as x}from"react/jsx-runtime";const te=e=>e==="ok"?"success":e==="failed"?"destructive":e==="expired"?"warning":"secondary",P=e=>e.endpoint??e.id,ve=()=>{const e=W(38),r=Y(),[i,R]=T("all"),[s,V]=T("");let g;e[0]===Symbol.for("react.memo_cache_sentinel")?(g={},e[0]=g):g=e[0];const{data:S,error:o,errorSource:p,isLoading:C,refetch:v}=X(Z.listPushSubscriptions,g);let N;if(e[1]!==S?.subscriptions||e[2]!==o||e[3]!==p||e[4]!==C||e[5]!==i||e[6]!==v||e[7]!==s||e[8]!==r){const A=S?.subscriptions??[],j=s.trim().toLowerCase(),E=A.filter(a=>i!=="all"&&a.kind!==i?!1:j===""?!0:`${P(a)} ${a.userId??""}`.toLowerCase().includes(j));let b;e[10]===Symbol.for("react.memo_cache_sentinel")?(b=a=>{V(a.target.value)},e[10]=b):b=e[10];const D=b;let w;e[11]!==v?(w=()=>{v()},e[11]=v,e[12]=w):w=e[12];const I=w;let y;e[13]===Symbol.for("react.memo_cache_sentinel")?(y=["all","web-push","fcm"],e[13]=y):y=e[13];const H=y;let l;e[14]!==i||e[15]!==r?(l=t("div",{className:"flex items-center gap-1","data-testid":"nt-kind-filter",role:"tablist",children:H.map(a=>t(z,{"aria-selected":i===a,"data-testid":`nt-kind-${a}`,onClick:()=>{R(a)},role:"tab",size:"sm",type:"button",variant:i===a?"secondary":"ghost",children:a==="all"?r("All"):a},a))}),e[14]=i,e[15]=r,e[16]=l):l=e[16];let n;e[17]!==r?(n=r("Filter devices"),e[17]=r,e[18]=n):n=e[18];let c;e[19]!==r?(c=r("filter endpoint, user"),e[19]=r,e[20]=c):c=e[20];let d;e[21]!==s||e[22]!==n||e[23]!==c?(d=t(q,{"aria-label":n,className:"h-8 w-56","data-testid":"nt-search",onChange:D,placeholder:c,value:s}),e[21]=s,e[22]=n,e[23]=c,e[24]=d):d=e[24];let m;e[25]!==r?(m=r("Refresh"),e[25]=r,e[26]=m):m=e[26];let u;e[27]!==I||e[28]!==m?(u=t(z,{className:"ml-auto","data-testid":"nt-refresh",onClick:I,size:"sm",type:"button",variant:"outline",children:m}),e[27]=I,e[28]=m,e[29]=u):u=e[29];const L=A.length>0&&t(_,{"data-testid":"nt-count",variant:"secondary",children:r("{count} devices",{count:A.length})});let $;e[30]!==u||e[31]!==L||e[32]!==l||e[33]!==d?($=x("div",{className:"flex flex-wrap items-center gap-2",children:[l,d,u,L]}),e[30]=u,e[31]=L,e[32]=l,e[33]=d,e[34]=$):$=e[34];let k;e[35]!==o||e[36]!==p?(k=o!==null&&t(B,{error:p,testId:"nt-error"}),e[35]=o,e[36]=p,e[37]=k):k=e[37],N=x("div",{className:"flex flex-col gap-4","data-testid":"lunora-notifications",children:[$,k,o===null&&!C&&E.length===0&&t(U,{description:r("Registered Web Push / FCM devices appear here. Configure lunora/notify.ts with defineNotify({ store }) and register a device with ctx.push.register(...)."),icon:t("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:t("path",{d:"M15 17h5l-1.4-1.4A2 2 0 0 1 18 14.2V11a6 6 0 0 0-4-5.7V5a2 2 0 1 0-4 0v.3A6 6 0 0 0 6 11v3.2a2 2 0 0 1-.6 1.4L4 17h5m6 0v1a3 3 0 1 1-6 0v-1m6 0H9"})}),testId:"nt-empty",title:r("No registered devices.")}),E.length>0&&t(K,{className:"overflow-hidden py-0",children:t(O,{className:"max-h-[30rem] overflow-auto px-0",children:x(G,{"data-testid":"nt-table",children:[t(J,{children:x(F,{children:[t(h,{children:r("kind")}),t(h,{children:r("endpoint")}),t(h,{children:r("user")}),t(h,{children:r("last seen")}),t(h,{children:r("status")}),t(h,{children:r("error")})]})}),t(Q,{children:E.map(a=>{const M=P(a);return x(F,{"data-testid":"nt-row",children:[t(f,{children:t(_,{variant:"outline",children:a.kind})}),t(f,{className:"max-w-[28ch] truncate font-mono text-xs",title:M,children:M}),t(f,{className:"max-w-[16ch] truncate font-mono text-xs",children:a.userId??t("span",{className:"text-muted-foreground",children:"—"})}),t(f,{className:"text-muted-foreground tabular-nums",children:ee(a.lastSeenAt,"—")}),t(f,{children:t(_,{"data-testid":`nt-status-${a.id}`,variant:te(a.lastStatus),children:a.lastStatus??r("n/a")})}),t(f,{className:"max-w-[28ch] truncate font-mono text-xs text-muted-foreground",title:a.lastError??void 0,children:a.lastError??t("span",{className:"text-muted-foreground",children:"—"})})]},a.id)})})]})})})]}),e[1]=S?.subscriptions,e[2]=o,e[3]=p,e[4]=C,e[5]=i,e[6]=v,e[7]=s,e[8]=r,e[9]=N}else N=e[9];return N};export{ve as NotificationsPanel};