@lunora/studio 1.0.0-alpha.322 → 1.0.0-alpha.324

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 (99) hide show
  1. package/dist/index.mjs +1 -1
  2. package/dist/packem_chunks/AdvisorHealthPanel.mjs +1 -1
  3. package/dist/packem_chunks/AuditPanel.mjs +1 -1
  4. package/dist/packem_chunks/FunctionStatsPanel.mjs +1 -1
  5. package/dist/packem_chunks/InsightsPanel.mjs +1 -1
  6. package/dist/packem_chunks/LogsPanel.mjs +1 -1
  7. package/dist/packem_chunks/MailPanel.mjs +1 -1
  8. package/dist/packem_chunks/NotificationsPanel.mjs +1 -1
  9. package/dist/packem_chunks/SecurityAdvisorPanel.mjs +1 -1
  10. package/dist/packem_chunks/SettingsPanel.mjs +1 -1
  11. package/dist/packem_chunks/agents-panel.mjs +1 -1
  12. package/dist/packem_chunks/ai-usage-panel.mjs +1 -1
  13. package/dist/packem_chunks/auth-audit-panel.mjs +1 -1
  14. package/dist/packem_chunks/evals-panel.mjs +1 -1
  15. package/dist/packem_chunks/fanout-panel.mjs +1 -1
  16. package/dist/packem_chunks/flags-panel.mjs +1 -1
  17. package/dist/packem_chunks/migrations-route.mjs +1 -1
  18. package/dist/packem_chunks/payments-panel.mjs +1 -1
  19. package/dist/packem_chunks/permissions-panel.mjs +1 -1
  20. package/dist/packem_chunks/privacy-requests-panel.mjs +1 -1
  21. package/dist/packem_chunks/queues-panel.mjs +1 -1
  22. package/dist/packem_chunks/reactors-panel.mjs +1 -1
  23. package/dist/packem_chunks/rls-panel.mjs +1 -1
  24. package/dist/packem_chunks/storage-rules-panel.mjs +1 -1
  25. package/dist/packem_chunks/subscriptions-panel.mjs +1 -1
  26. package/dist/packem_chunks/traces-panel.mjs +1 -1
  27. package/dist/packem_shared/{MigrationsPanel-CkVIwAbK.mjs → MigrationsPanel-C2kb3oL-.mjs} +1 -1
  28. package/dist/packem_shared/{advisor-view-DzI2RQhY.mjs → advisor-view-y4cW5JcX.mjs} +1 -1
  29. package/dist/packem_shared/error-alert-DAsOWnCL.mjs +1 -0
  30. package/dist/standalone/{chunk-CKZGSVRG.js → chunk-22TUDRBR.js} +1 -1
  31. package/dist/standalone/{chunk-DBO2LRU7.js → chunk-2H5IXFGR.js} +1 -1
  32. package/dist/standalone/{chunk-MP7FGHRS.js → chunk-2JH7ZYVY.js} +1 -1
  33. package/dist/standalone/{chunk-R2JJKTII.js → chunk-2QLSWJDL.js} +1 -1
  34. package/dist/standalone/{chunk-K55GCMUG.js → chunk-3OHVDOV5.js} +1 -1
  35. package/dist/standalone/chunk-3YH5TM3G.js +1 -0
  36. package/dist/standalone/{chunk-YOJMTBDR.js → chunk-4K6CXILB.js} +1 -1
  37. package/dist/standalone/{chunk-FUS6IIPK.js → chunk-4Y5AFETG.js} +1 -1
  38. package/dist/standalone/{chunk-DWHBAXWL.js → chunk-5WOMOENH.js} +1 -1
  39. package/dist/standalone/{chunk-ZQU6EUUL.js → chunk-6MFVEI7C.js} +1 -1
  40. package/dist/standalone/{chunk-VKR53NLO.js → chunk-6YQ3RTCB.js} +1 -1
  41. package/dist/standalone/{chunk-JWTNX66E.js → chunk-7AF3FZCB.js} +1 -1
  42. package/dist/standalone/{chunk-7IN4NR3Q.js → chunk-7RAYXTNN.js} +1 -1
  43. package/dist/standalone/chunk-BOYS4DOC.js +9 -0
  44. package/dist/standalone/{chunk-ZZHEKODS.js → chunk-CUJGTNYR.js} +1 -1
  45. package/dist/standalone/{chunk-J3BTWJEN.js → chunk-DL6TTBE6.js} +1 -1
  46. package/dist/standalone/{chunk-IPQ5KYVD.js → chunk-DSIY2CMT.js} +1 -1
  47. package/dist/standalone/{chunk-Y5IYXX5E.js → chunk-EEDIMNRC.js} +1 -1
  48. package/dist/standalone/{chunk-L6AEV23T.js → chunk-ESSG4L6C.js} +1 -1
  49. package/dist/standalone/{chunk-2V47JHXK.js → chunk-EXYBVVHU.js} +1 -1
  50. package/dist/standalone/{chunk-EJ6CPRPX.js → chunk-F3UUFO2C.js} +1 -1
  51. package/dist/standalone/{chunk-62EQDW2D.js → chunk-HER5A45F.js} +1 -1
  52. package/dist/standalone/{chunk-YJFMMO37.js → chunk-HM57YJY5.js} +1 -1
  53. package/dist/standalone/{chunk-VOWSZXG7.js → chunk-HOGQLP3J.js} +1 -1
  54. package/dist/standalone/{chunk-UJANVTRM.js → chunk-ICU56FBP.js} +1 -1
  55. package/dist/standalone/{chunk-CY25HYNM.js → chunk-JL6LEVHQ.js} +1 -1
  56. package/dist/standalone/{chunk-3NBWCIGD.js → chunk-JNBWPXNV.js} +1 -1
  57. package/dist/standalone/{chunk-TQVDKDYK.js → chunk-KLTGKTSL.js} +1 -1
  58. package/dist/standalone/{chunk-QN5CM3OH.js → chunk-KU3IXE36.js} +1 -1
  59. package/dist/standalone/{chunk-HNWZRLZK.js → chunk-MB5JGSN6.js} +1 -1
  60. package/dist/standalone/{chunk-RX3SOFXA.js → chunk-MGEACGEE.js} +1 -1
  61. package/dist/standalone/{chunk-EY2JVIQL.js → chunk-MJ3SSK6L.js} +1 -1
  62. package/dist/standalone/{chunk-4WONEGEO.js → chunk-MRJB4FPI.js} +1 -1
  63. package/dist/standalone/{chunk-4DXGIJNQ.js → chunk-MTGFTTXO.js} +1 -1
  64. package/dist/standalone/{chunk-WVWG6LII.js → chunk-N7LJO732.js} +1 -1
  65. package/dist/standalone/{chunk-FT66XZJF.js → chunk-NDGHCEE3.js} +1 -1
  66. package/dist/standalone/{chunk-ZG3DITNB.js → chunk-NW6FNJ4L.js} +1 -1
  67. package/dist/standalone/{chunk-E2AT2DLH.js → chunk-NYHYH5Z5.js} +1 -1
  68. package/dist/standalone/{chunk-VDCF6PXM.js → chunk-OH7DVC7S.js} +1 -1
  69. package/dist/standalone/{chunk-WZXQIVY4.js → chunk-OK35SLOW.js} +1 -1
  70. package/dist/standalone/{chunk-FQJMIMK6.js → chunk-OM3B3V47.js} +1 -1
  71. package/dist/standalone/{chunk-DFSX67L5.js → chunk-OX6JWCPF.js} +1 -1
  72. package/dist/standalone/{chunk-V77ZHGXW.js → chunk-POKVFO6Q.js} +1 -1
  73. package/dist/standalone/{chunk-WJS62UEZ.js → chunk-QSUWAGXH.js} +1 -1
  74. package/dist/standalone/{chunk-DLVUJBD6.js → chunk-QZRKA2E4.js} +1 -1
  75. package/dist/standalone/{chunk-LIRPYTMM.js → chunk-R4ILI46D.js} +1 -1
  76. package/dist/standalone/{chunk-LWWPLBPR.js → chunk-R6PJYMJT.js} +1 -1
  77. package/dist/standalone/{chunk-DLVNLCCI.js → chunk-RBAD4SMG.js} +1 -1
  78. package/dist/standalone/{chunk-JDIDVWA7.js → chunk-RDJCY5PQ.js} +1 -1
  79. package/dist/standalone/{chunk-MRMELMIL.js → chunk-SB4443ME.js} +1 -1
  80. package/dist/standalone/{chunk-EP35WNFQ.js → chunk-SNJ5HRZO.js} +1 -1
  81. package/dist/standalone/{chunk-ZZPTGL45.js → chunk-SQ2LCZBH.js} +1 -1
  82. package/dist/standalone/{chunk-KMQTUDFK.js → chunk-TIQ7OBZJ.js} +1 -1
  83. package/dist/standalone/{chunk-P3JRWNOG.js → chunk-U4YBJ4OW.js} +1 -1
  84. package/dist/standalone/{chunk-67WMIBQI.js → chunk-UDMY3BMT.js} +1 -1
  85. package/dist/standalone/{chunk-D4GOAQJM.js → chunk-VFL7VJWF.js} +1 -1
  86. package/dist/standalone/{chunk-PL7TI67W.js → chunk-VKURTWDH.js} +1 -1
  87. package/dist/standalone/{chunk-4SANMGOJ.js → chunk-W3LXMSGC.js} +1 -1
  88. package/dist/standalone/{chunk-N76L7Y6I.js → chunk-WAX5WY6F.js} +1 -1
  89. package/dist/standalone/{chunk-HO7FAUZP.js → chunk-WFNUMMDF.js} +2 -2
  90. package/dist/standalone/{chunk-I54U4T6W.js → chunk-WJHMDTV2.js} +1 -1
  91. package/dist/standalone/{chunk-N4SDDVZW.js → chunk-WP2AS7SZ.js} +1 -1
  92. package/dist/standalone/{chunk-GKUCH3IT.js → chunk-XTQR2C6N.js} +1 -1
  93. package/dist/standalone/{chunk-6ATAM7XD.js → chunk-Z6THFOLU.js} +1 -1
  94. package/dist/standalone/{chunk-GCAGUIGJ.js → chunk-ZJQI4C3A.js} +1 -1
  95. package/dist/standalone/studio.js +1 -1
  96. package/package.json +5 -5
  97. package/dist/packem_shared/error-alert-DueSEkt-.mjs +0 -1
  98. package/dist/standalone/chunk-JSP7QF52.js +0 -9
  99. package/dist/standalone/chunk-SEZ2IRFD.js +0 -1
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{StudioApp as r}from"./packem_shared/StudioApp-C9ENwcOH.mjs";import{CommandPalette as a,openCommandPalette as f}from"./packem_shared/CommandPalette-D9ZY-qQd.mjs";import{S as m}from"./packem_shared/studio-fK2DTLde.mjs";import{ConfirmButton as l}from"./packem_shared/ConfirmButton-DU4p72Er.mjs";import{default as s}from"./packem_shared/ConnectionBadge-B8Hj5DaE.mjs";import{ErrorBoundary as d}from"./packem_shared/ErrorBoundary-BWNF98VF.mjs";import{ShardInput as P}from"./packem_shared/ShardInput-C6mjgAh4.mjs";import{default as A}from"./packem_chunks/AdvisorHealthPanel.mjs";import{DEFAULT_INSIGHT_THRESHOLDS as I,deriveInsights as T}from"./packem_shared/DEFAULT_INSIGHT_THRESHOLDS-D5YMT0gM.mjs";import{InsightsPanel as g}from"./packem_chunks/InsightsPanel.mjs";import{default as F}from"./packem_chunks/SecurityAdvisorPanel.mjs";import{default as h}from"./packem_shared/ApiDocsPanel-fhDlZGE4.mjs";import{default as C}from"./packem_shared/ApiReferencePanel-nAf8tNRr.mjs";import{default as O}from"./packem_chunks/ApiTab.mjs";import{default as N}from"./packem_shared/OpenRpcReferencePanel-BxEr49D9.mjs";import{DataBrowser as U}from"./packem_shared/DataBrowser-E68QfaST.mjs";import{DataFilters as b,toFilterClauses as v}from"./packem_shared/DataFilters-CYZFt2EK.mjs";import{GlobalDataBrowser as y}from"./packem_shared/GlobalDataBrowser-DhObcZDY.mjs";import{TableEditor as q}from"./packem_chunks/TableEditor.mjs";import{ExportImportPanel as V}from"./packem_chunks/ExportImportPanel.mjs";import{MigrationsPanel as j}from"./packem_shared/MigrationsPanel-CkVIwAbK.mjs";import{PitrPanel as z}from"./packem_chunks/PitrPanel.mjs";import{FunctionRunner as Q}from"./packem_chunks/FunctionRunner.mjs";import{FunctionStatsPanel as Y}from"./packem_chunks/FunctionStatsPanel.mjs";import{DeploymentHealthPanel as $}from"./packem_chunks/DeploymentHealthPanel.mjs";import{H as oe}from"./packem_shared/home-panel-BcE8S2Nn.mjs";import{AuditPanel as te}from"./packem_chunks/AuditPanel.mjs";import{LogsPanel as fe}from"./packem_chunks/LogsPanel.mjs";import{MailPanel as me}from"./packem_chunks/MailPanel.mjs";import{ScheduledJobs as le}from"./packem_shared/ScheduledJobs-BZNcYWBP.mjs";import{default as se}from"./packem_chunks/NotificationsPanel.mjs";import{HealthPanel as de}from"./packem_chunks/HealthPanel.mjs";import{aggregateMetrics as Pe,shardsToAggregate as Se}from"./packem_shared/aggregateMetrics-DKFJc-o5.mjs";import{MetricsPanel as ce}from"./packem_chunks/MetricsPanel.mjs";import{SchemaViewer as Te}from"./packem_chunks/SchemaViewer.mjs";import{SettingsPanel as ge}from"./packem_chunks/SettingsPanel.mjs";import{SqlEditorPanel as Fe}from"./packem_chunks/SqlEditorPanel.mjs";import{FileBrowser as he}from"./packem_chunks/FileBrowser.mjs";import{DEFAULT_AUTO_REFRESH_MS as Ce,useAutoRefresh as He}from"./packem_shared/DEFAULT_AUTO_REFRESH_MS-DuULO4XM.mjs";import{default as Le}from"./packem_shared/useDebounced-DVeQ5-oW.mjs";import{DEFAULT_LOCALE as Me,createStudioI18n as Ue,studioI18n as Be,useT as be}from"./packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{StudioI18nProvider as we}from"./packem_shared/StudioI18nProvider-fVsCSs5L.mjs";import{ADMIN_FUNCTIONS as Ge,ADMIN_FUNCTION_PREFIX as qe}from"./packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{default as Ve}from"./packem_shared/STUDIO_ROOT_CLASS-C6MccdVk.mjs";export{Ge as ADMIN_FUNCTIONS,qe as ADMIN_FUNCTION_PREFIX,A as AdvisorHealthPanel,h as ApiDocsPanel,C as ApiReferencePanel,O as ApiTab,te as AuditPanel,a as CommandPalette,l as ConfirmButton,s as ConnectionBadge,Ce as DEFAULT_AUTO_REFRESH_MS,I as DEFAULT_INSIGHT_THRESHOLDS,Me as DEFAULT_LOCALE,U as DataBrowser,b as DataFilters,$ as DeploymentHealthPanel,d as ErrorBoundary,V as ExportImportPanel,he as FileBrowser,Q as FunctionRunner,Y as FunctionStatsPanel,y as GlobalDataBrowser,de as HealthPanel,oe as HomePanel,g as InsightsPanel,fe as LogsPanel,me as MailPanel,ce as MetricsPanel,j as MigrationsPanel,se as NotificationsPanel,N as OpenRpcReferencePanel,z as PitrPanel,Ve as STUDIO_ROOT_CLASS,le as ScheduledJobs,Te as SchemaViewer,F as SecurityAdvisorPanel,ge as SettingsPanel,P as ShardInput,Fe as SqlEditorPanel,m as Studio,r as StudioApp,we as StudioI18nProvider,q as TableEditor,Pe as aggregateMetrics,Ue as createStudioI18n,T as deriveInsights,f as openCommandPalette,Se as shardsToAggregate,Be as studioI18n,v as toFilterClauses,He as useAutoRefresh,Le as useDebounced,be as useT};
1
+ import{StudioApp as r}from"./packem_shared/StudioApp-C9ENwcOH.mjs";import{CommandPalette as a,openCommandPalette as f}from"./packem_shared/CommandPalette-D9ZY-qQd.mjs";import{S as m}from"./packem_shared/studio-fK2DTLde.mjs";import{ConfirmButton as l}from"./packem_shared/ConfirmButton-DU4p72Er.mjs";import{default as s}from"./packem_shared/ConnectionBadge-B8Hj5DaE.mjs";import{ErrorBoundary as d}from"./packem_shared/ErrorBoundary-BWNF98VF.mjs";import{ShardInput as P}from"./packem_shared/ShardInput-C6mjgAh4.mjs";import{default as A}from"./packem_chunks/AdvisorHealthPanel.mjs";import{DEFAULT_INSIGHT_THRESHOLDS as I,deriveInsights as T}from"./packem_shared/DEFAULT_INSIGHT_THRESHOLDS-D5YMT0gM.mjs";import{InsightsPanel as g}from"./packem_chunks/InsightsPanel.mjs";import{default as F}from"./packem_chunks/SecurityAdvisorPanel.mjs";import{default as h}from"./packem_shared/ApiDocsPanel-fhDlZGE4.mjs";import{default as C}from"./packem_shared/ApiReferencePanel-nAf8tNRr.mjs";import{default as O}from"./packem_chunks/ApiTab.mjs";import{default as N}from"./packem_shared/OpenRpcReferencePanel-BxEr49D9.mjs";import{DataBrowser as U}from"./packem_shared/DataBrowser-E68QfaST.mjs";import{DataFilters as b,toFilterClauses as v}from"./packem_shared/DataFilters-CYZFt2EK.mjs";import{GlobalDataBrowser as y}from"./packem_shared/GlobalDataBrowser-DhObcZDY.mjs";import{TableEditor as q}from"./packem_chunks/TableEditor.mjs";import{ExportImportPanel as V}from"./packem_chunks/ExportImportPanel.mjs";import{MigrationsPanel as j}from"./packem_shared/MigrationsPanel-C2kb3oL-.mjs";import{PitrPanel as z}from"./packem_chunks/PitrPanel.mjs";import{FunctionRunner as Q}from"./packem_chunks/FunctionRunner.mjs";import{FunctionStatsPanel as Y}from"./packem_chunks/FunctionStatsPanel.mjs";import{DeploymentHealthPanel as $}from"./packem_chunks/DeploymentHealthPanel.mjs";import{H as oe}from"./packem_shared/home-panel-BcE8S2Nn.mjs";import{AuditPanel as te}from"./packem_chunks/AuditPanel.mjs";import{LogsPanel as fe}from"./packem_chunks/LogsPanel.mjs";import{MailPanel as me}from"./packem_chunks/MailPanel.mjs";import{ScheduledJobs as le}from"./packem_shared/ScheduledJobs-BZNcYWBP.mjs";import{default as se}from"./packem_chunks/NotificationsPanel.mjs";import{HealthPanel as de}from"./packem_chunks/HealthPanel.mjs";import{aggregateMetrics as Pe,shardsToAggregate as Se}from"./packem_shared/aggregateMetrics-DKFJc-o5.mjs";import{MetricsPanel as ce}from"./packem_chunks/MetricsPanel.mjs";import{SchemaViewer as Te}from"./packem_chunks/SchemaViewer.mjs";import{SettingsPanel as ge}from"./packem_chunks/SettingsPanel.mjs";import{SqlEditorPanel as Fe}from"./packem_chunks/SqlEditorPanel.mjs";import{FileBrowser as he}from"./packem_chunks/FileBrowser.mjs";import{DEFAULT_AUTO_REFRESH_MS as Ce,useAutoRefresh as He}from"./packem_shared/DEFAULT_AUTO_REFRESH_MS-DuULO4XM.mjs";import{default as Le}from"./packem_shared/useDebounced-DVeQ5-oW.mjs";import{DEFAULT_LOCALE as Me,createStudioI18n as Ue,studioI18n as Be,useT as be}from"./packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{StudioI18nProvider as we}from"./packem_shared/StudioI18nProvider-fVsCSs5L.mjs";import{ADMIN_FUNCTIONS as Ge,ADMIN_FUNCTION_PREFIX as qe}from"./packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{default as Ve}from"./packem_shared/STUDIO_ROOT_CLASS-C6MccdVk.mjs";export{Ge as ADMIN_FUNCTIONS,qe as ADMIN_FUNCTION_PREFIX,A as AdvisorHealthPanel,h as ApiDocsPanel,C as ApiReferencePanel,O as ApiTab,te as AuditPanel,a as CommandPalette,l as ConfirmButton,s as ConnectionBadge,Ce as DEFAULT_AUTO_REFRESH_MS,I as DEFAULT_INSIGHT_THRESHOLDS,Me as DEFAULT_LOCALE,U as DataBrowser,b as DataFilters,$ as DeploymentHealthPanel,d as ErrorBoundary,V as ExportImportPanel,he as FileBrowser,Q as FunctionRunner,Y as FunctionStatsPanel,y as GlobalDataBrowser,de as HealthPanel,oe as HomePanel,g as InsightsPanel,fe as LogsPanel,me as MailPanel,ce as MetricsPanel,j as MigrationsPanel,se as NotificationsPanel,N as OpenRpcReferencePanel,z as PitrPanel,Ve as STUDIO_ROOT_CLASS,le as ScheduledJobs,Te as SchemaViewer,F as SecurityAdvisorPanel,ge as SettingsPanel,P as ShardInput,Fe as SqlEditorPanel,m as Studio,r as StudioApp,we as StudioI18nProvider,q as TableEditor,Pe as aggregateMetrics,Ue as createStudioI18n,T as deriveInsights,f as openCommandPalette,Se as shardsToAggregate,Be as studioI18n,v as toFilterClauses,He as useAutoRefresh,Le as useDebounced,be as useT};
@@ -1 +1 @@
1
- import{scoreAdvisor as T}from"@lunora/advisor";import{E as A}from"../packem_shared/error-alert-DueSEkt-.mjs";import{C as c,a as o}from"../packem_shared/card-By2O8ULa.mjs";import{T as j,a as R,b as f,c as i,d as $,e as m}from"../packem_shared/table-D0SBiDu-.mjs";import{u as v}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{useT as C}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as N}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{c as u}from"../packem_shared/utils-bhneXptQ.mjs";import{jsx as e,jsxs as r}from"react/jsx-runtime";const n={clean:"text-emerald-600 dark:text-emerald-400",exempt:"text-muted-foreground",failing:"text-red-600 dark:text-red-400",warned:"text-amber-600 dark:text-amber-400"},b={"at-risk":"text-red-600 dark:text-red-400",excellent:"text-emerald-600 dark:text-emerald-400",good:"text-emerald-600 dark:text-emerald-400","needs-work":"text-amber-600 dark:text-amber-400"},E=(s,a)=>`exempt: ${s.exemptReason===void 0||s.exemptReason===""?a:s.exemptReason}`,S=s=>s.toSorted((a,l)=>a.coverage==="clean"&&l.coverage!=="clean"?1:l.coverage==="clean"&&a.coverage!=="clean"?-1:a.score-l.score),Y=({testId:s="advisor-health"})=>{const a=C(),l=v(N.getAdvisories,{},{live:!0}),x=v(N.getAdvisorProcedures,{},{live:!0}),p=l.data?.advisories??null,h=x.data?.procedures??null,t=p===null||h===null?null:T(h,p),g=x.error??l.error;if(g!==null)return e(A,{error:g,testId:`${s}-error`});if(t===null)return e(c,{children:e(o,{className:"py-8 text-center text-muted-foreground","data-testid":`${s}-loading`,children:a("Loading…")})});const k=S(t.procedures);return r("div",{className:"space-y-4","data-testid":s,children:[e(c,{children:r(o,{className:"flex flex-wrap items-baseline gap-x-6 gap-y-2 py-6",children:[r("div",{children:[e("span",{className:u("text-4xl font-semibold tabular-nums",b[t.grade]),"data-testid":`${s}-score`,children:t.score}),e("span",{className:"text-muted-foreground text-lg",children:"/100"})]}),e("span",{className:u("text-sm font-medium uppercase tracking-wide",b[t.grade]),"data-testid":`${s}-grade`,children:t.grade}),r("div",{className:"text-muted-foreground flex gap-4 text-sm tabular-nums","data-testid":`${s}-summary`,children:[r("span",{className:n.clean,children:[t.summary.clean," ",a("clean")]}),r("span",{className:n.warned,children:[t.summary.warned," ",a("warned")]}),r("span",{className:n.failing,children:[t.summary.failing," ",a("failing")]}),r("span",{className:n.exempt,children:[t.summary.exempt," ",a("exempt")]})]})]})}),t.project.checks.length>0&&e(c,{children:r(o,{className:"py-4 text-sm","data-testid":`${s}-project`,children:[r("span",{className:"font-medium",children:[a("Schema & config")," ",t.project.score,"/100"]}),r("span",{className:"text-muted-foreground",children:[" — ",t.project.checks.map(d=>d.name).join(", ")]})]})}),e(c,{children:e(o,{className:"p-0",children:r(j,{children:[e(R,{children:r(f,{children:[e(i,{className:"w-20",children:a("Score")}),e(i,{children:a("Procedure")}),e(i,{className:"w-32",children:a("Kind")}),e(i,{children:a("Rules fired")})]})}),e($,{children:k.map(d=>r(f,{"data-testid":`${s}-row`,children:[e(m,{className:u("tabular-nums font-medium",n[d.coverage]),children:d.coverage==="exempt"?"—":d.score}),e(m,{className:"font-mono text-xs",children:d.id}),r(m,{className:"text-muted-foreground text-xs",children:[d.visibility," ",d.kind,d.sensitivity.level==="high"&&e("span",{className:"ml-1 text-amber-600 dark:text-amber-400",children:a("sensitive")})]}),e(m,{className:"text-muted-foreground text-xs",children:d.coverage==="exempt"?E(d,a("no reason given")):d.checks.map(w=>w.name).join(", ")})]},d.id))})]})})})]})};export{Y as default};
1
+ import{scoreAdvisor as T}from"@lunora/advisor";import{E as A}from"../packem_shared/error-alert-DAsOWnCL.mjs";import{C as c,a as o}from"../packem_shared/card-By2O8ULa.mjs";import{T as j,a as R,b as f,c as i,d as $,e as m}from"../packem_shared/table-D0SBiDu-.mjs";import{u as v}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{useT as C}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as N}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{c as u}from"../packem_shared/utils-bhneXptQ.mjs";import{jsx as e,jsxs as r}from"react/jsx-runtime";const n={clean:"text-emerald-600 dark:text-emerald-400",exempt:"text-muted-foreground",failing:"text-red-600 dark:text-red-400",warned:"text-amber-600 dark:text-amber-400"},b={"at-risk":"text-red-600 dark:text-red-400",excellent:"text-emerald-600 dark:text-emerald-400",good:"text-emerald-600 dark:text-emerald-400","needs-work":"text-amber-600 dark:text-amber-400"},E=(s,a)=>`exempt: ${s.exemptReason===void 0||s.exemptReason===""?a:s.exemptReason}`,S=s=>s.toSorted((a,l)=>a.coverage==="clean"&&l.coverage!=="clean"?1:l.coverage==="clean"&&a.coverage!=="clean"?-1:a.score-l.score),Y=({testId:s="advisor-health"})=>{const a=C(),l=v(N.getAdvisories,{},{live:!0}),x=v(N.getAdvisorProcedures,{},{live:!0}),p=l.data?.advisories??null,h=x.data?.procedures??null,t=p===null||h===null?null:T(h,p),g=x.error??l.error;if(g!==null)return e(A,{error:g,testId:`${s}-error`});if(t===null)return e(c,{children:e(o,{className:"py-8 text-center text-muted-foreground","data-testid":`${s}-loading`,children:a("Loading…")})});const k=S(t.procedures);return r("div",{className:"space-y-4","data-testid":s,children:[e(c,{children:r(o,{className:"flex flex-wrap items-baseline gap-x-6 gap-y-2 py-6",children:[r("div",{children:[e("span",{className:u("text-4xl font-semibold tabular-nums",b[t.grade]),"data-testid":`${s}-score`,children:t.score}),e("span",{className:"text-muted-foreground text-lg",children:"/100"})]}),e("span",{className:u("text-sm font-medium uppercase tracking-wide",b[t.grade]),"data-testid":`${s}-grade`,children:t.grade}),r("div",{className:"text-muted-foreground flex gap-4 text-sm tabular-nums","data-testid":`${s}-summary`,children:[r("span",{className:n.clean,children:[t.summary.clean," ",a("clean")]}),r("span",{className:n.warned,children:[t.summary.warned," ",a("warned")]}),r("span",{className:n.failing,children:[t.summary.failing," ",a("failing")]}),r("span",{className:n.exempt,children:[t.summary.exempt," ",a("exempt")]})]})]})}),t.project.checks.length>0&&e(c,{children:r(o,{className:"py-4 text-sm","data-testid":`${s}-project`,children:[r("span",{className:"font-medium",children:[a("Schema & config")," ",t.project.score,"/100"]}),r("span",{className:"text-muted-foreground",children:[" — ",t.project.checks.map(d=>d.name).join(", ")]})]})}),e(c,{children:e(o,{className:"p-0",children:r(j,{children:[e(R,{children:r(f,{children:[e(i,{className:"w-20",children:a("Score")}),e(i,{children:a("Procedure")}),e(i,{className:"w-32",children:a("Kind")}),e(i,{children:a("Rules fired")})]})}),e($,{children:k.map(d=>r(f,{"data-testid":`${s}-row`,children:[e(m,{className:u("tabular-nums font-medium",n[d.coverage]),children:d.coverage==="exempt"?"—":d.score}),e(m,{className:"font-mono text-xs",children:d.id}),r(m,{className:"text-muted-foreground text-xs",children:[d.visibility," ",d.kind,d.sensitivity.level==="high"&&e("span",{className:"ml-1 text-amber-600 dark:text-amber-400",children:a("sensitive")})]}),e(m,{className:"text-muted-foreground text-xs",children:d.coverage==="exempt"?E(d,a("no reason given")):d.checks.map(w=>w.name).join(", ")})]},d.id))})]})})})]})};export{Y as default};
@@ -1 +1 @@
1
- import{useVirtualizer as A,observeElementRect as B}from"@tanstack/react-virtual";import{useState as K,useMemo as w,useRef as M}from"react";import{E as V}from"../packem_shared/error-alert-DueSEkt-.mjs";import{L as _}from"../packem_shared/live-status-BuJdUZFU.mjs";import{ShardInput as k}from"../packem_shared/ShardInput-C6mjgAh4.mjs";import{B as U}from"../packem_shared/badge-r_5B4LHP.mjs";import{C as q,a as D}from"../packem_shared/card-By2O8ULa.mjs";import{E as F}from"../packem_shared/empty-state-D7jEML_T.mjs";import{I as G}from"../packem_shared/input-CXhxesPC.mjs";import{T as W,a as J,b as N,c as s,d as P,e as l}from"../packem_shared/table-D0SBiDu-.mjs";import{u as Q}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{u as Z}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as X}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as Y}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{h as $,j as ee}from"../packem_shared/internal-Df43vQI0.mjs";import{jsxs as i,jsx as e}from"react/jsx-runtime";const te=o=>o===void 0?"":JSON.stringify(o,ee),re=41,C=480,b=5,ae=(o,t)=>B(o,n=>{t(n.height>0?n:{height:C,width:n.width})}),we=({initialShardKey:o})=>{const t=X(),{queryShardKey:n,setShardKey:y,shardKey:T}=Z(o),[c,L]=K(""),{data:u,error:p,errorSource:R,isLoading:E,liveError:I}=Q(Y.getAuditLog,{},{live:!0,shardKey:n}),m=w(()=>u?.entries??[],[u]),d=w(()=>{const a=c.trim().toLowerCase();return a===""?m:m.filter(r=>r.op.toLowerCase().includes(a)||(r.table??"").toLowerCase().includes(a)||(r.id??"").toLowerCase().includes(a))},[m,c]),f=M(null),g=A({count:d.length,estimateSize:()=>re,getScrollElement:()=>f.current,initialRect:{height:C,width:800},observeElementRect:ae,overscan:8}),h=g.getVirtualItems(),H=g.getTotalSize(),v=h[0]?.start??0,x=H-(h.at(-1)?.end??0),O={height:v},j={height:x},z=a=>{L(a.target.value)};return i("div",{className:"flex flex-col gap-4","data-testid":"lunora-audit",children:[i("div",{className:"flex flex-wrap items-center gap-2",children:[e(k,{onChange:y,testId:"au-shard-input",value:T}),e(_,{message:I,prefix:"au"}),e(G,{"aria-label":t("Filter audit log"),className:"h-8 w-48","data-testid":"au-search",onChange:z,placeholder:t("filter op, table, id"),value:c})]}),p!==null&&e(V,{error:R,testId:"au-error"}),p===null&&!E&&d.length===0&&e(F,{description:t("State-changing admin operations are recorded here."),icon:e("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:e("path",{d:"M8 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2h-2M9 3a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1V3Zm-1 9h8m-8 4h5"})}),testId:"au-empty",title:t("No audit entries.")}),d.length>0&&e(q,{className:"overflow-hidden py-0",children:e(D,{className:"max-h-[30rem] overflow-auto px-0",ref:f,children:i(W,{"data-testid":"au-table",children:[e(J,{children:i(N,{children:[e(s,{children:t("time")}),e(s,{children:t("op")}),e(s,{children:t("table")}),e(s,{children:t("id")}),e(s,{children:t("detail")})]})}),i(P,{children:[v>0&&e("tr",{"aria-hidden":"true",children:e("td",{colSpan:b,style:O})}),h.map(a=>{const r=d[a.index],S=te(r.detail);return i(N,{"data-testid":"au-row",children:[e(l,{className:"text-muted-foreground tabular-nums",children:$(r.ts,"—")}),e(l,{children:e(U,{variant:"secondary",children:r.op})}),e(l,{className:"font-medium",children:r.table??e("span",{className:"text-muted-foreground",children:"—"})}),e(l,{className:"max-w-[20ch] truncate font-mono text-xs",children:r.id??e("span",{className:"text-muted-foreground",children:"—"})}),e(l,{className:"max-w-[32ch] truncate font-mono text-xs text-muted-foreground",title:S||void 0,children:S||e("span",{className:"text-muted-foreground",children:"—"})})]},r.seq)}),x>0&&e("tr",{"aria-hidden":"true",children:e("td",{colSpan:b,style:j})})]})]})})})]})};export{we as AuditPanel};
1
+ import{useVirtualizer as A,observeElementRect as B}from"@tanstack/react-virtual";import{useState as K,useMemo as w,useRef as M}from"react";import{E as V}from"../packem_shared/error-alert-DAsOWnCL.mjs";import{L as _}from"../packem_shared/live-status-BuJdUZFU.mjs";import{ShardInput as k}from"../packem_shared/ShardInput-C6mjgAh4.mjs";import{B as U}from"../packem_shared/badge-r_5B4LHP.mjs";import{C as q,a as D}from"../packem_shared/card-By2O8ULa.mjs";import{E as F}from"../packem_shared/empty-state-D7jEML_T.mjs";import{I as G}from"../packem_shared/input-CXhxesPC.mjs";import{T as W,a as J,b as N,c as s,d as P,e as l}from"../packem_shared/table-D0SBiDu-.mjs";import{u as Q}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{u as Z}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as X}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as Y}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{h as $,j as ee}from"../packem_shared/internal-Df43vQI0.mjs";import{jsxs as i,jsx as e}from"react/jsx-runtime";const te=o=>o===void 0?"":JSON.stringify(o,ee),re=41,C=480,b=5,ae=(o,t)=>B(o,n=>{t(n.height>0?n:{height:C,width:n.width})}),we=({initialShardKey:o})=>{const t=X(),{queryShardKey:n,setShardKey:y,shardKey:T}=Z(o),[c,L]=K(""),{data:u,error:p,errorSource:R,isLoading:E,liveError:I}=Q(Y.getAuditLog,{},{live:!0,shardKey:n}),m=w(()=>u?.entries??[],[u]),d=w(()=>{const a=c.trim().toLowerCase();return a===""?m:m.filter(r=>r.op.toLowerCase().includes(a)||(r.table??"").toLowerCase().includes(a)||(r.id??"").toLowerCase().includes(a))},[m,c]),f=M(null),g=A({count:d.length,estimateSize:()=>re,getScrollElement:()=>f.current,initialRect:{height:C,width:800},observeElementRect:ae,overscan:8}),h=g.getVirtualItems(),H=g.getTotalSize(),v=h[0]?.start??0,x=H-(h.at(-1)?.end??0),O={height:v},j={height:x},z=a=>{L(a.target.value)};return i("div",{className:"flex flex-col gap-4","data-testid":"lunora-audit",children:[i("div",{className:"flex flex-wrap items-center gap-2",children:[e(k,{onChange:y,testId:"au-shard-input",value:T}),e(_,{message:I,prefix:"au"}),e(G,{"aria-label":t("Filter audit log"),className:"h-8 w-48","data-testid":"au-search",onChange:z,placeholder:t("filter op, table, id"),value:c})]}),p!==null&&e(V,{error:R,testId:"au-error"}),p===null&&!E&&d.length===0&&e(F,{description:t("State-changing admin operations are recorded here."),icon:e("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:e("path",{d:"M8 3H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2h-2M9 3a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1V3Zm-1 9h8m-8 4h5"})}),testId:"au-empty",title:t("No audit entries.")}),d.length>0&&e(q,{className:"overflow-hidden py-0",children:e(D,{className:"max-h-[30rem] overflow-auto px-0",ref:f,children:i(W,{"data-testid":"au-table",children:[e(J,{children:i(N,{children:[e(s,{children:t("time")}),e(s,{children:t("op")}),e(s,{children:t("table")}),e(s,{children:t("id")}),e(s,{children:t("detail")})]})}),i(P,{children:[v>0&&e("tr",{"aria-hidden":"true",children:e("td",{colSpan:b,style:O})}),h.map(a=>{const r=d[a.index],S=te(r.detail);return i(N,{"data-testid":"au-row",children:[e(l,{className:"text-muted-foreground tabular-nums",children:$(r.ts,"—")}),e(l,{children:e(U,{variant:"secondary",children:r.op})}),e(l,{className:"font-medium",children:r.table??e("span",{className:"text-muted-foreground",children:"—"})}),e(l,{className:"max-w-[20ch] truncate font-mono text-xs",children:r.id??e("span",{className:"text-muted-foreground",children:"—"})}),e(l,{className:"max-w-[32ch] truncate font-mono text-xs text-muted-foreground",title:S||void 0,children:S||e("span",{className:"text-muted-foreground",children:"—"})})]},r.seq)}),x>0&&e("tr",{"aria-hidden":"true",children:e("td",{colSpan:b,style:j})})]})]})})})]})};export{we as AuditPanel};
@@ -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-DueSEkt-.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-By2O8ULa.mjs";import{E as ee}from"../packem_shared/empty-state-D7jEML_T.mjs";import{T as te,a as re,b as L,c as a,d as le,e as n}from"../packem_shared/table-D0SBiDu-.mjs";import{u as se}from"../packem_shared/use-admin-query-tlBof8Yg.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{h as ie}from"../packem_shared/internal-Df43vQI0.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-DAsOWnCL.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-By2O8ULa.mjs";import{E as ee}from"../packem_shared/empty-state-D7jEML_T.mjs";import{T as te,a as re,b as L,c as a,d as le,e as n}from"../packem_shared/table-D0SBiDu-.mjs";import{u as se}from"../packem_shared/use-admin-query-tlBof8Yg.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{h as ie}from"../packem_shared/internal-Df43vQI0.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 X}from"react/compiler-runtime";import{useLunora as se}from"@lunora/react";import{useNavigate as ae}from"@tanstack/react-router";import{useState as H,useRef as re,useEffectEvent as Q,useEffect as z,useCallback as oe,useMemo as N}from"react";import{ShardInput as ie}from"../packem_shared/ShardInput-C6mjgAh4.mjs";import{B as ce}from"../packem_shared/button-q0UYSmrn.mjs";import{u as B}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{u as le}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as K}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as w}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{f as k,d as E,c as M,m as de}from"../packem_shared/internal-Df43vQI0.mjs";import{r as ue}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{a as G,A as fe}from"../packem_shared/advisor-view-DzI2RQhY.mjs";import{ConfirmButton as me}from"../packem_shared/ConfirmButton-DU4p72Er.mjs";import{jsx as v,jsxs as he}from"react/jsx-runtime";import{deriveInsights as pe}from"../packem_shared/DEFAULT_INSIGHT_THRESHOLDS-D5YMT0gM.mjs";import{runAdvisor as be,RUNTIME_LINTS as xe}from"@lunora/advisor";const ye=t=>{const{suggestedIndex:e,table:a}=t;if(typeof a!="string"||a.length===0||typeof e!="object"||e===null)return!1;const{fields:n,name:s}=e;return!Array.isArray(n)||n.length===0||n.some(i=>typeof i!="string"||i.length===0)?!1:typeof s=="string"&&s.length>0},ge=(t,e)=>`.index(${JSON.stringify(t)}, [${e.map(a=>JSON.stringify(a)).join(", ")}])`,ve=t=>{const e=X(19),{fields:a,indexName:n,table:s,testId:i}=t,l=K(),[f,d]=H(null);let m;e[0]!==a||e[1]!==n?(m=()=>{const b=ge(n,a),I="navigator"in globalThis?globalThis.navigator.clipboard:void 0;if(I===void 0){d({copied:!1,declaration:b});return}k(I.writeText(b).then(()=>(d({copied:!0,declaration:b}),!0)),()=>{d({copied:!1,declaration:b})})},e[0]=a,e[1]=n,e[2]=m):m=e[2];const S=m;if(f!==null){let b;return e[3]!==f.copied||e[4]!==f.declaration||e[5]!==l||e[6]!==s||e[7]!==i?(b=f.copied?v("span",{className:"text-xs text-muted-foreground","data-testid":`${i}-applied`,children:l("Index declaration copied — add it to {table} in lunora/schema.ts.",{table:s})}):he("span",{className:"flex flex-col gap-1 text-xs text-muted-foreground","data-testid":`${i}-manual`,children:[l("Could not reach the clipboard — add this to {table} in lunora/schema.ts:",{table:s}),v("code",{className:"font-mono break-all select-all",children:f.declaration})]}),e[3]=f.copied,e[4]=f.declaration,e[5]=l,e[6]=s,e[7]=i,e[8]=b):b=e[8],b}let u;e[9]!==l?(u=l("Copy?"),e[9]=l,e[10]=u):u=e[10];let h;e[11]!==l||e[12]!==s?(h=l("Copy index declaration for {table}",{table:s}),e[11]=l,e[12]=s,e[13]=h):h=e[13];let y;return e[14]!==S||e[15]!==u||e[16]!==h||e[17]!==i?(y=v(me,{confirmLabel:u,onConfirm:S,testId:i,children:h}),e[14]=S,e[15]=u,e[16]=h,e[17]=i,e[18]=y):y=e[18],y},Se=(t,e)=>{const a=new Map;for(const n of e){const s=`${n.table} ${n.index}`;a.set(s,(a.get(s)??0)+n.reads)}return t.map(n=>({index:n.index,reads:a.get(`${n.table} ${n.index}`)??0,table:n.table}))},Te=t=>{const e=new Map;for(const a of t)for(const n of a.scannedTables??[])e.set(n.table,(e.get(n.table)??0)+n.scans);return[...e].map(([a,n])=>({scans:n,table:a}))},P=(t,e)=>e.map(a=>({index:a.name,table:t})),we=t=>{const e=Se(t.declaredIndexes??[],t.indexHits??[]),a=Te(t.functions??[]),n=t.shardTraffic??[],s=t.analyticsMetrics,i=s&&s.indexHits.length>0?s.indexHits:e,l=s&&s.tableScans.length>0?s.tableScans:a,f=s&&s.shardTraffic.length>0?s.shardTraffic:n,d=be({indexHits:i,schema:{tables:[]},shardTraffic:f,tableScans:l},{lints:xe,source:"runtime"}),m=t.suppressHotScanTables;return(m===void 0?d:d.filter(u=>!(u.metadata.kind==="hot_scan"&&typeof u.metadata.table=="string"&&m.has(u.metadata.table)))).map(u=>G(u))},Ie=M(w.listTables),$e=M(w.listTableIndexes),Ae=M(w.listTablesIndexes),L=t=>`${(t*100).toFixed(1)}%`,V=t=>`${(t/1e3).toFixed(2)}s`,Ne=t=>{if(t.length<=1)return t[0]??"";const e=t[t.length-1]??"";return`${t.slice(0,-1).join(", ")} and ${e}`},ke=(t,e)=>({"high-error-rate":t("High error rate"),"high-evictions":t("High cache eviction rate"),"high-write-contention":t("High write contention"),"low-cache-hit-rate":t("Low cache hit rate"),"missing-index":t("Missing index"),"slow-function":t("Slow function"),"storage-headroom":t("Storage headroom")})[e.kind],U=(t,e)=>({"high-error-rate":t("{rate} of calls failed.",{rate:L(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:L(e.value)}),"low-cache-hit-rate":t("{rate} hit rate over recent traffic.",{rate:L(e.value)}),"missing-index":t("Slowest call took {duration} — it full-scanned {tables} with no index.",{duration:V(e.value),tables:Ne(e.tables??[])}),"slow-function":t("Slowest call took {duration}.",{duration:V(e.value)}),"storage-headroom":t("{size} of the 10 GiB per-shard ceiling — plan a .shardBy() migration while it still has runway.",{size:de(e.value)})})[e.kind],Be=t=>{const e=X(10),{onJump:a,table:n}=t,s=K();let i;e[0]!==a||e[1]!==n?(i=()=>{a(n)},e[0]=a,e[1]=n,e[2]=i):i=e[2];const l=i,f=`in-add-index-${n}`;let d;e[3]!==s||e[4]!==n?(d=s("Add index on {table}",{table:n}),e[3]=s,e[4]=n,e[5]=d):d=e[5];let m;return e[6]!==l||e[7]!==f||e[8]!==d?(m=v(ce,{"data-testid":f,onClick:l,size:"sm",type:"button",variant:"outline",children:d}),e[6]=l,e[7]=f,e[8]=d,e[9]=m):m=e[9],m},Ue=({initialShardKey:t,loadShardTraffic:e})=>{const a=se(),n=ae(),s=K(),{queryShardKey:i,setShardKey:l,shardKey:f}=le(t),[d,m]=H(null),[S,u]=H(null),h=re(""),y=B(w.getMetrics,{},{live:!0,shardKey:i}),b=B(w.getFunctionStats,{},{live:!0,shardKey:i}),I=B(w.getAdvisories,{},{live:!0,shardKey:i}),D=y.data??null,$=b.data?.functions??null,R=I.data?.advisories??null,C=y.data?.indexHits??null,j=y.error!==null&&b.error!==null?y.error:null,W=e??(r=>a.shardTraffic(r)),Y=async(r,x)=>{const g=r[0];if(g===void 0||g===""){h.current===x&&u(null);return}try{const o=await W(g);if(h.current!==x)return;const c=new Map;for(const p of o.shards)c.has(p.shardKey)||c.set(p.shardKey,{requests:p.requests,shardKey:p.shardKey});u([...c.values()])}catch{h.current===x&&u(null)}},Z=async(r,x)=>{const g=await Promise.allSettled(r.map(async c=>[c,await a.query($e,{table:c},E(x))])),o=[];for(const c of g)if(c.status==="fulfilled"){const[p,T]=c.value;o.push(...P(p,T.indexes))}return o},F=Q(async r=>{h.current=r;let x=[];try{const g=await a.query(Ie,{},E(r));if(h.current!==r)return;ue(r),x=g.map(c=>c.name);let o=[];if(x.length>0)try{const c=await a.query(Ae,{tables:x},E(r));if(h.current!==r)return;for(const[p,T]of Object.entries(c.indexesByTable))o.push(...P(p,T))}catch{if(o=await Z(x,r),h.current!==r)return}m(o)}catch{h.current===r&&m(null)}await Y(x,r)});z(()=>{k(F(i))},[i]);const _=Q(()=>{y.refetch(),b.refetch(),I.refetch(),k(F(i))});z(()=>{const r=()=>{document.visibilityState==="visible"&&_()};return document.addEventListener("visibilitychange",r),()=>{document.removeEventListener("visibilitychange",r)}},[]);const O=oe(r=>{k(n({search:{table:r},to:"/schema"}))},[n]),A=N(()=>pe(D,$),[$,D]),q=N(()=>new Set(A.filter(r=>r.kind==="missing-index").flatMap(r=>r.tables??[])),[A]),J=N(()=>we({declaredIndexes:d??[],functions:$,indexHits:C,shardTraffic:S,suppressHotScanTables:q}),[d,$,C,q,S]),ee=N(()=>{const r=A.map(o=>{const c=o.kind==="missing-index"?o.tables??[]:[];return{action:c.length>0?c.map(p=>v(Be,{onJump:O,table:p},p)):void 0,description:o.message===void 0?U(s,o):`${U(s,o)} — ${o.message}`,entity:o.fn,issueType:ke(s,o),key:`${o.kind}:${o.fn??""}`,level:o.severity}}),x=new Set(["unindexed_foreign_key","unindexed_relation_target"]);return[...(R??[]).map(o=>{const c=G(o);if(x.has(o.name)&&ye(o.metadata)){const{table:p,suggestedIndex:T}=o.metadata,ne=`in-apply-index-${p}-${T.name}`;return{...c,action:v(ve,{fields:T.fields,indexName:T.name,table:p,testId:ne})}}return c}),...J,...r]},[R,A,O,J,s]),te=v(ie,{onChange:l,testId:"in-shard-input",value:f});return v(fe,{error:j,errorSource:j===null?void 0:y.errorSource,rows:ee,testId:"lunora-insights",toolbar:te})};export{Ue as InsightsPanel};
1
+ import{c as X}from"react/compiler-runtime";import{useLunora as se}from"@lunora/react";import{useNavigate as ae}from"@tanstack/react-router";import{useState as H,useRef as re,useEffectEvent as Q,useEffect as z,useCallback as oe,useMemo as N}from"react";import{ShardInput as ie}from"../packem_shared/ShardInput-C6mjgAh4.mjs";import{B as ce}from"../packem_shared/button-q0UYSmrn.mjs";import{u as B}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{u as le}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as K}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as w}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{f as k,d as E,c as M,m as de}from"../packem_shared/internal-Df43vQI0.mjs";import{r as ue}from"../packem_shared/shard-history-CaO3C4KQ.mjs";import{a as G,A as fe}from"../packem_shared/advisor-view-y4cW5JcX.mjs";import{ConfirmButton as me}from"../packem_shared/ConfirmButton-DU4p72Er.mjs";import{jsx as v,jsxs as he}from"react/jsx-runtime";import{deriveInsights as pe}from"../packem_shared/DEFAULT_INSIGHT_THRESHOLDS-D5YMT0gM.mjs";import{runAdvisor as be,RUNTIME_LINTS as xe}from"@lunora/advisor";const ye=t=>{const{suggestedIndex:e,table:a}=t;if(typeof a!="string"||a.length===0||typeof e!="object"||e===null)return!1;const{fields:n,name:s}=e;return!Array.isArray(n)||n.length===0||n.some(i=>typeof i!="string"||i.length===0)?!1:typeof s=="string"&&s.length>0},ge=(t,e)=>`.index(${JSON.stringify(t)}, [${e.map(a=>JSON.stringify(a)).join(", ")}])`,ve=t=>{const e=X(19),{fields:a,indexName:n,table:s,testId:i}=t,l=K(),[f,d]=H(null);let m;e[0]!==a||e[1]!==n?(m=()=>{const b=ge(n,a),I="navigator"in globalThis?globalThis.navigator.clipboard:void 0;if(I===void 0){d({copied:!1,declaration:b});return}k(I.writeText(b).then(()=>(d({copied:!0,declaration:b}),!0)),()=>{d({copied:!1,declaration:b})})},e[0]=a,e[1]=n,e[2]=m):m=e[2];const S=m;if(f!==null){let b;return e[3]!==f.copied||e[4]!==f.declaration||e[5]!==l||e[6]!==s||e[7]!==i?(b=f.copied?v("span",{className:"text-xs text-muted-foreground","data-testid":`${i}-applied`,children:l("Index declaration copied — add it to {table} in lunora/schema.ts.",{table:s})}):he("span",{className:"flex flex-col gap-1 text-xs text-muted-foreground","data-testid":`${i}-manual`,children:[l("Could not reach the clipboard — add this to {table} in lunora/schema.ts:",{table:s}),v("code",{className:"font-mono break-all select-all",children:f.declaration})]}),e[3]=f.copied,e[4]=f.declaration,e[5]=l,e[6]=s,e[7]=i,e[8]=b):b=e[8],b}let u;e[9]!==l?(u=l("Copy?"),e[9]=l,e[10]=u):u=e[10];let h;e[11]!==l||e[12]!==s?(h=l("Copy index declaration for {table}",{table:s}),e[11]=l,e[12]=s,e[13]=h):h=e[13];let y;return e[14]!==S||e[15]!==u||e[16]!==h||e[17]!==i?(y=v(me,{confirmLabel:u,onConfirm:S,testId:i,children:h}),e[14]=S,e[15]=u,e[16]=h,e[17]=i,e[18]=y):y=e[18],y},Se=(t,e)=>{const a=new Map;for(const n of e){const s=`${n.table} ${n.index}`;a.set(s,(a.get(s)??0)+n.reads)}return t.map(n=>({index:n.index,reads:a.get(`${n.table} ${n.index}`)??0,table:n.table}))},Te=t=>{const e=new Map;for(const a of t)for(const n of a.scannedTables??[])e.set(n.table,(e.get(n.table)??0)+n.scans);return[...e].map(([a,n])=>({scans:n,table:a}))},P=(t,e)=>e.map(a=>({index:a.name,table:t})),we=t=>{const e=Se(t.declaredIndexes??[],t.indexHits??[]),a=Te(t.functions??[]),n=t.shardTraffic??[],s=t.analyticsMetrics,i=s&&s.indexHits.length>0?s.indexHits:e,l=s&&s.tableScans.length>0?s.tableScans:a,f=s&&s.shardTraffic.length>0?s.shardTraffic:n,d=be({indexHits:i,schema:{tables:[]},shardTraffic:f,tableScans:l},{lints:xe,source:"runtime"}),m=t.suppressHotScanTables;return(m===void 0?d:d.filter(u=>!(u.metadata.kind==="hot_scan"&&typeof u.metadata.table=="string"&&m.has(u.metadata.table)))).map(u=>G(u))},Ie=M(w.listTables),$e=M(w.listTableIndexes),Ae=M(w.listTablesIndexes),L=t=>`${(t*100).toFixed(1)}%`,V=t=>`${(t/1e3).toFixed(2)}s`,Ne=t=>{if(t.length<=1)return t[0]??"";const e=t[t.length-1]??"";return`${t.slice(0,-1).join(", ")} and ${e}`},ke=(t,e)=>({"high-error-rate":t("High error rate"),"high-evictions":t("High cache eviction rate"),"high-write-contention":t("High write contention"),"low-cache-hit-rate":t("Low cache hit rate"),"missing-index":t("Missing index"),"slow-function":t("Slow function"),"storage-headroom":t("Storage headroom")})[e.kind],U=(t,e)=>({"high-error-rate":t("{rate} of calls failed.",{rate:L(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:L(e.value)}),"low-cache-hit-rate":t("{rate} hit rate over recent traffic.",{rate:L(e.value)}),"missing-index":t("Slowest call took {duration} — it full-scanned {tables} with no index.",{duration:V(e.value),tables:Ne(e.tables??[])}),"slow-function":t("Slowest call took {duration}.",{duration:V(e.value)}),"storage-headroom":t("{size} of the 10 GiB per-shard ceiling — plan a .shardBy() migration while it still has runway.",{size:de(e.value)})})[e.kind],Be=t=>{const e=X(10),{onJump:a,table:n}=t,s=K();let i;e[0]!==a||e[1]!==n?(i=()=>{a(n)},e[0]=a,e[1]=n,e[2]=i):i=e[2];const l=i,f=`in-add-index-${n}`;let d;e[3]!==s||e[4]!==n?(d=s("Add index on {table}",{table:n}),e[3]=s,e[4]=n,e[5]=d):d=e[5];let m;return e[6]!==l||e[7]!==f||e[8]!==d?(m=v(ce,{"data-testid":f,onClick:l,size:"sm",type:"button",variant:"outline",children:d}),e[6]=l,e[7]=f,e[8]=d,e[9]=m):m=e[9],m},Ue=({initialShardKey:t,loadShardTraffic:e})=>{const a=se(),n=ae(),s=K(),{queryShardKey:i,setShardKey:l,shardKey:f}=le(t),[d,m]=H(null),[S,u]=H(null),h=re(""),y=B(w.getMetrics,{},{live:!0,shardKey:i}),b=B(w.getFunctionStats,{},{live:!0,shardKey:i}),I=B(w.getAdvisories,{},{live:!0,shardKey:i}),D=y.data??null,$=b.data?.functions??null,R=I.data?.advisories??null,C=y.data?.indexHits??null,j=y.error!==null&&b.error!==null?y.error:null,W=e??(r=>a.shardTraffic(r)),Y=async(r,x)=>{const g=r[0];if(g===void 0||g===""){h.current===x&&u(null);return}try{const o=await W(g);if(h.current!==x)return;const c=new Map;for(const p of o.shards)c.has(p.shardKey)||c.set(p.shardKey,{requests:p.requests,shardKey:p.shardKey});u([...c.values()])}catch{h.current===x&&u(null)}},Z=async(r,x)=>{const g=await Promise.allSettled(r.map(async c=>[c,await a.query($e,{table:c},E(x))])),o=[];for(const c of g)if(c.status==="fulfilled"){const[p,T]=c.value;o.push(...P(p,T.indexes))}return o},F=Q(async r=>{h.current=r;let x=[];try{const g=await a.query(Ie,{},E(r));if(h.current!==r)return;ue(r),x=g.map(c=>c.name);let o=[];if(x.length>0)try{const c=await a.query(Ae,{tables:x},E(r));if(h.current!==r)return;for(const[p,T]of Object.entries(c.indexesByTable))o.push(...P(p,T))}catch{if(o=await Z(x,r),h.current!==r)return}m(o)}catch{h.current===r&&m(null)}await Y(x,r)});z(()=>{k(F(i))},[i]);const _=Q(()=>{y.refetch(),b.refetch(),I.refetch(),k(F(i))});z(()=>{const r=()=>{document.visibilityState==="visible"&&_()};return document.addEventListener("visibilitychange",r),()=>{document.removeEventListener("visibilitychange",r)}},[]);const O=oe(r=>{k(n({search:{table:r},to:"/schema"}))},[n]),A=N(()=>pe(D,$),[$,D]),q=N(()=>new Set(A.filter(r=>r.kind==="missing-index").flatMap(r=>r.tables??[])),[A]),J=N(()=>we({declaredIndexes:d??[],functions:$,indexHits:C,shardTraffic:S,suppressHotScanTables:q}),[d,$,C,q,S]),ee=N(()=>{const r=A.map(o=>{const c=o.kind==="missing-index"?o.tables??[]:[];return{action:c.length>0?c.map(p=>v(Be,{onJump:O,table:p},p)):void 0,description:o.message===void 0?U(s,o):`${U(s,o)} — ${o.message}`,entity:o.fn,issueType:ke(s,o),key:`${o.kind}:${o.fn??""}`,level:o.severity}}),x=new Set(["unindexed_foreign_key","unindexed_relation_target"]);return[...(R??[]).map(o=>{const c=G(o);if(x.has(o.name)&&ye(o.metadata)){const{table:p,suggestedIndex:T}=o.metadata,ne=`in-apply-index-${p}-${T.name}`;return{...c,action:v(ve,{fields:T.fields,indexName:T.name,table:p,testId:ne})}}return c}),...J,...r]},[R,A,O,J,s]),te=v(ie,{onChange:l,testId:"in-shard-input",value:f});return v(fe,{error:j,errorSource:j===null?void 0:y.errorSource,rows:ee,testId:"lunora-insights",toolbar:te})};export{Ue as InsightsPanel};
@@ -1 +1 @@
1
- import{c as q}from"react/compiler-runtime";import{useVirtualizer as Ce}from"@tanstack/react-virtual";import{useState as F,useReducer as Le,useRef as ue,useEffect as me,useMemo as Ne}from"react";import{f as fe}from"../packem_shared/log-fields-BolUoZ9g.mjs";import{E as Se}from"../packem_shared/error-alert-DueSEkt-.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-tlBof8Yg.mjs";import{u as Te}from"../packem_shared/use-open-trace-DMVhpnyG.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,i as qe,b as ie}from"../packem_shared/internal-Df43vQI0.mjs";import{a as Ae,L as Me}from"../packem_shared/log-line-CICyJ_kc.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-BolUoZ9g.mjs";import{E as Se}from"../packem_shared/error-alert-DAsOWnCL.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-tlBof8Yg.mjs";import{u as Te}from"../packem_shared/use-open-trace-DMVhpnyG.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,i as qe,b as ie}from"../packem_shared/internal-Df43vQI0.mjs";import{a as Ae,L as Me}from"../packem_shared/log-line-CICyJ_kc.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 se}from"../packem_shared/error-alert-DueSEkt-.mjs";import{B as ie}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 X,b as Z,f as ee,g as he,h as te}from"../packem_shared/internal-Df43vQI0.mjs";import{c as pe}from"react/compiler-runtime";import{useLunora as fe}from"@lunora/react";import{useState as R}from"react";import{u as xe}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{useAutoRefresh as be}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-DuULO4XM.mjs";import{ADMIN_FUNCTIONS as J}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";function ge({className:r,orientation:e="horizontal",...i}){return t(de,{"data-slot":"separator",orientation:e,className:ce("shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",r),...i})}const ve=/https?:\/\/[^\s"'<>)]+/i,re=r=>r===void 0?void 0:ve.exec(r)?.[0],N=r=>r===void 0?"":Array.isArray(r)?r.join(", "):r,Ne=/<a\s(?:[^>]*?\s)?href\s*=\s*["'](https?:\/\/[^"'\s]+)["']/iu,we=/&(?:amp|#0*38|#x0*26);/giu,ye=r=>r===void 0?void 0:((r.html===void 0?void 0:Ne.exec(r.html)?.[1])??re(r.text)??re(r.html))?.replaceAll(we,"&"),Ce=(r,e)=>{const i=e.trim().toLowerCase();return i===""?r:r.filter(o=>`${o.subject} ${N(o.to)} ${N(o.cc)}`.toLowerCase().includes(i))},Se=(r,e)=>{if(r.length!==0)return r.find(i=>i.id===e)??r[0]},Te=ae(J.clearCapturedMail),ke=ae(J.sendTestMail),Ae=r=>{const e=pe(38),{limit:i}=r,o=fe();let p;e[0]!==i?(p={limit:i},e[0]=i,e[1]=p):p=e[1];const{data:O,error:w,errorSource:y,isLoading:b,refetch:l}=xe(J.getCapturedMail,p),[C,f]=R(null),[H,S]=R(null),[g,s]=R("html"),[c,B]=R(""),x=O?.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(Te,{},X("")),S(null),l()}catch(m){f(Z(m))}},e[2]=o,e[3]=l,e[4]=T):T=e[4];const D=T;let k;e[5]!==o||e[6]!==l?(k=async()=>{f(null);try{await o.query(ke,{},X("")),l()}catch(m){f(Z(m))}},e[5]=o,e[6]=l,e[7]=k):k=e[7];const q=k;let A;e[8]!==l?(A=()=>{l()},e[8]=l,e[9]=A):A=e[9],be(A,!0);let E;e[10]!==D?(E=()=>{ee(D())},e[10]=D,e[11]=E):E=e[11];const U=E;let L;e[12]!==q?(L=()=>{ee(q())},e[12]=q,e[13]=L):L=e[13];const W=L;let _;e[14]===Symbol.for("react.memo_cache_sentinel")?(_=m=>{B(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 I;e[16]===Symbol.for("react.memo_cache_sentinel")?(I=m=>{const u=m.currentTarget.dataset.tab;(u==="headers"||u==="html"||u==="text")&&s(u)},e[16]=I):I=e[16];const V=I,j=Ce(x,c),$=Se(j,H),d=ye($);let z;e[17]!==d?(z=()=>{d!==void 0&&he(d)},e[17]=d,e[18]=z):z=e[18];const Y=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 G=F;let P;return e[21]!==x||e[22]!==a||e[23]!==h||e[24]!==c||e[25]!==b||e[26]!==d||e[27]!==U||e[28]!==Y||e[29]!==K||e[30]!==G||e[31]!==Q||e[32]!==V||e[33]!==W||e[34]!==$||e[35]!==g||e[36]!==j?(P={entries:x,error:a,errorSource:h,filter:c,isLoading:b,link:d,onClear:U,onCopyLink:Y,onFilterChange:K,onOpenLink:G,onSelectMessage:Q,onSelectTab:V,onSendTest:W,selected:$,tab:g,visible:j},e[21]=x,e[22]=a,e[23]=h,e[24]=c,e[25]=b,e[26]=d,e[27]=U,e[28]=Y,e[29]=K,e[30]=G,e[31]=Q,e[32]=V,e[33]=W,e[34]=$,e[35]=g,e[36]=j,e[37]=P):P=e[37],P},Ee=`<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src data:; style-src 'unsafe-inline'; font-src data:">`,Le=r=>`${Ee}${r}`,Qe=({limit:r=100})=>{const e=ue(),{entries:i,error:o,errorSource:p,filter:O,isLoading:w,link:y,onClear:b,onCopyLink:l,onFilterChange:C,onOpenLink:f,onSelectMessage:H,onSelectTab:S,onSendTest:g,selected:s,tab:c,visible:B}=Ae({limit:r}),x=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:i.length===0,onClick:b,size:"sm",type:"button",variant:"outline",children:e("Clear inbox")}),i.length>0&&t(ie,{className:"ml-auto","data-testid":"mail-count",variant:"secondary",children:e("{count} messages",{count:i.length})})]}),o!==null&&t(se,{error:p,testId:"mail-error"}),o===null&&!w&&i.length===0&&t(oe,{description:e("Email your app sends in dev is captured here — nothing is delivered."),icon:n("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[t("path",{d:"M4 5h16v14H4z"}),t("path",{d:"m4 6 8 6 8-6"})]}),testId:"mail-empty",title:e("No captured email.")}),i.length>0&&n("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-[minmax(0,22rem)_1fr]","data-testid":"mail-reader",children:[n("div",{className:"flex flex-col gap-2",children:[t(ne,{"aria-label":e("Search messages"),"data-testid":"mail-search",onChange:C,placeholder:e("Filter messages"),type:"search",value:O}),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:B.map(a=>{const h=a.id===s?.id;return t("li",{children:n("button",{className:`flex w-full flex-col items-start gap-0.5 px-3 py-2 text-left text-sm hover:bg-muted/60 ${h?"bg-muted":""}`,"data-active":h,"data-id":a.id,"data-testid":"mail-list-item",onClick:H,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)})})})]}),s!==void 0&&n("div",{className:"flex min-w-0 flex-col gap-3 rounded-xl border border-border bg-card p-4 shadow-xs","data-testid":"mail-detail",children:[n("div",{className:"flex flex-col gap-1",children:[t("h2",{className:"truncate text-base font-semibold","data-testid":"mail-subject",children:s.subject||e("(no subject)")}),n("dl",{className:"grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 text-xs text-muted-foreground",children:[t("dt",{children:e("From")}),t("dd",{className:"truncate font-mono",children:s.from??"—"}),t("dt",{children:e("To")}),t("dd",{className:"truncate font-mono",children:N(s.to)}),s.cc!==void 0&&s.cc.length>0&&n(me,{children:[t("dt",{children:e("Cc")}),t("dd",{className:"truncate font-mono",children:N(s.cc)})]}),t("dt",{children:e("Sent")}),t("dd",{className:"tabular-nums",children:te(s.capturedAt,"—")})]})]}),n("div",{className:"flex flex-wrap items-center gap-2","data-testid":"mail-actions",children:[t(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:x(a)},a))}),n("div",{className:"min-h-[12rem]",children:[c==="html"&&(s.html===void 0?t("p",{className:"text-sm text-muted-foreground",children:e("No HTML body.")}):t("iframe",{className:"h-[24rem] w-full rounded-md border bg-white","data-testid":"mail-preview-html",sandbox:"",srcDoc:Le(s.html),title:e("Email preview")})),c==="text"&&(s.text===void 0?t("p",{className:"text-sm text-muted-foreground",children:e("No text body.")}):t("pre",{className:"overflow-auto whitespace-pre-wrap rounded-md border bg-muted/30 p-3 text-xs","data-testid":"mail-preview-text",children:s.text})),c==="headers"&&(s.headers===void 0||Object.keys(s.headers).length===0?t("p",{className:"text-sm text-muted-foreground",children:e("No headers.")}):t("pre",{className:"overflow-auto whitespace-pre-wrap rounded-md border bg-muted/30 p-3 text-xs","data-testid":"mail-preview-headers",children:Object.entries(s.headers).map(([a,h])=>`${a}: ${h}`).join(`
1
+ import{E as se}from"../packem_shared/error-alert-DAsOWnCL.mjs";import{B as ie}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 X,b as Z,f as ee,g as he,h as te}from"../packem_shared/internal-Df43vQI0.mjs";import{c as pe}from"react/compiler-runtime";import{useLunora as fe}from"@lunora/react";import{useState as R}from"react";import{u as xe}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{useAutoRefresh as be}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-DuULO4XM.mjs";import{ADMIN_FUNCTIONS as J}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";function ge({className:r,orientation:e="horizontal",...i}){return t(de,{"data-slot":"separator",orientation:e,className:ce("shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",r),...i})}const ve=/https?:\/\/[^\s"'<>)]+/i,re=r=>r===void 0?void 0:ve.exec(r)?.[0],N=r=>r===void 0?"":Array.isArray(r)?r.join(", "):r,Ne=/<a\s(?:[^>]*?\s)?href\s*=\s*["'](https?:\/\/[^"'\s]+)["']/iu,we=/&(?:amp|#0*38|#x0*26);/giu,ye=r=>r===void 0?void 0:((r.html===void 0?void 0:Ne.exec(r.html)?.[1])??re(r.text)??re(r.html))?.replaceAll(we,"&"),Ce=(r,e)=>{const i=e.trim().toLowerCase();return i===""?r:r.filter(o=>`${o.subject} ${N(o.to)} ${N(o.cc)}`.toLowerCase().includes(i))},Se=(r,e)=>{if(r.length!==0)return r.find(i=>i.id===e)??r[0]},Te=ae(J.clearCapturedMail),ke=ae(J.sendTestMail),Ae=r=>{const e=pe(38),{limit:i}=r,o=fe();let p;e[0]!==i?(p={limit:i},e[0]=i,e[1]=p):p=e[1];const{data:O,error:w,errorSource:y,isLoading:b,refetch:l}=xe(J.getCapturedMail,p),[C,f]=R(null),[H,S]=R(null),[g,s]=R("html"),[c,B]=R(""),x=O?.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(Te,{},X("")),S(null),l()}catch(m){f(Z(m))}},e[2]=o,e[3]=l,e[4]=T):T=e[4];const D=T;let k;e[5]!==o||e[6]!==l?(k=async()=>{f(null);try{await o.query(ke,{},X("")),l()}catch(m){f(Z(m))}},e[5]=o,e[6]=l,e[7]=k):k=e[7];const q=k;let A;e[8]!==l?(A=()=>{l()},e[8]=l,e[9]=A):A=e[9],be(A,!0);let E;e[10]!==D?(E=()=>{ee(D())},e[10]=D,e[11]=E):E=e[11];const U=E;let L;e[12]!==q?(L=()=>{ee(q())},e[12]=q,e[13]=L):L=e[13];const W=L;let _;e[14]===Symbol.for("react.memo_cache_sentinel")?(_=m=>{B(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 I;e[16]===Symbol.for("react.memo_cache_sentinel")?(I=m=>{const u=m.currentTarget.dataset.tab;(u==="headers"||u==="html"||u==="text")&&s(u)},e[16]=I):I=e[16];const V=I,j=Ce(x,c),$=Se(j,H),d=ye($);let z;e[17]!==d?(z=()=>{d!==void 0&&he(d)},e[17]=d,e[18]=z):z=e[18];const Y=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 G=F;let P;return e[21]!==x||e[22]!==a||e[23]!==h||e[24]!==c||e[25]!==b||e[26]!==d||e[27]!==U||e[28]!==Y||e[29]!==K||e[30]!==G||e[31]!==Q||e[32]!==V||e[33]!==W||e[34]!==$||e[35]!==g||e[36]!==j?(P={entries:x,error:a,errorSource:h,filter:c,isLoading:b,link:d,onClear:U,onCopyLink:Y,onFilterChange:K,onOpenLink:G,onSelectMessage:Q,onSelectTab:V,onSendTest:W,selected:$,tab:g,visible:j},e[21]=x,e[22]=a,e[23]=h,e[24]=c,e[25]=b,e[26]=d,e[27]=U,e[28]=Y,e[29]=K,e[30]=G,e[31]=Q,e[32]=V,e[33]=W,e[34]=$,e[35]=g,e[36]=j,e[37]=P):P=e[37],P},Ee=`<meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src data:; style-src 'unsafe-inline'; font-src data:">`,Le=r=>`${Ee}${r}`,Qe=({limit:r=100})=>{const e=ue(),{entries:i,error:o,errorSource:p,filter:O,isLoading:w,link:y,onClear:b,onCopyLink:l,onFilterChange:C,onOpenLink:f,onSelectMessage:H,onSelectTab:S,onSendTest:g,selected:s,tab:c,visible:B}=Ae({limit:r}),x=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:i.length===0,onClick:b,size:"sm",type:"button",variant:"outline",children:e("Clear inbox")}),i.length>0&&t(ie,{className:"ml-auto","data-testid":"mail-count",variant:"secondary",children:e("{count} messages",{count:i.length})})]}),o!==null&&t(se,{error:p,testId:"mail-error"}),o===null&&!w&&i.length===0&&t(oe,{description:e("Email your app sends in dev is captured here — nothing is delivered."),icon:n("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:[t("path",{d:"M4 5h16v14H4z"}),t("path",{d:"m4 6 8 6 8-6"})]}),testId:"mail-empty",title:e("No captured email.")}),i.length>0&&n("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-[minmax(0,22rem)_1fr]","data-testid":"mail-reader",children:[n("div",{className:"flex flex-col gap-2",children:[t(ne,{"aria-label":e("Search messages"),"data-testid":"mail-search",onChange:C,placeholder:e("Filter messages"),type:"search",value:O}),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:B.map(a=>{const h=a.id===s?.id;return t("li",{children:n("button",{className:`flex w-full flex-col items-start gap-0.5 px-3 py-2 text-left text-sm hover:bg-muted/60 ${h?"bg-muted":""}`,"data-active":h,"data-id":a.id,"data-testid":"mail-list-item",onClick:H,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)})})})]}),s!==void 0&&n("div",{className:"flex min-w-0 flex-col gap-3 rounded-xl border border-border bg-card p-4 shadow-xs","data-testid":"mail-detail",children:[n("div",{className:"flex flex-col gap-1",children:[t("h2",{className:"truncate text-base font-semibold","data-testid":"mail-subject",children:s.subject||e("(no subject)")}),n("dl",{className:"grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 text-xs text-muted-foreground",children:[t("dt",{children:e("From")}),t("dd",{className:"truncate font-mono",children:s.from??"—"}),t("dt",{children:e("To")}),t("dd",{className:"truncate font-mono",children:N(s.to)}),s.cc!==void 0&&s.cc.length>0&&n(me,{children:[t("dt",{children:e("Cc")}),t("dd",{className:"truncate font-mono",children:N(s.cc)})]}),t("dt",{children:e("Sent")}),t("dd",{className:"tabular-nums",children:te(s.capturedAt,"—")})]})]}),n("div",{className:"flex flex-wrap items-center gap-2","data-testid":"mail-actions",children:[t(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:x(a)},a))}),n("div",{className:"min-h-[12rem]",children:[c==="html"&&(s.html===void 0?t("p",{className:"text-sm text-muted-foreground",children:e("No HTML body.")}):t("iframe",{className:"h-[24rem] w-full rounded-md border bg-white","data-testid":"mail-preview-html",sandbox:"",srcDoc:Le(s.html),title:e("Email preview")})),c==="text"&&(s.text===void 0?t("p",{className:"text-sm text-muted-foreground",children:e("No text body.")}):t("pre",{className:"overflow-auto whitespace-pre-wrap rounded-md border bg-muted/30 p-3 text-xs","data-testid":"mail-preview-text",children:s.text})),c==="headers"&&(s.headers===void 0||Object.keys(s.headers).length===0?t("p",{className:"text-sm text-muted-foreground",children:e("No headers.")}):t("pre",{className:"overflow-auto whitespace-pre-wrap rounded-md border bg-muted/30 p-3 text-xs","data-testid":"mail-preview-headers",children:Object.entries(s.headers).map(([a,h])=>`${a}: ${h}`).join(`
2
2
  `)}))]})]})]})]})};export{Qe as MailPanel};
@@ -1 +1 @@
1
- import{c as D}from"react/compiler-runtime";import{useState as j}from"react";import{E as K}from"../packem_shared/error-alert-DueSEkt-.mjs";import{B as L}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as F}from"../packem_shared/button-q0UYSmrn.mjs";import{C as O,a as Q}from"../packem_shared/card-By2O8ULa.mjs";import{E as U}from"../packem_shared/empty-state-D7jEML_T.mjs";import{I as q}from"../packem_shared/input-CXhxesPC.mjs";import{T as G,a as J,b as H,c as h,d as X,e as u}from"../packem_shared/table-D0SBiDu-.mjs";import{u as Y}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{useT as Z}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as _}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{h as ee}from"../packem_shared/internal-Df43vQI0.mjs";import{jsx as t,jsxs as x}from"react/jsx-runtime";const te=e=>e==="ok"?"success":e==="failed"?"destructive":e==="expired"?"warning":"secondary",M=e=>e.endpoint??e.id,ge=()=>{const e=D(38),r=Z(),[a,P]=j("all"),[n,V]=j("");let b;e[0]===Symbol.for("react.memo_cache_sentinel")?(b={},e[0]=b):b=e[0];const{data:T,error:i,errorSource:p,isLoading:v,refetch:g}=Y(_.listPushSubscriptions,b);let N;if(e[1]!==T?.subscriptions||e[2]!==i||e[3]!==p||e[4]!==v||e[5]!==a||e[6]!==g||e[7]!==n||e[8]!==r){const I=T?.subscriptions??[],$=n.trim().toLowerCase(),A=I.filter(s=>a!=="all"&&s.kind!==a?!1:$===""?!0:`${M(s)} ${s.userId??""}`.toLowerCase().includes($));let w;e[10]===Symbol.for("react.memo_cache_sentinel")?(w=s=>{V(s.target.value)},e[10]=w):w=e[10];const z=w;let y;e[11]!==g?(y=()=>{g()},e[11]=g,e[12]=y):y=e[12];const B=y;let C;e[13]===Symbol.for("react.memo_cache_sentinel")?(C=["all","web-push","fcm"],e[13]=C):C=e[13];const W=C;let o;e[14]!==a||e[15]!==r?(o=t("div",{className:"flex items-center gap-1","data-testid":"nt-kind-filter",role:"tablist",children:W.map(s=>t(F,{"aria-selected":a===s,"data-testid":`nt-kind-${s}`,onClick:()=>{P(s)},role:"tab",size:"sm",type:"button",variant:a===s?"secondary":"ghost",children:s==="all"?r("All"):s},s))}),e[14]=a,e[15]=r,e[16]=o):o=e[16];let l;e[17]!==r?(l=r("Filter devices"),e[17]=r,e[18]=l):l=e[18];let d;e[19]!==r?(d=r("filter endpoint, user"),e[19]=r,e[20]=d):d=e[20];let c;e[21]!==n||e[22]!==l||e[23]!==d?(c=t(q,{"aria-label":l,className:"h-8 w-56","data-testid":"nt-search",onChange:z,placeholder:d,value:n}),e[21]=n,e[22]=l,e[23]=d,e[24]=c):c=e[24];let m;e[25]!==r?(m=r("Refresh"),e[25]=r,e[26]=m):m=e[26];let f;e[27]!==B||e[28]!==m?(f=t(F,{className:"ml-auto","data-testid":"nt-refresh",onClick:B,size:"sm",type:"button",variant:"outline",children:m}),e[27]=B,e[28]=m,e[29]=f):f=e[29];const E=I.length>0&&t(L,{"data-testid":"nt-count",variant:"secondary",children:r("{count} devices",{count:I.length})});let k;e[30]!==f||e[31]!==E||e[32]!==o||e[33]!==c?(k=x("div",{className:"flex flex-wrap items-center gap-2",children:[o,c,f,E]}),e[30]=f,e[31]=E,e[32]=o,e[33]=c,e[34]=k):k=e[34];let S;e[35]!==i||e[36]!==p?(S=i!==null&&t(K,{error:p,testId:"nt-error"}),e[35]=i,e[36]=p,e[37]=S):S=e[37],N=x("div",{className:"flex flex-col gap-4","data-testid":"lunora-notifications",children:[k,S,i===null&&!v&&A.length===0&&t(U,{description:r("Registered Web Push / FCM devices appear here. Configure lunora/notify.ts with defineNotify({ store }) and register a device with ctx.push.register(...)."),icon:t("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:t("path",{d:"M15 17h5l-1.4-1.4A2 2 0 0 1 18 14.2V11a6 6 0 0 0-4-5.7V5a2 2 0 1 0-4 0v.3A6 6 0 0 0 6 11v3.2a2 2 0 0 1-.6 1.4L4 17h5m6 0v1a3 3 0 1 1-6 0v-1m6 0H9"})}),testId:"nt-empty",title:r("No registered devices.")}),A.length>0&&t(O,{className:"overflow-hidden py-0",children:t(Q,{className:"max-h-[30rem] overflow-auto px-0",children:x(G,{"data-testid":"nt-table",children:[t(J,{children:x(H,{children:[t(h,{children:r("kind")}),t(h,{children:r("endpoint")}),t(h,{children:r("user")}),t(h,{children:r("last seen")}),t(h,{children:r("status")}),t(h,{children:r("error")})]})}),t(X,{children:A.map(s=>{const R=M(s);return x(H,{"data-testid":"nt-row",children:[t(u,{children:t(L,{variant:"outline",children:s.kind})}),t(u,{className:"max-w-[28ch] truncate font-mono text-xs",title:R,children:R}),t(u,{className:"max-w-[16ch] truncate font-mono text-xs",children:s.userId??t("span",{className:"text-muted-foreground",children:"—"})}),t(u,{className:"text-muted-foreground tabular-nums",children:ee(s.lastSeenAt,"—")}),t(u,{children:t(L,{"data-testid":`nt-status-${s.id}`,variant:te(s.lastStatus),children:s.lastStatus??r("n/a")})}),t(u,{className:"max-w-[28ch] truncate font-mono text-xs text-muted-foreground",title:s.lastError??void 0,children:s.lastError??t("span",{className:"text-muted-foreground",children:"—"})})]},s.id)})})]})})})]}),e[1]=T?.subscriptions,e[2]=i,e[3]=p,e[4]=v,e[5]=a,e[6]=g,e[7]=n,e[8]=r,e[9]=N}else N=e[9];return N};export{ge as default};
1
+ import{c as D}from"react/compiler-runtime";import{useState as j}from"react";import{E as K}from"../packem_shared/error-alert-DAsOWnCL.mjs";import{B as L}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as F}from"../packem_shared/button-q0UYSmrn.mjs";import{C as O,a as Q}from"../packem_shared/card-By2O8ULa.mjs";import{E as U}from"../packem_shared/empty-state-D7jEML_T.mjs";import{I as q}from"../packem_shared/input-CXhxesPC.mjs";import{T as G,a as J,b as H,c as h,d as X,e as u}from"../packem_shared/table-D0SBiDu-.mjs";import{u as Y}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{useT as Z}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as _}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{h as ee}from"../packem_shared/internal-Df43vQI0.mjs";import{jsx as t,jsxs as x}from"react/jsx-runtime";const te=e=>e==="ok"?"success":e==="failed"?"destructive":e==="expired"?"warning":"secondary",M=e=>e.endpoint??e.id,ge=()=>{const e=D(38),r=Z(),[a,P]=j("all"),[n,V]=j("");let b;e[0]===Symbol.for("react.memo_cache_sentinel")?(b={},e[0]=b):b=e[0];const{data:T,error:i,errorSource:p,isLoading:v,refetch:g}=Y(_.listPushSubscriptions,b);let N;if(e[1]!==T?.subscriptions||e[2]!==i||e[3]!==p||e[4]!==v||e[5]!==a||e[6]!==g||e[7]!==n||e[8]!==r){const I=T?.subscriptions??[],$=n.trim().toLowerCase(),A=I.filter(s=>a!=="all"&&s.kind!==a?!1:$===""?!0:`${M(s)} ${s.userId??""}`.toLowerCase().includes($));let w;e[10]===Symbol.for("react.memo_cache_sentinel")?(w=s=>{V(s.target.value)},e[10]=w):w=e[10];const z=w;let y;e[11]!==g?(y=()=>{g()},e[11]=g,e[12]=y):y=e[12];const B=y;let C;e[13]===Symbol.for("react.memo_cache_sentinel")?(C=["all","web-push","fcm"],e[13]=C):C=e[13];const W=C;let o;e[14]!==a||e[15]!==r?(o=t("div",{className:"flex items-center gap-1","data-testid":"nt-kind-filter",role:"tablist",children:W.map(s=>t(F,{"aria-selected":a===s,"data-testid":`nt-kind-${s}`,onClick:()=>{P(s)},role:"tab",size:"sm",type:"button",variant:a===s?"secondary":"ghost",children:s==="all"?r("All"):s},s))}),e[14]=a,e[15]=r,e[16]=o):o=e[16];let l;e[17]!==r?(l=r("Filter devices"),e[17]=r,e[18]=l):l=e[18];let d;e[19]!==r?(d=r("filter endpoint, user"),e[19]=r,e[20]=d):d=e[20];let c;e[21]!==n||e[22]!==l||e[23]!==d?(c=t(q,{"aria-label":l,className:"h-8 w-56","data-testid":"nt-search",onChange:z,placeholder:d,value:n}),e[21]=n,e[22]=l,e[23]=d,e[24]=c):c=e[24];let m;e[25]!==r?(m=r("Refresh"),e[25]=r,e[26]=m):m=e[26];let f;e[27]!==B||e[28]!==m?(f=t(F,{className:"ml-auto","data-testid":"nt-refresh",onClick:B,size:"sm",type:"button",variant:"outline",children:m}),e[27]=B,e[28]=m,e[29]=f):f=e[29];const E=I.length>0&&t(L,{"data-testid":"nt-count",variant:"secondary",children:r("{count} devices",{count:I.length})});let k;e[30]!==f||e[31]!==E||e[32]!==o||e[33]!==c?(k=x("div",{className:"flex flex-wrap items-center gap-2",children:[o,c,f,E]}),e[30]=f,e[31]=E,e[32]=o,e[33]=c,e[34]=k):k=e[34];let S;e[35]!==i||e[36]!==p?(S=i!==null&&t(K,{error:p,testId:"nt-error"}),e[35]=i,e[36]=p,e[37]=S):S=e[37],N=x("div",{className:"flex flex-col gap-4","data-testid":"lunora-notifications",children:[k,S,i===null&&!v&&A.length===0&&t(U,{description:r("Registered Web Push / FCM devices appear here. Configure lunora/notify.ts with defineNotify({ store }) and register a device with ctx.push.register(...)."),icon:t("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:t("path",{d:"M15 17h5l-1.4-1.4A2 2 0 0 1 18 14.2V11a6 6 0 0 0-4-5.7V5a2 2 0 1 0-4 0v.3A6 6 0 0 0 6 11v3.2a2 2 0 0 1-.6 1.4L4 17h5m6 0v1a3 3 0 1 1-6 0v-1m6 0H9"})}),testId:"nt-empty",title:r("No registered devices.")}),A.length>0&&t(O,{className:"overflow-hidden py-0",children:t(Q,{className:"max-h-[30rem] overflow-auto px-0",children:x(G,{"data-testid":"nt-table",children:[t(J,{children:x(H,{children:[t(h,{children:r("kind")}),t(h,{children:r("endpoint")}),t(h,{children:r("user")}),t(h,{children:r("last seen")}),t(h,{children:r("status")}),t(h,{children:r("error")})]})}),t(X,{children:A.map(s=>{const R=M(s);return x(H,{"data-testid":"nt-row",children:[t(u,{children:t(L,{variant:"outline",children:s.kind})}),t(u,{className:"max-w-[28ch] truncate font-mono text-xs",title:R,children:R}),t(u,{className:"max-w-[16ch] truncate font-mono text-xs",children:s.userId??t("span",{className:"text-muted-foreground",children:"—"})}),t(u,{className:"text-muted-foreground tabular-nums",children:ee(s.lastSeenAt,"—")}),t(u,{children:t(L,{"data-testid":`nt-status-${s.id}`,variant:te(s.lastStatus),children:s.lastStatus??r("n/a")})}),t(u,{className:"max-w-[28ch] truncate font-mono text-xs text-muted-foreground",title:s.lastError??void 0,children:s.lastError??t("span",{className:"text-muted-foreground",children:"—"})})]},s.id)})})]})})})]}),e[1]=T?.subscriptions,e[2]=i,e[3]=p,e[4]=v,e[5]=a,e[6]=g,e[7]=n,e[8]=r,e[9]=N}else N=e[9];return N};export{ge as default};
@@ -1 +1 @@
1
- import{c as u}from"react/compiler-runtime";import{u as h}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{useT as m}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as p}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{A as f}from"../packem_shared/advisor-view-DzI2RQhY.mjs";import{jsx as R}from"react/jsx-runtime";const k=(e,s)=>({"admin-token-weak":e("Weak admin token"),"auth-secret-weak":e("Weak auth secret"),"cookies-insecure":e("Session cookies are not Secure"),"cors-wildcard-credentials":e("Wildcard CORS with credentials"),"csrf-disabled":e("CSRF/origin guard is off"),"dev-args-unredacted":e("Request log keeps un-redacted args"),"security-headers-disabled":e("Security headers are off"),"ws-gate-open":e("User subscriptions are ungated")})[s.kind],g=e=>Array.isArray(e.findings)?e.findings:[],S=e=>({"admin-token-weak":"LUNORA_ADMIN_TOKEN","auth-secret-weak":"AUTH_SECRET","cookies-insecure":"BETTER_AUTH_URL","cors-wildcard-credentials":"LUNORA_ALLOWED_ORIGINS","csrf-disabled":"LUNORA_SECURITY_CSRF","dev-args-unredacted":"request log","security-headers-disabled":"LUNORA_SECURITY_HEADERS","ws-gate-open":"LUNORA_WS_BEARER"})[e.kind],A=(e,s)=>({"admin-token-weak":e("Your admin token is {length} characters — use at least {min} for a brute-force-resistant secret.",{length:s.detail?.length,min:s.detail?.min}),"auth-secret-weak":e("Your auth secret is {length} characters — use at least {min} (e.g. `openssl rand -hex 32`) to sign sessions safely.",{length:s.detail?.length,min:s.detail?.min}),"cookies-insecure":e("BETTER_AUTH_URL is a plaintext http:// origin, so session cookies cannot be Secure and ride in cleartext. Serve auth over https:// in production."),"cors-wildcard-credentials":e("LUNORA_ALLOWED_ORIGINS includes a wildcard while credentials are allowed — browsers reject this and it defeats the allowlist. Name explicit origins instead of *."),"csrf-disabled":e("LUNORA_SECURITY_CSRF is off, so cross-origin state-changing cookie requests are not blocked. Re-enable it in production to keep mutations un-forgeable."),"dev-args-unredacted":e("This worker reports a development environment, so the request log stores raw args and identity. Confirm it isn't a mislabeled production deploy."),"security-headers-disabled":e("LUNORA_SECURITY_HEADERS is off, so HSTS, CSP, nosniff, and frame-options are not applied. Re-enable the baseline headers in production."),"ws-gate-open":e("LUNORA_WS_BEARER is unset, so the WebSocket upgrade gate is open: anyone who can reach the worker can open a socket and run ordinary user subscriptions. Admin subscriptions are unaffected — they need the admin token. Set it if subscribers should present a shared credential.")})[s.kind],T=()=>{const e=u(8),s=m();let t;e[0]===Symbol.for("react.memo_cache_sentinel")?(t={},e[0]=t):t=e[0];const{data:i,error:o,errorSource:d}=h(p.getSecurityAudit,t);let a;if(e[1]!==i||e[2]!==s){const l=i===void 0?null:g(i);a=l===null?null:l.map(r=>({description:A(s,r),entity:S(r),issueType:k(s,r),key:r.kind,level:r.level})),e[1]=i,e[2]=s,e[3]=a}else a=e[3];const c=a;let n;return e[4]!==o||e[5]!==d||e[6]!==c?(n=R(f,{error:o,errorSource:d,rows:c,testId:"lunora-security-advisor"}),e[4]=o,e[5]=d,e[6]=c,e[7]=n):n=e[7],n};export{T as default};
1
+ import{c as u}from"react/compiler-runtime";import{u as h}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{useT as m}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as p}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{A as f}from"../packem_shared/advisor-view-y4cW5JcX.mjs";import{jsx as R}from"react/jsx-runtime";const k=(e,s)=>({"admin-token-weak":e("Weak admin token"),"auth-secret-weak":e("Weak auth secret"),"cookies-insecure":e("Session cookies are not Secure"),"cors-wildcard-credentials":e("Wildcard CORS with credentials"),"csrf-disabled":e("CSRF/origin guard is off"),"dev-args-unredacted":e("Request log keeps un-redacted args"),"security-headers-disabled":e("Security headers are off"),"ws-gate-open":e("User subscriptions are ungated")})[s.kind],g=e=>Array.isArray(e.findings)?e.findings:[],S=e=>({"admin-token-weak":"LUNORA_ADMIN_TOKEN","auth-secret-weak":"AUTH_SECRET","cookies-insecure":"BETTER_AUTH_URL","cors-wildcard-credentials":"LUNORA_ALLOWED_ORIGINS","csrf-disabled":"LUNORA_SECURITY_CSRF","dev-args-unredacted":"request log","security-headers-disabled":"LUNORA_SECURITY_HEADERS","ws-gate-open":"LUNORA_WS_BEARER"})[e.kind],A=(e,s)=>({"admin-token-weak":e("Your admin token is {length} characters — use at least {min} for a brute-force-resistant secret.",{length:s.detail?.length,min:s.detail?.min}),"auth-secret-weak":e("Your auth secret is {length} characters — use at least {min} (e.g. `openssl rand -hex 32`) to sign sessions safely.",{length:s.detail?.length,min:s.detail?.min}),"cookies-insecure":e("BETTER_AUTH_URL is a plaintext http:// origin, so session cookies cannot be Secure and ride in cleartext. Serve auth over https:// in production."),"cors-wildcard-credentials":e("LUNORA_ALLOWED_ORIGINS includes a wildcard while credentials are allowed — browsers reject this and it defeats the allowlist. Name explicit origins instead of *."),"csrf-disabled":e("LUNORA_SECURITY_CSRF is off, so cross-origin state-changing cookie requests are not blocked. Re-enable it in production to keep mutations un-forgeable."),"dev-args-unredacted":e("This worker reports a development environment, so the request log stores raw args and identity. Confirm it isn't a mislabeled production deploy."),"security-headers-disabled":e("LUNORA_SECURITY_HEADERS is off, so HSTS, CSP, nosniff, and frame-options are not applied. Re-enable the baseline headers in production."),"ws-gate-open":e("LUNORA_WS_BEARER is unset, so the WebSocket upgrade gate is open: anyone who can reach the worker can open a socket and run ordinary user subscriptions. Admin subscriptions are unaffected — they need the admin token. Set it if subscribers should present a shared credential.")})[s.kind],T=()=>{const e=u(8),s=m();let t;e[0]===Symbol.for("react.memo_cache_sentinel")?(t={},e[0]=t):t=e[0];const{data:i,error:o,errorSource:d}=h(p.getSecurityAudit,t);let a;if(e[1]!==i||e[2]!==s){const l=i===void 0?null:g(i);a=l===null?null:l.map(r=>({description:A(s,r),entity:S(r),issueType:k(s,r),key:r.kind,level:r.level})),e[1]=i,e[2]=s,e[3]=a}else a=e[3];const c=a;let n;return e[4]!==o||e[5]!==d||e[6]!==c?(n=R(f,{error:o,errorSource:d,rows:c,testId:"lunora-security-advisor"}),e[4]=o,e[5]=d,e[6]=c,e[7]=n):n=e[7],n};export{T as default};
@@ -1 +1 @@
1
- import{c as G}from"react/compiler-runtime";import{E as X}from"../packem_shared/error-alert-DueSEkt-.mjs";import{B as Y}from"../packem_shared/badge-r_5B4LHP.mjs";import{C as M,a as P}from"../packem_shared/card-By2O8ULa.mjs";import{T as Z,a as ee,b as J,c as Q,d as te,e as W}from"../packem_shared/table-D0SBiDu-.mjs";import{u as re}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{useT as se}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as le}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{C as ne}from"../packem_shared/cf-links-CBJ5SywP.mjs";import{r as ae,u as ie,s as oe}from"../packem_shared/shortcuts-B9gDaXmw.mjs";import{jsxs as d,jsx as r}from"react/jsx-runtime";const de={binding:"outline",secret:"destructive",var:"secondary"},ce=(s,e)=>{if(s===void 0)return[];const u=[];return s.workerUrl!==void 0&&u.push({label:e("URL"),value:s.workerUrl}),s.environment!==void 0&&u.push({label:e("Environment"),value:s.environment}),s.deploymentId!==void 0&&u.push({label:e("Deployment"),value:s.deploymentId}),s.versionTag!==void 0&&u.push({label:e("Version"),value:s.versionTag}),u},z=s=>{const e=G(18),{modifier:u,name:t,label:p}=s,F=ie();let b;e[0]!==t?(b=a=>{if(!["Escape","Tab"].includes(a.key)){if(a.shiftKey){a.preventDefault();return}a.preventDefault(),oe(t,a.key)}},e[0]=t,e[1]=b):b=e[1];const c=b,m=`set-shortcut-${t}`;let f;e[2]!==p?(f=r("dt",{className:"text-muted-foreground",children:p}),e[2]=p,e[3]=f):f=e[3];let h;e[4]!==u?(h=r("kbd",{className:"rounded border border-border px-1.5 py-0.5 font-mono text-[11px] text-muted-foreground",children:u}),e[4]=u,e[5]=h):h=e[5];const n=`set-shortcut-input-${t}`,x=F[t];let i;e[6]!==p||e[7]!==c||e[8]!==n||e[9]!==x?(i=r("input",{"aria-label":p,className:"h-7 w-12 rounded-md border border-border bg-background text-center font-mono text-xs uppercase outline-none focus-visible:border-ring","data-testid":n,onKeyDown:c,readOnly:!0,value:x}),e[6]=p,e[7]=c,e[8]=n,e[9]=x,e[10]=i):i=e[10];let l;e[11]!==h||e[12]!==i?(l=d("dd",{className:"flex items-center gap-1.5",children:[h,i]}),e[11]=h,e[12]=i,e[13]=l):l=e[13];let o;return e[14]!==m||e[15]!==f||e[16]!==l?(o=d("div",{className:"contents","data-testid":m,children:[f,l]}),e[14]=m,e[15]=f,e[16]=l,e[17]=o):o=e[17],o},Ce=s=>{const e=G(85),{initialShardKey:u}=s,t=se();let p;e[0]===Symbol.for("react.memo_cache_sentinel")?(p={},e[0]=p):p=e[0];const F=u??"";let b;e[1]!==F?(b={shardKey:F},e[1]=F,e[2]=b):b=e[2];const{data:c,error:m,errorSource:f,isLoading:h}=re(le.getSettings,p,b);let n,x,i,l,o,a,g;if(e[3]!==m||e[4]!==f||e[5]!==c?.deploy||e[6]!==c?.settings||e[7]!==t){const q=ce(c?.deploy,t);let H;e[15]!==c?.settings?(H=c?.settings??[],e[15]=c?.settings,e[16]=H):H=e[16],n=H,x="flex flex-col gap-4",i="lunora-settings";let j;e[17]!==t?(j=t("Open in Cloudflare"),e[17]=t,e[18]=j):j=e[18],e[19]!==j?(l=r("div",{className:"flex flex-wrap items-center gap-3",children:r("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"set-cf-link",href:ne,rel:"noreferrer",target:"_blank",children:j})}),e[19]=j,e[20]=l):l=e[20];let B;e[21]!==t?(B=t("View-only — values are masked. Edit vars, secrets, and bindings in wrangler or the Cloudflare dashboard."),e[21]=t,e[22]=B):B=e[22],e[23]!==B?(o=r("p",{className:"text-sm text-muted-foreground","data-testid":"set-readonly-note",children:B}),e[23]=B,e[24]=o):o=e[24],e[25]!==m||e[26]!==f?(a=m!==null&&r(X,{error:f,testId:"set-error"}),e[25]=m,e[26]=f,e[27]=a):a=e[27],g=q.length>0&&d(M,{className:"py-0","data-testid":"set-deploy",children:[r("header",{className:"border-b border-border px-4 py-3",children:r("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:t("Deployment")})}),r(P,{className:"py-3",children:r("dl",{className:"grid grid-cols-[8rem_minmax(0,1fr)] gap-x-4 gap-y-1 text-sm",children:q.map(me)})})]}),e[3]=m,e[4]=f,e[5]=c?.deploy,e[6]=c?.settings,e[7]=t,e[8]=n,e[9]=x,e[10]=i,e[11]=l,e[12]=o,e[13]=a,e[14]=g}else n=e[8],x=e[9],i=e[10],l=e[11],o=e[12],a=e[13],g=e[14];let N;e[28]!==t?(N=t("Keyboard shortcuts"),e[28]=t,e[29]=N):N=e[29];let v;e[30]!==N?(v=r("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:N}),e[30]=N,e[31]=v):v=e[31];let y;e[32]!==t?(y=t("Reset"),e[32]=t,e[33]=y):y=e[33];let k;e[34]!==y?(k=r("button",{className:"rounded px-1 text-[11px] text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:text-foreground","data-testid":"set-shortcut-reset",onClick:ae,type:"button",children:y}),e[34]=y,e[35]=k):k=e[35];let w;e[36]!==v||e[37]!==k?(w=d("header",{className:"flex items-center justify-between border-b border-border px-4 py-3",children:[v,k]}),e[36]=v,e[37]=k,e[38]=w):w=e[38];let C;e[39]!==t?(C=t("Command palette"),e[39]=t,e[40]=C):C=e[40];let T;e[41]!==C?(T=r(z,{label:C,modifier:"⌘/Ctrl",name:"palette"}),e[41]=C,e[42]=T):T=e[42];let S;e[43]!==t?(S=t("Operation console"),e[43]=t,e[44]=S):S=e[44];let R;e[45]!==S?(R=r(z,{label:S,modifier:"Ctrl",name:"console"}),e[45]=S,e[46]=R):R=e[46];let _;e[47]!==T||e[48]!==R?(_=d("dl",{className:"grid grid-cols-[10rem_minmax(0,1fr)] items-center gap-x-4 gap-y-2 text-sm",children:[T,R]}),e[47]=T,e[48]=R,e[49]=_):_=e[49];let D;e[50]!==t?(D=t("Stored in this browser. Focus a box and press a key to rebind it."),e[50]=t,e[51]=D):D=e[51];let E;e[52]!==D?(E=r("p",{className:"pt-3 text-xs text-muted-foreground",children:D}),e[52]=D,e[53]=E):E=e[53];let I;e[54]!==_||e[55]!==E?(I=d(P,{className:"py-3",children:[_,E]}),e[54]=_,e[55]=E,e[56]=I):I=e[56];let K;e[57]!==w||e[58]!==I?(K=d(M,{className:"py-0","data-testid":"set-preferences",children:[w,I]}),e[57]=w,e[58]=I,e[59]=K):K=e[59];let A;e[60]!==t?(A=t("Environment & bindings"),e[60]=t,e[61]=A):A=e[61];let O;e[62]!==A?(O=r("header",{className:"border-b border-border px-4 py-3",children:r("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:A})}),e[62]=A,e[63]=O):O=e[63];let U;e[64]!==m||e[65]!==h||e[66]!==n.length||e[67]!==t?(U=m===null&&!h&&n.length===0&&r("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"set-empty",children:t("No environment variables or bindings.")}),e[64]=m,e[65]=h,e[66]=n.length,e[67]=t,e[68]=U):U=e[68];let L;e[69]!==n||e[70]!==t?(L=n.length>0&&r(P,{className:"px-0 py-0",children:d(Z,{"data-testid":"set-table",children:[r(ee,{children:d(J,{children:[r(Q,{children:t("name")}),r(Q,{children:t("kind")}),r(Q,{children:t("value")})]})}),r(te,{children:n.map(fe)})]})}),e[69]=n,e[70]=t,e[71]=L):L=e[71];let $;e[72]!==O||e[73]!==U||e[74]!==L?($=d(M,{className:"py-0",children:[O,U,L]}),e[72]=O,e[73]=U,e[74]=L,e[75]=$):$=e[75];let V;return e[76]!==K||e[77]!==$||e[78]!==x||e[79]!==i||e[80]!==l||e[81]!==o||e[82]!==a||e[83]!==g?(V=d("div",{className:x,"data-testid":i,children:[l,o,a,g,K,$]}),e[76]=K,e[77]=$,e[78]=x,e[79]=i,e[80]=l,e[81]=o,e[82]=a,e[83]=g,e[84]=V):V=e[84],V};function me(s){return d("div",{className:"contents","data-testid":"set-deploy-row",children:[r("dt",{className:"text-muted-foreground",children:s.label}),r("dd",{className:"truncate font-mono text-xs",title:s.value,children:s.value})]},s.label)}function fe(s){return d(J,{"data-testid":"set-row",children:[r(W,{className:"font-mono text-xs font-medium",children:s.name}),r(W,{children:r(Y,{variant:de[s.kind],children:s.bindingType??s.kind})}),r(W,{className:"max-w-[28ch] truncate font-mono text-xs text-muted-foreground",children:s.value??r("span",{className:"text-muted-foreground",children:"—"})})]},s.name)}export{Ce as SettingsPanel};
1
+ import{c as G}from"react/compiler-runtime";import{E as X}from"../packem_shared/error-alert-DAsOWnCL.mjs";import{B as Y}from"../packem_shared/badge-r_5B4LHP.mjs";import{C as M,a as P}from"../packem_shared/card-By2O8ULa.mjs";import{T as Z,a as ee,b as J,c as Q,d as te,e as W}from"../packem_shared/table-D0SBiDu-.mjs";import{u as re}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{useT as se}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as le}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{C as ne}from"../packem_shared/cf-links-CBJ5SywP.mjs";import{r as ae,u as ie,s as oe}from"../packem_shared/shortcuts-B9gDaXmw.mjs";import{jsxs as d,jsx as r}from"react/jsx-runtime";const de={binding:"outline",secret:"destructive",var:"secondary"},ce=(s,e)=>{if(s===void 0)return[];const u=[];return s.workerUrl!==void 0&&u.push({label:e("URL"),value:s.workerUrl}),s.environment!==void 0&&u.push({label:e("Environment"),value:s.environment}),s.deploymentId!==void 0&&u.push({label:e("Deployment"),value:s.deploymentId}),s.versionTag!==void 0&&u.push({label:e("Version"),value:s.versionTag}),u},z=s=>{const e=G(18),{modifier:u,name:t,label:p}=s,F=ie();let b;e[0]!==t?(b=a=>{if(!["Escape","Tab"].includes(a.key)){if(a.shiftKey){a.preventDefault();return}a.preventDefault(),oe(t,a.key)}},e[0]=t,e[1]=b):b=e[1];const c=b,m=`set-shortcut-${t}`;let f;e[2]!==p?(f=r("dt",{className:"text-muted-foreground",children:p}),e[2]=p,e[3]=f):f=e[3];let h;e[4]!==u?(h=r("kbd",{className:"rounded border border-border px-1.5 py-0.5 font-mono text-[11px] text-muted-foreground",children:u}),e[4]=u,e[5]=h):h=e[5];const n=`set-shortcut-input-${t}`,x=F[t];let i;e[6]!==p||e[7]!==c||e[8]!==n||e[9]!==x?(i=r("input",{"aria-label":p,className:"h-7 w-12 rounded-md border border-border bg-background text-center font-mono text-xs uppercase outline-none focus-visible:border-ring","data-testid":n,onKeyDown:c,readOnly:!0,value:x}),e[6]=p,e[7]=c,e[8]=n,e[9]=x,e[10]=i):i=e[10];let l;e[11]!==h||e[12]!==i?(l=d("dd",{className:"flex items-center gap-1.5",children:[h,i]}),e[11]=h,e[12]=i,e[13]=l):l=e[13];let o;return e[14]!==m||e[15]!==f||e[16]!==l?(o=d("div",{className:"contents","data-testid":m,children:[f,l]}),e[14]=m,e[15]=f,e[16]=l,e[17]=o):o=e[17],o},Ce=s=>{const e=G(85),{initialShardKey:u}=s,t=se();let p;e[0]===Symbol.for("react.memo_cache_sentinel")?(p={},e[0]=p):p=e[0];const F=u??"";let b;e[1]!==F?(b={shardKey:F},e[1]=F,e[2]=b):b=e[2];const{data:c,error:m,errorSource:f,isLoading:h}=re(le.getSettings,p,b);let n,x,i,l,o,a,g;if(e[3]!==m||e[4]!==f||e[5]!==c?.deploy||e[6]!==c?.settings||e[7]!==t){const q=ce(c?.deploy,t);let H;e[15]!==c?.settings?(H=c?.settings??[],e[15]=c?.settings,e[16]=H):H=e[16],n=H,x="flex flex-col gap-4",i="lunora-settings";let j;e[17]!==t?(j=t("Open in Cloudflare"),e[17]=t,e[18]=j):j=e[18],e[19]!==j?(l=r("div",{className:"flex flex-wrap items-center gap-3",children:r("a",{className:"text-sm text-primary underline-offset-4 hover:underline","data-testid":"set-cf-link",href:ne,rel:"noreferrer",target:"_blank",children:j})}),e[19]=j,e[20]=l):l=e[20];let B;e[21]!==t?(B=t("View-only — values are masked. Edit vars, secrets, and bindings in wrangler or the Cloudflare dashboard."),e[21]=t,e[22]=B):B=e[22],e[23]!==B?(o=r("p",{className:"text-sm text-muted-foreground","data-testid":"set-readonly-note",children:B}),e[23]=B,e[24]=o):o=e[24],e[25]!==m||e[26]!==f?(a=m!==null&&r(X,{error:f,testId:"set-error"}),e[25]=m,e[26]=f,e[27]=a):a=e[27],g=q.length>0&&d(M,{className:"py-0","data-testid":"set-deploy",children:[r("header",{className:"border-b border-border px-4 py-3",children:r("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:t("Deployment")})}),r(P,{className:"py-3",children:r("dl",{className:"grid grid-cols-[8rem_minmax(0,1fr)] gap-x-4 gap-y-1 text-sm",children:q.map(me)})})]}),e[3]=m,e[4]=f,e[5]=c?.deploy,e[6]=c?.settings,e[7]=t,e[8]=n,e[9]=x,e[10]=i,e[11]=l,e[12]=o,e[13]=a,e[14]=g}else n=e[8],x=e[9],i=e[10],l=e[11],o=e[12],a=e[13],g=e[14];let N;e[28]!==t?(N=t("Keyboard shortcuts"),e[28]=t,e[29]=N):N=e[29];let v;e[30]!==N?(v=r("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:N}),e[30]=N,e[31]=v):v=e[31];let y;e[32]!==t?(y=t("Reset"),e[32]=t,e[33]=y):y=e[33];let k;e[34]!==y?(k=r("button",{className:"rounded px-1 text-[11px] text-muted-foreground outline-none transition-colors hover:text-foreground focus-visible:text-foreground","data-testid":"set-shortcut-reset",onClick:ae,type:"button",children:y}),e[34]=y,e[35]=k):k=e[35];let w;e[36]!==v||e[37]!==k?(w=d("header",{className:"flex items-center justify-between border-b border-border px-4 py-3",children:[v,k]}),e[36]=v,e[37]=k,e[38]=w):w=e[38];let C;e[39]!==t?(C=t("Command palette"),e[39]=t,e[40]=C):C=e[40];let T;e[41]!==C?(T=r(z,{label:C,modifier:"⌘/Ctrl",name:"palette"}),e[41]=C,e[42]=T):T=e[42];let S;e[43]!==t?(S=t("Operation console"),e[43]=t,e[44]=S):S=e[44];let R;e[45]!==S?(R=r(z,{label:S,modifier:"Ctrl",name:"console"}),e[45]=S,e[46]=R):R=e[46];let _;e[47]!==T||e[48]!==R?(_=d("dl",{className:"grid grid-cols-[10rem_minmax(0,1fr)] items-center gap-x-4 gap-y-2 text-sm",children:[T,R]}),e[47]=T,e[48]=R,e[49]=_):_=e[49];let D;e[50]!==t?(D=t("Stored in this browser. Focus a box and press a key to rebind it."),e[50]=t,e[51]=D):D=e[51];let E;e[52]!==D?(E=r("p",{className:"pt-3 text-xs text-muted-foreground",children:D}),e[52]=D,e[53]=E):E=e[53];let I;e[54]!==_||e[55]!==E?(I=d(P,{className:"py-3",children:[_,E]}),e[54]=_,e[55]=E,e[56]=I):I=e[56];let K;e[57]!==w||e[58]!==I?(K=d(M,{className:"py-0","data-testid":"set-preferences",children:[w,I]}),e[57]=w,e[58]=I,e[59]=K):K=e[59];let A;e[60]!==t?(A=t("Environment & bindings"),e[60]=t,e[61]=A):A=e[61];let O;e[62]!==A?(O=r("header",{className:"border-b border-border px-4 py-3",children:r("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:A})}),e[62]=A,e[63]=O):O=e[63];let U;e[64]!==m||e[65]!==h||e[66]!==n.length||e[67]!==t?(U=m===null&&!h&&n.length===0&&r("p",{className:"px-4 py-8 text-center text-sm text-muted-foreground","data-testid":"set-empty",children:t("No environment variables or bindings.")}),e[64]=m,e[65]=h,e[66]=n.length,e[67]=t,e[68]=U):U=e[68];let L;e[69]!==n||e[70]!==t?(L=n.length>0&&r(P,{className:"px-0 py-0",children:d(Z,{"data-testid":"set-table",children:[r(ee,{children:d(J,{children:[r(Q,{children:t("name")}),r(Q,{children:t("kind")}),r(Q,{children:t("value")})]})}),r(te,{children:n.map(fe)})]})}),e[69]=n,e[70]=t,e[71]=L):L=e[71];let $;e[72]!==O||e[73]!==U||e[74]!==L?($=d(M,{className:"py-0",children:[O,U,L]}),e[72]=O,e[73]=U,e[74]=L,e[75]=$):$=e[75];let V;return e[76]!==K||e[77]!==$||e[78]!==x||e[79]!==i||e[80]!==l||e[81]!==o||e[82]!==a||e[83]!==g?(V=d("div",{className:x,"data-testid":i,children:[l,o,a,g,K,$]}),e[76]=K,e[77]=$,e[78]=x,e[79]=i,e[80]=l,e[81]=o,e[82]=a,e[83]=g,e[84]=V):V=e[84],V};function me(s){return d("div",{className:"contents","data-testid":"set-deploy-row",children:[r("dt",{className:"text-muted-foreground",children:s.label}),r("dd",{className:"truncate font-mono text-xs",title:s.value,children:s.value})]},s.label)}function fe(s){return d(J,{"data-testid":"set-row",children:[r(W,{className:"font-mono text-xs font-medium",children:s.name}),r(W,{children:r(Y,{variant:de[s.kind],children:s.bindingType??s.kind})}),r(W,{className:"max-w-[28ch] truncate font-mono text-xs text-muted-foreground",children:s.value??r("span",{className:"text-muted-foreground",children:"—"})})]},s.name)}export{Ce as SettingsPanel};
@@ -1 +1 @@
1
- import{c as te}from"react/compiler-runtime";import{useState as ae}from"react";import{E as q}from"../packem_shared/error-alert-DueSEkt-.mjs";import{B as A}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as $}from"../packem_shared/button-q0UYSmrn.mjs";import{C as M,a as j}from"../packem_shared/card-By2O8ULa.mjs";import{E as K}from"../packem_shared/empty-state-D7jEML_T.mjs";import{T as L,a as P,b as f,c as o,d as U,e as d}from"../packem_shared/table-D0SBiDu-.mjs";import{u as x}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{useT as G}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as v}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{h as se}from"../packem_shared/internal-Df43vQI0.mjs";import{jsx as e,jsxs as l}from"react/jsx-runtime";const Q="agent_threads",re="agent_messages",D="agent_run_queue",_=100,y=250,ne={},oe={filters:[],limit:_,offset:0,orderBy:{column:"updatedAt",direction:"desc"},skipCount:!0,table:Q},c=(r,t)=>{const a=r[t];return typeof a=="string"?a:void 0},E=(r,t)=>{const a=r[t];return typeof a=="number"?a:void 0},H=r=>{const{usage:t}=r;if(t===null||typeof t!="object")return;const{totalTokens:a}=t;return typeof a=="number"?a:void 0},de=r=>{const{toolCalls:t}=r;return Array.isArray(t)?t.map(a=>a!==null&&typeof a=="object"?a.name:void 0).filter(a=>typeof a=="string"):[]},le=r=>{switch(r){case"awaiting_input":return"warning";case"cancelled":return"warning";case"error":return"destructive";case"running":return"info";default:return"outline"}},ie=r=>{switch(r){case"approved":return"success";case"rejected":return"destructive";default:return"warning"}},ce=r=>{const t=te(3),{fetched:a}=r,u=G();let i;return t[0]!==a||t[1]!==u?(i=a<=y?null:e("p",{className:"text-xs text-muted-foreground","data-testid":"agents-messages-truncated",children:u("Showing the latest {count} messages; older ones are not shown.",{count:y})}),t[0]=a,t[1]=u,t[2]=i):i=t[2],i},Ee=({initialShardKey:r=""})=>{const t=G(),[a,u]=ae(void 0),{data:i}=x(v.listTables,ne,{live:!0,shardKey:r}),z=i!==void 0,h=Array.isArray(i)&&i.some(s=>s.name===Q),O=Array.isArray(i)&&i.some(s=>s.name===D),{data:S,error:V,errorSource:F,liveError:J}=x(v.readTablePage,oe,{enabled:h,live:!0,shardKey:r}),W={filters:[{column:"threadKey",operator:"eq",value:a??""}],limit:y+1,offset:0,orderBy:{column:"seq",direction:"desc"},skipCount:!0,table:re},{data:w}=x(v.readTablePage,{limit:_,offset:0,orderBy:{column:"position",direction:"asc"},skipCount:!0,table:D},{enabled:O,live:!0,shardKey:r}),{data:k,error:X,errorSource:Y}=x(v.readTablePage,W,{enabled:h&&a!==void 0,live:!0,shardKey:r}),b=Array.isArray(S?.rows)?S.rows:[],Z=Array.isArray(w?.rows)?w.rows:[],C=s=>Z.filter(n=>c(n,"threadKey")===s).length,B=Array.isArray(k?.rows)?k.rows:[],I=B.slice(0,y).toReversed(),R=b.find(s=>c(s,"key")===a);let g;return z&&!h?g=e(K,{description:t("No @lunora/agent tables found in this deployment. Add lunora/agents.ts with defineAgent(...) and merge the agent schema extension to run durable AI agents."),testId:"agents-unconfigured",title:t("No agents configured")}):h&&b.length===0?g=e(K,{description:t("No agent has run yet. Start a run with ctx.agents.<name>.run(...) and its thread appears here."),testId:"agents-empty",title:t("No agent threads yet")}):g=l("div",{className:"flex flex-col gap-6",children:[e(M,{className:"overflow-hidden py-0",children:e(j,{className:"px-0",children:l(L,{"data-testid":"agents-threads-table",children:[e(P,{children:l(f,{children:[e(o,{children:t("Agent")}),e(o,{children:t("Key")}),e(o,{children:t("Status")}),e(o,{children:t("Queued")}),e(o,{children:t("Messages")}),e(o,{children:t("Tokens")}),e(o,{children:t("Updated")}),e(o,{"aria-label":t("Actions")})]})}),e(U,{children:b.map(s=>{const n=c(s,"key")??"",m=c(s,"status"),p=H(s);return l(f,{"data-active":n===a?"":void 0,"data-testid":`agents-thread-${n}`,children:[e(d,{className:"font-mono text-xs",children:c(s,"agent")??"—"}),e(d,{className:"font-mono text-xs text-muted-foreground",children:n}),e(d,{children:e(A,{"data-testid":`agents-thread-status-${n}`,variant:le(m),children:m??"—"})}),e(d,{className:"tabular-nums",children:C(n)===0?e("span",{className:"text-muted-foreground",children:"—"}):e(A,{"data-testid":`agents-thread-queued-${n}`,variant:"warning",children:C(n)})}),e(d,{className:"tabular-nums",children:E(s,"messageCount")??"—"}),e(d,{className:"tabular-nums text-muted-foreground",children:p??"—"}),e(d,{className:"text-muted-foreground tabular-nums",children:se(E(s,"updatedAt"),"—")}),e(d,{className:"text-right",children:e($,{"data-testid":`agents-thread-open-${n}`,onClick:()=>{u(n)},size:"sm",type:"button",variant:"outline",children:t("Timeline")})})]},n)})})]})})}),X!==null&&e(q,{error:Y,testId:"agents-messages-error"}),a!==void 0&&e(M,{className:"overflow-hidden py-0","data-testid":"agents-thread-detail",children:l(j,{className:"flex flex-col gap-3 px-4 py-3",children:[l("div",{className:"flex items-center justify-between gap-2",children:[l("span",{className:"font-mono text-xs",children:[t("Timeline")," · ",a,R!==void 0&&l("span",{className:"text-muted-foreground",children:[" · ",t("Usage"),": ",H(R)??0," ",t("Tokens")]})]}),e($,{"data-testid":"agents-thread-detail-close",onClick:()=>{u(void 0)},size:"xs",type:"button",variant:"ghost",children:t("Close")})]}),e(ce,{fetched:B.length}),I.length===0?e("p",{className:"text-xs text-muted-foreground",children:t("This thread has no messages yet.")}):l(L,{"data-testid":"agents-messages-table",children:[e(P,{children:l(f,{children:[e(o,{children:t("Role")}),e(o,{children:t("Content")}),e(o,{children:t("Tool")}),e(o,{children:t("Approval")})]})}),e(U,{children:I.map((s,n)=>{const m=c(s,"role")??"—",p=de(s),ee=c(s,"toolName"),N=c(s,"status"),T=E(s,"seq")??n;return l(f,{"data-testid":`agents-message-${String(T)}`,children:[e(d,{className:"font-mono text-xs align-top text-muted-foreground",children:m}),e(d,{className:"max-w-md font-mono text-xs whitespace-pre-wrap break-words",children:c(s,"content")??"—"}),e(d,{className:"font-mono text-xs align-top text-muted-foreground",children:ee??(p.length>0?p.join(", "):"—")}),e(d,{className:"align-top",children:N===void 0?e("span",{className:"text-xs text-muted-foreground",children:"—"}):e(A,{"data-testid":`agents-message-approval-${String(T)}`,variant:ie(N),children:N})})]},c(s,"messageKey")??`${m}:${String(T)}`)})})]})]})})]}),l("div",{className:"flex flex-col gap-6","data-testid":"lunora-agents-panel",children:[V!==null&&e(q,{error:F,testId:"agents-error"}),e("p",{className:"text-sm text-muted-foreground",children:t("Agents run as durable workflows. Each run persists a thread of assistant and tool messages; select a thread to inspect its timeline, tool calls, approvals, and token usage.")}),J!==void 0&&e("p",{className:"text-xs text-amber-600 dark:text-amber-500","data-testid":"agents-live-error",role:"alert",children:t("Live updates unavailable; showing the last evaluation.")}),g]})};export{Ee as default};
1
+ import{c as te}from"react/compiler-runtime";import{useState as ae}from"react";import{E as q}from"../packem_shared/error-alert-DAsOWnCL.mjs";import{B as A}from"../packem_shared/badge-r_5B4LHP.mjs";import{B as $}from"../packem_shared/button-q0UYSmrn.mjs";import{C as M,a as j}from"../packem_shared/card-By2O8ULa.mjs";import{E as K}from"../packem_shared/empty-state-D7jEML_T.mjs";import{T as L,a as P,b as f,c as o,d as U,e as d}from"../packem_shared/table-D0SBiDu-.mjs";import{u as x}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{useT as G}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as v}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{h as se}from"../packem_shared/internal-Df43vQI0.mjs";import{jsx as e,jsxs as l}from"react/jsx-runtime";const Q="agent_threads",re="agent_messages",D="agent_run_queue",_=100,y=250,ne={},oe={filters:[],limit:_,offset:0,orderBy:{column:"updatedAt",direction:"desc"},skipCount:!0,table:Q},c=(r,t)=>{const a=r[t];return typeof a=="string"?a:void 0},E=(r,t)=>{const a=r[t];return typeof a=="number"?a:void 0},H=r=>{const{usage:t}=r;if(t===null||typeof t!="object")return;const{totalTokens:a}=t;return typeof a=="number"?a:void 0},de=r=>{const{toolCalls:t}=r;return Array.isArray(t)?t.map(a=>a!==null&&typeof a=="object"?a.name:void 0).filter(a=>typeof a=="string"):[]},le=r=>{switch(r){case"awaiting_input":return"warning";case"cancelled":return"warning";case"error":return"destructive";case"running":return"info";default:return"outline"}},ie=r=>{switch(r){case"approved":return"success";case"rejected":return"destructive";default:return"warning"}},ce=r=>{const t=te(3),{fetched:a}=r,u=G();let i;return t[0]!==a||t[1]!==u?(i=a<=y?null:e("p",{className:"text-xs text-muted-foreground","data-testid":"agents-messages-truncated",children:u("Showing the latest {count} messages; older ones are not shown.",{count:y})}),t[0]=a,t[1]=u,t[2]=i):i=t[2],i},Ee=({initialShardKey:r=""})=>{const t=G(),[a,u]=ae(void 0),{data:i}=x(v.listTables,ne,{live:!0,shardKey:r}),z=i!==void 0,h=Array.isArray(i)&&i.some(s=>s.name===Q),O=Array.isArray(i)&&i.some(s=>s.name===D),{data:S,error:V,errorSource:F,liveError:J}=x(v.readTablePage,oe,{enabled:h,live:!0,shardKey:r}),W={filters:[{column:"threadKey",operator:"eq",value:a??""}],limit:y+1,offset:0,orderBy:{column:"seq",direction:"desc"},skipCount:!0,table:re},{data:w}=x(v.readTablePage,{limit:_,offset:0,orderBy:{column:"position",direction:"asc"},skipCount:!0,table:D},{enabled:O,live:!0,shardKey:r}),{data:k,error:X,errorSource:Y}=x(v.readTablePage,W,{enabled:h&&a!==void 0,live:!0,shardKey:r}),b=Array.isArray(S?.rows)?S.rows:[],Z=Array.isArray(w?.rows)?w.rows:[],C=s=>Z.filter(n=>c(n,"threadKey")===s).length,B=Array.isArray(k?.rows)?k.rows:[],I=B.slice(0,y).toReversed(),R=b.find(s=>c(s,"key")===a);let g;return z&&!h?g=e(K,{description:t("No @lunora/agent tables found in this deployment. Add lunora/agents.ts with defineAgent(...) and merge the agent schema extension to run durable AI agents."),testId:"agents-unconfigured",title:t("No agents configured")}):h&&b.length===0?g=e(K,{description:t("No agent has run yet. Start a run with ctx.agents.<name>.run(...) and its thread appears here."),testId:"agents-empty",title:t("No agent threads yet")}):g=l("div",{className:"flex flex-col gap-6",children:[e(M,{className:"overflow-hidden py-0",children:e(j,{className:"px-0",children:l(L,{"data-testid":"agents-threads-table",children:[e(P,{children:l(f,{children:[e(o,{children:t("Agent")}),e(o,{children:t("Key")}),e(o,{children:t("Status")}),e(o,{children:t("Queued")}),e(o,{children:t("Messages")}),e(o,{children:t("Tokens")}),e(o,{children:t("Updated")}),e(o,{"aria-label":t("Actions")})]})}),e(U,{children:b.map(s=>{const n=c(s,"key")??"",m=c(s,"status"),p=H(s);return l(f,{"data-active":n===a?"":void 0,"data-testid":`agents-thread-${n}`,children:[e(d,{className:"font-mono text-xs",children:c(s,"agent")??"—"}),e(d,{className:"font-mono text-xs text-muted-foreground",children:n}),e(d,{children:e(A,{"data-testid":`agents-thread-status-${n}`,variant:le(m),children:m??"—"})}),e(d,{className:"tabular-nums",children:C(n)===0?e("span",{className:"text-muted-foreground",children:"—"}):e(A,{"data-testid":`agents-thread-queued-${n}`,variant:"warning",children:C(n)})}),e(d,{className:"tabular-nums",children:E(s,"messageCount")??"—"}),e(d,{className:"tabular-nums text-muted-foreground",children:p??"—"}),e(d,{className:"text-muted-foreground tabular-nums",children:se(E(s,"updatedAt"),"—")}),e(d,{className:"text-right",children:e($,{"data-testid":`agents-thread-open-${n}`,onClick:()=>{u(n)},size:"sm",type:"button",variant:"outline",children:t("Timeline")})})]},n)})})]})})}),X!==null&&e(q,{error:Y,testId:"agents-messages-error"}),a!==void 0&&e(M,{className:"overflow-hidden py-0","data-testid":"agents-thread-detail",children:l(j,{className:"flex flex-col gap-3 px-4 py-3",children:[l("div",{className:"flex items-center justify-between gap-2",children:[l("span",{className:"font-mono text-xs",children:[t("Timeline")," · ",a,R!==void 0&&l("span",{className:"text-muted-foreground",children:[" · ",t("Usage"),": ",H(R)??0," ",t("Tokens")]})]}),e($,{"data-testid":"agents-thread-detail-close",onClick:()=>{u(void 0)},size:"xs",type:"button",variant:"ghost",children:t("Close")})]}),e(ce,{fetched:B.length}),I.length===0?e("p",{className:"text-xs text-muted-foreground",children:t("This thread has no messages yet.")}):l(L,{"data-testid":"agents-messages-table",children:[e(P,{children:l(f,{children:[e(o,{children:t("Role")}),e(o,{children:t("Content")}),e(o,{children:t("Tool")}),e(o,{children:t("Approval")})]})}),e(U,{children:I.map((s,n)=>{const m=c(s,"role")??"—",p=de(s),ee=c(s,"toolName"),N=c(s,"status"),T=E(s,"seq")??n;return l(f,{"data-testid":`agents-message-${String(T)}`,children:[e(d,{className:"font-mono text-xs align-top text-muted-foreground",children:m}),e(d,{className:"max-w-md font-mono text-xs whitespace-pre-wrap break-words",children:c(s,"content")??"—"}),e(d,{className:"font-mono text-xs align-top text-muted-foreground",children:ee??(p.length>0?p.join(", "):"—")}),e(d,{className:"align-top",children:N===void 0?e("span",{className:"text-xs text-muted-foreground",children:"—"}):e(A,{"data-testid":`agents-message-approval-${String(T)}`,variant:ie(N),children:N})})]},c(s,"messageKey")??`${m}:${String(T)}`)})})]})]})})]}),l("div",{className:"flex flex-col gap-6","data-testid":"lunora-agents-panel",children:[V!==null&&e(q,{error:F,testId:"agents-error"}),e("p",{className:"text-sm text-muted-foreground",children:t("Agents run as durable workflows. Each run persists a thread of assistant and tool messages; select a thread to inspect its timeline, tool calls, approvals, and token usage.")}),J!==void 0&&e("p",{className:"text-xs text-amber-600 dark:text-amber-500","data-testid":"agents-live-error",role:"alert",children:t("Live updates unavailable; showing the last evaluation.")}),g]})};export{Ee as default};
@@ -1 +1 @@
1
- import{c as E}from"react/compiler-runtime";import{E as de}from"../packem_shared/error-alert-DueSEkt-.mjs";import{ShardInput as ue}from"../packem_shared/ShardInput-C6mjgAh4.mjs";import{S as K}from"../packem_shared/stat-card-BAv73QtB.mjs";import{B}from"../packem_shared/badge-r_5B4LHP.mjs";import{C as D,a as me,b as te,c as se}from"../packem_shared/card-By2O8ULa.mjs";import{E as pe}from"../packem_shared/empty-state-D7jEML_T.mjs";import{c as _,a as oe,b as R,e as M,d as ne,T as re}from"../packem_shared/table-D0SBiDu-.mjs";import{u as X}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{u as fe}from"../packem_shared/use-open-trace-DMVhpnyG.mjs";import{u as he}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as w}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as z}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{h as Te}from"../packem_shared/internal-Df43vQI0.mjs";import{f as $,a as O}from"../packem_shared/metrics-format-1sNGG47R.mjs";import{S as ve}from"../packem_shared/sparkline-B_sPPO_8.mjs";import{jsx as r,jsxs as I,Fragment as ke}from"react/jsx-runtime";const H="gen_ai.usage.input_tokens",W="gen_ai.usage.output_tokens",j="gen_ai.usage.cost",ie="gen_ai.request.model",ye="lunora.usage.cost.source",Ce=new Set(["ai.embed","ai.generate","ai.stream"]),G=6e4,be=1440,le="unknown",q=()=>({calls:0,estimatedCost:0,inputTokens:0,outputTokens:0,providerCost:0}),J=(o,e)=>{const s=o?.[e];return typeof s=="string"&&s!==""?s:void 0},L=(o,e)=>{const s=o?.[e];return typeof s=="number"&&Number.isFinite(s)?s:void 0},Q=o=>J(o,ye)==="provider"?"provider":"estimated",Y=(o,e)=>o.reduce((s,n)=>s+e(n),0),F=o=>o.providerCost+o.estimatedCost,ae=o=>o.estimatedCost>0?o.providerCost>0?"mixed":"estimated":o.providerCost>0?"provider":"none",ce=(o,e)=>({calls:o.calls+e.calls,estimatedCost:o.estimatedCost+e.estimatedCost,inputTokens:o.inputTokens+e.inputTokens,outputTokens:o.outputTokens+e.outputTokens,providerCost:o.providerCost+e.providerCost}),ge=o=>{const e=q();let s=0,n=0,t=0;for(const c of o){const l=Y(c.points,a=>a.sum),i=Y(c.points,a=>a.count);c.name===H?(e.inputTokens+=l,s+=i):c.name===W?(e.outputTokens+=l,n+=i):(t+=i,Q(c.attributes)==="provider"?e.providerCost+=l:e.estimatedCost+=l)}return e.calls=Math.max(s,n,t),e},Ne=(o,e)=>F(e)-F(o)||e.inputTokens+e.outputTokens-(o.inputTokens+o.outputTokens)||o.key.localeCompare(e.key),Z=(o,e)=>{const s=new Map;for(const n of o){const t=e(n);s.set(t,{key:t,...ce(s.get(t)??q(),n)})}return[...s.values()].toSorted(Ne)},xe=o=>(o?.series??[]).filter(e=>e.name===H||e.name===W||e.name===j),Se=o=>J(o.attributes,ie)??le,Ie=o=>{const e=new Map;for(const s of o){const n=Se(s),t=JSON.stringify([s.functionPath,n]),c=e.get(t)??{functionPath:s.functionPath,model:n,series:[]};c.series.push(s),e.set(t,c)}return[...e.values()].map(({functionPath:s,model:n,series:t})=>({functionPath:s,model:n,...ge(t)}))},_e=o=>{const e=new Map;for(const i of o){if(i.name!==j)continue;const a=Q(i.attributes)==="provider";for(const u of i.points){const m=e.get(u.bucketMs)??{bucketMs:u.bucketMs,estimatedCost:0,providerCost:0};a?m.providerCost+=u.sum:m.estimatedCost+=u.sum,e.set(u.bucketMs,m)}}const s=[...e.keys()].toSorted((i,a)=>i-a),n=s[0],t=s.at(-1);if(n===void 0||t===void 0)return[];const c=Math.max(n,t-(be-1)*G),l=[];for(let i=c;i<=t;i+=G)l.push(e.get(i)??{bucketMs:i,estimatedCost:0,providerCost:0});return l},Me=o=>{const e=[];for(const s of o)for(const n of s.spans){if(!Ce.has(n.name))continue;const{attributes:t}=n,c=L(t,j),l=L(t,H),i=L(t,W);e.push({...c===void 0?{}:{cost:c,costSource:Q(t)},functionPath:s.functionPath,...l===void 0?{}:{inputTokens:l},model:J(t,ie)??le,ok:n.ok,...i===void 0?{}:{outputTokens:i},startTs:s.startTs+n.offsetMs,streaming:n.name==="ai.stream",traceId:s.traceId})}return e.toSorted((s,n)=>n.startTs-s.startTs)},Oe=o=>o.map(e=>{const s=e.cost??0;return{calls:1,estimatedCost:e.costSource==="provider"?0:s,functionPath:e.functionPath,inputTokens:e.inputTokens??0,model:e.model,outputTokens:e.outputTokens??0,providerCost:e.costSource==="provider"?s:0}}),Ae=(o,e)=>{const s=xe(o),n=Me(e),t=s.length>0,c=t?Ie(s):Oe(n);let l=q(),i="none";for(const a of c)l=ce(l,a);return t?i="history":n.length>0&&(i="live"),{byFunction:Z(c,a=>a.functionPath),byModel:Z(c,a=>a.model),calls:n,source:i,totals:l,trend:t?_e(s):[]}},Ee=o=>Array.isArray(o?.traces)?o.traces:[],we=25,V=o=>{const e=E(16),{provenance:s,value:n}=o,t=w();if(s==="none"){let m;return e[0]===Symbol.for("react.memo_cache_sentinel")?(m=r("span",{className:"text-muted-foreground",children:"—"}),e[0]=m):m=e[0],m}let c;e[1]!==s||e[2]!==n?(c=s==="provider"?$(n):`~${$(n)}`,e[1]=s,e[2]=n,e[3]=c):c=e[3];let l;e[4]!==c?(l=r("span",{className:"tabular-nums",children:c}),e[4]=c,e[5]=l):l=e[5];let i;e[6]!==s||e[7]!==t?(i=s==="estimated"?r(B,{title:t("Derived from a price table, not reported by the provider."),variant:"warning",children:t("Estimated")}):null,e[6]=s,e[7]=t,e[8]=i):i=e[8];let a;e[9]!==s||e[10]!==t?(a=s==="mixed"?r(B,{title:t("Includes cost derived from a price table, not reported by the provider."),variant:"warning",children:t("Partly estimated")}):null,e[9]=s,e[10]=t,e[11]=a):a=e[11];let u;return e[12]!==l||e[13]!==i||e[14]!==a?(u=I("span",{className:"inline-flex items-center gap-2",children:[l,i,a]}),e[12]=l,e[13]=i,e[14]=a,e[15]=u):u=e[15],u},ee=o=>{const e=E(40),{keyLabel:s,rows:n,testId:t,title:c}=o,l=w();let i;e[0]!==c?(i=r(te,{className:"px-4 py-3",children:r(se,{children:c})}),e[0]=c,e[1]=i):i=e[1];let a;e[2]!==s?(a=r(_,{children:s}),e[2]=s,e[3]=a):a=e[3];let u;e[4]!==l?(u=l("Calls"),e[4]=l,e[5]=u):u=e[5];let m;e[6]!==u?(m=r(_,{className:"text-end",children:u}),e[6]=u,e[7]=m):m=e[7];let T;e[8]!==l?(T=l("Input tokens"),e[8]=l,e[9]=T):T=e[9];let v;e[10]!==T?(v=r(_,{className:"text-end",children:T}),e[10]=T,e[11]=v):v=e[11];let k;e[12]!==l?(k=l("Output tokens"),e[12]=l,e[13]=k):k=e[13];let C;e[14]!==k?(C=r(_,{className:"text-end",children:k}),e[14]=k,e[15]=C):C=e[15];let y;e[16]!==l?(y=l("Cost"),e[16]=l,e[17]=y):y=e[17];let d;e[18]!==y?(d=r(_,{className:"text-end",children:y}),e[18]=y,e[19]=d):d=e[19];let b;e[20]!==d||e[21]!==a||e[22]!==m||e[23]!==v||e[24]!==C?(b=r(oe,{children:I(R,{children:[a,m,v,C,d]})}),e[20]=d,e[21]=a,e[22]=m,e[23]=v,e[24]=C,e[25]=b):b=e[25];let p;if(e[26]!==n||e[27]!==t){let x;e[29]!==t?(x=S=>I(R,{"data-testid":`${t}-row`,children:[r(M,{className:"max-w-[280px] truncate font-mono",title:S.key,children:S.key}),r(M,{className:"text-end tabular-nums",children:O(S.calls)}),r(M,{className:"text-end tabular-nums",children:O(S.inputTokens)}),r(M,{className:"text-end tabular-nums",children:O(S.outputTokens)}),r(M,{className:"text-end",children:r(V,{provenance:ae(S),value:F(S)})})]},S.key),e[29]=t,e[30]=x):x=e[30],p=n.map(x),e[26]=n,e[27]=t,e[28]=p}else p=e[28];let f;e[31]!==p?(f=r(ne,{children:p}),e[31]=p,e[32]=f):f=e[32];let h;e[33]!==b||e[34]!==f?(h=I(re,{children:[b,f]}),e[33]=b,e[34]=f,e[35]=h):h=e[35];let g;return e[36]!==i||e[37]!==h||e[38]!==t?(g=I(D,{className:"gap-0 py-0","data-testid":t,children:[i,h]}),e[36]=i,e[37]=h,e[38]=t,e[39]=g):g=e[39],g},Pe=o=>{const e=E(55),{calls:s,onOpenTrace:n}=o,t=w();let c;e[0]!==t?(c=t("Recent calls"),e[0]=t,e[1]=c):c=e[1];let l;e[2]!==c?(l=r(te,{className:"px-4 py-3",children:r(se,{children:c})}),e[2]=c,e[3]=l):l=e[3];let i;e[4]!==t?(i=t("When"),e[4]=t,e[5]=i):i=e[5];let a;e[6]!==i?(a=r(_,{children:i}),e[6]=i,e[7]=a):a=e[7];let u;e[8]!==t?(u=t("Function"),e[8]=t,e[9]=u):u=e[9];let m;e[10]!==u?(m=r(_,{children:u}),e[10]=u,e[11]=m):m=e[11];let T;e[12]!==t?(T=t("Model"),e[12]=t,e[13]=T):T=e[13];let v;e[14]!==T?(v=r(_,{children:T}),e[14]=T,e[15]=v):v=e[15];let k;e[16]!==t?(k=t("Input tokens"),e[16]=t,e[17]=k):k=e[17];let C;e[18]!==k?(C=r(_,{className:"text-end",children:k}),e[18]=k,e[19]=C):C=e[19];let y;e[20]!==t?(y=t("Output tokens"),e[20]=t,e[21]=y):y=e[21];let d;e[22]!==y?(d=r(_,{className:"text-end",children:y}),e[22]=y,e[23]=d):d=e[23];let b;e[24]!==t?(b=t("Cost"),e[24]=t,e[25]=b):b=e[25];let p;e[26]!==b?(p=r(_,{className:"text-end",children:b}),e[26]=b,e[27]=p):p=e[27];let f;e[28]!==t?(f=t("Trace"),e[28]=t,e[29]=f):f=e[29];let h;e[30]!==f?(h=r(_,{children:f}),e[30]=f,e[31]=h):h=e[31];let g;e[32]!==C||e[33]!==d||e[34]!==p||e[35]!==h||e[36]!==a||e[37]!==m||e[38]!==v?(g=r(oe,{children:I(R,{children:[a,m,v,C,d,p,h]})}),e[32]=C,e[33]=d,e[34]=p,e[35]=h,e[36]=a,e[37]=m,e[38]=v,e[39]=g):g=e[39];let x;if(e[40]!==s||e[41]!==n||e[42]!==t){let U;e[44]!==n||e[45]!==t?(U=N=>I(R,{"data-testid":"ai-call",children:[r(M,{className:"font-mono text-muted-foreground",children:Te(N.startTs)}),r(M,{className:"font-mono",children:I("span",{className:"inline-flex items-center gap-2",children:[N.functionPath,N.streaming?r(B,{variant:"outline",children:t("stream")}):null,N.ok?null:r(B,{variant:"destructive",children:t("failed")})]})}),r(M,{className:"max-w-[240px] truncate font-mono",title:N.model,children:N.model}),r(M,{className:"text-end tabular-nums",children:N.inputTokens===void 0?"—":O(N.inputTokens)}),r(M,{className:"text-end tabular-nums",children:N.outputTokens===void 0?"—":O(N.outputTokens)}),r(M,{className:"text-end",children:r(V,{provenance:N.cost===void 0?"none":N.costSource??"estimated",value:N.cost??0})}),r(M,{children:r("button",{className:"font-mono text-muted-foreground underline-offset-2 hover:underline",onClick:()=>{n(N.traceId)},title:t("Open the trace {trace}",{trace:N.traceId}),type:"button",children:N.traceId.slice(0,8)})})]},`${N.traceId}:${N.startTs.toString()}:${N.model}`),e[44]=n,e[45]=t,e[46]=U):U=e[46],x=s.slice(0,we).map(U),e[40]=s,e[41]=n,e[42]=t,e[43]=x}else x=e[43];let S;e[47]!==x?(S=r(ne,{children:x}),e[47]=x,e[48]=S):S=e[48];let A;e[49]!==g||e[50]!==S?(A=I(re,{children:[g,S]}),e[49]=g,e[50]=S,e[51]=A):A=e[51];let P;return e[52]!==l||e[53]!==A?(P=I(D,{className:"gap-0 py-0","data-testid":"ai-calls",children:[l,A]}),e[52]=l,e[53]=A,e[54]=P):P=e[54],P},Ue=o=>{const e=E(48),{totals:s,trend:n}=o,t=w();let c;e[0]!==s?(c=ae(s),e[0]=s,e[1]=c):c=e[1];const l=c;let i;e[2]!==t||e[3]!==n?(i=n.length>=2?r(ve,{ariaLabel:t("Cost per minute"),className:"h-7 w-24",series:n,testId:"ai-trend"}):void 0,e[2]=t,e[3]=n,e[4]=i):i=e[4];let a;e[5]!==l||e[6]!==t||e[7]!==s.estimatedCost||e[8]!==s.providerCost?(a=l==="none"?t("No cost reported"):r("span",{"data-testid":"ai-cost-split",children:t("{provider} provider-reported · {estimated} estimated",{estimated:$(s.estimatedCost),provider:$(s.providerCost)})}),e[5]=l,e[6]=t,e[7]=s.estimatedCost,e[8]=s.providerCost,e[9]=a):a=e[9];let u;e[10]!==t?(u=t("Total cost"),e[10]=t,e[11]=u):u=e[11];let m;e[12]!==s?(m=F(s),e[12]=s,e[13]=m):m=e[13];let T;e[14]!==l||e[15]!==m?(T=r(V,{provenance:l,value:m}),e[14]=l,e[15]=m,e[16]=T):T=e[16];let v;e[17]!==i||e[18]!==a||e[19]!==u||e[20]!==T?(v=r(K,{chart:i,footer:a,label:u,testId:"ai-total-cost",value:T}),e[17]=i,e[18]=a,e[19]=u,e[20]=T,e[21]=v):v=e[21];let k;e[22]!==t?(k=t("Input tokens"),e[22]=t,e[23]=k):k=e[23];let C;e[24]!==s.inputTokens?(C=O(s.inputTokens),e[24]=s.inputTokens,e[25]=C):C=e[25];let y;e[26]!==k||e[27]!==C?(y=r(K,{label:k,testId:"ai-input-tokens",value:C}),e[26]=k,e[27]=C,e[28]=y):y=e[28];let d;e[29]!==t?(d=t("Output tokens"),e[29]=t,e[30]=d):d=e[30];let b;e[31]!==s.outputTokens?(b=O(s.outputTokens),e[31]=s.outputTokens,e[32]=b):b=e[32];let p;e[33]!==d||e[34]!==b?(p=r(K,{label:d,testId:"ai-output-tokens",value:b}),e[33]=d,e[34]=b,e[35]=p):p=e[35];let f;e[36]!==t?(f=t("Calls"),e[36]=t,e[37]=f):f=e[37];let h;e[38]!==s.calls?(h=O(s.calls),e[38]=s.calls,e[39]=h):h=e[39];let g;e[40]!==f||e[41]!==h?(g=r(K,{label:f,testId:"ai-calls-total",value:h}),e[40]=f,e[41]=h,e[42]=g):g=e[42];let x;return e[43]!==y||e[44]!==p||e[45]!==g||e[46]!==v?(x=I("dl",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-4","data-testid":"ai-totals",children:[v,y,p,g]}),e[43]=y,e[44]=p,e[45]=g,e[46]=v,e[47]=x):x=e[47],x},Ze=o=>{const e=E(28),{initialShardKey:s}=o,n=w(),{queryShardKey:t,setShardKey:c,shardKey:l}=he(s),i=fe(t);let a;e[0]===Symbol.for("react.memo_cache_sentinel")?(a={},e[0]=a):a=e[0];let u;e[1]!==t?(u={live:!0,shardKey:t},e[1]=t,e[2]=u):u=e[2];const{data:m,error:T}=X(z.getTraces,a,u);let v;e[3]===Symbol.for("react.memo_cache_sentinel")?(v={},e[3]=v):v=e[3];let k;e[4]!==t?(k={live:!0,shardKey:t},e[4]=t,e[5]=k):k=e[5];const{data:C}=X(z.getMetricHistory,v,k);let y,d;e[6]!==m||e[7]!==C?(d=Ae(C,Ee(m)),y=d.trend.map(Ke),e[6]=m,e[7]=C,e[8]=y,e[9]=d):(y=e[8],d=e[9]);const b=y;let p;e[10]!==c||e[11]!==l?(p=r(ue,{onChange:c,testId:"ai-shard-input",value:l}),e[10]=c,e[11]=l,e[12]=p):p=e[12];let f;e[13]!==T?(f=T===null?null:r(de,{error:T,testId:"ai-error"}),e[13]=T,e[14]=f):f=e[14];let h;e[15]!==i||e[16]!==n||e[17]!==b||e[18]!==d.byFunction||e[19]!==d.byModel||e[20]!==d.calls||e[21]!==d.source||e[22]!==d.totals?(h=d.source==="none"?r(pe,{description:n("Spend shows up here once an action calls ctx.ai.model(...) — tokens and cost per function and per model."),testId:"ai-empty",title:n("No AI usage recorded")}):I(ke,{children:[d.source==="live"?r("p",{className:"text-xs text-muted-foreground","data-testid":"ai-live-only",children:n("No durable history yet — these totals come from the live trace ring and reset when the shard hibernates.")}):r("p",{className:"text-xs text-muted-foreground","data-testid":"ai-window",children:n("Totals cover the retained metric history (up to the last 24 hours).")}),r(Ue,{totals:d.totals,trend:b}),I("div",{className:"grid gap-3 xl:grid-cols-2",children:[r(ee,{keyLabel:n("Function"),rows:d.byFunction,testId:"ai-by-function",title:n("By function")}),r(ee,{keyLabel:n("Model"),rows:d.byModel,testId:"ai-by-model",title:n("By model")})]}),d.calls.length===0?r(D,{children:r(me,{className:"p-4 text-xs text-muted-foreground","data-testid":"ai-no-calls",children:n("No recent calls in the live trace ring — it empties when the shard hibernates.")})}):r(Pe,{calls:d.calls,onOpenTrace:i})]}),e[15]=i,e[16]=n,e[17]=b,e[18]=d.byFunction,e[19]=d.byModel,e[20]=d.calls,e[21]=d.source,e[22]=d.totals,e[23]=h):h=e[23];let g;return e[24]!==p||e[25]!==f||e[26]!==h?(g=I("section",{className:"flex flex-col gap-4","data-testid":"ai-panel",children:[p,f,h]}),e[24]=p,e[25]=f,e[26]=h,e[27]=g):g=e[27],g};function Ke(o){return o.providerCost+o.estimatedCost}export{Ze as default};
1
+ import{c as E}from"react/compiler-runtime";import{E as de}from"../packem_shared/error-alert-DAsOWnCL.mjs";import{ShardInput as ue}from"../packem_shared/ShardInput-C6mjgAh4.mjs";import{S as K}from"../packem_shared/stat-card-BAv73QtB.mjs";import{B}from"../packem_shared/badge-r_5B4LHP.mjs";import{C as D,a as me,b as te,c as se}from"../packem_shared/card-By2O8ULa.mjs";import{E as pe}from"../packem_shared/empty-state-D7jEML_T.mjs";import{c as _,a as oe,b as R,e as M,d as ne,T as re}from"../packem_shared/table-D0SBiDu-.mjs";import{u as X}from"../packem_shared/use-admin-query-tlBof8Yg.mjs";import{u as fe}from"../packem_shared/use-open-trace-DMVhpnyG.mjs";import{u as he}from"../packem_shared/use-shard-key-BsP3o5wT.mjs";import{useT as w}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.mjs";import{ADMIN_FUNCTIONS as z}from"../packem_shared/ADMIN_FUNCTIONS-B8yyk5BX.mjs";import{h as Te}from"../packem_shared/internal-Df43vQI0.mjs";import{f as $,a as O}from"../packem_shared/metrics-format-1sNGG47R.mjs";import{S as ve}from"../packem_shared/sparkline-B_sPPO_8.mjs";import{jsx as r,jsxs as I,Fragment as ke}from"react/jsx-runtime";const H="gen_ai.usage.input_tokens",W="gen_ai.usage.output_tokens",j="gen_ai.usage.cost",ie="gen_ai.request.model",ye="lunora.usage.cost.source",Ce=new Set(["ai.embed","ai.generate","ai.stream"]),G=6e4,be=1440,le="unknown",q=()=>({calls:0,estimatedCost:0,inputTokens:0,outputTokens:0,providerCost:0}),J=(o,e)=>{const s=o?.[e];return typeof s=="string"&&s!==""?s:void 0},L=(o,e)=>{const s=o?.[e];return typeof s=="number"&&Number.isFinite(s)?s:void 0},Q=o=>J(o,ye)==="provider"?"provider":"estimated",Y=(o,e)=>o.reduce((s,n)=>s+e(n),0),F=o=>o.providerCost+o.estimatedCost,ae=o=>o.estimatedCost>0?o.providerCost>0?"mixed":"estimated":o.providerCost>0?"provider":"none",ce=(o,e)=>({calls:o.calls+e.calls,estimatedCost:o.estimatedCost+e.estimatedCost,inputTokens:o.inputTokens+e.inputTokens,outputTokens:o.outputTokens+e.outputTokens,providerCost:o.providerCost+e.providerCost}),ge=o=>{const e=q();let s=0,n=0,t=0;for(const c of o){const l=Y(c.points,a=>a.sum),i=Y(c.points,a=>a.count);c.name===H?(e.inputTokens+=l,s+=i):c.name===W?(e.outputTokens+=l,n+=i):(t+=i,Q(c.attributes)==="provider"?e.providerCost+=l:e.estimatedCost+=l)}return e.calls=Math.max(s,n,t),e},Ne=(o,e)=>F(e)-F(o)||e.inputTokens+e.outputTokens-(o.inputTokens+o.outputTokens)||o.key.localeCompare(e.key),Z=(o,e)=>{const s=new Map;for(const n of o){const t=e(n);s.set(t,{key:t,...ce(s.get(t)??q(),n)})}return[...s.values()].toSorted(Ne)},xe=o=>(o?.series??[]).filter(e=>e.name===H||e.name===W||e.name===j),Se=o=>J(o.attributes,ie)??le,Ie=o=>{const e=new Map;for(const s of o){const n=Se(s),t=JSON.stringify([s.functionPath,n]),c=e.get(t)??{functionPath:s.functionPath,model:n,series:[]};c.series.push(s),e.set(t,c)}return[...e.values()].map(({functionPath:s,model:n,series:t})=>({functionPath:s,model:n,...ge(t)}))},_e=o=>{const e=new Map;for(const i of o){if(i.name!==j)continue;const a=Q(i.attributes)==="provider";for(const u of i.points){const m=e.get(u.bucketMs)??{bucketMs:u.bucketMs,estimatedCost:0,providerCost:0};a?m.providerCost+=u.sum:m.estimatedCost+=u.sum,e.set(u.bucketMs,m)}}const s=[...e.keys()].toSorted((i,a)=>i-a),n=s[0],t=s.at(-1);if(n===void 0||t===void 0)return[];const c=Math.max(n,t-(be-1)*G),l=[];for(let i=c;i<=t;i+=G)l.push(e.get(i)??{bucketMs:i,estimatedCost:0,providerCost:0});return l},Me=o=>{const e=[];for(const s of o)for(const n of s.spans){if(!Ce.has(n.name))continue;const{attributes:t}=n,c=L(t,j),l=L(t,H),i=L(t,W);e.push({...c===void 0?{}:{cost:c,costSource:Q(t)},functionPath:s.functionPath,...l===void 0?{}:{inputTokens:l},model:J(t,ie)??le,ok:n.ok,...i===void 0?{}:{outputTokens:i},startTs:s.startTs+n.offsetMs,streaming:n.name==="ai.stream",traceId:s.traceId})}return e.toSorted((s,n)=>n.startTs-s.startTs)},Oe=o=>o.map(e=>{const s=e.cost??0;return{calls:1,estimatedCost:e.costSource==="provider"?0:s,functionPath:e.functionPath,inputTokens:e.inputTokens??0,model:e.model,outputTokens:e.outputTokens??0,providerCost:e.costSource==="provider"?s:0}}),Ae=(o,e)=>{const s=xe(o),n=Me(e),t=s.length>0,c=t?Ie(s):Oe(n);let l=q(),i="none";for(const a of c)l=ce(l,a);return t?i="history":n.length>0&&(i="live"),{byFunction:Z(c,a=>a.functionPath),byModel:Z(c,a=>a.model),calls:n,source:i,totals:l,trend:t?_e(s):[]}},Ee=o=>Array.isArray(o?.traces)?o.traces:[],we=25,V=o=>{const e=E(16),{provenance:s,value:n}=o,t=w();if(s==="none"){let m;return e[0]===Symbol.for("react.memo_cache_sentinel")?(m=r("span",{className:"text-muted-foreground",children:"—"}),e[0]=m):m=e[0],m}let c;e[1]!==s||e[2]!==n?(c=s==="provider"?$(n):`~${$(n)}`,e[1]=s,e[2]=n,e[3]=c):c=e[3];let l;e[4]!==c?(l=r("span",{className:"tabular-nums",children:c}),e[4]=c,e[5]=l):l=e[5];let i;e[6]!==s||e[7]!==t?(i=s==="estimated"?r(B,{title:t("Derived from a price table, not reported by the provider."),variant:"warning",children:t("Estimated")}):null,e[6]=s,e[7]=t,e[8]=i):i=e[8];let a;e[9]!==s||e[10]!==t?(a=s==="mixed"?r(B,{title:t("Includes cost derived from a price table, not reported by the provider."),variant:"warning",children:t("Partly estimated")}):null,e[9]=s,e[10]=t,e[11]=a):a=e[11];let u;return e[12]!==l||e[13]!==i||e[14]!==a?(u=I("span",{className:"inline-flex items-center gap-2",children:[l,i,a]}),e[12]=l,e[13]=i,e[14]=a,e[15]=u):u=e[15],u},ee=o=>{const e=E(40),{keyLabel:s,rows:n,testId:t,title:c}=o,l=w();let i;e[0]!==c?(i=r(te,{className:"px-4 py-3",children:r(se,{children:c})}),e[0]=c,e[1]=i):i=e[1];let a;e[2]!==s?(a=r(_,{children:s}),e[2]=s,e[3]=a):a=e[3];let u;e[4]!==l?(u=l("Calls"),e[4]=l,e[5]=u):u=e[5];let m;e[6]!==u?(m=r(_,{className:"text-end",children:u}),e[6]=u,e[7]=m):m=e[7];let T;e[8]!==l?(T=l("Input tokens"),e[8]=l,e[9]=T):T=e[9];let v;e[10]!==T?(v=r(_,{className:"text-end",children:T}),e[10]=T,e[11]=v):v=e[11];let k;e[12]!==l?(k=l("Output tokens"),e[12]=l,e[13]=k):k=e[13];let C;e[14]!==k?(C=r(_,{className:"text-end",children:k}),e[14]=k,e[15]=C):C=e[15];let y;e[16]!==l?(y=l("Cost"),e[16]=l,e[17]=y):y=e[17];let d;e[18]!==y?(d=r(_,{className:"text-end",children:y}),e[18]=y,e[19]=d):d=e[19];let b;e[20]!==d||e[21]!==a||e[22]!==m||e[23]!==v||e[24]!==C?(b=r(oe,{children:I(R,{children:[a,m,v,C,d]})}),e[20]=d,e[21]=a,e[22]=m,e[23]=v,e[24]=C,e[25]=b):b=e[25];let p;if(e[26]!==n||e[27]!==t){let x;e[29]!==t?(x=S=>I(R,{"data-testid":`${t}-row`,children:[r(M,{className:"max-w-[280px] truncate font-mono",title:S.key,children:S.key}),r(M,{className:"text-end tabular-nums",children:O(S.calls)}),r(M,{className:"text-end tabular-nums",children:O(S.inputTokens)}),r(M,{className:"text-end tabular-nums",children:O(S.outputTokens)}),r(M,{className:"text-end",children:r(V,{provenance:ae(S),value:F(S)})})]},S.key),e[29]=t,e[30]=x):x=e[30],p=n.map(x),e[26]=n,e[27]=t,e[28]=p}else p=e[28];let f;e[31]!==p?(f=r(ne,{children:p}),e[31]=p,e[32]=f):f=e[32];let h;e[33]!==b||e[34]!==f?(h=I(re,{children:[b,f]}),e[33]=b,e[34]=f,e[35]=h):h=e[35];let g;return e[36]!==i||e[37]!==h||e[38]!==t?(g=I(D,{className:"gap-0 py-0","data-testid":t,children:[i,h]}),e[36]=i,e[37]=h,e[38]=t,e[39]=g):g=e[39],g},Pe=o=>{const e=E(55),{calls:s,onOpenTrace:n}=o,t=w();let c;e[0]!==t?(c=t("Recent calls"),e[0]=t,e[1]=c):c=e[1];let l;e[2]!==c?(l=r(te,{className:"px-4 py-3",children:r(se,{children:c})}),e[2]=c,e[3]=l):l=e[3];let i;e[4]!==t?(i=t("When"),e[4]=t,e[5]=i):i=e[5];let a;e[6]!==i?(a=r(_,{children:i}),e[6]=i,e[7]=a):a=e[7];let u;e[8]!==t?(u=t("Function"),e[8]=t,e[9]=u):u=e[9];let m;e[10]!==u?(m=r(_,{children:u}),e[10]=u,e[11]=m):m=e[11];let T;e[12]!==t?(T=t("Model"),e[12]=t,e[13]=T):T=e[13];let v;e[14]!==T?(v=r(_,{children:T}),e[14]=T,e[15]=v):v=e[15];let k;e[16]!==t?(k=t("Input tokens"),e[16]=t,e[17]=k):k=e[17];let C;e[18]!==k?(C=r(_,{className:"text-end",children:k}),e[18]=k,e[19]=C):C=e[19];let y;e[20]!==t?(y=t("Output tokens"),e[20]=t,e[21]=y):y=e[21];let d;e[22]!==y?(d=r(_,{className:"text-end",children:y}),e[22]=y,e[23]=d):d=e[23];let b;e[24]!==t?(b=t("Cost"),e[24]=t,e[25]=b):b=e[25];let p;e[26]!==b?(p=r(_,{className:"text-end",children:b}),e[26]=b,e[27]=p):p=e[27];let f;e[28]!==t?(f=t("Trace"),e[28]=t,e[29]=f):f=e[29];let h;e[30]!==f?(h=r(_,{children:f}),e[30]=f,e[31]=h):h=e[31];let g;e[32]!==C||e[33]!==d||e[34]!==p||e[35]!==h||e[36]!==a||e[37]!==m||e[38]!==v?(g=r(oe,{children:I(R,{children:[a,m,v,C,d,p,h]})}),e[32]=C,e[33]=d,e[34]=p,e[35]=h,e[36]=a,e[37]=m,e[38]=v,e[39]=g):g=e[39];let x;if(e[40]!==s||e[41]!==n||e[42]!==t){let U;e[44]!==n||e[45]!==t?(U=N=>I(R,{"data-testid":"ai-call",children:[r(M,{className:"font-mono text-muted-foreground",children:Te(N.startTs)}),r(M,{className:"font-mono",children:I("span",{className:"inline-flex items-center gap-2",children:[N.functionPath,N.streaming?r(B,{variant:"outline",children:t("stream")}):null,N.ok?null:r(B,{variant:"destructive",children:t("failed")})]})}),r(M,{className:"max-w-[240px] truncate font-mono",title:N.model,children:N.model}),r(M,{className:"text-end tabular-nums",children:N.inputTokens===void 0?"—":O(N.inputTokens)}),r(M,{className:"text-end tabular-nums",children:N.outputTokens===void 0?"—":O(N.outputTokens)}),r(M,{className:"text-end",children:r(V,{provenance:N.cost===void 0?"none":N.costSource??"estimated",value:N.cost??0})}),r(M,{children:r("button",{className:"font-mono text-muted-foreground underline-offset-2 hover:underline",onClick:()=>{n(N.traceId)},title:t("Open the trace {trace}",{trace:N.traceId}),type:"button",children:N.traceId.slice(0,8)})})]},`${N.traceId}:${N.startTs.toString()}:${N.model}`),e[44]=n,e[45]=t,e[46]=U):U=e[46],x=s.slice(0,we).map(U),e[40]=s,e[41]=n,e[42]=t,e[43]=x}else x=e[43];let S;e[47]!==x?(S=r(ne,{children:x}),e[47]=x,e[48]=S):S=e[48];let A;e[49]!==g||e[50]!==S?(A=I(re,{children:[g,S]}),e[49]=g,e[50]=S,e[51]=A):A=e[51];let P;return e[52]!==l||e[53]!==A?(P=I(D,{className:"gap-0 py-0","data-testid":"ai-calls",children:[l,A]}),e[52]=l,e[53]=A,e[54]=P):P=e[54],P},Ue=o=>{const e=E(48),{totals:s,trend:n}=o,t=w();let c;e[0]!==s?(c=ae(s),e[0]=s,e[1]=c):c=e[1];const l=c;let i;e[2]!==t||e[3]!==n?(i=n.length>=2?r(ve,{ariaLabel:t("Cost per minute"),className:"h-7 w-24",series:n,testId:"ai-trend"}):void 0,e[2]=t,e[3]=n,e[4]=i):i=e[4];let a;e[5]!==l||e[6]!==t||e[7]!==s.estimatedCost||e[8]!==s.providerCost?(a=l==="none"?t("No cost reported"):r("span",{"data-testid":"ai-cost-split",children:t("{provider} provider-reported · {estimated} estimated",{estimated:$(s.estimatedCost),provider:$(s.providerCost)})}),e[5]=l,e[6]=t,e[7]=s.estimatedCost,e[8]=s.providerCost,e[9]=a):a=e[9];let u;e[10]!==t?(u=t("Total cost"),e[10]=t,e[11]=u):u=e[11];let m;e[12]!==s?(m=F(s),e[12]=s,e[13]=m):m=e[13];let T;e[14]!==l||e[15]!==m?(T=r(V,{provenance:l,value:m}),e[14]=l,e[15]=m,e[16]=T):T=e[16];let v;e[17]!==i||e[18]!==a||e[19]!==u||e[20]!==T?(v=r(K,{chart:i,footer:a,label:u,testId:"ai-total-cost",value:T}),e[17]=i,e[18]=a,e[19]=u,e[20]=T,e[21]=v):v=e[21];let k;e[22]!==t?(k=t("Input tokens"),e[22]=t,e[23]=k):k=e[23];let C;e[24]!==s.inputTokens?(C=O(s.inputTokens),e[24]=s.inputTokens,e[25]=C):C=e[25];let y;e[26]!==k||e[27]!==C?(y=r(K,{label:k,testId:"ai-input-tokens",value:C}),e[26]=k,e[27]=C,e[28]=y):y=e[28];let d;e[29]!==t?(d=t("Output tokens"),e[29]=t,e[30]=d):d=e[30];let b;e[31]!==s.outputTokens?(b=O(s.outputTokens),e[31]=s.outputTokens,e[32]=b):b=e[32];let p;e[33]!==d||e[34]!==b?(p=r(K,{label:d,testId:"ai-output-tokens",value:b}),e[33]=d,e[34]=b,e[35]=p):p=e[35];let f;e[36]!==t?(f=t("Calls"),e[36]=t,e[37]=f):f=e[37];let h;e[38]!==s.calls?(h=O(s.calls),e[38]=s.calls,e[39]=h):h=e[39];let g;e[40]!==f||e[41]!==h?(g=r(K,{label:f,testId:"ai-calls-total",value:h}),e[40]=f,e[41]=h,e[42]=g):g=e[42];let x;return e[43]!==y||e[44]!==p||e[45]!==g||e[46]!==v?(x=I("dl",{className:"grid gap-3 sm:grid-cols-2 xl:grid-cols-4","data-testid":"ai-totals",children:[v,y,p,g]}),e[43]=y,e[44]=p,e[45]=g,e[46]=v,e[47]=x):x=e[47],x},Ze=o=>{const e=E(28),{initialShardKey:s}=o,n=w(),{queryShardKey:t,setShardKey:c,shardKey:l}=he(s),i=fe(t);let a;e[0]===Symbol.for("react.memo_cache_sentinel")?(a={},e[0]=a):a=e[0];let u;e[1]!==t?(u={live:!0,shardKey:t},e[1]=t,e[2]=u):u=e[2];const{data:m,error:T}=X(z.getTraces,a,u);let v;e[3]===Symbol.for("react.memo_cache_sentinel")?(v={},e[3]=v):v=e[3];let k;e[4]!==t?(k={live:!0,shardKey:t},e[4]=t,e[5]=k):k=e[5];const{data:C}=X(z.getMetricHistory,v,k);let y,d;e[6]!==m||e[7]!==C?(d=Ae(C,Ee(m)),y=d.trend.map(Ke),e[6]=m,e[7]=C,e[8]=y,e[9]=d):(y=e[8],d=e[9]);const b=y;let p;e[10]!==c||e[11]!==l?(p=r(ue,{onChange:c,testId:"ai-shard-input",value:l}),e[10]=c,e[11]=l,e[12]=p):p=e[12];let f;e[13]!==T?(f=T===null?null:r(de,{error:T,testId:"ai-error"}),e[13]=T,e[14]=f):f=e[14];let h;e[15]!==i||e[16]!==n||e[17]!==b||e[18]!==d.byFunction||e[19]!==d.byModel||e[20]!==d.calls||e[21]!==d.source||e[22]!==d.totals?(h=d.source==="none"?r(pe,{description:n("Spend shows up here once an action calls ctx.ai.model(...) — tokens and cost per function and per model."),testId:"ai-empty",title:n("No AI usage recorded")}):I(ke,{children:[d.source==="live"?r("p",{className:"text-xs text-muted-foreground","data-testid":"ai-live-only",children:n("No durable history yet — these totals come from the live trace ring and reset when the shard hibernates.")}):r("p",{className:"text-xs text-muted-foreground","data-testid":"ai-window",children:n("Totals cover the retained metric history (up to the last 24 hours).")}),r(Ue,{totals:d.totals,trend:b}),I("div",{className:"grid gap-3 xl:grid-cols-2",children:[r(ee,{keyLabel:n("Function"),rows:d.byFunction,testId:"ai-by-function",title:n("By function")}),r(ee,{keyLabel:n("Model"),rows:d.byModel,testId:"ai-by-model",title:n("By model")})]}),d.calls.length===0?r(D,{children:r(me,{className:"p-4 text-xs text-muted-foreground","data-testid":"ai-no-calls",children:n("No recent calls in the live trace ring — it empties when the shard hibernates.")})}):r(Pe,{calls:d.calls,onOpenTrace:i})]}),e[15]=i,e[16]=n,e[17]=b,e[18]=d.byFunction,e[19]=d.byModel,e[20]=d.calls,e[21]=d.source,e[22]=d.totals,e[23]=h):h=e[23];let g;return e[24]!==p||e[25]!==f||e[26]!==h?(g=I("section",{className:"flex flex-col gap-4","data-testid":"ai-panel",children:[p,f,h]}),e[24]=p,e[25]=f,e[26]=h,e[27]=g):g=e[27],g};function Ke(o){return o.providerCost+o.estimatedCost}export{Ze as default};