@wrongstack/mcp 0.297.0 → 0.298.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 (41) hide show
  1. package/dist/client-protocol-helpers.d.ts +6 -0
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.js +184 -26
  4. package/dist/manage.d.ts +15 -0
  5. package/dist/server.d.ts +33 -0
  6. package/package.json +4 -3
  7. package/dist/authorization-manager.d.ts.map +0 -1
  8. package/dist/authorization.d.ts.map +0 -1
  9. package/dist/client-process.d.ts.map +0 -1
  10. package/dist/client-protocol-helpers.d.ts.map +0 -1
  11. package/dist/client.d.ts.map +0 -1
  12. package/dist/constants.d.ts.map +0 -1
  13. package/dist/content-selection.d.ts.map +0 -1
  14. package/dist/index.d.ts.map +0 -1
  15. package/dist/index.js.map +0 -7
  16. package/dist/manage.d.ts.map +0 -1
  17. package/dist/manifest-cache.d.ts.map +0 -1
  18. package/dist/operations.d.ts.map +0 -1
  19. package/dist/protocol.d.ts.map +0 -1
  20. package/dist/read-body.d.ts.map +0 -1
  21. package/dist/registry-authorization.d.ts.map +0 -1
  22. package/dist/registry-catalog.d.ts.map +0 -1
  23. package/dist/registry-disconnect.d.ts.map +0 -1
  24. package/dist/registry-health.d.ts.map +0 -1
  25. package/dist/registry-operations.d.ts.map +0 -1
  26. package/dist/registry-reconnect.d.ts.map +0 -1
  27. package/dist/registry-slots.d.ts.map +0 -1
  28. package/dist/registry-types.d.ts.map +0 -1
  29. package/dist/registry.d.ts.map +0 -1
  30. package/dist/server.d.ts.map +0 -1
  31. package/dist/sse-reader.d.ts.map +0 -1
  32. package/dist/test-helpers/mock-server.d.ts.map +0 -1
  33. package/dist/token-store.d.ts.map +0 -1
  34. package/dist/tool-schema.d.ts.map +0 -1
  35. package/dist/transport-base.d.ts.map +0 -1
  36. package/dist/transport-jsonrpc.d.ts.map +0 -1
  37. package/dist/transport-security.d.ts.map +0 -1
  38. package/dist/transport-sse.d.ts.map +0 -1
  39. package/dist/transport-streamable.d.ts.map +0 -1
  40. package/dist/transport.d.ts.map +0 -1
  41. package/dist/wrap-tool.d.ts.map +0 -1
@@ -3,6 +3,12 @@
3
3
  * Windows. Only args containing whitespace or quotes need wrapping; inside
4
4
  * double quotes cmd.exe escapes a literal `"` as `""`. Backslashes are literal
5
5
  * inside cmd quotes, so paths like `C:\Program Files\x` pass through unharmed.
6
+ *
7
+ * @deprecated Unsafe for spawning. An argument with no whitespace is returned
8
+ * verbatim, so `--flag=x&calc.exe` reaches `cmd.exe` unquoted and `&` separates
9
+ * commands. Retained only for API compatibility; the stdio MCP transport now
10
+ * uses `buildWin32CmdShimInvocation` from `@wrongstack/core/utils`, which quotes
11
+ * every token and refuses metacharacters outright (CMDI-005).
6
12
  */
7
13
  export declare function quoteWindowsArg(arg: string): string;
