sitcod3 commited on
Commit
d701ffe
·
verified ·
1 Parent(s): d87526a

cleanup: remove dist from image repo

Browse files
dist/assets/index-BkQoDH_4.js DELETED
The diff for this file is too large to render. See raw diff
 
dist/assets/index-CfsDHs3X.css DELETED
@@ -1 +0,0 @@
1
- /*! tailwindcss v4.3.3 | 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)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--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-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--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;--tw-duration:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:"Plus Jakarta Sans", ui-sans-serif, system-ui, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, monospace;--color-red-400:oklch(70.4% .191 22.216);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-sky-500:oklch(68.5% .169 237.323);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-900:oklch(35.9% .144 278.697);--color-indigo-950:oklch(25.7% .09 281.288);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-4xl:56rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--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-xs:4px;--blur-sm:8px;--blur-md:12px;--blur-xl:24px;--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{*,:after,:before,::backdrop{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}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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,samp,pre{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:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,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{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{inset-block:0}.top-0{top:0}.top-1\/2{top:50%}.top-10{top:calc(var(--spacing) * 10)}.top-\[10\%\]{top:10%}.top-\[40\%\]{top:40%}.right-0{right:0}.right-40{right:calc(var(--spacing) * 40)}.right-\[10\%\]{right:10%}.right-\[30\%\]{right:30%}.bottom-20{bottom:calc(var(--spacing) * 20)}.bottom-\[20\%\]{bottom:20%}.left-0{left:0}.left-3{left:calc(var(--spacing) * 3)}.left-20{left:calc(var(--spacing) * 20)}.left-\[15\%\]{left:15%}.-z-10{z-index:-10}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[-1\]{z-index:-1}.col-span-2{grid-column:span 2/span 2}.col-span-full{grid-column:1/-1}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mr-0\.5{margin-right:calc(var(--spacing) * .5)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mb-1{margin-bottom:var(--spacing)}.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)}.-ml-2{margin-left:calc(var(--spacing) * -2)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-32{height:calc(var(--spacing) * 32)}.h-64{height:calc(var(--spacing) * 64)}.h-96{height:calc(var(--spacing) * 96)}.h-\[220px\]{height:220px}.h-\[260px\]{height:260px}.h-\[280px\]{height:280px}.h-\[300px\]{height:300px}.h-\[320px\]{height:320px}.h-\[calc\(100vh-4rem\)\]{height:calc(100vh - 4rem)}.h-full{height:100%}.h-screen{height:100vh}.min-h-\[160px\]{min-height:160px}.min-h-full{min-height:100%}.w-1{width:var(--spacing)}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-20{width:calc(var(--spacing) * 20)}.w-32{width:calc(var(--spacing) * 32)}.w-40{width:calc(var(--spacing) * 40)}.w-64{width:calc(var(--spacing) * 64)}.w-80{width:calc(var(--spacing) * 80)}.w-96{width:calc(var(--spacing) * 96)}.w-full{width:100%}.w-px{width:1px}.w-screen{width:100vw}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[150px\]{max-width:150px}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}.rotate-45{rotate:45deg}.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}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}: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-3\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3.5) * 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-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-7>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 7) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 7) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-white\/5>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){:where(.divide-white\/5>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}:where(.divide-zinc-800>:not(:last-child)){border-color:var(--color-zinc-800)}:where(.divide-zinc-800\/60>:not(:last-child)){border-color:#27272a99}@supports (color:color-mix(in lab,red,red)){:where(.divide-zinc-800\/60>:not(:last-child)){border-color:color-mix(in oklab,var(--color-zinc-800) 60%,transparent)}}:where(.divide-zinc-800\/80>:not(:last-child)){border-color:#27272acc}@supports (color:color-mix(in lab,red,red)){:where(.divide-zinc-800\/80>:not(:last-child)){border-color:color-mix(in oklab,var(--color-zinc-800) 80%,transparent)}}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-r-full{border-top-right-radius:3.40282e38px;border-bottom-right-radius:3.40282e38px}.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-r{border-right-style:var(--tw-border-style);border-right-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-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.border-blue-500\/20{border-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.border-blue-500\/20{border-color:color-mix(in oklab,var(--color-blue-500) 20%,transparent)}}.border-emerald-500{border-color:var(--color-emerald-500)}.border-emerald-500\/20{border-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/20{border-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.border-emerald-500\/30{border-color:#00bb7f4d}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/30{border-color:color-mix(in oklab,var(--color-emerald-500) 30%,transparent)}}.border-indigo-500{border-color:var(--color-indigo-500)}.border-indigo-500\/10{border-color:#625fff1a}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/10{border-color:color-mix(in oklab,var(--color-indigo-500) 10%,transparent)}}.border-indigo-500\/20{border-color:#625fff33}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/20{border-color:color-mix(in oklab,var(--color-indigo-500) 20%,transparent)}}.border-indigo-500\/30{border-color:#625fff4d}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/30{border-color:color-mix(in oklab,var(--color-indigo-500) 30%,transparent)}}.border-indigo-500\/40{border-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/40{border-color:color-mix(in oklab,var(--color-indigo-500) 40%,transparent)}}.border-indigo-500\/50{border-color:#625fff80}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/50{border-color:color-mix(in oklab,var(--color-indigo-500) 50%,transparent)}}.border-purple-500\/20{border-color:#ac4bff33}@supports (color:color-mix(in lab,red,red)){.border-purple-500\/20{border-color:color-mix(in oklab,var(--color-purple-500) 20%,transparent)}}.border-rose-500\/20{border-color:#ff235733}@supports (color:color-mix(in lab,red,red)){.border-rose-500\/20{border-color:color-mix(in oklab,var(--color-rose-500) 20%,transparent)}}.border-rose-500\/30{border-color:#ff23574d}@supports (color:color-mix(in lab,red,red)){.border-rose-500\/30{border-color:color-mix(in oklab,var(--color-rose-500) 30%,transparent)}}.border-sky-500\/10{border-color:#00a5ef1a}@supports (color:color-mix(in lab,red,red)){.border-sky-500\/10{border-color:color-mix(in oklab,var(--color-sky-500) 10%,transparent)}}.border-teal-500\/20{border-color:#00baa733}@supports (color:color-mix(in lab,red,red)){.border-teal-500\/20{border-color:color-mix(in oklab,var(--color-teal-500) 20%,transparent)}}.border-transparent{border-color:#0000}.border-white{border-color:var(--color-white)}.border-white\/5{border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.border-white\/5{border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.border-zinc-700{border-color:var(--color-zinc-700)}.border-zinc-700\/60{border-color:#3f3f4699}@supports (color:color-mix(in lab,red,red)){.border-zinc-700\/60{border-color:color-mix(in oklab,var(--color-zinc-700) 60%,transparent)}}.border-zinc-800{border-color:var(--color-zinc-800)}.border-zinc-800\/60{border-color:#27272a99}@supports (color:color-mix(in lab,red,red)){.border-zinc-800\/60{border-color:color-mix(in oklab,var(--color-zinc-800) 60%,transparent)}}.border-zinc-800\/80{border-color:#27272acc}@supports (color:color-mix(in lab,red,red)){.border-zinc-800\/80{border-color:color-mix(in oklab,var(--color-zinc-800) 80%,transparent)}}.border-t-transparent{border-top-color:#0000}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab,red,red)){.bg-black\/20{background-color:color-mix(in oklab,var(--color-black) 20%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black) 40%,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-black\/70{background-color:#000000b3}@supports (color:color-mix(in lab,red,red)){.bg-black\/70{background-color:color-mix(in oklab,var(--color-black) 70%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500) 10%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/5{background-color:#00bb7f0d}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/5{background-color:color-mix(in oklab,var(--color-emerald-500) 5%,transparent)}}.bg-emerald-500\/10{background-color:#00bb7f1a}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/10{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.bg-emerald-500\/20{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.bg-emerald-600{background-color:var(--color-emerald-600)}.bg-indigo-400{background-color:var(--color-indigo-400)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-indigo-500\/5{background-color:#625fff0d}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/5{background-color:color-mix(in oklab,var(--color-indigo-500) 5%,transparent)}}.bg-indigo-500\/10{background-color:#625fff1a}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/10{background-color:color-mix(in oklab,var(--color-indigo-500) 10%,transparent)}}.bg-indigo-500\/20{background-color:#625fff33}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/20{background-color:color-mix(in oklab,var(--color-indigo-500) 20%,transparent)}}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-indigo-600\/20{background-color:#4f39f633}@supports (color:color-mix(in lab,red,red)){.bg-indigo-600\/20{background-color:color-mix(in oklab,var(--color-indigo-600) 20%,transparent)}}.bg-indigo-950\/20{background-color:#1e1a4d33}@supports (color:color-mix(in lab,red,red)){.bg-indigo-950\/20{background-color:color-mix(in oklab,var(--color-indigo-950) 20%,transparent)}}.bg-indigo-950\/30{background-color:#1e1a4d4d}@supports (color:color-mix(in lab,red,red)){.bg-indigo-950\/30{background-color:color-mix(in oklab,var(--color-indigo-950) 30%,transparent)}}.bg-indigo-950\/40{background-color:#1e1a4d66}@supports (color:color-mix(in lab,red,red)){.bg-indigo-950\/40{background-color:color-mix(in oklab,var(--color-indigo-950) 40%,transparent)}}.bg-purple-500{background-color:var(--color-purple-500)}.bg-purple-500\/10{background-color:#ac4bff1a}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/10{background-color:color-mix(in oklab,var(--color-purple-500) 10%,transparent)}}.bg-purple-600{background-color:var(--color-purple-600)}.bg-rose-400{background-color:var(--color-rose-400)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-rose-500\/10{background-color:#ff23571a}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/10{background-color:color-mix(in oklab,var(--color-rose-500) 10%,transparent)}}.bg-rose-600{background-color:var(--color-rose-600)}.bg-rose-600\/20{background-color:#e7004433}@supports (color:color-mix(in lab,red,red)){.bg-rose-600\/20{background-color:color-mix(in oklab,var(--color-rose-600) 20%,transparent)}}.bg-teal-500\/10{background-color:#00baa71a}@supports (color:color-mix(in lab,red,red)){.bg-teal-500\/10{background-color:color-mix(in oklab,var(--color-teal-500) 10%,transparent)}}.bg-transparent{background-color:#0000}.bg-white\/5{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.bg-white\/5{background-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.bg-white\/\[0\.02\]{background-color:#ffffff05}@supports (color:color-mix(in lab,red,red)){.bg-white\/\[0\.02\]{background-color:color-mix(in oklab,var(--color-white) 2%,transparent)}}.bg-zinc-400{background-color:var(--color-zinc-400)}.bg-zinc-800{background-color:var(--color-zinc-800)}.bg-zinc-800\/80{background-color:#27272acc}@supports (color:color-mix(in lab,red,red)){.bg-zinc-800\/80{background-color:color-mix(in oklab,var(--color-zinc-800) 80%,transparent)}}.bg-zinc-900{background-color:var(--color-zinc-900)}.bg-zinc-900\/30{background-color:#18181b4d}@supports (color:color-mix(in lab,red,red)){.bg-zinc-900\/30{background-color:color-mix(in oklab,var(--color-zinc-900) 30%,transparent)}}.bg-zinc-900\/40{background-color:#18181b66}@supports (color:color-mix(in lab,red,red)){.bg-zinc-900\/40{background-color:color-mix(in oklab,var(--color-zinc-900) 40%,transparent)}}.bg-zinc-900\/50{background-color:#18181b80}@supports (color:color-mix(in lab,red,red)){.bg-zinc-900\/50{background-color:color-mix(in oklab,var(--color-zinc-900) 50%,transparent)}}.bg-zinc-900\/60{background-color:#18181b99}@supports (color:color-mix(in lab,red,red)){.bg-zinc-900\/60{background-color:color-mix(in oklab,var(--color-zinc-900) 60%,transparent)}}.bg-zinc-950{background-color:var(--color-zinc-950)}.bg-zinc-950\/40{background-color:#09090b66}@supports (color:color-mix(in lab,red,red)){.bg-zinc-950\/40{background-color:color-mix(in oklab,var(--color-zinc-950) 40%,transparent)}}.bg-zinc-950\/60{background-color:#09090b99}@supports (color:color-mix(in lab,red,red)){.bg-zinc-950\/60{background-color:color-mix(in oklab,var(--color-zinc-950) 60%,transparent)}}.bg-zinc-950\/80{background-color:#09090bcc}@supports (color:color-mix(in lab,red,red)){.bg-zinc-950\/80{background-color:color-mix(in oklab,var(--color-zinc-950) 80%,transparent)}}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-\[linear-gradient\(rgba\(255\,255\,255\,0\.02\)_1px\,transparent_1px\)\,linear-gradient\(90deg\,rgba\(255\,255\,255\,0\.02\)_1px\,transparent_1px\)\]{background-image:linear-gradient(#ffffff05 1px,#0000 1px),linear-gradient(90deg,#ffffff05 1px,#0000 1px)}.bg-\[radial-gradient\(ellipse_at_top_right\,_var\(--tw-gradient-stops\)\)\]{background-image:radial-gradient(ellipse at top right,var(--tw-gradient-stops))}.from-indigo-900\/10{--tw-gradient-from:#312c851a}@supports (color:color-mix(in lab,red,red)){.from-indigo-900\/10{--tw-gradient-from:color-mix(in oklab, var(--color-indigo-900) 10%, transparent)}}.from-indigo-900\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-white\/5{--tw-gradient-from:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.from-white\/5{--tw-gradient-from:color-mix(in oklab, var(--color-white) 5%, transparent)}}.from-white\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-white\/\[0\.03\]{--tw-gradient-from:#ffffff08}@supports (color:color-mix(in lab,red,red)){.from-white\/\[0\.03\]{--tw-gradient-from:color-mix(in oklab, var(--color-white) 3%, transparent)}}.from-white\/\[0\.03\]{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.via-indigo-900\/20{--tw-gradient-via:#312c8533}@supports (color:color-mix(in lab,red,red)){.via-indigo-900\/20{--tw-gradient-via:color-mix(in oklab, var(--color-indigo-900) 20%, transparent)}}.via-indigo-900\/20{--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-transparent{--tw-gradient-via:transparent;--tw-gradient-via-stops:var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-white\/5{--tw-gradient-to:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.to-white\/5{--tw-gradient-to:color-mix(in oklab, var(--color-white) 5%, transparent)}}.to-white\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.\[mask-image\:radial-gradient\(ellipse_60\%_60\%_at_50\%_50\%\,\#000_20\%\,transparent_100\%\)\]{-webkit-mask-image:radial-gradient(60% 60%,#000 20%,#0000 100%);mask-image:radial-gradient(60% 60%,#000 20%,#0000)}.bg-\[size\:4rem_4rem\]{background-size:4rem 4rem}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-12{padding:calc(var(--spacing) * 12)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.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-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.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-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-16{padding-block:calc(var(--spacing) * 16)}.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)}.pr-4{padding-right:calc(var(--spacing) * 4)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-9{padding-left:calc(var(--spacing) * 9)}.pl-10{padding-left:calc(var(--spacing) * 10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--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-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.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-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.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-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-nowrap{white-space:nowrap}.text-amber-400{color:var(--color-amber-400)}.text-blue-400{color:var(--color-blue-400)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-400{color:var(--color-emerald-400)}.text-indigo-200{color:var(--color-indigo-200)}.text-indigo-300{color:var(--color-indigo-300)}.text-indigo-400{color:var(--color-indigo-400)}.text-indigo-600{color:var(--color-indigo-600)}.text-purple-400{color:var(--color-purple-400)}.text-red-400{color:var(--color-red-400)}.text-rose-300{color:var(--color-rose-300)}.text-rose-400{color:var(--color-rose-400)}.text-teal-400{color:var(--color-teal-400)}.text-white{color:var(--color-white)}.text-zinc-100{color:var(--color-zinc-100)}.text-zinc-200{color:var(--color-zinc-200)}.text-zinc-300{color:var(--color-zinc-300)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.accent-indigo-500{accent-color:var(--color-indigo-500)}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(16\,185\,129\,0\.8\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#10b981cc);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(52\,211\,153\,0\.6\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#34d39999);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(59\,130\,246\,0\.8\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#3b82f6cc);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(168\,85\,247\,0\.8\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#a855f7cc);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(244\,63\,94\,0\.6\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#f43f5e99);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(244\,63\,94\,0\.8\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#f43f5ecc);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_8px_rgba\(251\,191\,36\,0\.6\)\]{--tw-shadow:0 0 8px var(--tw-shadow-color,#fbbf2499);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_10px_rgba\(99\,102\,241\,0\.8\)\]{--tw-shadow:0 0 10px var(--tw-shadow-color,#6366f1cc);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_12px_rgba\(5\,150\,105\,0\.5\)\]{--tw-shadow:0 0 12px var(--tw-shadow-color,#05966980);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_12px_rgba\(79\,70\,229\,0\.5\)\]{--tw-shadow:0 0 12px var(--tw-shadow-color,#4f46e580);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_0_12px_rgba\(147\,51\,234\,0\.5\)\]{--tw-shadow:0 0 12px var(--tw-shadow-color,#9333ea80);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_4px_24px_-4px_rgba\(0\,0\,0\,0\.5\)\]{--tw-shadow:0 4px 24px -4px var(--tw-shadow-color,#00000080);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[0_8px_32px_-8px_rgba\(0\,0\,0\,0\.5\)\]{--tw-shadow:0 8px 32px -8px var(--tw-shadow-color,#00000080);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[4px_0_24px_-4px_rgba\(0\,0\,0\,0\.5\)\]{--tw-shadow:4px 0 24px -4px var(--tw-shadow-color,#00000080);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[inset_0_1px_1px_rgba\(255\,255\,255\,0\.1\)\]{--tw-shadow:inset 0 1px 1px var(--tw-shadow-color,#ffffff1a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[inset_0_1px_1px_rgba\(255\,255\,255\,0\.02\)\]{--tw-shadow:inset 0 1px 1px var(--tw-shadow-color,#ffffff05);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-\[inset_0_1px_1px_rgba\(255\,255\,255\,0\.05\)\]{--tw-shadow:inset 0 1px 1px var(--tw-shadow-color,#ffffff0d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);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);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-indigo-600\/20{--tw-shadow-color:#4f39f633}@supports (color:color-mix(in lab,red,red)){.shadow-indigo-600\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-indigo-600) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.blur{--tw-blur:blur(8px);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,)}.drop-shadow-\[0_0_8px_currentColor\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,currentColor));--tw-drop-shadow:var(--tw-drop-shadow-size);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,)}.drop-shadow-\[0_0_8px_rgba\(52\,211\,153\,0\.3\)\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,#34d3994d));--tw-drop-shadow:var(--tw-drop-shadow-size);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,)}.drop-shadow-\[0_0_8px_rgba\(52\,211\,153\,0\.5\)\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,#34d39980));--tw-drop-shadow:var(--tw-drop-shadow-size);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,)}.drop-shadow-\[0_0_8px_rgba\(99\,102\,241\,0\.3\)\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,#6366f14d));--tw-drop-shadow:var(--tw-drop-shadow-size);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,)}.drop-shadow-\[0_0_8px_rgba\(99\,102\,241\,0\.5\)\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,#6366f180));--tw-drop-shadow:var(--tw-drop-shadow-size);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,)}.drop-shadow-\[0_0_8px_rgba\(168\,85\,247\,0\.3\)\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,#a855f74d));--tw-drop-shadow:var(--tw-drop-shadow-size);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,)}.drop-shadow-\[0_0_8px_rgba\(244\,63\,94\,0\.3\)\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,#f43f5e4d));--tw-drop-shadow:var(--tw-drop-shadow-size);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,)}.drop-shadow-\[0_0_8px_rgba\(244\,63\,94\,0\.5\)\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,#f43f5e80));--tw-drop-shadow:var(--tw-drop-shadow-size);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,)}.drop-shadow-\[0_0_8px_rgba\(251\,191\,36\,0\.3\)\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,#fbbf244d));--tw-drop-shadow:var(--tw-drop-shadow-size);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,)}.drop-shadow-\[0_0_8px_rgba\(251\,191\,36\,0\.5\)\]{--tw-drop-shadow-size:drop-shadow(0 0 8px var(--tw-drop-shadow-color,#fbbf2480));--tw-drop-shadow:var(--tw-drop-shadow-size);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,)}.drop-shadow-\[0_0_12px_rgba\(255\,255\,255\,0\.3\)\]{--tw-drop-shadow-size:drop-shadow(0 0 12px var(--tw-drop-shadow-color,#ffffff4d));--tw-drop-shadow:var(--tw-drop-shadow-size);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,)}.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-md{--tw-backdrop-blur:blur(var(--blur-md));-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,)}.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,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-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,)}.backdrop-blur-xs{--tw-backdrop-blur:blur(var(--blur-xs));-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-all{transition-property:all;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-opacity{transition-property:opacity;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))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}@media(hover:hover){.group-hover\:scale-110:is(:where(.group):hover *){--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x) var(--tw-scale-y)}.group-hover\:border-amber-500\/40:is(:where(.group):hover *){border-color:#f99c0066}@supports (color:color-mix(in lab,red,red)){.group-hover\:border-amber-500\/40:is(:where(.group):hover *){border-color:color-mix(in oklab,var(--color-amber-500) 40%,transparent)}}.group-hover\:border-blue-500\/40:is(:where(.group):hover *){border-color:#3080ff66}@supports (color:color-mix(in lab,red,red)){.group-hover\:border-blue-500\/40:is(:where(.group):hover *){border-color:color-mix(in oklab,var(--color-blue-500) 40%,transparent)}}.group-hover\:border-emerald-500\/40:is(:where(.group):hover *){border-color:#00bb7f66}@supports (color:color-mix(in lab,red,red)){.group-hover\:border-emerald-500\/40:is(:where(.group):hover *){border-color:color-mix(in oklab,var(--color-emerald-500) 40%,transparent)}}.group-hover\:border-indigo-500\/40:is(:where(.group):hover *){border-color:#625fff66}@supports (color:color-mix(in lab,red,red)){.group-hover\:border-indigo-500\/40:is(:where(.group):hover *){border-color:color-mix(in oklab,var(--color-indigo-500) 40%,transparent)}}.group-hover\:border-purple-500\/40:is(:where(.group):hover *){border-color:#ac4bff66}@supports (color:color-mix(in lab,red,red)){.group-hover\:border-purple-500\/40:is(:where(.group):hover *){border-color:color-mix(in oklab,var(--color-purple-500) 40%,transparent)}}.group-hover\:border-rose-500\/40:is(:where(.group):hover *){border-color:#ff235766}@supports (color:color-mix(in lab,red,red)){.group-hover\:border-rose-500\/40:is(:where(.group):hover *){border-color:color-mix(in oklab,var(--color-rose-500) 40%,transparent)}}.group-hover\:border-teal-500\/40:is(:where(.group):hover *){border-color:#00baa766}@supports (color:color-mix(in lab,red,red)){.group-hover\:border-teal-500\/40:is(:where(.group):hover *){border-color:color-mix(in oklab,var(--color-teal-500) 40%,transparent)}}}.placeholder\:text-zinc-500::placeholder{color:var(--color-zinc-500)}.focus-within\:border-indigo-500\/80:focus-within{border-color:#625fffcc}@supports (color:color-mix(in lab,red,red)){.focus-within\:border-indigo-500\/80:focus-within{border-color:color-mix(in oklab,var(--color-indigo-500) 80%,transparent)}}@media(hover:hover){.hover\:border-amber-500\/30:hover{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.hover\:border-amber-500\/30:hover{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.hover\:border-emerald-500\/30:hover{border-color:#00bb7f4d}@supports (color:color-mix(in lab,red,red)){.hover\:border-emerald-500\/30:hover{border-color:color-mix(in oklab,var(--color-emerald-500) 30%,transparent)}}.hover\:border-rose-500\/30:hover{border-color:#ff23574d}@supports (color:color-mix(in lab,red,red)){.hover\:border-rose-500\/30:hover{border-color:color-mix(in oklab,var(--color-rose-500) 30%,transparent)}}.hover\:border-zinc-700:hover{border-color:var(--color-zinc-700)}.hover\:bg-amber-500\/20:hover{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.hover\:bg-amber-500\/20:hover{background-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.hover\:bg-emerald-500\/20:hover{background-color:#00bb7f33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-500\/20:hover{background-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.hover\:bg-indigo-500:hover{background-color:var(--color-indigo-500)}.hover\:bg-indigo-500\/20:hover{background-color:#625fff33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-indigo-500\/20:hover{background-color:color-mix(in oklab,var(--color-indigo-500) 20%,transparent)}}.hover\:bg-indigo-600:hover{background-color:var(--color-indigo-600)}.hover\:bg-rose-500:hover{background-color:var(--color-rose-500)}.hover\:bg-rose-500\/10:hover{background-color:#ff23571a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-rose-500\/10:hover{background-color:color-mix(in oklab,var(--color-rose-500) 10%,transparent)}}.hover\:bg-rose-500\/20:hover{background-color:#ff235733}@supports (color:color-mix(in lab,red,red)){.hover\:bg-rose-500\/20:hover{background-color:color-mix(in oklab,var(--color-rose-500) 20%,transparent)}}.hover\:bg-rose-600:hover{background-color:var(--color-rose-600)}.hover\:bg-white\/5:hover{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/5:hover{background-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.hover\:bg-zinc-700:hover{background-color:var(--color-zinc-700)}.hover\:bg-zinc-800:hover{background-color:var(--color-zinc-800)}.hover\:bg-zinc-800\/30:hover{background-color:#27272a4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-800\/30:hover{background-color:color-mix(in oklab,var(--color-zinc-800) 30%,transparent)}}.hover\:bg-zinc-800\/60:hover{background-color:#27272a99}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-800\/60:hover{background-color:color-mix(in oklab,var(--color-zinc-800) 60%,transparent)}}.hover\:bg-zinc-900:hover{background-color:var(--color-zinc-900)}.hover\:bg-zinc-900\/40:hover{background-color:#18181b66}@supports (color:color-mix(in lab,red,red)){.hover\:bg-zinc-900\/40:hover{background-color:color-mix(in oklab,var(--color-zinc-900) 40%,transparent)}}.hover\:text-amber-400:hover{color:var(--color-amber-400)}.hover\:text-emerald-400:hover{color:var(--color-emerald-400)}.hover\:text-indigo-300:hover{color:var(--color-indigo-300)}.hover\:text-indigo-400:hover{color:var(--color-indigo-400)}.hover\:text-rose-300:hover{color:var(--color-rose-300)}.hover\:text-rose-400:hover{color:var(--color-rose-400)}.hover\:text-white:hover{color:var(--color-white)}.hover\:text-zinc-100:hover{color:var(--color-zinc-100)}.hover\:text-zinc-200:hover{color:var(--color-zinc-200)}.hover\:text-zinc-300:hover{color:var(--color-zinc-300)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-indigo-500:focus{border-color:var(--color-indigo-500)}.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-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:40rem){.sm\:flex{display:flex}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:self-auto{align-self:auto}.sm\:duration-400{--tw-duration:.4s;transition-duration:.4s}}@media(min-width:48rem){.md\:relative{position:relative}.md\:hidden{display:none}.md\:w-48{width:calc(var(--spacing) * 48)}.md\:w-96{width:calc(var(--spacing) * 96)}.md\:translate-x-0{--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:gap-4{gap:calc(var(--spacing) * 4)}.md\:bg-zinc-950\/40{background-color:#09090b66}@supports (color:color-mix(in lab,red,red)){.md\:bg-zinc-950\/40{background-color:color-mix(in oklab,var(--color-zinc-950) 40%,transparent)}}.md\:p-0{padding:0}.md\:px-6{padding-inline:calc(var(--spacing) * 6)}}@media(min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}}body{font-family:var(--font-sans);color:#f8fafc;background:linear-gradient(#0f172a,#000) fixed;min-height:100vh}@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-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@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-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@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}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}
 
 
dist/index.html DELETED
@@ -1,22 +0,0 @@
1
- <!doctype html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>BRIDGE ModulS</title>
7
- <meta name="description" content="BRIDGE ModulS - API Command Center" />
8
- <meta property="og:title" content="BRIDGE ModulS" />
9
- <meta property="og:description" content="BRIDGE ModulS - API Command Center" />
10
- <meta property="og:type" content="website" />
11
- <meta name="twitter:card" content="summary_large_image" />
12
- <link rel="preconnect" href="https://fonts.googleapis.com">
13
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
14
- <link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
15
- <script type="module" crossorigin src="/assets/index-BkQoDH_4.js"></script>
16
- <link rel="stylesheet" crossorigin href="/assets/index-CfsDHs3X.css">
17
- </head>
18
- <body>
19
- <div id="root"></div>
20
- </body>
21
- </html>
22
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dist/server.cjs DELETED
@@ -1,1023 +0,0 @@
1
- var __create = Object.create;
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
- var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __copyProps = (to, from, except, desc) => {
8
- if (from && typeof from === "object" || typeof from === "function") {
9
- for (let key of __getOwnPropNames(from))
10
- if (!__hasOwnProp.call(to, key) && key !== except)
11
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
12
- }
13
- return to;
14
- };
15
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
16
- // If the importer is in node compatibility mode or this is not an ESM
17
- // file that has been converted to a CommonJS file using a Babel-
18
- // compatible transform (i.e. "__esModule" has not been set), then set
19
- // "default" to the CommonJS "module.exports" for node compatibility.
20
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
21
- mod
22
- ));
23
-
24
- // server.ts
25
- var import_express = __toESM(require("express"), 1);
26
- var import_cors = __toESM(require("cors"), 1);
27
- var import_morgan = __toESM(require("morgan"), 1);
28
- var import_axios2 = __toESM(require("axios"), 1);
29
- var import_path = __toESM(require("path"), 1);
30
-
31
- // src/lib/aiServiceServer.ts
32
- var import_axios = __toESM(require("axios"), 1);
33
- var OPENROUTER_API_URL = "https://openrouter.ai/api/v1/chat/completions";
34
- var FREE_MISTRAL_MODELS = [
35
- "mistralai/mistral-7b-instruct",
36
- "mistralai/mixtral-8x7b-instruct",
37
- "mistralai/mistral-nemo"
38
- ];
39
- var currentModelIndex = 0;
40
- async function getAiCompletionServer(prompt) {
41
- let attempts = 0;
42
- while (attempts < FREE_MISTRAL_MODELS.length) {
43
- const model = FREE_MISTRAL_MODELS[currentModelIndex];
44
- try {
45
- const response = await import_axios.default.post(
46
- OPENROUTER_API_URL,
47
- {
48
- model,
49
- messages: [{ role: "user", content: prompt }]
50
- },
51
- {
52
- headers: {
53
- "Authorization": `Bearer ${process.env.OPENROUTER_API_KEY}`,
54
- "HTTP-Referer": process.env.APP_URL || "http://localhost:3000",
55
- "X-Title": "BRIDGE ModulS Dashboard"
56
- }
57
- }
58
- );
59
- return response.data.choices[0].message.content;
60
- } catch (error) {
61
- console.error(`Error with model ${model}:`, error);
62
- attempts++;
63
- currentModelIndex = (currentModelIndex + 1) % FREE_MISTRAL_MODELS.length;
64
- }
65
- }
66
- throw new Error("All Mistral models failed.");
67
- }
68
-
69
- // server.ts
70
- var mockDb = {
71
- campaigns: [
72
- {
73
- id: "camp_9901",
74
- name: "Enterprise SaaS Outbound Q3",
75
- status: "ACTIVE",
76
- created_at: "2026-07-15T10:00:00.000Z",
77
- lead_count: 1420,
78
- sent_count: 3840,
79
- open_count: 2150,
80
- reply_count: 168,
81
- bounce_count: 24,
82
- click_count: 430,
83
- timezone: "America/New_York",
84
- start_schedule: "09:00",
85
- end_schedule: "18:00",
86
- track_settings: "TRACK_EMAIL_OPEN_AND_CLICK",
87
- send_as_plain_text: false,
88
- follow_up_percentage: 85,
89
- unsubscribe_text: "Reply unsubscribe to stop receiving emails.",
90
- stop_lead_settings: "REPLIED",
91
- sequences: [
92
- {
93
- id: "seq_1",
94
- seq_number: 1,
95
- delay_days: 0,
96
- subject: "Quick question regarding {{company_name}}'s outbound infrastructure",
97
- email_body: "<p>Hi {{first_name}},</p><p>Noticed you are scaling your growth team at {{company_name}}. Are you currently looking to optimize your cold outreach deliverability and warmup automation?</p><p>Best,<br>Alex</p>",
98
- variant_distribution_percentage: 50,
99
- variants: [
100
- {
101
- id: "var_1a",
102
- variant_label: "Variant A",
103
- subject: "Quick question regarding {{company_name}}'s outbound infrastructure",
104
- email_body: "<p>Hi {{first_name}},</p><p>Noticed you are scaling your growth team at {{company_name}}. Are you currently looking to optimize your cold outreach deliverability and warmup automation?</p><p>Best,<br>Alex</p>"
105
- },
106
- {
107
- id: "var_1b",
108
- variant_label: "Variant B (Shorter)",
109
- subject: "{{first_name}} - {{company_name}} outbound efficiency",
110
- email_body: "<p>Hey {{first_name}},</p><p>We helped similar SaaS leaders double their positive response rates without hitting spam filters. Open to a 3-min loom?</p><p>Alex</p>"
111
- }
112
- ]
113
- },
114
- {
115
- id: "seq_2",
116
- seq_number: 2,
117
- delay_days: 3,
118
- subject: "Re: Quick question regarding {{company_name}}",
119
- email_body: "<p>Hi {{first_name}}, following up on my previous note. Did you have a chance to look at this?</p>",
120
- variant_distribution_percentage: 100,
121
- variants: []
122
- }
123
- ],
124
- email_account_ids: ["acc_101", "acc_102"]
125
- },
126
- {
127
- id: "camp_9902",
128
- name: "Fintech Growth & Compliance Sequence",
129
- status: "PAUSED",
130
- created_at: "2026-07-20T14:30:00.000Z",
131
- lead_count: 850,
132
- sent_count: 1200,
133
- open_count: 620,
134
- reply_count: 42,
135
- bounce_count: 11,
136
- click_count: 98,
137
- timezone: "Europe/London",
138
- start_schedule: "08:30",
139
- end_schedule: "17:30",
140
- track_settings: "TRACK_EMAIL_OPEN",
141
- send_as_plain_text: true,
142
- follow_up_percentage: 90,
143
- unsubscribe_text: "Click here to unsubscribe",
144
- stop_lead_settings: "REPLIED",
145
- sequences: [
146
- {
147
- id: "seq_21",
148
- seq_number: 1,
149
- delay_days: 0,
150
- subject: "Compliance streamline for {{company_name}}",
151
- email_body: "<p>Hi {{first_name}}, wanted to share our automated compliance blueprint tailored for {{company_name}}.</p>",
152
- variant_distribution_percentage: 100,
153
- variants: []
154
- }
155
- ],
156
- email_account_ids: ["acc_103"]
157
- },
158
- {
159
- id: "camp_9903",
160
- name: "AI Tech Founders Pilot",
161
- status: "ACTIVE",
162
- created_at: "2026-08-01T09:15:00.000Z",
163
- lead_count: 2400,
164
- sent_count: 6100,
165
- open_count: 3890,
166
- reply_count: 310,
167
- bounce_count: 45,
168
- click_count: 820,
169
- timezone: "America/Los_Angeles",
170
- start_schedule: "09:00",
171
- end_schedule: "17:00",
172
- track_settings: "TRACK_EMAIL_OPEN_AND_CLICK",
173
- send_as_plain_text: false,
174
- follow_up_percentage: 100,
175
- unsubscribe_text: "Unsubscribe",
176
- stop_lead_settings: "REPLIED",
177
- sequences: [
178
- {
179
- id: "seq_31",
180
- seq_number: 1,
181
- delay_days: 0,
182
- subject: "{{first_name}}, accelerating inference pipelines",
183
- email_body: "<p>Hi {{first_name}}, saw your launch on Product Hunt! Curious how {{company_name}} is handling model inference latency?</p>",
184
- variant_distribution_percentage: 100,
185
- variants: []
186
- }
187
- ],
188
- email_account_ids: ["acc_101", "acc_102", "acc_104"]
189
- }
190
- ],
191
- leads: [
192
- {
193
- id: "lead_1001",
194
- campaign_id: "camp_9901",
195
- first_name: "Sarah",
196
- last_name: "Jenkins",
197
- email: "sarah.jenkins@acmepartner.io",
198
- phone_number: "+1 415-555-0182",
199
- company_name: "Acme Partner Labs",
200
- website: "https://acmepartner.io",
201
- location: "San Francisco, CA",
202
- linkedin_profile: "https://linkedin.com/in/sarahjenkins-sample",
203
- status: "INTERESTED",
204
- open_count: 4,
205
- click_count: 2,
206
- created_at: "2026-07-16T11:20:00.000Z",
207
- custom_fields: { tech_stack: "Node/React", team_size: "45", funding_round: "Series B" }
208
- },
209
- {
210
- id: "lead_1002",
211
- campaign_id: "camp_9901",
212
- first_name: "Marcus",
213
- last_name: "Vance",
214
- email: "m.vance@vanguardflow.co",
215
- phone_number: "+1 212-555-0199",
216
- company_name: "Vanguard Flow Systems",
217
- website: "https://vanguardflow.co",
218
- location: "New York, NY",
219
- linkedin_profile: "https://linkedin.com/in/marcusvance-sample",
220
- status: "MEETING_BOOKED",
221
- open_count: 6,
222
- click_count: 3,
223
- created_at: "2026-07-16T12:45:00.000Z",
224
- custom_fields: { tech_stack: "AWS/Python", team_size: "120", funding_round: "Series C" }
225
- },
226
- {
227
- id: "lead_1003",
228
- campaign_id: "camp_9901",
229
- first_name: "Elena",
230
- last_name: "Rostova",
231
- email: "elena@cybercorebiotech.com",
232
- phone_number: "+44 20 7946 0912",
233
- company_name: "CyberCore Biotech",
234
- website: "https://cybercorebiotech.com",
235
- location: "London, UK",
236
- linkedin_profile: "https://linkedin.com/in/elenarostova",
237
- status: "REPLIED",
238
- open_count: 3,
239
- click_count: 1,
240
- created_at: "2026-07-17T09:10:00.000Z",
241
- custom_fields: { tech_stack: "NextJS", team_size: "80", funding_round: "Series A" }
242
- },
243
- {
244
- id: "lead_1004",
245
- campaign_id: "camp_9902",
246
- first_name: "David",
247
- last_name: "Chen",
248
- email: "david.chen@horizonpay.net",
249
- phone_number: "+1 650-555-0144",
250
- company_name: "Horizon Pay",
251
- website: "https://horizonpay.net",
252
- location: "Palo Alto, CA",
253
- linkedin_profile: "https://linkedin.com/in/davidchen-sample",
254
- status: "NOT_INTERESTED",
255
- open_count: 1,
256
- click_count: 0,
257
- created_at: "2026-07-21T15:00:00.000Z",
258
- custom_fields: { tech_stack: "Go/Postgres", team_size: "200", funding_round: "Series D" }
259
- },
260
- {
261
- id: "lead_1005",
262
- campaign_id: "camp_9903",
263
- first_name: "Amina",
264
- last_name: "Diallo",
265
- email: "amina@synapseai.tech",
266
- phone_number: "+1 312-555-0177",
267
- company_name: "Synapse AI Global",
268
- website: "https://synapseai.tech",
269
- location: "Chicago, IL",
270
- linkedin_profile: "https://linkedin.com/in/aminadiallo",
271
- status: "INTERESTED",
272
- open_count: 5,
273
- click_count: 4,
274
- created_at: "2026-08-02T10:14:00.000Z",
275
- custom_fields: { tech_stack: "PyTorch/Ray", team_size: "30", funding_round: "Seed" }
276
- }
277
- ],
278
- email_accounts: [
279
- {
280
- id: "acc_101",
281
- from_name: "Alex Rivera",
282
- from_email: "alex@outbound-alchemist.io",
283
- provider: "GOOGLE",
284
- status: "CONNECTED",
285
- daily_limit: 50,
286
- sent_today: 34,
287
- warmup_enabled: true,
288
- warmup_reputation: "EXCELLENT",
289
- warmup_score: 98,
290
- warmup_daily_count: 25,
291
- ramp_day: 14,
292
- ramp_up_increment: 2,
293
- reply_rate_percentage: 45,
294
- campaigns_assigned: ["Enterprise SaaS Outbound Q3", "AI Tech Founders Pilot"],
295
- created_at: "2026-05-10T08:00:00.000Z"
296
- },
297
- {
298
- id: "acc_102",
299
- from_name: "Alex Rivera (Secondary)",
300
- from_email: "alex.rivera@growthmatrix.cc",
301
- provider: "MICROSOFT",
302
- status: "CONNECTED",
303
- daily_limit: 45,
304
- sent_today: 28,
305
- warmup_enabled: true,
306
- warmup_reputation: "GOOD",
307
- warmup_score: 89,
308
- warmup_daily_count: 20,
309
- ramp_day: 9,
310
- ramp_up_increment: 3,
311
- reply_rate_percentage: 40,
312
- campaigns_assigned: ["Enterprise SaaS Outbound Q3", "AI Tech Founders Pilot"],
313
- created_at: "2026-06-01T08:00:00.000Z"
314
- },
315
- {
316
- id: "acc_103",
317
- from_name: "Elena Rostova",
318
- from_email: "elena@fintechoutreach.com",
319
- provider: "SMTP",
320
- smtp_host: "mail.fintechoutreach.com",
321
- smtp_port: 587,
322
- status: "CONNECTED",
323
- daily_limit: 60,
324
- sent_today: 18,
325
- warmup_enabled: true,
326
- warmup_reputation: "EXCELLENT",
327
- warmup_score: 96,
328
- warmup_daily_count: 30,
329
- ramp_day: 22,
330
- ramp_up_increment: 2,
331
- reply_rate_percentage: 50,
332
- campaigns_assigned: ["Fintech Growth & Compliance Sequence"],
333
- created_at: "2026-06-15T08:00:00.000Z"
334
- },
335
- {
336
- id: "acc_104",
337
- from_name: "Growth Ops Lead",
338
- from_email: "ops@aifoundryoutreach.io",
339
- provider: "GOOGLE",
340
- status: "RECONNECTING",
341
- daily_limit: 40,
342
- sent_today: 0,
343
- warmup_enabled: false,
344
- warmup_reputation: "POOR",
345
- warmup_score: 62,
346
- warmup_daily_count: 0,
347
- ramp_day: 1,
348
- ramp_up_increment: 1,
349
- reply_rate_percentage: 30,
350
- campaigns_assigned: ["AI Tech Founders Pilot"],
351
- created_at: "2026-07-28T08:00:00.000Z"
352
- }
353
- ],
354
- inbox: [
355
- {
356
- id: "msg_501",
357
- campaign_id: "camp_9901",
358
- lead_id: "lead_1001",
359
- lead_name: "Sarah Jenkins",
360
- lead_email: "sarah.jenkins@acmepartner.io",
361
- company_name: "Acme Partner Labs",
362
- subject: "Re: Quick question regarding Acme Partner Labs's outbound infrastructure",
363
- category: "INTERESTED",
364
- unread: true,
365
- received_at: "2026-08-14T19:30:00.000Z",
366
- messages: [
367
- {
368
- id: "m_sub_1",
369
- from: "alex@outbound-alchemist.io",
370
- to: "sarah.jenkins@acmepartner.io",
371
- direction: "OUTBOUND",
372
- timestamp: "2026-08-14T14:00:00.000Z",
373
- body_html: "<p>Hi Sarah, Noticed you are scaling your growth team at Acme Partner Labs. Are you currently looking to optimize your cold outreach deliverability and warmup automation?</p>"
374
- },
375
- {
376
- id: "m_sub_2",
377
- from: "sarah.jenkins@acmepartner.io",
378
- to: "alex@outbound-alchemist.io",
379
- direction: "INBOUND",
380
- timestamp: "2026-08-14T19:30:00.000Z",
381
- body_html: "<p>Hi Alex,</p><p>Yes, perfect timing. We are actually evaluating mailbox warmup tools right now since our SDR team just doubled. Can you send over a brief demo or pricing overview?</p><p>Thanks,<br>Sarah Jenkins | Head of Growth</p>"
382
- }
383
- ]
384
- },
385
- {
386
- id: "msg_502",
387
- campaign_id: "camp_9901",
388
- lead_id: "lead_1002",
389
- lead_name: "Marcus Vance",
390
- lead_email: "m.vance@vanguardflow.co",
391
- company_name: "Vanguard Flow Systems",
392
- subject: "Re: Quick question regarding Vanguard Flow Systems",
393
- category: "MEETING_BOOKED",
394
- unread: false,
395
- received_at: "2026-08-14T16:15:00.000Z",
396
- messages: [
397
- {
398
- id: "m_sub_3",
399
- from: "alex@outbound-alchemist.io",
400
- to: "m.vance@vanguardflow.co",
401
- direction: "OUTBOUND",
402
- timestamp: "2026-08-13T10:00:00.000Z",
403
- body_html: "<p>Hey Marcus, We helped similar SaaS leaders double their positive response rates without hitting spam filters. Open to a 3-min loom?</p>"
404
- },
405
- {
406
- id: "m_sub_4",
407
- from: "m.vance@vanguardflow.co",
408
- to: "alex@outbound-alchemist.io",
409
- direction: "INBOUND",
410
- timestamp: "2026-08-14T16:15:00.000Z",
411
- body_html: "<p>Alex, grabbed a slot on your calendar for Tuesday at 2 PM EST. Talk soon!</p>"
412
- }
413
- ]
414
- },
415
- {
416
- id: "msg_503",
417
- campaign_id: "camp_9903",
418
- lead_id: "lead_1005",
419
- lead_name: "Amina Diallo",
420
- lead_email: "amina@synapseai.tech",
421
- company_name: "Synapse AI Global",
422
- subject: "Re: Amina, accelerating inference pipelines",
423
- category: "INTERESTED",
424
- unread: true,
425
- received_at: "2026-08-14T21:05:00.000Z",
426
- messages: [
427
- {
428
- id: "m_sub_5",
429
- from: "ops@aifoundryoutreach.io",
430
- to: "amina@synapseai.tech",
431
- direction: "OUTBOUND",
432
- timestamp: "2026-08-14T15:00:00.000Z",
433
- body_html: "<p>Hi Amina, saw your launch on Product Hunt! Curious how Synapse AI Global is handling model inference latency?</p>"
434
- },
435
- {
436
- id: "m_sub_6",
437
- from: "amina@synapseai.tech",
438
- to: "ops@aifoundryoutreach.io",
439
- direction: "INBOUND",
440
- timestamp: "2026-08-14T21:05:00.000Z",
441
- body_html: "<p>Thanks! We've built an in-house caching proxy, but always curious to learn about specialized acceleration clusters. Let's connect next week.</p>"
442
- }
443
- ]
444
- }
445
- ],
446
- webhooks: [
447
- {
448
- id: "wh_801",
449
- name: "Slack Lead Alerts & Zapier Sync",
450
- webhook_url: "https://hooks.zapier.com/hooks/catch/912837/b8120a",
451
- event_types: ["REPLY", "LEAD_CATEGORY_UPDATED", "CAMPAIGN_COMPLETED"],
452
- campaign_id: null,
453
- status: "ACTIVE",
454
- last_triggered: "2026-08-14T21:05:12.000Z",
455
- created_at: "2026-06-20T10:00:00.000Z"
456
- },
457
- {
458
- id: "wh_802",
459
- name: "HubSpot CRM Bi-directional Sync",
460
- webhook_url: "https://api.hubapi.com/webhooks/v3/custom-lead-sync",
461
- event_types: ["REPLY", "BOUNCE", "UNSUBSCRIBE", "LEAD_CATEGORY_UPDATED"],
462
- campaign_id: "camp_9901",
463
- status: "ACTIVE",
464
- last_triggered: "2026-08-14T19:30:22.000Z",
465
- created_at: "2026-07-01T12:00:00.000Z"
466
- }
467
- ],
468
- webhook_logs: [
469
- {
470
- id: "whlog_1",
471
- webhook_id: "wh_801",
472
- event_type: "REPLY",
473
- status_code: 200,
474
- timestamp: "2026-08-14T21:05:12.000Z",
475
- payload_preview: { lead_email: "amina@synapseai.tech", category: "INTERESTED", sentiment: "positive" }
476
- },
477
- {
478
- id: "whlog_2",
479
- webhook_id: "wh_802",
480
- event_type: "LEAD_CATEGORY_UPDATED",
481
- status_code: 200,
482
- timestamp: "2026-08-14T19:30:22.000Z",
483
- payload_preview: { lead_email: "sarah.jenkins@acmepartner.io", status: "INTERESTED" }
484
- }
485
- ],
486
- clients: [
487
- {
488
- id: "cli_101",
489
- name: "Nexus AI Ventures",
490
- email: "growth@nexusventures.ai",
491
- company: "Nexus AI Ventures Inc.",
492
- campaigns_count: 2,
493
- leads_count: 3820,
494
- created_at: "2026-05-15T09:00:00.000Z"
495
- },
496
- {
497
- id: "cli_102",
498
- name: "Apex Velocity B2B",
499
- email: "contact@apexvelocity.io",
500
- company: "Apex Velocity Marketing",
501
- campaigns_count: 1,
502
- leads_count: 1200,
503
- created_at: "2026-06-10T11:30:00.000Z"
504
- }
505
- ],
506
- block_list: {
507
- emails: [
508
- { id: "bl_1", email: "competitor-bot@spamtrap.org", reason: "Spam trap detected", added_at: "2026-07-01T10:00:00.000Z" },
509
- { id: "bl_2", email: "ceo@opt-out-forever.com", reason: "Direct legal opt-out", added_at: "2026-07-12T14:20:00.000Z" }
510
- ],
511
- domains: [
512
- { id: "bld_1", domain: "mailinator.com", reason: "Disposable email service", added_at: "2026-06-10T09:00:00.000Z" },
513
- { id: "bld_2", domain: "guerrillamail.com", reason: "Temporary inbox", added_at: "2026-06-11T11:00:00.000Z" },
514
- { id: "bld_3", domain: "10minutemail.com", reason: "Temporary inbox", added_at: "2026-06-15T15:00:00.000Z" }
515
- ]
516
- }
517
- };
518
- async function startServer() {
519
- const app = (0, import_express.default)();
520
- const PORT = Number(process.env.PORT) || 3e3;
521
- app.use((0, import_cors.default)({
522
- origin: process.env.CORS_ORIGIN ? process.env.CORS_ORIGIN.split(",") : false,
523
- credentials: true
524
- }));
525
- app.use((0, import_morgan.default)("dev"));
526
- app.use(import_express.default.json());
527
- app.get("/api/health", (req, res) => {
528
- res.json({ status: "ok", timestamp: (/* @__PURE__ */ new Date()).toISOString(), uptime: process.uptime() });
529
- });
530
- const shouldProxyToSmartlead = (apiKey) => {
531
- return Boolean(apiKey && apiKey.length > 10 && !apiKey.startsWith("demo_") && !apiKey.startsWith("mock_"));
532
- };
533
- app.get("/api/campaigns", async (req, res) => {
534
- const apiKey = req.headers["x-api-key"];
535
- if (shouldProxyToSmartlead(apiKey)) {
536
- try {
537
- const response = await import_axios2.default.get("https://server.smartlead.ai/api/v1/campaigns", {
538
- params: { ...req.query, api_key: apiKey },
539
- timeout: 8e3
540
- });
541
- return res.json(response.data);
542
- } catch (err) {
543
- console.warn("Smartlead API live proxy failed, falling back to database mode:", err.message);
544
- }
545
- }
546
- return res.json(mockDb.campaigns);
547
- });
548
- app.post("/api/campaigns", async (req, res) => {
549
- const apiKey = req.headers["x-api-key"];
550
- if (shouldProxyToSmartlead(apiKey)) {
551
- try {
552
- const response = await import_axios2.default.post("https://server.smartlead.ai/api/v1/campaigns", req.body, {
553
- params: { api_key: apiKey },
554
- timeout: 8e3
555
- });
556
- return res.status(201).json(response.data);
557
- } catch (err) {
558
- console.warn("Live create campaign failed, recording in local database:", err.message);
559
- }
560
- }
561
- const newCampaign = {
562
- id: "camp_" + Math.random().toString(36).substring(2, 9),
563
- name: req.body.name || "Untitled Campaign",
564
- status: "PAUSED",
565
- created_at: (/* @__PURE__ */ new Date()).toISOString(),
566
- lead_count: 0,
567
- sent_count: 0,
568
- open_count: 0,
569
- reply_count: 0,
570
- bounce_count: 0,
571
- click_count: 0,
572
- timezone: req.body.timezone || "America/New_York",
573
- start_schedule: req.body.start_schedule || "09:00",
574
- end_schedule: req.body.end_schedule || "17:00",
575
- track_settings: req.body.track_settings || "TRACK_EMAIL_OPEN",
576
- send_as_plain_text: Boolean(req.body.send_as_plain_text),
577
- follow_up_percentage: req.body.follow_up_percentage || 80,
578
- unsubscribe_text: req.body.unsubscribe_text || "Unsubscribe",
579
- stop_lead_settings: req.body.stop_lead_settings || "REPLIED",
580
- sequences: [
581
- {
582
- id: "seq_" + Math.random().toString(36).substring(2, 7),
583
- seq_number: 1,
584
- delay_days: 0,
585
- subject: req.body.initial_subject || "Connecting with {{first_name}}",
586
- email_body: req.body.initial_body || "<p>Hi {{first_name}}, let's connect!</p>",
587
- variant_distribution_percentage: 100,
588
- variants: []
589
- }
590
- ],
591
- email_account_ids: req.body.email_account_ids || []
592
- };
593
- mockDb.campaigns.unshift(newCampaign);
594
- return res.status(201).json(newCampaign);
595
- });
596
- app.get("/api/campaigns/:id", (req, res) => {
597
- const campaign = mockDb.campaigns.find((c) => c.id === req.params.id);
598
- if (!campaign) return res.status(404).json({ error: "Campaign not found" });
599
- return res.json(campaign);
600
- });
601
- app.post("/api/campaigns/:id", (req, res) => {
602
- const index = mockDb.campaigns.findIndex((c) => c.id === req.params.id);
603
- if (index === -1) return res.status(404).json({ error: "Campaign not found" });
604
- mockDb.campaigns[index] = { ...mockDb.campaigns[index], ...req.body };
605
- return res.json(mockDb.campaigns[index]);
606
- });
607
- app.delete("/api/campaigns/:id", (req, res) => {
608
- mockDb.campaigns = mockDb.campaigns.filter((c) => c.id !== req.params.id);
609
- return res.json({ success: true, message: "Campaign deleted successfully" });
610
- });
611
- app.post("/api/campaigns/:id/status", (req, res) => {
612
- const { status } = req.body;
613
- const campaign = mockDb.campaigns.find((c) => c.id === req.params.id);
614
- if (!campaign) return res.status(404).json({ error: "Campaign not found" });
615
- campaign.status = status === "START" ? "ACTIVE" : status === "PAUSE" ? "PAUSED" : "STOPPED";
616
- return res.json({ success: true, status: campaign.status, campaign });
617
- });
618
- app.post("/api/campaigns/:id/schedule", (req, res) => {
619
- const campaign = mockDb.campaigns.find((c) => c.id === req.params.id);
620
- if (!campaign) return res.status(404).json({ error: "Campaign not found" });
621
- campaign.start_schedule = req.body.start_schedule || campaign.start_schedule;
622
- campaign.end_schedule = req.body.end_schedule || campaign.end_schedule;
623
- campaign.timezone = req.body.timezone || campaign.timezone;
624
- return res.json({ success: true, campaign });
625
- });
626
- app.get("/api/campaigns/:id/sequences", (req, res) => {
627
- const campaign = mockDb.campaigns.find((c) => c.id === req.params.id);
628
- if (!campaign) return res.status(404).json({ error: "Campaign not found" });
629
- return res.json(campaign.sequences || []);
630
- });
631
- app.post("/api/campaigns/:id/sequences", (req, res) => {
632
- const campaign = mockDb.campaigns.find((c) => c.id === req.params.id);
633
- if (!campaign) return res.status(404).json({ error: "Campaign not found" });
634
- campaign.sequences = req.body.sequences || [];
635
- return res.json({ success: true, sequences: campaign.sequences });
636
- });
637
- app.get("/api/campaigns/:id/email-accounts", (req, res) => {
638
- const campaign = mockDb.campaigns.find((c) => c.id === req.params.id);
639
- if (!campaign) return res.status(404).json({ error: "Campaign not found" });
640
- const accounts = mockDb.email_accounts.filter((a) => campaign.email_account_ids?.includes(a.id));
641
- return res.json(accounts);
642
- });
643
- app.post("/api/campaigns/:id/email-accounts", (req, res) => {
644
- const campaign = mockDb.campaigns.find((c) => c.id === req.params.id);
645
- if (!campaign) return res.status(404).json({ error: "Campaign not found" });
646
- const { email_account_id } = req.body;
647
- if (!campaign.email_account_ids) campaign.email_account_ids = [];
648
- if (!campaign.email_account_ids.includes(email_account_id)) {
649
- campaign.email_account_ids.push(email_account_id);
650
- }
651
- return res.json({ success: true, email_account_ids: campaign.email_account_ids });
652
- });
653
- app.delete("/api/campaigns/:id/email-accounts/:eid", (req, res) => {
654
- const campaign = mockDb.campaigns.find((c) => c.id === req.params.id);
655
- if (!campaign) return res.status(404).json({ error: "Campaign not found" });
656
- campaign.email_account_ids = (campaign.email_account_ids || []).filter((id) => id !== req.params.eid);
657
- return res.json({ success: true, email_account_ids: campaign.email_account_ids });
658
- });
659
- app.get("/api/campaigns/:id/analytics", (req, res) => {
660
- const campaign = mockDb.campaigns.find((c) => c.id === req.params.id);
661
- if (!campaign) return res.status(404).json({ error: "Campaign not found" });
662
- return res.json({
663
- sent: campaign.sent_count,
664
- opens: campaign.open_count,
665
- replies: campaign.reply_count,
666
- bounces: campaign.bounce_count,
667
- clicks: campaign.click_count,
668
- open_rate: (campaign.open_count / (campaign.sent_count || 1) * 100).toFixed(1),
669
- reply_rate: (campaign.reply_count / (campaign.sent_count || 1) * 100).toFixed(1),
670
- bounce_rate: (campaign.bounce_count / (campaign.sent_count || 1) * 100).toFixed(1)
671
- });
672
- });
673
- app.get("/api/campaigns/:id/analytics-by-date", (req, res) => {
674
- const days = 14;
675
- const history = [];
676
- const now = /* @__PURE__ */ new Date();
677
- for (let i = days; i >= 0; i--) {
678
- const d = new Date(now.getTime() - i * 24 * 60 * 60 * 1e3);
679
- const dayLabel = d.toLocaleDateString("en-US", { month: "short", day: "numeric" });
680
- history.push({
681
- date: dayLabel,
682
- sent: Math.floor(120 + Math.random() * 80),
683
- opens: Math.floor(65 + Math.random() * 40),
684
- clicks: Math.floor(18 + Math.random() * 15),
685
- replies: Math.floor(8 + Math.random() * 10),
686
- bounces: Math.floor(1 + Math.random() * 3)
687
- });
688
- }
689
- return res.json(history);
690
- });
691
- app.get("/api/campaigns/:id/leads-export", (req, res) => {
692
- const campaignLeads = mockDb.leads.filter((l) => l.campaign_id === req.params.id);
693
- let csv = "first_name,last_name,email,company_name,status,open_count,reply_count\n";
694
- campaignLeads.forEach((l) => {
695
- csv += `"${l.first_name}","${l.last_name}","${l.email}","${l.company_name}","${l.status}",${l.open_count},${l.click_count}
696
- `;
697
- });
698
- res.setHeader("Content-Type", "text/csv");
699
- res.setHeader("Content-Disposition", `attachment; filename=leads-${req.params.id}.csv`);
700
- return res.send(csv);
701
- });
702
- app.get("/api/campaigns/:id/leads", (req, res) => {
703
- const leads = mockDb.leads.filter((l) => l.campaign_id === req.params.id);
704
- return res.json(leads);
705
- });
706
- app.post("/api/campaigns/:id/leads", (req, res) => {
707
- const leadsToAdd = Array.isArray(req.body) ? req.body : req.body.leads || [req.body];
708
- const created = leadsToAdd.map((item) => {
709
- const newLead = {
710
- id: "lead_" + Math.random().toString(36).substring(2, 9),
711
- campaign_id: req.params.id,
712
- first_name: item.first_name || "",
713
- last_name: item.last_name || "",
714
- email: item.email || "lead@sample.io",
715
- phone_number: item.phone_number || "",
716
- company_name: item.company_name || "",
717
- website: item.website || "",
718
- location: item.location || "",
719
- linkedin_profile: item.linkedin_profile || "",
720
- status: item.status || "INTERESTED",
721
- open_count: 0,
722
- click_count: 0,
723
- created_at: (/* @__PURE__ */ new Date()).toISOString(),
724
- custom_fields: item.custom_fields || {}
725
- };
726
- mockDb.leads.unshift(newLead);
727
- return newLead;
728
- });
729
- const campaign = mockDb.campaigns.find((c) => c.id === req.params.id);
730
- if (campaign) campaign.lead_count += created.length;
731
- return res.status(201).json({ success: true, count: created.length, leads: created });
732
- });
733
- app.get("/api/leads/search", (req, res) => {
734
- const query = (req.query.q || "").toLowerCase();
735
- const status = req.query.status;
736
- let results = mockDb.leads;
737
- if (query) {
738
- results = results.filter(
739
- (l) => l.first_name.toLowerCase().includes(query) || l.last_name.toLowerCase().includes(query) || l.email.toLowerCase().includes(query) || l.company_name.toLowerCase().includes(query)
740
- );
741
- }
742
- if (status && status !== "ALL") {
743
- results = results.filter((l) => l.status === status);
744
- }
745
- return res.json(results);
746
- });
747
- app.post("/api/campaigns/:id/leads/status", (req, res) => {
748
- const { lead_id, status } = req.body;
749
- const lead = mockDb.leads.find((l) => l.id === lead_id);
750
- if (!lead) return res.status(404).json({ error: "Lead not found" });
751
- lead.status = status;
752
- return res.json({ success: true, lead });
753
- });
754
- app.delete("/api/campaigns/:id/leads/:lead_id", (req, res) => {
755
- mockDb.leads = mockDb.leads.filter((l) => l.id !== req.params.lead_id);
756
- const campaign = mockDb.campaigns.find((c) => c.id === req.params.id);
757
- if (campaign && campaign.lead_count > 0) campaign.lead_count--;
758
- return res.json({ success: true });
759
- });
760
- app.get("/api/leads/block-list", (req, res) => res.json(mockDb.block_list.emails));
761
- app.post("/api/leads/block-list", (req, res) => {
762
- const item = { id: "bl_" + Date.now(), email: req.body.email, reason: req.body.reason || "Manual add", added_at: (/* @__PURE__ */ new Date()).toISOString() };
763
- mockDb.block_list.emails.unshift(item);
764
- res.status(201).json(item);
765
- });
766
- app.delete("/api/leads/block-list/:id", (req, res) => {
767
- mockDb.block_list.emails = mockDb.block_list.emails.filter((e) => e.id !== req.params.id && e.email !== req.params.id);
768
- res.json({ success: true });
769
- });
770
- app.get("/api/leads/domain-block-list", (req, res) => res.json(mockDb.block_list.domains));
771
- app.post("/api/leads/domain-block-list", (req, res) => {
772
- const item = { id: "bld_" + Date.now(), domain: req.body.domain, reason: req.body.reason || "Manual add", added_at: (/* @__PURE__ */ new Date()).toISOString() };
773
- mockDb.block_list.domains.unshift(item);
774
- res.status(201).json(item);
775
- });
776
- app.delete("/api/leads/domain-block-list/:id", (req, res) => {
777
- mockDb.block_list.domains = mockDb.block_list.domains.filter((d) => d.id !== req.params.id && d.domain !== req.params.id);
778
- res.json({ success: true });
779
- });
780
- app.get("/api/email-accounts", (req, res) => res.json(mockDb.email_accounts));
781
- app.post("/api/email-accounts", (req, res) => {
782
- const newAcc = {
783
- id: "acc_" + Math.random().toString(36).substring(2, 8),
784
- from_name: req.body.from_name || "Outbound Rep",
785
- from_email: req.body.from_email || "rep@sampledomain.com",
786
- provider: req.body.provider || "SMTP",
787
- smtp_host: req.body.smtp_host,
788
- smtp_port: req.body.smtp_port,
789
- status: "CONNECTED",
790
- daily_limit: req.body.max_email_per_day || 50,
791
- sent_today: 0,
792
- warmup_enabled: true,
793
- warmup_reputation: "GOOD",
794
- warmup_score: 85,
795
- warmup_daily_count: 10,
796
- ramp_day: 1,
797
- ramp_up_increment: 2,
798
- reply_rate_percentage: 40,
799
- campaigns_assigned: [],
800
- created_at: (/* @__PURE__ */ new Date()).toISOString()
801
- };
802
- mockDb.email_accounts.push(newAcc);
803
- res.status(201).json(newAcc);
804
- });
805
- app.post("/api/email-accounts/reconnect", (req, res) => {
806
- const { account_id } = req.body;
807
- const acc = mockDb.email_accounts.find((a) => a.id === account_id);
808
- if (acc) acc.status = "CONNECTED";
809
- res.json({ success: true, message: "Account reconnected successfully", account: acc });
810
- });
811
- app.delete("/api/email-accounts/:id", (req, res) => {
812
- mockDb.email_accounts = mockDb.email_accounts.filter((a) => a.id !== req.params.id);
813
- res.json({ success: true });
814
- });
815
- app.post("/api/email-accounts/:id/warmup/enable", (req, res) => {
816
- const acc = mockDb.email_accounts.find((a) => a.id === req.params.id);
817
- if (!acc) return res.status(404).json({ error: "Account not found" });
818
- acc.warmup_enabled = true;
819
- res.json({ success: true, account: acc });
820
- });
821
- app.post("/api/email-accounts/:id/warmup/disable", (req, res) => {
822
- const acc = mockDb.email_accounts.find((a) => a.id === req.params.id);
823
- if (!acc) return res.status(404).json({ error: "Account not found" });
824
- acc.warmup_enabled = false;
825
- res.json({ success: true, account: acc });
826
- });
827
- app.get("/api/email-accounts/:id/warmup/stats", (req, res) => {
828
- const acc = mockDb.email_accounts.find((a) => a.id === req.params.id);
829
- if (!acc) return res.status(404).json({ error: "Account not found" });
830
- res.json({
831
- score: acc.warmup_score,
832
- reputation: acc.warmup_reputation,
833
- sent_warmup: acc.warmup_daily_count,
834
- received_warmup: Math.floor(acc.warmup_daily_count * 0.45),
835
- spam_rescued: 2,
836
- ramp_day: acc.ramp_day,
837
- history: [
838
- { day: "Day 1", score: 70 },
839
- { day: "Day 3", score: 78 },
840
- { day: "Day 7", score: 85 },
841
- { day: "Day 10", score: 92 },
842
- { day: "Day 14", score: acc.warmup_score }
843
- ]
844
- });
845
- });
846
- app.post("/api/email-accounts/:id/warmup/settings", (req, res) => {
847
- const acc = mockDb.email_accounts.find((a) => a.id === req.params.id);
848
- if (!acc) return res.status(404).json({ error: "Account not found" });
849
- acc.ramp_up_increment = req.body.ramp_up_increment || acc.ramp_up_increment;
850
- acc.reply_rate_percentage = req.body.reply_rate_percentage || acc.reply_rate_percentage;
851
- res.json({ success: true, account: acc });
852
- });
853
- app.get("/api/inbox", (req, res) => {
854
- const { category, campaign_id } = req.query;
855
- let threads = mockDb.inbox;
856
- if (category && category !== "ALL") {
857
- threads = threads.filter((t) => t.category === category);
858
- }
859
- if (campaign_id) {
860
- threads = threads.filter((t) => t.campaign_id === campaign_id);
861
- }
862
- res.json(threads);
863
- });
864
- app.get("/api/inbox/unread-count", (req, res) => {
865
- const unread = mockDb.inbox.filter((t) => t.unread).length;
866
- res.json({ count: unread });
867
- });
868
- app.post("/api/campaigns/:id/reply-email-thread", (req, res) => {
869
- const { thread_id, reply_body } = req.body;
870
- const thread = mockDb.inbox.find((t) => t.id === thread_id || t.campaign_id === req.params.id);
871
- if (thread) {
872
- thread.unread = false;
873
- thread.messages.push({
874
- id: "m_rep_" + Date.now(),
875
- from: "alex@outbound-alchemist.io",
876
- to: thread.lead_email,
877
- direction: "OUTBOUND",
878
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
879
- body_html: `<p>${reply_body}</p>`
880
- });
881
- return res.json({ success: true, message: "Reply sent successfully", thread });
882
- }
883
- res.json({ success: true, message: "Reply delivered" });
884
- });
885
- app.post("/api/inbox/categorize", (req, res) => {
886
- const { thread_id, category } = req.body;
887
- const thread = mockDb.inbox.find((t) => t.id === thread_id);
888
- if (thread) {
889
- thread.category = category;
890
- const lead = mockDb.leads.find((l) => l.email === thread.lead_email);
891
- if (lead) lead.status = category;
892
- }
893
- res.json({ success: true, category });
894
- });
895
- app.get("/api/webhooks", (req, res) => res.json(mockDb.webhooks));
896
- app.post("/api/webhooks", (req, res) => {
897
- const newWh = {
898
- id: "wh_" + Math.random().toString(36).substring(2, 8),
899
- name: req.body.name || "Custom Webhook Endpoint",
900
- webhook_url: req.body.webhook_url || "https://api.domain.com/webhook",
901
- event_types: req.body.event_types || ["REPLY"],
902
- campaign_id: req.body.campaign_id || null,
903
- status: "ACTIVE",
904
- last_triggered: null,
905
- created_at: (/* @__PURE__ */ new Date()).toISOString()
906
- };
907
- mockDb.webhooks.unshift(newWh);
908
- res.status(201).json(newWh);
909
- });
910
- app.delete("/api/webhooks/:id", (req, res) => {
911
- mockDb.webhooks = mockDb.webhooks.filter((w) => w.id !== req.params.id);
912
- res.json({ success: true });
913
- });
914
- app.post("/api/webhooks/:id/test", (req, res) => {
915
- const wh = mockDb.webhooks.find((w) => w.id === req.params.id);
916
- if (!wh) return res.status(404).json({ error: "Webhook not found" });
917
- const logItem = {
918
- id: "whlog_" + Date.now(),
919
- webhook_id: wh.id,
920
- event_type: wh.event_types[0] || "REPLY",
921
- status_code: 200,
922
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
923
- payload_preview: { lead_email: "test.lead@domain.com", category: "INTERESTED", sentiment: "positive" }
924
- };
925
- mockDb.webhook_logs.unshift(logItem);
926
- wh.last_triggered = (/* @__PURE__ */ new Date()).toISOString();
927
- res.json({ success: true, message: "Test payload sent to endpoint", log: logItem });
928
- });
929
- app.get("/api/webhooks/logs", (req, res) => res.json(mockDb.webhook_logs));
930
- app.get("/api/analytics/campaigns", (req, res) => {
931
- const totalSent = mockDb.campaigns.reduce((acc, c) => acc + c.sent_count, 0);
932
- const totalOpens = mockDb.campaigns.reduce((acc, c) => acc + c.open_count, 0);
933
- const totalReplies = mockDb.campaigns.reduce((acc, c) => acc + c.reply_count, 0);
934
- const totalBounces = mockDb.campaigns.reduce((acc, c) => acc + c.bounce_count, 0);
935
- const totalClicks = mockDb.campaigns.reduce((acc, c) => acc + c.click_count, 0);
936
- const totalLeads = mockDb.campaigns.reduce((acc, c) => acc + c.lead_count, 0);
937
- res.json({
938
- total_campaigns: mockDb.campaigns.length,
939
- total_leads: totalLeads,
940
- total_sent: totalSent,
941
- total_opens: totalOpens,
942
- total_replies: totalReplies,
943
- total_bounces: totalBounces,
944
- total_clicks: totalClicks,
945
- open_rate: (totalOpens / (totalSent || 1) * 100).toFixed(1),
946
- reply_rate: (totalReplies / (totalSent || 1) * 100).toFixed(1),
947
- click_rate: (totalClicks / (totalSent || 1) * 100).toFixed(1),
948
- bounce_rate: (totalBounces / (totalSent || 1) * 100).toFixed(1)
949
- });
950
- });
951
- app.get("/api/clients", (req, res) => res.json(mockDb.clients));
952
- app.post("/api/ai/completion", async (req, res) => {
953
- try {
954
- const { prompt } = req.body;
955
- if (!prompt) {
956
- return res.status(400).json({ error: "Prompt is required" });
957
- }
958
- const response = await getAiCompletionServer(prompt);
959
- res.json({ response });
960
- } catch (error) {
961
- res.status(500).json({ error: "Failed to get AI completion" });
962
- }
963
- });
964
- app.post("/api/clients", (req, res) => {
965
- const newClient = {
966
- id: "cli_" + Math.random().toString(36).substring(2, 7),
967
- name: req.body.name || "New Client",
968
- email: req.body.email || "client@company.com",
969
- company: req.body.company || "Client Company Ltd",
970
- campaigns_count: 0,
971
- leads_count: 0,
972
- created_at: (/* @__PURE__ */ new Date()).toISOString()
973
- };
974
- mockDb.clients.push(newClient);
975
- res.status(201).json(newClient);
976
- });
977
- app.delete("/api/clients/:id", (req, res) => {
978
- mockDb.clients = mockDb.clients.filter((c) => c.id !== req.params.id);
979
- res.json({ success: true });
980
- });
981
- app.use("/api", async (req, res) => {
982
- const apiKey = req.headers["x-api-key"];
983
- if (!apiKey) {
984
- return res.status(401).json({ error: "Missing x-api-key header" });
985
- }
986
- try {
987
- const targetUrl = `https://server.smartlead.ai/api/v1${req.path}`;
988
- const response = await (0, import_axios2.default)({
989
- method: req.method,
990
- url: targetUrl,
991
- data: Object.keys(req.body).length > 0 ? req.body : void 0,
992
- params: { ...req.query, api_key: apiKey },
993
- timeout: 1e4
994
- });
995
- res.status(response.status).json(response.data);
996
- } catch (error) {
997
- if (error.response) {
998
- res.status(error.response.status).json(error.response.data);
999
- } else {
1000
- res.status(500).json({ error: "Proxy connection error", details: error.message });
1001
- }
1002
- }
1003
- });
1004
- if (process.env.NODE_ENV !== "production") {
1005
- const { createServer: createViteServer } = await import("vite");
1006
- const vite = await createViteServer({
1007
- server: { middlewareMode: true },
1008
- appType: "spa"
1009
- });
1010
- app.use(vite.middlewares);
1011
- } else {
1012
- const distPath = import_path.default.join(process.cwd(), "dist");
1013
- app.use(import_express.default.static(distPath));
1014
- app.get("*", (req, res) => {
1015
- res.sendFile(import_path.default.join(distPath, "index.html"));
1016
- });
1017
- }
1018
- app.listen(PORT, "0.0.0.0", () => {
1019
- console.log(`Smartlead Command Hub Server listening on http://0.0.0.0:${PORT}`);
1020
- });
1021
- }
1022
- startServer();
1023
- //# sourceMappingURL=server.cjs.map
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dist/server.cjs.map DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../server.ts", "../src/lib/aiServiceServer.ts"],
4
- "sourcesContent": ["import express from \"express\";\r\nimport cors from \"cors\";\r\nimport morgan from \"morgan\";\r\nimport axios from \"axios\";\r\nimport path from \"path\";\r\nimport { getAiCompletionServer } from \"./src/lib/aiServiceServer\";\r\n\r\n// ...\r\n\r\n// Initial realistic state for fallback / offline / testing mode\r\nlet mockDb = {\r\n campaigns: [\r\n {\r\n id: \"camp_9901\",\r\n name: \"Enterprise SaaS Outbound Q3\",\r\n status: \"ACTIVE\",\r\n created_at: \"2026-07-15T10:00:00.000Z\",\r\n lead_count: 1420,\r\n sent_count: 3840,\r\n open_count: 2150,\r\n reply_count: 168,\r\n bounce_count: 24,\r\n click_count: 430,\r\n timezone: \"America/New_York\",\r\n start_schedule: \"09:00\",\r\n end_schedule: \"18:00\",\r\n track_settings: \"TRACK_EMAIL_OPEN_AND_CLICK\",\r\n send_as_plain_text: false,\r\n follow_up_percentage: 85,\r\n unsubscribe_text: \"Reply unsubscribe to stop receiving emails.\",\r\n stop_lead_settings: \"REPLIED\",\r\n sequences: [\r\n {\r\n id: \"seq_1\",\r\n seq_number: 1,\r\n delay_days: 0,\r\n subject: \"Quick question regarding {{company_name}}'s outbound infrastructure\",\r\n email_body: \"<p>Hi {{first_name}},</p><p>Noticed you are scaling your growth team at {{company_name}}. Are you currently looking to optimize your cold outreach deliverability and warmup automation?</p><p>Best,<br>Alex</p>\",\r\n variant_distribution_percentage: 50,\r\n variants: [\r\n {\r\n id: \"var_1a\",\r\n variant_label: \"Variant A\",\r\n subject: \"Quick question regarding {{company_name}}'s outbound infrastructure\",\r\n email_body: \"<p>Hi {{first_name}},</p><p>Noticed you are scaling your growth team at {{company_name}}. Are you currently looking to optimize your cold outreach deliverability and warmup automation?</p><p>Best,<br>Alex</p>\"\r\n },\r\n {\r\n id: \"var_1b\",\r\n variant_label: \"Variant B (Shorter)\",\r\n subject: \"{{first_name}} - {{company_name}} outbound efficiency\",\r\n email_body: \"<p>Hey {{first_name}},</p><p>We helped similar SaaS leaders double their positive response rates without hitting spam filters. Open to a 3-min loom?</p><p>Alex</p>\"\r\n }\r\n ]\r\n },\r\n {\r\n id: \"seq_2\",\r\n seq_number: 2,\r\n delay_days: 3,\r\n subject: \"Re: Quick question regarding {{company_name}}\",\r\n email_body: \"<p>Hi {{first_name}}, following up on my previous note. Did you have a chance to look at this?</p>\",\r\n variant_distribution_percentage: 100,\r\n variants: []\r\n }\r\n ],\r\n email_account_ids: [\"acc_101\", \"acc_102\"]\r\n },\r\n {\r\n id: \"camp_9902\",\r\n name: \"Fintech Growth & Compliance Sequence\",\r\n status: \"PAUSED\",\r\n created_at: \"2026-07-20T14:30:00.000Z\",\r\n lead_count: 850,\r\n sent_count: 1200,\r\n open_count: 620,\r\n reply_count: 42,\r\n bounce_count: 11,\r\n click_count: 98,\r\n timezone: \"Europe/London\",\r\n start_schedule: \"08:30\",\r\n end_schedule: \"17:30\",\r\n track_settings: \"TRACK_EMAIL_OPEN\",\r\n send_as_plain_text: true,\r\n follow_up_percentage: 90,\r\n unsubscribe_text: \"Click here to unsubscribe\",\r\n stop_lead_settings: \"REPLIED\",\r\n sequences: [\r\n {\r\n id: \"seq_21\",\r\n seq_number: 1,\r\n delay_days: 0,\r\n subject: \"Compliance streamline for {{company_name}}\",\r\n email_body: \"<p>Hi {{first_name}}, wanted to share our automated compliance blueprint tailored for {{company_name}}.</p>\",\r\n variant_distribution_percentage: 100,\r\n variants: []\r\n }\r\n ],\r\n email_account_ids: [\"acc_103\"]\r\n },\r\n {\r\n id: \"camp_9903\",\r\n name: \"AI Tech Founders Pilot\",\r\n status: \"ACTIVE\",\r\n created_at: \"2026-08-01T09:15:00.000Z\",\r\n lead_count: 2400,\r\n sent_count: 6100,\r\n open_count: 3890,\r\n reply_count: 310,\r\n bounce_count: 45,\r\n click_count: 820,\r\n timezone: \"America/Los_Angeles\",\r\n start_schedule: \"09:00\",\r\n end_schedule: \"17:00\",\r\n track_settings: \"TRACK_EMAIL_OPEN_AND_CLICK\",\r\n send_as_plain_text: false,\r\n follow_up_percentage: 100,\r\n unsubscribe_text: \"Unsubscribe\",\r\n stop_lead_settings: \"REPLIED\",\r\n sequences: [\r\n {\r\n id: \"seq_31\",\r\n seq_number: 1,\r\n delay_days: 0,\r\n subject: \"{{first_name}}, accelerating inference pipelines\",\r\n email_body: \"<p>Hi {{first_name}}, saw your launch on Product Hunt! Curious how {{company_name}} is handling model inference latency?</p>\",\r\n variant_distribution_percentage: 100,\r\n variants: []\r\n }\r\n ],\r\n email_account_ids: [\"acc_101\", \"acc_102\", \"acc_104\"]\r\n }\r\n ],\r\n leads: [\r\n {\r\n id: \"lead_1001\",\r\n campaign_id: \"camp_9901\",\r\n first_name: \"Sarah\",\r\n last_name: \"Jenkins\",\r\n email: \"sarah.jenkins@acmepartner.io\",\r\n phone_number: \"+1 415-555-0182\",\r\n company_name: \"Acme Partner Labs\",\r\n website: \"https://acmepartner.io\",\r\n location: \"San Francisco, CA\",\r\n linkedin_profile: \"https://linkedin.com/in/sarahjenkins-sample\",\r\n status: \"INTERESTED\",\r\n open_count: 4,\r\n click_count: 2,\r\n created_at: \"2026-07-16T11:20:00.000Z\",\r\n custom_fields: { tech_stack: \"Node/React\", team_size: \"45\", funding_round: \"Series B\" }\r\n },\r\n {\r\n id: \"lead_1002\",\r\n campaign_id: \"camp_9901\",\r\n first_name: \"Marcus\",\r\n last_name: \"Vance\",\r\n email: \"m.vance@vanguardflow.co\",\r\n phone_number: \"+1 212-555-0199\",\r\n company_name: \"Vanguard Flow Systems\",\r\n website: \"https://vanguardflow.co\",\r\n location: \"New York, NY\",\r\n linkedin_profile: \"https://linkedin.com/in/marcusvance-sample\",\r\n status: \"MEETING_BOOKED\",\r\n open_count: 6,\r\n click_count: 3,\r\n created_at: \"2026-07-16T12:45:00.000Z\",\r\n custom_fields: { tech_stack: \"AWS/Python\", team_size: \"120\", funding_round: \"Series C\" }\r\n },\r\n {\r\n id: \"lead_1003\",\r\n campaign_id: \"camp_9901\",\r\n first_name: \"Elena\",\r\n last_name: \"Rostova\",\r\n email: \"elena@cybercorebiotech.com\",\r\n phone_number: \"+44 20 7946 0912\",\r\n company_name: \"CyberCore Biotech\",\r\n website: \"https://cybercorebiotech.com\",\r\n location: \"London, UK\",\r\n linkedin_profile: \"https://linkedin.com/in/elenarostova\",\r\n status: \"REPLIED\",\r\n open_count: 3,\r\n click_count: 1,\r\n created_at: \"2026-07-17T09:10:00.000Z\",\r\n custom_fields: { tech_stack: \"NextJS\", team_size: \"80\", funding_round: \"Series A\" }\r\n },\r\n {\r\n id: \"lead_1004\",\r\n campaign_id: \"camp_9902\",\r\n first_name: \"David\",\r\n last_name: \"Chen\",\r\n email: \"david.chen@horizonpay.net\",\r\n phone_number: \"+1 650-555-0144\",\r\n company_name: \"Horizon Pay\",\r\n website: \"https://horizonpay.net\",\r\n location: \"Palo Alto, CA\",\r\n linkedin_profile: \"https://linkedin.com/in/davidchen-sample\",\r\n status: \"NOT_INTERESTED\",\r\n open_count: 1,\r\n click_count: 0,\r\n created_at: \"2026-07-21T15:00:00.000Z\",\r\n custom_fields: { tech_stack: \"Go/Postgres\", team_size: \"200\", funding_round: \"Series D\" }\r\n },\r\n {\r\n id: \"lead_1005\",\r\n campaign_id: \"camp_9903\",\r\n first_name: \"Amina\",\r\n last_name: \"Diallo\",\r\n email: \"amina@synapseai.tech\",\r\n phone_number: \"+1 312-555-0177\",\r\n company_name: \"Synapse AI Global\",\r\n website: \"https://synapseai.tech\",\r\n location: \"Chicago, IL\",\r\n linkedin_profile: \"https://linkedin.com/in/aminadiallo\",\r\n status: \"INTERESTED\",\r\n open_count: 5,\r\n click_count: 4,\r\n created_at: \"2026-08-02T10:14:00.000Z\",\r\n custom_fields: { tech_stack: \"PyTorch/Ray\", team_size: \"30\", funding_round: \"Seed\" }\r\n }\r\n ],\r\n email_accounts: [\r\n {\r\n id: \"acc_101\",\r\n from_name: \"Alex Rivera\",\r\n from_email: \"alex@outbound-alchemist.io\",\r\n provider: \"GOOGLE\",\r\n status: \"CONNECTED\",\r\n daily_limit: 50,\r\n sent_today: 34,\r\n warmup_enabled: true,\r\n warmup_reputation: \"EXCELLENT\",\r\n warmup_score: 98,\r\n warmup_daily_count: 25,\r\n ramp_day: 14,\r\n ramp_up_increment: 2,\r\n reply_rate_percentage: 45,\r\n campaigns_assigned: [\"Enterprise SaaS Outbound Q3\", \"AI Tech Founders Pilot\"],\r\n created_at: \"2026-05-10T08:00:00.000Z\"\r\n },\r\n {\r\n id: \"acc_102\",\r\n from_name: \"Alex Rivera (Secondary)\",\r\n from_email: \"alex.rivera@growthmatrix.cc\",\r\n provider: \"MICROSOFT\",\r\n status: \"CONNECTED\",\r\n daily_limit: 45,\r\n sent_today: 28,\r\n warmup_enabled: true,\r\n warmup_reputation: \"GOOD\",\r\n warmup_score: 89,\r\n warmup_daily_count: 20,\r\n ramp_day: 9,\r\n ramp_up_increment: 3,\r\n reply_rate_percentage: 40,\r\n campaigns_assigned: [\"Enterprise SaaS Outbound Q3\", \"AI Tech Founders Pilot\"],\r\n created_at: \"2026-06-01T08:00:00.000Z\"\r\n },\r\n {\r\n id: \"acc_103\",\r\n from_name: \"Elena Rostova\",\r\n from_email: \"elena@fintechoutreach.com\",\r\n provider: \"SMTP\",\r\n smtp_host: \"mail.fintechoutreach.com\",\r\n smtp_port: 587,\r\n status: \"CONNECTED\",\r\n daily_limit: 60,\r\n sent_today: 18,\r\n warmup_enabled: true,\r\n warmup_reputation: \"EXCELLENT\",\r\n warmup_score: 96,\r\n warmup_daily_count: 30,\r\n ramp_day: 22,\r\n ramp_up_increment: 2,\r\n reply_rate_percentage: 50,\r\n campaigns_assigned: [\"Fintech Growth & Compliance Sequence\"],\r\n created_at: \"2026-06-15T08:00:00.000Z\"\r\n },\r\n {\r\n id: \"acc_104\",\r\n from_name: \"Growth Ops Lead\",\r\n from_email: \"ops@aifoundryoutreach.io\",\r\n provider: \"GOOGLE\",\r\n status: \"RECONNECTING\",\r\n daily_limit: 40,\r\n sent_today: 0,\r\n warmup_enabled: false,\r\n warmup_reputation: \"POOR\",\r\n warmup_score: 62,\r\n warmup_daily_count: 0,\r\n ramp_day: 1,\r\n ramp_up_increment: 1,\r\n reply_rate_percentage: 30,\r\n campaigns_assigned: [\"AI Tech Founders Pilot\"],\r\n created_at: \"2026-07-28T08:00:00.000Z\"\r\n }\r\n ],\r\n inbox: [\r\n {\r\n id: \"msg_501\",\r\n campaign_id: \"camp_9901\",\r\n lead_id: \"lead_1001\",\r\n lead_name: \"Sarah Jenkins\",\r\n lead_email: \"sarah.jenkins@acmepartner.io\",\r\n company_name: \"Acme Partner Labs\",\r\n subject: \"Re: Quick question regarding Acme Partner Labs's outbound infrastructure\",\r\n category: \"INTERESTED\",\r\n unread: true,\r\n received_at: \"2026-08-14T19:30:00.000Z\",\r\n messages: [\r\n {\r\n id: \"m_sub_1\",\r\n from: \"alex@outbound-alchemist.io\",\r\n to: \"sarah.jenkins@acmepartner.io\",\r\n direction: \"OUTBOUND\",\r\n timestamp: \"2026-08-14T14:00:00.000Z\",\r\n body_html: \"<p>Hi Sarah, Noticed you are scaling your growth team at Acme Partner Labs. Are you currently looking to optimize your cold outreach deliverability and warmup automation?</p>\"\r\n },\r\n {\r\n id: \"m_sub_2\",\r\n from: \"sarah.jenkins@acmepartner.io\",\r\n to: \"alex@outbound-alchemist.io\",\r\n direction: \"INBOUND\",\r\n timestamp: \"2026-08-14T19:30:00.000Z\",\r\n body_html: \"<p>Hi Alex,</p><p>Yes, perfect timing. We are actually evaluating mailbox warmup tools right now since our SDR team just doubled. Can you send over a brief demo or pricing overview?</p><p>Thanks,<br>Sarah Jenkins | Head of Growth</p>\"\r\n }\r\n ]\r\n },\r\n {\r\n id: \"msg_502\",\r\n campaign_id: \"camp_9901\",\r\n lead_id: \"lead_1002\",\r\n lead_name: \"Marcus Vance\",\r\n lead_email: \"m.vance@vanguardflow.co\",\r\n company_name: \"Vanguard Flow Systems\",\r\n subject: \"Re: Quick question regarding Vanguard Flow Systems\",\r\n category: \"MEETING_BOOKED\",\r\n unread: false,\r\n received_at: \"2026-08-14T16:15:00.000Z\",\r\n messages: [\r\n {\r\n id: \"m_sub_3\",\r\n from: \"alex@outbound-alchemist.io\",\r\n to: \"m.vance@vanguardflow.co\",\r\n direction: \"OUTBOUND\",\r\n timestamp: \"2026-08-13T10:00:00.000Z\",\r\n body_html: \"<p>Hey Marcus, We helped similar SaaS leaders double their positive response rates without hitting spam filters. Open to a 3-min loom?</p>\"\r\n },\r\n {\r\n id: \"m_sub_4\",\r\n from: \"m.vance@vanguardflow.co\",\r\n to: \"alex@outbound-alchemist.io\",\r\n direction: \"INBOUND\",\r\n timestamp: \"2026-08-14T16:15:00.000Z\",\r\n body_html: \"<p>Alex, grabbed a slot on your calendar for Tuesday at 2 PM EST. Talk soon!</p>\"\r\n }\r\n ]\r\n },\r\n {\r\n id: \"msg_503\",\r\n campaign_id: \"camp_9903\",\r\n lead_id: \"lead_1005\",\r\n lead_name: \"Amina Diallo\",\r\n lead_email: \"amina@synapseai.tech\",\r\n company_name: \"Synapse AI Global\",\r\n subject: \"Re: Amina, accelerating inference pipelines\",\r\n category: \"INTERESTED\",\r\n unread: true,\r\n received_at: \"2026-08-14T21:05:00.000Z\",\r\n messages: [\r\n {\r\n id: \"m_sub_5\",\r\n from: \"ops@aifoundryoutreach.io\",\r\n to: \"amina@synapseai.tech\",\r\n direction: \"OUTBOUND\",\r\n timestamp: \"2026-08-14T15:00:00.000Z\",\r\n body_html: \"<p>Hi Amina, saw your launch on Product Hunt! Curious how Synapse AI Global is handling model inference latency?</p>\"\r\n },\r\n {\r\n id: \"m_sub_6\",\r\n from: \"amina@synapseai.tech\",\r\n to: \"ops@aifoundryoutreach.io\",\r\n direction: \"INBOUND\",\r\n timestamp: \"2026-08-14T21:05:00.000Z\",\r\n body_html: \"<p>Thanks! We've built an in-house caching proxy, but always curious to learn about specialized acceleration clusters. Let's connect next week.</p>\"\r\n }\r\n ]\r\n }\r\n ],\r\n webhooks: [\r\n {\r\n id: \"wh_801\",\r\n name: \"Slack Lead Alerts & Zapier Sync\",\r\n webhook_url: \"https://hooks.zapier.com/hooks/catch/912837/b8120a\",\r\n event_types: [\"REPLY\", \"LEAD_CATEGORY_UPDATED\", \"CAMPAIGN_COMPLETED\"],\r\n campaign_id: null,\r\n status: \"ACTIVE\",\r\n last_triggered: \"2026-08-14T21:05:12.000Z\",\r\n created_at: \"2026-06-20T10:00:00.000Z\"\r\n },\r\n {\r\n id: \"wh_802\",\r\n name: \"HubSpot CRM Bi-directional Sync\",\r\n webhook_url: \"https://api.hubapi.com/webhooks/v3/custom-lead-sync\",\r\n event_types: [\"REPLY\", \"BOUNCE\", \"UNSUBSCRIBE\", \"LEAD_CATEGORY_UPDATED\"],\r\n campaign_id: \"camp_9901\",\r\n status: \"ACTIVE\",\r\n last_triggered: \"2026-08-14T19:30:22.000Z\",\r\n created_at: \"2026-07-01T12:00:00.000Z\"\r\n }\r\n ],\r\n webhook_logs: [\r\n {\r\n id: \"whlog_1\",\r\n webhook_id: \"wh_801\",\r\n event_type: \"REPLY\",\r\n status_code: 200,\r\n timestamp: \"2026-08-14T21:05:12.000Z\",\r\n payload_preview: { lead_email: \"amina@synapseai.tech\", category: \"INTERESTED\", sentiment: \"positive\" }\r\n },\r\n {\r\n id: \"whlog_2\",\r\n webhook_id: \"wh_802\",\r\n event_type: \"LEAD_CATEGORY_UPDATED\",\r\n status_code: 200,\r\n timestamp: \"2026-08-14T19:30:22.000Z\",\r\n payload_preview: { lead_email: \"sarah.jenkins@acmepartner.io\", status: \"INTERESTED\" }\r\n }\r\n ],\r\n clients: [\r\n {\r\n id: \"cli_101\",\r\n name: \"Nexus AI Ventures\",\r\n email: \"growth@nexusventures.ai\",\r\n company: \"Nexus AI Ventures Inc.\",\r\n campaigns_count: 2,\r\n leads_count: 3820,\r\n created_at: \"2026-05-15T09:00:00.000Z\"\r\n },\r\n {\r\n id: \"cli_102\",\r\n name: \"Apex Velocity B2B\",\r\n email: \"contact@apexvelocity.io\",\r\n company: \"Apex Velocity Marketing\",\r\n campaigns_count: 1,\r\n leads_count: 1200,\r\n created_at: \"2026-06-10T11:30:00.000Z\"\r\n }\r\n ],\r\n block_list: {\r\n emails: [\r\n { id: \"bl_1\", email: \"competitor-bot@spamtrap.org\", reason: \"Spam trap detected\", added_at: \"2026-07-01T10:00:00.000Z\" },\r\n { id: \"bl_2\", email: \"ceo@opt-out-forever.com\", reason: \"Direct legal opt-out\", added_at: \"2026-07-12T14:20:00.000Z\" }\r\n ],\r\n domains: [\r\n { id: \"bld_1\", domain: \"mailinator.com\", reason: \"Disposable email service\", added_at: \"2026-06-10T09:00:00.000Z\" },\r\n { id: \"bld_2\", domain: \"guerrillamail.com\", reason: \"Temporary inbox\", added_at: \"2026-06-11T11:00:00.000Z\" },\r\n { id: \"bld_3\", domain: \"10minutemail.com\", reason: \"Temporary inbox\", added_at: \"2026-06-15T15:00:00.000Z\" }\r\n ]\r\n }\r\n};\r\n\r\nasync function startServer() {\r\n const app = express();\r\n const PORT = Number(process.env.PORT) || 3000;\r\n\r\n app.use(cors({\r\n origin: process.env.CORS_ORIGIN ? process.env.CORS_ORIGIN.split(',') : false,\r\n credentials: true\r\n }));\r\n app.use(morgan(\"dev\"));\r\n app.use(express.json());\r\n\r\n app.get(\"/api/health\", (req, res) => {\r\n res.json({ status: \"ok\", timestamp: new Date().toISOString(), uptime: process.uptime() });\r\n });\r\n\r\n // Helper to check if real Smartlead API call should be attempted\r\n const shouldProxyToSmartlead = (apiKey: string | undefined) => {\r\n return Boolean(apiKey && apiKey.length > 10 && !apiKey.startsWith(\"demo_\") && !apiKey.startsWith(\"mock_\"));\r\n };\r\n\r\n // ==========================================\r\n // MODULE 1: CAMPAIGNS API\r\n // ==========================================\r\n app.get(\"/api/campaigns\", async (req, res) => {\r\n const apiKey = req.headers[\"x-api-key\"] as string;\r\n if (shouldProxyToSmartlead(apiKey)) {\r\n try {\r\n const response = await axios.get(\"https://server.smartlead.ai/api/v1/campaigns\", {\r\n params: { ...req.query, api_key: apiKey },\r\n timeout: 8000\r\n });\r\n return res.json(response.data);\r\n } catch (err: any) {\r\n console.warn(\"Smartlead API live proxy failed, falling back to database mode:\", err.message);\r\n }\r\n }\r\n return res.json(mockDb.campaigns);\r\n });\r\n\r\n app.post(\"/api/campaigns\", async (req, res) => {\r\n const apiKey = req.headers[\"x-api-key\"] as string;\r\n if (shouldProxyToSmartlead(apiKey)) {\r\n try {\r\n const response = await axios.post(\"https://server.smartlead.ai/api/v1/campaigns\", req.body, {\r\n params: { api_key: apiKey },\r\n timeout: 8000\r\n });\r\n return res.status(201).json(response.data);\r\n } catch (err: any) {\r\n console.warn(\"Live create campaign failed, recording in local database:\", err.message);\r\n }\r\n }\r\n\r\n const newCampaign = {\r\n id: \"camp_\" + Math.random().toString(36).substring(2, 9),\r\n name: req.body.name || \"Untitled Campaign\",\r\n status: \"PAUSED\",\r\n created_at: new Date().toISOString(),\r\n lead_count: 0,\r\n sent_count: 0,\r\n open_count: 0,\r\n reply_count: 0,\r\n bounce_count: 0,\r\n click_count: 0,\r\n timezone: req.body.timezone || \"America/New_York\",\r\n start_schedule: req.body.start_schedule || \"09:00\",\r\n end_schedule: req.body.end_schedule || \"17:00\",\r\n track_settings: req.body.track_settings || \"TRACK_EMAIL_OPEN\",\r\n send_as_plain_text: Boolean(req.body.send_as_plain_text),\r\n follow_up_percentage: req.body.follow_up_percentage || 80,\r\n unsubscribe_text: req.body.unsubscribe_text || \"Unsubscribe\",\r\n stop_lead_settings: req.body.stop_lead_settings || \"REPLIED\",\r\n sequences: [\r\n {\r\n id: \"seq_\" + Math.random().toString(36).substring(2, 7),\r\n seq_number: 1,\r\n delay_days: 0,\r\n subject: req.body.initial_subject || \"Connecting with {{first_name}}\",\r\n email_body: req.body.initial_body || \"<p>Hi {{first_name}}, let's connect!</p>\",\r\n variant_distribution_percentage: 100,\r\n variants: []\r\n }\r\n ],\r\n email_account_ids: req.body.email_account_ids || []\r\n };\r\n mockDb.campaigns.unshift(newCampaign);\r\n return res.status(201).json(newCampaign);\r\n });\r\n\r\n app.get(\"/api/campaigns/:id\", (req, res) => {\r\n const campaign = mockDb.campaigns.find(c => c.id === req.params.id);\r\n if (!campaign) return res.status(404).json({ error: \"Campaign not found\" });\r\n return res.json(campaign);\r\n });\r\n\r\n app.post(\"/api/campaigns/:id\", (req, res) => {\r\n const index = mockDb.campaigns.findIndex(c => c.id === req.params.id);\r\n if (index === -1) return res.status(404).json({ error: \"Campaign not found\" });\r\n mockDb.campaigns[index] = { ...mockDb.campaigns[index], ...req.body };\r\n return res.json(mockDb.campaigns[index]);\r\n });\r\n\r\n app.delete(\"/api/campaigns/:id\", (req, res) => {\r\n mockDb.campaigns = mockDb.campaigns.filter(c => c.id !== req.params.id);\r\n return res.json({ success: true, message: \"Campaign deleted successfully\" });\r\n });\r\n\r\n app.post(\"/api/campaigns/:id/status\", (req, res) => {\r\n const { status } = req.body; // START / PAUSE / STOP\r\n const campaign = mockDb.campaigns.find(c => c.id === req.params.id);\r\n if (!campaign) return res.status(404).json({ error: \"Campaign not found\" });\r\n campaign.status = status === \"START\" ? \"ACTIVE\" : status === \"PAUSE\" ? \"PAUSED\" : \"STOPPED\";\r\n return res.json({ success: true, status: campaign.status, campaign });\r\n });\r\n\r\n app.post(\"/api/campaigns/:id/schedule\", (req, res) => {\r\n const campaign = mockDb.campaigns.find(c => c.id === req.params.id);\r\n if (!campaign) return res.status(404).json({ error: \"Campaign not found\" });\r\n campaign.start_schedule = req.body.start_schedule || campaign.start_schedule;\r\n campaign.end_schedule = req.body.end_schedule || campaign.end_schedule;\r\n campaign.timezone = req.body.timezone || campaign.timezone;\r\n return res.json({ success: true, campaign });\r\n });\r\n\r\n app.get(\"/api/campaigns/:id/sequences\", (req, res) => {\r\n const campaign = mockDb.campaigns.find(c => c.id === req.params.id);\r\n if (!campaign) return res.status(404).json({ error: \"Campaign not found\" });\r\n return res.json(campaign.sequences || []);\r\n });\r\n\r\n app.post(\"/api/campaigns/:id/sequences\", (req, res) => {\r\n const campaign = mockDb.campaigns.find(c => c.id === req.params.id);\r\n if (!campaign) return res.status(404).json({ error: \"Campaign not found\" });\r\n campaign.sequences = req.body.sequences || [];\r\n return res.json({ success: true, sequences: campaign.sequences });\r\n });\r\n\r\n app.get(\"/api/campaigns/:id/email-accounts\", (req, res) => {\r\n const campaign = mockDb.campaigns.find(c => c.id === req.params.id);\r\n if (!campaign) return res.status(404).json({ error: \"Campaign not found\" });\r\n const accounts = mockDb.email_accounts.filter(a => campaign.email_account_ids?.includes(a.id));\r\n return res.json(accounts);\r\n });\r\n\r\n app.post(\"/api/campaigns/:id/email-accounts\", (req, res) => {\r\n const campaign = mockDb.campaigns.find(c => c.id === req.params.id);\r\n if (!campaign) return res.status(404).json({ error: \"Campaign not found\" });\r\n const { email_account_id } = req.body;\r\n if (!campaign.email_account_ids) campaign.email_account_ids = [];\r\n if (!campaign.email_account_ids.includes(email_account_id)) {\r\n campaign.email_account_ids.push(email_account_id);\r\n }\r\n return res.json({ success: true, email_account_ids: campaign.email_account_ids });\r\n });\r\n\r\n app.delete(\"/api/campaigns/:id/email-accounts/:eid\", (req, res) => {\r\n const campaign = mockDb.campaigns.find(c => c.id === req.params.id);\r\n if (!campaign) return res.status(404).json({ error: \"Campaign not found\" });\r\n campaign.email_account_ids = (campaign.email_account_ids || []).filter(id => id !== req.params.eid);\r\n return res.json({ success: true, email_account_ids: campaign.email_account_ids });\r\n });\r\n\r\n app.get(\"/api/campaigns/:id/analytics\", (req, res) => {\r\n const campaign = mockDb.campaigns.find(c => c.id === req.params.id);\r\n if (!campaign) return res.status(404).json({ error: \"Campaign not found\" });\r\n return res.json({\r\n sent: campaign.sent_count,\r\n opens: campaign.open_count,\r\n replies: campaign.reply_count,\r\n bounces: campaign.bounce_count,\r\n clicks: campaign.click_count,\r\n open_rate: ((campaign.open_count / (campaign.sent_count || 1)) * 100).toFixed(1),\r\n reply_rate: ((campaign.reply_count / (campaign.sent_count || 1)) * 100).toFixed(1),\r\n bounce_rate: ((campaign.bounce_count / (campaign.sent_count || 1)) * 100).toFixed(1)\r\n });\r\n });\r\n\r\n app.get(\"/api/campaigns/:id/analytics-by-date\", (req, res) => {\r\n const days = 14;\r\n const history = [];\r\n const now = new Date();\r\n for (let i = days; i >= 0; i--) {\r\n const d = new Date(now.getTime() - i * 24 * 60 * 60 * 1000);\r\n const dayLabel = d.toLocaleDateString(\"en-US\", { month: \"short\", day: \"numeric\" });\r\n history.push({\r\n date: dayLabel,\r\n sent: Math.floor(120 + Math.random() * 80),\r\n opens: Math.floor(65 + Math.random() * 40),\r\n clicks: Math.floor(18 + Math.random() * 15),\r\n replies: Math.floor(8 + Math.random() * 10),\r\n bounces: Math.floor(1 + Math.random() * 3)\r\n });\r\n }\r\n return res.json(history);\r\n });\r\n\r\n app.get(\"/api/campaigns/:id/leads-export\", (req, res) => {\r\n const campaignLeads = mockDb.leads.filter(l => l.campaign_id === req.params.id);\r\n let csv = \"first_name,last_name,email,company_name,status,open_count,reply_count\\n\";\r\n campaignLeads.forEach(l => {\r\n csv += `\"${l.first_name}\",\"${l.last_name}\",\"${l.email}\",\"${l.company_name}\",\"${l.status}\",${l.open_count},${l.click_count}\\n`;\r\n });\r\n res.setHeader(\"Content-Type\", \"text/csv\");\r\n res.setHeader(\"Content-Disposition\", `attachment; filename=leads-${req.params.id}.csv`);\r\n return res.send(csv);\r\n });\r\n\r\n // ==========================================\r\n // MODULE 2: LEADS API\r\n // ==========================================\r\n app.get(\"/api/campaigns/:id/leads\", (req, res) => {\r\n const leads = mockDb.leads.filter(l => l.campaign_id === req.params.id);\r\n return res.json(leads);\r\n });\r\n\r\n app.post(\"/api/campaigns/:id/leads\", (req, res) => {\r\n const leadsToAdd = Array.isArray(req.body) ? req.body : req.body.leads || [req.body];\r\n const created = leadsToAdd.map((item: any) => {\r\n const newLead = {\r\n id: \"lead_\" + Math.random().toString(36).substring(2, 9),\r\n campaign_id: req.params.id,\r\n first_name: item.first_name || \"\",\r\n last_name: item.last_name || \"\",\r\n email: item.email || \"lead@sample.io\",\r\n phone_number: item.phone_number || \"\",\r\n company_name: item.company_name || \"\",\r\n website: item.website || \"\",\r\n location: item.location || \"\",\r\n linkedin_profile: item.linkedin_profile || \"\",\r\n status: item.status || \"INTERESTED\",\r\n open_count: 0,\r\n click_count: 0,\r\n created_at: new Date().toISOString(),\r\n custom_fields: item.custom_fields || {}\r\n };\r\n mockDb.leads.unshift(newLead);\r\n return newLead;\r\n });\r\n\r\n const campaign = mockDb.campaigns.find(c => c.id === req.params.id);\r\n if (campaign) campaign.lead_count += created.length;\r\n\r\n return res.status(201).json({ success: true, count: created.length, leads: created });\r\n });\r\n\r\n app.get(\"/api/leads/search\", (req, res) => {\r\n const query = (req.query.q as string || \"\").toLowerCase();\r\n const status = req.query.status as string;\r\n let results = mockDb.leads;\r\n if (query) {\r\n results = results.filter(l =>\r\n l.first_name.toLowerCase().includes(query) ||\r\n l.last_name.toLowerCase().includes(query) ||\r\n l.email.toLowerCase().includes(query) ||\r\n l.company_name.toLowerCase().includes(query)\r\n );\r\n }\r\n if (status && status !== \"ALL\") {\r\n results = results.filter(l => l.status === status);\r\n }\r\n return res.json(results);\r\n });\r\n\r\n app.post(\"/api/campaigns/:id/leads/status\", (req, res) => {\r\n const { lead_id, status } = req.body;\r\n const lead = mockDb.leads.find(l => l.id === lead_id);\r\n if (!lead) return res.status(404).json({ error: \"Lead not found\" });\r\n lead.status = status;\r\n return res.json({ success: true, lead });\r\n });\r\n\r\n app.delete(\"/api/campaigns/:id/leads/:lead_id\", (req, res) => {\r\n mockDb.leads = mockDb.leads.filter(l => l.id !== req.params.lead_id);\r\n const campaign = mockDb.campaigns.find(c => c.id === req.params.id);\r\n if (campaign && campaign.lead_count > 0) campaign.lead_count--;\r\n return res.json({ success: true });\r\n });\r\n\r\n // Blocklist routes\r\n app.get(\"/api/leads/block-list\", (req, res) => res.json(mockDb.block_list.emails));\r\n app.post(\"/api/leads/block-list\", (req, res) => {\r\n const item = { id: \"bl_\" + Date.now(), email: req.body.email, reason: req.body.reason || \"Manual add\", added_at: new Date().toISOString() };\r\n mockDb.block_list.emails.unshift(item);\r\n res.status(201).json(item);\r\n });\r\n app.delete(\"/api/leads/block-list/:id\", (req, res) => {\r\n mockDb.block_list.emails = mockDb.block_list.emails.filter(e => e.id !== req.params.id && e.email !== req.params.id);\r\n res.json({ success: true });\r\n });\r\n\r\n app.get(\"/api/leads/domain-block-list\", (req, res) => res.json(mockDb.block_list.domains));\r\n app.post(\"/api/leads/domain-block-list\", (req, res) => {\r\n const item = { id: \"bld_\" + Date.now(), domain: req.body.domain, reason: req.body.reason || \"Manual add\", added_at: new Date().toISOString() };\r\n mockDb.block_list.domains.unshift(item);\r\n res.status(201).json(item);\r\n });\r\n app.delete(\"/api/leads/domain-block-list/:id\", (req, res) => {\r\n mockDb.block_list.domains = mockDb.block_list.domains.filter(d => d.id !== req.params.id && d.domain !== req.params.id);\r\n res.json({ success: true });\r\n });\r\n\r\n // ==========================================\r\n // MODULE 3: EMAIL ACCOUNTS API\r\n // ==========================================\r\n app.get(\"/api/email-accounts\", (req, res) => res.json(mockDb.email_accounts));\r\n \r\n app.post(\"/api/email-accounts\", (req, res) => {\r\n const newAcc = {\r\n id: \"acc_\" + Math.random().toString(36).substring(2, 8),\r\n from_name: req.body.from_name || \"Outbound Rep\",\r\n from_email: req.body.from_email || \"rep@sampledomain.com\",\r\n provider: req.body.provider || \"SMTP\",\r\n smtp_host: req.body.smtp_host,\r\n smtp_port: req.body.smtp_port,\r\n status: \"CONNECTED\",\r\n daily_limit: req.body.max_email_per_day || 50,\r\n sent_today: 0,\r\n warmup_enabled: true,\r\n warmup_reputation: \"GOOD\",\r\n warmup_score: 85,\r\n warmup_daily_count: 10,\r\n ramp_day: 1,\r\n ramp_up_increment: 2,\r\n reply_rate_percentage: 40,\r\n campaigns_assigned: [],\r\n created_at: new Date().toISOString()\r\n };\r\n mockDb.email_accounts.push(newAcc);\r\n res.status(201).json(newAcc);\r\n });\r\n\r\n app.post(\"/api/email-accounts/reconnect\", (req, res) => {\r\n const { account_id } = req.body;\r\n const acc = mockDb.email_accounts.find(a => a.id === account_id);\r\n if (acc) acc.status = \"CONNECTED\";\r\n res.json({ success: true, message: \"Account reconnected successfully\", account: acc });\r\n });\r\n\r\n app.delete(\"/api/email-accounts/:id\", (req, res) => {\r\n mockDb.email_accounts = mockDb.email_accounts.filter(a => a.id !== req.params.id);\r\n res.json({ success: true });\r\n });\r\n\r\n // ==========================================\r\n // MODULE 4: EMAIL WARMUP API\r\n // ==========================================\r\n app.post(\"/api/email-accounts/:id/warmup/enable\", (req, res) => {\r\n const acc = mockDb.email_accounts.find(a => a.id === req.params.id);\r\n if (!acc) return res.status(404).json({ error: \"Account not found\" });\r\n acc.warmup_enabled = true;\r\n res.json({ success: true, account: acc });\r\n });\r\n\r\n app.post(\"/api/email-accounts/:id/warmup/disable\", (req, res) => {\r\n const acc = mockDb.email_accounts.find(a => a.id === req.params.id);\r\n if (!acc) return res.status(404).json({ error: \"Account not found\" });\r\n acc.warmup_enabled = false;\r\n res.json({ success: true, account: acc });\r\n });\r\n\r\n app.get(\"/api/email-accounts/:id/warmup/stats\", (req, res) => {\r\n const acc = mockDb.email_accounts.find(a => a.id === req.params.id);\r\n if (!acc) return res.status(404).json({ error: \"Account not found\" });\r\n res.json({\r\n score: acc.warmup_score,\r\n reputation: acc.warmup_reputation,\r\n sent_warmup: acc.warmup_daily_count,\r\n received_warmup: Math.floor(acc.warmup_daily_count * 0.45),\r\n spam_rescued: 2,\r\n ramp_day: acc.ramp_day,\r\n history: [\r\n { day: \"Day 1\", score: 70 },\r\n { day: \"Day 3\", score: 78 },\r\n { day: \"Day 7\", score: 85 },\r\n { day: \"Day 10\", score: 92 },\r\n { day: \"Day 14\", score: acc.warmup_score }\r\n ]\r\n });\r\n });\r\n\r\n app.post(\"/api/email-accounts/:id/warmup/settings\", (req, res) => {\r\n const acc = mockDb.email_accounts.find(a => a.id === req.params.id);\r\n if (!acc) return res.status(404).json({ error: \"Account not found\" });\r\n acc.ramp_up_increment = req.body.ramp_up_increment || acc.ramp_up_increment;\r\n acc.reply_rate_percentage = req.body.reply_rate_percentage || acc.reply_rate_percentage;\r\n res.json({ success: true, account: acc });\r\n });\r\n\r\n // ==========================================\r\n // MODULE 5: UNIFIED INBOX API\r\n // ==========================================\r\n app.get(\"/api/inbox\", (req, res) => {\r\n const { category, campaign_id } = req.query;\r\n let threads = mockDb.inbox;\r\n if (category && category !== \"ALL\") {\r\n threads = threads.filter(t => t.category === category);\r\n }\r\n if (campaign_id) {\r\n threads = threads.filter(t => t.campaign_id === campaign_id);\r\n }\r\n res.json(threads);\r\n });\r\n\r\n app.get(\"/api/inbox/unread-count\", (req, res) => {\r\n const unread = mockDb.inbox.filter(t => t.unread).length;\r\n res.json({ count: unread });\r\n });\r\n\r\n app.post(\"/api/campaigns/:id/reply-email-thread\", (req, res) => {\r\n const { thread_id, reply_body } = req.body;\r\n const thread = mockDb.inbox.find(t => t.id === thread_id || t.campaign_id === req.params.id);\r\n if (thread) {\r\n thread.unread = false;\r\n thread.messages.push({\r\n id: \"m_rep_\" + Date.now(),\r\n from: \"alex@outbound-alchemist.io\",\r\n to: thread.lead_email,\r\n direction: \"OUTBOUND\",\r\n timestamp: new Date().toISOString(),\r\n body_html: `<p>${reply_body}</p>`\r\n });\r\n return res.json({ success: true, message: \"Reply sent successfully\", thread });\r\n }\r\n res.json({ success: true, message: \"Reply delivered\" });\r\n });\r\n\r\n app.post(\"/api/inbox/categorize\", (req, res) => {\r\n const { thread_id, category } = req.body;\r\n const thread = mockDb.inbox.find(t => t.id === thread_id);\r\n if (thread) {\r\n thread.category = category;\r\n const lead = mockDb.leads.find(l => l.email === thread.lead_email);\r\n if (lead) lead.status = category;\r\n }\r\n res.json({ success: true, category });\r\n });\r\n\r\n // ==========================================\r\n // MODULE 6: WEBHOOKS API\r\n // ==========================================\r\n app.get(\"/api/webhooks\", (req, res) => res.json(mockDb.webhooks));\r\n \r\n app.post(\"/api/webhooks\", (req, res) => {\r\n const newWh = {\r\n id: \"wh_\" + Math.random().toString(36).substring(2, 8),\r\n name: req.body.name || \"Custom Webhook Endpoint\",\r\n webhook_url: req.body.webhook_url || \"https://api.domain.com/webhook\",\r\n event_types: req.body.event_types || [\"REPLY\"],\r\n campaign_id: req.body.campaign_id || null,\r\n status: \"ACTIVE\",\r\n last_triggered: null,\r\n created_at: new Date().toISOString()\r\n };\r\n mockDb.webhooks.unshift(newWh);\r\n res.status(201).json(newWh);\r\n });\r\n\r\n app.delete(\"/api/webhooks/:id\", (req, res) => {\r\n mockDb.webhooks = mockDb.webhooks.filter(w => w.id !== req.params.id);\r\n res.json({ success: true });\r\n });\r\n\r\n app.post(\"/api/webhooks/:id/test\", (req, res) => {\r\n const wh = mockDb.webhooks.find(w => w.id === req.params.id);\r\n if (!wh) return res.status(404).json({ error: \"Webhook not found\" });\r\n const logItem = {\r\n id: \"whlog_\" + Date.now(),\r\n webhook_id: wh.id,\r\n event_type: wh.event_types[0] || \"REPLY\",\r\n status_code: 200,\r\n timestamp: new Date().toISOString(),\r\n payload_preview: { lead_email: \"test.lead@domain.com\", category: \"INTERESTED\", sentiment: \"positive\" }\r\n } as const;\r\n mockDb.webhook_logs.unshift(logItem);\r\n wh.last_triggered = new Date().toISOString();\r\n res.json({ success: true, message: \"Test payload sent to endpoint\", log: logItem });\r\n });\r\n\r\n app.get(\"/api/webhooks/logs\", (req, res) => res.json(mockDb.webhook_logs));\r\n\r\n // ==========================================\r\n // MODULE 7: ANALYTICS API\r\n // ==========================================\r\n app.get(\"/api/analytics/campaigns\", (req, res) => {\r\n const totalSent = mockDb.campaigns.reduce((acc, c) => acc + c.sent_count, 0);\r\n const totalOpens = mockDb.campaigns.reduce((acc, c) => acc + c.open_count, 0);\r\n const totalReplies = mockDb.campaigns.reduce((acc, c) => acc + c.reply_count, 0);\r\n const totalBounces = mockDb.campaigns.reduce((acc, c) => acc + c.bounce_count, 0);\r\n const totalClicks = mockDb.campaigns.reduce((acc, c) => acc + c.click_count, 0);\r\n const totalLeads = mockDb.campaigns.reduce((acc, c) => acc + c.lead_count, 0);\r\n\r\n res.json({\r\n total_campaigns: mockDb.campaigns.length,\r\n total_leads: totalLeads,\r\n total_sent: totalSent,\r\n total_opens: totalOpens,\r\n total_replies: totalReplies,\r\n total_bounces: totalBounces,\r\n total_clicks: totalClicks,\r\n open_rate: ((totalOpens / (totalSent || 1)) * 100).toFixed(1),\r\n reply_rate: ((totalReplies / (totalSent || 1)) * 100).toFixed(1),\r\n click_rate: ((totalClicks / (totalSent || 1)) * 100).toFixed(1),\r\n bounce_rate: ((totalBounces / (totalSent || 1)) * 100).toFixed(1)\r\n });\r\n });\r\n\r\n // ==========================================\r\n // MODULE 8: CLIENT MANAGEMENT API\r\n // ==========================================\r\n app.get(\"/api/clients\", (req, res) => res.json(mockDb.clients));\r\n\r\napp.post(\"/api/ai/completion\", async (req, res) => {\r\n try {\r\n const { prompt } = req.body;\r\n if (!prompt) {\r\n return res.status(400).json({ error: \"Prompt is required\" });\r\n }\r\n const response = await getAiCompletionServer(prompt);\r\n res.json({ response });\r\n } catch (error) {\r\n res.status(500).json({ error: \"Failed to get AI completion\" });\r\n }\r\n});\r\n\r\n \r\n app.post(\"/api/clients\", (req, res) => {\r\n const newClient = {\r\n id: \"cli_\" + Math.random().toString(36).substring(2, 7),\r\n name: req.body.name || \"New Client\",\r\n email: req.body.email || \"client@company.com\",\r\n company: req.body.company || \"Client Company Ltd\",\r\n campaigns_count: 0,\r\n leads_count: 0,\r\n created_at: new Date().toISOString()\r\n };\r\n mockDb.clients.push(newClient);\r\n res.status(201).json(newClient);\r\n });\r\n\r\n app.delete(\"/api/clients/:id\", (req, res) => {\r\n mockDb.clients = mockDb.clients.filter(c => c.id !== req.params.id);\r\n res.json({ success: true });\r\n });\r\n\r\n // Proxy Catch-All for any other direct Smartlead API calls\r\n app.use(\"/api\", async (req, res) => {\r\n const apiKey = req.headers[\"x-api-key\"] as string;\r\n if (!apiKey) {\r\n return res.status(401).json({ error: \"Missing x-api-key header\" });\r\n }\r\n\r\n try {\r\n const targetUrl = `https://server.smartlead.ai/api/v1${req.path}`;\r\n const response = await axios({\r\n method: req.method,\r\n url: targetUrl,\r\n data: Object.keys(req.body).length > 0 ? req.body : undefined,\r\n params: { ...req.query, api_key: apiKey },\r\n timeout: 10000\r\n });\r\n res.status(response.status).json(response.data);\r\n } catch (error: any) {\r\n if (error.response) {\r\n res.status(error.response.status).json(error.response.data);\r\n } else {\r\n res.status(500).json({ error: \"Proxy connection error\", details: error.message });\r\n }\r\n }\r\n });\r\n\r\n // Vite development middleware or production static serving\r\n if (process.env.NODE_ENV !== \"production\") {\r\n const { createServer: createViteServer } = await import(\"vite\");\r\n const vite = await createViteServer({\r\n server: { middlewareMode: true },\r\n appType: \"spa\",\r\n });\r\n app.use(vite.middlewares);\r\n } else {\r\n const distPath = path.join(process.cwd(), \"dist\");\r\n app.use(express.static(distPath));\r\n app.get(\"*\", (req, res) => {\r\n res.sendFile(path.join(distPath, \"index.html\"));\r\n });\r\n }\r\n\r\n app.listen(PORT, \"0.0.0.0\", () => {\r\n console.log(`Smartlead Command Hub Server listening on http://0.0.0.0:${PORT}`);\r\n });\r\n}\r\n\r\nstartServer();\r\n", "import axios from 'axios';\n\nconst OPENROUTER_API_URL = 'https://openrouter.ai/api/v1/chat/completions';\n\nconst FREE_MISTRAL_MODELS = [\n 'mistralai/mistral-7b-instruct',\n 'mistralai/mixtral-8x7b-instruct',\n 'mistralai/mistral-nemo'\n];\n\nlet currentModelIndex = 0;\n\nexport async function getAiCompletionServer(prompt: string): Promise<string> {\n let attempts = 0;\n\n while (attempts < FREE_MISTRAL_MODELS.length) {\n const model = FREE_MISTRAL_MODELS[currentModelIndex];\n try {\n const response = await axios.post(\n OPENROUTER_API_URL,\n {\n model: model,\n messages: [{ role: 'user', content: prompt }],\n },\n {\n headers: {\n 'Authorization': `Bearer ${process.env.OPENROUTER_API_KEY}`,\n 'HTTP-Referer': process.env.APP_URL || 'http://localhost:3000',\n 'X-Title': 'BRIDGE ModulS Dashboard',\n },\n }\n );\n return response.data.choices[0].message.content;\n } catch (error) {\n console.error(`Error with model ${model}:`, error);\n attempts++;\n currentModelIndex = (currentModelIndex + 1) % FREE_MISTRAL_MODELS.length;\n }\n }\n\n throw new Error('All Mistral models failed.');\n}\n"],
5
- "mappings": "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",
6
- "names": ["import_axios", "axios", "express", "cors", "morgan", "axios", "path"]
7
- }