@lunora/studio 1.0.0-alpha.349 → 1.0.0-alpha.350

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 (319) hide show
  1. package/README.md +3 -3
  2. package/dist/index.d.mts +9 -8
  3. package/dist/index.d.ts +9 -8
  4. package/dist/index.mjs +1 -1
  5. package/dist/mount.d.mts +3 -2
  6. package/dist/mount.d.ts +3 -2
  7. package/dist/mount.mjs +1 -1
  8. package/dist/packem_chunks/AdvisorHealthPanel.mjs +1 -1
  9. package/dist/packem_chunks/ApiTab.mjs +1 -1
  10. package/dist/packem_chunks/AuditPanel.mjs +1 -1
  11. package/dist/packem_chunks/DeploymentHealthPanel.mjs +1 -1
  12. package/dist/packem_chunks/ExportImportPanel.mjs +5 -5
  13. package/dist/packem_chunks/FileBrowser.mjs +3 -3
  14. package/dist/packem_chunks/FunctionRunner.mjs +1 -1
  15. package/dist/packem_chunks/FunctionStatsPanel.mjs +1 -1
  16. package/dist/packem_chunks/HealthPanel.mjs +1 -1
  17. package/dist/packem_chunks/InsightsPanel.mjs +1 -1
  18. package/dist/packem_chunks/LogsPanel.mjs +1 -1
  19. package/dist/packem_chunks/MailPanel.mjs +1 -1
  20. package/dist/packem_chunks/MetricsPanel.mjs +1 -1
  21. package/dist/packem_chunks/NotificationsPanel.mjs +1 -1
  22. package/dist/packem_chunks/PitrPanel.mjs +1 -1
  23. package/dist/packem_chunks/SchemaViewer.mjs +1 -1
  24. package/dist/packem_chunks/SecurityAdvisorPanel.mjs +1 -1
  25. package/dist/packem_chunks/SettingsPanel.mjs +1 -1
  26. package/dist/packem_chunks/SqlEditorPanel.mjs +7 -7
  27. package/dist/packem_chunks/TableEditor.mjs +1 -1
  28. package/dist/packem_chunks/agents-panel.mjs +1 -1
  29. package/dist/packem_chunks/ai-usage-panel.mjs +1 -1
  30. package/dist/packem_chunks/analytics-panel.mjs +1 -1
  31. package/dist/packem_chunks/architecture-panel.mjs +1 -1
  32. package/dist/packem_chunks/auth-audit-panel.mjs +1 -1
  33. package/dist/packem_chunks/auth-config-panel.mjs +1 -1
  34. package/dist/packem_chunks/auth-sessions-panel.mjs +1 -1
  35. package/dist/packem_chunks/containers-panel.mjs +1 -1
  36. package/dist/packem_chunks/dashboards-panel.mjs +1 -1
  37. package/dist/packem_chunks/evals-panel.mjs +1 -1
  38. package/dist/packem_chunks/fanout-panel.mjs +1 -1
  39. package/dist/packem_chunks/flags-panel.mjs +1 -1
  40. package/dist/packem_chunks/issues-panel.mjs +1 -1
  41. package/dist/packem_chunks/kv-browser.mjs +1 -1
  42. package/dist/packem_chunks/log-drains-panel.mjs +1 -1
  43. package/dist/packem_chunks/migrations-route.mjs +1 -1
  44. package/dist/packem_chunks/organizations-panel.mjs +1 -1
  45. package/dist/packem_chunks/payments-panel.mjs +1 -1
  46. package/dist/packem_chunks/permissions-panel.mjs +1 -1
  47. package/dist/packem_chunks/privacy-requests-panel.mjs +1 -1
  48. package/dist/packem_chunks/queues-panel.mjs +1 -1
  49. package/dist/packem_chunks/reactors-panel.mjs +1 -1
  50. package/dist/packem_chunks/rls-panel.mjs +1 -1
  51. package/dist/packem_chunks/schedule-panel.mjs +1 -1
  52. package/dist/packem_chunks/storage-rules-panel.mjs +1 -1
  53. package/dist/packem_chunks/subscriptions-panel.mjs +1 -1
  54. package/dist/packem_chunks/sync-client-panel.mjs +1 -1
  55. package/dist/packem_chunks/theme-indicator.mjs +1 -0
  56. package/dist/packem_chunks/traces-panel.mjs +1 -1
  57. package/dist/packem_chunks/users-panel.mjs +1 -1
  58. package/dist/packem_chunks/vector-browser.mjs +1 -1
  59. package/dist/packem_chunks/workflows-panel.mjs +1 -1
  60. package/dist/packem_shared/{ApiDocsPanel-Py7C4ibM.mjs → ApiDocsPanel-B_RaW7Br.mjs} +2 -2
  61. package/dist/packem_shared/ApiReferencePanel-u9Rrljdf.mjs +1 -0
  62. package/dist/packem_shared/{CommandPalette-CM1hqAOD.mjs → CommandPalette-5OsK8PNe.mjs} +1 -1
  63. package/dist/packem_shared/{ConfirmButton-DU4p72Er.mjs → ConfirmButton-CIXYF6Mg.mjs} +1 -1
  64. package/dist/packem_shared/{ConnectionBadge-B8Hj5DaE.mjs → ConnectionBadge-BfcoN-VE.mjs} +1 -1
  65. package/dist/packem_shared/DEFAULT_AUTO_REFRESH_MS-CG7Q45ZS.mjs +1 -0
  66. package/dist/packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs +1 -0
  67. package/dist/packem_shared/{DataBrowser-DFjQeYYF.mjs → DataBrowser-Cc1qZX-4.mjs} +1 -1
  68. package/dist/packem_shared/{DataFilters-faurWYyX.mjs → DataFilters--ocFTVT2.mjs} +1 -1
  69. package/dist/packem_shared/GlobalDataBrowser-Hq6gTlkb.mjs +1 -0
  70. package/dist/packem_shared/{HomePanel-C8sb1fFJ.mjs → HomePanel-DeyYLVxc.mjs} +1 -1
  71. package/dist/packem_shared/MigrationsPanel-CMZYYcQ5.mjs +1 -0
  72. package/dist/packem_shared/OpenRpcReferencePanel-E9cDfHRv.mjs +1 -0
  73. package/dist/packem_shared/ScheduledJobs-D4CUj7aX.mjs +1 -0
  74. package/dist/packem_shared/{ShardInput-C6mjgAh4.mjs → ShardInput-CoySruKZ.mjs} +1 -1
  75. package/dist/packem_shared/Studio-BhTqTeGb.mjs +1 -0
  76. package/dist/packem_shared/StudioApp-B1d0beD4.mjs +1 -0
  77. package/dist/packem_shared/{StudioI18nProvider-fVsCSs5L.mjs → StudioI18nProvider-CGXCPnQn.mjs} +1 -1
  78. package/dist/packem_shared/{advisor-view-B8oIluyS.mjs → advisor-view-fNcNYW2Q.mjs} +1 -1
  79. package/dist/packem_shared/{app.d-D45VvUTx.d.mts → app.d-D425h1XO.d.mts} +4 -3
  80. package/dist/packem_shared/{app.d-D45VvUTx.d.ts → app.d-D425h1XO.d.ts} +4 -3
  81. package/dist/packem_shared/{auth-pager-DiDnXsfe.mjs → auth-pager-DW77WeZw.mjs} +1 -1
  82. package/dist/packem_shared/{data-grid-BHTuvSI7.mjs → data-grid-r3isM8Nq.mjs} +1 -1
  83. package/dist/packem_shared/{diagram-export-panel-BMLzao0Y.mjs → diagram-export-panel-aBDQdX4e.mjs} +1 -1
  84. package/dist/packem_shared/{error-alert-CNQjdAhi.mjs → error-alert-54TiaMvZ.mjs} +1 -1
  85. package/dist/packem_shared/{grid-features-8DoaKdS1.mjs → grid-features-2c5SaBtH.mjs} +1 -1
  86. package/dist/packem_shared/{grid-pagination-DgzyzfBh.mjs → grid-pagination-DY2erU65.mjs} +1 -1
  87. package/dist/packem_shared/home-panel-0XMGe1hP.mjs +3 -0
  88. package/dist/packem_shared/{live-status-BuJdUZFU.mjs → live-status-D1GasNsH.mjs} +1 -1
  89. package/dist/packem_shared/{recording-client-neIRrUNz.mjs → recording-client-MbGZ28I0.mjs} +1 -1
  90. package/dist/packem_shared/{reference-view-BrsL8UGn.mjs → reference-view-DCEC5kjY.mjs} +4 -4
  91. package/dist/packem_shared/{schema-diagram-ghsOCED7.mjs → schema-diagram-k7cFl7Wp.mjs} +1 -1
  92. package/dist/packem_shared/{sql-result-table-COsfUSGc.mjs → sql-result-table-CatgdmMh.mjs} +1 -1
  93. package/dist/packem_shared/studio-CA3ZKwVK.mjs +2 -0
  94. package/dist/packem_shared/{table-list-sidebar-B7IOSxLN.mjs → table-list-sidebar-nA7g7uSk.mjs} +1 -1
  95. package/dist/packem_shared/use-admin-query-BW9IuacC.mjs +1 -0
  96. package/dist/packem_shared/use-auth-config-KO9tnI39.mjs +1 -0
  97. package/dist/packem_shared/use-sql-assistant-DXnqbBs-.mjs +1 -0
  98. package/dist/packem_shared/use-studio-client-DCA50tF2.mjs +1 -0
  99. package/dist/standalone/chunk-26OKWFLO.js +1 -0
  100. package/dist/standalone/chunk-2EL4EMYZ.js +1 -0
  101. package/dist/standalone/chunk-2O6KKVH2.js +1 -0
  102. package/dist/standalone/{chunk-WX647YQ7.js → chunk-2WNL74MI.js} +3 -3
  103. package/dist/standalone/chunk-2X6O33OX.js +1 -0
  104. package/dist/standalone/chunk-2ZO7XY3Z.js +1 -0
  105. package/dist/standalone/{chunk-Y3AYVFTK.js → chunk-3GXPALXG.js} +1 -1
  106. package/dist/standalone/chunk-3Y5K3IQO.js +1 -0
  107. package/dist/standalone/{chunk-BOMPSVRC.js → chunk-4C4THJUD.js} +1 -1
  108. package/dist/standalone/{chunk-WVWCUB4S.js → chunk-4IEMXFUB.js} +1 -1
  109. package/dist/standalone/{chunk-5B2RTXBS.js → chunk-4SQBAPY6.js} +1 -1
  110. package/dist/standalone/{chunk-R6U22RSY.js → chunk-5DNGK3NT.js} +1 -1
  111. package/dist/standalone/{chunk-WOEHFC4J.js → chunk-5J32EGHF.js} +1 -1
  112. package/dist/standalone/chunk-5NZWQEEJ.js +1 -0
  113. package/dist/standalone/chunk-6I42AM75.js +1 -0
  114. package/dist/standalone/{chunk-RGMVGZV4.js → chunk-6M7FLLMT.js} +1 -1
  115. package/dist/standalone/{chunk-IWZ7GVQO.js → chunk-6QEXGYWH.js} +1 -1
  116. package/dist/standalone/chunk-7AZYREIY.js +1 -0
  117. package/dist/standalone/{chunk-G43F7LYA.js → chunk-7F3S5OQT.js} +1 -1
  118. package/dist/standalone/chunk-7MN724WR.js +1 -0
  119. package/dist/standalone/{chunk-Q6IT6ZD7.js → chunk-7RGYCU6F.js} +1 -1
  120. package/dist/standalone/{chunk-NRP22GKC.js → chunk-A566HCBX.js} +1 -1
  121. package/dist/standalone/{chunk-253UHWDX.js → chunk-AOHKAKKL.js} +1 -1
  122. package/dist/standalone/{chunk-OYCUPD3Q.js → chunk-AP4PC2M4.js} +1 -1
  123. package/dist/standalone/chunk-B3AXFXAD.js +1 -0
  124. package/dist/standalone/chunk-B7MHW3A5.js +1 -0
  125. package/dist/standalone/{chunk-CWPBPBWJ.js → chunk-BHOLL76W.js} +6 -6
  126. package/dist/standalone/{chunk-I57ZVLUB.js → chunk-BTRYFPZH.js} +1 -1
  127. package/dist/standalone/chunk-BVKQA5OL.js +1 -0
  128. package/dist/standalone/chunk-CGZVMM3P.js +1 -0
  129. package/dist/standalone/chunk-CIVMATZK.js +3 -0
  130. package/dist/standalone/chunk-CLINNLLE.js +1 -0
  131. package/dist/standalone/chunk-CTE6RPXC.js +1 -0
  132. package/dist/standalone/chunk-CW57Q264.js +1 -0
  133. package/dist/standalone/chunk-D7JK65OK.js +1 -0
  134. package/dist/standalone/{chunk-FUYEZFBP.js → chunk-DBVJ5VLI.js} +1 -1
  135. package/dist/standalone/{chunk-XCYFP44W.js → chunk-DS7HZKZ2.js} +1 -1
  136. package/dist/standalone/{chunk-2WDKJ74A.js → chunk-DX55P3KZ.js} +1 -1
  137. package/dist/standalone/{chunk-55UGUCQ6.js → chunk-E26OT26O.js} +1 -1
  138. package/dist/standalone/{chunk-YUPEDAX3.js → chunk-E32FS6PE.js} +2 -2
  139. package/dist/standalone/chunk-E3VSRIQU.js +1 -0
  140. package/dist/standalone/chunk-EDGOSJXL.js +1 -0
  141. package/dist/standalone/chunk-EOR73TZZ.js +1 -0
  142. package/dist/standalone/chunk-F5LTDUMB.js +1 -0
  143. package/dist/standalone/chunk-FLVDICZL.js +1 -0
  144. package/dist/standalone/{chunk-5J4FLDJH.js → chunk-FPIUVV7Q.js} +1 -1
  145. package/dist/standalone/chunk-GMW2DYFU.js +1 -0
  146. package/dist/standalone/{chunk-VFFW3ANI.js → chunk-GPOSJNMV.js} +5 -5
  147. package/dist/standalone/chunk-GQYA5W5T.js +1 -0
  148. package/dist/standalone/chunk-HFYFYNSX.js +1 -0
  149. package/dist/standalone/chunk-HKLF627N.js +1 -0
  150. package/dist/standalone/{chunk-PSMQQV6S.js → chunk-HKPDPKXD.js} +1 -1
  151. package/dist/standalone/chunk-HLAAOW33.js +1 -0
  152. package/dist/standalone/{chunk-75M6ZLLS.js → chunk-HOPAJ5F6.js} +2 -2
  153. package/dist/standalone/{chunk-7Y3SY37W.js → chunk-IBJVVHV5.js} +1 -1
  154. package/dist/standalone/{chunk-VESGIGMQ.js → chunk-IH2CJZF2.js} +1 -1
  155. package/dist/standalone/chunk-JAHK7RRJ.js +1 -0
  156. package/dist/standalone/chunk-JG2C7SS2.js +1 -0
  157. package/dist/standalone/chunk-JGMQQ3S7.js +1 -0
  158. package/dist/standalone/{chunk-3YXASVTP.js → chunk-JTGGWF7R.js} +1 -1
  159. package/dist/standalone/chunk-KFNDET5D.js +1 -0
  160. package/dist/standalone/{chunk-NXQW5E6W.js → chunk-KRPXOSBL.js} +1 -1
  161. package/dist/standalone/{chunk-7Q256NLI.js → chunk-KYONGQQ4.js} +1 -1
  162. package/dist/standalone/{chunk-OPM7ESDV.js → chunk-LIGOLZND.js} +1 -1
  163. package/dist/standalone/{chunk-VQRCJJXS.js → chunk-LKCO3E2B.js} +1 -1
  164. package/dist/standalone/chunk-LOV52GLG.js +1 -0
  165. package/dist/standalone/chunk-LPINY2IJ.js +19 -0
  166. package/dist/standalone/{chunk-XKISL2CG.js → chunk-LRXCL6IA.js} +1 -1
  167. package/dist/standalone/{chunk-OQ6I6OXT.js → chunk-LUHXNZI4.js} +1 -1
  168. package/dist/standalone/chunk-MD67S53Z.js +1 -0
  169. package/dist/standalone/{chunk-HIJGQX6F.js → chunk-MDAXV2XH.js} +1 -1
  170. package/dist/standalone/{chunk-ZN7TURF4.js → chunk-MFNO5BFR.js} +1 -1
  171. package/dist/standalone/chunk-MMJTKSHL.js +1 -0
  172. package/dist/standalone/chunk-NMVFSJM7.js +1 -0
  173. package/dist/standalone/chunk-NVHHB5EV.js +2 -0
  174. package/dist/standalone/chunk-O3FDK56W.js +1 -0
  175. package/dist/standalone/{chunk-C7FJ2JKY.js → chunk-OECMBE6Q.js} +1 -1
  176. package/dist/standalone/chunk-OSJ7HV7B.js +1 -0
  177. package/dist/standalone/chunk-OUFWXYEF.js +1 -0
  178. package/dist/standalone/chunk-OXFKZ4BM.js +1 -0
  179. package/dist/standalone/{chunk-63QLK2KW.js → chunk-P5GAJKDW.js} +1 -1
  180. package/dist/standalone/chunk-P6L6ABWO.js +1 -0
  181. package/dist/standalone/chunk-PZZWUL5U.js +1 -0
  182. package/dist/standalone/chunk-QAQVT4FS.js +1 -0
  183. package/dist/standalone/{chunk-VCFEO3RI.js → chunk-R36QXQZX.js} +1 -1
  184. package/dist/standalone/chunk-R3KLR5EP.js +1 -0
  185. package/dist/standalone/chunk-RXVXXRYD.js +1 -0
  186. package/dist/standalone/chunk-S7XAAH7U.js +1 -0
  187. package/dist/standalone/{chunk-E4PXACVL.js → chunk-SDQH4HR6.js} +1 -1
  188. package/dist/standalone/chunk-SFY646MC.js +1 -0
  189. package/dist/standalone/{chunk-VDC6JP4A.js → chunk-SJLEEYCR.js} +1 -1
  190. package/dist/standalone/{chunk-ZKJS6EBE.js → chunk-SLIDAWNX.js} +1 -1
  191. package/dist/standalone/chunk-SOO2HXV6.js +1 -0
  192. package/dist/standalone/chunk-SXD6JQXF.js +1 -0
  193. package/dist/standalone/{chunk-AUGKHAMQ.js → chunk-SYGCASPT.js} +1 -1
  194. package/dist/standalone/{chunk-2I4NHEKA.js → chunk-TDVDZ7XQ.js} +1 -1
  195. package/dist/standalone/chunk-TRZTGE4R.js +1 -0
  196. package/dist/standalone/chunk-TWMS2TMF.js +1 -0
  197. package/dist/standalone/chunk-U76DVXTR.js +21 -0
  198. package/dist/standalone/chunk-UTX6IBA3.js +1 -0
  199. package/dist/standalone/chunk-UZIBQZ2F.js +1 -0
  200. package/dist/standalone/chunk-VB6YJKPA.js +1 -0
  201. package/dist/standalone/{chunk-CVXNHIQW.js → chunk-VEWQWS3J.js} +1 -1
  202. package/dist/standalone/{chunk-UC7MNI2F.js → chunk-W2BCSK5S.js} +1 -1
  203. package/dist/standalone/chunk-W2XSKODB.js +1 -0
  204. package/dist/standalone/{chunk-MVWZMWPD.js → chunk-W7MRISE3.js} +1 -1
  205. package/dist/standalone/chunk-W7Z35E2E.js +1 -0
  206. package/dist/standalone/chunk-WIET27J3.js +1 -0
  207. package/dist/standalone/chunk-WQGT24W6.js +1 -0
  208. package/dist/standalone/{chunk-GZEWLX7U.js → chunk-WS36BO4R.js} +1 -1
  209. package/dist/standalone/chunk-WZTY3ZYI.js +1 -0
  210. package/dist/standalone/chunk-X5KWBDTF.js +1 -0
  211. package/dist/standalone/chunk-X74GEPSG.js +1 -0
  212. package/dist/standalone/chunk-XBZUJDHD.js +1 -0
  213. package/dist/standalone/chunk-XMEVNOCA.js +1 -0
  214. package/dist/standalone/chunk-XWEDIIIT.js +1 -0
  215. package/dist/standalone/{chunk-GHQ2VDI2.js → chunk-XYR5NST4.js} +1 -1
  216. package/dist/standalone/{chunk-XGCIDUJF.js → chunk-YHTHRYP5.js} +1 -1
  217. package/dist/standalone/{chunk-RX755NMO.js → chunk-YJ2WHOGO.js} +1 -1
  218. package/dist/standalone/chunk-YJWR6ZWC.js +1 -0
  219. package/dist/standalone/{chunk-CGQMJYCW.js → chunk-Z5EV64KS.js} +1 -1
  220. package/dist/standalone/{chunk-LVIL2SFA.js → chunk-ZBFWT34B.js} +1 -1
  221. package/dist/standalone/{chunk-AUAECCXB.js → chunk-ZBON5T5A.js} +1 -1
  222. package/dist/standalone/chunk-ZGSL4DPP.js +1 -0
  223. package/dist/standalone/chunk-ZMQ6PKLN.js +1 -0
  224. package/dist/standalone/{chunk-SJQERRSZ.js → chunk-ZTOREMGH.js} +1 -1
  225. package/dist/standalone/chunk-ZTOXQK4V.js +1 -0
  226. package/dist/standalone/chunk-ZWDORIZY.js +1 -0
  227. package/dist/standalone/chunk-ZZAJHNZ6.js +1 -0
  228. package/dist/standalone/studio.js +1 -1
  229. package/package.json +5 -5
  230. package/dist/packem_chunks/sparkline.mjs +0 -1
  231. package/dist/packem_shared/ApiReferencePanel-DlYVADAy.mjs +0 -1
  232. package/dist/packem_shared/DEFAULT_AUTO_REFRESH_MS-DvhNw0BI.mjs +0 -1
  233. package/dist/packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs +0 -1
  234. package/dist/packem_shared/GlobalDataBrowser-CPfjubP_.mjs +0 -1
  235. package/dist/packem_shared/MigrationsPanel-Dzjf42y8.mjs +0 -1
  236. package/dist/packem_shared/OpenRpcReferencePanel-nYyfjjse.mjs +0 -1
  237. package/dist/packem_shared/ScheduledJobs-BJ1uZW1U.mjs +0 -1
  238. package/dist/packem_shared/Studio-CgqntIfx.mjs +0 -1
  239. package/dist/packem_shared/StudioApp-DfFjQPGJ.mjs +0 -1
  240. package/dist/packem_shared/home-panel-BJXZsAaD.mjs +0 -3
  241. package/dist/packem_shared/studio-CFSjGWyw.mjs +0 -2
  242. package/dist/packem_shared/use-admin-query-CLStXJ7v.mjs +0 -1
  243. package/dist/packem_shared/use-auth-config-DtZeS_qf.mjs +0 -1
  244. package/dist/packem_shared/use-sql-assistant-DxNeNdCs.mjs +0 -1
  245. package/dist/standalone/chunk-2IKDEUCX.js +0 -1
  246. package/dist/standalone/chunk-37WYCOQ2.js +0 -1
  247. package/dist/standalone/chunk-4H5PBJNF.js +0 -1
  248. package/dist/standalone/chunk-4UBF7HMZ.js +0 -1
  249. package/dist/standalone/chunk-533J6WYA.js +0 -1
  250. package/dist/standalone/chunk-5QR2SQIS.js +0 -1
  251. package/dist/standalone/chunk-5ZNIQENA.js +0 -1
  252. package/dist/standalone/chunk-63Z6OJ6G.js +0 -1
  253. package/dist/standalone/chunk-74IYYDDI.js +0 -19
  254. package/dist/standalone/chunk-7EHAUFJY.js +0 -2
  255. package/dist/standalone/chunk-7G4Z6Q7X.js +0 -1
  256. package/dist/standalone/chunk-7RKB5KS7.js +0 -1
  257. package/dist/standalone/chunk-7TN6VTTF.js +0 -1
  258. package/dist/standalone/chunk-AWWECTQT.js +0 -1
  259. package/dist/standalone/chunk-AXL4YZJR.js +0 -1
  260. package/dist/standalone/chunk-COK5BCWN.js +0 -1
  261. package/dist/standalone/chunk-CULVXE3K.js +0 -1
  262. package/dist/standalone/chunk-E4BAGQ53.js +0 -1
  263. package/dist/standalone/chunk-EBTYSPZB.js +0 -1
  264. package/dist/standalone/chunk-EC5PMSQ6.js +0 -1
  265. package/dist/standalone/chunk-ECY2JC5F.js +0 -1
  266. package/dist/standalone/chunk-EWMBX5N2.js +0 -1
  267. package/dist/standalone/chunk-FPI7AMQJ.js +0 -1
  268. package/dist/standalone/chunk-GC5UHRDR.js +0 -1
  269. package/dist/standalone/chunk-GRHO2IUN.js +0 -1
  270. package/dist/standalone/chunk-GUDC24NJ.js +0 -1
  271. package/dist/standalone/chunk-H467GBSD.js +0 -1
  272. package/dist/standalone/chunk-HBO4SMAO.js +0 -15
  273. package/dist/standalone/chunk-HBTGWHTW.js +0 -1
  274. package/dist/standalone/chunk-HCTJKP5J.js +0 -1
  275. package/dist/standalone/chunk-HZTJLEIJ.js +0 -1
  276. package/dist/standalone/chunk-I26MS5PJ.js +0 -1
  277. package/dist/standalone/chunk-IRKWOUXO.js +0 -1
  278. package/dist/standalone/chunk-IUSKFS3B.js +0 -1
  279. package/dist/standalone/chunk-K2EHRNYW.js +0 -1
  280. package/dist/standalone/chunk-L5MI4PTP.js +0 -1
  281. package/dist/standalone/chunk-LXCVA5SP.js +0 -1
  282. package/dist/standalone/chunk-LYQZERWS.js +0 -1
  283. package/dist/standalone/chunk-MPEIBWCJ.js +0 -1
  284. package/dist/standalone/chunk-NCFYQR4L.js +0 -1
  285. package/dist/standalone/chunk-NCPW7WHO.js +0 -1
  286. package/dist/standalone/chunk-NOS2OC45.js +0 -1
  287. package/dist/standalone/chunk-NQZALRU3.js +0 -1
  288. package/dist/standalone/chunk-OQ2ORNN6.js +0 -1
  289. package/dist/standalone/chunk-OVBYLXPD.js +0 -1
  290. package/dist/standalone/chunk-OWQHP4KI.js +0 -1
  291. package/dist/standalone/chunk-PKSRXFSZ.js +0 -1
  292. package/dist/standalone/chunk-Q6ED4KUL.js +0 -1
  293. package/dist/standalone/chunk-QAQDMS6R.js +0 -1
  294. package/dist/standalone/chunk-QC2GLF3I.js +0 -1
  295. package/dist/standalone/chunk-QFK4UI4Q.js +0 -1
  296. package/dist/standalone/chunk-QJ4AALXU.js +0 -1
  297. package/dist/standalone/chunk-QJLHH3ET.js +0 -1
  298. package/dist/standalone/chunk-R3RBUT32.js +0 -1
  299. package/dist/standalone/chunk-RNYOBPQA.js +0 -1
  300. package/dist/standalone/chunk-RWVIV3U7.js +0 -1
  301. package/dist/standalone/chunk-RYBLB23Z.js +0 -1
  302. package/dist/standalone/chunk-S3EWTSAN.js +0 -1
  303. package/dist/standalone/chunk-S4AR74DJ.js +0 -3
  304. package/dist/standalone/chunk-S4Z7K55A.js +0 -1
  305. package/dist/standalone/chunk-SA2OGF3F.js +0 -1
  306. package/dist/standalone/chunk-SFMIR4YV.js +0 -1
  307. package/dist/standalone/chunk-SROQCZ3P.js +0 -1
  308. package/dist/standalone/chunk-T4SIZOJG.js +0 -1
  309. package/dist/standalone/chunk-U37BPX5J.js +0 -1
  310. package/dist/standalone/chunk-UFZVSXRW.js +0 -1
  311. package/dist/standalone/chunk-UQWGBWQ3.js +0 -1
  312. package/dist/standalone/chunk-V6LPISRQ.js +0 -1
  313. package/dist/standalone/chunk-WEPM5G3R.js +0 -1
  314. package/dist/standalone/chunk-WGBAHXMK.js +0 -1
  315. package/dist/standalone/chunk-WGUN4FNJ.js +0 -1
  316. package/dist/standalone/chunk-WJRYEML4.js +0 -1
  317. package/dist/standalone/chunk-WNMY5ZKL.js +0 -1
  318. package/dist/standalone/chunk-YBDF3DET.js +0 -7
  319. package/dist/standalone/chunk-YJI56OCF.js +0 -1
