@lunora/studio 1.0.0-alpha.117 → 1.0.0-alpha.119

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 (120) hide show
  1. package/dist/index.d.ts +3 -2
  2. package/dist/index.js +1 -1
  3. package/dist/mount.js +1 -1
  4. package/dist/packem_chunks/AdvisorHealthPanel.js +1 -1
  5. package/dist/packem_chunks/ApiTab.js +1 -1
  6. package/dist/packem_chunks/AuditPanel.js +1 -1
  7. package/dist/packem_chunks/ExportImportPanel.js +1 -1
  8. package/dist/packem_chunks/FileBrowser.js +1 -1
  9. package/dist/packem_chunks/FunctionRunner.js +1 -1
  10. package/dist/packem_chunks/FunctionStatsPanel.js +1 -1
  11. package/dist/packem_chunks/HealthPanel.js +1 -1
  12. package/dist/packem_chunks/InsightsPanel.js +1 -1
  13. package/dist/packem_chunks/LogsPanel.js +1 -1
  14. package/dist/packem_chunks/MailPanel.js +1 -1
  15. package/dist/packem_chunks/MetricsPanel.js +1 -1
  16. package/dist/packem_chunks/NotificationsPanel.js +1 -1
  17. package/dist/packem_chunks/PitrPanel.js +1 -1
  18. package/dist/packem_chunks/SchemaViewer.js +1 -1
  19. package/dist/packem_chunks/SecurityAdvisorPanel.js +1 -1
  20. package/dist/packem_chunks/SettingsPanel.js +1 -1
  21. package/dist/packem_chunks/SqlEditorPanel.js +1 -1
  22. package/dist/packem_chunks/TableEditor.js +1 -1
  23. package/dist/packem_chunks/agents-panel.js +1 -1
  24. package/dist/packem_chunks/auth-audit-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/evals-panel.js +1 -1
  28. package/dist/packem_chunks/fanout-panel.js +1 -1
  29. package/dist/packem_chunks/flags-panel.js +1 -1
  30. package/dist/packem_chunks/issues-panel.js +1 -1
  31. package/dist/packem_chunks/kv-browser.js +1 -1
  32. package/dist/packem_chunks/migrations-route.js +1 -1
  33. package/dist/packem_chunks/payments-panel.js +1 -1
  34. package/dist/packem_chunks/permissions-panel.js +1 -1
  35. package/dist/packem_chunks/queues-panel.js +1 -1
  36. package/dist/packem_chunks/reactors-panel.js +1 -0
  37. package/dist/packem_chunks/rls-panel.js +1 -1
  38. package/dist/packem_chunks/storage-rules-panel.js +1 -1
  39. package/dist/packem_chunks/subscriptions-panel.js +1 -1
  40. package/dist/packem_chunks/traces-panel.js +1 -1
  41. package/dist/packem_chunks/workflows-panel.js +1 -1
  42. package/dist/packem_shared/ADMIN_FUNCTIONS-B6z7VLYt.js +1 -0
  43. package/dist/packem_shared/{ApiDocsPanel-C_dZt4ve.js → ApiDocsPanel-BMzLPgvv.js} +1 -1
  44. package/dist/packem_shared/{DataBrowser-BPCr2f8V.js → DataBrowser-C68K5QHO.js} +1 -1
  45. package/dist/packem_shared/{HomePanel-B8U_LJkK.js → HomePanel-B-tcMcTZ.js} +1 -1
  46. package/dist/packem_shared/{MigrationsPanel-CF73xHke.js → MigrationsPanel-CLRWwPyL.js} +1 -1
  47. package/dist/packem_shared/{Studio-RFVDC2sC.js → Studio-BYdUxnM5.js} +1 -1
  48. package/dist/packem_shared/{StudioApp-jTW-QnDo.js → StudioApp-Bxmtp-Fi.js} +1 -1
  49. package/dist/packem_shared/{home-panel-DywiFhDs.js → home-panel-ecz6-nHV.js} +1 -1
  50. package/dist/packem_shared/studio-Cvdwfzxm.js +2 -0
  51. package/dist/packem_shared/{use-sql-assistant-DFO2i-n-.js → use-sql-assistant-CXgVX_PP.js} +1 -1
  52. package/dist/standalone/{chunk-H2WBIULE.js → chunk-27IF4PXG.js} +1 -1
  53. package/dist/standalone/{chunk-K5XFXW6D.js → chunk-2F6FYL5O.js} +1 -1
  54. package/dist/standalone/{chunk-KEMHRM53.js → chunk-2RASQG3R.js} +1 -1
  55. package/dist/standalone/{chunk-SCXAZ74Y.js → chunk-2VLBFSIX.js} +1 -1
  56. package/dist/standalone/{chunk-I4XA3BBM.js → chunk-4DJQV5UA.js} +1 -1
  57. package/dist/standalone/{chunk-2WAWYLUP.js → chunk-4LVLLM6B.js} +1 -1
  58. package/dist/standalone/{chunk-FEW2WNS7.js → chunk-4PVSXT34.js} +1 -1
  59. package/dist/standalone/{chunk-BBXNPD22.js → chunk-4Y2QHI65.js} +1 -1
  60. package/dist/standalone/{chunk-ZNNKKJRT.js → chunk-5COHJLQF.js} +1 -1
  61. package/dist/standalone/{chunk-W5CYX66B.js → chunk-5HICO276.js} +1 -1
  62. package/dist/standalone/{chunk-FKNT7GEB.js → chunk-5JF2HAU4.js} +1 -1
  63. package/dist/standalone/chunk-5QAT5NQ4.js +1 -0
  64. package/dist/standalone/{chunk-CZK4GZ5C.js → chunk-6J5TEYI5.js} +1 -1
  65. package/dist/standalone/{chunk-F5YULDNX.js → chunk-6KJLNWPJ.js} +1 -1
  66. package/dist/standalone/{chunk-2P6N5XES.js → chunk-6QKKYBML.js} +1 -1
  67. package/dist/standalone/{chunk-P2GOC5GL.js → chunk-7CVIN6KU.js} +1 -1
  68. package/dist/standalone/{chunk-ZIYO55T2.js → chunk-A44VDLY3.js} +1 -1
  69. package/dist/standalone/{chunk-A7WKYEQ4.js → chunk-ATGYWQUI.js} +1 -1
  70. package/dist/standalone/{chunk-H4SLAZAN.js → chunk-B3BKR5ZW.js} +1 -1
  71. package/dist/standalone/{chunk-RUIWLLAI.js → chunk-BKW7FMAU.js} +1 -1
  72. package/dist/standalone/{chunk-JACBQWRB.js → chunk-BYJZGWWY.js} +1 -1
  73. package/dist/standalone/{chunk-S6UHG354.js → chunk-CFQQSG6L.js} +1 -1
  74. package/dist/standalone/{chunk-SM764GPA.js → chunk-D3ZLKFO4.js} +1 -1
  75. package/dist/standalone/{chunk-LFEDP3Y6.js → chunk-D52S7TOI.js} +1 -1
  76. package/dist/standalone/{chunk-SLOB2B2T.js → chunk-DYKGLIBC.js} +1 -1
  77. package/dist/standalone/chunk-DZGOHOOE.js +1 -0
  78. package/dist/standalone/{chunk-O2VDNK4B.js → chunk-FJ6G6FNE.js} +1 -1
  79. package/dist/standalone/{chunk-RND4232Z.js → chunk-G3NGXYJY.js} +1 -1
  80. package/dist/standalone/{chunk-PLI4LCPS.js → chunk-GTEXP4P3.js} +1 -1
  81. package/dist/standalone/{chunk-6UOC4ZJL.js → chunk-J2GQE4PW.js} +1 -1
  82. package/dist/standalone/{chunk-KQ6HYQCE.js → chunk-JIPVSPSG.js} +1 -1
  83. package/dist/standalone/{chunk-TNVZJKGN.js → chunk-KPQROFH5.js} +1 -1
  84. package/dist/standalone/{chunk-TNFIYZPY.js → chunk-KWGHNORP.js} +1 -1
  85. package/dist/standalone/{chunk-2UWKGSEA.js → chunk-L6ATKZKO.js} +1 -1
  86. package/dist/standalone/{chunk-DC5AAWSA.js → chunk-P4QIDUCY.js} +1 -1
  87. package/dist/standalone/{chunk-CYLI7GO3.js → chunk-P54YTPHL.js} +1 -1
  88. package/dist/standalone/{chunk-6MRGARL5.js → chunk-PRWFHSHC.js} +1 -1
  89. package/dist/standalone/{chunk-LMAI2ESY.js → chunk-PS66CRK5.js} +1 -1
  90. package/dist/standalone/{chunk-3IXTF53Q.js → chunk-QDGAB4R2.js} +1 -1
  91. package/dist/standalone/{chunk-DEGERMXH.js → chunk-QKN5EHEF.js} +1 -1
  92. package/dist/standalone/{chunk-CE7WVPLK.js → chunk-QLG2EJU3.js} +1 -1
  93. package/dist/standalone/{chunk-MDWJRPZG.js → chunk-QXLU6YPU.js} +1 -1
  94. package/dist/standalone/{chunk-BE76GAFE.js → chunk-R3G55P4J.js} +1 -1
  95. package/dist/standalone/chunk-R4HRS232.js +1 -0
  96. package/dist/standalone/{chunk-22664OOM.js → chunk-R52YOHVU.js} +1 -1
  97. package/dist/standalone/{chunk-R3VDUL6F.js → chunk-RK5XWYUL.js} +1 -1
  98. package/dist/standalone/{chunk-7W6TQTW7.js → chunk-RSG2DVHH.js} +1 -1
  99. package/dist/standalone/{chunk-WSNFV7ZW.js → chunk-T5SC5RAD.js} +1 -1
  100. package/dist/standalone/{chunk-EEIKRCWD.js → chunk-TCKQ4E5Y.js} +1 -1
  101. package/dist/standalone/{chunk-TYOIBCR6.js → chunk-UBT2FIU5.js} +1 -1
  102. package/dist/standalone/{chunk-VKQZAEUQ.js → chunk-VDSFYFDH.js} +1 -1
  103. package/dist/standalone/{chunk-V2KCESII.js → chunk-W3PCX3TU.js} +1 -1
  104. package/dist/standalone/{chunk-J7GGD2O2.js → chunk-WFABZPAK.js} +1 -1
  105. package/dist/standalone/{chunk-VVB7SOO7.js → chunk-WIFYD4A6.js} +1 -1
  106. package/dist/standalone/{chunk-CU7KGPAQ.js → chunk-WYSR5F77.js} +1 -1
  107. package/dist/standalone/{chunk-FRSTZO5P.js → chunk-XFU6YBYL.js} +1 -1
  108. package/dist/standalone/{chunk-N7WIVIP2.js → chunk-XRC7KEEN.js} +1 -1
  109. package/dist/standalone/{chunk-IZ6AVENL.js → chunk-XTNSQYXW.js} +1 -1
  110. package/dist/standalone/chunk-XUX7B54Z.js +1 -0
  111. package/dist/standalone/{chunk-VTPKVALV.js → chunk-YN2KHW3B.js} +1 -1
  112. package/dist/standalone/chunk-YTYRZTG6.js +11 -0
  113. package/dist/standalone/studio.js +1 -1
  114. package/package.json +5 -5
  115. package/dist/packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js +0 -1
  116. package/dist/packem_shared/studio-BdV57x3O.js +0 -2
  117. package/dist/standalone/chunk-22WJHOC4.js +0 -11
  118. package/dist/standalone/chunk-OQS4HFKC.js +0 -1
  119. package/dist/standalone/chunk-TOZK5WX3.js +0 -1
  120. package/dist/standalone/chunk-VDW32UET.js +0 -1
