@prestyj/cli 4.11.4 → 4.12.0
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/app-sidecar.js +366 -53
- package/dist/app-sidecar.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +5 -3
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session.d.ts +53 -11
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +150 -35
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/api-benchmark.d.ts +64 -0
- package/dist/core/api-benchmark.d.ts.map +1 -0
- package/dist/core/api-benchmark.js +381 -0
- package/dist/core/api-benchmark.js.map +1 -0
- package/dist/core/mcp/client.d.ts +21 -0
- package/dist/core/mcp/client.d.ts.map +1 -1
- package/dist/core/mcp/client.js +167 -5
- package/dist/core/mcp/client.js.map +1 -1
- package/dist/core/mcp/index.d.ts +3 -1
- package/dist/core/mcp/index.d.ts.map +1 -1
- package/dist/core/mcp/index.js +2 -0
- package/dist/core/mcp/index.js.map +1 -1
- package/dist/core/mcp/oauth-provider.d.ts +51 -0
- package/dist/core/mcp/oauth-provider.d.ts.map +1 -0
- package/dist/core/mcp/oauth-provider.js +95 -0
- package/dist/core/mcp/oauth-provider.js.map +1 -0
- package/dist/core/mcp/oauth-store.d.ts +39 -0
- package/dist/core/mcp/oauth-store.d.ts.map +1 -0
- package/dist/core/mcp/oauth-store.js +63 -0
- package/dist/core/mcp/oauth-store.js.map +1 -0
- package/dist/core/mcp/oauth-store.test.d.ts +2 -0
- package/dist/core/mcp/oauth-store.test.d.ts.map +1 -0
- package/dist/core/mcp/oauth-store.test.js +94 -0
- package/dist/core/mcp/oauth-store.test.js.map +1 -0
- package/dist/core/process-manager.d.ts.map +1 -1
- package/dist/core/process-manager.js +5 -1
- package/dist/core/process-manager.js.map +1 -1
- package/dist/core/prompt-commands.d.ts.map +1 -1
- package/dist/core/prompt-commands.js +112 -0
- package/dist/core/prompt-commands.js.map +1 -1
- package/dist/core/prompt-commands.test.js +22 -0
- package/dist/core/prompt-commands.test.js.map +1 -1
- package/dist/core/settings-manager.d.ts +4 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +5 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/shell.d.ts +51 -0
- package/dist/core/shell.d.ts.map +1 -0
- package/dist/core/shell.js +82 -0
- package/dist/core/shell.js.map +1 -0
- package/dist/core/shell.test.d.ts +2 -0
- package/dist/core/shell.test.d.ts.map +1 -0
- package/dist/core/shell.test.js +87 -0
- package/dist/core/shell.test.js.map +1 -0
- package/dist/core/speed-benchmark.d.ts +133 -0
- package/dist/core/speed-benchmark.d.ts.map +1 -0
- package/dist/core/speed-benchmark.js +410 -0
- package/dist/core/speed-benchmark.js.map +1 -0
- package/dist/core/speed-benchmark.test.d.ts +2 -0
- package/dist/core/speed-benchmark.test.d.ts.map +1 -0
- package/dist/core/speed-benchmark.test.js +97 -0
- package/dist/core/speed-benchmark.test.js.map +1 -0
- package/dist/interactive.d.ts.map +1 -1
- package/dist/interactive.js +4 -3
- package/dist/interactive.js.map +1 -1
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +17 -1
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/generate-image.d.ts +39 -0
- package/dist/tools/generate-image.d.ts.map +1 -0
- package/dist/tools/generate-image.js +301 -0
- package/dist/tools/generate-image.js.map +1 -0
- package/dist/tools/generate-image.test.d.ts +2 -0
- package/dist/tools/generate-image.test.d.ts.map +1 -0
- package/dist/tools/generate-image.test.js +223 -0
- package/dist/tools/generate-image.test.js.map +1 -0
- package/dist/tools/index.d.ts +12 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +16 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/plan-mode.test.js +5 -5
- package/dist/tools/plan-mode.test.js.map +1 -1
- package/dist/tools/prompt-hints.d.ts.map +1 -1
- package/dist/tools/prompt-hints.js +2 -0
- package/dist/tools/prompt-hints.js.map +1 -1
- package/dist/tools/safe-env.d.ts.map +1 -1
- package/dist/tools/safe-env.js +27 -0
- package/dist/tools/safe-env.js.map +1 -1
- package/dist/ui/App.d.ts +1 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/hooks/usePixelFixFlow.d.ts +1 -1
- package/dist/ui/hooks/usePixelFixFlow.d.ts.map +1 -1
- package/dist/ui/hooks/usePixelFixFlow.js +1 -1
- package/dist/ui/hooks/usePixelFixFlow.js.map +1 -1
- package/dist/ui/render.d.ts +1 -1
- package/dist/ui/render.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/core/mcp/client.js
CHANGED
|
@@ -2,9 +2,13 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
|
2
2
|
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
3
3
|
import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
|
|
4
4
|
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
5
|
+
import { UnauthorizedError } from "@modelcontextprotocol/sdk/client/auth.js";
|
|
5
6
|
import { z } from "zod";
|
|
7
|
+
import http from "node:http";
|
|
6
8
|
import os from "node:os";
|
|
7
9
|
import { log } from "../logger.js";
|
|
10
|
+
import { McpOAuthProvider, MCP_OAUTH_CALLBACK_PORT, MCP_OAUTH_CALLBACK_PATH, } from "./oauth-provider.js";
|
|
11
|
+
import { McpOAuthStore } from "./oauth-store.js";
|
|
8
12
|
export class MCPClientManager {
|
|
9
13
|
servers = [];
|
|
10
14
|
async connectAll(configs) {
|
|
@@ -26,9 +30,10 @@ export class MCPClientManager {
|
|
|
26
30
|
if (result.status === "fulfilled") {
|
|
27
31
|
return { name, ok: true, toolCount: result.value.length, tools: result.value };
|
|
28
32
|
}
|
|
29
|
-
const
|
|
33
|
+
const requiresAuth = isUnauthorized(result.reason);
|
|
34
|
+
const error = requiresAuth ? "Requires login." : formatConnectError(result.reason);
|
|
30
35
|
log("WARN", "mcp", `Failed to connect to MCP server "${name}"`, { error });
|
|
31
|
-
return { name, ok: false, toolCount: 0, tools: [], error };
|
|
36
|
+
return { name, ok: false, toolCount: 0, tools: [], error, requiresAuth };
|
|
32
37
|
});
|
|
33
38
|
const connected = results.filter((r) => r.ok).length;
|
|
34
39
|
const toolCount = results.reduce((sum, r) => sum + r.toolCount, 0);
|
|
@@ -56,8 +61,133 @@ export class MCPClientManager {
|
|
|
56
61
|
return { name: config.name, ok: true, toolCount: tools.length, tools };
|
|
57
62
|
}
|
|
58
63
|
catch (err) {
|
|
59
|
-
const
|
|
60
|
-
|
|
64
|
+
const requiresAuth = isUnauthorized(err);
|
|
65
|
+
const error = requiresAuth ? "Requires login." : formatConnectError(err);
|
|
66
|
+
return { name: config.name, ok: false, toolCount: 0, tools: [], error, requiresAuth };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Run the interactive OAuth login for one remote MCP server end-to-end:
|
|
71
|
+
* start a loopback callback server, let the SDK open the browser via
|
|
72
|
+
* `onAuthorizationUrl`, capture the redirect, exchange the code, then verify
|
|
73
|
+
* the authorized connection by listing tools. Tokens are persisted by the
|
|
74
|
+
* provider so later (non-interactive) connects succeed silently.
|
|
75
|
+
*
|
|
76
|
+
* `onAuthorizationUrl` is invoked with the authorize URL so the host can open
|
|
77
|
+
* it (the ezcoder-app broadcasts it to the webview, which opens the system
|
|
78
|
+
* browser; the CLI prints it). Never throws — returns `{ ok:false, error }`.
|
|
79
|
+
*/
|
|
80
|
+
async login(config, onAuthorizationUrl, timeoutMs = 180_000) {
|
|
81
|
+
if (!config.url) {
|
|
82
|
+
return { ok: false, toolCount: 0, error: "Login is only supported for HTTP MCP servers." };
|
|
83
|
+
}
|
|
84
|
+
const url = new URL(config.url);
|
|
85
|
+
const store = new McpOAuthStore();
|
|
86
|
+
// Fresh PKCE/state for this attempt so a previous half-finished login can't
|
|
87
|
+
// poison the exchange.
|
|
88
|
+
await store.patch(config.name, { codeVerifier: undefined, state: undefined });
|
|
89
|
+
let codeResolve;
|
|
90
|
+
let codeReject;
|
|
91
|
+
const codePromise = new Promise((resolve, reject) => {
|
|
92
|
+
codeResolve = resolve;
|
|
93
|
+
codeReject = reject;
|
|
94
|
+
});
|
|
95
|
+
const provider = new McpOAuthProvider({
|
|
96
|
+
serverName: config.name,
|
|
97
|
+
store,
|
|
98
|
+
onRedirect: (authUrl) => onAuthorizationUrl(authUrl.toString()),
|
|
99
|
+
});
|
|
100
|
+
const expectedState = await provider.state();
|
|
101
|
+
// Loopback server that receives the OAuth redirect. Bound to the fixed
|
|
102
|
+
// callback port that the registered redirect_uri points at.
|
|
103
|
+
const server = http.createServer((req, res) => {
|
|
104
|
+
const reqUrl = new URL(req.url || "", `http://localhost:${MCP_OAUTH_CALLBACK_PORT}`);
|
|
105
|
+
if (reqUrl.pathname !== MCP_OAUTH_CALLBACK_PATH) {
|
|
106
|
+
res.statusCode = 404;
|
|
107
|
+
res.end("Not found");
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const err = reqUrl.searchParams.get("error");
|
|
111
|
+
const code = reqUrl.searchParams.get("code");
|
|
112
|
+
const state = reqUrl.searchParams.get("state");
|
|
113
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
114
|
+
if (err) {
|
|
115
|
+
res.end(`<html><body><h1>Login failed</h1><p>${escapeHtml(err)}</p></body></html>`);
|
|
116
|
+
codeReject?.(new Error(`Authorization failed: ${err}`));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (!code) {
|
|
120
|
+
res.end("<html><body><h1>Login failed</h1><p>No authorization code.</p></body></html>");
|
|
121
|
+
codeReject?.(new Error("No authorization code in callback."));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (state !== expectedState) {
|
|
125
|
+
res.end("<html><body><h1>Login failed</h1><p>State mismatch.</p></body></html>");
|
|
126
|
+
codeReject?.(new Error("OAuth state mismatch."));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
res.end("<html><body><h1>Login successful!</h1><p>You can close this tab and return to EZ Coder.</p></body></html>");
|
|
130
|
+
codeResolve?.(code);
|
|
131
|
+
});
|
|
132
|
+
try {
|
|
133
|
+
await new Promise((resolve, reject) => {
|
|
134
|
+
server.once("error", reject);
|
|
135
|
+
server.listen(MCP_OAUTH_CALLBACK_PORT, "127.0.0.1", () => resolve());
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
140
|
+
const hint = msg.includes("EADDRINUSE") || msg.includes("in use")
|
|
141
|
+
? `Port ${MCP_OAUTH_CALLBACK_PORT} is in use — close whatever is using it and retry.`
|
|
142
|
+
: msg;
|
|
143
|
+
return { ok: false, toolCount: 0, error: `Could not start login callback server: ${hint}` };
|
|
144
|
+
}
|
|
145
|
+
const overallTimeout = setTimeout(() => {
|
|
146
|
+
codeReject?.(new Error("Login timed out waiting for the browser callback."));
|
|
147
|
+
}, timeoutMs);
|
|
148
|
+
overallTimeout.unref();
|
|
149
|
+
try {
|
|
150
|
+
// First connect triggers the redirect (browser opens) then throws
|
|
151
|
+
// UnauthorizedError — that's the expected, not a failure.
|
|
152
|
+
const loginTransport = new StreamableHTTPClientTransport(url, {
|
|
153
|
+
requestInit: config.headers ? { headers: config.headers } : undefined,
|
|
154
|
+
authProvider: provider,
|
|
155
|
+
});
|
|
156
|
+
const loginClient = new Client({ name: "ezcoder", version: "1.0.0" });
|
|
157
|
+
try {
|
|
158
|
+
await loginClient.connect(loginTransport);
|
|
159
|
+
// Already authorized (had valid tokens) — nothing more to do.
|
|
160
|
+
const { tools } = await loginClient.listTools();
|
|
161
|
+
await loginClient.close().catch(() => { });
|
|
162
|
+
return { ok: true, toolCount: tools.length };
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
if (!isUnauthorized(err))
|
|
166
|
+
throw err;
|
|
167
|
+
}
|
|
168
|
+
const code = await codePromise;
|
|
169
|
+
// Exchange the code for tokens (persisted via provider.saveTokens).
|
|
170
|
+
await loginTransport.finishAuth(code);
|
|
171
|
+
await loginClient.close().catch(() => { });
|
|
172
|
+
// Verify the authorized connection on a fresh transport + list tools.
|
|
173
|
+
const verifyTransport = new StreamableHTTPClientTransport(url, {
|
|
174
|
+
requestInit: config.headers ? { headers: config.headers } : undefined,
|
|
175
|
+
authProvider: provider,
|
|
176
|
+
});
|
|
177
|
+
const verifyClient = new Client({ name: "ezcoder", version: "1.0.0" });
|
|
178
|
+
await verifyClient.connect(verifyTransport);
|
|
179
|
+
const { tools } = await verifyClient.listTools();
|
|
180
|
+
await verifyClient.close().catch(() => { });
|
|
181
|
+
return { ok: true, toolCount: tools.length };
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
return { ok: false, toolCount: 0, error: formatConnectError(err) };
|
|
185
|
+
}
|
|
186
|
+
finally {
|
|
187
|
+
clearTimeout(overallTimeout);
|
|
188
|
+
server.close();
|
|
189
|
+
// Clear the now-consumed in-flight PKCE/state so the store only keeps tokens.
|
|
190
|
+
await store.patch(config.name, { codeVerifier: undefined, state: undefined });
|
|
61
191
|
}
|
|
62
192
|
}
|
|
63
193
|
async connectServer(config) {
|
|
@@ -99,17 +229,26 @@ export class MCPClientManager {
|
|
|
99
229
|
}
|
|
100
230
|
}
|
|
101
231
|
else {
|
|
102
|
-
// HTTP transport — try StreamableHTTP first, fall back to SSE
|
|
232
|
+
// HTTP transport — try StreamableHTTP first, fall back to SSE. An OAuth
|
|
233
|
+
// provider (no `onRedirect`) is always attached: if the server has saved
|
|
234
|
+
// tokens it connects/refreshes silently; if it needs auth the SDK throws
|
|
235
|
+
// UnauthorizedError, which the caller maps to `requiresAuth`.
|
|
103
236
|
const url = new URL(config.url);
|
|
104
237
|
const reqInit = config.headers ? { headers: config.headers } : undefined;
|
|
238
|
+
const authProvider = new McpOAuthProvider({ serverName: config.name });
|
|
105
239
|
try {
|
|
106
240
|
transport = new StreamableHTTPClientTransport(url, {
|
|
107
241
|
requestInit: reqInit,
|
|
242
|
+
authProvider,
|
|
108
243
|
});
|
|
109
244
|
client = new Client({ name: "ezcoder", version: "1.0.0" });
|
|
110
245
|
await client.connect(transport, { timeout });
|
|
111
246
|
}
|
|
112
247
|
catch (streamableErr) {
|
|
248
|
+
// A 401 isn't a transport mismatch — don't waste time on the SSE
|
|
249
|
+
// fallback, just surface that login is required.
|
|
250
|
+
if (isUnauthorized(streamableErr))
|
|
251
|
+
throw streamableErr;
|
|
113
252
|
log("INFO", "mcp", `StreamableHTTP failed for "${config.name}", trying SSE fallback`, {
|
|
114
253
|
error: String(streamableErr),
|
|
115
254
|
});
|
|
@@ -118,6 +257,7 @@ export class MCPClientManager {
|
|
|
118
257
|
? { fetch: createHeaderFetch(config.headers) }
|
|
119
258
|
: undefined,
|
|
120
259
|
requestInit: reqInit,
|
|
260
|
+
authProvider,
|
|
121
261
|
});
|
|
122
262
|
client = new Client({ name: "ezcoder", version: "1.0.0" });
|
|
123
263
|
await client.connect(transport, { timeout });
|
|
@@ -197,6 +337,28 @@ function formatConnectError(reason) {
|
|
|
197
337
|
}
|
|
198
338
|
return msg;
|
|
199
339
|
}
|
|
340
|
+
/**
|
|
341
|
+
* Whether a connect error means the server needs OAuth login. The SDK throws
|
|
342
|
+
* its typed `UnauthorizedError` when auth is required, but a raw 401 from the
|
|
343
|
+
* initial request (before the auth machinery engages) can also surface as a
|
|
344
|
+
* plain error message — so we check both.
|
|
345
|
+
*/
|
|
346
|
+
function isUnauthorized(reason) {
|
|
347
|
+
if (reason instanceof UnauthorizedError)
|
|
348
|
+
return true;
|
|
349
|
+
const msg = reason instanceof Error ? reason.message : String(reason);
|
|
350
|
+
return (msg.includes("Unauthorized") ||
|
|
351
|
+
msg.includes("401") ||
|
|
352
|
+
msg.toLowerCase().includes("invalid_token"));
|
|
353
|
+
}
|
|
354
|
+
/** Minimal HTML-escape for echoing an OAuth error string into the callback page. */
|
|
355
|
+
function escapeHtml(value) {
|
|
356
|
+
return value
|
|
357
|
+
.replace(/&/g, "&")
|
|
358
|
+
.replace(/</g, "<")
|
|
359
|
+
.replace(/>/g, ">")
|
|
360
|
+
.replace(/"/g, """);
|
|
361
|
+
}
|
|
200
362
|
function createHeaderFetch(extraHeaders) {
|
|
201
363
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
202
364
|
return (url, init) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/mcp/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/core/mcp/client.ts"],"names":[],"mappings":"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"}
|
package/dist/core/mcp/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { MCPClientManager } from "./client.js";
|
|
2
|
-
export type { MCPConnectResult } from "./client.js";
|
|
2
|
+
export type { MCPConnectResult, MCPLoginResult } from "./client.js";
|
|
3
|
+
export { McpOAuthStore } from "./oauth-store.js";
|
|
4
|
+
export { McpOAuthProvider, mcpOAuthRedirectUrl, MCP_OAUTH_CALLBACK_PORT, } from "./oauth-provider.js";
|
|
3
5
|
export { DEFAULT_MCP_SERVERS, getMCPServers, getAllMcpServers } from "./defaults.js";
|
|
4
6
|
export type { MCPServerConfig } from "./types.js";
|
|
5
7
|
export { loadServers, addServer, removeServer, getServer, globalMcpPath, projectMcpPath, } from "./store.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACrF,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EACL,WAAW,EACX,SAAS,EACT,YAAY,EACZ,SAAS,EACT,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/core/mcp/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { MCPClientManager } from "./client.js";
|
|
2
|
+
export { McpOAuthStore } from "./oauth-store.js";
|
|
3
|
+
export { McpOAuthProvider, mcpOAuthRedirectUrl, MCP_OAUTH_CALLBACK_PORT, } from "./oauth-provider.js";
|
|
2
4
|
export { DEFAULT_MCP_SERVERS, getMCPServers, getAllMcpServers } from "./defaults.js";
|
|
3
5
|
export { loadServers, addServer, removeServer, getServer, globalMcpPath, projectMcpPath, } from "./store.js";
|
|
4
6
|
export { parseMcpAddCommand } from "./parse-add-command.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAErF,OAAO,EACL,WAAW,EACX,SAAS,EACT,YAAY,EACZ,SAAS,EACT,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAErF,OAAO,EACL,WAAW,EACX,SAAS,EACT,YAAY,EACZ,SAAS,EACT,aAAa,EACb,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { OAuthClientProvider } from "@modelcontextprotocol/sdk/client/auth.js";
|
|
2
|
+
import type { OAuthClientInformation, OAuthClientInformationFull, OAuthClientMetadata, OAuthTokens } from "@modelcontextprotocol/sdk/shared/auth.js";
|
|
3
|
+
import { McpOAuthStore } from "./oauth-store.js";
|
|
4
|
+
/**
|
|
5
|
+
* Fixed loopback port for remote-MCP OAuth callbacks. It must stay STABLE across
|
|
6
|
+
* logins: the redirect URI is baked into the dynamic client registration (RFC
|
|
7
|
+
* 7591), so a changing port would invalidate the saved registration and force a
|
|
8
|
+
* fresh one every time. Distinct from the provider-login port (1455).
|
|
9
|
+
*/
|
|
10
|
+
export declare const MCP_OAUTH_CALLBACK_PORT = 41999;
|
|
11
|
+
export declare const MCP_OAUTH_CALLBACK_PATH = "/oauth/callback";
|
|
12
|
+
/** The exact redirect URI registered with the authorization server. */
|
|
13
|
+
export declare function mcpOAuthRedirectUrl(): string;
|
|
14
|
+
/**
|
|
15
|
+
* `OAuthClientProvider` for a single remote MCP server, backed by the on-disk
|
|
16
|
+
* `McpOAuthStore`. The MCP SDK drives the whole RFC 6749/7591/8414 flow through
|
|
17
|
+
* this object:
|
|
18
|
+
*
|
|
19
|
+
* - At connect time it reads `tokens()`; if absent/expired it tries a refresh,
|
|
20
|
+
* and if that fails it calls `redirectToAuthorization()` then throws
|
|
21
|
+
* `UnauthorizedError`.
|
|
22
|
+
* - `redirectToAuthorization` is a NO-OP unless an `onRedirect` callback is
|
|
23
|
+
* supplied. Non-interactive paths (startup connect, add-probe) leave it unset,
|
|
24
|
+
* so a server needing auth fails cleanly (→ "requires login") without
|
|
25
|
+
* surprising the user with a browser tab. The interactive login path supplies
|
|
26
|
+
* `onRedirect` to open the browser.
|
|
27
|
+
*/
|
|
28
|
+
export declare class McpOAuthProvider implements OAuthClientProvider {
|
|
29
|
+
private readonly store;
|
|
30
|
+
private readonly serverName;
|
|
31
|
+
private readonly onRedirect?;
|
|
32
|
+
private readonly scope?;
|
|
33
|
+
constructor(opts: {
|
|
34
|
+
serverName: string;
|
|
35
|
+
store?: McpOAuthStore;
|
|
36
|
+
/** When set, the server is allowed to drive an interactive browser login. */
|
|
37
|
+
onRedirect?: (url: URL) => void;
|
|
38
|
+
scope?: string;
|
|
39
|
+
});
|
|
40
|
+
get redirectUrl(): string;
|
|
41
|
+
get clientMetadata(): OAuthClientMetadata;
|
|
42
|
+
state(): Promise<string>;
|
|
43
|
+
clientInformation(): Promise<OAuthClientInformationFull | undefined>;
|
|
44
|
+
saveClientInformation(info: OAuthClientInformation): Promise<void>;
|
|
45
|
+
tokens(): Promise<OAuthTokens | undefined>;
|
|
46
|
+
saveTokens(tokens: OAuthTokens): Promise<void>;
|
|
47
|
+
redirectToAuthorization(authorizationUrl: URL): void;
|
|
48
|
+
saveCodeVerifier(codeVerifier: string): Promise<void>;
|
|
49
|
+
codeVerifier(): Promise<string>;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=oauth-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-provider.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/oauth-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,KAAK,EACV,sBAAsB,EACtB,0BAA0B,EAC1B,mBAAmB,EACnB,WAAW,EACZ,MAAM,0CAA0C,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAC7C,eAAO,MAAM,uBAAuB,oBAAoB,CAAC;AAEzD,uEAAuE;AACvE,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,gBAAiB,YAAW,mBAAmB;IAC1D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAS;gBAEpB,IAAI,EAAE;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,aAAa,CAAC;QACtB,6EAA6E;QAC7E,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC;QAChC,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB;IAOD,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,cAAc,IAAI,mBAAmB,CAUxC;IAEK,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAQxB,iBAAiB,IAAI,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC;IAKpE,qBAAqB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlE,MAAM,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAK1C,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpD,uBAAuB,CAAC,gBAAgB,EAAE,GAAG,GAAG,IAAI;IAO9C,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;CAOtC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import { McpOAuthStore } from "./oauth-store.js";
|
|
3
|
+
/**
|
|
4
|
+
* Fixed loopback port for remote-MCP OAuth callbacks. It must stay STABLE across
|
|
5
|
+
* logins: the redirect URI is baked into the dynamic client registration (RFC
|
|
6
|
+
* 7591), so a changing port would invalidate the saved registration and force a
|
|
7
|
+
* fresh one every time. Distinct from the provider-login port (1455).
|
|
8
|
+
*/
|
|
9
|
+
export const MCP_OAUTH_CALLBACK_PORT = 41999;
|
|
10
|
+
export const MCP_OAUTH_CALLBACK_PATH = "/oauth/callback";
|
|
11
|
+
/** The exact redirect URI registered with the authorization server. */
|
|
12
|
+
export function mcpOAuthRedirectUrl() {
|
|
13
|
+
return `http://localhost:${MCP_OAUTH_CALLBACK_PORT}${MCP_OAUTH_CALLBACK_PATH}`;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* `OAuthClientProvider` for a single remote MCP server, backed by the on-disk
|
|
17
|
+
* `McpOAuthStore`. The MCP SDK drives the whole RFC 6749/7591/8414 flow through
|
|
18
|
+
* this object:
|
|
19
|
+
*
|
|
20
|
+
* - At connect time it reads `tokens()`; if absent/expired it tries a refresh,
|
|
21
|
+
* and if that fails it calls `redirectToAuthorization()` then throws
|
|
22
|
+
* `UnauthorizedError`.
|
|
23
|
+
* - `redirectToAuthorization` is a NO-OP unless an `onRedirect` callback is
|
|
24
|
+
* supplied. Non-interactive paths (startup connect, add-probe) leave it unset,
|
|
25
|
+
* so a server needing auth fails cleanly (→ "requires login") without
|
|
26
|
+
* surprising the user with a browser tab. The interactive login path supplies
|
|
27
|
+
* `onRedirect` to open the browser.
|
|
28
|
+
*/
|
|
29
|
+
export class McpOAuthProvider {
|
|
30
|
+
store;
|
|
31
|
+
serverName;
|
|
32
|
+
onRedirect;
|
|
33
|
+
scope;
|
|
34
|
+
constructor(opts) {
|
|
35
|
+
this.serverName = opts.serverName;
|
|
36
|
+
this.store = opts.store ?? new McpOAuthStore();
|
|
37
|
+
this.onRedirect = opts.onRedirect;
|
|
38
|
+
this.scope = opts.scope;
|
|
39
|
+
}
|
|
40
|
+
get redirectUrl() {
|
|
41
|
+
return mcpOAuthRedirectUrl();
|
|
42
|
+
}
|
|
43
|
+
get clientMetadata() {
|
|
44
|
+
return {
|
|
45
|
+
client_name: "EZ Coder",
|
|
46
|
+
client_uri: "https://github.com/kenkaiii/ezcoder",
|
|
47
|
+
redirect_uris: [this.redirectUrl],
|
|
48
|
+
grant_types: ["authorization_code", "refresh_token"],
|
|
49
|
+
response_types: ["code"],
|
|
50
|
+
token_endpoint_auth_method: "none",
|
|
51
|
+
...(this.scope ? { scope: this.scope } : {}),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async state() {
|
|
55
|
+
const entry = await this.store.get(this.serverName);
|
|
56
|
+
if (entry.state)
|
|
57
|
+
return entry.state;
|
|
58
|
+
const fresh = crypto.randomBytes(16).toString("hex");
|
|
59
|
+
await this.store.patch(this.serverName, { state: fresh });
|
|
60
|
+
return fresh;
|
|
61
|
+
}
|
|
62
|
+
async clientInformation() {
|
|
63
|
+
const entry = await this.store.get(this.serverName);
|
|
64
|
+
return entry.clientInformation;
|
|
65
|
+
}
|
|
66
|
+
async saveClientInformation(info) {
|
|
67
|
+
await this.store.patch(this.serverName, {
|
|
68
|
+
clientInformation: info,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
async tokens() {
|
|
72
|
+
const entry = await this.store.get(this.serverName);
|
|
73
|
+
return entry.tokens;
|
|
74
|
+
}
|
|
75
|
+
async saveTokens(tokens) {
|
|
76
|
+
await this.store.patch(this.serverName, { tokens });
|
|
77
|
+
}
|
|
78
|
+
redirectToAuthorization(authorizationUrl) {
|
|
79
|
+
// Only interactive logins open a browser; otherwise this is intentionally a
|
|
80
|
+
// no-op so the SDK throws UnauthorizedError and the caller marks the server
|
|
81
|
+
// as "requires login" instead of popping a tab during a background connect.
|
|
82
|
+
this.onRedirect?.(authorizationUrl);
|
|
83
|
+
}
|
|
84
|
+
async saveCodeVerifier(codeVerifier) {
|
|
85
|
+
await this.store.patch(this.serverName, { codeVerifier });
|
|
86
|
+
}
|
|
87
|
+
async codeVerifier() {
|
|
88
|
+
const entry = await this.store.get(this.serverName);
|
|
89
|
+
if (!entry.codeVerifier) {
|
|
90
|
+
throw new Error("No PKCE code verifier saved for this MCP server.");
|
|
91
|
+
}
|
|
92
|
+
return entry.codeVerifier;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=oauth-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-provider.js","sourceRoot":"","sources":["../../../src/core/mcp/oauth-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { OAuthClientInformationFull, OAuthTokens } from "@modelcontextprotocol/sdk/shared/auth.js";
|
|
2
|
+
/**
|
|
3
|
+
* Persisted OAuth state for ONE remote MCP server (RFC 8414/7591/6749 flow).
|
|
4
|
+
*
|
|
5
|
+
* - `clientInformation` is the dynamic client registration (RFC 7591) result —
|
|
6
|
+
* reused across logins so the registered `redirect_uri` stays valid.
|
|
7
|
+
* - `tokens` is the access/refresh pair; the MCP SDK refreshes it in place and
|
|
8
|
+
* calls `saveTokens` so a logged-in server reconnects silently at startup.
|
|
9
|
+
* - `codeVerifier` is the in-flight PKCE verifier, only meaningful between the
|
|
10
|
+
* authorize redirect and the token exchange (`finishAuth`).
|
|
11
|
+
* - `state` is the in-flight CSRF `state` value the loopback callback validates.
|
|
12
|
+
*/
|
|
13
|
+
export interface McpOAuthEntry {
|
|
14
|
+
clientInformation?: OAuthClientInformationFull;
|
|
15
|
+
tokens?: OAuthTokens;
|
|
16
|
+
codeVerifier?: string;
|
|
17
|
+
state?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* File-backed store for remote-MCP OAuth credentials, living next to the CLI's
|
|
21
|
+
* other auth at `~/.ezcoder/mcp-auth.json`. Keyed by server name (the same identity
|
|
22
|
+
* the config + UI use). Every read re-reads the file so concurrent sidecars /
|
|
23
|
+
* windows see each other's logins; writes are read-modify-write so two servers
|
|
24
|
+
* don't clobber one another.
|
|
25
|
+
*/
|
|
26
|
+
export declare class McpOAuthStore {
|
|
27
|
+
private readonly filePath;
|
|
28
|
+
constructor(filePath?: string);
|
|
29
|
+
private readAll;
|
|
30
|
+
private writeAll;
|
|
31
|
+
get(name: string): Promise<McpOAuthEntry>;
|
|
32
|
+
/** Merge a partial entry into the server's record (read-modify-write). */
|
|
33
|
+
patch(name: string, patch: Partial<McpOAuthEntry>): Promise<void>;
|
|
34
|
+
/** Drop a server's whole OAuth record (used on logout / removal). */
|
|
35
|
+
clear(name: string): Promise<void>;
|
|
36
|
+
/** Whether this server has saved tokens (i.e. has completed login at least once). */
|
|
37
|
+
hasTokens(name: string): Promise<boolean>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=oauth-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-store.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/oauth-store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,0BAA0B,EAC1B,WAAW,EACZ,MAAM,0CAA0C,CAAC;AAGlD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,aAAa;IAC5B,iBAAiB,CAAC,EAAE,0BAA0B,CAAC;IAC/C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD;;;;;;GAMG;AACH,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,GAAE,MAAkC;YAE3D,OAAO;YAUP,QAAQ;IAahB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAK/C,0EAA0E;IACpE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvE,qEAAqE;IAC/D,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,qFAAqF;IAC/E,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAIhD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import { getAppPaths } from "@prestyj/core";
|
|
3
|
+
import { log } from "../logger.js";
|
|
4
|
+
/**
|
|
5
|
+
* File-backed store for remote-MCP OAuth credentials, living next to the CLI's
|
|
6
|
+
* other auth at `~/.ezcoder/mcp-auth.json`. Keyed by server name (the same identity
|
|
7
|
+
* the config + UI use). Every read re-reads the file so concurrent sidecars /
|
|
8
|
+
* windows see each other's logins; writes are read-modify-write so two servers
|
|
9
|
+
* don't clobber one another.
|
|
10
|
+
*/
|
|
11
|
+
export class McpOAuthStore {
|
|
12
|
+
filePath;
|
|
13
|
+
constructor(filePath = getAppPaths().mcpAuthFile) {
|
|
14
|
+
this.filePath = filePath;
|
|
15
|
+
}
|
|
16
|
+
async readAll() {
|
|
17
|
+
try {
|
|
18
|
+
const raw = await fs.readFile(this.filePath, "utf-8");
|
|
19
|
+
const parsed = JSON.parse(raw);
|
|
20
|
+
return { version: 1, servers: parsed.servers ?? {} };
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return { version: 1, servers: {} };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async writeAll(data) {
|
|
27
|
+
try {
|
|
28
|
+
await fs.writeFile(this.filePath, JSON.stringify(data, null, 2), {
|
|
29
|
+
encoding: "utf-8",
|
|
30
|
+
mode: 0o600,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
log("WARN", "mcp", "failed to persist MCP OAuth store", {
|
|
35
|
+
message: err instanceof Error ? err.message : String(err),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async get(name) {
|
|
40
|
+
const all = await this.readAll();
|
|
41
|
+
return all.servers[name] ?? {};
|
|
42
|
+
}
|
|
43
|
+
/** Merge a partial entry into the server's record (read-modify-write). */
|
|
44
|
+
async patch(name, patch) {
|
|
45
|
+
const all = await this.readAll();
|
|
46
|
+
all.servers[name] = { ...(all.servers[name] ?? {}), ...patch };
|
|
47
|
+
await this.writeAll(all);
|
|
48
|
+
}
|
|
49
|
+
/** Drop a server's whole OAuth record (used on logout / removal). */
|
|
50
|
+
async clear(name) {
|
|
51
|
+
const all = await this.readAll();
|
|
52
|
+
if (all.servers[name]) {
|
|
53
|
+
delete all.servers[name];
|
|
54
|
+
await this.writeAll(all);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Whether this server has saved tokens (i.e. has completed login at least once). */
|
|
58
|
+
async hasTokens(name) {
|
|
59
|
+
const entry = await this.get(name);
|
|
60
|
+
return !!entry.tokens?.access_token;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=oauth-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-store.js","sourceRoot":"","sources":["../../../src/core/mcp/oauth-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAK5C,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAyBnC;;;;;;GAMG;AACH,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,WAAmB,WAAW,EAAE,CAAC,WAAW;QAA5C,aAAQ,GAAR,QAAQ,CAAoC;IAAG,CAAC;IAErE,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;YACvD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACvD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACrC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,IAAiB;QACtC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;gBAC/D,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,KAAK;aACZ,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,mCAAmC,EAAE;gBACtD,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aAC1D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAY;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,KAA6B;QACrD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;QAC/D,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,qEAAqE;IACrE,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACzB,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,qFAAqF;IACrF,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC;IACtC,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-store.test.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/oauth-store.test.ts"],"names":[],"mappings":""}
|