@lunora/studio 1.0.0-alpha.95 → 1.0.0-alpha.96

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 (160) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/mount.js +1 -1
  3. package/dist/packem_chunks/AdvisorHealthPanel.js +1 -1
  4. package/dist/packem_chunks/AuditPanel.js +1 -1
  5. package/dist/packem_chunks/DeploymentHealthPanel.js +1 -1
  6. package/dist/packem_chunks/ExportImportPanel.js +1 -1
  7. package/dist/packem_chunks/FileBrowser.js +1 -1
  8. package/dist/packem_chunks/FunctionStatsPanel.js +1 -1
  9. package/dist/packem_chunks/HealthPanel.js +1 -1
  10. package/dist/packem_chunks/InsightsPanel.js +1 -1
  11. package/dist/packem_chunks/LogsPanel.js +1 -1
  12. package/dist/packem_chunks/MailPanel.js +1 -1
  13. package/dist/packem_chunks/MetricsPanel.js +1 -1
  14. package/dist/packem_chunks/NotificationsPanel.js +1 -1
  15. package/dist/packem_chunks/SchemaViewer.js +1 -1
  16. package/dist/packem_chunks/SecurityAdvisorPanel.js +1 -1
  17. package/dist/packem_chunks/SettingsPanel.js +1 -1
  18. package/dist/packem_chunks/SqlEditorPanel.js +6 -6
  19. package/dist/packem_chunks/TableEditor.js +1 -1
  20. package/dist/packem_chunks/agents-panel.js +1 -1
  21. package/dist/packem_chunks/analytics-panel.js +1 -1
  22. package/dist/packem_chunks/auth-audit-panel.js +1 -1
  23. package/dist/packem_chunks/auth-config-panel.js +1 -1
  24. package/dist/packem_chunks/auth-sessions-panel.js +1 -1
  25. package/dist/packem_chunks/containers-panel.js +1 -1
  26. package/dist/packem_chunks/dashboards-panel.js +1 -1
  27. package/dist/packem_chunks/fanout-panel.js +1 -1
  28. package/dist/packem_chunks/flags-panel.js +1 -1
  29. package/dist/packem_chunks/issues-panel.js +1 -1
  30. package/dist/packem_chunks/kv-browser.js +1 -1
  31. package/dist/packem_chunks/log-drains-panel.js +2 -2
  32. package/dist/packem_chunks/migrations-route.js +1 -1
  33. package/dist/packem_chunks/organizations-panel.js +1 -1
  34. package/dist/packem_chunks/payments-panel.js +1 -1
  35. package/dist/packem_chunks/permissions-panel.js +1 -1
  36. package/dist/packem_chunks/queues-panel.js +1 -1
  37. package/dist/packem_chunks/rls-panel.js +1 -1
  38. package/dist/packem_chunks/schedule-panel.js +1 -1
  39. package/dist/packem_chunks/sparkline.js +1 -1
  40. package/dist/packem_chunks/storage-rules-panel.js +1 -1
  41. package/dist/packem_chunks/subscriptions-panel.js +1 -1
  42. package/dist/packem_chunks/sync-client-panel.js +1 -1
  43. package/dist/packem_chunks/traces-panel.js +1 -1
  44. package/dist/packem_chunks/users-panel.js +1 -1
  45. package/dist/packem_chunks/vector-browser.js +1 -1
  46. package/dist/packem_chunks/workflows-panel.js +1 -1
  47. package/dist/packem_shared/{DataBrowser-H4oUFkPJ.js → DataBrowser-CPNKM0KZ.js} +1 -1
  48. package/dist/packem_shared/{GlobalDataBrowser-CeA8bDjX.js → GlobalDataBrowser-BSmyOO0n.js} +1 -1
  49. package/dist/packem_shared/{HomePanel-DLP1nQdC.js → HomePanel-BUO6BcYQ.js} +1 -1
  50. package/dist/packem_shared/{MigrationsPanel-dm_M75mR.js → MigrationsPanel-BAnvY79E.js} +1 -1
  51. package/dist/packem_shared/{ScheduledJobs-DDJG9Je7.js → ScheduledJobs-pHVlh2xU.js} +1 -1
  52. package/dist/packem_shared/{Studio-BYg65qWq.js → Studio-DG_n-8Pc.js} +1 -1
  53. package/dist/packem_shared/{StudioApp-D0UOg0a_.js → StudioApp-bavavhpe.js} +1 -1
  54. package/dist/packem_shared/advisor-view-CGcwvlMo.js +1 -0
  55. package/dist/packem_shared/bar-chart-B8oDHgnw.js +6 -0
  56. package/dist/packem_shared/{card-CIDGUN6K.js → card-BMKx5UdA.js} +1 -1
  57. package/dist/packem_shared/{dropdown-menu-C3RQ_HlW.js → dropdown-menu-BgS2zw1i.js} +1 -1
  58. package/dist/packem_shared/error-alert-_2q2VtVG.js +1 -0
  59. package/dist/packem_shared/{grid-features-Db_BNYRo.js → grid-features-Y2YSjhCf.js} +2 -2
  60. package/dist/packem_shared/home-panel-Ir3YHReO.js +3 -0
  61. package/dist/packem_shared/result-chart-0VgP_3FP.js +1 -0
  62. package/dist/packem_shared/schema-diagram-GVgnLWTf.js +2 -0
  63. package/dist/packem_shared/{select-Bul-DeII.js → select-BssZMiFY.js} +1 -1
  64. package/dist/packem_shared/{sparkline-CgjeUU2I.js → sparkline-BNvxiJj_.js} +1 -1
  65. package/dist/packem_shared/{stat-card-fm_TF1mo.js → stat-card-BGJdhfm6.js} +1 -1
  66. package/dist/packem_shared/studio-C9Qvg13j.js +2 -0
  67. package/dist/packem_shared/{table-DdJBrClo.js → table-DZAB8cs3.js} +1 -1
  68. package/dist/packem_shared/{trace-handoff-Dw7mwjxu.js → trace-handoff-CuZ6WGgo.js} +1 -1
  69. package/dist/packem_shared/use-async-submit-B32whHJO.js +1 -0
  70. package/dist/standalone/{chunk-TITX6XEA.js → chunk-2FRLB5SB.js} +1 -1
  71. package/dist/standalone/chunk-2IFGRS6R.js +1 -0
  72. package/dist/standalone/{chunk-DBMFI2HC.js → chunk-2NO45MRI.js} +1 -1
  73. package/dist/standalone/{chunk-D62SDRMM.js → chunk-2YGNOZPZ.js} +1 -1
  74. package/dist/standalone/{chunk-UIGAA3GV.js → chunk-34WN3PEC.js} +1 -1
  75. package/dist/standalone/{chunk-ZVAGD3FT.js → chunk-3PXUIMP2.js} +1 -1
  76. package/dist/standalone/chunk-3SCGCJYS.js +1 -0
  77. package/dist/standalone/{chunk-465RIA2L.js → chunk-3WISGFZ7.js} +1 -1
  78. package/dist/standalone/{chunk-2OUIHY7G.js → chunk-44T6NSYY.js} +1 -1
  79. package/dist/standalone/{chunk-IBVBIKUI.js → chunk-57BUSXRD.js} +1 -1
  80. package/dist/standalone/{chunk-3FIN5PH4.js → chunk-6V27P65N.js} +2 -2
  81. package/dist/standalone/{chunk-OM36OEHZ.js → chunk-7KU3LR7G.js} +1 -1
  82. package/dist/standalone/{chunk-G6GX5TVB.js → chunk-7URLLMST.js} +1 -1
  83. package/dist/standalone/{chunk-RNOSWEMO.js → chunk-AB5WGAX6.js} +2 -2
  84. package/dist/standalone/{chunk-M7AWSDGY.js → chunk-AQZMKZMP.js} +1 -1
  85. package/dist/standalone/{chunk-VVNQP4CI.js → chunk-AUXEGD24.js} +1 -1
  86. package/dist/standalone/{chunk-JYLYJT27.js → chunk-BAJXBWFJ.js} +5 -5
  87. package/dist/standalone/{chunk-SCKKQIAE.js → chunk-BLJANR7J.js} +1 -1
  88. package/dist/standalone/{chunk-5TDGHWYU.js → chunk-BMYWOK5Q.js} +1 -1
  89. package/dist/standalone/{chunk-SKYFKPJC.js → chunk-CFXL7MQK.js} +1 -1
  90. package/dist/standalone/chunk-CZZWYUTR.js +1 -0
  91. package/dist/standalone/{chunk-QNHU4SKL.js → chunk-D7B2KFWM.js} +1 -1
  92. package/dist/standalone/{chunk-O3UMJLO3.js → chunk-DGO2XJOT.js} +1 -1
  93. package/dist/standalone/{chunk-2T22UR7E.js → chunk-DXJWFZFI.js} +1 -1
  94. package/dist/standalone/{chunk-QXECM52Z.js → chunk-E2C6CK7F.js} +1 -1
  95. package/dist/standalone/{chunk-PGVJE5F5.js → chunk-ECF57FQF.js} +1 -1
  96. package/dist/standalone/{chunk-BN4CIAXU.js → chunk-ESIEIGR3.js} +1 -1
  97. package/dist/standalone/chunk-ETU7KIO4.js +11 -0
  98. package/dist/standalone/{chunk-6K46XGR5.js → chunk-EYIEO5QZ.js} +1 -1
  99. package/dist/standalone/chunk-FA6AR5QU.js +1 -0
  100. package/dist/standalone/chunk-GL7YL3VF.js +1 -0
  101. package/dist/standalone/{chunk-LZKU262J.js → chunk-HJC67CE4.js} +1 -1
  102. package/dist/standalone/{chunk-WI4XINU2.js → chunk-I7FF5IIJ.js} +1 -1
  103. package/dist/standalone/{chunk-PE7TI4TQ.js → chunk-IGBUUFPN.js} +1 -1
  104. package/dist/standalone/{chunk-Z4AX76YZ.js → chunk-J4POSI6T.js} +1 -1
  105. package/dist/standalone/{chunk-A3DBEJLO.js → chunk-JRAUQ4L2.js} +1 -1
  106. package/dist/standalone/{chunk-3KXDX76D.js → chunk-KGPNIBOV.js} +1 -1
  107. package/dist/standalone/{chunk-4LCY5XUR.js → chunk-LT236J7E.js} +1 -1
  108. package/dist/standalone/{chunk-AQ4JNJF3.js → chunk-LV5UVTHL.js} +1 -1
  109. package/dist/standalone/{chunk-KEVIGWKP.js → chunk-LZ2RREQV.js} +1 -1
  110. package/dist/standalone/{chunk-ZNAGZU6H.js → chunk-LZGOETI3.js} +1 -1
  111. package/dist/standalone/{chunk-JEZDJ7D6.js → chunk-MVJMAEP4.js} +1 -1
  112. package/dist/standalone/{chunk-2O65JEMI.js → chunk-NQ4FA65F.js} +1 -1
  113. package/dist/standalone/{chunk-IUUSMC2R.js → chunk-NSUBZT43.js} +1 -1
  114. package/dist/standalone/{chunk-ZA5YIHZM.js → chunk-OZK52CH2.js} +1 -1
  115. package/dist/standalone/{chunk-7ONX5YGW.js → chunk-Q2QILUP4.js} +1 -1
  116. package/dist/standalone/{chunk-DMJDUC4L.js → chunk-QNQTMABQ.js} +1 -1
  117. package/dist/standalone/{chunk-VNQB6HY4.js → chunk-QVPKPH2T.js} +1 -1
  118. package/dist/standalone/{chunk-ABYJC3LS.js → chunk-SFQX7RUJ.js} +1 -1
  119. package/dist/standalone/{chunk-DYMO6MDG.js → chunk-TAWXVVAZ.js} +1 -1
  120. package/dist/standalone/{chunk-YTWBHPAT.js → chunk-TGQH54CS.js} +1 -1
  121. package/dist/standalone/{chunk-U6KDYJJC.js → chunk-TKFI6XYV.js} +1 -1
  122. package/dist/standalone/{chunk-EQZTSISX.js → chunk-TMGHRD6W.js} +1 -1
  123. package/dist/standalone/{chunk-JWXKUXYA.js → chunk-TVRCPIAV.js} +1 -1
  124. package/dist/standalone/{chunk-3DJ3IUUG.js → chunk-U5MIBWJD.js} +1 -1
  125. package/dist/standalone/chunk-U7ILDM43.js +59 -0
  126. package/dist/standalone/{chunk-UGU5GYDV.js → chunk-UE6A3CRB.js} +1 -1
  127. package/dist/standalone/{chunk-BNAMPDZ2.js → chunk-UZHRBXA7.js} +1 -1
  128. package/dist/standalone/chunk-VWKQ6X2S.js +1 -0
  129. package/dist/standalone/{chunk-TMNKNTC4.js → chunk-WOBRLIBX.js} +1 -1
  130. package/dist/standalone/{chunk-7YJNH3RB.js → chunk-WPERYUTG.js} +1 -1
  131. package/dist/standalone/{chunk-UZERI5YC.js → chunk-WQH3LT2P.js} +1 -1
  132. package/dist/standalone/chunk-WQJOV6L5.js +3 -0
  133. package/dist/standalone/{chunk-XNGYYOLS.js → chunk-YEGFNH56.js} +4 -4
  134. package/dist/standalone/{chunk-NNKN2XEZ.js → chunk-YOKL7XDT.js} +1 -1
  135. package/dist/standalone/{chunk-YD5O2NWK.js → chunk-ZCPQGIQW.js} +1 -1
  136. package/dist/standalone/{chunk-QM4EXWKF.js → chunk-ZURV2PEP.js} +1 -1
  137. package/dist/standalone/studio.js +1 -1
  138. package/dist/styles.css +1 -1
  139. package/package.json +6 -6
  140. package/dist/packem_shared/advisor-view-Coipc04R.js +0 -1
  141. package/dist/packem_shared/bar-chart-DraN_srt.js +0 -9
  142. package/dist/packem_shared/error-alert--Ie7ofJ0.js +0 -1
  143. package/dist/packem_shared/home-panel-BtxdqXDe.js +0 -3
  144. package/dist/packem_shared/result-chart-Gywg9DOk.js +0 -1
  145. package/dist/packem_shared/schema-diagram-DTRaCp6Y.js +0 -2
  146. package/dist/packem_shared/studio-Drf4en3j.js +0 -2
  147. package/dist/packem_shared/use-async-submit-BFIMhRqh.js +0 -1
  148. package/dist/standalone/chunk-5KCULF7S.js +0 -11
  149. package/dist/standalone/chunk-GZMKPBTJ.js +0 -1
  150. package/dist/standalone/chunk-ILNELDFC.js +0 -1
  151. package/dist/standalone/chunk-MV4A2PAK.js +0 -1
  152. package/dist/standalone/chunk-Q2Q7FR3R.js +0 -1
  153. package/dist/standalone/chunk-S3DWUXGY.js +0 -62
  154. package/dist/standalone/chunk-UBIPFCOZ.js +0 -1
  155. package/dist/standalone/chunk-ZQPWVALL.js +0 -3
  156. package/dist/standalone/chunk-ZZJ7VUVZ.js +0 -1
  157. /package/dist/standalone/{chunk-7H7LZRLP.js → chunk-4KIQ5RLS.js} +0 -0
  158. /package/dist/standalone/{chunk-UU2QJMGJ.js → chunk-MKYEFQCA.js} +0 -0
  159. /package/dist/standalone/{chunk-KUVMORDQ.js → chunk-PKSAWP56.js} +0 -0
  160. /package/dist/standalone/{chunk-MIQTKZAR.js → chunk-WJQLNYGX.js} +0 -0
