@syke1/mcp-server 1.4.21 → 1.4.22

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.
@@ -4003,6 +4003,7 @@ function setupAIKeysModal() {
4003
4003
 
4004
4004
  function updateStatus(row, isConfigured, isActive) {
4005
4005
  const statusEl = row.querySelector(".ai-key-status");
4006
+ const removeBtn = row.querySelector(".ai-key-remove-btn");
4006
4007
  if (isActive) {
4007
4008
  statusEl.textContent = "ACTIVE";
4008
4009
  statusEl.className = "ai-key-status active";
@@ -4013,6 +4014,13 @@ function setupAIKeysModal() {
4013
4014
  statusEl.textContent = "---";
4014
4015
  statusEl.className = "ai-key-status none";
4015
4016
  }
4017
+ if (removeBtn) {
4018
+ if (isConfigured || isActive) {
4019
+ removeBtn.classList.remove("hidden");
4020
+ } else {
4021
+ removeBtn.classList.add("hidden");
4022
+ }
4023
+ }
4016
4024
  }
4017
4025
 
4018
4026
  function updateAll(aiKeys, activeProvider) {
@@ -4096,6 +4104,38 @@ function setupAIKeysModal() {
4096
4104
  input.addEventListener("keydown", function(e) {
4097
4105
  if (e.key === "Enter") setBtn.click();
4098
4106
  });
4107
+
4108
+ // REMOVE button handler
4109
+ const removeBtn = row.querySelector(".ai-key-remove-btn");
4110
+ if (removeBtn) {
4111
+ removeBtn.addEventListener("click", async function() {
4112
+ removeBtn.disabled = true;
4113
+ removeBtn.textContent = "...";
4114
+
4115
+ try {
4116
+ const res = await fetch("/api/set-ai-key", {
4117
+ method: "POST",
4118
+ headers: { "Content-Type": "application/json" },
4119
+ body: JSON.stringify({ provider: provider, key: null }),
4120
+ });
4121
+ const data = await res.json();
4122
+ if (data.success) {
4123
+ updateAll(data.configured, data.activeProvider);
4124
+ input.value = "";
4125
+ var placeholders = { gemini: "AIzaSy...", openai: "sk-...", anthropic: "sk-ant-..." };
4126
+ input.placeholder = placeholders[provider] || "";
4127
+ if (window._refreshAIProviderSelector) window._refreshAIProviderSelector();
4128
+ }
4129
+ } catch (err) {
4130
+ var statusEl = row.querySelector(".ai-key-status");
4131
+ statusEl.textContent = "ERROR";
4132
+ statusEl.className = "ai-key-status";
4133
+ statusEl.style.color = "#ff5f57";
4134
+ }
4135
+ removeBtn.disabled = false;
4136
+ removeBtn.textContent = "REMOVE";
4137
+ });
4138
+ }
4099
4139
  });
4100
4140
 
4101
4141
  document.addEventListener("keydown", function(e) {
@@ -474,18 +474,21 @@
474
474
  <input type="password" class="ai-key-input" placeholder="AIzaSy..." spellcheck="false" autocomplete="off">
475
475
  <button class="ai-key-set-btn">SET</button>
476
476
  <span class="ai-key-status"></span>
477
+ <button class="ai-key-remove-btn hidden">REMOVE</button>
477
478
  </div>
478
479
  <div class="ai-key-row" data-provider="openai">
479
480
  <span class="ai-key-label">OPENAI</span>
480
481
  <input type="password" class="ai-key-input" placeholder="sk-..." spellcheck="false" autocomplete="off">
481
482
  <button class="ai-key-set-btn">SET</button>
482
483
  <span class="ai-key-status"></span>
484
+ <button class="ai-key-remove-btn hidden">REMOVE</button>
483
485
  </div>
484
486
  <div class="ai-key-row" data-provider="anthropic">
485
487
  <span class="ai-key-label">ANTHROPIC</span>
486
488
  <input type="password" class="ai-key-input" placeholder="sk-ant-..." spellcheck="false" autocomplete="off">
487
489
  <button class="ai-key-set-btn">SET</button>
488
490
  <span class="ai-key-status"></span>
491
+ <button class="ai-key-remove-btn hidden">REMOVE</button>
489
492
  </div>
490
493
  </div>
491
494
  <div id="ai-keys-active" class="ai-keys-active"></div>
@@ -2223,6 +2223,26 @@ main {
2223
2223
  color: var(--text-secondary);
2224
2224
  opacity: 0.4;
2225
2225
  }
2226
+ .ai-key-remove-btn {
2227
+ padding: 4px 8px;
2228
+ border: 1px solid rgba(255,95,87,0.4);
2229
+ border-radius: 3px;
2230
+ background: transparent;
2231
+ color: #ff5f57;
2232
+ font-family: inherit;
2233
+ font-size: 9px;
2234
+ letter-spacing: 1.5px;
2235
+ cursor: pointer;
2236
+ transition: all 0.2s;
2237
+ flex-shrink: 0;
2238
+ }
2239
+ .ai-key-remove-btn:hover {
2240
+ background: rgba(255,95,87,0.1);
2241
+ border-color: #ff5f57;
2242
+ }
2243
+ .ai-key-remove-btn.hidden {
2244
+ display: none;
2245
+ }
2226
2246
  .ai-keys-active {
2227
2247
  font-size: 11px;
2228
2248
  color: var(--risk-low);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syke1/mcp-server",
3
- "version": "1.4.21",
3
+ "version": "1.4.22",
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",