8
14
  export declare function validateProtocolString(value: unknown, label: string, allowEmpty?: boolean): asserts value is string;
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export { type MCPAuthorizationCompleteInput, MCPAuthorizationManager, type MCPAu
3
3
  export { type ConnectionState, MCPClient, type MCPClientOptions, type MCPListChangedListener, type MCPPageOptions, type MCPRequestOptions, type MCPTool, type ToolCallResult, type Transport, } from './client.js';
4
4
  export { MCP_CONSTANTS } from './constants.js';
5
5
  export { DEFAULT_MCP_INSERTION_MAX_BYTES, DEFAULT_MCP_RESOURCE_SCHEMES, type MCPContentProvenance, type MCPInsertionPolicy, type MCPPromptInsertion, type MCPResourceInsertion, preparePromptInsertion, prepareResourceInsertion, } from './content-selection.js';
6
- export { addMcp, disableMcp, discoverMcp, enableMcp, listMcp, type McpManageDeps, type McpOpResult, type McpServerInfo, type McpServerInput, removeMcp, restartMcp, updateMcp, } from './manage.js';
6
+ export { addMcp, disableMcp, discoverMcp, enableMcp, listMcp, MCP_ENV_MASK, type McpManageDeps, type McpOpResult, type McpServerInfo, type McpServerInput, removeMcp, restartMcp, updateMcp, } from './manage.js';
7
7
  export { type MCPCapabilityManifest, manifestConfigHash, readCapabilityManifest, readManifest, writeCapabilityManifest, writeManifest, } from './manifest-cache.js';
8
8
  export { MCP_OPERATION_LIMITS, type MCPFailureKind, type MCPHealthState, type MCPLatencySummary, type MCPOperationEvent, type MCPOperationKind, type MCPServerOperationalHealth, } from './operations.js';
9
9
  export { type MCPGetPromptResult, type MCPImplementationInfo, type MCPListPromptsResult, type MCPListResourcesResult, type MCPListResourceTemplatesResult, type MCPPrompt, type MCPPromptArgument, type MCPPromptMessage, type MCPReadResourceResult, type MCPResource, type MCPResourceContents, type MCPResourceTemplate, type MCPServerCapabilities, type MCPServerMetadata, parseGetPromptResult, parseListPromptsResult, parseListResourcesResult, parseListResourceTemplatesResult, parseReadResourceResult, parseServerMetadata, } from './protocol.js';
package/dist/index.js CHANGED
@@ -739,7 +739,7 @@ function boundedServerName(value) {
739
739
 
740
740
  // src/client.ts
741
741
  import { spawn as spawn2 } from "node:child_process";
742
- import { buildChildEnv, toErrorMessage } from "@wrongstack/core/utils";
742
+ import { buildChildEnv, buildWin32CmdShimInvocation, toErrorMessage } from "@wrongstack/core/utils";
743
743
 
744
744
  // src/constants.ts
745
745
  var MCP_CONSTANTS = Object.freeze({
@@ -1182,6 +1182,7 @@ function validateTransportUrl(rawUrl) {
1182
1182
  }
1183
1183
 
1184
1184
  // src/transport-base.ts
1185
+ var MAX_TRANSPORT_REDIRECTS = 5;
1185
1186
  function makeAbortError(method) {
1186
1187
  const err = new Error(`MCP request "${method}" aborted by client`);
1187
1188
  err.name = "AbortError";
@@ -1275,7 +1276,28 @@ var BaseHTTPTransport = class {
1275
1276
  authorizationHeaderForToken(token, this.authorizationResource)
1276
1277
  );
1277
1278
  }
1278
- return fetch(input, { ...init, headers });
1279
+ let currentUrl = typeof input === "string" ? input : String(input);
1280
+ let hopHeaders = headers;
1281
+ for (let hop = 0; hop < MAX_TRANSPORT_REDIRECTS; hop++) {
1282
+ const res = await fetch(currentUrl, { ...init, headers: hopHeaders, redirect: "manual" });
1283
+ if (res.status !== 301 && res.status !== 302 && res.status !== 303 && res.status !== 307 && res.status !== 308) {
1284
+ return res;
1285
+ }
1286
+ const location = res.headers.get("location");
1287
+ if (!location) return res;
1288
+ const nextUrl = new URL(location, currentUrl).toString();
1289
+ validateTransportUrl(nextUrl);
1290
+ if (new URL(nextUrl).origin !== new URL(currentUrl).origin) {
1291
+ hopHeaders = new Headers(hopHeaders);
1292
+ hopHeaders.delete("Authorization");
1293
+ }
1294
+ await res.body?.cancel().catch(() => void 0);
1295
+ currentUrl = nextUrl;
1296
+ }
1297
+ throw new ConfigError2({
1298
+ message: `MCP server "${this.name}" exceeded ${MAX_TRANSPORT_REDIRECTS} redirects.`,
1299
+ code: "CONFIG_INVALID"
1300
+ });
1279
1301
  };
1280
1302
  let response = await send();
1281
1303
  if (response.status !== 401 || !this.authorizationProvider?.handleUnauthorized) {
@@ -2019,10 +2041,6 @@ var StreamableHTTPTransport = class extends BaseHTTPTransport {
2019
2041
  };
2020
2042
 
2021
2043
  // src/client-protocol-helpers.ts
2022
- function quoteWindowsArg(arg) {
2023
- if (!/[\s"]/.test(arg)) return arg;
2024
- return `"${arg.replace(/"/g, '""')}"`;
2025
- }
2026
2044
  var MAX_PROTOCOL_INPUT_CHARS = 8192;
2027
2045
  function validateProtocolString(value, label, allowEmpty = false) {
2028
2046
  if (typeof value !== "string" || !allowEmpty && value.length === 0) {
@@ -2188,14 +2206,17 @@ var MCPClient = class _MCPClient {
2188
2206
  const rawArgs = this.opts.args ?? [];
2189
2207
  const spawnEnv = buildChildEnv({ extra: extraEnv });
2190
2208
  const stdio = ["pipe", "pipe", "pipe"];
2191
- const child = isWin ? spawn2([this.opts.command, ...rawArgs].map(quoteWindowsArg).join(" "), {
2192
- env: spawnEnv,
2193
- stdio,
2194
- shell: true,
2195
- // Without this every MCP server spawned from a console-less host
2196
- // (WebUI server, scheduled runs) opens a visible console window.
2197
- windowsHide: true
2198
- }) : spawn2(this.opts.command, rawArgs, { env: spawnEnv, stdio, windowsHide: true });
2209
+ const child = isWin ? (() => {
2210
+ const shim = buildWin32CmdShimInvocation(this.opts.command, rawArgs);
2211
+ return spawn2(shim.command, shim.args, {
2212
+ env: spawnEnv,
2213
+ stdio,
2214
+ windowsVerbatimArguments: shim.windowsVerbatimArguments,
2215
+ // Without this every MCP server spawned from a console-less host
2216
+ // (WebUI server, scheduled runs) opens a visible console window.
2217
+ windowsHide: true
2218
+ });
2219
+ })() : spawn2(this.opts.command, rawArgs, { env: spawnEnv, stdio, windowsHide: true });
2199
2220
  this.child = child;
2200
2221
  child.stdout?.on("data", (chunk) => this.onData(chunk.toString()));
2201
2222
  child.stderr?.on("data", () => {
@@ -2472,6 +2493,10 @@ var MCPClient = class _MCPClient {
2472
2493
  new Promise((resolve) => setTimeout(resolve, FORCE_TIMEOUT_MS))
2473
2494
  ]);
2474
2495
  }
2496
+ child.stdout?.removeAllListeners();
2497
+ child.stderr?.removeAllListeners();
2498
+ child.removeAllListeners();
2499
+ this.child = void 0;
2475
2500
  }
2476
2501
  this.failPending(`MCP "${this.opts.name}" closed`);
2477
2502
  this.sseTransport?.close();
@@ -2932,6 +2957,26 @@ function normalizeTransport(t) {
2932
2957
  if (t === "http" || t === "streamable-http") return "streamable-http";
2933
2958
  return "stdio";
2934
2959
  }
2960
+ var MCP_ENV_MASK = "__wrongstack_unchanged__";
2961
+ function unmaskEnv(env, base) {
2962
+ if (env === void 0) return void 0;
2963
+ let changed = false;
2964
+ const out = {};
2965
+ for (const [key, value] of Object.entries(env)) {
2966
+ if (value === MCP_ENV_MASK) {
2967
+ const stored = base?.[key];
2968
+ if (stored === void 0) {
2969
+ changed = true;
2970
+ continue;
2971
+ }
2972
+ out[key] = stored;
2973
+ changed = true;
2974
+ continue;
2975
+ }
2976
+ out[key] = value;
2977
+ }
2978
+ return changed ? out : env;
2979
+ }
2935
2980
  function buildConfig(input, base) {
2936
2981
  const cfg = {
2937
2982
  name: input.name,
@@ -2943,7 +2988,7 @@ function buildConfig(input, base) {
2943
2988
  if (command !== void 0) cfg.command = command;
2944
2989
  const args = input.args ?? base?.args;
2945
2990
  if (args !== void 0) cfg.args = args;
2946
- const env = input.env ?? base?.env;
2991
+ const env = unmaskEnv(input.env ?? base?.env, base?.env);
2947
2992
  if (env !== void 0) cfg.env = env;
2948
2993
  const url = input.url ?? base?.url;
2949
2994
  if (url !== void 0) cfg.url = url;
@@ -4418,11 +4463,13 @@ var MCPRegistry = class _MCPRegistry {
4418
4463
  };
4419
4464
 
4420
4465
  // src/server.ts
4466
+ import { timingSafeEqual as timingSafeEqual2 } from "node:crypto";
4421
4467
  import { createServer } from "node:http";
4422
- import { expectDefined as expectDefined2, toErrorMessage as toErrorMessage2 } from "@wrongstack/core/utils";
4468
+ import { expectDefined as expectDefined2, toErrorMessage as toErrorMessage2, validateAgainstSchema } from "@wrongstack/core/utils";
4423
4469
  var PARSE_ERROR = -32700;
4424
4470
  var INVALID_REQUEST = -32600;
4425
4471
  var METHOD_NOT_FOUND = -32601;
4472
+ var INVALID_PARAMS = -32602;
4426
4473
  var INTERNAL_ERROR = -32603;
4427
4474
  var MCPServer = class {
4428
4475
  host;
@@ -4475,7 +4522,8 @@ var MCPServer = class {
4475
4522
  } catch (err) {
4476
4523
  const message = toErrorMessage2(err);
4477
4524
  this.logger?.warn?.(`MCP server: method "${msg.method}" threw: ${message}`);
4478
- return this.encodeError(expectDefined2(msg.id), INTERNAL_ERROR, message);
4525
+ const code = err instanceof InvalidToolArgumentsError ? INVALID_PARAMS : INTERNAL_ERROR;
4526
+ return this.encodeError(expectDefined2(msg.id), code, message);
4479
4527
  }
4480
4528
  }
4481
4529
  async dispatch(method, params) {
@@ -4502,6 +4550,7 @@ var MCPServer = class {
4502
4550
  throw new Error('tools/call requires a string "name"');
4503
4551
  }
4504
4552
  const args = p.arguments && typeof p.arguments === "object" && !Array.isArray(p.arguments) ? p.arguments : {};
4553
+ await this.assertArgumentsMatchSchema(p.name, args);
4505
4554
  const res = await this.host.callTool(p.name, args);
4506
4555
  return { content: toContentBlocks(res.content), isError: res.isError };
4507
4556
  }
@@ -4557,10 +4606,56 @@ var MCPServer = class {
4557
4606
  return METHOD_NOT_FOUND_SENTINEL;
4558
4607
  }
4559
4608
  }
4609
+ /**
4610
+ * WS-026: enforce the `inputSchema` this server advertises on `tools/list`.
4611
+ *
4612
+ * `tools/call` used to forward `params.arguments` to the host verbatim after
4613
+ * checking only that it was a non-array object — so every `enum`, `required`,
4614
+ * `additionalProperties: false`, and numeric bound in the published schema
4615
+ * was advisory. A client (or an attacker who reached the transport) could
4616
+ * send `{mode: "../../etc"}` to a tool whose schema declares
4617
+ * `enum: ["read","write"]` and the tool would receive it. Publishing a
4618
+ * contract and not enforcing it is worse than publishing none: downstream
4619
+ * tools are written against the schema they declared.
4620
+ *
4621
+ * SCOPE: `validateAgainstSchema` is the shared validator that also gates the
4622
+ * agent's own tool executor. It checks `type`, `enum`, and `required`, and
4623
+ * recurses through `properties`/`items` — it does NOT check
4624
+ * `additionalProperties: false`, numeric bounds, or string lengths. So those
4625
+ * keywords stay advisory here. Teaching the shared validator about them
4626
+ * would change what the agent accepts on every tool call in the product,
4627
+ * which is a deliberate decision that does not belong inside a transport
4628
+ * fix; it is tracked separately.
4629
+ *
4630
+ * Unknown tool names are left alone — the host owns that error, and
4631
+ * answering "no such tool" here would fork the message for no benefit.
4632
+ */
4633
+ async assertArgumentsMatchSchema(name, args) {
4634
+ let tools;
4635
+ try {
4636
+ tools = await this.host.listTools();
4637
+ } catch {
4638
+ return;
4639
+ }
4640
+ const schema = tools.find((tool) => tool.name === name)?.inputSchema;
4641
+ if (!schema || typeof schema !== "object") return;
4642
+ const result = validateAgainstSchema(
4643
+ args,
4644
+ schema
4645
+ );
4646
+ if (result.ok) return;
4647
+ const detail = result.errors.slice(0, MAX_REPORTED_SCHEMA_ERRORS).map((error) => `${error.path || "(root)"}: ${error.message}`).join("; ");
4648
+ const more = result.errors.length > MAX_REPORTED_SCHEMA_ERRORS ? ` (+${result.errors.length - MAX_REPORTED_SCHEMA_ERRORS} more)` : "";
4649
+ throw new InvalidToolArgumentsError(`invalid arguments for tool "${name}" \u2014 ${detail}${more}`);
4650
+ }
4560
4651
  encodeError(id, code, message) {
4561
4652
  return JSON.stringify({ jsonrpc: "2.0", id, error: { code, message } });
4562
4653
  }
4563
4654
  };
4655
+ var MAX_REPORTED_SCHEMA_ERRORS = 5;
4656
+ var InvalidToolArgumentsError = class extends Error {
4657
+ name = "InvalidToolArgumentsError";
4658
+ };
4564
4659
  var SERVER_PAGE_SIZE = 100;
4565
4660
  function paginate(items, params) {
4566
4661
  const cursor = paramsRecord(params)["cursor"];
@@ -4742,7 +4837,7 @@ function serveHttp(server, opts = {}) {
4742
4837
  );
4743
4838
  }
4744
4839
  const httpServer = createServer((req, res) => {
4745
- void handleHttpRequest(server, req, res, token, log);
4840
+ void handleHttpRequest(server, req, res, token, log, host);
4746
4841
  });
4747
4842
  return new Promise((resolve, reject) => {
4748
4843
  httpServer.once("error", reject);
@@ -4761,23 +4856,37 @@ function serveHttp(server, opts = {}) {
4761
4856
  });
4762
4857
  });
4763
4858
  }
4764
- async function handleHttpRequest(server, req, res, token, log) {
4859
+ async function handleHttpRequest(server, req, res, token, log, boundHost) {
4765
4860
  const send = (status, body2, type = "application/json") => {
4766
- res.writeHead(status, { "content-type": type });
4861
+ res.writeHead(status, {
4862
+ "content-type": type,
4863
+ // This endpoint executes tools. Nothing about it should be embedded,
4864
+ // sniffed into another type, or leak its URL onward.
4865
+ "x-content-type-options": "nosniff",
4866
+ "x-frame-options": "DENY",
4867
+ "referrer-policy": "no-referrer"
4868
+ // No CORS headers are ever emitted: a cross-origin reader must not be
4869
+ // able to see a response even if it manages to send the request.
4870
+ });
4767
4871
  res.end(body2);
4768
4872
  };
4873
+ if (!originIsAcceptable(req, boundHost)) {
4874
+ return send(403, JSON.stringify({ error: "cross-origin forbidden" }));
4875
+ }
4876
+ if (!hostHeaderIsAcceptable(req, boundHost)) {
4877
+ return send(403, JSON.stringify({ error: "untrusted host header" }));
4878
+ }
4879
+ if (token && !bearerTokenMatches(req.headers.authorization, token)) {
4880
+ return send(401, JSON.stringify({ error: "unauthorized" }));
4881
+ }
4769
4882
  if (req.method === "GET") {
4770
4883
  return send(200, JSON.stringify({ status: "ok", server: "wrongstack-mcp" }));
4771
4884
  }
4772
4885
  if (req.method !== "POST") {
4773
4886
  return send(405, JSON.stringify({ error: "method not allowed" }));
4774
4887
  }
4775
- if (token) {
4776
- const auth = req.headers.authorization ?? "";
4777
- const expected = `Bearer ${token}`;
4778
- if (auth !== expected) {
4779
- return send(401, JSON.stringify({ error: "unauthorized" }));
4780
- }
4888
+ if (!isJsonContentType(req.headers["content-type"])) {
4889
+ return send(415, JSON.stringify({ error: "content-type must be application/json" }));
4781
4890
  }
4782
4891
  let body = "";
4783
4892
  req.on("data", (chunk) => {
@@ -4797,6 +4906,54 @@ async function handleHttpRequest(server, req, res, token, log) {
4797
4906
  });
4798
4907
  });
4799
4908
  }
4909
+ function isLoopbackHostname(hostname) {
4910
+ const bare = hostname.toLowerCase().replace(/^\[(.*)\]$/, "$1");
4911
+ return bare === "localhost" || bare === "::1" || bare === "127.0.0.1" || bare.startsWith("127.");
4912
+ }
4913
+ function originIsAcceptable(req, boundHost) {
4914
+ const origin = req.headers.origin;
4915
+ if (origin === void 0 || origin === "null") return origin === void 0;
4916
+ let parsed;
4917
+ try {
4918
+ parsed = new URL(origin);
4919
+ } catch {
4920
+ return false;
4921
+ }
4922
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") return false;
4923
+ const rawHost = req.headers.host?.trim();
4924
+ if (!rawHost) return false;
4925
+ try {
4926
+ const requestAuthority = new URL(`${parsed.protocol}//${rawHost}`).host.toLowerCase();
4927
+ if (parsed.host.toLowerCase() !== requestAuthority) return false;
4928
+ } catch {
4929
+ return false;
4930
+ }
4931
+ return isLoopbackHost(boundHost) ? isLoopbackHostname(parsed.hostname) : true;
4932
+ }
4933
+ function hostHeaderIsAcceptable(req, boundHost) {
4934
+ const rawHost = req.headers.host?.trim();
4935
+ if (!rawHost) return false;
4936
+ let parsed;
4937
+ try {
4938
+ parsed = new URL(`http://${rawHost}`);
4939
+ } catch {
4940
+ return false;
4941
+ }
4942
+ if (parsed.username || parsed.password || parsed.pathname !== "/" || parsed.search) return false;
4943
+ if (isLoopbackHost(boundHost)) return isLoopbackHostname(parsed.hostname);
4944
+ return true;
4945
+ }
4946
+ function isJsonContentType(value) {
4947
+ if (!value) return false;
4948
+ const base = value.split(";")[0]?.trim().toLowerCase() ?? "";
4949
+ return base === "application/json" || base.endsWith("+json");
4950
+ }
4951
+ function bearerTokenMatches(header, token) {
4952
+ const expected = Buffer.from(`Bearer ${token}`);
4953
+ const supplied = Buffer.from(header ?? "");
4954
+ if (supplied.length !== expected.length) return false;
4955
+ return timingSafeEqual2(supplied, expected);
4956
+ }
4800
4957
 
4801
4958
  // src/token-store.ts
4802
4959
  import * as fs3 from "node:fs/promises";
@@ -5098,6 +5255,7 @@ export {
5098
5255
  MCPServer,
5099
5256
  MCPVaultTokenStore,
5100
5257
  MCP_CONSTANTS,
5258
+ MCP_ENV_MASK,
5101
5259
  MCP_OPERATION_LIMITS,
5102
5260
  SSEReader,
5103
5261
  SSETransport,
package/dist/manage.d.ts CHANGED
@@ -59,6 +59,21 @@ export interface McpManageDeps {
59
59
  /** Built-in presets (from core `allServers()`), used by name-only `add`. */
60
60
  presets?: Record<string, MCPServerConfig> | undefined;
61
61
  }
62
+ /**
63
+ * Build a clean MCPServerConfig from loose input, omitting undefined keys so
64
+ * `exactOptionalPropertyTypes` stays satisfied and we never write `null`-ish
65
+ * holes into config.json. `base` lets `update` merge onto an existing entry.
66
+ */
67
+ /**
68
+ * Placeholder a caller receives in place of a secret-bearing env value.
69
+ *
70
+ * WS-036: `mcp.list` echoed MCP server env verbatim over the WebSocket, and
71
+ * MCP env is where server credentials live (`GITHUB_TOKEN`, `*_API_KEY`, …).
72
+ * Read surfaces substitute this; sending it back means "leave that value
73
+ * alone", so the browser can still edit a server without ever having been
74
+ * given its secrets.
75
+ */
76
+ export declare const MCP_ENV_MASK = "__wrongstack_unchanged__";
62
77
  /** List all configured servers, merged with live registry status + tool names. */
63
78
  export declare function listMcp(deps: McpManageDeps): Promise<McpServerInfo[]>;
64
79
  /**
package/dist/server.d.ts CHANGED
@@ -79,8 +79,41 @@ export declare class MCPServer {
79
79
  */
80
80
  handleMessage(raw: string): Promise<string | null>;
81
81
  private dispatch;
82
+ /**
83
+ * WS-026: enforce the `inputSchema` this server advertises on `tools/list`.
84
+ *
85
+ * `tools/call` used to forward `params.arguments` to the host verbatim after
86
+ * checking only that it was a non-array object — so every `enum`, `required`,
87
+ * `additionalProperties: false`, and numeric bound in the published schema
88
+ * was advisory. A client (or an attacker who reached the transport) could
89
+ * send `{mode: "../../etc"}` to a tool whose schema declares
90
+ * `enum: ["read","write"]` and the tool would receive it. Publishing a
91
+ * contract and not enforcing it is worse than publishing none: downstream
92
+ * tools are written against the schema they declared.
93
+ *
94
+ * SCOPE: `validateAgainstSchema` is the shared validator that also gates the
95
+ * agent's own tool executor. It checks `type`, `enum`, and `required`, and
96
+ * recurses through `properties`/`items` — it does NOT check
97
+ * `additionalProperties: false`, numeric bounds, or string lengths. So those
98
+ * keywords stay advisory here. Teaching the shared validator about them
99
+ * would change what the agent accepts on every tool call in the product,
100
+ * which is a deliberate decision that does not belong inside a transport
101
+ * fix; it is tracked separately.
102
+ *
103
+ * Unknown tool names are left alone — the host owns that error, and
104
+ * answering "no such tool" here would fork the message for no benefit.
105
+ */
106
+ private assertArgumentsMatchSchema;
82
107
  private encodeError;
83
108
  }
109
+ /**
110
+ * Marks a `tools/call` rejected by {@link MCPServer.assertArgumentsMatchSchema}
111
+ * so `handleMessage` can answer with JSON-RPC `-32602 Invalid params` rather
112
+ * than the generic internal-error code every other throw maps to.
113
+ */
114
+ export declare class InvalidToolArgumentsError extends Error {
115
+ readonly name = "InvalidToolArgumentsError";
116
+ }
84
117
  /** Normalize a host result's content into MCP content blocks. */
85
118
  export declare function toContentBlocks(content: unknown): Array<{
86
119
  type: 'text';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wrongstack/mcp",
3
- "version": "0.297.0",
3
+ "version": "0.298.0",
4
4
  "license": "MIT",
5
5
  "description": "WrongStack Model Context Protocol client and registry: stdio, SSE, and streamable HTTP transports.",
6
6
  "repository": {
@@ -22,10 +22,11 @@
22
22
  }
23
23
  },
24
24
  "files": [
25
- "dist"
25
+ "dist",
26
+ "!dist/**/*.map"
26
27
  ],
27
28
  "dependencies": {
28
- "@wrongstack/core": "0.297.0"
29
+ "@wrongstack/core": "0.298.0"
29
30
  },
30
31
  "devDependencies": {
31
32
  "@types/node": "^26.1.1",
@@ -1 +0,0 @@
1
- {"version":3,"file":"authorization-manager.d.ts","sourceRoot":"","sources":["../src/authorization-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EAEpC,KAAK,uBAAuB,EAC5B,KAAK,WAAW,EAGjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,0BAA0B,EAE1B,kBAAkB,EACnB,MAAM,kBAAkB,CAAC;AAK1B,KAAK,qBAAqB,GAAG,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,gCAAgC,KACvC,OAAO,CAAC,+BAA+B,CAAC,CAAC;AAE9C,KAAK,yBAAyB,GAAG,CAAC,OAAO,EAAE,uBAAuB,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAE5F,MAAM,WAAW,8BAA8B;IAC7C,KAAK,EAAE,kBAAkB,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,EAAE,yBAAyB,GAAG,SAAS,CAAC;IACjD,GAAG,CAAC,EAAE,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;IACjC,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC3E;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IACvC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,gBAAgB,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,CAAC;IAC/D,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AASD;;;;GAIG;AACH,qBAAa,uBAAuB;IAOtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IANpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IACnE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IAEnC,YAA6B,OAAO,EAAE,8BAA8B,EAQnE;IAEK,KAAK,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAgCnF;IAEK,QAAQ,CAAC,KAAK,EAAE,6BAA6B,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAiCpF;IAEK,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAyBlF;IAEK,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAavE;IAED,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,IAAI;CASb"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../src/authorization.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-process.d.ts","sourceRoot":"","sources":["../src/client-process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAS,MAAM,oBAAoB,CAAC;AAE9D;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CA6BvD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-protocol-helpers.d.ts","sourceRoot":"","sources":["../src/client-protocol-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGnD;AAID,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,UAAU,UAAQ,GACjB,OAAO,CAAC,KAAK,IAAI,MAAM,CAOzB;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAI5F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAIrD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAEnE,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,8BAA8B,EACnC,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EAOvB,MAAM,eAAe,CAAC;AAYvB,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,iBAAiB,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7C,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,kEAAkE;IAClE,qBAAqB,CAAC,EAAE,wBAAwB,GAAG,SAAS,CAAC;IAC7D;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CACvC;AAED,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,YAAY,GACZ,WAAW,GACX,cAAc,GACd,cAAc,GACd,QAAQ;AACV,2EAA2E;GACzE,SAAS,CAAC;AAEd,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,cAAe,SAAQ,iBAAiB;IACvD,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AASD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;CAC/F;AASD,KAAK,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;AACvF,KAAK,oBAAoB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AACrE,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;AAE5D,qBAAa,SAAS;aA2CQ,IAAI,EAAE,gBAAgB;IA1ClD;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAoB;IAE/D,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,KAAK,CAAC,CAA2B;IACzC,OAAO,CAAC,MAAM,CAAK;IACnB;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAGpB;IACJ,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,MAAM,CAAiB;IAC/B,2FAA2F;IAC3F,OAAO,CAAC,eAAe,CAAC,CAAgC;IACxD,qGAAqG;IACrG,OAAO,CAAC,WAAW,CAAC,CAAwB;IAC5C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,kBAAkB,CAAS;IAEnC,OAAO,CAAC,YAAY,CAAC,CAA2B;IAChD,OAAO,CAAC,aAAa,CAAC,CAAsC;IAC5D,yFAAyF;IACzF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA2B;IACzD,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAmC;IACzE,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAqC;IAC/E,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAqC;IAC7E,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyB;IAE7D,YAA4B,IAAI,EAAE,gBAAgB,EAAI;IAEtD,QAAQ,IAAI,eAAe,CAE1B;IAED,iBAAiB,IAAI,iBAAiB,GAAG,SAAS,CAQjD;IAED,SAAS,IAAI,OAAO,EAAE,CAMrB;IAED,6EAA6E;IAC7E,gBAAgB,IAAI,OAAO,CAE1B;IAED;;;OAGG;IACH,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAE5C;IAED,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAE/C;IAED;;;OAGG;IACH,qBAAqB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAEhD;IAED,wBAAwB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI,CAEnD;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAc7B;YAEa,YAAY;YAgIZ,UAAU;YAgEV,qBAAqB;IA6D7B,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;KAAE,GAC1C,OAAO,CAAC,cAAc,CAAC,CAuBzB;IAEK,aAAa,CAAC,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAS9E;IAEK,qBAAqB,CAAC,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAS9F;IAEK,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAS5F;IAEK,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUhF;IAEK,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUlF;IAEK,WAAW,CAAC,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAG1E;IAEK,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACzC,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAgB7B;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAkD3B;IAED,OAAO,CAAC,OAAO;YA0FD,iBAAiB;IA4B/B,OAAO,CAAC,4BAA4B;IAWpC;;;;OAIG;IACH,OAAO,CAAC,WAAW;YAcL,MAAM;IAsDpB,OAAO,CAAC,MAAM;IAwBd,OAAO,CAAC,MAAM;IAiDd,OAAO,CAAC,mBAAmB;IAmB3B;;;;;OAKG;YACW,sBAAsB;IAoBpC,uBAAuB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAE5D;IAED,0BAA0B,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAE/D;IAED,2BAA2B,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAElE;IAED,8BAA8B,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAErE;IAED,yBAAyB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAEhE;IAED,4BAA4B,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAEnE;IAED,OAAO,CAAC,qBAAqB;CAW9B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa;IACxB,wDAAwD;+BACtC,YAAY;IAE9B,6DAA6D;;;;;IAM7D,2DAA2D;;QAEzD,oEAAoE;;QAEpE,sEAAsE;;QAEtE,sEAAsE;;QAEtE,qDAAqD;;QAErD,iGAAiG;;;IAInG,+CAA+C;;QAE7C,0EAA0E;;QAE1E,wDAAwD;;;IAI1D,mCAAmC;;QAEjC,qFAAqF;;QAErF,mEAAmE;;;IAIrE,0DAA0D;kCACrC,GAAG;IAExB,0CAA0C;;IAG1C,iDAAiD;8BAChC,IAAI;EACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"content-selection.d.ts","sourceRoot":"","sources":["../src/content-selection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,+BAA+B,QAAa,CAAC;AAC1D,eAAO,MAAM,4BAA4B,YACvC,MAAM,EACN,KAAK,EACL,MAAM,EACN,OAAO,EACP,KAAK,EACL,KAAK,EACL,MAAM,EACN,UAAU,CACF,CAAC;AAEX,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,KAAK,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,UAAU,GAAG,QAAQ,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CAC5C;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,oBAAoB,CAAC;IACjC,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,oBAAoB,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,qBAAqB,EAC7B,MAAM,GAAE,kBAAuB,GAC9B,oBAAoB,CAyBtB;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACxC,MAAM,EAAE,kBAAkB,EAC1B,MAAM,GAAE,kBAAuB,GAC9B,kBAAkB,CA6BpB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}