@lunora/studio 1.0.0-alpha.360 → 1.0.0-alpha.362
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/dist/index.d.mts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.mjs +1 -1
- package/dist/mount.mjs +1 -1
- package/dist/packem_chunks/AdvisorHealthPanel.mjs +1 -1
- package/dist/packem_chunks/ApiTab.mjs +1 -1
- package/dist/packem_chunks/AuditPanel.mjs +1 -1
- package/dist/packem_chunks/ExportImportPanel.mjs +1 -1
- package/dist/packem_chunks/FileBrowser.mjs +1 -1
- package/dist/packem_chunks/FunctionRunner.mjs +1 -1
- package/dist/packem_chunks/FunctionStatsPanel.mjs +1 -1
- package/dist/packem_chunks/HealthPanel.mjs +1 -1
- package/dist/packem_chunks/InsightsPanel.mjs +1 -1
- package/dist/packem_chunks/LogsPanel.mjs +1 -1
- package/dist/packem_chunks/MailPanel.mjs +1 -1
- package/dist/packem_chunks/MetricsPanel.mjs +1 -1
- package/dist/packem_chunks/NotificationsPanel.mjs +1 -1
- package/dist/packem_chunks/PitrPanel.mjs +1 -1
- package/dist/packem_chunks/SchemaViewer.mjs +1 -1
- package/dist/packem_chunks/SecurityAdvisorPanel.mjs +1 -1
- package/dist/packem_chunks/SettingsPanel.mjs +1 -1
- package/dist/packem_chunks/SqlEditorPanel.mjs +24 -9
- package/dist/packem_chunks/TableEditor.mjs +1 -1
- package/dist/packem_chunks/agents-panel.mjs +1 -1
- package/dist/packem_chunks/ai-knowledge.mjs +1 -0
- package/dist/packem_chunks/ai-usage-panel.mjs +1 -1
- package/dist/packem_chunks/assistant-panel.mjs +3 -0
- package/dist/packem_chunks/auth-audit-panel.mjs +1 -1
- package/dist/packem_chunks/containers-panel.mjs +1 -1
- package/dist/packem_chunks/dashboards-panel.mjs +1 -1
- package/dist/packem_chunks/evals-panel.mjs +1 -1
- package/dist/packem_chunks/fanout-panel.mjs +1 -1
- package/dist/packem_chunks/flags-panel.mjs +1 -1
- package/dist/packem_chunks/issues-panel.mjs +1 -1
- package/dist/packem_chunks/kv-browser.mjs +1 -1
- package/dist/packem_chunks/log-drains-panel.mjs +1 -1
- package/dist/packem_chunks/migrations-route.mjs +1 -1
- package/dist/packem_chunks/payments-panel.mjs +1 -1
- package/dist/packem_chunks/permissions-panel.mjs +1 -1
- package/dist/packem_chunks/privacy-requests-panel.mjs +1 -1
- package/dist/packem_chunks/queues-panel.mjs +1 -1
- package/dist/packem_chunks/reactors-panel.mjs +1 -1
- package/dist/packem_chunks/rls-panel.mjs +1 -1
- package/dist/packem_chunks/schedule-panel.mjs +1 -1
- package/dist/packem_chunks/storage-rules-panel.mjs +1 -1
- package/dist/packem_chunks/subscriptions-panel.mjs +1 -1
- package/dist/packem_chunks/traces-panel.mjs +1 -1
- package/dist/packem_chunks/workflows-panel.mjs +1 -1
- package/dist/packem_shared/ADMIN_FUNCTIONS-DUXsXId1.mjs +1 -0
- package/dist/packem_shared/{ApiDocsPanel-DD2Uns6b.mjs → ApiDocsPanel-B9S9l1Ce.mjs} +1 -1
- package/dist/packem_shared/{DataBrowser-CVRWnNWu.mjs → DataBrowser-Dm-jhIUP.mjs} +2 -2
- package/dist/packem_shared/{GlobalDataBrowser-DC47T6Zl.mjs → GlobalDataBrowser-C1Y8GUhe.mjs} +1 -1
- package/dist/packem_shared/{HomePanel-D12HxHQo.mjs → HomePanel-B5ytwPIo.mjs} +1 -1
- package/dist/packem_shared/{MigrationsPanel-DMkxSXNl.mjs → MigrationsPanel-CwLikxDT.mjs} +1 -1
- package/dist/packem_shared/Studio-B89ZNMOD.mjs +1 -0
- package/dist/packem_shared/{StudioApp-isdWpF9P.mjs → StudioApp-C9l1a3A8.mjs} +1 -1
- package/dist/packem_shared/advisor-view-CzieqKMe.mjs +5 -0
- package/dist/packem_shared/assistant-provider-Bp72uWsq.mjs +1 -0
- package/dist/packem_shared/assistant-reason-D6EwMCxT.mjs +1 -0
- package/dist/packem_shared/{cf-links-CBJ5SywP.mjs → cf-links-C4DVTr8A.mjs} +1 -1
- package/dist/packem_shared/error-alert-DKXm5h19.mjs +6 -0
- package/dist/packem_shared/{home-panel-CDVTuTF8.mjs → home-panel-5fGktYeD.mjs} +1 -1
- package/dist/packem_shared/recording-client-z4CBi0y8.mjs +1 -0
- package/dist/packem_shared/studio-gZfpz1wC.mjs +2 -0
- package/dist/packem_shared/{table-list-sidebar-CNadcIgG.mjs → table-list-sidebar-kpHaDWjy.mjs} +1 -1
- package/dist/packem_shared/use-assistant-rpc-GCUK2zPa.mjs +1 -0
- package/dist/standalone/chunk-2DT3QG6Q.js +1 -0
- package/dist/standalone/chunk-2EB7FN5S.js +1 -0
- package/dist/standalone/chunk-2FTGLXYA.js +1 -0
- package/dist/standalone/chunk-2H6VLY2M.js +1 -0
- package/dist/standalone/chunk-2NGKUO32.js +1 -0
- package/dist/standalone/chunk-2SNHKJXK.js +1 -0
- package/dist/standalone/chunk-2W4UO5BC.js +1 -0
- package/dist/standalone/{chunk-SLIDAWNX.js → chunk-3D67ZJRW.js} +1 -1
- package/dist/standalone/chunk-3RZD6VJ7.js +1 -0
- package/dist/standalone/chunk-3X3NXJBR.js +1 -0
- package/dist/standalone/chunk-4EPW63HS.js +1 -0
- package/dist/standalone/{chunk-WS36BO4R.js → chunk-4NKJV7YX.js} +1 -1
- package/dist/standalone/chunk-4PI2OSSP.js +1 -0
- package/dist/standalone/chunk-53CGUTRT.js +1 -0
- package/dist/standalone/chunk-5EWIOOBI.js +1 -0
- package/dist/standalone/chunk-5GYHGDIF.js +8 -0
- package/dist/standalone/chunk-5NIQHOPN.js +1 -0
- package/dist/standalone/chunk-5O7ICPWV.js +1 -0
- package/dist/standalone/chunk-5PEAXTYQ.js +1 -0
- package/dist/standalone/{chunk-O2NMPIV2.js → chunk-5WNGRT7N.js} +1 -1
- package/dist/standalone/chunk-66BMMNUR.js +1 -0
- package/dist/standalone/chunk-66LYVBXB.js +1 -0
- package/dist/standalone/chunk-6FPV3EK2.js +1 -0
- package/dist/standalone/chunk-6G3E4PJ2.js +1 -0
- package/dist/standalone/chunk-6KE7ILEZ.js +1 -0
- package/dist/standalone/chunk-7KJCRT4B.js +1 -0
- package/dist/standalone/chunk-7O5SGABV.js +1 -0
- package/dist/standalone/chunk-7QEZ2SFW.js +1 -0
- package/dist/standalone/chunk-7WV3EPE6.js +1 -0
- package/dist/standalone/chunk-A2Q3TGIQ.js +1 -0
- package/dist/standalone/chunk-ABMHWBYA.js +1 -0
- package/dist/standalone/chunk-AEU3EF4T.js +1 -0
- package/dist/standalone/chunk-ALQHMFOC.js +1 -0
- package/dist/standalone/chunk-AZIKM5BA.js +1 -0
- package/dist/standalone/chunk-BCUOQNI2.js +1 -0
- package/dist/standalone/chunk-BG2CJOVS.js +1 -0
- package/dist/standalone/chunk-BKI3JMXQ.js +1 -0
- package/dist/standalone/chunk-BO5NNWMO.js +1 -0
- package/dist/standalone/chunk-BX7TFVCC.js +1 -0
- package/dist/standalone/chunk-CKEQX655.js +1 -0
- package/dist/standalone/{chunk-DX55P3KZ.js → chunk-CL3JOU6F.js} +1 -1
- package/dist/standalone/chunk-COLSZPCE.js +1 -0
- package/dist/standalone/chunk-CVSIFPI5.js +1 -0
- package/dist/standalone/chunk-D65UVZIA.js +1 -0
- package/dist/standalone/{chunk-DBVJ5VLI.js → chunk-DA2CAFXI.js} +1 -1
- package/dist/standalone/chunk-DB6QX4X6.js +1 -0
- package/dist/standalone/{chunk-7ZIYHKLX.js → chunk-E2FFHKGI.js} +3 -3
- package/dist/standalone/chunk-EE2COWFF.js +1 -0
- package/dist/standalone/chunk-ELSQ4FVH.js +1 -0
- package/dist/standalone/chunk-EXFERMUT.js +1 -0
- package/dist/standalone/chunk-FACXM2UB.js +7 -0
- package/dist/standalone/chunk-FBDIQ67D.js +1 -0
- package/dist/standalone/chunk-FHLODLBC.js +1 -0
- package/dist/standalone/chunk-FQEZUQ36.js +1 -0
- package/dist/standalone/{chunk-VEWQWS3J.js → chunk-FWM5Z6CH.js} +1 -1
- package/dist/standalone/chunk-GC3GKGWD.js +1 -0
- package/dist/standalone/chunk-GJXCPZDN.js +1 -0
- package/dist/standalone/chunk-GNI37YCV.js +33 -0
- package/dist/standalone/chunk-GVZ3VFGG.js +1 -0
- package/dist/standalone/chunk-GWNGVKLG.js +1 -0
- package/dist/standalone/chunk-GXTSE66Z.js +1 -0
- package/dist/standalone/chunk-H7BQUL7D.js +1 -0
- package/dist/standalone/chunk-HCCQTUHS.js +1 -0
- package/dist/standalone/chunk-HCOF7HOM.js +1 -0
- package/dist/standalone/chunk-HZDLUAWS.js +1 -0
- package/dist/standalone/chunk-IDZLHZIA.js +1 -0
- package/dist/standalone/{chunk-SU5DTRGK.js → chunk-IHGRWY3Y.js} +1 -1
- package/dist/standalone/chunk-IUGNIG6L.js +6 -0
- package/dist/standalone/chunk-J3BZWYJQ.js +1 -0
- package/dist/standalone/chunk-J45HAKBU.js +1 -0
- package/dist/standalone/chunk-J4PQAVOF.js +1 -0
- package/dist/standalone/chunk-J6FR2B77.js +1 -0
- package/dist/standalone/chunk-J6XQKD2F.js +1 -0
- package/dist/standalone/chunk-JCRFMCNP.js +1 -0
- package/dist/standalone/chunk-JD6PRRFO.js +1 -0
- package/dist/standalone/chunk-JENPPZFV.js +1 -0
- package/dist/standalone/chunk-JHTL3QHW.js +1 -0
- package/dist/standalone/chunk-JOPNP4EO.js +1 -0
- package/dist/standalone/chunk-JVP3TR3A.js +1 -0
- package/dist/standalone/chunk-KGLIQIZU.js +1 -0
- package/dist/standalone/{chunk-ONWGX5Y4.js → chunk-KH6OXCG3.js} +1 -1
- package/dist/standalone/{chunk-3FS22LNI.js → chunk-L26RMC2W.js} +3 -3
- package/dist/standalone/chunk-L2FYX4FN.js +1 -0
- package/dist/standalone/{chunk-XIRKBJPD.js → chunk-LPFUEJZ4.js} +5 -5
- package/dist/standalone/chunk-LSEUUZN4.js +1 -0
- package/dist/standalone/{chunk-BYOGQ2IV.js → chunk-MJTVTUNI.js} +2 -2
- package/dist/standalone/chunk-MQTI3STP.js +1 -0
- package/dist/standalone/chunk-N7WQJPOM.js +1 -0
- package/dist/standalone/chunk-NF2Q75WM.js +1 -0
- package/dist/standalone/chunk-NGZNXNRD.js +1 -0
- package/dist/standalone/chunk-O3AZ7JKE.js +1 -0
- package/dist/standalone/chunk-OK2QU2EV.js +1 -0
- package/dist/standalone/{chunk-IH2CJZF2.js → chunk-ONTGYVAN.js} +1 -1
- package/dist/standalone/chunk-OP4QEV27.js +1 -0
- package/dist/standalone/chunk-OPIMGKWU.js +1 -0
- package/dist/standalone/chunk-OWRKSQPE.js +1 -0
- package/dist/standalone/chunk-P5EVJEGC.js +1 -0
- package/dist/standalone/chunk-PAZKX7I6.js +1 -0
- package/dist/standalone/chunk-PDBW6GTJ.js +1 -0
- package/dist/standalone/chunk-PJUVJTDR.js +1 -0
- package/dist/standalone/chunk-Q2J73V2C.js +2 -0
- package/dist/standalone/chunk-Q2KL457J.js +1 -0
- package/dist/standalone/chunk-QAOZXPLU.js +1 -0
- package/dist/standalone/{chunk-3PAYDWHN.js → chunk-QEFLZBT7.js} +2 -2
- package/dist/standalone/chunk-QKUVJIRX.js +1 -0
- package/dist/standalone/chunk-QNM2J7MG.js +1 -0
- package/dist/standalone/chunk-QRA7AKYO.js +1 -0
- package/dist/standalone/chunk-RCXNYW7P.js +1 -0
- package/dist/standalone/chunk-RE7GRXBM.js +1 -0
- package/dist/standalone/{chunk-TDVDZ7XQ.js → chunk-RIAOZECW.js} +1 -1
- package/dist/standalone/{chunk-LUHXNZI4.js → chunk-RTS5G3ET.js} +1 -1
- package/dist/standalone/chunk-S36FVTKK.js +1 -0
- package/dist/standalone/chunk-SR6CPTRT.js +1 -0
- package/dist/standalone/chunk-T3ZCW3RG.js +1 -0
- package/dist/standalone/chunk-TKBTZX4K.js +1 -0
- package/dist/standalone/chunk-TMWKF4XM.js +5 -0
- package/dist/standalone/chunk-TW4O2BA5.js +159 -0
- package/dist/standalone/chunk-UD5REVU2.js +1 -0
- package/dist/standalone/{chunk-PQH2LSJX.js → chunk-UQA2AJGI.js} +1 -1
- package/dist/standalone/chunk-UW6QNC74.js +3 -0
- package/dist/standalone/chunk-UXBNXITB.js +1 -0
- package/dist/standalone/chunk-UZ2ZXB74.js +1 -0
- package/dist/standalone/chunk-V3BE427M.js +1 -0
- package/dist/standalone/chunk-VHPTPEZ4.js +1 -0
- package/dist/standalone/chunk-W4LJQYCI.js +1 -0
- package/dist/standalone/chunk-WADY55J2.js +30 -0
- package/dist/standalone/chunk-WCWP4EAW.js +1 -0
- package/dist/standalone/chunk-X54WR7FF.js +1 -0
- package/dist/standalone/chunk-XWWQIAF6.js +1 -0
- package/dist/standalone/{chunk-SYGCASPT.js → chunk-Y2YLTUMD.js} +1 -1
- package/dist/standalone/chunk-YEVTA35E.js +1 -0
- package/dist/standalone/{chunk-R36QXQZX.js → chunk-YORPLSI5.js} +1 -1
- package/dist/standalone/chunk-YX2N5PJW.js +1 -0
- package/dist/standalone/chunk-Z57KMMOK.js +1 -0
- package/dist/standalone/chunk-ZFQ253FX.js +1 -0
- package/dist/standalone/chunk-ZG3IUVQ2.js +1 -0
- package/dist/standalone/chunk-ZKEYRU5C.js +1 -0
- package/dist/standalone/{chunk-5R2YO7HF.js → chunk-ZOKSVUID.js} +4 -4
- package/dist/standalone/{chunk-H7HZ42JY.js → chunk-ZPQBVYNN.js} +1 -1
- package/dist/standalone/chunk-ZSLKFLWE.js +1 -0
- package/dist/standalone/chunk-ZSWW2UGP.js +1 -0
- package/dist/standalone/studio.js +2 -2
- package/dist/styles.css +1 -1
- package/package.json +7 -6
- package/dist/packem_shared/ADMIN_FUNCTIONS-4aGsMs95.mjs +0 -1
- package/dist/packem_shared/Studio-MA8kKZLu.mjs +0 -1
- package/dist/packem_shared/advisor-view-tBumWci_.mjs +0 -1
- package/dist/packem_shared/error-alert-C0R39DO1.mjs +0 -1
- package/dist/packem_shared/recording-client-DAipTA_n.mjs +0 -1
- package/dist/packem_shared/studio-UhUrPz5J.mjs +0 -2
- package/dist/packem_shared/use-sql-assistant-rZPs3LC3.mjs +0 -1
- package/dist/standalone/chunk-2AH4ABE5.js +0 -1
- package/dist/standalone/chunk-2G57ENH5.js +0 -1
- package/dist/standalone/chunk-3GXPALXG.js +0 -1
- package/dist/standalone/chunk-3GYLOE4V.js +0 -1
- package/dist/standalone/chunk-473JK2PQ.js +0 -1
- package/dist/standalone/chunk-4C4THJUD.js +0 -1
- package/dist/standalone/chunk-4DAKKAK7.js +0 -1
- package/dist/standalone/chunk-4M57OYFX.js +0 -1
- package/dist/standalone/chunk-4SQBAPY6.js +0 -1
- package/dist/standalone/chunk-5DNGK3NT.js +0 -1
- package/dist/standalone/chunk-5GIQ6C5N.js +0 -1
- package/dist/standalone/chunk-5WJG7FMH.js +0 -1
- package/dist/standalone/chunk-63KDHS3H.js +0 -1
- package/dist/standalone/chunk-6B6ARRMI.js +0 -1
- package/dist/standalone/chunk-6LMO2D54.js +0 -1
- package/dist/standalone/chunk-6M7FLLMT.js +0 -1
- package/dist/standalone/chunk-6QEXGYWH.js +0 -1
- package/dist/standalone/chunk-6UTZXEW3.js +0 -1
- package/dist/standalone/chunk-6VAY6L4J.js +0 -1
- package/dist/standalone/chunk-7PADVGQX.js +0 -1
- package/dist/standalone/chunk-7RGYCU6F.js +0 -1
- package/dist/standalone/chunk-7UM5ROG6.js +0 -1
- package/dist/standalone/chunk-A566HCBX.js +0 -1
- package/dist/standalone/chunk-A5JISKHE.js +0 -1
- package/dist/standalone/chunk-ADNRFCMZ.js +0 -1
- package/dist/standalone/chunk-AP4PC2M4.js +0 -1
- package/dist/standalone/chunk-BFE2DRP6.js +0 -33
- package/dist/standalone/chunk-BPEB4KFE.js +0 -1
- package/dist/standalone/chunk-BVX45MU5.js +0 -7
- package/dist/standalone/chunk-C6GN7ZXJ.js +0 -1
- package/dist/standalone/chunk-CL2VZNDI.js +0 -1
- package/dist/standalone/chunk-CNA3TVUK.js +0 -1
- package/dist/standalone/chunk-CZ6HBDIL.js +0 -1
- package/dist/standalone/chunk-D6S7MXW4.js +0 -1
- package/dist/standalone/chunk-E26OT26O.js +0 -1
- package/dist/standalone/chunk-FCAXVYAX.js +0 -1
- package/dist/standalone/chunk-FXPAJDES.js +0 -1
- package/dist/standalone/chunk-HHRYM6UW.js +0 -1
- package/dist/standalone/chunk-HPRF5LMA.js +0 -1
- package/dist/standalone/chunk-IB22LETR.js +0 -1
- package/dist/standalone/chunk-IBJVVHV5.js +0 -1
- package/dist/standalone/chunk-IENQRRQT.js +0 -1
- package/dist/standalone/chunk-IQ4TTHQT.js +0 -1
- package/dist/standalone/chunk-ITH5LRWM.js +0 -1
- package/dist/standalone/chunk-J6VFG6M5.js +0 -1
- package/dist/standalone/chunk-JSDKOE4U.js +0 -1
- package/dist/standalone/chunk-JTGGWF7R.js +0 -1
- package/dist/standalone/chunk-JZD7ZN3F.js +0 -1
- package/dist/standalone/chunk-K3CWB3AM.js +0 -1
- package/dist/standalone/chunk-KNFB3FGW.js +0 -1
- package/dist/standalone/chunk-KNXWDE4N.js +0 -1
- package/dist/standalone/chunk-KRPXOSBL.js +0 -1
- package/dist/standalone/chunk-KRY7BYHT.js +0 -1
- package/dist/standalone/chunk-KYAG2YMF.js +0 -1
- package/dist/standalone/chunk-KZCEJFZF.js +0 -1
- package/dist/standalone/chunk-KZILJQX3.js +0 -8
- package/dist/standalone/chunk-LEYUH5TS.js +0 -1
- package/dist/standalone/chunk-LFM672WN.js +0 -1
- package/dist/standalone/chunk-LIGOLZND.js +0 -1
- package/dist/standalone/chunk-LPU6YTSU.js +0 -1
- package/dist/standalone/chunk-MWJC3S62.js +0 -1
- package/dist/standalone/chunk-NP2AQOLE.js +0 -1
- package/dist/standalone/chunk-NVKLYDOH.js +0 -1
- package/dist/standalone/chunk-O2X2XYCM.js +0 -1
- package/dist/standalone/chunk-O3MDWYXF.js +0 -1
- package/dist/standalone/chunk-ONG4JEZD.js +0 -1
- package/dist/standalone/chunk-OS26JXYA.js +0 -1
- package/dist/standalone/chunk-OXFKZ4BM.js +0 -1
- package/dist/standalone/chunk-PGTEGUAB.js +0 -1
- package/dist/standalone/chunk-PTBUWRBY.js +0 -1
- package/dist/standalone/chunk-Q6HA3L2H.js +0 -1
- package/dist/standalone/chunk-QGV5ARD2.js +0 -1
- package/dist/standalone/chunk-QWRK4ESB.js +0 -1
- package/dist/standalone/chunk-RL2ITK2N.js +0 -1
- package/dist/standalone/chunk-RTJO3AR4.js +0 -1
- package/dist/standalone/chunk-SFY646MC.js +0 -1
- package/dist/standalone/chunk-T5UMHPAB.js +0 -1
- package/dist/standalone/chunk-T6HV2FQP.js +0 -2
- package/dist/standalone/chunk-T7ZKNNGX.js +0 -1
- package/dist/standalone/chunk-TCYPNSTV.js +0 -1
- package/dist/standalone/chunk-TQM6XHBA.js +0 -1
- package/dist/standalone/chunk-TRMWBRRU.js +0 -1
- package/dist/standalone/chunk-TW7KJSMR.js +0 -15
- package/dist/standalone/chunk-TYD3V4NB.js +0 -1
- package/dist/standalone/chunk-TZKLK52W.js +0 -1
- package/dist/standalone/chunk-U4RXQSQ7.js +0 -1
- package/dist/standalone/chunk-UNZ2UBVL.js +0 -1
- package/dist/standalone/chunk-VJRNOSRY.js +0 -1
- package/dist/standalone/chunk-W2BCSK5S.js +0 -1
- package/dist/standalone/chunk-W7MRISE3.js +0 -1
- package/dist/standalone/chunk-WM72PRE3.js +0 -1
- package/dist/standalone/chunk-X4WHMCOZ.js +0 -1
- package/dist/standalone/chunk-X74GEPSG.js +0 -1
- package/dist/standalone/chunk-XKPD4SFN.js +0 -1
- package/dist/standalone/chunk-XMSNLMWU.js +0 -1
- package/dist/standalone/chunk-XOPFDWXX.js +0 -1
- package/dist/standalone/chunk-XQLOVFPP.js +0 -1
- package/dist/standalone/chunk-XSHYZPGF.js +0 -1
- package/dist/standalone/chunk-XST3UEHU.js +0 -1
- package/dist/standalone/chunk-XYR5NST4.js +0 -1
- package/dist/standalone/chunk-Y74LIFSL.js +0 -1
- package/dist/standalone/chunk-YHTHRYP5.js +0 -1
- package/dist/standalone/chunk-YMEKCV27.js +0 -1
- package/dist/standalone/chunk-Z5EV64KS.js +0 -1
- package/dist/standalone/chunk-ZBON5T5A.js +0 -1
- package/dist/standalone/chunk-ZGSL4DPP.js +0 -1
- package/dist/standalone/chunk-ZOQTXWPK.js +0 -1
- package/dist/standalone/chunk-ZTOREMGH.js +0 -1
- package/dist/standalone/chunk-ZZ5GICTF.js +0 -1
- /package/dist/standalone/{chunk-UYEZR3BI.js → chunk-P6VNMPWR.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{encodeWire as U,decodeWire as ee}from"@lunora/wire";import{useState as u,useEffect as te}from"react";import{ConfirmButton as re}from"../packem_shared/ConfirmButton-CIXYF6Mg.mjs";import{ShardInput as se}from"../packem_shared/ShardInput-CoySruKZ.mjs";import{B as z}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as k}from"../packem_shared/button-q0UYSmrn.mjs";import{I as ne}from"../packem_shared/input-CXhxesPC.mjs";import{L as R}from"../packem_shared/label-DKFzyHq6.mjs";import{T as oe}from"../packem_shared/textarea--40GKAyz.mjs";import{u as ae}from"../packem_shared/use-studio-client-DCA50tF2.mjs";import{useT as ie}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{ADMIN_FUNCTIONS as ce}from"../packem_shared/ADMIN_FUNCTIONS-
|
|
1
|
+
import{encodeWire as U,decodeWire as ee}from"@lunora/wire";import{useState as u,useEffect as te}from"react";import{ConfirmButton as re}from"../packem_shared/ConfirmButton-CIXYF6Mg.mjs";import{ShardInput as se}from"../packem_shared/ShardInput-CoySruKZ.mjs";import{B as z}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as k}from"../packem_shared/button-q0UYSmrn.mjs";import{I as ne}from"../packem_shared/input-CXhxesPC.mjs";import{L as R}from"../packem_shared/label-DKFzyHq6.mjs";import{T as oe}from"../packem_shared/textarea--40GKAyz.mjs";import{u as ae}from"../packem_shared/use-studio-client-DCA50tF2.mjs";import{useT as ie}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{ADMIN_FUNCTIONS as ce}from"../packem_shared/ADMIN_FUNCTIONS-DUXsXId1.mjs";import{b as J,h as le,f as de,k as ue,m as fe,c as he}from"../packem_shared/internal-hIuTpSbx.mjs";import{r as pe}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{jsxs as d,jsx as a}from"react/jsx-runtime";const me=t=>t.kind==="id"?t.table===void 0?"id":`id<${t.table}>`:t.kind==="array"?t.element===void 0?"array":`${t.element}[]`:t.kind,ge=t=>t===void 0||t.length===0?"()":`(${t.map(e=>`${e.name}${e.optional?"?":""}: ${me(e)}`).join(", ")})`,be=t=>{switch(t){case"array":return[];case"bigint":return U(0n);case"boolean":return!1;case"bytes":return U(new ArrayBuffer(0));case"number":return 0;case"object":case"record":return{};default:return""}},xe=t=>{const e={};for(const r of t??[])r.optional||(e[r.name]=be(r.kind));return JSON.stringify(e,void 0,2)},ye=he(ce.runAs),m="«sensitive»",ve=t=>(t??[]).filter(e=>e.sensitive===!0).map(e=>e.name),Ne=(t,e)=>{if(e.length===0)return t;try{const r=JSON.parse(t);if(typeof r!="object"||r===null||Array.isArray(r))return"";const i={...r};for(const n of e)Object.hasOwn(i,n)&&(i[n]=m);return JSON.stringify(i,null,2)}catch{return""}},Se=4,Ae=t=>{const e=t instanceof ArrayBuffer?new Uint8Array(t):new Uint8Array(t.buffer,t.byteOffset,t.byteLength);try{return new TextDecoder("utf-8",{fatal:!0}).decode(e)}catch{return}},we=t=>Array.isArray(t)?[]:Object.keys(t).filter(e=>e.length>0),ke=t=>{const e=[],r=new Set,i=[t];for(;i.length>0;){const n=i.pop();if(typeof n=="string")n.length>0&&e.push(n);else if(typeof n=="number"||typeof n=="bigint")e.push(String(n));else if(n instanceof ArrayBuffer||ArrayBuffer.isView(n)){const l=Ae(n);l!==void 0&&l.length>0&&e.push(l)}else typeof n=="object"&&n!==null&&!r.has(n)&&(r.add(n),e.push(...we(n)),i.push(...Object.values(n)))}return e},Re=(t,e)=>{const r=[],i=new Set,n=[[t,e]];for(;n.length>0;){const[l,o]=n.pop()??[void 0,void 0];typeof o=="boolean"?r.push({key:l,text:o?"true":"false"}):typeof o=="object"&&o!==null&&!i.has(o)&&(i.add(o),Array.isArray(o)?n.push(...o.map(h=>[void 0,h])):n.push(...Object.entries(o)))}return r},P=t=>t.replaceAll(/[$()*+.?[\\\]^{|}]/gu,String.raw`\$&`),Oe=(t,e)=>e.length>=Se?t.replaceAll(e,m):t.replaceAll(new RegExp(`(?<![A-Za-z0-9])${P(e)}(?![A-Za-z0-9])`,"gu"),m),Ie=(t,e)=>{const r=t.replaceAll(`"${e.text}"`,m);if(e.key===void 0)return r;const i=P(e.key);return r.replaceAll(new RegExp(`(?<![A-Za-z0-9_])${i}=${e.text}(?![A-Za-z0-9_])`,"gu"),`${e.key}=${m}`).replaceAll(new RegExp(String.raw`"${i}":\s*${e.text}(?![A-Za-z0-9_])`,"gu"),`"${e.key}":${m}`)},$e=(t,e,r)=>{if(r.length===0||typeof e!="object"||e===null)return t;const i=r.flatMap(o=>Re(o,e[o])),n=r.flatMap(o=>ke(e[o])).flatMap(o=>{const h=JSON.stringify(o).slice(1,-1);return h===o?[o]:[o,h]}).toSorted((o,h)=>h.length-o.length);let l=t;for(const o of i)l=Ie(l,o);for(const o of n)l=Oe(l,o);return l},Te=10,Ce=t=>t===void 0?"undefined":JSON.stringify(t,ue,2),Ee=(t,e)=>[{argsText:Ne(e.argsText,e.sensitive),at:Date.now(),id:(t[0]?.id??0)+1,kind:e.selected.kind,path:e.selected.path,redacted:e.sensitive.length>0,shardKey:e.shardKey,status:e.runStatus},...t].slice(0,Te),Ge=({functions:t,runAsIdentity:e=!1}={})=>{const r=ie(),i=ae(),[n,l]=u(null),[o,h]=u(null),S=t??n??[],[O,I]=u(""),[y,A]=u("{}"),[g,$]=u(""),[b,V]=u(""),[w,x]=u("idle"),[Z,v]=u(void 0),[T,N]=u(null),[C,q]=u([]);te(()=>{if(t!==void 0)return;let s=!1;return i.listFunctions().then(f=>(s||l(f),f)).catch(f=>{s||h(J(f))}),()=>{s=!0}},[i,t]);const E=O===""?S[0]?.path??"":O,c=S.find(s=>s.path===E),H=async()=>{if(!c)return;let s;try{s=y.trim()===""?{}:ee(JSON.parse(y))}catch(p){x("error"),v(void 0),N(r("Invalid JSON args: {message}",{message:p.message}));return}const f={__lunoraRef:c.path},L=g.trim()===""?{}:{shardKey:g.trim()},K=e?b.trim():"",D=ve(c.args),M=p=>{q(Q=>Ee(Q,{argsText:y,runStatus:p,selected:c,sensitive:D,shardKey:g}))};x("running"),N(null);try{const p=K===""?await fe(i,c.kind,f,s,L):await i.query(ye,{args:s,functionPath:c.path,userId:K},L);pe(g),v(p),x("success"),M("success")}catch(p){v(void 0),N($e(J(p),s,D)),x("error"),M("error")}},G=s=>{if(I(s.path),$(s.shardKey),s.redacted){v(void 0),N(r("Re-enter the sensitive values before running this again.")),x("error");return}A(s.argsText)},W=s=>{I(s.target.value)},X=s=>{A(s.target.value)},Y=s=>{V(s.target.value)},j=()=>{de(H())},B=e?b.trim():"",F=w==="running"||c===void 0,_=()=>{A(xe(c?.args))};return d("div",{className:"flex flex-col gap-4","data-testid":"lunora-function-runner",children:[o!==null&&a("p",{className:"text-sm text-destructive","data-testid":"function-discover-error",role:"alert",children:o}),d("div",{className:"flex flex-col gap-4 rounded-xl border border-border bg-card p-4",children:[d("div",{className:"flex flex-col gap-1.5",children:[a(R,{htmlFor:"function-select",children:r("Function")}),a("select",{"aria-label":r("Function"),className:"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50","data-testid":"function-select",id:"function-select",onChange:W,value:E,children:S.map(s=>d("option",{value:s.path,children:[s.path," (",s.kind,")"]},s.path))}),c!==void 0&&d("p",{className:"text-xs text-muted-foreground",children:[a("span",{className:"mr-1.5 font-medium",children:r("Signature")}),a("code",{className:"font-mono","data-testid":"function-signature",children:ge(c.args)})]})]}),d("div",{className:"flex flex-col gap-1.5",children:[d("div",{className:"flex items-center justify-between gap-2",children:[a(R,{htmlFor:"args-input",children:r("Arguments")}),a(k,{"data-testid":"prefill-button",disabled:c===void 0,onClick:_,size:"xs",type:"button",variant:"ghost",children:r("Prefill")})]}),a(oe,{"aria-label":r("Arguments"),className:"font-mono text-xs","data-testid":"args-input",id:"args-input",onChange:X,value:y})]}),a(se,{onChange:$,testId:"shard-input",value:g}),e&&d("div",{className:"flex flex-col gap-1.5","data-testid":"run-as-field",children:[a(R,{htmlFor:"run-as-input",children:r("Run as identity (userId)")}),a(ne,{"aria-label":r("Run as identity (userId)"),className:"font-mono text-xs","data-testid":"run-as-input",id:"run-as-input",onChange:Y,placeholder:r("Leave empty to run as admin"),value:b}),a("p",{className:"text-[11px] text-muted-foreground",children:r("Dev only: runs the function as this user so you can test auth and RLS. Forged over the admin gate.")})]}),d("div",{className:"flex flex-wrap items-center gap-2",children:[B!==""&&c!==void 0&&c.kind!=="query"?a(re,{confirmLabel:r("This will execute `{functionPath}` as user `{userId}`.",{functionPath:c.path,userId:B}),disabled:F,onConfirm:j,testId:"run-button",children:r("Run")}):a(k,{"data-testid":"run-button",disabled:F,onClick:j,type:"button",children:r("Run")}),c!==void 0&&a(z,{variant:"outline",children:c.kind}),e&&b.trim()!==""&&a(z,{"data-testid":"run-as-badge",variant:"secondary",children:r("as {userId}",{userId:b.trim()})})]})]}),w==="error"&&T!==null&&a("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs text-destructive","data-testid":"error",role:"alert",children:T}),w==="success"&&a("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs","data-testid":"result",children:Ce(Z)}),C.length>0&&a("ul",{className:"flex flex-col overflow-hidden rounded-xl border border-border","data-testid":"fn-history",children:C.map((s,f)=>d("li",{className:"flex flex-wrap items-center gap-2 border-b border-border px-3 py-2 text-sm last:border-b-0","data-testid":"fn-history-row",children:[a("span",{className:s.status==="success"?"text-success":"text-destructive","data-testid":`fn-history-status-${f.toString()}`,children:s.status==="success"?"✓":"✗"})," ",d("span",{className:"font-mono text-xs",children:[s.path," (",s.kind,")"]})," ",a("time",{className:"text-xs text-muted-foreground",children:le(s.at)})," ",a(k,{className:"ml-auto","data-testid":`fn-history-load-${f.toString()}`,onClick:()=>{G(s)},size:"xs",type:"button",variant:"ghost",children:r("Load")})]},s.id))})]})};export{Ge as FunctionRunner};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as Q}from"react/compiler-runtime";import{useState as U}from"react";import{E as V}from"../packem_shared/error-alert-
|
|
1
|
+
import{c as Q}from"react/compiler-runtime";import{useState as U}from"react";import{E as V}from"../packem_shared/error-alert-DKXm5h19.mjs";import{L as W}from"../packem_shared/live-status-D1GasNsH.mjs";import{ShardInput as G}from"../packem_shared/ShardInput-CoySruKZ.mjs";import{B as J}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as X}from"../packem_shared/button-q0UYSmrn.mjs";import{C as Y,a as Z}from"../packem_shared/card-By2O8ULa.mjs";import{E as ee}from"../packem_shared/empty-state-D7jEML_T.mjs";import{T as te,a as re,b as L,c as a,d as le,e as n}from"../packem_shared/table-D0SBiDu-.mjs";import{u as se}from"../packem_shared/use-admin-query-CaOm4JS3.mjs";import{u as ae}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as ne}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{ADMIN_FUNCTIONS as oe}from"../packem_shared/ADMIN_FUNCTIONS-DUXsXId1.mjs";import{h as ie}from"../packem_shared/internal-hIuTpSbx.mjs";import{c as j}from"../packem_shared/utils-bhneXptQ.mjs";import{jsx as t,jsxs as N}from"react/jsx-runtime";const ce={action:"outline",mutation:"default",query:"secondary"},q=r=>r<1e3?`${r<10?r.toFixed(1):Math.round(r).toString()}ms`:`${(r/1e3).toFixed(2)}s`,de=r=>r.calls===0?"—":r.errors===0?"0":`${r.errors.toString()} (${(r.errors/r.calls*100).toFixed(1)}%)`,me=r=>{const e=r.conflicts??0;return r.calls===0?"—":e===0?"0":`${e.toString()} (${(e/r.calls*100).toFixed(1)}%)`},ue={calls:(r,e)=>e.calls-r.calls,recent:(r,e)=>e.lastCalledAt-r.lastCalledAt,slowest:(r,e)=>e.maxDurationMs-r.maxDurationMs},Ae=r=>{const e=Q(49),{functions:F,initialShardKey:P}=r,s=ne(),{queryShardKey:o,setShardKey:S,shardKey:b}=ae(P),[i,H]=U("recent");let T;e[0]===Symbol.for("react.memo_cache_sentinel")?(T={},e[0]=T):T=e[0];let w;e[1]!==o?(w={live:!0,shardKey:o},e[1]=o,e[2]=w):w=e[2];const{data:O,error:c,errorSource:v,liveError:k}=se(oe.getFunctionStats,T,w),C=O?.functions??null;let K;e[3]!==F?(K=new Map((F??[]).map(fe)),e[3]=F,e[4]=K):K=e[4];const _=K;let E;e[5]===Symbol.for("react.memo_cache_sentinel")?(E=M=>{H(M.currentTarget.dataset.sort)},e[5]=E):E=e[5];const z=E;let $;if(e[6]!==c||e[7]!==v||e[8]!==_||e[9]!==k||e[10]!==o||e[11]!==S||e[12]!==b||e[13]!==i||e[14]!==C||e[15]!==s){const M=C===null?[]:C.toSorted(ue[i]);let d;e[17]!==s?(d=s("Recent"),e[17]=s,e[18]=d):d=e[18];let m;e[19]!==d?(m={key:"recent",label:d},e[19]=d,e[20]=m):m=e[20];let u;e[21]!==s?(u=s("Most called"),e[21]=s,e[22]=u):u=e[22];let f;e[23]!==u?(f={key:"calls",label:u},e[23]=u,e[24]=f):f=e[24];let h;e[25]!==s?(h=s("Slowest"),e[25]=s,e[26]=h):h=e[26];let p;e[27]!==h?(p={key:"slowest",label:h},e[27]=h,e[28]=p):p=e[28];let A;e[29]!==p||e[30]!==m||e[31]!==f?(A=[m,f,p],e[29]=p,e[30]=m,e[31]=f,e[32]=A):A=e[32];const D=A;let x;e[33]!==S||e[34]!==b?(x=t(G,{onChange:S,testId:"fs-shard-input",value:b}),e[33]=S,e[34]=b,e[35]=x):x=e[35];let g;e[36]!==k?(g=t(W,{message:k,prefix:"fs"}),e[36]=k,e[37]=g):g=e[37];let y;e[38]!==D||e[39]!==i?(y=t("div",{className:"ml-auto flex items-center gap-1",role:"group",children:D.map(l=>t(X,{"data-sort":l.key,"data-testid":`fs-sort-${l.key}`,onClick:z,size:"sm",type:"button",variant:i===l.key?"secondary":"ghost",children:l.label},l.key))}),e[38]=D,e[39]=i,e[40]=y):y=e[40];let B;e[41]!==x||e[42]!==g||e[43]!==y?(B=N("div",{className:"flex flex-wrap items-center gap-2",children:[x,g,y]}),e[41]=x,e[42]=g,e[43]=y,e[44]=B):B=e[44];let I;e[45]!==c||e[46]!==v||e[47]!==o?(I=c!==null&&t(V,{error:v,shardKey:o,testId:"fs-error"}),e[45]=c,e[46]=v,e[47]=o,e[48]=I):I=e[48],$=N("div",{className:"flex flex-col gap-4","data-testid":"lunora-function-stats",children:[B,I,C!==null&&M.length===0&&c===null&&t(ee,{description:s("Per-function call counts, error rates, and latency land here after your first request."),icon:N("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[t("path",{d:"M3 3v18h18"}),t("path",{d:"M7 14l4-4 3 3 5-6"})]}),testId:"fs-empty",title:s("No functions have run on this shard yet.")}),M.length>0&&t(Y,{className:"overflow-hidden py-0",children:t(Z,{className:"px-0",children:N(te,{"data-testid":"fs-table",children:[t(re,{children:N(L,{children:[t(a,{children:s("function")}),t(a,{children:s("kind")}),t(a,{className:"text-right",children:s("calls")}),t(a,{className:"text-right",children:s("errors")}),t(a,{className:"text-right",children:s("conflicts")}),t(a,{className:"text-right",children:s("avg")}),t(a,{className:"text-right",children:s("max")}),t(a,{children:s("last run")}),t(a,{children:s("last error")})]})}),t(le,{children:M.map(l=>{const R=_.get(l.path);return N(L,{"data-testid":`fs-row-${l.path}`,children:[t(n,{className:"font-medium",children:l.path}),t(n,{children:R===void 0?t("span",{className:"text-muted-foreground",children:"—"}):t(J,{variant:ce[R],children:R})}),t(n,{className:"text-right tabular-nums",children:l.calls}),t(n,{className:j("text-right tabular-nums",l.errors>0&&"text-destructive"),children:de(l)}),t(n,{className:j("text-right tabular-nums",(l.conflicts??0)>0&&"text-warning"),children:me(l)}),t(n,{className:"text-right tabular-nums",children:l.calls===0?"—":q(l.totalDurationMs/l.calls)}),t(n,{className:"text-right tabular-nums",children:l.calls===0?"—":q(l.maxDurationMs)}),t(n,{className:"text-muted-foreground",children:ie(l.lastCalledAt,"—")}),t(n,{className:"max-w-[24ch] truncate text-destructive",title:l.lastErrorMessage??void 0,children:l.lastErrorMessage??t("span",{className:"text-muted-foreground",children:"—"})})]},l.path)})})]})})})]}),e[6]=c,e[7]=v,e[8]=_,e[9]=k,e[10]=o,e[11]=S,e[12]=b,e[13]=i,e[14]=C,e[15]=s,e[16]=$}else $=e[16];return $};function fe(r){return[r.path,r.kind]}export{Ae as FunctionStatsPanel};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as se}from"react/compiler-runtime";import{useState as F,useRef as Z,useCallback as xe,useEffect as ie}from"react";import ve from"../packem_shared/ConnectionBadge-BfcoN-VE.mjs";import{L as Ne}from"../packem_shared/live-status-D1GasNsH.mjs";import{B as te}from"../packem_shared/badge-r_5B4LHP.mjs";import{C as X}from"../packem_shared/card-By2O8ULa.mjs";import{u as be}from"../packem_shared/use-admin-query-CaOm4JS3.mjs";import{u as Se}from"../packem_shared/use-studio-client-DCA50tF2.mjs";import{useT as le}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{ADMIN_FUNCTIONS as z}from"../packem_shared/ADMIN_FUNCTIONS-4aGsMs95.mjs";import{h as ye,f as ae,d as ce,b as ue,c as J}from"../packem_shared/internal-hIuTpSbx.mjs";import{l as Ee}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{c as W}from"../packem_shared/utils-bhneXptQ.mjs";import{jsx as a,jsxs as m}from"react/jsx-runtime";import{shardsToAggregate as we}from"../packem_shared/aggregateMetrics-DKFJc-o5.mjs";import{S as ne}from"../packem_shared/sparkline-B_sPPO_8.mjs";const Te={crit:"destructive",ok:"secondary",warn:"default"},re=(s,e)=>e===0?"—":`${(s/e*100).toFixed(1)}%`,oe=(s,e,l)=>Number.isNaN(s)?"ok":s>=l?"crit":s>=e?"warn":"ok",me=.01,he=.05,_e=s=>{const e=se(36),{errorCount:l,logsError:t,topErrors:r,worstFunctions:c}=s,i=le();let n;e[0]!==i?(n=i("Functions by error rate"),e[0]=i,e[1]=n):n=e[1];let o;e[2]!==n?(o=a("header",{className:"border-b border-border px-4 py-3",children:a("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:n})}),e[2]=n,e[3]=o):o=e[3];let d;e[4]!==i||e[5]!==c?(d=c.length===0?a("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"hl-functions-empty",children:i("No function activity yet.")}):a("ul",{className:"divide-y divide-border",children:c.map(b=>m("li",{className:"flex flex-wrap items-center justify-between gap-2 px-4 py-2 text-xs","data-testid":"hl-fn-row",children:[a("span",{className:"truncate font-mono text-foreground",children:b.path}),m("span",{className:"flex shrink-0 items-center gap-2",children:[a("span",{className:"tabular-nums text-muted-foreground",children:i("{count} calls",{count:b.calls.toString()})}),a(te,{variant:Te[oe(b.errors/b.calls,me,he)],children:re(b.errors,b.calls)})]})]},b.path))}),e[4]=i,e[5]=c,e[6]=d):d=e[6];let p;e[7]!==o||e[8]!==d?(p=m(X,{className:"gap-0 py-0","data-testid":"hl-functions",children:[o,d]}),e[7]=o,e[8]=d,e[9]=p):p=e[9];let x;e[10]!==i?(x=i("Recent errors"),e[10]=i,e[11]=x):x=e[11];let f;e[12]!==x?(f=a("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:x}),e[12]=x,e[13]=f):f=e[13];const u=l>0?"destructive":"outline";let g;e[14]!==l||e[15]!==u?(g=a(te,{"data-testid":"hl-error-count",variant:u,children:l}),e[14]=l,e[15]=u,e[16]=g):g=e[16];let h;e[17]!==f||e[18]!==g?(h=m("header",{className:"flex items-center justify-between gap-2 border-b border-border px-4 py-3",children:[f,g]}),e[17]=f,e[18]=g,e[19]=h):h=e[19];let E;e[20]!==t?(E=t!==null&&a("p",{className:"px-4 py-8 text-center text-sm text-destructive","data-testid":"hl-logs-error",role:"alert",children:t}),e[20]=t,e[21]=E):E=e[21];let w;e[22]!==t||e[23]!==i||e[24]!==r.length?(w=t===null&&r.length===0&&a("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"hl-errors-empty",children:i("No recent errors.")}),e[22]=t,e[23]=i,e[24]=r.length,e[25]=w):w=e[25];let T;e[26]!==r?(T=r.length>0&&a("ul",{className:"divide-y divide-border",children:r.map(Ae)}),e[26]=r,e[27]=T):T=e[27];let S;e[28]!==E||e[29]!==w||e[30]!==T||e[31]!==h?(S=m(X,{className:"gap-0 py-0",children:[h,E,w,T]}),e[28]=E,e[29]=w,e[30]=T,e[31]=h,e[32]=S):S=e[32];let y;return e[33]!==S||e[34]!==p?(y=m("div",{className:"grid gap-3 lg:grid-cols-2",children:[p,S]}),e[33]=S,e[34]=p,e[35]=y):y=e[35],y};function Ae(s,e){return m("li",{className:"flex flex-col gap-0.5 px-4 py-2 text-xs","data-testid":"hl-error-row",children:[m("span",{className:"flex items-center gap-2",children:[a("time",{className:"shrink-0 text-muted-foreground",children:ye(s.timestamp)}),s.functionPath!==void 0&&a("span",{className:"truncate font-mono text-foreground",children:s.functionPath})]}),a("span",{className:"text-destructive",children:s.message})]},`${s.timestamp.toString()}-${e.toString()}`)}const de={completed:0,failed:2,in_progress:1},ke=s=>{let e=0,l=0,t=0,r=0,c=!1;const i=[];for(const{metrics:n}of s){if(n===null){r+=1;continue}t+=1,e+=n.requests,l+=n.errors,i.push(...n.history??[]),c||=n.historyTruncated===!0}return{errors:l,failed:r,history:i,historyTruncated:c,reachable:t,requests:e}},Re=s=>{const e=new Map;for(const l of s)for(const t of l){const r=e.get(t.path);if(r===void 0){e.set(t.path,{...t});continue}r.calls+=t.calls,r.errors+=t.errors,r.totalDurationMs+=t.totalDurationMs,r.scans=(r.scans??0)+(t.scans??0),r.maxDurationMs=Math.max(r.maxDurationMs,t.maxDurationMs),r.lastCalledAt=Math.max(r.lastCalledAt,t.lastCalledAt),(t.lastErrorAt??0)>(r.lastErrorAt??0)&&(r.lastErrorAt=t.lastErrorAt,r.lastErrorMessage=t.lastErrorMessage)}return[...e.values()]},Me=s=>{const e=new Map;for(const l of s)for(const t of l){const r=e.get(t.id);if(r===void 0){e.set(t.id,t);continue}const c=de[t.status]-de[r.status];(c>0||c===0&&(t.updatedAt??0)>(r.updatedAt??0))&&e.set(t.id,t)}return[...e.values()]},Le=J(z.getAuthMetrics),Ie=J(z.getFunctionStats),Ce=J(z.getLogs),qe=J(z.getMetrics),Oe=J(z.migrationStatus),Fe=5,fe=2e3,De=5,je=.1,Ue=.3,Pe=1,Ge=50,$e=(s,e,l)=>s>=l?"crit":s>=e?"warn":"ok",Be=s=>{const e=new Map;for(const t of s??[]){const r=e.get(t.bucketMs)??{calls:0,errors:0};r.calls+=t.calls,r.errors+=t.errors,e.set(t.bucketMs,r)}const l=[...e.entries()].toSorted((t,r)=>t[0]-r[0]);return{errors:l.map(([,t])=>t.errors),requests:l.map(([,t])=>t.calls)}},Ve=s=>{let e=0,l=0;for(const r of s)r.status==="failed"?e+=1:r.status==="in_progress"&&(l+=1);let t="ok";return e>0?t="crit":l>0&&(t="warn"),{failed:e,level:t,running:l}},He=(s,e)=>s.failed>0?e("{count} failed",{count:s.failed.toString()}):s.running>0?e("{count} running",{count:s.running.toString()}):e("OK"),pe={crit:"bg-destructive",ok:"bg-success",warn:"bg-warning"},ge={crit:"text-destructive",ok:"text-foreground",warn:"text-warning"},Ke={crit:"bg-destructive/10 text-destructive",ok:"bg-success/10 text-success",warn:"bg-warning/10 text-warning"},ze=s=>s.includes("crit")?"crit":s.includes("warn")?"warn":"ok",ee=s=>{const e=se(19),{chart:l,label:t,level:r,testId:c,value:i}=s,n=pe[r];let o;e[0]!==n?(o=W("size-1.5 shrink-0 rounded-full",n),e[0]=n,e[1]=o):o=e[1];let d;e[2]!==o?(d=a("span",{"aria-hidden":"true",className:o}),e[2]=o,e[3]=d):d=e[3];let p;e[4]!==t||e[5]!==d?(p=m("span",{className:"flex items-center gap-1.5 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:[d,t]}),e[4]=t,e[5]=d,e[6]=p):p=e[6];const x=ge[r];let f;e[7]!==x?(f=W("truncate text-2xl font-semibold tabular-nums",x),e[7]=x,e[8]=f):f=e[8];let u;e[9]!==f||e[10]!==c||e[11]!==i?(u=a("span",{className:f,"data-testid":c,children:i}),e[9]=f,e[10]=c,e[11]=i,e[12]=u):u=e[12];let g;e[13]!==l||e[14]!==u?(g=m("div",{className:"flex items-center justify-between gap-3",children:[u,l]}),e[13]=l,e[14]=u,e[15]=g):g=e[15];let h;return e[16]!==p||e[17]!==g?(h=a(X,{className:"gap-0 py-0",children:m("div",{className:"flex flex-col gap-2.5 p-4",children:[p,g]})}),e[16]=p,e[17]=g,e[18]=h):h=e[18],h},Qe=async(s,e,l)=>{const t=await Promise.all(l.map(f=>{const u=ce(f);return Promise.allSettled([s.query(qe,{},u),s.query(Ie,{},u),s.query(Oe,{},u)])})),r=ce(e),c=typeof s.schedulerStatus=="function"?s.schedulerStatus():Promise.reject(new Error("scheduler status unavailable")),[i,n,o]=await Promise.allSettled([s.query(Ce,{},r),s.query(Le,{},r),c]),d=t.map(([f,u,g])=>({functions:u.status==="fulfilled"?u.value.functions:[],metrics:f.status==="fulfilled"?f.value:null,migrations:g.status==="fulfilled"?g.value.migrations:[]})),p=ke(d),x=t[0]?.[0];return{auth:n.status==="fulfilled"?n.value:null,entries:i.status==="fulfilled"?i.value.entries:[],functions:Re(d.map(f=>f.functions)),logsError:i.status==="rejected"?ue(i.reason):null,metricsError:p.reachable===0&&x?.status==="rejected"?ue(x.reason):null,migrations:Me(d.map(f=>f.migrations)),scheduler:o.status==="fulfilled"?o.value:null,totals:p}},We=s=>{const e=s?.history??[];return{attempts:e.map(l=>l.attempts),failures:e.map(l=>l.failures)}},Xe=(s,e)=>s==="crit"?{description:e("One or more service levels are breached."),label:e("Critical")}:s==="warn"?{description:e("Some service levels need attention."),label:e("Degraded")}:{description:e("All service levels are within target."),label:e("All systems healthy")},Je=s=>{const e=se(75),{errorLevel:l,liveError:t,metricsError:r,overall:c,requestSeries:i,totals:n}=s,o=le();let d;e[0]!==c||e[1]!==o?(d=Xe(c,o),e[0]=c,e[1]=o,e[2]=d):d=e[2];const{description:p,label:x}=d,f=Ke[c];let u;e[3]!==f?(u=W("flex size-10 shrink-0 items-center justify-center rounded-full",f),e[3]=f,e[4]=u):u=e[4];const g=pe[c];let h;e[5]!==g?(h=W("size-3 rounded-full",g),e[5]=g,e[6]=h):h=e[6];let E;e[7]!==h?(E=a("span",{className:h}),e[7]=h,e[8]=E):E=e[8];let w;e[9]!==u||e[10]!==E?(w=a("span",{"aria-hidden":"true",className:u,children:E}),e[9]=u,e[10]=E,e[11]=w):w=e[11];let T;e[12]!==x?(T=a("span",{className:"text-sm font-semibold text-foreground","data-testid":"hl-status",children:x}),e[12]=x,e[13]=T):T=e[13];let S;e[14]!==p?(S=a("span",{className:"text-[13px] text-muted-foreground",children:p}),e[14]=p,e[15]=S):S=e[15];let y;e[16]!==T||e[17]!==S?(y=m("div",{className:"grid leading-tight",children:[T,S]}),e[16]=T,e[17]=S,e[18]=y):y=e[18];let b;e[19]!==y||e[20]!==w?(b=m("div",{className:"flex items-center gap-3",children:[w,y]}),e[19]=y,e[20]=w,e[21]=b):b=e[21];let k;e[22]!==o?(k=o("Requests"),e[22]=o,e[23]=k):k=e[23];let _;e[24]!==k?(_=a("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:k}),e[24]=k,e[25]=_):_=e[25];let A;e[26]!==i||e[27]!==o?(A=i.length>=2&&a(ne,{ariaLabel:o("Requests over time"),className:"h-6 w-20 text-foreground",series:i,testId:"hl-spark-requests"}),e[26]=i,e[27]=o,e[28]=A):A=e[28];const D=n?.requests??0;let j;e[29]!==D?(j=D.toString(),e[29]=D,e[30]=j):j=e[30];let I;e[31]!==j?(I=a("span",{className:"text-lg font-semibold tabular-nums text-foreground","data-testid":"hl-requests",children:j}),e[31]=j,e[32]=I):I=e[32];let U;e[33]!==A||e[34]!==I?(U=m("div",{className:"flex items-center justify-end gap-2",children:[A,I]}),e[33]=A,e[34]=I,e[35]=U):U=e[35];let C;e[36]!==_||e[37]!==U?(C=m("div",{className:"text-end",children:[_,U]}),e[36]=_,e[37]=U,e[38]=C):C=e[38];let $;e[39]===Symbol.for("react.memo_cache_sentinel")?($=a("span",{"aria-hidden":"true",className:"h-9 w-px bg-border"}),e[39]=$):$=e[39];let R;e[40]!==o?(R=o("Error rate"),e[40]=o,e[41]=R):R=e[41];let q;e[42]!==R?(q=a("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:R}),e[42]=R,e[43]=q):q=e[43];const Q=ge[l];let M;e[44]!==Q?(M=W("text-lg font-semibold tabular-nums",Q),e[44]=Q,e[45]=M):M=e[45];let P;e[46]!==n?(P=n===null?"—":re(n.errors,n.requests),e[46]=n,e[47]=P):P=e[47];let L;e[48]!==M||e[49]!==P?(L=a("div",{className:M,"data-testid":"hl-error-rate",children:P}),e[48]=M,e[49]=P,e[50]=L):L=e[50];let O;e[51]!==q||e[52]!==L?(O=m("div",{className:"text-end",children:[q,L]}),e[51]=q,e[52]=L,e[53]=O):O=e[53];let G;e[54]===Symbol.for("react.memo_cache_sentinel")?(G=a("span",{"aria-hidden":"true",className:"h-9 w-px bg-border"}),e[54]=G):G=e[54];let B;e[55]===Symbol.for("react.memo_cache_sentinel")?(B=a(ve,{}),e[55]=B):B=e[55];let v;e[56]!==t?(v=m("div",{className:"flex items-center gap-2",children:[B,a(Ne,{message:t,prefix:"hl"})]}),e[56]=t,e[57]=v):v=e[57];let N;e[58]!==C||e[59]!==O||e[60]!==v?(N=m("div",{className:"flex flex-wrap items-center gap-4",children:[C,$,O,G,v]}),e[58]=C,e[59]=O,e[60]=v,e[61]=N):N=e[61];let V;e[62]!==b||e[63]!==N?(V=m("div",{className:"flex flex-wrap items-center justify-between gap-4 p-4",children:[b,N]}),e[62]=b,e[63]=N,e[64]=V):V=e[64];let H;e[65]!==r?(H=r!==null&&a("div",{className:"border-t border-border bg-destructive/5 px-4 py-2 text-sm text-destructive","data-testid":"hl-metrics-error",role:"alert",children:r}),e[65]=r,e[66]=H):H=e[66];let K;e[67]!==r||e[68]!==o||e[69]!==n?.historyTruncated?(K=r===null&&n?.historyTruncated===!0&&a("div",{className:"border-t border-border bg-warning/5 px-4 py-2 text-sm text-muted-foreground","data-testid":"hl-history-truncated",children:o("Showing a partial request/error history — one or more shards have more data than the trend chart can display.")}),e[67]=r,e[68]=o,e[69]=n?.historyTruncated,e[70]=K):K=e[70];let Y;return e[71]!==V||e[72]!==H||e[73]!==K?(Y=m(X,{className:"gap-0 py-0",children:[V,H,K]}),e[71]=V,e[72]=H,e[73]=K,e[74]=Y):Y=e[74],Y},Ye=s=>{const e=se(14),{shards:l}=s,t=le();let r;e[0]!==t?(r=t("Shards seen"),e[0]=t,e[1]=r):r=e[1];let c;e[2]!==r?(c=a("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r}),e[2]=r,e[3]=c):c=e[3];let i;e[4]!==l.length?(i=a(te,{"data-testid":"hl-shard-count",variant:"outline",children:l.length}),e[4]=l.length,e[5]=i):i=e[5];let n;e[6]!==c||e[7]!==i?(n=m("header",{className:"flex items-center justify-between gap-2 border-b border-border px-4 py-3",children:[c,i]}),e[6]=c,e[7]=i,e[8]=n):n=e[8];let o;e[9]!==l?(o=l.length>0&&a("ul",{className:"flex flex-wrap gap-1.5 p-4",children:l.map(Ze)}),e[9]=l,e[10]=o):o=e[10];let d;return e[11]!==n||e[12]!==o?(d=m(X,{className:"gap-0 py-0",children:[n,o]}),e[11]=n,e[12]=o,e[13]=d):d=e[13],d},gt=({initialShardKey:s})=>{const e=Se(),l=le(),[t,r]=F([]),[c,i]=F(null),[n,o]=F(null),[d,p]=F(null),[x,f]=F([]),[u,g]=F(null),[h,E]=F(null),[w,T]=F([]),[S]=F(Ee),y=Z(!1),b=Z(0),k=Z(0),_=Z(null),A=s??"",D=xe(async()=>{if(y.current)return;y.current=!0;const v=b.current,N=await Qe(e,A,we(A,S));v===b.current&&(o(N.totals),p(N.metricsError),f(N.functions),T(N.migrations),r(N.entries),i(N.logsError),g(N.auth),E(N.scheduler),y.current=!1)},[e,S,A]);ie(()=>(ae(D()),()=>{b.current+=1,y.current=!1,_.current!==null&&(clearTimeout(_.current),_.current=null)}),[D]);const j=()=>{const v=Date.now()-k.current;if(v>=fe){k.current=Date.now(),ae(D());return}_.current===null&&(_.current=setTimeout(()=>{_.current=null,k.current=Date.now(),ae(D())},fe-v))},{data:I,liveError:U}=be(z.getMetrics,{},{live:!0,shardKey:A});ie(()=>{I!==void 0&&j()},[I]);const C=t.filter(v=>v.level==="error"),$=C.slice(0,Fe),R=Be(n?.history),q=We(u),Q=x.filter(v=>v.calls>0).toSorted((v,N)=>N.errors/N.calls-v.errors/v.calls||N.calls-v.calls).slice(0,De),M=Ve(w),P=n===null||n.requests===0?0:n.errors/n.requests,L=oe(P,me,he),O=u===null?"ok":oe(u.failureRate,je,Ue),G=h===null?"ok":$e(h.backlog,Pe,Ge),B=ze([L,O,G,M.level]);return m("div",{className:"flex flex-col gap-6","data-testid":"lunora-health",children:[a(Je,{errorLevel:L,liveError:U,metricsError:d,overall:B,requestSeries:R.requests,totals:n}),m("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-4","data-testid":"hl-slo",children:[a(ee,{chart:R.errors.length>=2?a(ne,{ariaLabel:l("Errors over time"),className:"h-7 w-20 text-destructive",series:R.errors,testId:"hl-spark-errors"}):void 0,label:l("Error rate"),level:L,testId:"hl-slo-errorrate",value:n===null?"—":re(n.errors,n.requests)}),a(ee,{chart:q.failures.length>=2?a(ne,{ariaLabel:l("Auth failures over time"),className:"h-7 w-20 text-destructive",series:q.failures,testId:"hl-spark-auth"}):void 0,label:l("Auth failures"),level:O,testId:"hl-slo-auth",value:u===null?"—":re(u.failures,u.attempts)}),a(ee,{label:l("Scheduler backlog"),level:G,testId:"hl-slo-backlog",value:h===null?"—":h.backlog.toString()}),a(ee,{label:l("Migrations"),level:M.level,testId:"hl-slo-migrations",value:He(M,l)})]}),a(_e,{errorCount:C.length,logsError:c,topErrors:$,worstFunctions:Q}),a(Ye,{shards:S})]})};function Ze(s){return a("li",{"data-testid":"hl-shard",children:a(te,{variant:"secondary",children:s})},s)}export{gt as HealthPanel};
|
|
1
|
+
import{c as se}from"react/compiler-runtime";import{useState as F,useRef as Z,useCallback as xe,useEffect as ie}from"react";import ve from"../packem_shared/ConnectionBadge-BfcoN-VE.mjs";import{L as Ne}from"../packem_shared/live-status-D1GasNsH.mjs";import{B as te}from"../packem_shared/badge-r_5B4LHP.mjs";import{C as X}from"../packem_shared/card-By2O8ULa.mjs";import{u as be}from"../packem_shared/use-admin-query-CaOm4JS3.mjs";import{u as Se}from"../packem_shared/use-studio-client-DCA50tF2.mjs";import{useT as le}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{ADMIN_FUNCTIONS as z}from"../packem_shared/ADMIN_FUNCTIONS-DUXsXId1.mjs";import{h as ye,f as ae,d as ce,b as ue,c as J}from"../packem_shared/internal-hIuTpSbx.mjs";import{l as Ee}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{c as W}from"../packem_shared/utils-bhneXptQ.mjs";import{jsx as a,jsxs as m}from"react/jsx-runtime";import{shardsToAggregate as we}from"../packem_shared/aggregateMetrics-DKFJc-o5.mjs";import{S as ne}from"../packem_shared/sparkline-B_sPPO_8.mjs";const Te={crit:"destructive",ok:"secondary",warn:"default"},re=(s,e)=>e===0?"—":`${(s/e*100).toFixed(1)}%`,oe=(s,e,l)=>Number.isNaN(s)?"ok":s>=l?"crit":s>=e?"warn":"ok",me=.01,he=.05,_e=s=>{const e=se(36),{errorCount:l,logsError:t,topErrors:r,worstFunctions:c}=s,i=le();let n;e[0]!==i?(n=i("Functions by error rate"),e[0]=i,e[1]=n):n=e[1];let o;e[2]!==n?(o=a("header",{className:"border-b border-border px-4 py-3",children:a("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:n})}),e[2]=n,e[3]=o):o=e[3];let d;e[4]!==i||e[5]!==c?(d=c.length===0?a("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"hl-functions-empty",children:i("No function activity yet.")}):a("ul",{className:"divide-y divide-border",children:c.map(b=>m("li",{className:"flex flex-wrap items-center justify-between gap-2 px-4 py-2 text-xs","data-testid":"hl-fn-row",children:[a("span",{className:"truncate font-mono text-foreground",children:b.path}),m("span",{className:"flex shrink-0 items-center gap-2",children:[a("span",{className:"tabular-nums text-muted-foreground",children:i("{count} calls",{count:b.calls.toString()})}),a(te,{variant:Te[oe(b.errors/b.calls,me,he)],children:re(b.errors,b.calls)})]})]},b.path))}),e[4]=i,e[5]=c,e[6]=d):d=e[6];let p;e[7]!==o||e[8]!==d?(p=m(X,{className:"gap-0 py-0","data-testid":"hl-functions",children:[o,d]}),e[7]=o,e[8]=d,e[9]=p):p=e[9];let x;e[10]!==i?(x=i("Recent errors"),e[10]=i,e[11]=x):x=e[11];let f;e[12]!==x?(f=a("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:x}),e[12]=x,e[13]=f):f=e[13];const u=l>0?"destructive":"outline";let g;e[14]!==l||e[15]!==u?(g=a(te,{"data-testid":"hl-error-count",variant:u,children:l}),e[14]=l,e[15]=u,e[16]=g):g=e[16];let h;e[17]!==f||e[18]!==g?(h=m("header",{className:"flex items-center justify-between gap-2 border-b border-border px-4 py-3",children:[f,g]}),e[17]=f,e[18]=g,e[19]=h):h=e[19];let E;e[20]!==t?(E=t!==null&&a("p",{className:"px-4 py-8 text-center text-sm text-destructive","data-testid":"hl-logs-error",role:"alert",children:t}),e[20]=t,e[21]=E):E=e[21];let w;e[22]!==t||e[23]!==i||e[24]!==r.length?(w=t===null&&r.length===0&&a("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"hl-errors-empty",children:i("No recent errors.")}),e[22]=t,e[23]=i,e[24]=r.length,e[25]=w):w=e[25];let T;e[26]!==r?(T=r.length>0&&a("ul",{className:"divide-y divide-border",children:r.map(Ae)}),e[26]=r,e[27]=T):T=e[27];let S;e[28]!==E||e[29]!==w||e[30]!==T||e[31]!==h?(S=m(X,{className:"gap-0 py-0",children:[h,E,w,T]}),e[28]=E,e[29]=w,e[30]=T,e[31]=h,e[32]=S):S=e[32];let y;return e[33]!==S||e[34]!==p?(y=m("div",{className:"grid gap-3 lg:grid-cols-2",children:[p,S]}),e[33]=S,e[34]=p,e[35]=y):y=e[35],y};function Ae(s,e){return m("li",{className:"flex flex-col gap-0.5 px-4 py-2 text-xs","data-testid":"hl-error-row",children:[m("span",{className:"flex items-center gap-2",children:[a("time",{className:"shrink-0 text-muted-foreground",children:ye(s.timestamp)}),s.functionPath!==void 0&&a("span",{className:"truncate font-mono text-foreground",children:s.functionPath})]}),a("span",{className:"text-destructive",children:s.message})]},`${s.timestamp.toString()}-${e.toString()}`)}const de={completed:0,failed:2,in_progress:1},ke=s=>{let e=0,l=0,t=0,r=0,c=!1;const i=[];for(const{metrics:n}of s){if(n===null){r+=1;continue}t+=1,e+=n.requests,l+=n.errors,i.push(...n.history??[]),c||=n.historyTruncated===!0}return{errors:l,failed:r,history:i,historyTruncated:c,reachable:t,requests:e}},Re=s=>{const e=new Map;for(const l of s)for(const t of l){const r=e.get(t.path);if(r===void 0){e.set(t.path,{...t});continue}r.calls+=t.calls,r.errors+=t.errors,r.totalDurationMs+=t.totalDurationMs,r.scans=(r.scans??0)+(t.scans??0),r.maxDurationMs=Math.max(r.maxDurationMs,t.maxDurationMs),r.lastCalledAt=Math.max(r.lastCalledAt,t.lastCalledAt),(t.lastErrorAt??0)>(r.lastErrorAt??0)&&(r.lastErrorAt=t.lastErrorAt,r.lastErrorMessage=t.lastErrorMessage)}return[...e.values()]},Me=s=>{const e=new Map;for(const l of s)for(const t of l){const r=e.get(t.id);if(r===void 0){e.set(t.id,t);continue}const c=de[t.status]-de[r.status];(c>0||c===0&&(t.updatedAt??0)>(r.updatedAt??0))&&e.set(t.id,t)}return[...e.values()]},Le=J(z.getAuthMetrics),Ie=J(z.getFunctionStats),Ce=J(z.getLogs),qe=J(z.getMetrics),Oe=J(z.migrationStatus),Fe=5,fe=2e3,De=5,je=.1,Ue=.3,Pe=1,Ge=50,$e=(s,e,l)=>s>=l?"crit":s>=e?"warn":"ok",Be=s=>{const e=new Map;for(const t of s??[]){const r=e.get(t.bucketMs)??{calls:0,errors:0};r.calls+=t.calls,r.errors+=t.errors,e.set(t.bucketMs,r)}const l=[...e.entries()].toSorted((t,r)=>t[0]-r[0]);return{errors:l.map(([,t])=>t.errors),requests:l.map(([,t])=>t.calls)}},Ve=s=>{let e=0,l=0;for(const r of s)r.status==="failed"?e+=1:r.status==="in_progress"&&(l+=1);let t="ok";return e>0?t="crit":l>0&&(t="warn"),{failed:e,level:t,running:l}},He=(s,e)=>s.failed>0?e("{count} failed",{count:s.failed.toString()}):s.running>0?e("{count} running",{count:s.running.toString()}):e("OK"),pe={crit:"bg-destructive",ok:"bg-success",warn:"bg-warning"},ge={crit:"text-destructive",ok:"text-foreground",warn:"text-warning"},Ke={crit:"bg-destructive/10 text-destructive",ok:"bg-success/10 text-success",warn:"bg-warning/10 text-warning"},ze=s=>s.includes("crit")?"crit":s.includes("warn")?"warn":"ok",ee=s=>{const e=se(19),{chart:l,label:t,level:r,testId:c,value:i}=s,n=pe[r];let o;e[0]!==n?(o=W("size-1.5 shrink-0 rounded-full",n),e[0]=n,e[1]=o):o=e[1];let d;e[2]!==o?(d=a("span",{"aria-hidden":"true",className:o}),e[2]=o,e[3]=d):d=e[3];let p;e[4]!==t||e[5]!==d?(p=m("span",{className:"flex items-center gap-1.5 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:[d,t]}),e[4]=t,e[5]=d,e[6]=p):p=e[6];const x=ge[r];let f;e[7]!==x?(f=W("truncate text-2xl font-semibold tabular-nums",x),e[7]=x,e[8]=f):f=e[8];let u;e[9]!==f||e[10]!==c||e[11]!==i?(u=a("span",{className:f,"data-testid":c,children:i}),e[9]=f,e[10]=c,e[11]=i,e[12]=u):u=e[12];let g;e[13]!==l||e[14]!==u?(g=m("div",{className:"flex items-center justify-between gap-3",children:[u,l]}),e[13]=l,e[14]=u,e[15]=g):g=e[15];let h;return e[16]!==p||e[17]!==g?(h=a(X,{className:"gap-0 py-0",children:m("div",{className:"flex flex-col gap-2.5 p-4",children:[p,g]})}),e[16]=p,e[17]=g,e[18]=h):h=e[18],h},Qe=async(s,e,l)=>{const t=await Promise.all(l.map(f=>{const u=ce(f);return Promise.allSettled([s.query(qe,{},u),s.query(Ie,{},u),s.query(Oe,{},u)])})),r=ce(e),c=typeof s.schedulerStatus=="function"?s.schedulerStatus():Promise.reject(new Error("scheduler status unavailable")),[i,n,o]=await Promise.allSettled([s.query(Ce,{},r),s.query(Le,{},r),c]),d=t.map(([f,u,g])=>({functions:u.status==="fulfilled"?u.value.functions:[],metrics:f.status==="fulfilled"?f.value:null,migrations:g.status==="fulfilled"?g.value.migrations:[]})),p=ke(d),x=t[0]?.[0];return{auth:n.status==="fulfilled"?n.value:null,entries:i.status==="fulfilled"?i.value.entries:[],functions:Re(d.map(f=>f.functions)),logsError:i.status==="rejected"?ue(i.reason):null,metricsError:p.reachable===0&&x?.status==="rejected"?ue(x.reason):null,migrations:Me(d.map(f=>f.migrations)),scheduler:o.status==="fulfilled"?o.value:null,totals:p}},We=s=>{const e=s?.history??[];return{attempts:e.map(l=>l.attempts),failures:e.map(l=>l.failures)}},Xe=(s,e)=>s==="crit"?{description:e("One or more service levels are breached."),label:e("Critical")}:s==="warn"?{description:e("Some service levels need attention."),label:e("Degraded")}:{description:e("All service levels are within target."),label:e("All systems healthy")},Je=s=>{const e=se(75),{errorLevel:l,liveError:t,metricsError:r,overall:c,requestSeries:i,totals:n}=s,o=le();let d;e[0]!==c||e[1]!==o?(d=Xe(c,o),e[0]=c,e[1]=o,e[2]=d):d=e[2];const{description:p,label:x}=d,f=Ke[c];let u;e[3]!==f?(u=W("flex size-10 shrink-0 items-center justify-center rounded-full",f),e[3]=f,e[4]=u):u=e[4];const g=pe[c];let h;e[5]!==g?(h=W("size-3 rounded-full",g),e[5]=g,e[6]=h):h=e[6];let E;e[7]!==h?(E=a("span",{className:h}),e[7]=h,e[8]=E):E=e[8];let w;e[9]!==u||e[10]!==E?(w=a("span",{"aria-hidden":"true",className:u,children:E}),e[9]=u,e[10]=E,e[11]=w):w=e[11];let T;e[12]!==x?(T=a("span",{className:"text-sm font-semibold text-foreground","data-testid":"hl-status",children:x}),e[12]=x,e[13]=T):T=e[13];let S;e[14]!==p?(S=a("span",{className:"text-[13px] text-muted-foreground",children:p}),e[14]=p,e[15]=S):S=e[15];let y;e[16]!==T||e[17]!==S?(y=m("div",{className:"grid leading-tight",children:[T,S]}),e[16]=T,e[17]=S,e[18]=y):y=e[18];let b;e[19]!==y||e[20]!==w?(b=m("div",{className:"flex items-center gap-3",children:[w,y]}),e[19]=y,e[20]=w,e[21]=b):b=e[21];let k;e[22]!==o?(k=o("Requests"),e[22]=o,e[23]=k):k=e[23];let _;e[24]!==k?(_=a("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:k}),e[24]=k,e[25]=_):_=e[25];let A;e[26]!==i||e[27]!==o?(A=i.length>=2&&a(ne,{ariaLabel:o("Requests over time"),className:"h-6 w-20 text-foreground",series:i,testId:"hl-spark-requests"}),e[26]=i,e[27]=o,e[28]=A):A=e[28];const D=n?.requests??0;let j;e[29]!==D?(j=D.toString(),e[29]=D,e[30]=j):j=e[30];let I;e[31]!==j?(I=a("span",{className:"text-lg font-semibold tabular-nums text-foreground","data-testid":"hl-requests",children:j}),e[31]=j,e[32]=I):I=e[32];let U;e[33]!==A||e[34]!==I?(U=m("div",{className:"flex items-center justify-end gap-2",children:[A,I]}),e[33]=A,e[34]=I,e[35]=U):U=e[35];let C;e[36]!==_||e[37]!==U?(C=m("div",{className:"text-end",children:[_,U]}),e[36]=_,e[37]=U,e[38]=C):C=e[38];let $;e[39]===Symbol.for("react.memo_cache_sentinel")?($=a("span",{"aria-hidden":"true",className:"h-9 w-px bg-border"}),e[39]=$):$=e[39];let R;e[40]!==o?(R=o("Error rate"),e[40]=o,e[41]=R):R=e[41];let q;e[42]!==R?(q=a("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:R}),e[42]=R,e[43]=q):q=e[43];const Q=ge[l];let M;e[44]!==Q?(M=W("text-lg font-semibold tabular-nums",Q),e[44]=Q,e[45]=M):M=e[45];let P;e[46]!==n?(P=n===null?"—":re(n.errors,n.requests),e[46]=n,e[47]=P):P=e[47];let L;e[48]!==M||e[49]!==P?(L=a("div",{className:M,"data-testid":"hl-error-rate",children:P}),e[48]=M,e[49]=P,e[50]=L):L=e[50];let O;e[51]!==q||e[52]!==L?(O=m("div",{className:"text-end",children:[q,L]}),e[51]=q,e[52]=L,e[53]=O):O=e[53];let G;e[54]===Symbol.for("react.memo_cache_sentinel")?(G=a("span",{"aria-hidden":"true",className:"h-9 w-px bg-border"}),e[54]=G):G=e[54];let B;e[55]===Symbol.for("react.memo_cache_sentinel")?(B=a(ve,{}),e[55]=B):B=e[55];let v;e[56]!==t?(v=m("div",{className:"flex items-center gap-2",children:[B,a(Ne,{message:t,prefix:"hl"})]}),e[56]=t,e[57]=v):v=e[57];let N;e[58]!==C||e[59]!==O||e[60]!==v?(N=m("div",{className:"flex flex-wrap items-center gap-4",children:[C,$,O,G,v]}),e[58]=C,e[59]=O,e[60]=v,e[61]=N):N=e[61];let V;e[62]!==b||e[63]!==N?(V=m("div",{className:"flex flex-wrap items-center justify-between gap-4 p-4",children:[b,N]}),e[62]=b,e[63]=N,e[64]=V):V=e[64];let H;e[65]!==r?(H=r!==null&&a("div",{className:"border-t border-border bg-destructive/5 px-4 py-2 text-sm text-destructive","data-testid":"hl-metrics-error",role:"alert",children:r}),e[65]=r,e[66]=H):H=e[66];let K;e[67]!==r||e[68]!==o||e[69]!==n?.historyTruncated?(K=r===null&&n?.historyTruncated===!0&&a("div",{className:"border-t border-border bg-warning/5 px-4 py-2 text-sm text-muted-foreground","data-testid":"hl-history-truncated",children:o("Showing a partial request/error history — one or more shards have more data than the trend chart can display.")}),e[67]=r,e[68]=o,e[69]=n?.historyTruncated,e[70]=K):K=e[70];let Y;return e[71]!==V||e[72]!==H||e[73]!==K?(Y=m(X,{className:"gap-0 py-0",children:[V,H,K]}),e[71]=V,e[72]=H,e[73]=K,e[74]=Y):Y=e[74],Y},Ye=s=>{const e=se(14),{shards:l}=s,t=le();let r;e[0]!==t?(r=t("Shards seen"),e[0]=t,e[1]=r):r=e[1];let c;e[2]!==r?(c=a("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r}),e[2]=r,e[3]=c):c=e[3];let i;e[4]!==l.length?(i=a(te,{"data-testid":"hl-shard-count",variant:"outline",children:l.length}),e[4]=l.length,e[5]=i):i=e[5];let n;e[6]!==c||e[7]!==i?(n=m("header",{className:"flex items-center justify-between gap-2 border-b border-border px-4 py-3",children:[c,i]}),e[6]=c,e[7]=i,e[8]=n):n=e[8];let o;e[9]!==l?(o=l.length>0&&a("ul",{className:"flex flex-wrap gap-1.5 p-4",children:l.map(Ze)}),e[9]=l,e[10]=o):o=e[10];let d;return e[11]!==n||e[12]!==o?(d=m(X,{className:"gap-0 py-0",children:[n,o]}),e[11]=n,e[12]=o,e[13]=d):d=e[13],d},gt=({initialShardKey:s})=>{const e=Se(),l=le(),[t,r]=F([]),[c,i]=F(null),[n,o]=F(null),[d,p]=F(null),[x,f]=F([]),[u,g]=F(null),[h,E]=F(null),[w,T]=F([]),[S]=F(Ee),y=Z(!1),b=Z(0),k=Z(0),_=Z(null),A=s??"",D=xe(async()=>{if(y.current)return;y.current=!0;const v=b.current,N=await Qe(e,A,we(A,S));v===b.current&&(o(N.totals),p(N.metricsError),f(N.functions),T(N.migrations),r(N.entries),i(N.logsError),g(N.auth),E(N.scheduler),y.current=!1)},[e,S,A]);ie(()=>(ae(D()),()=>{b.current+=1,y.current=!1,_.current!==null&&(clearTimeout(_.current),_.current=null)}),[D]);const j=()=>{const v=Date.now()-k.current;if(v>=fe){k.current=Date.now(),ae(D());return}_.current===null&&(_.current=setTimeout(()=>{_.current=null,k.current=Date.now(),ae(D())},fe-v))},{data:I,liveError:U}=be(z.getMetrics,{},{live:!0,shardKey:A});ie(()=>{I!==void 0&&j()},[I]);const C=t.filter(v=>v.level==="error"),$=C.slice(0,Fe),R=Be(n?.history),q=We(u),Q=x.filter(v=>v.calls>0).toSorted((v,N)=>N.errors/N.calls-v.errors/v.calls||N.calls-v.calls).slice(0,De),M=Ve(w),P=n===null||n.requests===0?0:n.errors/n.requests,L=oe(P,me,he),O=u===null?"ok":oe(u.failureRate,je,Ue),G=h===null?"ok":$e(h.backlog,Pe,Ge),B=ze([L,O,G,M.level]);return m("div",{className:"flex flex-col gap-6","data-testid":"lunora-health",children:[a(Je,{errorLevel:L,liveError:U,metricsError:d,overall:B,requestSeries:R.requests,totals:n}),m("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-4","data-testid":"hl-slo",children:[a(ee,{chart:R.errors.length>=2?a(ne,{ariaLabel:l("Errors over time"),className:"h-7 w-20 text-destructive",series:R.errors,testId:"hl-spark-errors"}):void 0,label:l("Error rate"),level:L,testId:"hl-slo-errorrate",value:n===null?"—":re(n.errors,n.requests)}),a(ee,{chart:q.failures.length>=2?a(ne,{ariaLabel:l("Auth failures over time"),className:"h-7 w-20 text-destructive",series:q.failures,testId:"hl-spark-auth"}):void 0,label:l("Auth failures"),level:O,testId:"hl-slo-auth",value:u===null?"—":re(u.failures,u.attempts)}),a(ee,{label:l("Scheduler backlog"),level:G,testId:"hl-slo-backlog",value:h===null?"—":h.backlog.toString()}),a(ee,{label:l("Migrations"),level:M.level,testId:"hl-slo-migrations",value:He(M,l)})]}),a(_e,{errorCount:C.length,logsError:c,topErrors:$,worstFunctions:Q}),a(Ye,{shards:S})]})};function Ze(s){return a("li",{"data-testid":"hl-shard",children:a(te,{variant:"secondary",children:s})},s)}export{gt as HealthPanel};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as X}from"react/compiler-runtime";import{useNavigate as se}from"@tanstack/react-router";import{useState as
|
|
1
|
+
import{c as X}from"react/compiler-runtime";import{useNavigate as se}from"@tanstack/react-router";import{useState as K,useRef as ae,useEffectEvent as Q,useEffect as z,useCallback as re,useMemo as N}from"react";import{ShardInput as oe}from"../packem_shared/ShardInput-CoySruKZ.mjs";import{B as ie}from"../packem_shared/button-q0UYSmrn.mjs";import{u as B}from"../packem_shared/use-admin-query-CaOm4JS3.mjs";import{u as ce}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{u as le}from"../packem_shared/use-studio-client-DCA50tF2.mjs";import{useT as L}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{ADMIN_FUNCTIONS as w}from"../packem_shared/ADMIN_FUNCTIONS-DUXsXId1.mjs";import{f as k,d as E,c as M,n as de}from"../packem_shared/internal-hIuTpSbx.mjs";import{r as ue}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{a as G,A as fe}from"../packem_shared/advisor-view-CzieqKMe.mjs";import{ConfirmButton as me}from"../packem_shared/ConfirmButton-CIXYF6Mg.mjs";import{jsx as v,jsxs as he}from"react/jsx-runtime";import{deriveInsights as pe}from"../packem_shared/DEFAULT_INSIGHT_THRESHOLDS-D5YMT0gM.mjs";import{runAdvisor as be,RUNTIME_LINTS as ye}from"@lunora/advisor";const xe=t=>{const{suggestedIndex:e,table:a}=t;if(typeof a!="string"||a.length===0||typeof e!="object"||e===null)return!1;const{fields:n,name:s}=e;return!Array.isArray(n)||n.length===0||n.some(o=>typeof o!="string"||o.length===0)?!1:typeof s=="string"&&s.length>0},ge=(t,e)=>`.index(${JSON.stringify(t)}, [${e.map(a=>JSON.stringify(a)).join(", ")}])`,ve=t=>{const e=X(19),{fields:a,indexName:n,table:s,testId:o}=t,l=L(),[f,d]=K(null);let m;e[0]!==a||e[1]!==n?(m=()=>{const b=ge(n,a),I="navigator"in globalThis?globalThis.navigator.clipboard:void 0;if(I===void 0){d({copied:!1,declaration:b});return}k(I.writeText(b).then(()=>(d({copied:!0,declaration:b}),!0)),()=>{d({copied:!1,declaration:b})})},e[0]=a,e[1]=n,e[2]=m):m=e[2];const S=m;if(f!==null){let b;return e[3]!==f.copied||e[4]!==f.declaration||e[5]!==l||e[6]!==s||e[7]!==o?(b=f.copied?v("span",{className:"text-xs text-muted-foreground","data-testid":`${o}-applied`,children:l("Index declaration copied — add it to {table} in lunora/schema.ts.",{table:s})}):he("span",{className:"flex flex-col gap-1 text-xs text-muted-foreground","data-testid":`${o}-manual`,children:[l("Could not reach the clipboard — add this to {table} in lunora/schema.ts:",{table:s}),v("code",{className:"font-mono break-all select-all",children:f.declaration})]}),e[3]=f.copied,e[4]=f.declaration,e[5]=l,e[6]=s,e[7]=o,e[8]=b):b=e[8],b}let u;e[9]!==l?(u=l("Copy?"),e[9]=l,e[10]=u):u=e[10];let h;e[11]!==l||e[12]!==s?(h=l("Copy index declaration for {table}",{table:s}),e[11]=l,e[12]=s,e[13]=h):h=e[13];let x;return e[14]!==S||e[15]!==u||e[16]!==h||e[17]!==o?(x=v(me,{confirmLabel:u,onConfirm:S,testId:o,children:h}),e[14]=S,e[15]=u,e[16]=h,e[17]=o,e[18]=x):x=e[18],x},Se=(t,e)=>{const a=new Map;for(const n of e){const s=`${n.table} ${n.index}`;a.set(s,(a.get(s)??0)+n.reads)}return t.map(n=>({index:n.index,reads:a.get(`${n.table} ${n.index}`)??0,table:n.table}))},Te=t=>{const e=new Map;for(const a of t)for(const n of a.scannedTables??[])e.set(n.table,(e.get(n.table)??0)+n.scans);return[...e].map(([a,n])=>({scans:n,table:a}))},P=(t,e)=>e.map(a=>({index:a.name,table:t})),we=t=>{const e=Se(t.declaredIndexes??[],t.indexHits??[]),a=Te(t.functions??[]),n=t.shardTraffic??[],s=t.analyticsMetrics,o=s&&s.indexHits.length>0?s.indexHits:e,l=s&&s.tableScans.length>0?s.tableScans:a,f=s&&s.shardTraffic.length>0?s.shardTraffic:n,d=be({indexHits:o,schema:{tables:[]},shardTraffic:f,tableScans:l},{lints:ye,source:"runtime"}),m=t.suppressHotScanTables;return(m===void 0?d:d.filter(u=>!(u.metadata.kind==="hot_scan"&&typeof u.metadata.table=="string"&&m.has(u.metadata.table)))).map(u=>G(u))},Ie=M(w.listTables),$e=M(w.listTableIndexes),Ae=M(w.listTablesIndexes),H=t=>`${(t*100).toFixed(1)}%`,V=t=>`${(t/1e3).toFixed(2)}s`,Ne=t=>{if(t.length<=1)return t[0]??"";const e=t[t.length-1]??"";return`${t.slice(0,-1).join(", ")} and ${e}`},ke=(t,e)=>({"high-error-rate":t("High error rate"),"high-evictions":t("High cache eviction rate"),"high-write-contention":t("High write contention"),"low-cache-hit-rate":t("Low cache hit rate"),"missing-index":t("Missing index"),"slow-function":t("Slow function"),"storage-headroom":t("Storage headroom")})[e.kind],U=(t,e)=>({"high-error-rate":t("{rate} of calls failed.",{rate:H(e.value)}),"high-evictions":t("{count} entries evicted recently.",{count:e.value}),"high-write-contention":t("{rate} of calls hit a write conflict — consider sharding to cut contention.",{rate:H(e.value)}),"low-cache-hit-rate":t("{rate} hit rate over recent traffic.",{rate:H(e.value)}),"missing-index":t("Slowest call took {duration} — it full-scanned {tables} with no index.",{duration:V(e.value),tables:Ne(e.tables??[])}),"slow-function":t("Slowest call took {duration}.",{duration:V(e.value)}),"storage-headroom":t("{size} of the 10 GiB per-shard ceiling — plan a .shardBy() migration while it still has runway.",{size:de(e.value)})})[e.kind],Be=t=>{const e=X(10),{onJump:a,table:n}=t,s=L();let o;e[0]!==a||e[1]!==n?(o=()=>{a(n)},e[0]=a,e[1]=n,e[2]=o):o=e[2];const l=o,f=`in-add-index-${n}`;let d;e[3]!==s||e[4]!==n?(d=s("Add index on {table}",{table:n}),e[3]=s,e[4]=n,e[5]=d):d=e[5];let m;return e[6]!==l||e[7]!==f||e[8]!==d?(m=v(ie,{"data-testid":f,onClick:l,size:"sm",type:"button",variant:"outline",children:d}),e[6]=l,e[7]=f,e[8]=d,e[9]=m):m=e[9],m},Ue=({initialShardKey:t,loadShardTraffic:e})=>{const a=le(),n=se(),s=L(),{queryShardKey:o,setShardKey:l,shardKey:f}=ce(t),[d,m]=K(null),[S,u]=K(null),h=ae(""),x=B(w.getMetrics,{},{live:!0,shardKey:o}),b=B(w.getFunctionStats,{},{live:!0,shardKey:o}),I=B(w.getAdvisories,{},{live:!0,shardKey:o}),C=x.data??null,$=b.data?.functions??null,D=I.data?.advisories??null,R=x.data?.indexHits??null,j=x.error!==null&&b.error!==null?x.error:null,W=e??(r=>a.shardTraffic(r)),Y=async(r,y)=>{const g=r[0];if(g===void 0||g===""){h.current===y&&u(null);return}try{const i=await W(g);if(h.current!==y)return;const c=new Map;for(const p of i.shards)c.has(p.shardKey)||c.set(p.shardKey,{requests:p.requests,shardKey:p.shardKey});u([...c.values()])}catch{h.current===y&&u(null)}},Z=async(r,y)=>{const g=await Promise.allSettled(r.map(async c=>[c,await a.query($e,{table:c},E(y))])),i=[];for(const c of g)if(c.status==="fulfilled"){const[p,T]=c.value;i.push(...P(p,T.indexes))}return i},F=Q(async r=>{h.current=r;let y=[];try{const g=await a.query(Ie,{},E(r));if(h.current!==r)return;ue(r),y=g.map(c=>c.name);let i=[];if(y.length>0)try{const c=await a.query(Ae,{tables:y},E(r));if(h.current!==r)return;for(const[p,T]of Object.entries(c.indexesByTable))i.push(...P(p,T))}catch{if(i=await Z(y,r),h.current!==r)return}m(i)}catch{h.current===r&&m(null)}await Y(y,r)});z(()=>{k(F(o))},[o]);const _=Q(()=>{x.refetch(),b.refetch(),I.refetch(),k(F(o))});z(()=>{const r=()=>{document.visibilityState==="visible"&&_()};return document.addEventListener("visibilitychange",r),()=>{document.removeEventListener("visibilitychange",r)}},[]);const O=re(r=>{k(n({search:{table:r},to:"/schema"}))},[n]),A=N(()=>pe(C,$),[$,C]),q=N(()=>new Set(A.filter(r=>r.kind==="missing-index").flatMap(r=>r.tables??[])),[A]),J=N(()=>we({declaredIndexes:d??[],functions:$,indexHits:R,shardTraffic:S,suppressHotScanTables:q}),[d,$,R,q,S]),ee=N(()=>{const r=A.map(i=>{const c=i.kind==="missing-index"?i.tables??[]:[];return{action:c.length>0?c.map(p=>v(Be,{onJump:O,table:p},p)):void 0,description:i.message===void 0?U(s,i):`${U(s,i)} — ${i.message}`,entity:i.fn,issueType:ke(s,i),key:`${i.kind}:${i.fn??""}`,level:i.severity}}),y=new Set(["unindexed_foreign_key","unindexed_relation_target"]);return[...(D??[]).map(i=>{const c=G(i);if(y.has(i.name)&&xe(i.metadata)){const{table:p,suggestedIndex:T}=i.metadata,ne=`in-apply-index-${p}-${T.name}`;return{...c,action:v(ve,{fields:T.fields,indexName:T.name,table:p,testId:ne})}}return c}),...J,...r]},[D,A,O,J,s]),te=v(oe,{onChange:l,testId:"in-shard-input",value:f});return v(fe,{error:j,errorSource:j===null?void 0:x.errorSource,rows:ee,shardKey:o,testId:"lunora-insights",toolbar:te})};export{Ue as InsightsPanel};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as q}from"react/compiler-runtime";import{useVirtualizer as Ce}from"@tanstack/react-virtual";import{useState as F,useReducer as Le,useRef as ue,useEffect as me,useMemo as Ne}from"react";import{f as fe}from"../packem_shared/log-fields-BolUoZ9g.mjs";import{E as Se}from"../packem_shared/error-alert-C0R39DO1.mjs";import{B as he}from"../packem_shared/badge-r_5B4LHP.mjs";import{E as ee}from"../packem_shared/empty-state-D7jEML_T.mjs";import{u as le}from"../packem_shared/use-admin-query-CaOm4JS3.mjs";import{u as Te}from"../packem_shared/use-open-trace-BJKMJjeS.mjs";import{u as Ie}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as Q}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{ADMIN_FUNCTIONS as oe}from"../packem_shared/ADMIN_FUNCTIONS-4aGsMs95.mjs";import{r as Re}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{f as ke}from"../packem_shared/virtual-rect-D_j7aLxX.mjs";import{B as Pe}from"../packem_shared/button-q0UYSmrn.mjs";import{I as D}from"../packem_shared/input-CXhxesPC.mjs";import{T as Ee,a as Oe,b as ge,c as B,d as _e,e as V}from"../packem_shared/table-D0SBiDu-.mjs";import ae from"../packem_shared/useDebounced-DVeQ5-oW.mjs";import{u as Fe}from"../packem_shared/use-studio-client-DCA50tF2.mjs";import{a as pe}from"../packem_shared/cf-links-CBJ5SywP.mjs";import{f as ne,j as qe,b as ie}from"../packem_shared/internal-hIuTpSbx.mjs";import{a as Ae,L as Me}from"../packem_shared/log-line-BH0iWiBv.mjs";import{jsx as r,jsxs as E,Fragment as $e}from"react/jsx-runtime";import{c as H}from"../packem_shared/utils-bhneXptQ.mjs";import{L as Ue}from"../packem_shared/live-status-D1GasNsH.mjs";import{ShardInput as Ke}from"../packem_shared/ShardInput-CoySruKZ.mjs";const re=["trace","debug","log","info","warn","error","fatal"],Be="LOG_ARCHIVE_NOT_CONFIGURED",Ve={cursor:void 0,error:null,loading:!1,notConfigured:!1,rows:null},De=(i,e)=>{switch(e.type){case"append":return{...i,cursor:e.cursor,error:null,loading:!1,rows:[...i.rows??[],...e.rows]};case"failed":return{cursor:void 0,error:e.message,loading:!1,notConfigured:!1,rows:null};case"loaded":return{cursor:e.cursor,error:null,loading:!1,notConfigured:!1,rows:e.rows};case"loading":return{...i,error:null,loading:!0,notConfigured:!1};case"notConfigured":return{cursor:void 0,error:null,loading:!1,notConfigured:!0,rows:null};case"pageFailed":return{...i,error:e.message,loading:!1};default:return i}},Qe=i=>{const e=q(33),{row:t}=i;let a;e[0]!==t.fields?(a=fe(t.fields),e[0]=t.fields,e[1]=a):a=e[1];const n=a,o=`lg-archive-row-${String(t.ts)}`;let d;e[2]!==t.ts?(d=new Date(t.ts).toLocaleString(),e[2]=t.ts,e[3]=d):d=e[3];let p;e[4]!==d?(p=r(V,{className:"tabular-nums whitespace-nowrap text-xs text-muted-foreground",children:d}),e[4]=d,e[5]=p):p=e[5];const m=Ae[t.level];let c;e[6]!==t.level||e[7]!==m?(c=r(V,{children:r(he,{variant:m,children:t.level})}),e[6]=t.level,e[7]=m,e[8]=c):c=e[8];let s;e[9]!==t.functionPath?(s=r(V,{className:"font-mono text-xs",children:t.functionPath}),e[9]=t.functionPath,e[10]=s):s=e[10];let f;e[11]!==t.message?(f=r("div",{className:"truncate",title:t.message,children:t.message}),e[11]=t.message,e[12]=f):f=e[12];let l;e[13]!==n?(l=n!==""&&r("div",{className:"truncate font-mono text-[11px] text-muted-foreground",title:n,children:n}),e[13]=n,e[14]=l):l=e[14];let u;e[15]!==f||e[16]!==l?(u=E(V,{className:"max-w-md",children:[f,l]}),e[15]=f,e[16]=l,e[17]=u):u=e[17];const h=t.traceId??"—";let v;e[18]!==h?(v=r(V,{className:"font-mono text-[11px] text-muted-foreground",children:h}),e[18]=h,e[19]=v):v=e[19];const b=t.shardKey??"—";let y;e[20]!==b?(y=r(V,{className:"font-mono text-[11px] text-muted-foreground",children:b}),e[20]=b,e[21]=y):y=e[21];const w=t.userId??"—";let x;e[22]!==w?(x=r(V,{className:"font-mono text-[11px] text-muted-foreground",children:w}),e[22]=w,e[23]=x):x=e[23];let T;return e[24]!==u||e[25]!==v||e[26]!==y||e[27]!==x||e[28]!==o||e[29]!==p||e[30]!==c||e[31]!==s?(T=E(ge,{"data-testid":o,children:[p,c,s,u,v,y,x]}),e[24]=u,e[25]=v,e[26]=y,e[27]=x,e[28]=o,e[29]=p,e[30]=c,e[31]=s,e[32]=T):T=e[32],T},ze=({shardKey:i})=>{const e=Fe(),t=Q(),[a,n]=F(""),[o,d]=F(""),[p,m]=F(""),[{cursor:c,error:s,loading:f,notConfigured:l,rows:u},h]=Le(De,Ve),v=ae(a.trim(),400),b=ae(o.trim(),400),y={...v===""?{}:{functionPathPrefix:v},...p===""?{}:{minLevel:p},...i===""?{}:{shardKey:i},...b===""?{}:{userId:b}},w=JSON.stringify(y),x=ue(w);me(()=>{const g={cancelled:!1};return x.current=w,ne((async()=>{h({type:"loading"});try{const C=await e.queryLogArchive(y);g.cancelled||h({cursor:C.nextCursor,rows:C.rows,type:"loaded"})}catch(C){g.cancelled||h(qe(C)===Be?{type:"notConfigured"}:{message:ie(C),type:"failed"})}})()),()=>{g.cancelled=!0}},[e,w]);const T=async()=>{if(c===void 0)return;const g=w;h({type:"loading"});try{const C=await e.queryLogArchive({...y,cursor:c});x.current===g&&h({cursor:C.nextCursor,rows:C.rows,type:"append"})}catch(C){x.current===g&&h({message:ie(C),type:"pageFailed"})}},R=g=>{n(g.target.value)},N=g=>{d(g.target.value)},L=g=>{m(g.target.value)},S=()=>{ne(T())};return l?r(ee,{action:r("a",{className:"text-sm text-primary underline-offset-4 hover:underline",href:pe,rel:"noreferrer",target:"_blank",children:t("Open in Cloudflare")}),description:t("Wire pipelineLogSink to a Cloudflare Pipeline → R2 Data Catalog table and set R2_SQL_ACCOUNT_ID, R2_SQL_TOKEN, R2_SQL_BUCKET to browse the durable log archive here."),testId:"lg-archive-not-configured",title:t("Log archive not configured")}):E("div",{className:"flex flex-col gap-4","data-testid":"lg-archive",children:[E("div",{className:"flex flex-wrap items-center gap-2",children:[r(D,{"aria-label":t("Function path prefix"),className:"h-8 w-48","data-testid":"lg-archive-path",onChange:R,placeholder:t("function path…"),value:a}),r(D,{"aria-label":t("User id"),className:"h-8 w-40","data-testid":"lg-archive-user",onChange:N,placeholder:t("user id…"),value:o}),E("select",{"aria-label":t("Minimum level"),className:"h-8 rounded-md border border-border bg-background px-2 text-sm","data-testid":"lg-archive-min-level",onChange:L,value:p,children:[r("option",{value:"",children:t("min level")}),re.map(g=>r("option",{value:g,children:g},g))]})]}),s!==null&&r("p",{className:"text-sm text-destructive","data-testid":"lg-archive-error",role:"alert",children:s}),f&&u===null&&s===null&&r("p",{className:"text-sm text-muted-foreground","data-testid":"lg-archive-loading",children:t("Loading…")}),u!==null&&u.length===0&&r(ee,{description:t("No archived logs match these filters. The durable archive fills as pipelineLogSink flushes records to R2."),testId:"lg-archive-empty",title:t("No archived logs.")}),u!==null&&u.length>0&&r("div",{className:"overflow-hidden rounded-xl border border-border shadow-xs",children:E(Ee,{"data-testid":"lg-archive-table",children:[r(Oe,{children:E(ge,{children:[r(B,{children:t("Time")}),r(B,{children:t("Level")}),r(B,{children:t("Function")}),r(B,{children:t("Message")}),r(B,{children:t("Trace")}),r(B,{children:t("Shard")}),r(B,{children:t("User")})]})}),r(_e,{children:u.map((g,C)=>r(Qe,{row:g},`${String(g.ts)}-${String(C)}`))})]})}),c!==void 0&&r("div",{children:r(Pe,{"data-testid":"lg-archive-more",disabled:f,onClick:S,size:"sm",variant:"outline",children:t(f?"Loading…":"Load more")})})]})},Ge=i=>{const e=q(11),{level:t,onToggle:a,selected:n}=i;let o;e[0]!==t||e[1]!==a?(o=()=>{a(t)},e[0]=t,e[1]=a,e[2]=o):o=e[2];const d=o,p=n?"border-border bg-muted font-medium":"border-input text-muted-foreground";let m;e[3]!==p?(m=H("rounded-md border px-2 py-1 text-xs",p),e[3]=p,e[4]=m):m=e[4];const c=`logs-level-${t}`;let s;return e[5]!==t||e[6]!==d||e[7]!==n||e[8]!==m||e[9]!==c?(s=r("button",{"aria-pressed":n,className:m,"data-testid":c,onClick:d,type:"button",children:t}),e[5]=t,e[6]=d,e[7]=n,e[8]=m,e[9]=c,e[10]=s):s=e[10],s},He=i=>{const e=q(68),{levelFilter:t,onLogPathChange:a,onSearchChange:n,onTimeRangeChange:o,onToggleLevel:d,onToggleSummary:p,pathFilter:m,search:c,showSummary:s,timeRange:f}=i,l=Q();let u;e[0]!==l?(u=l("Search messages"),e[0]=l,e[1]=u):u=e[1];let h;e[2]!==l?(h=l("search message"),e[2]=l,e[3]=h):h=e[3];let v;e[4]!==n||e[5]!==c||e[6]!==u||e[7]!==h?(v=r(D,{"aria-label":u,className:"h-8 w-48","data-testid":"lg-search",onChange:n,placeholder:h,value:c}),e[4]=n,e[5]=c,e[6]=u,e[7]=h,e[8]=v):v=e[8];let b;e[9]!==l?(b=l("Function path"),e[9]=l,e[10]=b):b=e[10];let y;e[11]!==l?(y=l("filter path"),e[11]=l,e[12]=y):y=e[12];let w;e[13]!==a||e[14]!==m||e[15]!==b||e[16]!==y?(w=r(D,{"aria-label":b,className:"h-8 w-40","data-testid":"logs-path-filter",onChange:a,placeholder:y,value:m}),e[13]=a,e[14]=m,e[15]=b,e[16]=y,e[17]=w):w=e[17];let x;e[18]!==l?(x=l("Level filter"),e[18]=l,e[19]=x):x=e[19];let T;e[20]!==t||e[21]!==d?(T=re.map(G=>r(Ge,{level:G,onToggle:d,selected:t.has(G)},G)),e[20]=t,e[21]=d,e[22]=T):T=e[22];let R;e[23]!==x||e[24]!==T?(R=r("div",{"aria-label":x,className:"inline-flex items-center gap-1","data-testid":"logs-level-filter",role:"group",children:T}),e[23]=x,e[24]=T,e[25]=R):R=e[25];let N;e[26]!==l?(N=l("Time range"),e[26]=l,e[27]=N):N=e[27];let L;e[28]!==l?(L=l("All time"),e[28]=l,e[29]=L):L=e[29];let S;e[30]!==L?(S=r("option",{value:"all",children:L}),e[30]=L,e[31]=S):S=e[31];let g;e[32]!==l?(g=l("Last 5m"),e[32]=l,e[33]=g):g=e[33];let C;e[34]!==g?(C=r("option",{value:"5m",children:g}),e[34]=g,e[35]=C):C=e[35];let k;e[36]!==l?(k=l("Last 15m"),e[36]=l,e[37]=k):k=e[37];let P;e[38]!==k?(P=r("option",{value:"15m",children:k}),e[38]=k,e[39]=P):P=e[39];let O;e[40]!==l?(O=l("Last hour"),e[40]=l,e[41]=O):O=e[41];let _;e[42]!==O?(_=r("option",{value:"1h",children:O}),e[42]=O,e[43]=_):_=e[43];let A;e[44]!==o||e[45]!==N||e[46]!==S||e[47]!==C||e[48]!==P||e[49]!==_||e[50]!==f?(A=E("select",{"aria-label":N,className:"h-8 rounded-md border border-input bg-transparent px-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-none","data-testid":"logs-time-range",onChange:o,value:f,children:[S,C,P,_]}),e[44]=o,e[45]=N,e[46]=S,e[47]=C,e[48]=P,e[49]=_,e[50]=f,e[51]=A):A=e[51];const z=s?"border-border bg-muted font-medium":"border-input text-muted-foreground";let M;e[52]!==z?(M=H("h-8 rounded-md border px-3 text-sm",z),e[52]=z,e[53]=M):M=e[53];let U;e[54]!==s||e[55]!==l?(U=l(s?"List":"Summary"),e[54]=s,e[55]=l,e[56]=U):U=e[56];let $;e[57]!==p||e[58]!==s||e[59]!==M||e[60]!==U?($=r("button",{"aria-pressed":s,className:M,"data-testid":"logs-summary-toggle",onClick:p,type:"button",children:U}),e[57]=p,e[58]=s,e[59]=M,e[60]=U,e[61]=$):$=e[61];let K;return e[62]!==A||e[63]!==$||e[64]!==v||e[65]!==w||e[66]!==R?(K=E("div",{className:"flex flex-wrap items-center gap-2",children:[v,w,R,A,$]}),e[62]=A,e[63]=$,e[64]=v,e[65]=w,e[66]=R,e[67]=K):K=e[67],K},We=i=>{const e=q(53),{onOutcomeChange:t,onPathChange:a,onTableChange:n,onUserChange:o,outcomeFilter:d,pathPrefix:p,tableFilter:m,userIdFilter:c}=i,s=Q();let f;e[0]!==s?(f=s("Function path"),e[0]=s,e[1]=f):f=e[1];let l;e[2]!==s?(l=s("file:function"),e[2]=s,e[3]=l):l=e[3];let u;e[4]!==a||e[5]!==p||e[6]!==f||e[7]!==l?(u=r(D,{"aria-label":f,className:"h-8 w-44","data-testid":"lg-req-path",onChange:a,placeholder:l,value:p}),e[4]=a,e[5]=p,e[6]=f,e[7]=l,e[8]=u):u=e[8];let h;e[9]!==s?(h=s("User id"),e[9]=s,e[10]=h):h=e[10];let v;e[11]!==s?(v=s("userId"),e[11]=s,e[12]=v):v=e[12];let b;e[13]!==o||e[14]!==h||e[15]!==v||e[16]!==c?(b=r(D,{"aria-label":h,className:"h-8 w-32","data-testid":"lg-req-user",onChange:o,placeholder:v,value:c}),e[13]=o,e[14]=h,e[15]=v,e[16]=c,e[17]=b):b=e[17];let y;e[18]!==s?(y=s("Table touched"),e[18]=s,e[19]=y):y=e[19];let w;e[20]!==s?(w=s("table"),e[20]=s,e[21]=w):w=e[21];let x;e[22]!==n||e[23]!==y||e[24]!==w||e[25]!==m?(x=r(D,{"aria-label":y,className:"h-8 w-32","data-testid":"lg-req-table",onChange:n,placeholder:w,value:m}),e[22]=n,e[23]=y,e[24]=w,e[25]=m,e[26]=x):x=e[26];let T;e[27]!==s?(T=s("Outcome filter"),e[27]=s,e[28]=T):T=e[28];let R;e[29]!==s?(R=s("all"),e[29]=s,e[30]=R):R=e[30];let N;e[31]!==R?(N=r("option",{value:"all",children:R}),e[31]=R,e[32]=N):N=e[32];let L;e[33]!==s?(L=s("ok"),e[33]=s,e[34]=L):L=e[34];let S;e[35]!==L?(S=r("option",{value:"ok",children:L}),e[35]=L,e[36]=S):S=e[36];let g;e[37]!==s?(g=s("error"),e[37]=s,e[38]=g):g=e[38];let C;e[39]!==g?(C=r("option",{value:"error",children:g}),e[39]=g,e[40]=C):C=e[40];let k;e[41]!==t||e[42]!==d||e[43]!==T||e[44]!==N||e[45]!==S||e[46]!==C?(k=E("select",{"aria-label":T,className:"h-8 rounded-md border border-input bg-transparent px-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-none","data-testid":"lg-req-outcome",onChange:t,value:d,children:[N,S,C]}),e[41]=t,e[42]=d,e[43]=T,e[44]=N,e[45]=S,e[46]=C,e[47]=k):k=e[47];let P;return e[48]!==k||e[49]!==u||e[50]!==b||e[51]!==x?(P=E("div",{className:"flex flex-wrap items-center gap-2",children:[u,b,x,k]}),e[48]=k,e[49]=u,e[50]=b,e[51]=x,e[52]=P):P=e[52],P},ve=i=>{const e=q(7),{bucket:t}=i;let a;e[0]!==t.key?(a=r("span",{className:"truncate text-muted-foreground",role:"gridcell",children:t.key}),e[0]=t.key,e[1]=a):a=e[1];let n;e[2]!==t.count?(n=r("span",{className:"shrink-0 tabular-nums",role:"gridcell",children:t.count}),e[2]=t.count,e[3]=n):n=e[3];let o;return e[4]!==a||e[5]!==n?(o=E("div",{className:"flex items-center justify-between gap-4 px-3 py-1 font-mono text-xs","data-testid":"logs-summary-row",role:"row",children:[a,n]}),e[4]=a,e[5]=n,e[6]=o):o=e[6],o},Ye=i=>{const e=q(31),{summary:t}=i,a=Q();let n;e[0]!==t.total||e[1]!==a?(n=a("{count} entries",{count:t.total}),e[0]=t.total,e[1]=a,e[2]=n):n=e[2];let o;e[3]!==n?(o=r("p",{className:"text-xs text-muted-foreground","data-testid":"logs-summary-total",children:n}),e[3]=n,e[4]=o):o=e[4];let d;e[5]!==a?(d=a("By level"),e[5]=a,e[6]=d):d=e[6];let p;e[7]!==d?(p=r("h4",{className:"mb-1 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:d}),e[7]=d,e[8]=p):p=e[8];let m;e[9]!==t.byLevel?(m=t.byLevel.map(je),e[9]=t.byLevel,e[10]=m):m=e[10];let c;e[11]!==m?(c=r("div",{className:"overflow-hidden rounded-lg border border-border","data-testid":"logs-summary-levels",role:"grid",children:m}),e[11]=m,e[12]=c):c=e[12];let s;e[13]!==p||e[14]!==c?(s=E("div",{children:[p,c]}),e[13]=p,e[14]=c,e[15]=s):s=e[15];let f;e[16]!==a?(f=a("By function"),e[16]=a,e[17]=f):f=e[17];let l;e[18]!==f?(l=r("h4",{className:"mb-1 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:f}),e[18]=f,e[19]=l):l=e[19];let u;e[20]!==t.byPath?(u=t.byPath.map(Je),e[20]=t.byPath,e[21]=u):u=e[21];let h;e[22]!==u?(h=r("div",{className:"overflow-hidden rounded-lg border border-border","data-testid":"logs-summary-paths",role:"grid",children:u}),e[22]=u,e[23]=h):h=e[23];let v;e[24]!==h||e[25]!==l?(v=E("div",{children:[l,h]}),e[24]=h,e[25]=l,e[26]=v):v=e[26];let b;return e[27]!==v||e[28]!==o||e[29]!==s?(b=E("div",{className:"flex flex-col gap-4 rounded-xl border border-border bg-card p-4 shadow-xs","data-testid":"logs-summary",children:[o,s,v]}),e[27]=v,e[28]=o,e[29]=s,e[30]=b):b=e[30],b};function je(i){return r(ve,{bucket:i},i.key)}function Je(i){return r(ve,{bucket:i},i.key)}const Xe=i=>{const e=q(46),{liveError:t,onShardKeyChange:a,onShowArchive:n,onShowErrors:o,onShowRequests:d,shardKey:p,view:m}=i,c=Q(),s=m==="requests",f=m==="requests"?"bg-muted font-medium":"text-muted-foreground";let l;e[0]!==f?(l=H("px-3 py-1 text-sm",f),e[0]=f,e[1]=l):l=e[1];let u;e[2]!==c?(u=c("Requests"),e[2]=c,e[3]=u):u=e[3];let h;e[4]!==d||e[5]!==s||e[6]!==l||e[7]!==u?(h=r("button",{"aria-selected":s,className:l,"data-testid":"lg-view-requests",onClick:d,role:"tab",type:"button",children:u}),e[4]=d,e[5]=s,e[6]=l,e[7]=u,e[8]=h):h=e[8];const v=m==="errors",b=m==="errors"?"bg-muted font-medium":"text-muted-foreground";let y;e[9]!==b?(y=H("px-3 py-1 text-sm",b),e[9]=b,e[10]=y):y=e[10];let w;e[11]!==c?(w=c("Errors"),e[11]=c,e[12]=w):w=e[12];let x;e[13]!==o||e[14]!==v||e[15]!==y||e[16]!==w?(x=r("button",{"aria-selected":v,className:y,"data-testid":"lg-view-errors",onClick:o,role:"tab",type:"button",children:w}),e[13]=o,e[14]=v,e[15]=y,e[16]=w,e[17]=x):x=e[17];const T=m==="archive",R=m==="archive"?"bg-muted font-medium":"text-muted-foreground";let N;e[18]!==R?(N=H("px-3 py-1 text-sm",R),e[18]=R,e[19]=N):N=e[19];let L;e[20]!==c?(L=c("Archive"),e[20]=c,e[21]=L):L=e[21];let S;e[22]!==n||e[23]!==T||e[24]!==N||e[25]!==L?(S=r("button",{"aria-selected":T,className:N,"data-testid":"lg-view-archive",onClick:n,role:"tab",type:"button",children:L}),e[22]=n,e[23]=T,e[24]=N,e[25]=L,e[26]=S):S=e[26];let g;e[27]!==x||e[28]!==S||e[29]!==h?(g=E("div",{className:"inline-flex overflow-hidden rounded-lg border border-border",role:"tablist",children:[h,x,S]}),e[27]=x,e[28]=S,e[29]=h,e[30]=g):g=e[30];let C;e[31]!==a||e[32]!==p?(C=r(Ke,{onChange:a,testId:"lg-shard-input",value:p}),e[31]=a,e[32]=p,e[33]=C):C=e[33];let k;e[34]!==t||e[35]!==m?(k=m!=="archive"&&r(Ue,{message:t,prefix:"lg"}),e[34]=t,e[35]=m,e[36]=k):k=e[36];let P;e[37]!==c?(P=c("Open in Cloudflare"),e[37]=c,e[38]=P):P=e[38];let O;e[39]!==P?(O=r("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"lg-cf-link",href:pe,rel:"noreferrer",target:"_blank",children:P}),e[39]=P,e[40]=O):O=e[40];let _;return e[41]!==g||e[42]!==C||e[43]!==k||e[44]!==O?(_=E("div",{className:"flex flex-wrap items-center gap-2",children:[g,C,k,O]}),e[41]=g,e[42]=C,e[43]=k,e[44]=O,e[45]=_):_=e[45],_},te=400,Ze=36,et={height:te,overflow:"auto"},be={left:0,position:"absolute",top:0,width:"100%"},tt={error:"destructive",ok:"secondary"},xe=i=>{const e=q(6),{onOpenTrace:t,traceId:a}=i,n=Q();let o;e[0]!==t||e[1]!==n||e[2]!==a?(o=a===void 0?null:r("button",{className:"text-primary underline-offset-2 hover:underline","data-testid":"lg-trace-link",onClick:()=>{t(a)},type:"button",children:n("Trace")}),e[0]=t,e[1]=n,e[2]=a,e[3]=o):o=e[3];let d;return e[4]!==o?(d=r("span",{className:"w-16 shrink-0 text-right",role:"gridcell",children:o}),e[4]=o,e[5]=d):d=e[5],d},rt=i=>{const e=q(13),{entry:t,index:a,measureRef:n,onOpenTrace:o,start:d}=i,p=`translateY(${String(d)}px)`;let m;e[0]!==p?(m={...be,transform:p},e[0]=p,e[1]=m):m=e[1];const c=m;let s;e[2]!==t?(s=r(Me,{entry:t}),e[2]=t,e[3]=s):s=e[3];let f;e[4]!==t.traceId||e[5]!==o?(f=r(xe,{onOpenTrace:o,traceId:t.traceId}),e[4]=t.traceId,e[5]=o,e[6]=f):f=e[6];let l;return e[7]!==a||e[8]!==n||e[9]!==c||e[10]!==s||e[11]!==f?(l=E("div",{className:"flex items-center border-b border-border px-3 py-1.5 font-mono text-xs hover:bg-muted/50","data-index":a,"data-testid":"lg-row",ref:n,role:"row",style:c,children:[s,f]}),e[7]=a,e[8]=n,e[9]=c,e[10]=s,e[11]=f,e[12]=l):l=e[12],l},ce=i=>i.length===0?"—":i.join(", "),st=i=>{const e=q(41),{entry:t,index:a,measureRef:n,onOpenTrace:o,start:d}=i,p=`translateY(${String(d)}px)`;let m;e[0]!==p?(m={...be,transform:p},e[0]=p,e[1]=m):m=e[1];const c=m;let s;e[2]!==t.ts?(s=new Date(t.ts).toLocaleString(),e[2]=t.ts,e[3]=s):s=e[3];let f;e[4]!==s?(f=r("span",{className:"w-40 shrink-0 tabular-nums text-muted-foreground",role:"gridcell",children:s}),e[4]=s,e[5]=f):f=e[5];const l=tt[t.outcome];let u;e[6]!==t.outcome||e[7]!==l?(u=r("span",{className:"w-16 shrink-0",role:"gridcell",children:r(he,{variant:l,children:t.outcome})}),e[6]=t.outcome,e[7]=l,e[8]=u):u=e[8];let h;e[9]!==t.functionPath?(h=r("span",{className:"w-44 shrink-0 truncate",role:"gridcell",title:t.functionPath,children:t.functionPath}),e[9]=t.functionPath,e[10]=h):h=e[10];const v=t.shardKey??"—";let b;e[11]!==v?(b=r("span",{className:"w-24 shrink-0 truncate text-muted-foreground",role:"gridcell",children:v}),e[11]=v,e[12]=b):b=e[12];const y=t.userId??"—";let w;e[13]!==y?(w=r("span",{className:"w-24 shrink-0 truncate text-muted-foreground",role:"gridcell",children:y}),e[13]=y,e[14]=w):w=e[14];let x;e[15]!==t.durationMs?(x=Math.round(t.durationMs),e[15]=t.durationMs,e[16]=x):x=e[16];const T=`${String(x)}ms`;let R;e[17]!==T?(R=r("span",{className:"w-16 shrink-0 tabular-nums text-muted-foreground",role:"gridcell",children:T}),e[17]=T,e[18]=R):R=e[18];let N;e[19]!==t.errorMessage||e[20]!==t.outcome||e[21]!==t.tablesRead||e[22]!==t.tablesWritten?(N=t.outcome==="error"&&t.errorMessage!==void 0?t.errorMessage:`r:${ce(t.tablesRead)} · w:${ce(t.tablesWritten)}`,e[19]=t.errorMessage,e[20]=t.outcome,e[21]=t.tablesRead,e[22]=t.tablesWritten,e[23]=N):N=e[23];let L;e[24]!==N?(L=r("span",{className:"flex-1 truncate text-muted-foreground",role:"gridcell",children:N}),e[24]=N,e[25]=L):L=e[25];let S;e[26]!==t.traceId||e[27]!==o?(S=r(xe,{onOpenTrace:o,traceId:t.traceId}),e[26]=t.traceId,e[27]=o,e[28]=S):S=e[28];let g;return e[29]!==a||e[30]!==n||e[31]!==c||e[32]!==w||e[33]!==R||e[34]!==L||e[35]!==S||e[36]!==f||e[37]!==u||e[38]!==h||e[39]!==b?(g=E("div",{className:"flex items-center border-b border-border px-3 py-1.5 font-mono text-xs hover:bg-muted/50","data-index":a,"data-testid":"lg-req-row",ref:n,role:"row",style:c,children:[f,u,h,b,w,R,L,S]}),e[29]=a,e[30]=n,e[31]=c,e[32]=w,e[33]=R,e[34]=L,e[35]=S,e[36]=f,e[37]=u,e[38]=h,e[39]=b,e[40]=g):g=e[40],g},de=i=>{const{entries:e}=i??{};return Array.isArray(e)?e:[]},lt=i=>{const e={};return i.functionPathPrefix.trim()!==""&&(e.functionPathPrefix=i.functionPathPrefix.trim()),i.userId.trim()!==""&&(e.userId=i.userId.trim()),i.tableTouched.trim()!==""&&(e.tableTouched=i.tableTouched.trim()),(i.outcome==="ok"||i.outcome==="error")&&(e.outcome=i.outcome),e},ot={"5m":300*1e3,"15m":900*1e3,"1h":3600*1e3},at=(i,e)=>{const t=e.search.trim().toLowerCase(),a=e.path.trim().toLowerCase(),n=e.range==="all"?Number.NEGATIVE_INFINITY:e.now-ot[e.range];return i.filter(o=>e.levels.size>0&&!e.levels.has(o.level)||o.timestamp<n||a!==""&&!(o.functionPath??"").toLowerCase().includes(a)?!1:t===""||o.message.toLowerCase().includes(t)||fe(o.fields).toLowerCase().includes(t))},nt="—",it=i=>{const e=new Map,t=new Map;for(const o of i){e.set(o.level,(e.get(o.level)??0)+1);const d=o.functionPath??nt;t.set(d,(t.get(d)??0)+1)}const a=re.filter(o=>e.has(o)).map(o=>({count:e.get(o)??0,key:o})),n=[...t.entries()].map(([o,d])=>({count:d,key:o})).toSorted((o,d)=>d.count===o.count?o.key.localeCompare(d.key):d.count-o.count);return{byLevel:a,byPath:n,total:i.length}},Wt=({initialShardKey:i})=>{const e=Q(),[t,a]=F("requests"),{queryShardKey:n,setShardKey:o,shardKey:d}=Ie(i),[p,m]=F(""),[c,s]=F(()=>new Set),[f,l]=F(""),[u,h]=F("all"),[v,b]=F(!1),[y,w]=F(""),[x,T]=F(""),[R,N]=F(""),[L,S]=F("all"),g=lt({functionPathPrefix:y,outcome:L,tableTouched:R,userId:x}),C=le(oe.getRequestLog,g,{enabled:t==="requests",live:!0,shardKey:n}),k=le(oe.getLogs,{},{enabled:t==="errors",live:!0,shardKey:n}),P=t==="requests"?C:k,{error:O,errorSource:_,isLoading:A,liveError:z}=P,M=Te(n),U=de(k.data),$=de(C.data);me(()=>{P.data!==void 0&&Re(n)},[P.data,n]);const K=at(U,{levels:c,now:Date.now(),path:f,range:u,search:p}),G=it(K),J=t==="requests"?$.length:K.length,X=t==="errors"&&v,W=Ne(()=>O!==null?"error":J===0?A?X?"summary":"list":"empty":X?"summary":"list",[J,A,O,X]),se=ue(null),Y=Ce({count:J,estimateSize:()=>Ze,getScrollElement:()=>se.current,initialRect:{height:te,width:800},observeElementRect:(I,Z)=>ke(I,Z,te),overscan:8}),ye=Y.getVirtualItems(),we={height:Y.getTotalSize(),position:"relative",width:"100%"};return E("div",{className:"flex flex-col gap-4","data-testid":"lunora-logs",children:[r(Xe,{liveError:z,onShardKeyChange:o,onShowArchive:()=>{a("archive"),b(!1)},onShowErrors:()=>{a("errors"),b(!1)},onShowRequests:()=>{a("requests"),b(!1)},shardKey:d,view:t}),t==="errors"&&r(He,{levelFilter:c,onLogPathChange:I=>{l(I.target.value)},onSearchChange:I=>{m(I.target.value)},onTimeRangeChange:I=>{h(I.target.value)},onToggleLevel:I=>{s(Z=>{const j=new Set(Z);return j.has(I)?j.delete(I):j.add(I),j})},onToggleSummary:()=>{b(I=>!I)},pathFilter:f,search:p,showSummary:v,timeRange:u}),t==="requests"&&r(We,{onOutcomeChange:I=>{S(I.target.value)},onPathChange:I=>{w(I.target.value)},onTableChange:I=>{N(I.target.value)},onUserChange:I=>{T(I.target.value)},outcomeFilter:L,pathPrefix:y,tableFilter:R,userIdFilter:x}),t==="archive"?r(ze,{shardKey:n}):E($e,{children:[W==="error"&&r(Se,{error:_,testId:"lg-error"}),W==="empty"&&r(ee,{description:e("Function and request logs for this shard show up here as your app handles traffic."),icon:r("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:r("path",{d:"M4 5h16M4 12h16M4 19h10"})}),testId:"lg-empty",title:e("No logs.")}),W==="summary"&&r(Ye,{summary:G}),W==="list"&&r("div",{className:"rounded-xl border border-border shadow-xs","data-testid":"lg-scroll",ref:se,style:et,children:r("div",{"aria-label":e("Recent logs"),"data-testid":"lg-table",role:"grid",style:we,children:ye.map(I=>t==="requests"?r(st,{entry:$[I.index],index:I.index,measureRef:Y.measureElement,onOpenTrace:M,start:I.start},I.key):r(rt,{entry:K[I.index],index:I.index,measureRef:Y.measureElement,onOpenTrace:M,start:I.start},I.key))})})]})]})};export{Wt as LogsPanel,at as filterLogs,it as summarizeLogs};
|
|
1
|
+
import{c as q}from"react/compiler-runtime";import{useVirtualizer as Ce}from"@tanstack/react-virtual";import{useState as F,useReducer as Le,useRef as ue,useEffect as me,useMemo as Ne}from"react";import{f as fe}from"../packem_shared/log-fields-BolUoZ9g.mjs";import{E as Se}from"../packem_shared/error-alert-DKXm5h19.mjs";import{B as he}from"../packem_shared/badge-r_5B4LHP.mjs";import{E as ee}from"../packem_shared/empty-state-D7jEML_T.mjs";import{u as le}from"../packem_shared/use-admin-query-CaOm4JS3.mjs";import{u as Te}from"../packem_shared/use-open-trace-BJKMJjeS.mjs";import{u as Ie}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as Q}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{ADMIN_FUNCTIONS as oe}from"../packem_shared/ADMIN_FUNCTIONS-DUXsXId1.mjs";import{r as Re}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{f as ke}from"../packem_shared/virtual-rect-D_j7aLxX.mjs";import{B as Pe}from"../packem_shared/button-q0UYSmrn.mjs";import{I as D}from"../packem_shared/input-CXhxesPC.mjs";import{T as Ee,a as Oe,b as ge,c as B,d as _e,e as V}from"../packem_shared/table-D0SBiDu-.mjs";import ae from"../packem_shared/useDebounced-DVeQ5-oW.mjs";import{u as Fe}from"../packem_shared/use-studio-client-DCA50tF2.mjs";import{C as pe}from"../packem_shared/cf-links-C4DVTr8A.mjs";import{f as ne,j as qe,b as ie}from"../packem_shared/internal-hIuTpSbx.mjs";import{a as Ae,L as Me}from"../packem_shared/log-line-BH0iWiBv.mjs";import{jsx as r,jsxs as E,Fragment as $e}from"react/jsx-runtime";import{c as H}from"../packem_shared/utils-bhneXptQ.mjs";import{L as Ue}from"../packem_shared/live-status-D1GasNsH.mjs";import{ShardInput as Ke}from"../packem_shared/ShardInput-CoySruKZ.mjs";const re=["trace","debug","log","info","warn","error","fatal"],Be="LOG_ARCHIVE_NOT_CONFIGURED",Ve={cursor:void 0,error:null,loading:!1,notConfigured:!1,rows:null},De=(i,e)=>{switch(e.type){case"append":return{...i,cursor:e.cursor,error:null,loading:!1,rows:[...i.rows??[],...e.rows]};case"failed":return{cursor:void 0,error:e.message,loading:!1,notConfigured:!1,rows:null};case"loaded":return{cursor:e.cursor,error:null,loading:!1,notConfigured:!1,rows:e.rows};case"loading":return{...i,error:null,loading:!0,notConfigured:!1};case"notConfigured":return{cursor:void 0,error:null,loading:!1,notConfigured:!0,rows:null};case"pageFailed":return{...i,error:e.message,loading:!1};default:return i}},Qe=i=>{const e=q(33),{row:t}=i;let a;e[0]!==t.fields?(a=fe(t.fields),e[0]=t.fields,e[1]=a):a=e[1];const n=a,o=`lg-archive-row-${String(t.ts)}`;let d;e[2]!==t.ts?(d=new Date(t.ts).toLocaleString(),e[2]=t.ts,e[3]=d):d=e[3];let p;e[4]!==d?(p=r(V,{className:"tabular-nums whitespace-nowrap text-xs text-muted-foreground",children:d}),e[4]=d,e[5]=p):p=e[5];const m=Ae[t.level];let c;e[6]!==t.level||e[7]!==m?(c=r(V,{children:r(he,{variant:m,children:t.level})}),e[6]=t.level,e[7]=m,e[8]=c):c=e[8];let s;e[9]!==t.functionPath?(s=r(V,{className:"font-mono text-xs",children:t.functionPath}),e[9]=t.functionPath,e[10]=s):s=e[10];let f;e[11]!==t.message?(f=r("div",{className:"truncate",title:t.message,children:t.message}),e[11]=t.message,e[12]=f):f=e[12];let l;e[13]!==n?(l=n!==""&&r("div",{className:"truncate font-mono text-[11px] text-muted-foreground",title:n,children:n}),e[13]=n,e[14]=l):l=e[14];let u;e[15]!==f||e[16]!==l?(u=E(V,{className:"max-w-md",children:[f,l]}),e[15]=f,e[16]=l,e[17]=u):u=e[17];const h=t.traceId??"—";let v;e[18]!==h?(v=r(V,{className:"font-mono text-[11px] text-muted-foreground",children:h}),e[18]=h,e[19]=v):v=e[19];const b=t.shardKey??"—";let y;e[20]!==b?(y=r(V,{className:"font-mono text-[11px] text-muted-foreground",children:b}),e[20]=b,e[21]=y):y=e[21];const w=t.userId??"—";let x;e[22]!==w?(x=r(V,{className:"font-mono text-[11px] text-muted-foreground",children:w}),e[22]=w,e[23]=x):x=e[23];let T;return e[24]!==u||e[25]!==v||e[26]!==y||e[27]!==x||e[28]!==o||e[29]!==p||e[30]!==c||e[31]!==s?(T=E(ge,{"data-testid":o,children:[p,c,s,u,v,y,x]}),e[24]=u,e[25]=v,e[26]=y,e[27]=x,e[28]=o,e[29]=p,e[30]=c,e[31]=s,e[32]=T):T=e[32],T},ze=({shardKey:i})=>{const e=Fe(),t=Q(),[a,n]=F(""),[o,d]=F(""),[p,m]=F(""),[{cursor:c,error:s,loading:f,notConfigured:l,rows:u},h]=Le(De,Ve),v=ae(a.trim(),400),b=ae(o.trim(),400),y={...v===""?{}:{functionPathPrefix:v},...p===""?{}:{minLevel:p},...i===""?{}:{shardKey:i},...b===""?{}:{userId:b}},w=JSON.stringify(y),x=ue(w);me(()=>{const g={cancelled:!1};return x.current=w,ne((async()=>{h({type:"loading"});try{const C=await e.queryLogArchive(y);g.cancelled||h({cursor:C.nextCursor,rows:C.rows,type:"loaded"})}catch(C){g.cancelled||h(qe(C)===Be?{type:"notConfigured"}:{message:ie(C),type:"failed"})}})()),()=>{g.cancelled=!0}},[e,w]);const T=async()=>{if(c===void 0)return;const g=w;h({type:"loading"});try{const C=await e.queryLogArchive({...y,cursor:c});x.current===g&&h({cursor:C.nextCursor,rows:C.rows,type:"append"})}catch(C){x.current===g&&h({message:ie(C),type:"pageFailed"})}},R=g=>{n(g.target.value)},N=g=>{d(g.target.value)},L=g=>{m(g.target.value)},S=()=>{ne(T())};return l?r(ee,{action:r("a",{className:"text-sm text-primary underline-offset-4 hover:underline",href:pe,rel:"noreferrer",target:"_blank",children:t("Open in Cloudflare")}),description:t("Wire pipelineLogSink to a Cloudflare Pipeline → R2 Data Catalog table and set R2_SQL_ACCOUNT_ID, R2_SQL_TOKEN, R2_SQL_BUCKET to browse the durable log archive here."),testId:"lg-archive-not-configured",title:t("Log archive not configured")}):E("div",{className:"flex flex-col gap-4","data-testid":"lg-archive",children:[E("div",{className:"flex flex-wrap items-center gap-2",children:[r(D,{"aria-label":t("Function path prefix"),className:"h-8 w-48","data-testid":"lg-archive-path",onChange:R,placeholder:t("function path…"),value:a}),r(D,{"aria-label":t("User id"),className:"h-8 w-40","data-testid":"lg-archive-user",onChange:N,placeholder:t("user id…"),value:o}),E("select",{"aria-label":t("Minimum level"),className:"h-8 rounded-md border border-border bg-background px-2 text-sm","data-testid":"lg-archive-min-level",onChange:L,value:p,children:[r("option",{value:"",children:t("min level")}),re.map(g=>r("option",{value:g,children:g},g))]})]}),s!==null&&r("p",{className:"text-sm text-destructive","data-testid":"lg-archive-error",role:"alert",children:s}),f&&u===null&&s===null&&r("p",{className:"text-sm text-muted-foreground","data-testid":"lg-archive-loading",children:t("Loading…")}),u!==null&&u.length===0&&r(ee,{description:t("No archived logs match these filters. The durable archive fills as pipelineLogSink flushes records to R2."),testId:"lg-archive-empty",title:t("No archived logs.")}),u!==null&&u.length>0&&r("div",{className:"overflow-hidden rounded-xl border border-border shadow-xs",children:E(Ee,{"data-testid":"lg-archive-table",children:[r(Oe,{children:E(ge,{children:[r(B,{children:t("Time")}),r(B,{children:t("Level")}),r(B,{children:t("Function")}),r(B,{children:t("Message")}),r(B,{children:t("Trace")}),r(B,{children:t("Shard")}),r(B,{children:t("User")})]})}),r(_e,{children:u.map((g,C)=>r(Qe,{row:g},`${String(g.ts)}-${String(C)}`))})]})}),c!==void 0&&r("div",{children:r(Pe,{"data-testid":"lg-archive-more",disabled:f,onClick:S,size:"sm",variant:"outline",children:t(f?"Loading…":"Load more")})})]})},Ge=i=>{const e=q(11),{level:t,onToggle:a,selected:n}=i;let o;e[0]!==t||e[1]!==a?(o=()=>{a(t)},e[0]=t,e[1]=a,e[2]=o):o=e[2];const d=o,p=n?"border-border bg-muted font-medium":"border-input text-muted-foreground";let m;e[3]!==p?(m=H("rounded-md border px-2 py-1 text-xs",p),e[3]=p,e[4]=m):m=e[4];const c=`logs-level-${t}`;let s;return e[5]!==t||e[6]!==d||e[7]!==n||e[8]!==m||e[9]!==c?(s=r("button",{"aria-pressed":n,className:m,"data-testid":c,onClick:d,type:"button",children:t}),e[5]=t,e[6]=d,e[7]=n,e[8]=m,e[9]=c,e[10]=s):s=e[10],s},He=i=>{const e=q(68),{levelFilter:t,onLogPathChange:a,onSearchChange:n,onTimeRangeChange:o,onToggleLevel:d,onToggleSummary:p,pathFilter:m,search:c,showSummary:s,timeRange:f}=i,l=Q();let u;e[0]!==l?(u=l("Search messages"),e[0]=l,e[1]=u):u=e[1];let h;e[2]!==l?(h=l("search message"),e[2]=l,e[3]=h):h=e[3];let v;e[4]!==n||e[5]!==c||e[6]!==u||e[7]!==h?(v=r(D,{"aria-label":u,className:"h-8 w-48","data-testid":"lg-search",onChange:n,placeholder:h,value:c}),e[4]=n,e[5]=c,e[6]=u,e[7]=h,e[8]=v):v=e[8];let b;e[9]!==l?(b=l("Function path"),e[9]=l,e[10]=b):b=e[10];let y;e[11]!==l?(y=l("filter path"),e[11]=l,e[12]=y):y=e[12];let w;e[13]!==a||e[14]!==m||e[15]!==b||e[16]!==y?(w=r(D,{"aria-label":b,className:"h-8 w-40","data-testid":"logs-path-filter",onChange:a,placeholder:y,value:m}),e[13]=a,e[14]=m,e[15]=b,e[16]=y,e[17]=w):w=e[17];let x;e[18]!==l?(x=l("Level filter"),e[18]=l,e[19]=x):x=e[19];let T;e[20]!==t||e[21]!==d?(T=re.map(G=>r(Ge,{level:G,onToggle:d,selected:t.has(G)},G)),e[20]=t,e[21]=d,e[22]=T):T=e[22];let R;e[23]!==x||e[24]!==T?(R=r("div",{"aria-label":x,className:"inline-flex items-center gap-1","data-testid":"logs-level-filter",role:"group",children:T}),e[23]=x,e[24]=T,e[25]=R):R=e[25];let N;e[26]!==l?(N=l("Time range"),e[26]=l,e[27]=N):N=e[27];let L;e[28]!==l?(L=l("All time"),e[28]=l,e[29]=L):L=e[29];let S;e[30]!==L?(S=r("option",{value:"all",children:L}),e[30]=L,e[31]=S):S=e[31];let g;e[32]!==l?(g=l("Last 5m"),e[32]=l,e[33]=g):g=e[33];let C;e[34]!==g?(C=r("option",{value:"5m",children:g}),e[34]=g,e[35]=C):C=e[35];let k;e[36]!==l?(k=l("Last 15m"),e[36]=l,e[37]=k):k=e[37];let P;e[38]!==k?(P=r("option",{value:"15m",children:k}),e[38]=k,e[39]=P):P=e[39];let O;e[40]!==l?(O=l("Last hour"),e[40]=l,e[41]=O):O=e[41];let _;e[42]!==O?(_=r("option",{value:"1h",children:O}),e[42]=O,e[43]=_):_=e[43];let A;e[44]!==o||e[45]!==N||e[46]!==S||e[47]!==C||e[48]!==P||e[49]!==_||e[50]!==f?(A=E("select",{"aria-label":N,className:"h-8 rounded-md border border-input bg-transparent px-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-none","data-testid":"logs-time-range",onChange:o,value:f,children:[S,C,P,_]}),e[44]=o,e[45]=N,e[46]=S,e[47]=C,e[48]=P,e[49]=_,e[50]=f,e[51]=A):A=e[51];const z=s?"border-border bg-muted font-medium":"border-input text-muted-foreground";let M;e[52]!==z?(M=H("h-8 rounded-md border px-3 text-sm",z),e[52]=z,e[53]=M):M=e[53];let U;e[54]!==s||e[55]!==l?(U=l(s?"List":"Summary"),e[54]=s,e[55]=l,e[56]=U):U=e[56];let $;e[57]!==p||e[58]!==s||e[59]!==M||e[60]!==U?($=r("button",{"aria-pressed":s,className:M,"data-testid":"logs-summary-toggle",onClick:p,type:"button",children:U}),e[57]=p,e[58]=s,e[59]=M,e[60]=U,e[61]=$):$=e[61];let K;return e[62]!==A||e[63]!==$||e[64]!==v||e[65]!==w||e[66]!==R?(K=E("div",{className:"flex flex-wrap items-center gap-2",children:[v,w,R,A,$]}),e[62]=A,e[63]=$,e[64]=v,e[65]=w,e[66]=R,e[67]=K):K=e[67],K},We=i=>{const e=q(53),{onOutcomeChange:t,onPathChange:a,onTableChange:n,onUserChange:o,outcomeFilter:d,pathPrefix:p,tableFilter:m,userIdFilter:c}=i,s=Q();let f;e[0]!==s?(f=s("Function path"),e[0]=s,e[1]=f):f=e[1];let l;e[2]!==s?(l=s("file:function"),e[2]=s,e[3]=l):l=e[3];let u;e[4]!==a||e[5]!==p||e[6]!==f||e[7]!==l?(u=r(D,{"aria-label":f,className:"h-8 w-44","data-testid":"lg-req-path",onChange:a,placeholder:l,value:p}),e[4]=a,e[5]=p,e[6]=f,e[7]=l,e[8]=u):u=e[8];let h;e[9]!==s?(h=s("User id"),e[9]=s,e[10]=h):h=e[10];let v;e[11]!==s?(v=s("userId"),e[11]=s,e[12]=v):v=e[12];let b;e[13]!==o||e[14]!==h||e[15]!==v||e[16]!==c?(b=r(D,{"aria-label":h,className:"h-8 w-32","data-testid":"lg-req-user",onChange:o,placeholder:v,value:c}),e[13]=o,e[14]=h,e[15]=v,e[16]=c,e[17]=b):b=e[17];let y;e[18]!==s?(y=s("Table touched"),e[18]=s,e[19]=y):y=e[19];let w;e[20]!==s?(w=s("table"),e[20]=s,e[21]=w):w=e[21];let x;e[22]!==n||e[23]!==y||e[24]!==w||e[25]!==m?(x=r(D,{"aria-label":y,className:"h-8 w-32","data-testid":"lg-req-table",onChange:n,placeholder:w,value:m}),e[22]=n,e[23]=y,e[24]=w,e[25]=m,e[26]=x):x=e[26];let T;e[27]!==s?(T=s("Outcome filter"),e[27]=s,e[28]=T):T=e[28];let R;e[29]!==s?(R=s("all"),e[29]=s,e[30]=R):R=e[30];let N;e[31]!==R?(N=r("option",{value:"all",children:R}),e[31]=R,e[32]=N):N=e[32];let L;e[33]!==s?(L=s("ok"),e[33]=s,e[34]=L):L=e[34];let S;e[35]!==L?(S=r("option",{value:"ok",children:L}),e[35]=L,e[36]=S):S=e[36];let g;e[37]!==s?(g=s("error"),e[37]=s,e[38]=g):g=e[38];let C;e[39]!==g?(C=r("option",{value:"error",children:g}),e[39]=g,e[40]=C):C=e[40];let k;e[41]!==t||e[42]!==d||e[43]!==T||e[44]!==N||e[45]!==S||e[46]!==C?(k=E("select",{"aria-label":T,className:"h-8 rounded-md border border-input bg-transparent px-2 text-sm shadow-xs focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-none","data-testid":"lg-req-outcome",onChange:t,value:d,children:[N,S,C]}),e[41]=t,e[42]=d,e[43]=T,e[44]=N,e[45]=S,e[46]=C,e[47]=k):k=e[47];let P;return e[48]!==k||e[49]!==u||e[50]!==b||e[51]!==x?(P=E("div",{className:"flex flex-wrap items-center gap-2",children:[u,b,x,k]}),e[48]=k,e[49]=u,e[50]=b,e[51]=x,e[52]=P):P=e[52],P},ve=i=>{const e=q(7),{bucket:t}=i;let a;e[0]!==t.key?(a=r("span",{className:"truncate text-muted-foreground",role:"gridcell",children:t.key}),e[0]=t.key,e[1]=a):a=e[1];let n;e[2]!==t.count?(n=r("span",{className:"shrink-0 tabular-nums",role:"gridcell",children:t.count}),e[2]=t.count,e[3]=n):n=e[3];let o;return e[4]!==a||e[5]!==n?(o=E("div",{className:"flex items-center justify-between gap-4 px-3 py-1 font-mono text-xs","data-testid":"logs-summary-row",role:"row",children:[a,n]}),e[4]=a,e[5]=n,e[6]=o):o=e[6],o},Ye=i=>{const e=q(31),{summary:t}=i,a=Q();let n;e[0]!==t.total||e[1]!==a?(n=a("{count} entries",{count:t.total}),e[0]=t.total,e[1]=a,e[2]=n):n=e[2];let o;e[3]!==n?(o=r("p",{className:"text-xs text-muted-foreground","data-testid":"logs-summary-total",children:n}),e[3]=n,e[4]=o):o=e[4];let d;e[5]!==a?(d=a("By level"),e[5]=a,e[6]=d):d=e[6];let p;e[7]!==d?(p=r("h4",{className:"mb-1 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:d}),e[7]=d,e[8]=p):p=e[8];let m;e[9]!==t.byLevel?(m=t.byLevel.map(je),e[9]=t.byLevel,e[10]=m):m=e[10];let c;e[11]!==m?(c=r("div",{className:"overflow-hidden rounded-lg border border-border","data-testid":"logs-summary-levels",role:"grid",children:m}),e[11]=m,e[12]=c):c=e[12];let s;e[13]!==p||e[14]!==c?(s=E("div",{children:[p,c]}),e[13]=p,e[14]=c,e[15]=s):s=e[15];let f;e[16]!==a?(f=a("By function"),e[16]=a,e[17]=f):f=e[17];let l;e[18]!==f?(l=r("h4",{className:"mb-1 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:f}),e[18]=f,e[19]=l):l=e[19];let u;e[20]!==t.byPath?(u=t.byPath.map(Je),e[20]=t.byPath,e[21]=u):u=e[21];let h;e[22]!==u?(h=r("div",{className:"overflow-hidden rounded-lg border border-border","data-testid":"logs-summary-paths",role:"grid",children:u}),e[22]=u,e[23]=h):h=e[23];let v;e[24]!==h||e[25]!==l?(v=E("div",{children:[l,h]}),e[24]=h,e[25]=l,e[26]=v):v=e[26];let b;return e[27]!==v||e[28]!==o||e[29]!==s?(b=E("div",{className:"flex flex-col gap-4 rounded-xl border border-border bg-card p-4 shadow-xs","data-testid":"logs-summary",children:[o,s,v]}),e[27]=v,e[28]=o,e[29]=s,e[30]=b):b=e[30],b};function je(i){return r(ve,{bucket:i},i.key)}function Je(i){return r(ve,{bucket:i},i.key)}const Xe=i=>{const e=q(46),{liveError:t,onShardKeyChange:a,onShowArchive:n,onShowErrors:o,onShowRequests:d,shardKey:p,view:m}=i,c=Q(),s=m==="requests",f=m==="requests"?"bg-muted font-medium":"text-muted-foreground";let l;e[0]!==f?(l=H("px-3 py-1 text-sm",f),e[0]=f,e[1]=l):l=e[1];let u;e[2]!==c?(u=c("Requests"),e[2]=c,e[3]=u):u=e[3];let h;e[4]!==d||e[5]!==s||e[6]!==l||e[7]!==u?(h=r("button",{"aria-selected":s,className:l,"data-testid":"lg-view-requests",onClick:d,role:"tab",type:"button",children:u}),e[4]=d,e[5]=s,e[6]=l,e[7]=u,e[8]=h):h=e[8];const v=m==="errors",b=m==="errors"?"bg-muted font-medium":"text-muted-foreground";let y;e[9]!==b?(y=H("px-3 py-1 text-sm",b),e[9]=b,e[10]=y):y=e[10];let w;e[11]!==c?(w=c("Errors"),e[11]=c,e[12]=w):w=e[12];let x;e[13]!==o||e[14]!==v||e[15]!==y||e[16]!==w?(x=r("button",{"aria-selected":v,className:y,"data-testid":"lg-view-errors",onClick:o,role:"tab",type:"button",children:w}),e[13]=o,e[14]=v,e[15]=y,e[16]=w,e[17]=x):x=e[17];const T=m==="archive",R=m==="archive"?"bg-muted font-medium":"text-muted-foreground";let N;e[18]!==R?(N=H("px-3 py-1 text-sm",R),e[18]=R,e[19]=N):N=e[19];let L;e[20]!==c?(L=c("Archive"),e[20]=c,e[21]=L):L=e[21];let S;e[22]!==n||e[23]!==T||e[24]!==N||e[25]!==L?(S=r("button",{"aria-selected":T,className:N,"data-testid":"lg-view-archive",onClick:n,role:"tab",type:"button",children:L}),e[22]=n,e[23]=T,e[24]=N,e[25]=L,e[26]=S):S=e[26];let g;e[27]!==x||e[28]!==S||e[29]!==h?(g=E("div",{className:"inline-flex overflow-hidden rounded-lg border border-border",role:"tablist",children:[h,x,S]}),e[27]=x,e[28]=S,e[29]=h,e[30]=g):g=e[30];let C;e[31]!==a||e[32]!==p?(C=r(Ke,{onChange:a,testId:"lg-shard-input",value:p}),e[31]=a,e[32]=p,e[33]=C):C=e[33];let k;e[34]!==t||e[35]!==m?(k=m!=="archive"&&r(Ue,{message:t,prefix:"lg"}),e[34]=t,e[35]=m,e[36]=k):k=e[36];let P;e[37]!==c?(P=c("Open in Cloudflare"),e[37]=c,e[38]=P):P=e[38];let O;e[39]!==P?(O=r("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"lg-cf-link",href:pe,rel:"noreferrer",target:"_blank",children:P}),e[39]=P,e[40]=O):O=e[40];let _;return e[41]!==g||e[42]!==C||e[43]!==k||e[44]!==O?(_=E("div",{className:"flex flex-wrap items-center gap-2",children:[g,C,k,O]}),e[41]=g,e[42]=C,e[43]=k,e[44]=O,e[45]=_):_=e[45],_},te=400,Ze=36,et={height:te,overflow:"auto"},be={left:0,position:"absolute",top:0,width:"100%"},tt={error:"destructive",ok:"secondary"},xe=i=>{const e=q(6),{onOpenTrace:t,traceId:a}=i,n=Q();let o;e[0]!==t||e[1]!==n||e[2]!==a?(o=a===void 0?null:r("button",{className:"text-primary underline-offset-2 hover:underline","data-testid":"lg-trace-link",onClick:()=>{t(a)},type:"button",children:n("Trace")}),e[0]=t,e[1]=n,e[2]=a,e[3]=o):o=e[3];let d;return e[4]!==o?(d=r("span",{className:"w-16 shrink-0 text-right",role:"gridcell",children:o}),e[4]=o,e[5]=d):d=e[5],d},rt=i=>{const e=q(13),{entry:t,index:a,measureRef:n,onOpenTrace:o,start:d}=i,p=`translateY(${String(d)}px)`;let m;e[0]!==p?(m={...be,transform:p},e[0]=p,e[1]=m):m=e[1];const c=m;let s;e[2]!==t?(s=r(Me,{entry:t}),e[2]=t,e[3]=s):s=e[3];let f;e[4]!==t.traceId||e[5]!==o?(f=r(xe,{onOpenTrace:o,traceId:t.traceId}),e[4]=t.traceId,e[5]=o,e[6]=f):f=e[6];let l;return e[7]!==a||e[8]!==n||e[9]!==c||e[10]!==s||e[11]!==f?(l=E("div",{className:"flex items-center border-b border-border px-3 py-1.5 font-mono text-xs hover:bg-muted/50","data-index":a,"data-testid":"lg-row",ref:n,role:"row",style:c,children:[s,f]}),e[7]=a,e[8]=n,e[9]=c,e[10]=s,e[11]=f,e[12]=l):l=e[12],l},ce=i=>i.length===0?"—":i.join(", "),st=i=>{const e=q(41),{entry:t,index:a,measureRef:n,onOpenTrace:o,start:d}=i,p=`translateY(${String(d)}px)`;let m;e[0]!==p?(m={...be,transform:p},e[0]=p,e[1]=m):m=e[1];const c=m;let s;e[2]!==t.ts?(s=new Date(t.ts).toLocaleString(),e[2]=t.ts,e[3]=s):s=e[3];let f;e[4]!==s?(f=r("span",{className:"w-40 shrink-0 tabular-nums text-muted-foreground",role:"gridcell",children:s}),e[4]=s,e[5]=f):f=e[5];const l=tt[t.outcome];let u;e[6]!==t.outcome||e[7]!==l?(u=r("span",{className:"w-16 shrink-0",role:"gridcell",children:r(he,{variant:l,children:t.outcome})}),e[6]=t.outcome,e[7]=l,e[8]=u):u=e[8];let h;e[9]!==t.functionPath?(h=r("span",{className:"w-44 shrink-0 truncate",role:"gridcell",title:t.functionPath,children:t.functionPath}),e[9]=t.functionPath,e[10]=h):h=e[10];const v=t.shardKey??"—";let b;e[11]!==v?(b=r("span",{className:"w-24 shrink-0 truncate text-muted-foreground",role:"gridcell",children:v}),e[11]=v,e[12]=b):b=e[12];const y=t.userId??"—";let w;e[13]!==y?(w=r("span",{className:"w-24 shrink-0 truncate text-muted-foreground",role:"gridcell",children:y}),e[13]=y,e[14]=w):w=e[14];let x;e[15]!==t.durationMs?(x=Math.round(t.durationMs),e[15]=t.durationMs,e[16]=x):x=e[16];const T=`${String(x)}ms`;let R;e[17]!==T?(R=r("span",{className:"w-16 shrink-0 tabular-nums text-muted-foreground",role:"gridcell",children:T}),e[17]=T,e[18]=R):R=e[18];let N;e[19]!==t.errorMessage||e[20]!==t.outcome||e[21]!==t.tablesRead||e[22]!==t.tablesWritten?(N=t.outcome==="error"&&t.errorMessage!==void 0?t.errorMessage:`r:${ce(t.tablesRead)} · w:${ce(t.tablesWritten)}`,e[19]=t.errorMessage,e[20]=t.outcome,e[21]=t.tablesRead,e[22]=t.tablesWritten,e[23]=N):N=e[23];let L;e[24]!==N?(L=r("span",{className:"flex-1 truncate text-muted-foreground",role:"gridcell",children:N}),e[24]=N,e[25]=L):L=e[25];let S;e[26]!==t.traceId||e[27]!==o?(S=r(xe,{onOpenTrace:o,traceId:t.traceId}),e[26]=t.traceId,e[27]=o,e[28]=S):S=e[28];let g;return e[29]!==a||e[30]!==n||e[31]!==c||e[32]!==w||e[33]!==R||e[34]!==L||e[35]!==S||e[36]!==f||e[37]!==u||e[38]!==h||e[39]!==b?(g=E("div",{className:"flex items-center border-b border-border px-3 py-1.5 font-mono text-xs hover:bg-muted/50","data-index":a,"data-testid":"lg-req-row",ref:n,role:"row",style:c,children:[f,u,h,b,w,R,L,S]}),e[29]=a,e[30]=n,e[31]=c,e[32]=w,e[33]=R,e[34]=L,e[35]=S,e[36]=f,e[37]=u,e[38]=h,e[39]=b,e[40]=g):g=e[40],g},de=i=>{const{entries:e}=i??{};return Array.isArray(e)?e:[]},lt=i=>{const e={};return i.functionPathPrefix.trim()!==""&&(e.functionPathPrefix=i.functionPathPrefix.trim()),i.userId.trim()!==""&&(e.userId=i.userId.trim()),i.tableTouched.trim()!==""&&(e.tableTouched=i.tableTouched.trim()),(i.outcome==="ok"||i.outcome==="error")&&(e.outcome=i.outcome),e},ot={"5m":300*1e3,"15m":900*1e3,"1h":3600*1e3},at=(i,e)=>{const t=e.search.trim().toLowerCase(),a=e.path.trim().toLowerCase(),n=e.range==="all"?Number.NEGATIVE_INFINITY:e.now-ot[e.range];return i.filter(o=>e.levels.size>0&&!e.levels.has(o.level)||o.timestamp<n||a!==""&&!(o.functionPath??"").toLowerCase().includes(a)?!1:t===""||o.message.toLowerCase().includes(t)||fe(o.fields).toLowerCase().includes(t))},nt="—",it=i=>{const e=new Map,t=new Map;for(const o of i){e.set(o.level,(e.get(o.level)??0)+1);const d=o.functionPath??nt;t.set(d,(t.get(d)??0)+1)}const a=re.filter(o=>e.has(o)).map(o=>({count:e.get(o)??0,key:o})),n=[...t.entries()].map(([o,d])=>({count:d,key:o})).toSorted((o,d)=>d.count===o.count?o.key.localeCompare(d.key):d.count-o.count);return{byLevel:a,byPath:n,total:i.length}},Wt=({initialShardKey:i})=>{const e=Q(),[t,a]=F("requests"),{queryShardKey:n,setShardKey:o,shardKey:d}=Ie(i),[p,m]=F(""),[c,s]=F(()=>new Set),[f,l]=F(""),[u,h]=F("all"),[v,b]=F(!1),[y,w]=F(""),[x,T]=F(""),[R,N]=F(""),[L,S]=F("all"),g=lt({functionPathPrefix:y,outcome:L,tableTouched:R,userId:x}),C=le(oe.getRequestLog,g,{enabled:t==="requests",live:!0,shardKey:n}),k=le(oe.getLogs,{},{enabled:t==="errors",live:!0,shardKey:n}),P=t==="requests"?C:k,{error:O,errorSource:_,isLoading:A,liveError:z}=P,M=Te(n),U=de(k.data),$=de(C.data);me(()=>{P.data!==void 0&&Re(n)},[P.data,n]);const K=at(U,{levels:c,now:Date.now(),path:f,range:u,search:p}),G=it(K),J=t==="requests"?$.length:K.length,X=t==="errors"&&v,W=Ne(()=>O!==null?"error":J===0?A?X?"summary":"list":"empty":X?"summary":"list",[J,A,O,X]),se=ue(null),Y=Ce({count:J,estimateSize:()=>Ze,getScrollElement:()=>se.current,initialRect:{height:te,width:800},observeElementRect:(I,Z)=>ke(I,Z,te),overscan:8}),ye=Y.getVirtualItems(),we={height:Y.getTotalSize(),position:"relative",width:"100%"};return E("div",{className:"flex flex-col gap-4","data-testid":"lunora-logs",children:[r(Xe,{liveError:z,onShardKeyChange:o,onShowArchive:()=>{a("archive"),b(!1)},onShowErrors:()=>{a("errors"),b(!1)},onShowRequests:()=>{a("requests"),b(!1)},shardKey:d,view:t}),t==="errors"&&r(He,{levelFilter:c,onLogPathChange:I=>{l(I.target.value)},onSearchChange:I=>{m(I.target.value)},onTimeRangeChange:I=>{h(I.target.value)},onToggleLevel:I=>{s(Z=>{const j=new Set(Z);return j.has(I)?j.delete(I):j.add(I),j})},onToggleSummary:()=>{b(I=>!I)},pathFilter:f,search:p,showSummary:v,timeRange:u}),t==="requests"&&r(We,{onOutcomeChange:I=>{S(I.target.value)},onPathChange:I=>{w(I.target.value)},onTableChange:I=>{N(I.target.value)},onUserChange:I=>{T(I.target.value)},outcomeFilter:L,pathPrefix:y,tableFilter:R,userIdFilter:x}),t==="archive"?r(ze,{shardKey:n}):E($e,{children:[W==="error"&&r(Se,{error:_,shardKey:n,testId:"lg-error"}),W==="empty"&&r(ee,{description:e("Function and request logs for this shard show up here as your app handles traffic."),icon:r("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:r("path",{d:"M4 5h16M4 12h16M4 19h10"})}),testId:"lg-empty",title:e("No logs.")}),W==="summary"&&r(Ye,{summary:G}),W==="list"&&r("div",{className:"rounded-xl border border-border shadow-xs","data-testid":"lg-scroll",ref:se,style:et,children:r("div",{"aria-label":e("Recent logs"),"data-testid":"lg-table",role:"grid",style:we,children:ye.map(I=>t==="requests"?r(st,{entry:$[I.index],index:I.index,measureRef:Y.measureElement,onOpenTrace:M,start:I.start},I.key):r(rt,{entry:K[I.index],index:I.index,measureRef:Y.measureElement,onOpenTrace:M,start:I.start},I.key))})})]})]})};export{Wt as LogsPanel,at as filterLogs,it as summarizeLogs};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{E as se}from"../packem_shared/error-alert-
|
|
1
|
+
import{E as se}from"../packem_shared/error-alert-DKXm5h19.mjs";import{B as ie}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as g}from"../packem_shared/button-q0UYSmrn.mjs";import{E as oe}from"../packem_shared/empty-state-D7jEML_T.mjs";import{I as ne}from"../packem_shared/input-CXhxesPC.mjs";import{S as le}from"../packem_shared/scroll-area-CXCQH7VT.mjs";import{Separator as de}from"@base-ui/react/separator";import{c as ce}from"../packem_shared/utils-bhneXptQ.mjs";import{jsx as t,jsxs as n,Fragment as me}from"react/jsx-runtime";import{useT as ue}from"../packem_shared/DEFAULT_LOCALE-BQ3jRT74.mjs";import{c as ae,d as X,b as Z,f as ee,g as he,h as te}from"../packem_shared/internal-hIuTpSbx.mjs";import{c as pe}from"react/compiler-runtime";import{useState as F}from"react";import{u as fe}from"../packem_shared/use-admin-query-CaOm4JS3.mjs";import{useAutoRefresh as xe}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-Py5Yx7rP.mjs";import{u as be}from"../packem_shared/use-studio-client-DCA50tF2.mjs";import{ADMIN_FUNCTIONS as J}from"../packem_shared/ADMIN_FUNCTIONS-DUXsXId1.mjs";function ge({className:r,orientation:e="horizontal",...i}){return t(de,{"data-slot":"separator",orientation:e,className:ce("shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",r),...i})}const ve=/https?:\/\/[^\s"'<>)]+/i,re=r=>r===void 0?void 0:ve.exec(r)?.[0],v=r=>r===void 0?"":Array.isArray(r)?r.join(", "):r,Ne=/<a\s(?:[^>]*?\s)?href\s*=\s*["'](https?:\/\/[^"'\s]+)["']/iu,we=/&(?:amp|#0*38|#x0*26);/giu,ye=r=>r===void 0?void 0:((r.html===void 0?void 0:Ne.exec(r.html)?.[1])??re(r.text)??re(r.html))?.replaceAll(we,"&"),Ce=(r,e)=>{const i=e.trim().toLowerCase();return i===""?r:r.filter(o=>`${o.subject} ${v(o.to)} ${v(o.cc)}`.toLowerCase().includes(i))},Se=(r,e)=>{if(r.length!==0)return r.find(i=>i.id===e)??r[0]},Te=ae(J.clearCapturedMail),ke=ae(J.sendTestMail),Ae=r=>{const e=pe(36),{limit:i}=r,o=be();let p;e[0]!==i?(p={limit:i},e[0]=i,e[1]=p):p=e[1];const{data:P,error:N,errorSource:w,isLoading:b,poll:R,refetch:m}=fe(J.getCapturedMail,p),[y,f]=F(null),[O,C]=F(null),[s,h]=F("html"),[x,H]=F(""),a=P?.entries??[],u=N??y,B=N===null?y:w;let S;e[2]!==o||e[3]!==m?(S=async()=>{f(null);try{await o.query(Te,{},X("")),C(null),m()}catch(d){f(Z(d))}},e[2]=o,e[3]=m,e[4]=S):S=e[4];const D=S;let T;e[5]!==o||e[6]!==m?(T=async()=>{f(null);try{await o.query(ke,{},X("")),m()}catch(d){f(Z(d))}},e[5]=o,e[6]=m,e[7]=T):T=e[7];const q=T;xe(R,!0);let k;e[8]!==D?(k=()=>{ee(D())},e[8]=D,e[9]=k):k=e[9];const U=k;let A;e[10]!==q?(A=()=>{ee(q())},e[10]=q,e[11]=A):A=e[11];const W=A;let E;e[12]===Symbol.for("react.memo_cache_sentinel")?(E=d=>{H(d.currentTarget.value)},e[12]=E):E=e[12];const K=E;let _;e[13]===Symbol.for("react.memo_cache_sentinel")?(_=d=>{const{id:c}=d.currentTarget.dataset;c!==void 0&&C(c)},e[13]=_):_=e[13];const Q=_;let L;e[14]===Symbol.for("react.memo_cache_sentinel")?(L=d=>{const c=d.currentTarget.dataset.tab;(c==="headers"||c==="html"||c==="text")&&h(c)},e[14]=L):L=e[14];const V=L,M=Ce(a,x),I=Se(M,O),l=ye(I);let j;e[15]!==l?(j=()=>{l!==void 0&&he(l)},e[15]=l,e[16]=j):j=e[16];const Y=j;let $;e[17]!==l?($=()=>{l!==void 0&&"window"in globalThis&&globalThis.window.open(l,"_blank","noopener")},e[17]=l,e[18]=$):$=e[18];const G=$;let z;return e[19]!==a||e[20]!==u||e[21]!==B||e[22]!==x||e[23]!==b||e[24]!==l||e[25]!==U||e[26]!==Y||e[27]!==K||e[28]!==G||e[29]!==Q||e[30]!==V||e[31]!==W||e[32]!==I||e[33]!==s||e[34]!==M?(z={entries:a,error:u,errorSource:B,filter:x,isLoading:b,link:l,onClear:U,onCopyLink:Y,onFilterChange:K,onOpenLink:G,onSelectMessage:Q,onSelectTab:V,onSendTest:W,selected:I,tab:s,visible:M},e[19]=a,e[20]=u,e[21]=B,e[22]=x,e[23]=b,e[24]=l,e[25]=U,e[26]=Y,e[27]=K,e[28]=G,e[29]=Q,e[30]=V,e[31]=W,e[32]=I,e[33]=s,e[34]=M,e[35]=z):z=e[35],z},Ee=`<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src data:; style-src 'unsafe-inline'; font-src data:">`,_e=r=>`${Ee}${r}`,Qe=({limit:r=100})=>{const e=ue(),{entries:i,error:o,errorSource:p,filter:P,isLoading:N,link:w,onClear:b,onCopyLink:R,onFilterChange:m,onOpenLink:y,onSelectMessage:f,onSelectTab:O,onSendTest:C,selected:s,tab:h,visible:x}=Ae({limit:r}),H=a=>e(a==="html"?"HTML":a==="text"?"Plain text":"Headers");return n("div",{className:"flex flex-col gap-4","data-testid":"mail-panel",children:[n("div",{className:"flex flex-wrap items-center gap-2",children:[t(g,{"data-testid":"mail-send-test",onClick:C,size:"sm",type:"button",variant:"outline",children:e("Send test")}),t(g,{"data-testid":"mail-clear",disabled:i.length===0,onClick:b,size:"sm",type:"button",variant:"outline",children:e("Clear inbox")}),i.length>0&&t(ie,{className:"ml-auto","data-testid":"mail-count",variant:"secondary",children:e("{count} messages",{count:i.length})})]}),o!==null&&t(se,{error:p,testId:"mail-error"}),o===null&&!N&&i.length===0&&t(oe,{description:e("Email your app sends in dev is captured here — nothing is delivered."),icon:n("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[t("path",{d:"M4 5h16v14H4z"}),t("path",{d:"m4 6 8 6 8-6"})]}),testId:"mail-empty",title:e("No captured email.")}),i.length>0&&n("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-[minmax(0,22rem)_1fr]","data-testid":"mail-reader",children:[n("div",{className:"flex flex-col gap-2",children:[t(ne,{"aria-label":e("Search messages"),"data-testid":"mail-search",onChange:m,placeholder:e("Filter messages"),type:"search",value:P}),t(le,{className:"max-h-[32rem] rounded-xl border border-border bg-card shadow-xs","data-testid":"mail-list",children:t("ul",{className:"divide-y",children:x.map(a=>{const u=a.id===s?.id;return t("li",{children:n("button",{className:`flex w-full flex-col items-start gap-0.5 px-3 py-2 text-left text-sm hover:bg-muted/60 ${u?"bg-muted":""}`,"data-active":u,"data-id":a.id,"data-testid":"mail-list-item",onClick:f,type:"button",children:[t("span",{className:"w-full truncate font-medium",children:a.subject||e("(no subject)")}),t("span",{className:"w-full truncate text-xs text-muted-foreground",children:v(a.to)}),t("span",{className:"text-xs text-muted-foreground tabular-nums",children:te(a.capturedAt,"—")})]})},a.id)})})})]}),s!==void 0&&n("div",{className:"flex min-w-0 flex-col gap-3 rounded-xl border border-border bg-card p-4 shadow-xs","data-testid":"mail-detail",children:[n("div",{className:"flex flex-col gap-1",children:[t("h2",{className:"truncate text-base font-semibold","data-testid":"mail-subject",children:s.subject||e("(no subject)")}),n("dl",{className:"grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 text-xs text-muted-foreground",children:[t("dt",{children:e("From")}),t("dd",{className:"truncate font-mono",children:s.from??"—"}),t("dt",{children:e("To")}),t("dd",{className:"truncate font-mono",children:v(s.to)}),s.cc!==void 0&&s.cc.length>0&&n(me,{children:[t("dt",{children:e("Cc")}),t("dd",{className:"truncate font-mono",children:v(s.cc)})]}),t("dt",{children:e("Sent")}),t("dd",{className:"tabular-nums",children:te(s.capturedAt,"—")})]})]}),n("div",{className:"flex flex-wrap items-center gap-2","data-testid":"mail-actions",children:[t(g,{"data-testid":"mail-copy-link",disabled:w===void 0,onClick:R,size:"sm",type:"button",variant:"outline",children:e("Copy link")}),t(g,{"data-testid":"mail-open-link",disabled:w===void 0,onClick:y,size:"sm",type:"button",variant:"outline",children:e("Open in new tab")})]}),t(ge,{}),t("div",{className:"flex items-center gap-1","data-testid":"mail-tabs",role:"tablist",children:["html","text","headers"].map(a=>t(g,{"aria-selected":h===a,"data-tab":a,"data-testid":`mail-tab-${a}`,onClick:O,role:"tab",size:"sm",type:"button",variant:h===a?"secondary":"ghost",children:H(a)},a))}),n("div",{className:"min-h-[12rem]",children:[h==="html"&&(s.html===void 0?t("p",{className:"text-sm text-muted-foreground",children:e("No HTML body.")}):t("iframe",{className:"h-[24rem] w-full rounded-md border bg-white","data-testid":"mail-preview-html",sandbox:"",srcDoc:_e(s.html),title:e("Email preview")})),h==="text"&&(s.text===void 0?t("p",{className:"text-sm text-muted-foreground",children:e("No text body.")}):t("pre",{className:"overflow-auto whitespace-pre-wrap rounded-md border bg-muted/30 p-3 text-xs","data-testid":"mail-preview-text",children:s.text})),h==="headers"&&(s.headers===void 0||Object.keys(s.headers).length===0?t("p",{className:"text-sm text-muted-foreground",children:e("No headers.")}):t("pre",{className:"overflow-auto whitespace-pre-wrap rounded-md border bg-muted/30 p-3 text-xs","data-testid":"mail-preview-headers",children:Object.entries(s.headers).map(([a,u])=>`${a}: ${u}`).join(`
|
|
2
2
|
`)}))]})]})]})]})};export{Qe as MailPanel};
|