@cybedefend/vibedefend 1.5.0 → 1.7.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 +71 -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 +320 -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 +24679 -5079
- 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 +94 -61
- package/dist/hooks/runtime/emit.js.map +1 -1
- package/dist/hooks/runtime/fetch-rules.js +22 -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 +12 -6
- package/dist/hooks/runtime/pre-compact.js.map +1 -1
- package/dist/hooks/runtime/resolve.js +90 -8
- 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 +5 -1
- package/dist/hooks/runtime/session-activation.js.map +1 -1
- package/dist/hooks/runtime/session-review.js +163 -45
- package/dist/hooks/runtime/session-review.js.map +1 -1
- package/dist/hooks/runtime/session-start.js +2 -1
- 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 +2 -1
- 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 +77 -11
- 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 +412 -0
- package/dist/mcp/proxy/inject.js.map +1 -0
- package/dist/mcp/proxy/intercept.js +63 -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 +57 -0
- package/dist/mcp/proxy/paths.js.map +1 -0
- package/dist/mcp/proxy/proxy.js +520 -0
- package/dist/mcp/proxy/proxy.js.map +1 -0
- package/dist/mcp/proxy/serverCheckTimer.js +75 -0
- package/dist/mcp/proxy/serverCheckTimer.js.map +1 -0
- package/dist/mcp/proxy/sessionLifecycle.js +29 -0
- package/dist/mcp/proxy/sessionLifecycle.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 +718 -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/report/buffer.js +351 -0
- package/dist/mcp/report/buffer.js.map +1 -0
- package/dist/mcp/report/coalesce.js +165 -0
- package/dist/mcp/report/coalesce.js.map +1 -0
- package/dist/mcp/report/constants.js +51 -0
- package/dist/mcp/report/constants.js.map +1 -0
- package/dist/mcp/report/project.js +83 -0
- package/dist/mcp/report/project.js.map +1 -0
- package/dist/mcp/report/reporter.js +443 -0
- package/dist/mcp/report/reporter.js.map +1 -0
- package/dist/mcp/report/types.js +3 -0
- package/dist/mcp/report/types.js.map +1 -0
- package/dist/mcp/report/validate.js +179 -0
- package/dist/mcp/report/validate.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 +514 -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 +200 -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 +286 -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 +160 -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 +1166 -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,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stdio upstream: the proxy spawns the server the client used to spawn, and
|
|
3
|
+
* hands it the same `command`, `args`, `env` and `cwd`.
|
|
4
|
+
*
|
|
5
|
+
* Three things matter here beyond piping bytes:
|
|
6
|
+
* - the child's stderr is forwarded to our stderr, because that is where the
|
|
7
|
+
* client already looks for a server's diagnostics; it is also copied to
|
|
8
|
+
* the log file. It never reaches stdout;
|
|
9
|
+
* - the child is stopped for good on shutdown, including on Windows where
|
|
10
|
+
* `npx` shims leave a process tree behind;
|
|
11
|
+
* - `.cmd` / `.bat` on Windows go through `cmd.exe`, see `windowsCommand.ts`.
|
|
12
|
+
*/
|
|
13
|
+
import { spawn } from 'node:child_process';
|
|
14
|
+
import { encodeMessage, LineFramer } from './jsonrpc.js';
|
|
15
|
+
import { upstreamEnvironment } from './spec.js';
|
|
16
|
+
import { planSpawn } from './windowsCommand.js';
|
|
17
|
+
/** How long a child gets to exit on its own before it is killed. */
|
|
18
|
+
export const STDIO_SHUTDOWN_GRACE_MS = 2000;
|
|
19
|
+
export class StdioUpstream {
|
|
20
|
+
options;
|
|
21
|
+
kind = 'stdio';
|
|
22
|
+
child;
|
|
23
|
+
framer = new LineFramer();
|
|
24
|
+
closing = false;
|
|
25
|
+
exited = false;
|
|
26
|
+
constructor(options) {
|
|
27
|
+
this.options = options;
|
|
28
|
+
}
|
|
29
|
+
async start() {
|
|
30
|
+
const { spec, logger } = this.options;
|
|
31
|
+
const platform = this.options.platform ?? process.platform;
|
|
32
|
+
const parentEnv = this.options.env ?? process.env;
|
|
33
|
+
const plan = planSpawn(spec.command, spec.args, platform, parentEnv);
|
|
34
|
+
// ⚠️ The KEYS of the entry's own env, never the values: one of them is
|
|
35
|
+
// routinely an API key, and this line lands in a file on disk.
|
|
36
|
+
const envKeys = Object.keys(spec.env ?? {});
|
|
37
|
+
logger.info('spawning upstream', {
|
|
38
|
+
command: plan.command,
|
|
39
|
+
args: plan.args,
|
|
40
|
+
cwd: spec.cwd,
|
|
41
|
+
wrapped: plan.command !== spec.command,
|
|
42
|
+
envCount: envKeys.length,
|
|
43
|
+
envKeys,
|
|
44
|
+
});
|
|
45
|
+
const child = spawn(plan.command, plan.args, {
|
|
46
|
+
cwd: spec.cwd,
|
|
47
|
+
env: upstreamEnvironment(parentEnv, spec.env),
|
|
48
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
49
|
+
windowsVerbatimArguments: plan.windowsVerbatimArguments,
|
|
50
|
+
// Never a shell: the arguments are already exactly what the child must
|
|
51
|
+
// see, and a shell would re-split them.
|
|
52
|
+
shell: false,
|
|
53
|
+
});
|
|
54
|
+
this.child = child;
|
|
55
|
+
child.stdout.on('data', (chunk) => this.consume(chunk));
|
|
56
|
+
child.stdout.on('end', () => {
|
|
57
|
+
const { messages, errors } = this.framer.flush();
|
|
58
|
+
for (const message of messages)
|
|
59
|
+
this.options.events.onMessage(message);
|
|
60
|
+
for (const error of errors) {
|
|
61
|
+
this.options.logger.warn('undecodable trailing bytes from upstream', { ...error });
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
child.stderr.on('data', (chunk) => {
|
|
65
|
+
const text = chunk.toString('utf8');
|
|
66
|
+
this.options.logger.debug('upstream stderr', { text: text.trimEnd() });
|
|
67
|
+
const sink = this.options.stderr === undefined ? process.stderr : this.options.stderr;
|
|
68
|
+
if (sink)
|
|
69
|
+
sink.write(chunk);
|
|
70
|
+
});
|
|
71
|
+
// A write to a child that died between our check and the write raises
|
|
72
|
+
// EPIPE asynchronously; it is a close, not a crash.
|
|
73
|
+
child.stdin.on('error', (error) => {
|
|
74
|
+
if (error.code === 'EPIPE') {
|
|
75
|
+
this.options.logger.debug('upstream stdin closed under a write');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
this.options.events.onError(error);
|
|
79
|
+
});
|
|
80
|
+
child.on('exit', (code, signal) => {
|
|
81
|
+
this.exited = true;
|
|
82
|
+
this.options.logger.info('upstream exited', { code, signal });
|
|
83
|
+
this.options.events.onClose({ code, signal });
|
|
84
|
+
});
|
|
85
|
+
return new Promise((resolve, reject) => {
|
|
86
|
+
let settled = false;
|
|
87
|
+
child.once('error', (error) => {
|
|
88
|
+
if (settled) {
|
|
89
|
+
this.options.events.onError(error);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
settled = true;
|
|
93
|
+
this.exited = true;
|
|
94
|
+
reject(new Error(`cannot start upstream "${spec.command}": ${error.message}`));
|
|
95
|
+
});
|
|
96
|
+
// `spawn` fires once the OS accepted the exec; a command that does not
|
|
97
|
+
// exist fires `error` instead, which is the rejection above.
|
|
98
|
+
child.once('spawn', () => {
|
|
99
|
+
if (settled)
|
|
100
|
+
return;
|
|
101
|
+
settled = true;
|
|
102
|
+
resolve();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
send(message) {
|
|
107
|
+
const child = this.child;
|
|
108
|
+
if (!child || this.exited) {
|
|
109
|
+
this.options.logger.warn('dropping a message for a dead upstream', {
|
|
110
|
+
method: typeof message.method === 'string' ? message.method : undefined,
|
|
111
|
+
});
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
child.stdin.write(encodeMessage(message));
|
|
115
|
+
}
|
|
116
|
+
async close() {
|
|
117
|
+
const child = this.child;
|
|
118
|
+
if (!child || this.closing)
|
|
119
|
+
return;
|
|
120
|
+
this.closing = true;
|
|
121
|
+
if (this.exited)
|
|
122
|
+
return;
|
|
123
|
+
// Closing stdin is how an MCP server is asked to shut down; the signals
|
|
124
|
+
// below are only for a server that ignores it.
|
|
125
|
+
try {
|
|
126
|
+
child.stdin.end();
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
/* already gone */
|
|
130
|
+
}
|
|
131
|
+
const exited = new Promise((resolve) => {
|
|
132
|
+
if (this.exited)
|
|
133
|
+
return resolve();
|
|
134
|
+
child.once('exit', () => resolve());
|
|
135
|
+
});
|
|
136
|
+
const grace = this.options.shutdownGraceMs ?? STDIO_SHUTDOWN_GRACE_MS;
|
|
137
|
+
const timer = setTimeout(() => {
|
|
138
|
+
this.options.logger.warn('upstream ignored the shutdown, killing it', { pid: child.pid });
|
|
139
|
+
this.kill(child);
|
|
140
|
+
}, grace);
|
|
141
|
+
// The proxy must not be kept alive by its own shutdown timer.
|
|
142
|
+
if (typeof timer.unref === 'function')
|
|
143
|
+
timer.unref();
|
|
144
|
+
try {
|
|
145
|
+
await exited;
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
clearTimeout(timer);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* `child.kill()` only signals the process itself. `npx`, `uv` and friends
|
|
153
|
+
* spawn the real server as a grandchild, so on Windows the tree is killed
|
|
154
|
+
* through `taskkill` — a shipped executable, not a native dependency.
|
|
155
|
+
*/
|
|
156
|
+
kill(child) {
|
|
157
|
+
const platform = this.options.platform ?? process.platform;
|
|
158
|
+
if (platform === 'win32' && child.pid !== undefined) {
|
|
159
|
+
try {
|
|
160
|
+
spawn('taskkill', ['/pid', String(child.pid), '/T', '/F'], {
|
|
161
|
+
stdio: 'ignore',
|
|
162
|
+
windowsHide: true,
|
|
163
|
+
}).unref();
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
this.options.logger.warn('taskkill failed, falling back to SIGKILL', {
|
|
168
|
+
error: error instanceof Error ? error.message : String(error),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
try {
|
|
173
|
+
child.kill('SIGKILL');
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
/* already gone */
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
consume(chunk) {
|
|
180
|
+
const { messages, errors } = this.framer.push(chunk);
|
|
181
|
+
for (const message of messages)
|
|
182
|
+
this.options.events.onMessage(message);
|
|
183
|
+
for (const error of errors) {
|
|
184
|
+
this.options.logger.warn('undecodable line from upstream', { ...error });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=upstreamStdio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstreamStdio.js","sourceRoot":"","sources":["../../../src/mcp/proxy/upstreamStdio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `~/.cybedefend/mcp/upstreams.json` — the proxy's source of truth.
|
|
3
|
+
*
|
|
4
|
+
* After `vibedefend install` (Phase 5) a client's own config no longer holds
|
|
5
|
+
* the URL, the command or the headers of an MCP server: it holds
|
|
6
|
+
* `{"command": "vibedefend", "args": ["mcp", "--name", "<id>"]}`, and the real
|
|
7
|
+
* entry lives here. That is what makes `vibedefend unwrap` able to restore
|
|
8
|
+
* the original from a record of its own rather than from a backup that may
|
|
9
|
+
* have been edited since.
|
|
10
|
+
*
|
|
11
|
+
* Phase 2 only reads the file, and writes back the one field it learns:
|
|
12
|
+
* whether a server wants authentication. Phase 5 adds the writer that fills
|
|
13
|
+
* it from the client configs.
|
|
14
|
+
*/
|
|
15
|
+
import { readFileSync } from 'node:fs';
|
|
16
|
+
import { writeFileAtomic } from '../config/atomicWrite.js';
|
|
17
|
+
import { upstreamsFile } from './paths.js';
|
|
18
|
+
import { dialectFor, expandSpec } from './expand.js';
|
|
19
|
+
export function emptyUpstreams() {
|
|
20
|
+
return { version: 1, servers: {} };
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Reads the file. A missing, unreadable or malformed file reads as empty:
|
|
24
|
+
* the proxy is spawned by an agent mid-session and has nowhere useful to
|
|
25
|
+
* report a parse error, so it degrades to "no upstream is known", which the
|
|
26
|
+
* caller already handles.
|
|
27
|
+
*/
|
|
28
|
+
export function readUpstreams(env = process.env) {
|
|
29
|
+
let raw;
|
|
30
|
+
try {
|
|
31
|
+
raw = readFileSync(upstreamsFile(env), 'utf8');
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return emptyUpstreams();
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const parsed = JSON.parse(raw);
|
|
38
|
+
if (!parsed || parsed.version !== 1 || typeof parsed.servers !== 'object' || !parsed.servers) {
|
|
39
|
+
return emptyUpstreams();
|
|
40
|
+
}
|
|
41
|
+
const servers = {};
|
|
42
|
+
for (const [name, entry] of Object.entries(parsed.servers)) {
|
|
43
|
+
if (!entry || typeof entry !== 'object')
|
|
44
|
+
continue;
|
|
45
|
+
const typed = entry;
|
|
46
|
+
if (typed.transport !== 'stdio' && typed.transport !== 'http')
|
|
47
|
+
continue;
|
|
48
|
+
Object.defineProperty(servers, name, {
|
|
49
|
+
value: { ...typed, name },
|
|
50
|
+
writable: true,
|
|
51
|
+
enumerable: true,
|
|
52
|
+
configurable: true,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return { version: 1, servers };
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return emptyUpstreams();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Writes the file atomically.
|
|
63
|
+
*
|
|
64
|
+
* One proxy runs per MCP server, so several of them race on this file — the
|
|
65
|
+
* temp-then-rename keeps a reader from ever seeing half a document. `0600`
|
|
66
|
+
* because an entry may carry a header the client config used to hold in the
|
|
67
|
+
* clear.
|
|
68
|
+
*/
|
|
69
|
+
export function writeUpstreams(file, env = process.env) {
|
|
70
|
+
// 0600: an entry may carry a header the client config used to hold in the
|
|
71
|
+
// clear, which is the whole reason it moved here.
|
|
72
|
+
writeFileAtomic(upstreamsFile(env), `${JSON.stringify(file, null, 2)}\n`, { mode: 0o600 });
|
|
73
|
+
}
|
|
74
|
+
/** Records what a probe or a connection learned, leaving everything else alone. */
|
|
75
|
+
export function recordUpstreamAuth(name, auth, env = process.env) {
|
|
76
|
+
const file = readUpstreams(env);
|
|
77
|
+
const entry = Object.hasOwn(file.servers, name)
|
|
78
|
+
? Object.getOwnPropertyDescriptor(file.servers, name)?.value
|
|
79
|
+
: undefined;
|
|
80
|
+
if (!entry)
|
|
81
|
+
return;
|
|
82
|
+
Object.defineProperty(file.servers, name, {
|
|
83
|
+
value: { ...entry, auth, updatedAt: new Date().toISOString() },
|
|
84
|
+
writable: true,
|
|
85
|
+
enumerable: true,
|
|
86
|
+
configurable: true,
|
|
87
|
+
});
|
|
88
|
+
writeUpstreams(file, env);
|
|
89
|
+
}
|
|
90
|
+
export class UnknownUpstreamError extends Error {
|
|
91
|
+
name;
|
|
92
|
+
known;
|
|
93
|
+
constructor(name, known) {
|
|
94
|
+
super(known.length === 0
|
|
95
|
+
? `no upstream named "${name}": ~/.cybedefend/mcp/upstreams.json is empty or missing. Run \`vibedefend install\` to fill it.`
|
|
96
|
+
: `no upstream named "${name}". Known: ${known.join(', ')}.`);
|
|
97
|
+
this.name = name;
|
|
98
|
+
this.known = known;
|
|
99
|
+
this.name = 'UnknownUpstreamError';
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** The spec the proxy needs, from an entry. */
|
|
103
|
+
export function specOf(entry) {
|
|
104
|
+
if (entry.transport === 'http') {
|
|
105
|
+
if (!entry.url)
|
|
106
|
+
throw new Error(`upstream "${entry.name}" is http but has no url`);
|
|
107
|
+
return { transport: 'http', url: entry.url, headers: entry.headers };
|
|
108
|
+
}
|
|
109
|
+
if (!entry.command)
|
|
110
|
+
throw new Error(`upstream "${entry.name}" is stdio but has no command`);
|
|
111
|
+
return {
|
|
112
|
+
transport: 'stdio',
|
|
113
|
+
command: entry.command,
|
|
114
|
+
args: entry.args ?? [],
|
|
115
|
+
env: entry.env,
|
|
116
|
+
cwd: entry.cwd,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* The spec as the ORIGINATING CLIENT would have built it: variable references
|
|
121
|
+
* resolved, in that client's own syntax.
|
|
122
|
+
*
|
|
123
|
+
* ⚠️ Deliberately NOT folded into `specOf`. That one feeds
|
|
124
|
+
* `upstreamServerId`, and an identity that moved every time an environment
|
|
125
|
+
* variable did would invalidate the verdict cache on every shell change —
|
|
126
|
+
* and would let anyone flip a server's identity by exporting a variable.
|
|
127
|
+
*/
|
|
128
|
+
export function expandedSpecOf(entry, env = process.env) {
|
|
129
|
+
return expandSpec(specOf(entry), env, dialectFor(entry.source?.client));
|
|
130
|
+
}
|
|
131
|
+
/** Resolves `--name <id>` to a spec, or says what is known instead. */
|
|
132
|
+
export function resolveNamedUpstream(name, env = process.env) {
|
|
133
|
+
const file = readUpstreams(env);
|
|
134
|
+
const entry = file.servers[name];
|
|
135
|
+
if (!entry)
|
|
136
|
+
throw new UnknownUpstreamError(name, Object.keys(file.servers));
|
|
137
|
+
return { entry, spec: specOf(entry) };
|
|
138
|
+
}
|
|
139
|
+
/** Every http upstream, which is what `vibedefend connect --all` iterates over. */
|
|
140
|
+
export function httpUpstreams(env = process.env) {
|
|
141
|
+
return Object.values(readUpstreams(env).servers).filter((entry) => entry.transport === 'http' && typeof entry.url === 'string');
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=upstreams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstreams.js","sourceRoot":"","sources":["../../../src/mcp/proxy/upstreams.ts"],"names":[],"mappings":"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"}
|