@botuyo/mcp 0.3.5 → 0.3.7
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.
- package/dist/client.d.ts +3 -1
- package/dist/client.js +7 -3
- package/dist/client.js.map +1 -1
- package/dist/commands/auth.js +47 -26
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/credentials.d.ts +6 -0
- package/dist/commands/credentials.js +29 -1
- package/dist/commands/credentials.js.map +1 -1
- package/dist/commands/login.js +52 -15
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/switch_tenant.js +23 -8
- package/dist/commands/switch_tenant.js.map +1 -1
- package/dist/commands/tenants.js +15 -4
- package/dist/commands/tenants.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +47 -26
- package/dist/index.js.map +1 -1
- package/dist/tools/switch_tenant.js +1 -1
- package/dist/tools/switch_tenant.js.map +1 -1
- package/package.json +1 -1
package/dist/client.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* BotuyoApiClient - Thin HTTP wrapper around the BotUyo REST API
|
|
3
3
|
* All MCP tools go through this client.
|
|
4
4
|
*
|
|
5
|
-
* Uses a JWT token directly (obtained via `npx @botuyo/mcp login`).
|
|
5
|
+
* Uses a JWT token directly (obtained via `npx @botuyo/mcp auth` or `npx @botuyo/mcp login`).
|
|
6
6
|
* Requires Node 18+ (native fetch).
|
|
7
7
|
*/
|
|
8
8
|
export interface BotuyoClientConfig {
|
|
@@ -19,6 +19,8 @@ export declare class BotuyoApiClient {
|
|
|
19
19
|
private config;
|
|
20
20
|
private authInfo;
|
|
21
21
|
constructor(config: BotuyoClientConfig);
|
|
22
|
+
/** Get the current JWT token */
|
|
23
|
+
getToken(): string;
|
|
22
24
|
/** Hot-swap the JWT token (used by switch_tenant) */
|
|
23
25
|
setToken(token: string): void;
|
|
24
26
|
/** Verify the stored JWT is still valid by calling GET /api/auth/me */
|
package/dist/client.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* BotuyoApiClient - Thin HTTP wrapper around the BotUyo REST API
|
|
3
3
|
* All MCP tools go through this client.
|
|
4
4
|
*
|
|
5
|
-
* Uses a JWT token directly (obtained via `npx @botuyo/mcp login`).
|
|
5
|
+
* Uses a JWT token directly (obtained via `npx @botuyo/mcp auth` or `npx @botuyo/mcp login`).
|
|
6
6
|
* Requires Node 18+ (native fetch).
|
|
7
7
|
*/
|
|
8
8
|
export class BotuyoApiClient {
|
|
@@ -11,6 +11,10 @@ export class BotuyoApiClient {
|
|
|
11
11
|
constructor(config) {
|
|
12
12
|
this.config = config;
|
|
13
13
|
}
|
|
14
|
+
/** Get the current JWT token */
|
|
15
|
+
getToken() {
|
|
16
|
+
return this.config.token;
|
|
17
|
+
}
|
|
14
18
|
/** Hot-swap the JWT token (used by switch_tenant) */
|
|
15
19
|
setToken(token) {
|
|
16
20
|
this.config = { ...this.config, token };
|
|
@@ -25,7 +29,7 @@ export class BotuyoApiClient {
|
|
|
25
29
|
});
|
|
26
30
|
const body = await this.parseJson(res);
|
|
27
31
|
if (!body.success) {
|
|
28
|
-
throw new Error(`Session expired or invalid: ${body.error || 'Unknown error'}. Run: npx @botuyo/mcp login`);
|
|
32
|
+
throw new Error(`Session expired or invalid: ${body.error || 'Unknown error'}. Run: npx @botuyo/mcp auth (browser) or npx @botuyo/mcp login (terminal)`);
|
|
29
33
|
}
|
|
30
34
|
const user = body.data.user;
|
|
31
35
|
this.authInfo = {
|
|
@@ -81,7 +85,7 @@ export class BotuyoApiClient {
|
|
|
81
85
|
const json = await this.parseJson(res);
|
|
82
86
|
// Detect expired token
|
|
83
87
|
if (res.status === 401) {
|
|
84
|
-
throw new Error('Sesión expirada. Ejecutá: npx @botuyo/mcp login');
|
|
88
|
+
throw new Error('Sesión expirada. Ejecutá: npx @botuyo/mcp auth (browser) o npx @botuyo/mcp login (terminal)');
|
|
85
89
|
}
|
|
86
90
|
return json;
|
|
87
91
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,MAAM,OAAO,eAAe;IAClB,MAAM,CAAoB;IAC1B,QAAQ,GAAoB,IAAI,CAAA;IAExC,YAAY,MAA0B;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,qDAAqD;IACrD,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAA;QACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA,CAAC,yBAAyB;IAChD,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAA;QAEvC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,cAAc,EAAE;YAC3D,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE;SAC1D,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,KAAK,IAAI,eAAe,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,MAAM,OAAO,eAAe;IAClB,MAAM,CAAoB;IAC1B,QAAQ,GAAoB,IAAI,CAAA;IAExC,YAAY,MAA0B;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,gCAAgC;IAChC,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAA;IAC1B,CAAC;IAED,qDAAqD;IACrD,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAA;QACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA,CAAC,yBAAyB;IAChD,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,MAAM;QACV,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAA;QAEvC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,cAAc,EAAE;YAC3D,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE;SAC1D,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QACtC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,KAAK,IAAI,eAAe,2EAA2E,CAAC,CAAA;QAC1J,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;QAC3B,IAAI,CAAC,QAAQ,GAAG;YACd,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;YACnC,UAAU,EAAE,EAAE,EAAE,oCAAoC;YACpD,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,QAAQ;YACvC,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAA;QAED,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,GAAG,CAAU,IAAY;QAC7B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,EAAE;YACtD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE;SAC1D,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;IACjC,CAAC;IAED,yCAAyC;IACzC,KAAK,CAAC,IAAI,CAAU,IAAY,EAAE,IAAa;QAC7C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,EAAE;YACtD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC5C,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;IACjC,CAAC;IAED,wCAAwC;IACxC,KAAK,CAAC,GAAG,CAAU,IAAY,EAAE,IAAa;QAC5C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,EAAE;YACtD,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC5C,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;IACjC,CAAC;IAED,2CAA2C;IAC3C,KAAK,CAAC,MAAM,CAAU,IAAY;QAChC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,EAAE;YACtD,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;aAC7C;SACF,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;IACjC,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,GAAa;QACxC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;QAEtC,uBAAuB;QACvB,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,6FAA6F,CAAC,CAAA;QAChH,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,GAAa;QACnC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAC7B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC7B,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAA;YACrD,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,MAAM,CAAC,CAAA;YAC7D,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;QAC9D,CAAC;IACH,CAAC;CACF"}
|
package/dist/commands/auth.js
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
import http from 'http';
|
|
18
18
|
import { URL } from 'url';
|
|
19
19
|
import { execSync } from 'child_process';
|
|
20
|
-
import { readCredentials, saveCredentials } from './credentials.js';
|
|
20
|
+
import { readCredentials, saveCredentials, clearCredentials, verifyTokenWithServer } from './credentials.js';
|
|
21
21
|
import os from 'os';
|
|
22
22
|
const ADMIN_URL = process.env.BOTUYO_ADMIN_URL || 'https://botuyo.com';
|
|
23
23
|
const API_URL = process.env.BOTUYO_API_URL || 'https://api.botuyo.com';
|
|
@@ -25,15 +25,23 @@ export async function runAuth(args) {
|
|
|
25
25
|
console.log('\n🤖 BotUyo MCP — Autenticación por Browser\n');
|
|
26
26
|
const existing = await readCredentials();
|
|
27
27
|
if (existing && !args.includes('--force')) {
|
|
28
|
-
const
|
|
29
|
-
if (
|
|
30
|
-
|
|
31
|
-
console.log(
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
28
|
+
const localExpired = existing.expiresAt && new Date(existing.expiresAt) < new Date();
|
|
29
|
+
if (localExpired) {
|
|
30
|
+
await clearCredentials();
|
|
31
|
+
console.log('⚠️ Tu sesión expiró. Vamos a re-autenticarte.\n');
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// Verify token is still valid on server
|
|
35
|
+
const valid = await verifyTokenWithServer(existing.token, API_URL);
|
|
36
|
+
if (valid) {
|
|
37
|
+
console.log(`✅ Ya estás autenticado como: ${existing.email || 'usuario'}`);
|
|
38
|
+
console.log(` Tenant: ${existing.tenantName} (${existing.role})`);
|
|
39
|
+
console.log('\n Usá --force para re-autenticarte.');
|
|
40
|
+
console.log(' O usá `npx @botuyo/mcp login` para login por terminal.\n');
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
console.log('⚠️ Tu sesión ya no es válida en el servidor. Vamos a re-autenticarte.\n');
|
|
35
44
|
}
|
|
36
|
-
console.log('⚠️ Tu sesión expiró. Vamos a re-autenticarte.\n');
|
|
37
45
|
}
|
|
38
46
|
// Start local callback server
|
|
39
47
|
const { port, waitForCode } = await startCallbackServer();
|
|
@@ -69,6 +77,19 @@ export async function runAuth(args) {
|
|
|
69
77
|
savedAt: new Date().toISOString(),
|
|
70
78
|
expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString() // 7 days
|
|
71
79
|
};
|
|
80
|
+
// Resolve the real tenant name via API (OAuth response often only has the ID)
|
|
81
|
+
if (creds.tenantName === creds.tenantId) {
|
|
82
|
+
try {
|
|
83
|
+
const tRes = await fetch(`${API_URL}/api/v1/tenants/${creds.tenantId}`, {
|
|
84
|
+
headers: { Authorization: `Bearer ${creds.token}` }
|
|
85
|
+
});
|
|
86
|
+
const tData = (await tRes.json());
|
|
87
|
+
const name = tData.data?.name || tData.data?.tenant?.name;
|
|
88
|
+
if (name)
|
|
89
|
+
creds.tenantName = name;
|
|
90
|
+
}
|
|
91
|
+
catch { /* keep ID as fallback */ }
|
|
92
|
+
}
|
|
72
93
|
await saveCredentials(creds);
|
|
73
94
|
console.log(`\n✅ ¡Autenticado exitosamente!`);
|
|
74
95
|
console.log(` Tenant: ${creds.tenantName}`);
|
|
@@ -90,24 +111,24 @@ function startCallbackServer() {
|
|
|
90
111
|
if (url.pathname === '/callback') {
|
|
91
112
|
const code = url.searchParams.get('code');
|
|
92
113
|
const html = code
|
|
93
|
-
? `<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
94
|
-
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;600;700&display=swap" rel="stylesheet">
|
|
95
|
-
<style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:'Plus Jakarta Sans',sans-serif;min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#f8fafc,#eef2ff,#f8fafc);color:#0f172a}
|
|
96
|
-
.card{text-align:center;max-width:420px;padding:48px 32px;background:#fff;border-radius:20px;border:1px solid #e2e8f0;box-shadow:0 25px 50px rgba(0,0,0,.08)}
|
|
97
|
-
.icon{width:64px;height:64px;margin:0 auto 20px;background:#f0fdf4;border-radius:16px;display:flex;align-items:center;justify-content:center;font-size:28px}
|
|
98
|
-
h2{font-size:22px;font-weight:700;margin-bottom:8px}p{color:#64748b;font-size:15px;line-height:1.6}
|
|
99
|
-
.badge{display:inline-block;margin-top:16px;background:#eef2ff;color:#4f46e5;padding:6px 16px;border-radius:8px;font-size:13px;font-weight:600}</style></head>
|
|
100
|
-
<body><div class="card"><div class="icon">✅</div><h2>BotUyo CLI Autorizado</h2>
|
|
101
|
-
<p>Podés cerrar esta pestaña y volver a la terminal.</p>
|
|
114
|
+
? `<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
115
|
+
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;600;700&display=swap" rel="stylesheet">
|
|
116
|
+
<style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:'Plus Jakarta Sans',sans-serif;min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#f8fafc,#eef2ff,#f8fafc);color:#0f172a}
|
|
117
|
+
.card{text-align:center;max-width:420px;padding:48px 32px;background:#fff;border-radius:20px;border:1px solid #e2e8f0;box-shadow:0 25px 50px rgba(0,0,0,.08)}
|
|
118
|
+
.icon{width:64px;height:64px;margin:0 auto 20px;background:#f0fdf4;border-radius:16px;display:flex;align-items:center;justify-content:center;font-size:28px}
|
|
119
|
+
h2{font-size:22px;font-weight:700;margin-bottom:8px}p{color:#64748b;font-size:15px;line-height:1.6}
|
|
120
|
+
.badge{display:inline-block;margin-top:16px;background:#eef2ff;color:#4f46e5;padding:6px 16px;border-radius:8px;font-size:13px;font-weight:600}</style></head>
|
|
121
|
+
<body><div class="card"><div class="icon">✅</div><h2>BotUyo CLI Autorizado</h2>
|
|
122
|
+
<p>Podés cerrar esta pestaña y volver a la terminal.</p>
|
|
102
123
|
<span class="badge">Sesión activa</span></div></body></html>`
|
|
103
|
-
: `<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
104
|
-
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;600;700&display=swap" rel="stylesheet">
|
|
105
|
-
<style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:'Plus Jakarta Sans',sans-serif;min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#f8fafc,#fff1f2,#f8fafc);color:#0f172a}
|
|
106
|
-
.card{text-align:center;max-width:420px;padding:48px 32px;background:#fff;border-radius:20px;border:1px solid #e2e8f0;box-shadow:0 25px 50px rgba(0,0,0,.08)}
|
|
107
|
-
.icon{width:64px;height:64px;margin:0 auto 20px;background:#fef2f2;border-radius:16px;display:flex;align-items:center;justify-content:center;font-size:28px}
|
|
108
|
-
h2{font-size:22px;font-weight:700;margin-bottom:8px}p{color:#64748b;font-size:15px;line-height:1.6}
|
|
109
|
-
code{background:#f1f5f9;padding:2px 8px;border-radius:4px;font-size:13px}</style></head>
|
|
110
|
-
<body><div class="card"><div class="icon">❌</div><h2>Autorización fallida</h2>
|
|
124
|
+
: `<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
125
|
+
<link href="https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;600;700&display=swap" rel="stylesheet">
|
|
126
|
+
<style>*{margin:0;padding:0;box-sizing:border-box}body{font-family:'Plus Jakarta Sans',sans-serif;min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,#f8fafc,#fff1f2,#f8fafc);color:#0f172a}
|
|
127
|
+
.card{text-align:center;max-width:420px;padding:48px 32px;background:#fff;border-radius:20px;border:1px solid #e2e8f0;box-shadow:0 25px 50px rgba(0,0,0,.08)}
|
|
128
|
+
.icon{width:64px;height:64px;margin:0 auto 20px;background:#fef2f2;border-radius:16px;display:flex;align-items:center;justify-content:center;font-size:28px}
|
|
129
|
+
h2{font-size:22px;font-weight:700;margin-bottom:8px}p{color:#64748b;font-size:15px;line-height:1.6}
|
|
130
|
+
code{background:#f1f5f9;padding:2px 8px;border-radius:4px;font-size:13px}</style></head>
|
|
131
|
+
<body><div class="card"><div class="icon">❌</div><h2>Autorización fallida</h2>
|
|
111
132
|
<p>No se recibió el código. Ejecutá <code>npx @botuyo/mcp auth</code> de nuevo.</p></div></body></html>`;
|
|
112
133
|
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
113
134
|
res.end(html);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAqB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,qBAAqB,EAAqB,MAAM,kBAAkB,CAAA;AAC/H,OAAO,EAAE,MAAM,IAAI,CAAA;AAEnB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,oBAAoB,CAAA;AACtE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,wBAAwB,CAAA;AAEtE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAc;IAC1C,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAA;IAE5D,MAAM,QAAQ,GAAG,MAAM,eAAe,EAAE,CAAA;IACxC,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE,CAAA;QACpF,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,gBAAgB,EAAE,CAAA;YACxB,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAA;QACjE,CAAC;aAAM,CAAC;YACN,wCAAwC;YACxC,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;YAClE,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,gCAAgC,QAAQ,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,CAAA;gBAC1E,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAA;gBACnE,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;gBACrD,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAA;gBAC1E,OAAM;YACR,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAA;QACzF,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,mBAAmB,EAAE,CAAA;IACzD,MAAM,WAAW,GAAG,oBAAoB,IAAI,WAAW,CAAA;IACvD,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAE7D,MAAM,OAAO,GAAG,GAAG,SAAS,sBAAsB,kBAAkB,CAAC,WAAW,CAAC,WAAW,UAAU,EAAE,CAAA;IAExG,OAAO,CAAC,GAAG,CAAC,6CAA6C,OAAO,IAAI,CAAC,CAAA;IACrE,WAAW,CAAC,OAAO,CAAC,CAAA;IACpB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAA;IAE9D,MAAM,IAAI,GAAG,MAAM,WAAW,CAAA;IAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAA;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAA;IAEtD,2DAA2D;IAC3D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,yBAAyB,EAAE;QAChE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;KAC7D,CAAC,CAAA;IACF,MAAM,SAAS,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAQ,CAAA;IAEhD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,YAAY,SAAS,CAAC,KAAK,EAAE,CAAC,CAAA;QAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,KAAK,GAAsB;QAC/B,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK;QAC3B,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,QAAQ;QACjC,UAAU,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ;QAChE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,QAAQ;QACrC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE;QACvC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACjC,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,SAAS;KAClF,CAAA;IAED,8EAA8E;IAC9E,IAAI,KAAK,CAAC,UAAU,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,mBAAmB,KAAK,CAAC,QAAQ,EAAE,EAAE;gBACtE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,CAAC,KAAK,EAAE,EAAE;aACpD,CAAC,CAAA;YACF,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAQ,CAAA;YACxC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAA;YACzD,IAAI,IAAI;gBAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAA;QACnC,CAAC;QAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,eAAe,CAAC,KAAK,CAAC,CAAA;IAE5B,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAA;IAC7C,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,UAAU,EAAE,CAAC,CAAA;IAC9C,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;IACxC,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,CAAC,KAAK,IAAI,iBAAiB,EAAE,CAAC,CAAA;IAC9D,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;IAC5E,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAA;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,iFAAiF;AACjF,SAAS,mBAAmB;IAC1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,WAA0C,CAAA;QAE9C,MAAM,WAAW,GAAG,IAAI,OAAO,CAAgB,CAAC,GAAG,EAAE,EAAE;YACrD,WAAW,GAAG,GAAG,CAAA;QACnB,CAAC,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC5C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAA;YAEvD,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;gBAEzC,MAAM,IAAI,GAAG,IAAI;oBACf,CAAC,CAAC;;;;;;;;;0EAS8D;oBAChE,CAAC,CAAC;;;;;;;;qHAQyG,CAAA;gBAE7G,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAA;gBACnD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBAEb,MAAM,CAAC,KAAK,EAAE,CAAA;gBACd,WAAY,CAAC,IAAI,CAAC,CAAA;YACpB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;gBAClB,GAAG,CAAC,GAAG,EAAE,CAAA;YACX,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,IAAI,GAAI,MAAM,CAAC,OAAO,EAAU,CAAC,IAAI,CAAA;YAC3C,UAAU,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,WAAY,CAAC,IAAI,CAAC,CAAA,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAA;YACxE,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;QAChC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,iFAAiF;AACjF,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;IACjC,IAAI,CAAC;QACH,IAAI,QAAQ,KAAK,OAAO;YAAE,QAAQ,CAAC,aAAa,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;aACvE,IAAI,QAAQ,KAAK,QAAQ;YAAE,QAAQ,CAAC,SAAS,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;;YACzE,QAAQ,CAAC,aAAa,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,+DAA+D,GAAG,IAAI,CAAC,CAAA;IACrF,CAAC;AACH,CAAC"}
|
|
@@ -26,3 +26,9 @@ export declare function resolveToken(): Promise<string | null>;
|
|
|
26
26
|
* Check if stored credentials are expired
|
|
27
27
|
*/
|
|
28
28
|
export declare function isTokenExpired(): Promise<boolean>;
|
|
29
|
+
/**
|
|
30
|
+
* Verify a token with the server (GET /api/auth/me).
|
|
31
|
+
* Returns true if valid, false if expired/invalid.
|
|
32
|
+
* On failure, auto-clears stored credentials.
|
|
33
|
+
*/
|
|
34
|
+
export declare function verifyTokenWithServer(token: string, apiUrl?: string): Promise<boolean>;
|
|
@@ -41,8 +41,9 @@ export async function resolveToken() {
|
|
|
41
41
|
const creds = await readCredentials();
|
|
42
42
|
if (!creds?.token)
|
|
43
43
|
return null;
|
|
44
|
-
// Check if expired
|
|
44
|
+
// Check if expired — auto-clear stale credentials
|
|
45
45
|
if (creds.expiresAt && new Date(creds.expiresAt) < new Date()) {
|
|
46
|
+
await clearCredentials();
|
|
46
47
|
return null; // expired
|
|
47
48
|
}
|
|
48
49
|
return creds.token;
|
|
@@ -56,4 +57,31 @@ export async function isTokenExpired() {
|
|
|
56
57
|
return true;
|
|
57
58
|
return new Date(creds.expiresAt) < new Date();
|
|
58
59
|
}
|
|
60
|
+
/**
|
|
61
|
+
* Verify a token with the server (GET /api/auth/me).
|
|
62
|
+
* Returns true if valid, false if expired/invalid.
|
|
63
|
+
* On failure, auto-clears stored credentials.
|
|
64
|
+
*/
|
|
65
|
+
export async function verifyTokenWithServer(token, apiUrl) {
|
|
66
|
+
const url = apiUrl || process.env.BOTUYO_API_URL || 'https://api.botuyo.com';
|
|
67
|
+
try {
|
|
68
|
+
const res = await fetch(`${url}/api/auth/me`, {
|
|
69
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
70
|
+
});
|
|
71
|
+
if (!res.ok) {
|
|
72
|
+
await clearCredentials();
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
const body = await res.json();
|
|
76
|
+
if (!body.success) {
|
|
77
|
+
await clearCredentials();
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// Network error — don't clear credentials, just can't verify
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
59
87
|
//# sourceMappingURL=credentials.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/commands/credentials.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAE5B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAA;AAC7C,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAA;AAY7D,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAA;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAwB;IAC5D,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5C,MAAM,SAAS,CAAC,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;AAC3E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAA;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;IAE7D,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;IACrC,IAAI,CAAC,KAAK,EAAE,KAAK;QAAE,OAAO,IAAI,CAAA;IAE9B,
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/commands/credentials.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/login.js
CHANGED
|
@@ -13,20 +13,42 @@
|
|
|
13
13
|
* 6. Saves the credentials to ~/.botuyo/credentials.json
|
|
14
14
|
*/
|
|
15
15
|
import * as readline from 'readline';
|
|
16
|
-
import { readCredentials, saveCredentials } from './credentials.js';
|
|
16
|
+
import { readCredentials, saveCredentials, clearCredentials, verifyTokenWithServer } from './credentials.js';
|
|
17
17
|
const API_URL = process.env.BOTUYO_API_URL || 'https://api.botuyo.com';
|
|
18
18
|
export async function runLogin(args) {
|
|
19
19
|
console.log('\n🤖 BotUyo MCP — Login\n');
|
|
20
20
|
const existing = await readCredentials();
|
|
21
21
|
if (existing && !args.includes('--force')) {
|
|
22
|
-
const
|
|
23
|
-
if (
|
|
24
|
-
|
|
25
|
-
console.log(
|
|
26
|
-
|
|
22
|
+
const localExpired = existing.expiresAt && new Date(existing.expiresAt) < new Date();
|
|
23
|
+
if (localExpired) {
|
|
24
|
+
await clearCredentials();
|
|
25
|
+
console.log('⚠️ Tu sesión expiró. Vamos a re-autenticarte.\n');
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
// Verify token is still valid on server
|
|
29
|
+
const valid = await verifyTokenWithServer(existing.token, API_URL);
|
|
30
|
+
if (valid) {
|
|
31
|
+
console.log(`✅ Ya estás autenticado como: ${existing.email}`);
|
|
32
|
+
console.log(` Tenant: ${existing.tenantName} (${existing.role})`);
|
|
33
|
+
console.log('\n Usá --force para re-autenticarte.');
|
|
34
|
+
console.log(' O usá `npx @botuyo/mcp auth` para login por browser (OAuth).\n');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
console.log('⚠️ Tu sesión ya no es válida en el servidor. Vamos a re-autenticarte.\n');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Offer login method choice
|
|
41
|
+
if (process.stdin.isTTY) {
|
|
42
|
+
console.log(' 1. 🔑 Email y password (en esta terminal)');
|
|
43
|
+
console.log(' 2. 🌐 Browser OAuth (abre el navegador)\n');
|
|
44
|
+
const method = await prompt('¿Cómo querés autenticarte? (1 o 2, Enter para 1): ');
|
|
45
|
+
if (method.trim() === '2') {
|
|
46
|
+
console.log('');
|
|
47
|
+
const { runAuth } = await import('./auth.js');
|
|
48
|
+
await runAuth(args);
|
|
27
49
|
return;
|
|
28
50
|
}
|
|
29
|
-
console.log('
|
|
51
|
+
console.log('');
|
|
30
52
|
}
|
|
31
53
|
// Prompt for email and password
|
|
32
54
|
const email = await prompt('📧 Email: ');
|
|
@@ -68,11 +90,20 @@ export async function runLogin(args) {
|
|
|
68
90
|
const tenantInfos = await Promise.all(tenantIds.map(async (tid, i) => {
|
|
69
91
|
const role = roles.find((r) => r.tenantId === tid)?.role || 'member';
|
|
70
92
|
const isActive = tid === tenantId;
|
|
71
|
-
|
|
93
|
+
let name = tid;
|
|
94
|
+
try {
|
|
95
|
+
const tRes = await fetch(`${API_URL}/api/v1/tenants/${tid}`, {
|
|
96
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
97
|
+
});
|
|
98
|
+
const tData = (await tRes.json());
|
|
99
|
+
name = tData.data?.name || tData.data?.tenant?.name || tid;
|
|
100
|
+
}
|
|
101
|
+
catch { /* keep tid as fallback */ }
|
|
102
|
+
return { id: tid, name, role, isActive, index: i + 1 };
|
|
72
103
|
}));
|
|
73
104
|
for (const t of tenantInfos) {
|
|
74
105
|
const marker = t.isActive ? ' ← actual' : '';
|
|
75
|
-
console.log(` ${t.index}. ${t.
|
|
106
|
+
console.log(` ${t.index}. ${t.name} (${t.role})${marker}`);
|
|
76
107
|
}
|
|
77
108
|
const choice = await prompt('\n¿Qué tenant querés usar? (número, Enter para el actual): ');
|
|
78
109
|
const choiceNum = parseInt(choice, 10);
|
|
@@ -80,7 +111,7 @@ export async function runLogin(args) {
|
|
|
80
111
|
const selectedTenant = tenantInfos[choiceNum - 1];
|
|
81
112
|
if (selectedTenant.id !== tenantId) {
|
|
82
113
|
// Switch tenant
|
|
83
|
-
console.log(`\n⏳ Cambiando a tenant ${selectedTenant.
|
|
114
|
+
console.log(`\n⏳ Cambiando a tenant ${selectedTenant.name}...`);
|
|
84
115
|
const switchRes = await fetch(`${API_URL}/api/auth/switch-tenant`, {
|
|
85
116
|
method: 'POST',
|
|
86
117
|
headers: {
|
|
@@ -169,7 +200,9 @@ function promptPassword(question) {
|
|
|
169
200
|
stdin.pause();
|
|
170
201
|
stdin.removeListener('data', onData);
|
|
171
202
|
rl.close();
|
|
172
|
-
process.stdout.
|
|
203
|
+
process.stdout.clearLine(0);
|
|
204
|
+
process.stdout.cursorTo(0);
|
|
205
|
+
process.stdout.write(question + '\n');
|
|
173
206
|
resolve(password);
|
|
174
207
|
break;
|
|
175
208
|
case '\u0003': // Ctrl+C
|
|
@@ -178,14 +211,18 @@ function promptPassword(question) {
|
|
|
178
211
|
case '\u007F': // Backspace
|
|
179
212
|
if (password.length > 0) {
|
|
180
213
|
password = password.slice(0, -1);
|
|
181
|
-
process.stdout.clearLine(0);
|
|
182
|
-
process.stdout.cursorTo(0);
|
|
183
|
-
process.stdout.write(question + '*'.repeat(password.length));
|
|
184
214
|
}
|
|
215
|
+
// Always clear and redraw to prevent any char leaking
|
|
216
|
+
process.stdout.clearLine(0);
|
|
217
|
+
process.stdout.cursorTo(0);
|
|
218
|
+
process.stdout.write(question + '*'.repeat(password.length));
|
|
185
219
|
break;
|
|
186
220
|
default:
|
|
187
221
|
password += c;
|
|
188
|
-
|
|
222
|
+
// Clear entire line and redraw to prevent any char leaking
|
|
223
|
+
process.stdout.clearLine(0);
|
|
224
|
+
process.stdout.cursorTo(0);
|
|
225
|
+
process.stdout.write(question + '*'.repeat(password.length));
|
|
189
226
|
break;
|
|
190
227
|
}
|
|
191
228
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAqB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@ export async function runSwitchTenant() {
|
|
|
15
15
|
const token = await resolveToken();
|
|
16
16
|
const creds = await readCredentials();
|
|
17
17
|
if (!token || !creds) {
|
|
18
|
-
console.error('❌ No estás autenticado. Ejecutá: npx @botuyo/mcp login');
|
|
18
|
+
console.error('❌ No estás autenticado. Ejecutá: npx @botuyo/mcp auth (browser) o npx @botuyo/mcp login (terminal)');
|
|
19
19
|
process.exit(1);
|
|
20
20
|
}
|
|
21
21
|
// Get user's tenants
|
|
@@ -25,7 +25,7 @@ export async function runSwitchTenant() {
|
|
|
25
25
|
const meData = (await meRes.json());
|
|
26
26
|
if (!meData.success) {
|
|
27
27
|
console.error(`❌ Sesión inválida: ${meData.error || 'Token expirado'}`);
|
|
28
|
-
console.error(' Ejecutá: npx @botuyo/mcp login');
|
|
28
|
+
console.error(' Ejecutá: npx @botuyo/mcp auth (browser) o npx @botuyo/mcp login (terminal)');
|
|
29
29
|
process.exit(1);
|
|
30
30
|
}
|
|
31
31
|
const user = meData.data.user;
|
|
@@ -41,12 +41,26 @@ export async function runSwitchTenant() {
|
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
43
|
console.log(`Tenés ${tenantIds.length} tenants disponibles:\n`);
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
// Fetch tenant names for display
|
|
45
|
+
const tenantInfos = await Promise.all(tenantIds.map(async (tid, i) => {
|
|
46
46
|
const role = roles.find((r) => r.tenantId === tid)?.role || 'member';
|
|
47
47
|
const isActive = tid === creds.tenantId;
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
let name = isActive ? (creds.tenantName || tid) : tid;
|
|
49
|
+
if (name === tid) {
|
|
50
|
+
try {
|
|
51
|
+
const tRes = await fetch(`${API_URL}/api/v1/tenants/${tid}`, {
|
|
52
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
53
|
+
});
|
|
54
|
+
const tData = (await tRes.json());
|
|
55
|
+
name = tData.data?.name || tData.data?.tenant?.name || tid;
|
|
56
|
+
}
|
|
57
|
+
catch { /* keep tid as fallback */ }
|
|
58
|
+
}
|
|
59
|
+
return { id: tid, name, role, isActive, index: i + 1 };
|
|
60
|
+
}));
|
|
61
|
+
for (const t of tenantInfos) {
|
|
62
|
+
const marker = t.isActive ? ' ← actual' : '';
|
|
63
|
+
console.log(` ${t.index}. ${t.name} (${t.role})${marker}`);
|
|
50
64
|
}
|
|
51
65
|
const choice = await prompt('\n¿A qué tenant querés cambiar? (número): ');
|
|
52
66
|
const choiceNum = parseInt(choice, 10);
|
|
@@ -54,12 +68,13 @@ export async function runSwitchTenant() {
|
|
|
54
68
|
console.log('Operación cancelada.');
|
|
55
69
|
return;
|
|
56
70
|
}
|
|
57
|
-
const
|
|
71
|
+
const selectedTenant = tenantInfos[choiceNum - 1];
|
|
72
|
+
const selectedTenantId = selectedTenant.id;
|
|
58
73
|
if (selectedTenantId === creds.tenantId) {
|
|
59
74
|
console.log('\nYa estás en ese tenant. No hubo cambios.\n');
|
|
60
75
|
return;
|
|
61
76
|
}
|
|
62
|
-
console.log(`\n⏳ Cambiando a tenant ${
|
|
77
|
+
console.log(`\n⏳ Cambiando a tenant ${selectedTenant.name}...`);
|
|
63
78
|
const switchRes = await fetch(`${API_URL}/api/auth/switch-tenant`, {
|
|
64
79
|
method: 'POST',
|
|
65
80
|
headers: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switch_tenant.js","sourceRoot":"","sources":["../../src/commands/switch_tenant.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AAEH,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEjF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,wBAAwB,CAAA;AAEtE,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;IAEhD,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAA;IAClC,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;IAErC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"switch_tenant.js","sourceRoot":"","sources":["../../src/commands/switch_tenant.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/tenants.js
CHANGED
|
@@ -13,7 +13,7 @@ export async function runTenants() {
|
|
|
13
13
|
const token = await resolveToken();
|
|
14
14
|
const creds = await readCredentials();
|
|
15
15
|
if (!token || !creds) {
|
|
16
|
-
console.error('❌ No estás autenticado. Ejecutá: npx @botuyo/mcp login');
|
|
16
|
+
console.error('❌ No estás autenticado. Ejecutá: npx @botuyo/mcp auth (browser) o npx @botuyo/mcp login (terminal)');
|
|
17
17
|
process.exit(1);
|
|
18
18
|
}
|
|
19
19
|
const meRes = await fetch(`${API_URL}/api/auth/me`, {
|
|
@@ -22,7 +22,7 @@ export async function runTenants() {
|
|
|
22
22
|
const meData = (await meRes.json());
|
|
23
23
|
if (!meData.success) {
|
|
24
24
|
console.error(`❌ Sesión inválida: ${meData.error || 'Token expirado'}`);
|
|
25
|
-
console.error(' Ejecutá: npx @botuyo/mcp login');
|
|
25
|
+
console.error(' Ejecutá: npx @botuyo/mcp auth (browser) o npx @botuyo/mcp login (terminal)');
|
|
26
26
|
process.exit(1);
|
|
27
27
|
}
|
|
28
28
|
const user = meData.data.user;
|
|
@@ -34,14 +34,25 @@ export async function runTenants() {
|
|
|
34
34
|
}
|
|
35
35
|
console.log(`Email: ${creds.email}`);
|
|
36
36
|
console.log(`Tenants: ${tenantIds.length}\n`);
|
|
37
|
-
console.log(' #
|
|
37
|
+
console.log(' # Nombre Rol Estado');
|
|
38
38
|
console.log(' ─ ───────────────────────────────── ───────── ──────');
|
|
39
39
|
for (let i = 0; i < tenantIds.length; i++) {
|
|
40
40
|
const tid = tenantIds[i];
|
|
41
41
|
const role = roles.find((r) => r.tenantId === tid)?.role || 'member';
|
|
42
42
|
const isActive = tid === creds.tenantId;
|
|
43
|
+
let name = isActive ? (creds.tenantName || tid) : tid;
|
|
44
|
+
if (name === tid) {
|
|
45
|
+
try {
|
|
46
|
+
const tRes = await fetch(`${API_URL}/api/v1/tenants/${tid}`, {
|
|
47
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
48
|
+
});
|
|
49
|
+
const tData = (await tRes.json());
|
|
50
|
+
name = tData.data?.name || tData.data?.tenant?.name || tid;
|
|
51
|
+
}
|
|
52
|
+
catch { /* keep tid as fallback */ }
|
|
53
|
+
}
|
|
43
54
|
const status = isActive ? '✓ activo' : '';
|
|
44
|
-
console.log(` ${i + 1} ${
|
|
55
|
+
console.log(` ${i + 1} ${name.padEnd(37)} ${role.padEnd(10)} ${status}`);
|
|
45
56
|
}
|
|
46
57
|
console.log(`\nPara cambiar de tenant: npx @botuyo/mcp switch-tenant\n`);
|
|
47
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tenants.js","sourceRoot":"","sources":["../../src/commands/tenants.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEhE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,wBAAwB,CAAA;AAEtE,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAA;IAE9C,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAA;IAClC,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;IAErC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"tenants.js","sourceRoot":"","sources":["../../src/commands/tenants.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* @botuyo/mcp — Entry Point
|
|
4
4
|
*
|
|
5
5
|
* Sub-commands:
|
|
6
|
-
* npx @botuyo/mcp login — Login with email/password
|
|
6
|
+
* npx @botuyo/mcp login — Login with email/password (terminal)
|
|
7
|
+
* npx @botuyo/mcp auth — Login via browser OAuth (recommended)
|
|
7
8
|
* npx @botuyo/mcp tenants — List your tenants
|
|
8
9
|
* npx @botuyo/mcp switch-tenant — Switch active tenant
|
|
9
10
|
* npx @botuyo/mcp setup — Generate mcp.json for your editor
|
|
@@ -13,6 +14,6 @@
|
|
|
13
14
|
*
|
|
14
15
|
* Token resolution (in priority order):
|
|
15
16
|
* 1. BOTUYO_TOKEN env var
|
|
16
|
-
* 2. ~/.botuyo/credentials.json (saved by `
|
|
17
|
+
* 2. ~/.botuyo/credentials.json (saved by `login` or `auth`)
|
|
17
18
|
*/
|
|
18
19
|
export {};
|
package/dist/index.js
CHANGED
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* @botuyo/mcp — Entry Point
|
|
4
4
|
*
|
|
5
5
|
* Sub-commands:
|
|
6
|
-
* npx @botuyo/mcp login — Login with email/password
|
|
6
|
+
* npx @botuyo/mcp login — Login with email/password (terminal)
|
|
7
|
+
* npx @botuyo/mcp auth — Login via browser OAuth (recommended)
|
|
7
8
|
* npx @botuyo/mcp tenants — List your tenants
|
|
8
9
|
* npx @botuyo/mcp switch-tenant — Switch active tenant
|
|
9
10
|
* npx @botuyo/mcp setup — Generate mcp.json for your editor
|
|
@@ -13,7 +14,7 @@
|
|
|
13
14
|
*
|
|
14
15
|
* Token resolution (in priority order):
|
|
15
16
|
* 1. BOTUYO_TOKEN env var
|
|
16
|
-
* 2. ~/.botuyo/credentials.json (saved by `
|
|
17
|
+
* 2. ~/.botuyo/credentials.json (saved by `login` or `auth`)
|
|
17
18
|
*/
|
|
18
19
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
19
20
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
@@ -61,7 +62,7 @@ async function main() {
|
|
|
61
62
|
const token = await resolveToken();
|
|
62
63
|
const creds = await readCredentials();
|
|
63
64
|
if (!token || !creds) {
|
|
64
|
-
console.log('No estás autenticado. Ejecutá: npx @botuyo/mcp login');
|
|
65
|
+
console.log('No estás autenticado. Ejecutá: npx @botuyo/mcp auth (browser) o npx @botuyo/mcp login (terminal)');
|
|
65
66
|
return;
|
|
66
67
|
}
|
|
67
68
|
const expired = await isTokenExpired();
|
|
@@ -69,7 +70,7 @@ async function main() {
|
|
|
69
70
|
console.log(`Tenant: ${creds.tenantName}`);
|
|
70
71
|
console.log(`Role: ${creds.role}`);
|
|
71
72
|
console.log(`Expira: ${new Date(creds.expiresAt).toLocaleDateString()}`);
|
|
72
|
-
console.log(`Estado: ${expired ? '❌ Expirado — ejecutá: npx @botuyo/mcp login' : '✅ Activo'}`);
|
|
73
|
+
console.log(`Estado: ${expired ? '❌ Expirado — ejecutá: npx @botuyo/mcp auth (browser) o npx @botuyo/mcp login (terminal)' : '✅ Activo'}`);
|
|
73
74
|
return;
|
|
74
75
|
}
|
|
75
76
|
// ── logout ─────────────────────────────────────────────────────────────
|
|
@@ -85,35 +86,37 @@ async function main() {
|
|
|
85
86
|
}
|
|
86
87
|
}
|
|
87
88
|
async function startMcpServer() {
|
|
88
|
-
// Resolve JWT token
|
|
89
|
+
// Resolve JWT token — server starts regardless of auth state
|
|
89
90
|
const token = await resolveToken();
|
|
91
|
+
let authenticated = false;
|
|
92
|
+
let client = null;
|
|
90
93
|
if (!token) {
|
|
91
94
|
const expired = await isTokenExpired();
|
|
92
95
|
if (expired) {
|
|
93
|
-
console.error('[botuyo-mcp]
|
|
96
|
+
console.error('[botuyo-mcp] ⚠ Tu sesión expiró. Ejecutá: npx @botuyo/mcp login');
|
|
94
97
|
}
|
|
95
98
|
else {
|
|
96
|
-
console.error('[botuyo-mcp]
|
|
99
|
+
console.error('[botuyo-mcp] ⚠ No hay credenciales. Ejecutá: npx @botuyo/mcp login');
|
|
97
100
|
}
|
|
98
|
-
console.error('[botuyo-mcp] Ejecutá `npx @botuyo/mcp login` para autenticarte.');
|
|
99
|
-
process.exit(1);
|
|
100
101
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
102
|
+
else {
|
|
103
|
+
const creds = await readCredentials();
|
|
104
|
+
client = new BotuyoApiClient({ token, apiUrl: API_URL });
|
|
105
|
+
try {
|
|
106
|
+
const auth = await client.verify();
|
|
107
|
+
const tenantName = creds?.tenantName || auth.tenantId;
|
|
108
|
+
const role = creds?.role || auth.role;
|
|
109
|
+
console.error(`[botuyo-mcp] ✓ Conectado a "${tenantName}" como ${role}`);
|
|
110
|
+
authenticated = true;
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
114
|
+
console.error(`[botuyo-mcp] ⚠ Auth failed: ${msg}`);
|
|
115
|
+
console.error('[botuyo-mcp] Las tools pedirán re-autenticación. Ejecutá: npx @botuyo/mcp login');
|
|
116
|
+
}
|
|
115
117
|
}
|
|
116
|
-
|
|
118
|
+
const AUTH_ERROR_MSG = 'No autenticado. El usuario debe ejecutar: npx @botuyo/mcp login';
|
|
119
|
+
// ── MCP Server — starts ALWAYS, even without valid auth ────────────────
|
|
117
120
|
const server = new Server({ name: 'botuyo-mcp', version: '0.3.0' }, { capabilities: { tools: {} } });
|
|
118
121
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: ALL_TOOLS }));
|
|
119
122
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
@@ -122,16 +125,34 @@ async function startMcpServer() {
|
|
|
122
125
|
if (!handler) {
|
|
123
126
|
return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };
|
|
124
127
|
}
|
|
128
|
+
// Guard: if not authenticated, every tool returns a login prompt
|
|
129
|
+
if (!authenticated || !client) {
|
|
130
|
+
return { content: [{ type: 'text', text: AUTH_ERROR_MSG }], isError: true };
|
|
131
|
+
}
|
|
125
132
|
try {
|
|
126
133
|
const result = await handler(client, args || {});
|
|
127
134
|
return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
|
|
128
135
|
}
|
|
129
136
|
catch (error) {
|
|
130
137
|
const msg = error instanceof Error ? error.message : String(error);
|
|
131
|
-
// Detect expired token
|
|
138
|
+
// Detect expired token — try to reload credentials from disk (user may have re-authenticated)
|
|
132
139
|
if (msg.includes('401') || msg.includes('expirada') || msg.includes('expired')) {
|
|
140
|
+
const freshToken = await resolveToken();
|
|
141
|
+
if (freshToken && freshToken !== client.getToken()) {
|
|
142
|
+
// New credentials found on disk — hot-swap and retry once
|
|
143
|
+
client.setToken(freshToken);
|
|
144
|
+
console.error('[botuyo-mcp] ✓ Credenciales recargadas desde disco, reintentando...');
|
|
145
|
+
try {
|
|
146
|
+
const retryResult = await handler(client, args || {});
|
|
147
|
+
return { content: [{ type: 'text', text: JSON.stringify(retryResult, null, 2) }] };
|
|
148
|
+
}
|
|
149
|
+
catch (retryError) {
|
|
150
|
+
const retryMsg = retryError instanceof Error ? retryError.message : String(retryError);
|
|
151
|
+
return { content: [{ type: 'text', text: `Error tras reintentar: ${retryMsg}` }], isError: true };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
133
154
|
return {
|
|
134
|
-
content: [{ type: 'text', text: `Sesión expirada. El usuario debe ejecutar: npx @botuyo/mcp login` }],
|
|
155
|
+
content: [{ type: 'text', text: `Sesión expirada. El usuario debe ejecutar en su terminal: npx @botuyo/mcp auth (browser OAuth) o npx @botuyo/mcp login (email/password)` }],
|
|
135
156
|
isError: true
|
|
136
157
|
};
|
|
137
158
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@ const API_URL = process.env.BOTUYO_API_URL || 'https://api.botuyo.com';
|
|
|
20
20
|
export async function switchTenantHandler(client, args) {
|
|
21
21
|
const creds = await readCredentials();
|
|
22
22
|
if (!creds?.token) {
|
|
23
|
-
return { success: false, error: 'No credentials found. Run: npx @botuyo/mcp login' };
|
|
23
|
+
return { success: false, error: 'No credentials found. Run: npx @botuyo/mcp auth (browser) or npx @botuyo/mcp login (terminal)' };
|
|
24
24
|
}
|
|
25
25
|
// Get user info with tenants
|
|
26
26
|
const meRes = await client.get('/api/auth/me');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switch_tenant.js","sourceRoot":"","sources":["../../src/tools/switch_tenant.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAE7E,MAAM,CAAC,MAAM,kBAAkB,GAAS;IACtC,IAAI,EAAE,eAAe;IACrB,WAAW,EACT,iDAAiD;QACjD,wEAAwE;QACxE,sDAAsD;QACtD,gEAAgE;IAClE,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,6DAA6D;aAC3E;SACF;QACD,QAAQ,EAAE,EAAE;KACb;CACF,CAAA;AAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,wBAAwB,CAAA;AAEtE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAuB,EAAE,IAA6B;IAC9F,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAA;IACrC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"switch_tenant.js","sourceRoot":"","sources":["../../src/tools/switch_tenant.ts"],"names":[],"mappings":"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"}
|