@padua/cli 2.0.14 → 2.0.16
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/README.md +3 -1
- package/dist/mcp/daemon/entry.js +12 -5
- package/dist/mcp/daemon/entry.js.map +1 -1
- package/dist/mcp/server/server.d.ts +11 -2
- package/dist/mcp/server/server.d.ts.map +1 -1
- package/dist/mcp/server/server.js +165 -30
- package/dist/mcp/server/server.js.map +1 -1
- package/dist/mcp/token/manager.d.ts +16 -0
- package/dist/mcp/token/manager.d.ts.map +1 -1
- package/dist/mcp/token/manager.js +51 -0
- package/dist/mcp/token/manager.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -104,7 +104,8 @@ Steps 5-7 are non-blocking — if a provider fails, the rest of Padua still work
|
|
|
104
104
|
|
|
105
105
|
- **Transport:** HTTP with [Streamable HTTP](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http) transport at `POST /mcp`
|
|
106
106
|
- **Auth:** `Authorization: Bearer padua-mcp-local` (fixed token — the server only binds to localhost)
|
|
107
|
-
- **Tokens:** OAuth tokens persisted to `~/.padua/tokens.db` (AES-256-GCM encrypted),
|
|
107
|
+
- **Tokens:** OAuth tokens persisted to `~/.padua/tokens.db` (AES-256-GCM encrypted), proactively refreshed before expiry and lazily refreshed on tool calls
|
|
108
|
+
- **Sessions:** Multi-session support — multiple Claude Code instances share the daemon concurrently, each with an independent session. Stale sessions are swept after 30 minutes, max 10 concurrent sessions with LRU eviction
|
|
108
109
|
|
|
109
110
|
### IDE Configuration
|
|
110
111
|
|
|
@@ -347,6 +348,7 @@ padua doctor --migrate-tokens
|
|
|
347
348
|
| Legacy daemon running | `pkill -f padua-mcp-daemon` |
|
|
348
349
|
| Tools not appearing | Verify `padua login` completed steps 5-7; check `padua doctor` for provider status |
|
|
349
350
|
| 401 Unauthorized | Ensure your IDE config includes the `Authorization: Bearer padua-mcp-local` header |
|
|
351
|
+
| MCP reconnection fails | Upgrade to v2.0.15+ — the daemon now handles ungraceful disconnects automatically |
|
|
350
352
|
|
|
351
353
|
### Downgrade to 1.x
|
|
352
354
|
|
package/dist/mcp/daemon/entry.js
CHANGED
|
@@ -121,11 +121,11 @@ async function main() {
|
|
|
121
121
|
logger.debug('Package version resolved', { version });
|
|
122
122
|
const tokenStore = wireProviders();
|
|
123
123
|
logger.debug('Creating MCP server', { port, hasBearer: bearerToken.length > 0 });
|
|
124
|
-
const server = (0, server_1.createMcpServer)({ port, bearerToken, version, logLevel }, getProviderStatuses)
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
logger.debug('Provider tools registered
|
|
124
|
+
const server = (0, server_1.createMcpServer)({ port, bearerToken, version, logLevel }, getProviderStatuses, (mcpServer) => {
|
|
125
|
+
const adapter = new adapter_1.McpServerAdapter(mcpServer);
|
|
126
|
+
registry.registerAll(adapter);
|
|
127
|
+
});
|
|
128
|
+
logger.debug('Provider tools registered via registerTools callback');
|
|
129
129
|
// Start the HTTP + MCP transport.
|
|
130
130
|
await server.start();
|
|
131
131
|
logger.debug('HTTP server listening', { address: `127.0.0.1:${port}` });
|
|
@@ -139,6 +139,13 @@ async function main() {
|
|
|
139
139
|
logger.warn(`Provider not ready: ${result.name}`, { error: result.error?.message });
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
|
+
// Start proactive token refresh so tokens stay fresh even with zero tool calls.
|
|
143
|
+
for (const [name, tm] of tokenManagers) {
|
|
144
|
+
if (tm instanceof manager_1.OAuthTokenManager) {
|
|
145
|
+
tm.startProactiveRefresh();
|
|
146
|
+
logger.info(`Proactive token refresh started: ${name}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
142
149
|
// Graceful shutdown: clean up providers, store, and daemon files.
|
|
143
150
|
process.on('SIGTERM', async () => {
|
|
144
151
|
logger.info('SIGTERM received, shutting down daemon...', { pid: process.pid });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../../../src/mcp/daemon/entry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"entry.js","sourceRoot":"","sources":["../../../src/mcp/daemon/entry.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,9 +14,18 @@ export interface McpServerConfig {
|
|
|
14
14
|
}
|
|
15
15
|
export interface McpServerInstance {
|
|
16
16
|
httpServer: Server;
|
|
17
|
-
mcpServer: McpServer;
|
|
18
17
|
start(): Promise<void>;
|
|
19
18
|
stop(): Promise<void>;
|
|
20
19
|
}
|
|
21
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Creates the MCP HTTP server with multi-session support.
|
|
22
|
+
*
|
|
23
|
+
* Each MCP client gets its own McpServer + Transport pair so multiple Claude
|
|
24
|
+
* Code instances can share the daemon without interfering. Stale sessions
|
|
25
|
+
* (no activity for 30 minutes) are swept automatically.
|
|
26
|
+
*
|
|
27
|
+
* @param registerTools — called on every new McpServer to register provider
|
|
28
|
+
* tools and resources. Omit for a bare server (useful in tests).
|
|
29
|
+
*/
|
|
30
|
+
export declare function createMcpServer(config: McpServerConfig, getProviderStatuses: () => Record<string, string>, registerTools?: (mcpServer: McpServer) => void): McpServerInstance;
|
|
22
31
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/server/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAmC,MAAM,WAAW,CAAC;AAEzE,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/mcp/server/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAmC,MAAM,WAAW,CAAC;AAEzE,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuBpE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAqGD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,eAAe,EACvB,mBAAmB,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjD,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,GAC7C,iBAAiB,CAuMnB"}
|
|
@@ -10,6 +10,15 @@ const ratelimit_1 = require("./ratelimit");
|
|
|
10
10
|
const health_1 = require("./health");
|
|
11
11
|
const routes_1 = require("./routes");
|
|
12
12
|
const logging_1 = require("./logging");
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Constants
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
const SESSION_TTL_MS = 30 * 60 * 1000; // 30 minutes of inactivity
|
|
17
|
+
const SWEEP_INTERVAL_MS = 5 * 60 * 1000; // sweep every 5 minutes
|
|
18
|
+
const MAX_SESSIONS = 10;
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Helpers
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
13
22
|
function runMiddleware(req, res, middlewares, final) {
|
|
14
23
|
let index = 0;
|
|
15
24
|
function next() {
|
|
@@ -41,19 +50,7 @@ function sendNotFound(res, url) {
|
|
|
41
50
|
function isMcpRoute(url) {
|
|
42
51
|
return url === '/mcp' || url.startsWith('/mcp?');
|
|
43
52
|
}
|
|
44
|
-
|
|
45
|
-
try {
|
|
46
|
-
await transport.handleRequest(req, res);
|
|
47
|
-
}
|
|
48
|
-
catch (err) {
|
|
49
|
-
logger.error('MCP handler error', { error: String(err), correlationId });
|
|
50
|
-
if (!res.headersSent) {
|
|
51
|
-
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
52
|
-
res.end(JSON.stringify({ error: { code: 'INTERNAL_ERROR', message: 'Internal server error' } }));
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
function buildRequestHandler(authMiddleware, rateLimiter, transport, healthHandler, logger, maxBodySize) {
|
|
53
|
+
function buildRequestHandler(authMiddleware, rateLimiter, healthHandler, logger, maxBodySize, handleMcp) {
|
|
57
54
|
return async (req, res) => {
|
|
58
55
|
const correlationId = (0, node_crypto_1.randomUUID)();
|
|
59
56
|
res.setHeader('X-Correlation-Id', correlationId);
|
|
@@ -73,7 +70,7 @@ function buildRequestHandler(authMiddleware, rateLimiter, transport, healthHandl
|
|
|
73
70
|
runMiddleware(req, res, [authMiddleware, rateLimiter], async () => {
|
|
74
71
|
if (isMcpRoute(url)) {
|
|
75
72
|
logger.debug('MCP request', { method, correlationId });
|
|
76
|
-
await
|
|
73
|
+
await handleMcp(req, res, correlationId);
|
|
77
74
|
return;
|
|
78
75
|
}
|
|
79
76
|
logger.debug('Route not found', { url, correlationId });
|
|
@@ -81,17 +78,133 @@ function buildRequestHandler(authMiddleware, rateLimiter, transport, healthHandl
|
|
|
81
78
|
});
|
|
82
79
|
};
|
|
83
80
|
}
|
|
84
|
-
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
// Factory
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
/**
|
|
85
|
+
* Creates the MCP HTTP server with multi-session support.
|
|
86
|
+
*
|
|
87
|
+
* Each MCP client gets its own McpServer + Transport pair so multiple Claude
|
|
88
|
+
* Code instances can share the daemon without interfering. Stale sessions
|
|
89
|
+
* (no activity for 30 minutes) are swept automatically.
|
|
90
|
+
*
|
|
91
|
+
* @param registerTools — called on every new McpServer to register provider
|
|
92
|
+
* tools and resources. Omit for a bare server (useful in tests).
|
|
93
|
+
*/
|
|
94
|
+
function createMcpServer(config, getProviderStatuses, registerTools) {
|
|
85
95
|
const logger = (0, logging_1.createLogger)(config.logDir, config.logLevel);
|
|
86
96
|
const maxBodySize = config.maxBodySize ?? 4 * 1024 * 1024;
|
|
87
97
|
const startTime = Date.now();
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
// Multi-session transport management
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
const activeSessions = new Map();
|
|
102
|
+
/**
|
|
103
|
+
* Creates a new McpServer + Transport pair for an incoming MCP session.
|
|
104
|
+
* Each session is independent — tool handlers share the same providers/tokens
|
|
105
|
+
* but each McpServer has its own Protocol connection.
|
|
106
|
+
*/
|
|
107
|
+
async function createSession() {
|
|
108
|
+
// Evict the oldest session when at capacity
|
|
109
|
+
if (activeSessions.size >= MAX_SESSIONS) {
|
|
110
|
+
let oldestId = null;
|
|
111
|
+
let oldestActivity = Infinity;
|
|
112
|
+
for (const [id, session] of activeSessions) {
|
|
113
|
+
if (session.lastActivity < oldestActivity) {
|
|
114
|
+
oldestActivity = session.lastActivity;
|
|
115
|
+
oldestId = id;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (oldestId) {
|
|
119
|
+
const old = activeSessions.get(oldestId);
|
|
120
|
+
logger.info('Evicting oldest MCP session at capacity', { sessionId: oldestId });
|
|
121
|
+
await old.transport.close().catch(() => { });
|
|
122
|
+
await old.mcpServer.close().catch(() => { });
|
|
123
|
+
activeSessions.delete(oldestId);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const sessionMcpServer = new mcp_js_1.McpServer({
|
|
127
|
+
name: 'padua-mcp',
|
|
128
|
+
version: config.version,
|
|
129
|
+
});
|
|
130
|
+
if (registerTools) {
|
|
131
|
+
registerTools(sessionMcpServer);
|
|
132
|
+
}
|
|
133
|
+
const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
|
|
134
|
+
sessionIdGenerator: () => (0, node_crypto_1.randomUUID)(),
|
|
135
|
+
onsessioninitialized: (sessionId) => {
|
|
136
|
+
activeSessions.set(sessionId, {
|
|
137
|
+
mcpServer: sessionMcpServer,
|
|
138
|
+
transport,
|
|
139
|
+
lastActivity: Date.now(),
|
|
140
|
+
});
|
|
141
|
+
logger.info('MCP session initialized', {
|
|
142
|
+
sessionId,
|
|
143
|
+
activeSessions: activeSessions.size,
|
|
144
|
+
});
|
|
145
|
+
},
|
|
146
|
+
onsessionclosed: (sessionId) => {
|
|
147
|
+
const session = activeSessions.get(sessionId);
|
|
148
|
+
if (session) {
|
|
149
|
+
session.mcpServer.close().catch(() => { });
|
|
150
|
+
activeSessions.delete(sessionId);
|
|
151
|
+
}
|
|
152
|
+
logger.info('MCP session closed', {
|
|
153
|
+
sessionId,
|
|
154
|
+
activeSessions: activeSessions.size,
|
|
155
|
+
});
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
await sessionMcpServer.connect(transport);
|
|
159
|
+
return transport;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Routes an incoming request to the correct session transport.
|
|
163
|
+
*
|
|
164
|
+
* - Requests with a session ID are routed to that session (404 if unknown).
|
|
165
|
+
* - Requests without a session ID create a new session (new initialize).
|
|
166
|
+
*
|
|
167
|
+
* Returns the transport, or null if a response was already sent.
|
|
168
|
+
*/
|
|
169
|
+
async function resolveTransport(req, res, correlationId) {
|
|
170
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
171
|
+
if (sessionId) {
|
|
172
|
+
const session = activeSessions.get(sessionId);
|
|
173
|
+
if (!session) {
|
|
174
|
+
logger.debug('Unknown MCP session', { sessionId, correlationId });
|
|
175
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
176
|
+
res.end(JSON.stringify({
|
|
177
|
+
error: { code: 'SESSION_NOT_FOUND', message: 'Unknown session' },
|
|
178
|
+
}));
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
session.lastActivity = Date.now();
|
|
182
|
+
return session.transport;
|
|
183
|
+
}
|
|
184
|
+
// No session ID — new session (initialize expected)
|
|
185
|
+
return createSession();
|
|
186
|
+
}
|
|
187
|
+
// ---------------------------------------------------------------------------
|
|
188
|
+
// Stale session sweep
|
|
189
|
+
// ---------------------------------------------------------------------------
|
|
190
|
+
const sweepTimer = setInterval(() => {
|
|
191
|
+
const now = Date.now();
|
|
192
|
+
for (const [id, session] of activeSessions) {
|
|
193
|
+
if (now - session.lastActivity > SESSION_TTL_MS) {
|
|
194
|
+
logger.info('Closing stale MCP session', {
|
|
195
|
+
sessionId: id,
|
|
196
|
+
idleMs: now - session.lastActivity,
|
|
197
|
+
});
|
|
198
|
+
session.transport.close().catch(() => { });
|
|
199
|
+
session.mcpServer.close().catch(() => { });
|
|
200
|
+
activeSessions.delete(id);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}, SWEEP_INTERVAL_MS);
|
|
204
|
+
sweepTimer.unref();
|
|
205
|
+
// ---------------------------------------------------------------------------
|
|
206
|
+
// Request handling
|
|
207
|
+
// ---------------------------------------------------------------------------
|
|
95
208
|
const authMiddleware = (0, auth_1.createAuthMiddleware)(config.bearerToken);
|
|
96
209
|
const rateLimiter = (0, ratelimit_1.createRateLimiter)(config.rateLimit?.ratePerSec ?? 10, config.rateLimit?.burst ?? 20);
|
|
97
210
|
const healthDeps = {
|
|
@@ -100,21 +213,43 @@ function createMcpServer(config, getProviderStatuses) {
|
|
|
100
213
|
getProviderStatuses: () => getProviderStatuses(),
|
|
101
214
|
};
|
|
102
215
|
const healthHandler = (0, health_1.createHealthHandler)(healthDeps);
|
|
103
|
-
|
|
216
|
+
async function handleMcp(req, res, correlationId) {
|
|
217
|
+
const transport = await resolveTransport(req, res, correlationId);
|
|
218
|
+
if (!transport)
|
|
219
|
+
return; // 404 already sent
|
|
220
|
+
try {
|
|
221
|
+
await transport.handleRequest(req, res);
|
|
222
|
+
}
|
|
223
|
+
catch (err) {
|
|
224
|
+
logger.error('MCP handler error', { error: String(err), correlationId });
|
|
225
|
+
if (!res.headersSent) {
|
|
226
|
+
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
227
|
+
res.end(JSON.stringify({ error: { code: 'INTERNAL_ERROR', message: 'Internal server error' } }));
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
const requestHandler = buildRequestHandler(authMiddleware, rateLimiter, healthHandler, logger, maxBodySize, handleMcp);
|
|
104
232
|
const httpServer = (0, node_http_1.createServer)(requestHandler);
|
|
233
|
+
// ---------------------------------------------------------------------------
|
|
234
|
+
// Lifecycle
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
105
236
|
function start() {
|
|
106
237
|
return new Promise((resolve, reject) => {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
httpServer.once('error', reject);
|
|
110
|
-
}).catch(reject);
|
|
238
|
+
httpServer.listen(config.port, '127.0.0.1', () => resolve());
|
|
239
|
+
httpServer.once('error', reject);
|
|
111
240
|
});
|
|
112
241
|
}
|
|
113
|
-
function stop() {
|
|
114
|
-
|
|
242
|
+
async function stop() {
|
|
243
|
+
clearInterval(sweepTimer);
|
|
244
|
+
for (const session of activeSessions.values()) {
|
|
245
|
+
await session.transport.close().catch(() => { });
|
|
246
|
+
await session.mcpServer.close().catch(() => { });
|
|
247
|
+
}
|
|
248
|
+
activeSessions.clear();
|
|
249
|
+
await new Promise((resolve, reject) => {
|
|
115
250
|
httpServer.close((err) => (err ? reject(err) : resolve()));
|
|
116
251
|
});
|
|
117
252
|
}
|
|
118
|
-
return { httpServer,
|
|
253
|
+
return { httpServer, start, stop };
|
|
119
254
|
}
|
|
120
255
|
//# sourceMappingURL=server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server/server.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/mcp/server/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,7 @@ export declare class OAuthTokenManager implements TokenManager {
|
|
|
29
29
|
private circuitOpenUntil;
|
|
30
30
|
private retryAfterMs;
|
|
31
31
|
private refreshPromise;
|
|
32
|
+
private refreshTimer;
|
|
32
33
|
constructor(config: OAuthConfig, store: TokenStore, service: string, callbackPort: number, options?: {
|
|
33
34
|
cloudIdResolver?: (accessToken: string) => Promise<{
|
|
34
35
|
cloudId: string;
|
|
@@ -42,6 +43,21 @@ export declare class OAuthTokenManager implements TokenManager {
|
|
|
42
43
|
isAuthenticated(): boolean;
|
|
43
44
|
getTokenStatus(): TokenStatus;
|
|
44
45
|
shutdown(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Starts the proactive refresh timer. Reads the current token from the store
|
|
48
|
+
* and schedules a refresh before it expires. No-op if no token or no refresh
|
|
49
|
+
* token exists.
|
|
50
|
+
*/
|
|
51
|
+
startProactiveRefresh(): void;
|
|
52
|
+
private clearRefreshTimer;
|
|
53
|
+
private scheduleRefresh;
|
|
54
|
+
/**
|
|
55
|
+
* Timer callback. Reuses the existing refreshPromise mutex so proactive and
|
|
56
|
+
* lazy refreshes coalesce into a single HTTP call. On success doRefresh()
|
|
57
|
+
* reschedules the timer. On failure we do NOT reschedule — lazy refresh
|
|
58
|
+
* serves as the fallback.
|
|
59
|
+
*/
|
|
60
|
+
private proactiveRefresh;
|
|
45
61
|
private ensureFresh;
|
|
46
62
|
private doRefresh;
|
|
47
63
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/mcp/token/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAwBnF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWvD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,EACnB,QAAQ,CAAC,EAAE,WAAW,GACrB,WAAW,CAgBb;AAMD,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAIvB;IAGF,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,gBAAgB,CAAK;IAE7B,OAAO,CAAC,YAAY,CAAK;IAGzB,OAAO,CAAC,cAAc,CAA8B;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/mcp/token/manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAwBnF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWvD;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,EACnB,QAAQ,CAAC,EAAE,WAAW,GACrB,WAAW,CAgBb;AAMD,qBAAa,iBAAkB,YAAW,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAIvB;IAGF,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,gBAAgB,CAAK;IAE7B,OAAO,CAAC,YAAY,CAAK;IAGzB,OAAO,CAAC,cAAc,CAA8B;IAGpD,OAAO,CAAC,YAAY,CAA8C;gBAGhE,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;QACR,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC1F,2EAA2E;QAC3E,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;KACrC;IAaG,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAKjC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBnC,eAAe,IAAI,OAAO;IAI1B,cAAc,IAAI,WAAW;IAkB7B,QAAQ,IAAI,IAAI;IAShB;;;;OAIG;IACH,qBAAqB,IAAI,IAAI;IAU7B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,eAAe;IAQvB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;YAqBV,WAAW;YA6BX,SAAS;IAmCvB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;CAKzB"}
|
|
@@ -77,6 +77,8 @@ class OAuthTokenManager {
|
|
|
77
77
|
retryAfterMs = 0;
|
|
78
78
|
// Refresh mutex — collapses concurrent refresh attempts
|
|
79
79
|
refreshPromise = null;
|
|
80
|
+
// Proactive refresh timer
|
|
81
|
+
refreshTimer = null;
|
|
80
82
|
constructor(config, store, service, callbackPort, options) {
|
|
81
83
|
this.config = config;
|
|
82
84
|
this.store = store;
|
|
@@ -126,12 +128,60 @@ class OAuthTokenManager {
|
|
|
126
128
|
};
|
|
127
129
|
}
|
|
128
130
|
shutdown() {
|
|
131
|
+
this.clearRefreshTimer();
|
|
129
132
|
// Reset circuit-breaker and mutex state
|
|
130
133
|
this.refreshPromise = null;
|
|
131
134
|
this.consecutiveFailures = 0;
|
|
132
135
|
this.circuitOpenUntil = 0;
|
|
133
136
|
this.retryAfterMs = 0;
|
|
134
137
|
}
|
|
138
|
+
/**
|
|
139
|
+
* Starts the proactive refresh timer. Reads the current token from the store
|
|
140
|
+
* and schedules a refresh before it expires. No-op if no token or no refresh
|
|
141
|
+
* token exists.
|
|
142
|
+
*/
|
|
143
|
+
startProactiveRefresh() {
|
|
144
|
+
const token = this.store.get(this.service);
|
|
145
|
+
if (!token?.refreshToken)
|
|
146
|
+
return;
|
|
147
|
+
this.scheduleRefresh(token);
|
|
148
|
+
}
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
// Private: proactive refresh timer
|
|
151
|
+
// ---------------------------------------------------------------------------
|
|
152
|
+
clearRefreshTimer() {
|
|
153
|
+
if (this.refreshTimer !== null) {
|
|
154
|
+
clearTimeout(this.refreshTimer);
|
|
155
|
+
this.refreshTimer = null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
scheduleRefresh(token) {
|
|
159
|
+
this.clearRefreshTimer();
|
|
160
|
+
const now = Math.floor(Date.now() / 1000);
|
|
161
|
+
const delaySec = Math.max(0, token.expiresAt - now - EXPIRY_THRESHOLD_SECONDS);
|
|
162
|
+
this.refreshTimer = setTimeout(() => this.proactiveRefresh(), delaySec * 1000);
|
|
163
|
+
this.refreshTimer.unref();
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Timer callback. Reuses the existing refreshPromise mutex so proactive and
|
|
167
|
+
* lazy refreshes coalesce into a single HTTP call. On success doRefresh()
|
|
168
|
+
* reschedules the timer. On failure we do NOT reschedule — lazy refresh
|
|
169
|
+
* serves as the fallback.
|
|
170
|
+
*/
|
|
171
|
+
proactiveRefresh() {
|
|
172
|
+
this.refreshTimer = null;
|
|
173
|
+
const token = this.store.get(this.service);
|
|
174
|
+
if (!token)
|
|
175
|
+
return;
|
|
176
|
+
// Reuse the existing refresh mutex (coalesces with lazy refreshes)
|
|
177
|
+
if (!this.refreshPromise) {
|
|
178
|
+
this.refreshPromise = this.doRefresh(token).finally(() => {
|
|
179
|
+
this.refreshPromise = null;
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
// Swallow errors — lazy refresh is the fallback
|
|
183
|
+
this.refreshPromise.catch(() => { });
|
|
184
|
+
}
|
|
135
185
|
// ---------------------------------------------------------------------------
|
|
136
186
|
// Private: token freshness + mutex
|
|
137
187
|
// ---------------------------------------------------------------------------
|
|
@@ -167,6 +217,7 @@ class OAuthTokenManager {
|
|
|
167
217
|
this.store.upsert(this.service, refreshed);
|
|
168
218
|
this.consecutiveFailures = 0;
|
|
169
219
|
this.retryAfterMs = 0;
|
|
220
|
+
this.scheduleRefresh(refreshed);
|
|
170
221
|
}
|
|
171
222
|
catch (err) {
|
|
172
223
|
this.consecutiveFailures += 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/mcp/token/manager.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/mcp/token/manager.ts"],"names":[],"mappings":"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"}
|