mcp-deploy 0.1.3 → 0.1.5

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 (103) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +6 -6
  3. package/.next/standalone/.next/build-manifest.json +2 -2
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/server/app/.well-known/oauth-authorization-server/route_client-reference-manifest.js +1 -1
  6. package/.next/standalone/.next/server/app/_global-error/page.js +2 -2
  7. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  9. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  10. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  12. package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  13. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  14. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  15. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
  17. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  19. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  20. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  21. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  22. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  23. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  24. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  25. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  26. package/.next/standalone/.next/server/app/api/cloudflare/setup/route_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/api/cloudflare/status/route_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/api/mcps/[slug]/deploy/route.js +1 -1
  29. package/.next/standalone/.next/server/app/api/mcps/[slug]/deploy/route_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/api/mcps/[slug]/remove/route.js +1 -1
  31. package/.next/standalone/.next/server/app/api/mcps/[slug]/remove/route_client-reference-manifest.js +1 -1
  32. package/.next/standalone/.next/server/app/api/mcps/[slug]/route.js +1 -1
  33. package/.next/standalone/.next/server/app/api/mcps/[slug]/route_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/api/mcps/[slug]/secrets/route.js +1 -1
  35. package/.next/standalone/.next/server/app/api/mcps/[slug]/secrets/route_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/api/mcps/[slug]/status/route_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/api/mcps/[slug]/undeploy/route.js +1 -1
  38. package/.next/standalone/.next/server/app/api/mcps/[slug]/undeploy/route_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/api/mcps/add/route.js +1 -1
  40. package/.next/standalone/.next/server/app/api/mcps/add/route_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/api/mcps/check-updates/route_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/api/mcps/route.js +1 -1
  43. package/.next/standalone/.next/server/app/api/mcps/route_client-reference-manifest.js +1 -1
  44. package/.next/standalone/.next/server/app/api/mcps/validate/route_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/api/oauth/approve/route_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/api/oauth/register/route_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/api/oauth/token/route_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/api/test-connection/route_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/index.html +2 -2
  50. package/.next/standalone/.next/server/app/index.rsc +2 -2
  51. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  52. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  53. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  54. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  55. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  56. package/.next/standalone/.next/server/app/mcps/[slug]/page.js +3 -3
  57. package/.next/standalone/.next/server/app/mcps/[slug]/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/oauth/authorize/page.js +1 -1
  59. package/.next/standalone/.next/server/app/oauth/authorize/page_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/oauth/authorize.html +2 -2
  61. package/.next/standalone/.next/server/app/oauth/authorize.rsc +2 -2
  62. package/.next/standalone/.next/server/app/oauth/authorize.segments/_full.segment.rsc +2 -2
  63. package/.next/standalone/.next/server/app/oauth/authorize.segments/_head.segment.rsc +1 -1
  64. package/.next/standalone/.next/server/app/oauth/authorize.segments/_index.segment.rsc +2 -2
  65. package/.next/standalone/.next/server/app/oauth/authorize.segments/_tree.segment.rsc +2 -2
  66. package/.next/standalone/.next/server/app/oauth/authorize.segments/oauth/authorize/__PAGE__.segment.rsc +1 -1
  67. package/.next/standalone/.next/server/app/oauth/authorize.segments/oauth/authorize.segment.rsc +1 -1
  68. package/.next/standalone/.next/server/app/oauth/authorize.segments/oauth.segment.rsc +1 -1
  69. package/.next/standalone/.next/server/app/page.js +2 -2
  70. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/setup/page.js +3 -3
  72. package/.next/standalone/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  73. package/.next/standalone/.next/server/app/setup.html +2 -2
  74. package/.next/standalone/.next/server/app/setup.rsc +2 -2
  75. package/.next/standalone/.next/server/app/setup.segments/_full.segment.rsc +2 -2
  76. package/.next/standalone/.next/server/app/setup.segments/_head.segment.rsc +1 -1
  77. package/.next/standalone/.next/server/app/setup.segments/_index.segment.rsc +2 -2
  78. package/.next/standalone/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  79. package/.next/standalone/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +1 -1
  80. package/.next/standalone/.next/server/app/setup.segments/setup.segment.rsc +1 -1
  81. package/.next/standalone/.next/server/app-paths-manifest.json +6 -6
  82. package/.next/standalone/.next/server/chunks/142.js +4 -4
  83. package/.next/standalone/.next/server/chunks/471.js +2 -2
  84. package/.next/standalone/.next/server/chunks/817.js +2 -2
  85. package/.next/standalone/.next/server/pages/404.html +2 -2
  86. package/.next/standalone/.next/server/pages/500.html +2 -2
  87. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  88. package/.next/{static/chunks/app/mcps/[slug]/page-8e0aa560f0622f11.js → standalone/.next/static/chunks/app/mcps/[slug]/page-c5385aeb25f58d99.js} +1 -1
  89. package/.next/{static/css/caae8cf5ba26c4c9.css → standalone/.next/static/css/c1d55b213e741a4a.css} +1 -1
  90. package/.next/standalone/package.json +1 -1
  91. package/.next/{standalone/.next/static/chunks/app/mcps/[slug]/page-8e0aa560f0622f11.js → static/chunks/app/mcps/[slug]/page-c5385aeb25f58d99.js} +1 -1
  92. package/.next/{standalone/.next/static/css/caae8cf5ba26c4c9.css → static/css/c1d55b213e741a4a.css} +1 -1
  93. package/package.json +1 -1
  94. package/src/app/api/mcps/[slug]/deploy/route.ts +20 -4
  95. package/src/app/api/mcps/[slug]/route.ts +4 -5
  96. package/src/app/api/mcps/route.ts +4 -5
  97. package/src/app/mcps/[slug]/page.tsx +14 -4
  98. package/src/lib/operations.ts +10 -0
  99. package/src/lib/store.ts +6 -0
  100. /package/.next/standalone/.next/static/{8v7FMKRjROJQw8iEA3azx → 2tKq_bTNyVhd6HGPRRssw}/_buildManifest.js +0 -0
  101. /package/.next/standalone/.next/static/{8v7FMKRjROJQw8iEA3azx → 2tKq_bTNyVhd6HGPRRssw}/_ssgManifest.js +0 -0
  102. /package/.next/static/{8v7FMKRjROJQw8iEA3azx → 2tKq_bTNyVhd6HGPRRssw}/_buildManifest.js +0 -0
  103. /package/.next/static/{8v7FMKRjROJQw8iEA3azx → 2tKq_bTNyVhd6HGPRRssw}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[526],{3321:(e,t,s)=>{"use strict";var r=s(4645);s.o(r,"usePathname")&&s.d(t,{usePathname:function(){return r.usePathname}}),s.o(r,"useRouter")&&s.d(t,{useRouter:function(){return r.useRouter}}),s.o(r,"useSearchParams")&&s.d(t,{useSearchParams:function(){return r.useSearchParams}})},4959:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>m});var r=s(5155),a=s(2115),n=s(3321),l=s(5341);function o({open:e}){return e?(0,r.jsxs)("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:[(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"}),(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"})]}):(0,r.jsx)("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"})})}function d({className:e="w-3 h-3 inline-block ml-0.5"}){return(0,r.jsxs)("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",children:[(0,r.jsx)("path",{d:"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"}),(0,r.jsx)("polyline",{points:"15 3 21 3 21 9"}),(0,r.jsx)("line",{x1:"10",y1:"14",x2:"21",y2:"3"})]})}function i({slug:e,fields:t,configuredKeys:s,enabledPlatforms:n}){let l=t.filter(e=>!!e.required||!e.forPlatform||!n||n.includes(e.forPlatform)),[i,c]=(0,a.useState)({}),[u,x]=(0,a.useState)({}),[m,p]=(0,a.useState)({}),[h,f]=(0,a.useState)(!1),[g,y]=(0,a.useState)(null),[b,j]=(0,a.useState)(null),[v,k]=(0,a.useState)({}),[N,w]=(0,a.useState)(s),[C,S]=(0,a.useState)(null),T=(0,a.useRef)(new Set);async function $(t){if(confirm("Are you sure you want to clear this value? This will remove it from Cloudflare.")){y(t),S(null);try{let s=await fetch(`/api/mcps/${e}/secrets`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({deleteKeys:[t]})}),r=await s.json();s.ok?(S({type:"success",text:"Cleared successfully"}),w(N.filter(e=>e!==t)),p({...m,[t]:!1})):S({type:"error",text:r.error??"Failed to delete"})}catch{S({type:"error",text:"Failed to connect to server"})}finally{y(null)}}}async function U(e,s=!1){if(!e.test)return;let r=i[e.key];if(!r?.trim()){s||k({...v,[e.key]:{success:!1,message:"Enter a value first"}});return}j(e.key),k({...v,[e.key]:void 0});try{let s={};for(let e of t)i[e.key]?.trim()&&(s[e.key]=i[e.key]);let a=await fetch("/api/test-connection",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:e.test,value:r,allValues:s})}),n=await a.json();k({...v,[e.key]:{success:n.success,message:n.success?n.message??"Connection successful":n.error??"Test failed"}})}catch{k({...v,[e.key]:{success:!1,message:"Failed to test connection"}})}finally{j(null)}}let A=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;async function P(t){t.preventDefault(),f(!0),S(null);let s={};for(let[e,t]of Object.entries(i))t.trim()&&(s[e]=t.trim());if(0===Object.keys(s).length){S({type:"error",text:"No changes to save."}),f(!1);return}for(let e of l){let t=s[e.key];if("email"===e.type&&t&&!A.test(t)){S({type:"error",text:`${e.label}: enter a valid email address`}),f(!1);return}}try{let t=await fetch(`/api/mcps/${e}/secrets`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({secrets:s})}),r=await t.json();t.ok?(S({type:"success",text:"Saved successfully"}),c({}),p({}),w([...new Set([...N,...r.updatedKeys])])):S({type:"error",text:r.error??"Failed to update"})}catch{S({type:"error",text:"Failed to connect to server"})}finally{f(!1)}}return 0===l.length?null:(0,r.jsxs)("form",{onSubmit:P,className:"space-y-4",children:[l.map(t=>{let s=N.includes(t.key),a=m[t.key]||!s,n=!!t.test,l=!!i[t.key]?.trim();return(0,r.jsxs)("div",{children:[(0,r.jsxs)("label",{className:"flex items-center gap-2 text-sm font-medium text-fg-secondary mb-1.5",children:[t.label,t.required?(0,r.jsx)("span",{className:"text-accent-fg text-xs",children:"required"}):(0,r.jsx)("span",{className:"text-fg-faint text-xs",children:"optional"})]}),t.helpText&&(0,r.jsxs)("p",{className:"text-xs text-fg-faint mb-2",children:[t.helpText,t.helpUrl&&(0,r.jsxs)(r.Fragment,{children:[" ",(0,r.jsxs)("a",{href:t.helpUrl,target:"_blank",rel:"noopener noreferrer",className:"text-accent-fg hover:underline",children:["Get key ",(0,r.jsx)(d,{})]})]})]}),s&&!a?(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsx)("div",{className:"flex-1 px-4 py-2.5 bg-surface-raised/50 border border-success-mid/30 rounded-lg text-sm text-fg-muted font-mono",children:"••••••••••••"}),(0,r.jsx)("button",{type:"button",onClick:()=>{var e;return e=t.key,void p({...m,[e]:!0})},className:"px-4 py-2.5 bg-surface-overlay hover:bg-edge-subtle text-fg-secondary text-sm font-medium rounded-lg transition-colors whitespace-nowrap",children:"Change"}),(0,r.jsx)("button",{type:"button",onClick:()=>$(t.key),disabled:g===t.key,className:"px-4 py-2.5 bg-danger-mid/10 hover:bg-danger-mid/20 border border-danger-mid/30 text-danger text-sm font-medium rounded-lg transition-colors whitespace-nowrap disabled:opacity-50",children:g===t.key?"Clearing...":"Clear"})]}):(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsxs)("div",{className:"relative flex-1",children:[(0,r.jsx)("input",{type:"password"!==t.type||u[t.key]?"text":"password",id:`${e}-update-${t.key}`,name:`${e}-update-${t.key}`,autoComplete:"off","data-1p-ignore":!0,"data-lpignore":"true",value:i[t.key]??"",onChange:e=>{var s,r;let a;return s=t.key,r=e.target.value,a=i[s]??"",void((Math.abs(r.length-a.length)>5||!r)&&(T.current.delete(s),v[s]&&k({...v,[s]:void 0})),c({...i,[s]:r}))},onBlur:()=>{let e;return e=i[t.key],void(t.test&&e?.trim()&&!T.current.has(t.key)&&(T.current.add(t.key),U(t,!0)))},placeholder:t.placeholder,className:`w-full px-4 py-2.5 bg-surface-raised border border-edge-subtle rounded-lg text-sm text-fg placeholder-fg-faint focus:outline-none focus:border-accent-edge focus:ring-1 focus:ring-accent-edge${"password"===t.type?" pr-10":""}`}),"password"===t.type&&(0,r.jsx)("button",{type:"button",onClick:()=>x({...u,[t.key]:!u[t.key]}),className:"absolute right-3 top-1/2 -translate-y-1/2 text-fg-faint hover:text-fg-secondary transition-colors",children:(0,r.jsx)(o,{open:u[t.key]??!1})})]}),n&&l&&(0,r.jsx)("button",{type:"button",onClick:()=>U(t),disabled:b===t.key,className:"px-4 py-2.5 bg-surface-overlay hover:bg-edge-subtle disabled:bg-surface-raised disabled:text-fg-disabled text-fg-secondary text-sm font-medium rounded-lg transition-colors whitespace-nowrap",children:b===t.key?"Testing...":"Test"}),s&&a&&(0,r.jsx)("button",{type:"button",onClick:()=>{p({...m,[t.key]:!1}),c({...i,[t.key]:""}),k({...v,[t.key]:void 0})},className:"px-4 py-2.5 bg-surface-overlay hover:bg-edge-subtle text-fg-muted text-sm font-medium rounded-lg transition-colors whitespace-nowrap",children:"Cancel"})]}),v[t.key]&&(0,r.jsxs)("p",{className:`text-xs mt-2 ${v[t.key].success?"text-success":"text-danger"}`,children:[v[t.key].success?"✓":"✗"," ",v[t.key].message]})]},t.key)}),C&&(0,r.jsx)("p",{className:`text-sm rounded-lg px-4 py-2 ${"success"===C.type?"text-success bg-success-mid/10 border border-success-mid/20":"text-danger bg-danger-mid/10 border border-danger-mid/20"}`,children:C.text}),Object.values(i).some(e=>e?.trim())&&(0,r.jsx)("button",{type:"submit",disabled:h,className:"px-6 py-2.5 bg-accent hover:bg-accent-hover disabled:opacity-50 disabled:cursor-not-allowed text-white text-sm font-medium rounded-lg transition-colors",children:h?"Saving...":"Save Changes"})]})}function c({fields:e,values:t,onChange:s}){return 0===e.length?null:(0,r.jsx)("div",{className:"space-y-4",children:e.map(e=>(0,r.jsxs)("div",{children:[(0,r.jsx)("label",{className:"block text-sm font-medium text-fg-secondary mb-1.5",children:e.label}),e.helpText&&(0,r.jsx)("p",{className:"text-xs text-fg-faint mb-2",children:e.helpText}),"multiselect"===e.type&&e.options?(0,r.jsx)(u,{field:e,value:t[e.key]??e.default??"",onChange:r=>s({...t,[e.key]:r})}):"select"===e.type&&e.options?(0,r.jsx)("select",{value:t[e.key]??e.default??"",onChange:r=>s({...t,[e.key]:r.target.value}),className:"w-full px-4 py-2.5 bg-surface-raised border border-edge-subtle rounded-lg text-sm text-fg focus:outline-none focus:border-accent-edge focus:ring-1 focus:ring-accent-edge",children:e.options.map(e=>(0,r.jsx)("option",{value:e.value,children:e.label},e.value))}):(0,r.jsx)("input",{type:"text",value:t[e.key]??e.default??"",onChange:r=>s({...t,[e.key]:r.target.value}),className:"w-full px-4 py-2.5 bg-surface-raised border border-edge-subtle rounded-lg text-sm text-fg focus:outline-none focus:border-accent-edge focus:ring-1 focus:ring-accent-edge"})]},e.key))})}function u({field:e,value:t,onChange:s}){let[n,l]=(0,a.useState)(new Set(t.split(",").filter(Boolean)));return(0,r.jsx)("div",{className:"flex flex-wrap gap-2",children:e.options?.map(e=>(0,r.jsx)("button",{type:"button",onClick:()=>{var t;let r;return t=e.value,void((r=new Set(n)).has(t)?r.delete(t):r.add(t),l(r),s(Array.from(r).join(",")))},className:`px-3 py-1.5 rounded-lg text-sm border transition-colors ${n.has(e.value)?"bg-accent-edge/15 border-accent-edge/40 text-accent-fg":"bg-surface-raised border-edge-subtle text-fg-muted hover:border-fg-disabled"}`,children:e.label},e.value))})}function x({mcpUrl:e,mcpUrlWithToken:t,bearerToken:s,slug:n,authMode:l="bearer",oauthPassword:d}){let[i,c]=(0,a.useState)("ui"),[u,x]=(0,a.useState)(!1),[m,p]=(0,a.useState)(!1),[h,f]=(0,a.useState)(!1),g="bearer"===l?t:e,y=JSON.stringify("bearer"===l?{mcpServers:{[n]:{command:"npx",args:["mcp-remote",e,"--header","Authorization:${AUTH_HEADER}"],env:{AUTH_HEADER:`Bearer ${s??""}`}}}}:{mcpServers:{[n]:{command:"npx",args:["mcp-remote",e]}}},null,2);async function b(e){try{await navigator.clipboard.writeText(e)}catch{let t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}x(!0),setTimeout(()=>x(!1),2e3)}async function j(){if(d){try{await navigator.clipboard.writeText(d)}catch{let e=document.createElement("textarea");e.value=d,e.style.position="fixed",e.style.opacity="0",document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e)}f(!0),setTimeout(()=>f(!1),2e3)}}let v=d&&"oauth"===l&&(0,r.jsxs)("div",{className:"mt-3 pt-3 border-t border-edge-subtle/50",children:[(0,r.jsx)("p",{className:"text-xs text-fg-faint mb-2",children:"OAuth password"}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsxs)("div",{className:"relative flex-1",children:[(0,r.jsx)("div",{className:"w-full px-4 py-2.5 pr-10 bg-surface-raised border border-edge-subtle rounded-lg text-sm text-fg font-mono break-all",children:m?d:"•".repeat(24)}),(0,r.jsx)("button",{onClick:()=>p(!m),className:"absolute right-3 top-1/2 -translate-y-1/2 text-fg-faint hover:text-fg-secondary transition-colors",title:m?"Hide password":"Show password",children:(0,r.jsx)(o,{open:m})})]}),(0,r.jsx)("button",{onClick:j,className:"px-3 py-2.5 bg-surface-overlay hover:bg-edge-subtle rounded-lg text-xs text-fg-secondary transition-colors shrink-0",children:h?"Copied!":"Copy"})]})]});return(0,r.jsxs)("div",{className:"border border-edge rounded-xl overflow-hidden",children:[(0,r.jsx)("div",{className:"flex border-b border-edge",children:[{id:"ui",label:"Claude Desktop UI"},{id:"json",label:"JSON Config"}].map(e=>(0,r.jsx)("button",{onClick:()=>c(e.id),className:`px-4 py-2.5 text-xs font-medium transition-colors ${i===e.id?"bg-surface-raised text-accent-fg border-b-2 border-accent-fg":"text-fg-faint hover:text-fg-secondary"}`,children:e.label},e.id))}),(0,r.jsxs)("div",{className:"p-4",children:["ui"===i&&(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsxs)("p",{className:"text-sm text-fg-muted",children:["Go to"," ",(0,r.jsx)("strong",{children:"Settings → Connectors → Add custom connector"})," ","and paste this URL:"]}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("code",{className:"flex-1 px-3 py-2 bg-surface-raised border border-edge-subtle rounded-lg text-sm text-accent-fg break-all",children:g}),(0,r.jsx)("button",{onClick:()=>b(g),className:"px-3 py-2 bg-surface-overlay hover:bg-edge-subtle rounded-lg text-xs text-fg-secondary transition-colors shrink-0",children:u?"Copied!":"Copy"})]}),"bearer"===l&&(0,r.jsx)("p",{className:"text-xs text-fg-faint",children:"Your bearer token is embedded in the URL. Keep it private."}),"oauth"===l&&(0,r.jsxs)("p",{className:"text-xs text-fg-faint",children:["After adding the connector, click ",(0,r.jsx)("strong",{children:"Configure"})," when prompted. Enter the password below in the authorization dialog."]}),"open"===l&&(0,r.jsx)("p",{className:"text-xs text-danger",children:"This MCP is deployed without authentication. Anyone with the URL can access it."}),v]}),"json"===i&&(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsxs)("p",{className:"text-sm text-fg-muted",children:["Add to your"," ",(0,r.jsx)("code",{className:"text-accent-fg",children:"claude_desktop_config.json"}),":"]}),(0,r.jsxs)("div",{className:"relative",children:[(0,r.jsx)("pre",{className:"px-4 py-3 bg-surface-raised rounded-lg text-xs text-fg-secondary overflow-x-auto",children:y}),(0,r.jsx)("button",{onClick:()=>b(y),className:"absolute top-2 right-2 px-2 py-1 bg-surface-overlay hover:bg-edge-subtle rounded text-xs text-fg-muted transition-colors",children:u?"Copied!":"Copy"})]}),"bearer"===l&&(0,r.jsxs)("p",{className:"text-xs text-fg-faint",children:["Uses ",(0,r.jsx)("code",{children:"mcp-remote"})," with bearer token authentication."]}),"oauth"===l&&(0,r.jsx)("p",{className:"text-xs text-fg-faint",children:"On first connect, your browser will open for OAuth authorization. Enter the password below when prompted."}),"open"===l&&(0,r.jsx)("p",{className:"text-xs text-danger",children:"This MCP is open. No authentication headers are sent."}),v]})]})]})}function m({params:e}){let t,s,u,m,p,h,{slug:f}=(0,a.use)(e),g=(0,n.useRouter)(),[y,b]=(0,a.useState)(null),[j,v]=(0,a.useState)(!0),[k,N]=(0,a.useState)(!1),[w,C]=(0,a.useState)(null),[S,T]=(0,a.useState)(null),[$,U]=(0,a.useState)({}),[A,P]=(0,a.useState)({}),[O,M]=(0,a.useState)({}),[L,E]=(0,a.useState)({}),[R,_]=(0,a.useState)(null),[B,D]=(0,a.useState)({}),[F,W]=(0,a.useState)("bearer"),[H,q]=(0,a.useState)(!1),[J,z]=(0,a.useState)(!1),[K,V]=(0,a.useState)(!1),[I,G]=(0,a.useState)(null),[Y,Z]=(0,a.useState)(!1),[Q,X]=(0,a.useState)(!1),ee=(0,a.useRef)(new Set);async function et(e,t=!1){if(!e.test)return;let s=A[e.key];if(!s?.trim()){t||E({...L,[e.key]:{success:!1,message:"Enter a value first"}});return}E({...L,[e.key]:void 0});try{let t={};for(let e of y?.secrets??[])A[e.key]?.trim()&&(t[e.key]=A[e.key]);let r=await fetch("/api/test-connection",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:e.test,value:s,allValues:t})}),a=await r.json();E({...L,[e.key]:{success:a.success,message:a.success?a.message??"Connection successful":a.error??"Test failed"}})}catch{E({...L,[e.key]:{success:!1,message:"Failed to test connection"}})}}async function es(){if(ea||function(){let e={};for(let t of el){let s=A[t.key]?.trim()??"";t.required&&!s?e[t.key]=`${t.label} is required`:"email"===t.type&&s&&!eo.test(s)&&(e[t.key]="Enter a valid email address")}return D(e),0===Object.keys(e).length}()){if(H&&ea){let e="oauth"===F?"OAuth password":"bearer token";if(!confirm(`This will regenerate your ${e} and invalidate existing connections. Continue?`))return}N(!0),T(null),C(null),z(!1);try{let e=await fetch(`/api/mcps/${f}/deploy`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secrets:A,config:$,authMode:F,...H&&"bearer"===F?{regenerateToken:!0}:{},...H&&"oauth"===F?{regenerateOAuthPassword:!0}:{}})}),t=await e.json();if(e.ok){C(t),H&&z(!0);let e=await fetch(`/api/mcps/${f}`).then(e=>e.json());b(e),q(!1)}else T(t.error??"Deployment failed")}catch{T("Failed to connect to server")}finally{N(!1)}}}async function er(){V(!0),G(null);try{await fetch("/api/mcps/check-updates",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({slugs:[f]})});let e=await fetch(`/api/mcps/${f}`).then(e=>e.json());b(e),G(e.updateAvailable?"Update available!":"Already up to date"),setTimeout(()=>G(null),3e3)}catch{}finally{V(!1)}}if((0,a.useEffect)(()=>{fetch(`/api/mcps/${f}`).then(e=>e.json()).then(e=>{b(e),e.deployment?.authMode&&W(e.deployment.authMode);let t={};for(let s of e.config??[])t[s.key]=s.default??"";U(t)}).catch(()=>{}).finally(()=>v(!1))},[f]),(0,a.useEffect)(()=>{y?.deployment?.status==="deployed"&&fetch(`/api/mcps/${f}/status`).then(e=>e.json()).then(_).catch(()=>{})},[f,y?.deployment?.status]),j)return(0,r.jsx)("div",{className:"flex items-center justify-center py-20",children:(0,r.jsx)("div",{className:"text-fg-faint",children:"Loading..."})});if(!y)return(0,r.jsx)("div",{className:"text-center py-20",children:(0,r.jsx)("p",{className:"text-fg-faint",children:"MCP not found."})});let ea=y.deployment?.status==="deployed",en=new Set(($.ENABLED_PLATFORMS||"").split(",").filter(Boolean)),el=(y.secrets??[]).filter(e=>!!e.required||!e.forPlatform||en.has(e.forPlatform)),eo=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,ed=!ea&&el.some(e=>e.required&&!A[e.key]?.trim());return(0,r.jsxs)("div",{className:"space-y-8",children:[(0,r.jsx)("div",{className:"flex items-start justify-between",children:(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex items-center gap-3 mb-1",children:[(0,r.jsx)("h1",{className:"text-2xl font-bold",children:y.name}),(0,r.jsx)(l.W,{status:y.deployment?.status??"not_deployed"})]}),(0,r.jsx)("p",{className:"text-fg-muted text-sm",children:y.description}),(0,r.jsxs)("div",{className:"flex items-center gap-4 mt-2 text-xs text-fg-faint",children:[(0,r.jsxs)("span",{children:["v",y.version]}),(0,r.jsxs)("button",{onClick:er,disabled:K,className:"inline-flex items-center gap-1.5 px-3 py-1 bg-surface-raised hover:bg-surface-overlay border border-edge-subtle rounded-lg text-xs text-fg-secondary transition-colors disabled:opacity-50",children:[(0,r.jsx)("svg",{className:`w-3 h-3 ${K?"animate-spin":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})}),K?"Checking...":"Check for updates"]}),I&&(0,r.jsx)("span",{className:`inline-flex items-center px-2 py-0.5 rounded text-xs font-medium ${"Update available!"===I?"bg-success-mid/10 text-success":"bg-surface-overlay/50 text-fg-muted"}`,children:I}),y.githubRepo&&(0,r.jsxs)("a",{href:`https://github.com/${y.githubRepo}`,target:"_blank",rel:"noopener noreferrer",className:"text-accent-fg hover:underline",children:["Source ",(0,r.jsx)(d,{})]})]})]})}),ea&&R&&(0,r.jsx)("div",{className:`border rounded-xl p-4 ${R.healthy?"border-success-mid/30 bg-success-mid/5":"border-danger-mid/30 bg-danger-mid/5"}`,children:(0,r.jsxs)("div",{className:"flex items-center gap-2 text-sm",children:[(0,r.jsx)("span",{className:`w-2 h-2 rounded-full ${R.healthy?"bg-success":"bg-danger"}`}),(0,r.jsx)("span",{className:R.healthy?"text-success":"text-danger",children:R.healthy?"Healthy":"Unhealthy"}),y.deployment?.workerUrl&&(0,r.jsx)("span",{className:"text-fg-faint ml-2",children:y.deployment.workerUrl})]})}),y.updateAvailable&&y.deployedVersion&&y.latestVersion&&(0,r.jsx)("div",{className:"border border-info-mid/30 bg-info-mid/5 rounded-xl p-4",children:(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("div",{className:"flex items-center gap-3",children:[(0,r.jsx)("div",{className:"w-8 h-8 rounded-full bg-info-mid/20 flex items-center justify-center",children:(0,r.jsx)("svg",{className:"w-4 h-4 text-info",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"text-sm font-medium text-info",children:"Update Available"}),(0,r.jsxs)("p",{className:"text-xs text-fg-muted",children:[y.deployedVersion," → ",y.latestVersion]})]})]}),(0,r.jsx)("button",{onClick:es,disabled:k,className:"px-4 py-2 bg-info-mid/20 hover:bg-info-mid/30 border border-info-mid/30 text-info text-sm font-medium rounded-lg transition-colors",children:k?"Updating...":"Update Now"})]})}),y.deployment?.status==="failed"&&y.deployment.error&&(0,r.jsx)("div",{className:"border border-danger-mid/30 bg-danger-mid/5 rounded-xl p-4",children:(0,r.jsxs)("p",{className:"text-sm text-danger",children:["Last deployment failed: ",y.deployment.error]})}),(y.config??[]).length>0&&(0,r.jsxs)("div",{className:"border border-edge rounded-xl p-6 bg-surface/80",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold mb-4",children:"Configuration"}),(0,r.jsx)(c,{fields:y.config,values:$,onChange:U})]}),!ea&&el.length>0&&(0,r.jsxs)("div",{className:"border border-edge rounded-xl p-6 bg-surface/80",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold mb-4",children:"API Keys"}),(0,r.jsx)("div",{className:"space-y-4",children:el.map(e=>(0,r.jsxs)("div",{children:[(0,r.jsxs)("label",{className:"flex items-center gap-2 text-sm font-medium text-fg-secondary mb-1.5",children:[e.label,e.required?(0,r.jsx)("span",{className:"text-accent-fg text-xs",children:"required"}):(0,r.jsx)("span",{className:"text-fg-faint text-xs",children:"optional"})]}),e.helpText&&(0,r.jsxs)("p",{className:"text-xs text-fg-faint mb-2",children:[e.helpText,e.helpUrl&&(0,r.jsxs)(r.Fragment,{children:[" ",(0,r.jsxs)("a",{href:e.helpUrl,target:"_blank",rel:"noopener noreferrer",className:"text-accent-fg hover:underline",children:["Get key ",(0,r.jsx)(d,{})]})]})]}),(0,r.jsx)("div",{className:"flex gap-2",children:(0,r.jsxs)("div",{className:"relative flex-1",children:[(0,r.jsx)("input",{type:"password"!==e.type||O[e.key]?"text":"password",id:`${f}-${e.key}`,name:`${f}-${e.key}`,autoComplete:"off","data-1p-ignore":!0,"data-lpignore":"true",value:A[e.key]??"",onChange:t=>{var s,r;let a;return s=e.key,r=t.target.value,a=A[s]??"",void((Math.abs(r.length-a.length)>5||!r)&&(ee.current.delete(s),L[s]&&E({...L,[s]:void 0})),B[s]&&D(e=>{let t={...e};return delete t[s],t}),P({...A,[s]:r}))},onBlur:()=>{let t;return t=A[e.key],void(e.test&&t?.trim()&&!ee.current.has(e.key)&&function(e){if(!e.test||!A[e.key]?.trim())return!1;for(let t of[...e.test.url.match(/\{\{([^}]+)\}\}/g)?.map(e=>e.slice(2,-2))??[],...Object.values(e.test.headers??{}).join("").match(/\{\{([^}]+)\}\}/g)?.map(e=>e.slice(2,-2))??[]].filter(e=>"value"!==e))if(!A[t]?.trim())return!1;return!0}(e)&&(ee.current.add(e.key),et(e,!0)))},placeholder:e.placeholder,className:`w-full px-4 py-2.5 pr-10 bg-surface-raised border rounded-lg text-sm text-fg placeholder-fg-faint focus:outline-none focus:ring-1 ${B[e.key]?"border-danger-mid focus:border-danger-mid focus:ring-danger-mid":"border-edge-subtle focus:border-accent-edge focus:ring-accent-edge"}`}),"password"===e.type&&(0,r.jsx)("button",{type:"button",onClick:()=>M({...O,[e.key]:!O[e.key]}),className:"absolute right-3 top-1/2 -translate-y-1/2 text-fg-faint hover:text-fg-secondary transition-colors",children:(0,r.jsx)(o,{open:O[e.key]??!1})})]})}),L[e.key]&&(0,r.jsxs)("p",{className:`text-xs mt-2 ${L[e.key].success?"text-success":"text-danger"}`,children:[L[e.key].success?"✓":"✗"," ",L[e.key].message]}),B[e.key]&&(0,r.jsx)("p",{className:"text-xs mt-1.5 text-danger",children:B[e.key]})]},e.key))})]}),ea&&(y.secrets??[]).length>0&&(0,r.jsxs)("div",{className:"border border-edge rounded-xl p-6 bg-surface/80",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold mb-4",children:"Update Secrets"}),(0,r.jsx)("p",{className:"text-sm text-fg-muted mb-4",children:"Update API keys without redeploying. Leave fields blank to keep existing values."}),(0,r.jsx)(i,{slug:f,fields:y.secrets,configuredKeys:y.configuredSecrets,enabledPlatforms:Array.from(en)})]}),(0,r.jsxs)("div",{className:"border border-edge rounded-xl p-6 bg-surface/80",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold",children:ea?"Redeploy":"Deploy"}),(0,r.jsx)("p",{className:"text-sm text-fg-muted mt-1",children:ea?"Redeploy with the latest bundle and configuration.":"Deploy this MCP server to your Cloudflare Workers account."}),(0,r.jsxs)("div",{className:"mt-5",children:[(0,r.jsx)("label",{className:"block text-sm font-medium text-fg-secondary mb-2",children:"Authentication"}),(0,r.jsxs)("div",{className:"relative",children:[(0,r.jsxs)("select",{value:F,onChange:e=>W(e.target.value),className:"w-full appearance-none px-4 py-2.5 pr-10 bg-surface-raised border border-edge-subtle rounded-lg text-sm text-fg focus:outline-none focus:border-accent-edge focus:ring-1 focus:ring-accent-edge",children:[(0,r.jsx)("option",{value:"bearer",children:"Bearer token (default)"}),(0,r.jsx)("option",{value:"oauth",children:"OAuth 2.1 (password protected)"}),(0,r.jsx)("option",{value:"open",children:"Open (no authentication)"})]}),(0,r.jsx)("svg",{className:"pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-fg-muted",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]}),"oauth"===F&&(0,r.jsx)("p",{className:"text-xs text-fg-faint mt-2",children:"OAuth requires a password prompt during authorization. Bearer tokens are not accepted."}),"open"===F&&(0,r.jsx)("p",{className:"text-xs text-danger mt-2",children:"Warning: Anyone with the URL can access this MCP."})]}),ea&&"open"!==F&&(0,r.jsx)("div",{className:"mt-4 pt-4 border-t border-edge",children:(0,r.jsxs)("label",{className:"flex items-center gap-3 cursor-pointer group",children:[(0,r.jsxs)("div",{className:"relative",children:[(0,r.jsx)("input",{type:"checkbox",checked:H,onChange:e=>q(e.target.checked),className:"sr-only peer"}),(0,r.jsx)("div",{className:"w-9 h-5 bg-surface-overlay rounded-full peer-checked:bg-warning transition-colors"}),(0,r.jsx)("div",{className:"absolute top-0.5 left-0.5 w-4 h-4 bg-surface-page shadow-sm rounded-full peer-checked:translate-x-4 transition-transform"})]}),(0,r.jsxs)("div",{children:[(0,r.jsxs)("p",{className:"text-sm font-medium text-fg-secondary group-hover:text-fg transition-colors",children:["Regenerate ","oauth"===F?"OAuth password":"bearer token"]}),(0,r.jsx)("p",{className:"text-xs text-fg-faint",children:"Invalidates existing connections. Use if compromised."})]})]})}),(0,r.jsx)("div",{className:"mt-5 flex items-center justify-end gap-3",children:(0,r.jsx)("button",{onClick:es,disabled:k||ed,className:`px-6 py-2.5 text-white text-sm font-medium rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed ${H&&ea?"bg-warning hover:bg-warning-hover":"bg-accent hover:bg-accent-hover"}`,children:k?"Deploying...":H&&ea?"Regenerate & redeploy":ea?"Redeploy":"Deploy to Cloudflare"})}),S&&(0,r.jsx)("p",{className:"mt-4 text-sm text-danger bg-danger-mid/10 border border-danger-mid/20 rounded-lg px-4 py-2",children:S})]}),w&&(0,r.jsx)("div",{className:"border border-success-mid/30 bg-success-mid/5 rounded-xl p-4",children:(0,r.jsx)("p",{className:"text-sm text-success",children:J&&"oauth"===w.authMode?"OAuth password regenerated. Update your client connections.":J?"Bearer token regenerated. Update your client connections.":`Successfully deployed to ${w.workerUrl}`})}),(t=w?.oauthPassword??y.credentials?.oauthPassword,s=w?.bearerToken??y.credentials?.bearerToken??null,u=w?.authMode??y.deployment?.authMode??"bearer",m=w?.workerUrl??y.deployment?.workerUrl,p=w?.mcpUrl??(m?`${m}/mcp`:null),h=w?.mcpUrlWithToken??(s&&m?`${m}/mcp/t/${s}`:p),ea||w?(0,r.jsx)("div",{className:"space-y-4",children:p&&(0,r.jsxs)("div",{className:"border border-edge rounded-xl p-6 bg-surface/80",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold mb-3",children:"Connect to Claude"}),(0,r.jsx)(x,{mcpUrl:p,mcpUrlWithToken:h??p,bearerToken:s,slug:f,authMode:u,oauthPassword:t})]})}):null),(0,r.jsxs)("div",{className:"border border-danger-mid/20 rounded-xl p-6 bg-danger-mid/5",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold text-danger mb-4",children:"Danger Zone"}),(0,r.jsxs)("div",{className:"space-y-4",children:[ea&&(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"text-sm text-fg-secondary",children:"Undeploy"}),(0,r.jsx)("p",{className:"text-xs text-fg-faint mt-1",children:"Take the worker offline. You can redeploy later."})]}),(0,r.jsx)("button",{onClick:async()=>{if(confirm("This will delete the deployed worker. You can redeploy later. Continue?")){X(!0);try{let e=await fetch(`/api/mcps/${f}/undeploy`,{method:"DELETE"});if(e.ok){let e=await fetch(`/api/mcps/${f}`).then(e=>e.json());b(e),_(null),C(null)}else{let t=await e.json();alert(t.error??"Failed to undeploy")}}catch{alert("Failed to connect to server")}finally{X(!1)}}},disabled:Q,className:"px-4 py-2 bg-danger-dark/50 hover:bg-danger-dark/70 border border-danger-strong/50 rounded-lg text-sm text-danger transition-colors shrink-0 disabled:opacity-50",children:Q?"Undeploying...":"Undeploy"})]}),ea&&(0,r.jsx)("div",{className:"border-t border-danger-mid/10"}),(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"text-sm text-fg-secondary",children:"Remove"}),(0,r.jsx)("p",{className:"text-xs text-fg-faint mt-1",children:"Undeploy the worker and permanently remove this MCP from the dashboard."})]}),(0,r.jsx)("button",{onClick:async()=>{if(confirm("This will permanently remove this MCP from the dashboard. Continue?")){Z(!0);try{let e=await fetch(`/api/mcps/${f}/remove`,{method:"DELETE"});if(e.ok)g.push("/");else{let t=await e.json();alert(t.error??"Failed to remove MCP")}}catch{alert("Failed to connect to server")}finally{Z(!1)}}},disabled:Y,className:"px-4 py-2 bg-danger-dark/50 hover:bg-danger-dark/70 border border-danger-strong/50 rounded-lg text-sm text-danger transition-colors shrink-0 disabled:opacity-50",children:Y?"Removing...":"Remove"})]})]})]})]})}},5087:(e,t,s)=>{Promise.resolve().then(s.bind(s,4959))},5341:(e,t,s)=>{"use strict";s.d(t,{W:()=>a});var r=s(5155);function a({status:e}){let t={deployed:"bg-success-mid/15 text-success border-success-mid/30",failed:"bg-danger-mid/15 text-danger border-danger-mid/30",not_deployed:"bg-fg-faint/15 text-fg-muted border-fg-faint/30"},s="deployed"===e?(0,r.jsxs)("span",{className:"relative flex h-1.5 w-1.5",children:[(0,r.jsx)("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-success opacity-30"}),(0,r.jsx)("span",{className:"relative inline-flex rounded-full h-1.5 w-1.5 bg-success"})]}):(0,r.jsx)("span",{className:`w-1.5 h-1.5 rounded-full ${"failed"===e?"bg-danger":"bg-fg-muted"}`});return(0,r.jsxs)("span",{className:`inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium border ${t[e]??t.not_deployed}`,children:[s,{deployed:"Deployed",failed:"Failed",not_deployed:"Not Deployed"}[e]??"Unknown"]})}}},e=>{e.O(0,[441,794,358],()=>e(e.s=5087)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[526],{3321:(e,t,s)=>{"use strict";var r=s(4645);s.o(r,"usePathname")&&s.d(t,{usePathname:function(){return r.usePathname}}),s.o(r,"useRouter")&&s.d(t,{useRouter:function(){return r.useRouter}}),s.o(r,"useSearchParams")&&s.d(t,{useSearchParams:function(){return r.useSearchParams}})},4959:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>m});var r=s(5155),a=s(2115),n=s(3321),l=s(5341);function o({open:e}){return e?(0,r.jsxs)("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:[(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M15 12a3 3 0 11-6 0 3 3 0 016 0z"}),(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z"})]}):(0,r.jsx)("svg",{className:"w-4 h-4",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"})})}function d({className:e="w-3 h-3 inline-block ml-0.5"}){return(0,r.jsxs)("svg",{className:e,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round",children:[(0,r.jsx)("path",{d:"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"}),(0,r.jsx)("polyline",{points:"15 3 21 3 21 9"}),(0,r.jsx)("line",{x1:"10",y1:"14",x2:"21",y2:"3"})]})}function i({slug:e,fields:t,configuredKeys:s,enabledPlatforms:n}){let l=t.filter(e=>!!e.required||!e.forPlatform||!n||n.includes(e.forPlatform)),[i,c]=(0,a.useState)({}),[u,x]=(0,a.useState)({}),[m,p]=(0,a.useState)({}),[h,f]=(0,a.useState)(!1),[g,y]=(0,a.useState)(null),[b,j]=(0,a.useState)(null),[v,k]=(0,a.useState)({}),[N,w]=(0,a.useState)(s),[C,S]=(0,a.useState)(null),T=(0,a.useRef)(new Set);async function $(t){if(confirm("Are you sure you want to clear this value? This will remove it from Cloudflare.")){y(t),S(null);try{let s=await fetch(`/api/mcps/${e}/secrets`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({deleteKeys:[t]})}),r=await s.json();s.ok?(S({type:"success",text:"Cleared successfully"}),w(N.filter(e=>e!==t)),p({...m,[t]:!1})):S({type:"error",text:r.error??"Failed to delete"})}catch{S({type:"error",text:"Failed to connect to server"})}finally{y(null)}}}async function U(e,s=!1){if(!e.test)return;let r=i[e.key];if(!r?.trim()){s||k({...v,[e.key]:{success:!1,message:"Enter a value first"}});return}j(e.key),k({...v,[e.key]:void 0});try{let s={};for(let e of t)i[e.key]?.trim()&&(s[e.key]=i[e.key]);let a=await fetch("/api/test-connection",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:e.test,value:r,allValues:s})}),n=await a.json();k({...v,[e.key]:{success:n.success,message:n.success?n.message??"Connection successful":n.error??"Test failed"}})}catch{k({...v,[e.key]:{success:!1,message:"Failed to test connection"}})}finally{j(null)}}let A=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;async function P(t){t.preventDefault(),f(!0),S(null);let s={};for(let[e,t]of Object.entries(i))t.trim()&&(s[e]=t.trim());if(0===Object.keys(s).length){S({type:"error",text:"No changes to save."}),f(!1);return}for(let e of l){let t=s[e.key];if("email"===e.type&&t&&!A.test(t)){S({type:"error",text:`${e.label}: enter a valid email address`}),f(!1);return}}try{let t=await fetch(`/api/mcps/${e}/secrets`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({secrets:s})}),r=await t.json();t.ok?(S({type:"success",text:"Saved successfully"}),c({}),p({}),w([...new Set([...N,...r.updatedKeys])])):S({type:"error",text:r.error??"Failed to update"})}catch{S({type:"error",text:"Failed to connect to server"})}finally{f(!1)}}return 0===l.length?null:(0,r.jsxs)("form",{onSubmit:P,className:"space-y-4",children:[l.map(t=>{let s=N.includes(t.key),a=m[t.key]||!s,n=!!t.test,l=!!i[t.key]?.trim();return(0,r.jsxs)("div",{children:[(0,r.jsxs)("label",{className:"flex items-center gap-2 text-sm font-medium text-fg-secondary mb-1.5",children:[t.label,t.required?(0,r.jsx)("span",{className:"text-accent-fg text-xs",children:"required"}):(0,r.jsx)("span",{className:"text-fg-faint text-xs",children:"optional"})]}),t.helpText&&(0,r.jsxs)("p",{className:"text-xs text-fg-faint mb-2",children:[t.helpText,t.helpUrl&&(0,r.jsxs)(r.Fragment,{children:[" ",(0,r.jsxs)("a",{href:t.helpUrl,target:"_blank",rel:"noopener noreferrer",className:"text-accent-fg hover:underline",children:["Get key ",(0,r.jsx)(d,{})]})]})]}),s&&!a?(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsx)("div",{className:"flex-1 px-4 py-2.5 bg-surface-raised/50 border border-success-mid/30 rounded-lg text-sm text-fg-muted font-mono",children:"••••••••••••"}),(0,r.jsx)("button",{type:"button",onClick:()=>{var e;return e=t.key,void p({...m,[e]:!0})},className:"px-4 py-2.5 bg-surface-overlay hover:bg-edge-subtle text-fg-secondary text-sm font-medium rounded-lg transition-colors whitespace-nowrap",children:"Change"}),(0,r.jsx)("button",{type:"button",onClick:()=>$(t.key),disabled:g===t.key,className:"px-4 py-2.5 bg-danger-mid/10 hover:bg-danger-mid/20 border border-danger-mid/30 text-danger text-sm font-medium rounded-lg transition-colors whitespace-nowrap disabled:opacity-50",children:g===t.key?"Clearing...":"Clear"})]}):(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsxs)("div",{className:"relative flex-1",children:[(0,r.jsx)("input",{type:"password"!==t.type||u[t.key]?"text":"password",id:`${e}-update-${t.key}`,name:`${e}-update-${t.key}`,autoComplete:"off","data-1p-ignore":!0,"data-lpignore":"true",value:i[t.key]??"",onChange:e=>{var s,r;let a;return s=t.key,r=e.target.value,a=i[s]??"",void((Math.abs(r.length-a.length)>5||!r)&&(T.current.delete(s),v[s]&&k({...v,[s]:void 0})),c({...i,[s]:r}))},onBlur:()=>{let e;return e=i[t.key],void(t.test&&e?.trim()&&!T.current.has(t.key)&&(T.current.add(t.key),U(t,!0)))},placeholder:t.placeholder,className:`w-full px-4 py-2.5 bg-surface-raised border border-edge-subtle rounded-lg text-sm text-fg placeholder-fg-faint focus:outline-none focus:border-accent-edge focus:ring-1 focus:ring-accent-edge${"password"===t.type?" pr-10":""}`}),"password"===t.type&&(0,r.jsx)("button",{type:"button",onClick:()=>x({...u,[t.key]:!u[t.key]}),className:"absolute right-3 top-1/2 -translate-y-1/2 text-fg-faint hover:text-fg-secondary transition-colors",children:(0,r.jsx)(o,{open:u[t.key]??!1})})]}),n&&l&&(0,r.jsx)("button",{type:"button",onClick:()=>U(t),disabled:b===t.key,className:"px-4 py-2.5 bg-surface-overlay hover:bg-edge-subtle disabled:bg-surface-raised disabled:text-fg-disabled text-fg-secondary text-sm font-medium rounded-lg transition-colors whitespace-nowrap",children:b===t.key?"Testing...":"Test"}),s&&a&&(0,r.jsx)("button",{type:"button",onClick:()=>{p({...m,[t.key]:!1}),c({...i,[t.key]:""}),k({...v,[t.key]:void 0})},className:"px-4 py-2.5 bg-surface-overlay hover:bg-edge-subtle text-fg-muted text-sm font-medium rounded-lg transition-colors whitespace-nowrap",children:"Cancel"})]}),v[t.key]&&(0,r.jsxs)("p",{className:`text-xs mt-2 ${v[t.key].success?"text-success":"text-danger"}`,children:[v[t.key].success?"✓":"✗"," ",v[t.key].message]})]},t.key)}),C&&(0,r.jsx)("p",{className:`text-sm rounded-lg px-4 py-2 ${"success"===C.type?"text-success bg-success-mid/10 border border-success-mid/20":"text-danger bg-danger-mid/10 border border-danger-mid/20"}`,children:C.text}),Object.values(i).some(e=>e?.trim())&&(0,r.jsx)("button",{type:"submit",disabled:h,className:"px-6 py-2.5 bg-accent hover:bg-accent-hover disabled:opacity-50 disabled:cursor-not-allowed text-white text-sm font-medium rounded-lg transition-colors",children:h?"Saving...":"Save Changes"})]})}function c({fields:e,values:t,onChange:s}){return 0===e.length?null:(0,r.jsx)("div",{className:"space-y-4",children:e.map(e=>(0,r.jsxs)("div",{children:[(0,r.jsx)("label",{className:"block text-sm font-medium text-fg-secondary mb-1.5",children:e.label}),e.helpText&&(0,r.jsx)("p",{className:"text-xs text-fg-faint mb-2",children:e.helpText}),"multiselect"===e.type&&e.options?(0,r.jsx)(u,{field:e,value:t[e.key]??e.default??"",onChange:r=>s({...t,[e.key]:r})}):"select"===e.type&&e.options?(0,r.jsx)("select",{value:t[e.key]??e.default??"",onChange:r=>s({...t,[e.key]:r.target.value}),className:"w-full px-4 py-2.5 bg-surface-raised border border-edge-subtle rounded-lg text-sm text-fg focus:outline-none focus:border-accent-edge focus:ring-1 focus:ring-accent-edge",children:e.options.map(e=>(0,r.jsx)("option",{value:e.value,children:e.label},e.value))}):(0,r.jsx)("input",{type:"text",value:t[e.key]??e.default??"",onChange:r=>s({...t,[e.key]:r.target.value}),className:"w-full px-4 py-2.5 bg-surface-raised border border-edge-subtle rounded-lg text-sm text-fg focus:outline-none focus:border-accent-edge focus:ring-1 focus:ring-accent-edge"})]},e.key))})}function u({field:e,value:t,onChange:s}){let[n,l]=(0,a.useState)(new Set(t.split(",").filter(Boolean)));return(0,r.jsx)("div",{className:"flex flex-wrap gap-2",children:e.options?.map(e=>(0,r.jsx)("button",{type:"button",onClick:()=>{var t;let r;return t=e.value,void((r=new Set(n)).has(t)?r.delete(t):r.add(t),l(r),s(Array.from(r).join(",")))},className:`px-3 py-1.5 rounded-lg text-sm border transition-colors ${n.has(e.value)?"bg-accent-edge/15 border-accent-edge/40 text-accent-fg":"bg-surface-raised border-edge-subtle text-fg-muted hover:border-fg-disabled"}`,children:e.label},e.value))})}function x({mcpUrl:e,mcpUrlWithToken:t,bearerToken:s,slug:n,authMode:l="bearer",oauthPassword:d}){let[i,c]=(0,a.useState)("ui"),[u,x]=(0,a.useState)(!1),[m,p]=(0,a.useState)(!1),[h,f]=(0,a.useState)(!1),g="bearer"===l?t:e,y=JSON.stringify("bearer"===l?{mcpServers:{[n]:{command:"npx",args:["mcp-remote",e,"--header","Authorization:${AUTH_HEADER}"],env:{AUTH_HEADER:`Bearer ${s??""}`}}}}:{mcpServers:{[n]:{command:"npx",args:["mcp-remote",e]}}},null,2);async function b(e){try{await navigator.clipboard.writeText(e)}catch{let t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}x(!0),setTimeout(()=>x(!1),2e3)}async function j(){if(d){try{await navigator.clipboard.writeText(d)}catch{let e=document.createElement("textarea");e.value=d,e.style.position="fixed",e.style.opacity="0",document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e)}f(!0),setTimeout(()=>f(!1),2e3)}}let v=d&&"oauth"===l&&(0,r.jsxs)("div",{className:"mt-3 pt-3 border-t border-edge-subtle/50",children:[(0,r.jsx)("p",{className:"text-xs text-fg-faint mb-2",children:"OAuth password"}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsxs)("div",{className:"relative flex-1",children:[(0,r.jsx)("div",{className:"w-full px-4 py-2.5 pr-10 bg-surface-raised border border-edge-subtle rounded-lg text-sm text-fg font-mono break-all",children:m?d:"•".repeat(24)}),(0,r.jsx)("button",{onClick:()=>p(!m),className:"absolute right-3 top-1/2 -translate-y-1/2 text-fg-faint hover:text-fg-secondary transition-colors",title:m?"Hide password":"Show password",children:(0,r.jsx)(o,{open:m})})]}),(0,r.jsx)("button",{onClick:j,className:"px-3 py-2.5 bg-surface-overlay hover:bg-edge-subtle rounded-lg text-xs text-fg-secondary transition-colors shrink-0",children:h?"Copied!":"Copy"})]})]});return(0,r.jsxs)("div",{className:"border border-edge rounded-xl overflow-hidden",children:[(0,r.jsx)("div",{className:"flex border-b border-edge",children:[{id:"ui",label:"Claude Desktop UI"},{id:"json",label:"JSON Config"}].map(e=>(0,r.jsx)("button",{onClick:()=>c(e.id),className:`px-4 py-2.5 text-xs font-medium transition-colors ${i===e.id?"bg-surface-raised text-accent-fg border-b-2 border-accent-fg":"text-fg-faint hover:text-fg-secondary"}`,children:e.label},e.id))}),(0,r.jsxs)("div",{className:"p-4",children:["ui"===i&&(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsxs)("p",{className:"text-sm text-fg-muted",children:["Go to"," ",(0,r.jsx)("strong",{children:"Settings → Connectors → Add custom connector"})," ","and paste this URL:"]}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("code",{className:"flex-1 px-3 py-2 bg-surface-raised border border-edge-subtle rounded-lg text-sm text-accent-fg break-all",children:g}),(0,r.jsx)("button",{onClick:()=>b(g),className:"px-3 py-2 bg-surface-overlay hover:bg-edge-subtle rounded-lg text-xs text-fg-secondary transition-colors shrink-0",children:u?"Copied!":"Copy"})]}),"bearer"===l&&(0,r.jsx)("p",{className:"text-xs text-fg-faint",children:"Your bearer token is embedded in the URL. Keep it private."}),"oauth"===l&&(0,r.jsxs)("p",{className:"text-xs text-fg-faint",children:["After adding the connector, click ",(0,r.jsx)("strong",{children:"Configure"})," when prompted. Enter the password below in the authorization dialog."]}),"open"===l&&(0,r.jsx)("p",{className:"text-xs text-danger",children:"This MCP is deployed without authentication. Anyone with the URL can access it."}),v]}),"json"===i&&(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsxs)("p",{className:"text-sm text-fg-muted",children:["Add to your"," ",(0,r.jsx)("code",{className:"text-accent-fg",children:"claude_desktop_config.json"}),":"]}),(0,r.jsxs)("div",{className:"relative",children:[(0,r.jsx)("pre",{className:"px-4 py-3 bg-surface-raised rounded-lg text-xs text-fg-secondary overflow-x-auto",children:y}),(0,r.jsx)("button",{onClick:()=>b(y),className:"absolute top-2 right-2 px-2 py-1 bg-surface-overlay hover:bg-edge-subtle rounded text-xs text-fg-muted transition-colors",children:u?"Copied!":"Copy"})]}),"bearer"===l&&(0,r.jsxs)("p",{className:"text-xs text-fg-faint",children:["Uses ",(0,r.jsx)("code",{children:"mcp-remote"})," with bearer token authentication."]}),"oauth"===l&&(0,r.jsx)("p",{className:"text-xs text-fg-faint",children:"On first connect, your browser will open for OAuth authorization. Enter the password below when prompted."}),"open"===l&&(0,r.jsx)("p",{className:"text-xs text-danger",children:"This MCP is open. No authentication headers are sent."}),v]})]})]})}function m({params:e}){let t,s,u,m,p,h,{slug:f}=(0,a.use)(e),g=(0,n.useRouter)(),[y,b]=(0,a.useState)(null),[j,v]=(0,a.useState)(!0),[k,N]=(0,a.useState)(!1),[w,C]=(0,a.useState)(null),[S,T]=(0,a.useState)(null),[$,U]=(0,a.useState)({}),[A,P]=(0,a.useState)({}),[O,M]=(0,a.useState)({}),[L,E]=(0,a.useState)({}),[R,_]=(0,a.useState)(null),[B,D]=(0,a.useState)({}),[F,W]=(0,a.useState)("bearer"),[H,q]=(0,a.useState)(!1),[J,z]=(0,a.useState)(!1),[K,V]=(0,a.useState)(!1),[I,G]=(0,a.useState)(null),[Y,Z]=(0,a.useState)(!1),[Q,X]=(0,a.useState)(!1),ee=(0,a.useRef)(new Set);async function et(e,t=!1){if(!e.test)return;let s=A[e.key];if(!s?.trim()){t||E({...L,[e.key]:{success:!1,message:"Enter a value first"}});return}E({...L,[e.key]:void 0});try{let t={};for(let e of y?.secrets??[])A[e.key]?.trim()&&(t[e.key]=A[e.key]);let r=await fetch("/api/test-connection",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({spec:e.test,value:s,allValues:t})}),a=await r.json();E({...L,[e.key]:{success:a.success,message:a.success?a.message??"Connection successful":a.error??"Test failed"}})}catch{E({...L,[e.key]:{success:!1,message:"Failed to test connection"}})}}async function es(){if(ea||function(){let e={};for(let t of el){let s=A[t.key]?.trim()??"";t.required&&!s?e[t.key]=`${t.label} is required`:"email"===t.type&&s&&!eo.test(s)&&(e[t.key]="Enter a valid email address")}return D(e),0===Object.keys(e).length}()){if(H&&ea){let e="oauth"===F?"OAuth password":"bearer token";if(!confirm(`This will regenerate your ${e} and invalidate existing connections. Continue?`))return}N(!0),T(null),C(null),z(!1);try{let e=await fetch(`/api/mcps/${f}/deploy`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({secrets:A,config:Object.fromEntries(Object.entries($).filter(([,e])=>""!==e)),authMode:F,...H&&"bearer"===F?{regenerateToken:!0}:{},...H&&"oauth"===F?{regenerateOAuthPassword:!0}:{}})}),t=await e.json();if(e.ok){C(t),H&&z(!0);let e=await fetch(`/api/mcps/${f}`).then(e=>e.json());b(e),q(!1)}else T(t.error??"Deployment failed")}catch{T("Failed to connect to server")}finally{N(!1)}}}async function er(){V(!0),G(null);try{await fetch("/api/mcps/check-updates",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({slugs:[f]})});let e=await fetch(`/api/mcps/${f}`).then(e=>e.json());b(e),G(e.updateAvailable?"Update available!":"Already up to date"),setTimeout(()=>G(null),3e3)}catch{}finally{V(!1)}}if((0,a.useEffect)(()=>{fetch(`/api/mcps/${f}`).then(e=>e.json()).then(e=>{b(e),e.deployment?.authMode&&W(e.deployment.authMode);let t={};for(let s of e.config??[])t[s.key]=s.default??"";U(t)}).catch(()=>{}).finally(()=>v(!1))},[f]),(0,a.useEffect)(()=>{y?.deployment?.status==="deployed"&&fetch(`/api/mcps/${f}/status`).then(e=>e.json()).then(_).catch(()=>{})},[f,y?.deployment?.status]),j)return(0,r.jsx)("div",{className:"flex items-center justify-center py-20",children:(0,r.jsx)("div",{className:"text-fg-faint",children:"Loading..."})});if(!y)return(0,r.jsx)("div",{className:"text-center py-20",children:(0,r.jsx)("p",{className:"text-fg-faint",children:"MCP not found."})});let ea=y.deployment?.status==="deployed",en=new Set(($.ENABLED_PLATFORMS||"").split(",").filter(Boolean)),el=(y.secrets??[]).filter(e=>!!e.required||!e.forPlatform||en.has(e.forPlatform)),eo=/^[^\s@]+@[^\s@]+\.[^\s@]+$/,ed=!ea&&el.some(e=>e.required&&!A[e.key]?.trim());return(0,r.jsxs)("div",{className:"space-y-8",children:[(0,r.jsx)("div",{className:"flex items-start justify-between",children:(0,r.jsxs)("div",{children:[(0,r.jsxs)("div",{className:"flex items-center gap-3 mb-1",children:[(0,r.jsx)("h1",{className:"text-2xl font-bold",children:y.name}),(0,r.jsx)(l.W,{status:y.deployment?.status??"not_deployed"})]}),(0,r.jsx)("p",{className:"text-fg-muted text-sm",children:y.description}),(0,r.jsxs)("div",{className:"flex items-center gap-4 mt-2 text-xs text-fg-faint",children:[(0,r.jsxs)("span",{children:["v",y.version]}),(0,r.jsxs)("button",{onClick:er,disabled:K,className:"inline-flex items-center gap-1.5 px-3 py-1 bg-surface-raised hover:bg-surface-overlay border border-edge-subtle rounded-lg text-xs text-fg-secondary transition-colors disabled:opacity-50",children:[(0,r.jsx)("svg",{className:`w-3 h-3 ${K?"animate-spin":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})}),K?"Checking...":"Check for updates"]}),I&&(0,r.jsx)("span",{className:`inline-flex items-center px-2 py-0.5 rounded text-xs font-medium ${"Update available!"===I?"bg-success-mid/10 text-success":"bg-surface-overlay/50 text-fg-muted"}`,children:I}),y.githubRepo&&(0,r.jsxs)("a",{href:`https://github.com/${y.githubRepo}`,target:"_blank",rel:"noopener noreferrer",className:"text-accent-fg hover:underline",children:["Source ",(0,r.jsx)(d,{})]})]})]})}),ea&&R&&(0,r.jsx)("div",{className:`border rounded-xl p-4 ${R.healthy?"border-success-mid/30 bg-success-mid/5":"border-danger-mid/30 bg-danger-mid/5"}`,children:(0,r.jsxs)("div",{className:"flex items-center gap-2 text-sm",children:[(0,r.jsx)("span",{className:`w-2 h-2 rounded-full ${R.healthy?"bg-success":"bg-danger"}`}),(0,r.jsx)("span",{className:R.healthy?"text-success":"text-danger",children:R.healthy?"Healthy":"Unhealthy"}),y.deployment?.workerUrl&&(0,r.jsx)("span",{className:"text-fg-faint ml-2",children:y.deployment.workerUrl})]})}),y.updateAvailable&&y.deployedVersion&&y.latestVersion&&(0,r.jsx)("div",{className:"border border-info-mid/30 bg-info-mid/5 rounded-xl p-4",children:(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("div",{className:"flex items-center gap-3",children:[(0,r.jsx)("div",{className:"w-8 h-8 rounded-full bg-info-mid/20 flex items-center justify-center",children:(0,r.jsx)("svg",{className:"w-4 h-4 text-info",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})})}),(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"text-sm font-medium text-info",children:"Update Available"}),(0,r.jsxs)("p",{className:"text-xs text-fg-muted",children:[y.deployedVersion??y.version," → ",y.latestVersion]})]})]}),(0,r.jsx)("button",{onClick:es,disabled:k,className:"px-4 py-2 bg-info-mid/20 hover:bg-info-mid/30 border border-info-mid/30 text-info text-sm font-medium rounded-lg transition-colors disabled:opacity-60",children:k?(0,r.jsxs)("span",{className:"flex items-center gap-2",children:[(0,r.jsxs)("svg",{className:"animate-spin h-4 w-4",viewBox:"0 0 24 24",children:[(0,r.jsx)("circle",{className:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"4",fill:"none"}),(0,r.jsx)("path",{className:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"})]}),"Updating…"]}):"Update Now"})]})}),y.deployment?.status==="failed"&&y.deployment.error&&(0,r.jsx)("div",{className:"border border-danger-mid/30 bg-danger-mid/5 rounded-xl p-4",children:(0,r.jsxs)("p",{className:"text-sm text-danger",children:["Last deployment failed: ",y.deployment.error]})}),(y.config??[]).length>0&&(0,r.jsxs)("div",{className:"border border-edge rounded-xl p-6 bg-surface/80",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold mb-4",children:"Configuration"}),(0,r.jsx)(c,{fields:y.config,values:$,onChange:U})]}),!ea&&el.length>0&&(0,r.jsxs)("div",{className:"border border-edge rounded-xl p-6 bg-surface/80",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold mb-4",children:"API Keys"}),(0,r.jsx)("div",{className:"space-y-4",children:el.map(e=>(0,r.jsxs)("div",{children:[(0,r.jsxs)("label",{className:"flex items-center gap-2 text-sm font-medium text-fg-secondary mb-1.5",children:[e.label,e.required?(0,r.jsx)("span",{className:"text-accent-fg text-xs",children:"required"}):(0,r.jsx)("span",{className:"text-fg-faint text-xs",children:"optional"})]}),e.helpText&&(0,r.jsxs)("p",{className:"text-xs text-fg-faint mb-2",children:[e.helpText,e.helpUrl&&(0,r.jsxs)(r.Fragment,{children:[" ",(0,r.jsxs)("a",{href:e.helpUrl,target:"_blank",rel:"noopener noreferrer",className:"text-accent-fg hover:underline",children:["Get key ",(0,r.jsx)(d,{})]})]})]}),(0,r.jsx)("div",{className:"flex gap-2",children:(0,r.jsxs)("div",{className:"relative flex-1",children:[(0,r.jsx)("input",{type:"password"!==e.type||O[e.key]?"text":"password",id:`${f}-${e.key}`,name:`${f}-${e.key}`,autoComplete:"off","data-1p-ignore":!0,"data-lpignore":"true",value:A[e.key]??"",onChange:t=>{var s,r;let a;return s=e.key,r=t.target.value,a=A[s]??"",void((Math.abs(r.length-a.length)>5||!r)&&(ee.current.delete(s),L[s]&&E({...L,[s]:void 0})),B[s]&&D(e=>{let t={...e};return delete t[s],t}),P({...A,[s]:r}))},onBlur:()=>{let t;return t=A[e.key],void(e.test&&t?.trim()&&!ee.current.has(e.key)&&function(e){if(!e.test||!A[e.key]?.trim())return!1;for(let t of[...e.test.url.match(/\{\{([^}]+)\}\}/g)?.map(e=>e.slice(2,-2))??[],...Object.values(e.test.headers??{}).join("").match(/\{\{([^}]+)\}\}/g)?.map(e=>e.slice(2,-2))??[]].filter(e=>"value"!==e))if(!A[t]?.trim())return!1;return!0}(e)&&(ee.current.add(e.key),et(e,!0)))},placeholder:e.placeholder,className:`w-full px-4 py-2.5 pr-10 bg-surface-raised border rounded-lg text-sm text-fg placeholder-fg-faint focus:outline-none focus:ring-1 ${B[e.key]?"border-danger-mid focus:border-danger-mid focus:ring-danger-mid":"border-edge-subtle focus:border-accent-edge focus:ring-accent-edge"}`}),"password"===e.type&&(0,r.jsx)("button",{type:"button",onClick:()=>M({...O,[e.key]:!O[e.key]}),className:"absolute right-3 top-1/2 -translate-y-1/2 text-fg-faint hover:text-fg-secondary transition-colors",children:(0,r.jsx)(o,{open:O[e.key]??!1})})]})}),L[e.key]&&(0,r.jsxs)("p",{className:`text-xs mt-2 ${L[e.key].success?"text-success":"text-danger"}`,children:[L[e.key].success?"✓":"✗"," ",L[e.key].message]}),B[e.key]&&(0,r.jsx)("p",{className:"text-xs mt-1.5 text-danger",children:B[e.key]})]},e.key))})]}),ea&&(y.secrets??[]).length>0&&(0,r.jsxs)("div",{className:"border border-edge rounded-xl p-6 bg-surface/80",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold mb-4",children:"Update Secrets"}),(0,r.jsx)("p",{className:"text-sm text-fg-muted mb-4",children:"Update API keys without redeploying. Leave fields blank to keep existing values."}),(0,r.jsx)(i,{slug:f,fields:y.secrets,configuredKeys:y.configuredSecrets,enabledPlatforms:Array.from(en)})]}),(0,r.jsxs)("div",{className:"border border-edge rounded-xl p-6 bg-surface/80",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold",children:ea?"Redeploy":"Deploy"}),(0,r.jsx)("p",{className:"text-sm text-fg-muted mt-1",children:ea?"Redeploy with the latest bundle and configuration.":"Deploy this MCP server to your Cloudflare Workers account."}),(0,r.jsxs)("div",{className:"mt-5",children:[(0,r.jsx)("label",{className:"block text-sm font-medium text-fg-secondary mb-2",children:"Authentication"}),(0,r.jsxs)("div",{className:"relative",children:[(0,r.jsxs)("select",{value:F,onChange:e=>W(e.target.value),className:"w-full appearance-none px-4 py-2.5 pr-10 bg-surface-raised border border-edge-subtle rounded-lg text-sm text-fg focus:outline-none focus:border-accent-edge focus:ring-1 focus:ring-accent-edge",children:[(0,r.jsx)("option",{value:"bearer",children:"Bearer token (default)"}),(0,r.jsx)("option",{value:"oauth",children:"OAuth 2.1 (password protected)"}),(0,r.jsx)("option",{value:"open",children:"Open (no authentication)"})]}),(0,r.jsx)("svg",{className:"pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 w-4 h-4 text-fg-muted",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,r.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]}),"oauth"===F&&(0,r.jsx)("p",{className:"text-xs text-fg-faint mt-2",children:"OAuth requires a password prompt during authorization. Bearer tokens are not accepted."}),"open"===F&&(0,r.jsx)("p",{className:"text-xs text-danger mt-2",children:"Warning: Anyone with the URL can access this MCP."})]}),ea&&"open"!==F&&(0,r.jsx)("div",{className:"mt-4 pt-4 border-t border-edge",children:(0,r.jsxs)("label",{className:"flex items-center gap-3 cursor-pointer group",children:[(0,r.jsxs)("div",{className:"relative",children:[(0,r.jsx)("input",{type:"checkbox",checked:H,onChange:e=>q(e.target.checked),className:"sr-only peer"}),(0,r.jsx)("div",{className:"w-9 h-5 bg-surface-overlay rounded-full peer-checked:bg-warning transition-colors"}),(0,r.jsx)("div",{className:"absolute top-0.5 left-0.5 w-4 h-4 bg-surface-page shadow-sm rounded-full peer-checked:translate-x-4 transition-transform"})]}),(0,r.jsxs)("div",{children:[(0,r.jsxs)("p",{className:"text-sm font-medium text-fg-secondary group-hover:text-fg transition-colors",children:["Regenerate ","oauth"===F?"OAuth password":"bearer token"]}),(0,r.jsx)("p",{className:"text-xs text-fg-faint",children:"Invalidates existing connections. Use if compromised."})]})]})}),(0,r.jsx)("div",{className:"mt-5 flex items-center justify-end gap-3",children:(0,r.jsx)("button",{onClick:es,disabled:k||ed,className:`px-6 py-2.5 text-white text-sm font-medium rounded-lg transition-colors disabled:opacity-50 disabled:cursor-not-allowed ${H&&ea?"bg-warning hover:bg-warning-hover":"bg-accent hover:bg-accent-hover"}`,children:k?"Deploying...":H&&ea?"Regenerate & redeploy":ea?"Redeploy":"Deploy to Cloudflare"})}),S&&(0,r.jsx)("p",{className:"mt-4 text-sm text-danger bg-danger-mid/10 border border-danger-mid/20 rounded-lg px-4 py-2",children:S})]}),w&&(0,r.jsx)("div",{className:"border border-success-mid/30 bg-success-mid/5 rounded-xl p-4",children:(0,r.jsx)("p",{className:"text-sm text-success",children:J&&"oauth"===w.authMode?"OAuth password regenerated. Update your client connections.":J?"Bearer token regenerated. Update your client connections.":`Successfully deployed to ${w.workerUrl}`})}),(t=w?.oauthPassword??y.credentials?.oauthPassword,s=w?.bearerToken??y.credentials?.bearerToken??null,u=w?.authMode??y.deployment?.authMode??"bearer",m=w?.workerUrl??y.deployment?.workerUrl,p=w?.mcpUrl??(m?`${m}/mcp`:null),h=w?.mcpUrlWithToken??(s&&m?`${m}/mcp/t/${s}`:p),ea||w?(0,r.jsx)("div",{className:"space-y-4",children:p&&(0,r.jsxs)("div",{className:"border border-edge rounded-xl p-6 bg-surface/80",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold mb-3",children:"Connect to Claude"}),(0,r.jsx)(x,{mcpUrl:p,mcpUrlWithToken:h??p,bearerToken:s,slug:f,authMode:u,oauthPassword:t})]})}):null),(0,r.jsxs)("div",{className:"border border-danger-mid/20 rounded-xl p-6 bg-danger-mid/5",children:[(0,r.jsx)("h2",{className:"text-lg font-semibold text-danger mb-4",children:"Danger Zone"}),(0,r.jsxs)("div",{className:"space-y-4",children:[ea&&(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"text-sm text-fg-secondary",children:"Undeploy"}),(0,r.jsx)("p",{className:"text-xs text-fg-faint mt-1",children:"Take the worker offline. You can redeploy later."})]}),(0,r.jsx)("button",{onClick:async()=>{if(confirm("This will delete the deployed worker. You can redeploy later. Continue?")){X(!0);try{let e=await fetch(`/api/mcps/${f}/undeploy`,{method:"DELETE"});if(e.ok){let e=await fetch(`/api/mcps/${f}`).then(e=>e.json());b(e),_(null),C(null)}else{let t=await e.json();alert(t.error??"Failed to undeploy")}}catch{alert("Failed to connect to server")}finally{X(!1)}}},disabled:Q,className:"px-4 py-2 bg-danger-dark/50 hover:bg-danger-dark/70 border border-danger-strong/50 rounded-lg text-sm text-danger transition-colors shrink-0 disabled:opacity-50",children:Q?"Undeploying...":"Undeploy"})]}),ea&&(0,r.jsx)("div",{className:"border-t border-danger-mid/10"}),(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"text-sm text-fg-secondary",children:"Remove"}),(0,r.jsx)("p",{className:"text-xs text-fg-faint mt-1",children:"Undeploy the worker and permanently remove this MCP from the dashboard."})]}),(0,r.jsx)("button",{onClick:async()=>{if(confirm("This will permanently remove this MCP from the dashboard. Continue?")){Z(!0);try{let e=await fetch(`/api/mcps/${f}/remove`,{method:"DELETE"});if(e.ok)g.push("/");else{let t=await e.json();alert(t.error??"Failed to remove MCP")}}catch{alert("Failed to connect to server")}finally{Z(!1)}}},disabled:Y,className:"px-4 py-2 bg-danger-dark/50 hover:bg-danger-dark/70 border border-danger-strong/50 rounded-lg text-sm text-danger transition-colors shrink-0 disabled:opacity-50",children:Y?"Removing...":"Remove"})]})]})]})]})}},5087:(e,t,s)=>{Promise.resolve().then(s.bind(s,4959))},5341:(e,t,s)=>{"use strict";s.d(t,{W:()=>a});var r=s(5155);function a({status:e}){let t={deployed:"bg-success-mid/15 text-success border-success-mid/30",failed:"bg-danger-mid/15 text-danger border-danger-mid/30",not_deployed:"bg-fg-faint/15 text-fg-muted border-fg-faint/30"},s="deployed"===e?(0,r.jsxs)("span",{className:"relative flex h-1.5 w-1.5",children:[(0,r.jsx)("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-success opacity-30"}),(0,r.jsx)("span",{className:"relative inline-flex rounded-full h-1.5 w-1.5 bg-success"})]}):(0,r.jsx)("span",{className:`w-1.5 h-1.5 rounded-full ${"failed"===e?"bg-danger":"bg-fg-muted"}`});return(0,r.jsxs)("span",{className:`inline-flex items-center gap-1.5 px-2.5 py-0.5 rounded-full text-xs font-medium border ${t[e]??t.not_deployed}`,children:[s,{deployed:"Deployed",failed:"Failed",not_deployed:"Not Deployed"}[e]??"Unknown"]})}}},e=>{e.O(0,[441,794,358],()=>e(e.s=5087)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-blue-600:oklch(54.6% .245 262.881);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::backdrop,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-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}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden}.absolute,.sr-only{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-0\.5{top:calc(var(--spacing)*.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.right-2{right:calc(var(--spacing)*2)}.right-3{right:calc(var(--spacing)*3)}.left-0\.5{left:calc(var(--spacing)*.5)}.isolate{isolation:isolate}.z-50{z-index:50}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.ml-0\.5{margin-left:calc(var(--spacing)*.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.line-clamp-1{-webkit-line-clamp:1}.line-clamp-1,.line-clamp-2{-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-12{height:calc(var(--spacing)*12)}.h-full{height:100%}.min-h-\[2\.5rem\]{min-height:2.5rem}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-2{width:calc(var(--spacing)*2)}.w-2\/3{width:66.6667%}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-24{width:calc(var(--spacing)*24)}.w-32{width:calc(var(--spacing)*32)}.w-full{width:100%}.max-w-5xl{max-width:var(--container-5xl)}.max-w-md{max-width:var(--container-md)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-6{column-gap:calc(var(--spacing)*6)}.gap-y-2{row-gap:calc(var(--spacing)*2)}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e+38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-accent-edge\/30{border-color:var(--accent-edge)}@supports (color:color-mix(in lab,red,red)){.border-accent-edge\/30{border-color:color-mix(in oklab,var(--accent-edge)30%,transparent)}}.border-accent-edge\/40{border-color:var(--accent-edge)}@supports (color:color-mix(in lab,red,red)){.border-accent-edge\/40{border-color:color-mix(in oklab,var(--accent-edge)40%,transparent)}}.border-accent-fg{border-color:var(--accent-fg)}.border-danger-mid,.border-danger-mid\/10{border-color:var(--danger-mid)}@supports (color:color-mix(in lab,red,red)){.border-danger-mid\/10{border-color:color-mix(in oklab,var(--danger-mid)10%,transparent)}}.border-danger-mid\/20{border-color:var(--danger-mid)}@supports (color:color-mix(in lab,red,red)){.border-danger-mid\/20{border-color:color-mix(in oklab,var(--danger-mid)20%,transparent)}}.border-danger-mid\/30{border-color:var(--danger-mid)}@supports (color:color-mix(in lab,red,red)){.border-danger-mid\/30{border-color:color-mix(in oklab,var(--danger-mid)30%,transparent)}}.border-danger-strong\/50{border-color:var(--danger-strong)}@supports (color:color-mix(in lab,red,red)){.border-danger-strong\/50{border-color:color-mix(in oklab,var(--danger-strong)50%,transparent)}}.border-edge{border-color:var(--edge)}.border-edge-subtle,.border-edge-subtle\/50{border-color:var(--edge-subtle)}@supports (color:color-mix(in lab,red,red)){.border-edge-subtle\/50{border-color:color-mix(in oklab,var(--edge-subtle)50%,transparent)}}.border-fg-faint\/30{border-color:var(--fg-faint)}@supports (color:color-mix(in lab,red,red)){.border-fg-faint\/30{border-color:color-mix(in oklab,var(--fg-faint)30%,transparent)}}.border-gray-700{border-color:var(--color-gray-700)}.border-info-mid\/20{border-color:var(--info-mid)}@supports (color:color-mix(in lab,red,red)){.border-info-mid\/20{border-color:color-mix(in oklab,var(--info-mid)20%,transparent)}}.border-info-mid\/30{border-color:var(--info-mid)}@supports (color:color-mix(in lab,red,red)){.border-info-mid\/30{border-color:color-mix(in oklab,var(--info-mid)30%,transparent)}}.border-success-mid\/20{border-color:var(--success-mid)}@supports (color:color-mix(in lab,red,red)){.border-success-mid\/20{border-color:color-mix(in oklab,var(--success-mid)20%,transparent)}}.border-success-mid\/30{border-color:var(--success-mid)}@supports (color:color-mix(in lab,red,red)){.border-success-mid\/30{border-color:color-mix(in oklab,var(--success-mid)30%,transparent)}}.bg-accent{background-color:var(--accent)}.bg-accent-edge\/5{background-color:var(--accent-edge)}@supports (color:color-mix(in lab,red,red)){.bg-accent-edge\/5{background-color:color-mix(in oklab,var(--accent-edge)5%,transparent)}}.bg-accent-edge\/15{background-color:var(--accent-edge)}@supports (color:color-mix(in lab,red,red)){.bg-accent-edge\/15{background-color:color-mix(in oklab,var(--accent-edge)15%,transparent)}}.bg-accent-edge\/20{background-color:var(--accent-edge)}@supports (color:color-mix(in lab,red,red)){.bg-accent-edge\/20{background-color:color-mix(in oklab,var(--accent-edge)20%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black)60%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-danger{background-color:var(--danger)}.bg-danger-dark\/50{background-color:var(--danger-dark)}@supports (color:color-mix(in lab,red,red)){.bg-danger-dark\/50{background-color:color-mix(in oklab,var(--danger-dark)50%,transparent)}}.bg-danger-mid\/5{background-color:var(--danger-mid)}@supports (color:color-mix(in lab,red,red)){.bg-danger-mid\/5{background-color:color-mix(in oklab,var(--danger-mid)5%,transparent)}}.bg-danger-mid\/10{background-color:var(--danger-mid)}@supports (color:color-mix(in lab,red,red)){.bg-danger-mid\/10{background-color:color-mix(in oklab,var(--danger-mid)10%,transparent)}}.bg-danger-mid\/15{background-color:var(--danger-mid)}@supports (color:color-mix(in lab,red,red)){.bg-danger-mid\/15{background-color:color-mix(in oklab,var(--danger-mid)15%,transparent)}}.bg-fg-faint,.bg-fg-faint\/15{background-color:var(--fg-faint)}@supports (color:color-mix(in lab,red,red)){.bg-fg-faint\/15{background-color:color-mix(in oklab,var(--fg-faint)15%,transparent)}}.bg-fg-muted{background-color:var(--fg-muted)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500)10%,transparent)}}.bg-green-600{background-color:var(--color-green-600)}.bg-info-mid\/5{background-color:var(--info-mid)}@supports (color:color-mix(in lab,red,red)){.bg-info-mid\/5{background-color:color-mix(in oklab,var(--info-mid)5%,transparent)}}.bg-info-mid\/10{background-color:var(--info-mid)}@supports (color:color-mix(in lab,red,red)){.bg-info-mid\/10{background-color:color-mix(in oklab,var(--info-mid)10%,transparent)}}.bg-info-mid\/20{background-color:var(--info-mid)}@supports (color:color-mix(in lab,red,red)){.bg-info-mid\/20{background-color:color-mix(in oklab,var(--info-mid)20%,transparent)}}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.bg-success{background-color:var(--success)}.bg-success-mid\/5{background-color:var(--success-mid)}@supports (color:color-mix(in lab,red,red)){.bg-success-mid\/5{background-color:color-mix(in oklab,var(--success-mid)5%,transparent)}}.bg-success-mid\/10{background-color:var(--success-mid)}@supports (color:color-mix(in lab,red,red)){.bg-success-mid\/10{background-color:color-mix(in oklab,var(--success-mid)10%,transparent)}}.bg-success-mid\/15{background-color:var(--success-mid)}@supports (color:color-mix(in lab,red,red)){.bg-success-mid\/15{background-color:color-mix(in oklab,var(--success-mid)15%,transparent)}}.bg-surface{background-color:var(--surface)}.bg-surface-overlay,.bg-surface-overlay\/50{background-color:var(--surface-overlay)}@supports (color:color-mix(in lab,red,red)){.bg-surface-overlay\/50{background-color:color-mix(in oklab,var(--surface-overlay)50%,transparent)}}.bg-surface-page{background-color:var(--surface-page)}.bg-surface-raised,.bg-surface-raised\/50{background-color:var(--surface-raised)}@supports (color:color-mix(in lab,red,red)){.bg-surface-raised\/50{background-color:color-mix(in oklab,var(--surface-raised)50%,transparent)}}.bg-surface\/50{background-color:var(--surface)}@supports (color:color-mix(in lab,red,red)){.bg-surface\/50{background-color:color-mix(in oklab,var(--surface)50%,transparent)}}.bg-surface\/80{background-color:var(--surface)}@supports (color:color-mix(in lab,red,red)){.bg-surface\/80{background-color:color-mix(in oklab,var(--surface)80%,transparent)}}.bg-warning{background-color:var(--warning)}.p-1{padding:calc(var(--spacing)*1)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.py-20{padding-block:calc(var(--spacing)*20)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-16{padding-top:calc(var(--spacing)*16)}.pr-10{padding-right:calc(var(--spacing)*10)}.pb-0\.5{padding-bottom:calc(var(--spacing)*.5)}.text-center{text-align:center}.text-end{text-align:end}.text-start{text-align:start}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.text-accent-fg{color:var(--accent-fg)}.text-danger{color:var(--danger)}.text-fg{color:var(--fg)}.text-fg-disabled{color:var(--fg-disabled)}.text-fg-faint{color:var(--fg-faint)}.text-fg-muted{color:var(--fg-muted)}.text-fg-secondary{color:var(--fg-secondary)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-green-400{color:var(--color-green-400)}.text-info{color:var(--info)}.text-red-400{color:var(--color-red-400)}.text-success,.text-success\/70{color:var(--success)}@supports (color:color-mix(in lab,red,red)){.text-success\/70{color:color-mix(in oklab,var(--success)70%,transparent)}}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-fg-faint::placeholder{color:var(--fg-faint)}.opacity-30{opacity:.3}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040)}.shadow-2xl,.shadow-sm{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a)}.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,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.group-hover\:bg-surface-overlay:is(:where(.group):hover *){background-color:var(--surface-overlay)}.group-hover\:text-accent-fg:is(:where(.group):hover *){color:var(--accent-fg)}.group-hover\:text-fg:is(:where(.group):hover *){color:var(--fg)}.group-hover\:text-fg-muted:is(:where(.group):hover *){color:var(--fg-muted)}}.peer-checked\:translate-x-4:is(:where(.peer):checked~*){--tw-translate-x:calc(var(--spacing)*4);translate:var(--tw-translate-x)var(--tw-translate-y)}.peer-checked\:bg-warning:is(:where(.peer):checked~*){background-color:var(--warning)}@media (hover:hover){.hover\:border-edge-subtle:hover{border-color:var(--edge-subtle)}.hover\:border-fg-disabled:hover{border-color:var(--fg-disabled)}.hover\:border-gray-500:hover{border-color:var(--color-gray-500)}.hover\:bg-accent-hover:hover{background-color:var(--accent-hover)}.hover\:bg-danger-dark\/70:hover{background-color:var(--danger-dark)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-danger-dark\/70:hover{background-color:color-mix(in oklab,var(--danger-dark)70%,transparent)}}.hover\:bg-danger-mid\/20:hover{background-color:var(--danger-mid)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-danger-mid\/20:hover{background-color:color-mix(in oklab,var(--danger-mid)20%,transparent)}}.hover\:bg-edge-subtle:hover{background-color:var(--edge-subtle)}.hover\:bg-info-mid\/30:hover{background-color:var(--info-mid)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-info-mid\/30:hover{background-color:color-mix(in oklab,var(--info-mid)30%,transparent)}}.hover\:bg-surface-overlay:hover{background-color:var(--surface-overlay)}.hover\:bg-warning-hover:hover{background-color:var(--warning-hover)}.hover\:text-fg:hover{color:var(--fg)}.hover\:text-fg-secondary:hover{color:var(--fg-secondary)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-accent-edge:focus{border-color:var(--accent-edge)}.focus\:border-danger-mid:focus{border-color:var(--danger-mid)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-accent-edge:focus{--tw-ring-color:var(--accent-edge)}.focus\:ring-danger-mid:focus{--tw-ring-color:var(--danger-mid)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-surface-raised:disabled{background-color:var(--surface-raised)}.disabled\:text-fg-disabled:disabled{color:var(--fg-disabled)}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}}:root{color-scheme:dark;--surface-page:#030712;--surface:#111827;--surface-raised:#1f2937;--surface-overlay:#374151;--fg:#f3f4f6;--fg-secondary:#d1d5db;--fg-muted:#9ca3af;--fg-faint:#6b7280;--fg-disabled:#4b5563;--edge:#1f2937;--edge-subtle:#374151;--accent:#4f46e5;--accent-hover:#4338ca;--accent-fg:#818cf8;--accent-edge:#6366f1;--success:#34d399;--success-mid:#10b981;--danger:#f87171;--danger-mid:#ef4444;--danger-strong:#dc2626;--danger-dark:#7f1d1d;--warning:#d97706;--warning-hover:#b45309;--info:#2dd4bf;--info-mid:#14b8a6}:root[data-theme=light]{color-scheme:light;--surface-page:#fff;--surface:#f9fafb;--surface-raised:#f3f4f6;--surface-overlay:#e5e7eb;--fg:#111827;--fg-secondary:#374151;--fg-muted:#4b5563;--fg-faint:#6b7280;--fg-disabled:#9ca3af;--edge:#e5e7eb;--edge-subtle:#d1d5db;--accent:#4f46e5;--accent-hover:#4338ca;--accent-fg:#4f46e5;--accent-edge:#6366f1;--success:#10b981;--success-mid:#059669;--danger:#dc2626;--danger-mid:#b91c1c;--danger-strong:#991b1b;--danger-dark:#fef2f2;--warning:#d97706;--warning-hover:#b45309;--info:#0d9488;--info-mid:#0f766e}@media (prefers-color-scheme:light){:root[data-theme=system]{color-scheme:light;--surface-page:#fff;--surface:#f9fafb;--surface-raised:#f3f4f6;--surface-overlay:#e5e7eb;--fg:#111827;--fg-secondary:#374151;--fg-muted:#4b5563;--fg-faint:#6b7280;--fg-disabled:#9ca3af;--edge:#e5e7eb;--edge-subtle:#d1d5db;--accent:#4f46e5;--accent-hover:#4338ca;--accent-fg:#4f46e5;--accent-edge:#6366f1;--success:#10b981;--success-mid:#059669;--danger:#dc2626;--danger-mid:#b91c1c;--danger-strong:#991b1b;--danger-dark:#fef2f2;--warning:#d97706;--warning-hover:#b45309;--info:#0d9488;--info-mid:#0f766e}}input:-webkit-autofill,input:-webkit-autofill:hover{-webkit-box-shadow:0 0 0 30px var(--surface-raised)inset!important;-webkit-text-fill-color:var(--fg)!important;caret-color:var(--fg)!important;transition:background-color 5000s ease-in-out!important}input:-webkit-autofill:active,input:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 30px var(--surface-raised)inset!important;-webkit-text-fill-color:var(--fg)!important;caret-color:var(--fg)!important;transition:background-color 5000s ease-in-out!important}input::-ms-clear,input::-ms-reveal{display:none}button,input,select{transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}button:focus,input:focus,select:focus{outline:none}input[type=email],input[type=password],input[type=text]{background-color:var(--surface-raised)!important;color:var(--fg)!important}input[type=email]:not(:focus),input[type=password]:not(:focus),input[type=text]:not(:focus){background-color:var(--surface-raised)!important}::selection{background-color:var(--accent-edge);color:#fff}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(1turn)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}
1
+ /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::backdrop,:after,:before{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:host,:root{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-blue-600:oklch(54.6% .245 262.881);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--blur-sm:8px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::backdrop,:after,:before{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}:host,html{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}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,pre,samp{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-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}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}menu,ol,ul{list-style:none}audio,canvas,embed,iframe,img,object,svg,video{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden}.absolute,.sr-only{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-0\.5{top:calc(var(--spacing)*.5)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing)*2)}.right-2{right:calc(var(--spacing)*2)}.right-3{right:calc(var(--spacing)*3)}.left-0\.5{left:calc(var(--spacing)*.5)}.isolate{isolation:isolate}.z-50{z-index:50}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.ml-0\.5{margin-left:calc(var(--spacing)*.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.line-clamp-1{-webkit-line-clamp:1}.line-clamp-1,.line-clamp-2{-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-12{height:calc(var(--spacing)*12)}.h-full{height:100%}.min-h-\[2\.5rem\]{min-height:2.5rem}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-2{width:calc(var(--spacing)*2)}.w-2\/3{width:66.6667%}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-24{width:calc(var(--spacing)*24)}.w-32{width:calc(var(--spacing)*32)}.w-full{width:100%}.max-w-5xl{max-width:var(--container-5xl)}.max-w-md{max-width:var(--container-md)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y:calc(calc(1/2*100%)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.appearance-none{appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-6{column-gap:calc(var(--spacing)*6)}.gap-y-2{row-gap:calc(var(--spacing)*2)}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e+38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-accent-edge\/30{border-color:var(--accent-edge)}@supports (color:color-mix(in lab,red,red)){.border-accent-edge\/30{border-color:color-mix(in oklab,var(--accent-edge)30%,transparent)}}.border-accent-edge\/40{border-color:var(--accent-edge)}@supports (color:color-mix(in lab,red,red)){.border-accent-edge\/40{border-color:color-mix(in oklab,var(--accent-edge)40%,transparent)}}.border-accent-fg{border-color:var(--accent-fg)}.border-danger-mid,.border-danger-mid\/10{border-color:var(--danger-mid)}@supports (color:color-mix(in lab,red,red)){.border-danger-mid\/10{border-color:color-mix(in oklab,var(--danger-mid)10%,transparent)}}.border-danger-mid\/20{border-color:var(--danger-mid)}@supports (color:color-mix(in lab,red,red)){.border-danger-mid\/20{border-color:color-mix(in oklab,var(--danger-mid)20%,transparent)}}.border-danger-mid\/30{border-color:var(--danger-mid)}@supports (color:color-mix(in lab,red,red)){.border-danger-mid\/30{border-color:color-mix(in oklab,var(--danger-mid)30%,transparent)}}.border-danger-strong\/50{border-color:var(--danger-strong)}@supports (color:color-mix(in lab,red,red)){.border-danger-strong\/50{border-color:color-mix(in oklab,var(--danger-strong)50%,transparent)}}.border-edge{border-color:var(--edge)}.border-edge-subtle,.border-edge-subtle\/50{border-color:var(--edge-subtle)}@supports (color:color-mix(in lab,red,red)){.border-edge-subtle\/50{border-color:color-mix(in oklab,var(--edge-subtle)50%,transparent)}}.border-fg-faint\/30{border-color:var(--fg-faint)}@supports (color:color-mix(in lab,red,red)){.border-fg-faint\/30{border-color:color-mix(in oklab,var(--fg-faint)30%,transparent)}}.border-gray-700{border-color:var(--color-gray-700)}.border-info-mid\/20{border-color:var(--info-mid)}@supports (color:color-mix(in lab,red,red)){.border-info-mid\/20{border-color:color-mix(in oklab,var(--info-mid)20%,transparent)}}.border-info-mid\/30{border-color:var(--info-mid)}@supports (color:color-mix(in lab,red,red)){.border-info-mid\/30{border-color:color-mix(in oklab,var(--info-mid)30%,transparent)}}.border-success-mid\/20{border-color:var(--success-mid)}@supports (color:color-mix(in lab,red,red)){.border-success-mid\/20{border-color:color-mix(in oklab,var(--success-mid)20%,transparent)}}.border-success-mid\/30{border-color:var(--success-mid)}@supports (color:color-mix(in lab,red,red)){.border-success-mid\/30{border-color:color-mix(in oklab,var(--success-mid)30%,transparent)}}.bg-accent{background-color:var(--accent)}.bg-accent-edge\/5{background-color:var(--accent-edge)}@supports (color:color-mix(in lab,red,red)){.bg-accent-edge\/5{background-color:color-mix(in oklab,var(--accent-edge)5%,transparent)}}.bg-accent-edge\/15{background-color:var(--accent-edge)}@supports (color:color-mix(in lab,red,red)){.bg-accent-edge\/15{background-color:color-mix(in oklab,var(--accent-edge)15%,transparent)}}.bg-accent-edge\/20{background-color:var(--accent-edge)}@supports (color:color-mix(in lab,red,red)){.bg-accent-edge\/20{background-color:color-mix(in oklab,var(--accent-edge)20%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black)60%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-danger{background-color:var(--danger)}.bg-danger-dark\/50{background-color:var(--danger-dark)}@supports (color:color-mix(in lab,red,red)){.bg-danger-dark\/50{background-color:color-mix(in oklab,var(--danger-dark)50%,transparent)}}.bg-danger-mid\/5{background-color:var(--danger-mid)}@supports (color:color-mix(in lab,red,red)){.bg-danger-mid\/5{background-color:color-mix(in oklab,var(--danger-mid)5%,transparent)}}.bg-danger-mid\/10{background-color:var(--danger-mid)}@supports (color:color-mix(in lab,red,red)){.bg-danger-mid\/10{background-color:color-mix(in oklab,var(--danger-mid)10%,transparent)}}.bg-danger-mid\/15{background-color:var(--danger-mid)}@supports (color:color-mix(in lab,red,red)){.bg-danger-mid\/15{background-color:color-mix(in oklab,var(--danger-mid)15%,transparent)}}.bg-fg-faint,.bg-fg-faint\/15{background-color:var(--fg-faint)}@supports (color:color-mix(in lab,red,red)){.bg-fg-faint\/15{background-color:color-mix(in oklab,var(--fg-faint)15%,transparent)}}.bg-fg-muted{background-color:var(--fg-muted)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-900{background-color:var(--color-gray-900)}.bg-green-500\/10{background-color:#00c7581a}@supports (color:color-mix(in lab,red,red)){.bg-green-500\/10{background-color:color-mix(in oklab,var(--color-green-500)10%,transparent)}}.bg-green-600{background-color:var(--color-green-600)}.bg-info-mid\/5{background-color:var(--info-mid)}@supports (color:color-mix(in lab,red,red)){.bg-info-mid\/5{background-color:color-mix(in oklab,var(--info-mid)5%,transparent)}}.bg-info-mid\/10{background-color:var(--info-mid)}@supports (color:color-mix(in lab,red,red)){.bg-info-mid\/10{background-color:color-mix(in oklab,var(--info-mid)10%,transparent)}}.bg-info-mid\/20{background-color:var(--info-mid)}@supports (color:color-mix(in lab,red,red)){.bg-info-mid\/20{background-color:color-mix(in oklab,var(--info-mid)20%,transparent)}}.bg-red-500\/10{background-color:#fb2c361a}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/10{background-color:color-mix(in oklab,var(--color-red-500)10%,transparent)}}.bg-success{background-color:var(--success)}.bg-success-mid\/5{background-color:var(--success-mid)}@supports (color:color-mix(in lab,red,red)){.bg-success-mid\/5{background-color:color-mix(in oklab,var(--success-mid)5%,transparent)}}.bg-success-mid\/10{background-color:var(--success-mid)}@supports (color:color-mix(in lab,red,red)){.bg-success-mid\/10{background-color:color-mix(in oklab,var(--success-mid)10%,transparent)}}.bg-success-mid\/15{background-color:var(--success-mid)}@supports (color:color-mix(in lab,red,red)){.bg-success-mid\/15{background-color:color-mix(in oklab,var(--success-mid)15%,transparent)}}.bg-surface{background-color:var(--surface)}.bg-surface-overlay,.bg-surface-overlay\/50{background-color:var(--surface-overlay)}@supports (color:color-mix(in lab,red,red)){.bg-surface-overlay\/50{background-color:color-mix(in oklab,var(--surface-overlay)50%,transparent)}}.bg-surface-page{background-color:var(--surface-page)}.bg-surface-raised,.bg-surface-raised\/50{background-color:var(--surface-raised)}@supports (color:color-mix(in lab,red,red)){.bg-surface-raised\/50{background-color:color-mix(in oklab,var(--surface-raised)50%,transparent)}}.bg-surface\/50{background-color:var(--surface)}@supports (color:color-mix(in lab,red,red)){.bg-surface\/50{background-color:color-mix(in oklab,var(--surface)50%,transparent)}}.bg-surface\/80{background-color:var(--surface)}@supports (color:color-mix(in lab,red,red)){.bg-surface\/80{background-color:color-mix(in oklab,var(--surface)80%,transparent)}}.bg-warning{background-color:var(--warning)}.p-1{padding:calc(var(--spacing)*1)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.py-20{padding-block:calc(var(--spacing)*20)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-16{padding-top:calc(var(--spacing)*16)}.pr-10{padding-right:calc(var(--spacing)*10)}.pb-0\.5{padding-bottom:calc(var(--spacing)*.5)}.text-center{text-align:center}.text-end{text-align:end}.text-start{text-align:start}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.text-accent-fg{color:var(--accent-fg)}.text-danger{color:var(--danger)}.text-fg{color:var(--fg)}.text-fg-disabled{color:var(--fg-disabled)}.text-fg-faint{color:var(--fg-faint)}.text-fg-muted{color:var(--fg-muted)}.text-fg-secondary{color:var(--fg-secondary)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-green-400{color:var(--color-green-400)}.text-info{color:var(--info)}.text-red-400{color:var(--color-red-400)}.text-success,.text-success\/70{color:var(--success)}@supports (color:color-mix(in lab,red,red)){.text-success\/70{color:color-mix(in oklab,var(--success)70%,transparent)}}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-fg-faint::placeholder{color:var(--fg-faint)}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-75{opacity:.75}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040)}.shadow-2xl,.shadow-sm{box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a)}.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,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.group-hover\:bg-surface-overlay:is(:where(.group):hover *){background-color:var(--surface-overlay)}.group-hover\:text-accent-fg:is(:where(.group):hover *){color:var(--accent-fg)}.group-hover\:text-fg:is(:where(.group):hover *){color:var(--fg)}.group-hover\:text-fg-muted:is(:where(.group):hover *){color:var(--fg-muted)}}.peer-checked\:translate-x-4:is(:where(.peer):checked~*){--tw-translate-x:calc(var(--spacing)*4);translate:var(--tw-translate-x)var(--tw-translate-y)}.peer-checked\:bg-warning:is(:where(.peer):checked~*){background-color:var(--warning)}@media (hover:hover){.hover\:border-edge-subtle:hover{border-color:var(--edge-subtle)}.hover\:border-fg-disabled:hover{border-color:var(--fg-disabled)}.hover\:border-gray-500:hover{border-color:var(--color-gray-500)}.hover\:bg-accent-hover:hover{background-color:var(--accent-hover)}.hover\:bg-danger-dark\/70:hover{background-color:var(--danger-dark)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-danger-dark\/70:hover{background-color:color-mix(in oklab,var(--danger-dark)70%,transparent)}}.hover\:bg-danger-mid\/20:hover{background-color:var(--danger-mid)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-danger-mid\/20:hover{background-color:color-mix(in oklab,var(--danger-mid)20%,transparent)}}.hover\:bg-edge-subtle:hover{background-color:var(--edge-subtle)}.hover\:bg-info-mid\/30:hover{background-color:var(--info-mid)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-info-mid\/30:hover{background-color:color-mix(in oklab,var(--info-mid)30%,transparent)}}.hover\:bg-surface-overlay:hover{background-color:var(--surface-overlay)}.hover\:bg-warning-hover:hover{background-color:var(--warning-hover)}.hover\:text-fg:hover{color:var(--fg)}.hover\:text-fg-secondary:hover{color:var(--fg-secondary)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-accent-edge:focus{border-color:var(--accent-edge)}.focus\:border-danger-mid:focus{border-color:var(--danger-mid)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-accent-edge:focus{--tw-ring-color:var(--accent-edge)}.focus\:ring-danger-mid:focus{--tw-ring-color:var(--danger-mid)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-surface-raised:disabled{background-color:var(--surface-raised)}.disabled\:text-fg-disabled:disabled{color:var(--fg-disabled)}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}@media (min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}}:root{color-scheme:dark;--surface-page:#030712;--surface:#111827;--surface-raised:#1f2937;--surface-overlay:#374151;--fg:#f3f4f6;--fg-secondary:#d1d5db;--fg-muted:#9ca3af;--fg-faint:#6b7280;--fg-disabled:#4b5563;--edge:#1f2937;--edge-subtle:#374151;--accent:#4f46e5;--accent-hover:#4338ca;--accent-fg:#818cf8;--accent-edge:#6366f1;--success:#34d399;--success-mid:#10b981;--danger:#f87171;--danger-mid:#ef4444;--danger-strong:#dc2626;--danger-dark:#7f1d1d;--warning:#d97706;--warning-hover:#b45309;--info:#2dd4bf;--info-mid:#14b8a6}:root[data-theme=light]{color-scheme:light;--surface-page:#fff;--surface:#f9fafb;--surface-raised:#f3f4f6;--surface-overlay:#e5e7eb;--fg:#111827;--fg-secondary:#374151;--fg-muted:#4b5563;--fg-faint:#6b7280;--fg-disabled:#9ca3af;--edge:#e5e7eb;--edge-subtle:#d1d5db;--accent:#4f46e5;--accent-hover:#4338ca;--accent-fg:#4f46e5;--accent-edge:#6366f1;--success:#10b981;--success-mid:#059669;--danger:#dc2626;--danger-mid:#b91c1c;--danger-strong:#991b1b;--danger-dark:#fef2f2;--warning:#d97706;--warning-hover:#b45309;--info:#0d9488;--info-mid:#0f766e}@media (prefers-color-scheme:light){:root[data-theme=system]{color-scheme:light;--surface-page:#fff;--surface:#f9fafb;--surface-raised:#f3f4f6;--surface-overlay:#e5e7eb;--fg:#111827;--fg-secondary:#374151;--fg-muted:#4b5563;--fg-faint:#6b7280;--fg-disabled:#9ca3af;--edge:#e5e7eb;--edge-subtle:#d1d5db;--accent:#4f46e5;--accent-hover:#4338ca;--accent-fg:#4f46e5;--accent-edge:#6366f1;--success:#10b981;--success-mid:#059669;--danger:#dc2626;--danger-mid:#b91c1c;--danger-strong:#991b1b;--danger-dark:#fef2f2;--warning:#d97706;--warning-hover:#b45309;--info:#0d9488;--info-mid:#0f766e}}input:-webkit-autofill,input:-webkit-autofill:hover{-webkit-box-shadow:0 0 0 30px var(--surface-raised)inset!important;-webkit-text-fill-color:var(--fg)!important;caret-color:var(--fg)!important;transition:background-color 5000s ease-in-out!important}input:-webkit-autofill:active,input:-webkit-autofill:focus{-webkit-box-shadow:0 0 0 30px var(--surface-raised)inset!important;-webkit-text-fill-color:var(--fg)!important;caret-color:var(--fg)!important;transition:background-color 5000s ease-in-out!important}input::-ms-clear,input::-ms-reveal{display:none}button,input,select{transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}button:focus,input:focus,select:focus{outline:none}input[type=email],input[type=password],input[type=text]{background-color:var(--surface-raised)!important;color:var(--fg)!important}input[type=email]:not(:focus),input[type=password]:not(:focus),input[type=text]:not(:focus){background-color:var(--surface-raised)!important}::selection{background-color:var(--accent-edge);color:#fff}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(1turn)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-deploy",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "private": false,
5
5
  "description": "Deploy and manage MCP (Model Context Protocol) servers on Cloudflare Workers",
6
6
  "keywords": [
@@ -18,15 +18,31 @@ export async function POST(
18
18
  try {
19
19
  // Get user-provided secrets and config from the request body
20
20
  const body = await request.json().catch(() => ({}));
21
- const userSecrets: Record<string, string> = body.secrets ?? {};
22
- const userConfig: Record<string, string> = body.config ?? {};
21
+ const rawSecrets: Record<string, string> = body.secrets ?? {};
22
+ const rawConfig: Record<string, string> = body.config ?? {};
23
23
  authMode =
24
24
  body.authMode === "oauth" || body.authMode === "open"
25
25
  ? body.authMode
26
26
  : "bearer";
27
27
 
28
+ // Strip empty values from config (stale fields from previous versions)
29
+ const userConfig: Record<string, string> = {};
30
+ for (const [key, value] of Object.entries(rawConfig)) {
31
+ if (typeof value === "string" && value.length > 0) {
32
+ userConfig[key] = value;
33
+ }
34
+ }
35
+
36
+ // Strip empty values from secrets
37
+ const userSecrets: Record<string, string> = {};
38
+ for (const [key, value] of Object.entries(rawSecrets)) {
39
+ if (typeof value === "string" && value.length > 0) {
40
+ userSecrets[key] = value;
41
+ }
42
+ }
43
+
28
44
  // Validate secrets format
29
- if (userSecrets && !isValidSecretsObject(userSecrets)) {
45
+ if (!isValidSecretsObject(userSecrets)) {
30
46
  return NextResponse.json(
31
47
  { error: "Invalid secrets format" },
32
48
  { status: 400 }
@@ -34,7 +50,7 @@ export async function POST(
34
50
  }
35
51
 
36
52
  // Validate config format
37
- if (userConfig && !isValidSecretsObject(userConfig)) {
53
+ if (!isValidSecretsObject(userConfig)) {
38
54
  return NextResponse.json(
39
55
  { error: "Invalid config format" },
40
56
  { status: 400 }
@@ -38,13 +38,12 @@ export async function GET(
38
38
 
39
39
  // Read update status from latest_version_cache (populated by explicit check)
40
40
  const versionCache = getLatestVersionCache(slug);
41
- const deployedV = stripV(deployment?.version);
41
+ const currentV = stripV(deployment?.version) ?? stripV(resolved.version);
42
42
  const latestV = stripV(versionCache?.latestVersion);
43
43
  const updateAvailable =
44
- !!deployedV &&
45
- deployment!.status === "deployed" &&
44
+ !!currentV &&
46
45
  !!latestV &&
47
- deployedV !== latestV;
46
+ currentV !== latestV;
48
47
 
49
48
  // Decrypt credentials for display (local-only UI)
50
49
  let decryptedBearerToken: string | null = null;
@@ -63,7 +62,7 @@ export async function GET(
63
62
  name: resolved.name,
64
63
  description: resolved.description,
65
64
  version: stripV(resolved.version) ?? resolved.version,
66
- deployedVersion: deployedV,
65
+ deployedVersion: stripV(deployment?.version),
67
66
  latestVersion: latestV,
68
67
  updateAvailable,
69
68
  workerName: resolved.workerName,
@@ -23,20 +23,19 @@ export async function GET() {
23
23
 
24
24
  // Read update status from latest_version_cache (populated by explicit check)
25
25
  const versionCache = getLatestVersionCache(entry.slug);
26
- const deployedV = stripV(deployment?.version);
26
+ const currentV = stripV(deployment?.version) ?? stripV(resolved.version);
27
27
  const latestV = stripV(versionCache?.latestVersion);
28
28
  const updateAvailable =
29
- !!deployedV &&
30
- deployment!.status === "deployed" &&
29
+ !!currentV &&
31
30
  !!latestV &&
32
- deployedV !== latestV;
31
+ currentV !== latestV;
33
32
 
34
33
  return {
35
34
  slug: resolved.slug,
36
35
  name: resolved.name,
37
36
  description: resolved.description,
38
37
  version: stripV(resolved.version) ?? resolved.version,
39
- deployedVersion: deployedV,
38
+ deployedVersion: stripV(deployment?.version),
40
39
  latestVersion: latestV,
41
40
  updateAvailable,
42
41
  githubRepo: resolved.githubRepo,
@@ -225,7 +225,9 @@ export default function McpDetailPage({
225
225
  headers: { "Content-Type": "application/json" },
226
226
  body: JSON.stringify({
227
227
  secrets: secretValues,
228
- config: configValues,
228
+ config: Object.fromEntries(
229
+ Object.entries(configValues).filter(([, v]) => v !== "")
230
+ ),
229
231
  authMode,
230
232
  ...(regenerateAuth && authMode === "bearer" ? { regenerateToken: true } : {}),
231
233
  ...(regenerateAuth && authMode === "oauth" ? { regenerateOAuthPassword: true } : {}),
@@ -463,16 +465,24 @@ export default function McpDetailPage({
463
465
  Update Available
464
466
  </p>
465
467
  <p className="text-xs text-fg-muted">
466
- {data.deployedVersion} → {data.latestVersion}
468
+ {data.deployedVersion ?? data.version} → {data.latestVersion}
467
469
  </p>
468
470
  </div>
469
471
  </div>
470
472
  <button
471
473
  onClick={handleDeploy}
472
474
  disabled={deploying}
473
- className="px-4 py-2 bg-info-mid/20 hover:bg-info-mid/30 border border-info-mid/30 text-info text-sm font-medium rounded-lg transition-colors"
475
+ className="px-4 py-2 bg-info-mid/20 hover:bg-info-mid/30 border border-info-mid/30 text-info text-sm font-medium rounded-lg transition-colors disabled:opacity-60"
474
476
  >
475
- {deploying ? "Updating..." : "Update Now"}
477
+ {deploying ? (
478
+ <span className="flex items-center gap-2">
479
+ <svg className="animate-spin h-4 w-4" viewBox="0 0 24 24">
480
+ <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" fill="none" />
481
+ <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" />
482
+ </svg>
483
+ Updating…
484
+ </span>
485
+ ) : "Update Now"}
476
486
  </button>
477
487
  </div>
478
488
  </div>
@@ -12,6 +12,7 @@ import {
12
12
  addMcp as storeAddMcp,
13
13
  getMcps,
14
14
  setCachedMetadata,
15
+ deleteCachedMetadata,
15
16
  getDeployment,
16
17
  setDeployment,
17
18
  setMcpSecrets,
@@ -19,6 +20,8 @@ import {
19
20
  removeMcp as storeRemoveMcp,
20
21
  undeployMcp as storeUndeployMcp,
21
22
  setLatestVersionCache,
23
+ getLatestVersionCache,
24
+ getCachedMetadataForDisplay,
22
25
  } from "./store";
23
26
  import {
24
27
  deployWorker,
@@ -107,6 +110,13 @@ export async function deployMcp(
107
110
  );
108
111
  }
109
112
 
113
+ // If an update is available, invalidate the metadata cache so we fetch the latest release
114
+ const latestVersionEntry = getLatestVersionCache(slug);
115
+ const cachedMeta = getCachedMetadataForDisplay(slug);
116
+ if (latestVersionEntry && cachedMeta && latestVersionEntry.latestVersion !== cachedMeta.version) {
117
+ deleteCachedMetadata(slug);
118
+ }
119
+
110
120
  // Resolve the entry to get full metadata from GitHub
111
121
  const resolved = await resolveMcpEntry(entry);
112
122
 
package/src/lib/store.ts CHANGED
@@ -335,6 +335,12 @@ export function setCachedMetadata(
335
335
  );
336
336
  }
337
337
 
338
+ export function deleteCachedMetadata(slug: string): void {
339
+ getDb()
340
+ .prepare("DELETE FROM metadata_cache WHERE slug = ?")
341
+ .run(slug);
342
+ }
343
+
338
344
  // ─── Latest Version Cache ───
339
345
 
340
346
  interface LatestVersionCacheEntry {