package/README.md CHANGED
@@ -63,14 +63,14 @@ const root = mountStudio({ baseUrl: "https://my-app.workers.dev" });
63
63
  // root.unmount() to tear it down
64
64
  ```
65
65
 
66
- `mountStudio` constructs a `LunoraClient`, manages the admin token, and renders the whole console. To embed in your own React tree, render `<StudioApp>` (same self-contained shell) or compose `<Studio>` and the individual panels under a `<LunoraProvider>`:
66
+ `mountStudio` constructs a `LunoraAdminClient`, manages the admin token, and renders the whole console. To embed in your own React tree, render `<StudioApp>` (same self-contained shell) or compose `<Studio>` and the individual panels under a `<LunoraProvider>`. `<Studio>` and every panel need a `LunoraAdminClient` (from `@lunora/client/admin`) in that provider; a plain `LunoraClient` has no admin methods, and they refuse it:
67
67
 
68
68
  ```tsx
69
- import { LunoraClient } from "@lunora/client";
69
+ import { LunoraAdminClient } from "@lunora/client/admin";
70
70
  import { LunoraProvider } from "@lunora/react";
71
71
  import { Studio } from "@lunora/studio";
72
72
 
73
- const client = new LunoraClient({ url: "https://my-app.workers.dev" });
73
+ const client = new LunoraAdminClient({ url: "https://my-app.workers.dev" });
74
74
 
75
75
  // `functions` populate the runner + API tabs; `kind` is a compile-time
76
76
  // phantom, so it must be named here.
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
- import { F as FunctionDescriptor } from "./packem_shared/app.d-D45VvUTx.mjs";
2
- export { type a as FunctionKind, type P as PrivacyRequestRow, type b as PrivacyRequestsSource, type R as RunStatus, c as ScheduledJobs, type d as ScheduledJobsProps, e as Studio, f as StudioApp, type S as StudioAppProps, type g as StudioProps } from "./packem_shared/app.d-D45VvUTx.mjs";
1
+ import { F as FunctionDescriptor } from "./packem_shared/app.d-D425h1XO.mjs";
2
+ export { type a as FunctionKind, type P as PrivacyRequestRow, type b as PrivacyRequestsSource, type R as RunStatus, c as ScheduledJobs, type d as ScheduledJobsProps, e as Studio, f as StudioApp, type S as StudioAppProps, type g as StudioProps } from "./packem_shared/app.d-D425h1XO.mjs";
3
3
  import { ReactElement, ReactNode, ErrorInfo, Component, ChangeEvent } from 'react';
4
4
  import { CapturedMail } from '@lunora/mail';
5
5
  export type {
@@ -20,6 +20,7 @@ CapturedMail } from '@lunora/mail';
20
20
  import { HealthBody } from '@lunora/runtime';
21
21
  import { Messages, I18n } from '@lingui/core';
22
22
  export type { LunoraClient, ScheduleRecord, StorageObject } from '@lunora/client';
23
+ export type { LunoraAdminClient } from '@lunora/client/admin';
23
24
  import '@lunora/bindings/analytics-sql';
24
25
  /**
25
26
  * The studio's navigation taxonomy: which pages exist and which domain each one
@@ -900,7 +901,7 @@ interface DataBrowserProps {
900
901
  * tables (via the `__lunora_admin__:listTables` RPC), then pages through the
901
902
  * rows of whichever table is selected (`__lunora_admin__:readTablePage`).
902
903
  *
903
- * Both calls travel over the ordinary `useLunora` client transport; the
904
+ * Both calls travel over the `LunoraAdminClient` from `useStudioClient`; the
904
905
  * admin RPCs are intercepted inside the Durable Object and are gated by the
905
906
  * server's `LUNORA_ADMIN_TOKEN`. The host is responsible for configuring the
906
907
  * client's auth token — this component issues no credentials of its own.
@@ -1114,7 +1115,7 @@ interface ExportImportPanelProps {
1114
1115
  * per-row errors. Globally-scoped (`.global()`) tables live in D1 and are
1115
1116
  * intentionally out of scope here.
1116
1117
  *
1117
- * Both calls travel over the {@link useLunora} client transport and are gated by
1118
+ * Both calls travel over the {@link useStudioClient} client transport and are gated by
1118
1119
  * the server's `LUNORA_ADMIN_TOKEN`.
1119
1120
  */
1120
1121
  declare const ExportImportPanel: ({ initialShardKey }: ExportImportPanelProps) => ReactElement;
