@cybedefend/vibedefend 1.4.7 → 1.6.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/README.md +77 -2
- package/dist/api/gateway-request.js +49 -0
- package/dist/api/gateway-request.js.map +1 -0
- package/dist/api/projects.js +67 -0
- package/dist/api/projects.js.map +1 -1
- package/dist/api/repository-link.js +157 -0
- package/dist/api/repository-link.js.map +1 -0
- package/dist/auth/auth-store.js +107 -25
- package/dist/auth/auth-store.js.map +1 -1
- package/dist/auth/auth.js +21 -0
- package/dist/auth/auth.js.map +1 -1
- package/dist/clients/cursor.js +5 -1
- package/dist/clients/cursor.js.map +1 -1
- package/dist/clients/vscode.js +38 -29
- package/dist/clients/vscode.js.map +1 -1
- package/dist/commands/mcp/allow.js +219 -0
- package/dist/commands/mcp/allow.js.map +1 -0
- package/dist/commands/mcp/connect.js +337 -0
- package/dist/commands/mcp/connect.js.map +1 -0
- package/dist/commands/mcp/index.js +170 -0
- package/dist/commands/mcp/index.js.map +1 -0
- package/dist/commands/mcp/proxy.js +264 -0
- package/dist/commands/mcp/proxy.js.map +1 -0
- package/dist/commands/mcp/scan.js +349 -0
- package/dist/commands/mcp/scan.js.map +1 -0
- package/dist/commands/mcp/sync.js +215 -0
- package/dist/commands/mcp/sync.js.map +1 -0
- package/dist/config.js +6 -0
- package/dist/config.js.map +1 -1
- package/dist/diagnostics.js +78 -12
- package/dist/diagnostics.js.map +1 -1
- package/dist/doctor.js +19 -0
- package/dist/doctor.js.map +1 -1
- package/dist/guards-evaluator/analysis-types.js +27 -0
- package/dist/guards-evaluator/analysis-types.js.map +1 -0
- package/dist/guards-evaluator/command-analysis.js +572 -0
- package/dist/guards-evaluator/command-analysis.js.map +1 -0
- package/dist/guards-evaluator/command-view.js +586 -0
- package/dist/guards-evaluator/command-view.js.map +1 -0
- package/dist/guards-evaluator/env.js +11 -0
- package/dist/guards-evaluator/env.js.map +1 -0
- package/dist/guards-evaluator/evaluate.js +91 -41
- package/dist/guards-evaluator/evaluate.js.map +1 -1
- package/dist/guards-evaluator/index.js +2 -1
- package/dist/guards-evaluator/index.js.map +1 -1
- package/dist/guards-evaluator/inline-code.js +259 -0
- package/dist/guards-evaluator/inline-code.js.map +1 -0
- package/dist/guards-evaluator/normalize.js +716 -0
- package/dist/guards-evaluator/normalize.js.map +1 -0
- package/dist/guards-evaluator/preprocess.js +13 -5
- package/dist/guards-evaluator/preprocess.js.map +1 -1
- package/dist/guards-evaluator/redact.js +19 -0
- package/dist/guards-evaluator/redact.js.map +1 -1
- package/dist/guards-evaluator/regex.js +25 -3
- package/dist/guards-evaluator/regex.js.map +1 -1
- package/dist/guards-evaluator/safe-commands.js +155 -0
- package/dist/guards-evaluator/safe-commands.js.map +1 -0
- package/dist/guards-evaluator/triage.js +315 -0
- package/dist/guards-evaluator/triage.js.map +1 -0
- package/dist/hook-runner.js +24873 -5068
- package/dist/hooks/install.js +38 -0
- package/dist/hooks/install.js.map +1 -1
- package/dist/hooks/runtime/config.js +38 -0
- package/dist/hooks/runtime/config.js.map +1 -1
- package/dist/hooks/runtime/emit.js +126 -53
- package/dist/hooks/runtime/emit.js.map +1 -1
- package/dist/hooks/runtime/fetch-rules.js +27 -7
- package/dist/hooks/runtime/fetch-rules.js.map +1 -1
- package/dist/hooks/runtime/gateway-http-error.js +34 -0
- package/dist/hooks/runtime/gateway-http-error.js.map +1 -0
- package/dist/hooks/runtime/guard-rules-cache.js +139 -17
- package/dist/hooks/runtime/guard-rules-cache.js.map +1 -1
- package/dist/hooks/runtime/guard-violations-buffer.js +321 -48
- package/dist/hooks/runtime/guard-violations-buffer.js.map +1 -1
- package/dist/hooks/runtime/judge-cache.js +6 -0
- package/dist/hooks/runtime/judge-cache.js.map +1 -1
- package/dist/hooks/runtime/judge-triage.js +193 -0
- package/dist/hooks/runtime/judge-triage.js.map +1 -0
- package/dist/hooks/runtime/judge.js +7 -1
- package/dist/hooks/runtime/judge.js.map +1 -1
- package/dist/hooks/runtime/pre-compact.js +21 -6
- package/dist/hooks/runtime/pre-compact.js.map +1 -1
- package/dist/hooks/runtime/resolve.js +108 -17
- package/dist/hooks/runtime/resolve.js.map +1 -1
- package/dist/hooks/runtime/retry-policy.js +57 -0
- package/dist/hooks/runtime/retry-policy.js.map +1 -0
- package/dist/hooks/runtime/review-sessions.js +74 -0
- package/dist/hooks/runtime/review-sessions.js.map +1 -0
- package/dist/hooks/runtime/script-resolve.js +695 -0
- package/dist/hooks/runtime/script-resolve.js.map +1 -0
- package/dist/hooks/runtime/session-activation.js +226 -0
- package/dist/hooks/runtime/session-activation.js.map +1 -0
- package/dist/hooks/runtime/session-review.js +174 -46
- package/dist/hooks/runtime/session-review.js.map +1 -1
- package/dist/hooks/runtime/session-start.js +35 -4
- package/dist/hooks/runtime/session-start.js.map +1 -1
- package/dist/hooks/runtime/session-writes.js +232 -0
- package/dist/hooks/runtime/session-writes.js.map +1 -0
- package/dist/hooks/runtime/sniff.js +26 -7
- package/dist/hooks/runtime/sniff.js.map +1 -1
- package/dist/hooks/runtime/target-resolve.js +336 -0
- package/dist/hooks/runtime/target-resolve.js.map +1 -0
- package/dist/hooks/runtime/unmapped-tools.js +93 -0
- package/dist/hooks/runtime/unmapped-tools.js.map +1 -0
- package/dist/hooks/runtime/usage-block.js +4 -0
- package/dist/hooks/runtime/usage-block.js.map +1 -1
- package/dist/hooks/runtime/user-prompt-submit.js +8 -2
- package/dist/hooks/runtime/user-prompt-submit.js.map +1 -1
- package/dist/hooks/runtime/wire-text.js +41 -0
- package/dist/hooks/runtime/wire-text.js.map +1 -0
- package/dist/hooks/runtime/work-dir.js +84 -0
- package/dist/hooks/runtime/work-dir.js.map +1 -0
- package/dist/index.js +45 -12
- package/dist/index.js.map +1 -1
- package/dist/install.js +174 -11
- package/dist/install.js.map +1 -1
- package/dist/link.js +74 -48
- package/dist/link.js.map +1 -1
- package/dist/login.js +99 -14
- package/dist/login.js.map +1 -1
- package/dist/mcp/auth/agent-sign-ins.js +174 -0
- package/dist/mcp/auth/agent-sign-ins.js.map +1 -0
- package/dist/mcp/auth/callback.js +200 -0
- package/dist/mcp/auth/callback.js.map +1 -0
- package/dist/mcp/auth/connect.js +392 -0
- package/dist/mcp/auth/connect.js.map +1 -0
- package/dist/mcp/auth/discovery.js +399 -0
- package/dist/mcp/auth/discovery.js.map +1 -0
- package/dist/mcp/auth/oauth.js +326 -0
- package/dist/mcp/auth/oauth.js.map +1 -0
- package/dist/mcp/auth/probe.js +128 -0
- package/dist/mcp/auth/probe.js.map +1 -0
- package/dist/mcp/auth/secrets.js +446 -0
- package/dist/mcp/auth/secrets.js.map +1 -0
- package/dist/mcp/auth/store.js +260 -0
- package/dist/mcp/auth/store.js.map +1 -0
- package/dist/mcp/auth/tokenSource.js +55 -0
- package/dist/mcp/auth/tokenSource.js.map +1 -0
- package/dist/mcp/config/atomicWrite.js +98 -0
- package/dist/mcp/config/atomicWrite.js.map +1 -0
- package/dist/mcp/config/clients.js +171 -0
- package/dist/mcp/config/clients.js.map +1 -0
- package/dist/mcp/config/cybedefend-servers.js +48 -0
- package/dist/mcp/config/cybedefend-servers.js.map +1 -0
- package/dist/mcp/config/discover.js +114 -0
- package/dist/mcp/config/discover.js.map +1 -0
- package/dist/mcp/config/hook.js +123 -0
- package/dist/mcp/config/hook.js.map +1 -0
- package/dist/mcp/config/index.js +11 -0
- package/dist/mcp/config/index.js.map +1 -0
- package/dist/mcp/config/install.js +132 -0
- package/dist/mcp/config/install.js.map +1 -0
- package/dist/mcp/config/installed.js +37 -0
- package/dist/mcp/config/installed.js.map +1 -0
- package/dist/mcp/config/jsonEdit.js +119 -0
- package/dist/mcp/config/jsonEdit.js.map +1 -0
- package/dist/mcp/config/lock.js +102 -0
- package/dist/mcp/config/lock.js.map +1 -0
- package/dist/mcp/config/proxyBinary.js +211 -0
- package/dist/mcp/config/proxyBinary.js.map +1 -0
- package/dist/mcp/config/rewrite.js +388 -0
- package/dist/mcp/config/rewrite.js.map +1 -0
- package/dist/mcp/config/types.js +34 -0
- package/dist/mcp/config/types.js.map +1 -0
- package/dist/mcp/proxy/audit.js +83 -0
- package/dist/mcp/proxy/audit.js.map +1 -0
- package/dist/mcp/proxy/authInterceptor.js +119 -0
- package/dist/mcp/proxy/authInterceptor.js.map +1 -0
- package/dist/mcp/proxy/expand.js +93 -0
- package/dist/mcp/proxy/expand.js.map +1 -0
- package/dist/mcp/proxy/inject.js +397 -0
- package/dist/mcp/proxy/inject.js.map +1 -0
- package/dist/mcp/proxy/intercept.js +37 -0
- package/dist/mcp/proxy/intercept.js.map +1 -0
- package/dist/mcp/proxy/jsonrpc.js +153 -0
- package/dist/mcp/proxy/jsonrpc.js.map +1 -0
- package/dist/mcp/proxy/log.js +109 -0
- package/dist/mcp/proxy/log.js.map +1 -0
- package/dist/mcp/proxy/paths.js +53 -0
- package/dist/mcp/proxy/paths.js.map +1 -0
- package/dist/mcp/proxy/proxy.js +510 -0
- package/dist/mcp/proxy/proxy.js.map +1 -0
- package/dist/mcp/proxy/spec.js +203 -0
- package/dist/mcp/proxy/spec.js.map +1 -0
- package/dist/mcp/proxy/sse.js +77 -0
- package/dist/mcp/proxy/sse.js.map +1 -0
- package/dist/mcp/proxy/upstream.js +2 -0
- package/dist/mcp/proxy/upstream.js.map +1 -0
- package/dist/mcp/proxy/upstreamHttp.js +499 -0
- package/dist/mcp/proxy/upstreamHttp.js.map +1 -0
- package/dist/mcp/proxy/upstreamStdio.js +188 -0
- package/dist/mcp/proxy/upstreamStdio.js.map +1 -0
- package/dist/mcp/proxy/upstreams.js +143 -0
- package/dist/mcp/proxy/upstreams.js.map +1 -0
- package/dist/mcp/proxy/verifyInterceptor.js +559 -0
- package/dist/mcp/proxy/verifyInterceptor.js.map +1 -0
- package/dist/mcp/proxy/windowsCommand.js +99 -0
- package/dist/mcp/proxy/windowsCommand.js.map +1 -0
- package/dist/mcp/scan/args.js +228 -0
- package/dist/mcp/scan/args.js.map +1 -0
- package/dist/mcp/scan/results.js +253 -0
- package/dist/mcp/scan/results.js.map +1 -0
- package/dist/mcp/scan/types.js +40 -0
- package/dist/mcp/scan/types.js.map +1 -0
- package/dist/mcp/verify/api.js +475 -0
- package/dist/mcp/verify/api.js.map +1 -0
- package/dist/mcp/verify/backend.js +143 -0
- package/dist/mcp/verify/backend.js.map +1 -0
- package/dist/mcp/verify/cache.js +182 -0
- package/dist/mcp/verify/cache.js.map +1 -0
- package/dist/mcp/verify/contract-errors.js +198 -0
- package/dist/mcp/verify/contract-errors.js.map +1 -0
- package/dist/mcp/verify/digest.js +91 -0
- package/dist/mcp/verify/digest.js.map +1 -0
- package/dist/mcp/verify/factory.js +56 -0
- package/dist/mcp/verify/factory.js.map +1 -0
- package/dist/mcp/verify/identity.js +173 -0
- package/dist/mcp/verify/identity.js.map +1 -0
- package/dist/mcp/verify/policy-store.js +63 -0
- package/dist/mcp/verify/policy-store.js.map +1 -0
- package/dist/mcp/verify/policy.js +158 -0
- package/dist/mcp/verify/policy.js.map +1 -0
- package/dist/mcp/verify/pool.js +27 -0
- package/dist/mcp/verify/pool.js.map +1 -0
- package/dist/mcp/verify/token-refresh.js +44 -0
- package/dist/mcp/verify/token-refresh.js.map +1 -0
- package/dist/mcp/verify/token.js +67 -0
- package/dist/mcp/verify/token.js.map +1 -0
- package/dist/mcp/verify/verifier.js +1009 -0
- package/dist/mcp/verify/verifier.js.map +1 -0
- package/dist/org-gate.js +1 -1
- package/dist/org-gate.js.map +1 -1
- package/dist/org.js +146 -0
- package/dist/org.js.map +1 -0
- package/dist/project-create.js +129 -0
- package/dist/project-create.js.map +1 -0
- package/dist/prompts.js +21 -0
- package/dist/prompts.js.map +1 -1
- package/dist/re2.wasm +0 -0
- package/dist/status.js +61 -0
- package/dist/status.js.map +1 -1
- package/dist/uninstall.js +49 -4
- package/dist/uninstall.js.map +1 -1
- package/dist/utils.js +62 -6
- package/dist/utils.js.map +1 -1
- package/package.json +10 -3
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP upstream: Streamable HTTP first, legacy HTTP+SSE as a fallback.
|
|
3
|
+
*
|
|
4
|
+
* Streamable HTTP (spec 2025-03-26 and later) posts every client message to a
|
|
5
|
+
* single endpoint. The server answers with `202 Accepted` (nothing to say), a
|
|
6
|
+
* JSON body (one answer), or an SSE stream (an answer plus whatever the
|
|
7
|
+
* server wants to send while it works). A `GET` on the same endpoint opens
|
|
8
|
+
* the channel the server uses to start its own requests.
|
|
9
|
+
*
|
|
10
|
+
* The 2024-11-05 transport did it the other way round: `GET` first, the
|
|
11
|
+
* server announces a POST endpoint in an `endpoint` event, and every answer
|
|
12
|
+
* comes back on the original stream. Servers using it are still deployed, so
|
|
13
|
+
* a POST rejected as unroutable falls back to that handshake once.
|
|
14
|
+
*
|
|
15
|
+
* A 401 is surfaced as a readable error, and the pending request is failed so
|
|
16
|
+
* the agent is told rather than left waiting. Turning that 401 into a login
|
|
17
|
+
* is Phase 2.
|
|
18
|
+
*/
|
|
19
|
+
import { isResponse } from './jsonrpc.js';
|
|
20
|
+
import { SseParser } from './sse.js';
|
|
21
|
+
/** JSON-RPC error code the proxy uses for an upstream that refuses to talk. */
|
|
22
|
+
export const UPSTREAM_HTTP_ERROR = -32010;
|
|
23
|
+
/** JSON-RPC error code for a 401 with no token. Phase 2 turns this into a login. */
|
|
24
|
+
export const UPSTREAM_UNAUTHORIZED = -32011;
|
|
25
|
+
/**
|
|
26
|
+
* JSON-RPC error code for an upstream that answered a request with a redirect.
|
|
27
|
+
*
|
|
28
|
+
* Named rather than folded into {@link UPSTREAM_HTTP_ERROR}: a server that
|
|
29
|
+
* answers a POST carrying `Authorization: Bearer …` and the arguments of a
|
|
30
|
+
* `tools/call` with a 307 is not having an incident, it is trying to have
|
|
31
|
+
* that request replayed somewhere the user never configured. `undici` strips
|
|
32
|
+
* the `Authorization` header across origins; it does not strip the body, and
|
|
33
|
+
* the body is exactly what Phase 4 exists to keep on this machine.
|
|
34
|
+
*/
|
|
35
|
+
export const UPSTREAM_SUSPICIOUS_REDIRECT = -32012;
|
|
36
|
+
/** Attempts to reopen the server-to-client stream before giving up. */
|
|
37
|
+
export const MAX_STREAM_RECONNECTS = 5;
|
|
38
|
+
/**
|
|
39
|
+
* Repairs attempted after a 401 before the request is failed.
|
|
40
|
+
*
|
|
41
|
+
* Two, because there are two ways to obtain a token the server has not just
|
|
42
|
+
* refused: reading the store (the first 401 of a session, when nothing was
|
|
43
|
+
* sent yet) and forcing a renewal (a stored token the server no longer
|
|
44
|
+
* accepts — revoked, or expired earlier than advertised). Both have to happen
|
|
45
|
+
* before `initialize` is answered: a session whose first request fails and
|
|
46
|
+
* whose second one works is a server the client files as broken.
|
|
47
|
+
*/
|
|
48
|
+
export const MAX_401_REPAIRS = 2;
|
|
49
|
+
const RECONNECT_BASE_MS = 250;
|
|
50
|
+
const RECONNECT_MAX_MS = 5000;
|
|
51
|
+
export class HttpUpstream {
|
|
52
|
+
options;
|
|
53
|
+
kind = 'http';
|
|
54
|
+
fetchImpl;
|
|
55
|
+
sleep;
|
|
56
|
+
sessionId;
|
|
57
|
+
protocolVersion;
|
|
58
|
+
legacyPostUrl;
|
|
59
|
+
legacyProbed = false;
|
|
60
|
+
serverStream;
|
|
61
|
+
serverStreamOpen = false;
|
|
62
|
+
lastEventId;
|
|
63
|
+
closed = false;
|
|
64
|
+
/**
|
|
65
|
+
* Serialises the DISPATCH of the POSTs, not their bodies: the session
|
|
66
|
+
* identifier the server hands out on the first exchange has to be on every
|
|
67
|
+
* later request, so the requests leave in order. What comes back is read
|
|
68
|
+
* concurrently, see `post`.
|
|
69
|
+
*/
|
|
70
|
+
tail = Promise.resolve();
|
|
71
|
+
constructor(options) {
|
|
72
|
+
this.options = options;
|
|
73
|
+
this.fetchImpl = options.fetchImpl ?? ((input, init) => fetch(input, init));
|
|
74
|
+
this.sleep = options.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
75
|
+
}
|
|
76
|
+
async start() {
|
|
77
|
+
// Nothing to do eagerly: the session identifier and the negotiated
|
|
78
|
+
// protocol version only exist once `initialize` has been answered, and
|
|
79
|
+
// both are needed to open the server-to-client stream.
|
|
80
|
+
}
|
|
81
|
+
send(message) {
|
|
82
|
+
const context = {
|
|
83
|
+
id: typeof message.id === 'string' || typeof message.id === 'number' ? message.id : undefined,
|
|
84
|
+
method: typeof message.method === 'string' ? message.method : undefined,
|
|
85
|
+
};
|
|
86
|
+
this.tail = this.tail
|
|
87
|
+
.then(() => this.post(message, context))
|
|
88
|
+
.catch((error) => {
|
|
89
|
+
const reported = error instanceof Error ? error : new Error(String(error));
|
|
90
|
+
this.options.logger.error('upstream POST failed', {
|
|
91
|
+
method: context.method,
|
|
92
|
+
error: reported.message,
|
|
93
|
+
});
|
|
94
|
+
this.failPending(context, UPSTREAM_HTTP_ERROR, reported.message);
|
|
95
|
+
this.options.events.onError(reported);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
async close() {
|
|
99
|
+
if (this.closed)
|
|
100
|
+
return;
|
|
101
|
+
this.closed = true;
|
|
102
|
+
this.serverStream?.abort();
|
|
103
|
+
// Best effort: the spec lets a client end a session with DELETE, and a
|
|
104
|
+
// server that does not implement it answers 405, which is fine.
|
|
105
|
+
if (this.sessionId && !this.legacyPostUrl) {
|
|
106
|
+
try {
|
|
107
|
+
await this.fetchImpl(this.options.spec.url, {
|
|
108
|
+
method: 'DELETE',
|
|
109
|
+
redirect: 'manual',
|
|
110
|
+
headers: (await this.headersWithAuth({ accept: false })).headers,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
this.options.logger.debug('session DELETE failed', {
|
|
115
|
+
error: error instanceof Error ? error.message : String(error),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
this.options.events.onClose({ reason: 'closed by the proxy' });
|
|
120
|
+
}
|
|
121
|
+
// ── POST ──────────────────────────────────────────────────────────────────
|
|
122
|
+
async post(message, context, repairs = 0) {
|
|
123
|
+
if (this.closed)
|
|
124
|
+
return;
|
|
125
|
+
const target = this.legacyPostUrl ?? this.options.spec.url;
|
|
126
|
+
const { headers, token } = await this.headersWithAuth({ accept: true });
|
|
127
|
+
const response = await this.fetchImpl(target, {
|
|
128
|
+
method: 'POST',
|
|
129
|
+
// Never followed. This request carries the bearer token and, for a
|
|
130
|
+
// `tools/call`, the user's arguments; a 307 would replay both against
|
|
131
|
+
// an origin nobody chose to talk to.
|
|
132
|
+
redirect: 'manual',
|
|
133
|
+
headers: { ...headers, 'content-type': 'application/json' },
|
|
134
|
+
body: JSON.stringify(message),
|
|
135
|
+
});
|
|
136
|
+
if (isRedirect(response.status)) {
|
|
137
|
+
await response.text().catch(() => '');
|
|
138
|
+
const text = `upstream ${this.options.spec.url} answered with a redirect (HTTP ${response.status}) ` +
|
|
139
|
+
'to a request carrying credentials. VibeDefend does not follow it: a server that does ' +
|
|
140
|
+
'this is asking for the request to be replayed elsewhere.';
|
|
141
|
+
this.options.logger.error('upstream answered a credential-bearing request with a redirect', {
|
|
142
|
+
status: response.status,
|
|
143
|
+
method: context.method,
|
|
144
|
+
});
|
|
145
|
+
this.failPending(context, UPSTREAM_SUSPICIOUS_REDIRECT, text);
|
|
146
|
+
this.options.events.onError(new Error(text));
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (response.status === 401) {
|
|
150
|
+
await response.text().catch(() => '');
|
|
151
|
+
// Bounded by construction, see MAX_401_REPAIRS: every retry carries a
|
|
152
|
+
// token different from the one just refused, and a source that hands
|
|
153
|
+
// the same one back is not retried. Beyond that the credential is
|
|
154
|
+
// genuinely no good, and looping would hammer the server with it.
|
|
155
|
+
if (repairs < MAX_401_REPAIRS && this.options.auth) {
|
|
156
|
+
const repair = await this.options.auth.reauthorize(token).catch(() => null);
|
|
157
|
+
if (repair?.token && repair.token !== token) {
|
|
158
|
+
this.options.logger.info(repair.renewed
|
|
159
|
+
? 'upstream token renewed after a 401, retrying'
|
|
160
|
+
: 'upstream token read from the store after a 401, retrying', { repair: repairs + 1 });
|
|
161
|
+
await this.post(message, context, repairs + 1);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const challenge = response.headers.get('www-authenticate') ?? '';
|
|
166
|
+
const detail = challenge ? ` (${challenge})` : '';
|
|
167
|
+
const text = `upstream ${this.options.spec.url} requires authentication${detail}. ` +
|
|
168
|
+
'Run `vibedefend connect` to authorize it, or pass --header "Authorization: Bearer <token>".';
|
|
169
|
+
this.options.logger.error('upstream returned 401', {
|
|
170
|
+
challenge,
|
|
171
|
+
repairs,
|
|
172
|
+
});
|
|
173
|
+
this.failPending(context, UPSTREAM_UNAUTHORIZED, text);
|
|
174
|
+
this.options.events.onError(new Error(text));
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
// Unroutable POST: either the server speaks the 2024-11-05 transport, or
|
|
178
|
+
// the URL is wrong. One probe tells us which.
|
|
179
|
+
if (!this.legacyPostUrl && !this.legacyProbed && isUnroutable(response.status)) {
|
|
180
|
+
await response.text().catch(() => '');
|
|
181
|
+
this.legacyProbed = true;
|
|
182
|
+
const endpoint = await this.probeLegacyEndpoint();
|
|
183
|
+
if (endpoint) {
|
|
184
|
+
this.options.logger.info('upstream speaks the legacy HTTP+SSE transport', { endpoint });
|
|
185
|
+
this.legacyPostUrl = endpoint;
|
|
186
|
+
await this.post(message, context);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
throw new Error(`upstream ${this.options.spec.url} rejected the POST with ${response.status} and does not expose an SSE endpoint`);
|
|
190
|
+
}
|
|
191
|
+
if (!response.ok) {
|
|
192
|
+
const body = await response.text().catch(() => '');
|
|
193
|
+
throw new Error(`upstream ${target} answered ${response.status} ${response.statusText}${body ? `: ${truncate(body)}` : ''}`);
|
|
194
|
+
}
|
|
195
|
+
this.captureSession(response);
|
|
196
|
+
if (response.status === 202 || response.status === 204) {
|
|
197
|
+
// Accepted; anything to say comes back on a stream.
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const contentType = (response.headers.get('content-type') ?? '').toLowerCase();
|
|
201
|
+
if (contentType.includes('text/event-stream')) {
|
|
202
|
+
// Read the stream OUTSIDE the send queue. A tool call that needs
|
|
203
|
+
// something back from the client — `sampling/createMessage`,
|
|
204
|
+
// `elicitation/create` — holds this stream open until it gets its
|
|
205
|
+
// answer, and that answer is itself a POST. Awaiting the body here
|
|
206
|
+
// would make the two wait for each other for ever.
|
|
207
|
+
void this.readSseBody(response).catch((error) => {
|
|
208
|
+
this.options.logger.warn('a response stream failed', {
|
|
209
|
+
method: context.method,
|
|
210
|
+
error: error instanceof Error ? error.message : String(error),
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
if (contentType.includes('application/json')) {
|
|
216
|
+
const text = await response.text();
|
|
217
|
+
this.deliverJsonText(text);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
const text = await response.text();
|
|
221
|
+
if (text.trim() !== '')
|
|
222
|
+
this.deliverJsonText(text);
|
|
223
|
+
}
|
|
224
|
+
// ── Server-to-client stream ───────────────────────────────────────────────
|
|
225
|
+
/**
|
|
226
|
+
* Opens the stream the server uses for its own requests and notifications.
|
|
227
|
+
* Called once `initialize` has been answered, because the session header
|
|
228
|
+
* has to be on it.
|
|
229
|
+
*/
|
|
230
|
+
openServerStream() {
|
|
231
|
+
if (this.legacyPostUrl)
|
|
232
|
+
return; // legacy mode already has its stream open
|
|
233
|
+
if (this.serverStreamOpen || this.closed)
|
|
234
|
+
return;
|
|
235
|
+
this.serverStreamOpen = true;
|
|
236
|
+
void this.runServerStream();
|
|
237
|
+
}
|
|
238
|
+
async runServerStream() {
|
|
239
|
+
const maxReconnects = this.options.maxReconnects ?? MAX_STREAM_RECONNECTS;
|
|
240
|
+
for (let attempt = 0; attempt <= maxReconnects && !this.closed; attempt += 1) {
|
|
241
|
+
let controller;
|
|
242
|
+
try {
|
|
243
|
+
controller = new AbortController();
|
|
244
|
+
this.serverStream = controller;
|
|
245
|
+
const headers = {
|
|
246
|
+
...(await this.headersWithAuth({ accept: false })).headers,
|
|
247
|
+
accept: 'text/event-stream',
|
|
248
|
+
};
|
|
249
|
+
if (this.lastEventId)
|
|
250
|
+
headers['last-event-id'] = this.lastEventId;
|
|
251
|
+
const response = await this.fetchImpl(this.options.spec.url, {
|
|
252
|
+
method: 'GET',
|
|
253
|
+
// The stream request carries the bearer too.
|
|
254
|
+
redirect: 'manual',
|
|
255
|
+
headers,
|
|
256
|
+
signal: controller.signal,
|
|
257
|
+
});
|
|
258
|
+
if (isRedirect(response.status)) {
|
|
259
|
+
this.options.logger.error('server-to-client stream answered with a redirect', {
|
|
260
|
+
status: response.status,
|
|
261
|
+
});
|
|
262
|
+
this.serverStreamOpen = false;
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
if (response.status === 405 || response.status === 404 || response.status === 501) {
|
|
266
|
+
this.options.logger.debug('upstream has no server-to-client stream', {
|
|
267
|
+
status: response.status,
|
|
268
|
+
});
|
|
269
|
+
this.serverStreamOpen = false;
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
if (!response.ok) {
|
|
273
|
+
throw new Error(`GET stream answered ${response.status} ${response.statusText}`);
|
|
274
|
+
}
|
|
275
|
+
this.captureSession(response);
|
|
276
|
+
await this.readSseBody(response);
|
|
277
|
+
if (this.closed)
|
|
278
|
+
return;
|
|
279
|
+
this.options.logger.debug('server-to-client stream ended, reopening');
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
if (this.closed || controller?.signal.aborted)
|
|
283
|
+
return;
|
|
284
|
+
this.options.logger.warn('server-to-client stream dropped', {
|
|
285
|
+
attempt,
|
|
286
|
+
error: error instanceof Error ? error.message : String(error),
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
if (attempt < maxReconnects && !this.closed) {
|
|
290
|
+
await this.sleep(Math.min(RECONNECT_BASE_MS * 2 ** attempt, RECONNECT_MAX_MS));
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
this.serverStreamOpen = false;
|
|
294
|
+
if (!this.closed) {
|
|
295
|
+
this.options.logger.error('gave up reopening the server-to-client stream');
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/** The legacy transport announces its POST endpoint on a GET stream. */
|
|
299
|
+
async probeLegacyEndpoint() {
|
|
300
|
+
const controller = new AbortController();
|
|
301
|
+
let response;
|
|
302
|
+
try {
|
|
303
|
+
response = await this.fetchImpl(this.options.spec.url, {
|
|
304
|
+
method: 'GET',
|
|
305
|
+
redirect: 'manual',
|
|
306
|
+
headers: { accept: 'text/event-stream' },
|
|
307
|
+
signal: controller.signal,
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
this.options.logger.debug('legacy SSE probe failed', {
|
|
312
|
+
error: error instanceof Error ? error.message : String(error),
|
|
313
|
+
});
|
|
314
|
+
return undefined;
|
|
315
|
+
}
|
|
316
|
+
if (!response.ok || !(response.headers.get('content-type') ?? '').includes('text/event-stream')) {
|
|
317
|
+
await response.text().catch(() => '');
|
|
318
|
+
return undefined;
|
|
319
|
+
}
|
|
320
|
+
// The stream stays open for the whole session: it carries every answer.
|
|
321
|
+
this.serverStream = controller;
|
|
322
|
+
this.serverStreamOpen = true;
|
|
323
|
+
const endpoint = await this.readLegacyStream(response);
|
|
324
|
+
return endpoint;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Reads the legacy stream, resolving on the `endpoint` event and then
|
|
328
|
+
* continuing to deliver messages in the background for the rest of the
|
|
329
|
+
* session.
|
|
330
|
+
*/
|
|
331
|
+
readLegacyStream(response) {
|
|
332
|
+
return new Promise((resolve) => {
|
|
333
|
+
let settled = false;
|
|
334
|
+
const finish = (value) => {
|
|
335
|
+
if (settled)
|
|
336
|
+
return;
|
|
337
|
+
settled = true;
|
|
338
|
+
resolve(value);
|
|
339
|
+
};
|
|
340
|
+
void this.pump(response, (event) => {
|
|
341
|
+
if (event.event === 'endpoint') {
|
|
342
|
+
const url = new URL(event.data.trim(), this.options.spec.url).toString();
|
|
343
|
+
finish(url);
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
if (event.event === 'message' || event.event === '')
|
|
347
|
+
this.deliverJsonText(event.data);
|
|
348
|
+
})
|
|
349
|
+
.catch((error) => {
|
|
350
|
+
this.options.logger.warn('legacy SSE stream failed', {
|
|
351
|
+
error: error instanceof Error ? error.message : String(error),
|
|
352
|
+
});
|
|
353
|
+
})
|
|
354
|
+
.finally(() => {
|
|
355
|
+
this.serverStreamOpen = false;
|
|
356
|
+
finish(undefined);
|
|
357
|
+
});
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
async readSseBody(response) {
|
|
361
|
+
await this.pump(response, (event) => {
|
|
362
|
+
if (event.id)
|
|
363
|
+
this.lastEventId = event.id;
|
|
364
|
+
if (event.event === 'message' || event.event === '')
|
|
365
|
+
this.deliverJsonText(event.data);
|
|
366
|
+
else
|
|
367
|
+
this.options.logger.debug('ignoring an SSE event', { event: event.event });
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
async pump(response, onEvent) {
|
|
371
|
+
const body = response.body;
|
|
372
|
+
if (!body)
|
|
373
|
+
return;
|
|
374
|
+
const reader = body.getReader();
|
|
375
|
+
const decoder = new TextDecoder();
|
|
376
|
+
const parser = new SseParser();
|
|
377
|
+
try {
|
|
378
|
+
for (;;) {
|
|
379
|
+
const { done, value } = await reader.read();
|
|
380
|
+
if (done)
|
|
381
|
+
break;
|
|
382
|
+
const events = parser.push(decoder.decode(value, { stream: true }));
|
|
383
|
+
for (const event of events)
|
|
384
|
+
onEvent(event);
|
|
385
|
+
}
|
|
386
|
+
const tail = parser.push(decoder.decode());
|
|
387
|
+
for (const event of tail)
|
|
388
|
+
onEvent(event);
|
|
389
|
+
}
|
|
390
|
+
finally {
|
|
391
|
+
try {
|
|
392
|
+
reader.releaseLock();
|
|
393
|
+
}
|
|
394
|
+
catch {
|
|
395
|
+
/* the stream is already gone */
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
// ── Helpers ───────────────────────────────────────────────────────────────
|
|
400
|
+
deliverJsonText(text) {
|
|
401
|
+
const trimmed = text.trim();
|
|
402
|
+
if (trimmed === '')
|
|
403
|
+
return;
|
|
404
|
+
let parsed;
|
|
405
|
+
try {
|
|
406
|
+
parsed = JSON.parse(trimmed);
|
|
407
|
+
}
|
|
408
|
+
catch {
|
|
409
|
+
this.options.logger.warn('upstream sent a non-JSON payload', { sample: truncate(trimmed) });
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
// A batch is legal on HTTP; the agent's stdio channel takes them one by one.
|
|
413
|
+
const messages = Array.isArray(parsed) ? parsed : [parsed];
|
|
414
|
+
for (const message of messages) {
|
|
415
|
+
if (typeof message !== 'object' || message === null)
|
|
416
|
+
continue;
|
|
417
|
+
const typed = message;
|
|
418
|
+
this.noteProtocolVersion(typed);
|
|
419
|
+
this.options.events.onMessage(typed);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* `MCP-Protocol-Version` must be sent on every request after the
|
|
424
|
+
* negotiation, and the negotiated value is the one in the `initialize`
|
|
425
|
+
* result — not the one the agent asked for.
|
|
426
|
+
*/
|
|
427
|
+
noteProtocolVersion(message) {
|
|
428
|
+
if (this.protocolVersion || !isResponse(message))
|
|
429
|
+
return;
|
|
430
|
+
const result = message.result;
|
|
431
|
+
if (typeof result !== 'object' || result === null)
|
|
432
|
+
return;
|
|
433
|
+
const version = result.protocolVersion;
|
|
434
|
+
if (typeof version === 'string') {
|
|
435
|
+
this.protocolVersion = version;
|
|
436
|
+
this.openServerStream();
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
captureSession(response) {
|
|
440
|
+
const sessionId = response.headers.get('mcp-session-id');
|
|
441
|
+
if (sessionId && sessionId !== this.sessionId) {
|
|
442
|
+
this.sessionId = sessionId;
|
|
443
|
+
this.options.logger.debug('upstream session established', { sessionId });
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* The headers plus the bearer token, when there is one.
|
|
448
|
+
*
|
|
449
|
+
* An explicit `--header Authorization: …` wins: an operator who typed a
|
|
450
|
+
* token on the command line meant that one, and silently replacing it with
|
|
451
|
+
* a stored credential would be the kind of surprise that costs an hour.
|
|
452
|
+
*/
|
|
453
|
+
async headersWithAuth(options) {
|
|
454
|
+
const headers = this.headers(options);
|
|
455
|
+
if (!this.options.auth)
|
|
456
|
+
return { headers, token: null };
|
|
457
|
+
if (Object.keys(headers).some((name) => name.toLowerCase() === 'authorization')) {
|
|
458
|
+
return { headers, token: null };
|
|
459
|
+
}
|
|
460
|
+
const token = await this.options.auth.token().catch(() => null);
|
|
461
|
+
if (token)
|
|
462
|
+
headers.authorization = `Bearer ${token}`;
|
|
463
|
+
return { headers, token };
|
|
464
|
+
}
|
|
465
|
+
headers(options) {
|
|
466
|
+
const headers = { ...(this.options.spec.headers ?? {}) };
|
|
467
|
+
if (options.accept)
|
|
468
|
+
headers.accept = 'application/json, text/event-stream';
|
|
469
|
+
if (this.sessionId)
|
|
470
|
+
headers['mcp-session-id'] = this.sessionId;
|
|
471
|
+
if (this.protocolVersion)
|
|
472
|
+
headers['mcp-protocol-version'] = this.protocolVersion;
|
|
473
|
+
return headers;
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* Answers a request the upstream will never answer. Without this the agent
|
|
477
|
+
* waits for its own timeout with no explanation; with it, the failure is on
|
|
478
|
+
* screen in the client.
|
|
479
|
+
*/
|
|
480
|
+
failPending(context, code, message) {
|
|
481
|
+
if (context.id === undefined)
|
|
482
|
+
return;
|
|
483
|
+
this.options.events.onMessage({
|
|
484
|
+
jsonrpc: '2.0',
|
|
485
|
+
id: context.id,
|
|
486
|
+
error: { code, message },
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
function isUnroutable(status) {
|
|
491
|
+
return status === 404 || status === 405 || status === 406 || status === 415;
|
|
492
|
+
}
|
|
493
|
+
function isRedirect(status) {
|
|
494
|
+
return status >= 300 && status < 400;
|
|
495
|
+
}
|
|
496
|
+
function truncate(value, max = 300) {
|
|
497
|
+
return value.length <= max ? value : `${value.slice(0, max)}…`;
|
|
498
|
+
}
|
|
499
|
+
//# sourceMappingURL=upstreamHttp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstreamHttp.js","sourceRoot":"","sources":["../../../src/mcp/proxy/upstreamHttp.ts"],"names":[],"mappings":"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"}
|