@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.
Files changed (264) hide show
  1. package/README.md +71 -2
  2. package/dist/api/gateway-request.js +49 -0
  3. package/dist/api/gateway-request.js.map +1 -0
  4. package/dist/api/projects.js +67 -0
  5. package/dist/api/projects.js.map +1 -1
  6. package/dist/api/repository-link.js +157 -0
  7. package/dist/api/repository-link.js.map +1 -0
  8. package/dist/auth/auth-store.js +107 -25
  9. package/dist/auth/auth-store.js.map +1 -1
  10. package/dist/auth/auth.js +21 -0
  11. package/dist/auth/auth.js.map +1 -1
  12. package/dist/clients/cursor.js +5 -1
  13. package/dist/clients/cursor.js.map +1 -1
  14. package/dist/clients/vscode.js +38 -29
  15. package/dist/clients/vscode.js.map +1 -1
  16. package/dist/commands/mcp/allow.js +219 -0
  17. package/dist/commands/mcp/allow.js.map +1 -0
  18. package/dist/commands/mcp/connect.js +337 -0
  19. package/dist/commands/mcp/connect.js.map +1 -0
  20. package/dist/commands/mcp/index.js +170 -0
  21. package/dist/commands/mcp/index.js.map +1 -0
  22. package/dist/commands/mcp/proxy.js +320 -0
  23. package/dist/commands/mcp/proxy.js.map +1 -0
  24. package/dist/commands/mcp/scan.js +349 -0
  25. package/dist/commands/mcp/scan.js.map +1 -0
  26. package/dist/commands/mcp/sync.js +215 -0
  27. package/dist/commands/mcp/sync.js.map +1 -0
  28. package/dist/config.js +6 -0
  29. package/dist/config.js.map +1 -1
  30. package/dist/diagnostics.js +78 -12
  31. package/dist/diagnostics.js.map +1 -1
  32. package/dist/doctor.js +19 -0
  33. package/dist/doctor.js.map +1 -1
  34. package/dist/guards-evaluator/analysis-types.js +27 -0
  35. package/dist/guards-evaluator/analysis-types.js.map +1 -0
  36. package/dist/guards-evaluator/command-analysis.js +572 -0
  37. package/dist/guards-evaluator/command-analysis.js.map +1 -0
  38. package/dist/guards-evaluator/command-view.js +586 -0
  39. package/dist/guards-evaluator/command-view.js.map +1 -0
  40. package/dist/guards-evaluator/env.js +11 -0
  41. package/dist/guards-evaluator/env.js.map +1 -0
  42. package/dist/guards-evaluator/evaluate.js +91 -41
  43. package/dist/guards-evaluator/evaluate.js.map +1 -1
  44. package/dist/guards-evaluator/index.js +2 -1
  45. package/dist/guards-evaluator/index.js.map +1 -1
  46. package/dist/guards-evaluator/inline-code.js +259 -0
  47. package/dist/guards-evaluator/inline-code.js.map +1 -0
  48. package/dist/guards-evaluator/normalize.js +716 -0
  49. package/dist/guards-evaluator/normalize.js.map +1 -0
  50. package/dist/guards-evaluator/preprocess.js +13 -5
  51. package/dist/guards-evaluator/preprocess.js.map +1 -1
  52. package/dist/guards-evaluator/redact.js +19 -0
  53. package/dist/guards-evaluator/redact.js.map +1 -1
  54. package/dist/guards-evaluator/regex.js +25 -3
  55. package/dist/guards-evaluator/regex.js.map +1 -1
  56. package/dist/guards-evaluator/safe-commands.js +155 -0
  57. package/dist/guards-evaluator/safe-commands.js.map +1 -0
  58. package/dist/guards-evaluator/triage.js +315 -0
  59. package/dist/guards-evaluator/triage.js.map +1 -0
  60. package/dist/hook-runner.js +24679 -5079
  61. package/dist/hooks/install.js +38 -0
  62. package/dist/hooks/install.js.map +1 -1
  63. package/dist/hooks/runtime/config.js +38 -0
  64. package/dist/hooks/runtime/config.js.map +1 -1
  65. package/dist/hooks/runtime/emit.js +94 -61
  66. package/dist/hooks/runtime/emit.js.map +1 -1
  67. package/dist/hooks/runtime/fetch-rules.js +22 -7
  68. package/dist/hooks/runtime/fetch-rules.js.map +1 -1
  69. package/dist/hooks/runtime/gateway-http-error.js +34 -0
  70. package/dist/hooks/runtime/gateway-http-error.js.map +1 -0
  71. package/dist/hooks/runtime/guard-rules-cache.js +139 -17
  72. package/dist/hooks/runtime/guard-rules-cache.js.map +1 -1
  73. package/dist/hooks/runtime/guard-violations-buffer.js +321 -48
  74. package/dist/hooks/runtime/guard-violations-buffer.js.map +1 -1
  75. package/dist/hooks/runtime/judge-cache.js +6 -0
  76. package/dist/hooks/runtime/judge-cache.js.map +1 -1
  77. package/dist/hooks/runtime/judge-triage.js +193 -0
  78. package/dist/hooks/runtime/judge-triage.js.map +1 -0
  79. package/dist/hooks/runtime/judge.js +7 -1
  80. package/dist/hooks/runtime/judge.js.map +1 -1
  81. package/dist/hooks/runtime/pre-compact.js +12 -6
  82. package/dist/hooks/runtime/pre-compact.js.map +1 -1
  83. package/dist/hooks/runtime/resolve.js +90 -8
  84. package/dist/hooks/runtime/resolve.js.map +1 -1
  85. package/dist/hooks/runtime/retry-policy.js +57 -0
  86. package/dist/hooks/runtime/retry-policy.js.map +1 -0
  87. package/dist/hooks/runtime/review-sessions.js +74 -0
  88. package/dist/hooks/runtime/review-sessions.js.map +1 -0
  89. package/dist/hooks/runtime/script-resolve.js +695 -0
  90. package/dist/hooks/runtime/script-resolve.js.map +1 -0
  91. package/dist/hooks/runtime/session-activation.js +5 -1
  92. package/dist/hooks/runtime/session-activation.js.map +1 -1
  93. package/dist/hooks/runtime/session-review.js +163 -45
  94. package/dist/hooks/runtime/session-review.js.map +1 -1
  95. package/dist/hooks/runtime/session-start.js +2 -1
  96. package/dist/hooks/runtime/session-start.js.map +1 -1
  97. package/dist/hooks/runtime/session-writes.js +232 -0
  98. package/dist/hooks/runtime/session-writes.js.map +1 -0
  99. package/dist/hooks/runtime/sniff.js +26 -7
  100. package/dist/hooks/runtime/sniff.js.map +1 -1
  101. package/dist/hooks/runtime/target-resolve.js +336 -0
  102. package/dist/hooks/runtime/target-resolve.js.map +1 -0
  103. package/dist/hooks/runtime/unmapped-tools.js +93 -0
  104. package/dist/hooks/runtime/unmapped-tools.js.map +1 -0
  105. package/dist/hooks/runtime/usage-block.js +4 -0
  106. package/dist/hooks/runtime/usage-block.js.map +1 -1
  107. package/dist/hooks/runtime/user-prompt-submit.js +2 -1
  108. package/dist/hooks/runtime/user-prompt-submit.js.map +1 -1
  109. package/dist/hooks/runtime/wire-text.js +41 -0
  110. package/dist/hooks/runtime/wire-text.js.map +1 -0
  111. package/dist/hooks/runtime/work-dir.js +84 -0
  112. package/dist/hooks/runtime/work-dir.js.map +1 -0
  113. package/dist/index.js +45 -12
  114. package/dist/index.js.map +1 -1
  115. package/dist/install.js +174 -11
  116. package/dist/install.js.map +1 -1
  117. package/dist/link.js +74 -48
  118. package/dist/link.js.map +1 -1
  119. package/dist/login.js +77 -11
  120. package/dist/login.js.map +1 -1
  121. package/dist/mcp/auth/agent-sign-ins.js +174 -0
  122. package/dist/mcp/auth/agent-sign-ins.js.map +1 -0
  123. package/dist/mcp/auth/callback.js +200 -0
  124. package/dist/mcp/auth/callback.js.map +1 -0
  125. package/dist/mcp/auth/connect.js +392 -0
  126. package/dist/mcp/auth/connect.js.map +1 -0
  127. package/dist/mcp/auth/discovery.js +399 -0
  128. package/dist/mcp/auth/discovery.js.map +1 -0
  129. package/dist/mcp/auth/oauth.js +326 -0
  130. package/dist/mcp/auth/oauth.js.map +1 -0
  131. package/dist/mcp/auth/probe.js +128 -0
  132. package/dist/mcp/auth/probe.js.map +1 -0
  133. package/dist/mcp/auth/secrets.js +446 -0
  134. package/dist/mcp/auth/secrets.js.map +1 -0
  135. package/dist/mcp/auth/store.js +260 -0
  136. package/dist/mcp/auth/store.js.map +1 -0
  137. package/dist/mcp/auth/tokenSource.js +55 -0
  138. package/dist/mcp/auth/tokenSource.js.map +1 -0
  139. package/dist/mcp/config/atomicWrite.js +98 -0
  140. package/dist/mcp/config/atomicWrite.js.map +1 -0
  141. package/dist/mcp/config/clients.js +171 -0
  142. package/dist/mcp/config/clients.js.map +1 -0
  143. package/dist/mcp/config/cybedefend-servers.js +48 -0
  144. package/dist/mcp/config/cybedefend-servers.js.map +1 -0
  145. package/dist/mcp/config/discover.js +114 -0
  146. package/dist/mcp/config/discover.js.map +1 -0
  147. package/dist/mcp/config/hook.js +123 -0
  148. package/dist/mcp/config/hook.js.map +1 -0
  149. package/dist/mcp/config/index.js +11 -0
  150. package/dist/mcp/config/index.js.map +1 -0
  151. package/dist/mcp/config/install.js +132 -0
  152. package/dist/mcp/config/install.js.map +1 -0
  153. package/dist/mcp/config/installed.js +37 -0
  154. package/dist/mcp/config/installed.js.map +1 -0
  155. package/dist/mcp/config/jsonEdit.js +119 -0
  156. package/dist/mcp/config/jsonEdit.js.map +1 -0
  157. package/dist/mcp/config/lock.js +102 -0
  158. package/dist/mcp/config/lock.js.map +1 -0
  159. package/dist/mcp/config/proxyBinary.js +211 -0
  160. package/dist/mcp/config/proxyBinary.js.map +1 -0
  161. package/dist/mcp/config/rewrite.js +388 -0
  162. package/dist/mcp/config/rewrite.js.map +1 -0
  163. package/dist/mcp/config/types.js +34 -0
  164. package/dist/mcp/config/types.js.map +1 -0
  165. package/dist/mcp/proxy/audit.js +83 -0
  166. package/dist/mcp/proxy/audit.js.map +1 -0
  167. package/dist/mcp/proxy/authInterceptor.js +119 -0
  168. package/dist/mcp/proxy/authInterceptor.js.map +1 -0
  169. package/dist/mcp/proxy/expand.js +93 -0
  170. package/dist/mcp/proxy/expand.js.map +1 -0
  171. package/dist/mcp/proxy/inject.js +412 -0
  172. package/dist/mcp/proxy/inject.js.map +1 -0
  173. package/dist/mcp/proxy/intercept.js +63 -0
  174. package/dist/mcp/proxy/intercept.js.map +1 -0
  175. package/dist/mcp/proxy/jsonrpc.js +153 -0
  176. package/dist/mcp/proxy/jsonrpc.js.map +1 -0
  177. package/dist/mcp/proxy/log.js +109 -0
  178. package/dist/mcp/proxy/log.js.map +1 -0
  179. package/dist/mcp/proxy/paths.js +57 -0
  180. package/dist/mcp/proxy/paths.js.map +1 -0
  181. package/dist/mcp/proxy/proxy.js +520 -0
  182. package/dist/mcp/proxy/proxy.js.map +1 -0
  183. package/dist/mcp/proxy/serverCheckTimer.js +75 -0
  184. package/dist/mcp/proxy/serverCheckTimer.js.map +1 -0
  185. package/dist/mcp/proxy/sessionLifecycle.js +29 -0
  186. package/dist/mcp/proxy/sessionLifecycle.js.map +1 -0
  187. package/dist/mcp/proxy/spec.js +203 -0
  188. package/dist/mcp/proxy/spec.js.map +1 -0
  189. package/dist/mcp/proxy/sse.js +77 -0
  190. package/dist/mcp/proxy/sse.js.map +1 -0
  191. package/dist/mcp/proxy/upstream.js +2 -0
  192. package/dist/mcp/proxy/upstream.js.map +1 -0
  193. package/dist/mcp/proxy/upstreamHttp.js +499 -0
  194. package/dist/mcp/proxy/upstreamHttp.js.map +1 -0
  195. package/dist/mcp/proxy/upstreamStdio.js +188 -0
  196. package/dist/mcp/proxy/upstreamStdio.js.map +1 -0
  197. package/dist/mcp/proxy/upstreams.js +143 -0
  198. package/dist/mcp/proxy/upstreams.js.map +1 -0
  199. package/dist/mcp/proxy/verifyInterceptor.js +718 -0
  200. package/dist/mcp/proxy/verifyInterceptor.js.map +1 -0
  201. package/dist/mcp/proxy/windowsCommand.js +99 -0
  202. package/dist/mcp/proxy/windowsCommand.js.map +1 -0
  203. package/dist/mcp/report/buffer.js +351 -0
  204. package/dist/mcp/report/buffer.js.map +1 -0
  205. package/dist/mcp/report/coalesce.js +165 -0
  206. package/dist/mcp/report/coalesce.js.map +1 -0
  207. package/dist/mcp/report/constants.js +51 -0
  208. package/dist/mcp/report/constants.js.map +1 -0
  209. package/dist/mcp/report/project.js +83 -0
  210. package/dist/mcp/report/project.js.map +1 -0
  211. package/dist/mcp/report/reporter.js +443 -0
  212. package/dist/mcp/report/reporter.js.map +1 -0
  213. package/dist/mcp/report/types.js +3 -0
  214. package/dist/mcp/report/types.js.map +1 -0
  215. package/dist/mcp/report/validate.js +179 -0
  216. package/dist/mcp/report/validate.js.map +1 -0
  217. package/dist/mcp/scan/args.js +228 -0
  218. package/dist/mcp/scan/args.js.map +1 -0
  219. package/dist/mcp/scan/results.js +253 -0
  220. package/dist/mcp/scan/results.js.map +1 -0
  221. package/dist/mcp/scan/types.js +40 -0
  222. package/dist/mcp/scan/types.js.map +1 -0
  223. package/dist/mcp/verify/api.js +514 -0
  224. package/dist/mcp/verify/api.js.map +1 -0
  225. package/dist/mcp/verify/backend.js +143 -0
  226. package/dist/mcp/verify/backend.js.map +1 -0
  227. package/dist/mcp/verify/cache.js +200 -0
  228. package/dist/mcp/verify/cache.js.map +1 -0
  229. package/dist/mcp/verify/contract-errors.js +198 -0
  230. package/dist/mcp/verify/contract-errors.js.map +1 -0
  231. package/dist/mcp/verify/digest.js +91 -0
  232. package/dist/mcp/verify/digest.js.map +1 -0
  233. package/dist/mcp/verify/factory.js +56 -0
  234. package/dist/mcp/verify/factory.js.map +1 -0
  235. package/dist/mcp/verify/identity.js +286 -0
  236. package/dist/mcp/verify/identity.js.map +1 -0
  237. package/dist/mcp/verify/policy-store.js +63 -0
  238. package/dist/mcp/verify/policy-store.js.map +1 -0
  239. package/dist/mcp/verify/policy.js +160 -0
  240. package/dist/mcp/verify/policy.js.map +1 -0
  241. package/dist/mcp/verify/pool.js +27 -0
  242. package/dist/mcp/verify/pool.js.map +1 -0
  243. package/dist/mcp/verify/token-refresh.js +44 -0
  244. package/dist/mcp/verify/token-refresh.js.map +1 -0
  245. package/dist/mcp/verify/token.js +67 -0
  246. package/dist/mcp/verify/token.js.map +1 -0
  247. package/dist/mcp/verify/verifier.js +1166 -0
  248. package/dist/mcp/verify/verifier.js.map +1 -0
  249. package/dist/org-gate.js +1 -1
  250. package/dist/org-gate.js.map +1 -1
  251. package/dist/org.js +146 -0
  252. package/dist/org.js.map +1 -0
  253. package/dist/project-create.js +129 -0
  254. package/dist/project-create.js.map +1 -0
  255. package/dist/prompts.js +21 -0
  256. package/dist/prompts.js.map +1 -1
  257. package/dist/re2.wasm +0 -0
  258. package/dist/status.js +61 -0
  259. package/dist/status.js.map +1 -1
  260. package/dist/uninstall.js +49 -4
  261. package/dist/uninstall.js.map +1 -1
  262. package/dist/utils.js +62 -6
  263. package/dist/utils.js.map +1 -1
  264. package/package.json +10 -3
