llm-simple-router 0.3.7 → 0.4.1

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 (149) hide show
  1. package/README.md +144 -75
  2. package/dist/admin/constants.d.ts +1 -8
  3. package/dist/admin/constants.js +2 -8
  4. package/dist/admin/logs.js +25 -4
  5. package/dist/admin/metrics.js +7 -3
  6. package/dist/admin/recommended.d.ts +7 -0
  7. package/dist/admin/recommended.js +25 -0
  8. package/dist/admin/router-keys.js +1 -2
  9. package/dist/admin/routes.js +4 -0
  10. package/dist/admin/usage.d.ts +7 -0
  11. package/dist/admin/usage.js +66 -0
  12. package/dist/cli.js +0 -0
  13. package/dist/config/recommended.d.ts +24 -0
  14. package/dist/config/recommended.js +30 -0
  15. package/dist/constants.d.ts +8 -0
  16. package/dist/constants.js +9 -0
  17. package/dist/db/index.d.ts +7 -5
  18. package/dist/db/index.js +4 -3
  19. package/dist/db/logs.d.ts +24 -33
  20. package/dist/db/logs.js +52 -17
  21. package/dist/db/metrics.d.ts +36 -3
  22. package/dist/db/metrics.js +57 -42
  23. package/dist/db/migrations/018_add_failover_field.sql +2 -0
  24. package/dist/db/migrations/019_create_usage_windows.sql +11 -0
  25. package/dist/db/retry-rules.d.ts +0 -5
  26. package/dist/db/retry-rules.js +0 -23
  27. package/dist/db/usage-windows.d.ts +19 -0
  28. package/dist/db/usage-windows.js +37 -0
  29. package/dist/index.d.ts +2 -0
  30. package/dist/index.js +11 -8
  31. package/dist/monitor/request-tracker.d.ts +6 -0
  32. package/dist/monitor/request-tracker.js +23 -54
  33. package/dist/monitor/stream-extractor.d.ts +11 -0
  34. package/dist/monitor/stream-extractor.js +51 -0
  35. package/dist/proxy/anthropic.js +19 -32
  36. package/dist/proxy/log-helpers.d.ts +11 -4
  37. package/dist/proxy/log-helpers.js +5 -3
  38. package/dist/proxy/openai.js +18 -34
  39. package/dist/proxy/orchestrator.d.ts +52 -0
  40. package/dist/proxy/orchestrator.js +100 -0
  41. package/dist/proxy/proxy-core.d.ts +14 -26
  42. package/dist/proxy/proxy-core.js +40 -337
  43. package/dist/proxy/proxy-handler.d.ts +18 -0
  44. package/dist/proxy/proxy-handler.js +223 -0
  45. package/dist/proxy/proxy-logging.d.ts +28 -0
  46. package/dist/proxy/proxy-logging.js +122 -0
  47. package/dist/proxy/resilience.d.ts +63 -0
  48. package/dist/proxy/resilience.js +188 -0
  49. package/dist/proxy/scope.d.ts +18 -0
  50. package/dist/proxy/scope.js +37 -0
  51. package/dist/proxy/semaphore.d.ts +9 -2
  52. package/dist/proxy/semaphore.js +34 -7
  53. package/dist/proxy/stream-proxy.d.ts +7 -0
  54. package/dist/proxy/stream-proxy.js +263 -0
  55. package/dist/proxy/{upstream-call.d.ts → transport.d.ts} +25 -18
  56. package/dist/proxy/transport.js +128 -0
  57. package/dist/proxy/types.d.ts +58 -0
  58. package/dist/proxy/types.js +30 -0
  59. package/dist/proxy/usage-window-tracker.d.ts +11 -0
  60. package/dist/proxy/usage-window-tracker.js +75 -0
  61. package/dist/utils/datetime.d.ts +4 -0
  62. package/dist/utils/datetime.js +10 -0
  63. package/frontend-dist/assets/CardContent-fmM_iiuR.js +1 -0
  64. package/frontend-dist/assets/CardHeader-BzzFzZ1B.js +1 -0
  65. package/frontend-dist/assets/CardTitle-09d7O-11.js +1 -0
  66. package/frontend-dist/assets/Checkbox-DH8iqXQd.js +1 -0
  67. package/frontend-dist/assets/CollapsibleTrigger-DCRRORrU.js +1 -0
  68. package/frontend-dist/assets/Collection-DY9-Yue9.js +3 -0
  69. package/frontend-dist/assets/Dashboard-BEzoZuSm.js +3 -0
  70. package/frontend-dist/assets/DialogTitle-BeMGJzYO.js +1 -0
  71. package/frontend-dist/assets/Input-BhvZ-Up7.js +1 -0
  72. package/frontend-dist/assets/Label-DjtouWZ7.js +1 -0
  73. package/frontend-dist/assets/LogDetailDialog-BjRsy_FR.js +3 -0
  74. package/frontend-dist/assets/Login-hOCPB-34.js +1 -0
  75. package/frontend-dist/assets/Logs-C5c3BJsg.js +1 -0
  76. package/frontend-dist/assets/ModelMappings-CDjxwyyz.js +1 -0
  77. package/frontend-dist/assets/Monitor-CPAvIREG.js +1 -0
  78. package/frontend-dist/assets/PopperContent-CHNw_qb6.js +1 -0
  79. package/frontend-dist/assets/Providers-C9ZAqHxO.js +1 -0
  80. package/frontend-dist/assets/ProxyEnhancement-Ct5WbiB7.js +5 -0
  81. package/frontend-dist/assets/RetryRules-CbgyrP6w.js +1 -0
  82. package/frontend-dist/assets/RouterKeys-zmqgFEKp.js +1 -0
  83. package/frontend-dist/assets/SelectValue-CP4Sh7LP.js +1 -0
  84. package/frontend-dist/assets/Setup-BXDEPt4o.js +1 -0
  85. package/frontend-dist/assets/Switch-DF6awXqs.js +1 -0
  86. package/frontend-dist/assets/TableHeader-BKE_yVML.js +1 -0
  87. package/frontend-dist/assets/TabsTrigger-D8R7lxaI.js +1 -0
  88. package/frontend-dist/assets/TooltipTrigger-BjQXeFem.js +1 -0
  89. package/frontend-dist/assets/VisuallyHidden-B_NnkONE.js +1 -0
  90. package/frontend-dist/assets/VisuallyHiddenInput-cjeTgyDe.js +1 -0
  91. package/frontend-dist/assets/alert-dialog-BoGRIC1Q.js +1 -0
  92. package/frontend-dist/assets/badge-DIO8W_W9.js +1 -0
  93. package/frontend-dist/assets/button-qxGNBunr.js +12 -0
  94. package/frontend-dist/assets/{createLucideIcon-CCmQ9QKM.js → createLucideIcon-jHUFhqKn.js} +1 -1
  95. package/frontend-dist/assets/dialog-D8pIXeSs.js +1 -0
  96. package/frontend-dist/assets/format-CPdJtjZ5.js +1 -0
  97. package/frontend-dist/assets/index-C_disqMY.js +1 -0
  98. package/frontend-dist/assets/index-DDp6SHfg.css +1 -0
  99. package/frontend-dist/assets/lib-DjpgwSRA.js +1 -0
  100. package/frontend-dist/assets/{ohash.D__AXeF1-p4vp6Svt.js → ohash.D__AXeF1-nmJ7gFbh.js} +1 -1
  101. package/frontend-dist/assets/{useClipboard-DO-38TXr.js → useClipboard-CmLp2YGk.js} +1 -1
  102. package/frontend-dist/assets/useForwardExpose-awoGXQkg.js +1 -0
  103. package/frontend-dist/assets/useNonce-_2e-GL-A.js +1 -0
  104. package/frontend-dist/assets/x-B0G-wIAB.js +1 -0
  105. package/frontend-dist/index.html +7 -7
  106. package/package.json +1 -1
  107. package/dist/admin/services.d.ts +0 -7
  108. package/dist/admin/services.js +0 -63
  109. package/dist/proxy/retry.d.ts +0 -43
  110. package/dist/proxy/retry.js +0 -121
  111. package/dist/proxy/upstream-call.js +0 -208
  112. package/frontend-dist/assets/CardContent-CucI6u41.js +0 -1
  113. package/frontend-dist/assets/CardHeader-d-DYsWxe.js +0 -1
  114. package/frontend-dist/assets/CardTitle-CIDEQkWB.js +0 -1
  115. package/frontend-dist/assets/Checkbox-CybCw3zS.js +0 -1
  116. package/frontend-dist/assets/CollapsibleTrigger-BFNhb19_.js +0 -1
  117. package/frontend-dist/assets/Collection-DUBb4r6h.js +0 -3
  118. package/frontend-dist/assets/Dashboard-DLB6iqH1.js +0 -3
  119. package/frontend-dist/assets/DialogTitle-Dq-5o7nJ.js +0 -1
  120. package/frontend-dist/assets/Input-HN3Il0-c.js +0 -1
  121. package/frontend-dist/assets/Label-CXAeFn-r.js +0 -1
  122. package/frontend-dist/assets/LogResponseViewer-CyBzv02a.js +0 -3
  123. package/frontend-dist/assets/Login-Br3qsdxf.js +0 -1
  124. package/frontend-dist/assets/Logs-Cu_IftdS.js +0 -1
  125. package/frontend-dist/assets/ModelMappings-DXC0sNH5.js +0 -1
  126. package/frontend-dist/assets/Monitor-CKlid1sC.js +0 -1
  127. package/frontend-dist/assets/PopperContent-CnZejY31.js +0 -1
  128. package/frontend-dist/assets/Providers-8CHhW4uH.js +0 -1
  129. package/frontend-dist/assets/ProxyEnhancement-CkYeXwgH.js +0 -5
  130. package/frontend-dist/assets/RetryRules-Csb7u9W4.js +0 -1
  131. package/frontend-dist/assets/RouterKeys-C6YIufmj.js +0 -1
  132. package/frontend-dist/assets/RovingFocusItem-B7ZIkplZ.js +0 -1
  133. package/frontend-dist/assets/SelectValue-B32pgmTJ.js +0 -1
  134. package/frontend-dist/assets/Setup-Df9IQo2x.js +0 -1
  135. package/frontend-dist/assets/Switch-CLeo7H6d.js +0 -1
  136. package/frontend-dist/assets/TableHeader-BpscAtT3.js +0 -1
  137. package/frontend-dist/assets/TabsTrigger-DErAbTuM.js +0 -1
  138. package/frontend-dist/assets/VisuallyHidden-CJBR3YB3.js +0 -1
  139. package/frontend-dist/assets/VisuallyHiddenInput-Cy0VuE1l.js +0 -1
  140. package/frontend-dist/assets/alert-dialog-BAR1JRmT.js +0 -1
  141. package/frontend-dist/assets/button-D54q76GQ.js +0 -1
  142. package/frontend-dist/assets/client-Mb8fy_bC.js +0 -12
  143. package/frontend-dist/assets/dialog-DSH5k5Kj.js +0 -1
  144. package/frontend-dist/assets/index-BQBtSfem.js +0 -1
  145. package/frontend-dist/assets/index-H-lnTkMr.css +0 -1
  146. package/frontend-dist/assets/lib-BgOqOzXI.js +0 -1
  147. package/frontend-dist/assets/useForwardExpose-CzQFheaD.js +0 -1
  148. package/frontend-dist/assets/useNonce-CU-NirfM.js +0 -1
  149. package/frontend-dist/assets/x-DEJ1xpi5.js +0 -1
