@lunora/studio 1.0.0-alpha.140 → 1.0.0-alpha.142

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/dist/index.d.mts +66 -65
  2. package/dist/index.d.ts +66 -65
  3. package/dist/index.mjs +1 -1
  4. package/dist/mount.mjs +1 -1
  5. package/dist/packem_chunks/AdvisorHealthPanel.mjs +1 -1
  6. package/dist/packem_chunks/ApiTab.mjs +1 -1
  7. package/dist/packem_chunks/AuditPanel.mjs +1 -1
  8. package/dist/packem_chunks/ExportImportPanel.mjs +1 -1
  9. package/dist/packem_chunks/FileBrowser.mjs +1 -1
  10. package/dist/packem_chunks/FunctionRunner.mjs +1 -1
  11. package/dist/packem_chunks/FunctionStatsPanel.mjs +1 -1
  12. package/dist/packem_chunks/HealthPanel.mjs +1 -1
  13. package/dist/packem_chunks/InsightsPanel.mjs +1 -1
  14. package/dist/packem_chunks/LogsPanel.mjs +1 -1
  15. package/dist/packem_chunks/MailPanel.mjs +1 -1
  16. package/dist/packem_chunks/MetricsPanel.mjs +1 -1
  17. package/dist/packem_chunks/NotificationsPanel.mjs +1 -1
  18. package/dist/packem_chunks/PitrPanel.mjs +1 -1
  19. package/dist/packem_chunks/SchemaViewer.mjs +1 -1
  20. package/dist/packem_chunks/SecurityAdvisorPanel.mjs +1 -1
  21. package/dist/packem_chunks/SettingsPanel.mjs +1 -1
  22. package/dist/packem_chunks/SqlEditorPanel.mjs +1 -1
  23. package/dist/packem_chunks/TableEditor.mjs +1 -1
  24. package/dist/packem_chunks/agents-panel.mjs +1 -1
  25. package/dist/packem_chunks/auth-audit-panel.mjs +1 -1
  26. package/dist/packem_chunks/auth-config-panel.mjs +1 -1
  27. package/dist/packem_chunks/auth-sessions-panel.mjs +1 -1
  28. package/dist/packem_chunks/containers-panel.mjs +1 -1
  29. package/dist/packem_chunks/dashboards-panel.mjs +1 -1
  30. package/dist/packem_chunks/evals-panel.mjs +1 -1
  31. package/dist/packem_chunks/fanout-panel.mjs +1 -1
  32. package/dist/packem_chunks/flags-panel.mjs +1 -1
  33. package/dist/packem_chunks/issues-panel.mjs +1 -1
  34. package/dist/packem_chunks/kv-browser.mjs +1 -1
  35. package/dist/packem_chunks/migrations-route.mjs +1 -1
  36. package/dist/packem_chunks/organizations-panel.mjs +1 -1
  37. package/dist/packem_chunks/payments-panel.mjs +1 -1
  38. package/dist/packem_chunks/permissions-panel.mjs +1 -1
  39. package/dist/packem_chunks/queues-panel.mjs +1 -1
  40. package/dist/packem_chunks/reactors-panel.mjs +1 -1
  41. package/dist/packem_chunks/rls-panel.mjs +1 -1
  42. package/dist/packem_chunks/schedule-panel.mjs +1 -1
  43. package/dist/packem_chunks/storage-rules-panel.mjs +1 -1
  44. package/dist/packem_chunks/subscriptions-panel.mjs +1 -1
  45. package/dist/packem_chunks/sync-client-panel.mjs +1 -1
  46. package/dist/packem_chunks/traces-panel.mjs +1 -1
  47. package/dist/packem_chunks/users-panel.mjs +1 -1
  48. package/dist/packem_chunks/workflows-panel.mjs +1 -1
  49. package/dist/packem_shared/{ADMIN_FUNCTIONS-B6z7VLYt.mjs → ADMIN_FUNCTIONS-B8yyk5BX.mjs} +1 -1
  50. package/dist/packem_shared/{ApiDocsPanel-BOxViKDM.mjs → ApiDocsPanel-l4DQX1Vq.mjs} +1 -1
  51. package/dist/packem_shared/DataBrowser-C2B-HNOL.mjs +4 -0
  52. package/dist/packem_shared/{GlobalDataBrowser-BKm77TNC.mjs → GlobalDataBrowser-DK4fgb7h.mjs} +1 -1
  53. package/dist/packem_shared/HomePanel-B869m6wb.mjs +1 -0
  54. package/dist/packem_shared/{MigrationsPanel-CYe0ygT8.mjs → MigrationsPanel-BZJ_Rv4t.mjs} +1 -1
  55. package/dist/packem_shared/{ScheduledJobs-DN0yQoo6.mjs → ScheduledJobs-oDVEymk5.mjs} +1 -1
  56. package/dist/packem_shared/{Studio-CHCAslfi.mjs → Studio-5eRSjGmd.mjs} +1 -1
  57. package/dist/packem_shared/{StudioApp-DVl_E-VZ.mjs → StudioApp-Bkym2DjT.mjs} +1 -1
  58. package/dist/packem_shared/{advisor-view-5mZH6453.mjs → advisor-view-DoSv436g.mjs} +1 -1
  59. package/dist/packem_shared/{error-alert-CczbAfst.mjs → error-alert-CWs6gA3I.mjs} +1 -1
  60. package/dist/packem_shared/home-panel-ChKczU0I.mjs +3 -0
  61. package/dist/packem_shared/{recording-client-BEZ6tVgo.mjs → recording-client-BGyq5_JP.mjs} +1 -1
  62. package/dist/packem_shared/{studio-DRHuKwbt.mjs → studio-4odoxrh9.mjs} +1 -1
  63. package/dist/packem_shared/{table-list-sidebar-BxZm3sBJ.mjs → table-list-sidebar-T7--Fv-V.mjs} +1 -1
  64. package/dist/packem_shared/use-admin-query-C7JRlFIE.mjs +1 -0
  65. package/dist/packem_shared/{use-auth-config-gxJL0E1r.mjs → use-auth-config-o-FcIXzR.mjs} +1 -1
  66. package/dist/packem_shared/{use-sql-assistant-CFRzdA9E.mjs → use-sql-assistant-Ib7Ik6cw.mjs} +1 -1
  67. package/dist/packem_shared/wire-codec-DGcjNTbZ.mjs +1 -0
  68. package/dist/standalone/chunk-2O5QDSR2.js +1 -0
  69. package/dist/standalone/chunk-37VWQZEF.js +3 -0
  70. package/dist/standalone/{chunk-BX3F7MXP.js → chunk-3MNTCYQ3.js} +1 -1
  71. package/dist/standalone/{chunk-O2FV34ZD.js → chunk-45T7VWRY.js} +1 -1
  72. package/dist/standalone/{chunk-M6MCQSPI.js → chunk-4TKQNBNV.js} +1 -1
  73. package/dist/standalone/{chunk-CXNZVJ3S.js → chunk-4ZEL6BYL.js} +1 -1
  74. package/dist/standalone/{chunk-3PKWDMXA.js → chunk-6H36JL4I.js} +1 -1
  75. package/dist/standalone/{chunk-USC5APTS.js → chunk-7DNDONOI.js} +1 -1
  76. package/dist/standalone/{chunk-MIVYBFY3.js → chunk-7GHBT32T.js} +1 -1
  77. package/dist/standalone/{chunk-LC3XGRNU.js → chunk-7ZWZNTKG.js} +1 -1
  78. package/dist/standalone/{chunk-TRL7AHZK.js → chunk-A4MLWW6Q.js} +1 -1
  79. package/dist/standalone/{chunk-UKL4FSKP.js → chunk-AR46S3PP.js} +1 -1
  80. package/dist/standalone/{chunk-3ZKYTFKY.js → chunk-ATO3Y6BD.js} +1 -1
  81. package/dist/standalone/{chunk-EIKBBMM4.js → chunk-AZOLR4BN.js} +1 -1
  82. package/dist/standalone/{chunk-2AFIMJPZ.js → chunk-BAIGKYAI.js} +1 -1
  83. package/dist/standalone/{chunk-U4IH7O6B.js → chunk-BDZFZT2N.js} +1 -1
  84. package/dist/standalone/{chunk-MRJNT4OH.js → chunk-BMAP2J7X.js} +1 -1
  85. package/dist/standalone/{chunk-YFLOZILV.js → chunk-BNGOZSCT.js} +1 -1
  86. package/dist/standalone/{chunk-TZI3JW3Q.js → chunk-BP7MDQY5.js} +1 -1
  87. package/dist/standalone/{chunk-PAUQAU23.js → chunk-BYWVVRKM.js} +1 -1
  88. package/dist/standalone/{chunk-Q3HF6P2M.js → chunk-DRFQ3BUM.js} +1 -1
  89. package/dist/standalone/{chunk-7QMV55PO.js → chunk-F2R2UX27.js} +1 -1
  90. package/dist/standalone/{chunk-C5L4BSYY.js → chunk-GCYNOU4C.js} +1 -1
  91. package/dist/standalone/{chunk-KEZZGUYY.js → chunk-HCO5STOE.js} +1 -1
  92. package/dist/standalone/{chunk-ZOWSTFP5.js → chunk-HJOKETMZ.js} +1 -1
  93. package/dist/standalone/{chunk-2DO5EQCU.js → chunk-HS7MSYK7.js} +1 -1
  94. package/dist/standalone/{chunk-EG6XHY7N.js → chunk-HWBXHONF.js} +1 -1
  95. package/dist/standalone/{chunk-NE7AR3N3.js → chunk-HZX6KSC2.js} +1 -1
  96. package/dist/standalone/{chunk-KDWJAKFX.js → chunk-I27WXF7C.js} +1 -1
  97. package/dist/standalone/{chunk-2QSOSRNW.js → chunk-IGBQ2CPW.js} +1 -1
  98. package/dist/standalone/{chunk-LJC5BM3X.js → chunk-IMUTQDOB.js} +1 -1
  99. package/dist/standalone/{chunk-5PCGB55O.js → chunk-IXLH5YBD.js} +1 -1
  100. package/dist/standalone/{chunk-UWDFH35E.js → chunk-IXMHWLSN.js} +1 -1
  101. package/dist/standalone/{chunk-Z5APSEW7.js → chunk-JXELPXLG.js} +1 -1
  102. package/dist/standalone/{chunk-ERWZGAOA.js → chunk-KBSJO66O.js} +1 -1
  103. package/dist/standalone/chunk-L6KA7M4B.js +1 -0
  104. package/dist/standalone/{chunk-HODZXHVK.js → chunk-LELCKAUP.js} +1 -1
  105. package/dist/standalone/{chunk-JYMXJUJ2.js → chunk-LPFRXMG7.js} +1 -1
  106. package/dist/standalone/{chunk-EILTQDXX.js → chunk-NPHUYLGW.js} +1 -1
  107. package/dist/standalone/{chunk-RK3WWWTT.js → chunk-NZMUY7ZG.js} +1 -1
  108. package/dist/standalone/{chunk-ZE2Q22OK.js → chunk-O32757IN.js} +1 -1
  109. package/dist/standalone/{chunk-JHEUUNXM.js → chunk-PCOD3V5E.js} +1 -1
  110. package/dist/standalone/{chunk-UBVWMMQG.js → chunk-PNFIPQJO.js} +1 -1
  111. package/dist/standalone/{chunk-56AFJWER.js → chunk-PV2LCZ6D.js} +1 -1
  112. package/dist/standalone/chunk-QEN7S6YK.js +7 -0
  113. package/dist/standalone/{chunk-DQHYNFE4.js → chunk-QM3SGSVK.js} +1 -1
  114. package/dist/standalone/{chunk-VPPKG2IW.js → chunk-S4HBMTJ3.js} +1 -1
  115. package/dist/standalone/{chunk-S63ID2FC.js → chunk-SPP7FEDA.js} +1 -1
  116. package/dist/standalone/{chunk-WR675JUF.js → chunk-V5ITAZCZ.js} +1 -1
  117. package/dist/standalone/{chunk-JAZCU2PP.js → chunk-W7E5WYFI.js} +1 -1
  118. package/dist/standalone/{chunk-OOESPRIZ.js → chunk-WHWI6KXH.js} +1 -1
  119. package/dist/standalone/{chunk-43Y54D7O.js → chunk-WIFKQ25E.js} +1 -1
  120. package/dist/standalone/{chunk-KTTYWH6A.js → chunk-WZYKLEU5.js} +1 -1
  121. package/dist/standalone/chunk-XDT5DXOI.js +11 -0
  122. package/dist/standalone/{chunk-Q5DQABG6.js → chunk-XUKH3NTP.js} +1 -1
  123. package/dist/standalone/{chunk-N6KHKQJH.js → chunk-YKUEP7AA.js} +1 -1
  124. package/dist/standalone/{chunk-QSOJFV42.js → chunk-YRNEKBFM.js} +1 -1
  125. package/dist/standalone/{chunk-YFPU55K4.js → chunk-ZNPR3SGG.js} +1 -1
  126. package/dist/standalone/studio.js +1 -1
  127. package/package.json +6 -6
  128. package/dist/packem_shared/DataBrowser-CDzwqq4b.mjs +0 -4
  129. package/dist/packem_shared/HomePanel-T_fBZTEM.mjs +0 -1
  130. package/dist/packem_shared/home-panel-CSENDmoB.mjs +0 -3
  131. package/dist/packem_shared/use-admin-query-Cbj2GuHu.mjs +0 -1
  132. package/dist/packem_shared/wire-codec-Dl3VeNrd.mjs +0 -1
  133. package/dist/standalone/chunk-ECQTVV2J.js +0 -1
  134. package/dist/standalone/chunk-JBIN7W2B.js +0 -11
  135. package/dist/standalone/chunk-JJA7KHJK.js +0 -1
  136. package/dist/standalone/chunk-LWYAZ2H7.js +0 -7
  137. package/dist/standalone/chunk-WLGZOFKE.js +0 -3
