@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,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the proxy needs to reach one upstream MCP server, and how the CLI
|
|
3
|
+
* options turn into it.
|
|
4
|
+
*
|
|
5
|
+
* Phase 5 will read the same shape out of `~/.cybedefend/mcp/upstreams.json`;
|
|
6
|
+
* Phase 1 builds it from the command line only.
|
|
7
|
+
*/
|
|
8
|
+
import { parse as parseShellWords } from 'shell-quote';
|
|
9
|
+
import { PROXY_ENV_PREFIX } from './paths.js';
|
|
10
|
+
export class UpstreamSpecError extends Error {
|
|
11
|
+
constructor(message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = 'UpstreamSpecError';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/** A short, stable label for logs. Never used as an identity (that is Phase 3). */
|
|
17
|
+
export function describeUpstream(spec) {
|
|
18
|
+
return spec.transport === 'http'
|
|
19
|
+
? spec.url
|
|
20
|
+
: [spec.command, ...spec.args].join(' ').trim() || spec.command;
|
|
21
|
+
}
|
|
22
|
+
function isHttpUrl(value) {
|
|
23
|
+
return /^https?:\/\//i.test(value.trim());
|
|
24
|
+
}
|
|
25
|
+
/** Shell operators, refused on both platforms. The proxy never runs a shell. */
|
|
26
|
+
const WINDOWS_SHELL_OPERATORS = /(?:&&|\|\||[|&<>^])/;
|
|
27
|
+
/**
|
|
28
|
+
* Splits a Windows command line.
|
|
29
|
+
*
|
|
30
|
+
* ⚠️ A backslash is a PATH SEPARATOR here, never an escape. That single
|
|
31
|
+
* difference is why this branch exists: run through a POSIX tokeniser,
|
|
32
|
+
* `C:\Program\node.exe` comes back as `C:Programnode.exe`, so
|
|
33
|
+
* `--upstream "C:\...\node.exe C:\...\index.js"` launched an executable
|
|
34
|
+
* that does not exist and the server exited 1 without naming anything.
|
|
35
|
+
* Measured on 2026-09-09, the first time this suite ran on a real Windows
|
|
36
|
+
* runner — the option had been broken on every Windows machine until then.
|
|
37
|
+
*
|
|
38
|
+
* Double quotes group, and only outside them do shell operators count: a
|
|
39
|
+
* `&&` inside a quoted argument is data, not syntax.
|
|
40
|
+
*/
|
|
41
|
+
function parseWindowsCommandLine(input) {
|
|
42
|
+
const words = [];
|
|
43
|
+
let current = '';
|
|
44
|
+
let quoted = false;
|
|
45
|
+
let started = false;
|
|
46
|
+
for (const char of input) {
|
|
47
|
+
if (char === '"') {
|
|
48
|
+
quoted = !quoted;
|
|
49
|
+
started = true;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (!quoted && /\s/.test(char)) {
|
|
53
|
+
if (started)
|
|
54
|
+
words.push(current);
|
|
55
|
+
current = '';
|
|
56
|
+
started = false;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
current += char;
|
|
60
|
+
started = true;
|
|
61
|
+
}
|
|
62
|
+
if (started)
|
|
63
|
+
words.push(current);
|
|
64
|
+
// Operators are looked for in the UNQUOTED text only, which is what
|
|
65
|
+
// `cmd.exe` would act on.
|
|
66
|
+
const unquoted = input.replace(/"[^"]*"/g, '');
|
|
67
|
+
if (WINDOWS_SHELL_OPERATORS.test(unquoted)) {
|
|
68
|
+
throw new UpstreamSpecError('shell syntax is not supported in an upstream command. ' +
|
|
69
|
+
'Pass the command and its arguments after `--`, or use --upstream-command / --upstream-arg.');
|
|
70
|
+
}
|
|
71
|
+
return words;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Splits a `--upstream "npx -y pkg"` string into a command and its arguments.
|
|
75
|
+
*
|
|
76
|
+
* Shell operators, globs and comments are refused rather than honoured: the
|
|
77
|
+
* proxy never runs a shell, so accepting `&&` here would either drop the tail
|
|
78
|
+
* silently or, worse, be interpreted later by `cmd.exe` on Windows. The
|
|
79
|
+
* parser is told to leave `$VAR` alone — there is no variable expansion in
|
|
80
|
+
* this option, and a value that silently became the empty string would be a
|
|
81
|
+
* hard bug to find.
|
|
82
|
+
*
|
|
83
|
+
* The platform is a parameter, not a read of `process.platform`, so both
|
|
84
|
+
* branches are exercised on every runner instead of only the one the test
|
|
85
|
+
* happens to run on — which is exactly how the backslash defect survived.
|
|
86
|
+
*/
|
|
87
|
+
export function parseCommandLine(input, platform = process.platform) {
|
|
88
|
+
if (platform === 'win32') {
|
|
89
|
+
const words = parseWindowsCommandLine(input);
|
|
90
|
+
if (words.length === 0)
|
|
91
|
+
throw new UpstreamSpecError('the upstream command is empty');
|
|
92
|
+
return { command: words[0], args: words.slice(1) };
|
|
93
|
+
}
|
|
94
|
+
const tokens = parseShellWords(input, (key) => `$${key}`);
|
|
95
|
+
const words = [];
|
|
96
|
+
for (const token of tokens) {
|
|
97
|
+
if (typeof token !== 'string') {
|
|
98
|
+
const rendered = typeof token === 'object' && token !== null && 'op' in token
|
|
99
|
+
? String(token.op)
|
|
100
|
+
: 'a glob or a comment';
|
|
101
|
+
throw new UpstreamSpecError(`shell syntax is not supported in an upstream command (found ${rendered}). ` +
|
|
102
|
+
'Pass the command and its arguments after `--`, or use --upstream-command / --upstream-arg.');
|
|
103
|
+
}
|
|
104
|
+
words.push(token);
|
|
105
|
+
}
|
|
106
|
+
if (words.length === 0)
|
|
107
|
+
throw new UpstreamSpecError('the upstream command is empty');
|
|
108
|
+
return { command: words[0], args: words.slice(1) };
|
|
109
|
+
}
|
|
110
|
+
/** `KEY=VALUE`, repeated. An empty value is legal; a missing `=` is not. */
|
|
111
|
+
export function parseAssignments(entries, label) {
|
|
112
|
+
const out = {};
|
|
113
|
+
for (const entry of entries) {
|
|
114
|
+
const separator = entry.indexOf('=');
|
|
115
|
+
if (separator <= 0) {
|
|
116
|
+
throw new UpstreamSpecError(`${label} expects KEY=VALUE, got "${entry}"`);
|
|
117
|
+
}
|
|
118
|
+
out[entry.slice(0, separator)] = entry.slice(separator + 1);
|
|
119
|
+
}
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
122
|
+
/** `Name: value`, repeated. The value keeps its internal colons. */
|
|
123
|
+
export function parseHeaders(entries) {
|
|
124
|
+
const out = {};
|
|
125
|
+
for (const entry of entries) {
|
|
126
|
+
const separator = entry.indexOf(':');
|
|
127
|
+
if (separator <= 0) {
|
|
128
|
+
throw new UpstreamSpecError(`--header expects "Name: value", got "${entry}"`);
|
|
129
|
+
}
|
|
130
|
+
out[entry.slice(0, separator).trim()] = entry.slice(separator + 1).trim();
|
|
131
|
+
}
|
|
132
|
+
return out;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Builds the spec from the CLI options, in decreasing order of explicitness:
|
|
136
|
+
* the `--` form wins over `--upstream-command`, which wins over `--upstream`.
|
|
137
|
+
*/
|
|
138
|
+
export function resolveUpstreamSpec(options) {
|
|
139
|
+
const env = options.upstreamEnv?.length
|
|
140
|
+
? parseAssignments(options.upstreamEnv, '--upstream-env')
|
|
141
|
+
: undefined;
|
|
142
|
+
const headers = options.header?.length ? parseHeaders(options.header) : undefined;
|
|
143
|
+
const trailing = options.trailing?.filter((part) => part !== '--') ?? [];
|
|
144
|
+
if (trailing.length > 0) {
|
|
145
|
+
return stdio(trailing[0], trailing.slice(1), env, options.upstreamCwd);
|
|
146
|
+
}
|
|
147
|
+
if (options.upstreamCommand) {
|
|
148
|
+
return stdio(options.upstreamCommand, options.upstreamArg ?? [], env, options.upstreamCwd);
|
|
149
|
+
}
|
|
150
|
+
if (options.upstream) {
|
|
151
|
+
if (isHttpUrl(options.upstream)) {
|
|
152
|
+
return { transport: 'http', url: options.upstream.trim(), headers };
|
|
153
|
+
}
|
|
154
|
+
const { command, args } = parseCommandLine(options.upstream);
|
|
155
|
+
return stdio(command, args, env, options.upstreamCwd);
|
|
156
|
+
}
|
|
157
|
+
throw new UpstreamSpecError('no upstream given. Use --upstream <url|command>, --upstream-command <cmd>, or pass the command after `--`.');
|
|
158
|
+
}
|
|
159
|
+
function stdio(command, args, env, cwd) {
|
|
160
|
+
if (!command || command.trim() === '') {
|
|
161
|
+
throw new UpstreamSpecError('the upstream command is empty');
|
|
162
|
+
}
|
|
163
|
+
return { transport: 'stdio', command, args: [...args], env, cwd };
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Variables removed from the environment of a spawned upstream.
|
|
167
|
+
*
|
|
168
|
+
* `VIBEDEFEND_MCP_*` because it is the proxy's own configuration: an upstream
|
|
169
|
+
* would see settings that are none of its business, and — the reason this is
|
|
170
|
+
* testable — a server that reports its environment would answer differently
|
|
171
|
+
* behind the proxy than in front of it, which is the one thing Phase 1 rules
|
|
172
|
+
* out.
|
|
173
|
+
*
|
|
174
|
+
* The two token variables for a much harder reason. The proxy READS them as
|
|
175
|
+
* its own CybeDefend credential (`src/mcp/verify/token.ts`), and the process
|
|
176
|
+
* it is about to spawn is precisely the untrusted thing this product exists
|
|
177
|
+
* to watch. Handing it the credential we use to ask whether IT is malicious
|
|
178
|
+
* is not a defensible default, whatever the client would have done on its own.
|
|
179
|
+
*/
|
|
180
|
+
export const STRIPPED_UPSTREAM_ENV_VARS = [
|
|
181
|
+
'CYBEDEFEND_TOKEN',
|
|
182
|
+
'VIBEDEFEND_TOKEN',
|
|
183
|
+
];
|
|
184
|
+
/**
|
|
185
|
+
* The environment handed to a stdio upstream.
|
|
186
|
+
*
|
|
187
|
+
* An explicit `--upstream-env` override still wins: an operator who spelled a
|
|
188
|
+
* variable out on the command line meant that server to have it.
|
|
189
|
+
*/
|
|
190
|
+
export function upstreamEnvironment(parent, overrides) {
|
|
191
|
+
const out = {};
|
|
192
|
+
for (const [key, value] of Object.entries(parent)) {
|
|
193
|
+
if (value === undefined)
|
|
194
|
+
continue;
|
|
195
|
+
if (key.startsWith(PROXY_ENV_PREFIX))
|
|
196
|
+
continue;
|
|
197
|
+
if (STRIPPED_UPSTREAM_ENV_VARS.includes(key))
|
|
198
|
+
continue;
|
|
199
|
+
out[key] = value;
|
|
200
|
+
}
|
|
201
|
+
return overrides ? { ...out, ...overrides } : out;
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../src/mcp/proxy/spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
const LINE_BREAK = /\r\n|\n|\r/;
|
|
2
|
+
export class SseParser {
|
|
3
|
+
buffer = '';
|
|
4
|
+
dataLines = [];
|
|
5
|
+
eventName;
|
|
6
|
+
eventId;
|
|
7
|
+
retry;
|
|
8
|
+
/** Survives across events: an event without `id:` keeps the previous one. */
|
|
9
|
+
lastEventId;
|
|
10
|
+
push(chunk) {
|
|
11
|
+
this.buffer += chunk;
|
|
12
|
+
const events = [];
|
|
13
|
+
for (;;) {
|
|
14
|
+
const match = LINE_BREAK.exec(this.buffer);
|
|
15
|
+
if (!match)
|
|
16
|
+
break;
|
|
17
|
+
const line = this.buffer.slice(0, match.index);
|
|
18
|
+
this.buffer = this.buffer.slice(match.index + match[0].length);
|
|
19
|
+
const event = this.consumeLine(line);
|
|
20
|
+
if (event)
|
|
21
|
+
events.push(event);
|
|
22
|
+
}
|
|
23
|
+
return events;
|
|
24
|
+
}
|
|
25
|
+
get currentEventId() {
|
|
26
|
+
return this.lastEventId;
|
|
27
|
+
}
|
|
28
|
+
consumeLine(line) {
|
|
29
|
+
if (line === '')
|
|
30
|
+
return this.dispatch();
|
|
31
|
+
if (line.startsWith(':'))
|
|
32
|
+
return undefined;
|
|
33
|
+
const colon = line.indexOf(':');
|
|
34
|
+
const field = colon === -1 ? line : line.slice(0, colon);
|
|
35
|
+
let value = colon === -1 ? '' : line.slice(colon + 1);
|
|
36
|
+
if (value.startsWith(' '))
|
|
37
|
+
value = value.slice(1);
|
|
38
|
+
switch (field) {
|
|
39
|
+
case 'event':
|
|
40
|
+
this.eventName = value;
|
|
41
|
+
break;
|
|
42
|
+
case 'data':
|
|
43
|
+
this.dataLines.push(value);
|
|
44
|
+
break;
|
|
45
|
+
case 'id':
|
|
46
|
+
this.eventId = value;
|
|
47
|
+
break;
|
|
48
|
+
case 'retry': {
|
|
49
|
+
const parsed = Number(value);
|
|
50
|
+
if (Number.isInteger(parsed) && parsed >= 0)
|
|
51
|
+
this.retry = parsed;
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
default:
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
dispatch() {
|
|
60
|
+
const hadData = this.dataLines.length > 0;
|
|
61
|
+
const data = this.dataLines.join('\n');
|
|
62
|
+
const name = this.eventName;
|
|
63
|
+
const id = this.eventId;
|
|
64
|
+
const retry = this.retry;
|
|
65
|
+
this.dataLines = [];
|
|
66
|
+
this.eventName = undefined;
|
|
67
|
+
this.eventId = undefined;
|
|
68
|
+
this.retry = undefined;
|
|
69
|
+
if (id !== undefined)
|
|
70
|
+
this.lastEventId = id;
|
|
71
|
+
// A blank line that closed nothing is a heartbeat, not an event.
|
|
72
|
+
if (!hadData && name === undefined)
|
|
73
|
+
return undefined;
|
|
74
|
+
return { event: name ?? 'message', data, id: id ?? this.lastEventId, retry };
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=sse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../src/mcp/proxy/sse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstream.js","sourceRoot":"","sources":["../../../src/mcp/proxy/upstream.ts"],"names":[],"mappings":""}
|