@syke1/mcp-server 1.4.0 → 1.4.2

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.
@@ -1207,7 +1207,7 @@ main {
1207
1207
  position: fixed;
1208
1208
  bottom: 0;
1209
1209
  left: 0;
1210
- right: 380px;
1210
+ right: var(--right-offset, 380px);
1211
1211
  background: var(--bg-secondary);
1212
1212
  border-top: 1px solid var(--border);
1213
1213
  transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
@@ -1941,6 +1941,125 @@ main {
1941
1941
  text-align: left;
1942
1942
  }
1943
1943
 
1944
+ /* ═══════════════════════════════════════════ */
1945
+ /* License Modal */
1946
+ /* ═══════════════════════════════════════════ */
1947
+ #license-modal {
1948
+ position: fixed;
1949
+ inset: 0;
1950
+ background: rgba(5,10,24,0.85);
1951
+ z-index: 400;
1952
+ display: flex;
1953
+ align-items: center;
1954
+ justify-content: center;
1955
+ backdrop-filter: blur(4px);
1956
+ }
1957
+ #license-modal.hidden { display: none; }
1958
+
1959
+ .license-modal-panel {
1960
+ background: var(--bg-secondary);
1961
+ border: 1px solid var(--accent-dim);
1962
+ border-radius: 6px;
1963
+ padding: 24px 32px;
1964
+ min-width: 420px;
1965
+ max-width: 480px;
1966
+ box-shadow: var(--glow-cyan), 0 16px 64px rgba(0,0,0,0.5);
1967
+ }
1968
+ .license-modal-panel h3 {
1969
+ font-size: 12px;
1970
+ color: var(--accent);
1971
+ letter-spacing: 3px;
1972
+ margin-bottom: 8px;
1973
+ }
1974
+ .license-modal-desc {
1975
+ font-size: 11px;
1976
+ color: var(--text-muted);
1977
+ margin-bottom: 16px;
1978
+ }
1979
+ .license-input-row {
1980
+ margin-bottom: 12px;
1981
+ }
1982
+ .license-input-row input {
1983
+ width: 100%;
1984
+ padding: 10px 14px;
1985
+ background: rgba(0,0,0,0.5);
1986
+ border: 1px solid var(--border);
1987
+ border-radius: 3px;
1988
+ color: var(--text-primary);
1989
+ font-family: var(--font-mono);
1990
+ font-size: 13px;
1991
+ letter-spacing: 1.5px;
1992
+ outline: none;
1993
+ transition: border-color 0.2s;
1994
+ box-sizing: border-box;
1995
+ }
1996
+ .license-input-row input:focus {
1997
+ border-color: var(--accent);
1998
+ box-shadow: 0 0 8px rgba(0,212,255,0.15);
1999
+ }
2000
+ .license-input-row input::placeholder {
2001
+ color: var(--text-muted);
2002
+ letter-spacing: 2px;
2003
+ font-size: 11px;
2004
+ }
2005
+ #license-modal-status {
2006
+ min-height: 20px;
2007
+ font-size: 11px;
2008
+ margin-bottom: 12px;
2009
+ }
2010
+ #license-modal-status.success { color: var(--green); }
2011
+ #license-modal-status.error { color: #ff5f57; }
2012
+ #license-modal-status.loading { color: var(--accent); }
2013
+
2014
+ .license-modal-actions {
2015
+ display: flex;
2016
+ gap: 8px;
2017
+ margin-bottom: 12px;
2018
+ }
2019
+ .license-modal-actions button {
2020
+ padding: 8px 18px;
2021
+ border: 1px solid var(--accent-dim);
2022
+ border-radius: 3px;
2023
+ background: transparent;
2024
+ color: var(--accent);
2025
+ font-family: var(--font-mono);
2026
+ font-size: 10px;
2027
+ letter-spacing: 2px;
2028
+ cursor: pointer;
2029
+ transition: all 0.2s;
2030
+ }
2031
+ .license-modal-actions button:hover {
2032
+ background: rgba(0,212,255,0.08);
2033
+ border-color: var(--accent);
2034
+ }
2035
+ #btn-license-activate {
2036
+ background: rgba(0,212,255,0.1) !important;
2037
+ border-color: var(--accent) !important;
2038
+ font-weight: 700;
2039
+ }
2040
+ .license-deactivate-btn {
2041
+ color: #ff5f57 !important;
2042
+ border-color: rgba(255,95,87,0.3) !important;
2043
+ }
2044
+ .license-deactivate-btn:hover {
2045
+ background: rgba(255,95,87,0.08) !important;
2046
+ border-color: #ff5f57 !important;
2047
+ }
2048
+ .license-modal-hint {
2049
+ font-size: 10px;
2050
+ color: var(--text-muted);
2051
+ }
2052
+ .license-modal-hint a {
2053
+ color: var(--accent);
2054
+ text-decoration: none;
2055
+ }
2056
+
2057
+ .license-btn {
2058
+ font-size: 9px !important;
2059
+ padding: 2px 8px !important;
2060
+ letter-spacing: 1.5px;
2061
+ }
2062
+
1944
2063
  /* ═══════════════════════════════════════════ */
