@lunora/studio 1.0.0-alpha.7 → 1.0.0-alpha.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +6 -0
- package/dist/index.d.ts +762 -779
- package/dist/index.js +1 -41
- package/dist/mount.d.ts +10 -10
- package/dist/mount.js +1 -26
- package/dist/packem_chunks/ApiTab.js +1 -0
- package/dist/packem_chunks/AuditPanel.js +1 -0
- package/dist/packem_chunks/DeploymentHealthPanel.js +1 -0
- package/dist/packem_chunks/ExportImportPanel.js +3 -0
- package/dist/packem_chunks/FileBrowser.js +4 -0
- package/dist/packem_chunks/FunctionRunner.js +1 -0
- package/dist/packem_chunks/FunctionStatsPanel.js +1 -0
- package/dist/packem_chunks/HealthPanel.js +1 -0
- package/dist/packem_chunks/InsightsPanel.js +1 -0
- package/dist/packem_chunks/LogsPanel.js +1 -0
- package/dist/packem_chunks/MailPanel.js +2 -0
- package/dist/packem_chunks/MetricsPanel.js +1 -0
- package/dist/packem_chunks/MigrationsPanel.js +1 -0
- package/dist/packem_chunks/NotificationsPanel.js +1 -0
- package/dist/packem_chunks/PitrPanel.js +1 -0
- package/dist/packem_chunks/SchemaViewer.js +2 -0
- package/dist/packem_chunks/SecurityAdvisorPanel.js +1 -0
- package/dist/packem_chunks/SettingsPanel.js +1 -0
- package/dist/packem_chunks/SqlEditorPanel.js +4 -0
- package/dist/packem_chunks/TableEditor.js +1 -0
- package/dist/packem_chunks/agents-panel.js +1 -0
- package/dist/packem_chunks/analytics-panel.js +1 -0
- package/dist/packem_chunks/auth-audit-panel.js +1 -0
- package/dist/packem_chunks/auth-config-panel.js +1 -0
- package/dist/packem_chunks/auth-sessions-panel.js +1 -0
- package/dist/packem_chunks/containers-panel.js +1 -0
- package/dist/packem_chunks/dashboards-panel.js +1 -0
- package/dist/packem_chunks/fanout-panel.js +1 -0
- package/dist/packem_chunks/flags-panel.js +1 -0
- package/dist/packem_chunks/issues-panel.js +1 -0
- package/dist/packem_chunks/kv-browser.js +1 -0
- package/dist/packem_chunks/log-drains-panel.js +4 -0
- package/dist/packem_chunks/organizations-panel.js +1 -0
- package/dist/packem_chunks/payments-panel.js +1 -0
- package/dist/packem_chunks/permissions-panel.js +1 -0
- package/dist/packem_chunks/queues-panel.js +1 -0
- package/dist/packem_chunks/rls-panel.js +1 -0
- package/dist/packem_chunks/schedule-panel.js +1 -0
- package/dist/packem_chunks/sparkline.js +1 -0
- package/dist/packem_chunks/storage-rules-panel.js +1 -0
- package/dist/packem_chunks/subscriptions-panel.js +1 -0
- package/dist/packem_chunks/sync-client-panel.js +1 -0
- package/dist/packem_chunks/traces-panel.js +1 -0
- package/dist/packem_chunks/users-panel.js +1 -0
- package/dist/packem_chunks/vector-browser.js +1 -0
- package/dist/packem_chunks/workflows-panel.js +1 -0
- package/dist/packem_shared/ADMIN_FUNCTIONS-BYNSbBVE.js +1 -0
- package/dist/packem_shared/ApiDocsPanel-eJYZlylw.js +2 -0
- package/dist/packem_shared/ApiReferencePanel-C42v1jr6.js +1 -0
- package/dist/packem_shared/CommandPalette-CVIaY3j8.js +1 -0
- package/dist/packem_shared/ConfirmButton-CTL3f3kr.js +1 -0
- package/dist/packem_shared/ConnectionBadge-DOk0CQWo.js +1 -0
- package/dist/packem_shared/DEFAULT_AUTO_REFRESH_MS-BCC8_4BQ.js +1 -0
- package/dist/packem_shared/DEFAULT_INSIGHT_THRESHOLDS-B-hcFVoi.js +1 -0
- package/dist/packem_shared/DEFAULT_LOCALE-BZ4NojpD.js +1 -0
- package/dist/packem_shared/DataBrowser-B8J5lHjP.js +1 -0
- package/dist/packem_shared/DataFilters-Csb30F0C.js +1 -0
- package/dist/packem_shared/ErrorBoundary-DvzYskH7.js +1 -0
- package/dist/packem_shared/GlobalDataBrowser-RLJ6NvOs.js +1 -0
- package/dist/packem_shared/HomePanel-DL1HupAN.js +1 -0
- package/dist/packem_shared/OpenRpcReferencePanel-sGsIgYWj.js +1 -0
- package/dist/packem_shared/STUDIO_ROOT_CLASS-C6MccdVk.js +1 -0
- package/dist/packem_shared/ScheduledJobs-DUbo6epc.js +1 -0
- package/dist/packem_shared/ShardInput-BVn2iCU0.js +1 -0
- package/dist/packem_shared/Studio-BWBclm_C.js +1 -0
- package/dist/packem_shared/StudioApp-BFm73yVr.js +1 -0
- package/dist/packem_shared/StudioI18nProvider-CZ5h4nrV.js +1 -0
- package/dist/packem_shared/advisor-view-DaCX9Jy5.js +1 -0
- package/dist/packem_shared/aggregateMetrics-BNfajLa2.js +1 -0
- package/dist/packem_shared/alert-CVcOFuDR.js +1 -0
- package/dist/packem_shared/app.d-bRPJhby-.d.ts +254 -0
- package/dist/packem_shared/badge-BbuuAio7.js +1 -0
- package/dist/packem_shared/bar-chart-AryFCeoa.js +9 -0
- package/dist/packem_shared/browser-storage-xjTyMKY0.js +1 -0
- package/dist/packem_shared/button-BkCrNcAs.js +1 -0
- package/dist/packem_shared/card-CIDGUN6K.js +1 -0
- package/dist/packem_shared/cf-links-gbDy51nR.js +1 -0
- package/dist/packem_shared/checkbox-StT4Gob6.js +1 -0
- package/dist/packem_shared/data-grid-BMBKzMEJ.js +1 -0
- package/dist/packem_shared/data-view-params-C8T3bW1z.js +1 -0
- package/dist/packem_shared/dropdown-menu-C3RQ_HlW.js +2 -0
- package/dist/packem_shared/empty-state-Cg7t_8qu.js +1 -0
- package/dist/packem_shared/error-alert-B59DnrDI.js +1 -0
- package/dist/packem_shared/grid-features-uZCUj955.js +6 -0
- package/dist/packem_shared/home-panel-B-8BCffw.js +3 -0
- package/dist/packem_shared/input-JHu63lTv.js +1 -0
- package/dist/packem_shared/internal-AtZ4bTal.js +2 -0
- package/dist/packem_shared/label-6uP1obNF.js +1 -0
- package/dist/packem_shared/live-status-CGW2JHf_.js +1 -0
- package/dist/packem_shared/log-fields-CoL3hsIQ.js +1 -0
- package/dist/packem_shared/modal-shell-CUwwWC2o.js +1 -0
- package/dist/packem_shared/reference-view-KvhektwF.js +12 -0
- package/dist/packem_shared/result-chart-CwKhhKM0.js +1 -0
- package/dist/packem_shared/scroll-area-DTEq6Jec.js +2 -0
- package/dist/packem_shared/select-Bul-DeII.js +2 -0
- package/dist/packem_shared/shard-history-DMEW5VBE.js +1 -0
- package/dist/packem_shared/skeleton-C1wQ9M5t.js +1 -0
- package/dist/packem_shared/sparkline-DtcZoU48.js +1 -0
- package/dist/packem_shared/storage-tier-DznqOf-q.js +1 -0
- package/dist/packem_shared/studio-BHA7hnI3.js +2 -0
- package/dist/packem_shared/table-DdJBrClo.js +2 -0
- package/dist/packem_shared/table-list-sidebar-CMCcNALK.js +1 -0
- package/dist/packem_shared/textarea-Bu2-jKAs.js +1 -0
- package/dist/packem_shared/trace-handoff-Dw7mwjxu.js +1 -0
- package/dist/packem_shared/use-admin-query-Di3fLE8H.js +1 -0
- package/dist/packem_shared/use-async-submit-H68GHPz8.js +1 -0
- package/dist/packem_shared/useDebounced-Ihdiid_k.js +1 -0
- package/dist/packem_shared/utils-bhneXptQ.js +1 -0
- package/dist/packem_shared/virtual-rect-1o1veP7R.js +1 -0
- package/dist/standalone/chunk-2F7G7IWQ.js +1 -0
- package/dist/standalone/chunk-2OUPA2WJ.js +1 -0
- package/dist/standalone/chunk-2PJNAWB3.js +1 -0
- package/dist/standalone/chunk-2Y36BVVM.js +4 -0
- package/dist/standalone/chunk-34UVAASH.js +1 -0
- package/dist/standalone/chunk-35II7U25.js +11 -0
- package/dist/standalone/chunk-3FUFEZ65.js +1 -0
- package/dist/standalone/chunk-3QRTYSSX.js +1 -0
- package/dist/standalone/chunk-3RTTXLMU.js +1 -0
- package/dist/standalone/chunk-3XIESWL4.js +1 -0
- package/dist/standalone/chunk-4CGALXS3.js +19 -0
- package/dist/standalone/chunk-4UOFSGUS.js +1 -0
- package/dist/standalone/chunk-4WLYA3XE.js +1 -0
- package/dist/standalone/chunk-54MMVNPT.js +1 -0
- package/dist/standalone/chunk-5L2MD6F6.js +1 -0
- package/dist/standalone/chunk-5OWIOACV.js +13 -0
- package/dist/standalone/chunk-5RF4QDDA.js +6 -0
- package/dist/standalone/chunk-5U2THBI7.js +1 -0
- package/dist/standalone/chunk-5Y3QLNWX.js +1 -0
- package/dist/standalone/chunk-65OTWFS3.js +1 -0
- package/dist/standalone/chunk-6DWCIIHE.js +1 -0
- package/dist/standalone/chunk-6ST5ECQA.js +1 -0
- package/dist/standalone/chunk-7J5N6DGQ.js +1 -0
- package/dist/standalone/chunk-7LQWFOEU.js +1 -0
- package/dist/standalone/chunk-7QIFDWQV.js +1 -0
- package/dist/standalone/chunk-7RXOPYR5.js +1 -0
- package/dist/standalone/chunk-7T7UOTYK.js +1 -0
- package/dist/standalone/chunk-7YEFOSPH.js +1 -0
- package/dist/standalone/chunk-AVAC26HJ.js +1 -0
- package/dist/standalone/chunk-B43FTQJ7.js +1 -0
- package/dist/standalone/chunk-BEH5N5ZA.js +1 -0
- package/dist/standalone/chunk-BGBLQ563.js +1 -0
- package/dist/standalone/chunk-BNUJ7QMG.js +3 -0
- package/dist/standalone/chunk-C43X4M5U.js +1 -0
- package/dist/standalone/chunk-CFPZYHPY.js +2 -0
- package/dist/standalone/chunk-D7XXWV4E.js +1 -0
- package/dist/standalone/chunk-DVOBKIUX.js +1 -0
- package/dist/standalone/chunk-EKRN4ZQM.js +1 -0
- package/dist/standalone/chunk-ESVP44Y3.js +1 -0
- package/dist/standalone/chunk-EVN46TVV.js +1 -0
- package/dist/standalone/chunk-EXFBIISG.js +2 -0
- package/dist/standalone/chunk-F5QWLENA.js +1 -0
- package/dist/standalone/chunk-F6GOKFMU.js +3 -0
- package/dist/standalone/chunk-FGTK44LR.js +1 -0
- package/dist/standalone/chunk-FXCBF4XT.js +1 -0
- package/dist/standalone/chunk-GMR677FL.js +1 -0
- package/dist/standalone/chunk-GRL5MG3Z.js +1 -0
- package/dist/standalone/chunk-GSPTEMYN.js +1 -0
- package/dist/standalone/chunk-GXZAXNZI.js +1 -0
- package/dist/standalone/chunk-H7NIIBHH.js +1 -0
- package/dist/standalone/chunk-HP2UCWND.js +1 -0
- package/dist/standalone/chunk-HPFLBYRI.js +1 -0
- package/dist/standalone/chunk-IC4L6G56.js +1 -0
- package/dist/standalone/chunk-IDNNI63H.js +1 -0
- package/dist/standalone/chunk-ILNELDFC.js +1 -0
- package/dist/standalone/chunk-IVFHIQOT.js +1 -0
- package/dist/standalone/chunk-JN2Y24PY.js +1 -0
- package/dist/standalone/chunk-KDOC2DP5.js +1 -0
- package/dist/standalone/chunk-KUVMORDQ.js +1 -0
- package/dist/standalone/chunk-KYF2E5CJ.js +1 -0
- package/dist/standalone/chunk-L7N7F3DA.js +1 -0
- package/dist/standalone/chunk-LE56LPNH.js +13 -0
- package/dist/standalone/chunk-LEDWUPXM.js +1 -0
- package/dist/standalone/chunk-LFKCLLPT.js +1 -0
- package/dist/standalone/chunk-LFXFP4IF.js +1 -0
- package/dist/standalone/chunk-LJDP7NRB.js +1 -0
- package/dist/standalone/chunk-LLXFYRGQ.js +1 -0
- package/dist/standalone/chunk-M536Y2KX.js +1 -0
- package/dist/standalone/chunk-MIQTKZAR.js +1 -0
- package/dist/standalone/chunk-OHKRN65U.js +1 -0
- package/dist/standalone/chunk-P24JBHEZ.js +4 -0
- package/dist/standalone/chunk-PF7V3G2Z.js +62 -0
- package/dist/standalone/chunk-PWWHP76O.js +1 -0
- package/dist/standalone/chunk-QBWRC5YX.js +1 -0
- package/dist/standalone/chunk-QGKAJTQQ.js +1 -0
- package/dist/standalone/chunk-QLJJ5YYZ.js +1 -0
- package/dist/standalone/chunk-QVEHPYA5.js +1 -0
- package/dist/standalone/chunk-QWGT25SE.js +1 -0
- package/dist/standalone/chunk-QWJ3NPE3.js +1 -0
- package/dist/standalone/chunk-RAA2RGG6.js +1 -0
- package/dist/standalone/chunk-RBU52M5T.js +1 -0
- package/dist/standalone/chunk-SA3MDZC3.js +1 -0
- package/dist/standalone/chunk-SD4BERSA.js +1 -0
- package/dist/standalone/chunk-SFDOII3B.js +1 -0
- package/dist/standalone/chunk-SKHEGARW.js +1 -0
- package/dist/standalone/chunk-SMIESS7P.js +1 -0
- package/dist/standalone/chunk-T2JIUFOD.js +4 -0
- package/dist/standalone/chunk-T6VMSOBB.js +1 -0
- package/dist/standalone/chunk-THIXMMZD.js +1 -0
- package/dist/standalone/chunk-TJ2WZ5OP.js +1 -0
- package/dist/standalone/chunk-TLHJRWNK.js +1 -0
- package/dist/standalone/chunk-UIS34ZPB.js +8 -0
- package/dist/standalone/chunk-UNUU7CJJ.js +1 -0
- package/dist/standalone/chunk-UZERI5YC.js +1 -0
- package/dist/standalone/chunk-V53KNYRN.js +1 -0
- package/dist/standalone/chunk-VPAXCQ2Y.js +4 -0
- package/dist/standalone/chunk-X2FQ6B5V.js +1 -0
- package/dist/standalone/chunk-XBDKZZ67.js +1 -0
- package/dist/standalone/chunk-XEDU5FO4.js +1 -0
- package/dist/standalone/chunk-XQBTNJUQ.js +1 -0
- package/dist/standalone/chunk-XQCVZAGU.js +1 -0
- package/dist/standalone/chunk-XQGANNLS.js +1 -0
- package/dist/standalone/chunk-XSD4Y6SQ.js +1 -0
- package/dist/standalone/chunk-XXQUMVWH.js +1 -0
- package/dist/standalone/chunk-YD5NF6UT.js +1 -0
- package/dist/standalone/chunk-YI3WYUXK.js +1 -0
- package/dist/standalone/chunk-ZJGP6EKR.js +1 -0
- package/dist/standalone/chunk-ZNNAGR6N.js +1 -0
- package/dist/standalone/studio.js +9 -356
- package/dist/styles.css +2 -2
- package/package.json +17 -15
- package/dist/packem_shared/ADMIN_FUNCTIONS-DmBqMZ-z.js +0 -45
- package/dist/packem_shared/ApiDocsPanel-C5-yJ1p7.js +0 -842
- package/dist/packem_shared/ApiReferencePanel-1vubqG5s.js +0 -229
- package/dist/packem_shared/ApiTab-W3no0KOj.js +0 -251
- package/dist/packem_shared/AuditPanel-Bq4o_IqT.js +0 -212
- package/dist/packem_shared/CommandPalette-BtgkBzZI.js +0 -373
- package/dist/packem_shared/ConfirmButton-C2eVi2Qv.js +0 -59
- package/dist/packem_shared/ConnectionBadge-B2DDM2Tn.js +0 -111
- package/dist/packem_shared/DEFAULT_AUTO_REFRESH_MS-Vxwaxx51.js +0 -50
- package/dist/packem_shared/DEFAULT_INSIGHT_THRESHOLDS-DjF0h-gA.js +0 -89
- package/dist/packem_shared/DEFAULT_LOCALE-CiX4W7Kr.js +0 -27
- package/dist/packem_shared/DataBrowser-CtBe1So9.js +0 -4542
- package/dist/packem_shared/DataFilters-FNquMaiu.js +0 -249
- package/dist/packem_shared/ErrorBoundary-BzAApI7J.js +0 -66
- package/dist/packem_shared/ExportImportPanel-dxY56TDF.js +0 -193
- package/dist/packem_shared/FileBrowser-Dhy4zES8.js +0 -2932
- package/dist/packem_shared/FunctionRunner--fQJRPAD.js +0 -343
- package/dist/packem_shared/FunctionStatsPanel-BjRUA_G3.js +0 -432
- package/dist/packem_shared/GlobalDataBrowser-BTEmGrph.js +0 -318
- package/dist/packem_shared/HealthPanel-PxclMWmA.js +0 -640
- package/dist/packem_shared/HomePanel-Cw16stjq.js +0 -1273
- package/dist/packem_shared/InsightsPanel-CWS_C-xW.js +0 -423
- package/dist/packem_shared/LogsPanel-CTW8CFcM.js +0 -839
- package/dist/packem_shared/MailPanel-BwkvfIHF.js +0 -447
- package/dist/packem_shared/MetricsPanel-BLuOhZQ4.js +0 -1625
- package/dist/packem_shared/MigrationsPanel-DT3lnwHF.js +0 -246
- package/dist/packem_shared/OpenRpcReferencePanel-vbcYbv3V.js +0 -191
- package/dist/packem_shared/PitrPanel-CdErL7EJ.js +0 -252
- package/dist/packem_shared/STUDIO_ROOT_CLASS-D12gX2dV.js +0 -3
- package/dist/packem_shared/ScheduledJobs-CabfKbyM.js +0 -159
- package/dist/packem_shared/SchemaViewer-LJDcmNIO.js +0 -2512
- package/dist/packem_shared/SecurityAdvisorPanel-C_ETsPih.js +0 -79
- package/dist/packem_shared/SettingsPanel-C0uLRf5P.js +0 -176
- package/dist/packem_shared/ShardInput-gx_DZXXn.js +0 -107
- package/dist/packem_shared/SqlEditorPanel-CguV7otm.js +0 -13
- package/dist/packem_shared/Studio-BmSGSIuY.js +0 -33
- package/dist/packem_shared/StudioApp-D4azxYBu.js +0 -657
- package/dist/packem_shared/StudioI18nProvider-B-tDCZIi.js +0 -48
- package/dist/packem_shared/TableEditor-ChfUOZec.js +0 -371
- package/dist/packem_shared/advisor-view-CGcfMiPq.js +0 -159
- package/dist/packem_shared/aggregateMetrics-D4nUHEKU.js +0 -108
- package/dist/packem_shared/app.d-CCmwDEVs.d.ts +0 -300
- package/dist/packem_shared/badge-B2PKA1-5.js +0 -49
- package/dist/packem_shared/bar-chart-CzJAgqkp.js +0 -3245
- package/dist/packem_shared/button-BhsN2uZH.js +0 -49
- package/dist/packem_shared/card-DURq3ElK.js +0 -175
- package/dist/packem_shared/cf-links-2cktDedA.js +0 -8
- package/dist/packem_shared/checkbox-UNkzAxl-.js +0 -63
- package/dist/packem_shared/data-grid-B5CaV3wS.js +0 -183
- package/dist/packem_shared/dropdown-menu-WY4B_eJO.js +0 -280
- package/dist/packem_shared/empty-state-DY_oe0k6.js +0 -98
- package/dist/packem_shared/grid-features-CzUfqgsM.js +0 -840
- package/dist/packem_shared/input-XH4r1Pt1.js +0 -53
- package/dist/packem_shared/internal-rXJEAhXS.js +0 -68
- package/dist/packem_shared/label-D8ykjn5J.js +0 -46
- package/dist/packem_shared/live-status-FZ0psC1z.js +0 -44
- package/dist/packem_shared/reference-view-B4E49Lip.js +0 -2180
- package/dist/packem_shared/shard-history-DyebH1R5.js +0 -38
- package/dist/packem_shared/sparkline-10dG-_f0.js +0 -93
- package/dist/packem_shared/sql-editor-panel-BFRpzj6r.js +0 -2562
- package/dist/packem_shared/storage-tier-CL98eOvn.js +0 -85
- package/dist/packem_shared/studio-H9fuQgSj.js +0 -10303
- package/dist/packem_shared/table-_RzNvy3R.js +0 -246
- package/dist/packem_shared/table-list-sidebar-Bg7uzbvC.js +0 -832
- package/dist/packem_shared/textarea-D3gaCU_-.js +0 -46
- package/dist/packem_shared/use-live-admin-Dq6g3daN.js +0 -73
- package/dist/packem_shared/use-live-shard-seed-Cuk3dnH0.js +0 -76
- package/dist/packem_shared/useDebounced-Dxncpg6z.js +0 -32
- package/dist/packem_shared/utils-B05Dmz_H.js +0 -8
- package/dist/packem_shared/virtual-rect-CVMUskSm.js +0 -10
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { F as FunctionDescriptor } from "./packem_shared/app.d-
|
|
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-
|
|
1
|
+
import { F as FunctionDescriptor } from "./packem_shared/app.d-bRPJhby-.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-bRPJhby-.js";
|
|
3
3
|
import { ReactElement, ReactNode, ErrorInfo, Component, ChangeEvent } from 'react';
|
|
4
4
|
import { CapturedMail } from '@lunora/mail';
|
|
5
5
|
export type { CapturedMail } from '@lunora/mail';
|
|
6
|
+
import { HealthBody } from '@lunora/runtime';
|
|
6
7
|
import { Messages, I18n } from '@lingui/core';
|
|
7
8
|
export type { LunoraClient, ScheduleRecord, StorageObject } from '@lunora/client';
|
|
8
9
|
/** A navigable destination shown in the palette. */
|
|
@@ -21,17 +22,15 @@ interface CommandPaletteProps {
|
|
|
21
22
|
/** Open the command palette from anywhere (e.g. the top-bar Search button). */
|
|
22
23
|
declare const openCommandPalette: () => void;
|
|
23
24
|
/**
|
|
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;
|
|
25
|
+
* Command palette (⌘K / Ctrl-K) — Supabase-style global search. Rendered inside
|
|
26
|
+
* the studio shell so its selection can drive the router's `useNavigate`. Opens
|
|
27
|
+
* on the keyboard shortcut or the {@link OPEN_EVENT} the top-bar Search button
|
|
28
|
+
* dispatches, filters the navigable destinations by a case-insensitive substring
|
|
29
|
+
* over their label and domain, and navigates to the chosen one. Built on the
|
|
30
|
+
* studio's Base UI dialog primitive — no `cmdk`/extra dependency — with a small
|
|
31
|
+
* arrow-key + Enter affordance over the filtered list.
|
|
32
|
+
*/
|
|
33
|
+
declare const CommandPalette: ({ items }: CommandPaletteProps) => ReactElement;
|
|
35
34
|
interface ConfirmButtonProps {
|
|
36
35
|
/** Label for the initial trigger (e.g. `Delete`). */
|
|
37
36
|
readonly children: string;
|
|
@@ -45,33 +44,27 @@ interface ConfirmButtonProps {
|
|
|
45
44
|
readonly testId: string;
|
|
46
45
|
}
|
|
47
46
|
/**
|
|
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
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
*/
|
|
47
|
+
* A destructive-action button that requires a second click to fire. The first
|
|
48
|
+
* click swaps the trigger for an inline `Confirm` / `Cancel` pair rather than a
|
|
49
|
+
* blocking `window.confirm`, so the guard is testable and non-modal. The
|
|
50
|
+
* trigger keeps its `testId` (so existing tests that click it still reach the
|
|
51
|
+
* first step); the actual action only runs on the `${testId}-confirm` click.
|
|
52
|
+
*/
|
|
53
|
+
declare const ConfirmButton: ({ children, confirmLabel, disabled, onConfirm, testId }: ConfirmButtonProps) => ReactElement;
|
|
54
|
+
/**
|
|
55
|
+
* Live-socket status indicator. Reflects the client's aggregate WebSocket health
|
|
56
|
+
* so an operator can tell a healthy live channel from a silently-dropped socket
|
|
57
|
+
* (a panel showing "Live: on" while the socket is down would otherwise look
|
|
58
|
+
* identical to one that's simply idle).
|
|
59
|
+
*/
|
|
67
60
|
declare const ConnectionBadge: () => ReactElement;
|
|
68
61
|
interface ErrorBoundaryProps {
|
|
69
62
|
readonly children: ReactNode;
|
|
70
63
|
/**
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
64
|
+
* Localised fallback heading. When omitted, falls back to `${label} failed`
|
|
65
|
+
* (or `Something went wrong` with no label). A class component can't use the
|
|
66
|
+
* `useT` hook, so localised text is passed in by its parents.
|
|
67
|
+
*/
|
|
75
68
|
readonly fallbackTitle?: string;
|
|
76
69
|
/** Optional label naming the boundary's region, shown in the fallback. */
|
|
77
70
|
readonly label?: string;
|
|
@@ -82,10 +75,10 @@ interface ErrorBoundaryState {
|
|
|
82
75
|
readonly error: Error | null;
|
|
83
76
|
}
|
|
84
77
|
/**
|
|
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
|
-
*/
|
|
78
|
+
* Catches render/lifecycle errors in a panel so one throwing component doesn't
|
|
79
|
+
* blank the whole studio shell. Shows the error message with a "Try again"
|
|
80
|
+
* button that clears the boundary and re-renders its children.
|
|
81
|
+
*/
|
|
89
82
|
declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
|
|
90
83
|
static getDerivedStateFromError(error: Error): ErrorBoundaryState;
|
|
91
84
|
override state: ErrorBoundaryState;
|
|
@@ -102,29 +95,26 @@ interface ShardInputProps {
|
|
|
102
95
|
readonly value: string;
|
|
103
96
|
}
|
|
104
97
|
/**
|
|
105
|
-
* Shard-key text field shared by every shard-scoped panel. Backed by a
|
|
106
|
-
* `<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;
|
|
98
|
+
* Shard-key text field shared by every shard-scoped panel. Backed by a
|
|
99
|
+
* `<datalist>` of recently-used shard keys (see {@link loadRecentShards}) so an
|
|
100
|
+
* operator can pick a shard they've visited instead of retyping it — the closest
|
|
101
|
+
* to a shard picker possible without server-side shard enumeration, which
|
|
102
|
+
* Durable Objects don't support. Panels remain responsible for recording a shard
|
|
103
|
+
* as used (via `recordShard`) when they actually query it.
|
|
104
|
+
*/
|
|
105
|
+
declare const ShardInput: ({ id, onChange, testId, value }: ShardInputProps) => ReactElement;
|
|
118
106
|
declare const ADMIN_FUNCTION_PREFIX = "__lunora_admin__:";
|
|
119
107
|
/**
|
|
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
|
-
*/
|
|
108
|
+
* Fully-qualified reserved paths the studio invokes via the client. The
|
|
109
|
+
* `__lunora_admin__:` prefix is spelled out inline rather than interpolated so
|
|
110
|
+
* the values stay emittable under `--isolatedDeclarations`. Every path is
|
|
111
|
+
* intercepted by `ShardDO` before user dispatch and gated by the server's
|
|
112
|
+
* `LUNORA_ADMIN_TOKEN`.
|
|
113
|
+
*/
|
|
126
114
|
declare const ADMIN_FUNCTIONS: {
|
|
115
|
+
readonly assignIssue: "__lunora_admin__:assignIssue";
|
|
127
116
|
readonly clearCapturedMail: "__lunora_admin__:clearCapturedMail";
|
|
117
|
+
readonly clearQueueMessages: "__lunora_admin__:clearQueueMessages";
|
|
128
118
|
readonly clearTable: "__lunora_admin__:clearTable";
|
|
129
119
|
readonly createWorkflowInstance: "__lunora_admin__:createWorkflowInstance";
|
|
130
120
|
readonly deleteRows: "__lunora_admin__:deleteRows";
|
|
@@ -134,30 +124,45 @@ declare const ADMIN_FUNCTIONS: {
|
|
|
134
124
|
readonly facetColumn: "__lunora_admin__:facetColumn";
|
|
135
125
|
readonly getAdvisories: "__lunora_admin__:getAdvisories";
|
|
136
126
|
readonly getAuditLog: "__lunora_admin__:getAuditLog";
|
|
127
|
+
readonly getAuthAuditLog: "__lunora_admin__:getAuthAuditLog";
|
|
137
128
|
readonly getAuthMetrics: "__lunora_admin__:getAuthMetrics";
|
|
138
129
|
readonly getCapturedMail: "__lunora_admin__:getCapturedMail";
|
|
130
|
+
readonly getFanoutMetrics: "__lunora_admin__:getFanoutMetrics";
|
|
139
131
|
readonly getFunctionStats: "__lunora_admin__:getFunctionStats";
|
|
132
|
+
readonly getIssues: "__lunora_admin__:getIssues";
|
|
133
|
+
readonly listFlags: "__lunora_admin__:listFlags";
|
|
134
|
+
readonly listPushSubscriptions: "__lunora_admin__:listPushSubscriptions";
|
|
135
|
+
readonly listQueues: "__lunora_admin__:listQueues";
|
|
140
136
|
readonly listSubscriptions: "__lunora_admin__:listSubscriptions";
|
|
141
137
|
readonly listTableIndexes: "__lunora_admin__:listTableIndexes";
|
|
142
138
|
readonly listWorkflows: "__lunora_admin__:listWorkflows";
|
|
143
139
|
readonly getLogs: "__lunora_admin__:getLogs";
|
|
140
|
+
readonly getMetricHistory: "__lunora_admin__:getMetricHistory";
|
|
141
|
+
readonly getMetricSeries: "__lunora_admin__:getMetricSeries";
|
|
144
142
|
readonly getMetrics: "__lunora_admin__:getMetrics";
|
|
145
143
|
readonly getPitrBookmark: "__lunora_admin__:getPitrBookmark";
|
|
144
|
+
readonly getQueueMessages: "__lunora_admin__:getQueueMessages";
|
|
146
145
|
readonly getRequestLog: "__lunora_admin__:getRequestLog";
|
|
147
146
|
readonly getSecurityAudit: "__lunora_admin__:getSecurityAudit";
|
|
148
147
|
readonly getSettings: "__lunora_admin__:getSettings";
|
|
148
|
+
readonly getTraces: "__lunora_admin__:getTraces";
|
|
149
149
|
readonly getWorkflowInstanceStatus: "__lunora_admin__:getWorkflowInstanceStatus";
|
|
150
|
+
readonly ignoreIssue: "__lunora_admin__:ignoreIssue";
|
|
150
151
|
readonly importShard: "__lunora_admin__:importShard";
|
|
151
152
|
readonly listTables: "__lunora_admin__:listTables";
|
|
152
153
|
readonly maskPolicies: "__lunora_admin__:maskPolicies";
|
|
153
154
|
readonly migrationStatus: "__lunora_admin__:migrationStatus";
|
|
154
155
|
readonly pitrRestore: "__lunora_admin__:pitrRestore";
|
|
155
156
|
readonly readTablePage: "__lunora_admin__:readTablePage";
|
|
157
|
+
readonly replayQueueMessage: "__lunora_admin__:replayQueueMessage";
|
|
158
|
+
readonly resolveIssue: "__lunora_admin__:resolveIssue";
|
|
156
159
|
readonly rlsPolicies: "__lunora_admin__:rlsPolicies";
|
|
157
160
|
readonly runAs: "__lunora_admin__:runAs";
|
|
158
161
|
readonly runMigration: "__lunora_admin__:runMigration";
|
|
159
162
|
readonly runSql: "__lunora_admin__:runSql";
|
|
163
|
+
readonly sendQueueMessage: "__lunora_admin__:sendQueueMessage";
|
|
160
164
|
readonly sendTestMail: "__lunora_admin__:sendTestMail";
|
|
165
|
+
readonly setIssueSeverity: "__lunora_admin__:setIssueSeverity";
|
|
161
166
|
readonly storageOrphans: "__lunora_admin__:storageOrphans";
|
|
162
167
|
readonly storageReferences: "__lunora_admin__:storageReferences";
|
|
163
168
|
readonly storageRules: "__lunora_admin__:storageRules";
|
|
@@ -167,10 +172,10 @@ declare const ADMIN_FUNCTIONS: {
|
|
|
167
172
|
/** Comparison a {@link FilterClause} applies, mirroring `@lunora/do`'s `FilterOperator`. `contains` is a substring (LIKE). */
|
|
168
173
|
type FilterOperator = "contains" | "eq" | "gt" | "gte" | "lt" | "lte" | "ne";
|
|
169
174
|
/**
|
|
170
|
-
* One structured column filter passed to `readTablePage`, mirroring `@lunora/do`'s
|
|
171
|
-
* `FilterClause`. AND-combined with the substring search and the other clauses.
|
|
172
|
-
* `value` is sent as-is and bound server-side, so it never injects SQL.
|
|
173
|
-
*/
|
|
175
|
+
* One structured column filter passed to `readTablePage`, mirroring `@lunora/do`'s
|
|
176
|
+
* `FilterClause`. AND-combined with the substring search and the other clauses.
|
|
177
|
+
* `value` is sent as-is and bound server-side, so it never injects SQL.
|
|
178
|
+
*/
|
|
174
179
|
interface FilterClause {
|
|
175
180
|
column: string;
|
|
176
181
|
operator: FilterOperator;
|
|
@@ -215,26 +220,26 @@ interface ShardMetrics {
|
|
|
215
220
|
uptimeMs: number;
|
|
216
221
|
}
|
|
217
222
|
/**
|
|
218
|
-
* One full-scan attribution entry on a {@link FunctionCallStat}, mirroring
|
|
219
|
-
* `@lunora/do`'s `FunctionScanAttribution`: how many times the function
|
|
220
|
-
* full-scanned `table`. The causal evidence behind the "missing index" insight.
|
|
221
|
-
*/
|
|
223
|
+
* One full-scan attribution entry on a {@link FunctionCallStat}, mirroring
|
|
224
|
+
* `@lunora/do`'s `FunctionScanAttribution`: how many times the function
|
|
225
|
+
* full-scanned `table`. The causal evidence behind the "missing index" insight.
|
|
226
|
+
*/
|
|
222
227
|
interface FunctionScanAttribution {
|
|
223
228
|
scans: number;
|
|
224
229
|
table: string;
|
|
225
230
|
}
|
|
226
231
|
/**
|
|
227
|
-
* Per-function execution counters returned by `__lunora_admin__:getFunctionStats`
|
|
228
|
-
* for one shard. Mirrors `@lunora/do`'s `FunctionCallStat`. Counters are
|
|
229
|
-
* per-DO-instance and reset on hibernation/restart — a "since this instance
|
|
230
|
-
* woke" readout. Durations are handler wall-clock milliseconds.
|
|
231
|
-
*
|
|
232
|
-
* `scans` / `scannedTables` carry the causal full-scan attribution (PLAN3 1.2).
|
|
233
|
-
* They're additive — a worker predating the feature reports `scans: 0` and
|
|
234
|
-
* `scannedTables: []`, so the fields are optional on the wire and the consumer
|
|
235
|
-
* defaults them. `conflicts` (OCC write-contention count, a subset of `errors`)
|
|
236
|
-
* is likewise additive and optional for the same back-compat reason.
|
|
237
|
-
*/
|
|
232
|
+
* Per-function execution counters returned by `__lunora_admin__:getFunctionStats`
|
|
233
|
+
* for one shard. Mirrors `@lunora/do`'s `FunctionCallStat`. Counters are
|
|
234
|
+
* per-DO-instance and reset on hibernation/restart — a "since this instance
|
|
235
|
+
* woke" readout. Durations are handler wall-clock milliseconds.
|
|
236
|
+
*
|
|
237
|
+
* `scans` / `scannedTables` carry the causal full-scan attribution (PLAN3 1.2).
|
|
238
|
+
* They're additive — a worker predating the feature reports `scans: 0` and
|
|
239
|
+
* `scannedTables: []`, so the fields are optional on the wire and the consumer
|
|
240
|
+
* defaults them. `conflicts` (OCC write-contention count, a subset of `errors`)
|
|
241
|
+
* is likewise additive and optional for the same back-compat reason.
|
|
242
|
+
*/
|
|
238
243
|
interface FunctionCallStat {
|
|
239
244
|
calls: number;
|
|
240
245
|
/** OCC write-conflict count — a subset of `errors`; absent on a pre-conflict-tracking worker. */
|
|
@@ -257,11 +262,11 @@ interface FunctionStatsResult {
|
|
|
257
262
|
sinceMs: number;
|
|
258
263
|
}
|
|
259
264
|
/**
|
|
260
|
-
* One declared index on a table, mirroring `@lunora/do`'s `TableIndexInfo`.
|
|
261
|
-
* `type` is the index kind; `fields` the indexed columns (sort fields for rank,
|
|
262
|
-
* text + filter fields for search, source field for vector); `unique` is set
|
|
263
|
-
* only for unique secondary indexes.
|
|
264
|
-
*/
|
|
265
|
+
* One declared index on a table, mirroring `@lunora/do`'s `TableIndexInfo`.
|
|
266
|
+
* `type` is the index kind; `fields` the indexed columns (sort fields for rank,
|
|
267
|
+
* text + filter fields for search, source field for vector); `unique` is set
|
|
268
|
+
* only for unique secondary indexes.
|
|
269
|
+
*/
|
|
265
270
|
interface TableIndexInfo {
|
|
266
271
|
fields: string[];
|
|
267
272
|
name: string;
|
|
@@ -272,15 +277,25 @@ interface TableIndexInfo {
|
|
|
272
277
|
interface TableIndexesResult {
|
|
273
278
|
indexes: TableIndexInfo[];
|
|
274
279
|
}
|
|
275
|
-
/** Severity of a buffered log entry, mirroring `@lunora/do`'s `LogLevel`. */
|
|
276
|
-
type LogLevel = "debug" | "error" | "info" | "warn";
|
|
277
280
|
/**
|
|
278
|
-
*
|
|
279
|
-
*
|
|
280
|
-
*
|
|
281
|
-
*/
|
|
281
|
+
* Severity of a buffered log entry, mirroring `@lunora/do`'s `LogLevel` — the
|
|
282
|
+
* full seven-tier `ctx.log` ramp (`trace`→`fatal`). A worker predating the
|
|
283
|
+
* un-folded buffer only ever sends the four console tiers, which are a subset.
|
|
284
|
+
*/
|
|
285
|
+
type LogLevel = "debug" | "error" | "fatal" | "info" | "log" | "trace" | "warn";
|
|
286
|
+
/**
|
|
287
|
+
* One buffered log line returned by `__lunora_admin__:getLogs`. `functionPath`
|
|
288
|
+
* is the RPC that produced it (when known); `timestamp` is epoch-ms.
|
|
289
|
+
* `instance`/`exitCode` are populated for container lifecycle entries
|
|
290
|
+
* (`instance` = the per-instance Durable Object id, `exitCode` = the process
|
|
291
|
+
* exit code parsed out of a `stop` event). Mirrors `@lunora/do`'s `LogEntry`.
|
|
292
|
+
*/
|
|
282
293
|
interface LogEntry {
|
|
294
|
+
exitCode?: number;
|
|
295
|
+
/** Structured fields from a `ctx.log.<level>(message, fields)` / `ctx.log.with(fields)` call, when present. */
|
|
296
|
+
fields?: Record<string, unknown>;
|
|
283
297
|
functionPath?: string;
|
|
298
|
+
instance?: string;
|
|
284
299
|
level: LogLevel;
|
|
285
300
|
message: string;
|
|
286
301
|
timestamp: number;
|
|
@@ -290,13 +305,13 @@ interface LogsResult {
|
|
|
290
305
|
entries: LogEntry[];
|
|
291
306
|
}
|
|
292
307
|
/**
|
|
293
|
-
* One recorded admin operation returned by `__lunora_admin__:getAuditLog`,
|
|
294
|
-
* mirroring `@lunora/do`'s `AuditEntry`. Unlike the in-memory logs, the audit
|
|
295
|
-
* log is durable and survives hibernation/restart. `seq` is a monotonic
|
|
296
|
-
* per-shard cursor; `op` the short op name (`writeRow`, `runMigration`,
|
|
297
|
-
* `importShard`, `applyCdc`); `table`/`id` are present when the op targets one;
|
|
298
|
-
* `detail` carries op-specific context (notably the acting `userId`).
|
|
299
|
-
*/
|
|
308
|
+
* One recorded admin operation returned by `__lunora_admin__:getAuditLog`,
|
|
309
|
+
* mirroring `@lunora/do`'s `AuditEntry`. Unlike the in-memory logs, the audit
|
|
310
|
+
* log is durable and survives hibernation/restart. `seq` is a monotonic
|
|
311
|
+
* per-shard cursor; `op` the short op name (`writeRow`, `runMigration`,
|
|
312
|
+
* `importShard`, `applyCdc`); `table`/`id` are present when the op targets one;
|
|
313
|
+
* `detail` carries op-specific context (notably the acting `userId`).
|
|
314
|
+
*/
|
|
300
315
|
interface AuditEntry {
|
|
301
316
|
detail?: Record<string, unknown>;
|
|
302
317
|
id?: string;
|
|
@@ -310,17 +325,17 @@ interface AuditLogResult {
|
|
|
310
325
|
entries: AuditEntry[];
|
|
311
326
|
}
|
|
312
327
|
/**
|
|
313
|
-
* How a deployment binding/var classifies, mirroring `@lunora/do`'s `SettingKind`.
|
|
314
|
-
* `var` is a plain Worker var, `secret` a sensitive string (always masked), and
|
|
315
|
-
* `binding` a non-string binding object (R2/KV/DO/D1/queue/service).
|
|
316
|
-
*/
|
|
328
|
+
* How a deployment binding/var classifies, mirroring `@lunora/do`'s `SettingKind`.
|
|
329
|
+
* `var` is a plain Worker var, `secret` a sensitive string (always masked), and
|
|
330
|
+
* `binding` a non-string binding object (R2/KV/DO/D1/queue/service).
|
|
331
|
+
*/
|
|
317
332
|
type SettingKind = "binding" | "secret" | "var";
|
|
318
333
|
/**
|
|
319
|
-
* One row of the read-only deployment-settings view, mirroring `@lunora/do`'s
|
|
320
|
-
* `SettingEntry`. `value` is a masked preview for `var`/`secret` strings (never
|
|
321
|
-
* the raw secret) and `null` for `binding` entries. The server masks every
|
|
322
|
-
* string value, so the studio only ever renders the masked text.
|
|
323
|
-
*/
|
|
334
|
+
* One row of the read-only deployment-settings view, mirroring `@lunora/do`'s
|
|
335
|
+
* `SettingEntry`. `value` is a masked preview for `var`/`secret` strings (never
|
|
336
|
+
* the raw secret) and `null` for `binding` entries. The server masks every
|
|
337
|
+
* string value, so the studio only ever renders the masked text.
|
|
338
|
+
*/
|
|
324
339
|
interface SettingEntry {
|
|
325
340
|
/** Coarse runtime class for `binding` entries (`r2`, `kv`, `durable-object`, …). */
|
|
326
341
|
bindingType?: string;
|
|
@@ -329,10 +344,10 @@ interface SettingEntry {
|
|
|
329
344
|
value: null | string;
|
|
330
345
|
}
|
|
331
346
|
/**
|
|
332
|
-
* Best-effort deploy metadata, mirroring `@lunora/do`'s `DeployInfo`. Every
|
|
333
|
-
* field is optional: the server reads only what the Worker `env` exposes and
|
|
334
|
-
* omits the rest.
|
|
335
|
-
*/
|
|
347
|
+
* Best-effort deploy metadata, mirroring `@lunora/do`'s `DeployInfo`. Every
|
|
348
|
+
* field is optional: the server reads only what the Worker `env` exposes and
|
|
349
|
+
* omits the rest.
|
|
350
|
+
*/
|
|
336
351
|
interface DeployInfo {
|
|
337
352
|
deploymentId?: string;
|
|
338
353
|
environment?: string;
|
|
@@ -345,24 +360,24 @@ interface SettingsResult {
|
|
|
345
360
|
settings: SettingEntry[];
|
|
346
361
|
}
|
|
347
362
|
/**
|
|
348
|
-
* Ordering/visual weight of a {@link SecurityFinding}, mirroring `@lunora/do`'s
|
|
349
|
-
* `SecurityFindingLevel`. Shares the studio's insight-severity vocabulary so the
|
|
350
|
-
* Security and Performance advisors render with one badge palette.
|
|
351
|
-
*/
|
|
363
|
+
* Ordering/visual weight of a {@link SecurityFinding}, mirroring `@lunora/do`'s
|
|
364
|
+
* `SecurityFindingLevel`. Shares the studio's insight-severity vocabulary so the
|
|
365
|
+
* Security and Performance advisors render with one badge palette.
|
|
366
|
+
*/
|
|
352
367
|
type SecurityFindingLevel = "error" | "info" | "warning";
|
|
353
368
|
/**
|
|
354
|
-
* Which deployment-level security heuristic fired, mirroring `@lunora/do`'s
|
|
355
|
-
* `SecurityFindingKind`. The studio maps each kind to a localized title,
|
|
356
|
-
* explanation, and remediation hint; the wire payload carries only the kind,
|
|
357
|
-
* level, and optional `detail`.
|
|
358
|
-
*/
|
|
369
|
+
* Which deployment-level security heuristic fired, mirroring `@lunora/do`'s
|
|
370
|
+
* `SecurityFindingKind`. The studio maps each kind to a localized title,
|
|
371
|
+
* explanation, and remediation hint; the wire payload carries only the kind,
|
|
372
|
+
* level, and optional `detail`.
|
|
373
|
+
*/
|
|
359
374
|
type SecurityFindingKind = "admin-token-weak" | "auth-secret-weak" | "cookies-insecure" | "cors-wildcard-credentials" | "csrf-disabled" | "dev-args-unredacted" | "security-headers-disabled" | "ws-gate-open";
|
|
360
375
|
/**
|
|
361
|
-
* One detected security issue from `__lunora_admin__:getSecurityAudit`, mirroring
|
|
362
|
-
* `@lunora/do`'s `SecurityFinding`. `detail` carries kind-specific context the
|
|
363
|
-
* studio interpolates into the localized copy (e.g. `{ length, min }` for a weak
|
|
364
|
-
* admin token); absent when the kind needs none.
|
|
365
|
-
*/
|
|
376
|
+
* One detected security issue from `__lunora_admin__:getSecurityAudit`, mirroring
|
|
377
|
+
* `@lunora/do`'s `SecurityFinding`. `detail` carries kind-specific context the
|
|
378
|
+
* studio interpolates into the localized copy (e.g. `{ length, min }` for a weak
|
|
379
|
+
* admin token); absent when the kind needs none.
|
|
380
|
+
*/
|
|
366
381
|
interface SecurityFinding {
|
|
367
382
|
detail?: Record<string, unknown>;
|
|
368
383
|
kind: SecurityFindingKind;
|
|
@@ -383,16 +398,21 @@ interface TablePage {
|
|
|
383
398
|
/** Foreign-key columns (column → target table) for `v.id("target")` fields, so the UI can link those cells. */
|
|
384
399
|
refs?: Record<string, string>;
|
|
385
400
|
rows: Record<string, unknown>[];
|
|
386
|
-
|
|
401
|
+
/**
|
|
402
|
+
* Total rows matching the predicate. Absent when the read passed
|
|
403
|
+
* `skipCount: true` — the data browser sources the count from a separate,
|
|
404
|
+
* predicate-keyed read so paging never re-runs the COUNT.
|
|
405
|
+
*/
|
|
406
|
+
total?: number;
|
|
387
407
|
}
|
|
388
408
|
/** Direction a data migration is run in. Mirrors `@lunora/do`. */
|
|
389
409
|
type MigrationDirection = "down" | "up";
|
|
390
410
|
/** Lifecycle of a data-migration run. Mirrors `@lunora/do`. */
|
|
391
411
|
type MigrationStatus = "completed" | "failed" | "in_progress";
|
|
392
412
|
/**
|
|
393
|
-
* One persisted migration run-state row, as returned by the
|
|
394
|
-
* `__lunora_admin__:migrationStatus` RPC (`{ migrations: MigrationStatusRow[] }`).
|
|
395
|
-
*/
|
|
413
|
+
* One persisted migration run-state row, as returned by the
|
|
414
|
+
* `__lunora_admin__:migrationStatus` RPC (`{ migrations: MigrationStatusRow[] }`).
|
|
415
|
+
*/
|
|
396
416
|
interface MigrationStatusRow {
|
|
397
417
|
changed: number;
|
|
398
418
|
cursor: null | string;
|
|
@@ -441,23 +461,23 @@ interface ImportShardResult {
|
|
|
441
461
|
inserted: Record<string, number>;
|
|
442
462
|
}
|
|
443
463
|
/**
|
|
444
|
-
* One shard's request total from the worker's `POST /_lunora/admin/shard-traffic`
|
|
445
|
-
* endpoint, mirroring `@lunora/runtime`'s `ShardTrafficEntry`. `requests` is the
|
|
446
|
-
* shard's lifetime dispatch count (`0` for a shard that failed/timed out);
|
|
447
|
-
* `shardKey` is the DO id name (`""` for the root shard). The cross-shard feed
|
|
448
|
-
* the `hot_shard` runtime advisor consumes to compute skew.
|
|
449
|
-
*/
|
|
464
|
+
* One shard's request total from the worker's `POST /_lunora/admin/shard-traffic`
|
|
465
|
+
* endpoint, mirroring `@lunora/runtime`'s `ShardTrafficEntry`. `requests` is the
|
|
466
|
+
* shard's lifetime dispatch count (`0` for a shard that failed/timed out);
|
|
467
|
+
* `shardKey` is the DO id name (`""` for the root shard). The cross-shard feed
|
|
468
|
+
* the `hot_shard` runtime advisor consumes to compute skew.
|
|
469
|
+
*/
|
|
450
470
|
interface ShardTrafficEntry {
|
|
451
471
|
requests: number;
|
|
452
472
|
shardKey: string;
|
|
453
473
|
}
|
|
454
474
|
/**
|
|
455
|
-
* Payload of a `POST /_lunora/admin/shard-traffic` call, mirroring the runtime
|
|
456
|
-
* coordinator's shard-traffic fan-out result: one `{ shardKey, requests }` entry
|
|
457
|
-
* per live shard plus the ok / failed counts. Fanned out on demand (not on the
|
|
458
|
-
* metrics hot path) so the panel can feed `hot_shard` the whole shard set's
|
|
459
|
-
* request volumes.
|
|
460
|
-
*/
|
|
475
|
+
* Payload of a `POST /_lunora/admin/shard-traffic` call, mirroring the runtime
|
|
476
|
+
* coordinator's shard-traffic fan-out result: one `{ shardKey, requests }` entry
|
|
477
|
+
* per live shard plus the ok / failed counts. Fanned out on demand (not on the
|
|
478
|
+
* metrics hot path) so the panel can feed `hot_shard` the whole shard set's
|
|
479
|
+
* request volumes.
|
|
480
|
+
*/
|
|
461
481
|
interface ShardTrafficResult {
|
|
462
482
|
failed: number;
|
|
463
483
|
ok: number;
|
|
@@ -466,25 +486,25 @@ interface ShardTrafficResult {
|
|
|
466
486
|
/** Visual + ordering weight of a detected issue. */
|
|
467
487
|
type InsightSeverity = "error" | "info" | "warning";
|
|
468
488
|
/**
|
|
469
|
-
* Which heuristic fired. The panel maps each kind to a localized title/detail,
|
|
470
|
-
* so the detection stays free of presentation strings (and trivially testable).
|
|
471
|
-
*
|
|
472
|
-
* `missing-index` is the causal upgrade of `slow-function`: a slow function
|
|
473
|
-
* whose latency is explained by a full-table scan. When the scan attribution
|
|
474
|
-
* pins the cause, the insight names the scanned table(s) (`tables`) and deep-
|
|
475
|
-
* links to the Schema/Indexes tab to add the index, rather than leaving the
|
|
476
|
-
* slowness an unattributed symptom.
|
|
477
|
-
*/
|
|
489
|
+
* Which heuristic fired. The panel maps each kind to a localized title/detail,
|
|
490
|
+
* so the detection stays free of presentation strings (and trivially testable).
|
|
491
|
+
*
|
|
492
|
+
* `missing-index` is the causal upgrade of `slow-function`: a slow function
|
|
493
|
+
* whose latency is explained by a full-table scan. When the scan attribution
|
|
494
|
+
* pins the cause, the insight names the scanned table(s) (`tables`) and deep-
|
|
495
|
+
* links to the Schema/Indexes tab to add the index, rather than leaving the
|
|
496
|
+
* slowness an unattributed symptom.
|
|
497
|
+
*/
|
|
478
498
|
type InsightKind = "high-error-rate" | "high-evictions" | "high-write-contention" | "low-cache-hit-rate" | "missing-index" | "slow-function";
|
|
479
499
|
/**
|
|
480
|
-
* One detected issue. `value` is the headline number whose meaning depends on
|
|
481
|
-
* `kind`: a 0–1 rate for cache-hit / error-rate, a millisecond figure for
|
|
482
|
-
* slow-function / missing-index, an entry count for evictions. `fn` is set only
|
|
483
|
-
* for per-function insights; `message` carries the last error for
|
|
484
|
-
* high-error-rate; `tables` carries the full-scanned tables (busiest first) for
|
|
485
|
-
* the causal `missing-index` kind. For `high-write-contention` it is the OCC
|
|
486
|
-
* conflict ratio (conflicts / calls).
|
|
487
|
-
*/
|
|
500
|
+
* One detected issue. `value` is the headline number whose meaning depends on
|
|
501
|
+
* `kind`: a 0–1 rate for cache-hit / error-rate, a millisecond figure for
|
|
502
|
+
* slow-function / missing-index, an entry count for evictions. `fn` is set only
|
|
503
|
+
* for per-function insights; `message` carries the last error for
|
|
504
|
+
* high-error-rate; `tables` carries the full-scanned tables (busiest first) for
|
|
505
|
+
* the causal `missing-index` kind. For `high-write-contention` it is the OCC
|
|
506
|
+
* conflict ratio (conflicts / calls).
|
|
507
|
+
*/
|
|
488
508
|
interface Insight {
|
|
489
509
|
fn?: string;
|
|
490
510
|
kind: InsightKind;
|
|
@@ -512,181 +532,165 @@ interface InsightThresholds {
|
|
|
512
532
|
}
|
|
513
533
|
declare const DEFAULT_INSIGHT_THRESHOLDS: InsightThresholds;
|
|
514
534
|
/**
|
|
515
|
-
* Derive a prioritised list of issues from the two snapshots the studio
|
|
516
|
-
* already pulls — the `getMetrics` health snapshot and the `getFunctionStats`
|
|
517
|
-
* per-function table. Pure and side-effect-free: same inputs, same output, so
|
|
518
|
-
* the heuristics can be unit-tested without rendering.
|
|
519
|
-
*
|
|
520
|
-
* Heuristics: low-cache-hit-rate (cache below the threshold once enough samples
|
|
521
|
-
* exist — a cold cache isn't a problem); high-evictions (more evictions than
|
|
522
|
-
* hits, so the cache is too small or churning on invalidation); missing-index (a
|
|
523
|
-
* slow function whose latency is *explained* by a full-table scan — the causal
|
|
524
|
-
* upgrade of slow-function, naming the scanned table(s)); slow-function (a
|
|
525
|
-
* function whose slowest call crosses the threshold with no scan attribution to
|
|
526
|
-
* blame); high-error-rate (a function failing over a meaningful count);
|
|
527
|
-
* high-write-contention (a function whose OCC write conflicts make up a
|
|
528
|
-
* meaningful share of calls — a sharding candidate).
|
|
529
|
-
*
|
|
530
|
-
* A slow function with full-scan attribution emits `missing-index` (causal, with
|
|
531
|
-
* `tables`) instead of the bare `slow-function`, so the panel can link straight
|
|
532
|
-
* to the fix rather than restating the symptom.
|
|
533
|
-
*/
|
|
535
|
+
* Derive a prioritised list of issues from the two snapshots the studio
|
|
536
|
+
* already pulls — the `getMetrics` health snapshot and the `getFunctionStats`
|
|
537
|
+
* per-function table. Pure and side-effect-free: same inputs, same output, so
|
|
538
|
+
* the heuristics can be unit-tested without rendering.
|
|
539
|
+
*
|
|
540
|
+
* Heuristics: low-cache-hit-rate (cache below the threshold once enough samples
|
|
541
|
+
* exist — a cold cache isn't a problem); high-evictions (more evictions than
|
|
542
|
+
* hits, so the cache is too small or churning on invalidation); missing-index (a
|
|
543
|
+
* slow function whose latency is *explained* by a full-table scan — the causal
|
|
544
|
+
* upgrade of slow-function, naming the scanned table(s)); slow-function (a
|
|
545
|
+
* function whose slowest call crosses the threshold with no scan attribution to
|
|
546
|
+
* blame); high-error-rate (a function failing over a meaningful count);
|
|
547
|
+
* high-write-contention (a function whose OCC write conflicts make up a
|
|
548
|
+
* meaningful share of calls — a sharding candidate).
|
|
549
|
+
*
|
|
550
|
+
* A slow function with full-scan attribution emits `missing-index` (causal, with
|
|
551
|
+
* `tables`) instead of the bare `slow-function`, so the panel can link straight
|
|
552
|
+
* to the fix rather than restating the symptom.
|
|
553
|
+
*/
|
|
534
554
|
declare const deriveInsights: (metrics: ShardMetrics | null, functions: FunctionCallStat[] | null, thresholds?: InsightThresholds) => Insight[];
|
|
535
555
|
interface InsightsPanelProps {
|
|
536
556
|
/** Shard key the snapshots target on first load. Defaults to the root shard. */
|
|
537
557
|
readonly initialShardKey?: string;
|
|
538
558
|
/**
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
559
|
+
* Fan the cross-shard traffic feed out for `table`, returning each shard's
|
|
560
|
+
* `{ shardKey, requests }` total — the input the `hot_shard` advisor lint
|
|
561
|
+
* needs. Defaults to `client.shardTraffic(table)` (the admin-gated
|
|
562
|
+
* `POST /_lunora/admin/shard-traffic` fan-out). Best-effort: a rejection
|
|
563
|
+
* leaves `hot_shard` dormant rather than blanking the panel. Injectable so
|
|
564
|
+
* tests can drive the skew without a worker.
|
|
565
|
+
*/
|
|
546
566
|
readonly loadShardTraffic?: (table: string) => Promise<ShardTrafficResult>;
|
|
547
567
|
}
|
|
548
568
|
/**
|
|
549
|
-
* The Performance Advisor — a 1-to-1 of Supabase's Performance Advisor: severity
|
|
550
|
-
* tabs over a findings table (via {@link AdvisorView}). It pulls the `getMetrics`
|
|
551
|
-
* health snapshot and `getFunctionStats` per-function table for one shard, then
|
|
552
|
-
* maps the issues {@link deriveInsights} detects (low cache hit rate, high
|
|
553
|
-
* eviction, slow functions, missing indexes, error spikes) into rows. A
|
|
554
|
-
* `missing-index` row carries an inline "add the index" jump to the Schema tab.
|
|
555
|
-
* Both reads are best-effort — one failing still yields the other's insights.
|
|
556
|
-
*/
|
|
557
|
-
declare const InsightsPanel: ({
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
*
|
|
563
|
-
*
|
|
564
|
-
*
|
|
565
|
-
*
|
|
566
|
-
|
|
567
|
-
* row. These are signals only lunora can surface: Cloudflare's dashboard can't
|
|
568
|
-
* reason about lunora's admin/WS gates or its log-redaction policy.
|
|
569
|
-
*/
|
|
569
|
+
* The Performance Advisor — a 1-to-1 of Supabase's Performance Advisor: severity
|
|
570
|
+
* tabs over a findings table (via {@link AdvisorView}). It pulls the `getMetrics`
|
|
571
|
+
* health snapshot and `getFunctionStats` per-function table for one shard, then
|
|
572
|
+
* maps the issues {@link deriveInsights} detects (low cache hit rate, high
|
|
573
|
+
* eviction, slow functions, missing indexes, error spikes) into rows. A
|
|
574
|
+
* `missing-index` row carries an inline "add the index" jump to the Schema tab.
|
|
575
|
+
* Both reads are best-effort — one failing still yields the other's insights.
|
|
576
|
+
*/
|
|
577
|
+
declare const InsightsPanel: ({ initialShardKey, loadShardTraffic }: InsightsPanelProps) => ReactElement;
|
|
578
|
+
/**
|
|
579
|
+
* The Security Advisor — a 1-to-1 of Supabase's Security Advisor: severity tabs
|
|
580
|
+
* (Errors / Warnings / Info) over a findings table. It pulls `getSecurityAudit`
|
|
581
|
+
* (deployment-wide, so it targets the root shard and needs no shard selector) and
|
|
582
|
+
* maps each finding the server derived from the Worker `env` — weak admin token,
|
|
583
|
+
* an open WebSocket gate, a dev-mode request log keeping un-redacted args — into a
|
|
584
|
+
* row. These are signals only lunora can surface: Cloudflare's dashboard can't
|
|
585
|
+
* reason about lunora's admin/WS gates or its log-redaction policy.
|
|
586
|
+
*/
|
|
570
587
|
declare const SecurityAdvisorPanel: () => ReactElement;
|
|
571
588
|
interface ApiDocsPanelProps {
|
|
572
589
|
/**
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
590
|
+
* Registered functions to document. Mirrors the list the Functions tab's
|
|
591
|
+
* runner and stats panels receive — a query/mutation/action's `kind` is
|
|
592
|
+
* compile-time-only, so it must be named here. When omitted the panel still
|
|
593
|
+
* renders (tables come from the admin RPC) and shows an empty functions list.
|
|
594
|
+
*/
|
|
578
595
|
readonly functions?: FunctionDescriptor[];
|
|
579
596
|
/** Shard key the table list is read from. Defaults to the root shard. */
|
|
580
597
|
readonly initialShardKey?: string;
|
|
581
598
|
}
|
|
582
|
-
/**
|
|
583
|
-
|
|
584
|
-
*
|
|
585
|
-
*
|
|
586
|
-
*
|
|
587
|
-
*
|
|
588
|
-
*
|
|
589
|
-
*
|
|
590
|
-
*
|
|
591
|
-
*
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
declare const ApiDocsPanel: ({
|
|
595
|
-
functions,
|
|
596
|
-
initialShardKey
|
|
597
|
-
}: ApiDocsPanelProps) => ReactElement;
|
|
599
|
+
/**
|
|
600
|
+
* Per-resource "how to call this from your app" browser, generated from the
|
|
601
|
+
* registered functions and tables the studio already has — no new endpoints.
|
|
602
|
+
* The left rail lists functions grouped by file plus a Tables section; the right
|
|
603
|
+
* pane shows copy-paste snippets (React / Client / CLI for functions; the typed
|
|
604
|
+
* data-model usage for tables).
|
|
605
|
+
*
|
|
606
|
+
* Args are a placeholder: the real argument shape lives in the codegen'd `api`
|
|
607
|
+
* types this browser never loads, the same way Supabase's usage snippets show
|
|
608
|
+
* placeholders.
|
|
609
|
+
*/
|
|
610
|
+
declare const ApiDocsPanel: ({ functions, initialShardKey }: ApiDocsPanelProps) => ReactElement;
|
|
598
611
|
interface ApiReferencePanelProps {
|
|
599
612
|
/**
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
613
|
+
* Inline OpenAPI document. When supplied the panel renders it directly and
|
|
614
|
+
* skips the fetch — used by the mock harness and by hosts that already hold
|
|
615
|
+
* the generated spec. When omitted the panel fetches the worker's
|
|
616
|
+
* admin-gated `GET /_lunora/admin/openapi` endpoint via the client.
|
|
617
|
+
*/
|
|
605
618
|
readonly spec?: unknown;
|
|
606
619
|
}
|
|
607
620
|
/**
|
|
608
|
-
* In-studio OpenAPI reference: renders the generated OpenAPI 3.1 document with
|
|
609
|
-
* the studio-native {@link ReferenceView} — a tag-grouped operation browser,
|
|
610
|
-
* schema tables, a live "try it" console, and copy-paste request samples, all
|
|
611
|
-
* themed to the studio. The spec comes from an inline
|
|
612
|
-
* {@link ApiReferencePanelProps.spec} prop, or — by default — the worker's
|
|
613
|
-
* admin-gated `GET /_lunora/admin/openapi` endpoint fetched through the client.
|
|
614
|
-
*
|
|
615
|
-
* This replaced the embedded Scalar reference (a Vue app in React): Scalar's
|
|
616
|
-
* portal/overlay layers repeatedly intercepted clicks and froze the tab, and it
|
|
617
|
-
* shipped a multi-megabyte bundle. The native view is overlay-free and reuses
|
|
618
|
-
* the studio's own primitives.
|
|
619
|
-
*/
|
|
620
|
-
declare const ApiReferencePanel: ({
|
|
621
|
-
spec: inlineSpec
|
|
622
|
-
}: ApiReferencePanelProps) => ReactElement;
|
|
621
|
+
* In-studio OpenAPI reference: renders the generated OpenAPI 3.1 document with
|
|
622
|
+
* the studio-native {@link ReferenceView} — a tag-grouped operation browser,
|
|
623
|
+
* schema tables, a live "try it" console, and copy-paste request samples, all
|
|
624
|
+
* themed to the studio. The spec comes from an inline
|
|
625
|
+
* {@link ApiReferencePanelProps.spec} prop, or — by default — the worker's
|
|
626
|
+
* admin-gated `GET /_lunora/admin/openapi` endpoint fetched through the client.
|
|
627
|
+
*
|
|
628
|
+
* This replaced the embedded Scalar reference (a Vue app in React): Scalar's
|
|
629
|
+
* portal/overlay layers repeatedly intercepted clicks and froze the tab, and it
|
|
630
|
+
* shipped a multi-megabyte bundle. The native view is overlay-free and reuses
|
|
631
|
+
* the studio's own primitives.
|
|
632
|
+
*/
|
|
633
|
+
declare const ApiReferencePanel: ({ spec: inlineSpec }: ApiReferencePanelProps) => ReactElement;
|
|
623
634
|
interface ApiTabProps {
|
|
624
635
|
/** Registered functions documented by the snippets sub-view. Threaded host → studio. */
|
|
625
636
|
readonly functions?: FunctionDescriptor[];
|
|
626
637
|
/** Shard key the snippets view reads its table list from. */
|
|
627
638
|
readonly initialShardKey?: string;
|
|
628
639
|
/**
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
640
|
+
* Inline OpenAPI document for the reference sub-view. When omitted the
|
|
641
|
+
* reference fetches the worker's `GET /_lunora/admin/openapi` endpoint.
|
|
642
|
+
*/
|
|
632
643
|
readonly openApiSpec?: unknown;
|
|
633
644
|
/**
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
645
|
+
* Inline OpenRPC document for the reference sub-view's OpenRPC format. When
|
|
646
|
+
* omitted the OpenRPC view fetches the worker's `GET /_lunora/admin/openrpc`
|
|
647
|
+
* endpoint. OpenRPC is the RPC-native spec (RPC functions only); OpenAPI
|
|
648
|
+
* additionally covers `httpRouter()` REST routes.
|
|
649
|
+
*/
|
|
639
650
|
readonly openRpcSpec?: unknown;
|
|
640
651
|
}
|
|
641
652
|
/**
|
|
642
|
-
* The studio's API tab. Hosts two complementary surfaces behind a segmented
|
|
643
|
-
* toggle. The Reference view renders a machine-readable spec — the OpenAPI 3.1
|
|
644
|
-
* document or the RPC-native OpenRPC document — through the studio-native
|
|
645
|
-
* reference UI (operation browser, schema tables, a live "try it" console, and a
|
|
646
|
-
* request-sample rail), with a small format switch between them. The Snippets
|
|
647
|
-
* view is the per-function React / Client / CLI copy-paste browser
|
|
648
|
-
* (`api-docs-panel`), the lightweight "how do I call this" DX.
|
|
649
|
-
*
|
|
650
|
-
* Reference is the default; OpenAPI is the default format (the richer,
|
|
651
|
-
* spec-driven view that also covers REST). Each format degrades to a clear
|
|
652
|
-
* empty state when its spec isn't wired.
|
|
653
|
-
*/
|
|
654
|
-
declare const ApiTab: ({
|
|
655
|
-
functions,
|
|
656
|
-
initialShardKey,
|
|
657
|
-
openApiSpec,
|
|
658
|
-
openRpcSpec
|
|
659
|
-
}: ApiTabProps) => ReactElement;
|
|
653
|
+
* The studio's API tab. Hosts two complementary surfaces behind a segmented
|
|
654
|
+
* toggle. The Reference view renders a machine-readable spec — the OpenAPI 3.1
|
|
655
|
+
* document or the RPC-native OpenRPC document — through the studio-native
|
|
656
|
+
* reference UI (operation browser, schema tables, a live "try it" console, and a
|
|
657
|
+
* request-sample rail), with a small format switch between them. The Snippets
|
|
658
|
+
* view is the per-function React / Client / CLI copy-paste browser
|
|
659
|
+
* (`api-docs-panel`), the lightweight "how do I call this" DX.
|
|
660
|
+
*
|
|
661
|
+
* Reference is the default; OpenAPI is the default format (the richer,
|
|
662
|
+
* spec-driven view that also covers REST). Each format degrades to a clear
|
|
663
|
+
* empty state when its spec isn't wired.
|
|
664
|
+
*/
|
|
665
|
+
declare const ApiTab: ({ functions, initialShardKey, openApiSpec, openRpcSpec }: ApiTabProps) => ReactElement;
|
|
660
666
|
interface OpenRpcReferencePanelProps {
|
|
661
667
|
/**
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
668
|
+
* Inline OpenRPC document. When supplied the panel renders it directly and
|
|
669
|
+
* skips the fetch — used by the mock harness and by hosts that already hold
|
|
670
|
+
* the generated spec. When omitted the panel fetches the worker's
|
|
671
|
+
* admin-gated `GET /_lunora/admin/openrpc` endpoint via the client.
|
|
672
|
+
*/
|
|
667
673
|
readonly spec?: unknown;
|
|
668
674
|
}
|
|
669
675
|
/**
|
|
670
|
-
* In-studio OpenRPC reference. OpenRPC is the RPC-native spec (a `methods` array
|
|
671
|
-
* over the JSON-RPC-shaped `POST /_lunora/rpc` transport), documenting the RPC
|
|
672
|
-
* functions only. It is parsed into the shared `ApiModel` and rendered by the
|
|
673
|
-
* same studio-native {@link ReferenceView} the OpenAPI panel uses, so both
|
|
674
|
-
* formats share one operation browser, schema view, try-it console, and sample
|
|
675
|
-
* rail.
|
|
676
|
-
*
|
|
677
|
-
* The spec comes from an inline {@link OpenRpcReferencePanelProps.spec} prop, or
|
|
678
|
-
* — by default — the worker's admin-gated `GET /_lunora/admin/openrpc` endpoint.
|
|
679
|
-
*/
|
|
680
|
-
declare const OpenRpcReferencePanel: ({
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
*
|
|
685
|
-
*
|
|
686
|
-
*
|
|
687
|
-
|
|
688
|
-
* optional so a partial/legacy URL still hydrates into a sensible default view.
|
|
689
|
-
*/
|
|
676
|
+
* In-studio OpenRPC reference. OpenRPC is the RPC-native spec (a `methods` array
|
|
677
|
+
* over the JSON-RPC-shaped `POST /_lunora/rpc` transport), documenting the RPC
|
|
678
|
+
* functions only. It is parsed into the shared `ApiModel` and rendered by the
|
|
679
|
+
* same studio-native {@link ReferenceView} the OpenAPI panel uses, so both
|
|
680
|
+
* formats share one operation browser, schema view, try-it console, and sample
|
|
681
|
+
* rail.
|
|
682
|
+
*
|
|
683
|
+
* The spec comes from an inline {@link OpenRpcReferencePanelProps.spec} prop, or
|
|
684
|
+
* — by default — the worker's admin-gated `GET /_lunora/admin/openrpc` endpoint.
|
|
685
|
+
*/
|
|
686
|
+
declare const OpenRpcReferencePanel: ({ spec: inlineSpec }: OpenRpcReferencePanelProps) => ReactElement;
|
|
687
|
+
/**
|
|
688
|
+
* A shareable data-browser view: the table, storage tier, shard, structured
|
|
689
|
+
* filters, substring search, and sort that together reproduce exactly what the
|
|
690
|
+
* grid is showing. This is the unit that is serialized into the URL (so the link
|
|
691
|
+
* IS the query) and persisted by name in {@link loadSavedQueries}. Every field is
|
|
692
|
+
* optional so a partial/legacy URL still hydrates into a sensible default view.
|
|
693
|
+
*/
|
|
690
694
|
interface DataView {
|
|
691
695
|
/** Structured `column operator value` clauses, AND-combined with the search. */
|
|
692
696
|
filters?: FilterClause[];
|
|
@@ -709,20 +713,19 @@ interface SavedQuery {
|
|
|
709
713
|
name: string;
|
|
710
714
|
view: DataView;
|
|
711
715
|
}
|
|
712
|
-
/** Saved queries, most-recently-saved first. Empty when storage is unavailable or empty. */
|
|
713
716
|
interface DataBrowserProps {
|
|
714
717
|
/**
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
718
|
+
* Allow editing: surfaces insert/edit/delete actions that issue
|
|
719
|
+
* `__lunora_admin__:writeRow` ops through the schema-aware writer. Off by
|
|
720
|
+
* default — the browser is read-only unless the host opts in.
|
|
721
|
+
*/
|
|
719
722
|
readonly editable?: boolean;
|
|
720
723
|
/**
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
724
|
+
* Names of the `.global()` (D1-backed) tables. A `v.id` ref cell whose target
|
|
725
|
+
* is one of these is followed cross-tier via `onNavigateToGlobal` instead of
|
|
726
|
+
* being read from this shard (where it doesn't exist). Supplied by the Table
|
|
727
|
+
* editor; defaults to none when the browser is used standalone.
|
|
728
|
+
*/
|
|
726
729
|
readonly globalTableNames?: ReadonlySet<string>;
|
|
727
730
|
/** Structured filters to hydrate from a shared link / saved query. */
|
|
728
731
|
readonly initialFilters?: FilterClause[];
|
|
@@ -733,30 +736,33 @@ interface DataBrowserProps {
|
|
|
733
736
|
/** Shard key the browser targets on first load. Defaults to the root shard. */
|
|
734
737
|
readonly initialShardKey?: string;
|
|
735
738
|
/**
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
739
|
+
* Follow a `v.id` ref whose target is a global table — the Table editor switches
|
|
740
|
+
* to the global tier and opens that table. When omitted (standalone use), a ref
|
|
741
|
+
* to a global table falls through to the in-shard read (and surfaces its error).
|
|
742
|
+
*/
|
|
740
743
|
readonly onNavigateToGlobal?: (table: string, id: string) => void;
|
|
741
744
|
/**
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
745
|
+
* Navigate the URL to a table (the Table editor pushes `?table=…`), opening it
|
|
746
|
+
* clean; `options.search` pre-fills the search for an FK-cell traversal.
|
|
747
|
+
* Omitted in standalone use.
|
|
748
|
+
*/
|
|
749
|
+
readonly onSelectTable?: (table: string, options?: {
|
|
750
|
+
search?: string;
|
|
751
|
+
}) => void;
|
|
746
752
|
/**
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
753
|
+
* Called whenever the loaded view (shard / search / filters / sort) changes, so
|
|
754
|
+
* the host can mirror it to the URL — making every view a shareable link.
|
|
755
|
+
* Omitted in standalone use (view state stays in-component).
|
|
756
|
+
*/
|
|
751
757
|
readonly onViewChange?: (view: Pick<DataView, "filters" | "orderBy" | "search" | "shard">) => void;
|
|
752
758
|
/** Rows requested per page. Clamped server-side to `[1, 500]`. */
|
|
753
759
|
readonly pageSize?: number;
|
|
754
760
|
/**
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
761
|
+
* The canned-query toolbar's handlers + saved list. Supplied by the Table editor
|
|
762
|
+
* (it owns the router and the `saved-queries` localStorage helper); omitted in
|
|
763
|
+
* standalone use, which hides the toolbar entirely. `onSaveQuery` receives the
|
|
764
|
+
* name plus the current view to persist.
|
|
765
|
+
*/
|
|
760
766
|
readonly queryBar?: {
|
|
761
767
|
readonly onApplyQuery: (query: SavedQuery) => void;
|
|
762
768
|
readonly onCopyLink: () => void;
|
|
@@ -765,50 +771,36 @@ interface DataBrowserProps {
|
|
|
765
771
|
readonly saved: ReadonlyArray<SavedQuery>;
|
|
766
772
|
};
|
|
767
773
|
/**
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
774
|
+
* The schema/source selector rendered at the top of the table-list sidebar —
|
|
775
|
+
* the Table editor's `schema public ▾` switch. Supplied when this browser is
|
|
776
|
+
* composed into the Table editor; omitted when it's used alone.
|
|
777
|
+
*/
|
|
772
778
|
readonly schemaSwitch?: ReactNode;
|
|
773
779
|
/**
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
780
|
+
* The table named in the URL. Drives the selection — a deep link or browser
|
|
781
|
+
* back/forward to a different `?table=…` re-opens that table. Supplied by the
|
|
782
|
+
* Table editor; omitted in standalone use (selection stays purely in-component).
|
|
783
|
+
*/
|
|
778
784
|
readonly tableParam?: string;
|
|
779
785
|
}
|
|
780
786
|
/**
|
|
781
|
-
* Read-only data browser for a single shard's SQLite database. Lists the user
|
|
782
|
-
* tables (via the `__lunora_admin__:listTables` RPC), then pages through the
|
|
783
|
-
* rows of whichever table is selected (`__lunora_admin__:readTablePage`).
|
|
784
|
-
*
|
|
785
|
-
* Both calls travel over the ordinary `useLunora` client transport; the
|
|
786
|
-
* admin RPCs are intercepted inside the Durable Object and are gated by the
|
|
787
|
-
* server's `LUNORA_ADMIN_TOKEN`. The host is responsible for configuring the
|
|
788
|
-
* client's auth token — this component issues no credentials of its own.
|
|
789
|
-
*
|
|
790
|
-
* The table view is built on a headless `@tanstack/react-table` model: column
|
|
791
|
-
* defs derive from `page.columns`, sorting and (global) filtering run
|
|
792
|
-
* page-locally over the loaded rows, and the rendered rows are virtualized with
|
|
793
|
-
* `@tanstack/react-virtual` so a large page never inflates the DOM. None of this
|
|
794
|
-
* touches the server — pagination still flows through `readTablePage`. All of
|
|
795
|
-
* that state lives in {@link useDataBrowser}; this component is just the markup.
|
|
796
|
-
*/
|
|
797
|
-
declare const DataBrowser: ({
|
|
798
|
-
editable,
|
|
799
|
-
globalTableNames,
|
|
800
|
-
initialFilters,
|
|
801
|
-
initialOrderBy,
|
|
802
|
-
initialSearch,
|
|
803
|
-
initialShardKey,
|
|
804
|
-
onNavigateToGlobal,
|
|
805
|
-
onSelectTable,
|
|
806
|
-
onViewChange,
|
|
807
|
-
pageSize: initialPageSize,
|
|
808
|
-
queryBar,
|
|
809
|
-
schemaSwitch,
|
|
810
|
-
tableParam
|
|
811
|
-
}: DataBrowserProps) => ReactElement;
|
|
787
|
+
* Read-only data browser for a single shard's SQLite database. Lists the user
|
|
788
|
+
* tables (via the `__lunora_admin__:listTables` RPC), then pages through the
|
|
789
|
+
* rows of whichever table is selected (`__lunora_admin__:readTablePage`).
|
|
790
|
+
*
|
|
791
|
+
* Both calls travel over the ordinary `useLunora` client transport; the
|
|
792
|
+
* admin RPCs are intercepted inside the Durable Object and are gated by the
|
|
793
|
+
* server's `LUNORA_ADMIN_TOKEN`. The host is responsible for configuring the
|
|
794
|
+
* client's auth token — this component issues no credentials of its own.
|
|
795
|
+
*
|
|
796
|
+
* The table view is built on a headless `@tanstack/react-table` model: column
|
|
797
|
+
* defs derive from `page.columns`, sorting and (global) filtering run
|
|
798
|
+
* page-locally over the loaded rows, and the rendered rows are virtualized with
|
|
799
|
+
* `@tanstack/react-virtual` so a large page never inflates the DOM. None of this
|
|
800
|
+
* touches the server — pagination still flows through `readTablePage`. All of
|
|
801
|
+
* that state lives in {@link useDataBrowser}; this component is just the markup.
|
|
802
|
+
*/
|
|
803
|
+
declare const DataBrowser: ({ editable, globalTableNames, initialFilters, initialOrderBy, initialSearch, initialShardKey, onNavigateToGlobal, onSelectTable, onViewChange, pageSize: initialPageSize, queryBar, schemaSwitch, tableParam }: DataBrowserProps) => ReactElement;
|
|
812
804
|
/** A filter row as edited in the UI — the value is always a string until coerced for the wire. */
|
|
813
805
|
interface EditableFilter {
|
|
814
806
|
column: string;
|
|
@@ -816,26 +808,22 @@ interface EditableFilter {
|
|
|
816
808
|
value: string;
|
|
817
809
|
}
|
|
818
810
|
/**
|
|
819
|
-
* Convert the UI's string-valued filter rows into wire {@link FilterClause}s:
|
|
820
|
-
* drops rows with no column, and coerces a numeric string to a number for
|
|
821
|
-
* comparison
|
|
822
|
-
* `
|
|
823
|
-
|
|
811
|
+
* Convert the UI's string-valued filter rows into wire {@link FilterClause}s:
|
|
812
|
+
* drops rows with no column, and coerces a canonical numeric string to a number for
|
|
813
|
+
* every comparison operator (so `age > 18` compares numerically, not lexically, and
|
|
814
|
+
* an `eq` on a numeric column still matches — see {@link coerceFilterValue} for why a
|
|
815
|
+
* numeric-looking but non-canonical string like a zip code stays text). `contains`
|
|
816
|
+
* always stays a string.
|
|
817
|
+
*/
|
|
824
818
|
declare const toFilterClauses: (filters: ReadonlyArray<EditableFilter>) => FilterClause[];
|
|
825
819
|
/**
|
|
826
|
-
* The data browser's filtering controls: the substring search box plus a stack
|
|
827
|
-
* of structured `column operator value` rows. All state is owned by the parent
|
|
828
|
-
* (the data-browser model); this is the control markup, emitting the full
|
|
829
|
-
* filter array up on every edit. Raw strings (no i18n) to match the surrounding
|
|
830
|
-
* data-browser controls.
|
|
831
|
-
*/
|
|
832
|
-
declare const DataFilters: ({
|
|
833
|
-
columns,
|
|
834
|
-
filters,
|
|
835
|
-
onFiltersChange,
|
|
836
|
-
onSearchChange,
|
|
837
|
-
search
|
|
838
|
-
}: {
|
|
820
|
+
* The data browser's filtering controls: the substring search box plus a stack
|
|
821
|
+
* of structured `column operator value` rows. All state is owned by the parent
|
|
822
|
+
* (the data-browser model); this is the control markup, emitting the full
|
|
823
|
+
* filter array up on every edit. Raw strings (no i18n) to match the surrounding
|
|
824
|
+
* data-browser controls.
|
|
825
|
+
*/
|
|
826
|
+
declare const DataFilters: ({ columns, filters, onFiltersChange, onSearchChange, search }: {
|
|
839
827
|
columns: ReadonlyArray<string>;
|
|
840
828
|
filters: ReadonlyArray<EditableFilter>;
|
|
841
829
|
onFiltersChange: (filters: EditableFilter[]) => void;
|
|
@@ -844,156 +832,139 @@ declare const DataFilters: ({
|
|
|
844
832
|
}) => ReactElement;
|
|
845
833
|
interface GlobalDataBrowserProps {
|
|
846
834
|
/**
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
835
|
+
* Table to open automatically on mount (and whenever it changes). Used by the
|
|
836
|
+
* Table editor when a `v.id` reference in a shard row points at a `.global()`
|
|
837
|
+
* table: clicking it switches to the global tier and lands here with that table
|
|
838
|
+
* pre-selected. Each distinct value is applied once, so the operator can still
|
|
839
|
+
* navigate away afterwards.
|
|
840
|
+
*/
|
|
853
841
|
readonly initialTable?: string;
|
|
854
842
|
/**
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
843
|
+
* Called whenever the open table changes, so the host can mirror it to the URL
|
|
844
|
+
* (the Table editor pushes `?table=…`). Omitted in standalone use.
|
|
845
|
+
*/
|
|
858
846
|
readonly onSelectTable?: (table: string) => void;
|
|
859
847
|
/** Rows requested per page. Clamped server-side to `[1, 500]`. */
|
|
860
848
|
readonly pageSize?: number;
|
|
861
849
|
/**
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
850
|
+
* The schema/source selector rendered at the top of the table-list sidebar —
|
|
851
|
+
* the Table editor's `schema public ▾` switch. Supplied when this browser is
|
|
852
|
+
* composed into the Table editor; omitted when it's used alone.
|
|
853
|
+
*/
|
|
866
854
|
readonly schemaSwitch?: ReactNode;
|
|
867
855
|
}
|
|
868
856
|
/**
|
|
869
|
-
* Read-only browser for `.global()` (D1-backed) tables. Twin of `DataBrowser`,
|
|
870
|
-
* but not shard-scoped: it lists tables via `listGlobalTables()` and pages rows
|
|
871
|
-
* via `readGlobalTablePage()`. Laid out like Supabase's Table Editor — a left
|
|
872
|
-
* table sidebar + a bordered grid with a paginated footer — and gated by the
|
|
873
|
-
* server's `LUNORA_ADMIN_TOKEN`.
|
|
874
|
-
*/
|
|
875
|
-
declare const GlobalDataBrowser: ({
|
|
876
|
-
initialTable,
|
|
877
|
-
onSelectTable,
|
|
878
|
-
pageSize: initialPageSize,
|
|
879
|
-
schemaSwitch
|
|
880
|
-
}?: GlobalDataBrowserProps) => ReactElement;
|
|
857
|
+
* Read-only browser for `.global()` (D1-backed) tables. Twin of `DataBrowser`,
|
|
858
|
+
* but not shard-scoped: it lists tables via `listGlobalTables()` and pages rows
|
|
859
|
+
* via `readGlobalTablePage()`. Laid out like Supabase's Table Editor — a left
|
|
860
|
+
* table sidebar + a bordered grid with a paginated footer — and gated by the
|
|
861
|
+
* server's `LUNORA_ADMIN_TOKEN`.
|
|
862
|
+
*/
|
|
863
|
+
declare const GlobalDataBrowser: ({ initialTable, onSelectTable, pageSize: initialPageSize, schemaSwitch }?: GlobalDataBrowserProps) => ReactElement;
|
|
881
864
|
interface TableEditorProps {
|
|
882
865
|
/**
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
866
|
+
* Allow editing the shard-local tables (insert/edit/delete). Forwarded to the
|
|
867
|
+
* shard {@link DataBrowser}; the global D1 browser is always read-only. Off by
|
|
868
|
+
* default — see {@link DataBrowser}.
|
|
869
|
+
*/
|
|
887
870
|
readonly editable?: boolean;
|
|
888
871
|
/** Shard key the shard browser targets on first load. Defaults to the root shard. */
|
|
889
872
|
readonly initialShardKey?: string;
|
|
890
873
|
}
|
|
891
874
|
/**
|
|
892
|
-
* The Table editor: browses your application's tables across both storage tiers
|
|
893
|
-
* from one section. A schema switch in the sidebar header (Supabase's
|
|
894
|
-
* `schema public ▾`) toggles between the per-shard SQLite browser
|
|
895
|
-
* (`.shardBy(...)`, editable when the host opts in) and the read-only global D1
|
|
896
|
-
* browser (`.global()`) — folding what used to be a separate "Global Tables" tab
|
|
897
|
-
* into a single editor (`STUDIO-REDESIGN-PLAN.md` §2).
|
|
898
|
-
*
|
|
899
|
-
* The active tier and open table live in the URL search params (`?schema=global`,
|
|
900
|
-
* `?table=…`) rather than component state, so every selection is a real, shareable
|
|
901
|
-
* URL and browser back/forward moves between tables and tiers. The browsers push on
|
|
902
|
-
* selection and re-open whatever the URL names.
|
|
903
|
-
*/
|
|
904
|
-
declare const TableEditor: ({
|
|
905
|
-
editable,
|
|
906
|
-
initialShardKey
|
|
907
|
-
}: TableEditorProps) => ReactElement;
|
|
875
|
+
* The Table editor: browses your application's tables across both storage tiers
|
|
876
|
+
* from one section. A schema switch in the sidebar header (Supabase's
|
|
877
|
+
* `schema public ▾`) toggles between the per-shard SQLite browser
|
|
878
|
+
* (`.shardBy(...)`, editable when the host opts in) and the read-only global D1
|
|
879
|
+
* browser (`.global()`) — folding what used to be a separate "Global Tables" tab
|
|
880
|
+
* into a single editor (`STUDIO-REDESIGN-PLAN.md` §2).
|
|
881
|
+
*
|
|
882
|
+
* The active tier and open table live in the URL search params (`?schema=global`,
|
|
883
|
+
* `?table=…`) rather than component state, so every selection is a real, shareable
|
|
884
|
+
* URL and browser back/forward moves between tables and tiers. The browsers push on
|
|
885
|
+
* selection and re-open whatever the URL names.
|
|
886
|
+
*/
|
|
887
|
+
declare const TableEditor: ({ editable, initialShardKey }: TableEditorProps) => ReactElement;
|
|
908
888
|
interface ExportImportPanelProps {
|
|
909
889
|
/** Shard key the panel targets. Defaults to the root shard. */
|
|
910
890
|
readonly initialShardKey?: string;
|
|
911
891
|
}
|
|
912
892
|
/**
|
|
913
|
-
* Snapshot and restore a single shard's data as NDJSON.
|
|
914
|
-
*
|
|
915
|
-
* "Export" reads every shard-local row via `__lunora_admin__:exportShard` and
|
|
916
|
-
* renders it as NDJSON for download/copy. "Import" parses NDJSON the operator
|
|
917
|
-
* pastes in and replays it through `__lunora_admin__:importShard`, reporting
|
|
918
|
-
* inserted counts, id conflicts and per-row errors. Globally-scoped (`.global()`)
|
|
919
|
-
* tables live in D1 and are intentionally out of scope here.
|
|
920
|
-
*
|
|
921
|
-
* Both calls travel over the {@link useLunora} client transport and are gated by
|
|
922
|
-
* the server's `LUNORA_ADMIN_TOKEN`.
|
|
923
|
-
*/
|
|
924
|
-
declare const ExportImportPanel: ({
|
|
925
|
-
initialShardKey
|
|
926
|
-
}: ExportImportPanelProps) => ReactElement;
|
|
893
|
+
* Snapshot and restore a single shard's data as NDJSON.
|
|
894
|
+
*
|
|
895
|
+
* "Export" reads every shard-local row via `__lunora_admin__:exportShard` and
|
|
896
|
+
* renders it as NDJSON for download/copy. "Import" parses NDJSON the operator
|
|
897
|
+
* pastes in and replays it through `__lunora_admin__:importShard`, reporting
|
|
898
|
+
* inserted counts, id conflicts and per-row errors. Globally-scoped (`.global()`)
|
|
899
|
+
* tables live in D1 and are intentionally out of scope here.
|
|
900
|
+
*
|
|
901
|
+
* Both calls travel over the {@link useLunora} client transport and are gated by
|
|
902
|
+
* the server's `LUNORA_ADMIN_TOKEN`.
|
|
903
|
+
*/
|
|
904
|
+
declare const ExportImportPanel: ({ initialShardKey }: ExportImportPanelProps) => ReactElement;
|
|
927
905
|
interface MigrationsPanelProps {
|
|
928
906
|
/** Shard key the panel targets. Defaults to the root shard. */
|
|
929
907
|
readonly initialShardKey?: string;
|
|
930
908
|
}
|
|
931
909
|
/**
|
|
932
|
-
* Inspect and drive data migrations on a single shard.
|
|
933
|
-
*
|
|
934
|
-
* Reads the persisted run-state via the `__lunora_admin__:migrationStatus` RPC
|
|
935
|
-
* and lets an operator kick off a migration by id (`__lunora_admin__:runMigration`)
|
|
936
|
-
* with a direction, an optional batch cap and a dry-run toggle. Both calls
|
|
937
|
-
* travel over the ordinary {@link useLunora} client transport and are gated by
|
|
938
|
-
* the server's `LUNORA_ADMIN_TOKEN` — this component issues no credentials of
|
|
939
|
-
* its own.
|
|
940
|
-
*/
|
|
941
|
-
declare const MigrationsPanel: ({
|
|
942
|
-
initialShardKey
|
|
943
|
-
}: MigrationsPanelProps) => ReactElement;
|
|
910
|
+
* Inspect and drive data migrations on a single shard.
|
|
911
|
+
*
|
|
912
|
+
* Reads the persisted run-state via the `__lunora_admin__:migrationStatus` RPC
|
|
913
|
+
* and lets an operator kick off a migration by id (`__lunora_admin__:runMigration`)
|
|
914
|
+
* with a direction, an optional batch cap and a dry-run toggle. Both calls
|
|
915
|
+
* travel over the ordinary {@link useLunora} client transport and are gated by
|
|
916
|
+
* the server's `LUNORA_ADMIN_TOKEN` — this component issues no credentials of
|
|
917
|
+
* its own.
|
|
918
|
+
*/
|
|
919
|
+
declare const MigrationsPanel: ({ initialShardKey }: MigrationsPanelProps) => ReactElement;
|
|
944
920
|
interface PitrPanelProps {
|
|
945
921
|
/** Shard key the PITR ops target. Defaults to the root shard. */
|
|
946
922
|
readonly initialShardKey?: string;
|
|
947
923
|
}
|
|
948
924
|
/**
|
|
949
|
-
* Native Durable-Object point-in-time recovery for one shard — the **Time
|
|
950
|
-
* Travel** view.
|
|
951
|
-
*
|
|
952
|
-
* Reads the shard's current bookmark, previews the bookmark nearest a chosen
|
|
953
|
-
* time, and (behind a confirm step) restores the shard to a time or an explicit
|
|
954
|
-
* bookmark via the `__lunora_admin__:pitrRestore` RPC, surfacing the returned
|
|
955
|
-
* undo bookmark so the restore can be reversed. All ops run over the
|
|
956
|
-
* {@link useLunora} client and are gated by the server's `LUNORA_ADMIN_TOKEN`.
|
|
957
|
-
*
|
|
958
|
-
* In-place recovery covers the last 30 days; for older or off-platform recovery
|
|
959
|
-
* use the snapshot tier (`lunora backup` / the backup registry item).
|
|
960
|
-
*/
|
|
961
|
-
declare const PitrPanel: ({
|
|
962
|
-
initialShardKey
|
|
963
|
-
}: PitrPanelProps) => ReactElement;
|
|
925
|
+
* Native Durable-Object point-in-time recovery for one shard — the **Time
|
|
926
|
+
* Travel** view.
|
|
927
|
+
*
|
|
928
|
+
* Reads the shard's current bookmark, previews the bookmark nearest a chosen
|
|
929
|
+
* time, and (behind a confirm step) restores the shard to a time or an explicit
|
|
930
|
+
* bookmark via the `__lunora_admin__:pitrRestore` RPC, surfacing the returned
|
|
931
|
+
* undo bookmark so the restore can be reversed. All ops run over the
|
|
932
|
+
* {@link useLunora} client and are gated by the server's `LUNORA_ADMIN_TOKEN`.
|
|
933
|
+
*
|
|
934
|
+
* In-place recovery covers the last 30 days; for older or off-platform recovery
|
|
935
|
+
* use the snapshot tier (`lunora backup` / the backup registry item).
|
|
936
|
+
*/
|
|
937
|
+
declare const PitrPanel: ({ initialShardKey }: PitrPanelProps) => ReactElement;
|
|
964
938
|
interface FunctionRunnerProps {
|
|
965
939
|
/**
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
940
|
+
* Functions to expose. When omitted, the runner auto-discovers them via the
|
|
941
|
+
* client's `listFunctions()` (the admin-gated `/_lunora/admin/functions`
|
|
942
|
+
* endpoint), so it works with no wiring when the worker is built with a
|
|
943
|
+
* `functions` registry. Supply the list to override discovery.
|
|
944
|
+
*/
|
|
971
945
|
readonly functions?: FunctionDescriptor[];
|
|
972
946
|
/**
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
947
|
+
* Expose the "Run as identity" control — execute the selected function AS a
|
|
948
|
+
* chosen authenticated user so an operator can test auth + RLS behavior.
|
|
949
|
+
* Security-sensitive: the run is forwarded over the admin-gated
|
|
950
|
+
* `__lunora_admin__:runAs` RPC, which forges the per-request identity. The
|
|
951
|
+
* host sets this only on a trusted loopback-dev gate (the `Studio` component's
|
|
952
|
+
* `runAsIdentity` prop); off by default, the runner always runs with the
|
|
953
|
+
* caller's own (admin) identity.
|
|
954
|
+
*/
|
|
981
955
|
readonly runAsIdentity?: boolean;
|
|
982
956
|
}
|
|
983
957
|
/**
|
|
984
|
-
* Interactive runner for the registered functions: pick one, edit its JSON
|
|
985
|
-
* arguments, optionally target a shard, then invoke it against the live
|
|
986
|
-
* {@link useLunora} client and inspect the result or error.
|
|
987
|
-
*
|
|
988
|
-
* By default the function list is auto-discovered from the worker's
|
|
989
|
-
* `/_lunora/admin/functions` endpoint; pass an explicit `functions` array to
|
|
990
|
-
* skip discovery (a query/mutation/action's `kind` is compile-time-only, so it
|
|
991
|
-
* must be named).
|
|
992
|
-
*/
|
|
993
|
-
declare const FunctionRunner: ({
|
|
994
|
-
functions: functionsProp,
|
|
995
|
-
runAsIdentity
|
|
996
|
-
}?: FunctionRunnerProps) => ReactElement;
|
|
958
|
+
* Interactive runner for the registered functions: pick one, edit its JSON
|
|
959
|
+
* arguments, optionally target a shard, then invoke it against the live
|
|
960
|
+
* {@link useLunora} client and inspect the result or error.
|
|
961
|
+
*
|
|
962
|
+
* By default the function list is auto-discovered from the worker's
|
|
963
|
+
* `/_lunora/admin/functions` endpoint; pass an explicit `functions` array to
|
|
964
|
+
* skip discovery (a query/mutation/action's `kind` is compile-time-only, so it
|
|
965
|
+
* must be named).
|
|
966
|
+
*/
|
|
967
|
+
declare const FunctionRunner: ({ functions: functionsProp, runAsIdentity }?: FunctionRunnerProps) => ReactElement;
|
|
997
968
|
interface FunctionStatsPanelProps {
|
|
998
969
|
/** Descriptors from codegen, used to annotate each row with the function's `kind`. */
|
|
999
970
|
readonly functions?: FunctionDescriptor[];
|
|
@@ -1001,127 +972,166 @@ interface FunctionStatsPanelProps {
|
|
|
1001
972
|
readonly initialShardKey?: string;
|
|
1002
973
|
}
|
|
1003
974
|
/**
|
|
1004
|
-
* Per-function execution metrics for one shard: call count, error count/rate,
|
|
1005
|
-
* mean and slowest handler latency, last-run time, and the most recent error
|
|
1006
|
-
* message. Reads via the `__lunora_admin__:getFunctionStats` RPC
|
|
1007
|
-
*
|
|
1008
|
-
*
|
|
1009
|
-
* Counters are per-DO-instance and reset on hibernation/restart — this is a
|
|
1010
|
-
* "since this instance woke" readout, mirroring the metrics panel. The panel is
|
|
1011
|
-
* always live:
|
|
1012
|
-
*
|
|
1013
|
-
*/
|
|
1014
|
-
declare const FunctionStatsPanel: ({
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
975
|
+
* Per-function execution metrics for one shard: call count, error count/rate,
|
|
976
|
+
* mean and slowest handler latency, last-run time, and the most recent error
|
|
977
|
+
* message. Reads via the `__lunora_admin__:getFunctionStats` RPC through
|
|
978
|
+
* `useAdminQuery`; gated by the server's `LUNORA_ADMIN_TOKEN`.
|
|
979
|
+
*
|
|
980
|
+
* Counters are per-DO-instance and reset on hibernation/restart — this is a
|
|
981
|
+
* "since this instance woke" readout, mirroring the metrics panel. The panel is
|
|
982
|
+
* always live: `useAdminQuery`'s `live` subscription re-pushes on every server
|
|
983
|
+
* write-flush so the table updates as mutations land.
|
|
984
|
+
*/
|
|
985
|
+
declare const FunctionStatsPanel: ({ functions, initialShardKey }: FunctionStatsPanelProps) => ReactElement;
|
|
986
|
+
/** Which of the two endpoints a probe targets. */
|
|
987
|
+
type ProbeKind = "live" | "ready";
|
|
988
|
+
/** The result of one probe fetch — the HTTP status, the parsed body (or `null`), and any transport error. */
|
|
989
|
+
interface ProbeSnapshot {
|
|
990
|
+
/** The parsed health body, or `null` when the response wasn't JSON (e.g. an auth-gate rejection). */
|
|
991
|
+
body: HealthBody | null;
|
|
992
|
+
/** A transport/gate error message (network failure, or a non-JSON body), else `undefined`. */
|
|
993
|
+
error?: string;
|
|
994
|
+
/** Whether the HTTP status was 2xx. */
|
|
995
|
+
ok: boolean;
|
|
996
|
+
/** The HTTP status code (`0` when the request never completed). */
|
|
997
|
+
status: number;
|
|
998
|
+
}
|
|
999
|
+
/** Fetch one probe. Injected in tests; the default (see {@link useDefaultProbe}) hits the live deployment. */
|
|
1000
|
+
type DeploymentHealthProbe = (kind: ProbeKind) => Promise<ProbeSnapshot>;
|
|
1001
|
+
interface DeploymentHealthPanelProps {
|
|
1002
|
+
/**
|
|
1003
|
+
* Injectable probe, used by tests to feed a canned response. When omitted the
|
|
1004
|
+
* panel fetches the connected deployment's `/_lunora/health` (and
|
|
1005
|
+
* `/health/ready`) directly — this is a plain HTTP route, not an admin RPC, so
|
|
1006
|
+
* it doesn't ride the `useAdminQuery` machinery. The admin bearer (when the
|
|
1007
|
+
* studio holds one) is attached so an `"admin"`-posture endpoint still answers.
|
|
1008
|
+
*/
|
|
1009
|
+
readonly probe?: DeploymentHealthProbe;
|
|
1010
|
+
}
|
|
1011
|
+
/**
|
|
1012
|
+
* Deployment-health panel: renders the live liveness/readiness verdict and the
|
|
1013
|
+
* per-binding/subsystem checks from the deployment's `/_lunora/health` and
|
|
1014
|
+
* `/_lunora/health/ready` endpoints (plan 177). This is the operator's at-a-glance
|
|
1015
|
+
* "are the bindings up?" view — distinct from the app-level SLO panel (error
|
|
1016
|
+
* rate, auth failures, scheduler backlog) that shares the "Health" name.
|
|
1017
|
+
*
|
|
1018
|
+
* The endpoints are plain HTTP routes (not admin RPCs), so the panel fetches them
|
|
1019
|
+
* directly rather than through `useAdminQuery`. The body is deliberately
|
|
1020
|
+
* secret-free — only a check name, an up/down status, whether it's critical, and
|
|
1021
|
+
* a runtime-authored message (present only in the `"admin"` posture) — so nothing
|
|
1022
|
+
* rendered here can leak an env value, connection string, or binding secret.
|
|
1023
|
+
*/
|
|
1024
|
+
declare const DeploymentHealthPanel: ({ probe }: DeploymentHealthPanelProps) => ReactElement;
|
|
1018
1025
|
interface HomePanelProps {
|
|
1019
1026
|
/** Shard key the health digest targets on first load. Defaults to the root shard. */
|
|
1020
1027
|
readonly initialShardKey?: string;
|
|
1021
1028
|
}
|
|
1022
1029
|
/**
|
|
1023
|
-
* The Home overview — the studio's landing page. It pulls the root shard's
|
|
1024
|
-
* health snapshot, the function stats, the two advisor signals, the live
|
|
1025
|
-
* subscription pulse, and the recent admin audit log, then presents an
|
|
1026
|
-
* at-a-glance digest: a KPI row (requests, errors, latency, database size), a
|
|
1027
|
-
* busiest-functions leaderboard, live connections, recent activity, the advisor
|
|
1028
|
-
* summary, and connect/quick-link shortcuts. Every read is best-effort — a
|
|
1029
|
-
* missing admin token or a cold instance leaves a card showing a muted
|
|
1030
|
-
* placeholder rather than blanking the page.
|
|
1031
|
-
*/
|
|
1032
|
-
declare const HomePanel: ({
|
|
1033
|
-
initialShardKey
|
|
1034
|
-
}: HomePanelProps) => ReactElement;
|
|
1030
|
+
* The Home overview — the studio's landing page. It pulls the root shard's
|
|
1031
|
+
* health snapshot, the function stats, the two advisor signals, the live
|
|
1032
|
+
* subscription pulse, and the recent admin audit log, then presents an
|
|
1033
|
+
* at-a-glance digest: a KPI row (requests, errors, latency, database size), a
|
|
1034
|
+
* busiest-functions leaderboard, live connections, recent activity, the advisor
|
|
1035
|
+
* summary, and connect/quick-link shortcuts. Every read is best-effort — a
|
|
1036
|
+
* missing admin token or a cold instance leaves a card showing a muted
|
|
1037
|
+
* placeholder rather than blanking the page.
|
|
1038
|
+
*/
|
|
1039
|
+
declare const HomePanel: ({ initialShardKey }: HomePanelProps) => ReactElement;
|
|
1035
1040
|
interface AuditPanelProps {
|
|
1036
1041
|
/** Shard key the panel reports on. Defaults to the root shard. */
|
|
1037
1042
|
readonly initialShardKey?: string;
|
|
1038
1043
|
}
|
|
1039
1044
|
/**
|
|
1040
|
-
* Durable audit log for one shard: the admin state-changing operations
|
|
1041
|
-
* (`writeRow`, `runMigration`, `importShard`, `applyCdc`) recorded to the
|
|
1042
|
-
* reserved `__lunora_audit__` table, newest first. Reads via the
|
|
1043
|
-
* `__lunora_admin__:getAuditLog` RPC
|
|
1044
|
-
*
|
|
1045
|
-
*
|
|
1046
|
-
* Unlike the logs panel (an in-memory ring that resets on hibernation), the
|
|
1047
|
-
* audit log is durable and bounded only by a retention cap. The panel is always
|
|
1048
|
-
* live:
|
|
1049
|
-
*
|
|
1050
|
-
*
|
|
1051
|
-
*/
|
|
1052
|
-
declare const AuditPanel: ({
|
|
1053
|
-
initialShardKey
|
|
1054
|
-
}: AuditPanelProps) => ReactElement;
|
|
1045
|
+
* Durable audit log for one shard: the admin state-changing operations
|
|
1046
|
+
* (`writeRow`, `runMigration`, `importShard`, `applyCdc`) recorded to the
|
|
1047
|
+
* reserved `__lunora_audit__` table, newest first. Reads via the
|
|
1048
|
+
* `__lunora_admin__:getAuditLog` RPC through `useAdminQuery`; gated by the
|
|
1049
|
+
* server's `LUNORA_ADMIN_TOKEN`.
|
|
1050
|
+
*
|
|
1051
|
+
* Unlike the logs panel (an in-memory ring that resets on hibernation), the
|
|
1052
|
+
* audit log is durable and bounded only by a retention cap. The panel is always
|
|
1053
|
+
* live: `useAdminQuery`'s `live` subscription re-pushes on every server
|
|
1054
|
+
* write-flush so new entries appear without a manual refresh. The op filter is
|
|
1055
|
+
* client-side over the already-fetched buffer — it never triggers a refetch.
|
|
1056
|
+
*/
|
|
1057
|
+
declare const AuditPanel: ({ initialShardKey }: AuditPanelProps) => ReactElement;
|
|
1055
1058
|
interface LogsPanelProps {
|
|
1056
1059
|
/** Shard key the panel reports on. Defaults to the root shard. */
|
|
1057
1060
|
readonly initialShardKey?: string;
|
|
1058
1061
|
}
|
|
1059
|
-
/**
|
|
1060
|
-
|
|
1061
|
-
*
|
|
1062
|
-
*
|
|
1063
|
-
*
|
|
1064
|
-
*
|
|
1065
|
-
*
|
|
1066
|
-
*
|
|
1067
|
-
*
|
|
1068
|
-
*
|
|
1069
|
-
*
|
|
1070
|
-
*
|
|
1071
|
-
*
|
|
1072
|
-
*
|
|
1073
|
-
*
|
|
1074
|
-
*
|
|
1075
|
-
*
|
|
1076
|
-
*
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
declare const LogsPanel: ({
|
|
1080
|
-
initialShardKey
|
|
1081
|
-
}: LogsPanelProps) => ReactElement;
|
|
1062
|
+
/**
|
|
1063
|
+
* The shard's log feed, newest first, over the gated `__lunora_admin__:*` RPC
|
|
1064
|
+
* layer (gated by the server's `LUNORA_ADMIN_TOKEN`). Two views.
|
|
1065
|
+
*
|
|
1066
|
+
* The Requests view (`getRequestLog`) is the durable, structured per-request log
|
|
1067
|
+
* `@lunora/do` writes once per `/rpc` dispatch (PLAN3 §1.1): function path,
|
|
1068
|
+
* shard, acting user/identity, redacted args, outcome, duration, and tables
|
|
1069
|
+
* read/written. It survives hibernation/restart (bounded retention) and is
|
|
1070
|
+
* filtered/correlated SERVER-side on function-path prefix, userId, shard,
|
|
1071
|
+
* outcome, and a touched table.
|
|
1072
|
+
*
|
|
1073
|
+
* The Errors view (`getLogs`) is the legacy in-memory RPC-error buffer, which
|
|
1074
|
+
* only captures dispatch failures (path + message) and resets on hibernation —
|
|
1075
|
+
* kept for the "what's failing on this instance right now" view, filtered
|
|
1076
|
+
* client-side.
|
|
1077
|
+
*
|
|
1078
|
+
* For the raw, un-attributed request firehose (which Lunora deliberately does
|
|
1079
|
+
* NOT re-stream), a deep-link to Cloudflare Workers Observability is provided.
|
|
1080
|
+
*/
|
|
1081
|
+
declare const LogsPanel: ({ initialShardKey }: LogsPanelProps) => ReactElement;
|
|
1082
1082
|
interface MailPanelProps {
|
|
1083
1083
|
/** Newest-N to load (default 100). */
|
|
1084
1084
|
readonly limit?: number;
|
|
1085
1085
|
}
|
|
1086
1086
|
/**
|
|
1087
|
-
* Dev mail catcher — a unified inbox of every email the app sent. `@lunora/mail`'s
|
|
1088
|
-
* capture transport (wired in dev) intercepts each send and persists it to the
|
|
1089
|
-
* root-shard mailbox instead of delivering, so verification / forgot-password and
|
|
1090
|
-
* any app mail show up here with nothing leaving the machine. Reads the
|
|
1091
|
-
* `__lunora_admin__:getCapturedMail` RPC over the {@link useLunora} client;
|
|
1092
|
-
* gated by the server's `LUNORA_ADMIN_TOKEN`.
|
|
1093
|
-
*
|
|
1094
|
-
* The inbox is a single root-shard table with no write-flush to subscribe to, so
|
|
1095
|
-
* it polls on a fixed interval (paused while the tab is hidden) — new captured
|
|
1096
|
-
* mail appears without a manual refresh. The HTML body is rendered in a fully
|
|
1097
|
-
* sandboxed iframe (no script execution) so captured markup can't run in the studio.
|
|
1098
|
-
*/
|
|
1099
|
-
declare const MailPanel: ({
|
|
1100
|
-
|
|
1101
|
-
|
|
1087
|
+
* Dev mail catcher — a unified inbox of every email the app sent. `@lunora/mail`'s
|
|
1088
|
+
* capture transport (wired in dev) intercepts each send and persists it to the
|
|
1089
|
+
* root-shard mailbox instead of delivering, so verification / forgot-password and
|
|
1090
|
+
* any app mail show up here with nothing leaving the machine. Reads the
|
|
1091
|
+
* `__lunora_admin__:getCapturedMail` RPC over the {@link useLunora} client;
|
|
1092
|
+
* gated by the server's `LUNORA_ADMIN_TOKEN`.
|
|
1093
|
+
*
|
|
1094
|
+
* The inbox is a single root-shard table with no write-flush to subscribe to, so
|
|
1095
|
+
* it polls on a fixed interval (paused while the tab is hidden) — new captured
|
|
1096
|
+
* mail appears without a manual refresh. The HTML body is rendered in a fully
|
|
1097
|
+
* sandboxed iframe (no script execution) so captured markup can't run in the studio.
|
|
1098
|
+
*/
|
|
1099
|
+
declare const MailPanel: ({ limit }: MailPanelProps) => ReactElement;
|
|
1100
|
+
/**
|
|
1101
|
+
* The Notifications inspector — the app's registered `@lunora/notify` push
|
|
1102
|
+
* devices, read through the gated `__lunora_admin__:listPushSubscriptions` admin
|
|
1103
|
+
* RPC (`useAdminQuery`; gated by the server's `LUNORA_ADMIN_TOKEN`). Each row is
|
|
1104
|
+
* one registered device: its delivery kind, target endpoint, owning user, last
|
|
1105
|
+
* register/send touch, and the last-send status + any delivery error.
|
|
1106
|
+
*
|
|
1107
|
+
* The subscription store is a WORKER option (built from `env` via
|
|
1108
|
+
* `defineNotify({ store })`), not shard state, so this is a one-shot read with a
|
|
1109
|
+
* manual Refresh — there is no DO write-flush to subscribe to. When the app wires
|
|
1110
|
+
* no `@lunora/notify` store (or none yet registered), the RPC returns an empty
|
|
1111
|
+
* device list and the panel shows an empty state rather than erroring.
|
|
1112
|
+
*/
|
|
1113
|
+
declare const NotificationsPanel: () => ReactElement;
|
|
1102
1114
|
interface HealthPanelProps {
|
|
1103
1115
|
/** Shard key the metric/log reads target on first load. Defaults to the root shard. */
|
|
1104
1116
|
readonly initialShardKey?: string;
|
|
1105
1117
|
}
|
|
1106
1118
|
/**
|
|
1107
|
-
* App-level health & SLO overview. On top of the original single-shard snapshot
|
|
1108
|
-
* (recent errors, request/error counts, shards seen) it composes the
|
|
1109
|
-
* lunora-attributed SLO signals the studio can already reach — app error
|
|
1110
|
-
* rate, auth-failure rate, scheduler backlog, and migration status — each with a
|
|
1111
|
-
* status badge, plus durable request/error and auth sparklines, and a
|
|
1112
|
-
* worst-first per-function error-rate list. None of this is CF's per-Worker
|
|
1113
|
-
* charting: it is attributed to lunora functions, the auth flow, and the
|
|
1114
|
-
* scheduler/migration subsystems.
|
|
1115
|
-
*
|
|
1116
|
-
* Every read is independent and best-effort (via `Promise.allSettled`): a
|
|
1117
|
-
* missing `LUNORA_ADMIN_TOKEN`, an unconfigured scheduler, or a cold instance
|
|
1118
|
-
* degrades that one tile to `—` without blanking the rest. The overview is always
|
|
1119
|
-
* live: a root-shard `getMetrics` subscription drives a full cross-shard re-pull
|
|
1120
|
-
* on every write-flush (coalesced so a burst yields at most one in-flight pull).
|
|
1121
|
-
*/
|
|
1122
|
-
declare const HealthPanel: ({
|
|
1123
|
-
initialShardKey
|
|
1124
|
-
}: HealthPanelProps) => ReactElement;
|
|
1119
|
+
* App-level health & SLO overview. On top of the original single-shard snapshot
|
|
1120
|
+
* (recent errors, request/error counts, shards seen) it composes the
|
|
1121
|
+
* lunora-attributed SLO signals the studio can already reach — app error
|
|
1122
|
+
* rate, auth-failure rate, scheduler backlog, and migration status — each with a
|
|
1123
|
+
* status badge, plus durable request/error and auth sparklines, and a
|
|
1124
|
+
* worst-first per-function error-rate list. None of this is CF's per-Worker
|
|
1125
|
+
* charting: it is attributed to lunora functions, the auth flow, and the
|
|
1126
|
+
* scheduler/migration subsystems.
|
|
1127
|
+
*
|
|
1128
|
+
* Every read is independent and best-effort (via `Promise.allSettled`): a
|
|
1129
|
+
* missing `LUNORA_ADMIN_TOKEN`, an unconfigured scheduler, or a cold instance
|
|
1130
|
+
* degrades that one tile to `—` without blanking the rest. The overview is always
|
|
1131
|
+
* live: a root-shard `getMetrics` subscription drives a full cross-shard re-pull
|
|
1132
|
+
* on every write-flush (coalesced so a burst yields at most one in-flight pull).
|
|
1133
|
+
*/
|
|
1134
|
+
declare const HealthPanel: ({ initialShardKey }: HealthPanelProps) => ReactElement;
|
|
1125
1135
|
/** One shard's metrics fetch outcome: the snapshot, or the error that shard returned. */
|
|
1126
1136
|
interface ShardMetricsResult {
|
|
1127
1137
|
error: null | string;
|
|
@@ -1142,120 +1152,110 @@ interface AggregateMetrics {
|
|
|
1142
1152
|
totalRequests: number;
|
|
1143
1153
|
}
|
|
1144
1154
|
/**
|
|
1145
|
-
* Roll up per-shard metrics into repo-wide totals. Errors-per-shard are kept as
|
|
1146
|
-
* `failed` (a shard that's down is data, not a hard failure), and counters are
|
|
1147
|
-
* summed only over reachable shards. The combined cache hit-rate weights by each
|
|
1148
|
-
* shard's hits+misses so a busy shard dominates a quiet one.
|
|
1149
|
-
*/
|
|
1155
|
+
* Roll up per-shard metrics into repo-wide totals. Errors-per-shard are kept as
|
|
1156
|
+
* `failed` (a shard that's down is data, not a hard failure), and counters are
|
|
1157
|
+
* summed only over reachable shards. The combined cache hit-rate weights by each
|
|
1158
|
+
* shard's hits+misses so a busy shard dominates a quiet one.
|
|
1159
|
+
*/
|
|
1150
1160
|
declare const aggregateMetrics: (results: ReadonlyArray<ShardMetricsResult>) => AggregateMetrics;
|
|
1151
1161
|
/**
|
|
1152
|
-
* The shard keys to aggregate over. Durable Objects aren't enumerable, so this
|
|
1153
|
-
* is the union of the root shard (`""`), an explicit current shard, and the
|
|
1154
|
-
* recently-visited shards — de-duplicated, order-stable (root first). It's a
|
|
1155
|
-
* best-effort "shards we know about", not every shard that exists.
|
|
1156
|
-
*/
|
|
1162
|
+
* The shard keys to aggregate over. Durable Objects aren't enumerable, so this
|
|
1163
|
+
* is the union of the root shard (`""`), an explicit current shard, and the
|
|
1164
|
+
* recently-visited shards — de-duplicated, order-stable (root first). It's a
|
|
1165
|
+
* best-effort "shards we know about", not every shard that exists.
|
|
1166
|
+
*/
|
|
1157
1167
|
declare const shardsToAggregate: (current: string, recents: ReadonlyArray<string>) => string[];
|
|
1158
1168
|
interface MetricsPanelProps {
|
|
1159
1169
|
/** Shard key the panel reports on. Defaults to the root shard. */
|
|
1160
1170
|
readonly initialShardKey?: string;
|
|
1161
1171
|
}
|
|
1162
1172
|
/**
|
|
1163
|
-
* Health snapshot for a single shard: request / error counts (since the DO last
|
|
1164
|
-
* woke), its live SQLite size, and reactive-cache hit/miss stats when a cache is
|
|
1165
|
-
* configured. Reads via the `__lunora_admin__:getMetrics` RPC over the
|
|
1166
|
-
* {@link useLunora} client; gated by the server's `LUNORA_ADMIN_TOKEN`.
|
|
1167
|
-
*
|
|
1168
|
-
* Counters are per-DO-instance and reset on hibernation/restart — this is a
|
|
1169
|
-
* "since this instance woke" readout, not a durable time series.
|
|
1170
|
-
*
|
|
1171
|
-
* The panel is always live: a `getMetrics` WebSocket subscription opens once the
|
|
1172
|
-
* first one-shot seed commits a shard and re-pushes on every server write-flush,
|
|
1173
|
-
* accumulating a client-side, in-memory series of requests-per-sample (the delta
|
|
1174
|
-
* of `requests` between consecutive samples), rendered as an inline-SVG
|
|
1175
|
-
* sparkline. The series is capped at {@link MAX_HISTORY} points and is lost on
|
|
1176
|
-
* remount.
|
|
1177
|
-
*/
|
|
1178
|
-
declare const MetricsPanel: ({
|
|
1179
|
-
initialShardKey
|
|
1180
|
-
}: MetricsPanelProps) => ReactElement;
|
|
1173
|
+
* Health snapshot for a single shard: request / error counts (since the DO last
|
|
1174
|
+
* woke), its live SQLite size, and reactive-cache hit/miss stats when a cache is
|
|
1175
|
+
* configured. Reads via the `__lunora_admin__:getMetrics` RPC over the
|
|
1176
|
+
* {@link useLunora} client; gated by the server's `LUNORA_ADMIN_TOKEN`.
|
|
1177
|
+
*
|
|
1178
|
+
* Counters are per-DO-instance and reset on hibernation/restart — this is a
|
|
1179
|
+
* "since this instance woke" readout, not a durable time series.
|
|
1180
|
+
*
|
|
1181
|
+
* The panel is always live: a `getMetrics` WebSocket subscription opens once the
|
|
1182
|
+
* first one-shot seed commits a shard and re-pushes on every server write-flush,
|
|
1183
|
+
* accumulating a client-side, in-memory series of requests-per-sample (the delta
|
|
1184
|
+
* of `requests` between consecutive samples), rendered as an inline-SVG
|
|
1185
|
+
* sparkline. The series is capped at {@link MAX_HISTORY} points and is lost on
|
|
1186
|
+
* remount.
|
|
1187
|
+
*/
|
|
1188
|
+
declare const MetricsPanel: ({ initialShardKey }: MetricsPanelProps) => ReactElement;
|
|
1181
1189
|
interface SchemaViewerProps {
|
|
1182
1190
|
/** Shard key the viewer targets. Defaults to the root shard. */
|
|
1183
1191
|
readonly initialShardKey?: string;
|
|
1184
1192
|
/**
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1193
|
+
* Table to auto-expand once the shard's tables load. Set by the Insights
|
|
1194
|
+
* "add the index" deep-link (`/schema?table=<name>`) so the operator lands
|
|
1195
|
+
* directly on the scanned table's index list instead of hunting for it.
|
|
1196
|
+
* Re-applied whenever the value changes, so following the link a second time
|
|
1197
|
+
* (same tab already open) re-expands the target.
|
|
1198
|
+
*/
|
|
1191
1199
|
readonly initialTable?: string;
|
|
1192
1200
|
/**
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1201
|
+
* Enable the visual schema-editor overlay (add table / column / index). Off by
|
|
1202
|
+
* default so the diagram stays read-only. Set only by the loopback dev hosts
|
|
1203
|
+
* (see `StudioProps.schemaEditable`); when true, the authoring overlay
|
|
1204
|
+
* (plan 024 Item 4) renders above the table lists and applies additive edits
|
|
1205
|
+
* through the dev host's local schema-edit endpoint.
|
|
1206
|
+
*/
|
|
1199
1207
|
readonly schemaEditable?: boolean;
|
|
1200
1208
|
}
|
|
1201
1209
|
/**
|
|
1202
|
-
* Schema overview that shows both storage tiers so the distinction is never a
|
|
1203
|
-
* mystery. The shard section lists every user table in the selected Durable
|
|
1204
|
-
* Object with row counts, and probes a table's columns on expand via a one-row
|
|
1205
|
-
* `__lunora_admin__:readTablePage` (`PRAGMA table_info`). The global section
|
|
1206
|
-
* lists every `.global()` table — including the auth tables (`user`, `session`,
|
|
1207
|
-
* …) — via the client's `listGlobalTables()`, reading columns from a one-row
|
|
1208
|
-
* `readGlobalTablePage` on expand.
|
|
1209
|
-
*
|
|
1210
|
-
* Two presentations: a **Table list** (searchable, expandable cards per tier)
|
|
1211
|
-
* and a **Graph** — a single React Flow relationship diagram showing both tiers
|
|
1212
|
-
* on one canvas, with cross-tier FK edges and its own in-canvas find-table box,
|
|
1213
|
-
* tier filter, and legend.
|
|
1214
|
-
*
|
|
1215
|
-
* Read-only and gated by the server's `LUNORA_ADMIN_TOKEN`, like the rest of the
|
|
1216
|
-
* studio's admin surface. Global discovery is best-effort: if D1 isn't
|
|
1217
|
-
* configured the global section simply reports it, and the shard section still
|
|
1218
|
-
* works.
|
|
1219
|
-
*/
|
|
1220
|
-
declare const SchemaViewer: ({
|
|
1221
|
-
initialShardKey,
|
|
1222
|
-
initialTable,
|
|
1223
|
-
schemaEditable
|
|
1224
|
-
}: SchemaViewerProps) => ReactElement;
|
|
1210
|
+
* Schema overview that shows both storage tiers so the distinction is never a
|
|
1211
|
+
* mystery. The shard section lists every user table in the selected Durable
|
|
1212
|
+
* Object with row counts, and probes a table's columns on expand via a one-row
|
|
1213
|
+
* `__lunora_admin__:readTablePage` (`PRAGMA table_info`). The global section
|
|
1214
|
+
* lists every `.global()` table — including the auth tables (`user`, `session`,
|
|
1215
|
+
* …) — via the client's `listGlobalTables()`, reading columns from a one-row
|
|
1216
|
+
* `readGlobalTablePage` on expand.
|
|
1217
|
+
*
|
|
1218
|
+
* Two presentations: a **Table list** (searchable, expandable cards per tier)
|
|
1219
|
+
* and a **Graph** — a single React Flow relationship diagram showing both tiers
|
|
1220
|
+
* on one canvas, with cross-tier FK edges and its own in-canvas find-table box,
|
|
1221
|
+
* tier filter, and legend.
|
|
1222
|
+
*
|
|
1223
|
+
* Read-only and gated by the server's `LUNORA_ADMIN_TOKEN`, like the rest of the
|
|
1224
|
+
* studio's admin surface. Global discovery is best-effort: if D1 isn't
|
|
1225
|
+
* configured the global section simply reports it, and the shard section still
|
|
1226
|
+
* works.
|
|
1227
|
+
*/
|
|
1228
|
+
declare const SchemaViewer: ({ initialShardKey, initialTable, schemaEditable }: SchemaViewerProps) => ReactElement;
|
|
1225
1229
|
interface SettingsPanelProps {
|
|
1226
1230
|
/** Shard key the settings read targets on first load. Defaults to the root shard. */
|
|
1227
1231
|
readonly initialShardKey?: string;
|
|
1228
1232
|
}
|
|
1229
1233
|
/**
|
|
1230
|
-
* Read-only **Settings** view of the deployment's config: the Worker vars,
|
|
1231
|
-
* secrets, and bindings exposed via `env`, plus best-effort deploy metadata.
|
|
1232
|
-
* Reads the `__lunora_admin__:getSettings` RPC
|
|
1233
|
-
*
|
|
1234
|
-
*
|
|
1235
|
-
* Strictly view-only: secret values are masked server-side and never returned
|
|
1236
|
-
* raw, and there is no editing here. The infrastructure plane lives in
|
|
1237
|
-
* Cloudflare/wrangler — a deep-link to the Cloudflare dashboard is provided so
|
|
1238
|
-
* you can edit there. Deployment config is static at runtime (it only changes on
|
|
1239
|
-
* redeploy), so this loads once on mount — there is no live channel or poll.
|
|
1240
|
-
*/
|
|
1241
|
-
declare const SettingsPanel: ({
|
|
1242
|
-
initialShardKey
|
|
1243
|
-
}: SettingsPanelProps) => ReactElement;
|
|
1234
|
+
* Read-only **Settings** view of the deployment's config: the Worker vars,
|
|
1235
|
+
* secrets, and bindings exposed via `env`, plus best-effort deploy metadata.
|
|
1236
|
+
* Reads the `__lunora_admin__:getSettings` RPC via {@link useAdminQuery} (gated
|
|
1237
|
+
* by the server's `LUNORA_ADMIN_TOKEN`).
|
|
1238
|
+
*
|
|
1239
|
+
* Strictly view-only: secret values are masked server-side and never returned
|
|
1240
|
+
* raw, and there is no editing here. The infrastructure plane lives in
|
|
1241
|
+
* Cloudflare/wrangler — a deep-link to the Cloudflare dashboard is provided so
|
|
1242
|
+
* you can edit there. Deployment config is static at runtime (it only changes on
|
|
1243
|
+
* redeploy), so this loads once on mount — there is no live channel or poll.
|
|
1244
|
+
*/
|
|
1245
|
+
declare const SettingsPanel: ({ initialShardKey }: SettingsPanelProps) => ReactElement;
|
|
1244
1246
|
interface SqlEditorPanelProps {
|
|
1245
1247
|
/** Shard key the query runs against on first load. Defaults to the root shard. */
|
|
1246
1248
|
readonly initialShardKey?: string;
|
|
1247
1249
|
}
|
|
1248
1250
|
/**
|
|
1249
|
-
* A full-height, Supabase-style SQL editor: a left query sidebar (search + new,
|
|
1250
|
-
* a browser-persisted PRIVATE list, and REFERENCE templates), a line-numbered
|
|
1251
|
-
* editor pane, and a Results / Explain pane with a Run control + shard selector.
|
|
1252
|
-
* Read-only — the `__lunora_admin__:runSql` RPC rejects everything but
|
|
1253
|
-
* SELECT / WITH / EXPLAIN, so raw writes can't desync the doc-store's shadow
|
|
1254
|
-
* tables (use the Data grid's inline edit for mutations).
|
|
1255
|
-
*/
|
|
1256
|
-
declare const SqlEditorPanel: ({
|
|
1257
|
-
initialShardKey
|
|
1258
|
-
}: SqlEditorPanelProps) => ReactElement;
|
|
1251
|
+
* A full-height, Supabase-style SQL editor: a left query sidebar (search + new,
|
|
1252
|
+
* a browser-persisted PRIVATE list, and REFERENCE templates), a line-numbered
|
|
1253
|
+
* editor pane, and a Results / Explain pane with a Run control + shard selector.
|
|
1254
|
+
* Read-only — the `__lunora_admin__:runSql` RPC rejects everything but
|
|
1255
|
+
* SELECT / WITH / EXPLAIN, so raw writes can't desync the doc-store's shadow
|
|
1256
|
+
* tables (use the Data grid's inline edit for mutations).
|
|
1257
|
+
*/
|
|
1258
|
+
declare const SqlEditorPanel: ({ initialShardKey }: SqlEditorPanelProps) => ReactElement;
|
|
1259
1259
|
interface FileBrowserProps {
|
|
1260
1260
|
/** Object-key prefix the browser filters by on first load. */
|
|
1261
1261
|
readonly initialPrefix?: string;
|
|
@@ -1263,120 +1263,108 @@ interface FileBrowserProps {
|
|
|
1263
1263
|
readonly pageSize?: number;
|
|
1264
1264
|
}
|
|
1265
1265
|
/**
|
|
1266
|
-
* Browse — and mutate — objects in the storage (R2) bucket. Lists keys under an
|
|
1267
|
-
* optional prefix via the client's `listStorageObjects`, which hits the worker's
|
|
1268
|
-
* admin-gated `GET /_lunora/admin/storage` endpoint — so the worker must be built
|
|
1269
|
-
* with a `storageList` function and `adminToken`. Paginates forward by cursor.
|
|
1270
|
-
*
|
|
1271
|
-
* Each row offers a "Copy URL" (signed/public URL via `signedStorageUrl`) and a
|
|
1272
|
-
* confirm-gated "Delete" (`deleteStorageObject`); the toolbar offers an upload
|
|
1273
|
-
* (`uploadStorageObject`) into the current prefix. Those write paths require the
|
|
1274
|
-
* worker to be built with `storageSignedUrl` / `storageDelete` / `storageUpload`
|
|
1275
|
-
* respectively — when absent, the worker responds with a clear `*_NOT_CONFIGURED`
|
|
1276
|
-
* error that surfaces inline rather than crashing the panel.
|
|
1277
|
-
*
|
|
1278
|
-
* All state + behavior lives in {@link useFileBrowser}; this shell only wires the
|
|
1279
|
-
* view-model into the toolbar, breadcrumbs, selection bar, list/gallery and the
|
|
1280
|
-
* load-more / error / empty affordances.
|
|
1281
|
-
*/
|
|
1282
|
-
declare const FileBrowser: ({
|
|
1283
|
-
initialPrefix,
|
|
1284
|
-
pageSize
|
|
1285
|
-
}: FileBrowserProps) => ReactElement;
|
|
1266
|
+
* Browse — and mutate — objects in the storage (R2) bucket. Lists keys under an
|
|
1267
|
+
* optional prefix via the client's `listStorageObjects`, which hits the worker's
|
|
1268
|
+
* admin-gated `GET /_lunora/admin/storage` endpoint — so the worker must be built
|
|
1269
|
+
* with a `storageList` function and `adminToken`. Paginates forward by cursor.
|
|
1270
|
+
*
|
|
1271
|
+
* Each row offers a "Copy URL" (signed/public URL via `signedStorageUrl`) and a
|
|
1272
|
+
* confirm-gated "Delete" (`deleteStorageObject`); the toolbar offers an upload
|
|
1273
|
+
* (`uploadStorageObject`) into the current prefix. Those write paths require the
|
|
1274
|
+
* worker to be built with `storageSignedUrl` / `storageDelete` / `storageUpload`
|
|
1275
|
+
* respectively — when absent, the worker responds with a clear `*_NOT_CONFIGURED`
|
|
1276
|
+
* error that surfaces inline rather than crashing the panel.
|
|
1277
|
+
*
|
|
1278
|
+
* All state + behavior lives in {@link useFileBrowser}; this shell only wires the
|
|
1279
|
+
* view-model into the toolbar, breadcrumbs, selection bar, list/gallery and the
|
|
1280
|
+
* load-more / error / empty affordances.
|
|
1281
|
+
*/
|
|
1282
|
+
declare const FileBrowser: ({ initialPrefix, pageSize }: FileBrowserProps) => ReactElement;
|
|
1286
1283
|
/** Default polling cadence for auto-refresh, in milliseconds. */
|
|
1287
1284
|
declare const DEFAULT_AUTO_REFRESH_MS = 5e3;
|
|
1288
1285
|
/**
|
|
1289
|
-
* Call `onTick` on a fixed interval while `enabled`, for panels whose backend
|
|
1290
|
-
* has no live subscription channel (the scheduler, R2, D1, the SessionDO — all
|
|
1291
|
-
* HTTP-only). Polling is the honest "live" here: a timer-driven scheduler has no
|
|
1292
|
-
* client-observable write event to push on, so the UI watches jobs count down
|
|
1293
|
-
* and disappear by re-asking.
|
|
1294
|
-
*
|
|
1295
|
-
* Ticks are skipped while the tab is hidden (`document.hidden`) so a backgrounded
|
|
1296
|
-
* studio doesn't keep hammering the worker. `onTick` is held in a ref so a
|
|
1297
|
-
* fresh closure each render doesn't reset the interval; only `enabled`/`intervalMs`
|
|
1298
|
-
* do. The interval is cleared on disable and unmount.
|
|
1299
|
-
*/
|
|
1286
|
+
* Call `onTick` on a fixed interval while `enabled`, for panels whose backend
|
|
1287
|
+
* has no live subscription channel (the scheduler, R2, D1, the SessionDO — all
|
|
1288
|
+
* HTTP-only). Polling is the honest "live" here: a timer-driven scheduler has no
|
|
1289
|
+
* client-observable write event to push on, so the UI watches jobs count down
|
|
1290
|
+
* and disappear by re-asking.
|
|
1291
|
+
*
|
|
1292
|
+
* Ticks are skipped while the tab is hidden (`document.hidden`) so a backgrounded
|
|
1293
|
+
* studio doesn't keep hammering the worker. `onTick` is held in a ref so a
|
|
1294
|
+
* fresh closure each render doesn't reset the interval; only `enabled`/`intervalMs`
|
|
1295
|
+
* do. The interval is cleared on disable and unmount.
|
|
1296
|
+
*/
|
|
1300
1297
|
declare const useAutoRefresh: (onTick: () => void, enabled: boolean, intervalMs?: number) => void;
|
|
1301
1298
|
/**
|
|
1302
|
-
* Debounced mirror of `value`: returns the latest value only after it has been
|
|
1303
|
-
* stable for `delayMs`. Used so a per-keystroke search box drives at most one
|
|
1304
|
-
* server round-trip per pause, instead of one request per character.
|
|
1305
|
-
*/
|
|
1299
|
+
* Debounced mirror of `value`: returns the latest value only after it has been
|
|
1300
|
+
* stable for `delayMs`. Used so a per-keystroke search box drives at most one
|
|
1301
|
+
* server round-trip per pause, instead of one request per character.
|
|
1302
|
+
*/
|
|
1306
1303
|
declare const useDebounced: <T>(value: T, delayMs?: number) => T;
|
|
1307
1304
|
/**
|
|
1308
|
-
* The registry of every English source string a call site may pass to `t(...)`.
|
|
1309
|
-
*
|
|
1310
|
-
* English is the source locale, so each id doubles as the rendered text: Lingui
|
|
1311
|
-
* compiles an id verbatim when a catalog has no entry for it. This list is the
|
|
1312
|
-
* single source of known strings — {@link MessageId} is derived from it and
|
|
1313
|
-
* `TFunction` is typed against that union, so `t("Dat")` (or any string absent
|
|
1314
|
-
* here) is a compile error rather than a silently-rendered typo.
|
|
1315
|
-
*
|
|
1316
|
-
* Add a string here the moment a new call site needs it. To translate, create a
|
|
1317
|
-
* sibling catalog (for example `de.ts`) mapping each id to its translation and
|
|
1318
|
-
* register it via `createStudioI18n(locale, { en: enMessages, de: deMessages })`.
|
|
1319
|
-
*/
|
|
1320
|
-
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", "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"];
|
|
1305
|
+
* The registry of every English source string a call site may pass to `t(...)`.
|
|
1306
|
+
*
|
|
1307
|
+
* English is the source locale, so each id doubles as the rendered text: Lingui
|
|
1308
|
+
* compiles an id verbatim when a catalog has no entry for it. This list is the
|
|
1309
|
+
* single source of known strings — {@link MessageId} is derived from it and
|
|
1310
|
+
* `TFunction` is typed against that union, so `t("Dat")` (or any string absent
|
|
1311
|
+
* here) is a compile error rather than a silently-rendered typo.
|
|
1312
|
+
*
|
|
1313
|
+
* Add a string here the moment a new call site needs it. To translate, create a
|
|
1314
|
+
* sibling catalog (for example `de.ts`) mapping each id to its translation and
|
|
1315
|
+
* register it via `createStudioI18n(locale, { en: enMessages, de: deMessages })`.
|
|
1316
|
+
*/
|
|
1317
|
+
declare const MESSAGE_IDS: readonly ["Agents", "Agent", "Threads", "Timeline", "Messages", "Tokens", "Updated", "Content", "Tool", "Usage", "Approval", "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", "{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.", "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.", "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", "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", "—", "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"];
|
|
1321
1318
|
/** A known studio message id — one of the entries in {@link MESSAGE_IDS}. */
|
|
1322
1319
|
type MessageId = (typeof MESSAGE_IDS)[number];
|
|
1323
|
-
/**
|
|
1324
|
-
* English message catalog.
|
|
1325
|
-
*
|
|
1326
|
-
* English is the source locale: every call site passes its English string as the
|
|
1327
|
-
* message id (e.g. `t("Save")`), and Lingui compiles the id verbatim when a
|
|
1328
|
-
* catalog has no entry for it. So English needs no translations — this stays
|
|
1329
|
-
* empty and the source strings render as-is. The known ids live in
|
|
1330
|
-
* {@link MESSAGE_IDS}, which types the `t` function.
|
|
1331
|
-
*/
|
|
1332
1320
|
/** The locale the studio ships with and falls back to. */
|
|
1333
1321
|
declare const DEFAULT_LOCALE = "en";
|
|
1334
1322
|
/**
|
|
1335
|
-
* Locale code to catalog. Each catalog maps an English source string (which
|
|
1336
|
-
* doubles as the message id) to its translation. English ships empty: Lingui
|
|
1337
|
-
* compiles the id verbatim when a translation is missing, so the source strings
|
|
1338
|
-
* render as-is. To add a language, register `{ "Some English text": "…" }`.
|
|
1339
|
-
*/
|
|
1323
|
+
* Locale code to catalog. Each catalog maps an English source string (which
|
|
1324
|
+
* doubles as the message id) to its translation. English ships empty: Lingui
|
|
1325
|
+
* compiles the id verbatim when a translation is missing, so the source strings
|
|
1326
|
+
* render as-is. To add a language, register `{ "Some English text": "…" }`.
|
|
1327
|
+
*/
|
|
1340
1328
|
type StudioCatalogs = Readonly<Record<string, Messages>>;
|
|
1341
1329
|
/**
|
|
1342
|
-
* Translate function: `t("Clear")` or `t("{title} failed", { title })`.
|
|
1343
|
-
*
|
|
1344
|
-
* `id` is constrained to a known {@link MessageId}, so a typo is a compile error.
|
|
1345
|
-
* The interpolation `values` stay loosely typed: mapping each id to its exact
|
|
1346
|
-
* placeholder set isn't worth the machinery for the handful of interpolated
|
|
1347
|
-
* strings, so a wrong or missing value key isn't caught at this boundary.
|
|
1348
|
-
*/
|
|
1330
|
+
* Translate function: `t("Clear")` or `t("{title} failed", { title })`.
|
|
1331
|
+
*
|
|
1332
|
+
* `id` is constrained to a known {@link MessageId}, so a typo is a compile error.
|
|
1333
|
+
* The interpolation `values` stay loosely typed: mapping each id to its exact
|
|
1334
|
+
* placeholder set isn't worth the machinery for the handful of interpolated
|
|
1335
|
+
* strings, so a wrong or missing value key isn't caught at this boundary.
|
|
1336
|
+
*/
|
|
1349
1337
|
type TFunction = (id: MessageId, values?: Record<string, unknown>) => string;
|
|
1350
1338
|
/**
|
|
1351
|
-
* Build a studio-scoped Lingui instance. We deliberately use `@lingui/core`'s
|
|
1352
|
-
* `setupI18n` (a fresh instance) rather than the global singleton so the
|
|
1353
|
-
* studio can never clobber — or be clobbered by — a host app that also uses
|
|
1354
|
-
* Lingui.
|
|
1355
|
-
*
|
|
1356
|
-
* The message compiler is installed explicitly. `@lingui/core` only auto-installs
|
|
1357
|
-
* it when `NODE_ENV !== "production"`, but the studio ships as a library and
|
|
1358
|
-
* relies on the compiler at runtime to interpolate uncompiled source strings
|
|
1359
|
-
* (e.g. `t("{title} failed", { title })`). Without this, a consumer's production
|
|
1360
|
-
* build would render `{title}` literally and `console.warn` on every `t(...)`.
|
|
1361
|
-
*
|
|
1362
|
-
* Pass extra `catalogs` to ship more locales; unknown `locale` codes fall back
|
|
1363
|
-
* to `DEFAULT_LOCALE`.
|
|
1364
|
-
*/
|
|
1339
|
+
* Build a studio-scoped Lingui instance. We deliberately use `@lingui/core`'s
|
|
1340
|
+
* `setupI18n` (a fresh instance) rather than the global singleton so the
|
|
1341
|
+
* studio can never clobber — or be clobbered by — a host app that also uses
|
|
1342
|
+
* Lingui.
|
|
1343
|
+
*
|
|
1344
|
+
* The message compiler is installed explicitly. `@lingui/core` only auto-installs
|
|
1345
|
+
* it when `NODE_ENV !== "production"`, but the studio ships as a library and
|
|
1346
|
+
* relies on the compiler at runtime to interpolate uncompiled source strings
|
|
1347
|
+
* (e.g. `t("{title} failed", { title })`). Without this, a consumer's production
|
|
1348
|
+
* build would render `{title}` literally and `console.warn` on every `t(...)`.
|
|
1349
|
+
*
|
|
1350
|
+
* Pass extra `catalogs` to ship more locales; unknown `locale` codes fall back
|
|
1351
|
+
* to `DEFAULT_LOCALE`.
|
|
1352
|
+
*/
|
|
1365
1353
|
declare const createStudioI18n: (locale?: string, catalogs?: StudioCatalogs) => I18n;
|
|
1366
1354
|
/**
|
|
1367
|
-
* Shared default instance. Backs the i18n context's default value so the
|
|
1368
|
-
* composable studio and individual exported panels resolve their strings even
|
|
1369
|
-
* when rendered without `StudioI18nProvider` (e.g. in tests, or a host's own
|
|
1370
|
-
* admin UI). English-only, so it renders source strings as-is.
|
|
1371
|
-
*/
|
|
1355
|
+
* Shared default instance. Backs the i18n context's default value so the
|
|
1356
|
+
* composable studio and individual exported panels resolve their strings even
|
|
1357
|
+
* when rendered without `StudioI18nProvider` (e.g. in tests, or a host's own
|
|
1358
|
+
* admin UI). English-only, so it renders source strings as-is.
|
|
1359
|
+
*/
|
|
1372
1360
|
declare const studioI18n: I18n;
|
|
1373
1361
|
/**
|
|
1374
|
-
* Hook returning a `t` bound to the nearest `StudioI18nProvider` (or the
|
|
1375
|
-
* shared instance when there's none). This is the runtime stand-in for Lingui's
|
|
1376
|
-
* `t` macro — the studio builds with esbuild and tests under Vite 8/Rolldown,
|
|
1377
|
-
* neither of which runs Lingui's Babel macro transform, so call sites pass the
|
|
1378
|
-
* English string as the id directly.
|
|
1379
|
-
*/
|
|
1362
|
+
* Hook returning a `t` bound to the nearest `StudioI18nProvider` (or the
|
|
1363
|
+
* shared instance when there's none). This is the runtime stand-in for Lingui's
|
|
1364
|
+
* `t` macro — the studio builds with esbuild and tests under Vite 8/Rolldown,
|
|
1365
|
+
* neither of which runs Lingui's Babel macro transform, so call sites pass the
|
|
1366
|
+
* English string as the id directly.
|
|
1367
|
+
*/
|
|
1380
1368
|
declare const useT: () => TFunction;
|
|
1381
1369
|
interface StudioI18nProviderProps {
|
|
1382
1370
|
/** Catalogs to register in addition to the built-in English one. */
|
|
@@ -1388,15 +1376,10 @@ interface StudioI18nProviderProps {
|
|
|
1388
1376
|
readonly locale?: string;
|
|
1389
1377
|
}
|
|
1390
1378
|
/**
|
|
1391
|
-
* Provides a studio-scoped Lingui instance to `useT`. Nesting is safe:
|
|
1392
|
-
* providers sharing the same instance resolve to the same context value.
|
|
1393
|
-
*/
|
|
1394
|
-
declare const StudioI18nProvider: ({
|
|
1395
|
-
catalogs,
|
|
1396
|
-
children,
|
|
1397
|
-
i18n,
|
|
1398
|
-
locale
|
|
1399
|
-
}: StudioI18nProviderProps) => ReactElement;
|
|
1379
|
+
* Provides a studio-scoped Lingui instance to `useT`. Nesting is safe:
|
|
1380
|
+
* providers sharing the same instance resolve to the same context value.
|
|
1381
|
+
*/
|
|
1382
|
+
declare const StudioI18nProvider: ({ catalogs, children, i18n, locale }: StudioI18nProviderProps) => ReactElement;
|
|
1400
1383
|
/** Root class the batteries-included app sets so the studio styles stay scoped. */
|
|
1401
1384
|
declare const STUDIO_ROOT_CLASS = "lunora-studio-root";
|
|
1402
|
-
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 };
|
|
1385
|
+
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, 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 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 };
|