@hs-x/mcp 0.3.6 → 0.4.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 CHANGED
@@ -1,8 +1,8 @@
1
1
  # @hs-x/mcp
2
2
 
3
3
  The public HS-X MCP server, for developer-side coding agents. It exposes the
4
- same project substrate the `hs-x` CLI runs on — status, validation, the dev
5
- loop, and docs — over a transport-independent JSON-RPC handler (`callMcpTool()`)
4
+ same safe project substrate the `hs-x` CLI runs on — status, validation,
5
+ existing-session inspection, and docs — over a transport-independent JSON-RPC handler (`callMcpTool()`)
6
6
  plus a stdio entrypoint.
7
7
 
8
8
  ## Tools
@@ -11,22 +11,59 @@ plus a stdio entrypoint.
11
11
  | --- | --- |
12
12
  | `hsx.status` | Local project status, via the same substrate as `hs-x status` |
13
13
  | `hsx.check` | Runs `hs-x check` and returns structured diagnostics |
14
- | `hsx.dev.capabilities` | Lists the workers and capabilities (tools, triggers, card backends, syncs) a local project declares |
15
- | `hsx.dev.invoke` | Invokes one capability through the **production** runtime router — same validation, context, handler, and result envelope a deployed Worker runs; fixture defaults fill the payload |
16
- | `hsx.dev.invoke_last` | Replays the last recorded invocation (`.hs-x/last-invocation.json`) — the failure-replay loop |
17
- | `hsx.dev.session.start` / `.status` / `.stop` | Manages a background dev server for the project (one session per project) |
14
+ | `hsx.dev.session.status` / `.stop` | Inspects or safely stops an existing, identity-verified project dev session |
18
15
  | `hsx.dev.logs` | The merged log surface: tails the dev-session log and, when the project has a deployed app binding, folds in HubSpot app-log rows — the same timeline as `hs-x logs` |
19
- | `hsx.secrets.hubspot_oauth.set` | Stores a HubSpot app OAuth client secret for one account/project/environment/app |
16
+ | `hsx.secrets.hubspot_oauth.set` | Stores a HubSpot app OAuth client secret for one account/project/environment/app after explicit `confirm: true` |
20
17
  | `hsx.docs.search` / `hsx.docs.fetch` | Searches the HS-X docs and fetches a page as clean markdown |
21
18
 
22
19
  Most tools take a `root` argument pointing at the local project directory.
23
20
 
21
+ Every advertised input schema is closed at the top level
22
+ (`additionalProperties: false`). Required values and stable bounds are declared
23
+ in `tools/list` and enforced by the dispatcher before a tool performs project,
24
+ process, filesystem, or network work.
25
+
26
+ For `tools/call`, malformed JSON-RPC envelopes and unknown tool names remain
27
+ JSON-RPC errors. Once a known tool has been selected, invalid arguments and
28
+ execution failures are returned as MCP tool results with `isError: true` and a
29
+ text error payload. Clients should check `isError` before consuming the text
30
+ content. Direct callers of `callMcpTool()` receive the same failures as rejected
31
+ promises.
32
+
33
+ ## Security gates
34
+
35
+ Project-code execution tools are not advertised by the local MCP server. The
36
+ former environment-variable opt-in was removed because it executed project code
37
+ inside the credential-bearing MCP process. Use the CLI directly for local
38
+ invocation and dev-server startup until HS-X has a separately deployed,
39
+ credential-isolated sandbox service.
40
+
41
+ `hsx.secrets.hubspot_oauth.set` sends credentials only to the exact public HTTPS
42
+ origin configured by the server's `HSX_CONTROL_PLANE_URL` (default
43
+ `https://api.hs-x.dev`). Tool calls cannot override that destination. Origins
44
+ with credentials, paths, queries, fragments, loopback, or private IP addresses
45
+ are rejected. The production HTTPS connection is pinned to an address from that
46
+ validated DNS result while TLS still verifies the configured hostname; redirects
47
+ are not followed and responses are bounded to 64 KiB. The call must also include
48
+ `confirm: true`; missing or false confirmation is rejected before the server
49
+ reads its bearer credential, resolves the destination, or starts transport.
50
+ Credential responses must be valid UTF-8 JSON. Docs responses are also read as
51
+ bounded streams: 1 MiB for the catalog and 2 MiB for a page, both with fatal
52
+ UTF-8 decoding so a bad upstream cannot grow the MCP process without bound.
53
+
24
54
  ## Running it