1945
2064
  /* Project Switch Modal */
1946
2065
  /* ═══════════════════════════════════════════ */
@@ -2297,7 +2416,7 @@ main {
2297
2416
  position: fixed;
2298
2417
  bottom: 0;
2299
2418
  left: 0;
2300
- right: 380px;
2419
+ right: var(--right-offset, 380px);
2301
2420
  height: 28px;
2302
2421
  background: rgba(5, 10, 24, 0.85);
2303
2422
  border-top: 1px solid rgba(0, 212, 255, 0.1);
@@ -2553,3 +2672,565 @@ main {
2553
2672
  border: none;
2554
2673
  border-radius: 1px;
2555
2674
  }
2675
+
2676
+ /* ═══════════════════════════════════════════ */
2677
+ /* FILE TREE PANEL */
2678
+ /* ═══════════════════════════════════════════ */
2679
+
2680
+ /* Tree Resize Handle (identical pattern to #resize-handle) */
2681
+ #tree-resize-handle {
2682
+ width: 8px;
2683
+ cursor: col-resize;
2684
+ background: var(--bg-secondary);
2685
+ position: relative;
2686
+ flex-shrink: 0;
2687
+ z-index: 20;
2688
+ transition: background 0.2s;
2689
+ border-left: 1px solid var(--border);
2690
+ border-right: 1px solid var(--border);
2691
+ }
2692
+
2693
+ #tree-resize-handle::before {
2694
+ content: '';
2695
+ position: absolute;
2696
+ top: 50%;
2697
+ left: 50%;
2698
+ transform: translate(-50%, -50%);
2699
+ width: 2px;
2700
+ height: 48px;
2701
+ border-radius: 2px;
2702
+ background: var(--text-secondary);
2703
+ opacity: 0.5;
2704
+ transition: all 0.2s;
2705
+ }
2706
+
2707
+ #tree-resize-handle:hover {
2708
+ background: rgba(0, 212, 255, 0.08);
2709
+ border-color: var(--accent-dim);
2710
+ }
2711
+
2712
+ #tree-resize-handle:hover::before {
2713
+ background: var(--accent);
2714
+ height: 64px;
2715
+ opacity: 1;
2716
+ box-shadow: var(--glow-cyan);
2717
+ }
2718
+
2719
+ #tree-resize-handle.dragging {
2720
+ background: rgba(0, 212, 255, 0.12);
2721
+ border-color: var(--accent);
2722
+ }
2723
+
2724
+ #tree-resize-handle.dragging::before {
2725
+ background: var(--accent);
2726
+ height: 100%;
2727
+ opacity: 1;
2728
+ box-shadow: var(--glow-cyan);
2729
+ }
2730
+
2731
+ /* File Tree Panel */
2732
+ #file-tree-panel {
2733
+ flex: 0 0 280px;
2734
+ width: 280px;
2735
+ display: flex;
2736
+ flex-direction: column;
2737
+ background: var(--bg-secondary);
2738
+ border-left: 1px solid var(--border);
2739
+ border-right: 1px solid var(--border);
2740
+ overflow: hidden;
2741
+ position: relative;
2742
+ font-family: 'Consolas', 'JetBrains Mono', monospace;
2743
+ }
2744
+
2745
+ #file-tree-panel.hidden {
2746
+ display: none;
2747
+ }
2748
+
2749
+ #file-tree-panel::before {
2750
+ content: '';
2751
+ position: absolute;
2752
+ top: 0; left: -1px;
2753
+ width: 1px;
2754
+ height: 100%;
2755
+ background: linear-gradient(180deg, var(--accent) 0%, transparent 30%, transparent 70%, var(--accent) 100%);
2756
+ opacity: 0.2;
2757
+ }
2758
+
2759
+ /* Tree Header */
2760
+ #tree-header {
2761
+ padding: 10px 12px 8px;
2762
+ border-bottom: 1px solid var(--border);
2763
+ flex-shrink: 0;
2764
+ }
2765
+
2766
+ .tree-title-row {
2767
+ display: flex;
2768
+ align-items: center;
2769
+ justify-content: space-between;
2770
+ margin-bottom: 8px;
2771
+ }
2772
+
2773
+ .tree-title {
2774
+ font-size: 10px;
2775
+ font-weight: 700;
2776
+ color: var(--accent);
2777
+ letter-spacing: 3px;
2778
+ }
2779
+
2780
+ .tree-count {
2781
+ font-size: 9px;
2782
+ color: var(--text-secondary);
2783
+ background: rgba(0,212,255,0.08);
2784
+ border: 1px solid var(--border);
2785
+ border-radius: 2px;
2786
+ padding: 1px 6px;
2787
+ font-variant-numeric: tabular-nums;
2788
+ }
2789
+
2790
+ /* Tree Search Bar */
2791
+ #tree-search-bar {
2792
+ display: flex;
2793
+ gap: 4px;
2794
+ align-items: center;
2795
+ position: relative;
2796
+ }
2797
+
2798
+ #tree-search-input {
2799
+ flex: 1;
2800
+ padding: 4px 8px;
2801
+ background: rgba(0,0,0,0.3);
2802
+ color: var(--accent);
2803
+ border: 1px solid var(--border);
2804
+ border-radius: 2px;
2805
+ font-size: 10px;
2806
+ font-family: inherit;
2807
+ letter-spacing: 1px;
2808
+ outline: none;
2809
+ transition: border-color 0.2s;
2810
+ }
2811
+
2812
+ #tree-search-input::placeholder {
2813
+ color: var(--text-secondary);
2814
+ letter-spacing: 2px;
2815
+ font-size: 9px;
2816
+ }
2817
+
2818
+ #tree-search-input:focus {
2819
+ border-color: var(--accent);
2820
+ box-shadow: var(--glow-cyan);
2821
+ }
2822
+
2823
+ .tree-tool-btn {
2824
+ padding: 3px 8px;
2825
+ background: transparent;
2826
+ color: var(--text-secondary);
2827
+ border: 1px solid var(--border);
2828
+ border-radius: 2px;
2829
+ cursor: pointer;
2830
+ font-size: 9px;
2831
+ font-family: inherit;
2832
+ font-weight: 600;
2833
+ letter-spacing: 1px;
2834
+ transition: all 0.2s;
2835
+ }
2836
+
2837
+ .tree-tool-btn:hover {
2838
+ color: var(--accent);
2839
+ border-color: var(--accent);
2840
+ }
2841
+
2842
+ /* Sort Dropdown Menu */
2843
+ #tree-sort-menu {
2844
+ position: absolute;
2845
+ top: 100%;
2846
+ right: 32px;
2847
+ margin-top: 4px;
2848
+ background: rgba(10,22,40,0.97);
2849
+ border: 1px solid var(--accent-dim);
2850
+ border-radius: 3px;
2851
+ z-index: 100;
2852
+ box-shadow: var(--glow-cyan), 0 8px 24px rgba(0,0,0,0.5);
2853
+ backdrop-filter: blur(8px);
2854
+ min-width: 120px;
2855
+ }
2856
+
2857
+ #tree-sort-menu.hidden { display: none; }
2858
+
2859
+ .tree-sort-option {
2860
+ padding: 6px 12px;
2861
+ font-size: 9px;
2862
+ letter-spacing: 2px;
2863
+ color: var(--text-primary);
2864
+ cursor: pointer;
2865
+ transition: all 0.15s;
2866
+ }
2867
+
2868
+ .tree-sort-option:hover {
2869
+ background: rgba(0,212,255,0.12);
2870
+ color: var(--accent);
2871
+ }
2872
+
2873
+ .tree-sort-option.active {
2874
+ color: var(--accent);
2875
+ background: rgba(0,212,255,0.06);
2876
+ }
2877
+
2878
+ /* Tree Scroll Container */
2879
+ #tree-scroll-container {
2880
+ flex: 1;
2881
+ overflow-y: auto;
2882
+ overflow-x: hidden;
2883
+ }
2884
+
2885
+ #tree-scroll-container::-webkit-scrollbar { width: 4px; }
2886
+ #tree-scroll-container::-webkit-scrollbar-track { background: transparent; }
2887
+ #tree-scroll-container::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; }
2888
+ #tree-scroll-container::-webkit-scrollbar-thumb:hover { background: var(--accent-dim); }
2889
+
2890
+ /* Tree Content */
2891
+ #tree-content {
2892
+ padding: 6px 0 6px 0;
2893
+ }
2894
+
2895
+ /* ═══════════════════════════════════════════ */
2896
+ /* METRO RAIL TREE (GitKraken-style) */
2897
+ /* ═══════════════════════════════════════════ */
2898
+
2899
+ /* ── Tree Group: wraps sibling nodes, draws vertical rail line ── */
2900
+ .tree-group {
2901
+ position: relative;
2902
+ margin-left: 16px;
2903
+ }
2904
+
2905
+ #tree-content > .tree-group {
2906
+ margin-left: 4px;
2907
+ }
2908
+
2909
+ /* Vertical rail line spanning entire group */
2910
+ .tree-group::before {
2911
+ content: '';
2912
+ position: absolute;
2913
+ left: 11px;
2914
+ top: 14px;
2915
+ bottom: 14px;
2916
+ width: 2px;
2917
+ background: linear-gradient(180deg,
2918
+ rgba(0,212,255,0.08),
2919
+ rgba(0,212,255,0.22) 15%,
2920
+ rgba(0,212,255,0.22) 85%,
2921
+ rgba(0,212,255,0.08)
2922
+ );
2923
+ border-radius: 1px;
2924
+ z-index: 1;
2925
+ }
2926
+
2927
+ /* Subtle glow on the line */
2928
+ .tree-group::after {
2929
+ content: '';
2930
+ position: absolute;
2931
+ left: 9px;
2932
+ top: 14px;
2933
+ bottom: 14px;
2934
+ width: 6px;
2935
+ background: rgba(0,212,255,0.04);
2936
+ border-radius: 3px;
2937
+ z-index: 0;
2938
+ filter: blur(2px);
2939
+ }
2940
+
2941
+ .tree-group.single-child::before,
2942
+ .tree-group.single-child::after {
2943
+ display: none;
2944
+ }
2945
+
2946
+ /* ── Tree Node (file/folder row) ── */
2947
+ .tree-node {
2948
+ display: flex;
2949
+ align-items: center;
2950
+ position: relative;
2951
+ min-height: 30px;
2952
+ padding-left: 30px;
2953
+ padding-right: 8px;
2954
+ cursor: pointer;
2955
+ transition: all 0.15s;
2956
+ font-size: 11px;
2957
+ color: var(--text-primary);
2958
+ border-right: 2px solid transparent;
2959
+ }
2960
+
2961
+ .tree-node:hover {
2962
+ background: rgba(0,212,255,0.06);
2963
+ }
2964
+
2965
+ .tree-node:hover .tree-name {
2966
+ color: var(--accent);
2967
+ }
2968
+
2969
+ .tree-node.selected {
2970
+ background: rgba(0,212,255,0.1);
2971
+ border-right-color: var(--accent);
2972
+ }
2973
+
2974
+ .tree-node.compact {
2975
+ min-height: 24px;
2976
+ }
2977
+
2978
+ /* ── The Dot: sits ON the vertical rail line ── */
2979
+ .tree-dot {
2980
+ position: absolute;
2981
+ left: 5px;
2982
+ top: 50%;
2983
+ transform: translateY(-50%);
2984
+ width: 12px;
2985
+ height: 12px;
2986
+ border-radius: 50%;
2987
+ border: 2.5px solid var(--bg-secondary);
2988
+ z-index: 3;
2989
+ transition: transform 0.2s ease, box-shadow 0.2s ease;
2990
+ }
2991
+
2992
+ /* File dots: filled solid */
2993
+ .tree-node[data-type="file"] .tree-dot {
2994
+ /* background + box-shadow set inline via style attr */
2995
+ }
2996
+
2997
+ /* Folder dots: hollow ring with glow */
2998
+ .tree-node[data-type="folder"] .tree-dot {
2999
+ background: var(--bg-secondary) !important;
3000
+ border-width: 2.5px;
3001
+ }
3002
+
3003
+ /* Hover: dot grows + stronger glow */
3004
+ .tree-node:hover .tree-dot {
3005
+ transform: translateY(-50%) scale(1.35);
3006
+ }
3007
+
3008
+ /* Selected: dot pulses */
3009
+ .tree-node.selected .tree-dot {
3010
+ transform: translateY(-50%) scale(1.4);
3011
+ border-color: var(--bg-primary);
3012
+ }
3013
+
3014
+ /* ── Folder toggle arrow (after dot, before name) ── */
3015
+ .tree-toggle {
3016
+ display: inline-flex;
3017
+ align-items: center;
3018
+ justify-content: center;
3019
+ width: 14px;
3020
+ height: 14px;
3021
+ font-size: 7px;
3022
+ color: var(--text-secondary);
3023
+ transition: transform 0.2s ease, color 0.15s;
3024
+ flex-shrink: 0;
3025
+ user-select: none;
3026
+ margin-right: 2px;
3027
+ }
3028
+
3029
+ .tree-toggle.open {
3030
+ transform: rotate(90deg);
3031
+ }
3032
+
3033
+ .tree-node:hover .tree-toggle {
3034
+ color: var(--accent);
3035
+ }
3036
+
3037
+ /* ── Tree node name ── */
3038
+ .tree-name {
3039
+ flex: 1;
3040
+ overflow: hidden;
3041
+ text-overflow: ellipsis;
3042
+ white-space: nowrap;
3043
+ transition: color 0.15s;
3044
+ }
3045
+
3046
+ .tree-name.folder-name {
3047
+ font-weight: 600;
3048
+ color: var(--text-secondary);
3049
+ letter-spacing: 0.3px;
3050
+ }
3051
+
3052
+ .tree-node:hover .tree-name.folder-name {
3053
+ color: var(--accent);
3054
+ }
3055
+
3056
+ /* Folder file count badge */
3057
+ .tree-folder-count {
3058
+ font-size: 8px;
3059
+ color: var(--text-secondary);
3060
+ margin-left: 6px;
3061
+ padding: 0 5px;
3062
+ background: rgba(0,212,255,0.06);
3063
+ border: 1px solid rgba(26,45,77,0.4);
3064
+ border-radius: 8px;
3065
+ font-variant-numeric: tabular-nums;
3066
+ flex-shrink: 0;
3067
+ opacity: 0.7;
3068
+ }
3069
+
3070
+ /* ── Badges ── */
3071
+ .tree-badge {
3072
+ font-size: 8px;
3073
+ padding: 0 4px;
3074
+ border-radius: 2px;
3075
+ margin-left: 4px;
3076
+ font-weight: 700;
3077
+ letter-spacing: 0.5px;
3078
+ flex-shrink: 0;
3079
+ }
3080
+
3081
+ .tree-badge.badge-deps {
3082
+ color: var(--text-secondary);
3083
+ background: rgba(90,117,153,0.15);
3084
+ }
3085
+
3086
+ .tree-badge.badge-lines {
3087
+ color: var(--text-secondary);
3088
+ background: rgba(90,117,153,0.15);
3089
+ }
3090
+
3091
+ .tree-badge.badge-risk-HIGH {
3092
+ color: var(--risk-high);
3093
+ background: rgba(255,45,85,0.15);
3094
+ }
3095
+
3096
+ .tree-badge.badge-risk-MEDIUM {
3097
+ color: var(--risk-medium);
3098
+ background: rgba(255,159,10,0.15);
3099
+ }
3100
+
3101
+ .tree-badge.badge-risk-LOW {
3102
+ color: var(--risk-low);
3103
+ background: rgba(48,209,88,0.15);
3104
+ }
3105
+
3106
+ .tree-badge.badge-risk-NONE {
3107
+ color: var(--risk-none);
3108
+ background: rgba(58,79,111,0.1);
3109
+ }
3110
+
3111
+ /* Modification status badges */
3112
+ .tree-mod-badge {
3113
+ font-size: 8px;
3114
+ font-weight: 700;
3115
+ padding: 0 5px;
3116
+ border-radius: 2px;
3117
+ margin-left: 4px;
3118
+ letter-spacing: 0.5px;
3119
+ flex-shrink: 0;
3120
+ }
3121
+
3122
+ .tree-mod-badge.mod-M {
3123
+ color: var(--risk-medium);
3124
+ background: rgba(255,159,10,0.2);
3125
+ }
3126
+
3127
+ .tree-mod-badge.mod-A {
3128
+ color: var(--risk-low);
3129
+ background: rgba(48,209,88,0.2);
3130
+ }
3131
+
3132
+ .tree-mod-badge.mod-D {
3133
+ color: var(--risk-high);
3134
+ background: rgba(255,45,85,0.2);
3135
+ }
3136
+
3137
+ /* ── Modified file: white pulse animation ── */
3138
+ @keyframes tree-file-pulse {
3139
+ 0%, 100% {
3140
+ text-shadow: 0 0 6px rgba(255,255,255,0.3);
3141
+ }
3142
+ 50% {
3143
+ text-shadow: 0 0 14px rgba(255,255,255,0.7);
3144
+ }
3145
+ }
3146
+
3147
+ @keyframes tree-dot-pulse {
3148
+ 0%, 100% {
3149
+ transform: translateY(-50%) scale(1);
3150
+ box-shadow: 0 0 8px rgba(255,255,255,0.4);
3151
+ }
3152
+ 50% {
3153
+ transform: translateY(-50%) scale(1.5);
3154
+ box-shadow: 0 0 16px rgba(255,255,255,0.8);
3155
+ }
3156
+ }
3157
+
3158
+ .tree-node.modified {
3159
+ color: #ffffff;
3160
+ animation: tree-file-pulse 1.5s ease-in-out infinite;
3161
+ }
3162
+
3163
+ .tree-node.modified .tree-name {
3164
+ color: #ffffff;
3165
+ font-weight: 700;
3166
+ }
3167
+
3168
+ .tree-node.modified .tree-dot {
3169
+ background: #ffffff !important;
3170
+ border-color: rgba(255,255,255,0.6) !important;
3171
+ animation: tree-dot-pulse 1.5s ease-in-out infinite;
3172
+ }
3173
+
3174
+ /* Folder glow when child is modified */
3175
+ .tree-node.folder-glow .tree-dot {
3176
+ box-shadow: 0 0 10px rgba(255,255,255,0.3) !important;
3177
+ }
3178
+
3179
+ .tree-node.folder-glow .tree-name {
3180
+ color: rgba(255,255,255,0.6);
3181
+ }
3182
+
3183
+ /* ── Rail line glow when group has modifications ── */
3184
+ .tree-group.has-modified::before {
3185
+ background: linear-gradient(180deg,
3186
+ rgba(0,212,255,0.08),
3187
+ rgba(255,255,255,0.3) 15%,
3188
+ rgba(255,255,255,0.3) 85%,
3189
+ rgba(0,212,255,0.08)
3190
+ );
3191
+ }
3192
+
3193
+ /* ── Checkbox styling for SET panel ── */
3194
+ .set-row-checkbox {
3195
+ justify-content: space-between;
3196
+ }
3197
+
3198
+ .set-row-checkbox input[type="checkbox"] {
3199
+ -webkit-appearance: none;
3200
+ appearance: none;
3201
+ width: 32px;
3202
+ height: 16px;
3203
+ border-radius: 8px;
3204
+ background: var(--border);
3205
+ position: relative;
3206
+ cursor: pointer;
3207
+ transition: all 0.2s;
3208
+ flex-shrink: 0;
3209
+ }
3210
+
3211
+ .set-row-checkbox input[type="checkbox"]::before {
3212
+ content: '';
3213
+ position: absolute;
3214
+ top: 2px;
3215
+ left: 2px;
3216
+ width: 12px;
3217
+ height: 12px;
3218
+ border-radius: 50%;
3219
+ background: var(--text-secondary);
3220
+ transition: all 0.2s;
3221
+ }
3222
+
3223
+ .set-row-checkbox input[type="checkbox"]:checked {
3224
+ background: rgba(0,212,255,0.3);
3225
+ border-color: var(--accent);
3226
+ }
3227
+
3228
+ .set-row-checkbox input[type="checkbox"]:checked::before {
3229
+ left: 18px;
3230
+ background: var(--accent);
3231
+ box-shadow: 0 0 6px rgba(0,212,255,0.5);
3232
+ }
3233
+
3234
+ .set-row-checkbox .set-val {
3235
+ display: none;
3236
+ }
@@ -35,4 +35,9 @@ export declare function createWebServer(getGraphFn: () => DependencyGraph, initi
35
35
  expiresAt?: string;
36
36
  error?: string;
37
37
  source?: string;
38
- }, hasAIKeyFn?: () => boolean): WebServerHandle;
38
+ }, hasAIKeyFn?: () => boolean, setLicenseKeyFn?: (key: string | null) => Promise<{
39
+ success: boolean;
40
+ plan?: string;
41
+ expiresAt?: string;
42
+ error?: string;
43
+ }>): WebServerHandle;