cohvu 1.0.21 → 1.0.23
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/api.d.ts +6 -1
- package/dist/api.js +58 -33
- package/dist/api.js.map +1 -1
- package/dist/auth.js +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/index.js +0 -0
- package/dist/proxy.js +168 -35
- package/dist/proxy.js.map +1 -1
- package/dist/tui/dashboard.js +271 -127
- package/dist/tui/dashboard.js.map +1 -1
- package/dist/tui/render.js +21 -2
- package/dist/tui/render.js.map +1 -1
- package/dist/tui/state.d.ts +12 -0
- package/dist/tui/state.js +6 -0
- package/dist/tui/state.js.map +1 -1
- package/package.json +1 -1
package/dist/api.d.ts
CHANGED
|
@@ -73,6 +73,7 @@ export declare class ApiClient {
|
|
|
73
73
|
private baseUrl;
|
|
74
74
|
constructor(baseUrl?: string);
|
|
75
75
|
private headers;
|
|
76
|
+
private request;
|
|
76
77
|
private get;
|
|
77
78
|
private post;
|
|
78
79
|
private del;
|
|
@@ -117,7 +118,11 @@ export declare class ApiClient {
|
|
|
117
118
|
cancelApproval(projectId: string, approvalId: string): Promise<void>;
|
|
118
119
|
listNotifications(): Promise<Notification[]>;
|
|
119
120
|
markNotificationsSeen(): Promise<void>;
|
|
120
|
-
connectFeed(projectId: string,
|
|
121
|
+
connectFeed(projectId: string, callbacks: {
|
|
122
|
+
onEvent: (eventType: string, data: Record<string, unknown>) => void;
|
|
123
|
+
onConnected?: () => void;
|
|
124
|
+
onDisconnected?: () => void;
|
|
125
|
+
}): {
|
|
121
126
|
disconnect: () => void;
|
|
122
127
|
};
|
|
123
128
|
}
|
package/dist/api.js
CHANGED
|
@@ -17,42 +17,53 @@ class ApiClient {
|
|
|
17
17
|
"Content-Type": "application/json",
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
|
-
async
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
async request(path, init) {
|
|
21
|
+
const h = await this.headers();
|
|
22
|
+
const opts = {
|
|
23
|
+
...init,
|
|
24
|
+
headers: { ...h, ...init?.headers },
|
|
25
|
+
signal: AbortSignal.timeout(15_000),
|
|
26
|
+
};
|
|
27
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
28
|
+
try {
|
|
29
|
+
const res = await fetch(`${this.baseUrl}${path}`, opts);
|
|
30
|
+
if (res.ok)
|
|
31
|
+
return (await res.json());
|
|
32
|
+
if (res.status >= 500 && attempt === 0) {
|
|
33
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
throw new ApiError(res.status, await res.text());
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
if (err instanceof ApiError)
|
|
40
|
+
throw err;
|
|
41
|
+
if (attempt === 0) {
|
|
42
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
throw new Error("Request failed");
|
|
27
49
|
}
|
|
28
|
-
|
|
29
|
-
|
|
50
|
+
get(path) {
|
|
51
|
+
return this.request(path);
|
|
52
|
+
}
|
|
53
|
+
post(path, body) {
|
|
54
|
+
return this.request(path, {
|
|
30
55
|
method: "POST",
|
|
31
|
-
headers: await this.headers(),
|
|
32
56
|
body: body ? JSON.stringify(body) : undefined,
|
|
33
57
|
});
|
|
34
|
-
if (!res.ok)
|
|
35
|
-
throw new ApiError(res.status, await res.text());
|
|
36
|
-
return (await res.json());
|
|
37
|
-
}
|
|
38
|
-
async del(path) {
|
|
39
|
-
const res = await fetch(`${this.baseUrl}${path}`, {
|
|
40
|
-
method: "DELETE",
|
|
41
|
-
headers: await this.headers(),
|
|
42
|
-
});
|
|
43
|
-
if (!res.ok)
|
|
44
|
-
throw new ApiError(res.status, await res.text());
|
|
45
|
-
return (await res.json());
|
|
46
58
|
}
|
|
47
|
-
|
|
48
|
-
|
|
59
|
+
del(path) {
|
|
60
|
+
return this.request(path, { method: "DELETE" });
|
|
61
|
+
}
|
|
62
|
+
patch(path, body) {
|
|
63
|
+
return this.request(path, {
|
|
49
64
|
method: "PATCH",
|
|
50
|
-
headers: await this.headers(),
|
|
51
65
|
body: JSON.stringify(body),
|
|
52
66
|
});
|
|
53
|
-
if (!res.ok)
|
|
54
|
-
throw new ApiError(res.status, await res.text());
|
|
55
|
-
return (await res.json());
|
|
56
67
|
}
|
|
57
68
|
// Auth
|
|
58
69
|
async me() {
|
|
@@ -136,10 +147,11 @@ class ApiClient {
|
|
|
136
147
|
await this.post(`/v1/notifications/seen`);
|
|
137
148
|
}
|
|
138
149
|
// SSE feed — returns a disconnect function
|
|
139
|
-
connectFeed(projectId,
|
|
150
|
+
connectFeed(projectId, callbacks) {
|
|
140
151
|
let aborted = false;
|
|
141
152
|
let currentController = null;
|
|
142
153
|
let retryDelay = 1000;
|
|
154
|
+
let wasConnected = false;
|
|
143
155
|
const connect = async () => {
|
|
144
156
|
if (aborted)
|
|
145
157
|
return;
|
|
@@ -151,11 +163,17 @@ class ApiClient {
|
|
|
151
163
|
signal: currentController.signal,
|
|
152
164
|
});
|
|
153
165
|
if (!res.ok || !res.body) {
|
|
166
|
+
if (wasConnected) {
|
|
167
|
+
wasConnected = false;
|
|
168
|
+
callbacks.onDisconnected?.();
|
|
169
|
+
}
|
|
154
170
|
if (!aborted)
|
|
155
171
|
setTimeout(connect, retryDelay);
|
|
156
172
|
return;
|
|
157
173
|
}
|
|
158
|
-
retryDelay = 1000;
|
|
174
|
+
retryDelay = 1000;
|
|
175
|
+
wasConnected = true;
|
|
176
|
+
callbacks.onConnected?.();
|
|
159
177
|
const reader = res.body.getReader();
|
|
160
178
|
const decoder = new TextDecoder();
|
|
161
179
|
let buffer = "";
|
|
@@ -169,8 +187,7 @@ class ApiClient {
|
|
|
169
187
|
for (const part of parts) {
|
|
170
188
|
if (!part.trim() || part.startsWith(":"))
|
|
171
189
|
continue;
|
|
172
|
-
|
|
173
|
-
let eventType = 'memory'; // default
|
|
190
|
+
let eventType = 'memory';
|
|
174
191
|
let dataJson = '';
|
|
175
192
|
for (const line of part.split('\n')) {
|
|
176
193
|
if (line.startsWith('event: '))
|
|
@@ -182,16 +199,24 @@ class ApiClient {
|
|
|
182
199
|
continue;
|
|
183
200
|
try {
|
|
184
201
|
const data = JSON.parse(dataJson);
|
|
185
|
-
onEvent(eventType, data);
|
|
202
|
+
callbacks.onEvent(eventType, data);
|
|
186
203
|
}
|
|
187
204
|
catch { }
|
|
188
205
|
}
|
|
189
206
|
}
|
|
190
207
|
// Stream ended — reconnect
|
|
208
|
+
if (wasConnected) {
|
|
209
|
+
wasConnected = false;
|
|
210
|
+
callbacks.onDisconnected?.();
|
|
211
|
+
}
|
|
191
212
|
if (!aborted)
|
|
192
213
|
setTimeout(connect, retryDelay);
|
|
193
214
|
}
|
|
194
215
|
catch {
|
|
216
|
+
if (wasConnected) {
|
|
217
|
+
wasConnected = false;
|
|
218
|
+
callbacks.onDisconnected?.();
|
|
219
|
+
}
|
|
195
220
|
if (!aborted) {
|
|
196
221
|
retryDelay = Math.min(retryDelay * 2, 30000);
|
|
197
222
|
setTimeout(connect, retryDelay);
|
package/dist/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":";AAAA,2CAA2C;AAC3C,oEAAoE;;;AAEpE,iCAAsC;AAEtC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AA2EjD,MAAa,SAAS;IACZ,OAAO,CAAS;IAExB,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,gBAAgB,CAAC;IAC1E,CAAC;IAEO,KAAK,CAAC,OAAO;QACnB,MAAM,IAAI,GAAG,MAAM,IAAA,mBAAY,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO;YACL,aAAa,EAAE,UAAU,IAAI,CAAC,WAAW,EAAE;YAC3C,cAAc,EAAE,kBAAkB;SACnC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/auth.js
CHANGED
|
@@ -28,7 +28,7 @@ function loadStoredTokens() {
|
|
|
28
28
|
}
|
|
29
29
|
function storeTokens(tokens) {
|
|
30
30
|
ensureConfigDir();
|
|
31
|
-
const tmp = `${TOKENS_FILE}.tmp`;
|
|
31
|
+
const tmp = `${TOKENS_FILE}.${process.pid}.tmp`;
|
|
32
32
|
(0, fs_1.writeFileSync)(tmp, JSON.stringify(tokens, null, 2), { mode: 0o600 });
|
|
33
33
|
(0, fs_1.renameSync)(tmp, TOKENS_FILE);
|
|
34
34
|
}
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,yCAAyC;;AAiFzC,wCA+DC;AAED,oCAoBC;AApKD,2BAAoF;AACpF,2BAA6B;AAC7B,+BAA4B;AAC5B,iDAAyC;AAEzC,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,IAAA,YAAO,GAAE,EAAE,QAAQ,CAAC,CAAC;AAC7C,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACpD,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAS9B,SAAS,eAAe;IACtB,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,IAAA,cAAS,EAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,IAAI,CAAC,IAAA,eAAU,EAAC,WAAW,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,WAAW,EAAE,OAAO,CAAC,CAAiB,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,MAAoB;IACvC,eAAe,EAAE,CAAC;IAClB,MAAM,GAAG,GAAG,GAAG,WAAW,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|
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,171 @@ 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
|
+
if (!await connect()) {
|
|
312
|
+
reconnect();
|
|
313
|
+
}
|
|
181
314
|
}
|
|
182
315
|
//# 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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"}
|