25
55
 
26
56
  The stdio entrypoint speaks MCP over stdin/stdout, so any MCP-capable agent can
27
57
  launch it as a subprocess. For embedding, call `callMcpTool(name, args)`
28
58
  directly against the same dispatcher.
29
59
 
60
+ Requests use newline-delimited JSON-RPC and each line is limited to 1 MiB of
61
+ UTF-8 bytes. The transport reports an invalid-request error as soon as a line
62
+ crosses that limit, drops its buffered prefix, discards through the next
63
+ newline, and then continues serving later requests. This keeps an unterminated
64
+ or multi-byte oversized line from growing the server's input buffer without
65
+ bound.
66
+
30
67
  ## Part of HS-X
31
68
 
32
69
  HS-X is a leaveable, type-safe HubSpot app framework on Cloudflare Workers.
package/dist/config.d.ts CHANGED
@@ -7,4 +7,10 @@ export interface McpConfig {
7
7
  readonly docsUrl: URL;
8
8
  }
9
9
  export declare function loadMcpConfig(env?: NodeJS.ProcessEnv): McpConfig;
10
+ /**
11
+ * Credential-bearing MCP calls are pinned to one administrator-configured
12
+ * public HTTPS origin. Tool arguments can never widen this destination.
13
+ */
14
+ export declare function validateControlPlaneOrigin(input: URL): URL;
15
+ export declare function isPrivateOrLoopbackHostname(rawHostname: string): boolean;
10
16
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEjE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC;IAC9B,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;CACvB;AAuCD,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,CAE7E"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEjE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC;IAC9B,mFAAmF;IACnF,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC;CACvB;AAuCD,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,CAG7E;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,GAAG,GAAG,GAAG,CAc1D;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAOxE"}
package/dist/config.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { isIP } from 'node:net';
1
2
  import { Config, ConfigProvider, Effect, Option } from 'effect';
2
3
  const DEFAULT_MCP_CONTROL_PLANE_URL = 'https://api.hs-x.dev';
3
4
  const DEFAULT_MCP_DOCS_URL = 'https://hs-x.dev';
@@ -23,7 +24,72 @@ function mcpConfigProvider(env = process.env) {
23
24
  return ConfigProvider.fromMap(values, { pathDelim: '_', seqDelim: ',' });
24
25
  }
