@syke1/mcp-server 1.8.8 → 1.8.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -464,6 +464,7 @@ document.addEventListener("DOMContentLoaded", async () => {
464
464
  setupSettings();
465
465
  setupProjectModal();
466
466
  setupLicenseModal();
467
+ setupUpgradeModal();
467
468
  setupAIKeysModal();
468
469
  setupAIProviderSelector();
469
470
  setupFileTree();
@@ -2116,9 +2117,9 @@ function setupEventListeners() {
2116
2117
  upgradeLink.textContent = "UPGRADE TO CORTEX (+$150/yr)";
2117
2118
  if (priceNote) priceNote.textContent = "$249/yr · 14-day money-back guarantee";
2118
2119
  } else {
2119
- // Pro Monthly $9/mo → Cortex Monthly $29/mo = +$20/mo
2120
- planInfo.textContent = "You're on Pro ($9/mo). Upgrade to Cortex for just $20/mo more.";
2121
- upgradeLink.textContent = "UPGRADE TO CORTEX (+$20/mo)";
2120
+ // Pro Monthly $12/mo → Cortex Monthly $29/mo = +$17/mo
2121
+ planInfo.textContent = "You're on Pro ($12/mo). Upgrade to Cortex for just $17/mo more.";
2122
+ upgradeLink.textContent = "UPGRADE TO CORTEX (+$17/mo)";
2122
2123
  if (priceNote) priceNote.textContent = "$29/mo · $249/yr · 14-day money-back guarantee";
2123
2124
  }
2124
2125
  } else {
@@ -3719,6 +3720,7 @@ function hideServerOffline() {
3719
3720
 
3720
3721
  let _currentPlan = "free"; // track current plan for Cortex modal
3721
3722
  let _billingPeriod = null; // "monthly" | "annual" | null
3723
+ let _expiresAt = null; // ISO date string for trial/subscription expiry
3722
3724
 
3723
3725
  async function loadProjectInfo() {
3724
3726
  try {
@@ -3726,6 +3728,7 @@ async function loadProjectInfo() {
3726
3728
  const info = await res.json();
3727
3729
  _currentPlan = info.plan || "free";
3728
3730
  _billingPeriod = info.billingPeriod || null;
3731
+ _expiresAt = info.expiresAt || null;
3729
3732
  const el = document.getElementById("current-project");
3730
3733
  if (el) {
3731
3734
  const short = info.projectRoot.length > 50
@@ -3744,6 +3747,7 @@ async function loadProjectInfo() {
3744
3747
  hideServerOffline();
3745
3748
  updateLicenseBadge(info.plan, info.expiresAt);
3746
3749
  updateLicenseButton(info.plan);
3750
+ updateUpgradeButton(info.plan);
3747
3751
  // Bottom bar: fetch version from npm registry
3748
3752
  updateBottomBar();
3749
3753
  } catch (e) {
@@ -3980,6 +3984,7 @@ function setupLicenseModal() {
3980
3984
  statusEl.textContent = data.plan === "pro_trial" ? "TRIAL-PRO ACTIVATED" : "PRO ACTIVATED";
3981
3985
  updateLicenseBadge(data.plan, data.expiresAt);
3982
3986
  updateLicenseButton(data.plan);
3987
+ updateUpgradeButton(data.plan);
3983
3988
  setTimeout(closeModal, 1200);
3984
3989
  } else {
3985
3990
  statusEl.className = "error";
@@ -4009,6 +4014,7 @@ function setupLicenseModal() {
4009
4014
  statusEl.textContent = "KEY REMOVED";
4010
4015
  updateLicenseBadge("free", null);
4011
4016
  updateLicenseButton("free");
4017
+ updateUpgradeButton("free");
4012
4018
  setTimeout(closeModal, 800);
4013
4019
  }
4014
4020
  } catch {
@@ -4029,6 +4035,192 @@ function updateLicenseButton(plan) {
4029
4035
  btn.textContent = (plan === "pro" || plan === "pro_trial") ? "LICENSED" : "LICENSE";
4030
4036
  }
4031
4037
 
4038
+ // ══════════════════════════════════════════════════════════════
4039
+ // UPGRADE BUTTON + MODAL
4040
+ // ══════════════════════════════════════════════════════════════
4041
+ function updateUpgradeButton(plan) {
4042
+ const btn = document.getElementById("btn-upgrade");
4043
+ if (!btn) return;
4044
+
4045
+ const p = (plan || "free").toLowerCase();
4046
+
4047
+ if (p === "cortex" || p === "cortex_trial") {
4048
+ // Cortex users: hide upgrade button
4049
+ btn.classList.add("hidden");
4050
+ btn.className = "top-btn upgrade-btn hidden";
4051
+ } else if (p === "pro" || p === "pro_trial") {
4052
+ // Pro users: show "CORTEX" button (magenta)
4053
+ btn.classList.remove("hidden");
4054
+ btn.className = "top-btn upgrade-btn upgrade-cortex";
4055
+ btn.innerHTML = "→ CORTEX";
4056
+ } else {
4057
+ // Free / Trial: show "UPGRADE" with pulse
4058
+ btn.classList.remove("hidden");
4059
+ btn.className = "top-btn upgrade-btn upgrade-pulse";
4060
+ btn.innerHTML = "UPGRADE ↑";
4061
+ }
4062
+
4063
+ // Update trial badge with days left
4064
+ updateTrialBadge(p);
4065
+ }
4066
+
4067
+ function updateTrialBadge(plan) {
4068
+ const badge = document.getElementById("license-badge");
4069
+ if (!badge) return;
4070
+
4071
+ if ((plan === "pro_trial" || plan === "trial") && _expiresAt) {
4072
+ const now = new Date();
4073
+ const exp = new Date(_expiresAt);
4074
+ const daysLeft = Math.max(0, Math.ceil((exp - now) / (1000 * 60 * 60 * 24)));
4075
+ badge.textContent = "TRIAL \u00B7 " + daysLeft + "d left";
4076
+ badge.className = "license-badge trial-days";
4077
+ }
4078
+ }
4079
+
4080
+ function openUpgradeModal() {
4081
+ const modal = document.getElementById("upgrade-modal");
4082
+ const title = document.getElementById("upgrade-modal-title");
4083
+ const proCard = document.getElementById("upgrade-card-pro");
4084
+ const cortexCard = document.getElementById("upgrade-card-cortex");
4085
+ const cardsContainer = document.getElementById("upgrade-cards");
4086
+ const currentPlanEl = document.getElementById("upgrade-current-plan");
4087
+ const cortexPrice = document.getElementById("cortex-monthly-price");
4088
+
4089
+ if (!modal) return;
4090
+
4091
+ const plan = (_currentPlan || "free").toLowerCase();
4092
+ const billing = _billingPeriod;
4093
+
4094
+ // Reset layout
4095
+ cardsContainer.classList.remove("cortex-only");
4096
+
4097
+ if (plan === "pro" || plan === "pro_trial") {
4098
+ // Pro user -> show only Cortex card with upgrade pricing
4099
+ title.textContent = "UPGRADE TO CORTEX";
4100
+ proCard.style.display = "none";
4101
+ cortexCard.style.display = "";
4102
+ cardsContainer.classList.add("cortex-only");
4103
+
4104
+ // Show upgrade price note
4105
+ if (billing === "annual") {
4106
+ cortexPrice.innerHTML = '$29<span class="upgrade-price-unit">/mo</span> <span class="upgrade-pro-note">(+$150/yr upgrade)</span>';
4107
+ } else {
4108
+ cortexPrice.innerHTML = '$29<span class="upgrade-price-unit">/mo</span> <span class="upgrade-pro-note">(+$20/mo upgrade)</span>';
4109
+ }
4110
+
4111
+ const planLabel = plan === "pro_trial" ? "TRIAL-PRO" : "PRO";
4112
+ currentPlanEl.textContent = "Current: " + planLabel;
4113
+
4114
+ // Update subscribe button labels for Pro users
4115
+ cortexCard.querySelectorAll(".cortex-subscribe").forEach(function(btn) {
4116
+ if (btn.dataset.plan === "cortex_monthly") {
4117
+ btn.textContent = "UPGRADE MONTHLY";
4118
+ } else if (btn.dataset.plan === "cortex_annual") {
4119
+ btn.textContent = "UPGRADE ANNUAL";
4120
+ }
4121
+ });
4122
+ } else {
4123
+ // Free / Trial -> show both cards
4124
+ title.textContent = "UPGRADE YOUR PLAN";
4125
+ proCard.style.display = "";
4126
+ cortexCard.style.display = "";
4127
+
4128
+ // Reset cortex price (no upgrade note)
4129
+ cortexPrice.innerHTML = '$29<span class="upgrade-price-unit">/mo</span>';
4130
+
4131
+ currentPlanEl.textContent = "Current: FREE";
4132
+
4133
+ // Reset subscribe button labels
4134
+ cortexCard.querySelectorAll(".cortex-subscribe").forEach(function(btn) {
4135
+ if (btn.dataset.plan === "cortex_monthly") {
4136
+ btn.textContent = "SUBSCRIBE";
4137
+ } else if (btn.dataset.plan === "cortex_annual") {
4138
+ btn.textContent = "SUBSCRIBE ANNUAL";
4139
+ }
4140
+ });
4141
+ }
4142
+
4143
+ modal.classList.remove("hidden");
4144
+ }
4145
+
4146
+ function closeUpgradeModal() {
4147
+ var modal = document.getElementById("upgrade-modal");
4148
+ if (modal) modal.classList.add("hidden");
4149
+ }
4150
+
4151
+ function setupUpgradeModal() {
4152
+ var upgradeBtn = document.getElementById("btn-upgrade");
4153
+ var closeBtn = document.getElementById("btn-close-upgrade");
4154
+ var footerClose = document.getElementById("btn-upgrade-close");
4155
+ var modal = document.getElementById("upgrade-modal");
4156
+
4157
+ if (!upgradeBtn || !modal) return;
4158
+
4159
+ // Open modal
4160
+ upgradeBtn.addEventListener("click", openUpgradeModal);
4161
+
4162
+ // Close handlers
4163
+ if (closeBtn) closeBtn.addEventListener("click", closeUpgradeModal);
4164
+ if (footerClose) footerClose.addEventListener("click", closeUpgradeModal);
4165
+
4166
+ // Close on backdrop click
4167
+ modal.addEventListener("click", function(e) {
4168
+ if (e.target === modal) closeUpgradeModal();
4169
+ });
4170
+
4171
+ // Subscribe button handlers
4172
+ modal.querySelectorAll(".upgrade-subscribe-btn").forEach(function(btn) {
4173
+ btn.addEventListener("click", function() {
4174
+ var planId = btn.dataset.plan;
4175
+ handleUpgradeSubscribe(planId, btn);
4176
+ });
4177
+ });
4178
+ }
4179
+
4180
+ async function handleUpgradeSubscribe(planId, btn) {
4181
+ var originalText = btn.textContent;
4182
+ btn.textContent = "LOADING...";
4183
+ btn.disabled = true;
4184
+
4185
+ try {
4186
+ var res = await fetch("/api/createPaddleCheckout", {
4187
+ method: "POST",
4188
+ headers: { "Content-Type": "application/json" },
4189
+ body: JSON.stringify({ plan: planId }),
4190
+ });
4191
+
4192
+ var data = await res.json();
4193
+
4194
+ if (data.checkoutUrl) {
4195
+ // Redirect to Paddle checkout
4196
+ window.open(data.checkoutUrl, "_blank");
4197
+ btn.textContent = "OPENED";
4198
+ setTimeout(function() {
4199
+ btn.textContent = originalText;
4200
+ btn.disabled = false;
4201
+ }, 3000);
4202
+ } else if (data.error) {
4203
+ btn.textContent = "ERROR";
4204
+ console.error("[SYKE] Checkout error:", data.error);
4205
+ setTimeout(function() {
4206
+ btn.textContent = originalText;
4207
+ btn.disabled = false;
4208
+ }, 2000);
4209
+ } else {
4210
+ // Fallback: redirect to syke.cloud/dashboard
4211
+ window.open("https://syke.cloud/dashboard/?plan=" + encodeURIComponent(planId), "_blank");
4212
+ btn.textContent = originalText;
4213
+ btn.disabled = false;
4214
+ }
4215
+ } catch (err) {
4216
+ console.warn("[SYKE] Checkout fetch failed, redirecting to dashboard:", err);
4217
+ // Fallback to syke.cloud dashboard
4218
+ window.open("https://syke.cloud/dashboard/?plan=" + encodeURIComponent(planId), "_blank");
4219
+ btn.textContent = originalText;
4220
+ btn.disabled = false;
4221
+ }
4222
+ }
4223
+
4032
4224
  function setupProjectModal() {
4033
4225
  const openBtn = document.getElementById("btn-change-project");
4034
4226
  const modal = document.getElementById("project-modal");
@@ -29,6 +29,7 @@
29
29
  <option value="anthropic">ANTHROPIC</option>
30
30
  </select>
31
31
  <button id="btn-ai-apply" class="top-btn ai-apply-btn">APPLY</button>
32
+ <button id="btn-upgrade" class="top-btn upgrade-btn hidden">UPGRADE &#8593;</button>
32
33
  </div>
33
34
  <div class="project-selector">
34
35
  <span id="current-project" class="project-path">Loading...</span>
@@ -519,6 +520,62 @@
519
520
  </div>
520
521
  </div>
521
522
 
523
+ <!-- Upgrade Modal -->
524
+ <div id="upgrade-modal" class="hidden">
525
+ <div class="upgrade-modal-panel">
526
+ <button id="btn-close-upgrade" class="upgrade-close">&times;</button>
527
+ <h3 class="upgrade-modal-title" id="upgrade-modal-title">UPGRADE YOUR PLAN</h3>
528
+ <div class="upgrade-cards" id="upgrade-cards">
529
+ <!-- PRO Card (shown for free/trial users) -->
530
+ <div class="upgrade-card pro-card" id="upgrade-card-pro">
531
+ <div class="upgrade-card-header pro-header">
532
+ <span class="upgrade-card-name">PRO</span>
533
+ </div>
534
+ <ul class="upgrade-features">
535
+ <li>Unlimited files</li>
536
+ <li>Cycle detection</li>
537
+ <li>Hub file analysis</li>
538
+ <li>Real-time monitoring</li>
539
+ <li>Project switching</li>
540
+ </ul>
541
+ <div class="upgrade-price-row">
542
+ <span class="upgrade-price">$12<span class="upgrade-price-unit">/mo</span></span>
543
+ <button class="upgrade-subscribe-btn pro-subscribe" data-plan="monthly">SUBSCRIBE</button>
544
+ </div>
545
+ <div class="upgrade-price-row annual-row">
546
+ <span class="upgrade-price-annual">$99<span class="upgrade-price-unit">/yr</span> <span class="upgrade-save">Save $45</span></span>
547
+ <button class="upgrade-subscribe-btn pro-subscribe" data-plan="annual">SUBSCRIBE ANNUAL</button>
548
+ </div>
549
+ </div>
550
+ <!-- CORTEX Card (always shown in upgrade modal) -->
551
+ <div class="upgrade-card cortex-card" id="upgrade-card-cortex">
552
+ <div class="upgrade-best-ribbon">BEST</div>
553
+ <div class="upgrade-card-header cortex-header">
554
+ <span class="upgrade-card-name">CORTEX</span>
555
+ </div>
556
+ <ul class="upgrade-features">
557
+ <li>Everything in Pro</li>
558
+ <li>AI-powered analysis</li>
559
+ <li>Onboarding doc generator</li>
560
+ <li>Smart recommendations</li>
561
+ </ul>
562
+ <div class="upgrade-price-row">
563
+ <span class="upgrade-price" id="cortex-monthly-price">$29<span class="upgrade-price-unit">/mo</span></span>
564
+ <button class="upgrade-subscribe-btn cortex-subscribe" data-plan="cortex_monthly">SUBSCRIBE</button>
565
+ </div>
566
+ <div class="upgrade-price-row annual-row">
567
+ <span class="upgrade-price-annual">$249<span class="upgrade-price-unit">/yr</span> <span class="upgrade-save">Save $99</span></span>
568
+ <button class="upgrade-subscribe-btn cortex-subscribe" data-plan="cortex_annual">SUBSCRIBE ANNUAL</button>
569
+ </div>
570
+ </div>
571
+ </div>
572
+ <div class="upgrade-modal-footer">
573
+ <span class="upgrade-current-plan" id="upgrade-current-plan">Current: FREE</span>
574
+ <button id="btn-upgrade-close" class="upgrade-footer-close">CLOSE</button>
575
+ </div>
576
+ </div>
577
+ </div>
578
+
522
579
  <!-- Bottom status bar -->
523
580
  <div id="bottom-bar">
524
581
  <span id="bottom-info">SYKE v--- · ---</span>
@@ -3561,3 +3561,320 @@ main {
3561
3561
  .set-row-checkbox .set-val {
3562
3562
  display: none;
3563
3563
  }
3564
+
3565
+ /* ═══════════════════════════════════════════ */
3566
+ /* Upgrade Button (Topbar) */
3567
+ /* ═══════════════════════════════════════════ */
3568
+ .upgrade-btn {
3569
+ padding: 4px 14px;
3570
+ font-size: 10px;
3571
+ font-family: inherit;
3572
+ font-weight: 700;
3573
+ letter-spacing: 2px;
3574
+ border-radius: 3px;
3575
+ cursor: pointer;
3576
+ transition: all 0.2s;
3577
+ margin-left: 4px;
3578
+ }
3579
+
3580
+ .upgrade-btn.hidden { display: none; }
3581
+
3582
+ .upgrade-btn.upgrade-pulse {
3583
+ color: #f0c040;
3584
+ border: 1px solid rgba(240,192,64,0.5);
3585
+ background: rgba(240,192,64,0.08);
3586
+ animation: upgrade-pulse-anim 2s ease-in-out infinite;
3587
+ }
3588
+
3589
+ .upgrade-btn.upgrade-pulse:hover {
3590
+ color: #fff;
3591
+ background: rgba(240,192,64,0.2);
3592
+ border-color: #f0c040;
3593
+ box-shadow: 0 0 16px rgba(240,192,64,0.35);
3594
+ }
3595
+
3596
+ .upgrade-btn.upgrade-cortex {
3597
+ color: #e040fb;
3598
+ border: 1px solid rgba(224,64,251,0.5);
3599
+ background: rgba(224,64,251,0.08);
3600
+ }
3601
+
3602
+ .upgrade-btn.upgrade-cortex:hover {
3603
+ color: #fff;
3604
+ background: rgba(224,64,251,0.2);
3605
+ border-color: #e040fb;
3606
+ box-shadow: 0 0 16px rgba(224,64,251,0.35);
3607
+ }
3608
+
3609
+ @keyframes upgrade-pulse-anim {
3610
+ 0%, 100% { box-shadow: 0 0 4px rgba(240,192,64,0.15); }
3611
+ 50% { box-shadow: 0 0 14px rgba(240,192,64,0.4); }
3612
+ }
3613
+
3614
+ /* ═══════════════════════════════════════════ */
3615
+ /* Upgrade Modal */
3616
+ /* ═══════════════════════════════════════════ */
3617
+ #upgrade-modal {
3618
+ position: fixed;
3619
+ inset: 0;
3620
+ z-index: 9000;
3621
+ background: rgba(0, 0, 0, 0.75);
3622
+ backdrop-filter: blur(6px);
3623
+ display: flex;
3624
+ align-items: center;
3625
+ justify-content: center;
3626
+ }
3627
+ #upgrade-modal.hidden { display: none; }
3628
+
3629
+ .upgrade-modal-panel {
3630
+ background: linear-gradient(160deg, #0d1b2a, #0f1d32);
3631
+ border: 1px solid rgba(0,212,255,0.15);
3632
+ border-radius: 12px;
3633
+ padding: 32px 36px 24px;
3634
+ max-width: 700px;
3635
+ width: 94%;
3636
+ position: relative;
3637
+ box-shadow: 0 0 60px rgba(0,0,0,0.6), 0 0 30px rgba(0,212,255,0.08);
3638
+ }
3639
+
3640
+ .upgrade-close {
3641
+ position: absolute;
3642
+ top: 12px;
3643
+ right: 16px;
3644
+ background: none;
3645
+ border: none;
3646
+ color: #556677;
3647
+ font-size: 22px;
3648
+ cursor: pointer;
3649
+ z-index: 1;
3650
+ }
3651
+ .upgrade-close:hover { color: #fff; }
3652
+
3653
+ .upgrade-modal-title {
3654
+ font-family: 'Consolas', 'JetBrains Mono', monospace;
3655
+ font-size: 14px;
3656
+ color: var(--accent);
3657
+ letter-spacing: 3px;
3658
+ text-align: center;
3659
+ margin-bottom: 28px;
3660
+ }
3661
+
3662
+ /* Card container */
3663
+ .upgrade-cards {
3664
+ display: flex;
3665
+ gap: 20px;
3666
+ justify-content: center;
3667
+ }
3668
+
3669
+ /* Individual card */
3670
+ .upgrade-card {
3671
+ flex: 1;
3672
+ max-width: 300px;
3673
+ border-radius: 8px;
3674
+ padding: 24px 22px 20px;
3675
+ position: relative;
3676
+ overflow: hidden;
3677
+ }
3678
+
3679
+ .upgrade-card.pro-card {
3680
+ background: rgba(240,192,64,0.04);
3681
+ border: 1px solid rgba(240,192,64,0.2);
3682
+ }
3683
+
3684
+ .upgrade-card.cortex-card {
3685
+ background: rgba(224,64,251,0.04);
3686
+ border: 1px solid rgba(224,64,251,0.25);
3687
+ }
3688
+
3689
+ /* BEST ribbon */
3690
+ .upgrade-best-ribbon {
3691
+ position: absolute;
3692
+ top: 12px;
3693
+ right: -28px;
3694
+ background: linear-gradient(135deg, #e040fb, #7c3aed);
3695
+ color: #fff;
3696
+ font-size: 9px;
3697
+ font-weight: 700;
3698
+ letter-spacing: 2px;
3699
+ padding: 3px 36px;
3700
+ transform: rotate(45deg);
3701
+ box-shadow: 0 2px 8px rgba(224,64,251,0.3);
3702
+ }
3703
+
3704
+ /* Card header */
3705
+ .upgrade-card-header {
3706
+ margin-bottom: 16px;
3707
+ }
3708
+
3709
+ .upgrade-card-name {
3710
+ font-family: 'Consolas', 'JetBrains Mono', monospace;
3711
+ font-size: 16px;
3712
+ font-weight: 700;
3713
+ letter-spacing: 3px;
3714
+ }
3715
+
3716
+ .pro-header .upgrade-card-name {
3717
+ color: #f0c040;
3718
+ text-shadow: 0 0 10px rgba(240,192,64,0.3);
3719
+ }
3720
+
3721
+ .cortex-header .upgrade-card-name {
3722
+ color: #e040fb;
3723
+ text-shadow: 0 0 10px rgba(224,64,251,0.3);
3724
+ }
3725
+
3726
+ /* Feature list */
3727
+ .upgrade-features {
3728
+ list-style: none;
3729
+ margin-bottom: 20px;
3730
+ }
3731
+
3732
+ .upgrade-features li {
3733
+ font-size: 11px;
3734
+ color: #8899aa;
3735
+ padding: 4px 0;
3736
+ padding-left: 16px;
3737
+ position: relative;
3738
+ }
3739
+
3740
+ .upgrade-features li::before {
3741
+ content: '\2713';
3742
+ position: absolute;
3743
+ left: 0;
3744
+ color: #30d158;
3745
+ font-size: 10px;
3746
+ }
3747
+
3748
+ /* Price row */
3749
+ .upgrade-price-row {
3750
+ display: flex;
3751
+ align-items: center;
3752
+ justify-content: space-between;
3753
+ margin-bottom: 10px;
3754
+ }
3755
+
3756
+ .upgrade-price-row.annual-row {
3757
+ margin-bottom: 0;
3758
+ }
3759
+
3760
+ .upgrade-price {
3761
+ font-family: 'Consolas', 'JetBrains Mono', monospace;
3762
+ font-size: 18px;
3763
+ color: #c8d6e5;
3764
+ font-weight: 700;
3765
+ }
3766
+
3767
+ .upgrade-price-unit {
3768
+ font-size: 11px;
3769
+ color: #5a7599;
3770
+ font-weight: 400;
3771
+ }
3772
+
3773
+ .upgrade-price-annual {
3774
+ font-family: 'Consolas', 'JetBrains Mono', monospace;
3775
+ font-size: 13px;
3776
+ color: #8899aa;
3777
+ }
3778
+
3779
+ .upgrade-save {
3780
+ font-size: 10px;
3781
+ color: #30d158;
3782
+ font-weight: 700;
3783
+ margin-left: 4px;
3784
+ }
3785
+
3786
+ /* Subscribe buttons */
3787
+ .upgrade-subscribe-btn {
3788
+ padding: 6px 16px;
3789
+ border-radius: 4px;
3790
+ font-family: 'Consolas', 'JetBrains Mono', monospace;
3791
+ font-size: 10px;
3792
+ font-weight: 600;
3793
+ letter-spacing: 1px;
3794
+ cursor: pointer;
3795
+ transition: all 0.2s;
3796
+ white-space: nowrap;
3797
+ }
3798
+
3799
+ .upgrade-subscribe-btn.pro-subscribe {
3800
+ background: rgba(240,192,64,0.12);
3801
+ border: 1px solid rgba(240,192,64,0.4);
3802
+ color: #f0c040;
3803
+ }
3804
+
3805
+ .upgrade-subscribe-btn.pro-subscribe:hover {
3806
+ background: rgba(240,192,64,0.25);
3807
+ border-color: #f0c040;
3808
+ box-shadow: 0 0 12px rgba(240,192,64,0.3);
3809
+ transform: translateY(-1px);
3810
+ }
3811
+
3812
+ .upgrade-subscribe-btn.cortex-subscribe {
3813
+ background: rgba(224,64,251,0.12);
3814
+ border: 1px solid rgba(224,64,251,0.4);
3815
+ color: #e040fb;
3816
+ }
3817
+
3818
+ .upgrade-subscribe-btn.cortex-subscribe:hover {
3819
+ background: rgba(224,64,251,0.25);
3820
+ border-color: #e040fb;
3821
+ box-shadow: 0 0 12px rgba(224,64,251,0.3);
3822
+ transform: translateY(-1px);
3823
+ }
3824
+
3825
+ /* Footer */
3826
+ .upgrade-modal-footer {
3827
+ display: flex;
3828
+ align-items: center;
3829
+ justify-content: space-between;
3830
+ margin-top: 24px;
3831
+ padding-top: 16px;
3832
+ border-top: 1px solid rgba(255,255,255,0.06);
3833
+ }
3834
+
3835
+ .upgrade-current-plan {
3836
+ font-family: 'Consolas', 'JetBrains Mono', monospace;
3837
+ font-size: 11px;
3838
+ color: #5a7599;
3839
+ letter-spacing: 1px;
3840
+ }
3841
+
3842
+ .upgrade-footer-close {
3843
+ padding: 6px 20px;
3844
+ background: transparent;
3845
+ border: 1px solid var(--border);
3846
+ border-radius: 3px;
3847
+ color: var(--text-secondary);
3848
+ font-family: inherit;
3849
+ font-size: 10px;
3850
+ letter-spacing: 2px;
3851
+ cursor: pointer;
3852
+ transition: all 0.2s;
3853
+ }
3854
+
3855
+ .upgrade-footer-close:hover {
3856
+ color: var(--accent);
3857
+ border-color: var(--accent);
3858
+ }
3859
+
3860
+ /* Cortex-only layout (single card, wider) */
3861
+ .upgrade-cards.cortex-only {
3862
+ justify-content: center;
3863
+ }
3864
+
3865
+ .upgrade-cards.cortex-only .upgrade-card {
3866
+ max-width: 380px;
3867
+ }
3868
+
3869
+ /* Pro upgrade note (shown inside cortex card for pro users) */
3870
+ .upgrade-pro-note {
3871
+ font-size: 10px;
3872
+ color: #5a7599;
3873
+ margin-left: 6px;
3874
+ }
3875
+
3876
+ /* Trial badge with days left */
3877
+ .license-badge.trial-days {
3878
+ color: var(--risk-medium);
3879
+ border-color: rgba(255,159,10,0.4);
3880
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syke1/mcp-server",
3
- "version": "1.8.8",
3
+ "version": "1.8.10",
4
4
  "mcpName": "io.github.khalomsky/syke",
5
5
  "description": "AI code impact analysis MCP server — dependency graphs, cascade detection, and a mandatory build gate for AI coding agents",
6
6
  "main": "dist/index.js",