@@ -1 +1 @@
1
- import{c as j}from"react/compiler-runtime";import{useState as z,useEffect as V}from"react";import{I as B}from"../packem_shared/result-chart-Gywg9DOk.js";import{A as D}from"../packem_shared/alert-CVcOFuDR.js";import{u as I}from"../packem_shared/button-BkCrNcAs.js";import{c as F,u as Q,f as U,n as Z}from"../packem_shared/card-CIDGUN6K.js";import{E as H}from"../packem_shared/empty-state-Cg7t_8qu.js";import{useT as T}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{u as J,n as P}from"../packem_shared/browser-storage-xjTyMKY0.js";import{useLunora as X}from"@lunora/react";import{ADMIN_FUNCTIONS as G}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{d as Y,b as ee,f as te,g as le}from"../packem_shared/internal-zkEvTqy8.js";import{jsx as m,jsxs as _}from"react/jsx-runtime";const de=le(G.runSql),re=(A,e)=>{const t=j(11),c=X(),[l,d]=z(void 0),[s,r]=z(void 0),[a,$]=z(!0);let n;t[0]!==c||t[1]!==e||t[2]!==A?(n=async u=>{$(!0);try{const C=await c.query(de,{sql:A},Y(e));u.cancelled||(d(C),r(void 0))}catch(C){const E=C;u.cancelled||(d(void 0),r(ee(E)))}u.cancelled||$(!1)},t[0]=c,t[1]=e,t[2]=A,t[3]=n):n=t[3];const k=n;let y,S;t[4]!==k?(y=()=>{const u={cancelled:!1};return te(k(u)),()=>{u.cancelled=!0}},S=[k],t[4]=k,t[5]=y,t[6]=S):(y=t[5],S=t[6]),V(y,S);let h;return t[7]!==s||t[8]!==a||t[9]!==l?(h={error:s,loading:a,result:l},t[7]=s,t[8]=a,t[9]=l,t[10]=h):h=t[10],h},se="lunora-studio-dashboards",O={shardKey:"",sql:"",title:""},ie=A=>{const e=j(54),{onEdit:t,onRemove:c,widget:l}=A,d=T(),{error:s,loading:r,result:a}=re(l.sql,l.shardKey??"");let $;e[0]!==t||e[1]!==l.id?($=()=>{t(l.id)},e[0]=t,e[1]=l.id,e[2]=$):$=e[2];const n=$;let k;e[3]!==c||e[4]!==l.id?(k=()=>{c(l.id)},e[3]=c,e[4]=l.id,e[5]=k):k=e[5];const y=k,S=`dashboards-widget-${l.id}`;let h;e[6]!==l.title?(h=m(U,{className:"min-w-0 truncate",title:l.title,children:l.title}),e[6]=l.title,e[7]=h):h=e[7];let u;e[8]!==d?(u=d("Edit widget"),e[8]=d,e[9]=u):u=e[9];const C=`dashboards-widget-edit-${l.id}`;let E;e[10]!==d?(E=d("Edit widget"),e[10]=d,e[11]=E):E=e[11];let K;e[12]===Symbol.for("react.memo_cache_sentinel")?(K=m("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:m("path",{d:"M4 20h4L18 10l-4-4L4 16v4ZM14 6l4 4"})}),e[12]=K):K=e[12];let N;e[13]!==n||e[14]!==u||e[15]!==C||e[16]!==E?(N=m(I,{"aria-label":u,"data-testid":C,onClick:n,size:"icon-xs",title:E,type:"button",variant:"ghost",children:K}),e[13]=n,e[14]=u,e[15]=C,e[16]=E,e[17]=N):N=e[17];let x;e[18]!==d?(x=d("Remove widget"),e[18]=d,e[19]=x):x=e[19];const R=`dashboards-widget-remove-${l.id}`;let g;e[20]!==d?(g=d("Remove widget"),e[20]=d,e[21]=g):g=e[21];let w;e[22]===Symbol.for("react.memo_cache_sentinel")?(w=m("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:m("path",{d:"M5 7h14M9 7V5h6v2m-1 0v12H10V7M7 7v13h10V7"})}),e[22]=w):w=e[22];let f;e[23]!==y||e[24]!==x||e[25]!==R||e[26]!==g?(f=m(I,{"aria-label":x,"data-testid":R,onClick:y,size:"icon-xs",title:g,type:"button",variant:"ghost",children:w}),e[23]=y,e[24]=x,e[25]=R,e[26]=g,e[27]=f):f=e[27];let b;e[28]!==f||e[29]!==N?(b=_("div",{className:"flex shrink-0 items-center gap-1",children:[N,f]}),e[28]=f,e[29]=N,e[30]=b):b=e[30];let p;e[31]!==b||e[32]!==h?(p=_(Z,{className:"flex flex-row items-start justify-between gap-2 border-b pb-3",children:[h,b]}),e[31]=b,e[32]=h,e[33]=p):p=e[33];let v;e[34]!==s||e[35]!==l.id?(v=s!==void 0&&m(D,{className:"font-mono text-xs",testId:`dashboards-widget-error-${l.id}`,variant:"destructive",children:s}),e[34]=s,e[35]=l.id,e[36]=v):v=e[36];let L;e[37]!==s||e[38]!==r||e[39]!==a||e[40]!==d||e[41]!==l.id?(L=s===void 0&&r&&a===void 0&&m("p",{className:"p-4 text-sm text-muted-foreground","data-testid":`dashboards-widget-loading-${l.id}`,children:d("Running…")}),e[37]=s,e[38]=r,e[39]=a,e[40]=d,e[41]=l.id,e[42]=L):L=e[42];let i;e[43]!==s||e[44]!==a?(i=s===void 0&&a!==void 0&&m(B,{result:a}),e[43]=s,e[44]=a,e[45]=i):i=e[45];let o;e[46]!==v||e[47]!==L||e[48]!==i?(o=_(Q,{className:"min-h-32 py-2",children:[v,L,i]}),e[46]=v,e[47]=L,e[48]=i,e[49]=o):o=e[49];let q;return e[50]!==p||e[51]!==o||e[52]!==S?(q=_(F,{"data-testid":S,children:[p,o]}),e[50]=p,e[51]=o,e[52]=S,e[53]=q):q=e[53],q},ae=A=>{const e=j(58),{draft:t,editing:c,onCancel:l,onChange:d,onSubmit:s}=A,r=T();let a;e[0]!==t||e[1]!==d?(a=M=>{d({...t,title:M.target.value})},e[0]=t,e[1]=d,e[2]=a):a=e[2];const $=a;let n;e[3]!==t||e[4]!==d?(n=M=>{d({...t,sql:M.target.value})},e[3]=t,e[4]=d,e[5]=n):n=e[5];const k=n;let y;e[6]!==t||e[7]!==d?(y=M=>{d({...t,shardKey:M.target.value})},e[6]=t,e[7]=d,e[8]=y):y=e[8];const S=y;let h;e[9]!==s?(h=()=>{s()},e[9]=s,e[10]=h):h=e[10];const u=h;let C;e[11]!==t.sql||e[12]!==t.title?(C=t.title.trim()!==""&&t.sql.trim()!=="",e[11]=t.sql,e[12]=t.title,e[13]=C):C=e[13];const E=C;let K;e[14]!==r?(K=r("Widget title"),e[14]=r,e[15]=K):K=e[15];let N;e[16]!==r?(N=r("Widget title"),e[16]=r,e[17]=N):N=e[17];let x;e[18]!==t.title||e[19]!==$||e[20]!==K||e[21]!==N?(x=m("input",{"aria-label":K,className:"h-8 rounded-md border border-border bg-background px-2 text-xs outline-none focus-visible:border-ring","data-testid":"dashboards-form-title",onChange:$,placeholder:N,type:"text",value:t.title}),e[18]=t.title,e[19]=$,e[20]=K,e[21]=N,e[22]=x):x=e[22];let R;e[23]!==r?(R=r("SQL query"),e[23]=r,e[24]=R):R=e[24];let g;e[25]!==t.sql||e[26]!==k||e[27]!==R?(g=m("textarea",{"aria-label":R,className:"min-h-24 resize-y rounded-md border border-border bg-background p-2 font-mono text-xs leading-5 outline-none focus-visible:border-ring","data-testid":"dashboards-form-sql",onChange:k,placeholder:"SELECT author, COUNT(*) AS messages FROM …",spellCheck:!1,value:t.sql}),e[25]=t.sql,e[26]=k,e[27]=R,e[28]=g):g=e[28];let w;e[29]!==r?(w=r("Shard key (optional)"),e[29]=r,e[30]=w):w=e[30];let f;e[31]!==r?(f=r("Shard key (optional)"),e[31]=r,e[32]=f):f=e[32];let b;e[33]!==t.shardKey||e[34]!==S||e[35]!==w||e[36]!==f?(b=m("input",{"aria-label":w,className:"h-8 rounded-md border border-border bg-background px-2 font-mono text-xs outline-none focus-visible:border-ring","data-testid":"dashboards-form-shard",onChange:S,placeholder:f,type:"text",value:t.shardKey}),e[33]=t.shardKey,e[34]=S,e[35]=w,e[36]=f,e[37]=b):b=e[37];let p;e[38]!==r?(p=r("Cancel"),e[38]=r,e[39]=p):p=e[39];let v;e[40]!==l||e[41]!==p?(v=m(I,{"data-testid":"dashboards-form-cancel",onClick:l,size:"sm",type:"button",variant:"outline",children:p}),e[40]=l,e[41]=p,e[42]=v):v=e[42];const L=!E;let i;e[43]!==c||e[44]!==r?(i=r(c?"Save widget":"Add widget"),e[43]=c,e[44]=r,e[45]=i):i=e[45];let o;e[46]!==u||e[47]!==L||e[48]!==i?(o=m(I,{"data-testid":"dashboards-form-save",disabled:L,onClick:u,size:"sm",type:"button",children:i}),e[46]=u,e[47]=L,e[48]=i,e[49]=o):o=e[49];let q;e[50]!==v||e[51]!==o?(q=_("div",{className:"flex items-center justify-end gap-2",children:[v,o]}),e[50]=v,e[51]=o,e[52]=q):q=e[52];let W;return e[53]!==g||e[54]!==b||e[55]!==q||e[56]!==x?(W=m(F,{"data-testid":"dashboards-form",children:_(Q,{className:"flex flex-col gap-3 py-4",children:[x,g,b,q]})}),e[53]=g,e[54]=b,e[55]=q,e[56]=x,e[57]=W):W=e[57],W},we=A=>{const e=j(39),{initialShardKey:t}=A,c=T(),[l,d]=J(se),[s,r]=z(O),[a,$]=z(null),[n,k]=z(!1);let y;e[0]!==t?(y=()=>{$(null),r({...O,shardKey:t??""}),k(!0)},e[0]=t,e[1]=y):y=e[1];const S=y;let h;e[2]===Symbol.for("react.memo_cache_sentinel")?(h=()=>{k(!1),$(null),r(O)},e[2]=h):h=e[2];const u=h;let C;e[3]!==l?(C=i=>{const o=l.find(q=>q.id===i);o!==void 0&&($(i),r({shardKey:o.shardKey??"",sql:o.sql,title:o.title}),k(!0))},e[3]=l,e[4]=C):C=e[4];const E=C;let K;e[5]!==d?(K=i=>{d(o=>o.filter(q=>q.id!==i))},e[5]=d,e[6]=K):K=e[6];const N=K;let x;e[7]!==s.shardKey||e[8]!==s.sql||e[9]!==s.title||e[10]!==a||e[11]!==d?(x=()=>{const i=s.title.trim(),o=s.sql.trim();if(i===""||o==="")return;const q=s.shardKey.trim();d(a===null?W=>[...W,{id:P("w"),shardKey:q,sql:o,title:i}]:W=>W.map(M=>M.id===a?{...M,shardKey:q,sql:o,title:i}:M)),u()},e[7]=s.shardKey,e[8]=s.sql,e[9]=s.title,e[10]=a,e[11]=d,e[12]=x):x=e[12];const R=x;let g;e[13]!==c?(g=c("Chart widgets backed by saved read-only SQL queries."),e[13]=c,e[14]=g):g=e[14];let w;e[15]!==g?(w=m("p",{className:"text-sm text-muted-foreground",children:g}),e[15]=g,e[16]=w):w=e[16];let f;e[17]!==n||e[18]!==S||e[19]!==c?(f=!n&&m(I,{"data-testid":"dashboards-add",onClick:S,size:"sm",type:"button",children:c("Add widget")}),e[17]=n,e[18]=S,e[19]=c,e[20]=f):f=e[20];let b;e[21]!==w||e[22]!==f?(b=_("div",{className:"flex items-center justify-between",children:[w,f]}),e[21]=w,e[22]=f,e[23]=b):b=e[23];let p;e[24]!==s||e[25]!==a||e[26]!==n||e[27]!==R?(p=n&&m(ae,{draft:s,editing:a!==null,onCancel:u,onChange:r,onSubmit:R}),e[24]=s,e[25]=a,e[26]=n,e[27]=R,e[28]=p):p=e[28];let v;e[29]!==n||e[30]!==E||e[31]!==N||e[32]!==c||e[33]!==l?(v=l.length===0&&!n?m(H,{description:c("Add a widget to chart a saved SQL query on this browser."),testId:"dashboards-empty",title:c("No widgets yet")}):m("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3","data-testid":"dashboards-grid",children:l.map(i=>m(ie,{onEdit:E,onRemove:N,widget:i},i.id))}),e[29]=n,e[30]=E,e[31]=N,e[32]=c,e[33]=l,e[34]=v):v=e[34];let L;return e[35]!==p||e[36]!==v||e[37]!==b?(L=_("div",{className:"flex flex-col gap-4","data-testid":"lunora-dashboards",children:[b,p,v]}),e[35]=p,e[36]=v,e[37]=b,e[38]=L):L=e[38],L};export{we as default};
1
+ import{c as j}from"react/compiler-runtime";import{useState as z,useEffect as V}from"react";import{I as B}from"../packem_shared/result-chart-0VgP_3FP.js";import{A as D}from"../packem_shared/alert-CVcOFuDR.js";import{u as I}from"../packem_shared/button-BkCrNcAs.js";import{c as F,f as Q,m as U,n as Z}from"../packem_shared/card-BMKx5UdA.js";import{E as H}from"../packem_shared/empty-state-Cg7t_8qu.js";import{useT as T}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{u as J,n as P}from"../packem_shared/browser-storage-xjTyMKY0.js";import{useLunora as X}from"@lunora/react";import{ADMIN_FUNCTIONS as G}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{d as Y,b as ee,f as te,g as le}from"../packem_shared/internal-zkEvTqy8.js";import{jsx as m,jsxs as _}from"react/jsx-runtime";const de=le(G.runSql),re=(A,e)=>{const t=j(11),c=X(),[l,d]=z(void 0),[s,r]=z(void 0),[a,$]=z(!0);let n;t[0]!==c||t[1]!==e||t[2]!==A?(n=async u=>{$(!0);try{const C=await c.query(de,{sql:A},Y(e));u.cancelled||(d(C),r(void 0))}catch(C){const E=C;u.cancelled||(d(void 0),r(ee(E)))}u.cancelled||$(!1)},t[0]=c,t[1]=e,t[2]=A,t[3]=n):n=t[3];const k=n;let y,S;t[4]!==k?(y=()=>{const u={cancelled:!1};return te(k(u)),()=>{u.cancelled=!0}},S=[k],t[4]=k,t[5]=y,t[6]=S):(y=t[5],S=t[6]),V(y,S);let h;return t[7]!==s||t[8]!==a||t[9]!==l?(h={error:s,loading:a,result:l},t[7]=s,t[8]=a,t[9]=l,t[10]=h):h=t[10],h},se="lunora-studio-dashboards",O={shardKey:"",sql:"",title:""},ie=A=>{const e=j(54),{onEdit:t,onRemove:c,widget:l}=A,d=T(),{error:s,loading:r,result:a}=re(l.sql,l.shardKey??"");let $;e[0]!==t||e[1]!==l.id?($=()=>{t(l.id)},e[0]=t,e[1]=l.id,e[2]=$):$=e[2];const n=$;let k;e[3]!==c||e[4]!==l.id?(k=()=>{c(l.id)},e[3]=c,e[4]=l.id,e[5]=k):k=e[5];const y=k,S=`dashboards-widget-${l.id}`;let h;e[6]!==l.title?(h=m(U,{className:"min-w-0 truncate",title:l.title,children:l.title}),e[6]=l.title,e[7]=h):h=e[7];let u;e[8]!==d?(u=d("Edit widget"),e[8]=d,e[9]=u):u=e[9];const C=`dashboards-widget-edit-${l.id}`;let E;e[10]!==d?(E=d("Edit widget"),e[10]=d,e[11]=E):E=e[11];let K;e[12]===Symbol.for("react.memo_cache_sentinel")?(K=m("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:m("path",{d:"M4 20h4L18 10l-4-4L4 16v4ZM14 6l4 4"})}),e[12]=K):K=e[12];let N;e[13]!==n||e[14]!==u||e[15]!==C||e[16]!==E?(N=m(I,{"aria-label":u,"data-testid":C,onClick:n,size:"icon-xs",title:E,type:"button",variant:"ghost",children:K}),e[13]=n,e[14]=u,e[15]=C,e[16]=E,e[17]=N):N=e[17];let x;e[18]!==d?(x=d("Remove widget"),e[18]=d,e[19]=x):x=e[19];const R=`dashboards-widget-remove-${l.id}`;let g;e[20]!==d?(g=d("Remove widget"),e[20]=d,e[21]=g):g=e[21];let w;e[22]===Symbol.for("react.memo_cache_sentinel")?(w=m("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:m("path",{d:"M5 7h14M9 7V5h6v2m-1 0v12H10V7M7 7v13h10V7"})}),e[22]=w):w=e[22];let f;e[23]!==y||e[24]!==x||e[25]!==R||e[26]!==g?(f=m(I,{"aria-label":x,"data-testid":R,onClick:y,size:"icon-xs",title:g,type:"button",variant:"ghost",children:w}),e[23]=y,e[24]=x,e[25]=R,e[26]=g,e[27]=f):f=e[27];let b;e[28]!==f||e[29]!==N?(b=_("div",{className:"flex shrink-0 items-center gap-1",children:[N,f]}),e[28]=f,e[29]=N,e[30]=b):b=e[30];let p;e[31]!==b||e[32]!==h?(p=_(Z,{className:"flex flex-row items-start justify-between gap-2 border-b pb-3",children:[h,b]}),e[31]=b,e[32]=h,e[33]=p):p=e[33];let v;e[34]!==s||e[35]!==l.id?(v=s!==void 0&&m(D,{className:"font-mono text-xs",testId:`dashboards-widget-error-${l.id}`,variant:"destructive",children:s}),e[34]=s,e[35]=l.id,e[36]=v):v=e[36];let L;e[37]!==s||e[38]!==r||e[39]!==a||e[40]!==d||e[41]!==l.id?(L=s===void 0&&r&&a===void 0&&m("p",{className:"p-4 text-sm text-muted-foreground","data-testid":`dashboards-widget-loading-${l.id}`,children:d("Running…")}),e[37]=s,e[38]=r,e[39]=a,e[40]=d,e[41]=l.id,e[42]=L):L=e[42];let i;e[43]!==s||e[44]!==a?(i=s===void 0&&a!==void 0&&m(B,{result:a}),e[43]=s,e[44]=a,e[45]=i):i=e[45];let o;e[46]!==v||e[47]!==L||e[48]!==i?(o=_(Q,{className:"min-h-32 py-2",children:[v,L,i]}),e[46]=v,e[47]=L,e[48]=i,e[49]=o):o=e[49];let q;return e[50]!==p||e[51]!==o||e[52]!==S?(q=_(F,{"data-testid":S,children:[p,o]}),e[50]=p,e[51]=o,e[52]=S,e[53]=q):q=e[53],q},ae=A=>{const e=j(58),{draft:t,editing:c,onCancel:l,onChange:d,onSubmit:s}=A,r=T();let a;e[0]!==t||e[1]!==d?(a=M=>{d({...t,title:M.target.value})},e[0]=t,e[1]=d,e[2]=a):a=e[2];const $=a;let n;e[3]!==t||e[4]!==d?(n=M=>{d({...t,sql:M.target.value})},e[3]=t,e[4]=d,e[5]=n):n=e[5];const k=n;let y;e[6]!==t||e[7]!==d?(y=M=>{d({...t,shardKey:M.target.value})},e[6]=t,e[7]=d,e[8]=y):y=e[8];const S=y;let h;e[9]!==s?(h=()=>{s()},e[9]=s,e[10]=h):h=e[10];const u=h;let C;e[11]!==t.sql||e[12]!==t.title?(C=t.title.trim()!==""&&t.sql.trim()!=="",e[11]=t.sql,e[12]=t.title,e[13]=C):C=e[13];const E=C;let K;e[14]!==r?(K=r("Widget title"),e[14]=r,e[15]=K):K=e[15];let N;e[16]!==r?(N=r("Widget title"),e[16]=r,e[17]=N):N=e[17];let x;e[18]!==t.title||e[19]!==$||e[20]!==K||e[21]!==N?(x=m("input",{"aria-label":K,className:"h-8 rounded-md border border-border bg-background px-2 text-xs outline-none focus-visible:border-ring","data-testid":"dashboards-form-title",onChange:$,placeholder:N,type:"text",value:t.title}),e[18]=t.title,e[19]=$,e[20]=K,e[21]=N,e[22]=x):x=e[22];let R;e[23]!==r?(R=r("SQL query"),e[23]=r,e[24]=R):R=e[24];let g;e[25]!==t.sql||e[26]!==k||e[27]!==R?(g=m("textarea",{"aria-label":R,className:"min-h-24 resize-y rounded-md border border-border bg-background p-2 font-mono text-xs leading-5 outline-none focus-visible:border-ring","data-testid":"dashboards-form-sql",onChange:k,placeholder:"SELECT author, COUNT(*) AS messages FROM …",spellCheck:!1,value:t.sql}),e[25]=t.sql,e[26]=k,e[27]=R,e[28]=g):g=e[28];let w;e[29]!==r?(w=r("Shard key (optional)"),e[29]=r,e[30]=w):w=e[30];let f;e[31]!==r?(f=r("Shard key (optional)"),e[31]=r,e[32]=f):f=e[32];let b;e[33]!==t.shardKey||e[34]!==S||e[35]!==w||e[36]!==f?(b=m("input",{"aria-label":w,className:"h-8 rounded-md border border-border bg-background px-2 font-mono text-xs outline-none focus-visible:border-ring","data-testid":"dashboards-form-shard",onChange:S,placeholder:f,type:"text",value:t.shardKey}),e[33]=t.shardKey,e[34]=S,e[35]=w,e[36]=f,e[37]=b):b=e[37];let p;e[38]!==r?(p=r("Cancel"),e[38]=r,e[39]=p):p=e[39];let v;e[40]!==l||e[41]!==p?(v=m(I,{"data-testid":"dashboards-form-cancel",onClick:l,size:"sm",type:"button",variant:"outline",children:p}),e[40]=l,e[41]=p,e[42]=v):v=e[42];const L=!E;let i;e[43]!==c||e[44]!==r?(i=r(c?"Save widget":"Add widget"),e[43]=c,e[44]=r,e[45]=i):i=e[45];let o;e[46]!==u||e[47]!==L||e[48]!==i?(o=m(I,{"data-testid":"dashboards-form-save",disabled:L,onClick:u,size:"sm",type:"button",children:i}),e[46]=u,e[47]=L,e[48]=i,e[49]=o):o=e[49];let q;e[50]!==v||e[51]!==o?(q=_("div",{className:"flex items-center justify-end gap-2",children:[v,o]}),e[50]=v,e[51]=o,e[52]=q):q=e[52];let W;return e[53]!==g||e[54]!==b||e[55]!==q||e[56]!==x?(W=m(F,{"data-testid":"dashboards-form",children:_(Q,{className:"flex flex-col gap-3 py-4",children:[x,g,b,q]})}),e[53]=g,e[54]=b,e[55]=q,e[56]=x,e[57]=W):W=e[57],W},we=A=>{const e=j(39),{initialShardKey:t}=A,c=T(),[l,d]=J(se),[s,r]=z(O),[a,$]=z(null),[n,k]=z(!1);let y;e[0]!==t?(y=()=>{$(null),r({...O,shardKey:t??""}),k(!0)},e[0]=t,e[1]=y):y=e[1];const S=y;let h;e[2]===Symbol.for("react.memo_cache_sentinel")?(h=()=>{k(!1),$(null),r(O)},e[2]=h):h=e[2];const u=h;let C;e[3]!==l?(C=i=>{const o=l.find(q=>q.id===i);o!==void 0&&($(i),r({shardKey:o.shardKey??"",sql:o.sql,title:o.title}),k(!0))},e[3]=l,e[4]=C):C=e[4];const E=C;let K;e[5]!==d?(K=i=>{d(o=>o.filter(q=>q.id!==i))},e[5]=d,e[6]=K):K=e[6];const N=K;let x;e[7]!==s.shardKey||e[8]!==s.sql||e[9]!==s.title||e[10]!==a||e[11]!==d?(x=()=>{const i=s.title.trim(),o=s.sql.trim();if(i===""||o==="")return;const q=s.shardKey.trim();d(a===null?W=>[...W,{id:P("w"),shardKey:q,sql:o,title:i}]:W=>W.map(M=>M.id===a?{...M,shardKey:q,sql:o,title:i}:M)),u()},e[7]=s.shardKey,e[8]=s.sql,e[9]=s.title,e[10]=a,e[11]=d,e[12]=x):x=e[12];const R=x;let g;e[13]!==c?(g=c("Chart widgets backed by saved read-only SQL queries."),e[13]=c,e[14]=g):g=e[14];let w;e[15]!==g?(w=m("p",{className:"text-sm text-muted-foreground",children:g}),e[15]=g,e[16]=w):w=e[16];let f;e[17]!==n||e[18]!==S||e[19]!==c?(f=!n&&m(I,{"data-testid":"dashboards-add",onClick:S,size:"sm",type:"button",children:c("Add widget")}),e[17]=n,e[18]=S,e[19]=c,e[20]=f):f=e[20];let b;e[21]!==w||e[22]!==f?(b=_("div",{className:"flex items-center justify-between",children:[w,f]}),e[21]=w,e[22]=f,e[23]=b):b=e[23];let p;e[24]!==s||e[25]!==a||e[26]!==n||e[27]!==R?(p=n&&m(ae,{draft:s,editing:a!==null,onCancel:u,onChange:r,onSubmit:R}),e[24]=s,e[25]=a,e[26]=n,e[27]=R,e[28]=p):p=e[28];let v;e[29]!==n||e[30]!==E||e[31]!==N||e[32]!==c||e[33]!==l?(v=l.length===0&&!n?m(H,{description:c("Add a widget to chart a saved SQL query on this browser."),testId:"dashboards-empty",title:c("No widgets yet")}):m("div",{className:"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3","data-testid":"dashboards-grid",children:l.map(i=>m(ie,{onEdit:E,onRemove:N,widget:i},i.id))}),e[29]=n,e[30]=E,e[31]=N,e[32]=c,e[33]=l,e[34]=v):v=e[34];let L;return e[35]!==p||e[36]!==v||e[37]!==b?(L=_("div",{className:"flex flex-col gap-4","data-testid":"lunora-dashboards",children:[b,p,v]}),e[35]=p,e[36]=v,e[37]=b,e[38]=L):L=e[38],L};export{we as default};
@@ -1 +1 @@
1
- import{c as P}from"react/compiler-runtime";import{E as j}from"../packem_shared/error-alert--Ie7ofJ0.js";import{ShardInput as A}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as R}from"../packem_shared/stat-card-fm_TF1mo.js";import{g as M}from"../packem_shared/badge-BbuuAio7.js";import{c as _}from"../packem_shared/card-CIDGUN6K.js";import{E as L}from"../packem_shared/empty-state-Cg7t_8qu.js";import{n as W,d as q,m as E,p as K,f as B,u as T}from"../packem_shared/table-DdJBrClo.js";import{N as H}from"../packem_shared/use-admin-query-CnnyWJXM.js";import{useAutoRefresh as J}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-BCC8_4BQ.js";import{S as O}from"../packem_shared/use-shard-key-B2JtNa5m.js";import{useT as U}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as V}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{jsx as a,jsxs as x,Fragment as X}from"react/jsx-runtime";const D=n=>`${n.toString()} ms`,z=n=>n.totalConnections===0&&n.shapePoke.passes===0&&n.whisper.passes===0,F=n=>{const e=P(48),{counters:r,includeTiming:s,prefix:l,t:o,title:$}=n,v=`${l}-section`;let p;e[0]!==$?(p=a("h3",{className:"text-sm font-medium text-foreground",children:$}),e[0]=$,e[1]=p):p=e[1];const t=`${l}-stats`;let i;e[2]!==o?(i=o("Passes"),e[2]=o,e[3]=i):i=e[3];const I=`${l}-passes`;let b;e[4]!==r.passes||e[5]!==i||e[6]!==I?(b=a(R,{label:i,testId:I,value:r.passes}),e[4]=r.passes,e[5]=i,e[6]=I,e[7]=b):b=e[7];let f;e[8]!==o?(f=o("Sockets iterated"),e[8]=o,e[9]=f):f=e[9];const y=`${l}-iterated`;let c;e[10]!==r.socketsIterated||e[11]!==f||e[12]!==y?(c=a(R,{label:f,testId:y,value:r.socketsIterated}),e[10]=r.socketsIterated,e[11]=f,e[12]=y,e[13]=c):c=e[13];let d;e[14]!==o?(d=o("Delivered"),e[14]=o,e[15]=d):d=e[15];const g=`${l}-delivered`;let m;e[16]!==r.socketsDelivered||e[17]!==d||e[18]!==g?(m=a(R,{label:d,testId:g,value:r.socketsDelivered}),e[16]=r.socketsDelivered,e[17]=d,e[18]=g,e[19]=m):m=e[19];let u;e[20]!==o?(u=o("Peak width"),e[20]=o,e[21]=u):u=e[21];const k=`${l}-peak`;let h;e[22]!==r.peakSocketsIterated||e[23]!==u||e[24]!==k?(h=a(R,{label:u,testId:k,value:r.peakSocketsIterated}),e[22]=r.peakSocketsIterated,e[23]=u,e[24]=k,e[25]=h):h=e[25];let N;e[26]!==r.totalMs||e[27]!==s||e[28]!==l||e[29]!==o?(N=s&&a(R,{label:o("Total time"),testId:`${l}-total-ms`,value:D(r.totalMs)}),e[26]=r.totalMs,e[27]=s,e[28]=l,e[29]=o,e[30]=N):N=e[30];let S;e[31]!==r.maxMs||e[32]!==s||e[33]!==l||e[34]!==o?(S=s&&a(R,{label:o("Max time"),testId:`${l}-max-ms`,value:D(r.maxMs)}),e[31]=r.maxMs,e[32]=s,e[33]=l,e[34]=o,e[35]=S):S=e[35];let C;e[36]!==m||e[37]!==h||e[38]!==N||e[39]!==S||e[40]!==t||e[41]!==b||e[42]!==c?(C=x("dl",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3","data-testid":t,children:[b,c,m,h,N,S]}),e[36]=m,e[37]=h,e[38]=N,e[39]=S,e[40]=t,e[41]=b,e[42]=c,e[43]=C):C=e[43];let w;return e[44]!==v||e[45]!==C||e[46]!==p?(w=x("section",{className:"flex flex-col gap-2","data-testid":v,children:[p,C]}),e[44]=v,e[45]=C,e[46]=p,e[47]=w):w=e[47],w},me=n=>{const e=P(31),{initialShardKey:r}=n,s=U(),{queryShardKey:l,setShardKey:o,shardKey:$}=O(r);let v;e[0]===Symbol.for("react.memo_cache_sentinel")?(v={},e[0]=v):v=e[0];let p;e[1]!==l?(p={keepPreviousData:!0,shardKey:l},e[1]=l,e[2]=p):p=e[2];const{data:t,error:i,errorSource:I,refetch:b}=H(V.getFanoutMetrics,v,p);J(b,!0);let f;e[3]!==t?(f=t!==void 0&&z(t),e[3]=t,e[4]=f):f=e[4];const y=f;let c;e[5]!==o||e[6]!==$?(c=a(A,{onChange:o,testId:"fanout-shard-input",value:$}),e[5]=o,e[6]=$,e[7]=c):c=e[7];let d;e[8]!==t||e[9]!==s?(d=t!==void 0&&x("div",{className:"ml-auto flex items-center gap-2 text-sm text-muted-foreground","data-testid":"fanout-count",children:[t.promoted&&a(M,{"data-testid":"fanout-promoted",variant:t.relayCount>=t.maxRelays?"destructive":"default",children:t.relayCount>=t.maxRelays?s("auto-scaled: {relayCount}/{maxRelays} relays (at ceiling)",{maxRelays:t.maxRelays,relayCount:t.relayCount}):s("auto-scaled: {relayCount}/{maxRelays} relays",{maxRelays:t.maxRelays,relayCount:t.relayCount})}),a(M,{variant:"secondary",children:s("{count} connections",{count:t.totalConnections})}),a(M,{variant:"secondary",children:s("peak {count} subscribers",{count:t.peakSubscribers})})]}),e[8]=t,e[9]=s,e[10]=d):d=e[10];let g;e[11]!==c||e[12]!==d?(g=x("div",{className:"flex flex-wrap items-center gap-2",children:[c,d]}),e[11]=c,e[12]=d,e[13]=g):g=e[13];let m;e[14]!==i||e[15]!==I?(m=i!==null&&a(j,{error:I,testId:"fanout-error"}),e[14]=i,e[15]=I,e[16]=m):m=e[16];let u;e[17]!==i||e[18]!==y||e[19]!==s?(u=i===null&&y&&a(L,{description:s("Realtime fan-out cost and per-topic subscriber counts for this shard."),icon:a("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:a("path",{d:"M4 12h4l3 7 4-14 3 7h2"})}),testId:"fanout-empty",title:s("No fan-out activity yet.")}),e[17]=i,e[18]=y,e[19]=s,e[20]=u):u=e[20];let k;e[21]!==i||e[22]!==y||e[23]!==t||e[24]!==s?(k=i===null&&t!==void 0&&!y&&x(X,{children:[t.topics.length>0&&x("section",{className:"flex flex-col gap-2","data-testid":"fanout-topics-section",children:[a("h3",{className:"text-sm font-medium text-foreground",children:s("Hot topics")}),a(_,{className:"overflow-hidden py-0",children:x(W,{"data-testid":"fanout-topics-table",children:[a(q,{children:x(E,{children:[a(K,{children:s("Topic")}),a(K,{children:s("Kind")}),a(K,{className:"text-right",children:s("Subscribers")})]})}),a(B,{children:t.topics.map(G)})]})})]}),x("section",{className:"flex flex-col gap-3","data-testid":"fanout-cost",children:[a("h2",{className:"text-sm font-medium text-muted-foreground",children:s("Fan-out cost since this instance woke")}),a(F,{counters:t.shapePoke,includeTiming:!0,prefix:"fanout-poke",t:s,title:s("Shape pokes")}),a(F,{counters:t.whisper,includeTiming:!1,prefix:"fanout-whisper",t:s,title:s("Whisper broadcasts")})]})]}),e[21]=i,e[22]=y,e[23]=t,e[24]=s,e[25]=k):k=e[25];let h;return e[26]!==g||e[27]!==m||e[28]!==u||e[29]!==k?(h=x("div",{className:"flex flex-col gap-4","data-testid":"fanout-panel",children:[g,m,u,k]}),e[26]=g,e[27]=m,e[28]=u,e[29]=k,e[30]=h):h=e[30],h};function G(n){return x(E,{"data-testid":"fanout-topic-row",children:[a(T,{className:"font-mono text-xs",children:n.topic}),a(T,{children:a(M,{variant:"outline",children:n.kind})}),a(T,{className:"text-right font-medium tabular-nums",children:n.subscribers})]},`${n.kind}:${n.topic}`)}export{me as default};
1
+ import{c as P}from"react/compiler-runtime";import{U as _}from"../packem_shared/error-alert-_2q2VtVG.js";import{ShardInput as A}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as R}from"../packem_shared/stat-card-BGJdhfm6.js";import{g as M}from"../packem_shared/badge-BbuuAio7.js";import{c as E}from"../packem_shared/card-BMKx5UdA.js";import{E as L}from"../packem_shared/empty-state-Cg7t_8qu.js";import{d as U,n as W,f as j,m as K,b as q,p as T}from"../packem_shared/table-DZAB8cs3.js";import{N as B}from"../packem_shared/use-admin-query-CnnyWJXM.js";import{useAutoRefresh as H}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-BCC8_4BQ.js";import{S as J}from"../packem_shared/use-shard-key-B2JtNa5m.js";import{useT as O}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as V}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{jsx as a,jsxs as x,Fragment as X}from"react/jsx-runtime";const D=n=>`${n.toString()} ms`,z=n=>n.totalConnections===0&&n.shapePoke.passes===0&&n.whisper.passes===0,F=n=>{const e=P(48),{counters:r,includeTiming:s,prefix:l,t:o,title:$}=n,v=`${l}-section`;let p;e[0]!==$?(p=a("h3",{className:"text-sm font-medium text-foreground",children:$}),e[0]=$,e[1]=p):p=e[1];const t=`${l}-stats`;let i;e[2]!==o?(i=o("Passes"),e[2]=o,e[3]=i):i=e[3];const I=`${l}-passes`;let b;e[4]!==r.passes||e[5]!==i||e[6]!==I?(b=a(R,{label:i,testId:I,value:r.passes}),e[4]=r.passes,e[5]=i,e[6]=I,e[7]=b):b=e[7];let f;e[8]!==o?(f=o("Sockets iterated"),e[8]=o,e[9]=f):f=e[9];const y=`${l}-iterated`;let c;e[10]!==r.socketsIterated||e[11]!==f||e[12]!==y?(c=a(R,{label:f,testId:y,value:r.socketsIterated}),e[10]=r.socketsIterated,e[11]=f,e[12]=y,e[13]=c):c=e[13];let d;e[14]!==o?(d=o("Delivered"),e[14]=o,e[15]=d):d=e[15];const g=`${l}-delivered`;let m;e[16]!==r.socketsDelivered||e[17]!==d||e[18]!==g?(m=a(R,{label:d,testId:g,value:r.socketsDelivered}),e[16]=r.socketsDelivered,e[17]=d,e[18]=g,e[19]=m):m=e[19];let u;e[20]!==o?(u=o("Peak width"),e[20]=o,e[21]=u):u=e[21];const k=`${l}-peak`;let h;e[22]!==r.peakSocketsIterated||e[23]!==u||e[24]!==k?(h=a(R,{label:u,testId:k,value:r.peakSocketsIterated}),e[22]=r.peakSocketsIterated,e[23]=u,e[24]=k,e[25]=h):h=e[25];let N;e[26]!==r.totalMs||e[27]!==s||e[28]!==l||e[29]!==o?(N=s&&a(R,{label:o("Total time"),testId:`${l}-total-ms`,value:D(r.totalMs)}),e[26]=r.totalMs,e[27]=s,e[28]=l,e[29]=o,e[30]=N):N=e[30];let S;e[31]!==r.maxMs||e[32]!==s||e[33]!==l||e[34]!==o?(S=s&&a(R,{label:o("Max time"),testId:`${l}-max-ms`,value:D(r.maxMs)}),e[31]=r.maxMs,e[32]=s,e[33]=l,e[34]=o,e[35]=S):S=e[35];let C;e[36]!==m||e[37]!==h||e[38]!==N||e[39]!==S||e[40]!==t||e[41]!==b||e[42]!==c?(C=x("dl",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3","data-testid":t,children:[b,c,m,h,N,S]}),e[36]=m,e[37]=h,e[38]=N,e[39]=S,e[40]=t,e[41]=b,e[42]=c,e[43]=C):C=e[43];let w;return e[44]!==v||e[45]!==C||e[46]!==p?(w=x("section",{className:"flex flex-col gap-2","data-testid":v,children:[p,C]}),e[44]=v,e[45]=C,e[46]=p,e[47]=w):w=e[47],w},me=n=>{const e=P(31),{initialShardKey:r}=n,s=O(),{queryShardKey:l,setShardKey:o,shardKey:$}=J(r);let v;e[0]===Symbol.for("react.memo_cache_sentinel")?(v={},e[0]=v):v=e[0];let p;e[1]!==l?(p={keepPreviousData:!0,shardKey:l},e[1]=l,e[2]=p):p=e[2];const{data:t,error:i,errorSource:I,refetch:b}=B(V.getFanoutMetrics,v,p);H(b,!0);let f;e[3]!==t?(f=t!==void 0&&z(t),e[3]=t,e[4]=f):f=e[4];const y=f;let c;e[5]!==o||e[6]!==$?(c=a(A,{onChange:o,testId:"fanout-shard-input",value:$}),e[5]=o,e[6]=$,e[7]=c):c=e[7];let d;e[8]!==t||e[9]!==s?(d=t!==void 0&&x("div",{className:"ml-auto flex items-center gap-2 text-sm text-muted-foreground","data-testid":"fanout-count",children:[t.promoted&&a(M,{"data-testid":"fanout-promoted",variant:t.relayCount>=t.maxRelays?"destructive":"default",children:t.relayCount>=t.maxRelays?s("auto-scaled: {relayCount}/{maxRelays} relays (at ceiling)",{maxRelays:t.maxRelays,relayCount:t.relayCount}):s("auto-scaled: {relayCount}/{maxRelays} relays",{maxRelays:t.maxRelays,relayCount:t.relayCount})}),a(M,{variant:"secondary",children:s("{count} connections",{count:t.totalConnections})}),a(M,{variant:"secondary",children:s("peak {count} subscribers",{count:t.peakSubscribers})})]}),e[8]=t,e[9]=s,e[10]=d):d=e[10];let g;e[11]!==c||e[12]!==d?(g=x("div",{className:"flex flex-wrap items-center gap-2",children:[c,d]}),e[11]=c,e[12]=d,e[13]=g):g=e[13];let m;e[14]!==i||e[15]!==I?(m=i!==null&&a(_,{error:I,testId:"fanout-error"}),e[14]=i,e[15]=I,e[16]=m):m=e[16];let u;e[17]!==i||e[18]!==y||e[19]!==s?(u=i===null&&y&&a(L,{description:s("Realtime fan-out cost and per-topic subscriber counts for this shard."),icon:a("svg",{"aria-hidden":"true",fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.6,viewBox:"0 0 24 24",children:a("path",{d:"M4 12h4l3 7 4-14 3 7h2"})}),testId:"fanout-empty",title:s("No fan-out activity yet.")}),e[17]=i,e[18]=y,e[19]=s,e[20]=u):u=e[20];let k;e[21]!==i||e[22]!==y||e[23]!==t||e[24]!==s?(k=i===null&&t!==void 0&&!y&&x(X,{children:[t.topics.length>0&&x("section",{className:"flex flex-col gap-2","data-testid":"fanout-topics-section",children:[a("h3",{className:"text-sm font-medium text-foreground",children:s("Hot topics")}),a(E,{className:"overflow-hidden py-0",children:x(U,{"data-testid":"fanout-topics-table",children:[a(W,{children:x(j,{children:[a(K,{children:s("Topic")}),a(K,{children:s("Kind")}),a(K,{className:"text-right",children:s("Subscribers")})]})}),a(q,{children:t.topics.map(G)})]})})]}),x("section",{className:"flex flex-col gap-3","data-testid":"fanout-cost",children:[a("h2",{className:"text-sm font-medium text-muted-foreground",children:s("Fan-out cost since this instance woke")}),a(F,{counters:t.shapePoke,includeTiming:!0,prefix:"fanout-poke",t:s,title:s("Shape pokes")}),a(F,{counters:t.whisper,includeTiming:!1,prefix:"fanout-whisper",t:s,title:s("Whisper broadcasts")})]})]}),e[21]=i,e[22]=y,e[23]=t,e[24]=s,e[25]=k):k=e[25];let h;return e[26]!==g||e[27]!==m||e[28]!==u||e[29]!==k?(h=x("div",{className:"flex flex-col gap-4","data-testid":"fanout-panel",children:[g,m,u,k]}),e[26]=g,e[27]=m,e[28]=u,e[29]=k,e[30]=h):h=e[30],h};function G(n){return x(j,{"data-testid":"fanout-topic-row",children:[a(T,{className:"font-mono text-xs",children:n.topic}),a(T,{children:a(M,{variant:"outline",children:n.kind})}),a(T,{className:"text-right font-medium tabular-nums",children:n.subscribers})]},`${n.kind}:${n.topic}`)}export{me as default};
@@ -1 +1 @@
1
- import{useState as $}from"react";import{E as k}from"../packem_shared/error-alert--Ie7ofJ0.js";import{g as w}from"../packem_shared/badge-BbuuAio7.js";import{c as A,u as F}from"../packem_shared/card-CIDGUN6K.js";import{E as u}from"../packem_shared/empty-state-Cg7t_8qu.js";import{p as O}from"../packem_shared/label-6uP1obNF.js";import{n as T,d as C,m as p,p as l,f as j,u as n}from"../packem_shared/table-DdJBrClo.js";import{l as E}from"../packem_shared/textarea-Bu2-jKAs.js";import{N as I}from"../packem_shared/use-admin-query-CnnyWJXM.js";import{useT as J}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as K}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{jsx as e,jsxs as i}from"react/jsx-runtime";const L=a=>{const t=a.trim();if(t.length===0)return{context:void 0,error:null};try{const o=JSON.parse(t);return o===null||typeof o!="object"||Array.isArray(o)?{context:void 0,error:"Targeting context must be a JSON object."}:{context:o,error:null}}catch{return{context:void 0,error:"Targeting context is not valid JSON."}}},V='{ "targetingKey": "user-123", "plan": "premium" }',_=a=>a.type==="object"?JSON.stringify(a.value):String(a.value),X=({initialShardKey:a=""})=>{const t=J(),[o,h]=$(""),{context:c,error:f}=L(o),x=c===void 0?{}:{context:c},{data:s,error:v,errorSource:y,liveError:N}=I(K.listFlags,x,{live:!0,shardKey:a}),g=s!==void 0,b=s?.configured??!1,m=Array.isArray(s?.flags)?[...s.flags].toSorted((r,S)=>r.key.localeCompare(S.key)):[];let d;return g&&!b?d=e(u,{description:t("No @lunora/flags provider is wired in this deployment. Add lunora/flags.ts with defineFlags({ provider }) to gate code paths on feature flags."),testId:"flags-unconfigured",title:t("No flags provider configured")}):g&&m.length===0?d=e(u,{description:t('A flags provider is configured, but no handler reads a flag yet. Call ctx.flags.boolean("key", false) in a query, mutation, or action.'),testId:"flags-empty",title:t("No flags read")}):d=e(A,{className:"overflow-hidden py-0",children:e(F,{className:"px-0",children:i(T,{"data-testid":"flags-table",children:[e(C,{children:i(p,{children:[e(l,{children:t("Key")}),e(l,{children:t("Type")}),e(l,{children:t("Value")}),e(l,{children:t("Reason")}),e(l,{children:t("Variant")})]})}),e(j,{children:m.map(r=>i(p,{"data-testid":`flags-row-${r.key}`,children:[e(n,{className:"font-mono text-xs",children:r.key}),e(n,{className:"font-mono text-xs text-muted-foreground",children:r.type}),e(n,{className:"font-mono text-xs",children:_(r)}),e(n,{children:r.errorCode===void 0?e("span",{className:"font-mono text-xs text-muted-foreground",children:r.reason??"—"}):e(w,{"data-testid":`flags-error-${r.key}`,variant:"destructive",children:r.errorCode})}),e(n,{className:"font-mono text-xs text-muted-foreground",children:r.variant??"—"})]},r.key))})]})})}),i("div",{className:"flex flex-col gap-6","data-testid":"lunora-flags-panel",children:[v!==null&&e(k,{error:y,testId:"flags-error"}),e("p",{className:"text-sm text-muted-foreground",children:t('Feature flags are read in code with ctx.flags.<type>("key", default). They evaluate through the OpenFeature provider configured in lunora/flags.ts; edit the targeting context below to see how each flag resolves for a given audience.')}),i("div",{className:"flex flex-col gap-2",children:[e(O,{htmlFor:"flags-targeting-context",children:t("Targeting context (JSON)")}),e(E,{className:"font-mono text-xs","data-testid":"flags-context-input",id:"flags-targeting-context",onChange:r=>{h(r.target.value)},placeholder:V,rows:3,value:o}),f!==null&&e("p",{className:"text-xs text-destructive","data-testid":"flags-context-error",role:"alert",children:t(f)}),N!==void 0&&e("p",{className:"text-xs text-amber-600 dark:text-amber-500","data-testid":"flags-live-error",role:"alert",children:t("Live updates unavailable; showing the last evaluation.")})]}),d]})};export{X as FlagsPanel};
1
+ import{useState as $}from"react";import{U as k}from"../packem_shared/error-alert-_2q2VtVG.js";import{g as w}from"../packem_shared/badge-BbuuAio7.js";import{c as A,f as O}from"../packem_shared/card-BMKx5UdA.js";import{E as u}from"../packem_shared/empty-state-Cg7t_8qu.js";import{p as T}from"../packem_shared/label-6uP1obNF.js";import{d as C,n as F,f as p,m as l,b as j,p as n}from"../packem_shared/table-DZAB8cs3.js";import{l as I}from"../packem_shared/textarea-Bu2-jKAs.js";import{N as J}from"../packem_shared/use-admin-query-CnnyWJXM.js";import{useT as K}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as E}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{jsx as e,jsxs as i}from"react/jsx-runtime";const L=a=>{const t=a.trim();if(t.length===0)return{context:void 0,error:null};try{const o=JSON.parse(t);return o===null||typeof o!="object"||Array.isArray(o)?{context:void 0,error:"Targeting context must be a JSON object."}:{context:o,error:null}}catch{return{context:void 0,error:"Targeting context is not valid JSON."}}},U='{ "targetingKey": "user-123", "plan": "premium" }',V=a=>a.type==="object"?JSON.stringify(a.value):String(a.value),X=({initialShardKey:a=""})=>{const t=K(),[o,h]=$(""),{context:c,error:f}=L(o),x=c===void 0?{}:{context:c},{data:s,error:v,errorSource:y,liveError:N}=J(E.listFlags,x,{live:!0,shardKey:a}),g=s!==void 0,b=s?.configured??!1,m=Array.isArray(s?.flags)?[...s.flags].toSorted((r,S)=>r.key.localeCompare(S.key)):[];let d;return g&&!b?d=e(u,{description:t("No @lunora/flags provider is wired in this deployment. Add lunora/flags.ts with defineFlags({ provider }) to gate code paths on feature flags."),testId:"flags-unconfigured",title:t("No flags provider configured")}):g&&m.length===0?d=e(u,{description:t('A flags provider is configured, but no handler reads a flag yet. Call ctx.flags.boolean("key", false) in a query, mutation, or action.'),testId:"flags-empty",title:t("No flags read")}):d=e(A,{className:"overflow-hidden py-0",children:e(O,{className:"px-0",children:i(C,{"data-testid":"flags-table",children:[e(F,{children:i(p,{children:[e(l,{children:t("Key")}),e(l,{children:t("Type")}),e(l,{children:t("Value")}),e(l,{children:t("Reason")}),e(l,{children:t("Variant")})]})}),e(j,{children:m.map(r=>i(p,{"data-testid":`flags-row-${r.key}`,children:[e(n,{className:"font-mono text-xs",children:r.key}),e(n,{className:"font-mono text-xs text-muted-foreground",children:r.type}),e(n,{className:"font-mono text-xs",children:V(r)}),e(n,{children:r.errorCode===void 0?e("span",{className:"font-mono text-xs text-muted-foreground",children:r.reason??"—"}):e(w,{"data-testid":`flags-error-${r.key}`,variant:"destructive",children:r.errorCode})}),e(n,{className:"font-mono text-xs text-muted-foreground",children:r.variant??"—"})]},r.key))})]})})}),i("div",{className:"flex flex-col gap-6","data-testid":"lunora-flags-panel",children:[v!==null&&e(k,{error:y,testId:"flags-error"}),e("p",{className:"text-sm text-muted-foreground",children:t('Feature flags are read in code with ctx.flags.<type>("key", default). They evaluate through the OpenFeature provider configured in lunora/flags.ts; edit the targeting context below to see how each flag resolves for a given audience.')}),i("div",{className:"flex flex-col gap-2",children:[e(T,{htmlFor:"flags-targeting-context",children:t("Targeting context (JSON)")}),e(I,{className:"font-mono text-xs","data-testid":"flags-context-input",id:"flags-targeting-context",onChange:r=>{h(r.target.value)},placeholder:U,rows:3,value:o}),f!==null&&e("p",{className:"text-xs text-destructive","data-testid":"flags-context-error",role:"alert",children:t(f)}),N!==void 0&&e("p",{className:"text-xs text-amber-600 dark:text-amber-500","data-testid":"flags-live-error",role:"alert",children:t("Live updates unavailable; showing the last evaluation.")})]}),d]})};export{X as default};
@@ -1 +1 @@
1
- import{c as xe}from"react/compiler-runtime";import{findIssueSolution as Ie,flattenHint as Se}from"@lunora/errors";import{useLunora as $e}from"@lunora/react";import{useState as le}from"react";import{L as ke}from"../packem_shared/live-status-CmuRLFKf.js";import{ShardInput as Me}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as ge}from"../packem_shared/badge-BbuuAio7.js";import{u as ne}from"../packem_shared/button-BkCrNcAs.js";import{c as Ae,u as Ce}from"../packem_shared/card-CIDGUN6K.js";import{E as Ke}from"../packem_shared/empty-state-Cg7t_8qu.js";import{u as Te}from"../packem_shared/input-JHu63lTv.js";import{N as _e,y as Ee,_ as ze,k as be,w as Le}from"../packem_shared/select-Bul-DeII.js";import{n as Re,d as Fe,m as ve,p as O,f as je,u as q}from"../packem_shared/table-DdJBrClo.js";import{N as qe}from"../packem_shared/use-admin-query-CnnyWJXM.js";import{u as Oe}from"../packem_shared/use-async-submit-BFIMhRqh.js";import{S as Ve}from"../packem_shared/use-shard-key-B2JtNa5m.js";import{useT as ye}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as ae}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{i as We,f as re,g as oe,d as we,b as De}from"../packem_shared/internal-zkEvTqy8.js";import{jsx as t,jsxs as I,Fragment as Ge}from"react/jsx-runtime";const fe="none",Be=["all","open","resolved","ignored"],He=["critical","high","medium","low"],Je=oe(ae.resolveIssue),Qe=oe(ae.ignoreIssue),Ne=oe(ae.assignIssue),Ue=oe(ae.setIssueSeverity),Xe=oe(ae.explainIssue),Ye=n=>Array.isArray(n?.issues)?n.issues:[],Ze=n=>n==="resolved"?"success":n==="ignored"?"secondary":"warning",Pe=n=>n==="critical"?"destructive":n==="high"?"warning":n==="medium"?"info":"secondary",es=n=>{const e=xe(44),{expanded:c,issue:s,shardKey:S}=n,i=$e(),l=ye(),[a,o]=le(void 0),{busy:E,error:C,run:L}=Oe();let K;e[0]!==i||e[1]!==s||e[2]!==L||e[3]!==S?(K=()=>{o(void 0),L(async()=>{const p={culprit:s.culprit,sampleMessage:s.sampleMessage,title:s.title},w=await i.query(Xe,p,we(S));o(w)})},e[0]=i,e[1]=s,e[2]=L,e[3]=S,e[4]=K):K=e[4];const z=K;if(!c)return null;let k;if(e[5]!==s.sampleMessage){const p=Ie(s.sampleMessage);k=p===void 0?void 0:Se(p.body),e[5]=s.sampleMessage,e[6]=k}else k=e[6];const T=k,_=`issues-detail-${s.hash}`;let d;e[7]!==s.sampleMessage?(d=t("p",{className:"whitespace-pre-wrap font-mono text-xs text-muted-foreground",children:s.sampleMessage}),e[7]=s.sampleMessage,e[8]=d):d=e[8];let f;e[9]!==l?(f=l("Suggested fix"),e[9]=l,e[10]=f):f=e[10];let M;e[11]!==f?(M=t("div",{className:"text-xs font-medium text-muted-foreground",children:f}),e[11]=f,e[12]=M):M=e[12];let x;e[13]!==T||e[14]!==s.hash||e[15]!==l?(x=T===void 0?t("p",{className:"mt-1 text-sm text-muted-foreground","data-testid":`issues-hint-empty-${s.hash}`,children:l("No known fix for this error yet.")}):t("p",{className:"mt-1 whitespace-pre-wrap text-sm","data-testid":`issues-hint-${s.hash}`,children:T}),e[13]=T,e[14]=s.hash,e[15]=l,e[16]=x):x=e[16];let v;e[17]!==M||e[18]!==x?(v=I("div",{children:[M,x]}),e[17]=M,e[18]=x,e[19]=v):v=e[19];const N=`issues-explain-${s.hash}`;let $;e[20]!==E||e[21]!==l?($=l(E?"Explaining…":"Explain in plain language"),e[20]=E,e[21]=l,e[22]=$):$=e[22];let u;e[23]!==E||e[24]!==z||e[25]!==$||e[26]!==N?(u=t("div",{children:t(ne,{"data-testid":N,disabled:E,onClick:z,size:"sm",type:"button",variant:"outline",children:$})}),e[23]=E,e[24]=z,e[25]=$,e[26]=N,e[27]=u):u=e[27];let g;e[28]!==C||e[29]!==s.hash?(g=C!==null&&t("p",{className:"text-xs text-destructive","data-testid":`issues-explain-error-${s.hash}`,role:"alert",children:C}),e[28]=C,e[29]=s.hash,e[30]=g):g=e[30];let m;e[31]!==a||e[32]!==s.hash||e[33]!==l?(m=a!==void 0&&(a.degraded?t("p",{className:"text-xs text-muted-foreground","data-testid":`issues-degraded-${s.hash}`,children:a.reason==="no-ai-binding"?l("No AI binding is configured. Wire an AI binding to enable plain-language explanations — the suggested fix above is always available."):l("The AI model could not explain this error right now. The suggested fix above still applies.")}):I("div",{"data-testid":`issues-explanation-${s.hash}`,children:[t("div",{className:"text-xs font-medium text-muted-foreground",children:l("AI explanation")}),t("p",{className:"mt-1 whitespace-pre-wrap text-sm",children:a.explanation}),a.groundedId===void 0&&t("p",{className:"mt-1 text-xs text-muted-foreground","data-testid":`issues-ungrounded-${s.hash}`,children:l("No catalog fix matched this error, so this explanation is the model's own reading of the message. Verify before acting on it.")}),t("p",{className:"mt-1 text-[0.7rem] text-muted-foreground",children:l("Generated by {model}",{model:a.model})})]})),e[31]=a,e[32]=s.hash,e[33]=l,e[34]=m):m=e[34];let h;e[35]!==u||e[36]!==g||e[37]!==m||e[38]!==d||e[39]!==v?(h=t(q,{className:"bg-muted/30",colSpan:7,children:I("div",{className:"flex flex-col gap-3 py-1",children:[d,v,u,g,m]})}),e[35]=u,e[36]=g,e[37]=m,e[38]=d,e[39]=v,e[40]=h):h=e[40];let b;return e[41]!==h||e[42]!==_?(b=t(ve,{"data-testid":_,children:h}),e[41]=h,e[42]=_,e[43]=b):b=e[43],b},ss=n=>{const e=xe(119),{busy:c,issue:s,rowError:S,runTriage:i,shardKey:l}=n,a=ye(),[o,E]=le(!1);let C;e[0]===Symbol.for("react.memo_cache_sentinel")?(C=()=>{E(ts)},e[0]=C):C=e[0];const L=C;let K;e[1]!==s.hash||e[2]!==i?(K=te=>{const ce=te===null||te===fe?null:te;re(i(s.hash,Ue,{severity:ce}))},e[1]=s.hash,e[2]=i,e[3]=K):K=e[3];const z=K;let k;e[4]!==s.hash||e[5]!==i?(k=te=>{if(te.key!=="Enter")return;const ce=te.currentTarget.value.trim();re(i(s.hash,Ne,{assignee:ce===""?null:ce}))},e[4]=s.hash,e[5]=i,e[6]=k):k=e[6];const T=k,_=`issues-row-${s.hash}`;let d;e[7]!==a?(d=a("Toggle issue details"),e[7]=a,e[8]=d):d=e[8];const f=`issues-toggle-${s.hash}`,M=`mt-1 size-3 shrink-0 text-muted-foreground transition-transform ${o?"rotate-90":""}`;let x;e[9]===Symbol.for("react.memo_cache_sentinel")?(x=t("path",{d:"m9 6 6 6-6 6"}),e[9]=x):x=e[9];let v;e[10]!==M?(v=t("svg",{"aria-hidden":"true",className:M,fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,viewBox:"0 0 24 24",children:x}),e[10]=M,e[11]=v):v=e[11];let N;e[12]!==s.title?(N=t("span",{className:"block truncate font-medium",title:s.title,children:s.title}),e[12]=s.title,e[13]=N):N=e[13];let $;e[14]!==s.culprit?($=t("span",{className:"block truncate font-mono text-xs text-muted-foreground",title:s.culprit,children:s.culprit}),e[14]=s.culprit,e[15]=$):$=e[15];let u;e[16]!==N||e[17]!==$?(u=I("span",{className:"min-w-0",children:[N,$]}),e[16]=N,e[17]=$,e[18]=u):u=e[18];let g;e[19]!==o||e[20]!==u||e[21]!==d||e[22]!==f||e[23]!==v?(g=I("button",{"aria-expanded":o,"aria-label":d,className:"flex w-full items-start gap-2 text-left","data-testid":f,onClick:L,type:"button",children:[v,u]}),e[19]=o,e[20]=u,e[21]=d,e[22]=f,e[23]=v,e[24]=g):g=e[24];let m;e[25]!==s.hash||e[26]!==S?(m=S!==void 0&&t("p",{className:"mt-1 text-xs text-destructive","data-testid":`issues-action-error-${s.hash}`,role:"alert",children:S}),e[25]=s.hash,e[26]=S,e[27]=m):m=e[27];let h;e[28]!==g||e[29]!==m?(h=I(q,{className:"max-w-80",children:[g,m]}),e[28]=g,e[29]=m,e[30]=h):h=e[30];const b=`issues-status-${s.hash}`;let p;e[31]!==s.status?(p=Ze(s.status),e[31]=s.status,e[32]=p):p=e[32];let w;e[33]!==s.status||e[34]!==b||e[35]!==p?(w=t(q,{children:t(ge,{"data-testid":b,variant:p,children:s.status})}),e[33]=s.status,e[34]=b,e[35]=p,e[36]=w):w=e[36];const R=s.severity??fe;let r;e[37]!==a?(r=a("Set severity"),e[37]=a,e[38]=r):r=e[38];const ie=`issues-severity-${s.hash}`;let F;e[39]!==a?(F=a("—"),e[39]=a,e[40]=F):F=e[40];let y;e[41]!==s.severity||e[42]!==a?(y=s.severity===void 0?t("span",{className:"text-muted-foreground",children:a("—")}):t(ge,{variant:Pe(s.severity),children:s.severity}),e[41]=s.severity,e[42]=a,e[43]=y):y=e[43];let A;e[44]!==F||e[45]!==y?(A=t(_e,{placeholder:F,children:y}),e[44]=F,e[45]=y,e[46]=A):A=e[46];let j;e[47]!==r||e[48]!==ie||e[49]!==A?(j=t(Ee,{"aria-label":r,className:"h-7 w-[110px]","data-testid":ie,children:A}),e[47]=r,e[48]=ie,e[49]=A,e[50]=j):j=e[50];let de;e[51]===Symbol.for("react.memo_cache_sentinel")?(de=He.map(as),e[51]=de):de=e[51];let V;e[52]!==a?(V=a("Clear"),e[52]=a,e[53]=V):V=e[53];let W;e[54]!==V?(W=I(ze,{children:[de,t(be,{value:fe,children:V})]}),e[54]=V,e[55]=W):W=e[55];let D;e[56]!==c||e[57]!==z||e[58]!==R||e[59]!==j||e[60]!==W?(D=t(q,{children:I(Le,{disabled:c,onValueChange:z,value:R,children:[j,W]})}),e[56]=c,e[57]=z,e[58]=R,e[59]=j,e[60]=W,e[61]=D):D=e[61];let G;e[62]!==a?(G=a("Assignee"),e[62]=a,e[63]=G):G=e[63];const ue=`issues-assignee-${s.hash}`,me=s.assignee??"",pe=s.assignee??"";let B;e[64]!==a?(B=a("Unassigned"),e[64]=a,e[65]=B):B=e[65];let H;e[66]!==c||e[67]!==T||e[68]!==G||e[69]!==ue||e[70]!==me||e[71]!==pe||e[72]!==B?(H=t(q,{children:t(Te,{"aria-label":G,className:"h-7 w-32","data-testid":ue,defaultValue:me,disabled:c,onKeyDown:T,placeholder:B},pe)}),e[66]=c,e[67]=T,e[68]=G,e[69]=ue,e[70]=me,e[71]=pe,e[72]=B,e[73]=H):H=e[73];let J;e[74]!==s.count?(J=t(q,{className:"text-right",children:t(ge,{variant:"secondary",children:s.count})}),e[74]=s.count,e[75]=J):J=e[75];let Q;e[76]!==s.lastSeen?(Q=We(s.lastSeen),e[76]=s.lastSeen,e[77]=Q):Q=e[77];let U;e[78]!==Q?(U=t(q,{className:"text-xs tabular-nums text-muted-foreground",children:Q}),e[78]=Q,e[79]=U):U=e[79];let X;e[80]!==c||e[81]!==s.hash||e[82]!==s.status||e[83]!==i||e[84]!==a?(X=s.status!=="resolved"&&t(ne,{"data-testid":`issues-resolve-${s.hash}`,disabled:c,onClick:()=>{re(i(s.hash,Je,{}))},size:"xs",variant:"outline",children:a("Resolve")}),e[80]=c,e[81]=s.hash,e[82]=s.status,e[83]=i,e[84]=a,e[85]=X):X=e[85];let Y;e[86]!==c||e[87]!==s.hash||e[88]!==s.status||e[89]!==i||e[90]!==a?(Y=s.status!=="ignored"&&t(ne,{"data-testid":`issues-ignore-${s.hash}`,disabled:c,onClick:()=>{re(i(s.hash,Qe,{}))},size:"xs",variant:"ghost",children:a("Ignore")}),e[86]=c,e[87]=s.hash,e[88]=s.status,e[89]=i,e[90]=a,e[91]=Y):Y=e[91];let Z;e[92]!==c||e[93]!==s.assignee||e[94]!==s.hash||e[95]!==s.status||e[96]!==i||e[97]!==a?(Z=s.status!=="open"&&t(ne,{"data-testid":`issues-reopen-${s.hash}`,disabled:c,onClick:()=>{re(i(s.hash,Ne,{assignee:s.assignee??null}))},size:"xs",variant:"ghost",children:a("Reopen")}),e[92]=c,e[93]=s.assignee,e[94]=s.hash,e[95]=s.status,e[96]=i,e[97]=a,e[98]=Z):Z=e[98];let P;e[99]!==X||e[100]!==Y||e[101]!==Z?(P=t(q,{className:"text-right",children:I("div",{className:"flex justify-end gap-1",children:[X,Y,Z]})}),e[99]=X,e[100]=Y,e[101]=Z,e[102]=P):P=e[102];let ee;e[103]!==h||e[104]!==w||e[105]!==D||e[106]!==H||e[107]!==J||e[108]!==U||e[109]!==_||e[110]!==P?(ee=I(ve,{"data-testid":_,children:[h,w,D,H,J,U,P]}),e[103]=h,e[104]=w,e[105]=D,e[106]=H,e[107]=J,e[108]=U,e[109]=_,e[110]=P,e[111]=ee):ee=e[111];let se;e[112]!==o||e[113]!==s||e[114]!==l?(se=t(es,{expanded:o,issue:s,shardKey:l},s.sampleMessage),e[112]=o,e[113]=s,e[114]=l,e[115]=se):se=e[115];let he;return e[116]!==ee||e[117]!==se?(he=I(Ge,{children:[ee,se]}),e[116]=ee,e[117]=se,e[118]=he):he=e[118],he},ks=n=>{const e=xe(38),{initialShardKey:c}=n,s=ye(),S=$e(),{queryShardKey:i,setShardKey:l,shardKey:a}=Ve(c),[o,E]=le("all"),[C,L]=le(is),[K,z]=le(rs);let k;e[0]!==o?(k=o==="all"?{}:{status:o},e[0]=o,e[1]=k):k=e[1];let T;e[2]!==i?(T={live:!0,shardKey:i},e[2]=i,e[3]=T):T=e[3];const{data:_,error:d,liveError:f}=qe(ae.getIssues,k,T),M=_!==void 0;let x;if(e[4]!==K||e[5]!==C||e[6]!==S||e[7]!==_||e[8]!==d||e[9]!==f||e[10]!==M||e[11]!==i||e[12]!==l||e[13]!==a||e[14]!==o||e[15]!==s){const v=Ye(_);let N;e[17]!==S||e[18]!==i?(N=async(r,ie,F)=>{z(y=>{if(!y.has(r))return y;const A=new Map(y);return A.delete(r),A}),L(y=>new Set(y).add(r));try{await S.query(ie,{...F,hash:r},we(i))}catch(y){const A=De(y);z(j=>new Map(j).set(r,A))}L(y=>{const A=new Set(y);return A.delete(r),A})},e[17]=S,e[18]=i,e[19]=N):N=e[19];const $=N;let u;e[20]!==s?(u=r=>s(r==="all"?"All":r==="open"?"Open":r==="resolved"?"Resolved":"Ignored"),e[20]=s,e[21]=u):u=e[21];const g=u;let m;e[22]!==d?(m=d!==null&&t("p",{className:"text-sm text-destructive","data-testid":"issues-error",role:"alert",children:d}),e[22]=d,e[23]=m):m=e[23];let h;e[24]!==l||e[25]!==a?(h=t(Me,{onChange:l,testId:"issues-shard-input",value:a}),e[24]=l,e[25]=a,e[26]=h):h=e[26];let b;e[27]!==f?(b=t(ke,{message:f,prefix:"issues"}),e[27]=f,e[28]=b):b=e[28];let p;e[29]!==o||e[30]!==g?(p=Be.map(r=>t(ne,{"data-active":o===r?"":void 0,"data-testid":`issues-filter-${r}`,onClick:()=>{E(r)},size:"xs",variant:o===r?"default":"outline",children:g(r)},r)),e[29]=o,e[30]=g,e[31]=p):p=e[31];let w;e[32]!==p?(w=t("div",{className:"ms-auto flex items-center gap-1","data-testid":"issues-status-filter",role:"group",children:p}),e[32]=p,e[33]=w):w=e[33];let R;e[34]!==w||e[35]!==h||e[36]!==b?(R=I("div",{className:"flex flex-wrap items-center gap-2",children:[h,b,w]}),e[34]=w,e[35]=h,e[36]=b,e[37]=R):R=e[37],x=I("div",{className:"flex flex-col gap-6","data-testid":"lunora-issues-panel",children:[m,R,M&&v.length===0?t(Ke,{description:s("No grouped errors yet. When a function throws or a container crashes, matching errors fold into a single issue here."),testId:"issues-empty",title:s("No issues")}):t(Ae,{className:"overflow-hidden py-0",children:t(Ce,{className:"px-0",children:I(Re,{"data-testid":"issues-table",children:[t(Fe,{children:I(ve,{children:[t(O,{children:s("Issue")}),t(O,{children:s("Status")}),t(O,{children:s("Severity")}),t(O,{children:s("Assignee")}),t(O,{className:"text-right",children:s("Events")}),t(O,{children:s("Last seen")}),t(O,{className:"text-right",children:s("Actions")})]})}),t(je,{children:v.map(r=>t(ss,{busy:C.has(r.hash),issue:r,rowError:K.get(r.hash),runTriage:$,shardKey:i},r.hash))})]})})})]}),e[4]=K,e[5]=C,e[6]=S,e[7]=_,e[8]=d,e[9]=f,e[10]=M,e[11]=i,e[12]=l,e[13]=a,e[14]=o,e[15]=s,e[16]=x}else x=e[16];return x};function ts(n){return!n}function as(n){return t(be,{value:n,children:n},n)}function is(){return new Set}function rs(){return new Map}export{ks as IssuesPanel};
1
+ import{c as xe}from"react/compiler-runtime";import{findIssueSolution as Se,flattenHint as Ie}from"@lunora/errors";import{useLunora as $e}from"@lunora/react";import{useState as le}from"react";import{L as ke}from"../packem_shared/live-status-CmuRLFKf.js";import{ShardInput as Me}from"../packem_shared/ShardInput-BVn2iCU0.js";import{g as ge}from"../packem_shared/badge-BbuuAio7.js";import{u as ne}from"../packem_shared/button-BkCrNcAs.js";import{c as Ae,f as Ce}from"../packem_shared/card-BMKx5UdA.js";import{E as Ke}from"../packem_shared/empty-state-Cg7t_8qu.js";import{u as _e}from"../packem_shared/input-JHu63lTv.js";import{w as Te,z as Ee,S as ze,_ as be,x as Le}from"../packem_shared/select-BssZMiFY.js";import{d as Re,n as Fe,f as ve,m as O,b as je,p as q}from"../packem_shared/table-DZAB8cs3.js";import{N as qe}from"../packem_shared/use-admin-query-CnnyWJXM.js";import{_ as Oe}from"../packem_shared/use-async-submit-B32whHJO.js";import{S as Ve}from"../packem_shared/use-shard-key-B2JtNa5m.js";import{useT as ye}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{ADMIN_FUNCTIONS as ae}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{i as We,f as re,g as oe,d as we,b as De}from"../packem_shared/internal-zkEvTqy8.js";import{jsx as s,jsxs as S,Fragment as Ge}from"react/jsx-runtime";const fe="none",Be=["all","open","resolved","ignored"],He=["critical","high","medium","low"],Je=oe(ae.resolveIssue),Qe=oe(ae.ignoreIssue),Ne=oe(ae.assignIssue),Ue=oe(ae.setIssueSeverity),Xe=oe(ae.explainIssue),Ye=n=>Array.isArray(n?.issues)?n.issues:[],Ze=n=>n==="resolved"?"success":n==="ignored"?"secondary":"warning",Pe=n=>n==="critical"?"destructive":n==="high"?"warning":n==="medium"?"info":"secondary",et=n=>{const e=xe(44),{expanded:c,issue:t,shardKey:I}=n,i=$e(),l=ye(),[a,o]=le(void 0),{busy:E,error:C,run:L}=Oe();let K;e[0]!==i||e[1]!==t||e[2]!==L||e[3]!==I?(K=()=>{o(void 0),L(async()=>{const p={culprit:t.culprit,sampleMessage:t.sampleMessage,title:t.title},w=await i.query(Xe,p,we(I));o(w)})},e[0]=i,e[1]=t,e[2]=L,e[3]=I,e[4]=K):K=e[4];const z=K;if(!c)return null;let k;if(e[5]!==t.sampleMessage){const p=Se(t.sampleMessage);k=p===void 0?void 0:Ie(p.body),e[5]=t.sampleMessage,e[6]=k}else k=e[6];const _=k,T=`issues-detail-${t.hash}`;let d;e[7]!==t.sampleMessage?(d=s("p",{className:"whitespace-pre-wrap font-mono text-xs text-muted-foreground",children:t.sampleMessage}),e[7]=t.sampleMessage,e[8]=d):d=e[8];let f;e[9]!==l?(f=l("Suggested fix"),e[9]=l,e[10]=f):f=e[10];let M;e[11]!==f?(M=s("div",{className:"text-xs font-medium text-muted-foreground",children:f}),e[11]=f,e[12]=M):M=e[12];let x;e[13]!==_||e[14]!==t.hash||e[15]!==l?(x=_===void 0?s("p",{className:"mt-1 text-sm text-muted-foreground","data-testid":`issues-hint-empty-${t.hash}`,children:l("No known fix for this error yet.")}):s("p",{className:"mt-1 whitespace-pre-wrap text-sm","data-testid":`issues-hint-${t.hash}`,children:_}),e[13]=_,e[14]=t.hash,e[15]=l,e[16]=x):x=e[16];let v;e[17]!==M||e[18]!==x?(v=S("div",{children:[M,x]}),e[17]=M,e[18]=x,e[19]=v):v=e[19];const N=`issues-explain-${t.hash}`;let $;e[20]!==E||e[21]!==l?($=l(E?"Explaining…":"Explain in plain language"),e[20]=E,e[21]=l,e[22]=$):$=e[22];let u;e[23]!==E||e[24]!==z||e[25]!==$||e[26]!==N?(u=s("div",{children:s(ne,{"data-testid":N,disabled:E,onClick:z,size:"sm",type:"button",variant:"outline",children:$})}),e[23]=E,e[24]=z,e[25]=$,e[26]=N,e[27]=u):u=e[27];let g;e[28]!==C||e[29]!==t.hash?(g=C!==null&&s("p",{className:"text-xs text-destructive","data-testid":`issues-explain-error-${t.hash}`,role:"alert",children:C}),e[28]=C,e[29]=t.hash,e[30]=g):g=e[30];let m;e[31]!==a||e[32]!==t.hash||e[33]!==l?(m=a!==void 0&&(a.degraded?s("p",{className:"text-xs text-muted-foreground","data-testid":`issues-degraded-${t.hash}`,children:a.reason==="no-ai-binding"?l("No AI binding is configured. Wire an AI binding to enable plain-language explanations — the suggested fix above is always available."):l("The AI model could not explain this error right now. The suggested fix above still applies.")}):S("div",{"data-testid":`issues-explanation-${t.hash}`,children:[s("div",{className:"text-xs font-medium text-muted-foreground",children:l("AI explanation")}),s("p",{className:"mt-1 whitespace-pre-wrap text-sm",children:a.explanation}),a.groundedId===void 0&&s("p",{className:"mt-1 text-xs text-muted-foreground","data-testid":`issues-ungrounded-${t.hash}`,children:l("No catalog fix matched this error, so this explanation is the model's own reading of the message. Verify before acting on it.")}),s("p",{className:"mt-1 text-[0.7rem] text-muted-foreground",children:l("Generated by {model}",{model:a.model})})]})),e[31]=a,e[32]=t.hash,e[33]=l,e[34]=m):m=e[34];let h;e[35]!==u||e[36]!==g||e[37]!==m||e[38]!==d||e[39]!==v?(h=s(q,{className:"bg-muted/30",colSpan:7,children:S("div",{className:"flex flex-col gap-3 py-1",children:[d,v,u,g,m]})}),e[35]=u,e[36]=g,e[37]=m,e[38]=d,e[39]=v,e[40]=h):h=e[40];let b;return e[41]!==h||e[42]!==T?(b=s(ve,{"data-testid":T,children:h}),e[41]=h,e[42]=T,e[43]=b):b=e[43],b},tt=n=>{const e=xe(119),{busy:c,issue:t,rowError:I,runTriage:i,shardKey:l}=n,a=ye(),[o,E]=le(!1);let C;e[0]===Symbol.for("react.memo_cache_sentinel")?(C=()=>{E(st)},e[0]=C):C=e[0];const L=C;let K;e[1]!==t.hash||e[2]!==i?(K=se=>{const ce=se===null||se===fe?null:se;re(i(t.hash,Ue,{severity:ce}))},e[1]=t.hash,e[2]=i,e[3]=K):K=e[3];const z=K;let k;e[4]!==t.hash||e[5]!==i?(k=se=>{if(se.key!=="Enter")return;const ce=se.currentTarget.value.trim();re(i(t.hash,Ne,{assignee:ce===""?null:ce}))},e[4]=t.hash,e[5]=i,e[6]=k):k=e[6];const _=k,T=`issues-row-${t.hash}`;let d;e[7]!==a?(d=a("Toggle issue details"),e[7]=a,e[8]=d):d=e[8];const f=`issues-toggle-${t.hash}`,M=`mt-1 size-3 shrink-0 text-muted-foreground transition-transform ${o?"rotate-90":""}`;let x;e[9]===Symbol.for("react.memo_cache_sentinel")?(x=s("path",{d:"m9 6 6 6-6 6"}),e[9]=x):x=e[9];let v;e[10]!==M?(v=s("svg",{"aria-hidden":"true",className:M,fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,viewBox:"0 0 24 24",children:x}),e[10]=M,e[11]=v):v=e[11];let N;e[12]!==t.title?(N=s("span",{className:"block truncate font-medium",title:t.title,children:t.title}),e[12]=t.title,e[13]=N):N=e[13];let $;e[14]!==t.culprit?($=s("span",{className:"block truncate font-mono text-xs text-muted-foreground",title:t.culprit,children:t.culprit}),e[14]=t.culprit,e[15]=$):$=e[15];let u;e[16]!==N||e[17]!==$?(u=S("span",{className:"min-w-0",children:[N,$]}),e[16]=N,e[17]=$,e[18]=u):u=e[18];let g;e[19]!==o||e[20]!==u||e[21]!==d||e[22]!==f||e[23]!==v?(g=S("button",{"aria-expanded":o,"aria-label":d,className:"flex w-full items-start gap-2 text-left","data-testid":f,onClick:L,type:"button",children:[v,u]}),e[19]=o,e[20]=u,e[21]=d,e[22]=f,e[23]=v,e[24]=g):g=e[24];let m;e[25]!==t.hash||e[26]!==I?(m=I!==void 0&&s("p",{className:"mt-1 text-xs text-destructive","data-testid":`issues-action-error-${t.hash}`,role:"alert",children:I}),e[25]=t.hash,e[26]=I,e[27]=m):m=e[27];let h;e[28]!==g||e[29]!==m?(h=S(q,{className:"max-w-80",children:[g,m]}),e[28]=g,e[29]=m,e[30]=h):h=e[30];const b=`issues-status-${t.hash}`;let p;e[31]!==t.status?(p=Ze(t.status),e[31]=t.status,e[32]=p):p=e[32];let w;e[33]!==t.status||e[34]!==b||e[35]!==p?(w=s(q,{children:s(ge,{"data-testid":b,variant:p,children:t.status})}),e[33]=t.status,e[34]=b,e[35]=p,e[36]=w):w=e[36];const R=t.severity??fe;let r;e[37]!==a?(r=a("Set severity"),e[37]=a,e[38]=r):r=e[38];const ie=`issues-severity-${t.hash}`;let F;e[39]!==a?(F=a("—"),e[39]=a,e[40]=F):F=e[40];let y;e[41]!==t.severity||e[42]!==a?(y=t.severity===void 0?s("span",{className:"text-muted-foreground",children:a("—")}):s(ge,{variant:Pe(t.severity),children:t.severity}),e[41]=t.severity,e[42]=a,e[43]=y):y=e[43];let A;e[44]!==F||e[45]!==y?(A=s(Te,{placeholder:F,children:y}),e[44]=F,e[45]=y,e[46]=A):A=e[46];let j;e[47]!==r||e[48]!==ie||e[49]!==A?(j=s(Ee,{"aria-label":r,className:"h-7 w-[110px]","data-testid":ie,children:A}),e[47]=r,e[48]=ie,e[49]=A,e[50]=j):j=e[50];let de;e[51]===Symbol.for("react.memo_cache_sentinel")?(de=He.map(at),e[51]=de):de=e[51];let V;e[52]!==a?(V=a("Clear"),e[52]=a,e[53]=V):V=e[53];let W;e[54]!==V?(W=S(ze,{children:[de,s(be,{value:fe,children:V})]}),e[54]=V,e[55]=W):W=e[55];let D;e[56]!==c||e[57]!==z||e[58]!==R||e[59]!==j||e[60]!==W?(D=s(q,{children:S(Le,{disabled:c,onValueChange:z,value:R,children:[j,W]})}),e[56]=c,e[57]=z,e[58]=R,e[59]=j,e[60]=W,e[61]=D):D=e[61];let G;e[62]!==a?(G=a("Assignee"),e[62]=a,e[63]=G):G=e[63];const ue=`issues-assignee-${t.hash}`,me=t.assignee??"",pe=t.assignee??"";let B;e[64]!==a?(B=a("Unassigned"),e[64]=a,e[65]=B):B=e[65];let H;e[66]!==c||e[67]!==_||e[68]!==G||e[69]!==ue||e[70]!==me||e[71]!==pe||e[72]!==B?(H=s(q,{children:s(_e,{"aria-label":G,className:"h-7 w-32","data-testid":ue,defaultValue:me,disabled:c,onKeyDown:_,placeholder:B},pe)}),e[66]=c,e[67]=_,e[68]=G,e[69]=ue,e[70]=me,e[71]=pe,e[72]=B,e[73]=H):H=e[73];let J;e[74]!==t.count?(J=s(q,{className:"text-right",children:s(ge,{variant:"secondary",children:t.count})}),e[74]=t.count,e[75]=J):J=e[75];let Q;e[76]!==t.lastSeen?(Q=We(t.lastSeen),e[76]=t.lastSeen,e[77]=Q):Q=e[77];let U;e[78]!==Q?(U=s(q,{className:"text-xs tabular-nums text-muted-foreground",children:Q}),e[78]=Q,e[79]=U):U=e[79];let X;e[80]!==c||e[81]!==t.hash||e[82]!==t.status||e[83]!==i||e[84]!==a?(X=t.status!=="resolved"&&s(ne,{"data-testid":`issues-resolve-${t.hash}`,disabled:c,onClick:()=>{re(i(t.hash,Je,{}))},size:"xs",variant:"outline",children:a("Resolve")}),e[80]=c,e[81]=t.hash,e[82]=t.status,e[83]=i,e[84]=a,e[85]=X):X=e[85];let Y;e[86]!==c||e[87]!==t.hash||e[88]!==t.status||e[89]!==i||e[90]!==a?(Y=t.status!=="ignored"&&s(ne,{"data-testid":`issues-ignore-${t.hash}`,disabled:c,onClick:()=>{re(i(t.hash,Qe,{}))},size:"xs",variant:"ghost",children:a("Ignore")}),e[86]=c,e[87]=t.hash,e[88]=t.status,e[89]=i,e[90]=a,e[91]=Y):Y=e[91];let Z;e[92]!==c||e[93]!==t.assignee||e[94]!==t.hash||e[95]!==t.status||e[96]!==i||e[97]!==a?(Z=t.status!=="open"&&s(ne,{"data-testid":`issues-reopen-${t.hash}`,disabled:c,onClick:()=>{re(i(t.hash,Ne,{assignee:t.assignee??null}))},size:"xs",variant:"ghost",children:a("Reopen")}),e[92]=c,e[93]=t.assignee,e[94]=t.hash,e[95]=t.status,e[96]=i,e[97]=a,e[98]=Z):Z=e[98];let P;e[99]!==X||e[100]!==Y||e[101]!==Z?(P=s(q,{className:"text-right",children:S("div",{className:"flex justify-end gap-1",children:[X,Y,Z]})}),e[99]=X,e[100]=Y,e[101]=Z,e[102]=P):P=e[102];let ee;e[103]!==h||e[104]!==w||e[105]!==D||e[106]!==H||e[107]!==J||e[108]!==U||e[109]!==T||e[110]!==P?(ee=S(ve,{"data-testid":T,children:[h,w,D,H,J,U,P]}),e[103]=h,e[104]=w,e[105]=D,e[106]=H,e[107]=J,e[108]=U,e[109]=T,e[110]=P,e[111]=ee):ee=e[111];let te;e[112]!==o||e[113]!==t||e[114]!==l?(te=s(et,{expanded:o,issue:t,shardKey:l},t.sampleMessage),e[112]=o,e[113]=t,e[114]=l,e[115]=te):te=e[115];let he;return e[116]!==ee||e[117]!==te?(he=S(Ge,{children:[ee,te]}),e[116]=ee,e[117]=te,e[118]=he):he=e[118],he},kt=n=>{const e=xe(38),{initialShardKey:c}=n,t=ye(),I=$e(),{queryShardKey:i,setShardKey:l,shardKey:a}=Ve(c),[o,E]=le("all"),[C,L]=le(it),[K,z]=le(rt);let k;e[0]!==o?(k=o==="all"?{}:{status:o},e[0]=o,e[1]=k):k=e[1];let _;e[2]!==i?(_={live:!0,shardKey:i},e[2]=i,e[3]=_):_=e[3];const{data:T,error:d,liveError:f}=qe(ae.getIssues,k,_),M=T!==void 0;let x;if(e[4]!==K||e[5]!==C||e[6]!==I||e[7]!==T||e[8]!==d||e[9]!==f||e[10]!==M||e[11]!==i||e[12]!==l||e[13]!==a||e[14]!==o||e[15]!==t){const v=Ye(T);let N;e[17]!==I||e[18]!==i?(N=async(r,ie,F)=>{z(y=>{if(!y.has(r))return y;const A=new Map(y);return A.delete(r),A}),L(y=>new Set(y).add(r));try{await I.query(ie,{...F,hash:r},we(i))}catch(y){const A=De(y);z(j=>new Map(j).set(r,A))}L(y=>{const A=new Set(y);return A.delete(r),A})},e[17]=I,e[18]=i,e[19]=N):N=e[19];const $=N;let u;e[20]!==t?(u=r=>t(r==="all"?"All":r==="open"?"Open":r==="resolved"?"Resolved":"Ignored"),e[20]=t,e[21]=u):u=e[21];const g=u;let m;e[22]!==d?(m=d!==null&&s("p",{className:"text-sm text-destructive","data-testid":"issues-error",role:"alert",children:d}),e[22]=d,e[23]=m):m=e[23];let h;e[24]!==l||e[25]!==a?(h=s(Me,{onChange:l,testId:"issues-shard-input",value:a}),e[24]=l,e[25]=a,e[26]=h):h=e[26];let b;e[27]!==f?(b=s(ke,{message:f,prefix:"issues"}),e[27]=f,e[28]=b):b=e[28];let p;e[29]!==o||e[30]!==g?(p=Be.map(r=>s(ne,{"data-active":o===r?"":void 0,"data-testid":`issues-filter-${r}`,onClick:()=>{E(r)},size:"xs",variant:o===r?"default":"outline",children:g(r)},r)),e[29]=o,e[30]=g,e[31]=p):p=e[31];let w;e[32]!==p?(w=s("div",{className:"ms-auto flex items-center gap-1","data-testid":"issues-status-filter",role:"group",children:p}),e[32]=p,e[33]=w):w=e[33];let R;e[34]!==w||e[35]!==h||e[36]!==b?(R=S("div",{className:"flex flex-wrap items-center gap-2",children:[h,b,w]}),e[34]=w,e[35]=h,e[36]=b,e[37]=R):R=e[37],x=S("div",{className:"flex flex-col gap-6","data-testid":"lunora-issues-panel",children:[m,R,M&&v.length===0?s(Ke,{description:t("No grouped errors yet. When a function throws or a container crashes, matching errors fold into a single issue here."),testId:"issues-empty",title:t("No issues")}):s(Ae,{className:"overflow-hidden py-0",children:s(Ce,{className:"px-0",children:S(Re,{"data-testid":"issues-table",children:[s(Fe,{children:S(ve,{children:[s(O,{children:t("Issue")}),s(O,{children:t("Status")}),s(O,{children:t("Severity")}),s(O,{children:t("Assignee")}),s(O,{className:"text-right",children:t("Events")}),s(O,{children:t("Last seen")}),s(O,{className:"text-right",children:t("Actions")})]})}),s(je,{children:v.map(r=>s(tt,{busy:C.has(r.hash),issue:r,rowError:K.get(r.hash),runTriage:$,shardKey:i},r.hash))})]})})})]}),e[4]=K,e[5]=C,e[6]=I,e[7]=T,e[8]=d,e[9]=f,e[10]=M,e[11]=i,e[12]=l,e[13]=a,e[14]=o,e[15]=t,e[16]=x}else x=e[16];return x};function st(n){return!n}function at(n){return s(be,{value:n,children:n},n)}function it(){return new Set}function rt(){return new Map}export{kt as default};
@@ -1 +1 @@
1
- import{useLunora as ee}from"@lunora/react";import{useState as Z,useReducer as ae,useEffect as le}from"react";import{c as ve,u as pe}from"../packem_shared/card-CIDGUN6K.js";import{E as Fe}from"../packem_shared/empty-state-Cg7t_8qu.js";import{n as ye,d as he,m as X,p as Y,f as ke,u as Q}from"../packem_shared/table-DdJBrClo.js";import{useT as q}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{f as z,b as H,l as Ke,c as ne}from"../packem_shared/internal-zkEvTqy8.js";import{u as B}from"../packem_shared/button-BkCrNcAs.js";import{f as de}from"../packem_shared/checkbox-StT4Gob6.js";import{u as re}from"../packem_shared/input-JHu63lTv.js";import{g as se,c as ie,N as oe,v as ce}from"../packem_shared/studio-Drf4en3j.js";import{c as te}from"react/compiler-runtime";import{p as G}from"../packem_shared/label-6uP1obNF.js";import{l as be}from"../packem_shared/textarea-Bu2-jKAs.js";import{N as Ee,y as Ve,k as Me,_ as Te,w as Ie}from"../packem_shared/select-Bul-DeII.js";import{jsx as r,jsxs as $,Fragment as fe}from"react/jsx-runtime";import{g as Oe}from"../packem_shared/badge-BbuuAio7.js";const _e=l=>{const e=l.trim();if(e==="")return;const d=Number(e);return Number.isFinite(d)&&d>0?Math.floor(d):void 0},Je=l=>l===void 0?"—":new Date(l*1e3).toISOString(),De=l=>new TextEncoder().encode(l).length,ge=l=>{if(l.trim()!=="")try{return JSON.stringify(JSON.parse(l),void 0,2)}catch{return}},xe=l=>{if(l.trim()==="")return!0;try{return JSON.parse(l),!0}catch{return!1}},Ne=[{key:"seconds",seconds:1},{key:"minutes",seconds:60},{key:"hours",seconds:3600},{key:"days",seconds:86400}],ue=(l,e)=>{const d=l.trim();if(d==="")return"";const c=Number(d),s=Ne.find(m=>m.key===e)?.seconds??1;return Number.isFinite(c)&&c>0?String(Math.round(c*s)):d},Ce=l=>{const e=l.trim();if(e==="")return!0;const d=Number(e);return Number.isInteger(d)&&d>=60},we=(l,e,d,c)=>{const s=_e(l.ttl);return{expiration:s===void 0?c:void 0,expirationTtl:s,key:e,metadata:l.metadata.trim()===""?void 0:JSON.parse(l.metadata),namespace:d,value:l.value}},$e=l=>{const e=te(60),{helper:d,id:c,invalid:s,onChange:m,testId:i}=l,t=q(),[a,v]=Z(""),[o,g]=Z("seconds");let b;e[0]!==m||e[1]!==o?(b=f=>{v(f.target.value),m(ue(f.target.value,o))},e[0]=m,e[1]=o,e[2]=b):b=e[2];const I=b;let E;e[3]!==a||e[4]!==m?(E=f=>{f!==null&&(g(f),m(ue(a,f)))},e[3]=a,e[4]=m,e[5]=E):E=e[5];const O=E;let p;e[6]!==t?(p=t("days"),e[6]=t,e[7]=p):p=e[7];let u;e[8]!==t?(u=t("hours"),e[8]=t,e[9]=u):u=e[9];let y;e[10]!==t?(y=t("minutes"),e[10]=t,e[11]=y):y=e[11];let x;e[12]!==t?(x=t("seconds"),e[12]=t,e[13]=x):x=e[13];let N;e[14]!==p||e[15]!==u||e[16]!==y||e[17]!==x?(N={days:p,hours:u,minutes:y,seconds:x},e[14]=p,e[15]=u,e[16]=y,e[17]=x,e[18]=N):N=e[18];const C=N;let k;e[19]!==t?(k=t("Expires after"),e[19]=t,e[20]=k):k=e[20];let w;e[21]!==c||e[22]!==k?(w=r(G,{className:"text-xs",htmlFor:c,children:k}),e[21]=c,e[22]=k,e[23]=w):w=e[23];let K;e[24]!==t?(K=t("No expiration"),e[24]=t,e[25]=K):K=e[25];let J;e[26]!==a||e[27]!==c||e[28]!==s||e[29]!==I||e[30]!==K||e[31]!==i?(J=r(re,{"aria-invalid":s,className:"flex-1","data-testid":i,id:c,inputMode:"numeric",onChange:I,placeholder:K,value:a}),e[26]=a,e[27]=c,e[28]=s,e[29]=I,e[30]=K,e[31]=i,e[32]=J):J=e[32];let V;e[33]!==t?(V=t("TTL unit"),e[33]=t,e[34]=V):V=e[34];const L=`${i}-unit`;let D;e[35]===Symbol.for("react.memo_cache_sentinel")?(D=r(Ee,{}),e[35]=D):D=e[35];let M;e[36]!==V||e[37]!==L?(M=r(Ve,{"aria-label":V,className:"w-[7.5rem]","data-testid":L,children:D}),e[36]=V,e[37]=L,e[38]=M):M=e[38];let n;e[39]!==C?(n=Ne.map(f=>r(Me,{value:f.key,children:C[f.key]},f.key)),e[39]=C,e[40]=n):n=e[40];let h;e[41]!==n?(h=r(Te,{children:n}),e[41]=n,e[42]=h):h=e[42];let S;e[43]!==O||e[44]!==M||e[45]!==h||e[46]!==o?(S=$(Ie,{onValueChange:O,value:o,children:[M,h]}),e[43]=O,e[44]=M,e[45]=h,e[46]=o,e[47]=S):S=e[47];let T;e[48]!==J||e[49]!==S?(T=$("div",{className:"flex gap-2",children:[J,S]}),e[48]=J,e[49]=S,e[50]=T):T=e[50];let F;e[51]!==d||e[52]!==s||e[53]!==t||e[54]!==i?(F=s?r("p",{className:"text-xs text-destructive","data-testid":`${i}-invalid`,children:t("TTL must be at least 60 seconds.")}):d!==void 0&&r("p",{className:"text-xs text-muted-foreground",children:d}),e[51]=d,e[52]=s,e[53]=t,e[54]=i,e[55]=F):F=e[55];let _;return e[56]!==T||e[57]!==F||e[58]!==w?(_=$("div",{className:"mb-3 grid gap-1",children:[w,T,F]}),e[56]=T,e[57]=F,e[58]=w,e[59]=_):_=e[59],_},Se=l=>{const e=te(36),{id:d,invalidTestId:c,onChange:s,testId:m,valid:i,value:t}=l,a=q();let v;e[0]!==t?(v=ge(t),e[0]=t,e[1]=v):v=e[1];const o=v;let g;e[2]!==a?(g=a("Metadata (JSON)"),e[2]=a,e[3]=g):g=e[3];let b;e[4]!==d||e[5]!==g?(b=r(G,{className:"text-xs",htmlFor:d,children:g}),e[4]=d,e[5]=g,e[6]=b):b=e[6];const I=`${m}-format`,E=o===void 0;let O;e[7]!==o||e[8]!==s?(O=()=>{o!==void 0&&s(o)},e[7]=o,e[8]=s,e[9]=O):O=e[9];let p;e[10]!==a?(p=a("Format JSON"),e[10]=a,e[11]=p):p=e[11];let u;e[12]!==I||e[13]!==E||e[14]!==O||e[15]!==p?(u=r(B,{"data-testid":I,disabled:E,onClick:O,size:"sm",variant:"outline",children:p}),e[12]=I,e[13]=E,e[14]=O,e[15]=p,e[16]=u):u=e[16];let y;e[17]!==b||e[18]!==u?(y=$("div",{className:"flex items-center justify-between gap-2",children:[b,u]}),e[17]=b,e[18]=u,e[19]=y):y=e[19];const x=!i;let N;e[20]!==s?(N=K=>{s(K.target.value)},e[20]=s,e[21]=N):N=e[21];let C;e[22]!==d||e[23]!==x||e[24]!==N||e[25]!==m||e[26]!==t?(C=r(be,{"aria-invalid":x,className:"min-h-[4rem] font-mono text-xs","data-testid":m,id:d,onChange:N,value:t}),e[22]=d,e[23]=x,e[24]=N,e[25]=m,e[26]=t,e[27]=C):C=e[27];let k;e[28]!==c||e[29]!==a||e[30]!==i?(k=!i&&r("p",{className:"text-xs text-destructive","data-testid":c,children:a("Metadata must be valid JSON.")}),e[28]=c,e[29]=a,e[30]=i,e[31]=k):k=e[31];let w;return e[32]!==C||e[33]!==k||e[34]!==y?(w=$("div",{className:"mb-3 grid gap-1",children:[y,C,k]}),e[32]=C,e[33]=k,e[34]=y,e[35]=w):w=e[35],w},Le={busy:!1,error:null,metadata:"",name:"",ttl:"",value:""},Be=(l,e)=>{switch(e.type){case"setField":return{...l,[e.field]:e.value};case"submitFailed":return{...l,busy:!1,error:e.error};case"submitStart":return{...l,busy:!0,error:null};default:return l}},Pe=l=>{const e=te(73),{namespace:d,onCancel:c,onCreated:s}=l,m=ee(),i=q(),[t,a]=ae(Be,Le);let v;e[0]!==t.metadata?(v=xe(t.metadata),e[0]=t.metadata,e[1]=v):v=e[1];const o=v;let g;e[2]!==t.ttl?(g=Ce(t.ttl),e[2]=t.ttl,e[3]=g):g=e[3];const b=g;let I;e[4]!==o||e[5]!==t.busy||e[6]!==t.name||e[7]!==b?(I=t.name.trim()!==""&&o&&b&&!t.busy,e[4]=o,e[5]=t.busy,e[6]=t.name,e[7]=b,e[8]=I):I=e[8];const E=I;let O;e[9]!==E||e[10]!==m||e[11]!==d||e[12]!==s||e[13]!==t.metadata||e[14]!==t.name||e[15]!==t.ttl||e[16]!==t.value?(O=()=>{E&&(a({type:"submitStart"}),z((async()=>{try{await m.putKvValue(we({metadata:t.metadata,ttl:t.ttl,value:t.value},t.name,d)),s()}catch(j){a({error:H(j),type:"submitFailed"})}})()))},e[9]=E,e[10]=m,e[11]=d,e[12]=s,e[13]=t.metadata,e[14]=t.name,e[15]=t.ttl,e[16]=t.value,e[17]=O):O=e[17];const p=O;let u;e[18]!==i?(u=i("Key name"),e[18]=i,e[19]=u):u=e[19];let y;e[20]!==u?(y=r(G,{className:"text-xs",htmlFor:"kv-create-name",children:u}),e[20]=u,e[21]=y):y=e[21];let x;e[22]===Symbol.for("react.memo_cache_sentinel")?(x=j=>{a({field:"name",type:"setField",value:j.target.value})},e[22]=x):x=e[22];let N;e[23]!==i?(N=i("Key name"),e[23]=i,e[24]=N):N=e[24];let C;e[25]!==t.name||e[26]!==N?(C=r(re,{autoFocus:!0,"data-testid":"kv-create-name",id:"kv-create-name",onChange:x,placeholder:N,value:t.name}),e[25]=t.name,e[26]=N,e[27]=C):C=e[27];let k;e[28]!==y||e[29]!==C?(k=$("div",{className:"grid gap-1",children:[y,C]}),e[28]=y,e[29]=C,e[30]=k):k=e[30];let w;e[31]!==i?(w=i("Value"),e[31]=i,e[32]=w):w=e[32];let K;e[33]!==w?(K=r(G,{className:"text-xs",htmlFor:"kv-create-value",children:w}),e[33]=w,e[34]=K):K=e[34];let J;e[35]===Symbol.for("react.memo_cache_sentinel")?(J=j=>{a({field:"value",type:"setField",value:j.target.value})},e[35]=J):J=e[35];let V;e[36]!==t.value?(V=r(be,{className:"min-h-[6rem] font-mono text-xs","data-testid":"kv-create-value",id:"kv-create-value",onChange:J,value:t.value}),e[36]=t.value,e[37]=V):V=e[37];let L;e[38]!==K||e[39]!==V?(L=$("div",{className:"grid gap-1",children:[K,V]}),e[38]=K,e[39]=V,e[40]=L):L=e[40];const D=!b;let M;e[41]===Symbol.for("react.memo_cache_sentinel")?(M=j=>{a({field:"ttl",type:"setField",value:j})},e[41]=M):M=e[41];let n;e[42]!==D?(n=r($e,{id:"kv-create-ttl",invalid:D,onChange:M,testId:"kv-create-ttl"}),e[42]=D,e[43]=n):n=e[43];let h;e[44]===Symbol.for("react.memo_cache_sentinel")?(h=j=>{a({field:"metadata",type:"setField",value:j})},e[44]=h):h=e[44];let S;e[45]!==o||e[46]!==t.metadata?(S=r(Se,{id:"kv-create-metadata",invalidTestId:"kv-create-metadata-invalid",onChange:h,testId:"kv-create-metadata",valid:o,value:t.metadata}),e[45]=o,e[46]=t.metadata,e[47]=S):S=e[47];const T=!E;let F;e[48]!==t.busy||e[49]!==i?(F=t.busy?i("Creating…"):i("Create key"),e[48]=t.busy,e[49]=i,e[50]=F):F=e[50];let _;e[51]!==p||e[52]!==T||e[53]!==F?(_=r(B,{"data-testid":"kv-create-submit",disabled:T,onClick:p,children:F}),e[51]=p,e[52]=T,e[53]=F,e[54]=_):_=e[54];const f=t.busy;let P;e[55]!==i?(P=i("Cancel"),e[55]=i,e[56]=P):P=e[56];let A;e[57]!==c||e[58]!==t.busy||e[59]!==P?(A=r(B,{"data-testid":"kv-create-cancel",disabled:f,onClick:c,variant:"outline",children:P}),e[57]=c,e[58]=t.busy,e[59]=P,e[60]=A):A=e[60];let R;e[61]!==_||e[62]!==A?(R=$("div",{className:"flex flex-wrap gap-2",children:[_,A]}),e[61]=_,e[62]=A,e[63]=R):R=e[63];let U;e[64]!==t.error?(U=t.error!==null&&r("p",{className:"text-sm text-destructive","data-testid":"kv-create-error",role:"alert",children:t.error}),e[64]=t.error,e[65]=U):U=e[65];let W;return e[66]!==k||e[67]!==L||e[68]!==n||e[69]!==S||e[70]!==R||e[71]!==U?(W=$("div",{className:"grid gap-3 px-4 pb-4","data-testid":"kv-create-form",children:[k,L,n,S,R,U]}),e[66]=k,e[67]=L,e[68]=n,e[69]=S,e[70]=R,e[71]=U,e[72]=W):W=e[72],W},je={busy:"",editedMetadata:"",editedTtl:"",editedValue:"",loadError:null,loading:!0,value:null,writeError:null},Ae=(l,e)=>{switch(e.type){case"deleteStart":return{...l,busy:"deleting",writeError:null};case"editMetadata":return{...l,editedMetadata:e.value};case"editTtl":return{...l,editedTtl:e.value};case"editValue":return{...l,editedValue:e.value};case"loaded":return{...l,editedMetadata:e.metadata===null||e.metadata===void 0?"":JSON.stringify(e.metadata,null,2),editedValue:e.value??"",loading:!1,value:e.value};case"loadFailed":return{...l,loadError:e.error,loading:!1};case"saveOk":return{...l,busy:"",value:l.editedValue};case"saveStart":return{...l,busy:"saving",writeError:null};case"writeFailed":return{...l,busy:"",writeError:e.error};default:return l}},ze=l=>{const e=te(67),{expiration:d,keyName:c,namespace:s,onDeleted:m}=l,i=ee(),t=q(),[a,v]=ae(Ae,je);let o,g;e[0]!==i||e[1]!==c||e[2]!==s?(o=()=>{const f={cancelled:!1};return z((async()=>{try{const P=await i.getKvValue({key:c,namespace:s});f.cancelled||v({metadata:P.metadata,type:"loaded",value:P.value})}catch(P){const A=P;f.cancelled||v({error:H(A),type:"loadFailed"})}})()),()=>{f.cancelled=!0}},g=[i,s,c],e[0]=i,e[1]=c,e[2]=s,e[3]=o,e[4]=g):(o=e[3],g=e[4]),le(o,g);let b;e[5]===Symbol.for("react.memo_cache_sentinel")?(b=f=>{v({type:"editValue",value:f.target.value})},e[5]=b):b=e[5];const I=b;let E;e[6]===Symbol.for("react.memo_cache_sentinel")?(E=f=>{v({type:"editMetadata",value:f})},e[6]=E):E=e[6];const O=E;let p;e[7]!==a.editedValue?(p=ge(a.editedValue),e[7]=a.editedValue,e[8]=p):p=e[8];const u=p;let y;e[9]!==a.editedMetadata?(y=xe(a.editedMetadata),e[9]=a.editedMetadata,e[10]=y):y=e[10];const x=y;let N;e[11]!==a.editedTtl?(N=Ce(a.editedTtl),e[11]=a.editedTtl,e[12]=N):N=e[12];const C=N;let k;e[13]!==u?(k=()=>{u!==void 0&&v({type:"editValue",value:u})},e[13]=u,e[14]=k):k=e[14];const w=k;let K;e[15]!==i||e[16]!==d||e[17]!==c||e[18]!==x||e[19]!==s||e[20]!==a.editedMetadata||e[21]!==a.editedTtl||e[22]!==a.editedValue||e[23]!==t?(K=()=>{if(!x){v({error:t("Metadata must be valid JSON."),type:"writeFailed"});return}v({type:"saveStart"}),z((async()=>{try{await i.putKvValue(we({metadata:a.editedMetadata,ttl:a.editedTtl,value:a.editedValue},c,s,d)),v({type:"saveOk"})}catch(f){v({error:H(f),type:"writeFailed"})}})())},e[15]=i,e[16]=d,e[17]=c,e[18]=x,e[19]=s,e[20]=a.editedMetadata,e[21]=a.editedTtl,e[22]=a.editedValue,e[23]=t,e[24]=K):K=e[24];const J=K;let V;e[25]!==i||e[26]!==c||e[27]!==s||e[28]!==m?(V=()=>{v({type:"deleteStart"}),z((async()=>{try{await i.deleteKvKey({key:c,namespace:s}),m(c)}catch(f){v({error:H(f),type:"writeFailed"})}})())},e[25]=i,e[26]=c,e[27]=s,e[28]=m,e[29]=V):V=e[29];const L=V;let D;e[30]!==c?(D=()=>{ne(c)},e[30]=c,e[31]=D):D=e[31];let M;e[32]!==t?(M=t("Copy key"),e[32]=t,e[33]=M):M=e[33];let n;e[34]!==D||e[35]!==M?(n=r("div",{className:"mb-2 flex justify-end",children:r(B,{"data-testid":"kv-copy-key-btn",onClick:D,size:"sm",variant:"outline",children:M})}),e[34]=D,e[35]=M,e[36]=n):n=e[36];let h;e[37]!==a.loadError?(h=a.loadError!==null&&r("p",{className:"mb-2 text-sm text-destructive","data-testid":"kv-value-error",role:"alert",children:a.loadError}),e[37]=a.loadError,e[38]=h):h=e[38];let S;e[39]!==a.loading||e[40]!==t?(S=a.loading&&r("p",{className:"text-sm text-muted-foreground","data-testid":"kv-value-loading",children:t("Loading…")}),e[39]=a.loading,e[40]=t,e[41]=S):S=e[41];let T;e[42]!==u||e[43]!==x||e[44]!==L||e[45]!==w||e[46]!==J||e[47]!==a.busy||e[48]!==a.editedMetadata||e[49]!==a.editedValue||e[50]!==a.loading||e[51]!==a.value||e[52]!==a.writeError||e[53]!==t||e[54]!==C?(T=!a.loading&&a.value!==null&&$(fe,{children:[$("div",{className:"mb-1 flex flex-wrap items-center gap-2",children:[r(G,{className:"text-xs",htmlFor:"kv-value-editor",children:t("Value")}),u!==void 0&&r(Oe,{variant:"secondary",children:t("JSON")}),r("span",{className:"ml-auto text-xs tabular-nums text-muted-foreground","data-testid":"kv-value-size",children:Ke(De(a.editedValue))})]}),r("textarea",{"aria-label":t("KV value"),className:"mb-2 min-h-[8rem] w-full rounded border border-border bg-muted/30 p-2 font-mono text-xs","data-testid":"kv-value-editor",id:"kv-value-editor",onChange:I,value:a.editedValue}),$("div",{className:"mb-3 flex flex-wrap gap-2",children:[r(B,{"data-testid":"kv-format-btn",disabled:u===void 0,onClick:w,size:"sm",variant:"outline",children:t("Format JSON")}),r(B,{"data-testid":"kv-copy-value-btn",onClick:()=>{ne(a.editedValue)},size:"sm",variant:"outline",children:t("Copy value")})]}),r($e,{helper:t("Leave blank to keep the current expiration."),id:"kv-ttl-input",invalid:!C,onChange:f=>{v({type:"editTtl",value:f})},testId:"kv-ttl-input"}),r(Se,{id:"kv-metadata-editor",invalidTestId:"kv-metadata-invalid",onChange:O,testId:"kv-metadata-editor",valid:x,value:a.editedMetadata}),$("div",{className:"flex flex-wrap gap-2",children:[r(B,{"data-testid":"kv-save-btn",disabled:a.busy!==""||!x||!C,onClick:J,children:a.busy==="saving"?t("Saving…"):t("Save")}),r(B,{"data-testid":"kv-delete-btn",disabled:a.busy!=="",onClick:L,variant:"destructive",children:a.busy==="deleting"?t("Deleting…"):t("Delete")})]}),a.writeError!==null&&r("p",{className:"mt-2 text-sm text-destructive","data-testid":"kv-save-error",role:"alert",children:a.writeError})]}),e[42]=u,e[43]=x,e[44]=L,e[45]=w,e[46]=J,e[47]=a.busy,e[48]=a.editedMetadata,e[49]=a.editedValue,e[50]=a.loading,e[51]=a.value,e[52]=a.writeError,e[53]=t,e[54]=C,e[55]=T):T=e[55];let F;e[56]!==a.loadError||e[57]!==a.loading||e[58]!==a.value||e[59]!==t?(F=!a.loading&&a.value===null&&a.loadError===null&&r("p",{className:"text-sm text-muted-foreground","data-testid":"kv-absent",children:t("Key is absent or has no value.")}),e[56]=a.loadError,e[57]=a.loading,e[58]=a.value,e[59]=t,e[60]=F):F=e[60];let _;return e[61]!==n||e[62]!==h||e[63]!==S||e[64]!==T||e[65]!==F?(_=$("div",{className:"px-4 pb-4","data-testid":"kv-value-section",children:[n,h,S,T,F]}),e[61]=n,e[62]=h,e[63]=S,e[64]=T,e[65]=F,e[66]=_):_=e[66],_},me=100,He={appliedPrefix:"",bulk:[],bulkBusy:!1,bulkError:null,cursor:null,keys:null,listComplete:!1,loadError:null,loading:!1,prefixInput:"",reloadNonce:0,selectedKey:null},Re=(l,e)=>{switch(e.type){case"appendPage":return{...l,cursor:e.cursor,keys:[...l.keys??[],...e.keys],listComplete:e.listComplete,loading:!1};case"applyFilter":return{...l,appliedPrefix:l.prefixInput,bulk:[],bulkError:null,cursor:null,keys:null,listComplete:!1,selectedKey:null};case"bulkDeleted":{const d=new Set(e.deleted);return{...l,bulk:l.bulk.filter(c=>!d.has(c)),bulkBusy:!1,bulkError:e.error,keys:l.keys===null?null:l.keys.filter(c=>!d.has(c.name)),selectedKey:l.selectedKey!==null&&d.has(l.selectedKey)?null:l.selectedKey}}case"bulkDeleteStart":return{...l,bulkBusy:!0,bulkError:null};case"firstPage":return{...l,cursor:e.cursor,keys:e.keys,listComplete:e.listComplete,loading:!1};case"keyDeleted":return{...l,bulk:l.bulk.filter(d=>d!==e.name),keys:l.keys===null?null:l.keys.filter(d=>d.name!==e.name),selectedKey:null};case"loadFailed":return{...l,loadError:e.error,loading:!1};case"loadStart":return{...l,loadError:null,loading:!0};case"prefixInput":return{...l,prefixInput:e.value};case"reload":return{...l,bulk:[],bulkError:null,reloadNonce:l.reloadNonce+1,selectedKey:null};case"selectKey":return{...l,selectedKey:e.name};case"toggleAllBulk":return{...l,bulk:e.names};case"toggleBulk":return{...l,bulk:l.bulk.includes(e.name)?l.bulk.filter(d=>d!==e.name):[...l.bulk,e.name]};default:return l}},Ue=({namespace:l})=>{const e=ee(),d=q(),[c,s]=ae(Re,He),{appliedPrefix:m,bulk:i,bulkBusy:t,bulkError:a,cursor:v,keys:o,listComplete:g,loadError:b,loading:I,prefixInput:E,reloadNonce:O,selectedKey:p}=c,[u,y]=Z(!1);le(()=>{const n={cancelled:!1};return z((async()=>{s({type:"loadStart"});try{const h=await e.listKvKeys({limit:me,namespace:l,prefix:m===""?void 0:m});n.cancelled||s({cursor:h.cursor??null,keys:h.keys,listComplete:h.listComplete,type:"firstPage"})}catch(h){n.cancelled||s({error:H(h),type:"loadFailed"})}})()),()=>{n.cancelled=!0}},[e,l,m,O]);const x=n=>{s({type:"prefixInput",value:n.target.value})},N=()=>{s({type:"applyFilter"})},C=n=>{s({name:n.currentTarget.dataset.key??null,type:"selectKey"})},k=()=>{v!==null&&(s({type:"loadStart"}),z((async()=>{try{const n=await e.listKvKeys({cursor:v,limit:me,namespace:l,prefix:m===""?void 0:m});s({cursor:n.cursor??null,keys:n.keys,listComplete:n.listComplete,type:"appendPage"})}catch(n){s({error:H(n),type:"loadFailed"})}})()))},w=n=>{s({name:n,type:"keyDeleted"})},K=n=>{s({name:n,type:"toggleBulk"})},J=n=>{s({names:n&&o!==null?o.map(h=>h.name):[],type:"toggleAllBulk"})},V=()=>{if(i.length===0)return;const n=[...i];s({type:"bulkDeleteStart"}),z((async()=>{const h=await Promise.allSettled(n.map(F=>e.deleteKvKey({key:F,namespace:l}))),S=n.filter((F,_)=>h[_]?.status==="fulfilled"),T=n.length-S.length;s({deleted:S,error:T>0?d("Failed to delete {count} keys.",{count:T}):null,type:"bulkDeleted"})})())},L=()=>{y(!1),s({type:"reload"})},D=o!==null&&o.length>0&&i.length===o.length,M=new Set(i);return $(fe,{children:[$("section",{className:"border border-border bg-card p-3","data-testid":"kv-keys-section",children:[$("div",{className:"mb-3 flex flex-wrap items-center gap-2",children:[r(re,{"aria-label":d("Filter keys by prefix"),className:"min-w-[16rem] flex-1","data-testid":"kv-prefix-input",onChange:x,placeholder:d("Filter by prefix…"),value:E}),r(B,{"data-testid":"kv-filter-btn",disabled:I,onClick:N,children:d("Filter")}),r(B,{"data-testid":"kv-new-key-btn",onClick:()=>{y(n=>!n)},variant:"outline",children:d("New key")}),i.length>0&&r(B,{"data-testid":"kv-bulk-delete-btn",disabled:t,onClick:V,variant:"destructive",children:t?d("Deleting…"):d("Delete {count}",{count:i.length})})]}),a!==null&&r("p",{className:"mb-2 text-sm text-destructive","data-testid":"kv-bulk-error",role:"alert",children:a}),b!==null&&r("p",{className:"text-sm text-destructive","data-testid":"kv-keys-error",role:"alert",children:b}),o!==null&&o.length===0&&!I&&r("p",{className:"text-sm text-muted-foreground","data-testid":"kv-no-keys",children:d("No keys.")}),o!==null&&o.length>0&&r(ve,{className:"overflow-hidden py-0",children:r(pe,{className:"px-0",children:$(ye,{"data-testid":"kv-key-table",children:[r(he,{children:$(X,{children:[r(Y,{className:"w-10",children:r(de,{"aria-label":d("Select all"),checked:D,"data-testid":"kv-select-all",onCheckedChange:J})}),r(Y,{children:d("Key")}),r(Y,{children:d("Expiration")})]})}),r(ke,{children:o.map(n=>$(X,{className:n.name===p?"border-l-2 border-l-royal-amethyst bg-muted/50":"cursor-pointer","data-key":n.name,"data-testid":`kv-key-row-${n.name}`,onClick:C,children:[r(Q,{onClick:h=>{h.stopPropagation()},children:r(de,{"aria-label":d("Select {name}",{name:n.name}),checked:M.has(n.name),"data-testid":`kv-select-${n.name}`,onCheckedChange:()=>{K(n.name)}})}),r(Q,{className:"font-mono text-xs",children:n.name}),r(Q,{className:"tabular-nums text-xs",children:Je(n.expiration)})]},n.name))})]})})}),!g&&v!==null&&r("div",{className:"mt-2",children:r(B,{"data-testid":"kv-load-more",disabled:I,onClick:k,variant:"outline",children:d(I?"Loading…":"Load more")})})]}),r(se,{onOpenChange:n=>{n||y(!1)},open:u,children:$(ie,{className:"w-full gap-0 overflow-y-auto sm:max-w-md","data-testid":"kv-create-sheet",side:"right",children:[r(oe,{children:r(ce,{children:d("New key")})}),r(Pe,{namespace:l,onCancel:()=>{y(!1)},onCreated:L})]})}),r(se,{onOpenChange:n=>{n||s({name:null,type:"selectKey"})},open:p!==null,children:$(ie,{className:"w-full gap-0 overflow-y-auto sm:max-w-md","data-testid":"kv-editor-sheet",side:"right",children:[r(oe,{children:r(ce,{className:"truncate font-mono text-xs",children:p})}),p!==null&&r(ze,{expiration:o?.find(n=>n.name===p)?.expiration,keyName:p,namespace:l,onDeleted:w},`${l}:${p}`)]})})]})},ct=({loadNamespaces:l}={})=>{const e=ee(),d=q(),[c,s]=Z(null),[m,i]=Z(null),[t,a]=Z(null);le(()=>{const o={cancelled:!1};return z((async()=>{try{const g=await(l??(()=>e.listKvNamespaces()))();o.cancelled||(s(g),i(null),a(b=>b??g[0]?.binding??null))}catch(g){o.cancelled||(s(null),i(H(g)))}})()),()=>{o.cancelled=!0}},[e,l]);const v=o=>{a(o.currentTarget.dataset.ns??null)};return $("div",{className:"flex flex-col gap-4","data-testid":"lunora-kv-browser",children:[m!==null&&r("p",{className:"text-sm text-destructive","data-testid":"kv-ns-error",role:"alert",children:m}),c!==null&&c.length===0&&r(Fe,{description:d("Add a kv_namespaces binding to wrangler.jsonc — it appears here automatically, no wiring needed."),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:"M5 5h14v4H5V5Zm0 5h14v4H5v-4Zm0 5h14v4H5v-4Z"})}),testId:"kv-empty",title:d("No KV namespaces.")}),c!==null&&c.length>0&&r(ve,{className:"overflow-hidden py-0",children:r(pe,{className:"px-0",children:$(ye,{"data-testid":"kv-namespace-table",children:[r(he,{children:r(X,{children:r(Y,{children:d("Namespace")})})}),r(ke,{children:c.map(o=>r(X,{className:o.binding===t?"border-l-2 border-l-royal-amethyst bg-muted/50":"cursor-pointer","data-ns":o.binding,"data-testid":`kv-ns-row-${o.binding}`,onClick:v,children:r(Q,{className:"font-mono text-xs",children:o.binding})},o.binding))})]})})}),t!==null&&r(Ue,{namespace:t},t)]})};export{ct as KvBrowser};
1
+ import{useLunora as ee}from"@lunora/react";import{useState as Z,useReducer as ae,useEffect as le}from"react";import{c as ve,f as pe}from"../packem_shared/card-BMKx5UdA.js";import{E as Fe}from"../packem_shared/empty-state-Cg7t_8qu.js";import{d as ye,n as he,f as X,m as Y,b as ke,p as Q}from"../packem_shared/table-DZAB8cs3.js";import{useT as q}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{f as z,b as H,l as Ee,c as ne}from"../packem_shared/internal-zkEvTqy8.js";import{u as B}from"../packem_shared/button-BkCrNcAs.js";import{f as de}from"../packem_shared/checkbox-StT4Gob6.js";import{u as re}from"../packem_shared/input-JHu63lTv.js";import{h as ie,u as se,y as oe,c as ce}from"../packem_shared/studio-C9Qvg13j.js";import{c as te}from"react/compiler-runtime";import{p as G}from"../packem_shared/label-6uP1obNF.js";import{l as fe}from"../packem_shared/textarea-Bu2-jKAs.js";import{w as Ke,z as Ve,_ as Me,S as Te,x as Ie}from"../packem_shared/select-BssZMiFY.js";import{jsx as r,jsxs as S,Fragment as be}from"react/jsx-runtime";import{g as Oe}from"../packem_shared/badge-BbuuAio7.js";const _e=l=>{const e=l.trim();if(e==="")return;const d=Number(e);return Number.isFinite(d)&&d>0?Math.floor(d):void 0},Je=l=>l===void 0?"—":new Date(l*1e3).toISOString(),De=l=>new TextEncoder().encode(l).length,ge=l=>{if(l.trim()!=="")try{return JSON.stringify(JSON.parse(l),void 0,2)}catch{return}},xe=l=>{if(l.trim()==="")return!0;try{return JSON.parse(l),!0}catch{return!1}},Ne=[{key:"seconds",seconds:1},{key:"minutes",seconds:60},{key:"hours",seconds:3600},{key:"days",seconds:86400}],ue=(l,e)=>{const d=l.trim();if(d==="")return"";const c=Number(d),i=Ne.find(m=>m.key===e)?.seconds??1;return Number.isFinite(c)&&c>0?String(Math.round(c*i)):d},Ce=l=>{const e=l.trim();if(e==="")return!0;const d=Number(e);return Number.isInteger(d)&&d>=60},we=(l,e,d,c)=>{const i=_e(l.ttl);return{expiration:i===void 0?c:void 0,expirationTtl:i,key:e,metadata:l.metadata.trim()===""?void 0:JSON.parse(l.metadata),namespace:d,value:l.value}},Se=l=>{const e=te(60),{helper:d,id:c,invalid:i,onChange:m,testId:s}=l,t=q(),[a,v]=Z(""),[o,g]=Z("seconds");let f;e[0]!==m||e[1]!==o?(f=b=>{v(b.target.value),m(ue(b.target.value,o))},e[0]=m,e[1]=o,e[2]=f):f=e[2];const I=f;let K;e[3]!==a||e[4]!==m?(K=b=>{b!==null&&(g(b),m(ue(a,b)))},e[3]=a,e[4]=m,e[5]=K):K=e[5];const O=K;let p;e[6]!==t?(p=t("days"),e[6]=t,e[7]=p):p=e[7];let u;e[8]!==t?(u=t("hours"),e[8]=t,e[9]=u):u=e[9];let y;e[10]!==t?(y=t("minutes"),e[10]=t,e[11]=y):y=e[11];let x;e[12]!==t?(x=t("seconds"),e[12]=t,e[13]=x):x=e[13];let N;e[14]!==p||e[15]!==u||e[16]!==y||e[17]!==x?(N={days:p,hours:u,minutes:y,seconds:x},e[14]=p,e[15]=u,e[16]=y,e[17]=x,e[18]=N):N=e[18];const C=N;let k;e[19]!==t?(k=t("Expires after"),e[19]=t,e[20]=k):k=e[20];let w;e[21]!==c||e[22]!==k?(w=r(G,{className:"text-xs",htmlFor:c,children:k}),e[21]=c,e[22]=k,e[23]=w):w=e[23];let E;e[24]!==t?(E=t("No expiration"),e[24]=t,e[25]=E):E=e[25];let J;e[26]!==a||e[27]!==c||e[28]!==i||e[29]!==I||e[30]!==E||e[31]!==s?(J=r(re,{"aria-invalid":i,className:"flex-1","data-testid":s,id:c,inputMode:"numeric",onChange:I,placeholder:E,value:a}),e[26]=a,e[27]=c,e[28]=i,e[29]=I,e[30]=E,e[31]=s,e[32]=J):J=e[32];let V;e[33]!==t?(V=t("TTL unit"),e[33]=t,e[34]=V):V=e[34];const L=`${s}-unit`;let D;e[35]===Symbol.for("react.memo_cache_sentinel")?(D=r(Ke,{}),e[35]=D):D=e[35];let M;e[36]!==V||e[37]!==L?(M=r(Ve,{"aria-label":V,className:"w-[7.5rem]","data-testid":L,children:D}),e[36]=V,e[37]=L,e[38]=M):M=e[38];let n;e[39]!==C?(n=Ne.map(b=>r(Me,{value:b.key,children:C[b.key]},b.key)),e[39]=C,e[40]=n):n=e[40];let h;e[41]!==n?(h=r(Te,{children:n}),e[41]=n,e[42]=h):h=e[42];let $;e[43]!==O||e[44]!==M||e[45]!==h||e[46]!==o?($=S(Ie,{onValueChange:O,value:o,children:[M,h]}),e[43]=O,e[44]=M,e[45]=h,e[46]=o,e[47]=$):$=e[47];let T;e[48]!==J||e[49]!==$?(T=S("div",{className:"flex gap-2",children:[J,$]}),e[48]=J,e[49]=$,e[50]=T):T=e[50];let F;e[51]!==d||e[52]!==i||e[53]!==t||e[54]!==s?(F=i?r("p",{className:"text-xs text-destructive","data-testid":`${s}-invalid`,children:t("TTL must be at least 60 seconds.")}):d!==void 0&&r("p",{className:"text-xs text-muted-foreground",children:d}),e[51]=d,e[52]=i,e[53]=t,e[54]=s,e[55]=F):F=e[55];let _;return e[56]!==T||e[57]!==F||e[58]!==w?(_=S("div",{className:"mb-3 grid gap-1",children:[w,T,F]}),e[56]=T,e[57]=F,e[58]=w,e[59]=_):_=e[59],_},$e=l=>{const e=te(36),{id:d,invalidTestId:c,onChange:i,testId:m,valid:s,value:t}=l,a=q();let v;e[0]!==t?(v=ge(t),e[0]=t,e[1]=v):v=e[1];const o=v;let g;e[2]!==a?(g=a("Metadata (JSON)"),e[2]=a,e[3]=g):g=e[3];let f;e[4]!==d||e[5]!==g?(f=r(G,{className:"text-xs",htmlFor:d,children:g}),e[4]=d,e[5]=g,e[6]=f):f=e[6];const I=`${m}-format`,K=o===void 0;let O;e[7]!==o||e[8]!==i?(O=()=>{o!==void 0&&i(o)},e[7]=o,e[8]=i,e[9]=O):O=e[9];let p;e[10]!==a?(p=a("Format JSON"),e[10]=a,e[11]=p):p=e[11];let u;e[12]!==I||e[13]!==K||e[14]!==O||e[15]!==p?(u=r(B,{"data-testid":I,disabled:K,onClick:O,size:"sm",variant:"outline",children:p}),e[12]=I,e[13]=K,e[14]=O,e[15]=p,e[16]=u):u=e[16];let y;e[17]!==f||e[18]!==u?(y=S("div",{className:"flex items-center justify-between gap-2",children:[f,u]}),e[17]=f,e[18]=u,e[19]=y):y=e[19];const x=!s;let N;e[20]!==i?(N=E=>{i(E.target.value)},e[20]=i,e[21]=N):N=e[21];let C;e[22]!==d||e[23]!==x||e[24]!==N||e[25]!==m||e[26]!==t?(C=r(fe,{"aria-invalid":x,className:"min-h-[4rem] font-mono text-xs","data-testid":m,id:d,onChange:N,value:t}),e[22]=d,e[23]=x,e[24]=N,e[25]=m,e[26]=t,e[27]=C):C=e[27];let k;e[28]!==c||e[29]!==a||e[30]!==s?(k=!s&&r("p",{className:"text-xs text-destructive","data-testid":c,children:a("Metadata must be valid JSON.")}),e[28]=c,e[29]=a,e[30]=s,e[31]=k):k=e[31];let w;return e[32]!==C||e[33]!==k||e[34]!==y?(w=S("div",{className:"mb-3 grid gap-1",children:[y,C,k]}),e[32]=C,e[33]=k,e[34]=y,e[35]=w):w=e[35],w},Le={busy:!1,error:null,metadata:"",name:"",ttl:"",value:""},Be=(l,e)=>{switch(e.type){case"setField":return{...l,[e.field]:e.value};case"submitFailed":return{...l,busy:!1,error:e.error};case"submitStart":return{...l,busy:!0,error:null};default:return l}},Pe=l=>{const e=te(73),{namespace:d,onCancel:c,onCreated:i}=l,m=ee(),s=q(),[t,a]=ae(Be,Le);let v;e[0]!==t.metadata?(v=xe(t.metadata),e[0]=t.metadata,e[1]=v):v=e[1];const o=v;let g;e[2]!==t.ttl?(g=Ce(t.ttl),e[2]=t.ttl,e[3]=g):g=e[3];const f=g;let I;e[4]!==o||e[5]!==t.busy||e[6]!==t.name||e[7]!==f?(I=t.name.trim()!==""&&o&&f&&!t.busy,e[4]=o,e[5]=t.busy,e[6]=t.name,e[7]=f,e[8]=I):I=e[8];const K=I;let O;e[9]!==K||e[10]!==m||e[11]!==d||e[12]!==i||e[13]!==t.metadata||e[14]!==t.name||e[15]!==t.ttl||e[16]!==t.value?(O=()=>{K&&(a({type:"submitStart"}),z((async()=>{try{await m.putKvValue(we({metadata:t.metadata,ttl:t.ttl,value:t.value},t.name,d)),i()}catch(j){a({error:H(j),type:"submitFailed"})}})()))},e[9]=K,e[10]=m,e[11]=d,e[12]=i,e[13]=t.metadata,e[14]=t.name,e[15]=t.ttl,e[16]=t.value,e[17]=O):O=e[17];const p=O;let u;e[18]!==s?(u=s("Key name"),e[18]=s,e[19]=u):u=e[19];let y;e[20]!==u?(y=r(G,{className:"text-xs",htmlFor:"kv-create-name",children:u}),e[20]=u,e[21]=y):y=e[21];let x;e[22]===Symbol.for("react.memo_cache_sentinel")?(x=j=>{a({field:"name",type:"setField",value:j.target.value})},e[22]=x):x=e[22];let N;e[23]!==s?(N=s("Key name"),e[23]=s,e[24]=N):N=e[24];let C;e[25]!==t.name||e[26]!==N?(C=r(re,{autoFocus:!0,"data-testid":"kv-create-name",id:"kv-create-name",onChange:x,placeholder:N,value:t.name}),e[25]=t.name,e[26]=N,e[27]=C):C=e[27];let k;e[28]!==y||e[29]!==C?(k=S("div",{className:"grid gap-1",children:[y,C]}),e[28]=y,e[29]=C,e[30]=k):k=e[30];let w;e[31]!==s?(w=s("Value"),e[31]=s,e[32]=w):w=e[32];let E;e[33]!==w?(E=r(G,{className:"text-xs",htmlFor:"kv-create-value",children:w}),e[33]=w,e[34]=E):E=e[34];let J;e[35]===Symbol.for("react.memo_cache_sentinel")?(J=j=>{a({field:"value",type:"setField",value:j.target.value})},e[35]=J):J=e[35];let V;e[36]!==t.value?(V=r(fe,{className:"min-h-[6rem] font-mono text-xs","data-testid":"kv-create-value",id:"kv-create-value",onChange:J,value:t.value}),e[36]=t.value,e[37]=V):V=e[37];let L;e[38]!==E||e[39]!==V?(L=S("div",{className:"grid gap-1",children:[E,V]}),e[38]=E,e[39]=V,e[40]=L):L=e[40];const D=!f;let M;e[41]===Symbol.for("react.memo_cache_sentinel")?(M=j=>{a({field:"ttl",type:"setField",value:j})},e[41]=M):M=e[41];let n;e[42]!==D?(n=r(Se,{id:"kv-create-ttl",invalid:D,onChange:M,testId:"kv-create-ttl"}),e[42]=D,e[43]=n):n=e[43];let h;e[44]===Symbol.for("react.memo_cache_sentinel")?(h=j=>{a({field:"metadata",type:"setField",value:j})},e[44]=h):h=e[44];let $;e[45]!==o||e[46]!==t.metadata?($=r($e,{id:"kv-create-metadata",invalidTestId:"kv-create-metadata-invalid",onChange:h,testId:"kv-create-metadata",valid:o,value:t.metadata}),e[45]=o,e[46]=t.metadata,e[47]=$):$=e[47];const T=!K;let F;e[48]!==t.busy||e[49]!==s?(F=t.busy?s("Creating…"):s("Create key"),e[48]=t.busy,e[49]=s,e[50]=F):F=e[50];let _;e[51]!==p||e[52]!==T||e[53]!==F?(_=r(B,{"data-testid":"kv-create-submit",disabled:T,onClick:p,children:F}),e[51]=p,e[52]=T,e[53]=F,e[54]=_):_=e[54];const b=t.busy;let P;e[55]!==s?(P=s("Cancel"),e[55]=s,e[56]=P):P=e[56];let A;e[57]!==c||e[58]!==t.busy||e[59]!==P?(A=r(B,{"data-testid":"kv-create-cancel",disabled:b,onClick:c,variant:"outline",children:P}),e[57]=c,e[58]=t.busy,e[59]=P,e[60]=A):A=e[60];let R;e[61]!==_||e[62]!==A?(R=S("div",{className:"flex flex-wrap gap-2",children:[_,A]}),e[61]=_,e[62]=A,e[63]=R):R=e[63];let U;e[64]!==t.error?(U=t.error!==null&&r("p",{className:"text-sm text-destructive","data-testid":"kv-create-error",role:"alert",children:t.error}),e[64]=t.error,e[65]=U):U=e[65];let W;return e[66]!==k||e[67]!==L||e[68]!==n||e[69]!==$||e[70]!==R||e[71]!==U?(W=S("div",{className:"grid gap-3 px-4 pb-4","data-testid":"kv-create-form",children:[k,L,n,$,R,U]}),e[66]=k,e[67]=L,e[68]=n,e[69]=$,e[70]=R,e[71]=U,e[72]=W):W=e[72],W},je={busy:"",editedMetadata:"",editedTtl:"",editedValue:"",loadError:null,loading:!0,value:null,writeError:null},Ae=(l,e)=>{switch(e.type){case"deleteStart":return{...l,busy:"deleting",writeError:null};case"editMetadata":return{...l,editedMetadata:e.value};case"editTtl":return{...l,editedTtl:e.value};case"editValue":return{...l,editedValue:e.value};case"loaded":return{...l,editedMetadata:e.metadata===null||e.metadata===void 0?"":JSON.stringify(e.metadata,null,2),editedValue:e.value??"",loading:!1,value:e.value};case"loadFailed":return{...l,loadError:e.error,loading:!1};case"saveOk":return{...l,busy:"",value:l.editedValue};case"saveStart":return{...l,busy:"saving",writeError:null};case"writeFailed":return{...l,busy:"",writeError:e.error};default:return l}},ze=l=>{const e=te(67),{expiration:d,keyName:c,namespace:i,onDeleted:m}=l,s=ee(),t=q(),[a,v]=ae(Ae,je);let o,g;e[0]!==s||e[1]!==c||e[2]!==i?(o=()=>{const b={cancelled:!1};return z((async()=>{try{const P=await s.getKvValue({key:c,namespace:i});b.cancelled||v({metadata:P.metadata,type:"loaded",value:P.value})}catch(P){const A=P;b.cancelled||v({error:H(A),type:"loadFailed"})}})()),()=>{b.cancelled=!0}},g=[s,i,c],e[0]=s,e[1]=c,e[2]=i,e[3]=o,e[4]=g):(o=e[3],g=e[4]),le(o,g);let f;e[5]===Symbol.for("react.memo_cache_sentinel")?(f=b=>{v({type:"editValue",value:b.target.value})},e[5]=f):f=e[5];const I=f;let K;e[6]===Symbol.for("react.memo_cache_sentinel")?(K=b=>{v({type:"editMetadata",value:b})},e[6]=K):K=e[6];const O=K;let p;e[7]!==a.editedValue?(p=ge(a.editedValue),e[7]=a.editedValue,e[8]=p):p=e[8];const u=p;let y;e[9]!==a.editedMetadata?(y=xe(a.editedMetadata),e[9]=a.editedMetadata,e[10]=y):y=e[10];const x=y;let N;e[11]!==a.editedTtl?(N=Ce(a.editedTtl),e[11]=a.editedTtl,e[12]=N):N=e[12];const C=N;let k;e[13]!==u?(k=()=>{u!==void 0&&v({type:"editValue",value:u})},e[13]=u,e[14]=k):k=e[14];const w=k;let E;e[15]!==s||e[16]!==d||e[17]!==c||e[18]!==x||e[19]!==i||e[20]!==a.editedMetadata||e[21]!==a.editedTtl||e[22]!==a.editedValue||e[23]!==t?(E=()=>{if(!x){v({error:t("Metadata must be valid JSON."),type:"writeFailed"});return}v({type:"saveStart"}),z((async()=>{try{await s.putKvValue(we({metadata:a.editedMetadata,ttl:a.editedTtl,value:a.editedValue},c,i,d)),v({type:"saveOk"})}catch(b){v({error:H(b),type:"writeFailed"})}})())},e[15]=s,e[16]=d,e[17]=c,e[18]=x,e[19]=i,e[20]=a.editedMetadata,e[21]=a.editedTtl,e[22]=a.editedValue,e[23]=t,e[24]=E):E=e[24];const J=E;let V;e[25]!==s||e[26]!==c||e[27]!==i||e[28]!==m?(V=()=>{v({type:"deleteStart"}),z((async()=>{try{await s.deleteKvKey({key:c,namespace:i}),m(c)}catch(b){v({error:H(b),type:"writeFailed"})}})())},e[25]=s,e[26]=c,e[27]=i,e[28]=m,e[29]=V):V=e[29];const L=V;let D;e[30]!==c?(D=()=>{ne(c)},e[30]=c,e[31]=D):D=e[31];let M;e[32]!==t?(M=t("Copy key"),e[32]=t,e[33]=M):M=e[33];let n;e[34]!==D||e[35]!==M?(n=r("div",{className:"mb-2 flex justify-end",children:r(B,{"data-testid":"kv-copy-key-btn",onClick:D,size:"sm",variant:"outline",children:M})}),e[34]=D,e[35]=M,e[36]=n):n=e[36];let h;e[37]!==a.loadError?(h=a.loadError!==null&&r("p",{className:"mb-2 text-sm text-destructive","data-testid":"kv-value-error",role:"alert",children:a.loadError}),e[37]=a.loadError,e[38]=h):h=e[38];let $;e[39]!==a.loading||e[40]!==t?($=a.loading&&r("p",{className:"text-sm text-muted-foreground","data-testid":"kv-value-loading",children:t("Loading…")}),e[39]=a.loading,e[40]=t,e[41]=$):$=e[41];let T;e[42]!==u||e[43]!==x||e[44]!==L||e[45]!==w||e[46]!==J||e[47]!==a.busy||e[48]!==a.editedMetadata||e[49]!==a.editedValue||e[50]!==a.loading||e[51]!==a.value||e[52]!==a.writeError||e[53]!==t||e[54]!==C?(T=!a.loading&&a.value!==null&&S(be,{children:[S("div",{className:"mb-1 flex flex-wrap items-center gap-2",children:[r(G,{className:"text-xs",htmlFor:"kv-value-editor",children:t("Value")}),u!==void 0&&r(Oe,{variant:"secondary",children:t("JSON")}),r("span",{className:"ml-auto text-xs tabular-nums text-muted-foreground","data-testid":"kv-value-size",children:Ee(De(a.editedValue))})]}),r("textarea",{"aria-label":t("KV value"),className:"mb-2 min-h-[8rem] w-full rounded border border-border bg-muted/30 p-2 font-mono text-xs","data-testid":"kv-value-editor",id:"kv-value-editor",onChange:I,value:a.editedValue}),S("div",{className:"mb-3 flex flex-wrap gap-2",children:[r(B,{"data-testid":"kv-format-btn",disabled:u===void 0,onClick:w,size:"sm",variant:"outline",children:t("Format JSON")}),r(B,{"data-testid":"kv-copy-value-btn",onClick:()=>{ne(a.editedValue)},size:"sm",variant:"outline",children:t("Copy value")})]}),r(Se,{helper:t("Leave blank to keep the current expiration."),id:"kv-ttl-input",invalid:!C,onChange:b=>{v({type:"editTtl",value:b})},testId:"kv-ttl-input"}),r($e,{id:"kv-metadata-editor",invalidTestId:"kv-metadata-invalid",onChange:O,testId:"kv-metadata-editor",valid:x,value:a.editedMetadata}),S("div",{className:"flex flex-wrap gap-2",children:[r(B,{"data-testid":"kv-save-btn",disabled:a.busy!==""||!x||!C,onClick:J,children:a.busy==="saving"?t("Saving…"):t("Save")}),r(B,{"data-testid":"kv-delete-btn",disabled:a.busy!=="",onClick:L,variant:"destructive",children:a.busy==="deleting"?t("Deleting…"):t("Delete")})]}),a.writeError!==null&&r("p",{className:"mt-2 text-sm text-destructive","data-testid":"kv-save-error",role:"alert",children:a.writeError})]}),e[42]=u,e[43]=x,e[44]=L,e[45]=w,e[46]=J,e[47]=a.busy,e[48]=a.editedMetadata,e[49]=a.editedValue,e[50]=a.loading,e[51]=a.value,e[52]=a.writeError,e[53]=t,e[54]=C,e[55]=T):T=e[55];let F;e[56]!==a.loadError||e[57]!==a.loading||e[58]!==a.value||e[59]!==t?(F=!a.loading&&a.value===null&&a.loadError===null&&r("p",{className:"text-sm text-muted-foreground","data-testid":"kv-absent",children:t("Key is absent or has no value.")}),e[56]=a.loadError,e[57]=a.loading,e[58]=a.value,e[59]=t,e[60]=F):F=e[60];let _;return e[61]!==n||e[62]!==h||e[63]!==$||e[64]!==T||e[65]!==F?(_=S("div",{className:"px-4 pb-4","data-testid":"kv-value-section",children:[n,h,$,T,F]}),e[61]=n,e[62]=h,e[63]=$,e[64]=T,e[65]=F,e[66]=_):_=e[66],_},me=100,He={appliedPrefix:"",bulk:[],bulkBusy:!1,bulkError:null,cursor:null,keys:null,listComplete:!1,loadError:null,loading:!1,prefixInput:"",reloadNonce:0,selectedKey:null},Re=(l,e)=>{switch(e.type){case"appendPage":return{...l,cursor:e.cursor,keys:[...l.keys??[],...e.keys],listComplete:e.listComplete,loading:!1};case"applyFilter":return{...l,appliedPrefix:l.prefixInput,bulk:[],bulkError:null,cursor:null,keys:null,listComplete:!1,selectedKey:null};case"bulkDeleted":{const d=new Set(e.deleted);return{...l,bulk:l.bulk.filter(c=>!d.has(c)),bulkBusy:!1,bulkError:e.error,keys:l.keys===null?null:l.keys.filter(c=>!d.has(c.name)),selectedKey:l.selectedKey!==null&&d.has(l.selectedKey)?null:l.selectedKey}}case"bulkDeleteStart":return{...l,bulkBusy:!0,bulkError:null};case"firstPage":return{...l,cursor:e.cursor,keys:e.keys,listComplete:e.listComplete,loading:!1};case"keyDeleted":return{...l,bulk:l.bulk.filter(d=>d!==e.name),keys:l.keys===null?null:l.keys.filter(d=>d.name!==e.name),selectedKey:null};case"loadFailed":return{...l,loadError:e.error,loading:!1};case"loadStart":return{...l,loadError:null,loading:!0};case"prefixInput":return{...l,prefixInput:e.value};case"reload":return{...l,bulk:[],bulkError:null,reloadNonce:l.reloadNonce+1,selectedKey:null};case"selectKey":return{...l,selectedKey:e.name};case"toggleAllBulk":return{...l,bulk:e.names};case"toggleBulk":return{...l,bulk:l.bulk.includes(e.name)?l.bulk.filter(d=>d!==e.name):[...l.bulk,e.name]};default:return l}},Ue=({namespace:l})=>{const e=ee(),d=q(),[c,i]=ae(Re,He),{appliedPrefix:m,bulk:s,bulkBusy:t,bulkError:a,cursor:v,keys:o,listComplete:g,loadError:f,loading:I,prefixInput:K,reloadNonce:O,selectedKey:p}=c,[u,y]=Z(!1);le(()=>{const n={cancelled:!1};return z((async()=>{i({type:"loadStart"});try{const h=await e.listKvKeys({limit:me,namespace:l,prefix:m===""?void 0:m});n.cancelled||i({cursor:h.cursor??null,keys:h.keys,listComplete:h.listComplete,type:"firstPage"})}catch(h){n.cancelled||i({error:H(h),type:"loadFailed"})}})()),()=>{n.cancelled=!0}},[e,l,m,O]);const x=n=>{i({type:"prefixInput",value:n.target.value})},N=()=>{i({type:"applyFilter"})},C=n=>{i({name:n.currentTarget.dataset.key??null,type:"selectKey"})},k=()=>{v!==null&&(i({type:"loadStart"}),z((async()=>{try{const n=await e.listKvKeys({cursor:v,limit:me,namespace:l,prefix:m===""?void 0:m});i({cursor:n.cursor??null,keys:n.keys,listComplete:n.listComplete,type:"appendPage"})}catch(n){i({error:H(n),type:"loadFailed"})}})()))},w=n=>{i({name:n,type:"keyDeleted"})},E=n=>{i({name:n,type:"toggleBulk"})},J=n=>{i({names:n&&o!==null?o.map(h=>h.name):[],type:"toggleAllBulk"})},V=()=>{if(s.length===0)return;const n=[...s];i({type:"bulkDeleteStart"}),z((async()=>{const h=await Promise.allSettled(n.map(F=>e.deleteKvKey({key:F,namespace:l}))),$=n.filter((F,_)=>h[_]?.status==="fulfilled"),T=n.length-$.length;i({deleted:$,error:T>0?d("Failed to delete {count} keys.",{count:T}):null,type:"bulkDeleted"})})())},L=()=>{y(!1),i({type:"reload"})},D=o!==null&&o.length>0&&s.length===o.length,M=new Set(s);return S(be,{children:[S("section",{className:"border border-border bg-card p-3","data-testid":"kv-keys-section",children:[S("div",{className:"mb-3 flex flex-wrap items-center gap-2",children:[r(re,{"aria-label":d("Filter keys by prefix"),className:"min-w-[16rem] flex-1","data-testid":"kv-prefix-input",onChange:x,placeholder:d("Filter by prefix…"),value:K}),r(B,{"data-testid":"kv-filter-btn",disabled:I,onClick:N,children:d("Filter")}),r(B,{"data-testid":"kv-new-key-btn",onClick:()=>{y(n=>!n)},variant:"outline",children:d("New key")}),s.length>0&&r(B,{"data-testid":"kv-bulk-delete-btn",disabled:t,onClick:V,variant:"destructive",children:t?d("Deleting…"):d("Delete {count}",{count:s.length})})]}),a!==null&&r("p",{className:"mb-2 text-sm text-destructive","data-testid":"kv-bulk-error",role:"alert",children:a}),f!==null&&r("p",{className:"text-sm text-destructive","data-testid":"kv-keys-error",role:"alert",children:f}),o!==null&&o.length===0&&!I&&r("p",{className:"text-sm text-muted-foreground","data-testid":"kv-no-keys",children:d("No keys.")}),o!==null&&o.length>0&&r(ve,{className:"overflow-hidden py-0",children:r(pe,{className:"px-0",children:S(ye,{"data-testid":"kv-key-table",children:[r(he,{children:S(X,{children:[r(Y,{className:"w-10",children:r(de,{"aria-label":d("Select all"),checked:D,"data-testid":"kv-select-all",onCheckedChange:J})}),r(Y,{children:d("Key")}),r(Y,{children:d("Expiration")})]})}),r(ke,{children:o.map(n=>S(X,{className:n.name===p?"border-l-2 border-l-royal-amethyst bg-muted/50":"cursor-pointer","data-key":n.name,"data-testid":`kv-key-row-${n.name}`,onClick:C,children:[r(Q,{onClick:h=>{h.stopPropagation()},children:r(de,{"aria-label":d("Select {name}",{name:n.name}),checked:M.has(n.name),"data-testid":`kv-select-${n.name}`,onCheckedChange:()=>{E(n.name)}})}),r(Q,{className:"font-mono text-xs",children:n.name}),r(Q,{className:"tabular-nums text-xs",children:Je(n.expiration)})]},n.name))})]})})}),!g&&v!==null&&r("div",{className:"mt-2",children:r(B,{"data-testid":"kv-load-more",disabled:I,onClick:k,variant:"outline",children:d(I?"Loading…":"Load more")})})]}),r(ie,{onOpenChange:n=>{n||y(!1)},open:u,children:S(se,{className:"w-full gap-0 overflow-y-auto sm:max-w-md","data-testid":"kv-create-sheet",side:"right",children:[r(oe,{children:r(ce,{children:d("New key")})}),r(Pe,{namespace:l,onCancel:()=>{y(!1)},onCreated:L})]})}),r(ie,{onOpenChange:n=>{n||i({name:null,type:"selectKey"})},open:p!==null,children:S(se,{className:"w-full gap-0 overflow-y-auto sm:max-w-md","data-testid":"kv-editor-sheet",side:"right",children:[r(oe,{children:r(ce,{className:"truncate font-mono text-xs",children:p})}),p!==null&&r(ze,{expiration:o?.find(n=>n.name===p)?.expiration,keyName:p,namespace:l,onDeleted:w},`${l}:${p}`)]})})]})},ct=({loadNamespaces:l}={})=>{const e=ee(),d=q(),[c,i]=Z(null),[m,s]=Z(null),[t,a]=Z(null);le(()=>{const o={cancelled:!1};return z((async()=>{try{const g=await(l??(()=>e.listKvNamespaces()))();o.cancelled||(i(g),s(null),a(f=>f??g[0]?.binding??null))}catch(g){o.cancelled||(i(null),s(H(g)))}})()),()=>{o.cancelled=!0}},[e,l]);const v=o=>{a(o.currentTarget.dataset.ns??null)};return S("div",{className:"flex flex-col gap-4","data-testid":"lunora-kv-browser",children:[m!==null&&r("p",{className:"text-sm text-destructive","data-testid":"kv-ns-error",role:"alert",children:m}),c!==null&&c.length===0&&r(Fe,{description:d("Add a kv_namespaces binding to wrangler.jsonc — it appears here automatically, no wiring needed."),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:"M5 5h14v4H5V5Zm0 5h14v4H5v-4Zm0 5h14v4H5v-4Z"})}),testId:"kv-empty",title:d("No KV namespaces.")}),c!==null&&c.length>0&&r(ve,{className:"overflow-hidden py-0",children:r(pe,{className:"px-0",children:S(ye,{"data-testid":"kv-namespace-table",children:[r(he,{children:r(X,{children:r(Y,{children:d("Namespace")})})}),r(ke,{children:c.map(o=>r(X,{className:o.binding===t?"border-l-2 border-l-royal-amethyst bg-muted/50":"cursor-pointer","data-ns":o.binding,"data-testid":`kv-ns-row-${o.binding}`,onClick:v,children:r(Q,{className:"font-mono text-xs",children:o.binding})},o.binding))})]})})}),t!==null&&r(Ue,{namespace:t},t)]})};export{ct as KvBrowser};
@@ -1,4 +1,4 @@
1
- import{c as te}from"react/compiler-runtime";import{useState as X}from"react";import{u as se}from"../packem_shared/button-BkCrNcAs.js";import{c as re,u as oe}from"../packem_shared/card-CIDGUN6K.js";import{u as ce}from"../packem_shared/input-JHu63lTv.js";import{useT as ae}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{a as me}from"../packem_shared/cf-links-Dmg86v1D.js";import{c as pe,f as ue,b as fe}from"../packem_shared/internal-zkEvTqy8.js";import{jsx as r,jsxs as h}from"react/jsx-runtime";const he=e=>{const t=te(23),{destination:s}=e,f=ae();let g;t[0]!==s.snippet?(g=()=>{pe(s.snippet)},t[0]=s.snippet,t[1]=g):g=t[1];const m=g;let o;t[2]!==s.title?(o=r("h4",{className:"text-sm font-semibold",children:s.title}),t[2]=s.title,t[3]=o):o=t[3];let a;t[4]!==s.description?(a=r("p",{className:"text-sm text-muted-foreground",children:s.description}),t[4]=s.description,t[5]=a):a=t[5];let d;t[6]!==o||t[7]!==a?(d=h("div",{children:[o,a]}),t[6]=o,t[7]=a,t[8]=d):d=t[8];const F=`drain-copy-${s.id}`;let l;t[9]!==f?(l=f("Copy"),t[9]=f,t[10]=l):l=t[10];let n;t[11]!==m||t[12]!==F||t[13]!==l?(n=r(se,{"data-testid":F,onClick:m,size:"sm",variant:"outline",children:l}),t[11]=m,t[12]=F,t[13]=l,t[14]=n):n=t[14];let i;t[15]!==d||t[16]!==n?(i=h("div",{className:"flex items-start justify-between gap-3",children:[d,n]}),t[15]=d,t[16]=n,t[17]=i):i=t[17];let c;t[18]!==s.snippet?(c=r("pre",{className:"mt-2 overflow-x-auto rounded bg-muted p-2 font-mono text-xs",children:s.snippet}),t[18]=s.snippet,t[19]=c):c=t[19];let x;return t[20]!==i||t[21]!==c?(x=r(re,{className:"py-0","data-testid":"drain-card",children:h(oe,{className:"p-3",children:[i,c]})}),t[20]=i,t[21]=c,t[22]=x):x=t[22],x},_e=()=>{const e=te(88),t=ae();let s;e[0]!==t?(s=t("Stream every request log to R2, a SIEM, or a third-party log service."),e[0]=t,e[1]=s):s=e[1];let f;e[2]===Symbol.for("react.memo_cache_sentinel")?(f=["{",' "logpush": true',"}"],e[2]=f):f=e[2];const g=f.join(`
1
+ import{c as te}from"react/compiler-runtime";import{useState as X}from"react";import{u as se}from"../packem_shared/button-BkCrNcAs.js";import{c as re,f as oe}from"../packem_shared/card-BMKx5UdA.js";import{u as ce}from"../packem_shared/input-JHu63lTv.js";import{useT as ae}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{a as me}from"../packem_shared/cf-links-Dmg86v1D.js";import{c as pe,f as ue,b as fe}from"../packem_shared/internal-zkEvTqy8.js";import{jsx as r,jsxs as h}from"react/jsx-runtime";const he=e=>{const t=te(23),{destination:s}=e,f=ae();let g;t[0]!==s.snippet?(g=()=>{pe(s.snippet)},t[0]=s.snippet,t[1]=g):g=t[1];const m=g;let o;t[2]!==s.title?(o=r("h4",{className:"text-sm font-semibold",children:s.title}),t[2]=s.title,t[3]=o):o=t[3];let a;t[4]!==s.description?(a=r("p",{className:"text-sm text-muted-foreground",children:s.description}),t[4]=s.description,t[5]=a):a=t[5];let d;t[6]!==o||t[7]!==a?(d=h("div",{children:[o,a]}),t[6]=o,t[7]=a,t[8]=d):d=t[8];const F=`drain-copy-${s.id}`;let l;t[9]!==f?(l=f("Copy"),t[9]=f,t[10]=l):l=t[10];let n;t[11]!==m||t[12]!==F||t[13]!==l?(n=r(se,{"data-testid":F,onClick:m,size:"sm",variant:"outline",children:l}),t[11]=m,t[12]=F,t[13]=l,t[14]=n):n=t[14];let i;t[15]!==d||t[16]!==n?(i=h("div",{className:"flex items-start justify-between gap-3",children:[d,n]}),t[15]=d,t[16]=n,t[17]=i):i=t[17];let c;t[18]!==s.snippet?(c=r("pre",{className:"mt-2 overflow-x-auto rounded bg-muted p-2 font-mono text-xs",children:s.snippet}),t[18]=s.snippet,t[19]=c):c=t[19];let x;return t[20]!==i||t[21]!==c?(x=r(re,{className:"py-0","data-testid":"drain-card",children:h(oe,{className:"p-3",children:[i,c]})}),t[20]=i,t[21]=c,t[22]=x):x=t[22],x},_e=()=>{const e=te(88),t=ae();let s;e[0]!==t?(s=t("Stream every request log to R2, a SIEM, or a third-party log service."),e[0]=t,e[1]=s):s=e[1];let f;e[2]===Symbol.for("react.memo_cache_sentinel")?(f=["{",' "logpush": true',"}"],e[2]=f):f=e[2];const g=f.join(`
2
2
  `);let m;e[3]!==t?(m=t("Logpush"),e[3]=t,e[4]=m):m=e[4];let o;e[5]!==s||e[6]!==m?(o={description:s,id:"logpush",snippet:g,title:m},e[5]=s,e[6]=m,e[7]=o):o=e[7];let a;e[8]!==t?(a=t("Send logs programmatically to a Worker for custom capture and forwarding."),e[8]=t,e[9]=a):a=e[9];let d;e[10]===Symbol.for("react.memo_cache_sentinel")?(d=["{",' "tail_consumers": [{ "service": "my-log-forwarder" }]',"}"],e[10]=d):d=e[10];const F=d.join(`
3
3
  `);let l;e[11]!==t?(l=t("Tail Workers"),e[11]=t,e[12]=l):l=e[12];let n;e[13]!==a||e[14]!==l?(n={description:a,id:"tail-worker",snippet:F,title:l},e[13]=a,e[14]=l,e[15]=n):n=e[15];let i;e[16]!==t?(i=t("Retain and query recent request logs directly in Cloudflare's dashboard."),e[16]=t,e[17]=i):i=e[17];let c;e[18]===Symbol.for("react.memo_cache_sentinel")?(c=["{",' "observability": { "enabled": true }',"}"],e[18]=c):c=e[18];const x=c.join(`
4
- `);let y;e[19]!==t?(y=t("Workers Logs"),e[19]=t,e[20]=y):y=e[20];let b;e[21]!==i||e[22]!==y?(b={description:i,id:"workers-logs",snippet:x,title:y},e[21]=i,e[22]=y,e[23]=b):b=e[23];let P;e[24]!==b||e[25]!==o||e[26]!==n?(P=[o,n,b],e[24]=b,e[25]=o,e[26]=n,e[27]=P):P=e[27];const V=P,[p,le]=X(""),[k,Z]=X(!1),[u,U]=X(null);let z;if(e[28]!==t||e[29]!==p){const G=async()=>{const Q=p.trim();if(Q==="")return;const ee="fetch"in globalThis?globalThis.fetch:void 0;if(ee===void 0){U({kind:"error",message:t("fetch is unavailable in this environment.")});return}const ie={durationMs:12,function:"messages:list",outcome:"ok",shard:"root",source:"lunora",tablesRead:["messages"],tablesWritten:[],ts:new Date().toISOString(),type:"request"};Z(!0),U(null);const de=performance.now();try{const H=await ee(Q,{body:JSON.stringify(ie),headers:{"Content-Type":"application/json"},method:"POST"});U({kind:"success",latencyMs:Math.round(performance.now()-de),status:H.status})}catch(H){U({kind:"error",message:fe(H)})}Z(!1)};z=()=>{ue(G())},e[28]=t,e[29]=p,e[30]=z}else z=e[30];const Y=z;let J;e[31]===Symbol.for("react.memo_cache_sentinel")?(J=G=>{le(G.target.value)},e[31]=J):J=e[31];const ne=J;let v;e[32]!==t?(v=t("Open in Cloudflare"),e[32]=t,e[33]=v):v=e[33];let w;e[34]!==v?(w=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":"drain-cf-link",href:me,rel:"noreferrer",target:"_blank",children:v})}),e[34]=v,e[35]=w):w=e[35];let N;e[36]!==t?(N=t("Lunora does not ship logs itself — forwarding is handled by Cloudflare. Configure a destination below, then test your collector."),e[36]=t,e[37]=N):N=e[37];let S;e[38]!==N?(S=r("p",{className:"text-sm text-muted-foreground","data-testid":"drain-readonly-note",children:N}),e[38]=N,e[39]=S):S=e[39];let C;e[40]!==t?(C=t("Cloudflare destinations"),e[40]=t,e[41]=C):C=e[41];let _;e[42]!==C?(_=r("h3",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:C}),e[42]=C,e[43]=_):_=e[43];let L;e[44]!==V?(L=V.map(ge),e[44]=V,e[45]=L):L=e[45];let T;e[46]!==_||e[47]!==L?(T=h("section",{className:"flex flex-col gap-3","data-testid":"drain-destinations",children:[_,L]}),e[46]=_,e[47]=L,e[48]=T):T=e[48];let $;e[49]!==t?($=t("Webhook test"),e[49]=t,e[50]=$):$=e[50];let j;e[51]!==$?(j=r("h3",{className:"mb-1 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:$}),e[51]=$,e[52]=j):j=e[52];let O;e[53]!==t?(O=t("POST a sample Lunora request-log envelope to your collector to confirm it is reachable."),e[53]=t,e[54]=O):O=e[54];let M;e[55]!==O?(M=r("p",{className:"mb-2 text-sm text-muted-foreground",children:O}),e[55]=O,e[56]=M):M=e[56];let R;e[57]!==t?(R=t("https://example.com/logs"),e[57]=t,e[58]=R):R=e[58];let q;e[59]!==R||e[60]!==p?(q=r(ce,{className:"min-w-[20rem] flex-1","data-testid":"drain-webhook-url",onChange:ne,placeholder:R,type:"url",value:p}),e[59]=R,e[60]=p,e[61]=q):q=e[61];let W;e[62]!==k||e[63]!==p?(W=k||p.trim()==="",e[62]=k,e[63]=p,e[64]=W):W=e[64];let D;e[65]!==k||e[66]!==t?(D=t(k?"Sending…":"Send test event"),e[65]=k,e[66]=t,e[67]=D):D=e[67];let I;e[68]!==Y||e[69]!==W||e[70]!==D?(I=r(se,{"data-testid":"drain-webhook-test",disabled:W,onClick:Y,children:D}),e[68]=Y,e[69]=W,e[70]=D,e[71]=I):I=e[71];let A;e[72]!==q||e[73]!==I?(A=h("div",{className:"flex flex-wrap items-center gap-2",children:[q,I]}),e[72]=q,e[73]=I,e[74]=A):A=e[74];let B;e[75]!==u||e[76]!==t?(B=u!==null&&r("p",{className:u.kind==="success"?"mt-2 text-sm text-muted-foreground":"mt-2 text-sm text-destructive","data-testid":"drain-webhook-result",role:u.kind==="error"?"alert":void 0,children:u.kind==="success"?t("Delivered — status {status} in {latency}ms",{latency:u.latencyMs,status:u.status}):t("Failed: {message}",{message:u.message})}),e[75]=u,e[76]=t,e[77]=B):B=e[77];let E;e[78]!==j||e[79]!==M||e[80]!==A||e[81]!==B?(E=r(re,{className:"py-0",children:r(oe,{className:"p-3",children:h("section",{"data-testid":"drain-webhook",children:[j,M,A,B]})})}),e[78]=j,e[79]=M,e[80]=A,e[81]=B,e[82]=E):E=e[82];let K;return e[83]!==w||e[84]!==S||e[85]!==T||e[86]!==E?(K=h("div",{className:"flex flex-col gap-4","data-testid":"log-drains",children:[w,S,T,E]}),e[83]=w,e[84]=S,e[85]=T,e[86]=E,e[87]=K):K=e[87],K};function ge(e){return r(he,{destination:e},e.id)}export{_e as LogDrainsPanel};
4
+ `);let y;e[19]!==t?(y=t("Workers Logs"),e[19]=t,e[20]=y):y=e[20];let b;e[21]!==i||e[22]!==y?(b={description:i,id:"workers-logs",snippet:x,title:y},e[21]=i,e[22]=y,e[23]=b):b=e[23];let P;e[24]!==b||e[25]!==o||e[26]!==n?(P=[o,n,b],e[24]=b,e[25]=o,e[26]=n,e[27]=P):P=e[27];const V=P,[p,le]=X(""),[k,Z]=X(!1),[u,U]=X(null);let z;if(e[28]!==t||e[29]!==p){const G=async()=>{const Q=p.trim();if(Q==="")return;const ee="fetch"in globalThis?globalThis.fetch:void 0;if(ee===void 0){U({kind:"error",message:t("fetch is unavailable in this environment.")});return}const ie={durationMs:12,function:"messages:list",outcome:"ok",shard:"root",source:"lunora",tablesRead:["messages"],tablesWritten:[],ts:new Date().toISOString(),type:"request"};Z(!0),U(null);const de=performance.now();try{const H=await ee(Q,{body:JSON.stringify(ie),headers:{"Content-Type":"application/json"},method:"POST"});U({kind:"success",latencyMs:Math.round(performance.now()-de),status:H.status})}catch(H){U({kind:"error",message:fe(H)})}Z(!1)};z=()=>{ue(G())},e[28]=t,e[29]=p,e[30]=z}else z=e[30];const Y=z;let J;e[31]===Symbol.for("react.memo_cache_sentinel")?(J=G=>{le(G.target.value)},e[31]=J):J=e[31];const ne=J;let v;e[32]!==t?(v=t("Open in Cloudflare"),e[32]=t,e[33]=v):v=e[33];let w;e[34]!==v?(w=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":"drain-cf-link",href:me,rel:"noreferrer",target:"_blank",children:v})}),e[34]=v,e[35]=w):w=e[35];let N;e[36]!==t?(N=t("Lunora does not ship logs itself — forwarding is handled by Cloudflare. Configure a destination below, then test your collector."),e[36]=t,e[37]=N):N=e[37];let S;e[38]!==N?(S=r("p",{className:"text-sm text-muted-foreground","data-testid":"drain-readonly-note",children:N}),e[38]=N,e[39]=S):S=e[39];let C;e[40]!==t?(C=t("Cloudflare destinations"),e[40]=t,e[41]=C):C=e[41];let _;e[42]!==C?(_=r("h3",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:C}),e[42]=C,e[43]=_):_=e[43];let T;e[44]!==V?(T=V.map(ge),e[44]=V,e[45]=T):T=e[45];let $;e[46]!==_||e[47]!==T?($=h("section",{className:"flex flex-col gap-3","data-testid":"drain-destinations",children:[_,T]}),e[46]=_,e[47]=T,e[48]=$):$=e[48];let L;e[49]!==t?(L=t("Webhook test"),e[49]=t,e[50]=L):L=e[50];let j;e[51]!==L?(j=r("h3",{className:"mb-1 font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:L}),e[51]=L,e[52]=j):j=e[52];let O;e[53]!==t?(O=t("POST a sample Lunora request-log envelope to your collector to confirm it is reachable."),e[53]=t,e[54]=O):O=e[54];let M;e[55]!==O?(M=r("p",{className:"mb-2 text-sm text-muted-foreground",children:O}),e[55]=O,e[56]=M):M=e[56];let R;e[57]!==t?(R=t("https://example.com/logs"),e[57]=t,e[58]=R):R=e[58];let q;e[59]!==R||e[60]!==p?(q=r(ce,{className:"min-w-[20rem] flex-1","data-testid":"drain-webhook-url",onChange:ne,placeholder:R,type:"url",value:p}),e[59]=R,e[60]=p,e[61]=q):q=e[61];let W;e[62]!==k||e[63]!==p?(W=k||p.trim()==="",e[62]=k,e[63]=p,e[64]=W):W=e[64];let I;e[65]!==k||e[66]!==t?(I=t(k?"Sending…":"Send test event"),e[65]=k,e[66]=t,e[67]=I):I=e[67];let A;e[68]!==Y||e[69]!==W||e[70]!==I?(A=r(se,{"data-testid":"drain-webhook-test",disabled:W,onClick:Y,children:I}),e[68]=Y,e[69]=W,e[70]=I,e[71]=A):A=e[71];let B;e[72]!==q||e[73]!==A?(B=h("div",{className:"flex flex-wrap items-center gap-2",children:[q,A]}),e[72]=q,e[73]=A,e[74]=B):B=e[74];let D;e[75]!==u||e[76]!==t?(D=u!==null&&r("p",{className:u.kind==="success"?"mt-2 text-sm text-muted-foreground":"mt-2 text-sm text-destructive","data-testid":"drain-webhook-result",role:u.kind==="error"?"alert":void 0,children:u.kind==="success"?t("Delivered — status {status} in {latency}ms",{latency:u.latencyMs,status:u.status}):t("Failed: {message}",{message:u.message})}),e[75]=u,e[76]=t,e[77]=D):D=e[77];let E;e[78]!==j||e[79]!==M||e[80]!==B||e[81]!==D?(E=r(re,{className:"py-0",children:r(oe,{className:"p-3",children:h("section",{"data-testid":"drain-webhook",children:[j,M,B,D]})})}),e[78]=j,e[79]=M,e[80]=B,e[81]=D,e[82]=E):E=e[82];let K;return e[83]!==w||e[84]!==S||e[85]!==$||e[86]!==E?(K=h("div",{className:"flex flex-col gap-4","data-testid":"log-drains",children:[w,S,$,E]}),e[83]=w,e[84]=S,e[85]=$,e[86]=E,e[87]=K):K=e[87],K};function ge(e){return r(he,{destination:e},e.id)}export{_e as default};
@@ -1 +1 @@
1
- import{c as w}from"react/compiler-runtime";import{useMemo as O,useState as D}from"react";import{useT as M}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{c as N}from"../packem_shared/utils-bhneXptQ.js";import{MigrationsPanel as E}from"../packem_shared/MigrationsPanel-dm_M75mR.js";import{useNavigate as J,useSearch as P}from"@tanstack/react-router";import{E as H}from"../packem_shared/error-alert--Ie7ofJ0.js";import{E as U}from"../packem_shared/empty-state-Cg7t_8qu.js";import{N as S}from"../packem_shared/use-admin-query-CnnyWJXM.js";import{ADMIN_FUNCTIONS as I}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{i as V,f as W}from"../packem_shared/internal-zkEvTqy8.js";import{S as _}from"../packem_shared/schema-diagram-DTRaCp6Y.js";import{jsx as l,jsxs as g}from"react/jsx-runtime";const k=t=>typeof t=="object"&&t!==null,z=t=>k(t)&&k(t.fields)&&k(t.indexes)&&k(t.relations)&&typeof t.shardMode=="string",B=t=>{if(t===void 0||t.trim()==="")return{status:"absent"};let e;try{e=JSON.parse(t)}catch(a){return{error:`baseline is not valid JSON: ${a instanceof Error?a.message:String(a)}`,status:"invalid"}}if(!k(e)||e.version!==1||!k(e.tables))return{error:`baseline is malformed or written by an incompatible version (expected version ${String(1)})`,status:"invalid"};for(const[a,n]of Object.entries(e.tables))if(!z(n))return{error:`baseline table "${a}" has an invalid structure`,status:"invalid"};return{snapshot:{jurisdiction:typeof e.jurisdiction=="string"?e.jurisdiction:void 0,migrationIds:Array.isArray(e.migrationIds)?e.migrationIds:[],tables:e.tables,version:1},status:"ok"}},L=(t,e)=>t.unique===e.unique&&t.fields.length===e.fields.length&&t.fields.every((a,n)=>a===e.fields[n]),Q=(t,e,a,n)=>{const s=[];return a.kind!==n.kind&&s.push({severity:"breaking",summary:`field ${t}.${e} changed type: ${a.kind} → ${n.kind} — add a data migration to convert existing values`,table:t,scope:"table",type:"changedFieldKind"}),a.optional&&!n.optional?s.push({severity:"breaking",summary:`field ${t}.${e} became required — rows missing it would be invalid; add a data migration to backfill it`,table:t,scope:"table",type:"fieldOptionalToRequired"}):!a.optional&&n.optional&&s.push({scope:"table",severity:"safe",summary:`field ${t}.${e} became optional`,table:t,type:"fieldRequiredToOptional"}),s},G=(t,e,a)=>a.optional?{scope:"table",severity:"safe",summary:`added optional field ${t}.${e}`,table:t,type:"addedOptionalField"}:{severity:"breaking",summary:`added required field ${t}.${e} — existing rows have no value; add a data migration to backfill it`,table:t,scope:"table",type:"addedRequiredField"},X=(t,e,a,n)=>{for(const[s,o]of Object.entries(a.fields)){const i=e.fields[s];i===void 0?n.push(G(t,s,o)):n.push(...Q(t,s,i,o))}for(const s of Object.keys(e.fields))a.fields[s]===void 0&&n.push({severity:"breaking",summary:`removed field ${t}.${s} — add a data migration if stored data must be cleaned up`,table:t,scope:"table",type:"removedField"})},Y=(t,e,a,n)=>{for(const[s,o]of Object.entries(a.indexes)){const i=e.indexes[s];if(i===void 0){n.push({scope:"table",severity:"safe",summary:`added index ${s} on ${t}`,table:t,type:"addedIndex"});continue}L(i,o)||n.push({severity:"breaking",summary:`index ${s} on ${t} changed shape — a query may have relied on the old index`,table:t,scope:"table",type:"changedIndex"})}for(const s of Object.keys(e.indexes))a.indexes[s]===void 0&&n.push({severity:"breaking",summary:`removed index ${s} on ${t} — a query that used \`.withIndex("${s}")\` would break`,table:t,scope:"table",type:"removedIndex"})},Z=(t,e,a,n)=>{for(const s of Object.keys(a.relations))e.relations[s]===void 0&&n.push({scope:"schema",severity:"safe",summary:`added relation ${t}.${s}`,table:t,type:"addedRelation"});for(const s of Object.keys(e.relations))a.relations[s]===void 0&&n.push({scope:"schema",severity:"breaking",summary:`removed relation ${t}.${s}`,table:t,type:"removedRelation"})},ee=(t,e,a,n)=>{e.shardMode!==a.shardMode&&n.push({severity:"breaking",summary:`table ${t} changed shard mode: ${e.shardMode} → ${a.shardMode} — its physical storage moves; add a data migration / re-shard plan`,table:t,scope:"table",type:"changedShardMode"}),X(t,e,a,n),Y(t,e,a,n),Z(t,e,a,n)},te=(t,e)=>{const a=[],n=t?.tables??{};for(const[s,o]of Object.entries(e.tables)){const i=n[s];if(i===void 0){a.push({scope:"table",severity:"safe",summary:`added table ${s}`,table:s,type:"addedTable"});continue}ee(s,i,o,a)}for(const s of Object.keys(n))e.tables[s]===void 0&&a.push({scope:"table",severity:"breaking",summary:`removed table ${s} — add a data migration if its data must be archived/cleaned up`,table:s,type:"removedTable"});if(t!==void 0&&t.jurisdiction!==e.jurisdiction){const s=t.jurisdiction??"(none)",o=e.jurisdiction??"(none)";a.push({scope:"schema",severity:"breaking",summary:`Durable Object jurisdiction changed from ${s} to ${o} — this re-homes every DO and strands all existing shard, scheduler, and session-DO data in the old region (no in-place migration; export then import to move it). Revert the change, or override the gate to proceed intentionally.`,type:"changedJurisdiction"})}return{changes:a}},T=t=>Object.entries(t.fields).map(([e,a])=>({name:e,optional:a.optional,ref:Object.values(t.relations).find(n=>n.field===e&&n.kind==="one")?.table,type:a.kind})),F=(t,e)=>{const a={},n=t?.fields??{},s=e?.fields??{};for(const[o,i]of Object.entries(s)){const r=n[o];r===void 0?a[o]=t===void 0?"unchanged":"added":a[o]=r.kind===i.kind&&r.optional===i.optional?"unchanged":"changed"}for(const o of Object.keys(n))s[o]===void 0&&(a[o]="removed");return a},ae=(t,e)=>{const{changes:a}=te(t,e),n=new Set(a.filter(i=>i.scope==="table"&&i.table!==void 0).map(i=>i.table)),s=[],o=(i,r)=>i?"added":n.has(r)?"changed":"context";for(const[i,r]of Object.entries(e.tables)){const c=t?.tables[i],u=o(c===void 0,i);s.push({columns:T(r),fieldStatus:F(c,r),name:i,shardMode:r.shardMode,status:u})}for(const[i,r]of Object.entries(t?.tables??{}))e.tables[i]===void 0&&s.push({columns:T(r),fieldStatus:F(r,void 0),name:i,shardMode:r.shardMode,status:"removed"});return s.sort((i,r)=>i.name.localeCompare(r.name)),{breakingCount:a.filter(i=>i.severity==="breaking").length,changes:a,tables:s}},A=t=>{const e=B(t);return e.status==="ok"?e.snapshot:void 0},ne={added:"ring-2 ring-emerald-500/60",changed:"ring-2 ring-amber-500/70",context:"opacity-55",removed:"opacity-70 ring-2 ring-destructive/60"},se=t=>t==="global"?"global":"shard",ie=t=>{const e=w(24),{appliedAt:a,hash:n,onSelect:s,selected:o,seq:i}=t,r=o?"border-s-primary bg-accent/60 text-foreground":"border-s-transparent text-muted-foreground hover:bg-accent/30 hover:text-foreground";let c;e[0]!==r?(c=N("flex w-full flex-col items-start gap-1 border-s-2 px-4 py-3 text-start outline-none transition-colors",r),e[0]=r,e[1]=c):c=e[1];const u=`sh-version-${n}`;let m;e[2]!==n||e[3]!==s?(m=()=>{s(n)},e[2]=n,e[3]=s,e[4]=m):m=e[4];let p;e[5]!==i?(p=g("span",{className:"font-mono text-[13px] tabular-nums",children:["v",i]}),e[5]=i,e[6]=p):p=e[6];let b;e[7]!==n?(b=n.slice(0,7),e[7]=n,e[8]=b):b=e[8];let h;e[9]!==b?(h=l("span",{className:"ms-auto font-mono text-[10px] tracking-wider text-muted-foreground/70 uppercase",children:b}),e[9]=b,e[10]=h):h=e[10];let f;e[11]!==p||e[12]!==h?(f=g("span",{className:"flex w-full items-baseline gap-2",children:[p,h]}),e[11]=p,e[12]=h,e[13]=f):f=e[13];let v;e[14]!==a?(v=V(a),e[14]=a,e[15]=v):v=e[15];let x;e[16]!==v?(x=l("span",{className:"font-mono text-[10px] tracking-wide text-muted-foreground/70",children:v}),e[16]=v,e[17]=x):x=e[17];let d;return e[18]!==x||e[19]!==c||e[20]!==u||e[21]!==m||e[22]!==f?(d=l("li",{children:g("button",{className:c,"data-testid":u,onClick:m,type:"button",children:[f,x]})}),e[18]=x,e[19]=c,e[20]=u,e[21]=m,e[22]=f,e[23]=d):d=e[23],d},re=t=>{const e=w(26),{breaking:a,count:n,first:s}=t,o=M();if(s){let h;e[0]!==n?(h=l("span",{className:"text-3xl leading-none font-light tracking-tight tabular-nums",children:n}),e[0]=n,e[1]=h):h=e[1];let f;e[2]!==o?(f=o("tables"),e[2]=o,e[3]=f):f=e[3];let v;e[4]!==f?(v=l("span",{className:"font-mono text-[11px] tracking-widest text-muted-foreground uppercase",children:f}),e[4]=f,e[5]=v):v=e[5];let x;return e[6]!==h||e[7]!==v?(x=g("div",{className:"flex items-baseline gap-3","data-testid":"sh-summary",children:[h,v]}),e[6]=h,e[7]=v,e[8]=x):x=e[8],x}const i=a>0&&"text-destructive";let r;e[9]!==i?(r=N("text-3xl leading-none font-light tracking-tight tabular-nums",i),e[9]=i,e[10]=r):r=e[10];let c;e[11]!==n||e[12]!==r?(c=l("span",{className:r,children:n}),e[11]=n,e[12]=r,e[13]=c):c=e[13];let u;e[14]!==n||e[15]!==o?(u=o(n===1?"change":"changes"),e[14]=n,e[15]=o,e[16]=u):u=e[16];let m;e[17]!==u?(m=l("span",{className:"font-mono text-[11px] tracking-widest text-muted-foreground uppercase",children:u}),e[17]=u,e[18]=m):m=e[18];let p;e[19]!==a||e[20]!==o?(p=a>0&&g("span",{className:"font-mono text-[11px] tracking-widest text-destructive uppercase",children:["· ",o("{count} breaking",{count:a})]}),e[19]=a,e[20]=o,e[21]=p):p=e[21];let b;return e[22]!==c||e[23]!==m||e[24]!==p?(b=g("div",{className:"flex items-baseline gap-3","data-testid":"sh-summary",children:[c,m,p]}),e[22]=c,e[23]=m,e[24]=p,e[25]=b):b=e[25],b},K={addedIndex:{action:"added",kind:"index"},addedOptionalField:{action:"added",kind:"field?"},addedRelation:{action:"added",kind:"relation"},addedRequiredField:{action:"added",kind:"field"},addedTable:{action:"added",kind:"table"},changedFieldKind:{action:"changed",kind:"field kind"},changedIndex:{action:"changed",kind:"index"},changedJurisdiction:{action:"changed",kind:"jurisdiction"},changedShardMode:{action:"changed",kind:"shard mode"},fieldOptionalToRequired:{action:"changed",kind:"field → required"},fieldRequiredToOptional:{action:"changed",kind:"field → optional"},removedField:{action:"removed",kind:"field"},removedIndex:{action:"removed",kind:"index"},removedRelation:{action:"removed",kind:"relation"},removedTable:{action:"removed",kind:"table"}},oe=(t,e)=>{const a=`${K[t.type].action} ${e} `;return t.summary.startsWith(a)?t.summary.slice(a.length):t.summary},de=t=>{const e=new Map;for(const n of t){const s=n.table??"",o=e.get(s);o===void 0?e.set(s,[n]):o.push(n)}const a=[...e].map(([n,s])=>({changes:s,table:n}));return[...a.filter(n=>n.table!==""),...a.filter(n=>n.table==="")]},le=t=>{const e=w(2),{children:a}=t;let n;return e[0]!==a?(n=l("div",{className:"px-4 pt-4 pb-2 font-mono text-[10px] tracking-widest text-muted-foreground/70 uppercase",children:a}),e[0]=a,e[1]=n):n=e[1],n},ce=({pane:t,shardKey:e=""})=>{const a=M(),n=J(),s=P({strict:!1}).version,o=d=>{W(n({search:{version:d},to:"/migrations"}))},i=S(I.schemaHistory,{},{shardKey:e}),r=i.data?.versions??[],c=s!==void 0&&r.some(d=>d.hash===s)?s:r[0]?.hash,u=r.findIndex(d=>d.hash===c),m=u===-1?void 0:r[u+1]?.hash,p=S(I.schemaVersion,{hash:c??""},{enabled:c!==void 0,shardKey:e}),b=S(I.schemaVersion,{hash:m??""},{enabled:m!==void 0,shardKey:e}),h=O(()=>{const d=A(p.data?.version?.snapshotJson);if(d!==void 0)return ae(A(b.data?.version?.snapshotJson),d)},[p.data,b.data]),f=O(()=>(h?.tables??[]).map(d=>({columns:d.columns,name:d.name,tier:se(d.shardMode)})),[h]),v=O(()=>{const d={};for(const $ of h?.tables??[])d[$.name]=ne[$.status];return d},[h]);if(i.error!==null)return l(H,{error:i.errorSource,testId:"sh-error"});if(r.length===0)return l(U,{description:a("Each distinct schema shape this shard runs is recorded here, so you can see what changed and when."),testId:"sh-empty",title:a("No schema versions recorded yet.")});const x=h?.changes??[];return g("div",{className:"flex min-h-0 flex-1 gap-4","data-testid":"lunora-schema-history",children:[g("nav",{className:"flex w-56 shrink-0 flex-col overflow-hidden border-e border-border","data-testid":"sh-timeline-rail",children:[l(le,{children:a("Schema versions")}),l("ul",{className:"min-h-0 flex-1 overflow-y-auto","data-testid":"sh-timeline",children:r.map(d=>l(ie,{appliedAt:d.appliedAt,hash:d.hash,onSelect:o,selected:d.hash===c,seq:d.seq},d.hash))})]}),g("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col gap-4 pe-1 pt-4",children:[l(re,{breaking:h?.breakingCount??0,count:m===void 0?f.length:x.length,first:m===void 0}),t==="diagram"?l("div",{className:"flex min-h-0 flex-1 flex-col",children:l(_,{fill:!0,nodeClasses:v,tables:f,testIdPrefix:"sh"})}):l("div",{className:"min-h-0 flex-1 overflow-y-auto","data-testid":"sh-changes",children:de(x).map(d=>{const $=(h?.tables??[]).find(y=>y.name===d.table);return g("section",{className:"mb-6",children:[g("div",{className:"flex items-baseline gap-3 border-b border-border/60 pb-1.5",children:[l("span",{className:"font-mono text-[13px] text-foreground",children:d.table===""?a("schema"):d.table}),$!==void 0&&l("span",{className:"font-mono text-[10px] tracking-widest text-muted-foreground/70 tabular-nums uppercase",children:a("{count} columns",{count:$.columns.length})}),d.changes.length>1&&l("span",{className:"ms-auto font-mono text-[10px] tracking-widest text-muted-foreground/70 tabular-nums",children:d.changes.length})]}),l("ul",{children:d.changes.map(y=>{const{action:C,kind:q}=K[y.type],j=y.severity==="breaking",R=oe(y,q);return g("li",{className:"flex items-baseline gap-4 border-s-2 py-1.5 ps-3 transition-colors hover:bg-accent/30",children:[l("span",{"aria-hidden":"true",className:N("-ms-3 h-3 w-0.5 shrink-0 self-center",j?"bg-destructive":"bg-transparent")}),g("span",{className:"w-44 shrink-0 font-mono text-[10px] tracking-widest text-muted-foreground/70 uppercase",children:[a(C)," ",q]}),R!==d.table&&l("span",{className:N("min-w-0 font-mono text-[13px]",j?"text-destructive":"text-foreground"),children:R}),j&&l("span",{className:"ms-auto shrink-0 font-mono text-[10px] tracking-widest text-destructive uppercase",children:a("breaking")})]},`${y.type}-${y.summary}`)})})]},d.table)})})]})]})},me=t=>N("-mb-px border-b-2 px-3 py-2.5 font-mono text-[11px] tracking-wider uppercase transition-colors outline-none","hover:bg-accent/40 focus-visible:bg-accent/40",t?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"),je=t=>{const e=w(11),{initialShardKey:a}=t,n=M(),[s,o]=D("diagram");let i;e[0]!==s?(i=(p,b,h,f)=>g("button",{"aria-selected":s===p,className:me(s===p),"data-testid":h,onClick:()=>{o(p)},role:"tab",type:"button",children:[b,f!==void 0&&l("span",{className:"ms-2 tabular-nums text-muted-foreground/70",children:f})]}),e[0]=s,e[1]=i):i=e[1];const r=i;let c;e[2]!==n||e[3]!==r?(c=g("div",{className:"flex shrink-0 items-center gap-1 border-b border-border px-3","data-testid":"mg-panes",role:"tablist",children:[r("diagram",n("Diagram"),"mg-pane-diagram"),r("changes",n("Changes"),"mg-pane-changes"),r("data",n("Data migrations"),"mg-pane-data")]}),e[2]=n,e[3]=r,e[4]=c):c=e[4];let u;e[5]!==a||e[6]!==s?(u=l("div",{className:"flex min-h-0 flex-1 flex-col",children:s==="data"?l("div",{className:"min-h-0 flex-1 overflow-y-auto px-4",children:l(E,{initialShardKey:a})}):l(ce,{pane:s,shardKey:a})}),e[5]=a,e[6]=s,e[7]=u):u=e[7];let m;return e[8]!==c||e[9]!==u?(m=g("div",{className:"flex min-h-0 flex-1 flex-col pt-4","data-testid":"lunora-migrations-route",children:[c,u]}),e[8]=c,e[9]=u,e[10]=m):m=e[10],m};export{je as MigrationsRoutePanel};
1
+ import{c as w}from"react/compiler-runtime";import{useMemo as O,useState as D}from"react";import{useT as q}from"../packem_shared/DEFAULT_LOCALE-BZ4NojpD.js";import{c as N}from"../packem_shared/utils-bhneXptQ.js";import{MigrationsPanel as J}from"../packem_shared/MigrationsPanel-BAnvY79E.js";import{useNavigate as E,useSearch as U}from"@tanstack/react-router";import{U as H}from"../packem_shared/error-alert-_2q2VtVG.js";import{E as P}from"../packem_shared/empty-state-Cg7t_8qu.js";import{N as S}from"../packem_shared/use-admin-query-CnnyWJXM.js";import{ADMIN_FUNCTIONS as I}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{i as V,f as W}from"../packem_shared/internal-zkEvTqy8.js";import{S as _}from"../packem_shared/schema-diagram-GVgnLWTf.js";import{jsx as l,jsxs as g}from"react/jsx-runtime";const k=t=>typeof t=="object"&&t!==null,z=t=>k(t)&&k(t.fields)&&k(t.indexes)&&k(t.relations)&&typeof t.shardMode=="string",B=t=>{if(t===void 0||t.trim()==="")return{status:"absent"};let e;try{e=JSON.parse(t)}catch(a){return{error:`baseline is not valid JSON: ${a instanceof Error?a.message:String(a)}`,status:"invalid"}}if(!k(e)||e.version!==1||!k(e.tables))return{error:`baseline is malformed or written by an incompatible version (expected version ${String(1)})`,status:"invalid"};for(const[a,n]of Object.entries(e.tables))if(!z(n))return{error:`baseline table "${a}" has an invalid structure`,status:"invalid"};return{snapshot:{jurisdiction:typeof e.jurisdiction=="string"?e.jurisdiction:void 0,migrationIds:Array.isArray(e.migrationIds)?e.migrationIds:[],tables:e.tables,version:1},status:"ok"}},L=(t,e)=>t.unique===e.unique&&t.fields.length===e.fields.length&&t.fields.every((a,n)=>a===e.fields[n]),Q=(t,e,a,n)=>{const s=[];return a.kind!==n.kind&&s.push({severity:"breaking",summary:`field ${t}.${e} changed type: ${a.kind} → ${n.kind} — add a data migration to convert existing values`,table:t,scope:"table",type:"changedFieldKind"}),a.optional&&!n.optional?s.push({severity:"breaking",summary:`field ${t}.${e} became required — rows missing it would be invalid; add a data migration to backfill it`,table:t,scope:"table",type:"fieldOptionalToRequired"}):!a.optional&&n.optional&&s.push({scope:"table",severity:"safe",summary:`field ${t}.${e} became optional`,table:t,type:"fieldRequiredToOptional"}),s},G=(t,e,a)=>a.optional?{scope:"table",severity:"safe",summary:`added optional field ${t}.${e}`,table:t,type:"addedOptionalField"}:{severity:"breaking",summary:`added required field ${t}.${e} — existing rows have no value; add a data migration to backfill it`,table:t,scope:"table",type:"addedRequiredField"},X=(t,e,a,n)=>{for(const[s,o]of Object.entries(a.fields)){const i=e.fields[s];i===void 0?n.push(G(t,s,o)):n.push(...Q(t,s,i,o))}for(const s of Object.keys(e.fields))a.fields[s]===void 0&&n.push({severity:"breaking",summary:`removed field ${t}.${s} — add a data migration if stored data must be cleaned up`,table:t,scope:"table",type:"removedField"})},Y=(t,e,a,n)=>{for(const[s,o]of Object.entries(a.indexes)){const i=e.indexes[s];if(i===void 0){n.push({scope:"table",severity:"safe",summary:`added index ${s} on ${t}`,table:t,type:"addedIndex"});continue}L(i,o)||n.push({severity:"breaking",summary:`index ${s} on ${t} changed shape — a query may have relied on the old index`,table:t,scope:"table",type:"changedIndex"})}for(const s of Object.keys(e.indexes))a.indexes[s]===void 0&&n.push({severity:"breaking",summary:`removed index ${s} on ${t} — a query that used \`.withIndex("${s}")\` would break`,table:t,scope:"table",type:"removedIndex"})},Z=(t,e,a,n)=>{for(const s of Object.keys(a.relations))e.relations[s]===void 0&&n.push({scope:"schema",severity:"safe",summary:`added relation ${t}.${s}`,table:t,type:"addedRelation"});for(const s of Object.keys(e.relations))a.relations[s]===void 0&&n.push({scope:"schema",severity:"breaking",summary:`removed relation ${t}.${s}`,table:t,type:"removedRelation"})},ee=(t,e,a,n)=>{e.shardMode!==a.shardMode&&n.push({severity:"breaking",summary:`table ${t} changed shard mode: ${e.shardMode} → ${a.shardMode} — its physical storage moves; add a data migration / re-shard plan`,table:t,scope:"table",type:"changedShardMode"}),X(t,e,a,n),Y(t,e,a,n),Z(t,e,a,n)},te=(t,e)=>{const a=[],n=t?.tables??{};for(const[s,o]of Object.entries(e.tables)){const i=n[s];if(i===void 0){a.push({scope:"table",severity:"safe",summary:`added table ${s}`,table:s,type:"addedTable"});continue}ee(s,i,o,a)}for(const s of Object.keys(n))e.tables[s]===void 0&&a.push({scope:"table",severity:"breaking",summary:`removed table ${s} — add a data migration if its data must be archived/cleaned up`,table:s,type:"removedTable"});if(t!==void 0&&t.jurisdiction!==e.jurisdiction){const s=t.jurisdiction??"(none)",o=e.jurisdiction??"(none)";a.push({scope:"schema",severity:"breaking",summary:`Durable Object jurisdiction changed from ${s} to ${o} — this re-homes every DO and strands all existing shard, scheduler, and session-DO data in the old region (no in-place migration; export then import to move it). Revert the change, or override the gate to proceed intentionally.`,type:"changedJurisdiction"})}return{changes:a}},T=t=>Object.entries(t.fields).map(([e,a])=>({name:e,optional:a.optional,ref:Object.values(t.relations).find(n=>n.field===e&&n.kind==="one")?.table,type:a.kind})),F=(t,e)=>{const a={},n=t?.fields??{},s=e?.fields??{};for(const[o,i]of Object.entries(s)){const r=n[o];r===void 0?a[o]=t===void 0?"unchanged":"added":a[o]=r.kind===i.kind&&r.optional===i.optional?"unchanged":"changed"}for(const o of Object.keys(n))s[o]===void 0&&(a[o]="removed");return a},ae=(t,e)=>{const{changes:a}=te(t,e),n=new Set(a.filter(i=>i.scope==="table"&&i.table!==void 0).map(i=>i.table)),s=[],o=(i,r)=>i?"added":n.has(r)?"changed":"context";for(const[i,r]of Object.entries(e.tables)){const c=t?.tables[i],u=o(c===void 0,i);s.push({columns:T(r),fieldStatus:F(c,r),name:i,shardMode:r.shardMode,status:u})}for(const[i,r]of Object.entries(t?.tables??{}))e.tables[i]===void 0&&s.push({columns:T(r),fieldStatus:F(r,void 0),name:i,shardMode:r.shardMode,status:"removed"});return s.sort((i,r)=>i.name.localeCompare(r.name)),{breakingCount:a.filter(i=>i.severity==="breaking").length,changes:a,tables:s}},K=t=>{const e=B(t);return e.status==="ok"?e.snapshot:void 0},ne={added:"ring-2 ring-emerald-500/60",changed:"ring-2 ring-amber-500/70",context:"opacity-55",removed:"opacity-70 ring-2 ring-destructive/60"},se=t=>t==="global"?"global":"shard",ie=t=>{const e=w(24),{appliedAt:a,hash:n,onSelect:s,selected:o,seq:i}=t,r=o?"border-s-primary bg-accent/60 text-foreground":"border-s-transparent text-muted-foreground hover:bg-accent/30 hover:text-foreground";let c;e[0]!==r?(c=N("flex w-full flex-col items-start gap-1 border-s-2 px-4 py-3 text-start outline-none transition-colors",r),e[0]=r,e[1]=c):c=e[1];const u=`sh-version-${n}`;let m;e[2]!==n||e[3]!==s?(m=()=>{s(n)},e[2]=n,e[3]=s,e[4]=m):m=e[4];let p;e[5]!==i?(p=g("span",{className:"font-mono text-[13px] tabular-nums",children:["v",i]}),e[5]=i,e[6]=p):p=e[6];let b;e[7]!==n?(b=n.slice(0,7),e[7]=n,e[8]=b):b=e[8];let h;e[9]!==b?(h=l("span",{className:"ms-auto font-mono text-[10px] tracking-wider text-muted-foreground/70 uppercase",children:b}),e[9]=b,e[10]=h):h=e[10];let f;e[11]!==p||e[12]!==h?(f=g("span",{className:"flex w-full items-baseline gap-2",children:[p,h]}),e[11]=p,e[12]=h,e[13]=f):f=e[13];let v;e[14]!==a?(v=V(a),e[14]=a,e[15]=v):v=e[15];let x;e[16]!==v?(x=l("span",{className:"font-mono text-[10px] tracking-wide text-muted-foreground/70",children:v}),e[16]=v,e[17]=x):x=e[17];let d;return e[18]!==x||e[19]!==c||e[20]!==u||e[21]!==m||e[22]!==f?(d=l("li",{children:g("button",{className:c,"data-testid":u,onClick:m,type:"button",children:[f,x]})}),e[18]=x,e[19]=c,e[20]=u,e[21]=m,e[22]=f,e[23]=d):d=e[23],d},re=t=>{const e=w(26),{breaking:a,count:n,first:s}=t,o=q();if(s){let h;e[0]!==n?(h=l("span",{className:"text-3xl leading-none font-light tracking-tight tabular-nums",children:n}),e[0]=n,e[1]=h):h=e[1];let f;e[2]!==o?(f=o("tables"),e[2]=o,e[3]=f):f=e[3];let v;e[4]!==f?(v=l("span",{className:"font-mono text-[11px] tracking-widest text-muted-foreground uppercase",children:f}),e[4]=f,e[5]=v):v=e[5];let x;return e[6]!==h||e[7]!==v?(x=g("div",{className:"flex items-baseline gap-3","data-testid":"sh-summary",children:[h,v]}),e[6]=h,e[7]=v,e[8]=x):x=e[8],x}const i=a>0&&"text-destructive";let r;e[9]!==i?(r=N("text-3xl leading-none font-light tracking-tight tabular-nums",i),e[9]=i,e[10]=r):r=e[10];let c;e[11]!==n||e[12]!==r?(c=l("span",{className:r,children:n}),e[11]=n,e[12]=r,e[13]=c):c=e[13];let u;e[14]!==n||e[15]!==o?(u=o(n===1?"change":"changes"),e[14]=n,e[15]=o,e[16]=u):u=e[16];let m;e[17]!==u?(m=l("span",{className:"font-mono text-[11px] tracking-widest text-muted-foreground uppercase",children:u}),e[17]=u,e[18]=m):m=e[18];let p;e[19]!==a||e[20]!==o?(p=a>0&&g("span",{className:"font-mono text-[11px] tracking-widest text-destructive uppercase",children:["· ",o("{count} breaking",{count:a})]}),e[19]=a,e[20]=o,e[21]=p):p=e[21];let b;return e[22]!==c||e[23]!==m||e[24]!==p?(b=g("div",{className:"flex items-baseline gap-3","data-testid":"sh-summary",children:[c,m,p]}),e[22]=c,e[23]=m,e[24]=p,e[25]=b):b=e[25],b},A={addedIndex:{action:"added",kind:"index"},addedOptionalField:{action:"added",kind:"field?"},addedRelation:{action:"added",kind:"relation"},addedRequiredField:{action:"added",kind:"field"},addedTable:{action:"added",kind:"table"},changedFieldKind:{action:"changed",kind:"field kind"},changedIndex:{action:"changed",kind:"index"},changedJurisdiction:{action:"changed",kind:"jurisdiction"},changedShardMode:{action:"changed",kind:"shard mode"},fieldOptionalToRequired:{action:"changed",kind:"field → required"},fieldRequiredToOptional:{action:"changed",kind:"field → optional"},removedField:{action:"removed",kind:"field"},removedIndex:{action:"removed",kind:"index"},removedRelation:{action:"removed",kind:"relation"},removedTable:{action:"removed",kind:"table"}},oe=(t,e)=>{const a=`${A[t.type].action} ${e} `;return t.summary.startsWith(a)?t.summary.slice(a.length):t.summary},de=t=>{const e=new Map;for(const n of t){const s=n.table??"",o=e.get(s);o===void 0?e.set(s,[n]):o.push(n)}const a=[...e].map(([n,s])=>({changes:s,table:n}));return[...a.filter(n=>n.table!==""),...a.filter(n=>n.table==="")]},le=t=>{const e=w(2),{children:a}=t;let n;return e[0]!==a?(n=l("div",{className:"px-4 pt-4 pb-2 font-mono text-[10px] tracking-widest text-muted-foreground/70 uppercase",children:a}),e[0]=a,e[1]=n):n=e[1],n},ce=({pane:t,shardKey:e=""})=>{const a=q(),n=E(),s=U({strict:!1}).version,o=d=>{W(n({search:{version:d},to:"/migrations"}))},i=S(I.schemaHistory,{},{shardKey:e}),r=i.data?.versions??[],c=s!==void 0&&r.some(d=>d.hash===s)?s:r[0]?.hash,u=r.findIndex(d=>d.hash===c),m=u===-1?void 0:r[u+1]?.hash,p=S(I.schemaVersion,{hash:c??""},{enabled:c!==void 0,shardKey:e}),b=S(I.schemaVersion,{hash:m??""},{enabled:m!==void 0,shardKey:e}),h=O(()=>{const d=K(p.data?.version?.snapshotJson);if(d!==void 0)return ae(K(b.data?.version?.snapshotJson),d)},[p.data,b.data]),f=O(()=>(h?.tables??[]).map(d=>({columns:d.columns,name:d.name,tier:se(d.shardMode)})),[h]),v=O(()=>{const d={};for(const $ of h?.tables??[])d[$.name]=ne[$.status];return d},[h]);if(i.error!==null)return l(H,{error:i.errorSource,testId:"sh-error"});if(r.length===0)return l(P,{description:a("Each distinct schema shape this shard runs is recorded here, so you can see what changed and when."),testId:"sh-empty",title:a("No schema versions recorded yet.")});const x=h?.changes??[];return g("div",{className:"flex min-h-0 flex-1 gap-4","data-testid":"lunora-schema-history",children:[g("nav",{className:"flex w-56 shrink-0 flex-col overflow-hidden border-e border-border","data-testid":"sh-timeline-rail",children:[l(le,{children:a("Schema versions")}),l("ul",{className:"min-h-0 flex-1 overflow-y-auto","data-testid":"sh-timeline",children:r.map(d=>l(ie,{appliedAt:d.appliedAt,hash:d.hash,onSelect:o,selected:d.hash===c,seq:d.seq},d.hash))})]}),g("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col gap-4 pe-1 pt-4",children:[l(re,{breaking:h?.breakingCount??0,count:m===void 0?f.length:x.length,first:m===void 0}),t==="diagram"?l("div",{className:"flex min-h-0 flex-1 flex-col",children:l(_,{fill:!0,nodeClasses:v,tables:f,testIdPrefix:"sh"})}):l("div",{className:"min-h-0 flex-1 overflow-y-auto","data-testid":"sh-changes",children:de(x).map(d=>{const $=(h?.tables??[]).find(y=>y.name===d.table);return g("section",{className:"mb-6",children:[g("div",{className:"flex items-baseline gap-3 border-b border-border/60 pb-1.5",children:[l("span",{className:"font-mono text-[13px] text-foreground",children:d.table===""?a("schema"):d.table}),$!==void 0&&l("span",{className:"font-mono text-[10px] tracking-widest text-muted-foreground/70 tabular-nums uppercase",children:a("{count} columns",{count:$.columns.length})}),d.changes.length>1&&l("span",{className:"ms-auto font-mono text-[10px] tracking-widest text-muted-foreground/70 tabular-nums",children:d.changes.length})]}),l("ul",{children:d.changes.map(y=>{const{action:C,kind:M}=A[y.type],j=y.severity==="breaking",R=oe(y,M);return g("li",{className:"flex items-baseline gap-4 border-s-2 py-1.5 ps-3 transition-colors hover:bg-accent/30",children:[l("span",{"aria-hidden":"true",className:N("-ms-3 h-3 w-0.5 shrink-0 self-center",j?"bg-destructive":"bg-transparent")}),g("span",{className:"w-44 shrink-0 font-mono text-[10px] tracking-widest text-muted-foreground/70 uppercase",children:[a(C)," ",M]}),R!==d.table&&l("span",{className:N("min-w-0 font-mono text-[13px]",j?"text-destructive":"text-foreground"),children:R}),j&&l("span",{className:"ms-auto shrink-0 font-mono text-[10px] tracking-widest text-destructive uppercase",children:a("breaking")})]},`${y.type}-${y.summary}`)})})]},d.table)})})]})]})},me=t=>N("-mb-px border-b-2 px-3 py-2.5 font-mono text-[11px] tracking-wider uppercase transition-colors outline-none","hover:bg-accent/40 focus-visible:bg-accent/40",t?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"),je=t=>{const e=w(11),{initialShardKey:a}=t,n=q(),[s,o]=D("diagram");let i;e[0]!==s?(i=(p,b,h,f)=>g("button",{"aria-selected":s===p,className:me(s===p),"data-testid":h,onClick:()=>{o(p)},role:"tab",type:"button",children:[b,f!==void 0&&l("span",{className:"ms-2 tabular-nums text-muted-foreground/70",children:f})]}),e[0]=s,e[1]=i):i=e[1];const r=i;let c;e[2]!==n||e[3]!==r?(c=g("div",{className:"flex shrink-0 items-center gap-1 border-b border-border px-3","data-testid":"mg-panes",role:"tablist",children:[r("diagram",n("Diagram"),"mg-pane-diagram"),r("changes",n("Changes"),"mg-pane-changes"),r("data",n("Data migrations"),"mg-pane-data")]}),e[2]=n,e[3]=r,e[4]=c):c=e[4];let u;e[5]!==a||e[6]!==s?(u=l("div",{className:"flex min-h-0 flex-1 flex-col",children:s==="data"?l("div",{className:"min-h-0 flex-1 overflow-y-auto px-4",children:l(J,{initialShardKey:a})}):l(ce,{pane:s,shardKey:a})}),e[5]=a,e[6]=s,e[7]=u):u=e[7];let m;return e[8]!==c||e[9]!==u?(m=g("div",{className:"flex min-h-0 flex-1 flex-col pt-4","data-testid":"lunora-migrations-route",children:[c,u]}),e[8]=c,e[9]=u,e[10]=m):m=e[10],m};export{je as default};