25
26
  export function loadMcpConfig(env = process.env) {
26
- return Effect.runSync(Effect.withConfigProvider(mcpConfigProvider(env))(mcpConfig));
27
+ const config = Effect.runSync(Effect.withConfigProvider(mcpConfigProvider(env))(mcpConfig));
28
+ return { ...config, controlPlaneUrl: validateControlPlaneOrigin(config.controlPlaneUrl) };
29
+ }
30
+ /**
31
+ * Credential-bearing MCP calls are pinned to one administrator-configured
32
+ * public HTTPS origin. Tool arguments can never widen this destination.
33
+ */
34
+ export function validateControlPlaneOrigin(input) {
35
+ if (input.protocol !== 'https:') {
36
+ throw new Error('HSX_CONTROL_PLANE_URL must use HTTPS.');
37
+ }
38
+ if (input.username || input.password) {
39
+ throw new Error('HSX_CONTROL_PLANE_URL must not contain user information.');
40
+ }
41
+ if (input.pathname !== '/' || input.search || input.hash) {
42
+ throw new Error('HSX_CONTROL_PLANE_URL must be an origin without a path, query, or fragment.');
43
+ }
44
+ if (isPrivateOrLoopbackHostname(input.hostname)) {
45
+ throw new Error('HSX_CONTROL_PLANE_URL must not target a private or loopback host.');
46
+ }
47
+ return new URL(input.origin);
48
+ }
49
+ export function isPrivateOrLoopbackHostname(rawHostname) {
50
+ const hostname = rawHostname.replace(/^\[|\]$/g, '').toLowerCase();
51
+ if (hostname === 'localhost' || hostname.endsWith('.localhost'))
52
+ return true;
53
+ const kind = isIP(hostname);
54
+ if (kind === 4)
55
+ return isPrivateIpv4(hostname);
56
+ if (kind === 6)
57
+ return isPrivateIpv6(hostname);
58
+ return false;
59
+ }
60
+ function isPrivateIpv4(address) {
61
+ const octets = address.split('.').map(Number);
62
+ const [a = 0, b = 0] = octets;
63
+ return (a === 0 ||
64
+ a === 10 ||
65
+ a === 127 ||
66
+ (a === 100 && b >= 64 && b <= 127) ||
67
+ (a === 169 && b === 254) ||
68
+ (a === 172 && b >= 16 && b <= 31) ||
69
+ (a === 192 && b === 168));
70
+ }
71
+ function isPrivateIpv6(address) {
72
+ if (address === '::' || address === '::1')
73
+ return true;
74
+ const first = Number.parseInt(address.split(':', 1)[0] ?? '', 16);
75
+ if ((first & 0xfe00) === 0xfc00)
76
+ return true; // fc00::/7 unique local
77
+ if ((first & 0xffc0) === 0xfe80)
78
+ return true; // fe80::/10 link-local
79
+ if ((first & 0xff00) === 0xff00)
80
+ return true; // multicast
81
+ if (address.startsWith('::ffff:')) {
82
+ const suffix = address.slice('::ffff:'.length);
83
+ if (isIP(suffix) === 4)
84
+ return isPrivateIpv4(suffix);
85
+ const [highRaw, lowRaw] = suffix.split(':');
86
+ const high = Number.parseInt(highRaw ?? '', 16);
87
+ const low = Number.parseInt(lowRaw ?? '', 16);
88
+ if (Number.isFinite(high) && Number.isFinite(low)) {
89
+ return isPrivateIpv4(`${high >> 8}.${high & 0xff}.${low >> 8}.${low & 0xff}`);
90
+ }
91
+ }
92
+ return false;
27
93
  }