@@ -1,4 +1,4 @@
1
- import{c as U}from"react/compiler-runtime";import{useState as B,useEffect as oe,useRef as me,useMemo as he,useCallback as lt}from"react";import{ShardInput as nt}from"../packem_shared/ShardInput-C6mjgAh4.mjs";import{B as re}from"../packem_shared/button-q0UYSmrn.mjs";import{E as we}from"../packem_shared/empty-state-D7jEML_T.mjs";import{useT as ot}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{S as rt}from"../packem_shared/grid-features-D8w5isjt.mjs";import{C as it,a as at}from"../packem_shared/card--2hKx4L2.mjs";import{C as Ce}from"../packem_shared/checkbox-CnS9cyCz.mjs";import{c as ne,a as ct,b as pe,d as dt,T as ft,e as te}from"../packem_shared/table-D0SBiDu-.mjs";import{l as Ne,f as P,b as ee,d as xe,c as Te,g as ut}from"../packem_shared/internal-CwaF9YNk.mjs";import{ConfirmButton as ht}from"../packem_shared/ConfirmButton-DU4p72Er.mjs";import{B as de}from"../packem_shared/badge-r_5B4LHP.mjs";import{jsx as r,jsxs as R,Fragment as _e}from"react/jsx-runtime";import{I as mt}from"../packem_shared/input-CXhxesPC.mjs";import{d as pt}from"../packem_shared/cf-links-CBJ5SywP.mjs";import{useLunora as gt}from"@lunora/react";import{useAutoRefresh as bt}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-DuULO4XM.mjs";import{ADMIN_FUNCTIONS as Ee}from"../packem_shared/ADMIN_FUNCTIONS-B6z7VLYt.mjs";const $e=(f,e,t)=>{const{onCopy:s,onDelete:o,onDownload:l,onToggleSelect:c}=t,a=()=>{s(f.key)},n=()=>{l(f.key)},d=()=>{o(f.key)},h=()=>{c(f.key)};return{copy:a,download:n,name:f.key.slice(e.length),remove:d,toggle:h}},Fe=f=>{const e=U(31),{busy:t,buttonClassName:s,copied:o,objectKey:l,onCopy:c,onDelete:a,onDownload:n,t:d}=f,h=`storage-copy-${l}`;let u;e[0]!==o||e[1]!==d?(u=d(o?"Copied":"Copy URL"),e[0]=o,e[1]=d,e[2]=u):u=e[2];let m;e[3]!==t||e[4]!==s||e[5]!==c||e[6]!==h||e[7]!==u?(m=r(re,{className:s,"data-testid":h,disabled:t,onClick:c,size:"sm",type:"button",variant:"ghost",children:u}),e[3]=t,e[4]=s,e[5]=c,e[6]=h,e[7]=u,e[8]=m):m=e[8];const k=`storage-download-${l}`;let i;e[9]!==d?(i=d("Download"),e[9]=d,e[10]=i):i=e[10];let v;e[11]!==t||e[12]!==s||e[13]!==n||e[14]!==k||e[15]!==i?(v=r(re,{className:s,"data-testid":k,disabled:t,onClick:n,size:"sm",type:"button",variant:"ghost",children:i}),e[11]=t,e[12]=s,e[13]=n,e[14]=k,e[15]=i,e[16]=v):v=e[16];let w;e[17]!==d?(w=d("Delete object?"),e[17]=d,e[18]=w):w=e[18];const y=`storage-delete-${l}`;let g;e[19]!==d?(g=d("Delete"),e[19]=d,e[20]=g):g=e[20];let x;e[21]!==t||e[22]!==a||e[23]!==w||e[24]!==y||e[25]!==g?(x=r(ht,{confirmLabel:w,disabled:t,onConfirm:a,testId:y,children:g}),e[21]=t,e[22]=a,e[23]=w,e[24]=y,e[25]=g,e[26]=x):x=e[26];let b;return e[27]!==x||e[28]!==m||e[29]!==v?(b=R(_e,{children:[m,v,x]}),e[27]=x,e[28]=m,e[29]=v,e[30]=b):b=e[30],b},Re=f=>{const e=U(14),{objectKey:t,references:s,t:o}=f;if(s===void 0)return null;if(s.length===0){const h=`storage-orphan-${t}`;let u;e[0]!==o?(u=o("Orphan"),e[0]=o,e[1]=u):u=e[1];let m;return e[2]!==h||e[3]!==u?(m=r(de,{"data-testid":h,variant:"warning",children:u}),e[2]=h,e[3]=u,e[4]=m):m=e[4],m}let l;e[5]!==s?(l=s.map(yt).join(`
1
+ import{c as U}from"react/compiler-runtime";import{useState as B,useEffect as oe,useRef as me,useMemo as he,useCallback as lt}from"react";import{ShardInput as nt}from"../packem_shared/ShardInput-C6mjgAh4.mjs";import{B as re}from"../packem_shared/button-q0UYSmrn.mjs";import{E as we}from"../packem_shared/empty-state-D7jEML_T.mjs";import{useT as ot}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{S as rt}from"../packem_shared/grid-features-D8w5isjt.mjs";import{C as it,a as at}from"../packem_shared/card--2hKx4L2.mjs";import{C as Ce}from"../packem_shared/checkbox-CnS9cyCz.mjs";import{c as ne,a as ct,b as pe,d as dt,T as ft,e as te}from"../packem_shared/table-D0SBiDu-.mjs";import{l as Ne,f as P,b as ee,d as xe,c as Te,g as ut}from"../packem_shared/internal-CwaF9YNk.mjs";import{ConfirmButton as ht}from"../packem_shared/ConfirmButton-DU4p72Er.mjs";import{B as de}from"../packem_shared/badge-r_5B4LHP.mjs";import{jsx as r,jsxs as R,Fragment as _e}from"react/jsx-runtime";import{I as mt}from"../packem_shared/input-CXhxesPC.mjs";import{d as pt}from"../packem_shared/cf-links-CBJ5SywP.mjs";import{useLunora as gt}from"@lunora/react";import{useAutoRefresh as bt}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-DuULO4XM.mjs";import{ADMIN_FUNCTIONS as Ee}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";const $e=(f,e,t)=>{const{onCopy:s,onDelete:o,onDownload:l,onToggleSelect:c}=t,a=()=>{s(f.key)},n=()=>{l(f.key)},d=()=>{o(f.key)},h=()=>{c(f.key)};return{copy:a,download:n,name:f.key.slice(e.length),remove:d,toggle:h}},Fe=f=>{const e=U(31),{busy:t,buttonClassName:s,copied:o,objectKey:l,onCopy:c,onDelete:a,onDownload:n,t:d}=f,h=`storage-copy-${l}`;let u;e[0]!==o||e[1]!==d?(u=d(o?"Copied":"Copy URL"),e[0]=o,e[1]=d,e[2]=u):u=e[2];let m;e[3]!==t||e[4]!==s||e[5]!==c||e[6]!==h||e[7]!==u?(m=r(re,{className:s,"data-testid":h,disabled:t,onClick:c,size:"sm",type:"button",variant:"ghost",children:u}),e[3]=t,e[4]=s,e[5]=c,e[6]=h,e[7]=u,e[8]=m):m=e[8];const k=`storage-download-${l}`;let i;e[9]!==d?(i=d("Download"),e[9]=d,e[10]=i):i=e[10];let v;e[11]!==t||e[12]!==s||e[13]!==n||e[14]!==k||e[15]!==i?(v=r(re,{className:s,"data-testid":k,disabled:t,onClick:n,size:"sm",type:"button",variant:"ghost",children:i}),e[11]=t,e[12]=s,e[13]=n,e[14]=k,e[15]=i,e[16]=v):v=e[16];let w;e[17]!==d?(w=d("Delete object?"),e[17]=d,e[18]=w):w=e[18];const y=`storage-delete-${l}`;let g;e[19]!==d?(g=d("Delete"),e[19]=d,e[20]=g):g=e[20];let x;e[21]!==t||e[22]!==a||e[23]!==w||e[24]!==y||e[25]!==g?(x=r(ht,{confirmLabel:w,disabled:t,onConfirm:a,testId:y,children:g}),e[21]=t,e[22]=a,e[23]=w,e[24]=y,e[25]=g,e[26]=x):x=e[26];let b;return e[27]!==x||e[28]!==m||e[29]!==v?(b=R(_e,{children:[m,v,x]}),e[27]=x,e[28]=m,e[29]=v,e[30]=b):b=e[30],b},Re=f=>{const e=U(14),{objectKey:t,references:s,t:o}=f;if(s===void 0)return null;if(s.length===0){const h=`storage-orphan-${t}`;let u;e[0]!==o?(u=o("Orphan"),e[0]=o,e[1]=u):u=e[1];let m;return e[2]!==h||e[3]!==u?(m=r(de,{"data-testid":h,variant:"warning",children:u}),e[2]=h,e[3]=u,e[4]=m):m=e[4],m}let l;e[5]!==s?(l=s.map(yt).join(`
2
2
  `),e[5]=s,e[6]=l):l=e[6];const c=l,a=`storage-refs-${t}`;let n;e[7]!==s.length||e[8]!==o?(n=s.length===1?o("1 record"):o("{count} records",{count:s.length}),e[7]=s.length,e[8]=o,e[9]=n):n=e[9];let d;return e[10]!==c||e[11]!==a||e[12]!==n?(d=r(de,{"data-testid":a,title:c,variant:"secondary",children:n}),e[10]=c,e[11]=a,e[12]=n,e[13]=d):d=e[13],d},ze=f=>{const e=U(7),{objectKey:t,onToggle:s,selected:o,t:l}=f;let c;e[0]!==l?(c=l("Select row"),e[0]=l,e[1]=c):c=e[1];const a=`storage-select-${t}`;let n;return e[2]!==s||e[3]!==o||e[4]!==c||e[5]!==a?(n=r(Ce,{"aria-label":c,checked:o,"data-testid":a,onCheckedChange:s}),e[2]=s,e[3]=o,e[4]=c,e[5]=a,e[6]=n):n=e[6],n};function yt(f){return`${f.table}·${f.id}`}const xt=f=>{const e=U(10),{colSpan:t,name:s,onEnter:o}=f;let l;e[0]!==s||e[1]!==o?(l=()=>{o(s)},e[0]=s,e[1]=o,e[2]=l):l=e[2];const c=l;let a;e[3]===Symbol.for("react.memo_cache_sentinel")?(a=r("svg",{"aria-hidden":"true",className:"size-4 text-muted-foreground",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:r("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Z"})}),e[3]=a):a=e[3];let n;e[4]!==c||e[5]!==s?(n=R("button",{className:"inline-flex items-center gap-2 font-mono text-xs outline-none hover:text-foreground focus-visible:text-foreground","data-testid":"fb-folder",onClick:c,type:"button",children:[a,s]}),e[4]=c,e[5]=s,e[6]=n):n=e[6];let d;return e[7]!==t||e[8]!==n?(d=r(pe,{children:r(te,{colSpan:t,children:n})}),e[7]=t,e[8]=n,e[9]=d):d=e[9],d},vt=f=>{const e=U(37),{busy:t,copiedKey:s,handlers:o,object:l,prefix:c,references:a,selected:n,showReferences:d,t:h}=f;let u;e[0]!==o||e[1]!==l||e[2]!==c?(u=$e(l,c,o),e[0]=o,e[1]=l,e[2]=c,e[3]=u):u=e[3];const{copy:m,download:k,name:i,remove:v,toggle:w}=u;let y;e[4]!==l.key||e[5]!==n||e[6]!==h||e[7]!==w?(y=r(te,{className:"w-8",children:r(ze,{objectKey:l.key,onToggle:w,selected:n,t:h})}),e[4]=l.key,e[5]=n,e[6]=h,e[7]=w,e[8]=y):y=e[8];let g;e[9]!==i?(g=r(te,{className:"font-mono text-xs",children:i}),e[9]=i,e[10]=g):g=e[10];let x;e[11]!==l.size?(x=Ne(l.size),e[11]=l.size,e[12]=x):x=e[12];let b;e[13]!==x?(b=r(te,{className:"tabular-nums text-muted-foreground",children:x}),e[13]=x,e[14]=b):b=e[14];const N=l.httpMetadata?.contentType??"";let S;e[15]!==N?(S=r(te,{children:N}),e[15]=N,e[16]=S):S=e[16];let C;e[17]!==l.key||e[18]!==a||e[19]!==d||e[20]!==h?(C=d&&r(te,{children:r(Re,{objectKey:l.key,references:a,t:h})}),e[17]=l.key,e[18]=a,e[19]=d,e[20]=h,e[21]=C):C=e[21];const E=s===l.key;let T;e[22]!==t||e[23]!==m||e[24]!==k||e[25]!==l.key||e[26]!==v||e[27]!==h||e[28]!==E?(T=r(te,{className:"text-right",children:r("span",{className:"inline-flex items-center gap-1",children:r(Fe,{busy:t,copied:E,objectKey:l.key,onCopy:m,onDelete:v,onDownload:k,t:h})})}),e[22]=t,e[23]=m,e[24]=k,e[25]=l.key,e[26]=v,e[27]=h,e[28]=E,e[29]=T):T=e[29];let F;return e[30]!==T||e[31]!==y||e[32]!==g||e[33]!==b||e[34]!==S||e[35]!==C?(F=R(pe,{"data-testid":"fb-row",children:[y,g,b,S,C,T]}),e[30]=T,e[31]=y,e[32]=g,e[33]=b,e[34]=S,e[35]=C,e[36]=F):F=e[36],F},kt=f=>{const e=U(65),{allSelected:t,busy:s,copiedKey:o,files:l,folders:c,handlers:a,onEnterFolder:n,prefix:d,references:h,selected:u,showReferences:m,someSelected:k,t:i,toggleSelectAll:v}=f;let w;e[0]!==i?(w=i("Select all rows"),e[0]=i,e[1]=w):w=e[1];let y;e[2]!==t||e[3]!==k||e[4]!==w||e[5]!==v?(y=r(ne,{className:"w-8",children:r(Ce,{"aria-label":w,checked:t,"data-testid":"storage-select-all",indeterminate:k,onCheckedChange:v})}),e[2]=t,e[3]=k,e[4]=w,e[5]=v,e[6]=y):y=e[6];let g;e[7]!==i?(g=i("key"),e[7]=i,e[8]=g):g=e[8];let x;e[9]!==g?(x=r(ne,{children:g}),e[9]=g,e[10]=x):x=e[10];let b;e[11]!==i?(b=i("size"),e[11]=i,e[12]=b):b=e[12];let N;e[13]!==b?(N=r(ne,{children:b}),e[13]=b,e[14]=N):N=e[14];let S;e[15]!==i?(S=i("content-type"),e[15]=i,e[16]=S):S=e[16];let C;e[17]!==S?(C=r(ne,{children:S}),e[17]=S,e[18]=C):C=e[18];let E;e[19]!==m||e[20]!==i?(E=m&&r(ne,{children:i("used by")}),e[19]=m,e[20]=i,e[21]=E):E=e[21];let T;e[22]!==i?(T=i("Actions"),e[22]=i,e[23]=T):T=e[23];let F;e[24]!==T?(F=r(ne,{"aria-label":T}),e[24]=T,e[25]=F):F=e[25];let $;e[26]!==F||e[27]!==y||e[28]!==x||e[29]!==N||e[30]!==C||e[31]!==E?($=r(ct,{children:R(pe,{children:[y,x,N,C,E,F]})}),e[26]=F,e[27]=y,e[28]=x,e[29]=N,e[30]=C,e[31]=E,e[32]=$):$=e[32];let z;if(e[33]!==c||e[34]!==n||e[35]!==m){let D;e[37]!==n||e[38]!==m?(D=K=>r(xt,{colSpan:m?6:5,name:K,onEnter:n},K),e[37]=n,e[38]=m,e[39]=D):D=e[39],z=c.map(D),e[33]=c,e[34]=n,e[35]=m,e[36]=z}else z=e[36];let L;if(e[40]!==s||e[41]!==o||e[42]!==l||e[43]!==a||e[44]!==d||e[45]!==h||e[46]!==u||e[47]!==m||e[48]!==i){let D;e[50]!==s||e[51]!==o||e[52]!==a||e[53]!==d||e[54]!==h||e[55]!==u||e[56]!==m||e[57]!==i?(D=K=>r(vt,{busy:s,copiedKey:o,handlers:a,object:K,prefix:d,references:h[K.key],selected:u.has(K.key),showReferences:m,t:i},K.key),e[50]=s,e[51]=o,e[52]=a,e[53]=d,e[54]=h,e[55]=u,e[56]=m,e[57]=i,e[58]=D):D=e[58],L=l.map(D),e[40]=s,e[41]=o,e[42]=l,e[43]=a,e[44]=d,e[45]=h,e[46]=u,e[47]=m,e[48]=i,e[49]=L}else L=e[49];let j;e[59]!==z||e[60]!==L?(j=R(dt,{children:[z,L]}),e[59]=z,e[60]=L,e[61]=j):j=e[61];let O;return e[62]!==$||e[63]!==j?(O=r(it,{className:"overflow-hidden py-0",children:r(at,{className:"px-0",children:R(ft,{"data-testid":"fb-table",children:[$,j]})})}),e[62]=$,e[63]=j,e[64]=O):O=e[64],O},St=[{label:"15m",seconds:900},{label:"1h",seconds:3600},{label:"24h",seconds:86400},{label:"7d",seconds:604800}],wt=3600,ve=(f,e)=>{if(e==="size")return f.size;if(e==="type")return f.httpMetadata?.contentType??"";if(e==="date"){if(f.uploaded===void 0)return 0;const t=new Date(f.uploaded).getTime();return Number.isNaN(t)?0:t}return e.startsWith("tag:")?f.customMetadata?.[e.slice(4)]??"":f.key},Ct=(f,e,t)=>{const s=t==="desc"?-1:1;return f.toSorted((o,l)=>{const c=ve(o,e),a=ve(l,e);return(typeof c=="number"&&typeof a=="number"?c-a:String(c).localeCompare(String(a)))*s})},Nt=(f,e)=>{const t=new Set,s=[];for(const o of f){const l=o.key.slice(e.length),c=l.indexOf("/");c===-1?s.push(o):t.add(l.slice(0,c+1))}return{files:s,folders:[...t].toSorted((o,l)=>o.localeCompare(l))}},Tt=f=>{const e=U(59),{bucket:t,buckets:s,busy:o,draftPrefix:l,expiry:c,fileInputRef:a,onBucketChange:n,onExpiryChange:d,onFileChange:h,onList:u,onPrefixChange:m,onUploadClick:k,t:i}=f;let v;e[0]!==m?(v=G=>{m(G.target.value)},e[0]=m,e[1]=v):v=e[1];const w=v;let y;e[2]!==n?(y=G=>{n(G.target.value)},e[2]=n,e[3]=y):y=e[3];const g=y;let x;e[4]!==d?(x=G=>{d(Number.parseInt(G.target.value,10))},e[4]=d,e[5]=x):x=e[5];const b=x;let N;e[6]!==t||e[7]!==s||e[8]!==g||e[9]!==i?(N=s.length>0&&r("select",{"aria-label":i("Bucket"),className:"h-8 rounded-md border border-border bg-background px-1 outline-none focus-visible:border-ring","data-testid":"fb-bucket",onChange:g,value:t,children:s.map(Et)}),e[6]=t,e[7]=s,e[8]=g,e[9]=i,e[10]=N):N=e[10];let S;e[11]!==i?(S=i("Key prefix"),e[11]=i,e[12]=S):S=e[12];let C;e[13]!==i?(C=i("key prefix (optional)"),e[13]=i,e[14]=C):C=e[14];let E;e[15]!==l||e[16]!==w||e[17]!==S||e[18]!==C?(E=r(mt,{"aria-label":S,className:"h-8 w-64 max-w-full","data-testid":"fb-prefix-input",onChange:w,placeholder:C,value:l}),e[15]=l,e[16]=w,e[17]=S,e[18]=C,e[19]=E):E=e[19];let T;e[20]!==i?(T=i("List"),e[20]=i,e[21]=T):T=e[21];let F;e[22]!==o||e[23]!==u||e[24]!==T?(F=r(re,{"data-testid":"fb-list",disabled:o,onClick:u,size:"sm",type:"button",children:T}),e[22]=o,e[23]=u,e[24]=T,e[25]=F):F=e[25];let $;e[26]!==o||e[27]!==i?($=i(o?"Uploading…":"Upload"),e[26]=o,e[27]=i,e[28]=$):$=e[28];let z;e[29]!==o||e[30]!==k||e[31]!==$?(z=r(re,{"data-testid":"storage-upload",disabled:o,onClick:k,size:"sm",type:"button",variant:"outline",children:$}),e[29]=o,e[30]=k,e[31]=$,e[32]=z):z=e[32];let L;e[33]!==a||e[34]!==h?(L=r("input",{className:"hidden","data-testid":"storage-file-input",onChange:h,ref:a,type:"file"}),e[33]=a,e[34]=h,e[35]=L):L=e[35];let j;e[36]!==i?(j=i("Link expiry"),e[36]=i,e[37]=j):j=e[37];let O;e[38]!==i?(O=St.map(G=>r("option",{value:G.seconds,children:i(G.label)},G.seconds)),e[38]=i,e[39]=O):O=e[39];let D;e[40]!==c||e[41]!==b||e[42]!==O?(D=r("select",{className:"h-8 rounded-md border border-border bg-background px-1 tabular-nums outline-none focus-visible:border-ring","data-testid":"storage-expiry",id:"storage-expiry",onChange:b,value:c,children:O}),e[40]=c,e[41]=b,e[42]=O,e[43]=D):D=e[43];let K;e[44]!==j||e[45]!==D?(K=R("label",{className:"ml-auto flex items-center gap-1.5 text-xs text-muted-foreground",htmlFor:"storage-expiry",children:[j,D]}),e[44]=j,e[45]=D,e[46]=K):K=e[46];let A;e[47]!==i?(A=i("Open in Cloudflare"),e[47]=i,e[48]=A):A=e[48];let M;e[49]!==A?(M=r("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"fb-cf-link",href:pt,rel:"noreferrer",target:"_blank",children:A}),e[49]=A,e[50]=M):M=e[50];let H;return e[51]!==z||e[52]!==L||e[53]!==K||e[54]!==M||e[55]!==N||e[56]!==E||e[57]!==F?(H=R("div",{className:"flex flex-wrap items-center gap-2",children:[N,E,F,z,L,K,M]}),e[51]=z,e[52]=L,e[53]=K,e[54]=M,e[55]=N,e[56]=E,e[57]=F,e[58]=H):H=e[58],H},_t=f=>{const e=U(66),{onSortKeyChange:t,onThumbSizeChange:s,showGrid:o,showList:l,sortDirection:c,sortKey:a,t:n,tagKeys:d,thumbSize:h,toggleSortDirection:u,view:m}=f;let k;e[0]!==t?(k=W=>{t(W.target.value)},e[0]=t,e[1]=k):k=e[1];const i=k;let v;e[2]!==s?(v=W=>{s(Number.parseInt(W.target.value,10))},e[2]=s,e[3]=v):v=e[3];const w=v,y=m==="list";let g;e[4]!==n?(g=n("List"),e[4]=n,e[5]=g):g=e[5];let x;e[6]!==l||e[7]!==y||e[8]!==g?(x=r("button",{"aria-pressed":y,className:"px-2 py-1 outline-none transition-colors hover:bg-accent aria-pressed:bg-accent aria-pressed:text-accent-foreground","data-testid":"fb-view-list",onClick:l,type:"button",children:g}),e[6]=l,e[7]=y,e[8]=g,e[9]=x):x=e[9];const b=m==="grid";let N;e[10]!==n?(N=n("Grid"),e[10]=n,e[11]=N):N=e[11];let S;e[12]!==o||e[13]!==b||e[14]!==N?(S=r("button",{"aria-pressed":b,className:"border-s border-border px-2 py-1 outline-none transition-colors hover:bg-accent aria-pressed:bg-accent aria-pressed:text-accent-foreground","data-testid":"fb-view-grid",onClick:o,type:"button",children:N}),e[12]=o,e[13]=b,e[14]=N,e[15]=S):S=e[15];let C;e[16]!==x||e[17]!==S?(C=R("div",{className:"inline-flex overflow-hidden rounded-md border border-border",children:[x,S]}),e[16]=x,e[17]=S,e[18]=C):C=e[18];let E;e[19]!==n?(E=n("Sort"),e[19]=n,e[20]=E):E=e[20];let T;e[21]!==n?(T=n("Name"),e[21]=n,e[22]=T):T=e[22];let F;e[23]!==T?(F=r("option",{value:"name",children:T}),e[23]=T,e[24]=F):F=e[24];let $;e[25]!==n?($=n("size"),e[25]=n,e[26]=$):$=e[26];let z;e[27]!==$?(z=r("option",{value:"size",children:$}),e[27]=$,e[28]=z):z=e[28];let L;e[29]!==n?(L=n("Type"),e[29]=n,e[30]=L):L=e[30];let j;e[31]!==L?(j=r("option",{value:"type",children:L}),e[31]=L,e[32]=j):j=e[32];let O;e[33]!==n?(O=n("Modified"),e[33]=n,e[34]=O):O=e[34];let D;e[35]!==O?(D=r("option",{value:"date",children:O}),e[35]=O,e[36]=D):D=e[36];let K;e[37]!==d?(K=d.map($t),e[37]=d,e[38]=K):K=e[38];let A;e[39]!==i||e[40]!==a||e[41]!==F||e[42]!==z||e[43]!==j||e[44]!==D||e[45]!==K?(A=R("select",{className:"h-8 rounded-md border border-border bg-background px-1 outline-none focus-visible:border-ring","data-testid":"fb-sort",id:"fb-sort",onChange:i,value:a,children:[F,z,j,D,K]}),e[39]=i,e[40]=a,e[41]=F,e[42]=z,e[43]=j,e[44]=D,e[45]=K,e[46]=A):A=e[46];let M;e[47]!==E||e[48]!==A?(M=R("label",{className:"flex items-center gap-1.5 text-muted-foreground",htmlFor:"fb-sort",children:[E,A]}),e[47]=E,e[48]=A,e[49]=M):M=e[49];let H;e[50]!==n?(H=n("Toggle sort direction"),e[50]=n,e[51]=H):H=e[51];const G=c==="asc"?"↑":"↓";let q;e[52]!==H||e[53]!==G||e[54]!==u?(q=r("button",{"aria-label":H,className:"flex size-8 items-center justify-center rounded-md border border-border tabular-nums outline-none transition-colors hover:bg-accent focus-visible:bg-accent","data-testid":"fb-sort-dir",onClick:u,type:"button",children:G}),e[52]=H,e[53]=G,e[54]=u,e[55]=q):q=e[55];let Y;e[56]!==w||e[57]!==n||e[58]!==h||e[59]!==m?(Y=m==="grid"&&R("label",{className:"ml-auto flex items-center gap-1.5 text-muted-foreground",htmlFor:"fb-thumb-size",children:[n("Thumbnail size"),r("input",{className:"accent-primary","data-testid":"fb-thumb-size",id:"fb-thumb-size",max:240,min:80,onChange:w,step:8,type:"range",value:h})]}),e[56]=w,e[57]=n,e[58]=h,e[59]=m,e[60]=Y):Y=e[60];let se;return e[61]!==M||e[62]!==q||e[63]!==Y||e[64]!==C?(se=R("div",{className:"flex flex-wrap items-center gap-2 text-xs","data-testid":"fb-controls",children:[C,M,q,Y]}),e[61]=M,e[62]=q,e[63]=Y,e[64]=C,e[65]=se):se=e[65],se};function Et(f){return r("option",{value:f,children:f},f)}function $t(f){return r("option",{value:`tag:${f}`,children:f},f)}const Ft=/\.(?:avif|bmp|gif|ico|jpe?g|png|svg|webp)$/iu,Rt=f=>(f.httpMetadata?.contentType??"").startsWith("image/")||Ft.test(f.key),zt=()=>{const f=U(1);let e;return f[0]===Symbol.for("react.memo_cache_sentinel")?(e=r("svg",{"aria-hidden":"true",className:"size-8 text-muted-foreground/60",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.4,viewBox:"0 0 24 24",children:r("path",{d:"M7 3h7l5 5v13a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1Zm7 0v5h5"})}),f[0]=e):e=f[0],e},Dt=f=>{const e=U(13),{object:t,resolveUrl:s}=f,[o,l]=B(null),[c,a]=B(!1);let n;e[0]!==t?(n=Rt(t),e[0]=t,e[1]=n):n=e[1];const d=n;let h,u;e[2]!==d||e[3]!==t.key||e[4]!==s?(h=()=>{if(!d)return;const v={cancelled:!1};return P((async()=>{try{const w=await s(t.key);v.cancelled||l(w)}catch{v.cancelled||a(!0)}})()),()=>{v.cancelled=!0}},u=[d,t.key,s],e[2]=d,e[3]=t.key,e[4]=s,e[5]=h,e[6]=u):(h=e[5],u=e[6]),oe(h,u);let m;e[7]===Symbol.for("react.memo_cache_sentinel")?(m=()=>{a(!0)},e[7]=m):m=e[7];const k=m;let i;return e[8]!==c||e[9]!==d||e[10]!==t.key||e[11]!==o?(i=r("div",{className:"flex aspect-square w-full items-center justify-center overflow-hidden rounded-md border border-border bg-muted/30",children:d&&o!==null&&!c?r("img",{alt:t.key,className:"size-full object-cover",loading:"lazy",onError:k,src:o}):r(zt,{})}),e[8]=c,e[9]=d,e[10]=t.key,e[11]=o,e[12]=i):i=e[12],i},jt=f=>{const e=U(42),{busy:t,copiedKey:s,handlers:o,object:l,prefix:c,references:a,resolveUrl:n,selected:d,showReferences:h,t:u}=f;let m;e[0]!==o||e[1]!==l||e[2]!==c?(m=$e(l,c,o),e[0]=o,e[1]=l,e[2]=c,e[3]=m):m=e[3];const{copy:k,download:i,name:v,remove:w,toggle:y}=m;let g;e[4]!==l||e[5]!==n?(g=r(Dt,{object:l,resolveUrl:n}),e[4]=l,e[5]=n,e[6]=g):g=e[6];let x;e[7]!==l.key||e[8]!==d||e[9]!==u||e[10]!==y?(x=r("span",{className:"absolute left-1.5 top-1.5 rounded bg-background/80 p-0.5",children:r(ze,{objectKey:l.key,onToggle:y,selected:d,t:u})}),e[7]=l.key,e[8]=d,e[9]=u,e[10]=y,e[11]=x):x=e[11];let b;e[12]!==g||e[13]!==x?(b=R("div",{className:"relative",children:[g,x]}),e[12]=g,e[13]=x,e[14]=b):b=e[14];let N;e[15]!==v?(N=r("p",{className:"truncate font-mono text-xs",title:v,children:v}),e[15]=v,e[16]=N):N=e[16];let S;e[17]!==l.size?(S=Ne(l.size),e[17]=l.size,e[18]=S):S=e[18];let C;e[19]!==S?(C=r("p",{className:"text-[11px] tabular-nums text-muted-foreground",children:S}),e[19]=S,e[20]=C):C=e[20];let E;e[21]!==l.key||e[22]!==a||e[23]!==h||e[24]!==u?(E=h&&r("div",{className:"mt-1",children:r(Re,{objectKey:l.key,references:a,t:u})}),e[21]=l.key,e[22]=a,e[23]=h,e[24]=u,e[25]=E):E=e[25];let T;e[26]!==N||e[27]!==C||e[28]!==E?(T=R("div",{className:"min-w-0",children:[N,C,E]}),e[26]=N,e[27]=C,e[28]=E,e[29]=T):T=e[29];const F=s===l.key;let $;e[30]!==t||e[31]!==k||e[32]!==i||e[33]!==l.key||e[34]!==w||e[35]!==u||e[36]!==F?($=r("div",{className:"flex items-center gap-1",children:r(Fe,{busy:t,buttonClassName:"h-7 px-2 text-xs",copied:F,objectKey:l.key,onCopy:k,onDelete:w,onDownload:i,t:u})}),e[30]=t,e[31]=k,e[32]=i,e[33]=l.key,e[34]=w,e[35]=u,e[36]=F,e[37]=$):$=e[37];let z;return e[38]!==$||e[39]!==b||e[40]!==T?(z=R("div",{className:"flex flex-col gap-1.5","data-testid":"fb-tile",children:[b,T,$]}),e[38]=$,e[39]=b,e[40]=T,e[41]=z):z=e[41],z},Kt=f=>{const e=U(9),{name:t,onEnter:s}=f;let o;e[0]!==t||e[1]!==s?(o=()=>{s(t)},e[0]=t,e[1]=s,e[2]=o):o=e[2];const l=o;let c;e[3]===Symbol.for("react.memo_cache_sentinel")?(c=r("span",{className:"flex aspect-square w-full items-center justify-center rounded-md border border-border bg-muted/30 transition-colors hover:bg-accent",children:r("svg",{"aria-hidden":"true",className:"size-10 text-muted-foreground",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.4,viewBox:"0 0 24 24",children:r("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Z"})})}),e[3]=c):c=e[3];let a;e[4]!==t?(a=r("span",{className:"truncate font-mono text-xs",title:t,children:t}),e[4]=t,e[5]=a):a=e[5];let n;return e[6]!==l||e[7]!==a?(n=R("button",{className:"flex flex-col gap-1.5 text-left outline-none","data-testid":"fb-folder",onClick:l,type:"button",children:[c,a]}),e[6]=l,e[7]=a,e[8]=n):n=e[8],n},Bt=f=>{const e=U(34),{busy:t,copiedKey:s,files:o,folders:l,handlers:c,onEnterFolder:a,prefix:n,references:d,resolveUrl:h,selected:u,showReferences:m,size:k,t:i}=f;let v;e[0]!==k?(v=k.toString(),e[0]=k,e[1]=v):v=e[1];const w=`repeat(auto-fill, minmax(${v}px, 1fr))`;let y;e[2]!==w?(y={gridTemplateColumns:w},e[2]=w,e[3]=y):y=e[3];const g=y;let x;if(e[4]!==l||e[5]!==a){let S;e[7]!==a?(S=C=>r(Kt,{name:C,onEnter:a},C),e[7]=a,e[8]=S):S=e[8],x=l.map(S),e[4]=l,e[5]=a,e[6]=x}else x=e[6];let b;if(e[9]!==t||e[10]!==s||e[11]!==o||e[12]!==c||e[13]!==n||e[14]!==d||e[15]!==h||e[16]!==u||e[17]!==m||e[18]!==i){let S;e[20]!==t||e[21]!==s||e[22]!==c||e[23]!==n||e[24]!==d||e[25]!==h||e[26]!==u||e[27]!==m||e[28]!==i?(S=C=>r(jt,{busy:t,copiedKey:s,handlers:c,object:C,prefix:n,references:d[C.key],resolveUrl:h,selected:u.has(C.key),showReferences:m,t:i},C.key),e[20]=t,e[21]=s,e[22]=c,e[23]=n,e[24]=d,e[25]=h,e[26]=u,e[27]=m,e[28]=i,e[29]=S):S=e[29],b=o.map(S),e[9]=t,e[10]=s,e[11]=o,e[12]=c,e[13]=n,e[14]=d,e[15]=h,e[16]=u,e[17]=m,e[18]=i,e[19]=b}else b=e[19];let N;return e[30]!==g||e[31]!==x||e[32]!==b?(N=R("div",{className:"grid gap-4","data-testid":"fb-gallery",style:g,children:[x,b]}),e[30]=g,e[31]=x,e[32]=b,e[33]=N):N=e[33],N},Lt=f=>{const e=U(23),{reference:t,t:s}=f,o=`fb-dangling-${t.table}-${t.id}-${t.column}`,l=`${t.table}·${t.id}`;let c;e[0]!==l?(c=r(de,{variant:"secondary",children:l}),e[0]=l,e[1]=c):c=e[1];let a;e[2]!==t.column?(a=r("span",{className:"text-muted-foreground",children:t.column}),e[2]=t.column,e[3]=a):a=e[3];let n;e[4]!==s?(n=s("→"),e[4]=s,e[5]=n):n=e[5];let d;e[6]!==n?(d=r("span",{className:"text-muted-foreground/60",children:n}),e[6]=n,e[7]=d):d=e[7];let h;e[8]!==t.key?(h=r("code",{className:"rounded bg-muted px-1 py-0.5 font-mono text-foreground",children:t.key}),e[8]=t.key,e[9]=h):h=e[9];let u;e[10]!==c||e[11]!==a||e[12]!==d||e[13]!==h?(u=R("span",{className:"flex flex-wrap items-center gap-1.5",children:[c,a,d,h]}),e[10]=c,e[11]=a,e[12]=d,e[13]=h,e[14]=u):u=e[14];let m;e[15]!==s?(m=s("Missing object"),e[15]=s,e[16]=m):m=e[16];let k;e[17]!==m?(k=r(de,{className:"border-destructive/40 text-destructive",variant:"outline",children:m}),e[17]=m,e[18]=k):k=e[18];let i;return e[19]!==o||e[20]!==k||e[21]!==u?(i=R("li",{className:"flex flex-wrap items-center justify-between gap-2 rounded-md border border-border/60 px-3 py-2 text-xs","data-testid":o,children:[u,k]}),e[19]=o,e[20]=k,e[21]=u,e[22]=i):i=e[22],i},It=f=>{const e=U(37),{busy:t,onCheck:s,references:o,t:l,truncated:c}=f;let a;e[0]!==l?(a=l("Integrity"),e[0]=l,e[1]=a):a=e[1];let n;e[2]!==a?(n=r("span",{className:"font-mono text-[11px] uppercase tracking-wide text-muted-foreground",children:a}),e[2]=a,e[3]=n):n=e[3];let d;e[4]!==l?(d=l("Orphaned objects"),e[4]=l,e[5]=d):d=e[5];let h;e[6]!==d?(h=r("span",{className:"text-sm font-medium text-foreground",children:d}),e[6]=d,e[7]=h):h=e[7];let u;e[8]!==l?(u=l("Find records whose file reference points at an object the bucket no longer has."),e[8]=l,e[9]=u):u=e[9];let m;e[10]!==u?(m=r("span",{className:"text-xs text-muted-foreground",children:u}),e[10]=u,e[11]=m):m=e[11];let k;e[12]!==n||e[13]!==h||e[14]!==m?(k=R("div",{className:"flex flex-col gap-1",children:[n,h,m]}),e[12]=n,e[13]=h,e[14]=m,e[15]=k):k=e[15];let i;e[16]!==t||e[17]!==l?(i=l(t?"Checking…":"Check for orphans"),e[16]=t,e[17]=l,e[18]=i):i=e[18];let v;e[19]!==t||e[20]!==s||e[21]!==i?(v=r(re,{"data-testid":"fb-orphans-check",disabled:t,onClick:s,size:"sm",type:"button",variant:"outline",children:i}),e[19]=t,e[20]=s,e[21]=i,e[22]=v):v=e[22];let w;e[23]!==k||e[24]!==v?(w=R("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[k,v]}),e[23]=k,e[24]=v,e[25]=w):w=e[25];let y;e[26]!==o?.length||e[27]!==l?(y=o?.length===0&&r(we,{description:l("Every record's file reference points at an object that exists in the bucket."),testId:"fb-orphans-empty",title:l("No dangling references.")}),e[26]=o?.length,e[27]=l,e[28]=y):y=e[28];let g;e[29]!==o||e[30]!==l||e[31]!==c?(g=o!==void 0&&o.length>0&&R(_e,{children:[c&&r("p",{className:"text-xs text-warning","data-testid":"fb-orphans-truncated",children:l("Showing the first {count} dangling references — the scan was truncated.",{count:o.length})}),r("ul",{className:"flex flex-col gap-1.5","data-testid":"fb-orphans-list",children:o.map(b=>r(Lt,{reference:b,t:l},`${b.table}·${b.id}·${b.column}`))})]}),e[29]=o,e[30]=l,e[31]=c,e[32]=g):g=e[32];let x;return e[33]!==w||e[34]!==y||e[35]!==g?(x=R("section",{className:"flex flex-col gap-2 rounded-lg border border-border/60 p-3","data-testid":"fb-orphans",children:[w,y,g]}),e[33]=w,e[34]=y,e[35]=g,e[36]=x):x=e[36],x},Ot=function(f,e){const t=U(18);let s;t[0]===Symbol.for("react.memo_cache_sentinel")?(s=new Set,t[0]=s):s=t[0];const[o,l]=B(s);let c;t[1]===Symbol.for("react.memo_cache_sentinel")?(c=y=>{l(g=>{const x=new Set(g);return x.has(y)?x.delete(y):x.add(y),x})},t[1]=c):c=t[1];const a=c;let n;t[2]===Symbol.for("react.memo_cache_sentinel")?(n=()=>{l(new Set)},t[2]=n):n=t[2];const d=n;let h,u,m;if(t[3]!==f||t[4]!==e||t[5]!==o){let y;t[9]!==e?(y=g=>e(g),t[9]=e,t[10]=y):y=t[10],u=f.map(y),h=u.length>0&&u.every(g=>o.has(g)),m=!h&&u.some(g=>o.has(g)),t[3]=f,t[4]=e,t[5]=o,t[6]=h,t[7]=u,t[8]=m}else h=t[6],u=t[7],m=t[8];const k=m;let i;t[11]!==u?(i=()=>{l(y=>u.every(g=>y.has(g))?new Set:new Set(u))},t[11]=u,t[12]=i):i=t[12];const v=i;let w;return t[13]!==h||t[14]!==o||t[15]!==k||t[16]!==v?(w={allSelected:h,clear:d,selected:o,someSelected:k,toggle:a,toggleAll:v},t[13]=h,t[14]=o,t[15]=k,t[16]=v,t[17]=w):w=t[17],w},At=Te(Ee.storageReferences),Ut=Te(Ee.storageOrphans),ke=1e4,Mt=1e3,Gt=3600,Ht=(f,e)=>{if(!("document"in globalThis))return;const t=globalThis.document.createElement("a");t.href=f,t.download=e,t.rel="noopener",globalThis.document.body.append(t),t.click(),t.remove()},Pt=f=>f.key,qt=({initialPrefix:f,pageSize:e})=>{const t=gt(),[s,o]=B(f??""),[l,c]=B(f??""),[a,n]=B(wt),[d,h]=B("list"),[u,m]=B(128),[k,i]=B("name"),[v,w]=B("asc"),[y,g]=B(void 0),[x,b]=B(void 0),[N,S]=B(!1),[C,E]=B(void 0),[T,F]=B(void 0),[$,z]=B(""),[L,j]=B({}),[O,D]=B(!1),[K,A]=B(void 0),[M,H]=B(!1),[G,q]=B(!1),[Y,se]=B([]),[W,ge]=B(""),le=me(0),J=me(0);oe(()=>{const p={cancelled:!1};return P((async()=>{try{const _=await t.listStorageBuckets();if(!p.cancelled){se(_);const[I]=_;I!==void 0&&ge(Q=>Q===""?I:Q)}}catch{}})()),()=>{p.cancelled=!0}},[t]);const Z=he(()=>({list:p=>t.listStorageObjects({...p,bucket:W}),remove:p=>t.deleteStorageObject(p,{bucket:W}),signedUrl:(p,_)=>t.signedStorageUrl(p,{..._,bucket:W}),upload:p=>t.uploadStorageObject({...p,bucket:W})}),[W,t]),X=lt(async(p,_,I)=>{le.current+=1;const Q=le.current;b(void 0),S(!0);try{const V=await Z.list({cursor:_,limit:e,prefix:p});if(Q!==le.current)return;g(ce=>I&&ce!==void 0?[...ce,...V.objects]:V.objects),F(V.cursor)}catch(V){if(Q!==le.current)return;I||g(void 0),b(ee(V))}finally{Q===le.current&&S(!1)}},[e,Z]);oe(()=>{P(X(f??"",void 0,!1))},[X,f]);const De=(y?.length??0)<=e;bt(()=>{P(X(s,void 0,!1))},De);const{files:fe,folders:je}=Nt(y??[],s),Ke=he(()=>{const p=new Set;for(const _ of fe)for(const I of Object.keys(_.customMetadata??{}))p.add(I);return[...p].toSorted((_,I)=>_.localeCompare(I))},[fe]),ae=Ct(fe,k,v),ue=he(()=>[...new Set(ae.map(p=>p.key))].toSorted((p,_)=>p.localeCompare(_)).join(`
3
3
  `),[ae]);oe(()=>{const p=ue===""?[]:ue.split(`
4
4
  `);if(p.length===0){j({});return}const _={current:!0};return P((async()=>{try{const I=await t.query(At,{keys:p},xe($));_.current&&(j(I.references??{}),D(Object.keys(I.storageColumns??{}).length>0))}catch{_.current&&(j({}),D(!1))}})()),()=>{_.current=!1}},[t,ue,$]);const{allSelected:Be,clear:ie,selected:be,someSelected:Le,toggle:Ie,toggleAll:Oe}=Ot(ae,Pt),Ae=()=>{o(l),ie(),P(X(l,void 0,!1))},Ue=()=>{P(X(s,T,!0))},ye=p=>{o(p),c(p),ie(),P(X(p,void 0,!1))},Me=p=>{ye(`${s}${p}`)},Ge=p=>Z.signedUrl(p,{expiresInSeconds:Gt}),He=()=>{h("list")},Pe=()=>{h("grid")},qe=p=>{i(p)},Ve=()=>{w(p=>p==="asc"?"desc":"asc")},We=p=>{m(p)},Ze=p=>{n(p)},Xe=()=>{b(void 0),S(!0),P((async()=>{try{for(const p of be)await Z.remove(p);await X(s,void 0,!1),ie()}catch(p){b(ee(p))}S(!1)})())},Ye=p=>{b(void 0),P((async()=>{try{const _=await Z.signedUrl(p,{expiresInSeconds:a});ut(_)&&E(p)}catch(_){b(ee(_))}})())},Je=p=>{b(void 0),P((async()=>{try{const _=await Z.signedUrl(p,{expiresInSeconds:a}),I=p.slice(p.lastIndexOf("/")+1)||p;Ht(_,I)}catch(_){b(ee(_))}})())};oe(()=>{if(C===void 0)return;const p=globalThis.setTimeout(()=>{E(void 0)},2e3);return()=>{globalThis.clearTimeout(p)}},[C]);const Qe=p=>{b(void 0),S(!0),P((async()=>{try{await Z.remove(p),await X(s,void 0,!1)}catch(_){b(ee(_))}S(!1)})())},et=p=>{const _=`${s}${p.name}`;b(void 0),S(!0),P((async()=>{try{const I=await p.arrayBuffer();await Z.upload({body:I,contentType:p.type===""?void 0:p.type,key:_}),await X(s,void 0,!1)}catch(I){b(ee(I))}S(!1)})())};oe(()=>{J.current+=1,A(void 0),q(!1)},[$]);const tt=()=>{J.current+=1;const p=J.current;b(void 0),H(!0),P((async()=>{try{const _=[];let I;do{const V=await Z.list({cursor:I,limit:Mt});for(const ce of V.objects)_.push(ce.key);I=_.length>=ke?void 0:V.cursor}while(I!==void 0);if(_.length>=ke)p===J.current&&(A([]),q(!0));else{const V=await t.query(Ut,{liveKeys:_},xe($));p===J.current&&(A(V.references??[]),q(V.truncated===!0))}}catch(_){p===J.current&&(A([]),q(!1),b(ee(_)))}p===J.current&&H(!1)})())},st=p=>{le.current+=1,J.current+=1,ge(p),o(f??""),c(f??""),g(void 0),A(void 0),q(!1),ie()};return{allSelected:Be,bucket:W,buckets:Y,bulkDelete:Xe,busy:N,checkOrphans:tt,clearSelection:ie,copiedKey:C,danglingBusy:M,danglingReferences:K,danglingTruncated:G,draftPrefix:l,enterFolder:Me,error:x,expiry:a,files:ae,folders:je,hasObjects:y!==void 0&&y.length>0,hasStorageColumns:O,listFirst:Ae,loaded:y!==void 0,loadMore:Ue,navigate:ye,nextCursor:T,onCopy:Ye,onDelete:Qe,onDownload:Je,onExpiryChange:Ze,onFile:et,onSortKeyChange:qe,onThumbSizeChange:We,prefix:s,referenceShard:$,references:L,resolveUrl:Ge,selectBucket:st,selected:be,setDraftPrefix:c,setReferenceShard:z,showGrid:Pe,showList:He,someSelected:Le,sortDirection:v,sortKey:k,tagKeys:Ke,thumbSize:u,toggleSelect:Ie,toggleSelectAll:Oe,toggleSortDirection:Ve,view:d}},Vt=100,Se=f=>{const e=U(6),{label:t,onNavigate:s,target:o}=f;let l;e[0]!==s||e[1]!==o?(l=()=>{s(o)},e[0]=s,e[1]=o,e[2]=l):l=e[2];const c=l;let a;return e[3]!==c||e[4]!==t?(a=r("button",{className:"rounded px-1 text-muted-foreground outline-none hover:text-foreground focus-visible:text-foreground",onClick:c,type:"button",children:t}),e[3]=c,e[4]=t,e[5]=a):a=e[5],a},Wt=f=>{const e=U(11),{onNavigate:t,prefix:s,t:o}=f;let l;if(e[0]!==t||e[1]!==s||e[2]!==o){const c=s.split("/").filter(Zt);let a;e[4]!==o?(a=o("Folder path"),e[4]=o,e[5]=a):a=e[5];let n;e[6]!==o?(n=o("root"),e[6]=o,e[7]=n):n=e[7];let d;e[8]!==t||e[9]!==n?(d=r(Se,{label:n,onNavigate:t,target:""}),e[8]=t,e[9]=n,e[10]=d):d=e[10],l=R("nav",{"aria-label":a,className:"flex flex-wrap items-center gap-0.5 text-xs","data-testid":"fb-breadcrumbs",children:[d,c.map((h,u)=>R("span",{className:"flex items-center gap-0.5",children:[r("span",{className:"text-muted-foreground/50",children:"/"}),r(Se,{label:h,onNavigate:t,target:`${c.slice(0,u+1).join("/")}/`})]},`${h}-${u.toString()}`))]}),e[0]=t,e[1]=s,e[2]=o,e[3]=l}else l=e[3];return l},ps=({initialPrefix:f,pageSize:e=Vt})=>{const t=ot(),s=qt({initialPrefix:f,pageSize:e}),o=me(null),{onCopy:l,onDelete:c,onDownload:a,onFile:n,toggleSelect:d}=s,h={onCopy:l,onDelete:c,onDownload:a,onToggleSelect:d},u=()=>{o.current?.click()},m=i=>{const v=i.target,w=v.files?.[0];v.value="",w&&n(w)},k=s.loaded&&!s.hasObjects;return R("div",{className:"flex flex-col gap-3","data-testid":"lunora-file-browser",children:[r(Tt,{bucket:s.bucket,buckets:s.buckets,busy:s.busy,draftPrefix:s.draftPrefix,expiry:s.expiry,fileInputRef:o,onBucketChange:s.selectBucket,onExpiryChange:s.onExpiryChange,onFileChange:m,onList:s.listFirst,onPrefixChange:s.setDraftPrefix,onUploadClick:u,t}),s.loaded&&r(Wt,{onNavigate:s.navigate,prefix:s.prefix,t}),s.hasObjects&&r(_t,{onSortKeyChange:s.onSortKeyChange,onThumbSizeChange:s.onThumbSizeChange,showGrid:s.showGrid,showList:s.showList,sortDirection:s.sortDirection,sortKey:s.sortKey,t,tagKeys:s.tagKeys,thumbSize:s.thumbSize,toggleSortDirection:s.toggleSortDirection,view:s.view}),s.hasStorageColumns&&R("div",{className:"flex flex-wrap items-center gap-2","data-testid":"fb-references-shard",children:[r("label",{className:"text-xs text-muted-foreground",htmlFor:"fb-reference-shard-input",children:t("References shard")}),r(nt,{id:"fb-reference-shard-input",onChange:s.setReferenceShard,testId:"fb-reference-shard-input",value:s.referenceShard}),r("span",{className:"text-xs text-muted-foreground",children:t("Which shard's records are checked for references to these files. Empty = root shard.")})]}),s.hasStorageColumns&&r(It,{busy:s.danglingBusy,onCheck:s.checkOrphans,references:s.danglingReferences,t,truncated:s.danglingTruncated}),s.selected.size>0&&r(rt,{count:s.selected.size,editable:!0,onClear:s.clearSelection,onDelete:s.bulkDelete}),s.error!==void 0&&r("p",{className:"text-sm text-destructive","data-testid":"storage-error",role:"alert",children:s.error}),k&&r(we,{description:t("Objects you upload to your R2 buckets will appear here."),icon:R("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[r("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7Z"}),r("path",{d:"M12 11v5m-2.5-2.5h5"})]}),testId:"fb-empty",title:t("No objects.")}),s.hasObjects&&s.view==="list"&&r(kt,{allSelected:s.allSelected,busy:s.busy,copiedKey:s.copiedKey,files:s.files,folders:s.folders,handlers:h,onEnterFolder:s.enterFolder,prefix:s.prefix,references:s.references,selected:s.selected,showReferences:s.hasStorageColumns,someSelected:s.someSelected,t,toggleSelectAll:s.toggleSelectAll}),s.hasObjects&&s.view==="grid"&&r(Bt,{busy:s.busy,copiedKey:s.copiedKey,files:s.files,folders:s.folders,handlers:h,onEnterFolder:s.enterFolder,prefix:s.prefix,references:s.references,resolveUrl:s.resolveUrl,selected:s.selected,showReferences:s.hasStorageColumns,size:s.thumbSize,t}),s.nextCursor!==void 0&&r("div",{children:r(re,{"data-testid":"fb-next",disabled:s.busy,onClick:s.loadMore,size:"sm",type:"button",variant:"outline",children:t("Load more")})})]})};function Zt(f){return f!==""}export{ps as FileBrowser};
@@ -1 +1 @@
1
- import{useLunora as X}from"@lunora/react";import{useState as i,useEffect as Y}from"react";import{ShardInput as G}from"../packem_shared/ShardInput-C6mjgAh4.mjs";import{B as E}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as N}from"../packem_shared/button-q0UYSmrn.mjs";import{I as Q}from"../packem_shared/input-CXhxesPC.mjs";import{L as y}from"../packem_shared/label-DKFzyHq6.mjs";import{T as W}from"../packem_shared/textarea--40GKAyz.mjs";import{useT as Z}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as _}from"../packem_shared/ADMIN_FUNCTIONS-B6z7VLYt.mjs";import{b as ee,i as te,f as re,k as se,c as ae}from"../packem_shared/internal-CwaF9YNk.mjs";import{r as ne}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{jsxs as n,jsx as r}from"react/jsx-runtime";const oe=t=>t.kind==="id"?t.table===void 0?"id":`id<${t.table}>`:t.kind==="array"?t.element===void 0?"array":`${t.element}[]`:t.kind,ie=t=>t===void 0||t.length===0?"()":`(${t.map(o=>`${o.name}${o.optional?"?":""}: ${oe(o)}`).join(", ")})`,de=t=>{switch(t){case"array":return[];case"bigint":case"number":return 0;case"boolean":return!1;case"object":case"record":return{};default:return""}},le=t=>{const o={};for(const s of t??[])s.optional||(o[s.name]=de(s.kind));return JSON.stringify(o,void 0,2)},ce=ae(_.runAs),ue=10,me=t=>t===void 0?"undefined":JSON.stringify(t,null,2),Ae=({functions:t,runAsIdentity:o=!1}={})=>{const s=Z(),u=X(),[L,j]=i(null),[S,B]=i(null),p=t??L??[],[w,R]=i(""),[m,g]=i("{}"),[c,k]=i(""),[f,D]=i(""),[x,h]=i("idle"),[K,b]=i(void 0),[I,v]=i(null),[A,U]=i([]);Y(()=>{if(t!==void 0)return;let e=!1;return u.listFunctions().then(d=>(e||j(d),d)).catch(d=>{e||B(ee(d))}),()=>{e=!0}},[u,t]);const C=w===""?p[0]?.path??"":w,a=p.find(e=>e.path===C),J=async()=>{if(!a)return;let e;try{e=m.trim()===""?{}:JSON.parse(m)}catch(l){h("error"),b(void 0),v(s("Invalid JSON args: {message}",{message:l.message}));return}const d={__lunoraRef:a.path},T=c.trim()===""?{}:{shardKey:c.trim()},F=o?f.trim():"",$=l=>{U(O=>[{argsText:m,at:Date.now(),id:(O[0]?.id??0)+1,kind:a.kind,path:a.path,shardKey:c,status:l},...O].slice(0,ue))};h("running"),v(null);try{const l=F===""?await se(u,a.kind,d,e,T):await u.query(ce,{args:e,functionPath:a.path,userId:F},T);ne(c),b(l),h("success"),$("success")}catch(l){b(void 0),v(l.message),h("error"),$("error")}},M=e=>{R(e.path),g(e.argsText),k(e.shardKey)},P=e=>{R(e.target.value)},z=e=>{g(e.target.value)},q=e=>{D(e.target.value)},H=()=>{re(J())},V=()=>{g(le(a?.args))};return n("div",{className:"flex flex-col gap-4","data-testid":"lunora-function-runner",children:[S!==null&&r("p",{className:"text-sm text-destructive","data-testid":"function-discover-error",role:"alert",children:S}),n("div",{className:"flex flex-col gap-4 rounded-xl border border-border bg-card p-4",children:[n("div",{className:"flex flex-col gap-1.5",children:[r(y,{htmlFor:"function-select",children:s("Function")}),r("select",{"aria-label":s("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:P,value:C,children:p.map(e=>n("option",{value:e.path,children:[e.path," (",e.kind,")"]},e.path))}),a!==void 0&&n("p",{className:"text-xs text-muted-foreground",children:[r("span",{className:"mr-1.5 font-medium",children:s("Signature")}),r("code",{className:"font-mono","data-testid":"function-signature",children:ie(a.args)})]})]}),n("div",{className:"flex flex-col gap-1.5",children:[n("div",{className:"flex items-center justify-between gap-2",children:[r(y,{htmlFor:"args-input",children:s("Arguments")}),r(N,{"data-testid":"prefill-button",disabled:a===void 0,onClick:V,size:"xs",type:"button",variant:"ghost",children:s("Prefill")})]}),r(W,{"aria-label":s("Arguments"),className:"font-mono text-xs","data-testid":"args-input",id:"args-input",onChange:z,value:m})]}),r(G,{onChange:k,testId:"shard-input",value:c}),o&&n("div",{className:"flex flex-col gap-1.5","data-testid":"run-as-field",children:[r(y,{htmlFor:"run-as-input",children:s("Run as identity (userId)")}),r(Q,{"aria-label":s("Run as identity (userId)"),className:"font-mono text-xs","data-testid":"run-as-input",id:"run-as-input",onChange:q,placeholder:s("Leave empty to run as admin"),value:f}),r("p",{className:"text-[11px] text-muted-foreground",children:s("Dev only: runs the function as this user so you can test auth and RLS. Forged over the admin gate.")})]}),n("div",{className:"flex flex-wrap items-center gap-2",children:[r(N,{"data-testid":"run-button",disabled:x==="running"||a===void 0,onClick:H,type:"button",children:s("Run")}),a!==void 0&&r(E,{variant:"outline",children:a.kind}),o&&f.trim()!==""&&r(E,{"data-testid":"run-as-badge",variant:"secondary",children:s("as {userId}",{userId:f.trim()})})]})]}),x==="error"&&I!==null&&r("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs text-destructive","data-testid":"error",role:"alert",children:I}),x==="success"&&r("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs","data-testid":"result",children:me(K)}),A.length>0&&r("ul",{className:"flex flex-col overflow-hidden rounded-xl border border-border","data-testid":"fn-history",children:A.map((e,d)=>n("li",{className:"flex flex-wrap items-center gap-2 border-b border-border px-3 py-2 text-sm last:border-b-0","data-testid":"fn-history-row",children:[r("span",{className:e.status==="success"?"text-success":"text-destructive","data-testid":`fn-history-status-${d.toString()}`,children:e.status==="success"?"✓":"✗"})," ",n("span",{className:"font-mono text-xs",children:[e.path," (",e.kind,")"]})," ",r("time",{className:"text-xs text-muted-foreground",children:te(e.at)})," ",r(N,{className:"ml-auto","data-testid":`fn-history-load-${d.toString()}`,onClick:()=>{M(e)},size:"xs",type:"button",variant:"ghost",children:s("Load")})]},e.id))})]})};export{Ae as FunctionRunner};
1
+ import{useLunora as X}from"@lunora/react";import{useState as i,useEffect as Y}from"react";import{ShardInput as G}from"../packem_shared/ShardInput-C6mjgAh4.mjs";import{B as E}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as N}from"../packem_shared/button-q0UYSmrn.mjs";import{I as Q}from"../packem_shared/input-CXhxesPC.mjs";import{L as y}from"../packem_shared/label-DKFzyHq6.mjs";import{T as W}from"../packem_shared/textarea--40GKAyz.mjs";import{useT as Z}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as _}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{b as ee,i as te,f as re,k as se,c as ae}from"../packem_shared/internal-CwaF9YNk.mjs";import{r as ne}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{jsxs as n,jsx as r}from"react/jsx-runtime";const oe=t=>t.kind==="id"?t.table===void 0?"id":`id<${t.table}>`:t.kind==="array"?t.element===void 0?"array":`${t.element}[]`:t.kind,ie=t=>t===void 0||t.length===0?"()":`(${t.map(o=>`${o.name}${o.optional?"?":""}: ${oe(o)}`).join(", ")})`,de=t=>{switch(t){case"array":return[];case"bigint":case"number":return 0;case"boolean":return!1;case"object":case"record":return{};default:return""}},le=t=>{const o={};for(const s of t??[])s.optional||(o[s.name]=de(s.kind));return JSON.stringify(o,void 0,2)},ce=ae(_.runAs),ue=10,me=t=>t===void 0?"undefined":JSON.stringify(t,null,2),Ae=({functions:t,runAsIdentity:o=!1}={})=>{const s=Z(),u=X(),[L,j]=i(null),[S,B]=i(null),p=t??L??[],[w,R]=i(""),[m,g]=i("{}"),[c,k]=i(""),[f,D]=i(""),[x,h]=i("idle"),[K,b]=i(void 0),[I,v]=i(null),[A,U]=i([]);Y(()=>{if(t!==void 0)return;let e=!1;return u.listFunctions().then(d=>(e||j(d),d)).catch(d=>{e||B(ee(d))}),()=>{e=!0}},[u,t]);const C=w===""?p[0]?.path??"":w,a=p.find(e=>e.path===C),J=async()=>{if(!a)return;let e;try{e=m.trim()===""?{}:JSON.parse(m)}catch(l){h("error"),b(void 0),v(s("Invalid JSON args: {message}",{message:l.message}));return}const d={__lunoraRef:a.path},T=c.trim()===""?{}:{shardKey:c.trim()},F=o?f.trim():"",$=l=>{U(O=>[{argsText:m,at:Date.now(),id:(O[0]?.id??0)+1,kind:a.kind,path:a.path,shardKey:c,status:l},...O].slice(0,ue))};h("running"),v(null);try{const l=F===""?await se(u,a.kind,d,e,T):await u.query(ce,{args:e,functionPath:a.path,userId:F},T);ne(c),b(l),h("success"),$("success")}catch(l){b(void 0),v(l.message),h("error"),$("error")}},M=e=>{R(e.path),g(e.argsText),k(e.shardKey)},P=e=>{R(e.target.value)},z=e=>{g(e.target.value)},q=e=>{D(e.target.value)},H=()=>{re(J())},V=()=>{g(le(a?.args))};return n("div",{className:"flex flex-col gap-4","data-testid":"lunora-function-runner",children:[S!==null&&r("p",{className:"text-sm text-destructive","data-testid":"function-discover-error",role:"alert",children:S}),n("div",{className:"flex flex-col gap-4 rounded-xl border border-border bg-card p-4",children:[n("div",{className:"flex flex-col gap-1.5",children:[r(y,{htmlFor:"function-select",children:s("Function")}),r("select",{"aria-label":s("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:P,value:C,children:p.map(e=>n("option",{value:e.path,children:[e.path," (",e.kind,")"]},e.path))}),a!==void 0&&n("p",{className:"text-xs text-muted-foreground",children:[r("span",{className:"mr-1.5 font-medium",children:s("Signature")}),r("code",{className:"font-mono","data-testid":"function-signature",children:ie(a.args)})]})]}),n("div",{className:"flex flex-col gap-1.5",children:[n("div",{className:"flex items-center justify-between gap-2",children:[r(y,{htmlFor:"args-input",children:s("Arguments")}),r(N,{"data-testid":"prefill-button",disabled:a===void 0,onClick:V,size:"xs",type:"button",variant:"ghost",children:s("Prefill")})]}),r(W,{"aria-label":s("Arguments"),className:"font-mono text-xs","data-testid":"args-input",id:"args-input",onChange:z,value:m})]}),r(G,{onChange:k,testId:"shard-input",value:c}),o&&n("div",{className:"flex flex-col gap-1.5","data-testid":"run-as-field",children:[r(y,{htmlFor:"run-as-input",children:s("Run as identity (userId)")}),r(Q,{"aria-label":s("Run as identity (userId)"),className:"font-mono text-xs","data-testid":"run-as-input",id:"run-as-input",onChange:q,placeholder:s("Leave empty to run as admin"),value:f}),r("p",{className:"text-[11px] text-muted-foreground",children:s("Dev only: runs the function as this user so you can test auth and RLS. Forged over the admin gate.")})]}),n("div",{className:"flex flex-wrap items-center gap-2",children:[r(N,{"data-testid":"run-button",disabled:x==="running"||a===void 0,onClick:H,type:"button",children:s("Run")}),a!==void 0&&r(E,{variant:"outline",children:a.kind}),o&&f.trim()!==""&&r(E,{"data-testid":"run-as-badge",variant:"secondary",children:s("as {userId}",{userId:f.trim()})})]})]}),x==="error"&&I!==null&&r("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs text-destructive","data-testid":"error",role:"alert",children:I}),x==="success"&&r("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs","data-testid":"result",children:me(K)}),A.length>0&&r("ul",{className:"flex flex-col overflow-hidden rounded-xl border border-border","data-testid":"fn-history",children:A.map((e,d)=>n("li",{className:"flex flex-wrap items-center gap-2 border-b border-border px-3 py-2 text-sm last:border-b-0","data-testid":"fn-history-row",children:[r("span",{className:e.status==="success"?"text-success":"text-destructive","data-testid":`fn-history-status-${d.toString()}`,children:e.status==="success"?"✓":"✗"})," ",n("span",{className:"font-mono text-xs",children:[e.path," (",e.kind,")"]})," ",r("time",{className:"text-xs text-muted-foreground",children:te(e.at)})," ",r(N,{className:"ml-auto","data-testid":`fn-history-load-${d.toString()}`,onClick:()=>{M(e)},size:"xs",type:"button",variant:"ghost",children:s("Load")})]},e.id))})]})};export{Ae 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-CczbAfst.mjs";import{L as W}from"../packem_shared/live-status-BuJdUZFU.mjs";import{ShardInput as G}from"../packem_shared/ShardInput-C6mjgAh4.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--2hKx4L2.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-Cbj2GuHu.mjs";import{u as ae}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as ne}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as oe}from"../packem_shared/ADMIN_FUNCTIONS-B6z7VLYt.mjs";import{i as ie}from"../packem_shared/internal-CwaF9YNk.mjs";import{c as j}from"../packem_shared/utils-bhneXptQ.mjs";import{jsx as t,jsxs as y}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(47),{functions:I,initialShardKey:P}=r,s=ne(),{queryShardKey:F,setShardKey:N,shardKey:S}=ae(P),[o,H]=U("recent");let M;e[0]===Symbol.for("react.memo_cache_sentinel")?(M={},e[0]=M):M=e[0];let T;e[1]!==F?(T={live:!0,shardKey:F},e[1]=F,e[2]=T):T=e[2];const{data:O,error:i,errorSource:b,liveError:v}=se(oe.getFunctionStats,M,T),k=O?.functions??null;let w;e[3]!==I?(w=new Map((I??[]).map(fe)),e[3]=I,e[4]=w):w=e[4];const _=w;let E;e[5]===Symbol.for("react.memo_cache_sentinel")?(E=C=>{H(C.currentTarget.dataset.sort)},e[5]=E):E=e[5];const z=E;let K;if(e[6]!==i||e[7]!==b||e[8]!==_||e[9]!==v||e[10]!==N||e[11]!==S||e[12]!==o||e[13]!==k||e[14]!==s){const C=k===null?[]:k.toSorted(ue[o]);let c;e[16]!==s?(c=s("Recent"),e[16]=s,e[17]=c):c=e[17];let d;e[18]!==c?(d={key:"recent",label:c},e[18]=c,e[19]=d):d=e[19];let m;e[20]!==s?(m=s("Most called"),e[20]=s,e[21]=m):m=e[21];let u;e[22]!==m?(u={key:"calls",label:m},e[22]=m,e[23]=u):u=e[23];let f;e[24]!==s?(f=s("Slowest"),e[24]=s,e[25]=f):f=e[25];let h;e[26]!==f?(h={key:"slowest",label:f},e[26]=f,e[27]=h):h=e[27];let $;e[28]!==h||e[29]!==d||e[30]!==u?($=[d,u,h],e[28]=h,e[29]=d,e[30]=u,e[31]=$):$=e[31];const D=$;let p;e[32]!==N||e[33]!==S?(p=t(G,{onChange:N,testId:"fs-shard-input",value:S}),e[32]=N,e[33]=S,e[34]=p):p=e[34];let x;e[35]!==v?(x=t(W,{message:v,prefix:"fs"}),e[35]=v,e[36]=x):x=e[36];let g;e[37]!==D||e[38]!==o?(g=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:o===l.key?"secondary":"ghost",children:l.label},l.key))}),e[37]=D,e[38]=o,e[39]=g):g=e[39];let A;e[40]!==p||e[41]!==x||e[42]!==g?(A=y("div",{className:"flex flex-wrap items-center gap-2",children:[p,x,g]}),e[40]=p,e[41]=x,e[42]=g,e[43]=A):A=e[43];let B;e[44]!==i||e[45]!==b?(B=i!==null&&t(V,{error:b,testId:"fs-error"}),e[44]=i,e[45]=b,e[46]=B):B=e[46],K=y("div",{className:"flex flex-col gap-4","data-testid":"lunora-function-stats",children:[A,B,k!==null&&C.length===0&&i===null&&t(ee,{description:s("Per-function call counts, error rates, and latency land here after your first request."),icon:y("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[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.")}),C.length>0&&t(Y,{className:"overflow-hidden py-0",children:t(Z,{className:"px-0",children:y(te,{"data-testid":"fs-table",children:[t(re,{children:y(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:C.map(l=>{const R=_.get(l.path);return y(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]=i,e[7]=b,e[8]=_,e[9]=v,e[10]=N,e[11]=S,e[12]=o,e[13]=k,e[14]=s,e[15]=K}else K=e[15];return K};function fe(r){return[r.path,r.kind]}export{Ae as FunctionStatsPanel};
1
+ import{c as Q}from"react/compiler-runtime";import{useState as U}from"react";import{E as V}from"../packem_shared/error-alert-CWs6gA3I.mjs";import{L as W}from"../packem_shared/live-status-BuJdUZFU.mjs";import{ShardInput as G}from"../packem_shared/ShardInput-C6mjgAh4.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--2hKx4L2.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-C7JRlFIE.mjs";import{u as ae}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as ne}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as oe}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{i as ie}from"../packem_shared/internal-CwaF9YNk.mjs";import{c as j}from"../packem_shared/utils-bhneXptQ.mjs";import{jsx as t,jsxs as y}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(47),{functions:I,initialShardKey:P}=r,s=ne(),{queryShardKey:F,setShardKey:N,shardKey:S}=ae(P),[o,H]=U("recent");let M;e[0]===Symbol.for("react.memo_cache_sentinel")?(M={},e[0]=M):M=e[0];let T;e[1]!==F?(T={live:!0,shardKey:F},e[1]=F,e[2]=T):T=e[2];const{data:O,error:i,errorSource:b,liveError:v}=se(oe.getFunctionStats,M,T),k=O?.functions??null;let w;e[3]!==I?(w=new Map((I??[]).map(fe)),e[3]=I,e[4]=w):w=e[4];const _=w;let E;e[5]===Symbol.for("react.memo_cache_sentinel")?(E=C=>{H(C.currentTarget.dataset.sort)},e[5]=E):E=e[5];const z=E;let K;if(e[6]!==i||e[7]!==b||e[8]!==_||e[9]!==v||e[10]!==N||e[11]!==S||e[12]!==o||e[13]!==k||e[14]!==s){const C=k===null?[]:k.toSorted(ue[o]);let c;e[16]!==s?(c=s("Recent"),e[16]=s,e[17]=c):c=e[17];let d;e[18]!==c?(d={key:"recent",label:c},e[18]=c,e[19]=d):d=e[19];let m;e[20]!==s?(m=s("Most called"),e[20]=s,e[21]=m):m=e[21];let u;e[22]!==m?(u={key:"calls",label:m},e[22]=m,e[23]=u):u=e[23];let f;e[24]!==s?(f=s("Slowest"),e[24]=s,e[25]=f):f=e[25];let h;e[26]!==f?(h={key:"slowest",label:f},e[26]=f,e[27]=h):h=e[27];let $;e[28]!==h||e[29]!==d||e[30]!==u?($=[d,u,h],e[28]=h,e[29]=d,e[30]=u,e[31]=$):$=e[31];const D=$;let p;e[32]!==N||e[33]!==S?(p=t(G,{onChange:N,testId:"fs-shard-input",value:S}),e[32]=N,e[33]=S,e[34]=p):p=e[34];let x;e[35]!==v?(x=t(W,{message:v,prefix:"fs"}),e[35]=v,e[36]=x):x=e[36];let g;e[37]!==D||e[38]!==o?(g=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:o===l.key?"secondary":"ghost",children:l.label},l.key))}),e[37]=D,e[38]=o,e[39]=g):g=e[39];let A;e[40]!==p||e[41]!==x||e[42]!==g?(A=y("div",{className:"flex flex-wrap items-center gap-2",children:[p,x,g]}),e[40]=p,e[41]=x,e[42]=g,e[43]=A):A=e[43];let B;e[44]!==i||e[45]!==b?(B=i!==null&&t(V,{error:b,testId:"fs-error"}),e[44]=i,e[45]=b,e[46]=B):B=e[46],K=y("div",{className:"flex flex-col gap-4","data-testid":"lunora-function-stats",children:[A,B,k!==null&&C.length===0&&i===null&&t(ee,{description:s("Per-function call counts, error rates, and latency land here after your first request."),icon:y("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[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.")}),C.length>0&&t(Y,{className:"overflow-hidden py-0",children:t(Z,{className:"px-0",children:y(te,{"data-testid":"fs-table",children:[t(re,{children:y(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:C.map(l=>{const R=_.get(l.path);return y(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]=i,e[7]=b,e[8]=_,e[9]=v,e[10]=N,e[11]=S,e[12]=o,e[13]=k,e[14]=s,e[15]=K}else K=e[15];return K};function fe(r){return[r.path,r.kind]}export{Ae as FunctionStatsPanel};
@@ -1 +1 @@
1
- import{c as ae}from"react/compiler-runtime";import{useLunora as pe}from"@lunora/react";import{useState as E,useRef as D,useEffect as j,useCallback as ge}from"react";import xe from"../packem_shared/ConnectionBadge-B_8fcft2.mjs";import{L as ve}from"../packem_shared/live-status-BuJdUZFU.mjs";import{B as G}from"../packem_shared/badge-r_5B4LHP.mjs";import{C as M}from"../packem_shared/card--2hKx4L2.mjs";import{u as Ne}from"../packem_shared/use-admin-query-Cbj2GuHu.mjs";import{useT as le}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as A}from"../packem_shared/ADMIN_FUNCTIONS-B6z7VLYt.mjs";import{i as be,f as $,d as ee,b as te,c as _}from"../packem_shared/internal-CwaF9YNk.mjs";import{l as we}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{c as R}from"../packem_shared/utils-bhneXptQ.mjs";import{jsx as l,jsxs as u}from"react/jsx-runtime";import{shardsToAggregate as Ee}from"../packem_shared/aggregateMetrics-A-Y7OH6R.mjs";import{S as z}from"../packem_shared/sparkline-B_sPPO_8.mjs";const Se={crit:"destructive",ok:"secondary",warn:"default"},P=(s,e)=>e===0?"—":`${(s/e*100).toFixed(1)}%`,Q=(s,e,r)=>Number.isNaN(s)?"ok":s>=r?"crit":s>=e?"warn":"ok",ne=.01,oe=.05,ye=s=>{const e=ae(36),{errorCount:r,logsError:t,topErrors:a,worstFunctions:f}=s,o=le();let n;e[0]!==o?(n=o("Functions by error rate"),e[0]=o,e[1]=n):n=e[1];let h;e[2]!==n?(h=l("header",{className:"border-b border-border px-4 py-3",children:l("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:n})}),e[2]=n,e[3]=h):h=e[3];let m;e[4]!==o||e[5]!==f?(m=f.length===0?l("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"hl-functions-empty",children:o("No function activity yet.")}):l("ul",{className:"divide-y divide-border",children:f.map(b=>u("li",{className:"flex flex-wrap items-center justify-between gap-2 px-4 py-2 text-xs","data-testid":"hl-fn-row",children:[l("span",{className:"truncate font-mono text-foreground",children:b.path}),u("span",{className:"flex shrink-0 items-center gap-2",children:[l("span",{className:"tabular-nums text-muted-foreground",children:o("{count} calls",{count:b.calls.toString()})}),l(G,{variant:Se[Q(b.errors/b.calls,ne,oe)],children:P(b.errors,b.calls)})]})]},b.path))}),e[4]=o,e[5]=f,e[6]=m):m=e[6];let p;e[7]!==h||e[8]!==m?(p=u(M,{className:"gap-0 py-0","data-testid":"hl-functions",children:[h,m]}),e[7]=h,e[8]=m,e[9]=p):p=e[9];let v;e[10]!==o?(v=o("Recent errors"),e[10]=o,e[11]=v):v=e[11];let i;e[12]!==v?(i=l("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:v}),e[12]=v,e[13]=i):i=e[13];const c=r>0?"destructive":"outline";let g;e[14]!==r||e[15]!==c?(g=l(G,{"data-testid":"hl-error-count",variant:c,children:r}),e[14]=r,e[15]=c,e[16]=g):g=e[16];let x;e[17]!==i||e[18]!==g?(x=u("header",{className:"flex items-center justify-between gap-2 border-b border-border px-4 py-3",children:[i,g]}),e[17]=i,e[18]=g,e[19]=x):x=e[19];let S;e[20]!==t?(S=t!==null&&l("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]=S):S=e[21];let y;e[22]!==t||e[23]!==o||e[24]!==a.length?(y=t===null&&a.length===0&&l("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"hl-errors-empty",children:o("No recent errors.")}),e[22]=t,e[23]=o,e[24]=a.length,e[25]=y):y=e[25];let T;e[26]!==a?(T=a.length>0&&l("ul",{className:"divide-y divide-border",children:a.map(Te)}),e[26]=a,e[27]=T):T=e[27];let N;e[28]!==S||e[29]!==y||e[30]!==T||e[31]!==x?(N=u(M,{className:"gap-0 py-0",children:[x,S,y,T]}),e[28]=S,e[29]=y,e[30]=T,e[31]=x,e[32]=N):N=e[32];let w;return e[33]!==N||e[34]!==p?(w=u("div",{className:"grid gap-3 lg:grid-cols-2",children:[p,N]}),e[33]=N,e[34]=p,e[35]=w):w=e[35],w};function Te(s,e){return u("li",{className:"flex flex-col gap-0.5 px-4 py-2 text-xs","data-testid":"hl-error-row",children:[u("span",{className:"flex items-center gap-2",children:[l("time",{className:"shrink-0 text-muted-foreground",children:be(s.timestamp)}),s.functionPath!==void 0&&l("span",{className:"truncate font-mono text-foreground",children:s.functionPath})]}),l("span",{className:"text-destructive",children:s.message})]},`${s.timestamp.toString()}-${e.toString()}`)}const re={completed:0,failed:2,in_progress:1},Ae=s=>{let e=0,r=0,t=0,a=0,f=!1;const o=[];for(const{metrics:n}of s){if(n===null){a+=1;continue}t+=1,e+=n.requests,r+=n.errors,o.push(...n.history??[]),f||=n.historyTruncated===!0}return{errors:r,failed:a,history:o,historyTruncated:f,reachable:t,requests:e}},ke=s=>{const e=new Map;for(const r of s)for(const t of r){const a=e.get(t.path);if(a===void 0){e.set(t.path,{...t});continue}a.calls+=t.calls,a.errors+=t.errors,a.totalDurationMs+=t.totalDurationMs,a.scans=(a.scans??0)+(t.scans??0),a.maxDurationMs=Math.max(a.maxDurationMs,t.maxDurationMs),a.lastCalledAt=Math.max(a.lastCalledAt,t.lastCalledAt),(t.lastErrorAt??0)>(a.lastErrorAt??0)&&(a.lastErrorAt=t.lastErrorAt,a.lastErrorMessage=t.lastErrorMessage)}return[...e.values()]},Re=s=>{const e=new Map;for(const r of s)for(const t of r){const a=e.get(t.id);if(a===void 0){e.set(t.id,t);continue}const f=re[t.status]-re[a.status];(f>0||f===0&&(t.updatedAt??0)>(a.updatedAt??0))&&e.set(t.id,t)}return[...e.values()]},Me=_(A.getAuthMetrics),_e=_(A.getFunctionStats),Le=_(A.getLogs),Ie=_(A.getMetrics),Ce=_(A.migrationStatus),qe=5,se=2e3,Oe=5,Fe=.1,De=.3,je=1,Ue=50,Pe=(s,e,r)=>s>=r?"crit":s>=e?"warn":"ok",Ge=s=>{const e=new Map;for(const t of s??[]){const a=e.get(t.bucketMs)??{calls:0,errors:0};a.calls+=t.calls,a.errors+=t.errors,e.set(t.bucketMs,a)}const r=[...e.entries()].toSorted((t,a)=>t[0]-a[0]);return{errors:r.map(([,t])=>t.errors),requests:r.map(([,t])=>t.calls)}},Ve=s=>{let e=0,r=0;for(const a of s)a.status==="failed"?e+=1:a.status==="in_progress"&&(r+=1);let t="ok";return e>0?t="crit":r>0&&(t="warn"),{failed:e,level:t,running:r}},Be=(s,e)=>s.failed>0?e("{count} failed",{count:s.failed.toString()}):s.running>0?e("{count} running",{count:s.running.toString()}):e("OK"),ie={crit:"bg-destructive",ok:"bg-success",warn:"bg-warning"},ce={crit:"text-destructive",ok:"text-foreground",warn:"text-warning"},He={crit:"bg-destructive/10 text-destructive",ok:"bg-success/10 text-success",warn:"bg-warning/10 text-warning"},Ke=s=>s.includes("crit")?"crit":s.includes("warn")?"warn":"ok",U=s=>{const e=ae(19),{chart:r,label:t,level:a,testId:f,value:o}=s,n=ie[a];let h;e[0]!==n?(h=R("size-1.5 shrink-0 rounded-full",n),e[0]=n,e[1]=h):h=e[1];let m;e[2]!==h?(m=l("span",{"aria-hidden":"true",className:h}),e[2]=h,e[3]=m):m=e[3];let p;e[4]!==t||e[5]!==m?(p=u("span",{className:"flex items-center gap-1.5 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:[m,t]}),e[4]=t,e[5]=m,e[6]=p):p=e[6];const v=ce[a];let i;e[7]!==v?(i=R("truncate text-2xl font-semibold tabular-nums",v),e[7]=v,e[8]=i):i=e[8];let c;e[9]!==i||e[10]!==f||e[11]!==o?(c=l("span",{className:i,"data-testid":f,children:o}),e[9]=i,e[10]=f,e[11]=o,e[12]=c):c=e[12];let g;e[13]!==r||e[14]!==c?(g=u("div",{className:"flex items-center justify-between gap-3",children:[c,r]}),e[13]=r,e[14]=c,e[15]=g):g=e[15];let x;return e[16]!==p||e[17]!==g?(x=l(M,{className:"gap-0 py-0",children:u("div",{className:"flex flex-col gap-2.5 p-4",children:[p,g]})}),e[16]=p,e[17]=g,e[18]=x):x=e[18],x},$e=async(s,e,r)=>{const t=await Promise.all(r.map(i=>{const c=ee(i);return Promise.allSettled([s.query(Ie,{},c),s.query(_e,{},c),s.query(Ce,{},c)])})),a=ee(e),f=typeof s.schedulerStatus=="function"?s.schedulerStatus():Promise.reject(new Error("scheduler status unavailable")),[o,n,h]=await Promise.allSettled([s.query(Le,{},a),s.query(Me,{},a),f]),m=t.map(([i,c,g])=>({functions:c.status==="fulfilled"?c.value.functions:[],metrics:i.status==="fulfilled"?i.value:null,migrations:g.status==="fulfilled"?g.value.migrations:[]})),p=Ae(m),v=t[0]?.[0];return{auth:n.status==="fulfilled"?n.value:null,entries:o.status==="fulfilled"?o.value.entries:[],functions:ke(m.map(i=>i.functions)),logsError:o.status==="rejected"?te(o.reason):null,metricsError:p.reachable===0&&v?.status==="rejected"?te(v.reason):null,migrations:Re(m.map(i=>i.migrations)),scheduler:h.status==="fulfilled"?h.value:null,totals:p}},ze=s=>{const e=s?.history??[];return{attempts:e.map(r=>r.attempts),failures:e.map(r=>r.failures)}},ut=({initialShardKey:s})=>{const e=pe(),r=le(),[t,a]=E([]),[f,o]=E(null),[n,h]=E(null),[m,p]=E(null),[v,i]=E([]),[c,g]=E(null),[x,S]=E(null),[y,T]=E([]),[N]=E(we),w=D(!1),b=D(!0);j(()=>(b.current=!0,()=>{b.current=!1}),[]);const L=s??"",I=ge(async()=>{if(w.current)return;w.current=!0;const d=await $e(e,L,Ee(L,N));if(!b.current){w.current=!1;return}h(d.totals),p(d.metricsError),i(d.functions),T(d.migrations),a(d.entries),o(d.logsError),g(d.auth),S(d.scheduler),w.current=!1},[e,N,L]);j(()=>{$(I())},[I]);const V=D(0),k=D(null),ue=()=>{const d=Date.now()-V.current;if(d>=se){V.current=Date.now(),$(I());return}k.current===null&&(k.current=setTimeout(()=>{k.current=null,V.current=Date.now(),$(I())},se-d))};j(()=>()=>{k.current!==null&&clearTimeout(k.current)},[]);const{data:W,liveError:de}=Ne(A.getMetrics,{},{live:!0,shardKey:L});j(()=>{W!==void 0&&ue()},[W]);const X=t.filter(d=>d.level==="error"),me=X.slice(0,qe),C=Ge(n?.history),J=ze(c),fe=v.filter(d=>d.calls>0).toSorted((d,K)=>K.errors/K.calls-d.errors/d.calls||K.calls-d.calls).slice(0,Oe),B=Ve(y),he=n===null||n.requests===0?0:n.errors/n.requests,H=Q(he,ne,oe),Y=c===null?"ok":Q(c.failureRate,Fe,De),Z=x===null?"ok":Pe(x.backlog,je,Ue),q=Ke([H,Y,Z,B.level]);let O,F;return q==="crit"?(O=r("Critical"),F=r("One or more service levels are breached.")):q==="warn"?(O=r("Degraded"),F=r("Some service levels need attention.")):(O=r("All systems healthy"),F=r("All service levels are within target.")),u("div",{className:"flex flex-col gap-6","data-testid":"lunora-health",children:[u(M,{className:"gap-0 py-0",children:[u("div",{className:"flex flex-wrap items-center justify-between gap-4 p-4",children:[u("div",{className:"flex items-center gap-3",children:[l("span",{"aria-hidden":"true",className:R("flex size-10 shrink-0 items-center justify-center rounded-full",He[q]),children:l("span",{className:R("size-3 rounded-full",ie[q])})}),u("div",{className:"grid leading-tight",children:[l("span",{className:"text-sm font-semibold text-foreground","data-testid":"hl-status",children:O}),l("span",{className:"text-[13px] text-muted-foreground",children:F})]})]}),u("div",{className:"flex flex-wrap items-center gap-4",children:[u("div",{className:"text-end",children:[l("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:r("Requests")}),u("div",{className:"flex items-center justify-end gap-2",children:[C.requests.length>=2&&l(z,{ariaLabel:r("Requests over time"),className:"h-6 w-20 text-foreground",series:C.requests,testId:"hl-spark-requests"}),l("span",{className:"text-lg font-semibold tabular-nums text-foreground","data-testid":"hl-requests",children:(n?.requests??0).toString()})]})]}),l("span",{"aria-hidden":"true",className:"h-9 w-px bg-border"}),u("div",{className:"text-end",children:[l("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:r("Error rate")}),l("div",{className:R("text-lg font-semibold tabular-nums",ce[H]),"data-testid":"hl-error-rate",children:n===null?"—":P(n.errors,n.requests)})]}),l("span",{"aria-hidden":"true",className:"h-9 w-px bg-border"}),u("div",{className:"flex items-center gap-2",children:[l(xe,{}),l(ve,{message:de,prefix:"hl"})]})]})]}),m!==null&&l("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:m}),m===null&&n?.historyTruncated===!0&&l("div",{className:"border-t border-border bg-warning/5 px-4 py-2 text-sm text-muted-foreground","data-testid":"hl-history-truncated",children:r("Showing a partial request/error history — one or more shards have more data than the trend chart can display.")})]}),u("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-4","data-testid":"hl-slo",children:[l(U,{chart:C.errors.length>=2?l(z,{ariaLabel:r("Errors over time"),className:"h-7 w-20 text-destructive",series:C.errors,testId:"hl-spark-errors"}):void 0,label:r("Error rate"),level:H,testId:"hl-slo-errorrate",value:n===null?"—":P(n.errors,n.requests)}),l(U,{chart:J.failures.length>=2?l(z,{ariaLabel:r("Auth failures over time"),className:"h-7 w-20 text-destructive",series:J.failures,testId:"hl-spark-auth"}):void 0,label:r("Auth failures"),level:Y,testId:"hl-slo-auth",value:c===null?"—":P(c.failures,c.attempts)}),l(U,{label:r("Scheduler backlog"),level:Z,testId:"hl-slo-backlog",value:x===null?"—":x.backlog.toString()}),l(U,{label:r("Migrations"),level:B.level,testId:"hl-slo-migrations",value:Be(B,r)})]}),l(ye,{errorCount:X.length,logsError:f,topErrors:me,worstFunctions:fe}),u(M,{className:"gap-0 py-0",children:[u("header",{className:"flex items-center justify-between gap-2 border-b border-border px-4 py-3",children:[l("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Shards seen")}),l(G,{"data-testid":"hl-shard-count",variant:"outline",children:N.length})]}),N.length>0&&l("ul",{className:"flex flex-wrap gap-1.5 p-4",children:N.map(d=>l("li",{"data-testid":"hl-shard",children:l(G,{variant:"secondary",children:d})},d))})]})]})};export{ut as HealthPanel};
1
+ import{c as ae}from"react/compiler-runtime";import{useLunora as pe}from"@lunora/react";import{useState as E,useRef as D,useEffect as j,useCallback as ge}from"react";import xe from"../packem_shared/ConnectionBadge-B_8fcft2.mjs";import{L as ve}from"../packem_shared/live-status-BuJdUZFU.mjs";import{B as G}from"../packem_shared/badge-r_5B4LHP.mjs";import{C as M}from"../packem_shared/card--2hKx4L2.mjs";import{u as Ne}from"../packem_shared/use-admin-query-C7JRlFIE.mjs";import{useT as le}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as A}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{i as be,f as $,d as ee,b as te,c as _}from"../packem_shared/internal-CwaF9YNk.mjs";import{l as we}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{c as R}from"../packem_shared/utils-bhneXptQ.mjs";import{jsx as l,jsxs as u}from"react/jsx-runtime";import{shardsToAggregate as Ee}from"../packem_shared/aggregateMetrics-A-Y7OH6R.mjs";import{S as z}from"../packem_shared/sparkline-B_sPPO_8.mjs";const Se={crit:"destructive",ok:"secondary",warn:"default"},P=(s,e)=>e===0?"—":`${(s/e*100).toFixed(1)}%`,Q=(s,e,r)=>Number.isNaN(s)?"ok":s>=r?"crit":s>=e?"warn":"ok",ne=.01,oe=.05,ye=s=>{const e=ae(36),{errorCount:r,logsError:t,topErrors:a,worstFunctions:f}=s,o=le();let n;e[0]!==o?(n=o("Functions by error rate"),e[0]=o,e[1]=n):n=e[1];let h;e[2]!==n?(h=l("header",{className:"border-b border-border px-4 py-3",children:l("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:n})}),e[2]=n,e[3]=h):h=e[3];let m;e[4]!==o||e[5]!==f?(m=f.length===0?l("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"hl-functions-empty",children:o("No function activity yet.")}):l("ul",{className:"divide-y divide-border",children:f.map(b=>u("li",{className:"flex flex-wrap items-center justify-between gap-2 px-4 py-2 text-xs","data-testid":"hl-fn-row",children:[l("span",{className:"truncate font-mono text-foreground",children:b.path}),u("span",{className:"flex shrink-0 items-center gap-2",children:[l("span",{className:"tabular-nums text-muted-foreground",children:o("{count} calls",{count:b.calls.toString()})}),l(G,{variant:Se[Q(b.errors/b.calls,ne,oe)],children:P(b.errors,b.calls)})]})]},b.path))}),e[4]=o,e[5]=f,e[6]=m):m=e[6];let p;e[7]!==h||e[8]!==m?(p=u(M,{className:"gap-0 py-0","data-testid":"hl-functions",children:[h,m]}),e[7]=h,e[8]=m,e[9]=p):p=e[9];let v;e[10]!==o?(v=o("Recent errors"),e[10]=o,e[11]=v):v=e[11];let i;e[12]!==v?(i=l("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:v}),e[12]=v,e[13]=i):i=e[13];const c=r>0?"destructive":"outline";let g;e[14]!==r||e[15]!==c?(g=l(G,{"data-testid":"hl-error-count",variant:c,children:r}),e[14]=r,e[15]=c,e[16]=g):g=e[16];let x;e[17]!==i||e[18]!==g?(x=u("header",{className:"flex items-center justify-between gap-2 border-b border-border px-4 py-3",children:[i,g]}),e[17]=i,e[18]=g,e[19]=x):x=e[19];let S;e[20]!==t?(S=t!==null&&l("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]=S):S=e[21];let y;e[22]!==t||e[23]!==o||e[24]!==a.length?(y=t===null&&a.length===0&&l("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"hl-errors-empty",children:o("No recent errors.")}),e[22]=t,e[23]=o,e[24]=a.length,e[25]=y):y=e[25];let T;e[26]!==a?(T=a.length>0&&l("ul",{className:"divide-y divide-border",children:a.map(Te)}),e[26]=a,e[27]=T):T=e[27];let N;e[28]!==S||e[29]!==y||e[30]!==T||e[31]!==x?(N=u(M,{className:"gap-0 py-0",children:[x,S,y,T]}),e[28]=S,e[29]=y,e[30]=T,e[31]=x,e[32]=N):N=e[32];let w;return e[33]!==N||e[34]!==p?(w=u("div",{className:"grid gap-3 lg:grid-cols-2",children:[p,N]}),e[33]=N,e[34]=p,e[35]=w):w=e[35],w};function Te(s,e){return u("li",{className:"flex flex-col gap-0.5 px-4 py-2 text-xs","data-testid":"hl-error-row",children:[u("span",{className:"flex items-center gap-2",children:[l("time",{className:"shrink-0 text-muted-foreground",children:be(s.timestamp)}),s.functionPath!==void 0&&l("span",{className:"truncate font-mono text-foreground",children:s.functionPath})]}),l("span",{className:"text-destructive",children:s.message})]},`${s.timestamp.toString()}-${e.toString()}`)}const re={completed:0,failed:2,in_progress:1},Ae=s=>{let e=0,r=0,t=0,a=0,f=!1;const o=[];for(const{metrics:n}of s){if(n===null){a+=1;continue}t+=1,e+=n.requests,r+=n.errors,o.push(...n.history??[]),f||=n.historyTruncated===!0}return{errors:r,failed:a,history:o,historyTruncated:f,reachable:t,requests:e}},ke=s=>{const e=new Map;for(const r of s)for(const t of r){const a=e.get(t.path);if(a===void 0){e.set(t.path,{...t});continue}a.calls+=t.calls,a.errors+=t.errors,a.totalDurationMs+=t.totalDurationMs,a.scans=(a.scans??0)+(t.scans??0),a.maxDurationMs=Math.max(a.maxDurationMs,t.maxDurationMs),a.lastCalledAt=Math.max(a.lastCalledAt,t.lastCalledAt),(t.lastErrorAt??0)>(a.lastErrorAt??0)&&(a.lastErrorAt=t.lastErrorAt,a.lastErrorMessage=t.lastErrorMessage)}return[...e.values()]},Re=s=>{const e=new Map;for(const r of s)for(const t of r){const a=e.get(t.id);if(a===void 0){e.set(t.id,t);continue}const f=re[t.status]-re[a.status];(f>0||f===0&&(t.updatedAt??0)>(a.updatedAt??0))&&e.set(t.id,t)}return[...e.values()]},Me=_(A.getAuthMetrics),_e=_(A.getFunctionStats),Le=_(A.getLogs),Ie=_(A.getMetrics),Ce=_(A.migrationStatus),qe=5,se=2e3,Oe=5,Fe=.1,De=.3,je=1,Ue=50,Pe=(s,e,r)=>s>=r?"crit":s>=e?"warn":"ok",Ge=s=>{const e=new Map;for(const t of s??[]){const a=e.get(t.bucketMs)??{calls:0,errors:0};a.calls+=t.calls,a.errors+=t.errors,e.set(t.bucketMs,a)}const r=[...e.entries()].toSorted((t,a)=>t[0]-a[0]);return{errors:r.map(([,t])=>t.errors),requests:r.map(([,t])=>t.calls)}},Ve=s=>{let e=0,r=0;for(const a of s)a.status==="failed"?e+=1:a.status==="in_progress"&&(r+=1);let t="ok";return e>0?t="crit":r>0&&(t="warn"),{failed:e,level:t,running:r}},Be=(s,e)=>s.failed>0?e("{count} failed",{count:s.failed.toString()}):s.running>0?e("{count} running",{count:s.running.toString()}):e("OK"),ie={crit:"bg-destructive",ok:"bg-success",warn:"bg-warning"},ce={crit:"text-destructive",ok:"text-foreground",warn:"text-warning"},He={crit:"bg-destructive/10 text-destructive",ok:"bg-success/10 text-success",warn:"bg-warning/10 text-warning"},Ke=s=>s.includes("crit")?"crit":s.includes("warn")?"warn":"ok",U=s=>{const e=ae(19),{chart:r,label:t,level:a,testId:f,value:o}=s,n=ie[a];let h;e[0]!==n?(h=R("size-1.5 shrink-0 rounded-full",n),e[0]=n,e[1]=h):h=e[1];let m;e[2]!==h?(m=l("span",{"aria-hidden":"true",className:h}),e[2]=h,e[3]=m):m=e[3];let p;e[4]!==t||e[5]!==m?(p=u("span",{className:"flex items-center gap-1.5 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:[m,t]}),e[4]=t,e[5]=m,e[6]=p):p=e[6];const v=ce[a];let i;e[7]!==v?(i=R("truncate text-2xl font-semibold tabular-nums",v),e[7]=v,e[8]=i):i=e[8];let c;e[9]!==i||e[10]!==f||e[11]!==o?(c=l("span",{className:i,"data-testid":f,children:o}),e[9]=i,e[10]=f,e[11]=o,e[12]=c):c=e[12];let g;e[13]!==r||e[14]!==c?(g=u("div",{className:"flex items-center justify-between gap-3",children:[c,r]}),e[13]=r,e[14]=c,e[15]=g):g=e[15];let x;return e[16]!==p||e[17]!==g?(x=l(M,{className:"gap-0 py-0",children:u("div",{className:"flex flex-col gap-2.5 p-4",children:[p,g]})}),e[16]=p,e[17]=g,e[18]=x):x=e[18],x},$e=async(s,e,r)=>{const t=await Promise.all(r.map(i=>{const c=ee(i);return Promise.allSettled([s.query(Ie,{},c),s.query(_e,{},c),s.query(Ce,{},c)])})),a=ee(e),f=typeof s.schedulerStatus=="function"?s.schedulerStatus():Promise.reject(new Error("scheduler status unavailable")),[o,n,h]=await Promise.allSettled([s.query(Le,{},a),s.query(Me,{},a),f]),m=t.map(([i,c,g])=>({functions:c.status==="fulfilled"?c.value.functions:[],metrics:i.status==="fulfilled"?i.value:null,migrations:g.status==="fulfilled"?g.value.migrations:[]})),p=Ae(m),v=t[0]?.[0];return{auth:n.status==="fulfilled"?n.value:null,entries:o.status==="fulfilled"?o.value.entries:[],functions:ke(m.map(i=>i.functions)),logsError:o.status==="rejected"?te(o.reason):null,metricsError:p.reachable===0&&v?.status==="rejected"?te(v.reason):null,migrations:Re(m.map(i=>i.migrations)),scheduler:h.status==="fulfilled"?h.value:null,totals:p}},ze=s=>{const e=s?.history??[];return{attempts:e.map(r=>r.attempts),failures:e.map(r=>r.failures)}},ut=({initialShardKey:s})=>{const e=pe(),r=le(),[t,a]=E([]),[f,o]=E(null),[n,h]=E(null),[m,p]=E(null),[v,i]=E([]),[c,g]=E(null),[x,S]=E(null),[y,T]=E([]),[N]=E(we),w=D(!1),b=D(!0);j(()=>(b.current=!0,()=>{b.current=!1}),[]);const L=s??"",I=ge(async()=>{if(w.current)return;w.current=!0;const d=await $e(e,L,Ee(L,N));if(!b.current){w.current=!1;return}h(d.totals),p(d.metricsError),i(d.functions),T(d.migrations),a(d.entries),o(d.logsError),g(d.auth),S(d.scheduler),w.current=!1},[e,N,L]);j(()=>{$(I())},[I]);const V=D(0),k=D(null),ue=()=>{const d=Date.now()-V.current;if(d>=se){V.current=Date.now(),$(I());return}k.current===null&&(k.current=setTimeout(()=>{k.current=null,V.current=Date.now(),$(I())},se-d))};j(()=>()=>{k.current!==null&&clearTimeout(k.current)},[]);const{data:W,liveError:de}=Ne(A.getMetrics,{},{live:!0,shardKey:L});j(()=>{W!==void 0&&ue()},[W]);const X=t.filter(d=>d.level==="error"),me=X.slice(0,qe),C=Ge(n?.history),J=ze(c),fe=v.filter(d=>d.calls>0).toSorted((d,K)=>K.errors/K.calls-d.errors/d.calls||K.calls-d.calls).slice(0,Oe),B=Ve(y),he=n===null||n.requests===0?0:n.errors/n.requests,H=Q(he,ne,oe),Y=c===null?"ok":Q(c.failureRate,Fe,De),Z=x===null?"ok":Pe(x.backlog,je,Ue),q=Ke([H,Y,Z,B.level]);let O,F;return q==="crit"?(O=r("Critical"),F=r("One or more service levels are breached.")):q==="warn"?(O=r("Degraded"),F=r("Some service levels need attention.")):(O=r("All systems healthy"),F=r("All service levels are within target.")),u("div",{className:"flex flex-col gap-6","data-testid":"lunora-health",children:[u(M,{className:"gap-0 py-0",children:[u("div",{className:"flex flex-wrap items-center justify-between gap-4 p-4",children:[u("div",{className:"flex items-center gap-3",children:[l("span",{"aria-hidden":"true",className:R("flex size-10 shrink-0 items-center justify-center rounded-full",He[q]),children:l("span",{className:R("size-3 rounded-full",ie[q])})}),u("div",{className:"grid leading-tight",children:[l("span",{className:"text-sm font-semibold text-foreground","data-testid":"hl-status",children:O}),l("span",{className:"text-[13px] text-muted-foreground",children:F})]})]}),u("div",{className:"flex flex-wrap items-center gap-4",children:[u("div",{className:"text-end",children:[l("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:r("Requests")}),u("div",{className:"flex items-center justify-end gap-2",children:[C.requests.length>=2&&l(z,{ariaLabel:r("Requests over time"),className:"h-6 w-20 text-foreground",series:C.requests,testId:"hl-spark-requests"}),l("span",{className:"text-lg font-semibold tabular-nums text-foreground","data-testid":"hl-requests",children:(n?.requests??0).toString()})]})]}),l("span",{"aria-hidden":"true",className:"h-9 w-px bg-border"}),u("div",{className:"text-end",children:[l("div",{className:"font-mono text-[10px] tracking-wide text-muted-foreground uppercase",children:r("Error rate")}),l("div",{className:R("text-lg font-semibold tabular-nums",ce[H]),"data-testid":"hl-error-rate",children:n===null?"—":P(n.errors,n.requests)})]}),l("span",{"aria-hidden":"true",className:"h-9 w-px bg-border"}),u("div",{className:"flex items-center gap-2",children:[l(xe,{}),l(ve,{message:de,prefix:"hl"})]})]})]}),m!==null&&l("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:m}),m===null&&n?.historyTruncated===!0&&l("div",{className:"border-t border-border bg-warning/5 px-4 py-2 text-sm text-muted-foreground","data-testid":"hl-history-truncated",children:r("Showing a partial request/error history — one or more shards have more data than the trend chart can display.")})]}),u("div",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-4","data-testid":"hl-slo",children:[l(U,{chart:C.errors.length>=2?l(z,{ariaLabel:r("Errors over time"),className:"h-7 w-20 text-destructive",series:C.errors,testId:"hl-spark-errors"}):void 0,label:r("Error rate"),level:H,testId:"hl-slo-errorrate",value:n===null?"—":P(n.errors,n.requests)}),l(U,{chart:J.failures.length>=2?l(z,{ariaLabel:r("Auth failures over time"),className:"h-7 w-20 text-destructive",series:J.failures,testId:"hl-spark-auth"}):void 0,label:r("Auth failures"),level:Y,testId:"hl-slo-auth",value:c===null?"—":P(c.failures,c.attempts)}),l(U,{label:r("Scheduler backlog"),level:Z,testId:"hl-slo-backlog",value:x===null?"—":x.backlog.toString()}),l(U,{label:r("Migrations"),level:B.level,testId:"hl-slo-migrations",value:Be(B,r)})]}),l(ye,{errorCount:X.length,logsError:f,topErrors:me,worstFunctions:fe}),u(M,{className:"gap-0 py-0",children:[u("header",{className:"flex items-center justify-between gap-2 border-b border-border px-4 py-3",children:[l("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Shards seen")}),l(G,{"data-testid":"hl-shard-count",variant:"outline",children:N.length})]}),N.length>0&&l("ul",{className:"flex flex-wrap gap-1.5 p-4",children:N.map(d=>l("li",{"data-testid":"hl-shard",children:l(G,{variant:"secondary",children:d})},d))})]})]})};export{ut as HealthPanel};
@@ -1 +1 @@
1
- import{c as P}from"react/compiler-runtime";import{useLunora as se}from"@lunora/react";import{useNavigate as re}from"@tanstack/react-router";import{useState as k,useRef as ae,useEffectEvent as O,useEffect as Q,useCallback as oe,useMemo as ie}from"react";import{ShardInput as ce}from"../packem_shared/ShardInput-C6mjgAh4.mjs";import{B as le}from"../packem_shared/button-q0UYSmrn.mjs";import{u as N}from"../packem_shared/use-admin-query-Cbj2GuHu.mjs";import{u as de}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as H}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as A}from"../packem_shared/ADMIN_FUNCTIONS-B6z7VLYt.mjs";import{f as E,d as L,c as q,l as ue}from"../packem_shared/internal-CwaF9YNk.mjs";import{r as fe}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{a as U,A as me}from"../packem_shared/advisor-view-5mZH6453.mjs";import{ConfirmButton as he}from"../packem_shared/ConfirmButton-DU4p72Er.mjs";import{q as B}from"../packem_shared/quote-identifier-CGiYFBvY.mjs";import{jsx as g}from"react/jsx-runtime";import{deriveInsights as pe}from"../packem_shared/DEFAULT_INSIGHT_THRESHOLDS-D5YMT0gM.mjs";import{runAdvisor as be,RUNTIME_LINTS as ye,constraintValidator as xe}from"@lunora/advisor";const ve=t=>{const{suggestedIndex:e,table:r}=t;return!(typeof r!="string"||r.length===0||typeof e!="object"||e===null||!Array.isArray(e.fields)||e.fields.length===0)},Se=(t,e,r)=>{const n=B(t),s=B(e),i=r.map(c=>B(c)).join(", ");return`CREATE INDEX IF NOT EXISTS ${s} ON ${n} (${i});`},Te=t=>{const e=P(19),{fields:r,indexName:n,table:s,testId:i}=t,c=H(),[v,h]=k(!1);let u;e[0]!==r||e[1]!==n||e[2]!==s?(u=()=>{const x="navigator"in globalThis?globalThis.navigator.clipboard:void 0;if(x===void 0)return;const y=Se(s,n,r);E(x.writeText(y)),h(!0)},e[0]=r,e[1]=n,e[2]=s,e[3]=u):u=e[3];const I=u;if(v){const x=`${i}-applied`;let y;e[4]!==c?(y=c("CREATE INDEX SQL copied to clipboard."),e[4]=c,e[5]=y):y=e[5];let w;return e[6]!==x||e[7]!==y?(w=g("span",{className:"text-xs text-muted-foreground","data-testid":x,children:y}),e[6]=x,e[7]=y,e[8]=w):w=e[8],w}let d;e[9]!==c?(d=c("Apply?"),e[9]=c,e[10]=d):d=e[10];let f;e[11]!==c||e[12]!==s?(f=c("Apply index on {table}",{table:s}),e[11]=c,e[12]=s,e[13]=f):f=e[13];let b;return e[14]!==I||e[15]!==d||e[16]!==f||e[17]!==i?(b=g(he,{confirmLabel:d,onConfirm:I,testId:i,children:f}),e[14]=I,e[15]=d,e[16]=f,e[17]=i,e[18]=b):b=e[18],b},ge=(t,e)=>{const r=new Map;for(const n of e){const s=`${n.table} ${n.index}`;r.set(s,(r.get(s)??0)+n.reads)}return t.map(n=>({index:n.index,reads:r.get(`${n.table} ${n.index}`)??0,table:n.table}))},Ie=t=>{const e=new Map;for(const r of t)for(const n of r.scannedTables??[])e.set(n.table,(e.get(n.table)??0)+n.scans);return[...e].map(([r,n])=>({scans:n,table:r}))},V=(t,e)=>e.map(r=>({index:r.name,table:t})),we=ye.filter(t=>t!==xe),Ae=t=>{const e=ge(t.declaredIndexes??[],t.indexHits??[]),r=Ie(t.functions??[]),n=t.shardTraffic??[],s=t.analyticsMetrics,i=s&&s.indexHits.length>0?s.indexHits:e,c=s&&s.tableScans.length>0?s.tableScans:r,v=s&&s.shardTraffic.length>0?s.shardTraffic:n,h=be({indexHits:i,schema:{tables:[]},shardTraffic:v,tableScans:c},{lints:we,source:"runtime"}),u=t.suppressHotScanTables;return(u===void 0?h:h.filter(d=>!(d.metadata.kind==="hot_scan"&&typeof d.metadata.table=="string"&&u.has(d.metadata.table)))).map(d=>U(d))},Ee=q(A.listTables),$e=q(A.listTableIndexes),Ne=q(A.listTablesIndexes),R=t=>`${(t*100).toFixed(1)}%`,X=t=>`${(t/1e3).toFixed(2)}s`,Le=t=>{if(t.length<=1)return t[0]??"";const e=t[t.length-1]??"";return`${t.slice(0,-1).join(", ")} and ${e}`},Be=(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],z=(t,e)=>({"high-error-rate":t("{rate} of calls failed.",{rate:R(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:R(e.value)}),"low-cache-hit-rate":t("{rate} hit rate over recent traffic.",{rate:R(e.value)}),"missing-index":t("Slowest call took {duration} — it full-scanned {tables} with no index.",{duration:X(e.value),tables:Le(e.tables??[])}),"slow-function":t("Slowest call took {duration}.",{duration:X(e.value)}),"storage-headroom":t("{size} of the 10 GiB per-shard ceiling — plan a .shardBy() migration while it still has runway.",{size:ue(e.value)})})[e.kind],Re=t=>{const e=P(10),{onJump:r,table:n}=t,s=H();let i;e[0]!==r||e[1]!==n?(i=()=>{r(n)},e[0]=r,e[1]=n,e[2]=i):i=e[2];const c=i,v=`in-add-index-${n}`;let h;e[3]!==s||e[4]!==n?(h=s("Add index on {table}",{table:n}),e[3]=s,e[4]=n,e[5]=h):h=e[5];let u;return e[6]!==c||e[7]!==v||e[8]!==h?(u=g(le,{"data-testid":v,onClick:c,size:"sm",type:"button",variant:"outline",children:h}),e[6]=c,e[7]=v,e[8]=h,e[9]=u):u=e[9],u},We=({initialShardKey:t,loadShardTraffic:e})=>{const r=se(),n=re(),s=H(),{queryShardKey:i,setShardKey:c,shardKey:v}=de(t),[h,u]=k(null),[I,d]=k(null),f=ae(""),b=N(A.getMetrics,{},{live:!0,shardKey:i}),x=N(A.getFunctionStats,{},{live:!0,shardKey:i}),y=N(A.getAdvisories,{},{live:!0,shardKey:i}),w=b.data??null,D=x.data?.functions??null,K=y.data?.advisories??null,J=b.data?.indexHits??null,M=b.error!==null&&x.error!==null?b.error:null,G=e??(a=>r.shardTraffic(a)),W=async(a,p)=>{const S=a[0];if(S===void 0||S===""){f.current===p&&d(null);return}try{const o=await G(S);if(f.current!==p)return;const l=new Map;for(const m of o.shards)l.has(m.shardKey)||l.set(m.shardKey,{requests:m.requests,shardKey:m.shardKey});d([...l.values()])}catch{f.current===p&&d(null)}},Y=async(a,p)=>{const S=await Promise.allSettled(a.map(async l=>[l,await r.query($e,{table:l},L(p))])),o=[];for(const l of S)if(l.status==="fulfilled"){const[m,T]=l.value;o.push(...V(m,T.indexes))}return o},C=O(async a=>{f.current=a;let p=[];try{const S=await r.query(Ee,{},L(a));if(f.current!==a)return;fe(a),p=S.map(l=>l.name);let o=[];if(p.length>0)try{const l=await r.query(Ne,{tables:p},L(a));if(f.current!==a)return;for(const[m,T]of Object.entries(l.indexesByTable))o.push(...V(m,T))}catch{if(o=await Y(p,a),f.current!==a)return}u(o)}catch{f.current===a&&u(null)}await W(p,a)});Q(()=>{E(C(i))},[i]);const Z=O(()=>{b.refetch(),x.refetch(),y.refetch(),E(C(i))});Q(()=>{const a=()=>{document.visibilityState==="visible"&&Z()};return document.addEventListener("visibilitychange",a),()=>{document.removeEventListener("visibilitychange",a)}},[]);const F=oe(a=>{E(n({search:{table:a},to:"/schema"}))},[n]),$=pe(w,D),_=new Set($.filter(a=>a.kind==="missing-index").flatMap(a=>a.tables??[])),j=Ae({declaredIndexes:h??[],functions:D,indexHits:J,shardTraffic:I,suppressHotScanTables:_}),ee=ie(()=>{const a=$.map(o=>{const l=o.kind==="missing-index"?o.tables??[]:[];return{action:l.length>0?l.map(m=>g(Re,{onJump:F,table:m},m)):void 0,description:o.message===void 0?z(s,o):`${z(s,o)} — ${o.message}`,entity:o.fn,issueType:Be(s,o),key:`${o.kind}:${o.fn??""}`,level:o.severity}}),p=new Set(["unindexed_foreign_key","unindexed_relation_target"]);return[...(K??[]).map(o=>{const l=U(o);if(p.has(o.name)&&ve(o.metadata)){const{table:m,suggestedIndex:T}=o.metadata,ne=`in-apply-index-${m}-${T.name}`;return{...l,action:g(Te,{fields:T.fields,indexName:T.name,table:m,testId:ne})}}return l}),...j,...a]},[K,$,F,j,s]),te=g(ce,{onChange:c,testId:"in-shard-input",value:v});return g(me,{error:M,errorSource:M===null?void 0:b.errorSource,rows:ee,testId:"lunora-insights",toolbar:te})};export{We as InsightsPanel};
1
+ import{c as P}from"react/compiler-runtime";import{useLunora as se}from"@lunora/react";import{useNavigate as re}from"@tanstack/react-router";import{useState as k,useRef as ae,useEffectEvent as O,useEffect as Q,useCallback as oe,useMemo as ie}from"react";import{ShardInput as ce}from"../packem_shared/ShardInput-C6mjgAh4.mjs";import{B as le}from"../packem_shared/button-q0UYSmrn.mjs";import{u as N}from"../packem_shared/use-admin-query-C7JRlFIE.mjs";import{u as de}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as H}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as A}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{f as E,d as L,c as q,l as ue}from"../packem_shared/internal-CwaF9YNk.mjs";import{r as fe}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{a as U,A as me}from"../packem_shared/advisor-view-DoSv436g.mjs";import{ConfirmButton as he}from"../packem_shared/ConfirmButton-DU4p72Er.mjs";import{q as B}from"../packem_shared/quote-identifier-CGiYFBvY.mjs";import{jsx as g}from"react/jsx-runtime";import{deriveInsights as pe}from"../packem_shared/DEFAULT_INSIGHT_THRESHOLDS-D5YMT0gM.mjs";import{runAdvisor as be,RUNTIME_LINTS as ye,constraintValidator as xe}from"@lunora/advisor";const ve=t=>{const{suggestedIndex:e,table:r}=t;return!(typeof r!="string"||r.length===0||typeof e!="object"||e===null||!Array.isArray(e.fields)||e.fields.length===0)},Se=(t,e,r)=>{const n=B(t),s=B(e),i=r.map(c=>B(c)).join(", ");return`CREATE INDEX IF NOT EXISTS ${s} ON ${n} (${i});`},Te=t=>{const e=P(19),{fields:r,indexName:n,table:s,testId:i}=t,c=H(),[v,h]=k(!1);let u;e[0]!==r||e[1]!==n||e[2]!==s?(u=()=>{const x="navigator"in globalThis?globalThis.navigator.clipboard:void 0;if(x===void 0)return;const y=Se(s,n,r);E(x.writeText(y)),h(!0)},e[0]=r,e[1]=n,e[2]=s,e[3]=u):u=e[3];const I=u;if(v){const x=`${i}-applied`;let y;e[4]!==c?(y=c("CREATE INDEX SQL copied to clipboard."),e[4]=c,e[5]=y):y=e[5];let w;return e[6]!==x||e[7]!==y?(w=g("span",{className:"text-xs text-muted-foreground","data-testid":x,children:y}),e[6]=x,e[7]=y,e[8]=w):w=e[8],w}let d;e[9]!==c?(d=c("Apply?"),e[9]=c,e[10]=d):d=e[10];let f;e[11]!==c||e[12]!==s?(f=c("Apply index on {table}",{table:s}),e[11]=c,e[12]=s,e[13]=f):f=e[13];let b;return e[14]!==I||e[15]!==d||e[16]!==f||e[17]!==i?(b=g(he,{confirmLabel:d,onConfirm:I,testId:i,children:f}),e[14]=I,e[15]=d,e[16]=f,e[17]=i,e[18]=b):b=e[18],b},ge=(t,e)=>{const r=new Map;for(const n of e){const s=`${n.table} ${n.index}`;r.set(s,(r.get(s)??0)+n.reads)}return t.map(n=>({index:n.index,reads:r.get(`${n.table} ${n.index}`)??0,table:n.table}))},Ie=t=>{const e=new Map;for(const r of t)for(const n of r.scannedTables??[])e.set(n.table,(e.get(n.table)??0)+n.scans);return[...e].map(([r,n])=>({scans:n,table:r}))},V=(t,e)=>e.map(r=>({index:r.name,table:t})),we=ye.filter(t=>t!==xe),Ae=t=>{const e=ge(t.declaredIndexes??[],t.indexHits??[]),r=Ie(t.functions??[]),n=t.shardTraffic??[],s=t.analyticsMetrics,i=s&&s.indexHits.length>0?s.indexHits:e,c=s&&s.tableScans.length>0?s.tableScans:r,v=s&&s.shardTraffic.length>0?s.shardTraffic:n,h=be({indexHits:i,schema:{tables:[]},shardTraffic:v,tableScans:c},{lints:we,source:"runtime"}),u=t.suppressHotScanTables;return(u===void 0?h:h.filter(d=>!(d.metadata.kind==="hot_scan"&&typeof d.metadata.table=="string"&&u.has(d.metadata.table)))).map(d=>U(d))},Ee=q(A.listTables),$e=q(A.listTableIndexes),Ne=q(A.listTablesIndexes),R=t=>`${(t*100).toFixed(1)}%`,X=t=>`${(t/1e3).toFixed(2)}s`,Le=t=>{if(t.length<=1)return t[0]??"";const e=t[t.length-1]??"";return`${t.slice(0,-1).join(", ")} and ${e}`},Be=(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],z=(t,e)=>({"high-error-rate":t("{rate} of calls failed.",{rate:R(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:R(e.value)}),"low-cache-hit-rate":t("{rate} hit rate over recent traffic.",{rate:R(e.value)}),"missing-index":t("Slowest call took {duration} — it full-scanned {tables} with no index.",{duration:X(e.value),tables:Le(e.tables??[])}),"slow-function":t("Slowest call took {duration}.",{duration:X(e.value)}),"storage-headroom":t("{size} of the 10 GiB per-shard ceiling — plan a .shardBy() migration while it still has runway.",{size:ue(e.value)})})[e.kind],Re=t=>{const e=P(10),{onJump:r,table:n}=t,s=H();let i;e[0]!==r||e[1]!==n?(i=()=>{r(n)},e[0]=r,e[1]=n,e[2]=i):i=e[2];const c=i,v=`in-add-index-${n}`;let h;e[3]!==s||e[4]!==n?(h=s("Add index on {table}",{table:n}),e[3]=s,e[4]=n,e[5]=h):h=e[5];let u;return e[6]!==c||e[7]!==v||e[8]!==h?(u=g(le,{"data-testid":v,onClick:c,size:"sm",type:"button",variant:"outline",children:h}),e[6]=c,e[7]=v,e[8]=h,e[9]=u):u=e[9],u},We=({initialShardKey:t,loadShardTraffic:e})=>{const r=se(),n=re(),s=H(),{queryShardKey:i,setShardKey:c,shardKey:v}=de(t),[h,u]=k(null),[I,d]=k(null),f=ae(""),b=N(A.getMetrics,{},{live:!0,shardKey:i}),x=N(A.getFunctionStats,{},{live:!0,shardKey:i}),y=N(A.getAdvisories,{},{live:!0,shardKey:i}),w=b.data??null,D=x.data?.functions??null,K=y.data?.advisories??null,J=b.data?.indexHits??null,M=b.error!==null&&x.error!==null?b.error:null,G=e??(a=>r.shardTraffic(a)),W=async(a,p)=>{const S=a[0];if(S===void 0||S===""){f.current===p&&d(null);return}try{const o=await G(S);if(f.current!==p)return;const l=new Map;for(const m of o.shards)l.has(m.shardKey)||l.set(m.shardKey,{requests:m.requests,shardKey:m.shardKey});d([...l.values()])}catch{f.current===p&&d(null)}},Y=async(a,p)=>{const S=await Promise.allSettled(a.map(async l=>[l,await r.query($e,{table:l},L(p))])),o=[];for(const l of S)if(l.status==="fulfilled"){const[m,T]=l.value;o.push(...V(m,T.indexes))}return o},C=O(async a=>{f.current=a;let p=[];try{const S=await r.query(Ee,{},L(a));if(f.current!==a)return;fe(a),p=S.map(l=>l.name);let o=[];if(p.length>0)try{const l=await r.query(Ne,{tables:p},L(a));if(f.current!==a)return;for(const[m,T]of Object.entries(l.indexesByTable))o.push(...V(m,T))}catch{if(o=await Y(p,a),f.current!==a)return}u(o)}catch{f.current===a&&u(null)}await W(p,a)});Q(()=>{E(C(i))},[i]);const Z=O(()=>{b.refetch(),x.refetch(),y.refetch(),E(C(i))});Q(()=>{const a=()=>{document.visibilityState==="visible"&&Z()};return document.addEventListener("visibilitychange",a),()=>{document.removeEventListener("visibilitychange",a)}},[]);const F=oe(a=>{E(n({search:{table:a},to:"/schema"}))},[n]),$=pe(w,D),_=new Set($.filter(a=>a.kind==="missing-index").flatMap(a=>a.tables??[])),j=Ae({declaredIndexes:h??[],functions:D,indexHits:J,shardTraffic:I,suppressHotScanTables:_}),ee=ie(()=>{const a=$.map(o=>{const l=o.kind==="missing-index"?o.tables??[]:[];return{action:l.length>0?l.map(m=>g(Re,{onJump:F,table:m},m)):void 0,description:o.message===void 0?z(s,o):`${z(s,o)} — ${o.message}`,entity:o.fn,issueType:Be(s,o),key:`${o.kind}:${o.fn??""}`,level:o.severity}}),p=new Set(["unindexed_foreign_key","unindexed_relation_target"]);return[...(K??[]).map(o=>{const l=U(o);if(p.has(o.name)&&ve(o.metadata)){const{table:m,suggestedIndex:T}=o.metadata,ne=`in-apply-index-${m}-${T.name}`;return{...l,action:g(Te,{fields:T.fields,indexName:T.name,table:m,testId:ne})}}return l}),...j,...a]},[K,$,F,j,s]),te=g(ce,{onChange:c,testId:"in-shard-input",value:v});return g(me,{error:M,errorSource:M===null?void 0:b.errorSource,rows:ee,testId:"lunora-insights",toolbar:te})};export{We 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-SBxKyBug.mjs";import{E as Se}from"../packem_shared/error-alert-CczbAfst.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-Cbj2GuHu.mjs";import{u as Te}from"../packem_shared/use-open-trace-B5LJ96_0.mjs";import{u as Ie}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as Q}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as oe}from"../packem_shared/ADMIN_FUNCTIONS-B6z7VLYt.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{useLunora as Pe}from"@lunora/react";import{B as Ee}from"../packem_shared/button-q0UYSmrn.mjs";import{I as D}from"../packem_shared/input-CXhxesPC.mjs";import{T as Oe,a as _e,b as ge,c as B,d as Fe,e as V}from"../packem_shared/table-D0SBiDu-.mjs";import ae from"../packem_shared/useDebounced-DVeQ5-oW.mjs";import{a as pe}from"../packem_shared/cf-links-CBJ5SywP.mjs";import{f as ne,m as qe,b as ie}from"../packem_shared/internal-CwaF9YNk.mjs";import{a as Ae,L as Me}from"../packem_shared/log-line-Dzg4YZ-K.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-BuJdUZFU.mjs";import{ShardInput as Ke}from"../packem_shared/ShardInput-C6mjgAh4.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=Pe(),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(Oe,{"data-testid":"lg-archive-table",children:[r(_e,{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(Fe,{children:u.map((g,C)=>r(Qe,{row:g},`${String(g.ts)}-${String(C)}`))})]})}),c!==void 0&&r("div",{children:r(Ee,{"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-SBxKyBug.mjs";import{E as Se}from"../packem_shared/error-alert-CWs6gA3I.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-C7JRlFIE.mjs";import{u as Te}from"../packem_shared/use-open-trace-B5LJ96_0.mjs";import{u as Ie}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as Q}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as oe}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.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{useLunora as Pe}from"@lunora/react";import{B as Ee}from"../packem_shared/button-q0UYSmrn.mjs";import{I as D}from"../packem_shared/input-CXhxesPC.mjs";import{T as Oe,a as _e,b as ge,c as B,d as Fe,e as V}from"../packem_shared/table-D0SBiDu-.mjs";import ae from"../packem_shared/useDebounced-DVeQ5-oW.mjs";import{a as pe}from"../packem_shared/cf-links-CBJ5SywP.mjs";import{f as ne,m as qe,b as ie}from"../packem_shared/internal-CwaF9YNk.mjs";import{a as Ae,L as Me}from"../packem_shared/log-line-Dzg4YZ-K.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-BuJdUZFU.mjs";import{ShardInput as Ke}from"../packem_shared/ShardInput-C6mjgAh4.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=Pe(),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(Oe,{"data-testid":"lg-archive-table",children:[r(_e,{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(Fe,{children:u.map((g,C)=>r(Qe,{row:g},`${String(g.ts)}-${String(C)}`))})]})}),c!==void 0&&r("div",{children:r(Ee,{"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,2 +1,2 @@
1
- import{E as ie}from"../packem_shared/error-alert-CczbAfst.mjs";import{B as se}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as v}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-A1Yg5ORA.mjs";import{c as ae,d as Y,b as Z,f as ee,g as he,i as te}from"../packem_shared/internal-CwaF9YNk.mjs";import{c as pe}from"react/compiler-runtime";import{useLunora as fe}from"@lunora/react";import{useState as O}from"react";import{u as be}from"../packem_shared/use-admin-query-Cbj2GuHu.mjs";import{useAutoRefresh as xe}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-DuULO4XM.mjs";import{ADMIN_FUNCTIONS as X}from"../packem_shared/ADMIN_FUNCTIONS-B6z7VLYt.mjs";function ge({className:r,orientation:e="horizontal",...s}){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),...s})}const ve=/https?:\/\/[^\s"'<>)]+/i,re=r=>r===void 0?void 0:ve.exec(r)?.[0],N=r=>r===void 0?"":Array.isArray(r)?r.join(", "):r,Ne=r=>{if(r!==void 0)return re(r.html)??re(r.text)},we=(r,e)=>{const s=e.trim().toLowerCase();return s===""?r:r.filter(o=>`${o.subject} ${N(o.to)} ${N(o.cc)}`.toLowerCase().includes(s))},ye=(r,e)=>{if(r.length!==0)return r.find(s=>s.id===e)??r[0]},Ce=ae(X.clearCapturedMail),Se=ae(X.sendTestMail),Te=r=>{const e=pe(38),{limit:s}=r,o=fe();let p;e[0]!==s?(p={limit:s},e[0]=s,e[1]=p):p=e[1];const{data:R,error:w,errorSource:y,isLoading:x,refetch:l}=be(X.getCapturedMail,p),[C,f]=O(null),[B,S]=O(null),[g,i]=O("html"),[c,D]=O(""),b=R?.entries??[],a=w??C,h=w===null?C:y;let T;e[2]!==o||e[3]!==l?(T=async()=>{f(null);try{await o.query(Ce,{},Y("")),S(null),l()}catch(m){f(Z(m))}},e[2]=o,e[3]=l,e[4]=T):T=e[4];const H=T;let k;e[5]!==o||e[6]!==l?(k=async()=>{f(null);try{await o.query(Se,{},Y("")),l()}catch(m){f(Z(m))}},e[5]=o,e[6]=l,e[7]=k):k=e[7];const q=k;let L;e[8]!==l?(L=()=>{l()},e[8]=l,e[9]=L):L=e[9],xe(L,!0);let A;e[10]!==H?(A=()=>{ee(H())},e[10]=H,e[11]=A):A=e[11];const U=A;let E;e[12]!==q?(E=()=>{ee(q())},e[12]=q,e[13]=E):E=e[13];const W=E;let _;e[14]===Symbol.for("react.memo_cache_sentinel")?(_=m=>{D(m.currentTarget.value)},e[14]=_):_=e[14];const K=_;let M;e[15]===Symbol.for("react.memo_cache_sentinel")?(M=m=>{const{id:u}=m.currentTarget.dataset;u!==void 0&&S(u)},e[15]=M):M=e[15];const Q=M;let j;e[16]===Symbol.for("react.memo_cache_sentinel")?(j=m=>{const u=m.currentTarget.dataset.tab;(u==="headers"||u==="html"||u==="text")&&i(u)},e[16]=j):j=e[16];const V=j,I=we(b,c),$=ye(I,B),d=Ne($);let z;e[17]!==d?(z=()=>{d!==void 0&&he(d)},e[17]=d,e[18]=z):z=e[18];const G=z;let F;e[19]!==d?(F=()=>{d!==void 0&&"window"in globalThis&&globalThis.window.open(d,"_blank","noopener")},e[19]=d,e[20]=F):F=e[20];const J=F;let P;return e[21]!==b||e[22]!==a||e[23]!==h||e[24]!==c||e[25]!==x||e[26]!==d||e[27]!==U||e[28]!==G||e[29]!==K||e[30]!==J||e[31]!==Q||e[32]!==V||e[33]!==W||e[34]!==$||e[35]!==g||e[36]!==I?(P={entries:b,error:a,errorSource:h,filter:c,isLoading:x,link:d,onClear:U,onCopyLink:G,onFilterChange:K,onOpenLink:J,onSelectMessage:Q,onSelectTab:V,onSendTest:W,selected:$,tab:g,visible:I},e[21]=b,e[22]=a,e[23]=h,e[24]=c,e[25]=x,e[26]=d,e[27]=U,e[28]=G,e[29]=K,e[30]=J,e[31]=Q,e[32]=V,e[33]=W,e[34]=$,e[35]=g,e[36]=I,e[37]=P):P=e[37],P},ke=`<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src data:; style-src 'unsafe-inline'; font-src data:">`,Le=r=>`${ke}${r}`,We=({limit:r=100})=>{const e=ue(),{entries:s,error:o,errorSource:p,filter:R,isLoading:w,link:y,onClear:x,onCopyLink:l,onFilterChange:C,onOpenLink:f,onSelectMessage:B,onSelectTab:S,onSendTest:g,selected:i,tab:c,visible:D}=Te({limit:r}),b=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(v,{"data-testid":"mail-send-test",onClick:g,size:"sm",type:"button",variant:"outline",children:e("Send test")}),t(v,{"data-testid":"mail-clear",disabled:s.length===0,onClick:x,size:"sm",type:"button",variant:"outline",children:e("Clear inbox")}),s.length>0&&t(se,{className:"ml-auto","data-testid":"mail-count",variant:"secondary",children:e("{count} messages",{count:s.length})})]}),o!==null&&t(ie,{error:p,testId:"mail-error"}),o===null&&!w&&s.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.")}),s.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:C,placeholder:e("Filter messages"),type:"search",value:R}),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:D.map(a=>{const h=a.id===i?.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 ${h?"bg-muted":""}`,"data-active":h,"data-id":a.id,"data-testid":"mail-list-item",onClick:B,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:N(a.to)}),t("span",{className:"text-xs text-muted-foreground tabular-nums",children:te(a.capturedAt,"—")})]})},a.id)})})})]}),i!==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:i.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:i.from??"—"}),t("dt",{children:e("To")}),t("dd",{className:"truncate font-mono",children:N(i.to)}),i.cc!==void 0&&i.cc.length>0&&n(me,{children:[t("dt",{children:e("Cc")}),t("dd",{className:"truncate font-mono",children:N(i.cc)})]}),t("dt",{children:e("Sent")}),t("dd",{className:"tabular-nums",children:te(i.capturedAt,"—")})]})]}),n("div",{className:"flex flex-wrap items-center gap-2","data-testid":"mail-actions",children:[t(v,{"data-testid":"mail-copy-link",disabled:y===void 0,onClick:l,size:"sm",type:"button",variant:"outline",children:e("Copy link")}),t(v,{"data-testid":"mail-open-link",disabled:y===void 0,onClick:f,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(v,{"aria-selected":c===a,"data-tab":a,"data-testid":`mail-tab-${a}`,onClick:S,role:"tab",size:"sm",type:"button",variant:c===a?"secondary":"ghost",children:b(a)},a))}),n("div",{className:"min-h-[12rem]",children:[c==="html"&&(i.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:Le(i.html),title:e("Email preview")})),c==="text"&&(i.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:i.text})),c==="headers"&&(i.headers===void 0||Object.keys(i.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(i.headers).map(([a,h])=>`${a}: ${h}`).join(`
1
+ import{E as ie}from"../packem_shared/error-alert-CWs6gA3I.mjs";import{B as se}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as v}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-A1Yg5ORA.mjs";import{c as ae,d as Y,b as Z,f as ee,g as he,i as te}from"../packem_shared/internal-CwaF9YNk.mjs";import{c as pe}from"react/compiler-runtime";import{useLunora as fe}from"@lunora/react";import{useState as O}from"react";import{u as be}from"../packem_shared/use-admin-query-C7JRlFIE.mjs";import{useAutoRefresh as xe}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-DuULO4XM.mjs";import{ADMIN_FUNCTIONS as X}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";function ge({className:r,orientation:e="horizontal",...s}){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),...s})}const ve=/https?:\/\/[^\s"'<>)]+/i,re=r=>r===void 0?void 0:ve.exec(r)?.[0],N=r=>r===void 0?"":Array.isArray(r)?r.join(", "):r,Ne=r=>{if(r!==void 0)return re(r.html)??re(r.text)},we=(r,e)=>{const s=e.trim().toLowerCase();return s===""?r:r.filter(o=>`${o.subject} ${N(o.to)} ${N(o.cc)}`.toLowerCase().includes(s))},ye=(r,e)=>{if(r.length!==0)return r.find(s=>s.id===e)??r[0]},Ce=ae(X.clearCapturedMail),Se=ae(X.sendTestMail),Te=r=>{const e=pe(38),{limit:s}=r,o=fe();let p;e[0]!==s?(p={limit:s},e[0]=s,e[1]=p):p=e[1];const{data:R,error:w,errorSource:y,isLoading:x,refetch:l}=be(X.getCapturedMail,p),[C,f]=O(null),[B,S]=O(null),[g,i]=O("html"),[c,D]=O(""),b=R?.entries??[],a=w??C,h=w===null?C:y;let T;e[2]!==o||e[3]!==l?(T=async()=>{f(null);try{await o.query(Ce,{},Y("")),S(null),l()}catch(m){f(Z(m))}},e[2]=o,e[3]=l,e[4]=T):T=e[4];const H=T;let k;e[5]!==o||e[6]!==l?(k=async()=>{f(null);try{await o.query(Se,{},Y("")),l()}catch(m){f(Z(m))}},e[5]=o,e[6]=l,e[7]=k):k=e[7];const q=k;let L;e[8]!==l?(L=()=>{l()},e[8]=l,e[9]=L):L=e[9],xe(L,!0);let A;e[10]!==H?(A=()=>{ee(H())},e[10]=H,e[11]=A):A=e[11];const U=A;let E;e[12]!==q?(E=()=>{ee(q())},e[12]=q,e[13]=E):E=e[13];const W=E;let _;e[14]===Symbol.for("react.memo_cache_sentinel")?(_=m=>{D(m.currentTarget.value)},e[14]=_):_=e[14];const K=_;let M;e[15]===Symbol.for("react.memo_cache_sentinel")?(M=m=>{const{id:u}=m.currentTarget.dataset;u!==void 0&&S(u)},e[15]=M):M=e[15];const Q=M;let j;e[16]===Symbol.for("react.memo_cache_sentinel")?(j=m=>{const u=m.currentTarget.dataset.tab;(u==="headers"||u==="html"||u==="text")&&i(u)},e[16]=j):j=e[16];const V=j,I=we(b,c),$=ye(I,B),d=Ne($);let z;e[17]!==d?(z=()=>{d!==void 0&&he(d)},e[17]=d,e[18]=z):z=e[18];const G=z;let F;e[19]!==d?(F=()=>{d!==void 0&&"window"in globalThis&&globalThis.window.open(d,"_blank","noopener")},e[19]=d,e[20]=F):F=e[20];const J=F;let P;return e[21]!==b||e[22]!==a||e[23]!==h||e[24]!==c||e[25]!==x||e[26]!==d||e[27]!==U||e[28]!==G||e[29]!==K||e[30]!==J||e[31]!==Q||e[32]!==V||e[33]!==W||e[34]!==$||e[35]!==g||e[36]!==I?(P={entries:b,error:a,errorSource:h,filter:c,isLoading:x,link:d,onClear:U,onCopyLink:G,onFilterChange:K,onOpenLink:J,onSelectMessage:Q,onSelectTab:V,onSendTest:W,selected:$,tab:g,visible:I},e[21]=b,e[22]=a,e[23]=h,e[24]=c,e[25]=x,e[26]=d,e[27]=U,e[28]=G,e[29]=K,e[30]=J,e[31]=Q,e[32]=V,e[33]=W,e[34]=$,e[35]=g,e[36]=I,e[37]=P):P=e[37],P},ke=`<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src data:; style-src 'unsafe-inline'; font-src data:">`,Le=r=>`${ke}${r}`,We=({limit:r=100})=>{const e=ue(),{entries:s,error:o,errorSource:p,filter:R,isLoading:w,link:y,onClear:x,onCopyLink:l,onFilterChange:C,onOpenLink:f,onSelectMessage:B,onSelectTab:S,onSendTest:g,selected:i,tab:c,visible:D}=Te({limit:r}),b=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(v,{"data-testid":"mail-send-test",onClick:g,size:"sm",type:"button",variant:"outline",children:e("Send test")}),t(v,{"data-testid":"mail-clear",disabled:s.length===0,onClick:x,size:"sm",type:"button",variant:"outline",children:e("Clear inbox")}),s.length>0&&t(se,{className:"ml-auto","data-testid":"mail-count",variant:"secondary",children:e("{count} messages",{count:s.length})})]}),o!==null&&t(ie,{error:p,testId:"mail-error"}),o===null&&!w&&s.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.")}),s.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:C,placeholder:e("Filter messages"),type:"search",value:R}),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:D.map(a=>{const h=a.id===i?.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 ${h?"bg-muted":""}`,"data-active":h,"data-id":a.id,"data-testid":"mail-list-item",onClick:B,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:N(a.to)}),t("span",{className:"text-xs text-muted-foreground tabular-nums",children:te(a.capturedAt,"—")})]})},a.id)})})})]}),i!==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:i.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:i.from??"—"}),t("dt",{children:e("To")}),t("dd",{className:"truncate font-mono",children:N(i.to)}),i.cc!==void 0&&i.cc.length>0&&n(me,{children:[t("dt",{children:e("Cc")}),t("dd",{className:"truncate font-mono",children:N(i.cc)})]}),t("dt",{children:e("Sent")}),t("dd",{className:"tabular-nums",children:te(i.capturedAt,"—")})]})]}),n("div",{className:"flex flex-wrap items-center gap-2","data-testid":"mail-actions",children:[t(v,{"data-testid":"mail-copy-link",disabled:y===void 0,onClick:l,size:"sm",type:"button",variant:"outline",children:e("Copy link")}),t(v,{"data-testid":"mail-open-link",disabled:y===void 0,onClick:f,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(v,{"aria-selected":c===a,"data-tab":a,"data-testid":`mail-tab-${a}`,onClick:S,role:"tab",size:"sm",type:"button",variant:c===a?"secondary":"ghost",children:b(a)},a))}),n("div",{className:"min-h-[12rem]",children:[c==="html"&&(i.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:Le(i.html),title:e("Email preview")})),c==="text"&&(i.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:i.text})),c==="headers"&&(i.headers===void 0||Object.keys(i.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(i.headers).map(([a,h])=>`${a}: ${h}`).join(`
2
2
  `)}))]})]})]})]})};export{We as MailPanel};