@lunora/studio 1.0.0-alpha.9 → 1.0.0-alpha.91

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (314) hide show
  1. package/LICENSE.md +6 -0
  2. package/dist/index.d.ts +822 -781
  3. package/dist/index.js +1 -41
  4. package/dist/mount.d.ts +10 -10
  5. package/dist/mount.js +1 -26
  6. package/dist/packem_chunks/AdvisorHealthPanel.js +1 -0
  7. package/dist/packem_chunks/ApiTab.js +1 -0
  8. package/dist/packem_chunks/AuditPanel.js +1 -0
  9. package/dist/packem_chunks/DeploymentHealthPanel.js +1 -0
  10. package/dist/packem_chunks/ExportImportPanel.js +3 -0
  11. package/dist/packem_chunks/FileBrowser.js +4 -0
  12. package/dist/packem_chunks/FunctionRunner.js +1 -0
  13. package/dist/packem_chunks/FunctionStatsPanel.js +1 -0
  14. package/dist/packem_chunks/HealthPanel.js +1 -0
  15. package/dist/packem_chunks/InsightsPanel.js +1 -0
  16. package/dist/packem_chunks/LogsPanel.js +1 -0
  17. package/dist/packem_chunks/MailPanel.js +2 -0
  18. package/dist/packem_chunks/MetricsPanel.js +1 -0
  19. package/dist/packem_chunks/NotificationsPanel.js +1 -0
  20. package/dist/packem_chunks/PitrPanel.js +1 -0
  21. package/dist/packem_chunks/SchemaViewer.js +1 -0
  22. package/dist/packem_chunks/SecurityAdvisorPanel.js +1 -0
  23. package/dist/packem_chunks/SettingsPanel.js +1 -0
  24. package/dist/packem_chunks/SqlEditorPanel.js +6 -0
  25. package/dist/packem_chunks/TableEditor.js +1 -0
  26. package/dist/packem_chunks/agents-panel.js +1 -0
  27. package/dist/packem_chunks/analytics-panel.js +1 -0
  28. package/dist/packem_chunks/auth-audit-panel.js +1 -0
  29. package/dist/packem_chunks/auth-config-panel.js +1 -0
  30. package/dist/packem_chunks/auth-sessions-panel.js +1 -0
  31. package/dist/packem_chunks/containers-panel.js +1 -0
  32. package/dist/packem_chunks/dashboards-panel.js +1 -0
  33. package/dist/packem_chunks/fanout-panel.js +1 -0
  34. package/dist/packem_chunks/flags-panel.js +1 -0
  35. package/dist/packem_chunks/issues-panel.js +1 -0
  36. package/dist/packem_chunks/kv-browser.js +1 -0
  37. package/dist/packem_chunks/log-drains-panel.js +4 -0
  38. package/dist/packem_chunks/migrations-route.js +1 -0
  39. package/dist/packem_chunks/organizations-panel.js +1 -0
  40. package/dist/packem_chunks/payments-panel.js +1 -0
  41. package/dist/packem_chunks/permissions-panel.js +1 -0
  42. package/dist/packem_chunks/queues-panel.js +1 -0
  43. package/dist/packem_chunks/rls-panel.js +1 -0
  44. package/dist/packem_chunks/schedule-panel.js +1 -0
  45. package/dist/packem_chunks/sparkline.js +1 -0
  46. package/dist/packem_chunks/storage-rules-panel.js +1 -0
  47. package/dist/packem_chunks/subscriptions-panel.js +1 -0
  48. package/dist/packem_chunks/sync-client-panel.js +1 -0
  49. package/dist/packem_chunks/traces-panel.js +1 -0
  50. package/dist/packem_chunks/users-panel.js +1 -0
  51. package/dist/packem_chunks/vector-browser.js +1 -0
  52. package/dist/packem_chunks/workflows-panel.js +1 -0
  53. package/dist/packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js +1 -0
  54. package/dist/packem_shared/ApiDocsPanel-Cu_QmzO0.js +2 -0
  55. package/dist/packem_shared/ApiReferencePanel-DuIU1P8B.js +1 -0
  56. package/dist/packem_shared/CommandPalette-mPR8-vIm.js +1 -0
  57. package/dist/packem_shared/ConfirmButton-CTL3f3kr.js +1 -0
  58. package/dist/packem_shared/ConnectionBadge-DOk0CQWo.js +1 -0
  59. package/dist/packem_shared/DEFAULT_AUTO_REFRESH_MS-BCC8_4BQ.js +1 -0
  60. package/dist/packem_shared/DEFAULT_INSIGHT_THRESHOLDS-B-hcFVoi.js +1 -0
  61. package/dist/packem_shared/DEFAULT_LOCALE-BZ4NojpD.js +1 -0
  62. package/dist/packem_shared/DataBrowser-BPRDaOHx.js +1 -0
  63. package/dist/packem_shared/DataFilters-B26ZeqBZ.js +1 -0
  64. package/dist/packem_shared/ErrorBoundary-DvzYskH7.js +1 -0
  65. package/dist/packem_shared/GlobalDataBrowser-CeA8bDjX.js +1 -0
  66. package/dist/packem_shared/HomePanel-DLP1nQdC.js +1 -0
  67. package/dist/packem_shared/MigrationsPanel-dm_M75mR.js +1 -0
  68. package/dist/packem_shared/OpenRpcReferencePanel-DXeffPFr.js +1 -0
  69. package/dist/packem_shared/STUDIO_ROOT_CLASS-C6MccdVk.js +1 -0
  70. package/dist/packem_shared/ScheduledJobs-DDJG9Je7.js +1 -0
  71. package/dist/packem_shared/ShardInput-BVn2iCU0.js +1 -0
  72. package/dist/packem_shared/Studio-BYg65qWq.js +1 -0
  73. package/dist/packem_shared/StudioApp-D0UOg0a_.js +1 -0
  74. package/dist/packem_shared/StudioI18nProvider-CZ5h4nrV.js +1 -0
  75. package/dist/packem_shared/advisor-view-Coipc04R.js +1 -0
  76. package/dist/packem_shared/aggregateMetrics-BNfajLa2.js +1 -0
  77. package/dist/packem_shared/alert-CVcOFuDR.js +1 -0
  78. package/dist/packem_shared/app.d-DW7yZsfu.d.ts +252 -0
  79. package/dist/packem_shared/badge-BbuuAio7.js +1 -0
  80. package/dist/packem_shared/bar-chart-DraN_srt.js +9 -0
  81. package/dist/packem_shared/browser-storage-xjTyMKY0.js +1 -0
  82. package/dist/packem_shared/button-BkCrNcAs.js +1 -0
  83. package/dist/packem_shared/card-CIDGUN6K.js +1 -0
  84. package/dist/packem_shared/cf-links-Dmg86v1D.js +1 -0
  85. package/dist/packem_shared/checkbox-StT4Gob6.js +1 -0
  86. package/dist/packem_shared/data-grid-Ci4-tZkk.js +1 -0
  87. package/dist/packem_shared/data-view-params-ClrV7XgF.js +1 -0
  88. package/dist/packem_shared/dropdown-menu-C3RQ_HlW.js +2 -0
  89. package/dist/packem_shared/empty-state-Cg7t_8qu.js +1 -0
  90. package/dist/packem_shared/error-alert--Ie7ofJ0.js +1 -0
  91. package/dist/packem_shared/grid-features-Db_BNYRo.js +6 -0
  92. package/dist/packem_shared/home-panel-BtxdqXDe.js +3 -0
  93. package/dist/packem_shared/input-JHu63lTv.js +1 -0
  94. package/dist/packem_shared/internal-zkEvTqy8.js +2 -0
  95. package/dist/packem_shared/label-6uP1obNF.js +1 -0
  96. package/dist/packem_shared/live-status-CmuRLFKf.js +1 -0
  97. package/dist/packem_shared/log-fields-CoL3hsIQ.js +1 -0
  98. package/dist/packem_shared/modal-shell-CUwwWC2o.js +1 -0
  99. package/dist/packem_shared/operation-console-provider-BMJNtiyB.js +1 -0
  100. package/dist/packem_shared/recording-client-DtUxwVNY.js +1 -0
  101. package/dist/packem_shared/reference-view-DncEStdm.js +12 -0
  102. package/dist/packem_shared/result-chart-Gywg9DOk.js +1 -0
  103. package/dist/packem_shared/schema-diagram-DTRaCp6Y.js +2 -0
  104. package/dist/packem_shared/scroll-area-DTEq6Jec.js +2 -0
  105. package/dist/packem_shared/select-Bul-DeII.js +2 -0
  106. package/dist/packem_shared/shard-history-DMEW5VBE.js +1 -0
  107. package/dist/packem_shared/skeleton-C1wQ9M5t.js +1 -0
  108. package/dist/packem_shared/sparkline-CgjeUU2I.js +1 -0
  109. package/dist/packem_shared/stat-card-fm_TF1mo.js +1 -0
  110. package/dist/packem_shared/storage-tier-DznqOf-q.js +1 -0
  111. package/dist/packem_shared/studio-Drf4en3j.js +2 -0
  112. package/dist/packem_shared/table-DdJBrClo.js +2 -0
  113. package/dist/packem_shared/table-list-sidebar-fz0m_4I4.js +1 -0
  114. package/dist/packem_shared/textarea-Bu2-jKAs.js +1 -0
  115. package/dist/packem_shared/trace-handoff-Dw7mwjxu.js +1 -0
  116. package/dist/packem_shared/use-admin-query-CnnyWJXM.js +1 -0
  117. package/dist/packem_shared/use-async-submit-BFIMhRqh.js +1 -0
  118. package/dist/packem_shared/use-auth-config-0EnNCdLu.js +1 -0
  119. package/dist/packem_shared/use-shard-key-B2JtNa5m.js +1 -0
  120. package/dist/packem_shared/use-sql-assistant-Dtw55kKM.js +1 -0
  121. package/dist/packem_shared/useDebounced-CU-uftxO.js +1 -0
  122. package/dist/packem_shared/utils-bhneXptQ.js +1 -0
  123. package/dist/packem_shared/virtual-rect-1o1veP7R.js +1 -0
  124. package/dist/packem_shared/wire-codec-BUrWLklj.js +1 -0
  125. package/dist/standalone/chunk-2NX5QU44.js +1 -0
  126. package/dist/standalone/chunk-2OUPA2WJ.js +1 -0
  127. package/dist/standalone/chunk-2PJNAWB3.js +1 -0
  128. package/dist/standalone/chunk-2QSHLBCO.js +1 -0
  129. package/dist/standalone/chunk-2QWHVQ6P.js +1 -0
  130. package/dist/standalone/chunk-3C3CG7ZK.js +1 -0
  131. package/dist/standalone/chunk-3CWGJYBB.js +1 -0
  132. package/dist/standalone/chunk-3FIN5PH4.js +6 -0
  133. package/dist/standalone/chunk-3XIESWL4.js +1 -0
  134. package/dist/standalone/chunk-3XQMTTW2.js +1 -0
  135. package/dist/standalone/chunk-4D7XIQ5Q.js +1 -0
  136. package/dist/standalone/chunk-4LCY5XUR.js +1 -0
  137. package/dist/standalone/chunk-4PLB4ZNI.js +1 -0
  138. package/dist/standalone/chunk-4UOFSGUS.js +1 -0
  139. package/dist/standalone/chunk-4VEAVSAZ.js +1 -0
  140. package/dist/standalone/chunk-54MMVNPT.js +1 -0
  141. package/dist/standalone/chunk-5Y3QLNWX.js +1 -0
  142. package/dist/standalone/chunk-6QKJ6JPJ.js +1 -0
  143. package/dist/standalone/chunk-6ST5ECQA.js +1 -0
  144. package/dist/standalone/chunk-6WWX4FJB.js +1 -0
  145. package/dist/standalone/chunk-6XKVQES4.js +1 -0
  146. package/dist/standalone/chunk-7H7LZRLP.js +1 -0
  147. package/dist/standalone/chunk-7QIFDWQV.js +1 -0
  148. package/dist/standalone/chunk-7QMX3D4D.js +3 -0
  149. package/dist/standalone/chunk-7T7UOTYK.js +1 -0
  150. package/dist/standalone/chunk-7YXDJXNL.js +1 -0
  151. package/dist/standalone/chunk-A7647FJE.js +1 -0
  152. package/dist/standalone/chunk-AQT6EPZT.js +1 -0
  153. package/dist/standalone/chunk-AREBQI6D.js +1 -0
  154. package/dist/standalone/chunk-AVAC26HJ.js +1 -0
  155. package/dist/standalone/chunk-BCGEI67L.js +2 -0
  156. package/dist/standalone/chunk-BENJFRZL.js +1 -0
  157. package/dist/standalone/chunk-BGBLQ563.js +1 -0
  158. package/dist/standalone/chunk-BYIS2KWZ.js +1 -0
  159. package/dist/standalone/chunk-C6GLTSPO.js +4 -0
  160. package/dist/standalone/chunk-CFPZYHPY.js +2 -0
  161. package/dist/standalone/chunk-CMP33R3N.js +1 -0
  162. package/dist/standalone/chunk-CRHCAN4W.js +13 -0
  163. package/dist/standalone/chunk-CUAGAM2B.js +1 -0
  164. package/dist/standalone/chunk-DBWOWJYT.js +11 -0
  165. package/dist/standalone/chunk-EQZTSISX.js +1 -0
  166. package/dist/standalone/chunk-ESEEVSPC.js +1 -0
  167. package/dist/standalone/chunk-ESVP44Y3.js +1 -0
  168. package/dist/standalone/chunk-F3TP5L34.js +1 -0
  169. package/dist/standalone/chunk-FBNRATNR.js +1 -0
  170. package/dist/standalone/chunk-FURI47Z2.js +1 -0
  171. package/dist/standalone/chunk-FW75RYZU.js +1 -0
  172. package/dist/standalone/chunk-FXCBF4XT.js +1 -0
  173. package/dist/standalone/chunk-GMR677FL.js +1 -0
  174. package/dist/standalone/chunk-GRL5MG3Z.js +1 -0
  175. package/dist/standalone/chunk-HKG5I64M.js +1 -0
  176. package/dist/standalone/chunk-HPFLBYRI.js +1 -0
  177. package/dist/standalone/chunk-HWOD25QD.js +1 -0
  178. package/dist/standalone/chunk-I6A5C46N.js +1 -0
  179. package/dist/standalone/chunk-IBVBIKUI.js +1 -0
  180. package/dist/standalone/chunk-IC4L6G56.js +1 -0
  181. package/dist/standalone/chunk-IGCNMZSB.js +1 -0
  182. package/dist/standalone/chunk-ILNELDFC.js +1 -0
  183. package/dist/standalone/chunk-IUUSMC2R.js +8 -0
  184. package/dist/standalone/chunk-IUYFXK4X.js +19 -0
  185. package/dist/standalone/chunk-IVFHIQOT.js +1 -0
  186. package/dist/standalone/chunk-IZ3ISXSM.js +1 -0
  187. package/dist/standalone/chunk-J3FR2XBV.js +1 -0
  188. package/dist/standalone/chunk-JN2Y24PY.js +1 -0
  189. package/dist/standalone/chunk-JWXKUXYA.js +1 -0
  190. package/dist/standalone/chunk-KUFAOKU3.js +1 -0
  191. package/dist/standalone/chunk-KUVMORDQ.js +1 -0
  192. package/dist/standalone/chunk-LDYOCGEG.js +1 -0
  193. package/dist/standalone/chunk-LEDWUPXM.js +1 -0
  194. package/dist/standalone/chunk-LUU4SDHW.js +1 -0
  195. package/dist/standalone/chunk-LYQY7L72.js +4 -0
  196. package/dist/standalone/chunk-LZH7RDRV.js +1 -0
  197. package/dist/standalone/chunk-MIQTKZAR.js +1 -0
  198. package/dist/standalone/chunk-ML5IJMH6.js +1 -0
  199. package/dist/standalone/chunk-MV4A2PAK.js +1 -0
  200. package/dist/standalone/chunk-N233NOIN.js +1 -0
  201. package/dist/standalone/chunk-NH3VWHCL.js +1 -0
  202. package/dist/standalone/chunk-NNRFDPSD.js +1 -0
  203. package/dist/standalone/chunk-O2QUUHGF.js +1 -0
  204. package/dist/standalone/chunk-Q2Q7FR3R.js +1 -0
  205. package/dist/standalone/chunk-Q4AI6JRP.js +1 -0
  206. package/dist/standalone/chunk-QBWRC5YX.js +1 -0
  207. package/dist/standalone/chunk-QGA2HITH.js +1 -0
  208. package/dist/standalone/chunk-QLQADHFE.js +1 -0
  209. package/dist/standalone/chunk-QWGT25SE.js +1 -0
  210. package/dist/standalone/chunk-QWJ4HKPY.js +1 -0
  211. package/dist/standalone/chunk-QZGTDXV5.js +1 -0
  212. package/dist/standalone/chunk-RHPP74O4.js +1 -0
  213. package/dist/standalone/chunk-RKGCSNAW.js +1 -0
  214. package/dist/standalone/chunk-RMN2JN4S.js +1 -0
  215. package/dist/standalone/chunk-RNOSWEMO.js +4 -0
  216. package/dist/standalone/chunk-S3DWUXGY.js +62 -0
  217. package/dist/standalone/chunk-SD4BERSA.js +1 -0
  218. package/dist/standalone/chunk-SFDOII3B.js +1 -0
  219. package/dist/standalone/chunk-SMIESS7P.js +1 -0
  220. package/dist/standalone/chunk-T6VMSOBB.js +1 -0
  221. package/dist/standalone/chunk-THIXMMZD.js +1 -0
  222. package/dist/standalone/chunk-ULYM26IH.js +1 -0
  223. package/dist/standalone/chunk-UU2QJMGJ.js +1 -0
  224. package/dist/standalone/chunk-UZERI5YC.js +1 -0
  225. package/dist/standalone/chunk-V53KNYRN.js +1 -0
  226. package/dist/standalone/chunk-VDW32UET.js +1 -0
  227. package/dist/standalone/chunk-WOEGO5M6.js +1 -0
  228. package/dist/standalone/chunk-XBDKZZ67.js +1 -0
  229. package/dist/standalone/chunk-XDEDCAYN.js +1 -0
  230. package/dist/standalone/chunk-XF2B7P5A.js +1 -0
  231. package/dist/standalone/chunk-XGMZESWC.js +1 -0
  232. package/dist/standalone/chunk-XKKP2VFZ.js +1 -0
  233. package/dist/standalone/chunk-XNGYYOLS.js +14 -0
  234. package/dist/standalone/chunk-XQCVZAGU.js +1 -0
  235. package/dist/standalone/chunk-XTEWLG3J.js +3 -0
  236. package/dist/standalone/chunk-XXQUMVWH.js +1 -0
  237. package/dist/standalone/chunk-XXXMUP6L.js +1 -0
  238. package/dist/standalone/chunk-ZJGP6EKR.js +1 -0
  239. package/dist/standalone/chunk-ZKTWHB7Q.js +1 -0
  240. package/dist/standalone/chunk-ZNMZQXWN.js +1 -0
  241. package/dist/standalone/chunk-ZWSTXAG3.js +6 -0
  242. package/dist/standalone/studio.js +9 -356
  243. package/dist/styles.css +2 -2
  244. package/package.json +16 -14
  245. package/dist/packem_shared/ADMIN_FUNCTIONS-DjXgvJb6.js +0 -46
  246. package/dist/packem_shared/ApiDocsPanel-yVSGHK3H.js +0 -842
  247. package/dist/packem_shared/ApiReferencePanel-1vubqG5s.js +0 -229
  248. package/dist/packem_shared/ApiTab-rwttyQ1-.js +0 -251
  249. package/dist/packem_shared/AuditPanel-BqXZAsu_.js +0 -212
  250. package/dist/packem_shared/CommandPalette-BtgkBzZI.js +0 -373
  251. package/dist/packem_shared/ConfirmButton-C2eVi2Qv.js +0 -59
  252. package/dist/packem_shared/ConnectionBadge-B2DDM2Tn.js +0 -111
  253. package/dist/packem_shared/DEFAULT_AUTO_REFRESH_MS-Vxwaxx51.js +0 -50
  254. package/dist/packem_shared/DEFAULT_INSIGHT_THRESHOLDS-DjF0h-gA.js +0 -89
  255. package/dist/packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js +0 -27
  256. package/dist/packem_shared/DataBrowser-BtT2NYcR.js +0 -4542
  257. package/dist/packem_shared/DataFilters-FNquMaiu.js +0 -249
  258. package/dist/packem_shared/ErrorBoundary-BzAApI7J.js +0 -66
  259. package/dist/packem_shared/ExportImportPanel-Dq6rj0tI.js +0 -193
  260. package/dist/packem_shared/FileBrowser-0pCpdKPE.js +0 -2932
  261. package/dist/packem_shared/FunctionRunner-7NH3KcTg.js +0 -343
  262. package/dist/packem_shared/FunctionStatsPanel-Cn_EBpDy.js +0 -432
  263. package/dist/packem_shared/GlobalDataBrowser-BTEmGrph.js +0 -318
  264. package/dist/packem_shared/HealthPanel-CQ4LzVET.js +0 -640
  265. package/dist/packem_shared/HomePanel-CP0lN1eF.js +0 -1273
  266. package/dist/packem_shared/InsightsPanel-B1BaHaPL.js +0 -431
  267. package/dist/packem_shared/LogsPanel-C3W0mabf.js +0 -839
  268. package/dist/packem_shared/MailPanel-DozizrvV.js +0 -447
  269. package/dist/packem_shared/MetricsPanel-CujtUfpl.js +0 -1625
  270. package/dist/packem_shared/MigrationsPanel-RX5qIFSr.js +0 -246
  271. package/dist/packem_shared/OpenRpcReferencePanel-vbcYbv3V.js +0 -191
  272. package/dist/packem_shared/PitrPanel-LJGNP_IX.js +0 -252
  273. package/dist/packem_shared/STUDIO_ROOT_CLASS-D12gX2dV.js +0 -3
  274. package/dist/packem_shared/ScheduledJobs-CabfKbyM.js +0 -159
  275. package/dist/packem_shared/SchemaViewer-Bam6ylvw.js +0 -2512
  276. package/dist/packem_shared/SecurityAdvisorPanel-Bn2yq05G.js +0 -79
  277. package/dist/packem_shared/SettingsPanel-CBXQpYQA.js +0 -176
  278. package/dist/packem_shared/ShardInput-gx_DZXXn.js +0 -107
  279. package/dist/packem_shared/SqlEditorPanel-D5wMIxcg.js +0 -13
  280. package/dist/packem_shared/Studio-CccqZ-J1.js +0 -33
  281. package/dist/packem_shared/StudioApp-CQbULfaH.js +0 -657
  282. package/dist/packem_shared/StudioI18nProvider-B-tDCZIi.js +0 -48
  283. package/dist/packem_shared/TableEditor-Df_5NPaF.js +0 -371
  284. package/dist/packem_shared/advisor-view-CGcfMiPq.js +0 -159
  285. package/dist/packem_shared/aggregateMetrics-D4nUHEKU.js +0 -108
  286. package/dist/packem_shared/app.d-Nbhpihxv.d.ts +0 -300
  287. package/dist/packem_shared/badge-B2PKA1-5.js +0 -49
  288. package/dist/packem_shared/bar-chart-CzJAgqkp.js +0 -3245
  289. package/dist/packem_shared/button-BhsN2uZH.js +0 -49
  290. package/dist/packem_shared/card-DURq3ElK.js +0 -175
  291. package/dist/packem_shared/cf-links-2cktDedA.js +0 -8
  292. package/dist/packem_shared/checkbox-UNkzAxl-.js +0 -63
  293. package/dist/packem_shared/data-grid-B5CaV3wS.js +0 -183
  294. package/dist/packem_shared/dropdown-menu-WY4B_eJO.js +0 -280
  295. package/dist/packem_shared/empty-state-DY_oe0k6.js +0 -98
  296. package/dist/packem_shared/grid-features-CzUfqgsM.js +0 -840
  297. package/dist/packem_shared/input-XH4r1Pt1.js +0 -53
  298. package/dist/packem_shared/internal-rXJEAhXS.js +0 -68
  299. package/dist/packem_shared/label-D8ykjn5J.js +0 -46
  300. package/dist/packem_shared/live-status-FZ0psC1z.js +0 -44
  301. package/dist/packem_shared/reference-view-B4E49Lip.js +0 -2180
  302. package/dist/packem_shared/shard-history-DyebH1R5.js +0 -38
  303. package/dist/packem_shared/sparkline-10dG-_f0.js +0 -93
  304. package/dist/packem_shared/sql-editor-panel-Smfl_FDF.js +0 -2562
  305. package/dist/packem_shared/storage-tier-CL98eOvn.js +0 -85
  306. package/dist/packem_shared/studio-D93XGB-i.js +0 -10413
  307. package/dist/packem_shared/table-_RzNvy3R.js +0 -246
  308. package/dist/packem_shared/table-list-sidebar-Bg7uzbvC.js +0 -832
  309. package/dist/packem_shared/textarea-D3gaCU_-.js +0 -46
  310. package/dist/packem_shared/use-live-admin-Dq6g3daN.js +0 -73
  311. package/dist/packem_shared/use-live-shard-seed-Cuk3dnH0.js +0 -76
  312. package/dist/packem_shared/useDebounced-Dxncpg6z.js +0 -32
  313. package/dist/packem_shared/utils-B05Dmz_H.js +0 -8
  314. package/dist/packem_shared/virtual-rect-CVMUskSm.js +0 -10
