@lifeaitools/clauth 1.5.73 → 1.5.74

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.
@@ -579,18 +579,12 @@ function dashboardHtml(port, whitelist, isStaged = false) {
579
579
  .build-label{font-size:.85rem;color:#94a3b8;flex:1}
580
580
  .build-label strong{color:#e2e8f0}
581
581
  .build-meta{font-family:'Courier New',monospace;font-size:.75rem;color:#64748b}
582
- .mcp-setup{background:#0f1d2d;border:1px solid #1e3a5f;border-radius:8px;padding:1rem 1.25rem;margin-bottom:1.25rem;display:none}
583
- .mcp-setup.open{display:block}
584
- .mcp-setup-title{font-size:.85rem;font-weight:600;color:#e2e8f0;margin-bottom:.75rem}
585
582
  .mcp-row{display:flex;align-items:center;gap:8px;margin-bottom:8px}
586
583
  .mcp-label{font-size:.72rem;color:#64748b;min-width:80px;text-transform:uppercase;letter-spacing:.5px;font-weight:600}
587
584
  .mcp-val{flex:1;font-family:'Courier New',monospace;font-size:.82rem;color:#60a5fa;background:#0a0f1a;border:1px solid #1e3a5f;border-radius:4px;padding:6px 10px;word-break:break-all;user-select:all}
588
585
  .mcp-copy{background:none;border:1px solid #334155;color:#94a3b8;border-radius:4px;padding:4px 8px;cursor:pointer;font-size:.75rem;font-family:'Courier New',monospace;transition:all .15s;flex-shrink:0}
589
586
  .mcp-copy:hover{border-color:#60a5fa;color:#60a5fa}
590
587
  .mcp-copy.ok{border-color:#4ade80;color:#4ade80}
591
- .btn-mcp-setup{background:#1e293b;color:#94a3b8;border:1px solid #334155;padding:6px 12px;font-size:.8rem;border-radius:6px;cursor:pointer;font-weight:500;transition:all .15s}
592
- .btn-mcp-setup:hover{border-color:#60a5fa;color:#60a5fa}
593
- .btn-mcp-setup:disabled{opacity:.4;cursor:not-allowed}
594
588
  .btn-add{background:#1a2e1a;color:#4ade80;border:1px solid #166534;padding:7px 16px;font-size:.85rem;border-radius:7px;cursor:pointer;font-weight:500;transition:all .15s}
595
589
  .btn-add:hover{background:#1a3d22;border-color:#4ade80}
596
590
  .add-panel{display:none;background:#1a1f2e;border:1px solid #334155;border-radius:8px;padding:1.25rem;margin-bottom:1.5rem}
@@ -620,7 +614,6 @@ function dashboardHtml(port, whitelist, isStaged = false) {
620
614
  .project-edit .pe-msg{font-size:.72rem;color:#4ade80}
621
615
  .btn-project{font-size:.68rem;color:#64748b;background:none;border:1px solid #1e293b;border-radius:3px;padding:2px 6px;cursor:pointer;transition:all .15s}
622
616
  .btn-project:hover{color:#3b82f6;border-color:#3b82f6}
623
- .btn-mcp-setup.open{border-color:#f59e0b;color:#f59e0b;background:#1a1500}
624
617
  .footer{margin-top:2rem;font-size:.75rem;color:#475569;text-align:center}
625
618
  .oauth-fields{display:flex;flex-direction:column;gap:8px;margin-bottom:8px}
626
619
  .oauth-field{display:flex;flex-direction:column;gap:3px}
@@ -837,7 +830,6 @@ function dashboardHtml(port, whitelist, isStaged = false) {
837
830
  <div class="tunnel-label"><strong>claude.ai MCP</strong> — <span class="tunnel-url"><a href="" target="_blank" id="tunnel-live-url"></a></span></div>
838
831
  <button class="btn-check" style="padding:6px 12px;font-size:.8rem" onclick="testTunnel()">Test</button>
839
832
  <button class="btn-claude" onclick="openClaude()">Connect claude.ai</button>
840
- <button class="btn-mcp-setup" id="btn-mcp-setup" onclick="toggleMcpSetup()">Setup MCP</button>
841
833
  <button class="btn-tunnel-stop" onclick="toggleTunnel('stop')">Stop</button>
842
834
  </div>
843
835
  <!-- error -->
@@ -854,58 +846,6 @@ function dashboardHtml(port, whitelist, isStaged = false) {
854
846
  </div>
855
847
  </div>
856
848
 
857
- <div class="mcp-setup" id="mcp-setup-panel">
858
- <div class="mcp-setup-title">claude.ai MCP Connectors</div>
859
- <div class="oauth-fields">
860
- <div style="font-size:.7rem;color:#64748b;margin-bottom:6px;border-bottom:1px solid #1e3a5f;padding-bottom:6px">Tunnel-based (require tunnel running)</div>
861
- <div class="mcp-row">
862
- <span class="mcp-label">Clauth</span>
863
- <span class="mcp-val" id="mcp-url">—</span>
864
- <button class="mcp-copy" onclick="copyMcp('mcp-url')">copy</button>
865
- </div>
866
- <div class="mcp-row">
867
- <span class="mcp-label">GWS</span>
868
- <span class="mcp-val" id="mcp-gws-url">—</span>
869
- <button class="mcp-copy" onclick="copyMcp('mcp-gws-url')">copy</button>
870
- </div>
871
- <div class="mcp-row">
872
- <span class="mcp-label">FS</span>
873
- <span class="mcp-val" id="mcp-fs-url">—</span>
874
- <button class="mcp-copy" onclick="copyMcp('mcp-fs-url')">copy</button>
875
- </div>
876
- <div class="mcp-row">
877
- <span class="mcp-label">Talk with CLI</span>
878
- <span class="mcp-val" id="mcp-chitchat-url">—</span>
879
- <button class="mcp-copy" onclick="copyMcp('mcp-chitchat-url')">copy</button>
880
- </div>
881
- <div style="font-size:.7rem;color:#64748b;margin:8px 0 6px;border-bottom:1px solid #1e3a5f;padding-bottom:6px">Direct servers (always available)</div>
882
- <div class="mcp-row">
883
- <span class="mcp-label">Regen Media</span>
884
- <span class="mcp-val" id="mcp-media-url">https://media.regendevcorp.com/mcp</span>
885
- <button class="mcp-copy" onclick="copyMcp('mcp-media-url')">copy</button>
886
- </div>
887
- <div class="mcp-row">
888
- <span class="mcp-label">Web Research</span>
889
- <span class="mcp-val" id="mcp-research-url">https://research.regendevcorp.com/mcp</span>
890
- <button class="mcp-copy" onclick="copyMcp('mcp-research-url')">copy</button>
891
- </div>
892
- <div style="font-size:.7rem;color:#64748b;margin:8px 0 6px;border-bottom:1px solid #1e3a5f;padding-bottom:6px">OAuth credentials (tunnel connectors only)</div>
893
- <div class="mcp-row">
894
- <span class="mcp-label">Client ID</span>
895
- <span class="mcp-val" id="mcp-client-id">—</span>
896
- <button class="mcp-copy" onclick="copyMcp('mcp-client-id')">copy</button>
897
- </div>
898
- <div class="mcp-row">
899
- <span class="mcp-label">Secret</span>
900
- <span class="mcp-val" id="mcp-client-secret">—</span>
901
- <button class="mcp-copy" onclick="copyMcp('mcp-client-secret')">copy</button>
902
- </div>
903
- </div>
904
- <div style="display:flex;align-items:center;gap:8px;margin-top:6px">
905
- <div style="font-size:.72rem;color:#64748b">Paste into <a href="https://claude.ai/settings/integrations" target="_blank" style="color:#60a5fa">claude.ai → Integrations</a></div>
906
- <button class="mcp-copy" onclick="rollMcpCreds()" style="font-size:.7rem">Roll Credentials</button>
907
- </div>
908
- </div>
909
849
 
910
850
  <div class="wizard-panel" id="wizard-panel">
911
851
  <div class="wizard-header">
@@ -1909,12 +1849,6 @@ function renderTunnelPanel(status, url, error) {
1909
1849
  const liveUrlEl = document.getElementById("tunnel-live-url");
1910
1850
  if (liveUrlEl) { liveUrlEl.href = sseUrl; liveUrlEl.textContent = sseUrl; }
1911
1851
  }
1912
- // Close MCP setup panel when not live
1913
- if (status !== "live") {
1914
- document.getElementById("mcp-setup-panel").classList.remove("open");
1915
- const mcpBtn = document.getElementById("btn-mcp-setup");
1916
- if (mcpBtn) mcpBtn.classList.remove("open");
1917
- }
1918
1852
  }
1919
1853
 
1920
1854
  async function toggleTunnel(action) {
@@ -1972,53 +1906,6 @@ function openClaude() {
1972
1906
  });
1973
1907
  }
1974
1908
 
1975
- async function toggleMcpSetup() {
1976
- const panel = document.getElementById("mcp-setup-panel");
1977
- const btn = document.getElementById("btn-mcp-setup");
1978
- const isOpen = panel.classList.toggle("open");
1979
- btn.classList.toggle("open", isOpen);
1980
- btn.textContent = isOpen ? "Close MCP" : "Setup MCP";
1981
- if (isOpen) {
1982
- try {
1983
- const m = await fetch(BASE + "/mcp-setup").then(r => r.json());
1984
- const noTunnel = "(tunnel not running)";
1985
- document.getElementById("mcp-url").textContent = m.url || noTunnel;
1986
- document.getElementById("mcp-gws-url").textContent = m.gwsUrl || noTunnel;
1987
- document.getElementById("mcp-fs-url").textContent = m.fsUrl || noTunnel;
1988
- document.getElementById("mcp-chitchat-url").textContent = m.chitchatUrl || noTunnel;
1989
- document.getElementById("mcp-client-id").textContent = m.clientId || "—";
1990
- document.getElementById("mcp-client-secret").textContent = m.clientSecret || "—";
1991
- } catch {
1992
- const noTunnel = "(error fetching)";
1993
- document.getElementById("mcp-url").textContent = noTunnel;
1994
- document.getElementById("mcp-gws-url").textContent = noTunnel;
1995
- document.getElementById("mcp-fs-url").textContent = noTunnel;
1996
- document.getElementById("mcp-chitchat-url").textContent = noTunnel;
1997
- }
1998
- }
1999
- }
2000
-
2001
- function copyMcp(elId) {
2002
- const val = document.getElementById(elId).textContent;
2003
- if (!val || val === "—" || val.startsWith("(")) return;
2004
- const btn = document.getElementById(elId).nextElementSibling;
2005
- navigator.clipboard.writeText(val).then(() => {
2006
- btn.textContent = "ok";
2007
- btn.classList.add("ok");
2008
- setTimeout(() => { btn.textContent = "copy"; btn.classList.remove("ok"); }, 1500);
2009
- }).catch(() => {});
2010
- }
2011
-
2012
- async function rollMcpCreds() {
2013
- if (!confirm("Invalidate all OAuth tokens? Claude.ai connectors will need to re-authenticate.")) return;
2014
- try {
2015
- const resp = await fetch(BASE + "/roll-mcp-creds", { method: "POST" }).then(r => r.json());
2016
- if (resp.tokens_invalidated) {
2017
- alert("All OAuth clients and tokens invalidated. Claude.ai will re-register automatically on next connection.");
2018
- }
2019
- } catch(e) { alert("Failed: " + e.message); }
2020
- }
2021
-
2022
1909
  // ── Tunnel Setup Wizard ─────────────────────
2023
1910
  let wizStep = null;
2024
1911
  let wizData = {};
@@ -2371,12 +2258,10 @@ async function wizRunCreateTunnel() {
2371
2258
  async function wizShowMcpSetup(hostname) {
2372
2259
  wizStep = "mcp_setup";
2373
2260
  const base = \`https://\${hostname}\`;
2374
- const mcpData = await apiFetch("/mcp-setup");
2375
2261
 
2376
2262
  renderWizBody(\`
2377
- <div class="wiz-desc">Add these MCP connectors in claude.ai → Integrations:</div>
2263
+ <div class="wiz-desc">Tunnel is live. Add connectors in claude.ai → Integrations.</div>
2378
2264
  <div style="display:flex;flex-direction:column;gap:8px;margin-top:10px">
2379
- <div style="font-size:.7rem;color:#64748b;border-bottom:1px solid #1e3a5f;padding-bottom:4px">Tunnel-based (require tunnel running)</div>
2380
2265
  <div class="mcp-row">
2381
2266
  <span class="mcp-label">Clauth</span>
2382
2267
  <span class="mcp-val" id="wiz-mcp-url">\${base}/clauth</span>
@@ -2397,38 +2282,12 @@ async function wizShowMcpSetup(hostname) {
2397
2282
  <span class="mcp-val" id="wiz-mcp-chitchat">\${base}/chitchat</span>
2398
2283
  <button class="mcp-copy" onclick="wizCopy('wiz-mcp-chitchat',this)">copy</button>
2399
2284
  </div>
2400
- <div style="font-size:.7rem;color:#64748b;margin-top:6px;border-bottom:1px solid #1e3a5f;padding-bottom:4px">Direct servers (always available)</div>
2401
- <div class="mcp-row">
2402
- <span class="mcp-label">Regen Media</span>
2403
- <span class="mcp-val" id="wiz-mcp-media">https://media.regendevcorp.com/mcp</span>
2404
- <button class="mcp-copy" onclick="wizCopy('wiz-mcp-media',this)">copy</button>
2405
- </div>
2406
- <div class="mcp-row">
2407
- <span class="mcp-label">Web Research</span>
2408
- <span class="mcp-val" id="wiz-mcp-research">https://research.regendevcorp.com/mcp</span>
2409
- <button class="mcp-copy" onclick="wizCopy('wiz-mcp-research',this)">copy</button>
2410
- </div>
2411
- <div style="font-size:.7rem;color:#64748b;margin-top:6px;border-bottom:1px solid #1e3a5f;padding-bottom:4px">OAuth credentials (tunnel connectors only)</div>
2412
- <div class="mcp-row">
2413
- <span class="mcp-label">Client ID</span>
2414
- <span class="mcp-val" id="wiz-mcp-cid">\${mcpData?.clientId || '(unlock required)'}</span>
2415
- <button class="mcp-copy" onclick="wizCopy('wiz-mcp-cid',this)">copy</button>
2416
- </div>
2417
- <div class="mcp-row">
2418
- <span class="mcp-label">Secret</span>
2419
- <span class="mcp-val" id="wiz-mcp-sec">\${mcpData?.clientSecret || '(unlock required)'}</span>
2420
- <button class="mcp-copy" onclick="wizCopy('wiz-mcp-sec',this)">copy</button>
2421
- </div>
2422
2285
  </div>
2423
2286
  <div style="margin-top:10px;font-size:.78rem;color:#64748b">
2424
- Paste into <a class="wiz-link" href="https://claude.ai/settings/integrations" target="_blank">claude.ai Settings Integrations</a>
2425
- </div>
2426
- <div style="margin-top:8px;font-size:.78rem;color:#64748b">
2427
- Same Client ID/Secret for all tunnel connectors. Direct servers need no credentials.
2287
+ MCP endpoints for direct servers (Regen Media, Web Research) are stored as <code>mcp-*</code> services in the vault.
2428
2288
  </div>
2429
2289
  \`, [], [
2430
2290
  \`<button class="btn-wiz-primary" onclick="window.open('https://claude.ai/settings/integrations','_blank');wizShowTest()">I've Added It — Test Now</button>\`,
2431
- \`<button class="btn-wiz-secondary" onclick="wizRollCreds()">Roll Credentials</button>\`,
2432
2291
  \`<button class="btn-wiz-secondary" onclick="wizShowTest()">Skip Test</button>\`,
2433
2292
  \`<button class="btn-wiz-secondary" onclick="closeSetupWizard()">Done</button>\`
2434
2293
  ]);
@@ -3634,17 +3493,6 @@ function createServer(initPassword, whitelist, port, tunnelHostnameInit = null,
3634
3493
  });
3635
3494
  }
3636
3495
 
3637
- // GET /mcp-setup — OAuth setup info for claude.ai MCP (localhost only)
3638
- if (method === "GET" && reqPath === "/mcp-setup") {
3639
- const base = tunnelUrl && tunnelUrl.startsWith("http") ? tunnelUrl : null;
3640
- return ok(res, {
3641
- url: base ? `${base}/clauth` : null,
3642
- gwsUrl: base ? `${base}/gws` : null,
3643
- fsUrl: base ? `${base}/fs` : null,
3644
- chitchatUrl: base ? `${base}/chitchat` : null,
3645
- note: "OAuth 2.1 public client — Claude registers dynamically, no client_secret needed",
3646
- });
3647
- }
3648
3496
 
3649
3497
  // POST /roll-mcp-creds — invalidate all tokens and clear all dynamic clients
3650
3498
  if (method === "POST" && reqPath === "/roll-mcp-creds") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifeaitools/clauth",
3
- "version": "1.5.73",
3
+ "version": "1.5.74",
4
4
  "description": "Hardware-bound credential vault for the LIFEAI infrastructure stack",
5
5
  "type": "module",
6
6
  "bin": {