cohvu 1.0.21 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +0 -0
- package/dist/proxy.js +166 -35
- package/dist/proxy.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
File without changes
|
package/dist/proxy.js
CHANGED
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
// MCP proxy — stdio-to-HTTP bridge for agent connections.
|
|
3
3
|
// When an agent spawns `npx cohvu` (non-TTY stdin), this bridges
|
|
4
4
|
// stdio MCP ↔ Streamable HTTP transport to the Cohvu API.
|
|
5
|
+
//
|
|
6
|
+
// The proxy automatically reconnects when the backend deploys,
|
|
7
|
+
// the session expires, or the network drops. The agent never
|
|
8
|
+
// needs to know a disruption happened.
|
|
5
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
10
|
exports.proxy = proxy;
|
|
7
11
|
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
@@ -49,7 +53,9 @@ async function proxy() {
|
|
|
49
53
|
const headers = {
|
|
50
54
|
Authorization: `Bearer ${accessToken}`,
|
|
51
55
|
};
|
|
52
|
-
//
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
// Token refresh — deduplicates concurrent attempts with backoff
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
53
59
|
let refreshing = null;
|
|
54
60
|
let refreshFailures = 0;
|
|
55
61
|
let refreshBackoffUntil = 0;
|
|
@@ -85,7 +91,27 @@ async function proxy() {
|
|
|
85
91
|
await refreshing;
|
|
86
92
|
return ok;
|
|
87
93
|
}
|
|
88
|
-
//
|
|
94
|
+
// Refresh token every 50 minutes (access tokens expire at 60)
|
|
95
|
+
setInterval(async () => {
|
|
96
|
+
try {
|
|
97
|
+
const auth = await (0, auth_1.getAuthToken)(baseUrl);
|
|
98
|
+
headers.Authorization = `Bearer ${auth.accessToken}`;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
await new Promise((r) => setTimeout(r, 5000));
|
|
102
|
+
try {
|
|
103
|
+
const auth = await (0, auth_1.getAuthToken)(baseUrl);
|
|
104
|
+
headers.Authorization = `Bearer ${auth.accessToken}`;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
process.stderr.write("Token refresh failed. Session may expire.\n");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}, 50 * 60 * 1000);
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
// Resilient fetch: timeouts, network retry, 401 refresh, session loss detect
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
let sessionLost = false;
|
|
89
115
|
const resilientFetch = async (url, init) => {
|
|
90
116
|
const applyTimeout = (opts) => {
|
|
91
117
|
const ms = opts?.method === 'POST' ? 300_000 : 60_000;
|
|
@@ -119,64 +145,169 @@ async function proxy() {
|
|
|
119
145
|
const retryInit = init ? { ...init, headers: { ...init.headers, ...headers } } : { headers };
|
|
120
146
|
return attempt(retryInit);
|
|
121
147
|
}
|
|
148
|
+
// Session expired or lost — signal reconnect
|
|
149
|
+
if (res.status === 410 || res.status === 404) {
|
|
150
|
+
sessionLost = true;
|
|
151
|
+
}
|
|
122
152
|
return res;
|
|
123
153
|
};
|
|
124
|
-
|
|
125
|
-
//
|
|
126
|
-
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
// Transport lifecycle — create, connect, reconnect
|
|
156
|
+
// ---------------------------------------------------------------------------
|
|
157
|
+
let httpTransport = null;
|
|
158
|
+
let reconnecting = false;
|
|
159
|
+
let reconnectAttempts = 0;
|
|
160
|
+
function createTransport() {
|
|
161
|
+
const transport = new streamableHttp_js_1.StreamableHTTPClientTransport(new URL(`${baseUrl}/v1/mcp`), { requestInit: { headers }, fetch: resilientFetch });
|
|
162
|
+
transport.onmessage = (message) => {
|
|
163
|
+
reconnectAttempts = 0;
|
|
164
|
+
stdioTransport.send(message).catch((error) => {
|
|
165
|
+
process.stderr.write(`Error forwarding to client: ${error}\n`);
|
|
166
|
+
});
|
|
167
|
+
};
|
|
168
|
+
transport.onclose = () => {
|
|
169
|
+
// Don't exit — reconnect
|
|
170
|
+
if (!reconnecting) {
|
|
171
|
+
process.stderr.write("Transport closed. Reconnecting...\n");
|
|
172
|
+
reconnect();
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
transport.onerror = (error) => {
|
|
176
|
+
process.stderr.write(`Transport error: ${error}\n`);
|
|
177
|
+
};
|
|
178
|
+
return transport;
|
|
179
|
+
}
|
|
180
|
+
async function connect() {
|
|
127
181
|
try {
|
|
128
|
-
const
|
|
129
|
-
|
|
182
|
+
const transport = createTransport();
|
|
183
|
+
await transport.start();
|
|
184
|
+
httpTransport = transport;
|
|
185
|
+
sessionLost = false;
|
|
186
|
+
reconnecting = false;
|
|
187
|
+
reconnectAttempts = 0;
|
|
188
|
+
return true;
|
|
130
189
|
}
|
|
131
|
-
catch {
|
|
132
|
-
|
|
133
|
-
|
|
190
|
+
catch (error) {
|
|
191
|
+
process.stderr.write(`Connection failed: ${error}\n`);
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
async function reconnect() {
|
|
196
|
+
if (reconnecting)
|
|
197
|
+
return;
|
|
198
|
+
reconnecting = true;
|
|
199
|
+
// Tear down old transport
|
|
200
|
+
const old = httpTransport;
|
|
201
|
+
httpTransport = null;
|
|
202
|
+
if (old) {
|
|
203
|
+
old.onclose = () => { };
|
|
204
|
+
old.onerror = () => { };
|
|
205
|
+
old.close().catch(() => { });
|
|
206
|
+
}
|
|
207
|
+
// Retry with exponential backoff
|
|
208
|
+
while (reconnecting) {
|
|
209
|
+
const delay = Math.min(1000 * Math.pow(2, Math.min(reconnectAttempts, 5)), 30_000);
|
|
210
|
+
reconnectAttempts++;
|
|
211
|
+
if (reconnectAttempts > 1) {
|
|
212
|
+
process.stderr.write(`Reconnecting (attempt ${reconnectAttempts}, ${delay}ms delay)...\n`);
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
process.stderr.write("Reconnecting...\n");
|
|
216
|
+
}
|
|
217
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
218
|
+
// Refresh token before reconnecting in case it expired
|
|
134
219
|
try {
|
|
135
220
|
const auth = await (0, auth_1.getAuthToken)(baseUrl);
|
|
136
221
|
headers.Authorization = `Bearer ${auth.accessToken}`;
|
|
137
222
|
}
|
|
138
|
-
catch {
|
|
139
|
-
|
|
223
|
+
catch { }
|
|
224
|
+
if (await connect()) {
|
|
225
|
+
process.stderr.write("Reconnected.\n");
|
|
226
|
+
// Flush any queued messages
|
|
227
|
+
flushPending();
|
|
228
|
+
return;
|
|
140
229
|
}
|
|
141
230
|
}
|
|
142
|
-
}
|
|
143
|
-
//
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
231
|
+
}
|
|
232
|
+
// ---------------------------------------------------------------------------
|
|
233
|
+
// Message queue — buffer messages while reconnecting
|
|
234
|
+
// ---------------------------------------------------------------------------
|
|
235
|
+
const pending = [];
|
|
236
|
+
const MAX_PENDING = 50;
|
|
237
|
+
function flushPending() {
|
|
238
|
+
while (pending.length > 0 && httpTransport) {
|
|
239
|
+
const entry = pending.shift();
|
|
240
|
+
const transport = httpTransport;
|
|
241
|
+
transport.send(entry.message).catch(() => {
|
|
242
|
+
// Failed again — return error to agent, don't re-queue forever
|
|
149
243
|
stdioTransport.send({
|
|
150
244
|
jsonrpc: "2.0",
|
|
151
|
-
id:
|
|
245
|
+
id: entry.id,
|
|
152
246
|
error: {
|
|
153
247
|
code: -32603,
|
|
154
248
|
message: "Cohvu had a temporary connection issue. This is not a problem — just try your read or contribute call again.",
|
|
155
249
|
},
|
|
156
250
|
}).catch(() => { });
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// ---------------------------------------------------------------------------
|
|
255
|
+
// Bridge: stdio → HTTP → stdio
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
stdioTransport.onmessage = async (message) => {
|
|
258
|
+
const msg = message;
|
|
259
|
+
// Check if session was lost on a previous request
|
|
260
|
+
if (sessionLost && httpTransport) {
|
|
261
|
+
reconnect();
|
|
262
|
+
}
|
|
263
|
+
// If no transport (reconnecting), queue the message
|
|
264
|
+
if (!httpTransport) {
|
|
265
|
+
if (msg.id !== undefined) {
|
|
266
|
+
if (pending.length < MAX_PENDING) {
|
|
267
|
+
pending.push({ message, id: msg.id });
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
// Queue full — reject immediately
|
|
271
|
+
stdioTransport.send({
|
|
272
|
+
jsonrpc: "2.0",
|
|
273
|
+
id: msg.id,
|
|
274
|
+
error: {
|
|
275
|
+
code: -32603,
|
|
276
|
+
message: "Cohvu is reconnecting. Please try again in a moment.",
|
|
277
|
+
},
|
|
278
|
+
}).catch(() => { });
|
|
279
|
+
}
|
|
157
280
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
try {
|
|
284
|
+
await httpTransport.send(message);
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
process.stderr.write(`Error forwarding to server: ${error}\n`);
|
|
288
|
+
// Queue for retry and reconnect
|
|
289
|
+
if (msg.id !== undefined) {
|
|
290
|
+
pending.push({ message, id: msg.id });
|
|
291
|
+
}
|
|
292
|
+
reconnect();
|
|
293
|
+
}
|
|
168
294
|
};
|
|
169
295
|
stdioTransport.onclose = () => {
|
|
170
|
-
|
|
296
|
+
// Agent disconnected — clean up and exit
|
|
297
|
+
reconnecting = false;
|
|
298
|
+
if (httpTransport) {
|
|
299
|
+
httpTransport.onclose = () => { };
|
|
300
|
+
httpTransport.close().catch(() => { });
|
|
301
|
+
}
|
|
171
302
|
process.exit(0);
|
|
172
303
|
};
|
|
173
|
-
httpTransport.onerror = (error) => {
|
|
174
|
-
process.stderr.write(`Remote transport error: ${error}\n`);
|
|
175
|
-
};
|
|
176
304
|
stdioTransport.onerror = (error) => {
|
|
177
305
|
process.stderr.write(`Stdio transport error: ${error}\n`);
|
|
178
306
|
};
|
|
307
|
+
// ---------------------------------------------------------------------------
|
|
308
|
+
// Start
|
|
309
|
+
// ---------------------------------------------------------------------------
|
|
179
310
|
await stdioTransport.start();
|
|
180
|
-
await
|
|
311
|
+
await connect();
|
|
181
312
|
}
|
|
182
313
|
//# sourceMappingURL=proxy.js.map
|
package/dist/proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":";AAAA,0DAA0D;AAC1D,iEAAiE;AACjE,0DAA0D;;
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
|