package/dist/index.d.ts CHANGED
@@ -1,10 +1,21 @@
1
- import { F as FunctionDescriptor } from "./packem_shared/app.d-Nbhpihxv.js";
2
- export { type a as FunctionKind, type R as RunStatus, b as ScheduledJobs, type c as ScheduledJobsProps, d as Studio, e as StudioApp, type S as StudioAppProps, type f as StudioProps, type g as StudioTab } from "./packem_shared/app.d-Nbhpihxv.js";
1
+ import { F as FunctionDescriptor } from "./packem_shared/app.d-DW7yZsfu.js";
2
+ export { type a as FunctionKind, type R as RunStatus, b as ScheduledJobs, type c as ScheduledJobsProps, d as Studio, e as StudioApp, type S as StudioAppProps, type f as StudioProps } from "./packem_shared/app.d-DW7yZsfu.js";
3
3
  import { ReactElement, ReactNode, ErrorInfo, Component, ChangeEvent } from 'react';
4
+ import '@lunora/advisor';
4
5
  import { CapturedMail } from '@lunora/mail';
5
6
  export type { CapturedMail } from '@lunora/mail';
7
+ import { HealthBody } from '@lunora/runtime';
6
8
  import { Messages, I18n } from '@lingui/core';
7
9
  export type { LunoraClient, ScheduleRecord, StorageObject } from '@lunora/client';
10
+ /**
11
+ * The studio's navigation taxonomy: which pages exist and which domain each one
12
+ * belongs to.
13
+ *
14
+ * Its own module so the label maps (`nav-labels.ts`) can name these types without
15
+ * importing `studio.tsx`, which pulls in every lazy panel behind it.
16
+ */
17
+ /** Identifier for each built-in studio tab. */
18
+ type StudioTab = "agents" | "analytics" | "api" | "audit" | "authAudit" | "authConfig" | "authSessions" | "containers" | "dashboards" | "data" | "deploymentHealth" | "drains" | "export" | "fanout" | "files" | "flags" | "functions" | "health" | "home" | "insights" | "issues" | "kv" | "logs" | "mail" | "metrics" | "migrations" | "notifications" | "organizations" | "payments" | "permissions" | "pitr" | "queues" | "realtime" | "rls" | "schedule" | "schema" | "advisorHealth" | "security" | "settings" | "sql" | "storageRules" | "traces" | "users" | "vectors" | "workflows";
8
19
  /** A navigable destination shown in the palette. */