@@ -0,0 +1,320 @@
1
+ import { chain } from '../../mcp/proxy/intercept.js';
2
+ import { createTokenSource } from '../../mcp/auth/tokenSource.js';
3
+ import { connectCommandFor, createAuthInterceptor } from '../../mcp/proxy/authInterceptor.js';
4
+ import { createAudit } from '../../mcp/proxy/audit.js';
5
+ import { createVerifyInterceptor } from '../../mcp/proxy/verifyInterceptor.js';
6
+ import { startServerCheckTimer } from '../../mcp/proxy/serverCheckTimer.js';
7
+ import { createSessionLifecycle } from '../../mcp/proxy/sessionLifecycle.js';
8
+ import { makeReportBuffer } from '../../mcp/report/buffer.js';
9
+ import { resolveReportProjectId } from '../../mcp/report/project.js';
10
+ import { McpReporter } from '../../mcp/report/reporter.js';
11
+ import { postMcpReport } from '../../mcp/verify/api.js';
12
+ import { buildVerifier } from '../../mcp/verify/factory.js';
13
+ import { reportServerIdentity } from '../../mcp/verify/identity.js';
14
+ import { verifyTokenResolver } from '../../mcp/verify/token.js';
15
+ import { isProxyInstalled } from '../../mcp/config/installed.js';
16
+ import { withSyncLock } from '../../mcp/config/lock.js';
17
+ import { checkProxyBinary } from '../../mcp/config/proxyBinary.js';
18
+ import { applySyncPlan, planSync } from '../../mcp/config/rewrite.js';
19
+ import { loggerFromEnv, parseLogLevel } from '../../mcp/proxy/log.js';
20
+ import { mcpLogsDir, PROXY_ENV_PREFIX } from '../../mcp/proxy/paths.js';
21
+ import { Proxy } from '../../mcp/proxy/proxy.js';
22
+ import { createLogger } from '../../mcp/proxy/log.js';
23
+ import { describeUpstream, resolveUpstreamSpec, UpstreamSpecError, } from '../../mcp/proxy/spec.js';
24
+ import { expandedSpecOf, resolveNamedUpstream, specOf, UnknownUpstreamError, } from '../../mcp/proxy/upstreams.js';
25
+ /** Exit code for a usage error, distinct from an upstream that died. */
26
+ export const EXIT_USAGE = 2;
27
+ export async function runMcpProxyCommand(options, runtime) {
28
+ // TWO specs, and they are not interchangeable.
29
+ //
30
+ // `spec` is what the upstream is reached with: expanded, because the child
31
+ // needs the value the originating client would have given it.
32
+ //
33
+ // `identitySpec` is the entry as stored: NOT expanded, because
34
+ // `upstreamServerId` hashes `command` + `args` (or the url), and that hash
35
+ // keys the verdict cache and the user's own `allow`/`deny` overrides —
36
+ // which `vibedefend allow|deny|status` compute from the stored entry.
37
+ // Deriving it from the expanded spec makes a `deny` stop applying the
38
+ // moment a reference appears in `args`, silently. Measured, not feared:
39
+ // see the conformance test that pins it.
40
+ let spec;
41
+ let identitySpec;
42
+ // The client whose config this server was read from; the agent's own
43
+ // `clientInfo` wins when it names itself.
44
+ let fallbackClientName;
45
+ // Variable references the originating client would have resolved. Names
46
+ // only — these are logged, and one of them is an API key.
47
+ let expansion = { resolved: [], missing: [] };
48
+ try {
49
+ // `--name` is the shape `vibedefend install` writes into a client config,
50
+ // so it wins over anything else on the command line.
51
+ if (options.name) {
52
+ const { entry } = resolveNamedUpstream(options.name, runtime.env);
53
+ // Expanded HERE, at the moment of use — `upstreams.json` keeps the
54
+ // reference, never the value. See `expand.ts`.
55
+ const expanded = expandedSpecOf(entry, runtime.env);
56
+ spec = expanded.value;
57
+ identitySpec = specOf(entry);
58
+ fallbackClientName = entry.source?.client;
59
+ expansion = { resolved: expanded.resolved, missing: expanded.missing };
60
+ }
61
+ else {
62
+ spec = resolveUpstreamSpec(options);
63
+ // Nothing was expanded, so the two are the same object.
64
+ identitySpec = spec;
65
+ }
66
+ }
67
+ catch (error) {
68
+ if (error instanceof UpstreamSpecError || error instanceof UnknownUpstreamError) {
69
+ runtime.stderr.write(`vibedefend mcp: ${error.message}\n`);
70
+ return EXIT_USAGE;
71
+ }
72
+ throw error;
73
+ }
74
+ const level = options.logLevel
75
+ ? parseLogLevel(options.logLevel)
76
+ : parseLogLevel(runtime.env[`${PROXY_ENV_PREFIX}LOG_LEVEL`]);
77
+ const logger = options.logLevel
78
+ ? createLogger({
79
+ level,
80
+ dir: mcpLogsDir(runtime.env),
81
+ base: { pid: process.pid, upstream: describeUpstream(spec) },
82
+ mirrorToStderr: runtime.env[`${PROXY_ENV_PREFIX}LOG_STDERR`] === '1',
83
+ })
84
+ : loggerFromEnv({ pid: process.pid, upstream: describeUpstream(spec) }, runtime.env);
85
+ // Names only, never values — this line is the one that would have made the
86
+ // signoz 401 a ten-second diagnosis instead of a dogfooding session.
87
+ if (expansion.resolved.length > 0 || expansion.missing.length > 0) {
88
+ logger.info('expanded variable references from the client entry', {
89
+ resolved: expansion.resolved,
90
+ resolvedCount: expansion.resolved.length,
91
+ missing: expansion.missing,
92
+ });
93
+ }
94
+ for (const name of expansion.missing) {
95
+ logger.warn('a variable referenced by this server is not set and has no default; ' +
96
+ 'the literal text is passed through, exactly as the client would', { variable: name });
97
+ }
98
+ const built = buildInterceptor(spec, identitySpec, options.name, logger, runtime, fallbackClientName);
99
+ const backgroundSyncOff = runtime.env[`${PROXY_ENV_PREFIX}NO_SYNC`] === '1';
100
+ const proxy = new Proxy({
101
+ spec,
102
+ logger,
103
+ interceptor: built.interceptor,
104
+ stdin: runtime.stdin,
105
+ stdout: runtime.stdout,
106
+ stderr: runtime.stderr,
107
+ proxyVersion: runtime.version,
108
+ // Only an http upstream can carry a bearer. The source reads nothing until
109
+ // the server answers 401, so a server that wants no token never causes a
110
+ // credential-store lookup at all.
111
+ auth: spec.transport === 'http'
112
+ ? createTokenSource(spec.url, {
113
+ onLookup: (outcome) => logger.info('credential lookup', { outcome }),
114
+ })
115
+ : undefined,
116
+ afterInitialize: backgroundSyncOff && !built.lifecycle
117
+ ? undefined
118
+ : async (client) => {
119
+ built.lifecycle?.start(client);
120
+ if (!backgroundSyncOff)
121
+ await backgroundSync(options, runtime, logger);
122
+ },
123
+ onExit: built.lifecycle ? () => built.lifecycle?.stop() : undefined,
124
+ agentInitializeDeadlineMs: positiveMs(runtime.env[`${PROXY_ENV_PREFIX}INIT_DEADLINE_MS`]),
125
+ upstreamInitializeTimeoutMs: positiveMs(runtime.env[`${PROXY_ENV_PREFIX}UPSTREAM_INIT_TIMEOUT_MS`]),
126
+ });
127
+ const register = runtime.onSignal ?? ((handler) => {
128
+ process.on('SIGINT', () => handler('SIGINT'));
129
+ process.on('SIGTERM', () => handler('SIGTERM'));
130
+ });
131
+ register((signal) => {
132
+ logger.info('received a signal', { signal });
133
+ proxy.shutdown(0);
134
+ });
135
+ return proxy.run();
136
+ }
137
+ /** An override is honoured only when it is a positive number of milliseconds. */
138
+ function positiveMs(value) {
139
+ if (!value)
140
+ return undefined;
141
+ const parsed = Number(value);
142
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;
143
+ }
144
+ /**
145
+ * May this proxy rewrite the clients' configs?
146
+ *
147
+ * Only when all three hold: it was spawned from a wrapped entry (`--name`,
148
+ * not an ad hoc `--upstream` typed by a human), the user explicitly installed
149
+ * the proxy (the `installed` marker), and the binary running is the one
150
+ * `vibedefend` resolves to on the PATH — so the entries it would write point
151
+ * at itself. A checkout's `node dist/index.js` fails the third, whatever the
152
+ * marker says: measured on 2026-09-08, it wrapped twelve real servers behind
153
+ * a global release that had no `mcp` command.
154
+ */
155
+ function backgroundSyncPermission(options, runtime) {
156
+ if (!options.name)
157
+ return 'ad-hoc';
158
+ if (!isProxyInstalled(runtime.env))
159
+ return 'not-installed';
160
+ const check = checkProxyBinary({ env: runtime.env, argv1: runtime.argv1 ?? process.argv[1] });
161
+ if (!check.matches)
162
+ return check.reason ?? 'different-binary';
163
+ return 'granted';
164
+ }
165
+ /**
166
+ * The background `sync` the plan asks the proxy to run at startup.
167
+ *
168
+ * It exists so that a server added with `claude mcp add` mid-week ends up
169
+ * behind the proxy without anyone remembering a command. Three things make it
170
+ * safe to run from here:
171
+ *
172
+ * - the permission above, checked first and logged when refused;
173
+ * - the lock. One proxy runs per MCP server, so five of them start within
174
+ * the same second and would otherwise all rewrite `~/.claude.json` at
175
+ * once; whoever gets the lock does the work and the rest do nothing.
176
+ * - no backup. A timestamped copy per session, per server, would fill the
177
+ * user's home with files nobody asked for. The originals are in
178
+ * `upstreams.json`, which is what `uninstall` restores from anyway.
179
+ *
180
+ * Every failure is logged and swallowed: an MCP session must not end because
181
+ * a config file could not be rewritten.
182
+ */
183
+ async function backgroundSync(options, runtime, logger) {
184
+ const env = runtime.env;
185
+ const permission = backgroundSyncPermission(options, runtime);
186
+ if (permission !== 'granted') {
187
+ // An ad hoc launch is routine; the other two mean an installed proxy that
188
+ // cannot do its job, which somebody reading the log should see.
189
+ logger[permission === 'ad-hoc' ? 'debug' : 'info']('background sync skipped', {
190
+ reason: permission,
191
+ });
192
+ return;
193
+ }
194
+ const ran = await withSyncLock(() => {
195
+ const plan = planSync({ env });
196
+ const result = applySyncPlan(plan, { env, backup: false });
197
+ return { plan, result };
198
+ }, { env });
199
+ if (!ran) {
200
+ logger.debug('background sync skipped: another process holds the lock');
201
+ return;
202
+ }
203
+ const wrapped = ran.plan.changes.filter((change) => change.kind === 'wrap').length;
204
+ const forgotten = ran.plan.changes.filter((change) => change.kind === 'forget').length;
205
+ if (wrapped === 0 && forgotten === 0 && ran.result.failed.length === 0) {
206
+ logger.debug('background sync: nothing to do');
207
+ return;
208
+ }
209
+ logger.info('background sync', {
210
+ wrapped,
211
+ forgotten,
212
+ failed: ran.result.failed.length,
213
+ files: ran.result.written,
214
+ });
215
+ }
216
+ /**
217
+ * The interceptors, in the order they see a message.
218
+ *
219
+ * Auth first: an http upstream that refuses every token gets `initialize`
220
+ * answered by the proxy and a tool list reduced to
221
+ * `vibedefend_connect_required`, and verification has nothing to say about a
222
+ * list the proxy wrote itself. It is wired whatever `VIBEDEFEND_MCP_NO_VERIFY`
223
+ * says, because it is not verification: it is section 0's rule that
224
+ * `initialize` is always answered.
225
+ */
226
+ function buildInterceptor(spec, identitySpec, name, logger, runtime, fallbackClientName) {
227
+ const interceptors = [];
228
+ if (spec.transport === 'http') {
229
+ interceptors.push(createAuthInterceptor({
230
+ // Displayed, so the stored form: an expanded url would print the
231
+ // value of the reference into the agent's context.
232
+ serverName: name ?? describeUpstream(identitySpec),
233
+ connectCommand: connectCommandFor({ name, spec: identitySpec }),
234
+ proxyVersion: runtime.version,
235
+ logger,
236
+ }));
237
+ }
238
+ const verify = buildVerifyInterceptor(identitySpec, name, logger, runtime, fallbackClientName);
239
+ if (verify)
240
+ interceptors.push(verify.interceptor);
241
+ const lifecycle = verify?.lifecycle;
242
+ if (interceptors.length === 0)
243
+ return { lifecycle };
244
+ return {
245
+ interceptor: interceptors.length === 1 ? interceptors[0] : chain(interceptors),
246
+ lifecycle,
247
+ };
248
+ }
249
+ /**
250
+ * The verification seam, wired to the local cache and to the CybeDefend
251
+ * backend — through `buildVerifier`, the same wiring `vibedefend scan` uses,
252
+ * so what one buys the other finds.
253
+ *
254
+ * `VIBEDEFEND_MCP_NO_VERIFY=1` takes it out entirely, which is what the
255
+ * Phase 1 conformance suite runs with: those tests assert that the proxy is
256
+ * indistinguishable from the server, and a `vibedefend_alert` appended to a
257
+ * tool list is, correctly, a difference.
258
+ */
259
+ function buildVerifyInterceptor(spec, name, logger, runtime, fallbackClientName) {
260
+ if (runtime.env[`${PROXY_ENV_PREFIX}NO_VERIFY`] === '1') {
261
+ logger.info('verification disabled by the environment');
262
+ return undefined;
263
+ }
264
+ // No credential means no backend call, and the cache alone decides. That
265
+ // is a supported state, not a degraded one: a machine with a blacklisted
266
+ // server in its cache still refuses it. No network here: an organization
267
+ // that is not persisted yet is resolved at the first verification, after
268
+ // `initialize` has been answered (section 0).
269
+ const { verifier, serverId, serverName, backend } = buildVerifier(spec, name ?? describeUpstream(spec), logger, runtime.env);
270
+ logger.info('verification enabled', {
271
+ serverId,
272
+ backend: backend !== null,
273
+ organization: backend?.organizationId ? 'persisted' : backend ? 'resolved-at-first-call' : 'none',
274
+ });
275
+ const env = runtime.env;
276
+ // What a report says of this server: a host, a package or a label, and a
277
+ // key. A URL that does not canonicalise gives no identity and no report.
278
+ const identity = reportServerIdentity(spec, name);
279
+ const reporter = identity
280
+ ? new McpReporter({
281
+ identity,
282
+ vibedefendVersion: runtime.version,
283
+ fallbackClientName,
284
+ snapshot: () => verifier.inventorySnapshot(),
285
+ backendContext: () => verifier.backendContext(),
286
+ projectId: (clientName) => resolveReportProjectId({ env, clientName }),
287
+ buffer: makeReportBuffer({ env }),
288
+ post: (ctx, body) => postMcpReport(ctx, body, { resolveTokenFn: verifyTokenResolver({ env }) }),
289
+ logger,
290
+ firstDelayMs: positiveMs(env[`${PROXY_ENV_PREFIX}REPORT_DELAY_MS`]),
291
+ minIntervalMs: positiveMs(env[`${PROXY_ENV_PREFIX}REPORT_MIN_INTERVAL_MS`]),
292
+ })
293
+ : undefined;
294
+ const verify = createVerifyInterceptor({
295
+ verifier,
296
+ logger,
297
+ spec,
298
+ serverId,
299
+ serverName,
300
+ // Sizes and rule names, never arguments and never results: the plan's
301
+ // rule is that nothing from a `tools/call` leaves the machine, and a file
302
+ // quoting them would be a second copy of everything the user has done.
303
+ audit: createAudit({ env }),
304
+ report: reporter,
305
+ });
306
+ return {
307
+ interceptor: verify,
308
+ lifecycle: createSessionLifecycle({
309
+ reporter,
310
+ refreshServerGate: () => verify.refreshServerGate(),
311
+ startTimer: (onChange) => startServerCheckTimer({
312
+ verifier,
313
+ logger,
314
+ intervalMs: positiveMs(env[`${PROXY_ENV_PREFIX}SERVER_CHECK_INTERVAL_MS`]),
315
+ onChange,
316
+ }),
317
+ }),
318
+ };
319
+ }
320
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../../src/commands/mcp/proxy.ts"],"names":[],"mappings":"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"}