cleanup: remove dist from image repo
Browse files- dist/assets/index-BkQoDH_4.js +0 -0
- dist/assets/index-CfsDHs3X.css +0 -1
- dist/index.html +0 -22
- dist/server.cjs +0 -1023
- dist/server.cjs.map +0 -7
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 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|