9
20
  interface CommandItem {
10
21
  /** Localised domain label, shown as a muted suffix to disambiguate. */
@@ -21,17 +32,15 @@ interface CommandPaletteProps {
21
32
  /** Open the command palette from anywhere (e.g. the top-bar Search button). */
22
33
  declare const openCommandPalette: () => void;
23
34
  /**
24
- * Command palette (⌘K / Ctrl-K) — Supabase-style global search. Rendered inside
25
- * the studio shell so its selection can drive the router's `useNavigate`. Opens
26
- * on the keyboard shortcut or the {@link OPEN_EVENT} the top-bar Search button
27
- * dispatches, filters the navigable destinations by a case-insensitive substring
28
- * over their label and domain, and navigates to the chosen one. Built on the
29
- * studio's Base UI dialog primitive — no `cmdk`/extra dependency — with a small
30
- * arrow-key + Enter affordance over the filtered list.
31
- */
32
- declare const CommandPalette: ({
33
- items
34
- }: CommandPaletteProps) => ReactElement;
35
+ * Command palette (⌘K / Ctrl-K) — Supabase-style global search. Rendered inside
36
+ * the studio shell so its selection can drive the router's `useNavigate`. Opens
37
+ * on the keyboard shortcut or the {@link OPEN_EVENT} the top-bar Search button
38
+ * dispatches, filters the navigable destinations by a case-insensitive substring
39
+ * over their label and domain, and navigates to the chosen one. Built on the
40
+ * studio's Base UI dialog primitive — no `cmdk`/extra dependency — with a small
41
+ * arrow-key + Enter affordance over the filtered list.
42
+ */
43
+ declare const CommandPalette: ({ items }: CommandPaletteProps) => ReactElement;
35
44
  interface ConfirmButtonProps {
36
45
  /** Label for the initial trigger (e.g. `Delete`). */
37
46
  readonly children: string;
@@ -45,33 +54,27 @@ interface ConfirmButtonProps {
45
54
  readonly testId: string;
46
55
  }
47
56
  /**
48
- * A destructive-action button that requires a second click to fire. The first
49
- * click swaps the trigger for an inline `Confirm` / `Cancel` pair rather than a
50
- * blocking `window.confirm`, so the guard is testable and non-modal. The
51
- * trigger keeps its `testId` (so existing tests that click it still reach the
52
- * first step); the actual action only runs on the `${testId}-confirm` click.
53
- */
54
- declare const ConfirmButton: ({
55
- children,
56
- confirmLabel,
57
- disabled,
58
- onConfirm,
59
- testId
60
- }: ConfirmButtonProps) => ReactElement;
61
- /**
62
- * Live-socket status indicator. Reflects the client's aggregate WebSocket health
63
- * so an operator can tell a healthy live channel from a silently-dropped socket
64
- * (a panel showing "Live: on" while the socket is down would otherwise look
65
- * identical to one that's simply idle).
66
- */
57
+ * A destructive-action button that requires a second click to fire. The first
58
+ * click swaps the trigger for an inline `Confirm` / `Cancel` pair rather than a
59
+ * blocking `window.confirm`, so the guard is testable and non-modal. The
60
+ * trigger keeps its `testId` (so existing tests that click it still reach the
61
+ * first step); the actual action only runs on the `${testId}-confirm` click.
62
+ */
63
+ declare const ConfirmButton: ({ children, confirmLabel, disabled, onConfirm, testId }: ConfirmButtonProps) => ReactElement;
64
+ /**
65
+ * Live-socket status indicator. Reflects the client's aggregate WebSocket health
66
+ * so an operator can tell a healthy live channel from a silently-dropped socket
67
+ * (a panel showing "Live: on" while the socket is down would otherwise look
68
+ * identical to one that's simply idle).
69
+ */
67
70
  declare const ConnectionBadge: () => ReactElement;
68
71
  interface ErrorBoundaryProps {
69
72
  readonly children: ReactNode;
70
73
  /**
71
- * Localised fallback heading. When omitted, falls back to `${label} failed`
72
- * (or `Something went wrong` with no label). A class component can't use the
73
- * `useT` hook, so localised text is passed in by its parents.
74
- */
74
+ * Localised fallback heading. When omitted, falls back to `${label} failed`
75
+ * (or `Something went wrong` with no label). A class component can't use the
76
+ * `useT` hook, so localised text is passed in by its parents.
77
+ */
75
78
  readonly fallbackTitle?: string;
76
79
  /** Optional label naming the boundary's region, shown in the fallback. */
77
80
  readonly label?: string;
@@ -82,10 +85,10 @@ interface ErrorBoundaryState {
82
85
  readonly error: Error | null;
83
86
  }
84
87
  /**
85
- * Catches render/lifecycle errors in a panel so one throwing component doesn't
86
- * blank the whole studio shell. Shows the error message with a "Try again"
87
- * button that clears the boundary and re-renders its children.
88
- */
88
+ * Catches render/lifecycle errors in a panel so one throwing component doesn't
89
+ * blank the whole studio shell. Shows the error message with a "Try again"
90
+ * button that clears the boundary and re-renders its children.
91
+ */
89
92
  declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
90
93
  static getDerivedStateFromError(error: Error): ErrorBoundaryState;
91
94
  override state: ErrorBoundaryState;
@@ -102,63 +105,104 @@ interface ShardInputProps {
102
105
  readonly value: string;
103
106
  }
104
107
  /**
105
- * Shard-key text field shared by every shard-scoped panel. Backed by a
106
- * `&lt;datalist>` of recently-used shard keys (see {@link loadRecentShards}) so an
107
- * operator can pick a shard they've visited instead of retyping it — the closest
108
- * to a shard picker possible without server-side shard enumeration, which
109
- * Durable Objects don't support. Panels remain responsible for recording a shard
110
- * as used (via `recordShard`) when they actually query it.
111
- */
112
- declare const ShardInput: ({
113
- id,
114
- onChange,
115
- testId,
116
- value
117
- }: ShardInputProps) => ReactElement;
108
+ * Shard-key text field shared by every shard-scoped panel. Backed by a
109
+ * `&lt;datalist>` of recently-used shard keys (see {@link loadRecentShards}) so an
110
+ * operator can pick a shard they've visited instead of retyping it — the closest
111
+ * to a shard picker possible without server-side shard enumeration, which
112
+ * Durable Objects don't support. Panels remain responsible for recording a shard
113
+ * as used (via `recordShard`) when they actually query it.
114
+ */
115
+ declare const ShardInput: ({ id, onChange, testId, value }: ShardInputProps) => ReactElement;
116
+ interface AdvisorHealthPanelProps {
117
+ /** Scopes the `data-testid`s. */
118
+ readonly testId?: string;
119
+ }
120
+ /**
121
+ * The Advisors **Health** tab: one score for the deployment, the coverage split, and
122
+ * every procedure ranked worst-first.
123
+ *
124
+ * Scoring runs client-side over the two admin reads rather than being baked into
125
+ * the worker: `scoreAdvisor` is a pure function, so the panel reuses the exact
126
+ * arithmetic the CLI gate uses — one implementation, no chance of the dashboard
127
+ * and CI disagreeing about the same deployment.
128
+ *
129
+ * Both reads are needed. The advisories are the numerator and the procedures the
130
+ * denominator; without the latter there is no way to tell one failing handler
131
+ * out of two from one out of two hundred.
132
+ */
133
+ declare const AdvisorHealthPanel: ({ testId }: AdvisorHealthPanelProps) => ReactElement;
118
134
  declare const ADMIN_FUNCTION_PREFIX = "__lunora_admin__:";
119
135
  /**
120
- * Fully-qualified reserved paths the studio invokes via the client. The
121
- * `__lunora_admin__:` prefix is spelled out inline rather than interpolated so
122
- * the values stay emittable under `--isolatedDeclarations`. Every path is
123
- * intercepted by `ShardDO` before user dispatch and gated by the server's
124
- * `LUNORA_ADMIN_TOKEN`.
125
- */
136
+ * Fully-qualified reserved paths the studio invokes via the client. The
137
+ * `__lunora_admin__:` prefix is spelled out inline rather than interpolated so
138
+ * the values stay emittable under `--isolatedDeclarations`. Every path is
139
+ * intercepted by `ShardDO` before user dispatch and gated by the server's
140
+ * `LUNORA_ADMIN_TOKEN`.
141
+ */
126
142
  declare const ADMIN_FUNCTIONS: {
143
+ readonly aiAvailable: "__lunora_admin__:aiAvailable";
144
+ readonly aiChartConfig: "__lunora_admin__:aiChartConfig";
145
+ readonly aiGenerateSql: "__lunora_admin__:aiGenerateSql";
146
+ readonly aiTableFilter: "__lunora_admin__:aiTableFilter";
147
+ readonly assignIssue: "__lunora_admin__:assignIssue";
148
+ readonly backRelationCounts: "__lunora_admin__:backRelationCounts";
127
149
  readonly clearCapturedMail: "__lunora_admin__:clearCapturedMail";
150
+ readonly clearQueueMessages: "__lunora_admin__:clearQueueMessages";
128
151
  readonly clearTable: "__lunora_admin__:clearTable";
129
152
  readonly createWorkflowInstance: "__lunora_admin__:createWorkflowInstance";
130
153
  readonly deleteRows: "__lunora_admin__:deleteRows";
131
154
  readonly describeTable: "__lunora_admin__:describeTable";
132
155
  readonly describeTables: "__lunora_admin__:describeTables";
156
+ readonly explainIssue: "__lunora_admin__:explainIssue";
133
157
  readonly exportShard: "__lunora_admin__:exportShard";
134
158
  readonly facetColumn: "__lunora_admin__:facetColumn";
135
159
  readonly getAdvisories: "__lunora_admin__:getAdvisories";
160
+ readonly getAdvisorProcedures: "__lunora_admin__:getAdvisorProcedures";
136
161
  readonly getAuditLog: "__lunora_admin__:getAuditLog";
162
+ readonly getAuthAuditLog: "__lunora_admin__:getAuthAuditLog";
137
163
  readonly getAuthMetrics: "__lunora_admin__:getAuthMetrics";
138
164
  readonly getCapturedMail: "__lunora_admin__:getCapturedMail";
165
+ readonly getFanoutMetrics: "__lunora_admin__:getFanoutMetrics";
139
166
  readonly getFunctionStats: "__lunora_admin__:getFunctionStats";
167
+ readonly getIssues: "__lunora_admin__:getIssues";
168
+ readonly lintSql: "__lunora_admin__:lintSql";
169
+ readonly listFlags: "__lunora_admin__:listFlags";
170
+ readonly listPushSubscriptions: "__lunora_admin__:listPushSubscriptions";
140
171
  readonly listQueues: "__lunora_admin__:listQueues";
141
172
  readonly listSubscriptions: "__lunora_admin__:listSubscriptions";
142
173
  readonly listTableIndexes: "__lunora_admin__:listTableIndexes";
174
+ readonly listTablesIndexes: "__lunora_admin__:listTablesIndexes";
143
175
  readonly listWorkflows: "__lunora_admin__:listWorkflows";
144
176
  readonly getLogs: "__lunora_admin__:getLogs";
177
+ readonly getMetricHistory: "__lunora_admin__:getMetricHistory";
178
+ readonly getMetricSeries: "__lunora_admin__:getMetricSeries";
145
179
  readonly getMetrics: "__lunora_admin__:getMetrics";
146
180
  readonly getPitrBookmark: "__lunora_admin__:getPitrBookmark";
181
+ readonly getQueryInsights: "__lunora_admin__:getQueryInsights";
182
+ readonly getQueueMessages: "__lunora_admin__:getQueueMessages";
147
183
  readonly getRequestLog: "__lunora_admin__:getRequestLog";
148
184
  readonly getSecurityAudit: "__lunora_admin__:getSecurityAudit";
149
185
  readonly getSettings: "__lunora_admin__:getSettings";
186
+ readonly getTraces: "__lunora_admin__:getTraces";
150
187
  readonly getWorkflowInstanceStatus: "__lunora_admin__:getWorkflowInstanceStatus";
188
+ readonly ignoreIssue: "__lunora_admin__:ignoreIssue";
151
189
  readonly importShard: "__lunora_admin__:importShard";
152
190
  readonly listTables: "__lunora_admin__:listTables";
153
191
  readonly maskPolicies: "__lunora_admin__:maskPolicies";
154
192
  readonly migrationStatus: "__lunora_admin__:migrationStatus";
155
193
  readonly pitrRestore: "__lunora_admin__:pitrRestore";
156
194
  readonly readTablePage: "__lunora_admin__:readTablePage";
195
+ readonly replayQueueMessage: "__lunora_admin__:replayQueueMessage";
196
+ readonly resolveIssue: "__lunora_admin__:resolveIssue";
157
197
  readonly rlsPolicies: "__lunora_admin__:rlsPolicies";
198
+ readonly schemaHistory: "__lunora_admin__:schemaHistory";
199
+ readonly schemaVersion: "__lunora_admin__:schemaVersion";
158
200
  readonly runAs: "__lunora_admin__:runAs";
159
201
  readonly runMigration: "__lunora_admin__:runMigration";
160
202
  readonly runSql: "__lunora_admin__:runSql";
203
+ readonly sendQueueMessage: "__lunora_admin__:sendQueueMessage";
161
204
  readonly sendTestMail: "__lunora_admin__:sendTestMail";
205
+ readonly setIssueSeverity: "__lunora_admin__:setIssueSeverity";
162
206
  readonly storageOrphans: "__lunora_admin__:storageOrphans";
163
207
  readonly storageReferences: "__lunora_admin__:storageReferences";
164
208
  readonly storageRules: "__lunora_admin__:storageRules";
@@ -168,10 +212,10 @@ declare const ADMIN_FUNCTIONS: {
168
212
  /** Comparison a {@link FilterClause} applies, mirroring `@lunora/do`'s `FilterOperator`. `contains` is a substring (LIKE). */
169
213
  type FilterOperator = "contains" | "eq" | "gt" | "gte" | "lt" | "lte" | "ne";
170
214
  /**
171
- * One structured column filter passed to `readTablePage`, mirroring `@lunora/do`'s
172
- * `FilterClause`. AND-combined with the substring search and the other clauses.
173
- * `value` is sent as-is and bound server-side, so it never injects SQL.
174
- */
215
+ * One structured column filter passed to `readTablePage`, mirroring `@lunora/do`'s
216
+ * `FilterClause`. AND-combined with the substring search and the other clauses.
217
+ * `value` is sent as-is and bound server-side, so it never injects SQL.
218
+ */
175
219
  interface FilterClause {
176
220
  column: string;
177
221
  operator: FilterOperator;
@@ -216,26 +260,26 @@ interface ShardMetrics {
216
260
  uptimeMs: number;
217
261
  }
218
262
  /**
219
- * One full-scan attribution entry on a {@link FunctionCallStat}, mirroring
220
- * `@lunora/do`'s `FunctionScanAttribution`: how many times the function
221
- * full-scanned `table`. The causal evidence behind the "missing index" insight.
222
- */
263
+ * One full-scan attribution entry on a {@link FunctionCallStat}, mirroring
264
+ * `@lunora/do`'s `FunctionScanAttribution`: how many times the function
265
+ * full-scanned `table`. The causal evidence behind the "missing index" insight.
266
+ */
223
267
  interface FunctionScanAttribution {
224
268
  scans: number;
225
269
  table: string;
226
270
  }
227
271
  /**
228
- * Per-function execution counters returned by `__lunora_admin__:getFunctionStats`
229
- * for one shard. Mirrors `@lunora/do`'s `FunctionCallStat`. Counters are
230
- * per-DO-instance and reset on hibernation/restart — a "since this instance
231
- * woke" readout. Durations are handler wall-clock milliseconds.
232
- *
233
- * `scans` / `scannedTables` carry the causal full-scan attribution (PLAN3 1.2).
234
- * They're additive — a worker predating the feature reports `scans: 0` and
235
- * `scannedTables: []`, so the fields are optional on the wire and the consumer
236
- * defaults them. `conflicts` (OCC write-contention count, a subset of `errors`)
237
- * is likewise additive and optional for the same back-compat reason.
238
- */
272
+ * Per-function execution counters returned by `__lunora_admin__:getFunctionStats`
273
+ * for one shard. Mirrors `@lunora/do`'s `FunctionCallStat`. Counters are
274
+ * per-DO-instance and reset on hibernation/restart — a "since this instance
275
+ * woke" readout. Durations are handler wall-clock milliseconds.
276
+ *
277
+ * `scans` / `scannedTables` carry the causal full-scan attribution (PLAN3 1.2).
278
+ * They're additive — a worker predating the feature reports `scans: 0` and
279
+ * `scannedTables: []`, so the fields are optional on the wire and the consumer
280
+ * defaults them. `conflicts` (OCC write-contention count, a subset of `errors`)
281
+ * is likewise additive and optional for the same back-compat reason.
282
+ */
239
283
  interface FunctionCallStat {
240
284
  calls: number;
241
285
  /** OCC write-conflict count — a subset of `errors`; absent on a pre-conflict-tracking worker. */
@@ -258,11 +302,11 @@ interface FunctionStatsResult {
258
302
  sinceMs: number;
259
303
  }
260
304
  /**
261
- * One declared index on a table, mirroring `@lunora/do`'s `TableIndexInfo`.
262
- * `type` is the index kind; `fields` the indexed columns (sort fields for rank,
263
- * text + filter fields for search, source field for vector); `unique` is set
264
- * only for unique secondary indexes.
265
- */
305
+ * One declared index on a table, mirroring `@lunora/do`'s `TableIndexInfo`.
306
+ * `type` is the index kind; `fields` the indexed columns (sort fields for rank,
307
+ * text + filter fields for search, source field for vector); `unique` is set
308
+ * only for unique secondary indexes.
309
+ */
266
310
  interface TableIndexInfo {
267
311
  fields: string[];
268
312
  name: string;
@@ -273,15 +317,25 @@ interface TableIndexInfo {
273
317
  interface TableIndexesResult {
274
318
  indexes: TableIndexInfo[];
275
319
  }
276
- /** Severity of a buffered log entry, mirroring `@lunora/do`'s `LogLevel`. */
277
- type LogLevel = "debug" | "error" | "info" | "warn";
278
320
  /**
279
- * One buffered log line returned by `__lunora_admin__:getLogs`. `functionPath`
280
- * is the RPC that produced it (when known); `timestamp` is epoch-ms. Mirrors
281
- * `@lunora/do`'s `LogEntry`.
282
- */
321
+ * Severity of a buffered log entry, mirroring `@lunora/do`'s `LogLevel` — the
322
+ * full seven-tier `ctx.log` ramp (`trace`→`fatal`). A worker predating the
323
+ * un-folded buffer only ever sends the four console tiers, which are a subset.
324
+ */
325
+ type LogLevel = "debug" | "error" | "fatal" | "info" | "log" | "trace" | "warn";
326
+ /**
327
+ * One buffered log line returned by `__lunora_admin__:getLogs`. `functionPath`
328
+ * is the RPC that produced it (when known); `timestamp` is epoch-ms.
329
+ * `instance`/`exitCode` are populated for container lifecycle entries
330
+ * (`instance` = the per-instance Durable Object id, `exitCode` = the process
331
+ * exit code parsed out of a `stop` event). Mirrors `@lunora/do`'s `LogEntry`.
332
+ */
283
333
  interface LogEntry {
334
+ exitCode?: number;
335
+ /** Structured fields from a `ctx.log.&lt;level>(message, fields)` / `ctx.log.with(fields)` call, when present. */
336
+ fields?: Record<string, unknown>;
284
337
  functionPath?: string;
338
+ instance?: string;
285
339
  level: LogLevel;
286
340
  message: string;
287
341
  timestamp: number;
@@ -291,13 +345,13 @@ interface LogsResult {
291
345
  entries: LogEntry[];
292
346
  }
293
347
  /**
294
- * One recorded admin operation returned by `__lunora_admin__:getAuditLog`,
295
- * mirroring `@lunora/do`'s `AuditEntry`. Unlike the in-memory logs, the audit
296
- * log is durable and survives hibernation/restart. `seq` is a monotonic
297
- * per-shard cursor; `op` the short op name (`writeRow`, `runMigration`,
298
- * `importShard`, `applyCdc`); `table`/`id` are present when the op targets one;
299
- * `detail` carries op-specific context (notably the acting `userId`).
300
- */
348
+ * One recorded admin operation returned by `__lunora_admin__:getAuditLog`,
349
+ * mirroring `@lunora/do`'s `AuditEntry`. Unlike the in-memory logs, the audit
350
+ * log is durable and survives hibernation/restart. `seq` is a monotonic
351
+ * per-shard cursor; `op` the short op name (`writeRow`, `runMigration`,
352
+ * `importShard`, `applyCdc`); `table`/`id` are present when the op targets one;
353
+ * `detail` carries op-specific context (notably the acting `userId`).
354
+ */
301
355
  interface AuditEntry {
302
356
  detail?: Record<string, unknown>;
303
357
  id?: string;
@@ -311,17 +365,17 @@ interface AuditLogResult {
311
365
  entries: AuditEntry[];
312
366
  }
313
367
  /**
314
- * How a deployment binding/var classifies, mirroring `@lunora/do`'s `SettingKind`.
315
- * `var` is a plain Worker var, `secret` a sensitive string (always masked), and
316
- * `binding` a non-string binding object (R2/KV/DO/D1/queue/service).
317
- */
368
+ * How a deployment binding/var classifies, mirroring `@lunora/do`'s `SettingKind`.
369
+ * `var` is a plain Worker var, `secret` a sensitive string (always masked), and
370
+ * `binding` a non-string binding object (R2/KV/DO/D1/queue/service).
371
+ */
318
372
  type SettingKind = "binding" | "secret" | "var";
319
373
  /**
320
- * One row of the read-only deployment-settings view, mirroring `@lunora/do`'s
321
- * `SettingEntry`. `value` is a masked preview for `var`/`secret` strings (never
322
- * the raw secret) and `null` for `binding` entries. The server masks every
323
- * string value, so the studio only ever renders the masked text.
324
- */
374
+ * One row of the read-only deployment-settings view, mirroring `@lunora/do`'s
375
+ * `SettingEntry`. `value` is a masked preview for `var`/`secret` strings (never
376
+ * the raw secret) and `null` for `binding` entries. The server masks every
377
+ * string value, so the studio only ever renders the masked text.
378
+ */
325
379
  interface SettingEntry {
326
380
  /** Coarse runtime class for `binding` entries (`r2`, `kv`, `durable-object`, …). */
327
381
  bindingType?: string;
@@ -330,10 +384,10 @@ interface SettingEntry {
330
384
  value: null | string;
331
385
  }
332
386
  /**
333
- * Best-effort deploy metadata, mirroring `@lunora/do`'s `DeployInfo`. Every
334
- * field is optional: the server reads only what the Worker `env` exposes and
335
- * omits the rest.
336
- */
387
+ * Best-effort deploy metadata, mirroring `@lunora/do`'s `DeployInfo`. Every
388
+ * field is optional: the server reads only what the Worker `env` exposes and
389
+ * omits the rest.
390
+ */
337
391
  interface DeployInfo {
338
392
  deploymentId?: string;
339
393
  environment?: string;
@@ -346,24 +400,24 @@ interface SettingsResult {
346
400
  settings: SettingEntry[];
347
401
  }
348
402
  /**
349
- * Ordering/visual weight of a {@link SecurityFinding}, mirroring `@lunora/do`'s
350
- * `SecurityFindingLevel`. Shares the studio's insight-severity vocabulary so the
351
- * Security and Performance advisors render with one badge palette.
352
- */
403
+ * Ordering/visual weight of a {@link SecurityFinding}, mirroring `@lunora/do`'s
404
+ * `SecurityFindingLevel`. Shares the studio's insight-severity vocabulary so the
405
+ * Security and Performance advisors render with one badge palette.
406
+ */
353
407
  type SecurityFindingLevel = "error" | "info" | "warning";
354
408
  /**
355
- * Which deployment-level security heuristic fired, mirroring `@lunora/do`'s
356
- * `SecurityFindingKind`. The studio maps each kind to a localized title,
357
- * explanation, and remediation hint; the wire payload carries only the kind,
358
- * level, and optional `detail`.
359
- */
409
+ * Which deployment-level security heuristic fired, mirroring `@lunora/do`'s
410
+ * `SecurityFindingKind`. The studio maps each kind to a localized title,
411
+ * explanation, and remediation hint; the wire payload carries only the kind,
412
+ * level, and optional `detail`.
413
+ */
360
414
  type SecurityFindingKind = "admin-token-weak" | "auth-secret-weak" | "cookies-insecure" | "cors-wildcard-credentials" | "csrf-disabled" | "dev-args-unredacted" | "security-headers-disabled" | "ws-gate-open";
361
415
  /**
362
- * One detected security issue from `__lunora_admin__:getSecurityAudit`, mirroring
363
- * `@lunora/do`'s `SecurityFinding`. `detail` carries kind-specific context the
364
- * studio interpolates into the localized copy (e.g. `{ length, min }` for a weak
365
- * admin token); absent when the kind needs none.
366
- */
416
+ * One detected security issue from `__lunora_admin__:getSecurityAudit`, mirroring
417
+ * `@lunora/do`'s `SecurityFinding`. `detail` carries kind-specific context the
418
+ * studio interpolates into the localized copy (e.g. `{ length, min }` for a weak
419
+ * admin token); absent when the kind needs none.
420
+ */
367
421
  interface SecurityFinding {
368
422
  detail?: Record<string, unknown>;
369
423
  kind: SecurityFindingKind;
@@ -384,16 +438,21 @@ interface TablePage {
384
438
  /** Foreign-key columns (column → target table) for `v.id("target")` fields, so the UI can link those cells. */
385
439
  refs?: Record<string, string>;
386
440
  rows: Record<string, unknown>[];
387
- total: number;
441
+ /**
442
+ * Total rows matching the predicate. Absent when the read passed
443
+ * `skipCount: true` — the data browser sources the count from a separate,
444
+ * predicate-keyed read so paging never re-runs the COUNT.
445
+ */
446
+ total?: number;
388
447
  }
389
448
  /** Direction a data migration is run in. Mirrors `@lunora/do`. */
390
449
  type MigrationDirection = "down" | "up";
391
450
  /** Lifecycle of a data-migration run. Mirrors `@lunora/do`. */
392
451
  type MigrationStatus = "completed" | "failed" | "in_progress";
393
452
  /**
394
- * One persisted migration run-state row, as returned by the
395
- * `__lunora_admin__:migrationStatus` RPC (`{ migrations: MigrationStatusRow[] }`).
396
- */
453
+ * One persisted migration run-state row, as returned by the
454
+ * `__lunora_admin__:migrationStatus` RPC (`{ migrations: MigrationStatusRow[] }`).
455
+ */
397
456
  interface MigrationStatusRow {
398
457
  changed: number;
399
458
  cursor: null | string;
@@ -442,23 +501,23 @@ interface ImportShardResult {
442
501
  inserted: Record<string, number>;
443
502
  }
444
503
  /**
445
- * One shard's request total from the worker's `POST /_lunora/admin/shard-traffic`
446
- * endpoint, mirroring `@lunora/runtime`'s `ShardTrafficEntry`. `requests` is the
447
- * shard's lifetime dispatch count (`0` for a shard that failed/timed out);
448
- * `shardKey` is the DO id name (`""` for the root shard). The cross-shard feed
449
- * the `hot_shard` runtime advisor consumes to compute skew.
450
- */
504
+ * One shard's request total from the worker's `POST /_lunora/admin/shard-traffic`
505
+ * endpoint, mirroring `@lunora/runtime`'s `ShardTrafficEntry`. `requests` is the
506
+ * shard's lifetime dispatch count (`0` for a shard that failed/timed out);
507
+ * `shardKey` is the DO id name (`""` for the root shard). The cross-shard feed
508
+ * the `hot_shard` runtime advisor consumes to compute skew.
509
+ */
451
510
  interface ShardTrafficEntry {
452
511
  requests: number;
453
512
  shardKey: string;
454
513
  }
455
514
  /**
456
- * Payload of a `POST /_lunora/admin/shard-traffic` call, mirroring the runtime
457
- * coordinator's shard-traffic fan-out result: one `{ shardKey, requests }` entry
458
- * per live shard plus the ok / failed counts. Fanned out on demand (not on the
459
- * metrics hot path) so the panel can feed `hot_shard` the whole shard set's
460
- * request volumes.
461
- */
515
+ * Payload of a `POST /_lunora/admin/shard-traffic` call, mirroring the runtime
516
+ * coordinator's shard-traffic fan-out result: one `{ shardKey, requests }` entry
517
+ * per live shard plus the ok / failed counts. Fanned out on demand (not on the
518
+ * metrics hot path) so the panel can feed `hot_shard` the whole shard set's
519
+ * request volumes.
520
+ */
462
521
  interface ShardTrafficResult {
463
522
  failed: number;
464
523
  ok: number;
@@ -467,25 +526,25 @@ interface ShardTrafficResult {
467
526
  /** Visual + ordering weight of a detected issue. */
468
527
  type InsightSeverity = "error" | "info" | "warning";
469
528
  /**
470
- * Which heuristic fired. The panel maps each kind to a localized title/detail,
471
- * so the detection stays free of presentation strings (and trivially testable).
472
- *
473
- * `missing-index` is the causal upgrade of `slow-function`: a slow function
474
- * whose latency is explained by a full-table scan. When the scan attribution
475
- * pins the cause, the insight names the scanned table(s) (`tables`) and deep-
476
- * links to the Schema/Indexes tab to add the index, rather than leaving the
477
- * slowness an unattributed symptom.
478
- */
529
+ * Which heuristic fired. The panel maps each kind to a localized title/detail,
530
+ * so the detection stays free of presentation strings (and trivially testable).
531
+ *
532
+ * `missing-index` is the causal upgrade of `slow-function`: a slow function
533
+ * whose latency is explained by a full-table scan. When the scan attribution
534
+ * pins the cause, the insight names the scanned table(s) (`tables`) and deep-
535
+ * links to the Schema/Indexes tab to add the index, rather than leaving the
536
+ * slowness an unattributed symptom.
537
+ */
479
538
  type InsightKind = "high-error-rate" | "high-evictions" | "high-write-contention" | "low-cache-hit-rate" | "missing-index" | "slow-function";
480
539
  /**
481
- * One detected issue. `value` is the headline number whose meaning depends on
482
- * `kind`: a 0–1 rate for cache-hit / error-rate, a millisecond figure for
483
- * slow-function / missing-index, an entry count for evictions. `fn` is set only
484
- * for per-function insights; `message` carries the last error for
485
- * high-error-rate; `tables` carries the full-scanned tables (busiest first) for
486
- * the causal `missing-index` kind. For `high-write-contention` it is the OCC
487
- * conflict ratio (conflicts / calls).
488
- */
540
+ * One detected issue. `value` is the headline number whose meaning depends on
541
+ * `kind`: a 0–1 rate for cache-hit / error-rate, a millisecond figure for
542
+ * slow-function / missing-index, an entry count for evictions. `fn` is set only
543
+ * for per-function insights; `message` carries the last error for
544
+ * high-error-rate; `tables` carries the full-scanned tables (busiest first) for
545
+ * the causal `missing-index` kind. For `high-write-contention` it is the OCC
546
+ * conflict ratio (conflicts / calls).
547
+ */
489
548
  interface Insight {
490
549
  fn?: string;
491
550
  kind: InsightKind;
@@ -513,181 +572,165 @@ interface InsightThresholds {
513
572
  }
514
573
  declare const DEFAULT_INSIGHT_THRESHOLDS: InsightThresholds;
515
574
  /**
516
- * Derive a prioritised list of issues from the two snapshots the studio
517
- * already pulls — the `getMetrics` health snapshot and the `getFunctionStats`
518
- * per-function table. Pure and side-effect-free: same inputs, same output, so
519
- * the heuristics can be unit-tested without rendering.
520
- *
521
- * Heuristics: low-cache-hit-rate (cache below the threshold once enough samples
522
- * exist — a cold cache isn't a problem); high-evictions (more evictions than
523
- * hits, so the cache is too small or churning on invalidation); missing-index (a
524
- * slow function whose latency is *explained* by a full-table scan — the causal
525
- * upgrade of slow-function, naming the scanned table(s)); slow-function (a
526
- * function whose slowest call crosses the threshold with no scan attribution to
527
- * blame); high-error-rate (a function failing over a meaningful count);
528
- * high-write-contention (a function whose OCC write conflicts make up a
529
- * meaningful share of calls — a sharding candidate).
530
- *
531
- * A slow function with full-scan attribution emits `missing-index` (causal, with
532
- * `tables`) instead of the bare `slow-function`, so the panel can link straight
533
- * to the fix rather than restating the symptom.
534
- */
575
+ * Derive a prioritised list of issues from the two snapshots the studio
576
+ * already pulls — the `getMetrics` health snapshot and the `getFunctionStats`
577
+ * per-function table. Pure and side-effect-free: same inputs, same output, so
578
+ * the heuristics can be unit-tested without rendering.
579
+ *
580
+ * Heuristics: low-cache-hit-rate (cache below the threshold once enough samples
581
+ * exist — a cold cache isn't a problem); high-evictions (more evictions than
582
+ * hits, so the cache is too small or churning on invalidation); missing-index (a
583
+ * slow function whose latency is *explained* by a full-table scan — the causal
584
+ * upgrade of slow-function, naming the scanned table(s)); slow-function (a
585
+ * function whose slowest call crosses the threshold with no scan attribution to
586
+ * blame); high-error-rate (a function failing over a meaningful count);
587
+ * high-write-contention (a function whose OCC write conflicts make up a
588
+ * meaningful share of calls — a sharding candidate).
589
+ *
590
+ * A slow function with full-scan attribution emits `missing-index` (causal, with
591
+ * `tables`) instead of the bare `slow-function`, so the panel can link straight
592
+ * to the fix rather than restating the symptom.
593
+ */
535
594
  declare const deriveInsights: (metrics: ShardMetrics | null, functions: FunctionCallStat[] | null, thresholds?: InsightThresholds) => Insight[];
536
595
  interface InsightsPanelProps {
537
596
  /** Shard key the snapshots target on first load. Defaults to the root shard. */
538
597
  readonly initialShardKey?: string;
539
598
  /**
540
- * Fan the cross-shard traffic feed out for `table`, returning each shard's
541
- * `{ shardKey, requests }` total — the input the `hot_shard` advisor lint
542
- * needs. Defaults to `client.shardTraffic(table)` (the admin-gated
543
- * `POST /_lunora/admin/shard-traffic` fan-out). Best-effort: a rejection
544
- * leaves `hot_shard` dormant rather than blanking the panel. Injectable so
545
- * tests can drive the skew without a worker.
546
- */
599
+ * Fan the cross-shard traffic feed out for `table`, returning each shard's
600
+ * `{ shardKey, requests }` total — the input the `hot_shard` advisor lint
601
+ * needs. Defaults to `client.shardTraffic(table)` (the admin-gated
602
+ * `POST /_lunora/admin/shard-traffic` fan-out). Best-effort: a rejection
603
+ * leaves `hot_shard` dormant rather than blanking the panel. Injectable so
604
+ * tests can drive the skew without a worker.
605
+ */
547
606
  readonly loadShardTraffic?: (table: string) => Promise<ShardTrafficResult>;
548
607
  }
549
608
  /**
550
- * The Performance Advisor — a 1-to-1 of Supabase's Performance Advisor: severity
551
- * tabs over a findings table (via {@link AdvisorView}). It pulls the `getMetrics`
552
- * health snapshot and `getFunctionStats` per-function table for one shard, then
553
- * maps the issues {@link deriveInsights} detects (low cache hit rate, high
554
- * eviction, slow functions, missing indexes, error spikes) into rows. A
555
- * `missing-index` row carries an inline "add the index" jump to the Schema tab.
556
- * Both reads are best-effort — one failing still yields the other's insights.
557
- */
558
- declare const InsightsPanel: ({
559
- initialShardKey,
560
- loadShardTraffic
561
- }: InsightsPanelProps) => ReactElement;
562
- /**
563
- * The Security Advisor a 1-to-1 of Supabase's Security Advisor: severity tabs
564
- * (Errors / Warnings / Info) over a findings table. It pulls `getSecurityAudit`
565
- * (deployment-wide, so it targets the root shard and needs no shard selector) and
566
- * maps each finding the server derived from the Worker `env` — weak admin token,
567
- * an open WebSocket gate, a dev-mode request log keeping un-redacted args — into a
568
- * row. These are signals only lunora can surface: Cloudflare's dashboard can't
569
- * reason about lunora's admin/WS gates or its log-redaction policy.
570
- */
609
+ * The Performance Advisor — a 1-to-1 of Supabase's Performance Advisor: severity
610
+ * tabs over a findings table (via {@link AdvisorView}). It pulls the `getMetrics`
611
+ * health snapshot and `getFunctionStats` per-function table for one shard, then
612
+ * maps the issues {@link deriveInsights} detects (low cache hit rate, high
613
+ * eviction, slow functions, missing indexes, error spikes) into rows. A
614
+ * `missing-index` row carries an inline "add the index" jump to the Schema tab.
615
+ * Both reads are best-effort — one failing still yields the other's insights.
616
+ */
617
+ declare const InsightsPanel: ({ initialShardKey, loadShardTraffic }: InsightsPanelProps) => ReactElement;
618
+ /**
619
+ * The Security Advisor — a 1-to-1 of Supabase's Security Advisor: severity tabs
620
+ * (Errors / Warnings / Info) over a findings table. It pulls `getSecurityAudit`
621
+ * (deployment-wide, so it targets the root shard and needs no shard selector) and
622
+ * maps each finding the server derived from the Worker `env` weak admin token,
623
+ * an open WebSocket gate, a dev-mode request log keeping un-redacted args — into a
624
+ * row. These are signals only lunora can surface: Cloudflare's dashboard can't
625
+ * reason about lunora's admin/WS gates or its log-redaction policy.
626
+ */
571
627
  declare const SecurityAdvisorPanel: () => ReactElement;
572
628
  interface ApiDocsPanelProps {
573
629
  /**
574
- * Registered functions to document. Mirrors the list the Functions tab's
575
- * runner and stats panels receive — a query/mutation/action's `kind` is
576
- * compile-time-only, so it must be named here. When omitted the panel still
577
- * renders (tables come from the admin RPC) and shows an empty functions list.
578
- */
630
+ * Registered functions to document. Mirrors the list the Functions tab's
631
+ * runner and stats panels receive — a query/mutation/action's `kind` is
632
+ * compile-time-only, so it must be named here. When omitted the panel still
633
+ * renders (tables come from the admin RPC) and shows an empty functions list.
634
+ */
579
635
  readonly functions?: FunctionDescriptor[];
580
636
  /** Shard key the table list is read from. Defaults to the root shard. */
581
637
  readonly initialShardKey?: string;
582
638
  }
583
- /** Inputs every function snippet builder closes over — the split path plus its `kind`. */
584
- /**
585
- * Per-resource "how to call this from your app" browser, generated from the
586
- * registered functions and tables the studio already has no new endpoints.
587
- * The left rail lists functions grouped by file plus a Tables section; the right
588
- * pane shows copy-paste snippets (React / Client / CLI for functions; the typed
589
- * data-model usage for tables).
590
- *
591
- * Args are a placeholder: the real argument shape lives in the codegen'd `api`
592
- * types this browser never loads, the same way Supabase's usage snippets show
593
- * placeholders.
594
- */
595
- declare const ApiDocsPanel: ({
596
- functions,
597
- initialShardKey
598
- }: ApiDocsPanelProps) => ReactElement;
639
+ /**
640
+ * Per-resource "how to call this from your app" browser, generated from the
641
+ * registered functions and tables the studio already has no new endpoints.
642
+ * The left rail lists functions grouped by file plus a Tables section; the right
643
+ * pane shows copy-paste snippets (React / Client / CLI for functions; the typed
644
+ * data-model usage for tables).
645
+ *
646
+ * Args are a placeholder: the real argument shape lives in the codegen'd `api`
647
+ * types this browser never loads, the same way Supabase's usage snippets show
648
+ * placeholders.
649
+ */
650
+ declare const ApiDocsPanel: ({ functions, initialShardKey }: ApiDocsPanelProps) => ReactElement;
599
651
  interface ApiReferencePanelProps {
600
652
  /**
601
- * Inline OpenAPI document. When supplied the panel renders it directly and
602
- * skips the fetch — used by the mock harness and by hosts that already hold
603
- * the generated spec. When omitted the panel fetches the worker's
604
- * admin-gated `GET /_lunora/admin/openapi` endpoint via the client.
605
- */
653
+ * Inline OpenAPI document. When supplied the panel renders it directly and
654
+ * skips the fetch — used by the mock harness and by hosts that already hold
655
+ * the generated spec. When omitted the panel fetches the worker's
656
+ * admin-gated `GET /_lunora/admin/openapi` endpoint via the client.
657
+ */
606
658
  readonly spec?: unknown;
607
659
  }
608
660
  /**
609
- * In-studio OpenAPI reference: renders the generated OpenAPI 3.1 document with
610
- * the studio-native {@link ReferenceView} — a tag-grouped operation browser,
611
- * schema tables, a live "try it" console, and copy-paste request samples, all
612
- * themed to the studio. The spec comes from an inline
613
- * {@link ApiReferencePanelProps.spec} prop, or — by default — the worker's
614
- * admin-gated `GET /_lunora/admin/openapi` endpoint fetched through the client.
615
- *
616
- * This replaced the embedded Scalar reference (a Vue app in React): Scalar's
617
- * portal/overlay layers repeatedly intercepted clicks and froze the tab, and it
618
- * shipped a multi-megabyte bundle. The native view is overlay-free and reuses
619
- * the studio's own primitives.
620
- */
621
- declare const ApiReferencePanel: ({
622
- spec: inlineSpec
623
- }: ApiReferencePanelProps) => ReactElement;
661
+ * In-studio OpenAPI reference: renders the generated OpenAPI 3.1 document with
662
+ * the studio-native {@link ReferenceView} — a tag-grouped operation browser,
663
+ * schema tables, a live "try it" console, and copy-paste request samples, all
664
+ * themed to the studio. The spec comes from an inline
665
+ * {@link ApiReferencePanelProps.spec} prop, or — by default — the worker's
666
+ * admin-gated `GET /_lunora/admin/openapi` endpoint fetched through the client.
667
+ *
668
+ * This replaced the embedded Scalar reference (a Vue app in React): Scalar's
669
+ * portal/overlay layers repeatedly intercepted clicks and froze the tab, and it
670
+ * shipped a multi-megabyte bundle. The native view is overlay-free and reuses
671
+ * the studio's own primitives.
672
+ */
673
+ declare const ApiReferencePanel: ({ spec: inlineSpec }: ApiReferencePanelProps) => ReactElement;
624
674
  interface ApiTabProps {
625
675
  /** Registered functions documented by the snippets sub-view. Threaded host → studio. */
626
676
  readonly functions?: FunctionDescriptor[];
627
677
  /** Shard key the snippets view reads its table list from. */
628
678
  readonly initialShardKey?: string;
629
679
  /**
630
- * Inline OpenAPI document for the reference sub-view. When omitted the
631
- * reference fetches the worker's `GET /_lunora/admin/openapi` endpoint.
632
- */
680
+ * Inline OpenAPI document for the reference sub-view. When omitted the
681
+ * reference fetches the worker's `GET /_lunora/admin/openapi` endpoint.
682
+ */
633
683
  readonly openApiSpec?: unknown;
634
684
  /**
635
- * Inline OpenRPC document for the reference sub-view's OpenRPC format. When
636
- * omitted the OpenRPC view fetches the worker's `GET /_lunora/admin/openrpc`
637
- * endpoint. OpenRPC is the RPC-native spec (RPC functions only); OpenAPI
638
- * additionally covers `httpRouter()` REST routes.
639
- */
685
+ * Inline OpenRPC document for the reference sub-view's OpenRPC format. When
686
+ * omitted the OpenRPC view fetches the worker's `GET /_lunora/admin/openrpc`
687
+ * endpoint. OpenRPC is the RPC-native spec (RPC functions only); OpenAPI
688
+ * additionally covers `httpRouter()` REST routes.
689
+ */
640
690
  readonly openRpcSpec?: unknown;
641
691
  }
642
692
  /**
643
- * The studio's API tab. Hosts two complementary surfaces behind a segmented
644
- * toggle. The Reference view renders a machine-readable spec — the OpenAPI 3.1
645
- * document or the RPC-native OpenRPC document — through the studio-native
646
- * reference UI (operation browser, schema tables, a live "try it" console, and a
647
- * request-sample rail), with a small format switch between them. The Snippets
648
- * view is the per-function React / Client / CLI copy-paste browser
649
- * (`api-docs-panel`), the lightweight "how do I call this" DX.
650
- *
651
- * Reference is the default; OpenAPI is the default format (the richer,
652
- * spec-driven view that also covers REST). Each format degrades to a clear
653
- * empty state when its spec isn't wired.
654
- */
655
- declare const ApiTab: ({
656
- functions,
657
- initialShardKey,
658
- openApiSpec,
659
- openRpcSpec
660
- }: ApiTabProps) => ReactElement;
693
+ * The studio's API tab. Hosts two complementary surfaces behind a segmented
694
+ * toggle. The Reference view renders a machine-readable spec — the OpenAPI 3.1
695
+ * document or the RPC-native OpenRPC document — through the studio-native
696
+ * reference UI (operation browser, schema tables, a live "try it" console, and a
697
+ * request-sample rail), with a small format switch between them. The Snippets
698
+ * view is the per-function React / Client / CLI copy-paste browser
699
+ * (`api-docs-panel`), the lightweight "how do I call this" DX.
700
+ *
701
+ * Reference is the default; OpenAPI is the default format (the richer,
702
+ * spec-driven view that also covers REST). Each format degrades to a clear
703
+ * empty state when its spec isn't wired.
704
+ */
705
+ declare const ApiTab: ({ functions, initialShardKey, openApiSpec, openRpcSpec }: ApiTabProps) => ReactElement;
661
706
  interface OpenRpcReferencePanelProps {
662
707
  /**
663
- * Inline OpenRPC document. When supplied the panel renders it directly and
664
- * skips the fetch — used by the mock harness and by hosts that already hold
665
- * the generated spec. When omitted the panel fetches the worker's
666
- * admin-gated `GET /_lunora/admin/openrpc` endpoint via the client.
667
- */
708
+ * Inline OpenRPC document. When supplied the panel renders it directly and
709
+ * skips the fetch — used by the mock harness and by hosts that already hold
710
+ * the generated spec. When omitted the panel fetches the worker's
711
+ * admin-gated `GET /_lunora/admin/openrpc` endpoint via the client.
712
+ */
668
713
  readonly spec?: unknown;
669
714
  }
670
715
  /**
671
- * In-studio OpenRPC reference. OpenRPC is the RPC-native spec (a `methods` array
672
- * over the JSON-RPC-shaped `POST /_lunora/rpc` transport), documenting the RPC
673
- * functions only. It is parsed into the shared `ApiModel` and rendered by the
674
- * same studio-native {@link ReferenceView} the OpenAPI panel uses, so both
675
- * formats share one operation browser, schema view, try-it console, and sample
676
- * rail.
677
- *
678
- * The spec comes from an inline {@link OpenRpcReferencePanelProps.spec} prop, or
679
- * — by default — the worker's admin-gated `GET /_lunora/admin/openrpc` endpoint.
680
- */
681
- declare const OpenRpcReferencePanel: ({
682
- spec: inlineSpec
683
- }: OpenRpcReferencePanelProps) => ReactElement;
684
- /**
685
- * A shareable data-browser view: the table, storage tier, shard, structured
686
- * filters, substring search, and sort that together reproduce exactly what the
687
- * grid is showing. This is the unit that is serialized into the URL (so the link
688
- * IS the query) and persisted by name in {@link loadSavedQueries}. Every field is
689
- * optional so a partial/legacy URL still hydrates into a sensible default view.
690
- */
716
+ * In-studio OpenRPC reference. OpenRPC is the RPC-native spec (a `methods` array
717
+ * over the JSON-RPC-shaped `POST /_lunora/rpc` transport), documenting the RPC
718
+ * functions only. It is parsed into the shared `ApiModel` and rendered by the
719
+ * same studio-native {@link ReferenceView} the OpenAPI panel uses, so both
720
+ * formats share one operation browser, schema view, try-it console, and sample
721
+ * rail.
722
+ *
723
+ * The spec comes from an inline {@link OpenRpcReferencePanelProps.spec} prop, or
724
+ * — by default — the worker's admin-gated `GET /_lunora/admin/openrpc` endpoint.
725
+ */
726
+ declare const OpenRpcReferencePanel: ({ spec: inlineSpec }: OpenRpcReferencePanelProps) => ReactElement;
727
+ /**
728
+ * A shareable data-browser view: the table, storage tier, shard, structured
729
+ * filters, substring search, and sort that together reproduce exactly what the
730
+ * grid is showing. This is the unit that is serialized into the URL (so the link
731
+ * IS the query) and persisted by name in {@link loadSavedQueries}. Every field is
732
+ * optional so a partial/legacy URL still hydrates into a sensible default view.
733
+ */
691
734
  interface DataView {
692
735
  /** Structured `column operator value` clauses, AND-combined with the search. */
693
736
  filters?: FilterClause[];
@@ -710,54 +753,58 @@ interface SavedQuery {
710
753
  name: string;
711
754
  view: DataView;
712
755
  }
713
- /** Saved queries, most-recently-saved first. Empty when storage is unavailable or empty. */
714
756
  interface DataBrowserProps {
715
757
  /**
716
- * Allow editing: surfaces insert/edit/delete actions that issue
717
- * `__lunora_admin__:writeRow` ops through the schema-aware writer. Off by
718
- * default — the browser is read-only unless the host opts in.
719
- */
758
+ * Allow editing: surfaces insert/edit/delete actions that issue
759
+ * `__lunora_admin__:writeRow` ops through the schema-aware writer. Off by
760
+ * default — the browser is read-only unless the host opts in.
761
+ */
720
762
  readonly editable?: boolean;
721
763
  /**
722
- * Names of the `.global()` (D1-backed) tables. A `v.id` ref cell whose target
723
- * is one of these is followed cross-tier via `onNavigateToGlobal` instead of
724
- * being read from this shard (where it doesn't exist). Supplied by the Table
725
- * editor; defaults to none when the browser is used standalone.
726
- */
764
+ * Names of the `.global()` (D1-backed) tables. A `v.id` ref cell whose target
765
+ * is one of these is followed cross-tier via `onNavigateToGlobal` instead of
766
+ * being read from this shard (where it doesn't exist). Supplied by the Table
767
+ * editor; defaults to none when the browser is used standalone.
768
+ */
727
769
  readonly globalTableNames?: ReadonlySet<string>;
728
770
  /** Structured filters to hydrate from a shared link / saved query. */
729
771
  readonly initialFilters?: FilterClause[];
730
772
  /** Sort to hydrate from a shared link / saved query. */
731
773
  readonly initialOrderBy?: DataView["orderBy"];
774
+ /** Comma-separated pinned columns from the URL; wins over the per-browser default. */
775
+ readonly initialPins?: string;
732
776
  /** Substring search to hydrate from a shared link / saved query. */
733
777
  readonly initialSearch?: string;
734
778
  /** Shard key the browser targets on first load. Defaults to the root shard. */
735
779
  readonly initialShardKey?: string;
736
780
  /**
737
- * Follow a `v.id` ref whose target is a global table — the Table editor switches
738
- * to the global tier and opens that table. When omitted (standalone use), a ref
739
- * to a global table falls through to the in-shard read (and surfaces its error).
740
- */
781
+ * Follow a `v.id` ref whose target is a global table — the Table editor switches
782
+ * to the global tier and opens that table. When omitted (standalone use), a ref
783
+ * to a global table falls through to the in-shard read (and surfaces its error).
784
+ */
741
785
  readonly onNavigateToGlobal?: (table: string, id: string) => void;
742
786
  /**
743
- * Called whenever the open table changes, so the host can mirror it to the URL
744
- * (the Table editor pushes `?table=…`). Omitted in standalone use.
745
- */
746
- readonly onSelectTable?: (table: string) => void;
787
+ * Navigate the URL to a table (the Table editor pushes `?table=…`), opening it
788
+ * clean; `options.search` pre-fills the search for an FK-cell traversal.
789
+ * Omitted in standalone use.
790
+ */
791
+ readonly onSelectTable?: (table: string, options?: {
792
+ search?: string;
793
+ }) => void;
747
794
  /**
748
- * Called whenever the loaded view (shard / search / filters / sort) changes, so
749
- * the host can mirror it to the URL — making every view a shareable link.
750
- * Omitted in standalone use (view state stays in-component).
751
- */
795
+ * Called whenever the loaded view (shard / search / filters / sort) changes, so
796
+ * the host can mirror it to the URL — making every view a shareable link.
797
+ * Omitted in standalone use (view state stays in-component).
798
+ */
752
799
  readonly onViewChange?: (view: Pick<DataView, "filters" | "orderBy" | "search" | "shard">) => void;
753
800
  /** Rows requested per page. Clamped server-side to `[1, 500]`. */
754
801
  readonly pageSize?: number;
755
802
  /**
756
- * The canned-query toolbar's handlers + saved list. Supplied by the Table editor
757
- * (it owns the router and the `saved-queries` localStorage helper); omitted in
758
- * standalone use, which hides the toolbar entirely. `onSaveQuery` receives the
759
- * name plus the current view to persist.
760
- */
803
+ * The canned-query toolbar's handlers + saved list. Supplied by the Table editor
804
+ * (it owns the router and the `saved-queries` localStorage helper); omitted in
805
+ * standalone use, which hides the toolbar entirely. `onSaveQuery` receives the
806
+ * name plus the current view to persist.
807
+ */
761
808
  readonly queryBar?: {
762
809
  readonly onApplyQuery: (query: SavedQuery) => void;
763
810
  readonly onCopyLink: () => void;
@@ -766,50 +813,36 @@ interface DataBrowserProps {
766
813
  readonly saved: ReadonlyArray<SavedQuery>;
767
814
  };
768
815
  /**
769
- * The schema/source selector rendered at the top of the table-list sidebar —
770
- * the Table editor's `schema public ▾` switch. Supplied when this browser is
771
- * composed into the Table editor; omitted when it's used alone.
772
- */
816
+ * The schema/source selector rendered at the top of the table-list sidebar —
817
+ * the Table editor's `schema public ▾` switch. Supplied when this browser is
818
+ * composed into the Table editor; omitted when it's used alone.
819
+ */
773
820
  readonly schemaSwitch?: ReactNode;
774
821
  /**
775
- * The table named in the URL. Drives the selection — a deep link or browser
776
- * back/forward to a different `?table=…` re-opens that table. Supplied by the
777
- * Table editor; omitted in standalone use (selection stays purely in-component).
778
- */
822
+ * The table named in the URL. Drives the selection — a deep link or browser
823
+ * back/forward to a different `?table=…` re-opens that table. Supplied by the
824
+ * Table editor; omitted in standalone use (selection stays purely in-component).
825
+ */
779
826
  readonly tableParam?: string;
780
827
  }
781
828
  /**
782
- * Read-only data browser for a single shard's SQLite database. Lists the user
783
- * tables (via the `__lunora_admin__:listTables` RPC), then pages through the
784
- * rows of whichever table is selected (`__lunora_admin__:readTablePage`).
785
- *
786
- * Both calls travel over the ordinary `useLunora` client transport; the
787
- * admin RPCs are intercepted inside the Durable Object and are gated by the
788
- * server's `LUNORA_ADMIN_TOKEN`. The host is responsible for configuring the
789
- * client's auth token — this component issues no credentials of its own.
790
- *
791
- * The table view is built on a headless `@tanstack/react-table` model: column
792
- * defs derive from `page.columns`, sorting and (global) filtering run
793
- * page-locally over the loaded rows, and the rendered rows are virtualized with
794
- * `@tanstack/react-virtual` so a large page never inflates the DOM. None of this
795
- * touches the server — pagination still flows through `readTablePage`. All of
796
- * that state lives in {@link useDataBrowser}; this component is just the markup.
797
- */
798
- declare const DataBrowser: ({
799
- editable,
800
- globalTableNames,
801
- initialFilters,
802
- initialOrderBy,
803
- initialSearch,
804
- initialShardKey,
805
- onNavigateToGlobal,
806
- onSelectTable,
807
- onViewChange,
808
- pageSize: initialPageSize,
809
- queryBar,
810
- schemaSwitch,
811
- tableParam
812
- }: DataBrowserProps) => ReactElement;
829
+ * Read-only data browser for a single shard's SQLite database. Lists the user
830
+ * tables (via the `__lunora_admin__:listTables` RPC), then pages through the
831
+ * rows of whichever table is selected (`__lunora_admin__:readTablePage`).
832
+ *
833
+ * Both calls travel over the ordinary `useLunora` client transport; the
834
+ * admin RPCs are intercepted inside the Durable Object and are gated by the
835
+ * server's `LUNORA_ADMIN_TOKEN`. The host is responsible for configuring the
836
+ * client's auth token — this component issues no credentials of its own.
837
+ *
838
+ * The table view is built on a headless `@tanstack/react-table` model: column
839
+ * defs derive from `page.columns`, sorting and (global) filtering run
840
+ * page-locally over the loaded rows, and the rendered rows are virtualized with
841
+ * `@tanstack/react-virtual` so a large page never inflates the DOM. None of this
842
+ * touches the server — pagination still flows through `readTablePage`. All of
843
+ * that state lives in {@link useDataBrowser}; this component is just the markup.
844
+ */
845
+ declare const DataBrowser: ({ editable, globalTableNames, initialFilters, initialOrderBy, initialPins, initialSearch, initialShardKey, onNavigateToGlobal, onSelectTable, onViewChange, pageSize: initialPageSize, queryBar, schemaSwitch, tableParam }: DataBrowserProps) => ReactElement;
813
846
  /** A filter row as edited in the UI — the value is always a string until coerced for the wire. */
814
847
  interface EditableFilter {
815
848
  column: string;
@@ -817,184 +850,165 @@ interface EditableFilter {
817
850
  value: string;
818
851
  }
819
852
  /**
820
- * Convert the UI's string-valued filter rows into wire {@link FilterClause}s:
821
- * drops rows with no column, and coerces a numeric string to a number for the
822
- * comparison operators (so `age > 18` compares numerically, not lexically).
823
- * `contains` always stays a string.
824
- */
853
+ * Convert the UI's string-valued filter rows into wire {@link FilterClause}s:
854
+ * drops rows with no column, and coerces a canonical numeric string to a number for
855
+ * every comparison operator (so `age > 18` compares numerically, not lexically, and
856
+ * an `eq` on a numeric column still matches — see {@link coerceFilterValue} for why a
857
+ * numeric-looking but non-canonical string like a zip code stays text). `contains`
858
+ * always stays a string.
859
+ */
825
860
  declare const toFilterClauses: (filters: ReadonlyArray<EditableFilter>) => FilterClause[];
826
861
  /**
827
- * The data browser's filtering controls: the substring search box plus a stack
828
- * of structured `column operator value` rows. All state is owned by the parent
829
- * (the data-browser model); this is the control markup, emitting the full
830
- * filter array up on every edit. Raw strings (no i18n) to match the surrounding
831
- * data-browser controls.
832
- */
833
- declare const DataFilters: ({
834
- columns,
835
- filters,
836
- onFiltersChange,
837
- onSearchChange,
838
- search
839
- }: {
862
+ * The data browser's filtering controls: the substring search box plus a stack
863
+ * of structured `column operator value` rows. All state is owned by the parent
864
+ * (the data-browser model); this is the control markup, emitting the full
865
+ * filter array up on every edit. Raw strings (no i18n) to match the surrounding
866
+ * data-browser controls.
867
+ */
868
+ declare const DataFilters: ({ columns, filters, onAskAi, onFiltersChange, onSearchChange, search }: {
840
869
  columns: ReadonlyArray<string>;
841
870
  filters: ReadonlyArray<EditableFilter>;
871
+ /** Ask the model for structured clauses. Omitted when no AI binding is available. */
872
+ onAskAi?: (prompt: string) => void;
842
873
  onFiltersChange: (filters: EditableFilter[]) => void;
843
874
  onSearchChange: (event: ChangeEvent<HTMLInputElement>) => void;
844
875
  search: string;
845
876
  }) => ReactElement;
846
877
  interface GlobalDataBrowserProps {
847
878
  /**
848
- * Table to open automatically on mount (and whenever it changes). Used by the
849
- * Table editor when a `v.id` reference in a shard row points at a `.global()`
850
- * table: clicking it switches to the global tier and lands here with that table
851
- * pre-selected. Each distinct value is applied once, so the operator can still
852
- * navigate away afterwards.
853
- */
879
+ * Table to open automatically on mount (and whenever it changes). Used by the
880
+ * Table editor when a `v.id` reference in a shard row points at a `.global()`
881
+ * table: clicking it switches to the global tier and lands here with that table
882
+ * pre-selected. Each distinct value is applied once, so the operator can still
883
+ * navigate away afterwards.
884
+ */
854
885
  readonly initialTable?: string;
855
886
  /**
856
- * Called whenever the open table changes, so the host can mirror it to the URL
857
- * (the Table editor pushes `?table=…`). Omitted in standalone use.
858
- */
887
+ * Called whenever the open table changes, so the host can mirror it to the URL
888
+ * (the Table editor pushes `?table=…`). Omitted in standalone use.
889
+ */
859
890
  readonly onSelectTable?: (table: string) => void;
860
891
  /** Rows requested per page. Clamped server-side to `[1, 500]`. */
861
892
  readonly pageSize?: number;
862
893
  /**
863
- * The schema/source selector rendered at the top of the table-list sidebar —
864
- * the Table editor's `schema public ▾` switch. Supplied when this browser is
865
- * composed into the Table editor; omitted when it's used alone.
866
- */
894
+ * The schema/source selector rendered at the top of the table-list sidebar —
895
+ * the Table editor's `schema public ▾` switch. Supplied when this browser is
896
+ * composed into the Table editor; omitted when it's used alone.
897
+ */
867
898
  readonly schemaSwitch?: ReactNode;
868
899
  }
869
900
  /**
870
- * Read-only browser for `.global()` (D1-backed) tables. Twin of `DataBrowser`,
871
- * but not shard-scoped: it lists tables via `listGlobalTables()` and pages rows
872
- * via `readGlobalTablePage()`. Laid out like Supabase's Table Editor — a left
873
- * table sidebar + a bordered grid with a paginated footer — and gated by the
874
- * server's `LUNORA_ADMIN_TOKEN`.
875
- */
876
- declare const GlobalDataBrowser: ({
877
- initialTable,
878
- onSelectTable,
879
- pageSize: initialPageSize,
880
- schemaSwitch
881
- }?: GlobalDataBrowserProps) => ReactElement;
901
+ * Read-only browser for `.global()` (D1-backed) tables. Twin of `DataBrowser`,
902
+ * but not shard-scoped: it lists tables via `listGlobalTables()` and pages rows
903
+ * via `readGlobalTablePage()`. Laid out like Supabase's Table Editor — a left
904
+ * table sidebar + a bordered grid with a paginated footer — and gated by the
905
+ * server's `LUNORA_ADMIN_TOKEN`.
906
+ */
907
+ declare const GlobalDataBrowser: ({ initialTable, onSelectTable, pageSize: initialPageSize, schemaSwitch }?: GlobalDataBrowserProps) => ReactElement;
882
908
  interface TableEditorProps {
883
909
  /**
884
- * Allow editing the shard-local tables (insert/edit/delete). Forwarded to the
885
- * shard {@link DataBrowser}; the global D1 browser is always read-only. Off by
886
- * default — see {@link DataBrowser}.
887
- */
910
+ * Allow editing the shard-local tables (insert/edit/delete). Forwarded to the
911
+ * shard {@link DataBrowser}; the global D1 browser is always read-only. Off by
912
+ * default — see {@link DataBrowser}.
913
+ */
888
914
  readonly editable?: boolean;
889
915
  /** Shard key the shard browser targets on first load. Defaults to the root shard. */
890
916
  readonly initialShardKey?: string;
891
917
  }
892
918
  /**
893
- * The Table editor: browses your application's tables across both storage tiers
894
- * from one section. A schema switch in the sidebar header (Supabase's
895
- * `schema public ▾`) toggles between the per-shard SQLite browser
896
- * (`.shardBy(...)`, editable when the host opts in) and the read-only global D1
897
- * browser (`.global()`) — folding what used to be a separate "Global Tables" tab
898
- * into a single editor (`STUDIO-REDESIGN-PLAN.md` §2).
899
- *
900
- * The active tier and open table live in the URL search params (`?schema=global`,
901
- * `?table=…`) rather than component state, so every selection is a real, shareable
902
- * URL and browser back/forward moves between tables and tiers. The browsers push on
903
- * selection and re-open whatever the URL names.
904
- */
905
- declare const TableEditor: ({
906
- editable,
907
- initialShardKey
908
- }: TableEditorProps) => ReactElement;
919
+ * The Table editor: browses your application's tables across both storage tiers
920
+ * from one section. A schema switch in the sidebar header (Supabase's
921
+ * `schema public ▾`) toggles between the per-shard SQLite browser
922
+ * (`.shardBy(...)`, editable when the host opts in) and the read-only global D1
923
+ * browser (`.global()`) — folding what used to be a separate "Global Tables" tab
924
+ * into a single editor (`STUDIO-REDESIGN-PLAN.md` §2).
925
+ *
926
+ * The active tier and open table live in the URL search params (`?schema=global`,
927
+ * `?table=…`) rather than component state, so every selection is a real, shareable
928
+ * URL and browser back/forward moves between tables and tiers. The browsers push on
929
+ * selection and re-open whatever the URL names.
930
+ */
931
+ declare const TableEditor: ({ editable, initialShardKey }: TableEditorProps) => ReactElement;
909
932
  interface ExportImportPanelProps {
910
933
  /** Shard key the panel targets. Defaults to the root shard. */
911
934
  readonly initialShardKey?: string;
912
935
  }
913
936
  /**
914
- * Snapshot and restore a single shard's data as NDJSON.
915
- *
916
- * "Export" reads every shard-local row via `__lunora_admin__:exportShard` and
917
- * renders it as NDJSON for download/copy. "Import" parses NDJSON the operator
918
- * pastes in and replays it through `__lunora_admin__:importShard`, reporting
919
- * inserted counts, id conflicts and per-row errors. Globally-scoped (`.global()`)
920
- * tables live in D1 and are intentionally out of scope here.
921
- *
922
- * Both calls travel over the {@link useLunora} client transport and are gated by
923
- * the server's `LUNORA_ADMIN_TOKEN`.
924
- */
925
- declare const ExportImportPanel: ({
926
- initialShardKey
927
- }: ExportImportPanelProps) => ReactElement;
937
+ * Snapshot and restore a single shard's data as NDJSON.
938
+ *
939
+ * "Export" reads every shard-local row via `__lunora_admin__:exportShard` and
940
+ * renders it as NDJSON for download/copy. "Import" parses NDJSON the operator
941
+ * pastes in and replays it through `__lunora_admin__:importShard`, reporting
942
+ * inserted counts, id conflicts and per-row errors. Globally-scoped (`.global()`)
943
+ * tables live in D1 and are intentionally out of scope here.
944
+ *
945
+ * Both calls travel over the {@link useLunora} client transport and are gated by
946
+ * the server's `LUNORA_ADMIN_TOKEN`.
947
+ */
948
+ declare const ExportImportPanel: ({ initialShardKey }: ExportImportPanelProps) => ReactElement;
928
949
  interface MigrationsPanelProps {
929
950
  /** Shard key the panel targets. Defaults to the root shard. */
930
951
  readonly initialShardKey?: string;
931
952
  }
932
953
  /**
933
- * Inspect and drive data migrations on a single shard.
934
- *
935
- * Reads the persisted run-state via the `__lunora_admin__:migrationStatus` RPC
936
- * and lets an operator kick off a migration by id (`__lunora_admin__:runMigration`)
937
- * with a direction, an optional batch cap and a dry-run toggle. Both calls
938
- * travel over the ordinary {@link useLunora} client transport and are gated by
939
- * the server's `LUNORA_ADMIN_TOKEN` — this component issues no credentials of
940
- * its own.
941
- */
942
- declare const MigrationsPanel: ({
943
- initialShardKey
944
- }: MigrationsPanelProps) => ReactElement;
954
+ * Inspect and drive data migrations on a single shard.
955
+ *
956
+ * Reads the persisted run-state via the `__lunora_admin__:migrationStatus` RPC
957
+ * and lets an operator kick off a migration by id (`__lunora_admin__:runMigration`)
958
+ * with a direction, an optional batch cap and a dry-run toggle. Both calls
959
+ * travel over the ordinary {@link useLunora} client transport and are gated by
960
+ * the server's `LUNORA_ADMIN_TOKEN` — this component issues no credentials of
961
+ * its own.
962
+ */
963
+ declare const MigrationsPanel: ({ initialShardKey }: MigrationsPanelProps) => ReactElement;
945
964
  interface PitrPanelProps {
946
965
  /** Shard key the PITR ops target. Defaults to the root shard. */
947
966
  readonly initialShardKey?: string;
948
967
  }
949
968
  /**
950
- * Native Durable-Object point-in-time recovery for one shard — the **Time
951
- * Travel** view.
952
- *
953
- * Reads the shard's current bookmark, previews the bookmark nearest a chosen
954
- * time, and (behind a confirm step) restores the shard to a time or an explicit
955
- * bookmark via the `__lunora_admin__:pitrRestore` RPC, surfacing the returned
956
- * undo bookmark so the restore can be reversed. All ops run over the
957
- * {@link useLunora} client and are gated by the server's `LUNORA_ADMIN_TOKEN`.
958
- *
959
- * In-place recovery covers the last 30 days; for older or off-platform recovery
960
- * use the snapshot tier (`lunora backup` / the backup registry item).
961
- */
962
- declare const PitrPanel: ({
963
- initialShardKey
964
- }: PitrPanelProps) => ReactElement;
969
+ * Native Durable-Object point-in-time recovery for one shard — the **Time
970
+ * Travel** view.
971
+ *
972
+ * Reads the shard's current bookmark, previews the bookmark nearest a chosen
973
+ * time, and (behind a confirm step) restores the shard to a time or an explicit
974
+ * bookmark via the `__lunora_admin__:pitrRestore` RPC, surfacing the returned
975
+ * undo bookmark so the restore can be reversed. All ops run over the
976
+ * {@link useLunora} client and are gated by the server's `LUNORA_ADMIN_TOKEN`.
977
+ *
978
+ * In-place recovery covers the last 30 days; for older or off-platform recovery
979
+ * use the snapshot tier (`lunora backup` / the backup registry item).
980
+ */
981
+ declare const PitrPanel: ({ initialShardKey }: PitrPanelProps) => ReactElement;
965
982
  interface FunctionRunnerProps {
966
983
  /**
967
- * Functions to expose. When omitted, the runner auto-discovers them via the
968
- * client's `listFunctions()` (the admin-gated `/_lunora/admin/functions`
969
- * endpoint), so it works with no wiring when the worker is built with a
970
- * `functions` registry. Supply the list to override discovery.
971
- */
984
+ * Functions to expose. When omitted, the runner auto-discovers them via the
985
+ * client's `listFunctions()` (the admin-gated `/_lunora/admin/functions`
986
+ * endpoint), so it works with no wiring when the worker is built with a
987
+ * `functions` registry. Supply the list to override discovery.
988
+ */
972
989
  readonly functions?: FunctionDescriptor[];
973
990
  /**
974
- * Expose the "Run as identity" control — execute the selected function AS a
975
- * chosen authenticated user so an operator can test auth + RLS behavior.
976
- * Security-sensitive: the run is forwarded over the admin-gated
977
- * `__lunora_admin__:runAs` RPC, which forges the per-request identity. The
978
- * host sets this only on a trusted loopback-dev gate (the `Studio` component's
979
- * `runAsIdentity` prop); off by default, the runner always runs with the
980
- * caller's own (admin) identity.
981
- */
991
+ * Expose the "Run as identity" control — execute the selected function AS a
992
+ * chosen authenticated user so an operator can test auth + RLS behavior.
993
+ * Security-sensitive: the run is forwarded over the admin-gated
994
+ * `__lunora_admin__:runAs` RPC, which forges the per-request identity. The
995
+ * host sets this only on a trusted loopback-dev gate (the `Studio` component's
996
+ * `runAsIdentity` prop); off by default, the runner always runs with the
997
+ * caller's own (admin) identity.
998
+ */
982
999
  readonly runAsIdentity?: boolean;
983
1000
  }
984
1001
  /**
985
- * Interactive runner for the registered functions: pick one, edit its JSON
986
- * arguments, optionally target a shard, then invoke it against the live
987
- * {@link useLunora} client and inspect the result or error.
988
- *
989
- * By default the function list is auto-discovered from the worker's
990
- * `/_lunora/admin/functions` endpoint; pass an explicit `functions` array to
991
- * skip discovery (a query/mutation/action's `kind` is compile-time-only, so it
992
- * must be named).
993
- */
994
- declare const FunctionRunner: ({
995
- functions: functionsProp,
996
- runAsIdentity
997
- }?: FunctionRunnerProps) => ReactElement;
1002
+ * Interactive runner for the registered functions: pick one, edit its JSON
1003
+ * arguments, optionally target a shard, then invoke it against the live
1004
+ * {@link useLunora} client and inspect the result or error.
1005
+ *
1006
+ * By default the function list is auto-discovered from the worker's
1007
+ * `/_lunora/admin/functions` endpoint; pass an explicit `functions` array to
1008
+ * skip discovery (a query/mutation/action's `kind` is compile-time-only, so it
1009
+ * must be named).
1010
+ */
1011
+ declare const FunctionRunner: ({ functions: functionsProp, runAsIdentity }?: FunctionRunnerProps) => ReactElement;
998
1012
  interface FunctionStatsPanelProps {
999
1013
  /** Descriptors from codegen, used to annotate each row with the function's `kind`. */
1000
1014
  readonly functions?: FunctionDescriptor[];
@@ -1002,127 +1016,167 @@ interface FunctionStatsPanelProps {
1002
1016
  readonly initialShardKey?: string;
1003
1017
  }
1004
1018
  /**
1005
- * Per-function execution metrics for one shard: call count, error count/rate,
1006
- * mean and slowest handler latency, last-run time, and the most recent error
1007
- * message. Reads via the `__lunora_admin__:getFunctionStats` RPC over the
1008
- * {@link useLunora} client; gated by the server's `LUNORA_ADMIN_TOKEN`.
1009
- *
1010
- * Counters are per-DO-instance and reset on hibernation/restart — this is a
1011
- * "since this instance woke" readout, mirroring the metrics panel. The panel is
1012
- * always live: a subscription opens once the first seed commits a shard and
1013
- * re-pushes on every server write-flush so the table updates as mutations land.
1014
- */
1015
- declare const FunctionStatsPanel: ({
1016
- functions,
1017
- initialShardKey
1018
- }: FunctionStatsPanelProps) => ReactElement;
1019
+ * Per-function execution metrics for one shard: call count, error count/rate,
1020
+ * mean and slowest handler latency, last-run time, and the most recent error
1021
+ * message. Reads via the `__lunora_admin__:getFunctionStats` RPC through
1022
+ * `useAdminQuery`; gated by the server's `LUNORA_ADMIN_TOKEN`.
1023
+ *
1024
+ * Counters are per-DO-instance and reset on hibernation/restart — this is a
1025
+ * "since this instance woke" readout, mirroring the metrics panel. The panel is
1026
+ * always live: `useAdminQuery`'s `live` subscription re-pushes on every server
1027
+ * write-flush so the table updates as mutations land.
1028
+ */
1029
+ declare const FunctionStatsPanel: ({ functions, initialShardKey }: FunctionStatsPanelProps) => ReactElement;
1030
+ /** Which of the two endpoints a probe targets. */
1031
+ type ProbeKind = "live" | "ready";
1032
+ /** The result of one probe fetch — the HTTP status, the parsed body (or `null`), and any transport error. */
1033
+ interface ProbeSnapshot {
1034
+ /** The parsed health body, or `null` when the response wasn't JSON (e.g. an auth-gate rejection). */
1035
+ body: HealthBody | null;
1036
+ /** A transport/gate error message (network failure, or a non-JSON body), else `undefined`. */
1037
+ error?: string;
1038
+ /** Whether the HTTP status was 2xx. */
1039
+ ok: boolean;
1040
+ /** The HTTP status code (`0` when the request never completed). */
1041
+ status: number;
1042
+ }
1043
+ /** Fetch one probe. Injected in tests; the default (see {@link useDefaultProbe}) hits the live deployment. */
1044
+ type DeploymentHealthProbe = (kind: ProbeKind) => Promise<ProbeSnapshot>;
1045
+ interface DeploymentHealthPanelProps {
1046
+ /**
1047
+ * Injectable probe, used by tests to feed a canned response. When omitted the
1048
+ * panel fetches the connected deployment's `/_lunora/health` (and
1049
+ * `/health/ready`) directly — this is a plain HTTP route, not an admin RPC, so
1050
+ * it doesn't ride the `useAdminQuery` machinery. The admin bearer (when the
1051
+ * studio holds one) is attached so an `"admin"`-posture endpoint still answers.
1052
+ */
1053
+ readonly probe?: DeploymentHealthProbe;
1054
+ }
1055
+ /**
1056
+ * Deployment-health panel: renders the live liveness/readiness verdict and the
1057
+ * per-binding/subsystem checks from the deployment's `/_lunora/health` and
1058
+ * `/_lunora/health/ready` endpoints (plan 177). This is the operator's at-a-glance
1059
+ * "are the bindings up?" view — distinct from the app-level SLO panel (error
1060
+ * rate, auth failures, scheduler backlog) that shares the "Health" name.
1061
+ *
1062
+ * The endpoints are plain HTTP routes (not admin RPCs), so the panel fetches them
1063
+ * directly rather than through `useAdminQuery`. The body is deliberately
1064
+ * secret-free — only a check name, an up/down status, whether it's critical, and
1065
+ * a runtime-authored message (present only in the `"admin"` posture) — so nothing
1066
+ * rendered here can leak an env value, connection string, or binding secret.
1067
+ */
1068
+ declare const DeploymentHealthPanel: ({ probe }: DeploymentHealthPanelProps) => ReactElement;
1019
1069
  interface HomePanelProps {
1020
1070
  /** Shard key the health digest targets on first load. Defaults to the root shard. */
1021
1071
  readonly initialShardKey?: string;
1022
1072
  }
1023
1073
  /**
1024
- * The Home overview — the studio's landing page. It pulls the root shard's
1025
- * health snapshot, the function stats, the two advisor signals, the live
1026
- * subscription pulse, and the recent admin audit log, then presents an
1027
- * at-a-glance digest: a KPI row (requests, errors, latency, database size), a
1028
- * busiest-functions leaderboard, live connections, recent activity, the advisor
1029
- * summary, and connect/quick-link shortcuts. Every read is best-effort — a
1030
- * missing admin token or a cold instance leaves a card showing a muted
1031
- * placeholder rather than blanking the page.
1032
- */
1033
- declare const HomePanel: ({
1034
- initialShardKey
1035
- }: HomePanelProps) => ReactElement;
1074
+ * The Home overview — the studio's landing page. It pulls the root shard's
1075
+ * health snapshot, the function stats, the two advisor signals, the live
1076
+ * subscription pulse, and the recent admin audit log, then presents an
1077
+ * at-a-glance digest: a KPI row (requests, errors, latency, database size), a
1078
+ * busiest-functions leaderboard, live connections, recent activity, the advisor
1079
+ * summary, and connect/quick-link shortcuts. Every read is best-effort — a
1080
+ * missing admin token or a cold instance leaves a card showing a muted
1081
+ * placeholder rather than blanking the page.
1082
+ */
1083
+ declare const HomePanel: ({ initialShardKey }: HomePanelProps) => ReactElement;
1036
1084
  interface AuditPanelProps {
1037
1085
  /** Shard key the panel reports on. Defaults to the root shard. */
1038
1086
  readonly initialShardKey?: string;
1039
1087
  }
1040
1088
  /**
1041
- * Durable audit log for one shard: the admin state-changing operations
1042
- * (`writeRow`, `runMigration`, `importShard`, `applyCdc`) recorded to the
1043
- * reserved `__lunora_audit__` table, newest first. Reads via the
1044
- * `__lunora_admin__:getAuditLog` RPC over the {@link useLunora} client; gated by
1045
- * the server's `LUNORA_ADMIN_TOKEN`.
1046
- *
1047
- * Unlike the logs panel (an in-memory ring that resets on hibernation), the
1048
- * audit log is durable and bounded only by a retention cap. The panel is always
1049
- * live: a subscription opens once the first seed commits a shard and re-pushes on
1050
- * every server write-flush so new entries appear without a manual refresh. The op
1051
- * filter is client-side over the already-fetched buffer — it never triggers a refetch.
1052
- */
1053
- declare const AuditPanel: ({
1054
- initialShardKey
1055
- }: AuditPanelProps) => ReactElement;
1089
+ * Durable audit log for one shard: the admin state-changing operations
1090
+ * (`writeRow`, `runMigration`, `importShard`, `applyCdc`) recorded to the
1091
+ * reserved `__lunora_audit__` table, newest first. Reads via the
1092
+ * `__lunora_admin__:getAuditLog` RPC through `useAdminQuery`; gated by the
1093
+ * server's `LUNORA_ADMIN_TOKEN`.
1094
+ *
1095
+ * Unlike the logs panel (an in-memory ring that resets on hibernation), the
1096
+ * audit log is durable and bounded only by a retention cap. The panel is always
1097
+ * live: `useAdminQuery`'s `live` subscription re-pushes on every server
1098
+ * write-flush so new entries appear without a manual refresh. The op filter is
1099
+ * client-side over the already-fetched buffer — it never triggers a refetch.
1100
+ */
1101
+ declare const AuditPanel: ({ initialShardKey }: AuditPanelProps) => ReactElement;
1056
1102
  interface LogsPanelProps {
1057
1103
  /** Shard key the panel reports on. Defaults to the root shard. */
1058
1104
  readonly initialShardKey?: string;
1059
1105
  }
1060
- /** A relative time-range window over the Errors buffer, or `all` (no bound). */
1061
- /**
1062
- * The shard's log feed, newest first, over the gated `__lunora_admin__:*` RPC
1063
- * layer (gated by the server's `LUNORA_ADMIN_TOKEN`). Two views.
1064
- *
1065
- * The Requests view (`getRequestLog`) is the durable, structured per-request log
1066
- * `@lunora/do` writes once per `/rpc` dispatch (PLAN3 §1.1): function path,
1067
- * shard, acting user/identity, redacted args, outcome, duration, and tables
1068
- * read/written. It survives hibernation/restart (bounded retention) and is
1069
- * filtered/correlated SERVER-side on function-path prefix, userId, shard,
1070
- * outcome, and a touched table.
1071
- *
1072
- * The Errors view (`getLogs`) is the legacy in-memory RPC-error buffer, which
1073
- * only captures dispatch failures (path + message) and resets on hibernation
1074
- * kept for the "what's failing on this instance right now" view, filtered
1075
- * client-side.
1076
- *
1077
- * For the raw, un-attributed request firehose (which Lunora deliberately does
1078
- * NOT re-stream), a deep-link to Cloudflare Workers Observability is provided.
1079
- */
1080
- declare const LogsPanel: ({
1081
- initialShardKey
1082
- }: LogsPanelProps) => ReactElement;
1106
+ /**
1107
+ * The shard's log feed, newest first, over the gated `__lunora_admin__:*` RPC
1108
+ * layer (gated by the server's `LUNORA_ADMIN_TOKEN`). Two views.
1109
+ *
1110
+ * The Requests view (`getRequestLog`) is the durable, structured per-request log
1111
+ * `@lunora/do` writes once per `/rpc` dispatch (PLAN3 §1.1): function path,
1112
+ * shard, acting user/identity, redacted args, outcome, duration, and tables
1113
+ * read/written. It survives hibernation/restart (bounded retention) and is
1114
+ * filtered/correlated SERVER-side on function-path prefix, userId, shard,
1115
+ * outcome, and a touched table.
1116
+ *
1117
+ * The Errors view (`getLogs`) is the legacy in-memory RPC-error buffer, which
1118
+ * only captures dispatch failures (path + message) and resets on hibernation
1119
+ * kept for the "what's failing on this instance right now" view, filtered
1120
+ * client-side.
1121
+ *
1122
+ * For the raw, un-attributed request firehose (which Lunora deliberately does
1123
+ * NOT re-stream), a deep-link to Cloudflare Workers Observability is provided.
1124
+ */
1125
+ declare const LogsPanel: ({ initialShardKey }: LogsPanelProps) => ReactElement;
1083
1126
  interface MailPanelProps {
1084
1127
  /** Newest-N to load (default 100). */
1085
1128
  readonly limit?: number;
1086
1129
  }
1087
1130
  /**
1088
- * Dev mail catcher — a unified inbox of every email the app sent. `@lunora/mail`'s
1089
- * capture transport (wired in dev) intercepts each send and persists it to the
1090
- * root-shard mailbox instead of delivering, so verification / forgot-password and
1091
- * any app mail show up here with nothing leaving the machine. Reads the
1092
- * `__lunora_admin__:getCapturedMail` RPC over the {@link useLunora} client;
1093
- * gated by the server's `LUNORA_ADMIN_TOKEN`.
1094
- *
1095
- * The inbox is a single root-shard table with no write-flush to subscribe to, so
1096
- * it polls on a fixed interval (paused while the tab is hidden) new captured
1097
- * mail appears without a manual refresh. The HTML body is rendered in a fully
1098
- * sandboxed iframe (no script execution) so captured markup can't run in the studio.
1099
- */
1100
- declare const MailPanel: ({
1101
- limit
1102
- }: MailPanelProps) => ReactElement;
1131
+ * Dev mail catcher — a unified inbox of every email the app sent. `@lunora/mail`'s
1132
+ * capture transport (wired in dev) intercepts each send and persists it to the
1133
+ * root-shard mailbox instead of delivering, so verification / forgot-password and
1134
+ * any app mail show up here with nothing leaving the machine. The inbox model —
1135
+ * the `__lunora_admin__:getCapturedMail` read, its poll, the clear / send-test
1136
+ * actions, and the selection state — lives in {@link useMailCapture}; this
1137
+ * component is markup and copy.
1138
+ *
1139
+ * The inbox is a single root-shard table with no write-flush to subscribe to, so
1140
+ * it polls on a fixed interval (paused while the tab is hidden) new captured
1141
+ * mail appears without a manual refresh. The HTML body is rendered in a fully
1142
+ * sandboxed iframe (no script execution) so captured markup can't run in the studio.
1143
+ */
1144
+ declare const MailPanel: ({ limit }: MailPanelProps) => ReactElement;
1145
+ /**
1146
+ * The Notifications inspector — the app's registered `@lunora/notify` push
1147
+ * devices, read through the gated `__lunora_admin__:listPushSubscriptions` admin
1148
+ * RPC (`useAdminQuery`; gated by the server's `LUNORA_ADMIN_TOKEN`). Each row is
1149
+ * one registered device: its delivery kind, target endpoint, owning user, last
1150
+ * register/send touch, and the last-send status + any delivery error.
1151
+ *
1152
+ * The subscription store is a WORKER option (built from `env` via
1153
+ * `defineNotify({ store })`), not shard state, so this is a one-shot read with a
1154
+ * manual Refresh — there is no DO write-flush to subscribe to. When the app wires
1155
+ * no `@lunora/notify` store (or none yet registered), the RPC returns an empty
1156
+ * device list and the panel shows an empty state rather than erroring.
1157
+ */
1158
+ declare const NotificationsPanel: () => ReactElement;
1103
1159
  interface HealthPanelProps {
1104
1160
  /** Shard key the metric/log reads target on first load. Defaults to the root shard. */
1105
1161
  readonly initialShardKey?: string;
1106
1162
  }
1107
1163
  /**
1108
- * App-level health & SLO overview. On top of the original single-shard snapshot
1109
- * (recent errors, request/error counts, shards seen) it composes the
1110
- * lunora-attributed SLO signals the studio can already reach — app error
1111
- * rate, auth-failure rate, scheduler backlog, and migration status — each with a
1112
- * status badge, plus durable request/error and auth sparklines, and a
1113
- * worst-first per-function error-rate list. None of this is CF's per-Worker
1114
- * charting: it is attributed to lunora functions, the auth flow, and the
1115
- * scheduler/migration subsystems.
1116
- *
1117
- * Every read is independent and best-effort (via `Promise.allSettled`): a
1118
- * missing `LUNORA_ADMIN_TOKEN`, an unconfigured scheduler, or a cold instance
1119
- * degrades that one tile to `—` without blanking the rest. The overview is always
1120
- * live: a root-shard `getMetrics` subscription drives a full cross-shard re-pull
1121
- * on every write-flush (coalesced so a burst yields at most one in-flight pull).
1122
- */
1123
- declare const HealthPanel: ({
1124
- initialShardKey
1125
- }: HealthPanelProps) => ReactElement;
1164
+ * App-level health & SLO overview. On top of the original single-shard snapshot
1165
+ * (recent errors, request/error counts, shards seen) it composes the
1166
+ * lunora-attributed SLO signals the studio can already reach — app error
1167
+ * rate, auth-failure rate, scheduler backlog, and migration status — each with a
1168
+ * status badge, plus durable request/error and auth sparklines, and a
1169
+ * worst-first per-function error-rate list. None of this is CF's per-Worker
1170
+ * charting: it is attributed to lunora functions, the auth flow, and the
1171
+ * scheduler/migration subsystems.
1172
+ *
1173
+ * Every read is independent and best-effort (via `Promise.allSettled`): a
1174
+ * missing `LUNORA_ADMIN_TOKEN`, an unconfigured scheduler, or a cold instance
1175
+ * degrades that one tile to `—` without blanking the rest. The overview is always
1176
+ * live: a root-shard `getMetrics` subscription drives a full cross-shard re-pull
1177
+ * on every write-flush (coalesced so a burst yields at most one in-flight pull).
1178
+ */
1179
+ declare const HealthPanel: ({ initialShardKey }: HealthPanelProps) => ReactElement;
1126
1180
  /** One shard's metrics fetch outcome: the snapshot, or the error that shard returned. */
1127
1181
  interface ShardMetricsResult {
1128
1182
  error: null | string;
@@ -1143,120 +1197,110 @@ interface AggregateMetrics {
1143
1197
  totalRequests: number;
1144
1198
  }
1145
1199
  /**
1146
- * Roll up per-shard metrics into repo-wide totals. Errors-per-shard are kept as
1147
- * `failed` (a shard that's down is data, not a hard failure), and counters are
1148
- * summed only over reachable shards. The combined cache hit-rate weights by each
1149
- * shard's hits+misses so a busy shard dominates a quiet one.
1150
- */
1200
+ * Roll up per-shard metrics into repo-wide totals. Errors-per-shard are kept as
1201
+ * `failed` (a shard that's down is data, not a hard failure), and counters are
1202
+ * summed only over reachable shards. The combined cache hit-rate weights by each
1203
+ * shard's hits+misses so a busy shard dominates a quiet one.
1204
+ */
1151
1205
  declare const aggregateMetrics: (results: ReadonlyArray<ShardMetricsResult>) => AggregateMetrics;
1152
1206
  /**
1153
- * The shard keys to aggregate over. Durable Objects aren't enumerable, so this
1154
- * is the union of the root shard (`""`), an explicit current shard, and the
1155
- * recently-visited shards — de-duplicated, order-stable (root first). It's a
1156
- * best-effort "shards we know about", not every shard that exists.
1157
- */
1207
+ * The shard keys to aggregate over. Durable Objects aren't enumerable, so this
1208
+ * is the union of the root shard (`""`), an explicit current shard, and the
1209
+ * recently-visited shards — de-duplicated, order-stable (root first). It's a
1210
+ * best-effort "shards we know about", not every shard that exists.
1211
+ */
1158
1212
  declare const shardsToAggregate: (current: string, recents: ReadonlyArray<string>) => string[];
1159
1213
  interface MetricsPanelProps {
1160
1214
  /** Shard key the panel reports on. Defaults to the root shard. */
1161
1215
  readonly initialShardKey?: string;
1162
1216
  }
1163
1217
  /**
1164
- * Health snapshot for a single shard: request / error counts (since the DO last
1165
- * woke), its live SQLite size, and reactive-cache hit/miss stats when a cache is
1166
- * configured. Reads via the `__lunora_admin__:getMetrics` RPC over the
1167
- * {@link useLunora} client; gated by the server's `LUNORA_ADMIN_TOKEN`.
1168
- *
1169
- * Counters are per-DO-instance and reset on hibernation/restart — this is a
1170
- * "since this instance woke" readout, not a durable time series.
1171
- *
1172
- * The panel is always live: a `getMetrics` WebSocket subscription opens once the
1173
- * first one-shot seed commits a shard and re-pushes on every server write-flush,
1174
- * accumulating a client-side, in-memory series of requests-per-sample (the delta
1175
- * of `requests` between consecutive samples), rendered as an inline-SVG
1176
- * sparkline. The series is capped at {@link MAX_HISTORY} points and is lost on
1177
- * remount.
1178
- */
1179
- declare const MetricsPanel: ({
1180
- initialShardKey
1181
- }: MetricsPanelProps) => ReactElement;
1218
+ * Health snapshot for a single shard: request / error counts (since the DO last
1219
+ * woke), its live SQLite size, and reactive-cache hit/miss stats when a cache is
1220
+ * configured. Reads via the `__lunora_admin__:getMetrics` RPC over the
1221
+ * {@link useLunora} client; gated by the server's `LUNORA_ADMIN_TOKEN`.
1222
+ *
1223
+ * Counters are per-DO-instance and reset on hibernation/restart — this is a
1224
+ * "since this instance woke" readout, not a durable time series.
1225
+ *
1226
+ * The panel is always live: a `getMetrics` WebSocket subscription opens once the
1227
+ * first one-shot seed commits a shard and re-pushes on every server write-flush,
1228
+ * accumulating a client-side, in-memory series of requests-per-sample (the delta
1229
+ * of `requests` between consecutive samples), rendered as an inline-SVG
1230
+ * sparkline. The series is capped at {@link MAX_HISTORY} points and is lost on
1231
+ * remount.
1232
+ */
1233
+ declare const MetricsPanel: ({ initialShardKey }: MetricsPanelProps) => ReactElement;
1182
1234
  interface SchemaViewerProps {
1183
1235
  /** Shard key the viewer targets. Defaults to the root shard. */
1184
1236
  readonly initialShardKey?: string;
1185
1237
  /**
1186
- * Table to auto-expand once the shard's tables load. Set by the Insights
1187
- * "add the index" deep-link (`/schema?table=&lt;name>`) so the operator lands
1188
- * directly on the scanned table's index list instead of hunting for it.
1189
- * Re-applied whenever the value changes, so following the link a second time
1190
- * (same tab already open) re-expands the target.
1191
- */
1238
+ * Table to auto-expand once the shard's tables load. Set by the Insights
1239
+ * "add the index" deep-link (`/schema?table=&lt;name>`) so the operator lands
1240
+ * directly on the scanned table's index list instead of hunting for it.
1241
+ * Re-applied whenever the value changes, so following the link a second time
1242
+ * (same tab already open) re-expands the target.
1243
+ */
1192
1244
  readonly initialTable?: string;
1193
1245
  /**
1194
- * Enable the visual schema-editor overlay (add table / column / index). Off by
1195
- * default so the diagram stays read-only. Set only by the loopback dev hosts
1196
- * (see `StudioProps.schemaEditable`); when true, the authoring overlay
1197
- * (plan 024 Item 4) renders above the table lists and applies additive edits
1198
- * through the dev host's local schema-edit endpoint.
1199
- */
1246
+ * Enable the visual schema-editor overlay (add table / column / index). Off by
1247
+ * default so the diagram stays read-only. Set only by the loopback dev hosts
1248
+ * (see `StudioProps.schemaEditable`); when true, the authoring overlay
1249
+ * (plan 024 Item 4) renders above the table lists and applies additive edits
1250
+ * through the dev host's local schema-edit endpoint.
1251
+ */
1200
1252
  readonly schemaEditable?: boolean;
1201
1253
  }
1202
1254
  /**
1203
- * Schema overview that shows both storage tiers so the distinction is never a
1204
- * mystery. The shard section lists every user table in the selected Durable
1205
- * Object with row counts, and probes a table's columns on expand via a one-row
1206
- * `__lunora_admin__:readTablePage` (`PRAGMA table_info`). The global section
1207
- * lists every `.global()` table — including the auth tables (`user`, `session`,
1208
- * …) — via the client's `listGlobalTables()`, reading columns from a one-row
1209
- * `readGlobalTablePage` on expand.
1210
- *
1211
- * Two presentations: a **Table list** (searchable, expandable cards per tier)
1212
- * and a **Graph** — a single React Flow relationship diagram showing both tiers
1213
- * on one canvas, with cross-tier FK edges and its own in-canvas find-table box,
1214
- * tier filter, and legend.
1215
- *
1216
- * Read-only and gated by the server's `LUNORA_ADMIN_TOKEN`, like the rest of the
1217
- * studio's admin surface. Global discovery is best-effort: if D1 isn't
1218
- * configured the global section simply reports it, and the shard section still
1219
- * works.
1220
- */
1221
- declare const SchemaViewer: ({
1222
- initialShardKey,
1223
- initialTable,
1224
- schemaEditable
1225
- }: SchemaViewerProps) => ReactElement;
1255
+ * Schema overview that shows both storage tiers so the distinction is never a
1256
+ * mystery. The shard section lists every user table in the selected Durable
1257
+ * Object with row counts, and probes a table's columns on expand via a one-row
1258
+ * `__lunora_admin__:readTablePage` (`PRAGMA table_info`). The global section
1259
+ * lists every `.global()` table — including the auth tables (`user`, `session`,
1260
+ * …) — via the client's `listGlobalTables()`, reading columns from a one-row
1261
+ * `readGlobalTablePage` on expand.
1262
+ *
1263
+ * Two presentations: a **Table list** (searchable, expandable cards per tier)
1264
+ * and a **Graph** — a single React Flow relationship diagram showing both tiers
1265
+ * on one canvas, with cross-tier FK edges and its own in-canvas find-table box,
1266
+ * tier filter, and legend.
1267
+ *
1268
+ * Read-only and gated by the server's `LUNORA_ADMIN_TOKEN`, like the rest of the
1269
+ * studio's admin surface. Global discovery is best-effort: if D1 isn't
1270
+ * configured the global section simply reports it, and the shard section still
1271
+ * works.
1272
+ */
1273
+ declare const SchemaViewer: ({ initialShardKey, initialTable, schemaEditable }: SchemaViewerProps) => ReactElement;
1226
1274
  interface SettingsPanelProps {
1227
1275
  /** Shard key the settings read targets on first load. Defaults to the root shard. */
1228
1276
  readonly initialShardKey?: string;
1229
1277
  }
1230
1278
  /**
1231
- * Read-only **Settings** view of the deployment's config: the Worker vars,
1232
- * secrets, and bindings exposed via `env`, plus best-effort deploy metadata.
1233
- * Reads the `__lunora_admin__:getSettings` RPC over the {@link useLunora} client
1234
- * (gated by the server's `LUNORA_ADMIN_TOKEN`).
1235
- *
1236
- * Strictly view-only: secret values are masked server-side and never returned
1237
- * raw, and there is no editing here. The infrastructure plane lives in
1238
- * Cloudflare/wrangler — a deep-link to the Cloudflare dashboard is provided so
1239
- * you can edit there. Deployment config is static at runtime (it only changes on
1240
- * redeploy), so this loads once on mount — there is no live channel or poll.
1241
- */
1242
- declare const SettingsPanel: ({
1243
- initialShardKey
1244
- }: SettingsPanelProps) => ReactElement;
1279
+ * Read-only **Settings** view of the deployment's config: the Worker vars,
1280
+ * secrets, and bindings exposed via `env`, plus best-effort deploy metadata.
1281
+ * Reads the `__lunora_admin__:getSettings` RPC via {@link useAdminQuery} (gated
1282
+ * by the server's `LUNORA_ADMIN_TOKEN`).
1283
+ *
1284
+ * Strictly view-only: secret values are masked server-side and never returned
1285
+ * raw, and there is no editing here. The infrastructure plane lives in
1286
+ * Cloudflare/wrangler — a deep-link to the Cloudflare dashboard is provided so
1287
+ * you can edit there. Deployment config is static at runtime (it only changes on
1288
+ * redeploy), so this loads once on mount — there is no live channel or poll.
1289
+ */
1290
+ declare const SettingsPanel: ({ initialShardKey }: SettingsPanelProps) => ReactElement;
1245
1291
  interface SqlEditorPanelProps {
1246
1292
  /** Shard key the query runs against on first load. Defaults to the root shard. */
1247
1293
  readonly initialShardKey?: string;
1248
1294
  }
1249
1295
  /**
1250
- * A full-height, Supabase-style SQL editor: a left query sidebar (search + new,
1251
- * a browser-persisted PRIVATE list, and REFERENCE templates), a line-numbered
1252
- * editor pane, and a Results / Explain pane with a Run control + shard selector.
1253
- * Read-only — the `__lunora_admin__:runSql` RPC rejects everything but
1254
- * SELECT / WITH / EXPLAIN, so raw writes can't desync the doc-store's shadow
1255
- * tables (use the Data grid's inline edit for mutations).
1256
- */
1257
- declare const SqlEditorPanel: ({
1258
- initialShardKey
1259
- }: SqlEditorPanelProps) => ReactElement;
1296
+ * A full-height, Supabase-style SQL editor: a left query sidebar (search + new,
1297
+ * a browser-persisted PRIVATE list, and REFERENCE templates), a line-numbered
1298
+ * editor pane, and a Results / Explain pane with a Run control + shard selector.
1299
+ * Read-only — the `__lunora_admin__:runSql` RPC rejects everything but
1300
+ * SELECT / WITH / EXPLAIN, so raw writes can't desync the doc-store's shadow
1301
+ * tables (use the Data grid's inline edit for mutations).
1302
+ */
1303
+ declare const SqlEditorPanel: ({ initialShardKey }: SqlEditorPanelProps) => ReactElement;
1260
1304
  interface FileBrowserProps {
1261
1305
  /** Object-key prefix the browser filters by on first load. */
1262
1306
  readonly initialPrefix?: string;
@@ -1264,120 +1308,122 @@ interface FileBrowserProps {
1264
1308
  readonly pageSize?: number;
1265
1309
  }
1266
1310
  /**
1267
- * Browse — and mutate — objects in the storage (R2) bucket. Lists keys under an
1268
- * optional prefix via the client's `listStorageObjects`, which hits the worker's
1269
- * admin-gated `GET /_lunora/admin/storage` endpoint — so the worker must be built
1270
- * with a `storageList` function and `adminToken`. Paginates forward by cursor.
1271
- *
1272
- * Each row offers a "Copy URL" (signed/public URL via `signedStorageUrl`) and a
1273
- * confirm-gated "Delete" (`deleteStorageObject`); the toolbar offers an upload
1274
- * (`uploadStorageObject`) into the current prefix. Those write paths require the
1275
- * worker to be built with `storageSignedUrl` / `storageDelete` / `storageUpload`
1276
- * respectively — when absent, the worker responds with a clear `*_NOT_CONFIGURED`
1277
- * error that surfaces inline rather than crashing the panel.
1278
- *
1279
- * All state + behavior lives in {@link useFileBrowser}; this shell only wires the
1280
- * view-model into the toolbar, breadcrumbs, selection bar, list/gallery and the
1281
- * load-more / error / empty affordances.
1282
- */
1283
- declare const FileBrowser: ({
1284
- initialPrefix,
1285
- pageSize
1286
- }: FileBrowserProps) => ReactElement;
1311
+ * Browse — and mutate — objects in the storage (R2) bucket. Lists keys under an
1312
+ * optional prefix via the client's `listStorageObjects`, which hits the worker's
1313
+ * admin-gated `GET /_lunora/admin/storage` endpoint — so the worker must be built
1314
+ * with a `storageList` function and `adminToken`. Paginates forward by cursor.
1315
+ *
1316
+ * Each row offers a "Copy URL" (signed/public URL via `signedStorageUrl`) and a
1317
+ * confirm-gated "Delete" (`deleteStorageObject`); the toolbar offers an upload
1318
+ * (`uploadStorageObject`) into the current prefix. Those write paths require the
1319
+ * worker to be built with `storageSignedUrl` / `storageDelete` / `storageUpload`
1320
+ * respectively — when absent, the worker responds with a clear `*_NOT_CONFIGURED`
1321
+ * error that surfaces inline rather than crashing the panel.
1322
+ *
1323
+ * All state + behavior lives in {@link useFileBrowser}; this shell only wires the
1324
+ * view-model into the toolbar, breadcrumbs, selection bar, list/gallery and the
1325
+ * load-more / error / empty affordances.
1326
+ */
1327
+ declare const FileBrowser: ({ initialPrefix, pageSize }: FileBrowserProps) => ReactElement;
1287
1328
  /** Default polling cadence for auto-refresh, in milliseconds. */
1288
1329
  declare const DEFAULT_AUTO_REFRESH_MS = 5e3;
1289
1330
  /**
1290
- * Call `onTick` on a fixed interval while `enabled`, for panels whose backend
1291
- * has no live subscription channel (the scheduler, R2, D1, the SessionDO — all
1292
- * HTTP-only). Polling is the honest "live" here: a timer-driven scheduler has no
1293
- * client-observable write event to push on, so the UI watches jobs count down
1294
- * and disappear by re-asking.
1295
- *
1296
- * Ticks are skipped while the tab is hidden (`document.hidden`) so a backgrounded
1297
- * studio doesn't keep hammering the worker. `onTick` is held in a ref so a
1298
- * fresh closure each render doesn't reset the interval; only `enabled`/`intervalMs`
1299
- * do. The interval is cleared on disable and unmount.
1300
- */
1331
+ * Call `onTick` on a fixed interval while `enabled`, for panels whose backend
1332
+ * has no live subscription channel (the scheduler, R2, D1, the SessionDO — all
1333
+ * HTTP-only). Polling is the honest "live" here: a timer-driven scheduler has no
1334
+ * client-observable write event to push on, so the UI watches jobs count down
1335
+ * and disappear by re-asking.
1336
+ *
1337
+ * Ticks are skipped while the tab is hidden (`document.hidden`) so a backgrounded
1338
+ * studio doesn't keep hammering the worker. `onTick` is held in a ref so a
1339
+ * fresh closure each render doesn't reset the interval; only `enabled`/`intervalMs`
1340
+ * do. The interval is cleared on disable and unmount.
1341
+ */
1301
1342
  declare const useAutoRefresh: (onTick: () => void, enabled: boolean, intervalMs?: number) => void;
1302
1343
  /**
1303
- * Debounced mirror of `value`: returns the latest value only after it has been
1304
- * stable for `delayMs`. Used so a per-keystroke search box drives at most one
1305
- * server round-trip per pause, instead of one request per character.
1306
- */
1307
- declare const useDebounced: <T>(value: T, delayMs?: number) => T;
1308
- /**
1309
- * The registry of every English source string a call site may pass to `t(...)`.
1310
- *
1311
- * English is the source locale, so each id doubles as the rendered text: Lingui
1312
- * compiles an id verbatim when a catalog has no entry for it. This list is the
1313
- * single source of known strings {@link MessageId} is derived from it and
1314
- * `TFunction` is typed against that union, so `t("Dat")` (or any string absent
1315
- * here) is a compile error rather than a silently-rendered typo.
1316
- *
1317
- * Add a string here the moment a new call site needs it. To translate, create a
1318
- * sibling catalog (for example `de.ts`) mapping each id to its translation and
1319
- * register it via `createStudioI18n(locale, { en: enMessages, de: deMessages })`.
1320
- */
1321
- declare const MESSAGE_IDS: readonly ["Lunora AI rules aren't installed.", "lets your coding agent use Lunora correctly.", "Dismiss", ", changed", "(no subject)", "(root)", "{count} active", "{count} calls", "{count} failed", "{total} total", "No subscriptions yet", "Payments", "Plan", "Provider", "Recent webhook events", "Renews", "State", "Subscriptions", "Synced customers, subscriptions, and webhook events.", "{count} messages", "{count} pending changes", "{count} running", "{name} ({rowCount})", "{rangeStart}-{rangeEnd} of {total}", "{rate} ({count} entries)", "{reachable} reachable", "{reachable} reachable, {failed} unreachable", "{status} — processed", "{title} failed", "Actions", "Actions have no React hook — call them through the client.", "Add a widget to chart a saved SQL query on this browser.", "Add index on {table}", "Add row", "Add widget", "admin token", "Aggregating…", "all", "All shards", "API", "API reference unavailable", "API resources", "API usage snippets", "API view", "Arguments", "Auth", "Auth failures", "Auth failures over time", "Cache hit rate", "Call this {kind} from your app.", "Cancel", "Cancel job?", "Cc", "changed", "Chart widgets backed by saved read-only SQL queries.", "Lunora surfaces slow functions, error spikes, and cache problems here.", "Clear", "Clear inbox", "Columns unavailable", "CLI", "Client", "collecting samples…", "Combined cache hit rate", "Commit", "Committing…", "Breadcrumb", "Confirm", "Connect", "Connect to Lunora Studio", "Connected", "Connecting…", "Enter your admin token to access the studio.", "From your worker's LUNORA_ADMIN_TOKEN — your project's .dev.vars in dev, or a deployment secret in production.", "Local", "Not connected", "content-type", "Copy", "Copy link", "Copy-paste snippets for calling your functions and tables.", "created", "Cron triggers", "Dashboards", "Data", "Data migrations you run against this shard will be tracked here.", "Data model", "Database", "Database size", "db size", "Delete", "Delete saved query {name}", "Delete?", "direction", "Direction", "Discard", "down", "Dry run", "Dry run: ", "Edit", "Edit widget", "email", "Email preview", "Email your app sends in dev is captured here — nothing is delivered.", "Email your app sent, captured in dev.", "Enter a migration id", "error", "Error rate", "errors", "Errors", "Errors over time", "expires", "Export", "PNG", "SVG", "Export / Import", "Exported {count} rows.", "Facets", "file:function", "Files", "Filter messages", "Filter tables", "Find table…", "Foreign key", "From", "function", "Function", "Function path", "Functions", "Functions by error rate", "Graph", "Headers", "Health", "Indexes", "Hide", "HTML", "id", "Idle", "Import", "Import (writes rows)?", "Inserted {inserted}, {conflicts} conflicts, {errors} errors.", "Interactive OpenAPI reference and copy-paste snippets for your functions.", "Invalid JSON args: {message}", "Invalid JSON: {message}", "Invalid NDJSON: {message}", "ip", "Jobs queued with runAfter / runAt will appear here.", "JSON", "key", "Key prefix", "key prefix (optional)", "Level filter", "line {line} ({table}): {message}", "List", "Live", "Live — changes stream in automatically", "Live unavailable", "Live unavailable: {liveError}", "Live: on", "Load", "Load more", "Load tables", "Logic", "Logs", "Mail", "Mask sensitive columns", "Metrics", "migration id", "Migration id", "Migrations", "Missing index", "name", "Next", "no", "No active sessions.", "no cache configured", "No captured email.", "No cron triggers.", "No function activity yet.", "No functions or tables to document yet.", "No global tables.", "No headers.", "No HTML body.", "No logs.", "No migrations have run on this shard.", "No objects.", "No recent errors.", "No scheduled jobs.", "No tables to graph.", "No tables match your filter.", "No text body.", "No users.", "No widgets yet", "Objects you upload to your R2 buckets will appear here.", "Observability", "of {pages}", "off", "Offline", "ok", "OK", "on", "Open {target} {id}", "Open in new tab", "Outcome filter", "Page", "Plain text", "Prefill", "Previous", "Primary key", "processed", "React", "Read and write this table through the typed data model.", "Recent errors", "Recent logs", "Recently visited shards — click to switch", "Refresh", "Reload tables", "Remove widget", "RLS Policies", "Policies", "No policies defined", "No `definePolicy` is wired through `.use(rls(...))` in this deployment. Add one to guard a table's rows.", "Read", "Insert", "Update", "Guarded by", "Guarded", "Roles", "No roles defined", "No `defineRole` is registered via `rls(policies, { roles })`. Roles back `ctx.auth.can(...)` permission checks.", "Permissions", "Run as identity (userId)", "Leave empty to run as admin", "Dev only: runs the function as this user so you can test auth and RLS. Forged over the admin gate.", "as {userId}", "No policy", "Covered by {procedure}", "Uncovered — reachable without a policy", "Masked columns", "No tables in this deployment's schema.", "Add a `definePolicy` and wire it through `.use(rls(...))` to populate this matrix.", "Pick a function and an identity, then run it to see the access outcome.", "Probe", "Probe this", "Run as (userId)", "Identity (userId) to run as", "Run probe", "Allowed", "Denied", "Probing…", "Set `runAsIdentity` to forge an identity and probe access.", "Dev only: runs the selected function as this user over the admin gate so you can test auth and RLS.", "Inspect access policies per table, and probe a function as any identity.", "Scaffold access rules", "Writes a new deny-by-default policy file under lunora/, or wires one into a procedure, then reruns codegen. Local dev only.", "New policy file", "Wire into a procedure", "Policy name", "Create policy file", "Procedure file path", "Exported procedure", "Policy set identifier", "Wire RLS", "Creating…", "Wiring…", "Scaffolded {label} and reran codegen. Fill in the `when` predicates before relying on it.", "This change must be made by hand — the scaffolder only adds new, deny-by-default rules.", "requests", "Requests", "Requests / interval", "Requests over time", "Requests per interval over time", "Row actions", "Row document JSON", "Rows per page", "Run", "Run migration", "Run migration?", "Running…", "Query name", "Save", "Save query", "Save widget", "Saved", "schedule", "target", "workflow", "Run now", "Run now?", "Running…", "ran", "attempts", "backlog", "Dead letter", "Drop", "Drop job?", "in flight", "Jobs that exhaust their retry budget are parked here instead of being dropped.", "last tried", "max concurrency", "No dead-letter jobs.", "No workpools.", "pool", "Pools", "pools", "Pools created with createWorkpool appear here once they have activity.", "queued", "Retry", "Schedule view", "Scheduled", "scheduled for", "Scheduled jobs", "Scheduler backlog", "Schema", "Schema graph", "Schema view", "search message", "Search messages", "Search rows", "search table…", "Search…", "Select a function or table to see how to call it from your app.", "Select all rows", "Select row", "Send test", "Sent", "Service level", "Sessions", "Sessions for {userId}", "shard", "Shard", "Shard key", "shard key (optional)", "Shard key (optional)", "Shards", "Shards seen", "Signature", "size", "Snippet flavour", "State-changing admin operations are recorded here.", "status", "Storage", "Storage tier", "Storage tiers", "Studio", "Studio areas", "Studio failed", "Switch to dark theme", "Switch to light theme", "Table", "Table list", "Table touched", "Tables", "To", "Token rides the WebSocket URL — it can surface in browser DevTools and server logs. Use a dev-only token.", "Total database size", "Total errors", "Total requests", "Triggers declared with the cronJobs() builder appear here.", "Try again", "unreachable", "up", "updated", "Uptime", "user agent", "User id", "userId", "Users", "Users who sign up to your app will appear here.", "verified", "Widget title", "yes", "A live stream of recent function logs.", "Browse and edit rows across your shard and global tables.", "Browse auth users and their active sessions.", "Browse objects in your R2 storage buckets.", "Export a shard to NDJSON, or import rows from it.", "At-a-glance connection, error, and shard signals.", "Inspect and cancel scheduled jobs.", "Inspect each table and its columns.", "Inspect row-level-security policies and roles, per table.", "Per-shard health and aggregate metrics.", "Review migration status and run them.", "Run registered queries, mutations, and actions.", "Global tables (D1)", "Shard tables", "{shard} tables", "Tables marked .global() (D1-backed, region-replicated) will appear here.", "Select a table to browse its rows.", "Shared across every tenant, stored once in D1. Includes auth tables.", "Partitioned per shard key into separate Durable Objects — scoped to the shard above.", "avg", "calls", "conflicts", "kind", "last error", "last run", "max", "Most called", "No functions have run on this shard yet.", "Recent", "Slowest", "Insights", "Surface slow functions, error spikes, and cache problems.", "No issues detected.", "Low cache hit rate", "High cache eviction rate", "Slow function", "High error rate", "High write contention", "{rate} hit rate over recent traffic.", "{count} entries evicted recently.", "Slowest call took {duration}.", "Slowest call took {duration} — it full-scanned {tables} with no index.", "{rate} of calls failed.", "{rate} of calls hit a write conflict — consider sharding to cut contention.", "Home", "Reports", "SQL / Functions", "Table editor", "Connection, health, and advisor summary for your deployment.", "Collapse sidebar", "Expand sidebar", "SQL editor", "Run read-only SQL against a shard.", "Run", "SQL query", "{count} rows", "Showing the first {max} of {count} rows.", "Showing the {n} most common values.", "No rows returned.", "Private", "Reference", "Search queries…", "New query", "Untitled query", "Delete query", "No saved queries yet — they save to this browser as you type.", "Results", "Explain", "Chart", "History", "Format", "Clear history", "No numeric column to chart.", "Click Run to execute your query.", "Untitled", "New tab", "Close tab", "Tab title", "Double-click to rename", "Discard?", "Discard changes", "Keep editing", "Close other tabs", "Close tabs to the right", "Close all tabs", "Discard unsaved tabs?", "column", "keyword", "Columns", "Show all", "Hide all", "Transpose", "Swap rows and columns", "Field", "Row {n}", "Loading…", "No matching row.", "CSV", "{count} selected", "Delete {count}", "Delete {count} rows?", "Copy", "Copied", "Cell value", "Close", "Form", "Invalid JSON", "Command palette", "No results.", "Quick links", "Security findings", "Performance issues", "View", "All clear", "No data yet", "Get connected", "No issues found", "No security or performance issues detected.", "Client SDK", "React", "CLI", "Advisors", "Security", "Performance", "Warnings", "Info", "Issue type", "Entity/item", "Description", "{count} errors", "{count} warnings", "{count} suggestions", "No errors detected", "No warnings detected", "No suggestions", "Nothing to report for this deployment.", "Security and performance findings for your deployment.", "Review admin gates, credentials, and log redaction.", "Lunora checks admin-token strength, the live-subscription gate, and request-log redaction here.", "No security issues detected.", "Weak admin token", "Weak auth secret", "Session cookies are not Secure", "Wildcard CORS with credentials", "CSRF/origin guard is off", "Security headers are off", "Live admin subscriptions are ungated", "Request log keeps un-redacted args", "Unknown security finding", "Update your worker to a version of Lunora that describes this finding.", "Your admin token is {length} characters — use at least {min} for a brute-force-resistant secret.", "Your auth secret is {length} characters — use at least {min} (e.g. `openssl rand -hex 32`) to sign sessions safely.", "BETTER_AUTH_URL is a plaintext http:// origin, so session cookies cannot be Secure and ride in cleartext. Serve auth over https:// in production.", "LUNORA_ALLOWED_ORIGINS includes a wildcard while credentials are allowed — browsers reject this and it defeats the allowlist. Name explicit origins instead of *.", "LUNORA_SECURITY_CSRF is off, so cross-origin state-changing cookie requests are not blocked. Re-enable it in production to keep mutations un-forgeable.", "LUNORA_SECURITY_HEADERS is off, so HSTS, CSP, nosniff, and frame-options are not applied. Re-enable the baseline headers in production.", "Apply index", "Apply index on {table}", "Apply?", "CREATE INDEX SQL copied to clipboard.", "LUNORA_WS_BEARER is unset, so the WebSocket upgrade gate is open: live admin subscriptions need no credential. Set it to gate them like the HTTP admin RPCs.", "This worker reports a development environment, so the request log stores raw args and identity. Confirm it isn't a mislabeled production deploy.", "Audit", "A durable log of admin state-changing operations.", "Filter audit log", "filter op, table, id", "No audit entries.", "time", "op", "table", "detail", "Settings", "Deployment", "Read-only deployment config — vars, secrets, and bindings.", "Environment & bindings", "No environment variables or bindings.", "Open in Cloudflare", "Remove filter", "View-only — values are masked. Edit vars, secrets, and bindings in wrangler or the Cloudflare dashboard.", "URL", "Environment", "Version", "value", "Cascade impact", "Delete preview — rows that would cascade or be blocked", "No related rows found.", "Restrict relations will block this delete.", "Generate rows", "Generate dummy rows", "Seed {table} with Faker-generated rows. Existing rows are not affected.", "Row count", "(max {max})", "Columns to seed", "FK: no rows in {ref} — will skip", "→ {ref}", "No rows generated — all columns were skipped.", "Inserted {count} rows. Skipped FK columns: {cols}", "Inserted {count} rows successfully.", "Generate & insert", "Inserting…", "Time Travel", "Restore a shard to a point in the last 30 days.", "root", "In-place recovery to any moment in the last 30 days. For older or portable recovery, use the snapshot backup tier.", "Current bookmark", "Restore", "Time (ISO or epoch-ms, last 30 days)", "Preview", "Bookmark for that time", "Or an explicit bookmark (wins over time)", "bookmark string", "Restart the shard now so recovery applies immediately", "Confirm restore", "restarted now", "on next restart", "Restore armed", "Restored to", "Undo bookmark", "Confirm undo", "Undo restore", "role", "Role", "Role (optional)", "Active", "Banned", "unverified", "Manage", "New user", "Create", "Create user", "Creating…", "Password (optional)", "Search users", "Search by email or name…", "Filter by role", "Set role", "Ban user", "Ban reason (optional)", "Days", "Unban", "New password", "Set password", "Impersonate", "Impersonation token", "Revoke", "Revoke all sessions", "Delete user", "Confirm delete", "User details", "Fields", "Linked accounts", "No linked accounts.", "provider", "Unlink", "Security", "Disable two-factor", "No passkeys.", "Operations", "Organizations", "slug", "Members", "Invitations", "Remove", "No organizations.", "Select an organization to view its members and invitations.", "Organizations are not enabled.", "Enable the organization() plugin in your auth config to manage organizations here.", "Browse and manage organizations, members, and invitations.", "Reload", "Manage auth users — roles, bans, sessions, and identity.", "Auth config", "Configuration", "Enabled plugins and session config (read-only).", "Enabled capabilities", "Loading auth configuration…", "Accounts", "Admin", "Passkeys", "Two-factor", "Enabled", "Disabled", "OAuth providers, email templates, and rate limits are configured at deploy time in the better-auth setup and aren't editable here. See the Mail tab for email output.", "Sessions", "Browse and revoke active sessions across all users.", "user", "impersonated by", "Log drains", "Forward logs to Logpush, Tail Workers, or a webhook collector.", "Cloudflare destinations", "Lunora does not ship logs itself — forwarding is handled by Cloudflare. Configure a destination below, then test your collector.", "Logpush", "Stream every request log to R2, a SIEM, or a third-party log service.", "Tail Workers", "Send logs programmatically to a Worker for custom capture and forwarding.", "Workers Logs", "Retain and query recent request logs directly in Cloudflare's dashboard.", "Webhook test", "POST a sample Lunora request-log envelope to your collector to confirm it is reachable.", "https://example.com/logs", "Send test event", "Delivered — status {status} in {latency}ms", "Failed: {message}", "fetch is unavailable in this environment.", "Realtime", "Active WebSocket subscriptions on this shard.", "{count} connections", "{count} subscriptions", "No active subscriptions.", "Connection", "admin", "Folder path", "Grid", "Sort", "Name", "Type", "Modified", "Toggle sort direction", "Thumbnail size", "Link expiry", "15m", "1h", "24h", "7d", "Upload", "Uploading…", "Copy URL", "Download", "Delete object?", "Uploaded {key}", "Deleted {key}", "Summary", "Time range", "All time", "Last 5m", "Last 15m", "Last hour", "filter path", "By level", "By function", "Count", "{count} entries", "Snippets", "Couldn't load the OpenAPI spec: {message}", "No OpenAPI spec configured", "Run `lunora codegen` and wire `_generated/openapi.json` to the worker to render the API reference here.", "API operations", "Filter operations", "No operations match your filter.", "Try it", "Request arguments", "Response body", "Response", "application/json", "Arguments (JSON)", "Send", "Sending…", "Send a request to see the response.", "No example for this response.", "Error", "{ms} ms", "Range", "Value in", "relation", "API spec format", "OpenAPI", "OpenRPC", "Params", "Result", "Field", "Required", "JSON-RPC request", "Couldn't load the OpenRPC spec: {message}", "No OpenRPC spec configured", "Run `lunora codegen --api-spec openrpc` and wire `_generated/openrpc.json` to the worker to render the OpenRPC reference here.", "used by", "Orphan", "1 record", "{count} records", "References shard", "Which shard's records are checked for references to these files. Empty = root shard.", "Orphaned objects", "Find records whose file reference points at an object the bucket no longer has.", "Check for orphans", "Checking…", "No dangling references.", "Every record's file reference points at an object that exists in the bucket.", "Missing object", "→", "Showing the first {count} dangling references — the scan was truncated.", "Per-function call counts, error rates, and latency land here after your first request.", "Function and request logs for this shard show up here as your app handles traffic.", "No tables in this shard.", "Browse Vectorize indexes and run similarity searches.", "dimensions", "field", "Indexes declared with .vectorize() or defineVectorIndex() appear here.", "metadata", "metric", "No matches.", "No vector indexes.", "score", "Search", "Search by similarity…", "Searching…", "vectors", "Vectors", "vs. prev.", "Top functions", "No functions called yet.", "Calls", "Avg", "Err", "Avg latency", "cache hit", "Live connections", "sockets", "active subscriptions", "Recent activity", "No recent activity.", "last interval", "{rate} error rate", "cache entries", "Critical", "Degraded", "All systems healthy", "One or more service levels are breached.", "Some service levels need attention.", "All service levels are within target.", "Analytics", "Analytics is not configured.", "Hot shards", "Latency p50 / p95 per function", "No data points yet.", "Request volume per function", "Set CLOUDFLARE_ACCOUNT_ID and CLOUDFLARE_API_TOKEN (Analytics Read) in your .dev.vars to enable usage panels.", "Usage and latency from Analytics Engine — request volume, p50/p95, and hot shards.", "(whole bucket)", "Access Rules", "Bucket", "Inspect storage access rules — per bucket, operation, and key prefix.", "No defineStorageRule is wired through .use(storageRules(...)) in this deployment. Add one to gate object access by key prefix.", "No storage rules defined", "Operation", "Storage rules are declared in code with defineStorageRule and gate ctx.storage access per bucket. This view is read-only.", "Write", "Queues", "Queue", "Mode", "Dead-letter", "No queues defined", "Inspect declared Cloudflare Queues — their producer bindings, consumer mode, and dead-letter queue.", "No defineQueue is declared in lunora/queues.ts in this deployment. Add one to offload async work to a Cloudflare Queue.", "Queues are declared in code with defineQueue. Enqueue from a mutation or action with ctx.queues.<name>.send(...); push consumers process batches in the worker.", "Workflows", "Inspect declared Cloudflare Workflows and their bindings.", "Binding", "Class", "No workflows defined", "No defineWorkflow is declared in lunora/workflows.ts in this deployment. Add one to run a durable, multi-step workflow.", "Workflows are declared in code with defineWorkflow and run as durable Cloudflare Workflows. This view is read-only.", "Workflows are declared in code with defineWorkflow and run as durable Cloudflare Workflows. Start an instance and observe its status below.", "Start instance", "Starting…", "Workflow", "Instance id", "Instance id (optional)", "Params (JSON)", "Params (JSON, optional)", "Params must be valid JSON", "Instances", "Status", "Output", "Refresh", "Refreshing…", "Instance history", "Filter by status", "All statuses", "Workflow inspection not configured", "Set CLOUDFLARE_ACCOUNT_ID and CLOUDFLARE_API_TOKEN in your .dev.vars to enable workflow instance history.", "No instances", "No instances match this filter for the selected workflow.", "Created", "Ended", "Steps", "Step", "Attempts", "Started", "This instance has no recorded steps yet.", "pause", "resume", "terminate", ">100ms avg execution", "50–100ms avg execution", "<50ms avg execution", "{count} tracked statements", "Avg time", "avg", "avg time", "avgTime", "Critical queries", "Exec count", "exec count", "execCount", "Execution count", "Fast queries", "Full statement", "Moderate queries", "No query insights yet", "Overview", "P90 latency", "P95 latency", "Query insights", "Query insights appear once statements are executed against this shard.", "Query leaderboard", "Rows read", "Rows written", "rowsRead", "Slow queries sorted by {sortField}", "Sort by", "Sort queries by", "Statements", "total", "Total time", "total time", "totalTime", "Edit schema", "Add table", "Add column", "Add index", "Rename / drop / change type…", "Table name", "Column name", "Column type", "Index name", "Index fields (comma-separated)", "Optional", "Unique", "Cancel", "Apply", "Applying…", "This edit changes stored data and must go through a migration. Review the migration before applying.", "Open Migrations", "Schema updated.", "Codegen reported diagnostics:", "Editing the schema is only available in local dev.", "Adds a table, column, or index to lunora/schema.ts and reruns codegen.", "Theme", "Dark theme", "Light theme", "System theme", "Integrity"];
1344
+ * Debounced mirror of `value`: returns the latest value only after it has been
1345
+ * stable for `delayMs`. Used so a per-keystroke search box drives at most one
1346
+ * server round-trip per pause, instead of one request per character.
1347
+ *
1348
+ * `resetKey` is an optional escape hatch from the trailing delay: when it
1349
+ * changes relative to the PREVIOUS call, the mirror snaps to `value`
1350
+ * immediately no `delayMs` window at all. It exists for callers that key a
1351
+ * debounced input (a search box, a shard key) to a coarser identity (e.g. the
1352
+ * open table): on that identity's change the caller usually re-seeds `value`
1353
+ * itself in the same render, and without `resetKey` the debounced mirror would
1354
+ * still trail the OLD value behind its own timer for up to `delayMs`, ignoring
1355
+ * the reseed. The snap happens render-time (the "adjusting state when a prop
1356
+ * changes" pattern): calling the setters below makes React discard this render
1357
+ * and retry synchronously with the caught-up state, so the returned value is
1358
+ * already correct on the render that reads it no extra commit, no trailing
1359
+ * window. Omit `resetKey` (the default) to keep the original always-debounced
1360
+ * behavior; every other caller in the codebase does this.
1361
+ */
1362
+ declare const useDebounced: <T>(value: T, delayMs?: number, resetKey?: unknown) => T;
1363
+ /**
1364
+ * The registry of every English source string a call site may pass to `t(...)`.
1365
+ *
1366
+ * English is the source locale, so each id doubles as the rendered text: Lingui
1367
+ * compiles an id verbatim when a catalog has no entry for it. This list is the
1368
+ * single source of known strings — {@link MessageId} is derived from it and
1369
+ * `TFunction` is typed against that union, so `t("Dat")` (or any string absent
1370
+ * here) is a compile error rather than a silently-rendered typo.
1371
+ *
1372
+ * Add a string here the moment a new call site needs it. To translate, create a
1373
+ * sibling catalog (for example `de.ts`) mapping each id to its translation and
1374
+ * register it via `createStudioI18n(locale, { en: enMessages, de: deMessages })`.
1375
+ */
1376
+ declare const MESSAGE_IDS: readonly ["Agents", "Agent", "Threads", "Timeline", "Messages", "Tokens", "Updated", "Content", "Tool", "Usage", "Approval", "Score your app's advisor findings: a grade, the coverage split, and every procedure ranked worst-first.", "Health score", "Rules fired", "Procedure", "Score", "Kind", "clean", "warned", "failing", "exempt", "sensitive", "no reason given", "Schema & config", "Inspect agent threads, message timelines, tool calls, and token usage.", "Agents run as durable workflows. Each run persists a thread of assistant and tool messages; select a thread to inspect its timeline, tool calls, approvals, and token usage.", "No @lunora/agent tables found in this deployment. Add lunora/agents.ts with defineAgent(...) and merge the agent schema extension to run durable AI agents.", "No agents configured", "No agent has run yet. Start a run with ctx.agents.<name>.run(...) and its thread appears here.", "No agent threads yet", "This thread has no messages yet.", "Bindings", "KV Namespaces", "R2 Buckets", "Vectorize Indexes", "{count} bindings", "1 binding", "Lunora AI rules aren't installed.", "lets your coding agent use Lunora correctly.", "Dismiss", ", changed", "(no subject)", "(root)", "{count} active", "{count} calls", "{count} failed", "{total} total", "No subscriptions yet", "No payments configured", "No @lunora/payment tables found in this deployment. Declare the store tables (subscriptions, events, …) in lunora/schema.ts and wire `payment` on createShardDO() to sync customers and subscriptions.", "Payments", "Plan", "Provider", "Recent webhook events", "Renews", "State", "Subscriptions", "Synced customers, subscriptions, and webhook events.", "{count} messages", "{count} pending changes", "{count} running", "{name} ({rowCount})", "{rangeStart}-{rangeEnd} of {total}", "{rate} ({count} entries)", "{reachable} reachable", "{reachable} reachable, {failed} unreachable", "{status} — processed", "{title} failed", "Actions", "Actions have no React hook — call them through the client.", "Add a widget to chart a saved SQL query on this browser.", "Add index on {table}", "Add row", "Add widget", "admin token", "Aggregating…", "all", "All shards", "API", "API reference unavailable", "API resources", "API usage snippets", "API view", "Arguments", "Auth", "Auth failures", "Auth failures over time", "Cache hit rate", "Call this {kind} from your app.", "Cancel", "Cancel job?", "Cc", "changed", "Chart widgets backed by saved read-only SQL queries.", "Lunora surfaces slow functions, error spikes, and cache problems here.", "Clear", "Clear inbox", "Columns unavailable", "CLI", "Client", "collecting samples…", "Combined cache hit rate", "Commit", "Committing…", "Breadcrumb", "Confirm", "Connect", "Connect to Lunora Studio", "Connected", "Connecting…", "Enter your admin token to access the studio.", "From your worker's LUNORA_ADMIN_TOKEN — your project's .dev.vars in dev, or a deployment secret in production.", "Local", "Not connected", "content-type", "Copy", "Copy link", "Copy-paste snippets for calling your functions and tables.", "created", "Cron triggers", "Dashboards", "Data", "Data migrations you run against this shard will be tracked here.", "Data model", "Database", "Database size", "db size", "Instruments", "Instruments unavailable: {error}", "Counter", "Gauge", "Histogram", "count", "range", "trend", "trace", "{name} trend", "Open the exemplar trace {trace}", "Delete", "Delete saved query {name}", "Delete?", "direction", "Direction", "Discard", "down", "Dry run", "Dry run: ", "Edit", "Edit widget", "email", "Email preview", "Email your app sends in dev is captured here — nothing is delivered.", "Email your app sent, captured in dev.", "Enter a migration id", "error", "Error rate", "errors", "Errors", "Errors over time", "expires", "Export", "PNG", "SVG", "Export / Import", "Exported {count} rows.", "Facets", "file:function", "Files", "Filter messages", "Filter tables", "Find table…", "Foreign key", "From", "function", "Function", "Function path", "Functions", "Functions by error rate", "Graph", "Headers", "Health", "Indexes", "Hide", "HTML", "id", "Idle", "Import", "Import (writes rows)?", "Inserted {inserted}, {conflicts} conflicts, {errors} errors.", "Interactive OpenAPI reference and copy-paste snippets for your functions.", "Invalid JSON args: {message}", "Invalid JSON: {message}", "Invalid NDJSON: {message}", "ip", "Jobs queued with runAfter / runAt will appear here.", "JSON", "key", "Key prefix", "key prefix (optional)", "Level filter", "line {line} ({table}): {message}", "List", "Live", "Live — changes stream in automatically", "Live unavailable", "Live unavailable: {liveError}", "Live: on", "Load", "Load more", "Load tables", "Logic", "Logs", "Mail", "Mask sensitive columns", "Metrics", "migration id", "Migration id", "Migrations", "Missing index", "name", "Next", "no", "No active sessions.", "no cache configured", "No captured email.", "No cron triggers.", "No function activity yet.", "No functions or tables to document yet.", "No global tables.", "No headers.", "No HTML body.", "No logs.", "Archive", "Log archive not configured", "Wire pipelineLogSink to a Cloudflare Pipeline → R2 Data Catalog table and set R2_SQL_ACCOUNT_ID, R2_SQL_TOKEN, R2_SQL_BUCKET to browse the durable log archive here.", "No archived logs.", "No archived logs match these filters. The durable archive fills as pipelineLogSink flushes records to R2.", "Function path prefix", "function path…", "user id…", "Minimum level", "min level", "Time", "Level", "Trace", "User", "No migrations have run on this shard.", "No objects.", "No recent errors.", "No scheduled jobs.", "No tables to graph.", "No tables match your filter.", "No text body.", "No users.", "No widgets yet", "Objects you upload to your R2 buckets will appear here.", "Observability", "of {pages}", "off", "Offline", "ok", "OK", "on", "Open {target} {id}", "Open in new tab", "Outcome filter", "Page", "Plain text", "Prefill", "Previous", "Primary key", "processed", "React", "Read and write this table through the typed data model.", "Recent errors", "Recent logs", "Recently visited shards — click to switch", "Refresh", "Reload tables", "Remove widget", "RLS Policies", "Policies", "No policies defined", "No `definePolicy` is wired through `.use(rls(...))` in this deployment. Add one to guard a table's rows.", "Read", "Insert", "Update", "Guarded by", "Guarded", "Roles", "No roles defined", "No `defineRole` is registered via `rls(policies, { roles })`. Roles back `ctx.auth.can(...)` permission checks.", "Permissions", "Run as identity (userId)", "Leave empty to run as admin", "Dev only: runs the function as this user so you can test auth and RLS. Forged over the admin gate.", "as {userId}", "No policy", "Covered by {procedure}", "Uncovered — reachable without a policy", "Masked columns", "No tables in this deployment's schema.", "Add a `definePolicy` and wire it through `.use(rls(...))` to populate this matrix.", "Pick a function and an identity, then run it to see the access outcome.", "Probe", "Probe this", "Run as (userId)", "Identity (userId) to run as", "Run probe", "Allowed", "Denied", "Probing…", "Set `runAsIdentity` to forge an identity and probe access.", "Dev only: runs the selected function as this user over the admin gate so you can test auth and RLS.", "Inspect access policies per table, and probe a function as any identity.", "Scaffold access rules", "Writes a new deny-by-default policy file under lunora/, or wires one into a procedure, then reruns codegen. Local dev only.", "New policy file", "Wire into a procedure", "Policy name", "Create policy file", "Procedure file path", "Exported procedure", "Policy set identifier", "Wire RLS", "Creating…", "Wiring…", "Scaffolded {label} and reran codegen. Fill in the `when` predicates before relying on it.", "This change must be made by hand — the scaffolder only adds new, deny-by-default rules.", "requests", "Requests", "Requests / interval", "Requests over time", "Requests per interval over time", "Row actions", "Row document JSON", "Rows per page", "Run", "Run migration", "Run migration?", "Running…", "Query name", "Save", "Save query", "Save widget", "Saved", "schedule", "target", "workflow", "Run now", "Run now?", "Running…", "ran", "attempts", "backlog", "Dead letter", "Drop", "Drop job?", "in flight", "Jobs that exhaust their retry budget are parked here instead of being dropped.", "last tried", "max concurrency", "No dead-letter jobs.", "No workpools.", "pool", "Pools", "pools", "Pools created with createWorkpool appear here once they have activity.", "queued", "Retry", "Schedule view", "Scheduled", "scheduled for", "Scheduled jobs", "Scheduler backlog", "Schema", "Schema graph", "Schema view", "search message", "Search messages", "Search rows", "search table…", "Search…", "Select a function or table to see how to call it from your app.", "Select all rows", "Select row", "Send test", "Sent", "Service level", "Sessions", "Sessions for {userId}", "shard", "Shard", "Shard key", "shard key (optional)", "Shard key (optional)", "Shards", "Shards seen", "Signature", "size", "Snippet flavour", "State-changing admin operations are recorded here.", "status", "Storage", "Storage tier", "Storage tiers", "Studio", "Studio areas", "Studio failed", "Switch to dark theme", "Switch to light theme", "Table", "Table list", "Table touched", "Tables", "To", "Token rides the WebSocket URL — it can surface in browser DevTools and server logs. Use a dev-only token.", "Total database size", "Total errors", "Total requests", "Triggers declared with the cronJobs() builder appear here.", "Try again", "unreachable", "up", "updated", "Uptime", "user agent", "User id", "userId", "Users", "Users who sign up to your app will appear here.", "verified", "Widget title", "yes", "A live stream of recent function logs.", "Browse and edit rows across your shard and global tables.", "Browse auth users and their active sessions.", "Browse objects in your R2 storage buckets.", "Export a shard to NDJSON, or import rows from it.", "At-a-glance connection, error, and shard signals.", "Inspect and cancel scheduled jobs.", "Inspect each table and its columns.", "Inspect row-level-security policies and roles, per table.", "Per-shard health and aggregate metrics.", "Review migration status and run them.", "Run registered queries, mutations, and actions.", "Global tables (D1)", "Shard tables", "{shard} tables", "Tables marked .global() (D1-backed, region-replicated) will appear here.", "Select a table to browse its rows.", "Shared across every tenant, stored once in D1. Includes auth tables.", "Partitioned per shard key into separate Durable Objects — scoped to the shard above.", "avg", "calls", "conflicts", "kind", "last error", "last run", "max", "Most called", "No functions have run on this shard yet.", "Recent", "Slowest", "Insights", "Surface slow functions, error spikes, and cache problems.", "No issues detected.", "Low cache hit rate", "High cache eviction rate", "Slow function", "High error rate", "High write contention", "{rate} hit rate over recent traffic.", "{count} entries evicted recently.", "Slowest call took {duration}.", "Slowest call took {duration} — it full-scanned {tables} with no index.", "{rate} of calls failed.", "{rate} of calls hit a write conflict — consider sharding to cut contention.", "Home", "Reports", "SQL / Functions", "Table editor", "Connection, health, and advisor summary for your deployment.", "Collapse sidebar", "Expand sidebar", "SQL editor", "Run read-only SQL against a shard.", "Run", "SQL query", "SQL problems", "Operation console", "Suggest chart", "Describe the query you want", "Draft SQL", "Thinking…", "Fix this", "Related", "p50", "p95", "showing a capped set", "Statements executed in the selected window appear here, with throughput and latency over time.", "No queries in this window.", "Throughput", "Mean latency (ms)", "Schema versions", "Data migrations", "{count} pushes", "live", "Show in console", "Every admin call this studio makes is recorded here.", "{count} rows", "Filter", "Each distinct schema shape this shard runs is recorded here, so you can see what changed and when.", "No schema versions recorded yet.", "First recorded version — every table is new.", "{count} change(s)", "change", "Diagram", "Changes", "added", "changed", "removed", "schema", "{count} columns", "changes", "tables", "{count} breaking", "breaking", "safe", "{count} rows", "Showing the first {max} of {count} rows.", "Showing the {n} most common values.", "No rows returned.", "Private", "Reference", "Search queries…", "New query", "Untitled query", "Delete query", "No saved queries yet — they save to this browser as you type.", "Results", "Explain", "Chart", "Split editor and results", "History", "Format", "Clear history", "No numeric column to chart.", "Click Run to execute your query.", "Untitled", "New tab", "Close tab", "Tab title", "Double-click to rename", "Discard?", "Discard changes", "Keep editing", "Close other tabs", "Close tabs to the right", "Close all tabs", "Discard unsaved tabs?", "column", "keyword", "Columns", "Show all", "Hide all", "Transpose", "Swap rows and columns", "Field", "Row {n}", "Loading…", "No matching row.", "CSV", "SQL", "{count} selected", "Delete {count}", "Delete {count} rows?", "Copy", "Copied", "Cell value", "Close", "Form", "Invalid JSON", "Command palette", "No results.", "Quick links", "Security findings", "Performance issues", "View", "All clear", "No data yet", "Get connected", "No issues found", "No security or performance issues detected.", "Client SDK", "React", "CLI", "Connect an AI agent", "Drive this deployment from an AI agent over the Model Context Protocol — it can list functions and tables, read schemas, and run read-only queries. Writes stay off unless you opt in.", "Copy MCP config", "Copy agent prompt", "Advisors", "Security", "Performance", "Warnings", "Info", "Issue type", "Entity/item", "Description", "{count} errors", "{count} warnings", "{count} suggestions", "No errors detected", "No warnings detected", "No suggestions", "Nothing to report for this deployment.", "Security and performance findings for your deployment.", "Review admin gates, credentials, and log redaction.", "Lunora checks admin-token strength, the live-subscription gate, and request-log redaction here.", "No security issues detected.", "Weak admin token", "Weak auth secret", "Session cookies are not Secure", "Wildcard CORS with credentials", "CSRF/origin guard is off", "Security headers are off", "Live admin subscriptions are ungated", "Request log keeps un-redacted args", "Unknown security finding", "Update your worker to a version of Lunora that describes this finding.", "Your admin token is {length} characters — use at least {min} for a brute-force-resistant secret.", "Your auth secret is {length} characters — use at least {min} (e.g. `openssl rand -hex 32`) to sign sessions safely.", "BETTER_AUTH_URL is a plaintext http:// origin, so session cookies cannot be Secure and ride in cleartext. Serve auth over https:// in production.", "LUNORA_ALLOWED_ORIGINS includes a wildcard while credentials are allowed — browsers reject this and it defeats the allowlist. Name explicit origins instead of *.", "LUNORA_SECURITY_CSRF is off, so cross-origin state-changing cookie requests are not blocked. Re-enable it in production to keep mutations un-forgeable.", "LUNORA_SECURITY_HEADERS is off, so HSTS, CSP, nosniff, and frame-options are not applied. Re-enable the baseline headers in production.", "Apply index", "Apply index on {table}", "Apply?", "CREATE INDEX SQL copied to clipboard.", "LUNORA_WS_BEARER is unset, so the WebSocket upgrade gate is open: live admin subscriptions need no credential. Set it to gate them like the HTTP admin RPCs.", "This worker reports a development environment, so the request log stores raw args and identity. Confirm it isn't a mislabeled production deploy.", "Audit", "A durable log of admin state-changing operations.", "Filter audit log", "filter op, table, id", "No audit entries.", "Notifications", "Registered push devices — endpoint, kind, last-send status, and delivery errors.", "Registered Web Push / FCM devices appear here. Configure lunora/notify.ts with defineNotify({ store }) and register a device with ctx.push.register(...).", "No registered devices.", "Filter devices", "filter endpoint, user", "{count} devices", "endpoint", "last seen", "n/a", "time", "op", "table", "detail", "Auth audit", "Authentication and security events — sign-ins, MFA, and session changes.", "Filter security events", "filter event, actor, IP", "Authentication and security events are recorded here.", "No security events.", "event", "actor", "ip / user agent", "outcome", "success", "failure", "Settings", "Deployment", "Read-only deployment config — vars, secrets, and bindings.", "Environment & bindings", "No environment variables or bindings.", "Open in Cloudflare", "Remove filter", "View-only — values are masked. Edit vars, secrets, and bindings in wrangler or the Cloudflare dashboard.", "URL", "Environment", "Version", "value", "Cascade impact", "Delete preview — rows that would cascade or be blocked", "No related rows found.", "Restrict relations will block this delete.", "Generate rows", "Generate dummy rows", "Seed {table} with Faker-generated rows. Existing rows are not affected.", "Row count", "(max {max})", "Columns to seed", "FK: no rows in {ref} — will skip", "→ {ref}", "No rows generated — all columns were skipped.", "Inserted {count} rows. Skipped FK columns: {cols}", "Inserted {count} rows successfully.", "Inserted {inserted} of {total} rows — {conflicts} skipped as id conflicts.", "Generate & insert", "Inserting…", "Time Travel", "Restore a shard to a point in the last 30 days.", "root", "In-place recovery to any moment in the last 30 days. For older or portable recovery, use the snapshot backup tier.", "Current bookmark", "Restore", "Time (ISO or epoch-ms, last 30 days)", "Preview", "Bookmark for that time", "Or an explicit bookmark (wins over time)", "bookmark string", "Restart the shard now so recovery applies immediately", "Confirm restore", "restarted now", "on next restart", "Restore armed", "Restored to", "Undo bookmark", "Confirm undo", "Undo restore", "role", "Role", "Role (optional)", "Active", "Banned", "unverified", "Manage", "New user", "Create", "Create user", "Creating…", "Password (optional)", "Search users", "Search by email or name…", "Filter by role", "Set role", "Ban user", "Ban reason (optional)", "Days", "Unban", "New password", "Set password", "Impersonate", "Impersonation token", "Revoke", "Revoke all sessions", "Delete user", "Confirm delete", "User details", "Fields", "Linked accounts", "No linked accounts.", "provider", "Unlink", "Security", "Disable two-factor", "No passkeys.", "Operations", "Organizations", "slug", "Members", "Invitations", "Remove", "No organizations.", "Select an organization to view its members and invitations.", "Organizations are not enabled.", "Enable the organization() plugin in your auth config to manage organizations here.", "Browse and manage organizations, members, and invitations.", "Reload", "Manage auth users — roles, bans, sessions, and identity.", "Auth config", "Configuration", "Enabled plugins and session config (read-only).", "Enabled capabilities", "Loading auth configuration…", "Accounts", "Admin", "Passkeys", "Two-factor", "Enabled", "Disabled", "OAuth providers, email templates, and rate limits are configured at deploy time in the better-auth setup and aren't editable here. See the Mail tab for email output.", "Sessions", "Browse and revoke active sessions across all users.", "user", "impersonated by", "Log drains", "Forward logs to Logpush, Tail Workers, or a webhook collector.", "Cloudflare destinations", "Lunora does not ship logs itself — forwarding is handled by Cloudflare. Configure a destination below, then test your collector.", "Logpush", "Stream every request log to R2, a SIEM, or a third-party log service.", "Tail Workers", "Send logs programmatically to a Worker for custom capture and forwarding.", "Workers Logs", "Retain and query recent request logs directly in Cloudflare's dashboard.", "Webhook test", "POST a sample Lunora request-log envelope to your collector to confirm it is reachable.", "https://example.com/logs", "Send test event", "Delivered — status {status} in {latency}ms", "Failed: {message}", "fetch is unavailable in this environment.", "Realtime", "Active WebSocket subscriptions on this shard.", "{count} connections", "{count} subscriptions", "This Studio session's sync client", "Reading the sync client's state…", "Sync client", "{count} pending writes", "Reads client.debug() for the client running in this page — not your application's client. Call client.debug() in your app to diagnose a specific stuck overlay there.", "No shard connection has been opened yet.", "No shards", "Shard", "Socket", "Confirmed watermark", "(default)", "This client holds no live queries or shapes.", "No subscriptions", "Subscription", "Kind", "Acked", "Cursor", "Pending overlays", "No active subscriptions.", "Connection", "admin", "Folder path", "Grid", "Sort", "Name", "Type", "Modified", "Toggle sort direction", "Thumbnail size", "Link expiry", "15m", "1h", "24h", "7d", "Upload", "Uploading…", "Copy URL", "Download", "Delete object?", "Uploaded {key}", "Deleted {key}", "Summary", "Time range", "All time", "Last 5m", "Last 15m", "Last hour", "filter path", "By level", "By function", "Count", "{count} entries", "Snippets", "Couldn't load the OpenAPI spec: {message}", "No OpenAPI spec configured", "Run `lunora codegen` and wire `_generated/openapi.json` to the worker to render the API reference here.", "API operations", "Filter operations", "No operations match your filter.", "Try it", "Request arguments", "Response body", "Response", "application/json", "Arguments (JSON)", "Send", "Sending…", "Send a request to see the response.", "No example for this response.", "Error", "{ms} ms", "Range", "Value in", "relation", "API spec format", "OpenAPI", "OpenRPC", "Params", "Result", "Field", "Required", "JSON-RPC request", "Couldn't load the OpenRPC spec: {message}", "No OpenRPC spec configured", "Run `lunora codegen --api-spec openrpc` and wire `_generated/openrpc.json` to the worker to render the OpenRPC reference here.", "used by", "Orphan", "1 record", "{count} records", "References shard", "Which shard's records are checked for references to these files. Empty = root shard.", "Orphaned objects", "Find records whose file reference points at an object the bucket no longer has.", "Check for orphans", "Checking…", "No dangling references.", "Every record's file reference points at an object that exists in the bucket.", "Missing object", "→", "Showing the first {count} dangling references — the scan was truncated.", "Per-function call counts, error rates, and latency land here after your first request.", "Function and request logs for this shard show up here as your app handles traffic.", "No tables in this shard.", "Browse Vectorize indexes and run similarity searches.", "dimensions", "field", "Indexes declared with .vectorize() or defineVectorIndex() appear here.", "metadata", "metric", "No matches.", "No vector indexes.", "score", "Search", "Search by similarity…", "Searching…", "vectors", "Vectors", "Add a kv_namespaces binding to wrangler.jsonc — it appears here automatically, no wiring needed.", "Browse and edit key-value pairs in your Workers KV namespaces.", "Deleting…", "Expiration", "Filter", "Filter by prefix…", "Filter keys by prefix", "Key is absent or has no value.", "KV", "KV value", "Copy key", "Copy value", "Create key", "Failed to delete {count} keys.", "Format JSON", "Key name", "Expires after", "TTL unit", "TTL must be at least 60 seconds.", "seconds", "minutes", "hours", "days", "Leave blank to keep the current expiration.", "Metadata (JSON)", "Metadata must be valid JSON.", "New key", "No expiration", "Select all", "Select {name}", "Metadata", "Namespace", "No keys.", "No KV namespaces.", "Saving…", "vs. prev.", "Top functions", "No functions called yet.", "Calls", "Avg", "Err", "Avg latency", "cache hit", "Live connections", "sockets", "active subscriptions", "Recent activity", "No recent activity.", "last interval", "{rate} error rate", "cache entries", "Critical", "Degraded", "All systems healthy", "One or more service levels are breached.", "Some service levels need attention.", "All service levels are within target.", "Showing a partial request/error history — one or more shards have more data than the trend chart can display.", "Analytics", "Analytics is not configured.", "Hot shards", "Latency p50 / p95 per function", "No data points yet.", "Request volume per function", "Set CLOUDFLARE_ACCOUNT_ID and CLOUDFLARE_API_TOKEN (Analytics Read) in your .dev.vars to enable usage panels.", "Usage and latency from Analytics Engine — request volume, p50/p95, and hot shards.", "(whole bucket)", "Access Rules", "Bucket", "Inspect storage access rules — per bucket, operation, and key prefix.", "No defineStorageRule is wired through .use(storageRules(...)) in this deployment. Add one to gate object access by key prefix.", "No storage rules defined", "Operation", "Storage rules are declared in code with defineStorageRule and gate ctx.storage access per bucket. This view is read-only.", "Write", "Queues", "Queue", "Mode", "Dead-letter", "No queues defined", "Inspect declared Cloudflare Queues — their producer bindings, consumer mode, and dead-letter queue.", "No defineQueue is declared in lunora/queues.ts in this deployment. Add one to offload async work to a Cloudflare Queue.", "Queues are declared in code with defineQueue. Enqueue from a mutation or action with ctx.queues.<name>.send(...); push consumers process batches in the worker.", "No dead-letter queue on {queues}.", "Exhausted messages are dropped after retries. Add a deadLetterQueue to capture them.", "1 message was recently dead-lettered.", "{count} messages were recently dead-lettered.", "Batch mode needs a JSON array body — each element is enqueued as one message.", "Body", "Body must be valid JSON.", "Captured", "Clear log", "Clear {count} messages?", "Cloudflare Queues have no peek API, so this is what push consumers actually processed — not pending depth.", "Consumed messages appear here once a push consumer processes a batch in dev. Send one from the Send tab to see it captured.", "Declare a queue with defineQueue in lunora/queues.ts to enqueue a test message.", "Declared", "Delay must be a non-negative number of seconds.", "Delay (s)", "Delay (seconds)", "DLQ", "Enqueue a JSON message to a declared producer to exercise its consumer. Nothing is captured until the consumer processes it.", "Message", "Message body (JSON)", "Messages", "No consumed messages yet.", "No queues to send to", "Outcome", "Replay", "Replaying…", "Send as batch (JSON array)", "Send message", "Flags", "Inspect feature flags and their live evaluation under a targeting context.", "Feature flags are read in code with ctx.flags.<type>(\"key\", default). They evaluate through the OpenFeature provider configured in lunora/flags.ts; edit the targeting context below to see how each flag resolves for a given audience.", "Targeting context (JSON)", "Targeting context must be a JSON object.", "Targeting context is not valid JSON.", "Live updates unavailable; showing the last evaluation.", "No @lunora/flags provider is wired in this deployment. Add lunora/flags.ts with defineFlags({ provider }) to gate code paths on feature flags.", "No flags provider configured", "A flags provider is configured, but no handler reads a flag yet. Call ctx.flags.boolean(\"key\", false) in a query, mutation, or action.", "No flags read", "Key", "Value", "Reason", "Variant", "Workflows", "Inspect declared Cloudflare Workflows and their bindings.", "Binding", "Class", "No workflows defined", "No defineWorkflow is declared in lunora/workflows.ts in this deployment. Add one to run a durable, multi-step workflow.", "Workflows are declared in code with defineWorkflow and run as durable Cloudflare Workflows. This view is read-only.", "Workflows are declared in code with defineWorkflow and run as durable Cloudflare Workflows. Start an instance and observe its status below.", "Start instance", "Starting…", "Workflow", "Instance id", "Instance id (optional)", "Params (JSON)", "Params (JSON, optional)", "Params must be valid JSON", "Instances", "Status", "Output", "Refresh", "Refreshing…", "Instance history", "Filter by status", "All statuses", "Workflow inspection not configured", "Set CLOUDFLARE_ACCOUNT_ID and CLOUDFLARE_API_TOKEN in your .dev.vars to enable workflow instance history.", "No instances", "No instances match this filter for the selected workflow.", "Created", "Ended", "Steps", "Step", "Attempts", "Started", "This instance has no recorded steps yet.", "pause", "resume", "terminate", ">100ms avg execution", "50–100ms avg execution", "<50ms avg execution", "{count} tracked statements", "Avg time", "avg", "avg time", "avgTime", "Critical queries", "Exec count", "exec count", "execCount", "Execution count", "Fast queries", "Full statement", "Moderate queries", "No query insights yet", "Overview", "P90 latency", "P95 latency", "Query insights", "Query insights appear once statements are executed against this shard.", "Query leaderboard", "Rows read", "Rows written", "rowsRead", "Slow queries sorted by {sortField}", "Sort by", "Sort queries by", "Statements", "total", "Total time", "total time", "totalTime", "Edit schema", "Add table", "Add column", "Add index", "Rename / drop / change type…", "Table name", "Column name", "Column type", "Index name", "Index fields (comma-separated)", "Optional", "Unique", "Cancel", "Apply", "Applying…", "This edit changes stored data and must go through a migration. Review the migration before applying.", "Open Migrations", "Schema updated.", "Codegen reported diagnostics:", "Editing the schema is only available in local dev.", "Adds a table, column, or index to lunora/schema.ts and reruns codegen.", "Theme", "Dark theme", "Light theme", "System theme", "Integrity", "Fan-out", "auto-scaled: {relayCount}/{maxRelays} relays", "auto-scaled: {relayCount}/{maxRelays} relays (at ceiling)", "Realtime fan-out cost and per-topic subscriber counts for this shard.", "No fan-out activity yet.", "peak {count} subscribers", "Hot topics", "Topic", "Kind", "Subscribers", "Fan-out cost since this instance woke", "Shape pokes", "Whisper broadcasts", "Passes", "Sockets iterated", "Delivered", "Peak width", "Max time", "Containers", "Container", "Instance", "Last event", "Detail", "Exit", "When", "No container activity", "Live Cloudflare Containers — current lifecycle state per instance from the log stream.", "Cloudflare Containers are observed from their lifecycle log stream. This shows the current state per instance — ports and health checks aren't carried in that stream.", "No container lifecycle activity yet. Instances declared with defineContainer show up here once they start, sleep, stop, or error.", "Traces", "Recent ctx.trace waterfalls for this shard — the drill-down from a log line.", "Search traces", "search trace or function", "Recent traces", "Trace waterfall", "Errored span", "{count} spans", "starts {offset} in, runs {duration}", "Showing the {shown} most recent of {total} traces in the buffer.", "No traces", "Traces recorded with ctx.trace show up here as your app handles traffic. The span buffer resets when the shard hibernates.", "Issues", "Issue", "Source", "Events", "First seen", "Last seen", "No issues", "Grouped error triage — Worker throws and container crashes folded by fingerprint.", "No grouped errors yet. When a function throws or a container crashes, matching errors fold into a single issue here.", "Severity", "Assignee", "Set severity", "Unassigned", "Resolve", "Ignore", "Reopen", "All", "Open", "Resolved", "Ignored", "—", "Toggle issue details", "Suggested fix", "No known fix for this error yet.", "Explain in plain language", "Explaining…", "AI explanation", "Generated by {model}", "No AI binding is configured. Wire an AI binding to enable plain-language explanations — the suggested fix above is always available.", "The AI model could not explain this error right now. The suggested fix above still applies.", "No catalog fix matched this error, so this explanation is the model's own reading of the message. Verify before acting on it.", "optional", "required", "unique", "Plugin fields", "New organization", "Edit organization", "Delete organization", "Delete this organization? Its members, invitations, teams, and custom roles are removed. This cannot be undone.", "Slug (optional — derived from name)", "Logo URL (optional)", "Owner user id (optional)", "Metadata (JSON, optional)", "Add member", "Invite member", "Send invitation", "Change member role", "Change role", "New team", "Rename team", "Rename", "Delete team", "Delete this team and its memberships? This cannot be undone.", "Add team member", "Team members", "No members.", "No teams.", "No team members.", "Teams", "New role", "Edit role", "Delete role", "Delete this custom role? Members keeping it will lose its grants.", "No custom roles.", "Role name", "Permission", "Permission (JSON, e.g. {\"project\":[\"create\",\"update\"]})", "Plugins", "No plugins enabled.", "Sign-in methods", "Email & password", "Social providers", "None", "Custom roles", "Session policy", "Expires in", "Refresh after", "Fresh window", "Cookie cache", "Rate limit", "Max requests", "Window", "Plugin user fields", "Deployment health", "Live liveness, readiness, and per-binding health from the deployment's /_lunora/health endpoint.", "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.", "Liveness", "Readiness", "Ready", "Not ready", "Healthy", "Unhealthy", "Checked", "Subsystem checks", "No checks reported.", "Up", "Down", "Health endpoint unavailable", "The health endpoint is in the admin posture. Paste a valid admin token in the connect popover, or set its auth to public.", "Couldn't reach the health endpoint: {message}", "no response"];
1322
1377
  /** A known studio message id — one of the entries in {@link MESSAGE_IDS}. */
1323
1378
  type MessageId = (typeof MESSAGE_IDS)[number];
1324
- /**
1325
- * English message catalog.
1326
- *
1327
- * English is the source locale: every call site passes its English string as the
1328
- * message id (e.g. `t("Save")`), and Lingui compiles the id verbatim when a
1329
- * catalog has no entry for it. So English needs no translations — this stays
1330
- * empty and the source strings render as-is. The known ids live in
1331
- * {@link MESSAGE_IDS}, which types the `t` function.
1332
- */
1333
1379
  /** The locale the studio ships with and falls back to. */
1334
1380
  declare const DEFAULT_LOCALE = "en";
1335
1381
  /**
1336
- * Locale code to catalog. Each catalog maps an English source string (which
1337
- * doubles as the message id) to its translation. English ships empty: Lingui
1338
- * compiles the id verbatim when a translation is missing, so the source strings
1339
- * render as-is. To add a language, register `{ "Some English text": "…" }`.
1340
- */
1382
+ * Locale code to catalog. Each catalog maps an English source string (which
1383
+ * doubles as the message id) to its translation. English ships empty: Lingui
1384
+ * compiles the id verbatim when a translation is missing, so the source strings
1385
+ * render as-is. To add a language, register `{ "Some English text": "…" }`.
1386
+ */
1341
1387
  type StudioCatalogs = Readonly<Record<string, Messages>>;
1342
1388
  /**
1343
- * Translate function: `t("Clear")` or `t("{title} failed", { title })`.
1344
- *
1345
- * `id` is constrained to a known {@link MessageId}, so a typo is a compile error.
1346
- * The interpolation `values` stay loosely typed: mapping each id to its exact
1347
- * placeholder set isn't worth the machinery for the handful of interpolated
1348
- * strings, so a wrong or missing value key isn't caught at this boundary.
1349
- */
1389
+ * Translate function: `t("Clear")` or `t("{title} failed", { title })`.
1390
+ *
1391
+ * `id` is constrained to a known {@link MessageId}, so a typo is a compile error.
1392
+ * The interpolation `values` stay loosely typed: mapping each id to its exact
1393
+ * placeholder set isn't worth the machinery for the handful of interpolated
1394
+ * strings, so a wrong or missing value key isn't caught at this boundary.
1395
+ */
1350
1396
  type TFunction = (id: MessageId, values?: Record<string, unknown>) => string;
1351
1397
  /**
1352
- * Build a studio-scoped Lingui instance. We deliberately use `@lingui/core`'s
1353
- * `setupI18n` (a fresh instance) rather than the global singleton so the
1354
- * studio can never clobber — or be clobbered by — a host app that also uses
1355
- * Lingui.
1356
- *
1357
- * The message compiler is installed explicitly. `@lingui/core` only auto-installs
1358
- * it when `NODE_ENV !== "production"`, but the studio ships as a library and
1359
- * relies on the compiler at runtime to interpolate uncompiled source strings
1360
- * (e.g. `t("{title} failed", { title })`). Without this, a consumer's production
1361
- * build would render `{title}` literally and `console.warn` on every `t(...)`.
1362
- *
1363
- * Pass extra `catalogs` to ship more locales; unknown `locale` codes fall back
1364
- * to `DEFAULT_LOCALE`.
1365
- */
1398
+ * Build a studio-scoped Lingui instance. We deliberately use `@lingui/core`'s
1399
+ * `setupI18n` (a fresh instance) rather than the global singleton so the
1400
+ * studio can never clobber — or be clobbered by — a host app that also uses
1401
+ * Lingui.
1402
+ *
1403
+ * The message compiler is installed explicitly. `@lingui/core` only auto-installs
1404
+ * it when `NODE_ENV !== "production"`, but the studio ships as a library and
1405
+ * relies on the compiler at runtime to interpolate uncompiled source strings
1406
+ * (e.g. `t("{title} failed", { title })`). Without this, a consumer's production
1407
+ * build would render `{title}` literally and `console.warn` on every `t(...)`.
1408
+ *
1409
+ * Pass extra `catalogs` to ship more locales; unknown `locale` codes fall back
1410
+ * to `DEFAULT_LOCALE`.
1411
+ */
1366
1412
  declare const createStudioI18n: (locale?: string, catalogs?: StudioCatalogs) => I18n;
1367
1413
  /**
1368
- * Shared default instance. Backs the i18n context's default value so the
1369
- * composable studio and individual exported panels resolve their strings even
1370
- * when rendered without `StudioI18nProvider` (e.g. in tests, or a host's own
1371
- * admin UI). English-only, so it renders source strings as-is.
1372
- */
1414
+ * Shared default instance. Backs the i18n context's default value so the
1415
+ * composable studio and individual exported panels resolve their strings even
1416
+ * when rendered without `StudioI18nProvider` (e.g. in tests, or a host's own
1417
+ * admin UI). English-only, so it renders source strings as-is.
1418
+ */
1373
1419
  declare const studioI18n: I18n;
1374
1420
  /**
1375
- * Hook returning a `t` bound to the nearest `StudioI18nProvider` (or the
1376
- * shared instance when there's none). This is the runtime stand-in for Lingui's
1377
- * `t` macro — the studio builds with esbuild and tests under Vite 8/Rolldown,
1378
- * neither of which runs Lingui's Babel macro transform, so call sites pass the
1379
- * English string as the id directly.
1380
- */
1421
+ * Hook returning a `t` bound to the nearest `StudioI18nProvider` (or the
1422
+ * shared instance when there's none). This is the runtime stand-in for Lingui's
1423
+ * `t` macro — the studio builds with esbuild and tests under Vite 8/Rolldown,
1424
+ * neither of which runs Lingui's Babel macro transform, so call sites pass the
1425
+ * English string as the id directly.
1426
+ */
1381
1427
  declare const useT: () => TFunction;
1382
1428
  interface StudioI18nProviderProps {
1383
1429
  /** Catalogs to register in addition to the built-in English one. */
@@ -1389,15 +1435,10 @@ interface StudioI18nProviderProps {
1389
1435
  readonly locale?: string;
1390
1436
  }
1391
1437
  /**
1392
- * Provides a studio-scoped Lingui instance to `useT`. Nesting is safe:
1393
- * providers sharing the same instance resolve to the same context value.
1394
- */
1395
- declare const StudioI18nProvider: ({
1396
- catalogs,
1397
- children,
1398
- i18n,
1399
- locale
1400
- }: StudioI18nProviderProps) => ReactElement;
1438
+ * Provides a studio-scoped Lingui instance to `useT`. Nesting is safe:
1439
+ * providers sharing the same instance resolve to the same context value.
1440
+ */
1441
+ declare const StudioI18nProvider: ({ catalogs, children, i18n, locale }: StudioI18nProviderProps) => ReactElement;
1401
1442
  /** Root class the batteries-included app sets so the studio styles stay scoped. */
1402
1443
  declare const STUDIO_ROOT_CLASS = "lunora-studio-root";
1403
- export { ADMIN_FUNCTIONS, ADMIN_FUNCTION_PREFIX, type AggregateMetrics, ApiDocsPanel, type ApiDocsPanelProps, ApiReferencePanel, type ApiReferencePanelProps, ApiTab, type ApiTabProps, type AuditEntry, type AuditLogResult, AuditPanel, type AuditPanelProps, type CacheStats, type CapturedMailResult, type CommandItem, CommandPalette, type CommandPaletteProps, ConfirmButton, type ConfirmButtonProps, ConnectionBadge, DEFAULT_AUTO_REFRESH_MS, DEFAULT_INSIGHT_THRESHOLDS, DEFAULT_LOCALE, DataBrowser, type DataBrowserProps, DataFilters, type DeployInfo, type EditableFilter, ErrorBoundary, type ErrorBoundaryProps, ExportImportPanel, type ExportImportPanelProps, type ExportRow, FileBrowser, type FileBrowserProps, type FilterClause, type FilterOperator, type FunctionCallStat, type FunctionDescriptor, FunctionRunner, type FunctionRunnerProps, FunctionStatsPanel, type FunctionStatsPanelProps, type FunctionStatsResult, GlobalDataBrowser, type GlobalDataBrowserProps, HealthPanel, type HealthPanelProps, HomePanel, type HomePanelProps, type ImportError, type ImportShardResult, type Insight, type InsightKind, type InsightSeverity, type InsightThresholds, InsightsPanel, type InsightsPanelProps, type LogEntry, type LogLevel, LogsPanel, type LogsPanelProps, type LogsResult, MailPanel, type MailPanelProps, type MessageId, MetricsPanel, type MetricsPanelProps, type MigrationDirection, type MigrationRunResult, type MigrationStatus, type MigrationStatusRow, MigrationsPanel, type MigrationsPanelProps, OpenRpcReferencePanel, type OpenRpcReferencePanelProps, PitrPanel, type PitrPanelProps, type RunMigrationArgs, STUDIO_ROOT_CLASS, SchemaViewer, type SchemaViewerProps, SecurityAdvisorPanel, type SecurityAuditResult, type SecurityFinding, type SecurityFindingKind, type SecurityFindingLevel, type SettingEntry, type SettingKind, SettingsPanel, type SettingsPanelProps, type SettingsResult, ShardInput, type ShardInputProps, type ShardMetrics, type ShardMetricsResult, SqlEditorPanel, type SqlEditorPanelProps, type StudioCatalogs, StudioI18nProvider, type StudioI18nProviderProps, type TFunction, TableEditor, type TableEditorProps, type TableIndexInfo, type TableIndexesResult, type TableInfo, type TablePage, type WriteRowArgs, type WriteRowOp, type WriteRowResult, aggregateMetrics, createStudioI18n, deriveInsights, openCommandPalette, shardsToAggregate, studioI18n, toFilterClauses, useAutoRefresh, useDebounced, useT };
1444
+ export { ADMIN_FUNCTIONS, ADMIN_FUNCTION_PREFIX, AdvisorHealthPanel, type AggregateMetrics, ApiDocsPanel, type ApiDocsPanelProps, ApiReferencePanel, type ApiReferencePanelProps, ApiTab, type ApiTabProps, type AuditEntry, type AuditLogResult, AuditPanel, type AuditPanelProps, type CacheStats, type CapturedMailResult, type CommandItem, CommandPalette, type CommandPaletteProps, ConfirmButton, type ConfirmButtonProps, ConnectionBadge, DEFAULT_AUTO_REFRESH_MS, DEFAULT_INSIGHT_THRESHOLDS, DEFAULT_LOCALE, DataBrowser, type DataBrowserProps, DataFilters, type DeployInfo, DeploymentHealthPanel, type DeploymentHealthPanelProps, type DeploymentHealthProbe, type EditableFilter, ErrorBoundary, type ErrorBoundaryProps, ExportImportPanel, type ExportImportPanelProps, type ExportRow, FileBrowser, type FileBrowserProps, type FilterClause, type FilterOperator, type FunctionCallStat, type FunctionDescriptor, FunctionRunner, type FunctionRunnerProps, FunctionStatsPanel, type FunctionStatsPanelProps, type FunctionStatsResult, GlobalDataBrowser, type GlobalDataBrowserProps, HealthPanel, type HealthPanelProps, HomePanel, type HomePanelProps, type ImportError, type ImportShardResult, type Insight, type InsightKind, type InsightSeverity, type InsightThresholds, InsightsPanel, type InsightsPanelProps, type LogEntry, type LogLevel, LogsPanel, type LogsPanelProps, type LogsResult, MailPanel, type MailPanelProps, type MessageId, MetricsPanel, type MetricsPanelProps, type MigrationDirection, type MigrationRunResult, type MigrationStatus, type MigrationStatusRow, MigrationsPanel, type MigrationsPanelProps, NotificationsPanel, OpenRpcReferencePanel, type OpenRpcReferencePanelProps, PitrPanel, type PitrPanelProps, type ProbeSnapshot, type RunMigrationArgs, STUDIO_ROOT_CLASS, SchemaViewer, type SchemaViewerProps, SecurityAdvisorPanel, type SecurityAuditResult, type SecurityFinding, type SecurityFindingKind, type SecurityFindingLevel, type SettingEntry, type SettingKind, SettingsPanel, type SettingsPanelProps, type SettingsResult, ShardInput, type ShardInputProps, type ShardMetrics, type ShardMetricsResult, SqlEditorPanel, type SqlEditorPanelProps, type StudioCatalogs, StudioI18nProvider, type StudioI18nProviderProps, type StudioTab, type TFunction, TableEditor, type TableEditorProps, type TableIndexInfo, type TableIndexesResult, type TableInfo, type TablePage, type WriteRowArgs, type WriteRowOp, type WriteRowResult, aggregateMetrics, createStudioI18n, deriveInsights, openCommandPalette, shardsToAggregate, studioI18n, toFilterClauses, useAutoRefresh, useDebounced, useT };