@@ -1 +1 @@
1
- import{c as xe}from"react/compiler-runtime";import{findIssueSolution as we,flattenHint as Ee}from"@lunora/errors";import{useLunora as Ne}from"@lunora/react";import{useState as ne}from"react";import{L as Te}from"../packem_shared/live-status-Bf7rR8o8.js";import{ShardInput as $e}from"../packem_shared/ShardInput-CdawpUiS.js";import{B as pe}from"../packem_shared/badge-cAk9Di1Q.js";import{B as oe}from"../packem_shared/button-BOPLD1un.js";import{C as Ae,a as Ce}from"../packem_shared/card-BGlQzQY-.js";import{E as _e}from"../packem_shared/empty-state-B939z6K2.js";import{I as ke}from"../packem_shared/input-CY5W3wzv.js";import{S as Me,a as Re,b as Ke,c as be,d as Le}from"../packem_shared/select-BPISLTcv.js";import{T as Ve,a as Oe,b as ye,c as F,d as Ue,e as B}from"../packem_shared/table-BMsuYFhk.js";import{u as Be}from"../packem_shared/use-admin-query-DV9xmFl8.js";import{u as Fe}from"../packem_shared/use-async-submit-C9xXjXWX.js";import{u as ze}from"../packem_shared/use-shard-key-BsP3o5wT.js";import{useT as ve}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{ADMIN_FUNCTIONS as ie}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{i as He,f as re,c as de,d as Ie,b as je}from"../packem_shared/internal-7bgd8inO.js";import{jsx as s,jsxs as w,Fragment as De}from"react/jsx-runtime";const ge="none",qe=["all","open","resolved","ignored"],Ge=["critical","high","medium","low"],Pe=de(ie.resolveIssue),We=de(ie.ignoreIssue),Se=de(ie.assignIssue),Ye=de(ie.setIssueSeverity),Qe=de(ie.explainIssue),Xe=n=>Array.isArray(n?.issues)?n.issues:[],Je=n=>n==="resolved"?"success":n==="ignored"?"secondary":"warning",Ze=n=>n==="critical"?"destructive":n==="high"?"warning":n==="medium"?"info":"secondary",et=n=>{const e=xe(44),{expanded:h,issue:t,shardKey:E}=n,i=Ne(),r=ve(),[a,o]=ne(void 0),{busy:R,error:A,run:L}=Fe();let C;e[0]!==i||e[1]!==t||e[2]!==L||e[3]!==E?(C=()=>{o(void 0),L(async()=>{const f={culprit:t.culprit,sampleMessage:t.sampleMessage,title:t.title},I=await i.query(Qe,f,Ie(E));o(I)})},e[0]=i,e[1]=t,e[2]=L,e[3]=E,e[4]=C):C=e[4];const K=C;if(!h)return null;let T;if(e[5]!==t.sampleMessage){const f=we(t.sampleMessage);T=f===void 0?void 0:Ee(f.body),e[5]=t.sampleMessage,e[6]=T}else T=e[6];const _=T,M=`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 g;e[9]!==r?(g=r("Suggested fix"),e[9]=r,e[10]=g):g=e[10];let $;e[11]!==g?($=s("div",{className:"text-xs font-medium text-muted-foreground",children:g}),e[11]=g,e[12]=$):$=e[12];let x;e[13]!==_||e[14]!==t.hash||e[15]!==r?(x=_===void 0?s("p",{className:"mt-1 text-sm text-muted-foreground","data-testid":`issues-hint-empty-${t.hash}`,children:r("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]=r,e[16]=x):x=e[16];let y;e[17]!==$||e[18]!==x?(y=w("div",{children:[$,x]}),e[17]=$,e[18]=x,e[19]=y):y=e[19];const S=`issues-explain-${t.hash}`;let N;e[20]!==R||e[21]!==r?(N=r(R?"Explaining…":"Explain in plain language"),e[20]=R,e[21]=r,e[22]=N):N=e[22];let u;e[23]!==R||e[24]!==K||e[25]!==N||e[26]!==S?(u=s("div",{children:s(oe,{"data-testid":S,disabled:R,onClick:K,size:"sm",type:"button",variant:"outline",children:N})}),e[23]=R,e[24]=K,e[25]=N,e[26]=S,e[27]=u):u=e[27];let p;e[28]!==A||e[29]!==t.hash?(p=A!==null&&s("p",{className:"text-xs text-destructive","data-testid":`issues-explain-error-${t.hash}`,role:"alert",children:A}),e[28]=A,e[29]=t.hash,e[30]=p):p=e[30];let m;e[31]!==a||e[32]!==t.hash||e[33]!==r?(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"?r("No AI binding is configured. Wire an AI binding to enable plain-language explanations — the suggested fix above is always available."):r("The AI model could not explain this error right now. The suggested fix above still applies.")}):w("div",{"data-testid":`issues-explanation-${t.hash}`,children:[s("div",{className:"text-xs font-medium text-muted-foreground",children:r("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:r("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:r("Generated by {model}",{model:a.model})})]})),e[31]=a,e[32]=t.hash,e[33]=r,e[34]=m):m=e[34];let c;e[35]!==u||e[36]!==p||e[37]!==m||e[38]!==d||e[39]!==y?(c=s(B,{className:"bg-muted/30",colSpan:7,children:w("div",{className:"flex flex-col gap-3 py-1",children:[d,y,u,p,m]})}),e[35]=u,e[36]=p,e[37]=m,e[38]=d,e[39]=y,e[40]=c):c=e[40];let b;return e[41]!==c||e[42]!==M?(b=s(ye,{"data-testid":M,children:c}),e[41]=c,e[42]=M,e[43]=b):b=e[43],b},tt=n=>{const e=xe(119),{busy:h,issue:t,rowError:E,runTriage:i,shardKey:r}=n,a=ve(),[o,R]=ne(!1);let A;e[0]===Symbol.for("react.memo_cache_sentinel")?(A=()=>{R(st)},e[0]=A):A=e[0];const L=A;let C;e[1]!==t.hash||e[2]!==i?(C=ae=>{const he=ae===null||ae===ge?null:ae;re(i(t.hash,Ye,{severity:he}))},e[1]=t.hash,e[2]=i,e[3]=C):C=e[3];const K=C;let T;e[4]!==t.hash||e[5]!==i?(T=ae=>{if(ae.key!=="Enter")return;const he=ae.currentTarget.value.trim();re(i(t.hash,Se,{assignee:he===""?null:he}))},e[4]=t.hash,e[5]=i,e[6]=T):T=e[6];const _=T,M=`issues-row-${t.hash}`;let d;e[7]!==a?(d=a("Toggle issue details"),e[7]=a,e[8]=d):d=e[8];const g=`issues-toggle-${t.hash}`,$=`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 y;e[10]!==$?(y=s("svg",{"aria-hidden":"true",className:$,fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,viewBox:"0 0 24 24",children:x}),e[10]=$,e[11]=y):y=e[11];let S;e[12]!==t.title?(S=s("span",{className:"block truncate font-medium",title:t.title,children:t.title}),e[12]=t.title,e[13]=S):S=e[13];let N;e[14]!==t.culprit?(N=s("span",{className:"block truncate font-mono text-xs text-muted-foreground",title:t.culprit,children:t.culprit}),e[14]=t.culprit,e[15]=N):N=e[15];let u;e[16]!==S||e[17]!==N?(u=w("span",{className:"min-w-0",children:[S,N]}),e[16]=S,e[17]=N,e[18]=u):u=e[18];let p;e[19]!==o||e[20]!==u||e[21]!==d||e[22]!==g||e[23]!==y?(p=w("button",{"aria-expanded":o,"aria-label":d,className:"flex w-full items-start gap-2 text-left","data-testid":g,onClick:L,type:"button",children:[y,u]}),e[19]=o,e[20]=u,e[21]=d,e[22]=g,e[23]=y,e[24]=p):p=e[24];let m;e[25]!==t.hash||e[26]!==E?(m=E!==void 0&&s("p",{className:"mt-1 text-xs text-destructive","data-testid":`issues-action-error-${t.hash}`,role:"alert",children:E}),e[25]=t.hash,e[26]=E,e[27]=m):m=e[27];let c;e[28]!==p||e[29]!==m?(c=w(B,{className:"max-w-80",children:[p,m]}),e[28]=p,e[29]=m,e[30]=c):c=e[30];const b=`issues-status-${t.hash}`;let f;e[31]!==t.status?(f=Je(t.status),e[31]=t.status,e[32]=f):f=e[32];let I;e[33]!==t.status||e[34]!==b||e[35]!==f?(I=s(B,{children:s(pe,{"data-testid":b,variant:f,children:t.status})}),e[33]=t.status,e[34]=b,e[35]=f,e[36]=I):I=e[36];const V=t.severity??ge;let l;e[37]!==a?(l=a("Set severity"),e[37]=a,e[38]=l):l=e[38];const le=`issues-severity-${t.hash}`;let O;e[39]!==a?(O=a("—"),e[39]=a,e[40]=O):O=e[40];let v;e[41]!==t.severity||e[42]!==a?(v=t.severity===void 0?s("span",{className:"text-muted-foreground",children:a("—")}):s(pe,{variant:Ze(t.severity),children:t.severity}),e[41]=t.severity,e[42]=a,e[43]=v):v=e[43];let k;e[44]!==O||e[45]!==v?(k=s(Me,{placeholder:O,children:v}),e[44]=O,e[45]=v,e[46]=k):k=e[46];let U;e[47]!==l||e[48]!==le||e[49]!==k?(U=s(Re,{"aria-label":l,className:"h-7 w-[110px]","data-testid":le,children:k}),e[47]=l,e[48]=le,e[49]=k,e[50]=U):U=e[50];let z;e[51]===Symbol.for("react.memo_cache_sentinel")?(z=Ge.map(at),e[51]=z):z=e[51];let H;e[52]!==a?(H=a("Clear"),e[52]=a,e[53]=H):H=e[53];let j;e[54]!==H?(j=w(Ke,{children:[z,s(be,{value:ge,children:H})]}),e[54]=H,e[55]=j):j=e[55];let D;e[56]!==h||e[57]!==K||e[58]!==V||e[59]!==U||e[60]!==j?(D=s(B,{children:w(Le,{disabled:h,onValueChange:K,value:V,children:[U,j]})}),e[56]=h,e[57]=K,e[58]=V,e[59]=U,e[60]=j,e[61]=D):D=e[61];let q;e[62]!==a?(q=a("Assignee"),e[62]=a,e[63]=q):q=e[63];const ue=`issues-assignee-${t.hash}`,me=t.assignee??"",fe=t.assignee??"";let G;e[64]!==a?(G=a("Unassigned"),e[64]=a,e[65]=G):G=e[65];let P;e[66]!==h||e[67]!==_||e[68]!==q||e[69]!==ue||e[70]!==me||e[71]!==fe||e[72]!==G?(P=s(B,{children:s(ke,{"aria-label":q,className:"h-7 w-32","data-testid":ue,defaultValue:me,disabled:h,onKeyDown:_,placeholder:G},fe)}),e[66]=h,e[67]=_,e[68]=q,e[69]=ue,e[70]=me,e[71]=fe,e[72]=G,e[73]=P):P=e[73];let W;e[74]!==t.count?(W=s(B,{className:"text-right",children:s(pe,{variant:"secondary",children:t.count})}),e[74]=t.count,e[75]=W):W=e[75];let Y;e[76]!==t.lastSeen?(Y=He(t.lastSeen),e[76]=t.lastSeen,e[77]=Y):Y=e[77];let Q;e[78]!==Y?(Q=s(B,{className:"text-xs tabular-nums text-muted-foreground",children:Y}),e[78]=Y,e[79]=Q):Q=e[79];let X;e[80]!==h||e[81]!==t.hash||e[82]!==t.status||e[83]!==i||e[84]!==a?(X=t.status!=="resolved"&&s(oe,{"data-testid":`issues-resolve-${t.hash}`,disabled:h,onClick:()=>{re(i(t.hash,Pe,{}))},size:"xs",variant:"outline",children:a("Resolve")}),e[80]=h,e[81]=t.hash,e[82]=t.status,e[83]=i,e[84]=a,e[85]=X):X=e[85];let J;e[86]!==h||e[87]!==t.hash||e[88]!==t.status||e[89]!==i||e[90]!==a?(J=t.status!=="ignored"&&s(oe,{"data-testid":`issues-ignore-${t.hash}`,disabled:h,onClick:()=>{re(i(t.hash,We,{}))},size:"xs",variant:"ghost",children:a("Ignore")}),e[86]=h,e[87]=t.hash,e[88]=t.status,e[89]=i,e[90]=a,e[91]=J):J=e[91];let Z;e[92]!==h||e[93]!==t.assignee||e[94]!==t.hash||e[95]!==t.status||e[96]!==i||e[97]!==a?(Z=t.status!=="open"&&s(oe,{"data-testid":`issues-reopen-${t.hash}`,disabled:h,onClick:()=>{re(i(t.hash,Se,{assignee:t.assignee??null}))},size:"xs",variant:"ghost",children:a("Reopen")}),e[92]=h,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 ee;e[99]!==X||e[100]!==J||e[101]!==Z?(ee=s(B,{className:"text-right",children:w("div",{className:"flex justify-end gap-1",children:[X,J,Z]})}),e[99]=X,e[100]=J,e[101]=Z,e[102]=ee):ee=e[102];let te;e[103]!==c||e[104]!==I||e[105]!==D||e[106]!==P||e[107]!==W||e[108]!==Q||e[109]!==M||e[110]!==ee?(te=w(ye,{"data-testid":M,children:[c,I,D,P,W,Q,ee]}),e[103]=c,e[104]=I,e[105]=D,e[106]=P,e[107]=W,e[108]=Q,e[109]=M,e[110]=ee,e[111]=te):te=e[111];let se;e[112]!==o||e[113]!==t||e[114]!==r?(se=s(et,{expanded:o,issue:t,shardKey:r},t.sampleMessage),e[112]=o,e[113]=t,e[114]=r,e[115]=se):se=e[115];let ce;return e[116]!==te||e[117]!==se?(ce=w(De,{children:[te,se]}),e[116]=te,e[117]=se,e[118]=ce):ce=e[118],ce},Tt=n=>{const e=xe(38),{initialShardKey:h}=n,t=ve(),E=Ne(),{queryShardKey:i,setShardKey:r,shardKey:a}=ze(h),[o,R]=ne("all"),[A,L]=ne(it),[C,K]=ne(lt);let T;e[0]!==o?(T=o==="all"?{}:{status:o},e[0]=o,e[1]=T):T=e[1];let _;e[2]!==i?(_={live:!0,shardKey:i},e[2]=i,e[3]=_):_=e[3];const{data:M,error:d,liveError:g}=Be(ie.getIssues,T,_),$=M!==void 0;let x;if(e[4]!==C||e[5]!==A||e[6]!==E||e[7]!==M||e[8]!==d||e[9]!==g||e[10]!==$||e[11]!==i||e[12]!==r||e[13]!==a||e[14]!==o||e[15]!==t){const y=Xe(M);let S;e[17]!==E||e[18]!==i?(S=async(l,le,O)=>{K(v=>{if(!v.has(l))return v;const k=new Map(v);return k.delete(l),k}),L(v=>new Set(v).add(l));try{await E.query(le,{...O,hash:l},Ie(i))}catch(v){const U=je(v);K(z=>new Map(z).set(l,U))}L(v=>{const k=new Set(v);return k.delete(l),k})},e[17]=E,e[18]=i,e[19]=S):S=e[19];const N=S;let u;e[20]!==t?(u=l=>t(l==="all"?"All":l==="open"?"Open":l==="resolved"?"Resolved":"Ignored"),e[20]=t,e[21]=u):u=e[21];const p=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 c;e[24]!==r||e[25]!==a?(c=s($e,{onChange:r,testId:"issues-shard-input",value:a}),e[24]=r,e[25]=a,e[26]=c):c=e[26];let b;e[27]!==g?(b=s(Te,{message:g,prefix:"issues"}),e[27]=g,e[28]=b):b=e[28];let f;e[29]!==o||e[30]!==p?(f=qe.map(l=>s(oe,{"data-active":o===l?"":void 0,"data-testid":`issues-filter-${l}`,onClick:()=>{R(l)},size:"xs",variant:o===l?"default":"outline",children:p(l)},l)),e[29]=o,e[30]=p,e[31]=f):f=e[31];let I;e[32]!==f?(I=s("div",{className:"ms-auto flex items-center gap-1","data-testid":"issues-status-filter",role:"group",children:f}),e[32]=f,e[33]=I):I=e[33];let V;e[34]!==I||e[35]!==c||e[36]!==b?(V=w("div",{className:"flex flex-wrap items-center gap-2",children:[c,b,I]}),e[34]=I,e[35]=c,e[36]=b,e[37]=V):V=e[37],x=w("div",{className:"flex flex-col gap-6","data-testid":"lunora-issues-panel",children:[m,V,$&&y.length===0?s(_e,{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:w(Ve,{"data-testid":"issues-table",children:[s(Oe,{children:w(ye,{children:[s(F,{children:t("Issue")}),s(F,{children:t("Status")}),s(F,{children:t("Severity")}),s(F,{children:t("Assignee")}),s(F,{className:"text-right",children:t("Events")}),s(F,{children:t("Last seen")}),s(F,{className:"text-right",children:t("Actions")})]})}),s(Ue,{children:y.map(l=>s(tt,{busy:A.has(l.hash),issue:l,rowError:C.get(l.hash),runTriage:N,shardKey:i},l.hash))})]})})})]}),e[4]=C,e[5]=A,e[6]=E,e[7]=M,e[8]=d,e[9]=g,e[10]=$,e[11]=i,e[12]=r,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 lt(){return new Map}export{Tt as default};
1
+ import{c as xe}from"react/compiler-runtime";import{findIssueSolution as we,flattenHint as Ee}from"@lunora/errors";import{useLunora as Ne}from"@lunora/react";import{useState as ne}from"react";import{L as Te}from"../packem_shared/live-status-Bf7rR8o8.js";import{ShardInput as $e}from"../packem_shared/ShardInput-CdawpUiS.js";import{B as pe}from"../packem_shared/badge-cAk9Di1Q.js";import{B as oe}from"../packem_shared/button-BOPLD1un.js";import{C as Ae,a as Ce}from"../packem_shared/card-BGlQzQY-.js";import{E as _e}from"../packem_shared/empty-state-B939z6K2.js";import{I as ke}from"../packem_shared/input-CY5W3wzv.js";import{S as Me,a as Re,b as Ke,c as be,d as Le}from"../packem_shared/select-BPISLTcv.js";import{T as Ve,a as Oe,b as ye,c as F,d as Ue,e as B}from"../packem_shared/table-BMsuYFhk.js";import{u as Be}from"../packem_shared/use-admin-query-DV9xmFl8.js";import{u as Fe}from"../packem_shared/use-async-submit-C9xXjXWX.js";import{u as ze}from"../packem_shared/use-shard-key-BsP3o5wT.js";import{useT as ve}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{ADMIN_FUNCTIONS as ie}from"../packem_shared/ADMIN_FUNCTIONS-B6z7VLYt.js";import{i as He,f as re,c as de,d as Ie,b as je}from"../packem_shared/internal-7bgd8inO.js";import{jsx as s,jsxs as w,Fragment as De}from"react/jsx-runtime";const ge="none",qe=["all","open","resolved","ignored"],Ge=["critical","high","medium","low"],Pe=de(ie.resolveIssue),We=de(ie.ignoreIssue),Se=de(ie.assignIssue),Ye=de(ie.setIssueSeverity),Qe=de(ie.explainIssue),Xe=n=>Array.isArray(n?.issues)?n.issues:[],Je=n=>n==="resolved"?"success":n==="ignored"?"secondary":"warning",Ze=n=>n==="critical"?"destructive":n==="high"?"warning":n==="medium"?"info":"secondary",et=n=>{const e=xe(44),{expanded:h,issue:t,shardKey:E}=n,i=Ne(),r=ve(),[a,o]=ne(void 0),{busy:R,error:A,run:L}=Fe();let C;e[0]!==i||e[1]!==t||e[2]!==L||e[3]!==E?(C=()=>{o(void 0),L(async()=>{const f={culprit:t.culprit,sampleMessage:t.sampleMessage,title:t.title},I=await i.query(Qe,f,Ie(E));o(I)})},e[0]=i,e[1]=t,e[2]=L,e[3]=E,e[4]=C):C=e[4];const K=C;if(!h)return null;let T;if(e[5]!==t.sampleMessage){const f=we(t.sampleMessage);T=f===void 0?void 0:Ee(f.body),e[5]=t.sampleMessage,e[6]=T}else T=e[6];const _=T,M=`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 g;e[9]!==r?(g=r("Suggested fix"),e[9]=r,e[10]=g):g=e[10];let $;e[11]!==g?($=s("div",{className:"text-xs font-medium text-muted-foreground",children:g}),e[11]=g,e[12]=$):$=e[12];let x;e[13]!==_||e[14]!==t.hash||e[15]!==r?(x=_===void 0?s("p",{className:"mt-1 text-sm text-muted-foreground","data-testid":`issues-hint-empty-${t.hash}`,children:r("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]=r,e[16]=x):x=e[16];let y;e[17]!==$||e[18]!==x?(y=w("div",{children:[$,x]}),e[17]=$,e[18]=x,e[19]=y):y=e[19];const S=`issues-explain-${t.hash}`;let N;e[20]!==R||e[21]!==r?(N=r(R?"Explaining…":"Explain in plain language"),e[20]=R,e[21]=r,e[22]=N):N=e[22];let u;e[23]!==R||e[24]!==K||e[25]!==N||e[26]!==S?(u=s("div",{children:s(oe,{"data-testid":S,disabled:R,onClick:K,size:"sm",type:"button",variant:"outline",children:N})}),e[23]=R,e[24]=K,e[25]=N,e[26]=S,e[27]=u):u=e[27];let p;e[28]!==A||e[29]!==t.hash?(p=A!==null&&s("p",{className:"text-xs text-destructive","data-testid":`issues-explain-error-${t.hash}`,role:"alert",children:A}),e[28]=A,e[29]=t.hash,e[30]=p):p=e[30];let m;e[31]!==a||e[32]!==t.hash||e[33]!==r?(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"?r("No AI binding is configured. Wire an AI binding to enable plain-language explanations — the suggested fix above is always available."):r("The AI model could not explain this error right now. The suggested fix above still applies.")}):w("div",{"data-testid":`issues-explanation-${t.hash}`,children:[s("div",{className:"text-xs font-medium text-muted-foreground",children:r("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:r("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:r("Generated by {model}",{model:a.model})})]})),e[31]=a,e[32]=t.hash,e[33]=r,e[34]=m):m=e[34];let c;e[35]!==u||e[36]!==p||e[37]!==m||e[38]!==d||e[39]!==y?(c=s(B,{className:"bg-muted/30",colSpan:7,children:w("div",{className:"flex flex-col gap-3 py-1",children:[d,y,u,p,m]})}),e[35]=u,e[36]=p,e[37]=m,e[38]=d,e[39]=y,e[40]=c):c=e[40];let b;return e[41]!==c||e[42]!==M?(b=s(ye,{"data-testid":M,children:c}),e[41]=c,e[42]=M,e[43]=b):b=e[43],b},tt=n=>{const e=xe(119),{busy:h,issue:t,rowError:E,runTriage:i,shardKey:r}=n,a=ve(),[o,R]=ne(!1);let A;e[0]===Symbol.for("react.memo_cache_sentinel")?(A=()=>{R(st)},e[0]=A):A=e[0];const L=A;let C;e[1]!==t.hash||e[2]!==i?(C=ae=>{const he=ae===null||ae===ge?null:ae;re(i(t.hash,Ye,{severity:he}))},e[1]=t.hash,e[2]=i,e[3]=C):C=e[3];const K=C;let T;e[4]!==t.hash||e[5]!==i?(T=ae=>{if(ae.key!=="Enter")return;const he=ae.currentTarget.value.trim();re(i(t.hash,Se,{assignee:he===""?null:he}))},e[4]=t.hash,e[5]=i,e[6]=T):T=e[6];const _=T,M=`issues-row-${t.hash}`;let d;e[7]!==a?(d=a("Toggle issue details"),e[7]=a,e[8]=d):d=e[8];const g=`issues-toggle-${t.hash}`,$=`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 y;e[10]!==$?(y=s("svg",{"aria-hidden":"true",className:$,fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,viewBox:"0 0 24 24",children:x}),e[10]=$,e[11]=y):y=e[11];let S;e[12]!==t.title?(S=s("span",{className:"block truncate font-medium",title:t.title,children:t.title}),e[12]=t.title,e[13]=S):S=e[13];let N;e[14]!==t.culprit?(N=s("span",{className:"block truncate font-mono text-xs text-muted-foreground",title:t.culprit,children:t.culprit}),e[14]=t.culprit,e[15]=N):N=e[15];let u;e[16]!==S||e[17]!==N?(u=w("span",{className:"min-w-0",children:[S,N]}),e[16]=S,e[17]=N,e[18]=u):u=e[18];let p;e[19]!==o||e[20]!==u||e[21]!==d||e[22]!==g||e[23]!==y?(p=w("button",{"aria-expanded":o,"aria-label":d,className:"flex w-full items-start gap-2 text-left","data-testid":g,onClick:L,type:"button",children:[y,u]}),e[19]=o,e[20]=u,e[21]=d,e[22]=g,e[23]=y,e[24]=p):p=e[24];let m;e[25]!==t.hash||e[26]!==E?(m=E!==void 0&&s("p",{className:"mt-1 text-xs text-destructive","data-testid":`issues-action-error-${t.hash}`,role:"alert",children:E}),e[25]=t.hash,e[26]=E,e[27]=m):m=e[27];let c;e[28]!==p||e[29]!==m?(c=w(B,{className:"max-w-80",children:[p,m]}),e[28]=p,e[29]=m,e[30]=c):c=e[30];const b=`issues-status-${t.hash}`;let f;e[31]!==t.status?(f=Je(t.status),e[31]=t.status,e[32]=f):f=e[32];let I;e[33]!==t.status||e[34]!==b||e[35]!==f?(I=s(B,{children:s(pe,{"data-testid":b,variant:f,children:t.status})}),e[33]=t.status,e[34]=b,e[35]=f,e[36]=I):I=e[36];const V=t.severity??ge;let l;e[37]!==a?(l=a("Set severity"),e[37]=a,e[38]=l):l=e[38];const le=`issues-severity-${t.hash}`;let O;e[39]!==a?(O=a("—"),e[39]=a,e[40]=O):O=e[40];let v;e[41]!==t.severity||e[42]!==a?(v=t.severity===void 0?s("span",{className:"text-muted-foreground",children:a("—")}):s(pe,{variant:Ze(t.severity),children:t.severity}),e[41]=t.severity,e[42]=a,e[43]=v):v=e[43];let k;e[44]!==O||e[45]!==v?(k=s(Me,{placeholder:O,children:v}),e[44]=O,e[45]=v,e[46]=k):k=e[46];let U;e[47]!==l||e[48]!==le||e[49]!==k?(U=s(Re,{"aria-label":l,className:"h-7 w-[110px]","data-testid":le,children:k}),e[47]=l,e[48]=le,e[49]=k,e[50]=U):U=e[50];let z;e[51]===Symbol.for("react.memo_cache_sentinel")?(z=Ge.map(at),e[51]=z):z=e[51];let H;e[52]!==a?(H=a("Clear"),e[52]=a,e[53]=H):H=e[53];let j;e[54]!==H?(j=w(Ke,{children:[z,s(be,{value:ge,children:H})]}),e[54]=H,e[55]=j):j=e[55];let D;e[56]!==h||e[57]!==K||e[58]!==V||e[59]!==U||e[60]!==j?(D=s(B,{children:w(Le,{disabled:h,onValueChange:K,value:V,children:[U,j]})}),e[56]=h,e[57]=K,e[58]=V,e[59]=U,e[60]=j,e[61]=D):D=e[61];let q;e[62]!==a?(q=a("Assignee"),e[62]=a,e[63]=q):q=e[63];const ue=`issues-assignee-${t.hash}`,me=t.assignee??"",fe=t.assignee??"";let G;e[64]!==a?(G=a("Unassigned"),e[64]=a,e[65]=G):G=e[65];let P;e[66]!==h||e[67]!==_||e[68]!==q||e[69]!==ue||e[70]!==me||e[71]!==fe||e[72]!==G?(P=s(B,{children:s(ke,{"aria-label":q,className:"h-7 w-32","data-testid":ue,defaultValue:me,disabled:h,onKeyDown:_,placeholder:G},fe)}),e[66]=h,e[67]=_,e[68]=q,e[69]=ue,e[70]=me,e[71]=fe,e[72]=G,e[73]=P):P=e[73];let W;e[74]!==t.count?(W=s(B,{className:"text-right",children:s(pe,{variant:"secondary",children:t.count})}),e[74]=t.count,e[75]=W):W=e[75];let Y;e[76]!==t.lastSeen?(Y=He(t.lastSeen),e[76]=t.lastSeen,e[77]=Y):Y=e[77];let Q;e[78]!==Y?(Q=s(B,{className:"text-xs tabular-nums text-muted-foreground",children:Y}),e[78]=Y,e[79]=Q):Q=e[79];let X;e[80]!==h||e[81]!==t.hash||e[82]!==t.status||e[83]!==i||e[84]!==a?(X=t.status!=="resolved"&&s(oe,{"data-testid":`issues-resolve-${t.hash}`,disabled:h,onClick:()=>{re(i(t.hash,Pe,{}))},size:"xs",variant:"outline",children:a("Resolve")}),e[80]=h,e[81]=t.hash,e[82]=t.status,e[83]=i,e[84]=a,e[85]=X):X=e[85];let J;e[86]!==h||e[87]!==t.hash||e[88]!==t.status||e[89]!==i||e[90]!==a?(J=t.status!=="ignored"&&s(oe,{"data-testid":`issues-ignore-${t.hash}`,disabled:h,onClick:()=>{re(i(t.hash,We,{}))},size:"xs",variant:"ghost",children:a("Ignore")}),e[86]=h,e[87]=t.hash,e[88]=t.status,e[89]=i,e[90]=a,e[91]=J):J=e[91];let Z;e[92]!==h||e[93]!==t.assignee||e[94]!==t.hash||e[95]!==t.status||e[96]!==i||e[97]!==a?(Z=t.status!=="open"&&s(oe,{"data-testid":`issues-reopen-${t.hash}`,disabled:h,onClick:()=>{re(i(t.hash,Se,{assignee:t.assignee??null}))},size:"xs",variant:"ghost",children:a("Reopen")}),e[92]=h,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 ee;e[99]!==X||e[100]!==J||e[101]!==Z?(ee=s(B,{className:"text-right",children:w("div",{className:"flex justify-end gap-1",children:[X,J,Z]})}),e[99]=X,e[100]=J,e[101]=Z,e[102]=ee):ee=e[102];let te;e[103]!==c||e[104]!==I||e[105]!==D||e[106]!==P||e[107]!==W||e[108]!==Q||e[109]!==M||e[110]!==ee?(te=w(ye,{"data-testid":M,children:[c,I,D,P,W,Q,ee]}),e[103]=c,e[104]=I,e[105]=D,e[106]=P,e[107]=W,e[108]=Q,e[109]=M,e[110]=ee,e[111]=te):te=e[111];let se;e[112]!==o||e[113]!==t||e[114]!==r?(se=s(et,{expanded:o,issue:t,shardKey:r},t.sampleMessage),e[112]=o,e[113]=t,e[114]=r,e[115]=se):se=e[115];let ce;return e[116]!==te||e[117]!==se?(ce=w(De,{children:[te,se]}),e[116]=te,e[117]=se,e[118]=ce):ce=e[118],ce},Tt=n=>{const e=xe(38),{initialShardKey:h}=n,t=ve(),E=Ne(),{queryShardKey:i,setShardKey:r,shardKey:a}=ze(h),[o,R]=ne("all"),[A,L]=ne(it),[C,K]=ne(lt);let T;e[0]!==o?(T=o==="all"?{}:{status:o},e[0]=o,e[1]=T):T=e[1];let _;e[2]!==i?(_={live:!0,shardKey:i},e[2]=i,e[3]=_):_=e[3];const{data:M,error:d,liveError:g}=Be(ie.getIssues,T,_),$=M!==void 0;let x;if(e[4]!==C||e[5]!==A||e[6]!==E||e[7]!==M||e[8]!==d||e[9]!==g||e[10]!==$||e[11]!==i||e[12]!==r||e[13]!==a||e[14]!==o||e[15]!==t){const y=Xe(M);let S;e[17]!==E||e[18]!==i?(S=async(l,le,O)=>{K(v=>{if(!v.has(l))return v;const k=new Map(v);return k.delete(l),k}),L(v=>new Set(v).add(l));try{await E.query(le,{...O,hash:l},Ie(i))}catch(v){const U=je(v);K(z=>new Map(z).set(l,U))}L(v=>{const k=new Set(v);return k.delete(l),k})},e[17]=E,e[18]=i,e[19]=S):S=e[19];const N=S;let u;e[20]!==t?(u=l=>t(l==="all"?"All":l==="open"?"Open":l==="resolved"?"Resolved":"Ignored"),e[20]=t,e[21]=u):u=e[21];const p=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 c;e[24]!==r||e[25]!==a?(c=s($e,{onChange:r,testId:"issues-shard-input",value:a}),e[24]=r,e[25]=a,e[26]=c):c=e[26];let b;e[27]!==g?(b=s(Te,{message:g,prefix:"issues"}),e[27]=g,e[28]=b):b=e[28];let f;e[29]!==o||e[30]!==p?(f=qe.map(l=>s(oe,{"data-active":o===l?"":void 0,"data-testid":`issues-filter-${l}`,onClick:()=>{R(l)},size:"xs",variant:o===l?"default":"outline",children:p(l)},l)),e[29]=o,e[30]=p,e[31]=f):f=e[31];let I;e[32]!==f?(I=s("div",{className:"ms-auto flex items-center gap-1","data-testid":"issues-status-filter",role:"group",children:f}),e[32]=f,e[33]=I):I=e[33];let V;e[34]!==I||e[35]!==c||e[36]!==b?(V=w("div",{className:"flex flex-wrap items-center gap-2",children:[c,b,I]}),e[34]=I,e[35]=c,e[36]=b,e[37]=V):V=e[37],x=w("div",{className:"flex flex-col gap-6","data-testid":"lunora-issues-panel",children:[m,V,$&&y.length===0?s(_e,{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:w(Ve,{"data-testid":"issues-table",children:[s(Oe,{children:w(ye,{children:[s(F,{children:t("Issue")}),s(F,{children:t("Status")}),s(F,{children:t("Severity")}),s(F,{children:t("Assignee")}),s(F,{className:"text-right",children:t("Events")}),s(F,{children:t("Last seen")}),s(F,{className:"text-right",children:t("Actions")})]})}),s(Ue,{children:y.map(l=>s(tt,{busy:A.has(l.hash),issue:l,rowError:C.get(l.hash),runTriage:N,shardKey:i},l.hash))})]})})})]}),e[4]=C,e[5]=A,e[6]=E,e[7]=M,e[8]=d,e[9]=g,e[10]=$,e[11]=i,e[12]=r,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 lt(){return new Map}export{Tt as default};
@@ -1 +1 @@
1
- import{useLunora as ee}from"@lunora/react";import{useState as Z,useReducer as le,useEffect as ae}from"react";import{C as ve,a as fe}from"../packem_shared/card-BGlQzQY-.js";import{E as Ee}from"../packem_shared/empty-state-B939z6K2.js";import{T as pe,a as he,b as X,c as q,d as ye,e as Q}from"../packem_shared/table-BMsuYFhk.js";import{useT as G}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{f as H,b as R,l as Fe,g as se}from"../packem_shared/internal-7bgd8inO.js";import{B as P}from"../packem_shared/button-BOPLD1un.js";import{C as ne}from"../packem_shared/checkbox-C5w53W-E.js";import{I as re}from"../packem_shared/input-CY5W3wzv.js";import{b as ie,c as de,d as oe,e as ce}from"../packem_shared/studio-BdV57x3O.js";import{c as te}from"react/compiler-runtime";import{L as W}from"../packem_shared/label-BOUo-DP0.js";import{T as ke}from"../packem_shared/textarea-DpO3i-Qo.js";import{c as Ke,S as Ve,a as Ie,b as _e,d as Me}from"../packem_shared/select-BPISLTcv.js";import{jsx as r,jsxs as w,Fragment as be}from"react/jsx-runtime";import{B as Le}from"../packem_shared/badge-cAk9Di1Q.js";const Be=a=>{const e=a.trim();if(e==="")return;const n=Number(e);return Number.isFinite(n)&&n>0?Math.floor(n):void 0},Oe=a=>a===void 0?"—":new Date(a*1e3).toISOString(),Ae=a=>new TextEncoder().encode(a).length,ge=a=>{if(a.trim()!=="")try{return JSON.stringify(JSON.parse(a),void 0,2)}catch{return}},xe=a=>{if(a.trim()==="")return!0;try{return JSON.parse(a),!0}catch{return!1}},Ne=[{key:"seconds",seconds:1},{key:"minutes",seconds:60},{key:"hours",seconds:3600},{key:"days",seconds:86400}],ue=(a,e)=>{const n=a.trim();if(n==="")return"";const c=Number(n),i=Ne.find(m=>m.key===e)?.seconds??1;return Number.isFinite(c)&&c>0?String(Math.round(c*i)):n},Ce=a=>{const e=a.trim();if(e==="")return!0;const n=Number(e);return Number.isInteger(n)&&n>=60},Se=(a,e,n,c)=>{const i=Be(a.ttl);return{expiration:i===void 0?c:void 0,expirationTtl:i,key:e,metadata:a.metadata.trim()===""?void 0:JSON.parse(a.metadata),namespace:n,value:a.value}},we=a=>{const e=te(60),{helper:n,id:c,invalid:i,onChange:m,testId:d}=a,t=G(),[l,v]=Z(""),[o,g]=Z("seconds");let k;e[0]!==m||e[1]!==o?(k=b=>{v(b.target.value),m(ue(b.target.value,o))},e[0]=m,e[1]=o,e[2]=k):k=e[2];const M=k;let K;e[3]!==l||e[4]!==m?(K=b=>{b!==null&&(g(b),m(ue(l,b)))},e[3]=l,e[4]=m,e[5]=K):K=e[5];const L=K;let f;e[6]!==t?(f=t("days"),e[6]=t,e[7]=f):f=e[7];let u;e[8]!==t?(u=t("hours"),e[8]=t,e[9]=u):u=e[9];let p;e[10]!==t?(p=t("minutes"),e[10]=t,e[11]=p):p=e[11];let x;e[12]!==t?(x=t("seconds"),e[12]=t,e[13]=x):x=e[13];let N;e[14]!==f||e[15]!==u||e[16]!==p||e[17]!==x?(N={days:f,hours:u,minutes:p,seconds:x},e[14]=f,e[15]=u,e[16]=p,e[17]=x,e[18]=N):N=e[18];const C=N;let y;e[19]!==t?(y=t("Expires after"),e[19]=t,e[20]=y):y=e[20];let S;e[21]!==c||e[22]!==y?(S=r(W,{className:"text-xs",htmlFor:c,children:y}),e[21]=c,e[22]=y,e[23]=S):S=e[23];let F;e[24]!==t?(F=t("No expiration"),e[24]=t,e[25]=F):F=e[25];let O;e[26]!==l||e[27]!==c||e[28]!==i||e[29]!==M||e[30]!==F||e[31]!==d?(O=r(re,{"aria-invalid":i,className:"flex-1","data-testid":d,id:c,inputMode:"numeric",onChange:M,placeholder:F,value:l}),e[26]=l,e[27]=c,e[28]=i,e[29]=M,e[30]=F,e[31]=d,e[32]=O):O=e[32];let V;e[33]!==t?(V=t("TTL unit"),e[33]=t,e[34]=V):V=e[34];const D=`${d}-unit`;let A;e[35]===Symbol.for("react.memo_cache_sentinel")?(A=r(Ve,{}),e[35]=A):A=e[35];let I;e[36]!==V||e[37]!==D?(I=r(Ie,{"aria-label":V,className:"w-[7.5rem]","data-testid":D,children:A}),e[36]=V,e[37]=D,e[38]=I):I=e[38];let s;e[39]!==C?(s=Ne.map(b=>r(Ke,{value:b.key,children:C[b.key]},b.key)),e[39]=C,e[40]=s):s=e[40];let h;e[41]!==s?(h=r(_e,{children:s}),e[41]=s,e[42]=h):h=e[42];let T;e[43]!==L||e[44]!==I||e[45]!==h||e[46]!==o?(T=w(Me,{onValueChange:L,value:o,children:[I,h]}),e[43]=L,e[44]=I,e[45]=h,e[46]=o,e[47]=T):T=e[47];let _;e[48]!==O||e[49]!==T?(_=w("div",{className:"flex gap-2",children:[O,T]}),e[48]=O,e[49]=T,e[50]=_):_=e[50];let E;e[51]!==n||e[52]!==i||e[53]!==t||e[54]!==d?(E=i?r("p",{className:"text-xs text-destructive","data-testid":`${d}-invalid`,children:t("TTL must be at least 60 seconds.")}):n!==void 0&&r("p",{className:"text-xs text-muted-foreground",children:n}),e[51]=n,e[52]=i,e[53]=t,e[54]=d,e[55]=E):E=e[55];let B;return e[56]!==_||e[57]!==E||e[58]!==S?(B=w("div",{className:"mb-3 grid gap-1",children:[S,_,E]}),e[56]=_,e[57]=E,e[58]=S,e[59]=B):B=e[59],B},Te=a=>{const e=te(36),{id:n,invalidTestId:c,onChange:i,testId:m,valid:d,value:t}=a,l=G();let v;e[0]!==t?(v=ge(t),e[0]=t,e[1]=v):v=e[1];const o=v;let g;e[2]!==l?(g=l("Metadata (JSON)"),e[2]=l,e[3]=g):g=e[3];let k;e[4]!==n||e[5]!==g?(k=r(W,{className:"text-xs",htmlFor:n,children:g}),e[4]=n,e[5]=g,e[6]=k):k=e[6];const M=`${m}-format`,K=o===void 0;let L;e[7]!==o||e[8]!==i?(L=()=>{o!==void 0&&i(o)},e[7]=o,e[8]=i,e[9]=L):L=e[9];let f;e[10]!==l?(f=l("Format JSON"),e[10]=l,e[11]=f):f=e[11];let u;e[12]!==M||e[13]!==K||e[14]!==L||e[15]!==f?(u=r(P,{"data-testid":M,disabled:K,onClick:L,size:"sm",variant:"outline",children:f}),e[12]=M,e[13]=K,e[14]=L,e[15]=f,e[16]=u):u=e[16];let p;e[17]!==k||e[18]!==u?(p=w("div",{className:"flex items-center justify-between gap-2",children:[k,u]}),e[17]=k,e[18]=u,e[19]=p):p=e[19];const x=!d;let N;e[20]!==i?(N=F=>{i(F.target.value)},e[20]=i,e[21]=N):N=e[21];let C;e[22]!==n||e[23]!==x||e[24]!==N||e[25]!==m||e[26]!==t?(C=r(ke,{"aria-invalid":x,className:"min-h-[4rem] font-mono text-xs","data-testid":m,id:n,onChange:N,value:t}),e[22]=n,e[23]=x,e[24]=N,e[25]=m,e[26]=t,e[27]=C):C=e[27];let y;e[28]!==c||e[29]!==l||e[30]!==d?(y=!d&&r("p",{className:"text-xs text-destructive","data-testid":c,children:l("Metadata must be valid JSON.")}),e[28]=c,e[29]=l,e[30]=d,e[31]=y):y=e[31];let S;return e[32]!==C||e[33]!==y||e[34]!==p?(S=w("div",{className:"mb-3 grid gap-1",children:[p,C,y]}),e[32]=C,e[33]=y,e[34]=p,e[35]=S):S=e[35],S},De={busy:!1,error:null,metadata:"",name:"",ttl:"",value:""},Je=(a,e)=>{switch(e.type){case"setField":return{...a,[e.field]:e.value};case"submitFailed":return{...a,busy:!1,error:e.error};case"submitStart":return{...a,busy:!0,error:null};default:return a}},Pe=a=>{const e=te(73),{namespace:n,onCancel:c,onCreated:i}=a,m=ee(),d=G(),[t,l]=le(Je,De);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 k=g;let M;e[4]!==o||e[5]!==t.busy||e[6]!==t.name||e[7]!==k?(M=t.name.trim()!==""&&o&&k&&!t.busy,e[4]=o,e[5]=t.busy,e[6]=t.name,e[7]=k,e[8]=M):M=e[8];const K=M;let L;e[9]!==K||e[10]!==m||e[11]!==n||e[12]!==i||e[13]!==t.metadata||e[14]!==t.name||e[15]!==t.ttl||e[16]!==t.value?(L=()=>{K&&(l({type:"submitStart"}),H((async()=>{try{await m.putKvValue(Se({metadata:t.metadata,ttl:t.ttl,value:t.value},t.name,n)),i()}catch($){l({error:R($),type:"submitFailed"})}})()))},e[9]=K,e[10]=m,e[11]=n,e[12]=i,e[13]=t.metadata,e[14]=t.name,e[15]=t.ttl,e[16]=t.value,e[17]=L):L=e[17];const f=L;let u;e[18]!==d?(u=d("Key name"),e[18]=d,e[19]=u):u=e[19];let p;e[20]!==u?(p=r(W,{className:"text-xs",htmlFor:"kv-create-name",children:u}),e[20]=u,e[21]=p):p=e[21];let x;e[22]===Symbol.for("react.memo_cache_sentinel")?(x=$=>{l({field:"name",type:"setField",value:$.target.value})},e[22]=x):x=e[22];let N;e[23]!==d?(N=d("Key name"),e[23]=d,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 y;e[28]!==p||e[29]!==C?(y=w("div",{className:"grid gap-1",children:[p,C]}),e[28]=p,e[29]=C,e[30]=y):y=e[30];let S;e[31]!==d?(S=d("Value"),e[31]=d,e[32]=S):S=e[32];let F;e[33]!==S?(F=r(W,{className:"text-xs",htmlFor:"kv-create-value",children:S}),e[33]=S,e[34]=F):F=e[34];let O;e[35]===Symbol.for("react.memo_cache_sentinel")?(O=$=>{l({field:"value",type:"setField",value:$.target.value})},e[35]=O):O=e[35];let V;e[36]!==t.value?(V=r(ke,{className:"min-h-[6rem] font-mono text-xs","data-testid":"kv-create-value",id:"kv-create-value",onChange:O,value:t.value}),e[36]=t.value,e[37]=V):V=e[37];let D;e[38]!==F||e[39]!==V?(D=w("div",{className:"grid gap-1",children:[F,V]}),e[38]=F,e[39]=V,e[40]=D):D=e[40];const A=!k;let I;e[41]===Symbol.for("react.memo_cache_sentinel")?(I=$=>{l({field:"ttl",type:"setField",value:$})},e[41]=I):I=e[41];let s;e[42]!==A?(s=r(we,{id:"kv-create-ttl",invalid:A,onChange:I,testId:"kv-create-ttl"}),e[42]=A,e[43]=s):s=e[43];let h;e[44]===Symbol.for("react.memo_cache_sentinel")?(h=$=>{l({field:"metadata",type:"setField",value:$})},e[44]=h):h=e[44];let T;e[45]!==o||e[46]!==t.metadata?(T=r(Te,{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]=T):T=e[47];const _=!K;let E;e[48]!==t.busy||e[49]!==d?(E=t.busy?d("Creating…"):d("Create key"),e[48]=t.busy,e[49]=d,e[50]=E):E=e[50];let B;e[51]!==f||e[52]!==_||e[53]!==E?(B=r(P,{"data-testid":"kv-create-submit",disabled:_,onClick:f,children:E}),e[51]=f,e[52]=_,e[53]=E,e[54]=B):B=e[54];const b=t.busy;let J;e[55]!==d?(J=d("Cancel"),e[55]=d,e[56]=J):J=e[56];let j;e[57]!==c||e[58]!==t.busy||e[59]!==J?(j=r(P,{"data-testid":"kv-create-cancel",disabled:b,onClick:c,variant:"outline",children:J}),e[57]=c,e[58]=t.busy,e[59]=J,e[60]=j):j=e[60];let z;e[61]!==B||e[62]!==j?(z=w("div",{className:"flex flex-wrap gap-2",children:[B,j]}),e[61]=B,e[62]=j,e[63]=z):z=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 Y;return e[66]!==y||e[67]!==D||e[68]!==s||e[69]!==T||e[70]!==z||e[71]!==U?(Y=w("div",{className:"grid gap-3 px-4 pb-4","data-testid":"kv-create-form",children:[y,D,s,T,z,U]}),e[66]=y,e[67]=D,e[68]=s,e[69]=T,e[70]=z,e[71]=U,e[72]=Y):Y=e[72],Y},$e={busy:"",editedMetadata:"",editedTtl:"",editedValue:"",loadError:null,loading:!0,value:null,writeError:null},je=(a,e)=>{switch(e.type){case"deleteStart":return{...a,busy:"deleting",writeError:null};case"editMetadata":return{...a,editedMetadata:e.value};case"editTtl":return{...a,editedTtl:e.value};case"editValue":return{...a,editedValue:e.value};case"loaded":return{...a,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{...a,loadError:e.error,loading:!1};case"saveOk":return{...a,busy:"",value:a.editedValue};case"saveStart":return{...a,busy:"saving",writeError:null};case"writeFailed":return{...a,busy:"",writeError:e.error};default:return a}},He=a=>{const e=te(67),{expiration:n,keyName:c,namespace:i,onDeleted:m}=a,d=ee(),t=G(),[l,v]=le(je,$e);let o,g;e[0]!==d||e[1]!==c||e[2]!==i?(o=()=>{const b={cancelled:!1};return H((async()=>{try{const J=await d.getKvValue({key:c,namespace:i});b.cancelled||v({metadata:J.metadata,type:"loaded",value:J.value})}catch(J){const j=J;b.cancelled||v({error:R(j),type:"loadFailed"})}})()),()=>{b.cancelled=!0}},g=[d,i,c],e[0]=d,e[1]=c,e[2]=i,e[3]=o,e[4]=g):(o=e[3],g=e[4]),ae(o,g);let k;e[5]===Symbol.for("react.memo_cache_sentinel")?(k=b=>{v({type:"editValue",value:b.target.value})},e[5]=k):k=e[5];const M=k;let K;e[6]===Symbol.for("react.memo_cache_sentinel")?(K=b=>{v({type:"editMetadata",value:b})},e[6]=K):K=e[6];const L=K;let f;e[7]!==l.editedValue?(f=ge(l.editedValue),e[7]=l.editedValue,e[8]=f):f=e[8];const u=f;let p;e[9]!==l.editedMetadata?(p=xe(l.editedMetadata),e[9]=l.editedMetadata,e[10]=p):p=e[10];const x=p;let N;e[11]!==l.editedTtl?(N=Ce(l.editedTtl),e[11]=l.editedTtl,e[12]=N):N=e[12];const C=N;let y;e[13]!==u?(y=()=>{u!==void 0&&v({type:"editValue",value:u})},e[13]=u,e[14]=y):y=e[14];const S=y;let F;e[15]!==d||e[16]!==n||e[17]!==c||e[18]!==x||e[19]!==i||e[20]!==l.editedMetadata||e[21]!==l.editedTtl||e[22]!==l.editedValue||e[23]!==t?(F=()=>{if(!x){v({error:t("Metadata must be valid JSON."),type:"writeFailed"});return}v({type:"saveStart"}),H((async()=>{try{await d.putKvValue(Se({metadata:l.editedMetadata,ttl:l.editedTtl,value:l.editedValue},c,i,n)),v({type:"saveOk"})}catch(b){v({error:R(b),type:"writeFailed"})}})())},e[15]=d,e[16]=n,e[17]=c,e[18]=x,e[19]=i,e[20]=l.editedMetadata,e[21]=l.editedTtl,e[22]=l.editedValue,e[23]=t,e[24]=F):F=e[24];const O=F;let V;e[25]!==d||e[26]!==c||e[27]!==i||e[28]!==m?(V=()=>{v({type:"deleteStart"}),H((async()=>{try{await d.deleteKvKey({key:c,namespace:i}),m(c)}catch(b){v({error:R(b),type:"writeFailed"})}})())},e[25]=d,e[26]=c,e[27]=i,e[28]=m,e[29]=V):V=e[29];const D=V;let A;e[30]!==c?(A=()=>{se(c)},e[30]=c,e[31]=A):A=e[31];let I;e[32]!==t?(I=t("Copy key"),e[32]=t,e[33]=I):I=e[33];let s;e[34]!==A||e[35]!==I?(s=r("div",{className:"mb-2 flex justify-end",children:r(P,{"data-testid":"kv-copy-key-btn",onClick:A,size:"sm",variant:"outline",children:I})}),e[34]=A,e[35]=I,e[36]=s):s=e[36];let h;e[37]!==l.loadError?(h=l.loadError!==null&&r("p",{className:"mb-2 text-sm text-destructive","data-testid":"kv-value-error",role:"alert",children:l.loadError}),e[37]=l.loadError,e[38]=h):h=e[38];let T;e[39]!==l.loading||e[40]!==t?(T=l.loading&&r("p",{className:"text-sm text-muted-foreground","data-testid":"kv-value-loading",children:t("Loading…")}),e[39]=l.loading,e[40]=t,e[41]=T):T=e[41];let _;e[42]!==u||e[43]!==x||e[44]!==D||e[45]!==S||e[46]!==O||e[47]!==l.busy||e[48]!==l.editedMetadata||e[49]!==l.editedValue||e[50]!==l.loading||e[51]!==l.value||e[52]!==l.writeError||e[53]!==t||e[54]!==C?(_=!l.loading&&l.value!==null&&w(be,{children:[w("div",{className:"mb-1 flex flex-wrap items-center gap-2",children:[r(W,{className:"text-xs",htmlFor:"kv-value-editor",children:t("Value")}),u!==void 0&&r(Le,{variant:"secondary",children:t("JSON")}),r("span",{className:"ml-auto text-xs tabular-nums text-muted-foreground","data-testid":"kv-value-size",children:Fe(Ae(l.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:M,value:l.editedValue}),w("div",{className:"mb-3 flex flex-wrap gap-2",children:[r(P,{"data-testid":"kv-format-btn",disabled:u===void 0,onClick:S,size:"sm",variant:"outline",children:t("Format JSON")}),r(P,{"data-testid":"kv-copy-value-btn",onClick:()=>{se(l.editedValue)},size:"sm",variant:"outline",children:t("Copy value")})]}),r(we,{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(Te,{id:"kv-metadata-editor",invalidTestId:"kv-metadata-invalid",onChange:L,testId:"kv-metadata-editor",valid:x,value:l.editedMetadata}),w("div",{className:"flex flex-wrap gap-2",children:[r(P,{"data-testid":"kv-save-btn",disabled:l.busy!==""||!x||!C,onClick:O,children:l.busy==="saving"?t("Saving…"):t("Save")}),r(P,{"data-testid":"kv-delete-btn",disabled:l.busy!=="",onClick:D,variant:"destructive",children:l.busy==="deleting"?t("Deleting…"):t("Delete")})]}),l.writeError!==null&&r("p",{className:"mt-2 text-sm text-destructive","data-testid":"kv-save-error",role:"alert",children:l.writeError})]}),e[42]=u,e[43]=x,e[44]=D,e[45]=S,e[46]=O,e[47]=l.busy,e[48]=l.editedMetadata,e[49]=l.editedValue,e[50]=l.loading,e[51]=l.value,e[52]=l.writeError,e[53]=t,e[54]=C,e[55]=_):_=e[55];let E;e[56]!==l.loadError||e[57]!==l.loading||e[58]!==l.value||e[59]!==t?(E=!l.loading&&l.value===null&&l.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]=l.loadError,e[57]=l.loading,e[58]=l.value,e[59]=t,e[60]=E):E=e[60];let B;return e[61]!==s||e[62]!==h||e[63]!==T||e[64]!==_||e[65]!==E?(B=w("div",{className:"px-4 pb-4","data-testid":"kv-value-section",children:[s,h,T,_,E]}),e[61]=s,e[62]=h,e[63]=T,e[64]=_,e[65]=E,e[66]=B):B=e[66],B},me=100,Re={appliedPrefix:"",bulk:[],bulkBusy:!1,bulkError:null,cursor:null,keys:null,listComplete:!1,loadError:null,loading:!1,prefixInput:"",reloadNonce:0,selectedKey:null},ze=(a,e)=>{switch(e.type){case"appendPage":return{...a,cursor:e.cursor,keys:[...a.keys??[],...e.keys],listComplete:e.listComplete,loading:!1};case"applyFilter":return{...a,appliedPrefix:a.prefixInput,bulk:[],bulkError:null,cursor:null,keys:null,listComplete:!1,selectedKey:null};case"bulkDeleted":{const n=new Set(e.deleted);return{...a,bulk:a.bulk.filter(c=>!n.has(c)),bulkBusy:!1,bulkError:e.error,keys:a.keys===null?null:a.keys.filter(c=>!n.has(c.name)),selectedKey:a.selectedKey!==null&&n.has(a.selectedKey)?null:a.selectedKey}}case"bulkDeleteStart":return{...a,bulkBusy:!0,bulkError:null};case"firstPage":return{...a,cursor:e.cursor,keys:e.keys,listComplete:e.listComplete,loading:!1};case"keyDeleted":return{...a,bulk:a.bulk.filter(n=>n!==e.name),keys:a.keys===null?null:a.keys.filter(n=>n.name!==e.name),selectedKey:null};case"loadFailed":return{...a,loadError:e.error,loading:!1};case"loadStart":return{...a,loadError:null,loading:!0};case"prefixInput":return{...a,prefixInput:e.value};case"reload":return{...a,bulk:[],bulkError:null,reloadNonce:a.reloadNonce+1,selectedKey:null};case"selectKey":return{...a,selectedKey:e.name};case"toggleAllBulk":return{...a,bulk:e.names};case"toggleBulk":return{...a,bulk:a.bulk.includes(e.name)?a.bulk.filter(n=>n!==e.name):[...a.bulk,e.name]};default:return a}},Ue=({namespace:a})=>{const e=ee(),n=G(),[c,i]=le(ze,Re),{appliedPrefix:m,bulk:d,bulkBusy:t,bulkError:l,cursor:v,keys:o,listComplete:g,loadError:k,loading:M,prefixInput:K,reloadNonce:L,selectedKey:f}=c,[u,p]=Z(!1);ae(()=>{const s={cancelled:!1};return H((async()=>{i({type:"loadStart"});try{const h=await e.listKvKeys({limit:me,namespace:a,prefix:m===""?void 0:m});s.cancelled||i({cursor:h.cursor??null,keys:h.keys,listComplete:h.listComplete,type:"firstPage"})}catch(h){s.cancelled||i({error:R(h),type:"loadFailed"})}})()),()=>{s.cancelled=!0}},[e,a,m,L]);const x=s=>{i({type:"prefixInput",value:s.target.value})},N=()=>{i({type:"applyFilter"})},C=s=>{i({name:s.currentTarget.dataset.key??null,type:"selectKey"})},y=()=>{v!==null&&(i({type:"loadStart"}),H((async()=>{try{const s=await e.listKvKeys({cursor:v,limit:me,namespace:a,prefix:m===""?void 0:m});i({cursor:s.cursor??null,keys:s.keys,listComplete:s.listComplete,type:"appendPage"})}catch(s){i({error:R(s),type:"loadFailed"})}})()))},S=s=>{i({name:s,type:"keyDeleted"})},F=s=>{i({name:s,type:"toggleBulk"})},O=s=>{i({names:s&&o!==null?o.map(h=>h.name):[],type:"toggleAllBulk"})},V=()=>{if(d.length===0)return;const s=[...d];i({type:"bulkDeleteStart"}),H((async()=>{const h=await Promise.allSettled(s.map(E=>e.deleteKvKey({key:E,namespace:a}))),T=s.filter((E,B)=>h[B]?.status==="fulfilled"),_=s.length-T.length;i({deleted:T,error:_>0?n("Failed to delete {count} keys.",{count:_}):null,type:"bulkDeleted"})})())},D=()=>{p(!1),i({type:"reload"})},A=o!==null&&o.length>0&&d.length===o.length,I=new Set(d);return w(be,{children:[w("section",{className:"border border-border bg-card p-3","data-testid":"kv-keys-section",children:[w("div",{className:"mb-3 flex flex-wrap items-center gap-2",children:[r(re,{"aria-label":n("Filter keys by prefix"),className:"min-w-[16rem] flex-1","data-testid":"kv-prefix-input",onChange:x,placeholder:n("Filter by prefix…"),value:K}),r(P,{"data-testid":"kv-filter-btn",disabled:M,onClick:N,children:n("Filter")}),r(P,{"data-testid":"kv-new-key-btn",onClick:()=>{p(s=>!s)},variant:"outline",children:n("New key")}),d.length>0&&r(P,{"data-testid":"kv-bulk-delete-btn",disabled:t,onClick:V,variant:"destructive",children:t?n("Deleting…"):n("Delete {count}",{count:d.length})})]}),l!==null&&r("p",{className:"mb-2 text-sm text-destructive","data-testid":"kv-bulk-error",role:"alert",children:l}),k!==null&&r("p",{className:"text-sm text-destructive","data-testid":"kv-keys-error",role:"alert",children:k}),o!==null&&o.length===0&&!M&&r("p",{className:"text-sm text-muted-foreground","data-testid":"kv-no-keys",children:n("No keys.")}),o!==null&&o.length>0&&r(ve,{className:"overflow-hidden py-0",children:r(fe,{className:"px-0",children:w(pe,{"data-testid":"kv-key-table",children:[r(he,{children:w(X,{children:[r(q,{className:"w-10",children:r(ne,{"aria-label":n("Select all"),checked:A,"data-testid":"kv-select-all",onCheckedChange:O})}),r(q,{children:n("Key")}),r(q,{children:n("Expiration")})]})}),r(ye,{children:o.map(s=>w(X,{className:s.name===f?"border-l-2 border-l-royal-amethyst bg-muted/50":"cursor-pointer","data-key":s.name,"data-testid":`kv-key-row-${s.name}`,onClick:C,children:[r(Q,{onClick:h=>{h.stopPropagation()},children:r(ne,{"aria-label":n("Select {name}",{name:s.name}),checked:I.has(s.name),"data-testid":`kv-select-${s.name}`,onCheckedChange:()=>{F(s.name)}})}),r(Q,{className:"font-mono text-xs",children:s.name}),r(Q,{className:"tabular-nums text-xs",children:Oe(s.expiration)})]},s.name))})]})})}),!g&&v!==null&&r("div",{className:"mt-2",children:r(P,{"data-testid":"kv-load-more",disabled:M,onClick:y,variant:"outline",children:n(M?"Loading…":"Load more")})})]}),r(ie,{onOpenChange:s=>{s||p(!1)},open:u,children:w(de,{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:n("New key")})}),r(Pe,{namespace:a,onCancel:()=>{p(!1)},onCreated:D})]})}),r(ie,{onOpenChange:s=>{s||i({name:null,type:"selectKey"})},open:f!==null,children:w(de,{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:f})}),f!==null&&r(He,{expiration:o?.find(s=>s.name===f)?.expiration,keyName:f,namespace:a,onDeleted:S},`${a}:${f}`)]})})]})},ut=({loadNamespaces:a}={})=>{const e=ee(),n=G(),[c,i]=Z(null),[m,d]=Z(null),[t,l]=Z(null);ae(()=>{const o={cancelled:!1};return H((async()=>{try{const g=await(a??(()=>e.listKvNamespaces()))();o.cancelled||(i(g),d(null),l(k=>k??g[0]?.binding??null))}catch(g){o.cancelled||(i(null),d(R(g)))}})()),()=>{o.cancelled=!0}},[e,a]);const v=o=>{l(o.currentTarget.dataset.ns??null)};return w("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(Ee,{description:n("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:n("No KV namespaces.")}),c!==null&&c.length>0&&r(ve,{className:"overflow-hidden py-0",children:r(fe,{className:"px-0",children:w(pe,{"data-testid":"kv-namespace-table",children:[r(he,{children:r(X,{children:r(q,{children:n("Namespace")})})}),r(ye,{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{ut as KvBrowser};
1
+ import{useLunora as ee}from"@lunora/react";import{useState as Z,useReducer as le,useEffect as ae}from"react";import{C as ve,a as fe}from"../packem_shared/card-BGlQzQY-.js";import{E as Ee}from"../packem_shared/empty-state-B939z6K2.js";import{T as pe,a as he,b as X,c as q,d as ye,e as Q}from"../packem_shared/table-BMsuYFhk.js";import{useT as G}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{f as H,b as R,l as Fe,g as se}from"../packem_shared/internal-7bgd8inO.js";import{B as P}from"../packem_shared/button-BOPLD1un.js";import{C as ne}from"../packem_shared/checkbox-C5w53W-E.js";import{I as re}from"../packem_shared/input-CY5W3wzv.js";import{b as ie,c as de,d as oe,e as ce}from"../packem_shared/studio-Cvdwfzxm.js";import{c as te}from"react/compiler-runtime";import{L as W}from"../packem_shared/label-BOUo-DP0.js";import{T as ke}from"../packem_shared/textarea-DpO3i-Qo.js";import{c as Ke,S as Ve,a as Ie,b as _e,d as Me}from"../packem_shared/select-BPISLTcv.js";import{jsx as r,jsxs as w,Fragment as be}from"react/jsx-runtime";import{B as Le}from"../packem_shared/badge-cAk9Di1Q.js";const Be=a=>{const e=a.trim();if(e==="")return;const n=Number(e);return Number.isFinite(n)&&n>0?Math.floor(n):void 0},Oe=a=>a===void 0?"—":new Date(a*1e3).toISOString(),Ae=a=>new TextEncoder().encode(a).length,ge=a=>{if(a.trim()!=="")try{return JSON.stringify(JSON.parse(a),void 0,2)}catch{return}},xe=a=>{if(a.trim()==="")return!0;try{return JSON.parse(a),!0}catch{return!1}},Ne=[{key:"seconds",seconds:1},{key:"minutes",seconds:60},{key:"hours",seconds:3600},{key:"days",seconds:86400}],ue=(a,e)=>{const n=a.trim();if(n==="")return"";const c=Number(n),i=Ne.find(m=>m.key===e)?.seconds??1;return Number.isFinite(c)&&c>0?String(Math.round(c*i)):n},Ce=a=>{const e=a.trim();if(e==="")return!0;const n=Number(e);return Number.isInteger(n)&&n>=60},Se=(a,e,n,c)=>{const i=Be(a.ttl);return{expiration:i===void 0?c:void 0,expirationTtl:i,key:e,metadata:a.metadata.trim()===""?void 0:JSON.parse(a.metadata),namespace:n,value:a.value}},we=a=>{const e=te(60),{helper:n,id:c,invalid:i,onChange:m,testId:d}=a,t=G(),[l,v]=Z(""),[o,g]=Z("seconds");let k;e[0]!==m||e[1]!==o?(k=b=>{v(b.target.value),m(ue(b.target.value,o))},e[0]=m,e[1]=o,e[2]=k):k=e[2];const M=k;let K;e[3]!==l||e[4]!==m?(K=b=>{b!==null&&(g(b),m(ue(l,b)))},e[3]=l,e[4]=m,e[5]=K):K=e[5];const L=K;let f;e[6]!==t?(f=t("days"),e[6]=t,e[7]=f):f=e[7];let u;e[8]!==t?(u=t("hours"),e[8]=t,e[9]=u):u=e[9];let p;e[10]!==t?(p=t("minutes"),e[10]=t,e[11]=p):p=e[11];let x;e[12]!==t?(x=t("seconds"),e[12]=t,e[13]=x):x=e[13];let N;e[14]!==f||e[15]!==u||e[16]!==p||e[17]!==x?(N={days:f,hours:u,minutes:p,seconds:x},e[14]=f,e[15]=u,e[16]=p,e[17]=x,e[18]=N):N=e[18];const C=N;let y;e[19]!==t?(y=t("Expires after"),e[19]=t,e[20]=y):y=e[20];let S;e[21]!==c||e[22]!==y?(S=r(W,{className:"text-xs",htmlFor:c,children:y}),e[21]=c,e[22]=y,e[23]=S):S=e[23];let F;e[24]!==t?(F=t("No expiration"),e[24]=t,e[25]=F):F=e[25];let O;e[26]!==l||e[27]!==c||e[28]!==i||e[29]!==M||e[30]!==F||e[31]!==d?(O=r(re,{"aria-invalid":i,className:"flex-1","data-testid":d,id:c,inputMode:"numeric",onChange:M,placeholder:F,value:l}),e[26]=l,e[27]=c,e[28]=i,e[29]=M,e[30]=F,e[31]=d,e[32]=O):O=e[32];let V;e[33]!==t?(V=t("TTL unit"),e[33]=t,e[34]=V):V=e[34];const D=`${d}-unit`;let A;e[35]===Symbol.for("react.memo_cache_sentinel")?(A=r(Ve,{}),e[35]=A):A=e[35];let I;e[36]!==V||e[37]!==D?(I=r(Ie,{"aria-label":V,className:"w-[7.5rem]","data-testid":D,children:A}),e[36]=V,e[37]=D,e[38]=I):I=e[38];let s;e[39]!==C?(s=Ne.map(b=>r(Ke,{value:b.key,children:C[b.key]},b.key)),e[39]=C,e[40]=s):s=e[40];let h;e[41]!==s?(h=r(_e,{children:s}),e[41]=s,e[42]=h):h=e[42];let T;e[43]!==L||e[44]!==I||e[45]!==h||e[46]!==o?(T=w(Me,{onValueChange:L,value:o,children:[I,h]}),e[43]=L,e[44]=I,e[45]=h,e[46]=o,e[47]=T):T=e[47];let _;e[48]!==O||e[49]!==T?(_=w("div",{className:"flex gap-2",children:[O,T]}),e[48]=O,e[49]=T,e[50]=_):_=e[50];let E;e[51]!==n||e[52]!==i||e[53]!==t||e[54]!==d?(E=i?r("p",{className:"text-xs text-destructive","data-testid":`${d}-invalid`,children:t("TTL must be at least 60 seconds.")}):n!==void 0&&r("p",{className:"text-xs text-muted-foreground",children:n}),e[51]=n,e[52]=i,e[53]=t,e[54]=d,e[55]=E):E=e[55];let B;return e[56]!==_||e[57]!==E||e[58]!==S?(B=w("div",{className:"mb-3 grid gap-1",children:[S,_,E]}),e[56]=_,e[57]=E,e[58]=S,e[59]=B):B=e[59],B},Te=a=>{const e=te(36),{id:n,invalidTestId:c,onChange:i,testId:m,valid:d,value:t}=a,l=G();let v;e[0]!==t?(v=ge(t),e[0]=t,e[1]=v):v=e[1];const o=v;let g;e[2]!==l?(g=l("Metadata (JSON)"),e[2]=l,e[3]=g):g=e[3];let k;e[4]!==n||e[5]!==g?(k=r(W,{className:"text-xs",htmlFor:n,children:g}),e[4]=n,e[5]=g,e[6]=k):k=e[6];const M=`${m}-format`,K=o===void 0;let L;e[7]!==o||e[8]!==i?(L=()=>{o!==void 0&&i(o)},e[7]=o,e[8]=i,e[9]=L):L=e[9];let f;e[10]!==l?(f=l("Format JSON"),e[10]=l,e[11]=f):f=e[11];let u;e[12]!==M||e[13]!==K||e[14]!==L||e[15]!==f?(u=r(P,{"data-testid":M,disabled:K,onClick:L,size:"sm",variant:"outline",children:f}),e[12]=M,e[13]=K,e[14]=L,e[15]=f,e[16]=u):u=e[16];let p;e[17]!==k||e[18]!==u?(p=w("div",{className:"flex items-center justify-between gap-2",children:[k,u]}),e[17]=k,e[18]=u,e[19]=p):p=e[19];const x=!d;let N;e[20]!==i?(N=F=>{i(F.target.value)},e[20]=i,e[21]=N):N=e[21];let C;e[22]!==n||e[23]!==x||e[24]!==N||e[25]!==m||e[26]!==t?(C=r(ke,{"aria-invalid":x,className:"min-h-[4rem] font-mono text-xs","data-testid":m,id:n,onChange:N,value:t}),e[22]=n,e[23]=x,e[24]=N,e[25]=m,e[26]=t,e[27]=C):C=e[27];let y;e[28]!==c||e[29]!==l||e[30]!==d?(y=!d&&r("p",{className:"text-xs text-destructive","data-testid":c,children:l("Metadata must be valid JSON.")}),e[28]=c,e[29]=l,e[30]=d,e[31]=y):y=e[31];let S;return e[32]!==C||e[33]!==y||e[34]!==p?(S=w("div",{className:"mb-3 grid gap-1",children:[p,C,y]}),e[32]=C,e[33]=y,e[34]=p,e[35]=S):S=e[35],S},De={busy:!1,error:null,metadata:"",name:"",ttl:"",value:""},Je=(a,e)=>{switch(e.type){case"setField":return{...a,[e.field]:e.value};case"submitFailed":return{...a,busy:!1,error:e.error};case"submitStart":return{...a,busy:!0,error:null};default:return a}},Pe=a=>{const e=te(73),{namespace:n,onCancel:c,onCreated:i}=a,m=ee(),d=G(),[t,l]=le(Je,De);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 k=g;let M;e[4]!==o||e[5]!==t.busy||e[6]!==t.name||e[7]!==k?(M=t.name.trim()!==""&&o&&k&&!t.busy,e[4]=o,e[5]=t.busy,e[6]=t.name,e[7]=k,e[8]=M):M=e[8];const K=M;let L;e[9]!==K||e[10]!==m||e[11]!==n||e[12]!==i||e[13]!==t.metadata||e[14]!==t.name||e[15]!==t.ttl||e[16]!==t.value?(L=()=>{K&&(l({type:"submitStart"}),H((async()=>{try{await m.putKvValue(Se({metadata:t.metadata,ttl:t.ttl,value:t.value},t.name,n)),i()}catch($){l({error:R($),type:"submitFailed"})}})()))},e[9]=K,e[10]=m,e[11]=n,e[12]=i,e[13]=t.metadata,e[14]=t.name,e[15]=t.ttl,e[16]=t.value,e[17]=L):L=e[17];const f=L;let u;e[18]!==d?(u=d("Key name"),e[18]=d,e[19]=u):u=e[19];let p;e[20]!==u?(p=r(W,{className:"text-xs",htmlFor:"kv-create-name",children:u}),e[20]=u,e[21]=p):p=e[21];let x;e[22]===Symbol.for("react.memo_cache_sentinel")?(x=$=>{l({field:"name",type:"setField",value:$.target.value})},e[22]=x):x=e[22];let N;e[23]!==d?(N=d("Key name"),e[23]=d,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 y;e[28]!==p||e[29]!==C?(y=w("div",{className:"grid gap-1",children:[p,C]}),e[28]=p,e[29]=C,e[30]=y):y=e[30];let S;e[31]!==d?(S=d("Value"),e[31]=d,e[32]=S):S=e[32];let F;e[33]!==S?(F=r(W,{className:"text-xs",htmlFor:"kv-create-value",children:S}),e[33]=S,e[34]=F):F=e[34];let O;e[35]===Symbol.for("react.memo_cache_sentinel")?(O=$=>{l({field:"value",type:"setField",value:$.target.value})},e[35]=O):O=e[35];let V;e[36]!==t.value?(V=r(ke,{className:"min-h-[6rem] font-mono text-xs","data-testid":"kv-create-value",id:"kv-create-value",onChange:O,value:t.value}),e[36]=t.value,e[37]=V):V=e[37];let D;e[38]!==F||e[39]!==V?(D=w("div",{className:"grid gap-1",children:[F,V]}),e[38]=F,e[39]=V,e[40]=D):D=e[40];const A=!k;let I;e[41]===Symbol.for("react.memo_cache_sentinel")?(I=$=>{l({field:"ttl",type:"setField",value:$})},e[41]=I):I=e[41];let s;e[42]!==A?(s=r(we,{id:"kv-create-ttl",invalid:A,onChange:I,testId:"kv-create-ttl"}),e[42]=A,e[43]=s):s=e[43];let h;e[44]===Symbol.for("react.memo_cache_sentinel")?(h=$=>{l({field:"metadata",type:"setField",value:$})},e[44]=h):h=e[44];let T;e[45]!==o||e[46]!==t.metadata?(T=r(Te,{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]=T):T=e[47];const _=!K;let E;e[48]!==t.busy||e[49]!==d?(E=t.busy?d("Creating…"):d("Create key"),e[48]=t.busy,e[49]=d,e[50]=E):E=e[50];let B;e[51]!==f||e[52]!==_||e[53]!==E?(B=r(P,{"data-testid":"kv-create-submit",disabled:_,onClick:f,children:E}),e[51]=f,e[52]=_,e[53]=E,e[54]=B):B=e[54];const b=t.busy;let J;e[55]!==d?(J=d("Cancel"),e[55]=d,e[56]=J):J=e[56];let j;e[57]!==c||e[58]!==t.busy||e[59]!==J?(j=r(P,{"data-testid":"kv-create-cancel",disabled:b,onClick:c,variant:"outline",children:J}),e[57]=c,e[58]=t.busy,e[59]=J,e[60]=j):j=e[60];let z;e[61]!==B||e[62]!==j?(z=w("div",{className:"flex flex-wrap gap-2",children:[B,j]}),e[61]=B,e[62]=j,e[63]=z):z=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 Y;return e[66]!==y||e[67]!==D||e[68]!==s||e[69]!==T||e[70]!==z||e[71]!==U?(Y=w("div",{className:"grid gap-3 px-4 pb-4","data-testid":"kv-create-form",children:[y,D,s,T,z,U]}),e[66]=y,e[67]=D,e[68]=s,e[69]=T,e[70]=z,e[71]=U,e[72]=Y):Y=e[72],Y},$e={busy:"",editedMetadata:"",editedTtl:"",editedValue:"",loadError:null,loading:!0,value:null,writeError:null},je=(a,e)=>{switch(e.type){case"deleteStart":return{...a,busy:"deleting",writeError:null};case"editMetadata":return{...a,editedMetadata:e.value};case"editTtl":return{...a,editedTtl:e.value};case"editValue":return{...a,editedValue:e.value};case"loaded":return{...a,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{...a,loadError:e.error,loading:!1};case"saveOk":return{...a,busy:"",value:a.editedValue};case"saveStart":return{...a,busy:"saving",writeError:null};case"writeFailed":return{...a,busy:"",writeError:e.error};default:return a}},He=a=>{const e=te(67),{expiration:n,keyName:c,namespace:i,onDeleted:m}=a,d=ee(),t=G(),[l,v]=le(je,$e);let o,g;e[0]!==d||e[1]!==c||e[2]!==i?(o=()=>{const b={cancelled:!1};return H((async()=>{try{const J=await d.getKvValue({key:c,namespace:i});b.cancelled||v({metadata:J.metadata,type:"loaded",value:J.value})}catch(J){const j=J;b.cancelled||v({error:R(j),type:"loadFailed"})}})()),()=>{b.cancelled=!0}},g=[d,i,c],e[0]=d,e[1]=c,e[2]=i,e[3]=o,e[4]=g):(o=e[3],g=e[4]),ae(o,g);let k;e[5]===Symbol.for("react.memo_cache_sentinel")?(k=b=>{v({type:"editValue",value:b.target.value})},e[5]=k):k=e[5];const M=k;let K;e[6]===Symbol.for("react.memo_cache_sentinel")?(K=b=>{v({type:"editMetadata",value:b})},e[6]=K):K=e[6];const L=K;let f;e[7]!==l.editedValue?(f=ge(l.editedValue),e[7]=l.editedValue,e[8]=f):f=e[8];const u=f;let p;e[9]!==l.editedMetadata?(p=xe(l.editedMetadata),e[9]=l.editedMetadata,e[10]=p):p=e[10];const x=p;let N;e[11]!==l.editedTtl?(N=Ce(l.editedTtl),e[11]=l.editedTtl,e[12]=N):N=e[12];const C=N;let y;e[13]!==u?(y=()=>{u!==void 0&&v({type:"editValue",value:u})},e[13]=u,e[14]=y):y=e[14];const S=y;let F;e[15]!==d||e[16]!==n||e[17]!==c||e[18]!==x||e[19]!==i||e[20]!==l.editedMetadata||e[21]!==l.editedTtl||e[22]!==l.editedValue||e[23]!==t?(F=()=>{if(!x){v({error:t("Metadata must be valid JSON."),type:"writeFailed"});return}v({type:"saveStart"}),H((async()=>{try{await d.putKvValue(Se({metadata:l.editedMetadata,ttl:l.editedTtl,value:l.editedValue},c,i,n)),v({type:"saveOk"})}catch(b){v({error:R(b),type:"writeFailed"})}})())},e[15]=d,e[16]=n,e[17]=c,e[18]=x,e[19]=i,e[20]=l.editedMetadata,e[21]=l.editedTtl,e[22]=l.editedValue,e[23]=t,e[24]=F):F=e[24];const O=F;let V;e[25]!==d||e[26]!==c||e[27]!==i||e[28]!==m?(V=()=>{v({type:"deleteStart"}),H((async()=>{try{await d.deleteKvKey({key:c,namespace:i}),m(c)}catch(b){v({error:R(b),type:"writeFailed"})}})())},e[25]=d,e[26]=c,e[27]=i,e[28]=m,e[29]=V):V=e[29];const D=V;let A;e[30]!==c?(A=()=>{se(c)},e[30]=c,e[31]=A):A=e[31];let I;e[32]!==t?(I=t("Copy key"),e[32]=t,e[33]=I):I=e[33];let s;e[34]!==A||e[35]!==I?(s=r("div",{className:"mb-2 flex justify-end",children:r(P,{"data-testid":"kv-copy-key-btn",onClick:A,size:"sm",variant:"outline",children:I})}),e[34]=A,e[35]=I,e[36]=s):s=e[36];let h;e[37]!==l.loadError?(h=l.loadError!==null&&r("p",{className:"mb-2 text-sm text-destructive","data-testid":"kv-value-error",role:"alert",children:l.loadError}),e[37]=l.loadError,e[38]=h):h=e[38];let T;e[39]!==l.loading||e[40]!==t?(T=l.loading&&r("p",{className:"text-sm text-muted-foreground","data-testid":"kv-value-loading",children:t("Loading…")}),e[39]=l.loading,e[40]=t,e[41]=T):T=e[41];let _;e[42]!==u||e[43]!==x||e[44]!==D||e[45]!==S||e[46]!==O||e[47]!==l.busy||e[48]!==l.editedMetadata||e[49]!==l.editedValue||e[50]!==l.loading||e[51]!==l.value||e[52]!==l.writeError||e[53]!==t||e[54]!==C?(_=!l.loading&&l.value!==null&&w(be,{children:[w("div",{className:"mb-1 flex flex-wrap items-center gap-2",children:[r(W,{className:"text-xs",htmlFor:"kv-value-editor",children:t("Value")}),u!==void 0&&r(Le,{variant:"secondary",children:t("JSON")}),r("span",{className:"ml-auto text-xs tabular-nums text-muted-foreground","data-testid":"kv-value-size",children:Fe(Ae(l.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:M,value:l.editedValue}),w("div",{className:"mb-3 flex flex-wrap gap-2",children:[r(P,{"data-testid":"kv-format-btn",disabled:u===void 0,onClick:S,size:"sm",variant:"outline",children:t("Format JSON")}),r(P,{"data-testid":"kv-copy-value-btn",onClick:()=>{se(l.editedValue)},size:"sm",variant:"outline",children:t("Copy value")})]}),r(we,{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(Te,{id:"kv-metadata-editor",invalidTestId:"kv-metadata-invalid",onChange:L,testId:"kv-metadata-editor",valid:x,value:l.editedMetadata}),w("div",{className:"flex flex-wrap gap-2",children:[r(P,{"data-testid":"kv-save-btn",disabled:l.busy!==""||!x||!C,onClick:O,children:l.busy==="saving"?t("Saving…"):t("Save")}),r(P,{"data-testid":"kv-delete-btn",disabled:l.busy!=="",onClick:D,variant:"destructive",children:l.busy==="deleting"?t("Deleting…"):t("Delete")})]}),l.writeError!==null&&r("p",{className:"mt-2 text-sm text-destructive","data-testid":"kv-save-error",role:"alert",children:l.writeError})]}),e[42]=u,e[43]=x,e[44]=D,e[45]=S,e[46]=O,e[47]=l.busy,e[48]=l.editedMetadata,e[49]=l.editedValue,e[50]=l.loading,e[51]=l.value,e[52]=l.writeError,e[53]=t,e[54]=C,e[55]=_):_=e[55];let E;e[56]!==l.loadError||e[57]!==l.loading||e[58]!==l.value||e[59]!==t?(E=!l.loading&&l.value===null&&l.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]=l.loadError,e[57]=l.loading,e[58]=l.value,e[59]=t,e[60]=E):E=e[60];let B;return e[61]!==s||e[62]!==h||e[63]!==T||e[64]!==_||e[65]!==E?(B=w("div",{className:"px-4 pb-4","data-testid":"kv-value-section",children:[s,h,T,_,E]}),e[61]=s,e[62]=h,e[63]=T,e[64]=_,e[65]=E,e[66]=B):B=e[66],B},me=100,Re={appliedPrefix:"",bulk:[],bulkBusy:!1,bulkError:null,cursor:null,keys:null,listComplete:!1,loadError:null,loading:!1,prefixInput:"",reloadNonce:0,selectedKey:null},ze=(a,e)=>{switch(e.type){case"appendPage":return{...a,cursor:e.cursor,keys:[...a.keys??[],...e.keys],listComplete:e.listComplete,loading:!1};case"applyFilter":return{...a,appliedPrefix:a.prefixInput,bulk:[],bulkError:null,cursor:null,keys:null,listComplete:!1,selectedKey:null};case"bulkDeleted":{const n=new Set(e.deleted);return{...a,bulk:a.bulk.filter(c=>!n.has(c)),bulkBusy:!1,bulkError:e.error,keys:a.keys===null?null:a.keys.filter(c=>!n.has(c.name)),selectedKey:a.selectedKey!==null&&n.has(a.selectedKey)?null:a.selectedKey}}case"bulkDeleteStart":return{...a,bulkBusy:!0,bulkError:null};case"firstPage":return{...a,cursor:e.cursor,keys:e.keys,listComplete:e.listComplete,loading:!1};case"keyDeleted":return{...a,bulk:a.bulk.filter(n=>n!==e.name),keys:a.keys===null?null:a.keys.filter(n=>n.name!==e.name),selectedKey:null};case"loadFailed":return{...a,loadError:e.error,loading:!1};case"loadStart":return{...a,loadError:null,loading:!0};case"prefixInput":return{...a,prefixInput:e.value};case"reload":return{...a,bulk:[],bulkError:null,reloadNonce:a.reloadNonce+1,selectedKey:null};case"selectKey":return{...a,selectedKey:e.name};case"toggleAllBulk":return{...a,bulk:e.names};case"toggleBulk":return{...a,bulk:a.bulk.includes(e.name)?a.bulk.filter(n=>n!==e.name):[...a.bulk,e.name]};default:return a}},Ue=({namespace:a})=>{const e=ee(),n=G(),[c,i]=le(ze,Re),{appliedPrefix:m,bulk:d,bulkBusy:t,bulkError:l,cursor:v,keys:o,listComplete:g,loadError:k,loading:M,prefixInput:K,reloadNonce:L,selectedKey:f}=c,[u,p]=Z(!1);ae(()=>{const s={cancelled:!1};return H((async()=>{i({type:"loadStart"});try{const h=await e.listKvKeys({limit:me,namespace:a,prefix:m===""?void 0:m});s.cancelled||i({cursor:h.cursor??null,keys:h.keys,listComplete:h.listComplete,type:"firstPage"})}catch(h){s.cancelled||i({error:R(h),type:"loadFailed"})}})()),()=>{s.cancelled=!0}},[e,a,m,L]);const x=s=>{i({type:"prefixInput",value:s.target.value})},N=()=>{i({type:"applyFilter"})},C=s=>{i({name:s.currentTarget.dataset.key??null,type:"selectKey"})},y=()=>{v!==null&&(i({type:"loadStart"}),H((async()=>{try{const s=await e.listKvKeys({cursor:v,limit:me,namespace:a,prefix:m===""?void 0:m});i({cursor:s.cursor??null,keys:s.keys,listComplete:s.listComplete,type:"appendPage"})}catch(s){i({error:R(s),type:"loadFailed"})}})()))},S=s=>{i({name:s,type:"keyDeleted"})},F=s=>{i({name:s,type:"toggleBulk"})},O=s=>{i({names:s&&o!==null?o.map(h=>h.name):[],type:"toggleAllBulk"})},V=()=>{if(d.length===0)return;const s=[...d];i({type:"bulkDeleteStart"}),H((async()=>{const h=await Promise.allSettled(s.map(E=>e.deleteKvKey({key:E,namespace:a}))),T=s.filter((E,B)=>h[B]?.status==="fulfilled"),_=s.length-T.length;i({deleted:T,error:_>0?n("Failed to delete {count} keys.",{count:_}):null,type:"bulkDeleted"})})())},D=()=>{p(!1),i({type:"reload"})},A=o!==null&&o.length>0&&d.length===o.length,I=new Set(d);return w(be,{children:[w("section",{className:"border border-border bg-card p-3","data-testid":"kv-keys-section",children:[w("div",{className:"mb-3 flex flex-wrap items-center gap-2",children:[r(re,{"aria-label":n("Filter keys by prefix"),className:"min-w-[16rem] flex-1","data-testid":"kv-prefix-input",onChange:x,placeholder:n("Filter by prefix…"),value:K}),r(P,{"data-testid":"kv-filter-btn",disabled:M,onClick:N,children:n("Filter")}),r(P,{"data-testid":"kv-new-key-btn",onClick:()=>{p(s=>!s)},variant:"outline",children:n("New key")}),d.length>0&&r(P,{"data-testid":"kv-bulk-delete-btn",disabled:t,onClick:V,variant:"destructive",children:t?n("Deleting…"):n("Delete {count}",{count:d.length})})]}),l!==null&&r("p",{className:"mb-2 text-sm text-destructive","data-testid":"kv-bulk-error",role:"alert",children:l}),k!==null&&r("p",{className:"text-sm text-destructive","data-testid":"kv-keys-error",role:"alert",children:k}),o!==null&&o.length===0&&!M&&r("p",{className:"text-sm text-muted-foreground","data-testid":"kv-no-keys",children:n("No keys.")}),o!==null&&o.length>0&&r(ve,{className:"overflow-hidden py-0",children:r(fe,{className:"px-0",children:w(pe,{"data-testid":"kv-key-table",children:[r(he,{children:w(X,{children:[r(q,{className:"w-10",children:r(ne,{"aria-label":n("Select all"),checked:A,"data-testid":"kv-select-all",onCheckedChange:O})}),r(q,{children:n("Key")}),r(q,{children:n("Expiration")})]})}),r(ye,{children:o.map(s=>w(X,{className:s.name===f?"border-l-2 border-l-royal-amethyst bg-muted/50":"cursor-pointer","data-key":s.name,"data-testid":`kv-key-row-${s.name}`,onClick:C,children:[r(Q,{onClick:h=>{h.stopPropagation()},children:r(ne,{"aria-label":n("Select {name}",{name:s.name}),checked:I.has(s.name),"data-testid":`kv-select-${s.name}`,onCheckedChange:()=>{F(s.name)}})}),r(Q,{className:"font-mono text-xs",children:s.name}),r(Q,{className:"tabular-nums text-xs",children:Oe(s.expiration)})]},s.name))})]})})}),!g&&v!==null&&r("div",{className:"mt-2",children:r(P,{"data-testid":"kv-load-more",disabled:M,onClick:y,variant:"outline",children:n(M?"Loading…":"Load more")})})]}),r(ie,{onOpenChange:s=>{s||p(!1)},open:u,children:w(de,{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:n("New key")})}),r(Pe,{namespace:a,onCancel:()=>{p(!1)},onCreated:D})]})}),r(ie,{onOpenChange:s=>{s||i({name:null,type:"selectKey"})},open:f!==null,children:w(de,{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:f})}),f!==null&&r(He,{expiration:o?.find(s=>s.name===f)?.expiration,keyName:f,namespace:a,onDeleted:S},`${a}:${f}`)]})})]})},ut=({loadNamespaces:a}={})=>{const e=ee(),n=G(),[c,i]=Z(null),[m,d]=Z(null),[t,l]=Z(null);ae(()=>{const o={cancelled:!1};return H((async()=>{try{const g=await(a??(()=>e.listKvNamespaces()))();o.cancelled||(i(g),d(null),l(k=>k??g[0]?.binding??null))}catch(g){o.cancelled||(i(null),d(R(g)))}})()),()=>{o.cancelled=!0}},[e,a]);const v=o=>{l(o.currentTarget.dataset.ns??null)};return w("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(Ee,{description:n("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:n("No KV namespaces.")}),c!==null&&c.length>0&&r(ve,{className:"overflow-hidden py-0",children:r(fe,{className:"px-0",children:w(pe,{"data-testid":"kv-namespace-table",children:[r(he,{children:r(X,{children:r(q,{children:n("Namespace")})})}),r(ye,{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{ut as KvBrowser};
@@ -1 +1 @@
1
- import{c as O}from"react/compiler-runtime";import{useMemo as N,useState as P}from"react";import{useT as R}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{c as w}from"../packem_shared/utils-bhneXptQ.js";import{MigrationsPanel as H}from"../packem_shared/MigrationsPanel-CF73xHke.js";import{useNavigate as V,useSearch as Q}from"@tanstack/react-router";import{E as G}from"../packem_shared/error-alert-CKqB2CiN.js";import{E as K}from"../packem_shared/empty-state-B939z6K2.js";import{u as T}from"../packem_shared/use-admin-query-DV9xmFl8.js";import{ADMIN_FUNCTIONS as I}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{i as U,f as _}from"../packem_shared/internal-7bgd8inO.js";import{S as B}from"../packem_shared/schema-diagram-DLhppqVE.js";import{jsx as c,jsxs as x}from"react/jsx-runtime";const M=1,$=t=>typeof t=="object"&&t!==null,L=t=>$(t)&&$(t.fields)&&$(t.indexes)&&$(t.relations)&&typeof t.shardMode=="string",W=t=>{if(t===void 0||t.trim()==="")return{status:"absent"};let e;try{e=JSON.parse(t)}catch(s){return{error:`baseline is not valid JSON: ${s instanceof Error?s.message:String(s)}`,status:"invalid"}}if(!$(e)||e.version!==M||!$(e.tables))return{error:`baseline is malformed or written by an incompatible version (expected version ${String(M)})`,status:"invalid"};for(const[s,a]of Object.entries(e.tables))if(!L(a))return{error:`baseline table "${s}" 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:M},status:"ok"}},z=(t,e)=>t.unique===e.unique&&t.fields.length===e.fields.length&&t.fields.every((n,s)=>n===e.fields[s]),X=(t,e,n,s)=>{const a=[];return n.kind!==s.kind&&a.push({severity:"breaking",summary:`field ${t}.${e} changed type: ${n.kind} → ${s.kind} — add a data migration to convert existing values`,table:t,scope:"table",type:"changedFieldKind"}),n.optional&&!s.optional?a.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"}):!n.optional&&s.optional&&a.push({scope:"table",severity:"safe",summary:`field ${t}.${e} became optional`,table:t,type:"fieldRequiredToOptional"}),a},Y=(t,e,n)=>n.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"},Z=(t,e,n,s)=>{for(const[a,o]of Object.entries(n.fields)){const i=e.fields[a];i===void 0?s.push(Y(t,a,o)):s.push(...X(t,a,i,o))}for(const a of Object.keys(e.fields))n.fields[a]===void 0&&s.push({severity:"breaking",summary:`removed field ${t}.${a} — add a data migration if stored data must be cleaned up`,table:t,scope:"table",type:"removedField"})},ee=(t,e,n,s)=>{for(const[a,o]of Object.entries(n.indexes)){const i=e.indexes[a];if(i===void 0){s.push({scope:"table",severity:"safe",summary:`added index ${a} on ${t}`,table:t,type:"addedIndex"});continue}z(i,o)||s.push({severity:"breaking",summary:`index ${a} on ${t} changed shape — a query may have relied on the old index`,table:t,scope:"table",type:"changedIndex"})}for(const a of Object.keys(e.indexes))n.indexes[a]===void 0&&s.push({severity:"breaking",summary:`removed index ${a} on ${t} — a query that used \`.withIndex("${a}")\` would break`,table:t,scope:"table",type:"removedIndex"})},te=(t,e,n,s)=>{for(const a of Object.keys(n.relations))e.relations[a]===void 0&&s.push({scope:"schema",severity:"safe",summary:`added relation ${t}.${a}`,table:t,type:"addedRelation"});for(const a of Object.keys(e.relations))n.relations[a]===void 0&&s.push({scope:"schema",severity:"breaking",summary:`removed relation ${t}.${a}`,table:t,type:"removedRelation"})},se=(t,e,n,s)=>{e.shardMode!==n.shardMode&&s.push({severity:"breaking",summary:`table ${t} changed shard mode: ${e.shardMode} → ${n.shardMode} — its physical storage moves; add a data migration / re-shard plan`,table:t,scope:"table",type:"changedShardMode"}),Z(t,e,n,s),ee(t,e,n,s),te(t,e,n,s)},ne=(t,e)=>{const n=[],s=t?.tables??{};for(const[a,o]of Object.entries(e.tables)){const i=s[a];if(i===void 0){n.push({scope:"table",severity:"safe",summary:`added table ${a}`,table:a,type:"addedTable"});continue}se(a,i,o,n)}for(const a of Object.keys(s))e.tables[a]===void 0&&n.push({scope:"table",severity:"breaking",summary:`removed table ${a} — add a data migration if its data must be archived/cleaned up`,table:a,type:"removedTable"});if(t!==void 0&&t.jurisdiction!==e.jurisdiction){const a=t.jurisdiction??"(none)",o=e.jurisdiction??"(none)";n.push({scope:"schema",severity:"breaking",summary:`Durable Object jurisdiction changed from ${a} 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:n}},A=t=>Object.entries(t.fields).map(([e,n])=>({name:e,optional:n.optional,ref:Object.values(t.relations).find(s=>s.field===e&&s.kind==="one")?.table,type:n.kind})),C=(t,e)=>{const n={},s=t?.fields??{},a=e?.fields??{};for(const[o,i]of Object.entries(a)){const r=s[o];r===void 0?n[o]=t===void 0?"unchanged":"added":n[o]=r.kind===i.kind&&r.optional===i.optional?"unchanged":"changed"}for(const o of Object.keys(s))a[o]===void 0&&(n[o]="removed");return n},ae=(t,e)=>{const{changes:n}=ne(t,e),s=new Set(n.filter(i=>i.scope==="table"&&i.table!==void 0).map(i=>i.table)),a=[],o=(i,r)=>i?"added":s.has(r)?"changed":"context";for(const[i,r]of Object.entries(e.tables)){const d=t?.tables[i],m=o(d===void 0,i);a.push({columns:A(r),fieldStatus:C(d,r),name:i,shardMode:r.shardMode,status:m})}for(const[i,r]of Object.entries(t?.tables??{}))e.tables[i]===void 0&&a.push({columns:A(r),fieldStatus:C(r,void 0),name:i,shardMode:r.shardMode,status:"removed"});return a.sort((i,r)=>i.name.localeCompare(r.name)),{breakingCount:n.filter(i=>i.severity==="breaking").length,changes:n,tables:a}},E=t=>{const e=W(t);return e.status==="ok"?e.snapshot:void 0},ie={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"},oe=t=>t==="global"?"global":"shard",re=t=>{const e=O(24),{appliedAt:n,hash:s,onSelect:a,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 d;e[0]!==r?(d=w("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]=d):d=e[1];const m=`sh-version-${s}`;let h;e[2]!==s||e[3]!==a?(h=()=>{a(s)},e[2]=s,e[3]=a,e[4]=h):h=e[4];let u;e[5]!==i?(u=x("span",{className:"font-mono text-[13px] tabular-nums",children:["v",i]}),e[5]=i,e[6]=u):u=e[6];let g;e[7]!==s?(g=s.slice(0,7),e[7]=s,e[8]=g):g=e[8];let p;e[9]!==g?(p=c("span",{className:"ms-auto font-mono text-[10px] tracking-wider text-muted-foreground/70 uppercase",children:g}),e[9]=g,e[10]=p):p=e[10];let f;e[11]!==u||e[12]!==p?(f=x("span",{className:"flex w-full items-baseline gap-2",children:[u,p]}),e[11]=u,e[12]=p,e[13]=f):f=e[13];let b;e[14]!==n?(b=U(n),e[14]=n,e[15]=b):b=e[15];let v;e[16]!==b?(v=c("span",{className:"font-mono text-[10px] tracking-wide text-muted-foreground/70",children:b}),e[16]=b,e[17]=v):v=e[17];let y;return e[18]!==v||e[19]!==d||e[20]!==m||e[21]!==h||e[22]!==f?(y=c("li",{children:x("button",{className:d,"data-testid":m,onClick:h,type:"button",children:[f,v]})}),e[18]=v,e[19]=d,e[20]=m,e[21]=h,e[22]=f,e[23]=y):y=e[23],y},de=t=>{const e=O(26),{breaking:n,count:s,first:a}=t,o=R();if(a){let p;e[0]!==s?(p=c("span",{className:"text-3xl leading-none font-light tracking-tight tabular-nums",children:s}),e[0]=s,e[1]=p):p=e[1];let f;e[2]!==o?(f=o("tables"),e[2]=o,e[3]=f):f=e[3];let b;e[4]!==f?(b=c("span",{className:"font-mono text-[11px] tracking-widest text-muted-foreground uppercase",children:f}),e[4]=f,e[5]=b):b=e[5];let v;return e[6]!==p||e[7]!==b?(v=x("div",{className:"flex items-baseline gap-3","data-testid":"sh-summary",children:[p,b]}),e[6]=p,e[7]=b,e[8]=v):v=e[8],v}const i=n>0&&"text-destructive";let r;e[9]!==i?(r=w("text-3xl leading-none font-light tracking-tight tabular-nums",i),e[9]=i,e[10]=r):r=e[10];let d;e[11]!==s||e[12]!==r?(d=c("span",{className:r,children:s}),e[11]=s,e[12]=r,e[13]=d):d=e[13];let m;e[14]!==s||e[15]!==o?(m=o(s===1?"change":"changes"),e[14]=s,e[15]=o,e[16]=m):m=e[16];let h;e[17]!==m?(h=c("span",{className:"font-mono text-[11px] tracking-widest text-muted-foreground uppercase",children:m}),e[17]=m,e[18]=h):h=e[18];let u;e[19]!==n||e[20]!==o?(u=n>0&&x("span",{className:"font-mono text-[11px] tracking-widest text-destructive uppercase",children:["· ",o("{count} breaking",{count:n})]}),e[19]=n,e[20]=o,e[21]=u):u=e[21];let g;return e[22]!==d||e[23]!==h||e[24]!==u?(g=x("div",{className:"flex items-baseline gap-3","data-testid":"sh-summary",children:[d,h,u]}),e[22]=d,e[23]=h,e[24]=u,e[25]=g):g=e[25],g},D={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"}},le=(t,e)=>{const n=`${D[t.type].action} ${e} `;return t.summary.startsWith(n)?t.summary.slice(n.length):t.summary},ce=t=>{const e=new Map;for(const s of t){const a=s.table??"",o=e.get(a);o===void 0?e.set(a,[s]):o.push(s)}const n=[...e].map(([s,a])=>({changes:a,table:s}));return[...n.filter(s=>s.table!==""),...n.filter(s=>s.table==="")]},me=t=>{const e=O(2),{children:n}=t;let s;return e[0]!==n?(s=c("div",{className:"px-4 pt-4 pb-2 font-mono text-[10px] tracking-widest text-muted-foreground/70 uppercase",children:n}),e[0]=n,e[1]=s):s=e[1],s},fe=({pane:t,shardKey:e=""})=>{const n=R(),s=V(),o=Q({strict:!1}).version,i=l=>{_(s({search:{version:l},to:"/migrations"}))},r=T(I.schemaHistory,{},{shardKey:e}),d=r.data?.versions??[],m=o!==void 0&&d.some(l=>l.hash===o)?o:d[0]?.hash,h=d.findIndex(l=>l.hash===m),u=h===-1?void 0:d[h+1]?.hash,g=T(I.schemaVersion,{hash:m??""},{enabled:m!==void 0,shardKey:e}),p=T(I.schemaVersion,{hash:u??""},{enabled:u!==void 0,shardKey:e}),f=N(()=>{const l=E(g.data?.version?.snapshotJson);if(l!==void 0)return ae(E(p.data?.version?.snapshotJson),l)},[g.data,p.data]),b=N(()=>(f?.tables??[]).map(l=>({columns:l.columns,name:l.name,tier:oe(l.shardMode)})),[f]),v=N(()=>{const l={};for(const S of f?.tables??[])l[S.name]=ie[S.status];return l},[f]);if(r.error!==null)return c(G,{error:r.errorSource,testId:"sh-error"});if(d.length===0)return c(K,{description:n("Each distinct schema shape this shard runs is recorded here, so you can see what changed and when."),testId:"sh-empty",title:n("No schema versions recorded yet.")});const y=f?.changes??[];return x("div",{className:"flex min-h-0 flex-1 gap-4","data-testid":"lunora-schema-history",children:[x("nav",{className:"flex w-56 shrink-0 flex-col overflow-hidden border-e border-border","data-testid":"sh-timeline-rail",children:[c(me,{children:n("Schema versions")}),c("ul",{className:"min-h-0 flex-1 overflow-y-auto","data-testid":"sh-timeline",children:d.map(l=>c(re,{appliedAt:l.appliedAt,hash:l.hash,onSelect:i,selected:l.hash===m,seq:l.seq},l.hash))})]}),x("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col gap-4 pe-1 pt-4",children:[c(de,{breaking:f?.breakingCount??0,count:u===void 0?b.length:y.length,first:u===void 0}),t==="diagram"?c("div",{className:"flex min-h-0 flex-1 flex-col",children:c(B,{fill:!0,nodeClasses:v,tables:b,testIdPrefix:"sh"})}):c("div",{className:"min-h-0 flex-1 overflow-y-auto","data-testid":"sh-changes",children:ce(y).map(l=>{const S=(f?.tables??[]).find(k=>k.name===l.table);return x("section",{className:"mb-6",children:[x("div",{className:"flex items-baseline gap-3 border-b border-border/60 pb-1.5",children:[c("span",{className:"font-mono text-[13px] text-foreground",children:l.table===""?n("schema"):l.table}),S!==void 0&&c("span",{className:"font-mono text-[10px] tracking-widest text-muted-foreground/70 tabular-nums uppercase",children:n("{count} columns",{count:S.columns.length})}),l.changes.length>1&&c("span",{className:"ms-auto font-mono text-[10px] tracking-widest text-muted-foreground/70 tabular-nums",children:l.changes.length})]}),c("ul",{children:l.changes.map(k=>{const{action:J,kind:q}=D[k.type],j=k.severity==="breaking",F=le(k,q);return x("li",{className:"flex items-baseline gap-4 border-s-2 py-1.5 ps-3 transition-colors hover:bg-accent/30",children:[c("span",{"aria-hidden":"true",className:w("-ms-3 h-3 w-0.5 shrink-0 self-center",j?"bg-destructive":"bg-transparent")}),x("span",{className:"w-44 shrink-0 font-mono text-[10px] tracking-widest text-muted-foreground/70 uppercase",children:[n(J)," ",q]}),F!==l.table&&c("span",{className:w("min-w-0 font-mono text-[13px]",j?"text-destructive":"text-foreground"),children:F}),j&&c("span",{className:"ms-auto shrink-0 font-mono text-[10px] tracking-widest text-destructive uppercase",children:n("breaking")})]},`${k.type}-${k.summary}`)})})]},l.table)})})]})]})},ue=t=>w("-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"),Ne=t=>{const e=O(11),{initialShardKey:n}=t,s=R(),[a,o]=P("diagram");let i;e[0]!==a?(i=(u,g,p,f)=>x("button",{"aria-selected":a===u,className:ue(a===u),"data-testid":p,onClick:()=>{o(u)},role:"tab",type:"button",children:[g,f!==void 0&&c("span",{className:"ms-2 tabular-nums text-muted-foreground/70",children:f})]}),e[0]=a,e[1]=i):i=e[1];const r=i;let d;e[2]!==s||e[3]!==r?(d=x("div",{className:"flex shrink-0 items-center gap-1 border-b border-border px-3","data-testid":"mg-panes",role:"tablist",children:[r("diagram",s("Diagram"),"mg-pane-diagram"),r("changes",s("Changes"),"mg-pane-changes"),r("data",s("Data migrations"),"mg-pane-data")]}),e[2]=s,e[3]=r,e[4]=d):d=e[4];let m;e[5]!==n||e[6]!==a?(m=c("div",{className:"flex min-h-0 flex-1 flex-col",children:a==="data"?c("div",{className:"min-h-0 flex-1 overflow-y-auto px-4",children:c(H,{initialShardKey:n})}):c(fe,{pane:a,shardKey:n})}),e[5]=n,e[6]=a,e[7]=m):m=e[7];let h;return e[8]!==d||e[9]!==m?(h=x("div",{className:"flex min-h-0 flex-1 flex-col pt-4","data-testid":"lunora-migrations-route",children:[d,m]}),e[8]=d,e[9]=m,e[10]=h):h=e[10],h};export{Ne as default};
1
+ import{c as O}from"react/compiler-runtime";import{useMemo as N,useState as P}from"react";import{useT as R}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{c as w}from"../packem_shared/utils-bhneXptQ.js";import{MigrationsPanel as H}from"../packem_shared/MigrationsPanel-CLRWwPyL.js";import{useNavigate as V,useSearch as Q}from"@tanstack/react-router";import{E as G}from"../packem_shared/error-alert-CKqB2CiN.js";import{E as K}from"../packem_shared/empty-state-B939z6K2.js";import{u as T}from"../packem_shared/use-admin-query-DV9xmFl8.js";import{ADMIN_FUNCTIONS as I}from"../packem_shared/ADMIN_FUNCTIONS-B6z7VLYt.js";import{i as U,f as _}from"../packem_shared/internal-7bgd8inO.js";import{S as B}from"../packem_shared/schema-diagram-DLhppqVE.js";import{jsx as c,jsxs as x}from"react/jsx-runtime";const M=1,$=t=>typeof t=="object"&&t!==null,L=t=>$(t)&&$(t.fields)&&$(t.indexes)&&$(t.relations)&&typeof t.shardMode=="string",W=t=>{if(t===void 0||t.trim()==="")return{status:"absent"};let e;try{e=JSON.parse(t)}catch(s){return{error:`baseline is not valid JSON: ${s instanceof Error?s.message:String(s)}`,status:"invalid"}}if(!$(e)||e.version!==M||!$(e.tables))return{error:`baseline is malformed or written by an incompatible version (expected version ${String(M)})`,status:"invalid"};for(const[s,a]of Object.entries(e.tables))if(!L(a))return{error:`baseline table "${s}" 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:M},status:"ok"}},z=(t,e)=>t.unique===e.unique&&t.fields.length===e.fields.length&&t.fields.every((n,s)=>n===e.fields[s]),X=(t,e,n,s)=>{const a=[];return n.kind!==s.kind&&a.push({severity:"breaking",summary:`field ${t}.${e} changed type: ${n.kind} → ${s.kind} — add a data migration to convert existing values`,table:t,scope:"table",type:"changedFieldKind"}),n.optional&&!s.optional?a.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"}):!n.optional&&s.optional&&a.push({scope:"table",severity:"safe",summary:`field ${t}.${e} became optional`,table:t,type:"fieldRequiredToOptional"}),a},Y=(t,e,n)=>n.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"},Z=(t,e,n,s)=>{for(const[a,o]of Object.entries(n.fields)){const i=e.fields[a];i===void 0?s.push(Y(t,a,o)):s.push(...X(t,a,i,o))}for(const a of Object.keys(e.fields))n.fields[a]===void 0&&s.push({severity:"breaking",summary:`removed field ${t}.${a} — add a data migration if stored data must be cleaned up`,table:t,scope:"table",type:"removedField"})},ee=(t,e,n,s)=>{for(const[a,o]of Object.entries(n.indexes)){const i=e.indexes[a];if(i===void 0){s.push({scope:"table",severity:"safe",summary:`added index ${a} on ${t}`,table:t,type:"addedIndex"});continue}z(i,o)||s.push({severity:"breaking",summary:`index ${a} on ${t} changed shape — a query may have relied on the old index`,table:t,scope:"table",type:"changedIndex"})}for(const a of Object.keys(e.indexes))n.indexes[a]===void 0&&s.push({severity:"breaking",summary:`removed index ${a} on ${t} — a query that used \`.withIndex("${a}")\` would break`,table:t,scope:"table",type:"removedIndex"})},te=(t,e,n,s)=>{for(const a of Object.keys(n.relations))e.relations[a]===void 0&&s.push({scope:"schema",severity:"safe",summary:`added relation ${t}.${a}`,table:t,type:"addedRelation"});for(const a of Object.keys(e.relations))n.relations[a]===void 0&&s.push({scope:"schema",severity:"breaking",summary:`removed relation ${t}.${a}`,table:t,type:"removedRelation"})},se=(t,e,n,s)=>{e.shardMode!==n.shardMode&&s.push({severity:"breaking",summary:`table ${t} changed shard mode: ${e.shardMode} → ${n.shardMode} — its physical storage moves; add a data migration / re-shard plan`,table:t,scope:"table",type:"changedShardMode"}),Z(t,e,n,s),ee(t,e,n,s),te(t,e,n,s)},ne=(t,e)=>{const n=[],s=t?.tables??{};for(const[a,o]of Object.entries(e.tables)){const i=s[a];if(i===void 0){n.push({scope:"table",severity:"safe",summary:`added table ${a}`,table:a,type:"addedTable"});continue}se(a,i,o,n)}for(const a of Object.keys(s))e.tables[a]===void 0&&n.push({scope:"table",severity:"breaking",summary:`removed table ${a} — add a data migration if its data must be archived/cleaned up`,table:a,type:"removedTable"});if(t!==void 0&&t.jurisdiction!==e.jurisdiction){const a=t.jurisdiction??"(none)",o=e.jurisdiction??"(none)";n.push({scope:"schema",severity:"breaking",summary:`Durable Object jurisdiction changed from ${a} 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:n}},A=t=>Object.entries(t.fields).map(([e,n])=>({name:e,optional:n.optional,ref:Object.values(t.relations).find(s=>s.field===e&&s.kind==="one")?.table,type:n.kind})),C=(t,e)=>{const n={},s=t?.fields??{},a=e?.fields??{};for(const[o,i]of Object.entries(a)){const r=s[o];r===void 0?n[o]=t===void 0?"unchanged":"added":n[o]=r.kind===i.kind&&r.optional===i.optional?"unchanged":"changed"}for(const o of Object.keys(s))a[o]===void 0&&(n[o]="removed");return n},ae=(t,e)=>{const{changes:n}=ne(t,e),s=new Set(n.filter(i=>i.scope==="table"&&i.table!==void 0).map(i=>i.table)),a=[],o=(i,r)=>i?"added":s.has(r)?"changed":"context";for(const[i,r]of Object.entries(e.tables)){const d=t?.tables[i],m=o(d===void 0,i);a.push({columns:A(r),fieldStatus:C(d,r),name:i,shardMode:r.shardMode,status:m})}for(const[i,r]of Object.entries(t?.tables??{}))e.tables[i]===void 0&&a.push({columns:A(r),fieldStatus:C(r,void 0),name:i,shardMode:r.shardMode,status:"removed"});return a.sort((i,r)=>i.name.localeCompare(r.name)),{breakingCount:n.filter(i=>i.severity==="breaking").length,changes:n,tables:a}},E=t=>{const e=W(t);return e.status==="ok"?e.snapshot:void 0},ie={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"},oe=t=>t==="global"?"global":"shard",re=t=>{const e=O(24),{appliedAt:n,hash:s,onSelect:a,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 d;e[0]!==r?(d=w("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]=d):d=e[1];const m=`sh-version-${s}`;let h;e[2]!==s||e[3]!==a?(h=()=>{a(s)},e[2]=s,e[3]=a,e[4]=h):h=e[4];let u;e[5]!==i?(u=x("span",{className:"font-mono text-[13px] tabular-nums",children:["v",i]}),e[5]=i,e[6]=u):u=e[6];let g;e[7]!==s?(g=s.slice(0,7),e[7]=s,e[8]=g):g=e[8];let p;e[9]!==g?(p=c("span",{className:"ms-auto font-mono text-[10px] tracking-wider text-muted-foreground/70 uppercase",children:g}),e[9]=g,e[10]=p):p=e[10];let f;e[11]!==u||e[12]!==p?(f=x("span",{className:"flex w-full items-baseline gap-2",children:[u,p]}),e[11]=u,e[12]=p,e[13]=f):f=e[13];let b;e[14]!==n?(b=U(n),e[14]=n,e[15]=b):b=e[15];let v;e[16]!==b?(v=c("span",{className:"font-mono text-[10px] tracking-wide text-muted-foreground/70",children:b}),e[16]=b,e[17]=v):v=e[17];let y;return e[18]!==v||e[19]!==d||e[20]!==m||e[21]!==h||e[22]!==f?(y=c("li",{children:x("button",{className:d,"data-testid":m,onClick:h,type:"button",children:[f,v]})}),e[18]=v,e[19]=d,e[20]=m,e[21]=h,e[22]=f,e[23]=y):y=e[23],y},de=t=>{const e=O(26),{breaking:n,count:s,first:a}=t,o=R();if(a){let p;e[0]!==s?(p=c("span",{className:"text-3xl leading-none font-light tracking-tight tabular-nums",children:s}),e[0]=s,e[1]=p):p=e[1];let f;e[2]!==o?(f=o("tables"),e[2]=o,e[3]=f):f=e[3];let b;e[4]!==f?(b=c("span",{className:"font-mono text-[11px] tracking-widest text-muted-foreground uppercase",children:f}),e[4]=f,e[5]=b):b=e[5];let v;return e[6]!==p||e[7]!==b?(v=x("div",{className:"flex items-baseline gap-3","data-testid":"sh-summary",children:[p,b]}),e[6]=p,e[7]=b,e[8]=v):v=e[8],v}const i=n>0&&"text-destructive";let r;e[9]!==i?(r=w("text-3xl leading-none font-light tracking-tight tabular-nums",i),e[9]=i,e[10]=r):r=e[10];let d;e[11]!==s||e[12]!==r?(d=c("span",{className:r,children:s}),e[11]=s,e[12]=r,e[13]=d):d=e[13];let m;e[14]!==s||e[15]!==o?(m=o(s===1?"change":"changes"),e[14]=s,e[15]=o,e[16]=m):m=e[16];let h;e[17]!==m?(h=c("span",{className:"font-mono text-[11px] tracking-widest text-muted-foreground uppercase",children:m}),e[17]=m,e[18]=h):h=e[18];let u;e[19]!==n||e[20]!==o?(u=n>0&&x("span",{className:"font-mono text-[11px] tracking-widest text-destructive uppercase",children:["· ",o("{count} breaking",{count:n})]}),e[19]=n,e[20]=o,e[21]=u):u=e[21];let g;return e[22]!==d||e[23]!==h||e[24]!==u?(g=x("div",{className:"flex items-baseline gap-3","data-testid":"sh-summary",children:[d,h,u]}),e[22]=d,e[23]=h,e[24]=u,e[25]=g):g=e[25],g},D={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"}},le=(t,e)=>{const n=`${D[t.type].action} ${e} `;return t.summary.startsWith(n)?t.summary.slice(n.length):t.summary},ce=t=>{const e=new Map;for(const s of t){const a=s.table??"",o=e.get(a);o===void 0?e.set(a,[s]):o.push(s)}const n=[...e].map(([s,a])=>({changes:a,table:s}));return[...n.filter(s=>s.table!==""),...n.filter(s=>s.table==="")]},me=t=>{const e=O(2),{children:n}=t;let s;return e[0]!==n?(s=c("div",{className:"px-4 pt-4 pb-2 font-mono text-[10px] tracking-widest text-muted-foreground/70 uppercase",children:n}),e[0]=n,e[1]=s):s=e[1],s},fe=({pane:t,shardKey:e=""})=>{const n=R(),s=V(),o=Q({strict:!1}).version,i=l=>{_(s({search:{version:l},to:"/migrations"}))},r=T(I.schemaHistory,{},{shardKey:e}),d=r.data?.versions??[],m=o!==void 0&&d.some(l=>l.hash===o)?o:d[0]?.hash,h=d.findIndex(l=>l.hash===m),u=h===-1?void 0:d[h+1]?.hash,g=T(I.schemaVersion,{hash:m??""},{enabled:m!==void 0,shardKey:e}),p=T(I.schemaVersion,{hash:u??""},{enabled:u!==void 0,shardKey:e}),f=N(()=>{const l=E(g.data?.version?.snapshotJson);if(l!==void 0)return ae(E(p.data?.version?.snapshotJson),l)},[g.data,p.data]),b=N(()=>(f?.tables??[]).map(l=>({columns:l.columns,name:l.name,tier:oe(l.shardMode)})),[f]),v=N(()=>{const l={};for(const S of f?.tables??[])l[S.name]=ie[S.status];return l},[f]);if(r.error!==null)return c(G,{error:r.errorSource,testId:"sh-error"});if(d.length===0)return c(K,{description:n("Each distinct schema shape this shard runs is recorded here, so you can see what changed and when."),testId:"sh-empty",title:n("No schema versions recorded yet.")});const y=f?.changes??[];return x("div",{className:"flex min-h-0 flex-1 gap-4","data-testid":"lunora-schema-history",children:[x("nav",{className:"flex w-56 shrink-0 flex-col overflow-hidden border-e border-border","data-testid":"sh-timeline-rail",children:[c(me,{children:n("Schema versions")}),c("ul",{className:"min-h-0 flex-1 overflow-y-auto","data-testid":"sh-timeline",children:d.map(l=>c(re,{appliedAt:l.appliedAt,hash:l.hash,onSelect:i,selected:l.hash===m,seq:l.seq},l.hash))})]}),x("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col gap-4 pe-1 pt-4",children:[c(de,{breaking:f?.breakingCount??0,count:u===void 0?b.length:y.length,first:u===void 0}),t==="diagram"?c("div",{className:"flex min-h-0 flex-1 flex-col",children:c(B,{fill:!0,nodeClasses:v,tables:b,testIdPrefix:"sh"})}):c("div",{className:"min-h-0 flex-1 overflow-y-auto","data-testid":"sh-changes",children:ce(y).map(l=>{const S=(f?.tables??[]).find(k=>k.name===l.table);return x("section",{className:"mb-6",children:[x("div",{className:"flex items-baseline gap-3 border-b border-border/60 pb-1.5",children:[c("span",{className:"font-mono text-[13px] text-foreground",children:l.table===""?n("schema"):l.table}),S!==void 0&&c("span",{className:"font-mono text-[10px] tracking-widest text-muted-foreground/70 tabular-nums uppercase",children:n("{count} columns",{count:S.columns.length})}),l.changes.length>1&&c("span",{className:"ms-auto font-mono text-[10px] tracking-widest text-muted-foreground/70 tabular-nums",children:l.changes.length})]}),c("ul",{children:l.changes.map(k=>{const{action:J,kind:q}=D[k.type],j=k.severity==="breaking",F=le(k,q);return x("li",{className:"flex items-baseline gap-4 border-s-2 py-1.5 ps-3 transition-colors hover:bg-accent/30",children:[c("span",{"aria-hidden":"true",className:w("-ms-3 h-3 w-0.5 shrink-0 self-center",j?"bg-destructive":"bg-transparent")}),x("span",{className:"w-44 shrink-0 font-mono text-[10px] tracking-widest text-muted-foreground/70 uppercase",children:[n(J)," ",q]}),F!==l.table&&c("span",{className:w("min-w-0 font-mono text-[13px]",j?"text-destructive":"text-foreground"),children:F}),j&&c("span",{className:"ms-auto shrink-0 font-mono text-[10px] tracking-widest text-destructive uppercase",children:n("breaking")})]},`${k.type}-${k.summary}`)})})]},l.table)})})]})]})},ue=t=>w("-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"),Ne=t=>{const e=O(11),{initialShardKey:n}=t,s=R(),[a,o]=P("diagram");let i;e[0]!==a?(i=(u,g,p,f)=>x("button",{"aria-selected":a===u,className:ue(a===u),"data-testid":p,onClick:()=>{o(u)},role:"tab",type:"button",children:[g,f!==void 0&&c("span",{className:"ms-2 tabular-nums text-muted-foreground/70",children:f})]}),e[0]=a,e[1]=i):i=e[1];const r=i;let d;e[2]!==s||e[3]!==r?(d=x("div",{className:"flex shrink-0 items-center gap-1 border-b border-border px-3","data-testid":"mg-panes",role:"tablist",children:[r("diagram",s("Diagram"),"mg-pane-diagram"),r("changes",s("Changes"),"mg-pane-changes"),r("data",s("Data migrations"),"mg-pane-data")]}),e[2]=s,e[3]=r,e[4]=d):d=e[4];let m;e[5]!==n||e[6]!==a?(m=c("div",{className:"flex min-h-0 flex-1 flex-col",children:a==="data"?c("div",{className:"min-h-0 flex-1 overflow-y-auto px-4",children:c(H,{initialShardKey:n})}):c(fe,{pane:a,shardKey:n})}),e[5]=n,e[6]=a,e[7]=m):m=e[7];let h;return e[8]!==d||e[9]!==m?(h=x("div",{className:"flex min-h-0 flex-1 flex-col pt-4","data-testid":"lunora-migrations-route",children:[d,m]}),e[8]=d,e[9]=m,e[10]=h):h=e[10],h};export{Ne as default};
@@ -1 +1 @@
1
- import{d as j}from"../packem_shared/wire-codec-Dl3VeNrd.js";import{E as F}from"../packem_shared/error-alert-CKqB2CiN.js";import{B as N}from"../packem_shared/badge-cAk9Di1Q.js";import{C as b,a as T}from"../packem_shared/card-BGlQzQY-.js";import{E as S}from"../packem_shared/empty-state-B939z6K2.js";import{T as A,a as L,b as y,c as l,d as E,e as o}from"../packem_shared/table-BMsuYFhk.js";import{u as v}from"../packem_shared/use-admin-query-DV9xmFl8.js";import{useAutoRefresh as Q}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-DuULO4XM.js";import{u as H}from"../packem_shared/home-panel-DywiFhDs.js";import{useT as M}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{ADMIN_FUNCTIONS as g}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{i as I}from"../packem_shared/internal-7bgd8inO.js";import{jsx as e,jsxs as i}from"react/jsx-runtime";const V=["subscriptions","events"],_={},P=new Set(["active","trialing"]),k=new Set(["past_due","unpaid"]),n=(s,r)=>{if(s[r]!==void 0)return s[r];const m=s.__doc__;return typeof m=="string"?j(m)?.[r]:void 0},a=s=>typeof s=="string"?s:typeof s=="number"||typeof s=="bigint"||typeof s=="boolean"?String(s):"",G=s=>P.has(s)?"default":k.has(s)?"destructive":"outline",se=({limit:s=100})=>{const r=M(),m=H(),{data:h}=v(g.listTables,_,{live:!0}),C=h!==void 0,R=Array.isArray(h)&&V.every(t=>h.some(c=>c.name===t)),p=m.payments&&R,d=v(g.readTablePage,{filters:[],limit:s,offset:0,orderBy:[],search:"",table:"subscriptions"},{enabled:p}),u=v(g.readTablePage,{filters:[],limit:25,offset:0,orderBy:[],search:"",table:"events"},{enabled:p});Q(()=>{p&&(d.refetch(),u.refetch())},!0);const f=d.data?.rows??[],B=u.data?.rows??[],w=d.error??u.error,D=d.error===null?u.errorSource:d.errorSource,x=f.filter(t=>P.has(a(n(t,"state")))).length,O=B.toSorted((t,c)=>Number(n(c,"processedAt")??0)-Number(n(t,"processedAt")??0));return C&&!p?e("div",{className:"flex flex-col gap-4","data-testid":"payments-panel",children:e(S,{description:r("No @lunora/payment tables found in this deployment. Declare the store tables (subscriptions, events, …) in lunora/schema.ts and wire `payment` on createShardDO() to sync customers and subscriptions."),testId:"payments-unconfigured",title:r("No payments configured")})}):i("div",{className:"flex flex-col gap-4","data-testid":"payments-panel",children:[e("div",{className:"flex items-center gap-2","data-testid":"payments-summary",children:i(b,{className:"justify-between gap-0 py-0",children:[i("div",{className:"flex flex-col gap-2.5 p-4",children:[e("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Subscriptions")}),i("div",{className:"flex items-center gap-2",children:[e("span",{className:"text-2xl font-semibold tabular-nums text-foreground",children:x}),e(N,{variant:"default",children:r("{count} active",{count:x})})]})]}),e("div",{className:"border-t border-border bg-muted/50 px-4 py-2.5 text-[11px] text-muted-foreground",children:r("{total} total",{total:f.length})})]})}),w===null?void 0:e(F,{error:D}),f.length===0&&!d.isLoading?e(S,{testId:"payments-empty",title:r("No subscriptions yet")}):e(b,{className:"overflow-hidden py-0",children:e(T,{className:"px-0",children:i(A,{children:[e(L,{children:i(y,{children:[e(l,{children:r("Provider")}),e(l,{children:r("Reference")}),e(l,{children:r("Plan")}),e(l,{children:r("State")}),e(l,{children:r("Renews")})]})}),e(E,{children:f.map(t=>{const c=a(n(t,"state"));return i(y,{"data-testid":"payment-subscription-row",children:[e(o,{children:a(n(t,"provider"))}),e(o,{children:a(n(t,"referenceId"))}),e(o,{children:a(n(t,"priceId"))}),e(o,{children:e(N,{variant:G(c),children:c})}),e(o,{children:I(n(t,"currentPeriodEnd"))})]},a(n(t,"providerSubscriptionId")))})})]})})}),i(b,{className:"overflow-hidden py-0",children:[e("header",{className:"border-b border-border px-4 py-3",children:e("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Recent webhook events")})}),e(T,{className:"px-0",children:e(A,{children:e(E,{children:O.map(t=>i(y,{"data-testid":"payment-event-row",children:[e(o,{children:a(n(t,"provider"))}),e(o,{className:"font-medium",children:a(n(t,"type"))}),e(o,{className:"text-muted-foreground",children:a(n(t,"providerEventId"))}),e(o,{children:I(n(t,"processedAt"))})]},a(n(t,"providerEventId"))))})})})]})]})};export{se as PaymentsPanel};
1
+ import{d as j}from"../packem_shared/wire-codec-Dl3VeNrd.js";import{E as F}from"../packem_shared/error-alert-CKqB2CiN.js";import{B as N}from"../packem_shared/badge-cAk9Di1Q.js";import{C as b,a as T}from"../packem_shared/card-BGlQzQY-.js";import{E as S}from"../packem_shared/empty-state-B939z6K2.js";import{T as A,a as L,b as y,c as l,d as E,e as o}from"../packem_shared/table-BMsuYFhk.js";import{u as v}from"../packem_shared/use-admin-query-DV9xmFl8.js";import{useAutoRefresh as Q}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-DuULO4XM.js";import{u as H}from"../packem_shared/home-panel-ecz6-nHV.js";import{useT as M}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{ADMIN_FUNCTIONS as g}from"../packem_shared/ADMIN_FUNCTIONS-B6z7VLYt.js";import{i as I}from"../packem_shared/internal-7bgd8inO.js";import{jsx as e,jsxs as i}from"react/jsx-runtime";const V=["subscriptions","events"],_={},P=new Set(["active","trialing"]),k=new Set(["past_due","unpaid"]),n=(s,r)=>{if(s[r]!==void 0)return s[r];const m=s.__doc__;return typeof m=="string"?j(m)?.[r]:void 0},a=s=>typeof s=="string"?s:typeof s=="number"||typeof s=="bigint"||typeof s=="boolean"?String(s):"",G=s=>P.has(s)?"default":k.has(s)?"destructive":"outline",se=({limit:s=100})=>{const r=M(),m=H(),{data:h}=v(g.listTables,_,{live:!0}),C=h!==void 0,R=Array.isArray(h)&&V.every(t=>h.some(c=>c.name===t)),p=m.payments&&R,d=v(g.readTablePage,{filters:[],limit:s,offset:0,orderBy:[],search:"",table:"subscriptions"},{enabled:p}),u=v(g.readTablePage,{filters:[],limit:25,offset:0,orderBy:[],search:"",table:"events"},{enabled:p});Q(()=>{p&&(d.refetch(),u.refetch())},!0);const f=d.data?.rows??[],B=u.data?.rows??[],w=d.error??u.error,D=d.error===null?u.errorSource:d.errorSource,x=f.filter(t=>P.has(a(n(t,"state")))).length,O=B.toSorted((t,c)=>Number(n(c,"processedAt")??0)-Number(n(t,"processedAt")??0));return C&&!p?e("div",{className:"flex flex-col gap-4","data-testid":"payments-panel",children:e(S,{description:r("No @lunora/payment tables found in this deployment. Declare the store tables (subscriptions, events, …) in lunora/schema.ts and wire `payment` on createShardDO() to sync customers and subscriptions."),testId:"payments-unconfigured",title:r("No payments configured")})}):i("div",{className:"flex flex-col gap-4","data-testid":"payments-panel",children:[e("div",{className:"flex items-center gap-2","data-testid":"payments-summary",children:i(b,{className:"justify-between gap-0 py-0",children:[i("div",{className:"flex flex-col gap-2.5 p-4",children:[e("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Subscriptions")}),i("div",{className:"flex items-center gap-2",children:[e("span",{className:"text-2xl font-semibold tabular-nums text-foreground",children:x}),e(N,{variant:"default",children:r("{count} active",{count:x})})]})]}),e("div",{className:"border-t border-border bg-muted/50 px-4 py-2.5 text-[11px] text-muted-foreground",children:r("{total} total",{total:f.length})})]})}),w===null?void 0:e(F,{error:D}),f.length===0&&!d.isLoading?e(S,{testId:"payments-empty",title:r("No subscriptions yet")}):e(b,{className:"overflow-hidden py-0",children:e(T,{className:"px-0",children:i(A,{children:[e(L,{children:i(y,{children:[e(l,{children:r("Provider")}),e(l,{children:r("Reference")}),e(l,{children:r("Plan")}),e(l,{children:r("State")}),e(l,{children:r("Renews")})]})}),e(E,{children:f.map(t=>{const c=a(n(t,"state"));return i(y,{"data-testid":"payment-subscription-row",children:[e(o,{children:a(n(t,"provider"))}),e(o,{children:a(n(t,"referenceId"))}),e(o,{children:a(n(t,"priceId"))}),e(o,{children:e(N,{variant:G(c),children:c})}),e(o,{children:I(n(t,"currentPeriodEnd"))})]},a(n(t,"providerSubscriptionId")))})})]})})}),i(b,{className:"overflow-hidden py-0",children:[e("header",{className:"border-b border-border px-4 py-3",children:e("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:r("Recent webhook events")})}),e(T,{className:"px-0",children:e(A,{children:e(E,{children:O.map(t=>i(y,{"data-testid":"payment-event-row",children:[e(o,{children:a(n(t,"provider"))}),e(o,{className:"font-medium",children:a(n(t,"type"))}),e(o,{className:"text-muted-foreground",children:a(n(t,"providerEventId"))}),e(o,{children:I(n(t,"processedAt"))})]},a(n(t,"providerEventId"))))})})})]})]})};export{se as PaymentsPanel};
@@ -1 +1 @@
1
- import{useState as h,useRef as he,useEffect as se}from"react";import{b as xe,d as ye,c as be,a as ce,C as de}from"../packem_shared/card-BGlQzQY-.js";import{useT as ee}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{c as me}from"react/compiler-runtime";import{E as ge}from"../packem_shared/error-alert-CKqB2CiN.js";import{L as ve}from"../packem_shared/live-status-Bf7rR8o8.js";import{B as K}from"../packem_shared/badge-cAk9Di1Q.js";import{B as L}from"../packem_shared/button-BOPLD1un.js";import{E as fe}from"../packem_shared/empty-state-B939z6K2.js";import{T as Ne,a as ke,b as oe,c as te,d as Se,e as ae}from"../packem_shared/table-BMsuYFhk.js";import{u as le}from"../packem_shared/use-admin-query-DV9xmFl8.js";import{ADMIN_FUNCTIONS as Z}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{jsxs as i,jsx as a}from"react/jsx-runtime";import{useLunora as pe}from"@lunora/react";import{ShardInput as Ce}from"../packem_shared/ShardInput-CdawpUiS.js";import{I as H}from"../packem_shared/input-CY5W3wzv.js";import{L as M}from"../packem_shared/label-BOUo-DP0.js";import{T as Pe}from"../packem_shared/textarea-DpO3i-Qo.js";import{d as we,c as Ae,b as Te,f as re}from"../packem_shared/internal-7bgd8inO.js";const ie=["read","insert","update","delete"],_e=(e,t)=>({delete:e("Delete"),insert:e("Insert"),read:e("Read"),update:e("Update")})[t],Ie=e=>{const t=new Set;for(const s of e?.advisories??[])if(s.name==="rls_uncovered_table"){const{table:n}=s.metadata;typeof n=="string"&&n!==""&&t.add(n)}return t},Ee=(e,t,s)=>{const n=new Map,l=c=>{const o=n.get(c);if(o!==void 0)return o;const f={cells:{delete:{},insert:{},read:{},update:{}},maskedColumns:new Set,table:c,uncovered:s.has(c)};return n.set(c,f),f};for(const c of e)l(c.table).cells[c.on]={procedure:c.procedure};for(const c of t)l(c.table).maskedColumns.add(c.column);for(const c of s)l(c);return[...n.values()].toSorted((c,o)=>c.table.localeCompare(o.table))},Fe=e=>{const t=me(17);let s;t[0]!==e?(s=e===void 0?{}:e,t[0]=e,t[1]=s):s=t[1];const{onProbe:n}=s,l=ee();let c,o;t[2]===Symbol.for("react.memo_cache_sentinel")?(c={},o={live:!0},t[2]=c,t[3]=o):(c=t[2],o=t[3]);const f=le(Z.rlsPolicies,c,o);let r;t[4]===Symbol.for("react.memo_cache_sentinel")?(r={},t[4]=r):r=t[4];const b=le(Z.maskPolicies,r);let u;t[5]===Symbol.for("react.memo_cache_sentinel")?(u={},t[5]=u):u=t[5];const g=le(Z.getAdvisories,u);let v;if(t[6]!==g.data||t[7]!==b.data||t[8]!==n||t[9]!==f||t[10]!==l){let N=null;f.data!==void 0&&(N=Array.isArray(f.data.policies)?f.data.policies:[]);const I=Array.isArray(b.data?.columns)?b.data.columns:[],$=g.data??null,{error:P,errorSource:k,liveError:w}=f,T=N===null?[]:Ee(N,I,Ie($));let S;t[12]!==w?(S=a("div",{className:"flex items-center justify-end",children:a(ve,{message:w,prefix:"pm"})}),t[12]=w,t[13]=S):S=t[13];let x;t[14]!==P||t[15]!==k?(x=P!==null&&a(ge,{error:k,testId:"pm-error"}),t[14]=P,t[15]=k,t[16]=x):x=t[16],v=i("div",{className:"flex flex-col gap-3","data-testid":"lunora-permissions-matrix",children:[S,x,N!==null&&T.length===0?a(fe,{description:l("Add a `definePolicy` and wire it through `.use(rls(...))` to populate this matrix."),testId:"pm-empty",title:l("No policy")}):i(Ne,{"data-testid":"pm-table",children:[a(ke,{children:i(oe,{children:[a(te,{children:l("Table")}),ie.map(d=>a(te,{children:_e(l,d)},d)),a(te,{children:l("Masked columns")})]})}),a(Se,{children:T.map(d=>i(oe,{"data-testid":`pm-row-${d.table}`,children:[a(ae,{className:"font-mono text-xs",children:i("span",{className:"flex items-center gap-1.5",children:[d.table,d.uncovered&&a(K,{"data-testid":`pm-uncovered-${d.table}`,title:l("Uncovered — reachable without a policy"),variant:"destructive",children:l("Uncovered — reachable without a policy")})]})}),ie.map(A=>{const y=d.cells[A];return a(ae,{"data-testid":`pm-cell-${d.table}-${A}`,children:y.procedure===void 0?a("span",{className:"text-xs text-muted-foreground",children:l("No policy")}):i("span",{className:"flex flex-col gap-1",children:[a(K,{variant:"secondary",children:l("Covered by {procedure}",{procedure:y.procedure})}),n!==void 0&&a(L,{className:"h-auto justify-start p-0 text-[11px]","data-testid":`pm-probe-${d.table}-${A}`,onClick:()=>{n(d.table,A,y.procedure??"")},size:"xs",type:"button",variant:"ghost",children:l("Probe this")})]})},A)}),a(ae,{children:d.maskedColumns.size===0?a("span",{"aria-hidden":"true",className:"text-muted-foreground",children:"—"}):a("span",{className:"flex flex-wrap gap-1",children:[...d.maskedColumns].map(Re)})})]},d.table))})]})]}),t[6]=g.data,t[7]=b.data,t[8]=n,t[9]=f,t[10]=l,t[11]=v}else v=t[11];return v};function Re(e){return a(K,{variant:"outline",children:e},e)}const Oe=Ae(Z.runAs),Le=()=>{const e=pe();return async({args:t,functionPath:s,shardKey:n="",userId:l})=>{const c=Oe;try{return{kind:"allowed",value:await e.query(c,{args:t,functionPath:s,userId:l},we(n))}}catch(o){return{kind:"denied",message:o instanceof Error?o.message:String(o)}}}},Me=e=>e===void 0?"undefined":JSON.stringify(e,null,2),$e=({functions:e,prefill:t,runAsIdentity:s=!1}={})=>{const n=pe(),l=ee(),c=Le(),[o,f]=h(null),[r,b]=h(null),u=e??o??[],[g,v]=h(""),[N,I]=h("{}"),[$,P]=h(""),[k,w]=h(""),[T,S]=h(!1),[x,d]=h(null),[A,y]=h(null),_=he(-1);se(()=>{if(e!==void 0)return;let m=!1;return n.listFunctions().then(p=>(m||f(p),p)).catch(p=>{m||b(Te(p))}),()=>{m=!0}},[n,e]),se(()=>{if(t===void 0||_.current===t.nonce)return;_.current=t.nonce;const m=t.functionPath;queueMicrotask(()=>{v(m),d(null)})},[t]);const C=g===""?u[0]?.path??"":g,E=async()=>{if(C==="")return;let m;try{m=N.trim()===""?{}:JSON.parse(N)}catch(p){y(l("Invalid JSON args: {message}",{message:p.message})),d(null);return}y(null),S(!0);try{const p=await c({args:m,functionPath:C,shardKey:$.trim(),userId:k.trim()});d(p)}finally{S(!1)}},F=()=>{re(E())},Y=m=>{v(m.target.value)},R=m=>{I(m.target.value)},O=m=>{w(m.target.value)};return i("div",{className:"flex flex-col gap-3","data-testid":"lunora-permissions-playground",children:[r!==null&&a("p",{className:"text-sm text-destructive","data-testid":"pp-discover-error",role:"alert",children:r}),!s&&a(fe,{description:l("Dev only: runs the selected function as this user over the admin gate so you can test auth and RLS."),testId:"pp-gate",title:l("Set `runAsIdentity` to forge an identity and probe access.")}),i("div",{className:"flex flex-col gap-3 rounded-md border border-border p-3",children:[i("div",{className:"flex flex-col gap-1.5",children:[a(M,{htmlFor:"pp-function",children:l("Function")}),a("select",{"aria-label":l("Function"),className:"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-xs outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50","data-testid":"pp-function",id:"pp-function",onChange:Y,value:C,children:u.map(m=>i("option",{value:m.path,children:[m.path," (",m.kind,")"]},m.path))})]}),i("div",{className:"flex flex-col gap-1.5",children:[a(M,{htmlFor:"pp-args",children:l("Arguments")}),a(Pe,{"aria-label":l("Arguments"),className:"font-mono text-xs","data-testid":"pp-args",id:"pp-args",onChange:R,value:N})]}),a(Ce,{onChange:P,testId:"pp-shard",value:$}),i("div",{className:"flex flex-col gap-1.5",children:[a(M,{htmlFor:"pp-user",children:l("Run as (userId)")}),a(H,{"aria-label":l("Identity (userId) to run as"),className:"font-mono text-xs","data-testid":"pp-user",id:"pp-user",onChange:O,placeholder:l("Leave empty to run as admin"),value:k})]}),i("div",{className:"flex items-center gap-2",children:[a(L,{"data-testid":"pp-run",disabled:!s||T||C==="",onClick:F,type:"button",children:l(T?"Probing…":"Run probe")}),k.trim()!==""&&a(K,{"data-testid":"pp-as-badge",variant:"secondary",children:l("as {userId}",{userId:k.trim()})})]})]}),A!==null&&a("p",{className:"text-sm text-destructive","data-testid":"pp-args-error",role:"alert",children:A}),x!==null&&x.kind==="allowed"&&i("div",{className:"flex flex-col gap-2","data-testid":"pp-outcome-allowed",children:[a(K,{variant:"secondary",children:l("Allowed")}),a("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs","data-testid":"pp-result",children:Me(x.value)})]}),x!==null&&x.kind==="denied"&&i("div",{className:"flex flex-col gap-2","data-testid":"pp-outcome-denied",children:[a(K,{variant:"destructive",children:l("Denied")}),a("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs text-destructive","data-testid":"pp-denied",role:"alert",children:x.message})]})]})},ze="/__lunora/policy-scaffold",De={"already-wired":"That procedure already has an rls(...) policy wired in.","file-exists":"A policy file with that name already exists — pick another name or edit it by hand.","invalid-identifier":"Name, table, and policy-set must be plain identifiers (letters, digits, _ or $).","unknown-procedure":"No exported procedure was found at that file path.","unsupported-procedure-shape":"That procedure uses the bare query({…}) form — convert it to the builder form (c.use(…).query(…)) before wiring RLS."},Ue=async e=>{const t=await fetch(ze,{body:JSON.stringify(e),headers:{"Content-Type":"application/json"},method:"POST"}),s=await t.json();if(s.needsManualEdit===!0)return{kind:"needs-manual-edit",message:s.message??"This change must be made by hand."};if(t.ok)return{diagnostics:s.diagnostics??[],kind:"ok",label:s.fileName??s.exportName??""};const n=s.error;return{kind:"error",message:n===void 0?`policy scaffold failed (${String(t.status)})`:De[n]??n}},ne={exportName:"",filePath:"",policyName:"",policies:"",tableName:""},je=()=>{const e=me(69),t=ee(),[s,n]=h(null),[l,c]=h(!1),[o,f]=h(null),[r,b]=h(ne);let u;e[0]===Symbol.for("react.memo_cache_sentinel")?(u=X=>{const Q=X.target.name,{value:G}=X.target;b(ue=>({...ue,[Q]:G}))},e[0]=u):u=e[0];const g=u;let v;e[1]===Symbol.for("react.memo_cache_sentinel")?(v=()=>{n(null),b(ne)},e[1]=v):v=e[1];const N=v;let I;e[2]===Symbol.for("react.memo_cache_sentinel")?(I=async X=>{c(!0),f(null);try{const Q=await Ue(X);f(Q),Q.kind==="ok"&&N()}catch(Q){const G=Q;f({kind:"error",message:G instanceof Error?G.message:String(G)})}c(!1)},e[2]=I):I=e[2];const $=I;let P;e[3]!==r.policyName||e[4]!==r.tableName?(P=()=>{re($({kind:"scaffoldPolicy",name:r.policyName.trim(),table:r.tableName.trim()}))},e[3]=r.policyName,e[4]=r.tableName,e[5]=P):P=e[5];const k=P;let w;e[6]!==r.exportName||e[7]!==r.filePath||e[8]!==r.policies?(w=()=>{re($({exportName:r.exportName.trim(),filePath:r.filePath.trim(),kind:"wireRls",policies:r.policies.trim()}))},e[6]=r.exportName,e[7]=r.filePath,e[8]=r.policies,e[9]=w):w=e[9];const T=w;let S;e[10]===Symbol.for("react.memo_cache_sentinel")?(S=()=>{f(null),n("scaffold")},e[10]=S):S=e[10];const x=S;let d;e[11]===Symbol.for("react.memo_cache_sentinel")?(d=()=>{f(null),n("wire")},e[11]=d):d=e[11];const A=d;let y;e[12]!==t?(y=t("Scaffold access rules"),e[12]=t,e[13]=y):y=e[13];let _;e[14]!==y?(_=a(xe,{children:y}),e[14]=y,e[15]=_):_=e[15];let C;e[16]!==t?(C=t("Writes a new deny-by-default policy file under lunora/, or wires one into a procedure, then reruns codegen. Local dev only."),e[16]=t,e[17]=C):C=e[17];let E;e[18]!==C?(E=a(ye,{children:C}),e[18]=C,e[19]=E):E=e[19];let F;e[20]!==E||e[21]!==_?(F=i(be,{children:[_,E]}),e[20]=E,e[21]=_,e[22]=F):F=e[22];const Y=s==="scaffold"?"default":"outline";let R;e[23]!==t?(R=t("New policy file"),e[23]=t,e[24]=R):R=e[24];let O;e[25]!==Y||e[26]!==R?(O=a(L,{"data-testid":"policy-scaffolder-new",onClick:x,size:"xs",type:"button",variant:Y,children:R}),e[25]=Y,e[26]=R,e[27]=O):O=e[27];const m=s==="wire"?"default":"outline";let p;e[28]!==t?(p=t("Wire into a procedure"),e[28]=t,e[29]=p):p=e[29];let z;e[30]!==m||e[31]!==p?(z=a(L,{"data-testid":"policy-scaffolder-wire",onClick:A,size:"xs",type:"button",variant:m,children:p}),e[30]=m,e[31]=p,e[32]=z):z=e[32];let D;e[33]!==O||e[34]!==z?(D=i("div",{className:"flex flex-wrap gap-2",children:[O,z]}),e[33]=O,e[34]=z,e[35]=D):D=e[35];let U;e[36]!==l||e[37]!==r.policyName||e[38]!==r.tableName||e[39]!==s||e[40]!==k||e[41]!==t?(U=s==="scaffold"&&i("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"policy-scaffolder-new-form",children:[i("div",{className:"flex flex-col gap-1 text-xs",children:[a(M,{htmlFor:"policy-scaffolder-name",children:t("Policy name")}),a(H,{"data-testid":"policy-scaffolder-name",id:"policy-scaffolder-name",name:"policyName",onChange:g,value:r.policyName})]}),i("div",{className:"flex flex-col gap-1 text-xs",children:[a(M,{htmlFor:"policy-scaffolder-table",children:t("Table name")}),a(H,{"data-testid":"policy-scaffolder-table",id:"policy-scaffolder-table",name:"tableName",onChange:g,value:r.tableName})]}),a(L,{"data-testid":"policy-scaffolder-create",disabled:l||r.policyName.trim()===""||r.tableName.trim()==="",onClick:k,size:"xs",type:"button",children:t(l?"Creating…":"Create policy file")}),a(L,{onClick:N,size:"xs",type:"button",variant:"ghost",children:t("Cancel")})]}),e[36]=l,e[37]=r.policyName,e[38]=r.tableName,e[39]=s,e[40]=k,e[41]=t,e[42]=U):U=e[42];let j;e[43]!==l||e[44]!==r.exportName||e[45]!==r.filePath||e[46]!==r.policies||e[47]!==s||e[48]!==T||e[49]!==t?(j=s==="wire"&&i("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"policy-scaffolder-wire-form",children:[i("div",{className:"flex flex-col gap-1 text-xs",children:[a(M,{htmlFor:"policy-scaffolder-file",children:t("Procedure file path")}),a(H,{"data-testid":"policy-scaffolder-file",id:"policy-scaffolder-file",name:"filePath",onChange:g,value:r.filePath})]}),i("div",{className:"flex flex-col gap-1 text-xs",children:[a(M,{htmlFor:"policy-scaffolder-export",children:t("Exported procedure")}),a(H,{"data-testid":"policy-scaffolder-export",id:"policy-scaffolder-export",name:"exportName",onChange:g,value:r.exportName})]}),i("div",{className:"flex flex-col gap-1 text-xs",children:[a(M,{htmlFor:"policy-scaffolder-policies",children:t("Policy set identifier")}),a(H,{"data-testid":"policy-scaffolder-policies",id:"policy-scaffolder-policies",name:"policies",onChange:g,value:r.policies})]}),a(L,{"data-testid":"policy-scaffolder-apply",disabled:l||r.filePath.trim()===""||r.exportName.trim()===""||r.policies.trim()==="",onClick:T,size:"xs",type:"button",children:t(l?"Wiring…":"Wire RLS")}),a(L,{onClick:N,size:"xs",type:"button",variant:"ghost",children:t("Cancel")})]}),e[43]=l,e[44]=r.exportName,e[45]=r.filePath,e[46]=r.policies,e[47]=s,e[48]=T,e[49]=t,e[50]=j):j=e[50];let B;e[51]!==o?(B=o?.kind==="error"&&a("p",{className:"mt-3 text-sm text-destructive","data-testid":"policy-scaffolder-error",role:"alert",children:o.message}),e[51]=o,e[52]=B):B=e[52];let W;e[53]!==o?.kind||e[54]!==t?(W=o?.kind==="needs-manual-edit"&&a("p",{className:"mt-3 text-sm text-amber-600 dark:text-amber-500","data-testid":"policy-scaffolder-manual",role:"alert",children:t("This change must be made by hand — the scaffolder only adds new, deny-by-default rules.")}),e[53]=o?.kind,e[54]=t,e[55]=W):W=e[55];let q;e[56]!==o||e[57]!==t?(q=o?.kind==="ok"&&i("div",{className:"mt-3 flex flex-col gap-1","data-testid":"policy-scaffolder-ok",children:[a("p",{className:"text-sm text-emerald-600 dark:text-emerald-500",children:t("Scaffolded {label} and reran codegen. Fill in the `when` predicates before relying on it.",{label:o.label})}),o.diagnostics.length>0&&a("ul",{className:"flex flex-col gap-0.5","data-testid":"policy-scaffolder-diagnostics",children:o.diagnostics.map(Be)})]}),e[56]=o,e[57]=t,e[58]=q):q=e[58];let J;e[59]!==D||e[60]!==U||e[61]!==j||e[62]!==B||e[63]!==W||e[64]!==q?(J=i(ce,{children:[D,U,j,B,W,q]}),e[59]=D,e[60]=U,e[61]=j,e[62]=B,e[63]=W,e[64]=q,e[65]=J):J=e[65];let V;return e[66]!==F||e[67]!==J?(V=i(de,{"data-testid":"policy-scaffolder",size:"sm",children:[F,J]}),e[66]=F,e[67]=J,e[68]=V):V=e[68],V};function Be(e){return a("li",{className:"font-mono text-[11px] text-destructive",children:e},e)}const nt=({functions:e,runAsIdentity:t=!1,schemaEditable:s=!1}={})=>{const n=ee(),[l,c]=h(void 0),o=(f,r,b)=>{b!==""&&c(u=>({functionPath:b,nonce:(u?.nonce??0)+1}))};return i("div",{className:"flex flex-col gap-8","data-testid":"lunora-permissions",children:[i("section",{className:"flex flex-col gap-3",children:[a("header",{className:"border-b border-border px-4 py-3",children:a("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:n("Permissions")})}),a(Fe,{onProbe:o})]}),a("section",{className:"flex flex-col gap-3",children:i(de,{className:"gap-0 py-0",children:[a("header",{className:"border-b border-border px-4 py-3",children:a("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:n("Probe")})}),i(ce,{className:"px-4 py-4",children:[a("p",{className:"mb-3 text-sm text-muted-foreground",children:n("Pick a function and an identity, then run it to see the access outcome.")}),a($e,{functions:e,prefill:l,runAsIdentity:t})]})]})}),s&&a("section",{className:"flex flex-col gap-2",children:a(je,{})})]})};export{nt as PermissionsPanel};
1
+ import{useState as h,useRef as he,useEffect as se}from"react";import{b as xe,d as ye,c as be,a as ce,C as de}from"../packem_shared/card-BGlQzQY-.js";import{useT as ee}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{c as me}from"react/compiler-runtime";import{E as ge}from"../packem_shared/error-alert-CKqB2CiN.js";import{L as ve}from"../packem_shared/live-status-Bf7rR8o8.js";import{B as K}from"../packem_shared/badge-cAk9Di1Q.js";import{B as L}from"../packem_shared/button-BOPLD1un.js";import{E as fe}from"../packem_shared/empty-state-B939z6K2.js";import{T as Ne,a as ke,b as oe,c as te,d as Se,e as ae}from"../packem_shared/table-BMsuYFhk.js";import{u as le}from"../packem_shared/use-admin-query-DV9xmFl8.js";import{ADMIN_FUNCTIONS as Z}from"../packem_shared/ADMIN_FUNCTIONS-B6z7VLYt.js";import{jsxs as i,jsx as a}from"react/jsx-runtime";import{useLunora as pe}from"@lunora/react";import{ShardInput as Ce}from"../packem_shared/ShardInput-CdawpUiS.js";import{I as H}from"../packem_shared/input-CY5W3wzv.js";import{L as M}from"../packem_shared/label-BOUo-DP0.js";import{T as Pe}from"../packem_shared/textarea-DpO3i-Qo.js";import{d as we,c as Ae,b as Te,f as re}from"../packem_shared/internal-7bgd8inO.js";const ie=["read","insert","update","delete"],_e=(e,t)=>({delete:e("Delete"),insert:e("Insert"),read:e("Read"),update:e("Update")})[t],Ie=e=>{const t=new Set;for(const s of e?.advisories??[])if(s.name==="rls_uncovered_table"){const{table:n}=s.metadata;typeof n=="string"&&n!==""&&t.add(n)}return t},Ee=(e,t,s)=>{const n=new Map,l=c=>{const o=n.get(c);if(o!==void 0)return o;const f={cells:{delete:{},insert:{},read:{},update:{}},maskedColumns:new Set,table:c,uncovered:s.has(c)};return n.set(c,f),f};for(const c of e)l(c.table).cells[c.on]={procedure:c.procedure};for(const c of t)l(c.table).maskedColumns.add(c.column);for(const c of s)l(c);return[...n.values()].toSorted((c,o)=>c.table.localeCompare(o.table))},Fe=e=>{const t=me(17);let s;t[0]!==e?(s=e===void 0?{}:e,t[0]=e,t[1]=s):s=t[1];const{onProbe:n}=s,l=ee();let c,o;t[2]===Symbol.for("react.memo_cache_sentinel")?(c={},o={live:!0},t[2]=c,t[3]=o):(c=t[2],o=t[3]);const f=le(Z.rlsPolicies,c,o);let r;t[4]===Symbol.for("react.memo_cache_sentinel")?(r={},t[4]=r):r=t[4];const b=le(Z.maskPolicies,r);let u;t[5]===Symbol.for("react.memo_cache_sentinel")?(u={},t[5]=u):u=t[5];const g=le(Z.getAdvisories,u);let v;if(t[6]!==g.data||t[7]!==b.data||t[8]!==n||t[9]!==f||t[10]!==l){let N=null;f.data!==void 0&&(N=Array.isArray(f.data.policies)?f.data.policies:[]);const I=Array.isArray(b.data?.columns)?b.data.columns:[],$=g.data??null,{error:P,errorSource:k,liveError:w}=f,T=N===null?[]:Ee(N,I,Ie($));let S;t[12]!==w?(S=a("div",{className:"flex items-center justify-end",children:a(ve,{message:w,prefix:"pm"})}),t[12]=w,t[13]=S):S=t[13];let x;t[14]!==P||t[15]!==k?(x=P!==null&&a(ge,{error:k,testId:"pm-error"}),t[14]=P,t[15]=k,t[16]=x):x=t[16],v=i("div",{className:"flex flex-col gap-3","data-testid":"lunora-permissions-matrix",children:[S,x,N!==null&&T.length===0?a(fe,{description:l("Add a `definePolicy` and wire it through `.use(rls(...))` to populate this matrix."),testId:"pm-empty",title:l("No policy")}):i(Ne,{"data-testid":"pm-table",children:[a(ke,{children:i(oe,{children:[a(te,{children:l("Table")}),ie.map(d=>a(te,{children:_e(l,d)},d)),a(te,{children:l("Masked columns")})]})}),a(Se,{children:T.map(d=>i(oe,{"data-testid":`pm-row-${d.table}`,children:[a(ae,{className:"font-mono text-xs",children:i("span",{className:"flex items-center gap-1.5",children:[d.table,d.uncovered&&a(K,{"data-testid":`pm-uncovered-${d.table}`,title:l("Uncovered — reachable without a policy"),variant:"destructive",children:l("Uncovered — reachable without a policy")})]})}),ie.map(A=>{const y=d.cells[A];return a(ae,{"data-testid":`pm-cell-${d.table}-${A}`,children:y.procedure===void 0?a("span",{className:"text-xs text-muted-foreground",children:l("No policy")}):i("span",{className:"flex flex-col gap-1",children:[a(K,{variant:"secondary",children:l("Covered by {procedure}",{procedure:y.procedure})}),n!==void 0&&a(L,{className:"h-auto justify-start p-0 text-[11px]","data-testid":`pm-probe-${d.table}-${A}`,onClick:()=>{n(d.table,A,y.procedure??"")},size:"xs",type:"button",variant:"ghost",children:l("Probe this")})]})},A)}),a(ae,{children:d.maskedColumns.size===0?a("span",{"aria-hidden":"true",className:"text-muted-foreground",children:"—"}):a("span",{className:"flex flex-wrap gap-1",children:[...d.maskedColumns].map(Re)})})]},d.table))})]})]}),t[6]=g.data,t[7]=b.data,t[8]=n,t[9]=f,t[10]=l,t[11]=v}else v=t[11];return v};function Re(e){return a(K,{variant:"outline",children:e},e)}const Oe=Ae(Z.runAs),Le=()=>{const e=pe();return async({args:t,functionPath:s,shardKey:n="",userId:l})=>{const c=Oe;try{return{kind:"allowed",value:await e.query(c,{args:t,functionPath:s,userId:l},we(n))}}catch(o){return{kind:"denied",message:o instanceof Error?o.message:String(o)}}}},Me=e=>e===void 0?"undefined":JSON.stringify(e,null,2),$e=({functions:e,prefill:t,runAsIdentity:s=!1}={})=>{const n=pe(),l=ee(),c=Le(),[o,f]=h(null),[r,b]=h(null),u=e??o??[],[g,v]=h(""),[N,I]=h("{}"),[$,P]=h(""),[k,w]=h(""),[T,S]=h(!1),[x,d]=h(null),[A,y]=h(null),_=he(-1);se(()=>{if(e!==void 0)return;let m=!1;return n.listFunctions().then(p=>(m||f(p),p)).catch(p=>{m||b(Te(p))}),()=>{m=!0}},[n,e]),se(()=>{if(t===void 0||_.current===t.nonce)return;_.current=t.nonce;const m=t.functionPath;queueMicrotask(()=>{v(m),d(null)})},[t]);const C=g===""?u[0]?.path??"":g,E=async()=>{if(C==="")return;let m;try{m=N.trim()===""?{}:JSON.parse(N)}catch(p){y(l("Invalid JSON args: {message}",{message:p.message})),d(null);return}y(null),S(!0);try{const p=await c({args:m,functionPath:C,shardKey:$.trim(),userId:k.trim()});d(p)}finally{S(!1)}},F=()=>{re(E())},Y=m=>{v(m.target.value)},R=m=>{I(m.target.value)},O=m=>{w(m.target.value)};return i("div",{className:"flex flex-col gap-3","data-testid":"lunora-permissions-playground",children:[r!==null&&a("p",{className:"text-sm text-destructive","data-testid":"pp-discover-error",role:"alert",children:r}),!s&&a(fe,{description:l("Dev only: runs the selected function as this user over the admin gate so you can test auth and RLS."),testId:"pp-gate",title:l("Set `runAsIdentity` to forge an identity and probe access.")}),i("div",{className:"flex flex-col gap-3 rounded-md border border-border p-3",children:[i("div",{className:"flex flex-col gap-1.5",children:[a(M,{htmlFor:"pp-function",children:l("Function")}),a("select",{"aria-label":l("Function"),className:"flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-xs outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50","data-testid":"pp-function",id:"pp-function",onChange:Y,value:C,children:u.map(m=>i("option",{value:m.path,children:[m.path," (",m.kind,")"]},m.path))})]}),i("div",{className:"flex flex-col gap-1.5",children:[a(M,{htmlFor:"pp-args",children:l("Arguments")}),a(Pe,{"aria-label":l("Arguments"),className:"font-mono text-xs","data-testid":"pp-args",id:"pp-args",onChange:R,value:N})]}),a(Ce,{onChange:P,testId:"pp-shard",value:$}),i("div",{className:"flex flex-col gap-1.5",children:[a(M,{htmlFor:"pp-user",children:l("Run as (userId)")}),a(H,{"aria-label":l("Identity (userId) to run as"),className:"font-mono text-xs","data-testid":"pp-user",id:"pp-user",onChange:O,placeholder:l("Leave empty to run as admin"),value:k})]}),i("div",{className:"flex items-center gap-2",children:[a(L,{"data-testid":"pp-run",disabled:!s||T||C==="",onClick:F,type:"button",children:l(T?"Probing…":"Run probe")}),k.trim()!==""&&a(K,{"data-testid":"pp-as-badge",variant:"secondary",children:l("as {userId}",{userId:k.trim()})})]})]}),A!==null&&a("p",{className:"text-sm text-destructive","data-testid":"pp-args-error",role:"alert",children:A}),x!==null&&x.kind==="allowed"&&i("div",{className:"flex flex-col gap-2","data-testid":"pp-outcome-allowed",children:[a(K,{variant:"secondary",children:l("Allowed")}),a("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs","data-testid":"pp-result",children:Me(x.value)})]}),x!==null&&x.kind==="denied"&&i("div",{className:"flex flex-col gap-2","data-testid":"pp-outcome-denied",children:[a(K,{variant:"destructive",children:l("Denied")}),a("pre",{className:"overflow-auto rounded-md border border-border bg-muted/50 p-3 font-mono text-xs text-destructive","data-testid":"pp-denied",role:"alert",children:x.message})]})]})},ze="/__lunora/policy-scaffold",De={"already-wired":"That procedure already has an rls(...) policy wired in.","file-exists":"A policy file with that name already exists — pick another name or edit it by hand.","invalid-identifier":"Name, table, and policy-set must be plain identifiers (letters, digits, _ or $).","unknown-procedure":"No exported procedure was found at that file path.","unsupported-procedure-shape":"That procedure uses the bare query({…}) form — convert it to the builder form (c.use(…).query(…)) before wiring RLS."},Ue=async e=>{const t=await fetch(ze,{body:JSON.stringify(e),headers:{"Content-Type":"application/json"},method:"POST"}),s=await t.json();if(s.needsManualEdit===!0)return{kind:"needs-manual-edit",message:s.message??"This change must be made by hand."};if(t.ok)return{diagnostics:s.diagnostics??[],kind:"ok",label:s.fileName??s.exportName??""};const n=s.error;return{kind:"error",message:n===void 0?`policy scaffold failed (${String(t.status)})`:De[n]??n}},ne={exportName:"",filePath:"",policyName:"",policies:"",tableName:""},je=()=>{const e=me(69),t=ee(),[s,n]=h(null),[l,c]=h(!1),[o,f]=h(null),[r,b]=h(ne);let u;e[0]===Symbol.for("react.memo_cache_sentinel")?(u=X=>{const Q=X.target.name,{value:G}=X.target;b(ue=>({...ue,[Q]:G}))},e[0]=u):u=e[0];const g=u;let v;e[1]===Symbol.for("react.memo_cache_sentinel")?(v=()=>{n(null),b(ne)},e[1]=v):v=e[1];const N=v;let I;e[2]===Symbol.for("react.memo_cache_sentinel")?(I=async X=>{c(!0),f(null);try{const Q=await Ue(X);f(Q),Q.kind==="ok"&&N()}catch(Q){const G=Q;f({kind:"error",message:G instanceof Error?G.message:String(G)})}c(!1)},e[2]=I):I=e[2];const $=I;let P;e[3]!==r.policyName||e[4]!==r.tableName?(P=()=>{re($({kind:"scaffoldPolicy",name:r.policyName.trim(),table:r.tableName.trim()}))},e[3]=r.policyName,e[4]=r.tableName,e[5]=P):P=e[5];const k=P;let w;e[6]!==r.exportName||e[7]!==r.filePath||e[8]!==r.policies?(w=()=>{re($({exportName:r.exportName.trim(),filePath:r.filePath.trim(),kind:"wireRls",policies:r.policies.trim()}))},e[6]=r.exportName,e[7]=r.filePath,e[8]=r.policies,e[9]=w):w=e[9];const T=w;let S;e[10]===Symbol.for("react.memo_cache_sentinel")?(S=()=>{f(null),n("scaffold")},e[10]=S):S=e[10];const x=S;let d;e[11]===Symbol.for("react.memo_cache_sentinel")?(d=()=>{f(null),n("wire")},e[11]=d):d=e[11];const A=d;let y;e[12]!==t?(y=t("Scaffold access rules"),e[12]=t,e[13]=y):y=e[13];let _;e[14]!==y?(_=a(xe,{children:y}),e[14]=y,e[15]=_):_=e[15];let C;e[16]!==t?(C=t("Writes a new deny-by-default policy file under lunora/, or wires one into a procedure, then reruns codegen. Local dev only."),e[16]=t,e[17]=C):C=e[17];let E;e[18]!==C?(E=a(ye,{children:C}),e[18]=C,e[19]=E):E=e[19];let F;e[20]!==E||e[21]!==_?(F=i(be,{children:[_,E]}),e[20]=E,e[21]=_,e[22]=F):F=e[22];const Y=s==="scaffold"?"default":"outline";let R;e[23]!==t?(R=t("New policy file"),e[23]=t,e[24]=R):R=e[24];let O;e[25]!==Y||e[26]!==R?(O=a(L,{"data-testid":"policy-scaffolder-new",onClick:x,size:"xs",type:"button",variant:Y,children:R}),e[25]=Y,e[26]=R,e[27]=O):O=e[27];const m=s==="wire"?"default":"outline";let p;e[28]!==t?(p=t("Wire into a procedure"),e[28]=t,e[29]=p):p=e[29];let z;e[30]!==m||e[31]!==p?(z=a(L,{"data-testid":"policy-scaffolder-wire",onClick:A,size:"xs",type:"button",variant:m,children:p}),e[30]=m,e[31]=p,e[32]=z):z=e[32];let D;e[33]!==O||e[34]!==z?(D=i("div",{className:"flex flex-wrap gap-2",children:[O,z]}),e[33]=O,e[34]=z,e[35]=D):D=e[35];let U;e[36]!==l||e[37]!==r.policyName||e[38]!==r.tableName||e[39]!==s||e[40]!==k||e[41]!==t?(U=s==="scaffold"&&i("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"policy-scaffolder-new-form",children:[i("div",{className:"flex flex-col gap-1 text-xs",children:[a(M,{htmlFor:"policy-scaffolder-name",children:t("Policy name")}),a(H,{"data-testid":"policy-scaffolder-name",id:"policy-scaffolder-name",name:"policyName",onChange:g,value:r.policyName})]}),i("div",{className:"flex flex-col gap-1 text-xs",children:[a(M,{htmlFor:"policy-scaffolder-table",children:t("Table name")}),a(H,{"data-testid":"policy-scaffolder-table",id:"policy-scaffolder-table",name:"tableName",onChange:g,value:r.tableName})]}),a(L,{"data-testid":"policy-scaffolder-create",disabled:l||r.policyName.trim()===""||r.tableName.trim()==="",onClick:k,size:"xs",type:"button",children:t(l?"Creating…":"Create policy file")}),a(L,{onClick:N,size:"xs",type:"button",variant:"ghost",children:t("Cancel")})]}),e[36]=l,e[37]=r.policyName,e[38]=r.tableName,e[39]=s,e[40]=k,e[41]=t,e[42]=U):U=e[42];let j;e[43]!==l||e[44]!==r.exportName||e[45]!==r.filePath||e[46]!==r.policies||e[47]!==s||e[48]!==T||e[49]!==t?(j=s==="wire"&&i("div",{className:"mt-3 flex flex-wrap items-end gap-2","data-testid":"policy-scaffolder-wire-form",children:[i("div",{className:"flex flex-col gap-1 text-xs",children:[a(M,{htmlFor:"policy-scaffolder-file",children:t("Procedure file path")}),a(H,{"data-testid":"policy-scaffolder-file",id:"policy-scaffolder-file",name:"filePath",onChange:g,value:r.filePath})]}),i("div",{className:"flex flex-col gap-1 text-xs",children:[a(M,{htmlFor:"policy-scaffolder-export",children:t("Exported procedure")}),a(H,{"data-testid":"policy-scaffolder-export",id:"policy-scaffolder-export",name:"exportName",onChange:g,value:r.exportName})]}),i("div",{className:"flex flex-col gap-1 text-xs",children:[a(M,{htmlFor:"policy-scaffolder-policies",children:t("Policy set identifier")}),a(H,{"data-testid":"policy-scaffolder-policies",id:"policy-scaffolder-policies",name:"policies",onChange:g,value:r.policies})]}),a(L,{"data-testid":"policy-scaffolder-apply",disabled:l||r.filePath.trim()===""||r.exportName.trim()===""||r.policies.trim()==="",onClick:T,size:"xs",type:"button",children:t(l?"Wiring…":"Wire RLS")}),a(L,{onClick:N,size:"xs",type:"button",variant:"ghost",children:t("Cancel")})]}),e[43]=l,e[44]=r.exportName,e[45]=r.filePath,e[46]=r.policies,e[47]=s,e[48]=T,e[49]=t,e[50]=j):j=e[50];let B;e[51]!==o?(B=o?.kind==="error"&&a("p",{className:"mt-3 text-sm text-destructive","data-testid":"policy-scaffolder-error",role:"alert",children:o.message}),e[51]=o,e[52]=B):B=e[52];let W;e[53]!==o?.kind||e[54]!==t?(W=o?.kind==="needs-manual-edit"&&a("p",{className:"mt-3 text-sm text-amber-600 dark:text-amber-500","data-testid":"policy-scaffolder-manual",role:"alert",children:t("This change must be made by hand — the scaffolder only adds new, deny-by-default rules.")}),e[53]=o?.kind,e[54]=t,e[55]=W):W=e[55];let q;e[56]!==o||e[57]!==t?(q=o?.kind==="ok"&&i("div",{className:"mt-3 flex flex-col gap-1","data-testid":"policy-scaffolder-ok",children:[a("p",{className:"text-sm text-emerald-600 dark:text-emerald-500",children:t("Scaffolded {label} and reran codegen. Fill in the `when` predicates before relying on it.",{label:o.label})}),o.diagnostics.length>0&&a("ul",{className:"flex flex-col gap-0.5","data-testid":"policy-scaffolder-diagnostics",children:o.diagnostics.map(Be)})]}),e[56]=o,e[57]=t,e[58]=q):q=e[58];let J;e[59]!==D||e[60]!==U||e[61]!==j||e[62]!==B||e[63]!==W||e[64]!==q?(J=i(ce,{children:[D,U,j,B,W,q]}),e[59]=D,e[60]=U,e[61]=j,e[62]=B,e[63]=W,e[64]=q,e[65]=J):J=e[65];let V;return e[66]!==F||e[67]!==J?(V=i(de,{"data-testid":"policy-scaffolder",size:"sm",children:[F,J]}),e[66]=F,e[67]=J,e[68]=V):V=e[68],V};function Be(e){return a("li",{className:"font-mono text-[11px] text-destructive",children:e},e)}const nt=({functions:e,runAsIdentity:t=!1,schemaEditable:s=!1}={})=>{const n=ee(),[l,c]=h(void 0),o=(f,r,b)=>{b!==""&&c(u=>({functionPath:b,nonce:(u?.nonce??0)+1}))};return i("div",{className:"flex flex-col gap-8","data-testid":"lunora-permissions",children:[i("section",{className:"flex flex-col gap-3",children:[a("header",{className:"border-b border-border px-4 py-3",children:a("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:n("Permissions")})}),a(Fe,{onProbe:o})]}),a("section",{className:"flex flex-col gap-3",children:i(de,{className:"gap-0 py-0",children:[a("header",{className:"border-b border-border px-4 py-3",children:a("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:n("Probe")})}),i(ce,{className:"px-4 py-4",children:[a("p",{className:"mb-3 text-sm text-muted-foreground",children:n("Pick a function and an identity, then run it to see the access outcome.")}),a($e,{functions:e,prefill:l,runAsIdentity:t})]})]})}),s&&a("section",{className:"flex flex-col gap-2",children:a(je,{})})]})};export{nt as PermissionsPanel};
@@ -1 +1 @@
1
- import{c as P}from"react/compiler-runtime";import{useLunora as Ve}from"@lunora/react";import{useState as M}from"react";import{ConfirmButton as Ye}from"../packem_shared/ConfirmButton-Cj2SOapE.js";import{E as Xe}from"../packem_shared/error-alert-CKqB2CiN.js";import{A as Ke}from"../packem_shared/alert-C2SEhYS9.js";import{B as ve}from"../packem_shared/badge-cAk9Di1Q.js";import{B as Qe}from"../packem_shared/button-BOPLD1un.js";import{C as $e,a as Oe}from"../packem_shared/card-BGlQzQY-.js";import{E as we}from"../packem_shared/empty-state-B939z6K2.js";import{I as Ze}from"../packem_shared/input-CY5W3wzv.js";import{S as et}from"../packem_shared/scroll-area-DSJftwu_.js";import{T as ke,a as Ue,b as oe,c as _,d as Je,e as T}from"../packem_shared/table-BMsuYFhk.js";import{T as tt}from"../packem_shared/textarea-DpO3i-Qo.js";import{u as Be}from"../packem_shared/use-admin-query-DV9xmFl8.js";import{useAutoRefresh as st}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-DuULO4XM.js";import{useT as j}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{ADMIN_FUNCTIONS as G}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{d as _e,b as Te,c as Ae,f as Ce,i as at}from"../packem_shared/internal-7bgd8inO.js";import{jsx as s,jsxs as q,Fragment as Fe}from"react/jsx-runtime";const rt=(n,e)=>{const t=new Set(n.map(a=>a.deadLetterQueue).filter(a=>typeof a=="string"&&a!=="")),d=n.filter(a=>(a.deadLetterQueue===void 0||a.deadLetterQueue==="")&&!t.has(a.name)),l=e.filter(a=>a.deadLettered).length;return{deadLetteredCount:l,queuesWithoutDlq:d,showReliabilityWarning:d.length>0||l>0}},nt=200,ot=Ae(G.sendQueueMessage),lt=Ae(G.replayQueueMessage),dt=Ae(G.clearQueueMessages),Re=96,it=n=>{if(n===void 0)return"—";try{return JSON.stringify(n)}catch{return"[unserializable]"}},ct=n=>n.length>Re?`${n.slice(0,Re)}…`:n,ut=n=>n==="error"?"destructive":n==="retry"?"outline":"secondary",mt=(n,e)=>e(n==="messages"?"Messages":n==="send"?"Send":"Declared"),ft=n=>{const e=P(11),{loaded:t,queues:d}=n,l=j();let a;e[0]!==l?(a=l("Queues are declared in code with defineQueue. Enqueue from a mutation or action with ctx.queues.<name>.send(...); push consumers process batches in the worker."),e[0]=l,e[1]=a):a=e[1];let o;e[2]!==a?(o=s("p",{className:"text-sm text-muted-foreground",children:a}),e[2]=a,e[3]=o):o=e[3];let r;e[4]!==t||e[5]!==d||e[6]!==l?(r=t&&d.length===0?s(we,{description:l("No defineQueue is declared in lunora/queues.ts in this deployment. Add one to offload async work to a Cloudflare Queue."),testId:"queues-empty",title:l("No queues defined")}):s($e,{className:"overflow-hidden py-0",children:s(Oe,{className:"px-0",children:q(ke,{"data-testid":"queues-table",children:[s(Ue,{children:q(oe,{children:[s(_,{children:l("Export")}),s(_,{children:l("Queue")}),s(_,{children:l("Mode")}),s(_,{children:l("Binding")}),s(_,{children:l("Dead-letter")})]})}),s(Je,{children:d.map(xt)})]})})}),e[4]=t,e[5]=d,e[6]=l,e[7]=r):r=e[7];let f;return e[8]!==o||e[9]!==r?(f=q("div",{className:"flex flex-col gap-4","data-testid":"queues-declared",children:[o,r]}),e[8]=o,e[9]=r,e[10]=f):f=e[10],f},ht=n=>{const e=P(67),{message:t,onReplay:d,replayingId:l}=n,a=j();let o,r,f,u,g,y,x,i,m,p;if(e[0]!==t.attempts||e[1]!==t.body||e[2]!==t.deadLettered||e[3]!==t.exportName||e[4]!==t.id||e[5]!==t.messageId||e[6]!==t.outcome||e[7]!==t.queue||e[8]!==a){const U=it(t.body);r=oe,y=`queues-message-${t.id}`;const J=t.exportName??t.queue;e[19]!==J?(x=s(T,{className:"font-mono text-xs",children:J}),e[19]=J,e[20]=x):x=e[20],e[21]!==t.messageId?(i=s(T,{className:"max-w-[16ch] truncate font-mono text-xs text-muted-foreground",title:t.messageId,children:t.messageId}),e[21]=t.messageId,e[22]=i):i=e[22],e[23]!==t.attempts?(m=s(T,{className:"font-mono text-xs tabular-nums",children:t.attempts}),e[23]=t.attempts,e[24]=m):m=e[24];const A=`queues-outcome-${t.id}`;let I;e[25]!==t.outcome?(I=ut(t.outcome),e[25]=t.outcome,e[26]=I):I=e[26];let C;e[27]!==t.outcome||e[28]!==A||e[29]!==I?(C=s(ve,{"data-testid":A,variant:I,children:t.outcome}),e[27]=t.outcome,e[28]=A,e[29]=I,e[30]=C):C=e[30];let L;e[31]!==t.deadLettered||e[32]!==t.id||e[33]!==a?(L=t.deadLettered&&s(ve,{"data-testid":`queues-dlq-${t.id}`,variant:"destructive",children:a("DLQ")}),e[31]=t.deadLettered,e[32]=t.id,e[33]=a,e[34]=L):L=e[34],e[35]!==C||e[36]!==L?(p=s(T,{children:q("span",{className:"inline-flex items-center gap-1",children:[C,L]})}),e[35]=C,e[36]=L,e[37]=p):p=e[37],o=T,f="max-w-[32ch] truncate font-mono text-xs text-muted-foreground",u=U,g=ct(U),e[0]=t.attempts,e[1]=t.body,e[2]=t.deadLettered,e[3]=t.exportName,e[4]=t.id,e[5]=t.messageId,e[6]=t.outcome,e[7]=t.queue,e[8]=a,e[9]=o,e[10]=r,e[11]=f,e[12]=u,e[13]=g,e[14]=y,e[15]=x,e[16]=i,e[17]=m,e[18]=p}else o=e[9],r=e[10],f=e[11],u=e[12],g=e[13],y=e[14],x=e[15],i=e[16],m=e[17],p=e[18];let h;e[38]!==o||e[39]!==f||e[40]!==u||e[41]!==g?(h=s(o,{className:f,title:u,children:g}),e[38]=o,e[39]=f,e[40]=u,e[41]=g,e[42]=h):h=e[42];let N;e[43]!==t.capturedAt?(N=at(t.capturedAt,"—"),e[43]=t.capturedAt,e[44]=N):N=e[44];let b;e[45]!==N?(b=s(T,{className:"text-xs text-muted-foreground tabular-nums",children:N}),e[45]=N,e[46]=b):b=e[46];const E=`queues-replay-${t.id}`,w=l!==null;let v;e[47]!==t.id||e[48]!==l||e[49]!==a?(v=l===t.id?a("Replaying…"):a("Replay"),e[47]=t.id,e[48]=l,e[49]=a,e[50]=v):v=e[50];let Q;e[51]!==t.id||e[52]!==d||e[53]!==E||e[54]!==w||e[55]!==v?(Q=s(T,{children:s(Qe,{"data-id":t.id,"data-testid":E,disabled:w,onClick:d,size:"xs",type:"button",variant:"outline",children:v})}),e[51]=t.id,e[52]=d,e[53]=E,e[54]=w,e[55]=v,e[56]=Q):Q=e[56];let D;return e[57]!==r||e[58]!==b||e[59]!==Q||e[60]!==y||e[61]!==x||e[62]!==i||e[63]!==m||e[64]!==p||e[65]!==h?(D=q(r,{"data-testid":y,children:[x,i,m,p,h,b,Q]}),e[57]=r,e[58]=b,e[59]=Q,e[60]=y,e[61]=x,e[62]=i,e[63]=m,e[64]=p,e[65]=h,e[66]=D):D=e[66],D},pt=n=>{const e=P(30),{hasError:t,messages:d,onClear:l,onReplay:a,replayingId:o}=n,r=j();let f;e[0]!==r?(f=r("Cloudflare Queues have no peek API, so this is what push consumers actually processed — not pending depth."),e[0]=r,e[1]=f):f=e[1];let u;e[2]!==f?(u=s("p",{className:"text-sm text-muted-foreground",children:f}),e[2]=f,e[3]=u):u=e[3];let g;e[4]!==d.length||e[5]!==r?(g=r("Clear {count} messages?",{count:d.length}),e[4]=d.length,e[5]=r,e[6]=g):g=e[6];const y=d.length===0;let x;e[7]!==r?(x=r("Clear log"),e[7]=r,e[8]=x):x=e[8];let i;e[9]!==l||e[10]!==g||e[11]!==y||e[12]!==x?(i=s("div",{className:"ml-auto",children:s(Ye,{confirmLabel:g,disabled:y,onConfirm:l,testId:"queues-clear",children:x})}),e[9]=l,e[10]=g,e[11]=y,e[12]=x,e[13]=i):i=e[13];let m;e[14]!==d.length||e[15]!==r?(m=d.length>0&&s(ve,{"data-testid":"queues-count",variant:"secondary",children:r("{count} messages",{count:d.length})}),e[14]=d.length,e[15]=r,e[16]=m):m=e[16];let p;e[17]!==u||e[18]!==i||e[19]!==m?(p=q("div",{className:"flex flex-wrap items-center gap-2",children:[u,i,m]}),e[17]=u,e[18]=i,e[19]=m,e[20]=p):p=e[20];let h;e[21]!==t||e[22]!==d||e[23]!==a||e[24]!==o||e[25]!==r?(h=!t&&d.length===0?s(we,{description:r("Consumed messages appear here once a push consumer processes a batch in dev. Send one from the Send tab to see it captured."),testId:"queues-messages-empty",title:r("No consumed messages yet.")}):s($e,{className:"overflow-hidden py-0",children:s(Oe,{className:"px-0",children:s(et,{className:"max-h-[32rem]","data-testid":"queues-messages-scroll",children:q(ke,{"data-testid":"queues-messages-table",children:[s(Ue,{children:q(oe,{children:[s(_,{children:r("Export")}),s(_,{children:r("Message")}),s(_,{children:r("Attempts")}),s(_,{children:r("Outcome")}),s(_,{children:r("Body")}),s(_,{children:r("Captured")}),s(_,{})]})}),s(Je,{children:d.map(b=>s(ht,{message:b,onReplay:a,replayingId:o},b.id))})]})})})}),e[21]=t,e[22]=d,e[23]=a,e[24]=o,e[25]=r,e[26]=h):h=e[26];let N;return e[27]!==p||e[28]!==h?(N=q("div",{className:"flex flex-col gap-4","data-testid":"queues-messages",children:[p,h]}),e[27]=p,e[28]=h,e[29]=N):N=e[29],N},gt=n=>{const e=P(20),{batchMode:t,bodyText:d,delayText:l,onBatchModeChange:a,onBodyChange:o,onDelayChange:r,onSelectExport:f,onSend:u,queues:g,selectedExportName:y,sending:x}=n,i=j();let m;e[0]!==i?(m=i("Enqueue a JSON message to a declared producer to exercise its consumer. Nothing is captured until the consumer processes it."),e[0]=i,e[1]=m):m=e[1];let p;e[2]!==m?(p=s("p",{className:"text-sm text-muted-foreground",children:m}),e[2]=m,e[3]=p):p=e[3];let h;e[4]!==t||e[5]!==d||e[6]!==l||e[7]!==a||e[8]!==o||e[9]!==r||e[10]!==f||e[11]!==u||e[12]!==g||e[13]!==y||e[14]!==x||e[15]!==i?(h=g.length===0?s(we,{description:i("Declare a queue with defineQueue in lunora/queues.ts to enqueue a test message."),testId:"queues-send-empty",title:i("No queues to send to")}):q(Fe,{children:[q("div",{className:"flex flex-wrap items-center gap-2",children:[s("select",{"aria-label":i("Queue"),className:"h-8 rounded-md border border-input bg-transparent px-2.5 py-1 text-xs outline-none focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50","data-testid":"queues-send-select",onChange:f,value:y,children:g.map(yt)}),s(Ze,{"aria-label":i("Delay (seconds)"),className:"max-w-36","data-testid":"queues-send-delay",min:0,onChange:r,placeholder:i("Delay (s)"),type:"number",value:l}),q("label",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",htmlFor:"queues-send-batch",children:[s("input",{checked:t,"data-testid":"queues-send-batch",id:"queues-send-batch",onChange:a,type:"checkbox"}),i("Send as batch (JSON array)")]}),s(Qe,{className:"ml-auto","data-testid":"queues-send-button",disabled:x||y==="",onClick:u,type:"button",children:i(x?"Sending…":"Send message")})]}),s(tt,{"aria-label":i("Message body (JSON)"),className:"font-mono","data-testid":"queues-send-body",onChange:o,placeholder:t?'[ { "hello": "world" } ]':'{ "hello": "world" }',value:d})]}),e[4]=t,e[5]=d,e[6]=l,e[7]=a,e[8]=o,e[9]=r,e[10]=f,e[11]=u,e[12]=g,e[13]=y,e[14]=x,e[15]=i,e[16]=h):h=e[16];let N;return e[17]!==p||e[18]!==h?(N=q("div",{className:"flex flex-col gap-3","data-testid":"queues-send",children:[p,h]}),e[17]=p,e[18]=h,e[19]=N):N=e[19],N},Ft=n=>{const e=P(59),{limit:t}=n,d=t??nt,l=Ve(),a=j(),[o,r]=M("declared"),[f,u]=M(null);let g;e[0]===Symbol.for("react.memo_cache_sentinel")?(g={},e[0]=g):g=e[0];const{data:y,error:x,errorSource:i}=Be(G.listQueues,g);let m;e[1]!==d?(m={limit:d},e[1]=d,e[2]=m):m=e[2];const{data:p,error:h,errorSource:N,refetch:b}=Be(G.getQueueMessages,m),E=Array.isArray(y?.queues)?[...y.queues].toSorted(bt):[],w=p?.entries??[],{deadLetteredCount:v,queuesWithoutDlq:Q,showReliabilityWarning:D}=rt(E,w),[U,J]=M(""),[A,I]=M(""),[C,L]=M(""),[F,We]=M(!1),[le,Ie]=M(!1),[de,Le]=M(null),z=E.some(c=>c.exportName===U)?U:E[0]?.exportName??"",Me=o==="messages"?h:x,Ge=o==="messages"?N:i,ie=Me??f,ce=Me===null?f:Ge;let H;e[3]!==b?(H=()=>{b()},e[3]=b,e[4]=H):H=e[4],st(H,o==="messages");const ue=async()=>{u(null);const c=z;if(c==="")return;let S=null;const Se=A.trim();if(Se!=="")try{S=JSON.parse(Se)}catch{u(a("Body must be valid JSON."));return}let Ee;const De=C.trim();if(De!==""){const W=Number(De);if(!Number.isFinite(W)||W<0){u(a("Delay must be a non-negative number of seconds."));return}Ee=W}if(F&&!Array.isArray(S)){u(a("Batch mode needs a JSON array body — each element is enqueued as one message."));return}Ie(!0);const He=F?{batch:S,delaySeconds:Ee,exportName:c}:{body:S,delaySeconds:Ee,exportName:c};try{await l.query(ot,He,_e("")),b()}catch(W){u(Te(W))}Ie(!1)};let V;e[5]!==l||e[6]!==b?(V=async c=>{u(null),Le(c);try{await l.query(lt,{id:c},_e("")),b()}catch(S){u(Te(S))}Le(null)},e[5]=l,e[6]=b,e[7]=V):V=e[7];const me=V;let Y;e[8]!==l||e[9]!==b?(Y=async()=>{u(null);try{await l.query(dt,{},_e("")),b()}catch(c){u(Te(c))}},e[8]=l,e[9]=b,e[10]=Y):Y=e[10];const fe=Y;let X;e[11]===Symbol.for("react.memo_cache_sentinel")?(X=c=>{const S=c.currentTarget.dataset.tab;(S==="declared"||S==="messages"||S==="send")&&r(S)},e[11]=X):X=e[11];const Pe=X;let K;e[12]===Symbol.for("react.memo_cache_sentinel")?(K=c=>{J(c.currentTarget.value)},e[12]=K):K=e[12];const he=K;let Z;e[13]===Symbol.for("react.memo_cache_sentinel")?(Z=c=>{I(c.currentTarget.value)},e[13]=Z):Z=e[13];const pe=Z;let ee;e[14]===Symbol.for("react.memo_cache_sentinel")?(ee=c=>{L(c.currentTarget.value)},e[14]=ee):ee=e[14];const ge=ee;let te;e[15]===Symbol.for("react.memo_cache_sentinel")?(te=c=>{We(c.currentTarget.checked)},e[15]=te):te=e[15];const xe=te;let se;e[16]!==ue?(se=()=>{Ce(ue())},e[16]=ue,e[17]=se):se=e[17];const ye=se;let ae;e[18]!==me?(ae=c=>{const{id:S}=c.currentTarget.dataset;S!==void 0&&Ce(me(S))},e[18]=me,e[19]=ae):ae=e[19];const be=ae;let re;e[20]!==fe?(re=()=>{Ce(fe())},e[20]=fe,e[21]=re):re=e[21];const Ne=re,je="flex flex-col gap-6",ze="lunora-queues-panel";let B;e[22]!==a||e[23]!==o?(B=s("div",{className:"flex items-center gap-1","data-testid":"queues-tabs",role:"tablist",children:["declared","messages","send"].map(c=>s(Qe,{"aria-selected":o===c,"data-tab":c,"data-testid":`queues-tab-${c}`,onClick:Pe,role:"tab",size:"sm",type:"button",variant:o===c?"secondary":"ghost",children:mt(c,a)},c))}),e[22]=a,e[23]=o,e[24]=B):B=e[24];let R;e[25]!==ie||e[26]!==ce?(R=ie!==null&&s(Xe,{error:ce,testId:"queues-error"}),e[25]=ie,e[26]=ce,e[27]=R):R=e[27];const qe=D&&s(Ke,{icon:s("span",{"aria-hidden":"true",className:"text-base leading-none",children:"⚠"}),testId:"queues-dlq-warning",variant:"warning",children:q("div",{className:"flex flex-col gap-1",children:[Q.length>0&&q(Fe,{children:[s("p",{className:"font-medium",children:a("No dead-letter queue on {queues}.",{queues:Q.map(Nt).join(", ")})}),s("p",{className:"text-muted-foreground",children:a("Exhausted messages are dropped after retries. Add a deadLetterQueue to capture them.")})]}),v>0&&s("p",{className:Q.length>0?"text-muted-foreground":"font-medium",children:v===1?a("1 message was recently dead-lettered."):a("{count} messages were recently dead-lettered.",{count:v})})]})});let $;e[28]!==E||e[29]!==y||e[30]!==o?($=o==="declared"&&s(ft,{loaded:y!==void 0,queues:E}),e[28]=E,e[29]=y,e[30]=o,e[31]=$):$=e[31];let O;e[32]!==w||e[33]!==h||e[34]!==Ne||e[35]!==be||e[36]!==de||e[37]!==o?(O=o==="messages"&&s(pt,{hasError:h!==null,messages:w,onClear:Ne,onReplay:be,replayingId:de}),e[32]=w,e[33]=h,e[34]=Ne,e[35]=be,e[36]=de,e[37]=o,e[38]=O):O=e[38];let k;e[39]!==F||e[40]!==A||e[41]!==C||e[42]!==xe||e[43]!==pe||e[44]!==ge||e[45]!==he||e[46]!==ye||e[47]!==E||e[48]!==z||e[49]!==le||e[50]!==o?(k=o==="send"&&s(gt,{batchMode:F,bodyText:A,delayText:C,onBatchModeChange:xe,onBodyChange:pe,onDelayChange:ge,onSelectExport:he,onSend:ye,queues:E,selectedExportName:z,sending:le}),e[39]=F,e[40]=A,e[41]=C,e[42]=xe,e[43]=pe,e[44]=ge,e[45]=he,e[46]=ye,e[47]=E,e[48]=z,e[49]=le,e[50]=o,e[51]=k):k=e[51];let ne;return e[52]!==B||e[53]!==R||e[54]!==qe||e[55]!==$||e[56]!==O||e[57]!==k?(ne=q("div",{className:je,"data-testid":ze,children:[B,R,qe,$,O,k]}),e[52]=B,e[53]=R,e[54]=qe,e[55]=$,e[56]=O,e[57]=k,e[58]=ne):ne=e[58],ne};function xt(n){return q(oe,{"data-testid":`queues-row-${n.exportName}`,children:[s(T,{className:"font-mono text-xs",children:n.exportName}),s(T,{className:"font-mono text-xs text-muted-foreground",children:n.name}),s(T,{className:"font-mono text-xs text-muted-foreground",children:n.mode}),s(T,{className:"font-mono text-xs text-muted-foreground",children:n.binding}),s(T,{className:"font-mono text-xs text-muted-foreground",children:n.deadLetterQueue??"—"})]},n.exportName)}function yt(n){return s("option",{value:n.exportName,children:n.exportName},n.exportName)}function bt(n,e){return n.exportName.localeCompare(e.exportName)}function Nt(n){return n.name}export{Ft as default};
1
+ import{c as P}from"react/compiler-runtime";import{useLunora as Ve}from"@lunora/react";import{useState as M}from"react";import{ConfirmButton as Ye}from"../packem_shared/ConfirmButton-Cj2SOapE.js";import{E as Xe}from"../packem_shared/error-alert-CKqB2CiN.js";import{A as Ke}from"../packem_shared/alert-C2SEhYS9.js";import{B as ve}from"../packem_shared/badge-cAk9Di1Q.js";import{B as Qe}from"../packem_shared/button-BOPLD1un.js";import{C as $e,a as Oe}from"../packem_shared/card-BGlQzQY-.js";import{E as we}from"../packem_shared/empty-state-B939z6K2.js";import{I as Ze}from"../packem_shared/input-CY5W3wzv.js";import{S as et}from"../packem_shared/scroll-area-DSJftwu_.js";import{T as ke,a as Ue,b as oe,c as _,d as Je,e as T}from"../packem_shared/table-BMsuYFhk.js";import{T as tt}from"../packem_shared/textarea-DpO3i-Qo.js";import{u as Be}from"../packem_shared/use-admin-query-DV9xmFl8.js";import{useAutoRefresh as st}from"../packem_shared/DEFAULT_AUTO_REFRESH_MS-DuULO4XM.js";import{useT as j}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{ADMIN_FUNCTIONS as G}from"../packem_shared/ADMIN_FUNCTIONS-B6z7VLYt.js";import{d as _e,b as Te,c as Ae,f as Ce,i as at}from"../packem_shared/internal-7bgd8inO.js";import{jsx as s,jsxs as q,Fragment as Fe}from"react/jsx-runtime";const rt=(n,e)=>{const t=new Set(n.map(a=>a.deadLetterQueue).filter(a=>typeof a=="string"&&a!=="")),d=n.filter(a=>(a.deadLetterQueue===void 0||a.deadLetterQueue==="")&&!t.has(a.name)),l=e.filter(a=>a.deadLettered).length;return{deadLetteredCount:l,queuesWithoutDlq:d,showReliabilityWarning:d.length>0||l>0}},nt=200,ot=Ae(G.sendQueueMessage),lt=Ae(G.replayQueueMessage),dt=Ae(G.clearQueueMessages),Re=96,it=n=>{if(n===void 0)return"—";try{return JSON.stringify(n)}catch{return"[unserializable]"}},ct=n=>n.length>Re?`${n.slice(0,Re)}…`:n,ut=n=>n==="error"?"destructive":n==="retry"?"outline":"secondary",mt=(n,e)=>e(n==="messages"?"Messages":n==="send"?"Send":"Declared"),ft=n=>{const e=P(11),{loaded:t,queues:d}=n,l=j();let a;e[0]!==l?(a=l("Queues are declared in code with defineQueue. Enqueue from a mutation or action with ctx.queues.<name>.send(...); push consumers process batches in the worker."),e[0]=l,e[1]=a):a=e[1];let o;e[2]!==a?(o=s("p",{className:"text-sm text-muted-foreground",children:a}),e[2]=a,e[3]=o):o=e[3];let r;e[4]!==t||e[5]!==d||e[6]!==l?(r=t&&d.length===0?s(we,{description:l("No defineQueue is declared in lunora/queues.ts in this deployment. Add one to offload async work to a Cloudflare Queue."),testId:"queues-empty",title:l("No queues defined")}):s($e,{className:"overflow-hidden py-0",children:s(Oe,{className:"px-0",children:q(ke,{"data-testid":"queues-table",children:[s(Ue,{children:q(oe,{children:[s(_,{children:l("Export")}),s(_,{children:l("Queue")}),s(_,{children:l("Mode")}),s(_,{children:l("Binding")}),s(_,{children:l("Dead-letter")})]})}),s(Je,{children:d.map(xt)})]})})}),e[4]=t,e[5]=d,e[6]=l,e[7]=r):r=e[7];let f;return e[8]!==o||e[9]!==r?(f=q("div",{className:"flex flex-col gap-4","data-testid":"queues-declared",children:[o,r]}),e[8]=o,e[9]=r,e[10]=f):f=e[10],f},ht=n=>{const e=P(67),{message:t,onReplay:d,replayingId:l}=n,a=j();let o,r,f,u,g,y,x,i,m,p;if(e[0]!==t.attempts||e[1]!==t.body||e[2]!==t.deadLettered||e[3]!==t.exportName||e[4]!==t.id||e[5]!==t.messageId||e[6]!==t.outcome||e[7]!==t.queue||e[8]!==a){const U=it(t.body);r=oe,y=`queues-message-${t.id}`;const J=t.exportName??t.queue;e[19]!==J?(x=s(T,{className:"font-mono text-xs",children:J}),e[19]=J,e[20]=x):x=e[20],e[21]!==t.messageId?(i=s(T,{className:"max-w-[16ch] truncate font-mono text-xs text-muted-foreground",title:t.messageId,children:t.messageId}),e[21]=t.messageId,e[22]=i):i=e[22],e[23]!==t.attempts?(m=s(T,{className:"font-mono text-xs tabular-nums",children:t.attempts}),e[23]=t.attempts,e[24]=m):m=e[24];const A=`queues-outcome-${t.id}`;let I;e[25]!==t.outcome?(I=ut(t.outcome),e[25]=t.outcome,e[26]=I):I=e[26];let C;e[27]!==t.outcome||e[28]!==A||e[29]!==I?(C=s(ve,{"data-testid":A,variant:I,children:t.outcome}),e[27]=t.outcome,e[28]=A,e[29]=I,e[30]=C):C=e[30];let L;e[31]!==t.deadLettered||e[32]!==t.id||e[33]!==a?(L=t.deadLettered&&s(ve,{"data-testid":`queues-dlq-${t.id}`,variant:"destructive",children:a("DLQ")}),e[31]=t.deadLettered,e[32]=t.id,e[33]=a,e[34]=L):L=e[34],e[35]!==C||e[36]!==L?(p=s(T,{children:q("span",{className:"inline-flex items-center gap-1",children:[C,L]})}),e[35]=C,e[36]=L,e[37]=p):p=e[37],o=T,f="max-w-[32ch] truncate font-mono text-xs text-muted-foreground",u=U,g=ct(U),e[0]=t.attempts,e[1]=t.body,e[2]=t.deadLettered,e[3]=t.exportName,e[4]=t.id,e[5]=t.messageId,e[6]=t.outcome,e[7]=t.queue,e[8]=a,e[9]=o,e[10]=r,e[11]=f,e[12]=u,e[13]=g,e[14]=y,e[15]=x,e[16]=i,e[17]=m,e[18]=p}else o=e[9],r=e[10],f=e[11],u=e[12],g=e[13],y=e[14],x=e[15],i=e[16],m=e[17],p=e[18];let h;e[38]!==o||e[39]!==f||e[40]!==u||e[41]!==g?(h=s(o,{className:f,title:u,children:g}),e[38]=o,e[39]=f,e[40]=u,e[41]=g,e[42]=h):h=e[42];let N;e[43]!==t.capturedAt?(N=at(t.capturedAt,"—"),e[43]=t.capturedAt,e[44]=N):N=e[44];let b;e[45]!==N?(b=s(T,{className:"text-xs text-muted-foreground tabular-nums",children:N}),e[45]=N,e[46]=b):b=e[46];const E=`queues-replay-${t.id}`,w=l!==null;let v;e[47]!==t.id||e[48]!==l||e[49]!==a?(v=l===t.id?a("Replaying…"):a("Replay"),e[47]=t.id,e[48]=l,e[49]=a,e[50]=v):v=e[50];let Q;e[51]!==t.id||e[52]!==d||e[53]!==E||e[54]!==w||e[55]!==v?(Q=s(T,{children:s(Qe,{"data-id":t.id,"data-testid":E,disabled:w,onClick:d,size:"xs",type:"button",variant:"outline",children:v})}),e[51]=t.id,e[52]=d,e[53]=E,e[54]=w,e[55]=v,e[56]=Q):Q=e[56];let D;return e[57]!==r||e[58]!==b||e[59]!==Q||e[60]!==y||e[61]!==x||e[62]!==i||e[63]!==m||e[64]!==p||e[65]!==h?(D=q(r,{"data-testid":y,children:[x,i,m,p,h,b,Q]}),e[57]=r,e[58]=b,e[59]=Q,e[60]=y,e[61]=x,e[62]=i,e[63]=m,e[64]=p,e[65]=h,e[66]=D):D=e[66],D},pt=n=>{const e=P(30),{hasError:t,messages:d,onClear:l,onReplay:a,replayingId:o}=n,r=j();let f;e[0]!==r?(f=r("Cloudflare Queues have no peek API, so this is what push consumers actually processed — not pending depth."),e[0]=r,e[1]=f):f=e[1];let u;e[2]!==f?(u=s("p",{className:"text-sm text-muted-foreground",children:f}),e[2]=f,e[3]=u):u=e[3];let g;e[4]!==d.length||e[5]!==r?(g=r("Clear {count} messages?",{count:d.length}),e[4]=d.length,e[5]=r,e[6]=g):g=e[6];const y=d.length===0;let x;e[7]!==r?(x=r("Clear log"),e[7]=r,e[8]=x):x=e[8];let i;e[9]!==l||e[10]!==g||e[11]!==y||e[12]!==x?(i=s("div",{className:"ml-auto",children:s(Ye,{confirmLabel:g,disabled:y,onConfirm:l,testId:"queues-clear",children:x})}),e[9]=l,e[10]=g,e[11]=y,e[12]=x,e[13]=i):i=e[13];let m;e[14]!==d.length||e[15]!==r?(m=d.length>0&&s(ve,{"data-testid":"queues-count",variant:"secondary",children:r("{count} messages",{count:d.length})}),e[14]=d.length,e[15]=r,e[16]=m):m=e[16];let p;e[17]!==u||e[18]!==i||e[19]!==m?(p=q("div",{className:"flex flex-wrap items-center gap-2",children:[u,i,m]}),e[17]=u,e[18]=i,e[19]=m,e[20]=p):p=e[20];let h;e[21]!==t||e[22]!==d||e[23]!==a||e[24]!==o||e[25]!==r?(h=!t&&d.length===0?s(we,{description:r("Consumed messages appear here once a push consumer processes a batch in dev. Send one from the Send tab to see it captured."),testId:"queues-messages-empty",title:r("No consumed messages yet.")}):s($e,{className:"overflow-hidden py-0",children:s(Oe,{className:"px-0",children:s(et,{className:"max-h-[32rem]","data-testid":"queues-messages-scroll",children:q(ke,{"data-testid":"queues-messages-table",children:[s(Ue,{children:q(oe,{children:[s(_,{children:r("Export")}),s(_,{children:r("Message")}),s(_,{children:r("Attempts")}),s(_,{children:r("Outcome")}),s(_,{children:r("Body")}),s(_,{children:r("Captured")}),s(_,{})]})}),s(Je,{children:d.map(b=>s(ht,{message:b,onReplay:a,replayingId:o},b.id))})]})})})}),e[21]=t,e[22]=d,e[23]=a,e[24]=o,e[25]=r,e[26]=h):h=e[26];let N;return e[27]!==p||e[28]!==h?(N=q("div",{className:"flex flex-col gap-4","data-testid":"queues-messages",children:[p,h]}),e[27]=p,e[28]=h,e[29]=N):N=e[29],N},gt=n=>{const e=P(20),{batchMode:t,bodyText:d,delayText:l,onBatchModeChange:a,onBodyChange:o,onDelayChange:r,onSelectExport:f,onSend:u,queues:g,selectedExportName:y,sending:x}=n,i=j();let m;e[0]!==i?(m=i("Enqueue a JSON message to a declared producer to exercise its consumer. Nothing is captured until the consumer processes it."),e[0]=i,e[1]=m):m=e[1];let p;e[2]!==m?(p=s("p",{className:"text-sm text-muted-foreground",children:m}),e[2]=m,e[3]=p):p=e[3];let h;e[4]!==t||e[5]!==d||e[6]!==l||e[7]!==a||e[8]!==o||e[9]!==r||e[10]!==f||e[11]!==u||e[12]!==g||e[13]!==y||e[14]!==x||e[15]!==i?(h=g.length===0?s(we,{description:i("Declare a queue with defineQueue in lunora/queues.ts to enqueue a test message."),testId:"queues-send-empty",title:i("No queues to send to")}):q(Fe,{children:[q("div",{className:"flex flex-wrap items-center gap-2",children:[s("select",{"aria-label":i("Queue"),className:"h-8 rounded-md border border-input bg-transparent px-2.5 py-1 text-xs outline-none focus-visible:border-ring focus-visible:ring-1 focus-visible:ring-ring/50","data-testid":"queues-send-select",onChange:f,value:y,children:g.map(yt)}),s(Ze,{"aria-label":i("Delay (seconds)"),className:"max-w-36","data-testid":"queues-send-delay",min:0,onChange:r,placeholder:i("Delay (s)"),type:"number",value:l}),q("label",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",htmlFor:"queues-send-batch",children:[s("input",{checked:t,"data-testid":"queues-send-batch",id:"queues-send-batch",onChange:a,type:"checkbox"}),i("Send as batch (JSON array)")]}),s(Qe,{className:"ml-auto","data-testid":"queues-send-button",disabled:x||y==="",onClick:u,type:"button",children:i(x?"Sending…":"Send message")})]}),s(tt,{"aria-label":i("Message body (JSON)"),className:"font-mono","data-testid":"queues-send-body",onChange:o,placeholder:t?'[ { "hello": "world" } ]':'{ "hello": "world" }',value:d})]}),e[4]=t,e[5]=d,e[6]=l,e[7]=a,e[8]=o,e[9]=r,e[10]=f,e[11]=u,e[12]=g,e[13]=y,e[14]=x,e[15]=i,e[16]=h):h=e[16];let N;return e[17]!==p||e[18]!==h?(N=q("div",{className:"flex flex-col gap-3","data-testid":"queues-send",children:[p,h]}),e[17]=p,e[18]=h,e[19]=N):N=e[19],N},Ft=n=>{const e=P(59),{limit:t}=n,d=t??nt,l=Ve(),a=j(),[o,r]=M("declared"),[f,u]=M(null);let g;e[0]===Symbol.for("react.memo_cache_sentinel")?(g={},e[0]=g):g=e[0];const{data:y,error:x,errorSource:i}=Be(G.listQueues,g);let m;e[1]!==d?(m={limit:d},e[1]=d,e[2]=m):m=e[2];const{data:p,error:h,errorSource:N,refetch:b}=Be(G.getQueueMessages,m),E=Array.isArray(y?.queues)?[...y.queues].toSorted(bt):[],w=p?.entries??[],{deadLetteredCount:v,queuesWithoutDlq:Q,showReliabilityWarning:D}=rt(E,w),[U,J]=M(""),[A,I]=M(""),[C,L]=M(""),[F,We]=M(!1),[le,Ie]=M(!1),[de,Le]=M(null),z=E.some(c=>c.exportName===U)?U:E[0]?.exportName??"",Me=o==="messages"?h:x,Ge=o==="messages"?N:i,ie=Me??f,ce=Me===null?f:Ge;let H;e[3]!==b?(H=()=>{b()},e[3]=b,e[4]=H):H=e[4],st(H,o==="messages");const ue=async()=>{u(null);const c=z;if(c==="")return;let S=null;const Se=A.trim();if(Se!=="")try{S=JSON.parse(Se)}catch{u(a("Body must be valid JSON."));return}let Ee;const De=C.trim();if(De!==""){const W=Number(De);if(!Number.isFinite(W)||W<0){u(a("Delay must be a non-negative number of seconds."));return}Ee=W}if(F&&!Array.isArray(S)){u(a("Batch mode needs a JSON array body — each element is enqueued as one message."));return}Ie(!0);const He=F?{batch:S,delaySeconds:Ee,exportName:c}:{body:S,delaySeconds:Ee,exportName:c};try{await l.query(ot,He,_e("")),b()}catch(W){u(Te(W))}Ie(!1)};let V;e[5]!==l||e[6]!==b?(V=async c=>{u(null),Le(c);try{await l.query(lt,{id:c},_e("")),b()}catch(S){u(Te(S))}Le(null)},e[5]=l,e[6]=b,e[7]=V):V=e[7];const me=V;let Y;e[8]!==l||e[9]!==b?(Y=async()=>{u(null);try{await l.query(dt,{},_e("")),b()}catch(c){u(Te(c))}},e[8]=l,e[9]=b,e[10]=Y):Y=e[10];const fe=Y;let X;e[11]===Symbol.for("react.memo_cache_sentinel")?(X=c=>{const S=c.currentTarget.dataset.tab;(S==="declared"||S==="messages"||S==="send")&&r(S)},e[11]=X):X=e[11];const Pe=X;let K;e[12]===Symbol.for("react.memo_cache_sentinel")?(K=c=>{J(c.currentTarget.value)},e[12]=K):K=e[12];const he=K;let Z;e[13]===Symbol.for("react.memo_cache_sentinel")?(Z=c=>{I(c.currentTarget.value)},e[13]=Z):Z=e[13];const pe=Z;let ee;e[14]===Symbol.for("react.memo_cache_sentinel")?(ee=c=>{L(c.currentTarget.value)},e[14]=ee):ee=e[14];const ge=ee;let te;e[15]===Symbol.for("react.memo_cache_sentinel")?(te=c=>{We(c.currentTarget.checked)},e[15]=te):te=e[15];const xe=te;let se;e[16]!==ue?(se=()=>{Ce(ue())},e[16]=ue,e[17]=se):se=e[17];const ye=se;let ae;e[18]!==me?(ae=c=>{const{id:S}=c.currentTarget.dataset;S!==void 0&&Ce(me(S))},e[18]=me,e[19]=ae):ae=e[19];const be=ae;let re;e[20]!==fe?(re=()=>{Ce(fe())},e[20]=fe,e[21]=re):re=e[21];const Ne=re,je="flex flex-col gap-6",ze="lunora-queues-panel";let B;e[22]!==a||e[23]!==o?(B=s("div",{className:"flex items-center gap-1","data-testid":"queues-tabs",role:"tablist",children:["declared","messages","send"].map(c=>s(Qe,{"aria-selected":o===c,"data-tab":c,"data-testid":`queues-tab-${c}`,onClick:Pe,role:"tab",size:"sm",type:"button",variant:o===c?"secondary":"ghost",children:mt(c,a)},c))}),e[22]=a,e[23]=o,e[24]=B):B=e[24];let R;e[25]!==ie||e[26]!==ce?(R=ie!==null&&s(Xe,{error:ce,testId:"queues-error"}),e[25]=ie,e[26]=ce,e[27]=R):R=e[27];const qe=D&&s(Ke,{icon:s("span",{"aria-hidden":"true",className:"text-base leading-none",children:"⚠"}),testId:"queues-dlq-warning",variant:"warning",children:q("div",{className:"flex flex-col gap-1",children:[Q.length>0&&q(Fe,{children:[s("p",{className:"font-medium",children:a("No dead-letter queue on {queues}.",{queues:Q.map(Nt).join(", ")})}),s("p",{className:"text-muted-foreground",children:a("Exhausted messages are dropped after retries. Add a deadLetterQueue to capture them.")})]}),v>0&&s("p",{className:Q.length>0?"text-muted-foreground":"font-medium",children:v===1?a("1 message was recently dead-lettered."):a("{count} messages were recently dead-lettered.",{count:v})})]})});let $;e[28]!==E||e[29]!==y||e[30]!==o?($=o==="declared"&&s(ft,{loaded:y!==void 0,queues:E}),e[28]=E,e[29]=y,e[30]=o,e[31]=$):$=e[31];let O;e[32]!==w||e[33]!==h||e[34]!==Ne||e[35]!==be||e[36]!==de||e[37]!==o?(O=o==="messages"&&s(pt,{hasError:h!==null,messages:w,onClear:Ne,onReplay:be,replayingId:de}),e[32]=w,e[33]=h,e[34]=Ne,e[35]=be,e[36]=de,e[37]=o,e[38]=O):O=e[38];let k;e[39]!==F||e[40]!==A||e[41]!==C||e[42]!==xe||e[43]!==pe||e[44]!==ge||e[45]!==he||e[46]!==ye||e[47]!==E||e[48]!==z||e[49]!==le||e[50]!==o?(k=o==="send"&&s(gt,{batchMode:F,bodyText:A,delayText:C,onBatchModeChange:xe,onBodyChange:pe,onDelayChange:ge,onSelectExport:he,onSend:ye,queues:E,selectedExportName:z,sending:le}),e[39]=F,e[40]=A,e[41]=C,e[42]=xe,e[43]=pe,e[44]=ge,e[45]=he,e[46]=ye,e[47]=E,e[48]=z,e[49]=le,e[50]=o,e[51]=k):k=e[51];let ne;return e[52]!==B||e[53]!==R||e[54]!==qe||e[55]!==$||e[56]!==O||e[57]!==k?(ne=q("div",{className:je,"data-testid":ze,children:[B,R,qe,$,O,k]}),e[52]=B,e[53]=R,e[54]=qe,e[55]=$,e[56]=O,e[57]=k,e[58]=ne):ne=e[58],ne};function xt(n){return q(oe,{"data-testid":`queues-row-${n.exportName}`,children:[s(T,{className:"font-mono text-xs",children:n.exportName}),s(T,{className:"font-mono text-xs text-muted-foreground",children:n.name}),s(T,{className:"font-mono text-xs text-muted-foreground",children:n.mode}),s(T,{className:"font-mono text-xs text-muted-foreground",children:n.binding}),s(T,{className:"font-mono text-xs text-muted-foreground",children:n.deadLetterQueue??"—"})]},n.exportName)}function yt(n){return s("option",{value:n.exportName,children:n.exportName},n.exportName)}function bt(n,e){return n.exportName.localeCompare(e.exportName)}function Nt(n){return n.name}export{Ft as default};
@@ -0,0 +1 @@
1
+ import{E as g}from"../packem_shared/error-alert-CKqB2CiN.js";import{B as N}from"../packem_shared/badge-cAk9Di1Q.js";import{C as v,a as b}from"../packem_shared/card-BGlQzQY-.js";import{E as y}from"../packem_shared/empty-state-B939z6K2.js";import{T,a as w,b as m,c as s,d as S,e as n}from"../packem_shared/table-BMsuYFhk.js";import{u as A}from"../packem_shared/use-admin-query-DV9xmFl8.js";import{useT as E}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{ADMIN_FUNCTIONS as C}from"../packem_shared/ADMIN_FUNCTIONS-B6z7VLYt.js";import{jsx as e,jsxs as o}from"react/jsx-runtime";const R={active:"default",failing:"destructive",idle:"secondary"},I=a=>a===void 0?"—":`${new Date(a).toISOString().slice(0,19).replace("T"," ")} UTC`,$=a=>{const r=a.runs+a.suppressed;return r===0?void 0:Math.round(a.suppressed/r*100)},U=({initialShardKey:a=""})=>{const r=E(),{data:l,error:p,errorSource:u,liveError:f}=A(C.listReactors,{},{live:!0,shardKey:a}),x=l!==void 0,d=Array.isArray(l?.reactors)?l.reactors:[];let i;x&&d.length===0?i=e(y,{description:r("No reactor is declared in this deployment. Export an onQueryChange(select, handler) from lunora/ to run server-side logic when a query's result changes."),testId:"reactors-empty",title:r("No reactors declared")}):i=e(v,{className:"overflow-hidden py-0",children:e(b,{className:"px-0",children:o(T,{"data-testid":"reactors-table",children:[e(w,{children:o(m,{children:[e(s,{children:r("Reactor")}),e(s,{children:r("State")}),e(s,{children:r("Ran")}),e(s,{children:r("Suppressed")}),e(s,{children:r("Errors")}),e(s,{children:r("Watches")}),e(s,{children:r("Last dispatch")})]})}),e(S,{children:d.map(t=>{const h=$(t);return o(m,{"data-testid":`reactors-row-${t.path}`,children:[e(n,{className:"font-mono text-xs",children:t.path}),e(n,{children:e(N,{"data-testid":`reactors-state-${t.path}`,variant:R[t.state],children:t.state})}),e(n,{className:"font-mono text-xs",children:t.runs}),o(n,{className:"font-mono text-xs text-muted-foreground",children:[t.suppressed,h===void 0?"":` (${String(h)}%)`]}),e(n,{className:"font-mono text-xs",children:t.errors===0?e("span",{className:"text-muted-foreground",children:"0"}):e("span",{className:"text-destructive",children:t.errors})}),e(n,{className:"font-mono text-xs text-muted-foreground",children:t.tables===void 0||t.tables.length===0?"—":t.tables.join(", ")}),e(n,{className:"font-mono text-xs text-muted-foreground",children:I(t.lastRanAt)})]},t.path)})})]})})});const c=d.filter(t=>t.state==="failing");return o("div",{className:"flex flex-col gap-6","data-testid":"lunora-reactors-panel",children:[p!==null&&e(g,{error:u,testId:"reactors-error"}),e("p",{className:"text-sm text-muted-foreground",children:r("A reactor runs after a write flush, but only when the result of the query it watches actually changed — a trigger fires on a row write, a reactor fires on a result changing. Suppressed dispatches are the ones where the read re-ran and nothing had moved.")}),c.length>0&&e("div",{className:"flex flex-col gap-2","data-testid":"reactors-failing",children:c.map(t=>o("p",{className:"text-xs text-destructive",role:"alert",children:[e("span",{className:"font-mono",children:t.path}),": ",t.lastError??r("last dispatch failed")]},t.path))}),f!==void 0&&e("p",{className:"text-xs text-amber-600 dark:text-amber-500","data-testid":"reactors-live-error",role:"alert",children:r("Live updates unavailable; showing the last reading.")}),i]})};export{U as default};
@@ -1 +1 @@
1
- import{c as U}from"react/compiler-runtime";import{E as F}from"../packem_shared/error-alert-CKqB2CiN.js";import{B as M}from"../packem_shared/badge-cAk9Di1Q.js";import{a as _,C as j}from"../packem_shared/card-BGlQzQY-.js";import{E as D}from"../packem_shared/empty-state-B939z6K2.js";import{T as O,a as $,b as E,c as R,d as G,e as S}from"../packem_shared/table-BMsuYFhk.js";import{u as L}from"../packem_shared/use-admin-query-DV9xmFl8.js";import{useT as Q}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{ADMIN_FUNCTIONS as q}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{jsx as t,jsxs as a}from"react/jsx-runtime";const H=["read","insert","update","delete"],z=(e,r)=>({delete:e("Delete"),insert:e("Insert"),read:e("Read"),update:e("Update")})[r],J=e=>{const r=new Map;for(const s of e){const l=r.get(s.table)??{operations:new Set,procedures:new Set,table:s.table};l.operations.add(s.on),l.procedures.add(s.procedure),r.set(s.table,l)}return[...r.values()].toSorted((s,l)=>s.table.localeCompare(l.table))},oe=()=>{const e=U(49),r=Q();let s;e[0]===Symbol.for("react.memo_cache_sentinel")?(s={},e[0]=s):s=e[0];const{data:l,error:C,errorSource:I}=L(q.rlsPolicies,s),c=l!==void 0;let p,n,m,o,f,h,u,b,i;if(e[1]!==l||e[2]!==C||e[3]!==I||e[4]!==c||e[5]!==r){const k=J(Array.isArray(l?.policies)?l.policies:[]);let v;e[15]!==l?(v=Array.isArray(l?.roles)?l.roles:[],e[15]=l,e[16]=v):v=e[16],n=v,u="flex flex-col gap-6",b="lunora-rls-panel",e[17]!==C||e[18]!==I?(i=C!==null&&t(F,{error:I,testId:"rls-error"}),e[17]=C,e[18]=I,e[19]=i):i=e[19],h="flex flex-col gap-2",p=j,m="overflow-hidden py-0";let A;e[20]!==r?(A=r("Policies"),e[20]=r,e[21]=A):A=e[21],e[22]!==A?(o=t("header",{className:"border-b border-border px-4 py-3",children:t("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:A})}),e[22]=A,e[23]=o):o=e[23],f=c&&k.length===0?t(D,{description:r("No `definePolicy` is wired through `.use(rls(...))` in this deployment. Add one to guard a table's rows."),testId:"rls-policies-empty",title:r("No policies defined")}):t(_,{className:"px-0",children:a(O,{"data-testid":"rls-policies-table",children:[t($,{children:a(E,{children:[t(R,{children:r("Table")}),H.map(d=>t(R,{children:z(r,d)},d)),t(R,{children:r("Guarded by")})]})}),t(G,{children:k.map(d=>a(E,{"data-testid":`rls-table-${d.table}`,children:[t(S,{className:"font-mono text-xs",children:d.table}),H.map(B=>t(S,{children:d.operations.has(B)?t(M,{variant:"secondary",children:r("Guarded")}):t("span",{"aria-hidden":"true",className:"text-muted-foreground",children:"—"})},B)),t(S,{className:"font-mono text-xs text-muted-foreground",children:[...d.procedures].join(", ")})]},d.table))})]})}),e[1]=l,e[2]=C,e[3]=I,e[4]=c,e[5]=r,e[6]=p,e[7]=n,e[8]=m,e[9]=o,e[10]=f,e[11]=h,e[12]=u,e[13]=b,e[14]=i}else p=e[6],n=e[7],m=e[8],o=e[9],f=e[10],h=e[11],u=e[12],b=e[13],i=e[14];let x;e[24]!==p||e[25]!==m||e[26]!==o||e[27]!==f?(x=a(p,{className:m,children:[o,f]}),e[24]=p,e[25]=m,e[26]=o,e[27]=f,e[28]=x):x=e[28];let N;e[29]!==h||e[30]!==x?(N=t("section",{className:h,children:x}),e[29]=h,e[30]=x,e[31]=N):N=e[31];let y;e[32]!==r?(y=r("Roles"),e[32]=r,e[33]=y):y=e[33];let g;e[34]!==y?(g=t("header",{className:"border-b border-border px-4 py-3",children:t("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:y})}),e[34]=y,e[35]=g):g=e[35];let T;e[36]!==c||e[37]!==n||e[38]!==r?(T=c&&n.length===0?t(D,{description:r("No `defineRole` is registered via `rls(policies, { roles })`. Roles back `ctx.auth.can(...)` permission checks."),testId:"rls-roles-empty",title:r("No roles defined")}):t(_,{className:"px-0",children:a(O,{"data-testid":"rls-roles-table",children:[t($,{children:a(E,{children:[t(R,{children:r("Role")}),t(R,{children:r("Description")}),t(R,{children:r("Permissions")})]})}),t(G,{children:n.map(V)})]})}),e[36]=c,e[37]=n,e[38]=r,e[39]=T):T=e[39];let w;e[40]!==g||e[41]!==T?(w=t("section",{className:"flex flex-col gap-2",children:a(j,{className:"overflow-hidden py-0",children:[g,T]})}),e[40]=g,e[41]=T,e[42]=w):w=e[42];let P;return e[43]!==w||e[44]!==u||e[45]!==b||e[46]!==i||e[47]!==N?(P=a("div",{className:u,"data-testid":b,children:[i,N,w]}),e[43]=w,e[44]=u,e[45]=b,e[46]=i,e[47]=N,e[48]=P):P=e[48],P};function K(e){return t(M,{variant:"outline",children:e},e)}function V(e){return a(E,{"data-testid":`rls-role-${e.name}`,children:[t(S,{className:"font-mono text-xs",children:e.name}),t(S,{className:"text-muted-foreground",children:e.description??""}),t(S,{children:e.permissions.length===0?t("span",{"aria-hidden":"true",className:"text-muted-foreground",children:"—"}):t("span",{className:"flex flex-wrap gap-1",children:e.permissions.map(K)})})]},e.name)}export{oe as default};
1
+ import{c as U}from"react/compiler-runtime";import{E as F}from"../packem_shared/error-alert-CKqB2CiN.js";import{B as M}from"../packem_shared/badge-cAk9Di1Q.js";import{a as _,C as j}from"../packem_shared/card-BGlQzQY-.js";import{E as D}from"../packem_shared/empty-state-B939z6K2.js";import{T as O,a as $,b as E,c as R,d as G,e as S}from"../packem_shared/table-BMsuYFhk.js";import{u as L}from"../packem_shared/use-admin-query-DV9xmFl8.js";import{useT as Q}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{ADMIN_FUNCTIONS as q}from"../packem_shared/ADMIN_FUNCTIONS-B6z7VLYt.js";import{jsx as t,jsxs as a}from"react/jsx-runtime";const H=["read","insert","update","delete"],z=(e,r)=>({delete:e("Delete"),insert:e("Insert"),read:e("Read"),update:e("Update")})[r],J=e=>{const r=new Map;for(const s of e){const l=r.get(s.table)??{operations:new Set,procedures:new Set,table:s.table};l.operations.add(s.on),l.procedures.add(s.procedure),r.set(s.table,l)}return[...r.values()].toSorted((s,l)=>s.table.localeCompare(l.table))},oe=()=>{const e=U(49),r=Q();let s;e[0]===Symbol.for("react.memo_cache_sentinel")?(s={},e[0]=s):s=e[0];const{data:l,error:C,errorSource:I}=L(q.rlsPolicies,s),c=l!==void 0;let p,n,m,o,f,h,u,b,i;if(e[1]!==l||e[2]!==C||e[3]!==I||e[4]!==c||e[5]!==r){const k=J(Array.isArray(l?.policies)?l.policies:[]);let v;e[15]!==l?(v=Array.isArray(l?.roles)?l.roles:[],e[15]=l,e[16]=v):v=e[16],n=v,u="flex flex-col gap-6",b="lunora-rls-panel",e[17]!==C||e[18]!==I?(i=C!==null&&t(F,{error:I,testId:"rls-error"}),e[17]=C,e[18]=I,e[19]=i):i=e[19],h="flex flex-col gap-2",p=j,m="overflow-hidden py-0";let A;e[20]!==r?(A=r("Policies"),e[20]=r,e[21]=A):A=e[21],e[22]!==A?(o=t("header",{className:"border-b border-border px-4 py-3",children:t("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:A})}),e[22]=A,e[23]=o):o=e[23],f=c&&k.length===0?t(D,{description:r("No `definePolicy` is wired through `.use(rls(...))` in this deployment. Add one to guard a table's rows."),testId:"rls-policies-empty",title:r("No policies defined")}):t(_,{className:"px-0",children:a(O,{"data-testid":"rls-policies-table",children:[t($,{children:a(E,{children:[t(R,{children:r("Table")}),H.map(d=>t(R,{children:z(r,d)},d)),t(R,{children:r("Guarded by")})]})}),t(G,{children:k.map(d=>a(E,{"data-testid":`rls-table-${d.table}`,children:[t(S,{className:"font-mono text-xs",children:d.table}),H.map(B=>t(S,{children:d.operations.has(B)?t(M,{variant:"secondary",children:r("Guarded")}):t("span",{"aria-hidden":"true",className:"text-muted-foreground",children:"—"})},B)),t(S,{className:"font-mono text-xs text-muted-foreground",children:[...d.procedures].join(", ")})]},d.table))})]})}),e[1]=l,e[2]=C,e[3]=I,e[4]=c,e[5]=r,e[6]=p,e[7]=n,e[8]=m,e[9]=o,e[10]=f,e[11]=h,e[12]=u,e[13]=b,e[14]=i}else p=e[6],n=e[7],m=e[8],o=e[9],f=e[10],h=e[11],u=e[12],b=e[13],i=e[14];let x;e[24]!==p||e[25]!==m||e[26]!==o||e[27]!==f?(x=a(p,{className:m,children:[o,f]}),e[24]=p,e[25]=m,e[26]=o,e[27]=f,e[28]=x):x=e[28];let N;e[29]!==h||e[30]!==x?(N=t("section",{className:h,children:x}),e[29]=h,e[30]=x,e[31]=N):N=e[31];let y;e[32]!==r?(y=r("Roles"),e[32]=r,e[33]=y):y=e[33];let g;e[34]!==y?(g=t("header",{className:"border-b border-border px-4 py-3",children:t("span",{className:"font-mono text-[11px] tracking-wide text-muted-foreground uppercase",children:y})}),e[34]=y,e[35]=g):g=e[35];let T;e[36]!==c||e[37]!==n||e[38]!==r?(T=c&&n.length===0?t(D,{description:r("No `defineRole` is registered via `rls(policies, { roles })`. Roles back `ctx.auth.can(...)` permission checks."),testId:"rls-roles-empty",title:r("No roles defined")}):t(_,{className:"px-0",children:a(O,{"data-testid":"rls-roles-table",children:[t($,{children:a(E,{children:[t(R,{children:r("Role")}),t(R,{children:r("Description")}),t(R,{children:r("Permissions")})]})}),t(G,{children:n.map(V)})]})}),e[36]=c,e[37]=n,e[38]=r,e[39]=T):T=e[39];let w;e[40]!==g||e[41]!==T?(w=t("section",{className:"flex flex-col gap-2",children:a(j,{className:"overflow-hidden py-0",children:[g,T]})}),e[40]=g,e[41]=T,e[42]=w):w=e[42];let P;return e[43]!==w||e[44]!==u||e[45]!==b||e[46]!==i||e[47]!==N?(P=a("div",{className:u,"data-testid":b,children:[i,N,w]}),e[43]=w,e[44]=u,e[45]=b,e[46]=i,e[47]=N,e[48]=P):P=e[48],P};function K(e){return t(M,{variant:"outline",children:e},e)}function V(e){return a(E,{"data-testid":`rls-role-${e.name}`,children:[t(S,{className:"font-mono text-xs",children:e.name}),t(S,{className:"text-muted-foreground",children:e.description??""}),t(S,{children:e.permissions.length===0?t("span",{"aria-hidden":"true",className:"text-muted-foreground",children:"—"}):t("span",{className:"flex flex-wrap gap-1",children:e.permissions.map(K)})})]},e.name)}export{oe as default};
@@ -1 +1 @@
1
- import{c as y}from"react/compiler-runtime";import{E as N}from"../packem_shared/error-alert-CKqB2CiN.js";import{B as R}from"../packem_shared/badge-cAk9Di1Q.js";import{C as T,a as k}from"../packem_shared/card-BGlQzQY-.js";import{E as S}from"../packem_shared/empty-state-B939z6K2.js";import{T as w,a as C,b as g,c as f,d as $,e as p}from"../packem_shared/table-BMsuYFhk.js";import{u as A}from"../packem_shared/use-admin-query-DV9xmFl8.js";import{useT as E}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{ADMIN_FUNCTIONS as v}from"../packem_shared/ADMIN_FUNCTIONS-4aE59aDq.js";import{jsxs as u,jsx as r}from"react/jsx-runtime";const I=(e,t)=>({delete:e("Delete"),list:e("List"),read:e("Read"),write:e("Write")})[t],b={delete:2,list:3,read:0,write:1},O=e=>[...e].toSorted((t,a)=>t.bucket.localeCompare(a.bucket)||b[t.on]-b[a.on]||(t.prefix??"").localeCompare(a.prefix??"")),M=()=>{const e=y(14),t=E();let a;e[0]===Symbol.for("react.memo_cache_sentinel")?(a={},e[0]=a):a=e[0];const{data:l,error:d,errorSource:i}=A(v.storageRules,a),h=l!==void 0;let n;if(e[1]!==l||e[2]!==d||e[3]!==i||e[4]!==h||e[5]!==t){const x=O(Array.isArray(l?.rules)?l.rules:[]);let c;e[7]!==d||e[8]!==i?(c=d!==null&&r(N,{error:i,testId:"storage-rules-error"}),e[7]=d,e[8]=i,e[9]=c):c=e[9];let s;e[10]!==t?(s=t("Storage rules are declared in code with defineStorageRule and gate ctx.storage access per bucket. This view is read-only."),e[10]=t,e[11]=s):s=e[11];let m;e[12]!==s?(m=r("p",{className:"text-sm text-muted-foreground","data-testid":"storage-rules-note",children:s}),e[12]=s,e[13]=m):m=e[13],n=u("div",{className:"flex flex-col gap-4","data-testid":"lunora-storage-rules-panel",children:[c,m,h&&x.length===0?r(S,{description:t("No defineStorageRule is wired through .use(storageRules(...)) in this deployment. Add one to gate object access by key prefix."),testId:"storage-rules-empty",title:t("No storage rules defined")}):r(T,{className:"overflow-hidden py-0",children:r(k,{className:"px-0",children:u(w,{"data-testid":"storage-rules-table",children:[r(C,{children:u(g,{children:[r(f,{children:t("Bucket")}),r(f,{children:t("Operation")}),r(f,{children:t("Key prefix")}),r(f,{children:t("Guarded by")})]})}),r($,{children:x.map(o=>u(g,{"data-testid":`storage-rule-${o.bucket}-${o.on}-${o.prefix??""}`,children:[r(p,{className:"font-mono text-xs",children:o.bucket}),r(p,{children:r(R,{variant:"secondary",children:I(t,o.on)})}),r(p,{className:"font-mono text-xs",children:o.prefix??r("span",{className:"text-muted-foreground",children:t("(whole bucket)")})}),r(p,{className:"font-mono text-xs text-muted-foreground",children:o.procedure})]},`${o.bucket}:${o.on}:${o.prefix??""}:${o.procedure}`))})]})})})]}),e[1]=l,e[2]=d,e[3]=i,e[4]=h,e[5]=t,e[6]=n}else n=e[6];return n};export{M as default};
1
+ import{c as y}from"react/compiler-runtime";import{E as N}from"../packem_shared/error-alert-CKqB2CiN.js";import{B as R}from"../packem_shared/badge-cAk9Di1Q.js";import{C as T,a as k}from"../packem_shared/card-BGlQzQY-.js";import{E as S}from"../packem_shared/empty-state-B939z6K2.js";import{T as w,a as C,b as g,c as f,d as $,e as p}from"../packem_shared/table-BMsuYFhk.js";import{u as A}from"../packem_shared/use-admin-query-DV9xmFl8.js";import{useT as E}from"../packem_shared/DEFAULT_LOCALE-A1Yg5ORA.js";import{ADMIN_FUNCTIONS as v}from"../packem_shared/ADMIN_FUNCTIONS-B6z7VLYt.js";import{jsxs as u,jsx as r}from"react/jsx-runtime";const I=(e,t)=>({delete:e("Delete"),list:e("List"),read:e("Read"),write:e("Write")})[t],b={delete:2,list:3,read:0,write:1},O=e=>[...e].toSorted((t,a)=>t.bucket.localeCompare(a.bucket)||b[t.on]-b[a.on]||(t.prefix??"").localeCompare(a.prefix??"")),M=()=>{const e=y(14),t=E();let a;e[0]===Symbol.for("react.memo_cache_sentinel")?(a={},e[0]=a):a=e[0];const{data:l,error:d,errorSource:i}=A(v.storageRules,a),h=l!==void 0;let n;if(e[1]!==l||e[2]!==d||e[3]!==i||e[4]!==h||e[5]!==t){const x=O(Array.isArray(l?.rules)?l.rules:[]);let c;e[7]!==d||e[8]!==i?(c=d!==null&&r(N,{error:i,testId:"storage-rules-error"}),e[7]=d,e[8]=i,e[9]=c):c=e[9];let s;e[10]!==t?(s=t("Storage rules are declared in code with defineStorageRule and gate ctx.storage access per bucket. This view is read-only."),e[10]=t,e[11]=s):s=e[11];let m;e[12]!==s?(m=r("p",{className:"text-sm text-muted-foreground","data-testid":"storage-rules-note",children:s}),e[12]=s,e[13]=m):m=e[13],n=u("div",{className:"flex flex-col gap-4","data-testid":"lunora-storage-rules-panel",children:[c,m,h&&x.length===0?r(S,{description:t("No defineStorageRule is wired through .use(storageRules(...)) in this deployment. Add one to gate object access by key prefix."),testId:"storage-rules-empty",title:t("No storage rules defined")}):r(T,{className:"overflow-hidden py-0",children:r(k,{className:"px-0",children:u(w,{"data-testid":"storage-rules-table",children:[r(C,{children:u(g,{children:[r(f,{children:t("Bucket")}),r(f,{children:t("Operation")}),r(f,{children:t("Key prefix")}),r(f,{children:t("Guarded by")})]})}),r($,{children:x.map(o=>u(g,{"data-testid":`storage-rule-${o.bucket}-${o.on}-${o.prefix??""}`,children:[r(p,{className:"font-mono text-xs",children:o.bucket}),r(p,{children:r(R,{variant:"secondary",children:I(t,o.on)})}),r(p,{className:"font-mono text-xs",children:o.prefix??r("span",{className:"text-muted-foreground",children:t("(whole bucket)")})}),r(p,{className:"font-mono text-xs text-muted-foreground",children:o.procedure})]},`${o.bucket}:${o.on}:${o.prefix??""}:${o.procedure}`))})]})})})]}),e[1]=l,e[2]=d,e[3]=i,e[4]=h,e[5]=t,e[6]=n}else n=e[6];return n};export{M as default};