@@ -1128,7 +1129,7 @@ interface MigrationsPanelProps {
1128
1129
  * Reads the persisted run-state via the `__lunora_admin__:migrationStatus` RPC
1129
1130
  * and lets an operator kick off a migration by id (`__lunora_admin__:runMigration`)
1130
1131
  * with a direction and a dry-run toggle. Both calls
1131
- * travel over the ordinary {@link useLunora} client transport and are gated by
1132
+ * travel over the ordinary {@link useStudioClient} client transport and are gated by
1132
1133
  * the server's `LUNORA_ADMIN_TOKEN` — this component issues no credentials of
1133
1134
  * its own.
1134
1135
  */
@@ -1145,7 +1146,7 @@ interface PitrPanelProps {
1145
1146
  * time, and (behind a confirm step) restores the shard to a time or an explicit
1146
1147
  * bookmark via the `__lunora_admin__:pitrRestore` RPC, surfacing the returned
1147
1148
  * undo bookmark so the restore can be reversed. All ops run over the
1148
- * {@link useLunora} client and are gated by the server's `LUNORA_ADMIN_TOKEN`.
1149
+ * {@link useStudioClient} client and are gated by the server's `LUNORA_ADMIN_TOKEN`.
1149
1150
  *
1150
1151
  * In-place recovery covers the last 30 days; for older or off-platform recovery
1151
1152
  * use the snapshot tier (`lunora backup` / the backup registry item).
@@ -1173,7 +1174,7 @@ interface FunctionRunnerProps {
1173
1174
  /**
1174
1175
  * Interactive runner for the registered functions: pick one, edit its JSON
1175
1176
  * arguments, optionally target a shard, then invoke it against the live
1176
- * {@link useLunora} client and inspect the result or error.
1177
+ * {@link useStudioClient} client and inspect the result or error.
1177
1178
  *
1178
1179
  * By default the function list is auto-discovered from the worker's
1179
1180
  * `/_lunora/admin/functions` endpoint; pass an explicit `functions` array to
@@ -1455,7 +1456,7 @@ interface MetricsPanelProps {
1455
1456
  * Health snapshot for a single shard: request / error counts (since the DO last
1456
1457
  * woke), its live SQLite size, and reactive-cache hit/miss stats when a cache is
1457
1458
  * configured. Reads via the `__lunora_admin__:getMetrics` RPC over the
1458
- * {@link useLunora} client; gated by the server's `LUNORA_ADMIN_TOKEN`.
1459
+ * {@link useStudioClient} client; gated by the server's `LUNORA_ADMIN_TOKEN`.
1459
1460
  *
1460
1461
  * Counters are per-DO-instance and reset on hibernation/restart — this is a
1461
1462
  * "since this instance woke" readout, not a durable time series.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { F as FunctionDescriptor } from "./packem_shared/app.d-D45VvUTx.js";
2
- export { type a as FunctionKind, type P as PrivacyRequestRow, type b as PrivacyRequestsSource, type R as RunStatus, c as ScheduledJobs, type d as ScheduledJobsProps, e as Studio, f as StudioApp, type S as StudioAppProps, type g as StudioProps } from "./packem_shared/app.d-D45VvUTx.js";
1
+ import { F as FunctionDescriptor } from "./packem_shared/app.d-D425h1XO.js";
2
+ export { type a as FunctionKind, type P as PrivacyRequestRow, type b as PrivacyRequestsSource, type R as RunStatus, c as ScheduledJobs, type d as ScheduledJobsProps, e as Studio, f as StudioApp, type S as StudioAppProps, type g as StudioProps } from "./packem_shared/app.d-D425h1XO.js";
3
3
  import { ReactElement, ReactNode, ErrorInfo, Component, ChangeEvent } from 'react';
4
4
  import { CapturedMail } from '@lunora/mail';
5
5
  export type {
@@ -20,6 +20,7 @@ CapturedMail } from '@lunora/mail';
20
20
  import { HealthBody } from '@lunora/runtime';
21
21
  import { Messages, I18n } from '@lingui/core';
22
22
  export type { LunoraClient, ScheduleRecord, StorageObject } from '@lunora/client';
23
+ export type { LunoraAdminClient } from '@lunora/client/admin';
23
24
  import '@lunora/bindings/analytics-sql';
24
25
  /**
25
26
  * The studio's navigation taxonomy: which pages exist and which domain each one
@@ -900,7 +901,7 @@ interface DataBrowserProps {
900
901
  * tables (via the `__lunora_admin__:listTables` RPC), then pages through the
901
902
  * rows of whichever table is selected (`__lunora_admin__:readTablePage`).
902
903
  *
903
- * Both calls travel over the ordinary `useLunora` client transport; the
904
+ * Both calls travel over the `LunoraAdminClient` from `useStudioClient`; the
904
905
  * admin RPCs are intercepted inside the Durable Object and are gated by the
905
906
  * server's `LUNORA_ADMIN_TOKEN`. The host is responsible for configuring the
906
907
  * client's auth token — this component issues no credentials of its own.
@@ -1114,7 +1115,7 @@ interface ExportImportPanelProps {
1114
1115
  * per-row errors. Globally-scoped (`.global()`) tables live in D1 and are
1115
1116
  * intentionally out of scope here.
1116
1117
  *
1117
- * Both calls travel over the {@link useLunora} client transport and are gated by
1118
+ * Both calls travel over the {@link useStudioClient} client transport and are gated by
1118
1119
  * the server's `LUNORA_ADMIN_TOKEN`.
1119
1120
  */
1120
1121
  declare const ExportImportPanel: ({ initialShardKey }: ExportImportPanelProps) => ReactElement;
@@ -1128,7 +1129,7 @@ interface MigrationsPanelProps {
1128
1129
  * Reads the persisted run-state via the `__lunora_admin__:migrationStatus` RPC
1129
1130
  * and lets an operator kick off a migration by id (`__lunora_admin__:runMigration`)
1130
1131
  * with a direction and a dry-run toggle. Both calls
1131
- * travel over the ordinary {@link useLunora} client transport and are gated by
1132
+ * travel over the ordinary {@link useStudioClient} client transport and are gated by
1132
1133
  * the server's `LUNORA_ADMIN_TOKEN` — this component issues no credentials of
1133
1134
  * its own.
1134
1135
  */
@@ -1145,7 +1146,7 @@ interface PitrPanelProps {
1145
1146
  * time, and (behind a confirm step) restores the shard to a time or an explicit
1146
1147
  * bookmark via the `__lunora_admin__:pitrRestore` RPC, surfacing the returned
1147
1148
  * undo bookmark so the restore can be reversed. All ops run over the
1148
- * {@link useLunora} client and are gated by the server's `LUNORA_ADMIN_TOKEN`.
1149
+ * {@link useStudioClient} client and are gated by the server's `LUNORA_ADMIN_TOKEN`.
1149
1150
  *
1150
1151
  * In-place recovery covers the last 30 days; for older or off-platform recovery
1151
1152
  * use the snapshot tier (`lunora backup` / the backup registry item).
@@ -1173,7 +1174,7 @@ interface FunctionRunnerProps {
1173
1174
  /**
1174
1175
  * Interactive runner for the registered functions: pick one, edit its JSON
1175
1176
  * arguments, optionally target a shard, then invoke it against the live
1176
- * {@link useLunora} client and inspect the result or error.
1177
+ * {@link useStudioClient} client and inspect the result or error.
1177
1178
  *
1178
1179
  * By default the function list is auto-discovered from the worker's
1179
1180
  * `/_lunora/admin/functions` endpoint; pass an explicit `functions` array to
@@ -1455,7 +1456,7 @@ interface MetricsPanelProps {
1455
1456
  * Health snapshot for a single shard: request / error counts (since the DO last
1456
1457
  * woke), its live SQLite size, and reactive-cache hit/miss stats when a cache is
1457
1458
  * configured. Reads via the `__lunora_admin__:getMetrics` RPC over the
1458
- * {@link useLunora} client; gated by the server's `LUNORA_ADMIN_TOKEN`.
1459
+ * {@link useStudioClient} client; gated by the server's `LUNORA_ADMIN_TOKEN`.
1459
1460
  *
1460
1461
  * Counters are per-DO-instance and reset on hibernation/restart — this is a
1461
1462
  * "since this instance woke" readout, not a durable time series.
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{StudioApp as r}from"./packem_shared/StudioApp-DfFjQPGJ.mjs";import{CommandPalette as a,openCommandPalette as f}from"./packem_shared/CommandPalette-CM1hqAOD.mjs";import{S as m}from"./packem_shared/studio-CFSjGWyw.mjs";import{ConfirmButton as l}from"./packem_shared/ConfirmButton-DU4p72Er.mjs";import{default as s}from"./packem_shared/ConnectionBadge-B8Hj5DaE.mjs";import{ErrorBoundary as d}from"./packem_shared/ErrorBoundary-BWNF98VF.mjs";import{ShardInput as P}from"./packem_shared/ShardInput-C6mjgAh4.mjs";import{default as A}from"./packem_chunks/AdvisorHealthPanel.mjs";import{DEFAULT_INSIGHT_THRESHOLDS as I,deriveInsights as T}from"./packem_shared/DEFAULT_INSIGHT_THRESHOLDS-D5YMT0gM.mjs";import{InsightsPanel as g}from"./packem_chunks/InsightsPanel.mjs";import{default as F}from"./packem_chunks/SecurityAdvisorPanel.mjs";import{default as h}from"./packem_shared/ApiDocsPanel-Py7C4ibM.mjs";import{default as C}from"./packem_shared/ApiReferencePanel-DlYVADAy.mjs";import{default as O}from"./packem_chunks/ApiTab.mjs";import{default as N}from"./packem_shared/OpenRpcReferencePanel-nYyfjjse.mjs";import{DataBrowser as U}from"./packem_shared/DataBrowser-DFjQeYYF.mjs";import{DataFilters as b,toFilterClauses as v}from"./packem_shared/DataFilters-faurWYyX.mjs";import{GlobalDataBrowser as y}from"./packem_shared/GlobalDataBrowser-CPfjubP_.mjs";import{TableEditor as q}from"./packem_chunks/TableEditor.mjs";import{ExportImportPanel as V}from"./packem_chunks/ExportImportPanel.mjs";import{MigrationsPanel as j}from"./packem_shared/MigrationsPanel-Dzjf42y8.mjs";import{PitrPanel as z}from"./packem_chunks/PitrPanel.mjs";import{FunctionRunner as Q}from"./packem_chunks/FunctionRunner.mjs";import{FunctionStatsPanel as Y}from"./packem_chunks/FunctionStatsPanel.mjs";import{DeploymentHealthPanel as $}from"./packem_chunks/DeploymentHealthPanel.mjs";import{H as oe}from"./packem_shared/home-panel-BJXZsAaD.mjs";import{AuditPanel as te}from"./packem_chunks/AuditPanel.mjs";import{LogsPanel as fe}from"./packem_chunks/LogsPanel.mjs";import{MailPanel as me}from"./packem_chunks/MailPanel.mjs";import{ScheduledJobs as le}from"./packem_shared/ScheduledJobs-BJ1uZW1U.mjs";import{default as se}from"./packem_chunks/NotificationsPanel.mjs";import{HealthPanel as de}from"./packem_chunks/HealthPanel.mjs";import{aggregateMetrics as Pe,shardsToAggregate as Se}from"./packem_shared/aggregateMetrics-DKFJc-o5.mjs";import{MetricsPanel as ce}from"./packem_chunks/MetricsPanel.mjs";import{SchemaViewer as Te}from"./packem_chunks/SchemaViewer.mjs";import{SettingsPanel as ge}from"./packem_chunks/SettingsPanel.mjs";import{SqlEditorPanel as Fe}from"./packem_chunks/SqlEditorPanel.mjs";import{FileBrowser as he}from"./packem_chunks/FileBrowser.mjs";import{DEFAULT_AUTO_REFRESH_MS as Ce,useAutoRefresh as He}from"./packem_shared/DEFAULT_AUTO_REFRESH_MS-DvhNw0BI.mjs";import{default as Le}from"./packem_shared/useDebounced-DVeQ5-oW.mjs";import{DEFAULT_LOCALE as Me,createStudioI18n as Ue,studioI18n as Be,useT as be}from"./packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{StudioI18nProvider as we}from"./packem_shared/StudioI18nProvider-fVsCSs5L.mjs";import{ADMIN_FUNCTIONS as Ge,ADMIN_FUNCTION_PREFIX as qe}from"./packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{default as Ve}from"./packem_shared/STUDIO_ROOT_CLASS-C6MccdVk.mjs";export{Ge as ADMIN_FUNCTIONS,qe as ADMIN_FUNCTION_PREFIX,A as AdvisorHealthPanel,h as ApiDocsPanel,C as ApiReferencePanel,O as ApiTab,te as AuditPanel,a as CommandPalette,l as ConfirmButton,s as ConnectionBadge,Ce as DEFAULT_AUTO_REFRESH_MS,I as DEFAULT_INSIGHT_THRESHOLDS,Me as DEFAULT_LOCALE,U as DataBrowser,b as DataFilters,$ as DeploymentHealthPanel,d as ErrorBoundary,V as ExportImportPanel,he as FileBrowser,Q as FunctionRunner,Y as FunctionStatsPanel,y as GlobalDataBrowser,de as HealthPanel,oe as HomePanel,g as InsightsPanel,fe as LogsPanel,me as MailPanel,ce as MetricsPanel,j as MigrationsPanel,se as NotificationsPanel,N as OpenRpcReferencePanel,z as PitrPanel,Ve as STUDIO_ROOT_CLASS,le as ScheduledJobs,Te as SchemaViewer,F as SecurityAdvisorPanel,ge as SettingsPanel,P as ShardInput,Fe as SqlEditorPanel,m as Studio,r as StudioApp,we as StudioI18nProvider,q as TableEditor,Pe as aggregateMetrics,Ue as createStudioI18n,T as deriveInsights,f as openCommandPalette,Se as shardsToAggregate,Be as studioI18n,v as toFilterClauses,He as useAutoRefresh,Le as useDebounced,be as useT};
1
+ import{StudioApp as r}from"./packem_shared/StudioApp-B1d0beD4.mjs";import{CommandPalette as a,openCommandPalette as f}from"./packem_shared/CommandPalette-5OsK8PNe.mjs";import{S as m}from"./packem_shared/studio-CA3ZKwVK.mjs";import{ConfirmButton as l}from"./packem_shared/ConfirmButton-CIXYF6Mg.mjs";import{default as s}from"./packem_shared/ConnectionBadge-BfcoN-VE.mjs";import{ErrorBoundary as d}from"./packem_shared/ErrorBoundary-BWNF98VF.mjs";import{ShardInput as P}from"./packem_shared/ShardInput-CoySruKZ.mjs";import{default as A}from"./packem_chunks/AdvisorHealthPanel.mjs";import{DEFAULT_INSIGHT_THRESHOLDS as I,deriveInsights as T}from"./packem_shared/DEFAULT_INSIGHT_THRESHOLDS-D5YMT0gM.mjs";import{InsightsPanel as g}from"./packem_chunks/InsightsPanel.mjs";import{default as F}from"./packem_chunks/SecurityAdvisorPanel.mjs";import{default as h}from"./packem_shared/ApiDocsPanel-B_RaW7Br.mjs";import{default as C}from"./packem_shared/ApiReferencePanel-u9Rrljdf.mjs";import{default as O}from"./packem_chunks/ApiTab.mjs";import{default as N}from"./packem_shared/OpenRpcReferencePanel-E9cDfHRv.mjs";import{DataBrowser as U}from"./packem_shared/DataBrowser-Cc1qZX-4.mjs";import{DataFilters as b,toFilterClauses as v}from"./packem_shared/DataFilters--ocFTVT2.mjs";import{GlobalDataBrowser as y}from"./packem_shared/GlobalDataBrowser-Hq6gTlkb.mjs";import{TableEditor as q}from"./packem_chunks/TableEditor.mjs";import{ExportImportPanel as V}from"./packem_chunks/ExportImportPanel.mjs";import{MigrationsPanel as j}from"./packem_shared/MigrationsPanel-CMZYYcQ5.mjs";import{PitrPanel as z}from"./packem_chunks/PitrPanel.mjs";import{FunctionRunner as Q}from"./packem_chunks/FunctionRunner.mjs";import{FunctionStatsPanel as Y}from"./packem_chunks/FunctionStatsPanel.mjs";import{DeploymentHealthPanel as $}from"./packem_chunks/DeploymentHealthPanel.mjs";import{H as oe}from"./packem_shared/home-panel-0XMGe1hP.mjs";import{AuditPanel as te}from"./packem_chunks/AuditPanel.mjs";import{LogsPanel as fe}from"./packem_chunks/LogsPanel.mjs";import{MailPanel as me}from"./packem_chunks/MailPanel.mjs";import{ScheduledJobs as le}from"./packem_shared/ScheduledJobs-D4CUj7aX.mjs";import{default as se}from"./packem_chunks/NotificationsPanel.mjs";import{HealthPanel as de}from"./packem_chunks/HealthPanel.mjs";import{aggregateMetrics as Pe,shardsToAggregate as Se}from"./packem_shared/aggregateMetrics-DKFJc-o5.mjs";import{MetricsPanel as ce}from"./packem_chunks/MetricsPanel.mjs";import{SchemaViewer as Te}from"./packem_chunks/SchemaViewer.mjs";import{SettingsPanel as ge}from"./packem_chunks/SettingsPanel.mjs";import{SqlEditorPanel as Fe}from"./packem_chunks/SqlEditorPanel.mjs";import{FileBrowser as he}from"./packem_chunks/FileBrowser.mjs";import{DEFAULT_AUTO_REFRESH_MS as Ce,useAutoRefresh as He}from"./packem_shared/DEFAULT_AUTO_REFRESH_MS-CG7Q45ZS.mjs";import{default as Le}from"./packem_shared/useDebounced-DVeQ5-oW.mjs";import{DEFAULT_LOCALE as Me,createStudioI18n as Ue,studioI18n as Be,useT as be}from"./packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{StudioI18nProvider as we}from"./packem_shared/StudioI18nProvider-CGXCPnQn.mjs";import{ADMIN_FUNCTIONS as Ge,ADMIN_FUNCTION_PREFIX as qe}from"./packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{default as Ve}from"./packem_shared/STUDIO_ROOT_CLASS-C6MccdVk.mjs";export{Ge as ADMIN_FUNCTIONS,qe as ADMIN_FUNCTION_PREFIX,A as AdvisorHealthPanel,h as ApiDocsPanel,C as ApiReferencePanel,O as ApiTab,te as AuditPanel,a as CommandPalette,l as ConfirmButton,s as ConnectionBadge,Ce as DEFAULT_AUTO_REFRESH_MS,I as DEFAULT_INSIGHT_THRESHOLDS,Me as DEFAULT_LOCALE,U as DataBrowser,b as DataFilters,$ as DeploymentHealthPanel,d as ErrorBoundary,V as ExportImportPanel,he as FileBrowser,Q as FunctionRunner,Y as FunctionStatsPanel,y as GlobalDataBrowser,de as HealthPanel,oe as HomePanel,g as InsightsPanel,fe as LogsPanel,me as MailPanel,ce as MetricsPanel,j as MigrationsPanel,se as NotificationsPanel,N as OpenRpcReferencePanel,z as PitrPanel,Ve as STUDIO_ROOT_CLASS,le as ScheduledJobs,Te as SchemaViewer,F as SecurityAdvisorPanel,ge as SettingsPanel,P as ShardInput,Fe as SqlEditorPanel,m as Studio,r as StudioApp,we as StudioI18nProvider,q as TableEditor,Pe as aggregateMetrics,Ue as createStudioI18n,T as deriveInsights,f as openCommandPalette,Se as shardsToAggregate,Be as studioI18n,v as toFilterClauses,He as useAutoRefresh,Le as useDebounced,be as useT};
package/dist/mount.d.mts CHANGED
@@ -1,9 +1,10 @@
1
1
  import { Root } from 'react-dom/client';
2
- import { S as StudioAppProps } from "./packem_shared/app.d-D45VvUTx.mjs";
3
- import '@lunora/client';
2
+ import { S as StudioAppProps } from "./packem_shared/app.d-D425h1XO.mjs";
3
+ import '@lunora/client/admin';
4
4
  import 'react';
5
5
  import '@lingui/core';
6
6
  import '@lunora/bindings/analytics-sql';
7
+ import '@lunora/client';
7
8
  interface MountStudioOptions extends StudioAppProps {
8
9
  /**
9
10
  * The container to mount into. Accepts an element or a selector; defaults to
package/dist/mount.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import { Root } from 'react-dom/client';
2
- import { S as StudioAppProps } from "./packem_shared/app.d-D45VvUTx.js";
3
- import '@lunora/client';
2
+ import { S as StudioAppProps } from "./packem_shared/app.d-D425h1XO.js";
3
+ import '@lunora/client/admin';
4
4
  import 'react';
5
5
  import '@lingui/core';
6
6
  import '@lunora/bindings/analytics-sql';
7
+ import '@lunora/client';
7
8
  interface MountStudioOptions extends StudioAppProps {
8
9
  /**
9
10
  * The container to mount into. Accepts an element or a selector; defaults to
package/dist/mount.mjs CHANGED
@@ -1 +1 @@
1
- import{LunoraError as m}from"@lunora/errors";import{createRoot as i}from"react-dom/client";import{StudioApp as p}from"./packem_shared/StudioApp-DfFjQPGJ.mjs";import{jsx as u}from"react/jsx-runtime";const a=(n={})=>{const{container:o="#root",...e}=n,t=typeof o=="string"?document.querySelector(o):o;if(t===null)throw new m("INTERNAL",`mountStudio: container ${typeof o=="string"?o:"element"} not found`);const r=i(t);return r.render(u(p,{...e})),r};export{a as mountStudio};
1
+ import{LunoraError as m}from"@lunora/errors";import{createRoot as i}from"react-dom/client";import{StudioApp as p}from"./packem_shared/StudioApp-B1d0beD4.mjs";import{jsx as u}from"react/jsx-runtime";const a=(n={})=>{const{container:o="#root",...e}=n,t=typeof o=="string"?document.querySelector(o):o;if(t===null)throw new m("INTERNAL",`mountStudio: container ${typeof o=="string"?o:"element"} not found`);const r=i(t);return r.render(u(p,{...e})),r};export{a as mountStudio};
@@ -1 +1 @@
1
- import{scoreAdvisor as T}from"@lunora/advisor";import{E as A}from"../packem_shared/error-alert-CNQjdAhi.mjs";import{C as c,a as o}from"../packem_shared/card-By2O8ULa.mjs";import{T as j,a as R,b as f,c as i,d as $,e as m}from"../packem_shared/table-D0SBiDu-.mjs";import{u as v}from"../packem_shared/use-admin-query-CLStXJ7v.mjs";import{useT as C}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as N}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{c as u}from"../packem_shared/utils-bhneXptQ.mjs";import{jsx as e,jsxs as r}from"react/jsx-runtime";const n={clean:"text-emerald-600 dark:text-emerald-400",exempt:"text-muted-foreground",failing:"text-red-600 dark:text-red-400",warned:"text-amber-600 dark:text-amber-400"},b={"at-risk":"text-red-600 dark:text-red-400",excellent:"text-emerald-600 dark:text-emerald-400",good:"text-emerald-600 dark:text-emerald-400","needs-work":"text-amber-600 dark:text-amber-400"},E=(s,a)=>`exempt: ${s.exemptReason===void 0||s.exemptReason===""?a:s.exemptReason}`,S=s=>s.toSorted((a,l)=>a.coverage==="clean"&&l.coverage!=="clean"?1:l.coverage==="clean"&&a.coverage!=="clean"?-1:a.score-l.score),Y=({testId:s="advisor-health"})=>{const a=C(),l=v(N.getAdvisories,{},{live:!0}),x=v(N.getAdvisorProcedures,{},{live:!0}),p=l.data?.advisories??null,h=x.data?.procedures??null,t=p===null||h===null?null:T(h,p),g=x.error??l.error;if(g!==null)return e(A,{error:g,testId:`${s}-error`});if(t===null)return e(c,{children:e(o,{className:"py-8 text-center text-muted-foreground","data-testid":`${s}-loading`,children:a("Loading…")})});const k=S(t.procedures);return r("div",{className:"space-y-4","data-testid":s,children:[e(c,{children:r(o,{className:"flex flex-wrap items-baseline gap-x-6 gap-y-2 py-6",children:[r("div",{children:[e("span",{className:u("text-4xl font-semibold tabular-nums",b[t.grade]),"data-testid":`${s}-score`,children:t.score}),e("span",{className:"text-muted-foreground text-lg",children:"/100"})]}),e("span",{className:u("text-sm font-medium uppercase tracking-wide",b[t.grade]),"data-testid":`${s}-grade`,children:t.grade}),r("div",{className:"text-muted-foreground flex gap-4 text-sm tabular-nums","data-testid":`${s}-summary`,children:[r("span",{className:n.clean,children:[t.summary.clean," ",a("clean")]}),r("span",{className:n.warned,children:[t.summary.warned," ",a("warned")]}),r("span",{className:n.failing,children:[t.summary.failing," ",a("failing")]}),r("span",{className:n.exempt,children:[t.summary.exempt," ",a("exempt")]})]})]})}),t.project.checks.length>0&&e(c,{children:r(o,{className:"py-4 text-sm","data-testid":`${s}-project`,children:[r("span",{className:"font-medium",children:[a("Schema & config")," ",t.project.score,"/100"]}),r("span",{className:"text-muted-foreground",children:[" — ",t.project.checks.map(d=>d.name).join(", ")]})]})}),e(c,{children:e(o,{className:"p-0",children:r(j,{children:[e(R,{children:r(f,{children:[e(i,{className:"w-20",children:a("Score")}),e(i,{children:a("Procedure")}),e(i,{className:"w-32",children:a("Kind")}),e(i,{children:a("Rules fired")})]})}),e($,{children:k.map(d=>r(f,{"data-testid":`${s}-row`,children:[e(m,{className:u("tabular-nums font-medium",n[d.coverage]),children:d.coverage==="exempt"?"—":d.score}),e(m,{className:"font-mono text-xs",children:d.id}),r(m,{className:"text-muted-foreground text-xs",children:[d.visibility," ",d.kind,d.sensitivity.level==="high"&&e("span",{className:"ml-1 text-amber-600 dark:text-amber-400",children:a("sensitive")})]}),e(m,{className:"text-muted-foreground text-xs",children:d.coverage==="exempt"?E(d,a("no reason given")):d.checks.map(w=>w.name).join(", ")})]},d.id))})]})})})]})};export{Y as default};
1
+ import{scoreAdvisor as T}from"@lunora/advisor";import{E as A}from"../packem_shared/error-alert-54TiaMvZ.mjs";import{C as c,a as o}from"../packem_shared/card-By2O8ULa.mjs";import{T as j,a as R,b as f,c as i,d as $,e as m}from"../packem_shared/table-D0SBiDu-.mjs";import{u as v}from"../packem_shared/use-admin-query-BW9IuacC.mjs";import{useT as C}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{ADMIN_FUNCTIONS as N}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{c as u}from"../packem_shared/utils-bhneXptQ.mjs";import{jsx as e,jsxs as r}from"react/jsx-runtime";const n={clean:"text-emerald-600 dark:text-emerald-400",exempt:"text-muted-foreground",failing:"text-red-600 dark:text-red-400",warned:"text-amber-600 dark:text-amber-400"},b={"at-risk":"text-red-600 dark:text-red-400",excellent:"text-emerald-600 dark:text-emerald-400",good:"text-emerald-600 dark:text-emerald-400","needs-work":"text-amber-600 dark:text-amber-400"},E=(s,a)=>`exempt: ${s.exemptReason===void 0||s.exemptReason===""?a:s.exemptReason}`,S=s=>s.toSorted((a,l)=>a.coverage==="clean"&&l.coverage!=="clean"?1:l.coverage==="clean"&&a.coverage!=="clean"?-1:a.score-l.score),Y=({testId:s="advisor-health"})=>{const a=C(),l=v(N.getAdvisories,{},{live:!0}),x=v(N.getAdvisorProcedures,{},{live:!0}),p=l.data?.advisories??null,h=x.data?.procedures??null,t=p===null||h===null?null:T(h,p),g=x.error??l.error;if(g!==null)return e(A,{error:g,testId:`${s}-error`});if(t===null)return e(c,{children:e(o,{className:"py-8 text-center text-muted-foreground","data-testid":`${s}-loading`,children:a("Loading…")})});const k=S(t.procedures);return r("div",{className:"space-y-4","data-testid":s,children:[e(c,{children:r(o,{className:"flex flex-wrap items-baseline gap-x-6 gap-y-2 py-6",children:[r("div",{children:[e("span",{className:u("text-4xl font-semibold tabular-nums",b[t.grade]),"data-testid":`${s}-score`,children:t.score}),e("span",{className:"text-muted-foreground text-lg",children:"/100"})]}),e("span",{className:u("text-sm font-medium uppercase tracking-wide",b[t.grade]),"data-testid":`${s}-grade`,children:t.grade}),r("div",{className:"text-muted-foreground flex gap-4 text-sm tabular-nums","data-testid":`${s}-summary`,children:[r("span",{className:n.clean,children:[t.summary.clean," ",a("clean")]}),r("span",{className:n.warned,children:[t.summary.warned," ",a("warned")]}),r("span",{className:n.failing,children:[t.summary.failing," ",a("failing")]}),r("span",{className:n.exempt,children:[t.summary.exempt," ",a("exempt")]})]})]})}),t.project.checks.length>0&&e(c,{children:r(o,{className:"py-4 text-sm","data-testid":`${s}-project`,children:[r("span",{className:"font-medium",children:[a("Schema & config")," ",t.project.score,"/100"]}),r("span",{className:"text-muted-foreground",children:[" — ",t.project.checks.map(d=>d.name).join(", ")]})]})}),e(c,{children:e(o,{className:"p-0",children:r(j,{children:[e(R,{children:r(f,{children:[e(i,{className:"w-20",children:a("Score")}),e(i,{children:a("Procedure")}),e(i,{className:"w-32",children:a("Kind")}),e(i,{children:a("Rules fired")})]})}),e($,{children:k.map(d=>r(f,{"data-testid":`${s}-row`,children:[e(m,{className:u("tabular-nums font-medium",n[d.coverage]),children:d.coverage==="exempt"?"—":d.score}),e(m,{className:"font-mono text-xs",children:d.id}),r(m,{className:"text-muted-foreground text-xs",children:[d.visibility," ",d.kind,d.sensitivity.level==="high"&&e("span",{className:"ml-1 text-amber-600 dark:text-amber-400",children:a("sensitive")})]}),e(m,{className:"text-muted-foreground text-xs",children:d.coverage==="exempt"?E(d,a("no reason given")):d.checks.map(w=>w.name).join(", ")})]},d.id))})]})})})]})};export{Y as default};
@@ -1 +1 @@
1
- import{c as L}from"react/compiler-runtime";import{useState as F}from"react";import{B as K}from"../packem_shared/button-q0UYSmrn.mjs";import{useT as Y}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import D from"../packem_shared/ApiDocsPanel-Py7C4ibM.mjs";import M from"../packem_shared/ApiReferencePanel-DlYVADAy.mjs";import W from"../packem_shared/OpenRpcReferencePanel-nYyfjjse.mjs";import{jsx as r,jsxs as E}from"react/jsx-runtime";const _=["reference","snippets"],q=["openapi","openrpc"],k=V=>{const e=L(51),{functions:R,initialShardKey:N,openApiSpec:T,openRpcSpec:I}=V,t=Y(),[i,$]=F("reference"),[a,j]=F("openapi");let s;e[0]!==t?(s=t("Reference"),e[0]=t,e[1]=s):s=e[1];let o;e[2]!==t?(o=t("Snippets"),e[2]=t,e[3]=o):o=e[3];let w;e[4]!==s||e[5]!==o?(w={reference:s,snippets:o},e[4]=s,e[5]=o,e[6]=w):w=e[6];const O=w;let n;e[7]!==t?(n=t("OpenAPI"),e[7]=t,e[8]=n):n=e[8];let c;e[9]!==t?(c=t("OpenRPC"),e[9]=t,e[10]=c):c=e[10];let g;e[11]!==n||e[12]!==c?(g={openapi:n,openrpc:c},e[11]=n,e[12]=c,e[13]=g):g=e[13];const C=g;let S;e[14]===Symbol.for("react.memo_cache_sentinel")?(S=l=>{$(l.currentTarget.dataset.view)},e[14]=S):S=e[14];const z=S;let A;e[15]===Symbol.for("react.memo_cache_sentinel")?(A=l=>{j(l.currentTarget.dataset.format)},e[15]=A):A=e[15];const B=A;let p;e[16]!==t?(p=t("API view"),e[16]=t,e[17]=p):p=e[17];let f;e[18]!==i||e[19]!==O?(f=_.map(l=>r(K,{"aria-selected":i===l,"data-testid":`api-view-${l}`,"data-view":l,onClick:z,role:"tab",size:"sm",type:"button",variant:i===l?"default":"outline",children:O[l]},l)),e[18]=i,e[19]=O,e[20]=f):f=e[20];let m;e[21]!==f||e[22]!==p?(m=r("div",{"aria-label":p,className:"flex gap-1.5","data-testid":"api-view-toggle",role:"tablist",children:f}),e[21]=f,e[22]=p,e[23]=m):m=e[23];let d;e[24]!==a||e[25]!==C||e[26]!==t||e[27]!==i?(d=i==="reference"&&r("div",{"aria-label":t("API spec format"),className:"flex gap-1.5","data-testid":"api-format-toggle",role:"tablist",children:q.map(l=>r(K,{"aria-selected":a===l,"data-format":l,"data-testid":`api-format-${l}`,onClick:B,role:"tab",size:"sm",type:"button",variant:a===l?"default":"outline",children:C[l]},l))}),e[24]=a,e[25]=C,e[26]=t,e[27]=i,e[28]=d):d=e[28];let b;e[29]!==m||e[30]!==d?(b=E("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]=b):b=e[31];let v;e[32]!==R||e[33]!==N||e[34]!==i?(v=i==="snippets"&&r("div",{className:"min-h-0 flex-1 overflow-y-auto p-6",children:r(D,{functions:R,initialShardKey:N})}),e[32]=R,e[33]=N,e[34]=i,e[35]=v):v=e[35];let h;e[36]!==a||e[37]!==T||e[38]!==i?(h=i==="reference"&&a==="openapi"&&r(M,{spec:T}),e[36]=a,e[37]=T,e[38]=i,e[39]=h):h=e[39];let u;e[40]!==a||e[41]!==I||e[42]!==i?(u=i==="reference"&&a==="openrpc"&&r(W,{spec:I}),e[40]=a,e[41]=I,e[42]=i,e[43]=u):u=e[43];let x;e[44]!==v||e[45]!==h||e[46]!==u?(x=E("div",{className:"flex min-h-0 flex-1 flex-col overflow-hidden",children:[v,h,u]}),e[44]=v,e[45]=h,e[46]=u,e[47]=x):x=e[47];let P;return e[48]!==b||e[49]!==x?(P=E("div",{className:"flex min-h-0 flex-1 flex-col","data-testid":"lunora-api-tab",children:[b,x]}),e[48]=b,e[49]=x,e[50]=P):P=e[50],P};export{k as default};
1
+ import{c as L}from"react/compiler-runtime";import{useState as F}from"react";import{B as K}from"../packem_shared/button-q0UYSmrn.mjs";import{useT as Y}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import D from"../packem_shared/ApiDocsPanel-B_RaW7Br.mjs";import M from"../packem_shared/ApiReferencePanel-u9Rrljdf.mjs";import W from"../packem_shared/OpenRpcReferencePanel-E9cDfHRv.mjs";import{jsx as r,jsxs as E}from"react/jsx-runtime";const _=["reference","snippets"],q=["openapi","openrpc"],k=V=>{const e=L(51),{functions:R,initialShardKey:N,openApiSpec:T,openRpcSpec:I}=V,t=Y(),[i,$]=F("reference"),[a,j]=F("openapi");let s;e[0]!==t?(s=t("Reference"),e[0]=t,e[1]=s):s=e[1];let o;e[2]!==t?(o=t("Snippets"),e[2]=t,e[3]=o):o=e[3];let w;e[4]!==s||e[5]!==o?(w={reference:s,snippets:o},e[4]=s,e[5]=o,e[6]=w):w=e[6];const O=w;let n;e[7]!==t?(n=t("OpenAPI"),e[7]=t,e[8]=n):n=e[8];let c;e[9]!==t?(c=t("OpenRPC"),e[9]=t,e[10]=c):c=e[10];let g;e[11]!==n||e[12]!==c?(g={openapi:n,openrpc:c},e[11]=n,e[12]=c,e[13]=g):g=e[13];const C=g;let S;e[14]===Symbol.for("react.memo_cache_sentinel")?(S=l=>{$(l.currentTarget.dataset.view)},e[14]=S):S=e[14];const z=S;let A;e[15]===Symbol.for("react.memo_cache_sentinel")?(A=l=>{j(l.currentTarget.dataset.format)},e[15]=A):A=e[15];const B=A;let p;e[16]!==t?(p=t("API view"),e[16]=t,e[17]=p):p=e[17];let f;e[18]!==i||e[19]!==O?(f=_.map(l=>r(K,{"aria-selected":i===l,"data-testid":`api-view-${l}`,"data-view":l,onClick:z,role:"tab",size:"sm",type:"button",variant:i===l?"default":"outline",children:O[l]},l)),e[18]=i,e[19]=O,e[20]=f):f=e[20];let m;e[21]!==f||e[22]!==p?(m=r("div",{"aria-label":p,className:"flex gap-1.5","data-testid":"api-view-toggle",role:"tablist",children:f}),e[21]=f,e[22]=p,e[23]=m):m=e[23];let d;e[24]!==a||e[25]!==C||e[26]!==t||e[27]!==i?(d=i==="reference"&&r("div",{"aria-label":t("API spec format"),className:"flex gap-1.5","data-testid":"api-format-toggle",role:"tablist",children:q.map(l=>r(K,{"aria-selected":a===l,"data-format":l,"data-testid":`api-format-${l}`,onClick:B,role:"tab",size:"sm",type:"button",variant:a===l?"default":"outline",children:C[l]},l))}),e[24]=a,e[25]=C,e[26]=t,e[27]=i,e[28]=d):d=e[28];let b;e[29]!==m||e[30]!==d?(b=E("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]=b):b=e[31];let v;e[32]!==R||e[33]!==N||e[34]!==i?(v=i==="snippets"&&r("div",{className:"min-h-0 flex-1 overflow-y-auto p-6",children:r(D,{functions:R,initialShardKey:N})}),e[32]=R,e[33]=N,e[34]=i,e[35]=v):v=e[35];let h;e[36]!==a||e[37]!==T||e[38]!==i?(h=i==="reference"&&a==="openapi"&&r(M,{spec:T}),e[36]=a,e[37]=T,e[38]=i,e[39]=h):h=e[39];let u;e[40]!==a||e[41]!==I||e[42]!==i?(u=i==="reference"&&a==="openrpc"&&r(W,{spec:I}),e[40]=a,e[41]=I,e[42]=i,e[43]=u):u=e[43];let x;e[44]!==v||e[45]!==h||e[46]!==u?(x=E("div",{className:"flex min-h-0 flex-1 flex-col overflow-hidden",children:[v,h,u]}),e[44]=v,e[45]=h,e[46]=u,e[47]=x):x=e[47];let P;return e[48]!==b||e[49]!==x?(P=E("div",{className:"flex min-h-0 flex-1 flex-col","data-testid":"lunora-api-tab",children:[b,x]}),e[48]=b,e[49]=x,e[50]=P):P=e[50],P};export{k as default};
@@ -1 +1 @@
1
- import{useVirtualizer as A,observeElementRect as B}from"@tanstack/react-virtual";import{useState as K,useMemo as w,useRef as M}from"react";import{E as V}from"../packem_shared/error-alert-CNQjdAhi.mjs";import{L as _}from"../packem_shared/live-status-BuJdUZFU.mjs";import{ShardInput as j}from"../packem_shared/ShardInput-C6mjgAh4.mjs";import{B as U}from"../packem_shared/badge-r_5B4LHP.mjs";import{C as q,a as D}from"../packem_shared/card-By2O8ULa.mjs";import{E as F}from"../packem_shared/empty-state-D7jEML_T.mjs";import{I as G}from"../packem_shared/input-CXhxesPC.mjs";import{T as W,a as J,b as N,c as s,d as P,e as l}from"../packem_shared/table-D0SBiDu-.mjs";import{u as Q}from"../packem_shared/use-admin-query-CLStXJ7v.mjs";import{u as Z}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as X}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as Y}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{h as $,k as ee}from"../packem_shared/internal-BXEjuLPN.mjs";import{jsxs as i,jsx as e}from"react/jsx-runtime";const te=o=>o===void 0?"":JSON.stringify(o,ee),re=41,C=480,b=5,ae=(o,t)=>B(o,n=>{t(n.height>0?n:{height:C,width:n.width})}),we=({initialShardKey:o})=>{const t=X(),{queryShardKey:n,setShardKey:y,shardKey:T}=Z(o),[c,L]=K(""),{data:u,error:p,errorSource:R,isLoading:E,liveError:I}=Q(Y.getAuditLog,{},{live:!0,shardKey:n}),m=w(()=>u?.entries??[],[u]),d=w(()=>{const a=c.trim().toLowerCase();return a===""?m:m.filter(r=>r.op.toLowerCase().includes(a)||(r.table??"").toLowerCase().includes(a)||(r.id??"").toLowerCase().includes(a))},[m,c]),f=M(null),g=A({count:d.length,estimateSize:()=>re,getScrollElement:()=>f.current,initialRect:{height:C,width:800},observeElementRect:ae,overscan:8}),h=g.getVirtualItems(),H=g.getTotalSize(),v=h[0]?.start??0,x=H-(h.at(-1)?.end??0),O={height:v},k={height:x},z=a=>{L(a.target.value)};return i("div",{className:"flex flex-col gap-4","data-testid":"lunora-audit",children:[i("div",{className:"flex flex-wrap items-center gap-2",children:[e(j,{onChange:y,testId:"au-shard-input",value:T}),e(_,{message:I,prefix:"au"}),e(G,{"aria-label":t("Filter audit log"),className:"h-8 w-48","data-testid":"au-search",onChange:z,placeholder:t("filter op, table, id"),value:c})]}),p!==null&&e(V,{error:R,testId:"au-error"}),p===null&&!E&&d.length===0&&e(F,{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.")}),d.length>0&&e(q,{className:"overflow-hidden py-0",children:e(D,{className:"max-h-[30rem] overflow-auto px-0",ref:f,children:i(W,{"data-testid":"au-table",children:[e(J,{children:i(N,{children:[e(s,{children:t("time")}),e(s,{children:t("op")}),e(s,{children:t("table")}),e(s,{children:t("id")}),e(s,{children:t("detail")})]})}),i(P,{children:[v>0&&e("tr",{"aria-hidden":"true",children:e("td",{colSpan:b,style:O})}),h.map(a=>{const r=d[a.index],S=te(r.detail);return i(N,{"data-testid":"au-row",children:[e(l,{className:"text-muted-foreground tabular-nums",children:$(r.ts,"—")}),e(l,{children:e(U,{variant:"secondary",children:r.op})}),e(l,{className:"font-medium",children:r.table??e("span",{className:"text-muted-foreground",children:"—"})}),e(l,{className:"max-w-[20ch] truncate font-mono text-xs",children:r.id??e("span",{className:"text-muted-foreground",children:"—"})}),e(l,{className:"max-w-[32ch] truncate font-mono text-xs text-muted-foreground",title:S||void 0,children:S||e("span",{className:"text-muted-foreground",children:"—"})})]},r.seq)}),x>0&&e("tr",{"aria-hidden":"true",children:e("td",{colSpan:b,style:k})})]})]})})})]})};export{we as AuditPanel};
1
+ import{useVirtualizer as A,observeElementRect as B}from"@tanstack/react-virtual";import{useState as K,useMemo as w,useRef as M}from"react";import{E as V}from"../packem_shared/error-alert-54TiaMvZ.mjs";import{L as _}from"../packem_shared/live-status-D1GasNsH.mjs";import{ShardInput as j}from"../packem_shared/ShardInput-CoySruKZ.mjs";import{B as U}from"../packem_shared/badge-r_5B4LHP.mjs";import{C as q,a as D}from"../packem_shared/card-By2O8ULa.mjs";import{E as F}from"../packem_shared/empty-state-D7jEML_T.mjs";import{I as G}from"../packem_shared/input-CXhxesPC.mjs";import{T as W,a as J,b as N,c as s,d as P,e as l}from"../packem_shared/table-D0SBiDu-.mjs";import{u as Q}from"../packem_shared/use-admin-query-BW9IuacC.mjs";import{u as Z}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as X}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{ADMIN_FUNCTIONS as Y}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{h as $,k as ee}from"../packem_shared/internal-BXEjuLPN.mjs";import{jsxs as i,jsx as e}from"react/jsx-runtime";const te=o=>o===void 0?"":JSON.stringify(o,ee),re=41,C=480,b=5,ae=(o,t)=>B(o,n=>{t(n.height>0?n:{height:C,width:n.width})}),we=({initialShardKey:o})=>{const t=X(),{queryShardKey:n,setShardKey:y,shardKey:T}=Z(o),[c,L]=K(""),{data:u,error:p,errorSource:R,isLoading:E,liveError:I}=Q(Y.getAuditLog,{},{live:!0,shardKey:n}),m=w(()=>u?.entries??[],[u]),d=w(()=>{const a=c.trim().toLowerCase();return a===""?m:m.filter(r=>r.op.toLowerCase().includes(a)||(r.table??"").toLowerCase().includes(a)||(r.id??"").toLowerCase().includes(a))},[m,c]),f=M(null),g=A({count:d.length,estimateSize:()=>re,getScrollElement:()=>f.current,initialRect:{height:C,width:800},observeElementRect:ae,overscan:8}),h=g.getVirtualItems(),H=g.getTotalSize(),v=h[0]?.start??0,x=H-(h.at(-1)?.end??0),O={height:v},k={height:x},z=a=>{L(a.target.value)};return i("div",{className:"flex flex-col gap-4","data-testid":"lunora-audit",children:[i("div",{className:"flex flex-wrap items-center gap-2",children:[e(j,{onChange:y,testId:"au-shard-input",value:T}),e(_,{message:I,prefix:"au"}),e(G,{"aria-label":t("Filter audit log"),className:"h-8 w-48","data-testid":"au-search",onChange:z,placeholder:t("filter op, table, id"),value:c})]}),p!==null&&e(V,{error:R,testId:"au-error"}),p===null&&!E&&d.length===0&&e(F,{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.")}),d.length>0&&e(q,{className:"overflow-hidden py-0",children:e(D,{className:"max-h-[30rem] overflow-auto px-0",ref:f,children:i(W,{"data-testid":"au-table",children:[e(J,{children:i(N,{children:[e(s,{children:t("time")}),e(s,{children:t("op")}),e(s,{children:t("table")}),e(s,{children:t("id")}),e(s,{children:t("detail")})]})}),i(P,{children:[v>0&&e("tr",{"aria-hidden":"true",children:e("td",{colSpan:b,style:O})}),h.map(a=>{const r=d[a.index],S=te(r.detail);return i(N,{"data-testid":"au-row",children:[e(l,{className:"text-muted-foreground tabular-nums",children:$(r.ts,"—")}),e(l,{children:e(U,{variant:"secondary",children:r.op})}),e(l,{className:"font-medium",children:r.table??e("span",{className:"text-muted-foreground",children:"—"})}),e(l,{className:"max-w-[20ch] truncate font-mono text-xs",children:r.id??e("span",{className:"text-muted-foreground",children:"—"})}),e(l,{className:"max-w-[32ch] truncate font-mono text-xs text-muted-foreground",title:S||void 0,children:S||e("span",{className:"text-muted-foreground",children:"—"})})]},r.seq)}),x>0&&e("tr",{"aria-hidden":"true",children:e("td",{colSpan:b,style:k})})]})]})})})]})};export{we as AuditPanel};
@@ -1 +1 @@
1
- import{c as ee}from"react/compiler-runtime";import{useLunora as te}from"@lunora/react";import{useQuery as re}from"@tanstack/react-query";import{B as M}from"../packem_shared/badge-r_5B4LHP.mjs";import{C as J}from"../packem_shared/card-By2O8ULa.mjs";import{E as ne}from"../packem_shared/empty-state-D7jEML_T.mjs";import{S as X}from"../packem_shared/skeleton-DX1gfixl.mjs";import{useT as ie}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{h as oe}from"../packem_shared/internal-BXEjuLPN.mjs";import{c as se}from"../packem_shared/utils-bhneXptQ.mjs";import{jsxs as p,jsx as a}from"react/jsx-runtime";const de="/_lunora/health",ce="/_lunora/health/ready",me=(r,e)=>(r.endsWith("/")?r.slice(0,-1):r)+e,pe=()=>{const r=te();return async e=>{const w=e==="ready"?ce:de,t=r.getAuthToken(),y=me(r.url,w);try{const i=await fetch(y,{headers:t===null?{}:{authorization:`Bearer ${t}`}});let u=null;try{u=await i.json()}catch{u=null}return{body:u,ok:i.ok,status:i.status}}catch(i){return{body:null,error:i instanceof Error?i.message:String(i),ok:!1,status:0}}}},ue={crit:"bg-destructive",ok:"bg-success",warn:"bg-warning"},fe=r=>r==="unhealthy"?"crit":r==="degraded"?"warn":"ok",Z=r=>{const e=ee(13),{label:w,level:t,testId:y,value:i}=r,u=ue[t];let o;e[0]!==u?(o=se("size-1.5 shrink-0 rounded-full",u),e[0]=u,e[1]=o):o=e[1];let d;e[2]!==o?(d=a("span",{"aria-hidden":"true",className:o}),e[2]=o,e[3]=d):d=e[3];let c;e[4]!==w||e[5]!==d?(c=p("span",{className:"flex items-center gap-1.5 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:[d,w]}),e[4]=w,e[5]=d,e[6]=c):c=e[6];let f;e[7]!==y||e[8]!==i?(f=a("span",{className:"text-lg font-semibold text-foreground","data-testid":y,children:i}),e[7]=y,e[8]=i,e[9]=f):f=e[9];let H;return e[10]!==c||e[11]!==f?(H=a(J,{className:"gap-0 py-0",children:p("div",{className:"flex flex-col gap-2.5 p-4",children:[c,f]})}),e[10]=c,e[11]=f,e[12]=H):H=e[12],H},Pe=r=>{const e=ee(107),{probe:w}=r,t=ie(),y=te(),i=pe(),u=w??i;let o;e[0]!==u?(o=async()=>{const[s,n]=await Promise.all([u("live"),u("ready")]);return{live:s,ready:n}},e[0]=u,e[1]=o):o=e[1];let d;e[2]!==y?(d=y.clientIdentifier(),e[2]=y,e[3]=d):d=e[3];let c;e[4]!==d?(c=["deployment-health",d],e[4]=d,e[5]=c):c=e[5];let f;e[6]!==o||e[7]!==c?(f={queryFn:o,queryKey:c},e[6]=o,e[7]=c,e[8]=f):f=e[8];const{data:H,isPending:le}=re(f),K=H?.live??null,ae=H?.ready??null;if(le){let s;return e[9]===Symbol.for("react.memo_cache_sentinel")?(s=p("div",{className:"flex flex-col gap-4","data-testid":"deployment-health-loading",children:[a(X,{className:"h-16 w-full"}),a(X,{className:"h-40 w-full"})]}),e[9]=s):s=e[9],s}const l=K?.body??null;if(l===null){const s=K?.status===403;let n;e[10]!==s||e[11]!==K?.error||e[12]!==t?(n=s?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:K?.error??t("no response")}),e[10]=s,e[11]=K?.error,e[12]=t,e[13]=n):n=e[13];let m;e[14]!==t?(m=t("Health endpoint unavailable"),e[14]=t,e[15]=m):m=e[15];let g;return e[16]!==n||e[17]!==m?(g=a(ne,{description:n,testId:"deployment-health-error",title:m}),e[16]=n,e[17]=m,e[18]=g):g=e[18],g}let Y;e[19]!==l.status?(Y=fe(l.status),e[19]=l.status,e[20]=Y):Y=e[20];const Q=Y;let h;if(l.status==="unhealthy"){let s;e[21]!==t?(s=t("Unhealthy"),e[21]=t,e[22]=s):s=e[22],h=s}else if(l.status==="degraded"){let s;e[23]!==t?(s=t("Degraded"),e[23]=t,e[24]=s):s=e[24],h=s}else{let s;e[25]!==t?(s=t("Healthy"),e[25]=t,e[26]=s):s=e[26],h=s}const T=ae?.ok??!1,W=T?"ok":"crit";let L,P,_,N,v,b,C,E,k,S;if(e[27]!==l.appName||e[28]!==l.appVersion||e[29]!==l.checks||e[30]!==l.timestamp||e[31]!==Q||e[32]!==W||e[33]!==T||e[34]!==h||e[35]!==t){const s=[...l.checks].toSorted(he);P="flex flex-col gap-6",_="deployment-health";let n;e[46]!==t?(n=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[46]=t,e[47]=n):n=e[47],e[48]!==n?(N=a("p",{className:"text-sm text-muted-foreground",children:n}),e[48]=n,e[49]=N):N=e[49];let m;e[50]!==h?(m=a("span",{className:"text-sm font-semibold text-foreground","data-testid":"dh-status",children:h}),e[50]=h,e[51]=m):m=e[51];let g;e[52]!==l.appName||e[53]!==l.appVersion?(g=p("span",{className:"font-mono text-[13px] text-muted-foreground","data-testid":"dh-app",children:[l.appName," · ",l.appVersion]}),e[52]=l.appName,e[53]=l.appVersion,e[54]=g):g=e[54];let A;e[55]!==m||e[56]!==g?(A=a("div",{className:"flex items-center gap-3",children:p("div",{className:"grid leading-tight",children:[m,g]})}),e[55]=m,e[56]=g,e[57]=A):A=e[57];let D;e[58]!==t?(D=t("Checked"),e[58]=t,e[59]=D):D=e[59];let V;e[60]!==D?(V=a("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:D}),e[60]=D,e[61]=V):V=e[61];let I;e[62]!==l.timestamp?(I=oe(l.timestamp),e[62]=l.timestamp,e[63]=I):I=e[63];let R;e[64]!==I?(R=a("time",{className:"text-[13px] text-muted-foreground","data-testid":"dh-timestamp",children:I}),e[64]=I,e[65]=R):R=e[65];let $;e[66]!==V||e[67]!==R?($=p("div",{className:"text-end",children:[V,R]}),e[66]=V,e[67]=R,e[68]=$):$=e[68],e[69]!==A||e[70]!==$?(v=a(J,{className:"gap-0 py-0",children:p("div",{className:"flex flex-wrap items-center justify-between gap-4 p-4",children:[A,$]})}),e[69]=A,e[70]=$,e[71]=v):v=e[71];let z;e[72]!==t?(z=t("Liveness"),e[72]=t,e[73]=z):z=e[73];let B;e[74]!==Q||e[75]!==h||e[76]!==z?(B=a(Z,{label:z,level:Q,testId:"dh-liveness",value:h}),e[74]=Q,e[75]=h,e[76]=z,e[77]=B):B=e[77];let U;e[78]!==t?(U=t("Readiness"),e[78]=t,e[79]=U):U=e[79];let q;e[80]!==T||e[81]!==t?(q=t(T?"Ready":"Not ready"),e[80]=T,e[81]=t,e[82]=q):q=e[82];let O;e[83]!==W||e[84]!==U||e[85]!==q?(O=a(Z,{label:U,level:W,testId:"dh-readiness",value:q}),e[83]=W,e[84]=U,e[85]=q,e[86]=O):O=e[86],e[87]!==B||e[88]!==O?(b=p("div",{className:"grid gap-3 sm:grid-cols-2","data-testid":"dh-probes",children:[B,O]}),e[87]=B,e[88]=O,e[89]=b):b=e[89],L=J,C="gap-0 py-0",E="dh-checks";let F;e[90]!==t?(F=t("Subsystem checks"),e[90]=t,e[91]=F):F=e[91],e[92]!==F?(k=a("header",{className:"border-b border-border px-4 py-3",children:a("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:F})}),e[92]=F,e[93]=k):k=e[93],S=s.length===0?a("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"dh-checks-empty",children:t("No checks reported.")}):a("ul",{className:"divide-y divide-border",children:s.map(x=>p("li",{className:"flex flex-wrap items-center justify-between gap-2 px-4 py-2.5 text-xs","data-testid":`dh-check-${x.name}`,children:[p("span",{className:"flex items-center gap-2",children:[a("span",{"aria-hidden":"true",className:se("size-1.5 shrink-0 rounded-full",x.status==="up"?"bg-success":"bg-destructive")}),a("span",{className:"font-mono text-foreground",children:x.name}),x.critical&&a(M,{variant:"outline",children:t("Critical")})]}),p("span",{className:"flex shrink-0 items-center gap-2",children:[x.message!==void 0&&a("span",{className:"text-muted-foreground",children:x.message}),a(M,{"data-testid":`dh-check-status-${x.name}`,variant:x.status==="up"?"secondary":"destructive",children:x.status==="up"?t("Up"):t("Down")})]})]},x.name))}),e[27]=l.appName,e[28]=l.appVersion,e[29]=l.checks,e[30]=l.timestamp,e[31]=Q,e[32]=W,e[33]=T,e[34]=h,e[35]=t,e[36]=L,e[37]=P,e[38]=_,e[39]=N,e[40]=v,e[41]=b,e[42]=C,e[43]=E,e[44]=k,e[45]=S}else L=e[36],P=e[37],_=e[38],N=e[39],v=e[40],b=e[41],C=e[42],E=e[43],k=e[44],S=e[45];let j;e[94]!==L||e[95]!==C||e[96]!==E||e[97]!==k||e[98]!==S?(j=p(L,{className:C,"data-testid":E,children:[k,S]}),e[94]=L,e[95]=C,e[96]=E,e[97]=k,e[98]=S,e[99]=j):j=e[99];let G;return e[100]!==P||e[101]!==_||e[102]!==N||e[103]!==v||e[104]!==b||e[105]!==j?(G=p("div",{className:P,"data-testid":_,children:[N,v,b,j]}),e[100]=P,e[101]=_,e[102]=N,e[103]=v,e[104]=b,e[105]=j,e[106]=G):G=e[106],G};function he(r,e){return r.name.localeCompare(e.name)}export{Pe as DeploymentHealthPanel};
1
+ import{c as ee}from"react/compiler-runtime";import{useQuery as re}from"@tanstack/react-query";import{B as M}from"../packem_shared/badge-r_5B4LHP.mjs";import{C as J}from"../packem_shared/card-By2O8ULa.mjs";import{E as ne}from"../packem_shared/empty-state-D7jEML_T.mjs";import{S as X}from"../packem_shared/skeleton-DX1gfixl.mjs";import{u as te}from"../packem_shared/use-studio-client-DCA50tF2.mjs";import{useT as ie}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{h as oe}from"../packem_shared/internal-BXEjuLPN.mjs";import{c as se}from"../packem_shared/utils-bhneXptQ.mjs";import{jsxs as p,jsx as a}from"react/jsx-runtime";const de="/_lunora/health",ce="/_lunora/health/ready",me=(r,e)=>(r.endsWith("/")?r.slice(0,-1):r)+e,pe=()=>{const r=te();return async e=>{const w=e==="ready"?ce:de,t=r.getAuthToken(),y=me(r.url,w);try{const i=await fetch(y,{headers:t===null?{}:{authorization:`Bearer ${t}`}});let u=null;try{u=await i.json()}catch{u=null}return{body:u,ok:i.ok,status:i.status}}catch(i){return{body:null,error:i instanceof Error?i.message:String(i),ok:!1,status:0}}}},ue={crit:"bg-destructive",ok:"bg-success",warn:"bg-warning"},fe=r=>r==="unhealthy"?"crit":r==="degraded"?"warn":"ok",Z=r=>{const e=ee(13),{label:w,level:t,testId:y,value:i}=r,u=ue[t];let o;e[0]!==u?(o=se("size-1.5 shrink-0 rounded-full",u),e[0]=u,e[1]=o):o=e[1];let d;e[2]!==o?(d=a("span",{"aria-hidden":"true",className:o}),e[2]=o,e[3]=d):d=e[3];let c;e[4]!==w||e[5]!==d?(c=p("span",{className:"flex items-center gap-1.5 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:[d,w]}),e[4]=w,e[5]=d,e[6]=c):c=e[6];let f;e[7]!==y||e[8]!==i?(f=a("span",{className:"text-lg font-semibold text-foreground","data-testid":y,children:i}),e[7]=y,e[8]=i,e[9]=f):f=e[9];let H;return e[10]!==c||e[11]!==f?(H=a(J,{className:"gap-0 py-0",children:p("div",{className:"flex flex-col gap-2.5 p-4",children:[c,f]})}),e[10]=c,e[11]=f,e[12]=H):H=e[12],H},_e=r=>{const e=ee(107),{probe:w}=r,t=ie(),y=te(),i=pe(),u=w??i;let o;e[0]!==u?(o=async()=>{const[s,n]=await Promise.all([u("live"),u("ready")]);return{live:s,ready:n}},e[0]=u,e[1]=o):o=e[1];let d;e[2]!==y?(d=y.clientIdentifier(),e[2]=y,e[3]=d):d=e[3];let c;e[4]!==d?(c=["deployment-health",d],e[4]=d,e[5]=c):c=e[5];let f;e[6]!==o||e[7]!==c?(f={queryFn:o,queryKey:c},e[6]=o,e[7]=c,e[8]=f):f=e[8];const{data:H,isPending:le}=re(f),K=H?.live??null,ae=H?.ready??null;if(le){let s;return e[9]===Symbol.for("react.memo_cache_sentinel")?(s=p("div",{className:"flex flex-col gap-4","data-testid":"deployment-health-loading",children:[a(X,{className:"h-16 w-full"}),a(X,{className:"h-40 w-full"})]}),e[9]=s):s=e[9],s}const l=K?.body??null;if(l===null){const s=K?.status===403;let n;e[10]!==s||e[11]!==K?.error||e[12]!==t?(n=s?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:K?.error??t("no response")}),e[10]=s,e[11]=K?.error,e[12]=t,e[13]=n):n=e[13];let m;e[14]!==t?(m=t("Health endpoint unavailable"),e[14]=t,e[15]=m):m=e[15];let g;return e[16]!==n||e[17]!==m?(g=a(ne,{description:n,testId:"deployment-health-error",title:m}),e[16]=n,e[17]=m,e[18]=g):g=e[18],g}let Y;e[19]!==l.status?(Y=fe(l.status),e[19]=l.status,e[20]=Y):Y=e[20];const Q=Y;let h;if(l.status==="unhealthy"){let s;e[21]!==t?(s=t("Unhealthy"),e[21]=t,e[22]=s):s=e[22],h=s}else if(l.status==="degraded"){let s;e[23]!==t?(s=t("Degraded"),e[23]=t,e[24]=s):s=e[24],h=s}else{let s;e[25]!==t?(s=t("Healthy"),e[25]=t,e[26]=s):s=e[26],h=s}const T=ae?.ok??!1,W=T?"ok":"crit";let P,_,C,N,v,b,L,E,k,S;if(e[27]!==l.appName||e[28]!==l.appVersion||e[29]!==l.checks||e[30]!==l.timestamp||e[31]!==Q||e[32]!==W||e[33]!==T||e[34]!==h||e[35]!==t){const s=[...l.checks].toSorted(he);_="flex flex-col gap-6",C="deployment-health";let n;e[46]!==t?(n=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[46]=t,e[47]=n):n=e[47],e[48]!==n?(N=a("p",{className:"text-sm text-muted-foreground",children:n}),e[48]=n,e[49]=N):N=e[49];let m;e[50]!==h?(m=a("span",{className:"text-sm font-semibold text-foreground","data-testid":"dh-status",children:h}),e[50]=h,e[51]=m):m=e[51];let g;e[52]!==l.appName||e[53]!==l.appVersion?(g=p("span",{className:"font-mono text-[13px] text-muted-foreground","data-testid":"dh-app",children:[l.appName," · ",l.appVersion]}),e[52]=l.appName,e[53]=l.appVersion,e[54]=g):g=e[54];let A;e[55]!==m||e[56]!==g?(A=a("div",{className:"flex items-center gap-3",children:p("div",{className:"grid leading-tight",children:[m,g]})}),e[55]=m,e[56]=g,e[57]=A):A=e[57];let D;e[58]!==t?(D=t("Checked"),e[58]=t,e[59]=D):D=e[59];let V;e[60]!==D?(V=a("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:D}),e[60]=D,e[61]=V):V=e[61];let I;e[62]!==l.timestamp?(I=oe(l.timestamp),e[62]=l.timestamp,e[63]=I):I=e[63];let R;e[64]!==I?(R=a("time",{className:"text-[13px] text-muted-foreground","data-testid":"dh-timestamp",children:I}),e[64]=I,e[65]=R):R=e[65];let $;e[66]!==V||e[67]!==R?($=p("div",{className:"text-end",children:[V,R]}),e[66]=V,e[67]=R,e[68]=$):$=e[68],e[69]!==A||e[70]!==$?(v=a(J,{className:"gap-0 py-0",children:p("div",{className:"flex flex-wrap items-center justify-between gap-4 p-4",children:[A,$]})}),e[69]=A,e[70]=$,e[71]=v):v=e[71];let z;e[72]!==t?(z=t("Liveness"),e[72]=t,e[73]=z):z=e[73];let B;e[74]!==Q||e[75]!==h||e[76]!==z?(B=a(Z,{label:z,level:Q,testId:"dh-liveness",value:h}),e[74]=Q,e[75]=h,e[76]=z,e[77]=B):B=e[77];let U;e[78]!==t?(U=t("Readiness"),e[78]=t,e[79]=U):U=e[79];let q;e[80]!==T||e[81]!==t?(q=t(T?"Ready":"Not ready"),e[80]=T,e[81]=t,e[82]=q):q=e[82];let O;e[83]!==W||e[84]!==U||e[85]!==q?(O=a(Z,{label:U,level:W,testId:"dh-readiness",value:q}),e[83]=W,e[84]=U,e[85]=q,e[86]=O):O=e[86],e[87]!==B||e[88]!==O?(b=p("div",{className:"grid gap-3 sm:grid-cols-2","data-testid":"dh-probes",children:[B,O]}),e[87]=B,e[88]=O,e[89]=b):b=e[89],P=J,L="gap-0 py-0",E="dh-checks";let F;e[90]!==t?(F=t("Subsystem checks"),e[90]=t,e[91]=F):F=e[91],e[92]!==F?(k=a("header",{className:"border-b border-border px-4 py-3",children:a("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:F})}),e[92]=F,e[93]=k):k=e[93],S=s.length===0?a("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"dh-checks-empty",children:t("No checks reported.")}):a("ul",{className:"divide-y divide-border",children:s.map(x=>p("li",{className:"flex flex-wrap items-center justify-between gap-2 px-4 py-2.5 text-xs","data-testid":`dh-check-${x.name}`,children:[p("span",{className:"flex items-center gap-2",children:[a("span",{"aria-hidden":"true",className:se("size-1.5 shrink-0 rounded-full",x.status==="up"?"bg-success":"bg-destructive")}),a("span",{className:"font-mono text-foreground",children:x.name}),x.critical&&a(M,{variant:"outline",children:t("Critical")})]}),p("span",{className:"flex shrink-0 items-center gap-2",children:[x.message!==void 0&&a("span",{className:"text-muted-foreground",children:x.message}),a(M,{"data-testid":`dh-check-status-${x.name}`,variant:x.status==="up"?"secondary":"destructive",children:x.status==="up"?t("Up"):t("Down")})]})]},x.name))}),e[27]=l.appName,e[28]=l.appVersion,e[29]=l.checks,e[30]=l.timestamp,e[31]=Q,e[32]=W,e[33]=T,e[34]=h,e[35]=t,e[36]=P,e[37]=_,e[38]=C,e[39]=N,e[40]=v,e[41]=b,e[42]=L,e[43]=E,e[44]=k,e[45]=S}else P=e[36],_=e[37],C=e[38],N=e[39],v=e[40],b=e[41],L=e[42],E=e[43],k=e[44],S=e[45];let j;e[94]!==P||e[95]!==L||e[96]!==E||e[97]!==k||e[98]!==S?(j=p(P,{className:L,"data-testid":E,children:[k,S]}),e[94]=P,e[95]=L,e[96]=E,e[97]=k,e[98]=S,e[99]=j):j=e[99];let G;return e[100]!==_||e[101]!==C||e[102]!==N||e[103]!==v||e[104]!==b||e[105]!==j?(G=p("div",{className:_,"data-testid":C,children:[N,v,b,j]}),e[100]=_,e[101]=C,e[102]=N,e[103]=v,e[104]=b,e[105]=j,e[106]=G):G=e[106],G};function he(r,e){return r.name.localeCompare(e.name)}export{_e as DeploymentHealthPanel};
@@ -1,8 +1,8 @@
1
- import{c as xe}from"react/compiler-runtime";import{LunoraError as K}from"@lunora/errors";import{useLunora as ve}from"@lunora/react";import{encodeWire as X,decodeWire as ye}from"@lunora/wire";import{useState as S}from"react";import{ConfirmButton as be}from"../packem_shared/ConfirmButton-DU4p72Er.mjs";import{ShardInput as Ne}from"../packem_shared/ShardInput-C6mjgAh4.mjs";import{B as W}from"../packem_shared/button-q0UYSmrn.mjs";import{C as J,a as Y}from"../packem_shared/card-By2O8ULa.mjs";import{c as Ce,S as ke,a as Ee,b as Te,d as Ie}from"../packem_shared/select-DPyS18Vy.mjs";import{b as Se,u as Re}from"../packem_shared/use-admin-query-CLStXJ7v.mjs";import{useT as re}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as _}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{f as Z,d as O,b as F,c as A}from"../packem_shared/internal-BXEjuLPN.mjs";import{r as G}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{d as _e}from"../packem_shared/grid-features-8DoaKdS1.mjs";import{jsxs as E,jsx as m}from"react/jsx-runtime";class R extends Error{problem;constructor(e){super(e.kind),this.name="CsvFormatError",this.problem=e}}const Oe="\uFEFF",Le=()=>{let t=[],e=1,n=!1,r=!1,o="start",s="";const i=()=>{t.push(o==="closing"||s!==""?s:void 0),o="start",s=""},c=l=>{i(),t.some(a=>a!==void 0)&&l.push({cells:t,number:e}),t=[],e+=1},d=(l,a)=>{const u=n;if(n=!1,!(u&&l===`
1
+ import{c as xe}from"react/compiler-runtime";import{LunoraError as K}from"@lunora/errors";import{encodeWire as X,decodeWire as ve}from"@lunora/wire";import{useState as S}from"react";import{ConfirmButton as ye}from"../packem_shared/ConfirmButton-CIXYF6Mg.mjs";import{ShardInput as be}from"../packem_shared/ShardInput-CoySruKZ.mjs";import{B as W}from"../packem_shared/button-q0UYSmrn.mjs";import{C as J,a as Y}from"../packem_shared/card-By2O8ULa.mjs";import{c as Ne,S as Ce,a as ke,b as Ee,d as Te}from"../packem_shared/select-DPyS18Vy.mjs";import{b as Ie,u as Se}from"../packem_shared/use-admin-query-BW9IuacC.mjs";import{u as Re}from"../packem_shared/use-studio-client-DCA50tF2.mjs";import{useT as re}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{ADMIN_FUNCTIONS as _}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{f as Z,d as O,b as L,c as A}from"../packem_shared/internal-BXEjuLPN.mjs";import{r as G}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{d as _e}from"../packem_shared/grid-features-2c5SaBtH.mjs";import{jsxs as E,jsx as m}from"react/jsx-runtime";class R extends Error{problem;constructor(e){super(e.kind),this.name="CsvFormatError",this.problem=e}}const Oe="\uFEFF",Fe=()=>{let t=[],e=1,n=!1,r=!1,o="start",s="";const i=()=>{t.push(o==="closing"||s!==""?s:void 0),o="start",s=""},c=l=>{i(),t.some(a=>a!==void 0)&&l.push({cells:t,number:e}),t=[],e+=1},d=(l,a)=>{const u=n;if(n=!1,!(u&&l===`
2
2
  `)){if(o==="quoted"){l==='"'?o="closing":s+=l;return}if(o==="closing"&&l==='"'){s+=l,o="quoted";return}if(l===","){i();return}if(l==="\r"){c(a),n=!0;return}if(l===`
3
- `){c(a);return}if(o==="closing")throw new R({kind:"text-after-quote",record:e});if(o==="start"&&l==='"'){o="quoted";return}o="unquoted",s+=l}};return{finish:()=>{if(o==="quoted")throw new R({kind:"unterminated-quote",record:e});const l=[];return c(l),l},push:l=>{const a=[];let u=0;for(!r&&l!==""&&(r=!0,u=l.startsWith(Oe)?1:0);u<l.length;u+=1)d(l.charAt(u),a);return a}}},oe=async function*(t){const e=Le();for await(const n of t)yield*e.push(n);yield*e.finish()},D=(t,e,n)=>{Object.defineProperty(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0})},se=t=>{const e=[],n=new Set;return t.forEach((r,o)=>{const s=(r??"").trim();if(s==="")throw new R({column:o+1,kind:"empty-header"});if(n.has(s))throw new R({kind:"duplicate-header",name:s});n.add(s),e.push(s)}),e},ie=({cells:t,number:e},n,r)=>{if(t.length!==n.length)throw new R({expected:n.length,found:t.length,kind:"ragged",record:e});const o={};return n.forEach((s,i)=>{const c=t[i];c!==void 0?D(o,s,c):r.has(s)&&D(o,s,null)}),{doc:o,record:e}},Fe=/^-?\d+$/u,je=/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/iu,De=/^-?\d{11,}$/u,Ae=/^(\d{4})-(\d{2})-(\d{2})$/u,$e=/^(\d{2}):(\d{2})(?::(\d{2})(?:\.\d+)?)?(Z|[+-]\d{2}:\d{2})?$/u,Be=/\.(\d+)/u,Pe=/[1-9]/u,Me=/^[+-]?(\d*)(?:\.(\d*))?(?:e([+-]?\d+))?$/iu,z=t=>{const[,e="",n="",r="0"]=Me.exec(t)??[],o=`${e}${n}`;let s=0,i=o.length;for(;s<i&&o.charAt(s)==="0";)s+=1;for(;i>s&&o.charAt(i-1)==="0";)i-=1;return s===i?{digits:"",exponent:0}:{digits:o.slice(s,i),exponent:Number(r)-n.length+(o.length-i)}},qe=(t,e)=>{const n=z(t),r=z(e.toExponential());return n.digits===r.digits&&n.exponent===r.exponent?!0:n.digits!==""&&n.exponent>=0&&Number.isInteger(e)&&BigInt(n.digits)*10n**BigInt(n.exponent)===BigInt(Math.abs(e))},Ke=t=>{const e=t.trim();if(!je.test(e))return;const n=Number(e);if(Number.isFinite(n))return qe(e,n)?{number:n}:{inexact:!0}},Xe=(t,e,n)=>{const r=new Date(0);return r.setUTCFullYear(t,e-1,n),r.getUTCMonth()===e-1&&r.getUTCDate()===n},Ue=(t,e,n,r)=>Number(t)<=23&&Number(e)<=59&&Number(n)<=59&&(r==="Z"||Number(r.slice(1,3))<=23&&Number(r.slice(4,6))<=59),Ve=t=>{const[e="",n,...r]=t.split("T"),o=Ae.exec(e),s=n===void 0?void 0:$e.exec(n);if(o===null||r.length>0||n!==void 0&&s===null)return;const[,i="",c="",d=""]=o;if(!Xe(Number(i),Number(c),Number(d)))return;const[,l="0",a="0",u="0",y]=s??[];if(!Ue(l,a,u,y??"Z"))return;const p=Be.exec(n??"")?.[1]??"";if(Pe.test(p.slice(3)))return;const h=Date.parse(s!==void 0&&y===void 0?`${t}Z`:t);return Number.isFinite(h)?h:void 0},He=t=>{const e=Ke(t);return e===void 0?{expected:"number",kind:"rejected"}:"number"in e?{kind:"ok",value:e.number}:{expected:"number",inexact:!0,kind:"rejected"}},We=t=>{const e=t.trim();let n=Ve(e);return n===void 0&&De.test(e)&&(n=Number(e)),n===void 0||!Number.isFinite(new Date(n).getTime())?{expected:"date",kind:"rejected"}:{kind:"ok",value:n}},Je=t=>{try{return X(t),!0}catch{return!1}},Ye=(t,e)=>{if(e==="bigint"){const n=t.trim();if(!Fe.test(n))return{expected:"bigint",kind:"rejected"};const r=BigInt(n);return Je(r)?{kind:"ok",value:r}:{expected:"bigint",kind:"rejected",tooLong:!0}}if(e==="boolean"){const n=t.trim().toLowerCase();return n==="true"||n==="false"?{kind:"ok",value:n==="true"}:{expected:"boolean",kind:"rejected"}}return e==="number"?He(t):e==="date"||e==="timestamp"?We(t):{kind:"ok",value:t}},le=({doc:t,record:e},n)=>{const r={};for(const[o,s]of Object.entries(t)){if(s===null){D(r,o,null);continue}const i=Ye(s,n.get(o));if(i.kind==="rejected")throw new R({column:o,expected:i.expected,...i.inexact===!0&&{inexact:!0},kind:"cell-type",record:e,...i.tooLong===!0&&{tooLong:!0},value:s});D(r,o,i.value)}return{doc:r,record:e}},Ze=async function*(t,e,n){let r;for await(const o of oe(t))r===void 0?r=se(o.cells):yield le(ie(o,r,n),e)},Ge=t=>new Set(t.filter(e=>e.nullable===!0&&!e.optional).map(e=>e.name)),Q=t=>{if(t instanceof R)return t;throw t},ze=async(t,e,n,r)=>{let o,s,i;for await(const d of oe(t)){if(o===void 0){try{o=se(d.cells)}catch(a){s=Q(a),o=[]}continue}let l;try{l=le(ie(d,o,n),e)}catch(a){i??=Q(a);continue}r(l)}const c=s??i;if(c!==void 0)throw c},Qe=A(_.exportShard),M=A(_.importShard),et=A(_.listTables),tt=A(_.describeTable),nt={},rt=t=>t.map(e=>JSON.stringify(X(e))).join(`
4
- `),ot=(t,e)=>{const n=t.trim();if(n==="")return;const r=ye(JSON.parse(n));if(typeof r!="object"||r===null)throw new K("INTERNAL",`line ${e.toString()}: expected a { table, doc } object`);const o=r;if(typeof o.table!="string"||typeof o.doc!="object"||o.doc===null||Array.isArray(o.doc))throw new K("INTERNAL",`line ${e.toString()}: expected a { table, doc } object`);return o},ee=1024*1024,U=async function*(t){const e=new TextDecoder("utf-8",{fatal:!0});for(let r=0;r<t.size;r+=ee){const o=await t.slice(r,r+ee).arrayBuffer();yield e.decode(o,{stream:!0})}const n=e.decode();n!==""&&(yield n)},st=async function*(t){let e="",n=0;for await(const r of U(t)){const o=`${e}${r}`.split(`
5
- `);e=o.pop()??"";for(const s of o)n+=1,yield{line:s,lineNumber:n}}e!==""&&(yield{line:e,lineNumber:n+1})},it=async function*(t){for await(const{line:e,lineNumber:n}of st(t)){const r=ot(e,n);r!==void 0&&(yield{line:n,row:r})}},lt=async function*(t,e,n,r){for await(const{doc:o,record:s}of Ze(U(t),n,r))yield{line:s,row:{doc:o,table:e}}},at=async(t,e,n,r)=>{try{const{columns:o}=await t.query(tt,{table:r},O(n));return{kinds:new Map(o.map(s=>[s.name,s.type])),nullOnEmpty:Ge(o)}}catch(o){return{failure:e("Couldn't read the columns of {table}: {message}",{message:F(o),table:r})}}},te=50,ct=500,$=9e5,V=t=>new TextEncoder().encode(JSON.stringify(X(t))).byteLength,q="application/x-ndjson",ae=t=>new K("INTERNAL",`line ${t.toString()}: a single row is over the ${$.toString()}-byte import limit`),dt=async t=>{let e=0;for await(const{line:n,row:r}of t){if(V(r)>$)throw ae(n);e+=1}return e},ut=async(t,e,n,r)=>{const o={rows:0};if(await ze(U(t),n,r,({doc:s,record:i})=>{o.rows+=1,o.wide===void 0&&V({doc:s,table:e})>$&&(o.wide=i)}),o.wide!==void 0)throw ae(o.wide);return o.rows},ne=async(t,e)=>{let n=[],r=0,o=0,s=0;for await(const{line:i,row:c}of t){const d=V(c),l=i!==s+1;n.length>0&&(l||n.length===ct||r+d>$)&&(await e(n,o),n=[],r=0),n.length===0&&(o=i),n.push(c),r+=d,s=i}n.length>0&&await e(n,o)},ft=/\.csv$/iu,mt=t=>ft.test(t.name)||t.type==="text/csv",ht=(t,e)=>t.expected==="boolean"?e("line {line}: column “{column}” must be true or false, got “{value}”.",{column:t.column,line:t.record,value:t.value}):t.tooLong===!0?e("line {line}: column “{column}” holds an integer longer than the import can send.",{column:t.column,line:t.record}):t.expected==="bigint"?e("line {line}: column “{column}” must be an integer, got “{value}”.",{column:t.column,line:t.record,value:t.value}):t.expected==="date"?e("line {line}: column “{column}” must be an ISO-8601 date or epoch milliseconds of at least 11 digits, got “{value}”.",{column:t.column,line:t.record,value:t.value}):t.inexact===!0?e("line {line}: column “{column}” holds “{value}”, which a number column cannot store exactly. Store a whole number past 9007199254740991 in a bigint column.",{column:t.column,line:t.record,value:t.value}):e("line {line}: column “{column}” must be a number, got “{value}”.",{column:t.column,line:t.record,value:t.value}),pt=(t,e)=>t.kind==="duplicate-header"?e("The header “{name}” appears more than once.",{name:t.name}):t.kind==="empty-header"?e("Header column {column} is empty.",{column:t.column}):t.kind==="ragged"?e("line {line}: expected {expected} cells, found {found}.",{expected:t.expected,found:t.found,line:t.record}):t.kind==="cell-type"?ht(t,e):t.kind==="text-after-quote"?e("line {line}: text follows a closing quote.",{line:t.record}):e("line {line}: a quoted field is never closed.",{line:t.record}),wt=(t,e,n)=>{const r=e instanceof R?pt(e.problem,n):F(e);return t===null?n("Invalid NDJSON: {message}",{message:r}):n("Invalid CSV: {message}",{message:r})},gt=t=>{const e=xe(31),{onChange:n,shardKey:r,value:o}=t,s=re();let i;e[0]!==r?(i={shardKey:r},e[0]=r,e[1]=i):i=e[1];const{data:c}=Re(_.listTables,nt,i);let d;e[2]!==n?(d=C=>{n(C??"")},e[2]=n,e[3]=d):d=e[3];let l;e[4]!==s?(l=s("Target table"),e[4]=s,e[5]=l):l=e[5];let a;e[6]!==s?(a=s("Choose a table"),e[6]=s,e[7]=a):a=e[7];let u;e[8]!==a?(u=m(ke,{placeholder:a}),e[8]=a,e[9]=u):u=e[9];let y;e[10]!==l||e[11]!==u?(y=m(Ee,{"aria-label":l,className:"w-56","data-testid":"ei-csv-table",children:u}),e[10]=l,e[11]=u,e[12]=y):y=e[12];let p;e[13]!==c?(p=c??[],e[13]=c,e[14]=p):p=e[14];let h;e[15]!==p?(h=p.map(vt),e[15]=p,e[16]=h):h=e[16];let g;e[17]!==h?(g=m(Te,{children:h}),e[17]=h,e[18]=g):g=e[18];let N;e[19]!==d||e[20]!==y||e[21]!==g||e[22]!==o?(N=E(Ie,{onValueChange:d,value:o,children:[y,g]}),e[19]=d,e[20]=y,e[21]=g,e[22]=o,e[23]=N):N=e[23];let b;e[24]!==s?(b=s("CSV rows have no table column, so choose the table they go into."),e[24]=s,e[25]=b):b=e[25];let w;e[26]!==b?(w=m("p",{className:"text-xs text-muted-foreground",children:b}),e[26]=b,e[27]=w):w=e[27];let f;return e[28]!==N||e[29]!==w?(f=E("div",{className:"flex flex-col gap-1.5",children:[N,w]}),e[28]=N,e[29]=w,e[30]=f):f=e[30],f},ce=t=>Object.values(t).reduce((e,n)=>e+n,0),xt=async(t,e,n,r,o,s)=>{const i={conflicts:0,errors:[],inserted:{}};let c;const d=s===null?{kinds:new Map,nullOnEmpty:new Set}:await at(t,e,n,s);if("failure"in d)return{failure:{message:d.failure,rows:0},total:i};const{kinds:l,nullOnEmpty:a}=d;try{if(s===null){const f=()=>it(o);c={rows:await dt(f()),source:f}}else c={rows:await ut(o,s,l,a),source:()=>lt(o,s,l,a)}}catch(f){return{failure:{message:wt(s,f,e),rows:0},total:i}}const{rows:u,source:y}=c;if(s!==null&&u===0)return{failure:{message:e("The CSV has no data rows after the header."),rows:0},total:i};const p={conflicts:0,errors:[],inserted:{}};r(e("Checking {total} rows before writing…",{total:u}));try{if((await t.query(M,{dryRun:!0,rows:[],startLine:1},O(n))).dryRun!==!0)return{failure:{message:e("This shard predates import checks, so it would write the file while checking it. Nothing was sent. Update the app and import again."),rows:0},total:i};await ne(y(),async(C,k)=>{const T=await t.query(M,{dryRun:!0,rows:C,startLine:k},O(n));p.errors.push(...T.errors)})}catch(f){return{failure:{message:F(f),rows:0},total:i}}if(p.errors.length>0)return{failure:{message:e("Nothing was written, because some rows would be refused. Fix the rows listed below and import again."),rows:0},total:p};let h=0,g=1;const N={},b={},w=async(f,C)=>{r(e("Importing rows {from}–{to} of {total}…",{from:h+1,to:h+f.length,total:u})),b.startLine=C;const k=await t.query(M,{dryRun:!1,rows:f,startLine:C},O(n));b.startLine=void 0,i.conflicts+=k.conflicts,i.errors.push(...k.errors);for(const[T,B]of Object.entries(k.inserted))i.inserted[T]=(i.inserted[T]??0)+B;if(h+=f.length,g=C+f.length,k.errors.length>0){const T=ce(i.inserted);throw N.refused=!0,new Error(T===0?e("The shard refused {count} rows, so the rest of the file was not sent. Nothing was written. Fix the rows listed below and import again.",{count:k.errors.length}):e("The shard refused {count} rows, so the rest of the file was not sent. {written} rows were already written, so do not import the whole file again. Import the refused rows and any rows from line {line} onward, or delete the written rows first and then import the whole file.",{count:k.errors.length,line:C+f.length,written:T}))}};try{return await ne(y(),w),{failure:void 0,total:i}}catch(f){return{failure:{message:F(f),nextLine:g,rows:h,unknownFrom:b.startLine,...N},total:i}}},$t=({initialShardKey:t})=>{const e=ve(),n=Se(),r=re(),[o,s]=S(t??""),[i,c]=S(null),[d,l]=S(null),[a,u]=S(!1),[y,p]=S(null),[h,g]=S(null),[N,b]=S(null),[w,f]=S(null),C=i!==null&&mt(i),k=d!==null&&d.shardKey===o?d.table:"",T=i!==null&&(!C||k!==""),B=async()=>{const x=o;u(!0),p(null),g(null),f(null);try{const L=await e.query(et,{},O(x));let v=new Blob([],{type:q}),I=0;const j=[];for(const{name:ge}of L){const{rows:P}=await e.query(Qe,{tables:[ge]},O(x));if(P.length===0)continue;const H=rt(P);v=new Blob([v,`${H}
3
+ `){c(a);return}if(o==="closing")throw new R({kind:"text-after-quote",record:e});if(o==="start"&&l==='"'){o="quoted";return}o="unquoted",s+=l}};return{finish:()=>{if(o==="quoted")throw new R({kind:"unterminated-quote",record:e});const l=[];return c(l),l},push:l=>{const a=[];let u=0;for(!r&&l!==""&&(r=!0,u=l.startsWith(Oe)?1:0);u<l.length;u+=1)d(l.charAt(u),a);return a}}},oe=async function*(t){const e=Fe();for await(const n of t)yield*e.push(n);yield*e.finish()},D=(t,e,n)=>{Object.defineProperty(t,e,{configurable:!0,enumerable:!0,value:n,writable:!0})},se=t=>{const e=[],n=new Set;return t.forEach((r,o)=>{const s=(r??"").trim();if(s==="")throw new R({column:o+1,kind:"empty-header"});if(n.has(s))throw new R({kind:"duplicate-header",name:s});n.add(s),e.push(s)}),e},ie=({cells:t,number:e},n,r)=>{if(t.length!==n.length)throw new R({expected:n.length,found:t.length,kind:"ragged",record:e});const o={};return n.forEach((s,i)=>{const c=t[i];c!==void 0?D(o,s,c):r.has(s)&&D(o,s,null)}),{doc:o,record:e}},Le=/^-?\d+$/u,je=/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/iu,De=/^-?\d{11,}$/u,Ae=/^(\d{4})-(\d{2})-(\d{2})$/u,$e=/^(\d{2}):(\d{2})(?::(\d{2})(?:\.\d+)?)?(Z|[+-]\d{2}:\d{2})?$/u,Be=/\.(\d+)/u,Pe=/[1-9]/u,Me=/^[+-]?(\d*)(?:\.(\d*))?(?:e([+-]?\d+))?$/iu,z=t=>{const[,e="",n="",r="0"]=Me.exec(t)??[],o=`${e}${n}`;let s=0,i=o.length;for(;s<i&&o.charAt(s)==="0";)s+=1;for(;i>s&&o.charAt(i-1)==="0";)i-=1;return s===i?{digits:"",exponent:0}:{digits:o.slice(s,i),exponent:Number(r)-n.length+(o.length-i)}},qe=(t,e)=>{const n=z(t),r=z(e.toExponential());return n.digits===r.digits&&n.exponent===r.exponent?!0:n.digits!==""&&n.exponent>=0&&Number.isInteger(e)&&BigInt(n.digits)*10n**BigInt(n.exponent)===BigInt(Math.abs(e))},Ke=t=>{const e=t.trim();if(!je.test(e))return;const n=Number(e);if(Number.isFinite(n))return qe(e,n)?{number:n}:{inexact:!0}},Xe=(t,e,n)=>{const r=new Date(0);return r.setUTCFullYear(t,e-1,n),r.getUTCMonth()===e-1&&r.getUTCDate()===n},Ue=(t,e,n,r)=>Number(t)<=23&&Number(e)<=59&&Number(n)<=59&&(r==="Z"||Number(r.slice(1,3))<=23&&Number(r.slice(4,6))<=59),Ve=t=>{const[e="",n,...r]=t.split("T"),o=Ae.exec(e),s=n===void 0?void 0:$e.exec(n);if(o===null||r.length>0||n!==void 0&&s===null)return;const[,i="",c="",d=""]=o;if(!Xe(Number(i),Number(c),Number(d)))return;const[,l="0",a="0",u="0",y]=s??[];if(!Ue(l,a,u,y??"Z"))return;const p=Be.exec(n??"")?.[1]??"";if(Pe.test(p.slice(3)))return;const h=Date.parse(s!==void 0&&y===void 0?`${t}Z`:t);return Number.isFinite(h)?h:void 0},He=t=>{const e=Ke(t);return e===void 0?{expected:"number",kind:"rejected"}:"number"in e?{kind:"ok",value:e.number}:{expected:"number",inexact:!0,kind:"rejected"}},We=t=>{const e=t.trim();let n=Ve(e);return n===void 0&&De.test(e)&&(n=Number(e)),n===void 0||!Number.isFinite(new Date(n).getTime())?{expected:"date",kind:"rejected"}:{kind:"ok",value:n}},Je=t=>{try{return X(t),!0}catch{return!1}},Ye=(t,e)=>{if(e==="bigint"){const n=t.trim();if(!Le.test(n))return{expected:"bigint",kind:"rejected"};const r=BigInt(n);return Je(r)?{kind:"ok",value:r}:{expected:"bigint",kind:"rejected",tooLong:!0}}if(e==="boolean"){const n=t.trim().toLowerCase();return n==="true"||n==="false"?{kind:"ok",value:n==="true"}:{expected:"boolean",kind:"rejected"}}return e==="number"?He(t):e==="date"||e==="timestamp"?We(t):{kind:"ok",value:t}},le=({doc:t,record:e},n)=>{const r={};for(const[o,s]of Object.entries(t)){if(s===null){D(r,o,null);continue}const i=Ye(s,n.get(o));if(i.kind==="rejected")throw new R({column:o,expected:i.expected,...i.inexact===!0&&{inexact:!0},kind:"cell-type",record:e,...i.tooLong===!0&&{tooLong:!0},value:s});D(r,o,i.value)}return{doc:r,record:e}},Ze=async function*(t,e,n){let r;for await(const o of oe(t))r===void 0?r=se(o.cells):yield le(ie(o,r,n),e)},Ge=t=>new Set(t.filter(e=>e.nullable===!0&&!e.optional).map(e=>e.name)),Q=t=>{if(t instanceof R)return t;throw t},ze=async(t,e,n,r)=>{let o,s,i;for await(const d of oe(t)){if(o===void 0){try{o=se(d.cells)}catch(a){s=Q(a),o=[]}continue}let l;try{l=le(ie(d,o,n),e)}catch(a){i??=Q(a);continue}r(l)}const c=s??i;if(c!==void 0)throw c},Qe=A(_.exportShard),M=A(_.importShard),et=A(_.listTables),tt=A(_.describeTable),nt={},rt=t=>t.map(e=>JSON.stringify(X(e))).join(`
4
+ `),ot=(t,e)=>{const n=t.trim();if(n==="")return;const r=ve(JSON.parse(n));if(typeof r!="object"||r===null)throw new K("INTERNAL",`line ${e.toString()}: expected a { table, doc } object`);const o=r;if(typeof o.table!="string"||typeof o.doc!="object"||o.doc===null||Array.isArray(o.doc))throw new K("INTERNAL",`line ${e.toString()}: expected a { table, doc } object`);return o},ee=1024*1024,U=async function*(t){const e=new TextDecoder("utf-8",{fatal:!0});for(let r=0;r<t.size;r+=ee){const o=await t.slice(r,r+ee).arrayBuffer();yield e.decode(o,{stream:!0})}const n=e.decode();n!==""&&(yield n)},st=async function*(t){let e="",n=0;for await(const r of U(t)){const o=`${e}${r}`.split(`
5
+ `);e=o.pop()??"";for(const s of o)n+=1,yield{line:s,lineNumber:n}}e!==""&&(yield{line:e,lineNumber:n+1})},it=async function*(t){for await(const{line:e,lineNumber:n}of st(t)){const r=ot(e,n);r!==void 0&&(yield{line:n,row:r})}},lt=async function*(t,e,n,r){for await(const{doc:o,record:s}of Ze(U(t),n,r))yield{line:s,row:{doc:o,table:e}}},at=async(t,e,n,r)=>{try{const{columns:o}=await t.query(tt,{table:r},O(n));return{kinds:new Map(o.map(s=>[s.name,s.type])),nullOnEmpty:Ge(o)}}catch(o){return{failure:e("Couldn't read the columns of {table}: {message}",{message:L(o),table:r})}}},te=50,ct=500,$=9e5,V=t=>new TextEncoder().encode(JSON.stringify(X(t))).byteLength,q="application/x-ndjson",ae=t=>new K("INTERNAL",`line ${t.toString()}: a single row is over the ${$.toString()}-byte import limit`),dt=async t=>{let e=0;for await(const{line:n,row:r}of t){if(V(r)>$)throw ae(n);e+=1}return e},ut=async(t,e,n,r)=>{const o={rows:0};if(await ze(U(t),n,r,({doc:s,record:i})=>{o.rows+=1,o.wide===void 0&&V({doc:s,table:e})>$&&(o.wide=i)}),o.wide!==void 0)throw ae(o.wide);return o.rows},ne=async(t,e)=>{let n=[],r=0,o=0,s=0;for await(const{line:i,row:c}of t){const d=V(c),l=i!==s+1;n.length>0&&(l||n.length===ct||r+d>$)&&(await e(n,o),n=[],r=0),n.length===0&&(o=i),n.push(c),r+=d,s=i}n.length>0&&await e(n,o)},ft=/\.csv$/iu,mt=t=>ft.test(t.name)||t.type==="text/csv",ht=(t,e)=>t.expected==="boolean"?e("line {line}: column “{column}” must be true or false, got “{value}”.",{column:t.column,line:t.record,value:t.value}):t.tooLong===!0?e("line {line}: column “{column}” holds an integer longer than the import can send.",{column:t.column,line:t.record}):t.expected==="bigint"?e("line {line}: column “{column}” must be an integer, got “{value}”.",{column:t.column,line:t.record,value:t.value}):t.expected==="date"?e("line {line}: column “{column}” must be an ISO-8601 date or epoch milliseconds of at least 11 digits, got “{value}”.",{column:t.column,line:t.record,value:t.value}):t.inexact===!0?e("line {line}: column “{column}” holds “{value}”, which a number column cannot store exactly. Store a whole number past 9007199254740991 in a bigint column.",{column:t.column,line:t.record,value:t.value}):e("line {line}: column “{column}” must be a number, got “{value}”.",{column:t.column,line:t.record,value:t.value}),pt=(t,e)=>t.kind==="duplicate-header"?e("The header “{name}” appears more than once.",{name:t.name}):t.kind==="empty-header"?e("Header column {column} is empty.",{column:t.column}):t.kind==="ragged"?e("line {line}: expected {expected} cells, found {found}.",{expected:t.expected,found:t.found,line:t.record}):t.kind==="cell-type"?ht(t,e):t.kind==="text-after-quote"?e("line {line}: text follows a closing quote.",{line:t.record}):e("line {line}: a quoted field is never closed.",{line:t.record}),wt=(t,e,n)=>{const r=e instanceof R?pt(e.problem,n):L(e);return t===null?n("Invalid NDJSON: {message}",{message:r}):n("Invalid CSV: {message}",{message:r})},gt=t=>{const e=xe(31),{onChange:n,shardKey:r,value:o}=t,s=re();let i;e[0]!==r?(i={shardKey:r},e[0]=r,e[1]=i):i=e[1];const{data:c}=Se(_.listTables,nt,i);let d;e[2]!==n?(d=C=>{n(C??"")},e[2]=n,e[3]=d):d=e[3];let l;e[4]!==s?(l=s("Target table"),e[4]=s,e[5]=l):l=e[5];let a;e[6]!==s?(a=s("Choose a table"),e[6]=s,e[7]=a):a=e[7];let u;e[8]!==a?(u=m(Ce,{placeholder:a}),e[8]=a,e[9]=u):u=e[9];let y;e[10]!==l||e[11]!==u?(y=m(ke,{"aria-label":l,className:"w-56","data-testid":"ei-csv-table",children:u}),e[10]=l,e[11]=u,e[12]=y):y=e[12];let p;e[13]!==c?(p=c??[],e[13]=c,e[14]=p):p=e[14];let h;e[15]!==p?(h=p.map(vt),e[15]=p,e[16]=h):h=e[16];let g;e[17]!==h?(g=m(Ee,{children:h}),e[17]=h,e[18]=g):g=e[18];let N;e[19]!==d||e[20]!==y||e[21]!==g||e[22]!==o?(N=E(Te,{onValueChange:d,value:o,children:[y,g]}),e[19]=d,e[20]=y,e[21]=g,e[22]=o,e[23]=N):N=e[23];let b;e[24]!==s?(b=s("CSV rows have no table column, so choose the table they go into."),e[24]=s,e[25]=b):b=e[25];let w;e[26]!==b?(w=m("p",{className:"text-xs text-muted-foreground",children:b}),e[26]=b,e[27]=w):w=e[27];let f;return e[28]!==N||e[29]!==w?(f=E("div",{className:"flex flex-col gap-1.5",children:[N,w]}),e[28]=N,e[29]=w,e[30]=f):f=e[30],f},ce=t=>Object.values(t).reduce((e,n)=>e+n,0),xt=async(t,e,n,r,o,s)=>{const i={conflicts:0,errors:[],inserted:{}};let c;const d=s===null?{kinds:new Map,nullOnEmpty:new Set}:await at(t,e,n,s);if("failure"in d)return{failure:{message:d.failure,rows:0},total:i};const{kinds:l,nullOnEmpty:a}=d;try{if(s===null){const f=()=>it(o);c={rows:await dt(f()),source:f}}else c={rows:await ut(o,s,l,a),source:()=>lt(o,s,l,a)}}catch(f){return{failure:{message:wt(s,f,e),rows:0},total:i}}const{rows:u,source:y}=c;if(s!==null&&u===0)return{failure:{message:e("The CSV has no data rows after the header."),rows:0},total:i};const p={conflicts:0,errors:[],inserted:{}};r(e("Checking {total} rows before writing…",{total:u}));try{if((await t.query(M,{dryRun:!0,rows:[],startLine:1},O(n))).dryRun!==!0)return{failure:{message:e("This shard predates import checks, so it would write the file while checking it. Nothing was sent. Update the app and import again."),rows:0},total:i};await ne(y(),async(C,k)=>{const T=await t.query(M,{dryRun:!0,rows:C,startLine:k},O(n));p.errors.push(...T.errors)})}catch(f){return{failure:{message:L(f),rows:0},total:i}}if(p.errors.length>0)return{failure:{message:e("Nothing was written, because some rows would be refused. Fix the rows listed below and import again."),rows:0},total:p};let h=0,g=1;const N={},b={},w=async(f,C)=>{r(e("Importing rows {from}–{to} of {total}…",{from:h+1,to:h+f.length,total:u})),b.startLine=C;const k=await t.query(M,{dryRun:!1,rows:f,startLine:C},O(n));b.startLine=void 0,i.conflicts+=k.conflicts,i.errors.push(...k.errors);for(const[T,B]of Object.entries(k.inserted))i.inserted[T]=(i.inserted[T]??0)+B;if(h+=f.length,g=C+f.length,k.errors.length>0){const T=ce(i.inserted);throw N.refused=!0,new Error(T===0?e("The shard refused {count} rows, so the rest of the file was not sent. Nothing was written. Fix the rows listed below and import again.",{count:k.errors.length}):e("The shard refused {count} rows, so the rest of the file was not sent. {written} rows were already written, so do not import the whole file again. Import the refused rows and any rows from line {line} onward, or delete the written rows first and then import the whole file.",{count:k.errors.length,line:C+f.length,written:T}))}};try{return await ne(y(),w),{failure:void 0,total:i}}catch(f){return{failure:{message:L(f),nextLine:g,rows:h,unknownFrom:b.startLine,...N},total:i}}},$t=({initialShardKey:t})=>{const e=Re(),n=Ie(),r=re(),[o,s]=S(t??""),[i,c]=S(null),[d,l]=S(null),[a,u]=S(!1),[y,p]=S(null),[h,g]=S(null),[N,b]=S(null),[w,f]=S(null),C=i!==null&&mt(i),k=d!==null&&d.shardKey===o?d.table:"",T=i!==null&&(!C||k!==""),B=async()=>{const x=o;u(!0),p(null),g(null),f(null);try{const F=await e.query(et,{},O(x));let v=new Blob([],{type:q}),I=0;const j=[];for(const{name:ge}of F){const{rows:P}=await e.query(Qe,{tables:[ge]},O(x));if(P.length===0)continue;const H=rt(P);v=new Blob([v,`${H}
6
6
  `],{type:q}),I+=P.length,j.length<te&&j.push(...H.split(`
7
7
  `).slice(0,te-j.length))}G(x),f({blob:v,count:I,preview:j.join(`
8
- `),shardKey:x})}catch(L){p(F(L))}},de=async(x,L)=>{u(!0),p(null),g(null),f(null);const{failure:v,total:I}=await xt(e,r,o,b,x,L);v===void 0?(G(o),g(I)):v.unknownFrom===void 0&&(v.refused===!0||v.rows===0)?(I.errors.length>0&&g(I),p(v.message)):v.unknownFrom===void 0?(g(I),p(r("Import stopped after {rows} rows: {message}. The counts below cover those rows. Rows from line {line} onward were not sent: do not import the whole file again, import from that line onward, or delete the written rows first and then import the whole file.",{line:v.nextLine,message:v.message,rows:v.rows}))):(g(I),p(r("Import stopped after {rows} rows: {message}. The counts below cover completed chunks only. The chunk from line {line} may have written rows: check the table for rows from line {line} onward before importing again, or delete the written rows first and then import the whole file.",{line:v.unknownFrom,message:v.message,rows:v.rows}))),n(_.readTablePage),n(_.listTables)},ue=h===null?0:ce(h.inserted),fe=()=>{Z(B().finally(()=>{u(!1)}))},me=()=>{i!==null&&T&&Z(de(i,C?k:null).finally(()=>{b(null),u(!1)}))},he=()=>{w!==null&&_e(`${w.shardKey.trim()===""?"shard":w.shardKey.trim()}.ndjson`,w.blob,q)},pe=x=>{c(x.target.files?.[0]??null),l(null)},we=x=>{l({shardKey:o,table:x})};return E("div",{className:"flex flex-col gap-4","data-testid":"lunora-export-import",children:[E(J,{className:"gap-0 py-0 rounded-xl border border-border bg-card shadow-xs",children:[m("header",{className:"border-b border-border px-4 py-3",children:m("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Export")})}),E(Y,{className:"flex flex-col gap-3 p-4",children:[E("div",{className:"flex flex-wrap items-center gap-2",children:[m(Ne,{onChange:s,testId:"ei-shard-input",value:o}),m(W,{"data-testid":"ei-export",disabled:a,onClick:fe,type:"button",children:r("Export")})]}),w!==null&&E("div",{className:"flex flex-col gap-2",children:[E("div",{className:"flex flex-wrap items-center gap-2",children:[m("p",{className:"text-sm text-muted-foreground","data-testid":"ei-export-result",children:r("Exported {count} rows.",{count:w.count})}),m(W,{"data-testid":"ei-download",onClick:he,size:"sm",type:"button",variant:"outline",children:r("Download")})]}),w.preview!==""&&m("pre",{className:"max-h-60 overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs","data-testid":"ei-preview",children:w.preview})]})]})]}),E(J,{className:"gap-0 py-0 rounded-xl border border-border bg-card shadow-xs",children:[m("header",{className:"border-b border-border px-4 py-3",children:m("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Import")})}),E(Y,{className:"flex flex-col gap-3 p-4",children:[m("input",{accept:".ndjson,.jsonl,.csv,application/x-ndjson,text/csv","aria-label":r("Import file"),className:"text-sm","data-testid":"ei-file",onChange:pe,type:"file"}),C&&m(gt,{onChange:we,shardKey:o,value:k}),m("div",{className:"flex flex-wrap items-center gap-2",children:m(be,{confirmLabel:r("Import (writes rows)?"),disabled:a||!T,onConfirm:me,testId:"ei-import",children:r("Import")})}),N!==null&&m("p",{className:"text-sm text-muted-foreground","data-testid":"ei-progress",role:"status",children:N}),h!==null&&E("div",{className:"flex flex-col gap-2","data-testid":"ei-import-result",children:[m("p",{className:"text-sm text-muted-foreground",children:r("Inserted {inserted}, {conflicts} conflicts, {errors} errors.",{conflicts:h.conflicts,errors:h.errors.length,inserted:ue})}),h.errors.length>0&&m("ul",{className:"flex flex-col gap-1","data-testid":"ei-import-errors",children:h.errors.map(x=>m("li",{className:"text-xs text-destructive",children:r("line {line} ({table}): {message}",{line:x.line,message:x.message,table:x.table})},`${x.table}-${x.line.toString()}`))})]})]})]}),y!==null&&m("p",{className:"text-sm text-destructive","data-testid":"ei-error",role:"alert",children:y})]})};function vt(t){return m(Ce,{value:t.name,children:t.name},t.name)}export{$t as ExportImportPanel};
8
+ `),shardKey:x})}catch(F){p(L(F))}},de=async(x,F)=>{u(!0),p(null),g(null),f(null);const{failure:v,total:I}=await xt(e,r,o,b,x,F);v===void 0?(G(o),g(I)):v.unknownFrom===void 0&&(v.refused===!0||v.rows===0)?(I.errors.length>0&&g(I),p(v.message)):v.unknownFrom===void 0?(g(I),p(r("Import stopped after {rows} rows: {message}. The counts below cover those rows. Rows from line {line} onward were not sent: do not import the whole file again, import from that line onward, or delete the written rows first and then import the whole file.",{line:v.nextLine,message:v.message,rows:v.rows}))):(g(I),p(r("Import stopped after {rows} rows: {message}. The counts below cover completed chunks only. The chunk from line {line} may have written rows: check the table for rows from line {line} onward before importing again, or delete the written rows first and then import the whole file.",{line:v.unknownFrom,message:v.message,rows:v.rows}))),n(_.readTablePage),n(_.listTables)},ue=h===null?0:ce(h.inserted),fe=()=>{Z(B().finally(()=>{u(!1)}))},me=()=>{i!==null&&T&&Z(de(i,C?k:null).finally(()=>{b(null),u(!1)}))},he=()=>{w!==null&&_e(`${w.shardKey.trim()===""?"shard":w.shardKey.trim()}.ndjson`,w.blob,q)},pe=x=>{c(x.target.files?.[0]??null),l(null)},we=x=>{l({shardKey:o,table:x})};return E("div",{className:"flex flex-col gap-4","data-testid":"lunora-export-import",children:[E(J,{className:"gap-0 py-0 rounded-xl border border-border bg-card shadow-xs",children:[m("header",{className:"border-b border-border px-4 py-3",children:m("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Export")})}),E(Y,{className:"flex flex-col gap-3 p-4",children:[E("div",{className:"flex flex-wrap items-center gap-2",children:[m(be,{onChange:s,testId:"ei-shard-input",value:o}),m(W,{"data-testid":"ei-export",disabled:a,onClick:fe,type:"button",children:r("Export")})]}),w!==null&&E("div",{className:"flex flex-col gap-2",children:[E("div",{className:"flex flex-wrap items-center gap-2",children:[m("p",{className:"text-sm text-muted-foreground","data-testid":"ei-export-result",children:r("Exported {count} rows.",{count:w.count})}),m(W,{"data-testid":"ei-download",onClick:he,size:"sm",type:"button",variant:"outline",children:r("Download")})]}),w.preview!==""&&m("pre",{className:"max-h-60 overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs","data-testid":"ei-preview",children:w.preview})]})]})]}),E(J,{className:"gap-0 py-0 rounded-xl border border-border bg-card shadow-xs",children:[m("header",{className:"border-b border-border px-4 py-3",children:m("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Import")})}),E(Y,{className:"flex flex-col gap-3 p-4",children:[m("input",{accept:".ndjson,.jsonl,.csv,application/x-ndjson,text/csv","aria-label":r("Import file"),className:"text-sm","data-testid":"ei-file",onChange:pe,type:"file"}),C&&m(gt,{onChange:we,shardKey:o,value:k}),m("div",{className:"flex flex-wrap items-center gap-2",children:m(ye,{confirmLabel:r("Import (writes rows)?"),disabled:a||!T,onConfirm:me,testId:"ei-import",children:r("Import")})}),N!==null&&m("p",{className:"text-sm text-muted-foreground","data-testid":"ei-progress",role:"status",children:N}),h!==null&&E("div",{className:"flex flex-col gap-2","data-testid":"ei-import-result",children:[m("p",{className:"text-sm text-muted-foreground",children:r("Inserted {inserted}, {conflicts} conflicts, {errors} errors.",{conflicts:h.conflicts,errors:h.errors.length,inserted:ue})}),h.errors.length>0&&m("ul",{className:"flex flex-col gap-1","data-testid":"ei-import-errors",children:h.errors.map(x=>m("li",{className:"text-xs text-destructive",children:r("line {line} ({table}): {message}",{line:x.line,message:x.message,table:x.table})},`${x.table}-${x.line.toString()}`))})]})]})]}),y!==null&&m("p",{className:"text-sm text-destructive","data-testid":"ei-error",role:"alert",children:y})]})};function vt(t){return m(Ne,{value:t.name,children:t.name},t.name)}export{$t as ExportImportPanel};