@@ -0,0 +1 @@
1
+ import{$ as e,A as t,B as n,Bt as r,Dt as i,Ft as a,G as o,K as s,L as c,Lt as l,N as u,O as d,U as f,V as p,W as m,at as h,gt as g,j as _,k as v,lt as y,n as b,r as x,st as S,ut as C,yt as w}from"./button-qxGNBunr.js";import{t as T}from"./createLucideIcon-jHUFhqKn.js";import{t as E}from"./x-B0G-wIAB.js";import{t as D}from"./badge-DIO8W_W9.js";import{t as O}from"./lib-DjpgwSRA.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var k=T(`activity`,[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`,key:`169zse`}]]),A=T(`arrow-left-right`,[[`path`,{d:`M8 3 4 7l4 4`,key:`9rb6wj`}],[`path`,{d:`M4 7h16`,key:`6tx8e3`}],[`path`,{d:`m16 21 4-4-4-4`,key:`siv7j2`}],[`path`,{d:`M20 17H4`,key:`h6l3hr`}]]),j=T(`circle-check`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]),M=T(`file-text`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 9H8`,key:`b1mrlr`}],[`path`,{d:`M16 13H8`,key:`t4e002`}],[`path`,{d:`M16 17H8`,key:`z1uh3a`}]]),N=T(`info`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 16v-4`,key:`1dtifu`}],[`path`,{d:`M12 8h.01`,key:`e9boi3`}]]),P=T(`key-round`,[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`,key:`1s6t7t`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`w0ekpg`}]]),F=T(`layout-dashboard`,[[`rect`,{width:`7`,height:`9`,x:`3`,y:`3`,rx:`1`,key:`10lvy0`}],[`rect`,{width:`7`,height:`5`,x:`14`,y:`3`,rx:`1`,key:`16une8`}],[`rect`,{width:`7`,height:`9`,x:`14`,y:`12`,rx:`1`,key:`1hutg5`}],[`rect`,{width:`7`,height:`5`,x:`3`,y:`16`,rx:`1`,key:`ldoo1y`}]]),I=T(`loader-circle`,[[`path`,{d:`M21 12a9 9 0 1 1-6.219-8.56`,key:`13zald`}]]),L=T(`log-out`,[[`path`,{d:`m16 17 5-5-5-5`,key:`1bji2h`}],[`path`,{d:`M21 12H9`,key:`dn1m92`}],[`path`,{d:`M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4`,key:`1uf3rs`}]]),R=T(`octagon-x`,[[`path`,{d:`m15 9-6 6`,key:`1uzhvr`}],[`path`,{d:`M2.586 16.726A2 2 0 0 1 2 15.312V8.688a2 2 0 0 1 .586-1.414l4.688-4.688A2 2 0 0 1 8.688 2h6.624a2 2 0 0 1 1.414.586l4.688 4.688A2 2 0 0 1 22 8.688v6.624a2 2 0 0 1-.586 1.414l-4.688 4.688a2 2 0 0 1-1.414.586H8.688a2 2 0 0 1-1.414-.586z`,key:`2d38gg`}],[`path`,{d:`m9 9 6 6`,key:`z0biqf`}]]),z=T(`refresh-ccw`,[[`path`,{d:`M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`14sxne`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}],[`path`,{d:`M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16`,key:`1hlbsb`}],[`path`,{d:`M16 16h5v5`,key:`ccwih5`}]]),B=T(`server`,[[`rect`,{width:`20`,height:`8`,x:`2`,y:`2`,rx:`2`,ry:`2`,key:`ngkwjq`}],[`rect`,{width:`20`,height:`8`,x:`2`,y:`14`,rx:`2`,ry:`2`,key:`iecqi9`}],[`line`,{x1:`6`,x2:`6.01`,y1:`6`,y2:`6`,key:`16zg32`}],[`line`,{x1:`6`,x2:`6.01`,y1:`18`,y2:`18`,key:`nzw8ys`}]]),V=T(`sparkles`,[[`path`,{d:`M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z`,key:`1s2grr`}],[`path`,{d:`M20 2v4`,key:`1rf3ol`}],[`path`,{d:`M22 4h-4`,key:`gwowj6`}],[`circle`,{cx:`4`,cy:`20`,r:`2`,key:`6kqj1y`}]]),H=T(`triangle-alert`,[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]]),U={class:`w-56 bg-sidebar text-sidebar-foreground flex-shrink-0 flex flex-col`},W={class:`p-4 border-b border-sidebar-border`},G={class:`flex items-center gap-2`},K={class:`flex-1 p-2 space-y-1`},q={class:`p-3 border-t border-sidebar-border`},J=s({__name:`Sidebar`,setup(e){let i=[{path:`/`,label:`仪表盘`,icon:F},{path:`/providers`,label:`供应商`,icon:B},{path:`/mappings`,label:`模型映射`,icon:A},{path:`/router-keys`,label:`API 密钥`,icon:P},{path:`/retry-rules`,label:`重试规则`,icon:z},{path:`/proxy-enhancement`,label:`代理增强(实验性)`,icon:V},{path:`/monitor`,label:`实时监控`,icon:k},{path:`/logs`,label:`请求日志`,icon:M}],s=t(),u=_();function g(e){return e===`/`?s.path===`/`:s.path.startsWith(e)}async function v(){try{await d.logout()}finally{u.push(`/login`)}}return(e,t)=>{let s=y(`router-link`);return h(),f(`aside`,U,[n(`div`,W,[n(`div`,G,[t[0]||=n(`div`,{class:`w-8 h-8 bg-sidebar-primary rounded-lg flex items-center justify-center`},[n(`svg`,{class:`w-5 h-5 text-sidebar-primary-foreground`,fill:`none`,stroke:`currentColor`,viewBox:`0 0 24 24`},[n(`path`,{"stroke-linecap":`round`,"stroke-linejoin":`round`,"stroke-width":`2`,d:`M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z`})])],-1),t[1]||=n(`span`,{class:`font-semibold text-sm`},`LLM Router`,-1),o(a(D),{variant:`secondary`,class:`text-[10px] px-1.5 py-0 h-4 leading-none`},{default:w(()=>[m(`v`+r(a(`0.4.1`)),1)]),_:1})])]),n(`nav`,K,[(h(),f(c,null,S(i,e=>o(s,{key:e.path,to:e.path,class:l([`flex items-center gap-3 px-3 py-2 rounded-lg text-sm transition-colors`,g(e.path)?`bg-sidebar-accent text-sidebar-primary`:`text-sidebar-foreground hover:bg-sidebar-accent`])},{default:w(()=>[(h(),p(C(e.icon),{class:`w-4 h-4`})),m(` `+r(e.label),1)]),_:2},1032,[`to`,`class`])),64))]),n(`div`,q,[o(a(b),{variant:`ghost`,class:`w-full justify-start text-sidebar-foreground hover:text-sidebar-foreground hover:bg-sidebar-accent`,onClick:v},{default:w(()=>[o(a(L),{class:`w-4 h-4`}),t[2]||=m(` 登出 `,-1)]),_:1})])])}}}),Y=s({__name:`Sonner`,props:{id:{},invert:{type:Boolean},theme:{},position:{},closeButtonPosition:{},hotkey:{},richColors:{type:Boolean},expand:{type:Boolean},duration:{},gap:{},visibleToasts:{},closeButton:{type:Boolean},toastOptions:{},class:{},style:{},offset:{},mobileOffset:{},dir:{},swipeDirections:{},icons:{},containerAriaLabel:{}},setup(t){let r=t;return(t,i)=>(h(),p(a(O),e({class:a(x)(`toaster group`,r.class),style:{"--normal-bg":`var(--popover)`,"--normal-text":`var(--popover-foreground)`,"--normal-border":`var(--border)`,"--border-radius":`var(--radius)`}},r),{"success-icon":w(()=>[o(a(j),{class:`size-4`})]),"info-icon":w(()=>[o(a(N),{class:`size-4`})]),"warning-icon":w(()=>[o(a(H),{class:`size-4`})]),"error-icon":w(()=>[o(a(R),{class:`size-4`})]),"loading-icon":w(()=>[n(`div`,null,[o(a(I),{class:`size-4 animate-spin`})])]),"close-icon":w(()=>[o(a(E),{class:`size-4`})]),_:1},16,[`class`]))}}),X={key:0,class:`min-h-screen flex`},Z={class:`flex-1 overflow-auto bg-muted`},Q=u(s({__name:`App`,setup(e){let r=_(),s=t(),l=i(!1),u=[`/login`,`/setup`];async function m(){if(u.includes(s.path)){l.value=!1;return}try{await d.getStats(),l.value=!0}catch{l.value=!1,r.push(`/login`)}}return m(),g(()=>s.path,m),(e,t)=>{let r=y(`router-view`);return h(),f(c,null,[l.value?(h(),f(`div`,X,[o(J),n(`main`,Z,[o(r)])])):(h(),p(r,{key:1})),o(a(Y),{richColors:``,position:`top-center`})],64)}}}));Q.use(v),Q.mount(`#app`);
@@ -0,0 +1 @@
1
+ @import "https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&display=swap";:root{--color-teal-50:oklch(97% .02 175);--color-teal-100:oklch(93% .04 175);--color-teal-200:oklch(87% .07 175);--color-teal-300:oklch(78% .1 175);--color-teal-400:oklch(68% .13 175);--color-teal-500:oklch(58% .14 175);--color-teal-600:oklch(48% .12 175);--color-teal-700:oklch(40% .1 175);--color-teal-800:oklch(32% .08 175);--color-teal-900:oklch(25% .06 175);--color-success:oklch(65% .17 150);--color-success-light:oklch(92% .05 150);--color-success-dark:oklch(45% .15 150);--color-warning:oklch(78% .16 80);--color-warning-light:oklch(94% .06 80);--color-warning-dark:oklch(55% .14 80);--color-danger:oklch(58% .22 25);--color-danger-light:oklch(90% .08 25);--color-danger-dark:oklch(40% .18 25);--color-info:oklch(62% .18 250);--color-info-light:oklch(91% .06 250);--color-info-dark:oklch(43% .16 250);--color-bg-page:var(--background);--color-bg-card:var(--card);--color-bg-sidebar:oklch(20.5% 0 0);--color-text-primary:var(--foreground);--color-text-secondary:var(--muted-foreground);--color-text-tertiary:oklch(65% 0 0);--color-role-user:oklch(78% .1 175);--color-role-user-bg:oklch(97% .02 175);--color-role-assistant:oklch(65% .14 260);--color-role-assistant-bg:oklch(93% .04 260);--color-role-tool:oklch(65% .14 30);--color-role-tool-bg:oklch(94% .04 30);--color-role-thinking:oklch(58% .12 290);--color-role-thinking-bg:oklch(91% .03 290);--color-sse-message-start:oklch(68% .13 175);--color-sse-content-block-start:oklch(58% .14 175);--color-sse-content-block-delta:oklch(48% .12 175);--color-sse-message-delta:oklch(40% .1 175);--color-sse-message-stop:oklch(65% .17 150);--spacing-dense-xs:.25rem;--spacing-dense-sm:.375rem;--spacing-dense-md:.5rem;--spacing-page:1.5rem;--spacing-section:1.25rem;--spacing-card:1rem;--spacing-tight:.5rem;--gap-icon-text:.375rem;--radius-pill:9999px;--color-overlay-light:oklch(0% 0 0/.1);--color-overlay:oklch(0% 0 0/.8);--shadow-card:0 1px 3px oklch(0% 0 0/.1);--shadow-elevated:0 4px 12px oklch(0% 0 0/.12);--shadow-focus:0 0 0 2px oklch(58% .14 175);--duration-fast:.15s;--duration-normal:.2s;--ease-default:cubic-bezier(.4, 0, .2, 1);--z-modal:100;--z-dropdown:150;--z-toast:200}.dark{--color-success-light:oklch(30% .05 150);--color-warning-light:oklch(32% .06 80);--color-danger-light:oklch(28% .08 25);--color-info-light:oklch(28% .06 250);--color-bg-sidebar:oklch(14.5% 0 0);--color-text-tertiary:oklch(55.6% 0 0);--color-role-user-bg:oklch(28% .04 175);--color-role-user:oklch(72% .08 175);--color-role-assistant-bg:oklch(25% .05 260);--color-role-assistant:oklch(60% .1 260);--color-role-tool-bg:oklch(25% .05 30);--color-role-tool:oklch(60% .1 30);--color-role-thinking-bg:oklch(23% .04 290);--color-role-thinking:oklch(55% .09 290)}*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border:0 solid #e5e7eb}:before,:after{--tw-content:""}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--font-sans);font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--font-mono);font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-feature-settings:inherit;font-variation-settings:inherit;font-family:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:#0000;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{margin:0;padding:0;list-style:none}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder{opacity:1;color:#9ca3af}textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background:oklch(100% 0 0);--foreground:oklch(14.5% 0 0);--card:oklch(100% 0 0);--card-foreground:oklch(14.5% 0 0);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.5% 0 0);--primary:oklch(48% .12 175);--primary-foreground:oklch(98.5% 0 0);--secondary:oklch(97% 0 0);--secondary-foreground:oklch(20.5% 0 0);--muted:oklch(97% 0 0);--muted-foreground:oklch(55.6% 0 0);--accent:oklch(97% 0 0);--accent-foreground:oklch(20.5% 0 0);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.2% 0 0);--input:oklch(92.2% 0 0);--ring:oklch(58% .14 175);--chart-1:oklch(87% 0 0);--chart-2:oklch(55.6% 0 0);--chart-3:oklch(43.9% 0 0);--chart-4:oklch(37.1% 0 0);--chart-5:oklch(26.9% 0 0);--radius:.375rem;--radius-sm:calc(var(--radius) - 4px);--radius-md:calc(var(--radius) - 2px);--radius-lg:var(--radius);--radius-xl:calc(var(--radius) + 2px);--sidebar:oklch(98.5% 0 0);--sidebar-foreground:oklch(14.5% 0 0);--sidebar-primary:oklch(20.5% 0 0);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(97% 0 0);--sidebar-accent-foreground:oklch(20.5% 0 0);--sidebar-border:oklch(92.2% 0 0);--sidebar-ring:oklch(70.8% 0 0);--font-sans:"Geist Variable", sans-serif;--font-heading:var(--font-sans);--font-mono:"JetBrains Mono", "Fira Code", ui-monospace, monospace}.dark{--background:oklch(14.5% 0 0);--foreground:oklch(98.5% 0 0);--card:oklch(20.5% 0 0);--card-foreground:oklch(98.5% 0 0);--popover:oklch(20.5% 0 0);--popover-foreground:oklch(98.5% 0 0);--primary:oklch(68% .13 175);--primary-foreground:oklch(20.5% 0 0);--secondary:oklch(26.9% 0 0);--secondary-foreground:oklch(98.5% 0 0);--muted:oklch(26.9% 0 0);--muted-foreground:oklch(70.8% 0 0);--accent:oklch(26.9% 0 0);--accent-foreground:oklch(98.5% 0 0);--destructive:oklch(70.4% .191 22.216);--border:oklch(100% 0 0/.1);--input:oklch(100% 0 0/.15);--ring:oklch(78% .1 175);--chart-1:oklch(87% 0 0);--chart-2:oklch(55.6% 0 0);--chart-3:oklch(43.9% 0 0);--chart-4:oklch(37.1% 0 0);--chart-5:oklch(26.9% 0 0);--sidebar:oklch(20.5% 0 0);--sidebar-foreground:oklch(98.5% 0 0);--sidebar-primary:oklch(68% .13 175);--sidebar-primary-foreground:oklch(98.5% 0 0);--sidebar-accent:oklch(26.9% 0 0);--sidebar-accent-foreground:oklch(98.5% 0 0);--sidebar-border:oklch(100% 0 0/.1);--sidebar-ring:oklch(55.6% 0 0)}*{border-color:var(--border)}body{background-color:var(--background);color:var(--foreground);font-family:var(--font-sans)}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.bottom-0{bottom:0}.left-1\/2{left:50%}.right-0{right:0}.right-2{right:.5rem}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-2{top:.5rem}.top-4{top:1rem}.isolate{isolation:isolate}.z-10{z-index:10}.z-dropdown{z-index:var(--z-dropdown)}.z-modal{z-index:var(--z-modal)}.col-span-2{grid-column:span 2/span 2}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-8{margin-top:2rem;margin-bottom:2rem}.-mb-4{margin-bottom:-1rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-1{margin-left:.25rem}.ml-4{margin-left:1rem}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.grid{display:grid}.aspect-square{aspect-ratio:1}.size-10{width:2.5rem;height:2.5rem}.size-2\.5{width:.625rem;height:.625rem}.size-4{width:1rem;height:1rem}.size-6{width:1.5rem;height:1.5rem}.size-7{width:1.75rem;height:1.75rem}.size-8{width:2rem;height:2rem}.size-9{width:2.25rem;height:2.25rem}.size-full{width:100%;height:100%}.h-10{height:2.5rem}.h-12{height:3rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-80{max-height:20rem}.max-h-\[40vh\]{max-height:40vh}.max-h-\[60vh\]{max-height:60vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:0}.min-h-screen{min-height:100vh}.w-1\/3{width:33.3333%}.w-10{width:2.5rem}.w-12{width:3rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-\[260px\]{width:260px}.w-fit{width:fit-content}.w-full{width:100%}.min-w-0{min-width:0}.min-w-36{min-width:9rem}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-\[140px\]{max-width:140px}.max-w-\[200px\]{max-width:200px}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-lg{max-width:32rem}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.-translate-x-1\/2{--tw-translate-x:-50%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[calc\(-50\%_-_2px\)\]{--tw-translate-y:calc(-50% - 2px);transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate:-90deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-45{--tw-rotate:45deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate:90deg;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:2s cubic-bezier(.4,0,.6,1) infinite pulse}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:1s linear infinite spin}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;user-select:none}.select-all{-webkit-user-select:all;user-select:all}.scroll-my-1{scroll-margin-top:.25rem;scroll-margin-bottom:.25rem}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-rows-\[auto_1fr\]{grid-template-rows:auto 1fr}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(-.5rem * var(--tw-space-x-reverse));margin-left:calc(-.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.self-start{align-self:flex-start}.justify-self-end{justify-self:end}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-balance{text-wrap:balance}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-b-xl{border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-border{border-color:var(--border)}.border-danger{border-color:var(--color-danger)}.border-destructive{border-color:var(--destructive)}.border-info{border-color:var(--color-info)}.border-input{border-color:var(--input)}.border-muted{border-color:var(--muted)}.border-sidebar-border{border-color:var(--sidebar-border)}.border-success{border-color:var(--color-success)}.border-teal-200{border-color:var(--color-teal-200)}.border-transparent{border-color:#0000}.border-warning{border-color:var(--color-warning)}.bg-background{background-color:var(--background)}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity,1))}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-danger-light{background-color:var(--color-danger-light)}.bg-foreground{background-color:var(--foreground)}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.bg-info{background-color:var(--color-info)}.bg-info-light{background-color:var(--color-info-light)}.bg-muted{background-color:var(--muted)}.bg-orange-500{--tw-bg-opacity:1;background-color:rgb(249 115 22/var(--tw-bg-opacity,1))}.bg-overlay{background-color:var(--color-overlay)}.bg-overlay-light{background-color:var(--color-overlay-light)}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.bg-role-assistant-bg{background-color:var(--color-role-assistant-bg)}.bg-role-tool-bg{background-color:var(--color-role-tool-bg)}.bg-role-user-bg{background-color:var(--color-role-user-bg)}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar)}.bg-sidebar-accent{background-color:var(--sidebar-accent)}.bg-sidebar-primary{background-color:var(--sidebar-primary)}.bg-success{background-color:var(--color-success)}.bg-success-light{background-color:var(--color-success-light)}.bg-teal-200{background-color:var(--color-teal-200)}.bg-teal-300{background-color:var(--color-teal-300)}.bg-teal-50{background-color:var(--color-teal-50)}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-600{background-color:var(--color-teal-600)}.bg-transparent{background-color:#0000}.bg-warning{background-color:var(--color-warning)}.bg-warning-light{background-color:var(--color-warning-light)}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity,1))}.bg-clip-padding{background-clip:padding-box}.fill-foreground{fill:var(--foreground)}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-\[3px\]{padding:3px}.p-px{padding:1px}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1\.5{padding-bottom:.375rem}.pb-2{padding-bottom:.5rem}.pl-1\.5{padding-left:.375rem}.pl-10{padding-left:2.5rem}.pl-2\.5{padding-left:.625rem}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-8{padding-right:2rem}.pt-2{padding-top:.5rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[0\.8rem\]{font-size:.8rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.italic{font-style:italic}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.text-background{color:var(--background)}.text-card-foreground{color:var(--card-foreground)}.text-current{color:currentColor}.text-danger-dark{color:var(--color-danger-dark)}.text-destructive{color:var(--destructive)}.text-foreground{color:var(--foreground)}.text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.text-info-dark{color:var(--color-info-dark)}.text-muted-foreground{color:var(--muted-foreground)}.text-orange-600{--tw-text-opacity:1;color:rgb(234 88 12/var(--tw-text-opacity,1))}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-role-assistant{color:var(--color-role-assistant)}.text-role-tool{color:var(--color-role-tool)}.text-role-user{color:var(--color-role-user)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-foreground{color:var(--sidebar-foreground)}.text-sidebar-primary{color:var(--sidebar-primary)}.text-sidebar-primary-foreground{color:var(--sidebar-primary-foreground)}.text-success{color:var(--color-success)}.text-success-dark{color:var(--color-success-dark)}.text-teal-200{color:var(--color-teal-200)}.text-teal-300{color:var(--color-teal-300)}.text-teal-700{color:var(--color-teal-700)}.text-teal-900{color:var(--color-teal-900)}.text-warning-dark{color:var(--color-warning-dark)}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-yellow-600{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity,1))}.underline-offset-4{text-underline-offset:4px}.opacity-25{opacity:.25}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.bg-blend-color{background-blend-mode:color}.shadow-elevated{--tw-shadow:var(--shadow-elevated);--tw-shadow-colored:var(--shadow-elevated);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a, 0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px #0000001a, 0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.outline-none{outline-offset:2px;outline:2px solid #0000}.outline{outline-style:solid}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.ring-background{--tw-ring-color:var(--background)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-none{transition-property:none}.transition-transform{transition-property:transform;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-100{transition-duration:.1s}.duration-300{transition-duration:.3s}.duration-fast{transition-duration:var(--duration-fast)}.duration-normal{transition-duration:var(--duration-normal)}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0), var(--tw-enter-translate-y,0), 0) scale3d(var(--tw-enter-scale,1), var(--tw-enter-scale,1), var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0), var(--tw-exit-translate-y,0), 0) scale3d(var(--tw-exit-scale,1), var(--tw-exit-scale,1), var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}.duration-100{animation-duration:.1s}.duration-300{animation-duration:.3s}.duration-fast{animation-duration:var(--duration-fast)}.duration-normal{animation-duration:var(--duration-normal)}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-6::file-selector-button{height:1.5rem}.file\:border-0::file-selector-button{border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-0:after{content:var(--tw-content);inset:0}.after\:-inset-x-3:after{content:var(--tw-content);left:-.75rem;right:-.75rem}.after\:-inset-y-2:after{content:var(--tw-content);top:-.5rem;bottom:-.5rem}.after\:rounded-full:after{content:var(--tw-content);border-radius:9999px}.after\:border:after{content:var(--tw-content);border-width:1px}.after\:border-border:after{content:var(--tw-content);border-color:var(--border)}.after\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.after\:opacity-0:after{content:var(--tw-content);opacity:0}.after\:mix-blend-darken:after{content:var(--tw-content);mix-blend-mode:darken}.after\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.hover\:bg-muted:hover{background-color:var(--muted)}.hover\:bg-secondary:hover{background-color:var(--secondary)}.hover\:bg-sidebar-accent:hover{background-color:var(--sidebar-accent)}.hover\:text-destructive:hover{color:var(--destructive)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-muted-foreground:hover{color:var(--muted-foreground)}.hover\:text-primary:hover{color:var(--primary)}.hover\:text-sidebar-foreground:hover{color:var(--sidebar-foreground)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:outline-1:focus-visible{outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-50{opacity:.5}.has-\[\>img\:first-child\]\:pt-0:has(>img:first-child){padding-top:0}.aria-expanded\:bg-muted[aria-expanded=true]{background-color:var(--muted)}.aria-expanded\:bg-secondary[aria-expanded=true]{background-color:var(--secondary)}.aria-expanded\:text-foreground[aria-expanded=true]{color:var(--foreground)}.aria-expanded\:text-secondary-foreground[aria-expanded=true]{color:var(--secondary-foreground)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[size\=lg\]\:size-10[data-size=lg]{width:2.5rem;height:2.5rem}.data-\[size\=sm\]\:size-6[data-size=sm]{width:1.5rem;height:1.5rem}.data-\[orientation\=horizontal\]\:h-2\.5[data-orientation=horizontal]{height:.625rem}.data-\[orientation\=horizontal\]\:h-px[data-orientation=horizontal]{height:1px}.data-\[orientation\=vertical\]\:h-full[data-orientation=vertical]{height:100%}.data-\[position\=popper\]\:h-\[var\(--reka-select-trigger-height\)\][data-position=popper]{height:var(--reka-select-trigger-height)}.data-\[size\=default\]\:h-8[data-size=default]{height:2rem}.data-\[size\=default\]\:h-\[18\.4px\][data-size=default]{height:18.4px}.data-\[size\=sm\]\:h-7[data-size=sm]{height:1.75rem}.data-\[size\=sm\]\:h-\[14px\][data-size=sm]{height:14px}.data-\[orientation\=horizontal\]\:w-full[data-orientation=horizontal]{width:100%}.data-\[orientation\=vertical\]\:w-2\.5[data-orientation=vertical]{width:.625rem}.data-\[orientation\=vertical\]\:w-px[data-orientation=vertical]{width:1px}.data-\[position\=popper\]\:w-full[data-position=popper]{width:100%}.data-\[size\=default\]\:w-\[32px\][data-size=default]{width:32px}.data-\[size\=sm\]\:w-\[24px\][data-size=sm]{width:24px}.data-\[position\=popper\]\:min-w-\[var\(--reka-select-trigger-width\)\][data-position=popper]{min-width:var(--reka-select-trigger-width)}.data-\[size\=default\]\:max-w-xs[data-size=default],.data-\[size\=sm\]\:max-w-xs[data-size=sm]{max-width:20rem}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y:.25rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x:-.25rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x:.25rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y:-.25rem;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[align-trigger\=true\]\:animate-none[data-align-trigger=true]{animation:none}.data-\[disabled\]\:cursor-not-allowed[data-disabled]{cursor:not-allowed}.data-\[orientation\=horizontal\]\:flex-col[data-orientation=horizontal]{flex-direction:column}.data-\[size\=sm\]\:gap-3[data-size=sm]{gap:.75rem}.data-\[orientation\=vertical\]\:self-stretch[data-orientation=vertical]{align-self:stretch}.data-\[size\=sm\]\:rounded-md[data-size=sm]{border-radius:var(--radius-md)}.data-\[variant\=line\]\:rounded-none[data-variant=line]{border-radius:0}.data-\[orientation\=horizontal\]\:border-t[data-orientation=horizontal]{border-top-width:1px}.data-\[orientation\=vertical\]\:border-l[data-orientation=vertical]{border-left-width:1px}.data-\[state\=checked\]\:border-primary[data-state=checked]{border-color:var(--primary)}.data-\[orientation\=horizontal\]\:border-t-transparent[data-orientation=horizontal]{border-top-color:#0000}.data-\[orientation\=vertical\]\:border-l-transparent[data-orientation=vertical]{border-left-color:#0000}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--background)}.data-\[state\=checked\]\:bg-primary[data-state=checked]{background-color:var(--primary)}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}.data-\[state\=unchecked\]\:bg-input[data-state=unchecked]{background-color:var(--input)}.data-\[size\=sm\]\:py-3[data-size=sm]{padding-top:.75rem;padding-bottom:.75rem}.data-\[error\=true\]\:text-destructive[data-error=true]{color:var(--destructive)}.data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--foreground)}.data-\[state\=checked\]\:text-primary-foreground[data-state=checked]{color:var(--primary-foreground)}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=delayed-open\]\:animate-in[data-state=delayed-open],.data-\[state\=open\]\:animate-in[data-state=open]{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.data-\[state\=closed\]\:animate-out[data-state=closed]{--tw-exit-opacity:initial;--tw-exit-scale:initial;--tw-exit-rotate:initial;--tw-exit-translate-x:initial;--tw-exit-translate-y:initial;animation-name:exit;animation-duration:.15s}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity:0}.data-\[state\=delayed-open\]\:fade-in-0[data-state=delayed-open],.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity:0}.data-\[state\=delayed-open\]\:zoom-in-95[data-state=delayed-open]{--tw-enter-scale:.95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:-.5rem}.data-\[side\=inline-end\]\:slide-in-from-left-2[data-side=inline-end]{--tw-enter-translate-x:-.5rem}.data-\[side\=inline-start\]\:slide-in-from-right-2[data-side=inline-start],.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:.5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:-.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:.5rem}.\*\:data-\[slot\=select-value\]\:line-clamp-1[data-slot=select-value]>*{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\*\:data-\[slot\=select-value\]\:flex[data-slot=select-value]>*{display:flex}.\*\:data-\[slot\=select-value\]\:items-center[data-slot=select-value]>*{align-items:center}.\*\:data-\[slot\=select-value\]\:gap-1\.5[data-slot=select-value]>*{gap:.375rem}.\*\:data-\[slot\=avatar\]\:ring-2[data-slot=avatar]>*{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000)}.\*\:data-\[slot\=avatar\]\:ring-background[data-slot=avatar]>*{--tw-ring-color:var(--background)}.group[data-disabled=true] .group-data-\[disabled\=true\]\:pointer-events-none{pointer-events:none}.group\/alert-dialog-content[data-size=sm] .group-data-\[size\=sm\]\/alert-dialog-content\:grid{display:grid}.group\/avatar[data-size=default] .group-data-\[size\=default\]\/avatar\:size-2\.5{width:.625rem;height:.625rem}.group\/switch[data-size=default] .group-data-\[size\=default\]\/switch\:size-4{width:1rem;height:1rem}.group\/avatar[data-size=lg] .group-data-\[size\=lg\]\/avatar\:size-3{width:.75rem;height:.75rem}.group\/avatar[data-size=sm] .group-data-\[size\=sm\]\/avatar\:size-2{width:.5rem;height:.5rem}.group\/switch[data-size=sm] .group-data-\[size\=sm\]\/switch\:size-3{width:.75rem;height:.75rem}.group\/tabs[data-orientation=horizontal] .group-data-\[orientation\=horizontal\]\/tabs\:h-8{height:2rem}.group\/tabs[data-orientation=vertical] .group-data-\[orientation\=vertical\]\/tabs\:h-fit{height:fit-content}.group\/tabs[data-orientation=vertical] .group-data-\[orientation\=vertical\]\/tabs\:w-full{width:100%}.group\/alert-dialog-content[data-size=sm] .group-data-\[size\=sm\]\/alert-dialog-content\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.group\/tabs[data-orientation=vertical] .group-data-\[orientation\=vertical\]\/tabs\:flex-col{flex-direction:column}.group\/tabs[data-orientation=vertical] .group-data-\[orientation\=vertical\]\/tabs\:justify-start{justify-content:flex-start}.group\/tabs-list[data-variant=line] .group-data-\[variant\=line\]\/tabs-list\:bg-transparent{background-color:#0000}.group\/card[data-size=sm] .group-data-\[size\=sm\]\/card\:p-3{padding:.75rem}.group\/card[data-size=sm] .group-data-\[size\=sm\]\/card\:px-3{padding-left:.75rem;padding-right:.75rem}.group\/avatar[data-size=sm] .group-data-\[size\=sm\]\/avatar\:text-xs{font-size:.75rem;line-height:1rem}.group\/card[data-size=sm] .group-data-\[size\=sm\]\/card\:text-sm{font-size:.875rem;line-height:1.25rem}.group[data-disabled=true] .group-data-\[disabled\=true\]\:opacity-50{opacity:.5}.group\/tabs[data-orientation=horizontal] .group-data-\[orientation\=horizontal\]\/tabs\:after\:inset-x-0:after{content:var(--tw-content);left:0;right:0}.group\/tabs[data-orientation=vertical] .group-data-\[orientation\=vertical\]\/tabs\:after\:inset-y-0:after{content:var(--tw-content);top:0;bottom:0}.group\/tabs[data-orientation=horizontal] .group-data-\[orientation\=horizontal\]\/tabs\:after\:bottom-\[-5px\]:after{content:var(--tw-content);bottom:-5px}.group\/tabs[data-orientation=vertical] .group-data-\[orientation\=vertical\]\/tabs\:after\:-right-1:after{content:var(--tw-content);right:-.25rem}.group\/tabs[data-orientation=horizontal] .group-data-\[orientation\=horizontal\]\/tabs\:after\:h-0\.5:after{content:var(--tw-content);height:.125rem}.group\/tabs[data-orientation=vertical] .group-data-\[orientation\=vertical\]\/tabs\:after\:w-0\.5:after{content:var(--tw-content);width:.125rem}.group\/switch[data-size=default] .group-data-\[size\=default\]\/switch\:data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state=checked]{--tw-translate-x:calc(100% - 2px);transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group\/switch[data-size=default] .group-data-\[size\=default\]\/switch\:data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:0px;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group\/switch[data-size=sm] .group-data-\[size\=sm\]\/switch\:data-\[state\=checked\]\:translate-x-\[calc\(100\%-2px\)\][data-state=checked]{--tw-translate-x:calc(100% - 2px);transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group\/switch[data-size=sm] .group-data-\[size\=sm\]\/switch\:data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked]{--tw-translate-x:0px;transform:translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group\/tabs-list[data-variant=line] .group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:bg-transparent[data-state=active]{background-color:#0000}.group\/tabs-list[data-variant=default] .group-data-\[variant\=default\]\/tabs-list\:data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.group\/tabs-list[data-variant=line] .group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:shadow-none[data-state=active]{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000), var(--tw-ring-shadow,0 0 #0000), var(--tw-shadow)}.group\/tabs-list[data-variant=line] .group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:after\:opacity-100[data-state=active]:after{content:var(--tw-content);opacity:1}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:border-teal-800:is(.dark *){border-color:var(--color-teal-800)}.dark\:bg-teal-600:is(.dark *){background-color:var(--color-teal-600)}.dark\:bg-teal-700:is(.dark *){background-color:var(--color-teal-700)}.dark\:bg-teal-800:is(.dark *){background-color:var(--color-teal-800)}.dark\:bg-teal-900:is(.dark *){background-color:var(--color-teal-900)}.dark\:text-danger:is(.dark *){color:var(--color-danger)}.dark\:text-green-400:is(.dark *){--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.dark\:text-info:is(.dark *){color:var(--color-info)}.dark\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}.dark\:text-orange-400:is(.dark *){--tw-text-opacity:1;color:rgb(251 146 60/var(--tw-text-opacity,1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.dark\:text-success:is(.dark *){color:var(--color-success)}.dark\:text-teal-100:is(.dark *){color:var(--color-teal-100)}.dark\:text-teal-200:is(.dark *){color:var(--color-teal-200)}.dark\:text-teal-300:is(.dark *){color:var(--color-teal-300)}.dark\:text-warning:is(.dark *){color:var(--color-warning)}.dark\:text-yellow-400:is(.dark *){--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity,1))}.dark\:after\:mix-blend-lighten:is(.dark *):after{content:var(--tw-content);mix-blend-mode:lighten}.dark\:hover\:text-foreground:hover:is(.dark *){color:var(--foreground)}.dark\:data-\[state\=active\]\:border-input[data-state=active]:is(.dark *){border-color:var(--input)}.dark\:data-\[state\=checked\]\:bg-primary[data-state=checked]:is(.dark *){background-color:var(--primary)}.dark\:data-\[state\=checked\]\:bg-primary-foreground[data-state=checked]:is(.dark *){background-color:var(--primary-foreground)}.dark\:data-\[state\=unchecked\]\:bg-foreground[data-state=unchecked]:is(.dark *){background-color:var(--foreground)}.dark\:data-\[state\=active\]\:text-foreground[data-state=active]:is(.dark *){color:var(--foreground)}.group\/tabs-list[data-variant=line] .dark\:group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:border-transparent[data-state=active]:is(.dark *){border-color:#0000}.group\/tabs-list[data-variant=line] .dark\:group-data-\[variant\=line\]\/tabs-list\:data-\[state\=active\]\:bg-transparent[data-state=active]:is(.dark *){background-color:#0000}@media (width>=640px){.sm\:max-w-lg{max-width:32rem}.sm\:max-w-sm{max-width:24rem}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:rounded-lg{border-radius:var(--radius-lg)}.data-\[size\=default\]\:sm\:max-w-sm[data-size=default]{max-width:24rem}.group\/alert-dialog-content[data-size=default] .sm\:group-data-\[size\=default\]\/alert-dialog-content\:row-span-2{grid-row:span 2/span 2}.group\/alert-dialog-content[data-size=default] .sm\:group-data-\[size\=default\]\/alert-dialog-content\:place-items-start{place-items:start}.group\/alert-dialog-content[data-size=default] .sm\:group-data-\[size\=default\]\/alert-dialog-content\:text-left{text-align:left}}@media (width>=768px){.md\:w-full{width:100%}.md\:text-pretty{text-wrap:pretty}.md\:text-sm{font-size:.875rem;line-height:1.25rem}}@media (width>=1024px){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3\.5>svg{width:.875rem;height:.875rem}.\[\&\>svg\]\:size-4>svg{width:1rem;height:1rem}.group\/avatar[data-size=sm] .group-data-\[size\=sm\]\/avatar\:\[\&\>svg\]\:hidden>svg{display:none}.group\/avatar[data-size=default] .group-data-\[size\=default\]\/avatar\:\[\&\>svg\]\:size-2>svg,.group\/avatar[data-size=lg] .group-data-\[size\=lg\]\/avatar\:\[\&\>svg\]\:size-2>svg{width:.5rem;height:.5rem}.\[\&\>tr\]\:last\:border-b-0:last-child>tr{border-bottom-width:0}.\[\&_svg\:not\(\[class\*\=size-\]\)\]\:size-3 svg:not([class*=size-]){width:.75rem;height:.75rem}.\[\&_svg\:not\(\[class\*\=size-\]\)\]\:size-3\.5 svg:not([class*=size-]){width:.875rem;height:.875rem}.\[\&_svg\:not\(\[class\*\=size-\]\)\]\:size-4 svg:not([class*=size-]){width:1rem;height:1rem}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-width:0}.\[\&_tr\]\:border-b tr{border-bottom-width:1px}
@@ -0,0 +1 @@
1
+ import{$ as e,B as t,Bt as n,Dt as r,Ft as i,G as a,H as o,K as s,L as c,Lt as l,Rt as u,U as d,V as f,W as p,Z as m,_t as h,at as g,ct as _,et as ee,ft as v,gt as te,nt as y,st as b,tt as ne,ut as x,yt as S,z as C,zt as w}from"./button-qxGNBunr.js";var T=1,E=new class{subscribers;toasts;dismissedToasts;constructor(){this.subscribers=[],this.toasts=[],this.dismissedToasts=new Set}subscribe=e=>(this.subscribers.push(e),()=>{let t=this.subscribers.indexOf(e);this.subscribers.splice(t,1)});publish=e=>{this.subscribers.forEach(t=>t(e))};addToast=e=>{this.publish(e),this.toasts=[...this.toasts,e]};create=e=>{let{message:t,...n}=e,r=typeof e.id==`number`||e.id&&e.id?.length>0?e.id:T++,i=this.toasts.find(e=>e.id===r),a=e.dismissible===void 0?!0:e.dismissible;return this.dismissedToasts.has(r)&&this.dismissedToasts.delete(r),i?this.toasts=this.toasts.map(n=>n.id===r?(this.publish({...n,...e,id:r,title:t}),{...n,...e,id:r,dismissible:a,title:t}):n):this.addToast({title:t,...n,dismissible:a,id:r}),r};dismiss=e=>(e?(this.dismissedToasts.add(e),requestAnimationFrame(()=>this.subscribers.forEach(t=>t({id:e,dismiss:!0})))):this.toasts.forEach(e=>{this.subscribers.forEach(t=>t({id:e.id,dismiss:!0}))}),e);message=(e,t)=>this.create({...t,message:e,type:`default`});error=(e,t)=>this.create({...t,type:`error`,message:e});success=(e,t)=>this.create({...t,type:`success`,message:e});info=(e,t)=>this.create({...t,type:`info`,message:e});warning=(e,t)=>this.create({...t,type:`warning`,message:e});loading=(e,t)=>this.create({...t,type:`loading`,message:e});promise=(e,t)=>{if(!t)return;let n;t.loading!==void 0&&(n=this.create({...t,promise:e,type:`loading`,message:t.loading,description:typeof t.description==`function`?void 0:t.description}));let r=Promise.resolve(e instanceof Function?e():e),i=n!==void 0,a,o=r.then(async e=>{if(a=[`resolve`,e],m(e))i=!1,this.create({id:n,type:`default`,message:e});else if(O(e)&&!e.ok){i=!1;let r=typeof t.error==`function`?await t.error(`HTTP error! status: ${e.status}`):t.error,a=typeof t.description==`function`?await t.description(`HTTP error! status: ${e.status}`):t.description,o=typeof r==`object`&&!m(r)?r:{message:r||``,id:n||``};this.create({id:n,type:`error`,description:a,...o})}else if(e instanceof Error){i=!1;let r=typeof t.error==`function`?await t.error(e):t.error,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!m(r)?r:{message:r||``,id:n||``};this.create({id:n,type:`error`,description:a,...o})}else if(t.success!==void 0){i=!1;let r=typeof t.success==`function`?await t.success(e):t.success,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!m(r)?r:{message:r||``,id:n||``};this.create({id:n,type:`success`,description:a,...o})}}).catch(async e=>{if(a=[`reject`,e],t.error!==void 0){i=!1;let r=typeof t.error==`function`?await t.error(e):t.error,a=typeof t.description==`function`?await t.description(e):t.description,o=typeof r==`object`&&!m(r)?r:{message:r||``,id:n||``};this.create({id:n,type:`error`,description:a,...o})}}).finally(()=>{i&&(this.dismiss(n),n=void 0),t.finally?.()}),s=()=>new Promise((e,t)=>o.then(()=>a[0]===`reject`?t(a[1]):e(a[1])).catch(t));return typeof n!=`string`&&typeof n!=`number`?{unwrap:s}:Object.assign(n,{unwrap:s})};custom=(e,t)=>{let n=t?.id||T++,r=this.toasts.find(e=>e.id===n),i=t?.dismissible===void 0?!0:t.dismissible;return this.dismissedToasts.has(n)&&this.dismissedToasts.delete(n),r?this.toasts=this.toasts.map(r=>r.id===n?(this.publish({...r,component:e,dismissible:i,id:n,...t}),{...r,component:e,dismissible:i,id:n,...t}):r):this.addToast({component:e,dismissible:i,id:n,...t}),n};getActiveToasts=()=>this.toasts.filter(e=>!this.dismissedToasts.has(e.id))};function D(e,t){let n=t?.id||T++;return E.create({message:e,id:n,type:`default`,...t}),n}var O=e=>e&&typeof e==`object`&&`ok`in e&&typeof e.ok==`boolean`&&`status`in e&&typeof e.status==`number`,k=Object.assign(D,{success:E.success,info:E.info,warning:E.warning,error:E.error,custom:E.custom,message:E.message,promise:E.promise,dismiss:E.dismiss,loading:E.loading},{getHistory:()=>E.toasts,getToasts:()=>E.getActiveToasts()});function A(e){return e.label!==void 0}var j=3,M=`24px`,N=`16px`,P=4e3,F=356,I=14,re=45,L=200;function R(){let e=r(!1);return h(()=>{let t=()=>{e.value=document.hidden};return document.addEventListener(`visibilitychange`,t),()=>window.removeEventListener(`visibilitychange`,t)}),{isDocumentHidden:e}}function z(...e){return e.filter(Boolean).join(` `)}function ie(e){let[t,n]=e.split(`-`),r=[];return t&&r.push(t),n&&r.push(n),r}function ae(e,t){let n={};return[e,t].forEach((e,t)=>{let r=t===1,i=r?`--mobile-offset`:`--offset`,a=r?N:M;function o(e){[`top`,`right`,`bottom`,`left`].forEach(t=>{n[`${i}-${t}`]=typeof e==`number`?`${e}px`:e})}typeof e==`number`||typeof e==`string`?o(e):typeof e==`object`?[`top`,`right`,`bottom`,`left`].forEach(t=>{e[t]===void 0?n[`${i}-${t}`]=a:n[`${i}-${t}`]=typeof e[t]==`number`?`${e[t]}px`:e[t]}):o(a)}),n}var oe=[`data-rich-colors`,`data-styled`,`data-mounted`,`data-promise`,`data-swiped`,`data-removed`,`data-visible`,`data-y-position`,`data-x-position`,`data-index`,`data-front`,`data-swiping`,`data-dismissible`,`data-type`,`data-invert`,`data-swipe-out`,`data-swipe-direction`,`data-expanded`,`data-testid`],se=[`aria-label`,`data-disabled`,`data-close-button-position`],ce=s({__name:`Toast`,props:{toast:{},toasts:{},index:{},swipeDirections:{},expanded:{type:Boolean},invert:{type:Boolean},heights:{},gap:{},position:{},closeButtonPosition:{},visibleToasts:{},expandByDefault:{type:Boolean},closeButton:{type:Boolean},interacting:{type:Boolean},style:{},cancelButtonStyle:{},actionButtonStyle:{},duration:{},class:{},unstyled:{type:Boolean},descriptionClass:{},loadingIcon:{},classes:{},icons:{},closeButtonAriaLabel:{},defaultRichColors:{type:Boolean}},emits:[`update:heights`,`update:height`,`removeToast`],setup(a,{emit:s}){let m=a,v=s,b=r(null),S=r(null),T=r(!1),E=r(!1),D=r(!1),O=r(!1),k=r(!1),j=r(0),M=r(0),N=r(m.toast.duration||m.duration||P),F=r(null),I=r(null),ae=C(()=>m.index===0),ce=C(()=>m.index+1<=m.visibleToasts),B=C(()=>m.toast.type),V=C(()=>m.toast.dismissible!==!1),le=C(()=>m.toast.class||``),H=C(()=>m.descriptionClass||``),U=C(()=>{let e=m.toast.position||m.position,t=m.heights.filter(t=>t.position===e).findIndex(e=>e.toastId===m.toast.id);return t>=0?t:0}),ue=C(()=>{let e=m.toast.position||m.position;return m.heights.filter(t=>t.position===e).reduce((e,t,n)=>n>=U.value?e:e+t.height,0)}),W=C(()=>U.value*m.gap+ue.value||0),de=C(()=>m.toast.closeButton??m.closeButton),fe=C(()=>m.toast.duration||m.duration||P),G=r(0),K=r(0),q=r(null),J=C(()=>m.position.split(`-`)),pe=C(()=>J.value[0]),me=C(()=>J.value[1]),he=C(()=>typeof m.toast.title!=`string`),ge=C(()=>typeof m.toast.description!=`string`),{isDocumentHidden:Y}=R(),X=C(()=>B.value&&B.value===`loading`);y(()=>{T.value=!0,N.value=fe.value}),h(async()=>{if(!T.value||!I.value)return;await ee();let e=I.value,t=e.style.height;e.style.height=`auto`;let n=e.getBoundingClientRect().height;e.style.height=t,M.value=n,v(`update:height`,{toastId:m.toast.id,height:n,position:m.toast.position||m.position})});function Z(){E.value=!0,j.value=W.value,setTimeout(()=>{v(`removeToast`,m.toast)},L)}function Q(){if(X.value||!V.value)return{};Z(),m.toast.onDismiss?.(m.toast)}function _e(e){e.button!==2&&(X.value||!V.value||(F.value=new Date,j.value=W.value,e.target.setPointerCapture(e.pointerId),e.target.tagName!==`BUTTON`&&(D.value=!0,q.value={x:e.clientX,y:e.clientY})))}function ve(){if(O.value||!V.value)return;q.value=null;let e=Number(I.value?.style.getPropertyValue(`--swipe-amount-x`).replace(`px`,``)||0),t=Number(I.value?.style.getPropertyValue(`--swipe-amount-y`).replace(`px`,``)||0),n=new Date().getTime()-(F.value?.getTime()||0),r=b.value===`x`?e:t,i=Math.abs(r)/n;if(Math.abs(r)>=re||i>.11){j.value=W.value,m.toast.onDismiss?.(m.toast),b.value===`x`?S.value=e>0?`right`:`left`:S.value=t>0?`down`:`up`,Z(),O.value=!0;return}else I.value?.style.setProperty(`--swipe-amount-x`,`0px`),I.value?.style.setProperty(`--swipe-amount-y`,`0px`);k.value=!1,D.value=!1,b.value=null}function $(e){if(!q.value||!V.value||(window?.getSelection()?.toString()?.length??!1))return;let t=e.clientY-q.value.y,n=e.clientX-q.value.x,r=m.swipeDirections??ie(m.position);!b.value&&(Math.abs(n)>1||Math.abs(t)>1)&&(b.value=Math.abs(n)>Math.abs(t)?`x`:`y`);let i={x:0,y:0},a=e=>1/(1.5+Math.abs(e)/20);if(b.value===`y`){if(r.includes(`top`)||r.includes(`bottom`))if(r.includes(`top`)&&t<0||r.includes(`bottom`)&&t>0)i.y=t;else{let e=t*a(t);i.y=Math.abs(e)<Math.abs(t)?e:t}}else if(b.value===`x`&&(r.includes(`left`)||r.includes(`right`)))if(r.includes(`left`)&&n<0||r.includes(`right`)&&n>0)i.x=n;else{let e=n*a(n);i.x=Math.abs(e)<Math.abs(n)?e:n}(Math.abs(i.x)>0||Math.abs(i.y)>0)&&(k.value=!0),I.value?.style.setProperty(`--swipe-amount-x`,`${i.x}px`),I.value?.style.setProperty(`--swipe-amount-y`,`${i.y}px`)}y(()=>{if(T.value=!0,!I.value)return;let e=I.value.getBoundingClientRect().height;M.value=e,v(`update:heights`,[{toastId:m.toast.id,height:e,position:m.toast.position},...m.heights])}),ne(()=>{I.value&&v(`removeToast`,m.toast)}),h(e=>{if(m.toast.promise&&B.value===`loading`||m.toast.duration===1/0||m.toast.type===`loading`)return;let t;m.expanded||m.interacting||Y.value?(()=>{if(K.value<G.value){let e=new Date().getTime()-G.value;N.value-=e}K.value=new Date().getTime()})():N.value!==1/0&&(G.value=new Date().getTime(),t=setTimeout(()=>{m.toast.onAutoClose?.(m.toast),Z()},N.value)),e(()=>{clearTimeout(t)})}),te(()=>m.toast.delete,e=>{e!==void 0&&e&&(Z(),m.toast.onDismiss?.(m.toast))},{deep:!0});function ye(){D.value=!1,b.value=null,q.value=null}return(r,a)=>(g(),d(`li`,{tabindex:`0`,ref_key:`toastRef`,ref:I,class:l(i(z)(m.class,le.value,r.classes?.toast,r.toast.classes?.toast,r.classes?.[B.value],r.toast?.classes?.[B.value])),"data-sonner-toast":``,"data-rich-colors":r.toast.richColors??r.defaultRichColors,"data-styled":!(r.toast.component||r.toast?.unstyled||r.unstyled),"data-mounted":T.value,"data-promise":!!r.toast.promise,"data-swiped":k.value,"data-removed":E.value,"data-visible":ce.value,"data-y-position":pe.value,"data-x-position":me.value,"data-index":r.index,"data-front":ae.value,"data-swiping":D.value,"data-dismissible":V.value,"data-type":B.value,"data-invert":r.toast.invert||r.invert,"data-swipe-out":O.value,"data-swipe-direction":S.value,"data-expanded":!!(r.expanded||r.expandByDefault&&T.value),"data-testid":r.toast.testId,style:w({"--index":r.index,"--toasts-before":r.index,"--z-index":r.toasts.length-r.index,"--offset":`${E.value?j.value:W.value}px`,"--initial-height":r.expandByDefault?`auto`:`${M.value}px`,...r.style,...m.toast.style}),onDragend:ye,onPointerdown:_e,onPointerup:ve,onPointermove:$},[de.value&&!r.toast.component&&B.value!==`loading`?(g(),d(`button`,{key:0,"aria-label":r.closeButtonAriaLabel||`Close toast`,"data-disabled":X.value,"data-close-button":`true`,"data-close-button-position":r.closeButtonPosition,class:l(i(z)(r.classes?.closeButton,r.toast?.classes?.closeButton)),onClick:Q},[r.icons?.close?(g(),f(x(r.icons?.close),{key:0})):_(r.$slots,`close-icon`,{key:1})],10,se)):o(`v-if`,!0),r.toast.component?(g(),f(x(r.toast.component),e({key:1},r.toast.componentProps,{onCloseToast:Q,isPaused:r.$props.expanded||r.$props.interacting||i(Y)}),null,16,[`isPaused`])):(g(),d(c,{key:2},[B.value!==`default`||r.toast.icon||r.toast.promise?(g(),d(`div`,{key:0,"data-icon":``,class:l(i(z)(r.classes?.icon,r.toast?.classes?.icon))},[r.toast.icon?(g(),f(x(r.toast.icon),{key:0})):(g(),d(c,{key:1},[B.value===`loading`?_(r.$slots,`loading-icon`,{key:0}):B.value===`success`?_(r.$slots,`success-icon`,{key:1}):B.value===`error`?_(r.$slots,`error-icon`,{key:2}):B.value===`warning`?_(r.$slots,`warning-icon`,{key:3}):B.value===`info`?_(r.$slots,`info-icon`,{key:4}):o(`v-if`,!0)],64))],2)):o(`v-if`,!0),t(`div`,{"data-content":``,class:l(i(z)(r.classes?.content,r.toast?.classes?.content))},[t(`div`,{"data-title":``,class:l(i(z)(r.classes?.title,r.toast.classes?.title))},[he.value?(g(),f(x(r.toast.title),u(e({key:0},r.toast.componentProps)),null,16)):(g(),d(c,{key:1},[p(n(r.toast.title),1)],64))],2),r.toast.description?(g(),d(`div`,{key:0,"data-description":``,class:l(i(z)(r.descriptionClass,H.value,r.classes?.description,r.toast.classes?.description))},[ge.value?(g(),f(x(r.toast.description),u(e({key:0},r.toast.componentProps)),null,16)):(g(),d(c,{key:1},[p(n(r.toast.description),1)],64))],2)):o(`v-if`,!0)],2),r.toast.cancel?(g(),d(`button`,{key:1,style:w(r.toast.cancelButtonStyle||r.cancelButtonStyle),class:l(i(z)(r.classes?.cancelButton,r.toast.classes?.cancelButton)),"data-button":``,"data-cancel":``,onClick:a[0]||=e=>{i(A)(r.toast.cancel)&&V.value&&(r.toast.cancel.onClick?.(e),Z())}},n(i(A)(r.toast.cancel)?r.toast.cancel?.label:r.toast.cancel),7)):o(`v-if`,!0),r.toast.action?(g(),d(`button`,{key:2,style:w(r.toast.actionButtonStyle||r.actionButtonStyle),class:l(i(z)(r.classes?.actionButton,r.toast.classes?.actionButton)),"data-button":``,"data-action":``,onClick:a[1]||=e=>{i(A)(r.toast.action)&&(r.toast.action.onClick?.(e),!e.defaultPrevented&&Z())}},n(i(A)(r.toast.action)?r.toast.action?.label:r.toast.action),7)):o(`v-if`,!0)],64))],46,oe))}}),B=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},V={},le={xmlns:`http://www.w3.org/2000/svg`,width:`12`,height:`12`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stoke-width":`1.5`,"stroke-linecap":`round`,"stroke-linejoin":`round`};function H(e,n){return g(),d(`svg`,le,n[0]||=[t(`line`,{x1:`18`,y1:`6`,x2:`6`,y2:`18`},null,-1),t(`line`,{x1:`6`,y1:`6`,x2:`18`,y2:`18`},null,-1)])}var U=B(V,[[`render`,H]]),ue=[`data-visible`],W={class:`sonner-spinner`},de=s({__name:`Loader`,props:{visible:{type:Boolean}},setup(e){let n=Array(12).fill(0);return(e,r)=>(g(),d(`div`,{class:`sonner-loading-wrapper`,"data-visible":e.visible},[t(`div`,W,[(g(!0),d(c,null,b(i(n),e=>(g(),d(`div`,{key:`spinner-bar-${e}`,class:`sonner-loading-bar`}))),128))])],8,ue))}}),fe={},G={xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`};function K(e,n){return g(),d(`svg`,G,n[0]||=[t(`path`,{"fill-rule":`evenodd`,d:`M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z`,"clip-rule":`evenodd`},null,-1)])}var q=B(fe,[[`render`,K]]),J={},pe={xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`};function me(e,n){return g(),d(`svg`,pe,n[0]||=[t(`path`,{"fill-rule":`evenodd`,d:`M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z`,"clip-rule":`evenodd`},null,-1)])}var he=B(J,[[`render`,me]]),ge={},Y={xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 24 24`,fill:`currentColor`,height:`20`,width:`20`};function X(e,n){return g(),d(`svg`,Y,n[0]||=[t(`path`,{"fill-rule":`evenodd`,d:`M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z`,"clip-rule":`evenodd`},null,-1)])}var Z=B(ge,[[`render`,X]]),Q={},_e={xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 20 20`,fill:`currentColor`,height:`20`,width:`20`};function ve(e,n){return g(),d(`svg`,_e,n[0]||=[t(`path`,{"fill-rule":`evenodd`,d:`M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z`,"clip-rule":`evenodd`},null,-1)])}var $=B(Q,[[`render`,ve]]),ye=[`aria-label`],be=[`data-sonner-theme`,`dir`,`data-theme`,`data-rich-colors`,`data-y-position`,`data-x-position`],xe=typeof window<`u`&&typeof document<`u`;function Se(){if(typeof window>`u`||typeof document>`u`)return`ltr`;let e=document.documentElement.getAttribute(`dir`);return e===`auto`||!e?window.getComputedStyle(document.documentElement).direction:e}var Ce=s({name:`Toaster`,inheritAttrs:!1,__name:`Toaster`,props:{id:{},invert:{type:Boolean,default:!1},theme:{default:`light`},position:{default:`bottom-right`},closeButtonPosition:{default:`top-left`},hotkey:{default:()=>[`altKey`,`KeyT`]},richColors:{type:Boolean,default:!1},expand:{type:Boolean,default:!1},duration:{},gap:{default:I},visibleToasts:{default:j},closeButton:{type:Boolean,default:!1},toastOptions:{default:()=>({})},class:{default:``},style:{},offset:{default:M},mobileOffset:{default:N},dir:{default:`auto`},swipeDirections:{},icons:{},containerAriaLabel:{default:`Notifications`}},setup(n){let s=n,u=v(),p=r([]),m=C(()=>s.id?p.value.filter(e=>e.toasterId===s.id):p.value.filter(e=>!e.toasterId));function te(e,t){return m.value.filter(n=>!n.position&&t===0||n.position===e)}let y=C(()=>{let e=m.value.filter(e=>e.position).map(e=>e.position);return e.length>0?Array.from(new Set([s.position].concat(e))):[s.position]}),ne=C(()=>{let e={};return y.value.forEach(t=>{e[t]=p.value.filter(e=>e.position===t)}),e}),x=r([]),T=r({}),D=r(!1);h(()=>{y.value.forEach(e=>{e in T.value||(T.value[e]=!1)})});let O=r(s.theme===`system`?typeof window<`u`&&window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:s.theme),k=r(null),A=r(null),j=r(!1),M=s.hotkey.join(`+`).replace(/Key/g,``).replace(/Digit/g,``);function N(e){p.value.find(t=>t.id===e.id)?.delete||E.dismiss(e.id),p.value=p.value.filter(({id:t})=>t!==e.id),setTimeout(()=>{p.value.find(t=>t.id===e.id)||(x.value=x.value.filter(t=>t.toastId!==e.id))},L+50)}function P(e){j.value&&!e.currentTarget?.contains?.(e.relatedTarget)&&(j.value=!1,A.value&&=(A.value.focus({preventScroll:!0}),null))}function I(e){e.target instanceof HTMLElement&&e.target.dataset.dismissible===`false`||j.value||(j.value=!0,A.value=e.relatedTarget)}function re(e){e.target&&e.target instanceof HTMLElement&&e.target.dataset.dismissible===`false`||(D.value=!0)}h(e=>{e(E.subscribe(e=>{if(e.dismiss){requestAnimationFrame(()=>{p.value=p.value.map(t=>t.id===e.id?{...t,delete:!0}:t)});return}ee(()=>{let t=p.value.findIndex(t=>t.id===e.id);t===-1?p.value=[e,...p.value]:p.value=[...p.value.slice(0,t),{...p.value[t],...e},...p.value.slice(t+1)]})}))}),h(e=>{if(typeof window>`u`)return;if(s.theme!==`system`){O.value=s.theme;return}let t=window.matchMedia(`(prefers-color-scheme: dark)`),n=e=>{O.value=e?`dark`:`light`};n(t.matches);let r=e=>{n(e.matches)};try{t.addEventListener(`change`,r)}catch{t.addListener(r)}e(()=>{try{t.removeEventListener(`change`,r)}catch{t.removeListener(r)}})}),h(()=>{k.value&&A.value&&(A.value.focus({preventScroll:!0}),A.value=null,j.value=!1)}),h(()=>{p.value.length<=1&&Object.keys(T.value).forEach(e=>{T.value[e]=!1})}),h(e=>{function t(e){let t=s.hotkey.every(t=>e[t]||e.code===t),n=Array.isArray(k.value)?k.value[0]:k.value;t&&(y.value.forEach(e=>{T.value[e]=!0}),n?.focus());let r=document.activeElement===k.value||n?.contains(document.activeElement);e.code===`Escape`&&r&&y.value.forEach(e=>{T.value[e]=!1})}xe&&(document.addEventListener(`keydown`,t),e(()=>{document.removeEventListener(`keydown`,t)}))});function R(e){let t=e.currentTarget,n=t.getAttribute(`data-y-position`)+`-`+t.getAttribute(`data-x-position`);T.value[n]=!0}function z(e){if(!D.value){let t=e.currentTarget,n=t.getAttribute(`data-y-position`)+`-`+t.getAttribute(`data-x-position`);T.value[n]=!1}}function ie(){Object.keys(T.value).forEach(e=>{T.value[e]=!1})}function oe(){D.value=!1}function se(e){x.value=e}function B(e){let t=x.value.findIndex(t=>t.toastId===e.toastId);if(t!==-1)x.value[t]=e;else{let t=x.value.findIndex(t=>t.position===e.position);t===-1?x.value.unshift(e):x.value.splice(t,0,e)}}return(n,r)=>(g(),d(c,null,[o(` Remove item from normal navigation flow, only available via hotkey `),t(`section`,{"aria-label":`${n.containerAriaLabel} ${i(M)}`,tabIndex:-1,"aria-live":`polite`,"aria-relevant":`additions text`,"aria-atomic":`false`},[(g(!0),d(c,null,b(y.value,(t,r)=>(g(),d(`ol`,e({key:t,ref_for:!0,ref_key:`listRef`,ref:k,"data-sonner-toaster":``,"data-sonner-theme":O.value,class:s.class,dir:n.dir===`auto`?Se():n.dir,tabIndex:-1,"data-theme":n.theme,"data-rich-colors":n.richColors,"data-y-position":t.split(`-`)[0],"data-x-position":t.split(`-`)[1],style:{"--front-toast-height":`${x.value[0]?.height||0}px`,"--width":`${i(F)}px`,"--gap":`${n.gap}px`,...n.style,...i(u).style,...i(ae)(n.offset,n.mobileOffset)}},{ref_for:!0},n.$attrs,{onBlur:P,onFocus:I,onMouseenter:R,onMousemove:R,onMouseleave:z,onDragend:ie,onPointerdown:re,onPointerup:oe}),[(g(!0),d(c,null,b(te(t,r),(e,r)=>(g(),f(ce,{key:e.id,heights:x.value,icons:n.icons,index:r,toast:e,defaultRichColors:n.richColors,duration:n.toastOptions?.duration??n.duration,class:l(n.toastOptions?.class??``),descriptionClass:n.toastOptions?.descriptionClass,invert:n.invert,visibleToasts:n.visibleToasts,closeButton:n.toastOptions?.closeButton??n.closeButton,interacting:D.value,position:t,closeButtonPosition:n.toastOptions?.closeButtonPosition??n.closeButtonPosition,style:w(n.toastOptions?.style),unstyled:n.toastOptions?.unstyled,classes:n.toastOptions?.classes,cancelButtonStyle:n.toastOptions?.cancelButtonStyle,actionButtonStyle:n.toastOptions?.actionButtonStyle,"close-button-aria-label":n.toastOptions?.closeButtonAriaLabel,toasts:ne.value[t],expandByDefault:n.expand,gap:n.gap,expanded:T.value[t]||!1,swipeDirections:s.swipeDirections,"onUpdate:heights":se,"onUpdate:height":B,onRemoveToast:N},{"close-icon":S(()=>[_(n.$slots,`close-icon`,{},()=>[a(U)])]),"loading-icon":S(()=>[_(n.$slots,`loading-icon`,{},()=>[a(de,{visible:e.type===`loading`},null,8,[`visible`])])]),"success-icon":S(()=>[_(n.$slots,`success-icon`,{},()=>[a(q)])]),"error-icon":S(()=>[_(n.$slots,`error-icon`,{},()=>[a($)])]),"warning-icon":S(()=>[_(n.$slots,`warning-icon`,{},()=>[a(Z)])]),"info-icon":S(()=>[_(n.$slots,`info-icon`,{},()=>[a(he)])]),_:2},1032,[`heights`,`icons`,`index`,`toast`,`defaultRichColors`,`duration`,`class`,`descriptionClass`,`invert`,`visibleToasts`,`closeButton`,`interacting`,`position`,`closeButtonPosition`,`style`,`unstyled`,`classes`,`cancelButtonStyle`,`actionButtonStyle`,`close-button-aria-label`,`toasts`,`expandByDefault`,`gap`,`expanded`,`swipeDirections`]))),128))],16,be))),128))],8,ye)],2112))}});export{k as n,Ce as t};
@@ -1 +1 @@
1
- import{t as e}from"./createLucideIcon-CCmQ9QKM.js";var t=e(`check`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]);function n(e){return typeof e==`string`?`'${e}'`:new r().serialize(e)}var r=function(){class e{#e=new Map;compare(e,t){let n=typeof e,r=typeof t;return n===`string`&&r===`string`?e.localeCompare(t):n===`number`&&r===`number`?e-t:String.prototype.localeCompare.call(this.serialize(e,!0),this.serialize(t,!0))}serialize(e,t){if(e===null)return`null`;switch(typeof e){case`string`:return t?e:`'${e}'`;case`bigint`:return`${e}n`;case`object`:return this.$object(e);case`function`:return this.$function(e)}return String(e)}serializeObject(e){let t=Object.prototype.toString.call(e);if(t!==`[object Object]`)return this.serializeBuiltInType(t.length<10?`unknown:${t}`:t.slice(8,-1),e);let n=e.constructor,r=n===Object||n===void 0?``:n.name;if(r!==``&&globalThis[r]===n)return this.serializeBuiltInType(r,e);if(typeof e.toJSON==`function`){let t=e.toJSON();return r+(typeof t==`object`&&t?this.$object(t):`(${this.serialize(t)})`)}return this.serializeObjectEntries(r,Object.entries(e))}serializeBuiltInType(e,t){let n=this[`$`+e];if(n)return n.call(this,t);if(typeof t?.entries==`function`)return this.serializeObjectEntries(e,t.entries());throw Error(`Cannot serialize ${e}`)}serializeObjectEntries(e,t){let n=Array.from(t).sort((e,t)=>this.compare(e[0],t[0])),r=`${e}{`;for(let e=0;e<n.length;e++){let[t,i]=n[e];r+=`${this.serialize(t,!0)}:${this.serialize(i)}`,e<n.length-1&&(r+=`,`)}return r+`}`}$object(e){let t=this.#e.get(e);return t===void 0&&(this.#e.set(e,`#${this.#e.size}`),t=this.serializeObject(e),this.#e.set(e,t)),t}$function(e){let t=Function.prototype.toString.call(e);return t.slice(-15)===`[native code] }`?`${e.name||``}()[native]`:`${e.name}(${e.length})${t.replace(/\s*\n\s*/g,``)}`}$Array(e){let t=`[`;for(let n=0;n<e.length;n++)t+=this.serialize(e[n]),n<e.length-1&&(t+=`,`);return t+`]`}$Date(e){try{return`Date(${e.toISOString()})`}catch{return`Date(null)`}}$ArrayBuffer(e){return`ArrayBuffer[${new Uint8Array(e).join(`,`)}]`}$Set(e){return`Set${this.$Array(Array.from(e).sort((e,t)=>this.compare(e,t)))}`}$Map(e){return this.serializeObjectEntries(`Map`,e.entries())}}for(let t of[`Error`,`RegExp`,`URL`])e.prototype[`$`+t]=function(e){return`${t}(${e})`};for(let t of[`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float32Array`,`Float64Array`])e.prototype[`$`+t]=function(e){return`${t}[${e.join(`,`)}]`};for(let t of[`BigInt64Array`,`BigUint64Array`])e.prototype[`$`+t]=function(e){return`${t}[${e.join(`n,`)}${e.length>0?`n`:``}]`};return e}();function i(e,t){return e===t||n(e)===n(t)}export{t as n,i as t};
1
+ import{t as e}from"./createLucideIcon-jHUFhqKn.js";var t=e(`check`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]);function n(e){return typeof e==`string`?`'${e}'`:new r().serialize(e)}var r=function(){class e{#e=new Map;compare(e,t){let n=typeof e,r=typeof t;return n===`string`&&r===`string`?e.localeCompare(t):n===`number`&&r===`number`?e-t:String.prototype.localeCompare.call(this.serialize(e,!0),this.serialize(t,!0))}serialize(e,t){if(e===null)return`null`;switch(typeof e){case`string`:return t?e:`'${e}'`;case`bigint`:return`${e}n`;case`object`:return this.$object(e);case`function`:return this.$function(e)}return String(e)}serializeObject(e){let t=Object.prototype.toString.call(e);if(t!==`[object Object]`)return this.serializeBuiltInType(t.length<10?`unknown:${t}`:t.slice(8,-1),e);let n=e.constructor,r=n===Object||n===void 0?``:n.name;if(r!==``&&globalThis[r]===n)return this.serializeBuiltInType(r,e);if(typeof e.toJSON==`function`){let t=e.toJSON();return r+(typeof t==`object`&&t?this.$object(t):`(${this.serialize(t)})`)}return this.serializeObjectEntries(r,Object.entries(e))}serializeBuiltInType(e,t){let n=this[`$`+e];if(n)return n.call(this,t);if(typeof t?.entries==`function`)return this.serializeObjectEntries(e,t.entries());throw Error(`Cannot serialize ${e}`)}serializeObjectEntries(e,t){let n=Array.from(t).sort((e,t)=>this.compare(e[0],t[0])),r=`${e}{`;for(let e=0;e<n.length;e++){let[t,i]=n[e];r+=`${this.serialize(t,!0)}:${this.serialize(i)}`,e<n.length-1&&(r+=`,`)}return r+`}`}$object(e){let t=this.#e.get(e);return t===void 0&&(this.#e.set(e,`#${this.#e.size}`),t=this.serializeObject(e),this.#e.set(e,t)),t}$function(e){let t=Function.prototype.toString.call(e);return t.slice(-15)===`[native code] }`?`${e.name||``}()[native]`:`${e.name}(${e.length})${t.replace(/\s*\n\s*/g,``)}`}$Array(e){let t=`[`;for(let n=0;n<e.length;n++)t+=this.serialize(e[n]),n<e.length-1&&(t+=`,`);return t+`]`}$Date(e){try{return`Date(${e.toISOString()})`}catch{return`Date(null)`}}$ArrayBuffer(e){return`ArrayBuffer[${new Uint8Array(e).join(`,`)}]`}$Set(e){return`Set${this.$Array(Array.from(e).sort((e,t)=>this.compare(e,t)))}`}$Map(e){return this.serializeObjectEntries(`Map`,e.entries())}}for(let t of[`Error`,`RegExp`,`URL`])e.prototype[`$`+t]=function(e){return`${t}(${e})`};for(let t of[`Int8Array`,`Uint8Array`,`Uint8ClampedArray`,`Int16Array`,`Uint16Array`,`Int32Array`,`Uint32Array`,`Float32Array`,`Float64Array`])e.prototype[`$`+t]=function(e){return`${t}[${e.join(`,`)}]`};for(let t of[`BigInt64Array`,`BigUint64Array`])e.prototype[`$`+t]=function(e){return`${t}[${e.join(`n,`)}${e.length>0?`n`:``}]`};return e}();function i(e,t){return e===t||n(e)===n(t)}export{t as n,i as t};
@@ -1 +1 @@
1
- import{ot as e}from"./client-Mb8fy_bC.js";var t=2e3;function n(){let n=e(!1);async function i(e){try{return navigator.clipboard?.writeText?await navigator.clipboard.writeText(e):r(e),n.value=!0,setTimeout(()=>{n.value=!1},t),!0}catch{try{return r(e),n.value=!0,setTimeout(()=>{n.value=!1},t),!0}catch{return!1}}}return{copied:n,copy:i}}function r(e){let t=document.createElement(`textarea`);if(t.value=e,t.style.cssText=`position:fixed;left:-9999px;opacity:0`,document.body.appendChild(t),t.select(),!document.execCommand(`copy`))throw Error(`execCommand copy failed`);document.body.removeChild(t)}export{n as t};
1
+ import{Dt as e}from"./button-qxGNBunr.js";var t=2e3;function n(){let n=e(!1);async function i(e){try{return navigator.clipboard?.writeText?await navigator.clipboard.writeText(e):r(e),n.value=!0,setTimeout(()=>{n.value=!1},t),!0}catch{try{return r(e),n.value=!0,setTimeout(()=>{n.value=!1},t),!0}catch{return!1}}}return{copied:n,copy:i}}function r(e){let t=document.createElement(`textarea`);if(t.value=e,t.style.cssText=`position:fixed;left:-9999px;opacity:0`,document.body.appendChild(t),t.select(),!document.execCommand(`copy`))throw Error(`execCommand copy failed`);document.body.removeChild(t)}export{n as t};
@@ -0,0 +1 @@
1
+ import{Dt as e,Pt as t,it as n,l as r,q as i,z as a}from"./button-qxGNBunr.js";function o(){let o=i(),s=e(),c=a(()=>l());n(()=>{c.value!==l()&&t(s)});function l(){return s.value&&`$el`in s.value&&[`#text`,`#comment`].includes(s.value.$el.nodeName)?s.value.$el.nextElementSibling:r(s)}let u=Object.assign({},o.exposed),d={};for(let e in o.props)Object.defineProperty(d,e,{enumerable:!0,configurable:!0,get:()=>o.props[e]});if(Object.keys(u).length>0)for(let e in u)Object.defineProperty(d,e,{enumerable:!0,configurable:!0,get:()=>u[e]});Object.defineProperty(d,`$el`,{enumerable:!0,configurable:!0,get:()=>o.vnode.el}),o.exposed=d;function f(e){if(s.value=e,e&&(Object.defineProperty(d,`$el`,{enumerable:!0,configurable:!0,get:()=>e instanceof Element?e:e.$el}),!(e instanceof Element)&&!Object.hasOwn(e,`$el`))){let t=e.$.exposed,n=Object.assign({},d);for(let e in t)Object.defineProperty(n,e,{enumerable:!0,configurable:!0,get:()=>t[e]});o.exposed=n}}return{forwardRef:f,currentRef:s,currentElement:c}}export{o as t};
@@ -0,0 +1 @@
1
+ import{Dt as e,z as t}from"./button-qxGNBunr.js";import{v as n}from"./Collection-DY9-Yue9.js";function r(e,t=-1/0,n=1/0){return Math.min(n,Math.max(t,e))}function i(r){let i=n({nonce:e()});return t(()=>r?.value||i.nonce?.value)}export{r as n,i as t};
@@ -0,0 +1 @@
1
+ import{t as e}from"./createLucideIcon-jHUFhqKn.js";var t=e(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);export{t};
@@ -5,13 +5,13 @@
5
5
  <link rel="icon" type="image/svg+xml" href="/admin/favicon.svg" />
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
7
  <title>frontend</title>
8
- <script type="module" crossorigin src="/admin/assets/index-BQBtSfem.js"></script>
9
- <link rel="modulepreload" crossorigin href="/admin/assets/client-Mb8fy_bC.js">
10
- <link rel="modulepreload" crossorigin href="/admin/assets/button-D54q76GQ.js">
11
- <link rel="modulepreload" crossorigin href="/admin/assets/createLucideIcon-CCmQ9QKM.js">
12
- <link rel="modulepreload" crossorigin href="/admin/assets/x-DEJ1xpi5.js">
13
- <link rel="modulepreload" crossorigin href="/admin/assets/lib-BgOqOzXI.js">
14
- <link rel="stylesheet" crossorigin href="/admin/assets/index-H-lnTkMr.css">
8
+ <script type="module" crossorigin src="/admin/assets/index-C_disqMY.js"></script>
9
+ <link rel="modulepreload" crossorigin href="/admin/assets/button-qxGNBunr.js">
10
+ <link rel="modulepreload" crossorigin href="/admin/assets/createLucideIcon-jHUFhqKn.js">
11
+ <link rel="modulepreload" crossorigin href="/admin/assets/x-B0G-wIAB.js">
12
+ <link rel="modulepreload" crossorigin href="/admin/assets/lib-DjpgwSRA.js">
13
+ <link rel="modulepreload" crossorigin href="/admin/assets/badge-DIO8W_W9.js">
14
+ <link rel="stylesheet" crossorigin href="/admin/assets/index-DDp6SHfg.css">
15
15
  </head>
16
16
  <body>
17
17
  <div id="app"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "llm-simple-router",
3
- "version": "0.3.7",
3
+ "version": "0.4.1",
4
4
  "description": "LLM API proxy router with OpenAI/Anthropic support, model mapping, retry strategies, and admin dashboard",
5
5
  "license": "MIT",
6
6
  "author": "ZZzzswszzZZ",
@@ -1,7 +0,0 @@
1
- import { FastifyPluginCallback } from "fastify";
2
- interface ServiceRoutesOptions {
3
- db: any;
4
- encryptionKey: string;
5
- }
6
- export declare const adminServiceRoutes: FastifyPluginCallback<ServiceRoutesOptions>;
7
- export {};
@@ -1,63 +0,0 @@
1
- import { getAllBackendServices, getBackendServiceById, createBackendService, updateBackendService, deleteBackendService } from "../db/index.js";
2
- import { decrypt, encrypt } from "../utils/crypto.js";
3
- function maskApiKey(encrypted, key) {
4
- const decrypted = decrypt(encrypted, key);
5
- if (decrypted.length <= 8)
6
- return "****";
7
- return `${decrypted.slice(0, 4)}...${decrypted.slice(-4)}`;
8
- }
9
- export const adminServiceRoutes = (app, options, done) => {
10
- const { db, encryptionKey } = options;
11
- app.get("/admin/api/services", async (_request, reply) => {
12
- const services = getAllBackendServices(db);
13
- return reply.send(services.map((s) => ({
14
- ...s,
15
- api_key: maskApiKey(s.api_key, encryptionKey),
16
- })));
17
- });
18
- app.post("/admin/api/services", async (request, reply) => {
19
- const body = request.body;
20
- if (!body.name || !body.api_type || !body.base_url || !body.api_key) {
21
- return reply.code(400).send({ error: { message: "Missing required fields: name, api_type, base_url, api_key" } });
22
- }
23
- if (!["openai", "anthropic"].includes(body.api_type)) {
24
- return reply.code(400).send({ error: { message: "api_type must be 'openai' or 'anthropic'" } });
25
- }
26
- const encryptedKey = encrypt(body.api_key, encryptionKey);
27
- const id = createBackendService(db, {
28
- name: body.name,
29
- api_type: body.api_type,
30
- base_url: body.base_url,
31
- api_key: encryptedKey,
32
- is_active: body.is_active ?? 1,
33
- });
34
- return reply.code(201).send({ id });
35
- });
36
- app.put("/admin/api/services/:id", async (request, reply) => {
37
- const { id } = request.params;
38
- const existing = getBackendServiceById(db, id);
39
- if (!existing) {
40
- return reply.code(404).send({ error: { message: "Service not found" } });
41
- }
42
- const body = request.body;
43
- const fields = {};
44
- if (body.name !== undefined)
45
- fields.name = body.name;
46
- if (body.api_type !== undefined)
47
- fields.api_type = body.api_type;
48
- if (body.base_url !== undefined)
49
- fields.base_url = body.base_url;
50
- if (body.is_active !== undefined)
51
- fields.is_active = body.is_active;
52
- if (body.api_key)
53
- fields.api_key = encrypt(body.api_key, encryptionKey);
54
- updateBackendService(db, id, fields);
55
- return reply.send({ success: true });
56
- });
57
- app.delete("/admin/api/services/:id", async (request, reply) => {
58
- const { id } = request.params;
59
- deleteBackendService(db, id);
60
- return reply.send({ success: true });
61
- });
62
- done();
63
- };
@@ -1,43 +0,0 @@
1
- import type { ProxyResult, StreamProxyResult } from "./proxy-core.js";
2
- import type { FastifyReply } from "fastify";
3
- import type { RetryRuleMatcher } from "./retry-rules.js";
4
- export interface RetryConfig {
5
- maxRetries: number;
6
- baseDelayMs: number;
7
- ruleMatcher?: RetryRuleMatcher;
8
- }
9
- export interface Attempt {
10
- attemptIndex: number;
11
- statusCode: number | null;
12
- error: string | null;
13
- latencyMs: number;
14
- responseBody: string | null;
15
- }
16
- export interface RetryResult<T> {
17
- result: T;
18
- attempts: Attempt[];
19
- }
20
- export type ProxyFn<T = ProxyResult | StreamProxyResult> = () => Promise<T>;
21
- export interface RetryStrategy {
22
- getDelay(attempt: number): number;
23
- }
24
- export declare class FixedIntervalStrategy implements RetryStrategy {
25
- private delayMs;
26
- constructor(delayMs: number);
27
- getDelay(): number;
28
- }
29
- export declare class ExponentialBackoffStrategy implements RetryStrategy {
30
- private baseMs;
31
- private capMs;
32
- constructor(baseMs: number, capMs: number);
33
- getDelay(attempt: number): number;
34
- }
35
- export declare function createStrategy(rule: {
36
- retry_strategy: string;
37
- retry_delay_ms: number;
38
- max_delay_ms: number;
39
- }): RetryStrategy;
40
- export declare function buildRetryConfig(maxRetries: number, baseDelayMs: number, ruleMatcher?: RetryRuleMatcher): RetryConfig;
41
- export declare function isRetryableResult(statusCode: number, body?: string, config?: RetryConfig): boolean;
42
- export declare function isRetryableThrow(err: unknown): boolean;
43
- export declare function retryableCall<T extends ProxyResult | StreamProxyResult>(fn: ProxyFn<T>, config: RetryConfig, reply?: FastifyReply): Promise<RetryResult<T>>;
@@ -1,121 +0,0 @@
1
- export class FixedIntervalStrategy {
2
- delayMs;
3
- constructor(delayMs) {
4
- this.delayMs = delayMs;
5
- }
6
- getDelay() { return this.delayMs; }
7
- }
8
- const EXPONENTIAL_BASE = 2;
9
- export class ExponentialBackoffStrategy {
10
- baseMs;
11
- capMs;
12
- constructor(baseMs, capMs) {
13
- this.baseMs = baseMs;
14
- this.capMs = capMs;
15
- }
16
- getDelay(attempt) {
17
- return Math.min(this.baseMs * EXPONENTIAL_BASE ** attempt, this.capMs);
18
- }
19
- }
20
- export function createStrategy(rule) {
21
- if (rule.retry_strategy === "fixed")
22
- return new FixedIntervalStrategy(rule.retry_delay_ms);
23
- return new ExponentialBackoffStrategy(rule.retry_delay_ms, rule.max_delay_ms);
24
- }
25
- // ---------- Constants ----------
26
- const RETRYABLE_THROW_CODES = new Set(["ETIMEDOUT", "ECONNRESET", "ECONNREFUSED"]);
27
- const HTTP_BAD_REQUEST = 400;
28
- const HTTP_TOO_MANY_REQUESTS = 429;
29
- const MS_PER_SECOND = 1000;
30
- // ---------- Shared helpers ----------
31
- export function buildRetryConfig(maxRetries, baseDelayMs, ruleMatcher) {
32
- return {
33
- maxRetries,
34
- baseDelayMs,
35
- ruleMatcher,
36
- };
37
- }
38
- // ---------- Predicates ----------
39
- export function isRetryableResult(statusCode, body, config) {
40
- if (body && config?.ruleMatcher?.test(statusCode, body))
41
- return true;
42
- return false;
43
- }
44
- export function isRetryableThrow(err) {
45
- if (err && typeof err === "object" && "code" in err) {
46
- return RETRYABLE_THROW_CODES.has(err.code ?? "");
47
- }
48
- return false;
49
- }
50
- // ---------- Internal helpers ----------
51
- function sleep(ms) {
52
- return new Promise((resolve) => setTimeout(resolve, ms));
53
- }
54
- function parseRetryAfter(headers) {
55
- if (!headers)
56
- return null;
57
- const val = headers["retry-after"] ?? headers["Retry-After"];
58
- if (!val)
59
- return null;
60
- const seconds = parseInt(val, 10);
61
- return isNaN(seconds) ? null : seconds * MS_PER_SECOND;
62
- }
63
- function extractHeaders(result) {
64
- return "headers" in result ? result.headers : result.upstreamResponseHeaders ?? {};
65
- }
66
- function extractBody(result) {
67
- return "body" in result ? result.body : result.responseBody ?? null;
68
- }
69
- // ---------- Core ----------
70
- export async function retryableCall(fn, config, reply) {
71
- const attempts = [];
72
- for (let attempt = 0;; attempt++) {
73
- const start = Date.now();
74
- try {
75
- const result = await fn();
76
- const elapsed = Date.now() - start;
77
- const body = extractBody(result);
78
- attempts.push({
79
- attemptIndex: attempt,
80
- statusCode: result.statusCode,
81
- error: null,
82
- latencyMs: elapsed,
83
- responseBody: body,
84
- });
85
- if (result.statusCode < HTTP_BAD_REQUEST)
86
- return { result, attempts };
87
- // 通过 matcher 获取匹配规则(含策略参数)
88
- const matchedRule = body ? config.ruleMatcher?.match(result.statusCode, body) ?? null : null;
89
- if (!matchedRule)
90
- return { result, attempts };
91
- const maxAttempts = matchedRule.max_retries;
92
- if (attempt >= maxAttempts)
93
- return { result, attempts };
94
- if (reply && (reply.raw.writableFinished || reply.raw.headersSent))
95
- return { result, attempts };
96
- const strategy = createStrategy(matchedRule);
97
- const headers = extractHeaders(result);
98
- const retryAfterMs = result.statusCode === HTTP_TOO_MANY_REQUESTS ? parseRetryAfter(headers) : null;
99
- const delay = Math.max(strategy.getDelay(attempt), retryAfterMs ?? 0);
100
- await sleep(delay);
101
- }
102
- catch (err) {
103
- const elapsed = Date.now() - start;
104
- const errMsg = err instanceof Error ? err.message : String(err);
105
- attempts.push({
106
- attemptIndex: attempt,
107
- statusCode: null,
108
- error: errMsg,
109
- latencyMs: elapsed,
110
- responseBody: null,
111
- });
112
- if (!isRetryableThrow(err))
113
- throw err;
114
- if (attempt >= config.maxRetries)
115
- throw err;
116
- if (reply && (reply.raw.writableFinished || reply.raw.headersSent))
117
- throw err;
118
- await sleep(config.baseDelayMs);
119
- }
120
- }
121
- }