28
94
  function splitAllowedRoots(value) {
29
95
  return value
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAWhE,MAAM,6BAA6B,GAAG,sBAAsB,CAAC;AAC7D,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEhD,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAC/C,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EACpB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CACrB;IACD,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxF,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,IAAI,CACnD,MAAM,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,6BAA6B,CAAC,CAAC,EAC1D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CACrB;IACD,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAClC,MAAM,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,oBAAoB,CAAC,CAAC,EACjD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CACrB;CACF,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;QAC9C,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;QAC9C,CAAC,CAAC,EAAE;IACN,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,eAAe,EAAE,MAAM,CAAC,eAAe;IACvC,OAAO,EAAE,MAAM,CAAC,OAAO;CACxB,CAAC,CAAC,CACJ,CAAC;AAEF,SAAS,iBAAiB,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAyB,OAAO,CAAC,GAAG;IAChE,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,10 +2,10 @@ import type { McpConfig } from './config.js';
2
2
  export declare const MCP_VERSION: string;
3
3
  export declare const MCP_PROTOCOL_VERSION = "2024-11-05";
4
4
  export interface JsonRpcRequest {
5
- readonly jsonrpc?: '2.0';
6
- readonly id?: string | number | null;
7
- readonly method?: string;
8
- readonly params?: unknown;
5
+ readonly jsonrpc: '2.0';
6
+ readonly id?: string | number;
7
+ readonly method: string;
8
+ readonly params?: Record<string, unknown>;
9
9
  }
10
10
  export interface JsonRpcSuccess {
11
11
  readonly jsonrpc: '2.0';
@@ -24,22 +24,63 @@ export type JsonRpcResponse = JsonRpcSuccess | JsonRpcFailure;
24
24
  export interface McpRequestContext {
25
25
  readonly cwd: string;
26
26
  readonly config?: McpConfig;
27
+ /** Test/embedding seam for HTTP. Stdio leaves this unset. */
28
+ readonly fetch?: typeof fetch;
29
+ /** Test/embedding seam for public-address validation before secret transfer. */
30
+ readonly lookup?: ControlPlaneLookup;
31
+ /** Test seam for the production DNS-pinned credential request. */
32
+ readonly credentialRequest?: CredentialRequest;
33
+ }
34
+ export type ControlPlaneLookup = (hostname: string) => Promise<readonly {
35
+ readonly address: string;
36
+ readonly family: number;
37
+ }[]>;
38
+ export interface CredentialRequestInput {
39
+ readonly url: URL;
40
+ readonly addresses: readonly {
41
+ readonly address: string;
42
+ readonly family: number;
43
+ }[];
44
+ readonly authorization: string;
45
+ readonly body: string;
27
46
  }
47
+ export type CredentialRequest = (input: CredentialRequestInput) => Promise<{
48
+ readonly status: number;
49
+ readonly body: unknown;
50
+ }>;
28
51
  export interface McpTool {
29
52
  readonly name: string;
30
53
  readonly description: string;
31
54
  readonly inputSchema: {
32
55
  readonly type: 'object';
33
- readonly properties: Record<string, unknown>;
56
+ readonly properties: Readonly<Record<string, McpJsonSchema>>;
57
+ readonly required?: readonly string[];
58
+ readonly additionalProperties: false;
34
59
  };
35
60
  }
61
+ interface McpJsonSchema {
62
+ readonly type: 'string' | 'number' | 'integer' | 'boolean' | 'object';
63
+ readonly description?: string;
64
+ readonly minLength?: number;
65
+ readonly maxLength?: number;
66
+ readonly minimum?: number;
67
+ readonly maximum?: number;
68
+ readonly enum?: readonly (string | number)[];
69
+ readonly pattern?: string;
70
+ readonly properties?: Readonly<Record<string, McpJsonSchema>>;
71
+ readonly required?: readonly string[];
72
+ readonly additionalProperties?: boolean;
73
+ readonly default?: string | number;
74
+ }
36
75
  export interface McpToolResult {
37
76
  readonly content: readonly {
38
77
  readonly type: 'text';
39
78
  readonly text: string;
40
79
  }[];
80
+ readonly isError?: boolean;
41
81
  }
42
82
  export declare function listMcpTools(): readonly McpTool[];
43
- export declare function handleMcpRequest(request: JsonRpcRequest, context: McpRequestContext): Promise<JsonRpcResponse | undefined>;
83
+ export declare function handleMcpRequest(input: unknown, context: McpRequestContext): Promise<JsonRpcResponse | undefined>;
44
84
  export declare function callMcpTool(name: string, args: Record<string, unknown>, context: McpRequestContext): Promise<McpToolResult>;
85
+ export {};
45
86
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AA4B7C,eAAO,MAAM,WAAW,QAA0B,CAAC;AACnD,eAAO,MAAM,oBAAoB,eAAe,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE;QACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,cAAc,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;CAC7B;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE;QACpB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;QACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC9C,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS;QACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,EAAE,CAAC;CACL;AAuJD,wBAAgB,YAAY,IAAI,SAAS,OAAO,EAAE,CAEjD;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAsBtC;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,aAAa,CAAC,CAwUxB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}